From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: "Miguel V. S. Frasson" Newsgroups: gmane.emacs.devel Subject: Re: Improving regexp-opt Date: Fri, 12 Apr 2019 12:06:06 -0300 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000eea3de058656a595" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="238218"; mail-complaints-to="usenet@blaine.gmane.org" Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Apr 12 17:06:58 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hExlY-000zkq-Nt for ged-emacs-devel@m.gmane.org; Fri, 12 Apr 2019 17:06:58 +0200 Original-Received: from localhost ([127.0.0.1]:38455 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hExlX-0005SZ-MP for ged-emacs-devel@m.gmane.org; Fri, 12 Apr 2019 11:06:55 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:57948) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hExlK-0005QM-CQ for emacs-devel@gnu.org; Fri, 12 Apr 2019 11:06:47 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hExlF-0007LR-L1 for emacs-devel@gnu.org; Fri, 12 Apr 2019 11:06:42 -0400 Original-Received: from mail-it1-x133.google.com ([2607:f8b0:4864:20::133]:55931) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hExlF-0007GX-3h for emacs-devel@gnu.org; Fri, 12 Apr 2019 11:06:37 -0400 Original-Received: by mail-it1-x133.google.com with SMTP id y134so16191509itc.5 for ; Fri, 12 Apr 2019 08:06:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=7QLM2T9wUFSelWDTlYFbcvfgYbpzOg84srdCey4RsiE=; b=LYCjqP2An7XEkINvNL8oy513aTh3j9iPWGQwQ3iChHx1IlPIKuVKnH7FnkNC6Ck+yP xNp2HbcKrjMMbVyA1Hnr+yWF5r/wOoxM0lWeMsOUsnuPAP5FHjN0rC6Zoh5l3QOzWNt5 FzSfQlSgYzP1vOFpDL85au1M+cwG8Cl4G7YEC8/3qieMs8A1BtRikWxDjIWCYP5VCpqT ARXd27v/OW3y1NEFMS5fIFRiY64zQBEXvH6QDUP9UtiwFOjQKszrhasA9PyRu5wIuSgw mNERaAioz9WYewVFnnnUcMfdjhETvI9Y07FlmVRDxNoRgRAslRaHIt93V7aYbt1Dq6cy UC2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=7QLM2T9wUFSelWDTlYFbcvfgYbpzOg84srdCey4RsiE=; b=aMo6HipLxkdgM3yOWyJnzpAZrSLvA9Dsn3w1NY1wxRnyT8KlaYCT4z8wtot+iCu/ln gCvAFt3Uhy3UFKswblf/+9Bu9KUVE68PfRZv7T7eSUQ/FEmpv/e+VoPdu7OWZZFZexJg n1tbQNk93hZ87OnW9rbZEQ26dEyj80BJl3GR5/VZbzNN604jLthh3ohgOLgJDA5SpTP/ RqNvTrxWC+ceF1vVY41I11Q73Sd/SrOiEvT1IstNDiN7ciOOprQsdrJs9LgNWgulm0Ye AVrzr32NN63RKF2MlhdC/xSFWsDmhd+/7G8Rv4XlPYQimpRipkP6YFaSz1hIvJwwxGCJ xT6g== X-Gm-Message-State: APjAAAVqrNvVtGoUoIFUq/eu+oxIXMZwG3R1PtYfeKoUq2Ub1kBx7Y9T wZHZNfhzUOA8uv+53tIsLPHwtOHqn/jA0ByoVbs= X-Google-Smtp-Source: APXvYqxkZp6iOHjV8jqrEFqrYuv3HPdZ9a0v5xbN8GWidbYDvVHpH/dgcotF9zd3bFRfVJTtkl5k+DFqtMmLY29M9g4= X-Received: by 2002:a24:6e91:: with SMTP id w139mr13302510itc.84.1555081592730; Fri, 12 Apr 2019 08:06:32 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::133 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:235346 Archived-At: --000000000000eea3de058656a595 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Dear Stefan and others Some time ago I suggested an improvement in regexp-opt, factoring similarities at the end of groups. At the end, Stefan wrote: Em sex, 8 de fev de 2019 =C3=A0s 01:48, Stefan Monnier escreveu: > A much better approach is to go for a real "regexp to NFA/DFA > conversion". The `lex.el` package is one such example, but it's very > inefficient (in terms of building the FA and in the size of the FA, not > in terms of running the FA). After some time, I had an idea of simplification by FA. The base idea is implement FA as "nodes" being lists of ARROWi and arrows being (CHAR . NODE). For example the initial FA for strings ("abd" "acd") is >1 --a--> 2 --b--> 3 --d--> 4 --epsilon--> nil | ^ +---c--> 5 --d--> 6 --epsilon-----| and inplemented as (?a (?b (?d (0))) (?c (?d (0)))) =3D ((?a . ((?b . ((?d . ((0 . nil))))) (?c . ((?d . ((0 . nil))))))) Note that nodes 3 and 5 are `equal'. Simplification is to make them `eq'. Also, there is simplification where a node is equal to a subset of a parent node, resulting is a ? construction. For example, +---f--> 9 ----------epsilon -------------\ | v >1 --a--> 2 --b--> 3 --c--> 4 --f--> 5 --epsilon--> nil | ^ +---d--> 6 --e---/ Node 4 is equal to a subnode derived from 2, resulting on +---epsilon-------+ | v >1 --a--> 2 --b--> 3 --c--> 4 --f--> 5 --epsilon--> nil | ^ +---d--> 6 --e--> 7 I made an inplementation, a patch to regexp-opt.el The pros: If the resulting strings "came from" a regexp that is splittable, the FA implementation always simplifies to it. In pratice, these are uncommun, and in most cases, the results are equivalent. The cons: The algorithm for FA seams to have greater computation complexity, takes about 20 times to compute in average. Example, the case on the (setq strings '("cond" "if" "when" "unless" "while" "let" "let*" "progn" "prog1" "prog2" "save-restriction" "save-excursion" "save-window-excursion" "save-current-buffer" "save-match-data" "catch" "throw" "unwind-protect" "condition-case")) (regexp-opt strings) -> "\\(?:c\\(?:atch\\|ond\\(?:ition-case\\)?\\)\\|if\\|let\\*?\\|prog[12n]\\|s= ave-\\(?:current-buffer\\|excursion\\|match-data\\|\\(?:restrict\\|window-e= xcurs\\)ion\\)\\|throw\\|un\\(?:less\\|wind-protect\\)\\|wh\\(?:en\\|ile\\)= \\)" (regexp-opt2 strings) -> "\\(?:c\\(?:atch\\|ond\\(?:ition-case\\)?\\)\\|if\\|let\\*?\\|prog[12n]\\|s= ave-\\(?:current-buffer\\|match-data\\|\\(?:restrict\\|\\(?:window-\\)?excu= rs\\)ion\\)\\|throw\\|un\\(?:less\\|wind-protect\\)\\|wh\\(?:en\\|ile\\)\\)= " The difference is that FA algorithm BUT my version takes 70 times more time to compute. Example 2: (setq strings2 '("car" "cdr" "caar" "cadr" "cdar" "cddr" "caaar" "caadr" "cadar" "caddr" "cdaar" "cdadr" "cddar" "cdddr")) (regexp-opt strings2) -> "\\(?:c\\(?:\\(?:a\\(?:a[ad]\\|d[ad]\\|[ad]\\)\\|d\\(?:a[ad]\\|d[ad]\\|[ad]= \\)\\|[ad]\\)r\\)\\)" (regexp-opt2 strings2) -> "\\(?:c[ad]\\(?:[ad][ad]?\\)?r\\)" FA is 7 times slower here. If this implementation is useful, I would like very much to contribute it. I actually have the other implementation from previous idea. It is faster than FA, same complexity of current regexp-opt, a bit slower of course, but I like this better. Best regards Miguel Frasson --=20 Miguel Vinicius Santini Frasson mvsfrasson@gmail.com --000000000000eea3de058656a595 Content-Type: text/x-patch; charset="UTF-8"; name="regexp-opt-by-fa.diff" Content-Disposition: attachment; filename="regexp-opt-by-fa.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jue6tg9v0 LS0tIHJlZ2V4cC1vcHQuZWwJMjAxOS0wMi0xNiAyMzo1OToyMi4wMDAwMDAwMDAgLTAyMDAKKysr IHJlZ2V4cC1vcHQzLmVsCTIwMTktMDQtMTIgMTA6MTQ6MjUuODcxOTY4MzkzIC0wMzAwCkBAIC0x LDQgKzEsNCBAQAotOzs7IHJlZ2V4cC1vcHQuZWwgLS0tIGdlbmVyYXRlIGVmZmljaWVudCByZWdl eHBzIHRvIG1hdGNoIHN0cmluZ3MgLSotIGxleGljYWwtYmluZGluZzogdCAtKi0KKzs7OyByZWdl eHAtb3B0Mi5lbCAtLS0gZ2VuZXJhdGUgZWZmaWNpZW50IHJlZ2V4cHMgdG8gbWF0Y2ggc3RyaW5n cyAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0IC0qLQogCiA7OyBDb3B5cmlnaHQgKEMpIDE5OTQtMjAx OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIApAQCAtMzcsMTAgKzM3LDEwIEBACiA7 OyBGb3IgZXhhbXBsZToKIDs7CiA7OyAobGV0ICgoc3RyaW5ncyAnKCJjb25kIiAiaWYiICJ3aGVu IiAidW5sZXNzIiAid2hpbGUiCi07OyAJCSAgICAibGV0IiAibGV0KiIgInByb2duIiAicHJvZzEi ICJwcm9nMiIKLTs7IAkJICAgICJzYXZlLXJlc3RyaWN0aW9uIiAic2F2ZS1leGN1cnNpb24iICJz YXZlLXdpbmRvdy1leGN1cnNpb24iCi07OyAJCSAgICAic2F2ZS1jdXJyZW50LWJ1ZmZlciIgInNh dmUtbWF0Y2gtZGF0YSIKLTs7IAkJICAgICJjYXRjaCIgInRocm93IiAidW53aW5kLXByb3RlY3Qi ICJjb25kaXRpb24tY2FzZSIpKSkKKzs7ICAgICAgICAgICAgICAgICAgImxldCIgImxldCoiICJw cm9nbiIgInByb2cxIiAicHJvZzIiCis7OyAgICAgICAgICAgICAgICAgICJzYXZlLXJlc3RyaWN0 aW9uIiAic2F2ZS1leGN1cnNpb24iICJzYXZlLXdpbmRvdy1leGN1cnNpb24iCis7OyAgICAgICAg ICAgICAgICAgICJzYXZlLWN1cnJlbnQtYnVmZmVyIiAic2F2ZS1tYXRjaC1kYXRhIgorOzsgICAg ICAgICAgICAgICAgICAiY2F0Y2giICJ0aHJvdyIgInVud2luZC1wcm90ZWN0IiAiY29uZGl0aW9u LWNhc2UiKSkpCiA7OyAgIChjb25jYXQgIigiIChyZWdleHAtb3B0IHN0cmluZ3MgdCkgIlxcPiIp KQogOzsgID0+ICIoXFwoY1xcKGF0Y2hcXHxvbmRcXChpdGlvbi1jYXNlXFwpP1xcKVxcfGlmXFx8 bGV0XFwqP1xcfHByb2dbMTJuXVxcfHNhdmUtXFwoY3VycmVudC1idWZmZXJcXHxleGN1cnNpb25c XHxtYXRjaC1kYXRhXFx8cmVzdHJpY3Rpb25cXHx3aW5kb3ctZXhjdXJzaW9uXFwpXFx8dGhyb3dc XHx1blxcKGxlc3NcXHx3aW5kLXByb3RlY3RcXClcXHx3aFxcKGVuXFx8aWxlXFwpXFwpXFw+Igog OzsKQEAgLTcxLDE4ICs3MSwxNSBAQAogOzsgeW91ciBjb2RlIGZvciBzdWNoIGNoYW5nZXMgdG8g aGF2ZSBlZmZlY3QgaW4geW91ciBjb2RlLgogCiA7OyBPcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIGZv bnQtbG9jay5lbCwgZnJvbSBhbiBpZGVhIGZyb20gU3RpZydzIGhsMzE5LmVsLCB3aXRoCi07OyB0 aGFua3MgZm9yIGlkZWFzIGFsc28gdG8gTWljaGFlbCBFcm5zdCwgQm9iIEdsaWNrc3RlaW4sIERh biBOaWNvbGFlc2N1IGFuZAotOzsgU3RlZmFuIE1vbm5pZXIuCis7OyB0aGFua3MgZm9yIGlkZWFz IGFsc28gdG8gTWljaGFlbCBFcm5zdCwgQm9iIEdsaWNrc3RlaW4sIERhbiBOaWNvbGFlc2N1LAor OzsgU3RlZmFuIE1vbm5pZXIgYW5kIE1pZ3VlbCBGcmFzc29uLgorCiA7OyBObyBkb3VidCBgcmVn ZXhwLW9wdCcgZG9lc24ndCBhbHdheXMgcHJvZHVjZSBvcHRpbWFsIHJlZ2V4cHMsIHNvIGNvZGUs IGlkZWFzCiA7OyBvciBhbnkgb3RoZXIgaW5mb3JtYXRpb24gdG8gaW1wcm92ZSB0aGluZ3MgYXJl IHdlbGNvbWUuCi07OwotOzsgT25lIHBvc3NpYmxlIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIGNv bXBpbGUgJygiYWEiICJhYiIgImJhIiAiYmIiKQotOzsgaW50byAiW2FiXVthYl0iIHJhdGhlciB0 aGFuICJhW2FiXVxcfGJbYWJdIi4gIEknbSBub3Qgc3VyZSBpdCdzIHdvcnRoCi07OyBpdCBidXQg aWYgc29tZW9uZSBrbm93cyBob3cgdG8gZG8gaXQgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRvbyBt YW55Ci07OyBjb250b3J0aW9ucywgSSdtIGFsbCBlYXJzLgogDAogOzs7IENvZGU6CiAKKzs7IG9y aWdpbmFsCiA7OzsjIyNhdXRvbG9hZAogKGRlZnVuIHJlZ2V4cC1vcHQgKHN0cmluZ3MgJm9wdGlv bmFsIHBhcmVuKQogICAiUmV0dXJuIGEgcmVnZXhwIHRvIG1hdGNoIGEgc3RyaW5nIGluIHRoZSBs aXN0IFNUUklOR1MuCkBAIC0xMTcsMTIgKzExNCwxMiBAQAogIChkZWZ1biBzaW1wbGlmaWVkLXJl Z2V4cC1vcHQgKHN0cmluZ3MgJm9wdGlvbmFsIHBhcmVuKQogICAgKGxldCAoKHBhcmVucwogICAg ICAgICAgIChjb25kICgoc3RyaW5ncCBwYXJlbikgICAgICAgKGNvbnMgcGFyZW4gXCJcXFxcKVwi KSkKLSAgICAgICAgICAgICAgICAoKGVxIHBhcmVuIFxcPSd3b3JkcykgICAgXFw9JyhcIlxcXFxc XD08XFxcXChcIiAuIFwiXFxcXClcXFxcPlwiKSkKLSAgICAgICAgICAgICAgICAoKGVxIHBhcmVu IFxcPSdzeW1ib2xzKSBcXD0nKFwiXFxcXF88XFxcXChcIiAuIFwiXFxcXClcXFxcXz5cIikpCi0g ICAgICAgICAgICAgICAgKChudWxsIHBhcmVuKSAgICAgICAgICBcXD0nKFwiXFxcXCg/OlwiIC4g XCJcXFxcKVwiKSkKLSAgICAgICAgICAgICAgICAodCAgICAgICAgICAgICAgICAgICAgICAgXFw9 JyhcIlxcXFwoXCIgLiBcIlxcXFwpXCIpKSkpKQorICAgICAgICAgICAgICAgICgoZXEgcGFyZW4g J3dvcmRzKSAgICAnKFwiXFxcXFxcPTxcXFxcKFwiIC4gXCJcXFxcKVxcXFw+XCIpKQorICAgICAg ICAgICAgICAgICgoZXEgcGFyZW4gJ3N5bWJvbHMpICcoXCJcXFxcXzxcXFxcKFwiIC4gXCJcXFxc KVxcXFxfPlwiKSkKKyAgICAgICAgICAgICAgICAoKG51bGwgcGFyZW4pICAgICAgICAgICcoXCJc XFxcKD86XCIgLiBcIlxcXFwpXCIpKQorICAgICAgICAgICAgICAgICh0ICAgICAgICAgICAgICAg ICAgICAgICAnKFwiXFxcXChcIiAuIFwiXFxcXClcIikpKSkpCiAgICAgIChjb25jYXQgKGNhciBw YXJlbikKLSAgICAgICAgICAgICAobWFwY29uY2F0IFxcPSdyZWdleHAtcXVvdGUgc3RyaW5ncyBc IlxcXFx8XCIpCisgICAgICAgICAgICAgKG1hcGNvbmNhdCAncmVnZXhwLXF1b3RlIHN0cmluZ3Mg XCJcXFxcfFwiKQogICAgICAgICAgICAgIChjZHIgcGFyZW4pKSkpIgogICAoc2F2ZS1tYXRjaC1k YXRhCiAgICAgOzsgUmVjdXJzZSBvbiB0aGUgc29ydGVkIGxpc3QuCkBAIC0xNDEsNiArMTM4LDgw IEBACiAJICAgICh0IHJlKSkpKSkKIAogOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biByZWdleHAtb3B0 MiAoc3RyaW5ncyAmb3B0aW9uYWwgcGFyZW4pCisgICJSZXR1cm4gYSByZWdleHAgdG8gbWF0Y2gg YSBzdHJpbmcgaW4gdGhlIGxpc3QgU1RSSU5HUy4KK0VhY2ggc3RyaW5nIHNob3VsZCBiZSB1bmlx dWUgaW4gU1RSSU5HUyBhbmQgc2hvdWxkIG5vdCBjb250YWluCithbnkgcmVnZXhwcywgcXVvdGVk IG9yIG5vdC4gIE9wdGlvbmFsIFBBUkVOIHNwZWNpZmllcyBob3cgdGhlCityZXR1cm5lZCByZWdl eHAgaXMgc3Vycm91bmRlZCBieSBncm91cGluZyBjb25zdHJ1Y3RzLgorCitUaGUgb3B0aW9uYWwg YXJndW1lbnQgUEFSRU4gY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCithIHN0cmluZwor ICAgIHRoZSByZXN1bHRpbmcgcmVnZXhwIGlzIHByZWNlZGVkIGJ5IFBBUkVOIGFuZCBmb2xsb3dl ZCBieQorICAgIFxcKSwgZS5nLiAgdXNlIFwiXFxcXCg/MTpcIiB0byBwcm9kdWNlIGFuIGV4cGxp Y2l0bHkgbnVtYmVyZWQKKyAgICBncm91cC4KKworYHdvcmRzJworICAgIHRoZSByZXN1bHRpbmcg cmVnZXhwIGlzIHN1cnJvdW5kZWQgYnkgXFw9XFw8XFwoIGFuZCBcXClcXD4uCisKK2BzeW1ib2xz JworICAgIHRoZSByZXN1bHRpbmcgcmVnZXhwIGlzIHN1cnJvdW5kZWQgYnkgXFxfPFxcKCBhbmQg XFwpXFxfPi4KKworbm9uLW5pbAorICAgIHRoZSByZXN1bHRpbmcgcmVnZXhwIGlzIHN1cnJvdW5k ZWQgYnkgXFwoIGFuZCBcXCkuCisKK25pbAorICAgIHRoZSByZXN1bHRpbmcgcmVnZXhwIGlzIHN1 cnJvdW5kZWQgYnkgXFwoPzogYW5kIFxcKSwgaWYgaXQgaXMKKyAgICBuZWNlc3NhcnkgdG8gZW5z dXJlIHRoYXQgYSBwb3N0Zml4IG9wZXJhdG9yIGFwcGVuZGVkIHRvIGl0IHdpbGwKKyAgICBhcHBs eSB0byB0aGUgd2hvbGUgZXhwcmVzc2lvbi4KKworVGhlIHJlc3VsdGluZyByZWdleHAgaXMgZXF1 aXZhbGVudCB0byBidXQgdXN1YWxseSBtb3JlIGVmZmljaWVudAordGhhbiB0aGF0IG9mIGEgc2lt cGxpZmllZCB2ZXJzaW9uOgorCisgKGRlZnVuIHNpbXBsaWZpZWQtcmVnZXhwLW9wdCAoc3RyaW5n cyAmb3B0aW9uYWwgcGFyZW4pCisgICAobGV0ICgocGFyZW5zCisgICAgICAgICAgKGNvbmQgKChz dHJpbmdwIHBhcmVuKSAgICAgICAoY29ucyBwYXJlbiBcIlxcXFwpXCIpKQorICAgICAgICAgICAg ICAgICgoZXEgcGFyZW4gXFw9J3dvcmRzKSAgICBcXD0nKFwiXFxcXFxcPTxcXFxcKFwiIC4gXCJc XFxcKVxcXFw+XCIpKQorICAgICAgICAgICAgICAgICgoZXEgcGFyZW4gXFw9J3N5bWJvbHMpIFxc PScoXCJcXFxcXzxcXFxcKFwiIC4gXCJcXFxcKVxcXFxfPlwiKSkKKyAgICAgICAgICAgICAgICAo KG51bGwgcGFyZW4pICAgICAgICAgIFxcPScoXCJcXFxcKD86XCIgLiBcIlxcXFwpXCIpKQorICAg ICAgICAgICAgICAgICh0ICAgICAgICAgICAgICAgICAgICAgICBcXD0nKFwiXFxcXChcIiAuIFwi XFxcXClcIikpKSkpCisgICAgIChjb25jYXQgKGNhciBwYXJlbikKKyAgICAgICAgICAgICAobWFw Y29uY2F0IFxcPSdyZWdleHAtcXVvdGUgc3RyaW5ncyBcIlxcXFx8XCIpCisgICAgICAgICAgICAg KGNkciBwYXJlbikpKSkiCisgIChsZXQqICgocmVnZXhwLW9wdC1icmFuY2hlcy1hbGlzdCBuaWwp OyBzdG9yYWdlIG9mIGByZWdleHAtb3B0LWJyYW5jaCcKKwkJCQkJOyBtYWRlIGxvY2FsCisJIChy b290LWZhIG5pbCkpCisgICAgKGRvbGlzdCAocyBzdHJpbmdzKQorICAgICAgKHNldHEgcm9vdC1m YSAocmVnZXhwLW9wdC1hZGQtc3RyaW5nLXRvLW5vZGUgcyByb290LWZhKSkpCisgICAgOzsKKyAg ICA7OyBTaW1wbGlmaWNhdGlvbgorICAgIDs7CisgICAgKHJlZ2V4cC1vcHQtcGVyZm9ybS1zaW1w bGlmaWNhdGlvbiByb290LWZhKQorICAgIDs7IGVuZCBvZiBzaW1wbGlmaWNhdGlvbgorICAgIDs7 CisgICAgOzsgb3V0cHV0IHJlZ2V4cCBzdG9yZWQgaW4gcm9vdC1mYQorICAgIDs7IHJldHVybiBh Y2NvcmRpbmcgdG8gUEFSRU4gYW5kIHR5cGUKKyAgICA7OworICAgIDs7KHJlZ2V4cC1vcHQtcHJp bnQtbm9kZSByb290LWZhICdncmFwaHZpeikKKyAgICAobGV0KiAoKHJlLXR5cGUgKHJlZ2V4cC1v cHQtdHlwZWQtcmVnZXhwIHJvb3QtZmEpKQorCSAgICh0eXBlIChjZHIgcmUtdHlwZSkpCisJICAg KHJlIChpZiAob3IgKGVxIHR5cGUgJ3NlcXVlbmNlKSAoZXEgdHlwZSAnZW1wdHkpKQorCQkgICAo Y29uY2F0ICJcXCg/OiIgKGNhciByZS10eXBlKSAiXFwpIikKKwkJIChjYXIgcmUtdHlwZSkpKQor CSAgIDs7IHJlLWdyb3VwIGlzIHRoZSByZSBiZWdpbm5pbmcgd2l0aCAiXFwoPzoiCisJICAgKHJl LWdyb3VwIChpZiAoZXEgdHlwZSAnc2luZ2xlKSAoY29uY2F0ICJcXCg/OiIgcmUgIlxcKSIpIHJl KSkKKwkgICA7OyBvcGVuIGlzIHRoZSBncm91cCBiZWdpbm5pbmcgc3RyaW5nIGlmIG5lY2Vzc2Fy eQorCSAgIChvcGVuIChjb25kICgoc3RyaW5ncCBwYXJlbikgcGFyZW4pCisJCSAgICAgICAoKGVx IHBhcmVuICd3b3JkcykgIlxcPFxcKCIpCisJCSAgICAgICAoKGVxIHBhcmVuICdzeW1ib2xzKSAi XFxfPFxcKCIpCisJCSAgICAgICAocGFyZW4gIlxcKCIpKSkKKwkgICAoY2xvc2UgKGNvbmQgKChl cSBwYXJlbiAnd29yZHMpICJcXD4iKQorCQkJKChlcSBwYXJlbiAnc3ltYm9scykgIlxcXz4iKQor CQkJKHQgIiIpKSkpCisgICAgICA7IGlmIE9QRU4sIHJlcGxhY2UgIlxcKD86IiBieSBPUEVOCisg ICAgICAoaWYgb3BlbiAoY29uY2F0IG9wZW4gKHN1YnN0cmluZyByZS1ncm91cCA0KSBjbG9zZSkg cmUpKSkpCisKKzs7OyMjI2F1dG9sb2FkCiAoZGVmdW4gcmVnZXhwLW9wdC1kZXB0aCAocmVnZXhw KQogICAiUmV0dXJuIHRoZSBkZXB0aCBvZiBSRUdFWFAuCiBUaGlzIG1lYW5zIHRoZSBudW1iZXIg b2Ygbm9uLXNoeSByZWdleHAgZ3JvdXBpbmcgY29uc3RydWN0cwpAQCAtMTUxLDE3ICsyMjIsMTgg QEAKICAgICA7OyBDb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gcGFyZW50aGVzZXMgaW4gUkVHRVhQ LgogICAgIChsZXQgKChjb3VudCAwKSBzdGFydCBsYXN0KQogICAgICAgKHdoaWxlIChzdHJpbmct bWF0Y2ggIlxcXFwoXFwoXFw/WzAtOV0qOlxcKT8iIHJlZ2V4cCBzdGFydCkKLQkoc2V0cSBzdGFy dCAobWF0Y2gtZW5kIDApKQkgICAgICA7IFN0YXJ0IG9mIG5leHQgc2VhcmNoLgotCSh3aGVuIChh bmQgKG5vdCAobWF0Y2gtYmVnaW5uaW5nIDEpKQotCQkgICAoc3VicmVnZXhwLWNvbnRleHQtcCBy ZWdleHAgKG1hdGNoLWJlZ2lubmluZyAwKSBsYXN0KSkKLQkgIDs7IEl0J3Mgbm90IGEgc2h5IGdy b3VwIGFuZCBpdCdzIG5vdCBpbnNpZGUgYnJhY2tldHMgb3IgYWZ0ZXIKLQkgIDs7IGEgYmFja3Ns YXNoOiBpdCdzIHJlYWxseSBhIGdyb3VwLW9wZW4gbWFya2VyLgotCSAgKHNldHEgbGFzdCBzdGFy dCkJICAgIDsgU3BlZWQgdXAgbmV4dCByZWdleHAtb3B0LXJlLWNvbnRleHQtcC4KLQkgIChzZXRx IGNvdW50ICgxKyBjb3VudCkpKSkKKyAgICAgICAgKHNldHEgc3RhcnQgKG1hdGNoLWVuZCAwKSkg ICAgICAgICAgICA7IFN0YXJ0IG9mIG5leHQgc2VhcmNoLgorICAgICAgICAod2hlbiAoYW5kIChu b3QgKG1hdGNoLWJlZ2lubmluZyAxKSkKKyAgICAgICAgICAgICAgICAgICAoc3VicmVnZXhwLWNv bnRleHQtcCByZWdleHAgKG1hdGNoLWJlZ2lubmluZyAwKSBsYXN0KSkKKyAgICAgICAgICA7OyBJ dCdzIG5vdCBhIHNoeSBncm91cCBhbmQgaXQncyBub3QgaW5zaWRlIGJyYWNrZXRzIG9yIGFmdGVy CisgICAgICAgICAgOzsgYSBiYWNrc2xhc2g6IGl0J3MgcmVhbGx5IGEgZ3JvdXAtb3BlbiBtYXJr ZXIuCisgICAgICAgICAgKHNldHEgbGFzdCBzdGFydCkgICAgICAgICA7IFNwZWVkIHVwIG5leHQg cmVnZXhwLW9wdC1yZS1jb250ZXh0LXAuCisgICAgICAgICAgKHNldHEgY291bnQgKDErIGNvdW50 KSkpKQogICAgICAgY291bnQpKSkKIAwKIDs7OyBXb3JraG9yc2UgZnVuY3Rpb25zLgogCis7OyBr ZXB0IGZvciB0aGUgb3JpZ2luYWwgYHJlZ2V4cC1vcHQnCiAoZGVmdW4gcmVnZXhwLW9wdC1ncm91 cCAoc3RyaW5ncyAmb3B0aW9uYWwgcGFyZW4gbGF4KQogICAiUmV0dXJuIGEgcmVnZXhwIHRvIG1h dGNoIGEgc3RyaW5nIGluIHRoZSBzb3J0ZWQgbGlzdCBTVFJJTkdTLgogSWYgUEFSRU4gbm9uLW5p bCwgb3V0cHV0IHJlZ2V4cCBwYXJlbnRoZXNlcyBhcm91bmQgcmV0dXJuZWQgcmVnZXhwLgpAQCAt MjU2LDYzICszMjgsODkzIEBACiAJCQljbG9zZS1ncm91cCkpKSkpKSkpKSkKIAogCis7OyBSYXRp b25hbGUgZm9yIHNpbXBsaWZpY2F0aW9uCis7OyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 Cis7OworOzsgSWYgYSBsaXN0IG9mIHN0cmluZ3MgY291bGQgYmUgYXJyYW5nZWQgaW4gYSByZWdl eHAgc3BsaXRhYmxlIGluCis7OyB1bml0cywgYW5kIHdlIGFycmFuZ2UgdGhlc2Ugc3RyaW5ncyBp biBmaW5pdGUgYXV0b21hdGEgKG9yaWVudGVkCis7OyBncmFwaCB3aXRoIGxhYmVsZWQgYXJyb3dz IGFuZCBuYW1lbGVzcyBub2RlcyksIGZyb20gYSBwb2ludCBhIHNldAorOzsgb2Ygc3ViZ3JhcGhz IHdpbGwgcmVwcm9kdWNlIHNhbWUgcGF0dGVybiAoYXJlIGBlcXVhbCcpLCBzbyB3ZQorOzsgc2lt cGxpZnkgYnkgbWFraW5nIHRoZSBgZXF1YWwncyBiZWNvbWUgYGVxJ3MsIG1lcmdpbmdpbmcgbm9k ZXMsCis7OyB3aGF0IGNsb3NlcyBhIGJpdXJjYXRpb24sIG1lYW5pbmcgYSBzbWFsbGVyIGFsdGVy bmF0aXZlIGdyb3VwIGluCis7OyByZWdleHAuCis7OworOzsgSW1wbGVtZW50YXRpb24gb2Ygb3B0 aW1pemF0aW9uIGJ5IGZpbml0ZSBhdXRvbWF0YSBGQQorOzsgPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsKKzs7IFJlZ2V4cCBhdXRvbWF0YSBh cmUgYSB0eXBlIG9mIGRpcmVjdGVkIGdyYXBoIHdpdGggbGFiZWxlZCBhcnJvd3MuCis7OworOzsg Tk9ERSA9IChBUlJPVzEgQVJST1cyIC4uLikKKzs7IEEgbm9kZSBpcyBhIGxpc3Qgb2YgYXJyb3dz IHBvaW50aW5nIG91dCBmcm9tIGl0LgorOzsKKzs7IEFSUk9XID0gKENIQVIgLiBOT0RFKQorOzsg QW4gYXJyb3cgaXMgYSBjb25zIG9mIGl0cyBsYWJlbCBhbmQgYSBub2RlIHBvaW50ZWQgYnkgaXQu Cis7OworOzsgRWFjaCBub2RlIG11c3QgaGF2ZSBhIHVuaXF1ZSBhcnJvdyB3aXRoIENIQVIsIG11 c3QgYmUgc29ydGVkCis7OyBiZWNhdXNlIHdlIHdpbGwgY29tcGFyZSBub2RlcyB3aXRoIGBlcXVh bCcuCis7OworOzsgU2luY2UgdGhlIGVtcHR5IHN0cmluZyAiIiBtdXN0IGJlIGluY2x1ZGVkIGlu IGEgbmF0dXJhbCB3YXksIGFsbAorOzsgc3RyaW5ncyBhcmUgaW5jbHVkZWQgaW4gRkFzIGxpa2Ug YSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncywgd2hhdAorOzsgbWVhbnMgImVuZGluZyB3aXRoIGVw c2lsb24gYXJyb3ciIGluIEZBIGphcmdvbi4gIFRoZSBzdHJpbmcgIiIgaXMKKzs7IGp1c3QgYW4g ZXBzaWxvbiBhcnJvdyAoYXJyb3cgd2l0aCBlbXB0eSBsYWJlbCkuICBUaGUgY2hhciAwCis7OyBy ZXByZXNlbnRzIHRoZSBgZXBzaWxvbicgYXJyb3dzIG9mIEZBLgorOzsKKzs7IEEgcGF0aCBpbiB0 aGUgZ3JhcGggZnJvbSBzdGFydCBub2RlIHRvIGVuZCBub2RlIChuaWwpIHJlcHJlc2VudHMgYQor Ozsgc3RyaW5nIHdpdGggdGhhdCBjaGFyYWN0ZXJlcywgZXBzaWxvbiBhcnJvd3MgKGNoYXI9MCkg YWRkaW5nIG5vCis7OyBjaGFycyB0byBzdHJpbmcuCis7OworOzsgQ2hhcnNldHMsIGFsdGVybmF0 aXZlIGdyb3VwcyBvciBgPycgY29uc3RydWN0aW9ucyBtYWtlIGEKKzs7IGJpZnVyY2F0aW9uIGlu IHRoZSBwYXRoLiAgRXhhbXBsZTogcmVnZXhwICJhP1xcKGJcXHxjZFxcKWUiIGlzCis7OyBpbXBs ZW1lbnRlZCBieSB0aGUgRkEKKzs7Cis7OyAgIGVwc2lsb24tfAorOzsgIC8gICAgICAgIHYKKzs7 ID4xIC0tYS0tPiAyIC0tLWItLS0+IDMgLS1lLS0+IDUgLS1lcHNpbG9uLS0+IG5pbAorOzsgICAg ICAgICAgIHwgICAgICAgICAgXgorOzsgICAgICAgICAgIFwtYy0+IDQgLWQtLworOzsKKzs7IFdo ZW4gdHJhbnNsYXRpbmcgc3RyaW5ncyB0byBGQSwgdGhlICJ1bmlxdWUgYXJyb3cgd2l0aCBDSEFS IiBydWxlCis7OyBhbHJlYWR5IGdyb3VwcyBzaW1pbGFyaXRpZXMgYXQgdGhlIGJlZ2lubmluZyBv ZiByZWdleHBzLiAgRm9yCis7OyBleGFtcGxlLCBmcm9tIHN0cmluZ3MgKCJhYmQiICJhY2QiKSwg d2UgZ2V0IHRoZSBGQToKKzs7Cis7OyAgPjEgLS1hLS0+IDIgLS1iLS0+IDMgLS1kLS0+IDQgLS1l cHNpbG9uLS0+IG5pbAorOzsgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXgorOzsgICAgICAgICAgICArLS0tYy0tPiA1IC0tZC0tPiA2IC0tZXBzaWxvbi0tLS0v Cis7OworOzsgVGhpcyBGQSBpcyBpbnRlcm5hbGx5IHN0b3JlZCBhcworOzsgICAgKCg/YSAoP2Ig KD9kICgwKSkpCis7OyAgICAgICAgICg/YyAoP2QgKDApKSkpKQorOzsKKzs7IE5vdGUgdGhhdCBu b3QgYWxsIHN1Y2ggZ3JhcGhzIGNvbWUgZnJvbSBhIHJlZ2V4cCBhdXRvbWF0b24uIFdlIHdpbGwK Kzs7IG5vdCBhbGxvdyBhIGdyYXBoIHdpdGggYXJyb3dzIGNvbm5lY3RpbmcgYnJhbmNoZXMgb2Yg YW4KKzs7IGFsdGVybmF0aXZlLiAgRm9yIGV4YW1wbGUsIGl0IGlzIG5vdCBhbGxvd2VkIGFuIGFy cm93IGZyb20gMworOzsgcG9pbnRpbmcgdG8gNSwgZ2V0dGluZyB0aGUgZm9sbG93aW5nIGdyYXBo OgorOzsKKzs7ICA+MSAtLWEtLT4gMiAtLWItLT4gMyAtLWMtLT4gNCAtLWYtLT4gRgorOzsgICAg ICAgICAgICB8ICAgICAgICBnICAgICAgICBeICAgICAgICAgICAoISBub3QgYWxsb3dlZCBncmFw aCkKKzs7ICAgICAgICAgICAgfCAgICAgICAgViAgICAgICAgfCAgICAgICAgICAgKCBzaWJsaW5n IGJyYW5jaGVzIGNvbm5lY3RlZCkKKzs7ICAgICAgICAgICAgKy0tLWQtLT4gNSAtLWUtLT4gNgor OzsKKzs7IEFsdGhvdWdodCB3ZSBjb3VsZCBidWlsZCBhIChjb21wbGljYXRlZCkgcmVnZXhwIGZy b20gaXQgKG5hbWVseQorOzsgImFcXChiXFwoY1xcfGdlXFwpXFx8ZGVcXClmIiB3ZSBjb3VsZCBh Y2NvbXBsaXNoIGl0IHdpdGggYSBncmFwaAorOzsgd2l0aG91dCBjb25uZWN0aW9ucyBiZXR3ZWVu IHNpYmxpbmcgYnJhbmNoZXMgKGRldGFjaGluZyA2IGZyb20gNSkKKzs7Cis7OyAgICAgICAgICAg ICAgICAgICAgICstLS0tLS0tLWMtLS0tLS0tLSsKKzs7ICAgICAgICAgICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICAgdgorOzsgID4xIC0tYS0tPiAyIC0tYi0tPiAzIC0tZy0tPiA1IC0tZS0t PiA0IC0tZi0tPiBGCis7OyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIF4K Kzs7ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorOzsgICAgICAgICAg ICArLS0tLS1kLS0tLT4gNiAtLS0tLS1lLS0tLS0rCis7OworOzsgS2VlcGluZyB0aGlzIGluIG1p bmQsIGl0IGlzIG9ubHkgYWxsb3dlZCBtZXJnZSBub2RlcyB0aGF0IGhhdmUgdGhlCis7OyBzYW1l IGBzb3VyY2UnIGFuZCBgc2luaycgbm9kZXMsIHRoYXQgaXMsIGFyZSBpbiBzaWJsaW5nIGJyYW5j aGVzLgorOzsgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIG5vZGVzIDYsIDMgYW5kIDQgYXJlIGluIHNp YmxpbmcgYnJhbmNoZXMKKzs7IChzb3VyY2U9Miwgc2luaz00KSwgYnV0IG5vdCA1IChpdHMgc291 cmNlIGlzIDMpLiAgSWYgd2UgbWVyZ2UgNSBhbmQKKzs7IDYgd2UgcmV0dXJuIHRvIHRoZSBwcmV2 aW91cyBub3QgYWxsb3dlZCBncmFwaC4KKzs7Cis7OyAqKiogU2ltcGxpZmljYXRpb24gMTogbWVy Z2UgYGVxdWFsJyBub2RlcyAqKioKKzs7Cis7OyBTdGFydCBmcm9tIHN0cmluZ3MgKCJhYmQiICJh Y2QiKSwgd2UgZ2V0IHRoZSBGQToKKzs7Cis7OyAgPjEgLS1hLS0+IDIgLS1iLS0+IDMgLS1kLS0+ IDQgLS1lcHNpbG9uLS0+IG5pbAorOzsgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXgorOzsgICAgICAgICAgICArLS0tYy0tPiA1IC0tZC0tPiA2IC0tZXBzaWxv bi0tLS0vCis7OworOzsgTG9vayBhdCBub2RlcyAzIGFuZCA1IGluIHNpYmxpbmcgYnJhbmNoZXM6 IGJvdGggdHJlZXMgc3RhcnRpbmcgZnJvbQorOzsgMyBhbmQgNSAoZCAtPiBlcHNpbG9uIC0+KSwg d2hpY2ggYXJlIGludGVybmFsbHkgc3RvcmVkIGFzICg/ZCAoMCkpLAorOzsgYXJlIGBlcXVhbCcg YnV0IG5vdCBgZXEnOyBzbyB3ZSAibWVyZ2UiIG5vZGVzIDMgYW5kIDUsIG1ha2luZyBhcnJvdwor OzsgImMiIGZyb20gMiBwb2ludCBub2RlIDMgaW5zdGVhZCBvZiA1LCBzbyB0aGVzZSB0cmVlcyBh cmUgYGVxJyBub3c6Cis7OworOzsgID4xIC0tYS0tPiAyIC0tYi0tPiAzIC0tZC0tPiA0IC0tZXBz aWxvbi0tPiBuaWwKKzs7ICAgICAgICAgICAgfCAgICAgICAgXgorOzsgICAgICAgICAgICArLS0t Yy0tLS8KKzs7Cis7OyBJbnRlcm5hbGx5OiAoKD9hICg/YiAjMSkKKzs7ICAgICAgICAgICAgICAg ICAgKD9jICMxKSkpICAgIHdoZXJlICAgIzE9KD9kICgwKSkKKzs7Cis7OyBObyBvdGhlciBub2Rl cyBhcmUgYGVxdWFsJy4gV2UgZmluaXNoZWQuCis7OyBUaGlzIEZBIHRyYW5zbGF0ZXMgdG8gcmVn ZXhwICJhW2JjXWQiLgorOzsKKzs7ICoqKiBTaW1wbGlmaWNhdGlvbiAyOiBub2RlIGVxdWFsIHRv IHN1YnNldCBvZiBpdHMgc291cmNlCis7OworOzsgVGhpcyBzaW1wbGlmaWNhdGlvbiBwcm9kdWNl cyBgPycgY29uc3RydWN0aW9ucy4gIFN0YXJ0IGZyb20gc3RyaW5ncworOzsgKCJhYmNmIiAiYWRl ZiIgImFmIikKKzs7Cis7OyAgICAgICAgICAgICstLS1mLS0+IDkgLS0tLS0tLS0tLWVwc2lsb24g LS0tLS0tLS0tLS0tLVwKKzs7ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHYKKzs7ICA+MSAtLWEtLT4gMiAtLWItLT4gMyAtLWMtLT4gNCAtLWYt LT4gNSAtLWVwc2lsb24tLT4gbmlsCis7OyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBeCis7OyAgICAgICAgICAgICstLS1kLS0+IDYgLS1lLS0+ IDcgLS1mLS0+IDggLS1lcHNpbG9uLS0tLS8KKzs7Cis7OyBBZnRlciBzaW1wbGlmaWNhdGlvbiAx IChtZXJnZSA0IGFuZCA3KToKKzs7Cis7OyAgICAgICAgICAgICstLS1mLS0+IDkgLS0tLS0tLS0t LWVwc2lsb24gLS0tLS0tLS0tLS0tLVwKKzs7ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHYKKzs7ICA+MSAtLWEtLT4gMiAtLWItLT4gMyAtLWMt LT4gNCAtLWYtLT4gNSAtLWVwc2lsb24tLT4gbmlsCis7OyAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgIF4KKzs7ICAgICAgICAgICAgKy0tLWQtLT4gNiAtLWUtLS0vCis7OworOzsgKFRoaXMg aXMgdGhlIHJlZ2V4cCAiYVxcKFxcKGJjXFx8ZGVcXClmXFx8ZlxcKSIgKQorOzsKKzs7IE5vdywg bm90aWNlIHRoYXQgbm9kZSA0ID0ge2YgLT4gZXBzaWxvbiAtPn0sIGludGVybmFsbHkgKCg/ZiAo MCkpKSwKKzs7IGlzIGBlcXVhbCcgdG8gYSBzdWJzZXQgb2YgYXJyb3dzIG9mIDIsIGl0cyBzb3Vy Y2UuICBXZSBjb3VsZCBzcGxpdAorOzsgbm9kZSAyIHdpdGggYW4gZXBzaWxvbiBhcnJvdyBpbiB0 d28gbm9kZXMKKzs7Cis7OyAgKy0tZi0tPiA5IC0tZXBzaWxvbi0tPiBuaWwgICAgIGVwc2lsb24t LT4gMTAgLS1mLS0+IDkgLS1lcHNpbG9uLS0+IG5pbAorOzsgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8Cis7OyAgMiAtLWItLT4gLi4uICAgaXMgZXF1aXZhbGVudCB0byAgIDIg LS1iLS0+IC4uLgorOzsgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis7OyAg Ky0tLWQtLT4gLi4uICAgICAgICAgICAgICAgICAgICAgICstLS1kLS0+IC4uLgorOzsKKzs7IFRo aXMgbmV3IG5vZGUgMTAgYWxzbyBoYXMgc291cmNlIDIsIGxpa2UgNCwgYW5kIGlzIGBlcXVhbCcg dG8gNCwgc28KKzs7IHdlIG1lcmdlIDEwIGFuZCA0IGJ5IHNpbXBsaWZpY2F0aW9uIDEgKG5vZGUg MTAgZGlzYXBwZWFycyBhZ2FpbiEpOgorOzsKKzs7ICAgICAgICAgICAgKy0tLWVwc2lsb24tLS0t LS0tKworOzsgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB2Cis7OyAgPjEgLS1hLS0+IDIg LS1iLS0+IDMgLS1jLS0+IDQgLS1mLS0+IDUgLS1lcHNpbG9uLS0+IG5pbAorOzsgICAgICAgICAg ICB8ICAgICAgICAgICAgICAgICBeCis7OyAgICAgICAgICAgICstLS1kLS0+IDYgLS1lLS0+IDcK Kzs7Cis7OyBUaGlzIEZBIHlpZWxkcyB0aGUgc2ltcGxlciByZWdleHAgImFcXChiY1xcfGRlXFwp P2YiCis7OworOzsgU3VtbWFyaXppbmcsIGlmIGEgbm9kZSBOIGlzIHNpbWlsYXIgdG8gYSBzdWJ0 cmVlIG9zIGl0cyBzb3VyY2UgUywKKzs7IHdlIGRlbGV0ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJv d3MgZnJvbSBTIGFuZCBhZGQgYW4gZXBzaWxvbiBhcnJvdworOzsgZnJvbSBTIHRvIE4uCis7Owor OzsgU2libGluZyBicmFuY2hlcworOzsgPT09PT09PT09PT09PT09PQorOzsKKzs7IFNpYmxpbmcg YnJhbmNoZXMgYXJlIHRob3NlIHRoYXQgc3RhcnQgaW4gdGhlIHNhbWUgbm9kZSAoc291cmNlCis7 OyBub2RlKSBhbmQgZW5kIGluIHRoZSBzYW1lIG5vZGUgKHNpbmsgbm9kZSkuICBUaGlzIGNvbmNl cHQgaXMKKzs7IHJlbGF0ZWQgdG8gYnVpbGQgYWx0ZXJuYXRpdmUgZ3JvdXBzLgorOzsKKzs7IFRo ZSBzb3VyY2Ugbm9kZSBvZiBhIG5vZGUgUyBpcyB0aGUgb25lIG1vc3QgbmVzdGVkIHdoZXJlIG9u ZSBidXQKKzs7IG5vdCBhbGwgcGF0aHMgZnJvbSBpdCBsZWFkIHRvIE4uICBUaGUgc2luayBpcyBh bmFsb2dvdXMgd2l0aCBhcnJvd3MKKzs7IGluIG9wb3NpdGUgZGlyZWN0aW9ucy4gIFNvdXJjZSBh bmQgc2luayBub2RlcyBtYXJrIGJlZ2lubmluZyBhbmQKKzs7IGVuZCBvZiBhbiBhbHRlcm5hdGl2 ZSBncm91cCBvZiB0aGUgY29ycmVzcG9uZGluZyByZWdleHAuICBGb3IKKzs7IGV4YW1wbGUsIGlu IHRoZSBGQSBiZWxvdworOzsKKzs7ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tYy0tLS0t LS0tKworOzsgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB2Cis7OyAgPjEg LS1hLS0+IDIgLS1iLS0+IDMgLS1nLS0+IDUgLS1lLS0+IDQgLS1mLS0+IDcgLS1lcHNpbG9uLS0+ IG5pbAorOzsgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBeCis7OyAgICAg ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzs7ICAgICAgICAgICAgKy0tLS0t ZC0tLS0+IDYgLS0tLS0tZS0tLS0tKworOzsKKzs7IGZvciByZWdleHAgImFcXChiXFwoY1xcfGdl XFwpXFx8ZGVcXClmIiwgdGhlcmUgYXJlIDIgc2V0cyBvZiAobm9uCis7OyB0cml2aWFsKSBzaWJs aW5nIGJyYW5jaGVzOiB7MiAtPiA0fSBhbmQgezMgLT4gNH0sIHRoaXMgbGFzdCBuZXN0ZWQKKzs7 IGluIHRoZSBwcmV2aW91cy4gIEhlcmUsIG5vZGVzIDMgYW5kIDYgYXJlIGluIHNpYmxpbmcgYnJh bmNoZXMgb2YKKzs7IHsyIC0+IDR9LiAgNSBkb2VzIG5vdCBiZWxvbmcgdG8gezIgLT4gNH0gYmVj YXVzZSBpdHMgc291cmNlIGlzIDMsCis7OyBub3QgMi4gIE5vZGVzIDIgYW5kIDQgYmVsb25nIHRv IHRoZSB0cml2aWFsIHJvb3QgYnJhbmNoIHsxIC0+IG5pbH0uCis7OworOzsgVGhlIGluaXRpYWwg Y29udmVyc2lvbiBmcm9tIHN0cmluZyB0byBub2RlcyBvbmx5IGNyZWF0ZXMgc291cmNlcworOzsg KG5pbCBpcyB0aGUgb25seSBzaW5rKS4gIFRoZSBzaW1wbGlmaWNhdGlvbnMgZXhwbGFpbmVkIG9u bHkgY3JlYXRlCis7OyBzaW5rcywgbmV2ZXIgc291cmNlcy4KKworOzsgSXQgbWF5IGhhcHBlbiB0 aGF0IGEgc291cmNlIGhhcyBzZXZlcmFsIHNpbmtzLCBzbyB3ZSBuZWVkCis7OyB0byBjb21wdXRl IGFsbCBwb3NzaWJsZSBpbnRlcnNlY3Rpb25zIHRvIGNvbXB1dGUgYWxsIHNpbmtzLgorCis7OyBF eGFtcGxlIG9mIHNpbmsgZGV0ZWN0aW9uOgorOzsgICAgICAgKy0tLWEtLS0+IDIgLS14LS0tXAor OzsgICAgICAgfCAgICAgICAgICAgICAgICAgIHYKKzs7ICAgICAgIHwgIC0tYi0tPiAzIC0teS0t PiA0IC0tLVwKKzs7ICAgICAgIHwgLyAgICAgICAgICAgICAgICAgICAgICB2Cis7OyAgICAgID4x IC0tLS0tLWMtLS0tLT4gNSAtLWUtLT4gNyAtLWVwc2lsb24tLT4gbmlsCis7OyAgICAgICAgXCAg ICAgICAgICAgICBeCis7OyAgICAgICAgIFwtZC0tPiA2IC1mLS8KKzs7IEZvciBzb3VyY2UgMToK Kzs7ICAgcGF0aCBmb3IgYSA9ICgyIDQgNyBuaWwpCis7OyAgIHBhdGggZm9yIGIgPSAoMyA0IDcg bmlsKQorOzsgICBwYXRoIGZvciBjID0gKDUgNyBuaWwpCis7OyAgIHBhdGggZm9yIGQgPSAoNiA1 IDcgbmlsKQorOzsgSW50ZXJzZWN0aW9ucworOzsgKCg3IG5pbCkgKDcgbmlsKSAoNyBuaWwpICg0 IDcgbmlsKSAoNyBuaWwpICg3IG5pbCkgKDcgbmlsKQorOzsgICg3IG5pbCkgKDcgbmlsKSAoNyBu aWwpICg1IDcgbmlsKSkKKzs7IFNvIHdlIGRldGVjdCB0aGUgc2lua3M6IDQsIDUsIDcKKworKGRl ZnVuIHJlZ2V4cC1vcHQtcGVyZm9ybS1zaW1wbGlmaWNhdGlvbiAoZmEpCisgICJQZXJmb3JtIHNp bXBsaWZpY2F0aW9ucyB0byBGQSwgYnkgc2lkZSBlZmZlY3RzLiIKKyAgOzsgV2UgbmVlZCB0byBz dWJzdGl0dXRlIG5vZGVzIHRoYXQgYXJlIGBlcXVhbCcgdG8gYmUgYGVxJywgc28gd2UKKyAgOzsg bmVlZCB0byBrbm93IHRoZSAicGFyZW50cyIgb2YgdGhhdCBub2RlIHRvIHNldCBjZHIncyBvZiBh cnJvd3MuCisgIDs7IFNlIHdlIG1ha2UgYSBgcGFyZW50cy1hbGlzdCcgdGhhdCBhc3NvY2lhdGVz IG5vZGVzIHdpdGggYWxsCisgIDs7IG5vZGVzIHdpdGggYW4gYXJyb3cgdG8gaXQuCisgIDs7Cisg IDs7IFNpbXBsaWZpY2F0aW9uIGhhcHBlbnMgYXQgc291cmNlIG5vZGVzIChub2RlcyB3aXRoIG1v cmUgdGhhbiAxCisgIDs7IGFycm93IGZyb20gaXQpLCBzbyB3ZSBnYXRoZXIgYSBsaXN0IG9mIHNv dXJjZXMgdG9vLiAgU291cmNlcworICA7OyB3aWxsIGJlIHNvcnRlZCBmcm9tIG1vc3QgZXh0ZXJu YWwgdG8gbW9zdCBuZXN0ZWQuCisgIChsZXQgKChzb3VyY2VzKQorCShwYXJlbnRzLWFsaXN0KQor CTs7IG5vZGVzIHRvIGJlIHByb2Nlc3NlZDogbGlzdCBvZiAobm9kZSBwYXJlbnQgZGVwdGgpCisJ KG5vZGVzIChsaXN0IChsaXN0IGZhIHQgMCkpKQorICAgICAgICBwcm9jZXNzZWQtc291cmNlcwor CW5vZGUtcGFyZW50LWRlcHRoIG5vZGUgZGVwdGggcGFyZW50CisJbmV3LW5vZGUgc291cmNlLXdp dGhvdXQtYXJyb3dzKQorICAgICh3aGlsZSBub2RlcworICAgICAgKHNldHEgbm9kZS1wYXJlbnQt ZGVwdGggKHBvcCBub2RlcykKKwkgICAgbm9kZSAoY2FyIG5vZGUtcGFyZW50LWRlcHRoKQorCSAg ICBwYXJlbnQgKGNhZHIgbm9kZS1wYXJlbnQtZGVwdGgpCisJICAgIGRlcHRoIChjYWRkciBub2Rl LXBhcmVudC1kZXB0aCkpCisgICAgICAod2hpbGUgKGFuZCBub2RlICg9IChsZW5ndGggbm9kZSkg MSkpIDsgaWYgMSBhcnJvdywgZm9sbG93IHVwCisJCQkJCTsgdG8gYSBzb3VyY2UKKwkocHVzaCBw YXJlbnQgKGFsaXN0LWdldCBub2RlIHBhcmVudHMtYWxpc3QpKQorCShzZXRxIHBhcmVudCBub2Rl CisJICAgICAgbm9kZSAoY2RhciBub2RlKSkpCisgICAgICAod2hlbiBub2RlIDsgbXVzdCBiZSBh IHNvdXJjZSwgcHVzaCBhbGwgc3Vibm9kZXMgdG8gYG5vZGVzJworCShwdXNoIChjb25zIG5vZGUg ZGVwdGgpIHNvdXJjZXMpCisJKHB1c2ggcGFyZW50IChhbGlzdC1nZXQgbm9kZSBwYXJlbnRzLWFs aXN0KSkKKwkoZG9saXN0IChhcnJvdyBub2RlKQorCSAgKHB1c2ggKGxpc3QgKGNkciBhcnJvdykg bm9kZSAoMSsgZGVwdGgpKSBub2RlcykpKSkKKyAgICA7OyBTb3J0IHNvdXJjZXMgYnkgZGVwdGgs IGZyb20gbW9zdCBuZXN0ZWQgdG8gbW9zdCBleHRlcm5hbC4KKyAgICAoc2V0cSBzb3VyY2VzICht YXBjYXIgIydjYXIgKHNvcnQgc291cmNlcworCQkJCSAgICAgIChsYW1iZGEgKHggeSkgKD4gKGNk ciB4KSAoY2RyIHkpKSkpKSkKKyAgICA7OyBzdGFydCBvZiBzaW1wbGlmaWNhdGlvbgorICAgIDs7 CisgICAgKGRvbGlzdCAoc291cmNlIHNvdXJjZXMpCisgICAgICAoc2V0cSBzaW1wbGlmaWVkIHQp CisgICAgICA7OyByZXBlYXQgc2ltcGxpZmljYXRpb24gdW50aWwgc291cmNlIGlzIGZ1bGx5IHNp bXBsaWZpZWQKKyAgICAgICh3aGlsZSBzaW1wbGlmaWVkCisJOzsgZGVidWcKKwk7OyhyZWdleHAt b3B0LXByaW50LW5vZGUgZmEgJ2dyYXBodml6ICJwbmciICIvaG9tZS9zbWUvcmUtdGVtcCIpCisJ OzsocmVhZC1mcm9tLW1pbmlidWZmZXIgIlByZXNzIEVOVEVSIHRvIGNvbnRpbnVlLiIpCisJKHNl dHEgc2ltcGxpZmllZCBuaWwpCisJOzsgSXQncyBzYWZlIHRvIHByb2Nlc3MgYWxsIGJyYW5jaGVz IGNvbXBsZXRlbHkKKwkoZG9saXN0IChicmFuY2ggKHJlZ2V4cC1vcHQtYnJhbmNoIHNvdXJjZSB0 KSkKKwkgIChzZXRxIG5vZGVzIChjZHIgYnJhbmNoKSkKKwkgICh3aGlsZSBub2RlcworCSAgICAo c2V0cSB0byAocG9wIG5vZGVzKSkKKwkgICAgOzsgU2ltcGxpZmljYXRpb24gMQorCSAgICAoZG9s aXN0IChmcm9tIG5vZGVzKQorCSAgICAgICh3aGVuIChlcXVhbCBmcm9tIHRvKQorCQkoc2V0cSBz aW1wbGlmaWVkIHQpCisJCTs7IG1ha2UgYWxsIGFycm93cyB0aGF0IHBvaW50ZWQgdG8gRlJPTSBu b3cgcG9pbnQKKwkJOzsgdG8gVE8gYW5kIHVwZGF0ZSBwYXJlbnRzLWFsaXN0IG9mIFRPCisJCShk b2xpc3QgKHBhcmVudCAoYWxpc3QtZ2V0IGZyb20gcGFyZW50cy1hbGlzdCkpCisJCSAgKGRvbGlz dCAoYXJyb3cgcGFyZW50KQorCQkgICAgKHdoZW4gKGVxIChjZHIgYXJyb3cpIGZyb20pCisJCSAg ICAgIChzZXRjZHIgYXJyb3cgdG8pKSkKKwkJICAob3IgKG1lbXEgcGFyZW50IChhbGlzdC1nZXQg dG8gcGFyZW50cy1hbGlzdCkpCisJCSAgICAgIChwdXNoIHBhcmVudCAoYWxpc3QtZ2V0IHRvIHBh cmVudHMtYWxpc3QpKSkpCisJCTs7IHZlcmlmeSBpZiBmcm9tIGlzIGxhc3Qgc2luayBvZiBzb21l IHByZXZpb3VzIHNvdXJjZQorCQk7OyBpZiBzbywgbXVzdCByZWNvbXB1dGUgYnJhbmNoIGZvciB0 aGF0IHNvdXJjZQorCQkoY2F0Y2ggJ2Zyb20tbGFzdC1zaW5rCisJCSAgKGRvbGlzdCAocHJldi1z b3VyY2UgcHJvY2Vzc2VkLXNvdXJjZXMpCisJCSAgICAod2hlbiAoZXEgZnJvbQorCQkJICAgICAg KGNhYXIgKGxhc3QgKHJlZ2V4cC1vcHQtYnJhbmNoIHByZXYtc291cmNlKSkpKQorCQkgICAgICAo cmVnZXhwLW9wdC1icmFuY2ggcHJldi1zb3VyY2UgdCkKKwkJICAgICAgKHRocm93ICdmcm9tLWxh c3Qtc2luayBuaWwpKSkpKSkKKwkgICAgOzsgZWxpbWluYXRlIGFsbCBzaW1wbGlmaWVkIG5vZGVz IGZyb20gYG5vZGVzJworCSAgICAoc2V0cSBub2RlcyAoZGVsZXRlIHRvIG5vZGVzKSkpKSkKKyAg ICAgIDs7IFNpbXBsaWZpY2F0aW9uIDIKKyAgICAgIDs7CisgICAgICA7OyBuZWVkIHRvIGNyZWF0 ZSBhIGVwc2lsb24gYXJyb3cgdG8gc3Vibm9kZTogaWYgU09VUkNFCisgICAgICA7OyBoYXMgYXJy b3cgMCwgVE8gbXVzdCBoYXZlIGFuIGFycm93IDAgc28gaXQgd2lsbCBiZQorICAgICAgOzsgcmVt b3ZlZCBmcm9tIFNPVVJDRSBpbiB0aGlzIHNpbXBsaWZpY2F0aW9uCQorICAgICAgKGNhdGNoICdz aW1wbGlmaWNhdGlvbjIKKwkoZG9saXN0IChicmFuY2ggKHJlZ2V4cC1vcHQtYnJhbmNoIHNvdXJj ZSkpCisJICAoZG9saXN0IChub2RlIChjZHIgYnJhbmNoKSkKKwkgICAgKHVubGVzcyAoYW5kIChh c3NxIDAgc291cmNlKSAobm90IChhc3NxIDAgbm9kZSkpKQorCSAgICAgIDs7IHNvcnRlZCBsaXN0 IG9mIGNoYXJzIG9mIE5PREU6CisgICAgIAkgICAgICA7OyBDSEFSUyA9IChtYXBjYXIgJ2NhciBu b2RlKQorICAgICAJICAgICAgOzsgbGlzdCBvZiBzYW1lIGFycm93cyBpbiBTT1VSQ0U6CisgICAg IAkgICAgICA7OyBORVctTk9ERSA9IChtYXBjYXIgKGxhbWJkYSAoYykgKGFzc3EgYyBzb3VyY2Up KQorCSAgICAgIDs7ICAgICAgICAgICAgICAgICAgICBDSEFSUykKKwkgICAgICAoc2V0cSBuZXct bm9kZSAobWFwY2FyIChsYW1iZGEgKGNoYXIpCisJCQkJICAgICAgIChhc3NxIGNoYXIgc291cmNl KSkKKyAgICAJCQkJICAgICAobWFwY2FyICdjYXIgbm9kZSkpKQorCSAgICAgICh3aGVuIChlcXVh bCBuZXctbm9kZSBub2RlKQorCQkoc2V0cSBzaW1wbGlmaWVkIHQpCisJCTs7IHJlbW92ZSBhcnJv d3Mgb2Ygc291cmNlIGNvbW1vbSB0byBub2RlLAorCQk7OyBrZWVwaW5nIGNvbnMgb2YgU09VUkNF LCBhZGQgYXJyb3cgKDAgLiBub2RlKQorCQkoc2V0ZiBzb3VyY2Utd2l0aG91dC1hcnJvd3MgKHJl Z2V4cC1vcHQtZGlmZmVyZW5jZQorCQkJCQkgICAgIHNvdXJjZSBuZXctbm9kZSAjJ2VxKQorCSAg ICAgIAkgICAgICAoY2FyIHNvdXJjZSkgKGNvbnMgMCBub2RlKQorCSAgICAgIAkgICAgICAoY2Ry IHNvdXJjZSkgc291cmNlLXdpdGhvdXQtYXJyb3dzKQorCQk7OyBhZGQgc291cmNlIGFzIHBhcnJl bnQgb2Ygbm9kZQorCQkocHVzaCBzb3VyY2UgKGFsaXN0LWdldCBub2RlIHBhcmVudHMtYWxpc3Qp KQorCQk7OyByZWNvbXB1dGUgYnJhbmNoIGJlY2F1c2UgbGFzdC1zaW5rIG1heSBoYXZlIGNoYW5n ZWQKKwkJKHJlZ2V4cC1vcHQtYnJhbmNoIHNvdXJjZSB0KQorCQk7OyB3aGVuIHNpbXBsaWZpZWQs IG5vIG5lZWQgdG8gbG9vayBmb3IgYW5vdGhlciBzaW1wbGlmLgorCQkodGhyb3cgJ3NpbXBsaWZp Y2F0aW9uMiBuaWwpKSkpKSkKKyAgICAgIChwdXNoIHNvdXJjZSBwcm9jZXNzZWQtc291cmNlcykp KSkKKworOzsgKGRlZnVuIHJlZ2V4cC1vcHQtcGVyZm9ybS1zaW1wbGlmaWNhdGlvbiAoZmEpCis7 OyAgICJQZXJmb3JtIHNpbXBsaWZpY2F0aW9ucyB0byBGQSwgYnkgc2lkZSBlZmZlY3RzLiIKKzs7 ICAgOzsgV2UgbmVlZCB0byBzdWJzdGl0dXRlIG5vZGVzIHRoYXQgYXJlIGBlcXVhbCcgdG8gYmUg YGVxJywgc28gd2UKKzs7ICAgOzsgbmVlZCB0byBrbm93IHRoZSAicGFyZW50cyIgb2YgdGhhdCBu b2RlIHRvIHNldCBjZHIncyBvZiBhcnJvd3MuCis7OyAgIDs7IFNlIHdlIG1ha2UgYSBgcGFyZW50 cy1hbGlzdCcgdGhhdCBhc3NvY2lhdGVzIG5vZGVzIHdpdGggYWxsCis7OyAgIDs7IG5vZGVzIHdp dGggYW4gYXJyb3cgdG8gaXQuCis7OyAgIDs7Cis7OyAgIDs7IFNpbXBsaWZpY2F0aW9uIGhhcHBl bnMgYXQgc291cmNlIG5vZGVzIChub2RlcyB3aXRoIG1vcmUgdGhhbiAxCis7OyAgIDs7IGFycm93 IGZyb20gaXQpLCBzbyB3ZSBnYXRoZXIgYSBsaXN0IG9mIHNvdXJjZXMgdG9vLiAgU291cmNlcwor OzsgICA7OyB3aWxsIGJlIHNvcnRlZCBmcm9tIG1vc3QgZXh0ZXJuYWwgdG8gbW9zdCBuZXN0ZWQu Cis7OyAgIChsZXQgKChzb3VyY2VzKQorOzsgCShwYXJlbnRzLWFsaXN0KQorOzsgCTs7IG5vZGVz IHRvIGJlIHByb2Nlc3NlZDogbGlzdCBvZiAobm9kZSBwYXJlbnQgZGVwdGgpCis7OyAJKG5vZGVz IChsaXN0IChsaXN0IGZhIHQgMCkpKQorOzsgCW5vZGUtcGFyZW50LWRlcHRoIG5vZGUgZGVwdGgg cGFyZW50KQorOzsgICAgICh3aGlsZSBub2RlcworOzsgICAgICAgKHNldHEgbm9kZS1wYXJlbnQt ZGVwdGggKHBvcCBub2RlcykKKzs7IAkgICAgbm9kZSAoY2FyIG5vZGUtcGFyZW50LWRlcHRoKQor OzsgCSAgICBwYXJlbnQgKGNhZHIgbm9kZS1wYXJlbnQtZGVwdGgpCis7OyAJICAgIGRlcHRoIChj YWRkciBub2RlLXBhcmVudC1kZXB0aCkpCis7OyAgICAgICAod2hpbGUgKGFuZCBub2RlICg9IChs ZW5ndGggbm9kZSkgMSkpIDsgaWYgMSBhcnJvdywgZm9sbG93IHVwCis7OyAJCQkJCTsgdG8gYSBz b3VyY2UKKzs7IAkocHVzaCBwYXJlbnQgKGFsaXN0LWdldCBub2RlIHBhcmVudHMtYWxpc3QpKQor OzsgCShzZXRxIHBhcmVudCBub2RlCis7OyAJICAgICAgbm9kZSAoY2RhciBub2RlKSkpCis7OyAg ICAgICAod2hlbiBub2RlIDsgbXVzdCBiZSBhIHNvdXJjZSwgcHVzaCBhbGwgc3Vibm9kZXMgdG8g YG5vZGVzJworOzsgCShwdXNoIChjb25zIG5vZGUgZGVwdGgpIHNvdXJjZXMpCis7OyAJKHB1c2gg cGFyZW50IChhbGlzdC1nZXQgbm9kZSBwYXJlbnRzLWFsaXN0KSkKKzs7IAkoZG9saXN0IChhcnJv dyBub2RlKQorOzsgCSAgKHB1c2ggKGxpc3QgKGNkciBhcnJvdykgbm9kZSAoMSsgZGVwdGgpKSBu b2RlcykpKSkKKzs7ICAgICA7OyBTb3J0IHNvdXJjZXMgYnkgZGVwdGgsIGZyb20gbW9zdCBuZXN0 ZWQgdG8gbW9zdCBleHRlcm5hbC4KKzs7ICAgICAoc2V0cSBzb3VyY2VzIChtYXBjYXIgIydjYXIg KHNvcnQgc291cmNlcworOzsgCQkJCSAgICAgIChsYW1iZGEgKHggeSkgKD4gKGNkciB4KSAoY2Ry IHkpKSkpKSkKKzs7ICAgICA7OyBzdGFydCBvZiBzaW1wbGlmaWNhdGlvbgorOzsgICAgIChsZXQq ICgoc2ltcGxpZnkgdCkKKzs7IAkgICBuZXctbm9kZSBzb3VyY2Utd2l0aG91dC1hcnJvd3MpCis7 OyAgICAgICA7OyByZWRvIHNpbXBsaWZpY2F0aW9ucyB1bnRpbCBubyBzaW1wbGlmaWNhdGlvbiBp cyBtYWRlCis7OyAgICAgICAod2hpbGUgc2ltcGxpZnkKKzs7IAkoc2V0cSBzaW1wbGlmeSBuaWwK Kzs7IAkgICAgICA7OyBmb3JjZSBicmFuY2ggcmVjb21wdXRhdGlvbgorOzsgCSAgICAgIHJlZ2V4 cC1vcHQtYnJhbmNoZXMtYWxpc3QgbmlsKQorOzsgCShkb2xpc3QgKHNvdXJjZSBzb3VyY2VzKQor OzsgCSAgKHNldHEgc291cmNlLXNpbXBsaWZpZWQgbmlsKQorOzsgCSAgOzsgSXQncyBzYWZlIHRv IHByb2Nlc3MgYWxsIGJyYW5jaGVzIGNvbXBsZXRlbHkKKzs7IAkgIChkb2xpc3QgKGJyYW5jaCAo cmVnZXhwLW9wdC1icmFuY2ggc291cmNlKSkKKzs7IAkgICAgKHNldHEgc2luayAoY2FyIGJyYW5j aCkKKzs7IAkJICBub2RlcyAoY2RyIGJyYW5jaCkpCis7OyAJICAgICh3aGlsZSBub2RlcworOzsg CSAgICAgIChzZXRxIHRvIChwb3Agbm9kZXMpKQorOzsgCSAgICAgIDs7IFNpbXBsaWZpY2F0aW9u IDEKKzs7IAkgICAgICAoZG9saXN0IChmcm9tIG5vZGVzKQorOzsgCQkod2hlbiAoZXF1YWwgZnJv bSB0bykKKzs7IAkJICAoc2V0cSBzaW1wbGlmeSB0KQorOzsgCQkgIDs7IG1ha2UgYWxsIGFycm93 cyB0aGF0IHBvaW50ZWQgdG8gRlJPTSBub3cgcG9pbnQKKzs7IAkJICA7OyB0byBUTyBhbmQgdXBk YXRlIHBhcmVudHMtYWxpc3Qgb2YgVE8KKzs7IAkJICAoZG9saXN0IChwYXJlbnQgKGFsaXN0LWdl dCBmcm9tIHBhcmVudHMtYWxpc3QpKQorOzsgCQkgICAgKGRvbGlzdCAoYXJyb3cgcGFyZW50KQor OzsgCQkgICAgICAod2hlbiAoZXEgKGNkciBhcnJvdykgZnJvbSkKKzs7IAkJCShzZXRjZHIgYXJy b3cgdG8pKSkKKzs7IAkJICAgIChvciAobWVtcSBwYXJlbnQgKGFsaXN0LWdldCB0byBwYXJlbnRz LWFsaXN0KSkKKzs7IAkJCShwdXNoIHBhcmVudCAoYWxpc3QtZ2V0IHRvIHBhcmVudHMtYWxpc3Qp KSkpCis7OyAJCSAgOzsgdmFuaXNoIEZST00gYW5kIG5lc3RlZCBzb3VyY2VzIGZyb20gU09VUkNF UworOzsgCQkgICh3aGVuICg+IChsZW5ndGggZnJvbSkgMSkKKzs7IAkJICAgIChzZXRxIHNvdXJj ZXMgKHJlZ2V4cC1vcHQtcmVtb3ZlLXNvdXJjZSBmcm9tIHNvdXJjZXMpKSkpKQorOzsgCSAgICAg IDs7IGVsaW1pbmF0ZSBhbGwgc2ltcGxpZmllZCBub2RlcyBmcm9tIGBub2RlcycKKzs7IAkgICAg ICAoc2V0cSBub2RlcyAoZGVsZXRlIHRvIG5vZGVzKSkKKzs7IAkgICAgICA7OyBTaW1wbGlmaWNh dGlvbiAyCis7OyAJICAgICAgOzsKKzs7IAkgICAgICA7OyBuZWVkIHRvIGNyZWF0ZSBhIGVwc2ls b24gYXJyb3cgdG8gc3Vibm9kZTogaWYgU09VUkNFCis7OyAJICAgICAgOzsgaGFzIGFycm93IDAs IFRPIG11c3QgaGF2ZSBhbiBhcnJvdyAwIHNvIGl0IHdpbGwgYmUKKzs7IAkgICAgICA7OyByZW1v dmVkIGZyb20gU09VUkNFIGluIHRoaXMgc2ltcGxpZmljYXRpb24KKzs7IAkgICAgICAodW5sZXNz IChhbmQgKGFzc3EgMCBzb3VyY2UpIChub3QgKGFzc3EgMCB0bykpKQorOzsgCQk7OyBzb3J0ZWQg bGlzdCBvZiBjaGFycyBvZiBUTzoKKzs7ICAgICAgCQk7OyBDSEFSUyA9IChtYXBjYXIgJ2NhciB0 bykKKzs7ICAgICAgCQk7OyBsaXN0IG9mIHNhbWUgYXJyb3dzIGluIFNPVVJDRToKKzs7ICAgICAg CQk7OyBORVctTk9ERSA9IChtYXBjYXIgKGxhbWJkYSAoYykgKGFzc3EgYyBzb3VyY2UpKQorOzsg CQk7OyAgICAgICAgICAgICAgICAgICAgQ0hBUlMpCis7OyAJCShzZXRxIG5ldy1ub2RlIChtYXBj YXIgKGxhbWJkYSAoY2hhcikKKzs7IAkJCQkJIChhc3NxIGNoYXIgc291cmNlKSkKKzs7ICAgICAJ CQkJICAgICAgIChtYXBjYXIgJ2NhciB0bykpKQorOzsgCQkod2hlbiAoZXF1YWwgbmV3LW5vZGUg dG8pCis7OyAJCSAgKHNldHEgc2ltcGxpZnkgdCkKKzs7IAkJICA7OyByZW1vdmUgYXJyb3dzIG9m IHNvdXJjZSBjb21tb20gdG8gbm9kZSwKKzs7IAkJICA7OyBrZWVwaW5nIGNvbnMgb2YgU09VUkNF LCBhZGQgYXJyb3cgKDAgLiB0bykKKzs7IAkJICAoc2V0ZiBzb3VyY2Utd2l0aG91dC1hcnJvd3Mg KHJlZ2V4cC1vcHQtZGlmZmVyZW5jZQorOzsgCQkJCQkgICAgICAgc291cmNlIG5ldy1ub2RlICMn ZXEpCis7OyAJICAgICAgCQkoY2FyIHNvdXJjZSkgKGNvbnMgMCB0bykKKzs7IAkgICAgICAJCShj ZHIgc291cmNlKSBzb3VyY2Utd2l0aG91dC1hcnJvd3MpCis7OyAJCSAgOzsgYWRkIHNvdXJjZSBh cyBwYXJyZW50IG9mIG5vZGUKKzs7IAkJICAocHVzaCBzb3VyY2UgKGFsaXN0LWdldCB0byBwYXJl bnRzLWFsaXN0KSkpKSkpKSkpKSkKKworKGRlZnVuIHJlZ2V4cC1vcHQtYWRkLXN0cmluZy10by1u b2RlIChzIG5vZGUgJm9wdGlvbmFsIHBvc2l0aW9uKQorICAiQWRkIHN0cmluZyBTIHRvIE5PREUg YW5kIHJldHVybiBOT0RFLgorUE9TSVRJT04gaXMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIFMgY29u c2lkZXJlZCwgMCBpZiBQT1NJVElPTiBpcworbmlsLiAgQXJyb3dzIGFyZSBpbnNlcnRlZCBzb3J0 ZWQgYnkgc29ydGVkIGJ5IGNoYXIuIgorICAobGV0KiAoKGxlbiAobGVuZ3RoIHMpKQorCSAocG9z IChpZiBwb3NpdGlvbiBwb3NpdGlvbiAwKSkKKwkgKGNoYXIgKGlmICg+IGxlbiBwb3MpIChhcmVm IHMgcG9zKSAwKSkgOyBlcHNpbG9uIGFycm93IGlmIHBvcz1sZW4KKwkgKGFycm93IChhc3NxIGNo YXIgbm9kZSkpCisJIChjaGlsZC1ub2RlICh3aGVuICg+IGxlbiBwb3MpCisJCSAgICAgICAocmVn ZXhwLW9wdC1hZGQtc3RyaW5nLXRvLW5vZGUgcyAoY2RyIGFycm93KQorCQkJCQkJICAgICAgICgx KyBwb3MpKSkpKQorICAgIChjb25kICgoYW5kIG5vZGUgYXJyb3cpIChzZXRjZHIgYXJyb3cgY2hp bGQtbm9kZSkgbm9kZSkKKwkgIChub2RlIChzb3J0IChjb25zIChjb25zIGNoYXIgY2hpbGQtbm9k ZSkgbm9kZSkKKwkJICAgICAgKGxhbWJkYSAoeCB5KSAoPCAoY2FyIHgpIChjYXIgeSkpKSkpCisJ ICAodCAobGlzdCAoY29ucyBjaGFyIGNoaWxkLW5vZGUpKSkpKSkKKworKGRlZnZhciByZWdleHAt b3B0LWJyYW5jaGVzLWFsaXN0IG5pbAorICAiVmFyaWFibGUgaG9sZGluZyBicmFuY2ggY29tcHV0 YXRpb24gb3Igb3RoZXIuCitCZWZvcmUgc2ltcGxpZmljYXRpb24sIGhvbGRzIHNvdXJjZSBpbmZv cm1hdGlvbi4KK0R1cmluZyBzaW1wbGlmaWNhdGlvbiwgaG9sZHMgaW5mbyB0aGF0IGNhbiBiZSBy ZXVzZWQgdW50aWwgYQorc2ltcGxpZmljYXRpb24gY2hhbmdlcyBzY2VuYXJpby4iKQorCisoZGVm dW4gcmVnZXhwLW9wdC1icmFuY2ggKHNvdXJjZSAmb3B0aW9uYWwgcmVjb21wdXRlKQorICAiUmV0 dXJuIGEgbGlzdCBvZiBicmFuY2hlcyBhc3NvY2lhdGVkIHdpdGggU09VUkNFLgorVGhlIHJldHVy biB2YWx1ZSBpcyBhIGxpc3Qgb2YgKFNJTksgLiBOT0RFUykuICBTSU5LIGlzIGEgbm9kZQordGhh dCBmaW5pc2hlcyBhIGJpZnVyY2F0aW9uIHN0YXJ0ZWQgaW4gU09VUkNFLiAgQSBTT1VSQ0UgbWF5 IGhhdmUKK3NldmVyYWwgc2lua3MuICBCb3RoIFNPVVJDRSBhbmQgU0lOSyBkbyBub3QgYmVsb25n IHRvIE5PREVTLiAgVGhlCitvcmRlciBvZiBzaW5rcyBpbiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMg ZnJvbSB0aGUgbW9zdCBuZXN0ZWQgdG8KK3RoZSBtb3N0IGV4dGVybmFsLgorCitJZiBSRUNPTVBV VEUgaXMgbm9ubmlsLCByZWNvbXB1dGVzIGJyYW5jaCBmb3IgU09VUkNFLiAgSWYKK1JFQ09NUFVU RSBpcyB0aGUgc3ltYm9sIGByZWN1cnNpdmUnLCByZWNvbXB1dGUgcmVjdXJzaXZlbHkgYWxsCitu ZXN0ZWQgc291cmNlcyBlbmNvdW50ZXJlZC4iCisgICh1bmxlc3MgKD4gKGxlbmd0aCBzb3VyY2Up IDEpCisgICAgKGVycm9yICJTaG91bGQgYmUgYSBsaXN0IHdpdGggYXQgbGVhc3QgMiBlbGVtZW50 czogJXMiIHNvdXJjZSkpCisgIChsZXQqICgoYnJhbmNoLWluZm8gKGFsaXN0LWdldCBzb3VyY2Ug cmVnZXhwLW9wdC1icmFuY2hlcy1hbGlzdCkpCisJIChyZWN1ciAod2hlbiAoZXEgcmVjb21wdXRl ICdyZWN1cnNpdmUpICdyZWN1cnNpdmUpKQorCSAobGFzdC1zaW5rIChjYWFyIChsYXN0IGJyYW5j aC1pbmZvKSkpKSA7IHJldXNlIGxhc3Qtc2luayBmcm9tCisJCQkJCTsgcHJldmlvdXMgY29tcHV0 YXRpb24KKwkJCQkJOyB0byBsaW1pdCBwYXRoIGZvbGxvd2luZworICAgICh3aGVuIChvciByZWNv bXB1dGUKKwkgICAgICAobm90IGJyYW5jaC1pbmZvKSkKKyAgICAgIDs7CisgICAgICA7OyBjb21w dXRlIGJyYW5jaC1pbmZvIGFuZXcKKyAgICAgIDs7CisgICAgICAobGV0IChwYXRoIHBhdGhzCisJ ICAgIG5vZGUgbm9kZXMKKwkgICAgc2luayBzaW5rcworCSAgICBpbnRlcnNlY3Rpb25zKQorCShk b2xpc3QgKGFycm93IHNvdXJjZSkgOyBsb29waW5nIGluIGFsbCBhcnJvd3Mgb2YgZWFjaCBzb3Vy Y2UKKwkgIChzZXRxIG5vZGUgKGNkciBhcnJvdykKKwkJcGF0aCAobGlzdCBub2RlKSkKKwkgICh3 aGlsZSAoYW5kIG5vZGUgKG5vdCAoZXEgbm9kZSBsYXN0LXNpbmspKSkKKwkgICAgKHNldHEgbm9k ZSAoaWYgKD0gKGxlbmd0aCBub2RlKSAxKQorCQkJICAgKGNkYXIgbm9kZSkgOyAxIGFycm93LCBm b2xsb3cgYXJyb3cKKwkJCSA7OyBhIHNvdXJjZTsgaXRzIG1vc3QgZXh0ZXJuYWwgc2luayBpcyB0 aGUgY2FyCisJCQkgOzsgb2YgbGFzdCBicmFuY2gtaW5mbworCQkJIChjYWFyIChsYXN0IChyZWdl eHAtb3B0LWJyYW5jaCBub2RlIHJlY3VyKSkpKSkKKwkgICAgKHB1c2ggbm9kZSBwYXRoKSkKKwkg IDs7IHNhdmUgb24gcGF0aHMgbGlzdAorCSAgKHB1c2ggKG5yZXZlcnNlIHBhdGgpIHBhdGhzKSkK Kwk7OyBDb21wdXRlIGludGVyc2VjdGlvbnMgb2YgYWxsIHBhdGhzIHRvIGNvbXB1dGUgc2lua3Mu CisJOzsKKwk7OyBUbyBkZXRlY3QgdGhlIG5lc3RpbmcsIHdlIHNvcnQgYnkgaW50ZXJzZWN0aW9u IGxlbmd0aDogdGhlCisJOzsgbW9zdCBleHRlcm5hbCwgc2hvcnRlciBpcyB0aGUgaW50ZXJzZWN0 aW9uLgorCShzZXRxIGludGVyc2VjdGlvbnMgKHNvcnQgKHJlZ2V4cC1vcHQtYWxsLWludGVyc2Vj dGlvbnMgdCBwYXRocykKKwkJCQkgIChsYW1iZGEgKHggeSkgKD4gKGxlbmd0aCB4KSAobGVuZ3Ro IHkpKSkpCisJICAgICAgc2lua3MgKHJlZ2V4cC1vcHQtdW5pcSAobWFwY2FyICdjYXIgaW50ZXJz ZWN0aW9ucykpCisJICAgICAgOzsgbWFrZSBicmFuY2gtaW5mbyBhbiBhbGlzdCBpbiBzYW1lIG9y ZGVyIHRoYXQgc2lua3MKKwkgICAgICBicmFuY2gtaW5mbyAobWFwY2FyICMnbGlzdCBzaW5rcykp CisJOzsgTm93IHNlbGVjdCB3aGljaCBub2RlcyBhcmUgaW4gY29ycmVzcG9uZGluZyBicmFuY2hl cworCShkb2xpc3QgKHBhdGggcGF0aHMpCisJICAoc2V0cSBub2RlcyBuaWwpCisJICAod2hpbGUg cGF0aAorCSAgICAod2hpbGUgKGFuZCBwYXRoIChub3QgKG1lbXEgKGNhciBwYXRoKSBzaW5rcykp KQorCSAgICAgIChwdXNoIChwb3AgcGF0aCkgbm9kZXMpKQorCSAgICAod2hlbiBwYXRoIDsgbWVh bnMgKGNhciBwYXRoKSBpcyBpbiBgc2lua3MnCisJICAgICAgKHNldHEgc2luayAocG9wIHBhdGgp KQorCSAgICAgIDs7IGFkZCBlbGVtZW50cyBvZiBgbm9kZXMnIHRvIGFzc3Egb2YgYHNpbmsnIGlu IGBicmFuY2gtaW5mbycKKwkgICAgICAoc2V0ZiAoYWxpc3QtZ2V0IHNpbmsgYnJhbmNoLWluZm8p CisJCSAgICAoYXBwZW5kIG5vZGVzIChhbGlzdC1nZXQgc2luayBicmFuY2gtaW5mbykpKQorCSAg ICAgIDs7IHRoaXMgc2luayBpcyBhIG5vZGUgZm9yIG5leHQgc2luaywgaWYgYW55CisJICAgICAg KHNldHEgbm9kZXMgKGxpc3Qgc2luaykpKSkpCisJOzsgZWxpbWluYXRlIGR1cGxpY2F0ZWQgbm9k ZXMgaW4gYnJhbmNoZXMKKwkoZG9saXN0IChicmFuY2ggYnJhbmNoLWluZm8pCisJICAoc2V0Y2Ry IGJyYW5jaCAocmVnZXhwLW9wdC11bmlxIChjZHIgYnJhbmNoKSkpKQorCTs7IGVuZCBvZiBicmFu Y2gtaW5mbyBjb21wdXRhdGlvbgorCTs7CisJOzsgc2F2ZSBicmFuY2gtaW5mbyB0byBgcmVnZXhw LW9wdC1icmFuY2hlcy1hbGlzdCcKKwkoc2V0ZiAoYWxpc3QtZ2V0IHNvdXJjZSByZWdleHAtb3B0 LWJyYW5jaGVzLWFsaXN0KSBicmFuY2gtaW5mbykpKQorICAgIGJyYW5jaC1pbmZvKSkKKworKGRl ZnVuIHJlZ2V4cC1vcHQtdHlwZWQtcmVnZXhwIChub2RlKQorICAiUmV0dXJuIChSRUdFWFAgLiBU WVBFKSBjb3JyZXNwb25kaW5nIHRvIE5PREUuCitSRUdFWFAgaXMgYSBzdHJpbmcgYW5kIFRZUEUg aXMgb25lIG9mIHRoZSBzeW1ib2xzOgorZW1wdHkgICAgPSBlbXB0eTsKK3NpbmdsZSAgID0gc2lu Z2xlIGNoYXIgb3IgY2hhcnNldCBvciA/IGNvbnN0cnVjdGlvbjsKK2dyb3VwICAgID0gXFwoPzog Li4uIFxcKTsKK3NlcXVlbmNlID0gc2VxdWVuY2Ugb2Ygc2luZ2xlcy4KKworQSByZWdleHAgb2Yg dHlwZSBgc2luZ2xlJyBvciBgZ3JvdXAnIGNhbiBiZSBmb2xsb3dlZCBieSAqIG9yICsKK2NvbnRy dWN0aW9ucy4iCisgIChsZXQgKChyZSAiIikKKwkodHlwZSAnZW1wdHkpCisJcmUtdHlwZS1sYXN0 c2luayB0eXBlLXMpCisgICAgKHdoaWxlIG5vZGUKKyAgICAgIChpZiAoPSAobGVuZ3RoIG5vZGUp IDEpCisJICA7OyAxIGFycm93LCBmb2xsb3cgaXQKKwkgIChpZiAoPSAoY2FhciBub2RlKSAwKSA7 IGVwc2lsb24gYXJyb3csIHNraXAgbm9kZQorCSAgICAgIChzZXRxIG5vZGUgKGNkYXIgbm9kZSkp CisJICAgIChzZXRxIHJlIChjb25jYXQgcmUgKHJlZ2V4cC1xdW90ZSAoY2hhci10by1zdHJpbmcg KGNhYXIgbm9kZSkpKSkKKwkJICB0eXBlIChpZiAoZXEgdHlwZSAnZW1wdHkpICdzaW5nbGUgJ3Nl cXVlbmNlKQorCQkgIG5vZGUgKGNkYXIgbm9kZSkpKQorCTs7IGVsc2UsIGEgc291cmNlCisJKHNl dHEgcmUtdHlwZS1sYXN0c2luayAocmVnZXhwLW9wdC10eXBlZC1yZWdleHAtc291cmNlIG5vZGUp CisJICAgICAgOzsgcmUtdHlwZS1sYXN0c2luayA9IChSRSBUWVBFIExBU1QtU0lOSykgZm9yIHNv dXJjZSBOT0RFCisJICAgICAgcmUgKGNvbmNhdCByZSAoY2FyIHJlLXR5cGUtbGFzdHNpbmspKQor CSAgICAgIHR5cGUtcyAoY2FkciByZS10eXBlLWxhc3RzaW5rKQorCSAgICAgIHR5cGUgKGNvbmQg KChlcSB0eXBlICdlbXB0eSkgdHlwZS1zKQorCQkJICgoZXEgdHlwZS1zICdlbXB0eSkgdHlwZSkK KwkJCSAodCAnc2VxdWVuY2UpKQorCSAgICAgIG5vZGUgKGNhZGRyIHJlLXR5cGUtbGFzdHNpbmsp KSkpCisgICAgKGNvbnMgcmUgdHlwZSkpKQorCisoZGVmdW4gcmVnZXhwLW9wdC10eXBlZC1yZWdl eHAtc291cmNlIChzb3VyY2UpCisgICJSZXR1cm4gKFJFR0VYUCBUWVBFIExBU1QtU0lOSykgY29y cmVzcG9uZGluZyB0byBTT1VSQ0UuCitSRUdFWFAgYW5kIFRZUEUgYXJlIGFzIGluIGByZWdleHAt b3B0LXR5cGVkLXJlZ2V4cCcuIgorICA7OyBJZGVhIG9mIGltcGxlbWVudGF0aW9uOgorICA7Owor ICA7OyBBIHNvdXJjZSBjYW4gaGF2ZSBuZXN0ZWQgc291cmNlcy4gIFRoZSBtb3N0IG5lc3RlZCBz b3VyY2VzCisgIDs7IGRvIG5vdCBkZXBlbmQgb24gb3RoZXIgc291cmNlcywgc28gc3RhcnRpbmcg d2l0aCB0aGUgbW9zdAorICA7OyBuZXN0ZWQgc291cmNlcyB0byB0aGUgbW9zdCBleHRlcm5hbCwg cHJvY2VzcyBlYWNoIHNvdXJjZS4KKyAgOzsgVGhlIHJlZ2V4cCBtdXN0IGJlIHRoZSByZWdleHAg Zm9yIHRoZSBtb3N0IGV4dGVybmFsIHNvdXJjZQorICA7OyBhbmQgc2luay4KKyAgOzsKKyAgOzsg Rm9yIGVhY2ggc291cmNlLCB0aGUgbW9zdCBuZXN0ZWQgc2lua3MgZG8gbm90IGRlcGVuZCBvbgor ICA7OyBvdGhlcnMsIG9ubHkgb24gYXJyb3cgcGF0aHMuICBTbyB3ZSBwcm9jZXNzIGFsbCBhcnJv dyBwYXRocworICA7OyBmaXJzdCBhbmQgdGhlbiByZXNvbHZlIHRoZSBzaW5rcyBpbiBvcmRlciBm cm9tIHRoZSBtb3N0CisgIDs7IG5lc3RlZCB0byB0aGUgbW9zdCBleHRlcm5hbC4KKyAgKGxldCog KChicmFuY2gtaW5mbyAocmVnZXhwLW9wdC1icmFuY2ggc291cmNlKSkKKwkgOzsgc2lua3MgYXJl IGFsc28gc3RvcmVkIGluIGBicmFuY2gtaW5mbycKKwkgKHNpbmtzIChtYXBjYXIgIydjYXIgYnJh bmNoLWluZm8pKQorCSAobGFzdC1zaW5rIChjYXIgKGxhc3Qgc2lua3MpKSkKKwkgKHNpbmstY2hh cnMtYWxpc3QgbmlsKQorCSAoc2luay1yZS1hbGlzdCBuaWwpCisJIDs7IGBjaGFycy1ub2RlLWxp c3QnIGlzIGEgbGlzdCBvZiAoTElTVC1PQkpTIC4gU1VCTk9ERSkKKwkgOzsgaWYgYXQgYW4gYXJy b3csIExJU1QtT0JKUyBpcyAobGlzdCBDSEFSKQorCSA7OyBpZiBhIHNpbmssIExJU1QtT0JKUyBp cyAobGlzdCBTSU5LKSBhbmQgd2UgZ2V0IHRoZSByZWdleHAKKwkgOzsgZnJvbSBhc3NvY2lhdGlv biBvZiBTSU5LIGluIHNpbmstcmUtYWxpc3QuCisJIDs7CisJIDs7IHBvcHVsYXRlIGBjaGFycy1u b2RlLWxpc3QnIGluIG9yZGVyLCBmaXJzdCBhcnJvd3MsIHRoZW4KKwkgOzsgc2lua3MsIGZyb20g dGhlIG1vc3QgbmVzdGVkIHRvIHRoZSBtb3N0IGV4dGVybmFsIChleGNlcHQKKwkgOzsgdGhlIGxh c3QsIHRoYXQgd2UgZG9uJ3QgZm9sbG93KQorCSAoY2hhcnMtbm9kZS1saXN0IChhcHBlbmQgKG1h cGNhciAobGFtYmRhIChhcnJvdykKKwkJCQkJICAgIChjb25zIChsaXN0IChjYXIgYXJyb3cpKQor CQkJCQkJICAoY2RyIGFycm93KSkpCisJCQkJCSAgc291cmNlKQorCQkJCSAgKG1hcGNhciAobGFt YmRhIChzaW5rKQorCQkJCQkgICAgKGNvbnMgKGxpc3Qgc2luaykgc2luaykpCisJCQkJCSAgKGJ1 dGxhc3Qgc2lua3MpKSkpCisJIHJlLXR5cGUpCisgICAgOzsgRm9sbG93IHBhdGhzIHVudGlsIGEg c2luayBpcyBmb3VuZC4KKyAgICA7OyBUaGVuIHNhdmUgdGhpcyBwYXRoIHRvIHNpbmstY2hhcnMt YWxpc3QgZm9yIHRoaXMgZm9ybWVyIHNpbmsuCisgICAgKGRvbGlzdCAoY2hhcnMtbm9kZSBjaGFy cy1ub2RlLWxpc3QpCisgICAgICAobGV0KiAoKGNoYXJzIChjYXIgY2hhcnMtbm9kZSkpCisJICAg ICAobm9kZSAoY2RyIGNoYXJzLW5vZGUpKQorCSAgICAgKHNpbmtwIChub3QgKGNoYXJhY3RlcnAg KGNhciBjaGFycykpKSkKKwkgICAgIHJlLXR5cGUtbGFzdHNpbmspCisJOzsgYWxsb3cgc3RhcnQg ZnJvbSBhbiBvcmlnaW5hbCBzaW5rCisJKHdoaWxlIChvciBzaW5rcCAobm90IChtZW1xIG5vZGUg c2lua3MpKSkKKwkgIChzZXRxIHNpbmtwIG5pbCkKKwkgIDs7IGZvbGxvdyBwYXRoCisJICAoaWYg KD0gKGxlbmd0aCBub2RlKSAxKQorCSAgICAgIChzZXRxIGNoYXJzIChjb25zIChjYWFyIG5vZGUp IGNoYXJzKSAgOyBzYXZlIGNoYXIgdG8gY2hhcnMKKwkJICAgIG5vZGUgKGNkYXIgbm9kZSkpICA7 IGZvbGxvdyBhcnJvdworCSAgICA7OyBtZWFucyBpdCBpcyBhIHNvdXJjZSAtLSByZWN1cnNpb24K KwkgICAgKHNldHEgcmUtdHlwZS1sYXN0c2luaworCQkgIChyZWdleHAtb3B0LXR5cGVkLXJlZ2V4 cC1zb3VyY2Ugbm9kZSkpCisJICAgIDs7IHNhdmUgdHlwZWQtcmVnZXhwIHRvIGNoYXJzCisJICAg IChwdXNoIChjb25zIChjYXIgcmUtdHlwZS1sYXN0c2luaykKKwkJCShjYWRyIHJlLXR5cGUtbGFz dHNpbmspKQorCQkgIGNoYXJzKQorCSAgICA7OyBub2RlIDwtIGxhc3Qtc2luaworCSAgICAoc2V0 cSBub2RlIChjYWRkciByZS10eXBlLWxhc3RzaW5rKSkpKQorCTs7IG5vZGUgaXMgYSBzaW5rLCBz YXZlIGNoYXJzIHdpdGggbm9kZSBhcyBrZXkKKwkocHVzaCAobnJldmVyc2UgY2hhcnMpIChhbGlz dC1nZXQgbm9kZSBzaW5rLWNoYXJzLWFsaXN0KSkpKQorICAgIDs7CisgICAgOzsgbm93IHByb2Nl c3MgZWFjaCBzaW5rIG9mIHRoaXMgc291cmNlIGluIG9yZGVyCisgICAgKGRvbGlzdCAoc2luayBz aW5rcykKKyAgICAgIChsZXQqICgobGlzdC1jaGFycyAoYWxpc3QtZ2V0IHNpbmsgc2luay1jaGFy cy1hbGlzdCkpCisJICAgICAoc2luZ2xlcyBuaWwpCisJICAgICAoY29tcG91bmRzIG5pbCkKKwkg ICAgIChxdWVzdGlvbiAobWVtYmVyICcoMCkgbGlzdC1jaGFycykpCisJICAgICByZSB0eXBlCisJ ICAgICByZS1vYmogdHlwZS1vYmogYXV4KQorCSh3aGVuIHF1ZXN0aW9uCisJICAoc2V0cSBsaXN0 LWNoYXJzIChkZWxldGUgJygwKSBsaXN0LWNoYXJzKSkpCisJOzsgZWxpbWluYXRlIGFsbCBlcHNp bG9uIGFycm93cyBsZWZ0IGZyb20gYWxsIGNoYXJzCisJKHNldHEgbGlzdC1jaGFycyAobWFwY2Fy IChsYW1iZGEgKGNoYXJzKSAoZGVscSAwIGNoYXJzKSkgbGlzdC1jaGFycykpCisJOzsgc2VwYXJh dGUgYWxsIGFsb25lIGNoYXJzIGluIHNpbmdsZXMKKwkoZG9saXN0IChjaGFycyBsaXN0LWNoYXJz KQorCSAgKHNldHEgcmUgIiIgdHlwZSAnZW1wdHkpCisJICA7OworCSAgOzsgc28gZmFyLCBjaGFy cyBvbmx5IGNvbnRhaW5zIGNoYXJzLCBzaW5rcyBvciB0eXBlZC1yZWdleHBzCisJICA7OyAoY2Ry IGlzIHN5bWJvbCkKKwkgIChpZiAoPSAobGVuZ3RoIGNoYXJzKSAxKQorCSAgICAgIChjb25kICgo Y2hhcmFjdGVycCAoY2FyIGNoYXJzKSkgOyAxIGNoYXIgPT4gc2luZ2xlcworCQkgICAgIChwdXNo IChjYXIgY2hhcnMpIHNpbmdsZXMpKQorCQkgICAgKChhbmQgKGNkYXIgY2hhcnMpCisJCQkgIChz eW1ib2xwIChjZGFyIGNoYXJzKSkpIDsgdHlwZWQtcmVnZXhwID0+IGNvbXBvdW5kcworCQkgICAg IChwdXNoIChjYXIgY2hhcnMpIGNvbXBvdW5kcykpCisJCSAgICAodAorCQkgICAgIDs7IGEgc2lu aywgZm9yIHN1cmUgYSBtb3N0IG5lc3RlZCwgYWxyZWFkeSBwcm9jZXNzZWQKKwkJICAgICA7OyB0 aGUgYXNzb2NpYXRpb24gaXMgYSB0eXBlZC1yZWdleHAKKwkJICAgICAocHVzaCAoYWxpc3QtZ2V0 IChjYXIgY2hhcnMpIHNpbmstcmUtYWxpc3QpIGNvbXBvdW5kcykpKQorCSAgICA7OworCSAgICAo ZG9saXN0IChvYmogY2hhcnMpCisJICAgICAgKGNvbmQgKChjaGFyYWN0ZXJwIG9iaikKKwkJICAg ICAoc2V0cSByZS1vYmogKHJlZ2V4cC1xdW90ZSAoY2hhci10by1zdHJpbmcgb2JqKSkKKwkJCSAg IHR5cGUtb2JqICdzaW5nbGUpKQorCQkgICAgOzsgdHlwZWQtcmVnZXhwCisJCSAgICAoKGFuZCAo Y2RyIG9iaikgKHN5bWJvbHAgKGNkciBvYmopKSkKKwkJICAgICAoc2V0cSByZS1vYmogKGNhciBv YmopCisJCQkgICB0eXBlLW9iaiAoY2RyIG9iaikpKQorCQkgICAgOzsgb2JqPXNpbmsgLT4gbG9v a3VwIGluIGBzaW5rLXJlLWFsaXN0JworCQkgICAgKHQgKHNldHEgYXV4IChhbGlzdC1nZXQgb2Jq IHNpbmstcmUtYWxpc3QpCisJCQkgICAgIHJlLW9iaiAoY2FyIGF1eCkKKwkJCSAgICAgdHlwZS1v YmogKGNkciBhdXgpKSkpCisJICAgICAgKHNldHEgcmUgKGNvbmNhdCByZSByZS1vYmopCisJCSAg ICB0eXBlIChjb25kICgoZXEgdHlwZSAnZW1wdHkpIHR5cGUtb2JqKQorCQkJICAgICAgICgoZXEg dHlwZS1vYmogJ2VtcHR5KSB0eXBlKQorCQkJICAgICAgICh0ICdzZXF1ZW5jZSkpKSkKKwkgICAg KHB1c2ggKGNvbnMgcmUgdHlwZSkgY29tcG91bmRzKSkpCisJY29tcG91bmRzCisJOzsgcHJvY2Vz cyBzaW5nbGVzIGludG8gY29tcG91bmRzCisJKGNvbmQgKCg+IChsZW5ndGggc2luZ2xlcykgMSkK KwkgICAgICAgKHB1c2ggKGNvbnMgKHJlZ2V4cC1vcHQtY2hhcnNldCBzaW5nbGVzKSAnc2luZ2xl KQorCQkgICAgIGNvbXBvdW5kcykpCisJICAgICAgKCg9IChsZW5ndGggc2luZ2xlcykgMSkKKwkg ICAgICAgKHB1c2ggKGNvbnMgKHJlZ2V4cC1xdW90ZSAoY2hhci10by1zdHJpbmcgKGNhciBzaW5n bGVzKSkpCisJCQkgICAnc2luZ2xlKQorCQkgICAgIGNvbXBvdW5kcykpKQorCTs7IG91dHB1dCBh Y2NvcmRpbmcgdG8gY29tcG91bmRzIGFuZCBxdWVzdGlvbgorCShjb25kICgoPiAobGVuZ3RoIGNv bXBvdW5kcykgMSkKKwkgICAgICAgKHNldHEgcmUgKGNvbmNhdCAiXFwoPzoiIChtYXBjb25jYXQg IydjYXIgY29tcG91bmRzICJcXHwiKSAiXFwpIikKKwkJICAgICB0eXBlICdncm91cCkKKwkgICAg ICAgKHdoZW4gcXVlc3Rpb24gKHNldHEgcmUgKGNvbmNhdCByZSAiPyIpCisJCQkJICAgIHR5cGUg J3NpbmdsZSkpKQorCSAgICAgIDs7CisJICAgICAgKCg9IChsZW5ndGggY29tcG91bmRzKSAxKQor CSAgICAgICAoc2V0cSByZSAoY2FhciBjb21wb3VuZHMpCisJCSAgICAgdHlwZSAoY2RhciBjb21w b3VuZHMpKQorCSAgICAgICAoY29uZCAoKGFuZCBxdWVzdGlvbiAoZXEgdHlwZSAnc2luZ2xlKSkK KwkJICAgICAgKHNldHEgcmUgKGNvbmNhdCByZSAiPyIpKSkKKwkJICAgICAocXVlc3Rpb24gKHNl dHEgcmUgKGNvbmNhdCAiXFwoPzoiIHJlICJcXCk/IikKKwkJCQkgICAgIHR5cGUgJ3NpbmdsZSkp KSkKKwkgICAgICAoKD0gKGxlbmd0aCBjb21wb3VuZHMpIDApIDsgdGhpcyBtYXkgaGFwcGVuIHdp dGggbm9kZSAoMCkKKwkgICAgICAgKHNldHEgcmUgIiIgICAgICAgICAgICA7IGJlY2F1c2UgcXVl c3Rpb24gYmVjb21lcyBub25uaWwKKwkJICAgICB0eXBlICdlbXB0eSkpKSAgIDsgYW5kIGNvbXBv dW5kcyBpcyBlbXB0eQorCTs7IHNhdmUgKFJFIC4gVFlQRSkgdG8gc2luay1yZS1hbGlzdAorCShz ZXRmIChhbGlzdC1nZXQgc2luayBzaW5rLXJlLWFsaXN0KSAoY29ucyByZSB0eXBlKSkpKQorICAg IDs7IHJldHVybiAoUkUgVFlQRSBMQVNULVNJTkspCisgICAgKHNldHEgcmUtdHlwZSAoYWxpc3Qt Z2V0IGxhc3Qtc2luayBzaW5rLXJlLWFsaXN0KSkKKyAgICAobGlzdCAoY2FyIHJlLXR5cGUpIChj ZHIgcmUtdHlwZSkgbGFzdC1zaW5rKSkpCisKKyhkZWZ1biByZWdleHAtb3B0LXJlbW92ZS1zb3Vy Y2UgKHNvdXJjZSBzb3VyY2VzKQorICAiUmV0dXJuIFNPVVJDRVMgd2l0aCBTT1VSQ0UgYW5kIGFs bCBuZXN0ZWQgc291cmNlcyByZW1vdmVkLiIKKyAgKGRvbGlzdCAoYnJhbmNoIChyZWdleHAtb3B0 LWJyYW5jaCBzb3VyY2UpKQorICAgIDs7IGVhY2ggYnJhbmNoID0gKFNJTksgLiBOT0RFUykKKyAg ICAoZG9saXN0IChub2RlIChjZHIgYnJhbmNoKSkKKyAgICAgICh3aGVuICg+IChsZW5ndGggbm9k ZSkgMSkKKyAgCShzZXRxIHNvdXJjZXMgKHJlZ2V4cC1vcHQtcmVtb3ZlLXNvdXJjZSBub2RlIHNv dXJjZXMpKSkpKQorICAoZGVscSBzb3VyY2Ugc291cmNlcykpCisKIChkZWZ1biByZWdleHAtb3B0 LWNoYXJzZXQgKGNoYXJzKQogICAiUmV0dXJuIGEgcmVnZXhwIHRvIG1hdGNoIGEgY2hhcmFjdGVy IGluIENIQVJTLgogQ0hBUlMgc2hvdWxkIGJlIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLiIKICAgOzsg VGhlIGJhc2ljIGlkZWEgaXMgdG8gZmluZCBjaGFyYWN0ZXIgcmFuZ2VzLiAgQWxzbyB3ZSB0YWtl IGNhcmUgaW4gdGhlCiAgIDs7IHBvc2l0aW9uIG9mIGNoYXJhY3RlciBzZXQgbWV0YSBjaGFyYWN0 ZXJzIGluIHRoZSBjaGFyYWN0ZXIgc2V0IHJlZ2V4cC4KICAgOzsKLSAgKGxldCogKChjaGFybWFw IChtYWtlLWNoYXItdGFibGUgJ3JlZ2V4cC1vcHQtY2hhcnNldCkpCi0JIChzdGFydCAtMSkgKGVu ZCAtMikKLQkgKGNoYXJzZXQgIiIpCi0JIChicmFja2V0ICIiKSAoZGFzaCAiIikgKGNhcmV0ICIi KSkKKyAgKGxldCogKChjaGFybWFwIChtYWtlLWNoYXItdGFibGUgJ2Nhc2UtdGFibGUpKQorICAg ICAgICAgKHN0YXJ0IC0xKSAoZW5kIC0yKQorICAgICAgICAgKGNoYXJzZXQgIiIpCisgICAgICAg ICAoYnJhY2tldCAiIikgKGRhc2ggIiIpIChjYXJldCAiIikpCiAgICAgOzsKICAgICA7OyBNYWtl IGEgY2hhcmFjdGVyIG1hcCBidXQgZXh0cmFjdCBjaGFyYWN0ZXIgc2V0IG1ldGEgY2hhcmFjdGVy cy4KICAgICAoZG9saXN0IChjaGFyIGNoYXJzKQogICAgICAgKGNvbmQKICAgICAgICAoKGVxIGNo YXIgP1xdKQotCShzZXRxIGJyYWNrZXQgIl0iKSkKKyAgICAgICAgKHNldHEgYnJhY2tldCAiXSIp KQogICAgICAgICgoZXEgY2hhciA/XikKLQkoc2V0cSBjYXJldCAiXiIpKQorICAgICAgICAoc2V0 cSBjYXJldCAiXiIpKQogICAgICAgICgoZXEgY2hhciA/LSkKLQkoc2V0cSBkYXNoICItIikpCisg ICAgICAgIChzZXRxIGRhc2ggIi0iKSkKICAgICAgICAodAotCShhc2V0IGNoYXJtYXAgY2hhciB0 KSkpKQorICAgICAgICAoYXNldCBjaGFybWFwIGNoYXIgdCkpKSkKICAgICA7OwogICAgIDs7IE1h a2UgYSBjaGFyYWN0ZXIgc2V0IGZyb20gdGhlIG1hcCB1c2luZyByYW5nZXMgd2hlcmUgYXBwbGlj YWJsZS4KICAgICAobWFwLWNoYXItdGFibGUKICAgICAgKGxhbWJkYSAoYyB2KQogICAgICAgICh3 aGVuIHYKLQkgKGlmIChjb25zcCBjKQotCSAgICAgKGlmICg9ICgxLSAoY2FyIGMpKSBlbmQpIChz ZXRxIGVuZCAoY2RyIGMpKQotCSAgICAgICAoaWYgKD4gZW5kICgrIHN0YXJ0IDIpKQotCQkgICAo c2V0cSBjaGFyc2V0IChmb3JtYXQgIiVzJWMtJWMiIGNoYXJzZXQgc3RhcnQgZW5kKSkKLQkJICh3 aGlsZSAoPj0gZW5kIHN0YXJ0KQotCQkgICAoc2V0cSBjaGFyc2V0IChmb3JtYXQgIiVzJWMiIGNo YXJzZXQgc3RhcnQpKQotCQkgICAoc2V0cSBzdGFydCAoMSsgc3RhcnQpKSkpCi0JICAgICAgIChz ZXRxIHN0YXJ0IChjYXIgYykgZW5kIChjZHIgYykpKQotCSAgIChpZiAoPSAoMS0gYykgZW5kKSAo c2V0cSBlbmQgYykKLQkgICAgIChpZiAoPiBlbmQgKCsgc3RhcnQgMikpCi0JICAgICAgIChzZXRx IGNoYXJzZXQgKGZvcm1hdCAiJXMlYy0lYyIgY2hhcnNldCBzdGFydCBlbmQpKQotCSAgICAgKHdo aWxlICg+PSBlbmQgc3RhcnQpCi0JICAgICAgIChzZXRxIGNoYXJzZXQgKGZvcm1hdCAiJXMlYyIg Y2hhcnNldCBzdGFydCkpCi0JICAgICAgIChzZXRxIHN0YXJ0ICgxKyBzdGFydCkpKSkKLQkgICAg IChzZXRxIHN0YXJ0IGMgZW5kIGMpKSkpKQorICAgICAgICAgKGlmIChjb25zcCBjKQorICAgICAg ICAgICAgIChpZiAoPSAoMS0gKGNhciBjKSkgZW5kKSAoc2V0cSBlbmQgKGNkciBjKSkKKyAgICAg ICAgICAgICAgIChpZiAoPiBlbmQgKCsgc3RhcnQgMikpCisgICAgICAgICAgICAgICAgICAgKHNl dHEgY2hhcnNldCAoZm9ybWF0ICIlcyVjLSVjIiBjaGFyc2V0IHN0YXJ0IGVuZCkpCisgICAgICAg ICAgICAgICAgICh3aGlsZSAoPj0gZW5kIHN0YXJ0KQorICAgICAgICAgICAgICAgICAgIChzZXRx IGNoYXJzZXQgKGZvcm1hdCAiJXMlYyIgY2hhcnNldCBzdGFydCkpCisgICAgICAgICAgICAgICAg ICAgKHNldHEgc3RhcnQgKDErIHN0YXJ0KSkpKQorICAgICAgICAgICAgICAgKHNldHEgc3RhcnQg KGNhciBjKSBlbmQgKGNkciBjKSkpCisgICAgICAgICAgIChpZiAoPSAoMS0gYykgZW5kKSAoc2V0 cSBlbmQgYykKKyAgICAgICAgICAgICAoaWYgKD4gZW5kICgrIHN0YXJ0IDIpKQorICAgICAgICAg ICAgICAgKHNldHEgY2hhcnNldCAoZm9ybWF0ICIlcyVjLSVjIiBjaGFyc2V0IHN0YXJ0IGVuZCkp CisgICAgICAgICAgICAgKHdoaWxlICg+PSBlbmQgc3RhcnQpCisgICAgICAgICAgICAgICAoc2V0 cSBjaGFyc2V0IChmb3JtYXQgIiVzJWMiIGNoYXJzZXQgc3RhcnQpKQorICAgICAgICAgICAgICAg KHNldHEgc3RhcnQgKDErIHN0YXJ0KSkpKQorICAgICAgICAgICAgIChzZXRxIHN0YXJ0IGMgZW5k IGMpKSkpKQogICAgICBjaGFybWFwKQogICAgICh3aGVuICg+PSBlbmQgc3RhcnQpCiAgICAgICAo aWYgKD4gZW5kICgrIHN0YXJ0IDIpKQotCSAgKHNldHEgY2hhcnNldCAoZm9ybWF0ICIlcyVjLSVj IiBjaGFyc2V0IHN0YXJ0IGVuZCkpCi0JKHdoaWxlICg+PSBlbmQgc3RhcnQpCi0JICAoc2V0cSBj aGFyc2V0IChmb3JtYXQgIiVzJWMiIGNoYXJzZXQgc3RhcnQpKQotCSAgKHNldHEgc3RhcnQgKDEr IHN0YXJ0KSkpKSkKKyAgICAgICAgICAoc2V0cSBjaGFyc2V0IChmb3JtYXQgIiVzJWMtJWMiIGNo YXJzZXQgc3RhcnQgZW5kKSkKKyAgICAgICAgKHdoaWxlICg+PSBlbmQgc3RhcnQpCisgICAgICAg ICAgKHNldHEgY2hhcnNldCAoZm9ybWF0ICIlcyVjIiBjaGFyc2V0IHN0YXJ0KSkKKyAgICAgICAg ICAoc2V0cSBzdGFydCAoMSsgc3RhcnQpKSkpKQogICAgIDs7CiAgICAgOzsgTWFrZSBzdXJlIGEg Y2FyZXQgaXMgbm90IGZpcnN0IGFuZCBhIGRhc2ggaXMgZmlyc3Qgb3IgbGFzdC4KICAgICAoaWYg KGFuZCAoc3RyaW5nLWVxdWFsIGNoYXJzZXQgIiIpIChzdHJpbmctZXF1YWwgYnJhY2tldCAiIikp Ci0JKGlmIChzdHJpbmctZXF1YWwgZGFzaCAiIikKKyAgICAgICAgKGlmIChzdHJpbmctZXF1YWwg ZGFzaCAiIikKICAgICAgICAgICAgICJcXF4iICAgICAgICAgICAgICAgICAgICAgICA7IFteXSBp cyBub3QgYSB2YWxpZCByZWdleHAKICAgICAgICAgICAoY29uY2F0ICJbIiBkYXNoIGNhcmV0ICJd IikpCiAgICAgICAoY29uY2F0ICJbIiBicmFja2V0IGNoYXJzZXQgY2FyZXQgZGFzaCAiXSIpKSkp CiAKKzs7IER1ZSB0byBhIGJ1ZyB3aXRoIG5pbCBhcyBlbGVtZW50cywgdGhhdCBpcyBmaXhlZCBv bmx5IGluIEVtYWNzCis7OyAyNy4yLCBJIHJlaW1wbGVtZW50ZWQgYHNlcS1pbnRlcnNlY3Rpb24n LCBgc2VxLXVuaXEnIGFuZAorOzsgYHNlcS1kaWZmZXJlbmNlJy4gIExhdGVyLCBpZiBzZXEgaXMg bG9hZGVkIGJ5IGRlZmF1bHQsIHdlIGNvdWxkCis7OyBlbGltaW5hdGUgdGhlc2UgZnVuY3Rpb25z LCBjaGFuZ2luZyBjb2RlIGFjY29yZGluZ2x5IChub3RpY2UgdGhhdAorOzsgVEVTVEZOIGlzIGBl cScgZm9yIGludGVyc2VjdGlvbiBhbmQgdW5pcSEpCisKKyhkZWZ1biByZWdleHAtb3B0LWludGVy c2VjdGlvbiAobGlzdDEgbGlzdDIpCisgICJSZXR1cm4gYSBsaXN0IG9mIHRoZSBlbGVtZW50cyB0 aGF0IGFwcGVhciBpbiBib3RoIExJU1QxIGFuZCBMSVNUMi4KK0VxdWFsaXR5IGlzIGRlZmluZWQg YnkgYGVxJy4iCisgIChsZXQgKGludGVyc2VjdGlvbikKKyAgICAoZG9saXN0ICh4IGxpc3QxIChu cmV2ZXJzZSBpbnRlcnNlY3Rpb24pKQorICAgICAgKHdoZW4gKG1lbXEgeCBsaXN0MikgKHB1c2gg eCBpbnRlcnNlY3Rpb24pKSkpKQorCisoZGVmdW4gcmVnZXhwLW9wdC11bmlxIChsaXN0KQorICAi UmV0dXJuIGEgbGlzdCBvZiB0aGUgZWxlbWVudHMgb2YgTElTVCB3aXRoIGR1cGxpY2F0ZXMgcmVt b3ZlZC4KK0VxdWFsaXR5IGlzIGRlZmluZWQgYnkgYGVxJy4iCisgIChsZXQgKHJlc3VsdCkKKyAg ICAoZG9saXN0IChlbCBsaXN0IChucmV2ZXJzZSByZXN1bHQpKQorICAgICAgKHVubGVzcyAobWVt cSBlbCByZXN1bHQpIChwdXNoIGVsIHJlc3VsdCkpKSkpCisKKyhkZWZ1biByZWdleHAtb3B0LWRp ZmZlcmVuY2UgKGxpc3QxIGxpc3QyICZvcHRpb25hbCB0ZXN0Zm4pCisgICJNeSB2ZXJzaW9uIG9m IHNlcS1kaWZmZXJlbmNlLCBmb3IgdXNlIHdpdGggRW1hY3MgMjYuMS4iCisgIChsZXQgKChmbiAo aWYgdGVzdGZuIHRlc3RmbiAjJ2VxdWFsKSkKKwlkaWZmIHMyKQorICAgIChkb2xpc3QgKHggbGlz dDEgKG5yZXZlcnNlIGRpZmYpKQorICAgICAgKHNldHEgczIgbGlzdDIpCisgICAgICAod2hpbGUg KGFuZCBzMiAobm90IChmdW5jYWxsIGZuIHggKGNhciBzMikpKSkKKwkoc2V0cSBzMiAoY2RyIHMy KSkpCisgICAgICAodW5sZXNzIHMyCisJKHB1c2ggeCBkaWZmKSkpKSkKKworKGRlZnVuIHJlZ2V4 cC1vcHQtYWxsLWludGVyc2VjdGlvbnMgKHggcmVzdCkKKyAgIlJldHVybiB0aGUgbGlzdCBvZiBh bGwgcG9zc2libGUgaW50ZXJzZWN0aW9ucy4KK1VzZSAocmVnZXhwLW9wdC1hbGwtaW50ZXJzZWN0 aW9ucyB0IFJFU1QpIGZvciB0aGUgbGlzdCBvZiBhbGwKK3Bvc3NpYmxlIGludGVyc2VjdGlvbnMg b2YgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mIFJFU1Qgd2l0aAorYXQgbGVhc3QgMiBlbGVt ZW50cy4KKworRm9yIGV4YW1wbGUsIGlmIEEsIEIsIEMsIEQgYXJlIGxpc3RzLAorIChyZWdleHAt b3B0LWFsbC1pbnRlcnNlY3Rpb25zIHQgKEEgQiBDIEQpKQorICAtPiAoQeKIqUIgQeKIqULiiKlD IEHiiKlC4oipQ+KIqUQgQeKIqULiiKlEIEHiiKlDIEHiiKlD4oipRCBB4oipRCBC4oipQyBC4oip Q+KIqUQgQuKIqUQgQ+KIqUQpCitpbiB0aGlzIG9yZGVyLCB3aGVyZSBY4oipWSBpcyBjb21wdXRl ZCBjb21wYXJpbmcgZWxlbWVudHMgd2l0aCBgZXEnLgorCitJZiBFTFQgaXMgYSBsaXN0LCByZXR1 cm4gdGhlIGxpc3Qgb2YgaW50ZXJzZWN0aW9ucyBvZiBFTFQgd2l0aAorYWxsIGNvbWJpbmF0aW9u cyBvZiBlbGVtZW50cyBvZiBSRVNULiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgZm9yCityZWN1cnNp b24uIgorICA7OyBJZGVhIGZvciBpbXBsZW1lbnRhdGlvbjoKKyAgOzsKKyAgOzsgY2FsbGVkIHdp dGggRUxUPUEsIEEgaXMgYSBsaXN0IC0+IGFsbCBpbnRlcnNlY3Rpb25zIHRoYXQgaGF2ZSBBCisg IDs7IChyZWdleHAtb3B0LWFsbC1pbnRlcnNlY3Rpb25zIEEgJyhCIEMgRCkpIHJldHVybnMKKyAg OzsgICAoQeKIqUIpICsgKHJlZ2V4cC1vcHQtYWxsLWludGVyc2VjdGlvbnMgQeKIqUIgJyhDIEQp KQorICA7OyAgICsgKEHiiKlDKSArIChyZWdleHAtb3B0LWFsbC1pbnRlcnNlY3Rpb25zIEHiiKlD ICcoRCkpCisgIDs7ICAgKyAoQeKIqUQpCisgIDs7ID0gKEHiiKlCKQorICA7OyAgICsgKEHiiKlC 4oipQykgKyAocmVnZXhwLW9wdC1hbGwtaW50ZXJzZWN0aW9ucyBB4oipQuKIqUMgJyhEKSkgKyAo QeKIqULiiKlEKQorICA7OyAgICsgKEHiiKlDKSArIChB4oipQ+KIqUQpICsgKEHiiKlEKQorICA7 OyA9IChB4oipQiBB4oipQuKIqUMgQeKIqULiiKlD4oipRCBB4oipQuKIqUQgQeKIqUMgQeKIqUPi iKlEIEHiiKlEKQorICA7OworICA7OyBDYWxsZWQgd2l0aCBFTFQgbm90IGEgbGlzdAorICA7OyAo cmVnZXhwLW9wdC1hbGwtaW50ZXJzZWN0aW9ucyB0ICcoQSBCIEMgRCkpIHJldHVybnMKKyAgOzsg ICAocmVnZXhwLW9wdC1hbGwtaW50ZXJzZWN0aW9ucyBBICcoQiBDIEQpKQorICA7OyAgICsgKHJl Z2V4cC1vcHQtYWxsLWludGVyc2VjdGlvbnMgQiAnKEMgRCkpCisgIDs7ICAgKyAocmVnZXhwLW9w dC1hbGwtaW50ZXJzZWN0aW9ucyBDICcoRCkpCisgIDs7ICAgPSAoQeKIqUIgQeKIqULiiKlDIEHi iKlC4oipQ+KIqUQgQeKIqULiiKlEIEHiiKlDIEHiiKlD4oipRCBB4oipRCkKKyAgOzsgICAgICsg KELiiKlDIELiiKlD4oipRCBC4oipRCkKKyAgOzsgICAgICsgKEPiiKlEKQorICA7OyAgID0gKEHi iKlCIEHiiKlC4oipQyBB4oipQuKIqUPiiKlEIEHiiKlC4oipRCBB4oipQyBB4oipQ+KIqUQgQeKI qUQgQuKIqUMgQuKIqUPiiKlEIELiiKlEIEPiiKlEKQorICA7OyAuLi4gdGhhdCBpcyB0aGUgc2V0 IG9mIGFsbCBwb3NzaWJsZSBpbnRlcnNlY3Rpb25zIG9mIGVsZW1lbnRzIG9mCisgIDs7ICcoQSBC IEMgRCkgd2hlcmUgQSwgQiwgQywgRCBhcmUgbGlzdHMKKyAgKGlmIChsaXN0cCB4KQorICAgICAg KG1hcGNhbiAobGFtYmRhICh5KQorCQkobGV0ICgoeOKIqXkgKHJlZ2V4cC1vcHQtaW50ZXJzZWN0 aW9uIHggeSkpCisJCSAgICAgICh0YWlsIChjZHIgKG1lbXEgeSByZXN0KSkpKQorCQkgIChpZiB0 YWlsCisJCSAgICAgIChjb25zIHjiiKl5CisJCQkgICAgKHJlZ2V4cC1vcHQtYWxsLWludGVyc2Vj dGlvbnMgeOKIqXkgdGFpbCkpCisJCSAgICAobGlzdCB44oipeSkpKSkKKwkgICAgICByZXN0KQor ICAgIChtYXBjYW4gKGxhbWJkYSAobCkKKwkgICAgICAobGV0ICgodGFpbCAoY2RyIChtZW1xIGwg cmVzdCkpKSkKKwkJKHdoZW4gdGFpbCAocmVnZXhwLW9wdC1hbGwtaW50ZXJzZWN0aW9ucyBsIHRh aWwpKSkpCisJICAgIHJlc3QpKSkKKworOzsgRGVidWdpbmc6IHJlZ2V4cC1vcHQtcHJpbnQtbm9k ZSBwcmludHMgTk9ERSBpbiBodW1hbiByZWFkYWJsZSBmb3JtLgorOzsgSWYgb3UgaGF2ZSBncmFw aHZpeiBpbnN0YWxsZWQsIGdldCBhIG5pY2UgZ3JhcGggd2l0aAorOzsgICAocmVnZXhwLW9wdC1w cmludC1ub2RlIG5vZGUgJ2dyYXBodml6KQorOzsgb3IganVzdCB1c2UKKzs7ICAgKHJlZ2V4cC1v cHQtcHJpbnQtbm9kZSBub2RlKQorOzsgZm9yIGEgbGlzdCBvZiBhcnJvd3MgdG8gbnVtYmVyZWQg bm9kZXMuCisKKzs7IChkZWZ1biByZWdleHAtb3B0LXByaW50LW5vZGUgKG5vZGUgJm9wdGlvbmFs IGRyaXZlciBleHQgdGVtcGZpbGUtbm8tZXh0KQorOzsgICAiUHJpbnQgc3RydWN0dXJlIG9mIE5P REUgaW4gaHVtYW4gcmVhZGFibGUgZm9ybS4KKzs7IE9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBE UklWRVIgc2hvdWxkIGJlIGBidWZmZXInIChkZWZhdWx0IGlmCis7OyBuaWwpIG9yIGBncmFwaHZp eicuIElmIERSSVZFUiBpcyBgYnVmZmVyJywgaW5zZXJ0IGEgbGlzdCBvZgorOzsgYXJyb3dzIGlu IGN1cnJlbnQgYnVmZmVyLiAgSWYgRFJJVkVSIGlzIGBncmFwaHZpeicsIHBhc3Mgbm9kZQorOzsg c3RydWN0dXJlIHRvIGdyYXBodml6IGFuZCBkaXNwbGF5IHRoZSBvdXRwdXQgaW1hZ2UgaW4gYSBi dWZmZXIuCis7OyBGb3IgZ3JhcGh2aXogZHJpdmVyLCBvdGhlciBhcmd1bWVudHMgRVhUIGFuZCBU RU1QRklMRS1OTy1FWFQKKzs7IHNodW9sZCBiZSBzdHJpbmdzIHdoZXJlIEVYVCAoZGVmYXVsdCB0 byBcInN2Z1wiKSBpcyB0aGUgaW1hZ2UKKzs7IGV4dGVuc2lvbiB0byBiZSBvdXRwdXQgYnkgZ3Jh cGh2aXogYW5kIFRFTVBGSUxFLU5PLUVYVCAoZGVmYXVsdAorOzsgdG8gXCJyZS10ZW1wXCIgaXMg dGhlIGZpbGVuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uIGZvciBzYXZpbmcgYW5kCis7OyBvdXRwdXQg Zm9yIGdyYXBodml6LiIKKzs7ICAgKGxldCogKCh0by1iZS1wcmludGVkIChsaXN0IG5vZGUpKQor OzsgCSAoZ3JhcGh2aXogKGVxIGRyaXZlciAnZ3JhcGh2aXopKQorOzsgCSAoYnVmICh3aGVuIGdy YXBodml6IChnZXQtYnVmZmVyLWNyZWF0ZSAiKnJlZ2V4cC1kb3QqIikpKQorOzsgCSAobGFzdC1i dWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKzs7IAkgKGNvbXBpbGF0aW9uLWFzay1hYm91dC1zYXZl IG5pbCkKKzs7IAkgcHJpbnRlZC1ub2RlcyBub2RlcworOzsgCSBmcm9tIHRvIGNoYXIKKzs7IAkg ZnJvbS1udW0gdG8tbnVtCis7OyAJIGlucHV0IG91dHB1dAorOzsgCSBjb21waWxhdGlvbi1nb2lu Zy1vbikKKzs7ICAgICAodW5sZXNzIGV4dCAoc2V0cSBleHQgInBuZyIpKQorOzsgICAgICh1bmxl c3MgdGVtcGZpbGUtbm8tZXh0IChzZXRxIHRlbXBmaWxlLW5vLWV4dCAicmUtdGVtcCIpKQorOzsg ICAgICh3aGVuIGdyYXBodml6Cis7OyAgICAgICAoc2V0cSBpbnB1dCAoY29uY2F0IHRlbXBmaWxl LW5vLWV4dCAiLmRvdCIpCis7OyAJICAgIG91dHB1dCAoY29uY2F0IHRlbXBmaWxlLW5vLWV4dCAi LiIgZXh0KSkKKzs7ICAgICAgIChzZXQtYnVmZmVyIGJ1ZikKKzs7ICAgICAgIChkZWxldGUtcmVn aW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpKQorOzsgICAgICAgKGluc2VydCAiZGlncmFwaCBy ZWdleHBmYSB7XG5yYW5rZGlyPUxSO1xubm9kZSBbc2hhcGUgPSBjaXJjbGVdOyIpKQorOzsgICAg ICh3aGlsZSB0by1iZS1wcmludGVkCis7OyAgICAgICAoc2V0cSBmcm9tIChwb3AgdG8tYmUtcHJp bnRlZCkpCis7OyAgICAgICAodW5sZXNzIChtZW1xIGZyb20gcHJpbnRlZC1ub2RlcykKKzs7IAko cHVzaCBmcm9tIHByaW50ZWQtbm9kZXMpCis7OyAJKHVubGVzcyAobWVtcSBmcm9tIG5vZGVzKSAo cHVzaCBmcm9tIG5vZGVzKSkKKzs7IAkoc2V0cSBmcm9tLW51bSAobGVuZ3RoIChtZW1xIGZyb20g bm9kZXMpKSkKKzs7IAkoZG9saXN0IChhcnJvdyBmcm9tKQorOzsgCSAgKHNldHEgdG8gKGNkciBh cnJvdykKKzs7IAkJY2hhciAoaWYgKD0gKGNhciBhcnJvdykgMCkgP861IChjYXIgYXJyb3cpKSkK Kzs7IAkgIChwdXNoIHRvIHRvLWJlLXByaW50ZWQpCis7OyAJICAodW5sZXNzIChtZW1xIHRvIG5v ZGVzKSAocHVzaCB0byBub2RlcykpCis7OyAJICAoc2V0cSB0by1udW0gKGxlbmd0aCAobWVtcSB0 byBub2RlcykpKQorOzsgCSAgKGNvbmQgKChlcSBkcml2ZXIgJ2dyYXBodml6KQorOzsgCQkgKGlu c2VydCAoZm9ybWF0ICJcbiUzZCAtPiAlM2QgWyBsYWJlbCA9ICVTIF07IgorOzsgCQkJCSBmcm9t LW51bSB0by1udW0gKGNoYXItdG8tc3RyaW5nIGNoYXIpKSkpCis7OyAJCSgob3IgKG5vdCBkcml2 ZXIpIChlcSBkcml2ZXIgJ2J1ZmZlcikpCis7OyAJCSAoaW5zZXJ0IChmb3JtYXQgIlxuJTNkIC0t ICVjIC0tPiAlM2QiCis7OyAJCQkJIGZyb20tbnVtIGNoYXIgdG8tbnVtKSkpKSkpKQorOzsgICAg ICh3aGVuIGdyYXBodml6Cis7OyAgICAgICAoaW5zZXJ0ICJcbn1cbiIpCis7OyAgICAgICA7OyB3 cml0ZSB0byB0ZW1wLCBjb21waWxlIGFuZCBkaXNwbGF5Cis7OyAgICAgICAod3JpdGUtZmlsZSAo Y29uY2F0IHRlbXBmaWxlLW5vLWV4dCAiLmRvdCIpKQorOzsgICAgICAgKHNldC1idWZmZXIgbGFz dC1idWZmZXIpCis7OyAgICAgICAoa2lsbC1idWZmZXIgYnVmKQorOzsgICAgICAgKHdoZW4gKGdl dC1idWZmZXIgIipwcmV2aWV3LXJlKiIpCis7OyAgICAgICAgIChraWxsLWJ1ZmZlciAiKnByZXZp ZXctcmUqIikpCis7OyAgICAgICAoc2V0cSBjb21waWxhdGlvbi1nb2luZy1vbiB0KQorOzsgICAg ICAgKGFkZC1ob29rICdjb21waWxhdGlvbi1maW5pc2gtZnVuY3Rpb25zCis7OyAJCShsYW1iZGEg KGEgYikgKGlnbm9yZSBhIGIpIChzZXRxIGNvbXBpbGF0aW9uLWdvaW5nLW9uIG5pbCkpKQorOzsg ICAgICAgKGNvbXBpbGUgKGNvbmNhdCAiZG90IC1UIiBleHQgIiBcIiIgaW5wdXQgIlwiIFwiLW8i IG91dHB1dCAiXCIiKSkKKzs7ICAgICAgICh3aGlsZSBjb21waWxhdGlvbi1nb2luZy1vbiAoc2xl ZXAtZm9yIDAuMSkpCis7OyAgICAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBvdXRwdXQpCis7OyAg ICAgICAgIChhdXRvLWltYWdlLWZpbGUtbW9kZSAxKQorOzsgICAgICAgICAoc2V0LWJ1ZmZlciAo ZmluZC1maWxlLW5vc2VsZWN0IG91dHB1dCkpCis7OyAgICAgICAgIChyZW5hbWUtYnVmZmVyICIq cHJldmlldy1yZSoiKQorOzsgCShzbGVlcC1mb3IgMC4xKQorOzsgICAgICAgICAoZGlzcGxheS1i dWZmZXIgKGdldC1idWZmZXIgIipwcmV2aWV3LXJlKiIpKSkpKSkKKwogKHByb3ZpZGUgJ3JlZ2V4 cC1vcHQpCiAKIDs7OyByZWdleHAtb3B0LmVsIGVuZHMgaGVyZQo= --000000000000eea3de058656a595--