Full Code of the-pudding/data for AI

master d89e1f43b538 cached
176 files
339.3 MB
9.2M tokens
6 symbols
6 requests
Copy disabled (too large) Download .txt
Showing preview only (36,604K chars total). Download the full file to get everything.
Repository: the-pudding/data
Branch: master
Commit: d89e1f43b538
Files: 176
Total size: 339.3 MB

Directory structure:
gitextract_03t0kui6/

├── .gitignore
├── LICENSE
├── README.md
├── birth-control/
│   ├── README.md
│   ├── analysis.Rmd
│   ├── analysis.html
│   ├── everUsed.R
│   ├── everused.csv
│   ├── firstTime.R
│   ├── firstTime.csv
│   ├── multipleMethods.R
│   ├── multipleMethods.csv
│   ├── overTime.R
│   ├── overTime.csv
│   ├── sideEffects.R
│   ├── sideEffects.csv
│   └── stop_reasons.csv
├── birthday-effect/
│   ├── README.md
│   └── birthdays.csv
├── births/
│   ├── README.md
│   └── allBirthData.csv
├── boybands/
│   ├── README.md
│   ├── bands.csv
│   └── boys.csv
├── campaign-colors/
│   ├── README.md
│   ├── colors.csv
│   └── years.csv
├── census-history/
│   ├── README.md
│   └── full_data.csv
├── cetaceans/
│   ├── README.md
│   ├── acquisitions.csv
│   ├── allCetaceanData.csv
│   └── survivalRates.csv
├── clinics/
│   ├── README.md
│   └── cities.csv
├── clutch/
│   ├── README.md
│   ├── nba.csv
│   ├── shots-nba.csv
│   └── wnba.csv
├── cookies/
│   ├── All_directions.txt
│   ├── README.md
│   └── choc_chip_cookie_ingredients.csv
├── dearabby/
│   ├── README.md
│   └── raw_da_qs.csv
├── dog-shelters/
│   ├── README.md
│   ├── allDogDescriptions.R
│   ├── allDogDescriptions.csv
│   ├── dogTravel.R
│   ├── dogTravel.csv
│   ├── movesByLocation.R
│   └── movesByLocation.csv
├── dress-codes/
│   ├── README.md
│   ├── banned_items.csv
│   ├── body_by_school.R
│   ├── body_by_school.json
│   ├── body_percentages.R
│   ├── body_percentages.csv
│   ├── clothesDetails.csv
│   ├── clothes_percentages.R
│   ├── clothes_percentages.csv
│   ├── full_text.csv
│   ├── length_restrictions.csv
│   ├── sanctions.csv
│   ├── school_metadata.csv
│   ├── strap_restrictions.csv
│   ├── words_percentages.R
│   └── words_percentages.csv
├── filmordigital/
│   ├── README.md
│   ├── top_directors_data.csv
│   ├── top_directors_data_processing.ipynb
│   ├── top_movies_data.csv
│   └── top_movies_data_processing.ipynb
├── foundation-names/
│   ├── README.md
│   ├── allCategories.R
│   ├── allCategories.csv
│   ├── allNumbers.R
│   ├── allNumbers.csv
│   ├── allShades.R
│   ├── allShades.csv
│   ├── crosswalks/
│   │   ├── category_crosswalk.csv
│   │   └── sephora_ulta_crosswalk.csv
│   ├── scrape-sephora.js
│   ├── scrape-ulta.js
│   ├── sephora.R
│   ├── sephora.csv
│   ├── ulta.R
│   └── ulta.csv
├── gayborhoods/
│   ├── README.md
│   └── data.csv
├── hype/
│   ├── README.md
│   ├── paths.R
│   ├── paths.csv
│   └── players.csv
├── kidz-bop/
│   ├── KB_censored-lyrics.csv
│   ├── KB_group-overiew.csv
│   ├── KB_proportions.csv
│   ├── KB_word-overview.csv
│   └── README.md
├── laugh/
│   ├── README.md
│   └── reddit-laughs.csv
├── makeup-shades/
│   ├── README.md
│   └── shades.csv
├── mars-weather/
│   ├── README.md
│   └── mars-weather.csv
├── names-in-songs/
│   ├── README.md
│   ├── allNames.R
│   ├── allNames.csv
│   ├── letters.R
│   ├── letters.csv
│   ├── onlyNames.csv
│   ├── repeats.R
│   ├── repeats.csv
│   ├── timeless_names.R
│   ├── timeless_names.csv
│   ├── unique.R
│   ├── unique.csv
│   ├── unique_by_artist.R
│   └── unique_by_artist.csv
├── nba-unexpected/
│   ├── README.md
│   ├── nba.csv
│   └── wnba.csv
├── neighborhoods/
│   ├── README.md
│   ├── top5_NewYorkCity.csv
│   └── top5_Seattle.csv
├── one-hit-wonders/
│   ├── README.md
│   └── data.csv
├── people-map/
│   ├── README.md
│   └── people-map.csv
├── people-map-uk/
│   ├── README.md
│   └── people-map-uk.csv
├── pockets/
│   ├── README.md
│   ├── measurementRectangles.json
│   └── measurements.csv
├── queues/
│   └── README.md
├── rain/
│   ├── README.md
│   ├── annual_precipitation.R
│   ├── annual_precipitation.csv
│   ├── daily_precipitation.R
│   └── daily_precipitation.csv
├── random/
│   ├── README.md
│   └── trials.csv
├── skate-music/
│   ├── README.md
│   ├── soundtrack_data.csv
│   ├── time_series.tsv
│   └── waffle.csv
├── stand-up/
│   ├── README.md
│   ├── ali-wong--captions.csv
│   └── ali-wong--topics.csv
├── summer-reading/
│   ├── README.md
│   ├── hipster.R
│   └── hipster.csv
├── three-seconds/
│   ├── README.md
│   └── three-seconds.csv
├── titletowns/
│   ├── README.md
│   ├── case1.json
│   ├── case2.json
│   ├── metros.json
│   └── titles.csv
├── vogue/
│   ├── README.md
│   ├── faces.csv
│   └── models.csv
├── winning-the-internet/
│   ├── README.md
│   └── dump-2020-12-15.csv
└── women-in-headlines/
    ├── country_time_freqrank.csv
    ├── headlines.csv
    ├── headlines_reduced_bubble.csv
    ├── headlines_reduced_temporal.csv
    ├── headlines_site.csv
    ├── polarity_comparison_country_time.csv
    ├── polarity_comparison_site_country_time.csv
    ├── readme.md
    ├── word_country_freq.csv
    ├── word_dictionaries.json
    ├── word_themes.csv
    ├── word_themes_freq.csv
    └── word_themes_rank.csv

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.DS_Store
.Rproj.user
*.Rproj

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2019 The Pudding

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: README.md
================================================
# Data sets

Data sets created for stories on [The Pudding](https://pudding.cool), open to the public.

| Pudding Story Title                                                                                                      | Story Publish Date | Data Update Frequency | Keywords                                                                | Data                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------ | ------------------ | --------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| [We think this cool study we found is flawed. Help us reproduce it.](https://pudding.cool/2022/04/random/)                                                        | April 2022         | Never                 | random                                         | [data](https://github.com/the-pudding/data/tree/master/random)                                       |
| [Are you more likely to die on your birthday](https://pudding.cool/2025/04/birthday-effect/)                                                        | April 2025         | Never                 | birth, death, massachusetts                                         | [data](https://github.com/the-pudding/data/tree/master/birthday-effect)                                       |
| [Bears Will Be Boys](https://pudding.cool/2025/07/kids-books/)                                                        | July 2025         | Never                 | books, kids, animals, gender                                         | [repo](https://github.com/the-pudding/kids-book-animals/tree/main/static/assets/data)                                       |
| [What Does a Happily Ever After Look Like?](https://pudding.cool/2023/10/romance-covers/)                                                         | October 2023         | Never                 | music, country, radio                                         | [data](https://github.com/the-pudding/romance-covers-new/blob/main/src/data/listings.csv)                                       |
| [They Won't Play a Lady-O on Country Radio](https://pudding.cool/2023/05/country-radio/)                                                         | May 2023         | Never                 | music, country, radio                                         | [repo](https://github.com/the-pudding/country-radio-data)                                       |
| [The Greatest Unexpected NBA Performances](https://www.youtube.com/watch?v=jV49bDzkQhY)                                                         | February 2023         | Never                 | basketball, NBA                                           | [repo](https://github.com/the-pudding/data/tree/master/nba-unexpected)                                       |
| [We think this cool study we found is flawed. Help us reproduce it.](https://pudding.cool/2022/04/random)                                                         | April 2022         | Daily                 | replication, randomness                                           | [json](https://pudding.cool/2022/04/random-data/raw.json)                                       |
| [Who's in Your Wallet?](https://pudding.cool/2022/04/banknotes/) | April 2022 | Never | banknotes, currency | [repo](https://github.com/the-pudding/banknotes/tree/master/src/data) |
| [When Women Make Headlines](https://pudding.cool/2022/02/women-in-headlines)                                                         | February 2022         | Never                 | headlines, women                                           | [repo](https://github.com/the-pudding/data/tree/master/women-in-headlines)    
| ["I Kissed a Girl" to "Call Me By Your Name"](https://pudding.cool/2021/06/same-gender-lyrics/)                                                         | June 2021         | Never                 | music, lyrics, queer, gender                                           | [data](https://github.com/the-pudding/same-gender-lyrics-viz/blob/master/src/data/data.csv)                                       |                                   |
| [The Naked Truth](https://pudding.cool/2021/03/foundation-names)                                                         | March 2021         | Never                 | beauty, makeup, diversity, US                                           | [repo](https://github.com/the-pudding/data/tree/master/foundation-names)                                       |
| [Winning the Internet](https://pudding.cool/projects/newsletter/)                                                        | July 2020          | Sometimes             | newsletter                                                              | [repo](https://github.com/the-pudding/data/tree/master/winning-the-internet)                                   |
| [Police Misconduct](https://pudding.cool/2020/10/police-misconduct/)                                                     | October 2020       | Never                 | social                                                                  | [data](https://github.com/the-pudding/police_misconduct_pudding/tree/main/src/assets/data)                     |
| [Whole Foods x 15 Percent Pledge](https://www.instagram.com/p/CF5UrXmjnrH/)                                              | October 2020       | Never                 | retail                                                                  | [data](https://www.notion.so/thepudding/Whole-Foods-Data-FAQ-3b69e387e78c41e4af27b16c6d3e9459)                 |
| [How candidate diversity impacts color diversity](https://pudding.cool/2020/08/campaign-colors/)                         | August 2020        | Never                 | politics, design, color                                                 | [repo](https://github.com/the-pudding/data/tree/master/campaign-colors)                                        |
| [90s Song Memory](https://pudding.cool/2020/07/song-decay/)                                                              | July 2020          | Never                 | music                                                                   | [repo](https://github.com/the-pudding/song-decay-clean/tree/master/src/assets/data)                            |
| [The Infinite Monkey Theorem Experiment](https://pudding.cool/2020/04/infinite/)                                         | Apr 2020           | Daily                 | piano, probability                                                      | [json](https://pudding.cool/2020/04/infinite-data/data.json)                                                   |
| [Just how does Kidz Bop censor songs?](https://pudding.cool/2020/04/kidz-bop/)                                           | Apr 2020           | Never                 | Kidz Bop, music, censorship                                             | [repo](https://github.com/the-pudding/data/tree/master/kidz-bop)                                               |
| [The Evolution of the American Census](https://pudding.cool/2020/03/census-history)                                      | Mar 2020           | Never                 | US, census                                                              | [repo](https://github.com/the-pudding/data/tree/master/census-history)                                         |
| [Where will you need your umbrella?](https://pudding.cool/2020/02/rain)                                                  | Feb 2020           | Never                 | weather, precipitation                                                  | [repo](https://github.com/the-pudding/data/tree/master/rain)                                                   |
| [Laughing OnLine](https://pudding.cool/2019/10/laugh)                                                                    | Oct 2019           | Never                 | laughter, Reddit                                                        | [repo](https://github.com/the-pudding/data/tree/master/laugh)                                                  |
| [Finding Forever Homes](https://pudding.cool/2019/10/shelters)                                                           | Oct 2019           | Never                 | dogs, PetFinder, US                                                     | [repo](https://github.com/the-pudding/data/tree/master/dog-shelters)                                           |
| [Vocal Register and Singing Voices](https://pudding.cool/2019/08/register/)                                              | Aug 2019           | Never                 | music                                                                   | [repo](https://github.com/the-pudding/falsetto-story)                                                          |
| [Book Covers](https://pudding.cool/2019/07/book-covers/)                                                                 | July 2019          | Never                 | books                                                                   | [repo](https://github.com/the-pudding/book-covers)                                                             |
| [Hipster Summer Reading List](https://pudding.cool/2019/06/summer-reading/)                                              | June 2019          | Never                 | books, library, Seattle                                                 | [repo](https://github.com/the-pudding/data/tree/master/summer-reading)                                         |
| [Best Year in Music](https://pudding.cool/projects/music-history/)                                                       | June 2019          | Sometimes             | music                                                                   | [repo](https://github.com/the-pudding/music-taste-2019)                                                        |
| [A People Map of the UK](https://pudding.cool/2019/06/people-map-uk)                                                     | June 2019          | Never                 | wiki, names, UK                                                         | [repo](https://github.com/the-pudding/data/tree/master/people-map-uk)                                          |
| [A People Map of the US](https://pudding.cool/2019/05/people-map)                                                        | May 2019           | Never                 | wiki, names, US                                                         | [repo](https://github.com/the-pudding/data/tree/master/people-map)                                             |
| [Sing My Name](https://pudding.cool/2019/05/names-in-songs)                                                              | May 2019           | Never                 | music, names, US                                                        | [repo](https://github.com/the-pudding/data/tree/master/names-in-songs)                                         |
| [The Rise of Hyphenated Last Names in Pro Sports](https://pudding.cool/2019/05/hyphens/)                                 | May 2019           | Never                 | sports, culture, names, MLB, NBA, NFL, NHL, NWSL, WNBA                  | [repo](https://github.com/the-pudding/hyphenated-names)                                                        |
| [The NBA Has A Defensive Three Seconds Problem](https://pudding.cool/2019/05/three-seconds)                              | May 2019           | Never                 | basketball, NBA                                                         | [repo](https://github.com/the-pudding/data/tree/master/three-seconds)                                          |
| [Colorism in High Fashion](https://pudding.cool/2019/04/vogue)                                                           | April 2019         | Never                 | fashion, diversity, US                                                  | [repo](https://github.com/the-pudding/data/tree/master/vogue)                                                  |
| [EU Regions](https://pudding.cool/2019/04/eu-regions/)                                                                   | April 2019         | Daily                 | european union, eu                                                      | [data and analysis](https://github.com/the-pudding/eu-regions/tree/master/src/assets/data)                     |
| [NBA Spell Jam](https://pudding.cool/2019/03/nba-spelling/)                                                              | March 2019         | Daily                 | spelling, names, sankey, NBA                                            | [data](https://pudding.cool/2019/03/sankey-nba-data/data-all.json)                                             |
| [Who is the Biggest Pop Star?](https://pudding.cool/2019/03/pop-music/)                                                  | March 2019         | Never                 | music                                                                   | [repo](https://github.com/the-pudding/telephone/tree/master/src/assets/data)                                   |
| [How Many High School Stars Make It to the NBA?](https://pudding.cool/2019/03/hype/)                                     | March 2019         | Never                 | US, basketball, NBA                                                     | [repo](https://github.com/the-pudding/data/tree/master/hype)                                                   |
| [The Gyllenhaal Experiment](https://pudding.cool/2019/02/gyllenhaal/)                                                    | February 2019      | Never                 | spelling, names, sankey                                                 | [data](https://pudding.cool/2019/02/sankey-data/data-all.json)                                                 |
| [The Sexualized Messages Dress Codes are Sending to Students](https://pudding.cool/2019/02/dress-code-sexualization/)    | February 2019      | Never                 | US, dress code, high school                                             | [repo](https://github.com/the-pudding/data/tree/master/dress-codes)                                            |
| [The Largest Vocabulary in Hip Hop](https://pudding.cool/projects/vocabulary/index.html/)                                | January 2019       | Sometimes             | music                                                                   | [data](https://docs.google.com/spreadsheets/d/1HIIfgDpNMM-j0hoQHN-yP5P1lNOfJuvym0u0sdWwD9g/edit#gid=737896402) |
| [Internet Boy Band Database](https://pudding.cool/2018/11/boy-bands/)                                                    | November 2018      | Never                 | music, boybands, dance, US                                              | [repo](https://github.com/the-pudding/data/tree/master/boybands)                                               |
| [Thirty Years of American Anxieties](https://pudding.cool/2018/11/dearabby/)                                             | November 2018      | Never                 | advice, anxiety                                                         | [repo](https://github.com/the-pudding/data/tree/master/dearabby)                                               |
| [The Winningest Cities in North American Sports](https://pudding.cool/2018/11/titletowns/)                               | November 2018      | Never                 | sports, championships, rankings, basketball, football, hockey, baseball | [repo](https://github.com/the-pudding/data/tree/master/titletowns)                                             |
| [Human Terrain](https://pudding.cool/2018/10/city_3d/)                                                                   | October 2018       | Never                 | population                                                              | [how-to](https://docs.google.com/document/d/1Us_1QBHShdMe8-laKhGh_mjkXxOw-74-9mxJAx_DvKE/edit)                 |
| [What Does the Path To Fame Look Like?](https://pudding.cool/2018/10/wiki-breakout/)                                     | October 2018       | Never                 | celebrities, culture                                                    | [repo](https://github.com/the-pudding/wiki-billboard-data#historical-data)                                     |
| [The Celebrity Billboard Project](https://pudding.cool/2018/09/wiki-billboard/)                                          | September 2018     | Daily                 | celebrities, culture                                                    | [repo](https://github.com/the-pudding/wiki-billboard-data)                                                     |
| [Film vs. Digital](https://pudding.cool/2018/08/filmordigital/)                                                          | August 2018        | Never                 | film, movies                                                            | [repo](https://github.com/the-pudding/data/tree/master/filmordigital)                                          |
| [Women's Pockets are Inferior](https://pudding.cool/2018/08/pockets)                                                     | August 2018        | Never                 | pockets, fashion, equality, women                                       | [repo](https://github.com/the-pudding/data/tree/master/pockets)                                                |
| [Life After Death on Wikipedia](https://pudding.cool/2018/08/wiki-death)                                                 | August 2018        | Never                 | Wikipedia, pageviews, death                                             | [repo](https://github.com/the-pudding/wiki-death-data)                                                         |
| [What Airport Traffic Tells Us About the World's Megacities](https://pudding.cool/2018/07/airports)                      | July 2018          | Never                 | cities, population, airports                                            | [repo](https://github.com/the-pudding/airports)                                                                |
| [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control)                                             | July 2018          | Never                 | contraception, US, birth control, health, survey, CDC                   | [repo](https://github.com/the-pudding/data/tree/master/birth-control)                                          |
| [Men are from Chelsea, Women are from Park Slope](https://github.com/the-pudding/data/tree/master/gayborhoods)           | June 2018          | Never                 | gayborhoods, gay, lesbian, queer, LGBTQ, neighborhoods, pride, gender   | [repo](https://github.com/the-pudding/data/tree/master/gayborhoods)                                            |
| [The Diversity of Makeup Shades](https://pudding.cool/2018/06/makeup-shades)                                             | June 2018          | Never                 | beauty, makeup, Fenty, diversity, US, global                            | [repo](https://github.com/polygraph-cool/data/tree/master/makeup-shades)                                       |
| [The Good, the Rad, and the Gnarly](https://pudding.cool/2018/06/skate-music/)                                           | June 2018          | Never                 | skateboard, music, genre, gnarly                                        | [repo](https://github.com/polygraph-cool/data/tree/master/skate-music)                                         |
| [Baking the Most Average Chocolate Chip Cookie](https://pudding.cool/2018/05/cookies)                                    | May 2018           | Never                 | baking, cookies, machine learning, NLP                                  | [repo](https://github.com/polygraph-cool/data/tree/master/cookies)                                             |
| [One-Hit Wonders in Sports](https://pudding.cool/2018/04/one-hit-wonders)                                                | April 2018         | Never                 | sports, ranking, basketball, golf, tennis, baseball, hockey             | [repo](https://github.com/polygraph-cool/data/tree/master/one-hit-wonders)                                     |
| [The Birthday Paradox Experiment](https://pudding.cool/2018/04/birthday-paradox)                                         | April 2018         | Daily                 | math, paradox, birthday                                                 | [json](https://pudding.cool/2018/04/birthday-data/data.json)                                                   |
| [A Tale of Two Cities](https://pudding.cool/2018/03/neighborhoods)                                                       | March 2018         | Never                 | neighborhoods, business, Yelp                                           | [repo](https://github.com/polygraph-cool/data/tree/master/neighborhoods)                                       |
| [The Structure of Stand-Up Comedy](https://pudding.cool/2018/02/stand-up)                                                | February 2018      | Never                 | stand-up, comedy, Ali Wong, US                                          | [repo](https://github.com/polygraph-cool/data/tree/master/stand-up)                                            |
| [Greetings from Mars](https://pudding.cool/2018/01/mars-weather/)                                                        | February 2018      | Daily                 | mars, weather, Curiosity Rover, global                                  | [repo](https://github.com/polygraph-cool/data/tree/master/mars-weather)                                        |
| [How far is too far? An analysis of driving times to abortion clinics in the US.](https://pudding.cool/2017/09/clinics/) | September 2017     | Never                 | abortion, clinics, duration, access, US                                 | [repo](https://github.com/polygraph-cool/data/tree/master/clinics)                                             |
| [Free Willy & Flipper by the Numbers](https://pudding.cool/2017/07/cetaceans/)                                           | July 2017          | Never                 | whales, dolphins, captivity, US                                         | [repo](https://github.com/polygraph-cool/data/tree/master/cetaceans)                                           |
| [The Timing of Baby Making](https://pudding.cool/2017/05/births/)                                                        | May 2017           | Never                 | births, babies, county, US                                              | [repo](https://github.com/polygraph-cool/data/tree/master/births)                                              |
| [NBA Last Two Minute Report](https://pudding.cool/2017/02/two-minute-report)                                             | February 2017      | Daily                 | nba, basketball, referee, US                                            | [repo](https://github.com/polygraph-cool/last-two-minute-report/tree/master/output)                            |


================================================
FILE: birth-control/README.md
================================================
This folder contains all of the data and R scripts used in The Pudding essay [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) published in July 2018.

Below you'll find metadata for each file.

## allData.zip

**Contains**
* `allData.csv`: The data described below.
* `allData.R`: The script used to collect the data from the CDC’s [National Survey of Family Growth](https://www.cdc.gov/nchs/nsfg/index.htm) website and process it using the provided `.sas.txt` files. This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).
* `2006_2010_FemRespSetup.sas.txt` : The install instructions for the 2006 - 2010 questionnaire (the 2011 - 2013 and 2013 - 2015 ones can be accessed via the internet).

> The `.csv` file contained in this zipped folder is 23.4 mb.

- 	**What is this?**: Data representing some of the questions asked on the Female Questionnaire of the CDC's National Survey of Family Growth.
-   **Source(s) & Methodology**: All data was acquired from the CDC’s [National Survey of Family Growth](https://www.cdc.gov/nchs/nsfg/index.htm). I combined the results of the [2006-2010](https://www.cdc.gov/nchs/nsfg/nsfg_2006_2010_puf.htm), [2011-2013](https://www.cdc.gov/nchs/nsfg/nsfg_2011_2013_puf.htm), and [2013-2015](https://www.cdc.gov/nchs/nsfg/nsfg_2013_2015_puf.htm) versions of the Female Questionnaire. Each of these surveys was administered “[continuously](https://www.cdc.gov/nchs/nsfg/about_nsfg.htm)”, or weekly over the course of several years instead of all at once. All survey-takers were “[household residents](https://www.cdc.gov/nchs/data/nsfg/NSFG_2013-2015_Summary_Design_Data_Collection.pdf#page3)” (i.e., not living in an institution such as prison, homes for juvenile delinquents, homes for the intellectually disabled, long-term psychiatric hospitals, and those living on military bases) living in the 50 United States or District of Columbia of reproductive age (15-44 years). The study design was intended to provide nationally representative sample that [oversamples](https://www.cdc.gov/nchs/data/nsfg/NSFG_2013-2015_Summary_Design_Data_Collection.pdf#page3) for non-Hispanic black people, Hispanic people, and teens aged 15-19. Any respondent that had never used any form of contraception was excluded from this analysis. More information about the CDC’s surveying methods is available [here](https://www.cdc.gov/nchs/nsfg/about_nsfg.htm).
  - Not all questions included in this dataset were included in the final article, but since nearly all questions were analyzed at some point in the preliminary analysis, they are included here.
  - Since nearly all responses are coded as numbers, the links to the codebook for each question are included in the table below.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents the responses from an individual person as evidenced by their unique `CASEID` numbers.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `CASEID` | The unique number assigned to an individual respondent | number |
| `AGE_R` | Respondent's age at the time of interview | number |
| `MARSTAT` | Respondent's marital status.  [here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816231?studyNumber=9999).| number |
| `PREGNOWQ` | Whether respondent is currently pregnant.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816287?studyNumber=9999). | number |
| `RHADSEX` | Whether the respondent has ever had heterosexual vaginal intercourse. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816952?studyNumber=9999). | number |
| `SEDBC` | Did the respondent receive formal sexual education regarding methods of birth control before the age of 18? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816973?studyNumber=9999). | number |
| `SEDSTD` | Did the respondent receive formal sexual education regarding sexually transmitted diseases before the age of 18?  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816982?studyNumber=9999).| number |
| `SEDABST` | Did the respondent receive formal sexual education regarding abstinence until marriage before the age of 18? *This question was not asked in the 2006 - 2010 questionnaire*.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/816988?studyNumber=9999). | number |
| `LIFEPRTS` | Number of male sexual partners that the respondent has had in their lifetime | number |
| `HYST` | Whether the respondent is surgically sterile at the time of the interview due to a hysterectomy.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817110?studyNumber=9999). | number |
| `OVAREM` | Whether the respondent is surgically sterile at the time of interview due to ovary removal. *This question was not asked in the 2006 - 2010 questionnaire*.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817111?studyNumber=9999). | number |
| `OTHR` | Whether the respondent is surgically sterile at the time of interview due to another female operation.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817112?studyNumber=9999). | number |
| `VASECT`| Whether the respondent's husband/partner is surgically sterile due to vasectomy at the time of interview.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817212?studyNumber=9999). | number |
| `POSIBLPG` | Whether it is physically possible for the respondent to have a baby.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817220?studyNumber=9999) | number |
| `POSIBLMN` | Whether it is physically possible for the respondent's husband/partner to father a baby.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817222?studyNumber=9999). | number |
| `PILL` | Whether the respondent has ever used birth control pills.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817237?studyNumber=9999). | number |
| `CONDOM` | Whether the respondent has ever used condoms.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817238?studyNumber=9999). | number |
| `VASECTMY` | Whether the respondent has ever used a partner's vasectomy as a form of contraception.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817239?studyNumber=9999). | number |
| `DEPOPROV` | Whether the respondent has ever used Depo-Provera or other injectable contraception.  [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817240?studyNumber=9999). | number |
| `WIDRAWAL` | Whether the respondent has ever used withdrawal. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817241?studyNumber=9999). | number |
| `RHYTHM` | Whether the respondent has ever used the calendar rhythm method. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817242?studyNumber=9999). | number |
| `SDAYCBDS` | Whether the respondent has ever used the Standard Days of CycleBeads method. *This question was not asked in the 2006 - 2010 or 2011 - 2013 Questionnaires*. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817243?studyNumber=9999). | number |
| `TEMPSAFE` | Has the respondent ever used the Symptothermal method? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817244?studyNumber=9999). | number |
| `PATCH` | Has the respondent ever used a contraceptive patch. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817245?studyNumber=9999). | number |
| `RING` | Has the respondent ever used a vaginal contraceptive ring or "NuvaRing"? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817246?studyNumber=9999). | number |
| `MORNPILL` | Has the respondent ever used emergency contraception? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817247?studyNumber=9999). | number |
| `ECTIMESX` | Number of times that the respondent has used emergency contraception. | number |
| `EVERUSED` | A computed variable that indicates whether the respondent has ever used any form of contraception. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817265?studyNumber=9999). | number |
| `EVIUDTYP1`- `EVIUDTYP2` | Types of IUD that the respondent has ever used (first and second mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817262?studyNumber=9999). | number |
|`METHSTOP01`- `METHSTOP10` | Method stopped due to dissatisfaction (mentions number 1 - 10 in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817267?studyNumber=9999). | number |
|`STOPPILL1`- `STOPPILL6` | Computed open-ended response to reason(s) for discontinuation of the pill (1st through 6th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817283?studyNumber=9999). | number |
| `STOPCOND1`- `STOPCOND2` | Computed open-ended response to reason(s) for discontinuation of condoms (1st and 2nd mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817296?studyNumber=9999). | number |
| `STOPDEPO1`- `STOPDEPO2` | Computed open-ended response to reason(s) for discontinuation of Depo-Provera (1st and 2nd mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817306?studyNumber=9999) | number |
| `TYPEIUD_1`- `TYPEIUD_2` | Type of IUD that was discontinued due to dissatisfaction (1st and 2nd mention in different columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817311?studyNumber=9999). | number |
| `STOPIUD1` - `STOPIUD5` | Computed open-ended response to reason(s) for discontinuation of IUD (1st through 5th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817318?studyNumber=9999). | number |
| `REASPILL01`- `REASPILL06` | Reason that the user was unsatisfied with the pill (1st through 6th mention in separate columns). This question was only asked to users who have ever stopped using the pill (i.e., any of `METHSTOP01` - `METHSTOP10` = `3`). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817277?studyNumber=9999). | number |
| `REASCOND01`- `REASCOND07` | Reason that the user was unsatisfied with condoms (1st through 7th mention in separate columns). This question was only asked to users who have ever stopped using condoms (i.e., any of `METHSTOP01` - `METHSTOP10` = `4`). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817289?studyNumber=9999). | number |
| `REASDEPO01`- `REASDEPO07` | Reason not satisfied with Depo-Provera (1st through 8th mention in separate columns). This question was only asked to users who have ever stopped using Depo-Provera (i.e., any of `METHSTOP01` - `METHSTOP10` = `8`). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817298?studyNumber=9999). | number |
| `REASIUD01`- `REASIUD05` | Reason not satisfied with the IUD (1st through 5th mention in separate columns). This question was only asked to users who have ever stopped using an IUD (i.e., any of `METHSTOP01` - `METHSTOP10` = `19`). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817313?studyNumber=9999). | number |
| `WHYNOUSING1`- `WHYNOUSING5` | Reason the respondent is not using birth control (at risk of unintended pregnancy). 1st through 5th mention in separate columns. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817948?studyNumber=9999). | number |
| `FIRSMETH1`- `FIRSMETH4` | First contraceptive method ever used (1st through 4th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817323?studyNumber=9999). | number |
| `YUSEPILL1`- `YUSEPILL7` | Reasons for recent pill use (1st through 7th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817956?studyNumber=9999). | number |
| `JINTEND` | Do the respondent and husband/partner plan to have a/another baby some time? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818136?studyNumber=9999). | number |
| `JSUREINT` | How sure are the respondent and husband/partner that they will/will not have another baby? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818137?studyNumber=9999). | number |
| `INTEND` | Does respondent intend to have another baby some time? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818142?studyNumber=9999). | number |
| `SUREINT` | How sure is the respondent that they will/will not have a/another baby? [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818143?studyNumber=9999). | number |
| `REACTSLF` | How respondent would feel if she got pregnant now. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818311?studyNumber=9999). | number |
| `LESSPLSR` | The chance that the respondent would feel less physical pleasure if partner used a condom. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818316?studyNumber=9999). | number |
| `EMBARASS` | The chance that condom discussion would embarrass respondent and partner. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818317?studyNumber=9999). | number |
| `ORIENT` | Respondent's sexual orientation. *This question was not asked in the 2006 - 2010 Questionnaire*. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818425?studyNumber=9999). | number |
| `CONFCONC` | Whether the respondent would ever not go for sexual or reproductive health care because their parents might find out. *This question was not asked in the 2006 - 2010 or 2011 - 2013 Questionnaire*. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818426?studyNumber=9999). | number |
| `BTHCON12` | Whether or not the respondent has received birth control or a prescription in the last 12 months. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817974?studyNumber=9999). | number |
| `MEDTST12` | Whether or not the respondent received a checkup for birth control in the last 12 months. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817975?studyNumber=9999). | number |
| `BC12PAYX7`- `BC12PAYX9`| The way that the bill was paid for birth control or a prescription (1st through 3rd mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818020?studyNumber=9999). | number |
| `BC12PAYX10`- `BC12PAYX16`| The way the bill was paid for a check up for birth control. (1st through 6th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818023?studyNumber=9999). | number |
| `BC12PAY19`- `BCPAYX22`| The way the bill was paid for counseling about birth control. (1st through 4th methods in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/818028?studyNumber=9999). | number |
|`STRLOPER` | Type of sterilization operation "in effect" at the time of interview. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/819066?studyNumber=9999). | number |
|`METHX1`- `METHX192`| Methods used within a given month. `METHX1` represents the first mention of a method used in the January 3 years before the survey year (e.g., survey year - 3). `METHX2` - `METHX4` represent the 2nd - 4th mention of a method used in January 3 years before the survey year. `METHX5` represents the first mention of a method used in February 3 years before the survey year etc. This continues with every set of of 4 columns representing the methods used in that month all the way up through December of the interview year. Each of these is a separate column. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817482?studyNumber=9999). | number |
| `SIMSEQX1`- `SIMSEQX48` | Whether the methods used in a given month (as reported by the `METHX` variables) were used at the same time or different times throughout the month. Each column represents a month where `SIMSEQX1` = January 3 years before the survey year, `SIMSEQX2` = February 3 years before the survey year etc. Each of these is a separate column. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817866?studyNumber=9999). | number |
| `LSTMTHP1`- `LSTMTHP4` | Method used during at last intercourse with last partner in the past 12 months (1st through 4th mention in separate columns). [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817915?studyNumber=9999). | number |
| `CONSTAT1`- `CONSTAT4` | Current contraceptive status. [Codebook](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/819075?studyNumber=9999). | number |
| `yearRange` | Which survey was administered to this respondent? <br/>&bull; `0610` = 2006 - 2010<br/>&bull; `1113` = 2011 - 2013<br/>&bull; `1315` = 2013 - 2015 | number |


## everUsed.csv & everUsed.R

* `everUsed.csv`: The data described below.
* `everUsed.R`: The script used to process `allData.csv` (from `allData.zip`) to create `everUsed.csv`. The data was then used for the graphics in the section of [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) labelled "Condoms and The Pill Are Go-To's". This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).



- 	**What is this?**: Data representing the types of contraception that respondents of the CDC's National Survey of Family Growth have ever used in their lifetime.
-   **Source(s) & Methodology**: All data was acquired in the same way as [allData.zip](#allData.zip). It was processed using the scripts in `everUsed.R`. Percentages were calculated out of 20,759 respondents.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents a single contraceptive type.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `cleanMethod` | The name of the contraceptive method used by the respondent. Categories not listed below are named as expected (e.g., the code for condoms is `CONDOM`).<br/>&bull; `DEPOPROV` = Depo-Provera or Injectables<br/>&bull; `MORNPILL` = Emergency Contraception<br/>&bull; `SDAYCBDS` = Standard Days or Calendar Method<br/>&bull; `STRLOPER` = Tubal Ligation<br/>&bull; `TEMPSAFE` = Sympto-thermal method<br/>&bull; `VASECTMY` = Vasectomy<br/>&bull; `WIDRAWAL` = Withdrawal | string |
| `count` | Total number of respondents that have ever used this type of contraception. | number |
| `percent` | The percentage of 20,759 respondents that have used a particular type of contraception. Data is presented as a whole number between 0 and 100. | number |

## firstTime.csv & firstTime.R

* `firstTime.csv`: The data described below
* `firstTime.R`: The script used to process `allData.csv` (from `allData.zip`) to create `firstTime.csv`. The data was used to create the graphics in the section of [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) labelled "It Feels Like the First Time". This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).


- 	**What is this?**: Data representing the first type of contraception a person used grouped by the decade in which they first started using contraception.
-   **Source(s) & Methodology**: All data was acquired in the same way as [allData.zip](#allData.zip). It was processed using the scripts in `firstTime.R`. Percentages were calculated out of the number of respondents that started using contraception in a given decade.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents a single contraceptive type and decade combination.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `method` | A number representing the method of use. [Codebook here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817323?studyNumber=9999). | number |
| `decade` | The decade during which a respondent first began using contraception. This is represented as `70's`, `80's` etc.| string |
| `percent` | The percentage of respondents that used the same type of birth control first during a specific decade. This was calculated as the `number of people who first used birth control type A during decade X / total number of people who started using contraception in decade X`.| number |

## overTime.csv & overTime.R

* `overTime.csv`: The data described below
* `overTime.R`: The script used to process `allData.csv` (from `allData.zip`) to create `overTime.csv`. The data was used to create the graphics in the section of [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) labelled "Different Age, Different Method". This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).


- 	**What is this?**: Data representing the first type of contraception a person used grouped by their age.
-   **Source(s) & Methodology**: All data was acquired in the same way as [allData.zip](#allData.zip). It was processed using the scripts in `overTime.R`.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents a single contraceptive type and age combination.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `method` | A number representing the method of use. [Codebook here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/819075?studyNumber=9999). | number |
| `methodR` | The number of respondents of a specific age that are currently using a certain method| number |
| `total` | The total number of respondents that are currently a specific age.| number |
| `percent` | The percentage of respondents of a certain age using a specific method. This was calculated as the `number of people using a method at a given age / total number of people currently that age`. | number |
| `calcAge` | Respondent's age (in years). | number |


## multipleMethods.csv & multipleMethods.R

* `multipleMethods.csv`: The data described below
* `multipleMethods.R`: The script used to process `allData.csv` (from `allData.zip`) to create `multipleMethods.csv`. The data was used to create the graphics in the section of [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) labelled "Double Bag It". This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).


- 	**What is this?**: Data representing the combinations of birth control methods used by respondents over a 4 year timespan.
-   **Source(s) & Methodology**: All data was acquired in the same way as [allData.zip](#allData.zip). It was processed using the scripts in `multipleMethods.R`.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents a single contraceptive type combination.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `m1` | A number representing the first method of use. [Codebook here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817482?studyNumber=9999). | number |
| `m2` | A number representing the second method of use. [Codebook here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817482?studyNumber=9999).| number |
| `uniqueR` | The number of unique respondents that have used a specific combination of methods at least once simultaneously.| number |

## sideEffects.csv & sideEffects.R

* `sideEffects.csv`: The data described below
* `sideEffects.R`: The script used to process `allData.csv` (from `allData.zip`) to create `sideEffects.csv`. The data was used to create the graphics in the section of [Let's Talk About Birth Control](https://pudding.cool/2018/07/birth_control/) labelled "Side Effects are a Deal Breaker". This script was written in the R programming language. All details describing the R session environment during processing are available [here](#R-Session-Info).


- 	**What is this?**: Data representing the types of side effects that respondents listed as reasons for stopping Depo-Provera, Pill, IUD, and condom use.
-   **Source(s) & Methodology**: All data was acquired in the same way as [allData.zip](#allData.zip). It was processed using the scripts in `sideEffects.R`.
-   **Last Modified**: July 12, 2018
-   **Contact Information**: [Amber Thomas](mailto:amber@polygraph.cool)
-   **Spatial Applicability**: United States (nationally representative data)
-   **Temporal Applicability**: 2006 - 2015
-   **Observations (Rows)**: Each row represents a single contraceptive type combination.
-   **Variables (Columns)**:

| Header | Description | Data Type |
|---|---|---|
| `stopMethod` | The method that has been stopped by the respondent. | string |
| `reason` | A number representing the reason that the method was stopped. There is a different codebook for each type. They are available here: <br/>&bull; [Condom Codebook - General](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817289?vg=10307&studyNumber=9999)<br/>&bull; [Condom Codebook - Specific](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817296?studyNumber=9999)<br/>&bull; [IUD Codebook - General](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817313?studyNumber=9999)<br/>&bull; [IUD Codebook - Specific](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817318?studyNumber=9999)<br/>&bull; [Pill Codebook - General](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817277?studyNumber=9999)</br>&bull; [Pill Codebook - Specific](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817283?studyNumber=9999)</br>&bull; [Depo-Provera Codebook - General](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817298?studyNumber=9999)</br>&bull; [Depo-Provera Codebook - Specific](https://www.icpsr.umich.edu/icpsradmin/nsfg/variable/817306?studyNumber=9999)| number |
| `total` | The total number of unique respondents that reported a side effect. | number |
| `percent` | The percentage of respondents that reported a specific side effect. This was calculated as `number of people that experienced a stopped using a method due to a specific side effect/ total number of people that stopped using that method for some reason`. Represented as a number from 0 to 100 with one decimal place. | number |
| `type` | The CDC reports two types of reasons for discontinued use: a general reason and a specific reason. If a respondent selects that they stopped using a method due to `side effects` or `other` in the general response, they are asked to give a more specific reason for discontinuing. The general and specific responses are labelled accordingly and coincide with the general and specific codebooks labeled in the `reason` variable above. | string |

## analysis.Rmd & analysis.html
These files contain the full, mostly un-edited version of my preliminary and final analyses for this project. Some of the analyses did not make it into the final project. To view the code and preliminary figures, check out the `.html` file instead of the `.Rmd` file.

## R Session Info
  ### Session info
    ##  setting  value                       
    ##  version  R version 3.4.4 (2018-03-15)
    ##  system   x86_64, darwin15.6.0        
    ##  ui       X11                         
    ##  language (EN)                        
    ##  collate  en_US.UTF-8                 
    ##  tz       America/Los_Angeles         
    ##  date     2018-07-12

  ### Packages

    ##  package   * version date       source        
    ##  backports   1.1.2   2017-12-13 CRAN (R 3.4.3)
    ##  base      * 3.4.4   2018-03-15 local         
    ##  compiler    3.4.4   2018-03-15 local         
    ##  datasets  * 3.4.4   2018-03-15 local         
    ##  devtools    1.13.6  2018-06-27 CRAN (R 3.4.4)
    ##  digest      0.6.15  2018-01-28 CRAN (R 3.4.3)
    ##  evaluate    0.10.1  2017-06-24 CRAN (R 3.4.1)
    ##  graphics  * 3.4.4   2018-03-15 local         
    ##  grDevices * 3.4.4   2018-03-15 local         
    ##  htmltools   0.3.6   2017-04-28 CRAN (R 3.4.0)
    ##  knitr       1.20    2018-02-20 CRAN (R 3.4.3)
    ##  magrittr    1.5     2014-11-22 CRAN (R 3.4.0)
    ##  memoise     1.1.0   2017-04-21 CRAN (R 3.4.0)
    ##  methods   * 3.4.4   2018-03-15 local         
    ##  Rcpp        0.12.16 2018-03-13 CRAN (R 3.4.4)
    ##  rmarkdown   1.9     2018-03-01 CRAN (R 3.4.3)
    ##  rprojroot   1.3-2   2018-01-03 CRAN (R 3.4.3)
    ##  stats     * 3.4.4   2018-03-15 local         
    ##  stringi     1.1.7   2018-03-12 CRAN (R 3.4.4)
    ##  stringr     1.3.1   2018-05-10 CRAN (R 3.4.4)
    ##  tools       3.4.4   2018-03-15 local         
    ##  utils     * 3.4.4   2018-03-15 local         
    ##  withr       2.1.2   2018-03-15 CRAN (R 3.4.4)
    ##  yaml        2.1.18  2018-03-08 CRAN (R 3.4.4)


================================================
FILE: birth-control/analysis.Rmd
================================================
---
title: "Data Collection"
author: Amber Thomas
date: April 26, 2018
output:
  html_document:
    collapsed: FALSE
    theme: cosmo
    toc: yes
    toc_float: yes
    toc_depth: 2
    df_print: paged
---
```{css echo = FALSE}
pre code, pre, code {
  white-space: pre !important;
  overflow-y: scroll !important;
  max-height: 25vh !important;
}
```

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Background

This project exists to explore the use of various types of contraceptives by women and people with female-assigned reproductive systems in the United States. 

### Questions

Here are a few of the questions that I may try to answer while investigating this dataset: 

* What are the most commonly used types of contraception? 
* How often do users switch from one type to another? 
* If users switch, what do they switch from/to? 
* What types of side effects did people experience? 
* Does sex ed/cost of contraception affect what types people are using? 


### Data Source(s)

All data from this project is collected by the Centers for Disease Control and Prevention (CDC) through the National Survey of Family Growth (NSFG). Surveys of this nature have been conducted since 1973 and originally only involved female respondents. After 2002, this survey consists of both a "Male" and "Female" survey, but for the purposes of this topic, I will only focus on the "Female" survey.

More information on the survey methods are available [here](https://www.cdc.gov/nchs/nsfg/about_nsfg.htm). 

Since I am primarily interested on the questions pertaining to contraceptive use, I will reduce each of the large data files to only the questions I am interested in. 

## Loading Necessary Packages
```{r message = FALSE}
## For folder structure
library(here)
library(ezknitr)

## For data import/cleaning
library(tidyverse)
library(SAScii)
library(purrr)
library(rlang)
library(forcats)

## For graphing
library(igraph)
library(RColorBrewer)
library(viridis)
```

## Importing data
While I can download the original data sources to my machine, they appear to be quite large, so I will instead access them directly from the CDC website. These files are in `.dat` format, and have SAS script that describes how to import the data. Luckily, the `SAScii` package exists to combine SAS scripts and `.dat` files and import them into an R environment.  

### 2013 - 2015
```{r eval = FALSE}
data_1315 <- read.SAScii(
  fn = "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/2013_2015_FemRespData.dat",
  sas_ri = "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/sas/2013_2015_FemRespSetup.sas"
)
```

```{r eval = FALSE, echo = FALSE}
saveRDS(data_1315, here("raw_data", "data_1315.rds"))
```

```{r echo = FALSE}
data_1315 <- readRDS(here("raw_data", "data_1315.rds"))
```


Looks like the data has 5699 observations (rows), each one representing a single respondent and 3207 variables (columns), each one representing a single question. I don't need all of that data, so I can now reduce the data to include only the columns of interest. The codebook for questions can be found [here](https://www.cdc.gov/nchs/data/nsfg/NSFG_2013-2015_UG_App1a_FemRespFile_Index.pdf). The codebook for responses can be found [here](https://www.icpsr.umich.edu/icpsradmin/nsfg/dataset?number=1&studyNumber=9999). 

Here are the ones I'll be keeping: 

* **CASEID**: Respondent ID Number
* **AGE_R**: Respondent's age at interview
* **MARSTAT**: Respondent's marital status
* **PREGNOWQ**: Whether respondent is currently pregnant
* **RHADSEX**: Whether respondent has ever had sex (heterosexual vaginal intercourse)
* **SEDBC**: Formal Sex Ed Before 18: Methods of Birth Control
* **SEDSTD**: Formal Sex Ed Before 18: STD
* **SEDABST**: Formal Sex Ed Before 18: Waiting Until Marriage *Not available in 0610 data*
* **LIFEPRTS**: Number of Male Sexual Partners in Lifetime
* **HYST**: Respondent is surgically sterile at interview due to hysterectomy
* **OVAREM**: Respondent is surgically sterile at interview due to ovary removal *Not available in 0610 data*
* **OTHR**: Respondent is surgically sterile at interview due to other female operation
* **VASECT**: Respondent's husband/partner is currently sterile from vasectomy
* **POSIBLPG**: Physically possible for Respondent to have a baby
* **POSIBLMN**: Physically possible for Respondents current husband/partner to father a baby
* **PILL**: EA-1 Respondent ever used birth contorl pills? 
* **CONDOM**: EA-2 Respondent ever used condoms? 
* **VASECTMY**: EA-3 Respondent ever used partner's vasectomy? 
* **DEPOPROV**: EA-4 Respondent ever used Depo-Provera, injectables?
* **WIDRAWAL**: EA-5 Respondent ever used withdrawal?
* **RHYTHM**: EA-7 Respondent ever used calendar rhythm method? 
* **SDAYCBDS**: EA-7b Respondent ever used Standard Days or CycleBeads method? *Not available in 0610 or 1113 data*
* **TEMPSAFE**: EA-8 Respondent ever used symptothermal method? 
* **PATCH**: EA-9 Respondent ever used contraceptive patch? 
* **RING**: EA-10 Respondent ever used vaginal contraceptive ring or "NuvaRing"?
* **MORNPILL**: EA-11 Respondent ever used emergency contraception? 
* **ECTIMESX**: EA-12 Number of times Respondent used emergency contraception
* **EVERUSED**: Respondent ever used any type of contraception? (computed)
* **EVIUDTYP1**: EA-15a Types of IUD ever used - 1st mention
* **EVIUDTYP2**: EA-15a Types of IUD ever used - 2nd mention
* **METHSTOP01 - METHSTOP10**: EA-17 Method stopped using due to dissatisfaction - 1st through 10th method
* **STOPPILL1 - STOPPILL6**: Computed open-ended response to reason(s) for discontinuation of the pill - 1st through 6th mention
* **STOPCOND1 - STOPCOND2**: Computed open-ended response to reason(s) for discontinuation of the condom - 1st and 2nd mention
* **STOPDEPO1 - STOPDEPO2**: Computed open-ended response to reason(s) for discontinuation of Depo Provera - 1st and 2nd mention
* **TYPEIUD_1 - TYPEIUD_2**: Type of IUD that was continued due to dissatisfaction - 1st and 2nd mention
* **STOPIUD1 - STOPIUD5**: Computed open-ended response to reason(s) for discontinuation of IUD - 1st through 5th mention
* **REASPILL01 - REASPILL06**: Reason not satisfied with the pill - 1st through 6th mention
* **REASCOND01 - REASCOND07**: Reason not satisfied with the condom - 1st through 7th mention
* **REASDEPO01 - REASDEPO08**: Reason not satisfied with Depo-Provera - 1st through 8th mention
* **REASIUD01 - REASIUD05**: Reason not satisfied with IUD - 1st through 5th mention
* **WHYNOUSING1 - WHYNOUSING5**: Reason not using birth control (at risk of unintended pregnancy) - 1st through 5th mention
* **FIRSMETH1 - FIRSMETH4**: First method ever used - 1st through 4th mention
* **YUSEPILL1 - YUSEPILL7**: Reasons for recent pill use - 1st through 7th mention
* **JINTEND**: Respondent and husband/partner intend to have a/another baby some time? 
* **JSUREINT**: How sure respondent and husband/partner will/will not have another baby? 
* **INTEND**: Respondent intends to have a/another baby some time? 
* **SUREINT**: How sure Respondent will/will not have a/another baby? 
* **REACTSLF**: How respondent would feel if she got pregnant now
* **LESSPLSR**: Chance respondent would feel less physical pleasure if partner used a condom
* **EMBARRAS**: Chance condom discussion would embarrass respondent & partner
* **ORIENT**: Respondent's sexual orientation *Not available in 0610 data*
* **CONFCONC**: Not go for sexual or reproductive health care because your parents might find out *Not available in 0610 or 1113 data*
* **BTHCON12**: Recieved method birth control/prescription in the last 12 months
* **MEDTST12**: Received checkup for birth control last 12 months
* **BC12PAYX7 - BC12PAYX9**: Way bill was paid - method birth control/prescription - 1st through 4th methods
* **BC12PAYX10 - BC12PAYX16**: Way bill was paid - check up for birth control - 1st through 4th methods
* **BC12PAYX19 - BC12PAYX22**: Way bill was paid - counseling about birth control - 1st through 4th methods
* **STRLOPER**: Type of sterlization operation "in effect" at time of interview

## Cleaning Data

I'll create a character vector of all of the column names that don't have repeats so that I can trim to just the columns that I need. Any of the column names that have numeric repeats (e.g., `METHSTOP01`, `METHSTOP02`) can be specified using the `num_range()` function inside of `select()` from `dplyr`.
```{r}
general_ques <- c("CASEID", "AGE_R", "MARSTAT", "PREGNOWQ", "RHADSEX", "SEDBC", "SEDSTD", "SEDABST", "LIFEPRTS", "HYST", "OVAREM", "OTHR", "VASECT", "POSIBLPG", "POSIBLMN", "PILL", "CONDOM", "VASECTMY", "DEPOPROV", "WIDRAWAL", "RHYTHM", "SDAYCBDS", "TEMPSAFE", "PATCH", "RING", "MORNPILL", "ECTIMESX", "EVERUSED", "JINTEND", "JSUREINT", "INTEND", "JSUREINT", "INTEND", "SUREINT", "REACTSLF", "LESSPLSR", "EMBARRAS", "ORIENT", "CONFCONC", "BTHCON12", "MEDTST12", "WNFSTUSE_Y", "STRLOPER")
```

```{r eval = FALSE}
general_data_1315 <- data_1315 %>% 
  select(one_of(general_ques), 
         num_range("EVIUDTYP", 1:2), 
         num_range("METHSTOP", 1:10), 
         num_range("STOPPILL", 1:6), 
         num_range("STOPCOND", 1:2), 
         num_range("STOPDEPO", 1:2),
         num_range("TYPEIUD_", 1:2),
         num_range("STOPIUD", 1:5),
         num_range("WHYNOUSING", 1:5),
         num_range("YUSEPILL", 1:7),
         num_range("BC12PAYX", 7:22),
         num_range("FIRSMETH", 1:4), 
         num_range("REASPILL0", 1:6),
         num_range("REASCOND0", 1:7),
         num_range("REASDEPO0", 1:8),
         num_range("REASIUD0", 1:5),
  )
```

```{r eval = FALSE, echo = FALSE}
saveRDS(general_data_1315, here("processed_data", "general_data_1315.rds"))
```

```{r echo = FALSE}
general_data_1315 <- readRDS(here("processed_data", "general_data_1315.rds"))
```


---

I also want a secondary data frame that just looks at the methods used monthly over the course of four years. 

These are all labeled as **METHX1** through **METHX192**. 

This one doesn't need a character vector. 

```{r}
switch_data_1315 <- data_1315 %>% 
  select(num_range("METHX", 1:192), c("CASEID", "EVERUSED"))

startMonth <- seq(from = 1, to = 192, by = 4)
endMonth <- seq(from = 4, to = 192, by = 4)
months <- as.data.frame(cbind(startMonth, endMonth))

switch_sub <- head(switch_data_1315, n = 15)

test <- switch_sub %>% 
  unite(jan4, sort(as.numeric(months$startMonth[1]:months$endMonth[1])), sep = ",") %>% 
  select(jan4) %>% 
  mutate(jan4 = str_replace_all(jan4, ",NA", ""))
```

```{r}
condenseUsage <- function(monthNum){
  monthName <- paste0("month_", monthNum)
  
  df <- switch_data_1315 %>% 
    unite(!!monthName, sort(as.numeric(months$startMonth[monthNum]:months$endMonth[monthNum])), sep = ",") %>% 
    select(c(!!monthName)) #%>% 
   # mutate(!!monthName := str_replace_all(!!monthName, "_NA", ""))
}
```

```{r echo = FALSE, eval = FALSE}
switch_subID <- switch_sub %>% 
  select(c("CASEID", "EVERUSED"))

monthNumbers <- c(1:5)

testusage <- condenseUsage(3)
testMap <- map_dfc(monthNumbers, condenseUsage) %>% 
  mutate_all(funs(str_replace_all(., ",NA", ""))) #%>% 
  #cbind(switch_subID)

```


```{r}
monthNumbers <- c(1:48)

sub <- switch_data_1315 %>% 
  select(c("CASEID", "EVERUSED"))

usageMap <- map_dfc(monthNumbers, condenseUsage) %>% 
  mutate_all(funs(str_replace_all(., ",NA", ""))) %>% 
  cbind(sub) %>% 
  select(c("CASEID", "EVERUSED"), month_1:month_48) %>% 
  gather(month, value = "method", month_1:month_48) %>% 
  mutate(month = gsub("month_", "", month)) %>% 
  group_by(CASEID, method) %>% 
  summarise(count = n()) %>% 
  mutate(prev = lag(method))
```


## Adding more data
So far, so good. Looks like we've got some pretty workable methods for cleaning the data we'll need, but I want to look at more than just 2013 - 2015. The CDC has data going back to the 70's, but for now, let's just go back to 2006  

### Finding links for all data sources
```{r eval = FALSE}
dataURL_0610 <- "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/2006_2010_FemResp.dat"
codeURL_0610 <- here("raw_data", "2006_2010_FemRespSetup.sas.txt")
dataURL_1113 <- "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/2011_2013_FemRespData.dat"
codeURL_1113 <- "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/sas/2011_2013_FemRespSetup.sas"
dataURL_1315 <- "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/2013_2015_FemRespData.dat"
codeURL_1315 <- "ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Datasets/NSFG/sas/2013_2015_FemRespSetup.sas"

data_0610 <- read.SAScii(
  fn = dataURL_0610,
  sas_ri = codeURL_0610
)

data_1113 <- read.SAScii(
  fn = dataURL_1113,
  sas_ri = codeURL_1113
)
```

```{r eval = FALSE, echo = FALSE}
saveRDS(data_0610, here("raw_data", "data_0610.rds"))
saveRDS(data_1113, here("raw_data", "data_1113.rds"))
```

```{r echo = FALSE}
data_0610 <- readRDS(here("raw_data", "data_0610.rds"))
data_1113 <- readRDS(here("raw_data", "data_1113.rds"))
```

We'll create a small function based on our experience of cleaning the 2013 - 2015 data that loops through all of these. 


```{r}
cleanData<- function(data, years){

  filteredData <- data %>%
    select(one_of(general_ques),
         num_range("EVIUDTYP", 1:2), 
         num_range("METHSTOP", 1:10), 
         num_range("STOPPILL", 1:6), 
         num_range("STOPCOND", 1:2), 
         num_range("STOPDEPO", 1:2),
         num_range("TYPEIUD_", 1:2),
         num_range("STOPIUD", 1:5),
         num_range("WHYNOUSING", 1:5),
         num_range("YUSEPILL", 1:7),
         num_range("BC12PAYX", 7:22),
         num_range("FIRSMETH", 1:4), 
         num_range("REASPILL0", 1:6),
         num_range("REASCOND0", 1:7),
         num_range("REASDEPO0", 1:8),
         num_range("REASIUD0", 1:5), 
         num_range("METHX", 1:192),
         num_range("SIMSEQX", 1:48),
         num_range("LSTMTHP", 1:4),
         num_range("CONSTAT", 1:4)
      ) %>%
      mutate(yearRange = years)
}
```

```{r eval = FALSE}
general_ques <- c("CASEID", "AGE_R", "MARSTAT", "PREGNOWQ", "RHADSEX", "SEDBC", "SEDSTD", "SEDABST", "LIFEPRTS", "HYST", "OVAREM", "OTHR", "VASECT", "POSIBLPG", "POSIBLMN", "PILL", "CONDOM", "VASECTMY", "DEPOPROV", "WIDRAWAL", "RHYTHM", "SDAYCBDS", "TEMPSAFE", "PATCH", "RING", "MORNPILL", "ECTIMESX", "EVERUSED", "JINTEND", "JSUREINT", "INTEND", "JSUREINT", "INTEND", "SUREINT", "REACTSLF", "LESSPLSR", "EMBARRAS", "ORIENT", "CONFCONC", "BTHCON12", "MEDTST12", "WNFSTUSE_Y", "STRLOPER")

clean_0610 <- cleanData(data_0610, "0610")
clean_1113 <- cleanData(data_1113, "1113")
clean_1315 <- cleanData(data_1315, "1315")

allData <- bind_rows(clean_0610, clean_1113, clean_1315)
```

```{r eval = FALSE, echo = FALSE}
saveRDS(allData, here("raw_data", "data_0615.rds"))

write.csv(allData, here("open_data", "allData.csv"), row.names = FALSE)
```

```{r echo = FALSE}
allData <- readRDS(here("raw_data", "data_0615.rds"))
```

Alright, so we've got 23,579 responses with 278 variables. There are a few variables missing for early years, but we'll see what we can do. 

## Exploring Data
Let's start trying to answer some simple questions. 

### First Time
What was the respondent's primary contraceptive method during their first time? 

```{r}
firstTime <- allData %>% 
  filter(EVERUSED == 1) %>% 
  select(FIRSMETH1) %>% 
  group_by(FIRSMETH1) %>% 
  summarise(count = n())
```

Mostly condoms and birth control pills. Has this changed based on the year that the respondent first started using that method? 

```{r}
firstTimeYear <- allData %>% 
  filter(EVERUSED == 1) %>% 
  select(c("FIRSMETH1", "WNFSTUSE_Y")) %>% 
  mutate(decade = case_when(
    WNFSTUSE_Y < 1980 ~ "70's",
    between(WNFSTUSE_Y, 1980, 1989) ~ "80's",
    between(WNFSTUSE_Y, 1990, 1999) ~ "90's",
    between(WNFSTUSE_Y, 2000, 2009) ~ "00's",
    WNFSTUSE_Y >= 2010 ~ "10's"
  )) %>% 
  group_by(decade) %>% 
  mutate(total = n()) %>% 
  group_by(FIRSMETH1, decade, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100) %>% 
  na.omit() %>% 
  mutate(percent = round(percent, 1)) %>% 
  rename(method = FIRSMETH1) %>% 
  select(method, decade, percent) %>% 
  ungroup() %>% 
  group_by(method) %>% 
  mutate(decade = factor(decade, levels = c("70's", "80's", "90's", "00's", "10's")), decade) %>% 
  arrange(decade) %>% 
  ungroup()

## Export data to csv for graphing
write.csv(firstTimeYear, "../../src/assets/data/firstTime.csv", row.names = FALSE)

firstTimeYearPlot <- ggplot(firstTimeYear, aes(x = decade, y = percent, group = as.factor(method), color = as.factor(method))) +
  geom_line()

firstTimeYearPlot

ggsave(here("plots", "firstTimeYear.svg"), firstTimeYearPlot, device = "svg", width = 10, height = 5)
```



### Types of Contraception
First let's look at the breakdown of the types of birth control that respondents have ever used. 

```{r}
# Find percentage of respondents that have ever used contraceptives
allData %>% 
  group_by(EVERUSED) %>% 
  summarise(count = n(),
        percent = count / nrow(allData)) %>% 
  mutate(EVERUSED = ifelse(EVERUSED == 1, "Yes", 
                           ifelse(EVERUSED == 5, "No", NA)))
```
Alright, so 88% of respondents have used some form of contraception. Let's limit our sample to just those 20,759 people. 

```{r}
possibleTypes <- c("CONDOM", "VASECTMY", "DEPOPROV", "WIDRAWAL", "RHYTHM", "SDAYCBDS", "TEMPSAFE", "PATCH", "PILL", "RING", "MORNPILL", "EVIUDTYP1", "EVIUDTYP2", "STRLOPER")

IUDTypes <- c(1, 2, 3, 9)
IUDMethods <- c("EVIUDTYP1", "EVIUDTYP2")
tubalMethods <- "STRLOPER"

`%not_in%` <- negate(`%in%`)

typeUsed <- allData %>% 
  filter(EVERUSED == 1) %>% 
  select(one_of(possibleTypes)) %>% 
  gather(method, usage) %>% 
  mutate(usage = case_when(
    method %in% IUDMethods & (usage %in% IUDTypes) ~ "Yes",
    method %in% IUDMethods & usage %not_in% IUDTypes ~ "No",
    method %in% tubalMethods & usage == 1 ~ "Yes",
    method %in% tubalMethods & usage > 1 ~ "No",
    method %not_in% IUDMethods & method %not_in% tubalMethods & usage == 1 ~ "Yes",
    method %not_in% IUDMethods & method %not_in% tubalMethods & usage == 5 ~ "No",
    method %not_in% IUDMethods & method %not_in% tubalMethods & usage != 1 & usage != 5 ~ "NA"
  )) %>% 
  # mutate(usage = ifelse(usage == 1, "Yes", 
  #                          ifelse(usage == 5, "No", NA))) %>% 
  filter(!usage == "NA") %>% 
  mutate(cleanMethod = ifelse(method == "EVIUDTYP1" | method == "EVIUDTYP2", "IUD", method)) %>% 
  group_by(cleanMethod, usage) %>% 
  summarise(count = n(),
            percent = (count / 20759) * 100) 

# Looking at only the positive responses
onlyPos <- typeUsed %>% 
  filter(usage == "Yes") %>% 
  mutate(percent = round(percent, 0))

# Export the positive responses to csv for use in JS
write.csv(onlyPos, "../../src/assets/data/everused.csv", row.names = FALSE)

typeUsed
```

So, 92% of respondents have used condoms,  79% have used the pill, 27% have used Depo-Provera (Injectable), 3% have used an IUD, 16% have used the morning-after pill (emergency contraception), 12% have used the patch, 16% have used their biological rhythm, 8.5% have used a contraceptive ring (Nuva Ring), 3% (of the people surveyed in 2013 - 2015) have used the calendar method, 3% have used their body temperature, 10% have used their partner's vasectomy, and 60% have used withdrawal. 

Does the contraception type change with age? 

```{r}
typeAge <-  allData %>% 
  filter(EVERUSED == 1) %>% 
  select(one_of(possibleTypes), AGE_R) %>% 
  gather(method, usage, -AGE_R) %>% 
  mutate(usage = case_when(
    method %in% IUDMethods & (usage %in% IUDTypes) ~ "Yes",
    method %in% IUDMethods & usage %not_in% IUDTypes ~ "No",
    method %not_in% IUDMethods & usage == 1 ~ "Yes",
    method %not_in% IUDMethods & usage == 5 ~ "No",
    method %not_in% IUDMethods & usage != 1 & usage != 5 ~ "NA"
  )) %>% 
  filter(usage == "Yes" & method != "EVIUDTYP2") %>% 
  group_by(AGE_R) %>% 
  mutate(total = n()) %>% 
  group_by(AGE_R, method, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100)

ageUseGraph <- ggplot(typeAge, aes(x = AGE_R, y = percent, group = method, color = method)) + geom_line()

ggsave(here("plots", "ageUse.svg"), ageUseGraph, device = "svg", width = 10, height = 7)
```


How many different types of contraceptive have respondents used? 

```{r}
not_one_of <- negate(one_of)

specialRecode <- c("CONDOM", "VASECTMY", "DEPOPROV", "WIDRAWAL", "RHYTHM", "SDAYCBDS", "TEMPSAFE", "PATCH", "PILL", "RING", "MORNPILL")

recodeVal <- function(x){
  if(x != 1) 0
}

typeCount <- allData %>% 
  filter(EVERUSED == 1) %>% 
  select(CASEID, AGE_R, one_of(possibleTypes)) %>% 
  mutate_at(.vars = vars(one_of(specialRecode)), 
            funs(ifelse(. != 1, 0, .))) %>% 
  mutate_at(.vars = vars(one_of(IUDMethods)),
            funs(ifelse(is.na(.), 0, 1))) %>% 
  mutate(total = rowSums(.[3:15], na.rm = TRUE))

typeCount %>% summarise(mean(total))
```


On average, respondents have used 3.3 different types of birth control. 

---
Does this change with age? 

```{r}
ageCount <- typeCount %>% 
  group_by(AGE_R) %>% 
  summarise(average = mean(total),
            count = n())

ggplot(ageCount, aes(x = AGE_R, y = average)) + geom_point()
```


Young respondents haven't had much experience with different types of birth control, while people in their mid-20's have reached their peak number of birth control types. Maybe they've settled on what works for them?

---
### Switching Methods

How long are particular types of birth control used (on average) and how often do users switch between them? 

To get at this, we need to access the `METHX` columns of our dataset. 

```{r}
monthNumbers <- c(1:48)

startMonth <- seq(from = 1, to = 192, by = 4)
endMonth <- seq(from = 4, to = 192, by = 4)
months <- as.data.frame(cbind(startMonth, endMonth))

fullSwitch <- allData %>% 
  select(num_range("METHX", 1:192), c("EVERUSED", "CASEID")) %>% 
  filter(EVERUSED == 1) %>% 
  select(-EVERUSED)
  
idsOnly <- fullSwitch %>% 
  select("CASEID")

methodsOnly <- fullSwitch %>% 
  select(-CASEID)

condenseAll <- function(monthNum){
  monthName <- paste0("month_", monthNum)
  
  df <- methodsOnly %>% 
    unite(!!monthName, sort(as.numeric(months$startMonth[monthNum]:months$endMonth[monthNum])), sep = ",") %>% 
    select(c(!!monthName)) 
}

partUsage <- map_dfc(monthNumbers, condenseAll) %>% 
  mutate_all(funs(str_replace_all(., ",NA", ""))) %>% 
  cbind(idsOnly) %>% 
  select("CASEID", month_1:month_48) %>% 
  gather(month, value = "method", month_1:month_48) %>% 
  mutate(month = gsub("month_", "", month))

# Keep only months where the respondent used multiple methods at the same time
sameTime <- allData %>% 
  select(num_range("SIMSEQX", 1:48), CASEID) %>% 
  gather(month, value = "time", SIMSEQX1:SIMSEQX48) %>% 
  mutate(month = gsub("SIMSEQX", "", month))

usageTime <- partUsage %>%
  left_join(sameTime, by = c("CASEID", "month")) %>% 
  filter(time == 1)

usageMap <- usageTime %>% 
  group_by(CASEID, method) %>% 
  summarise(count = n()) %>% 
  mutate(prev = lag(method))
```

How many different combinations are there? 
```{r}
levels(as.factor(usageMap$method))
```
Alright, so there are just over 300 combinations. 

```{r echo = FALSE, eval = FALSE}
singleMethods <- usageMap %>% 
  filter(!str_detect(method, ","),
         !method == "NA") %>% 
  group_by(method) %>% 
  summarise(min = min(count),
            max = max(count), 
            iqr = IQR(count),
            mean = mean(count), 
            median = median(count)) %>% 
  mutate(methodWords = case_when(
    method == 1 ~ "No method",
    method == 3 ~ "Birth control pills",
    method == 4 ~ "Condom",
    method == 5 ~ "Partner's Vasectomy",
    method == 6 ~ "Female Sterlization",
    method == 7 ~ "Withdrawal", 
    method == 8 ~ "Depo-Provera", 
    method == 9 ~ "Hormonal Implant", 
    method == 10 ~ "Calendar Rhythm", 
    method == 11 ~ "Temperature Test", 
    method == 12 ~ "Diaphragm", 
    method == 13 ~ "Female Condom", 
    method == 14 ~ "Foam", 
    method == 15 ~ "Jelly or Cream", 
    method == 16 ~ "Cervical Cap", 
    method == 17 ~ "Suppository", 
    method == 18 ~ "Today sponge", 
    method == 19 ~ "IUD", 
    method == 20 ~ "Emergency contraception",
    method == 21 ~ "Other", 
    method == 22 ~ "Sterile", 
    method == 23 ~ "Partner Sterile",
    method == 25 ~ "Patch", 
    method == 26 ~ "Ring", 
    method == 55 ~ "Empty", 
    method == 98 ~ "Refused", 
    method == 99 ~ "Don't know"
  ))

ggplot(singleMethods, aes(x = reorder(methodWords, mean), y = mean)) + 
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) + 
  ylab("Mean Months of Use") +
  xlab("Method used in isolation")
```

Now, which methods are commonly used together? 

To figure this out, we'll split the data back out with each method in a separate column. 

```{r}
networkData <- usageMap %>% 
  separate(method, c("method_1", "method_2", "method_3", "method_4"), sep = ",")

# Keep respondents that used 4 types of birth control
networkData_4Types <- networkData %>% filter(!is.na(method_4))
networkData_4Types12 <- networkData_4Types %>% select(-c(method_3, method_4)) %>% rename(m_a = method_1, m_b = method_2)
networkData_4Types34 <- networkData_4Types %>% select(-c(method_1, method_2)) %>% rename(m_a = method_3, m_b = method_4)
networkData_4Types13 <- networkData_4Types %>% select(-c(method_2, method_4)) %>% rename(m_a = method_1, m_b = method_3)
networkData_4Types14 <- networkData_4Types %>% select(-c(method_2, method_3)) %>% rename(m_a = method_1, m_b = method_4)
networkData_4Types23 <- networkData_4Types %>% select(-c(method_1, method_4)) %>% rename(m_a = method_2, m_b = method_3)
networkData_4Types24 <- networkData_4Types %>% select(-c(method_1, method_3)) %>% rename(m_a = method_2, m_b = method_4)

networkData_4All <- bind_rows(networkData_4Types12, networkData_4Types34, networkData_4Types13, networkData_4Types14, networkData_4Types23, networkData_4Types24)

# Limit to people that have used 3 types
networkData_3Types <- networkData %>% filter(!is.na(method_3) & is.na(method_4))
networkData_3Types12 <- networkData_3Types %>% select(-c(method_3, method_4)) %>% rename(m_a = method_1, m_b = method_2)
networkData_3Types13 <- networkData_3Types %>% select(-c(method_2, method_4)) %>% rename(m_a = method_1, m_b = method_3)
networkData_3Types23 <- networkData_3Types %>% select(-c(method_1, method_4)) %>% rename(m_a = method_2, m_b = method_3)

networkData_3All <- bind_rows(networkData_3Types12, networkData_3Types13, networkData_4Types23)

# Limit to people that have used 2 types
networkData_2Types <- networkData %>% filter(!is.na(method_2) & is.na(method_3) & is.na(method_4))
networkData_2Types12 <- networkData_2Types %>% select(-c(method_3, method_4)) %>% rename(m_a = method_1, m_b = method_2)

# Limit to people that have used 1 type
networkData_1Type <- networkData %>% filter(is.na(method_2) & is.na(method_3) & is.na(method_4)) %>% select(-c(method_3, method_4)) %>% rename(m_a = method_1, m_b = method_2)

allNetworkData <- bind_rows(networkData_4All, networkData_3All, networkData_2Types12)

nodeData <- allNetworkData %>% gather(method, type, c(m_a, m_b))
```

Using the `igraph` package we can start getting an idea of the connection between these different contraceptive methods. 

```{r}
nodes <- nodeData %>%
  group_by(type) %>% 
  summarise(sum = sum(count)) %>% 
  mutate(methodWords = case_when(
    type == 1 ~ "No method",
    type == 3 ~ "Birth control pills",
    type == 4 ~ "Condom",
    type == 5 ~ "Partner's Vasectomy",
    type == 6 ~ "Female Sterlization",
    type == 7 ~ "Withdrawal", 
    type == 8 ~ "Depo-Provera", 
    type == 9 ~ "Hormonal Implant", 
    type == 10 ~ "Calendar Rhythm", 
    type == 11 ~ "Temperature Test", 
    type == 12 ~ "Diaphragm", 
    type == 13 ~ "Female Condom", 
    type == 14 ~ "Foam", 
    type == 15 ~ "Jelly or Cream", 
    type == 16 ~ "Cervical Cap", 
    type == 17 ~ "Suppository", 
    type == 18 ~ "Today sponge", 
    type == 19 ~ "IUD", 
    type == 20 ~ "Emergency contraception",
    type == 21 ~ "Other", 
    type == 22 ~ "Sterile", 
    type == 23 ~ "Partner Sterile",
    type == 25 ~ "Patch", 
    type == 26 ~ "Ring", 
    type == 55 ~ "Empty", 
    type == 98 ~ "Refused", 
    type == 99 ~ "Don't know"
  )) %>% 
  filter(!is.na(type), type != "NA") %>% 
  ungroup()

edges <- allNetworkData %>% 
  na.omit() %>% 
  group_by(m_a, m_b) %>% 
  summarise(sum = sum(count)) %>% 
  ungroup()

# Make graph object
net <- graph.data.frame(edges, nodes, directed = FALSE)

# Set graph attributes
V(net)$size <- V(net)$sum
E(net)$width <- E(net)$sum/10000
E(net)$edge.color <- "gray80"

layout <- layout_nicely(net)

 plot(net, vertex.size = 5 + nodes$sum/6000, edge.width = 0.25 + edges$sum/5000, vertex.label=nodes$methodWords, edge.color="gray", layout = layout)
```

Hmm, that's not super helpful. Maybe try a heatmap? 

```{r}
hm.palette <- colorRampPalette(rev(brewer.pal(9, 'YlOrRd')), space='Lab')

ggplot(edges, aes(m_a, m_b)) +
  geom_tile(aes(fill = log(sum)), color = "white") +
  scale_fill_gradientn(colours = hm.palette(100)) +
  ylab("Method A") +
  xlab("Method B") +
  theme(legend.title = element_text(size = 10),
        legend.text = element_text(size = 12),
        plot.title = element_text(size=16),
        axis.title=element_text(size=14,face="bold"),
        axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(fill = "Combinations")
```

How many people use multiple methods simultaneously? 

```{r}
multipleMethods <- usageMap %>% 
  mutate(mult = ifelse(str_detect(method, ","), TRUE, FALSE)) %>% 
  group_by(mult) %>% 
  summarise(unique = n_distinct(CASEID))
```

What are the most common combinations (based on CASEID)

```{r}
commonCombo <- allNetworkData %>% 
  group_by(m_a, m_b) %>% 
  summarise(uniqueR = n_distinct(CASEID)) %>% 
  arrange(desc(uniqueR)) %>% 
  ungroup() %>% 
  mutate(row = row_number())

combo2 <- allNetworkData %>% 
  group_by(m1 = pmin(m_a, m_b), m2 = pmax(m_a, m_b)) %>% 
  summarise(uniqueR = n_distinct(CASEID)) %>% 
  arrange(desc(uniqueR)) %>% 
  ungroup() %>% 
  mutate(row = row_number()) %>% 
  filter(row <= 15) %>% 
  select(-row)

write.csv(combo2, "../../src/assets/data/multipleMethods.csv", row.names = FALSE)


ggplot(commonCombo, aes(x = row, y = uniqueR)) + geom_bar(stat = "identity") + coord_flip()

ggplot(commonCombo, aes(m_a, m_b)) +
  geom_tile(aes(fill = log(uniqueR)), color = "white") +
  scale_fill_viridis(option = "plasma") +
  ylab("Method A") +
  xlab("Method B") +
  theme(legend.title = element_text(size = 10),
        legend.text = element_text(size = 12),
        plot.title = element_text(size=16),
        axis.title=element_text(size=14,face="bold"),
        axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(fill = "Combinations")
```


### Why switch methods? 

At this point, I'm going to combine their primary/secondary/tertiary etc. reasons. I want to see all of the reasons that people stop using a particular type of contraception. Reasons are specified [here](https://www.icpsr.umich.edu/icpsradmin/nsfg/variableGroupChild/10307?studyNumber=9999). 

**TODO: Decide on primary vs. all reasons combined. How to display if all reasons. Is percent calculated as total that experienced a thing / number of experiences or users*

```{r}
# Import lookup table for values
stop_reasons <- read.csv(here("raw_data", "stop_reasons.csv")) %>% 
  mutate(method = toupper(method))

whyStop <- allData %>% 
  select(contains("STOP")) %>% 
  gather(stopMethod, reason) %>% 
  na.omit() %>% 
  # Remove last character from method names (the number) 
  mutate(stopMethod = str_sub(stopMethod, 1, str_length(stopMethod)-1)) %>% 
  group_by(stopMethod) %>% 
  mutate(total = n()) %>% 
  group_by(stopMethod, reason, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100) %>% 
  arrange(desc(count)) %>% 
  group_by(stopMethod, reason) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  left_join(stop_reasons, by = c("stopMethod" = "method", "reason" = "value")) %>% 
  filter(stopMethod != "METHSTOP1" | stopMethod != "METHSTOP2") %>% 
  filter(reason < 25)

ggplot(whyStop, aes(x = reason, y = percent)) + 
  geom_bar(stat = "identity") + 
  facet_wrap(~stopMethod) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
```

So most people stopped taking a certain type of contraceptive because of (primarily) weight gain, pain, mood swings, nausea, or bleeding problems. The top "non-medical" cause is because they couldn't remember to take their pills regularly. 

Looks like the question above is a spin-off of another question: why were users dissatisfied enough to stop using a particular method (if they answered other, or they had side effects, then the answered the question explored above). 

```{r}
## Calculating percent of complaints out of total number of complaints
whyDis <- allData %>% 
  select(CASEID, contains("REAS")) %>% 
  gather(stopMethod, reason, -CASEID) %>% 
  na.omit() %>% 
  # Remove last 2 characters from method names (the numbers) 
  mutate(stopMethod = str_sub(stopMethod, 1, str_length(stopMethod)-2)) %>% 
  group_by(stopMethod) %>% 
  mutate(total = n()) %>% 
  group_by(stopMethod, reason, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100) %>% 
  arrange(desc(count)) %>% 
  group_by(stopMethod, reason) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  mutate(label = case_when(
    reason == 1 ~ "too expensive",
    reason == 2 ~ "insurance didn't cover it",
    reason == 3 ~ "too difficult to use",
    reason == 4 ~ "too messy",
    reason == 5 ~ "partner did not like it",
    reason == 6 ~ "you had side effects",
    reason == 7 ~ "you were worried you might have side effects",
    reason == 8 ~ "worried the method would not work",
    reason == 9 ~ "method failed and you became pregnant",
    reason == 10 ~ "the method did not protect against disease",
    reason == 11 ~ "Doctor told you that you should not use method again",
    reason == 12 ~ "method decreased sexual pleasure",
    reason == 13 ~ "too difficult to obtain",
    reason == 14 ~ "did not like changes to menstrual cycle",
    reason == 15 ~ "other",
    reason == 99 ~ "do not know"
  )) %>% 
  filter(reason < 25)

ggplot(whyDis, aes(x = reason, y = percent)) + 
  geom_bar(stat = "identity") + 
  facet_wrap(~stopMethod) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
```

```{r}
## Calculating percent of complaints out of total users that discontinued use
whyDisUsers <- allData %>% 
  select(CASEID, contains("REAS")) %>% 
  gather(stopMethod, reason, -CASEID) %>% 
  na.omit() %>% 
  # Remove last 2 characters from method names (the numbers) 
  mutate(stopMethod = str_sub(stopMethod, 1, str_length(stopMethod)-2)) %>% 
  group_by(stopMethod) %>% 
  mutate(total = n_distinct(CASEID)) %>% 
  group_by(stopMethod, reason, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100) %>% 
  arrange(desc(count)) %>% 
  group_by(stopMethod, reason) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  mutate(label = case_when(
    reason == 1 ~ "too expensive",
    reason == 2 ~ "insurance didn't cover it",
    reason == 3 ~ "too difficult to use",
    reason == 4 ~ "too messy",
    reason == 5 ~ "partner did not like it",
    reason == 6 ~ "you had side effects",
    reason == 7 ~ "you were worried you might have side effects",
    reason == 8 ~ "worried the method would not work",
    reason == 9 ~ "method failed and you became pregnant",
    reason == 10 ~ "the method did not protect against disease",
    reason == 11 ~ "Doctor told you that you should not use method again",
    reason == 12 ~ "method decreased sexual pleasure",
    reason == 13 ~ "too difficult to obtain",
    reason == 14 ~ "did not like changes to menstrual cycle",
    reason == 15 ~ "other",
    reason == 99 ~ "do not know"
  )) %>% 
  filter(reason < 25) %>% 
  group_by(stopMethod) %>% 
  arrange(desc(percent)) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  select(stopMethod, reason, total, percent) %>%
  mutate(percent = round(percent, 1)) %>% 
  mutate(type = "general")

ggplot(whyDis, aes(x = reason, y = percent)) + 
  geom_bar(stat = "identity") + 
  facet_wrap(~stopMethod) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
```

```{r}
# Import lookup table for values
stop_reasons <- read.csv(here("raw_data", "stop_reasons.csv")) %>% 
  mutate(method = toupper(method))

whyStopUsers <- allData %>% 
  select(CASEID, contains("STOP")) %>% 
  gather(stopMethod, reason, -CASEID) %>% 
  na.omit() %>% 
  # Remove last character from method names (the number) 
  mutate(stopMethod = str_sub(stopMethod, 1, str_length(stopMethod)-1)) %>% 
  group_by(stopMethod) %>% 
  mutate(total = n_distinct(CASEID)) %>% 
  group_by(stopMethod, reason, total) %>% 
  summarise(count = n()) %>% 
  mutate(percent = (count / total) * 100) %>% 
  arrange(desc(count)) %>% 
  group_by(stopMethod, reason) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  left_join(stop_reasons, by = c("stopMethod" = "method", "reason" = "value")) %>% 
  filter(stopMethod != "METHSTOP1",
         stopMethod != "METHSTOP2") %>% 
  filter(reason < 25) %>% 
  group_by(stopMethod) %>% 
  arrange(desc(percent)) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 5) %>% 
  select(stopMethod, reason, total, percent) %>%
  mutate(percent = round(percent, 1)) %>%
  mutate(type = "specific")

userSideEffects <- bind_rows(whyDisUsers, whyStopUsers) %>% 
  ungroup() %>% 
  mutate(stopMethod = gsub("STOPPILL|REASPILL", "The Pill", stopMethod),
        stopMethod =  gsub("STOPIUD|REASIUD", "IUD", stopMethod),
         stopMethod = gsub("STOPCOND|REASCOND", "Condom", stopMethod),
         stopMethod = gsub("STOPDEPO|REASDEPO", "Depo-Provera", stopMethod))

write.csv(userSideEffects, "../../src/assets/data/sideEffects.csv", row.names = FALSE)

ggplot(whyStop, aes(x = reason, y = percent)) + 
  geom_bar(stat = "identity") + 
  facet_wrap(~stopMethod) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
```

### changes with age
Does birth control usage change with age? 

```{r}
monthNumbers <- c(1:48)

ageVar <- c("EVERUSED", "CASEID", "AGE_R")

startMonth <- seq(from = 1, to = 192, by = 4)
endMonth <- seq(from = 4, to = 192, by = 4)
months <- as.data.frame(cbind(startMonth, endMonth))

ageSwitch <- allData %>% 
  select(num_range("METHX", 1:192), one_of(ageVar)) %>% 
  filter(EVERUSED == 1) %>% 
  select(-EVERUSED)
  
idsAgeOnly <- ageSwitch %>% 
  select(c("CASEID", "AGE_R"))

methodsAgeOnly <- ageSwitch %>% 
  select(contains("METHX"))

condenseAllAge <- function(monthNum){
  monthName <- paste0("month_", monthNum)
  
  df <- methodsAgeOnly %>% 
    unite(!!monthName, sort(as.numeric(months$startMonth[monthNum]:months$endMonth[monthNum])), sep = ",") %>% 
    select(c(!!monthName)) 
}

usageAgeMap <- map_dfc(monthNumbers, condenseAllAge) %>% 
  mutate_all(funs(str_replace_all(., ",NA", ""))) %>% 
  cbind(idsAgeOnly) %>% 
  select("CASEID", "AGE_R", month_1:month_48) %>% 
  gather(month, value = "method", month_1:month_48) %>% 
  mutate(month = gsub("month_", "", month)) %>% 
  separate(method, c("method_1", "method_2", "method_3", "method_4"), sep = ",") %>% 
  gather(num, method, c("method_1":"method_4")) %>% 
  filter(!is.na(method)) %>% 
  mutate(month = as.numeric(month)) %>% 
  mutate(calcAge = case_when(
    month < 12 ~ AGE_R - 3,
    between(month, 13, 24) ~ AGE_R - 2,
    between(month, 25, 36) ~ AGE_R - 1,
    month > 36 ~ AGE_R
  ))

totalAges <- usageAgeMap %>% 
  group_by(calcAge) %>% 
  summarise(totalR = n_distinct(CASEID)) 

methodAge <- usageAgeMap %>% 
  filter(!method == "NA") %>% 
  group_by(method, calcAge) %>% 
  summarise(methodR = n_distinct(CASEID))

totalAges2 <- methodAge %>% 
  filter(!method == "NA") %>% 
  group_by(calcAge) %>% 
  summarise(total = sum(methodR))

toRemove <- c(1, 98, 99, 21, 22, 23, 14, 15, 17, 13, 18, 24, 55)

fullAge <- methodAge %>% 
  left_join(totalAges2, by = "calcAge") %>% 
  mutate(percent = (methodR / total) * 100) %>% 
  filter(total > 1000) %>% 
  # Filter out no method, refused, and don't know
  filter(!method %in% toRemove) %>% 
  filter(!is.na(calcAge))

#write.csv(fullAge, "../../src/assets/data/overTime.csv", row.names = FALSE)
  

facetAge <- ggplot(fullAge, aes(x = calcAge, y = percent, group = method, color = method)) + geom_line() + geom_area() + facet_wrap(~method)

facetAge

ggsave(here("plots", "facetAge.svg"), facetAge, device = "svg", width = 10, height = 7)


```

Based on the way the METHX variable was reported, this method of calculation may lead to over-weighting long acting reversible methods (IUD, implants, etc.) which can continue to be used when the user is not sexually active and underweighting coital-dependent methods (like condoms). Let's try this calculation again using the CONSTAT variable (reporting the methods that the user is using at the time of surveying).

```{r}
ageCurrent <- allData %>% 
  select(num_range("CONSTAT", 1:4), one_of(ageVar)) %>% 
  filter(EVERUSED == 1) %>% 
  select(-EVERUSED) %>% 
  gather(variable, method, c("CONSTAT1":"CONSTAT4")) %>% 
  filter(method != 88) %>% 
  group_by(method, AGE_R) %>% 
  summarise(methodR = n_distinct(CASEID))

fullAgeCurrent <- allData %>% 
  select(one_of(ageVar)) %>% 
  filter(EVERUSED == 1) %>% 
  select(-EVERUSED) %>% 
  group_by(AGE_R) %>% 
  summarise(total = n())

currentRemove <- c(4, 13, 14, 16, 17, 18, 22, 30, 31, 32, 33, 34, 35, 36, 38, 40, 41, 42)

totalAgeCurrent <- ageCurrent %>% 
  left_join(fullAgeCurrent, by = "AGE_R") %>% 
  mutate(percent = (methodR / total) * 100) %>% 
  #filter(total > 1000) %>% 
  filter(!method %in% currentRemove) %>% 
  mutate(calcAge = AGE_R) %>% 
  select(-AGE_R) %>% 
  filter(total >= 100)

ggplot(totalAgeCurrent, aes(x = calcAge, y = percent, group = method, color = method)) + geom_line() + geom_area() + facet_wrap(~method)

write.csv(totalAgeCurrent, "../../src/assets/data/overTime.csv", row.names = FALSE)
```



## Method used at last sex

To better understand the combinations of methods, we can also look at methods used at the same time during the last sexual experience. 


```{r}
lastSex <- allData %>% 
  select(num_range("LSTMTHP", 1:4), CASEID)


# Keep respondents that used 4 types of birth control
lastSexNet_4Types <- lastSex %>% filter(!is.na(LSTMTHP4))
lastSexNet_4Types12 <- lastSexNet_4Types %>% select(-c(LSTMTHP3, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP2)
lastSexNet_4Types34 <- lastSexNet_4Types %>% select(-c(LSTMTHP1, LSTMTHP2)) %>% rename(m_a = LSTMTHP3, m_b = LSTMTHP4)
lastSexNet_4Types13 <- lastSexNet_4Types %>% select(-c(LSTMTHP2, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP3)
lastSexNet_4Types14 <- lastSexNet_4Types %>% select(-c(LSTMTHP2, LSTMTHP3)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP4)
lastSexNet_4Types23 <- lastSexNet_4Types %>% select(-c(LSTMTHP1, LSTMTHP4)) %>% rename(m_a = LSTMTHP2, m_b = LSTMTHP3)
lastSexNet_4Types24 <- lastSexNet_4Types %>% select(-c(LSTMTHP1, LSTMTHP3)) %>% rename(m_a = LSTMTHP2, m_b = LSTMTHP4)

lastSexNet_4All <- bind_rows(lastSexNet_4Types12, lastSexNet_4Types34, lastSexNet_4Types13, lastSexNet_4Types14, lastSexNet_4Types23, lastSexNet_4Types24)

# Limit to people that have used 3 types
lastSexNet_3Types <- lastSex %>% filter(!is.na(LSTMTHP3) & is.na(LSTMTHP4))
lastSexNet_3Types12 <- lastSexNet_3Types %>% select(-c(LSTMTHP3, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP2)
lastSexNet_3Types13 <- lastSexNet_3Types %>% select(-c(LSTMTHP2, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP3)
lastSexNet_3Types23 <- lastSexNet_3Types %>% select(-c(LSTMTHP1, LSTMTHP4)) %>% rename(m_a = LSTMTHP2, m_b = LSTMTHP3)

lastSexNet_3All <- bind_rows(lastSexNet_3Types12, lastSexNet_3Types13, lastSexNet_4Types23)

# Limit to people that have used 2 types
lastSexNet_2Types <- lastSex %>% filter(!is.na(LSTMTHP2) & is.na(LSTMTHP3) & is.na(LSTMTHP4))
lastSexNet_2Types12 <- lastSexNet_2Types %>% select(-c(LSTMTHP3, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP2)

# Limit to people that have used 1 type
lastSexNet_1Type <- lastSex %>% filter(is.na(LSTMTHP2) & is.na(LSTMTHP3) & is.na(LSTMTHP4)) %>% select(-c(LSTMTHP3, LSTMTHP4)) %>% rename(m_a = LSTMTHP1, m_b = LSTMTHP2)

alllastSexNet <- bind_rows(lastSexNet_4All, lastSexNet_3All, lastSexNet_2Types12)

lastSexCombo <- alllastSexNet %>% 
  group_by(m_a, m_b) %>% 
  summarise(uniqueR = n_distinct(CASEID)) %>% 
  arrange(desc(uniqueR)) %>% 
  ungroup() %>% 
  mutate(row = row_number())

lastSexCombo2 <- alllastSexNet %>% 
  group_by(m1 = pmin(m_a, m_b), m2 = pmax(m_a, m_b)) %>% 
  summarise(uniqueR = n_distinct(CASEID)) %>% 
  arrange(desc(uniqueR)) %>% 
  ungroup() %>% 
  mutate(row = row_number()) %>% 
  filter(row <= 15) %>% 
  select(-row)

#write.csv(lastSexCombo2, "../../src/assets/data/multipleMethods.csv", row.names = FALSE)

```

The following contains all of my session info for this code: 
```{r session_info, include=TRUE, echo=TRUE, results='markup'}
devtools::session_info()
```



================================================
FILE: birth-control/analysis.html
================================================
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />


<meta name="author" content="Amber Thomas" />

<meta name="date" content="2018-04-26" />

<title>Data Collection</title>

<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT0
Download .txt
gitextract_03t0kui6/

├── .gitignore
├── LICENSE
├── README.md
├── birth-control/
│   ├── README.md
│   ├── analysis.Rmd
│   ├── analysis.html
│   ├── everUsed.R
│   ├── everused.csv
│   ├── firstTime.R
│   ├── firstTime.csv
│   ├── multipleMethods.R
│   ├── multipleMethods.csv
│   ├── overTime.R
│   ├── overTime.csv
│   ├── sideEffects.R
│   ├── sideEffects.csv
│   └── stop_reasons.csv
├── birthday-effect/
│   ├── README.md
│   └── birthdays.csv
├── births/
│   ├── README.md
│   └── allBirthData.csv
├── boybands/
│   ├── README.md
│   ├── bands.csv
│   └── boys.csv
├── campaign-colors/
│   ├── README.md
│   ├── colors.csv
│   └── years.csv
├── census-history/
│   ├── README.md
│   └── full_data.csv
├── cetaceans/
│   ├── README.md
│   ├── acquisitions.csv
│   ├── allCetaceanData.csv
│   └── survivalRates.csv
├── clinics/
│   ├── README.md
│   └── cities.csv
├── clutch/
│   ├── README.md
│   ├── nba.csv
│   ├── shots-nba.csv
│   └── wnba.csv
├── cookies/
│   ├── All_directions.txt
│   ├── README.md
│   └── choc_chip_cookie_ingredients.csv
├── dearabby/
│   ├── README.md
│   └── raw_da_qs.csv
├── dog-shelters/
│   ├── README.md
│   ├── allDogDescriptions.R
│   ├── allDogDescriptions.csv
│   ├── dogTravel.R
│   ├── dogTravel.csv
│   ├── movesByLocation.R
│   └── movesByLocation.csv
├── dress-codes/
│   ├── README.md
│   ├── banned_items.csv
│   ├── body_by_school.R
│   ├── body_by_school.json
│   ├── body_percentages.R
│   ├── body_percentages.csv
│   ├── clothesDetails.csv
│   ├── clothes_percentages.R
│   ├── clothes_percentages.csv
│   ├── full_text.csv
│   ├── length_restrictions.csv
│   ├── sanctions.csv
│   ├── school_metadata.csv
│   ├── strap_restrictions.csv
│   ├── words_percentages.R
│   └── words_percentages.csv
├── filmordigital/
│   ├── README.md
│   ├── top_directors_data.csv
│   ├── top_directors_data_processing.ipynb
│   ├── top_movies_data.csv
│   └── top_movies_data_processing.ipynb
├── foundation-names/
│   ├── README.md
│   ├── allCategories.R
│   ├── allCategories.csv
│   ├── allNumbers.R
│   ├── allNumbers.csv
│   ├── allShades.R
│   ├── allShades.csv
│   ├── crosswalks/
│   │   ├── category_crosswalk.csv
│   │   └── sephora_ulta_crosswalk.csv
│   ├── scrape-sephora.js
│   ├── scrape-ulta.js
│   ├── sephora.R
│   ├── sephora.csv
│   ├── ulta.R
│   └── ulta.csv
├── gayborhoods/
│   ├── README.md
│   └── data.csv
├── hype/
│   ├── README.md
│   ├── paths.R
│   ├── paths.csv
│   └── players.csv
├── kidz-bop/
│   ├── KB_censored-lyrics.csv
│   ├── KB_group-overiew.csv
│   ├── KB_proportions.csv
│   ├── KB_word-overview.csv
│   └── README.md
├── laugh/
│   ├── README.md
│   └── reddit-laughs.csv
├── makeup-shades/
│   ├── README.md
│   └── shades.csv
├── mars-weather/
│   ├── README.md
│   └── mars-weather.csv
├── names-in-songs/
│   ├── README.md
│   ├── allNames.R
│   ├── allNames.csv
│   ├── letters.R
│   ├── letters.csv
│   ├── onlyNames.csv
│   ├── repeats.R
│   ├── repeats.csv
│   ├── timeless_names.R
│   ├── timeless_names.csv
│   ├── unique.R
│   ├── unique.csv
│   ├── unique_by_artist.R
│   └── unique_by_artist.csv
├── nba-unexpected/
│   ├── README.md
│   ├── nba.csv
│   └── wnba.csv
├── neighborhoods/
│   ├── README.md
│   ├── top5_NewYorkCity.csv
│   └── top5_Seattle.csv
├── one-hit-wonders/
│   ├── README.md
│   └── data.csv
├── people-map/
│   ├── README.md
│   └── people-map.csv
├── people-map-uk/
│   ├── README.md
│   └── people-map-uk.csv
├── pockets/
│   ├── README.md
│   ├── measurementRectangles.json
│   └── measurements.csv
├── queues/
│   └── README.md
├── rain/
│   ├── README.md
│   ├── annual_precipitation.R
│   ├── annual_precipitation.csv
│   ├── daily_precipitation.R
│   └── daily_precipitation.csv
├── random/
│   ├── README.md
│   └── trials.csv
├── skate-music/
│   ├── README.md
│   ├── soundtrack_data.csv
│   ├── time_series.tsv
│   └── waffle.csv
├── stand-up/
│   ├── README.md
│   ├── ali-wong--captions.csv
│   └── ali-wong--topics.csv
├── summer-reading/
│   ├── README.md
│   ├── hipster.R
│   └── hipster.csv
├── three-seconds/
│   ├── README.md
│   └── three-seconds.csv
├── titletowns/
│   ├── README.md
│   ├── case1.json
│   ├── case2.json
│   ├── metros.json
│   └── titles.csv
├── vogue/
│   ├── README.md
│   ├── faces.csv
│   └── models.csv
├── winning-the-internet/
│   ├── README.md
│   └── dump-2020-12-15.csv
└── women-in-headlines/
    ├── country_time_freqrank.csv
    ├── headlines.csv
    ├── headlines_reduced_bubble.csv
    ├── headlines_reduced_temporal.csv
    ├── headlines_site.csv
    ├── polarity_comparison_country_time.csv
    ├── polarity_comparison_site_country_time.csv
    ├── readme.md
    ├── word_country_freq.csv
    ├── word_dictionaries.json
    ├── word_themes.csv
    ├── word_themes_freq.csv
    └── word_themes_rank.csv
Download .txt
SYMBOL INDEX (6 symbols across 2 files)

FILE: foundation-names/scrape-sephora.js
  function getColorSwatches (line 6) | async function getColorSwatches(url, page){
  function loopThroughURLs (line 27) | async function loopThroughURLs(urls, page) {
  function findProductURL (line 44) | async function findProductURL() {

FILE: foundation-names/scrape-ulta.js
  function getColorSwatches (line 6) | async function getColorSwatches(url, page){
  function loopThroughURLs (line 38) | async function loopThroughURLs(urls, page) {
  function findProductURL (line 55) | async function findProductURL() {
Copy disabled (too large) Download .json
Condensed preview — 176 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (38,922K chars).
[
  {
    "path": ".gitignore",
    "chars": 29,
    "preview": ".DS_Store\n.Rproj.user\n*.Rproj"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2019 The Pudding\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 23283,
    "preview": "# Data sets\n\nData sets created for stories on [The Pudding](https://pudding.cool), open to the public.\n\n| Pudding Story "
  },
  {
    "path": "birth-control/README.md",
    "chars": 29952,
    "preview": "This folder contains all of the data and R scripts used in The Pudding essay [Let's Talk About Birth Control](https://pu"
  },
  {
    "path": "birth-control/analysis.Rmd",
    "chars": 45294,
    "preview": "---\ntitle: \"Data Collection\"\nauthor: Amber Thomas\ndate: April 26, 2018\noutput:\n  html_document:\n    collapsed: FALSE\n   "
  },
  {
    "path": "birth-control/analysis.html",
    "chars": 2691228,
    "preview": "<!DOCTYPE html>\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"Content"
  },
  {
    "path": "birth-control/everUsed.R",
    "chars": 2557,
    "preview": "\n# Importing Packages\n\n## For folder structure\nlibrary(here)\n\n## For data import/cleaning\nlibrary(tidyverse)\nlibrary(pur"
  },
  {
    "path": "birth-control/everused.csv",
    "chars": 341,
    "preview": "\"cleanMethod\",\"usage\",\"count\",\"percent\"\n\"CONDOM\",\"Yes\",19052,92\n\"DEPOPROV\",\"Yes\",5652,27\n\"IUD\",\"Yes\",798,4\n\"MORNPILL\",\"Y"
  },
  {
    "path": "birth-control/firstTime.R",
    "chars": 2027,
    "preview": "# Importing Packages\n\n## For folder structure\nlibrary(here)\n\n## For data import/cleaning\nlibrary(tidyverse)\nlibrary(purr"
  },
  {
    "path": "birth-control/firstTime.csv",
    "chars": 1123,
    "preview": "\"method\",\"decade\",\"percent\"\n3,\"70's\",75.7\n4,\"70's\",14\n5,\"70's\",0.9\n7,\"70's\",6.5\n9,\"70's\",0.9\n19,\"70's\",1.9\n3,\"80's\",79.6"
  },
  {
    "path": "birth-control/multipleMethods.R",
    "chars": 4920,
    "preview": "# Importing Packages\n\n## For folder structure\nlibrary(here)\n\n## For data import/cleaning\nlibrary(tidyverse)\nlibrary(purr"
  },
  {
    "path": "birth-control/multipleMethods.csv",
    "chars": 206,
    "preview": "\"m1\",\"m2\",\"uniqueR\"\n\"3\",\"4\",2138\n\"3\",\"7\",559\n\"4\",\"7\",506\n\"4\",\"6\",472\n\"4\",\"8\",416\n\"19\",\"4\",229\n\"26\",\"4\",156\n\"10\",\"4\",148\n"
  },
  {
    "path": "birth-control/overTime.R",
    "chars": 2516,
    "preview": "# Importing Packages\n\n## For folder structure\nlibrary(here)\n\n## For data import/cleaning\nlibrary(tidyverse)\nlibrary(purr"
  },
  {
    "path": "birth-control/overTime.csv",
    "chars": 10593,
    "preview": "\"method\",\"methodR\",\"total\",\"percent\",\"calcAge\"\n1,2,704,0.284090909090909,19\n1,4,714,0.560224089635854,21\n1,13,735,1.7687"
  },
  {
    "path": "birth-control/sideEffects.R",
    "chars": 5281,
    "preview": "# Importing Packages\n\n## For folder structure\nlibrary(here)\n\n## For data import/cleaning\nlibrary(tidyverse)\nlibrary(purr"
  },
  {
    "path": "birth-control/sideEffects.csv",
    "chars": 1333,
    "preview": "\"stopMethod\",\"reason\",\"total\",\"percent\",\"type\"\n\"Depo-Provera\",6,2622,73.6,\"general\"\n\"The Pill\",6,5459,60.6,\"general\"\n\"IU"
  },
  {
    "path": "birth-control/stop_reasons.csv",
    "chars": 1634,
    "preview": "method,value,label\r\nstopdepo,1,weight gain\r\nstopdepo,2,bleeding problems\r\nstopdepo,3,headaches or migraines\r\nstopdepo,4,"
  },
  {
    "path": "birthday-effect/README.md",
    "chars": 1931,
    "preview": "This folder contains the raw data for the story Are you more likely to die on your birthday? published in April 2025.\n\nT"
  },
  {
    "path": "births/README.md",
    "chars": 2691,
    "preview": "This folder contains all of the data used in The Pudding essay [The Timing of Baby Making](https://pudding.cool/2017/05/"
  },
  {
    "path": "boybands/README.md",
    "chars": 8347,
    "preview": "This folder contains all of the data used in The Pudding article [Internet Boy Band Database](https://pudding.cool/2018/"
  },
  {
    "path": "boybands/bands.csv",
    "chars": 5834,
    "preview": "\"band\",\"highest_pos\",\"highest_pos_date\",\"highest_song\",\"danceSpeed\",\"featuring_artist\",\"highest_song_vid\"\n\"NSYNC\",1,\"200"
  },
  {
    "path": "boybands/boys.csv",
    "chars": 40530,
    "preview": "\"band\",\"name\",\"dob\",\"hair_color\",\"hair_frosted\",\"hair_length\",\"hair_style\",\"eyes\",\"facial_hair\",\"accessories\",\"top_style"
  },
  {
    "path": "campaign-colors/README.md",
    "chars": 4407,
    "preview": "This folder contains the primary datasets used in The Pudding article [\"How candidate diversity impacts color diversity\""
  },
  {
    "path": "campaign-colors/colors.csv",
    "chars": 23129,
    "preview": "name,year,party,white,male,whiteMale,RWB,redHex,whiteHex,blueHex,other1Hex,other2Hex,other3Hex,image\r\nJohn Delaney,2020,"
  },
  {
    "path": "campaign-colors/years.csv",
    "chars": 406,
    "preview": "year,rwb_n,rwb_y,total,percent_n,percent_y\r\n2020,15,22,37,0.405,0.595\r\n2016,2,25,27,0.074,0.926\r\n2012,1,16,17,0.059,0.9"
  },
  {
    "path": "census-history/README.md",
    "chars": 4016,
    "preview": "This folder contains the primary dataset used in The Pudding article The Evolution of the American Census published in M"
  },
  {
    "path": "census-history/full_data.csv",
    "chars": 101037,
    "preview": "Year,UID,Question,Categories,Unit,Answer Type,Asked of,Age range,Multiple choice options\r\n1790,1790_1,Name of head of ho"
  },
  {
    "path": "cetaceans/README.md",
    "chars": 13456,
    "preview": "This folder contains all of the data used in The Pudding article [Free Willy and Flipper by the Numbers](https://pudding"
  },
  {
    "path": "cetaceans/acquisitions.csv",
    "chars": 1609,
    "preview": "\"\",\"AcqYear\",\"Born\",\"Capture\",\"Rescue\",\"Total\"\n\"1\",1938,0,5,0,5\n\"2\",1939,0,7,0,7\n\"3\",1940,0,0,0,0\n\"4\",1941,0,0,0,0\n\"5\",1"
  },
  {
    "path": "cetaceans/allCetaceanData.csv",
    "chars": 506770,
    "preview": "\"\",\"species\",\"id\",\"name\",\"sex\",\"accuracy\",\"birthYear\",\"acquisition\",\"originDate\",\"originLocation\",\"mother\",\"father\",\"tra"
  },
  {
    "path": "cetaceans/survivalRates.csv",
    "chars": 1103,
    "preview": "\"\",\"Species\",\"max\",\"yearGroup\",\"sumAnimalDays\",\"count\",\"DSR\",\"ASRlow\",\"ASRhigh\",\"ASR\"\n\"1\",\"Beluga\",\"Died\",\"B\",97344,16,0"
  },
  {
    "path": "clinics/README.md",
    "chars": 4432,
    "preview": "This folder contains all of the data used in The Pudding essay [How far is too far? An analysis of driving times to abor"
  },
  {
    "path": "clinics/cities.csv",
    "chars": 62147,
    "preview": "id,city,state,population,latitude,longitude,gestation_8_duration,gestation_8_duration_closed,gestation_12_duration,gesta"
  },
  {
    "path": "clutch/README.md",
    "chars": 5339,
    "preview": "This folder contains data from [inpredictable](https://www.inpredictable.com/) on clutch shooting in the NBA and WNBA. W"
  },
  {
    "path": "clutch/nba.csv",
    "chars": 37993,
    "preview": "pid,bbrid,name,fta_clutch,ft_pct_clutch,total_clutch_shots,pct_clutch,ft_pct_all,gp_all,pct_clutch_adjusted,swg_made_per"
  },
  {
    "path": "clutch/wnba.csv",
    "chars": 9291,
    "preview": "pid,name,bbrid,pct_adjusted,gp_all,ft_pct_all,swg_made_per_game\n100003,Lisa Leslie,leslili01w,-3.49,415,0.69696969696969"
  },
  {
    "path": "cookies/All_directions.txt",
    "chars": 175947,
    "preview": "Preheat oven to 350 degrees F (175 degrees C).\nCream together the butter, white sugar, and brown sugar until smooth. Bea"
  },
  {
    "path": "cookies/README.md",
    "chars": 2997,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [Baking the Most Average Chocolate Chip Cookie](https://"
  },
  {
    "path": "cookies/choc_chip_cookie_ingredients.csv",
    "chars": 149187,
    "preview": ",Ingredient,Text,Recipe_Index,Rating,Quantity,Unit\r\n1,all purpose flour,3.0 cups all purpose flour,AR_1,0.920724583,3,cu"
  },
  {
    "path": "dearabby/README.md",
    "chars": 1665,
    "preview": "This folder contains all of the data used in The Pudding essay [30 Years of American Anxieties: What 20,000 letters to a"
  },
  {
    "path": "dog-shelters/README.md",
    "chars": 23721,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [Finding Forever  Homes](https://pudding.cool/2019/10/sh"
  },
  {
    "path": "dog-shelters/allDogDescriptions.R",
    "chars": 9753,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(tibble)\nlibrary(googledrive)\n\n# For ke"
  },
  {
    "path": "dog-shelters/dogTravel.R",
    "chars": 2735,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(tibble)\nlibrary(googledrive)\n\n# For ke"
  },
  {
    "path": "dog-shelters/movesByLocation.R",
    "chars": 1867,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(tibble)\nlibrary(googledrive)\n\n# For ke"
  },
  {
    "path": "dog-shelters/movesByLocation.csv",
    "chars": 2366,
    "preview": "\"location\",\"exported\",\"imported\",\"total\",\"inUS\"\n\"Texas\",635,,566,\"true\"\n\"Alabama\",268,2,1428,\"true\"\n\"North Carolina\",158"
  },
  {
    "path": "dress-codes/README.md",
    "chars": 19824,
    "preview": "This folder contains all of the data used in The Pudding article [The Messages Dress Codes are Sending](https://pudding."
  },
  {
    "path": "dress-codes/banned_items.csv",
    "chars": 874945,
    "preview": "\"schoolName\",\"state\",\"item\",\"type\",\"prohibited\"\n\"RUSK H S\",\"TX\",\"pillows\",\"accessories\",\"none\"\n\"RUSK H S\",\"TX\",\"stuffed "
  },
  {
    "path": "dress-codes/body_by_school.R",
    "chars": 3467,
    "preview": "# Importing libraries\n\n# For file structures\nlibrary(here)\n\n# For tidying data\nlibrary(tidyverse)\nlibrary(tools)\n\n# Impo"
  },
  {
    "path": "dress-codes/body_by_school.json",
    "chars": 86909,
    "preview": "[\n  {\n    \"schoolName\": \"Hicksville High School\",\n    \"state\": \"NY\",\n    \"countGroup\": \"1500+\",\n    \"localeGroup\": \"subu"
  },
  {
    "path": "dress-codes/body_percentages.R",
    "chars": 1503,
    "preview": "# Importing libraries\n\n# For file structures\nlibrary(here)\n\n# For tidying data\nlibrary(tidyverse)\n\n# Importing Data\n# As"
  },
  {
    "path": "dress-codes/body_percentages.csv",
    "chars": 176,
    "preview": "\"\",\"item\",\"n\",\"per\"\n\"1\",\"midsection midriff\",340,70\n\"2\",\"cleavage\",106,22\n\"3\",\"back\",74,15\n\"4\",\"breasts chest\",69,14\n\"5\""
  },
  {
    "path": "dress-codes/clothesDetails.csv",
    "chars": 2088,
    "preview": "type,item,market,reveal_body,slug\r\nlength,short shorts,f,y,short* shorts\r\nlength,short skirts,f,y,short* skirt\r\nundergar"
  },
  {
    "path": "dress-codes/clothes_percentages.R",
    "chars": 2766,
    "preview": "# Importing libraries\n\n# For file structures\nlibrary(here)\n\n# For tidying data\nlibrary(tidyverse)\n\n# Importing Data\n# As"
  },
  {
    "path": "dress-codes/clothes_percentages.csv",
    "chars": 1364,
    "preview": "\"slug\",\"market\",\"reveal_body\",\"n\",\"per\",\"group\"\n\"short* shorts\",\"f\",\"y\",334,69,60\n\"visible underwear\",\"n\",\"y\",332,69,60\n"
  },
  {
    "path": "dress-codes/full_text.csv",
    "chars": 1337821,
    "preview": "\"schoolName\",\"state\",\"link\",\"text\"\n\"HICKSVILLE HIGH SCHOOL\",\"NY\",\"https://www.hicksvillepublicschools.org/parents/code_o"
  },
  {
    "path": "dress-codes/length_restrictions.csv",
    "chars": 55116,
    "preview": "School.Name,School.State.Abbreviation,limits,length,inches\r\nRUSK H S,TX,dresses,top of the kneecap,\r\nRUSK H S,TX,skirts,"
  },
  {
    "path": "dress-codes/sanctions.csv",
    "chars": 82795,
    "preview": "\"schoolName\",\"state\",\"sanction\",\"offense\"\n\"JULIAN HIGH\",\"CA\",\"attend Saturday school\",\"3rd\"\n\"CARROLLTON HIGH SCHOOL\",\"GA"
  },
  {
    "path": "dress-codes/school_metadata.csv",
    "chars": 24350,
    "preview": "\"schoolName\",\"stateAbb\",\"locale\",\"totalStudents\"\n\"HICKSVILLE HIGH SCHOOL\",\"NY \",\"21-Suburb: Large\",1754\n\"RUSK H S\",\"TX \""
  },
  {
    "path": "dress-codes/strap_restrictions.csv",
    "chars": 6946,
    "preview": "\"School.Name\",\"School.State.Abbreviation\",\"limits\",\"number\"\n\"RUSK H S\",\"TX\",\"to the edge of the shoulder\",NA\n\"MAY-PORT C"
  },
  {
    "path": "dress-codes/words_percentages.R",
    "chars": 1701,
    "preview": "# Importing libraries\n\n# For file structures\nlibrary(here)\n\n# For tidying data\nlibrary(tidyverse)\n\n# Importing Data\n# As"
  },
  {
    "path": "dress-codes/words_percentages.csv",
    "chars": 390,
    "preview": "\"item\",\"n\",\"percent\",\"display\"\n\"disruption/distraction\",367,76,\"Distract or Disrupt\"\n\"appropriate/inappropriate\",330,68,"
  },
  {
    "path": "filmordigital/README.md",
    "chars": 5592,
    "preview": "This folder contains all of the data used in The Pudding essay [Film or Digital: Breaking Down Hollywood's Choice of Sho"
  },
  {
    "path": "filmordigital/top_directors_data.csv",
    "chars": 629636,
    "preview": "production_year,id,title,director,director_id,co_directors,co_directors_id,genres,cameras,negative_format,film_type\r\n20"
  },
  {
    "path": "filmordigital/top_directors_data_processing.ipynb",
    "chars": 11460,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Top Directors Data Processing\\n\","
  },
  {
    "path": "filmordigital/top_movies_data.csv",
    "chars": 234229,
    "preview": "production_year,id,title,directors,genres,camera_format,negative_format,budget,budget_source,film_type\r\n2006,4103791,Pi"
  },
  {
    "path": "filmordigital/top_movies_data_processing.ipynb",
    "chars": 13646,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Top Movies Data Processing\\n\",\n  "
  },
  {
    "path": "foundation-names/README.md",
    "chars": 29706,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [The Naked Truth](https://pudding.cool/2021/03/foundatio"
  },
  {
    "path": "foundation-names/allCategories.R",
    "chars": 1345,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(jsonlite)\nlibrary(stringr)\nlibrary(goo"
  },
  {
    "path": "foundation-names/allCategories.csv",
    "chars": 1290110,
    "preview": "brand,product,url,imgSrc,name,categories,specific,hex,lightness\nBECCA Cosmetics,Ultimate Coverage 24 Hour Foundation,htt"
  },
  {
    "path": "foundation-names/allNumbers.R",
    "chars": 2887,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(jsonlite)\nlibrary(stringr)\nlibrary(goo"
  },
  {
    "path": "foundation-names/allNumbers.csv",
    "chars": 318764,
    "preview": "brand,product,name,specific,lightness,hex,lightToDark,numbers,id\nMakeup Revolution,Conceal & Define Full Coverage Founda"
  },
  {
    "path": "foundation-names/allShades.R",
    "chars": 5777,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(jsonlite)\nlibrary(stringr)\nlibrary(goo"
  },
  {
    "path": "foundation-names/allShades.csv",
    "chars": 2332805,
    "preview": "brand,product,url,description,imgSrc,imgAlt,name,specific,colorspace,hex,hue,sat,lightness\nAnastasia Beverly Hills,Lumin"
  },
  {
    "path": "foundation-names/crosswalks/category_crosswalk.csv",
    "chars": 490035,
    "preview": "imgSrc,nameWord,categories\n/productimages/sku/s1775238+sw.jpg,abundant alabaster,gem\nhttps://images.ulta.com/is/image/Ul"
  },
  {
    "path": "foundation-names/crosswalks/sephora_ulta_crosswalk.csv",
    "chars": 4361,
    "preview": "s_brand,s_product,u_brand,u_product\r\nbareMinerals,BAREPRO Longwear Powder Foundation,bareMinerals,BAREPRO Performance We"
  },
  {
    "path": "foundation-names/scrape-sephora.js",
    "chars": 2060,
    "preview": "const {chromium} = require('playwright');\nconst fs = require('fs')\n\nconst results = []\n\nasync function getColorSwatches("
  },
  {
    "path": "foundation-names/scrape-ulta.js",
    "chars": 2275,
    "preview": "const {chromium} = require('playwright');\nconst fs = require('fs')\n\nconst results = []\n\nasync function getColorSwatches("
  },
  {
    "path": "foundation-names/sephora.R",
    "chars": 2879,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(jsonlite)\nlibrary(stringr)\nlibrary(goo"
  },
  {
    "path": "foundation-names/sephora.csv",
    "chars": 1321461,
    "preview": "\"brand\",\"product\",\"url\",\"description\",\"imgSrc\",\"imgAlt\",\"name\",\"specific\"\n\"FENTY BEAUTY by Rihanna\",\"Pro Filt'r Soft Mat"
  },
  {
    "path": "foundation-names/ulta.R",
    "chars": 3719,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\nlibrary(jsonlite)\nlibrary(stringr)\nlibrary(goo"
  },
  {
    "path": "foundation-names/ulta.csv",
    "chars": 1105015,
    "preview": "brand,product,url,description,imgSrc,imgAlt,name,specific\nCoverGirl,TruBlend Matte Made Liquid Foundation,https://www.ul"
  },
  {
    "path": "gayborhoods/README.md",
    "chars": 7791,
    "preview": "This folder contains all of the data used in The Pudding article [Men are from Chelsea, Women are from Park Slope: How “"
  },
  {
    "path": "gayborhoods/data.csv",
    "chars": 432311,
    "preview": "GEOID10,Tax_Mjoint,Mjoint_MF,Mjoint_SS,Mjoint_FF,Mjoint_MM,TaxRate_SS,TaxRate_FF,TaxRate_MM,Cns_TotHH,Cns_UPSS,Cns_UPFF"
  },
  {
    "path": "hype/README.md",
    "chars": 21879,
    "preview": "This folder contains all of the data used in The Pudding article [How many high school stars make it to the NBA](https:/"
  },
  {
    "path": "hype/paths.R",
    "chars": 4199,
    "preview": "# Importing libraries\n\n# For file structures\nlibrary(here)\n\n# For tidying data\nlibrary(tidyverse)\n\n# Importing Data\n# As"
  },
  {
    "path": "hype/paths.csv",
    "chars": 239634,
    "preview": "\"name\",\"college\",\"link\",\"smallMult\",\"rank\",\"draft_year\",\"draft_rd\",\"draft_pk\",\"recruit_year\",\"avgRank\",\"top\",\"highSchool"
  },
  {
    "path": "hype/players.csv",
    "chars": 354316,
    "preview": "\"name\",\"link\",\"rank\",\"draft_year\",\"draft_rd\",\"draft_pk\",\"college\",\"recruit_year\",\"bbrID\",\"pick_overall\",\"pick_number\",\"p"
  },
  {
    "path": "kidz-bop/KB_censored-lyrics.csv",
    "chars": 176341,
    "preview": "ogArtist,songName,badword,count,category,year,isCensored,isPresent,ogLyric,kbLyric\r\nAriana Grande,7 rings,bitch,2,profan"
  },
  {
    "path": "kidz-bop/KB_group-overiew.csv",
    "chars": 251,
    "preview": "\"category\",\"inSongs\",\"censored\",\"pctCensored\"\n\"alcohol & drugs\",301,171,56.8106312292359\n\"identity\",96,45,46.875\n\"other\""
  },
  {
    "path": "kidz-bop/KB_proportions.csv",
    "chars": 1575,
    "preview": "\"year\",\"alcohol\",\"sexual\",\"profanity\",\"identity\",\"other\",\"violence\"\n2001,0,2.5,0,2.5,0,0\n2002,0,11.4285714285714,5.71428"
  },
  {
    "path": "kidz-bop/KB_word-overview.csv",
    "chars": 7011,
    "preview": "\"category\",\"badword\",\"inSongs\",\"censored\",\"pctCensored\"\n\"alcohol & drugs\",\"addict\",8,4,50\n\"alcohol & drugs\",\"alcohol\",0,"
  },
  {
    "path": "kidz-bop/README.md",
    "chars": 7379,
    "preview": "This folder contains the primary dataset used in The Pudding article [\"Just how does Kidz Bop censor songs?\"](https://pu"
  },
  {
    "path": "laugh/README.md",
    "chars": 1859,
    "preview": "This folder contains all of the data used in The Pudding essay Laughing OnLine published in October 2019.\n\nThe data will"
  },
  {
    "path": "laugh/reddit-laughs.csv",
    "chars": 13720,
    "preview": "id,family,description,count_2009,share_2009,count_2010,share_2010,count_2011,share_2011,count_2012,share_2012,count_2013"
  },
  {
    "path": "makeup-shades/README.md",
    "chars": 6381,
    "preview": "This folder contains all of the data used in The Pudding essay [Beauty Brawl](https://pudding.cool/2018/06/makeup-shades"
  },
  {
    "path": "makeup-shades/shades.csv",
    "chars": 39723,
    "preview": "\"brand\",\"brand_short\",\"product\",\"product_short\",\"hex\",\"H\",\"S\",\"V\",\"L\",\"group\"\n\"Maybelline\",\"mb\",\"Fit Me\",\"fmf\",\"f3cfb3\","
  },
  {
    "path": "mars-weather/README.md",
    "chars": 7347,
    "preview": "This folder contains all of the data used in The Pudding essay [Greetings from Mars](https://pudding.cool/2018/01/mars-w"
  },
  {
    "path": "mars-weather/mars-weather.csv",
    "chars": 100757,
    "preview": "id,terrestrial_date,sol,ls,month,min_temp,max_temp,pressure,wind_speed,atmo_opacity\n1895,2018-02-27,1977,135,Month 5,-77"
  },
  {
    "path": "names-in-songs/README.md",
    "chars": 24041,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [Sing My Name](https://pudding.cool/2019/05/names-in-son"
  },
  {
    "path": "names-in-songs/allNames.R",
    "chars": 3439,
    "preview": "##### Code used to analyze song lyrics looking for names. Due to copyright issues, we can't release the original song ly"
  },
  {
    "path": "names-in-songs/allNames.csv",
    "chars": 1980405,
    "preview": "\"artist\",\"song\",\"sentence\",\"highestRank\",\"year\",\"nonPerson\",\"name\"\n\"Metro Boomin Featuring 21 Savage\",\"10 Freaky Girls\","
  },
  {
    "path": "names-in-songs/letters.R",
    "chars": 2895,
    "preview": "library(tidyverse)\n\n# accessing data from github repo\ndata <- read.csv(\"https://raw.githubusercontent.com/the-pudding/da"
  },
  {
    "path": "names-in-songs/letters.csv",
    "chars": 3563,
    "preview": "\"letter\",\"dif\",\"position\",\"person\"\n\"A\",-1.68670685137322,\"first\",TRUE\n\"B\",2.12662206998936,\"first\",TRUE\n\"C\",0.6647692211"
  },
  {
    "path": "names-in-songs/onlyNames.csv",
    "chars": 53285,
    "preview": "\"name\",\"count\"\n\"Aaliyah\",69917\n\"Aaron\",557843\n\"Abagail\",5368\n\"Abbey\",16773\n\"Abbie\",21197\n\"Abbigail\",10804\n\"Abby\",55582\n\""
  },
  {
    "path": "names-in-songs/repeats.R",
    "chars": 628,
    "preview": "library(tidyverse)\n\n# accessing data from github repo\ndata <- read.csv(\"https://raw.githubusercontent.com/the-pudding/da"
  },
  {
    "path": "names-in-songs/repeats.csv",
    "chars": 309705,
    "preview": "\"artist\",\"song\",\"person\",\"name\",\"n\"\n\"Tyga Featuring Cedric Gervais, Wiz Khalifa & Mally Mall\",\"Molly\",FALSE,\"Molly\",113\n"
  },
  {
    "path": "names-in-songs/timeless_names.R",
    "chars": 1607,
    "preview": "library(tidyverse)\n\n# accessing data from github repo\ndata <- read.csv(\"https://raw.githubusercontent.com/the-pudding/da"
  },
  {
    "path": "names-in-songs/timeless_names.csv",
    "chars": 2800,
    "preview": "\"decade\",\"name\",\"n\",\"rank\",\"person\"\n2010,\"Baby\",521,1,TRUE\n2000,\"Baby\",413,1,TRUE\n1990,\"Baby\",273,1,TRUE\n1980,\"Baby\",230"
  },
  {
    "path": "names-in-songs/unique.R",
    "chars": 835,
    "preview": "library(tidyverse)\n\n# accessing data from github repo\ndata <- read.csv(\"https://raw.githubusercontent.com/the-pudding/da"
  },
  {
    "path": "names-in-songs/unique.csv",
    "chars": 993056,
    "preview": "\"artist\",\"name\",\"song\",\"person\",\"sentence\",\"year\",\"highestRank\"\n\"Metro Boomin Featuring 21 Savage\",\"Harriet\",\"10 Freaky "
  },
  {
    "path": "names-in-songs/unique_by_artist.R",
    "chars": 1720,
    "preview": "library(tidyverse)\n\n# accessing data from github repo\ndata <- read.csv(\"https://raw.githubusercontent.com/the-pudding/da"
  },
  {
    "path": "names-in-songs/unique_by_artist.csv",
    "chars": 339349,
    "preview": "\"artist\",\"person\",\"name\",\"names\",\"songs\"\n\"10,000 Maniacs\",FALSE,\"May\",1,2\n\"10,000 Maniacs\",FALSE,\"Morgan\",1,2\n\"10cc\",FAL"
  },
  {
    "path": "nba-unexpected/README.md",
    "chars": 1960,
    "preview": "This folder contains the processed data for the story The Greatest Unexpected NBA Performances published in February 202"
  },
  {
    "path": "nba-unexpected/nba.csv",
    "chars": 169411,
    "preview": "bbrID,Date,Tm,Opp,TRB,AST,STL,BLK,PTS,GmSc,Season,Playoffs,Year,GameIndex,GmScMovingZ,GmScMovingZTop2Delta,Date2,GmSc2,G"
  },
  {
    "path": "nba-unexpected/wnba.csv",
    "chars": 56887,
    "preview": "bbrID,Date,Tm,Opp,TRB,AST,STL,BLK,PTS,GmSc,Year,Playoffs,GameIndex,GmScMovingZ,GmScMovingZTop2Delta,Date2,GmSc2,GmScMovi"
  },
  {
    "path": "neighborhoods/README.md",
    "chars": 3895,
    "preview": "This folder contains all of the data used in The Pudding essay [A Tale of Two Cities](https://pudding.cool/2018/03/neigh"
  },
  {
    "path": "neighborhoods/top5_NewYorkCity.csv",
    "chars": 105281,
    "preview": "\"neighborhood\",\"yelpAlias\",\"yelpTitle\",\"nCount\",\"neighborhoodTotal\",\"cCount\",\"cityTotal\",\"incidence\",\"rank\"\n\"Annadale\",\""
  },
  {
    "path": "neighborhoods/top5_Seattle.csv",
    "chars": 35405,
    "preview": "\"neighborhood\",\"yelpAlias\",\"yelpTitle\",\"nCount\",\"neighborhoodTotal\",\"cCount\",\"cityTotal\",\"incidence\",\"rank\"\n\"Admiral\",\"t"
  },
  {
    "path": "one-hit-wonders/README.md",
    "chars": 3069,
    "preview": "This folder contains all of the data used in The Pudding article [One-Hit Wonders in Sports](https://pudding.cool/2018/0"
  },
  {
    "path": "one-hit-wonders/data.csv",
    "chars": 1255627,
    "preview": "id,name,year,year_index,total_players,peak_year_index,rank,dnp,sport_name,league,stat_prop,stat_val,played_prop,played_v"
  },
  {
    "path": "people-map/README.md",
    "chars": 1355,
    "preview": "This folder contains all of the data used in The Pudding essay A People Map of the US published in May 2019.\n\nThe data w"
  },
  {
    "path": "people-map/people-map.csv",
    "chars": 2606653,
    "preview": "name,city,neighborhood,place,views_median,views_sum,name_clean,lat,lng,extract,state\nDonald Trump,Bedminster,,Bedminster"
  },
  {
    "path": "people-map-uk/README.md",
    "chars": 1259,
    "preview": "This folder contains all of the data used in The Pudding essay A People Map of the UK published in June 2019.\n\nThe data "
  },
  {
    "path": "people-map-uk/people-map-uk.csv",
    "chars": 722239,
    "preview": "name_clean,city_clean,link,country,city,views_median,views_sum,lat,lng,extract\n21 Savage,Plaistow,21_Savage,England,\"Pla"
  },
  {
    "path": "pockets/README.md",
    "chars": 8845,
    "preview": "This folder contains all of the data used in The Pudding article [Women's Pockets are Inferior](https://pudding.cool/201"
  },
  {
    "path": "pockets/measurementRectangles.json",
    "chars": 198988,
    "preview": "[{\"brand\":\"7 for All Mankind\",\"style\":\"straight\",\"menWomen\":\"men\",\"name\":\"The Straight\",\"fabric\":\"98% cotton, 2% spandex"
  },
  {
    "path": "pockets/measurements.csv",
    "chars": 9793,
    "preview": "brand,style,menWomen,name,fabric,price,maxHeightFront,minHeightFront,rivetHeightFront,maxWidthFront,minWidthFront,maxHei"
  },
  {
    "path": "queues/README.md",
    "chars": 18767,
    "preview": "# The story behind \"Tired of waiting in line?\"\n###### _by Mureji Fatunde_\n\n[Watch the video](https://youtu.be/2r3gElTiLi"
  },
  {
    "path": "rain/README.md",
    "chars": 12876,
    "preview": "This folder contains all of the data used in The Pudding essay [Where will you need your umbrella?](https://pudding.cool"
  },
  {
    "path": "rain/annual_precipitation.R",
    "chars": 5481,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(readr)\nlibrary(lubridate)\n\n# For keeping your files "
  },
  {
    "path": "rain/annual_precipitation.csv",
    "chars": 42817,
    "preview": "id,city,station,average,latitude,longitude,state,total19\r\nUSW00021504,Hilo,HILO INTL AP,112.9,19.7192,-155.0531,HI,100.8"
  },
  {
    "path": "rain/daily_precipitation.R",
    "chars": 4225,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(readr)\nlibrary(lubridate)\n\n# For keeping your files "
  },
  {
    "path": "random/README.md",
    "chars": 1547,
    "preview": "This folder contains the raw data for the story We think this cool study we found is flawed. Help us reproduce it. Publi"
  },
  {
    "path": "random/trials.csv",
    "chars": 2361006,
    "preview": "id,age,toss,roll,spot\r\n56,35,101100010001,0514231425,0845274341\r\n58,34,011010110110,0423154215,0413768542\r\n59,37,0111010"
  },
  {
    "path": "skate-music/README.md",
    "chars": 4184,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [The Good, the Rad, and the Gnarly](https://pudding.cool"
  },
  {
    "path": "skate-music/soundtrack_data.csv",
    "chars": 25912,
    "preview": "artist,tote,group,genre_fake,year,genre,id\nThe Beatles,46,high,rap,2008,Classic Rock,1\nFugazi,43,high,rap,2008,Punk,2\nTh"
  },
  {
    "path": "skate-music/time_series.tsv",
    "chars": 28798,
    "preview": "genre\ttime\tp\tmaxp\tp_peak\tp_smooth\nClassic Rock\t1990\t0.35714285714285715\t0.39\t0.35714285714285715\t0.35714285714285715\nCla"
  },
  {
    "path": "skate-music/waffle.csv",
    "chars": 7894,
    "preview": "source,value,company\nClassic Rock,53,411\nElectronic,92,411\nHip Hop,223,411\nIndie/Alternative,201,411\nJazz/Soul,78,411\nMe"
  },
  {
    "path": "stand-up/README.md",
    "chars": 2730,
    "preview": "This folder contains all of the data used in The Pudding essay [The Structure of Stand-Up Comedy](https://pudding.cool/2"
  },
  {
    "path": "stand-up/ali-wong--captions.csv",
    "chars": 79232,
    "preview": "start,stop,caption,laugh,group,timeStart,timeStop\n0:00:28,0:00:32,Hi. Hello! Welcome! Thank you! ,0,0-intro,28,32\n0:00:3"
  },
  {
    "path": "stand-up/ali-wong--topics.csv",
    "chars": 4657,
    "preview": "callback,level,group,end,timeStart,totalStop,index,topicEnd\n,1,0-intro,,28,49,0,49\n,1,6-getting older,,49,62,1,410\n,2,10"
  },
  {
    "path": "summer-reading/README.md",
    "chars": 16694,
    "preview": "\nThis folder contains all of the data used in The Pudding essay [Hipster Summer Reading List](https://pudding.cool/2019/"
  },
  {
    "path": "summer-reading/hipster.R",
    "chars": 7489,
    "preview": "# For general data cleaning and analysis\nlibrary(tidyverse)\nlibrary(glue)\n# Because a newer version of tidyr needed\nlibr"
  },
  {
    "path": "summer-reading/hipster.csv",
    "chars": 58262,
    "preview": "\"Title\",\"Author\",\"AuthorMore\",\"Remove\",\"Pages\",\"WorldCatLink\",\"GoodreadsLink\",\"GoodreadsRating\",\"GoodreadsReviews\",\"PubY"
  },
  {
    "path": "three-seconds/README.md",
    "chars": 1132,
    "preview": "This folder contains all of the data used in The Pudding essay The NBA Has a Defensive Three Seconds Problem published i"
  },
  {
    "path": "three-seconds/three-seconds.csv",
    "chars": 148816,
    "preview": "gameid,quarter,clock,season,season.type,description\r\n21600001,1,4:25,2016-17,Regular Season,[NYK] O'Quinn Foul: Defense "
  },
  {
    "path": "titletowns/README.md",
    "chars": 7392,
    "preview": "This folder contains all of the data used in The Pudding article [The Winningest Cities in North American Sports](https:"
  },
  {
    "path": "titletowns/case1.json",
    "chars": 126093,
    "preview": "[{\"key\":\"Green Bay, WI\",\"values\":[{\"year\":1929,\"team\":\"Green Bay Packers\",\"sport\":\"nfl\"},{\"year\":1930,\"team\":\"Green Bay "
  },
  {
    "path": "titletowns/case2.json",
    "chars": 6053354,
    "preview": "[{\"metro\":\"Green Bay, WI\",\"seasons\":[{\"season\":1922,\"teams\":[{\"team\":\"Green Bay Packers\",\"sport\":\"nfl\",\"result\":\"season\""
  },
  {
    "path": "titletowns/metros.json",
    "chars": 797772,
    "preview": "[{\"metro\":\"Green Bay, WI\",\"population\":320050,\"seasonArray\":[1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933"
  },
  {
    "path": "titletowns/titles.csv",
    "chars": 143452,
    "preview": "index,year,level,sport,winner,winner_metro,runner_up,runner_up_metro,final_four3,final_four3_metro,final_four4,final_fou"
  },
  {
    "path": "vogue/README.md",
    "chars": 3060,
    "preview": "This folder contains all of the data used in The Pudding essay Colorism in High Fashion published in April 2019.\r\n\r\nThe "
  },
  {
    "path": "vogue/faces.csv",
    "chars": 11641,
    "preview": "date,model,tone,l\r\n1/1/2018,Lupita Nyongo,#402C2C,0.212745098\r\n10/1/2015,Lupita Nyongo,#58342B,0.257422969\r\n3/1/2009,Mic"
  },
  {
    "path": "vogue/models.csv",
    "chars": 4549,
    "preview": "model,l,tone,n_covers\r\nAdele,0.796199095,#E3C1B2,2\r\nAdwoa Aboah,0.486862745,#BA673E,1\r\nAlicia Vikander,0.75630375,#E8B39"
  },
  {
    "path": "winning-the-internet/README.md",
    "chars": 1251,
    "preview": "This folder contains a snapshot of the raw data used in The Pudding newsletter Winning the Internet published in July 20"
  },
  {
    "path": "women-in-headlines/country_time_freqrank.csv",
    "chars": 606327,
    "preview": ",Unnamed: 0,year,country,word,frequency,count,freq_prop_headlines,word_len,freq_rank,hfreq_rank,theme\n12,277,2010,India,"
  },
  {
    "path": "women-in-headlines/headlines_reduced_bubble.csv",
    "chars": 933503,
    "preview": ",headline_no_site,site,time,country,bias\n2447,R2m spent to make house fit for a woman   Gauteng,iol.co.za,2010-09-21 07:"
  },
  {
    "path": "women-in-headlines/headlines_reduced_temporal.csv",
    "chars": 286303,
    "preview": ",headline_no_site,site,time,country,bias,year\n252454,‘Cashed up’ Mother Teresa kept Vatican Bank afloat – journalist,rt."
  },
  {
    "path": "women-in-headlines/headlines_site.csv",
    "chars": 20000,
    "preview": ",site,bias,polarity,country_of_pub,monthly_visits,polarity_base,polarity_delta\n0,dailymail.co.uk,0.9999999999999999,0.67"
  },
  {
    "path": "women-in-headlines/polarity_comparison_country_time.csv",
    "chars": 2751,
    "preview": ",country,year,women_polarity_mean,all_polarity_mean,women_polarity_median,all_polarity_median\n0,India,2010,0.27752437137"
  },
  {
    "path": "women-in-headlines/polarity_comparison_site_country_time.csv",
    "chars": 12929,
    "preview": ",site,country_of_pub,polarity_base,polarity_women,difference,site_clean,popularity\n33,dailysun.co.za,South Africa,0,0.51"
  },
  {
    "path": "women-in-headlines/readme.md",
    "chars": 2821,
    "preview": "\n**Source(s) and Methodology:** Headlines tagged with the keywords  \"women OR woman OR girl OR female OR lady OR ladies "
  },
  {
    "path": "women-in-headlines/word_country_freq.csv",
    "chars": 8305,
    "preview": ",country,abortion,abuse,accident,accuse,act,actor,actress,admit,africa,african,age,album,alive,allege,allegedly,allow,am"
  },
  {
    "path": "women-in-headlines/word_dictionaries.json",
    "chars": 13924,
    "preview": "{\"female_bias_words\": [\"affection\", \"flatterable\", \"moody\", \"chatty\", \"tenderness\", \"maid\", \"feel\", \"birth\", \"bride\", \"c"
  },
  {
    "path": "women-in-headlines/word_themes.csv",
    "chars": 38221,
    "preview": ",word,theme\n26,abandon,No theme\n35,abduct,crime and violence\n62,abortion,empowerment\n79,abuse,crime and violence\n99,acci"
  },
  {
    "path": "women-in-headlines/word_themes_freq.csv",
    "chars": 3577,
    "preview": "theme,abuse,accuse,act,actress,admit,age,allege,allegedly,american,arrest,artist,assault,attack,award,baby,bad,ban,battl"
  },
  {
    "path": "women-in-headlines/word_themes_rank.csv",
    "chars": 6730,
    "preview": ",word,theme,rank,count\n1104,horror,crime and violence,41.0,903\n291,breast,female stereotypes,31.0,904\n1731,prince,No the"
  }
]

// ... and 9 more files (download for full content)

About this extraction

This page contains the full source code of the the-pudding/data GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 176 files (339.3 MB), approximately 9.2M tokens, and a symbol index with 6 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!