Background

The goals of a visualization can vary:

Usually

A project may involve all three.

Four terms are in common use:

Some view these as interchangeable; others view them as a continuum.

Visualizations can be

Historically, only static graphics were available.

Static graphics remain very useful for exploration, especially if they can be created quickly and easily.

Interactive graphics are very effective for engagement and are used heavily in on-line publications.

Traditional scientific publications are mostly limited to static visualizations, though on-line supplements are becoming more common.

We will focus primarily on static visualizations but will also look at a few interactive options.

Visualization in the Data Analysis Process

A data-driven project typically involves several cycles of

A figure that is often used to capture these steps:

Visualization can help at each stage and is often crucial for

Visualizing the data should almost always come before modeling or summarizing.

A famous example created by Anscombe (1973):

The regression lines for all four groups are essentially identical!

Another set of examples in the same spirit is provided by the package datasauRus; the package vignette shows the examples.

Some Historical Graphics

Easy construction of graphics is highly computational, but a computer isn’t necessary.

Many graphical ideas and elaborate statistical graphs were created in the 1800s and before.

The following are some classical examples.

William Playfair

Playfair’s The Commercial and Political Atlas and Statistical Breviary (1801) introduced a number of new graphs, including:

A bar graph:

A pie chart:

Charles Joseph Minard

Minard developed many elaborate graphs, some available as thumbnail images, including an illustration of Napoleon’s Russia campaign

This can be recreated approximately in R.

Florence Nightingale

Florence Nightingale used a polar area diagram to illustrate causes of death among British troops in the Crimean war.

An approximate recreation in R is available.

John Snow

John Snow used a map (higher resolution) to identify the source of the 1854 London cholera epidemic.

The data is available, and has been used for some interactive visualizations.

A short movie was produced in 2013.

Statistical Atlas of the United States

A Statistical Atlas of the US from the late 1800s shows a number of nice examples.

The complete atlases are also available.

A project to show modern data in a similar style.

Some References

Graphics Software

Most statistical systems provide software for producing static graphics.

Statistical static graphics software typically provides

Some software is more flexible than others.

Non-statistical graph or chart software often emphasizes appearance over content: results may look pretty, but content is hard to extract (e.g. 3D pie charts).

Chart drawing packages can be used to produce good statistical graphs but they may not make it easy.

Some newspapers and magazines have very good graphics departments, including

Sometimes tools like Adobe Illustrator or Inkscape can be used to edit and improve graphics produced by statistical software.

NY Times graphics creators often create initial graphs in R and enhance in Adobe Illustrator

Graphics in R

R has several flexible static graphics system, including

We will mostly be using ggplot.

Some Task Levels for Visualization

In evaluating visualization methods it can be useful to think about several levels of tasks that might be accomplished with a visualiation.

A useful list, from highest to lowest level:

Each higher level builds on the levels below.

As we look at different methods it is useful to consider the tasks they are suited for,

Scalability

Data sets come in many different sizes and shapes.

Some techniques work well for smaller data sets but deteriorate in effectiveness as size increases.

Sometimes modifications are available that slow the deterioration.

Other methods scale better, though usually at the expense of giving up some level of detail.

As we look at different methods it is useful to consider the scale of data sets they are suited for.

Some Interactive Viualizations

LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIERhdGEgVmlzdWFsaXphdGlvbiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CnNvdXJjZShoZXJlOjpoZXJlKCJzZXR1cC5SIikpCmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNiwgZmlnLmFsaWduID0gImNlbnRlciIpCmBgYAo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0YXQ0NTgwLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CgoKIyMgQmFja2dyb3VuZAoKVGhlIGdvYWxzIG9mIGEgdmlzdWFsaXphdGlvbiBjYW4gdmFyeToKCiogZXhwbG9yYXRpb24gYW5kIHVuZGVyc3RhbmRpbmcKCiogcHJlc2VudGF0aW9uIGFuZCBleHBsYW5hdGlvbgoKKiBlbmdhZ2VtZW50CgpVc3VhbGx5CgoqIGluaXRpYWwgZGF0YSBhbmFseXNpcyB0cmllcyB0byBleHBsb3JlIGFuZCB1bmRlcnN0YW5kIHRoZSBkYXRhOwoKKiBhIHNjaWVudGlmaWMgcGFwZXIgd2lsbCB1c2UgdmlzdWFsaXphdGlvbnMgdG8gcHJlc2VudCBhbmQgZXhwbGFpbiByZXN1bHRzOwoKKiBtYWdhemluZXMsIG5ld3NwYXBlcnMsIGFuZCBvbi1saW5lIHB1YmxpY2F0aW9ucyB3aWxsIHVzZSB0aGVtIHRvCiAgYXR0cmFjdCBhbmQgZW5nYWdlIHJlYWRlcnMuCgpBIHByb2plY3QgbWF5IGludm9sdmUgYWxsIHRocmVlLgoKRm91ciB0ZXJtcyBhcmUgaW4gY29tbW9uIHVzZToKCiogc3RhdGlzdGljYWwgZ3JhcGhpY3M7CgoqIGRhdGEgdmlzdWFsaXphdGlvbjsKCiogaW5mb3JtYXRpb24gdmlzdWFsaXphdGlvbjsKCiogaW5mb2dyYXBoaWNzLgoKU29tZSB2aWV3IHRoZXNlIGFzIGludGVyY2hhbmdlYWJsZTsgb3RoZXJzIHZpZXcgdGhlbSBhcyBhIGNvbnRpbnV1bS4KClZpc3VhbGl6YXRpb25zIGNhbiBiZQoKKiBzdGF0aWMsIHBvc3NpYmx5IHByaW50ZWQgb24gcGFwZXI7CgoqIGR5bmFtaWMsIGludm9sdmluZyBhbmltYXRpb24gb3IgaW50ZXJhY3RpdmUgZmVhdHVyZXMuCgpIaXN0b3JpY2FsbHksIG9ubHkgc3RhdGljIGdyYXBoaWNzIHdlcmUgYXZhaWxhYmxlLgoKU3RhdGljIGdyYXBoaWNzIHJlbWFpbiB2ZXJ5IHVzZWZ1bCBmb3IgZXhwbG9yYXRpb24sIGVzcGVjaWFsbHkgaWYgdGhleQpjYW4gYmUgY3JlYXRlZCBxdWlja2x5IGFuZCBlYXNpbHkuCgpJbnRlcmFjdGl2ZSBncmFwaGljcyBhcmUgdmVyeSBlZmZlY3RpdmUgZm9yIGVuZ2FnZW1lbnQgYW5kIGFyZSB1c2VkCmhlYXZpbHkgaW4gb24tbGluZSBwdWJsaWNhdGlvbnMuCgpUcmFkaXRpb25hbCBzY2llbnRpZmljIHB1YmxpY2F0aW9ucyBhcmUgbW9zdGx5IGxpbWl0ZWQgdG8gc3RhdGljCnZpc3VhbGl6YXRpb25zLCB0aG91Z2ggb24tbGluZSBzdXBwbGVtZW50cyBhcmUgYmVjb21pbmcgbW9yZSBjb21tb24uCgpXZSB3aWxsIGZvY3VzIHByaW1hcmlseSBvbiBzdGF0aWMgdmlzdWFsaXphdGlvbnMgYnV0IHdpbGwgYWxzbyBsb29rIGF0CmEgZmV3IGludGVyYWN0aXZlIG9wdGlvbnMuCgoKIyMgVmlzdWFsaXphdGlvbiBpbiB0aGUgRGF0YSBBbmFseXNpcyBQcm9jZXNzCgpBIGRhdGEtZHJpdmVuIHByb2plY3QgdHlwaWNhbGx5IGludm9sdmVzIHNldmVyYWwgY3ljbGVzIG9mCgoqIGltcG9ydGluZywgY2xlYW5pbmcsIGFuZCBhcnJhbmdpbmcgdGhlIGRhdGEgKF9kYXRhIHdyYW5nbGluZ18pCgoqIGV4cGxvcmluZyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgZGF0YQoKKiBtb2RlbGluZyB0aGUgZGF0YSB0byBzZXBhcmF0ZSBzaWduYWwgZnJvbSBub2lzZQoKKiBleHBsb3JpbmcgcmVzaWR1YWxzIGFuZCBvdGhlciBhc3BlY3RzIG9mIG1vZGVsL2RhdGEgbWlzbWF0Y2gKCiogcG9zc2libHkgZ2V0dGluZyBhZGRpdGlvbmFsIGRhdGEKCiogY29tbXVuaWNhdGluZyB0aGUgcmVzdWx0cwoKQSBmaWd1cmUgdGhhdCBpcyBvZnRlbiB1c2VkIHRvIGNhcHR1cmUgdGhlc2Ugc3RlcHM6CgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KG5vbW5vbWwpCmBgYAo8IS0tICMjIG5vbGludCBzdGFydCAtLT4KPGNlbnRlcj4KYGBge25vbW5vbWwsIGVjaG8gPSBGQUxTRX0KI3BhZGRpbmc6IDI1CiNmb250c2l6ZTogMTgKI2ZpbGw6ICNFMURBRkY7ICNENEE5RkYKI3N0cm9rZTogIzg1MTVDNwojbGluZXdpZHRoOiAyCgpbSW1wb3J0XSAtPiBbVW5kZXJzdGFuZF0KW1VuZGVyc3RhbmQgfAogIFtXcmFuZ2xlXSAtPiBbVmlzdWFsaXplXQogIFtWaXN1YWxpemVdIC0+IFtNb2RlbF0KICBbTW9kZWxdIC0+IFtXcmFuZ2xlXQpdCltVbmRlcnN0YW5kXSAtPiBbQ29tbXVuaWNhdGVdCmBgYAo8L2NlbnRlcj4KPCEtLSAjIyBub2xpbnQgZW5kIC0tPgoKVmlzdWFsaXphdGlvbiBjYW4gaGVscCBhdCBlYWNoIHN0YWdlIGFuZCBpcyBvZnRlbiBjcnVjaWFsIGZvcgoKKiB1bmRlcnN0YW5kaW5nIHRoZSBuYXR1cmUgb2YgdGhlIG9yaWdpbmFsIGRhdGE7CgoqIHVuZGVyc3RhbmRpbmcgYSBjb21wbGV4IGZpdHRlZCBtb2RlbDsKCiogdW5kZXJzdGFuZGluZyBkZXBhcnR1cmVzIGZyb20gdGhlIG1vZGVsLgoKVmlzdWFsaXppbmcgdGhlIGRhdGEgc2hvdWxkIGFsbW9zdCBhbHdheXMgY29tZSBiZWZvcmUgbW9kZWxpbmcgb3IKc3VtbWFyaXppbmcuCgpBIGZhbW91cyBleGFtcGxlIGNyZWF0ZWQgYnkgQW5zY29tYmUgKDE5NzMpOgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmFuc2NvbWJlMSA8LSByZXNoYXBlKGFuc2NvbWJlLCB2YXJ5aW5nID0gMSA6IDgsCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJsb25nIiwgc2VwID0gIiIsIHRpbWV2YXIgPSAic2V0IikKZ2dwbG90KGFuc2NvbWJlMSkgKwogICAgZ2VvbV9wb2ludChhZXMoeCA9IHgsIHkgPSB5KSkgKwogICAgZ2VvbV9zbW9vdGgoYWVzKHggPSB4LCB5ID0geSksIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICAgIGZhY2V0X3dyYXAofiBzZXQpCmBgYAoKVGhlIHJlZ3Jlc3Npb24gbGluZXMgZm9yIGFsbCBmb3VyIGdyb3VwcyBhcmUgZXNzZW50aWFsbHkgaWRlbnRpY2FsIQoKPCEtLQoKIyMgc2ltcGxlIGJhc2UgUiB2ZXJzaW9uOgpzcCA8LSBzcGxpdChhbnNjb21iZTEsIGFuc2NvbWJlMSRzZXQpCnQoc2FwcGx5KHNwLCBmdW5jdGlvbihkKSBjb2VmKGxtKHkgfiB4LCBkYXRhID0gZCkpKSkKCiMjIHRpZHl2ZXJzZSB2ZXJzaW9uOgpuZXN0KGFuc2NvbWJlMSwgZGF0YSA9IC1zZXQpICU+JQogICAgbXV0YXRlKGZpdCA9IGxhcHBseShkYXRhLCBmdW5jdGlvbihkKSB0aWR5KGxtKHkgfiB4LCBkYXRhID0gZCkpKSkgJT4lCiAgICB1bm5lc3QoZml0KSAlPiUKICAgIHNlbGVjdChzZXQsIHRlcm0sIGVzdGltYXRlKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAidGVybSIsIHZhbHVlc19mcm9tID0gImVzdGltYXRlIikKLS0+CgpBbm90aGVyIHNldCBvZiBleGFtcGxlcyBpbiB0aGUgc2FtZSBzcGlyaXQgaXMgcHJvdmlkZWQgYnkgdGhlIHBhY2thZ2UKW2BkYXRhc2F1UnVzYF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvcGFja2FnZT1kYXRhc2F1UnVzKTsgdGhlCnBhY2thZ2UKW192aWduZXR0ZV9dKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3BhY2thZ2U9ZGF0YXNhdVJ1cy92aWduZXR0ZXMvRGF0YXNhdXJ1cy5odG1sKQpzaG93cyB0aGUgZXhhbXBsZXMuCgoKIyMgU29tZSBIaXN0b3JpY2FsIEdyYXBoaWNzCgpFYXN5IGNvbnN0cnVjdGlvbiBvZiBncmFwaGljcyBpcyBoaWdobHkgY29tcHV0YXRpb25hbCwgYnV0IGEgY29tcHV0ZXIKaXNuJ3QgbmVjZXNzYXJ5LgoKTWFueSBncmFwaGljYWwgaWRlYXMgYW5kIGVsYWJvcmF0ZSBzdGF0aXN0aWNhbCBncmFwaHMgd2VyZQpjcmVhdGVkIGluIHRoZSAxODAwcyBhbmQgYmVmb3JlLgoKVGhlIGZvbGxvd2luZyBhcmUgc29tZSBjbGFzc2ljYWwgZXhhbXBsZXMuCgoKIyMjIFdpbGxpYW0gUGxheWZhaXIKCltQbGF5ZmFpcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lsbGlhbV9QbGF5ZmFpcikncyBfVGhlCkNvbW1lcmNpYWwgYW5kIFBvbGl0aWNhbCBBdGxhc18gYW5kIF9TdGF0aXN0aWNhbCBCcmV2aWFyeV8gKDE4MDEpCmludHJvZHVjZWQgYSBudW1iZXIgb2YgbmV3IGdyYXBocywgaW5jbHVkaW5nOgoKW0EgYmFyIGdyYXBoOl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlsZTpQbGF5ZmFpcl9CYXJjaGFydC5naWYpCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoSU1HKCJQbGF5ZmFpcl9CYXJjaGFydC5naWYiKSkKYGBgCgpbQSBwaWUgY2hhcnQ6XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaWxlOlBsYXlmYWlyLXBpZWNoYXJ0LmpwZykKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI2MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhJTUcoIlBsYXlmYWlyLXBpZWNoYXJ0LmpwZyIpKQpgYGAKCgojIyMgQ2hhcmxlcyBKb3NlcGggTWluYXJkCgpNaW5hcmQgZGV2ZWxvcGVkClttYW55IGVsYWJvcmF0ZSBncmFwaHNdKGh0dHBzOi8vd3d3LmRhdGF2aXMuY2EvZ2FsbGVyeS9taW5iaWIucGhwKSwKc29tZSBhdmFpbGFibGUgYXMKW3RodW1ibmFpbCBpbWFnZXNdKGh0dHBzOi8vd3d3LmRhdGF2aXMuY2EvZ2FsbGVyeS9taW5iaWIvKSwgaW5jbHVkaW5nCmFuIGlsbHVzdHJhdGlvbiBvZgpbTmFwb2xlb24ncyBSdXNzaWEgY2FtcGFpZ25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZpbGU6TWluYXJkLnBuZykKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI3MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhJTUcoIk1pbmFyZC5wbmciKSkKYGBgCgpUaGlzIGNhbiBiZSBbcmVjcmVhdGVkCmFwcHJveGltYXRlbHldKApgciBXTE5LKCJleGFtcGxlcy5odG1sI21pbmFyZHMtZ3JhcGgtb2YtbmFwb2xlb25zLXJ1c3NpYS1jYW1wYWlnbiIpYCkKaW4gUi4KCgojIyMgRmxvcmVuY2UgTmlnaHRpbmdhbGUKCkZsb3JlbmNlIE5pZ2h0aW5nYWxlIHVzZWQgYSBbcG9sYXIgYXJlYQpkaWFncmFtXShpbWcvTmlnaHRpbmdhbGUtbW9ydGFsaXR5LmpwZykgdG8gaWxsdXN0cmF0ZSBjYXVzZXMgb2YgZGVhdGgKYW1vbmcgQnJpdGlzaCB0cm9vcHMgaW4gdGhlIENyaW1lYW4gd2FyLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjYwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKElNRygiTmlnaHRpbmdhbGUtbW9ydGFsaXR5LmpwZyIpKQpgYGAKCkFuIGFwcHJveGltYXRlIHJlY3JlYXRpb24gaW4gUiBpcwpbYXZhaWxhYmxlXShgciBXTE5LKCJhbW91bnRzLmh0bWwjcG9sYXItYXJlYS1jaGFydHMiKWApLgoKCiMjIyBKb2huIFNub3cKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI5MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhJTUcoInNub3dtYXBfMTg1NC5qcGciKSkKYGBgCgpbSm9obgpTbm93XShodHRwczovL3NwaHdlYi5idW1jLmJ1LmVkdS9vdGx0L21waC1tb2R1bGVzL2VwL2VwNzEzX2hpc3RvcnkvRVA3MTNfSGlzdG9yeTYuaHRtbCkKdXNlZCBhIFttYXBdKGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEzMTIwOTIwNTIwMS9odHRwOi8vd3d3LnBoLnVjbGEuZWR1L2VwaS9zbm93L3Nub3dtYXAxLnBkZikgKFtoaWdoZXIKcmVzb2x1dGlvbl0oaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMjIwODA3MjIzNzA0L2h0dHA6Ly93d3cucGgudWNsYS5lZHUvZXBpL3Nub3cvc25vd21hcDFfMTg1NF9sZ2UuaHRtKSkKdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSBvZiB0aGUgMTg1NCBMb25kb24gY2hvbGVyYSBlcGlkZW1pYy4KCjwhLS0gQW4KICBbZW5oYW5jZWQKICB2ZXJzaW9uXShodHRwOi8vd3d3LmRhdGF2aXMuY2EvZ2FsbGVyeS9oaXN0b3JpY2FsLnBocCNzbm93KSBpcwogIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5kYXRhdmlzLmNhPi4tLT4KClRoZSBkYXRhIGlzClthdmFpbGFibGVdKGh0dHBzOi8vYmxvZy5ydHdpbHNvbi5jb20vam9obi1zbm93cy1jaG9sZXJhLWRhdGEtaW4tbW9yZS1mb3JtYXRzLyksCmFuZCBoYXMgYmVlbiB1c2VkIGZvciBzb21lIFtpbnRlcmFjdGl2ZQp2aXN1YWxpemF0aW9uc10oaHR0cHM6Ly9mcmVha29ub21ldHJpY3MuaHlwb3RoZXNlcy5vcmcvMTk0OTkpLgoKQSBbc2hvcnQgbW92aWVdKGh0dHA6Ly93d3cuc25vd3RoZW1vdmllLmNvbS8pIHdhcyBwcm9kdWNlZCBpbiAyMDEzLgoKCiMjIyBTdGF0aXN0aWNhbCBBdGxhcyBvZiB0aGUgVW5pdGVkIFN0YXRlcwoKYGBge3IsIGVjaG8gPSBGQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoSU1HKCJ1cy1hdGxhcy5wbmciKSkKYGBgCkEgU3RhdGlzdGljYWwgQXRsYXMgb2YgdGhlIFVTIGZyb20gdGhlIGxhdGUgMTgwMHMgc2hvd3MgYSBudW1iZXIgb2YKbmljZQpbZXhhbXBsZXNdKGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MTAxODE2MjYyMi9odHRwOi8vd3d3LmhhbmRzb21lYXRsYXMuY29tLykuCgpUaGUgY29tcGxldGUgYXRsYXNlcyBhcmUgYWxzbwpbYXZhaWxhYmxlXShodHRwczovL3d3dy5jZW5zdXMuZ292L2hpc3Rvcnkvd3d3L3JlZmVyZW5jZS9wdWJsaWNhdGlvbnMvc3RhdGlzdGljYWxfYXRsYXNlc18xLmh0bWwpLgoKW0EgcHJvamVjdCB0byBzaG93IG1vZGVybiBkYXRhIGluIGEgc2ltaWxhcgpzdHlsZV0oaHR0cDovL3Byb2plY3RzLmZsb3dpbmdkYXRhLmNvbS9hdGxhcy8pLgoKCiMjIyBTb21lIFJlZmVyZW5jZXMKCiogRWR3YXJkIFR1ZnRlICgxOTgzKSwgX1RoZSBWaXN1YWwgRGlzcGxheSBvZiBRdWFudGl0YXRpdmUKICBJbmZvcm1hdGlvbl8uCgoqIE1pY2hhZWwgRnJpZW5kbHkgKDIwMDgpLCAiVGhlIEdvbGRlbiBBZ2Ugb2YgU3RhdGlzdGljYWwKICAgIEdyYXBoaWNzLCIgX1N0YXRpc3RpY2FsIFNjaWVuY2VfIDgoNCksIDUwMi3igJM1MzUKCiogTWljaGFlbCBGcmllbmRseSdzIFtIaXN0b3JpY2FsCiAgICAgIE1pbGVzdG9uZXNdKGh0dHA6Ly93d3cuZGF0YXZpcy5jYS9nYWxsZXJ5L2hpc3RvcmljYWwucGhwKSBhdAogICAgPGh0dHA6Ly93d3cuZGF0YXZpcy5jYS8+CgoqIFtBIFdpa2lwZWRpYQogIGVudHJ5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbmZvcm1hdGlvbl9ncmFwaGljcyNIaXN0b3J5KQoKCiMjIEdyYXBoaWNzIFNvZnR3YXJlCgpNb3N0IHN0YXRpc3RpY2FsIHN5c3RlbXMgcHJvdmlkZSBzb2Z0d2FyZSBmb3IgcHJvZHVjaW5nIHN0YXRpYyBncmFwaGljcy4KClN0YXRpc3RpY2FsIHN0YXRpYyBncmFwaGljcyBzb2Z0d2FyZSB0eXBpY2FsbHkgcHJvdmlkZXMKCiogYSB2YXJpZXR5IG9mIHN0YW5kYXJkIHBsb3RzIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zCiAgICBmb3IgdGhpbmdzIGxpa2UKCiAgICAqIGJpbiB3aWR0aHMKICAgICogYXhpcyBzY2FsaW5nCiAgICAqIGFzcGVjdCByYXRpbwoKKiBhYmlsaXR5IHRvIGN1c3RvbWl6ZSBwbG90IGF0dHJpYnV0ZXMKCiogYWJpbGl0eSB0byBhZGQgaW5mb3JtYXRpb24gdG8gcGxvdHMsIHN1Y2ggYXMKCiAgICAqIGxlZ2VuZHMKICAgICogYWRkaXRpb25hbCBwb2ludHMsIGxpbmVzCiAgICAqIGFubm90YXRpb25zCiAgICAqIHN1cGVyaW1wb3NlZCBwbG90cwoKKiBhYmlsaXR5IHRvIHByb2R1Y2UgbmV3IGtpbmRzIG9mIHBsb3RzCgpTb21lIHNvZnR3YXJlIGlzIG1vcmUgZmxleGlibGUgdGhhbiBvdGhlcnMuCgo8IS0tIER5bmFtaWMgZ3JhcGhpY2FsIHNvZnR3YXJlIHNob3VsZCBwcm92aWRlIHNpbWlsYXIgZmxleGliaWxpdHkgYnV0Cm9mdGVuIGRvZXMgbm90LiAtLT4KCk5vbi1zdGF0aXN0aWNhbCBncmFwaCBvciBjaGFydCBzb2Z0d2FyZSBvZnRlbiBlbXBoYXNpemVzIGFwcGVhcmFuY2UKb3ZlciBjb250ZW50OiByZXN1bHRzIG1heSBsb29rIHByZXR0eSwgYnV0IGNvbnRlbnQgaXMgaGFyZCB0byBleHRyYWN0CihlLmcuIDNEIHBpZSBjaGFydHMpLgoKQ2hhcnQgZHJhd2luZyBwYWNrYWdlcyBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGdvb2Qgc3RhdGlzdGljYWwgZ3JhcGhzCmJ1dCB0aGV5IG1heSBub3QgbWFrZSBpdCBlYXN5LgoKU29tZSBuZXdzcGFwZXJzIGFuZCBtYWdhemluZXMgaGF2ZSB2ZXJ5IGdvb2QgZ3JhcGhpY3MgZGVwYXJ0bWVudHMsIGluY2x1ZGluZwoKKiBOZXcgWW9yayBUaW1lcwoqIEVjb25vbWlzdAoqIEd1YXJkaWFuCiogTEEgVGltZXMKClNvbWV0aW1lcyB0b29scyBsaWtlIEFkb2JlIElsbHVzdHJhdG9yIG9yCltJbmtzY2FwZV0oaHR0cHM6Ly9pbmtzY2FwZS5vcmcvZW4vKSBjYW4gYmUgdXNlZCB0byBlZGl0IGFuZCBpbXByb3ZlCmdyYXBoaWNzIHByb2R1Y2VkIGJ5IHN0YXRpc3RpY2FsIHNvZnR3YXJlLgoKW05ZIFRpbWVzIGdyYXBoaWNzIGNyZWF0b3JzXShodHRwczovL2Jsb2cucmV2b2x1dGlvbmFuYWx5dGljcy5jb20vMjAxMC8xMi9kYXRhLXZpc3VhbGl6YXRpb24tcHJhY3RpY2VzLWF0LXRoZS1uZXcteW9yay10aW1lcy5odG1sKQogIG9mdGVuIGNyZWF0ZSBpbml0aWFsIGdyYXBocyBpbiBSIGFuZCBlbmhhbmNlIGluIEFkb2JlIElsbHVzdHJhdG9yCgoKIyMgR3JhcGhpY3MgaW4gUgoKUiBoYXMgc2V2ZXJhbCBmbGV4aWJsZSBzdGF0aWMgZ3JhcGhpY3Mgc3lzdGVtLCBpbmNsdWRpbmcKCiogX2Jhc2UgZ3JhcGhpY3NfLCBvciBfc3RhbmRhcmQgZ3JhcGhpY3NfLCAgcHJvdmlkZWQgYnkgdGhlIGBncmFwaGljc2AKICBwYWNrYWdlIGluIHRoZSBiYXNlIFIgZGlzdHJpYnV0aW9uOwoKKiBfdHJlbGxpcyBncmFwaGljc18sIG9yIF9sYXR0aWNlIGdyYXBoaWNzXywgcHJvdmlkZWQgYnkgdGhlIGBsYXR0aWNlYAogIHBhY2thZ2UgKG9uZSBvZiB0aGUgc3RhbmRhcmQgX1JlY29tbWVuZGVkXyBwYWNrYWdlcyB0eXBpY2FsbHkKICBidW5kbGVkIHdpdGggUik7CgoqIFtgZ2dwbG90MmBdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnLykgYmFzZWQgb24gV2lsa2luc29uJ3MgX0dyYW1tYXIgb2YKICBHcmFwaGljc18gYW5kIGF2YWlsYWJsZSBmcm9tIENSQU4uCgpXZSB3aWxsIG1vc3RseSBiZSB1c2luZyBgZ2dwbG90YC4KCjwhLS0KU29tZSBpbnRlcmFjdGl2ZSBleHBsb3JhdG9yeSBncmFwaGljcyBwYWNrYWdlcyBpbmNsdWRlCgoqIGBnZ29iaWAgZm9yIGV4cGxvcmluZyBwb2ludCBjbG91dHMgaW4gaGlnaGVyIGRpbWVuc2lvbnMKKiBgcmdsYCBmb3IgZm9yIDNEIHJlbmRlcmluZyBhbmQgdmlld2luZwoqIGBpcGxvdHNgLCBhIEphdmEtYmFzZWQgZHluYW1pYyBncmFwaGljcyBzeXN0ZW0gZm9yIGxpbmtlZCBwbG90cwoKCiMjIyBTb21lIEludGVybmFsIFN0cnVjdHVyZQpTdGF0aWMgZ3JhcGhpY3Mgb3V0cHV0IGlzIHByb2R1Y2VkIGJ5IGEgX2RldmljZV8uIFRoZXNlIGNhbiBiZQoKKiBzY3JlZW4gZGV2aWNlcywgbGlrZSBgV2luZG93c2AsIGBRdWFydHpgLCBgWDExYAoqIGZpbGUgZGV2aWNlcywgbGlrZSBgcGRmYCBvciBgcG5nYAoKRGV2aWNlcyBhcmUgdXNlZCB0aHJvdWdoIGEgX2RldmljZS1pbmRlcGVuZGVudCBsYXllcl8gaW1wbGVtZW50ZWQgaW4KdGhlIGBnckRldmljZXNgIHBhY2thZ2UuCgpCYXNlIGdyYXBoaWNzIGlzIGltcGxlbWVudGVkIGRpcmVjdGx5IHVzaW5nIHRoaXMgbGF5ZXIuCgpgbGF0dGljZWAgYW5kIGBnZ3Bsb3QyYCBhcmUgYnVpbHQgb24gYW4gaW50ZXJtZWRpYXRlIGZyYW1ld29yayBrbm93biBhcwpfZ3JpZCBncmFwaGljc18gYW5kIGltcGxlbWVudGVkIGluIHRoZSBgZ3JpZGAgcGFja2FnZS4KClVzaW5nIGBncmlkYCBmZWF0dXJlcyBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIGZvciBhcnJhbmdpbmcgbXVsdGlwbGUKYGxhdHRpY2VgIG9yIGBnZ3Bsb3QyYCBwbG90cyBvbiBhIHBhZ2UuCgpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhJTUcoIlJncmFwaGljcy5qcGciKSkKYGBgCi0tPgoKCiMjIFNvbWUgVGFzayBMZXZlbHMgZm9yIFZpc3VhbGl6YXRpb24KCkluIGV2YWx1YXRpbmcgdmlzdWFsaXphdGlvbiBtZXRob2RzIGl0IGNhbiBiZSB1c2VmdWwgdG8gdGhpbmsgYWJvdXQKc2V2ZXJhbCBsZXZlbHMgb2YgdGFza3MgdGhhdCBtaWdodCBiZSBhY2NvbXBsaXNoZWQgd2l0aCBhIHZpc3VhbGlhdGlvbi4KCkEgdXNlZnVsIGxpc3QsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QgbGV2ZWw6CgoqICoqQW5hbHl6ZSoqOiBJZGVudGlmeSBwYXR0ZXJucywgZGlzdHJpYnV0aW9ucywgcHJlc2VuY2Ugb2Ygb3V0bGllcnMKICBvciBjbHVzdGVycywgb3RoZXIgaW50ZXJlc3RpbmcgZmVhdHVyZXMuCgoqICoqU2VhcmNoKio6IExvb2sgdXAgYXNwZWN0cyBvZiBhIGZlYXR1cmUga25vd24gaW4gYWR2YW5jZSBvcgogIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpYXRpb24uCgoqICoqUXVlcnkqKjogSWRlbnRpZnksIGNvbXBhcmUgZmVhdHVyZXMgb2YgaW5kaXZpZHVhbCBpdGVtcy4KCkVhY2ggaGlnaGVyIGxldmVsIGJ1aWxkcyBvbiB0aGUgbGV2ZWxzIGJlbG93LgoKQXMgd2UgbG9vayBhdCBkaWZmZXJlbnQgbWV0aG9kcyBpdCBpcyB1c2VmdWwgdG8gY29uc2lkZXIgdGhlIHRhc2tzCnRoZXkgYXJlIHN1aXRlZCBmb3IsCgoKIyMgU2NhbGFiaWxpdHkKCkRhdGEgc2V0cyBjb21lIGluIG1hbnkgZGlmZmVyZW50IHNpemVzIGFuZCBzaGFwZXMuCgpTb21lIHRlY2huaXF1ZXMgd29yayB3ZWxsIGZvciBzbWFsbGVyIGRhdGEgc2V0cyBidXQgZGV0ZXJpb3JhdGUgaW4KZWZmZWN0aXZlbmVzcyBhcyBzaXplIGluY3JlYXNlcy4KClNvbWV0aW1lcyBtb2RpZmljYXRpb25zIGFyZSBhdmFpbGFibGUgdGhhdCBzbG93IHRoZSBkZXRlcmlvcmF0aW9uLgoKT3RoZXIgbWV0aG9kcyBzY2FsZSBiZXR0ZXIsIHRob3VnaCB1c3VhbGx5IGF0IHRoZSBleHBlbnNlIG9mIGdpdmluZyB1cApzb21lIGxldmVsIG9mIGRldGFpbC4KCkFzIHdlIGxvb2sgYXQgZGlmZmVyZW50IG1ldGhvZHMgaXQgaXMgdXNlZnVsIHRvIGNvbnNpZGVyIHRoZSBzY2FsZSBvZiBkYXRhCnNldHMgdGhleSBhcmUgc3VpdGVkIGZvci4KCgojIyBTb21lIEludGVyYWN0aXZlIFZpdWFsaXphdGlvbnMKCiogW0Jsb29tYmVyZydzIGhvdHRlc3QgeWVhciBvbiByZWNvcmQKICAgIHZpc3VhbGl6YXRpb25dKGh0dHBzOi8vd3d3LmJsb29tYmVyZy5jb20vZ3JhcGhpY3MvaG90dGVzdC15ZWFyLW9uLXJlY29yZC8pCiAgICA8IS0tIGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvY2FnL3RpbWUtc2VyaWVzLwogICAgaHR0cDovL3d3dy5ucHIub3JnL3NlY3Rpb25zL3RoZXR3by13YXkvMjAxNy8wMS8xOC81MTA0MDU3MzkvMjAxNi13YXMtdGhlLWhvdHRlc3QteWVhci15ZXQtc2NpZW50aXN0cy1kZWNsYXJlLS0+CgoqIFtXZWFsdGggJiBIZWFsdGggb2YgTmF0aW9uc10oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy90b29scy8pIGF0CiAgW0dhcG1pbmRlcl0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy8pIGFuZCBIYW5zIFJvc2xpbmcncyBbMjAwIHllYXJzCiAgdGhhdCBjaGFuZ2VkIHRoZQogIHdvcmxkXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL3ZpZGVvcy8yMDAteWVhcnMtdGhhdC1jaGFuZ2VkLXRoZS13b3JsZC8pCiAgdmlkZW8uCgoqIFtHdW4gdmlvbGVuY2UgYXQgdGhlIGxvY2FsCiAgbGV2ZWxdKGh0dHBzOi8vd3d3LnRoZWd1YXJkaWFuLmNvbS91cy1uZXdzL25nLWludGVyYWN0aXZlLzIwMTcvamFuLzA5L3NwZWNpYWwtcmVwb3J0LWZpeGluZy1ndW4tdmlvbGVuY2UtaW4tYW1lcmljYSkKCjwhLS0KUGFnZSBpcyBzdGlsbCB0aGVyZSBidXQgZGF0YSBiZWhpbmQgdmlzdWFsIHNlZW1zIHRvIGJlIGdvbmUKCiogW1N1YndheSBjcmltZSBvbiBpbiBOZXcKICBZb3JrXShodHRwOi8vd3d3Lm55ZGFpbHluZXdzLmNvbS9uZXcteW9yay9ueWMtY3JpbWUvZGFpbHktbmV3cy1hbmFseXNpcy1yZXZlYWxzLWNyaW1lLXJhbmtpbmdzLWNpdHktc3Vid2F5LXN5c3RlbS1hcnRpY2xlLTEuMTgzNjkxOCkKLS0+Cgo8IS0tClBheXdhbGxlZAoKKiBbV2hvIHdhcyBoZWxwZWQgYnkKICBPYmFtYWNhcmVdKGh0dHA6Ly93d3cubnl0aW1lcy5jb20vaW50ZXJhY3RpdmUvMjAxNC8xMC8yOS91cHNob3Qvb2JhbWFjYXJlLXdoby13YXMtaGVscGVkLW1vc3QuaHRtbD9fcj0wJmFidD0wMDAyJmFiZz0wKQotLT4KCiogW1BhdGhzIHRvIHRoZSBXaGl0ZSBIb3VzZSBpbgogIDIwMTJdKGh0dHBzOi8vYXJjaGl2ZS5ueXRpbWVzLmNvbS93d3cubnl0aW1lcy5jb20vaW50ZXJhY3RpdmUvMjAxMi8xMS8wMi91cy9wb2xpdGljcy9wYXRocy10by10aGUtd2hpdGUtaG91c2UuaHRtbD9fcj0yKQoKKiBbVS5TLiBQb3B1bGF0aW9uIFB5cmFtaWQgRnJvbQogIDE5ODAtMjA1MF0oaHR0cHM6Ly93d3cudmlzdWFsY2FwaXRhbGlzdC5jb20vdXMtcG9wdWxhdGlvbi1weXJhbWlkLTE5ODAtMjA1MC8pCgoqIExBIFRpbWVzIHllYXJzIGluIGdyYXBoaWNzOgogIFsyMDE0XShodHRwczovL2dyYXBoaWNzLmxhdGltZXMuY29tLzIwMTQtaW4tZ3JhcGhpY3MvKSwKICBbMjAxNV0oaHR0cHM6Ly9ncmFwaGljcy5sYXRpbWVzLmNvbS8yMDE1LWluLWdyYXBoaWNzLyksIGFuZAogIFsyMDIwXShodHRwczovL3d3dy5sYXRpbWVzLmNvbS9wcm9qZWN0cy9kYXRhLWFuZC1ncmFwaGljcy0yMDIwLykuCgo8IS0tIE5ZVCBhbmQgVGFibGVhdSB2aXMgZXhhbXBsZXM6Cmh0dHBzOi8vdGxkci5uZXR0aW1lLm9yZy9AdGIvMTA5NjA5OTEzMjcyNjA2NzYxIC0tPgoKKiBOWSBUaW1lcyB5ZWFyIGluIGdyYXBoaWNzOgogIFsyMDIyXShodHRwczovL3d3dy5ueXRpbWVzLmNvbS9pbnRlcmFjdGl2ZS8yMDIyLzEyLzI4L3VzLzIwMjIteWVhci1pbi1ncmFwaGljcy5odG1sKQoKKiBbU29tZSBUYWJsZWF1IHZpc3VhbGl6YXRpb25zIGZyb20KICAyMDIyXShodHRwczovL3d3dy50YWJsZWF1LmNvbS9ibG9nL3RhYmxlYXUtcHVibGljLXZpei13cmFwLWludGVyZXN0aW5nLWRhdGEtdmlzdWFsaXphdGlvbnMtMjAyMikuCg==