From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jonathan Leech-Pepin Subject: Fwd: Export to Texinfo Date: Thu, 2 Aug 2012 18:24:23 -0400 Message-ID: References: <87y5meaib9.fsf@gmail.com> <87a9yupn0c.fsf@gmail.com> <871ujppaty.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=f46d042f9252ac260d04c64fdf7a Return-path: Received: from eggs.gnu.org ([208.118.235.92]:58341) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sx3og-0002nH-IH for emacs-orgmode@gnu.org; Thu, 02 Aug 2012 18:24:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sx3of-0002q0-6O for emacs-orgmode@gnu.org; Thu, 02 Aug 2012 18:24:26 -0400 Received: from mail-yx0-f169.google.com ([209.85.213.169]:63754) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sx3oe-0002ps-Uj for emacs-orgmode@gnu.org; Thu, 02 Aug 2012 18:24:25 -0400 Received: by yenr5 with SMTP id r5so71067yen.0 for ; Thu, 02 Aug 2012 15:24:24 -0700 (PDT) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode Mailing List --f46d042f9252ac260d04c64fdf7a Content-Type: text/plain; charset=UTF-8 Forwarding to list, forgot to when replying ---------- Forwarded message ---------- From: Jonathan Leech-Pepin Date: Thu, Aug 2, 2012 at 4:54 PM Subject: Re: Export to Texinfo To: Bastien Hi Bastien On Thu, Aug 2, 2012 at 11:34 AM, Bastien wrote: > Hi Jonathan, > > Jonathan Leech-Pepin writes: > >> I've done some further work on the org-e-texinfo exporter and have >> gotten it to a point where it should be usable with only a few >> shortcomings. > > thanks *a lot* for this! This is long-time wish from many org-ers, > no doubt you will have many testers. > > Do you want to continue to develop while adding the library to > contrib/lisp/? > Yes, that would be great. > One problem with the version you sent: > > (org-export-first-sibling-p headline) > (org-export-last-sibling-p headline) > > should be > > (org-export-first-sibling-p headline info) > (org-export-last-sibling-p headline info) > > With this change I can export files correctly. I'd caught that just after attaching the files the last time (I'd been working with a slightly out of date copy so that change to org-export-first-sibling-p hadn't affected me). I'd updated it in my working copy but hadn't added the changes in my next email to the list. The attached version fixes that and supports @ftable and @vtable through #+attr_texinfo before descriptive lists. (It can also be found at : https://github.com/jleechpe/org-mode/blob/texinfo/contrib/lisp/org-e-texinfo.el ) > > Another thingy: headlines from level 4 are converted to lists, > right? I'm fine with this, as long as the list is not collapsed > with a previous one. See the .org and .texi files attached. > It's able to export up to level 4 headlines (chapter, section, subsection, subsubsection), however the default is H:3 so the last is omitted. Nested lists do work with only a small issue I can see at the moment, if there are no blank lines between the items in org there are none in the info file either, however there are 2 blank lines at the end of the nested list (end of nested list+end of parent item). When I export the attached .org file the only difference I get from your .texi is the AUTHOR and the chapter/sections are numbered rather than unnumbered (and the level 4 headline is an enumerate rather than an itemize). > Thanks again for this great contribution! > You're welcome > > -- > Bastien > Regards, -- Jon --f46d042f9252ac260d04c64fdf7a Content-Type: application/octet-stream; name="org-e-texinfo.el" Content-Disposition: attachment; filename="org-e-texinfo.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h5eaz1xa2 Ozs7IG9yZy1lLXRleGluZm8uZWwgLS0tIFRleGluZm8gQmFjay1FbmQgRm9yIE9yZyBFeHBvcnQg RW5naW5lCgo7OyBBdXRob3I6IEpvbmF0aGFuIExlZWNoLVBlcGluIDxqb25hdGhhbi5sZWVjaHBl cGluIGF0IGdtYWlsIGRvdCBjb20+Cjs7IEtleXdvcmRzOiBvdXRsaW5lcywgaHlwZXJtZWRpYSwg Y2FsZW5kYXIsIHdwCgo7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo7OyB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo7 OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKOzsgVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m Cjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K Cjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCjs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6Cjs7Cjs7IFRoaXMg bGlicmFyeSBpbXBsZW1lbnRzIGEgVGV4aW5mbyBiYWNrLWVuZCBmb3IgT3JnIGdlbmVyaWMKOzsg ZXhwb3J0ZXIuCjs7Cjs7IFRvIHRlc3QgaXQsIHJ1bgo7Owo7OyAgIE0tOiAob3JnLWV4cG9ydC10 by1idWZmZXIgJ2UtdGV4aW5mbyAiKlRlc3QgZS10ZXhpbmZvKiIpIFJFVAo7Owo7OyBpbiBhbiBv cmctbW9kZSBidWZmZXIgdGhlbiBzd2l0Y2ggdG8gdGhlIGJ1ZmZlciB0byBzZWUgdGhlIFRleGlu Zm8KOzsgZXhwb3J0LiAgU2VlIGNvbnRyaWIvbGlzcC9vcmctZXhwb3J0LmVsIGZvciBtb3JlIGRl dGFpbHMgb24gaG93Cjs7IHRoaXMgZXhwb3J0ZXIgd29ya3MuCjs7Cjs7IEl0IGludHJvZHVjZXMg ZWlnaHQgbmV3IGJ1ZmZlciBrZXl3b3JkczogIlRFWElORk9fQ0xBU1MiLAo7OyAiVEVYSU5GT19G SUxFTkFNRSIsICJURVhJTkZPX0hFQURFUiIsICJURVhJTkZPX0RJUl9DQVRFR09SWSIsCjs7ICJU RVhJTkZPX0RJUl9USVRMRSIsICJURVhJTkZPX0RJUl9ERVNDIiAiU1VCVElUTEUiIGFuZCAiU1VC QVVUSE9SIi4KOzsKOzsgVG8gaW5jbHVkZSBpbmxpbmUgY29kZSBzbmlwcGV0cyAoZm9yIGV4YW1w bGUgZm9yIGdlbmVyYXRpbmcgQGtiZHt9Cjs7IGFuZCBAa2V5e30gY29tbWFuZHMpLCB0aGUgZm9s bG93aW5nIGV4cG9ydC1zbmlwcGV0IGtleXMgYXJlCjs7IGFjY2VwdGVkOgo7OyAKOzsgICAgIGlu Zm8KOzsgICAgIGUtaW5mbwo7OyAgICAgZS10ZXhpbmZvCjs7Cjs7IFlvdSBjYW4gYWRkIHRoZW0g Zm9yIGV4cG9ydCBzbmlwcGV0cyB2aWEgYW55IG9mIHRoZSBiZWxvdzoKOzsKOzsgICAgKGFkZC10 by1saXN0ICdvcmctZXhwb3J0LXNuaXBwZXQtdHJhbnNsYXRpb24tYWxpc3QKOzsgICAgICAgICAg ICAgICAgICcoImUtaW5mbyIgLiAiZS10ZXhpbmZvIikpCjs7ICAgIChhZGQtdG8tbGlzdCAnb3Jn LWV4cG9ydC1zbmlwcGV0LXRyYW5zbGF0aW9uLWFsaXN0Cjs7ICAgICAgICAgICAgICAgICAnKCJl LXRleGluZm8iIC4gImUtdGV4aW5mbyIpKQo7OyAgICAoYWRkLXRvLWxpc3QgJ29yZy1leHBvcnQt c25pcHBldC10cmFuc2xhdGlvbi1hbGlzdAo7OyAgICAgICAgICAgICAgICAgJygiaW5mbyIgLiAi ZS10ZXhpbmZvIikpCjs7IAoKCjs7OyBDb2RlOgoKKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJl ICdjbCkpCihyZXF1aXJlICdvcmctZXhwb3J0KQoKKGRlZnZhciBvcmd0YmwtZXhwLXJlZ2V4cCkK CgwKOzs7IERlZmluZSBCYWNrLUVuZAoKKGRlZnZhciBvcmctZS10ZXhpbmZvLXRyYW5zbGF0ZS1h bGlzdAogICcoKGJhYmVsLWNhbGwgLiBvcmctZS10ZXhpbmZvLWJhYmVsLWNhbGwpCiAgICAoYm9s ZCAuIG9yZy1lLXRleGluZm8tYm9sZCkKICAgIChjZW50ZXItYmxvY2sgLiBvcmctZS10ZXhpbmZv LWNlbnRlci1ibG9jaykKICAgIChjbG9jayAuIG9yZy1lLXRleGluZm8tY2xvY2spCiAgICAoY29k ZSAuIG9yZy1lLXRleGluZm8tY29kZSkKICAgIChjb21tZW50IC4gb3JnLWUtdGV4aW5mby1jb21t ZW50KQogICAgKGNvbW1lbnQtYmxvY2sgLiBvcmctZS10ZXhpbmZvLWNvbW1lbnQtYmxvY2spCiAg ICAoZHJhd2VyIC4gb3JnLWUtdGV4aW5mby1kcmF3ZXIpCiAgICAoZHluYW1pYy1ibG9jayAuIG9y Zy1lLXRleGluZm8tZHluYW1pYy1ibG9jaykKICAgIChlbnRpdHkgLiBvcmctZS10ZXhpbmZvLWVu dGl0eSkKICAgIChleGFtcGxlLWJsb2NrIC4gb3JnLWUtdGV4aW5mby1leGFtcGxlLWJsb2NrKQog ICAgKGV4cG9ydC1ibG9jayAuIG9yZy1lLXRleGluZm8tZXhwb3J0LWJsb2NrKQogICAgKGV4cG9y dC1zbmlwcGV0IC4gb3JnLWUtdGV4aW5mby1leHBvcnQtc25pcHBldCkKICAgIChmaXhlZC13aWR0 aCAuIG9yZy1lLXRleGluZm8tZml4ZWQtd2lkdGgpCiAgICAoZm9vdG5vdGUtZGVmaW5pdGlvbiAu IG9yZy1lLXRleGluZm8tZm9vdG5vdGUtZGVmaW5pdGlvbikKICAgIChmb290bm90ZS1yZWZlcmVu Y2UgLiBvcmctZS10ZXhpbmZvLWZvb3Rub3RlLXJlZmVyZW5jZSkKICAgIChoZWFkbGluZSAuIG9y Zy1lLXRleGluZm8taGVhZGxpbmUpCiAgICAoaG9yaXpvbnRhbC1ydWxlIC4gb3JnLWUtdGV4aW5m by1ob3Jpem9udGFsLXJ1bGUpCiAgICAoaW5saW5lLWJhYmVsLWNhbGwgLiBvcmctZS10ZXhpbmZv LWlubGluZS1iYWJlbC1jYWxsKQogICAgKGlubGluZS1zcmMtYmxvY2sgLiBvcmctZS10ZXhpbmZv LWlubGluZS1zcmMtYmxvY2spCiAgICAoaW5saW5ldGFzayAuIG9yZy1lLXRleGluZm8taW5saW5l dGFzaykKICAgIChpdGFsaWMgLiBvcmctZS10ZXhpbmZvLWl0YWxpYykKICAgIChpdGVtIC4gb3Jn LWUtdGV4aW5mby1pdGVtKQogICAgKGtleXdvcmQgLiBvcmctZS10ZXhpbmZvLWtleXdvcmQpCiAg ICAobGF0ZXgtZW52aXJvbm1lbnQgLiBvcmctZS10ZXhpbmZvLWxhdGV4LWVudmlyb25tZW50KQog ICAgKGxhdGV4LWZyYWdtZW50IC4gb3JnLWUtdGV4aW5mby1sYXRleC1mcmFnbWVudCkKICAgIChs aW5lLWJyZWFrIC4gb3JnLWUtdGV4aW5mby1saW5lLWJyZWFrKQogICAgKGxpbmsgLiBvcmctZS10 ZXhpbmZvLWxpbmspCiAgICAobWFjcm8gLiBvcmctZS10ZXhpbmZvLW1hY3JvKQogICAgKHBhcmFn cmFwaCAuIG9yZy1lLXRleGluZm8tcGFyYWdyYXBoKQogICAgKHBsYWluLWxpc3QgLiBvcmctZS10 ZXhpbmZvLXBsYWluLWxpc3QpCiAgICAocGxhaW4tdGV4dCAuIG9yZy1lLXRleGluZm8tcGxhaW4t dGV4dCkKICAgIChwbGFubmluZyAuIG9yZy1lLXRleGluZm8tcGxhbm5pbmcpCiAgICAocHJvcGVy dHktZHJhd2VyIC4gb3JnLWUtdGV4aW5mby1wcm9wZXJ0eS1kcmF3ZXIpCiAgICAocXVvdGUtYmxv Y2sgLiBvcmctZS10ZXhpbmZvLXF1b3RlLWJsb2NrKQogICAgKHF1b3RlLXNlY3Rpb24gLiBvcmct ZS10ZXhpbmZvLXF1b3RlLXNlY3Rpb24pCiAgICAocmFkaW8tdGFyZ2V0IC4gb3JnLWUtdGV4aW5m by1yYWRpby10YXJnZXQpCiAgICAoc2VjdGlvbiAuIG9yZy1lLXRleGluZm8tc2VjdGlvbikKICAg IChzcGVjaWFsLWJsb2NrIC4gb3JnLWUtdGV4aW5mby1zcGVjaWFsLWJsb2NrKQogICAgKHNyYy1i bG9jayAuIG9yZy1lLXRleGluZm8tc3JjLWJsb2NrKQogICAgKHN0YXRpc3RpY3MtY29va2llIC4g b3JnLWUtdGV4aW5mby1zdGF0aXN0aWNzLWNvb2tpZSkKICAgIChzdHJpa2UtdGhyb3VnaCAuIG9y Zy1lLXRleGluZm8tc3RyaWtlLXRocm91Z2gpCiAgICAoc3Vic2NyaXB0IC4gb3JnLWUtdGV4aW5m by1zdWJzY3JpcHQpCiAgICAoc3VwZXJzY3JpcHQgLiBvcmctZS10ZXhpbmZvLXN1cGVyc2NyaXB0 KQogICAgKHRhYmxlIC4gb3JnLWUtdGV4aW5mby10YWJsZSkKICAgICh0YWJsZS1jZWxsIC4gb3Jn LWUtdGV4aW5mby10YWJsZS1jZWxsKQogICAgKHRhYmxlLXJvdyAuIG9yZy1lLXRleGluZm8tdGFi bGUtcm93KQogICAgKHRhcmdldCAuIG9yZy1lLXRleGluZm8tdGFyZ2V0KQogICAgKHRlbXBsYXRl IC4gb3JnLWUtdGV4aW5mby10ZW1wbGF0ZSkKICAgICh0aW1lc3RhbXAgLiBvcmctZS10ZXhpbmZv LXRpbWVzdGFtcCkKICAgICh1bmRlcmxpbmUgLiBvcmctZS10ZXhpbmZvLXVuZGVybGluZSkKICAg ICh2ZXJiYXRpbSAuIG9yZy1lLXRleGluZm8tdmVyYmF0aW0pCiAgICAodmVyc2UtYmxvY2sgLiBv cmctZS10ZXhpbmZvLXZlcnNlLWJsb2NrKSkKICAiQWxpc3QgYmV0d2VlbiBlbGVtZW50IG9yIG9i amVjdCB0eXBlcyBhbmQgdHJhbnNsYXRvcnMuIikKCihkZWZjb25zdCBvcmctZS10ZXhpbmZvLW9w dGlvbnMtYWxpc3QKICAnKCg6dGV4aW5mby1maWxlbmFtZSAiVEVYSU5GT19GSUxFTkFNRSIgbmls IG9yZy1lLXRleGluZm8tZmlsZW5hbWUgdCkKICAgICg6dGV4aW5mby1jbGFzcyAiVEVYSU5GT19D TEFTUyIgbmlsIG9yZy1lLXRleGluZm8tZGVmYXVsdC1jbGFzcyB0KQogICAgKDp0ZXhpbmZvLWhl YWRlciAiVEVYSU5GT19IRUFERVIiIG5pbCBuaWwgbmV3bGluZSkKICAgICg6c3VidGl0bGUgIlNV QlRJVExFIiBuaWwgbmlsIG5ld2xpbmUpCiAgICAoOnN1YmF1dGhvciAiU1VCQVVUSE9SIiBuaWwg bmlsIG5ld2xpbmUpCiAgICAoOnRleGluZm8tZGlyY2F0ICJURVhJTkZPX0RJUl9DQVRFR09SWSIg bmlsIG5pbCB0KQogICAgKDp0ZXhpbmZvLWRpcnRpdGxlICJURVhJTkZPX0RJUl9USVRMRSIgbmls IG5pbCB0KQogICAgKDp0ZXhpbmZvLWRpcmRlc2MgIlRFWElORk9fRElSX0RFU0MiIG5pbCBuaWwg dCkpCiAgIkFsaXN0IGJldHdlZW4gVGV4aW5mbyBleHBvcnQgcHJvcGVydGllcyBhbmQgd2F5cyB0 byBzZXQgdGhlbS4KU2VlIGBvcmctZXhwb3J0LW9wdGlvbnMtYWxpc3QnIGZvciBtb3JlIGluZm9y bWF0aW9uIG9uIHRoZQpzdHJ1Y3R1cmUgb2YgdGhlIHZhbHVlcy4KClNVQkFVVEhPUiBhbmQgU1VC VElUTEUgYXJlIGZvciB0aGUgaW5jbHVzaW9uIG9mIGFkZGl0aW9uYWwgYXV0aG9yCmFuZCB0aXRs ZSBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIGluaXRpYWwgdmFyaWFibGUuIikKCihkZWZjb25zdCBv cmctZS10ZXhpbmZvLWZpbHRlcnMtYWxpc3QKICAnKCg6ZmlsdGVyLWhlYWRsaW5lIC4gb3JnLWUt dGV4aW5mby1maWx0ZXItc2VjdGlvbi1ibGFuay1saW5lcykKICAgICg6ZmlsdGVyLXNlY3Rpb24g LiBvcmctZS10ZXhpbmZvLWZpbHRlci1zZWN0aW9uLWJsYW5rLWxpbmVzKSkKICAiQWxpc3QgYmV0 d2VlbiBmaWx0ZXJzIGtleXdvcmRzIGFuZCBiYWNrLWVuZCBzcGVjaWZpYyBmaWx0ZXJzLgogIFNl ZSBgb3JnLWV4cG9ydC1maWx0ZXJzLWFsaXN0JyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIpCgoKDAo7 OzsgSW50ZXJuYWwgVmFyaWFibGVzCgo7OyBBZGQgVEVYSU5GTyB0byB0aGUgbGlzdCBvZiBhdmFp bGFibGUgb2YgYXZhaWxhYmxlIGV4cG9ydCBibG9ja3MuCihhZGQtdG8tbGlzdCAnb3JnLWVsZW1l bnQtYmxvY2stbmFtZS1hbGlzdAoJICAgICAnKCJURVhJTkZPIiAuIG9yZy1lbGVtZW50LWV4cG9y dC1ibG9jay1wYXJzZXIpKQoMCjs7OyBVc2VyIENvbmZpZ3VyYWJsZSBWYXJpYWJsZXMKCihkZWZn cm91cCBvcmctZXhwb3J0LWUtdGV4aW5mbyBuaWwKICAiT3B0aW9ucyBmb3IgZXhwb3J0aW5nIE9y ZyBtb2RlIGZpbGVzIHRvIFRleGluZm8uIgogIDp0YWcgIk9yZyBFeHBvcnQgVGV4aW5mbyIKICA6 Z3JvdXAgJ29yZy1leHBvcnQpCgoKOzs7OyBQcmVhbWJsZQoKKGRlZmN1c3RvbSBvcmctZS10ZXhp bmZvLWZpbGVuYW1lIG5pbAogICJEZWZhdWx0IGZpbGVuYW1lIGZvciB0ZXhpbmZvIG91dHB1dC4i CiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICcoc3RyaW5nIDp0YWcgIkV4 cG9ydCBGaWxlbmFtZSIpKQoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWRlZmF1bHQtY2xhc3Mg ImluZm8iCiAgIlRoZSBkZWZhdWx0IFRleGluZm8gY2xhc3MuIgogIDpncm91cCAnb3JnLWV4cG9y dC1lLXRleGluZm8KICA6dHlwZSAnKHN0cmluZyA6dGFnICJUZXhpbmZvIGNsYXNzIikpCgooZGVm Y3VzdG9tIG9yZy1lLXRleGluZm8tY2xhc3NlcwogICcoKCJpbmZvIgogICAgICJcXGlucHV0IHRl eGluZm8gICAgQGMgLSotIHRleGluZm8gLSotIgogICAgICgiQGNoYXB0ZXIgJXMiIC4gIkB1bm51 bWJlcmVkICVzIikKICAgICAoIkBzZWN0aW9uICVzIiAuICJAdW5udW1iZXJlZHNlYyAlcyIpCiAg ICAgKCJAc3Vic2VjdGlvbiAlcyIgLiAiQHVubnVtYmVyZWRzdWJzZWMgJXMiKQogICAgICgiQHN1 YnN1YnNlY3Rpb24gJXMiIC4gIkB1bm51bWJlcmVkc3Vic3Vic2VjICVzIikpKQogICJBbGlzdCBv ZiBUZXhpbmZvIGNsYXNzZXMgYW5kIGFzc29jaWF0ZWQgaGVhZGVyIGFuZCBzdHJ1Y3R1cmUuCklm ICMrVGV4aW5mb19DTEFTUyBpcyBzZXQgaW4gdGhlIGJ1ZmZlciwgdXNlIGl0cyB2YWx1ZSBhbmQg dGhlCmFzc29jaWF0ZWQgaW5mb3JtYXRpb24uICBIZXJlIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgZWFj aCBjZWxsOgoKICBcKGNsYXNzLW5hbWUKICAgIGhlYWRlci1zdHJpbmcKICAgIFwobnVtYmVyZWQt c2VjdGlvbiAuIHVubnVtYmVyZWQtc2VjdGlvblwpCiAgICAuLi5cKQoKVGhlIHNlY3Rpb25pbmcg c3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIHNlY3Rpb25pbmcgc3RydWN0 dXJlIG9mIHRoZSBjbGFzcyBpcyBnaXZlbiBieSB0aGUgZWxlbWVudHMKZm9sbG93aW5nIHRoZSBo ZWFkZXIgc3RyaW5nLiAgRm9yIGVhY2ggc2VjdGlvbmluZyBsZXZlbCwgYSBudW1iZXIKb2Ygc3Ry aW5ncyBpcyBzcGVjaWZpZWQuICBBICVzIGZvcm1hdHRlciBpcyBtYW5kYXRvcnkgaW4gZWFjaApz ZWN0aW9uIHN0cmluZyBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGl0bGUgb2YgdGhlIHNl Y3Rpb24uCgpJbnN0ZWFkIG9mIGEgbGlzdCBvZiBzZWN0aW9uaW5nIGNvbW1hbmRzLCB5b3UgY2Fu IGFsc28gc3BlY2lmeQphIGZ1bmN0aW9uIG5hbWUuICBUaGF0IGZ1bmN0aW9uIHdpbGwgYmUgY2Fs bGVkIHdpdGggdHdvCnBhcmFtZXRlcnMsIHRoZSBcKHJlZHVjZWQpIGxldmVsIG9mIHRoZSBoZWFk bGluZSwgYW5kIGEgcHJlZGljYXRlCm5vbi1uaWwgd2hlbiB0aGUgaGVhZGxpbmUgc2hvdWxkIGJl IG51bWJlcmVkLiAgSXQgbXVzdCByZXR1cm4KYSBmb3JtYXQgc3RyaW5nIGluIHdoaWNoIHRoZSBz ZWN0aW9uIHRpdGxlIHdpbGwgYmUgYWRkZWQuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRleGlu Zm8KICA6dHlwZSAnKHJlcGVhdAoJICAobGlzdCAoc3RyaW5nIDp0YWcgIlRleGluZm8gY2xhc3Mi KQoJCShzdHJpbmcgOnRhZyAiVGV4aW5mbyBoZWFkZXIiKQoJCShyZXBlYXQgOnRhZyAiTGV2ZWxz IiA6aW5saW5lIHQKCQkJKGNob2ljZQoJCQkgKGNvbnMgOnRhZyAiSGVhZGluZyIKCQkJICAgICAg IChzdHJpbmcgOnRhZyAiICBudW1iZXJlZCIpCgkJCSAgICAgICAoc3RyaW5nIDp0YWcgInVubnVt YmVyZWQiKSkKCQkJIChmdW5jdGlvbiA6dGFnICJIb29rIGNvbXB1dGluZyBzZWN0aW9uaW5nIikp KSkpKQoKCjs7OzsgSGVhZGxpbmUKCihkZWZjdXN0b20gb3JnLWUtdGV4aW5mby1mb3JtYXQtaGVh ZGxpbmUtZnVuY3Rpb24gbmlsCiAgIkZ1bmN0aW9uIHRvIGZvcm1hdCBoZWFkbGluZSB0ZXh0LgoK VGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIDUgYXJndW1lbnRzOgpUT0RPICAgICAg dGhlIHRvZG8ga2V5d29yZCAoc3RyaW5nIG9yIG5pbCkuClRPRE8tVFlQRSB0aGUgdHlwZSBvZiB0 b2RvIChzeW1ib2w6IGB0b2RvJywgYGRvbmUnLCBuaWwpClBSSU9SSVRZICB0aGUgcHJpb3JpdHkg b2YgdGhlIGhlYWRsaW5lIChpbnRlZ2VyIG9yIG5pbCkKVEVYVCAgICAgIHRoZSBtYWluIGhlYWRs aW5lIHRleHQgKHN0cmluZykuClRBR1MgICAgICB0aGUgdGFncyBhcyBhIGxpc3Qgb2Ygc3RyaW5n cyAobGlzdCBvZiBzdHJpbmdzIG9yIG5pbCkuCgpUaGUgZnVuY3Rpb24gcmVzdWx0IHdpbGwgYmUg dXNlZCBpbiB0aGUgc2VjdGlvbiBmb3JtYXQgc3RyaW5nLgoKQXMgYW4gZXhhbXBsZSwgb25lIGNv dWxkIHNldCB0aGUgdmFyaWFibGUgdG8gdGhlIGZvbGxvd2luZywgaW4Kb3JkZXIgdG8gcmVwcm9k dWNlIHRoZSBkZWZhdWx0IHNldC11cDoKClwoZGVmdW4gb3JnLWUtdGV4aW5mby1mb3JtYXQtaGVh ZGxpbmUgKHRvZG8gdG9kby10eXBlIHByaW9yaXR5IHRleHQgdGFncykKICBcIkRlZmF1bHQgZm9y bWF0IGZ1bmN0aW9uIGZvciBhbiBoZWFkbGluZS5cIgogIFwoY29uY2F0ICh3aGVuIHRvZG8KICAg ICAgICAgICAgXChmb3JtYXQgXCJcXFxcdGV4dGJme1xcXFx0ZXh0c2N7XFxcXHRleHRzZnslc319 fSBcIiB0b2RvKSkKCSAgXCh3aGVuIHByaW9yaXR5CiAgICAgICAgICAgIFwoZm9ybWF0IFwiXFxc XGZyYW1lYm94e1xcXFwjJWN9IFwiIHByaW9yaXR5KSkKCSAgdGV4dAoJICBcKHdoZW4gdGFncwog ICAgICAgICAgICBcKGZvcm1hdCBcIlxcXFxoZmlsbHt9XFxcXHRleHRzY3slc31cIgogICAgICAg ICAgICAgIFwobWFwY29uY2F0ICdpZGVudGl0eSB0YWdzIFwiOlwiKSkpKSIKICA6Z3JvdXAgJ29y Zy1leHBvcnQtZS10ZXhpbmZvCiAgOnR5cGUgJ2Z1bmN0aW9uKQoKCjs7OzsgRm9vdG5vdGVzCjs7 Cjs7IEZvb3Rub3RlcyBhcmUgaW5zZXJ0ZWQgZGlyZWN0bHkKCjs7OzsgVGltZXN0YW1wcwoKKGRl ZmN1c3RvbSBvcmctZS10ZXhpbmZvLWFjdGl2ZS10aW1lc3RhbXAtZm9ybWF0ICJAZW1waHslc30i CiAgIkEgcHJpbnRmIGZvcm1hdCBzdHJpbmcgdG8gYmUgYXBwbGllZCB0byBhY3RpdmUgdGltZXN0 YW1wcy4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdzdHJpbmcpCgoo ZGVmY3VzdG9tIG9yZy1lLXRleGluZm8taW5hY3RpdmUtdGltZXN0YW1wLWZvcm1hdCAiQGVtcGh7 JXN9IgogICJBIHByaW50ZiBmb3JtYXQgc3RyaW5nIHRvIGJlIGFwcGxpZWQgdG8gaW5hY3RpdmUg dGltZXN0YW1wcy4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdzdHJp bmcpCgooZGVmY3VzdG9tIG9yZy1lLXRleGluZm8tZGlhcnktdGltZXN0YW1wLWZvcm1hdCAiQGVt cGh7JXN9IgogICJBIHByaW50ZiBmb3JtYXQgc3RyaW5nIHRvIGJlIGFwcGxpZWQgdG8gZGlhcnkg dGltZXN0YW1wcy4iCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdzdHJp bmcpCgo7Ozs7IExpbmtzCgooZGVmY3VzdG9tIG9yZy1lLXRleGluZm8tbGluay13aXRoLXVua25v d24tcGF0aC1mb3JtYXQgIkBpbmRpY2F0ZXVybHslc30iCiAgIkZvcm1hdCBzdHJpbmcgZm9yIGxp bmtzIHdpdGggdW5rbm93biBwYXRoIHR5cGUuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRleGlu Zm8KICA6dHlwZSAnc3RyaW5nKQoKCjs7OzsgVGFibGVzCgooZGVmY3VzdG9tIG9yZy1lLXRleGlu Zm8tdGFibGVzLXZlcmJhdGltIG5pbAogICJXaGVuIG5vbi1uaWwsIHRhYmxlcyBhcmUgZXhwb3J0 ZWQgdmVyYmF0aW0uIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRleGluZm8KICA6dHlwZSAnYm9v bGVhbikKCihkZWZjdXN0b20gb3JnLWUtdGV4aW5mby10YWJsZS1zY2llbnRpZmljLW5vdGF0aW9u ICIlc1xcLCglcykiCiAgIkZvcm1hdCBzdHJpbmcgdG8gZGlzcGxheSBudW1iZXJzIGluIHNjaWVu dGlmaWMgbm90YXRpb24uClRoZSBmb3JtYXQgc2hvdWxkIGhhdmUgXCIlc1wiIHR3aWNlLCBmb3Ig bWFudGlzc2EgYW5kIGV4cG9uZW50ClwoaS5lLiBcIiVzXFxcXHRpbWVzMTBeeyVzfVwiKS4KCldo ZW4gbmlsLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBtYWRlLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQt ZS10ZXhpbmZvCiAgOnR5cGUgJyhjaG9pY2UKCSAgKHN0cmluZyA6dGFnICJGb3JtYXQgc3RyaW5n IikKCSAgKGNvbnN0IDp0YWcgIk5vIGZvcm1hdHRpbmciKSkpCgooZGVmY3VzdG9tIG9yZy1lLXRl eGluZm8tZGVmLXRhYmxlLW1hcmt1cCAiQHNhbXAiCiAgIkRlZmF1bHQgc2V0dGluZyBmb3IgQHRh YmxlIGVudmlyb25tZW50cy4iKQoKOzs7OyBUZXh0IG1hcmt1cAoKKGRlZmN1c3RvbSBvcmctZS10 ZXhpbmZvLXRleHQtbWFya3VwLWFsaXN0ICcoKGJvbGQgLiAiQHN0cm9uZ3slc30iKQoJCQkJCSAg IChjb2RlIC4gY29kZSkKCQkJCQkgICAoaXRhbGljIC4gIkBlbXBoeyVzfSIpCgkJCQkJICAgKHZl cmJhdGltIC4gdmVyYikKCQkJCQkgICAoY29tbWVudCAuICJAYyAlcyIpKQogICJBbGlzdCBvZiBU ZXhpbmZvIGV4cHJlc3Npb25zIHRvIGNvbnZlcnQgdGV4dCBtYXJrdXAuCgpUaGUga2V5IG11c3Qg YmUgYSBzeW1ib2wgYW1vbmcgYGJvbGQnLCBgaXRhbGljJyBhbmQgYGNvbW1lbnQnLgpUaGUgdmFs dWUgaXMgYSBmb3JtYXR0aW5nIHN0cmluZyB0byB3cmFwIGZvbnRpZmllZCB0ZXh0IHdpdGguCgpW YWx1ZSBjYW4gYWxzbyBiZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBzeW1ib2xzOiBgdmVyYicgYW5k CmBjb2RlJy4gIEZvciB0aGUgZm9ybWVyLCBPcmcgd2lsbCB1c2UgXCJAdmVyYlwiIHRvCmNyZWF0 ZSBhIGZvcm1hdCBzdHJpbmcgYW5kIHNlbGVjdCBhIGRlbGltaXRlciBjaGFyYWN0ZXIgdGhhdApp c24ndCBpbiB0aGUgc3RyaW5nLiAgRm9yIHRoZSBsYXR0ZXIsIE9yZyB3aWxsIHVzZSBcIkBjb2Rl XCIKdG8gdHlwZXNldCBhbmQgdHJ5IHRvIHByb3RlY3Qgc3BlY2lhbCBjaGFyYWN0ZXJzLgoKSWYg bm8gYXNzb2NpYXRpb24gY2FuIGJlIGZvdW5kIGZvciBhIGdpdmVuIG1hcmt1cCwgdGV4dCB3aWxs IGJlCnJldHVybmVkIGFzLWlzLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZS10ZXhpbmZvCiAgOnR5 cGUgJ2FsaXN0CiAgOm9wdGlvbnMgJyhib2xkIGNvZGUgaXRhbGljIHZlcmJhdGltIGNvbW1lbnQp KQoKCjs7OzsgRHJhd2VycwoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWZvcm1hdC1kcmF3ZXIt ZnVuY3Rpb24gbmlsCiAgIkZ1bmN0aW9uIGNhbGxlZCB0byBmb3JtYXQgYSBkcmF3ZXIgaW4gVGV4 aW5mbyBjb2RlLgoKVGhlIGZ1bmN0aW9uIG11c3QgYWNjZXB0IHR3byBwYXJhbWV0ZXJzOgogIE5B TUUgICAgICB0aGUgZHJhd2VyIG5hbWUsIGxpa2UgXCJMT0dCT09LXCIKICBDT05URU5UUyAgdGhl IGNvbnRlbnRzIG9mIHRoZSBkcmF3ZXIuCgpUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUg c3RyaW5nIHRvIGJlIGV4cG9ydGVkLgoKRm9yIGV4YW1wbGUsIHRoZSB2YXJpYWJsZSBjb3VsZCBi ZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbgppbiBvcmRlciB0byBtaW1pYyBkZWZhdWx0 IGJlaGF2aW91cjoKClwoZGVmdW4gb3JnLWUtdGV4aW5mby1mb3JtYXQtZHJhd2VyLWRlZmF1bHQg XChuYW1lIGNvbnRlbnRzXCkKICBcIkZvcm1hdCBhIGRyYXdlciBlbGVtZW50IGZvciBUZXhpbmZv IGV4cG9ydC5cIgogIGNvbnRlbnRzXCkiCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwog IDp0eXBlICdmdW5jdGlvbikKCgo7Ozs7IElubGluZXRhc2tzCgooZGVmY3VzdG9tIG9yZy1lLXRl eGluZm8tZm9ybWF0LWlubGluZXRhc2stZnVuY3Rpb24gbmlsCiAgIkZ1bmN0aW9uIGNhbGxlZCB0 byBmb3JtYXQgYW4gaW5saW5ldGFzayBpbiBUZXhpbmZvIGNvZGUuCgpUaGUgZnVuY3Rpb24gbXVz dCBhY2NlcHQgc2l4IHBhcmFtZXRlcnM6CiAgVE9ETyAgICAgIHRoZSB0b2RvIGtleXdvcmQsIGFz IGEgc3RyaW5nCiAgVE9ETy1UWVBFIHRoZSB0b2RvIHR5cGUsIGEgc3ltYm9sIGFtb25nIGB0b2Rv JywgYGRvbmUnIGFuZCBuaWwuCiAgUFJJT1JJVFkgIHRoZSBpbmxpbmV0YXNrIHByaW9yaXR5LCBh cyBhIHN0cmluZwogIE5BTUUgICAgICB0aGUgaW5saW5ldGFzayBuYW1lLCBhcyBhIHN0cmluZy4K ICBUQUdTICAgICAgdGhlIGlubGluZXRhc2sgdGFncywgYXMgYSBsaXN0IG9mIHN0cmluZ3MuCiAg Q09OVEVOVFMgIHRoZSBjb250ZW50cyBvZiB0aGUgaW5saW5ldGFzaywgYXMgYSBzdHJpbmcuCgpU aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc3RyaW5nIHRvIGJlIGV4cG9ydGVkLgoKRm9y IGV4YW1wbGUsIHRoZSB2YXJpYWJsZSBjb3VsZCBiZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBmdW5j dGlvbgppbiBvcmRlciB0byBtaW1pYyBkZWZhdWx0IGJlaGF2aW91cjoKClwoZGVmdW4gb3JnLWUt dGV4aW5mby1mb3JtYXQtaW5saW5ldGFzayBcKHRvZG8gdHlwZSBwcmlvcml0eSBuYW1lIHRhZ3Mg Y29udGVudHNcKQpcIkZvcm1hdCBhbiBpbmxpbmUgdGFzayBlbGVtZW50IGZvciBUZXhpbmZvIGV4 cG9ydC5cIgogIFwobGV0ICgoZnVsbC10aXRsZQoJIFwoY29uY2F0CgkgIFwod2hlbiB0b2RvCiAg ICAgICAgICAgIFwoZm9ybWF0IFwiQHN0cm9uZ3slc30gXCIgdG9kbykpCgkgIFwod2hlbiBwcmlv cml0eSAoZm9ybWF0IFwiIyVjIFwiIHByaW9yaXR5KSkKCSAgdGl0bGUKCSAgXCh3aGVuIHRhZ3MK ICAgICAgICAgICAgXChmb3JtYXQgXCI6JXM6XCIKICAgICAgICAgICAgICAgICAgICBcKG1hcGNv bmNhdCAnaWRlbnRpdHkgdGFncyBcIjpcIikpKSkpCiAgICBcKGZvcm1hdCAoY29uY2F0IFwiQGNl bnRlciAlc1xuXG5cIgoJCSAgICBcIiVzXCIKICAgICAgICAgICAgICAgICAgICBcIlxuXCIpKQoJ ICAgIGZ1bGwtdGl0bGUgY29udGVudHMpKSIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZS10ZXhpbmZv CiAgOnR5cGUgJ2Z1bmN0aW9uKQoKCjs7OzsgU3JjIGJsb2Nrcwo7Owo7OyBTcmMgQmxvY2tzIGFy ZSBleGFtcGxlIGJsb2NrcywgZXhjZXB0IGZvciBMSVNQCgo7Ozs7IFBsYWluIHRleHQKCihkZWZj dXN0b20gb3JnLWUtdGV4aW5mby1xdW90ZXMKICAnKCgicXVvdGVzIgogICAgICgiXFwoXFxzLVxc fFtbKF1cXHxeXFwpXCIiIC4gImBgIikKICAgICAoIlxcKFxcUy1cXClcIiIgLiAiJyciKQogICAg ICgiXFwoXFxzLVxcfChcXHxeXFwpJyIgLiAiYCIpKSkKICAiQWxpc3QgZm9yIHF1b3RlcyB0byB1 c2Ugd2hlbiBjb252ZXJ0aW5nIGVuZ2xpc2ggZG91YmxlLXF1b3Rlcy4KClRoZSBDQVIgb2YgZWFj aCBpdGVtIGluIHRoaXMgYWxpc3QgaXMgdGhlIGxhbmd1YWdlIGNvZGUuClRoZSBDRFIgb2YgZWFj aCBpdGVtIGluIHRoaXMgYWxpc3QgaXMgYSBsaXN0IG9mIHRocmVlIENPTlM6Ci0gdGhlIGZpcnN0 IENPTlMgZGVmaW5lcyB0aGUgb3BlbmluZyBxdW90ZTsKLSB0aGUgc2Vjb25kIENPTlMgZGVmaW5l cyB0aGUgY2xvc2luZyBxdW90ZTsKLSB0aGUgbGFzdCBDT05TIGRlZmluZXMgc2luZ2xlIHF1b3Rl cy4KCkZvciBlYWNoIGl0ZW0gaW4gYSBDT05TLCB0aGUgZmlyc3Qgc3RyaW5nIGlzIGEgcmVnZXhw CmZvciBhbGxvd2VkIGNoYXJhY3RlcnMgYmVmb3JlL2FmdGVyIHRoZSBxdW90ZSwgdGhlIHNlY29u ZApzdHJpbmcgZGVmaW5lcyB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGZvciB0aGlzIHF1b3RlLiIK ICA6Z3JvdXAgJ29yZy1leHBvcnQtZS10ZXhpbmZvCiAgOnR5cGUgJyhsaXN0CgkgIChjb25zIDp0 YWcgIk9wZW5pbmcgcXVvdGUiCgkJKHN0cmluZyA6dGFnICJSZWdleHAgZm9yIGNoYXIgYmVmb3Jl IikKCQkoc3RyaW5nIDp0YWcgIlJlcGxhY2VtZW50IHF1b3RlICAgICAiKSkKCSAgKGNvbnMgOnRh ZyAiQ2xvc2luZyBxdW90ZSIKCQkoc3RyaW5nIDp0YWcgIlJlZ2V4cCBmb3IgY2hhciBhZnRlciAi KQoJCShzdHJpbmcgOnRhZyAiUmVwbGFjZW1lbnQgcXVvdGUgICAgICIpKQoJICAoY29ucyA6dGFn ICJTaW5nbGUgcXVvdGUiCgkJKHN0cmluZyA6dGFnICJSZWdleHAgZm9yIGNoYXIgYmVmb3JlIikK CQkoc3RyaW5nIDp0YWcgIlJlcGxhY2VtZW50IHF1b3RlICAgICAiKSkpKQoKCjs7OzsgQ29tcGls YXRpb24KCihkZWZjdXN0b20gb3JnLWUtdGV4aW5mby1pbmZvLXByb2Nlc3MKICAnKCJtYWtlaW5m byAlZiIpCiAgIkNvbW1hbmRzIHRvIHByb2Nlc3MgYSB0ZXhpbmZvIGZpbGUgdG8gYW4gSU5GTyBm aWxlLgpUaGlzIGlzIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaCBvZiB0aGVtIHdpbGwgYmUgZ2l2ZW4g dG8gdGhlIHNoZWxsCmFzIGEgY29tbWFuZC4gICVmIGluIHRoZSBjb21tYW5kIHdpbGwgYmUgcmVw bGFjZWQgYnkgdGhlIGZ1bGwKZmlsZSBuYW1lLCAlYiBieSB0aGUgZmlsZSBiYXNlIG5hbWUgXChp LmUgd2l0aG91dCBleHRlbnNpb24pIGFuZAolbyBieSB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhl IGZpbGUuIgogIDpncm91cCAnb3JnLWV4cG9ydC10ZXhpbmZvCiAgOnR5cGUgJyhyZXBlYXQgOnRh ZyAiU2hlbGwgY29tbWFuZCBzZXF1ZW5jZSIKCQkgKHN0cmluZyA6dGFnICJTaGVsbCBjb21tYW5k IikpKQoKDAo7OzsgSW50ZXJuYWwgRnVuY3Rpb25zCgooZGVmdW4gb3JnLWUtdGV4aW5mby1maWx0 ZXItc2VjdGlvbi1ibGFuay1saW5lcyAoaGVhZGxpbmUgYmFjay1lbmQgaW5mbykKICAiRmlsdGVy IGNvbnRyb2xsaW5nIG51bWJlciBvZiBibGFuayBsaW5lcyBhZnRlciBhIHNlY3Rpb24uIgogIChp ZiAobm90IChlcSBiYWNrLWVuZCAnZS10ZXhpbmZvKSkgaGVhZGxpbmUKICAgIChsZXQgKChibGFu a3MgKG1ha2Utc3RyaW5nIDIgP1xuKSkpCiAgICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcg IlxuXFwoPzpcblsgXHRdKlxcKSpcXCciIGJsYW5rcyBoZWFkbGluZSkpKSkKCihkZWZ1biBvcmct ZS10ZXhpbmZvLS1maW5kLWNvcHlpbmcgKGluZm8pCiAgIlJldHJpZXZlIHRoZSBoZWFkbGluZSBp ZGVudGlmaWVkIGJ5IHRoZSBwcm9wZXJ0eSA6Y29weWluZzouCgpJTkZPIGlzIHRoZSBwbGlzdCBj b250YWluaW5nIHRoZSBleHBvcnQgb3B0aW9ucyBhbmQgdHJlZS4gIEl0IGlzCnVzZWQgdG8gZmlu ZCBhbmQgZXh0cmFjdCB0aGUgc2luZ2xlIGRlc2lyZWQgaGVhZGxpbmUuICBUaGlzCmNhbm5vdCBi ZSB0cmVhdGVkIGFzIGEgc3RhbmRhcmQgaGVhZGxpbmUgc2luY2UgaXQgbXVzdCBiZQppbnNlcnRl ZCBpbiBhIHNwZWNpZmljIGxvY2F0aW9uLiIKICAobGV0IChjb3B5aW5nKQogICAgKG9yZy1lbGVt ZW50LW1hcCAocGxpc3QtZ2V0IGluZm8gOnBhcnNlLXRyZWUpICdoZWFkbGluZQoJCSAgICAgKGxh bWJkYSAoY29weSkKCQkgICAgICAgKHdoZW4gKG9yZy1lbGVtZW50LXByb3BlcnR5IDpjb3B5aW5n IGNvcHkpCgkJCSAocHVzaCBjb3B5IGNvcHlpbmcpKSkgaW5mbyAndCkKICAgIDs7IFJldHJpZXZl IHRoZSBzaW5nbGUgZW50cnkKICAgIChjYXIgY29weWluZykpKQoKKGRlZnVuIG9yZy1lLXRleGlu Zm8tLWZpbmQtdmVyYi1zZXBhcmF0b3IgKHMpCiAgIlJldHVybiBhIGNoYXJhY3RlciBub3QgdXNl ZCBpbiBzdHJpbmcgUy4KVGhpcyBpcyB1c2VkIHRvIGNob29zZSBhIHNlcGFyYXRvciBmb3IgY29u c3RydWN0cyBsaWtlIFxcdmVyYi4iCiAgKGxldCAoKGxsICJ+LC4vPzsnOlwifCFAIyVeJi1fPSth YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaPD4oKVtd e30iKSkKICAgIChsb29wIGZvciBjIGFjcm9zcyBsbAoJICB3aGVuIChub3QgKHN0cmluZy1tYXRj aCAocmVnZXhwLXF1b3RlIChjaGFyLXRvLXN0cmluZyBjKSkgcykpCgkgIHJldHVybiAoY2hhci10 by1zdHJpbmcgYykpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1tYWtlLW9wdGlvbi1zdHJpbmcg KG9wdGlvbnMpCiAgIlJldHVybiBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5d29yZHMg YW5kIHZhbHVlcy4KT1BUSU9OUyBpcyBhbiBhbGlzdCB3aGVyZSB0aGUga2V5IGlzIHRoZSBvcHRp b25zIGtleXdvcmQgYXMKYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgYSBsaXN0IGNvbnRhaW5pbmcg dGhlIGtleXdvcmQgdmFsdWUsIG9yCm5pbC4iCiAgKG1hcGNvbmNhdCAobGFtYmRhIChwYWlyKQoJ ICAgICAgIChjb25jYXQgKGZpcnN0IHBhaXIpCgkJICAgICAgICh3aGVuICg+IChsZW5ndGggKHNl Y29uZCBwYWlyKSkgMCkKCQkJIChjb25jYXQgIj0iIChzZWNvbmQgcGFpcikpKSkpCgkgICAgIG9w dGlvbnMKCSAgICAgIiwiKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1xdW90YXRpb24tbWFya3Mg KHRleHQgaW5mbykKICAiRXhwb3J0IHF1b3RhdGlvbiBtYXJrcyB1c2luZyBgIGFuZCAnIGFzIHRo ZSBtYXJrZXJzLgpURVhUIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgcXVvdGF0aW9uIG1hcmtzIHRv IGJlIHJlcGxhY2VkLiAgSU5GTwppcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNo YW5uZWwuIgogIChtYXBjIChsYW1iZGEobCkKCSAgKGxldCAoKHN0YXJ0IDApKQoJICAgICh3aGls ZSAoc2V0cSBzdGFydCAoc3RyaW5nLW1hdGNoIChjYXIgbCkgdGV4dCBzdGFydCkpCgkgICAgICAo bGV0ICgobmV3LXF1b3RlIChjb25jYXQgKG1hdGNoLXN0cmluZyAxIHRleHQpIChjZHIgbCkpKSkK CQkoc2V0cSB0ZXh0IChyZXBsYWNlLW1hdGNoIG5ldy1xdW90ZSAgdCB0IHRleHQpKSkpKSkKCShj ZHIgb3JnLWUtdGV4aW5mby1xdW90ZXMpKQogIHRleHQpCgooZGVmdW4gb3JnLWUtdGV4aW5mby0t dGV4dC1tYXJrdXAgKHRleHQgbWFya3VwKQogICJGb3JtYXQgVEVYVCBkZXBlbmRpbmcgb24gTUFS S1VQIHRleHQgbWFya3VwLgpTZWUgYG9yZy1lLXRleGluZm8tdGV4dC1tYXJrdXAtYWxpc3QnIGZv ciBkZXRhaWxzLiIKICAobGV0ICgoZm10IChjZHIgKGFzc3EgbWFya3VwIG9yZy1lLXRleGluZm8t dGV4dC1tYXJrdXAtYWxpc3QpKSkpCiAgICAoY29uZAogICAgIDs7IE5vIGZvcm1hdCBzdHJpbmc6 IFJldHVybiByYXcgdGV4dC4KICAgICAoKG5vdCBmbXQpIHRleHQpCiAgICAgKChlcSAndmVyYiBm bXQpCiAgICAgIChsZXQgKChzZXBhcmF0b3IgKG9yZy1lLXRleGluZm8tLWZpbmQtdmVyYi1zZXBh cmF0b3IgdGV4dCkpKQoJKGNvbmNhdCAiQHZlcmJ7IiBzZXBhcmF0b3IgdGV4dCBzZXBhcmF0b3Ig In0iKSkpCiAgICAgKChlcSAnY29kZSBmbXQpCiAgICAgIChsZXQgKChzdGFydCAwKQoJICAgIChy dG4gIiIpCgkgICAgY2hhcikKCSh3aGlsZSAoc3RyaW5nLW1hdGNoICJbQHt9XSIgdGV4dCkKCSAg KHNldHEgY2hhciAobWF0Y2gtc3RyaW5nIDAgdGV4dCkpCgkgIChpZiAoPiAobWF0Y2gtYmVnaW5u aW5nIDApIDApCgkgICAgICAoc2V0cSBydG4gKGNvbmNhdCBydG4gKHN1YnN0cmluZyB0ZXh0IDAg KG1hdGNoLWJlZ2lubmluZyAwKSkpKSkKCSAgKHNldHEgdGV4dCAoc3Vic3RyaW5nIHRleHQgKDEr IChtYXRjaC1iZWdpbm5pbmcgMCkpKSkKCSAgKHNldHEgY2hhciAoY29uY2F0ICJAIiBjaGFyKQoJ CXJ0biAoY29uY2F0IHJ0biBjaGFyKSkpCgkoc2V0cSB0ZXh0IChjb25jYXQgcnRuIHRleHQpCgkg ICAgICBmbXQgIkBjb2RleyVzfSIpCgkoZm9ybWF0IGZtdCB0ZXh0KSkpCiAgICAgOzsgRWxzZSB1 c2UgZm9ybWF0IHN0cmluZy4KICAgICAodCAoZm9ybWF0IGZtdCB0ZXh0KSkpKSkKCjs7OzsgTWVu dSBjcmVhdGlvbgoKKGRlZnVuIG9yZy1lLXRleGluZm8tLWJ1aWxkLW1lbnUgKHRyZWUgbGV2ZWwg aW5mbyAmb3B0aW9uYWwgZGV0YWlsZWQpCiAgIkNyZWF0ZSB0aGUgQG1lbnUvQGVuZCBtZW51IGlu Zm9ybWF0aW9uIGZyb20gVFJFRSBhdCBoZWFkbGluZQpsZXZlbCBMRVZFTC4KClRSRUUgY29udGFp bnMgdGhlIHBhcnNlLXRyZWUgdG8gd29yayB3aXRoLCBlaXRoZXIgb2YgdGhlIGVudGlyZQpkb2N1 bWVudCBvciBvZiBhIHNwZWNpZmljIHBhcmVudCBoZWFkbGluZS4gIExFVkVMIGluZGljYXRlcyB3 aGF0CmxldmVsIG9mIGhlYWRsaW5lcyB0byBsb29rIGF0IHdoZW4gZ2VuZXJhdGluZyB0aGUgbWVu dS4gIElORk8gaXMKYSBwbGlzdCBjb250YWluaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCgpE ZXRhaWxlZCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYnVpbGQgYSBzaW5nbGUgbGV2ZWwgb2YgbWVu dSwgb3IKcmVjdXJzZSBpbnRvIGFsbCBjaGlsZHJlbiBhcyB3ZWxsLiIKICAobGV0ICgobWVudSAo b3JnLWUtdGV4aW5mby0tZ2VuZXJhdGUtbWVudS1saXN0IHRyZWUgbGV2ZWwgaW5mbykpCglvdXRw dXQgdGV4dC1tZW51KQogICAgKGNvbmQKICAgICAoZGV0YWlsZWQKICAgICAgOzsgTG9vcGluZyBp cyBkb25lIHdpdGhpbiB0aGUgbWVudSBnZW5lcmF0aW9uLgogICAgICAoc2V0cSB0ZXh0LW1lbnUg KG9yZy1lLXRleGluZm8tLWdlbmVyYXRlLWRldGFpbGVkIG1lbnUgbGV2ZWwgaW5mbykpKQogICAg ICh0CiAgICAgIChzZXRxIHRleHQtbWVudSAob3JnLWUtdGV4aW5mby0tZ2VuZXJhdGUtbWVudS1p dGVtcyBtZW51IGluZm8pKSkpCiAgICAod2hlbiB0ZXh0LW1lbnUKICAgICAgKHNldHEgb3V0cHV0 IChvcmctZS10ZXhpbmZvLS1mb3JtYXQtbWVudSB0ZXh0LW1lbnUpKQogICAgICAobWFwY29uY2F0 ICdpZGVudGl0eSBvdXRwdXQgIlxuIikpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1nZW5lcmF0 ZS1kZXRhaWxlZCAobWVudSBsZXZlbCBpbmZvKQogICJHZW5lcmF0ZSBhIGRldGFpbGVkIGxpc3Rp bmcgb2YgYWxsIHN1YmhlYWRpbmdzIHdpdGhpbiBNRU5VIHN0YXJ0aW5nIGF0IExFVkVMLgoKTUVO VSBpcyB0aGUgcGFyc2UtdHJlZSB0byB3b3JrIHdpdGguICBMRVZFTCBpcyB0aGUgc3RhcnRpbmcg bGV2ZWwKZm9yIHRoZSBtZW51IGhlYWRsaW5lcyBhbmQgZnJvbSB3aGljaCByZWN1cnNpb24gb2Nj dXJzLiAgSU5GTyBpcwphIHBsaXN0IGNvbnRhaW5pbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4i CiAgKGxldCAoKG1heC1kZXB0aCAocGxpc3QtZ2V0IGluZm8gOmhlYWRsaW5lLWxldmVscykpKQog ICAgKHdoZW4gKD4gbWF4LWRlcHRoIGxldmVsKQogICAgICAobG9vcCBmb3IgaGVhZGxpbmUgaW4g bWVudSBhcHBlbmQKCSAgICAobGV0KiAoKHRpdGxlIChvcmctZS10ZXhpbmZvLS1tZW51LWhlYWRs aW5lcyBoZWFkbGluZSBpbmZvKSkKCQkgICA7OyBDcmVhdGUgbGlzdCBvZiBtZW51IGVudHJpZXMg Zm9yIHRoZSBuZXh0IGxldmVsCgkJICAgKHN1Ymxpc3QgKG9yZy1lLXRleGluZm8tLWdlbmVyYXRl LW1lbnUtbGlzdAoJCQkgICAgIGhlYWRsaW5lICgxKyBsZXZlbCkgaW5mbykpCgkJICAgOzsgR2Vu ZXJhdGUgdGhlIG1lbnUgaXRlbXMgZm9yIHRoYXQgbGV2ZWwuICBJZgoJCSAgIDs7IHRoZXJlIGFy ZSBub25lIG9taXQgdGhhdCBoZWFkaW5nIGNvbXBsZXRlbHksCgkJICAgOzsgb3RoZXJ3aXNlIGpv aW4gdGhlIHRpdGxlIHRvIGl0J3MgcmVsYXRlZCBlbnRyaWVzLgoJCSAgIChzdWJtZW51IChpZiAo b3JnLWUtdGV4aW5mby0tZ2VuZXJhdGUtbWVudS1pdGVtcyBzdWJsaXN0IGluZm8pCgkJCQkoYXBw ZW5kIChsaXN0IHRpdGxlKQoJCQkJCShvcmctZS10ZXhpbmZvLS1nZW5lcmF0ZS1tZW51LWl0ZW1z IHN1Ymxpc3QgaW5mbykpCgkJCSAgICAgICduaWwpKQoJCSAgIDs7IFN0YXJ0IHRoZSBwcm9jZXNz IG92ZXIgdGhlIG5leHQgbGV2ZWwgZG93bi4KCQkgICAocmVjdXJzaW9uIChvcmctZS10ZXhpbmZv LS1nZW5lcmF0ZS1kZXRhaWxlZCBzdWJsaXN0ICgxKyBsZXZlbCkgaW5mbykpKQoJICAgICAgKHNl dHEgcmVjdXJzaW9uIChhcHBlbmQgc3VibWVudSByZWN1cnNpb24pKQoJICAgICAgcmVjdXJzaW9u KSkpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1nZW5lcmF0ZS1tZW51LWxpc3QgKHRyZWUgbGV2 ZWwgaW5mbykKICAiR2VuZXJhdGUgdGhlIGxpc3Qgb2YgaGVhZGxpbmVzIHRoYXQgYXJlIHdpdGhp biBhIGdpdmVuIGxldmVsCm9mIHRoZSB0cmVlIGZvciBmdXJ0aGVyIGZvcm1hdHRpbmcuCgpUUkVF IGlzIHRoZSBwYXJzZS10cmVlIGNvbnRhaW5pbmcgdGhlIGhlYWRsaW5lcy4gIExFVkVMIGlzIHRo ZQpoZWFkbGluZSBsZXZlbCB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YuICBJTkZPIGlzIGEgcGxpc3Qg aG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAobGV0IChzZXEpCiAgICAob3JnLWVs ZW1lbnQtbWFwCiAgICAgdHJlZSAnaGVhZGxpbmUKICAgICAobGFtYmRhIChoZWFkKQogICAgICAg KHdoZW4gKG9yZy1lbGVtZW50LXByb3BlcnR5IDpsZXZlbCBoZWFkKQoJIChpZiAoYW5kIChlcSBs ZXZlbCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxldmVsIGhlYWQpKQoJCSAgOzsgRG8gbm90IHRh a2Ugbm90ZSBvZiBmb290bm90ZXMgb3IgY29weWluZyBoZWFkbGluZXMKCQkgIChub3QgKG9yZy1l bGVtZW50LXByb3BlcnR5IDpjb3B5aW5nIGhlYWQpKQoJCSAgKG5vdCAob3JnLWVsZW1lbnQtcHJv cGVydHkgOmZvb3Rub3RlLXNlY3Rpb24tcCBoZWFkKSkpCgkgICAgIChwdXNoIGhlYWQgc2VxKSkp KSkKICAgIDs7IFJldHVybiB0aGUgbGlzdCBvZiBoZWFkbGluZXMgKHJldmVyc2UgdG8gaGF2ZSBp biBhY3R1YWwgb3JkZXIpCiAgICAocmV2ZXJzZSBzZXEpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZv LS1nZW5lcmF0ZS1tZW51LWl0ZW1zIChpdGVtcyBpbmZvKQogICJHZW5lcmF0ZSBhIGxpc3Qgb2Yg aGVhZGxpbmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlzdGluZyBJVEVNUy4KCklURU1TIGlzIGEg bGlzdCBvZiB0aGUgaGVhZGxpbmVzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGVudHJpZXMuCklORk8g aXMgYSBwbGlzdCBjb250YWluaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCgpSZXR1cm5zIGEg bGlzdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gZnJvbSBlYWNoCmhlYWRs aW5lOiBsZW5ndGgsIHRpdGxlLCBkZXNjcmlwdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBmb3JtYXQg dGhlCm1lbnUgdXNpbmcgYG9yZy1lLXRleGluZm8tLWZvcm1hdC1tZW51Jy4iCiAgKGxvb3AgZm9y IGhlYWRsaW5lIGluIGl0ZW1zIGNvbGxlY3QKCShsZXQqICgodGl0bGUgKG9yZy1leHBvcnQtZGF0 YQoJCSAgICAgICAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpdGxlIGhlYWRsaW5lKSBpbmZvKSkK CSAgICAgICAoZGVzY3IgKG9yZy1leHBvcnQtZGF0YQoJCSAgICAgICAob3JnLWVsZW1lbnQtcHJv cGVydHkgOmRlc2NyaXB0aW9uIGhlYWRsaW5lKSBpbmZvKSkKCSAgICAgICAobGVuIChsZW5ndGgg dGl0bGUpKQoJICAgICAgIChvdXRwdXQgKGxpc3QgbGVuIHRpdGxlIGRlc2NyKSkpCgkgIG91dHB1 dCkpKQoKKGRlZnVuIG9yZy1lLXRleGluZm8tLW1lbnUtaGVhZGxpbmVzIChoZWFkbGluZSBpbmZv KQogICJSZXRyaWV2ZSB0aGUgdGl0bGUgZnJvbSBIRUFETElORS4KCklORk8gaXMgYSBwbGlzdCBo b2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCgpSZXR1cm4gdGhlIGhlYWRsaW5lIGFzIGEg bGlzdCBvZiAobGVuZ3RoIHRpdGxlIGRlc2NyaXB0aW9uKSB3aXRoCmxlbmd0aCBvZiAtMSBhbmQg bmlsIGRlc2NyaXB0aW9uLiAgVGhpcyBpcyB1c2VkIGluCmBvcmctZS10ZXhpbmZvLS1mb3JtYXQt bWVudScgdG8gaWRlbnRpZnkgaGVhZGxpbmVzIGFzIG9wcG9zZWQgdG8KZW50cmllcy4iCiAgKGxl dCAoKHRpdGxlIChvcmctZXhwb3J0LWRhdGEKCQkob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpdGxl IGhlYWRsaW5lKSBpbmZvKSkpCiAgICAobGlzdCAtMSB0aXRsZSAnbmlsKSkpCgooZGVmdW4gb3Jn LWUtdGV4aW5mby0tZm9ybWF0LW1lbnUgKHRleHQtbWVudSkKICAiRm9ybWF0IHRoZSBURVhULU1F TlUgaXRlbXMgdG8gYmUgcHJvcGVybHkgcHJpbnRlZCBpbiB0aGUgbWVudS4KCkVhY2ggZW50cnkg aW4gdGhlIG1lbnUgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIChsZW5ndGggdGl0bGUKZGVzY3JpcHRp b24pLgoKSGVhZGxpbmVzIGluIHRoZSBkZXRhaWxlZCBtZW51IGFyZSBnaXZlbiBsZW5ndGggLTEg dG8gZW5zdXJlIHRoZXkKYXJlIG5ldmVyIGNvbmZ1c2VkIHdpdGggb3RoZXIgZW50cmllcy4gIFRo ZXkgYWxzbyBoYXZlIG5vCmRlc2NyaXB0aW9uLgoKT3RoZXIgbWVudSBpdGVtcyBhcmUgb3V0cHV0 IGFzOgogICAgVGl0bGU6OiAgICAgZGVzY3JpcHRpb24KCldpdGggdGhlIHNwYWNpbmcgYmV0d2Vl biA6OiBhbmQgZGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIGxlbmd0aApvZiB0aGUgbG9uZ2VzdCBt ZW51IGVudHJ5LiIKCiAgKGxldCogKChsZW5ndGhzIChtYXBjYXIgJ2NhciB0ZXh0LW1lbnUpKQog ICAgICAgICAobWF4LWxlbmd0aCAoYXBwbHkgJ21heCBsZW5ndGhzKSkKCSBvdXRwdXQpCiAgICAo c2V0cSBvdXRwdXQKICAgICAgICAgIChtYXBjYXIgKGxhbWJkYSAobmFtZSkKICAgICAgICAgICAg ICAgICAgICAobGV0KiAoKHRpdGxlIChudGggMSBuYW1lKSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGRlc2MgKG50aCAyIG5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGVu Z3RoIChudGggMCBuYW1lKSkpCiAgICAgICAgICAgICAgICAgICAgICAoaWYgKD4gbGVuZ3RoIC0x KQogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgIiogIiB0aXRsZSAiOjogIgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ha2Utc3RyaW5nCgkJCQkgICAoLSAoKyAz IG1heC1sZW5ndGgpIGxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA/XHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgZGVz YwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgZGVzYykpKQog ICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJcbiIgdGl0bGUgIlxuIikpKSkKCQkgIHRl eHQtbWVudSkpCiAgICBvdXRwdXQpKQoKCgo7OzsgVGVtcGxhdGUKCihkZWZ1biBvcmctZS10ZXhp bmZvLXRlbXBsYXRlIChjb250ZW50cyBpbmZvKQogICJSZXR1cm4gY29tcGxldGUgZG9jdW1lbnQg c3RyaW5nIGFmdGVyIFRleGluZm8gY29udmVyc2lvbi4KQ09OVEVOVFMgaXMgdGhlIHRyYW5zY29k ZWQgY29udGVudHMgc3RyaW5nLiAgSU5GTyBpcyBhIHBsaXN0CmhvbGRpbmcgZXhwb3J0IG9wdGlv bnMuIgogIChsZXQqICgodGl0bGUgKG9yZy1leHBvcnQtZGF0YSAocGxpc3QtZ2V0IGluZm8gOnRp dGxlKSBpbmZvKSkKCSAoaW5mby1maWxlbmFtZSAob3IgKHBsaXN0LWdldCBpbmZvIDp0ZXhpbmZv LWZpbGVuYW1lKQoJCQkgICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkKCQkJICAgICAob3JnLWV4 cG9ydC1vdXRwdXQtZmlsZS1uYW1lICIuaW5mbyIpKSkpCgkgKGF1dGhvciAob3JnLWV4cG9ydC1k YXRhIChwbGlzdC1nZXQgaW5mbyA6YXV0aG9yKSBpbmZvKSkKCSAodGV4aW5mby1oZWFkZXIgKHBs aXN0LWdldCBpbmZvIDp0ZXhpbmZvLWhlYWRlcikpCgkgKHN1YnRpdGxlIChwbGlzdC1nZXQgaW5m byA6c3VidGl0bGUpKQoJIChzdWJhdXRob3IgKHBsaXN0LWdldCBpbmZvIDpzdWJhdXRob3IpKQoJ IChjbGFzcyAocGxpc3QtZ2V0IGluZm8gOnRleGluZm8tY2xhc3MpKQoJIChoZWFkZXIgKG50aCAx IChhc3NvYyBjbGFzcyBvcmctZS10ZXhpbmZvLWNsYXNzZXMpKSkKCSAoY29weWluZyAob3JnLWUt dGV4aW5mby0tZmluZC1jb3B5aW5nIGluZm8pKQoJIChkaXJjYXQgKHBsaXN0LWdldCBpbmZvIDp0 ZXhpbmZvLWRpcmNhdCkpCgkgKGRpcnRpdGxlIChwbGlzdC1nZXQgaW5mbyA6dGV4aW5mby1kaXJ0 aXRsZSkpCgkgKGRpcmRlc2MgKHBsaXN0LWdldCBpbmZvIDp0ZXhpbmZvLWRpcmRlc2MpKQoJIDs7 IFNwYWNpbmcgdG8gYWxpZ24gZGVzY3JpcHRpb24gKGNvbHVtbiAzMiAtIDMgZm9yIGAqICcgYW5k CgkgOzsgYC4nIGluIHRleHQuCgkgKGRpcnNwYWNpbmcgKC0gMjkgKGxlbmd0aCBkaXJ0aXRsZSkp KSkKICAgIChjb25jYXQKICAgICA7OyBIZWFkZXIKICAgICBoZWFkZXIgIlxuIgogICAgICJAYyAl KipzdGFydCBvZiBoZWFkZXJcbiIKICAgICA7OyBGaWxlbmFtZSBhbmQgVGl0bGUKICAgICAiQHNl dGZpbGVuYW1lICIgaW5mby1maWxlbmFtZSAiXG4iCiAgICAgIkBzZXR0aXRsZSAiIHRpdGxlICJc biIKICAgICAiXG5cbiIKICAgICAiQGMgVmVyc2lvbiBhbmQgQ29udGFjdCBJbmZvXG4iCiAgICAg IkBzZXQgQVVUSE9SICIgYXV0aG9yICJcbiIKCiAgICAgOzsgQWRkaXRpb25hbCBIZWFkZXIgT3B0 aW9ucyBzZXQgYnkgYCMrVEVYSU5GT19IRUFERVIKICAgICAoaWYgdGV4aW5mby1oZWFkZXIKCSAo Y29uY2F0ICJcbiIKCQkgdGV4aW5mby1oZWFkZXIKCQkgIlxuIikpCiAgICAgCiAgICAgIkBjICUq KmVuZCBvZiBoZWFkZXJcbiIKICAgICAiQGZpbmFsb3V0XG4iCiAgICAgIlxuXG4iCgogICAgIDs7 IENvcHlpbmcKICAgICAiQGNvcHlpbmdcbiIKICAgICA7OyBPbmx5IGV4cG9ydCB0aGUgY29udGVu dCBvZiB0aGUgaGVhZGxpbmUsIGRvIG5vdCBuZWVkIHRoZQogICAgIDs7IGluaXRpYWwgaGVhZGxp bmUuCiAgICAgKG9yZy1leHBvcnQtZGF0YSAobnRoIDIgY29weWluZykgaW5mbykKICAgICAiQGVu ZCBjb3B5aW5nXG4iCiAgICAgIlxuXG4iCgogICAgIDs7IEluZm8gZGlyZWN0b3J5IGluZm9ybWF0 aW9uCiAgICAgOzsgT25seSBzdXBwbHkgaWYgYm90aCB0aXRsZSBhbmQgY2F0ZWdvcnkgYXJlIHBy b3ZpZGVkCiAgICAgKGlmIChhbmQgZGlyY2F0IGRpcnRpdGxlKQoJIChjb25jYXQgIkBkaXJjYXRl Z29yeSAiIGRpcmNhdCAiXG4iCgkJICJAZGlyZW50cnlcbiIKCQkgIiogIiBkaXJ0aXRsZSAiLiIK CQkgKG1ha2Utc3RyaW5nIGRpcnNwYWNpbmcgP1xzKQoJCSBkaXJkZXNjICJcbiIKCQkgIkBlbmQg ZGlyZW50cnlcbiIpKQogICAgICJcblxuIgoKICAgICA7OyBUaXRsZQogICAgICJAdGl0bGVwYWdl XG4iCiAgICAgIkB0aXRsZSAiIHRpdGxlICJcblxuIgogICAgIChpZiBzdWJ0aXRsZQoJIChjb25j YXQgIkBzdWJ0aXRsZSAiIHN1YnRpdGxlICJcbiIpKQogICAgICJAYXV0aG9yICIgYXV0aG9yICJc biIKICAgICAoaWYgc3ViYXV0aG9yCgkgKGNvbmNhdCBzdWJhdXRob3IgIlxuIikpCiAgICAgIlxu IgogICAgICJAYyBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcyBzdGFydCB0aGUgY29weXJpZ2h0 IHBhZ2UuXG4iCiAgICAgIkBwYWdlXG4iCiAgICAgIkB2c2tpcCAwcHQgcGx1cyAxZmlsbGxcbiIK ICAgICAiQGluc2VydGNvcHlpbmdcbiIKICAgICAiQGVuZCB0aXRsZXBhZ2VcblxuIgogICAgICJA YyBPdXRwdXQgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIGF0IHRoZSBiZWdpbm5pbmcuXG4iCiAgICAg IkBjb250ZW50c1xuXG4iCgogICAgIDs7IENvbmZpZ3VyZSBUb3AgTm9kZSB3aGVuIG5vdCBmb3Ig VGV4CiAgICAgIkBpZm5vdHRleFxuIgogICAgICJAbm9kZSBUb3BcbiIKICAgICAiQHRvcCAiIHRp dGxlICIgTWFudWFsXG4iCiAgICAgIkBpbnNlcnRjb3B5aW5nXG4iCiAgICAgIkBlbmQgaWZub3R0 ZXhcblxuIgogICAgIAogICAgIDs7IE1lbnUKICAgICAiQG1lbnVcbiIKICAgICAob3JnLWUtdGV4 aW5mby1tYWtlLW1lbnUgaW5mbyAnbWFpbikKICAgICAiXG5cbiIKICAgICA7OyBEZXRhaWxlZCBN ZW51CiAgICAgIkBkZXRhaWxtZW51XG4iCiAgICAgIiAtLS0gVGhlIERldGFpbGVkIE5vZGUgTGlz dGluZyAtLS1cbiIKICAgICAob3JnLWUtdGV4aW5mby1tYWtlLW1lbnUgaW5mbyAnZGV0YWlsZWQp CiAgICAgIlxuXG4iCiAgICAgIkBlbmQgZGV0YWlsbWVudVxuIgogICAgICJAZW5kIG1lbnVcbiIK ICAgICAiXG5cbiIKICAgICAKICAgICA7OyBEb2N1bWVudCdzIGJvZHkuCiAgICAgY29udGVudHMK ICAgICAiXG4iCiAgICAgOzsgQ3JlYXRvci4KICAgICAobGV0ICgoY3JlYXRvci1pbmZvIChwbGlz dC1nZXQgaW5mbyA6d2l0aC1jcmVhdG9yKSkpCiAgICAgICAoY29uZAoJKChub3QgY3JlYXRvci1p bmZvKSAiIikKCSgoZXEgY3JlYXRvci1pbmZvICdjb21tZW50KQoJIChmb3JtYXQgIkBjICVzXG4i IChwbGlzdC1nZXQgaW5mbyA6Y3JlYXRvcikpKQoJKHQgKGNvbmNhdCAocGxpc3QtZ2V0IGluZm8g OmNyZWF0b3IpICJcbiIpKSkpCiAgICAgOzsgRG9jdW1lbnQgZW5kLgogICAgICJcbkBieWUiKSkp CgoKDAo7OzsgVHJhbnNjb2RlIEZ1bmN0aW9ucwoKOzs7OyBCYWJlbCBDYWxsCjs7Cjs7IEJhYmVs IENhbGxzIGFyZSBpZ25vcmVkLgoKCjs7OzsgQm9sZAoKKGRlZnVuIG9yZy1lLXRleGluZm8tYm9s ZCAoYm9sZCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgQk9MRCBmcm9tIE9yZyB0byBUZXhp bmZvLgpDT05URU5UUyBpcyB0aGUgdGV4dCB3aXRoIGJvbGQgbWFya3VwLiAgSU5GTyBpcyBhIHBs aXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKG9yZy1lLXRleGluZm8tLXRl eHQtbWFya3VwIGNvbnRlbnRzICdib2xkKSkKCgo7Ozs7IENlbnRlciBCbG9jawo7Owo7OyBDZW50 ZXIgYmxvY2tzIGFyZSBpZ25vcmVkCgoKOzs7OyBDbG9jawoKKGRlZnVuIG9yZy1lLXRleGluZm8t Y2xvY2sgKGNsb2NrIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIENMT0NLIGVsZW1lbnQg ZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhv bGRpbmcgY29udGV4dHVhbAppbmZvcm1hdGlvbi4iCiAgKGNvbmNhdAogICAiQG5vaW5kZW50Igog ICAoZm9ybWF0ICJAc3Ryb25neyVzfSAiIG9yZy1jbG9jay1zdHJpbmcpCiAgIChmb3JtYXQgb3Jn LWUtdGV4aW5mby1pbmFjdGl2ZS10aW1lc3RhbXAtZm9ybWF0CgkgICAoY29uY2F0IChvcmctdHJh bnNsYXRlLXRpbWUgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBjbG9jaykpCgkJICAgKGxl dCAoKHRpbWUgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0aW1lIGNsb2NrKSkpCgkJICAgICAoYW5k IHRpbWUgKGZvcm1hdCAiICglcykiIHRpbWUpKSkpKQogICAiQCoiKSkKCgo7Ozs7IENvZGUKCihk ZWZ1biBvcmctZS10ZXhpbmZvLWNvZGUgKGNvZGUgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2Rl IGEgQ09ERSBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5G TyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uCmNoYW5uZWwuIgogIChvcmctZS10 ZXhpbmZvLS10ZXh0LW1hcmt1cCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGNvZGUpICdj b2RlKSkKCjs7OzsgQ29tbWVudAoKKGRlZnVuIG9yZy1lLXRleGluZm8tY29tbWVudCAoY29tbWVu dCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBDT01NRU5UIG9iamVjdCBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgdGV4dCBpbiB0aGUgY29tbWVudC4gIElORk8gaXMg YSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIChvcmctZS10ZXhpbmZv LS10ZXh0LW1hcmt1cCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGNvbW1lbnQpICdjb21t ZW50KSkKCjs7OzsgQ29tbWVudCBCbG9jawoKKGRlZnVuIG9yZy1lLXRleGluZm8tY29tbWVudC1i bG9jayAoY29tbWVudC1ibG9jayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBDT01NRU5U LUJMT0NLIG9iamVjdCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgdGV4dCB3 aXRoaW4gdGhlIGJsb2NrLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZv cm1hdGlvbi4iCiAgKGZvcm1hdCAiQGlnbm9yZVxuJXNAZW5kIGlnbm9yZSIgKG9yZy1lbGVtZW50 LXByb3BlcnR5IDp2YWx1ZSBjb21tZW50LWJsb2NrKSkpCgo7Ozs7IERyYXdlcgoKKGRlZnVuIG9y Zy1lLXRleGluZm8tZHJhd2VyIChkcmF3ZXIgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEg RFJBV0VSIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaG9sZHMgdGhlIGNv bnRlbnRzIG9mIHRoZSBibG9jay4gIElORk8gaXMgYSBwbGlzdApob2xkaW5nIGNvbnRleHR1YWwg aW5mb3JtYXRpb24uIgogIChsZXQqICgobmFtZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmRyYXdl ci1uYW1lIGRyYXdlcikpCgkgKG91dHB1dCAoaWYgKGZ1bmN0aW9ucCBvcmctZS10ZXhpbmZvLWZv cm1hdC1kcmF3ZXItZnVuY3Rpb24pCgkJICAgICAoZnVuY2FsbCBvcmctZS10ZXhpbmZvLWZvcm1h dC1kcmF3ZXItZnVuY3Rpb24KCQkJICAgICAgbmFtZSBjb250ZW50cykKCQkgICA7OyBJZiB0aGVy ZSdzIG5vIHVzZXIgZGVmaW5lZCBmdW5jdGlvbjogc2ltcGx5CgkJICAgOzsgZGlzcGxheSBjb250 ZW50cyBvZiB0aGUgZHJhd2VyLgoJCSAgIGNvbnRlbnRzKSkpCiAgICBvdXRwdXQpKQoKCjs7Ozsg RHluYW1pYyBCbG9jawoKKGRlZnVuIG9yZy1lLXRleGluZm8tZHluYW1pYy1ibG9jayAoZHluYW1p Yy1ibG9jayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBEWU5BTUlDLUJMT0NLIGVsZW1l bnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIHRo ZSBibG9jay4gIElORk8gaXMgYSBwbGlzdApob2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24u ICBTZWUgYG9yZy1leHBvcnQtZGF0YScuIgogIGNvbnRlbnRzKQoKCjs7OzsgRW50aXR5CgooZGVm dW4gb3JnLWUtdGV4aW5mby1lbnRpdHkgKGVudGl0eSBjb250ZW50cyBpbmZvKQogICJUcmFuc2Nv ZGUgYW4gRU5USVRZIG9iamVjdCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBhcmUgdGhl IGRlZmluaXRpb24gaXRzZWxmLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBp bmZvcm1hdGlvbi4iCiAgKGxldCAoKGVudCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxhdGV4IGVu dGl0eSkpKQogICAgKGlmIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6bGF0ZXgtbWF0aC1wIGVudGl0 eSkgKGZvcm1hdCAiQG1hdGh7JXN9IiBlbnQpIGVudCkpKQoKCjs7OzsgRXhhbXBsZSBCbG9jawoK KGRlZnVuIG9yZy1lLXRleGluZm8tZXhhbXBsZS1ibG9jayAoZXhhbXBsZS1ibG9jayBjb250ZW50 cyBpbmZvKQogICJUcmFuc2NvZGUgYW4gRVhBTVBMRS1CTE9DSyBlbGVtZW50IGZyb20gT3JnIHRv IFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNvbnRl eHR1YWwKaW5mb3JtYXRpb24uIgogIChmb3JtYXQgIkB2ZXJiYXRpbVxuJXNAZW5kIHZlcmJhdGlt IgoJICAob3JnLWV4cG9ydC1mb3JtYXQtY29kZS1kZWZhdWx0IGV4YW1wbGUtYmxvY2sgaW5mbykp KQoKCjs7OzsgRXhwb3J0IEJsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1leHBvcnQtYmxvY2sg KGV4cG9ydC1ibG9jayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBFWFBPUlQtQkxPQ0sg ZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEg cGxpc3QgaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAod2hlbiAoc3RyaW5nPSAo b3JnLWVsZW1lbnQtcHJvcGVydHkgOnR5cGUgZXhwb3J0LWJsb2NrKSAiVEVYSU5GTyIpCiAgICAo b3JnLXJlbW92ZS1pbmRlbnRhdGlvbiAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGV4cG9y dC1ibG9jaykpKSkKCgo7Ozs7IEV4cG9ydCBTbmlwcGV0CgooZGVmdW4gb3JnLWUtdGV4aW5mby1l eHBvcnQtc25pcHBldCAoZXhwb3J0LXNuaXBwZXQgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2Rl IGEgRVhQT1JULVNOSVBQRVQgb2JqZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlz IG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgog ICh3aGVuIChlcSAob3JnLWV4cG9ydC1zbmlwcGV0LWJhY2tlbmQgZXhwb3J0LXNuaXBwZXQpICdl LXRleGluZm8pCiAgICAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGV4cG9ydC1zbmlwcGV0 KSkpCgoKOzs7OyBGaXhlZCBXaWR0aAoKKGRlZnVuIG9yZy1lLXRleGluZm8tZml4ZWQtd2lkdGgg KGZpeGVkLXdpZHRoIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIEZJWEVELVdJRFRIIGVs ZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBs aXN0IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGZvcm1hdCAiQGV4YW1wbGVc biVzXG5AZW5kIGV4YW1wbGUiCgkgIChvcmctcmVtb3ZlLWluZGVudGF0aW9uCgkgICAob3JnLWVs ZW1lbnQtcHJvcGVydHkgOnZhbHVlIGZpeGVkLXdpZHRoKSkpKQoKCjs7OzsgRm9vdG5vdGUgRGVm aW5pdGlvbgo7Owo7OyBGb290bm90ZSBEZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KCgo7Ozs7IEZv b3Rub3RlIFJlZmVyZW5jZQo7OwoKKGRlZnVuIG9yZy1lLXRleGluZm8tZm9vdG5vdGUtcmVmZXJl bmNlIChmb290bm90ZSBjb250ZW50cyBpbmZvKQogICJDcmVhdGUgYSBmb290bm90ZSByZWZlcmVu Y2UgZm9yIEZPT1ROT1RFLgoKRk9PVE5PVEUgaXMgdGhlIGZvb3Rub3RlIHRvIGRlZmluZS4gIENP TlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYQpwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwgaW5mb3Jt YXRpb24uIgogIChsZXQgKChkZWYgKG9yZy1leHBvcnQtZ2V0LWZvb3Rub3RlLWRlZmluaXRpb24g Zm9vdG5vdGUgaW5mbykpKQogICAgKGZvcm1hdCAiQGZvb3Rub3RleyVzfSIKCSAgICAob3JnLXRy aW0gKG9yZy1leHBvcnQtZGF0YSBkZWYgaW5mbykpKSkpCgo7Ozs7IEhlYWRsaW5lCgooZGVmdW4g b3JnLWUtdGV4aW5mby1oZWFkbGluZSAoaGVhZGxpbmUgY29udGVudHMgaW5mbykKICAiVHJhbnNj b2RlIGFuIEhFQURMSU5FIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaG9s ZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkbGluZS4gIElORk8gaXMgYSBwbGlzdApob2xkaW5n IGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIChsZXQqICgoY2xhc3MgKHBsaXN0LWdldCBpbmZv IDp0ZXhpbmZvLWNsYXNzKSkKCSAobGV2ZWwgKG9yZy1leHBvcnQtZ2V0LXJlbGF0aXZlLWxldmVs IGhlYWRsaW5lIGluZm8pKQoJIChudW1iZXJlZHAgKG9yZy1leHBvcnQtbnVtYmVyZWQtaGVhZGxp bmUtcCBoZWFkbGluZSBpbmZvKSkKCSAoY2xhc3Mtc2VjdGlvbm5pbmcgKGFzc29jIGNsYXNzIG9y Zy1lLXRleGluZm8tY2xhc3NlcykpCgkgOzsgRmluZCB0aGUgaW5kZXggdHlwZSwgaWYgYW55Cgkg KGluZGV4IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6aW5kZXggaGVhZGxpbmUpKQoJIDs7IENyZWF0 ZSBub2RlIGluZm8sIHRvIGluc2VydCBpdCBiZWZvcmUgc2VjdGlvbiBmb3JtYXR0aW5nLgoJIChu b2RlIChmb3JtYXQgIkBub2RlICVzXG4iCgkJICAgICAgIChvcmctZXhwb3J0LWRhdGEKCQkJKG9y Zy1lbGVtZW50LXByb3BlcnR5IDp0aXRsZSBoZWFkbGluZSkgaW5mbykpKQoJIDs7IE1lbnVzIG11 c3QgYmUgZ2VuZXJhdGVkIHdpdGggZmlyc3QgY2hpbGQsIG90aGVyd2lzZSB0aGV5CgkgOzsgd2ls bCBub3QgbmVzdCBwcm9wZXJseQoJIChtZW51IChsZXQqICgoZmlyc3QgKG9yZy1leHBvcnQtZmly c3Qtc2libGluZy1wIGhlYWRsaW5lIGluZm8pKQoJCSAgICAgIChwYXJlbnQgKG9yZy1leHBvcnQt Z2V0LXBhcmVudC1oZWFkbGluZSBoZWFkbGluZSkpCgkJICAgICAgKHRpdGxlIChvcmctZXhwb3J0 LWRhdGEKCQkJICAgICAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0aXRsZSBwYXJlbnQpIGluZm8p KQoJCSAgICAgIGhlYWRpbmcgbGlzdGluZwoJCSAgICAgICh0cmVlIChwbGlzdC1nZXQgaW5mbyA6 cGFyc2UtdHJlZSkpKQoJCSAoaWYgZmlyc3QKCQkgICAgIChvcmctZWxlbWVudC1tYXAKCQkgICAg ICAocGxpc3QtZ2V0IGluZm8gOnBhcnNlLXRyZWUpICdoZWFkbGluZQoJCSAgICAgIChsYW1iZGEg KHJlZikKCQkJKGlmIChtZW1iZXIgdGl0bGUgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0aXRsZSBy ZWYpKQoJCQkgICAgKHB1c2ggcmVmIGhlYWRpbmcpKSkKCQkgICAgICBpbmZvICd0KSkKCQkgKHNl dHEgbGlzdGluZyAob3JnLWUtdGV4aW5mby0tYnVpbGQtbWVudQoJCQkJKGNhciBoZWFkaW5nKSBs ZXZlbCBpbmZvKSkKCSAJIChpZiBsaXN0aW5nCgkgCSAgICAgKHNldHEgbGlzdGluZyAoZm9ybWF0 CgkJCQkgICAgIlxuQG1lbnVcbiVzXG5AZW5kIG1lbnVcblxuIiBsaXN0aW5nKSkKCSAJICAgJ25p bCkpKQoJIDs7IFNlY3Rpb24gZm9ybWF0dGluZyB3aWxsIHNldCB0d28gcGxhY2Vob2xkZXJzOiBv bmUgZm9yIHRoZQoJIDs7IHRpdGxlIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBjb250ZW50cy4KCSAo c2VjdGlvbi1mbXQKCSAgKGxldCAoKHNlYyAoaWYgKGFuZCAoc3ltYm9scCAobnRoIDIgY2xhc3Mt c2VjdGlvbm5pbmcpKQoJCQkgICAgICAoZmJvdW5kcCAobnRoIDIgY2xhc3Mtc2VjdGlvbm5pbmcp KSkKCQkJIChmdW5jYWxsIChudGggMiBjbGFzcy1zZWN0aW9ubmluZykgbGV2ZWwgbnVtYmVyZWRw KQoJCSAgICAgICAobnRoICgxKyBsZXZlbCkgY2xhc3Mtc2VjdGlvbm5pbmcpKSkpCgkgICAgKGNv bmQKCSAgICAgOzsgTm8gc2VjdGlvbiBhdmFpbGFibGUgZm9yIHRoYXQgTEVWRUwuCgkgICAgICgo bm90IHNlYykgbmlsKQoJICAgICA7OyBTZWN0aW9uIGZvcm1hdCBkaXJlY3RseSByZXR1cm5lZCBi eSBhIGZ1bmN0aW9uLgoJICAgICAoKHN0cmluZ3Agc2VjKSBzZWMpCgkgICAgIDs7IChudW1iZXJl ZC1zZWN0aW9uIC4gdW5udW1iZXJlZC1zZWN0aW9uKQoJICAgICAoKG5vdCAoY29uc3AgKGNkciBz ZWMpKSkKCSAgICAgIDs7IElmIGFuIGluZGV4LCBhbHdheXMgdW5udW1iZXJlZAoJICAgICAgKGlm IGluZGV4CgkJICAoY29uY2F0IG1lbnUgbm9kZSAoY2RyIHNlYykgIlxuJXMiKQoJCTs7IE90aGVy d2lzZSBudW1iZXIgYXMgbmVlZGVkLgoJCShjb25jYXQgbWVudSBub2RlCgkJCShmdW5jYWxsCgkJ CSAoaWYgbnVtYmVyZWRwICMnY2FyICMnY2RyKSBzZWMpICJcbiVzIikpKSkpKQoJICh0ZXh0IChv cmctZXhwb3J0LWRhdGEKCQkob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpdGxlIGhlYWRsaW5lKSBp bmZvKSkKCSAodG9kbwoJICAoYW5kIChwbGlzdC1nZXQgaW5mbyA6d2l0aC10b2RvLWtleXdvcmRz KQoJICAgICAgIChsZXQgKCh0b2RvIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dG9kby1rZXl3b3Jk IGhlYWRsaW5lKSkpCgkJIChhbmQgdG9kbyAob3JnLWV4cG9ydC1kYXRhIHRvZG8gaW5mbykpKSkp CgkgKHRvZG8tdHlwZSAoYW5kIHRvZG8gKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0b2RvLXR5cGUg aGVhZGxpbmUpKSkKCSAodGFncyAoYW5kIChwbGlzdC1nZXQgaW5mbyA6d2l0aC10YWdzKQoJCSAg ICAob3JnLWV4cG9ydC1nZXQtdGFncyBoZWFkbGluZSBpbmZvKSkpCgkgKHByaW9yaXR5IChhbmQg KHBsaXN0LWdldCBpbmZvIDp3aXRoLXByaW9yaXR5KQoJCQkob3JnLWVsZW1lbnQtcHJvcGVydHkg OnByaW9yaXR5IGhlYWRsaW5lKSkpCgkgOzsgQ3JlYXRlIHRoZSBoZWFkbGluZSB0ZXh0IGFsb25n IHdpdGggYSBuby10YWcgdmVyc2lvbi4gIFRoZQoJIDs7IGxhdHRlciBpcyByZXF1aXJlZCB0byBy ZW1vdmUgdGFncyBmcm9tIHRhYmxlIG9mIGNvbnRlbnRzLgoJIChmdWxsLXRleHQgKGlmIChmdW5j dGlvbnAgb3JnLWUtdGV4aW5mby1mb3JtYXQtaGVhZGxpbmUtZnVuY3Rpb24pCgkJCTs7IFVzZXIt ZGVmaW5lZCBmb3JtYXR0aW5nIGZ1bmN0aW9uLgoJCQkoZnVuY2FsbCBvcmctZS10ZXhpbmZvLWZv cm1hdC1oZWFkbGluZS1mdW5jdGlvbgoJCQkJIHRvZG8gdG9kby10eXBlIHByaW9yaXR5IHRleHQg dGFncykKCQkgICAgICA7OyBEZWZhdWx0IGZvcm1hdHRpbmcuCgkJICAgICAgKGNvbmNhdAoJCSAg ICAgICAod2hlbiB0b2RvCgkJCSAoZm9ybWF0ICJAc3Ryb25neyVzfSAiIHRvZG8pKQoJCSAgICAg ICAod2hlbiBwcmlvcml0eSAoZm9ybWF0ICJAZW1waHsjJXN9ICIgcHJpb3JpdHkpKQoJCSAgICAg ICB0ZXh0CgkJICAgICAgICh3aGVuIHRhZ3MKCQkJIChmb3JtYXQgIjolczoiCgkJCQkgKG1hcGNv bmNhdCAnaWRlbnRpdHkgdGFncyAiOiIpKSkpKSkKCSAoZnVsbC10ZXh0LW5vLXRhZwoJICAoaWYg KGZ1bmN0aW9ucCBvcmctZS10ZXhpbmZvLWZvcm1hdC1oZWFkbGluZS1mdW5jdGlvbikKCSAgICAg IDs7IFVzZXItZGVmaW5lZCBmb3JtYXR0aW5nIGZ1bmN0aW9uLgoJICAgICAgKGZ1bmNhbGwgb3Jn LWUtdGV4aW5mby1mb3JtYXQtaGVhZGxpbmUtZnVuY3Rpb24KCQkgICAgICAgdG9kbyB0b2RvLXR5 cGUgcHJpb3JpdHkgdGV4dCBuaWwpCgkgICAgOzsgRGVmYXVsdCBmb3JtYXR0aW5nLgoJICAgIChj b25jYXQKCSAgICAgKHdoZW4gdG9kbyAoZm9ybWF0ICJAc3Ryb25neyVzfSAiIHRvZG8pKQoJICAg ICAod2hlbiBwcmlvcml0eSAoZm9ybWF0ICJAZW1waHsjJWN9ICIgcHJpb3JpdHkpKQoJICAgICB0 ZXh0KSkpCgkgKHByZS1ibGFua3MKCSAgKG1ha2Utc3RyaW5nIChvcmctZWxlbWVudC1wcm9wZXJ0 eSA6cHJlLWJsYW5rIGhlYWRsaW5lKSAxMCkpKQogICAgKGNvbmQKICAgICA7OyBDYXNlIDE6IFRo aXMgaXMgYSBmb290bm90ZSBzZWN0aW9uOiBpZ25vcmUgaXQuCiAgICAgKChvcmctZWxlbWVudC1w cm9wZXJ0eSA6Zm9vdG5vdGUtc2VjdGlvbi1wIGhlYWRsaW5lKSBuaWwpCiAgICAgOzsgQ2FzZSAy OiBUaGlzIGlzIHRoZSBgY29weWluZycgc2VjdGlvbjogaWdub3JlIGl0CiAgICAgOzsgICAgICAg ICBUaGlzIGlzIHVzZWQgZWxzZXdoZXJlLgogICAgICgob3JnLWVsZW1lbnQtcHJvcGVydHkgOmNv cHlpbmcgaGVhZGxpbmUpIG5pbCkKICAgICA7OyBDYXNlIDM6IEFuIGluZGV4LiAgSWYgaXQgbWF0 Y2hlcyBvbmUgb2YgdGhlIGtub3duIGluZGV4ZXMsCiAgICAgOzsgICAgICAgICBwcmludCBpdCBh cyBzdWNoIGZvbGxvd2luZyB0aGUgY29udGVudHMsIG90aGVyd2lzZQogICAgIDs7ICAgICAgICAg cHJpbnQgdGhlIGNvbnRlbnRzIGFuZCBsZWF2ZSB0aGUgaW5kZXggdXAgdG8gdGhlIHVzZXIuCiAg ICAgKGluZGV4CiAgICAgIChmb3JtYXQKICAgICAgIHNlY3Rpb24tZm10IGZ1bGwtdGV4dAogICAg ICAgKGNvbmNhdCBwcmUtYmxhbmtzIGNvbnRlbnRzICJcbiIgCgkgICAgICAgKGlmIChtZW1iZXIg aW5kZXggJygiY3AiICJmbiIgImt5IiAicGciICJ0cCIgInZyIikpCgkJICAgKGNvbmNhdCAiQHBy aW50aW5kZXggIiBpbmRleCkpKSkpCiAgICAgOzsgQ2FzZSA0OiBUaGlzIGlzIGEgZGVlcCBzdWIt dHJlZTogZXhwb3J0IGl0IGFzIGEgbGlzdCBpdGVtLgogICAgIDs7ICAgICAgICAgQWxzbyBleHBv cnQgYXMgaXRlbXMgaGVhZGxpbmVzIGZvciB3aGljaCBubyBzZWN0aW9uCiAgICAgOzsgICAgICAg ICBmb3JtYXQgaGFzIGJlZW4gZm91bmQuCiAgICAgKChvciAobm90IHNlY3Rpb24tZm10KSAob3Jn LWV4cG9ydC1sb3ctbGV2ZWwtcCBoZWFkbGluZSBpbmZvKSkKICAgICAgOzsgQnVpbGQgdGhlIHJl YWwgY29udGVudHMgb2YgdGhlIHN1Yi10cmVlLgogICAgICAobGV0ICgobG93LWxldmVsLWJvZHkK CSAgICAgKGNvbmNhdAoJICAgICAgOzsgSWYgdGhlIGhlYWRsaW5lIGlzIHRoZSBmaXJzdCBzaWJs aW5nLCBzdGFydCBhIGxpc3QuCgkgICAgICAod2hlbiAob3JnLWV4cG9ydC1maXJzdC1zaWJsaW5n LXAgaGVhZGxpbmUgaW5mbykKCQkoZm9ybWF0ICJAJXNcbiIgKGlmIG51bWJlcmVkcCAnZW51bWVy YXRlICdpdGVtaXplKSkpCgkgICAgICA7OyBJdGVtaXplIGhlYWRsaW5lCgkgICAgICAiQGl0ZW1c biIgZnVsbC10ZXh0ICJcbiIgcHJlLWJsYW5rcyBjb250ZW50cykpKQoJOzsgSWYgaGVhZGxpbmUg aXMgbm90IHRoZSBsYXN0IHNpYmxpbmcgc2ltcGx5IHJldHVybgoJOzsgTE9XLUxFVkVMLUJPRFku ICBPdGhlcndpc2UsIGFsc28gY2xvc2UgdGhlIGxpc3QsIGJlZm9yZSBhbnkKCTs7IGJsYW5rIGxp bmUuCgkoaWYgKG5vdCAob3JnLWV4cG9ydC1sYXN0LXNpYmxpbmctcCBoZWFkbGluZSBpbmZvKSkg bG93LWxldmVsLWJvZHkKCSAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJICAgIlsgXHRcbl0q XFwnIgoJICAgKGZvcm1hdCAiXG5AZW5kICVzIiAoaWYgbnVtYmVyZWRwICdlbnVtZXJhdGUgJ2l0 ZW1pemUpKQoJICAgbG93LWxldmVsLWJvZHkpKSkpCiAgICAgOzsgQ2FzZSA1OiBTdGFuZGFyZCBo ZWFkbGluZS4gIEV4cG9ydCBpdCBhcyBhIHNlY3Rpb24uCiAgICAgKHQKICAgICAgKGNvbmQKICAg ICAgICgobm90IChhbmQgdGFncyAoZXEgKHBsaXN0LWdldCBpbmZvIDp3aXRoLXRhZ3MpICdub3Qt aW4tdG9jKSkpCgk7OyBSZWd1bGFyIHNlY3Rpb24uICBVc2Ugc3BlY2lmaWVkIGZvcm1hdCBzdHJp bmcuCgkoZm9ybWF0IChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIiVdIiAiJSVdIiBzZWN0aW9u LWZtdCkgZnVsbC10ZXh0CgkJKGNvbmNhdCBwcmUtYmxhbmtzIGNvbnRlbnRzKSkpCiAgICAgICAo KHN0cmluZy1tYXRjaCAiXFxgQFxcKC4qP1xcKXsiIHNlY3Rpb24tZm10KQoJOzsgSWYgdGFncyBz aG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRhYmxlIG9mIGNvbnRlbnRzLCBpbnNlcnQKCTs7IHRpdGxl IHdpdGhvdXQgdGFncyBhcyBhbiBhbHRlcm5hdGl2ZSBoZWFkaW5nIGluIHNlY3Rpb25pbmcKCTs7 IGNvbW1hbmQuCgkoZm9ybWF0IChyZXBsYWNlLW1hdGNoIChjb25jYXQgKG1hdGNoLXN0cmluZyAx IHNlY3Rpb24tZm10KSAiWyVzXSIpCgkJCSAgICAgICBuaWwgbmlsIHNlY3Rpb24tZm10IDEpCgkJ OzsgUmVwbGFjZSBzcXVhcmUgYnJhY2tldHMgd2l0aCBwYXJlbnRoZXNpcyBzaW5jZQoJCTs7IHNx dWFyZSBicmFja2V0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBvcHRpb25hbAoJCTs7IGFyZ3VtZW50 cy4KCQkocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCgkJICJcXFsiICIoIgoJCSAocmVwbGFjZS1y ZWdleHAtaW4tc3RyaW5nCgkJICAiXFxdIiAiKSIKCQkgIGZ1bGwtdGV4dC1uby10YWcpKQoJCWZ1 bGwtdGV4dAoJCShjb25jYXQgcHJlLWJsYW5rcyBjb250ZW50cykpKQogICAgICAgKHQKCTs7IElt cG9zc2libGUgdG8gYWRkIGFuIGFsdGVybmF0aXZlIGhlYWRpbmcuICBGYWxsYmFjayB0bwoJOzsg cmVndWxhciBzZWN0aW9uaW5nIGZvcm1hdCBzdHJpbmcuCgkoZm9ybWF0IChyZXBsYWNlLXJlZ2V4 cC1pbi1zdHJpbmcgIiVdIiAiJSVdIiBzZWN0aW9uLWZtdCkgZnVsbC10ZXh0CgkJKGNvbmNhdCBw cmUtYmxhbmtzIGNvbnRlbnRzKSkpKSkpKSkKCgo7Ozs7IEhvcml6b250YWwgUnVsZQo7Owo7OyBI b3Jpem9udGFsIHJ1bGVzIGFyZSBpZ25vcmVkCgo7Ozs7IElubGluZSBCYWJlbCBDYWxsCjs7Cjs7 IElubGluZSBCYWJlbCBDYWxscyBhcmUgaWdub3JlZC4KCgo7Ozs7IElubGluZSBTcmMgQmxvY2sK CihkZWZ1biBvcmctZS10ZXhpbmZvLWlubGluZS1zcmMtYmxvY2sgKGlubGluZS1zcmMtYmxvY2sg Y29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGFuIElOTElORS1TUkMtQkxPQ0sgZWxlbWVudCBm cm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIGl0 ZW0uICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAo bGV0KiAoKGNvZGUgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBpbmxpbmUtc3JjLWJsb2Nr KSkKCSAoc2VwYXJhdG9yIChvcmctZS10ZXhpbmZvLS1maW5kLXZlcmItc2VwYXJhdG9yIGNvZGUp KSkKICAgIChjb25jYXQgIkB2ZXJieyIgc2VwYXJhdG9yIGNvZGUgc2VwYXJhdG9yICJ9IikpKQoK Cjs7OzsgSW5saW5ldGFzawoKKGRlZnVuIG9yZy1lLXRleGluZm8taW5saW5ldGFzayAoaW5saW5l dGFzayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYW4gSU5MSU5FVEFTSyBlbGVtZW50IGZy b20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgYmxv Y2suICBJTkZPIGlzIGEgcGxpc3QKaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAo bGV0ICgodGl0bGUgKG9yZy1leHBvcnQtZGF0YSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpdGxl IGlubGluZXRhc2spIGluZm8pKQoJKHRvZG8gKGFuZCAocGxpc3QtZ2V0IGluZm8gOndpdGgtdG9k by1rZXl3b3JkcykKCQkgICAobGV0ICgodG9kbyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRvZG8t a2V5d29yZCBpbmxpbmV0YXNrKSkpCgkJICAgICAoYW5kIHRvZG8gKG9yZy1leHBvcnQtZGF0YSB0 b2RvIGluZm8pKSkpKQoJKHRvZG8tdHlwZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRvZG8tdHlw ZSBpbmxpbmV0YXNrKSkKCSh0YWdzIChhbmQgKHBsaXN0LWdldCBpbmZvIDp3aXRoLXRhZ3MpCgkJ ICAgKG9yZy1leHBvcnQtZ2V0LXRhZ3MgaW5saW5ldGFzayBpbmZvKSkpCgkocHJpb3JpdHkgKGFu ZCAocGxpc3QtZ2V0IGluZm8gOndpdGgtcHJpb3JpdHkpCgkJICAgICAgIChvcmctZWxlbWVudC1w cm9wZXJ0eSA6cHJpb3JpdHkgaW5saW5ldGFzaykpKSkKICAgIDs7IElmIGBvcmctZS10ZXhpbmZv LWZvcm1hdC1pbmxpbmV0YXNrLWZ1bmN0aW9uJyBpcyBwcm92aWRlZCwgY2FsbCBpdAogICAgOzsg d2l0aCBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCiAgICAoaWYgKGZ1bmN0aW9ucCBvcmctZS10ZXhp bmZvLWZvcm1hdC1pbmxpbmV0YXNrLWZ1bmN0aW9uKQoJKGZ1bmNhbGwgb3JnLWUtdGV4aW5mby1m b3JtYXQtaW5saW5ldGFzay1mdW5jdGlvbgoJCSB0b2RvIHRvZG8tdHlwZSBwcmlvcml0eSB0aXRs ZSB0YWdzIGNvbnRlbnRzKQogICAgICA7OyBPdGhlcndpc2UsIHVzZSBhIGRlZmF1bHQgdGVtcGxh dGUuCiAgICAgIChsZXQgKChmdWxsLXRpdGxlCgkgICAgIChjb25jYXQKCSAgICAgICh3aGVuIHRv ZG8gKGZvcm1hdCAiQHN0cm9uZ3slc30gIiB0b2RvKSkKCSAgICAgICh3aGVuIHByaW9yaXR5IChm b3JtYXQgIiMlYyAiIHByaW9yaXR5KSkKCSAgICAgIHRpdGxlCgkgICAgICAod2hlbiB0YWdzIChm b3JtYXQgIjolczoiCgkJCQkgKG1hcGNvbmNhdCAnaWRlbnRpdHkgdGFncyAiOiIpKSkpKSkKCShm b3JtYXQgKGNvbmNhdCAiQGNlbnRlciAlc1xuXG4iCgkJCSIlcyIKCQkJIlxuIikKCQlmdWxsLXRp dGxlIGNvbnRlbnRzKSkpKSkKCgo7Ozs7IEl0YWxpYwoKKGRlZnVuIG9yZy1lLXRleGluZm8taXRh bGljIChpdGFsaWMgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIElUQUxJQyBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgdGV4dCB3aXRoIGl0YWxpYyBtYXJrdXAuICBJTkZP IGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAob3JnLWUtdGV4 aW5mby0tdGV4dC1tYXJrdXAgY29udGVudHMgJ2l0YWxpYykpCgo7Ozs7IEl0ZW0KCihkZWZ1biBv cmctZS10ZXhpbmZvLWl0ZW0gKGl0ZW0gY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGFuIElU RU0gZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVu dHMgb2YgdGhlIGl0ZW0uICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9y bWF0aW9uLiIKICAobGV0KiAoKHRhZyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRhZyBpdGVtKSkK CSAoZGVzYyAob3JnLWV4cG9ydC1kYXRhIHRhZyBpbmZvKSkpCiAgIChjb25jYXQgIlxuQGl0ZW0g IiAoaWYgdGFnIGRlc2MpICJcbiIKCSAgIChvcmctdHJpbSBjb250ZW50cykgIlxuIikpKQoKCjs7 OzsgS2V5d29yZAoKKGRlZnVuIG9yZy1lLXRleGluZm8ta2V5d29yZCAoa2V5d29yZCBjb250ZW50 cyBpbmZvKQogICJUcmFuc2NvZGUgYSBLRVlXT1JEIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5m by4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbCBp bmZvcm1hdGlvbi4iCiAgKGxldCAoKGtleSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmtleSBrZXl3 b3JkKSkKCSh2YWx1ZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGtleXdvcmQpKSkKICAg IChjb25kCiAgICAgKChzdHJpbmc9IGtleSAiVEVYSU5GTyIpIHZhbHVlKQogICAgICgoc3RyaW5n PSBrZXkgIkNJTkRFWCIpIChmb3JtYXQgIkBjaW5kZXggJXMiIHZhbHVlKSkKICAgICAoKHN0cmlu Zz0ga2V5ICJGSU5ERVgiKSAoZm9ybWF0ICJAZmluZGV4ICVzIiB2YWx1ZSkpCiAgICAgKChzdHJp bmc9IGtleSAiS0lOREVYIikgKGZvcm1hdCAiQGtpbmRleCAlcyIgdmFsdWUpKQogICAgICgoc3Ry aW5nPSBrZXkgIlBJTkRFWCIpIChmb3JtYXQgIkBwaW5kZXggJXMiIHZhbHVlKSkKICAgICAoKHN0 cmluZz0ga2V5ICJUSU5ERVgiKSAoZm9ybWF0ICJAdGluZGV4ICVzIiB2YWx1ZSkpCiAgICAgKChz dHJpbmc9IGtleSAiVklOREVYIikgKGZvcm1hdCAiQHZpbmRleCAlcyIgdmFsdWUpKQogICAgICkp KQoKCjs7OzsgTGF0ZXggRW52aXJvbm1lbnQKOzsKOzsgTGF0ZXggZW52aXJvbm1lbnRzIGFyZSBp Z25vcmVkCgoKOzs7OyBMYXRleCBGcmFnbWVudAo7Owo7OyBMYXRleCBmcmFnbWVudHMgYXJlIGln bm9yZWQuCgoKOzs7OyBMaW5lIEJyZWFrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1saW5lLWJyZWFr IChsaW5lLWJyZWFrIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIExJTkUtQlJFQUsgb2Jq ZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlz dCBob2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogICJAKiIpCgoKOzs7OyBMaW5rCgoo ZGVmdW4gb3JnLWUtdGV4aW5mby1saW5rIChsaW5rIGRlc2MgaW5mbykKICAiVHJhbnNjb2RlIGEg TElOSyBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KCkRFU0MgaXMgdGhlIGRlc2NyaXB0aW9u IHBhcnQgb2YgdGhlIGxpbmssIG9yIHRoZSBlbXB0eSBzdHJpbmcuCklORk8gaXMgYSBwbGlzdCBo b2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uICBTZWUKYG9yZy1leHBvcnQtZGF0YScuIgog IChsZXQqICgodHlwZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnR5cGUgbGluaykpCgkgKHJhdy1w YXRoIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6cGF0aCBsaW5rKSkKCSA7OyBFbnN1cmUgREVTQyBy ZWFsbHkgZXhpc3RzLCBvciBzZXQgaXQgdG8gbmlsLgoJIChkZXNjIChhbmQgKG5vdCAoc3RyaW5n PSBkZXNjICIiKSkgZGVzYykpCgkgKHBhdGggKGNvbmQKCQkoKG1lbWJlciB0eXBlICcoImh0dHAi ICJodHRwcyIgImZ0cCIpKQoJCSAoY29uY2F0IHR5cGUgIjoiIHJhdy1wYXRoKSkKCQkoKHN0cmlu Zz0gdHlwZSAiZmlsZSIpCgkJICh3aGVuIChzdHJpbmctbWF0Y2ggIlxcKC4rXFwpOjouKyIgcmF3 LXBhdGgpCgkJICAgKHNldHEgcmF3LXBhdGggKG1hdGNoLXN0cmluZyAxIHJhdy1wYXRoKSkpCgkJ IChpZiAoZmlsZS1uYW1lLWFic29sdXRlLXAgcmF3LXBhdGgpCgkJICAgICAoY29uY2F0ICJmaWxl Oi8vIiAoZXhwYW5kLWZpbGUtbmFtZSByYXctcGF0aCkpCgkJICAgKGNvbmNhdCAiZmlsZTovLyIg cmF3LXBhdGgpKSkKCQkodCByYXctcGF0aCkpKQoJIChlbWFpbCAoaWYgKHN0cmluZz0gdHlwZSAi bWFpbHRvIikKCQkgICAgKGxldCAoKHRleHQgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCQkJ ICJAIiAiQEAiIHJhdy1wYXRoKSkpCgkJICAgICAoY29uY2F0IHRleHQgKGlmIGRlc2MgKGNvbmNh dCAiLCIgZGVzYykpKSkpKQoJIHByb3RvY29sKQogICAgKGNvbmQKICAgICA7OyBMaW5rcyBwb2lu dGluZyB0byBhbiBoZWFkbGluZTogRmluZCBkZXN0aW5hdGlvbiBhbmQgYnVpbGQKICAgICA7OyBh cHByb3ByaWF0ZSByZWZlcmVuY2luZyBjb21tYW5kLgogICAgICgobWVtYmVyIHR5cGUgJygiY3Vz dG9tLWlkIiAiaWQiKSkKICAgICAgKGxldCAoKGRlc3RpbmF0aW9uIChvcmctZXhwb3J0LXJlc29s dmUtaWQtbGluayBsaW5rIGluZm8pKSkKCShjYXNlIChvcmctZWxlbWVudC10eXBlIGRlc3RpbmF0 aW9uKQoJICA7OyBJZCBsaW5rIHBvaW50cyB0byBhbiBleHRlcm5hbCBmaWxlLgoJICAocGxhaW4t dGV4dAoJICAgKGlmIGRlc2MgKGZvcm1hdCAiQHVyZWZ7ZmlsZTovLyVzLCVzfSIgZGVzdGluYXRp b24gZGVzYykKCSAgICAgKGZvcm1hdCAiQHVyZWZ7ZmlsZTovLyVzfSIgZGVzdGluYXRpb24pKSkK CSAgOzsgTElOSyBwb2ludHMgdG8gYW4gaGVhZGxpbmUuICBVc2UgdGhlIGhlYWRsaW5lIGFzIHRo ZSBOT0RFIHRhcmdldAoJICAoaGVhZGxpbmUKCSAgIChmb3JtYXQgIkByZWZ7JXN9IgoJCSAgIChv cmctZXhwb3J0LWRhdGEKCQkgICAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0aXRsZSBkZXN0aW5h dGlvbikgaW5mbykpKQoJICAob3RoZXJ3aXNlCgkgICAobGV0ICgocGF0aCAob3JnLWV4cG9ydC1z b2xpZGlmeS1saW5rLXRleHQgcGF0aCkpKQoJICAgICAoaWYgKG5vdCBkZXNjKSAoZm9ybWF0ICJA cmVmeyVzfSIgcGF0aCkKCSAgICAgICAoZm9ybWF0ICJAcmVmeyVzLCwlc30iIHBhdGggZGVzYykp KSkpKSkKICAgICAoKG1lbWJlciB0eXBlICcoImZ1enp5IikpCiAgICAgIChsZXQgKChkZXN0aW5h dGlvbiAob3JnLWV4cG9ydC1yZXNvbHZlLWZ1enp5LWxpbmsgbGluayBpbmZvKSkpCgkoY2FzZSAo b3JnLWVsZW1lbnQtdHlwZSBkZXN0aW5hdGlvbikKCSAgOzsgSWQgbGluayBwb2ludHMgdG8gYW4g ZXh0ZXJuYWwgZmlsZS4KCSAgKHBsYWluLXRleHQKCSAgIChpZiBkZXNjIChmb3JtYXQgIkB1cmVm e2ZpbGU6Ly8lcywlc30iIGRlc3RpbmF0aW9uIGRlc2MpCgkgICAgIChmb3JtYXQgIkB1cmVme2Zp bGU6Ly8lc30iIGRlc3RpbmF0aW9uKSkpCgkgIDs7IExJTksgcG9pbnRzIHRvIGFuIGhlYWRsaW5l LiAgVXNlIHRoZSBoZWFkbGluZSBhcyB0aGUgTk9ERSB0YXJnZXQKCSAgKGhlYWRsaW5lCgkgICAo Zm9ybWF0ICJAcmVmeyVzfSIKCQkgICAob3JnLWV4cG9ydC1kYXRhCgkJICAgIChvcmctZWxlbWVu dC1wcm9wZXJ0eSA6dGl0bGUgZGVzdGluYXRpb24pIGluZm8pKSkKCSAgKG90aGVyd2lzZQoJICAg KGxldCAoKHBhdGggKG9yZy1leHBvcnQtc29saWRpZnktbGluay10ZXh0IHBhdGgpKSkKCSAgICAg KGlmIChub3QgZGVzYykgKGZvcm1hdCAiQHJlZnslc30iIHBhdGgpCgkgICAgICAgKGZvcm1hdCAi QHJlZnslcywsJXN9IiBwYXRoIGRlc2MpKSkpKSkpCiAgICAgOzsgU3BlY2lhbCBjYXNlIGZvciBl bWFpbCBhZGRyZXNzZXMKICAgICAoZW1haWwKICAgICAgKGZvcm1hdCAiQGVtYWlseyVzfSIgZW1h aWwpKQogICAgIDs7IEV4dGVybmFsIGxpbmsgd2l0aCBhIGRlc2NyaXB0aW9uIHBhcnQuCiAgICAg KChhbmQgcGF0aCBkZXNjKSAoZm9ybWF0ICJAdXJlZnslcywlc30iIHBhdGggZGVzYykpCiAgICAg OzsgRXh0ZXJuYWwgbGluayB3aXRob3V0IGEgZGVzY3JpcHRpb24gcGFydC4KICAgICAocGF0aCAo Zm9ybWF0ICJAdXJlZnslc30iIHBhdGgpKQogICAgIDs7IE5vIHBhdGgsIG9ubHkgZGVzY3JpcHRp b24uICBUcnkgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bC4KICAgICAodCAoZm9ybWF0IG9yZy1lLXRl eGluZm8tbGluay13aXRoLXVua25vd24tcGF0aC1mb3JtYXQgZGVzYykpKSkpCgoKOzs7OyBNYWNy bwoKKGRlZnVuIG9yZy1lLXRleGluZm8tbWFjcm8gKG1hY3JvIGNvbnRlbnRzIGluZm8pCiAgIlRy YW5zY29kZSBhIE1BQ1JPIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMg bmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAg OzsgVXNlIGF2YWlsYWJsZSB0b29scy4KICAob3JnLWV4cG9ydC1leHBhbmQtbWFjcm8gbWFjcm8g aW5mbykpCgoKOzs7OyBNZW51CgooZGVmdW4gb3JnLWUtdGV4aW5mby1tYWtlLW1lbnUgKGluZm8g bGV2ZWwpCiAgIkNyZWF0ZSB0aGUgbWVudSBmb3IgaW5jbHVzaW9uIGluIHRoZSB0ZXhpZm8gZG9j dW1lbnQuCgpJTkZPIGlzIHRoZSBwYXJzZWQgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGhlYWRs aW5lcy4gIExFVkVMCmRldGVybWluZXMgd2hldGhlciB0byBtYWtlIHRoZSBtYWluIG1lbnUsIG9y IHRoZSBkZXRhaWxlZCBtZW51LgoKVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhl IHByaW1hcnkgbWVudS4gIEluLU5vZGUgbWVudXMKYXJlIGdlbmVyYXRlZCBkaXJlY3RseS4iCiAg KGxldCogKChwYXJzZSAocGxpc3QtZ2V0IGluZm8gOnBhcnNlLXRyZWUpKQoJIDs7IFRvcCBkZXRl cm1pbmVzIGxldmVsIHRvIGJ1aWxkIG1lbnUgZnJvbSwgaXQgZmluZHMgdGhlCgkgOzsgbGV2ZWwg b2YgdGhlIGZpcnN0IGhlYWRsaW5lIGluIHRoZSBleHBvcnQuCgkgKHRvcCAob3JnLWVsZW1lbnQt bWFwCgkgICAgICAgcGFyc2UgJ2hlYWRsaW5lCgkgICAgICAgKGxhbWJkYSAoaGVhZGxpbmUpCgkJ IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6bGV2ZWwgaGVhZGxpbmUpKSBpbmZvICd0KSkpCiAgICAo Y29uZAogICAgIDs7IEdlbmVyYXRlIHRoZSBtYWluIG1lbnUKICAgICAoKGVxIGxldmVsICdtYWlu KQogICAgICAob3JnLWUtdGV4aW5mby0tYnVpbGQtbWVudSBwYXJzZSB0b3AgaW5mbykpCiAgICAg OzsgR2VuZXJhdGUgdGhlIGRldGFpbGVkIChyZWN1cnNpdmUpIG1lbnUKICAgICAoKGVxIGxldmVs ICdkZXRhaWxlZCkKICAgICAgOzsgUmVxdWlyZXMgcmVjdXJzaW9uCiAgICAgIDs7KG9yZy1lLXRl eGluZm8tLWJ1aWxkLWRldGFpbGVkLW1lbnUgcGFyc2UgdG9wIGluZm8pCiAgICAgIChvciAob3Jn LWUtdGV4aW5mby0tYnVpbGQtbWVudSBwYXJzZSB0b3AgaW5mbyAnZGV0YWlsZWQpCgkgICJkZXRh aWxlZCIpKQogICAgIDs7IE90aGVyd2lzZSBkbyBub3RoaW5nCiAgICAgKHQpKSkpCgoKOzs7OyBQ YXJhZ3JhcGgKCihkZWZ1biBvcmctZS10ZXhpbmZvLXBhcmFncmFwaCAocGFyYWdyYXBoIGNvbnRl bnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIFBBUkFHUkFQSCBlbGVtZW50IGZyb20gT3JnIHRvIFRl eGluZm8uCkNPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyYWdyYXBoLCBhcyBhIHN0 cmluZy4gIElORk8gaXMKdGhlIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwu IgogIGNvbnRlbnRzKQoKCjs7OzsgUGxhaW4gTGlzdAoKKGRlZnVuIG9yZy1lLXRleGluZm8tcGxh aW4tbGlzdCAocGxhaW4tbGlzdCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBQTEFJTi1M SVNUIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRz IG9mIHRoZSBsaXN0LiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZvcm1h dGlvbi4iCiAgKGxldCogKChhdHRyIChvcmctZXhwb3J0LXJlYWQtYXR0cmlidXRlIDphdHRyX3Rl eGluZm8gcGxhaW4tbGlzdCkpCgkgKGluZGljIChvciAocGxpc3QtZ2V0IGF0dHIgOmluZGljKQoJ CSAgICBvcmctZS10ZXhpbmZvLWRlZi10YWJsZS1tYXJrdXApKQoJICh0eXBlIChvcmctZWxlbWVu dC1wcm9wZXJ0eSA6dHlwZSBwbGFpbi1saXN0KSkKCSAodGFibGUtdHlwZSAob3IgKHBsaXN0LWdl dCBhdHRyIDp0YWJsZS10eXBlKQoJCQkgInRhYmxlIikpCgkgOzsgRW5zdXJlIHZhbGlkIHRleGlu Zm8gdGFibGUgdHlwZS4KCSAodGFibGUtdHlwZSAoaWYgKG1lbXEgdGFibGUtdHlwZSAnKCJ0YWJs ZSIgImZ0YWJsZSIgInZ0YWJsZSIpKQoJCQkgdGFibGUtdHlwZQoJCSAgICAgICAidGFibGUiKSkK CSAobGlzdC10eXBlIChjb25kCgkJICAgICAoKGVxIHR5cGUgJ29yZGVyZWQpICJlbnVtZXJhdGUi KQoJCSAgICAgKChlcSB0eXBlICd1bm9yZGVyZWQpICJpdGVtaXplIikKCQkgICAgICgoZXEgdHlw ZSAnZGVzY3JpcHRpdmUpIHRhYmxlLXR5cGUpKSkpCiAgICAoZm9ybWF0ICJAJXMlc1xuQGVuZCAl cyIKCSAgICAoaWYgKGVxIHR5cGUgJ2Rlc2NyaXB0aXZlKQoJCShjb25jYXQgbGlzdC10eXBlICIg IiBpbmRpYykKCSAgICAgbGlzdC10eXBlKQoJICAgIGNvbnRlbnRzCgkgICAgbGlzdC10eXBlKSkp CgoKOzs7OyBQbGFpbiBUZXh0CgooZGVmdW4gb3JnLWUtdGV4aW5mby1wbGFpbi10ZXh0ICh0ZXh0 IGluZm8pCiAgIlRyYW5zY29kZSBhIFRFWFQgc3RyaW5nIGZyb20gT3JnIHRvIFRleGluZm8uClRF WFQgaXMgdGhlIHN0cmluZyB0byB0cmFuc2NvZGUuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpj b250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICA7OyBQcm90ZWN0IEAgeyBhbmQgfS4KICAod2hpbGUg KHN0cmluZy1tYXRjaCAiXFwoW15cXF1cXHxeXFwpXFwoW0B7fV1cXCkiIHRleHQpCiAgICAoc2V0 cSB0ZXh0CgkgIChyZXBsYWNlLW1hdGNoIChmb3JtYXQgIlxcJXMiIChtYXRjaC1zdHJpbmcgMiB0 ZXh0KSkgbmlsIHQgdGV4dCAyKSkpCiAgOzsgTGFUZVggaW50byBATGFUZVh7fSBhbmQgVGVYIGlu dG8gQFRlWHt9CiAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggbmlsKQoJKHN0YXJ0IDApKQogICAg KHdoaWxlIChzdHJpbmctbWF0Y2ggIlxcKFxcKD86TGFcXCk/VGVYXFwpIiB0ZXh0IHN0YXJ0KQog ICAgICAoc2V0cSB0ZXh0IChyZXBsYWNlLW1hdGNoCgkJICAoZm9ybWF0ICJAJXN7fSIgKG1hdGNo LXN0cmluZyAxIHRleHQpKSBuaWwgdCB0ZXh0KQoJICAgIHN0YXJ0IChtYXRjaC1lbmQgMCkpKSkK ICA7OyBIYW5kbGUgcXVvdGF0aW9uIG1hcmtzCiAgKHNldHEgdGV4dCAob3JnLWUtdGV4aW5mby0t cXVvdGF0aW9uLW1hcmtzIHRleHQgaW5mbykpCiAgOzsgQ29udmVydCBzcGVjaWFsIHN0cmluZ3Mu CiAgKHdoZW4gKHBsaXN0LWdldCBpbmZvIDp3aXRoLXNwZWNpYWwtc3RyaW5ncykKICAgICh3aGls ZSAoc3RyaW5nLW1hdGNoIChyZWdleHAtcXVvdGUgIi4uLiIpIHRleHQpCiAgICAgIChzZXRxIHRl eHQgKHJlcGxhY2UtbWF0Y2ggIkBkb3Rze30iIG5pbCB0IHRleHQpKSkpCiAgOzsgSGFuZGxlIGJy ZWFrIHByZXNlcnZhdGlvbiBpZiByZXF1aXJlZC4KICAod2hlbiAocGxpc3QtZ2V0IGluZm8gOnBy ZXNlcnZlLWJyZWFrcykKICAgIChzZXRxIHRleHQgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAi XFwoXFxcXFxcXFxcXCk/WyBcdF0qXG4iICIgQCpcbiIKCQkJCQkgdGV4dCkpKQogIDs7IFJldHVy biB2YWx1ZS4KICB0ZXh0KQoKCjs7OzsgUGxhbm5pbmcKCihkZWZ1biBvcmctZS10ZXhpbmZvLXBs YW5uaW5nIChwbGFubmluZyBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBQTEFOTklORyBl bGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBw bGlzdCBob2xkaW5nIGNvbnRleHR1YWwKaW5mb3JtYXRpb24uIgogIChjb25jYXQKICAgIkBub2lu ZGVudCIKICAgKG1hcGNvbmNhdAogICAgJ2lkZW50aXR5CiAgICAoZGVscSBuaWwKCSAgKGxpc3QK CSAgIChsZXQgKChjbG9zZWQgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpjbG9zZWQgcGxhbm5pbmcp KSkKCSAgICAgKHdoZW4gY2xvc2VkCgkgICAgICAgKGNvbmNhdAoJCShmb3JtYXQgIkBzdHJvbmcl c30gIiBvcmctY2xvc2VkLXN0cmluZykKCQkoZm9ybWF0IG9yZy1lLXRleGluZm8taW5hY3RpdmUt dGltZXN0YW1wLWZvcm1hdAoJCQkob3JnLXRyYW5zbGF0ZS10aW1lIGNsb3NlZCkpKSkpCgkgICAo bGV0ICgoZGVhZGxpbmUgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpkZWFkbGluZSBwbGFubmluZykp KQoJICAgICAod2hlbiBkZWFkbGluZQoJICAgICAgIChjb25jYXQKCQkoZm9ybWF0ICJAc3Ryb25n eyVzfSAiIG9yZy1kZWFkbGluZS1zdHJpbmcpCgkJKGZvcm1hdCBvcmctZS10ZXhpbmZvLWFjdGl2 ZS10aW1lc3RhbXAtZm9ybWF0CgkJCShvcmctdHJhbnNsYXRlLXRpbWUgZGVhZGxpbmUpKSkpKQoJ ICAgKGxldCAoKHNjaGVkdWxlZCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnNjaGVkdWxlZCBwbGFu bmluZykpKQoJICAgICAod2hlbiBzY2hlZHVsZWQKCSAgICAgICAoY29uY2F0CgkJKGZvcm1hdCAi QHN0cm9uZ3slc30gIiBvcmctc2NoZWR1bGVkLXN0cmluZykKCQkoZm9ybWF0IG9yZy1lLXRleGlu Zm8tYWN0aXZlLXRpbWVzdGFtcC1mb3JtYXQKCQkJKG9yZy10cmFuc2xhdGUtdGltZSBzY2hlZHVs ZWQpKSkpKSkpCiAgICAiICIpCiAgICJAKiIpKQoKCjs7OzsgUHJvcGVydHkgRHJhd2VyCgooZGVm dW4gb3JnLWUtdGV4aW5mby1wcm9wZXJ0eS1kcmF3ZXIgKHByb3BlcnR5LWRyYXdlciBjb250ZW50 cyBpbmZvKQogICJUcmFuc2NvZGUgYSBQUk9QRVJUWS1EUkFXRVIgZWxlbWVudCBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250 ZXh0dWFsCmluZm9ybWF0aW9uLiIKICA7OyBUaGUgcHJvcGVydHkgZHJhd2VyIGlzbid0IGV4cG9y dGVkIGJ1dCB3ZSB3YW50IHNlcGFyYXRpbmcgYmxhbmsKICA7OyBsaW5lcyBub25ldGhlbGVzcy4K ICAiIikKCgo7Ozs7IFF1b3RlIEJsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1xdW90ZS1ibG9j ayAocXVvdGUtYmxvY2sgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgUVVPVEUtQkxPQ0sg ZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMg b2YgdGhlIGJsb2NrLiAgSU5GTyBpcyBhIHBsaXN0CmhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1h dGlvbi4iCiAgCiAgKGxldCogKCh0aXRsZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOm5hbWUgcXVv dGUtYmxvY2spKQoJIChzdGFydC1xdW90ZSAoY29uY2F0ICJAcXVvdGF0aW9uIgoKCQkJICAgICAg KGlmIHRpdGxlCgkJCQkgKGZvcm1hdCAiICVzIiB0aXRsZSkpKSkpCiAgICAKICAgIChmb3JtYXQg IiVzXG4lc0BlbmQgcXVvdGF0aW9uIiBzdGFydC1xdW90ZSBjb250ZW50cykpKQoKCjs7OzsgUXVv dGUgU2VjdGlvbgoKKGRlZnVuIG9yZy1lLXRleGluZm8tcXVvdGUtc2VjdGlvbiAocXVvdGUtc2Vj dGlvbiBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBRVU9URS1TRUNUSU9OIGVsZW1lbnQg ZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhv bGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGxldCAoKHZhbHVlIChvcmctcmVtb3Zl LWluZGVudGF0aW9uCgkJKG9yZy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBxdW90ZS1zZWN0aW9u KSkpKQogICAgKHdoZW4gdmFsdWUgKGZvcm1hdCAiQHZlcmJhdGltXG4lc0BlbmQgdmVyYmF0aW0i IHZhbHVlKSkpKQoKCjs7OzsgUmFkaW8gVGFyZ2V0CgooZGVmdW4gb3JnLWUtdGV4aW5mby1yYWRp by10YXJnZXQgKHJhZGlvLXRhcmdldCB0ZXh0IGluZm8pCiAgIlRyYW5zY29kZSBhIFJBRElPLVRB UkdFVCBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KVEVYVCBpcyB0aGUgdGV4dCBvZiB0aGUg dGFyZ2V0LiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZvcm1hdGlvbi4i CiAgKGZvcm1hdCAiQGFuY2hvcnslc30lcyIKCSAgKG9yZy1leHBvcnQtc29saWRpZnktbGluay10 ZXh0CgkgICAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIHJhZGlvLXRhcmdldCkpCgkgIHRl eHQpKQoKCjs7OzsgU2VjdGlvbgoKKGRlZnVuIG9yZy1lLXRleGluZm8tc2VjdGlvbiAoc2VjdGlv biBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBTRUNUSU9OIGVsZW1lbnQgZnJvbSBPcmcg dG8gVGV4aW5mby4KQ09OVEVOVFMgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAg SU5GTyBpcyBhIHBsaXN0CmhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgY29udGVu dHMpCgoKOzs7OyBTcGVjaWFsIEJsb2NrCjs7Cjs7IEFyZSBpZ25vcmVkIGF0IHRoZSBtb21lbnQK Cjs7OzsgU3JjIEJsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1zcmMtYmxvY2sgKHNyYy1ibG9j ayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBTUkMtQkxPQ0sgZWxlbWVudCBmcm9tIE9y ZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIGl0ZW0uICBJ TkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAobGV0KiAo KGxhbmcgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpsYW5ndWFnZSBzcmMtYmxvY2spKQoJIChsaXNw LXAgKHN0cmluZy1tYXRjaC1wICJsaXNwIiBsYW5nKSkpCiAgICAoY29uZAogICAgIDs7IENhc2Ug MS4gIExpc3AgQmxvY2sKICAgICAobGlzcC1wCiAgICAgIChmb3JtYXQgIkBsaXNwXG4lc1xuQGVu ZCBsaXNwIgoJICAgICAgKG9yZy1leHBvcnQtZm9ybWF0LWNvZGUtZGVmYXVsdCBzcmMtYmxvY2sg aW5mbykpKQogICAgIDs7IENhc2UgMi4gIE90aGVyIGJsb2NrcwogICAgICh0CiAgICAgIChmb3Jt YXQgIkBleGFtcGxlXG4lc1xuQGVuZCBleGFtcGxlIgoJICAgICAgKG9yZy1leHBvcnQtZm9ybWF0 LWNvZGUtZGVmYXVsdCBzcmMtYmxvY2sgaW5mbykpKSkpKQoKCjs7OzsgU3RhdGlzdGljcyBDb29r aWUKCihkZWZ1biBvcmctZS10ZXhpbmZvLXN0YXRpc3RpY3MtY29va2llIChzdGF0aXN0aWNzLWNv b2tpZSBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBTVEFUSVNUSUNTLUNPT0tJRSBvYmpl Y3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0 IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKG9yZy1lbGVtZW50LXByb3BlcnR5 IDp2YWx1ZSBzdGF0aXN0aWNzLWNvb2tpZSkpCgoKOzs7OyBTdHJpa2UtVGhyb3VnaAo7Owo7OyBT dHJpa2V0aHJvdWdoIGlzIGlnbm9yZWQKCgo7Ozs7IFN1YnNjcmlwdAoKKGRlZnVuIG9yZy1lLXRl eGluZm8tc3Vic2NyaXB0IChzdWJzY3JpcHQgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEg U1VCU0NSSVBUIG9iamVjdCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgY29u dGVudHMgb2YgdGhlIG9iamVjdC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwg aW5mb3JtYXRpb24uIgogIChmb3JtYXQgIkBtYXRoe18lc30iIGNvbnRlbnRzKSkKCgo7Ozs7IFN1 cGVyc2NyaXB0CgooZGVmdW4gb3JnLWUtdGV4aW5mby1zdXBlcnNjcmlwdCAoc3VwZXJzY3JpcHQg Y29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgU1VQRVJTQ1JJUFQgb2JqZWN0IGZyb20gT3Jn IHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0LiAgSU5G TyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGZvcm1hdCAi QG1hdGh7XiVzfSIgY29udGVudHMpKQoKCjs7OzsgVGFibGUKOzsKOzsgYG9yZy1lLXRleGluZm8t dGFibGUnIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGFibGUgdHJhbnNjb2RpbmcuICBJdAo7OyB0 YWtlcyBjYXJlIG9mIHRhYmxlcyB3aXRoIGEgInZlcmJhdGltIiBhdHRyaWJ1dGUuICBPdGhlcndp c2UsIGl0Cjs7IGRlbGVnYXRlcyB0aGUgam9iIHRvIGVpdGhlciBgb3JnLWUtdGV4aW5mby10YWJs ZS0tdGFibGUuZWwtdGFibGUnIG9yCjs7IGBvcmctZS10ZXhpbmZvLXRhYmxlLS1vcmctdGFibGUn IGZ1bmN0aW9ucywgZGVwZW5kaW5nIG9mIHRoZSB0eXBlIG9mCjs7IHRoZSB0YWJsZS4KOzsKOzsg YG9yZy1lLXRleGluZm8tdGFibGUtLWFsaWduLXN0cmluZycgaXMgYSBzdWJyb3V0aW5lIHVzZWQg dG8gYnVpbGQKOzsgYWxpZ25tZW50IHN0cmluZyBmb3IgT3JnIHRhYmxlcy4KCihkZWZ1biBvcmct ZS10ZXhpbmZvLXRhYmxlICh0YWJsZSBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBUQUJM RSBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBv ZiB0aGUgdGFibGUuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0 aW9uLiIKICAoY29uZAogICA7OyBDYXNlIDE6IHZlcmJhdGltIHRhYmxlLgogICAoKG9yIG9yZy1l LXRleGluZm8tdGFibGVzLXZlcmJhdGltCgkobGV0ICgoYXR0ciAobWFwY29uY2F0ICdpZGVudGl0 eQoJCQkgICAgICAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDphdHRyX2xhdGV4IHRhYmxlKQoJCQkg ICAgICAgIiAiKSkpCgkgIChhbmQgYXR0ciAoc3RyaW5nLW1hdGNoICJcXDx2ZXJiYXRpbVxcPiIg YXR0cikpKSkKICAgIChmb3JtYXQgIkB2ZXJiYXRpbSBcbiVzXG5AZW5kIHZlcmJhdGltIgoJICAg IDs7IFJlLWNyZWF0ZSB0YWJsZSwgd2l0aG91dCBhZmZpbGlhdGVkIGtleXdvcmRzLgoJICAgIChv cmctdHJpbQoJICAgICAob3JnLWVsZW1lbnQtaW50ZXJwcmV0LWRhdGEKCSAgICAgIGAodGFibGUg bmlsICxAKG9yZy1lbGVtZW50LWNvbnRlbnRzIHRhYmxlKSkpKSkpCiAgIDs7IENhc2UgMjogdGFi bGUuZWwgdGFibGUuICBDb252ZXJ0IGl0IHVzaW5nIGFwcHJvcHJpYXRlIHRvb2xzLgogICAoKGVx IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dHlwZSB0YWJsZSkgJ3RhYmxlLmVsKQogICAgKG9yZy1l LXRleGluZm8tdGFibGUtLXRhYmxlLmVsLXRhYmxlIHRhYmxlIGNvbnRlbnRzIGluZm8pKQogICA7 OyBDYXNlIDM6IFN0YW5kYXJkIHRhYmxlLgogICAodCAob3JnLWUtdGV4aW5mby10YWJsZS0tb3Jn LXRhYmxlIHRhYmxlIGNvbnRlbnRzIGluZm8pKSkpCgooZGVmdW4gb3JnLWUtdGV4aW5mby10YWJs ZS1jb2x1bW4td2lkdGhzICh0YWJsZSBpbmZvKQogICJEZXRlcm1pbmUgdGhlIGxhcmdlc3QgdGFi bGUgY2VsbCBpbiBlYWNoIGNvbHVtbiB0byBwcm9jZXNzIGFsaWdubWVudC4KClRBQkxFIGlzIHRo ZSB0YWJsZSBlbGVtZW50IHRvIHRyYW5zY29kZS4gIElORk8gaXMgYSBwbGlzdCB1c2VkIGFzCmEg Y29tbXVuaWNhdGlvbiBjaGFubmVsLiIKICAobGV0KiAoKHJvd3MgKG9yZy1lbGVtZW50LW1hcCB0 YWJsZSAndGFibGUtcm93ICdpZGVudGl0eSBpbmZvKSkKCSAoY29sbGVjdGVkIChsb29wIGZvciBy b3cgaW4gcm93cyBjb2xsZWN0CgkJCSAgKG9yZy1lbGVtZW50LW1hcAoJCQkgICByb3cgJ3RhYmxl LWNlbGwgJ2lkZW50aXR5IGluZm8pKSkKCSAobnVtYmVyLWNlbGxzIChsZW5ndGggKGNhciBjb2xs ZWN0ZWQpKSkKCSBjZWxscyBjb3VudHMpCiAgICAobG9vcCBmb3Igcm93IGluIGNvbGxlY3RlZCBk bwoJICAocHVzaCAobWFwY2FyIChsYW1iZGEgKHJlZikKCQkgICAgIChsZXQqICgoc3RhcnQgKG9y Zy1lbGVtZW50LXByb3BlcnR5IDpjb250ZW50cy1iZWdpbiByZWYpKQoJCQkgICAgKGVuZCAob3Jn LWVsZW1lbnQtcHJvcGVydHkgOmNvbnRlbnRzLWVuZCByZWYpKQoJCQkgICAgKGxlbmd0aCAoLSBl bmQgc3RhcnQpKSkKCQkgICAgICAgbGVuZ3RoKSkgcm93KSBjZWxscykpCiAgICAoc2V0cSBjZWxs cyAocmVtb3ZlLWlmICMnbnVsbCBjZWxscykpCiAgICAocHVzaCAobG9vcCBmb3IgY291bnQgZnJv bSAwIHRvICgtIG51bWJlci1jZWxscyAxKSBjb2xsZWN0CgkJICAgKGxvb3AgZm9yIGl0ZW0gaW4g Y2VsbHMgY29sbGVjdAoJCQkgKG50aCBjb3VudCBpdGVtKSkpIGNvdW50cykKICAgIChtYXBjb25j YXQgJyhsYW1iZGEgKHNpemUpCgkJICAobWFrZS1zdHJpbmcgc2l6ZSA/YSkpIChtYXBjYXIgKGxh bWJkYSAocmVmKQoJCQkJICAgKGFwcGx5ICdtYXggYCxAcmVmKSkgKGNhciBjb3VudHMpKQoJICAg ICAgICJ9IHsiKQogICkpCgooZGVmdW4gb3JnLWUtdGV4aW5mby10YWJsZS0tb3JnLXRhYmxlICh0 YWJsZSBjb250ZW50cyBpbmZvKQogICJSZXR1cm4gYXBwcm9wcmlhdGUgVGV4aW5mbyBjb2RlIGZv ciBhbiBPcmcgdGFibGUuCgpUQUJMRSBpcyB0aGUgdGFibGUgdHlwZSBlbGVtZW50IHRvIHRyYW5z Y29kZS4gIENPTlRFTlRTIGlzIGl0cwpjb250ZW50cywgYXMgYSBzdHJpbmcuICBJTkZPIGlzIGEg cGxpc3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24KY2hhbm5lbC4KClRoaXMgZnVuY3Rpb24gYXNz dW1lcyBUQUJMRSBoYXMgYG9yZycgYXMgaXRzIGA6dHlwZScgYXR0cmlidXRlLiIKICAobGV0KiAo KGF0dHIgKG9yZy1leHBvcnQtcmVhZC1hdHRyaWJ1dGUgOmF0dHJfdGV4aW5mbyB0YWJsZSkpCgkg KGNvbC13aWR0aCAocGxpc3QtZ2V0IGF0dHIgOmNvbHVtbnMpKQoJIChjb2x1bW5zIChpZiBjb2wt d2lkdGgKCQkgICAgICAoZm9ybWF0ICJAY29sdW1uZnJhY3Rpb25zICVzIgoJCQkgICAgICBjb2wt d2lkdGgpCgkJICAgIChmb3JtYXQgInslc30iCgkJCSAgICAob3JnLWUtdGV4aW5mby10YWJsZS1j b2x1bW4td2lkdGhzCgkJCSAgICAgdGFibGUgaW5mbykpKSkpCiAgICA7OyBQcmVwYXJlIHRoZSBm aW5hbCBmb3JtYXQgc3RyaW5nIGZvciB0aGUgdGFibGUuCiAgICAoY29uZAogICAgIDs7IExvbmd0 YWJsZS4KICAgICA7OyBPdGhlcnMuCiAgICAgKHQgKGNvbmNhdAoJIChmb3JtYXQgIkBtdWx0aXRh YmxlICVzXG4lc0BlbmQgbXVsdGl0YWJsZSIKCQkgY29sdW1ucwoJCSBjb250ZW50cykpKSkpKQoK KGRlZnVuIG9yZy1lLXRleGluZm8tdGFibGUtLXRhYmxlLmVsLXRhYmxlICh0YWJsZSBjb250ZW50 cyBpbmZvKQogICJSZXR1cm5zIG5vdGhpbmcuCgpSYXRoZXIgdGhhbiByZXR1cm4gYW4gaW52YWxp ZCB0YWJsZSwgbm90aGluZyBpcyByZXR1cm5lZC4iCiAgJ25pbCkKCgo7Ozs7IFRhYmxlIENlbGwK CihkZWZ1biBvcmctZS10ZXhpbmZvLXRhYmxlLWNlbGwgKHRhYmxlLWNlbGwgY29udGVudHMgaW5m bykKICAiVHJhbnNjb2RlIGEgVEFCTEUtQ0VMTCBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8u CkNPTlRFTlRTIGlzIHRoZSBjZWxsIGNvbnRlbnRzLiAgSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMK YSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIgogIChjb25jYXQgKGlmIChhbmQgY29udGVudHMKCQkg ICBvcmctZS10ZXhpbmZvLXRhYmxlLXNjaWVudGlmaWMtbm90YXRpb24KCQkgICAoc3RyaW5nLW1h dGNoIG9yZ3RibC1leHAtcmVnZXhwIGNvbnRlbnRzKSkKCSAgICAgIDs7IFVzZSBhcHByb3ByaWF0 ZSBmb3JtYXQgc3RyaW5nIGZvciBzY2llbnRpZmljCgkgICAgICA7OyBub3RhdGlvbi4KCSAgICAg IChmb3JtYXQgb3JnLWUtdGV4aW5mby10YWJsZS1zY2llbnRpZmljLW5vdGF0aW9uCgkJICAgICAg KG1hdGNoLXN0cmluZyAxIGNvbnRlbnRzKQoJCSAgICAgIChtYXRjaC1zdHJpbmcgMiBjb250ZW50 cykpCgkgICAgY29udGVudHMpCgkgICh3aGVuIChvcmctZXhwb3J0LWdldC1uZXh0LWVsZW1lbnQg dGFibGUtY2VsbCBpbmZvKSAiXG5AdGFiICIpKSkKCgo7Ozs7IFRhYmxlIFJvdwoKKGRlZnVuIG9y Zy1lLXRleGluZm8tdGFibGUtcm93ICh0YWJsZS1yb3cgY29udGVudHMgaW5mbykKICAiVHJhbnNj b2RlIGEgVEFCTEUtUk9XIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMg dGhlIGNvbnRlbnRzIG9mIHRoZSByb3cuICBJTkZPIGlzIGEgcGxpc3QgdXNlZCBhcwphIGNvbW11 bmljYXRpb24gY2hhbm5lbC4iCiAgOzsgUnVsZXMgYXJlIGlnbm9yZWQgc2luY2UgdGFibGUgc2Vw YXJhdG9ycyBhcmUgZGVkdWNlZCBmcm9tCiAgOzsgYm9yZGVycyBvZiB0aGUgY3VycmVudCByb3cu CiAgKHdoZW4gKGVxIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dHlwZSB0YWJsZS1yb3cpICdzdGFu ZGFyZCkgCiAgICAoY29uY2F0ICJAaXRlbSAiIGNvbnRlbnRzICJcbiIpKSkKCgo7Ozs7IFRhcmdl dAoKKGRlZnVuIG9yZy1lLXRleGluZm8tdGFyZ2V0ICh0YXJnZXQgY29udGVudHMgaW5mbykKICAi VHJhbnNjb2RlIGEgVEFSR0VUIG9iamVjdCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBp cyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250ZXh0dWFsCmluZm9ybWF0aW9uLiIK ICAoZm9ybWF0ICJAYW5jaG9yeyVzfSIKCSAgKG9yZy1leHBvcnQtc29saWRpZnktbGluay10ZXh0 IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dmFsdWUgdGFyZ2V0KSkpKQoKCjs7OzsgVGltZXN0YW1w CgooZGVmdW4gb3JnLWUtdGV4aW5mby10aW1lc3RhbXAgKHRpbWVzdGFtcCBjb250ZW50cyBpbmZv KQogICJUcmFuc2NvZGUgYSBUSU1FU1RBTVAgb2JqZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNP TlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwKaW5mb3Jt YXRpb24uIgogIChsZXQgKCh2YWx1ZSAob3JnLXRyYW5zbGF0ZS10aW1lIChvcmctZWxlbWVudC1w cm9wZXJ0eSA6dmFsdWUgdGltZXN0YW1wKSkpCgkodHlwZSAob3JnLWVsZW1lbnQtcHJvcGVydHkg OnR5cGUgdGltZXN0YW1wKSkpCiAgICAoY29uZCAoKG1lbXEgdHlwZSAnKGFjdGl2ZSBhY3RpdmUt cmFuZ2UpKQoJICAgKGZvcm1hdCBvcmctZS10ZXhpbmZvLWFjdGl2ZS10aW1lc3RhbXAtZm9ybWF0 IHZhbHVlKSkKCSAgKChtZW1xIHR5cGUgJyhpbmFjdGl2ZSBpbmFjdGl2ZS1yYW5nZSkpCgkgICAo Zm9ybWF0IG9yZy1lLXRleGluZm8taW5hY3RpdmUtdGltZXN0YW1wLWZvcm1hdCB2YWx1ZSkpCgkg ICh0IChmb3JtYXQgb3JnLWUtdGV4aW5mby1kaWFyeS10aW1lc3RhbXAtZm9ybWF0IHZhbHVlKSkp KSkKCgo7Ozs7IFVuZGVybGluZQo7Owo7OyBVbmRlcmxpbmUgaXMgaWdub3JlZAoKCjs7OzsgVmVy YmF0aW0KCihkZWZ1biBvcmctZS10ZXhpbmZvLXZlcmJhdGltICh2ZXJiYXRpbSBjb250ZW50cyBp bmZvKQogICJUcmFuc2NvZGUgYSBWRVJCQVRJTSBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4K Q09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9u CmNoYW5uZWwuIgogIChvcmctZS10ZXhpbmZvLS10ZXh0LW1hcmt1cCAob3JnLWVsZW1lbnQtcHJv cGVydHkgOnZhbHVlIHZlcmJhdGltKSAndmVyYmF0aW0pKQoKCjs7OzsgVmVyc2UgQmxvY2sKCihk ZWZ1biBvcmctZS10ZXhpbmZvLXZlcnNlLWJsb2NrICh2ZXJzZS1ibG9jayBjb250ZW50cyBpbmZv KQogICJUcmFuc2NvZGUgYSBWRVJTRS1CTE9DSyBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8u CkNPTlRFTlRTIGlzIHZlcnNlIGJsb2NrIGNvbnRlbnRzLiBJTkZPIGlzIGEgcGxpc3QgaG9sZGlu Zwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICA7OyBJbiBhIHZlcnNlIGVudmlyb25tZW50LCBh ZGQgYSBsaW5lIGJyZWFrIHRvIGVhY2ggbmV3bGluZQogIDs7IGNoYXJhY3RlciBhbmQgY2hhbmdl IGVhY2ggd2hpdGUgc3BhY2UgYXQgYmVnaW5uaW5nIG9mIGEgbGluZQogIDs7IGludG8gYSBzcGFj ZSBvZiAxIGVtLiAgQWxzbyBjaGFuZ2UgZWFjaCBibGFuayBsaW5lIHdpdGgKICA7OyBhIHZlcnRp Y2FsIHNwYWNlIG9mIDEgZW0uCiAgKHByb2duCiAgICAoc2V0cSBjb250ZW50cyAocmVwbGFjZS1y ZWdleHAtaW4tc3RyaW5nCgkJICAgICJeICpcXFxcXFxcXCQiICJcXFxcdnNwYWNlKnsxZW19IgoJ CSAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCgkJICAgICAiXFwoXFxcXFxcXFxcXCk/WyBc dF0qXG4iICIgXFxcXFxcXFxcbiIgY29udGVudHMpKSkKICAgICh3aGlsZSAoc3RyaW5nLW1hdGNo ICJeWyBcdF0rIiBjb250ZW50cykKICAgICAgKGxldCAoKG5ldy1zdHIgKGZvcm1hdCAiXFxoc3Bh Y2UqeyVkZW19IgoJCQkgICAgIChsZW5ndGggKG1hdGNoLXN0cmluZyAwIGNvbnRlbnRzKSkpKSkK CShzZXRxIGNvbnRlbnRzIChyZXBsYWNlLW1hdGNoIG5ldy1zdHIgbmlsIHQgY29udGVudHMpKSkp CiAgICAoZm9ybWF0ICJcXGJlZ2lue3ZlcnNlfVxuJXNcXGVuZHt2ZXJzZX0iIGNvbnRlbnRzKSkp CgoKDAo7OzsgSW50ZXJhY3RpdmUgZnVuY3Rpb25zCgooZGVmdW4gb3JnLWUtdGV4aW5mby1leHBv cnQtdG8tdGV4aW5mbwogICgmb3B0aW9uYWwgc3VidHJlZXAgdmlzaWJsZS1vbmx5IGJvZHktb25s eSBleHQtcGxpc3QgcHViLWRpcikKICAiRXhwb3J0IGN1cnJlbnQgYnVmZmVyIHRvIGEgVGV4aW5m byBmaWxlLgoKSWYgbmFycm93aW5nIGlzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBidWZmZXIsIG9u bHkgZXhwb3J0IGl0cwpuYXJyb3dlZCBwYXJ0LgoKSWYgYSByZWdpb24gaXMgYWN0aXZlLCBleHBv cnQgdGhhdCByZWdpb24uCgpXaGVuIG9wdGlvbmFsIGFyZ3VtZW50IFNVQlRSRUVQIGlzIG5vbi1u aWwsIGV4cG9ydCB0aGUgc3ViLXRyZWUKYXQgcG9pbnQsIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24g ZnJvbSB0aGUgaGVhZGxpbmUgcHJvcGVydGllcwpmaXJzdC4KCldoZW4gb3B0aW9uYWwgYXJndW1l bnQgVklTSUJMRS1PTkxZIGlzIG5vbi1uaWwsIGRvbid0IGV4cG9ydApjb250ZW50cyBvZiBoaWRk ZW4gZWxlbWVudHMuCgpXaGVuIG9wdGlvbmFsIGFyZ3VtZW50IEJPRFktT05MWSBpcyBub24tbmls LCBvbmx5IHdyaXRlIGNvZGUKYmV0d2VlbiBcIlxcYmVnaW57ZG9jdW1lbnR9XCIgYW5kIFwiXFxl bmR7ZG9jdW1lbnR9XCIuCgpFWFQtUExJU1QsIHdoZW4gcHJvdmlkZWQsIGlzIGEgcHJvcGVydHkg bGlzdCB3aXRoIGV4dGVybmFsCnBhcmFtZXRlcnMgb3ZlcnJpZGluZyBPcmcgZGVmYXVsdCBzZXR0 aW5ncywgYnV0IHN0aWxsIGluZmVyaW9yIHRvCmZpbGUtbG9jYWwgc2V0dGluZ3MuCgpXaGVuIG9w dGlvbmFsIGFyZ3VtZW50IFBVQi1ESVIgaXMgc2V0LCB1c2UgaXQgYXMgdGhlIHB1Ymxpc2hpbmcK ZGlyZWN0b3J5LgoKUmV0dXJuIG91dHB1dCBmaWxlJ3MgbmFtZS4iCiAgKGludGVyYWN0aXZlKQog IChsZXQgKChvdXRmaWxlIChvcmctZXhwb3J0LW91dHB1dC1maWxlLW5hbWUgIi50ZXhpIiBzdWJ0 cmVlcCBwdWItZGlyKSkpCiAgICAob3JnLWV4cG9ydC10by1maWxlCiAgICAgJ2UtdGV4aW5mbyBv dXRmaWxlIHN1YnRyZWVwIHZpc2libGUtb25seSBib2R5LW9ubHkgZXh0LXBsaXN0KSkpCgooZGVm dW4gb3JnLWUtdGV4aW5mby1leHBvcnQtdG8taW5mbwogICgmb3B0aW9uYWwgc3VidHJlZXAgdmlz aWJsZS1vbmx5IGJvZHktb25seSBleHQtcGxpc3QgcHViLWRpcikKICAiRXhwb3J0IGN1cnJlbnQg YnVmZmVyIHRvIFRleGluZm8gdGhlbiBwcm9jZXNzIHRocm91Z2ggdG8gSU5GTy4KCklmIG5hcnJv d2luZyBpcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLCBvbmx5IGV4cG9ydCBpdHMKbmFy cm93ZWQgcGFydC4KCklmIGEgcmVnaW9uIGlzIGFjdGl2ZSwgZXhwb3J0IHRoYXQgcmVnaW9uLgoK V2hlbiBvcHRpb25hbCBhcmd1bWVudCBTVUJUUkVFUCBpcyBub24tbmlsLCBleHBvcnQgdGhlIHN1 Yi10cmVlCmF0IHBvaW50LCBleHRyYWN0aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRsaW5l IHByb3BlcnRpZXMKZmlyc3QuCgpXaGVuIG9wdGlvbmFsIGFyZ3VtZW50IFZJU0lCTEUtT05MWSBp cyBub24tbmlsLCBkb24ndCBleHBvcnQKY29udGVudHMgb2YgaGlkZGVuIGVsZW1lbnRzLgoKV2hl biBvcHRpb25hbCBhcmd1bWVudCBCT0RZLU9OTFkgaXMgbm9uLW5pbCwgb25seSB3cml0ZSBjb2Rl CmJldHdlZW4gXCJcXGJlZ2lue2RvY3VtZW50fVwiIGFuZCBcIlxcZW5ke2RvY3VtZW50fVwiLgoK RVhULVBMSVNULCB3aGVuIHByb3ZpZGVkLCBpcyBhIHByb3BlcnR5IGxpc3Qgd2l0aCBleHRlcm5h bApwYXJhbWV0ZXJzIG92ZXJyaWRpbmcgT3JnIGRlZmF1bHQgc2V0dGluZ3MsIGJ1dCBzdGlsbCBp bmZlcmlvciB0bwpmaWxlLWxvY2FsIHNldHRpbmdzLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBQ VUItRElSIGlzIHNldCwgdXNlIGl0IGFzIHRoZSBwdWJsaXNoaW5nCmRpcmVjdG9yeS4KClJldHVy biBJTkZPIGZpbGUncyBuYW1lLiIKICAoaW50ZXJhY3RpdmUpCiAgKG9yZy1lLXRleGluZm8tY29t cGlsZQogICAob3JnLWUtdGV4aW5mby1leHBvcnQtdG8tdGV4aW5mbwogICAgc3VidHJlZXAgdmlz aWJsZS1vbmx5IGJvZHktb25seSBleHQtcGxpc3QgcHViLWRpcikpKQoKKGRlZnVuIG9yZy1lLXRl eGluZm8tY29tcGlsZSAodGV4aWZpbGUpCiAgIkNvbXBpbGUgYSB0ZXhpbmZvIGZpbGUuCgpURVhJ RklMRSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWluZyBjb21waWxlZC4gIFByb2Nlc3Npbmcg aXMKZG9uZSB0aHJvdWdoIHRoZSBjb21tYW5kIHNwZWNpZmllZCBpbiBgb3JnLWUtdGV4aW5mby1p bmZvLXByb2Nlc3MnLgoKUmV0dXJuIElORk8gZmlsZSBuYW1lIG9yIGFuIGVycm9yIGlmIGl0IGNv dWxkbid0IGJlIHByb2R1Y2VkLiIKICAobGV0KiAoKHdjb25maWcgKGN1cnJlbnQtd2luZG93LWNv bmZpZ3VyYXRpb24pKQoJICh0ZXhpZmlsZSAoZmlsZS10cnVlbmFtZSB0ZXhpZmlsZSkpCgkgKGJh c2UgKGZpbGUtbmFtZS1zYW5zLWV4dGVuc2lvbiB0ZXhpZmlsZSkpCgkgZXJyb3JzKQogICAgKG1l c3NhZ2UgKGZvcm1hdCAiUHJvY2Vzc2luZyBUZXhpbmZvIGZpbGUgJXMgLi4uIiB0ZXhpZmlsZSkp CiAgICAodW53aW5kLXByb3RlY3QKCShwcm9nbgoJICAoY29uZAoJICAgOzsgQSBmdW5jdGlvbiBp cyBwcm92aWRlZDogQXBwbHkgaXQuCgkgICAoKGZ1bmN0aW9ucCBvcmctZS10ZXhpbmZvLWluZm8t cHJvY2VzcykKCSAgICAoZnVuY2FsbCBvcmctZS10ZXhpbmZvLWluZm8tcHJvY2VzcyAoc2hlbGwt cXVvdGUtYXJndW1lbnQgdGV4aWZpbGUpKSkKCSAgIDs7IEEgbGlzdCBpcyBwcm92aWRlZDogUmVw bGFjZSAlYiwgJWYgYW5kICVvIHdpdGggYXBwcm9wcmlhdGUKCSAgIDs7IHZhbHVlcyBpbiBlYWNo IGNvbW1hbmQgYmVmb3JlIGFwcGx5aW5nIGl0LiAgT3V0cHV0IGlzCgkgICA7OyByZWRpcmVjdGVk IHRvICIqT3JnIElORk8gVGV4aW5mbyBPdXRwdXQqIiBidWZmZXIuCgkgICAoKGNvbnNwIG9yZy1l LXRleGluZm8taW5mby1wcm9jZXNzKQoJICAgIChsZXQqICgob3V0LWRpciAob3IgKGZpbGUtbmFt ZS1kaXJlY3RvcnkgdGV4aWZpbGUpICIuLyIpKQoJCSAgIChvdXRidWYgKGdldC1idWZmZXItY3Jl YXRlICIqT3JnIEluZm8gVGV4aW5mbyBPdXRwdXQqIikpKQoJICAgICAgKG1hcGMKCSAgICAgICAo bGFtYmRhIChjb21tYW5kKQoJCSAoc2hlbGwtY29tbWFuZAoJCSAgKHJlcGxhY2UtcmVnZXhwLWlu LXN0cmluZwoJCSAgICIlYiIgKHNoZWxsLXF1b3RlLWFyZ3VtZW50IGJhc2UpCgkJICAgKHJlcGxh Y2UtcmVnZXhwLWluLXN0cmluZwoJCSAgICAiJWYiIChzaGVsbC1xdW90ZS1hcmd1bWVudCB0ZXhp ZmlsZSkKCQkgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCSAgICAgIiVvIiAoc2hlbGwt cXVvdGUtYXJndW1lbnQgb3V0LWRpcikgY29tbWFuZCB0IHQpIHQgdCkgdCB0KQoJCSAgb3V0YnVm KSkKCSAgICAgICBvcmctZS10ZXhpbmZvLWluZm8tcHJvY2VzcykKCSAgICAgIDs7IENvbGxlY3Qg c3RhbmRhcmQgZXJyb3JzIGZyb20gb3V0cHV0IGJ1ZmZlci4KCSAgICAgIChzZXRxIGVycm9ycyAo b3JnLWUtdGV4aW5mby1jb2xsZWN0LWVycm9ycyBvdXRidWYpKSkpCgkgICAodCAoZXJyb3IgIk5v IHZhbGlkIGNvbW1hbmQgdG8gcHJvY2VzcyB0byBJbmZvIikpKQoJICAobGV0ICgoaW5mb2ZpbGUg KGNvbmNhdCBiYXNlICIuaW5mbyIpKSkKCSAgICA7OyBDaGVjayBmb3IgcHJvY2VzcyBmYWlsdXJl LiAgUHJvdmlkZSBjb2xsZWN0ZWQgZXJyb3JzIGlmCgkgICAgOzsgcG9zc2libGUuCgkgICAgKGlm IChub3QgKGZpbGUtZXhpc3RzLXAgaW5mb2ZpbGUpKQoJCShlcnJvciAoY29uY2F0IChmb3JtYXQg IklORk8gZmlsZSAlcyB3YXNuJ3QgcHJvZHVjZWQiIGluZm9maWxlKQoJCQkgICAgICAgKHdoZW4g ZXJyb3JzIChjb25jYXQgIjogIiBlcnJvcnMpKSkpCgkgICAgICA7OyBFbHNlIHJlbW92ZSBsb2cg ZmlsZXMsIHdoZW4gc3BlY2lmaWVkLCBhbmQgc2lnbmFsIGVuZCBvZgoJICAgICAgOzsgcHJvY2Vz cyB0byB1c2VyLCBhbG9uZyB3aXRoIGFueSBlcnJvciBlbmNvdW50ZXJlZC4KCSAgICAgIChtZXNz YWdlIChjb25jYXQgIlByb2Nlc3MgY29tcGxldGVkIgoJCQkgICAgICAgKGlmIChub3QgZXJyb3Jz KSAiLiIKCQkJCSAoY29uY2F0ICIgd2l0aCBlcnJvcnM6ICIgZXJyb3JzKSkpKSkKCSAgICA7OyBS ZXR1cm4gb3V0cHV0IGZpbGUgbmFtZS4KCSAgICBpbmZvZmlsZSkpCiAgICAgIChzZXQtd2luZG93 LWNvbmZpZ3VyYXRpb24gd2NvbmZpZykpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLWNvbGxlY3Qt ZXJyb3JzIChidWZmZXIpCiAgIkNvbGxlY3Qgc29tZSBraW5kIG9mIGVycm9ycyBmcm9tIFwicGRm bGF0ZXhcIiBjb21tYW5kIG91dHB1dC4KCkJVRkZFUiBpcyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcg b3V0cHV0LgoKUmV0dXJuIGNvbGxlY3RlZCBlcnJvciB0eXBlcyBhcyBhIHN0cmluZywgb3Igbmls IGlmIHRoZXJlIHdhcwpub25lLiIKICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKICAgIChz YXZlLWV4Y3Vyc2lvbgogICAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQogICAgICA7OyBGaW5k IGZpbmFsICJtYWtlaW5mbyIgcnVuLgogICAgICAod2hlbiAocmUtc2VhcmNoLWJhY2t3YXJkICJe bWFrZWluZm8gKEdOVSB0ZXhpbmZvKSIgbmlsIHQpCgkobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCB0 KQoJICAgICAgKGVycm9ycyAiIikpCgkgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNl YXJjaC1mb3J3YXJkICJwZXJoYXBzIGluY29ycmVjdCBzZWN0aW9uaW5nPyIgbmlsIHQpKQoJICAg IChzZXRxIGVycm9ycyAoY29uY2F0IGVycm9ycyAiIFtpbmNvcnJlY3Qgc2VjdGlvbm5uZ10iKSkp CgkgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNlYXJjaC1mb3J3YXJkICJtaXNzaW5n IGNsb3NlIGJyYWNlIiBuaWwgdCkpCgkgICAgKHNldHEgZXJyb3JzIChjb25jYXQgZXJyb3JzICIg W3N5bnRheCBlcnJvcl0iKSkpCgkgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNlYXJj aC1mb3J3YXJkICJVbmtub3duIGNvbW1hbmQiIG5pbCB0KSkKCSAgICAoc2V0cSBlcnJvcnMgKGNv bmNhdCBlcnJvcnMgIiBbdW5kZWZpbmVkIEBjb21tYW5kXSIpKSkKCSAgKHdoZW4gKHNhdmUtZXhj dXJzaW9uCgkJICAocmUtc2VhcmNoLWZvcndhcmQgIk5vIG1hdGNoaW5nIEBlbmQiIG5pbCB0KSkK CSAgICAoc2V0cSBlcnJvcnMgKGNvbmNhdCBlcnJvcnMgIiBbYmxvY2sgaW5jb21wbGV0ZV0iKSkp CgkgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNlYXJjaC1mb3J3YXJkICJyZXF1aXJl cyBhIHNlY3Rpb25pbmciIG5pbCB0KSkKCSAgICAoc2V0cSBlcnJvcnMgKGNvbmNhdCBlcnJvcnMg IiBbaW52YWxpZCBzZWN0aW9uIGNvbW1hbmRdIikpKQoJICAod2hlbiAoc2F2ZS1leGN1cnNpb24K CQkgIChyZS1zZWFyY2gtZm9yd2FyZCAiW3VuZXhwZWN0ZWRdIiBuaWwgdCkpCgkgICAgKHNldHEg ZXJyb3JzIChjb25jYXQgZXJyb3JzICIgW3VuZXhwZWN0ZWQgZXJyb3JdIikpKQoJICAoYW5kIChv cmctc3RyaW5nLW53LXAgZXJyb3JzKSAob3JnLXRyaW0gZXJyb3JzKSkpKSkpKQoKCihwcm92aWRl ICdvcmctZS10ZXhpbmZvKQo7Ozsgb3JnLWUtdGV4aW5mby5lbCBlbmRzIGhlcmUK --f46d042f9252ac260d04c64fdf7a--