From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: David Fussner via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#53749: 29.0.50; [PATCH] Xref backend for TeX buffers Date: Wed, 15 May 2024 16:47:46 +0100 Message-ID: References: <1de34060-e93b-0a42-fff5-20e283abe0dc@yandex.ru> <87o7vq0zir.fsf@gnus.org> <8735d20yvd.fsf@gnus.org> <2c5c8afa-b57e-3156-d21c-5523cacb4d87@yandex.ru> <831qf1mgjl.fsf@gnu.org> <87cyyj9rpp.fsf@gnu.org> <65793.1694843596@localhost> Reply-To: David Fussner Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000008be4640618800951" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="4883"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 53749@debbugs.gnu.org, Ikumi Keita , Tassilo Horn , Arash Esbati , stefankangas@gmail.com, Dmitry Gutov , Eli Zaretskii To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed May 15 17:49:18 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1s7GsX-000110-P8 for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 15 May 2024 17:49:18 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s7GsJ-0001dT-1r; Wed, 15 May 2024 11:49:03 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s7GsG-0001YH-OS for bug-gnu-emacs@gnu.org; Wed, 15 May 2024 11:49:00 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1s7GsF-0003Bj-Tb for bug-gnu-emacs@gnu.org; Wed, 15 May 2024 11:49:00 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1s7GsH-0003S3-JK for bug-gnu-emacs@gnu.org; Wed, 15 May 2024 11:49:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: David Fussner Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 15 May 2024 15:49:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 53749 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: pending patch Original-Received: via spool by 53749-submit@debbugs.gnu.org id=B53749.171578812913249 (code B ref 53749); Wed, 15 May 2024 15:49:01 +0000 Original-Received: (at 53749) by debbugs.gnu.org; 15 May 2024 15:48:49 +0000 Original-Received: from localhost ([127.0.0.1]:42790 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1s7Gs2-0003Rb-UZ for submit@debbugs.gnu.org; Wed, 15 May 2024 11:48:49 -0400 Original-Received: from mail-pf1-f181.google.com ([209.85.210.181]:43228) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1s7Grz-0003RT-5L for 53749@debbugs.gnu.org; Wed, 15 May 2024 11:48:45 -0400 Original-Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6f457853950so5291754b3a.0 for <53749@debbugs.gnu.org>; Wed, 15 May 2024 08:48:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20230601; t=1715788055; x=1716392855; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=wG28VNEHsmBOfD7gbh6Js0uuuI5QZYQmtwXx8QNFuEQ=; b=GiRaRbM5YevgsU+PAwU1o4RgPyGlu9Ejw0pi7uI5EPf0Awi3eIVLgmnZmK3RBwCjfq hcaovSKP5uScHGx2a9Hi6oZabrNfQcmcHoa0YCrZ/wK7c81rNKyReUDoP9EWGlZ+CfcG CYrf2MHXzDr/EGikCp1akSdmTrx0drYUM1u4V8g2gOP770sTfbWSPVk3MZ8mMe2DUesK u6VSRrnxDgiUyUA3iUz6YEK3gu10gcbDASK55wWpKuEOBI62960OP05i1PqO+3OocwpW pXSRYWu0r4iVEdoEQGtGDsmJd0hz+4rO/voQUkokeaUcq+M/l/GXu6STNoWBhlmbu5ZX 9l8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715788055; x=1716392855; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=wG28VNEHsmBOfD7gbh6Js0uuuI5QZYQmtwXx8QNFuEQ=; b=kGs1ujmhUDFOOl7XKxLfZBoICSGSq6Oe3NpJlfWo+CDxjHxR+uNA/K6U5kuTGVf9Ef KU1vqVuESmjT788nW6a6wr1qSPv6gveAvQQyLHvuSnmaseSGwCwPkKD0GkWVckicDHa8 umkyLYoXic6uyI/FU61hqjsnYRhwFwLB6h2zeVUMVneety7ZT7i+ZrDWrb8pzCBL9OOj alaJjWA9W7x/ou3eKPRrO5OayrMh+CzANALeovvpE/H82qyfTJwAqgaoJCQsrGFUUcek Nd7F5nheIcfjTLH6jRqWHW5dGYUfGrUZBbnzfS9I27EpNBqAlGpTgtWmX0fcrFm20hLs 8vVg== X-Forwarded-Encrypted: i=1; AJvYcCXspdrr5+bLwok69lc6lnXngtyJg/RWz+tD9ED8o+xxjSAFzrA74pdRT2K92ArNYozUHeVDvkpxy8UO6cXYpZBQaLIUu6o= X-Gm-Message-State: AOJu0YywF6B+0Il9CmNpmETo+1e+koJp4BHok4s9Bq1YDKyy1I3HSSYd VSmjCi0wCBpQyKLaqJHmCQ3NJMzjgEZaVqtB1Ghwnz1E5p/NYuW5azpUppIxFZ+4JAmHz+p00mO slyQanld1Z2XTNvysUkPr6GLSN58= X-Google-Smtp-Source: AGHT+IGnwhPLnCUZWy65ZvMBqck5gOzZXq/aBodpiRX8T9dv3a7Cz1b1TYfZKDJgQE/8h17i4e2G788/Par0JzZYo/Y= X-Received: by 2002:a17:90b:4f8d:b0:2a2:fec9:1bbd with SMTP id 98e67ed59e1d1-2b65fe214c7mr28090302a91.17.1715788055297; Wed, 15 May 2024 08:47:35 -0700 (PDT) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:285094 Archived-At: --0000000000008be4640618800951 Content-Type: text/plain; charset="UTF-8" Hi Stefan, I attach an updated patch for tex-mode and etags, in which I've attempted to include all of your recommendations. A few notes: 1. I changed the name as well as the doc string of the variable holding the TeX escape and grouping chars (now `tex-thingatpt-exclude-chars`). I hope this makes it clearer. 2. I removed the regexp for detecting expl3 constructs, and now rely on the mechanism I outlined in my previous work-in-progress patch: (a) Test for expl3 class or package, set `tex-expl-file-p` to t. (b) If not (a), add `tex-expl-region-set` to the `syntax-propertize-extend-region-functions` hook to list all regions between \ExplSyntaxOn and \ExplSyntaxOff (`tex-expl-region-list`). (c) Add test in `tex-font-lock-suscript` for (a) then (b), don't subscript after the underscore when either is t. 3. I tried benchmarking `syntax-ppss-flush-cache` and `font-lock-flush` before and after the changes. The former had a maximum slowdown of 0.5% (usually less) and the latter a maximum of 0.2%, but if you want to see my methodology or suggest something to try please let me know. 4. I left the bespoke `syntax-propertize-function` in the `xref-backend-references` method uncompiled, as simple benchmarking suggested no perceptible gain from byte compiling it. Using `syntax-ppss-flush-cache` to restore the status quo ante in each file-visiting buffer streamlined the code and made it do what it was supposed to do. Thanks again for your advice, and please let me know what still needs work. Best, David. On Fri, 3 May 2024 at 15:11, Stefan Monnier wrote: > > Hi, > > Apparently I'm the `tex-mode.el` guy, so I tried to take a look. > > > diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el > > index 97c950267c6..d990a2dbfa9 100644 > > --- a/lisp/textmodes/tex-mode.el > > +++ b/lisp/textmodes/tex-mode.el > > @@ -695,7 +696,25 @@ tex-verbatim-environments > > ("\\\\\\(?:end\\|begin\\) *\\({[^\n{}]*}\\)" > > (1 (ignore > > (tex-env-mark (match-beginning 0) > > - (match-beginning 1) (match-end 1)))))))) > > + (match-beginning 1) (match-end 1))))) > > + ;; The next two rules change the syntax of `:' and `_' in expl3 > > + ;; constructs, so that `tex-font-lock-suscript' can fontify them > > + ;; more accurately. > > + ((concat "\\(\\(?:[\\\\[:space:]{]_\\|" > > + "[\\\\{[:space:]][^][_[:space:][:cntrl:][:digit:]\\\\{}()/=]+\\)" > > + "\\(?:_+\\(?:[^][[:space:][:cntrl:][:digit:]:\\\\{}()/#_=]+\\|" > > + "#+[1-9]\\)\\)+\\)\\([:_]?\\)") > > Can you add in the comment some URL pointing to some relevant expl3 > documentation which "explains" why the above regexp makes sense? > Also I don't clearly see how the above regexp distinguishes expl3 code > from "normal" LaTeX code, so the comment should say something about it. > > Side note: I'd avoid [:space:] whose exact meaning is rarely quite what > we need. > Side note: backslash doesn't need to be backslashed in [...]. > > > + (1 (ignore > > + (let* ((expr (buffer-substring-no-properties (match-beginning 1) > > + (match-end 1))) > > + (list (seq-positions expr ?_))) > > + (dolist (pos list) > > + (put-text-property (+ pos (match-beginning 1)) > > + (1+ (+ pos (match-beginning 1))) > > + 'syntax-table (string-to-syntax "_")))))) > > + (2 "_")) > > + ("\\\\[[:alpha:]]+\\(:\\)[[:alpha:][:space:]\n]" > > + (1 "_"))))) > > Currently we "skip" inappropriate underscores via > `tex-font-lock-match-suscript` and/or by adding a particular `face` text > property rather than via `syntax-table/propertize`. > > For algorithmic reasons, it's better to minimize the work done in > `syntax-propertize-function` as much as possible (font-lock is more lazy > than `syntax-propertize`), so I recommend you try and moving the above > to font-lock rules. > > > +(defvar tex-esc-and-group-chars '(?\\ ?{ ?}) > > + "The current TeX escape and grouping characters. > > I recommend you backslash escape the { and } above (although it's not > indispensable, `emacs-lisp-mode` will parse the code better). > More importantly, the docstring doesn't explain what this list > means/does. E.g. does the order matter? Can it be longer than 3 elements? > > From the current docstring I can't guess what would be the consequence > of adding/removing elements to/from this list. > > > +;; Populate `semantic-symref-filepattern-alist' for the in-tree modes; > > +;; AUCTeX is doing the same for its modes. > > +(defvar semantic-symref-filepattern-alist) > > +(with-eval-after-load 'semantic/symref/grep > > + (push '(latex-mode "*.[tT]e[xX]" "*.ltx" "*.sty" "*.cl[so]" > > + "*.bbl" "*.drv" "*.hva") > > + semantic-symref-filepattern-alist) > > + (push '(plain-tex-mode "*.[tT]e[xX]" "*.ins") > > + semantic-symref-filepattern-alist) > > + (push '(doctex-mode "*.dtx") semantic-symref-filepattern-alist)) > > We know `semantic-symref-filepattern-alist` will exist when > `semantic/symref/grep` is loaded, but not before, so I'd put the > `defvar` inside the `with-eval-after-load`. > > > +;; Setup AUCTeX modes (for testing purposes only). > > + > > +(add-hook 'TeX-mode-hook #'tex-set-auctex-xref-backend) > > + > > +(defun tex-set-auctex-xref-backend () > > + (add-hook 'xref-backend-functions #'tex--xref-backend nil t)) > > I assume this will be sent to AUCTeX and is not meant to be in > `tex-mode.el`, right? > > > +;; `xref-find-references' currently may need this when called from a > > +;; latex-mode buffer in order to search files or buffers with a .tex > > +;; suffix (including the buffer from which it has been called). We > > +;; append it to `auto-mode-alist' so as not to interfere with the usual > > +;; mode-setting apparatus. Changes here and in AUCTeX should soon > > +;; render it unnecessary. > > +(add-to-list 'auto-mode-alist '("\\.[tT]e[xX]\\'" . latex-mode) t) > > Maybe I have not followed the whole discussion closely enough, but at > least to me the above "soon" is very unclear. > I'll assume that this code will be removed before we install the patch. > If not, please explain in the comment why this specific hack is needed > and how it works. > > > +(cl-defmethod xref-backend-references ((_backend (eql 'tex-etags)) identifier) > > + "Find references of IDENTIFIER in TeX buffers and files." > > + (require 'semantic/symref/grep) > > + (let (bufs texbufs > > + (mode major-mode)) > > + (dolist (buf (buffer-list)) > > + (if (eq (buffer-local-value 'major-mode buf) mode) > > + (push buf bufs) > > + (when (string-match-p ".*\\.[tT]e[xX]" (buffer-name buf)) > > + (push buf texbufs)))) > > + (unless (seq-set-equal-p tex--buffers-list bufs) > > + (let* ((amalist (tex--collect-file-extensions)) > > + (extlist (alist-get mode semantic-symref-filepattern-alist)) > > + (extlist-new (seq-uniq > > + (seq-union amalist extlist #'string-match-p)))) > > After sinking the `defvar` above, you'll need to add a new `defvar` for > `semantic-symref-filepattern-alist` just after the `require`. > > > + (setq-local syntax-propertize-function > > + (eval > > + `(tex-xref-syntax-function > > + ,identifier ,beg ,end))) > > Why do we need to change `syntax-propertize-function` and why do we need > `eval`? > > > + (setq syntax-propertize--done 0) > > This is not sufficient. You want to `syntax-ppss-flush-cache`. > > > Stefan > --0000000000008be4640618800951 Content-Type: text/x-patch; charset="US-ASCII"; name="0002-Provide-a-modified-xref-backend-for-TeX-buffers.patch" Content-Disposition: attachment; filename="0002-Provide-a-modified-xref-backend-for-TeX-buffers.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lw7zw08w0 RnJvbSA4N2Q4Mzc3OGNlOGMzNTM2NTkzNzMyMjE4M2QxMDFiZTIzNGFjODgyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBGdXNzbmVyIDxkZnVzc25lckBnb29nbGVtYWlsLmNv bT4KRGF0ZTogV2VkLCAxNSBNYXkgMjAyNCAxNjozNjoxNSArMDEwMApTdWJqZWN0OiBbUEFUQ0hd IFByb3ZpZGUgYSBtb2RpZmllZCB4cmVmIGJhY2tlbmQgZm9yIFRlWCBidWZmZXJzCgoqIGxpYi1z cmMvZXRhZ3MuYyAoVGVYX2NvbW1hbmRzKTogSW1wcm92ZSBwYXJzaW5nIG9mIGNvbW1hbmRzIGlu IFRlWApidWZmZXJzLgooVEVYX2RlZmVudik6IEV4cGFuZCBsaXN0IG9mIGNvbW1hbmRzIHRvIHRh ZyBieSBkZWZhdWx0IGluIFRlWApidWZmZXJzLgooVGVYX2hlbHApOgoqIGRvYy9lbWFjcy9tYWlu dGFpbmluZy50ZXhpIChUYWcgU3ludGF4KTogRG9jdW1lbnQgbmV3IHRhZ2dlZApjb21tYW5kcy4K KElkZW50aWZpZXIgU2VhcmNoKTogQWRkIG5vdGUgYWJvdXQgc2VtYW50aWMtc3ltcmVmLWZpbGVw YXR0ZXJuLWFsaXN0LAphdXRvLW1vZGUtYWxpc3QsIGFuZCB4cmVmLWZpbmQtcmVmZXJlbmNlcy4K CiogbGlzcC90ZXh0bW9kZXMvdGV4LW1vZGUuZWwgKHRleC1mb250LWxvY2stc3VzY3JpcHQpOiBU ZXN0IGZvcgp1bmRlcnNjb3JlIGluIGV4cGwzIGZpbGVzIGFuZCByZWdpb25zLCBkaXNhYmxlIHN1 YnNjcmlwdCBmYWNlIHRoZXJlLgoodGV4LWNvbW1vbi1pbml0aWFsaXphdGlvbik6IFNldCB1cCB4 cmVmIGJhY2tlbmQgZm9yIGluLXRyZWUgVGVYCm1vZGVzLiBEZXRlY3QgZXhwbDMgZmlsZXMsIGFu ZCBpbiBvdGhlcnMgc2V0IHVwIGEgbGlzdCBvZiBleHBsMwpyZWdpb25zLgoodGV4LWV4cGwtYnVm ZmVyLXBhcnNlKTogTmV3IGZ1bmN0aW9uIGNhbGxlZCBpbiBwcmV2aW91cy4KKHRleC1leHBsLWJ1 ZmZlci1wKTogTmV3IHZhciB0byBob2xkIHRoZSByZXN1bHQgb2YgcHJldmlvdXMuCih0ZXgtZXhw bC1yZWdpb24tc2V0KTogTmV3IGZ1bmN0aW9uIGFkZGVkIHRvCidzeW50YXgtcHJvcGVydGl6ZS1l eHRlbmQtcmVnaW9uLWZ1bmN0aW9ucycgaG9vay4KKHRleC1leHBsLXJlZ2lvbi1saXN0KTogTmV3 IHZhciB0byBob2xkIHRoZSByZXN1bHQgb2YgcHJldmlvdXMuCih0ZXgtLXRoaW5nLWF0LXBvaW50 LCB0ZXgtdGhpbmdhdHB0LS1iZWdpbm5pbmctb2Ytc3ltYm9sKQoodGV4LXRoaW5nYXRwdC0tZW5k LW9mLXN5bWJvbCwgdGV4LS1ib3VuZHMtb2Ytc3ltYm9sLWF0LXBvaW50KToKTmV3IGZ1bmN0aW9u cyB0byByZXR1cm4gJ3RoaW5nLWF0LXBvaW50JyBmb3IgeHJlZiBiYWNrZW5kLgoodGV4LXRoaW5n YXRwdC1leGNsdWRlLWNoYXJzKTogTmV3IHZhciB0byBkbyB0aGUgc2FtZS4KKHhyZWYtYmFja2Vu ZC1pZGVudGlmaWVyLWF0LXBvaW50KTogTmV3IFRlWCBiYWNrZW5kIG1ldGhvZCB0byBwcm92aWRl CnN5bWJvbHMgZm9yIHByb2Nlc3NpbmcgYnkgeHJlZi4KKHhyZWYtYmFja2VuZC1pZGVudGlmaWVy LWNvbXBsZXRpb24tdGFibGUpCih4cmVmLWJhY2tlbmQtaWRlbnRpZmllci1jb21wbGV0aW9uLWln bm9yZS1jYXNlKQooeHJlZi1iYWNrZW5kLWRlZmluaXRpb25zLCB4cmVmLWJhY2tlbmQtYXByb3Bv cyk6IFBsYWNlaG9sZGVycyB0bwpjYWxsIHRoZSBzdGFuZGFyZCAnZXRhZ3MnIHhyZWYgYmFja2Vu ZCBtZXRob2RzLgooeHJlZi1iYWNrZW5kLXJlZmVyZW5jZXMpOiBXcmFwcGVyIHRvIGNhbGwgdGhl IGRlZmF1bHQgeHJlZiBiYWNrZW5kCm1ldGhvZCwgZmluZGluZyBhcyBtYW55IHJlbGV2YW50IGZp bGVzIGFzIHBvc3NpYmxlIGFuZCB1c2luZyBhIGJlc3Bva2UKc3ludGF4LXByb3BlcnRpemUtZnVu Y3Rpb24gd2hlbiByZXF1aXJlZC4KKHRleC0tY29sbGVjdC1maWxlLWV4dGVuc2lvbnMsIHRleC14 cmVmLXN5bnRheC1mdW5jdGlvbik6IEhlbHBlcgpmdW5jdGlvbnMgZm9yIHByZXZpb3VzLgoodGV4 LWZpbmQtcmVmZXJlbmNlcy1zeW50YXgtdGFibGUsIHRleC0tYnVmZmVycy1saXN0KQoodGV4LS14 cmVmLXN5bnRheC1mdW4sIHRleC0tb2xkLXN5bnRheC1mdW5jdGlvbik6IE5ldyB2YXJzIGZvciBz YW1lLgotLS0KIGRvYy9lbWFjcy9tYWludGFpbmluZy50ZXhpIHwgIDM5ICsrKy0KIGxpYi1zcmMv ZXRhZ3MuYyAgICAgICAgICAgIHwgMTg5ICsrKysrKysrKysrKysrKysrLS0KIGxpc3AvdGV4dG1v ZGVzL3RleC1tb2RlLmVsIHwgMzcyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Ky0KIDMgZmlsZXMgY2hhbmdlZCwgNTc5IGluc2VydGlvbnMoKyksIDIxIGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL2RvYy9lbWFjcy9tYWludGFpbmluZy50ZXhpIGIvZG9jL2VtYWNzL21haW50 YWluaW5nLnRleGkKaW5kZXggNTc5MDk4YzgxYjEuLmEwNjQxMDNhYTI1IDEwMDY0NAotLS0gYS9k b2MvZW1hY3MvbWFpbnRhaW5pbmcudGV4aQorKysgYi9kb2MvZW1hY3MvbWFpbnRhaW5pbmcudGV4 aQpAQCAtMjUyOSw2ICsyNTI5LDE1IEBAIElkZW50aWZpZXIgU2VhcmNoCiByZWZlcmVuY2VkLiAg VGhlIFhSRUYgbW9kZSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgYnVmZmVyLCBzZWUK IEByZWZ7WHJlZiBDb21tYW5kc30uCiAKK1doZW4gaW52b2tlZCBpbiBhIGJ1ZmZlciB3aG9zZSBt YWpvciBtb2RlIHVzZXMgdGhlIEBjb2Rle2V0YWdzfSBiYWNrZW5kLAorQGtiZHtNLT99IHNlYXJj aGVzIGZpbGVzIGFuZCBidWZmZXJzIHdob3NlIG1ham9yIG1vZGUgbWF0Y2hlcyB0aGF0IG9mCit0 aGUgb3JpZ2luYWwgYnVmZmVyLiAgSXQgZ3Vlc3NlcyB0aGF0IG1vZGUgZnJvbSBmaWxlIGV4dGVu c2lvbnMsIHNvIGlmCitAa2Jke00tP30gc2VlbXMgdG8gYmUgc2tpcHBpbmcgcmVsZXZhbnQgYnVm ZmVycyBvciBmaWxlcywgdHJ5CitjdXN0b21pemluZyBlaXRoZXIgdGhlIHZhcmlhYmxlIEBjb2Rl e3NlbWFudGljLXN5bXJlZi1maWxlcGF0dGVybi1hbGlzdH0KKyhpZiB5b3VyIGJ1ZmZlcidzIG1h am9yIG1vZGUgYWxyZWFkeSBoYXMgYW4gZW50cnkgaW4gaXQpLCBvcgorQGNvZGV7YXV0by1tb2Rl LWFsaXN0fSAoaWYgbm90KSwgdGhlcmVieSBpbmZvcm1pbmcgQGNvZGV7eHJlZn0gb2YgdGhlCitt aXNzaW5nIGV4dGVuc2lvbnMgKEBweHJlZntDaG9vc2luZyBNb2Rlc30pLgorCiBAdmluZGV4IHhy ZWYtYXV0by1qdW1wLXRvLWZpcnN0LXhyZWYKICAgSWYgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJs ZSBAY29kZXt4cmVmLWF1dG8tanVtcC10by1maXJzdC14cmVmfSBpcwogQGNvZGV7dH0sIEBjb2Rl e3hyZWYtZmluZC1yZWZlcmVuY2VzfSBhdXRvbWF0aWNhbGx5IGp1bXBzIHRvIHRoZSBmaXJzdApA QCAtMjc0NywxMCArMjc1NiwzMiBAQCBUYWcgU3ludGF4CiBAaXRlbQogSW4gQExhVGVYe30gZG9j dW1lbnRzLCB0aGUgYXJndW1lbnRzIGZvciBAY29kZXtcY2hhcHRlcn0sCiBAY29kZXtcc2VjdGlv bn0sIEBjb2Rle1xzdWJzZWN0aW9ufSwgQGNvZGV7XHN1YnN1YnNlY3Rpb259LAotQGNvZGV7XGVx bm99LCBAY29kZXtcbGFiZWx9LCBAY29kZXtccmVmfSwgQGNvZGV7XGNpdGV9LAotQGNvZGV7XGJp Yml0ZW19LCBAY29kZXtccGFydH0sIEBjb2Rle1xhcHBlbmRpeH0sIEBjb2Rle1xlbnRyeX0sCi1A Y29kZXtcaW5kZXh9LCBAY29kZXtcZGVmfSwgQGNvZGV7XG5ld2NvbW1hbmR9LCBAY29kZXtccmVu ZXdjb21tYW5kfSwKLUBjb2Rle1xuZXdlbnZpcm9ubWVudH0gYW5kIEBjb2Rle1xyZW5ld2Vudmly b25tZW50fSBhcmUgdGFncy4KK0Bjb2Rle1xlcW5vfSwgQGNvZGV7XGxhYmVsfSwgQGNvZGV7XHJl Zn0sIEBjb2Rle1xSZWZ9LCBAY29kZXtcZm9vdHJlZn0sCitAY29kZXtcY2l0ZX0sIEBjb2Rle1xi aWJpdGVtfSwgQGNvZGV7XHBhcnR9LCBAY29kZXtcYXBwZW5kaXh9LAorQGNvZGV7XGVudHJ5fSwg QGNvZGV7XGluZGV4fSwgQGNvZGV7XGRlZn0sIEBjb2Rle1xlZGVmfSwgQGNvZGV7XGdkZWZ9LAor QGNvZGV7XHhkZWZ9LCBAY29kZXtcbmV3Y29tbWFuZH0sIEBjb2Rle1xyZW5ld2NvbW1hbmR9LAor QGNvZGV7XG5ld2Vudmlyb25tZW50fSwgQGNvZGV7XHJlbmV3ZW52aXJvbm1lbnR9LAorQGNvZGV7 XERlY2xhcmVSb2J1c3RDb21tYW5kfSwgQGNvZGV7XG5ld3JvYnVzdGNtZH0sCitAY29kZXtccmVu ZXdyb2J1c3RjbWR9LCBAY29kZXtccHJvdmlkZWNvbW1hbmR9LAorQGNvZGV7XHByb3ZpZGVyb2J1 c3RjbWR9LCBAY29kZXtcTmV3RG9jdW1lbnRDb21tYW5kfSwKK0Bjb2Rle1xSZW5ld0RvY3VtZW50 Q29tbWFuZH0sIEBjb2Rle1xQcm92aWRlRG9jdW1lbnRDb21tYW5kfSwKK0Bjb2Rle1xEZWNsYXJl RG9jdW1lbnRDb21tYW5kfSwgQGNvZGV7XE5ld0V4cGFuZGFibGVEb2N1bWVudENvbW1hbmR9LAor QGNvZGV7XFJlbmV3RXhwYW5kYWJsZURvY3VtZW50Q29tbWFuZH0sCitAY29kZXtcUHJvdmlkZUV4 cGFuZGFibGVEb2N1bWVudENvbW1hbmR9LAorQGNvZGV7XERlY2xhcmVFeHBhbmRhYmxlRG9jdW1l bnRDb21tYW5kfSwKK0Bjb2Rle1xOZXdEb2N1bWVudEVudmlyb25tZW50fSwgQGNvZGV7XFJlbmV3 RG9jdW1lbnRFbnZpcm9ubWVudH0sCitAY29kZXtcUHJvdmlkZURvY3VtZW50RW52aXJvbm1lbnR9 LCBAY29kZXtcRGVjbGFyZURvY3VtZW50RW52aXJvbm1lbnR9LAorQGNvZGV7XGNzZGVmfSwgQGNv ZGV7XGNzZWRlZn0sIEBjb2Rle1xjc2dkZWZ9LCBAY29kZXtcY3N4ZGVmfSwKK0Bjb2Rle1xjc2xl dGNzfSwgQGNvZGV7XGNzbGV0fSwgQGNvZGV7XGxldGNzfSwgQGNvZGV7XGxldH0sCitAY29kZXtc Y3NfbmV3X3Byb3RlY3RlZF9ub3Bhcn0sIEBjb2Rle1xjc19uZXdfcHJvdGVjdGVkfSwKK0Bjb2Rl e1xjc19uZXdfbm9wYXJ9LCBAY29kZXtcY3NfbmV3X2VxfSwgQGNvZGV7XGNzX25ld30sCitAY29k ZXtcY3Nfc2V0X3Byb3RlY3RlZF9ub3Bhcn0sIEBjb2Rle1xjc19zZXRfcHJvdGVjdGVkfSwKK0Bj b2Rle1xjc19zZXRfbm9wYXJ9LCBAY29kZXtcY3Nfc2V0X2VxfSwgQGNvZGV7XGNzX3NldH0sCitA Y29kZXtcY3NfZ3NldF9wcm90ZWN0ZWRfbm9wYXJ9LCBAY29kZXtcY3NfZ3NldF9wcm90ZWN0ZWR9 LAorQGNvZGV7XGNzX2dzZXRfbm9wYXJ9LCBAY29kZXtcY3NfZ3NldF9lcX0sIEBjb2Rle1xjc19n c2V0fSwKK0Bjb2Rle1xjc19nZW5lcmF0ZV9mcm9tX2FyZ19jb3VudH0sIGFuZCBAY29kZXtcY3Nf Z2VuZXJhdGVfdmFyaWFudH0gYXJlCit0YWdzLiAgU28gdG9vIGFyZSB0aGUgYXJndW1lbnRzIG9m IGFueSBzdGFycmVkIHZhcmlhbnRzIG9mIHRoZXNlCitjb21tYW5kcy4KIAogT3RoZXIgY29tbWFu ZHMgY2FuIG1ha2UgdGFncyBhcyB3ZWxsLCBpZiB5b3Ugc3BlY2lmeSB0aGVtIGluIHRoZQogZW52 aXJvbm1lbnQgdmFyaWFibGUgQGVudntURVhUQUdTfSBiZWZvcmUgaW52b2tpbmcgQGNvbW1hbmR7 ZXRhZ3N9LiAgVGhlCmRpZmYgLS1naXQgYS9saWItc3JjL2V0YWdzLmMgYi9saWItc3JjL2V0YWdz LmMKaW5kZXggMDNiYzU1ZGUwM2QuLjExZmRkYzE4N2MyIDEwMDY0NAotLS0gYS9saWItc3JjL2V0 YWdzLmMKKysrIGIvbGliLXNyYy9ldGFncy5jCkBAIC03OTMsMTEgKzc5MywyNyBAQCAjZGVmaW5l IFNURElOIDB4MTAwMQkJLyogcmV0dXJuZWQgYnkgZ2V0b3B0X2xvbmcgb24gLS1wYXJzZS1zdGRp biAqLwogc3RhdGljIGNvbnN0IGNoYXIgKlRlWF9zdWZmaXhlcyBbXSA9CiAgIHsgImJpYiIsICJj bG8iLCAiY2xzIiwgImx0eCIsICJzdHkiLCAiVGVYIiwgInRleCIsIE5VTEwgfTsKIHN0YXRpYyBj b25zdCBjaGFyIFRlWF9oZWxwIFtdID0KLSJJbiBMYVRlWCB0ZXh0LCB0aGUgYXJndW1lbnQgb2Yg YW55IG9mIHRoZSBjb21tYW5kcyAnXFxjaGFwdGVyJyxcblwKLSdcXHNlY3Rpb24nLCAnXFxzdWJz ZWN0aW9uJywgJ1xcc3Vic3Vic2VjdGlvbicsICdcXGVxbm8nLCAnXFxsYWJlbCcsXG5cCi0nXFxy ZWYnLCAnXFxjaXRlJywgJ1xcYmliaXRlbScsICdcXHBhcnQnLCAnXFxhcHBlbmRpeCcsICdcXGVu dHJ5JyxcblwKLSdcXGluZGV4JywgJ1xcZGVmJywgJ1xcbmV3Y29tbWFuZCcsICdcXHJlbmV3Y29t bWFuZCcsXG5cCi0nXFxuZXdlbnZpcm9ubWVudCcgb3IgJ1xccmVuZXdlbnZpcm9ubWVudCcgaXMg YSB0YWcuXG5cCisiSW4gTGFUZVggdGV4dCwgdGhlIGFyZ3VtZW50IG9mIHRoZSBjb21tYW5kcyAn XFxjaGFwdGVyJywgJ1xcc2VjdGlvbicsXG5cCisnXFxzdWJzZWN0aW9uJywgJ1xcc3Vic3Vic2Vj dGlvbicsICdcXGVxbm8nLCAnXFxsYWJlbCcsICdcXHJlZicsXG5cCisnXFxSZWYnLCAnXFxmb290 cmVmJywgJ1xcY2l0ZScsICdcXGJpYml0ZW0nLCAnXFxwYXJ0JywgJ1xcYXBwZW5kaXgnLFxuXAor J1xcZW50cnknLCAnXFxpbmRleCcsICdcXGRlZicsICdcXGVkZWYnLCAnXFxnZGVmJywgJ1xceGRl ZicsXG5cCisnXFxuZXdjb21tYW5kJywgJ1xccmVuZXdjb21tYW5kJywgJ1xcbmV3cm9idXN0Y21k JywgJ1xccmVuZXdyb2J1c3RjbWQnLFxuXAorJ1xcbmV3ZW52aXJvbm1lbnQnLCAnXFxyZW5ld2Vu dmlyb25tZW50JywgJ1xcRGVjbGFyZVJvYnVzdENvbW1hbmQnLFxuXAorJ1xccHJvdmlkZWNvbW1h bmQnLCAnXFxwcm92aWRlcm9idXN0Y21kJywgJ1xcTmV3RG9jdW1lbnRDb21tYW5kJyxcblwKKydc XFJlbmV3RG9jdW1lbnRDb21tYW5kJywgJ1xcUHJvdmlkZURvY3VtZW50Q29tbWFuZCcsXG5cCisn XFxEZWNsYXJlRG9jdW1lbnRDb21tYW5kJywgJ1xcTmV3RXhwYW5kYWJsZURvY3VtZW50Q29tbWFu ZCcsXG5cCisnXFxSZW5ld0V4cGFuZGFibGVEb2N1bWVudENvbW1hbmQnLCAnXFxQcm92aWRlRXhw YW5kYWJsZURvY3VtZW50Q29tbWFuZCcsXG5cCisnXFxEZWNsYXJlRXhwYW5kYWJsZURvY3VtZW50 Q29tbWFuZCcsICdcXE5ld0RvY3VtZW50RW52aXJvbm1lbnQnLFxuXAorJ1xcUmVuZXdEb2N1bWVu dEVudmlyb25tZW50JywgJ1xcUHJvdmlkZURvY3VtZW50RW52aXJvbm1lbnQnLFxuXAorJ1xcRGVj bGFyZURvY3VtZW50RW52aXJvbm1lbnQnLCdcXGNzZGVmJywgJ1xcY3NlZGVmJywgJ1xcY3NnZGVm JyxcblwKKydcXGNzeGRlZicsICdcXGNzbGV0Y3MnLCAnXFxjc2xldCcsICdcXGxldGNzJywgJ1xc bGV0JyxcblwKKydcXGNzX25ld19wcm90ZWN0ZWRfbm9wYXInLCAnXFxjc19uZXdfcHJvdGVjdGVk JywgJ1xcY3NfbmV3X25vcGFyJyxcblwKKydcXGNzX25ld19lcScsICdcXGNzX25ldycsICdcXGNz X3NldF9wcm90ZWN0ZWRfbm9wYXInLFxuXAorJ1xcY3Nfc2V0X3Byb3RlY3RlZCcsICdcXGNzX3Nl dF9ub3BhcicsICdcXGNzX3NldF9lcScsICdcXGNzX3NldCcsXG5cCisnXFxjc19nc2V0X3Byb3Rl Y3RlZF9ub3BhcicsICdcXGNzX2dzZXRfcHJvdGVjdGVkJywgJ1xcY3NfZ3NldF9ub3BhcicsXG5c CisnXFxjc19nc2V0X2VxJywgJ1xcY3NfZ3NldCcsICdcXGNzX2dlbmVyYXRlX2Zyb21fYXJnX2Nv dW50Jywgb3JcblwKKydcXGNzX2dlbmVyYXRlX3ZhcmlhbnQnIGlzIGEgdGFnLiAgU28gaXMgdGhl IGFyZ3VtZW50IG9mIGFueSBzdGFycmVkXG5cCit2YXJpYW50IG9mIHRoZXNlIGNvbW1hbmRzLlxu XAogXG5cCiBPdGhlciBjb21tYW5kcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlIGVu dmlyb25tZW50IHZhcmlhYmxlXG5cCiAnVEVYVEFHUycgdG8gYSBjb2xvbi1zZXBhcmF0ZWQgbGlz dCBsaWtlLCBmb3IgZXhhbXBsZSxcblwKQEAgLTU3NDAsMTEgKzU3NTYsMjUgQEAgU2NoZW1lX2Z1 bmN0aW9ucyAoRklMRSAqaW5mKQogc3RhdGljIGxpbmVidWZmZXIgKlRFWF90b2t0YWIgPSBOVUxM OyAvKiBUYWJsZSB3aXRoIHRhZyB0b2tlbnMgKi8KIAogLyogRGVmYXVsdCBzZXQgb2YgY29udHJv bCBzZXF1ZW5jZXMgdG8gcHV0IGludG8gVEVYX3Rva3RhYi4KLSAgIFRoZSB2YWx1ZSBvZiBlbnZp cm9ubWVudCB2YXIgVEVYVEFHUyBpcyBwcmVwZW5kZWQgdG8gdGhpcy4gICovCisgICBUaGUgdmFs dWUgb2YgZW52aXJvbm1lbnQgdmFyIFRFWFRBR1MgaXMgcHJlcGVuZGVkIHRvIHRoaXMuCisgICAo MjAyNCkgQWRkIHZhcmlhbnRzIG9mICdcZGVmJywgc29tZSBhZGRpdGlvbmFsIExhVGVYIChhbmQK KyAgIGZvcm1lciB4cGFyc2UpIGNvbW1hbmRzLCBjb21tb24gdmFyaWFudHMgZnJvbSB0aGUKKyAg ICdldG9vbGJveCcgcGFja2FnZSwgYW5kIHRoZSBtYWluIGV4cGwzIGNvbW1hbmRzLiAqLwogc3Rh dGljIGNvbnN0IGNoYXIgKlRFWF9kZWZlbnYgPSAiXAotOmNoYXB0ZXI6c2VjdGlvbjpzdWJzZWN0 aW9uOnN1YnN1YnNlY3Rpb246ZXFubzpsYWJlbDpyZWY6Y2l0ZTpiaWJpdGVtXAotOnBhcnQ6YXBw ZW5kaXg6ZW50cnk6aW5kZXg6ZGVmXAotOm5ld2NvbW1hbmQ6cmVuZXdjb21tYW5kOm5ld2Vudmly b25tZW50OnJlbmV3ZW52aXJvbm1lbnQiOworOmxhYmVsOnJlZjpSZWY6Zm9vdHJlZjpjaGFwdGVy OnNlY3Rpb246c3Vic2VjdGlvbjpzdWJzdWJzZWN0aW9uOmVxbm86Y2l0ZVwKKzpiaWJpdGVtOnBh cnQ6YXBwZW5kaXg6ZW50cnk6aW5kZXg6ZGVmOmVkZWY6Z2RlZjp4ZGVmOm5ld2NvbW1hbmQ6cmVu ZXdjb21tYW5kXAorOm5ld2Vudmlyb25tZW50OnJlbmV3ZW52aXJvbm1lbnQ6RGVjbGFyZVJvYnVz dENvbW1hbmQ6cmVuZXdyb2J1c3RjbWRcCis6bmV3cm9idXN0Y21kOnByb3ZpZGVjb21tYW5kOnBy b3ZpZGVyb2J1c3RjbWQ6TmV3RG9jdW1lbnRDb21tYW5kXAorOlJlbmV3RG9jdW1lbnRDb21tYW5k OlByb3ZpZGVEb2N1bWVudENvbW1hbmQ6RGVjbGFyZURvY3VtZW50Q29tbWFuZFwKKzpOZXdFeHBh bmRhYmxlRG9jdW1lbnRDb21tYW5kOlJlbmV3RXhwYW5kYWJsZURvY3VtZW50Q29tbWFuZFwKKzpQ cm92aWRlRXhwYW5kYWJsZURvY3VtZW50Q29tbWFuZDpEZWNsYXJlRXhwYW5kYWJsZURvY3VtZW50 Q29tbWFuZFwKKzpOZXdEb2N1bWVudEVudmlyb25tZW50OlJlbmV3RG9jdW1lbnRFbnZpcm9ubWVu dFwKKzpQcm92aWRlRG9jdW1lbnRFbnZpcm9ubWVudDpEZWNsYXJlRG9jdW1lbnRFbnZpcm9ubWVu dDpjc2RlZlwKKzpjc2VkZWY6Y3NnZGVmOmNzeGRlZjpjc2xldGNzOmNzbGV0OmxldGNzOmxldDpj c19uZXdfcHJvdGVjdGVkX25vcGFyXAorOmNzX25ld19wcm90ZWN0ZWQ6Y3NfbmV3X25vcGFyOmNz X25ld19lcTpjc19uZXc6Y3Nfc2V0X3Byb3RlY3RlZF9ub3BhclwKKzpjc19zZXRfcHJvdGVjdGVk OmNzX3NldF9ub3Bhcjpjc19zZXRfZXE6Y3Nfc2V0OmNzX2dzZXRfcHJvdGVjdGVkX25vcGFyXAor OmNzX2dzZXRfcHJvdGVjdGVkOmNzX2dzZXRfbm9wYXI6Y3NfZ3NldF9lcTpjc19nc2V0XAorOmNz X2dlbmVyYXRlX2Zyb21fYXJnX2NvdW50OmNzX2dlbmVyYXRlX3ZhcmlhbnQiOwogCiBzdGF0aWMg dm9pZCBURVhfZGVjb2RlX2VudiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogCkBAIC01 ODAzLDE5ICs1ODMzLDEzNyBAQCBUZVhfY29tbWFuZHMgKEZJTEUgKmluZikKIAkgICAgICB7CiAJ CWNoYXIgKnA7CiAJCXB0cmRpZmZfdCBuYW1lbGVuLCBsaW5lbGVuOwotCQlib29sIG9wZ3JwID0g ZmFsc2U7CisJCWJvb2wgb3BncnAgPSBmYWxzZSwgb25lX2VzYyA9IGZhbHNlLCBpc19leHBsdGhy ZWUgPSBmYWxzZTsKIAogCQljcCA9IHNraXBfc3BhY2VzIChjcCArIGtleS0+bGVuKTsKKworCQkv KiAxLiBUaGUgY2Fub25pY2FsIGV4cGwzIHN5bnRheCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlz OgorCQkgICBcY3NfbmV3Ok5wbiBcX19ob29rX3RsX2dwdXQ6Tm4geyBcRVJST1IgfS4gIEZpcnN0 LCBpZiB3ZQorCQkgICB3YW50IHRvIHRhZyBhbnkgc3VjaCBjb21tYW5kcywgd2UgaW5jbHVkZSBv bmx5IHRoZSBwYXJ0CisJCSAgIGJlZm9yZSB0aGUgY29sb24gKGNzX25ldykgaW4gVEVYX2RlZmVu diBvciBURVhUQUdTLiAgU2Vjb25kLAorCQkgICBldGFncyBza2lwcyB0aGUgYXJndW1lbnQgc3Bl Y2lmaWVyIChpbmNsdWRpbmcgdGhlIGNvbG9uKQorCQkgICBhZnRlciB0aGUgdGFnIHRva2VuLCBz byB0aGF0IGl0IGRvZXNuJ3QgYmVjb21lIHRoZSB0YWcgbmFtZS4KKwkJICAgVGhpcmQsIHdlIHNl dCB0aGUgYm9vbGVhbiAnaXNfZXhwbHRocmVlJyB0byB0cnVlIHNvIHRoYXQgd2UKKwkJICAgY2Fu IHJlbW92ZSB0aGUgYXJndW1lbnQgc3BlY2lmaWVyIGZyb20gdGhlIGFjdHVhbCB0YWcgbmFtZQor CQkgICAoX19ob29rX3RsX2dwdXQpLiAgVGhpcyBhbGwgYWxsb3dzIHVzIHRvIGluY2x1ZGUgZXhw bDMKKwkJICAgY29uc3RydWN0cyBpbiBURVhfZGVmZW52IG9yIGluIHRoZSBlbnZpcm9ubWVudCB2 YXJpYWJsZQorCQkgICBURVhUQUdTIHdpdGhvdXQgcmVxdWlyaW5nIGEgY2hhbmdlIG9mIHNlcGFy YXRvciwgYW5kIGl0IGFsc28KKwkJICAgYWxsb3dzIHVzIHRvIGZpbmQgdGhlIGRlZmluaXRpb24g b2YgdmFyaWFudCBjb21tYW5kcyAod2l0aAorCQkgICBkaWZmZXJlbnQgYXJndW1lbnQgc3BlY2lm aWVycykgZGVmaW5lZCB1c2luZywgZm9yIGV4YW1wbGUsCisJCSAgIFxjc19nZW5lcmF0ZV92YXJp YW50Ok5uLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgZXhwbDMgc3BlYworCQkgICByZXF1aXJlcyBl dGFncyB0byBwYXkgbW9yZSBhdHRlbnRpb24gdG8gd2hpdGVzcGFjZSBpbiB0aGUKKwkJICAgY29k ZS4KKworCQkgICAyLiBXZSBhbHNvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBhc3RlcmlzayBm cm9tIHN0YXJyZWQKKwkJICAgdmFyaWFudHMgb2YgYWxsIGNvbW1hbmRzLCB3aXRob3V0IHRoZSBu ZWVkIHRvIGluY2x1ZGUgdGhlCisJCSAgIHN0YXJyZWQgY29tbWFuZHMgZXhwbGljaXRseSBpbiBU RVhfZGVmZW52IG9yIFRFWFRBR1MuICovCisJCWlmICgqY3AgPT0gJzonKQorCQkgIHsKKwkJICAg IHdoaWxlICghY19pc3NwYWNlICgqY3ApICYmICpjcCAhPSBURVhfb3BncnApCisJCSAgICAgIGNw Kys7CisJCSAgICBjcCA9IHNraXBfc3BhY2VzIChjcCk7CisJCSAgICBpc19leHBsdGhyZWUgPSB0 cnVlOworCQkgIH0KKwkJZWxzZSBpZiAoKmNwID09ICcqJykKKwkJICBjcCsrOworCisJCS8qIFNr aXAgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBjb21tYW5kcyBpbiB0aGUgdGFncyBsaXN0IHNv CisJCSAgIHRoYXQgdGhlc2UgYXJndW1lbnRzIGRvbid0IGVuZCB1cCBhcyB0aGUgbmFtZSBvZiB0 aGUgdGFnLgorCQkgICBUaGUgbmFtZSB3aWxsIGluc3RlYWQgY29tZSBmcm9tIHRoZSBhcmd1bWVu dCBpbiBjdXJseSBicmFjZXMKKwkJICAgdGhhdCBmb2xsb3dzIHRoZSBvcHRpb25hbCBvbmVzLiAq LworCQl3aGlsZSAoKmNwICE9ICdcMCcgJiYgKmNwICE9ICclJykKKwkJICB7CisJCSAgICBpZiAo KmNwID09ICdbJykKKwkJICAgICAgeworCQkJd2hpbGUgKCpjcCAhPSAnXScgJiYgKmNwICE9ICdc MCcgJiYgKmNwICE9ICclJykKKwkJCSAgY3ArKzsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAo KmNwID09ICcoJykKKwkJICAgICAgeworCQkJd2hpbGUgKCpjcCAhPSAnKScgJiYgKmNwICE9ICdc MCcgJiYgKmNwICE9ICclJykKKwkJCSAgY3ArKzsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAo KmNwID09ICddJyB8fCAqY3AgPT0gJyknKQorCQkgICAgICBjcCsrOworCQkgICAgZWxzZQorCQkg ICAgICBicmVhazsKKwkJICB9CiAJCWlmICgqY3AgPT0gVEVYX29wZ3JwKQogCQkgIHsKIAkJICAg IG9wZ3JwID0gdHJ1ZTsKIAkJICAgIGNwKys7CisJCSAgICBjcCA9IHNraXBfc3BhY2VzIChjcCk7 IC8qIEZvciBleHBsMyBjb2RlLiAqLwogCQkgIH0KKworCQkvKiBSZW1vdmluZyB0aGUgVGVYIGVz Y2FwZSBjaGFyYWN0ZXIgZnJvbSB0YWcgbmFtZXMgc2ltcGxpZmllcworCQkgICB0aGluZ3MgZm9y IGVkaXRvcnMgZmluZGluZyB0YWdnZWQgY29tbWFuZHMgaW4gVGVYIGJ1ZmZlcnMuCisJCSAgIFRo aXMgYXBwbGllcyB0byBFbWFjcyBidXQgYWxzbyB0byB0aGUgdGFnLWZpbmRpbmcgYmVoYXZpb3IK KwkJICAgb2YgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWRpdG9ycyB0aGF0IHVzZSBjdGFncywgdGhv dWdoIGluCisJCSAgIHRoZSBsYXR0ZXIgY2FzZSB0aGlzIHdpbGwgcmVtYWluIHN1Ym9wdGltYWwu ICBUaGUKKwkJICAgdW5kb2N1bWVudGVkIGN0YWdzIG9wdGlvbiAnLS1uby1kdXBsaWNhdGVzJyBt YXkgaGVscC4gKi8KKwkJaWYgKCpjcCA9PSBURVhfZXNjKQorCQkgIHsKKwkJICAgIGNwKys7CisJ CSAgICBvbmVfZXNjID0gdHJ1ZTsKKwkJICB9CisKKwkJLyogVGVzdGluZyAhY19pc3NwYWNlICYm ICFjX2lzcHVuY3QgaXMgc2ltcGxlciwgYnV0IGhhbHRzCisJCSAgIHByb2Nlc3NpbmcgYXQgdG9v IG1hbnkgcGxhY2VzLiAgVGhlIGxpc3QgYXMgaXQgc3RhbmRzIHRyaWVzCisJCSAgIGJvdGggdG8g ZW5zdXJlIHRoYXQgdGFnIG5hbWVzIHdpbGwgZGVyaXZlIGZyb20gbWFjcm8gbmFtZXMKKwkJICAg cmF0aGVyIHRoYW4gZnJvbSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHRob3NlIG1hY3JvcywgYW5k CisJCSAgIGFsc28gdG8gcmV0dXJuIGZpbmRhYmxlIG5hbWVzIHdoaWxlIHN0aWxsIGFsbG93aW5n IGZvcgorCQkgICB1bm9ydGhvZG94IGNvbnN0cnVjdHMuICovCiAJCWZvciAocCA9IGNwOwotCQkg ICAgICghY19pc3NwYWNlICgqcCkgJiYgKnAgIT0gJyMnICYmCi0JCSAgICAgICpwICE9IFRFWF9v cGdycCAmJiAqcCAhPSBURVhfY2xncnApOworCQkgICAgICghY19pc3NwYWNlICgqcCkgJiYgKnAg IT0gJyMnICYmICpwICE9ICc9JyAmJgorCQkgICAgICAqcCAhPSAnWycgJiYgKnAgIT0gJygnICYm ICpwICE9IFRFWF9vcGdycCAmJgorCQkgICAgICAqcCAhPSBURVhfY2xncnAgJiYgKnAgIT0gJyIn ICYmICpwICE9ICdcJycgJiYKKwkJICAgICAgKnAgIT0gJyUnICYmICpwICE9ICcsJyAmJiAqcCAh PSAnfCcgJiYgKnAgIT0gJyQnKTsKIAkJICAgICBwKyspCi0JCSAgY29udGludWU7CisJCSAgLyog SW4gZXhwbDMgY29kZSB3ZSByZW1vdmUgdGhlIGFyZ3VtZW50IHNwZWNpZmljYXRpb24gZnJvbQor CQkgICAgIHRoZSB0YWcgbmFtZS4gIE1vcmUgZ2VuZXJhbGx5IHdlIGFsbG93IG9ubHkgb25lIChk ZWxldGVkKQorCQkgICAgIGVzY2FwZSBjaGFyIGluIGEgdGFnIG5hbWUsIHdoaWNoIChwcmltYXJp bHkpIGVuYWJsZXMKKwkJICAgICB0YWdnaW5nIGEgVGVYIGNvbW1hbmQncyBkaWZmZXJlbnQsIHBv c3NpYmx5IHRlbXBvcmFyeSwKKwkJICAgICAnXGxldCcgYmluZGluZ3MuICovCisJCSAgaWYgKGlz X2V4cGx0aHJlZSAmJiAqcCA9PSAnOicpCisJCSAgICBicmVhazsKKwkJICBlbHNlIGlmICgqcCA9 PSBURVhfZXNjKQorCQkgICAgeyAvKiBTZWNvbmQgcGFydCBvZiB0ZXN0IGlzIGZvciwgZS5nLiwg XGNzbGV0LiAqLworCQkgICAgICBpZiAoIW9uZV9lc2MgJiYgIW9wZ3JwKQorCQkJeworCQkJICBv bmVfZXNjID0gdHJ1ZTsKKwkJCSAgY29udGludWU7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCWJy ZWFrOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGNvbnRpbnVlOworCQkvKiBGb3IgVGVYIGZp bGVzLCB0YWdzIHdpdGhvdXQgYSBuYW1lIGFyZSBiYXNpY2FsbHkgY3J1ZnQsIGFuZAorCQkgICBp biBzb21lIHNpdHVhdGlvbnMgdGhleSBjYW4gcHJvZHVjZSBzcHVyaW91cyBhbmQgY29uZnVzaW5n CisJCSAgIG1hdGNoZXMuICBUcnkgdG8gY2F0Y2ggYXMgbWFueSBjYXNlcyBhcyBwb3NzaWJsZSB3 aGVyZSBhCisJCSAgIGNvbW1hbmQgbmFtZSBpcyBvZiB0aGUgZm9ybSAnXCgnLCBidXQgYXZvaWQs IGFzIGZhciBhcworCQkgICBwb3NzaWJsZSwgdGhlIHNwdXJpb3VzIG1hdGNoZXMuICovCisJCWlm IChwID09IGNwKQorCQkgIHsKKwkJICAgIHN3aXRjaCAoKnApCisJCSAgICAgIHsgLyogSW5jbHVk ZSA9PyAqLworCQkgICAgICBjYXNlICcoJzogY2FzZSAnWyc6IGNhc2UgJyInOiBjYXNlICdcJyc6 CisJCSAgICAgIGNhc2UgJ1xcJzogY2FzZSAnISc6IGNhc2UgJz0nOiBjYXNlICcsJzoKKwkJICAg ICAgY2FzZSAnfCc6IGNhc2UgJyQnOgorCQkJcCsrOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2Ug J3snOiBjYXNlICd9JzogY2FzZSAnPCc6IGNhc2UgJz4nOgorCQkJaWYgKCFvcGdycCkKKwkJCSAg eworCQkJICAgICAgcCsrOworCQkJICAgICAgaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJyUnKQor CQkJCWdvdG8gdGV4X25leHRfbGluZTsKKwkJCSAgfQorCQkJYnJlYWs7CisJCSAgICAgIGRlZmF1 bHQ6CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KIAkJbmFtZWxlbiA9IHAgLSBjcDsKIAkJ bGluZWxlbiA9IGxiLmxlbjsKIAkJaWYgKCFvcGdycCB8fCAqcCA9PSBURVhfY2xncnApCkBAIC01 ODI0LDkgKzU5NzIsMTggQEAgVGVYX2NvbW1hbmRzIChGSUxFICppbmYpCiAJCSAgICAgIHArKzsK IAkJICAgIGxpbmVsZW4gPSBwIC0gbGIuYnVmZmVyICsgMTsKIAkJICB9Ci0JCW1ha2VfdGFnIChj cCwgbmFtZWxlbiwgdHJ1ZSwKLQkJCSAgbGIuYnVmZmVyLCBsaW5lbGVuLCBsaW5lbm8sIGxpbmVj aGFybm8pOwotCQlnb3RvIHRleF9uZXh0X2xpbmU7IC8qIFdlIG9ubHkgdGFnIGEgbGluZSBvbmNl ICovCisJCWlmIChuYW1lbGVuKQorCQkgIG1ha2VfdGFnIChjcCwgbmFtZWxlbiwgdHJ1ZSwKKwkJ CSAgICBsYi5idWZmZXIsIGxpbmVsZW4sIGxpbmVubywgbGluZWNoYXJubyk7CisJCS8qIExpbmVz IHdpdGggbW9yZSB0aGFuIG9uZSBcZGVmIG9yIFxsZXQgYXJlIHN1cnByaXNpbmdseQorCQkgICBj b21tb24gaW4gVGVYIGZpbGVzLCBlc3BlY2lhbGx5IGluIHRoZSBzeXN0ZW0gZmlsZXMgdGhhdAor CQkgICBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgdmFyaW91cyBUZVggZm9ybWF0cy4gIFRoaXMgdGFn cyB0aGVtCisJCSAgIGFsbC4gKi8KKwkJLyogZ290byB0ZXhfbmV4dF9saW5lOyAvXCogV2Ugb25s eSB0YWcgYSBsaW5lIG9uY2UgKlwvICovCisJCXdoaWxlICgqY3AgIT0gJ1wwJyAmJiAqY3AgIT0g JyUnICYmICpjcCAhPSBURVhfZXNjKQorCQkgIGNwKys7CisJCWlmICgqY3AgIT0gVEVYX2VzYykK KwkJICBnb3RvIHRleF9uZXh0X2xpbmU7CiAJICAgICAgfQogCX0KICAgICB0ZXhfbmV4dF9saW5l OgpkaWZmIC0tZ2l0IGEvbGlzcC90ZXh0bW9kZXMvdGV4LW1vZGUuZWwgYi9saXNwL3RleHRtb2Rl cy90ZXgtbW9kZS5lbAppbmRleCA5N2M5NTAyNjdjNi4uMjI0OTMwZDY4YWUgMTAwNjQ0Ci0tLSBh L2xpc3AvdGV4dG1vZGVzL3RleC1tb2RlLmVsCisrKyBiL2xpc3AvdGV4dG1vZGVzL3RleC1tb2Rl LmVsCkBAIC02MzYsNiArNjM2LDE0IEBAIHRleC1mb250LWxvY2sta2V5d29yZHMtMgogCSAgICAg IDMgJyh0ZXgtZm9udC1sb2NrLWFwcGVuZC1wcm9wICdib2xkKSAnYXBwZW5kKSkpKSkKICAgICJH YXVkeSBleHByZXNzaW9ucyB0byBoaWdobGlnaHQgaW4gVGVYIG1vZGVzLiIpCiAKKyhkZWZ2YXIt bG9jYWwgdGV4LWV4cGwtcmVnaW9uLWxpc3QgbmlsCisgICJMaXN0IG9mIHJlZ2lvbiBib3VuZGFy aWVzIHdoZXJlIGV4cGwzIHN5bnRheCBpcyBhY3RpdmUuCitJdCB3aWxsIGJlIG5pbCBpbiBidWZm ZXJzIHdoZXJlIGV4cGwzIHN5bnRheCBpcyBhbHdheXMgYWN0aXZlLCBlLmcuLAorZXhwbDMgY2xh c3NlcyBvciBwYWNrYWdlcy4iKQorCisoZGVmdmFyLWxvY2FsIHRleC1leHBsLWJ1ZmZlci1wIG5p bAorICAiTm9uLW5pbCBpbiBidWZmZXJzIHdoZXJlIGV4cGwzIHN5bnRheCBpcyBhbHdheXMgYWN0 aXZlLiIpCisKIChkZWZ1biB0ZXgtZm9udC1sb2NrLXN1c2NyaXB0IChwb3MpCiAgICh1bmxlc3Mg KG9yIChtZW1xIChnZXQtdGV4dC1wcm9wZXJ0eSBwb3MgJ2ZhY2UpCiAJCSAgICAnKGZvbnQtbG9j ay1jb25zdGFudC1mYWNlIGZvbnQtbG9jay1idWlsdGluLWZhY2UKQEAgLTY0NSw3ICs2NTMsMTcg QEAgdGV4LWZvbnQtbG9jay1zdXNjcmlwdAogCQkgICAgKHBvcyBwb3MpKQogCQkod2hpbGUgKGVx IChjaGFyLWJlZm9yZSBwb3MpID9cXCkKIAkJICAoc2V0cSBwb3MgKDEtIHBvcykgb2RkIChub3Qg b2RkKSkpCi0JCW9kZCkpCisJCW9kZCkKKyAgICAgICAgICAgICAgOzsgQ2hlY2sgaWYgUE9TIGlz IGluIGFuIGV4cGwzIHN5bnRheCByZWdpb24gb3IgYW4gZXhwbDMgYnVmZmVyCisgICAgICAgICAg ICAgICh3aGVuIChlcSAoY2hhci1hZnRlciBwb3MpID9fKQorICAgICAgICAgICAgICAgIChvciB0 ZXgtZXhwbC1idWZmZXItcAorICAgICAgICAgICAgICAgICAgICAoYW5kCisgICAgICAgICAgICAg ICAgICAgICB0ZXgtZXhwbC1yZWdpb24tbGlzdAorICAgICAgICAgICAgICAgICAgICAgKGNhdGNo ICdyZXN1bHQKKwkgICAgICAgICAgICAgICAoZG9saXN0IChyYW5nZSB0ZXgtZXhwbC1yZWdpb24t bGlzdCkKKwkgICAgICAgICAgICAgICAgIChhbmQgKD4gcG9zIChjYXIgcmFuZ2UpKQorCSAgICAg ICAgICAgICAgICAgICAgICAoPCBwb3MgKGNkciByYW5nZSkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAodGhyb3cgJ3Jlc3VsdCB0KSkpKSkpKSkKICAgICAoaWYgKGVxIChjaGFyLWFm dGVyIHBvcykgP18pCiAJYChmYWNlIHN1YnNjcmlwdCBkaXNwbGF5IChyYWlzZSAsKGNhciB0ZXgt Zm9udC1zY3JpcHQtZGlzcGxheSkpKQogICAgICAgYChmYWNlIHN1cGVyc2NyaXB0IGRpc3BsYXkg KHJhaXNlICwoY2FkciB0ZXgtZm9udC1zY3JpcHQtZGlzcGxheSkpKSkpKQpAQCAtMTI4OSw4ICsx MzA3LDE2IEBAIHRleC1jb21tb24taW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgICAgICAjJ3Rl eC0tcHJldHRpZnktc3ltYm9scy1jb21wb3NlLXApCiAgIChzZXRxLWxvY2FsIHN5bnRheC1wcm9w ZXJ0aXplLWZ1bmN0aW9uCiAJICAgICAgKHN5bnRheC1wcm9wZXJ0aXplLXJ1bGVzIGxhdGV4LXN5 bnRheC1wcm9wZXJ0aXplLXJ1bGVzKSkKKyAgOzsgRG9uJ3QgYWRkIGV4dHJhIHByb2Nlc3Npbmcg dG8gYHN5bnRheC1wcm9wZXJ0aXplJyBpbiBmaWxlcyB3aGVyZQorICA7OyBleHBsMyBzeW50YXgg aXMgYWx3YXlzIGFjdGl2ZS4KKyAgOmFmdGVyLWhvb2sgKHByb2duICh0ZXgtZXhwbC1idWZmZXIt cGFyc2UpCisgICAgICAgICAgICAgICAgICAgICAodW5sZXNzIHRleC1leHBsLWJ1ZmZlci1wCisg ICAgICAgICAgICAgICAgICAgICAgIChhZGQtaG9vayAnc3ludGF4LXByb3BlcnRpemUtZXh0ZW5k LXJlZ2lvbi1mdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMndGV4 LWV4cGwtcmVnaW9uLXNldCBuaWwgdCkpKQogICA7OyBUQUJzIGluIHZlcmJhdGltIGVudmlyb25t ZW50cyBkb24ndCBkbyB3aGF0IHlvdSB0aGluay4KICAgKHNldHEtbG9jYWwgaW5kZW50LXRhYnMt bW9kZSBuaWwpCisgIDs7IFNldCB1cCB4cmVmIGJhY2tlbmQgaW4gVGVYIGJ1ZmZlcnMuCisgIChh ZGQtaG9vayAneHJlZi1iYWNrZW5kLWZ1bmN0aW9ucyAjJ3RleC0teHJlZi1iYWNrZW5kIG5pbCB0 KQogICA7OyBPdGhlciB2YXJzIHRoYXQgc2hvdWxkIGJlIGJ1ZmZlci1sb2NhbC4KICAgKG1ha2Ut bG9jYWwtdmFyaWFibGUgJ3RleC1jb21tYW5kKQogICAobWFrZS1sb2NhbC12YXJpYWJsZSAndGV4 LXN0YXJ0LW9mLWhlYWRlcikKQEAgLTE5MzYsNiArMTk2MiwzNSBAQCB0ZXgtY291bnQtd29yZHMK IAkJKGZvcndhcmQtc2V4cCAxKSkpKSkpCiAgICAgICAobWVzc2FnZSAiJXMgd29yZHMiIGNvdW50 KSkpKQogCisoZGVmdW4gdGV4LWV4cGwtYnVmZmVyLXBhcnNlICgpCisgICJJZGVudGlmeSBidWZm ZXJzIHdoZXJlIGV4cGwzIHN5bnRheCBpcyBhbHdheXMgYWN0aXZlLiIKKyAgKHNhdmUtZXhjdXJz aW9uCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAod2hlbiAodGV4LXNlYXJjaC1u b25jb21tZW50CisJICAgKHJlLXNlYXJjaC1mb3J3YXJkCisJICAgICJcXCg/OlxcXFxcXCg/OkV4 cGxGaWxlXFx8UHJvdmlkZXNFeHBsXFx8X194cGFyc2VfZmlsZVxcKVxcKSIKKwkgICAgbmlsIHQp KQorICAgICAgKHNldHEgdGV4LWV4cGwtYnVmZmVyLXAgdCkpKSkKKworKGRlZnVuIHRleC1leHBs LXJlZ2lvbi1zZXQgKF9iZWcgX2VuZCkKKyAgIkNyZWF0ZSBhIGxpc3Qgb2YgcmVnaW9ucyB3aGVy ZSBleHBsMyBzeW50YXggaXMgYWN0aXZlLgorVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBsaXN0 IHdoZW5ldmVyIGBzeW50YXgtcHJvcGVydGl6ZScgcnVucywgYW5kCitzdG9yZXMgaXQgaW4gdGhl IGJ1ZmZlci1sb2NhbCB2YXJpYWJsZSBgdGV4LWV4cGwtcmVnaW9uLWxpc3QnLiAgVGhlCitsaXN0 IHdpbGwgYWx3YXlzIGJlIG5pbCB3aGVuIHRoZSBidWZmZXIgdmlzaXRzIGFuIGV4cGwzIGZpbGUs IGUuZy4sIGFuCitleHBsMyBjbGFzcyBvciBwYWNrYWdlLCB3aGVyZSBleHBsMyBzeW50YXggaXMg YWx3YXlzIGFjdGl2ZS4iCisgICh1bmxlc3Mgc3ludGF4LXBwc3MtLXVwZGF0ZWQtY2FjaGU7OyBT dG9wIGZvcndhcmQgc2VhcmNoIHJ1bm5pbmcgdHdpY2UuCisgICAgKHNldHEgdGV4LWV4cGwtcmVn aW9uLWxpc3QgbmlsKQorICAgIDs7IExlYXZpbmcgdGhpcyB0ZXN0IGhlcmUgYWxsb3dzIHVzZXJz IHRvIHNldCBgdGV4LWV4cGwtYnVmZmVyLXAnCisgICAgOzsgaW5kZXBlbmRlbnRseSBvZiB0aGUg bW9kZSdzIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgYW4gZXhwbDMgZmlsZS4KKyAgICAodW5sZXNz IHRleC1leHBsLWJ1ZmZlci1wCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAg KHdoaWxlICh0ZXgtc2VhcmNoLW5vbmNvbW1lbnQKKyAgICAgICAgICAgICAgKHJlLXNlYXJjaC1m b3J3YXJkICJcXEV4cGxTeW50YXhPbiIgbmlsIHQpKQorICAgICAgICAobGV0ICgobmV3LWJlZyAo cG9pbnQpKQorICAgICAgICAgICAgICAobmV3LWVuZCAob3IgKHRleC1zZWFyY2gtbm9uY29tbWVu dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCAiXFxFeHBs U3ludGF4T2ZmIiBuaWwgdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQtbWF4 KSkpKQorICAgICAgICAgIChwdXNoIChjb25zIG5ldy1iZWcgbmV3LWVuZCkgdGV4LWV4cGwtcmVn aW9uLWxpc3QpKSkpKSkKIAogDAogOzs7IEludm9raW5nIFRlWCBpbiBhbiBpbmZlcmlvciBzaGVs bC4KQEAgLTM3NDIsNiArMzc5NywzMjEgQEAgdGV4LWNoa3RleAogICAgICAgKHByb2Nlc3Mtc2Vu ZC1yZWdpb24gdGV4LWNoa3RleC0tcHJvY2VzcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkKICAg ICAgIChwcm9jZXNzLXNlbmQtZW9mIHRleC1jaGt0ZXgtLXByb2Nlc3MpKSkpCiAKKwwKKzs7OyBY cmVmIGJhY2tlbmQKKworOzsgSGVyZSB3ZSBsaWdodGx5IGFkYXB0IHRoZSBkZWZhdWx0IGV0YWdz IGJhY2tlbmQgZm9yIHhyZWYgc28gdGhhdAorOzsgdGhlIG1haW4geHJlZiB1c2VyIGNvbW1hbmRz IChpbmNsdWRpbmcgYHhyZWYtZmluZC1kZWZpbml0aW9ucycsCis7OyBgeHJlZi1maW5kLWFwcm9w b3MnLCBhbmQgYHhyZWYtZmluZC1yZWZlcmVuY2VzJyBbb24gTS0uLCBDLU0tLiwgYW5kCis7OyBN LT8sIHJlc3BlY3RpdmVseV0pIHdvcmsgaW4gVGVYIGJ1ZmZlcnMuICBUaGUgb25seSBtZXRob2Rz IHdlCis7OyBhY3R1YWxseSBtb2RpZnkgYXJlIGB4cmVmLWJhY2tlbmQtaWRlbnRpZmllci1hdC1w b2ludCcgYW5kCis7OyBgeHJlZi1iYWNrZW5kLXJlZmVyZW5jZXMnLiAgTWFueSBvZiB0aGUgY29t cGxpY2F0aW9ucyBoZXJlLCBhbmQgaW4KKzs7IGBldGFncycgaXRzZWxmLCBhcmUgZHVlIHRvIHRo ZSBuZWNlc3NpdHkgb2YgcGFyc2luZyBib3RoIHRoZSBvbGQKKzs7IFRlWCBzeW50YXggYW5kIHRo ZSBuZXcgZXhwbDMgc3ludGF4LCB3aGljaCB3aWxsIGNvbnRpbnVlIHRvIGFwcGVhcgorOzsgdG9n ZXRoZXIgaW4gZG9jdW1lbnRzIGZvciB0aGUgZm9yZXNlZWFibGUgZnV0dXJlLiAgU3luY2hyb25p emluZworOzsgRW1hY3MgYW5kIGBldGFncycgdGhpcyB3YXkgYWltcyB0byBpbXByb3ZlIHRoZSB1 c2VyIGV4cGVyaWVuY2UgIm91dAorOzsgb2YgdGhlIGJveC4iCisKKyhkZWZ2YXIgdGV4LXRoaW5n YXRwdC1leGNsdWRlLWNoYXJzICcoP1xcID9ceyA/XH0pCisgICJFeGNsdWRlIHRoZXNlIGNoYXJz IGJ5IGRlZmF1bHQgZnJvbSBUZVggdGhpbmctYXQtcG9pbnQuCisKK1RoZSBUZVggYHhyZWYtYmFj a2VuZC1pZGVudGlmaWVyLWF0LXBvaW50JyBtZXRob2QgdXNlcyB0aGUgY2hhcmFjdGVycworbGlz dGVkIGluIHRoaXMgdmFyaWFibGUgdG8gZGVjaWRlIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBzdHJp bmcgdG8KK3ByZXNlbnQgdG8gdGhlIHVzZXIgd2hvIGNhbGxzIGFuIGB4cmVmJyBjb21tYW5kLiAg VGhlc2UgY2hhcmFjdGVycworYmVjb21lIHBhcnQgb2YgYSByZWdleHAgd2hpY2ggYWx3YXlzIGV4 Y2x1ZGVzIHRoZW0gZnJvbSB0aGF0IGRlZmF1bHQKK3N0cmluZy4gIEZvciB0aGUgYHhyZWYnIGNv bW1hbmRzIHRvIGZ1bmN0aW9uIHByb3Blcmx5IGluIFRlWCBidWZmZXJzLCBhdAorbGVhc3QgdGhl IFRlWCBlc2NhcGUgYW5kIHRoZSB0d28gVGVYIGdyb3VwaW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJl CitsaXN0ZWQgaGVyZS4gIFNob3VsZCB5b3VyIFRlWCBkb2N1bWVudHMgY29udGFpbiBvdGhlciBj aGFyYWN0ZXJzIHdoaWNoCit5b3Ugd2FudCB0byBleGNsdWRlIGJ5IGRlZmF1bHQsIHRoZW4geW91 IGNhbiBhZGQgdGhlbSB0byB0aGUgbGlzdCwKK3Rob3VnaCB5b3UgbWF5IHdpc2ggdG8gY29uc3Vs dCB0aGUgZnVuY3Rpb25zCitgdGV4LXRoaW5nYXRwdC0tYmVnaW5uaW5nLW9mLXN5bWJvbCcgYW5k IGB0ZXgtdGhpbmdhdHB0LS1lbmQtb2Ytc3ltYm9sJwordG8gc2VlIHdoYXQgdGhlIHJlZ2V4cCBh bHJlYWR5IGNvbnRhaW5zLiAgSWYgeW91ciBkb2N1bWVudHMgY29udGFpbgorbm9uLXN0YW5kYXJk IGVzY2FwZSBhbmQgZ3JvdXBpbmcgY2hhcmFjdGVycywgdGhlbiB5b3UgY2FuIHJlcGxhY2UgdGhl Cit0aHJlZSBsaXN0ZWQgaGVyZSB3aXRoIHlvdXIgb3duLCB0aGVyZWJ5IGFsbG93aW5nIHRoZSB0 aHJlZSBzdGFuZGFyZAorY2hhcmFjdGVycyB0byBhcHBlYXIgYnkgZGVmYXVsdCBpbiBzZWFyY2gg c3RyaW5ncy4gIFBsZWFzZSBiZSBhd2FyZSwKK2hvd2V2ZXIsIHRoYXQgdGhlIGBldGFncycgcHJv Z3JhbSBvbmx5IHJlY29nbml6ZXMgYFxcJyAoOTIpIGFuZCBgIScgKDMzKQorYXMgZXNjYXBlIGNo YXJhY3RlcnMgaW4gVGVYIGRvY3VtZW50cywgYW5kIGlmIGl0IGRldGVjdHMgdGhlIGxhdHRlciBp dAorYWxzbyB1c2VzIGA8PicgYXMgdGhlIFRlWCBncm91cGluZyBjb25zdHJ1Y3QgcmF0aGVyIHRo YW4gYHt9Jy4gIFNldHRpbmcKK3RoZSBlc2NhcGUgYW5kIGdyb3VwaW5nIGNoYXJzIHRvIGFueXRo aW5nIG90aGVyIHRoYW4gYFxcPVxce30nIG9yIGAhPD4nCit3aWxsIG5vdCBiZSB1c2VmdWwgd2l0 aG91dCBjaGFuZ2VzIHRvIGBldGFncycsIGF0IGxlYXN0IGZvciBjb21tYW5kcwordGhhdCBzZWFy Y2ggdGFncyB0YWJsZXMsIHN1Y2ggYXMgXFxbeHJlZi1maW5kLWRlZmluaXRpb25zXSBhbmQgXAor XFxbeHJlZi1maW5kLWFwcm9wb3NdLgorCitTaG91bGQgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBk ZWZhdWx0cywgcGxlYXNlIGFsc28gYmUgYXdhcmUgdGhhdCwKK3dpdGhvdXQgZnVydGhlciBtb2Rp ZmljYXRpb25zIHRvIHRleC1tb2RlLmVsLCB0aGUgdXN1YWwgdGV4dC1wYXJzaW5nCityb3V0aW5l cyBmb3IgYGZvbnQtbG9jaycgYW5kIHRoZSBsaWtlIHdvbid0IHdvcmsgY29ycmVjdGx5LCBhcyB0 aGUKK2RlZmF1bHQgZXNjYXBlIGFuZCBncm91cGluZyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkg aGFyZCBjb2RlZCBpbiBtYW55CitwbGFjZXMuIikKKworOzsgUG9wdWxhdGUgYHNlbWFudGljLXN5 bXJlZi1maWxlcGF0dGVybi1hbGlzdCcgZm9yIHRoZSBpbi10cmVlIG1vZGVzOworOzsgQVVDVGVY IGlzIGRvaW5nIHRoZSBzYW1lIGZvciBpdHMgbW9kZXMuCisod2l0aC1ldmFsLWFmdGVyLWxvYWQg J3NlbWFudGljL3N5bXJlZi9ncmVwCisgIChkZWZ2YXIgc2VtYW50aWMtc3ltcmVmLWZpbGVwYXR0 ZXJuLWFsaXN0KQorICAocHVzaCAnKGxhdGV4LW1vZGUgIiouW3RUXWVbeFhdIiAiKi5sdHgiICIq LnN0eSIgIiouY2xbc29dIgorICAgICAgICAgICAgICAgICAgICAgIiouYmJsIiAiKi5kcnYiICIq Lmh2YSIpCisgICAgICAgIHNlbWFudGljLXN5bXJlZi1maWxlcGF0dGVybi1hbGlzdCkKKyAgKHB1 c2ggJyhwbGFpbi10ZXgtbW9kZSAiKi5bdFRdZVt4WF0iICIqLmlucyIpCisgICAgICAgIHNlbWFu dGljLXN5bXJlZi1maWxlcGF0dGVybi1hbGlzdCkKKyAgKHB1c2ggJyhkb2N0ZXgtbW9kZSAiKi5k dHgiKSBzZW1hbnRpYy1zeW1yZWYtZmlsZXBhdHRlcm4tYWxpc3QpKQorCisoZGVmdW4gdGV4LS14 cmVmLWJhY2tlbmQgKCkgJ3RleC1ldGFncykKKworOzsgU2V0dXAgQVVDVGVYIG1vZGVzIChmb3Ig dGVzdGluZyBwdXJwb3NlcyBvbmx5KS4KKworKGFkZC1ob29rICdUZVgtbW9kZS1ob29rICMndGV4 LXNldC1hdWN0ZXgteHJlZi1iYWNrZW5kKQorCisoZGVmdW4gdGV4LXNldC1hdWN0ZXgteHJlZi1i YWNrZW5kICgpCisgIChhZGQtaG9vayAneHJlZi1iYWNrZW5kLWZ1bmN0aW9ucyAjJ3RleC0teHJl Zi1iYWNrZW5kIG5pbCB0KSkKKworOzsgYHhyZWYtZmluZC1yZWZlcmVuY2VzJyBjdXJyZW50bHkg bWF5IG5lZWQgdGhpcyB3aGVuIGNhbGxlZCBmcm9tIGEKKzs7IGxhdGV4LW1vZGUgYnVmZmVyIGlu IG9yZGVyIHRvIHNlYXJjaCBmaWxlcyBvciBidWZmZXJzIHdpdGggYSAudGV4Cis7OyBzdWZmaXgg KGluY2x1ZGluZyB0aGUgYnVmZmVyIGZyb20gd2hpY2ggaXQgaGFzIGJlZW4gY2FsbGVkKS4gIFdl Cis7OyBhcHBlbmQgaXQgdG8gYGF1dG8tbW9kZS1hbGlzdCcgc28gYXMgbm90IHRvIGludGVyZmVy ZSB3aXRoIHRoZSB1c3VhbAorOzsgbW9kZS1zZXR0aW5nIGFwcGFyYXR1cy4gIENoYW5nZXMgaGVy ZSBhbmQgaW4gQVVDVGVYIHNob3VsZCBzb29uCis7OyByZW5kZXIgaXQgdW5uZWNlc3NhcnkuCiso YWRkLXRvLWxpc3QgJ2F1dG8tbW9kZS1hbGlzdCAnKCJcXC5bdFRdZVt4WF1cXCciIC4gbGF0ZXgt bW9kZSkgdCkKKworKGNsLWRlZm1ldGhvZCB4cmVmLWJhY2tlbmQtaWRlbnRpZmllci1hdC1wb2lu dCAoKF9iYWNrZW5kIChlcWwgJ3RleC1ldGFncykpKQorICAocmVxdWlyZSAnZXRhZ3MpCisgICh0 ZXgtLXRoaW5nLWF0LXBvaW50KSkKKworOzsgVGhlIGRldGVjdGlvbiBvZiBgXycgYW5kIGA6JyBp cyBhIHByaW1pdGl2ZSBtZXRob2QgZm9yIGRldGVybWluaW5nCis7OyB3aGV0aGVyIHBvaW50IGlz IG9uIGFuIGV4cGwzIGNvbnN0cnVjdC4gIEl0IG1heSBmYWlsIGluIHNvbWUKKzs7IGluc3RhbmNl cy4KKyhkZWZ1biB0ZXgtLXRoaW5nLWF0LXBvaW50ICgpCisgICJEZW1hcmNhdGUgYHRoaW5nLWF0 LXBvaW50JyBmb3IgdGhlIFRlWCBgeHJlZicgYmFja2VuZC4iCisgIChsZXQgKChib3VuZHMgKHRl eC0tYm91bmRzLW9mLXN5bWJvbC1hdC1wb2ludCkpKQorICAgICh3aGVuIGJvdW5kcworICAgICAg KGxldCAoKHRleHN5bSAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzIChjYXIgYm91bmRz KSAoY2RyIGJvdW5kcykpKSkKKyAgICAgICAgKGlmIChhbmQgKG5vdCAoc3RyaW5nLW1hdGNoLXAg InJlZmVyZW5jZSIgKHN5bWJvbC1uYW1lIHRoaXMtY29tbWFuZCkpKQorICAgICAgICAgICAgICAg ICAoc2VxLWNvbnRhaW5zLXAgdGV4c3ltID9fKQorICAgICAgICAgICAgICAgICAoc2VxLWNvbnRh aW5zLXAgdGV4c3ltID86KSkKKyAgICAgICAgICAgIChzZXEtdGFrZSB0ZXhzeW0gKHNlcS1wb3Np dGlvbiB0ZXhzeW0gPzopKQorICAgICAgICAgIHRleHN5bSkpKSkpCisKKyhkZWZ1biB0ZXgtdGhp bmdhdHB0LS1iZWdpbm5pbmctb2Ytc3ltYm9sICgpCisgIChhbmQKKyAgIChyZS1zZWFyY2gtYmFj a3dhcmQgKGNvbmNhdCAiW11bIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBj b25jYXQgIydyZWdleHAtcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChtYXBjYXIgIydjaGFyLXRvLXN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXgtdGhpbmdhdHB0LWV4Y2x1ZGUtY2hhcnMpKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIipgJyM9JigpJSx8JFs6Y250cmw6XVs6 Ymxhbms6XV0iKSkKKyAgIChmb3J3YXJkLWNoYXIpKSkKKworKGRlZnVuIHRleC10aGluZ2F0cHQt LWVuZC1vZi1zeW1ib2wgKCkKKyAgKGFuZAorICAgKHJlLXNlYXJjaC1mb3J3YXJkIChjb25jYXQg IltdWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgIydyZWdleHAt cXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjYXIg IydjaGFyLXRvLXN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0ZXgtdGhpbmdhdHB0LWV4Y2x1ZGUtY2hhcnMpKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIlwiKmAnIz0mKCklLHwkWzpjbnRybDpdWzpibGFuazpdXSIpKQorICAg KGJhY2t3YXJkLWNoYXIpKSkKKworKGRlZnVuIHRleC0tYm91bmRzLW9mLXN5bWJvbC1hdC1wb2lu dCAoKQorICAiU2ltcGxpZnkgYGJvdW5kcy1vZi10aGluZy1hdC1wb2ludCcgZm9yIFRlWCBgeHJl ZicgYmFja2VuZC4iCisgIChsZXQgKChvcmlnIChwb2ludCkpKQorICAgIChpZ25vcmUtZXJyb3Jz CisgICAgICAoc2F2ZS1leGN1cnNpb24KKwkodGV4LXRoaW5nYXRwdC0tZW5kLW9mLXN5bWJvbCkK KwkodGV4LXRoaW5nYXRwdC0tYmVnaW5uaW5nLW9mLXN5bWJvbCkKKwkobGV0ICgoYmVnIChwb2lu dCkpKQorCSAgKGlmICg8PSBiZWcgb3JpZykKKwkgICAgICAobGV0ICgocmVhbC1lbmQKKwkJICAg ICAocHJvZ24KKwkJICAgICAgICh0ZXgtdGhpbmdhdHB0LS1lbmQtb2Ytc3ltYm9sKQorCQkgICAg ICAgKHBvaW50KSkpKQorCQkoY29uZCAoKGFuZCAoPD0gb3JpZyByZWFsLWVuZCkgKDwgYmVnIHJl YWwtZW5kKSkKKwkJICAgICAgIChjb25zIGJlZyByZWFsLWVuZCkpCisgICAgICAgICAgICAgICAg ICAgICAgKChhbmQgKD0gb3JpZyByZWFsLWVuZCkgKD0gYmVnIHJlYWwtZW5kKSkKKwkJICAgICAg IChjb25zIGJlZyAoMSsgYmVnKSkpKSkpKSkpKSk7OyBGb3IgMS1jaGFyIFRlWCBjb21tYW5kcy4K KworKGNsLWRlZm1ldGhvZCB4cmVmLWJhY2tlbmQtaWRlbnRpZmllci1jb21wbGV0aW9uLXRhYmxl ICgoX2JhY2tlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChlcWwgJ3RleC1ldGFncykpKQorICAoeHJlZi1iYWNrZW5kLWlkZW50aWZp ZXItY29tcGxldGlvbi10YWJsZSAnZXRhZ3MpKQorCisoY2wtZGVmbWV0aG9kIHhyZWYtYmFja2Vu ZC1pZGVudGlmaWVyLWNvbXBsZXRpb24taWdub3JlLWNhc2UgKChfYmFja2VuZAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVx bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICd0ZXgtZXRhZ3MpKSkKKyAgKHhyZWYtYmFja2VuZC1pZGVudGlmaWVyLWNvbXBs ZXRpb24taWdub3JlLWNhc2UgJ2V0YWdzKSkKKworKGNsLWRlZm1ldGhvZCB4cmVmLWJhY2tlbmQt ZGVmaW5pdGlvbnMgKChfYmFja2VuZCAoZXFsICd0ZXgtZXRhZ3MpKSBzeW1ib2wpCisgICh4cmVm LWJhY2tlbmQtZGVmaW5pdGlvbnMgJ2V0YWdzIHN5bWJvbCkpCisKKyhjbC1kZWZtZXRob2QgeHJl Zi1iYWNrZW5kLWFwcm9wb3MgKChfYmFja2VuZCAoZXFsICd0ZXgtZXRhZ3MpKSBwYXR0ZXJuKQor ICAoeHJlZi1iYWNrZW5kLWFwcm9wb3MgJ2V0YWdzIHBhdHRlcm4pKQorCis7OyBUaGUgYHhyZWYt YmFja2VuZC1yZWZlcmVuY2VzJyBtZXRob2QgcmVxdWlyZXMgbW9yZSBjb2RlIHRoYW4gdGhlCis7 OyBvdGhlcnMgZm9yIGF0IGxlYXN0IHR3byBtYWluIHJlYXNvbnM6IFRlWCBhdXRob3JzIGhhdmUg dHlwaWNhbGx5IGJlZW4KKzs7IGZyZWUgaW4gdGhlaXIgaW52ZW50aW9uIG9mIG5ldyBmaWxlIHR5 cGVzIHdpdGggbmV3IHN1ZmZpeGVzLCBhbmQgdGhleQorOzsgaGF2ZSBhbHNvIHRlbmRlZCBzb21l dGltZXMgdG8gaW5jbHVkZSBub24tc3ltYm9sIGNoYXJhY3RlcnMgaW4KKzs7IGNvbW1hbmQgbmFt ZXMuICBXaGVuIGNvbWJpbmVkIHdpdGggdGhlIGRlZmF1bHQgU2VtYW50aWMgU3ltYm9sCis7OyBS ZWZlcmVuY2UgQVBJLCB0aGVzZSB0d28gY2hhcmFjdGVyaXN0aWNzIG9mIFRlWCBjb2RlIG1lYW4g dGhhdCBhCis7OyBjb21tYW5kIGxpa2UgYHhyZWYtZmluZC1yZWZlcmVuY2VzJyB3b3VsZCBvZnRl biBmYWlsIHRvIGZpbmQgYW55IGhpdHMKKzs7IGZvciBhIHN5bWJvbCBhdCBwb2ludCwgaW5jbHVk aW5nIHRoZSBvbmUgdW5kZXIgcG9pbnQgaW4gdGhlIGN1cnJlbnQKKzs7IGJ1ZmZlciwgb3IgaXQg d291bGQgZmluZCBvbmx5IHNvbWUgaW5zdGFuY2VzIGFuZCBza2lwIG90aGVycy4KKworKGRlZnVu IHRleC1maW5kLXJlZmVyZW5jZXMtc3ludGF4LXRhYmxlICgpCisgIChsZXQgKChzdCAoaWYgKGJv dW5kcCAnVGVYLW1vZGUtc3ludGF4LXRhYmxlKQorICAgICAgICAgICAgICAgICAobWFrZS1zeW50 YXgtdGFibGUgVGVYLW1vZGUtc3ludGF4LXRhYmxlKQorICAgICAgICAgICAgICAgKG1ha2Utc3lu dGF4LXRhYmxlIHRleC1tb2RlLXN5bnRheC10YWJsZSkpKSkKKyAgICBzdCkpCisKKyhkZWZ2YXIg dGV4LS14cmVmLXN5bnRheC1mdW4gbmlsKQorCisoZGVmdW4gdGV4LXhyZWYtc3ludGF4LWZ1bmN0 aW9uIChzdHIgYmVnIGVuZCkKKyAgIlByb3ZpZGUgYSBiZXNwb2tlIGBzeW50YXgtcHJvcGVydGl6 ZS1mdW5jdGlvbicgZm9yIFxcW3hyZWYtZmluZC1yZWZlcmVuY2VzXS4iCisgIChsZXQqIChncnBi IHRlbXBzdHIKKyAgICAgICAgICAgICAgKHNocnRzdHIgKGlmIGVuZAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgKHByb2duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIHRl bXBzdHIgKHNlcS10YWtlIHN0ciAoMS0gKGxlbmd0aCBzdHIpKSkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChpZiBiZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChz ZXRxIHRlbXBzdHIgKHNlcS1kcm9wIHRlbXBzdHIgMSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdGVtcHN0cikpCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcS1kcm9wIHN0 ciAxKSkpCisgICAgICAgICAgICAgIChncnBhIChpZiAoYW5kIGJlZyBlbmQpCisgICAgICAgICAg ICAgICAgICAgICAgICAocHJvZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAx ICJfIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgZ3JwYiAobGlzdCAyICJfIikp KQorICAgICAgICAgICAgICAgICAgICAgIChsaXN0IDEgIl8iKSkpCisgICAgICAgICAgICAgIChy ZSAoY29uY2F0IGJlZyAocmVnZXhwLXF1b3RlIHNocnRzdHIpIGVuZCkpCisgICAgICAgICAgICAg ICh0ZW1wLXJ1bGUgKGlmIGdycGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3Qg cmUgZ3JwYSBncnBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgcmUgZ3JwYSkp KSkKKyAgICA7OyBTaW1wbGUgYmVuY2htYXJrcyBzdWdnZXN0ZWQgdGhhdCB0aGUgc3BlZWQtdXAg ZnJvbSBjb21waWxpbmcgdGhpcworICAgIDs7IGZ1bmN0aW9uIHdhcyBuZWFybHkgbmlsLCBzbyBg ZXZhbCcgYW5kIGl0cyBub24tYnl0ZS1jb21waWxlZAorICAgIDs7IGZ1bmN0aW9uIHJlbWFpbi4K KyAgICAoc2V0cSB0ZXgtLXhyZWYtc3ludGF4LWZ1biAoZXZhbAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBgKHN5bnRheC1wcm9wZXJ0aXplLXJ1bGVzICx0ZW1wLXJ1bGUpKSkpKQor CisoZGVmdW4gdGV4LS1jb2xsZWN0LWZpbGUtZXh0ZW5zaW9ucyAoKQorICAiR2F0aGVyIFRlWCBm aWxlIGV4dGVuc2lvbnMgZnJvbSBgYXV0by1tb2RlLWFsaXN0Jy4iCisgIChsZXQqICgobWxpc3Qg KHdoZW4gKHJhc3NxIG1ham9yLW1vZGUgYXV0by1tb2RlLWFsaXN0KQorCQkgIChzZXEtZmlsdGVy CisJCSAgIChsYW1iZGEgKGVsdCkKKwkJICAgICAoZXEgKGNkciBlbHQpIG1ham9yLW1vZGUpKQor CQkgICBhdXRvLW1vZGUtYWxpc3QpKSkKKwkgKGxjc3ltIChpbnRlcm4tc29mdCAoZG93bmNhc2Ug KHN5bWJvbC1uYW1lIG1ham9yLW1vZGUpKSkpCisJIChsY2xpc3QgKGFuZCBsY3N5bQorCQkgICAg ICAobm90IChlcSBsY3N5bSBtYWpvci1tb2RlKSkKKwkJICAgICAgKHJhc3NxIGxjc3ltIGF1dG8t bW9kZS1hbGlzdCkKKwkJICAgICAgKHNlcS1maWx0ZXIKKwkJICAgICAgIChsYW1iZGEgKGVsdCkK KwkJCSAoZXEgKGNkciBlbHQpIGxjc3ltKSkKKwkJICAgICAgIGF1dG8tbW9kZS1hbGlzdCkpKQor CSAoc2hvcnRzeW0gKHdoZW4gKHN0cmluZ3AgbW9kZS1uYW1lKQorCQkgICAgIChpbnRlcm4tc29m dCAoY29uY2F0IChzdHJpbmctdHJpbS1yaWdodCBtb2RlLW5hbWUgIi8uKiIpCisJCQkJCSAgIi1t b2RlIikpKSkKKwkgKGxjc2hvcnRzeW0gKHdoZW4gKHN0cmluZ3AgbW9kZS1uYW1lKQorCQkgICAg ICAgKGludGVybi1zb2Z0IChkb3duY2FzZQorCQkJCSAgICAgKGNvbmNhdAorCQkJCSAgICAgIChz dHJpbmctdHJpbS1yaWdodCBtb2RlLW5hbWUgIi8uKiIpCisJCQkJICAgICAgIi1tb2RlIikpKSkp CisJIChzaGxpc3QgKGFuZCBzaG9ydHN5bQorCQkgICAgICAobm90IChlcSBzaG9ydHN5bSBtYWpv ci1tb2RlKSkKKwkJICAgICAgKG5vdCAoZXEgc2hvcnRzeW0gbGNzeW0pKQorCQkgICAgICAocmFz c3Egc2hvcnRzeW0gYXV0by1tb2RlLWFsaXN0KQorCQkgICAgICAoc2VxLWZpbHRlcgorCQkgICAg ICAgKGxhbWJkYSAoZWx0KQorCQkJIChlcSAoY2RyIGVsdCkgc2hvcnRzeW0pKQorCQkgICAgICAg YXV0by1tb2RlLWFsaXN0KSkpCisJIChsY3NobGlzdCAoYW5kIGxjc2hvcnRzeW0KKwkJCShub3Qg KGVxIGxjc2hvcnRzeW0gbWFqb3ItbW9kZSkpCisJCQkobm90IChlcSBsY3Nob3J0c3ltIGxjc3lt KSkKKwkJCShyYXNzcSBsY3Nob3J0c3ltIGF1dG8tbW9kZS1hbGlzdCkKKwkJCShzZXEtZmlsdGVy CisJCQkgKGxhbWJkYSAoZWx0KQorCQkJICAgKGVxIChjZHIgZWx0KSBsY3Nob3J0c3ltKSkKKwkJ CSBhdXRvLW1vZGUtYWxpc3QpKSkKKwkgKGV4dHMgKHdoZW4gKG9yIG1saXN0IGxjbGlzdCBzaGxp c3QgbGNzaGxpc3QpCisJCSAoc2VxLXVuaW9uIChzZXEtbWFwICMnY2FyIGxjbGlzdCkKKwkJCSAg ICAoc2VxLXVuaW9uIChzZXEtbWFwICMnY2FyIG1saXN0KQorCQkJCSAgICAgICAoc2VxLXVuaW9u IChzZXEtbWFwICMnY2FyIGxjc2hsaXN0KQorCQkJCQkJICAoc2VxLW1hcCAjJ2NhciBzaGxpc3Qp KSkpKSkKKwkgKGVkLWV4dHMgKHdoZW4gZXh0cworCQkgICAgKHNlcS1tYXAKKwkJICAgICAobGFt YmRhIChlbHQpCisJCSAgICAgICAoY29uY2F0ICIqIiAoc3RyaW5nLXRyaW0gIGVsdCAiXFxcXCIg IlxcXFwnIikpKQorCQkgICAgIGV4dHMpKSkpCisgICAgZWQtZXh0cykpCisKKyhkZWZ2YXIgdGV4 LS1idWZmZXJzLWxpc3QgbmlsKQorKGRlZnZhci1sb2NhbCB0ZXgtLW9sZC1zeW50YXgtZnVuY3Rp b24gbmlsKQorCisoY2wtZGVmbWV0aG9kIHhyZWYtYmFja2VuZC1yZWZlcmVuY2VzICgoX2JhY2tl bmQgKGVxbCAndGV4LWV0YWdzKSkgaWRlbnRpZmllcikKKyAgIkZpbmQgcmVmZXJlbmNlcyBvZiBJ REVOVElGSUVSIGluIFRlWCBidWZmZXJzIGFuZCBmaWxlcy4iCisgIChyZXF1aXJlICdzZW1hbnRp Yy9zeW1yZWYvZ3JlcCkKKyAgKGRlZnZhciBzZW1hbnRpYy1zeW1yZWYtZmlsZXBhdHRlcm4tYWxp c3QpCisgIChsZXQgKGJ1ZnMgdGV4YnVmcworICAgICAgICAgICAgIChtb2RlIG1ham9yLW1vZGUp KQorICAgIChkb2xpc3QgKGJ1ZiAoYnVmZmVyLWxpc3QpKQorICAgICAgKGlmIChlcSAoYnVmZmVy LWxvY2FsLXZhbHVlICdtYWpvci1tb2RlIGJ1ZikgbW9kZSkKKyAgICAgICAgICAocHVzaCBidWYg YnVmcykKKyAgICAgICAgKHdoZW4gKHN0cmluZy1tYXRjaC1wICIuKlxcLlt0VF1lW3hYXSIgKGJ1 ZmZlci1uYW1lIGJ1ZikpCisgICAgICAgICAgKHB1c2ggYnVmIHRleGJ1ZnMpKSkpCisgICAgKHVu bGVzcyAoc2VxLXNldC1lcXVhbC1wIHRleC0tYnVmZmVycy1saXN0IGJ1ZnMpCisgICAgICAobGV0 KiAoKGFtYWxpc3QgKHRleC0tY29sbGVjdC1maWxlLWV4dGVuc2lvbnMpKQorCSAgICAgKGV4dGxp c3QgKGFsaXN0LWdldCBtb2RlIHNlbWFudGljLXN5bXJlZi1maWxlcGF0dGVybi1hbGlzdCkpCisJ ICAgICAoZXh0bGlzdC1uZXcgKHNlcS11bmlxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAo c2VxLXVuaW9uIGFtYWxpc3QgZXh0bGlzdCAjJ3N0cmluZy1tYXRjaC1wKSkpKQorCShzZXRxIHRl eC0tYnVmZmVycy1saXN0IGJ1ZnMpCisJKGRvbGlzdCAoYnVmIGJ1ZnMpCisJICAod2hlbi1sZXQg KChmYnVmIChidWZmZXItZmlsZS1uYW1lIGJ1ZikpCisJCSAgICAgKGV4dCAoZmlsZS1uYW1lLWV4 dGVuc2lvbiBmYnVmKSkKKwkJICAgICAoZmluZXh0IChjb25jYXQgIiouIiBleHQpKQorCQkgICAg ICgobm90IChzZXEtZmluZCAobGFtYmRhIChlbHQpIChzdHJpbmctbWF0Y2gtcCBlbHQgZmluZXh0 KSkKKwkJCQkgICAgIGV4dGxpc3QtbmV3KSkpCisJCSAgICAgKChwdXNoIGZpbmV4dCBleHRsaXN0 LW5ldykpKSkpCisJKHVubGVzcyAoc2VxLXNldC1lcXVhbC1wIGV4dGxpc3QtbmV3IGV4dGxpc3Qp CisJICAoc2V0ZiAoYWxpc3QtZ2V0IG1vZGUgc2VtYW50aWMtc3ltcmVmLWZpbGVwYXR0ZXJuLWFs aXN0KQorICAgICAgICAgICAgICAgIGV4dGxpc3QtbmV3KSkpKQorICAgIChsZXQqIChzZXRzeW50 YXgKKyAgICAgICAgICAgKHB1bmN0ICh3aXRoLXN5bnRheC10YWJsZSAodGV4LWZpbmQtcmVmZXJl bmNlcy1zeW50YXgtdGFibGUpCisgICAgICAgICAgICAgICAgICAgIChzZXEtcG9zaXRpb25zIGlk ZW50aWZpZXIgKGxpc3QgP3cgP18pCisJCQkgICAgICAgICAgIChsYW1iZGEgKGVsdCBzeWNvZGUp CisJCQkgICAgICAgICAgICAgKG5vdCAobWVtcSAoY2hhci1zeW50YXggZWx0KSBzeWNvZGUpKSkp KSkKKyAgICAgICAgICAgKGVuZCAoYW5kIHB1bmN0CisgICAgICAgICAgICAgICAgICAgICAobWVt cSAoMS0gKGxlbmd0aCBpZGVudGlmaWVyKSkgcHVuY3QpCisgICAgICAgICAgICAgICAgICAgICAo PiAobGVuZ3RoIGlkZW50aWZpZXIpIDEpCisgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJc XCgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWdleHAtcXVvdGUKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcgKGVsdCBpZGVudGlmaWVyCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEtIChsZW5ndGggaWRlbnRpZmllcikp KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXCkiKSkpCisgICAgICAgICAgIChi ZWcgKGFuZCBwdW5jdAorICAgICAgICAgICAgICAgICAgICAgKG1lbXEgMCBwdW5jdCkKKyAgICAg ICAgICAgICAgICAgICAgIChjb25jYXQgIlxcKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHJlZ2V4cC1xdW90ZSAoc3RyaW5nIChlbHQgaWRlbnRpZmllciAwKSkpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJcXCkiKSkpCisgICAgICAgICAgICh0ZXh0LW1vZGUtaG9vawor ICAgICAgICAgICAgKGlmIChvciBlbmQgYmVnKQorICAgICAgICAgICAgICAgIChwcm9nbgorICAg ICAgICAgICAgICAgICAgKHRleC14cmVmLXN5bnRheC1mdW5jdGlvbiBpZGVudGlmaWVyIGJlZyBl bmQpCisgICAgICAgICAgICAgICAgICAoc2V0cSBzZXRzeW50YXggKGxhbWJkYSAoKQorCQkgICAg ICAgICAgICAgICAgICAgIChzZXRxLWxvY2FsIHN5bnRheC1wcm9wZXJ0aXplLWZ1bmN0aW9uCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXgtLXhyZWYt c3ludGF4LWZ1bikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxLWxv Y2FsIFRlWC1zdHlsZS1ob29rLWFwcGxpZWQtcCB0KSkpCisgICAgICAgICAgICAgICAgICAoY29u cyBzZXRzeW50YXggdGV4dC1tb2RlLWhvb2spKQorICAgICAgICAgICAgICB0ZXh0LW1vZGUtaG9v aykpKQorICAgICAgKHVubGVzcyAobWVtcSAnZG9jdGV4LW1vZGUgKGRlcml2ZWQtbW9kZS1hbGwt cGFyZW50cyBtb2RlKSkKKyAgICAgICAgKHNldHEgYnVmcyAoYXBwZW5kIHRleGJ1ZnMgYnVmcykp KQorICAgICAgKHdoZW4gKG9yIGVuZCBiZWcpCisgICAgICAgIChkb2xpc3QgKGJ1ZiBidWZzKQor ICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgorICAgICAgICAgICAgKHVubGVzcyAo bG9jYWwtdmFyaWFibGUtcCAndGV4LS1vbGQtc3ludGF4LWZ1bmN0aW9uKQorICAgICAgICAgICAg ICAoc2V0cSB0ZXgtLW9sZC1zeW50YXgtZnVuY3Rpb24gc3ludGF4LXByb3BlcnRpemUtZnVuY3Rp b24pKQorICAgICAgICAgICAgKHNldHEtbG9jYWwgc3ludGF4LXByb3BlcnRpemUtZnVuY3Rpb24K KyAgICAgICAgICAgICAgICAgICAgICAgIHRleC0teHJlZi1zeW50YXgtZnVuKQorICAgICAgICAg ICAgKHN5bnRheC1wcHNzLWZsdXNoLWNhY2hlIChwb2ludC1taW4pKSkpKQorICAgICAgKHVud2lu ZC1wcm90ZWN0CisgICAgICAgICAgKHhyZWYtYmFja2VuZC1yZWZlcmVuY2VzIG5pbCBpZGVudGlm aWVyKQorICAgICAgICAod2hlbiAob3IgZW5kIGJlZykKKyAgICAgICAgICAoZG9saXN0IChidWYg YnVmcykKKyAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZgorICAgICAgICAgICAg ICAod2hlbiBidWZmZXItZmlsZS10cnVlbmFtZQorICAgICAgICAgICAgICAgIChzZXRxLWxvY2Fs IHN5bnRheC1wcm9wZXJ0aXplLWZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg dGV4LS1vbGQtc3ludGF4LWZ1bmN0aW9uKQorICAgICAgICAgICAgICAgIChzeW50YXgtcHBzcy1m bHVzaC1jYWNoZSAocG9pbnQtbWluKSkpKSkpKSkpKQorCiAobWFrZS1vYnNvbGV0ZS12YXJpYWJs ZSAndGV4LW1vZGUtbG9hZC1ob29rCiAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIGB3aXRo LWV2YWwtYWZ0ZXItbG9hZCcgaW5zdGVhZC4iICIyOC4xIikKIChydW4taG9va3MgJ3RleC1tb2Rl LWxvYWQtaG9vaykKLS0gCjIuMzUuOAoK --0000000000008be4640618800951--