Outline

  • Homework
  • RMarkdown syntax
  • R Notebook formatting
  • NYC Open Data
  • In-class exercise



Homework Questions


R Notebook example: Unemployment in New Jersey

Who else wants to share their RNotebook?




R Notebook display options

As you have noticed, you don’t always want to display the output from your code. You can define how your code displays using chunk options in 2 ways:

  • globally: defines the default for every code chunk
  • by chunk: defines the display options for the chunk only

The most common chunk options are:

  • include = FALSE prevents code and results from appearing in the finished file. R Markdown still runs the code in the chunk, and the results can be used by other chunks.
  • echo = FALSE prevents code, but not the results from appearing in the finished file. This is a useful way to embed figures.
  • message = FALSE prevents messages that are generated by code from appearing in the finished file.
  • warning = FALSE prevents warnings that are generated by code from appearing in the finished.
  • fig.cap = "..." adds a caption to graphical results.

See the R Markdown Reference Guide for a complete list of knitr chunk options.

global display options

At the top of your R Notebook, under the title insert a code chunk with global options using the knitr::opts_chunk$setparameter. These will define the default display options for all code chunks in the Notebook. For example, the following :


  • names the chunk “setup”

  • uses include=FALSE : do not display this code chunk in the output

  • echo = T : defines global default to show the code chunk

  • quietly = T : defines global default to suppress messages

  • message = F : defines global default to suppress messages (different and more robust method)

This code chunk should be alone - it should not include any other code


code chunk display options

To change those global display options for one code chunk (like load_acs which is very noisy), add any chunk options within the {r} of your code chunk. For example, to display the output, but the not the code for a code chunk:


This chunk displays the following formatted table using the knitr package, but doesn’t display the code.

YAML

You can also add define pre-designed themes, add table of contents, and much more in the title section called the yaml (Yet Another Markup Language = stupid coding joke). The formatting is very finicky, when you are following an example make it look EXACTLY the same. It is complicated but we’ll learn a few.

See this chapter for more details on adjusting the html document in the title section.


  • Theme

    • add styles with pre-packaged themes
    • this notebook uses yeti, see here for more
  • Table of Contents

    • toc: true: create a table of contents _ toc_depth: 3: create entries in the Table of Contents for Header 3 and higher
    • toc_float: true: toc sticks to the side so you can always see it



NYC Open Data

NYC Open Data is free public data published by New York City agencies and other partners.

https://opendata.cityofnewyork.us/


There is a vast amount of data. You can download data from NYC Open Data, or use the RSocrata to import the data directly into R.

We’ll use an example from Boyan Kostadinov at City Tech.

In-class exercise:

The goal of this activity is to explore the 2021 DOE Middle School Directory data from the New York City Open Data Portal. This activity is an introduction to exploratory data analysis and visualizations using R and RStudio.

Install three new packages:

  • RSocrata: for loading the data from NYC Open Data
  • knitr: for printing tables
  • DT: for interactive tables in html format

Create a new R Notebook

  • name it nyc_middle_schools.Rmd
  • save it in part2/scripts
  • load the tidyverse and the three new packages

Import middle school data

  • Go to the NYC Open Data Portal
  • Find the 2021 DOE Middle School Directory data
    • We can use the RSocrata package to load the data in the CSV format, directly from the API tab in the NYC Open Data Portal, using the unique identifier f6s7-vytj for the data.
    • Find the link for the data by clicking on the API button, and copying the link for the CSV version of the data

library(tidyverse)
library(RSocrata)
library(knitr)
library(DT)

# import the data directly into RStudio using url path
data <- read.socrata("https://data.cityofnewyork.us/resource/f6s7-vytj.csv")
## Warning in
## read.socrata("https://data.cityofnewyork.us/resource/f6s7-vytj.csv"): Dates and
## currency fields will be converted to character

Explore and process the data

Follow the instructions in Kostadinov’s R Notebook to select columns, and create summary statistics of the number of math professors, and correct some missing values.

Use this dataset to test out different ways to style and format an R Notebook

Create an R Notebook to share

  • Create a new R Notebook to share your middle school math teacher analysis.

    • Define global display options
    • Define display options for at least one code chunk
    • Use the kable or datatable functions to create formatted tables

Asssignment 12a: NYC Open Data analysis

Explore NYC Open Data to see what data is available. Select a dataset to import via R Socrata and answer a research question about New York City or related to your final project. Create a R Notebook to share your analysis. Include:

  • Define global display options
  • Define display options for at least one code chunk
  • Use the kable or datatable functions to create at least one formatted tables
  • Create at least one plot or map

Some suggestions:

  • Active Tobacco Retailer Dealer Licenses:
    • import this dataset of all tobacco licenses in New York City
    • summarize by Borough or Neighborhood Tabulation Area to see how many tobacco licenses were granted in Corona vs other neighborhoods in the last year
  • Motor Vehicle Collisions - Crashes
    • import the dataset of all crashes in NYC
    • summarize by Borough or Zip Code to see how many crashes occurred in one neighbohood vs other neighborhoods in the last year
    • filter the crashes in the Zip codes in your chosen neighborhood and use the Lat/Long to create a map of the crash locations in one neighbohood (hint: use st_as_sf())

Add the link to 2 Notebooks on CANVAS: for your in-class assignment and for this analysis.



LS0tCnRpdGxlOiAiUiBOb3RlYm9va3MgJiBOWUMgT3BlbiBEYXRhIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB5ZXRpCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVCwKICAgICAgICAgICAgICAgICAgICAgIHF1aWV0bHkgPSBULAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEYpCmBgYAoKIyMgT3V0bGluZQoKLSAgIEhvbWV3b3JrCi0gICBSTWFya2Rvd24gc3ludGF4Ci0gICBSIE5vdGVib29rIGZvcm1hdHRpbmcKLSAgIE5ZQyBPcGVuIERhdGEKLSAgIEluLWNsYXNzIGV4ZXJjaXNlCgo8L2JyPgo8L2JyPgoKIyMgSG9tZXdvcmsgUXVlc3Rpb25zCgo8L2JyPgoKUiBOb3RlYm9vayBleGFtcGxlOiBbVW5lbXBsb3ltZW50IGluIE5ldyBKZXJzZXldKGh0dHBzOi8vcnB1YnMuY29tL3NwYXRpYWxjb2xsZWN0aW9ucy9uai11bmVtcGxveW1lbnQpe3RhcmdldD0iX2JsYW5rIn0KCgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpwdXJwbGUiPldobyBlbHNlIHdhbnRzIHRvIHNoYXJlIHRoZWlyIFJOb3RlYm9vaz88L3NwYW4+Cgo8L2JyPgo8L2JyPjwvYnI+CgojIyBSIE5vdGVib29rIGRpc3BsYXkgb3B0aW9ucwoKQXMgeW91IGhhdmUgbm90aWNlZCwgeW91IGRvbid0IGFsd2F5cyB3YW50IHRvIGRpc3BsYXkgdGhlIG91dHB1dCBmcm9tIHlvdXIgY29kZS4gWW91IGNhbiBkZWZpbmUgaG93IHlvdXIgY29kZSBkaXNwbGF5cyB1c2luZyBjaHVuayBvcHRpb25zIGluIDIgd2F5czoKCi0gICAqZ2xvYmFsbHkqOiBkZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBldmVyeSBjb2RlIGNodW5rCi0gICAqYnkgY2h1bmsqOiBkZWZpbmVzIHRoZSBkaXNwbGF5IG9wdGlvbnMgZm9yIHRoZSBjaHVuayBvbmx5CgpUaGUgbW9zdCBjb21tb24gY2h1bmsgb3B0aW9ucyBhcmU6CgotICAgYGluY2x1ZGUgPSBGQUxTRWAgcHJldmVudHMgY29kZSBhbmQgcmVzdWx0cyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgZmluaXNoZWQgZmlsZS4gUiBNYXJrZG93biBzdGlsbCBydW5zIHRoZSBjb2RlIGluIHRoZSBjaHVuaywgYW5kIHRoZSByZXN1bHRzIGNhbiBiZSB1c2VkIGJ5IG90aGVyIGNodW5rcy4KLSAgIGBlY2hvID0gRkFMU0VgIHByZXZlbnRzIGNvZGUsIGJ1dCBub3QgdGhlIHJlc3VsdHMgZnJvbSBhcHBlYXJpbmcgaW4gdGhlIGZpbmlzaGVkIGZpbGUuIFRoaXMgaXMgYSB1c2VmdWwgd2F5IHRvIGVtYmVkIGZpZ3VyZXMuCi0gICBgbWVzc2FnZSA9IEZBTFNFYCBwcmV2ZW50cyBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgY29kZSBmcm9tIGFwcGVhcmluZyBpbiB0aGUgZmluaXNoZWQgZmlsZS4KLSAgIGB3YXJuaW5nID0gRkFMU0VgIHByZXZlbnRzIHdhcm5pbmdzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBjb2RlIGZyb20gYXBwZWFyaW5nIGluIHRoZSBmaW5pc2hlZC4KLSAgIGBmaWcuY2FwID0gIi4uLiJgIGFkZHMgYSBjYXB0aW9uIHRvIGdyYXBoaWNhbCByZXN1bHRzLgoKU2VlIHRoZSBbUiBNYXJrZG93biBSZWZlcmVuY2UgR3VpZGVdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAzL3JtYXJrZG93bi1yZWZlcmVuY2UucGRmP19nYT0yLjE3MzA2ODE5Ni42NjI4NzU1ODUuMTY2ODM1NzQzOS0yMDk1MDQ5MTkzLjE2MzAyNzQ3MzUpe3RhcmdldD0iX2JsYW5rIn0gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBrbml0ciBjaHVuayBvcHRpb25zLgoKIyMjIGdsb2JhbCBkaXNwbGF5IG9wdGlvbnMKCkF0IHRoZSB0b3Agb2YgeW91ciBSIE5vdGVib29rLCB1bmRlciB0aGUgdGl0bGUgaW5zZXJ0IGEgY29kZSBjaHVuayB3aXRoIGdsb2JhbCBvcHRpb25zIHVzaW5nIHRoZSBga25pdHI6Om9wdHNfY2h1bmskc2V0YHBhcmFtZXRlci4gVGhlc2Ugd2lsbCBkZWZpbmUgdGhlIGRlZmF1bHQgZGlzcGxheSBvcHRpb25zIGZvciBhbGwgY29kZSBjaHVua3MgaW4gdGhlIE5vdGVib29rLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyA6Cgo8YnI+CgohW10oaW1nL2dsb2JhbC5wbmcpIAoKLSBuYW1lcyB0aGUgY2h1bmsgInNldHVwIgoKLSB1c2VzIGBpbmNsdWRlPUZBTFNFYCA6IGRvIG5vdCBkaXNwbGF5IHRoaXMgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0CgotIGBlY2hvID0gVGAgOiBkZWZpbmVzIGdsb2JhbCBkZWZhdWx0IHRvIHNob3cgdGhlIGNvZGUgY2h1bmsKCi0gYHF1aWV0bHkgPSBUYCA6IGRlZmluZXMgZ2xvYmFsIGRlZmF1bHQgdG8gc3VwcHJlc3MgbWVzc2FnZXMKCi0gYG1lc3NhZ2UgPSBGYCA6IGRlZmluZXMgZ2xvYmFsIGRlZmF1bHQgdG8gc3VwcHJlc3MgbWVzc2FnZXMgKGRpZmZlcmVudCBhbmQgbW9yZSByb2J1c3QgbWV0aG9kKQoKVGhpcyBjb2RlIGNodW5rIHNob3VsZCBiZSBhbG9uZSAtIGl0IHNob3VsZCBub3QgaW5jbHVkZSBhbnkgb3RoZXIgY29kZQoKPGJyPgoKIyMjIGNvZGUgY2h1bmsgZGlzcGxheSBvcHRpb25zCgpUbyBjaGFuZ2UgdGhvc2UgZ2xvYmFsIGRpc3BsYXkgb3B0aW9ucyBmb3Igb25lIGNvZGUgY2h1bmsgKGxpa2UgbG9hZF9hY3Mgd2hpY2ggaXMgdmVyeSAqbm9pc3kqKSwgYWRkIGFueSBjaHVuayBvcHRpb25zIHdpdGhpbiB0aGUgYHtyfWAgb2YgeW91ciBjb2RlIGNodW5rLiBGb3IgZXhhbXBsZSwgdG8gZGlzcGxheSB0aGUgb3V0cHV0LCBidXQgdGhlIG5vdCB0aGUgY29kZSBmb3IgYSBjb2RlIGNodW5rOgoKIVtdKGltZy9lY2hvX2ZhbHNlLnBuZykKCjxicj4KClRoaXMgY2h1bmsgZGlzcGxheXMgdGhlIGZvbGxvd2luZyBmb3JtYXR0ZWQgdGFibGUgdXNpbmcgdGhlIGBrbml0cmAgcGFja2FnZSwgYnV0IGRvZXNuJ3QgZGlzcGxheSB0aGUgY29kZS4KCiFbXShpbWcva2FibGVfb3V0cHV0LnBuZykKCiMjIyBZQU1MCgpZb3UgY2FuIGFsc28gYWRkIGRlZmluZSBwcmUtZGVzaWduZWQgdGhlbWVzLCBhZGQgdGFibGUgb2YgY29udGVudHMsIGFuZCBtdWNoIG1vcmUgaW4gdGhlIHRpdGxlIHNlY3Rpb24gY2FsbGVkIHRoZSAqeWFtbCogKFlldCBBbm90aGVyIE1hcmt1cCBMYW5ndWFnZSA9IHN0dXBpZCBjb2Rpbmcgam9rZSkuIFRoZSBmb3JtYXR0aW5nIGlzIHZlcnkgZmluaWNreSwgd2hlbiB5b3UgYXJlIGZvbGxvd2luZyBhbiBleGFtcGxlIG1ha2UgaXQgbG9vayAqKkVYQUNUTFkqKiB0aGUgc2FtZS4gSXQgaXMgY29tcGxpY2F0ZWQgYnV0IHdlJ2xsIGxlYXJuIGEgZmV3LgoKU2VlIFt0aGlzIGNoYXB0ZXJdKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9odG1sLWRvY3VtZW50Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gZm9yIG1vcmUgZGV0YWlscyBvbiBhZGp1c3RpbmcgdGhlIGh0bWwgZG9jdW1lbnQgaW4gdGhlIHRpdGxlIHNlY3Rpb24uCgo8YnI+CgotICAgVGhlbWUKCiAgICAtICAgYWRkIHN0eWxlcyB3aXRoIHByZS1wYWNrYWdlZCB0aGVtZXMKICAgIC0gICB0aGlzIG5vdGVib29rIHVzZXMgeWV0aSwgc2VlIFtoZXJlXShodHRwczovL3d3dy5kYXRhZHJlYW1pbmcub3JnL3Bvc3Qvci1tYXJrZG93bi10aGVtZS1nYWxsZXJ5Lyl7dGFyZ2V0PSJfYmxhbmsifSBmb3IgbW9yZQoKLSAgIFRhYmxlIG9mIENvbnRlbnRzCgogICAgLSAgIGB0b2M6IHRydWVgOiBjcmVhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBcXyBgdG9jX2RlcHRoOiAzYDogY3JlYXRlIGVudHJpZXMgaW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzIGZvciBIZWFkZXIgMyBhbmQgaGlnaGVyCiAgICAtICAgYHRvY19mbG9hdDogdHJ1ZWA6IHRvYyBzdGlja3MgdG8gdGhlIHNpZGUgc28geW91IGNhbiBhbHdheXMgc2VlIGl0CgohW10oaW1nL3lhbWwucG5nKQoKPGJyPiA8YnI+CgojIyBOWUMgT3BlbiBEYXRhCgpOWUMgT3BlbiBEYXRhIGlzIGZyZWUgcHVibGljIGRhdGEgcHVibGlzaGVkIGJ5IE5ldyBZb3JrIENpdHkgYWdlbmNpZXMgYW5kIG90aGVyIHBhcnRuZXJzLgoKW2h0dHBzOi8vb3BlbmRhdGEuY2l0eW9mbmV3eW9yay51cy9dKGh0dHBzOi8vb3BlbmRhdGEuY2l0eW9mbmV3eW9yay51cy8pe3RhcmdldD0iX2JsYW5rIn0KCjxicj4KClRoZXJlIGlzIGEgdmFzdCBhbW91bnQgb2YgZGF0YS4gWW91IGNhbiBkb3dubG9hZCBkYXRhIGZyb20gTllDIE9wZW4gRGF0YSwgb3IgdXNlIHRoZSBgUlNvY3JhdGFgIHRvIGltcG9ydCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIFIuCgpXZSdsbCB1c2UgYW4gW2V4YW1wbGUgZnJvbSBCb3lhbiBLb3N0YWRpbm92XShodHRwczovL3JwdWJzLmNvbS9ia29zdGFkaS9kYXRhX2FuYWx5c2lzX2NpdGUyMDIyKXt0YXJnZXQ9Il9ibGFuayJ9IGF0IENpdHkgVGVjaC4KCiMjIEluLWNsYXNzIGV4ZXJjaXNlOgoKVGhlIGdvYWwgb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBleHBsb3JlIHRoZSBbMjAyMSBET0UgTWlkZGxlIFNjaG9vbCBEaXJlY3RvcnkgZGF0YV0oaHR0cHM6Ly9kYXRhLmNpdHlvZm5ld3lvcmsudXMvRWR1Y2F0aW9uLzIwMjEtRE9FLU1pZGRsZS1TY2hvb2wtRGlyZWN0b3J5L2Y2czctdnl0ail7dGFyZ2V0PSJfYmxhbmsifSBmcm9tIHRoZSBOZXcgWW9yayBDaXR5IE9wZW4gRGF0YSBQb3J0YWwuIFRoaXMgYWN0aXZpdHkgaXMgYW4gaW50cm9kdWN0aW9uIHRvIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgYW5kIHZpc3VhbGl6YXRpb25zIHVzaW5nIFIgYW5kIFJTdHVkaW8uCgojIyMgSW5zdGFsbCB0aHJlZSBuZXcgcGFja2FnZXM6CgotICAgYFJTb2NyYXRhYDogZm9yIGxvYWRpbmcgdGhlIGRhdGEgZnJvbSBOWUMgT3BlbiBEYXRhCi0gICBga25pdHJgOiBmb3IgcHJpbnRpbmcgdGFibGVzCi0gICBgRFRgOiBmb3IgaW50ZXJhY3RpdmUgdGFibGVzIGluIGh0bWwgZm9ybWF0CgojIyMgQ3JlYXRlIGEgbmV3IFIgTm90ZWJvb2sKCi0gICBuYW1lIGl0IGBueWNfbWlkZGxlX3NjaG9vbHMuUm1kYAotICAgc2F2ZSBpdCBpbiBgcGFydDIvc2NyaXB0c2AKLSAgIGxvYWQgdGhlIHRpZHl2ZXJzZSBhbmQgdGhlIHRocmVlIG5ldyBwYWNrYWdlcwoKIyMjIEltcG9ydCBtaWRkbGUgc2Nob29sIGRhdGEKCi0gICBHbyB0byB0aGUgTllDIE9wZW4gRGF0YSBQb3J0YWwKLSAgIEZpbmQgdGhlIFsyMDIxIERPRSBNaWRkbGUgU2Nob29sIERpcmVjdG9yeSBkYXRhXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9FZHVjYXRpb24vMjAyMS1ET0UtTWlkZGxlLVNjaG9vbC1EaXJlY3RvcnkvZjZzNy12eXRqKXt0YXJnZXQ9Il9ibGFuayJ9CiAgICAtICAgV2UgY2FuIHVzZSB0aGUgUlNvY3JhdGEgcGFja2FnZSB0byBsb2FkIHRoZSBkYXRhIGluIHRoZSBDU1YgZm9ybWF0LCBkaXJlY3RseSBmcm9tIHRoZSBBUEkgdGFiIGluIHRoZSBOWUMgT3BlbiBEYXRhIFBvcnRhbCwgdXNpbmcgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGY2czctdnl0aiBmb3IgdGhlIGRhdGEuCiAgICAtICAgRmluZCB0aGUgbGluayBmb3IgdGhlIGRhdGEgYnkgY2xpY2tpbmcgb24gdGhlIEFQSSBidXR0b24sIGFuZCBjb3B5aW5nIHRoZSBsaW5rIGZvciB0aGUgQ1NWIHZlcnNpb24gb2YgdGhlIGRhdGEKCiFbXShpbWcvbWlkZGxlX3NjaG9vbC5wbmcpCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUlNvY3JhdGEpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpCgojIGltcG9ydCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIFJTdHVkaW8gdXNpbmcgdXJsIHBhdGgKZGF0YSA8LSByZWFkLnNvY3JhdGEoImh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL3Jlc291cmNlL2Y2czctdnl0ai5jc3YiKQoKYGBgCgojIyMgRXhwbG9yZSBhbmQgcHJvY2VzcyB0aGUgZGF0YQoKRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gW0tvc3RhZGlub3YncyBSIE5vdGVib29rXShodHRwczovL3JwdWJzLmNvbS9ia29zdGFkaS9kYXRhX2FuYWx5c2lzX2NpdGUyMDIyKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIHNlbGVjdCBjb2x1bW5zLCBhbmQgY3JlYXRlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgbnVtYmVyIG9mIG1hdGggcHJvZmVzc29ycywgYW5kIGNvcnJlY3Qgc29tZSBtaXNzaW5nIHZhbHVlcy4KClVzZSB0aGlzIGRhdGFzZXQgdG8gdGVzdCBvdXQgZGlmZmVyZW50IHdheXMgdG8gc3R5bGUgYW5kIGZvcm1hdCBhbiBSIE5vdGVib29rCgojIyMgQ3JlYXRlIGFuIFIgTm90ZWJvb2sgdG8gc2hhcmUKCi0gICBDcmVhdGUgYSBuZXcgUiBOb3RlYm9vayB0byBzaGFyZSB5b3VyIG1pZGRsZSBzY2hvb2wgbWF0aCB0ZWFjaGVyIGFuYWx5c2lzLgoKICAgIC0gICBEZWZpbmUgZ2xvYmFsIGRpc3BsYXkgb3B0aW9ucwogICAgLSAgIERlZmluZSBkaXNwbGF5IG9wdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBjb2RlIGNodW5rCiAgICAtICAgVXNlIHRoZSBga2FibGVgIG9yIGBkYXRhdGFibGVgIGZ1bmN0aW9ucyB0byBjcmVhdGUgZm9ybWF0dGVkIHRhYmxlcwoKIyMgQXNzc2lnbm1lbnQgMTJhOiBOWUMgT3BlbiBEYXRhIGFuYWx5c2lzCgpFeHBsb3JlIFtOWUMgT3BlbiBEYXRhXShodHRwczovL29wZW5kYXRhLmNpdHlvZm5ld3lvcmsudXMvKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIHNlZSB3aGF0IGRhdGEgaXMgYXZhaWxhYmxlLiBTZWxlY3QgYSBkYXRhc2V0IHRvIGltcG9ydCB2aWEgUiBTb2NyYXRhIGFuZCBhbnN3ZXIgYSByZXNlYXJjaCBxdWVzdGlvbiBhYm91dCBOZXcgWW9yayBDaXR5IG9yIHJlbGF0ZWQgdG8geW91ciBmaW5hbCBwcm9qZWN0LiBDcmVhdGUgYSBSIE5vdGVib29rIHRvIHNoYXJlIHlvdXIgYW5hbHlzaXMuIEluY2x1ZGU6CgotICAgRGVmaW5lIGdsb2JhbCBkaXNwbGF5IG9wdGlvbnMKLSAgIERlZmluZSBkaXNwbGF5IG9wdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBjb2RlIGNodW5rCi0gICBVc2UgdGhlIGBrYWJsZWAgb3IgYGRhdGF0YWJsZWAgZnVuY3Rpb25zIHRvIGNyZWF0ZSBhdCBsZWFzdCBvbmUgZm9ybWF0dGVkIHRhYmxlcwotICAgQ3JlYXRlIGF0IGxlYXN0IG9uZSBwbG90IG9yIG1hcAoKU29tZSBzdWdnZXN0aW9uczoKCi0gICBbQWN0aXZlIFRvYmFjY28gUmV0YWlsZXIgRGVhbGVyIExpY2Vuc2VzXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9CdXNpbmVzcy9BY3RpdmUtVG9iYWNjby1SZXRhaWwtRGVhbGVyLUxpY2Vuc2VzL2Fkdzgtd3Z4Yi9kYXRhKXt0YXJnZXQ9Il9ibGFuayJ9OgogICAgLSAgIGltcG9ydCB0aGlzIGRhdGFzZXQgb2YgYWxsIHRvYmFjY28gbGljZW5zZXMgaW4gTmV3IFlvcmsgQ2l0eQogICAgLSAgIHN1bW1hcml6ZSBieSBCb3JvdWdoIG9yIFtOZWlnaGJvcmhvb2QgVGFidWxhdGlvbiBBcmVhXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9DaXR5LUdvdmVybm1lbnQvTlRBLW1hcC9kM3FrLXBmeXope3RhcmdldD0iX2JsYW5rIn0gdG8gc2VlIGhvdyBtYW55IHRvYmFjY28gbGljZW5zZXMgd2VyZSBncmFudGVkIGluIENvcm9uYSB2cyBvdGhlciBuZWlnaGJvcmhvb2RzIGluIHRoZSBsYXN0IHllYXIKLSAgIFtNb3RvciBWZWhpY2xlIENvbGxpc2lvbnMgLSBDcmFzaGVzXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9QdWJsaWMtU2FmZXR5L01vdG9yLVZlaGljbGUtQ29sbGlzaW9ucy1DcmFzaGVzL2g5Z2ktbng5NSl7dGFyZ2V0PSJfYmxhbmsifQogICAgLSAgIGltcG9ydCB0aGUgZGF0YXNldCBvZiBhbGwgY3Jhc2hlcyBpbiBOWUMKICAgIC0gICBzdW1tYXJpemUgYnkgQm9yb3VnaCBvciBaaXAgQ29kZSB0byBzZWUgaG93IG1hbnkgY3Jhc2hlcyBvY2N1cnJlZCBpbiBvbmUgbmVpZ2hib2hvb2QgdnMgb3RoZXIgbmVpZ2hib3Job29kcyBpbiB0aGUgbGFzdCB5ZWFyCiAgICAtICAgZmlsdGVyIHRoZSBjcmFzaGVzIGluIHRoZSBaaXAgY29kZXMgaW4geW91ciBjaG9zZW4gbmVpZ2hib3Job29kIGFuZCB1c2UgdGhlIExhdC9Mb25nIHRvIGNyZWF0ZSBhIG1hcCBvZiB0aGUgY3Jhc2ggbG9jYXRpb25zIGluIG9uZSBuZWlnaGJvaG9vZCAoaGludDogdXNlIGBzdF9hc19zZigpYCkKCkFkZCB0aGUgbGluayB0byAyIE5vdGVib29rcyBvbiBDQU5WQVM6IGZvciB5b3VyIGluLWNsYXNzIGFzc2lnbm1lbnQgYW5kIGZvciB0aGlzIGFuYWx5c2lzLgoKPGJyPiA8YnI+CgoK