Below you will find links to data sources that contain spatial data and health data, and often both! We will continue to build out this list, so please check back often. Especially when thinking about your Final Project!


Health Datasets

  • CDC Places PLACES provides health and health-related data using small-area estimation for counties, incorporated and census designated places, census tracts, and ZIP Code Tabulation Areas (ZCTAs) across the United States. This project, which started in 2015, is a partnership between CDC, the Robert Wood Johnson Foundation (RWJF), and CDC Foundation.

  • CDC Wonder CDC WONDER – Wide-ranging ONline Data for Epidemiologic Research – is an easy-to-use, menu-driven system that makes the information resources of the Centers for Disease Control and Prevention (CDC) available to public health professionals and the public at large. It provides access to a wide array of public health information. There’s environmental data here, lots of health data at varying spatial resolutions.

  • Archived CDC GIS Website Although this website is archived, there are lot of active links to various health-related datasets that contain spatial data.

  • Dartmouth Atlas For more than 25 years, The Dartmouth Atlas Project documented striking variations in how medical resources were distributed and used in the United States. The project used Medicare and Medicaid data to provide information and analysis about national, regional, and local markets, as well as hospitals and their affiliated physicians. Although the website will no longer update Dartmouth Atlas tools or calculate new annual rates, this website will continue to provide historical Dartmouth Atlas rates (through 2019) and associated documentation.

  • Cancer Data The NCI GIS Portal for Cancer Research provides tools for mapping and download of cancer statistics, risk factors, cancer related tobacco policy data, and the information related to geographic patterns of cancer. It is intended for researchers, cancer control planners, cancer advocacy groups, and general public to inform and inspire our efforts to reduce cancer burden in the United States.

  • SEER*Stat Cancer Data The SEER*Stat statistical software provides a convenient, intuitive mechanism for the analysis of SEER and other cancer-related databases. It is a powerful tool to view individual cancer records and to produce statistics for studying the impact of cancer on a population.

  • NCI Small Area Estimates Model-based small area estimates from NCI are created by combining information from NHIS, BRFSS and auxiliary variables obtained from relevant sources (Census, American Community Survey, Administrative information) through novel statistical models. Outcomes include smoking, mammography, pap smear and colorectal screening. Estimates are for counties, health service areas, and states.

  • RWJ County Health Rankings County Health Rankings & Roadmaps (CHR&R), a program of the University of Wisconsin Population Health Institute, draws attention to why there are differences in health within and across communities. The program highlights policies and practices that can help everyone be as healthy as possible. CHR&R aims to grow a shared understanding of health, equity and the power of communities to improve health for all. This work is rooted in a long-term vision where all people and places have what they need to thrive.

  • Institute for Health Metrics and Evaluation An independent population health research organization based at the University of Washington School of Medicine, the Institute for Health Metrics and Evaluation (IHME) works with collaborators around the world to develop timely, relevant, and scientifically valid evidence that illuminates the state of health everywhere. They develop numerous metrics, including the Global Burden of Disease metrics.

  • UCSF Health Atlas An incredible resource from our colleagues at UCSF. Health Atlas is an interactive mapping website to explore neighborhood-level characteristics and see how they relate at a population level. The project was initiated by UCSF Population Health and Health Equity and led by the Population Health Data Initiative.

  • Demographic and Health Surveys The Demographic and Health Surveys (DHS) Program has collected, analyzed, and disseminated accurate and representative data on population, health, HIV, and nutrition through more than 400 surveys in over 90 countries. The DHS Program routinely collects geographic information in all surveyed countries. Using GIS, researchers can link DHS data with routine health data, health facility locations, local infrastructure such as roads and rivers, and environmental conditions. Linked DHS and geographic data are now being used to improve planning for family planning interventions, to assess the correlation of malaria prevalence and anemia in children in West Africa, and to analyze the effects of environment on early childhood mortality.

  • California Department of Public Health GIS Open Data Search or browse for GIS data from the CA Department of Public Health.

  • California Health Interview Survey The largest state health survey in the nation, the premier source of data on the health of Californians. The California Health Interview Survey — also known as CHIS or the California Health Survey — is a leading source of credible and comprehensive data on the health and health care needs of California’s large and diverse population. CHIS helps to target resources and interventions where they are needed most, ultimately improving health outcomes for all Californians. Each year, CHIS interviews more than 20,000 households on a wide range of health matters, from use of and access to health care, to health conditions and behaviors, to a range of topics that influence health: public program participation, housing, income and employment, climate change, food, gun violence, adverse childhood experiences, and much more.


Other Types of Health-Adjacent Data

  • PolicyMap PolicyMap is a fully web-based online data and mapping application that gives you access to over 15,000 indicators related to demographics, housing, crime, mortgages, health, jobs and more. Data is available at all common geographies (address, block group, census tract, zip code, county, city, state, MSA) as well as unique geographies like school districts and political boundaries. Data comes from both public and proprietary sources.

  • ICPSR ICPSR maintains a data archive of more than 350,000 files of research in the social and behavioral sciences. It hosts 23 specialized collections of data in education, aging, criminal justice, substance abuse, terrorism, and other fields.

  • Data.gov The United States Government’s open data site is designed to unleash the power of government open data to inform decisions by the public and policymakers, drive innovation and economic activity, achieve agency missions, and strengthen the foundation of an open and transparent government. Search geospatial datasets and see what they have!

  • CalEnviroScreen The Office of Environmental Health Hazard Assessment (OEHHA), on behalf of the California Environmental Protection Agency (CalEPA), announces the availability of the California Communities Environmental Health Screening Tool: CalEnviroScreen Version 2.0 (CalEnviroScreen 2.0). CalEnviroScreen is a screening methodology that can be used to help identify California communities that are disproportionately burdened by multiple sources of pollution. CalEPA has used the tool to designate California communities as disadvantaged pursuant to Senate Bill 535. It uses environmental, health, and socioeconomic information to produce scores for every census tract in the state.

  • Food Environment Atlas from the USDA Assembles statistics on food environment indicators to stimulate research on the determinants of food choices and diet quality, and provides a spatial overview of a community’s ability to access healthy food and its success in doing so.


Census Data and US Government Data Packages in R

  • censusAPI package: See Lab 2!

  • lehdr package

A useful package for working with Census Bureau data is the lehdr R package, which accesses the Longitudinal and Employer-Household Dynamics (LEHD) Origin-Destination Employment Statistics (LODES) data. LODES is not available from the Census API, meriting an alternative package and approach. LODES includes synthetic estimates of residential, workplace, and residential-workplace links at the Census block level, allowing for highly detailed geographic analysis of jobs and commuter patterns over time. The core function implemented in lehdr is grab_lodes(), which downloads a LODES file of a specified lodes_type (either rac for residential, wac for workplace, or od for origin-destination) for a given state and year. While the raw LODES data are available at the Census block level, the agg_geo parameter offers a convenient way to roll up estimates to higher levels of aggregation. For origin-destination data, the state_part = "main" argument below captures within-state commuters; use state_part = "aux" to get commuters from out-of-state. The optional argument use_cache = TRUE stores downloaded LODES data in a cache directory on the user’s computer; this is recommended to avoid having to re-download data for future analyses.

Let’s grab a dataset that contains 2018 tract-to-tract commute flows broken down by a variety of characteristics in Nevada, referenced in the LODES documentation.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lehdr)
nv_lodes_od <- grab_lodes(
  state = "nv",
  year = 2018,
  lodes_type = "od",
  agg_geo = "tract",
  state_part = "main",
  use_cache = TRUE
)
## Using cached version of file found in:
## /Users/pjames1/Library/Caches/org.R-project.R/R/lehdr/nv_od_main_JT00_2018.csv.gz
glimpse(nv_lodes_od)
## Rows: 182,729
## Columns: 14
## $ year    <dbl> 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 20…
## $ state   <chr> "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "N…
## $ w_tract <chr> "32001950100", "32001950100", "32001950100", "32001950100", "3…
## $ h_tract <chr> "32001950100", "32001950301", "32001950302", "32001950400", "3…
## $ S000    <dbl> 97, 84, 151, 1, 29, 204, 183, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1,…
## $ SA01    <dbl> 7, 14, 25, 0, 4, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ SA02    <dbl> 51, 44, 81, 0, 7, 117, 97, 1, 0, 1, 1, 0, 0, 0, 1, 1, 2, 1, 0,…
## $ SA03    <dbl> 39, 26, 45, 1, 18, 80, 78, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1,…
## $ SE01    <dbl> 19, 3, 6, 0, 6, 8, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, …
## $ SE02    <dbl> 24, 22, 35, 0, 4, 28, 27, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ SE03    <dbl> 54, 59, 110, 1, 19, 168, 139, 1, 1, 1, 0, 1, 0, 1, 2, 1, 2, 1,…
## $ SI01    <dbl> 44, 35, 49, 1, 16, 80, 76, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,…
## $ SI02    <dbl> 34, 38, 72, 0, 10, 112, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ SI03    <dbl> 19, 11, 30, 0, 3, 12, 33, 1, 1, 1, 2, 1, 0, 1, 2, 1, 2, 1, 1, …


  • tidyUSDA package

Agriculture can be a difficult sector on which to collect statistics, as it is not available in many data sources such as LODES. Fortunately, dedicated statistics on US agriculture can be acquired with the tidyUSDA package. You’ll need to get an API key at https://quickstats.nass.usda.gov/api and use that to request data from the USDA QuickStats API.

Let’s see which California counties produce have the most acres devoted to peaches. The core function implemented is getQuickstat(). To use it effectively, it is helpful to construct a query first at https://quickstats.nass.usda.gov/ and see what options are available, then bring those options as arguments into R.

CA_asp <- getQuickstat(
  key = "ENTER YOUR KEY HERE",
  program = "CENSUS",
  data_item = "PEACHES - ACRES BEARING",
  sector = "CROPS",
  commodity = "PEACHES",
  category = "AREA BEARING",
  domain = "TOTAL",
  geographic_level = "COUNTY",
  state = "CALIFORNIA",
  year = "2017"
)


The Census and other U.S. government agencies offer a bevy of other data products at various levels of aggregation. This also includes individual level data, also known as microdata. In many cases, microdata reflect responses to surveys that are de-identified and anonymized, then prepared in datasets that include rich detail about survey responses. US Census microdata are available for both the decennial Census and the ACS; these datasets, named the Public Use Microdata Series (PUMS), allow for detailed cross-tabulations not available in aggregated data. For information on the ecosystem of Census and Government related R packages, check out Kyle Walker’s indispensable book on using R to access census data. If you are interested in accessing Census data outside of the United States, check out his Chapter 12.


Resources for multiple types of data

  • Google Earth Engine Google Earth Engine combines a multi-petabyte catalog of satellite imagery and geospatial datasets with planetary-scale analysis capabilities. Scientists, researchers, and developers use Earth Engine to detect changes, map trends, and quantify differences on the Earth’s surface. Earth Engine is free for academic and research use, but you will need to create a Cloud Project.

  • Harvard Dataverse The Harvard Dataverse Repository is a free data repository open to all researchers from any discipline, both inside and outside of the Harvard community, where you can share, archive, cite, access, and explore research data. Each individual Dataverse collection is a customizable collection of datasets (or a virtual repository) for organizing, managing, and showcasing datasets. There is TONS of spatial data there, especially after the Climate Cafe started hosting data there.

  • And don’t forget the UC Davis Library! So many resources here! Specifically, check out: https://guides.library.ucdavis.edu/geography or https://guides.library.ucdavis.edu/social-science-data

LS0tCnRpdGxlOiAiRGF0YSBTb3VyY2VzIgotLS0KCkJlbG93IHlvdSB3aWxsIGZpbmQgbGlua3MgdG8gZGF0YSBzb3VyY2VzIHRoYXQgY29udGFpbiBzcGF0aWFsIGRhdGEgYW5kIGhlYWx0aCBkYXRhLCBhbmQgb2Z0ZW4gYm90aCEgKipXZSB3aWxsIGNvbnRpbnVlIHRvIGJ1aWxkIG91dCB0aGlzIGxpc3QsIHNvIHBsZWFzZSBjaGVjayBiYWNrIG9mdGVuLioqIEVzcGVjaWFsbHkgd2hlbiB0aGlua2luZyBhYm91dCB5b3VyIEZpbmFsIFByb2plY3QhCgpcCgojIEhlYWx0aCBEYXRhc2V0cwoKLSBbQ0RDIFBsYWNlc10oaHR0cHM6Ly93d3cuY2RjLmdvdi9wbGFjZXMvaW5kZXguaHRtbCkgUExBQ0VTIHByb3ZpZGVzIGhlYWx0aCBhbmQgaGVhbHRoLXJlbGF0ZWQgZGF0YSB1c2luZyBzbWFsbC1hcmVhIGVzdGltYXRpb24gZm9yIGNvdW50aWVzLCBpbmNvcnBvcmF0ZWQgYW5kIGNlbnN1cyBkZXNpZ25hdGVkIHBsYWNlcywgY2Vuc3VzIHRyYWN0cywgYW5kIFpJUCBDb2RlIFRhYnVsYXRpb24gQXJlYXMgKFpDVEFzKSBhY3Jvc3MgdGhlIFVuaXRlZCBTdGF0ZXMuIFRoaXMgcHJvamVjdCwgd2hpY2ggc3RhcnRlZCBpbiAyMDE1LCBpcyBhIHBhcnRuZXJzaGlwIGJldHdlZW4gQ0RDLCB0aGUgUm9iZXJ0IFdvb2QgSm9obnNvbiBGb3VuZGF0aW9uIChSV0pGKSwgYW5kIENEQyBGb3VuZGF0aW9uLgoKLSBbQ0RDIFdvbmRlcl0oaHR0cHM6Ly93b25kZXIuY2RjLmdvdi8pIENEQyBXT05ERVIgLS0gV2lkZS1yYW5naW5nIE9ObGluZSBEYXRhIGZvciBFcGlkZW1pb2xvZ2ljIFJlc2VhcmNoIC0tIGlzIGFuIGVhc3ktdG8tdXNlLCBtZW51LWRyaXZlbiBzeXN0ZW0gdGhhdCBtYWtlcyB0aGUgaW5mb3JtYXRpb24gcmVzb3VyY2VzIG9mIHRoZSBDZW50ZXJzIGZvciBEaXNlYXNlIENvbnRyb2wgYW5kIFByZXZlbnRpb24gKENEQykgYXZhaWxhYmxlIHRvIHB1YmxpYyBoZWFsdGggcHJvZmVzc2lvbmFscyBhbmQgdGhlIHB1YmxpYyBhdCBsYXJnZS4gSXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgd2lkZSBhcnJheSBvZiBwdWJsaWMgaGVhbHRoIGluZm9ybWF0aW9uLiBUaGVyZSdzIGVudmlyb25tZW50YWwgZGF0YSBoZXJlLCBsb3RzIG9mIGhlYWx0aCBkYXRhIGF0IHZhcnlpbmcgc3BhdGlhbCByZXNvbHV0aW9ucy4KCi0gW0FyY2hpdmVkIENEQyBHSVMgV2Vic2l0ZV0oaHR0cHM6Ly9hcmNoaXZlLmNkYy5nb3Yvd3d3X2NkY19nb3YvZGhkc3AvbWFwcy9naXN4L3Jlc291cmNlcy9nZW8tc3BhdGlhbC1kYXRhLmh0bWwpIEFsdGhvdWdoIHRoaXMgd2Vic2l0ZSBpcyBhcmNoaXZlZCwgdGhlcmUgYXJlIGxvdCBvZiBhY3RpdmUgbGlua3MgdG8gdmFyaW91cyBoZWFsdGgtcmVsYXRlZCBkYXRhc2V0cyB0aGF0IGNvbnRhaW4gc3BhdGlhbCBkYXRhLiAKCi0gW0RhcnRtb3V0aCBBdGxhc10oaHR0cDovL3d3dy5kYXJ0bW91dGhhdGxhcy5vcmcvKSBGb3IgbW9yZSB0aGFuIDI1IHllYXJzLCBUaGUgRGFydG1vdXRoIEF0bGFzIFByb2plY3QgZG9jdW1lbnRlZCBzdHJpa2luZyB2YXJpYXRpb25zIGluIGhvdyBtZWRpY2FsIHJlc291cmNlcyB3ZXJlIGRpc3RyaWJ1dGVkIGFuZCB1c2VkIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGUgcHJvamVjdCB1c2VkIE1lZGljYXJlIGFuZCBNZWRpY2FpZCBkYXRhIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYW5kIGFuYWx5c2lzIGFib3V0IG5hdGlvbmFsLCByZWdpb25hbCwgYW5kIGxvY2FsIG1hcmtldHMsIGFzIHdlbGwgYXMgaG9zcGl0YWxzIGFuZCB0aGVpciBhZmZpbGlhdGVkIHBoeXNpY2lhbnMuIEFsdGhvdWdoIHRoZSB3ZWJzaXRlIHdpbGwgbm8gbG9uZ2VyIHVwZGF0ZSBEYXJ0bW91dGggQXRsYXMgdG9vbHMgb3IgY2FsY3VsYXRlIG5ldyBhbm51YWwgcmF0ZXMsIHRoaXMgd2Vic2l0ZSB3aWxsIGNvbnRpbnVlIHRvIHByb3ZpZGUgaGlzdG9yaWNhbCBEYXJ0bW91dGggQXRsYXMgcmF0ZXMgKHRocm91Z2ggMjAxOSkgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbi4KCi0gW0NhbmNlciBEYXRhXShodHRwczovL2dpcy5jYW5jZXIuZ292LykgVGhlIE5DSSBHSVMgUG9ydGFsIGZvciBDYW5jZXIgUmVzZWFyY2ggcHJvdmlkZXMgdG9vbHMgZm9yIG1hcHBpbmcgYW5kIGRvd25sb2FkIG9mIGNhbmNlciBzdGF0aXN0aWNzLCByaXNrIGZhY3RvcnMsIGNhbmNlciByZWxhdGVkIHRvYmFjY28gcG9saWN5IGRhdGEsIGFuZCB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnZW9ncmFwaGljIHBhdHRlcm5zIG9mIGNhbmNlci4gSXQgaXMgaW50ZW5kZWQgZm9yIHJlc2VhcmNoZXJzLCBjYW5jZXIgY29udHJvbCBwbGFubmVycywgY2FuY2VyIGFkdm9jYWN5IGdyb3VwcywgYW5kIGdlbmVyYWwgcHVibGljIHRvIGluZm9ybSBhbmQgaW5zcGlyZSBvdXIgZWZmb3J0cyB0byByZWR1Y2UgY2FuY2VyIGJ1cmRlbiBpbiB0aGUgVW5pdGVkIFN0YXRlcy4KCi0gW1NFRVIqU3RhdCBDYW5jZXIgRGF0YV0oaHR0cHM6Ly9zZWVyLmNhbmNlci5nb3Yvc2VlcnN0YXQvKSBUaGUgU0VFUipTdGF0IHN0YXRpc3RpY2FsIHNvZnR3YXJlIHByb3ZpZGVzIGEgY29udmVuaWVudCwgaW50dWl0aXZlIG1lY2hhbmlzbSBmb3IgdGhlIGFuYWx5c2lzIG9mIFNFRVIgYW5kIG90aGVyIGNhbmNlci1yZWxhdGVkIGRhdGFiYXNlcy4gSXQgaXMgYSBwb3dlcmZ1bCB0b29sIHRvIHZpZXcgaW5kaXZpZHVhbCBjYW5jZXIgcmVjb3JkcyBhbmQgdG8gcHJvZHVjZSBzdGF0aXN0aWNzIGZvciBzdHVkeWluZyB0aGUgaW1wYWN0IG9mIGNhbmNlciBvbiBhIHBvcHVsYXRpb24uIAoKLQlbTkNJIFNtYWxsIEFyZWEgRXN0aW1hdGVzXShodHRwczovL3NhZS5jYW5jZXIuZ292L25oaXMtYnJmc3MvKSBNb2RlbC1iYXNlZCBzbWFsbCBhcmVhIGVzdGltYXRlcyBmcm9tIE5DSSBhcmUgY3JlYXRlZCBieSBjb21iaW5pbmcgaW5mb3JtYXRpb24gZnJvbSBOSElTLCBCUkZTUyBhbmQgYXV4aWxpYXJ5IHZhcmlhYmxlcyBvYnRhaW5lZCBmcm9tIHJlbGV2YW50IHNvdXJjZXMgKENlbnN1cywgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSwgQWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24pIHRocm91Z2ggbm92ZWwgc3RhdGlzdGljYWwgbW9kZWxzLiBPdXRjb21lcyBpbmNsdWRlIHNtb2tpbmcsIG1hbW1vZ3JhcGh5LCBwYXAgc21lYXIgYW5kIGNvbG9yZWN0YWwgc2NyZWVuaW5nLiBFc3RpbWF0ZXMgYXJlIGZvciBjb3VudGllcywgaGVhbHRoIHNlcnZpY2UgYXJlYXMsIGFuZCBzdGF0ZXMuCgotIFtSV0ogQ291bnR5IEhlYWx0aCBSYW5raW5nc10oaHR0cHM6Ly93d3cuY291bnR5aGVhbHRocmFua2luZ3Mub3JnLykgQ291bnR5IEhlYWx0aCBSYW5raW5ncyAmIFJvYWRtYXBzIChDSFImUiksIGEgcHJvZ3JhbSBvZiB0aGUgVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlLCBkcmF3cyBhdHRlbnRpb24gdG8gd2h5IHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiBoZWFsdGggd2l0aGluIGFuZCBhY3Jvc3MgY29tbXVuaXRpZXMuIFRoZSBwcm9ncmFtIGhpZ2hsaWdodHMgcG9saWNpZXMgYW5kIHByYWN0aWNlcyB0aGF0IGNhbiBoZWxwIGV2ZXJ5b25lIGJlIGFzIGhlYWx0aHkgYXMgcG9zc2libGUuIENIUiZSIGFpbXMgdG8gZ3JvdyBhIHNoYXJlZCB1bmRlcnN0YW5kaW5nIG9mIGhlYWx0aCwgZXF1aXR5IGFuZCB0aGUgcG93ZXIgb2YgY29tbXVuaXRpZXMgdG8gaW1wcm92ZSBoZWFsdGggZm9yIGFsbC4gVGhpcyB3b3JrIGlzIHJvb3RlZCBpbiBhIGxvbmctdGVybSB2aXNpb24gd2hlcmUgYWxsIHBlb3BsZSBhbmQgcGxhY2VzIGhhdmUgd2hhdCB0aGV5IG5lZWQgdG8gdGhyaXZlLgoKLSBbSW5zdGl0dXRlIGZvciBIZWFsdGggTWV0cmljcyBhbmQgRXZhbHVhdGlvbl0oaHR0cHM6Ly93d3cuaGVhbHRoZGF0YS5vcmcvZGF0YS10b29scy1wcmFjdGljZXMvZGF0YS1zb3VyY2VzKSBBbiBpbmRlcGVuZGVudCBwb3B1bGF0aW9uIGhlYWx0aCByZXNlYXJjaCBvcmdhbml6YXRpb24gYmFzZWQgYXQgdGhlIFVuaXZlcnNpdHkgb2YgV2FzaGluZ3RvbiBTY2hvb2wgb2YgTWVkaWNpbmUsIHRoZSBJbnN0aXR1dGUgZm9yIEhlYWx0aCBNZXRyaWNzIGFuZCBFdmFsdWF0aW9uIChJSE1FKSB3b3JrcyB3aXRoIGNvbGxhYm9yYXRvcnMgYXJvdW5kIHRoZSB3b3JsZCB0byBkZXZlbG9wIHRpbWVseSwgcmVsZXZhbnQsIGFuZCBzY2llbnRpZmljYWxseSB2YWxpZCBldmlkZW5jZSB0aGF0IGlsbHVtaW5hdGVzIHRoZSBzdGF0ZSBvZiBoZWFsdGggZXZlcnl3aGVyZS4gVGhleSBkZXZlbG9wIG51bWVyb3VzIG1ldHJpY3MsIGluY2x1ZGluZyB0aGUgR2xvYmFsIEJ1cmRlbiBvZiBEaXNlYXNlIG1ldHJpY3MuCgotIFtVQ1NGIEhlYWx0aCBBdGxhc10oaHR0cHM6Ly9oZWFsdGhhdGxhcy51Y3NmLmVkdS8pIEFuIGluY3JlZGlibGUgcmVzb3VyY2UgZnJvbSBvdXIgY29sbGVhZ3VlcyBhdCBVQ1NGLiBIZWFsdGggQXRsYXMgaXMgYW4gaW50ZXJhY3RpdmUgbWFwcGluZyB3ZWJzaXRlIHRvIGV4cGxvcmUgbmVpZ2hib3Job29kLWxldmVsIGNoYXJhY3RlcmlzdGljcyBhbmQgc2VlIGhvdyB0aGV5IHJlbGF0ZSBhdCBhIHBvcHVsYXRpb24gbGV2ZWwuIFRoZSBwcm9qZWN0IHdhcyBpbml0aWF0ZWQgYnkgVUNTRiBQb3B1bGF0aW9uIEhlYWx0aCBhbmQgSGVhbHRoIEVxdWl0eSBhbmQgbGVkIGJ5IHRoZSBQb3B1bGF0aW9uIEhlYWx0aCBEYXRhIEluaXRpYXRpdmUuIAoKLSBbRGVtb2dyYXBoaWMgYW5kIEhlYWx0aCBTdXJ2ZXlzXShodHRwczovL2Roc3Byb2dyYW0uY29tL01ldGhvZG9sb2d5L0dJUy5jZm0pIFRoZSBEZW1vZ3JhcGhpYyBhbmQgSGVhbHRoIFN1cnZleXMgKERIUykgUHJvZ3JhbSBoYXMgY29sbGVjdGVkLCBhbmFseXplZCwgYW5kIGRpc3NlbWluYXRlZCBhY2N1cmF0ZSBhbmQgcmVwcmVzZW50YXRpdmUgZGF0YSBvbiBwb3B1bGF0aW9uLCBoZWFsdGgsIEhJViwgYW5kIG51dHJpdGlvbiB0aHJvdWdoIG1vcmUgdGhhbiA0MDAgc3VydmV5cyBpbiBvdmVyIDkwIGNvdW50cmllcy4gVGhlIERIUyBQcm9ncmFtIHJvdXRpbmVseSBjb2xsZWN0cyBnZW9ncmFwaGljIGluZm9ybWF0aW9uIGluIGFsbCBzdXJ2ZXllZCBjb3VudHJpZXMuIFVzaW5nIEdJUywgcmVzZWFyY2hlcnMgY2FuIGxpbmsgREhTIGRhdGEgd2l0aCByb3V0aW5lIGhlYWx0aCBkYXRhLCBoZWFsdGggZmFjaWxpdHkgbG9jYXRpb25zLCBsb2NhbCBpbmZyYXN0cnVjdHVyZSBzdWNoIGFzIHJvYWRzIGFuZCByaXZlcnMsIGFuZCBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMuIExpbmtlZCBESFMgYW5kIGdlb2dyYXBoaWMgZGF0YSBhcmUgbm93IGJlaW5nIHVzZWQgdG8gaW1wcm92ZSBwbGFubmluZyBmb3IgZmFtaWx5IHBsYW5uaW5nIGludGVydmVudGlvbnMsIHRvIGFzc2VzcyB0aGUgY29ycmVsYXRpb24gb2YgbWFsYXJpYSBwcmV2YWxlbmNlIGFuZCBhbmVtaWEgaW4gY2hpbGRyZW4gaW4gV2VzdCBBZnJpY2EsIGFuZCB0byBhbmFseXplIHRoZSBlZmZlY3RzIG9mIGVudmlyb25tZW50IG9uIGVhcmx5IGNoaWxkaG9vZCBtb3J0YWxpdHkuCgotIFtDYWxpZm9ybmlhIERlcGFydG1lbnQgb2YgUHVibGljIEhlYWx0aCBHSVMgT3BlbiBEYXRhXShodHRwczovL2RhdGEtY2RwaGRhdGEub3BlbmRhdGEuYXJjZ2lzLmNvbS8pIFNlYXJjaCBvciBicm93c2UgZm9yIEdJUyBkYXRhIGZyb20gdGhlIENBIERlcGFydG1lbnQgb2YgUHVibGljIEhlYWx0aC4KCi0gW0NhbGlmb3JuaWEgSGVhbHRoIEludGVydmlldyBTdXJ2ZXldKGh0dHBzOi8vaGVhbHRocG9saWN5LnVjbGEuZWR1L291ci13b3JrL2NhbGlmb3JuaWEtaGVhbHRoLWludGVydmlldy1zdXJ2ZXktY2hpcykgVGhlIGxhcmdlc3Qgc3RhdGUgaGVhbHRoIHN1cnZleSBpbiB0aGUgbmF0aW9uLCB0aGUgcHJlbWllciBzb3VyY2Ugb2YgZGF0YSBvbiB0aGUgaGVhbHRoIG9mIENhbGlmb3JuaWFucy4gVGhlIENhbGlmb3JuaWEgSGVhbHRoIEludGVydmlldyBTdXJ2ZXkg4oCUIGFsc28ga25vd24gYXMgQ0hJUyBvciB0aGUgQ2FsaWZvcm5pYSBIZWFsdGggU3VydmV5IOKAlCBpcyBhIGxlYWRpbmcgc291cmNlIG9mIGNyZWRpYmxlIGFuZCBjb21wcmVoZW5zaXZlIGRhdGEgb24gdGhlIGhlYWx0aCBhbmQgaGVhbHRoIGNhcmUgbmVlZHMgb2YgQ2FsaWZvcm5pYeKAmXMgbGFyZ2UgYW5kIGRpdmVyc2UgcG9wdWxhdGlvbi4gQ0hJUyBoZWxwcyB0byB0YXJnZXQgcmVzb3VyY2VzIGFuZCBpbnRlcnZlbnRpb25zIHdoZXJlIHRoZXkgYXJlIG5lZWRlZCBtb3N0LCB1bHRpbWF0ZWx5IGltcHJvdmluZyBoZWFsdGggb3V0Y29tZXMgZm9yIGFsbCBDYWxpZm9ybmlhbnMuIEVhY2ggeWVhciwgQ0hJUyBpbnRlcnZpZXdzIG1vcmUgdGhhbiAyMCwwMDAgaG91c2Vob2xkcyBvbiBhIHdpZGUgcmFuZ2Ugb2YgaGVhbHRoIG1hdHRlcnMsIGZyb20gdXNlIG9mIGFuZCBhY2Nlc3MgdG8gaGVhbHRoIGNhcmUsIHRvIGhlYWx0aCBjb25kaXRpb25zIGFuZCBiZWhhdmlvcnMsIHRvIGEgcmFuZ2Ugb2YgdG9waWNzIHRoYXQgaW5mbHVlbmNlIGhlYWx0aDogcHVibGljIHByb2dyYW0gcGFydGljaXBhdGlvbiwgaG91c2luZywgaW5jb21lIGFuZCBlbXBsb3ltZW50LCBjbGltYXRlIGNoYW5nZSwgZm9vZCwgZ3VuIHZpb2xlbmNlLCBhZHZlcnNlIGNoaWxkaG9vZCBleHBlcmllbmNlcywgYW5kIG11Y2ggbW9yZS4gCgpcCgojIE90aGVyIFR5cGVzIG9mIEhlYWx0aC1BZGphY2VudCBEYXRhCgotIFtQb2xpY3lNYXBdKGh0dHBzOi8vdWNkYXZpcy5wb2xpY3ltYXAuY29tLykgUG9saWN5TWFwIGlzIGEgZnVsbHkgd2ViLWJhc2VkIG9ubGluZSBkYXRhIGFuZCBtYXBwaW5nIGFwcGxpY2F0aW9uIHRoYXQgZ2l2ZXMgeW91IGFjY2VzcyB0byBvdmVyIDE1LDAwMCBpbmRpY2F0b3JzIHJlbGF0ZWQgdG8gZGVtb2dyYXBoaWNzLCBob3VzaW5nLCBjcmltZSwgbW9ydGdhZ2VzLCBoZWFsdGgsIGpvYnMgYW5kIG1vcmUuIERhdGEgaXMgYXZhaWxhYmxlIGF0IGFsbCBjb21tb24gZ2VvZ3JhcGhpZXMgKGFkZHJlc3MsIGJsb2NrIGdyb3VwLCBjZW5zdXMgdHJhY3QsIHppcCBjb2RlLCBjb3VudHksIGNpdHksIHN0YXRlLCBNU0EpIGFzIHdlbGwgYXMgdW5pcXVlIGdlb2dyYXBoaWVzIGxpa2Ugc2Nob29sIGRpc3RyaWN0cyBhbmQgcG9saXRpY2FsIGJvdW5kYXJpZXMuIERhdGEgY29tZXMgZnJvbSBib3RoIHB1YmxpYyBhbmQgcHJvcHJpZXRhcnkgc291cmNlcy4KCi0gW0lDUFNSXShodHRwczovL3d3dy5pY3Bzci51bWljaC5lZHUvd2ViL3BhZ2VzLykgSUNQU1IgbWFpbnRhaW5zIGEgZGF0YSBhcmNoaXZlIG9mIG1vcmUgdGhhbiAzNTAsMDAwIGZpbGVzIG9mIHJlc2VhcmNoIGluIHRoZSBzb2NpYWwgYW5kIGJlaGF2aW9yYWwgc2NpZW5jZXMuIEl0IGhvc3RzIDIzIHNwZWNpYWxpemVkIGNvbGxlY3Rpb25zIG9mIGRhdGEgaW4gZWR1Y2F0aW9uLCBhZ2luZywgY3JpbWluYWwganVzdGljZSwgc3Vic3RhbmNlIGFidXNlLCB0ZXJyb3Jpc20sIGFuZCBvdGhlciBmaWVsZHMuCgotIFtEYXRhLmdvdl0oaHR0cHM6Ly9jYXRhbG9nLmRhdGEuZ292L2RhdGFzZXQvKSBUaGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW504oCZcyBvcGVuIGRhdGEgc2l0ZSBpcyBkZXNpZ25lZCB0byB1bmxlYXNoIHRoZSBwb3dlciBvZiBnb3Zlcm5tZW50IG9wZW4gZGF0YSB0byBpbmZvcm0gZGVjaXNpb25zIGJ5IHRoZSBwdWJsaWMgYW5kIHBvbGljeW1ha2VycywgZHJpdmUgaW5ub3ZhdGlvbiBhbmQgZWNvbm9taWMgYWN0aXZpdHksIGFjaGlldmUgYWdlbmN5IG1pc3Npb25zLCBhbmQgc3RyZW5ndGhlbiB0aGUgZm91bmRhdGlvbiBvZiBhbiBvcGVuIGFuZCB0cmFuc3BhcmVudCBnb3Zlcm5tZW50LiBTZWFyY2ggZ2Vvc3BhdGlhbCBkYXRhc2V0cyBhbmQgc2VlIHdoYXQgdGhleSBoYXZlIQoKLSBbQ2FsRW52aXJvU2NyZWVuXShodHRwczovL29laGhhLmNhLmdvdi9jYWxlbnZpcm9zY3JlZW4vcmVwb3J0L2NhbGVudmlyb3NjcmVlbi12ZXJzaW9uLTIwKSBUaGUgT2ZmaWNlIG9mIEVudmlyb25tZW50YWwgSGVhbHRoIEhhemFyZCBBc3Nlc3NtZW50IChPRUhIQSksIG9uIGJlaGFsZiBvZiB0aGUgQ2FsaWZvcm5pYSBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChDYWxFUEEpLCBhbm5vdW5jZXMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgQ2FsaWZvcm5pYSBDb21tdW5pdGllcyBFbnZpcm9ubWVudGFsIEhlYWx0aCBTY3JlZW5pbmcgVG9vbDogQ2FsRW52aXJvU2NyZWVuIFZlcnNpb24gMi4wIChDYWxFbnZpcm9TY3JlZW4gMi4wKS4gQ2FsRW52aXJvU2NyZWVuIGlzIGEgc2NyZWVuaW5nIG1ldGhvZG9sb2d5IHRoYXQgY2FuIGJlIHVzZWQgdG8gaGVscCBpZGVudGlmeSBDYWxpZm9ybmlhIGNvbW11bml0aWVzIHRoYXQgYXJlIGRpc3Byb3BvcnRpb25hdGVseSBidXJkZW5lZCBieSBtdWx0aXBsZSBzb3VyY2VzIG9mIHBvbGx1dGlvbi4gQ2FsRVBBIGhhcyB1c2VkIHRoZSB0b29sIHRvIGRlc2lnbmF0ZSBDYWxpZm9ybmlhIGNvbW11bml0aWVzIGFzIGRpc2FkdmFudGFnZWQgcHVyc3VhbnQgdG8gU2VuYXRlIEJpbGwgNTM1LiBJdCB1c2VzIGVudmlyb25tZW50YWwsIGhlYWx0aCwgYW5kIHNvY2lvZWNvbm9taWMgaW5mb3JtYXRpb24gdG8gcHJvZHVjZSBzY29yZXMgZm9yIGV2ZXJ5IGNlbnN1cyB0cmFjdCBpbiB0aGUgc3RhdGUuCgotIFtGb29kIEVudmlyb25tZW50IEF0bGFzIGZyb20gdGhlIFVTREFdKGh0dHBzOi8vd3d3LmVycy51c2RhLmdvdi9mb29kYXRsYXMvKSBBc3NlbWJsZXMgc3RhdGlzdGljcyBvbiBmb29kIGVudmlyb25tZW50IGluZGljYXRvcnMgdG8gc3RpbXVsYXRlIHJlc2VhcmNoIG9uIHRoZSBkZXRlcm1pbmFudHMgb2YgZm9vZCBjaG9pY2VzIGFuZCBkaWV0IHF1YWxpdHksIGFuZCBwcm92aWRlcyBhIHNwYXRpYWwgb3ZlcnZpZXcgb2YgYSBjb21tdW5pdHkncyBhYmlsaXR5IHRvIGFjY2VzcyBoZWFsdGh5IGZvb2QgYW5kIGl0cyBzdWNjZXNzIGluIGRvaW5nIHNvLiAKClwKCiMgQ2Vuc3VzIERhdGEgYW5kIFVTIEdvdmVybm1lbnQgRGF0YSBQYWNrYWdlcyBpbiBSCgotICoqY2Vuc3VzQVBJKiogcGFja2FnZTogU2VlIFtMYWIgMl0oTGFiMl8yMDI2Lmh0bWwpIQoKLSAqKmxlaGRyKiogcGFja2FnZQoKQSB1c2VmdWwgcGFja2FnZSBmb3Igd29ya2luZyB3aXRoIENlbnN1cyBCdXJlYXUgZGF0YSBpcyB0aGUgbGVoZHIgUiBwYWNrYWdlLCB3aGljaCBhY2Nlc3NlcyB0aGUgW0xvbmdpdHVkaW5hbCBhbmQgRW1wbG95ZXItSG91c2Vob2xkIER5bmFtaWNzIChMRUhEKV0oaHR0cHM6Ly9sZWhkLmNlcy5jZW5zdXMuZ292LykgW09yaWdpbi1EZXN0aW5hdGlvbiBFbXBsb3ltZW50IFN0YXRpc3RpY3MgKExPREVTKV0oaHR0cHM6Ly9sZWhkLmNlcy5jZW5zdXMuZ292L2RhdGEvI2xvZGVzKSBkYXRhLiBMT0RFUyBpcyBub3QgYXZhaWxhYmxlIGZyb20gdGhlIENlbnN1cyBBUEksIG1lcml0aW5nIGFuIGFsdGVybmF0aXZlIHBhY2thZ2UgYW5kIGFwcHJvYWNoLiBMT0RFUyBpbmNsdWRlcyBzeW50aGV0aWMgZXN0aW1hdGVzIG9mIHJlc2lkZW50aWFsLCB3b3JrcGxhY2UsIGFuZCByZXNpZGVudGlhbC13b3JrcGxhY2UgbGlua3MgYXQgdGhlIENlbnN1cyBibG9jayBsZXZlbCwgYWxsb3dpbmcgZm9yIGhpZ2hseSBkZXRhaWxlZCBnZW9ncmFwaGljIGFuYWx5c2lzIG9mIGpvYnMgYW5kIGNvbW11dGVyIHBhdHRlcm5zIG92ZXIgdGltZS4gVGhlIGNvcmUgZnVuY3Rpb24gaW1wbGVtZW50ZWQgaW4gKipsZWhkcioqIGlzIGBncmFiX2xvZGVzKClgLCB3aGljaCBkb3dubG9hZHMgYSBMT0RFUyBmaWxlIG9mIGEgc3BlY2lmaWVkIGBsb2Rlc190eXBlYCAoZWl0aGVyICpyYWMqIGZvciByZXNpZGVudGlhbCwgKndhYyogZm9yIHdvcmtwbGFjZSwgb3IgKm9kKiBmb3Igb3JpZ2luLWRlc3RpbmF0aW9uKSBmb3IgYSBnaXZlbiBzdGF0ZSBhbmQgeWVhci4gV2hpbGUgdGhlIHJhdyBMT0RFUyBkYXRhIGFyZSBhdmFpbGFibGUgYXQgdGhlIENlbnN1cyBibG9jayBsZXZlbCwgdGhlICphZ2dfZ2VvKiBwYXJhbWV0ZXIgb2ZmZXJzIGEgY29udmVuaWVudCB3YXkgdG8gcm9sbCB1cCBlc3RpbWF0ZXMgdG8gaGlnaGVyIGxldmVscyBvZiBhZ2dyZWdhdGlvbi4gRm9yIG9yaWdpbi1kZXN0aW5hdGlvbiBkYXRhLCB0aGUgYHN0YXRlX3BhcnQgPSAibWFpbiJgIGFyZ3VtZW50IGJlbG93IGNhcHR1cmVzIHdpdGhpbi1zdGF0ZSBjb21tdXRlcnM7IHVzZSBgc3RhdGVfcGFydCA9ICJhdXgiYCB0byBnZXQgY29tbXV0ZXJzIGZyb20gb3V0LW9mLXN0YXRlLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgYHVzZV9jYWNoZSA9IFRSVUVgIHN0b3JlcyBkb3dubG9hZGVkIExPREVTIGRhdGEgaW4gYSBjYWNoZSBkaXJlY3Rvcnkgb24gdGhlIHVzZXLigJlzIGNvbXB1dGVyOyB0aGlzIGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGhhdmluZyB0byByZS1kb3dubG9hZCBkYXRhIGZvciBmdXR1cmUgYW5hbHlzZXMuCgpMZXTigJlzIGdyYWIgYSBkYXRhc2V0IHRoYXQgY29udGFpbnMgMjAxOCB0cmFjdC10by10cmFjdCBjb21tdXRlIGZsb3dzIGJyb2tlbiBkb3duIGJ5IGEgdmFyaWV0eSBvZiBjaGFyYWN0ZXJpc3RpY3MgaW4gTmV2YWRhLCByZWZlcmVuY2VkIGluIHRoZSBMT0RFUyBkb2N1bWVudGF0aW9uLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobGVoZHIpCm52X2xvZGVzX29kIDwtIGdyYWJfbG9kZXMoCiAgc3RhdGUgPSAibnYiLAogIHllYXIgPSAyMDE4LAogIGxvZGVzX3R5cGUgPSAib2QiLAogIGFnZ19nZW8gPSAidHJhY3QiLAogIHN0YXRlX3BhcnQgPSAibWFpbiIsCiAgdXNlX2NhY2hlID0gVFJVRQopCmdsaW1wc2UobnZfbG9kZXNfb2QpCgpgYGAKXAoKCgoKLSAqKnRpZHlVU0RBKiogcGFja2FnZQoKQWdyaWN1bHR1cmUgY2FuIGJlIGEgZGlmZmljdWx0IHNlY3RvciBvbiB3aGljaCB0byBjb2xsZWN0IHN0YXRpc3RpY3MsIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUgaW4gbWFueSBkYXRhIHNvdXJjZXMgc3VjaCBhcyBMT0RFUy4gRm9ydHVuYXRlbHksIGRlZGljYXRlZCBzdGF0aXN0aWNzIG9uIFVTIGFncmljdWx0dXJlIGNhbiBiZSBhY3F1aXJlZCB3aXRoIHRoZSB0aWR5VVNEQSBwYWNrYWdlLiBZb3XigJlsbCBuZWVkIHRvIGdldCBhbiBBUEkga2V5IGF0IGh0dHBzOi8vcXVpY2tzdGF0cy5uYXNzLnVzZGEuZ292L2FwaSBhbmQgdXNlIHRoYXQgdG8gcmVxdWVzdCBkYXRhIGZyb20gdGhlIFVTREEgUXVpY2tTdGF0cyBBUEkuCgpMZXTigJlzIHNlZSB3aGljaCBDYWxpZm9ybmlhIGNvdW50aWVzIHByb2R1Y2UgaGF2ZSB0aGUgbW9zdCBhY3JlcyBkZXZvdGVkIHRvIFtwZWFjaGVzXShodHRwczovL3lvdXR1LmJlLzNHQ3J6alZkbVNnP3NpPWJVSFpmVkQxdXE4eFlJSTIpLiBUaGUgY29yZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBpcyBnYGV0UXVpY2tzdGF0KClgLiBUbyB1c2UgaXQgZWZmZWN0aXZlbHksIGl0IGlzIGhlbHBmdWwgdG8gY29uc3RydWN0IGEgcXVlcnkgZmlyc3QgYXQgaHR0cHM6Ly9xdWlja3N0YXRzLm5hc3MudXNkYS5nb3YvIGFuZCBzZWUgd2hhdCBvcHRpb25zIGFyZSBhdmFpbGFibGUsIHRoZW4gYnJpbmcgdGhvc2Ugb3B0aW9ucyBhcyBhcmd1bWVudHMgaW50byBSLgoKYGBge3IsIGV2YWwgPSBGQUxTRX0KQ0FfYXNwIDwtIGdldFF1aWNrc3RhdCgKICBrZXkgPSAiRU5URVIgWU9VUiBLRVkgSEVSRSIsCiAgcHJvZ3JhbSA9ICJDRU5TVVMiLAogIGRhdGFfaXRlbSA9ICJQRUFDSEVTIC0gQUNSRVMgQkVBUklORyIsCiAgc2VjdG9yID0gIkNST1BTIiwKICBjb21tb2RpdHkgPSAiUEVBQ0hFUyIsCiAgY2F0ZWdvcnkgPSAiQVJFQSBCRUFSSU5HIiwKICBkb21haW4gPSAiVE9UQUwiLAogIGdlb2dyYXBoaWNfbGV2ZWwgPSAiQ09VTlRZIiwKICBzdGF0ZSA9ICJDQUxJRk9STklBIiwKICB5ZWFyID0gIjIwMTciCikKYGBgCgpcCgpUaGUgQ2Vuc3VzIGFuZCBvdGhlciBVLlMuIGdvdmVybm1lbnQgYWdlbmNpZXMgb2ZmZXIgYSBiZXZ5IG9mIG90aGVyIGRhdGEgcHJvZHVjdHMgYXQgdmFyaW91cyBsZXZlbHMgb2YgYWdncmVnYXRpb24uIFRoaXMgYWxzbyBpbmNsdWRlcyBpbmRpdmlkdWFsIGxldmVsIGRhdGEsIGFsc28ga25vd24gYXMgbWljcm9kYXRhLiBJbiBtYW55IGNhc2VzLCBtaWNyb2RhdGEgcmVmbGVjdCByZXNwb25zZXMgdG8gc3VydmV5cyB0aGF0IGFyZSBkZS1pZGVudGlmaWVkIGFuZCBhbm9ueW1pemVkLCB0aGVuIHByZXBhcmVkIGluIGRhdGFzZXRzIHRoYXQgaW5jbHVkZSByaWNoIGRldGFpbCBhYm91dCBzdXJ2ZXkgcmVzcG9uc2VzLiBVUyBDZW5zdXMgbWljcm9kYXRhIGFyZSBhdmFpbGFibGUgZm9yIGJvdGggdGhlIGRlY2VubmlhbCBDZW5zdXMgYW5kIHRoZSBBQ1M7IHRoZXNlIGRhdGFzZXRzLCBuYW1lZCB0aGUgW1B1YmxpYyBVc2UgTWljcm9kYXRhIFNlcmllc10oaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL2Fjcy9taWNyb2RhdGEuaHRtbCkgKFBVTVMpLCBhbGxvdyBmb3IgZGV0YWlsZWQgY3Jvc3MtdGFidWxhdGlvbnMgbm90IGF2YWlsYWJsZSBpbiBhZ2dyZWdhdGVkIGRhdGEuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgZWNvc3lzdGVtIG9mIENlbnN1cyBhbmQgR292ZXJubWVudCByZWxhdGVkIFIgcGFja2FnZXMsIGNoZWNrIG91dCBLeWxlIFdhbGtlcuKAmXMgaW5kaXNwZW5zYWJsZSBbYm9va10oaHR0cHM6Ly93YWxrZXItZGF0YS5jb20vY2Vuc3VzLXIvaW5kZXguaHRtbCkgb24gdXNpbmcgUiB0byBhY2Nlc3MgY2Vuc3VzIGRhdGEuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhY2Nlc3NpbmcgQ2Vuc3VzIGRhdGEgb3V0c2lkZSBvZiB0aGUgVW5pdGVkIFN0YXRlcywgY2hlY2sgb3V0IGhpcyBbQ2hhcHRlciAxMl0oaHR0cHM6Ly93YWxrZXItZGF0YS5jb20vY2Vuc3VzLXIvd29ya2luZy13aXRoLWNlbnN1cy1kYXRhLW91dHNpZGUtdGhlLXVuaXRlZC1zdGF0ZXMuaHRtbCkuCgpcCgojIFJlc291cmNlcyBmb3IgbXVsdGlwbGUgdHlwZXMgb2YgZGF0YQoKLSBbR29vZ2xlIEVhcnRoIEVuZ2luZV0oaHR0cHM6Ly9lYXJ0aGVuZ2luZS5nb29nbGUuY29tLykgR29vZ2xlIEVhcnRoIEVuZ2luZSBjb21iaW5lcyBhIG11bHRpLXBldGFieXRlIGNhdGFsb2cgb2Ygc2F0ZWxsaXRlIGltYWdlcnkgYW5kIGdlb3NwYXRpYWwgZGF0YXNldHMgd2l0aCBwbGFuZXRhcnktc2NhbGUgYW5hbHlzaXMgY2FwYWJpbGl0aWVzLiBTY2llbnRpc3RzLCByZXNlYXJjaGVycywgYW5kIGRldmVsb3BlcnMgdXNlIEVhcnRoIEVuZ2luZSB0byBkZXRlY3QgY2hhbmdlcywgbWFwIHRyZW5kcywgYW5kIHF1YW50aWZ5IGRpZmZlcmVuY2VzIG9uIHRoZSBFYXJ0aCdzIHN1cmZhY2UuIEVhcnRoIEVuZ2luZSBpcyBmcmVlIGZvciBhY2FkZW1pYyBhbmQgcmVzZWFyY2ggdXNlLCBidXQgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBDbG91ZCBQcm9qZWN0LgoKLSBbSGFydmFyZCBEYXRhdmVyc2VdKGh0dHBzOi8vZGF0YXZlcnNlLmhhcnZhcmQuZWR1LykgVGhlIEhhcnZhcmQgRGF0YXZlcnNlIFJlcG9zaXRvcnkgaXMgYSBmcmVlIGRhdGEgcmVwb3NpdG9yeSBvcGVuIHRvIGFsbCByZXNlYXJjaGVycyBmcm9tIGFueSBkaXNjaXBsaW5lLCBib3RoIGluc2lkZSBhbmQgb3V0c2lkZSBvZiB0aGUgSGFydmFyZCBjb21tdW5pdHksIHdoZXJlIHlvdSBjYW4gc2hhcmUsIGFyY2hpdmUsIGNpdGUsIGFjY2VzcywgYW5kIGV4cGxvcmUgcmVzZWFyY2ggZGF0YS4gRWFjaCBpbmRpdmlkdWFsIERhdGF2ZXJzZSBjb2xsZWN0aW9uIGlzIGEgY3VzdG9taXphYmxlIGNvbGxlY3Rpb24gb2YgZGF0YXNldHMgKG9yIGEgdmlydHVhbCByZXBvc2l0b3J5KSBmb3Igb3JnYW5pemluZywgbWFuYWdpbmcsIGFuZCBzaG93Y2FzaW5nIGRhdGFzZXRzLiBUaGVyZSBpcyBUT05TIG9mIHNwYXRpYWwgZGF0YSB0aGVyZSwgZXNwZWNpYWxseSBhZnRlciB0aGUgW0NsaW1hdGUgQ2FmZV0oaHR0cHM6Ly9jbGltYXRlaGVhbHRoY2FmZS5vcmcvKSBzdGFydGVkIGhvc3RpbmcgZGF0YSB0aGVyZS4KCi0gQW5kIGRvbid0IGZvcmdldCB0aGUgVUMgRGF2aXMgTGlicmFyeSEgU28gbWFueSByZXNvdXJjZXMgaGVyZSEgU3BlY2lmaWNhbGx5LCBjaGVjayBvdXQ6IGh0dHBzOi8vZ3VpZGVzLmxpYnJhcnkudWNkYXZpcy5lZHUvZ2VvZ3JhcGh5IG9yIGh0dHBzOi8vZ3VpZGVzLmxpYnJhcnkudWNkYXZpcy5lZHUvc29jaWFsLXNjaWVuY2UtZGF0YSAgCgoK