Module 4: Data documentation

Now that you have well-formatted code and data that are shareable, to ensure that these can be understood and efficiently used, you will need one or two additional documents:

A read-me file is typically focused on describing the files in a directory and how they might be opened and used. However, sometimes a read-me file also includes a project description and information on sampling, data collection, and how the variables were measured and coded.

Codebooks are typically focused on explaining how variables were measured and coded. Codebooks can also include more general information about the project, data collection, sampling, and other data-related details.

Depending on the guidance you follow, there can be a lot of overlap in the contents of read-me files and codebooks. If it suits your project, you might consider creating a single document that contains all the information recommended for both.

What to include in a read-me

Data and code shared publicly are open to people outside your research group. Others who find your data and code will likely be unfamiliar with important details like the project time frame and contact information for any questions. A read-me file is a plain text file that contains enough information to allow someone to use your data and statistical code and to contact the project team with question if needed.

This README.txt blog post has a nice summary of read-me contents consistent with most read-me guidance:

  • Project name
  • Date range
  • Project description
  • Funder
  • Contact information
  • File organization (files, folders, subfolders)
  • File naming
  • File storage location

For example, the read-me file for our data collection in this project would look like this:

Project name: coding2share 

Date range: 3/2017-9/2018

Project description: Surveyed public health practitioners on reproducible research practices 
Funder: Robert Wood Johnson Foundation

Contact information: Jenine Harris, harrisj@wustl.edu

File organization: The data, codebook, and statistical code are all together in the main directory

File naming: File names include date last saved, project name, and file type (022218_coding2share_data.csv)

File storage location: The files are all stored in the project repository at https://github.com/coding2share

What to include in a codebook

A codebook includes metadata for understanding and using a data set. Metadata is data-about-data like who collected the data, who funded data collection, how was the sample taken, how is each variable measured, etc. The Inter-university Consortium for Political and Social Research (ICPSR) summarized the metadata and variable information that should be included in a codebook.

We divided the metadata elements from the ICPSR into two groups: general information and variable information. More detail on each item can be found here.

General information to include in your codebook

There is a lot of detail that could be included as general project information in a codebook. Most resources agree that useful codebooks include a description of the study and information about the sampling, sample size, and timing of data collection. At a minimum:

  • Project contact person
  • Project description
  • Sampling and survey procedures
  • Sample size
  • Data collection time period

For example, the codebook for our data collection in this project would start with a section like this:

Project contact person: Jenine Harris, harrisj@wustl.edu

Project description: Surveyed public health practitioners on reproducible research practices

Sample and survey procedures: Email invitation for a web-based survey to members of the American Public Health Association statistics section, posted web link on project Twitter feed coding2share, RWJF Twitter feed, and JPHMP Twitter feed

Sample size: 247 participants; 207 complete surveys

Data collection time period: Sept-Dec 2017 

Variable information to include in your codebook

There is also a lot of detail that could be provided about each variable in a codebook. Most resources agree that a useful codebook includes as much of the following as applies:

  • Variable name
  • Variable label
  • Question text
  • Category values
  • Category value labels
  • Missing data values and labels
  • Relevant skip patterns and summary statistics

For example, in our survey we asked participants whether they had a codebook for the data from a recent paper or report. The codebook entry for this item would include:

Variable name: Q14
Variable label: Variable dictionary

Question text: A variable dictionary, or codebook, lists the variables in a data set and how they were measured and stored. Is there a variable dictionary for the data used for your recent publication or report?

Category values: 1, 2
Category value labels: 1-Yes, 2-No
Missing data values and labels: Blank

Relevant skip patterns and summary statistics: Question skipped for participants with no statistical code (Q7). Of 218 responses, 164 (75.2%) were Yes and 54 (24.8%) were No. 

Code to automatically generate a codebook

Some statistical packages have functions that use the properties of the variables in the dataset to provide a codebook in a formatted output. Assuming you have followed the best practices outlined in Module 3 and labeled your variables and their values properly, this method can automate much of the codebook writing process.

R examples

dataMaid Package

In R, the dataMaid package can be used to automatically generate a codebook in pdf format. To try the package, use one of the data sets automatically included with R like mtcars:

# dataMaid package for generating codebooks in R
# open package
library(dataMaid)

# load data
data(mtcars)

# make codebook
makeCodebook(mtcars)

The output from this shows a basic codebook, like this:

codebook Package

The codebook package in R can also automatically produce a codebook but as an html page. Additionally, it makes excellent use of any labeling you already have incorporated either in R or in SPSS or SAS while working with the haven package. It also interacts nicely with any Table of Contents settings you may have set up in your Rmd file.

To get a Table of Contents that will automatically line up with the codebook, include the following in the YAML of the Rmd:

---
title: "Automatic Codebook Example"
output: 
  html_document:
    toc: true
    toc_float: 
      smooth_scroll: true
---

In a chunk in the main body of the Rmd:

# Note: set the chunk option "include=FALSE" so that it doesn't appear in the final output
knitr::opts_chunk$set(echo=FALSE, warning=FALSE) # Don't show any additional 
# chunks or warnings
library(haven) # read/write SPSS files
library(codebook) # create codebook
dat <- read_spss("C:\\Wherever\\YouKeepStuff\\SPSSfileOfYourChoice.sav")
cb <- codebook(dat, survey_repetition="single")
cb

You can also include any additional text before or after your codebook chunk for introductory/summary sections, and whatever headings you use there will be incorporated into the TOC.

As you can see in a section of the output below, the package creates tabbed sections for each variable, including a frequency distribution, summary statistics, and variable and value labels if applicable.

SAS example using R code

There are macros available for SAS to create a codebook, however, we found them to be difficult to use and incomplete. Instead, try creating a codebook using dataMaid or codebook in R from your SAS data file by bringing in the data and using the dataMaid or codebook code as shown in the previous example.

The R code to bring SAS data and formats into R uses the haven package. Open R and use the following to download your SAS data into R:

# install and open haven package
install.packages("haven")
library(haven)

# bring in data
sasData <- read_sas("file path", "path to formats")

Once the data file is in, use dataMaid to create a codebook:

# install and open dataMaid for codebook development in R
install.packages("dataMaid")
library(dataMaid)

# make codebook
makeCodebook(sasData)

SPSS example

In SPSS, this example CODEBOOK function code in the syntax editor provides a codebook for two variables in a .spv file:

CODEBOOK Source Q14
/VARINFO LABEL TYPE MEASURE VALUELABELS MISSING
/STATISTICS COUNT PERCENT.

The output looks like this:

Note that in the case of SPSS, the percentages are out of the entire sample, not just the valid responses, accounting for the difference in % reported above.

An .spv file is only readable for those who have SPSS and it’s missing things like question text and skip pattern information, so a little more work is required to get it in shape:

  1. Copy the tables to a spreadsheet editor of your choice and clean up the formatting.
  2. Copy to a text editor of your choice that can handle tables and insert additional text.
  3. Save out as a PDF to make it readable to everyone.

Code to generate a custom codebook and machine-readable XML files

While the options for automatically generating codebooks work well enough, sometimes they’re overkill or don’t quite look the way you want them to. But, being automatic, they don’t give you much in the way of options. If you really want a custom look and/or also want to produce a machine-readable XML codebook file to aid in sharing your data, we have produced a submodule that will walk you through the process.

Beware: this involves a willingness to roll up your sleeves and get up to your eyeballs in HTML and XML tagging. While not for the faint of heart, you can make some cool-looking documents and demonstrate some serious coding chops.

Still want to give it a try? Take a look at the XML Codebook Example.

LS0tDQp0aXRsZTogIk1vZHVsZSA0Ig0Kb3V0cHV0Og0KICAgDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGNvZGVfZm9sZGluZzogbm9uZQ0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBkZl9wcmludDogdGliYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgaW5jbHVkZXM6DQogICAgICAgYWZ0ZXJfYm9keTogRzpcXENQSFNTXFxPcGVuU2NpZW5jZVxcTW9kdWxlc1xcU3R5bGVzaGVldHNcXEZvb3QuaHRtbA0KYmlibGlvZ3JhcGh5OiBHOi9DUEhTUy9PcGVuU2NpZW5jZS9Xcml0ZVVwcy9haW0xU3VydmV5UGFwZXIvUmVwcm9TdXJ2ZXlQYXBlcl8wMjEyMjAxOC5iaWJ0ZXgNCmNzbDogRzovQ1BIU1MvT3BlblNjaWVuY2UvV3JpdGVVcHMvYWltMVN1cnZleVBhcGVyL2FtZXJpY2FuLW1lZGljYWwtYXNzb2NpYXRpb24tbm8tdXJsLkNTTA0KLS0tDQo8aGVhZHsjdG9wfT4NCg0KPHNjcmlwdCBzcmMgPSAiRzpcXENQSFNTXFxPcGVuU2NpZW5jZVxcTW9kdWxlc1xcU3R5bGVzaGVldHNcXE1haW4uanMiPjwvc2NyaXB0Pg0KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iRzpcXENQSFNTXFxPcGVuU2NpZW5jZVxcTW9kdWxlc1xcU3R5bGVzaGVldHNcXE1haW5TdHlsZS5jc3MiPg0KYGBge3IsIGVjaG89RkFMU0V9DQpodG1sdG9vbHM6OmluY2x1ZGVIVE1MKCJHOlxcQ1BIU1NcXE9wZW5TY2llbmNlXFxNb2R1bGVzXFxTdHlsZXNoZWV0c1xcTmF2YmFyLmh0bWwiKQ0KYGBgDQo8aW1nIGNsYXNzPSJsb2dvIiBzcmMgPSAiRzpcXENQSFNTXFxPcGVuU2NpZW5jZVxcTW9kdWxlc1xcYzJzLWxvZ28tZm9yLW1vZHVsZXMuanBnIj4NCiAgIA0KPC9oZWFkPg0KDQpgYGB7ciBzZXR1cE9wdHMsIGVjaG89RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpDQoNCmBgYA0KI01vZHVsZSA0OiBEYXRhIGRvY3VtZW50YXRpb24NCg0KTm93IHRoYXQgeW91IGhhdmUgd2VsbC1mb3JtYXR0ZWQgY29kZSBhbmQgZGF0YSB0aGF0IGFyZSBzaGFyZWFibGUsIHRvIGVuc3VyZSB0aGF0IHRoZXNlIGNhbiBiZSB1bmRlcnN0b29kIGFuZCBlZmZpY2llbnRseSB1c2VkLCB5b3Ugd2lsbCBuZWVkIG9uZSBvciB0d28gYWRkaXRpb25hbCBkb2N1bWVudHM6IA0KDQoqIFthIHJlYWQtbWUgZmlsZV0oI3JlYWRtZSkgDQoqIFthIGNvZGVib29rXSgjY29kZWJvb2spIA0KDQpBIHJlYWQtbWUgZmlsZSBpcyB0eXBpY2FsbHkgZm9jdXNlZCBvbiBkZXNjcmliaW5nIHRoZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSBhbmQgaG93IHRoZXkgbWlnaHQgYmUgb3BlbmVkIGFuZCB1c2VkLiBIb3dldmVyLCBbc29tZXRpbWVzIGEgcmVhZC1tZSBmaWxlIGFsc28gaW5jbHVkZXMgYSBwcm9qZWN0IGRlc2NyaXB0aW9uIGFuZCBpbmZvcm1hdGlvbiBvbiBzYW1wbGluZywgZGF0YSBjb2xsZWN0aW9uLCBhbmQgaG93IHRoZSB2YXJpYWJsZXMgd2VyZSBtZWFzdXJlZCBhbmQgY29kZWRdKGh0dHBzOi8vZGF0YS5yZXNlYXJjaC5jb3JuZWxsLmVkdS9jb250ZW50L3JlYWRtZSkuIA0KDQpDb2RlYm9va3MgYXJlIHR5cGljYWxseSBmb2N1c2VkIG9uIGV4cGxhaW5pbmcgaG93IHZhcmlhYmxlcyB3ZXJlIG1lYXN1cmVkIGFuZCBjb2RlZC4gQ29kZWJvb2tzIGNhbiBhbHNvIGluY2x1ZGUgbW9yZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0LCBkYXRhIGNvbGxlY3Rpb24sIHNhbXBsaW5nLCBhbmQgb3RoZXIgZGF0YS1yZWxhdGVkIGRldGFpbHMuIA0KDQpEZXBlbmRpbmcgb24gdGhlIGd1aWRhbmNlIHlvdSBmb2xsb3csIHRoZXJlIGNhbiBiZSBhIGxvdCBvZiBvdmVybGFwIGluIHRoZSBjb250ZW50cyBvZiByZWFkLW1lIGZpbGVzIGFuZCBjb2RlYm9va3MuIElmIGl0IHN1aXRzIHlvdXIgcHJvamVjdCwgeW91IG1pZ2h0IGNvbnNpZGVyIGNyZWF0aW5nIGEgc2luZ2xlIGRvY3VtZW50IHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiByZWNvbW1lbmRlZCBmb3IgYm90aC4gDQoNCiMjV2hhdCB0byBpbmNsdWRlIGluIGEgcmVhZC1tZSB7I3JlYWRtZX0NCg0KRGF0YSBhbmQgY29kZSBzaGFyZWQgcHVibGljbHkgYXJlIG9wZW4gdG8gcGVvcGxlIG91dHNpZGUgeW91ciByZXNlYXJjaCBncm91cC4gT3RoZXJzIHdobyBmaW5kIHlvdXIgZGF0YSBhbmQgY29kZSB3aWxsIGxpa2VseSBiZSB1bmZhbWlsaWFyIHdpdGggaW1wb3J0YW50IGRldGFpbHMgbGlrZSB0aGUgcHJvamVjdCB0aW1lIGZyYW1lIGFuZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBhbnkgcXVlc3Rpb25zLiBBIHJlYWQtbWUgZmlsZSBpcyBhIHBsYWluIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbGxvdyBzb21lb25lIHRvIHVzZSB5b3VyIGRhdGEgYW5kIHN0YXRpc3RpY2FsIGNvZGUgYW5kIHRvIGNvbnRhY3QgdGhlIHByb2plY3QgdGVhbSB3aXRoIHF1ZXN0aW9uIGlmIG5lZWRlZC4gDQoNClRoaXMgW1JFQURNRS50eHRdKGh0dHA6Ly9kYXRhYWJpbml0aW8uY29tLz9wPTM3OCkgYmxvZyBwb3N0IGhhcyBhIG5pY2Ugc3VtbWFyeSBvZiByZWFkLW1lIGNvbnRlbnRzIGNvbnNpc3RlbnQgd2l0aCBtb3N0IHJlYWQtbWUgZ3VpZGFuY2U6DQoNCiogUHJvamVjdCBuYW1lIA0KKiBEYXRlIHJhbmdlIA0KKiBQcm9qZWN0IGRlc2NyaXB0aW9uIA0KKiBGdW5kZXIgDQoqIENvbnRhY3QgaW5mb3JtYXRpb24gDQoqIEZpbGUgb3JnYW5pemF0aW9uIChmaWxlcywgZm9sZGVycywgc3ViZm9sZGVycykgDQoqIEZpbGUgbmFtaW5nIA0KKiBGaWxlIHN0b3JhZ2UgbG9jYXRpb24gDQoNCkZvciBleGFtcGxlLCB0aGUgcmVhZC1tZSBmaWxlIGZvciBvdXIgZGF0YSBjb2xsZWN0aW9uIGluIHRoaXMgcHJvamVjdCB3b3VsZCBsb29rIGxpa2UgdGhpczoNCg0KYGBgDQpQcm9qZWN0IG5hbWU6IGNvZGluZzJzaGFyZSANCg0KRGF0ZSByYW5nZTogMy8yMDE3LTkvMjAxOA0KDQpQcm9qZWN0IGRlc2NyaXB0aW9uOiBTdXJ2ZXllZCBwdWJsaWMgaGVhbHRoIHByYWN0aXRpb25lcnMgb24gcmVwcm9kdWNpYmxlIHJlc2VhcmNoIHByYWN0aWNlcyANCkZ1bmRlcjogUm9iZXJ0IFdvb2QgSm9obnNvbiBGb3VuZGF0aW9uDQoNCkNvbnRhY3QgaW5mb3JtYXRpb246IEplbmluZSBIYXJyaXMsIGhhcnJpc2pAd3VzdGwuZWR1DQoNCkZpbGUgb3JnYW5pemF0aW9uOiBUaGUgZGF0YSwgY29kZWJvb2ssIGFuZCBzdGF0aXN0aWNhbCBjb2RlIGFyZSBhbGwgdG9nZXRoZXIgaW4gdGhlIG1haW4gZGlyZWN0b3J5DQoNCkZpbGUgbmFtaW5nOiBGaWxlIG5hbWVzIGluY2x1ZGUgZGF0ZSBsYXN0IHNhdmVkLCBwcm9qZWN0IG5hbWUsIGFuZCBmaWxlIHR5cGUgKDAyMjIxOF9jb2Rpbmcyc2hhcmVfZGF0YS5jc3YpDQoNCkZpbGUgc3RvcmFnZSBsb2NhdGlvbjogVGhlIGZpbGVzIGFyZSBhbGwgc3RvcmVkIGluIHRoZSBwcm9qZWN0IHJlcG9zaXRvcnkgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvZGluZzJzaGFyZQ0KYGBgDQoNCiMjV2hhdCB0byBpbmNsdWRlIGluIGEgY29kZWJvb2sgeyNjb2RlYm9va30NCg0KQSBjb2RlYm9vayBpbmNsdWRlcyBtZXRhZGF0YSBmb3IgdW5kZXJzdGFuZGluZyBhbmQgdXNpbmcgYSBkYXRhIHNldC4gTWV0YWRhdGEgaXMgZGF0YS1hYm91dC1kYXRhIGxpa2Ugd2hvIGNvbGxlY3RlZCB0aGUgZGF0YSwgd2hvIGZ1bmRlZCBkYXRhIGNvbGxlY3Rpb24sIGhvdyB3YXMgdGhlIHNhbXBsZSB0YWtlbiwgaG93IGlzIGVhY2ggdmFyaWFibGUgbWVhc3VyZWQsIGV0Yy4gVGhlIEludGVyLXVuaXZlcnNpdHkgQ29uc29ydGl1bSBmb3IgUG9saXRpY2FsIGFuZCBTb2NpYWwgUmVzZWFyY2ggKElDUFNSKSBbc3VtbWFyaXplZCB0aGUgbWV0YWRhdGEgYW5kIHZhcmlhYmxlIGluZm9ybWF0aW9uXShodHRwczovL3d3dy5pY3Bzci51bWljaC5lZHUvaWNwc3J3ZWIvY29udGVudC9kZXBvc2l0L2d1aWRlL2NoYXB0ZXIzZG9jcy5odG1sI2VsZW1lbnRzKSB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIGNvZGVib29rLg0KDQpXZSBkaXZpZGVkIHRoZSBtZXRhZGF0YSBlbGVtZW50cyBmcm9tIHRoZSBJQ1BTUiBpbnRvIHR3byBncm91cHM6IGdlbmVyYWwgaW5mb3JtYXRpb24gYW5kIHZhcmlhYmxlIGluZm9ybWF0aW9uLiBNb3JlIGRldGFpbCBvbiBlYWNoIGl0ZW0gY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3d3dy5pY3Bzci51bWljaC5lZHUvaWNwc3J3ZWIvY29udGVudC9kZXBvc2l0L2d1aWRlL2NoYXB0ZXIzZG9jcy5odG1sI2VsZW1lbnRzKS4NCg0KIyMjR2VuZXJhbCBpbmZvcm1hdGlvbiB0byBpbmNsdWRlIGluIHlvdXIgY29kZWJvb2sNCg0KVGhlcmUgaXMgW2EgbG90IG9mIGRldGFpbF0oaHR0cHM6Ly93d3cuaWNwc3IudW1pY2guZWR1L2ljcHNyd2ViL2NvbnRlbnQvZGVwb3NpdC9ndWlkZS9jaGFwdGVyM2RvY3MuaHRtbCNlbGVtZW50cykgdGhhdCBjb3VsZCBiZSBpbmNsdWRlZCBhcyBnZW5lcmFsIHByb2plY3QgaW5mb3JtYXRpb24gaW4gYSBjb2RlYm9vay4gTW9zdCByZXNvdXJjZXMgYWdyZWUgdGhhdCB1c2VmdWwgY29kZWJvb2tzIGluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3R1ZHkgYW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYW1wbGluZywgc2FtcGxlIHNpemUsIGFuZCB0aW1pbmcgb2YgZGF0YSBjb2xsZWN0aW9uLiBBdCBhIG1pbmltdW06DQoNCiogUHJvamVjdCBjb250YWN0IHBlcnNvbg0KKiBQcm9qZWN0IGRlc2NyaXB0aW9uIA0KKiBTYW1wbGluZyBhbmQgc3VydmV5IHByb2NlZHVyZXMgDQoqIFNhbXBsZSBzaXplDQoqIERhdGEgY29sbGVjdGlvbiB0aW1lIHBlcmlvZCANCg0KRm9yIGV4YW1wbGUsIHRoZSBjb2RlYm9vayBmb3Igb3VyIGRhdGEgY29sbGVjdGlvbiBpbiB0aGlzIHByb2plY3Qgd291bGQgc3RhcnQgd2l0aCBhIHNlY3Rpb24gbGlrZSB0aGlzOg0KDQpgYGANClByb2plY3QgY29udGFjdCBwZXJzb246IEplbmluZSBIYXJyaXMsIGhhcnJpc2pAd3VzdGwuZWR1DQoNClByb2plY3QgZGVzY3JpcHRpb246IFN1cnZleWVkIHB1YmxpYyBoZWFsdGggcHJhY3RpdGlvbmVycyBvbiByZXByb2R1Y2libGUgcmVzZWFyY2ggcHJhY3RpY2VzDQoNClNhbXBsZSBhbmQgc3VydmV5IHByb2NlZHVyZXM6IEVtYWlsIGludml0YXRpb24gZm9yIGEgd2ViLWJhc2VkIHN1cnZleSB0byBtZW1iZXJzIG9mIHRoZSBBbWVyaWNhbiBQdWJsaWMgSGVhbHRoIEFzc29jaWF0aW9uIHN0YXRpc3RpY3Mgc2VjdGlvbiwgcG9zdGVkIHdlYiBsaW5rIG9uIHByb2plY3QgVHdpdHRlciBmZWVkIGNvZGluZzJzaGFyZSwgUldKRiBUd2l0dGVyIGZlZWQsIGFuZCBKUEhNUCBUd2l0dGVyIGZlZWQNCg0KU2FtcGxlIHNpemU6IDI0NyBwYXJ0aWNpcGFudHM7IDIwNyBjb21wbGV0ZSBzdXJ2ZXlzDQoNCkRhdGEgY29sbGVjdGlvbiB0aW1lIHBlcmlvZDogU2VwdC1EZWMgMjAxNyANCmBgYA0KDQojIyNWYXJpYWJsZSBpbmZvcm1hdGlvbiB0byBpbmNsdWRlIGluIHlvdXIgY29kZWJvb2sNCg0KVGhlcmUgaXMgYWxzbyBbYSBsb3Qgb2YgZGV0YWlsXShodHRwczovL3d3dy5pY3Bzci51bWljaC5lZHUvaWNwc3J3ZWIvY29udGVudC9kZXBvc2l0L2d1aWRlL2NoYXB0ZXIzZG9jcy5odG1sI2VsZW1lbnRzKSB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIGFib3V0IGVhY2ggdmFyaWFibGUgaW4gYSBjb2RlYm9vay4gTW9zdCBbcmVzb3VyY2VzXSgjcmVzb3VyY2VzKSBhZ3JlZSB0aGF0IGEgdXNlZnVsIGNvZGVib29rIGluY2x1ZGVzIGFzIG11Y2ggb2YgdGhlIGZvbGxvd2luZyBhcyBhcHBsaWVzOg0KDQoqIFZhcmlhYmxlIG5hbWUgDQoqIFZhcmlhYmxlIGxhYmVsIA0KKiBRdWVzdGlvbiB0ZXh0IA0KKiBDYXRlZ29yeSB2YWx1ZXMgDQoqIENhdGVnb3J5IHZhbHVlIGxhYmVscyANCiogTWlzc2luZyBkYXRhIHZhbHVlcyBhbmQgbGFiZWxzIA0KKiBSZWxldmFudCBza2lwIHBhdHRlcm5zIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MgDQoNCkZvciBleGFtcGxlLCBpbiBvdXIgc3VydmV5IHdlIGFza2VkIHBhcnRpY2lwYW50cyB3aGV0aGVyIHRoZXkgaGFkIGEgY29kZWJvb2sgZm9yIHRoZSBkYXRhIGZyb20gYSByZWNlbnQgcGFwZXIgb3IgcmVwb3J0LiBUaGUgY29kZWJvb2sgZW50cnkgZm9yIHRoaXMgaXRlbSB3b3VsZCBpbmNsdWRlOg0KDQpgYGANClZhcmlhYmxlIG5hbWU6IFExNA0KVmFyaWFibGUgbGFiZWw6IFZhcmlhYmxlIGRpY3Rpb25hcnkNCg0KUXVlc3Rpb24gdGV4dDogQSB2YXJpYWJsZSBkaWN0aW9uYXJ5LCBvciBjb2RlYm9vaywgbGlzdHMgdGhlIHZhcmlhYmxlcyBpbiBhIGRhdGEgc2V0IGFuZCBob3cgdGhleSB3ZXJlIG1lYXN1cmVkIGFuZCBzdG9yZWQuIElzIHRoZXJlIGEgdmFyaWFibGUgZGljdGlvbmFyeSBmb3IgdGhlIGRhdGEgdXNlZCBmb3IgeW91ciByZWNlbnQgcHVibGljYXRpb24gb3IgcmVwb3J0Pw0KDQpDYXRlZ29yeSB2YWx1ZXM6IDEsIDINCkNhdGVnb3J5IHZhbHVlIGxhYmVsczogMS1ZZXMsIDItTm8NCk1pc3NpbmcgZGF0YSB2YWx1ZXMgYW5kIGxhYmVsczogQmxhbmsNCg0KUmVsZXZhbnQgc2tpcCBwYXR0ZXJucyBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzOiBRdWVzdGlvbiBza2lwcGVkIGZvciBwYXJ0aWNpcGFudHMgd2l0aCBubyBzdGF0aXN0aWNhbCBjb2RlIChRNykuIE9mIDIxOCByZXNwb25zZXMsIDE2NCAoNzUuMiUpIHdlcmUgWWVzIGFuZCA1NCAoMjQuOCUpIHdlcmUgTm8uIA0KYGBgDQojIyNDb2RlIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBjb2RlYm9vaw0KDQpTb21lIHN0YXRpc3RpY2FsIHBhY2thZ2VzIGhhdmUgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQgdG8gIHByb3ZpZGUgYSBjb2RlYm9vayBpbiBhIGZvcm1hdHRlZCBvdXRwdXQuIEFzc3VtaW5nIHlvdSBoYXZlIGZvbGxvd2VkIHRoZSBiZXN0IHByYWN0aWNlcyBvdXRsaW5lZCBpbiBbTW9kdWxlIDNdKGh0dHBzOi8vY2RuLnJhd2dpdC5jb20vY29kaW5nMnNoYXJlL01vZHVsZXMvbWFzdGVyL01vZDNDb2RlLmh0bWwpIGFuZCBsYWJlbGVkIHlvdXIgdmFyaWFibGVzIGFuZCB0aGVpciB2YWx1ZXMgcHJvcGVybHksIHRoaXMgbWV0aG9kIGNhbiBhdXRvbWF0ZSBtdWNoIG9mIHRoZSBjb2RlYm9vayB3cml0aW5nIHByb2Nlc3MuDQoNCiMjIyNSIGV4YW1wbGVzDQoNCiMjIyMjZGF0YU1haWQgUGFja2FnZQ0KDQpJbiBSLCB0aGUgYGRhdGFNYWlkYCBwYWNrYWdlIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBjb2RlYm9vayBpbiBwZGYgZm9ybWF0LiBUbyB0cnkgdGhlIHBhY2thZ2UsIHVzZSBvbmUgb2YgdGhlIGRhdGEgc2V0cyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHdpdGggYFJgIGxpa2UgYG10Y2Fyc2A6DQoNCmBgYHtyIGV2YWwgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBUUlVFLCBlcnJvciA9IEZBTFNFfQ0KIyBkYXRhTWFpZCBwYWNrYWdlIGZvciBnZW5lcmF0aW5nIGNvZGVib29rcyBpbiBSDQojIG9wZW4gcGFja2FnZQ0KbGlicmFyeShkYXRhTWFpZCkNCg0KIyBsb2FkIGRhdGENCmRhdGEobXRjYXJzKQ0KDQojIG1ha2UgY29kZWJvb2sNCm1ha2VDb2RlYm9vayhtdGNhcnMpDQpgYGANCg0KVGhlIG91dHB1dCBmcm9tIHRoaXMgc2hvd3MgYSBiYXNpYyBjb2RlYm9vaywgbGlrZSB0aGlzOg0KDQo8aW1nIHNyYyA9ICJjb2RlYm9va19tdGNhcnMuZ2lmIj4NCg0KIyMjIyNjb2RlYm9vayBQYWNrYWdlDQoNClRoZSBgY29kZWJvb2tgIHBhY2thZ2UgaW4gUiBjYW4gYWxzbyBhdXRvbWF0aWNhbGx5IHByb2R1Y2UgYSBjb2RlYm9vayBidXQgYXMgYW4gaHRtbCBwYWdlLiBBZGRpdGlvbmFsbHksIGl0IG1ha2VzIGV4Y2VsbGVudCB1c2Ugb2YgYW55IGxhYmVsaW5nIHlvdSBhbHJlYWR5IGhhdmUgaW5jb3Jwb3JhdGVkIGVpdGhlciBpbiBSIG9yIGluIFNQU1Mgb3IgU0FTIHdoaWxlIHdvcmtpbmcgd2l0aCB0aGUgYGhhdmVuYCBwYWNrYWdlLiBJdCBhbHNvIGludGVyYWN0cyBuaWNlbHkgd2l0aCBhbnkgVGFibGUgb2YgQ29udGVudHMgc2V0dGluZ3MgeW91IG1heSBoYXZlIHNldCB1cCBpbiB5b3VyIGBSbWRgIGZpbGUuDQoNClRvIGdldCBhIFRhYmxlIG9mIENvbnRlbnRzIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxpbmUgdXAgd2l0aCB0aGUgY29kZWJvb2ssIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbiB0aGUgWUFNTCBvZiB0aGUgUm1kOg0KDQpgYGB7ciBldmFsPUZBTFNFLCBlY2hvPVRSVUV9DQotLS0NCnRpdGxlOiAiQXV0b21hdGljIENvZGVib29rIEV4YW1wbGUiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQotLS0NCmBgYA0KDQpJbiBhIGNodW5rIGluIHRoZSBtYWluIGJvZHkgb2YgdGhlIFJtZDoNCg0KYGBge3IgZXZhbD1GQUxTRSwgZWNobz1UUlVFfQ0KIyBOb3RlOiBzZXQgdGhlIGNodW5rIG9wdGlvbiAiaW5jbHVkZT1GQUxTRSIgc28gdGhhdCBpdCBkb2Vzbid0IGFwcGVhciBpbiB0aGUgZmluYWwgb3V0cHV0DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSkgIyBEb24ndCBzaG93IGFueSBhZGRpdGlvbmFsIA0KIyBjaHVua3Mgb3Igd2FybmluZ3MNCmxpYnJhcnkoaGF2ZW4pICMgcmVhZC93cml0ZSBTUFNTIGZpbGVzDQpsaWJyYXJ5KGNvZGVib29rKSAjIGNyZWF0ZSBjb2RlYm9vaw0KZGF0IDwtIHJlYWRfc3BzcygiQzpcXFdoZXJldmVyXFxZb3VLZWVwU3R1ZmZcXFNQU1NmaWxlT2ZZb3VyQ2hvaWNlLnNhdiIpDQpjYiA8LSBjb2RlYm9vayhkYXQsIHN1cnZleV9yZXBldGl0aW9uPSJzaW5nbGUiKQ0KY2INCmBgYA0KDQpZb3UgY2FuIGFsc28gaW5jbHVkZSBhbnkgYWRkaXRpb25hbCB0ZXh0IGJlZm9yZSBvciBhZnRlciB5b3VyIGNvZGVib29rIGNodW5rIGZvciBpbnRyb2R1Y3Rvcnkvc3VtbWFyeSBzZWN0aW9ucywgYW5kIHdoYXRldmVyIGhlYWRpbmdzIHlvdSB1c2UgdGhlcmUgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgVE9DLg0KDQpBcyB5b3UgY2FuIHNlZSBpbiBhIHNlY3Rpb24gb2YgdGhlIG91dHB1dCBiZWxvdywgdGhlIHBhY2thZ2UgY3JlYXRlcyB0YWJiZWQgc2VjdGlvbnMgZm9yIGVhY2ggdmFyaWFibGUsIGluY2x1ZGluZyBhIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24sIHN1bW1hcnkgc3RhdGlzdGljcywgYW5kIHZhcmlhYmxlIGFuZCB2YWx1ZSBsYWJlbHMgaWYgYXBwbGljYWJsZS4NCg0KPGltZyBzcmMgPSAiQXV0b21hdGljQ29kZWJvb2tFeGFtcGxlLnBuZyI+DQoNCiMjIyNTQVMgZXhhbXBsZSB1c2luZyBSIGNvZGUNCg0KVGhlcmUgYXJlIG1hY3JvcyBhdmFpbGFibGUgZm9yIFNBUyB0byBjcmVhdGUgYSBjb2RlYm9vaywgaG93ZXZlciwgd2UgZm91bmQgdGhlbSB0byBiZSBkaWZmaWN1bHQgdG8gdXNlIGFuZCBpbmNvbXBsZXRlLiBJbnN0ZWFkLCB0cnkgY3JlYXRpbmcgYSBjb2RlYm9vayB1c2luZyBgZGF0YU1haWRgIG9yIGBjb2RlYm9va2AgaW4gUiBmcm9tIHlvdXIgU0FTIGRhdGEgZmlsZSBieSBicmluZ2luZyBpbiB0aGUgZGF0YSBhbmQgdXNpbmcgdGhlIGBkYXRhTWFpZGAgb3IgYGNvZGVib29rYCBjb2RlIGFzIHNob3duIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLiANCg0KVGhlIFIgY29kZSB0byBicmluZyBTQVMgZGF0YSBhbmQgZm9ybWF0cyBpbnRvIFIgdXNlcyB0aGUgYGhhdmVuYCBwYWNrYWdlLiBPcGVuIFIgYW5kIHVzZSB0aGUgZm9sbG93aW5nIHRvIGRvd25sb2FkIHlvdXIgU0FTIGRhdGEgaW50byBSOg0KDQpgYGB7ciBldmFsID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gVFJVRSwgZXJyb3IgPSBGQUxTRX0NCiMgaW5zdGFsbCBhbmQgb3BlbiBoYXZlbiBwYWNrYWdlDQppbnN0YWxsLnBhY2thZ2VzKCJoYXZlbiIpDQpsaWJyYXJ5KGhhdmVuKQ0KDQojIGJyaW5nIGluIGRhdGENCnNhc0RhdGEgPC0gcmVhZF9zYXMoImZpbGUgcGF0aCIsICJwYXRoIHRvIGZvcm1hdHMiKQ0KYGBgDQoNCk9uY2UgdGhlIGRhdGEgZmlsZSBpcyBpbiwgdXNlIGBkYXRhTWFpZGAgdG8gY3JlYXRlIGEgY29kZWJvb2s6DQoNCmBgYHtyIGV2YWwgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBUUlVFLCBlcnJvciA9IEZBTFNFfQ0KIyBpbnN0YWxsIGFuZCBvcGVuIGRhdGFNYWlkIGZvciBjb2RlYm9vayBkZXZlbG9wbWVudCBpbiBSDQppbnN0YWxsLnBhY2thZ2VzKCJkYXRhTWFpZCIpDQpsaWJyYXJ5KGRhdGFNYWlkKQ0KDQojIG1ha2UgY29kZWJvb2sNCm1ha2VDb2RlYm9vayhzYXNEYXRhKQ0KYGBgDQoNCiMjIyNTUFNTIGV4YW1wbGUNCg0KSW4gU1BTUywgdGhpcyBleGFtcGxlIGBDT0RFQk9PS2AgZnVuY3Rpb24gY29kZSBpbiB0aGUgc3ludGF4IGVkaXRvciBwcm92aWRlcyBhIGNvZGVib29rIGZvciB0d28gdmFyaWFibGVzIGluIGEgLnNwdiBmaWxlOg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBLbml0cyBjc3MgaW50byBvdmVyYWxsIG5iLmh0bWwgc28gaXQncyBwb3J0YWJsZQ0KaHRtbHRvb2xzOjppbmNsdWRlQ1NTKCJHOlxcQ1BIU1NcXE9wZW5TY2llbmNlXFxNb2R1bGVzXFxTdHlsZXNoZWV0c1xcU1BTU3N0eWxlLmNzcyIpIA0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgiU1BTU2NvZGVib29rRXhhbXBsZS5odG1sIikNCmBgYA0KDQpUaGUgb3V0cHV0IGxvb2tzIGxpa2UgdGhpczoNCg0KPGltZyBzcmMgPSAiU1BTU2NvZGVib29rRXhhbXBsZS5wbmciPg0KDQpOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgU1BTUywgdGhlIHBlcmNlbnRhZ2VzIGFyZSBvdXQgb2YgdGhlIGVudGlyZSBzYW1wbGUsIG5vdCBqdXN0IHRoZSB2YWxpZCByZXNwb25zZXMsIGFjY291bnRpbmcgZm9yIHRoZSBkaWZmZXJlbmNlIGluICUgcmVwb3J0ZWQgYWJvdmUuDQoNCkFuIC5zcHYgZmlsZSBpcyBvbmx5IHJlYWRhYmxlIGZvciB0aG9zZSB3aG8gaGF2ZSBTUFNTIGFuZCBpdCdzIG1pc3NpbmcgdGhpbmdzIGxpa2UgcXVlc3Rpb24gdGV4dCBhbmQgc2tpcCBwYXR0ZXJuIGluZm9ybWF0aW9uLCBzbyBhIGxpdHRsZSBtb3JlIHdvcmsgaXMgcmVxdWlyZWQgdG8gZ2V0IGl0IGluIHNoYXBlOg0KDQoxLiBDb3B5IHRoZSB0YWJsZXMgdG8gYSBzcHJlYWRzaGVldCBlZGl0b3Igb2YgeW91ciBjaG9pY2UgYW5kIGNsZWFuIHVwIHRoZSBmb3JtYXR0aW5nLg0KMi4gQ29weSB0byBhIHRleHQgZWRpdG9yIG9mIHlvdXIgY2hvaWNlIHRoYXQgY2FuIGhhbmRsZSB0YWJsZXMgYW5kIGluc2VydCBhZGRpdGlvbmFsIHRleHQuDQozLiBTYXZlIG91dCBhcyBhIFBERiB0byBtYWtlIGl0IHJlYWRhYmxlIHRvIGV2ZXJ5b25lLg0KDQojIyNDb2RlIHRvIGdlbmVyYXRlIGEgY3VzdG9tIGNvZGVib29rIGFuZCBtYWNoaW5lLXJlYWRhYmxlIFhNTCBmaWxlcw0KDQpXaGlsZSB0aGUgb3B0aW9ucyBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIGNvZGVib29rcyB3b3JrIHdlbGwgZW5vdWdoLCBzb21ldGltZXMgdGhleSdyZSBvdmVya2lsbCBvciBkb24ndCBxdWl0ZSBsb29rIHRoZSB3YXkgeW91IHdhbnQgdGhlbSB0by4gQnV0LCBiZWluZyBhdXRvbWF0aWMsIHRoZXkgZG9uJ3QgZ2l2ZSB5b3UgbXVjaCBpbiB0aGUgd2F5IG9mIG9wdGlvbnMuIElmIHlvdSByZWFsbHkgd2FudCBhIGN1c3RvbSBsb29rIGFuZC9vciBhbHNvIHdhbnQgdG8gcHJvZHVjZSBhIG1hY2hpbmUtcmVhZGFibGUgWE1MIGNvZGVib29rIGZpbGUgdG8gYWlkIGluIHNoYXJpbmcgeW91ciBkYXRhLCB3ZSBoYXZlIHByb2R1Y2VkIGEgc3VibW9kdWxlIHRoYXQgd2lsbCB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwcm9jZXNzLiANCg0KQmV3YXJlOiB0aGlzIGludm9sdmVzIGEgd2lsbGluZ25lc3MgdG8gcm9sbCB1cCB5b3VyIHNsZWV2ZXMgYW5kIGdldCB1cCB0byB5b3VyIGV5ZWJhbGxzIGluIEhUTUwgYW5kIFhNTCB0YWdnaW5nLiBXaGlsZSBub3QgZm9yIHRoZSBmYWludCBvZiBoZWFydCwgeW91IGNhbiBtYWtlIHNvbWUgY29vbC1sb29raW5nIGRvY3VtZW50cyBhbmQgZGVtb25zdHJhdGUgc29tZSBzZXJpb3VzIGNvZGluZyBjaG9wcy4NCg0KU3RpbGwgd2FudCB0byBnaXZlIGl0IGEgdHJ5PyBUYWtlIGEgbG9vayBhdCB0aGUgW1hNTCBDb2RlYm9vayBFeGFtcGxlXShYTUxDb2RlYm9va0V4YW1wbGUuaHRtbCkuDQoNCiMjUmVzb3VyY2VzIHsjcmVzb3VyY2VzfQ0KDQotIFtDb2RlYm9vayBjb29rYm9vazogQSBndWRlIHRvIHdyaXRpbmcgYSBnb29kIGNvZGVib29rIGZvciBkYXRhIGFuYWx5c2lzIHByb2plY3RzIGluIG1lZGljaW5lXShodHRwOi8vd3d3Lm1lZGljaW5lLm1jZ2lsbC5jYS9lcGlkZW1pb2xvZ3kvam9zZXBoL3BiZWxpc2xlL0NvZGVib29rQ29va2Jvb2svQ29kZWJvb2tDb29rYm9vay5wZGYpDQotIFtSZXZpZXcgdGhlIGNvZGVib29rXShodHRwczovL3VjLXIuZ2l0aHViLmlvL2RhdGFfd3JhbmdsaW5nL2NvZGVib29rKQ0KLSBbR3VpZGUgdG8gd3JpdGluZyAicmVhZG1lIiBzdHlsZSBtZXRhZGF0YV0oaHR0cHM6Ly9kYXRhLnJlc2VhcmNoLmNvcm5lbGwuZWR1L2NvbnRlbnQvcmVhZG1lKQ0KLSBbT25saW5lIHRlbXBsYXRlIGZyb20gQ29ybmVsbF0oaHR0cHM6Ly9jb3JuZWxsLmFwcC5ib3guY29tL3YvUmVhZG1lVGVtcGxhdGUpDQotIFtJRUVFIGluc3RydWN0aW9ucyBmb3IgcmVhZC1tZSBmaWxlcyBmb3IgZGF0YXNldHNdKGh0dHBzOi8vd3d3LmllZWUub3JnL2RvY3VtZW50cy9EYXRhc2V0UkVBRE1FLnBkZikNCi0gW0RhdGEgYW5kIHNldHVwIGZpbGVzIGZvciByZXByb2R1Y2luZyByZXN1bHRzXShodHRwczovL3d3dy5vcGVuaWNwc3Iub3JnL29wZW5pY3Bzci9yZXNvdXJjZXMvYWVyYS9kZXBvc2l0LWluc3RydWN0aW9ucy5wZGYpDQotIFtSRUFETUUudHh0XShodHRwOi8vZGF0YWFiaW5pdGlvLmNvbS8/cD0zNzgpDQoNCg0K


Reproducibility Toolkit on GitHub

Top