From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Moe Subject: Re: bibtex bibliography exported to HTML Date: Wed, 04 Jan 2012 23:50:34 +0100 Message-ID: <4F04D7BA.5040405@christianmoe.com> References: Reply-To: mail@christianmoe.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040701060606020603090305" Return-path: Received: from eggs.gnu.org ([140.186.70.92]:51020) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RiZZ2-0000LG-E1 for emacs-orgmode@gnu.org; Wed, 04 Jan 2012 17:44:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RiZYz-0006r9-6N for emacs-orgmode@gnu.org; Wed, 04 Jan 2012 17:44:08 -0500 Received: from b1.hitrost.net ([91.185.211.67]:24598) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RiZYy-0006fh-Eq for emacs-orgmode@gnu.org; Wed, 04 Jan 2012 17:44:05 -0500 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: "Stephen J. Barr" Cc: emacs-orgmode@gnu.org This is a multi-part message in MIME format. --------------040701060606020603090305 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 1/4/12 10:31 PM, Stephen J. Barr wrote: > I want to include bibliography entries the > way I would with LaTeX, but then have a decent looking bibliography > when I export to HTML. Is this behaviour supported, and if so, how do > I do it? Hi, It's not currently supported, but I have some pretty raw code lying around from last summer to do just that. I'd be obliged if you'd test drive the attached Org-cite.el. Be warned, though, that even if it works for you, you'll probably want support and bugfixes that I have very little time for at the moment, being very busy with other work. This version depends on bibtex for the formatting, so you need a working LaTeX installation. When your document's changed, before you export to HTML (or ODT), you need to first do a latex export and run bibtex on it. Instructions follow below. Yours, Christian Moe ---- ORG-CITE Org-cite formats bibliographic citations and reference lists in Org-mode documents for export with non-LaTeX backends (HTML, ODT, plain text, Docbook...). Citations are hyperlinked to references. Org-cite is /not/ mature for use in a "production environment." It is intended to come in handy when you can deliver your final product as LaTeX/PDF, but need to share drafts with full references in other formats (HTML, ODT) with others. Org-cite currently requires BibTeX for the formatting, so you still need a working LaTeX installation. Org-cite via BibTeX aims to produce a /reasonably close approximation/ to the formatting you get from a LaTeX export with a few of the most widely used BibTeX packages and styles (plain, natbib, and apacite for now). It does not /and will not/ aim at identical results to any package/style, nor to support all packages/styles out there. Future versions will aim to include other formatters beside BibTeX. Org-cite can read raw latex cite macros including the most usual subsets supported by the natbib and apacite packages: with long and short authorlists, pre-notes, post-notes (locators), and multiple citations, e.g. the natbib cite : The cow jumped over the moon, \citet[see e.g.][p.11,p.6]{goose2010,thumb1999,thumb2003}. should come out as something like : The cow jumped over the moon, see e.g. Goose et al. (2010); Thumb (1999; 2003). Future versions will also support some version of the custom Org cite links preferred by some users. Setting the command org-cite-format as a pre-processing hook for export is always safe, since changes are done to a temporary copy of your document. Doing org-cite-format directly in your working buffer is possible (and helpful for debugging), but risks permanently overwriting your cites if you then save without reverting. Please always back up before you try this. * Installation: Make sure you have a working LaTeX/BibTeX installation. Place org-cite.el somewhere on your load-path. Evaluate the following, or add permanently to your .emacs: #+begin_src emacs-lisp (require 'org-cite) (add-hook 'org-export-preprocess-hook 'org-cite-format) #+end_src Instead of adding the hook on startup, you can also toggle export behavior with `M-x org-cite-toggle'. * Use: Org-cite does not automatically detect what package you are using, so you need to tell it. The current options are natbib, apacite, or nil for plain. : (setq org-cite-bibtex-package 'apacite) You also need to tell org-cite how to format your citations. Org-cite gives you more options than some latex packages, but some of these may give nonsensical results. The current options are =author-date=, =numeric=, =notes= (similar to numeric, but inserted as Org footnotes), and =text= (full citation in text). I recommend sticking to the first three for now. : (setq org-cite-method 'author-date) If you only use one method, you may want to keep these in your .emacs. To export foo.org to foo.odt with references: - First export foo.org to LaTeX and process it until you get the output you want, e.g. : latex foo : bibtex foo : latex foo : pdflatex foo This produces =foo.aux= and =foo.bbl= files needed by org-cite. - Make sure org-export-preprocess-hook includes org-cite-format (see above), and that your org-cite-bibtex-package and org-cite-method settings agree with your LaTeX settings. - Export foo.org to ODT or other target format. If things go wrong, org-cite may have choked while trying to cull curly braces from your bibitems. You can troubleshoot this by looking at the bibitem at point in the =org-cite-temp-bbl= buffer, which is left open if org-cite ends prematurely (you need to kill this buffer before trying again). * Known problems Org-cite handles many special (non-ascii) characters as represented in LaTeX, but not all; and it is picky when it comes to how these special characters are written. Some editing of your .bib file or at least the .bbl produced by bibtexing may be necessary. For example, it will recognize \"{a} as รค, but will not recognize \"a or {\"a}. There are two ways you can solve this: either conform your .bib file to org-cite's requirements, or conform org-cite to your .bib file by customizing org-cite-latex-chars-utf8 to include \"a as well. For some reason I have not pinned down, a doubling of the bibliography section has been known to occur with some documents. * Reporting bugs: A bug report should ideally include all of the following: - What you expected to see, and what you got - The files foo.org, foo.aux and foo.bbl - If export failed, traceback from the debugger and the contents of the org-cite-temp-bbl buffer --------------040701060606020603090305 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="org-cite.el" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="org-cite.el" Ozs7IG9yZy1jaXRlIC0tLSBmb3JtYXQgT3JnLW1vZGUgYmlibGlvZ3JhcGhpYyByZWZlcmVu Y2VzCgo7OyBDb3B5cmlnaHQgKEMpIDIwMTEgQ2hyaXN0aWFuIE1vZQoKOzsgQXV0aG9yOiBD aHJpc3RpYW4gTW9lIDxtYWlsIGF0IGNocmlzdGlhbm1vZSBkb3QgY29tPgo7OyBLZXl3b3Jk czogY2l0YXRpb25zLCByZWZlcmVuY2VzLCBiaWJsaW9ncmFwaHksIHdwCjs7IFZlcnNpb246 IDAuMSBhbHBoYQoKOzsgVGhpcyBmaWxlIGlzIG5vdCBwYXJ0IG9mIEdOVSBFbWFjcy4KCjs7 IE9yZy1jaXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQo7OyBhbnkg bGF0ZXIgdmVyc2lvbi4KCjs7IE9yZy1jaXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCjs7IE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKOzsgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCjs7IFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCjs7IGFsb25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6Cgo7OzsgQ29kZToKCgooZGVm dW4gb3JnLWNpdGUtZm9ybWF0ICgpCiAgIkRpc3BhdGNoIGZvcm1hdHRpbmcgaWYgdGhlcmUg aXMgYXQgbGVhc3Qgb25lIGNpdGUsIGFuZCB0aGUKZXhwb3J0IHRhcmdldCBpcyBub3QgTGFU ZVguIgogIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3 YXJkIG9yZy1jaXRlLWxhdGV4LWNpdGUtcmUgbmlsIHQpCiAgICAodW5sZXNzIChlcXVhbCBv cmctZXhwb3J0LWN1cnJlbnQtYmFja2VuZCAnbGF0ZXgpCiAgICAgIChvcmctY2l0ZS1mb3Jt YXQtd2l0aC1iaWJ0ZXgpKSkpCgooZGVmdW4gb3JnLWNpdGUtdG9nZ2xlICgpCiAgIlRvZ2ds ZSB1c2Ugb2Ygb3JnLWNpdGUtZm9ybWF0IG9uIGV4cG9ydC4iCiAgKGludGVyYWN0aXZlKQog IChpZiAobWVtYmVyICdvcmctY2l0ZS1mb3JtYXQgb3JnLWV4cG9ydC1wcmVwcm9jZXNzLWhv b2spCiAgICAgIChyZW1vdmUtaG9vayAnb3JnLWV4cG9ydC1wcmVwcm9jZXNzLWhvb2sgJ29y Zy1jaXRlLWZvcm1hdCkKICAgIChhZGQtaG9vayAnb3JnLWV4cG9ydC1wcmVwcm9jZXNzLWhv b2sgJ29yZy1jaXRlLWZvcm1hdCkpKQoKKGRlZnZhciBvcmctY2l0ZS1zdHJpbmdzCiAgKCkK ICAiUGxpc3Qgb2Ygc3RyaW5ncywgcmV0dXJuZWQgYnkgb3JnLWNpdGUtc3RyLiBTZXQgYXQg cnVudGltZQpkZXBlbmRpbmcgb24gaG93IHdlJ3JlIGZvcm1hdHRpbmcuIikKCihkZWZ2YXIg b3JnLWNpdGUtZGVmYXVsdC1zdHJpbmdzCiAgJyg6bG9jLXNlcCAiLCAiCiAgICA6bm9icmVh ayAgIsKgIiAgICAgICAgICAgICA7IChjaGFyLXRvLXN0cmluZyA/XDI0MCkJICAgICAKICAg IDphbmQgImFuZCIgICAgICAgICAgICAgICAgOyBlLmcuIGJlZm9yZSBsYXN0IGF1dGhvciBu YW1lCiAgICA6ZXQtYWwgImV0IGFsLiIgICAgOyBpbiBwbGFjZSBvZiBmdWxsIGxpc3Qgb2Yg Y28tYXV0aG9ycwogICAgOm51bWJlciAibm8uIgogICAgOnAgInAuIgogICAgOnBwICJwcC4i CiAgICA6aW4gImluIgogICAgOmVkICJlZC4iCiAgICA6ZWRzICJlZHMuIgogICAgOmVkLWJ5 ICJlZC4iCiAgICA6ZWRuICJlZC4iICAgICAgIDsgYWJicmV2aWF0aW9uIGZvciBlZGl0aW9u LCBlLmcuIGluICIoMm5kIGVkLikiCiAgICA6bm8tZGF0ZSAibi5kLiIKICAgICkKICAiRGVm YXVsdCBzdHJpbmdzIHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgY2l0YXRpb25zIGFuZCBiaWJs aW9ncmFwaGllcy4iKQoKKGRlZnVuIG9yZy1jaXRlLXN0ciAoa2V5KQogICJHZXR0ZXh0IGZ1 bmN0aW9uIGZvciBvcmctY2l0ZS4gTG9va3MgdXAgb3JnLWNpdGUtc3RyaW5ncyBmb3IgdGhl CiBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBLRVkuIgogIChwbGlzdC1nZXQgb3JnLWNpdGUt c3RyaW5ncyBrZXkpKQoKKGRlZnZhciBvcmctY2l0ZS1hbHBoYWJldAogICJhYmNkZWZnaGlq a2xtbm9wcXJzdHV2d3h5eiIKICAiU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFscGhhYmV0IGlu IGxvd2VyLWNhc2UgbGV0dGVycy4gWW91IGNhbgpjdXN0b21pemUgdGhpcyBpZiB5b3UgbmVl ZCBhIGRpZmZlcmVudCBhbHBoYWJldCwgZGVmYXVsdCBpcwpFbmdsaXNoLiIpCgooZGVmdmFy IG9yZy1jaXRlLW1vbnRocwogICcoIkphbnVhcnkiICJGZWJydWFyeSIgIk1hcmNoIiAiQXBy aWwiICJNYXkiICJKdW5lIiAKICAgICJKdWx5IiAiQXVndXN0IiAiU2VwdGVtYmVyIiAiT2N0 b2JlciIgIk5vdmVtYmVyIiAiRGVjZW1iZXIiKSkKCihkZWZ2YXIgb3JnLWNpdGUtbW9udGhz LWFiYnJldgogICcoIkphbiIgIkZlYiIgIk1hciIgIkFwciIgIk1heSIgIkp1biIgCiAgICAi SnVsIiAiQXVnIiAiU2VwIiAiT2N0IiAiTm92IiAiRGVjIikpCgooZGVmdW4gb3JnLWNpdGUt bnVtLXRvLWxldHRlciAobnVtKQogICJIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGxl dHRlciBudW1iZXIgTlVNIGZyb20gdGhlIGxpc3QKYSwgYiwgYy4uLiBOVU0gY2FuIGJlIG51 bWVyaWMgb3Igc3RyaW5nOyBpZiBOVU0gaXMgbmlsLCB0aGUgZW1wdHkKc3RyaW5nIGlzIHJl dHVybmVkLiIKICAod2hlbiAoc3RyaW5ncCBudW0pIChzZXRxIG51bSAoc3RyaW5nLXRvLW51 bWJlciBudW0pKSkKICAoaWYgbnVtCiAgICAgIChjaGFyLXRvLXN0cmluZyAoYXJlZiAodmNv bmNhdCBvcmctY2l0ZS1hbHBoYWJldCkgKDEtIG51bSkpKQogICAgIiIpKQoKKGRlZnZhciBv cmctY2l0ZS1tZXRob2QgJ251bWVyaWMKICAiVGhlIGJhc2ljIHJlZmVyZW5jZSBtZXRob2Qg dG8gdXNlLiBQb3NzaWJsZSB2YWx1ZXM6IAoKLSBhdXRob3ItZGF0ZTogZS5nLiBjaXRhdGlv bnMgZm9ybWF0dGVkIGFzIGAoQnJvd24sIDIwMDYpJywgCiAgd2l0aCBhbHBoYWJldGljYWxs eSBvcmRlcmVkIHJlZmVyZW5jZSBsaXN0IGF0IGVuZAotIG51bWVyaWM6IG51bWVyaWMgcmVm ZXJlbmNlcywgZS5nLiBjaXRhdGlvbnMgbGlrZSAoMSksIGFuZAogIHJlZmVyZW5jZSBsaXN0 IHdpdGggaXRlbXMgcHJlZml4ZWQgaW4gc2FtZSB3YXkuCi0gbm90ZXM6IGluc2VydGVkIGFz IE9yZyBmb290bm90ZXMuIE5vdGUgdGhhdCBsb2NhdG9yCiAgaW5mb3JtYXRpb24gaXMgY3Vy cmVudGx5IGxvc3QuCi0gdGV4dDogaW5zZXJ0ZWQgYXMgZnVsbCB0ZXh0LiIpCgooZGVmdmFy IG9yZy1jaXRlLWZvcm1hdHRlciAnYmlidGV4CiAgIlRoZSByZWZlcmVuY2UtZm9ybWF0dGlu ZyBiYWNrZW5kIHRvIHVzZS4gQ3VycmVudGx5IGJpYnRleCBpcwp0aGUgb25seSBvcHRpb24u IikKCihkZWZ1biBvcmctY2l0ZS1yZXBsYWNlLWluLWJ1ZmZlciAoc3Vic3QpCiAgIk1ha2Ug c2ltcGxlIHN1YnN0aXR1dGlvbnMgaW4gdGhlIGJ1ZmZlci4gU1VCU1QgaXMgYW4gYWxpc3Qg b2YKcmVnZXhwcyBtYXRjaGVkIHRvIHJlcGxhY2VtZW50cy4gR29lcyBiZXlvbmQKZm9ybWF0 LXJlcGxhY2Utc3RyaW5ncyBpbiB0aGF0IHJlcGxhY2VtZW50cyBjYW4gYmUgc3RyaW5ncywK c3ltYm9scywgb3IgZXhwcmVzc2lvbnMuIgogIChsZXQgKHJlcCkKICAgICh3aGlsZSBzdWJz dAogICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAod2hpbGUgKHJlLXNlYXJj aC1mb3J3YXJkIChjYXIgKGNhciBzdWJzdCkpIG5pbCB0KQoJKHNldHEgcmVwIChjZHIgKGNh ciBzdWJzdCkpKQoJKHJlcGxhY2UtbWF0Y2ggCgkgKGNvbmQgCgkgICgoc3ltYm9scCByZXAp IDsgcmVwbGFjZW1lbnQgaXMgYSBzeW1ib2wsIGdldCB2YWx1ZQoJICAgKHN5bWJvbC12YWx1 ZSByZXApKQoJICAoKGFuZCAobGlzdHAgcmVwKSAoZnVuY3Rpb25wIChjYXIgcmVwKSkpIDsg cmVwbGFjZW1lbnQgaXMgYSBmdW5jdGlvbiwKCSAgIChldmFsIHJlcCkpICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7IGV2YWx1YXRlIGl0CgkgICgoc3RyaW5ncCByZXApIHJlcCkp IDsgcmVwbGFjZW1lbnQgaXMgYSBzdHJpbmcsIHJldHVybiBpdAoJIHQpKSA7IHJlcGxhY2Ug d2l0aCBmaXhlZC1jYXNlCiAgICAgIChzZXRxIHN1YnN0IChjZHIgc3Vic3QpKSkpKQoKCihk ZWZ2YXIgb3JnLWNpdGUtZmluYWwtc3Vic3RpdHV0aW9ucwogICcoCiAgICA7OyAoIiAoKSIg LiAiIikgOyBlbXB0eSBwYXJlbnMsIGUuZy4gYmVjYXVzZSBvZiBtaXNzaW5nIGpvdXJuYWwg bnVtYmVyCiAgICA7OyAoIiwgKSIgLiAiKSIpIDsgbm90aGluZyBhZnRlciBjb21tYSwgZS5n LiBtaXNzaW5nIG1vbnRoIGluZm8KICAgICgiLygiIC4gIi8gKCIpKSA7IGdpdmUgaXRhbGlj cyBzcGFjZSB0byBicmVhdGhlIGJlZm9yZSBpc3N1ZSBudW1iZXIKIlRoZXNlIGFyZSBqdXN0 IGRpcnR5IGZpeGVzIHRvIHByb2JsZW1zIGxlZnQgYnkgb3RoZXIgZGlydHkgZml4ZXMuClRP RE86IGNsZWFuIGZpeGVzLiIpCgoKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKOzs7IEJpYlRl WC1zcGVjaWZpYyA7OzsKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKCjs7IEEgbm90ZSBvbiBM YVRlWCByZWdleHBzCjs7Cjs7IFRvIG1hdGNoIExhVGVYIGNvbW1hbmQgYXJndW1lbnRzLCBJ IGhhdmUgdXNlZAo7OyAie1xcKFtefV0rXFwpfSIuIFRoYXQncyBmaW5lIGUuZy4gaW4gb3Jn LWNpdGUtbGF0ZXgtY2l0ZS1yZSBhbmQKOzsgYmliaXRlbSBzZWFyY2hlcywgd2hpY2ggb25s eSBsb29rIGZvciBhIGNpdGVrZXkuIEhvd2V2ZXIsIHRoaXMKOzsgZmFpbHMgaWYgdGhlIGFy Z3VtZW50IGl0c2VsZiBjb250YWlucyBjdXJseSBicmFjZXMuIG9yZy1jaXRlIHJlbGllcwo7 OyBvbiBjbGVhbmluZyB0aG9zZSB1cCBmaXJzdC4gSXQgd2lsbCBub3QgYWx3YXlzIHN1Y2Nl ZWQuIEEgYmV0dGVyCjs7IGFwcHJvYWNoIGlzIG5lZWRlZC4KCgooZGVmdmFyIG9yZy1jaXRl LWxhdGV4LWNpdGUtcmUgIAogICJcXFxcXFwoLio/Y2l0ZS4qP1xcKVxcKFxcW1xcKC4rP1xc KVxcXVxcKT9cXChcXFtcXCguKz9cXClcXF1cXCk/e1xcKFtefV0rXFwpfSIKICAiUmVndWxh ciBleHByZXNzaW9uIHRvIHNlYXJjaCBhbmQgcGFyc2UgbGF0ZXggY2l0ZXMuICAKVGhlIG1h dGNoLXN0cmluZ3MgYXJlOiAKMSAtIHRoZSBjaXRlIG1hY3JvIChjaXRlLCBjaXRldCwgZXRj LiksIAoyIC0gdGhlIHByZS1ub3RlIG9wdGlvbiAoaWYgYW55KTsgCjMgLSBpdHMgY29udGVu dHMgKGUuZy4gYHNlZScpOyAKNCAtIHRoZSBwb3N0LW5vdGUgb3B0aW9uIChpZiBhbnkpOyAK NSAtIGl0cyBjb250ZW50cywgdXN1YWxseSBhIGxvY2F0b3IsIGUuZy4gcGFnZSBudW1iZXI7 IAo2IC0gdGhlIGNpdGVrZXkocykuIApUT0RPOiBNYXkgYnJlYWsgaWYgdGhlcmUncyBhIGxp bmUtYnJlYWsgaW4gYW4gb3B0aW9uLiIpCgooZGVmdmFyIG9yZy1jaXRlLWFwYWNpdGUtY2l0 ZS1yZSAKICAgIlxcXFxcXCguKj9jaXRlLio/XFwpXFwoPFxcKFtePl0rXFwpPlxcKT9cXChc XFtcXChbXl1dK1xcKVxcXVxcKT97XFwoW159XStcXCl9IgogIDs7IFdBUzogIlxcXFxcXCgu Kj9jaXRlLio/XFwpXFwoPFxcKC4rP1xcKT5cXCk/XFwoXFxbXFwoLis/XFwpXFxdXFwpP3tc XChbXn1dK1xcKX0iCiAgIlJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggYW5kIHBhcnNl IGxhdGV4IGNpdGVzLiAgClRoZSBtYXRjaC1zdHJpbmdzIGFyZSBhcyBmb3Igb3JnLWNpdGUt bGF0ZXgtY2l0ZS1yZS4iKQoKKGRlZnZhciBvcmctY2l0ZS1hcGFjaXRlLXN0cmluZ3MKICAn KDpsb2Mtc2VwICIsICIKICAgIDpub2JyZWFrICAiwqAiICAgICAgICAgICAgIDsgKGNoYXIt dG8tc3RyaW5nID9cMjQwKQkgICAgIAogICAgOmFuZCAiJiIKICAgIDpldC1hbCAiZXQgYWwu IgogICAgOm51bWJlciAiTm8uIgogICAgOnAgInAuIgogICAgOnBwICJwcC4iCiAgICA6aW4g IkluIgogICAgOmVkICJFZC4iCiAgICA6ZWRzICJFZHMuIgogICAgOmVkLWJ5ICJlZC4iCiAg ICA6ZWRuICJlZC4iCiAgICA6bm8tZGF0ZSAibi5kLiIpCiAgIkRlZmF1bHQgc3RyaW5ncyB0 byB1c2Ugd2l0aCBhcGFjaXRlLiIpCgooZGVmdmFyIG9yZy1jaXRlLWJpYnRleC1wYWNrYWdl IG5pbAoiQSBzeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBCaWJUZVggcGFja2FnZSB1c2VkLiBD dXJyZW50bHkKc3VwcG9ydGVkIG9wdGlvbnMgYXJlICduYXRiaWIgYW5kICdhcGFjaXRlLiIp CgooZGVmdmFyIG9yZy1jaXRlLWJpYmNpdGUtcmUgIlxcXFxiaWJjaXRle1xcKFtefV0rXFwp fXtcXChbXn1dK1xcKX0iCiJBbmFseXRpYyByZWdleHAgZm9yIGEgZGVmYXVsdCBiaWJjaXRl LgpNYXRjaC1zdHJpbmdzOiAxIGNpdGVrZXksIDIgbnVtYmVyaW5nLAplLmcuIFxcYmliY2l0 ZXtTbWl0aDIwMDB9ezF9IikKCihkZWZ2YXIgb3JnLWNpdGUtbmF0YmliLWJpYmNpdGUtcmUg CiAgIlxcXFxiaWJjaXRle1xcKFtefV0rXFwpfXt7XFwoW159XStcXCl9e1xcKFtefV0rXFwp fXt7XFwoW159XStcXCl9fXt7XFwoW159XStcXCl9fX0iCiJBbmFseXRpYyByZWdleHAgZm9y IGJpYmNpdGVzIHdoZW4gdXNpbmcgbmF0YmliLiAKTWF0Y2gtc3RyaW5nczogMSBjaXRla2V5 LCAyIG51bWJlcmluZywgMyB5ZWFyLCA0IHNob3J0ZW5lZAphdXRob3JsaXN0LCA1IGZ1bGwg YXV0aG9ybGlzdCwgZS5nLgpcXGJpYmNpdGV7U21pdGgyMDAwfXt7MX17MjAwMH17e1NtaXRo IGV0IGFsfX17e1NtaXRoLCBKb25lcyBhbmQgQmxhY2t9fX0iKQoKKGRlZnZhciBvcmctY2l0 ZS1hcGFjaXRlLWJpYmNpdGUtcmUgCiAgIlxcXFxiaWJjaXRle1xcKFtefV0rXFwpfXtcXFxc Y2l0ZWF1dGhvcnllYXIge1xcKC4rP1xcKX17XFwoLis/XFwpfXt7XFwoLis/XFwpfVxcKHtc XFxcQVBBQ2V4bGFiIHt7XFxcXEJDbnQge1xcKFswLTldXFwpfX19fVxcKT99fSIKOzsgV0FT OiAiXFxcXGJpYmNpdGV7XFwoW159XStcXCl9e1xcXFxjaXRlYXV0aG9yeWVhciB7XFwoLis/ XFwpfXtcXCguKz9cXCl9e3tcXFxcQVBBQ3llYXIge1xcKFswLTldK1xcKX19XFwoe1xcXFxB UEFDZXhsYWIge3tcXFxcQkNudCB7XFwoWzAtOV1cXCl9fX19XFwpP319IgoiQW5hbHl0aWMg cmVnZXhwIGZvciBiaWJjaXRlcyB3aGVuIHVzaW5nIGFwYWNpdGUuCk1hdGNoLXN0cmluZ3M6 CiAxKSBjaXRla2V5CiAyKSBhdXRob3JzbG9uZwogMykgYXV0aG9ycwogNCkgeWVhciAob3Ig bm8gZGF0ZSkKIDUpIE1heWJlIGEgc2VjdGlvbiB3aXRoIHNhbWUtYXV0aG9yLXNhbWUteWVh ciBkaXN0aW5ndWlzaGVyCiA2KSBNYXliZSBhIHNhbWUtYXV0aG9yLXNhbWUteWVhciBkaXN0 aW5ndWlzaGVyIikKCihkZWZ1biBvcmctY2l0ZS1nZXQtYmliY2l0ZXMgKGZpbGUpCiAgKGxl dCAoKHBhY2thZ2Ugb3JnLWNpdGUtYmlidGV4LXBhY2thZ2UpCglwYXRoIGJpYmNpdGVzIGJp YnN0eWxlIGJpYmNpdGUtcmUgeWVhciBrZXktY2l0YXRpb24pCiAgICAod2l0aC10ZW1wLWJ1 ZmZlcgogICAgICAodW5sZXNzIChmaWxlLWV4aXN0cy1wIChzZXRxIHBhdGggKGNvbmNhdCAi Li8iIGZpbGUgIi5hdXgiKSkpCgkoZXJyb3IgKGZvcm1hdCAib3JnLWNpdGUgY291bGQgbm90 IGZpbmQgJXMiIHBhdGgpKSkKICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzIHBhdGgpCiAg ICAgIDs7IENvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIHV0Zi04IHJlcHJlc2VudGF0 aW9uCiAgICAgIChzZXRxIGNhc2UtZm9sZC1zZWFyY2ggbmlsKQogICAgICAob3JnLWNpdGUt cmVwbGFjZS1pbi1idWZmZXIgb3JnLWNpdGUtbGF0ZXgtY2hhcnMtdXRmOCkKICAgICAgOzsg RmluZCB0aGUgYmlic3R5bGUKICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAg KHJlLXNlYXJjaC1mb3J3YXJkICJcXFxcYmlic3R5bGV7XFwoW159XStcXCl9IiBuaWwgdCkK ICAgICAgKHNldHEgYmlic3R5bGUgKG1hdGNoLXN0cmluZyAxKSkKICAgICAgKHdoZW4gKGVx dWFsIHBhY2thZ2UgJ2FwYWNpdGUpCgk7OyBjbGVhbnVwIGFwYWNpdGUgY3J1ZAoJKG9yZy1j aXRlLXJlcGxhY2UtaW4tYnVmZmVyIG9yZy1jaXRlLWFwYWNpdGUtc3Vic3RpdHV0aW9ucykp CiAgICAgIChzZXRxIGJpYmNpdGUtcmUKCSAgICAoY29uZAoJICAgICAoKGVxdWFsIHBhY2th Z2UgJ25hdGJpYikgCgkgICAgICBvcmctY2l0ZS1uYXRiaWItYmliY2l0ZS1yZSkgCgkgICAg ICgoZXF1YWwgcGFja2FnZSAnYXBhY2l0ZSkKCSAgICAgIG9yZy1jaXRlLWFwYWNpdGUtYmli Y2l0ZS1yZSkKCSAgICAgKHQgb3JnLWNpdGUtYmliY2l0ZS1yZSkpKSA7IGNsb3NlIHNldHEK ICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAgKHdoaWxlIChyZS1zZWFyY2gt Zm9yd2FyZCBiaWJjaXRlLXJlIG5pbCB0KQoJKHNldHEgeWVhcgoJICAgICAgKGNvbmQgCgkg ICAgICAgKChlcXVhbCBwYWNrYWdlICdhcGFjaXRlKSAobWF0Y2gtc3RyaW5nIDQpKQoJICAg ICAgICh0IChtYXRjaC1zdHJpbmcgMykpKSkgOyBuYXRiaWIKCTs7ICh1bmxlc3MgKGFuZCB5 ZWFyIChzdHJpbmctbWF0Y2ggIlswLTldKyIgeWVhcikpIDsgRklYTUUgLSBub3Qgd29ya2lu ZwoJOzsgICAoc2V0cSB5ZWFyIChvcmctY2l0ZS1zdHIgOm5vLWRhdGUpKSkKCShzZXRxIGtl eS1jaXRhdGlvbgoJICAgICAgKGNvbmQKCSAgICAgICA7OyBuYXRiaWIKCSAgICAgICAoKGVx dWFsIHBhY2thZ2UgJ25hdGJpYikgOyBuYXRiaWIKCQkoY29ucyAobWF0Y2gtc3RyaW5nIDEp IAoJCSAgICAgIChsaXN0IDpudW0gKG1hdGNoLXN0cmluZyAyKQoJCQkgICAgOnllYXIgeWVh cgoJCQkgICAgOmF1dGhvcnMgKG1hdGNoLXN0cmluZyA0KSAKCQkJICAgIDphdXRob3JzbG9u ZyAobWF0Y2gtc3RyaW5nIDUpKSkpCgkgICAgICAgOzsgYXBhY2l0ZQoJICAgICAgICgoZXF1 YWwgcGFja2FnZSAnYXBhY2l0ZSkgCgkJKGNvbnMgKG1hdGNoLXN0cmluZyAxKQoJCSAgICAg IChsaXN0IDphdXRob3JzbG9uZyAobWF0Y2gtc3RyaW5nIDIpCgkJCSAgICA6YXV0aG9ycyAo bWF0Y2gtc3RyaW5nIDMpCgkJCSAgICA6eWVhciAKCQkJICAgIChjb25jYXQgeWVhcgoJCQkg ICAgIDs7IHdpdGggbGV0dGVyIG1hcmtlciwgaWYgYW55CgkJCSAgICAgKGlmIChtYXRjaC1z dHJpbmcgNikKCQkJCSAob3JnLWNpdGUtbnVtLXRvLWxldHRlciAobWF0Y2gtc3RyaW5nIDYp KSkpKSkpCgkgICAgICAgOzsgcGxhaW4KCSAgICAgICAodCAoY29ucyAobWF0Y2gtc3RyaW5n IDEpIChtYXRjaC1zdHJpbmcgMikpKSkpIDsgY2xvc2Ugc2V0cSAKCShzZXRxIGJpYmNpdGVz IChjb25zIGtleS1jaXRhdGlvbiBiaWJjaXRlcykpKSA7IGNsb3NlIHdoaWxlCiAgICAgIGJp YmNpdGVzKSkpCgooZGVmdW4gb3JnLWNpdGUtZm9ybWF0LW5hdGJpYi1jaXRhdGlvbiAoY2l0 ZXR5cGUgY2l0ZWtleSBiaWJjaXRlICZvcHRpb25hbCBsb2MgcHJlKQogICJGb3JtYXQgYSBj aXRhdGlvbiBhcyBpZiB1c2luZyB0aGUgQmliVGVYIG5hdGJpYgpwYWNrYWdlLiBDSVRFVFlQ RSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogY2l0ZSwKY2l0ZXQsIGNp dGV0KiwgY2l0ZXAsIGNpdGVwKiwgY2l0ZWFsdCwgY2l0ZWFsdCosIGNpdGVhbHAsCmNpdGVh bHAqLCBjaXRlYXV0aG9yLCBjaXRlYXV0aG9yKiwgY2l0ZXllYXIsIGNpdGV5ZWFycGFyLApu b2NpdGUuIEJJQkNJVEUgc2hvdWxkIGJlIGEgcGxpc3QgaW5jbHVkaW5nIDp5ZWFyLCA6YXV0 aG9ycwphbmQgOmF1dGhvcnNsb25nOyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY2l0ZWtleXMs IHRoZSB2YWx1ZSBvZgp0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQgYW5kIGVhY2ggYmliY2l0 ZSBpcyBsb29rZWQgdXAKYWZyZXNoLiBMT0MgaXMgYSBub3RlIHRvIGFwcGVhciBhdCB0aGUg ZW5kIG9mIHRoZSBjaXRhdGlvbiAoYWthIGEKcG9zdC1ub3RlKSwgdXN1YWxseSByZWZlcmVu Y2luZyBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgd29yaywKZS5nLiBwYWdlIG51bWJlci4gUFJF IGlzIGEgbm90ZSB0byBhcHBlYXIgYmVmb3JlIHRoZSBjaXRhdGlvbiwKZS5nLiBgc2VlJy4g VGhlIGxvZ2ljYWwgb3JkZXIgb2YgTE9DIGFuZCBQUkUgaXMgcmV2ZXJzZWQgaW4gdGhlCmFy Z3VtZW50IGxpc3QgYmVjYXVzZSBMT0MgaXMgZmFyIG1vcmUgZnJlcXVlbnQuIgogIChsZXQg KChjaXRla2V5cyAoc3BsaXQtc3RyaW5nIGNpdGVrZXkgIiA/LCA/IikpIDsgYWxsb3dzIGEg c2luZ2xlIHNwYWNlCgkobG9jcyAod2hlbiBsb2MgKHNwbGl0LXN0cmluZyBsb2MgIiA/LCA/ IikpKQoJcHJldmlvdXMtYXV0aG9ycyA7IGxldHMgdXMgY2hlY2sgaWYgY3VycmVudCBhdXRo b3JzIHNhbWUgYXMgbGFzdAoJY2l0ZXQtcGFyZW5zLW9wZW4gOyBmbGFnIGlmIHdlIGhhdmUg YSBjaXRldCBwYXJlbnRoZXNpcyBvcGVuIGZvciBtb3JlIHdvcmtzIGJ5IHNhbWUgYXV0aG9y cwoJY2l0YXRpb24pCiAgICAoc2V0cSBwcmUgKGlmIHByZSAoY29uY2F0IHByZSAiICIpICIi KSkKCiAgICA7OyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgd29ya3MgaW4gb25lIGNpdGUsIGxv b3AgdGhyb3VnaCB0aGVtCiAgICAod2hpbGUgY2l0ZWtleXMKICAgICAgKHNldHEgY2l0ZWtl eSAoY2FyIGNpdGVrZXlzKSkKICAgICAgKHNldHEgbG9jIChjYXIgbG9jcykpCiAgICAgIChz ZXRxIGJpYmNpdGUgKGNkciAoYXNzb2MgY2l0ZWtleSBiaWJjaXRlcykpKQogICAgICAobGV0 ICgoYXV0aG9ycyAoaWYgKHN0cmluZy1tYXRjaCAiWypdIiBjaXRldHlwZSkKCQkJIChwbGlz dC1nZXQgYmliY2l0ZSA6YXV0aG9yc2xvbmcpCgkJICAgICAgIChwbGlzdC1nZXQgYmliY2l0 ZSA6YXV0aG9ycykpKQoJICAgICh5ZWFyIChwbGlzdC1nZXQgYmliY2l0ZSA6eWVhcikpCgkg ICAgKGxvY3N0cmluZyAoZm9ybWF0ICIlcyVzIiAgCgkJCSAgICAgICAoaWYgbG9jIChvcmct Y2l0ZS1zdHIgOmxvYy1zZXApICIiKQoJCQkgICAgICAgKG9yIGxvYyAiIikpKSkKCTs7IElm IHRoaXMgaXMgbm90IHRoZSBmaXJzdCB3b3JrLCBhZGQgYSBzZXBhcmF0b3IsIGtlZXBpbmcK CTs7IHRyYWNrIG9mIHdoZXRoZXIgd2UncmUgaW4gYW4gb3BlbiBjaXRldCBwYXJlbnRoZXNp cwoJKHdoZW4gcHJldmlvdXMtYXV0aG9ycwoJICAod2hlbiBjaXRldC1wYXJlbnMtb3BlbgoJ ICAgICh1bmxlc3MgKHN0cmluZz0gYXV0aG9ycyBwcmV2aW91cy1hdXRob3JzKQoJICAgICAg KHNldHEgY2l0YXRpb24gKGNvbmNhdCBjaXRhdGlvbiAiKSIpKQoJICAgICAgKHNldHEgY2l0 ZXQtcGFyZW5zLW9wZW4gbmlsKSkpCgkgIChzZXRxIGNpdGF0aW9uIChjb25jYXQgY2l0YXRp b24gIjsgIikpKQoJOzsgYWRkIHRoaXMgd29yawoJKHNldHEgCgkgY2l0YXRpb24KCSAoY29u Y2F0CgkgIGNpdGF0aW9uCSAgCgkgIChpZiAoc3RyaW5nPSBhdXRob3JzIHByZXZpb3VzLWF1 dGhvcnMpCgkgICAgICA7OyBpZiB0aGlzIGlzIGFub3RoZXIgd29yayBieSBhdXRob3JzIGFs cmVhZHkgbmFtZWQgaW4gdGhpcyBjaXRhdGlvbgoJICAgICAgOzsgVE9ETyBGaW5kIGEgbGVz cyBleHRlbnNpdmUgd2F5IHRvIGRvIHRoZSBmb2xsb3dpbmchCgkJICAoY29uZAoJCSAgICgo c3RyaW5nLW1hdGNoICJjaXRldCIgY2l0ZXR5cGUpIDsgbWF0Y2hlcyBjaXRldCBhbmQgY2l0 ZXQqCgkJICAgIChmb3JtYXQgIltbJXNdWyVzXV0lcyIgY2l0ZWtleSB5ZWFyIGxvY3N0cmlu ZykpCgkJICAgKChzdHJpbmctbWF0Y2ggImNpdGVhdXRob3IiIGNpdGV0eXBlKSA7IHRoaXMg c2hvdWxkbid0IGhhcHBlbgoJCSAgICAoZm9ybWF0ICJbWyVzXVslc11dJXMiIGNpdGVrZXkg YXV0aG9ycyBsb2NzdHJpbmcpKQoJCSAgICgoc3RyaW5nLW1hdGNoICJjaXRleWVhcnBhciIg Y2l0ZXR5cGUpCgkJICAgIChmb3JtYXQgIltbJXNdWyVzXV0lcyIgY2l0ZWtleSB5ZWFyIGxv Y3N0cmluZykpCgkJICAgKChzdHJpbmctbWF0Y2ggImNpdGV5ZWFyIiBjaXRldHlwZSkKCQkg ICAgKGZvcm1hdCAiW1slc11bJXNdXSVzIiBjaXRla2V5IHllYXIgbG9jc3RyaW5nKSkKCQkg ICAoKHN0cmluZy1tYXRjaCAiY2l0ZWFsdCIgY2l0ZXR5cGUpCgkJICAgIChmb3JtYXQgIltb JXNdWyVzXV0lcyIgY2l0ZWtleSB5ZWFyIGxvY3N0cmluZykpCgkJICAgKChzdHJpbmctbWF0 Y2ggImNpdGVhbHAiIGNpdGV0eXBlKQoJCSAgICAoZm9ybWF0ICJbWyVzXVslc11dJXMiIGF1 dGhvcnMgY2l0ZWtleSB5ZWFyIGxvY3N0cmluZykpCgkJICAgKChzdHJpbmctbWF0Y2ggIm5v Y2l0ZSIgY2l0ZXR5cGUpCgkJICAgICIiKQoJCSAgICgoc3RyaW5nLW1hdGNoICJjaXRlIiBj aXRldHlwZSkgOyBjaXRlIG9yIGNpdGVwCgkJICAgIChmb3JtYXQgIltbJXNdWyVzXV0lcyIg Y2l0ZWtleSB5ZWFyIGxvY3N0cmluZykpCgkJICAgKHQgCgkJICAgIChmb3JtYXQgIipbb3Jn LWNpdGUgZmFpbGVkIHRvIGZvcm1hdCA9JXM9IGNpdGF0aW9uXSoiIGNpdGV0eXBlKSkpCgkg ICAgOzsgZWxzZSAod2hlbiBhdXRob3JzIGFyZSBub3QgYWxyZWFkeSBuYW1lZCBpbiB0aGlz IGNpdGF0aW9uKQoJICAgIChjb25kCgkgICAgICgoc3RyaW5nLW1hdGNoICJjaXRldCIgY2l0 ZXR5cGUpCgkgICAgICAoZm9ybWF0ICIlcyAoW1slc11bJXNdXSVzIiBhdXRob3JzIGNpdGVr ZXkgeWVhciBsb2NzdHJpbmcpKQoJICAgICAoKHN0cmluZy1tYXRjaCAiY2l0ZWF1dGhvciIg Y2l0ZXR5cGUpCgkgICAgICAoZm9ybWF0ICJbWyVzXVslc11dJXMiIGNpdGVrZXkgYXV0aG9y cyBsb2NzdHJpbmcpKQoJICAgICAoKHN0cmluZy1tYXRjaCAiY2l0ZXllYXJwYXIiIGNpdGV0 eXBlKQoJICAgICAgKGZvcm1hdCAiW1slc11bJXNdXSVzIiBjaXRla2V5IHllYXIgbG9jc3Ry aW5nKSkKCSAgICAgKChzdHJpbmctbWF0Y2ggImNpdGV5ZWFyIiBjaXRldHlwZSkKCSAgICAg IChmb3JtYXQgIltbJXNdWyVzXV0lcyIgY2l0ZWtleSB5ZWFyIGxvY3N0cmluZykpCgkgICAg ICgoc3RyaW5nLW1hdGNoICJjaXRlYWx0IiBjaXRldHlwZSkKCSAgICAgIChmb3JtYXQgIiVz IFtbJXNdWyVzXV0lcyIgYXV0aG9ycyBjaXRla2V5IHllYXIgbG9jc3RyaW5nKSkKCSAgICAg KChzdHJpbmctbWF0Y2ggImNpdGVhbHAiIGNpdGV0eXBlKQoJICAgICAgKGZvcm1hdCAiJXMs IFtbJXNdWyVzXV0lcyIgYXV0aG9ycyBjaXRla2V5IHllYXIgbG9jc3RyaW5nKSkKCSAgICAg KChzdHJpbmctbWF0Y2ggIm5vY2l0ZSIgY2l0ZXR5cGUpCgkgICAgICAiIikKCSAgICAgKChz dHJpbmctbWF0Y2ggImNpdGUiIGNpdGV0eXBlKSA7IG90aGVyIGFsdGVybmF0aXZlcyBlbGlt aW5hdGVkLCB0aGlzIGxlYXZlcyAiY2l0ZSIgb3IgImNpdGVwIiwgYm90aCBicmFja2V0ZWQK CSAgICAgIChmb3JtYXQgIltbJXNdWyVzLCAlc11dJXMiIGNpdGVrZXkgYXV0aG9ycyB5ZWFy IGxvY3N0cmluZykpCgkgICAgICh0IAoJICAgICAgKGZvcm1hdCAiKltvcmctY2l0ZSBmYWls ZWQgdG8gZm9ybWF0ID0lcz0gY2l0YXRpb25dKiIgY2l0ZXR5cGUpKSkpKSkgOyBlbmQgc2V0 cSBjaXRhdGlvbgoJOzsgS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIG1pZ2h0IGJlIGFkZGlu ZyB0byBhbiBvcGVuIGNpdGV0IHBhcmVudGhlc2lzCgkod2hlbiAoc3RyaW5nLW1hdGNoICJj aXRldCIgY2l0ZXR5cGUpIChzZXRxIGNpdGV0LXBhcmVucy1vcGVuIHQpKQkKCTs7IExvb3Ag cm91bmQKCShzZXRxIHByZXZpb3VzLWF1dGhvcnMgYXV0aG9ycykKCShzZXRxIGxvY3MgKGNk ciBsb2NzKSkKCShzZXRxIGNpdGVrZXlzIChjZHIgY2l0ZWtleXMpKSkpIDsgZW5kIHdoaWxl IGNpdGVrZXlzCgogICAgOzsgQ2xvc2UgY2l0ZXQgYnJhY2tldCBpZiBuZWNlc3NhcnkKICAg ICh3aGVuIGNpdGV0LXBhcmVucy1vcGVuCiAgICAgIChzZXRxIGNpdGF0aW9uIChjb25jYXQg Y2l0YXRpb24gIikiKSkpCiAgICA7OyBBZGQgcHJlLW5vdGUKICAgIChzZXRxIGNpdGF0aW9u IChjb25jYXQgcHJlIGNpdGF0aW9uKSkKICAgIDs7IEJyYWNrZXQgd2hvbGUgY2l0YXRpb24s IGlmIGl0J3Mgb25lIG9mIHRob3NlIHR5cGVzCiAgICAod2hlbiAobWVtYmVyIGNpdGV0eXBl IAoJCSAgJygiY2l0ZWF1dGhvciIgImNpdGVhdXRob3IqIiAiY2l0ZXllYXJwYXIiIAoJCSAg ICJjaXRlIiAiY2l0ZSoiICJjaXRlcCIgImNpdGVwKiIpKQogICAgICAoc2V0cSBjaXRhdGlv biAoY29uY2F0ICIoIiBjaXRhdGlvbiAiKSIpKSkKICAgIDs7IFRpZHkgdXAKICAgIChzZXRx IGNpdGF0aW9uIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIn4iIChvcmctY2l0ZS1zdHIg Om5vYnJlYWspIGNpdGF0aW9uKSkKICAgIChzZXRxIGNpdGF0aW9uIChyZXBsYWNlLXJlZ2V4 cC1pbi1zdHJpbmcgIlt7fV0iICIiIGNpdGF0aW9uKSkgOzsgRklYTUUgdGhpcyBtYXkgaGlk ZSBkZWJ1Z2dpbmcgaW5mbwogICAgOzsgUmV0dXJuIGNpdGF0aW9uCiAgICBjaXRhdGlvbikp CgooZGVmdW4gb3JnLWNpdGUtZm9ybWF0LXdpdGgtYmlidGV4ICgpCiAgKGludGVyYWN0aXZl KQogIChsZXQqICgocGFja2FnZSBvcmctY2l0ZS1iaWJ0ZXgtcGFja2FnZSkgOyBuYXRiaWIs IGFwYWNpdGUsIG5pbD1wbGFpbi4uLgoJIChjaXRlLXJlIChpZiAoZXF1YWwgcGFja2FnZSAn YXBhY2l0ZSkgCgkJICAgICAgb3JnLWNpdGUtYXBhY2l0ZS1jaXRlLXJlIAoJCSAgICBvcmct Y2l0ZS1sYXRleC1jaXRlLXJlKSkKCSAobG9jLXNlcCAob3JnLWNpdGUtc3RyIDpsb2Mtc2Vw KSkKCSBtZXRob2QgZmlsZSAKCSBiaWJjaXRlcyBiaWJjaXRlIAoJIGJpYmxpc3QgOyBpZiBt ZXRob2QgaXMgJ3RleHQsIGJpYmxpc3QgaG9sZHMgdGhlIGZvcm1hdHRlZCBiaWJsaW9ncmFw aHkKCSBjaXRlZCA7IGxpc3Qgb2YgYWxyZWFkeSBjaXRlZCB3b3JrcwoJIGNpdGV0eXBlIHBy ZSBsb2MgY2l0ZWtleSBjaXRhdGlvbikKICAgIDs7IFNldCBkZWZhdWx0IG1ldGhvZAogICAg KHVubGVzcyBtZXRob2QgKHNldHEgbWV0aG9kIG9yZy1jaXRlLW1ldGhvZCkpCiAgICA7OyBT ZXQgdGhlIHN0cmluZ3MgdG8gdXNlCiAgICAoY29uZCAKICAgICAoKGVxdWFsIHBhY2thZ2Ug J2FwYWNpdGUpCiAgICAgIChzZXRxIG9yZy1jaXRlLXN0cmluZ3Mgb3JnLWNpdGUtYXBhY2l0 ZS1zdHJpbmdzKSkKICAgICAodAogICAgICAoc2V0cSBvcmctY2l0ZS1zdHJpbmdzIG9yZy1j aXRlLWRlZmF1bHQtc3RyaW5ncykpKQogICAgOzsgR2V0IGZpbGUKICAgIChzZXRxIGZpbGUg KGZpbGUtbmFtZS1zYW5zLWV4dGVuc2lvbiAKCQkoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAK CQkgKG9yCgkJICBvcmctY3VycmVudC1leHBvcnQtZmlsZQoJCSAgKGJ1ZmZlci1maWxlLW5h bWUpKSkpKQkJCQkJIAogICAgOzsgR2V0IGJpYmNpdGVzCiAgICAoc2V0cSBiaWJjaXRlcyAo b3JnLWNpdGUtZ2V0LWJpYmNpdGVzIGZpbGUpKQogICAgOzsgSWYgdXNpbmcgcmVmZXJlbmNl cyBpbiB0ZXh0LCBnZXQgdGhlIHJlZmVyZW5jZXMgbm93CiAgICAod2hlbiAoZXF1YWwgbWV0 aG9kICd0ZXh0KQogICAgICAobGV0IChwYXJ0cyB0bXBsaXN0KQoJKHNldHEgYmlibGlzdCAo c3BsaXQtc3RyaW5nIChvcmctY2l0ZS1nZXQtYmJsIGZpbGUgbWV0aG9kIGJpYmNpdGVzKSAi XG5cbiIgdCkpCgkod2hpbGUgYmlibGlzdAoJICAgKHNldHEgcGFydHMgKHNwbGl0LXN0cmlu ZyAoY2FyIGJpYmxpc3QpICI6Ojo6IikpCgkgICAoc2V0cSB0bXBsaXN0CgkJIChjb25zIChj b25zIAoJCQkob3JnLXRyaW0gKGNhciBwYXJ0cykpIDsgVE9ETyBhIGJldHRlciB3YXkgdG8g dHJpbSBuZXdsaW5lcyB0aGFuOgoJCQkocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICJcbiIg IiAiIChvcmctdHJpbSAoY2FyIChjZHIgcGFydHMpKSkpKQoJCSAgICAgICB0bXBsaXN0KSkK CSAgIChzZXRxIGJpYmxpc3QgKGNkciBiaWJsaXN0KSkpCgkoc2V0cSBiaWJsaXN0IHRtcGxp c3QpKSkKICAgIDs7OyBGb3JtYXQgY2l0YXRpb25zCiAgICA7OzsKICAgIChnb3RvLWNoYXIg KHBvaW50LW1pbikpCiAgICA7OyBBbmFseXNlIGNpdGUgbWFjcm9zCiAgICAod2hpbGUgKHJl LXNlYXJjaC1mb3J3YXJkIGNpdGUtcmUgbmlsIHQpCiAgICAgIChpZiAoZXF1YWwgcGFja2Fn ZSAnYXBhY2l0ZSkKCSAgKHNldHEgY2l0ZXR5cGUgKG1hdGNoLXN0cmluZyAxKSA7IHNlZSBv cmctY2l0ZS1sYXRleC1jaXRlLXJlCgkJcHJlIChtYXRjaC1zdHJpbmcgMykKCQlsb2MgKG1h dGNoLXN0cmluZyA1KQoJCWNpdGVrZXkgKG1hdGNoLXN0cmluZyA2KSkJCQoJOzsgZWxzZSAo bmF0YmliIG9yIHBsYWluKQoJKHNldHEgY2l0ZXR5cGUgKG1hdGNoLXN0cmluZyAxKSA7IHNl ZSBvcmctY2l0ZS1sYXRleC1jaXRlLXJlCgkgICAgICBwcmUgKGFuZCAobWF0Y2gtc3RyaW5n IDQpIChtYXRjaC1zdHJpbmcgMykpIDsgb25seSBpZiB0aGVyZSBpcyBhIHNlY29uZCwgcGVy aGFwcyBlbXB0eSwgb3B0aW9uCgkgICAgICBsb2MgKG9yIChtYXRjaC1zdHJpbmcgNSkgKG1h dGNoLXN0cmluZyAzKSkKCSAgICAgIGNpdGVrZXkgKG1hdGNoLXN0cmluZyA2KSkpCiAgICAg IChzZXRxIGJpYmNpdGUgKGNkciAoYXNzb2MgY2l0ZWtleSBiaWJjaXRlcykpKQoKCTs7IChz ZXRxIGNpdGV0eXBlIChtYXRjaC1zdHJpbmcgMSkgOyBzZWUgb3JnLWNpdGUtbGF0ZXgtY2l0 ZS1yZQoJOzsgCSAgICBwcmUgKGlmIChhbmQgKG1hdGNoLXN0cmluZyAyKQoJOzsgCQkJIChz dHJpbmc9ICI8IiAoc3Vic3RyaW5nIChtYXRjaC1zdHJpbmcgMikgMCkpKQoJOzsgCQkgICAg OzsgaWYgYXBhY2l0ZSwgdGhlIHByZS1ub3RlIGlzIGluIHNoYXJwIGJyYWNrZXRzCgk7OyAJ CSAgICAobWF0Y2gtc3RyaW5nIDMpCgk7OyAJCSAgOzsgZWxzZSAobmF0YmliKSwgbWFrZSBm aXJzdCBvcHRpb24gcHJlIG9ubHkgaWYgdGhlcmUgaXMgYSBzZWNvbmQKCTs7IAkJICAoYW5k IChtYXRjaC1zdHJpbmcgNCkgKG1hdGNoLXN0cmluZyAzKSkpCgk7OyAJICAgIGxvYyAob3Ig KG1hdGNoLXN0cmluZyA1KSAobWF0Y2gtc3RyaW5nIDMpKQoJOzsgCSAgICBjaXRla2V5ICht YXRjaC1zdHJpbmcgNikKCTs7IAkgICAgYmliY2l0ZSAoY2RyIChhc3NvYyBjaXRla2V5IGJp YmNpdGVzKSkpCgogICAgICAoY29uZAoKICAgICAgIDs7IEF1dGhvci1kYXRlIG9yIG51bWVy aWNhbCByZWZlcmVuY2VzCiAgICAgICAoKG9yIChlcXVhbCBtZXRob2QgJ2F1dGhvci1kYXRl KSAoZXF1YWwgbWV0aG9kICdudW1lcmljKSkKCShyZXBsYWNlLW1hdGNoCgkgKGNvbmQKCSAg OzsgbmF0YmliCgkgICgoZXF1YWwgcGFja2FnZSAnbmF0YmliKQoJICAgKHNhdmUtbWF0Y2gt ZGF0YQoJICAgICAob3JnLWNpdGUtZm9ybWF0LW5hdGJpYi1jaXRhdGlvbiBjaXRldHlwZSBj aXRla2V5IGJpYmNpdGUgbG9jIHByZSkpKQoJICA7OyBhcGFjaXRlIAkgIAoJICAoKGVxdWFs IHBhY2thZ2UgJ2FwYWNpdGUpCgkgICAoc2F2ZS1tYXRjaC1kYXRhCgkgICAgIDs7IFRPRE8g LSBpbXBsZW1lbnQgb3JnLWNpdGUtZm9ybWF0LWFwYWNpdGUtY2l0YXRpb24gaWYgbmVlZGVk CgkgICAgIDs7ICAgICAgICBidXQgZm9yIG5vdywgcmVseSBvbiBuYXRiaWIKCSAgICAgKHdo ZW4gKHN0cmluZy1tYXRjaCAiXmNpdGVcXCgkXFx8W155XVxcKSIgY2l0ZXR5cGUpCgkgICAg ICAgOzsgYXBhY2l0ZSBjb21tYW5kcyB0aGF0IGJlZ2luIHdpdGggImNpdGUiLCBleGNlcHQK CSAgICAgICA7OyB0aG9zZSB0aGF0IGJlZ2luIHdpdGggImNpdGV5ZWFyIiwgbWFwIHRvICJm dWxsY2l0ZSIKCSAgICAgICA7OyB0aGUgZmlyc3QgdGltZSB0aGV5IGFwcGVhciwgInNob3J0 Y2l0ZSIgdGhlcmVhZnRlcgoJICAgICAgIChzZXRxIGNpdGV0eXBlCgkJICAgICAoY29uY2F0 CgkJICAgICAgKGlmIChtZW1iZXIgY2l0ZWtleSBjaXRlZCkgInNob3J0IiAiZnVsbCIpCgkJ ICAgICAgY2l0ZXR5cGUpKSkKCSAgICAgOzsgTWFwIHRoZSBhcGFjaXRlIGNpdGUgdG8gYSBu YXRiaWIgY2l0ZXR5cGUgYW5kIGRvIHRoZSBuYXRiaWIgZm9ybWF0dGluZwoJICAgICAoaWYg KGFzc29jIGNpdGV0eXBlIG9yZy1jaXRlLWFwYWNpdGUtY2l0ZXR5cGVzKQoJCSAoc2V0cSBj aXRldHlwZSAoY2RyIChhc3NvYyBjaXRldHlwZSBvcmctY2l0ZS1hcGFjaXRlLWNpdGV0eXBl cykpKQoJICAgICAgIChzZXRxIGNpdGV0eXBlICJ1bmtub3duIikpIDsgVE9ETyBpbXByb3Zl IGVycm9yIGhhbmRsaW5nCgkgICAgIChvcmctY2l0ZS1mb3JtYXQtbmF0YmliLWNpdGF0aW9u IGNpdGV0eXBlIGNpdGVrZXkgYmliY2l0ZSBsb2MgcHJlKSkpIAoJICA7OyBwbGFpbgoJICAo dCAoZm9ybWF0ICIgKFtbJXNdWyVzJXMlc11dKSIKCQkgICBjaXRla2V5IAoJCSAgIGJpYmNp dGUKCQkgICAoaWYgbG9jIGxvYy1zZXAgIiIpCgkJICAgKG9yIGxvYyAiIikpKSkpKSA7IGNs b3NlIGNvbmQsIHJlcGxhY2UtbWF0Y2gsIG9yCgogICAgICAgOzsgRnVsbC10ZXh0IHJlZmVy ZW5jZQogICAgICAgKChlcXVhbCBtZXRob2QgJ3RleHQpCgkocmVwbGFjZS1tYXRjaAoJIChm b3JtYXQgIiVzJXMlcyIKCQkgKGNkciAoYXNzb2MgY2l0ZWtleSBiaWJsaXN0KSkgOyBiaWJs aXN0IGl0ZW0sIG5vdCBiaWJjaXRlCgkJIChpZiBsb2MgbG9jLXNlcCAiIikKCQkgKG9yIGxv YyAiIikpKSkKCiAgICAgICA7OyBGb290bm90ZSByZWZlcmVuY2UKICAgICAgICgoZXF1YWwg bWV0aG9kICdub3RlcykKCShyZXBsYWNlLW1hdGNoIChmb3JtYXQgIltmbjolc10iIGNpdGVr ZXkpKSkpIDsgZW5kIGNvbmQKICAgICAgOzsgQWRkIHRoaXMgdG8gbGlzdCBvZiBhbHJlYWR5 IGNpdGVkIHdvcmtzCiAgICAgIChzZXRxIGNpdGVkIChjb25zIGNpdGVrZXkgY2l0ZWQpKSkg OyBlbmQgd2hpbGUKCiAgOzsgSW5zZXJ0IGJpYmxpb2dyYXBoeS9yZWZlcmVuY2VzIHVubGVz cyB3ZSBoYXZlIGZ1bGwgcmVmZXJlbmNlcyBpbgogIDs7IHRleHQuIElmIHRoZXJlIGlzIGEg XGJpYmxpb2dyYXBoeSBjb21tYW5kLCBwbGFjZSBpdCB0aGVyZSwgYWZ0ZXIKICA7OyB0aGUg c3Vycm91bmRpbmcgbGF0ZXggYmxvY2sgaWYgdGhlcmUgaXMgb25lLiBFbHNlIHBsYWNlIGF0 IGVuZCBvZgogIDs7IGJ1ZmZlci4KICAodW5sZXNzIChlcXVhbCBtZXRob2QgJ3RleHQpCiAg ICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgKGlmIChzZWFyY2gtZm9yd2FyZCAiXFxi aWJsaW9ncmFwaHkiIG5pbCB0KQoJKHdoZW4gKG9yZy1pbi1ibG9jay1wICcoImxhdGV4Iikp CgkgICAgKHNlYXJjaC1mb3J3YXJkICIjK2VuZF9sYXRleCIgbmlsIHQpKQogICAgICAoZ290 by1jaGFyIChwb2ludC1tYXgpKSkKICAgIChpbnNlcnQgKG9yZy1jaXRlLWdldC1iYmwgZmls ZSBtZXRob2QgYmliY2l0ZXMpKSkpCiAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAoaWYg KGNhbGxlZC1pbnRlcmFjdGl2ZWx5LXApCiAgICAgIChtZXNzYWdlICJZb3VyIG9yaWdpbmFs IGRvY3VtZW50IGhhcyBjaGFuZ2VkLiBLaWxsIHdpdGhvdXQgc2F2aW5nIG9yIHVuZG8gKEMt YyAvKSB0byBhdm9pZCBsb3NpbmcgZGF0YS4iKQogICAgKG1lc3NhZ2UgIkRvbmUgZm9ybWF0 dGluZyBiaWJsaW9ncmFwaGljIHJlZmVyZW5jZXMiKSkpCgooZGVmdW4gb3JnLWNpdGUtZ2V0 LWJibCAoZmlsZSBtZXRob2QgYmliY2l0ZXMpCiAgIlJldHVybiB0aGUgY29udGVudHMgb2Yg YSAuYmJsIGZpbGUgb3V0cHV0IGJ5IEJpYnRleCBhcyBhCnN0cmluZyBpbiBPcmcgZm9ybWF0 LiIKICAobGV0ICgocGFja2FnZSBvcmctY2l0ZS1iaWJ0ZXgtcGFja2FnZSkKCWNpdGVrZXkK CXJldHVybnZhbHVlKQogICAgOzsgR2V0IHRoZSAuYmJsIGNvbnRlbnRzIGFuZCByZWZvcm1h dCB0aGVtIAogICAgOzsKICAgIDs7IFdlJ3JlIHVzaW5nIGEgbmFtZWQgYnVmZmVyIGZvciBk ZWJ1Z2dpbmcgcHVycG9zZXMgLS0gaWYgYmJsCiAgICA7OyBjbGVhbnVwIGZhaWxzIChhcyBp dCBvZnRlbiB3aWxsKSwgaW5zcGVjdGluZyB0aGUgY29udGVudHMgb2YKICAgIDs7IG9yZy1j aXRlLXRlbXAtYmJsIHdpbGwgc2hvdyB3aGF0IG9yZy1jaXRlIGNob2tlZCBvbi4gV2l0aCBs dWNrLAogICAgOzsgdGhlcmUnbGwgYmUgc29tZSBzdXBlcmZsdW91cyBicmFjZXMgdGhhdCBj YW4gYmUgcmVtb3ZlZCBmcm9tCiAgICA7OyB0aGUgQmliVGVYLgogICAgKHdpdGgtY3VycmVu dC1idWZmZXIgKGdldC1idWZmZXItY3JlYXRlICJvcmctY2l0ZS10ZW1wLWJibCIpCiAgICAg IChsYXRleC1tb2RlKQogICAgICAoaW5zZXJ0LWZpbGUtY29udGVudHMgKGNvbmNhdCAiLi8i IGZpbGUgIi5iYmwiKSkKICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICAgOzsg UmVtb3ZlIHRoZWJpYmxpb2dyYXBoeSBlbnZpcm9ubWVudAogICAgICAod2hpbGUgKHNlYXJj aC1mb3J3YXJkICJ7dGhlYmlibGlvZ3JhcGh5fSIgbmlsIHQpCgkobW92ZS1iZWdpbm5pbmct b2YtbGluZSBuaWwpCgkoa2lsbC13aG9sZS1saW5lKSkKICAgICAgOzsgUmVwbGFjZSBiaWJp dGVtIG1hY3JvcyB3aXRoIGxpbmsvZm9vdG5vdGUgdGFyZ2V0cwogICAgICAoZ290by1jaGFy IChwb2ludC1taW4pKQogICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcXFxcYmli aXRlbVxcKFxcW1teXV0rXFxdXFwpP3tcXChbXn1dK1xcKX0iIG5pbCB0KQoJOzsgV0FTOiAg ICAocmUtc2VhcmNoLWZvcndhcmQgIlxcXFxiaWJpdGVte1xcKFtefV0rXFwpfSIgbmlsIHQp Cgkoc2V0cSBjaXRla2V5IChtYXRjaC1zdHJpbmcgMikpCgkoY29uZAoJICgoZXF1YWwgbWV0 aG9kICdhdXRob3ItZGF0ZSkKCSAgKHJlcGxhY2UtbWF0Y2ggKGZvcm1hdCAiIyA8PCVzPj4i IGNpdGVrZXkpKSkKCSAoKGVxdWFsIG1ldGhvZCAnbnVtZXJpYykKCSAgKHJlcGxhY2UtbWF0 Y2ggCgkgICAoZm9ybWF0ICIjIDw8JXM+PlxuKCVzKSIgCgkJICAgY2l0ZWtleSAKCQkgICAo Y2RyIChhc3NvYyBjaXRla2V5IGJpYmNpdGVzKSkpKSkKCSAoKGVxdWFsIG1ldGhvZCAndGV4 dCkKCSAgKHJlcGxhY2UtbWF0Y2ggKGZvcm1hdCAiJXM6Ojo6IiBjaXRla2V5KSkpCgkgKChl cXVhbCBtZXRob2QgJ25vdGVzKQoJICAocmVwbGFjZS1tYXRjaCAoZm9ybWF0ICJbZm46JXNd IiBjaXRla2V5KSkpKSkKICAgICAgOzsgUmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0 aCB1dGY4IHJlcHJlc2VudGF0aW9uCiAgICAgIChzZXRxIGNhc2UtZm9sZC1zZWFyY2ggbmls KQogICAgICAob3JnLWNpdGUtcmVwbGFjZS1pbi1idWZmZXIgb3JnLWNpdGUtbGF0ZXgtY2hh cnMtdXRmOCkKICAgICAgOzsgUmVwbGFjZSB7XGUgLi4ufSB3aXRoIC8uLi4vLCBfey4uLn0s IF57Li4ufSBhbmQgW3NwYWNlXXsuLi59IHdpdGggbm90aGluZwogICAgICA7OyAtIFRPRE8g Y291bGQgdGhpcyBiZSBkb25lIGJ5IG9yZy1jaXRlLXJlcGxhY2UtaW4tYnVmZmVyPwogICAg ICAob3JnLWNpdGUtbGF0ZXgtY2xlYW4tYnJhY2VzKQogICAgICA7OyBEbyBhIGNvdXBsZSBt b3JlIHN1YnN0aXR1dGlvbnMgYmVmb3JlIHRhY2tsaW5nIGFwYWNpdGUKICAgICAgKG9yZy1j aXRlLXJlcGxhY2UtaW4tYnVmZmVyCiAgICAgICAnKCgiXFxcXHRleHRpdHtcXChbXn1dK1xc KX0iIC4gIi9cXDEvIikKCSAoIlxcXFx0ZXh0YmZ7XFwoW159XStcXCl9IiAuICIqXFwxKiIp KSkKICAgICAgOzsgUmVtb3ZlIEFQQUNJVEUgY3J1ZAogICAgICAod2hlbiAoZXF1YWwgcGFj a2FnZSAnYXBhY2l0ZSkKCShvcmctY2l0ZS1yZXBsYWNlLWluLWJ1ZmZlciBvcmctY2l0ZS1h cGFjaXRlLXN1YnN0aXR1dGlvbnMpKQogICAgICA7OyBSZW1vdmUgb3JkaW5hcnkgTkFUQklC IGNydWQKICAgICAgKG9yZy1jaXRlLXJlcGxhY2UtaW4tYnVmZmVyCiAgICAgICAnKCgiXFxc XG5ld2Jsb2NrIiAuICIiKSAKCSAoIn4iIC4gKG9yZy1jaXRlLXN0ciA6bm9icmVhaykpCgkg KCJcXFxcLyIgLiAiIikgOyB3ZWlyZCBcLyBzZXF1ZW5jZXMKCSAoIlxcXFwiIC4gIiIpKSkg OyBhbGwgcmVtYWluaW5nIGJhY2tzbGFzaGVzCiAgICAgIDs7IElmIGFwYWNpdGUsIHJlbW92 ZSBzaW5nbGUgZW1wdHkgbmV3bGluZXMgaWYgbm90IGZvbGxvd2VkIGJ5CiAgICAgIDs7IGxp bmsgdGFyZ2V0KQogICAgICAod2hlbiAoZXF1YWwgcGFja2FnZSAnYXBhY2l0ZSkKCShvcmct Y2l0ZS1yZXBsYWNlLWluLWJ1ZmZlciAnKCgiXG5cblxcKFteI11cXCkiIC4gIiBcXDEiKSkp KQogICAgICA7OyBUaWR5IHVwCiAgICAgIChvcmctY2l0ZS1yZXBsYWNlLWluLWJ1ZmZlciBv cmctY2l0ZS1maW5hbC1zdWJzdGl0dXRpb25zKQogICAgICA7OyBGaWxsIGFzIG9yZy1tb2Rl CiAgICAgIChvcmctbW9kZSkKICAgICAgKGZpbGwtcmVnaW9uIChwb2ludC1taW4pIChwb2lu dC1tYXgpKQogICAgICA7OyBSZXR1cm4gYXMgc3RyaW5nCiAgICAgIChzZXRxIHJldHVybnZh bHVlIChidWZmZXItc3RyaW5nKSkKICAgICAgOzsgQ2xvc2UgYnVmZmVyCiAgICAgIChraWxs LWJ1ZmZlcikpCiAgICByZXR1cm52YWx1ZSkpCgooZGVmdW4gb3JnLWNpdGUtbGF0ZXgtY2xl YW4tYnJhY2VzICgpCiAgIkNsZWFuIHVwIHZhcmlvdXMgZm9ybWF0dGluZyBpbiBjdXJseSBi cmFjZXMgd2l0aGluIHRoZSBtYWluIG1hY3Jvcy4iCiAgKGxldCAob3BlbnRhZyBjbG9zZXRh ZyBhdC1jbG9zaW5nLWJyYWNlKQogICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKICAgICh3 aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxcKFt7WzpzcGFjZTpdfl9eXG5cIictXVxcKXtc XChcXFxcZW1cXCk/XFwoIFxcKT8iIG5pbCB0KQogICAgICAoc2V0cSBhdC1jbG9zaW5nLWJy YWNlIG5pbCkKICAgICAgKGNvbmQgCiAgICAgICAoKHN0cmluZz0gKG1hdGNoLXN0cmluZyAy KSAiXFxlbSIpCgkoc2V0cSBvcGVudGFnICIgLyIgY2xvc2V0YWcgIi8iKSkKICAgICAgICgo c3RyaW5nPSAobWF0Y2gtc3RyaW5nIDEpICJeIikKCTs7KHNldHEgb3BlbnRhZyAiQDxzdXA+ IiBjbG9zZXRhZyAiQDwvc3VwPiIpKQoJKHNldHEgb3BlbnRhZyAiICIgY2xvc2V0YWcgIiIp KQogICAgICAgKChzdHJpbmc9IChtYXRjaC1zdHJpbmcgMSkgIl8iKQoJOzsoc2V0cSBvcGVu dGFnICJAPHN1Yj4iIGNsb3NldGFnICJAPC9zdWI+IikpCgkoc2V0cSBvcGVudGFnICIgIiBj bG9zZXRhZyAiIikpCiAgICAgICAoKHN0cmluZz0gKG1hdGNoLXN0cmluZyAxKSAifiIpCgko c2V0cSBvcGVudGFnICJ+IiBjbG9zZXRhZyAiICIpKQogICAgICAgKChzdHJpbmc9IChtYXRj aC1zdHJpbmcgMSkgIlwiIikgCgkoc2V0cSBvcGVudGFnICJcIiIgY2xvc2V0YWcgIiAiKSkK ICAgICAgICgoc3RyaW5nPSAobWF0Y2gtc3RyaW5nIDEpICInIikgCgkoc2V0cSBvcGVudGFn ICInIiBjbG9zZXRhZyAiICIpKQogICAgICAgKChzdHJpbmc9IChtYXRjaC1zdHJpbmcgMSkg InsiKQoJKHNldHEgb3BlbnRhZyAieyIgY2xvc2V0YWcgIiIpKQogICAgICAgKChzdHJpbmc9 IChtYXRjaC1zdHJpbmcgMSkgIlxuIikKCShzZXRxIG9wZW50YWcgIlxuIiBjbG9zZXRhZyAi IikpCiAgICAgICAodAoJKHNldHEgb3BlbnRhZyAiICIgY2xvc2V0YWcgIiIpKSkKICAgICAg KGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQogICAgICAoaWYgKG9yIChzdHJpbmc9 IChtYXRjaC1zdHJpbmcgMSkgInsiKSAgCgkgICAgICAoc3RyaW5nPSAobWF0Y2gtc3RyaW5n IDEpICJcbiIpKQoJICA7OyBpZiB0aGUgb3BlbmluZyBjdXJseSBicmFjZSBpcyByaWdodCBh ZnRlciBhIGJyYWNlIG9yCgkgIDs7IGEgbmV3bGluZSwgbW92ZSBmb3J3YXJkIHRvIHRoZSBi cmFjZSB3ZSB3YW50CgkgIChmb3J3YXJkLWNoYXIpKSAgICAgICAgICAgICAgICAKICAgICAg KHdoaWxlIChub3QgYXQtY2xvc2luZy1icmFjZSkKCShmb3J3YXJkLXNleHApCgkoaWYgKD0g MTI1IChjaGFyLWJlZm9yZSkpIChzZXRxIGF0LWNsb3NpbmctYnJhY2UgdCkpKQogICAgICAo ZGVsZXRlLWNoYXIgLTEpCiAgICAgIChpbnNlcnQgY2xvc2V0YWcpCiAgICAgIChyZXBsYWNl LW1hdGNoIG9wZW50YWcpKSkpCgooZGVmdmFyIG9yZy1jaXRlLWFwYWNpdGUtY2l0ZXR5cGVz CiAgJygoImZ1bGxjaXRlIiAuICJjaXRlcCoiKSA7IChCbGFjaywgR3JlZW4gYW5kIEJyb3du LCAyMDExKQogICAgKCJzaG9ydGNpdGUiIC4gImNpdGVwIikgOyAoQmxhY2sgZXQgYWwuLCAy MDExKQogICAgKCJmdWxsY2l0ZU5QIiAuICJjaXRlYWxwKiIpIDsgQmxhY2ssIEdyZWVuIGFu ZCBCcm93biwgMjAxMQogICAgKCJzaG9ydGNpdGVOUCIgLiAiY2l0ZWFscCIpIDsgQmxhY2sg ZXQgYWwuLCAyMDExCiAgICA7OyB0aGVyZSdzIG5vIGFwYWNpdGUgZXF1aXZhbGVudCBvZiBu YXRiaWIgY2l0ZWFsdCgqKQogICAgKCJmdWxsY2l0ZUEiIC4gImNpdGV0KiIpIDsgQmxhY2ss IEdyZWVuIGFuZCBCcm93biAoMjAxMSkKICAgICgic2hvcnRjaXRlQSIgLiAiY2l0ZXQiKSA7 IEJsYWNrIGV0IGFsLiAoMjAxMSkKICAgICgiZnVsbGNpdGVhdXRob3IiIC4gImNpdGVhdXRo b3IqIikgOyAoQmxhY2ssIEdyZWVuIGFuZCBCcm93bikgTk8gLSBuYXRiaWIgZG9lc24ndCBo YXZlIGEgImNpdGVhdXRob3JwYXIqIgogICAgKCJzaG9ydGNpdGVhdXRob3IiIC4gImNpdGVh dXRob3IiKSA7IChCbGFjayBldCBhbC4pIE5PIC0gZGl0dG8KICAgICgiZnVsbGNpdGVhdXRo b3JOUCIgLiAiY2l0ZWF1dGhvcioiKSA7IEJsYWNrLCBHcmVlbiBhbmQgQnJvd24KICAgICgi c2hvcnRjaXRlYXV0aG9yTlAiIC4gImNpdGVhdXRob3IiKSA7IEJsYWNrIGV0IGFsLgogICAg KCJjaXRleWVhciIgLiAiY2l0ZXllYXJwYXIiKSA7ICgyMDExKQogICAgKCJjaXRleWVhck5Q IiAuICJjaXRleWVhciIpIDsgMjAxMQogICAgKCJub2NpdGUiIC4gIm5vY2l0ZSIpIDsgCiAg ICAoIm5vY2l0ZW1ldGEiIC4gIm5vY2l0ZSIpKSA7IE5PVCBRVUlURSAtIG5hdGJpYiBkb2Vz bid0IGhhdmUgdGhpcwoiTWFwcyBhcGFjaXRlIGNpdGUgY29tbWFuZHMgdG8gdGhlIGNvcnJl c3BvbmRpbmcgbmF0YmliCmNvbW1hbmRzLiBUaGUgYXBhY2l0ZSBjb21tYW5kcyBiZWdpbm5p bmcgd2l0aCBgY2l0ZScgYXJlIG5vdAppbmNsdWRlZCwgYXMgdGhleSBhcmUgbWFwcGVkIHRv IHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmRzCmJlZ2lubmluZyB3aXRoIGBmdWxsJyBvciBg c2hvcnQnIGJlZm9yZSB0aGlzIHRhYmxlIGlzIGxvb2tlZCB1cC4KCk1BWUJFIFRPRE86IEZv ciBmdWxsIEFQQSBzdXBwb3J0LCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGRlZmluZSBhCnNl cGFyYXRlIGNpdGF0aW9uLWZvcm1hdHRpbmcgZnVuY3Rpb24gZm9yIGFwYWNpdGVzLCBidXQg Zm9yIG5vdwp3ZSB0cnkgY2hlYXRpbmcuIikKCihkZWZ2YXIgb3JnLWNpdGUtYXBhY2l0ZS1z dWJzdGl0dXRpb25zCiAgJygoIiVcbiIgLiAiIikKICAgICgiXFxcXG5vYnJlYWtzcGFjZSAi IC4gKG9yZy1jaXRlLXN0ciA6bm9icmVhaykpCiAgICA7OyBJIGhhdmUgbm8gaWRlYSBpZiB0 aGVzZSBjb21wbGljYXRlZCBleHByZXNzaW9ucyBhcmUgbmVjZXNzYXJ5LgogICAgOzsgV2ls bCBoYXZlIHRvIGxvb2sgbW9yZSBpbnRvIGFwYWNpdGUuCiAgICAoIlxcXFxCQXN0eWxlXFwo e1xcKFtefV0qXFwpfVxcKT8iIC4gIiIpCiAgICAoIlxcXFxCQWFzdHlsZVxcKHtcXChbXn1d KlxcKX1cXCk/IiAuICIiKQogICAgKCJcXFxcQkFuZFxcKHtcXChbXn1dKlxcKX1cXCk/IiAu IChvcmctY2l0ZS1zdHIgOmFuZCkpIDsgZWQuIEFORCB0cmFucy4KICAgICgiXFxcXEJCT1Bc XCh7XFwoW159XSpcXCl9XFwpPyIgLiAiKCIpCiAgICAoIlxcXFxCQkNQXFwoe1xcKFtefV0q XFwpfVxcKT8iIC4gIikiKQogICAgKCJcXFxcQkFQXFwoe1xcKFtefV0qXFwpfVxcKT8iIC4g IiAiKQogICAgKCJcXFxcQkJBQVxcKHtcXChbXn1dKlxcKX1cXCk/IiAuIChvcmctY2l0ZS1z dHIgOmFuZCkpCiAgICAoIlxcXFxCQkFcXCh7XFwoW159XSpcXCl9XFwpPyIgLiAob3JnLWNp dGUtc3RyIDphbmQpKQogICAgKCJcXFxcQkJBQVxcKHtcXChbXn1dKlxcKX1cXCk/IiAuIChv cmctY2l0ZS1zdHIgOmFuZCkpCiAgICAoIlxcXFxCT3RoZXJzXFwoUGVyaW9kXFx8IFxcKXsu fSIgLiAob3JnLWNpdGUtc3RyIDpldC1hbCkpCiAgICAoIlxcXFxCQkFZXFwoe1xcKFtefV0q XFwpfVxcKT8iIC4gIiwgIikgOyBiZXR3ZWVuIGF1dGhvciBhbmQgeWVhcgogICAgKCJcXFxc QkJZWVxcKHtcXChbXn1dKlxcKX1cXCk/IiAuICIsICIpIDsgYmV0d2VlbiBzdWJzZXF1ZW50 IHllYXJzICAgCiAgICAoIlxcXFxCQk5cXCh7XFwoW159XSpcXCl9XFwpPyIgLiAiLCAiKSAg OyBiZWZvcmUgYSBwb3N0Zml4IG5vdGUgKGxvY2F0b3IpICAKICAgICgiXFxcXEJCT1FcXCh7 XFwoW159XSpcXCl9XFwpPyIgLiAiIikgOyBUT0RPIG9wZW5pbmcgcXVvdGUgaW4gdGl0bGUK ICAgICgiXFxcXEJCQ1FcXCh7XFwoW159XSpcXCl9XFwpPyIgLiAiIikgOyBUT0RPIGNsb3Np bmcgcXVvdGUgaW4gdGl0bGUKICAgICgiXFxcXEJCQ1xcKHtcXChbXn1dKlxcKX1cXCk/IiAu ICI7ICIpICA7IGJldHdlZW4gbXVsdGlwbGUgY2l0ZXMKICAgICgiXFxcXEJQQklcXCh7XFwo W159XSpcXCl9XFwpPyIgLiAiLn4iKSA7IFBlcmlvZCBiZXR3ZWVuIGluaXRpYWwKICAgICgi XFxcXEJIQklcXCh7XFwoW159XSpcXCl9XFwpPyIgLiAiLi0iKSA7IEh5cGhlbiBiZXR3ZWVu IGluaXRpYWxzCiAgICAoIlxcXFxCQ0JMXFwoe1xcKFtefV0qXFwpfVxcKT8iIC4gIiwiKSA7 IGNvbW1hIGJlZm9yZSBsYXN0IGF1dGhvcgogICAgKCJcXFxcQkNCVFxcKHtcXChbXn1dKlxc KX1cXCk/IiAuICIsIikgOyBjb21tYSBiZXR3ZWVuIGF1dGhvcgogICAgKCJcXFxcQkluXFwo e1xcKFtefV0qXFwpfVxcKT8iIC4gKG9yZy1jaXRlLXN0ciA6aW4pKSA7IHBhcnQgb2Ygb3Ro ZXIgd29yawogICAgKCJcXFxcQkVEU1xcKHtcXChbXn1dKlxcKX1cXCk/IiAuIChvcmctY2l0 ZS1zdHIgOmVkcykpIDsgQm9vayBlZGl0b3JzCiAgICAoIlxcXFxCRURcXCh7XFwoW159XSpc XCl9XFwpPyIgLiAob3JnLWNpdGUtc3RyIDplZCkpIDsgQm9vayBlZGl0b3IKICAgICgiXFxc XEJFZCIgLiAob3JnLWNpdGUtc3RyIDplZG4pKSAgOyBhYmJyZXZpYXRpb24gZm9yICJlZGl0 aW9uIgogICAgKCJcXFxcQlRSXFwoe1xcKFtefV0qXFwpfVxcKT8iIC4gIlRlY2guIFJlcC4i KSAKICAgICgiXFxcXEJQR1NcXCh7XFwoW159XSpcXCl9XFwpPyIgLiAob3JnLWNpdGUtc3Ry IDpwcCkpIDsgYmV0d2VlbiBwYWdlcwogICAgKCJcXFxcQk5VTVxcKHtcXChbXn1dKlxcKX1c XCk/IiAuIChvcmctY2l0ZS1zdHIgOm51bWJlcikpIDsgTm9uLWpvdXJuYWwtaXNzdWUgbnVt YmVyLCBlLmcuIFJlcG9ydCBOby4KICAgIDs7IFRoZSBmb2xsb3dpZyB0aHJlZSBhcmUgaW1w b3J0YW50IGZvciBjbGVhbmluZyB1cCBuby1kYXRlIGJpYmNpdGVzIAogICAgKCJcXFxcYmli bm9kYXRle30iIC4gKG9yZy1jaXRlLXN0ciA6bm8tZGF0ZSkpIDsgVE9ETyBjaGVjayBmb3Jt YXQKICAgICgie1xcXFxiaWJub2RhdGUge319IiAuIChvcmctY2l0ZS1zdHIgOm5vLWRhdGUp KSA7IE5PVEUgdGhpcyBpcyBzb21lIHdlaXJkbmVzcyB0aGF0IGNyb3BzIHVwIGluIC5hdXgg ZmlsZXMKICAgICgiXFxcXEFQQUN5ZWFyIHtcXChbXn1dK1xcKX0iIC4gIlxcMSIpCiAgICAo IlxcXFxiaWJjb21wdXRlcnNvZnR3YXJlbWFudWFsIiAuICJjb21wdXRlciBzb2Z0d2FyZSBt YW51YWwiKSA7IFRPRE8gY2hlY2sgZm9ybWF0CiAgICAoIlxcXFx1bnNraXAiIC4gIiIpCiAg ICAoIlxcXFxwcm90ZWN0IiAuICIiKQogICAgKCJcXFxcJiIgLiAiJiIpCiAgICAoIntcXFxc QkNudHtcXChbMC05XVxcKX19IiAuIChvcmctY2l0ZS1udW0tdG8tbGV0dGVyIChtYXRjaC1z dHJpbmcgMSkpKSA7IHllYXIgbGV0dGVyCiAgICAoIiB7fSIgLiAiIikKICAgICgiXFxcXCAi IC4gIiAiKQogICAgKCJcXFxcQVBBQ2luc2VydG1ldGFzdGFye1xcKFtefV0rXFwpfSIgLiAi XG4iKSA7IEJlZm9yZSB0aGUgYXV0aG9ybGlzdAogICAgKCJcXFxcQVBBQ2NpdGVhdGl0bGV7 XFwoW159XStcXCl9IiAuICLigJxcXDHigJ0iKSA7IENpdGUgYXJ0aWNsZSB0aXRsZSBpbiB0 ZXh0CiAgICAoIlxcXFxBUEFDY2l0ZWJ0aXRsZXtcXChbXn1dK1xcKX0iIC4gIi9cXDEvIikg OyBDaXRlIGJvb2sgdGl0bGUgaW4gdGV4dAogICAgKCJcXFxcQVBBQ21vbnRoe1xcKFswLTld K1xcKX0iIC4gKG50aCAoMS0gKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAxKSkp IG9yZy1jaXRlLW1vbnRocykpIDsKICAgICgiXFxcXEFQQUNyZWZZZWFyTW9udGhEYXl7XFwo W159XSpcXCl9e1xcKFtefV0rXFwpP317XFwoW159XStcXCk/fSIgLiA7OyAiKFxcMSwgXFwy KSIpCiAgICAgKGNvbmNhdCAiKFxcMSIKICAgICAJICAgICAod2hlbiAobWF0Y2gtc3RyaW5n IDIpICIsIFxcMiIpCgkgICAgICh3aGVuIChtYXRjaC1zdHJpbmcgMykgIiBcXDMiKQoJICAg ICAiKSIpKQogICAgKCJcXFxcQVBBQ3JlZlllYXJ7XFwoW159XStcXCl9IiAuICIoXFwxKSIp CiAgICAoIlxcXFxBUEFDcmVmYXRpdGxle1xcKFtefV0rXFwpfXtcXChbXn1dK1xcKX0iIC4g IlxcMSIpIDsgYXJ0aWNsZSB0aXRsZSAoXFwxIGlzIGxvd2VyY2FzZWQpCiAgICAoIlxcXFxB UEFDcmVmYnRpdGxle1xcKFtefV0rXFwpfXtcXChbXn1dK1xcKX0iIC4gIi9cXDEvIikgOyBi b29rIHRpdGxlIChcXDEgaXMgbG93ZXJjYXNlZCkKICAgICgiXFxcXEFQQUNyZWZub3Rle1xc KFtefV0rXFwpfSIgLiAiKFxcMSkiKSA7IFRPRE8gY2hlY2sgZm9ybWF0dGluZyAoYnJhY2tl dHM/KQogICAgKCJcXFxcQVBBQ2pvdXJuYWxWb2xOdW1QYWdlc3tcXChbXn1dKlxcKX17XFwo W159XStcXCk/fXtcXChbXn1dK1xcKT99e1xcKFtefV0rXFwpP30iIC4gCiAgICAgKGNvbmNh dCAiL1xcMSIKCSAgICAgKGlmIChtYXRjaC1zdHJpbmcgMikgIiwgXFwyLyAiICIvICIpCgkg ICAgICh3aGVuIChtYXRjaC1zdHJpbmcgMykgIihcXDMpIikKCSAgICAgKHdoZW4gKG1hdGNo LXN0cmluZyA0KSAiLCBcXDQiKSkpCiAgICAoIlxcXFxBUEFDYlZvbEVkVFJ7XFwoW159XSpc XCl9e1xcKFtefV0qXFwpfSIgLiAiXFwxIFxcMiIpIDsgbm90IHN1cmUgYWJvdXQgdGhpcyBv bmUKICAgICgiXFxcXEFQQUNhZGRyZXNzUHVibGlzaGVye1xcKFtefV0rXFwpP317XFwoW159 XStcXCk/fSIgLiAKICAgICAoY29uY2F0IChtYXRjaC1zdHJpbmcgMSkgCgkgICAgICh3aGVu IChhbmQgKG1hdGNoLXN0cmluZyAxKSAobWF0Y2gtc3RyaW5nIDIpKSAiOiAiKSAKCSAgICAg KG1hdGNoLXN0cmluZyAyKSkpCiAgICAoIlxcXFxBUEFDYWRkcmVzc1B1Ymxpc2hlckVxQXV0 aHtcXChbXn1dK1xcKX17XFwoW159XStcXCl9IiAuICJcXDE6IFxcMiIpCiAgICAoIlxcXFxB UEFDYWRkcmVzc0luc3RpdHV0aW9ue1xcKFtefV0rXFwpfXtcXChbXn1dK1xcKX0iIC4gIlxc MTogXFwyIikKICAgICgiXFxcXEFQQUNob3dwdWJsaXNoZWR7XFwoW159XStcXCl9IiAuICJc XDEiKQogICAgKCJcXFxcYmVnaW57QVBBQ3JlZlVSTH0iIC4gIkF2YWlsYWJsZSBmcm9tICIp CiAgICAoIlxcXFx1cmx7XFwoW159XStcXCl9IiAuICJcXDEiKQogICAgKCJcXFxcZW5ke0FQ QUNyZWZVUkx9IiAuICIiKQogICAgKCJcXFxcUHJpbnRCYWNrUmVmc3tcXChbXn1dK1xcKX0i IC4gIlxuIikKICAgICgiXFxcXFByaW50T3JkaW5hbHtcXChbXn1dK1xcKX0iIC4gIlxcMSIp KQoiU3Vic3RpdHV0aW9ucyBmb3IgdGhlIHNlbWFudGljIGNydWQgbGVmdCBpbiBMYVRlWCBh dXggYW5kIGJibApmaWxlcyBieSBhcGFjaXRlLiIpCgoKKGRlZnVuIG9yZy1jaXRlLW1hcC1j aGFycyAoJm9wdGlvbmFsIHNvdXJjZSB0YXJnZXQgaW5jbHVkZS1tYXRoIHRvLXN0cmluZykK ICAiVXRpbGl0eSB0byBleHRyYWN0IGZyb20gb3JnLWVudGl0aWVzIGFuIGFsaXN0IG9mIHNw ZWNpYWwKY2hhcmFjdGVycy9tYXJrdXAgaW4gdGhlIFNPVVJDRSBlbmNvZGluZyBhbmQgdGhl aXIgZXF1aXZhbGVudHMgaW4KdGhlIFRBUkdFVCBlbmNvZGluZyAoZm9yIGFuIGV4YW1wbGUs IHNlZQpvcmctY2l0ZS1sYXRleC1jaGFycy11dGY4KS4gU09VUkNFIGFuZCBUQVJHRVQgZGVm YXVsdCB0byBsYXRleAphbmQgdXRmOCByZXNwZWN0aXZlbHkuIE90aGVyIG9wdGlvbnMgYXJl IG9yZywgaHRtbCwgYXNjaWkgYW5kCmxhdGluMS4gVGhlIGxpc3QgaXMgZXh0cmFjdGVkIGZy b20gb3JnLWVudGl0aWVzLiBJZiBJTkNMVURFLU1BVEgKaXMgbm9uLW5pbCwgY2hhcmFjdGVy cyB0aGF0IG5lZWQgdG8gYmUgaW4gbWF0aC1tb2RlIGluIExhVGVYIGFyZQphbHNvIGluY2x1 ZGVkLiBJZiBUTy1TVFJJTkcgaXMgbm9uLW5pbCwgcmVzdWx0cyBhcmUgcmV0dXJuZWQgYXMg YQpzdHJpbmcgb2YgZWxpc3AgcmF0aGVyIHRoYW4gYXMgYSBsaXN0LiIKICAobGV0ICgoZW50 aXRpZXMgKHJldmVyc2Ugb3JnLWVudGl0aWVzKSkKCShmaWVsZHMgJygob3JnIC4gMCkgKGxh dGV4IC4gMSkgKG1hdGhwIC4gMikgKGh0bWwgLiAzKSAKCQkgIChhc2NpaSAuIDQpIChsYXRp bjEgLiA1KSAodXRmOCAuIDYpKSkKCWNoYXJtYXAKCXJlY29yZCBzb3VyY2VjaGFyIHRhcmdl dGNoYXIpCiAgICAodW5sZXNzIHNvdXJjZQogICAgICAoc2V0cSBzb3VyY2UgJ2xhdGV4Cgkg ICAgdGFyZ2V0ICd1dGY4KSkKICAgICh3aGlsZSBlbnRpdGllcwogICAgICAoc2V0cSByZWNv cmQgKGNhciBlbnRpdGllcykpCiAgICAgICh3aGVuIChhbmQgKGxpc3RwIHJlY29yZCkgIDsg dGhpcyBpcyBhbiBlbnRyeSBpbiBvcmctZW50aXRpZXMKCQkgKG9yIChub3QgKG50aCAyIHJl Y29yZCkpIDsgYW5kIGl0IGVpdGhlciBpcyBub3QgbWF0aC1vbmx5CgkJICAgICBpbmNsdWRl LW1hdGgpKSAgOyBvciB3ZSBpbmNsdWRlIG1hdGgKCShzZXRxIHNvdXJjZWNoYXIgKG50aCAo Y2RyIChhc3NvYyBzb3VyY2UgZmllbGRzKSkgcmVjb3JkKQoJICAgICAgdGFyZ2V0Y2hhciAo bnRoIChjZHIgKGFzc29jIHRhcmdldCBmaWVsZHMpKSByZWNvcmQpKQoJKHdoZW4gKGVxIHNv dXJjZSAnbGF0ZXgpCgkgIDs7IERvbid0IGluY2x1ZGUgaXQgaWYgaXQgZG9lc24ndCBzdGFy dCB3aXRoIGEgIlwiCgkgICh1bmxlc3MgKHN0cmluZy1tYXRjaCAiXFxcXCIgc291cmNlY2hh cikgKHNldHEgc291cmNlY2hhciAiIikpCgkgIDs7IEFkZCBtYXRjaHN0aWNrcyBmb3IgbWF0 Y2hpbmcgcmF0aGVyIHRoYW4gcmVwbGFjaW5nCgkgIChzZXRxIHNvdXJjZWNoYXIgKHJlcGxh Y2UtcmVnZXhwLWluLXN0cmluZyAiXFxcXCIgIlxcXFxcXFxcXFxcXFxcXFwiIHNvdXJjZWNo YXIpKSkKCSh1bmxlc3MgKHN0cmluZz0gc291cmNlY2hhciAiIikKCSAgKHNldHEgY2hhcm1h cCAKCQkoaWYgdG8tc3RyaW5nIAoJCSAgICAoY29uY2F0ICJcbihcIiIgc291cmNlY2hhciAi XCIgLiBcIiIgdGFyZ2V0Y2hhciAiXCIpIiBjaGFybWFwKQoJCSAgKGNvbnMgKGNvbnMgc291 cmNlY2hhciB0YXJnZXRjaGFyKSBjaGFybWFwKSkpKSkKCShzZXRxIGVudGl0aWVzIChjZHIg ZW50aXRpZXMpKSkKICAgIGNoYXJtYXApKQoKKG9yZy1jaXRlLW1hcC1jaGFycyAnbGF0ZXgg J3V0ZjgpCgooZGVmdmFyIG9yZy1jaXRlLWxhdGV4LWNoYXJzLXV0ZjgKICAgICAgJygoIlxc XFxge0F9IiAuICLDgCIpCgkoIlxcXFxge2F9IiAuICLDoCIpCgkoIlxcXFwne0F9IiAuICLD gSIpCgkoIlxcXFwne2F9IiAuICLDoSIpCgkoIlxcXFxee0F9IiAuICLDgiIpCgkoIlxcXFxe e2F9IiAuICLDoiIpCgkoIlxcXFx+e0F9IiAuICLDgyIpCgkoIlxcXFx+e2F9IiAuICLDoyIp CgkoIlxcXFxcIntBfSIgLiAiw4QiKQoJKCJcXFxcXCJ7YX0iIC4gIsOkIikKCSgiXFxcXEFB e30iIC4gIsOFIikKCSgiXFxcXEFBe30iIC4gIsOFIikKCSgiXFxcXGFhe30iIC4gIsOlIikK CSgiXFxcXEFFe30iIC4gIsOGIikKCSgiXFxcXGFle30iIC4gIsOmIikKCSgiXFxcXGN7Q30i IC4gIsOHIikKCSgiXFxcXGN7Y30iIC4gIsOnIikKCSgiXFxcXCd7Q30iIC4gIsSGIikgOyBs YXQyOiBDYWN1dGUgCgkoIlxcXFwne2N9IiAuICLEhyIpIDsgbGF0MjogY2FjdXRlIAoJKCJc XFxcdntDfSIgLiAixIwiKSA7IGxhdDI6IENjYXJvbiAKCSgiXFxcXHZ7Y30iIC4gIsSNIikg OyBsYXQyOiBjY2Fyb24gCgkoIlxcXFxee0N9IiAuICLEiCIpIDsgbGF0MjogQ2NpcmMKCSgi XFxcXF57Y30iIC4gIsSJIikgOyBsYXQyOiBjY2lyYyAKCSgiXFxcXERKIiAuICLEkCIpICAg OyBsYXQyOiBEc3Ryb2sKCSgiXFxcXGRqIiAuICLEkSIpICAgOyBsYXQyOiBkc3Ryb2sgCgko IlxcXFxge0V9IiAuICLDiCIpCgkoIlxcXFxge2V9IiAuICLDqCIpCgkoIlxcXFwne0V9IiAu ICLDiSIpCgkoIlxcXFwne2V9IiAuICLDqSIpCgkoIlxcXFxee0V9IiAuICLDiiIpCgkoIlxc XFxee2V9IiAuICLDqiIpCgkoIlxcXFxcIntFfSIgLiAiw4siKQoJKCJcXFxcXCJ7ZX0iIC4g IsOrIikKCSgiXFxcXF57R30iIC4gIsScIikgOyBsYXQyOiBHY2lyYwoJKCJcXFxcXntnfSIg LiAixJ0iKSA7IGxhdDI6IGdjaXJjIAoJKCJcXFxcXntIfSIgLiAixKQiKSA7IGxhdDI6IEhj aXJjCgkoIlxcXFxee2h9IiAuICLEpSIpIDsgbGF0MjogaGNpcmMgCgkoIlxcXFxge0l9IiAu ICLDjCIpCgkoIlxcXFxge2l9IiAuICLDrCIpCgkoIlxcXFwne0l9IiAuICLDjSIpCgkoIlxc XFwne2l9IiAuICLDrSIpCgkoIlxcXFxee0l9IiAuICLDjiIpCgkoIlxcXFxee2l9IiAuICLD riIpCgkoIlxcXFxcIntJfSIgLiAiw48iKQoJKCJcXFxcXCJ7aX0iIC4gIsOvIikKCSgiXFxc XF57Sn0iIC4gIsS0IikgOyBsYXQyOiBKY2lyYwoJKCJcXFxcXntqfSIgLiAixLUiKSA7IGxh dDI6IGpjaXJjIAoJKCJcXFxcfntOfSIgLiAiw5EiKQoJKCJcXFxcfntufSIgLiAiw7EiKQoJ KCJcXFxcYHtPfSIgLiAiw5IiKQoJKCJcXFxcYHtvfSIgLiAiw7IiKQoJKCJcXFxcJ3tPfSIg LiAiw5MiKQoJKCJcXFxcJ3tvfSIgLiAiw7MiKQoJKCJcXFxcXntPfSIgLiAiw5QiKQoJKCJc XFxcXntvfSIgLiAiw7QiKQoJKCJcXFxcfntPfSIgLiAiw5UiKQoJKCJcXFxcfntvfSIgLiAi w7UiKQoJKCJcXFxcXCJ7T30iIC4gIsOWIikKCSgiXFxcXFwie299IiAuICLDtiIpCgkoIlxc XFxPIiAuICLDmCIpCgkoIlxcXFxve30iIC4gIsO4IikKCSgiXFxcXE9Fe30iIC4gIsWSIikK CSgiXFxcXG9le30iIC4gIsWTIikKCSgiXFxcXHZ7U30iIC4gIsWgIikKCSgiXFxcXHZ7c30i IC4gIsWhIikKCSgiXFxcXF57U30iIC4gIsWcIikgOyBsYXQyOiBTY2lyYwoJKCJcXFxcXntz fSIgLiAixZ0iKSA7IGxhdDI6IHNjaXJjIAoJKCJcXFxcc3N7fSIgLiAiw58iKQoJKCJcXFxc YHtVfSIgLiAiw5kiKQoJKCJcXFxcYHt1fSIgLiAiw7kiKQoJKCJcXFxcJ3tVfSIgLiAiw5oi KQoJKCJcXFxcJ3t1fSIgLiAiw7oiKQoJKCJcXFxcXntVfSIgLiAiw5siKQoJKCJcXFxcXnt1 fSIgLiAiw7siKQoJKCJcXFxcXCJ7VX0iIC4gIsOcIikKCSgiXFxcXFwie3V9IiAuICLDvCIp CgkoIlxcXFx1e1V9IiAuICLFrCIpIDsgbGF0MjogVWJyZXZlCgkoIlxcXFx1e3V9IiAuICLF rSIpIDsgbGF0MjogdWJyZXZlCgkoIlxcXFwne1l9IiAuICLDnSIpCgkoIlxcXFwne3l9IiAu ICLDvSIpCgkoIlxcXFxcIntZfSIgLiAixbgiKQoJKCJcXFxcXCJ7eX0iIC4gIsO/IikKCSgi XFxcXHZ7Wn0iIC4gIsW9IikgOyBsYXQyCgkoIlxcXFx2e3p9IiAuICLFviIpIDsgbGF0MgoJ KCJcXFxcREh7fSIgLiAiw5AiKQoJKCJcXFxcZGh7fSIgLiAiw7AiKQoJKCJcXFxcVEh7fSIg LiAiw54iKQoJKCJcXFxcdGh7fSIgLiAiw74iKQoJKCJcXFxcZG90c3t9IiAuICLigKYiKQoJ KCJcXFxcZG90c3t9IiAuICLigKYiKQoJKCJcXFxcdGV4dHBlcmlvZGNlbnRlcmVke30iIC4g IsK3IikKCSgiXFxcXC0iIC4gIiIpCgkoIlxcXFx0ZXh0cXVvdGVkYmx7fSIgLiAiXCIiKQoJ KCJcXFxcdGV4dGFzY2lpYWN1dGV7fSIgLiAiwrQiKQoJKCJcXFxcdGV4dHF1b3RlZGJsbGVm dHt9IiAuICLigJwiKQoJKCJcXFxcdGV4dHF1b3RlZGJscmlnaHR7fSIgLiAi4oCdIikKCSgi XFxcXHF1b3RlZGJsYmFzZXt9IiAuICLigJ4iKQoJKCJcXFxcdGV4dHF1b3RlbGVmdHt9IiAu ICLigJgiKQoJKCJcXFxcdGV4dHF1b3RlcmlnaHR7fSIgLiAi4oCZIikKCSgiXFxcXHF1b3Rl c2luZ2xiYXNle30iIC4gIuKAmiIpCgkoIlxcXFxndWlsbGVtb3RsZWZ0e30iIC4gIsKrIikK CSgiXFxcXGd1aWxsZW1vdHJpZ2h0e30iIC4gIsK7IikKCSgiXFxcXGd1aWxzaW5nbGxlZnR7 fSIgLiAi4oC5IikKCSgiXFxcXGd1aWxzaW5nbHJpZ2h0e30iIC4gIuKAuiIpCgkoIlxcXFx0 ZXh0YnJva2VuYmFye30iIC4gIsKmIikKCSgiXFxcXFMiIC4gIsKnIikKCSgiXFxcXCYiIC4g IiYiKQoJKCJcXFxcdGV4dGxlc3N7fSIgLiAiPCIpCgkoIlxcXFx0ZXh0Z3JlYXRlcnt9IiAu ICI+IikKCSgiXFxcXH57fSIgLiAifiIpCgkoIlxcXFx0ZXh0ZGFnZ2Vye30iIC4gIuKAoCIp CgkoIlxcXFx0ZXh0ZGFnZ2VyZGJse30iIC4gIuKAoSIpCgkoIlxcXFxoc3BhY2Uqey41ZW19 IiAuICLigIIiKQoJKCJcXFxcaHNwYWNlKnsxZW19IiAuICLigIMiKQoJKCJcXFxcaHNwYWNl KnsuMmVtfSIgLiAi4oCJIikKCSgiXFxcXHRleHRjdXJyZW5jeXt9IiAuICLCpCIpCgkoIlxc XFx0ZXh0Y2VudHt9IiAuICLCoiIpCgkoIlxcXFxwb3VuZHN7fSIgLiAiwqMiKQoJKCJcXFxc dGV4dHllbnt9IiAuICLCpSIpCgkoIlxcXFx0ZXh0ZXVyb3t9IiAuICLigqwiKQoJKCJcXFxc RVVSe30iIC4gIuKCrCIpCgkoIlxcXFxFVVJkaWd7fSIgLiAi4oKsIikKCSgiXFxcXEVVUmh2 e30iIC4gIuKCrCIpCgkoIlxcXFxFVVJjcnt9IiAuICLigqwiKQoJKCJcXFxcRVVSdG17fSIg LiAi4oKsIikKCSgiXFxcXHRleHRjb3B5cmlnaHR7fSIgLiAiwqkiKQoJKCJcXFxcdGV4dHJl Z2lzdGVyZWR7fSIgLiAiwq4iKQoJKCJcXFxcdGV4dHRyYWRlbWFya3t9IiAuICLihKIiKQoJ KCJcXFxcdGV4dHBte30iIC4gIsKxIikKCSgiXFxcXHRleHRwbXt9IiAuICLCsSIpCgkoIlxc XFx0ZXh0dGltZXN7fSIgLiAiw5ciKQoJKCJcXFxcdGV4dGRpdnt9IiAuICLDtyIpCgkoIlxc XFx0ZXh0b25laGFsZnt9IiAuICLCvSIpCgkoIlxcXFx0ZXh0b25lcXVhcnRlcnt9IiAuICLC vCIpCgkoIlxcXFx0ZXh0dGhyZWVxdWFydGVyc3t9IiAuICLCviIpCgkoIlxcXFx0ZXh0cGVy dGhvdXNhbmR7fSIgLiAi4oCwIikKCSgiXFxcXHRleHRvbmVzdXBlcmlvcnt9IiAuICLCuSIp CgkoIlxcXFx0ZXh0dHdvc3VwZXJpb3J7fSIgLiAiwrIiKQoJKCJcXFxcdGV4dHRocmVlc3Vw ZXJpb3J7fSIgLiAiwrMiKQoJKCJcXFxcdGV4dG11e30iIC4gIsK1IikKCSgiXFxcXHRleHRh c2NpaW1hY3Jvbnt9IiAuICLCryIpCgkoIlxcXFx0ZXh0ZGVncmVle30iIC4gIsKwIikKCSgi XFxcXHRleHRsbm90e30iIC4gIsKsIikKCSgiXFxcXHRleHRidWxsZXR7fSIgLiAi4oCiIikK CSgiXFxcXHRleHRidWxsZXR7fSIgLiAi4oCiIikKCSgiXFxcXFB7fSIgLiAiwrYiKQoJKCJc XFxcdGV4dG9yZGZlbWluaW5le30iIC4gIsKqIikKCSgiXFxcXHRleHRvcmRtYXNjdWxpbmV7 fSIgLiAiwroiKQoJKCJcXFxcY3t9IiAuICLCuCIpCgkoIlxcXFx0ZXh0YXNjaWlkaWVyZXNp c3t9IiAuICLCqCIpCgkoIlxcXFwve30iIC4gIuKAjCIpCgkoIlxcXFxzbWlsZXl7fSIgLiAi 4pi6IikKCSgiXFxcXGJsYWNrc21pbGV5e30iIC4gIuKYuyIpCgkoIlxcXFxmcm93bmlle30i IC4gIuKYuSIpKQoiTWFwcyBMYVRlWCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gdXRmLTguIEJh c2VkIG9uIG9yZy1lbnRpdGllcywKd2l0aCBhZGRpdGlvbnMuIikKCQkJICAgCihwcm92aWRl ICdvcmctY2l0ZSkKCgo= --------------040701060606020603090305--