“Via dynamic and interactive graphics, today’s technology allows
students to visualize externally what they have difficulty representing
mentally.”
— David
Moreau (2015), p. 2.
Research on human perception have taught us a lot about how to better
communicate data through illustrations and graphics. Visualizing
data-driven results continues to improve through psychological research
and technological innovations. Today, researchers have greater capacity
to collect better-quality data and in larger quantities (e.g., online
surveys, cell phone applications, wearable technologies, social media,
Google Analytics, etc.). In order to preserve the integrity and purpose
of our graphs, data visualizations must be able to accommodate this
surge in information volume and complexity of the digital age. Yet,
despite the exponential growth in computing power and software tools,
psychology researchers continue to rely mostly on static data
visualizations.
The (Optical) Illusion of Current Data Visualization Practices
Static visualizations are entirely acceptable and appropriate for
many purposes (as I hope the figures in this paper), however, as we
transition into the big data era, relying only on static graphics may
not be enough (Heer
& Kandel, 2012). Static graphs can limit the type and amount of
information one wishes to communicate, or the speed and comprehension of
details the reader is meant to perceive; certain types of static graphs
can often be no more than “visual tables” (Weissgerber et al.,
2015, p. 1). In a 2014 systematic review of research articles
published in the top 25% physiology journals, the authors found that the
most common type of data visualizations are static graphs. And
specifically, static bar graphs (Weissgerber et al.,
2015). Although a recent systematic review in psychological research
has yet to be published (to my knowledge), it appears that psychology
suffers from the same graph use issues as physiology and other
disciplines. The #barbarplots
project (2017) examined 131 research articles from the first six
month of 2016 in four high impact psychology journals and found that
there is a substantial presence of static bar graphs. Particularly, from
a total of 104 graphs presented, 55% of figures were static bar graphs.
Static bar graphs have been heavily criticized (especially with
continuous data) for increasing the risk of misinterpreting research
findings and providing limited information (Cooper et al., 2002;
Gelman,
2017; Lane & Sándor,
2009; Schriger et
al., 2006; Saxon, 2015; Weissgerber et al.,
2015). For example, a static bar graph can portray potentially
countless different distributions (e.g., bimodal, skewed, containing
outliers, difference in sample size) the same way if their means and
variability are similar (see Figure 1).
This can mislead readers to make a certain set of assumptions (e.g.,
normality, equal sample size and variability, no outliers, etc.) which
in reality might have never been met. In addition, if non-independent –
or paired – data are presented using static bar graphs, readers might
falsely infer independence and ignore within-subject differences (or
lack thereof; see Figure 2).
Of course, there are numerous types of static data visualizations,
other than bar graphs, that might be better suited for the researcher or
data scientist’s needs (e.g., scatterplots, line graphs, violin plots).
Yet, static graphs (unintentionally) force the reader to look at the
data through a single lens – only the one that the authors intended. The
authors have complete and utter control over the type of graph, which
variables go in, the scaling or truncation of axes, the angle or point
of view (e.g., in a 3D plot), the colours, sizes, and more. Many static
graphs can also be inaccessible to some readers. For example, readers
who are colour blind or have difficulty with depth perception, graphs
that include very small or too many labels, etc.
Furthermore,
static figures prevent readers from exploring the visualized data
independently and assessing data-driven conclusions impartially: readers
cannot manipulate the graph, inspect particular observations, rescale
the axes, or visualize different analyses. By doing so, we
unintentionally limit the information presented and therefore
transparency. This might sound normal; it is the default after all, we
have been seeing static figures in academic journals for decades. But we
now have the capacity to allow readers to share control over how the
data is visualized, so why do we not make it the new “normal?”
This unintentional lack of transparency is problematic in data
visualization as it is in other research aspects such as reporting
practices (e.g., limited/ambiguous reporting, excluding analyses due to
lack of statistical significance, etc.). Reporting practices, among
other research facets, have been directly addressed and are improving
thanks to various taskforces, the open science
framework (OSF), and more. Given recent concerns about the
replication crisis, publication bias, and lack of transparency in
psychological research, a reform in data visualization should also be
considered.
Enter Beyond-Static Graphics
Interactive and dynamic data visualizations can accommodate virtually
endless amount and types of information. In fact, with interactive
dynamic visualizations, readers can tailor and modify the graphic to
display the details of their choosing. But, before we go deeper into why
we should implement these data visualization methods, we first need to
define what are interactive and dynamic visualizations. In this paper, I
define three types of non-static data visualizations: interactive,
dynamic, and interactive dynamic data visualizations. However, I will
mostly focus on the latter type, interactive dynamic, due its advanced
features and benefits.
In an interactive data
visualization (IDV) the user can probe the presentation to view certain
aspects of the data (e.g., value on another variable), and thus interact
with the display directly instead of using menus or cross-referencing a
table (Ward et al.,
2015). Other interactive features may include scaling or zooming in
and out on a particular slice of data, highlighting certain categories
or values, rotating (in 3D graphics) or panning over, and more. An
example of IDV is presented in Figure 3 and can be accessed here.
Figure 3. Interactive data visualization. This is a
3D scatter plot with interactive features. The dataset presented is
‘mtcars’ from the ‘datasets’ R package (R Core Team, 2022). The plot
displays the relationship between different vehicle types (i.e.,
automatic in red and manual in blue), weight (x axis), time it takes to
drive a quarter of a mile in minutes (y axis), and horsepower (z axis).
The user can rotate the plot 360°, zoom in and out, pan the “camera”
over, highlight one or more categories (e.g., red; automatic), hover
over any individual observations to see its coordinates, and download a
snapshot of the current position of the plot.
Dynamic data visualizations (DDV) are
representations of data that can change their graphical make-up while
presented (Ploetzner
& Lowe, 2004; Schnotz et al., 1999). Kaput (1992) considered time
as a dimension in DDV. This is, of course, true when visualizing
time-series, hierarchical, or longitudinal designs, or to depict a
process (e.g., neuron firing). However, in other designs, I argue, any
variable – whether categorical or continuous – can serve as a dimension
in DDV (e.g., treatment condition, IQ, etc.). In DDV, displayed values
of the outcome can change (while still presented) as a function of
another variable (e.g., time, group). In a linear, or automatic DDV,
changes transpire on their own and cannot be altered by the user or
reader. An example of DDV is presented in Figure 4 and is available here.
Figure 4. Dynamic data visualization. This is a
scatter plot with dynamic features. The dataset presented comes from the
‘gapminder’ R package (Bryan, 2017). The plot
displays the relationship between gross domestic product per capita
(gdpPercap; x axis) and life expectancy in years (lifeExp; y axis)
across different times, from 1952 to 2007 (bottom scale). The user can
zoom in and out, highlight one or more categories (e.g., blue; Europe),
hover over any individual observations to see specific details (as seen
in the red box), and when the “play” button is pressed (bottom left
corner), changes across the years can be seen via animation.
Lastly, as its name suggests, interactive dynamic data
visualizations (IDDV) combine elements from both IDV and DDV
and is therefore the best of both worlds. In IDDV, any change in the
graphical structure follows a direct action from the user. This way,
users have control over – or, can manipulate – how the data is displayed
(Ploetzner
& Lowe, 2004). In many cases, the viewer even has control over
how the data is analyzed (see below example by Ellis &
Merdian, 2015). Schwan and
Riempp (2004) noted that IDDV “enable the user to adapt the
presentation to [their] individual cognitive needs” (p. 296). An example
of IDDV is presented in Figure 5 and is available here.
Figure 5. Interactive dynamic data visualization.
This app allows users to visualize and analyze COVID-19 and SARS
geographic and descriptive data across time using both interactive and
dynamic features created by Parker (2022).
Users can browse the different tabs at the top, adjust the date on the
left blue scale, hover over any region or observation, apply
filters/masks, pan over, zoom, view the raw data, and create a
customized line graph.
Although there are mixed conclusions about the effectiveness of IDV
and DDV (e.g., Hegarty,
2004; Hood et
al., 2019; Ploetzner
& Lowe, 2004; Rolfes et al., 2020;
Schnotz et al., 1999;
Schwan
& Riempp, 2004), there is a growing body of literature
advocating for the use of IDDV in both education and research settings
(e.g., Ellis &
Merdian, 2015; Heer, & Shneiderman,
2012; Rolfes et
al., 2020; Ward et
al., 2015).
Why We Should Use Interactive Dynamic Graphics in Psychology
There are many clear advantages to incorporating IDDV in academic
articles and teaching. In this paper, I focus only on a few key reasons
relating to open research practices, live data updates after
visualization deployment, and effective data communication:
IDDV Incite Transparent Research Practices
Concerns about the credibility of previously published results in
psychological research inspired new standards of recommended practices
such as preregistration, registered reports, open data, shared analyses,
etc. IDDV are much more aligned with the new standards of transparent
research than static graphs. Thoughtful IDDV allow careful inspection of
every dimension of the data, whereas with static visualizations, this is
usually impossible or can make the graph too complex to comprehend. More
advanced IDDV can even grant the reader the ability to explore and
reanalyze the data on their own. This is perhaps one of the highest
levels of open research practices. For example, in the IDDV
example created by
Ellis and Merdian (2015) using R Shiny app, the user can select the
variables of their choice, differentiate by group, apply different
filters or masks, and recalculate the regression equation and
correlation coefficient (see Figure 6).
Figure 6. Interactive dynamic example with exploratory data
analysis applications. This interactive dynamic figure allows
the user to select the variables of their choice (from the dropdown
menus at the top left), differentiate by group (male, female), apply
different filters or masks (previous victim, not previous victim), and
recalculate the regression equation and correlation coefficient (bottom
right table). The user can also inspect the data using a different graph
type (e.g., boxplot) by switching to the Boxplot tab above the
figure.
Furthermore, with tools such as R Shiny, where the data and analyses
are stored on the author’s server, users can have all the benefits of
having access to the full dataset without compromising participant
confidentiality. One of the main factors preventing researchers from
making their data openly available to external evaluators is the risk of
breaching ethical protocols and exposing private information. However,
using IDDV, the data can still be investigated and reanalyzed by the
user without actually having to share the data. Note that we could
explore and visualize data in the Ellis and Merdian
(2015) example above without having access to the Fear of Crime
dataset.
Live Data Visualizations
IDDV can continue to receive new data and update its visual structure
accordingly, even after its deployment. Normally, once a static plot or
graph are produced, the figure cannot be changed. This can influence our
conclusions, too; once a paper is finalized, the figures are produced,
scientists publish their paper and (usually) never look back. However,
in the current era of big data and cloud technology, it is possible and
often useful to stream and visualize our data live as it is being
collected. Imagine you are conducting a study looking at various
transactions on a social media platform (e.g., Facebook, Twitter,
Instagram). Using IDDV, researchers can follow and visualize their data
in real-time as social transactions take place. For example, there is an
existing dashboard visualizing a livestream downloads of R packages from
CRAN (Sievert et al.,
2022; see Figure 7). A similar app was attempted by Hadley Wickham
(2019). This novel approach opens a lot of investigative avenues and
provides useful tools to expend the arsenal of data visualization and
research capabilities.
Figure 7. Interactive dynamic Live Data
Visualization. livestream of download logs from cran.rstudio.com. This Shiny app
illustrates the names and frequencies of R packages downloaded by users.
Viewers can also manipulate the rate and capacity of the visualization,
scan the raw logs in the top tab, review the source code, and share this
app on various social media platforms.
IDDV are More Effective at Communicating Data
As Moreau
beautifully put it, “[v]ia dynamic and interactive graphics, today’s
technology allows students to visualize externally what they have
difficulty representing mentally” (2015, p. 2). In a recent study,
Hood and colleagues
(2020) found that IDDV figures in digital publications were more
effective at communicating main effects and null relationships than
static graphs. In another study by Rolfes et
al. (2020), students who were given materials visualized using IDDV
performed significantly better than students in the static visualization
group. These results suggest that IDDV might be more effective in
communicating data. Furthermore, IDDV make active exploration possible
where readers are free to interact with their data rather than trying to
absorb it passively; functional engagement improves learning, interest,
and comprehension (Bodemer et
al., 2004). This is particularly helpful because direct interaction
with visual content facilitates the involvement of the motor system (Wraga et al.,
2003), which is essential for achieving deeper levels of
understanding (Moreau, 2015).
LS0tCnRpdGxlOiAiUmFpc2luZyB0aGUgQmFyIEdyYXBoOiBVcGdyYWRpbmcgdG8gSW50ZXJhY3RpdmUgRHluYW1pYyBEYXRhIFZpc3VhbGl6YXRpb25zIGluIFBzeWNob2xvZ3kiCmF1dGhvcjogIlVkaSBBbHRlciIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDYKICAgIHRvY19mbG9hdDogeWVzCiAgICB0aGVtZTogcmVhZGFibGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKPGJyPgoKPiDigJxWaWEgZHluYW1pYyBhbmQgaW50ZXJhY3RpdmUgZ3JhcGhpY3MsIHRvZGF54oCZcyB0ZWNobm9sb2d5IGFsbG93cyBzdHVkZW50cyB0byB2aXN1YWxpemUgZXh0ZXJuYWxseSB3aGF0IHRoZXkgaGF2ZSBkaWZmaWN1bHR5IHJlcHJlc2VudGluZyBtZW50YWxseS7igJ0KPgoKIC0tLSA8Y2l0ZT5bRGF2aWQgTW9yZWF1ICgyMDE1KSwgcC4gMi5dKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTUuMDAzNDIpPC9jaXRlPgoKPGJyPjxicj4KCgpSZXNlYXJjaCBvbiBodW1hbiBwZXJjZXB0aW9uIGhhdmUgdGF1Z2h0IHVzIGEgbG90IGFib3V0IGhvdyB0byBiZXR0ZXIgY29tbXVuaWNhdGUgZGF0YSB0aHJvdWdoIGlsbHVzdHJhdGlvbnMgYW5kIGdyYXBoaWNzLiBWaXN1YWxpemluZyBkYXRhLWRyaXZlbiByZXN1bHRzIGNvbnRpbnVlcyB0byBpbXByb3ZlIHRocm91Z2ggcHN5Y2hvbG9naWNhbCByZXNlYXJjaCBhbmQgdGVjaG5vbG9naWNhbCBpbm5vdmF0aW9ucy4gVG9kYXksIHJlc2VhcmNoZXJzIGhhdmUgZ3JlYXRlciBjYXBhY2l0eSB0byBjb2xsZWN0IGJldHRlci1xdWFsaXR5IGRhdGEgYW5kIGluIGxhcmdlciBxdWFudGl0aWVzIChlLmcuLCBvbmxpbmUgc3VydmV5cywgY2VsbCBwaG9uZSBhcHBsaWNhdGlvbnMsIHdlYXJhYmxlIHRlY2hub2xvZ2llcywgc29jaWFsIG1lZGlhLCBHb29nbGUgQW5hbHl0aWNzLCBldGMuKS4gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGludGVncml0eSBhbmQgcHVycG9zZSBvZiBvdXIgZ3JhcGhzLCBkYXRhIHZpc3VhbGl6YXRpb25zIG11c3QgYmUgYWJsZSB0byBhY2NvbW1vZGF0ZSB0aGlzIHN1cmdlIGluIGluZm9ybWF0aW9uIHZvbHVtZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgZGlnaXRhbCBhZ2UuIFlldCwgZGVzcGl0ZSB0aGUgZXhwb25lbnRpYWwgZ3Jvd3RoIGluIGNvbXB1dGluZyBwb3dlciBhbmQgc29mdHdhcmUgdG9vbHMsIHBzeWNob2xvZ3kgcmVzZWFyY2hlcnMgY29udGludWUgdG8gcmVseSBtb3N0bHkgb24gc3RhdGljIGRhdGEgdmlzdWFsaXphdGlvbnMuCgojIyBUaGUgKE9wdGljYWwpIElsbHVzaW9uIG9mIEN1cnJlbnQgRGF0YSBWaXN1YWxpemF0aW9uIFByYWN0aWNlcwoKU3RhdGljIHZpc3VhbGl6YXRpb25zIGFyZSBlbnRpcmVseSBhY2NlcHRhYmxlIGFuZCBhcHByb3ByaWF0ZSBmb3IgbWFueSBwdXJwb3NlcyAoYXMgSSBob3BlIHRoZSBmaWd1cmVzIGluIHRoaXMgcGFwZXIpLCBob3dldmVyLCBhcyB3ZSB0cmFuc2l0aW9uIGludG8gdGhlIGJpZyBkYXRhIGVyYSwgcmVseWluZyBvbmx5IG9uIHN0YXRpYyBncmFwaGljcyBtYXkgbm90IGJlIGVub3VnaCAoW0hlZXIgJiBLYW5kZWwsIDIwMTJdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTQ1LzIzMzEwNDIuMjMzMTA1OCApKS4gU3RhdGljIGdyYXBocyBjYW4gbGltaXQgdGhlIHR5cGUgYW5kIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBvbmUgd2lzaGVzIHRvIGNvbW11bmljYXRlLCBvciB0aGUgc3BlZWQgYW5kIGNvbXByZWhlbnNpb24gb2YgZGV0YWlscyB0aGUgcmVhZGVyIGlzIG1lYW50IHRvIHBlcmNlaXZlOyBjZXJ0YWluIHR5cGVzIG9mIHN0YXRpYyBncmFwaHMgY2FuIG9mdGVuIGJlIG5vIG1vcmUgdGhhbiDigJx2aXN1YWwgdGFibGVz4oCdIChbV2Vpc3NnZXJiZXIgZXQgYWwuLCAyMDE1LCBwLiAxXShodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBiaW8uMTAwMjEyOCkpLiBJbiBhIDIwMTQgc3lzdGVtYXRpYyByZXZpZXcgb2YgcmVzZWFyY2ggYXJ0aWNsZXMgcHVibGlzaGVkIGluIHRoZSB0b3AgMjUlIHBoeXNpb2xvZ3kgam91cm5hbHMsIHRoZSBhdXRob3JzIGZvdW5kIHRoYXQgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGF0YSB2aXN1YWxpemF0aW9ucyBhcmUgc3RhdGljIGdyYXBocy4gQW5kIHNwZWNpZmljYWxseSwgc3RhdGljIGJhciBncmFwaHMgKFtXZWlzc2dlcmJlciBldCBhbC4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KSkuIEFsdGhvdWdoIGEgcmVjZW50XltTb21lIGxlc3MgcmVjZW50IHN5c3RlbWF0aWMgcmV2aWV3cyBleGlzdCwgc2VlIFtCZXN0IGV0IGFsLiAoMjAwMSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L3MwMzc2LTYzNTcoMDEpMDAxNTYtNSApIGFuZCBbQ2xldmVsYW5kICgxOTg0KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjIzMDcvMjY4MzQwMCkuIFJlc3VsdHMgZnJvbSB0aGVzZSByZXZpZXdzIGRvIG5vdCBkaWZmZXIgZHJhbWF0aWNhbGx5IGZyb20gdGhvc2Ugb2YgdGhlIFsjYmFyYmFycGxvdHMgcHJvamVjdCAoMjAxNyldKGh0dHBzOi8vd3d3LmtpY2tzdGFydGVyLmNvbS9wcm9qZWN0cy8xNDc0NTg4NDczL2JhcmJhcnBsb3RzKSBhbmQgW1dlaXNzZ2VyYmVyIGV0IGFsLiAoMjAxNSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KS5dICBzeXN0ZW1hdGljIHJldmlldyBpbiBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoIGhhcyB5ZXQgdG8gYmUgcHVibGlzaGVkICh0byBteSBrbm93bGVkZ2UpLCBpdCBhcHBlYXJzIHRoYXQgcHN5Y2hvbG9neSBzdWZmZXJzIGZyb20gdGhlIHNhbWUgZ3JhcGggdXNlIGlzc3VlcyBhcyBwaHlzaW9sb2d5IGFuZCBvdGhlciBkaXNjaXBsaW5lcy4gVGhlIFsjYmFyYmFycGxvdHMgcHJvamVjdCAoMjAxNyldKGh0dHBzOi8vd3d3LmtpY2tzdGFydGVyLmNvbS9wcm9qZWN0cy8xNDc0NTg4NDczL2JhcmJhcnBsb3RzKSBleGFtaW5lZCAxMzEgcmVzZWFyY2ggYXJ0aWNsZXMgZnJvbSB0aGUgZmlyc3Qgc2l4IG1vbnRoIG9mIDIwMTYgaW4gZm91ciBoaWdoIGltcGFjdCBwc3ljaG9sb2d5IGpvdXJuYWxzIGFuZCBmb3VuZCB0aGF0IHRoZXJlIGlzIGEgc3Vic3RhbnRpYWwgcHJlc2VuY2Ugb2Ygc3RhdGljIGJhciBncmFwaHMuIFBhcnRpY3VsYXJseSwgZnJvbSBhIHRvdGFsIG9mIDEwNCBncmFwaHMgcHJlc2VudGVkLCA1NSUgb2YgZmlndXJlcyB3ZXJlIHN0YXRpYyBiYXIgZ3JhcGhzLgo8YnI+PGJyPgpTdGF0aWMgYmFyIGdyYXBocyBoYXZlIGJlZW4gaGVhdmlseSBjcml0aWNpemVkIChlc3BlY2lhbGx5IHdpdGggY29udGludW91cyBkYXRhKSBmb3IgaW5jcmVhc2luZyB0aGUgcmlzayBvZiBtaXNpbnRlcnByZXRpbmcgcmVzZWFyY2ggZmluZGluZ3MgYW5kIHByb3ZpZGluZyBsaW1pdGVkIGluZm9ybWF0aW9uIChbQ29vcGVyIGV0IGFsLiwgMjAwMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwNjcvbWVtLjIwMDIuMTI3MzI3KTsgW0dlbG1hbiwgMjAxN10oaHR0cDovL2FuZHJld2dlbG1hbi5jb20vMjAxNy8wNy8xNi9ncmFwaHMtY29tcGFyaXNvbnMtY2FzZS1zdHVkeSk7IFtMYW5lICYgU8OhbmRvciwgMjAwOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzcvYTAwMTY2MjApOyBbU2NocmlnZXIgZXQgYWwuLCAyMDA2XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmFubmVtZXJnbWVkLjIwMDYuMDYuMDE3KTsgW1NheG9uLCAyMDE1XShodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTI5MTUtMDE1LTAxNjktNik7IFtXZWlzc2dlcmJlciBldCBhbC4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMzcxL2pvdXJuYWwucGJpby4xMDAyMTI4KSkuIEZvciBleGFtcGxlLCBhIHN0YXRpYyBiYXIgZ3JhcGggY2FuIHBvcnRyYXkgcG90ZW50aWFsbHkgY291bnRsZXNzIGRpZmZlcmVudCBkaXN0cmlidXRpb25zIChlLmcuLCBiaW1vZGFsLCBza2V3ZWQsIGNvbnRhaW5pbmcgb3V0bGllcnMsIGRpZmZlcmVuY2UgaW4gc2FtcGxlIHNpemUpIHRoZSBzYW1lIHdheSBpZiB0aGVpciBtZWFucyBhbmQgdmFyaWFiaWxpdHkgYXJlIHNpbWlsYXIgKHNlZSBGaWd1cmUgMSkuIAoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+IAohWyoqRmlndXJlIDEuIE1hbnkgZGlmZmVyZW50IGRhdGFzZXRzIGNhbiBsZWFkIHRvIHRoZSBzYW1lIHN0YXRpYyBiYXIgZ3JhcGguKiogVGhlIGZ1bGwgZGF0YSBtYXkgc3VnZ2VzdCBkaWZmZXJlbnQgY29uY2x1c2lvbnMgZnJvbSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzLiBUaGUgbWVhbnMgYW5kIHN0YW5kYXJkIGVycm9ycyAoU0VzKSBmb3IgdGhlIGZvdXIgZXhhbXBsZSBkYXRhc2V0cyBzaG93biBpbiBQYW5lbHMgQuKAk0UgYXJlIGFsbCB3aXRoaW4gMC41IHVuaXRzIG9mIHRoZSBtZWFucyBhbmQgU0VzIHNob3duIGluIHRoZSBiYXIgZ3JhcGggKFBhbmVsIEEpLiBJbiBQYW5lbCBCLCB0aGUgZGlzdHJpYnV0aW9uIGluIGJvdGggZ3JvdXBzIGFwcGVhcnMgc3ltbWV0cmljLiBBbHRob3VnaCB0aGUgZGF0YSBzdWdnZXN0IGEgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyb3VwcywgdGhlcmUgaXMgc3Vic3RhbnRpYWwgb3ZlcmxhcCBiZXR3ZWVuIGdyb3Vwcy4gSW4gUGFuZWwgQywgdGhlIGFwcGFyZW50IGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cHMgaXMgZHJpdmVuIGJ5IGFuIG91dGxpZXIuIFBhbmVsIEQgc3VnZ2VzdHMgYSBwb3NzaWJsZSBiaW1vZGFsIGRpc3RyaWJ1dGlvbi4gQWRkaXRpb25hbCBkYXRhIGFyZSBuZWVkZWQgdG8gY29uZmlybSB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgYmltb2RhbCBhbmQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBlZmZlY3QgaXMgZXhwbGFpbmVkIGJ5IGEgY292YXJpYXRlLiBJbiBQYW5lbCBFLCB0aGUgc21hbGxlciByYW5nZSBvZiB2YWx1ZXMgaW4gZ3JvdXAgdHdvIG1heSBzaW1wbHkgYmUgYmVjYXVzZSB0aGVyZSBhcmUgb25seSB0aHJlZSBvYnNlcnZhdGlvbnMuIEFkZGl0aW9uYWwgZGF0YSBmb3IgZ3JvdXAgdHdvIHdvdWxkIGJlIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ3JvdXBzIGFyZSBkaWZmZXJlbnQuIEZpZ3VyZSBhbmQgY2FwdGlvbiBhZGFwdGVkIGZyb20gV2Vpc3NnZXJiZXIgZXQgYWwuICgyMDE1KS5dKEZpZzEucG5nKXt3aWR0aD0xMDAlfQo8L2Rpdj4KClRoaXMgY2FuIG1pc2xlYWQgcmVhZGVycyB0byBtYWtlIGEgY2VydGFpbiBzZXQgb2YgYXNzdW1wdGlvbnMgKGUuZy4sIG5vcm1hbGl0eSwgZXF1YWwgc2FtcGxlIHNpemUgYW5kIHZhcmlhYmlsaXR5LCBubyBvdXRsaWVycywgZXRjLikgd2hpY2ggaW4gcmVhbGl0eSBtaWdodCBoYXZlIG5ldmVyIGJlZW4gbWV0LiBJbiBhZGRpdGlvbiwgaWYgbm9uLWluZGVwZW5kZW50IOKAkyBvciBwYWlyZWQg4oCTIGRhdGEgYXJlIHByZXNlbnRlZCB1c2luZyBzdGF0aWMgYmFyIGdyYXBocywgcmVhZGVycyBtaWdodCBmYWxzZWx5IGluZmVyIGluZGVwZW5kZW5jZSBhbmQgaWdub3JlIHdpdGhpbi1zdWJqZWN0IGRpZmZlcmVuY2VzIChvciBsYWNrIHRoZXJlb2Y7IHNlZSBGaWd1cmUgMikuCgo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4gCiFbKipGaWd1cmUgMi4gQWRkaXRpb25hbCBwcm9ibGVtcyB3aXRoIHVzaW5nIHN0YXRpYyBiYXIgZ3JhcGhzIHRvIHNob3cgcGFpcmVkIGRhdGEuKiogVGhlIGJhciBncmFwaCAobWVhbiDCsSBTRSkgc3VnZ2VzdHMgdGhhdCB0aGUgZ3JvdXBzIGFyZSBpbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBjaGFuZ2VzIGFyZSBjb25zaXN0ZW50IGFjcm9zcyBpbmRpdmlkdWFscyAoUGFuZWwgQSkuIFRoZSBzY2F0dGVycGxvdHMgc2hvd24gaW4gdGhlIFBhbmVscyBC4oCTRCBjbGVhcmx5IGRlbW9uc3RyYXRlIHRoYXQgdGhlIGRhdGEgYXJlIHBhaXJlZC4gRWFjaCBzY2F0dGVycGxvdCByZXZlYWxzIHZlcnkgZGlmZmVyZW50IHBhdHRlcm5zIG9mIGNoYW5nZSwgZXZlbiB0aG91Z2ggdGhlIG1lYW5zIGFuZCBTRXMgZGlmZmVyIGJ5IGxlc3MgdGhhbiAwLjMgdW5pdHMuIFRoZSBsb3dlciBzY2F0dGVycGxvdHMgc2hvd2luZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBtZWFzdXJlbWVudHMgYWxsb3cgcmVhZGVycyB0byBxdWlja2x5IGFzc2VzcyB0aGUgZGlyZWN0aW9uLCBtYWduaXR1ZGUsIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIGNoYW5nZXMuIFRoZSBzb2xpZCBsaW5lcyBzaG93IHRoZSBtZWRpYW4gZGlmZmVyZW5jZS4gSW4gUGFuZWwgQiwgdmFsdWVzIGZvciBldmVyeSBzdWJqZWN0IGFyZSBoaWdoZXIgaW4gdGhlIHNlY29uZCBjb25kaXRpb24uIEluIFBhbmVsIEMsIHRoZXJlIGFyZSBubyBjb25zaXN0ZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBjb25kaXRpb25zLiBQYW5lbCBEIHN1Z2dlc3RzIHRoYXQgdGhlcmUgbWF5IGJlIGRpc3RpbmN0IHN1Ymdyb3VwcyBvZiDigJxyZXNwb25kZXJz4oCdIGFuZCDigJxub24tcmVzcG9uZGVycy7igJ0gRmlndXJlIGFuZCBjYXB0aW9uIHRha2VuIGZyb20gV2Vpc3NnZXJiZXIgZXQgYWwuICgyMDE1KS4uXShGaWcyLnBuZyl7d2lkdGg9MTAwJX0KPC9kaXY+CgpPZiBjb3Vyc2UsIHRoZXJlIGFyZSBudW1lcm91cyB0eXBlcyBvZiBzdGF0aWMgZGF0YSB2aXN1YWxpemF0aW9ucywgb3RoZXIgdGhhbiBiYXIgZ3JhcGhzLCB0aGF0IG1pZ2h0IGJlIGJldHRlciBzdWl0ZWQgZm9yIHRoZSByZXNlYXJjaGVyIG9yIGRhdGEgc2NpZW50aXN04oCZcyBuZWVkcyAoZS5nLiwgc2NhdHRlcnBsb3RzLCBsaW5lIGdyYXBocywgdmlvbGluIHBsb3RzKS4gWWV0LCBzdGF0aWMgZ3JhcGhzICh1bmludGVudGlvbmFsbHkpIGZvcmNlIHRoZSByZWFkZXIgdG8gbG9vayBhdCB0aGUgZGF0YSB0aHJvdWdoIGEgc2luZ2xlIGxlbnMg4oCTIG9ubHkgdGhlIG9uZSB0aGF0IHRoZSBhdXRob3JzIGludGVuZGVkLiBUaGUgYXV0aG9ycyBoYXZlIGNvbXBsZXRlIGFuZCB1dHRlciBjb250cm9sIG92ZXIgdGhlIHR5cGUgb2YgZ3JhcGgsIHdoaWNoIHZhcmlhYmxlcyBnbyBpbiwgdGhlIHNjYWxpbmcgb3IgdHJ1bmNhdGlvbiBvZiBheGVzLCB0aGUgYW5nbGUgb3IgcG9pbnQgb2YgdmlldyAoZS5nLiwgaW4gYSAzRCBwbG90KSwgdGhlIGNvbG91cnMsIHNpemVzLCBhbmQgbW9yZS4gTWFueSBzdGF0aWMgZ3JhcGhzIGNhbiBhbHNvIGJlIGluYWNjZXNzaWJsZSB0byBzb21lIHJlYWRlcnMuIEZvciBleGFtcGxlLCByZWFkZXJzIHdobyBhcmUgY29sb3VyIGJsaW5kIG9yIGhhdmUgZGlmZmljdWx0eSB3aXRoIGRlcHRoIHBlcmNlcHRpb24sIGdyYXBocyB0aGF0IGluY2x1ZGUgdmVyeSBzbWFsbCBvciB0b28gbWFueSBsYWJlbHMsIGV0Yy4gCjxicj48YnI+CkZ1cnRoZXJtb3JlLCBzdGF0aWMgZmlndXJlcyBwcmV2ZW50IHJlYWRlcnMgZnJvbSBleHBsb3JpbmcgdGhlIHZpc3VhbGl6ZWQgZGF0YSBpbmRlcGVuZGVudGx5IGFuZCBhc3Nlc3NpbmcgZGF0YS1kcml2ZW4gY29uY2x1c2lvbnMgaW1wYXJ0aWFsbHk6IHJlYWRlcnMgY2Fubm90IG1hbmlwdWxhdGUgdGhlIGdyYXBoLCBpbnNwZWN0IHBhcnRpY3VsYXIgb2JzZXJ2YXRpb25zLCByZXNjYWxlIHRoZSBheGVzLCBvciB2aXN1YWxpemUgZGlmZmVyZW50IGFuYWx5c2VzLiBCeSBkb2luZyBzbywgd2UgdW5pbnRlbnRpb25hbGx5IGxpbWl0IHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgYW5kIHRoZXJlZm9yZSB0cmFuc3BhcmVuY3kuIFRoaXMgbWlnaHQgc291bmQgbm9ybWFsOyBpdCBpcyB0aGUgZGVmYXVsdCBhZnRlciBhbGwsIHdlIGhhdmUgYmVlbiBzZWVpbmcgc3RhdGljIGZpZ3VyZXMgaW4gYWNhZGVtaWMgam91cm5hbHMgZm9yIGRlY2FkZXMuIEJ1dCB3ZSBub3cgaGF2ZSB0aGUgY2FwYWNpdHkgdG8gYWxsb3cgcmVhZGVycyB0byBzaGFyZSBjb250cm9sIG92ZXIgaG93IHRoZSBkYXRhIGlzIHZpc3VhbGl6ZWQsIHNvIHdoeSBkbyB3ZSBub3QgbWFrZSBpdCB0aGUgbmV3IOKAnG5vcm1hbD/igJ0KPGJyPjxicj4KVGhpcyB1bmludGVudGlvbmFsIGxhY2sgb2YgdHJhbnNwYXJlbmN5IGlzIHByb2JsZW1hdGljIGluIGRhdGEgdmlzdWFsaXphdGlvbiBhcyBpdCBpcyBpbiBvdGhlciByZXNlYXJjaCBhc3BlY3RzIHN1Y2ggYXMgcmVwb3J0aW5nIHByYWN0aWNlcyAoZS5nLiwgbGltaXRlZC9hbWJpZ3VvdXMgcmVwb3J0aW5nLCBleGNsdWRpbmcgYW5hbHlzZXMgZHVlIHRvIGxhY2sgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLCBldGMuKS4gUmVwb3J0aW5nIHByYWN0aWNlcywgYW1vbmcgb3RoZXIgcmVzZWFyY2ggZmFjZXRzLCBoYXZlIGJlZW4gZGlyZWN0bHkgYWRkcmVzc2VkIGFuZCBhcmUgaW1wcm92aW5nIHRoYW5rcyB0byB2YXJpb3VzIHRhc2tmb3JjZXMsIHRoZSBbb3BlbiBzY2llbmNlIGZyYW1ld29yayAoT1NGKV0oaHR0cHM6Ly9vc2YuaW8vKSwgYW5kIG1vcmUuIEdpdmVuIHJlY2VudCBjb25jZXJucyBhYm91dCB0aGUgcmVwbGljYXRpb24gY3Jpc2lzLCBwdWJsaWNhdGlvbiBiaWFzLCBhbmQgbGFjayBvZiB0cmFuc3BhcmVuY3kgaW4gcHN5Y2hvbG9naWNhbCByZXNlYXJjaCwgYSByZWZvcm0gaW4gZGF0YSB2aXN1YWxpemF0aW9uIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQuIAoKCiMjIEVudGVyIEJleW9uZC1TdGF0aWMgR3JhcGhpY3MKCkludGVyYWN0aXZlIGFuZCBkeW5hbWljIGRhdGEgdmlzdWFsaXphdGlvbnMgY2FuIGFjY29tbW9kYXRlIHZpcnR1YWxseSBlbmRsZXNzIGFtb3VudCBhbmQgdHlwZXMgb2YgaW5mb3JtYXRpb24uIEluIGZhY3QsIHdpdGggaW50ZXJhY3RpdmUgZHluYW1pYyB2aXN1YWxpemF0aW9ucywgcmVhZGVycyBjYW4gdGFpbG9yIGFuZCBtb2RpZnkgdGhlIGdyYXBoaWMgdG8gZGlzcGxheSB0aGUgZGV0YWlscyBvZiB0aGVpciBjaG9vc2luZy4gQnV0LCBiZWZvcmUgd2UgZ28gZGVlcGVyIGludG8gd2h5IHdlIHNob3VsZCBpbXBsZW1lbnQgdGhlc2UgZGF0YSB2aXN1YWxpemF0aW9uIG1ldGhvZHMsIHdlIGZpcnN0IG5lZWQgdG8gZGVmaW5lIHdoYXQgYXJlIGludGVyYWN0aXZlIGFuZCBkeW5hbWljIHZpc3VhbGl6YXRpb25zLiBJbiB0aGlzIHBhcGVyLCBJIGRlZmluZSB0aHJlZSB0eXBlcyBvZiBub24tc3RhdGljIGRhdGEgdmlzdWFsaXphdGlvbnM6IGludGVyYWN0aXZlLCBkeW5hbWljLCBhbmQgaW50ZXJhY3RpdmUgZHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb25zLiBIb3dldmVyLCBJIHdpbGwgbW9zdGx5IGZvY3VzIG9uIHRoZSBsYXR0ZXIgdHlwZSwgaW50ZXJhY3RpdmUgZHluYW1pYywgZHVlIGl0cyBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgYmVuZWZpdHMuCjxicj48YnI+CkluIGFuICoqaW50ZXJhY3RpdmUgZGF0YSB2aXN1YWxpemF0aW9uIChJRFYpKiogdGhlIHVzZXJeW0kgd2lsbCB1c2UgdGhlIHRlcm1zIHVzZXIsIHJlYWRlciwgYW5kIHZpZXdlciBpbnRlcmNoYW5nZWFibHkgZnJvbSBub3cgb24gd2hlbiByZWZlcnJpbmcgdG8gdGhlIOKAnGF1ZGllbmNl4oCdIG9yIGNvbnN1bWVycyBvZiB0aGUgZ3JhcGhpY3MsIGFzIG9wcG9zZWQgdG8gdGhlIHJlc2VhcmNoZXIsIGF1dGhvciwgb3Igc2NpZW50aXN0cyB3aG8gZGVzaWduL3Byb2R1Y2UgdGhlIGdyYXBoaWNzLl0gIGNhbiBwcm9iZSB0aGUgcHJlc2VudGF0aW9uIHRvIHZpZXcgY2VydGFpbiBhc3BlY3RzIG9mIHRoZSBkYXRhIChlLmcuLCB2YWx1ZSBvbiBhbm90aGVyIHZhcmlhYmxlKSwgYW5kIHRodXMgaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIG1lbnVzIG9yIGNyb3NzLXJlZmVyZW5jaW5nIGEgdGFibGUgKFtXYXJkIGV0IGFsLiwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEyMDEvOTc4MDQyOTEwODQzMykpLiBPdGhlciBpbnRlcmFjdGl2ZSBmZWF0dXJlcyBtYXkgaW5jbHVkZSBzY2FsaW5nIG9yIHpvb21pbmcgaW4gYW5kIG91dCBvbiBhIHBhcnRpY3VsYXIgc2xpY2Ugb2YgZGF0YSwgaGlnaGxpZ2h0aW5nIGNlcnRhaW4gY2F0ZWdvcmllcyBvciB2YWx1ZXMsIHJvdGF0aW5nIChpbiAzRCBncmFwaGljcykgb3IgcGFubmluZyBvdmVyLCBhbmQgbW9yZS4gQW4gZXhhbXBsZSBvZiBJRFYgaXMgcHJlc2VudGVkIGluIEZpZ3VyZSAzIGFuZCBjYW4gYmUgYWNjZXNzZWQgW2hlcmVdKGh0dHBzOi8vcGxvdGx5LmNvbS9yLzNkLXNjYXR0ZXItcGxvdHMvKS4KCgpgYGB7ciBGaWd1cmUgMywgZWNobz1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMCldIDwtICdBdXRvbWF0aWMnCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMSldIDwtICdNYW51YWwnCm10Y2FycyRhbSA8LSBhcy5mYWN0b3IobXRjYXJzJGFtKQoKZmlnIDwtIHBsb3RfbHkobXRjYXJzLCB4ID0gfnd0LCB5ID0gfmhwLCB6ID0gfnFzZWMsIGNvbG9yID0gfmFtLCBjb2xvcnMgPSBjKCcjQkYzODJBJywgJyMwQzRCOEUnKSkKZmlnIDwtIGZpZyAlPiUgYWRkX21hcmtlcnMoKQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdXZWlnaHQnKSwKICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0dyb3NzIGhvcnNlcG93ZXInKSwKICAgICAgICAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gJzEvNCBtaWxlIHRpbWUnKSkpCgpmaWcKYGBgCjxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLWRlZmF1bHQiPgoqKkZpZ3VyZSAzLiBJbnRlcmFjdGl2ZSBkYXRhIHZpc3VhbGl6YXRpb24uKiogVGhpcyBpcyBhIDNEIHNjYXR0ZXIgcGxvdCB3aXRoIGludGVyYWN0aXZlIGZlYXR1cmVzLiBUaGUgZGF0YXNldCBwcmVzZW50ZWQgaXMg4oCYbXRjYXJz4oCZIGZyb20gdGhlIOKAmGRhdGFzZXRz4oCZIFIgcGFja2FnZSAoW1IgQ29yZSBUZWFtLCAyMDIyXShodHRwczovL3d3dy5SLXByb2plY3Qub3JnLykpLiBUaGUgcGxvdCBkaXNwbGF5cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZGlmZmVyZW50IHZlaGljbGUgdHlwZXMgKGkuZS4sIGF1dG9tYXRpYyBpbiByZWQgYW5kIG1hbnVhbCBpbiBibHVlKSwgd2VpZ2h0ICh4IGF4aXMpLCB0aW1lIGl0IHRha2VzIHRvIGRyaXZlIGEgcXVhcnRlciBvZiBhIG1pbGUgaW4gbWludXRlcyAoeSBheGlzKSwgYW5kIGhvcnNlcG93ZXIgKHogYXhpcykuIFRoZSB1c2VyIGNhbiByb3RhdGUgdGhlIHBsb3QgMzYwwrAsIHpvb20gaW4gYW5kIG91dCwgcGFuIHRoZSDigJxjYW1lcmHigJ0gb3ZlciwgaGlnaGxpZ2h0IG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgKGUuZy4sIHJlZDsgYXV0b21hdGljKSwgaG92ZXIgb3ZlciBhbnkgaW5kaXZpZHVhbCBvYnNlcnZhdGlvbnMgdG8gc2VlIGl0cyBjb29yZGluYXRlcywgYW5kIGRvd25sb2FkIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBsb3QuCjwvZGl2PgoqKkR5bmFtaWMgZGF0YSB2aXN1YWxpemF0aW9ucyAoRERWKSoqIGFyZSByZXByZXNlbnRhdGlvbnMgb2YgZGF0YSB0aGF0IGNhbiBjaGFuZ2UgdGhlaXIgZ3JhcGhpY2FsIG1ha2UtdXAgd2hpbGUgcHJlc2VudGVkIChbUGxvZXR6bmVyICYgTG93ZSwgMjAwNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5sZWFybmluc3RydWMuMjAwNC4wNi4wMDEpOyBbU2Nobm90eiBldCBhbC4sIDE5OTldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L0JGMDMxNzI5NjgpKS4gW0thcHV0ICgxOTkyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjIzMDcvNzQ5NTc5KSBjb25zaWRlcmVkIHRpbWUgYXMgYSBkaW1lbnNpb24gaW4gRERWLiBUaGlzIGlzLCBvZiBjb3Vyc2UsIHRydWUgd2hlbiB2aXN1YWxpemluZyB0aW1lLXNlcmllcywgaGllcmFyY2hpY2FsLCBvciBsb25naXR1ZGluYWwgZGVzaWducywgb3IgdG8gZGVwaWN0IGEgcHJvY2VzcyAoZS5nLiwgbmV1cm9uIGZpcmluZykuIEhvd2V2ZXIsIGluIG90aGVyIGRlc2lnbnMsIEkgYXJndWUsIGFueSB2YXJpYWJsZSDigJMgd2hldGhlciBjYXRlZ29yaWNhbCBvciBjb250aW51b3VzIOKAkyBjYW4gc2VydmUgYXMgYSBkaW1lbnNpb24gaW4gRERWIChlLmcuLCB0cmVhdG1lbnQgY29uZGl0aW9uLCBJUSwgZXRjLikuIEluIEREViwgZGlzcGxheWVkIHZhbHVlcyBvZiB0aGUgb3V0Y29tZSBjYW4gY2hhbmdlICh3aGlsZSBzdGlsbCBwcmVzZW50ZWQpIGFzIGEgZnVuY3Rpb24gb2YgYW5vdGhlciB2YXJpYWJsZSAoZS5nLiwgdGltZSwgZ3JvdXApLiBJbiBhIGxpbmVhciwgb3IgYXV0b21hdGljIEREViwgY2hhbmdlcyB0cmFuc3BpcmUgb24gdGhlaXIgb3duIGFuZCBjYW5ub3QgYmUgYWx0ZXJlZCBieSB0aGUgdXNlciBvciByZWFkZXIuIEFuIGV4YW1wbGUgb2YgRERWIGlzIHByZXNlbnRlZCBpbiBGaWd1cmUgNCBhbmQgaXMgYXZhaWxhYmxlIFtoZXJlXShodHRwczovL3Bsb3RseS5jb20vZ2dwbG90Mi9hbmltYXRpb25zLyM6fjp0ZXh0PVBsYXktLE11bGl0cGxlJTIwVHJhY2UlMjBBbmltYXRpb25zLC1saWJyYXJ5KHBsb3RseSklMEFsaWJyYXJ5KS4KCgpgYGB7ciBGaWd1cmUgNCwgZWNobz1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdhcG1pbmRlcikKCgpwIDwtIGdncGxvdChnYXBtaW5kZXIsIGFlcyhnZHBQZXJjYXAsIGxpZmVFeHAsIGNvbG9yID0gY29udGluZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwb3AsIGZyYW1lID0geWVhciwgaWRzID0gY291bnRyeSkpICsKICBzY2FsZV94X2xvZzEwKCkKCmdncGxvdGx5KHApCmBgYAo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4KKipGaWd1cmUgNC4gRHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb24uKiogVGhpcyBpcyBhIHNjYXR0ZXIgcGxvdCB3aXRoIGR5bmFtaWMgZmVhdHVyZXMuIFRoZSBkYXRhc2V0IHByZXNlbnRlZCBjb21lcyBmcm9tIHRoZSDigJhnYXBtaW5kZXLigJkgUiBwYWNrYWdlIChbQnJ5YW4sIDIwMTddKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5ueWJjL2dhcG1pbmRlcikpLiBUaGUgcGxvdCBkaXNwbGF5cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ3Jvc3MgZG9tZXN0aWMgcHJvZHVjdCBwZXIgY2FwaXRhIChnZHBQZXJjYXA7IHggYXhpcykgYW5kIGxpZmUgZXhwZWN0YW5jeSBpbiB5ZWFycyAobGlmZUV4cDsgeSBheGlzKSBhY3Jvc3MgZGlmZmVyZW50IHRpbWVzLCBmcm9tIDE5NTIgdG8gMjAwNyAoYm90dG9tIHNjYWxlKS4gVGhlIHVzZXIgY2FuIHpvb20gaW4gYW5kIG91dCwgaGlnaGxpZ2h0IG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgKGUuZy4sIGJsdWU7IEV1cm9wZSksIGhvdmVyIG92ZXIgYW55IGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zIHRvIHNlZSBzcGVjaWZpYyBkZXRhaWxzIChhcyBzZWVuIGluIHRoZSByZWQgYm94KSwgYW5kIHdoZW4gdGhlIOKAnHBsYXnigJ0gYnV0dG9uIGlzIHByZXNzZWQgKGJvdHRvbSBsZWZ0IGNvcm5lciksIGNoYW5nZXMgYWNyb3NzIHRoZSB5ZWFycyBjYW4gYmUgc2VlbiB2aWEgYW5pbWF0aW9uLgo8L2Rpdj4KCkxhc3RseSwgYXMgaXRzIG5hbWUgc3VnZ2VzdHMsICoqaW50ZXJhY3RpdmUgZHluYW1pYyBkYXRhIHZpc3VhbGl6YXRpb25zIChJRERWKSoqIGNvbWJpbmUgZWxlbWVudHMgZnJvbSBib3RoIElEViBhbmQgRERWIGFuZCBpcyB0aGVyZWZvcmUgdGhlIGJlc3Qgb2YgYm90aCB3b3JsZHMuIEluIElERFYsIGFueSBjaGFuZ2UgaW4gdGhlIGdyYXBoaWNhbCBzdHJ1Y3R1cmUgZm9sbG93cyBhIGRpcmVjdCBhY3Rpb24gZnJvbSB0aGUgdXNlci4gVGhpcyB3YXksIHVzZXJzIGhhdmUgY29udHJvbCBvdmVyIOKAkyBvciwgIGNhbiBtYW5pcHVsYXRlIOKAkyBob3cgdGhlIGRhdGEgaXMgZGlzcGxheWVkIChbUGxvZXR6bmVyICYgTG93ZSwgMjAwNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5sZWFybmluc3RydWMuMjAwNC4wNi4wMDEpKS4gSW4gbWFueSBjYXNlcywgdGhlIHZpZXdlciBldmVuIGhhcyBjb250cm9sIG92ZXIgaG93IHRoZSBkYXRhIGlzIGFuYWx5emVkIChzZWUgYmVsb3cgW2V4YW1wbGUgYnkgRWxsaXMgJiBNZXJkaWFuLCAyMDE1KV0oaHR0cHM6Ly9wc3ljaG9sb2d5LnNoaW55YXBwcy5pby9leGFtcGxlMy8pLiBbU2Nod2FuIGFuZCBSaWVtcHAgKDIwMDQpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmxlYXJuaW5zdHJ1Yy4yMDA0LjA2LjAwNSkgbm90ZWQgdGhhdCBJRERWIOKAnGVuYWJsZSB0aGUgdXNlciB0byBhZGFwdCB0aGUgcHJlc2VudGF0aW9uIHRvIFt0aGVpcl0gaW5kaXZpZHVhbCBjb2duaXRpdmUgbmVlZHPigJ0gKHAuIDI5NikuIEFuIGV4YW1wbGUgb2YgSUREViBpcyBwcmVzZW50ZWQgaW4gRmlndXJlIDUgYW5kIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9oYW96aHUyMzMuc2hpbnlhcHBzLmlvL3NoaW55TVJJLWNvbnRlc3QvKS4KPGJyPjxicj4KCmBgYHtyIEZpZ3VyZSA1LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aCA9ICcxMDAlJ30KbGlicmFyeShzaGlueSkKa25pdHI6OmluY2x1ZGVfYXBwKCJodHRwczovL3ZhYy1sc2h0bS5zaGlueWFwcHMuaW8vbmNvdl90cmFja2VyLyIpCmBgYAoKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+CioqRmlndXJlIDUuIEludGVyYWN0aXZlIGR5bmFtaWMgZGF0YSB2aXN1YWxpemF0aW9uLioqIFRoaXMgYXBwIGFsbG93cyB1c2VycyB0byB2aXN1YWxpemUgYW5kIGFuYWx5emUgQ09WSUQtMTkgYW5kIFNBUlMgZ2VvZ3JhcGhpYyBhbmQgZGVzY3JpcHRpdmUgZGF0YSBhY3Jvc3MgdGltZSB1c2luZyBib3RoIGludGVyYWN0aXZlIGFuZCBkeW5hbWljIGZlYXR1cmVzIGNyZWF0ZWQgYnkgW1BhcmtlciAoMjAyMildKGh0dHBzOi8vdmFjLWxzaHRtLnNoaW55YXBwcy5pby9uY292X3RyYWNrZXIvKS4gVXNlcnMgY2FuIGJyb3dzZSB0aGUgZGlmZmVyZW50IHRhYnMgYXQgdGhlIHRvcCwgYWRqdXN0IHRoZSBkYXRlIG9uIHRoZSBsZWZ0IGJsdWUgc2NhbGUsIGhvdmVyIG92ZXIgYW55IHJlZ2lvbiBvciBvYnNlcnZhdGlvbiwgYXBwbHkgZmlsdGVycy9tYXNrcywgcGFuIG92ZXIsIHpvb20sIHZpZXcgdGhlIHJhdyBkYXRhLCBhbmQgY3JlYXRlIGEgY3VzdG9taXplZCBsaW5lIGdyYXBoLgo8L2Rpdj4KCkFsdGhvdWdoIHRoZXJlIGFyZSBtaXhlZCBjb25jbHVzaW9ucyBhYm91dCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBJRFYgYW5kIEREViAoZS5nLiwgW0hlZ2FydHksIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDA3KTsgW0hvb2QgZXQgYWwuLCAyMDE5XShodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDE5LjAyOTg2KTsgW1Bsb2V0em5lciAmIExvd2UsIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDAxKTsgW1JvbGZlcyBldCBhbC4sIDIwMjBdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMjAuMDA2OTMpOyBbU2Nobm90eiBldCBhbC4sIDE5OTldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L0JGMDMxNzI5NjgpOyBbU2Nod2FuICYgUmllbXBwLCAyMDA0XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmxlYXJuaW5zdHJ1Yy4yMDA0LjA2LjAwNSkpLCB0aGVyZSBpcyBhIGdyb3dpbmcgYm9keSBvZiBsaXRlcmF0dXJlIGFkdm9jYXRpbmcgZm9yIHRoZSB1c2Ugb2YgSUREViBpbiBib3RoIGVkdWNhdGlvbiBhbmQgcmVzZWFyY2ggc2V0dGluZ3MgKGUuZy4sIFtFbGxpcyAmIE1lcmRpYW4sIDIwMTVdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTUuMDE3ODIpOyBbSGVlciwgJiBTaG5laWRlcm1hbiwgMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMjEzMzgwNi4yMTMzODIxKTsgW1JvbGZlcyBldCBhbC4sIDIwMjBdKChodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDIwLjAwNjkzKSk7IFtXYXJkIGV0IGFsLiwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEyMDEvOTc4MDQyOTEwODQzMykpLiAKPGJyPgoKIyMgV2h5IFdlIFNob3VsZCBVc2UgSW50ZXJhY3RpdmUgRHluYW1pYyBHcmFwaGljcyBpbiBQc3ljaG9sb2d5CgoKClRoZXJlIGFyZSBtYW55IGNsZWFyIGFkdmFudGFnZXMgdG8gaW5jb3Jwb3JhdGluZyBJRERWIGluIGFjYWRlbWljIGFydGljbGVzIGFuZCB0ZWFjaGluZy4gSW4gdGhpcyBwYXBlciwgSSBmb2N1cyBvbmx5IG9uIGEgZmV3IGtleSByZWFzb25zIHJlbGF0aW5nIHRvIG9wZW4gcmVzZWFyY2ggcHJhY3RpY2VzLCBsaXZlIGRhdGEgdXBkYXRlcyBhZnRlciB2aXN1YWxpemF0aW9uIGRlcGxveW1lbnQsIGFuZCBlZmZlY3RpdmUgZGF0YSBjb21tdW5pY2F0aW9uOgo8YnI+CgojIyMgSUREViBJbmNpdGUgVHJhbnNwYXJlbnQgUmVzZWFyY2ggUHJhY3RpY2VzCgoKCgpDb25jZXJucyBhYm91dCB0aGUgY3JlZGliaWxpdHkgb2YgcHJldmlvdXNseSBwdWJsaXNoZWQgcmVzdWx0cyBpbiBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoIGluc3BpcmVkIG5ldyBzdGFuZGFyZHMgb2YgcmVjb21tZW5kZWQgcHJhY3RpY2VzIHN1Y2ggYXMgcHJlcmVnaXN0cmF0aW9uLCByZWdpc3RlcmVkIHJlcG9ydHMsIG9wZW4gZGF0YSwgc2hhcmVkIGFuYWx5c2VzLCBldGMuIElERFYgYXJlIG11Y2ggbW9yZSBhbGlnbmVkIHdpdGggdGhlIG5ldyBzdGFuZGFyZHMgb2YgdHJhbnNwYXJlbnQgcmVzZWFyY2ggdGhhbiBzdGF0aWMgZ3JhcGhzLiBUaG91Z2h0ZnVsIElERFYgYWxsb3cgY2FyZWZ1bCBpbnNwZWN0aW9uIG9mIGV2ZXJ5IGRpbWVuc2lvbiBvZiB0aGUgZGF0YSwgd2hlcmVhcyB3aXRoIHN0YXRpYyB2aXN1YWxpemF0aW9ucywgdGhpcyBpcyB1c3VhbGx5IGltcG9zc2libGUgb3IgY2FuIG1ha2UgdGhlIGdyYXBoIHRvbyBjb21wbGV4IHRvIGNvbXByZWhlbmQuIE1vcmUgYWR2YW5jZWQgSUREViBjYW4gZXZlbiBncmFudCB0aGUgcmVhZGVyIHRoZSBhYmlsaXR5IHRvIGV4cGxvcmUgYW5kIHJlYW5hbHl6ZSB0aGUgZGF0YSBvbiB0aGVpciBvd24uIFRoaXMgaXMgcGVyaGFwcyBvbmUgb2YgdGhlIGhpZ2hlc3QgbGV2ZWxzIG9mIG9wZW4gcmVzZWFyY2ggcHJhY3RpY2VzLiBGb3IgZXhhbXBsZSwgaW4gdGhlIElERFYgW2V4YW1wbGUgY3JlYXRlZCBieSBFbGxpcyBhbmQgTWVyZGlhbiAoMjAxNSldKGh0dHBzOi8vcHN5Y2hvbG9neS5zaGlueWFwcHMuaW8vZXhhbXBsZTMvKSB1c2luZyBSIFNoaW55IGFwcCwgdGhlIHVzZXIgY2FuIHNlbGVjdCB0aGUgdmFyaWFibGVzIG9mIHRoZWlyIGNob2ljZSwgZGlmZmVyZW50aWF0ZSBieSBncm91cCwgYXBwbHkgZGlmZmVyZW50IGZpbHRlcnMgb3IgbWFza3MsIGFuZCByZWNhbGN1bGF0ZSB0aGUgcmVncmVzc2lvbiBlcXVhdGlvbiBhbmQgY29ycmVsYXRpb24gY29lZmZpY2llbnQgKHNlZSBGaWd1cmUgNikuCjxicj48YnI+CmBgYHtyIEZpZ3VyZSA2LCBlY2hvPUZBTFNFLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aCA9ICcxMDAlJ30KbGlicmFyeShzaGlueSkKa25pdHI6OmluY2x1ZGVfYXBwKCJodHRwczovL3BzeWNob2xvZ3kuc2hpbnlhcHBzLmlvL2V4YW1wbGUzLyIpCmBgYAo8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij4KKipGaWd1cmUgNi4gSW50ZXJhY3RpdmUgZHluYW1pYyBleGFtcGxlIHdpdGggZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBhcHBsaWNhdGlvbnMuKiogVGhpcyBpbnRlcmFjdGl2ZSBkeW5hbWljIGZpZ3VyZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSB2YXJpYWJsZXMgb2YgdGhlaXIgY2hvaWNlIChmcm9tIHRoZSBkcm9wZG93biBtZW51cyBhdCB0aGUgdG9wIGxlZnQpLCBkaWZmZXJlbnRpYXRlIGJ5IGdyb3VwIChtYWxlLCBmZW1hbGUpLCBhcHBseSBkaWZmZXJlbnQgZmlsdGVycyBvciBtYXNrcyAocHJldmlvdXMgdmljdGltLCBub3QgcHJldmlvdXMgdmljdGltKSwgYW5kIHJlY2FsY3VsYXRlIHRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGFuZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoYm90dG9tIHJpZ2h0IHRhYmxlKS4gVGhlIHVzZXIgY2FuIGFsc28gaW5zcGVjdCB0aGUgZGF0YSB1c2luZyBhIGRpZmZlcmVudCBncmFwaCB0eXBlIChlLmcuLCBib3hwbG90KSBieSBzd2l0Y2hpbmcgdG8gdGhlIEJveHBsb3QgdGFiIGFib3ZlIHRoZSBmaWd1cmUuCjwvZGl2PgpGdXJ0aGVybW9yZSwgd2l0aCB0b29scyBzdWNoIGFzIFIgU2hpbnksIHdoZXJlIHRoZSBkYXRhIGFuZCBhbmFseXNlcyBhcmUgc3RvcmVkIG9uIHRoZSBhdXRob3LigJlzIHNlcnZlciwgdXNlcnMgY2FuIGhhdmUgYWxsIHRoZSBiZW5lZml0cyBvZiBoYXZpbmcgYWNjZXNzIHRvIHRoZSBmdWxsIGRhdGFzZXQgd2l0aG91dCBjb21wcm9taXNpbmcgcGFydGljaXBhbnQgY29uZmlkZW50aWFsaXR5LiBPbmUgb2YgdGhlIG1haW4gZmFjdG9ycyBwcmV2ZW50aW5nIHJlc2VhcmNoZXJzIGZyb20gbWFraW5nIHRoZWlyIGRhdGEgb3Blbmx5IGF2YWlsYWJsZSB0byBleHRlcm5hbCBldmFsdWF0b3JzIGlzIHRoZSByaXNrIG9mIGJyZWFjaGluZyBldGhpY2FsIHByb3RvY29scyBhbmQgZXhwb3NpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbi4gSG93ZXZlciwgdXNpbmcgSUREViwgdGhlIGRhdGEgY2FuIHN0aWxsIGJlIGludmVzdGlnYXRlZCBhbmQgcmVhbmFseXplZCBieSB0aGUgdXNlciB3aXRob3V0IGFjdHVhbGx5IGhhdmluZyB0byBzaGFyZSB0aGUgZGF0YS4gTm90ZSB0aGF0IHdlIGNvdWxkIGV4cGxvcmUgYW5kIHZpc3VhbGl6ZSBkYXRhIGluIHRoZSBbRWxsaXMgYW5kIE1lcmRpYW4gKDIwMTUpIGV4YW1wbGVdKGh0dHBzOi8vcHN5Y2hvbG9neS5zaGlueWFwcHMuaW8vZXhhbXBsZTMvKSBhYm92ZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gdGhlIEZlYXIgb2YgQ3JpbWUgZGF0YXNldC4KPGJyPgoKCiMjIyBMaXZlIERhdGEgVmlzdWFsaXphdGlvbnMKCgoKCklERFYgY2FuIGNvbnRpbnVlIHRvIHJlY2VpdmUgbmV3IGRhdGEgYW5kIHVwZGF0ZSBpdHMgdmlzdWFsIHN0cnVjdHVyZSBhY2NvcmRpbmdseSwgZXZlbiBhZnRlciBpdHMgZGVwbG95bWVudC4gTm9ybWFsbHksIG9uY2UgYSBzdGF0aWMgcGxvdCBvciBncmFwaCBhcmUgcHJvZHVjZWQsIHRoZSBmaWd1cmUgY2Fubm90IGJlIGNoYW5nZWQuIFRoaXMgY2FuIGluZmx1ZW5jZSBvdXIgY29uY2x1c2lvbnMsIHRvbzsgb25jZSBhIHBhcGVyIGlzIGZpbmFsaXplZCwgdGhlIGZpZ3VyZXMgYXJlIHByb2R1Y2VkLCBzY2llbnRpc3RzIHB1Ymxpc2ggdGhlaXIgcGFwZXIgYW5kICh1c3VhbGx5KSBuZXZlciBsb29rIGJhY2suIEhvd2V2ZXIsIGluIHRoZSBjdXJyZW50IGVyYSBvZiBiaWcgZGF0YSBhbmQgY2xvdWQgdGVjaG5vbG9neSwgaXQgaXMgcG9zc2libGUgYW5kIG9mdGVuIHVzZWZ1bCB0byBzdHJlYW0gYW5kIHZpc3VhbGl6ZSBvdXIgZGF0YSBsaXZlIGFzIGl0IGlzIGJlaW5nIGNvbGxlY3RlZC4gSW1hZ2luZSB5b3UgYXJlIGNvbmR1Y3RpbmcgYSBzdHVkeSBsb29raW5nIGF0IHZhcmlvdXMgdHJhbnNhY3Rpb25zIG9uIGEgc29jaWFsIG1lZGlhIHBsYXRmb3JtIChlLmcuLCBGYWNlYm9vaywgVHdpdHRlciwgSW5zdGFncmFtKS4gVXNpbmcgSUREViwgcmVzZWFyY2hlcnMgY2FuIGZvbGxvdyBhbmQgdmlzdWFsaXplIHRoZWlyIGRhdGEgaW4gcmVhbC10aW1lIGFzIHNvY2lhbCB0cmFuc2FjdGlvbnMgdGFrZSBwbGFjZS4gRm9yIGV4YW1wbGUsIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGRhc2hib2FyZCB2aXN1YWxpemluZyBhIGxpdmVzdHJlYW0gZG93bmxvYWRzIG9mIFIgcGFja2FnZXMgZnJvbSBDUkFOIChbU2lldmVydCBldCBhbC4sIDIwMjJdKGh0dHBzOi8vcGtncy5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkLyk7IHNlZSBGaWd1cmUgNykuIEEgc2ltaWxhciBhcHAgd2FzIGF0dGVtcHRlZCBieSBbSGFkbGV5IFdpY2toYW0gKDIwMTkpXShodHRwczovL2hhZGxleS5zaGlueWFwcHMuaW8vY3Jhbi1kb3dubG9hZHMvKS4gVGhpcyBub3ZlbCBhcHByb2FjaCBvcGVucyBhIGxvdCBvZiBpbnZlc3RpZ2F0aXZlIGF2ZW51ZXMgYW5kIHByb3ZpZGVzIHVzZWZ1bCB0b29scyB0byBleHBlbmQgdGhlIGFyc2VuYWwgb2YgZGF0YSB2aXN1YWxpemF0aW9uIGFuZCByZXNlYXJjaCBjYXBhYmlsaXRpZXMuIAo8YnI+PGJyPgoKYGBge3IgRmlndXJlIDcsIGVjaG89RkFMU0UsIHdhcm5pbmc9RiwgbWVzc2FnZT1GQUxTRSwgb3V0LndpZHRoID0gJzEwMCUnfQpsaWJyYXJ5KHNoaW55KQprbml0cjo6aW5jbHVkZV9hcHAoImh0dHBzOi8vamphbGxhaXJlLnNoaW55YXBwcy5pby9zaGlueS1jcmFuZGFzaC8iKQpgYGAKPGRpdiBjbGFzcz0icGFuZWwgcGFuZWwtZGVmYXVsdCI+CioqRmlndXJlIDcuIEludGVyYWN0aXZlIGR5bmFtaWMgTGl2ZSBEYXRhIFZpc3VhbGl6YXRpb24uKiogbGl2ZXN0cmVhbSBvZiBkb3dubG9hZCBsb2dzIGZyb20gW2NyYW4ucnN0dWRpby5jb21dKGh0dHBzOi8vY3Jhbi5yc3R1ZGlvLmNvbS8pLiBUaGlzIFNoaW55IGFwcCBpbGx1c3RyYXRlcyB0aGUgbmFtZXMgYW5kIGZyZXF1ZW5jaWVzIG9mIFIgcGFja2FnZXMgZG93bmxvYWRlZCBieSB1c2Vycy4gVmlld2VycyBjYW4gYWxzbyBtYW5pcHVsYXRlIHRoZSByYXRlIGFuZCBjYXBhY2l0eSBvZiB0aGUgdmlzdWFsaXphdGlvbiwgc2NhbiB0aGUgcmF3IGxvZ3MgaW4gdGhlIHRvcCB0YWIsIHJldmlldyB0aGUgc291cmNlIGNvZGUsIGFuZCBzaGFyZSB0aGlzIGFwcCBvbiB2YXJpb3VzIHNvY2lhbCBtZWRpYSBwbGF0Zm9ybXMuCjwvZGl2PgoKCgoKCgojIyMgSUREViBhcmUgTW9yZSBFZmZlY3RpdmUgYXQgQ29tbXVuaWNhdGluZyBEYXRhCgoKCgpBcyBbTW9yZWF1XShodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5Zy4yMDE1LjAwMzQyKSBiZWF1dGlmdWxseSBwdXQgaXQsICrigJxbdl1pYSBkeW5hbWljIGFuZCBpbnRlcmFjdGl2ZSBncmFwaGljcywgdG9kYXnigJlzIHRlY2hub2xvZ3kgYWxsb3dzIHN0dWRlbnRzIHRvIHZpc3VhbGl6ZSBleHRlcm5hbGx5IHdoYXQgdGhleSBoYXZlIGRpZmZpY3VsdHkgcmVwcmVzZW50aW5nIG1lbnRhbGx54oCdKiAoMjAxNSwgcC4gMikuIEluIGEgcmVjZW50IHN0dWR5LCBbSG9vZCBhbmQgY29sbGVhZ3VlcyAoMjAyMCldKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTkuMDI5ODYgKSBmb3VuZCB0aGF0IElERFYgZmlndXJlcyBpbiBkaWdpdGFsIHB1YmxpY2F0aW9ucyB3ZXJlIG1vcmUgZWZmZWN0aXZlIGF0IGNvbW11bmljYXRpbmcgbWFpbiBlZmZlY3RzIGFuZCBudWxsIHJlbGF0aW9uc2hpcHMgdGhhbiBzdGF0aWMgZ3JhcGhzLiBJbiBhbm90aGVyIHN0dWR5IGJ5IFtSb2xmZXMgZXQgYWwuICgyMDIwKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeWcuMjAyMC4wMDY5MyksIHN0dWRlbnRzIHdobyB3ZXJlIGdpdmVuIG1hdGVyaWFscyB2aXN1YWxpemVkIHVzaW5nIElERFYgcGVyZm9ybWVkIHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gc3R1ZGVudHMgaW4gdGhlIHN0YXRpYyB2aXN1YWxpemF0aW9uIGdyb3VwLiBUaGVzZSByZXN1bHRzIHN1Z2dlc3QgdGhhdCBJRERWIG1pZ2h0IGJlIG1vcmUgZWZmZWN0aXZlIGluIGNvbW11bmljYXRpbmcgZGF0YS4gRnVydGhlcm1vcmUsIElERFYgbWFrZSBhY3RpdmUgZXhwbG9yYXRpb24gcG9zc2libGUgd2hlcmUgcmVhZGVycyBhcmUgZnJlZSB0byBpbnRlcmFjdCB3aXRoIHRoZWlyIGRhdGEgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFic29yYiBpdCBwYXNzaXZlbHk7IGZ1bmN0aW9uYWwgZW5nYWdlbWVudCBpbXByb3ZlcyBsZWFybmluZywgaW50ZXJlc3QsIGFuZCBjb21wcmVoZW5zaW9uIChbQm9kZW1lciBldCBhbC4sIDIwMDRdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oubGVhcm5pbnN0cnVjLjIwMDQuMDYuMDA2KSkuIFRoaXMgaXMgcGFydGljdWxhcmx5IGhlbHBmdWwgYmVjYXVzZSBkaXJlY3QgaW50ZXJhY3Rpb24gd2l0aCB2aXN1YWwgY29udGVudCBmYWNpbGl0YXRlcyB0aGUgaW52b2x2ZW1lbnQgb2YgdGhlIG1vdG9yIHN5c3RlbSAoW1dyYWdhIGV0IGFsLiwgMjAwM10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvUzAyNzgtMjYyNigwMykwMDAzMy0yKSksIHdoaWNoIGlzIGVzc2VudGlhbCBmb3IgYWNoaWV2aW5nIGRlZXBlciBsZXZlbHMgb2YgdW5kZXJzdGFuZGluZyAoW01vcmVhdSwgMjAxNV0oaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeWcuMjAxNS4wMDM0MikpLgo8YnI+CgojIyBDb25jbHVkaW5nIFJlbWFya3MKCgoKRGVzaWduaW5nIGFuZCBjcmVhdGluZyBJRERWIHVzZWQgdG8gYmUgYSBzb2Z0d2FyZSBkZXZlbG9wZXLigJlzIGpvYiBhbmQgcmVxdWlyZWQgZXh0ZW5zaXZlIHByb2dyYW1taW5nIHNraWxscyBpbiBKYXZhLCBIVE1MLCBvciBDU1MuIFRoaXMgY2VydGFpbmx5IG1pZ2h0IGhhdmUgYmVlbiBhbiBvYnN0YWNsZSBhbmQgZGV0ZXJyZW50IGZvciBtYW55LiBGb3J0dW5hdGVseSwgaG93ZXZlciwgdGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuIE5vd2FkYXlzLCBzY2llbnRpc3RzIGFuZCBhdXRob3JzIHdpdGggd29ya2luZyBrbm93bGVkZ2Ugb2YgUiAoW1IgQ29yZSBUZWFtLCAyMDIyXShodHRwczovL3d3dy5SLXByb2plY3Qub3JnLykpIGNhbiBnZW5lcmF0ZSB0aGVpciBvd24gZnJlZSBJRERWIHVzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgYFNoaW55YCAoW1JTdHVkaW8gVGVhbSwgMjAyMl0oaHR0cDovL3d3dy5yc3R1ZGlvLmNvbS8pKSwgYGZsZXhkYXNoYm9hcmRgIChbU2lldmVydCBldCBhbC4sIDIwMjJdKGh0dHBzOi8vcGtncy5yc3R1ZGlvLmNvbS9mbGV4ZGFzaGJvYXJkLykpIGFuZCBgZXNxdWlzc2VgIChbTWV5ZXIgJiBQZXJyaWVyLCAyMDIyXShodHRwczovL2dpdGh1Yi5jb20vZHJlYW1Scy9lc3F1aXNzZSkpIHJlbGF0aXZlbHkgZWFzaWx5LiBPZiBjb3Vyc2UsIG1ha2luZyBJRERWIGlzIGFsc28gcG9zc2libGUgd2l0aG91dCBwcm9ncmFtbWluZyBhdCBhbGwgd2hlbiB1c2luZyBbVGFibGVhdV0oaHR0cHM6Ly93d3cudGFibGVhdS5jb20vKSwgW0ZpZ21hXShodHRwczovL3d3dy5maWdtYS5jb20vKSwgYW5kIG1vcmUuIFRob3VnaCwgdGhlc2UgcGxhdGZvcm1zIG1pZ2h0IGluY2x1ZGUgZmVlcy4KPGJyPjxicj4KSUREViBhbHNvIG1ha2UgZ3JhcGhzIGFuZCBmaWd1cmVzIG11Y2ggbW9yZSBhY2Nlc3NpYmxlLiBJRERWIGFsbG93IHVzZXJzIHdpdGhvdXQgcHJpb3Igc29mdHdhcmUga25vd2xlZGdlIG9yIGZlZS1kZXBlbmRlbnQgbGljZW5zZSB0byBleHBsb3JlIGFuZCBhbmFseXplIGRhdGEuIFRoZSB1c2VyLWZyaWVuZGx5IGludGVyZmFjZSBpbXBsZW1lbnRlZCBpbiBtb3N0IElERFYgZG9lcyBub3QgcmVxdWlyZSBwcm9ncmFtbWluZyBhYmlsaXRpZXMgb3IgZG93bmxvYWRpbmcvcHVyY2hhc2luZyBzb2Z0d2FyZSwgd2hpY2ggYXJlIG90aGVyd2lzZSByZXF1aXJlZCB0byBtYW5pcHVsYXRlIGFuZCBhbmFseXplIGRhdGEuIEluIGFkZGl0aW9uLCBzaGlmdGluZyB0aGUgY29udHJvbCBvZiB2YXJpb3VzIHZpc3VhbCBmZWF0dXJlcyAoZS5nLiwgY29sb3VyLCBwb3NpdGlvbiwgc2l6ZSwgc3BlZWQpIHRvIHRoZSB1c2VyIGNhbiBtYWtlIGdyYXBocyBtb3JlIGNvbnZlbmllbnQuIEVhY2ggdXNlciBjYW4gdGFpbG9yIHRoZSBncmFwaCB0byB0aGVpciBvd24gaW5kaXZpZHVhbCBuZWVkcy4gVG8gdGhhdCBleHRlbnQsIElERFYgY2FuIGFjY29tbW9kYXRlIHdpZGVyIHJhbmdlIG9mIGFiaWxpdGllcyAoZS5nLiwgY29sb3VyIGJsaW5kLCBzaG9ydCBzaWdodGVkbmVzcywgc2xvdy9xdWljayBwcm9jZXNzaW5nIHNwZWVkLCBldGMuKS4KPGJyPjxicj4KVGhhdCBzYWlkLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IElERFYgYXJlIG5vdCBhIHNpbHZlciBidWxsZXQuIEluY29ycG9yYXRpbmcgaW50ZXJhY3RpdmUgYW5kIGR5bmFtaWMgZmVhdHVyZXMgdG8geW91ciBncmFwaHMgY2FyZWxlc3NseSB3aWxsIG5vdCBtYWtlIHRoZW0gYmV0dGVyLiBEZXNpZ25pbmcgeW91ciBJRERWIHJlcXVpcmVzIGEgbG90IG9mIHRob3VnaHQsIHBsYW5uaW5nLCBhbmQgd29yaywgcHJvYmFibHkgZXZlbiBtb3JlIHRoYW4gc3RhdGljIGdyYXBocy4gRm9yIHRoaXMgcmVhc29uLCBhcyB3aXRoIHN0YXRpYyBncmFwaGljcywgaXQgaXMgdXNlZnVsIGZvciBpbmRpdmlkdWFscyB0byBmb2xsb3cgcmVjb21tZW5kIHByYWN0aWNlcyBhbmQgZmFtaWxpYXJpemUgdGhlbXNlbHZlcyB3aXRoIHRheG9ub215IGFuZCB0ZWNobmlxdWVzIChlLmcuLCBbSGVlciAmIFNjaG5laWRlcm1hbiwgMjAxMl0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNDUvMjEzMzgwNi4yMTMzODIxKSkuCjxicj48YnI+CkluY29ycG9yYXRpbmcgSUREViBpbnRvIG1haW5zdHJlYW0gYWNhZGVtaWEgd2lsbCBub3QgYmUgZWFzeSwgaXQgY2VydGFpbmx5IHdpbGwgcmVxdWlyZSBhIGxvbmcgYWRqdXN0bWVudCBwZXJpb2QgYW5kIGEgc3RlZXAgbGVhcm5pbmcgY3VydmUgKHB1biBub3QgaW50ZW5kZWQpLiBIb3dldmVyLCBjb250aW51aW5nIHRvIGludGVncmF0ZSBuZXcgdGVjaG5vbG9naWVzIGludG8gdGhlIGZpZWxkIG9mIGRhdGEgdmlzdWFsaXphdGlvbiBpcyBpbmV2aXRhYmxlOiBpdCB3aWxsIGhhcHBlbiBpbiBhY2FkZW1pYSBhcyBpdCBpcyBoYXBwZW5pbmcgaW4gaW5kdXN0cnkgd2hlcmUgbGFyZ2UgY29ycG9yYXRpb25zIGhhdmUgYWxyZWFkeSBiZWd1biBhcHBseWluZyB0aGUg4oCcZm91cnRoIHBhcmFkaWdt4oCdIChUYW5zbGV5ICYgVG9sbGUsIDIwMDkpIG9mIGFkdmFuY2VkIGNvbXB1dGluZyBhbmQgKGJpZykgZGF0YS1kcml2ZW4gc2NpZW50aWZpYyBicmVha3Rocm91Z2hzLgo8YnI+PGJyPgpGaW5hbGx5LCB0aGUgZXhhbXBsZXMsIHJlYXNvbnMsIGFuZCB0b3BpY3MgaW4gdGhpcyBwYXBlciBvbmx5IGJlZ2luIHRvIHNjcmF0Y2ggdGhlIHN1cmZhY2UuIER5bmFtaWMgYW5kIGludGVyYWN0aXZlIGRhdGEgdmlzdWFsaXphdGlvbnMgYXJlIG5vdCBlbnRpcmVseSBuZXcuIEluIGZhY3QsIG9uZSBvY2N1cnJlbmNlIG9mIGFuIGludGVyYWN0aXZlIHN5c3RlbSBmb3IgdmlzdWFsaXppbmcgcHJvYmFiaWxpdHkgcGxvdHMgZGF0ZXMgYmFjayB0byB0aGUgbGF0ZSAxOTYwcyAoRm93bGtlcywgMTk2OSwgYXMgY2l0ZWQgaW4gW0ZyaWVuZGx5LCAyMDA4XShodHRwczovL2RvaS5vcmcvMTAuMTAwNy85NzgtMy01NDAtMzMwMzctMF8yKSkuIFN0aWxsLCB0aGVyZSBpcyBtdWNoIG1vcmUgdG8gbGVhcm4gYWJvdXQgaG93IGludGVyYWN0aXZlIGFuZCBkeW5hbWljIGZlYXR1cmVzIGFmZmVjdCBvdXIgcGVyY2VwdGlvbiBhbmQgaG93IHdlIGNhbiBoYXJuZXNzIHRoZXNlIHRvb2xzIHRvIGltcHJvdmUgZGF0YSBjb21tdW5pY2F0aW9uLiAKCg==