From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: MON KEY Newsgroups: gmane.emacs.bugs Subject: bug#6601: help-make-xref doesn't buttonize `help-variable-def' and per `help-xref-symbol-regexp' Date: Mon, 12 Jul 2010 22:10:47 -0400 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=000e0cd6adee9e0a46048b3b6038 X-Trace: dough.gmane.org 1278988224 26005 80.91.229.12 (13 Jul 2010 02:30:24 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 13 Jul 2010 02:30:24 +0000 (UTC) To: 6601@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Jul 13 04:30:22 2010 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OYVGG-0006CZ-NY for geb-bug-gnu-emacs@m.gmane.org; Tue, 13 Jul 2010 04:30:21 +0200 Original-Received: from localhost ([127.0.0.1]:60385 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OYVGF-0003Ak-Li for geb-bug-gnu-emacs@m.gmane.org; Mon, 12 Jul 2010 22:30:19 -0400 Original-Received: from [140.186.70.92] (port=33050 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OYVG9-0003AB-NA for bug-gnu-emacs@gnu.org; Mon, 12 Jul 2010 22:30:14 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OYVG8-00067Y-9C for bug-gnu-emacs@gnu.org; Mon, 12 Jul 2010 22:30:13 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:42017) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OYVG8-00067U-7a for bug-gnu-emacs@gnu.org; Mon, 12 Jul 2010 22:30:12 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1OYUxZ-0005aZ-Sy; Mon, 12 Jul 2010 22:11:01 -0400 X-Loop: help-debbugs@gnu.org In-Reply-To: Resent-From: MON KEY Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 13 Jul 2010 02:11:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 6601 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 6601-submit@debbugs.gnu.org id=B6601.127898704621477 (code B ref 6601); Tue, 13 Jul 2010 02:11:01 +0000 Original-Received: (at 6601) by debbugs.gnu.org; 13 Jul 2010 02:10:46 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OYUxJ-0005aM-LK for submit@debbugs.gnu.org; Mon, 12 Jul 2010 22:10:45 -0400 Original-Received: from mail-gx0-f172.google.com ([209.85.161.172]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OYUxH-0005aG-72 for 6601@debbugs.gnu.org; Mon, 12 Jul 2010 22:10:43 -0400 Original-Received: by gxk3 with SMTP id 3so2975278gxk.3 for <6601@debbugs.gnu.org>; Mon, 12 Jul 2010 19:10:47 -0700 (PDT) Original-Received: by 10.150.187.17 with SMTP id k17mr5659763ybf.273.1278987047143; Mon, 12 Jul 2010 19:10:47 -0700 (PDT) Original-Received: by 10.151.98.19 with HTTP; Mon, 12 Jul 2010 19:10:47 -0700 (PDT) X-Google-Sender-Auth: 4wVHJfgpZfz1ZGXtWIEz3UrpZqs X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Mon, 12 Jul 2010 22:11:01 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:38471 Archived-At: --000e0cd6adee9e0a46048b3b6038 Content-Type: text/plain; charset=UTF-8 ;;; ============================== ;;; ;;; Following illustrates a proof of concept for how to correct the problem. ;;; ;;; ============================== (defvar *help-xref-ascii-symbol-vars-test* '("`!some-var-bang!'" "`@colonel-at-var@'" "`$some-rich-var$'" "`%percenta-var%'" "`+var-plus-plus+'" "`-dash-var-'" "`--morse-.-var--'" "`.dot-var.'" "`/slash-var/'" "`\\bkslsh-var\\'" "`/pyra-var\'" "`\\funnel-var/'" "`=equi-var='" "`>greata-var>'" "`meow-var<'" "`'" "`?var-quest?'" "`^up-var^'" "`_under-var_'" "`{open-var{'" "`}close-var}'" "`|bar-var|'" "`{pair-brc-var}'" "`}invrted-brc-var{'") "List of strings to test for with `help-xref-modify-symbols-syntax-table-TEST' Each string is preceded and followed a char in `*help-xref-ascii-symbol-vars*'.") (defvar *help-xref-ascii-symbol-vars* '(33 ;; ! 36 ;; $ 37 ;; % 42 ;; * 43 ;; + 45 ;; - 46 ;; . 47 ;; / 64 ;; @ 60 ;; > 61 ;; = 62 ;; > 63 ;; ? 92 ;; / 94 ;; ^ 95 ;; _ 123 ;; { 124 ;; | 125 ;; } ) "A list of characters that `help-make-xrefs' does not recognize when buttonizing if they appear as the first char of a symbol name.") (defvar *help-xref-ascii-symbol-vars-regexp* ;; "\\(\\s(\\(\\(\\sw\\|\\s_\\)+\\)\\s)\\)" ;; ^^1^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^ (concat "\\(" ;; grp1 "\\s(" ;; open-paren -> ` "\\(" ;; grp2 "\\(\\sw\\|\\s_\\)+" "\\)" "\\s)" ;; close-paren -> ' "\\)") "Regexp for finding symbols preceded and followed a char in the variable `*help-xref-ascii-symbol-vars*'. Evaluated with a modified syntax table by `help-xref-modify-symbols-syntax-table-TEST'.") (defun help-xref-modify-symbols-syntax-table-TEST () "Function is as a proof of conciept for how to fix `help-make-xrefs'.\n When *Help* is buttonized it inherits `emacs-lisp-mode-syntax-table' in shuch a way that the `help-make-xrefs' loop fails to match symbols preceded by certain ASCII chars. Following table an example of the unmodified *Help* buffer syntax:\n `*some-var*' 132222222231\n Where the above table maps the syntax values:\n 1 <- punct 3 <- symbol 2 <- word\n This function temporarily modifies the syntax table and use the regexp in `*help-xref-ascii-symbol-vars-regexp*' to identify the test symbols in `*help-xref-ascii-symbol-vars-test*' by setting each elt of `*help-xref-ascii-symbol-vars*' to have the \"_\" syntax.\n We modify chars 40 and 41 \"(\" \")\" to have \".\" syntax.\n We modify char 96 ASCII grave to have to have \"('\" syntax and delimit it with the matching char 39 (apostrophe) by giving it the syntax \")`\".\n Return and display results in buffers named: \"*TEST-SYNTAX*\" and \"*TEST-SYNTAX-RESULTS*\"\n Return a list of results with the form:\n \(:length-test-list :matched-all-p { t | nil } :found-these \(\"LIST\" \"OF\" \"STRINGS\" \"FOUND\"\) :with-these \(\"`LIST'\" \"`OF'\" \"`STRINGS'\" \"`FOUND-PRE-SYNTAX-FROB'\"\)\)\n Assuming value of property :matched-all-p is t the list of the :found-these property could be buttonized by `help-make-xrefs'.\n :EXAMPLE\n\n\(help-xref-modify-symbols-syntax-table-TEST\)\n" (with-current-buffer (get-buffer-create "*TEST-SYNTAX*") (erase-buffer) (display-buffer (current-buffer) t) (let ((xref-syms ;;(copy-syntax-table emacs-lisp-mode-syntax-table)) (make-syntax-table emacs-lisp-mode-syntax-table)) (syn-syms *help-xref-ascii-symbol-vars*) gthr-syn) (dolist (syn syn-syms) (modify-syntax-entry syn "_" xref-syms)) ;; turn-off parens (modify-syntax-entry 40 "." xref-syms) (modify-syntax-entry 41 "." xref-syms) ;; make ` <- ( (modify-syntax-entry 96 "('" xref-syms) ;; make ' <- ) (modify-syntax-entry 39 ")`" xref-syms) ;; push (match-string-no-properties 2) gthr-syn)) (save-excursion (insert (mapconcat #'identity *help-xref-ascii-symbol-vars-test* "\n"))) (with-syntax-table xref-syms (while (search-forward-regexp *help-xref-ascii-symbol-vars-regexp* nil t) (push (match-string-no-properties 2) gthr-syn))) (setq gthr-syn `(:length-test-list ,(length *help-xref-ascii-symbol-vars-test*) :matched-all-p ,(eq (length gthr-syn) (length *help-xref-ascii-symbol-vars-test*)) :found-these ,(nreverse gthr-syn) :with-these ,*help-xref-ascii-symbol-vars-test*)) (kill-buffer (get-buffer-create "*TEST-SYNTAX-RESULTS*")) (pp-display-expression gthr-syn "*TEST-SYNTAX-RESULTS*") (pop-to-buffer "*TEST-SYNTAX*" t) (pop-to-buffer "*TEST-SYNTAX-RESULTS*" t) gthr-syn))) ;; ;; (help-xref-modify-symbols-syntax-table-TEST) ;;; ============================== Function `help-make-xrefs' performs its xref'ing inside an unwind-protect searching matches for the following regexps: `help-xref-info-regexp', `help-xref-url-regexp', `help-xref-mule-regexp', `help-xref-symbol-regexp', with matches buttonized accordingly. It seems the sole purpose of the `unwind-protect' for is to rebind the buffer's syntax to the value stashed away in the local variable `stab'. Is there some reason why `help-make-xrefs' shouldn't be doing this inside of the `with-syntax-table' macro? e.g. (with-syntax-table emacs-lisp-mode-syntax-table {... frob xrefs here ... } ) Also, can this: (let ((old-modified (buffer-modified-p))) be replaced by a wrap with the macro: `with-silent-modifications' ;;; ============================== Revised version of previous file attatched. --000e0cd6adee9e0a46048b3b6038 Content-Type: application/octet-stream; name="bug-6601-buttonize-rev2.el" Content-Disposition: attachment; filename="bug-6601-buttonize-rev2.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gbk3v0cq0 Ozs7IDxUaW1lc3RhbXA6ICN7MjAxMC0wNy0xMlQyMjowODoxMy0wNDowMFp9I3sxMDI4MX0gLSBi eSBNT04+Cjs7OyBidWcjNjYwMTpoZWxwLW1ha2UteHJlZiBkb2Vzbid0IGJ1dHRvbml6ZSBgaGVs cC12YXJpYWJsZS1kZWYnIGFuZCBwZXIgYGhlbHAteHJlZi1zeW1ib2wtcmVnZXhwJwoKOzs7ID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo7OzsKOzs7IEZvbGxvd2luZyBpbGx1c3RyYXRl cyBhIHByb29mIG9mIGNvbmNlcHQgZm9yIGhvdyB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLgo7OzsK Ozs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKGRlZnZhciAqaGVscC14cmVmLWFz Y2lpLXN5bWJvbC12YXJzLXRlc3QqCiAgJygiYCFzb21lLXZhci1iYW5nISciICAiYEBjb2xvbmVs LWF0LXZhckAnIiAiYCRzb21lLXJpY2gtdmFyJCciCiAgICAiYCVwZXJjZW50YS12YXIlJyIgImAr dmFyLXBsdXMtcGx1cysnIiAiYC1kYXNoLXZhci0nIiAiYC0tbW9yc2UtLi12YXItLSciCiAgICAi YC5kb3QtdmFyLiciICAiYC9zbGFzaC12YXIvJyIgImBcXGJrc2xzaC12YXJcXCciICJgL3B5cmEt dmFyXCciCiAgICAiYFxcZnVubmVsLXZhci8nIiAiYD1lcXVpLXZhcj0nIiAiYD5ncmVhdGEtdmFy PiciICJgPGxlc3Nlci12YXI8JyIKICAgICJgPm1lb3ctdmFyPCciICJgPGVudGl0eS12YXI+JyIg ImA/dmFyLXF1ZXN0PyciICAiYF51cC12YXJeJyIgImBfdW5kZXItdmFyXyciCiAgICAiYHtvcGVu LXZhcnsnIiAiYH1jbG9zZS12YXJ9JyIgImB8YmFyLXZhcnwnIiAiYHtwYWlyLWJyYy12YXJ9JyIK ICAgICJgfWludnJ0ZWQtYnJjLXZhcnsnIikKICAiTGlzdCBvZiBzdHJpbmdzIHRvIHRlc3QgZm9y IHdpdGggYGhlbHAteHJlZi1tb2RpZnktc3ltYm9scy1zeW50YXgtdGFibGUtVEVTVCcKRWFjaCBz dHJpbmcgaXMgcHJlY2VkZWQgYW5kIGZvbGxvd2VkIGEgY2hhciBpbiBgKmhlbHAteHJlZi1hc2Np aS1zeW1ib2wtdmFycyonLiIpCiAgCihkZWZ2YXIgKmhlbHAteHJlZi1hc2NpaS1zeW1ib2wtdmFy cyoKICAnKDMzICA7OyAhCiAgICAzNiAgOzsgJAogICAgMzcgIDs7ICUKICAgIDQyICA7OyAqCiAg ICA0MyAgOzsgKwogICAgNDUgIDs7IC0KICAgIDQ2ICA7OyAuCiAgICA0NyAgOzsgLyAKICAgIDY0 ICA7OyBACiAgICA2MCAgOzsgPgogICAgNjEgIDs7ID0KICAgIDYyICA7OyA+CiAgICA2MyAgOzsg PwogICAgOTIgIDs7IC8KICAgIDk0ICA7OyBeCiAgICA5NSAgOzsgXwogICAgMTIzIDs7IHsKICAg IDEyNCA7OyB8CiAgICAxMjUgOzsgfQogICAgKQogICJBIGxpc3Qgb2YgY2hhcmFjdGVycyB0aGF0 IGBoZWxwLW1ha2UteHJlZnMnIGRvZXMgbm90IHJlY29nbml6ZSB3aGVuCmJ1dHRvbml6aW5nIGlm IHRoZXkgYXBwZWFyIGFzIHRoZSBmaXJzdCBjaGFyIG9mIGEgc3ltYm9sIG5hbWUuIikKCihkZWZ2 YXIgKmhlbHAteHJlZi1hc2NpaS1zeW1ib2wtdmFycy1yZWdleHAqCiAgOzsgIlxcKFxccyhcXChc XChcXHN3XFx8XFxzX1xcKStcXClcXHMpXFwpIgogIDs7ICBeXjFeXl5eXl5eXl4yXl5eXl5eXl5e Xl5eXl5eXl5eXl5eXl5eCiAgKGNvbmNhdCAiXFwoIiAgOzsgZ3JwMQogICAgICAgICAgIlxccygi IDs7IG9wZW4tcGFyZW4gLT4gYAogICAgICAgICAgIlxcKCIgIDs7IGdycDIKICAgICAgICAgICJc XChcXHN3XFx8XFxzX1xcKSsiCiAgICAgICAgICAiXFwpIiAgIAogICAgICAgICAgIlxccykiIDs7 IGNsb3NlLXBhcmVuIC0+ICcgCiAgICAgICAgICAiXFwpIikKICAiUmVnZXhwIGZvciBmaW5kaW5n IHN5bWJvbHMgcHJlY2VkZWQgYW5kIGZvbGxvd2VkIGEgY2hhciBpbiB0aGUgdmFyaWFibGUKYCpo ZWxwLXhyZWYtYXNjaWktc3ltYm9sLXZhcnMqJy4gRXZhbHVhdGVkIHdpdGggYSBtb2RpZmllZCBz eW50YXggdGFibGUKYnkgYGhlbHAteHJlZi1tb2RpZnktc3ltYm9scy1zeW50YXgtdGFibGUtVEVT VCcuIikKCihkZWZ1biBoZWxwLXhyZWYtbW9kaWZ5LXN5bWJvbHMtc3ludGF4LXRhYmxlLVRFU1Qg ICgpICAKICAiRnVuY3Rpb24gaXMgYXMgYSBwcm9vZiBvZiBjb25jaWVwdCBmb3IgaG93IHRvIGZp eCBgaGVscC1tYWtlLXhyZWZzJy5cbgpXaGVuICpIZWxwKiBpcyBidXR0b25pemVkIGl0IGluaGVy aXRzIGBlbWFjcy1saXNwLW1vZGUtc3ludGF4LXRhYmxlJyBpbiBzaHVjaAphIHdheSB0aGF0IHRo ZSBgaGVscC1tYWtlLXhyZWZzJyBsb29wIGZhaWxzIHRvIG1hdGNoIHN5bWJvbHMgcHJlY2VkZWQg YnkgY2VydGFpbgpBU0NJSSBjaGFycy4gRm9sbG93aW5nIHRhYmxlIGFuIGV4YW1wbGUgb2YgdGhl IHVubW9kaWZpZWQgKkhlbHAqIGJ1ZmZlciBzeW50YXg6XG4KIGAqc29tZS12YXIqJyAKIDEzMjIy MjIyMjIzMVxuCldoZXJlIHRoZSBhYm92ZSB0YWJsZSBtYXBzIHRoZSBzeW50YXggdmFsdWVzOlxu CiAxIDwtIHB1bmN0CiAzIDwtIHN5bWJvbAogMiA8LSB3b3JkXG4KVGhpcyBmdW5jdGlvbiB0ZW1w b3JhcmlseSBtb2RpZmllcyB0aGUgc3ludGF4IHRhYmxlIGFuZCB1c2UgdGhlIHJlZ2V4cCBpbgpg KmhlbHAteHJlZi1hc2NpaS1zeW1ib2wtdmFycy1yZWdleHAqJyB0byBpZGVudGlmeSB0aGUgdGVz dCBzeW1ib2xzIGluCmAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzLXRlc3QqJyBieSBzZXR0 aW5nIGVhY2ggZWx0IG9mCmAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzKicgdG8gaGF2ZSB0 aGUgXCJfXCIgc3ludGF4LlxuCldlIG1vZGlmeSBjaGFycyA0MCBhbmQgNDEgXCIoXCIgXCIpXCIg dG8gaGF2ZSBcIi5cIiBzeW50YXguXG4KV2UgbW9kaWZ5IGNoYXIgOTYgQVNDSUkgZ3JhdmUgdG8g aGF2ZSB0byBoYXZlIFwiKCdcIiBzeW50YXggYW5kIGRlbGltaXQgaXQgd2l0aAp0aGUgbWF0Y2hp bmcgY2hhciAzOSAoYXBvc3Ryb3BoZSkgYnkgZ2l2aW5nIGl0IHRoZSBzeW50YXggXCIpYFwiLlxu ClJldHVybiBhbmQgZGlzcGxheSByZXN1bHRzIGluIGJ1ZmZlcnMgbmFtZWQ6CiBcIipURVNULVNZ TlRBWCpcIiBhbmQgIFwiKlRFU1QtU1lOVEFYLVJFU1VMVFMqXCJcbgpSZXR1cm4gYSBsaXN0IG9m IHJlc3VsdHMgd2l0aCB0aGUgZm9ybTpcbgogXCg6bGVuZ3RoLXRlc3QtbGlzdCA8TEVOR1RILU9G LUxJU1QtVEVTVEVEPiAKICA6bWF0Y2hlZC1hbGwtcCB7IHQgfCBuaWwgfQogIDpmb3VuZC10aGVz ZSAgIFwoXCJMSVNUXCIgXCJPRlwiIFwiU1RSSU5HU1wiIFwiRk9VTkRcIlwpCiAgOndpdGgtdGhl c2UgICAgXChcImBMSVNUJ1wiIFwiYE9GJ1wiIFwiYFNUUklOR1MnXCIgXCJgRk9VTkQtUFJFLVNZ TlRBWC1GUk9CJ1wiXClcKVxuCkFzc3VtaW5nIHZhbHVlIG9mIHByb3BlcnR5IDptYXRjaGVkLWFs bC1wIGlzIHQgdGhlIGxpc3Qgb2YgdGhlIDpmb3VuZC10aGVzZQpwcm9wZXJ0eSBjb3VsZCBiZSBi dXR0b25pemVkIGJ5IGBoZWxwLW1ha2UteHJlZnMnLlxuCjpFWEFNUExFXG5cblwoaGVscC14cmVm LW1vZGlmeS1zeW1ib2xzLXN5bnRheC10YWJsZS1URVNUXClcbiIKICAod2l0aC1jdXJyZW50LWJ1 ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipURVNULVNZTlRBWCoiKQogICAgKGVyYXNlLWJ1ZmZl cikKICAgIChkaXNwbGF5LWJ1ZmZlciAoY3VycmVudC1idWZmZXIpIHQpCiAgICAobGV0ICgoeHJl Zi1zeW1zIDs7KGNvcHktc3ludGF4LXRhYmxlIGVtYWNzLWxpc3AtbW9kZS1zeW50YXgtdGFibGUp KQogICAgICAgICAgIChtYWtlLXN5bnRheC10YWJsZSBlbWFjcy1saXNwLW1vZGUtc3ludGF4LXRh YmxlKSkKICAgICAgICAgIChzeW4tc3ltcyAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzKikK ICAgICAgICAgIGd0aHItc3luKQogICAgICAoZG9saXN0IChzeW4gc3luLXN5bXMpCiAgICAgICAg KG1vZGlmeS1zeW50YXgtZW50cnkgc3luICJfIiB4cmVmLXN5bXMpKQogICAgICA7OyB0dXJuLW9m ZiBwYXJlbnMKICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgNDAgICIuIiB4cmVmLXN5bXMpIAog ICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA0MSAgIi4iIHhyZWYtc3ltcykKICAgICAgOzsgbWFr ZSBgIDwtICggCiAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5IDk2ICAiKCciIHhyZWYtc3ltcykK ICAgICAgOzsgbWFrZSAnIDwtICkgIAogICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSAzOSAgIilg IiB4cmVmLXN5bXMpIAogICAgICA7OyBwdXNoIChtYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyAy KSBndGhyLXN5bikpCiAgICAgIChzYXZlLWV4Y3Vyc2lvbiAKICAgICAgICAoaW5zZXJ0IChtYXBj b25jYXQgIydpZGVudGl0eSAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzLXRlc3QqICJcbiIp KSkKICAgICAgKHdpdGgtc3ludGF4LXRhYmxlIHhyZWYtc3ltcwogICAgICAgICh3aGlsZSAoc2Vh cmNoLWZvcndhcmQtcmVnZXhwICpoZWxwLXhyZWYtYXNjaWktc3ltYm9sLXZhcnMtcmVnZXhwKiBu aWwgdCkKICAgICAgICAgIChwdXNoIChtYXRjaC1zdHJpbmctbm8tcHJvcGVydGllcyAyKSBndGhy LXN5bikpKQogICAgICAoc2V0cSBndGhyLXN5bgogICAgICAgICAgICBgKDpsZW5ndGgtdGVzdC1s aXN0ICwobGVuZ3RoICpoZWxwLXhyZWYtYXNjaWktc3ltYm9sLXZhcnMtdGVzdCopCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOm1hdGNoZWQtYWxsLXAgICwoZXEgKGxlbmd0aCBndGhy LXN5bikgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGxlbmd0aCAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzLXRlc3QqKSkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA6Zm91bmQtdGhlc2UgLChucmV2ZXJzZSBndGhyLXN5bikK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2l0aC10aGVzZSAgLCpoZWxwLXhyZWYt YXNjaWktc3ltYm9sLXZhcnMtdGVzdCopKQogICAgICAoa2lsbC1idWZmZXIgKGdldC1idWZmZXIt Y3JlYXRlICIqVEVTVC1TWU5UQVgtUkVTVUxUUyoiKSkKICAgICAgKHBwLWRpc3BsYXktZXhwcmVz c2lvbiBndGhyLXN5biAiKlRFU1QtU1lOVEFYLVJFU1VMVFMqIikKICAgICAgKHBvcC10by1idWZm ZXIgIipURVNULVNZTlRBWCoiIHQpCiAgICAgIChwb3AtdG8tYnVmZmVyICIqVEVTVC1TWU5UQVgt UkVTVUxUUyoiIHQpCiAgICAgIGd0aHItc3luKSkpCjs7Cjs7IChoZWxwLXhyZWYtbW9kaWZ5LXN5 bWJvbHMtc3ludGF4LXRhYmxlLVRFU1QpIAoKCjs7OyA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KCjs7IEZ1bmN0aW9uIGBoZWxwLW1ha2UteHJlZnMnIHBlcmZvcm1zIGl0cyB4cmVmJ2lu ZyBpbnNpZGUgYW4gdW53aW5kLXByb3RlY3QgCjs7IHNlYXJjaGluZyBtYXRjaGVzIGZvciB0aGUg Zm9sbG93aW5nIHJlZ2V4cHM6Cjs7IGBoZWxwLXhyZWYtaW5mby1yZWdleHAnLCBgaGVscC14cmVm LXVybC1yZWdleHAnLAo7OyBgaGVscC14cmVmLW11bGUtcmVnZXhwJywgYGhlbHAteHJlZi1zeW1i b2wtcmVnZXhwJywKOzsgd2l0aCBtYXRjaGVzIGJ1dHRvbml6ZWQgYWNjb3JkaW5nbHkuCjs7Cjs7 IEl0IHNlZW1zIHRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhlIGB1bndpbmQtcHJvdGVjdCcgZm9yIGlz IHRvIHJlYmluZCB0aGUgYnVmZmVyJ3MKOzsgc3ludGF4IHRvIHRoZSB2YWx1ZSBzdGFzaGVkIGF3 YXkgaW4gdGhlIGxvY2FsIHZhcmlhYmxlIGBzdGFiJy4KOzsKOzsgSXRzIHRoZXJlIHNvbWUgcmVh c29uIHdoeSBgaGVscC1tYWtlLXhyZWZzJyBzaG91bGRuJ3QgYmUgZG9pbmcgdGhpcyBpbnNpZGUg b2YKOzsgdGhlIGB3aXRoLXN5bnRheC10YWJsZScgbWFjcm8/IGUuZy4KOzsKOzsgKHdpdGgtc3lu dGF4LXRhYmxlIGVtYWNzLWxpc3AtbW9kZS1zeW50YXgtdGFibGUKOzsgICB7Li4uIGZyb2IgeHJl ZnMgaGVyZSAuLi4gfSApCjs7Cjs7Cjs7IEFsc28sIGNhbiB0aGlzOgo7Owo7OyAgIChsZXQgKChv bGQtbW9kaWZpZWQgKGJ1ZmZlci1tb2RpZmllZC1wKSkpIAo7Owo7OyBiZSByZXBsYWNlZCBieSBh IHdyYXAgd2l0aCB0aGUgbWFjcm86IGB3aXRoLXNpbGVudC1tb2RpZmljYXRpb25zJyAKCjs7OyA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjs7OyA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KOzsgVGhlIGJ1dHRvbiBgaGVscC12YXJpYWJsZS1kZWYnIGFuZCBjb25zdGFudCBg aGVscC14cmVmLXN5bWJvbC1yZWdleHAnCjs7IGRvIG5vdCBmaW5kIHZhcmlhYmxlcyB3aXRoIHN5 bWJvbC1uYW1lcyBjb250YWluaW5nIGFzdGVyaXNrcywKOzsgZS5nLiBgKnNvbWUtdmFyKicuIFBy ZXN1bWFibHkgdGhpcyBhcHBsaWVzIGVxdWFsbHkgYXMgd2VsbCB0byBhbnkKOzsgdmFyaWFibGUg d2hpY2ggY29udGFpbnMgYSBub24tbGV0dGVyIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhl Cjs7IHZhcmlhYmxlcyBzeW1ib2wgbmFtZS4KCjs7IEl0IGxvb2tzIGxpa2UgYGhlbHAtbWFrZS14 cmVmcycgaW5oZXJpdHMgdGhlCjs7IGBlbWFjcy1saXNwLW1vZGUtc3ludGF4LXRhYmxlJyBhbmQg b2RkIHN0dWZmIGlzIGhhcHBlbmluZyBhcm91bmQgdGhlCjs7IHJlZ2V4cCBhbmQgdGhlIHN5bnRh eCB0YWJsZSB0aG91Z2ggdGhpcyBzZWVtcyBvZGQgYXMgYConIGlzIGEgc3ltYm9sCjs7IGNvbnN0 aXR1ZW50LgoKOzsgRm9sbG93aW5nIGJpdCBvZiBjb2RlIHByb3ZpZGVzIGFuIGV4YW1wbGUgaWxs dXN0cmF0aW5nIHRoZSBwcm9ibGVtOgoKOzs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQooZGVmdmFyIGNoZWNrLXhyZWYtdmFyLW5vLXN0YXIgJ3hyZWZkLWluLWRvY3N0cmluZ3MKICAi QSB0ZXN0IGZvciB4cmVmJ2luZyBub24tc3RhciBwcmVmaXhlZCB2YXJpYWJsZXMgaW4gZG9jc3Ry aW5ncy5cbgpOb24tc3RhciBwcmVmaXhlZCB2YXJpYWJsZXMgaGF2ZSB0aGUgZm9ybTpcbgogPFNP TUUtVkFSLU5BTUU+XG4KVGhlc2UgYXBwZWFyIHdpdGggeHJlZnMgaW4gZG9jc3RyaW5ncyB3aGVu IHByZWNlZGVkIGJ5IGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCnR3byB0b2tlbnM6XG4KIHsgdmFy aWFibGUgfCBvcHRpb24gfVxuCndoZXJlIHRoZSB2YXJpYWJsZXMgc3ltYm9sLW5hbWUgaXMgZW5j bG9zZWQgd2l0aCBhIHByZWNlZGluZyBncmF2ZSBjaGFyIGAKXChBU0NJSSA5NlwpLCBhbmQgZm9s bG93ZWQgYnkgYW4gYXBvc3Ryb3BoZSBjaGFyICcgKEFTQ0lJIDM5KSBlLmcuOlxuCiB2YXJpYWJs ZSBgPFNPTUUtVkFSLU5BTUU+Jwogb3B0aW9uIGA8U09NRS1WQVItTkFNRT4nXG4KVGhpcyBpcyBh cyBjb250cmFzdGVkIHdpdGggc3RhciBwcmVmaXhlZCB2YXJpYWJsZXMgd2hpY2ggaGF2ZSB0aGUg Zm9ybTpcbgogKjxTT01FLVZBUi1OQU1FPipcbgphbmQgZG8gbm90IGFwcGVhciB3aXRoIHhyZWZz IGluIGRvY3N0cmluZ3MuXG4KRm9yIGV4YW1wbGUsIHRoaXMgdmFyaWFibGUgYCpjaGVjay14cmVm LXZhci13LXN0YXIqJyBpcyBub3QgeHJlZidkLgpOZWl0aGVyIGlzIGl0IHhyZWYnZCBhcyBhbiBv cHRpb24gYCpjaGVjay14cmVmLXZhci13LXN0YXIqJy4KSG93ZXZlciwgdGhlIGN1cnJlbnQgdmFy aWFibGUgYGNoZWNrLXhyZWYtdmFyLW5vLXN0YXInIGlzIHhyZWYnZC4KTGlrZXdpc2UsIGl0IGlz IGFsc28geHJlZidkIGFzIHRoZSBvcHRpb24gYGNoZWNrLXhyZWYtdmFyLW5vLXN0YXInLiIpCgoo ZGVmdmFyICpjaGVjay14cmVmLXZhci13LXN0YXIqICdub3QteHJlZmQtaW4tZG9jc3RyaW5ncwog ICJBIHRlc3QgZm9yIHhyZWYnaW5nIHN0YXIgcHJlZml4ZWQgdmFyaWFibGVzIGluIGRvY3N0cmlu Z3MuXG4KU3RhciBwcmVmaXhlZCB2YXJpYWJsZXMgaGF2ZSB0aGUgZm9ybTpcbgogKjxTT01FLVZB Ui1OQU1FPipcbgp0aGVzZSBkbyBub3QgYXBwZWFyIHdpdGggeHJlZnMgaW4gZG9jc3RyaW5ncy5c bgpUaGlzIGlzIGFzIGNvbnRyYXN0ZWQgd2l0aCBub24tc3RhciBwcmVmaXhlZCB2YXJpYWJsZXMg d2hpY2ggaGF2ZSB0aGUgZm9ybTpcbgogIDxTT01FLVZBUi1OQU1FPlxuCmFuZCB3aGljaCBkbyBh cHBlYXIgaW4geHJlZidkIGluIGRvY3N0cmluZ3Mgd2hlbiBwcmVjZWRlZCBieSBlaXRoZXIgb2Yg dGhlCmZvbGx3aW5nIHR3byB0b2tlbnM6XG4KIHsgdmFyaWFibGUgfCBvcHRpb24gfVxuCndoZXJl IHRoZSBzeW1ib2xlLW5hbWUgb2YgdGhlIHZhcmlhYmxlIGlzIGVuY2xvc2VkIHdpdGggYSBwcmVj ZWRpbmcgZ3JhdmUgY2hhciBgClwoQVNDSUkgOTZcKSBhbmQgZm9sbG93ZWQgYnkgYW4gYXBvc3Ry b3BoZSBjaGFyICcgKEFTQ0lJIDM5KSBlLmcuOlxuCiB2YXJpYWJsZSBgPFNPTUUtVkFSLU5BTUU+ Jwogb3B0aW9uIGA8U09NRS1WQVItTkFNRT4nXG4KRm9yIGV4YW1wbGUsIHRoaXMgdmFyaWFibGUg YGNoZWNrLXhyZWYtdmFyLW5vLXN0YXInIGlzIHhyZWYnZC4KTGlrZXdpc2UsIHRoZSBvcHRpb24g YGNoZWNrLXhyZWYtdmFyLW5vLXN0YXInIGlzIGFsc28geHJlZidkLgpXaGVyZWFzLCB0aGUgdmFy aWFibGUgYCpjaGVjay14cmVmLXZhci13LXN0YXIqJyBpcyBub3QgeHJlZidkLgpOZWl0aGVyIGlz IGl0IHhyZWYnZCBhcyBvcHRpb24gYCpjaGVjay14cmVmLXZhci13LXN0YXIqJy4iKQoKKGRlZnVu IGNoZWNrLXhyZWYtdGVzdC1mdW5jdGlvbiAoKQogICJUaGlzIGlzIGEgZG9jc3RyaW5nIHdoaWNo IHRlc3RzIHhyZWYnaW5nIG9mIHR3byBkaWZmZXJlbnRseSBuYW1lZCB2YXJpYWJsZXMuXG4KVGhl IGN1cnJlbnQgZnVuY3Rpb25zIGRvY3N0cmluZyBpbGx1c3RyYXRlcyB0aGUgcHJvYmxlbS5cbgpU aGlzIHN5bWJvbC1uYW1lIHdpbGwgYmUgeHJlZidkIGFzIHZhcmlhYmxlIGBjaGVjay14cmVmLXZh ci1uby1zdGFyJy5cbgpJdCB3aWxsIGFsc28gYmUgeHJlZidkIGFzIG9wdGlvbiBgY2hlY2steHJl Zi12YXItbm8tc3RhcicuXG4KV2hlcmVhcyBmb2xsb3dpbmcgc3ltYm9sLW5hbWUgaXMgbm90IHhy ZWYnZCBhcyB2YXJpYWJsZSBgKmNoZWNrLXhyZWYtdmFyLXctc3RhcionLApub3IgaXMgaXQgeHJl ZidkIGFzIG9wdGlvbiBgKmNoZWNrLXhyZWYtdmFyLXctc3RhcionLlxuClRoaXMgYmVoYXZpb3Vy IGNvbnN0aXR1dGVzIGEgYnVnLiBGb3IgYWRkaXRpb25hbCBkZXRhaWxlZCBpbGx1c3RyYXRpb24g b2YgdGhlCnByb2JsZW0gc2VlIHJldHVybiB2YWx1ZSBvZiBgY2hlY2steHJlZnMtdy1oZWxwLXZh cmlhYmxlLWRlZicuIgogIChkZXNjcmliZS1mdW5jdGlvbiAnY2hlY2steHJlZi10ZXN0LWZ1bmN0 aW9uKSkKCihkZWZ1biBjaGVjay14cmVmcy13LWhlbHAtdmFyaWFibGUtZGVmICgmb3B0aW9uYWwg dy10ZXN0LWZuY24gY250LXZhci1uYW1lKQogICJGaW5kIGhlbHAtdmFyaWFibGUtYnV0dG9uIHRl eHQtcHJvcGVydHkgdmFsdWVzIGluICpIZWxwKiBidWZmZXIuXG4KUmV0dXJuIGEgbGlzdCBvZiB0 ZXh0LXByb3BlcnRpZXMgYW5kIGJ1ZmZlciBsb2NhdGlvbnMgd2hlbiBidWZmZXIgaGFzCmEgYGNh dGVnb3J5YCB0ZXh0LXByb3BlcnR5IHdpdGggYSBwcm9wIHZhbHVlIGBoZWxwLXZhcmlhYmxlLWJ1 dHRvbmAuXG4KTGlzdCBjb250YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgdGhl IHByb3BlcnR5IGBoZWxwLXZhcmlhYmxlLWJ1dHRvbmAKYXBwZWFycyBhbG9uZyB3aXRoIHRoZSBj b3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgdmFyaWFibGUgbmFtZSBhcHBlYXJzIGluCnRo ZSBkb2N1bWVudGF0aW9uLlxuCldoZW4gVy1URVNULUZOQ04gaXMgbm9uLW5pbCBpdCBpcyBhIHN5 bW9sIG5hbWluZyBhIGRvY3VtZW50ZWQgZnVuY3Rpb24uCkRlZmF1bHQgaXMgYGNoZWNrLXhyZWYt dGVzdC1mdW5jdGlvbicuXG4KV2hlbiBDTlQtVkFSLU5BTUUgaXMgbm9uLW5pbCBjb3VudCB0aGUg bnVtYmVyIG9mIHRpbWVzIHN5bWJvbC1uYW1lIG1hdGNoZXMgdGhlCnJlZ2V4cCBcImA8Q05ULVZB Ui1OQU1FPidcIi4gCkRlZmF1bHQgaXMgdG8gY291bnQgbWF0Y2hlcyBmb3IgdGhlIHN5bWJvbCBg KmNoZWNrLXhyZWYtdmFyLXctc3RhcionLlxuCkJlZm9yZSByZXR1cm5pbmcgcG9wcy10by1idWZm ZXIgbmFtZWQgXCIqSGVscCpcIiBhbmQgdGhlbiB0byBidWZmZXIgbmFtZWQKXCIqQ0hFQ0stWFJF RlMtVy1IRUxQLVZBUklBQkxFLURFRipcIi5cbgo6RVhBTVBMRVxuXG5cKGNoZWNrLXhyZWZzLXct aGVscC12YXJpYWJsZS1kZWZcKVxuClwoY2hlY2steHJlZnMtdy1oZWxwLXZhcmlhYmxlLWRlZiAn aGVscC1tYWtlLXhyZWZzICdoZWxwLXhyZWYtc3ltYm9sLXJlZ2V4cFwpXG4KXChjaGVjay14cmVm cy13LWhlbHAtdmFyaWFibGUtZGVmICdoZWxwLW1ha2UteHJlZnMgJ2hlbHAtZm9yd2FyZC1sYWJl bFwpXG4iCiAgKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdjbCkgKHJlcXVpcmUgJ3BwKSkK ICAobGV0ICgoZ3Roci1wcm9wcykKICAgICAgICAoZ3Rocm5nIHQpKQogICAgKGlmIHctdGVzdC1m bmNuIAogICAgICAgIChkZXNjcmliZS1mdW5jdGlvbiB3LXRlc3QtZm5jbikKICAgICAgKGNoZWNr LXhyZWYtdGVzdC1mdW5jdGlvbikpCiAgICAod2l0aC1jdXJyZW50LWJ1ZmZlcgogICAgICAgIChn ZXQtYnVmZmVyICIqSGVscCoiKQogICAgICAoZ290by1jaGFyIChidWZmZXItZW5kIDApKQogICAg ICAod2hpbGUgZ3Rocm5nCiAgICAgICAgKHdoZW4gKGVxIChwb2ludCkgKGJ1ZmZlci1lbmQgMCkp CiAgICAgICAgICAoZ290by1jaGFyIChuZXh0LXNpbmdsZS1wcm9wZXJ0eS1jaGFuZ2UgKHBvaW50 KSAnYnV0dG9uKSkpCiAgICAgICAgKHVubGVzcyAobnVsbCAodGV4dC1wcm9wZXJ0aWVzLWF0IChw b2ludCkpKQogICAgICAgICAgKGxldCogKChwcm9wcy1oZXJlICh0ZXh0LXByb3BlcnRpZXMtYXQg KHBvaW50KSkpCiAgICAgICAgICAgICAgICAgKGNoay1odmIgKHBsaXN0LWdldCBwcm9wcy1oZXJl ICdjYXRlZ29yeSkpKQogICAgICAgICAgICAod2hlbiAoZXF1YWwgKHN5bWJvbC1uYW1lIGNoay1o dmIpICJoZWxwLXZhcmlhYmxlLWJ1dHRvbiIpCiAgICAgICAgICAgICAgKHB1c2ggYCg6YnV0dG9u LWZvdW5kLWF0ICwocG9pbnQpIDp3LXByb3BzICxwcm9wcy1oZXJlKSBndGhyLXByb3BzKSkKICAg ICAgICAgICAgKGlmIChlcSAobmV4dC1jaGFyLXByb3BlcnR5LWNoYW5nZSAocG9pbnQpKSAocG9p bnQpKQogICAgICAgICAgICAgICAgKHNldHEgZ3Rocm5nKQogICAgICAgICAgICAgIChwcm9nbiAo Z290by1jaGFyIChuZXh0LWNoYXItcHJvcGVydHktY2hhbmdlIChwb2ludCkpKQogICAgICAgICAg ICAgICAgICAgICAoaWYgKGVxIChuZXh0LWNoYXItcHJvcGVydHktY2hhbmdlIChwb2ludCkpIChw b2ludCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBndGhybmcpCiAgICAgICAgICAg ICAgICAgICAgICAgKGxldCAoKGNoay1ueHQgKG5leHQtc2luZ2xlLXByb3BlcnR5LWNoYW5nZSAo cG9pbnQpICdidXR0b24pKSkKICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBjaGstbnh0CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAobmV4dC1zaW5nbGUtcHJvcGVy dHktY2hhbmdlIChwb2ludCkgJ2J1dHRvbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChz ZXRxIGd0aHJuZykpKSkpKSkpKQogICAgICAod2hlbiBndGhyLXByb3BzIChzZXRxIGd0aHItcHJv cHMgKG5yZXZlcnNlIGd0aHItcHJvcHMpKSkKICAgICAgKGxldCAoKGNudC1mbmQgMCkpCiAgICAg ICAgKGRvbGlzdCAoYmZhIGd0aHItcHJvcHMKICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKD4g Y250LWZuZCAwKQogICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGd0aHItcHJvcHMKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAobmNvbmMgYCg6aGVscC12YXItYnRuLWZuZC1uLXRtcyAs Y250LWZuZCkgZ3Roci1wcm9wcykpKSkKICAgICAgICAgICh3aGVuIChlcXVhbCAoc3ltYm9sLW5h bWUgKHBsaXN0LWdldCAocGxpc3QtZ2V0IGJmYSA6dy1wcm9wcykgJ2NhdGVnb3J5KSkgCiAgICAg ICAgICAgICAgICAgICAgICAgImhlbHAtdmFyaWFibGUtYnV0dG9uIikKICAgICAgICAgICAgKGlu Y2YgY250LWZuZCkpKQogICAgICAgIChnb3RvLWNoYXIgKGJ1ZmZlci1lbmQgMCkpCiAgICAgICAg KHNldHEgY250LWZuZCAwKQogICAgICAgIChsZXQqICgoY2hrLXN0YXItc3ltIChvciBjbnQtdmFy LW5hbWUgJypjaGVjay14cmVmLXZhci13LXN0YXIqKSkKICAgICAgICAgICAgICAgKGNoay1zdGFy LXN0ciAoZm9ybWF0ICJgXCVzXCciIGNoay1zdGFyLXN5bSkpCiAgICAgICAgICAgICAgIChjaGst c3Rhci1mbmQgIChtYWtlLXN5bWJvbCAoZm9ybWF0ICI6aGVscC12YXItJXMtZm5kLW4tdG1zIiBj aGstc3Rhci1zeW0pKSkKICAgICAgICAgICAgICAgKGNoay1zdGFyLXNlZW4gKG1ha2Utc3ltYm9s IChmb3JtYXQgIjpoZWxwLXZhci0lcy1zZWVuLW4tdG1zIiBjaGstc3Rhci1zeW0pKSkpCiAgICAg ICAgICAod2hpbGUgKHNlYXJjaC1mb3J3YXJkLXJlZ2V4cCBjaGstc3Rhci1zdHIgbmlsIHQpCiAg ICAgICAgICAgIChpbmNmIGNudC1mbmQpKQogICAgICAgICAgKGlmICg+IGNudC1mbmQgMCkKICAg ICAgICAgICAgICAocHJvZ24KICAgICAgICAgICAgICAgIChzZXRxIGd0aHJuZyAwKQogICAgICAg ICAgICAgICAgKGRvbGlzdCAoYmZhIChpZiAoZXEgKGNhciBndGhyLXByb3BzKSA6aGVscC12YXIt YnRuLWZuZC1uLXRtcykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZGRyIGd0 aHItcHJvcHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGhyLXByb3BzKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGd0aHJuZykKICAgICAgICAgICAgICAgICAgKHdoZW4g KGVxdWFsIChzeW1ib2wtbmFtZSAoY2FyIChwbGlzdC1nZXQgKHBsaXN0LWdldCBiZmEgOnctcHJv cHMpICdoZWxwLWFyZ3MpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeW1ib2wt bmFtZSBjaGstc3Rhci1zeW0pKQogICAgICAgICAgICAgICAgICAgIChpbmNmIGd0aHJuZykpKQog ICAgICAgICAgICAgICAgKHNldHEgZ3Roci1wcm9wcyAKICAgICAgICAgICAgICAgICAgICAgIChu Y29uYyBgKCxjaGstc3Rhci1mbmQgLGNudC1mbmQgLGNoay1zdGFyLXNlZW4gLChvciBndGhybmcg MCkpIGd0aHItcHJvcHMpKSkKICAgICAgICAgICAgKHNldHEgZ3Roci1wcm9wcyAKICAgICAgICAg ICAgICAgICAgKG5jb25jIGAoLGNoay1zdGFyLWZuZCAwICxjaGstc3Rhci1zZWVuICwob3IgZ3Ro cm5nIDApKSBndGhyLXByb3BzKSkpKSkpCiAgICAobGV0ICgocHAtcnRuLWJmciAiKkNIRUNLLVhS RUZTLVctSEVMUC1WQVJJQUJMRS1ERUYqIikpCiAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChn ZXQtYnVmZmVyLWNyZWF0ZSBwcC1ydG4tYmZyKQogICAgICAgIChlcmFzZS1idWZmZXIpKQogICAg ICAocHAtZGlzcGxheS1leHByZXNzaW9uIChpZGVudGl0eSBndGhyLXByb3BzKSBwcC1ydG4tYmZy KQogICAgICAocG9wLXRvLWJ1ZmZlciAiKkhlbHAqIiB0KQogICAgICAocG9wLXRvLWJ1ZmZlciBw cC1ydG4tYmZyIHQpKQogICAgZ3Roci1wcm9wcykpCgo7OyA6Q0xFQU5VUAo7OyAoZG9saXN0ICh1 bmludCAnKGNoZWNrLXhyZWYtdmFyLW5vLXN0YXIKOzsgICAgICAgICAgICAgICAgICAqY2hlY2st eHJlZi12YXItdy1zdGFyKgo7OyAgICAgICAgICAgICAgICAgIGNoZWNrLXhyZWYtdGVzdC1mdW5j dGlvbgo7OyAgICAgICAgICAgICAgICAgIGNoZWNrLXhyZWZzLXctaGVscC12YXJpYWJsZS1kZWYK OzsgICAgICAgICAgICAgICAgICBoZWxwLXhyZWYtbW9kaWZ5LXN5bWJvbHMtc3ludGF4LXRhYmxl LVRFU1QKOzsgICAgICAgICAgICAgICAgICAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzLXJl Z2V4cCoKOzsgICAgICAgICAgICAgICAgICAqaGVscC14cmVmLWFzY2lpLXN5bWJvbC12YXJzKgo7 OyAgICAgICAgICAgICAgICAgICpoZWxwLXhyZWYtYXNjaWktc3ltYm9sLXZhcnMtdGVzdCopKQo7 OyAgIChtZXNzYWdlICJUaGUgY2hlY2steHJlZiBmbmNucyBhbmQgdmFycyB3ZXJlIHVuaW50ZXJu ZWQiKSkKCjs7OyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOzs7IEVPRgo= --000e0cd6adee9e0a46048b3b6038--