What is GitHub?
GitHub is a code hosting platform for version control and
collaboration. It lets you and others work together on projects from
anywhere. GitHub itself is not a development tool, but rather a file
hosting and collaboration site. In many ways, a social network like
Facebook. You can build a profile, create projects to share with others,
and follow the accounts of other users. GitHub is not linked to any one
programming language like R, as you can find all kinds
of projects based upon different languages there.
GitHub also runs Git in the background. Git is a
version control software, which means it records changes to a file or
set of files over time so that you can recall specific versions later.
We’ll learn more about Git in the next session.
You will need a GitHub account before you can start using it. If you
do not have an account already, please see the info here for creating
one.
Repositories
A repository (or “repo” for short) is a directory or storage space
for your projects on GitHub. Repositories can contain folders and files,
images, videos, spreadsheets, and data sets. Most repos include a
README.md file, which contains information
about your project. GitHub makes it easy to add one at the same time you
create your new repository. It also offers other common options such as
a license file.
Create a repository
Log into your account on GitHub.
Click on the + sign in the upper right and
select New repository.
Name your new repository testing.
Repo names can also use underscores _ and hypens
- as text delimiters, if you’d like.

Enter some simple descriptive text in the
Description field.
This can be changed later, so don’t worry about its content.

GitHub repos can be set to Public or
Private. If set to public, anyone can browse the
contents of your repo. If set to private, only you and those you specify
as collaborators can view the contents of the repo.
Go ahead and set it to the default Public.

When you create a repo, you have the option of initializing it with a
README.md file, a .gitignore file, and a
license.
For now, just check the box next to Add a README
file.

When you are finished, click on the green Create
repository button.

You now have a new repo that is ready to be populated with folders,
code, data sets, etc.

Markdown
Markdown is a simple markup language for creating formatted text
using a plain-text editor. It makes use of some special characters for
formatting headers and text. GitHub automatically recognizes Markdown
files with a .md extension and renders them as formatted
information. The repo we just created has one file in it:
README.md, and its contents are displayed at the bottom of
the repo.
Writing text
The text in a Markdown document can be formatting in a number of
ways. At a basic level, it’s just various forms of text that are
converted to nicely formatted features when the file is rendered.
Headings
You can specify different levels of headings using the hash tag
(pound) symbol #. By adding more # signs you
can decrease the heading level. So, for example, the following
# Level-1 header
## Level-2 header
### Level-3 header
#### Level-4 header
will render to
Level-1 header
Level-2 header
Level-3 header
Level-4 header
Emphasis
Italics
It’s easy to add emphasis to text. For italic face, wrap the
text with either a single asterisk (*) or a single
underscore (_). For example,
This is *italic*, but then so is _this_.
will result in
This is italic, but then so is this.
Bold
For bold face, wrap the text with either two
asterisks (**) or two underscores (__). For
example,
This is **bold**, but then so is __this__.
will render to
This is bold, but then so is
this.
Bold & italic
For combined bold and italics face, wrap
the text with three asterisks (***), such that
This is ***bold and italic***.
renders to
This is bold and italic.
Strike-through
If you want to indicate a deletion or strike-through, just
wrap the text in two tilde’s (~~), such that
Oops, ~~this is a mistake~~.
will render to
Oops, this is a mistake.
Block quotes
You can specify a block quote by preceding it with the
> symbol, such that
> I have a dream that one day this nation will rise up and live out the true meaning of its creed: 'We hold these truths to be self-evident, that all men are created equal.'
yields
I have a dream that one day this nation will rise up and live out the
true meaning of its creed: ‘We hold these truths to be self-evident,
that all men are created equal.’
Lists
You can include ordered (numbered) lists, unordered (bulleted) lists,
or a combination of the two in Markdown documents as well. Numbered
lists simply use a number and period (1.) followed by a
space and the text. For example, this text
1. This is item 1
2. Item 2 comes next
will render to
- This is item 1
- Item 2 comes next
It turns out that you don’t even have to use consecutive numbers to
make it work. For example,
1. This is item 1
7. Item 2 comes next
will render to
- This is item 1
- Item 2 comes next
You can specify an unordered list with either an asterisk
(*) or dash (-). For example, the following
text
* This is a thing
* Here is another
- And yet another
will render to
- This is a thing
- Here is another
- And yet another
Mixed lists simply use a mixture of the two constructs, such that
1. This is item 1
* This is a thing
* Here is another
2. Item 2 comes next
- And yet another
will render to
- This is item 1
- This is a thing
- Here is another
- Item 2 comes next
Links
You can insert links to websites, other files, and other locations
within a file. For websites, there are several options. The first is to
simply write out the full address inline (eg, http://www.google.com) and
it will parse correctly. You can also use shorthand text to hide the
full address or make a sentence more readable. To do that, include the
name in square brackets followed by the address inside parentheses. For
example,
Please conduct your search using [this link](http://www.google.com).
will render as
Please conduct your search using this
link.
Inserting pictures
Inline
Inserting links to images works much the same as for websites, but
you add an exclamation point (!) at the beginning of the
construct (and the text inside the square brackets in optional). For
example, here is how to include the hex logo for this class.

which will yield this

You can adjust the size of the image by specifying the height and
width in percentages within curly brackets. For example,
{ height=30% width=30% }
will yield this

Displaying R code
One of the truly great features of Markdown is the ability to include
code within a document. This course uses R, but people
also use many other languages in Markdown documents (eg, Python).
Blocks
The most common method for including code in your document is via
code blocks, which can be numerous and separated by text, images, etc.
Code blocks are delimited at the beginning and end by three back-ticks
(```). So, for example, here is a really basic code block
```
a <- 1
b <- 2
```
that would look like
a <- 1
b <- 2
Later in the course when we start using R Markdown,
you’ll see that you can execute the code within a document and display
the results.
Inline
You can also include code snippets directly within text by
surrounding it with single backticks (`). For example,
I assigned the the temporary data frame to the variable `tmp`.
will result in
I assigned the the temporary data frame to the variable
tmp.
Edit the README
You can treat the README.md file as a “landing page” for
your repo. Because it’s a Markdown document, you can display images,
lists, emphasis, etc. Similarly, you could add another
README.md file inside a folder within a repo to describe
the contents of the folder.
Edit your README.md file by clicking on the pencil icon
in the upper right.

This brings up an editing window where you can add or modify existing
text using the various formatting options via Markdown. Below you can
see where I’ve added some Markdown flavored text.
Add some Markdown to your README.md file.

You can preview a formatted version of your text by clicking the
Preview tab.

When you are done editing the text, you need to “commit” the changes.
To do so, scroll down to the bottom of the page to the box marked
Commit changes.

This is your first introduction to Git. When
committing a file, you need to include a “short but informative” commit
message to describe the changes you’ve made.
Go ahead and type a commit message in the box and then click the
green Commit changes button.
Good commit messages are no more than 50 characters long. (Mark likes
to begin his with a past-tense verb.)

Your repo has a newly formatted README.md file.

Issues
Issues are used to track to-do items, bugs, feature requests, and
more. Some people will refer to these as “tickets” or “cards”. Let’s see
how to add an issue to a repo.
Click on the Issues tab in the upper left near the
Code tab that you are on now.

At this point the Issues page is empty except for a
message from GitHub telling you a bit about Issues.

Click on the green New issue button in the upper
right.

Now you will see a window for you to enter details about the
issue.

Give your issue an informative title.

It’s common to include some details concerning an issue. For example,
you might describe a problem you’re having or a bug you’ve encountered
that will need to be fixed later. The issue description can also contain
formatted text via the same Markdown we used on our
README.md file. Below you can see where I’ve added some
details about this issue.
Add some details in the description box.
You can also make use of the tool bar to help you with
formatting, inserting links, etc.
You can create checkboxes in Markdown with
* [ ].

Just like we did when editing the README.md file, you
can preview the formatted Markdown in an issue’s description by clicking
on the Preview tab.

There are some additional options on the righthand side for assigning
collaborators to work on an issue, assigning descriptive labels to the
issue to help identify its contents, priority, etc. Notably, these
labels are also searchable from the main Issues
page.

Click on the Assignees link and then click on your
username to select yourself.

Click on the Labels link to see a list of preset
labels.

In this case I’ve added the following labels to the issue:
documentation
enhancement
good first issue

When you are finished adding a description, labels, etc, click on the
green Submit new issue button at the bottom.

You will now see your new issue as a formatted Markdown document with
lots of information about it being “Open”, the labels you added, and
another comment box at the bottom.
The checkboxes we added are dynamic and can be checked as tasks are
completed.

Click on the Issues tab in the upper left, which
will bring you back to the main Issue page.

There are a few things to note here:
there is now a number “1” inside a circle next to the Issues tab,
which means there is one open issue at the moment
you can filter issues by clicking on the Filters
dropdown menu on the left side
you can use the search bar to the right of the
Filters dropdown menu to find specific words or
topics
when there are multiple open issues, you can sort by
Author, Label, etc by clicking on the
column heading
you can see there are 3 tasks within this issue below the issue’s
title
From here you can add more issues, or click on an existing issue to
bring up its details.
Projects
Projects in GitHub are a great way to organize your
issues, set tasks, track your progress, and work with a team.
Click on the Projects tab at the top of the
page.

Here you will see some information about Projects and all of the
things you can do with them.
Click on the green downarrow next to the Link a
project button on the right and select New
project. Then click the green New project
button.

If this is your first project, you should see a welcome window like
the one below.
Click on the green Jump right in button.

You should now see a pop-up window for selecting a template with
Table as the default.

Click on Board on the the left side and then click
the green Create button.

You now have an untitled and empty project template with 3 gray boxes
labeled Todo, In Progress, and
Done.

Click on link at the top labeled @username’s untitled
project (where username is your GitHub username) to bring up
the project settings.

On the Project settings tab you can add a
name, description, and
README.

If you scroll down you will see the Danger zone
where you can change the project visibility from private to public,
close the project, or delete it.

Scroll back to the top and add a project name and description. Click
the green Save button when you are done.

Now add some text to the README and click the green
Save button when you are done.
Just as with other README sections, you can use
Markdown for emphasis, lists, links, etc.

You can click on the Manage access link on the left
to open up the project access tab. Here you can invite collaborators and
set their role.

You can click on the Status link on the left to open
up the field settings tab, which allows you to rename the column
headings in your project or add other columns/fields as well.

Click on the left arrow in the upper left to return to your project’s
main page.

Your project now has a better name.

Click on the + Add item link at the bottom of the
Todo field.

Click on the link to Add item from repository.

Select testing from the dropdown menu and then check
the box next to the Issue you created earlier. Click the green
Add selected items button when you are done.

Click on the X in the upper right to return to the
project board.

You now have a new project with one todo item.

You can click on the issue title in the todo column to see its
details. Click on the X in the upper right to close the
preview window.

Now let’s address our todo items in our open issue.
Click-and-drag the issue from Todo to In
progress.

Click in the Search or jump to… box at the top and
select your testing repository to take you back there.

Adding files and folders
Let’s address our open issue by adding some more content to our repo.
To do so, we’ll work entirely within GitHub, but later in the course
we’ll see how to add files from other locations like a local directory
on your computer.
Click on the Add file button next to the green
Code button and then select Create new
file.

We now have a window for editing the file contents similar to the one
we saw earlier when editing our README.md file. At the top
left is a box where you can type in the name of the file you’d like to
create.

If you’d like to create a new file within a new folder, you begin by
typing the folder name followed by a / and then file name.
You’ll notice that as soon as you type the / after the
folder name that GitHub will automatically shift the text box to focus
on the file name.
Create a new R script within a folder called
R, and name it 00_testing.R.

Navigate to the editing box and add some simple R
code (it doesn’t matter what code you add).

When you are finished, scroll down to the Commit new
file area, enter a brief but informative commit message, and
click on the green Commit new file button.

You can now see the contents of the new /R folder, which
at the moment contains only the new 00_testing.R file we
just created.
In addition to the file name, you can see the commit message you used
when committing the file (“created test R script for demo”) and when the
file was committed (“now”).

You can click on the file name to inspect the file’s contents.

Click on the Code tab in the upper left, which will
take you back the repo’s main page.
Here you can see our new R folder just above our
existing README.md file.

Now let’s add a simple data file called example_data.csv
and place it within a new folder called data.
Click on the Add file button next to the green
Code button and then selecting Create new
file. Type the folder name and file name in the box and add the
following information in the editing box (you can copy and paste if
you’d like):
last_name, first_name, role
Scheuerell, Mark, instructor
Adams, Mary, TA
Manion, Lance, student

When you are finished, scroll down to the Commit new
file area, enter a brief but informative commit message, and
click on the green Commit new file button.

Just as when we created our R script within the
/R folder, you can now see the new
example_data.csv file we just created within the
/data folder.

Click on the Code tab in the upper left, which will
take you back the repo’s main page where you will see the new
/data folder just below our existing /R
folder.

Closing an Issue
Now that we’ve added some new folders and files to our repo, let’s
return to the Issue we created earlier and “close” it.
Click on the Issues tab on the top of the page to
take you back to our open issue.

Click on the issue’s title, which will open it up and show you all of
the details.

Check the boxes next to the 3 open tasks.
As you check off boxes next to tasks, GitHub will automatically
update the number completed under the issue’s title.

At the bottom of the issue you will see a comment box with two
buttons below it: Close issue and
Comment. You don’t need to add a comment when closing
an issue, but it’s often helpful to do so.
Add a comment and then click the Close with comment
button.

You’ll now see that GitHub has marked the issue with a purple
“Closed” label under the issue name.

Click on the Issues tab to return to the Issues page
where GitHub informs you that there aren’t any open issues.

Closing a project
Let’s return to our project and check on our progress now that we’ve
closed the open issue.
Click on the Projects tab to take you back to the
main Projects page where your project is listed and then click on the
project name to open it back up.

GitHub automatically moved the open issue to the
Done column when you closed it earlier.

Endnote
Congratulations!
You’ve now successfully done the following:
created a new repo on GitHub
edited your README.md file
created an issue
created a project
added some additional content to your repo
closed an issue
managed your project
LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIEdpdEh1YiIKZGF0ZTogIjEzIEphbnVhcnkgMjAyNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogc3BhY2VsYWIKICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKICAgIGNzczogLi4vbGVjdHVyZV9pbnN0LmNzcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKPGJyPgoKIyBXaGF0IGlzIEdpdEh1Yj8KCkdpdEh1YiBpcyBhIGNvZGUgaG9zdGluZyBwbGF0Zm9ybSBmb3IgdmVyc2lvbiBjb250cm9sIGFuZCBjb2xsYWJvcmF0aW9uLiBJdCBsZXRzIHlvdSBhbmQgb3RoZXJzIHdvcmsgdG9nZXRoZXIgb24gcHJvamVjdHMgZnJvbSBhbnl3aGVyZS4gR2l0SHViIGl0c2VsZiBpcyBub3QgYSBkZXZlbG9wbWVudCB0b29sLCBidXQgcmF0aGVyIGEgZmlsZSBob3N0aW5nIGFuZCBjb2xsYWJvcmF0aW9uIHNpdGUuIEluIG1hbnkgd2F5cywgYSBzb2NpYWwgbmV0d29yayBsaWtlIEZhY2Vib29rLiBZb3UgY2FuIGJ1aWxkIGEgcHJvZmlsZSwgY3JlYXRlIHByb2plY3RzIHRvIHNoYXJlIHdpdGggb3RoZXJzLCBhbmQgZm9sbG93IHRoZSBhY2NvdW50cyBvZiBvdGhlciB1c2Vycy4gR2l0SHViIGlzIG5vdCBsaW5rZWQgdG8gYW55IG9uZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBsaWtlICoqUioqLCBhcyB5b3UgY2FuIGZpbmQgYWxsIGtpbmRzIG9mIHByb2plY3RzIGJhc2VkIHVwb24gZGlmZmVyZW50IGxhbmd1YWdlcyB0aGVyZS4KCkdpdEh1YiBhbHNvIHJ1bnMgKipHaXQqKiBpbiB0aGUgYmFja2dyb3VuZC4gR2l0IGlzIGEgdmVyc2lvbiBjb250cm9sIHNvZnR3YXJlLCB3aGljaCBtZWFucyBpdCByZWNvcmRzIGNoYW5nZXMgdG8gYSBmaWxlIG9yIHNldCBvZiBmaWxlcyBvdmVyIHRpbWUgc28gdGhhdCB5b3UgY2FuIHJlY2FsbCBzcGVjaWZpYyB2ZXJzaW9ucyBsYXRlci4gV2UnbGwgbGVhcm4gbW9yZSBhYm91dCBHaXQgaW4gdGhlIG5leHQgc2Vzc2lvbi4KCjo6OiBub3RlCgpZb3Ugd2lsbCBuZWVkIGEgR2l0SHViIGFjY291bnQgYmVmb3JlIHlvdSBjYW4gc3RhcnQgdXNpbmcgaXQuIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY2NvdW50IGFscmVhZHksIHBsZWFzZSBzZWUgdGhlIGluZm8gW2hlcmVdKC4uLy4uL3JlZmVyZW5jZXMvZ2l0aHViX3NpZ251cC5odG1sKSBmb3IgY3JlYXRpbmcgb25lLgoKOjo6CgoqKioKCiMgUmVwb3NpdG9yaWVzCgpBIHJlcG9zaXRvcnkgKG9yICJyZXBvIiBmb3Igc2hvcnQpIGlzIGEgZGlyZWN0b3J5IG9yIHN0b3JhZ2Ugc3BhY2UgZm9yIHlvdXIgcHJvamVjdHMgb24gR2l0SHViLiBSZXBvc2l0b3JpZXMgY2FuIGNvbnRhaW4gZm9sZGVycyBhbmQgZmlsZXMsIGltYWdlcywgdmlkZW9zLCBzcHJlYWRzaGVldHMsIGFuZCBkYXRhIHNldHMuIE1vc3QgcmVwb3MgaW5jbHVkZSBhICoqYFJFQURNRS5tZGAqKiBmaWxlLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHByb2plY3QuIEdpdEh1YiBtYWtlcyBpdCBlYXN5IHRvIGFkZCBvbmUgYXQgdGhlIHNhbWUgdGltZSB5b3UgY3JlYXRlIHlvdXIgbmV3IHJlcG9zaXRvcnkuIEl0IGFsc28gb2ZmZXJzIG90aGVyIGNvbW1vbiBvcHRpb25zIHN1Y2ggYXMgYSBsaWNlbnNlIGZpbGUuCgojIENyZWF0ZSBhIHJlcG9zaXRvcnkKCjo6OiB0YXNrCgoxKSBMb2cgaW50byB5b3VyIGFjY291bnQgb24gR2l0SHViLgoKMikgQ2xpY2sgb24gdGhlICoqKyoqIHNpZ24gaW4gdGhlIHVwcGVyIHJpZ2h0IGFuZCBzZWxlY3QgKipOZXcgcmVwb3NpdG9yeSoqLgoKOjo6CgohW10oaW1hZ2VzL2doX25ld19yZXBvLnBuZykKPGJyPgo8YnI+Cgo6OjogdGFzawoKTmFtZSB5b3VyIG5ldyByZXBvc2l0b3J5ICoqdGVzdGluZyoqLgoKOjo6CgoKOjo6IHRpcAoKUmVwbyBuYW1lcyBjYW4gYWxzbyB1c2UgdW5kZXJzY29yZXMgYF9gIGFuZCBoeXBlbnMgYC1gIGFzIHRleHQgZGVsaW1pdGVycywgaWYgeW91J2QgbGlrZS4KCjo6OgoKIVtdKGltYWdlcy9naF9yZXBvX25hbWUucG5nKQoKPGJyPgoKCjo6OiB0YXNrCgpFbnRlciBzb21lIHNpbXBsZSBkZXNjcmlwdGl2ZSB0ZXh0IGluIHRoZSAqKkRlc2NyaXB0aW9uKiogZmllbGQuCgo6OjoKCgo6OjogdGlwCgpUaGlzIGNhbiBiZSBjaGFuZ2VkIGxhdGVyLCBzbyBkb24ndCB3b3JyeSBhYm91dCBpdHMgY29udGVudC4KCjo6OgoKIVtdKGltYWdlcy9naF9yZXBvX2Rlc2NyaXB0aW9uLnBuZykKCjxicj4KCjo6OiB0aXAKCkdpdEh1YiByZXBvcyBjYW4gYmUgc2V0IHRvICoqUHVibGljKiogb3IgKipQcml2YXRlKiouIElmIHNldCB0byBwdWJsaWMsIGFueW9uZSBjYW4gYnJvd3NlIHRoZSBjb250ZW50cyBvZiB5b3VyIHJlcG8uIElmIHNldCB0byBwcml2YXRlLCBvbmx5IHlvdSBhbmQgdGhvc2UgeW91IHNwZWNpZnkgYXMgY29sbGFib3JhdG9ycyBjYW4gdmlldyB0aGUgY29udGVudHMgb2YgdGhlIHJlcG8uCgo6OjoKCjo6OiB0YXNrCgpHbyBhaGVhZCBhbmQgc2V0IGl0IHRvIHRoZSBkZWZhdWx0ICoqUHVibGljKiouCgo6OjoKCiFbXShpbWFnZXMvZ2hfcmVwb19wdWJsaWMucG5nKQoKPGJyPgoKOjo6IHRpcAoKV2hlbiB5b3UgY3JlYXRlIGEgcmVwbywgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBpbml0aWFsaXppbmcgaXQgd2l0aCBhIGBSRUFETUUubWRgIGZpbGUsIGEgYC5naXRpZ25vcmVgIGZpbGUsIGFuZCBhIGxpY2Vuc2UuCgo6OjoKCjo6OiB0YXNrCgpGb3Igbm93LCBqdXN0IGNoZWNrIHRoZSBib3ggbmV4dCB0byAqKkFkZCBhIFJFQURNRSBmaWxlKiouCgo6OjoKCiFbXShpbWFnZXMvZ2hfcmVwb19yZWFkbWUucG5nKQoKPGJyPgoKOjo6IHRhc2sKCldoZW4geW91IGFyZSBmaW5pc2hlZCwgY2xpY2sgb24gdGhlIGdyZWVuICoqQ3JlYXRlIHJlcG9zaXRvcnkqKiBidXR0b24uCgo6OjoKCiFbXShpbWFnZXMvZ2hfcmVwb19jcmVhdGUucG5nKQoKPGJyPgoKOjo6IHN1Y2Nlc3MKCllvdSBub3cgaGF2ZSBhIG5ldyByZXBvIHRoYXQgaXMgcmVhZHkgdG8gYmUgcG9wdWxhdGVkIHdpdGggZm9sZGVycywgY29kZSwgZGF0YSBzZXRzLCBldGMuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcmVwb19uZXctdmlldy5wbmcpCgoqKioKCiMgTWFya2Rvd24KCk1hcmtkb3duIGlzIGEgc2ltcGxlIG1hcmt1cCBsYW5ndWFnZSBmb3IgY3JlYXRpbmcgZm9ybWF0dGVkIHRleHQgdXNpbmcgYSBwbGFpbi10ZXh0IGVkaXRvci4gSXQgbWFrZXMgdXNlIG9mIHNvbWUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBmb3JtYXR0aW5nIGhlYWRlcnMgYW5kIHRleHQuIEdpdEh1YiBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZXMgTWFya2Rvd24gZmlsZXMgd2l0aCBhIGAubWRgIGV4dGVuc2lvbiBhbmQgcmVuZGVycyB0aGVtIGFzIGZvcm1hdHRlZCBpbmZvcm1hdGlvbi4gVGhlIHJlcG8gd2UganVzdCBjcmVhdGVkIGhhcyBvbmUgZmlsZSBpbiBpdDogYFJFQURNRS5tZGAsIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSByZXBvLgoKIyMgV3JpdGluZyB0ZXh0CgpUaGUgdGV4dCBpbiBhIE1hcmtkb3duIGRvY3VtZW50IGNhbiBiZSBmb3JtYXR0aW5nIGluIGEgbnVtYmVyIG9mIHdheXMuIEF0IGEgYmFzaWMgbGV2ZWwsIGl0J3MganVzdCB2YXJpb3VzIGZvcm1zIG9mIHRleHQgdGhhdCBhcmUgY29udmVydGVkIHRvIG5pY2VseSBmb3JtYXR0ZWQgZmVhdHVyZXMgd2hlbiB0aGUgZmlsZSBpcyByZW5kZXJlZC4KCiMjIyBIZWFkaW5ncwoKWW91IGNhbiBzcGVjaWZ5IGRpZmZlcmVudCBsZXZlbHMgb2YgaGVhZGluZ3MgdXNpbmcgdGhlIGhhc2ggdGFnIChwb3VuZCkgc3ltYm9sIGAjYC4gQnkgYWRkaW5nIG1vcmUgYCNgIHNpZ25zIHlvdSBjYW4gZGVjcmVhc2UgdGhlIGhlYWRpbmcgbGV2ZWwuIFNvLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwoKYGBgCiMgTGV2ZWwtMSBoZWFkZXIKIyMgTGV2ZWwtMiBoZWFkZXIKIyMjIExldmVsLTMgaGVhZGVyCiMjIyMgTGV2ZWwtNCBoZWFkZXIKYGBgCgp3aWxsIHJlbmRlciB0byAKCjxwIHN0eWxlPSJmb250LXdlaWdodDo1MDA7IGZvbnQtc2l6ZTozNHB4Ij5MZXZlbC0xIGhlYWRlcjwvcD4KPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OjUwMDsgZm9udC1zaXplOjMwcHgiPkxldmVsLTIgaGVhZGVyPC9wPgo8cCBzdHlsZT0iZm9udC13ZWlnaHQ6NTAwOyBmb250LXNpemU6MjRweCI+TGV2ZWwtMyBoZWFkZXI8L3A+CjxwIHN0eWxlPSJmb250LXdlaWdodDo1MDA7IGZvbnQtc2l6ZToxOHB4Ij5MZXZlbC00IGhlYWRlcjwvcD4gCgo8YnI+CgojIyMgRW1waGFzaXMgCgojIyMjIEl0YWxpY3MKCkl0J3MgZWFzeSB0byBhZGQgZW1waGFzaXMgdG8gdGV4dC4gRm9yICppdGFsaWMqIGZhY2UsIHdyYXAgdGhlIHRleHQgd2l0aCBlaXRoZXIgYSBzaW5nbGUgYXN0ZXJpc2sgKGAqYCkgb3IgYSBzaW5nbGUgdW5kZXJzY29yZSAoYF9gKS4gRm9yIGV4YW1wbGUsCgpgYGAKVGhpcyBpcyAqaXRhbGljKiwgYnV0IHRoZW4gc28gaXMgX3RoaXNfLgpgYGAKCndpbGwgcmVzdWx0IGluCgpUaGlzIGlzICppdGFsaWMqLCBidXQgdGhlbiBzbyBpcyBfdGhpc18uCgo8YnI+CgojIyMjIEJvbGQKCkZvciAqKmJvbGQqKiBmYWNlLCB3cmFwIHRoZSB0ZXh0IHdpdGggZWl0aGVyIHR3byBhc3Rlcmlza3MgKGAqKmApIG9yIHR3byB1bmRlcnNjb3JlcyAoYF9fYCkuIEZvciBleGFtcGxlLAoKYGBgClRoaXMgaXMgKipib2xkKiosIGJ1dCB0aGVuIHNvIGlzIF9fdGhpc19fLgpgYGAKCndpbGwgcmVuZGVyIHRvIAoKVGhpcyBpcyAqKmJvbGQqKiwgYnV0IHRoZW4gc28gaXMgX190aGlzX18uCgo8YnI+CgojIyMjIEJvbGQgJiBpdGFsaWMKCkZvciBjb21iaW5lZCAqKipib2xkIGFuZCBpdGFsaWNzKioqIGZhY2UsIHdyYXAgdGhlIHRleHQgd2l0aCB0aHJlZSBhc3Rlcmlza3MgKGAqKipgKSwgc3VjaCB0aGF0CgpgYGAKVGhpcyBpcyAqKipib2xkIGFuZCBpdGFsaWMqKiouCmBgYAoKcmVuZGVycyB0bwoKVGhpcyBpcyAqKipib2xkIGFuZCBpdGFsaWMqKiouCgo8YnI+CgojIyMjIFN0cmlrZS10aHJvdWdoCgpJZiB5b3Ugd2FudCB0byBpbmRpY2F0ZSBhIGRlbGV0aW9uIG9yIH5+c3RyaWtlLXRocm91Z2h+fiwganVzdCB3cmFwIHRoZSB0ZXh0IGluIHR3byB0aWxkZSdzIChgfn5gKSwgc3VjaCB0aGF0CgpgYGAKT29wcywgfn50aGlzIGlzIGEgbWlzdGFrZX5+LgpgYGAKCndpbGwgcmVuZGVyIHRvIAoKT29wcywgfn50aGlzIGlzIGEgbWlzdGFrZX5+LgoKIyMjIEJsb2NrIHF1b3RlcwoKWW91IGNhbiBzcGVjaWZ5IGEgYmxvY2sgcXVvdGUgYnkgcHJlY2VkaW5nIGl0IHdpdGggdGhlIGA+YCBzeW1ib2wsIHN1Y2ggdGhhdAoKYGBgCj4gSSBoYXZlIGEgZHJlYW0gdGhhdCBvbmUgZGF5IHRoaXMgbmF0aW9uIHdpbGwgcmlzZSB1cCBhbmQgbGl2ZSBvdXQgdGhlIHRydWUgbWVhbmluZyBvZiBpdHMgY3JlZWQ6ICdXZSBob2xkIHRoZXNlIHRydXRocyB0byBiZSBzZWxmLWV2aWRlbnQsIHRoYXQgYWxsIG1lbiBhcmUgY3JlYXRlZCBlcXVhbC4nCmBgYAoKeWllbGRzCgo+IEkgaGF2ZSBhIGRyZWFtIHRoYXQgb25lIGRheSB0aGlzIG5hdGlvbiB3aWxsIHJpc2UgdXAgYW5kIGxpdmUgb3V0IHRoZSB0cnVlIG1lYW5pbmcgb2YgaXRzIGNyZWVkOiAnV2UgaG9sZCB0aGVzZSB0cnV0aHMgdG8gYmUgc2VsZi1ldmlkZW50LCB0aGF0IGFsbCBtZW4gYXJlIGNyZWF0ZWQgZXF1YWwuJwoKIyMjIExpc3RzCgpZb3UgY2FuIGluY2x1ZGUgb3JkZXJlZCAobnVtYmVyZWQpIGxpc3RzLCB1bm9yZGVyZWQgKGJ1bGxldGVkKSBsaXN0cywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGluIE1hcmtkb3duIGRvY3VtZW50cyBhcyB3ZWxsLiBOdW1iZXJlZCBsaXN0cyBzaW1wbHkgdXNlIGEgbnVtYmVyIGFuZCBwZXJpb2QgKGAxLmApIGZvbGxvd2VkIGJ5IGEgc3BhY2UgYW5kIHRoZSB0ZXh0LiBGb3IgZXhhbXBsZSwgdGhpcyB0ZXh0CgpgYGAKMS4gVGhpcyBpcyBpdGVtIDEgIAoyLiBJdGVtIDIgY29tZXMgbmV4dApgYGAKICAgICAKd2lsbCByZW5kZXIgdG8KICAgICAKMS4gVGhpcyBpcyBpdGVtIDEgIAoyLiBJdGVtIDIgY29tZXMgbmV4dAoKSXQgdHVybnMgb3V0IHRoYXQgeW91IGRvbid0IGV2ZW4gaGF2ZSB0byB1c2UgY29uc2VjdXRpdmUgbnVtYmVycyB0byBtYWtlIGl0IHdvcmsuIEZvciBleGFtcGxlLAoKYGBgCjEuIFRoaXMgaXMgaXRlbSAxICAKNy4gSXRlbSAyIGNvbWVzIG5leHQKYGBgCgp3aWxsIHJlbmRlciB0bwoKMS4gVGhpcyBpcyBpdGVtIDEgIAo3LiBJdGVtIDIgY29tZXMgbmV4dAoKWW91IGNhbiBzcGVjaWZ5IGFuIHVub3JkZXJlZCBsaXN0IHdpdGggZWl0aGVyIGFuIGFzdGVyaXNrIChgKmApIG9yIGRhc2ggKGAtYCkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRleHQgCgpgYGAKKiBUaGlzIGlzIGEgdGhpbmcgCiogSGVyZSBpcyBhbm90aGVyCi0gQW5kIHlldCBhbm90aGVyCmBgYAoKd2lsbCByZW5kZXIgdG8KCiogVGhpcyBpcyBhIHRoaW5nIAoqIEhlcmUgaXMgYW5vdGhlcgotIEFuZCB5ZXQgYW5vdGhlcgoKTWl4ZWQgbGlzdHMgc2ltcGx5IHVzZSBhIG1peHR1cmUgb2YgdGhlIHR3byBjb25zdHJ1Y3RzLCBzdWNoIHRoYXQgCgpgYGAKMS4gVGhpcyBpcyBpdGVtIDEKICAgKiBUaGlzIGlzIGEgdGhpbmcKICAgKiBIZXJlIGlzIGFub3RoZXIgIAoyLiBJdGVtIDIgY29tZXMgbmV4dAogICAtIEFuZCB5ZXQgYW5vdGhlcgpgYGAKCndpbGwgcmVuZGVyIHRvCgoxLiBUaGlzIGlzIGl0ZW0gMQogICogVGhpcyBpcyBhIHRoaW5nCiAgKiBIZXJlIGlzIGFub3RoZXIgIAoyLiBJdGVtIDIgY29tZXMgbmV4dAogIC0gQW5kIHlldCBhbm90aGVyCiAgCiMjIyBMaW5rcwoKWW91IGNhbiBpbnNlcnQgbGlua3MgdG8gd2Vic2l0ZXMsIG90aGVyIGZpbGVzLCBhbmQgb3RoZXIgbG9jYXRpb25zIHdpdGhpbiBhIGZpbGUuIEZvciB3ZWJzaXRlcywgdGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucy4gVGhlIGZpcnN0IGlzIHRvIHNpbXBseSB3cml0ZSBvdXQgdGhlIGZ1bGwgYWRkcmVzcyBpbmxpbmUgKGVnLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pIGFuZCBpdCB3aWxsIHBhcnNlIGNvcnJlY3RseS4gWW91IGNhbiBhbHNvIHVzZSBzaG9ydGhhbmQgdGV4dCB0byBoaWRlIHRoZSBmdWxsIGFkZHJlc3Mgb3IgbWFrZSBhIHNlbnRlbmNlIG1vcmUgcmVhZGFibGUuIFRvIGRvIHRoYXQsIGluY2x1ZGUgdGhlIG5hbWUgaW4gc3F1YXJlIGJyYWNrZXRzIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIGluc2lkZSBwYXJlbnRoZXNlcy4gRm9yIGV4YW1wbGUsCgpgYGAKUGxlYXNlIGNvbmR1Y3QgeW91ciBzZWFyY2ggdXNpbmcgW3RoaXMgbGlua10oaHR0cDovL3d3dy5nb29nbGUuY29tKS4KYGBgCgp3aWxsIHJlbmRlciBhcwoKUGxlYXNlIGNvbmR1Y3QgeW91ciBzZWFyY2ggdXNpbmcgW3RoaXMgbGlua10oaHR0cDovL3d3dy5nb29nbGUuY29tKS4KCiMjIyBJbnNlcnRpbmcgcGljdHVyZXMKCiMjIyMgSW5saW5lCgpJbnNlcnRpbmcgbGlua3MgdG8gaW1hZ2VzIHdvcmtzIG11Y2ggdGhlIHNhbWUgYXMgZm9yIHdlYnNpdGVzLCBidXQgeW91IGFkZCBhbiBleGNsYW1hdGlvbiBwb2ludCAoYCFgKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb25zdHJ1Y3QgKGFuZCB0aGUgdGV4dCBpbnNpZGUgdGhlIHNxdWFyZSBicmFja2V0cyBpbiBvcHRpb25hbCkuIEZvciBleGFtcGxlLCBoZXJlIGlzIGhvdyB0byBpbmNsdWRlIHRoZSBoZXggbG9nbyBmb3IgdGhpcyBjbGFzcy4KCmBgYAohW10oaGV4c3RpY2tlci5wbmcpCmBgYAoKd2hpY2ggd2lsbCB5aWVsZCB0aGlzCgo8aW1nIHNyYz0iaW1hZ2VzL0ZJU0g1NDlfaGV4X3N0aWNrZXIucG5nIiBjbGFzcz0ibm9ib3JkZXIiPgoKPGJyPgoKWW91IGNhbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGltYWdlIGJ5IHNwZWNpZnlpbmcgdGhlIGhlaWdodCBhbmQgd2lkdGggaW4gcGVyY2VudGFnZXMgd2l0aGluIGN1cmx5IGJyYWNrZXRzLiBGb3IgZXhhbXBsZSwKCmBgYAohW10oaGV4c3RpY2tlci5wbmcpeyBoZWlnaHQ9MzAlIHdpZHRoPTMwJSB9CmBgYAoKd2lsbCB5aWVsZCB0aGlzCgo8aW1nIHNyYz0iaW1hZ2VzL0ZJU0g1NDlfaGV4X3N0aWNrZXIucG5nIiBjbGFzcz0ibm9ib3JkZXItc21hbGwiPgoKCiMjIERpc3BsYXlpbmcgUiBjb2RlCgpPbmUgb2YgdGhlIHRydWx5IGdyZWF0IGZlYXR1cmVzIG9mIE1hcmtkb3duIGlzIHRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgY29kZSB3aXRoaW4gYSBkb2N1bWVudC4gVGhpcyBjb3Vyc2UgdXNlcyAqKlIqKiwgYnV0IHBlb3BsZSBhbHNvIHVzZSBtYW55IG90aGVyIGxhbmd1YWdlcyBpbiBNYXJrZG93biBkb2N1bWVudHMgKGVnLCBQeXRob24pLgoKIyMjIEJsb2NrcwoKVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNvZGUgaW4geW91ciBkb2N1bWVudCBpcyB2aWEgY29kZSBibG9ja3MsIHdoaWNoIGNhbiBiZSBudW1lcm91cyBhbmQgc2VwYXJhdGVkIGJ5IHRleHQsIGltYWdlcywgZXRjLiBDb2RlIGJsb2NrcyBhcmUgZGVsaW1pdGVkIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBieSB0aHJlZSBiYWNrLXRpY2tzIChcYFxgXGApLiBTbywgZm9yIGV4YW1wbGUsIGhlcmUgaXMgYSByZWFsbHkgYmFzaWMgY29kZSBibG9jawoKYGBgYApgciAnJ2BgYGAKYSA8LSAxCmIgPC0gMgpgYGAKYGBgYAoKdGhhdCB3b3VsZCBsb29rIGxpa2UKCmBgYHtyLCBldmFsPUZBTFNFfQphIDwtIDEKYiA8LSAyCmBgYAoKTGF0ZXIgaW4gdGhlIGNvdXJzZSB3aGVuIHdlIHN0YXJ0IHVzaW5nICoqUiBNYXJrZG93bioqLCB5b3UnbGwgc2VlIHRoYXQgeW91IGNhbiBleGVjdXRlIHRoZSBjb2RlIHdpdGhpbiBhIGRvY3VtZW50IGFuZCBkaXNwbGF5IHRoZSByZXN1bHRzLgoKIyMjIElubGluZQoKWW91IGNhbiBhbHNvIGluY2x1ZGUgY29kZSBzbmlwcGV0cyBkaXJlY3RseSB3aXRoaW4gdGV4dCBieSBzdXJyb3VuZGluZyBpdCB3aXRoIHNpbmdsZSBiYWNrdGlja3MgKFxgKS4gRm9yIGV4YW1wbGUsCgpgYGAKSSBhc3NpZ25lZCB0aGUgdGhlIHRlbXBvcmFyeSBkYXRhIGZyYW1lIHRvIHRoZSB2YXJpYWJsZSBgdG1wYC4KYGBgCgp3aWxsIHJlc3VsdCBpbiAKCkkgYXNzaWduZWQgdGhlIHRoZSB0ZW1wb3JhcnkgZGF0YSBmcmFtZSB0byB0aGUgdmFyaWFibGUgYHRtcGAuCgo8YnI+CgojIEVkaXQgdGhlIFJFQURNRQoKWW91IGNhbiB0cmVhdCB0aGUgYFJFQURNRS5tZGAgZmlsZSBhcyBhICJsYW5kaW5nIHBhZ2UiIGZvciB5b3VyIHJlcG8uIEJlY2F1c2UgaXQncyBhIE1hcmtkb3duIGRvY3VtZW50LCB5b3UgY2FuIGRpc3BsYXkgaW1hZ2VzLCBsaXN0cywgZW1waGFzaXMsIGV0Yy4gU2ltaWxhcmx5LCB5b3UgY291bGQgYWRkIGFub3RoZXIgYFJFQURNRS5tZGAgZmlsZSBpbnNpZGUgYSBmb2xkZXIgd2l0aGluIGEgcmVwbyB0byBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgdGhlIGZvbGRlci4KCjxicj4KCjo6OiB0YXNrCgpFZGl0IHlvdXIgYFJFQURNRS5tZGAgZmlsZSBieSBjbGlja2luZyBvbiB0aGUgcGVuY2lsIGljb24gaW4gdGhlIHVwcGVyIHJpZ2h0LgoKOjo6CgohW10oaW1hZ2VzL2doX2VkaXRfcmVhZG1lLnBuZykKCjxicj4KClRoaXMgYnJpbmdzIHVwIGFuIGVkaXRpbmcgd2luZG93IHdoZXJlIHlvdSBjYW4gYWRkIG9yIG1vZGlmeSBleGlzdGluZyB0ZXh0IHVzaW5nIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgb3B0aW9ucyB2aWEgTWFya2Rvd24uIEJlbG93IHlvdSBjYW4gc2VlIHdoZXJlIEkndmUgYWRkZWQgc29tZSBNYXJrZG93biBmbGF2b3JlZCB0ZXh0LiAKCjxicj4KCjo6OiB0YXNrCgpBZGQgc29tZSBNYXJrZG93biB0byB5b3VyIGBSRUFETUUubWRgIGZpbGUuCgo6OjoKCiFbXShpbWFnZXMvZ2hfZWRpdF9yZWFkbWUtdGV4dC5wbmcpCgo8YnI+Cgo6OjogdGlwCgpZb3UgY2FuIHByZXZpZXcgYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB5b3VyIHRleHQgYnkgY2xpY2tpbmcgdGhlICoqUHJldmlldyoqIHRhYi4KCjo6OgoKCiFbXShpbWFnZXMvZ2hfZWRpdF9yZWFkbWUtcHJldmlldy5wbmcpCgo8YnI+CgpXaGVuIHlvdSBhcmUgZG9uZSBlZGl0aW5nIHRoZSB0ZXh0LCB5b3UgbmVlZCB0byAiY29tbWl0IiB0aGUgY2hhbmdlcy4gVG8gZG8gc28sIHNjcm9sbCBkb3duIHRvIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UgdG8gdGhlIGJveCBtYXJrZWQgKipDb21taXQgY2hhbmdlcyoqLgoKPGJyPgoKIVtdKGltYWdlcy9naF9jb21taXRfcmVhZG1lLnBuZykKCjxicj4KClRoaXMgaXMgeW91ciBmaXJzdCBpbnRyb2R1Y3Rpb24gdG8gKipHaXQqKi4gV2hlbiBjb21taXR0aW5nIGEgZmlsZSwgeW91IG5lZWQgdG8gaW5jbHVkZSBhICJzaG9ydCBidXQgaW5mb3JtYXRpdmUiIGNvbW1pdCBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoZSBjaGFuZ2VzIHlvdSd2ZSBtYWRlLiAKCjxicj4KCjo6OiB0YXNrCgpHbyBhaGVhZCBhbmQgdHlwZSBhIGNvbW1pdCBtZXNzYWdlIGluIHRoZSBib3ggYW5kIHRoZW4gY2xpY2sgdGhlIGdyZWVuICoqQ29tbWl0IGNoYW5nZXMqKiBidXR0b24uCgo6OjoKCjo6OiB0aXAKCkdvb2QgY29tbWl0IG1lc3NhZ2VzIGFyZSBubyBtb3JlIHRoYW4gNTAgY2hhcmFjdGVycyBsb25nLiAoTWFyayBsaWtlcyB0byBiZWdpbiBoaXMgd2l0aCBhIHBhc3QtdGVuc2UgdmVyYi4pCgo6OjoKCjxicj4KCiFbXShpbWFnZXMvZ2hfY29tbWl0X3JlYWRtZV9tc2cucG5nKQoKPGJyPgoKOjo6IHN1Y2Nlc3MKCllvdXIgcmVwbyBoYXMgYSBuZXdseSBmb3JtYXR0ZWQgYFJFQURNRS5tZGAgZmlsZS4KCjo6OgoKIVtdKGltYWdlcy9naF9yZXBvX3JlYWRtZV9lZGl0ZWQucG5nKQoKPGJyPgoKKioqCgojIElzc3VlcwoKSXNzdWVzIGFyZSB1c2VkIHRvIHRyYWNrIHRvLWRvIGl0ZW1zLCBidWdzLCBmZWF0dXJlIHJlcXVlc3RzLCBhbmQgbW9yZS4gU29tZSBwZW9wbGUgd2lsbCByZWZlciB0byB0aGVzZSBhcyAidGlja2V0cyIgb3IgImNhcmRzIi4gTGV0J3Mgc2VlIGhvdyB0byBhZGQgYW4gaXNzdWUgdG8gYSByZXBvLgoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSAqKklzc3VlcyoqIHRhYiBpbiB0aGUgdXBwZXIgbGVmdCBuZWFyIHRoZSAqKkNvZGUqKiB0YWIgdGhhdCB5b3UgYXJlIG9uIG5vdy4KCjo6OgoKIVtdKGltYWdlcy9naF9yZXBvX2lzc3Vlcy5wbmcpCgo8YnI+Cgo6Ojogbm90ZQoKQXQgdGhpcyBwb2ludCB0aGUgKipJc3N1ZXMqKiBwYWdlIGlzIGVtcHR5IGV4Y2VwdCBmb3IgYSBtZXNzYWdlIGZyb20gR2l0SHViIHRlbGxpbmcgeW91IGEgYml0IGFib3V0IElzc3Vlcy4KCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9sYW5kaW5nLXBhZ2UucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSBncmVlbiAqKk5ldyBpc3N1ZSoqIGJ1dHRvbiBpbiB0aGUgdXBwZXIgcmlnaHQuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVfbmV3LnBuZykKCjxicj4KCk5vdyB5b3Ugd2lsbCBzZWUgYSB3aW5kb3cgZm9yIHlvdSB0byBlbnRlciBkZXRhaWxzIGFib3V0IHRoZSBpc3N1ZS4KCjxicj4KCiFbXShpbWFnZXMvZ2hfaXNzdWVfbmV3LWJsYW5rLnBuZykKCjxicj4KCjo6OiB0YXNrCgpHaXZlIHlvdXIgaXNzdWUgYW4gaW5mb3JtYXRpdmUgdGl0bGUuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVfbmV3LXRpdGxlLnBuZykKCjxicj4KCkl0J3MgY29tbW9uIHRvIGluY2x1ZGUgc29tZSBkZXRhaWxzIGNvbmNlcm5pbmcgYW4gaXNzdWUuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgZGVzY3JpYmUgYSBwcm9ibGVtIHlvdSdyZSBoYXZpbmcgb3IgYSBidWcgeW91J3ZlIGVuY291bnRlcmVkIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIGxhdGVyLiBUaGUgaXNzdWUgZGVzY3JpcHRpb24gY2FuIGFsc28gY29udGFpbiBmb3JtYXR0ZWQgdGV4dCB2aWEgdGhlIHNhbWUgTWFya2Rvd24gd2UgdXNlZCBvbiBvdXIgYFJFQURNRS5tZGAgZmlsZS4gQmVsb3cgeW91IGNhbiBzZWUgd2hlcmUgSSd2ZSBhZGRlZCBzb21lIGRldGFpbHMgYWJvdXQgdGhpcyBpc3N1ZS4KCjxicj4KCjo6OiB0YXNrCgpBZGQgc29tZSBkZXRhaWxzIGluIHRoZSBkZXNjcmlwdGlvbiBib3guCgo6OjoKCgo6OjogdGlwCgoqIFlvdSBjYW4gYWxzbyBtYWtlIHVzZSBvZiB0aGUgdG9vbCBiYXIgdG8gaGVscCB5b3Ugd2l0aCBmb3JtYXR0aW5nLCBpbnNlcnRpbmcgbGlua3MsIGV0Yy4KCiogWW91IGNhbiBjcmVhdGUgY2hlY2tib3hlcyBpbiBNYXJrZG93biB3aXRoIGAqIFsgXWAuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVfZGVzY3JpcHRpb24ucG5nKQoKPGJyPgoKOjo6IHRpcAoKSnVzdCBsaWtlIHdlIGRpZCB3aGVuIGVkaXRpbmcgdGhlIGBSRUFETUUubWRgIGZpbGUsIHlvdSBjYW4gcHJldmlldyB0aGUgZm9ybWF0dGVkIE1hcmtkb3duIGluIGFuIGlzc3VlJ3MgZGVzY3JpcHRpb24gYnkgY2xpY2tpbmcgb24gdGhlICoqUHJldmlldyoqIHRhYi4KCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9kZXNjcmlwdGlvbi1wcmV2aWV3LnBuZykKCjxicj4KCjo6OiB0aXAKClRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyBvbiB0aGUgcmlnaHRoYW5kIHNpZGUgZm9yIGFzc2lnbmluZyBjb2xsYWJvcmF0b3JzIHRvIHdvcmsgb24gYW4gaXNzdWUsIGFzc2lnbmluZyBkZXNjcmlwdGl2ZSBsYWJlbHMgdG8gdGhlIGlzc3VlIHRvIGhlbHAgaWRlbnRpZnkgaXRzIGNvbnRlbnRzLCBwcmlvcml0eSwgZXRjLiBOb3RhYmx5LCB0aGVzZSBsYWJlbHMgYXJlIGFsc28gc2VhcmNoYWJsZSBmcm9tIHRoZSBtYWluICoqSXNzdWVzKiogcGFnZS4KCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9leHRyYXMucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSAqKkFzc2lnbmVlcyoqIGxpbmsgYW5kIHRoZW4gY2xpY2sgb24geW91ciB1c2VybmFtZSB0byBzZWxlY3QgeW91cnNlbGYuCgo6OjoKIAohW10oaW1hZ2VzL2doX2lzc3VlX2Fzc2lnbmVlcy5wbmcpCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqTGFiZWxzKiogbGluayB0byBzZWUgYSBsaXN0IG9mIHByZXNldCBsYWJlbHMuCgo6OjoKIAohW10oaW1hZ2VzL2doX2lzc3VlX2xhYmVscy5wbmcpCgo8YnI+CgpJbiB0aGlzIGNhc2UgSSd2ZSBhZGRlZCB0aGUgZm9sbG93aW5nIGxhYmVscyB0byB0aGUgaXNzdWU6CgotICoqZG9jdW1lbnRhdGlvbioqCgotICoqZW5oYW5jZW1lbnQqKgoKLSAqKmdvb2QgZmlyc3QgaXNzdWUqKgoKPGJyPgoKIVtdKGltYWdlcy9naF9pc3N1ZV9sYWJlbHMtY2hvc2VuLnBuZykKCjxicj4KCjo6OiB0YXNrCgpXaGVuIHlvdSBhcmUgZmluaXNoZWQgYWRkaW5nIGEgZGVzY3JpcHRpb24sIGxhYmVscywgZXRjLCBjbGljayBvbiB0aGUgZ3JlZW4gKipTdWJtaXQgbmV3IGlzc3VlKiogYnV0dG9uIGF0IHRoZSBib3R0b20uCgo6OjoKIAohW10oaW1hZ2VzL2doX2lzc3VlX3N1Ym1pdC5wbmcpCgo6Ojogc3VjY2VzcwoKWW91IHdpbGwgbm93IHNlZSB5b3VyIG5ldyBpc3N1ZSBhcyBhIGZvcm1hdHRlZCBNYXJrZG93biBkb2N1bWVudCB3aXRoIGxvdHMgb2YgaW5mb3JtYXRpb24gYWJvdXQgaXQgYmVpbmcgIk9wZW4iLCB0aGUgbGFiZWxzIHlvdSBhZGRlZCwgYW5kIGFub3RoZXIgY29tbWVudCBib3ggYXQgdGhlIGJvdHRvbS4KCjo6OgoKOjo6IHRpcAoKVGhlIGNoZWNrYm94ZXMgd2UgYWRkZWQgYXJlIGR5bmFtaWMgYW5kIGNhbiBiZSBjaGVja2VkIGFzIHRhc2tzIGFyZSBjb21wbGV0ZWQuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVfb25lLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipJc3N1ZXMqKiB0YWIgaW4gdGhlIHVwcGVyIGxlZnQsIHdoaWNoIHdpbGwgYnJpbmcgeW91IGJhY2sgdG8gdGhlIG1haW4gKipJc3N1ZSoqIHBhZ2UuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVzX3BhZ2UucG5nKQoKVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0byBub3RlIGhlcmU6CgoqIHRoZXJlIGlzIG5vdyBhIG51bWJlciAiMSIgaW5zaWRlIGEgY2lyY2xlIG5leHQgdG8gdGhlIElzc3VlcyB0YWIsIHdoaWNoIG1lYW5zIHRoZXJlIGlzIG9uZSBvcGVuIGlzc3VlIGF0IHRoZSBtb21lbnQKCiogeW91IGNhbiBmaWx0ZXIgaXNzdWVzIGJ5IGNsaWNraW5nIG9uIHRoZSAqKkZpbHRlcnMqKiBkcm9wZG93biBtZW51IG9uIHRoZSBsZWZ0IHNpZGUKCiogeW91IGNhbiB1c2UgdGhlIHNlYXJjaCBiYXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSAqKkZpbHRlcnMqKiBkcm9wZG93biBtZW51IHRvIGZpbmQgc3BlY2lmaWMgd29yZHMgb3IgdG9waWNzCgoqIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG9wZW4gaXNzdWVzLCB5b3UgY2FuIHNvcnQgYnkgKipBdXRob3IqKiwgKipMYWJlbCoqLCBldGMgYnkgY2xpY2tpbmcgb24gdGhlIGNvbHVtbiBoZWFkaW5nCgoqIHlvdSBjYW4gc2VlIHRoZXJlIGFyZSAzIHRhc2tzIHdpdGhpbiB0aGlzIGlzc3VlIGJlbG93IHRoZSBpc3N1ZSdzIHRpdGxlIAoKRnJvbSBoZXJlIHlvdSBjYW4gYWRkIG1vcmUgaXNzdWVzLCBvciBjbGljayBvbiBhbiBleGlzdGluZyBpc3N1ZSB0byBicmluZyB1cCBpdHMgZGV0YWlscy4gCgoqKioKCiMgUHJvamVjdHMKCioqUHJvamVjdHMqKiBpbiBHaXRIdWIgYXJlIGEgZ3JlYXQgd2F5IHRvIG9yZ2FuaXplIHlvdXIgaXNzdWVzLCBzZXQgdGFza3MsIHRyYWNrIHlvdXIgcHJvZ3Jlc3MsIGFuZCB3b3JrIHdpdGggYSB0ZWFtLiAKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipQcm9qZWN0cyoqIHRhYiBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3Rfc2VsZWN0LnBuZykKCjxicj4KCkhlcmUgeW91IHdpbGwgc2VlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgUHJvamVjdHMgYW5kIGFsbCBvZiB0aGUgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aCB0aGVtLgoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSBncmVlbiBkb3duYXJyb3cgbmV4dCB0byB0aGUgKipMaW5rIGEgcHJvamVjdCoqIGJ1dHRvbiBvbiB0aGUgcmlnaHQgYW5kIHNlbGVjdCAqKk5ldyBwcm9qZWN0KiouIFRoZW4gY2xpY2sgdGhlIGdyZWVuICoqTmV3IHByb2plY3QqKiBidXR0b24uCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9uZXcucG5nKQoKPGJyPgoKOjo6IG5vdGUKCklmIHRoaXMgaXMgeW91ciBmaXJzdCBwcm9qZWN0LCB5b3Ugc2hvdWxkIHNlZSBhIHdlbGNvbWUgd2luZG93IGxpa2UgdGhlIG9uZSBiZWxvdy4KCjo6OgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSBncmVlbiAqKkp1bXAgcmlnaHQgaW4qKiBidXR0b24uCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF93ZWxjb21lLnBuZykKCjxicj4KCllvdSBzaG91bGQgbm93IHNlZSBhIHBvcC11cCB3aW5kb3cgZm9yIHNlbGVjdGluZyBhIHRlbXBsYXRlIHdpdGggKipUYWJsZSoqIGFzIHRoZSBkZWZhdWx0LgoKPGJyPgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X3RhYmxlLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiAqKkJvYXJkKiogb24gdGhlIHRoZSBsZWZ0IHNpZGUgYW5kIHRoZW4gY2xpY2sgdGhlIGdyZWVuICoqQ3JlYXRlKiogYnV0dG9uLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3RfYm9hcmQucG5nKQoKPGJyPgoKWW91IG5vdyBoYXZlIGFuIHVudGl0bGVkIGFuZCBlbXB0eSBwcm9qZWN0IHRlbXBsYXRlIHdpdGggMyBncmF5IGJveGVzIGxhYmVsZWQgKipUb2RvKiosICoqSW4gUHJvZ3Jlc3MqKiwgYW5kICoqRG9uZSoqLgoKPGJyPgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X2VtcHR5LnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiBsaW5rIGF0IHRoZSB0b3AgbGFiZWxlZCAqKlxAdXNlcm5hbWUncyB1bnRpdGxlZCBwcm9qZWN0KiogKHdoZXJlIHVzZXJuYW1lIGlzIHlvdXIgR2l0SHViIHVzZXJuYW1lKSB0byBicmluZyB1cCB0aGUgcHJvamVjdCBzZXR0aW5ncy4KCjo6OgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X3NldHRpbmdzLnBuZykKCjxicj4KCk9uIHRoZSAqKlByb2plY3Qgc2V0dGluZ3MqKiB0YWIgeW91IGNhbiBhZGQgYSAqKm5hbWUqKiwgKipkZXNjcmlwdGlvbioqLCBhbmQgKipSRUFETUUqKi4KCjxicj4KCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9zZXR0aW5ncy10b3AucG5nKQoKPGJyPgoKSWYgeW91IHNjcm9sbCBkb3duIHlvdSB3aWxsIHNlZSB0aGUgKipEYW5nZXIgem9uZSoqIHdoZXJlIHlvdSBjYW4gY2hhbmdlIHRoZSBwcm9qZWN0IHZpc2liaWxpdHkgZnJvbSBwcml2YXRlIHRvIHB1YmxpYywgY2xvc2UgdGhlIHByb2plY3QsIG9yIGRlbGV0ZSBpdC4KCjxicj4KCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9zZXR0aW5ncy1kYW5nZXIucG5nKQoKPGJyPgoKOjo6IHRhc2sKClNjcm9sbCBiYWNrIHRvIHRoZSB0b3AgYW5kIGFkZCBhIHByb2plY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24uIENsaWNrIHRoZSBncmVlbiAqKlNhdmUqKiBidXR0b24gd2hlbiB5b3UgYXJlIGRvbmUuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9uYW1lLWRlc2NyaXB0aW9uLnBuZykKCjxicj4KCjo6OiB0YXNrCgpOb3cgYWRkIHNvbWUgdGV4dCB0byB0aGUgKipSRUFETUUqKiBhbmQgY2xpY2sgdGhlIGdyZWVuICoqU2F2ZSoqIGJ1dHRvbiB3aGVuIHlvdSBhcmUgZG9uZS4KCjo6OgoKOjo6IHRpcAoKSnVzdCBhcyB3aXRoIG90aGVyICoqUkVBRE1FKiogc2VjdGlvbnMsIHlvdSBjYW4gdXNlIE1hcmtkb3duIGZvciBlbXBoYXNpcywgbGlzdHMsIGxpbmtzLCBldGMuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9yZWFkbWUucG5nKQoKPGJyPgoKOjo6IHRpcAoKWW91IGNhbiBjbGljayBvbiB0aGUgKipNYW5hZ2UgYWNjZXNzKiogbGluayBvbiB0aGUgbGVmdCB0byBvcGVuIHVwIHRoZSBwcm9qZWN0IGFjY2VzcyB0YWIuIEhlcmUgeW91IGNhbiBpbnZpdGUgY29sbGFib3JhdG9ycyBhbmQgc2V0IHRoZWlyIHJvbGUuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9hY2Nlc3MucG5nKQoKPGJyPgoKOjo6IHRpcAoKWW91IGNhbiBjbGljayBvbiB0aGUgKipTdGF0dXMqKiBsaW5rIG9uIHRoZSBsZWZ0IHRvIG9wZW4gdXAgdGhlIGZpZWxkIHNldHRpbmdzIHRhYiwgd2hpY2ggYWxsb3dzIHlvdSB0byByZW5hbWUgdGhlIGNvbHVtbiBoZWFkaW5ncyBpbiB5b3VyIHByb2plY3Qgb3IgYWRkIG90aGVyIGNvbHVtbnMvZmllbGRzIGFzIHdlbGwuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9zdGF0dXMucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSBsZWZ0IGFycm93IGluIHRoZSB1cHBlciBsZWZ0IHRvIHJldHVybiB0byB5b3VyIHByb2plY3QncyBtYWluIHBhZ2UuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9yZXR1cm4ucG5nKQoKPGJyPgoKWW91ciBwcm9qZWN0IG5vdyBoYXMgYSBiZXR0ZXIgbmFtZS4KCjxicj4KCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9lbXB0eS11cGRhdGVkLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKiorIEFkZCBpdGVtKiogbGluayBhdCB0aGUgYm90dG9tIG9mIHRoZSAqKlRvZG8qKiBmaWVsZC4KCjo6OgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X2FkZC1pdGVtLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgbGluayB0byAqKkFkZCBpdGVtIGZyb20gcmVwb3NpdG9yeSoqLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3RfYWRkLWlzc3VlLnBuZykKCjxicj4KCjo6OiB0YXNrCgpTZWxlY3QgKip0ZXN0aW5nKiogZnJvbSB0aGUgZHJvcGRvd24gbWVudSBhbmQgdGhlbiBjaGVjayB0aGUgYm94IG5leHQgdG8gdGhlIElzc3VlIHlvdSBjcmVhdGVkIGVhcmxpZXIuIENsaWNrIHRoZSBncmVlbiAqKkFkZCBzZWxlY3RlZCBpdGVtcyoqIGJ1dHRvbiB3aGVuIHlvdSBhcmUgZG9uZS4KCjo6OgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X2FkZC1mcm9tLXJlcG8ucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIG9uIHRoZSAqKlgqKiBpbiB0aGUgdXBwZXIgcmlnaHQgdG8gcmV0dXJuIHRvIHRoZSBwcm9qZWN0IGJvYXJkLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3RfaXNzdWUtYWRkZWQucG5nKQoKPGJyPgoKOjo6IHN1Y2Nlc3MKCllvdSBub3cgaGF2ZSBhIG5ldyBwcm9qZWN0IHdpdGggb25lIHRvZG8gaXRlbS4KCjo6OgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X3RvLWRvLnBuZykKCjxicj4KCjo6OiB0YXNrCgpZb3UgY2FuIGNsaWNrIG9uIHRoZSBpc3N1ZSB0aXRsZSBpbiB0aGUgdG9kbyBjb2x1bW4gdG8gc2VlIGl0cyBkZXRhaWxzLiBDbGljayBvbiB0aGUgKipYKiogaW4gdGhlIHVwcGVyIHJpZ2h0IHRvIGNsb3NlIHRoZSBwcmV2aWV3IHdpbmRvdy4KCjo6OgoKIVtdKGltYWdlcy9naF9wcm9qZWN0X3RvLWRvLXBlZWsucG5nKQoKPGJyPgoKTm93IGxldCdzIGFkZHJlc3Mgb3VyIHRvZG8gaXRlbXMgaW4gb3VyIG9wZW4gaXNzdWUuCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2stYW5kLWRyYWcgdGhlIGlzc3VlIGZyb20gKipUb2RvKiogdG8gKipJbiBwcm9ncmVzcyoqLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3RfaW4tcHJvZ3Jlc3MucG5nKQoKPGJyPgoKOjo6IHRhc2sKCkNsaWNrIGluIHRoZSAqKlNlYXJjaCBvciBqdW1wIHRvLi4uKiogYm94IGF0IHRoZSB0b3AgYW5kIHNlbGVjdCB5b3VyIHRlc3RpbmcgcmVwb3NpdG9yeSB0byB0YWtlIHlvdSBiYWNrIHRoZXJlLgoKOjo6CgohW10oaW1hZ2VzL2doX3Rlc3RpbmdfcmVkaXJlY3QucG5nKQoKPGJyPgoKKioqCgojIEFkZGluZyBmaWxlcyBhbmQgZm9sZGVycwoKTGV0J3MgYWRkcmVzcyBvdXIgb3BlbiBpc3N1ZSBieSBhZGRpbmcgc29tZSBtb3JlIGNvbnRlbnQgdG8gb3VyIHJlcG8uIFRvIGRvIHNvLCB3ZSdsbCB3b3JrIGVudGlyZWx5IHdpdGhpbiBHaXRIdWIsIGJ1dCBsYXRlciBpbiB0aGUgY291cnNlIHdlJ2xsIHNlZSBob3cgdG8gYWRkIGZpbGVzIGZyb20gb3RoZXIgbG9jYXRpb25zIGxpa2UgYSBsb2NhbCBkaXJlY3Rvcnkgb24geW91ciBjb21wdXRlci4KCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipBZGQgZmlsZSoqIGJ1dHRvbiBuZXh0IHRvIHRoZSBncmVlbiAqKkNvZGUqKiBidXR0b24gYW5kIHRoZW4gc2VsZWN0ICoqQ3JlYXRlIG5ldyBmaWxlKiouCgo6OjoKCiFbXShpbWFnZXMvZ2hfZmlsZV9jcmVhdGUtbmV3LnBuZykKCjxicj4KCldlIG5vdyBoYXZlIGEgd2luZG93IGZvciBlZGl0aW5nIHRoZSBmaWxlIGNvbnRlbnRzIHNpbWlsYXIgdG8gdGhlIG9uZSB3ZSBzYXcgZWFybGllciB3aGVuIGVkaXRpbmcgb3VyIGBSRUFETUUubWRgIGZpbGUuIEF0IHRoZSB0b3AgbGVmdCBpcyBhIGJveCB3aGVyZSB5b3UgY2FuIHR5cGUgaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgeW91J2QgbGlrZSB0byBjcmVhdGUuCgo8YnI+CgohW10oaW1hZ2VzL2doX2ZpbGVfbmV3LWJsYW5rLnBuZykKCjxicj4KCjo6OiB0YXNrCgpJZiB5b3UnZCBsaWtlIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIHdpdGhpbiBhIG5ldyBmb2xkZXIsIHlvdSBiZWdpbiBieSB0eXBpbmcgdGhlIGZvbGRlciBuYW1lIGZvbGxvd2VkIGJ5IGEgYC9gIGFuZCB0aGVuIGZpbGUgbmFtZS4gWW91J2xsIG5vdGljZSB0aGF0IGFzIHNvb24gYXMgeW91IHR5cGUgdGhlIGAvYCBhZnRlciB0aGUgZm9sZGVyIG5hbWUgdGhhdCBHaXRIdWIgd2lsbCBhdXRvbWF0aWNhbGx5IHNoaWZ0IHRoZSB0ZXh0IGJveCB0byBmb2N1cyBvbiB0aGUgZmlsZSBuYW1lLgoKOjo6Cgo6OjogdGFzawoKQ3JlYXRlIGEgbmV3ICoqUioqIHNjcmlwdCB3aXRoaW4gYSBmb2xkZXIgY2FsbGVkIGBSYCwgYW5kIG5hbWUgaXQgYDAwX3Rlc3RpbmcuUmAuCgo6OjoKCiFbXShpbWFnZXMvZ2hfZmlsZV9uZXctbmFtZS5wbmcpCgo8YnI+Cgo6OjogdGFzawoKTmF2aWdhdGUgdG8gdGhlIGVkaXRpbmcgYm94IGFuZCBhZGQgc29tZSBzaW1wbGUgKipSKiogY29kZSAoaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBjb2RlIHlvdSBhZGQpLgoKOjo6CgohW10oaW1hZ2VzL2doX2ZpbGVfY3JlYXRlLWNvZGUucG5nKQoKPGJyPgoKOjo6IHRhc2sKCldoZW4geW91IGFyZSBmaW5pc2hlZCwgc2Nyb2xsIGRvd24gdG8gdGhlICoqQ29tbWl0IG5ldyBmaWxlKiogYXJlYSwgZW50ZXIgYSBicmllZiBidXQgaW5mb3JtYXRpdmUgY29tbWl0IG1lc3NhZ2UsIGFuZCBjbGljayBvbiB0aGUgZ3JlZW4gKipDb21taXQgbmV3IGZpbGUqKiBidXR0b24uCgo6OjoKCiFbXShpbWFnZXMvZ2hfZmlsZV9jcmVhdGUtY29tbWl0LnBuZykKCjxicj4KCjo6OiBzdWNjZXNzCgpZb3UgY2FuIG5vdyBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgYC9SYCBmb2xkZXIsIHdoaWNoIGF0IHRoZSBtb21lbnQgY29udGFpbnMgb25seSB0aGUgbmV3IGAwMF90ZXN0aW5nLlJgIGZpbGUgd2UganVzdCBjcmVhdGVkLgoKOjo6Cgo6OjogdGlwCgpJbiBhZGRpdGlvbiB0byB0aGUgZmlsZSBuYW1lLCB5b3UgY2FuIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2UgeW91IHVzZWQgd2hlbiBjb21taXR0aW5nIHRoZSBmaWxlICgiY3JlYXRlZCB0ZXN0IFIgc2NyaXB0IGZvciBkZW1vIikgYW5kIHdoZW4gdGhlIGZpbGUgd2FzIGNvbW1pdHRlZCAoIm5vdyIpLgoKOjo6CgohW10oaW1hZ2VzL2doX2ZvbGRlcl9SLWNvbnRlbnRzLnBuZykKCjxicj4KCjo6OiB0aXAKCllvdSBjYW4gY2xpY2sgb24gdGhlIGZpbGUgbmFtZSB0byBpbnNwZWN0IHRoZSBmaWxlJ3MgY29udGVudHMuCgo6OjoKCiFbXShpbWFnZXMvZ2hfZmlsZV9uZXctaW5zcGVjdC5wbmcpCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqQ29kZSoqIHRhYiBpbiB0aGUgdXBwZXIgbGVmdCwgd2hpY2ggd2lsbCB0YWtlIHlvdSBiYWNrIHRoZSByZXBvJ3MgbWFpbiBwYWdlLiAKCjo6OgoKOjo6IHRpcAoKSGVyZSB5b3UgY2FuIHNlZSBvdXIgbmV3IGBSYCBmb2xkZXIganVzdCBhYm92ZSBvdXIgZXhpc3RpbmcgYFJFQURNRS5tZGAgZmlsZS4KCjo6OgoKIVtdKGltYWdlcy9naF9yZXBvX2hvbWVfci5wbmcpCgo8YnI+CgpOb3cgbGV0J3MgYWRkIGEgc2ltcGxlIGRhdGEgZmlsZSBjYWxsZWQgYGV4YW1wbGVfZGF0YS5jc3ZgIGFuZCBwbGFjZSBpdCB3aXRoaW4gYSBuZXcgZm9sZGVyIGNhbGxlZCBgZGF0YWAuCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqQWRkIGZpbGUqKiBidXR0b24gbmV4dCB0byB0aGUgZ3JlZW4gKipDb2RlKiogYnV0dG9uIGFuZCB0aGVuIHNlbGVjdGluZyAqKkNyZWF0ZSBuZXcgZmlsZSoqLiBUeXBlIHRoZSBmb2xkZXIgbmFtZSBhbmQgZmlsZSBuYW1lIGluIHRoZSBib3ggYW5kIGFkZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBlZGl0aW5nIGJveCAoeW91IGNhbiBjb3B5IGFuZCBwYXN0ZSBpZiB5b3UnZCBsaWtlKToKCjo6OgoKYGBgCmxhc3RfbmFtZSwgZmlyc3RfbmFtZSwgcm9sZQpTY2hldWVyZWxsLCBNYXJrLCBpbnN0cnVjdG9yCkFkYW1zLCBNYXJ5LCBUQQpNYW5pb24sIExhbmNlLCBzdHVkZW50CmBgYAoKPGJyPgoKIVtdKGltYWdlcy9naF9maWxlX2NyZWF0ZS1kYXRhLnBuZykKCjxicj4KCjo6OiB0YXNrCgpXaGVuIHlvdSBhcmUgZmluaXNoZWQsIHNjcm9sbCBkb3duIHRvIHRoZSAqKkNvbW1pdCBuZXcgZmlsZSoqIGFyZWEsIGVudGVyIGEgYnJpZWYgYnV0IGluZm9ybWF0aXZlIGNvbW1pdCBtZXNzYWdlLCBhbmQgY2xpY2sgb24gdGhlIGdyZWVuICoqQ29tbWl0IG5ldyBmaWxlKiogYnV0dG9uLgoKOjo6CgohW10oaW1hZ2VzL2doX2ZpbGVfZGF0YS1jb21taXQucG5nKQoKPGJyPgoKOjo6IHRpcAoKSnVzdCBhcyB3aGVuIHdlIGNyZWF0ZWQgb3VyICoqUioqIHNjcmlwdCB3aXRoaW4gdGhlIGAvUmAgZm9sZGVyLCB5b3UgY2FuIG5vdyBzZWUgdGhlIG5ldyBgZXhhbXBsZV9kYXRhLmNzdmAgZmlsZSB3ZSBqdXN0IGNyZWF0ZWQgd2l0aGluIHRoZSBgL2RhdGFgIGZvbGRlci4KCjo6OgoKIVtdKGltYWdlcy9naF9kYXRhX2ZvbGRlcl92aWV3LnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipDb2RlKiogdGFiIGluIHRoZSB1cHBlciBsZWZ0LCB3aGljaCB3aWxsIHRha2UgeW91IGJhY2sgdGhlIHJlcG8ncyBtYWluIHBhZ2Ugd2hlcmUgeW91IHdpbGwgc2VlIHRoZSBuZXcgYC9kYXRhYCBmb2xkZXIganVzdCBiZWxvdyBvdXIgZXhpc3RpbmcgYC9SYCBmb2xkZXIuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcmVwb19ob21lX2RhdGEucG5nKQoKPGJyPgoKKioqCgojIENsb3NpbmcgYW4gSXNzdWUKCk5vdyB0aGF0IHdlJ3ZlIGFkZGVkIHNvbWUgbmV3IGZvbGRlcnMgYW5kIGZpbGVzIHRvIG91ciByZXBvLCBsZXQncyByZXR1cm4gdG8gdGhlIElzc3VlIHdlIGNyZWF0ZWQgZWFybGllciBhbmQgImNsb3NlIiBpdC4gCgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqSXNzdWVzKiogdGFiIG9uIHRoZSB0b3Agb2YgdGhlIHBhZ2UgdG8gdGFrZSB5b3UgYmFjayB0byBvdXIgb3BlbiBpc3N1ZS4KCjo6OgoKIVtdKGltYWdlcy9naF9vcGVuX2lzc3VlX3JldHVybi5wbmcpCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlIGlzc3VlJ3MgdGl0bGUsIHdoaWNoIHdpbGwgb3BlbiBpdCB1cCBhbmQgc2hvdyB5b3UgYWxsIG9mIHRoZSBkZXRhaWxzLiAKCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9yZXR1cm4tb3Blbi5wbmcpCgo8YnI+Cgo6OjogdGFzawoKQ2hlY2sgdGhlIGJveGVzIG5leHQgdG8gdGhlIDMgb3BlbiB0YXNrcy4KCjo6OgoKOjo6IHRpcAoKQXMgeW91IGNoZWNrIG9mZiBib3hlcyBuZXh0IHRvIHRhc2tzLCBHaXRIdWIgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgbnVtYmVyIGNvbXBsZXRlZCB1bmRlciB0aGUgaXNzdWUncyB0aXRsZS4KCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9yZXR1cm4tY2hlY2tlZC5wbmcpCgo8YnI+CgpBdCB0aGUgYm90dG9tIG9mIHRoZSBpc3N1ZSB5b3Ugd2lsbCBzZWUgYSBjb21tZW50IGJveCB3aXRoIHR3byBidXR0b25zIGJlbG93IGl0OiAqKkNsb3NlIGlzc3VlKiogYW5kICoqQ29tbWVudCoqLiBZb3UgZG9uJ3QgbmVlZCB0byBhZGQgYSBjb21tZW50IHdoZW4gY2xvc2luZyBhbiBpc3N1ZSwgYnV0IGl0J3Mgb2Z0ZW4gaGVscGZ1bCB0byBkbyBzby4KCjxicj4KCjo6OiB0YXNrCgpBZGQgYSBjb21tZW50IGFuZCB0aGVuIGNsaWNrIHRoZSAqKkNsb3NlIHdpdGggY29tbWVudCoqIGJ1dHRvbi4KCjo6OgoKIVtdKGltYWdlcy9naF9pc3N1ZV9jbG9zZS1jb21tZW50LnBuZykKCjxicj4KCjo6OiB0aXAKCllvdSdsbCBub3cgc2VlIHRoYXQgR2l0SHViIGhhcyBtYXJrZWQgdGhlIGlzc3VlIHdpdGggYSBwdXJwbGUgIkNsb3NlZCIgbGFiZWwgdW5kZXIgdGhlIGlzc3VlIG5hbWUuCgo6OjoKCiFbXShpbWFnZXMvZ2hfaXNzdWVfY2xvc2VkLnBuZykKCjxicj4KCjo6OiB0YXNrCgpDbGljayBvbiB0aGUgKipJc3N1ZXMqKiB0YWIgdG8gcmV0dXJuIHRvIHRoZSBJc3N1ZXMgcGFnZSB3aGVyZSBHaXRIdWIgaW5mb3JtcyB5b3UgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IG9wZW4gaXNzdWVzLgoKOjo6CgohW10oaW1hZ2VzL2doX2lzc3Vlc19tYWluX25vbmVfb3Blbi5wbmcpCgo8YnI+CgojIENsb3NpbmcgYSBwcm9qZWN0CgpMZXQncyByZXR1cm4gdG8gb3VyIHByb2plY3QgYW5kIGNoZWNrIG9uIG91ciBwcm9ncmVzcyBub3cgdGhhdCB3ZSd2ZSBjbG9zZWQgdGhlIG9wZW4gaXNzdWUuCgo8YnI+Cgo6OjogdGFzawoKQ2xpY2sgb24gdGhlICoqUHJvamVjdHMqKiB0YWIgdG8gdGFrZSB5b3UgYmFjayB0byB0aGUgbWFpbiBQcm9qZWN0cyBwYWdlIHdoZXJlIHlvdXIgcHJvamVjdCBpcyBsaXN0ZWQgYW5kIHRoZW4gY2xpY2sgb24gdGhlIHByb2plY3QgbmFtZSB0byBvcGVuIGl0IGJhY2sgdXAuCgo6OjoKCiFbXShpbWFnZXMvZ2hfcHJvamVjdF9tYWluLnBuZykKCjxicj4KCjo6OiBzdWNjZXNzCgpHaXRIdWIgYXV0b21hdGljYWxseSBtb3ZlZCB0aGUgb3BlbiBpc3N1ZSB0byB0aGUgKipEb25lKiogY29sdW1uIHdoZW4geW91IGNsb3NlZCBpdCBlYXJsaWVyLgoKOjo6CgohW10oaW1hZ2VzL2doX3Byb2plY3RfZG9uZS5wbmcpCgo8YnI+CgojIEVuZG5vdGUKCioqQ29uZ3JhdHVsYXRpb25zISoqCgpZb3UndmUgbm93IHN1Y2Nlc3NmdWxseSBkb25lIHRoZSBmb2xsb3dpbmc6CgoqIGNyZWF0ZWQgYSBuZXcgcmVwbyBvbiBHaXRIdWIKCiogZWRpdGVkIHlvdXIgYFJFQURNRS5tZGAgZmlsZQoKKiBjcmVhdGVkIGFuIGlzc3VlCgoqIGNyZWF0ZWQgYSBwcm9qZWN0CgoqIGFkZGVkIHNvbWUgYWRkaXRpb25hbCBjb250ZW50IHRvIHlvdXIgcmVwbwoKKiBjbG9zZWQgYW4gaXNzdWUKCiogbWFuYWdlZCB5b3VyIHByb2plY3QKCgoK