diff --git a/.Rproj.user/7D780DDE/sources/prop/2B3954DB b/.Rproj.user/7D780DDE/sources/prop/2B3954DB index ee6f7bf..9b8d73f 100644 --- a/.Rproj.user/7D780DDE/sources/prop/2B3954DB +++ b/.Rproj.user/7D780DDE/sources/prop/2B3954DB @@ -2,7 +2,7 @@ "tempName": "Untitled1", "source_window_id": "", "Source": "Source", - "cursorPosition": "0,0", - "scrollLine": "0", + "cursorPosition": "57,253", + "scrollLine": "51", "last_setup_crc32": "" } \ No newline at end of file diff --git a/.Rproj.user/7D780DDE/sources/session-86301621/39657677 b/.Rproj.user/7D780DDE/sources/session-86301621/39657677 index de6dc85..041b7a5 100644 --- a/.Rproj.user/7D780DDE/sources/session-86301621/39657677 +++ b/.Rproj.user/7D780DDE/sources/session-86301621/39657677 @@ -3,7 +3,7 @@ "path": "C:/Users/zimmer43/Sync/Github/AAAR2023-tutorial/index.Rmd", "project_path": "index.Rmd", "type": "r_markdown", - "hash": "3697768045", + "hash": "4213431816", "contents": "", "dirty": false, "created": 1696232689723.0, @@ -13,16 +13,16 @@ "tempName": "Untitled1", "source_window_id": "", "Source": "Source", - "cursorPosition": "0,0", - "scrollLine": "0", + "cursorPosition": "57,253", + "scrollLine": "51", "last_setup_crc32": "" }, "folds": "", - "lastKnownWriteTime": 1696232910, + "lastKnownWriteTime": 1696233531, "encoding": "UTF-8", "collab_server": "", "source_window": "", - "last_content_update": 1696232910033, + "last_content_update": 1696233531946, "read_only": false, "read_only_alternatives": [] } \ No newline at end of file diff --git a/.Rproj.user/7D780DDE/sources/session-86301621/39657677-contents b/.Rproj.user/7D780DDE/sources/session-86301621/39657677-contents index d314099..373de06 100644 --- a/.Rproj.user/7D780DDE/sources/session-86301621/39657677-contents +++ b/.Rproj.user/7D780DDE/sources/session-86301621/39657677-contents @@ -47,6 +47,16 @@ Other notes: * All the data, codes and markdown files are available in the Github repository [(Click here to access)](https://github.com/nzimmerman-ubc/AAAR2023-tutorial) * If you just want the R Markdown file, you can download it from the upper right corner of the page. +# Part 0: Version Control +In developing this tutorial, I used version control using Git and Github. If you're in academia, Github is great because you can get access to many paid features for free (making pages from private repositories, creating organizations, etc.). You can interact with Git in RStudio very easily after it's installed (see links from the Introduction). Once you've successfully installed Git and made it accessible in RStudio, you'll see a little "Git" tab in the top right panel. We can use this panel to quickly Commit changes to our repository, view file additions or deletions, etc. + +Those who are familiar with Git may prefer to use the command line - that's outside of the scope of our tutorial today, but you can access the terminal from RStudio in the "Terminal" tab of the bottom left panel. + +I will now quickly demonstrate making a change, committing that change, and pushing my change to Github. + +## Forking the directory +If you want to follow along in real-time with this tutorial, navigate to this tutorial's repository [(Click here to access)](https://github.com/nzimmerman-ubc/AAAR2023-tutorial) and create a fork (which will create a local copy in your own repository). + # Part 1: SQL Set-up and Logistics So first things first, we're going to make sure we have set up and configured MySQL on our machine. We'll do this part live, so follow along. We can interact with MySQL in a few ways: diff --git a/index.Rmd b/index.Rmd index d314099..373de06 100644 --- a/index.Rmd +++ b/index.Rmd @@ -47,6 +47,16 @@ Other notes: * All the data, codes and markdown files are available in the Github repository [(Click here to access)](https://github.com/nzimmerman-ubc/AAAR2023-tutorial) * If you just want the R Markdown file, you can download it from the upper right corner of the page. +# Part 0: Version Control +In developing this tutorial, I used version control using Git and Github. If you're in academia, Github is great because you can get access to many paid features for free (making pages from private repositories, creating organizations, etc.). You can interact with Git in RStudio very easily after it's installed (see links from the Introduction). Once you've successfully installed Git and made it accessible in RStudio, you'll see a little "Git" tab in the top right panel. We can use this panel to quickly Commit changes to our repository, view file additions or deletions, etc. + +Those who are familiar with Git may prefer to use the command line - that's outside of the scope of our tutorial today, but you can access the terminal from RStudio in the "Terminal" tab of the bottom left panel. + +I will now quickly demonstrate making a change, committing that change, and pushing my change to Github. + +## Forking the directory +If you want to follow along in real-time with this tutorial, navigate to this tutorial's repository [(Click here to access)](https://github.com/nzimmerman-ubc/AAAR2023-tutorial) and create a fork (which will create a local copy in your own repository). + # Part 1: SQL Set-up and Logistics So first things first, we're going to make sure we have set up and configured MySQL on our machine. We'll do this part live, so follow along. We can interact with MySQL in a few ways: diff --git a/index.html b/index.html index 6f703a1..70eacb7 100644 --- a/index.html +++ b/index.html @@ -390,6 +390,32 @@

Getting yourself set-up

+
+

Part 0: Version Control

+

In developing this tutorial, I used version control using Git and +Github. If you’re in academia, Github is great because you can get +access to many paid features for free (making pages from private +repositories, creating organizations, etc.). You can interact with Git +in RStudio very easily after it’s installed (see links from the +Introduction). Once you’ve successfully installed Git and made it +accessible in RStudio, you’ll see a little “Git” tab in the top right +panel. We can use this panel to quickly Commit changes to our +repository, view file additions or deletions, etc.

+

Those who are familiar with Git may prefer to use the command line - +that’s outside of the scope of our tutorial today, but you can access +the terminal from RStudio in the “Terminal” tab of the bottom left +panel.

+

I will now quickly demonstrate making a change, committing that +change, and pushing my change to Github.

+
+

Forking the directory

+

If you want to follow along in real-time with this tutorial, navigate +to this tutorial’s repository (Click here +to access) and create a fork (which will create a local copy in your +own repository).

+
+

Part 1: SQL Set-up and Logistics

So first things first, we’re going to make sure we have set up and @@ -614,7 +640,7 @@

Housekeeping

-
LS0tDQp0aXRsZTogIkFBQVIgMjAyMyBEYXRhIFdyYW5nbGluZyBUdXRvcmlhbCINCmF1dGhvcjogIkRyLiBOYW9taSBaaW1tZXJtYW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIHJtYXJrZG93bjo6aHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCiMgSW50cm9kdWN0aW9uDQoNCk1hbmFnaW5nIHlvdXIgZXhwZXJpbWVudGFsIGRhdGEgaXMgaW5jcmVhc2luZ2x5IGRpZmZpY3VsdCBiZWNhdXNlIG9mIHRoZSBzaGVlciB2b2x1bWUgb2YgZGF0YSB0aGF0IGlzIGJlaW5nIGNvbGxlY3RlZCwgdGhlIGhpZ2ggdGltZSByZXNvbHV0aW9uIG9mIHRoZSBkYXRhLCB0aGUgbnVtYmVyIG9mIGRhdGEgdXNlcnMsIGFuZCBwdWJsaXNoaW5nIHJlcXVpcmVtZW50cyBvbiBtYWtpbmcgZGF0YSBhbmQgY29kZXMgb3BlbiBhbmQgYWNjZXNzaWJsZS4gVGFraW5nIHNvbWUgdGltZSB0byBsZWFybiBmcm9tIGNvcmUgZGF0YSBtYW5hZ2VtZW50IGFuZCBkYXRhIHdyYW5nbGluZyBza2lsbHMgaXMgaW1wb3J0YW50IQ0KDQpJbiB0aGlzIHR1dG9yaWFsLCB3ZSdsbCBsb29rIGF0IHRoZSBkYXRhIG1hbmFnZW1lbnQgYW5kIGFuYWx5c2lzIHBpcGVsaW5lIGZyb20gZGF0YSBpbXBvcnQgLyB1cGxvYWQgdGhyb3VnaCB0byBkYXRhIHZpc3VhbGl6YXRpb24uIFdlJ2xsIGNvbXBhcmUgYSBjb3VwbGUgb2YgZGlmZmVyZW50IGFwcHJvYWNoZXMgY29uc2lkZXJpbmcgdGhlIG5lZWRzIEkganVzdCBvdXRsaW5lZC4gVGhlIGZpcnN0IGRhdGEgc2V0IEkgYW0gcHJvdmlkaW5nIGlzIGEgcHJlLWNsZWFuZWQgZGF0YSBzZXQgZm9yIHNpbXBsaWNpdHkgYW5kIHRvIHNob3cgdGhlIHBpcGVsaW5lIGZyb20gc3RhcnQgdG8gZmluaXNoLiBJZiB3ZSBoYXZlIHRpbWUsIHdlJ2xsIGxvb2sgYXQgYSBtb3JlIGNvbXBsaWNhdGVkIHNldCBvZiBkYXRhIHRoYXQgcmVxdWlyZXMgbW9yZSBwcmUtcHJvY2Vzc2luZyBiZWZvcmUgd2UgY2FuIGxvb2sgYXQgaXQuIA0KDQpUaGVyZSBhcmUgbWFueSBjb2RpbmcgbGFuZ3VhZ2VzIHlvdSBjYW4gdXNlIHRvIHdvcmsgd2l0aCB5b3VyIGRhdGEuIEluIHRoaXMgdHV0b3JpYWwsIEkgYW0gZ29pbmcgdG8gdXNlIFN0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2UgKFNRTCkgYW5kIFIuIFRvIG1hbmFnZSBTUUwgZGF0YSwgSSB3aWxsIHNob3cgYW4gZXhhbXBsZSB3aXRoIFtNeVNRTF0oaHR0cHM6Ly93d3cubXlzcWwuY29tL3Byb2R1Y3RzL2NvbW11bml0eS8pLiBUaGlzIGlzIGp1c3Qgb25lIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgbWFueSBvZiB0aGUgc2FtZSBwcmluY2lwbGVzIHdpbGwgYXBwbHkgaWYgeW91J3JlIHVzaW5nIG90aGVyIHBvcHVsYXIgU1FMIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtcyBsaWtlIFtTUUxpdGVdKGh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvZG93bmxvYWQuaHRtbCkgb3IgW1Bvc3RncmVTUUxdKGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2Rvd25sb2FkLykuIFlvdSBqdXN0IG5lZWQgdG8gY2hhbmdlIHRoZSBSIHBhY2thZ2UgeW91IGFyZSB1c2luZyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgU1FMIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtIHlvdSBhcmUgdXNpbmcuDQoNCkknbGwgYWxzbyBicmllZmx5IGRlbW9uc3RyYXRlIGltcG9ydGluZyB5b3VyIGRhdGEgZGlyZWN0bHkgaW50byBbUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvIA0KKSBhbmQgc29tZSBjb21tb24gcGl0ZmFsbHMgLyB3aHkgdGhlIFNRTCBhcHByb2FjaCBjYW4gYmUgcHJlZmVyYWJsZS4NCg0KT25jZSBvdXIgZGF0YSBpcyBpbiBbUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvIA0KKSB1c2luZyBbUlN0dWRpb10oaHR0cHM6Ly9wb3NpdC5jby9kb3dubG9hZC9yc3R1ZGlvLWRlc2t0b3AvIA0KKSwgYSBwb3B1bGFyIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKElERSkgZm9yIFIsIHdlJ2xsIGRvIHNvbWUgcXVpY2sgdmlzdWFsaXphdGlvbnMsIGludHJvZHVjaW5nIHlvdSB0byBhIHBvcHVsYXIgY29sbGVjdGlvbiBvZiBSIGNvZGluZyBwYWNrYWdlcyBjYWxsZWQgdGhlIFsndGlkeXZlcnNlJ10oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pLiBUaGlzIHNoYXJlcyBtYW55IHByaW5jaXBsZXMgd2l0aCB0aGUgWydwYW5kYXMnXShodHRwczovL3BhbmRhcy5weWRhdGEub3JnLykgc29mdHdhcmUgbGlicmFyeSBpbiBbUHl0aG9uXShodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy8pLiBTbyB3aGlsZSB3ZSB3aWxsIHdvcmsgaW4gUi9SU3R1ZGlvIHRvZGF5LCBhZ2FpbiwgbWFueSBvZiB0aGUgaWRlYXMgb3IgcHJvY2Vzc2VzIGNhbiBiZSByZXBsaWNhdGVkIGluIFB5dGhvbiAoZm9yIGV4YW1wbGUgdXNpbmcgdGhlIFtQeUNoYXJtIElERV0oaHR0cHM6Ly93d3cuamV0YnJhaW5zLmNvbS9weWNoYXJtL2Rvd25sb2FkLykpLiBJdCdzIGp1c3QgYSBtYXR0ZXIgb2YgcGVyc29uYWwgcHJlZmVyZW5jZSA6KSANCg0KVG8gbWFuYWdlIG91ciBSIGNvZGVzIGFuZCB0YWtlIG5vdGVzIC8gc2hhcmUgaW50ZXJpbSBwbG90cywgd2UnbGwgYmUgdXNpbmcgYSBtYXJrZG93biBmaWxlLiBJJ20gdHlwaW5nIHRoaXMgdHV0b3JpYWwgcmlnaHQgbm93IGluIGFuIFIgTWFya2Rvd24gZmlsZS4gVmVyeSBtZXRhLiBBbm90aGVyIHBvcHVsYXIgcGllY2Ugb2Ygc29mdHdhcmUgZm9yIG1hcmtkb3duIGZpbGVzIHdpdGggZW1iZWRkZWQgUiBvciBQeXRob24gY29kaW5nIGlzIFtKdXB5dGVyIE5vdGVib29rc10oaHR0cHM6Ly9qdXB5dGVyLm9yZy8pLiBXZSB3b24ndCBydW4gYW55IEp1cHl0ZXIgbm90ZWJvb2tzLCBidXQgSSB3aWxsIHNob3cgeW91IGJyaWVmbHkgd2hhdCB0aGV5J3JlIGFsbCBhYm91dC4gDQoNCkFzIHdlIHdvcmsgdGhyb3VnaCBvdXIgZGF0YSwgd2UgYWxsIGtub3cgdGhhdCBhbmFseXNpcyBjYW4gdGFrZSB0aW1lLiBPciBwZXJoYXBzIHdlIHdhbnQgdG8gcnVuIGEgY29kZSB0aGF0IG1pZ2h0IGJyZWFrIGV2ZXJ5dGhpbmcgKGhhcHBlbnMgdG8gdGhlIGJlc3Qgb2YgdXMhKSBhbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgY2FuIHJlc3RvcmUgb3VyIHByZXZpb3VzIGNvZGUuIFZlcnNpb24gY29udHJvbCBpcyB5b3VyIGZyaWVuZCBoZXJlIGFuZCBpdCdzIHNvIGVhc3kgdG8gZG8gd2l0aCBbR2l0XShodHRwczovL2dpdC1zY20uY29tL2Rvd25sb2FkcyksIHdoaWNoIGlzIGEgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbSB0aGF0IHRyYWNrcyBjaGFuZ2VzIGluIGFueSBzZXQgb2YgY29tcHV0ZXIgZmlsZXMuIFdlJ2xsIHVzZSB0aGUgW0dpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2pvaW4gDQopIHBsYXRmb3JtIGFzIG91ciBjb252ZW5pZW50IGNsb3VkLWJhc2VkIHN5c3RlbSB0byBleGVjdXRlIG91ciBHaXQgdmVyc2lvbiBjb250cm9sLiBBIG5pY2UgZmVhdHVyZSBvZiBHaXRodWIgaXMgdGhhdCB3ZSBjYW4gYWxzbyBlYXNpbHkgY29udmVydCBvdXIgTWFya2Rvd24gZmlsZXMgaW50byB3ZWJwYWdlcyAod2hpY2ggaXMgd2hhdCB5b3UncmUgcmVhZGluZyByaWdodCBub3chKS4gU28gY29vbCwgcmlnaHQ/DQoNCkxhc3RseSwgaWYgeW91IGhhdmUgYSBsb3Qgb2YgZGF0YSBiZWluZyBjb2xsZWN0ZWQgcm91dGluZWx5LCBpdCBjYW4gYmUgY29vbCB0byBzaG93IHlvdXIgZGF0YS4gV2UnbGwgZG8gYSBzaW1wbGUgZXhhbXBsZSBpbiBbR3JhZmFuYV0oaHR0cHM6Ly9ncmFmYW5hLmNvbS9ncmFmYW5hL2Rvd25sb2FkKSwgd2hpY2ggaXMgYW4gb3BlbiBzb3VyY2UgYW5hbHl0aWNzIGFuZCBpbnRlcmFjdGl2ZSB2aXN1YWxpemF0aW9uIHdlYiBhcHBsaWNhdGlvbi4NCg0KV2hhdCB3ZSdsbCBjb3ZlciB0b2RheSBpcyBhIGxvdCBmb3IgYSAxIGhvdXIgNDUgbWludXRlIHNlc3Npb24gLSBhbmQgdGhhdCdzIG9rYXkhIFRoZSBnb2FsIGlzIHRoYXQgeW91IGNvbWUgb3V0IG9mIHRoaXMgdHV0b3JpYWwgd2l0aCBzb21lIGlkZWFzLCBuZXcgdGVybWlub2xvZ3kgYW5kIGFuIGludGVyZXN0IGluIGxlYXJuaW5nIG1vcmUuIElmIHlvdSB0YWtlIHRoZSB0aW1lIHRvIGxlYXJuIHRoZXNlIHByaW5jaXBsZXMgYW5kIGFwcHJvYWNoZXMgZWFybHkgb24gaW4geW91ciBwcm9ncmFtLCB5b3UnbGwgaGF2ZSBhbiBlYXNpZXIgdGltZSBkb3duIHRoZSByb2FkIHdoZW4geW91J3JlIHRyeWluZyB0byBhZGRyZXNzIFJldmlld2VyIDIgY29tbWVudHMgYWxtb3N0IGEgeWVhciBhZnRlciBhIHBhcGVyIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCwgYmVjYXVzZSB5b3UgbGVmdCB5b3Vyc2VsZiBhbiBhd2Vzb21lIHBhcGVyIHRyYWlsLiBGdXR1cmUgeW91IGlzIGFscmVhZHkgdGhhbmtpbmcgeW91ISBOb3cgd2l0aG91dCBmdXJ0aGVyIGFkbywgbGV0J3MgZ2V0IHN0YXJ0ZWQuDQoNCiMjIEdldHRpbmcgeW91cnNlbGYgc2V0LXVwDQpJZiB5b3Ugd2FudCB0byBmb2xsb3cgYWxvbmcgaW4gcmVhbC10aW1lLCB5b3UnbGwgbmVlZCB0aGUgZm9sbG93aW5nIHRvb2xzIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUuIE5vdGUgdGhhdCBJIHRlc3RlZCB0aGlzIHR1dG9yaWFsIGluIHRoZSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uIEkgY2FuJ3QgbWFrZSBhbnkgZ3VhcmFudGVlcyBpdCB3aWxsIHdvcmsgMTAwJSBzbW9vdGhseSBpbiBhIG1hY09TIG9yIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnkgcGl0ZmFsbHMgd2l0aCB0aGlzLg0KDQpUb29scyBuZWVkZWQ6DQoNCiogTXlTUUwgWyhDbGljayBoZXJlIGZvciBZb3VUdWJlIHR1dG9yaWFsIGZvciBpbnN0YWxsaW5nIE15U1FMIG9uIFdpbmRvd3MgMTEpXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXFCQlhCWlhLaTB3KQ0KKiBSIGFuZCBSU3R1ZGlvIFsoQ2xpY2sgaGVyZSBmb3IgWW91VHViZSB0dXRvcmlhbCBmb3IgaW5zdGFsbGluZyBSIGFuZCBSU3R1ZGlvKV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1ZckVlMlRMcjNNSSkNCiogR2l0IGFuZCBhIEdpdGh1YiBhY2NvdW50IFsoQ2xpY2sgaGVyZSBmb3IgYSBHaXRodWIgR3VpZGUgb24gSW5zdGFsbGluZyBHaXQpXShodHRwczovL2dpdGh1Yi5jb20vZ2l0LWd1aWRlcy9pbnN0YWxsLWdpdCkNCiogQ29ubmVjdCBHaXQgdG8gUlN0dWRpbyBbKENsaWNrIGhlcmUgZm9yIGEgWW91VHViZSB0dXRvcmlhbCBvbiBjb25uZWN0aW5nIEdpdCBhbmQgR2l0aHViIHRvIGFuIFJTdHVkaW8gUHJvamVjdCldKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9YlVvTjg1UXZDMTApDQoNCk90aGVyIG5vdGVzOg0KDQoqIFRoaXMgdHV0b3JpYWwgd2lsbCByZXF1aXJlIGEgYnVuY2ggb2YgUiBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgLSBidXQgZG9uJ3Qgd29ycnksIEkgaGF2ZSBwYXJ0cyBvZiB0aGUgY29kZSBibG9ja3MgYmVsb3cgdGhhdCB3aWxsIGluc3RhbGwgYW55IFIgcGFja2FnZXMgeW91IG1pZ2h0IG5lZWQgdGhhdCB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIDopDQoqIEFsbCB0aGUgZGF0YSwgY29kZXMgYW5kIG1hcmtkb3duIGZpbGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIEdpdGh1YiByZXBvc2l0b3J5IFsoQ2xpY2sgaGVyZSB0byBhY2Nlc3MpXShodHRwczovL2dpdGh1Yi5jb20vbnppbW1lcm1hbi11YmMvQUFBUjIwMjMtdHV0b3JpYWwpDQoqIElmIHlvdSBqdXN0IHdhbnQgdGhlIFIgTWFya2Rvd24gZmlsZSwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tIHRoZSB1cHBlciByaWdodCBjb3JuZXIgb2YgdGhlIHBhZ2UuDQoNCiMgUGFydCAxOiBTUUwgU2V0LXVwIGFuZCBMb2dpc3RpY3MNClNvIGZpcnN0IHRoaW5ncyBmaXJzdCwgd2UncmUgZ29pbmcgdG8gbWFrZSBzdXJlIHdlIGhhdmUgc2V0IHVwIGFuZCBjb25maWd1cmVkIE15U1FMIG9uIG91ciBtYWNoaW5lLiBXZSdsbCBkbyB0aGlzIHBhcnQgbGl2ZSwgc28gZm9sbG93IGFsb25nLiBXZSBjYW4gaW50ZXJhY3Qgd2l0aCBNeVNRTCBpbiBhIGZldyB3YXlzOg0KDQoqIE15U1FMIFdvcmtiZW5jaDogQSBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UgZm9yIHlvdXIgU1FMIGRhdGENCiogVGhlIGNvbW1hbmQgbGluZQ0KDQpUaGUgbmljZSB0aGluZyBhYm91dCB0aGUgd29ya2JlbmNoIGlzIHRoYXQgaXQgY2FuIGhlbHAgeW91IGxlYXJuIGhvdyB0byB3cml0ZSBhbmQgcGFyc2UgU1FMIHF1ZXJpZXMsIHNpbmNlIGl0IHdpbGwgdHJhbnNsYXRlIHlvdXIgcmVxdWVzdCBpbnRvIHRoZSBxdWVyeS4gU28gd2UnbGwgbW9zdGx5IGJlIHVzaW5nIHRoZSBXb3JrYmVuY2ggdG8gY2hlY2sgdGhhdCBvdXIgd29yayBpcyBiZWluZyBzdG9yZWQgY29ycmVjdGx5LCBidXQgSSB3aWxsIHNob3cgc29tZSBxdWljayBleGFtcGxlcyBpbiB0aGUgY29tbWFuZCBsaW5lIHRvbyBsYXRlciBvbiBpbiB0aGUgdHV0b3JpYWwuIA0KDQpPbmNlIHdlIGhhdmUgc2V0IHVwIE15U1FMIG9uIG91ciBtYWNoaW5lLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSANClRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvLCBpcyBhZGQgb3VyIGV4cGVyaW1lbnQgZGF0YSB0byBNeVNRTCBzbyB3ZSBjYW4gcXVlcnkgdGhlIGRhdGEgaW4gUi4gV2hpbGUgdGhlc2Ugc3RlcHMgb2NjdXIgb3V0c2lkZSBvZiBSU3R1ZGlvLCBJIGhhdmUgaW5jbHVkZWQgc29tZSBzY3JlZW5zaG90cyBoZXJlIHNvIHlvdSBjYW4gZm9sbG93IGFsb25nLiBUaGVyZSBhcmUgYSBmZXcgb3B0aW9ucyB0byBhZGQgZGF0YSB0byBNeVNRTC4gSGVyZSBJIHdpbGwgZGVzY3JpYmUgdHdvIG9mIHRoZW06DQoNCg0KDQojIyBIb3VzZWtlZXBpbmcNCldlIGFyZSBnb2luZyB0byBkbyBhIGZldyB0aGluZ3MgdG8gZ2V0IHN0YXJ0ZWQhDQoNCi0gSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzDQotIExvYWQgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcw0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KDQojIExvYWQgcGFja2FnZXMgLSBJIGxpa2UgdG8gdXNlIHRoZSBwYWNtYW4gcGFja2FnZSB0byBkbyB0aGlzIG1vcmUgZWxlZ2FudGx5Lg0KaWYgKCFyZXF1aXJlKCJwYWNtYW4iKSkgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIik7IGxpYnJhcnkocGFjbWFuKQ0KDQojIFRoZSBwYWNtYW4gcGFja2FnZSBoYXMgYSBuaWNlIGZ1bmN0aW9uICdwX2xvYWQoKScgdGhhdCB3aWxsIGxvYWQgdGhlIGxpc3RlZCBwYWNrYWdlcyBhbmQgaW5zdGFsbCB0aGVtIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGluc3RhbGxlZC4NCnBfbG9hZChEQkksUk9EQkMsb2RiYyxkYnBseXIsUk15U1FMLHRpZHl2ZXJzZSxrZXlyaW5nLGNvbjJhcWksbHVicmlkYXRlLCBzdHJpbmdyKQ0KDQojIENoZWNrIHRoYXQgTXlTUUwgaXMgbGlzdGVkLCBpZiBpdCBpc24ndCBuZWVkIHRvIHByb3ZpZGUgc3RlcHMuDQpzb3J0KHVuaXF1ZShvZGJjTGlzdERyaXZlcnMoKVtbMV1dKSkNCg0Kc3FsX2Nvbm4gPC0gZGJDb25uZWN0KFJNeVNRTDo6TXlTUUwoKSwNCiAgICAgICAgICAgICAgICAgIGRibmFtZSA9ICJhYWFyMjAyM3R1dG9yaWFsIiwNCiAgICAgICAgICAgICAgICAgIFNlcnZlciA9ICJsb2NhbGhvc3QiLA0KICAgICAgICAgICAgICAgICAgcG9ydCA9IDMzMDYsDQogICAgICAgICAgICAgICAgICB1c2VyID0gInJvb3QiLA0KICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBrZXlfZ2V0KCJNWVNRTF9QQVNTV09SRCIpDQogICAgICAgICAgICAgICAgICApDQppbml0aWFsX3J1bj0wDQoNCmlmKGluaXRpYWxfcnVuPT0xKXsNCiAgIyMgRklSU1QgVElNRSBPTkxZIQ0KIyBsb2FkIHNvbWUgZGF0YQ0KbWV0YWRhdGEgPC0gcmVhZF9jc3YoImRhdGEvZXhhbXBsZSAxL21ldGFkYXRhLmNzdiIpDQpOTzJfZGFpbHkgPC0gcmVhZF9jc3YoImRhdGEvZXhhbXBsZSAxL05PMl9kYWlseS5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKGRhdGUgPSBjb2xfY2hhcmFjdGVyKCkpKSAlPiUgbXV0YXRlKGRhdGU9bWR5KGRhdGUpLCBkYXRlPWZvcm1hdChkYXRlLCIlWS0lbS0lZCIpKQ0KDQpPM19kYWlseSA8LSByZWFkX2NzdigiZGF0YS9leGFtcGxlIDEvTzNfZGFpbHkuY3N2IiwgY29sX3R5cGVzID0gY29scyhkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIikpKQ0KUE1fZGFpbHkgPC0gcmVhZF9jc3YoImRhdGEvZXhhbXBsZSAxL1BNX2RhaWx5LmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZGF0ZSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpKSkNCg0KIyBTbyB0aGF0IHdlIGNhbiBwZXJtaXQgd3JpdGluZyB0byBTUUwgZnJvbSBSIQ0KZGJTZW5kUXVlcnkoc3FsX2Nvbm4sICJTRVQgR0xPQkFMIGxvY2FsX2luZmlsZSA9IHRydWU7IikNCg0KIyBjcmVhdGUgYSB0YWJsZSBpbiB5b3VyIFNRTCBkYXRhYmFzZQ0KZGJDcmVhdGVUYWJsZShzcWxfY29ubixuYW1lPSJubzJfZGFpbHkiLCBmaWVsZHM9Tk8yX2RhaWx5KQ0KZGJDcmVhdGVUYWJsZShzcWxfY29ubixuYW1lPSJvM19kYWlseSIsIGZpZWxkcz1PM19kYWlseSkNCmRiQ3JlYXRlVGFibGUoc3FsX2Nvbm4sbmFtZT0icG1fZGFpbHkiLCBmaWVsZHM9UE1fZGFpbHkpDQoNCiMgd3JpdGUgb3VyIGRhdGEgdG8gdGhlIFNRTCBkYXRhYmFzZQ0KZGJXcml0ZVRhYmxlKHNxbF9jb25uLCJubzJfZGFpbHkiLE5PMl9kYWlseSxhcHBlbmQ9VFJVRSwgcm93Lm5hbWVzPUZBTFNFKQ0KZGJXcml0ZVRhYmxlKHNxbF9jb25uLCJvM19kYWlseSIsTzNfZGFpbHksYXBwZW5kPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSkNCmRiV3JpdGVUYWJsZShzcWxfY29ubiwicG1fZGFpbHkiLFBNX2RhaWx5LGFwcGVuZD1UUlVFLCByb3cubmFtZXM9RkFMU0UpDQoNCmRiU2VuZFF1ZXJ5KHNxbF9jb25uLCJBTFRFUiBUQUJMRSBubzJfZGFpbHkgTU9ESUZZIGRhdGUgZGF0ZXRpbWU7IikNCmRiU2VuZFF1ZXJ5KHNxbF9jb25uLCJBTFRFUiBUQUJMRSBvM19kYWlseSBNT0RJRlkgZGF0ZSBkYXRldGltZTsiKQ0KZGJTZW5kUXVlcnkoc3FsX2Nvbm4sIkFMVEVSIFRBQkxFIHBtX2RhaWx5IE1PRElGWSBkYXRlIGRhdGV0aW1lOyIpDQp9DQoNCg0KDQoNCiMgbGV0J3MgcXVlcnkgb3VyIFNRTCBpbiBSISBMZXQncyBzYXkgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FsY3VsYXRpbmcgdGhlIEFRSSBmb3IgdGhlIHdlZWsgb2YgTWF5IDE1IC0gMjEsIDIwMjIgYXQgdGhlIE1haG9uIFBhcmsgc2l0ZSAoTVApDQpubzJfZGIgPSB0Ymwoc3FsX2Nvbm4sIm5vMl9kYWlseSIpICU+JSBzZWxlY3QoZGF0ZSxNUCkgJT4lIGZpbHRlcihiZXR3ZWVuKGRhdGUsIGFzLkRhdGUoJzIwMjItMDUtMTUnKSwgYXMuRGF0ZSgnMjAyMi0wNS0yMScpKSkgJT4lIHNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSByZW5hbWUoTk8yX01QID0gTVApDQpvM19kYiA9IHRibChzcWxfY29ubiwibzNfZGFpbHkiKSAlPiUgc2VsZWN0KGRhdGUsTVApICU+JSBmaWx0ZXIoYmV0d2VlbihkYXRlLCBhcy5EYXRlKCcyMDIyLTA1LTE1JyksIGFzLkRhdGUoJzIwMjItMDUtMjEnKSkpICU+JSBzaG93X3F1ZXJ5KCkgJT4lIGNvbGxlY3QoKSAlPiUgcmVuYW1lKE8zX01QID0gTVApDQpwbV9kYiA9IHRibChzcWxfY29ubiwicG1fZGFpbHkiKSAlPiUgc2VsZWN0KGRhdGUsTVApICU+JSBmaWx0ZXIoYmV0d2VlbihkYXRlLCBhcy5EYXRlKCcyMDIyLTA1LTE1JyksIGFzLkRhdGUoJzIwMjItMDUtMjEnKSkpICU+JSBzaG93X3F1ZXJ5KCkgJT4lIGNvbGxlY3QoKSAlPiUgcmVuYW1lKFBNX01QID0gTVApDQoNCiNsZXQncyBwdXQgaXQgdG9nZXRoZXIgaW50byBvbmUgZGF0YWZyYW1lIGZvciBvdXIgbG9jYWwgYW5hbHlzaXMNCmFxaSA8LSBsZWZ0X2pvaW4obm8yX2RiLCBvM19kYiwgYnk9J2RhdGUnKSAlPiUgbGVmdF9qb2luKC4sIHBtX2RiLCBieT0nZGF0ZScpICU+JSByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShhcWkgPSBtYXgoY29uMmFxaSgicG0yNSIsUE1fTVApLGNvbjJhcWkoIm8zIixPM19NUC8xMDAwLCI4aCIpLGNvbjJhcWkoIm5vMiIsTk8yX01QKSkpDQoNCiMgbWF5YmUgbm93IHdlIHdhbnQgdG8gbWFrZSBhIGJveCBwbG90IG9mIHRoZSBubzIgY29uY2VudHJhdGlvbnMgYWNyb3NzIHNpdGVzIQ0Kbm8yX3RpZHkgPSB0Ymwoc3FsX2Nvbm4sIm5vMl9kYWlseSIpICU+JSBzZWxlY3QoLWRhdGUpICU+JSBzaG93X3F1ZXJ5KCkgJT4lIGNvbGxlY3QoKSAlPiUgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSxuYW1lc190byA9ICJzaXRlIiwgdmFsdWVzX3RvID0gImNvbmNlbnRyYXRpb24iKQ0KDQojIENyZWF0ZSBhIGN1c3RvbSBvcmRlciBmb3IgdGhlICdzaXRlJyB2YXJpYWJsZQ0Kc2l0ZV9vcmRlciA8LSBjKCJCUyIsICJCSyIsICJNUCIsIlJTIiwiUjEwMDEiLCJSMTAwMiIsIlIxMDA0IiwiUjEwMDUiLCJSMTAwOCIsIlIxMDA5IiwiUjEwMTEiLCJSMTAxMiIsIlIxMDM5IiwiUjEwNDAiLCJSMTA0MSIpDQoNCiMgTWFrZSBib3ggcGxvdHMgZm9yIGV2ZXJ5dGhpbmcNCm5vMl9wbG90IDwtIGdncGxvdChubzJfdGlkeSwgYWVzKHggPSBmYWN0b3Ioc2l0ZSwgbGV2ZWxzID0gc2l0ZV9vcmRlciksIHkgPSBjb25jZW50cmF0aW9uLCBmaWxsPXNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJOTzIgQ29uY2VudHJhdGlvbnMgYnkgU2l0ZSIsDQogICAgICAgeCA9ICJTaXRlIiwNCiAgICAgICB5ID0gIkNvbmNlbnRyYXRpb24gKHBwYikiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZSgpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsNjApKQ0Kbm8yX3Bsb3QNCg0KbzNfdGlkeSA9IHRibChzcWxfY29ubiwibzNfZGFpbHkiKSAlPiUgc2VsZWN0KC1kYXRlKSAlPiUgc2hvd19xdWVyeSgpICU+JSBjb2xsZWN0KCkgJT4lIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksbmFtZXNfdG8gPSAic2l0ZSIsIHZhbHVlc190byA9ICJjb25jZW50cmF0aW9uIikNCg0KbzNfcGxvdCA8LSBnZ3Bsb3QobzNfdGlkeSwgYWVzKHggPSBmYWN0b3Ioc2l0ZSwgbGV2ZWxzID0gc2l0ZV9vcmRlciksIHkgPSBjb25jZW50cmF0aW9uLCBmaWxsPXNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJPMyBDb25jZW50cmF0aW9ucyBieSBTaXRlIiwNCiAgICAgICB4ID0gIlNpdGUiLA0KICAgICAgIHkgPSAiQ29uY2VudHJhdGlvbiAocHBiKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCw2MCkpDQpvM19wbG90DQoNCnBtX3RpZHkgPSB0Ymwoc3FsX2Nvbm4sInBtX2RhaWx5IikgJT4lIHNlbGVjdCgtZGF0ZSkgJT4lIHNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLG5hbWVzX3RvID0gInNpdGUiLCB2YWx1ZXNfdG8gPSAiY29uY2VudHJhdGlvbiIpDQoNCnBtX3Bsb3QgPC0gZ2dwbG90KHBtX3RpZHksIGFlcyh4ID0gZmFjdG9yKHNpdGUsIGxldmVscyA9IHNpdGVfb3JkZXIpLCB5ID0gY29uY2VudHJhdGlvbiwgZmlsbD1zaXRlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnModGl0bGUgPSAiUE0yLjUgQ29uY2VudHJhdGlvbnMgYnkgU2l0ZSIsDQogICAgICAgeCA9ICJTaXRlIiwNCiAgICAgICB5ID0gIkNvbmNlbnRyYXRpb24gKHVnL20zKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwyMCkpDQpwbV9wbG90DQoNCiMgTm93IGxldCdzIG1ha2UgYSB0aW1lIHNlcmllcyBmb3IgdGhlIG1vbnRoIG9mIEp1bHkgMjAyMiBmb3IgYWxsIHBvbGx1dGFudHMNCm5vMl9qdWx5ID0gdGJsKHNxbF9jb25uLCJubzJfZGFpbHkiKSAlPiUgZmlsdGVyKG1vbnRoKGRhdGUpPT03KSAlPiVzaG93X3F1ZXJ5KCkgJT4lIGNvbGxlY3QoKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHM9YygyOjE2KSxuYW1lc190byA9ICJzaXRlIiwgdmFsdWVzX3RvID0gImNvbmNlbnRyYXRpb24iKQ0KDQpnZ3Bsb3Qobm8yX2p1bHksIGFlcyh4ID0gZGF0ZSwgeSA9IGNvbmNlbnRyYXRpb24sIGNvbG9yID0gc2l0ZSkpICsNCiAgZ2VvbV9saW5lKG5hLnJtPVRSVUUpICsNCiAgbGFicyh0aXRsZSA9ICJUaW1lIFNlcmllcyBvZiBEYXRhIGZvciBKdWx5IiwNCiAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgIHkgPSAiTk8yIENvbmNlbnRyYXRpb24gKHBwYikiKQ0KDQojIFJlYWQgZGF0YSBpbnRvIEdyYWZhbmENCg0KIyBNYWtlIGEgdXNlciB0aGF0IGNhbiBvbmx5IHJlYWQgb3VyIFNRTCBkYXRhYmFzZSBjYWxsZWQgImdyYWZhbmEtZGVtbyINCg0KIyBDUkVBVEUgVVNFUiAnZ3JhZmFuYS1kZW1vJ0AnbG9jYWxob3N0JyBJREVOVElGSUVEIEJZICdhYWFydHV0b3JpYWwnDQoNCiMgU0VMRUNUIFVzZXIgZnJvbSBteXNxbC51c2VyIHRvIHZpZXcgb3VyIHVzZXJzDQoNCiMgR1JBTlQgU0VMRUNUIE9OIGRhdGFiYXNlX25hbWUudGFibGVfbmFtZSBUTyAndXNlcm5hbWUnQCdsb2NhbGhvc3QnOw0KDQojIEZMVVNIIFBSSVZJTEVHRVM7DQoNCg0KYGBgDQoNCg0K
+
LS0tDQp0aXRsZTogIkFBQVIgMjAyMyBEYXRhIFdyYW5nbGluZyBUdXRvcmlhbCINCmF1dGhvcjogIkRyLiBOYW9taSBaaW1tZXJtYW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIHJtYXJrZG93bjo6aHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCiMgSW50cm9kdWN0aW9uDQoNCk1hbmFnaW5nIHlvdXIgZXhwZXJpbWVudGFsIGRhdGEgaXMgaW5jcmVhc2luZ2x5IGRpZmZpY3VsdCBiZWNhdXNlIG9mIHRoZSBzaGVlciB2b2x1bWUgb2YgZGF0YSB0aGF0IGlzIGJlaW5nIGNvbGxlY3RlZCwgdGhlIGhpZ2ggdGltZSByZXNvbHV0aW9uIG9mIHRoZSBkYXRhLCB0aGUgbnVtYmVyIG9mIGRhdGEgdXNlcnMsIGFuZCBwdWJsaXNoaW5nIHJlcXVpcmVtZW50cyBvbiBtYWtpbmcgZGF0YSBhbmQgY29kZXMgb3BlbiBhbmQgYWNjZXNzaWJsZS4gVGFraW5nIHNvbWUgdGltZSB0byBsZWFybiBmcm9tIGNvcmUgZGF0YSBtYW5hZ2VtZW50IGFuZCBkYXRhIHdyYW5nbGluZyBza2lsbHMgaXMgaW1wb3J0YW50IQ0KDQpJbiB0aGlzIHR1dG9yaWFsLCB3ZSdsbCBsb29rIGF0IHRoZSBkYXRhIG1hbmFnZW1lbnQgYW5kIGFuYWx5c2lzIHBpcGVsaW5lIGZyb20gZGF0YSBpbXBvcnQgLyB1cGxvYWQgdGhyb3VnaCB0byBkYXRhIHZpc3VhbGl6YXRpb24uIFdlJ2xsIGNvbXBhcmUgYSBjb3VwbGUgb2YgZGlmZmVyZW50IGFwcHJvYWNoZXMgY29uc2lkZXJpbmcgdGhlIG5lZWRzIEkganVzdCBvdXRsaW5lZC4gVGhlIGZpcnN0IGRhdGEgc2V0IEkgYW0gcHJvdmlkaW5nIGlzIGEgcHJlLWNsZWFuZWQgZGF0YSBzZXQgZm9yIHNpbXBsaWNpdHkgYW5kIHRvIHNob3cgdGhlIHBpcGVsaW5lIGZyb20gc3RhcnQgdG8gZmluaXNoLiBJZiB3ZSBoYXZlIHRpbWUsIHdlJ2xsIGxvb2sgYXQgYSBtb3JlIGNvbXBsaWNhdGVkIHNldCBvZiBkYXRhIHRoYXQgcmVxdWlyZXMgbW9yZSBwcmUtcHJvY2Vzc2luZyBiZWZvcmUgd2UgY2FuIGxvb2sgYXQgaXQuIA0KDQpUaGVyZSBhcmUgbWFueSBjb2RpbmcgbGFuZ3VhZ2VzIHlvdSBjYW4gdXNlIHRvIHdvcmsgd2l0aCB5b3VyIGRhdGEuIEluIHRoaXMgdHV0b3JpYWwsIEkgYW0gZ29pbmcgdG8gdXNlIFN0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2UgKFNRTCkgYW5kIFIuIFRvIG1hbmFnZSBTUUwgZGF0YSwgSSB3aWxsIHNob3cgYW4gZXhhbXBsZSB3aXRoIFtNeVNRTF0oaHR0cHM6Ly93d3cubXlzcWwuY29tL3Byb2R1Y3RzL2NvbW11bml0eS8pLiBUaGlzIGlzIGp1c3Qgb25lIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgbWFueSBvZiB0aGUgc2FtZSBwcmluY2lwbGVzIHdpbGwgYXBwbHkgaWYgeW91J3JlIHVzaW5nIG90aGVyIHBvcHVsYXIgU1FMIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtcyBsaWtlIFtTUUxpdGVdKGh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvZG93bmxvYWQuaHRtbCkgb3IgW1Bvc3RncmVTUUxdKGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2Rvd25sb2FkLykuIFlvdSBqdXN0IG5lZWQgdG8gY2hhbmdlIHRoZSBSIHBhY2thZ2UgeW91IGFyZSB1c2luZyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgU1FMIGRhdGFiYXNlIG1hbmFnZW1lbnQgc3lzdGVtIHlvdSBhcmUgdXNpbmcuDQoNCkknbGwgYWxzbyBicmllZmx5IGRlbW9uc3RyYXRlIGltcG9ydGluZyB5b3VyIGRhdGEgZGlyZWN0bHkgaW50byBbUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvIA0KKSBhbmQgc29tZSBjb21tb24gcGl0ZmFsbHMgLyB3aHkgdGhlIFNRTCBhcHByb2FjaCBjYW4gYmUgcHJlZmVyYWJsZS4NCg0KT25jZSBvdXIgZGF0YSBpcyBpbiBbUl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvIA0KKSB1c2luZyBbUlN0dWRpb10oaHR0cHM6Ly9wb3NpdC5jby9kb3dubG9hZC9yc3R1ZGlvLWRlc2t0b3AvIA0KKSwgYSBwb3B1bGFyIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKElERSkgZm9yIFIsIHdlJ2xsIGRvIHNvbWUgcXVpY2sgdmlzdWFsaXphdGlvbnMsIGludHJvZHVjaW5nIHlvdSB0byBhIHBvcHVsYXIgY29sbGVjdGlvbiBvZiBSIGNvZGluZyBwYWNrYWdlcyBjYWxsZWQgdGhlIFsndGlkeXZlcnNlJ10oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pLiBUaGlzIHNoYXJlcyBtYW55IHByaW5jaXBsZXMgd2l0aCB0aGUgWydwYW5kYXMnXShodHRwczovL3BhbmRhcy5weWRhdGEub3JnLykgc29mdHdhcmUgbGlicmFyeSBpbiBbUHl0aG9uXShodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy8pLiBTbyB3aGlsZSB3ZSB3aWxsIHdvcmsgaW4gUi9SU3R1ZGlvIHRvZGF5LCBhZ2FpbiwgbWFueSBvZiB0aGUgaWRlYXMgb3IgcHJvY2Vzc2VzIGNhbiBiZSByZXBsaWNhdGVkIGluIFB5dGhvbiAoZm9yIGV4YW1wbGUgdXNpbmcgdGhlIFtQeUNoYXJtIElERV0oaHR0cHM6Ly93d3cuamV0YnJhaW5zLmNvbS9weWNoYXJtL2Rvd25sb2FkLykpLiBJdCdzIGp1c3QgYSBtYXR0ZXIgb2YgcGVyc29uYWwgcHJlZmVyZW5jZSA6KSANCg0KVG8gbWFuYWdlIG91ciBSIGNvZGVzIGFuZCB0YWtlIG5vdGVzIC8gc2hhcmUgaW50ZXJpbSBwbG90cywgd2UnbGwgYmUgdXNpbmcgYSBtYXJrZG93biBmaWxlLiBJJ20gdHlwaW5nIHRoaXMgdHV0b3JpYWwgcmlnaHQgbm93IGluIGFuIFIgTWFya2Rvd24gZmlsZS4gVmVyeSBtZXRhLiBBbm90aGVyIHBvcHVsYXIgcGllY2Ugb2Ygc29mdHdhcmUgZm9yIG1hcmtkb3duIGZpbGVzIHdpdGggZW1iZWRkZWQgUiBvciBQeXRob24gY29kaW5nIGlzIFtKdXB5dGVyIE5vdGVib29rc10oaHR0cHM6Ly9qdXB5dGVyLm9yZy8pLiBXZSB3b24ndCBydW4gYW55IEp1cHl0ZXIgbm90ZWJvb2tzLCBidXQgSSB3aWxsIHNob3cgeW91IGJyaWVmbHkgd2hhdCB0aGV5J3JlIGFsbCBhYm91dC4gDQoNCkFzIHdlIHdvcmsgdGhyb3VnaCBvdXIgZGF0YSwgd2UgYWxsIGtub3cgdGhhdCBhbmFseXNpcyBjYW4gdGFrZSB0aW1lLiBPciBwZXJoYXBzIHdlIHdhbnQgdG8gcnVuIGEgY29kZSB0aGF0IG1pZ2h0IGJyZWFrIGV2ZXJ5dGhpbmcgKGhhcHBlbnMgdG8gdGhlIGJlc3Qgb2YgdXMhKSBhbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgY2FuIHJlc3RvcmUgb3VyIHByZXZpb3VzIGNvZGUuIFZlcnNpb24gY29udHJvbCBpcyB5b3VyIGZyaWVuZCBoZXJlIGFuZCBpdCdzIHNvIGVhc3kgdG8gZG8gd2l0aCBbR2l0XShodHRwczovL2dpdC1zY20uY29tL2Rvd25sb2FkcyksIHdoaWNoIGlzIGEgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbSB0aGF0IHRyYWNrcyBjaGFuZ2VzIGluIGFueSBzZXQgb2YgY29tcHV0ZXIgZmlsZXMuIFdlJ2xsIHVzZSB0aGUgW0dpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2pvaW4gDQopIHBsYXRmb3JtIGFzIG91ciBjb252ZW5pZW50IGNsb3VkLWJhc2VkIHN5c3RlbSB0byBleGVjdXRlIG91ciBHaXQgdmVyc2lvbiBjb250cm9sLiBBIG5pY2UgZmVhdHVyZSBvZiBHaXRodWIgaXMgdGhhdCB3ZSBjYW4gYWxzbyBlYXNpbHkgY29udmVydCBvdXIgTWFya2Rvd24gZmlsZXMgaW50byB3ZWJwYWdlcyAod2hpY2ggaXMgd2hhdCB5b3UncmUgcmVhZGluZyByaWdodCBub3chKS4gU28gY29vbCwgcmlnaHQ/DQoNCkxhc3RseSwgaWYgeW91IGhhdmUgYSBsb3Qgb2YgZGF0YSBiZWluZyBjb2xsZWN0ZWQgcm91dGluZWx5LCBpdCBjYW4gYmUgY29vbCB0byBzaG93IHlvdXIgZGF0YS4gV2UnbGwgZG8gYSBzaW1wbGUgZXhhbXBsZSBpbiBbR3JhZmFuYV0oaHR0cHM6Ly9ncmFmYW5hLmNvbS9ncmFmYW5hL2Rvd25sb2FkKSwgd2hpY2ggaXMgYW4gb3BlbiBzb3VyY2UgYW5hbHl0aWNzIGFuZCBpbnRlcmFjdGl2ZSB2aXN1YWxpemF0aW9uIHdlYiBhcHBsaWNhdGlvbi4NCg0KV2hhdCB3ZSdsbCBjb3ZlciB0b2RheSBpcyBhIGxvdCBmb3IgYSAxIGhvdXIgNDUgbWludXRlIHNlc3Npb24gLSBhbmQgdGhhdCdzIG9rYXkhIFRoZSBnb2FsIGlzIHRoYXQgeW91IGNvbWUgb3V0IG9mIHRoaXMgdHV0b3JpYWwgd2l0aCBzb21lIGlkZWFzLCBuZXcgdGVybWlub2xvZ3kgYW5kIGFuIGludGVyZXN0IGluIGxlYXJuaW5nIG1vcmUuIElmIHlvdSB0YWtlIHRoZSB0aW1lIHRvIGxlYXJuIHRoZXNlIHByaW5jaXBsZXMgYW5kIGFwcHJvYWNoZXMgZWFybHkgb24gaW4geW91ciBwcm9ncmFtLCB5b3UnbGwgaGF2ZSBhbiBlYXNpZXIgdGltZSBkb3duIHRoZSByb2FkIHdoZW4geW91J3JlIHRyeWluZyB0byBhZGRyZXNzIFJldmlld2VyIDIgY29tbWVudHMgYWxtb3N0IGEgeWVhciBhZnRlciBhIHBhcGVyIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCwgYmVjYXVzZSB5b3UgbGVmdCB5b3Vyc2VsZiBhbiBhd2Vzb21lIHBhcGVyIHRyYWlsLiBGdXR1cmUgeW91IGlzIGFscmVhZHkgdGhhbmtpbmcgeW91ISBOb3cgd2l0aG91dCBmdXJ0aGVyIGFkbywgbGV0J3MgZ2V0IHN0YXJ0ZWQuDQoNCiMjIEdldHRpbmcgeW91cnNlbGYgc2V0LXVwDQpJZiB5b3Ugd2FudCB0byBmb2xsb3cgYWxvbmcgaW4gcmVhbC10aW1lLCB5b3UnbGwgbmVlZCB0aGUgZm9sbG93aW5nIHRvb2xzIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUuIE5vdGUgdGhhdCBJIHRlc3RlZCB0aGlzIHR1dG9yaWFsIGluIHRoZSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uIEkgY2FuJ3QgbWFrZSBhbnkgZ3VhcmFudGVlcyBpdCB3aWxsIHdvcmsgMTAwJSBzbW9vdGhseSBpbiBhIG1hY09TIG9yIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnkgcGl0ZmFsbHMgd2l0aCB0aGlzLg0KDQpUb29scyBuZWVkZWQ6DQoNCiogTXlTUUwgWyhDbGljayBoZXJlIGZvciBZb3VUdWJlIHR1dG9yaWFsIGZvciBpbnN0YWxsaW5nIE15U1FMIG9uIFdpbmRvd3MgMTEpXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXFCQlhCWlhLaTB3KQ0KKiBSIGFuZCBSU3R1ZGlvIFsoQ2xpY2sgaGVyZSBmb3IgWW91VHViZSB0dXRvcmlhbCBmb3IgaW5zdGFsbGluZyBSIGFuZCBSU3R1ZGlvKV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1ZckVlMlRMcjNNSSkNCiogR2l0IGFuZCBhIEdpdGh1YiBhY2NvdW50IFsoQ2xpY2sgaGVyZSBmb3IgYSBHaXRodWIgR3VpZGUgb24gSW5zdGFsbGluZyBHaXQpXShodHRwczovL2dpdGh1Yi5jb20vZ2l0LWd1aWRlcy9pbnN0YWxsLWdpdCkNCiogQ29ubmVjdCBHaXQgdG8gUlN0dWRpbyBbKENsaWNrIGhlcmUgZm9yIGEgWW91VHViZSB0dXRvcmlhbCBvbiBjb25uZWN0aW5nIEdpdCBhbmQgR2l0aHViIHRvIGFuIFJTdHVkaW8gUHJvamVjdCldKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9YlVvTjg1UXZDMTApDQoNCk90aGVyIG5vdGVzOg0KDQoqIFRoaXMgdHV0b3JpYWwgd2lsbCByZXF1aXJlIGEgYnVuY2ggb2YgUiBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgLSBidXQgZG9uJ3Qgd29ycnksIEkgaGF2ZSBwYXJ0cyBvZiB0aGUgY29kZSBibG9ja3MgYmVsb3cgdGhhdCB3aWxsIGluc3RhbGwgYW55IFIgcGFja2FnZXMgeW91IG1pZ2h0IG5lZWQgdGhhdCB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIDopDQoqIEFsbCB0aGUgZGF0YSwgY29kZXMgYW5kIG1hcmtkb3duIGZpbGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIEdpdGh1YiByZXBvc2l0b3J5IFsoQ2xpY2sgaGVyZSB0byBhY2Nlc3MpXShodHRwczovL2dpdGh1Yi5jb20vbnppbW1lcm1hbi11YmMvQUFBUjIwMjMtdHV0b3JpYWwpDQoqIElmIHlvdSBqdXN0IHdhbnQgdGhlIFIgTWFya2Rvd24gZmlsZSwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tIHRoZSB1cHBlciByaWdodCBjb3JuZXIgb2YgdGhlIHBhZ2UuDQoNCiMgUGFydCAwOiBWZXJzaW9uIENvbnRyb2wNCkluIGRldmVsb3BpbmcgdGhpcyB0dXRvcmlhbCwgSSB1c2VkIHZlcnNpb24gY29udHJvbCB1c2luZyBHaXQgYW5kIEdpdGh1Yi4gSWYgeW91J3JlIGluIGFjYWRlbWlhLCBHaXRodWIgaXMgZ3JlYXQgYmVjYXVzZSB5b3UgY2FuIGdldCBhY2Nlc3MgdG8gbWFueSBwYWlkIGZlYXR1cmVzIGZvciBmcmVlIChtYWtpbmcgcGFnZXMgZnJvbSBwcml2YXRlIHJlcG9zaXRvcmllcywgY3JlYXRpbmcgb3JnYW5pemF0aW9ucywgZXRjLikuIFlvdSBjYW4gaW50ZXJhY3Qgd2l0aCBHaXQgaW4gUlN0dWRpbyB2ZXJ5IGVhc2lseSBhZnRlciBpdCdzIGluc3RhbGxlZCAoc2VlIGxpbmtzIGZyb20gdGhlIEludHJvZHVjdGlvbikuIE9uY2UgeW91J3ZlIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgR2l0IGFuZCBtYWRlIGl0IGFjY2Vzc2libGUgaW4gUlN0dWRpbywgeW91J2xsIHNlZSBhIGxpdHRsZSAiR2l0IiB0YWIgaW4gdGhlIHRvcCByaWdodCBwYW5lbC4gV2UgY2FuIHVzZSB0aGlzIHBhbmVsIHRvIHF1aWNrbHkgQ29tbWl0IGNoYW5nZXMgdG8gb3VyIHJlcG9zaXRvcnksIHZpZXcgZmlsZSBhZGRpdGlvbnMgb3IgZGVsZXRpb25zLCBldGMuIA0KDQpUaG9zZSB3aG8gYXJlIGZhbWlsaWFyIHdpdGggR2l0IG1heSBwcmVmZXIgdG8gdXNlIHRoZSBjb21tYW5kIGxpbmUgLSB0aGF0J3Mgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2Ygb3VyIHR1dG9yaWFsIHRvZGF5LCBidXQgeW91IGNhbiBhY2Nlc3MgdGhlIHRlcm1pbmFsIGZyb20gUlN0dWRpbyBpbiB0aGUgIlRlcm1pbmFsIiB0YWIgb2YgdGhlIGJvdHRvbSBsZWZ0IHBhbmVsLg0KDQpJIHdpbGwgbm93IHF1aWNrbHkgZGVtb25zdHJhdGUgbWFraW5nIGEgY2hhbmdlLCBjb21taXR0aW5nIHRoYXQgY2hhbmdlLCBhbmQgcHVzaGluZyBteSBjaGFuZ2UgdG8gR2l0aHViLg0KDQojIyBGb3JraW5nIHRoZSBkaXJlY3RvcnkNCklmIHlvdSB3YW50IHRvIGZvbGxvdyBhbG9uZyBpbiByZWFsLXRpbWUgd2l0aCB0aGlzIHR1dG9yaWFsLCBuYXZpZ2F0ZSB0byB0aGlzIHR1dG9yaWFsJ3MgcmVwb3NpdG9yeSBbKENsaWNrIGhlcmUgdG8gYWNjZXNzKV0oaHR0cHM6Ly9naXRodWIuY29tL256aW1tZXJtYW4tdWJjL0FBQVIyMDIzLXR1dG9yaWFsKSBhbmQgY3JlYXRlIGEgZm9yayAod2hpY2ggd2lsbCBjcmVhdGUgYSBsb2NhbCBjb3B5IGluIHlvdXIgb3duIHJlcG9zaXRvcnkpLiANCg0KIyBQYXJ0IDE6IFNRTCBTZXQtdXAgYW5kIExvZ2lzdGljcw0KU28gZmlyc3QgdGhpbmdzIGZpcnN0LCB3ZSdyZSBnb2luZyB0byBtYWtlIHN1cmUgd2UgaGF2ZSBzZXQgdXAgYW5kIGNvbmZpZ3VyZWQgTXlTUUwgb24gb3VyIG1hY2hpbmUuIFdlJ2xsIGRvIHRoaXMgcGFydCBsaXZlLCBzbyBmb2xsb3cgYWxvbmcuIFdlIGNhbiBpbnRlcmFjdCB3aXRoIE15U1FMIGluIGEgZmV3IHdheXM6DQoNCiogTXlTUUwgV29ya2JlbmNoOiBBIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZSBmb3IgeW91ciBTUUwgZGF0YQ0KKiBUaGUgY29tbWFuZCBsaW5lDQoNClRoZSBuaWNlIHRoaW5nIGFib3V0IHRoZSB3b3JrYmVuY2ggaXMgdGhhdCBpdCBjYW4gaGVscCB5b3UgbGVhcm4gaG93IHRvIHdyaXRlIGFuZCBwYXJzZSBTUUwgcXVlcmllcywgc2luY2UgaXQgd2lsbCB0cmFuc2xhdGUgeW91ciByZXF1ZXN0IGludG8gdGhlIHF1ZXJ5LiBTbyB3ZSdsbCBtb3N0bHkgYmUgdXNpbmcgdGhlIFdvcmtiZW5jaCB0byBjaGVjayB0aGF0IG91ciB3b3JrIGlzIGJlaW5nIHN0b3JlZCBjb3JyZWN0bHksIGJ1dCBJIHdpbGwgc2hvdyBzb21lIHF1aWNrIGV4YW1wbGVzIGluIHRoZSBjb21tYW5kIGxpbmUgdG9vIGxhdGVyIG9uIGluIHRoZSB0dXRvcmlhbC4gDQoNCk9uY2Ugd2UgaGF2ZSBzZXQgdXAgTXlTUUwgb24gb3VyIG1hY2hpbmUsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIA0KVGhlIGZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8sIGlzIGFkZCBvdXIgZXhwZXJpbWVudCBkYXRhIHRvIE15U1FMIHNvIHdlIGNhbiBxdWVyeSB0aGUgZGF0YSBpbiBSLiBXaGlsZSB0aGVzZSBzdGVwcyBvY2N1ciBvdXRzaWRlIG9mIFJTdHVkaW8sIEkgaGF2ZSBpbmNsdWRlZCBzb21lIHNjcmVlbnNob3RzIGhlcmUgc28geW91IGNhbiBmb2xsb3cgYWxvbmcuIFRoZXJlIGFyZSBhIGZldyBvcHRpb25zIHRvIGFkZCBkYXRhIHRvIE15U1FMLiBIZXJlIEkgd2lsbCBkZXNjcmliZSB0d28gb2YgdGhlbToNCg0KDQoNCiMjIEhvdXNla2VlcGluZw0KV2UgYXJlIGdvaW5nIHRvIGRvIGEgZmV3IHRoaW5ncyB0byBnZXQgc3RhcnRlZCENCg0KLSBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMNCi0gTG9hZCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCiMgTG9hZCBwYWNrYWdlcyAtIEkgbGlrZSB0byB1c2UgdGhlIHBhY21hbiBwYWNrYWdlIHRvIGRvIHRoaXMgbW9yZSBlbGVnYW50bHkuDQppZiAoIXJlcXVpcmUoInBhY21hbiIpKSBpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKTsgbGlicmFyeShwYWNtYW4pDQoNCiMgVGhlIHBhY21hbiBwYWNrYWdlIGhhcyBhIG5pY2UgZnVuY3Rpb24gJ3BfbG9hZCgpJyB0aGF0IHdpbGwgbG9hZCB0aGUgbGlzdGVkIHBhY2thZ2VzIGFuZCBpbnN0YWxsIHRoZW0gaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5zdGFsbGVkLg0KcF9sb2FkKERCSSxST0RCQyxvZGJjLGRicGx5cixSTXlTUUwsdGlkeXZlcnNlLGtleXJpbmcsY29uMmFxaSxsdWJyaWRhdGUsIHN0cmluZ3IpDQoNCiMgQ2hlY2sgdGhhdCBNeVNRTCBpcyBsaXN0ZWQsIGlmIGl0IGlzbid0IG5lZWQgdG8gcHJvdmlkZSBzdGVwcy4NCnNvcnQodW5pcXVlKG9kYmNMaXN0RHJpdmVycygpW1sxXV0pKQ0KDQpzcWxfY29ubiA8LSBkYkNvbm5lY3QoUk15U1FMOjpNeVNRTCgpLA0KICAgICAgICAgICAgICAgICAgZGJuYW1lID0gImFhYXIyMDIzdHV0b3JpYWwiLA0KICAgICAgICAgICAgICAgICAgU2VydmVyID0gImxvY2FsaG9zdCIsDQogICAgICAgICAgICAgICAgICBwb3J0ID0gMzMwNiwNCiAgICAgICAgICAgICAgICAgIHVzZXIgPSAicm9vdCIsDQogICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGtleV9nZXQoIk1ZU1FMX1BBU1NXT1JEIikNCiAgICAgICAgICAgICAgICAgICkNCmluaXRpYWxfcnVuPTANCg0KaWYoaW5pdGlhbF9ydW49PTEpew0KICAjIyBGSVJTVCBUSU1FIE9OTFkhDQojIGxvYWQgc29tZSBkYXRhDQptZXRhZGF0YSA8LSByZWFkX2NzdigiZGF0YS9leGFtcGxlIDEvbWV0YWRhdGEuY3N2IikNCk5PMl9kYWlseSA8LSByZWFkX2NzdigiZGF0YS9leGFtcGxlIDEvTk8yX2RhaWx5LmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZGF0ZSA9IGNvbF9jaGFyYWN0ZXIoKSkpICU+JSBtdXRhdGUoZGF0ZT1tZHkoZGF0ZSksIGRhdGU9Zm9ybWF0KGRhdGUsIiVZLSVtLSVkIikpDQoNCk8zX2RhaWx5IDwtIHJlYWRfY3N2KCJkYXRhL2V4YW1wbGUgMS9PM19kYWlseS5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKGRhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSkpDQpQTV9kYWlseSA8LSByZWFkX2NzdigiZGF0YS9leGFtcGxlIDEvUE1fZGFpbHkuY3N2IiwgY29sX3R5cGVzID0gY29scyhkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIikpKQ0KDQojIFNvIHRoYXQgd2UgY2FuIHBlcm1pdCB3cml0aW5nIHRvIFNRTCBmcm9tIFIhDQpkYlNlbmRRdWVyeShzcWxfY29ubiwgIlNFVCBHTE9CQUwgbG9jYWxfaW5maWxlID0gdHJ1ZTsiKQ0KDQojIGNyZWF0ZSBhIHRhYmxlIGluIHlvdXIgU1FMIGRhdGFiYXNlDQpkYkNyZWF0ZVRhYmxlKHNxbF9jb25uLG5hbWU9Im5vMl9kYWlseSIsIGZpZWxkcz1OTzJfZGFpbHkpDQpkYkNyZWF0ZVRhYmxlKHNxbF9jb25uLG5hbWU9Im8zX2RhaWx5IiwgZmllbGRzPU8zX2RhaWx5KQ0KZGJDcmVhdGVUYWJsZShzcWxfY29ubixuYW1lPSJwbV9kYWlseSIsIGZpZWxkcz1QTV9kYWlseSkNCg0KIyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgU1FMIGRhdGFiYXNlDQpkYldyaXRlVGFibGUoc3FsX2Nvbm4sIm5vMl9kYWlseSIsTk8yX2RhaWx5LGFwcGVuZD1UUlVFLCByb3cubmFtZXM9RkFMU0UpDQpkYldyaXRlVGFibGUoc3FsX2Nvbm4sIm8zX2RhaWx5IixPM19kYWlseSxhcHBlbmQ9VFJVRSwgcm93Lm5hbWVzPUZBTFNFKQ0KZGJXcml0ZVRhYmxlKHNxbF9jb25uLCJwbV9kYWlseSIsUE1fZGFpbHksYXBwZW5kPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSkNCg0KZGJTZW5kUXVlcnkoc3FsX2Nvbm4sIkFMVEVSIFRBQkxFIG5vMl9kYWlseSBNT0RJRlkgZGF0ZSBkYXRldGltZTsiKQ0KZGJTZW5kUXVlcnkoc3FsX2Nvbm4sIkFMVEVSIFRBQkxFIG8zX2RhaWx5IE1PRElGWSBkYXRlIGRhdGV0aW1lOyIpDQpkYlNlbmRRdWVyeShzcWxfY29ubiwiQUxURVIgVEFCTEUgcG1fZGFpbHkgTU9ESUZZIGRhdGUgZGF0ZXRpbWU7IikNCn0NCg0KDQoNCg0KIyBsZXQncyBxdWVyeSBvdXIgU1FMIGluIFIhIExldCdzIHNheSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYWxjdWxhdGluZyB0aGUgQVFJIGZvciB0aGUgd2VlayBvZiBNYXkgMTUgLSAyMSwgMjAyMiBhdCB0aGUgTWFob24gUGFyayBzaXRlIChNUCkNCm5vMl9kYiA9IHRibChzcWxfY29ubiwibm8yX2RhaWx5IikgJT4lIHNlbGVjdChkYXRlLE1QKSAlPiUgZmlsdGVyKGJldHdlZW4oZGF0ZSwgYXMuRGF0ZSgnMjAyMi0wNS0xNScpLCBhcy5EYXRlKCcyMDIyLTA1LTIxJykpKSAlPiUgc2hvd19xdWVyeSgpICU+JSBjb2xsZWN0KCkgJT4lIHJlbmFtZShOTzJfTVAgPSBNUCkNCm8zX2RiID0gdGJsKHNxbF9jb25uLCJvM19kYWlseSIpICU+JSBzZWxlY3QoZGF0ZSxNUCkgJT4lIGZpbHRlcihiZXR3ZWVuKGRhdGUsIGFzLkRhdGUoJzIwMjItMDUtMTUnKSwgYXMuRGF0ZSgnMjAyMi0wNS0yMScpKSkgJT4lIHNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSByZW5hbWUoTzNfTVAgPSBNUCkNCnBtX2RiID0gdGJsKHNxbF9jb25uLCJwbV9kYWlseSIpICU+JSBzZWxlY3QoZGF0ZSxNUCkgJT4lIGZpbHRlcihiZXR3ZWVuKGRhdGUsIGFzLkRhdGUoJzIwMjItMDUtMTUnKSwgYXMuRGF0ZSgnMjAyMi0wNS0yMScpKSkgJT4lIHNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSByZW5hbWUoUE1fTVAgPSBNUCkNCg0KI2xldCdzIHB1dCBpdCB0b2dldGhlciBpbnRvIG9uZSBkYXRhZnJhbWUgZm9yIG91ciBsb2NhbCBhbmFseXNpcw0KYXFpIDwtIGxlZnRfam9pbihubzJfZGIsIG8zX2RiLCBieT0nZGF0ZScpICU+JSBsZWZ0X2pvaW4oLiwgcG1fZGIsIGJ5PSdkYXRlJykgJT4lIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKGFxaSA9IG1heChjb24yYXFpKCJwbTI1IixQTV9NUCksY29uMmFxaSgibzMiLE8zX01QLzEwMDAsIjhoIiksY29uMmFxaSgibm8yIixOTzJfTVApKSkNCg0KIyBtYXliZSBub3cgd2Ugd2FudCB0byBtYWtlIGEgYm94IHBsb3Qgb2YgdGhlIG5vMiBjb25jZW50cmF0aW9ucyBhY3Jvc3Mgc2l0ZXMhDQpubzJfdGlkeSA9IHRibChzcWxfY29ubiwibm8yX2RhaWx5IikgJT4lIHNlbGVjdCgtZGF0ZSkgJT4lIHNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLG5hbWVzX3RvID0gInNpdGUiLCB2YWx1ZXNfdG8gPSAiY29uY2VudHJhdGlvbiIpDQoNCiMgQ3JlYXRlIGEgY3VzdG9tIG9yZGVyIGZvciB0aGUgJ3NpdGUnIHZhcmlhYmxlDQpzaXRlX29yZGVyIDwtIGMoIkJTIiwgIkJLIiwgIk1QIiwiUlMiLCJSMTAwMSIsIlIxMDAyIiwiUjEwMDQiLCJSMTAwNSIsIlIxMDA4IiwiUjEwMDkiLCJSMTAxMSIsIlIxMDEyIiwiUjEwMzkiLCJSMTA0MCIsIlIxMDQxIikNCg0KIyBNYWtlIGJveCBwbG90cyBmb3IgZXZlcnl0aGluZw0Kbm8yX3Bsb3QgPC0gZ2dwbG90KG5vMl90aWR5LCBhZXMoeCA9IGZhY3RvcihzaXRlLCBsZXZlbHMgPSBzaXRlX29yZGVyKSwgeSA9IGNvbmNlbnRyYXRpb24sIGZpbGw9c2l0ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIk5PMiBDb25jZW50cmF0aW9ucyBieSBTaXRlIiwNCiAgICAgICB4ID0gIlNpdGUiLA0KICAgICAgIHkgPSAiQ29uY2VudHJhdGlvbiAocHBiKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCw2MCkpDQpubzJfcGxvdA0KDQpvM190aWR5ID0gdGJsKHNxbF9jb25uLCJvM19kYWlseSIpICU+JSBzZWxlY3QoLWRhdGUpICU+JSBzaG93X3F1ZXJ5KCkgJT4lIGNvbGxlY3QoKSAlPiUgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSxuYW1lc190byA9ICJzaXRlIiwgdmFsdWVzX3RvID0gImNvbmNlbnRyYXRpb24iKQ0KDQpvM19wbG90IDwtIGdncGxvdChvM190aWR5LCBhZXMoeCA9IGZhY3RvcihzaXRlLCBsZXZlbHMgPSBzaXRlX29yZGVyKSwgeSA9IGNvbmNlbnRyYXRpb24sIGZpbGw9c2l0ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIk8zIENvbmNlbnRyYXRpb25zIGJ5IFNpdGUiLA0KICAgICAgIHggPSAiU2l0ZSIsDQogICAgICAgeSA9ICJDb25jZW50cmF0aW9uIChwcGIpIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUoKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDYwKSkNCm8zX3Bsb3QNCg0KcG1fdGlkeSA9IHRibChzcWxfY29ubiwicG1fZGFpbHkiKSAlPiUgc2VsZWN0KC1kYXRlKSAlPiUgc2hvd19xdWVyeSgpICU+JSBjb2xsZWN0KCkgJT4lIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksbmFtZXNfdG8gPSAic2l0ZSIsIHZhbHVlc190byA9ICJjb25jZW50cmF0aW9uIikNCg0KcG1fcGxvdCA8LSBnZ3Bsb3QocG1fdGlkeSwgYWVzKHggPSBmYWN0b3Ioc2l0ZSwgbGV2ZWxzID0gc2l0ZV9vcmRlciksIHkgPSBjb25jZW50cmF0aW9uLCBmaWxsPXNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJQTTIuNSBDb25jZW50cmF0aW9ucyBieSBTaXRlIiwNCiAgICAgICB4ID0gIlNpdGUiLA0KICAgICAgIHkgPSAiQ29uY2VudHJhdGlvbiAodWcvbTMpIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUoKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDIwKSkNCnBtX3Bsb3QNCg0KIyBOb3cgbGV0J3MgbWFrZSBhIHRpbWUgc2VyaWVzIGZvciB0aGUgbW9udGggb2YgSnVseSAyMDIyIGZvciBhbGwgcG9sbHV0YW50cw0Kbm8yX2p1bHkgPSB0Ymwoc3FsX2Nvbm4sIm5vMl9kYWlseSIpICU+JSBmaWx0ZXIobW9udGgoZGF0ZSk9PTcpICU+JXNob3dfcXVlcnkoKSAlPiUgY29sbGVjdCgpICU+JSBwaXZvdF9sb25nZXIoY29scz1jKDI6MTYpLG5hbWVzX3RvID0gInNpdGUiLCB2YWx1ZXNfdG8gPSAiY29uY2VudHJhdGlvbiIpDQoNCmdncGxvdChubzJfanVseSwgYWVzKHggPSBkYXRlLCB5ID0gY29uY2VudHJhdGlvbiwgY29sb3IgPSBzaXRlKSkgKw0KICBnZW9tX2xpbmUobmEucm09VFJVRSkgKw0KICBsYWJzKHRpdGxlID0gIlRpbWUgU2VyaWVzIG9mIERhdGEgZm9yIEp1bHkiLA0KICAgICAgIHggPSAiRGF0ZSIsDQogICAgICAgeSA9ICJOTzIgQ29uY2VudHJhdGlvbiAocHBiKSIpDQoNCiMgUmVhZCBkYXRhIGludG8gR3JhZmFuYQ0KDQojIE1ha2UgYSB1c2VyIHRoYXQgY2FuIG9ubHkgcmVhZCBvdXIgU1FMIGRhdGFiYXNlIGNhbGxlZCAiZ3JhZmFuYS1kZW1vIg0KDQojIENSRUFURSBVU0VSICdncmFmYW5hLWRlbW8nQCdsb2NhbGhvc3QnIElERU5USUZJRUQgQlkgJ2FhYXJ0dXRvcmlhbCcNCg0KIyBTRUxFQ1QgVXNlciBmcm9tIG15c3FsLnVzZXIgdG8gdmlldyBvdXIgdXNlcnMNCg0KIyBHUkFOVCBTRUxFQ1QgT04gZGF0YWJhc2VfbmFtZS50YWJsZV9uYW1lIFRPICd1c2VybmFtZSdAJ2xvY2FsaG9zdCc7DQoNCiMgRkxVU0ggUFJJVklMRUdFUzsNCg0KDQpgYGANCg0KDQo=