From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jackson Hamilton Newsgroups: gmane.emacs.devel Subject: Re: Requesting review before pushing patch to ELPA Date: Thu, 5 Feb 2015 00:05:41 -0800 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=e89a8f83a6a536805d050e52c584 X-Trace: ger.gmane.org 1423125023 16878 80.91.229.3 (5 Feb 2015 08:30:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 Feb 2015 08:30:23 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Feb 05 09:27:23 2015 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YJHmN-0001L0-O0 for ged-emacs-devel@m.gmane.org; Thu, 05 Feb 2015 09:27:22 +0100 Original-Received: from localhost ([::1]:40642 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJHmI-0006n0-1C for ged-emacs-devel@m.gmane.org; Thu, 05 Feb 2015 03:27:10 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:49314) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJHSP-0001dh-8r for emacs-devel@gnu.org; Thu, 05 Feb 2015 03:07:29 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJHRY-0005dH-DP for emacs-devel@gnu.org; Thu, 05 Feb 2015 03:06:37 -0500 Original-Received: from mail-oi0-x234.google.com ([2607:f8b0:4003:c06::234]:33058) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJHRX-0005cB-09 for emacs-devel@gnu.org; Thu, 05 Feb 2015 03:05:44 -0500 Original-Received: by mail-oi0-f52.google.com with SMTP id h136so5316821oig.11 for ; Thu, 05 Feb 2015 00:05:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:content-type; bh=P+8CHojbe3/5p1fkSY8Uqau3gxP/NC3hJmn7lcRCuqA=; b=YeRuwhkt7KuqkkxnXNQpk8dg3a0cIXdkR83YsFzC7NeOozW2LXSx8ysHPJkLzI36KW qoqmUfQhbMQ5ltc2hluiDPk5VFQ7UU8fd3aOKwhiwXItB8/ZJ6oGnOjMk5joUKyU0zGf StCw1kR1AEGo4W1chFi10zVjBMWywK+6oYmyEgR7oZ7brNYG0IyFlAWyX+E1jYcZcnG8 vDrPdkdGY91+o890iZpgHCkDBAtVOJwYxulzlmweXvM8/eTB52pt8J+tBfUi28DAQHfN VZnGhTxFuinMAkIdSDilholtHLGQ9c6HIrlcL+tmDvNR4zP2Yq49poeIS7eGzKVpHPxM Sbfg== X-Received: by 10.182.68.68 with SMTP id u4mr1509925obt.82.1423123542212; Thu, 05 Feb 2015 00:05:42 -0800 (PST) Original-Received: by 10.76.24.106 with HTTP; Thu, 5 Feb 2015 00:05:41 -0800 (PST) In-Reply-To: X-Google-Sender-Auth: 5-VEha4iGMmwl8hLjBz6eF4XpFc X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c06::234 X-Mailman-Approved-At: Thu, 05 Feb 2015 03:26:58 -0500 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 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-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:182434 Archived-At: --e89a8f83a6a536805d050e52c584 Content-Type: multipart/alternative; boundary=e89a8f83a6a5368058050e52c582 --e89a8f83a6a5368058050e52c582 Content-Type: text/plain; charset=ISO-8859-1 Okay. Round two on merging context-coloring: I've externalized the non-js2-mode JavaScript code, which means the esprima, escope and extraverse files are no longer present. I've also added a script to download the latest versions of ert-async and js2-mode, so those aren't present anymore either. The attached patches are the current representation of what I intend to merge. (Same subtree strategy as before.) On Wed, Feb 4, 2015 at 1:58 PM, Stefan Monnier wrote: > > js2-mode is included in the repo for development and CI purposes. I > want to > > test in a clean environment (emacs -Q) and also on Travis CI. Having > that > > file available lets me easily add it to the load path. I do exclude it > in > > .elpaignore, because I expect that when context-coloring is installed, > the > > package manager will handle the dependency instead. > > Ah, right, that makes sense. > > > Yes, it is a truer statement that (in its current state) context-coloring > > works fine for some modes, but requires those files for non-js2-mode > > JavaScript modes. > > > esprima.js is sourced from here: > > > https://github.com/jquery/esprima/blob/1114c32c4e0ffaf47864967a835fdc0a37909f14/esprima.js > > escope.js is sourced from here: > > > https://github.com/estools/escope/blob/b191ec36b744f65df094c614510ca6125284a958/escope.js > > extraverse.js is sourced from here: > > > https://github.com/estools/estraverse/blob/c280df4aa75d7846328aa436ee5acd04afafc543/estraverse.js > > As long as we only redistribute these files without modifying them at > all, I think it's fine to have them as-is in elpa.git. > > If I were you, I'd probably prefer to split them into a separate > "javascript support for context-coloring" package, but luckily I'm not > you, so feel free to do as you wish in this regard. > > > Stefan > --e89a8f83a6a5368058050e52c582 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Okay. Round two on merging context-coloring:

I've externalized the non-js2-mode JavaScript code, which means t= he esprima, escope and extraverse files are no longer present.
I've also added a script to download the latest versions o= f ert-async and js2-mode, so those aren't present anymore either.
=

The attached patches are the current representation of = what I intend to merge. (Same subtree strategy as before.)

On Wed, Feb 4, 2015 at= 1:58 PM, Stefan Monnier <monnier@iro.umontreal.ca> w= rote:
> js2-mode is i= ncluded in the repo for development and CI purposes.=A0 I want to
> test in a clean environment (emacs -Q) and also on Travis CI.=A0 Havin= g that
> file available lets me easily add it to the load path.=A0 I do exclude= it in
> .elpaignore, because I expect that when context-coloring is installed,= the
> package manager will handle the dependency instead.

Ah, right, that makes sense.

> Yes, it is a truer statement that (in its current state) context-color= ing
> works fine for some modes, but requires those files for non-js2-mode > JavaScript modes.

> esprima.js is sourced from here:
> https://github.com/jquer= y/esprima/blob/1114c32c4e0ffaf47864967a835fdc0a37909f14/esprima.js
> escope.js is sourced from here:
> https://github.com/estool= s/escope/blob/b191ec36b744f65df094c614510ca6125284a958/escope.js
> extraverse.js is sourced from here:
> https://github.co= m/estools/estraverse/blob/c280df4aa75d7846328aa436ee5acd04afafc543/estraver= se.js

As long as we only redistribute these files without modifying them a= t
all, I think it's fine to have them as-is in elpa.git.

If I were you, I'd probably prefer to split them into a separate
"javascript support for context-coloring" package, but luckily I&= #39;m not
you, so feel free to do as you wish in this regard.


=A0 =A0 =A0 =A0 Stefan

--e89a8f83a6a5368058050e52c582-- --e89a8f83a6a536805d050e52c584 Content-Type: text/x-patch; charset=US-ASCII; name="0001-externals-list-Add-context-coloring.patch" Content-Disposition: attachment; filename="0001-externals-list-Add-context-coloring.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5ruv96i0 RnJvbSA3ODQ5MTBjYzk3MmU1Y2JmOTdiZGQyZWY2NmRkZTg4MGIwY2ZhZjdmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNrc29uIFJheSBIYW1pbHRvbiA8amFja3NvbkBqYWNrc29u cmF5aGFtaWx0b24uY29tPgpEYXRlOiBXZWQsIDQgRmViIDIwMTUgMjM6NDA6MzYgLTA4MDAKU3Vi amVjdDogW1BBVENIXSBleHRlcm5hbHMtbGlzdDogQWRkIGNvbnRleHQtY29sb3JpbmcKCi0tLQog ZXh0ZXJuYWxzLWxpc3QgfCAxICsKIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKQoKZGlm ZiAtLWdpdCBhL2V4dGVybmFscy1saXN0IGIvZXh0ZXJuYWxzLWxpc3QKaW5kZXggMTliNWFmMS4u Y2U3OTQ2NyAxMDA2NDQKLS0tIGEvZXh0ZXJuYWxzLWxpc3QKKysrIGIvZXh0ZXJuYWxzLWxpc3QK QEAgLTIzLDYgKzIzLDcgQEAKICAoImNoZXNzIgkJOmV4dGVybmFsIG5pbCkgOzsgV2FzIGh0dHBz Oi8vZ2l0aHViLmNvbS9qd2llZ2xleS9lbWFjcy1jaGVzcy5naXQKICAoImNvZmZlZS1tb2RlIgkJ OnN1YnRyZWUgImh0dHBzOi8vZ2l0aHViLmNvbS9kZWZ1bmt0L2NvZmZlZS1tb2RlIikKICAoImNv bXBhbnkiCQk6c3VidHJlZSAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBhbnktbW9kZS9jb21wYW55 LW1vZGUuZ2l0IikKKyAoImNvbnRleHQtY29sb3JpbmciCTpzdWJ0cmVlICJodHRwczovL2dpdGh1 Yi5jb20vamFja3NvbnJheWhhbWlsdG9uL2NvbnRleHQtY29sb3JpbmcuZ2l0IikKICAoImRhcmty b29tIiAgICAgICAgICAgIDpzdWJ0cmVlICJodHRwczovL2dpdGh1Yi5jb20vY2FwaXRhb21vcnRl L2Rhcmtyb29tLmdpdCIpCiAgKCJkaWZmLWhsIgkJOnN1YnRyZWUgImh0dHBzOi8vZ2l0aHViLmNv bS9kZ3V0b3YvZGlmZi1obC5naXQiKQogICgiZGlzbWFsIgkJOmV4dGVybmFsIG5pbCkKLS0gCjEu OS4xCgo= --e89a8f83a6a536805d050e52c584 Content-Type: text/x-patch; charset=US-ASCII; name="0001-squashed-merge.patch" Content-Disposition: attachment; filename="0001-squashed-merge.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5ruv96t1 RnJvbSAzOTgwMDQwMGYyNTc3NTZiODJiN2Y0MmYwYjQ1OWU5ZjQxNjcwN2UwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNrc29uIFJheSBIYW1pbHRvbiA8amFja3NvbkBqYWNrc29u cmF5aGFtaWx0b24uY29tPgpEYXRlOiBXZWQsIDQgRmViIDIwMTUgMjM6NDg6MjkgLTA4MDAKU3Vi amVjdDogW1BBVENIXSBzcXVhc2hlZCBtZXJnZQoKLS0tCiBwYWNrYWdlcy9jb250ZXh0LWNvbG9y aW5nLy5naXRpZ25vcmUgICAgICAgICAgICAgICB8ICAgIDMgKwogcGFja2FnZXMvY29udGV4dC1j b2xvcmluZy8udHJhdmlzLnltbCAgICAgICAgICAgICAgfCAgIDIxICsKIHBhY2thZ2VzL2NvbnRl eHQtY29sb3JpbmcvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAzNyArCiBwYWNrYWdlcy9j b250ZXh0LWNvbG9yaW5nL1JFQURNRS5tZCAgICAgICAgICAgICAgICB8ICAxNjUgKwogLi4uL2Jl bmNobWFyay9jb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay5lbCAgICAgICAgfCAgMTYwICsKIC4u Li9iZW5jaG1hcmsvZml4dHVyZXMvLmRpci1sb2NhbHMuZWwgICAgICAgICAgICAgIHwgICAgMSAr CiAuLi4vYmVuY2htYXJrL2ZpeHR1cmVzL2FzeW5jLTAuOS4wLmpzICAgICAgICAgICAgICB8IDEx MjMgKysrCiAuLi4vYmVuY2htYXJrL2ZpeHR1cmVzL2pxdWVyeS0yLjEuMS5qcyAgICAgICAgICAg ICB8IDkxOTAgKysrKysrKysrKysrKysrKysrKysKIC4uLi9iZW5jaG1hcmsvZml4dHVyZXMvbG9k YXNoLTIuNC4xLmpzICAgICAgICAgICAgIHwgNjc4NSArKysrKysrKysrKysrKysKIC4uLi9iZW5j aG1hcmsvZml4dHVyZXMvbWtkaXJwLTAuNS4wLmpzICAgICAgICAgICAgIHwgICA5NyArCiBwYWNr YWdlcy9jb250ZXh0LWNvbG9yaW5nL2NvbnRleHQtY29sb3JpbmcuZWwgICAgICB8ICA2MDcgKysK IHBhY2thZ2VzL2NvbnRleHQtY29sb3Jpbmcvc2NvcGlmaWVyLnBuZyAgICAgICAgICAgIHwgIEJp biAwIC0+IDI2MDkgYnl0ZXMKIHBhY2thZ2VzL2NvbnRleHQtY29sb3Jpbmcvc2NyZWVuc2hvdC5w bmcgICAgICAgICAgIHwgIEJpbiAwIC0+IDIyMDA2IGJ5dGVzCiAuLi4vc2NyaXB0cy9kb3dubG9h ZC1kZXBlbmRlbmNpZXMuZWwgICAgICAgICAgICAgICB8ICAgNDAgKwogLi4uL2NvbnRleHQtY29s b3JpbmcvdGVzdC9jb250ZXh0LWNvbG9yaW5nLXRlc3QuZWwgfCAgMzc1ICsKIC4uLi9jb250ZXh0 LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvYmxvY2stc2NvcGVzLmpzIHwgICAgNiArCiBwYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvY2F0Y2guanMgICB8ICAgIDggKwogLi4u L3Rlc3QvZml4dHVyZXMvY29tbWVudHMtYW5kLXN0cmluZ3MuanMgICAgICAgICAgfCAgICAzICsK IC4uLi90ZXN0L2ZpeHR1cmVzL2Z1bmN0aW9uLXNjb3Blcy5qcyAgICAgICAgICAgICAgIHwgICAg NSArCiBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvZ2xvYmFsLmpzICB8 ICAgIDMgKwogLi4uL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJlcy9rZXktbmFtZXMuanMg ICAgfCAgICA2ICsKIC4uLi9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMva2V5LXZhbHVl cy5qcyAgIHwgICAgOCArCiAuLi4vdGVzdC9maXh0dXJlcy9wcm9wZXJ0eS1sb29rdXAuanMgICAg ICAgICAgICAgICB8ICAgIDUgKwogMjMgZmlsZXMgY2hhbmdlZCwgMTg2NDggaW5zZXJ0aW9ucygr KQogY3JlYXRlIG1vZGUgMTAwNjQ0IHBhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvLmdpdGlnbm9y ZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHBhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvLnRyYXZpcy55 bWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL01ha2VmaWxl CiBjcmVhdGUgbW9kZSAxMDA2NDQgcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9SRUFETUUubWQK IGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9j b250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay5lbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHBhY2thZ2Vz L2NvbnRleHQtY29sb3JpbmcvYmVuY2htYXJrL2ZpeHR1cmVzLy5kaXItbG9jYWxzLmVsCiBjcmVh dGUgbW9kZSAxMDA2NDQgcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9iZW5jaG1hcmsvZml4dHVy ZXMvYXN5bmMtMC45LjAuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNv bG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9qcXVlcnktMi4xLjEuanMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9sb2Rhc2gt Mi40LjEuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2Jl bmNobWFyay9maXh0dXJlcy9ta2RpcnAtMC41LjAuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNr YWdlcy9jb250ZXh0LWNvbG9yaW5nL2NvbnRleHQtY29sb3JpbmcuZWwKIGNyZWF0ZSBtb2RlIDEw MDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Njb3BpZmllci5wbmcKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3NjcmVlbnNob3QucG5nCiBjcmVhdGUg bW9kZSAxMDA2NDQgcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9zY3JpcHRzL2Rvd25sb2FkLWRl cGVuZGVuY2llcy5lbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHBhY2thZ2VzL2NvbnRleHQtY29sb3Jp bmcvdGVzdC9jb250ZXh0LWNvbG9yaW5nLXRlc3QuZWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNr YWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvYmxvY2stc2NvcGVzLmpzCiBjcmVh dGUgbW9kZSAxMDA2NDQgcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2Nh dGNoLmpzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0 L2ZpeHR1cmVzL2NvbW1lbnRzLWFuZC1zdHJpbmdzLmpzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcGFj a2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2Z1bmN0aW9uLXNjb3Blcy5qcwog Y3JlYXRlIG1vZGUgMTAwNjQ0IHBhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJl cy9nbG9iYWwuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5n L3Rlc3QvZml4dHVyZXMva2V5LW5hbWVzLmpzCiBjcmVhdGUgbW9kZSAxMDA2NDQgcGFja2FnZXMv Y29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2tleS12YWx1ZXMuanMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBwYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvcHJvcGVydHkt bG9va3VwLmpzCgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy8uZ2l0aWdu b3JlIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTAzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACisqLmVsYworL2Jl bmNobWFyay9sb2dzLworL2xpYnJhcmllcy8KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL2NvbnRleHQt Y29sb3JpbmcvLnRyYXZpcy55bWwgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nLy50cmF2aXMu eW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2M4YTYKLS0tIC9kZXYv bnVsbAorKysgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nLy50cmF2aXMueW1sCkBAIC0wLDAg KzEsMjEgQEAKKyMgaHR0cHM6Ly9naXRodWIuY29tL3JvbGFuZHdhbGtlci9lbWFjcy10cmF2aXMK KworbGFuZ3VhZ2U6IGVtYWNzLWxpc3AKKworbm9kZV9qczoKKyAgLSAiMC4xMCIKKworZW52Ogor ICBtYXRyaXg6CisgICAgLSBFTUFDUz1lbWFjczI0CisKK2luc3RhbGw6CisgIC0gaWYgWyAiJEVN QUNTIiA9ICJlbWFjczI0IiBdOyB0aGVuCisgICAgICAgIHN1ZG8gYWRkLWFwdC1yZXBvc2l0b3J5 IC15IHBwYTpjYXNzb3UvZW1hY3MgJiYKKyAgICAgICAgc3VkbyBhcHQtZ2V0IHVwZGF0ZSAtcXEg JiYKKyAgICAgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVtYWNzMjQgZW1hY3MyNC1lbDsK KyAgICBmaQorICAtIG5wbSBpbnN0YWxsIC1nIHNjb3BpZmllcgorCitzY3JpcHQ6CisgIG1ha2Ug dGVzdCBFTUFDUz0ke0VNQUNTfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmlu Zy9NYWtlZmlsZSBiL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvTWFrZWZpbGUKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzN2NkNgotLS0gL2Rldi9udWxsCisrKyBiL3Bh Y2thZ2VzL2NvbnRleHQtY29sb3JpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwzNyBAQAorRU1BQ1Mg PSBlbWFjcworREVQRU5ERU5DSUVTID0gbGlicmFyaWVzL2VydC1hc3luYy5lbCBsaWJyYXJpZXMv anMyLW1vZGUuZWwKKworYWxsOiBjbGVhbiBjb21waWxlIHRlc3QKKworYmVuY2g6ICR7REVQRU5E RU5DSUVTfQorCSR7RU1BQ1N9IC1RIFwKKwktTCAuIFwKKwktTCBsaWJyYXJpZXMgXAorCS1sIGNv bnRleHQtY29sb3JpbmcgXAorCS1sIGJlbmNobWFyay9jb250ZXh0LWNvbG9yaW5nLWJlbmNobWFy ayBcCisJLWYgY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstcnVuCisKK2NvbXBpbGU6ICR7REVQ RU5ERU5DSUVTfQorCSR7RU1BQ1N9IC1RIC1iYXRjaCBcCisJLUwgLiBcCisJLUwgbGlicmFyaWVz IFwKKwktZiBiYXRjaC1ieXRlLWNvbXBpbGUgKi5lbCBsaWJyYXJpZXMvKi5lbAorCitjbGVhbjoK KwlybSAtZiAqLmVsYyBsaWJyYXJpZXMvKi5lbGMgJHtERVBFTkRFTkNJRVN9CisKKyR7REVQRU5E RU5DSUVTfToKKwkke0VNQUNTfSAtUSAtYmF0Y2ggXAorCS1sIHNjcmlwdHMvZG93bmxvYWQtZGVw ZW5kZW5jaWVzLmVsCisKK3Rlc3Q6ICR7REVQRU5ERU5DSUVTfQorCSR7RU1BQ1N9IC1RIC1iYXRj aCBcCisJLUwgLiBcCisJLUwgbGlicmFyaWVzIFwKKwktbCBlcnQgXAorCS1sIGVydC1hc3luYyBc CisJLWwgY29udGV4dC1jb2xvcmluZyBcCisJLWwgdGVzdC9jb250ZXh0LWNvbG9yaW5nLXRlc3Qu ZWwgXAorCS1mIGVydC1ydW4tdGVzdHMtYmF0Y2gtYW5kLWV4aXQKKworLlBIT05ZOiBhbGwgYmVu Y2ggY29tcGlsZSBjbGVhbiB0ZXN0CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9y aW5nL1JFQURNRS5tZCBiL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvUkVBRE1FLm1kCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjY3MWEKLS0tIC9kZXYvbnVsbAorKysg Yi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL1JFQURNRS5tZApAQCAtMCwwICsxLDE2NSBAQAor IyBDb250ZXh0IENvbG9yaW5nIFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3Jn L2phY2tzb25yYXloYW1pbHRvbi9jb250ZXh0LWNvbG9yaW5nLnBuZz9icmFuY2g9ZGV2ZWxvcCld KGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9qYWNrc29ucmF5aGFtaWx0b24vY29udGV4dC1jb2xvcmlu ZykKKworPHAgYWxpZ249ImNlbnRlciI+CisgIDxpbWcgYWx0PSJTY3JlZW5zaG90IG9mIEphdmFT Y3JpcHQgY29kZSBoaWdobGlnaHRlZCBieSBjb250ZXh0LiIgc3JjPSJzY3JlZW5zaG90LnBuZyIg dGl0bGU9IlNjcmVlbnNob3QiPgorPC9wPgorCitIaWdobGlnaHRzIGNvZGUgYWNjb3JkaW5nIHRv IGZ1bmN0aW9uIGNvbnRleHQuCisKKy0gQ29kZSBpbiB0aGUgZ2xvYmFsIHNjb3BlIGlzIG9uZSBj b2xvci4gQ29kZSBpbiBmdW5jdGlvbnMgd2l0aGluIHRoZSBnbG9iYWwKKyAgc2NvcGUgaXMgYSBk aWZmZXJlbnQgY29sb3IsIGFuZCBjb2RlIHdpdGhpbiBzdWNoIGZ1bmN0aW9ucyBpcyBhbm90aGVy IGNvbG9yLAorICBhbmQgc28gb24uCistIElkZW50aWZpZXJzIHJldGFpbiB0aGUgY29sb3Igb2Yg dGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkLgorCitMZXhpY2FsIHNjb3BlIGlu Zm9ybWF0aW9uIGF0LWEtZ2xhbmNlIGNhbiBhc3Npc3QgYSBwcm9ncmFtbWVyIGluIHVuZGVyc3Rh bmRpbmcKK3RoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiBhIHByb2dyYW0uIEl0IGNhbiBoZWxwIHRv IGN1cmIgbmFzdHkgYnVncyBsaWtlIG5hbWUKK3NoYWRvd2luZy4gQSByYWluYm93IGNhbiBpbmRp Y2F0ZSBleGNlc3NpdmUgY29tcGxleGl0eS4gU3RhdGUgY2hhbmdlIHdpdGhpbiBhCitjbG9zdXJl IGlzIGVhc2lseSBtb25pdG9yZWQuCisKK0J5IGRlZmF1bHQsIENvbnRleHQgQ29sb3Jpbmcgc3Rp bGwgaGlnaGxpZ2h0cyBjb21tZW50cyBhbmQgc3RyaW5ncworc3ludGFjdGljYWxseS4gSXQgaXMg c3RpbGwgZWFzeSB0byBkaWZmZXJlbnRpYXRlIGNvZGUgZnJvbSBub24tY29kZSwgYW5kIHN0cmlu Z3MKK2Nhbm5vdCBiZSBjb25mdXNlZCBmb3IgdmFyaWFibGVzLgorCitUaGlzIGNvbG9yaW5nIHN0 cmF0ZWd5IGlzIHByb2JhYmx5IG1vcmUgdXNlZnVsIHRoYW4gY29udmVudGlvbmFsIHN5bnRheAor aGlnaGxpZ2h0aW5nLiBIaWdobGlnaHRpbmcga2V5d29yZHMgY2FuIGhlbHAgb25lIHRvIGRldGVj dCBzcGVsbGluZyBlcnJvcnMsIGJ1dAorYSBbbGludGVyXVtdIGNvdWxkIGFsc28gc3BvdCB0aG9z ZSBlcnJvcnMsIGFuZCBpZiBpbnRlZ3JhdGVkIHdpdGggW2ZseWNoZWNrXVtdLAorYW4gZXh0cmEg c3BvdCBvcGVucyB1cCBpbiB5b3VyIGVkaXRpbmcgdG9vbGJlbHQuCisKK0dpdmUgY29udGV4dCBj b2xvcmluZyBhIHRyeTsgeW91IG1heSBmaW5kIHRoYXQgaXQgKmNoYW5nZXMgdGhlIHdheSB5b3Ug d3JpdGUKK2NvZGUqLgorCisjIyBGZWF0dXJlcworCistIFN1cHBvcnRlZCBsYW5ndWFnZXM6IEph dmFTY3JpcHQKKy0gTGlnaHQgYW5kIGRhcmsgKGN1c3RvbWl6YWJsZSkgY29sb3Igc2NoZW1lcy4K Ky0gVmVyeSBmYXN0IGZvciBmaWxlcyB1bmRlciAxMDAwIGxpbmVzLgorCisjIyBJbnN0YWxsYXRp b24KKworUmVxdWlyZXMgRW1hY3MgMjQrLgorCitKYXZhU2NyaXB0IGxhbmd1YWdlIHN1cHBvcnQg cmVxdWlyZXMgZWl0aGVyIFtqczItbW9kZV1bXSwgb3IKK1tOb2RlLmpzIDAuMTArXVtub2RlXSBh bmQgdGhlIFtzY29waWZpZXJdW10gZXhlY3V0YWJsZS4KKworYGBgYmFzaAorbnBtIGluc3RhbGwg LWcgc2NvcGlmaWVyCitgYGAKKworIyMjIEVMUEEKKworLSBgTS14IHBhY2thZ2UtcmVmcmVzaC1j b250ZW50cyBSRVRgCistIGBNLXggcGFja2FnZS1pbnN0YWxsIFJFVCBjb250ZXh0LWNvbG9yaW5n IFJFVGAKKworIyMjIEdpdAorCistIENsb25lIHRoaXMgcmVwb3NpdG9yeS4KKworYGBgYmFzaAor Y2Qgfi8uZW1hY3MuZC8KK2dpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vamFja3NvbnJheWhh bWlsdG9uL2NvbnRleHQtY29sb3JpbmcuZ2l0CitgYGAKKworLSBCeXRlLWNvbXBpbGUgdGhlIHBh Y2thZ2UgZm9yIGltcHJvdmVkIHNwZWVkLgorCitgYGBiYXNoCitjZCBjb250ZXh0LWNvbG9yaW5n LworbWFrZSBjb21waWxlCitgYGAKKworLSBBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIGB+Ly5l bWFjc2AgZmlsZToKKworYGBgbGlzcAorKGFkZC10by1saXN0ICdsb2FkLXBhdGggIn4vLmVtYWNz LmQvY29udGV4dC1jb2xvcmluZyIpCisocmVxdWlyZSAnY29udGV4dC1jb2xvcmluZykKKyhhZGQt aG9vayAnanMyLW1vZGUtaG9vayAnY29udGV4dC1jb2xvcmluZy1tb2RlKQorYGBgCisKKyMjIEN1 c3RvbWl6aW5nCisKK0J1aWx0LWluIHRoZW1lcyBhcmUgYWNjZXNzaWJsZSB2aWEgYGNvbnRleHQt Y29sb3JpbmctbG9hZC10aGVtZWAuICBBdmFpbGFibGUKK3RoZW1lcyBhcmU6IGBtb25va2FpYCwg YHNvbGFyaXplZGAsIGB0YW5nb2AgYW5kIGB6ZW5idXJuYC4KKworYGBgbGlzcAorKHJlcXVpcmUg J2NvbnRleHQtY29sb3JpbmcpCisoY29udGV4dC1jb2xvcmluZy1sb2FkLXRoZW1lICd6ZW5idXJu KQorYGBgCisKK1lvdSBjYW4gZGVmaW5lIHlvdXIgb3duIHRoZW1lcywgdG9vOgorCitgYGBsaXNw CisoY29udGV4dC1jb2xvcmluZy1kZWZpbmUtdGhlbWUKKyAnemVuYnVybgorIDpjb2xvcnMgJygi I0RDRENDQyIKKyAgICAgICAgICAgIiM5M0UwRTMiCisgICAgICAgICAgICIjQkZFQkJGIgorICAg ICAgICAgICAiI0YwREZBRiIKKyAgICAgICAgICAgIiNERkFGOEYiCisgICAgICAgICAgICIjQ0M5 MzkzIgorICAgICAgICAgICAiI0RDOENDMyIKKyAgICAgICAgICAgIiM5NEJGRjMiCisgICAgICAg ICAgICIjOUZDNTlGIgorICAgICAgICAgICAiI0QwQkY4RiIKKyAgICAgICAgICAgIiNEQ0EzQTMi KSkKK2BgYAorCisjIyBFeHRlbmRpbmcKKworVG8gYWRkIHN1cHBvcnQgZm9yIGEgbmV3IGxhbmd1 YWdlLCB3cml0ZSBhICJzY29waWZpZXIiIGZvciBpdCwgYW5kIGRlZmluZSBhIG5ldworY29sb3Jp bmcgZGlzcGF0Y2ggc3RyYXRlZ3kgd2l0aCBgY29udGV4dC1jb2xvcmluZy1kZWZpbmUtZGlzcGF0 Y2hgLiBUaGVuIHRoZQorcGx1Z2luIHNob3VsZCBoYW5kbGUgdGhlIHJlc3QuCisKK0EgInNjb3Bp ZmllciIgaXMgYSBDTEkgcHJvZ3JhbSB0aGF0IHJlYWRzIGEgYnVmZmVyJ3MgY29udGVudHMgZnJv bSBzdGRpbiBhbmQKK3dyaXRlcyBhIEpTT04gYXJyYXkgb2YgbnVtYmVycyB0byBzdGRvdXQuIEV2 ZXJ5IHRocmVlIG51bWJlcnMgaW4gdGhlIGFycmF5CityZXByZXNlbnQgYSByYW5nZSBvZiBjb2xv ci4gRm9yIGluc3RhbmNlLCBpZiBJIGZlZCB0aGUgZm9sbG93aW5nIHN0cmluZyBvZgorSmF2YVNj cmlwdCBjb2RlIHRvIGEgc2NvcGlmaWVyLAorCitgYGBqcwordmFyIGEgPSBmdW5jdGlvbiAoKSB7 fTsKK2BgYAorCit0aGVuIHRoZSBzY29waWZpZXIgd291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5n IGFycmF5OgorCitgYGBqcworWzEsMjQsMCw5LDIzLDFdCitgYGAKKworV2hlcmUsIGZvciBldmVy eSB0aHJlZSBudW1iZXJzLCB0aGUgZmlyc3QgbnVtYmVyIGlzIGEgMS1pbmRleGVkIHN0YXJ0IFtw b2ludF1bXSwKK3RoZSBzZWNvbmQgbnVtYmVyIGlzIGFuIGV4Y2x1c2l2ZSBlbmQgcG9pbnQsIGFu ZCB0aGUgdGhpcmQgbnVtYmVyIGlzIGEgc2NvcGUKK2xldmVsLiBUaGUgcmVzdWx0IG9mIGFwcGx5 aW5nIGxldmVsIDAgY29sb3JpbmcgdG8gdGhlIHJhbmdlICYjOTE7MSwgMjQpIGFuZCB0aGVuCith cHBseWluZyBsZXZlbCAxIGNvbG9yaW5nIHRvIHRoZSByYW5nZSAmIzkxOzksIDIzKSB3b3VsZCBy ZXN1bHQgaW4gdGhlIGZvbGxvd2luZworY29sb3Jpbmc6CisKKzxwIGFsaWduPSJjZW50ZXIiPgor ICA8aW1nIGFsdD0iU2NyZWVuc2hvdCBvZiByYW5nZXMgJiM5MTsxLCAyNCkgYW5kICYjOTE7OSwg MjMpLiIgc3JjPSJzY29waWZpZXIucG5nIiB0aXRsZT0iU2NyZWVuc2hvdCI+Cis8L3A+CisKK0lm IHRoZXJlIGlzIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGdlbmVyYXRvciBmb3IgeW91ciBsYW5n dWFnZSwgeW91IGNhbiB3YWxrCit0aGUgc3ludGF4IHRyZWUsIGZpbmQgdmFyaWFibGVzIGFuZCBz Y29wZXMsIGFuZCBidWlsZCB0aGVpciBwb3NpdGlvbnMgYW5kIGxldmVscworaW50byBhbiBhcnJh eSBsaWtlIHRoZSBvbmUgYWJvdmUuCisKK0ZvciBleGFtcGxlLCBhIFJ1Ynkgc2NvcGlmaWVyIG1p Z2h0IGJlIGRlZmluZWQgYW5kIGltcGxlbWVudGVkIGxpa2UgdGhpczoKKworYGBgbGlzcAorKGNv bnRleHQtY29sb3JpbmctZGVmaW5lLWRpc3BhdGNoCisgJ3J1YnkKKyA6bW9kZXMgJyhydWJ5LW1v ZGUpCisgOmV4ZWN1dGFibGUgInJ1YnkiCisgOmNvbW1hbmQgIi9ob21lL3VzZXJuYW1lL3Njb3Bp ZmllciIpCitgYGAKKworYGBgcnVieQorIyEvdXNyL2Jpbi9lbnYgcnVieQorZGVmIHNjb3BpZmll cihjb2RlKQorICAgICMgUGFyc2UgY29kZS4KKyAgICAjIFJldHVybiBhbiBhcnJheS4KK2VuZAor cHJpbnQgc2NvcGlmaWVyIEFSR0YucmVhZAorYGBgCisKK1tsaW50ZXJdOiBodHRwOi8vanNoaW50 LmNvbS9hYm91dC8KK1tmbHljaGVja106IGh0dHA6Ly93d3cuZmx5Y2hlY2sub3JnLworW3plbmJ1 cm5dOiBodHRwOi8vZ2l0aHViLmNvbS9iYmF0c292L3plbmJ1cm4tZW1hY3MKK1twb2ludF06IGh0 dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9lbWFjcy9tYW51YWwvaHRtbF9ub2RlL2VsaXNwL1Bv aW50Lmh0bWwKK1tqczItbW9kZV06IGh0dHBzOi8vZ2l0aHViLmNvbS9tb296L2pzMi1tb2RlCitb bm9kZV06IGh0dHA6Ly9ub2RlanMub3JnL2Rvd25sb2FkLworW2xvYWQgcGF0aF06IGh0dHBzOi8v d3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbWFjcy9MaXNwLUxp YnJhcmllcy5odG1sCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNo bWFyay9jb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay5lbCBiL3BhY2thZ2VzL2NvbnRleHQtY29s b3JpbmcvYmVuY2htYXJrL2NvbnRleHQtY29sb3JpbmctYmVuY2htYXJrLmVsCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGI2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNr YWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9jb250ZXh0LWNvbG9yaW5nLWJlbmNobWFy ay5lbApAQCAtMCwwICsxLDE2MCBAQAorOzs7IGJlbmNobWFyay9jb250ZXh0LWNvbG9yaW5nLWJl bmNobWFyay5lbCAtLS0gQmVuY2htYXJrcyBmb3IgY29udGV4dCBjb2xvcmluZy4gLSotIGxleGlj YWwtYmluZGluZzogdDsgLSotCisKKzs7IENvcHlyaWdodCAoQykgMjAxNC0yMDE1ICBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVt YWNzLgorCis7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCis7OyBUaGlzIHByb2dyYW0gaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzs7IGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m Cis7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlCis7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorCis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNl ZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKzs7OyBDb2RlOgorCisoZGVmY29u c3QgY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstcGF0aAorICAoZmlsZS1uYW1lLWRpcmVjdG9y eSAob3IgbG9hZC1maWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpCisgICJUaGlzIGZpbGUncyBk aXJlY3RvcnkuIikKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctYmVuY2htYXJrLXJlc29sdmUt cGF0aCAocGF0aCkKKyAgIlJlc29sdmUgUEFUSCBmcm9tIHRoaXMgZmlsZSdzIGRpcmVjdG9yeS4i CisgIChleHBhbmQtZmlsZS1uYW1lIHBhdGggY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstcGF0 aCkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay1sb2ctcmVzdWx0cyAocmVz dWx0LWZpbGUgZml4dHVyZSkKKyAgIkxvZyBiZW5jaG1hcmtpbmcgcmVzdWx0cyBmb3IgRklYVFVS RSB0byBSRVNVTFQtRklMRS4iCisgIChlbHAtcmVzdWx0cykKKyAgKGxldCAoKHJlc3VsdHMtYnVm ZmVyIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAoaW5z ZXJ0IChjb25jYXQgZml4dHVyZSAiXG4iKSkKKyAgICAgIChwcmVwZW5kLXRvLWJ1ZmZlciByZXN1 bHRzLWJ1ZmZlciAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkpCisgICAgKHdpdGgtdGVtcC1idWZm ZXIKKyAgICAgIChpbnNlcnQgIlxuIikKKyAgICAgIChhcHBlbmQtdG8tYnVmZmVyIHJlc3VsdHMt YnVmZmVyIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkpCisgIChtYWtlLWRpcmVjdG9yeSAoY29u dGV4dC1jb2xvcmluZy1iZW5jaG1hcmstcmVzb2x2ZS1wYXRoICIuL2xvZ3MiKSB0KQorICAoYXBw ZW5kLXRvLWZpbGUgbmlsIG5pbCByZXN1bHQtZmlsZSkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9y aW5nLWJlbmNobWFyay1uZXh0LXRpY2sgKGZ1bmN0aW9uKQorICAiRGVmZXIgZXhlY3V0aW9uIG9m IEZVTkNUSU9OIHRvIGNsZWFyIHRoZSBzdGFjayBhbmQgdG8gZW5zdXJlCithc3luY2hyb255LiIK KyAgKHJ1bi1hdC10aW1lIDAuMDAxIG5pbCBmdW5jdGlvbikpCisKKyhkZWZ1biBjb250ZXh0LWNv bG9yaW5nLWJlbmNobWFyay1uZXh0IChsaXN0IGNvbnRpbnVlIHN0b3ApCisgICJSdW4gdGhlIG5l eHQgdGVzdCBpbiBMSVNUIGJ5IGNhbGxpbmcgQ09OVElOVUUuICBXaGVuIExJU1QgaXMKK2V4aGF1 c3RlZCwgY2FsbCBTVE9QIGluc3RlYWQuIgorICAoaWYgKG51bGwgbGlzdCkKKyAgICAgIChjb250 ZXh0LWNvbG9yaW5nLWJlbmNobWFyay1uZXh0LXRpY2sgc3RvcCkKKyAgICAoY29udGV4dC1jb2xv cmluZy1iZW5jaG1hcmstbmV4dC10aWNrCisgICAgIChsYW1iZGEgKCkKKyAgICAgICAoZnVuY2Fs bAorICAgICAgICBjb250aW51ZQorICAgICAgICAoY2FyIGxpc3QpCisgICAgICAgIChsYW1iZGEg KCkKKyAgICAgICAgICAoY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstbmV4dCAoY2RyIGxpc3Qp IGNvbnRpbnVlIHN0b3ApKSkpKSkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFy ay1hc3luYyAodGl0bGUgc2V0dXAgdGVhcmRvd24gZml4dHVyZXMgY2FsbGJhY2spCisgICJNZWFz dXJlIHRoZSBwZXJmb3JtYW5jZSBvZiBhbGwgRklYVFVSRVMsIGNhbGxpbmcgQ0FMTEJBQ0sgd2hl bgorYWxsIGFyZSBkb25lLiIKKyAgKGZ1bmNhbGwgc2V0dXApCisgIChsZXQgKChyZXN1bHQtZmls ZSAoY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstcmVzb2x2ZS1wYXRoCisgICAgICAgICAgICAg ICAgICAgICAgKGZvcm1hdCAiLi9sb2dzL3Jlc3VsdHMtJXMtJXMubG9nIgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdGl0bGUgKGZvcm1hdC10aW1lLXN0cmluZyAiJXMiKSkpKSkKKyAg ICAoY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstbmV4dAorICAgICBmaXh0dXJlcworICAgICAo bGFtYmRhIChwYXRoIG5leHQpCisgICAgICAgKGxldCAoKGZpeHR1cmUgKGNvbnRleHQtY29sb3Jp bmctYmVuY2htYXJrLXJlc29sdmUtcGF0aCBwYXRoKSkKKyAgICAgICAgICAgICBhZHZpY2UpCisg ICAgICAgICAoc2V0cQorICAgICAgICAgIGFkdmljZQorICAgICAgICAgIChsZXQgKChjb3VudCAw KSkKKyAgICAgICAgICAgIChsYW1iZGEgKG9yaWdpbmFsLWZ1bmN0aW9uKQorICAgICAgICAgICAg ICAoZnVuY2FsbAorICAgICAgICAgICAgICAgb3JpZ2luYWwtZnVuY3Rpb24KKyAgICAgICAgICAg ICAgIChsYW1iZGEgKCkKKyAgICAgICAgICAgICAgICAgKHNldHEgY291bnQgKCsgY291bnQgMSkp CisgICAgICAgICAgICAgICAgIDs7IFRlc3QgNSB0aW1lcy4KKyAgICAgICAgICAgICAgICAgKGlm ICg9IGNvdW50IDUpCisgICAgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAg ICAgICAgICAgKGFkdmljZS1yZW1vdmUgJ2NvbnRleHQtY29sb3JpbmctY29sb3JpemUgYWR2aWNl KQorICAgICAgICAgICAgICAgICAgICAgICAoa2lsbC1idWZmZXIpCisgICAgICAgICAgICAgICAg ICAgICAgIChjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay1sb2ctcmVzdWx0cworICAgICAgICAg ICAgICAgICAgICAgICAgcmVzdWx0LWZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpeHR1 cmUpCisgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIG5leHQpKQorICAgICAgICAgICAg ICAgICAgIChmdW5jYWxsICdjb250ZXh0LWNvbG9yaW5nLWNvbG9yaXplKSkpKSkpKQorICAgICAg ICAgKGFkdmljZS1hZGQgJ2NvbnRleHQtY29sb3JpbmctY29sb3JpemUgOmFyb3VuZCBhZHZpY2Up CisgICAgICAgICAoZmluZC1maWxlIGZpeHR1cmUpKSkKKyAgICAgKGxhbWJkYSAoKQorICAgICAg IChmdW5jYWxsIHRlYXJkb3duKQorICAgICAgIChpZiBjYWxsYmFjayAoZnVuY2FsbCBjYWxsYmFj aykpKSkpKQorCisoZGVmY29uc3QgY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstanMtZml4dHVy ZXMKKyAgJygiLi9maXh0dXJlcy9qcXVlcnktMi4xLjEuanMiCisgICAgIi4vZml4dHVyZXMvbG9k YXNoLTIuNC4xLmpzIgorICAgICIuL2ZpeHR1cmVzL2FzeW5jLTAuOS4wLmpzIgorICAgICIuL2Zp eHR1cmVzL21rZGlycC0wLjUuMC5qcyIpCisgICJBcmJpdHJhcnkgSmF2YVNjcmlwdCBmaWxlcyBm b3IgcGVyZm9ybWFuY2Ugc2NydXRpbnkuIikKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctYmVu Y2htYXJrLWpzLW1vZGUtc2V0dXAgKCkKKyAgIlByZXBhcmF0aW9uIGxvZ2ljIGZvciBganMtbW9k ZScuIgorICAoYWRkLWhvb2sgJ2pzLW1vZGUtaG9vayAnY29udGV4dC1jb2xvcmluZy1tb2RlKQor ICAoZWxwLWluc3RydW1lbnQtcGFja2FnZSAiY29udGV4dC1jb2xvcmluZy0iKSkKKworKGRlZnVu IGNvbnRleHQtY29sb3JpbmctYmVuY2htYXJrLWpzLW1vZGUtdGVhcmRvd24gKCkKKyAgIkNsZWFu dXAgbG9naWMgZm9yIGBqcy1tb2RlJy4iCisgIChyZW1vdmUtaG9vayAnanMtbW9kZS1ob29rICdj b250ZXh0LWNvbG9yaW5nLW1vZGUpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1iZW5jaG1h cmstanMtbW9kZS1ydW4gKGNhbGxiYWNrKQorICAiQmVuY2htYXJrIGBqcy1tb2RlJywgdGhlbiBj YWxsIENBTExCQUNLLiIKKyAgKGNvbnRleHQtY29sb3JpbmctYmVuY2htYXJrLWFzeW5jCisgICAi anMtbW9kZSIKKyAgICdjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay1qcy1tb2RlLXNldHVwCisg ICAnY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstanMtbW9kZS10ZWFyZG93bgorICAgY29udGV4 dC1jb2xvcmluZy1iZW5jaG1hcmstanMtZml4dHVyZXMKKyAgIGNhbGxiYWNrKSkKKworKGRlZnVu IGNvbnRleHQtY29sb3JpbmctYmVuY2htYXJrLWpzMi1tb2RlLXNldHVwICgpCisgICJQcmVwYXJh dGlvbiBsb2dpYyBmb3IgYGpzMi1tb2RlJy4iCisgIChyZXF1aXJlICdqczItbW9kZSkKKyAgKHNl dHEganMyLW1vZGUtc2hvdy1wYXJzZS1lcnJvcnMgbmlsKQorICAoc2V0cSBqczItbW9kZS1zaG93 LXN0cmljdC13YXJuaW5ncyBuaWwpCisgIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICco IlxcLmpzXFwnIiAuIGpzMi1tb2RlKSkKKyAgKGFkZC1ob29rICdqczItbW9kZS1ob29rICdjb250 ZXh0LWNvbG9yaW5nLW1vZGUpCisgIChlbHAtaW5zdHJ1bWVudC1wYWNrYWdlICJjb250ZXh0LWNv bG9yaW5nLSIpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstanMyLW1vZGUt dGVhcmRvd24gKCkKKyAgIkNsZWFudXAgbG9naWMgZm9yIGBqczItbW9kZScuIgorICAocmVtb3Zl LWhvb2sgJ2pzMi1tb2RlLWhvb2sgJ2NvbnRleHQtY29sb3JpbmctbW9kZSkKKyAgKHNldHEgYXV0 by1tb2RlLWFsaXN0IChkZWxldGUgJygiXFwuanNcXCciIC4ganMyLW1vZGUpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGF1dG8tbW9kZS1hbGlzdCkpCisgIChzZXRxIGpzMi1tb2Rl LXNob3ctc3RyaWN0LXdhcm5pbmdzIHQpCisgIChzZXRxIGpzMi1tb2RlLXNob3ctcGFyc2UtZXJy b3JzIHQpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstanMyLW1vZGUtcnVu IChjYWxsYmFjaykKKyAgIkJlbmNobWFyayBganMyLW1vZGUnLCB0aGVuIGNhbGwgQ0FMTEJBQ0su IgorICAoY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstYXN5bmMKKyAgICJqczItbW9kZSIKKyAg ICdjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyay1qczItbW9kZS1zZXR1cAorICAgJ2NvbnRleHQt Y29sb3JpbmctYmVuY2htYXJrLWpzMi1tb2RlLXRlYXJkb3duCisgICBjb250ZXh0LWNvbG9yaW5n LWJlbmNobWFyay1qcy1maXh0dXJlcworICAgY2FsbGJhY2spKQorCisoZGVmdW4gY29udGV4dC1j b2xvcmluZy1iZW5jaG1hcmstcnVuICgpCisgICJCZW5jaG1hcmsgYWxsIG1vZGVzLCB0aGVuIGV4 aXQuIgorICAoY29udGV4dC1jb2xvcmluZy1iZW5jaG1hcmstbmV4dAorICAgJyhjb250ZXh0LWNv bG9yaW5nLWJlbmNobWFyay1qcy1tb2RlLXJ1bgorICAgICBjb250ZXh0LWNvbG9yaW5nLWJlbmNo bWFyay1qczItbW9kZS1ydW4pCisgICAobGFtYmRhIChmdW5jdGlvbiBuZXh0KQorICAgICAoZnVu Y2FsbCBmdW5jdGlvbiBuZXh0KSkKKyAgIChsYW1iZGEgKCkKKyAgICAgKGtpbGwtZW1hY3MpKSkp CisKKyhwcm92aWRlICdjb250ZXh0LWNvbG9yaW5nLWJlbmNobWFyaykKKworOzs7IGNvbnRleHQt Y29sb3JpbmctYmVuY2htYXJrLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvY29u dGV4dC1jb2xvcmluZy9iZW5jaG1hcmsvZml4dHVyZXMvLmRpci1sb2NhbHMuZWwgYi9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy8uZGlyLWxvY2Fscy5lbApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q1ZTk3Ci0tLSAvZGV2L251bGwKKysr IGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9iZW5jaG1hcmsvZml4dHVyZXMvLmRpci1sb2Nh bHMuZWwKQEAgLTAsMCArMSBAQAorKChuaWwgLiAoKGJ1ZmZlci1yZWFkLW9ubHkgLiB0KSkpKQpk aWZmIC0tZ2l0IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9iZW5jaG1hcmsvZml4dHVyZXMv YXN5bmMtMC45LjAuanMgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0 dXJlcy9hc3luYy0wLjkuMC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4w MWU4YWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9iZW5j aG1hcmsvZml4dHVyZXMvYXN5bmMtMC45LjAuanMKQEAgLTAsMCArMSwxMTIzIEBACisvKiEKKyAq IGFzeW5jCisgKiBodHRwczovL2dpdGh1Yi5jb20vY2FvbGFuL2FzeW5jCisgKgorICogQ29weXJp Z2h0IDIwMTAtMjAxNCBDYW9sYW4gTWNNYWhvbgorICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBs aWNlbnNlCisgKi8KKy8qanNoaW50IG9uZXZhcjogZmFsc2UsIGluZGVudDo0ICovCisvKmdsb2Jh bCBzZXRJbW1lZGlhdGU6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgY29uc29sZTogZmFsc2Ug Ki8KKyhmdW5jdGlvbiAoKSB7CisKKyAgICB2YXIgYXN5bmMgPSB7fTsKKworICAgIC8vIGdsb2Jh bCBvbiB0aGUgc2VydmVyLCB3aW5kb3cgaW4gdGhlIGJyb3dzZXIKKyAgICB2YXIgcm9vdCwgcHJl dmlvdXNfYXN5bmM7CisKKyAgICByb290ID0gdGhpczsKKyAgICBpZiAocm9vdCAhPSBudWxsKSB7 CisgICAgICBwcmV2aW91c19hc3luYyA9IHJvb3QuYXN5bmM7CisgICAgfQorCisgICAgYXN5bmMu bm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcm9vdC5hc3luYyA9IHByZXZpb3Vz X2FzeW5jOworICAgICAgICByZXR1cm4gYXN5bmM7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIG9u bHlfb25jZShmbikgeworICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7CisgICAgICAgIHJldHVy biBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChjYWxsZWQpIHRocm93IG5ldyBFcnJvcigi Q2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkLiIpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1 ZTsKKyAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAg ICB9CisKKyAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8v CisKKyAgICB2YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKworICAg IHZhciBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKG9iaikgeworICAgICAg ICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJzsKKyAgICB9 OworCisgICAgdmFyIF9lYWNoID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHsKKyAgICAgICAg aWYgKGFyci5mb3JFYWNoKSB7CisgICAgICAgICAgICByZXR1cm4gYXJyLmZvckVhY2goaXRlcmF0 b3IpOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsg aSArPSAxKSB7CisgICAgICAgICAgICBpdGVyYXRvcihhcnJbaV0sIGksIGFycik7CisgICAgICAg IH0KKyAgICB9OworCisgICAgdmFyIF9tYXAgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvcikgewor ICAgICAgICBpZiAoYXJyLm1hcCkgeworICAgICAgICAgICAgcmV0dXJuIGFyci5tYXAoaXRlcmF0 b3IpOworICAgICAgICB9CisgICAgICAgIHZhciByZXN1bHRzID0gW107CisgICAgICAgIF9lYWNo KGFyciwgZnVuY3Rpb24gKHgsIGksIGEpIHsKKyAgICAgICAgICAgIHJlc3VsdHMucHVzaChpdGVy YXRvcih4LCBpLCBhKSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAg ICB9OworCisgICAgdmFyIF9yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgbWVtbykg eworICAgICAgICBpZiAoYXJyLnJlZHVjZSkgeworICAgICAgICAgICAgcmV0dXJuIGFyci5yZWR1 Y2UoaXRlcmF0b3IsIG1lbW8pOworICAgICAgICB9CisgICAgICAgIF9lYWNoKGFyciwgZnVuY3Rp b24gKHgsIGksIGEpIHsKKyAgICAgICAgICAgIG1lbW8gPSBpdGVyYXRvcihtZW1vLCB4LCBpLCBh KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBtZW1vOworICAgIH07CisKKyAgICB2YXIg X2tleXMgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIGlmIChPYmplY3Qua2V5cykgeworICAg ICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7CisgICAgICAgIH0KKyAgICAgICAgdmFy IGtleXMgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHsKKyAgICAgICAgICAgIGlm IChvYmouaGFzT3duUHJvcGVydHkoaykpIHsKKyAgICAgICAgICAgICAgICBrZXlzLnB1c2goayk7 CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtleXM7CisgICAgfTsK KworICAgIC8vLy8gZXhwb3J0ZWQgYXN5bmMgbW9kdWxlIGZ1bmN0aW9ucyAvLy8vCisKKyAgICAv Ly8vIG5leHRUaWNrIGltcGxlbWVudGF0aW9uIHdpdGggYnJvd3Nlci1jb21wYXRpYmxlIGZhbGxi YWNrIC8vLy8KKyAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8ICEocHJv Y2Vzcy5uZXh0VGljaykpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdm dW5jdGlvbicpIHsKKyAgICAgICAgICAgIGFzeW5jLm5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7 CisgICAgICAgICAgICAgICAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIGZvciBJRTEwIGNvbXBhdGli aWxpdHkKKyAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOworICAgICAgICAgICAgfTsK KyAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrOworICAgICAg ICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlv biAoZm4pIHsKKyAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTsKKyAgICAgICAgICAg IH07CisgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUgPSBhc3luYy5uZXh0VGljazsKKyAg ICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBwcm9j ZXNzLm5leHRUaWNrOworICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVm aW5lZCcpIHsKKyAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIChmbikg eworICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJp bGl0eQorICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZm4pOworICAgICAgICAgICAgfTsKKyAg ICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9 IGFzeW5jLm5leHRUaWNrOworICAgICAgICB9CisgICAgfQorCisgICAgYXN5bmMuZWFjaCA9IGZ1 bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjayA9IGNh bGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OworICAgICAgICBpZiAoIWFyci5sZW5ndGgpIHsKKyAg ICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZhciBjb21w bGV0ZWQgPSAwOworICAgICAgICBfZWFjaChhcnIsIGZ1bmN0aW9uICh4KSB7CisgICAgICAgICAg ICBpdGVyYXRvcih4LCBvbmx5X29uY2UoZG9uZSkgKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZ1 bmN0aW9uIGRvbmUoZXJyKSB7CisgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICBj YWxsYmFjayhlcnIpOworICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9Owor ICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgY29tcGxldGVkICs9 IDE7CisgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgeworICAgICAg ICAgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgIH07CisgICAgYXN5bmMuZm9yRWFjaCA9IGFzeW5jLmVhY2g7CisKKyAgICBh c3luYy5lYWNoU2VyaWVzID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7Cisg ICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CisgICAgICAgIGlm ICghYXJyLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAg IH0KKyAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CisgICAgICAgIHZhciBpdGVyYXRlID0gZnVu Y3Rpb24gKCkgeworICAgICAgICAgICAgaXRlcmF0b3IoYXJyW2NvbXBsZXRlZF0sIGZ1bmN0aW9u IChlcnIpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAg IGNhbGxiYWNrKGVycik7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24g KCkge307CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAg ICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNv bXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFj aygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2Ugewor ICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICAg IGl0ZXJhdGUoKTsKKyAgICB9OworICAgIGFzeW5jLmZvckVhY2hTZXJpZXMgPSBhc3luYy5lYWNo U2VyaWVzOworCisgICAgYXN5bmMuZWFjaExpbWl0ID0gZnVuY3Rpb24gKGFyciwgbGltaXQsIGl0 ZXJhdG9yLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgZm4gPSBfZWFjaExpbWl0KGxpbWl0KTsK KyAgICAgICAgZm4uYXBwbHkobnVsbCwgW2FyciwgaXRlcmF0b3IsIGNhbGxiYWNrXSk7CisgICAg fTsKKyAgICBhc3luYy5mb3JFYWNoTGltaXQgPSBhc3luYy5lYWNoTGltaXQ7CisKKyAgICB2YXIg X2VhY2hMaW1pdCA9IGZ1bmN0aW9uIChsaW1pdCkgeworCisgICAgICAgIHJldHVybiBmdW5jdGlv biAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrID0gY2Fs bGJhY2sgfHwgZnVuY3Rpb24gKCkge307CisgICAgICAgICAgICBpZiAoIWFyci5sZW5ndGggfHwg bGltaXQgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOworICAgICAg ICAgICAgfQorICAgICAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CisgICAgICAgICAgICB2YXIg c3RhcnRlZCA9IDA7CisgICAgICAgICAgICB2YXIgcnVubmluZyA9IDA7CisKKyAgICAgICAgICAg IChmdW5jdGlvbiByZXBsZW5pc2ggKCkgeworICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQg Pj0gYXJyLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsK KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxp bWl0ICYmIHN0YXJ0ZWQgPCBhcnIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0 ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZyArPSAxOworICAgICAgICAgICAg ICAgICAgICBpdGVyYXRvcihhcnJbc3RhcnRlZCAtIDFdLCBmdW5jdGlvbiAoZXJyKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY2FsbGJhY2soZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9 IGZ1bmN0aW9uICgpIHt9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVk ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyAtPSAxOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkgeworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGVuaXNoKCk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg ICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSgpOworICAgICAgICB9 OworICAgIH07CisKKworICAgIHZhciBkb1BhcmFsbGVsID0gZnVuY3Rpb24gKGZuKSB7CisgICAg ICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnBy b3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICAgICAgICByZXR1cm4gZm4uYXBw bHkobnVsbCwgW2FzeW5jLmVhY2hdLmNvbmNhdChhcmdzKSk7CisgICAgICAgIH07CisgICAgfTsK KyAgICB2YXIgZG9QYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24obGltaXQsIGZuKSB7CisgICAgICAg IHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3Rv dHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHko bnVsbCwgW19lYWNoTGltaXQobGltaXQpXS5jb25jYXQoYXJncykpOworICAgICAgICB9OworICAg IH07CisgICAgdmFyIGRvU2VyaWVzID0gZnVuY3Rpb24gKGZuKSB7CisgICAgICAgIHJldHVybiBm dW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGlj ZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW2Fz eW5jLmVhY2hTZXJpZXNdLmNvbmNhdChhcmdzKSk7CisgICAgICAgIH07CisgICAgfTsKKworCisg ICAgdmFyIF9hc3luY01hcCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxi YWNrKSB7CisgICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkgeworICAgICAg ICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9OworICAgICAgICB9KTsKKyAgICAgICAg aWYgKCFjYWxsYmFjaykgeworICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNh bGxiYWNrKSB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKGVy cikgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgICAg IH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIg cmVzdWx0cyA9IFtdOworICAgICAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxi YWNrKSB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKGVyciwg dikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3guaW5kZXhdID0gdjsKKyAgICAgICAg ICAgICAgICAgICAgY2FsbGJhY2soZXJyKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAg ICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJl c3VsdHMpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9OworICAgIGFzeW5jLm1h cCA9IGRvUGFyYWxsZWwoX2FzeW5jTWFwKTsKKyAgICBhc3luYy5tYXBTZXJpZXMgPSBkb1Nlcmll cyhfYXN5bmNNYXApOworICAgIGFzeW5jLm1hcExpbWl0ID0gZnVuY3Rpb24gKGFyciwgbGltaXQs IGl0ZXJhdG9yLCBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gX21hcExpbWl0KGxpbWl0KShh cnIsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CisgICAgfTsKKworICAgIHZhciBfbWFwTGltaXQgPSBm dW5jdGlvbihsaW1pdCkgeworICAgICAgICByZXR1cm4gZG9QYXJhbGxlbExpbWl0KGxpbWl0LCBf YXN5bmNNYXApOworICAgIH07CisKKyAgICAvLyByZWR1Y2Ugb25seSBoYXMgYSBzZXJpZXMgdmVy c2lvbiwgYXMgZG9pbmcgcmVkdWNlIGluIHBhcmFsbGVsIHdvbid0CisgICAgLy8gd29yayBpbiBt YW55IHNpdHVhdGlvbnMuCisgICAgYXN5bmMucmVkdWNlID0gZnVuY3Rpb24gKGFyciwgbWVtbywg aXRlcmF0b3IsIGNhbGxiYWNrKSB7CisgICAgICAgIGFzeW5jLmVhY2hTZXJpZXMoYXJyLCBmdW5j dGlvbiAoeCwgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yKG1lbW8sIHgsIGZ1bmN0 aW9uIChlcnIsIHYpIHsKKyAgICAgICAgICAgICAgICBtZW1vID0gdjsKKyAgICAgICAgICAgICAg ICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChl cnIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbWVtbyk7CisgICAgICAgIH0pOworICAg IH07CisgICAgLy8gaW5qZWN0IGFsaWFzCisgICAgYXN5bmMuaW5qZWN0ID0gYXN5bmMucmVkdWNl OworICAgIC8vIGZvbGRsIGFsaWFzCisgICAgYXN5bmMuZm9sZGwgPSBhc3luYy5yZWR1Y2U7CisK KyAgICBhc3luYy5yZWR1Y2VSaWdodCA9IGZ1bmN0aW9uIChhcnIsIG1lbW8sIGl0ZXJhdG9yLCBj YWxsYmFjaykgeworICAgICAgICB2YXIgcmV2ZXJzZWQgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgp IHsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9KS5yZXZlcnNlKCk7CisgICAgICAg IGFzeW5jLnJlZHVjZShyZXZlcnNlZCwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKTsKKyAgICB9 OworICAgIC8vIGZvbGRyIGFsaWFzCisgICAgYXN5bmMuZm9sZHIgPSBhc3luYy5yZWR1Y2VSaWdo dDsKKworICAgIHZhciBfZmlsdGVyID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwg Y2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICAgICAgYXJyID0gX21h cChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7CisgICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2 YWx1ZTogeH07CisgICAgICAgIH0pOworICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwg Y2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yKHgudmFsdWUsIGZ1bmN0aW9uICh2KSB7 CisgICAgICAgICAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5w dXNoKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwor ICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAg IGNhbGxiYWNrKF9tYXAocmVzdWx0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAg ICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OworICAgICAgICAgICAgfSksIGZ1bmN0aW9u ICh4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7CisgICAgICAgICAgICB9KSk7 CisgICAgICAgIH0pOworICAgIH07CisgICAgYXN5bmMuZmlsdGVyID0gZG9QYXJhbGxlbChfZmls dGVyKTsKKyAgICBhc3luYy5maWx0ZXJTZXJpZXMgPSBkb1NlcmllcyhfZmlsdGVyKTsKKyAgICAv LyBzZWxlY3QgYWxpYXMKKyAgICBhc3luYy5zZWxlY3QgPSBhc3luYy5maWx0ZXI7CisgICAgYXN5 bmMuc2VsZWN0U2VyaWVzID0gYXN5bmMuZmlsdGVyU2VyaWVzOworCisgICAgdmFyIF9yZWplY3Qg PSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgeworICAgICAgICB2 YXIgcmVzdWx0cyA9IFtdOworICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkp IHsKKyAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTsKKyAgICAgICAgfSk7 CisgICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykgeworICAgICAgICAg ICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHsKKyAgICAgICAgICAgICAgICBpZiAo IXYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHgpOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgfSk7CisgICAg ICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKF9tYXAocmVzdWx0 cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXgg LSBiLmluZGV4OworICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh4KSB7CisgICAgICAgICAgICAg ICAgcmV0dXJuIHgudmFsdWU7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0pOworICAgIH07 CisgICAgYXN5bmMucmVqZWN0ID0gZG9QYXJhbGxlbChfcmVqZWN0KTsKKyAgICBhc3luYy5yZWpl Y3RTZXJpZXMgPSBkb1NlcmllcyhfcmVqZWN0KTsKKworICAgIHZhciBfZGV0ZWN0ID0gZnVuY3Rp b24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgbWFpbl9jYWxsYmFjaykgeworICAgICAgICBlYWNo Zm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yKHgs IGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAg ICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2soeCk7CisgICAgICAgICAgICAgICAgICAgIG1h aW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsK KyAgICAgICAgICAgIG1haW5fY2FsbGJhY2soKTsKKyAgICAgICAgfSk7CisgICAgfTsKKyAgICBh c3luYy5kZXRlY3QgPSBkb1BhcmFsbGVsKF9kZXRlY3QpOworICAgIGFzeW5jLmRldGVjdFNlcmll cyA9IGRvU2VyaWVzKF9kZXRlY3QpOworCisgICAgYXN5bmMuc29tZSA9IGZ1bmN0aW9uIChhcnIs IGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CisgICAgICAgIGFzeW5jLmVhY2goYXJyLCBmdW5j dGlvbiAoeCwgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uICh2 KSB7CisgICAgICAgICAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFpbl9j YWxsYmFjayh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0 aW9uICgpIHt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjaygp OworICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAg ICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOworICAgICAgICB9KTsKKyAgICB9OworICAgIC8vIGFu eSBhbGlhcworICAgIGFzeW5jLmFueSA9IGFzeW5jLnNvbWU7CisKKyAgICBhc3luYy5ldmVyeSA9 IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7CisgICAgICAgIGFzeW5j LmVhY2goYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ZXJhdG9y KHgsIGZ1bmN0aW9uICh2KSB7CisgICAgICAgICAgICAgICAgaWYgKCF2KSB7CisgICAgICAgICAg ICAgICAgICAgIG1haW5fY2FsbGJhY2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtYWlu X2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24g KGVycikgeworICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfSk7Cisg ICAgfTsKKyAgICAvLyBhbGwgYWxpYXMKKyAgICBhc3luYy5hbGwgPSBhc3luYy5ldmVyeTsKKwor ICAgIGFzeW5jLnNvcnRCeSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykgewor ICAgICAgICBhc3luYy5tYXAoYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHsKKyAgICAgICAg ICAgIGl0ZXJhdG9yKHgsIGZ1bmN0aW9uIChlcnIsIGNyaXRlcmlhKSB7CisgICAgICAgICAgICAg ICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg Y2FsbGJhY2sobnVsbCwge3ZhbHVlOiB4LCBjcml0ZXJpYTogY3JpdGVyaWF9KTsKKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24gKGVyciwgcmVz dWx0cykgeworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIHJldHVybiBj YWxsYmFjayhlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAg ICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7CisgICAgICAgICAgICAg ICAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYSwgYiA9IHJpZ2h0LmNyaXRlcmlhOworICAgICAg ICAgICAgICAgICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7CisgICAgICAg ICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBfbWFwKHJlc3VsdHMu c29ydChmbiksIGZ1bmN0aW9uICh4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4LnZh bHVlOworICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7Cisg ICAgfTsKKworICAgIGFzeW5jLmF1dG8gPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7Cisg ICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CisgICAgICAgIHZh ciBrZXlzID0gX2tleXModGFza3MpOworICAgICAgICB2YXIgcmVtYWluaW5nVGFza3MgPSBrZXlz Lmxlbmd0aAorICAgICAgICBpZiAoIXJlbWFpbmluZ1Rhc2tzKSB7CisgICAgICAgICAgICByZXR1 cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXN1bHRzID0ge307CisK KyAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOworICAgICAgICB2YXIgYWRkTGlzdGVuZXIgPSBm dW5jdGlvbiAoZm4pIHsKKyAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGZuKTsKKyAgICAg ICAgfTsKKyAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGZuKSB7CisgICAg ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkgKz0gMSkgewor ICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGZuKSB7CisgICAgICAgICAgICAg ICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAg IHZhciB0YXNrQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICByZW1haW5pbmdU YXNrcy0tCisgICAgICAgICAgICBfZWFjaChsaXN0ZW5lcnMuc2xpY2UoMCksIGZ1bmN0aW9uIChm bikgeworICAgICAgICAgICAgICAgIGZuKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsK KworICAgICAgICBhZGRMaXN0ZW5lcihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAoIXJl bWFpbmluZ1Rhc2tzKSB7CisgICAgICAgICAgICAgICAgdmFyIHRoZUNhbGxiYWNrID0gY2FsbGJh Y2s7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBmaW5hbCBjYWxsYmFjayBmcm9tIGNhbGxp bmcgaXRzZWxmIGlmIGl0IGVycm9ycworICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rp b24gKCkge307CisKKyAgICAgICAgICAgICAgICB0aGVDYWxsYmFjayhudWxsLCByZXN1bHRzKTsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgX2VhY2goa2V5cywgZnVuY3Rp b24gKGspIHsKKyAgICAgICAgICAgIHZhciB0YXNrID0gX2lzQXJyYXkodGFza3Nba10pID8gdGFz a3Nba106IFt0YXNrc1trXV07CisgICAgICAgICAgICB2YXIgdGFza0NhbGxiYWNrID0gZnVuY3Rp b24gKGVycikgeworICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNs aWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGgg PD0gMSkgeworICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICB2 YXIgc2FmZVJlc3VsdHMgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgX2VhY2goX2tleXMocmVz dWx0cyksIGZ1bmN0aW9uKHJrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVSZXN1 bHRzW3JrZXldID0gcmVzdWx0c1tya2V5XTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAg ICAgICAgICAgICAgICAgIHNhZmVSZXN1bHRzW2tdID0gYXJnczsKKyAgICAgICAgICAgICAgICAg ICAgY2FsbGJhY2soZXJyLCBzYWZlUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0 b3Agc3Vic2VxdWVudCBlcnJvcnMgaGl0dGluZyBjYWxsYmFjayBtdWx0aXBsZSB0aW1lcworICAg ICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0 c1trXSA9IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSh0YXNr Q29tcGxldGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAg ICB2YXIgcmVxdWlyZXMgPSB0YXNrLnNsaWNlKDAsIE1hdGguYWJzKHRhc2subGVuZ3RoIC0gMSkp IHx8IFtdOworICAgICAgICAgICAgdmFyIHJlYWR5ID0gZnVuY3Rpb24gKCkgeworICAgICAgICAg ICAgICAgIHJldHVybiBfcmVkdWNlKHJlcXVpcmVzLCBmdW5jdGlvbiAoYSwgeCkgeworICAgICAg ICAgICAgICAgICAgICByZXR1cm4gKGEgJiYgcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eSh4KSk7Cisg ICAgICAgICAgICAgICAgfSwgdHJ1ZSkgJiYgIXJlc3VsdHMuaGFzT3duUHJvcGVydHkoayk7Cisg ICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKHJlYWR5KCkpIHsKKyAgICAgICAgICAgICAg ICB0YXNrW3Rhc2subGVuZ3RoIC0gMV0odGFza0NhbGxiYWNrLCByZXN1bHRzKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9 IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KCkpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMp OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAg ICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwor ICAgIH07CisKKyAgICBhc3luYy5yZXRyeSA9IGZ1bmN0aW9uKHRpbWVzLCB0YXNrLCBjYWxsYmFj aykgeworICAgICAgICB2YXIgREVGQVVMVF9USU1FUyA9IDU7CisgICAgICAgIHZhciBhdHRlbXB0 cyA9IFtdOworICAgICAgICAvLyBVc2UgZGVmYXVsdHMgaWYgdGltZXMgbm90IHBhc3NlZAorICAg ICAgICBpZiAodHlwZW9mIHRpbWVzID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICBjYWxs YmFjayA9IHRhc2s7CisgICAgICAgICAgICB0YXNrID0gdGltZXM7CisgICAgICAgICAgICB0aW1l cyA9IERFRkFVTFRfVElNRVM7CisgICAgICAgIH0KKyAgICAgICAgLy8gTWFrZSBzdXJlIHRpbWVz IGlzIGEgbnVtYmVyCisgICAgICAgIHRpbWVzID0gcGFyc2VJbnQodGltZXMsIDEwKSB8fCBERUZB VUxUX1RJTUVTOworICAgICAgICB2YXIgd3JhcHBlZFRhc2sgPSBmdW5jdGlvbih3cmFwcGVkQ2Fs bGJhY2ssIHdyYXBwZWRSZXN1bHRzKSB7CisgICAgICAgICAgICB2YXIgcmV0cnlBdHRlbXB0ID0g ZnVuY3Rpb24odGFzaywgZmluYWxBdHRlbXB0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1 bmN0aW9uKHNlcmllc0NhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHRhc2soZnVuY3Rp b24oZXJyLCByZXN1bHQpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzQ2FsbGJhY2so IWVyciB8fCBmaW5hbEF0dGVtcHQsIHtlcnI6IGVyciwgcmVzdWx0OiByZXN1bHR9KTsKKyAgICAg ICAgICAgICAgICAgICAgfSwgd3JhcHBlZFJlc3VsdHMpOworICAgICAgICAgICAgICAgIH07Cisg ICAgICAgICAgICB9OworICAgICAgICAgICAgd2hpbGUgKHRpbWVzKSB7CisgICAgICAgICAgICAg ICAgYXR0ZW1wdHMucHVzaChyZXRyeUF0dGVtcHQodGFzaywgISh0aW1lcy09MSkpKTsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIGFzeW5jLnNlcmllcyhhdHRlbXB0cywgZnVuY3Rpb24oZG9u ZSwgZGF0YSl7CisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXTsK KyAgICAgICAgICAgICAgICAod3JhcHBlZENhbGxiYWNrIHx8IGNhbGxiYWNrKShkYXRhLmVyciwg ZGF0YS5yZXN1bHQpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYg YSBjYWxsYmFjayBpcyBwYXNzZWQsIHJ1biB0aGlzIGFzIGEgY29udHJvbGwgZmxvdworICAgICAg ICByZXR1cm4gY2FsbGJhY2sgPyB3cmFwcGVkVGFzaygpIDogd3JhcHBlZFRhc2sKKyAgICB9Owor CisgICAgYXN5bmMud2F0ZXJmYWxsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykgeworICAg ICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9OworICAgICAgICBpZiAo IV9pc0FycmF5KHRhc2tzKSkgeworICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0ZpcnN0 IGFyZ3VtZW50IHRvIHdhdGVyZmFsbCBtdXN0IGJlIGFuIGFycmF5IG9mIGZ1bmN0aW9ucycpOwor ICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpOworICAgICAgICB9CisgICAgICAgIGlmICgh dGFza3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAg fQorICAgICAgICB2YXIgd3JhcEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7CisgICAg ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycikgeworICAgICAgICAgICAgICAgIGlmIChlcnIp IHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsK KyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAg ICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZh ciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICAg ICAgICAgICAgICAgICAgdmFyIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAg ICAgICAgIGlmIChuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god3Jh cEl0ZXJhdG9yKG5leHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7 CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1t ZWRpYXRlKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFw cGx5KG51bGwsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICB9OworICAgICAgICB9OworICAgICAgICB3cmFwSXRlcmF0b3IoYXN5 bmMuaXRlcmF0b3IodGFza3MpKSgpOworICAgIH07CisKKyAgICB2YXIgX3BhcmFsbGVsID0gZnVu Y3Rpb24oZWFjaGZuLCB0YXNrcywgY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2sgPSBjYWxs YmFjayB8fCBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAgaWYgKF9pc0FycmF5KHRhc2tzKSkgewor ICAgICAgICAgICAgZWFjaGZuLm1hcCh0YXNrcywgZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykgewor ICAgICAgICAgICAgICAgIGlmIChmbikgeworICAgICAgICAgICAgICAgICAgICBmbihmdW5jdGlv biAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3Rv dHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBp ZiAoYXJncy5sZW5ndGggPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Mg PSBhcmdzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg ICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBlcnIsIGFyZ3MpOworICAgICAgICAgICAgICAgICAg ICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCBjYWxsYmFjayk7CisgICAg ICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OworICAg ICAgICAgICAgZWFjaGZuLmVhY2goX2tleXModGFza3MpLCBmdW5jdGlvbiAoaywgY2FsbGJhY2sp IHsKKyAgICAgICAgICAgICAgICB0YXNrc1trXShmdW5jdGlvbiAoZXJyKSB7CisgICAgICAgICAg ICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRz LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDEpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOworICAgICAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNba10gPSBhcmdzOworICAgICAgICAgICAgICAg ICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSwg ZnVuY3Rpb24gKGVycikgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7 CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBhc3luYy5wYXJhbGxl bCA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHsKKyAgICAgICAgX3BhcmFsbGVsKHsgbWFw OiBhc3luYy5tYXAsIGVhY2g6IGFzeW5jLmVhY2ggfSwgdGFza3MsIGNhbGxiYWNrKTsKKyAgICB9 OworCisgICAgYXN5bmMucGFyYWxsZWxMaW1pdCA9IGZ1bmN0aW9uKHRhc2tzLCBsaW1pdCwgY2Fs bGJhY2spIHsKKyAgICAgICAgX3BhcmFsbGVsKHsgbWFwOiBfbWFwTGltaXQobGltaXQpLCBlYWNo OiBfZWFjaExpbWl0KGxpbWl0KSB9LCB0YXNrcywgY2FsbGJhY2spOworICAgIH07CisKKyAgICBh c3luYy5zZXJpZXMgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxi YWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307CisgICAgICAgIGlmIChfaXNBcnJheSh0 YXNrcykpIHsKKyAgICAgICAgICAgIGFzeW5jLm1hcFNlcmllcyh0YXNrcywgZnVuY3Rpb24gKGZu LCBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGlmIChmbikgeworICAgICAgICAgICAgICAg ICAgICBmbihmdW5jdGlvbiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJn cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBlcnIsIGFyZ3MpOworICAg ICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCBj YWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YXIgcmVz dWx0cyA9IHt9OworICAgICAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhfa2V5cyh0YXNrcyksIGZ1 bmN0aW9uIChrLCBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9u IChlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUu c2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5s ZW5ndGggPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07Cisg ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFy Z3M7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CisgICAgICAgICAgICAgICAg fSk7CisgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7CisgICAgICAgICAgICAgICAgY2Fs bGJhY2soZXJyLCByZXN1bHRzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfTsK KworICAgIGFzeW5jLml0ZXJhdG9yID0gZnVuY3Rpb24gKHRhc2tzKSB7CisgICAgICAgIHZhciBt YWtlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICAgICAgICAgIHZhciBmbiA9IGZ1 bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoKSB7CisgICAgICAg ICAgICAgICAgICAgIHRhc2tzW2luZGV4XS5hcHBseShudWxsLCBhcmd1bWVudHMpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZm4ubmV4dCgpOworICAgICAgICAg ICAgfTsKKyAgICAgICAgICAgIGZuLm5leHQgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAg ICAgcmV0dXJuIChpbmRleCA8IHRhc2tzLmxlbmd0aCAtIDEpID8gbWFrZUNhbGxiYWNrKGluZGV4 ICsgMSk6IG51bGw7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIGZuOworICAg ICAgICB9OworICAgICAgICByZXR1cm4gbWFrZUNhbGxiYWNrKDApOworICAgIH07CisKKyAgICBh c3luYy5hcHBseSA9IGZ1bmN0aW9uIChmbikgeworICAgICAgICB2YXIgYXJncyA9IEFycmF5LnBy b3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICAgIHJldHVybiBmdW5jdGlv biAoKSB7CisgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoCisgICAgICAgICAgICAgICAgbnVs bCwgYXJncy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkKKyAg ICAgICAgICAgICk7CisgICAgICAgIH07CisgICAgfTsKKworICAgIHZhciBfY29uY2F0ID0gZnVu Y3Rpb24gKGVhY2hmbiwgYXJyLCBmbiwgY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHIgPSBbXTsK KyAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNiKSB7CisgICAgICAgICAgICBmbih4 LCBmdW5jdGlvbiAoZXJyLCB5KSB7CisgICAgICAgICAgICAgICAgciA9IHIuY29uY2F0KHkgfHwg W10pOworICAgICAgICAgICAgICAgIGNiKGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAg fSwgZnVuY3Rpb24gKGVycikgeworICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByKTsKKyAgICAg ICAgfSk7CisgICAgfTsKKyAgICBhc3luYy5jb25jYXQgPSBkb1BhcmFsbGVsKF9jb25jYXQpOwor ICAgIGFzeW5jLmNvbmNhdFNlcmllcyA9IGRvU2VyaWVzKF9jb25jYXQpOworCisgICAgYXN5bmMu d2hpbHN0ID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykgeworICAgICAgICBp ZiAodGVzdCgpKSB7CisgICAgICAgICAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyKSB7CisgICAg ICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJh Y2soZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXN5bmMud2hpbHN0 KHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQor ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICB9 OworCisgICAgYXN5bmMuZG9XaGlsc3QgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxi YWNrKSB7CisgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGlm IChlcnIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo YXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGlmICh0ZXN0LmFwcGx5KG51bGwsIGFyZ3MpKSB7 CisgICAgICAgICAgICAgICAgYXN5bmMuZG9XaGlsc3QoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNr KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNh bGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH07CisKKyAgICBhc3lu Yy51bnRpbCA9IGZ1bmN0aW9uICh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spIHsKKyAgICAgICAg aWYgKCF0ZXN0KCkpIHsKKyAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKKyAg ICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxs YmFjayhlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3luYy51bnRp bCh0ZXN0LCBpdGVyYXRvciwgY2FsbGJhY2spOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0K KyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB9CisgICAg fTsKKworICAgIGFzeW5jLmRvVW50aWwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHRlc3QsIGNhbGxi YWNrKSB7CisgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgICAgICAgIGlm IChlcnIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo YXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGlmICghdGVzdC5hcHBseShudWxsLCBhcmdzKSkg eworICAgICAgICAgICAgICAgIGFzeW5jLmRvVW50aWwoaXRlcmF0b3IsIHRlc3QsIGNhbGxiYWNr KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNh bGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH07CisKKyAgICBhc3lu Yy5xdWV1ZSA9IGZ1bmN0aW9uICh3b3JrZXIsIGNvbmN1cnJlbmN5KSB7CisgICAgICAgIGlmIChj b25jdXJyZW5jeSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBjb25jdXJyZW5jeSA9IDE7 CisgICAgICAgIH0KKyAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwb3MsIGNhbGxi YWNrKSB7CisgICAgICAgICAgaWYgKCFxLnN0YXJ0ZWQpeworICAgICAgICAgICAgcS5zdGFydGVk ID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfaXNBcnJheShkYXRhKSkgewor ICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihk YXRhLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgLy8gY2FsbCBkcmFpbiBpbW1lZGlhdGVs eSBpZiB0aGVyZSBhcmUgbm8gdGFza3MKKyAgICAgICAgICAgICByZXR1cm4gYXN5bmMuc2V0SW1t ZWRpYXRlKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICBpZiAocS5kcmFpbikgeworICAg ICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOworICAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICAgIF9lYWNoKGRhdGEsIGZ1bmN0aW9uKHRh c2spIHsKKyAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CisgICAgICAgICAgICAgICAgICBkYXRh OiB0YXNrLAorICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHR5cGVvZiBjYWxsYmFjayA9PT0g J2Z1bmN0aW9uJyA/IGNhbGxiYWNrIDogbnVsbAorICAgICAgICAgICAgICB9OworCisgICAgICAg ICAgICAgIGlmIChwb3MpIHsKKyAgICAgICAgICAgICAgICBxLnRhc2tzLnVuc2hpZnQoaXRlbSk7 CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcS50YXNrcy5wdXNoKGl0 ZW0pOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHEuc2F0dXJhdGVkICYm IHEudGFza3MubGVuZ3RoID09PSBxLmNvbmN1cnJlbmN5KSB7CisgICAgICAgICAgICAgICAgICBx LnNhdHVyYXRlZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGFzeW5jLnNldElt bWVkaWF0ZShxLnByb2Nlc3MpOworICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAg dmFyIHdvcmtlcnMgPSAwOworICAgICAgICB2YXIgcSA9IHsKKyAgICAgICAgICAgIHRhc2tzOiBb XSwKKyAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBjb25jdXJyZW5jeSwKKyAgICAgICAgICAgIHNh dHVyYXRlZDogbnVsbCwKKyAgICAgICAgICAgIGVtcHR5OiBudWxsLAorICAgICAgICAgICAgZHJh aW46IG51bGwsCisgICAgICAgICAgICBzdGFydGVkOiBmYWxzZSwKKyAgICAgICAgICAgIHBhdXNl ZDogZmFsc2UsCisgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsK KyAgICAgICAgICAgICAgX2luc2VydChxLCBkYXRhLCBmYWxzZSwgY2FsbGJhY2spOworICAgICAg ICAgICAgfSwKKyAgICAgICAgICAgIGtpbGw6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAg cS5kcmFpbiA9IG51bGw7CisgICAgICAgICAgICAgIHEudGFza3MgPSBbXTsKKyAgICAgICAgICAg IH0sCisgICAgICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2spIHsKKyAg ICAgICAgICAgICAgX2luc2VydChxLCBkYXRhLCB0cnVlLCBjYWxsYmFjayk7CisgICAgICAgICAg ICB9LAorICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAg IGlmICghcS5wYXVzZWQgJiYgd29ya2VycyA8IHEuY29uY3VycmVuY3kgJiYgcS50YXNrcy5sZW5n dGgpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBxLnRhc2tzLnNoaWZ0KCk7Cisg ICAgICAgICAgICAgICAgICAgIGlmIChxLmVtcHR5ICYmIHEudGFza3MubGVuZ3RoID09PSAwKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICBxLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgICAgICAgICAgd29ya2VycyArPSAxOworICAgICAgICAgICAgICAgICAg ICB2YXIgbmV4dCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtl cnMgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbGxiYWNrKSB7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5jYWxsYmFjay5hcHBseSh0YXNrLCBhcmd1 bWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKHEuZHJhaW4gJiYgcS50YXNrcy5sZW5ndGggKyB3b3JrZXJzID09PSAwKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOworICAgICAgICAgICAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcS5wcm9jZXNzKCk7CisgICAgICAgICAgICAg ICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IG9ubHlfb25jZShuZXh0KTsK KyAgICAgICAgICAgICAgICAgICAgd29ya2VyKHRhc2suZGF0YSwgY2IpOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHsK KyAgICAgICAgICAgICAgICByZXR1cm4gcS50YXNrcy5sZW5ndGg7CisgICAgICAgICAgICB9LAor ICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHJldHVy biB3b3JrZXJzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGlkbGU6IGZ1bmN0aW9uKCkg eworICAgICAgICAgICAgICAgIHJldHVybiBxLnRhc2tzLmxlbmd0aCArIHdvcmtlcnMgPT09IDA7 CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uICgpIHsKKyAgICAg ICAgICAgICAgICBpZiAocS5wYXVzZWQgPT09IHRydWUpIHsgcmV0dXJuOyB9CisgICAgICAgICAg ICAgICAgcS5wYXVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHEucHJvY2VzcygpOworICAg ICAgICAgICAgfSwKKyAgICAgICAgICAgIHJlc3VtZTogZnVuY3Rpb24gKCkgeworICAgICAgICAg ICAgICAgIGlmIChxLnBhdXNlZCA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9CisgICAgICAgICAgICAg ICAgcS5wYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBxLnByb2Nlc3MoKTsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfTsKKyAgICAKKyAg ICBhc3luYy5wcmlvcml0eVF1ZXVlID0gZnVuY3Rpb24gKHdvcmtlciwgY29uY3VycmVuY3kpIHsK KyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIF9jb21wYXJlVGFza3MoYSwgYil7CisgICAgICAg ICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5OworICAgICAgICB9OworICAgICAgICAK KyAgICAgICAgZnVuY3Rpb24gX2JpbmFyeVNlYXJjaChzZXF1ZW5jZSwgaXRlbSwgY29tcGFyZSkg eworICAgICAgICAgIHZhciBiZWcgPSAtMSwKKyAgICAgICAgICAgICAgZW5kID0gc2VxdWVuY2Uu bGVuZ3RoIC0gMTsKKyAgICAgICAgICB3aGlsZSAoYmVnIDwgZW5kKSB7CisgICAgICAgICAgICB2 YXIgbWlkID0gYmVnICsgKChlbmQgLSBiZWcgKyAxKSA+Pj4gMSk7CisgICAgICAgICAgICBpZiAo Y29tcGFyZShpdGVtLCBzZXF1ZW5jZVttaWRdKSA+PSAwKSB7CisgICAgICAgICAgICAgIGJlZyA9 IG1pZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVuZCA9IG1pZCAtIDE7 CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBiZWc7CisgICAg ICAgIH0KKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnQocSwgZGF0YSwgcHJpb3Jp dHksIGNhbGxiYWNrKSB7CisgICAgICAgICAgaWYgKCFxLnN0YXJ0ZWQpeworICAgICAgICAgICAg cS5zdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfaXNBcnJheShk YXRhKSkgeworICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOworICAgICAgICAgIH0KKyAgICAg ICAgICBpZihkYXRhLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgLy8gY2FsbCBkcmFpbiBp bW1lZGlhdGVseSBpZiB0aGVyZSBhcmUgbm8gdGFza3MKKyAgICAgICAgICAgICByZXR1cm4gYXN5 bmMuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICBpZiAocS5kcmFp bikgeworICAgICAgICAgICAgICAgICAgICAgcS5kcmFpbigpOworICAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICAgIF9lYWNoKGRhdGEsIGZ1 bmN0aW9uKHRhc2spIHsKKyAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CisgICAgICAgICAgICAg ICAgICBkYXRhOiB0YXNrLAorICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5LAor ICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9u JyA/IGNhbGxiYWNrIDogbnVsbAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAKKyAg ICAgICAgICAgICAgcS50YXNrcy5zcGxpY2UoX2JpbmFyeVNlYXJjaChxLnRhc2tzLCBpdGVtLCBf Y29tcGFyZVRhc2tzKSArIDEsIDAsIGl0ZW0pOworCisgICAgICAgICAgICAgIGlmIChxLnNhdHVy YXRlZCAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gcS5jb25jdXJyZW5jeSkgeworICAgICAgICAgICAg ICAgICAgcS5zYXR1cmF0ZWQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhc3lu Yy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAg ICAgICAKKyAgICAgICAgLy8gU3RhcnQgd2l0aCBhIG5vcm1hbCBxdWV1ZQorICAgICAgICB2YXIg cSA9IGFzeW5jLnF1ZXVlKHdvcmtlciwgY29uY3VycmVuY3kpOworICAgICAgICAKKyAgICAgICAg Ly8gT3ZlcnJpZGUgcHVzaCB0byBhY2NlcHQgc2Vjb25kIHBhcmFtZXRlciByZXByZXNlbnRpbmcg cHJpb3JpdHkKKyAgICAgICAgcS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIHByaW9yaXR5LCBjYWxs YmFjaykgeworICAgICAgICAgIF9pbnNlcnQocSwgZGF0YSwgcHJpb3JpdHksIGNhbGxiYWNrKTsK KyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIC8vIFJlbW92ZSB1bnNoaWZ0IGZ1bmN0aW9u CisgICAgICAgIGRlbGV0ZSBxLnVuc2hpZnQ7CisKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfTsK KworICAgIGFzeW5jLmNhcmdvID0gZnVuY3Rpb24gKHdvcmtlciwgcGF5bG9hZCkgeworICAgICAg ICB2YXIgd29ya2luZyAgICAgPSBmYWxzZSwKKyAgICAgICAgICAgIHRhc2tzICAgICAgID0gW107 CisKKyAgICAgICAgdmFyIGNhcmdvID0geworICAgICAgICAgICAgdGFza3M6IHRhc2tzLAorICAg ICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCwKKyAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCwK KyAgICAgICAgICAgIGVtcHR5OiBudWxsLAorICAgICAgICAgICAgZHJhaW46IG51bGwsCisgICAg ICAgICAgICBkcmFpbmVkOiB0cnVlLAorICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEs IGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfaXNBcnJheShkYXRhKSkgeworICAg ICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdOworICAgICAgICAgICAgICAgIH0KKyAgICAg ICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7CisgICAgICAgICAgICAgICAg ICAgIHRhc2tzLnB1c2goeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzaywKKyAg ICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5j dGlvbicgPyBjYWxsYmFjayA6IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAg ICAgICAgICAgICAgIGNhcmdvLmRyYWluZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAg aWYgKGNhcmdvLnNhdHVyYXRlZCAmJiB0YXNrcy5sZW5ndGggPT09IHBheWxvYWQpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgIGNhcmdvLnNhdHVyYXRlZCgpOworICAgICAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRp YXRlKGNhcmdvLnByb2Nlc3MpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHByb2Nlc3M6 IGZ1bmN0aW9uIHByb2Nlc3MoKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcpIHJldHVy bjsKKyAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAg ICAgICAgICAgIGlmKGNhcmdvLmRyYWluICYmICFjYXJnby5kcmFpbmVkKSBjYXJnby5kcmFpbigp OworICAgICAgICAgICAgICAgICAgICBjYXJnby5kcmFpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAg ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZh ciB0cyA9IHR5cGVvZiBwYXlsb2FkID09PSAnbnVtYmVyJworICAgICAgICAgICAgICAgICAgICAg ICAgICAgID8gdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOiB0YXNrcy5zcGxpY2UoMCwgdGFza3MubGVuZ3RoKTsKKworICAgICAgICAgICAgICAg IHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7CisgICAgICAgICAgICAgICAgICAg IHJldHVybiB0YXNrLmRhdGE7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAg ICBpZihjYXJnby5lbXB0eSkgY2FyZ28uZW1wdHkoKTsKKyAgICAgICAgICAgICAgICB3b3JraW5n ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHsKKyAgICAg ICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIHZh ciBhcmdzID0gYXJndW1lbnRzOworICAgICAgICAgICAgICAgICAgICBfZWFjaCh0cywgZnVuY3Rp b24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jYWxsYmFjay5hcHBseShudWxsLCBh cmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7 CisKKyAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpOworICAgICAgICAgICAgICAgIH0pOwor ICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkgeworICAgICAg ICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7CisgICAgICAgICAgICB9LAorICAgICAgICAg ICAgcnVubmluZzogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5n OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZXR1cm4gY2FyZ287CisgICAg fTsKKworICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgIHJl dHVybiBmdW5jdGlvbiAoZm4pIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90 eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGZuLmFwcGx5KG51bGws IGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7CisgICAgICAgICAgICAgICAgdmFyIGFyZ3Mg PSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAg ICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAg ICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJy b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7Cisg ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zb2xlW25hbWVdKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAg ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9XSkpOwor ICAgICAgICB9OworICAgIH07CisgICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpOwor ICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTsKKyAgICAvKmFzeW5jLmluZm8gPSBf Y29uc29sZV9mbignaW5mbycpOworICAgIGFzeW5jLndhcm4gPSBfY29uc29sZV9mbignd2Fybicp OworICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki8KKworICAgIGFzeW5j Lm1lbW9pemUgPSBmdW5jdGlvbiAoZm4sIGhhc2hlcikgeworICAgICAgICB2YXIgbWVtbyA9IHt9 OworICAgICAgICB2YXIgcXVldWVzID0ge307CisgICAgICAgIGhhc2hlciA9IGhhc2hlciB8fCBm dW5jdGlvbiAoeCkgeworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH07CisgICAgICAg IHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gQXJy YXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHZhciBjYWxs YmFjayA9IGFyZ3MucG9wKCk7CisgICAgICAgICAgICB2YXIga2V5ID0gaGFzaGVyLmFwcGx5KG51 bGwsIGFyZ3MpOworICAgICAgICAgICAgaWYgKGtleSBpbiBtZW1vKSB7CisgICAgICAgICAgICAg ICAgYXN5bmMubmV4dFRpY2soZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICBjYWxs YmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAg ICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykgeworICAgICAgICAg ICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdOwor ICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7 CisgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50czsKKyAgICAgICAgICAg ICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRl IHF1ZXVlc1trZXldOworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEu bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgcVtpXS5hcHBseShu dWxsLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg fV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbWVtb2l6ZWQubWVtbyA9 IG1lbW87CisgICAgICAgIG1lbW9pemVkLnVubWVtb2l6ZWQgPSBmbjsKKyAgICAgICAgcmV0dXJu IG1lbW9pemVkOworICAgIH07CisKKyAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4p IHsKKyAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAoZm4udW5tZW1v aXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKKyAgICAgIH07CisgICAgfTsKKwor ICAgIGFzeW5jLnRpbWVzID0gZnVuY3Rpb24gKGNvdW50LCBpdGVyYXRvciwgY2FsbGJhY2spIHsK KyAgICAgICAgdmFyIGNvdW50ZXIgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBj b3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb3VudGVyLnB1c2goaSk7CisgICAgICAgIH0KKyAg ICAgICAgcmV0dXJuIGFzeW5jLm1hcChjb3VudGVyLCBpdGVyYXRvciwgY2FsbGJhY2spOworICAg IH07CisKKyAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3Is IGNhbGxiYWNrKSB7CisgICAgICAgIHZhciBjb3VudGVyID0gW107CisgICAgICAgIGZvciAodmFy IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgY291bnRlci5wdXNoKGkpOwor ICAgICAgICB9CisgICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0 b3IsIGNhbGxiYWNrKTsKKyAgICB9OworCisgICAgYXN5bmMuc2VxID0gZnVuY3Rpb24gKC8qIGZ1 bmN0aW9ucy4uLiAqLykgeworICAgICAgICB2YXIgZm5zID0gYXJndW1lbnRzOworICAgICAgICBy ZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOworICAgICAg ICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwor ICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTsKKyAgICAgICAgICAgIGFzeW5j LnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHsKKyAgICAgICAg ICAgICAgICBmbi5hcHBseSh0aGF0LCBuZXdhcmdzLmNvbmNhdChbZnVuY3Rpb24gKCkgeworICAg ICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgICAg ICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMs IDEpOworICAgICAgICAgICAgICAgICAgICBjYihlcnIsIG5leHRhcmdzKTsKKyAgICAgICAgICAg ICAgICB9XSkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVz dWx0cykgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNh dChyZXN1bHRzKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAg YXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHsKKyAgICAgIHJl dHVybiBhc3luYy5zZXEuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChh cmd1bWVudHMpKTsKKyAgICB9OworCisgICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFj aGZuLCBmbnMgLyphcmdzLi4uKi8pIHsKKyAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkgewor ICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJh eS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOworICAgICAgICAgICAgdmFyIGNhbGxi YWNrID0gYXJncy5wb3AoKTsKKyAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlv biAoZm4sIGNiKSB7CisgICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncy5jb25jYXQo W2NiXSkpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGNhbGxiYWNrKTsKKyAgICAgICAg fTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICB2YXIg YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CisgICAgICAg ICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxz ZSB7CisgICAgICAgICAgICByZXR1cm4gZ287CisgICAgICAgIH0KKyAgICB9OworICAgIGFzeW5j LmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7CisgICAgYXN5bmMuYXBwbHlFYWNo U2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7CisKKyAgICBhc3luYy5mb3JldmVyID0gZnVu Y3Rpb24gKGZuLCBjYWxsYmFjaykgeworICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikgeworICAg ICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeworICAg ICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsKKyAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAg Zm4obmV4dCk7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCgpOworICAgIH07CisKKyAgICAvLyBO b2RlLmpzCisgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5l eHBvcnRzKSB7CisgICAgICAgIG1vZHVsZS5leHBvcnRzID0gYXN5bmM7CisgICAgfQorICAgIC8v IEFNRCAvIFJlcXVpcmVKUworICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmlu ZWQnICYmIGRlZmluZS5hbWQpIHsKKyAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7Cisg ICAgICAgICAgICByZXR1cm4gYXN5bmM7CisgICAgICAgIH0pOworICAgIH0KKyAgICAvLyBpbmNs dWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnCisgICAgZWxzZSB7CisgICAgICAgIHJvb3Qu YXN5bmMgPSBhc3luYzsKKyAgICB9CisKK30oKSk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9jb250 ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9qcXVlcnktMi4xLjEuanMgYi9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9qcXVlcnktMi4xLjEuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3YjNkMwotLS0gL2Rldi9udWxsCisr KyBiL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvYmVuY2htYXJrL2ZpeHR1cmVzL2pxdWVyeS0y LjEuMS5qcwpAQCAtMCwwICsxLDkxOTAgQEAKKy8qIQorICogalF1ZXJ5IEphdmFTY3JpcHQgTGli cmFyeSB2Mi4xLjEKKyAqIGh0dHA6Ly9qcXVlcnkuY29tLworICoKKyAqIEluY2x1ZGVzIFNpenps ZS5qcworICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSwgMjAx NCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxl YXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UK KyAqCisgKiBEYXRlOiAyMDE0LTA1LTAxVDE3OjExWgorICovCisKKyhmdW5jdGlvbiggZ2xvYmFs LCBmYWN0b3J5ICkgeworCisJaWYgKCB0eXBlb2YgbW9kdWxlID09PSAib2JqZWN0IiAmJiB0eXBl b2YgbW9kdWxlLmV4cG9ydHMgPT09ICJvYmplY3QiICkgeworCQkvLyBGb3IgQ29tbW9uSlMgYW5k IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIHdpbmRvdyBpcyBwcmVz ZW50LAorCQkvLyBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5CisJCS8vIEZvciBl bnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaW5oZXJlbnRseSBwb3NzZXMgYSB3aW5kb3cgd2l0aCBh IGRvY3VtZW50CisJCS8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBqUXVlcnktbWFraW5n IGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMKKwkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVl ZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCB3aW5kb3cKKwkJLy8gZS5nLiB2YXIgalF1ZXJ5 ID0gcmVxdWlyZSgianF1ZXJ5Iikod2luZG93KTsKKwkJLy8gU2VlIHRpY2tldCAjMTQ1NDkgZm9y IG1vcmUgaW5mbworCQltb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/CisJCQlmYWN0 b3J5KCBnbG9iYWwsIHRydWUgKSA6CisJCQlmdW5jdGlvbiggdyApIHsKKwkJCQlpZiAoICF3LmRv Y3VtZW50ICkgeworCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5k b3cgd2l0aCBhIGRvY3VtZW50IiApOworCQkJCX0KKwkJCQlyZXR1cm4gZmFjdG9yeSggdyApOwor CQkJfTsKKwl9IGVsc2UgeworCQlmYWN0b3J5KCBnbG9iYWwgKTsKKwl9CisKKy8vIFBhc3MgdGhp cyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0Cit9KHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRl ZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CisK Ky8vIENhbid0IGRvIHRoaXMgYmVjYXVzZSBzZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQg dHJhY2UKKy8vIHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVm b3ggZGllcyBpZgorLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoICJ1c2Ugc3RyaWN0IiBjYWxs IGNoYWlucy4gKCMxMzMzNSkKKy8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrCisvLworCit2YXIgYXJy ID0gW107CisKK3ZhciBzbGljZSA9IGFyci5zbGljZTsKKwordmFyIGNvbmNhdCA9IGFyci5jb25j YXQ7CisKK3ZhciBwdXNoID0gYXJyLnB1c2g7CisKK3ZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7 CisKK3ZhciBjbGFzczJ0eXBlID0ge307CisKK3ZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9T dHJpbmc7CisKK3ZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5OworCit2YXIg c3VwcG9ydCA9IHt9OworCisKKwordmFyCisJLy8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFj Y29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KQorCWRvY3VtZW50ID0gd2lu ZG93LmRvY3VtZW50LAorCisJdmVyc2lvbiA9ICIyLjEuMSIsCisKKwkvLyBEZWZpbmUgYSBsb2Nh bCBjb3B5IG9mIGpRdWVyeQorCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCAp IHsKKwkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25z dHJ1Y3RvciAnZW5oYW5jZWQnCisJCS8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChq dXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpCisJCXJldHVybiBu ZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CisJfSwKKworCS8vIFN1cHBv cnQ6IEFuZHJvaWQ8NC4xCisJLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQCisJcnRy aW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csCisKKwkvLyBNYXRjaGVz IGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKKwlybXNQcmVmaXggPSAvXi1tcy0vLAorCXJk YXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwKKworCS8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2Fz ZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKKwlmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwg bGV0dGVyICkgeworCQlyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CisJfTsKKworalF1ZXJ5 LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpR dWVyeSBiZWluZyB1c2VkCisJanF1ZXJ5OiB2ZXJzaW9uLAorCisJY29uc3RydWN0b3I6IGpRdWVy eSwKKworCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKKwlzZWxlY3RvcjogIiIsCisK KwkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKKwlsZW5ndGg6 IDAsCisKKwl0b0FycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMg KTsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50 IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFu IGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVtICkgeworCQlyZXR1cm4gbnVtICE9IG51bGwgPwor CisJCQkvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0CisJCQkoIG51 bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6CisKKwkJ CS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKKwkJCXNsaWNlLmNh bGwoIHRoaXMgKTsKKwl9LAorCisJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVz aCBpdCBvbnRvIHRoZSBzdGFjaworCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1l bnQgc2V0KQorCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgeworCisJCS8vIEJ1aWxkIGEg bmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJCXZhciByZXQgPSBqUXVlcnkubWVyZ2Uo IHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKKworCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qg b250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQorCQlyZXQucHJldk9iamVjdCA9IHRoaXM7 CisJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OworCisJCS8vIFJldHVybiB0aGUgbmV3bHkt Zm9ybWVkIGVsZW1lbnQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIEV4ZWN1dGUgYSBj YWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisJLy8gKFlvdSBj YW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywgYnV0IHRoaXMgaXMK KwkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCisJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBh cmdzICkgeworCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7CisJ fSwKKworCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3Rh Y2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CisJCQlyZXR1cm4gY2Fs bGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOworCQl9KSk7CisJfSwKKworCXNsaWNlOiBmdW5j dGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJn dW1lbnRzICkgKTsKKwl9LAorCisJZmlyc3Q6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5l cSggMCApOworCX0sCisKKwlsYXN0OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZXEoIC0x ICk7CisJfSwKKworCWVxOiBmdW5jdGlvbiggaSApIHsKKwkJdmFyIGxlbiA9IHRoaXMubGVuZ3Ro LAorCQkJaiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTsKKwkJcmV0dXJuIHRoaXMucHVzaFN0 YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKKwl9LAorCisJZW5k OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVj dG9yKG51bGwpOworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJLy8gQmVoYXZl cyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCisJcHVz aDogcHVzaCwKKwlzb3J0OiBhcnIuc29ydCwKKwlzcGxpY2U6IGFyci5zcGxpY2UKK307CisKK2pR dWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7CisJdmFyIG9wdGlv bnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLAorCQl0YXJnZXQgPSBhcmd1 bWVudHNbMF0gfHwge30sCisJCWkgPSAxLAorCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAor CQlkZWVwID0gZmFsc2U7CisKKwkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCisJaWYg KCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CisJCWRlZXAgPSB0YXJnZXQ7CisKKwkJ Ly8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAorCQl0YXJnZXQgPSBhcmd1bWVudHNb IGkgXSB8fCB7fTsKKwkJaSsrOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlz IGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQorCWlmICggdHlw ZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7 CisJCXRhcmdldCA9IHt9OworCX0KKworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkg b25lIGFyZ3VtZW50IGlzIHBhc3NlZAorCWlmICggaSA9PT0gbGVuZ3RoICkgeworCQl0YXJnZXQg PSB0aGlzOworCQlpLS07CisJfQorCisJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCS8v IE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9u cyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgeworCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9i amVjdAorCQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQkJCXNyYyA9IHRhcmdldFsgbmFt ZSBdOworCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisKKwkJCQkvLyBQcmV2ZW50IG5ldmVy LWVuZGluZyBsb29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CisJCQkJCWNvbnRpbnVl OworCQkJCX0KKworCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3Rz IG9yIGFycmF5cworCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmpl Y3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CisJ CQkJCWlmICggY29weUlzQXJyYXkgKSB7CisJCQkJCQljb3B5SXNBcnJheSA9IGZhbHNlOworCQkJ CQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOworCisJCQkJ CX0gZWxzZSB7CisJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMp ID8gc3JjIDoge307CisJCQkJCX0KKworCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVj dHMsIGNsb25lIHRoZW0KKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVw LCBjbG9uZSwgY29weSApOworCisJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVl cworCQkJCX0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJdGFyZ2V0WyBu YW1lIF0gPSBjb3B5OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIFJldHVybiB0aGUgbW9k aWZpZWQgb2JqZWN0CisJcmV0dXJuIHRhcmdldDsKK307CisKK2pRdWVyeS5leHRlbmQoeworCS8v IFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQorCWV4cGFuZG86ICJq UXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiAp LAorCisJLy8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGUK Kwlpc1JlYWR5OiB0cnVlLAorCisJZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7CisJCXRocm93IG5l dyBFcnJvciggbXNnICk7CisJfSwKKworCW5vb3A6IGZ1bmN0aW9uKCkge30sCisKKwkvLyBTZWUg dGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgorCS8v IFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQK KwkvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgor CWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBqUXVlcnkudHlwZShvYmop ID09PSAiZnVuY3Rpb24iOworCX0sCisKKwlpc0FycmF5OiBBcnJheS5pc0FycmF5LAorCisJaXNX aW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09 IG9iai53aW5kb3c7CisJfSwKKworCWlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHsKKwkJLy8g cGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxm YWxzZXwiIikKKwkJLy8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5n cywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoIjB4Li4uIikKKwkJLy8gc3VidHJhY3Rpb24g Zm9yY2VzIGluZmluaXRpZXMgdG8gTmFOCisJCXJldHVybiAhalF1ZXJ5LmlzQXJyYXkoIG9iaiAp ICYmIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApID49IDA7CisJfSwKKworCWlzUGxhaW5PYmplY3Q6 IGZ1bmN0aW9uKCBvYmogKSB7CisJCS8vIE5vdCBwbGFpbiBvYmplY3RzOgorCQkvLyAtIEFueSBv YmplY3Qgb3IgdmFsdWUgd2hvc2UgaW50ZXJuYWwgW1tDbGFzc11dIHByb3BlcnR5IGlzIG5vdCAi W29iamVjdCBPYmplY3RdIgorCQkvLyAtIERPTSBub2RlcworCQkvLyAtIHdpbmRvdworCQlpZiAo IGpRdWVyeS50eXBlKCBvYmogKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVy eS5pc1dpbmRvdyggb2JqICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIG9i ai5jb25zdHJ1Y3RvciAmJgorCQkJCSFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3Rv dHlwZSwgImlzUHJvdG90eXBlT2YiICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkv LyBJZiB0aGUgZnVuY3Rpb24gaGFzbid0IHJldHVybmVkIGFscmVhZHksIHdlJ3JlIGNvbmZpZGVu dCB0aGF0CisJCS8vIHxvYmp8IGlzIGEgcGxhaW4gb2JqZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNv bnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdAorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJaXNFbXB0 eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJdmFyIG5hbWU7CisJCWZvciAoIG5hbWUgaW4g b2JqICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisKKwl0 eXBlOiBmdW5jdGlvbiggb2JqICkgeworCQlpZiAoIG9iaiA9PSBudWxsICkgeworCQkJcmV0dXJu IG9iaiArICIiOworCQl9CisJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPCA0LjAsIGlPUyA8IDYgKGZ1 bmN0aW9uaXNoIFJlZ0V4cCkKKwkJcmV0dXJuIHR5cGVvZiBvYmogPT09ICJvYmplY3QiIHx8IHR5 cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgPworCQkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChv YmopIF0gfHwgIm9iamVjdCIgOgorCQkJdHlwZW9mIG9iajsKKwl9LAorCisJLy8gRXZhbHVhdGVz IGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29k ZSApIHsKKwkJdmFyIHNjcmlwdCwKKwkJCWluZGlyZWN0ID0gZXZhbDsKKworCQljb2RlID0galF1 ZXJ5LnRyaW0oIGNvZGUgKTsKKworCQlpZiAoIGNvZGUgKSB7CisJCQkvLyBJZiB0aGUgY29kZSBp bmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvbgorCQkJLy8gc3RyaWN0IG1vZGUgcHJh Z21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGEKKwkJCS8vIHNjcmlwdCB0YWcgaW50byB0 aGUgZG9jdW1lbnQuCisJCQlpZiAoIGNvZGUuaW5kZXhPZigidXNlIHN0cmljdCIpID09PSAxICkg eworCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJCXNj cmlwdC50ZXh0ID0gY29kZTsKKwkJCQlkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQg KS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCX0gZWxzZSB7CisJCQkvLyBP dGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uCisJCQkvLyBh bmQgcmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbAorCQkJCWluZGlyZWN0 KCBjb2RlICk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxD YXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlcworCS8vIE1pY3Jvc29mdCBmb3Jn b3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MikKKwljYW1lbENhc2U6IGZ1bmN0 aW9uKCBzdHJpbmcgKSB7CisJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMt IiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKwl9LAorCisJbm9kZU5hbWU6 IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVt Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTsKKwl9LAorCisJ Ly8gYXJncyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorCWVhY2g6IGZ1bmN0aW9uKCBvYmos IGNhbGxiYWNrLCBhcmdzICkgeworCQl2YXIgdmFsdWUsCisJCQlpID0gMCwKKwkJCWxlbmd0aCA9 IG9iai5sZW5ndGgsCisJCQlpc0FycmF5ID0gaXNBcnJheWxpa2UoIG9iaiApOworCisJCWlmICgg YXJncyApIHsKKwkJCWlmICggaXNBcnJheSApIHsKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkr KyApIHsKKwkJCQkJdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKKwor CQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJ fQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpIGluIG9iaiApIHsKKwkJCQkJdmFsdWUgPSBjYWxs YmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKKworCQkJCQlpZiAoIHZhbHVlID09PSBmYWxz ZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCS8vIEEgc3BlY2lh bCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0gZWxzZSB7 CisJCQlpZiAoIGlzQXJyYXkgKSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJ CQkJCXZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7CisKKwkJ CQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0K KwkJCX0gZWxzZSB7CisJCQkJZm9yICggaSBpbiBvYmogKSB7CisJCQkJCXZhbHVlID0gY2FsbGJh Y2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7CisKKwkJCQkJaWYgKCB2YWx1ZSA9PT0g ZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJl dHVybiBvYmo7CisJfSwKKworCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xCisJdHJpbTogZnVuY3Rp b24oIHRleHQgKSB7CisJCXJldHVybiB0ZXh0ID09IG51bGwgPworCQkJIiIgOgorCQkJKCB0ZXh0 ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKwl9LAorCisJLy8gcmVzdWx0cyBpcyBmb3Ig aW50ZXJuYWwgdXNhZ2Ugb25seQorCW1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyAp IHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCBhcnIgIT0gbnVsbCApIHsK KwkJCWlmICggaXNBcnJheWxpa2UoIE9iamVjdChhcnIpICkgKSB7CisJCQkJalF1ZXJ5Lm1lcmdl KCByZXQsCisJCQkJCXR5cGVvZiBhcnIgPT09ICJzdHJpbmciID8KKwkJCQkJWyBhcnIgXSA6IGFy cgorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKKwkJCX0K KwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBh cnIsIGkgKSB7CisJCXJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIs IGVsZW0sIGkgKTsKKwl9LAorCisJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewor CQl2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsCisJCQlqID0gMCwKKwkJCWkgPSBmaXJzdC5sZW5n dGg7CisKKwkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisJCQlmaXJzdFsgaSsrIF0gPSBzZWNv bmRbIGogXTsKKwkJfQorCisJCWZpcnN0Lmxlbmd0aCA9IGk7CisKKwkJcmV0dXJuIGZpcnN0Owor CX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7CisJCXZh ciBjYWxsYmFja0ludmVyc2UsCisJCQltYXRjaGVzID0gW10sCisJCQlpID0gMCwKKwkJCWxlbmd0 aCA9IGVsZW1zLmxlbmd0aCwKKwkJCWNhbGxiYWNrRXhwZWN0ID0gIWludmVydDsKKworCQkvLyBH byB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFz cyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewor CQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CisJCQlpZiAo IGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7CisJCQkJbWF0Y2hlcy5wdXNo KCBlbGVtc1sgaSBdICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWF0Y2hlczsKKwl9LAorCisJ Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJbWFwOiBmdW5jdGlvbiggZWxlbXMs IGNhbGxiYWNrLCBhcmcgKSB7CisJCXZhciB2YWx1ZSwKKwkJCWkgPSAwLAorCQkJbGVuZ3RoID0g ZWxlbXMubGVuZ3RoLAorCQkJaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBlbGVtcyApLAorCQkJcmV0 ID0gW107CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2Yg dGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXMKKwkJaWYgKCBpc0FycmF5ICkgeworCQkJZm9y ICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkg XSwgaSwgYXJnICk7CisKKwkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CisJCQkJCXJldC5wdXNo KCB2YWx1ZSApOworCQkJCX0KKwkJCX0KKworCQkvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0 aGUgb2JqZWN0LAorCQl9IGVsc2UgeworCQkJZm9yICggaSBpbiBlbGVtcyApIHsKKwkJCQl2YWx1 ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKKworCQkJCWlmICggdmFsdWUgIT0g bnVsbCApIHsKKwkJCQkJcmV0LnB1c2goIHZhbHVlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJ Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworCQlyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwg cmV0ICk7CisJfSwKKworCS8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0cworCWd1 aWQ6IDEsCisKKwkvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBh cnRpYWxseSBhcHBseWluZyBhbnkKKwkvLyBhcmd1bWVudHMuCisJcHJveHk6IGZ1bmN0aW9uKCBm biwgY29udGV4dCApIHsKKwkJdmFyIHRtcCwgYXJncywgcHJveHk7CisKKwkJaWYgKCB0eXBlb2Yg Y29udGV4dCA9PT0gInN0cmluZyIgKSB7CisJCQl0bXAgPSBmblsgY29udGV4dCBdOworCQkJY29u dGV4dCA9IGZuOworCQkJZm4gPSB0bXA7CisJCX0KKworCQkvLyBRdWljayBjaGVjayB0byBkZXRl cm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYworCQkvLyB0aGlzIHRocm93 cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgorCQlpZiAo ICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0K KworCQkvLyBTaW11bGF0ZWQgYmluZAorCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAy ICk7CisJCXByb3h5ID0gZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQg fHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKKwkJfTsK KworCQkvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3Jp Z2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1 aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CisKKwkJcmV0dXJuIHByb3h5OworCX0sCisK Kwlub3c6IERhdGUubm93LAorCisJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29y ZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCisJLy8gcHJvcGVydGllcyB0byBpdCBz byBpdCBuZWVkcyB0byBleGlzdC4KKwlzdXBwb3J0OiBzdXBwb3J0Cit9KTsKKworLy8gUG9wdWxh dGUgdGhlIGNsYXNzMnR5cGUgbWFwCitqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5n IEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSwgZnVu Y3Rpb24oaSwgbmFtZSkgeworCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBuYW1lICsgIl0iIF0g PSBuYW1lLnRvTG93ZXJDYXNlKCk7Cit9KTsKKworZnVuY3Rpb24gaXNBcnJheWxpa2UoIG9iaiAp IHsKKwl2YXIgbGVuZ3RoID0gb2JqLmxlbmd0aCwKKwkJdHlwZSA9IGpRdWVyeS50eXBlKCBvYmog KTsKKworCWlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiAp ICkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCBvYmoubm9kZVR5cGUgPT09IDEgJiYg bGVuZ3RoICkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdHlwZSA9PT0gImFycmF5 IiB8fCBsZW5ndGggPT09IDAgfHwKKwkJdHlwZW9mIGxlbmd0aCA9PT0gIm51bWJlciIgJiYgbGVu Z3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7Cit9Cit2YXIgU2l6emxlID0KKy8qIQor ICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjEuMTAuMTkKKyAqIGh0dHA6Ly9zaXp6bGVq cy5jb20vCisgKgorICogQ29weXJpZ2h0IDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5k IG90aGVyIGNvbnRyaWJ1dG9ycworICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisg KiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCisgKgorICogRGF0ZTogMjAxNC0wNC0xOAorICov CisoZnVuY3Rpb24oIHdpbmRvdyApIHsKKwordmFyIGksCisJc3VwcG9ydCwKKwlFeHByLAorCWdl dFRleHQsCisJaXNYTUwsCisJdG9rZW5pemUsCisJY29tcGlsZSwKKwlzZWxlY3QsCisJb3V0ZXJt b3N0Q29udGV4dCwKKwlzb3J0SW5wdXQsCisJaGFzRHVwbGljYXRlLAorCisJLy8gTG9jYWwgZG9j dW1lbnQgdmFycworCXNldERvY3VtZW50LAorCWRvY3VtZW50LAorCWRvY0VsZW0sCisJZG9jdW1l bnRJc0hUTUwsCisJcmJ1Z2d5UVNBLAorCXJidWdneU1hdGNoZXMsCisJbWF0Y2hlcywKKwljb250 YWlucywKKworCS8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGEKKwlleHBhbmRvID0gInNpenpsZSIg KyAtKG5ldyBEYXRlKCkpLAorCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKKwlkaXJy dW5zID0gMCwKKwlkb25lID0gMCwKKwljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwl0b2tl bkNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwljb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSwK Kwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJaWYgKCBhID09PSBiICkgeworCQkJ aGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9LAorCisJLy8gR2VuZXJh bC1wdXJwb3NlIGNvbnN0YW50cworCXN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQsCisJ TUFYX05FR0FUSVZFID0gMSA8PCAzMSwKKworCS8vIEluc3RhbmNlIG1ldGhvZHMKKwloYXNPd24g PSAoe30pLmhhc093blByb3BlcnR5LAorCWFyciA9IFtdLAorCXBvcCA9IGFyci5wb3AsCisJcHVz aF9uYXRpdmUgPSBhcnIucHVzaCwKKwlwdXNoID0gYXJyLnB1c2gsCisJc2xpY2UgPSBhcnIuc2xp Y2UsCisJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGlmIHdlIGNhbid0IHVzZSBhIG5h dGl2ZSBvbmUKKwlpbmRleE9mID0gYXJyLmluZGV4T2YgfHwgZnVuY3Rpb24oIGVsZW0gKSB7CisJ CXZhciBpID0gMCwKKwkJCWxlbiA9IHRoaXMubGVuZ3RoOworCQlmb3IgKCA7IGkgPCBsZW47IGkr KyApIHsKKwkJCWlmICggdGhpc1tpXSA9PT0gZWxlbSApIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0K KwkJfQorCQlyZXR1cm4gLTE7CisJfSwKKworCWJvb2xlYW5zID0gImNoZWNrZWR8c2VsZWN0ZWR8 YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxp c21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIiwKKworCS8v IFJlZ3VsYXIgZXhwcmVzc2lvbnMKKworCS8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8v d3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZQorCXdoaXRlc3BhY2UgPSAi W1xceDIwXFx0XFxyXFxuXFxmXSIsCisJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50 YXgvI2NoYXJhY3RlcnMKKwljaGFyYWN0ZXJFbmNvZGluZyA9ICIoPzpcXFxcLnxbXFx3LV18W15c XHgwMC1cXHhhMF0pKyIsCisKKwkvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIg Y2hhcmFjdGVycworCS8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlm aWVyIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0 b3JzCisJLy8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0 YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyCisJaWRlbnRpZmllciA9IGNoYXJhY3RlckVuY29k aW5nLnJlcGxhY2UoICJ3IiwgIncjIiApLAorCisJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0 cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCisJYXR0cmli dXRlcyA9ICJcXFsiICsgd2hpdGVzcGFjZSArICIqKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIp KD86IiArIHdoaXRlc3BhY2UgKworCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQorCQkiKihbKl4k fCF+XT89KSIgKyB3aGl0ZXNwYWNlICsKKwkJLy8gIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBD U1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1 cmUgNF0iCisJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxc XCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCisJCSIqXFxd IiwKKworCXBzZXVkb3MgPSAiOigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSg/OlxcKCgiICsK KwkJLy8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUg aW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czoKKwkJLy8gMS4gcXVvdGVkIChjYXB0 dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCisJCSIoJygoPzpcXFxcLnxbXlxcXFwnXSkq KSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCIgKworCQkvLyAyLiBzaW1wbGUgKGNhcHR1 cmUgNikKKwkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwi ICsKKwkJLy8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKQorCQkiLioiICsKKwkJIilcXCl8 KSIsCisKKwkvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBj YXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0 dGVyCisJcnRyaW0gPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIit8KCg/Ol58W15c XFxcXSkoPzpcXFxcLikqKSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICksCisKKwlyY29tbWEg PSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIg KSwKKwlyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooWz4r fl18IiArIHdoaXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCisKKwlyYXR0cmli dXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggIj0iICsgd2hpdGVzcGFjZSArICIqKFteXFxdJ1wiXSo/ KSIgKyB3aGl0ZXNwYWNlICsgIipcXF0iLCAiZyIgKSwKKworCXJwc2V1ZG8gPSBuZXcgUmVnRXhw KCBwc2V1ZG9zICksCisJcmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCAiXiIgKyBpZGVudGlmaWVy ICsgIiQiICksCisKKwltYXRjaEV4cHIgPSB7CisJCSJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsg Y2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKKwkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4o IiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCisJCSJUQUciOiBuZXcgUmVnRXhwKCAiXigi ICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyoiICkgKyAiKSIgKSwKKwkJIkFU VFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCisJCSJQU0VVRE8iOiBuZXcgUmVn RXhwKCAiXiIgKyBwc2V1ZG9zICksCisJCSJDSElMRCI6IG5ldyBSZWdFeHAoICJeOihvbmx5fGZp cnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsgd2hpdGVzcGFj ZSArCisJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIioo PzooWystXXwpIiArIHdoaXRlc3BhY2UgKworCQkJIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSAr ICIqXFwpfCkiLCAiaSIgKSwKKwkJImJvb2wiOiBuZXcgUmVnRXhwKCAiXig/OiIgKyBib29sZWFu cyArICIpJCIsICJpIiApLAorCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcg LmlzKCkKKwkJLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YAorCQki bmVlZHNDb250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqWz4rfl18Oihl dmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiICsKKwkJCXdoaXRlc3BhY2Ug KyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAi aSIgKQorCX0sCisKKwlyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9u KSQvaSwKKwlyaGVhZGVyID0gL15oXGQkL2ksCisKKwlybmF0aXZlID0gL15bXntdK1x7XHMqXFtu YXRpdmUgXHcvLAorCisJLy8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcg b3IgQ0xBU1Mgc2VsZWN0b3JzCisJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwu KFtcdy1dKykpJC8sCisKKwlyc2libGluZyA9IC9bK35dLywKKwlyZXNjYXBlID0gLyd8XFwvZywK KworCS8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRt bCNlc2NhcGVkLWNoYXJhY3RlcnMKKwlydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxcXChbXFxk YS1mXXsxLDZ9IiArIHdoaXRlc3BhY2UgKyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwuKSIsICJp ZyIgKSwKKwlmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3Bh Y2UgKSB7CisJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOworCQkvLyBOYU4g bWVhbnMgbm9uLWNvZGVwb2ludAorCQkvLyBTdXBwb3J0OiBGaXJlZm94PDI0CisJCS8vIFdvcmth cm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKKwkJcmV0dXJu IGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgPworCQkJZXNjYXBlZCA6CisJCQlo aWdoIDwgMCA/CisJCQkJLy8gQk1QIGNvZGVwb2ludAorCQkJCVN0cmluZy5mcm9tQ2hhckNvZGUo IGhpZ2ggKyAweDEwMDAwICkgOgorCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQg KHN1cnJvZ2F0ZSBwYWlyKQorCQkJCVN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAw eEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApOworCX07CisKKy8vIE9wdGltaXplIGZvciBw dXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApCit0cnkgeworCXB1c2guYXBwbHkoCisJCShhcnIgPSBz bGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSwKKwkJcHJlZmVycmVkRG9jLmNo aWxkTm9kZXMKKwkpOworCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wCisJLy8gRGV0ZWN0IHNpbGVu dGx5IGZhaWxpbmcgcHVzaC5hcHBseQorCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVu Z3RoIF0ubm9kZVR5cGU7Cit9IGNhdGNoICggZSApIHsKKwlwdXNoID0geyBhcHBseTogYXJyLmxl bmd0aCA/CisKKwkJLy8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGUKKwkJZnVuY3Rpb24oIHRh cmdldCwgZWxzICkgeworCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChl bHMpICk7CisJCX0gOgorCisJCS8vIFN1cHBvcnQ6IElFPDkKKwkJLy8gT3RoZXJ3aXNlIGFwcGVu ZCBkaXJlY3RseQorCQlmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7CisJCQl2YXIgaiA9IHRhcmdl dC5sZW5ndGgsCisJCQkJaSA9IDA7CisJCQkvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgK KwkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KKwkJCXRhcmdldC5sZW5n dGggPSBqIC0gMTsKKwkJfQorCX07Cit9CisKK2Z1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNv bnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CisJdmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSwK KwkJLy8gUVNBIHZhcnMKKwkJaSwgZ3JvdXBzLCBvbGQsIG5pZCwgbmV3Q29udGV4dCwgbmV3U2Vs ZWN0b3I7CisKKwlpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250 ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkgeworCQlzZXREb2N1bWVudCggY29u dGV4dCApOworCX0KKworCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCXJlc3VsdHMg PSByZXN1bHRzIHx8IFtdOworCisJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9 PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJaWYgKCAobm9kZVR5cGUg PSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsKKwkJcmV0dXJu IFtdOworCX0KKworCWlmICggZG9jdW1lbnRJc0hUTUwgJiYgIXNlZWQgKSB7CisKKwkJLy8gU2hv cnRjdXRzCisJCWlmICggKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsK KwkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCisJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkg eworCQkJCWlmICggbm9kZVR5cGUgPT09IDkgKSB7CisJCQkJCWVsZW0gPSBjb250ZXh0LmdldEVs ZW1lbnRCeUlkKCBtICk7CisJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBC bGFja2JlcnJ5IDQuNiByZXR1cm5zCisJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBp biB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2MykKKwkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFy ZW50Tm9kZSApIHsKKwkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFu ZCBXZWJraXQgcmV0dXJuIGl0ZW1zCisJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKKwkJ CQkJCWlmICggZWxlbS5pZCA9PT0gbSApIHsKKwkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsK KwkJCQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJl dHVybiByZXN1bHRzOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gQ29udGV4dCBpcyBu b3QgYSBkb2N1bWVudAorCQkJCQlpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9 IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJgorCQkJCQkJY29u dGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgeworCQkJCQkJcmVzdWx0 cy5wdXNoKCBlbGVtICk7CisJCQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQkJfQorCQkJCX0KKwor CQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKKwkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkg eworCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUo IHNlbGVjdG9yICkgKTsKKwkJCQlyZXR1cm4gcmVzdWx0czsKKworCQkJLy8gU3BlZWQtdXA6IFNp enpsZSgiLkNMQVNTIikKKwkJCX0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQu Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUg KSB7CisJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NO YW1lKCBtICkgKTsKKwkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCX0KKwkJfQorCisJCS8vIFFTQSBw YXRoCisJCWlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0 KCBzZWxlY3RvciApKSApIHsKKwkJCW5pZCA9IG9sZCA9IGV4cGFuZG87CisJCQluZXdDb250ZXh0 ID0gY29udGV4dDsKKwkJCW5ld1NlbGVjdG9yID0gbm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7 CisKKwkJCS8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllcwor CQkJLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBv biB0aGUgcm9vdAorCQkJLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFu ZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCisJCQkvLyBJRSA4IGRvZXNuJ3Qgd29yayBv biBvYmplY3QgZWxlbWVudHMKKwkJCWlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2Rl TmFtZS50b0xvd2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKKwkJCQlncm91cHMgPSB0b2tlbml6 ZSggc2VsZWN0b3IgKTsKKworCQkJCWlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJp ZCIpKSApIHsKKwkJCQkJbmlkID0gb2xkLnJlcGxhY2UoIHJlc2NhcGUsICJcXCQmIiApOworCQkJ CX0gZWxzZSB7CisJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKKwkJCQl9 CisJCQkJbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOworCisJCQkJaSA9IGdyb3Vwcy5sZW5n dGg7CisJCQkJd2hpbGUgKCBpLS0gKSB7CisJCQkJCWdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0 b3IoIGdyb3Vwc1tpXSApOworCQkJCX0KKwkJCQluZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCgg c2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4 dDsKKwkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIsIik7CisJCQl9CisKKwkJCWlmICgg bmV3U2VsZWN0b3IgKSB7CisJCQkJdHJ5IHsKKwkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywKKwkJ CQkJCW5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKQorCQkJCQkpOwor CQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQl9IGNhdGNoKHFzYUVycm9yKSB7CisJCQkJfSBmaW5h bGx5IHsKKwkJCQkJaWYgKCAhb2xkICkgeworCQkJCQkJY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUo ImlkIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBBbGwgb3RoZXJzCisJ cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwg cmVzdWx0cywgc2VlZCApOworfQorCisvKioKKyAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9m IGxpbWl0ZWQgc2l6ZQorICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0 dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aAorICoJ cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2Fj aGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKKyAqCWRlbGV0aW5nIHRoZSBvbGRl c3QgZW50cnkKKyAqLworZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7CisJdmFyIGtleXMgPSBbXTsK KworCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgeworCQkvLyBVc2UgKGtleSArICIgIikg dG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUg SXNzdWUgIzE1NykKKwkJaWYgKCBrZXlzLnB1c2goIGtleSArICIgIiApID4gRXhwci5jYWNoZUxl bmd0aCApIHsKKwkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcworCQkJZGVs ZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTsKKwkJfQorCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAi ICIgXSA9IHZhbHVlKTsKKwl9CisJcmV0dXJuIGNhY2hlOworfQorCisvKioKKyAqIE1hcmsgYSBm dW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBm biBUaGUgZnVuY3Rpb24gdG8gbWFyaworICovCitmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkg eworCWZuWyBleHBhbmRvIF0gPSB0cnVlOworCXJldHVybiBmbjsKK30KKworLyoqCisgKiBTdXBw b3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFz c2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0CisgKi8KK2Z1 bmN0aW9uIGFzc2VydCggZm4gKSB7CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo ImRpdiIpOworCisJdHJ5IHsKKwkJcmV0dXJuICEhZm4oIGRpdiApOworCX0gY2F0Y2ggKGUpIHsK KwkJcmV0dXJuIGZhbHNlOworCX0gZmluYWxseSB7CisJCS8vIFJlbW92ZSBmcm9tIGl0cyBwYXJl bnQgYnkgZGVmYXVsdAorCQlpZiAoIGRpdi5wYXJlbnROb2RlICkgeworCQkJZGl2LnBhcmVudE5v ZGUucmVtb3ZlQ2hpbGQoIGRpdiApOworCQl9CisJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisJ CWRpdiA9IG51bGw7CisJfQorfQorCisvKioKKyAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3Ig YWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKKyAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBl LXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRs ZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZAorICovCitmdW5jdGlvbiBhZGRIYW5k bGUoIGF0dHJzLCBoYW5kbGVyICkgeworCXZhciBhcnIgPSBhdHRycy5zcGxpdCgifCIpLAorCQlp ID0gYXR0cnMubGVuZ3RoOworCisJd2hpbGUgKCBpLS0gKSB7CisJCUV4cHIuYXR0ckhhbmRsZVsg YXJyW2ldIF0gPSBoYW5kbGVyOworCX0KK30KKworLyoqCisgKiBDaGVja3MgZG9jdW1lbnQgb3Jk ZXIgb2YgdHdvIHNpYmxpbmdzCisgKiBAcGFyYW0ge0VsZW1lbnR9IGEKKyAqIEBwYXJhbSB7RWxl bWVudH0gYgorICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHBy ZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiCisgKi8KK2Z1bmN0aW9uIHNp YmxpbmdDaGVjayggYSwgYiApIHsKKwl2YXIgY3VyID0gYiAmJiBhLAorCQlkaWZmID0gY3VyICYm IGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJgorCQkJKCB+Yi5zb3VyY2VJ bmRleCB8fCBNQVhfTkVHQVRJVkUgKSAtCisJCQkoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdB VElWRSApOworCisJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5v ZGVzCisJaWYgKCBkaWZmICkgeworCQlyZXR1cm4gZGlmZjsKKwl9CisKKwkvLyBDaGVjayBpZiBi IGZvbGxvd3MgYQorCWlmICggY3VyICkgeworCQl3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxp bmcpICkgeworCQkJaWYgKCBjdXIgPT09IGIgKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9 CisJfQorCisJcmV0dXJuIGEgPyAxIDogLTE7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0 aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcworICogQHBhcmFtIHtTdHJpbmd9 IHR5cGUKKyAqLworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CisJcmV0dXJu IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNh c2UoKTsKKwkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwor CX07Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZv ciBidXR0b25zCisgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQorICovCitmdW5jdGlvbiBjcmVhdGVC dXR0b25Qc2V1ZG8oIHR5cGUgKSB7CisJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIg bmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJcmV0dXJuIChuYW1lID09PSAi aW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisJfTsK K30KKworLyoqCisgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBv c2l0aW9uYWxzCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBjcmVhdGVQ b3NpdGlvbmFsUHNldWRvKCBmbiApIHsKKwlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBh cmd1bWVudCApIHsKKwkJYXJndW1lbnQgPSArYXJndW1lbnQ7CisJCXJldHVybiBtYXJrRnVuY3Rp b24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CisJCQl2YXIgaiwKKwkJCQltYXRjaEluZGV4 ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAorCQkJCWkgPSBtYXRjaEluZGV4 ZXMubGVuZ3RoOworCisJCQkvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVk IGluZGV4ZXMKKwkJCXdoaWxlICggaS0tICkgeworCQkJCWlmICggc2VlZFsgKGogPSBtYXRjaElu ZGV4ZXNbaV0pIF0gKSB7CisJCQkJCXNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTsK KwkJCQl9CisJCQl9CisJCX0pOworCX0pOworfQorCisvKioKKyAqIENoZWNrcyBhIG5vZGUgZm9y IHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9 fSBjb250ZXh0CisgKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0 IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKKyAqLworZnVuY3Rp b24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7CisJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNv bnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiBjb250ZXh0Owor fQorCisvLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZQorc3VwcG9ydCA9IFNp enpsZS5zdXBwb3J0ID0ge307CisKKy8qKgorICogRGV0ZWN0cyBYTUwgbm9kZXMKKyAqIEBwYXJh bSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CisgKiBAcmV0 dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlCisgKi8K K2lzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CisJLy8gZG9jdW1lbnRF bGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdAor CS8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKQorCXZhciBkb2N1bWVu dEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRF bGVtZW50OworCXJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5h bWUgIT09ICJIVE1MIiA6IGZhbHNlOworfTsKKworLyoqCisgKiBTZXRzIGRvY3VtZW50LXJlbGF0 ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnQKKyAqIEBwYXJh bSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRv IHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRo ZSBjdXJyZW50IGRvY3VtZW50CisgKi8KK3NldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50 ID0gZnVuY3Rpb24oIG5vZGUgKSB7CisJdmFyIGhhc0NvbXBhcmUsCisJCWRvYyA9IG5vZGUgPyBu b2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYywKKwkJcGFyZW50ID0gZG9j LmRlZmF1bHRWaWV3OworCisJLy8gSWYgbm8gZG9jdW1lbnQgYW5kIGRvY3VtZW50RWxlbWVudCBp cyBhdmFpbGFibGUsIHJldHVybgorCWlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5 cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7CisJCXJldHVybiBkb2N1bWVudDsK Kwl9CisKKwkvLyBTZXQgb3VyIGRvY3VtZW50CisJZG9jdW1lbnQgPSBkb2M7CisJZG9jRWxlbSA9 IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisKKwkvLyBTdXBwb3J0IHRlc3RzCisJZG9jdW1lbnRJc0hU TUwgPSAhaXNYTUwoIGRvYyApOworCisJLy8gU3VwcG9ydDogSUU+OAorCS8vIElmIGlmcmFtZSBk b2N1bWVudCBpcyBhc3NpZ25lZCB0byAiZG9jdW1lbnQiIHZhcmlhYmxlIGFuZCBpZiBpZnJhbWUg aGFzIGJlZW4gcmVsb2FkZWQsCisJLy8gSUUgd2lsbCB0aHJvdyAicGVybWlzc2lvbiBkZW5pZWQi IGVycm9yIHdoZW4gYWNjZXNzaW5nICJkb2N1bWVudCIgdmFyaWFibGUsIHNlZSBqUXVlcnkgIzEz OTM2CisJLy8gSUU2LTggZG8gbm90IHN1cHBvcnQgdGhlIGRlZmF1bHRWaWV3IHByb3BlcnR5IHNv IHBhcmVudCB3aWxsIGJlIHVuZGVmaW5lZAorCWlmICggcGFyZW50ICYmIHBhcmVudCAhPT0gcGFy ZW50LnRvcCApIHsKKwkJLy8gSUUxMSBkb2VzIG5vdCBoYXZlIGF0dGFjaEV2ZW50LCBzbyBhbGwg bXVzdCBzdWZmZXIKKwkJaWYgKCBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCXBhcmVu dC5hZGRFdmVudExpc3RlbmVyKCAidW5sb2FkIiwgZnVuY3Rpb24oKSB7CisJCQkJc2V0RG9jdW1l bnQoKTsKKwkJCX0sIGZhbHNlICk7CisJCX0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCAp IHsKKwkJCXBhcmVudC5hdHRhY2hFdmVudCggIm9udW5sb2FkIiwgZnVuY3Rpb24oKSB7CisJCQkJ c2V0RG9jdW1lbnQoKTsKKwkJCX0pOworCQl9CisJfQorCisJLyogQXR0cmlidXRlcworCS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0gKi8KKworCS8vIFN1cHBvcnQ6IElFPDgKKwkvLyBWZXJpZnkgdGhhdCBnZXRBdHRy aWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXMgKGV4Y2Vw dGluZyBJRTggYm9vbGVhbnMpCisJc3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9u KCBkaXYgKSB7CisJCWRpdi5jbGFzc05hbWUgPSAiaSI7CisJCXJldHVybiAhZGl2LmdldEF0dHJp YnV0ZSgiY2xhc3NOYW1lIik7CisJfSk7CisKKwkvKiBnZXRFbGVtZW50KHMpQnkqCisJLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSAqLworCisJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1 cm5zIG9ubHkgZWxlbWVudHMKKwlzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0 KGZ1bmN0aW9uKCBkaXYgKSB7CisJCWRpdi5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUNvbW1lbnQo IiIpICk7CisJCXJldHVybiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoOwor CX0pOworCisJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBjYW4gYmUgdHJ1c3Rl ZAorCXN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jLmdl dEVsZW1lbnRzQnlDbGFzc05hbWUgKSAmJiBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKwkJZGl2 LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2 PiI7CisKKwkJLy8gU3VwcG9ydDogU2FmYXJpPDQKKwkJLy8gQ2F0Y2ggY2xhc3Mgb3Zlci1jYWNo aW5nCisJCWRpdi5maXJzdENoaWxkLmNsYXNzTmFtZSA9ICJpIjsKKwkJLy8gU3VwcG9ydDogT3Bl cmE8MTAKKwkJLy8gQ2F0Y2ggZ0VCQ04gZmFpbHVyZSB0byBmaW5kIG5vbi1sZWFkaW5nIGNsYXNz ZXMKKwkJcmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RoID09PSAy OworCX0pOworCisJLy8gU3VwcG9ydDogSUU8MTAKKwkvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJ ZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKKwkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlk IG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtYXRpY2FsbHktc2V0IG5hbWVzLAorCS8vIHNv IHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAorCXN1cHBvcnQuZ2V0QnlJ ZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYg KS5pZCA9IGV4cGFuZG87CisJCXJldHVybiAhZG9jLmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2Mu Z2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7CisJfSk7CisKKwkvLyBJRCBmaW5k IGFuZCBmaWx0ZXIKKwlpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHsKKwkJRXhwci5maW5kWyJJRCJd ID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRF bGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmIGRvY3VtZW50SXNIVE1MICkgeworCQkJCXZh ciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKKwkJCQkvLyBDaGVjayBwYXJlbnRO b2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucworCQkJCS8vIG5vZGVzIHRo YXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKwkJCQlyZXR1cm4gbSAmJiBt LnBhcmVudE5vZGUgPyBbIG0gXSA6IFtdOworCQkJfQorCQl9OworCQlFeHByLmZpbHRlclsiSUQi XSA9IGZ1bmN0aW9uKCBpZCApIHsKKwkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2Nh cGUsIGZ1bmVzY2FwZSApOworCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXJldHVy biBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOworCQkJfTsKKwkJfTsKKwl9IGVs c2UgeworCQkvLyBTdXBwb3J0OiBJRTYvNworCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVs aWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CisJCWRlbGV0ZSBFeHByLmZpbmRbIklEIl07CisKKwkJ RXhwci5maWx0ZXJbIklEIl0gPSAgZnVuY3Rpb24oIGlkICkgeworCQkJdmFyIGF0dHJJZCA9IGlk LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVs ZW0gKSB7CisJCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBz dHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOworCQkJCXJldHVybiBu b2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDsKKwkJCX07CisJCX07CisJfQorCisJLy8gVGFn CisJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPworCQlm dW5jdGlvbiggdGFnLCBjb250ZXh0ICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVt ZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgeworCQkJCXJldHVybiBjb250ZXh0Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKKwkJCX0KKwkJfSA6CisJCWZ1bmN0aW9uKCB0YWcs IGNvbnRleHQgKSB7CisJCQl2YXIgZWxlbSwKKwkJCQl0bXAgPSBbXSwKKwkJCQlpID0gMCwKKwkJ CQlyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7CisKKwkJCS8v IEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMKKwkJCWlmICggdGFnID09PSAiKiIgKSB7CisJ CQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CisJCQkJCWlmICggZWxlbS5ub2Rl VHlwZSA9PT0gMSApIHsKKwkJCQkJCXRtcC5wdXNoKCBlbGVtICk7CisJCQkJCX0KKwkJCQl9CisK KwkJCQlyZXR1cm4gdG1wOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisKKwkvLyBD bGFzcworCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFt ZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgeworCQlpZiAoIHR5cGVvZiBjb250 ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiBkb2N1bWVudElz SFRNTCApIHsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNz TmFtZSApOworCQl9CisJfTsKKworCS8qIFFTQS9tYXRjaGVzU2VsZWN0b3IKKwktLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tICovCisKKwkvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0CisKKwkvLyBtYXRj aGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAx MS41KQorCXJidWdneU1hdGNoZXMgPSBbXTsKKworCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFs c2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCisJLy8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEg YnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yCisJLy8gd2hlbmV2ZXIgYGRvY3VtZW50 LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQorCS8vIFNvLCB3ZSBhbGxv dyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElF IGVycm9yCisJLy8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CisJcmJ1 Z2d5UVNBID0gW107CisKKwlpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1 ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7CisJCS8vIEJ1aWxkIFFTQSByZWdleAorCQkvLyBSZWdleCBz dHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCisJCWFzc2VydChmdW5jdGlvbiggZGl2 ICkgeworCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQorCQkJ Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5CisJCQkv LyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKKwkJCS8vIHNpbmNlIGl0cyBw cmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCisJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3Rp Y2tldC8xMjM1OQorCQkJZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0IG1zYWxsb3djbGlwPScnPjxv cHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKKworCQkJLy8gU3VwcG9ydDog SUU4LCBPcGVyYSAxMS0xMi4xNgorCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hl biBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQorCQkJLy8gVGhlIHRlc3QgYXR0 cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgInNhZmUiIGZvciBXaW5SVAorCQkJ Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFz cHgjYXR0cmlidXRlX3NlY3Rpb24KKwkJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2Fs bG93Y2xpcF49JyddIikubGVuZ3RoICkgeworCQkJCXJidWdneVFTQS5wdXNoKCAiWypeJF09IiAr IHdoaXRlc3BhY2UgKyAiKig/OicnfFwiXCIpIiApOworCQkJfQorCisJCQkvLyBTdXBwb3J0OiBJ RTgKKwkJCS8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgInZhbHVlIiBhcmUgbm90IHRyZWF0ZWQg Y29ycmVjdGx5CisJCQlpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxl bmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2 YWx1ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKKwkJCX0KKworCQkJLy8gV2Via2l0L09wZXJhIC0g OmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKKwkJCS8vIGh0 dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVj a2VkCisJCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0 ZXN0cworCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkg eworCQkJCXJidWdneVFTQS5wdXNoKCI6Y2hlY2tlZCIpOworCQkJfQorCQl9KTsKKworCQlhc3Nl cnQoZnVuY3Rpb24oIGRpdiApIHsKKwkJCS8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBw cworCQkJLy8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJp bmcgLmlubmVySFRNTCBhc3NpZ25tZW50CisJCQl2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVu dCgiaW5wdXQiKTsKKwkJCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVuIiApOwor CQkJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggIm5hbWUiLCAiRCIgKTsK KworCQkJLy8gU3VwcG9ydDogSUU4CisJCQkvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2Yg bmFtZSBhdHRyaWJ1dGUKKwkJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIiku bGVuZ3RoICkgeworCQkJCXJidWdneVFTQS5wdXNoKCAibmFtZSIgKyB3aGl0ZXNwYWNlICsgIipb Kl4kfCF+XT89IiApOworCQkJfQorCisJCQkvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQg YW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQor CQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMK KwkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCApIHsKKwkJ CQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKKwkJCX0KKworCQkJ Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVk b3MKKwkJCWRpdi5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7CisJCQlyYnVnZ3lRU0EucHVzaCgi LC4qOiIpOworCQl9KTsKKwl9CisKKwlpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJu YXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKKwkJZG9jRWxlbS53ZWJr aXRNYXRjaGVzU2VsZWN0b3IgfHwKKwkJZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwKKwkJ ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CisJCWRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3Ip ICkpICkgeworCisJCWFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCQkJLy8gQ2hlY2sgdG8gc2Vl IGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yCisJCQkvLyBvbiBhIGRpc2Nv bm5lY3RlZCBub2RlIChJRSA5KQorCQkJc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNo ZXMuY2FsbCggZGl2LCAiZGl2IiApOworCisJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4g ZXhjZXB0aW9uCisJCQkvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0 ZWFkCisJCQltYXRjaGVzLmNhbGwoIGRpdiwgIltzIT0nJ106eCIgKTsKKwkJCXJidWdneU1hdGNo ZXMucHVzaCggIiE9IiwgcHNldWRvcyApOworCQl9KTsKKwl9CisKKwlyYnVnZ3lRU0EgPSByYnVn Z3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCJ8IikgKTsKKwlyYnVn Z3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0 Y2hlcy5qb2luKCJ8IikgKTsKKworCS8qIENvbnRhaW5zCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWhh c0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24g KTsKKworCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgorCS8vIFB1cnBvc2VmdWxseSBkb2Vz IG5vdCBpbXBsZW1lbnQgaW5jbHVzaXZlIGRlc2NlbmRlbnQKKwkvLyBBcyBpbiwgYW4gZWxlbWVu dCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgorCWNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0 aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/CisJCWZ1bmN0aW9uKCBhLCBiICkgeworCQkJ dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKKwkJ CQlidXAgPSBiICYmIGIucGFyZW50Tm9kZTsKKwkJCXJldHVybiBhID09PSBidXAgfHwgISEoIGJ1 cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKAorCQkJCWFkb3duLmNvbnRhaW5zID8KKwkJCQkJ YWRvd24uY29udGFpbnMoIGJ1cCApIDoKKwkJCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAm JiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2CisJCQkpKTsKKwkJfSA6CisJ CWZ1bmN0aW9uKCBhLCBiICkgeworCQkJaWYgKCBiICkgeworCQkJCXdoaWxlICggKGIgPSBiLnBh cmVudE5vZGUpICkgeworCQkJCQlpZiAoIGIgPT09IGEgKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsK KwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfTsKKworCS8qIFNvcnRp bmcKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisJc29y dE9yZGVyID0gaGFzQ29tcGFyZSA/CisJZnVuY3Rpb24oIGEsIGIgKSB7CisKKwkJLy8gRmxhZyBm b3IgZHVwbGljYXRlIHJlbW92YWwKKwkJaWYgKCBhID09PSBiICkgeworCQkJaGFzRHVwbGljYXRl ID0gdHJ1ZTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLy8gU29ydCBvbiBtZXRob2QgZXhpc3Rl bmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbgorCQl2YXIg Y29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50 UG9zaXRpb247CisJCWlmICggY29tcGFyZSApIHsKKwkJCXJldHVybiBjb21wYXJlOworCQl9CisK KwkJLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2Ft ZSBkb2N1bWVudAorCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIu b3duZXJEb2N1bWVudCB8fCBiICkgPworCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiAp IDoKKworCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCisJCQkx OworCisJCS8vIERpc2Nvbm5lY3RlZCBub2RlcworCQlpZiAoIGNvbXBhcmUgJiAxIHx8CisJCQko IXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9 PT0gY29tcGFyZSkgKSB7CisKKwkJCS8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlz IHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudAorCQkJaWYgKCBhID09PSBkb2MgfHwg YS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9j LCBhKSApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoIGIgPT09IGRvYyB8fCBiLm93 bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIp ICkgeworCQkJCXJldHVybiAxOworCQkJfQorCisJCQkvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRl cgorCQkJcmV0dXJuIHNvcnRJbnB1dCA/CisJCQkJKCBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwg YSApIC0gaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGIgKSApIDoKKwkJCQkwOworCQl9CisKKwkJ cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOworCX0gOgorCWZ1bmN0aW9uKCBhLCBiICkgewor CQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCisJCWlmICggYSA9PT0g YiApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZh ciBjdXIsCisJCQlpID0gMCwKKwkJCWF1cCA9IGEucGFyZW50Tm9kZSwKKwkJCWJ1cCA9IGIucGFy ZW50Tm9kZSwKKwkJCWFwID0gWyBhIF0sCisJCQlicCA9IFsgYiBdOworCisJCS8vIFBhcmVudGxl c3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisJCWlmICggIWF1 cCB8fCAhYnVwICkgeworCQkJcmV0dXJuIGEgPT09IGRvYyA/IC0xIDoKKwkJCQliID09PSBkb2Mg PyAxIDoKKwkJCQlhdXAgPyAtMSA6CisJCQkJYnVwID8gMSA6CisJCQkJc29ydElucHV0ID8KKwkJ CQkoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1 dCwgYiApICkgOgorCQkJCTA7CisKKwkJLy8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2Ug Y2FuIGRvIGEgcXVpY2sgY2hlY2sKKwkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CisJCQly ZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CisJCX0KKworCQkvLyBPdGhlcndpc2Ugd2UgbmVl ZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvbgorCQljdXIgPSBh OworCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisJCQlhcC51bnNoaWZ0KCBj dXIgKTsKKwkJfQorCQljdXIgPSBiOworCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkg KSB7CisJCQlicC51bnNoaWZ0KCBjdXIgKTsKKwkJfQorCisJCS8vIFdhbGsgZG93biB0aGUgdHJl ZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CisJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkg eworCQkJaSsrOworCQl9CisKKwkJcmV0dXJuIGkgPworCQkJLy8gRG8gYSBzaWJsaW5nIGNoZWNr IGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yCisJCQlzaWJsaW5nQ2hlY2soIGFw W2ldLCBicFtpXSApIDoKKworCQkJLy8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBz b3J0IGZpcnN0CisJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgorCQkJYnBbaV0gPT09 IHByZWZlcnJlZERvYyA/IDEgOgorCQkJMDsKKwl9OworCisJcmV0dXJuIGRvYzsKK307CisKK1Np enpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgeworCXJldHVybiBTaXp6 bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Cit9OworCitTaXp6bGUubWF0Y2hlc1Nl bGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7CisJLy8gU2V0IGRvY3VtZW50IHZhcnMg aWYgbmVlZGVkCisJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3Vt ZW50ICkgeworCQlzZXREb2N1bWVudCggZWxlbSApOworCX0KKworCS8vIE1ha2Ugc3VyZSB0aGF0 IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAorCWV4cHIgPSBleHByLnJlcGxhY2UoIHJh dHRyaWJ1dGVRdW90ZXMsICI9JyQxJ10iICk7CisKKwlpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVj dG9yICYmIGRvY3VtZW50SXNIVE1MICYmCisJCSggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1h dGNoZXMudGVzdCggZXhwciApICkgJiYKKwkJKCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNB LnRlc3QoIGV4cHIgKSApICkgeworCisJCXRyeSB7CisJCQl2YXIgcmV0ID0gbWF0Y2hlcy5jYWxs KCBlbGVtLCBleHByICk7CisKKwkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBm YWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKKwkJCWlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29u bmVjdGVkTWF0Y2ggfHwKKwkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBz YWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKKwkJCQkJLy8gZnJhZ21lbnQgaW4gSUUgOQorCQkJCQll bGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkgeworCQkJCXJl dHVybiByZXQ7CisJCQl9CisJCX0gY2F0Y2goZSkge30KKwl9CisKKwlyZXR1cm4gU2l6emxlKCBl eHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxl LmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7CisJLy8gU2V0IGRvY3VtZW50 IHZhcnMgaWYgbmVlZGVkCisJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0 ICkgIT09IGRvY3VtZW50ICkgeworCQlzZXREb2N1bWVudCggY29udGV4dCApOworCX0KKwlyZXR1 cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKK307CisKK1NpenpsZS5hdHRyID0gZnVuY3Rp b24oIGVsZW0sIG5hbWUgKSB7CisJLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisJaWYg KCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgeworCQlzZXRE b2N1bWVudCggZWxlbSApOworCX0KKworCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50 b0xvd2VyQ2FzZSgpIF0sCisJCS8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlw ZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KQorCQl2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCgg RXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/CisJCQlmbiggZWxlbSwgbmFt ZSwgIWRvY3VtZW50SXNIVE1MICkgOgorCQkJdW5kZWZpbmVkOworCisJcmV0dXJuIHZhbCAhPT0g dW5kZWZpbmVkID8KKwkJdmFsIDoKKwkJc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElz SFRNTCA/CisJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKKwkJCSh2YWwgPSBlbGVtLmdl dEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgPworCQkJCXZhbC52YWx1ZSA6 CisJCQkJbnVsbDsKK307CisKK1NpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7CisJdGhy b3cgbmV3IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiAr IG1zZyApOworfTsKKworLyoqCisgKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBs aWNhdGVzCisgKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0cworICovCitTaXp6bGUudW5pcXVl U29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgeworCXZhciBlbGVtLAorCQlkdXBsaWNhdGVzID0g W10sCisJCWogPSAwLAorCQlpID0gMDsKKworCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRl dGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKKwloYXNEdXBsaWNhdGUgPSAh c3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzOworCXNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFi bGUgJiYgcmVzdWx0cy5zbGljZSggMCApOworCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CisK KwlpZiAoIGhhc0R1cGxpY2F0ZSApIHsKKwkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkg KSB7CisJCQlpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsKKwkJCQlqID0gZHVwbGljYXRl cy5wdXNoKCBpICk7CisJCQl9CisJCX0KKwkJd2hpbGUgKCBqLS0gKSB7CisJCQlyZXN1bHRzLnNw bGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CisJCX0KKwl9CisKKwkvLyBDbGVhciBpbnB1dCBh ZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0cworCS8vIFNlZSBodHRwczovL2dpdGh1Yi5j b20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNQorCXNvcnRJbnB1dCA9IG51bGw7CisKKwlyZXR1cm4g cmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0 aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKKyAqIEBwYXJhbSB7QXJyYXl8 RWxlbWVudH0gZWxlbQorICovCitnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbigg ZWxlbSApIHsKKwl2YXIgbm9kZSwKKwkJcmV0ID0gIiIsCisJCWkgPSAwLAorCQlub2RlVHlwZSA9 IGVsZW0ubm9kZVR5cGU7CisKKwlpZiAoICFub2RlVHlwZSApIHsKKwkJLy8gSWYgbm8gbm9kZVR5 cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkKKwkJd2hpbGUgKCAobm9kZSA9IGVs ZW1baSsrXSkgKSB7CisJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcworCQkJcmV0 ICs9IGdldFRleHQoIG5vZGUgKTsKKwkJfQorCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8 IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKKwkJLy8gVXNlIHRleHRDb250 ZW50IGZvciBlbGVtZW50cworCQkvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lz dGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKQorCQlpZiAoIHR5cGVvZiBlbGVtLnRl eHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiBlbGVtLnRleHRDb250ZW50Owor CQl9IGVsc2UgeworCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCisJCQlmb3IgKCBlbGVtID0g ZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHsKKwkJCQly ZXQgKz0gZ2V0VGV4dCggZWxlbSApOworCQkJfQorCQl9CisJfSBlbHNlIGlmICggbm9kZVR5cGUg PT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7CisJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKKwl9 CisJLy8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5v ZGVzCisKKwlyZXR1cm4gcmV0OworfTsKKworRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CisK KwkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKKwljYWNoZUxlbmd0aDogNTAsCisKKwlj cmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKKworCW1hdGNoOiBtYXRjaEV4cHIsCisKKwlhdHRy SGFuZGxlOiB7fSwKKworCWZpbmQ6IHt9LAorCisJcmVsYXRpdmU6IHsKKwkJIj4iOiB7IGRpcjog InBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAorCQkiICI6IHsgZGlyOiAicGFyZW50Tm9kZSIg fSwKKwkJIisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCisJCSJ+ IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KKwl9LAorCisJcHJlRmlsdGVyOiB7CisJCSJB VFRSIjogZnVuY3Rpb24oIG1hdGNoICkgeworCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNl KCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCisJCQkvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0 byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorCQkJbWF0Y2hbM10gPSAoIG1h dGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBl LCBmdW5lc2NhcGUgKTsKKworCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKKwkJCQltYXRj aFszXSA9ICIgIiArIG1hdGNoWzNdICsgIiAiOworCQkJfQorCisJCQlyZXR1cm4gbWF0Y2guc2xp Y2UoIDAsIDQgKTsKKwkJfSwKKworCQkiQ0hJTEQiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQkv KiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCisJCQkJMSB0eXBlIChvbmx5fG50aHwu Li4pCisJCQkJMiB3aGF0IChjaGlsZHxvZi10eXBlKQorCQkJCTMgYXJndW1lbnQgKGV2ZW58b2Rk fFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCisJCQkJNCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1 bWVudCAoWystXT9cZCpufCkKKwkJCQk1IHNpZ24gb2YgeG4tY29tcG9uZW50CisJCQkJNiB4IG9m IHhuLWNvbXBvbmVudAorCQkJCTcgc2lnbiBvZiB5LWNvbXBvbmVudAorCQkJCTggeSBvZiB5LWNv bXBvbmVudAorCQkJKi8KKwkJCW1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKKwor CQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKwkJCQkvLyBudGgt KiByZXF1aXJlcyBhcmd1bWVudAorCQkJCWlmICggIW1hdGNoWzNdICkgeworCQkJCQlTaXp6bGUu ZXJyb3IoIG1hdGNoWzBdICk7CisJCQkJfQorCisJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFt ZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECisJCQkJLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90 cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQorCQkJCW1hdGNoWzRdID0gKyggbWF0Y2hbNF0g PyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSAiZXZlbiIg fHwgbWF0Y2hbM10gPT09ICJvZGQiICkgKTsKKwkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10g KyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOworCisJCQkvLyBvdGhlciB0eXBl cyBwcm9oaWJpdCBhcmd1bWVudHMKKwkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgeworCQkJCVNp enpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAor CisJCSJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQl2YXIgZXhjZXNzLAorCQkJCXVu cXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOworCisJCQlpZiAoIG1hdGNoRXhwclsiQ0hJ TEQiXS50ZXN0KCBtYXRjaFswXSApICkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQkv LyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcworCQkJaWYgKCBtYXRjaFszXSApIHsKKwkJ CQltYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiOworCisJCQkvLyBTdHJpcCBl eGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50cworCQkJfSBlbHNlIGlmICgg dW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmCisJCQkJLy8gR2V0IGV4Y2Vz cyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKKwkJCQkoZXhjZXNzID0gdG9rZW5pemUoIHVu cXVvdGVkLCB0cnVlICkpICYmCisJCQkJLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBh cmVudGhlc2lzCisJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQu bGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgeworCisJCQkJLy8gZXhjZXNz IGlzIGEgbmVnYXRpdmUgaW5kZXgKKwkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBl eGNlc3MgKTsKKwkJCQltYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTsKKwkJ CX0KKworCQkJLy8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmls dGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpCisJCQlyZXR1cm4gbWF0Y2guc2xpY2UoIDAs IDMgKTsKKwkJfQorCX0sCisKKwlmaWx0ZXI6IHsKKworCQkiVEFHIjogZnVuY3Rpb24oIG5vZGVO YW1lU2VsZWN0b3IgKSB7CisJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxh Y2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKKwkJCXJldHVybiBub2Rl TmFtZVNlbGVjdG9yID09PSAiKiIgPworCQkJCWZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6 CisJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVs ZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7CisJCQkJfTsKKwkJfSwKKwor CQkiQ0xBU1MiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkgeworCQkJdmFyIHBhdHRlcm4gPSBjbGFz c0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworCQkJcmV0dXJuIHBhdHRlcm4gfHwKKwkJCQko cGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFt ZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgorCQkJCWNsYXNzQ2FjaGUoIGNsYXNz TmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVv ZiBlbGVtLmNsYXNzTmFtZSA9PT0gInN0cmluZyIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9m IGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUo ImNsYXNzIikgfHwgIiIgKTsKKwkJCQl9KTsKKwkJfSwKKworCQkiQVRUUiI6IGZ1bmN0aW9uKCBu YW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJ CQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CisKKwkJCQlpZiAoIHJl c3VsdCA9PSBudWxsICkgeworCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CisJCQkJfQor CQkJCWlmICggIW9wZXJhdG9yICkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisKKwkJCQly ZXN1bHQgKz0gIiI7CisKKwkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0g Y2hlY2sgOgorCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgorCQkJ CQlvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09 PSAwIDoKKwkJCQkJb3BlcmF0b3IgPT09ICIqPSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZigg Y2hlY2sgKSA+IC0xIDoKKwkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQu c2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgorCQkJCQlvcGVyYXRvciA9PT0gIn49 IiA/ICggIiAiICsgcmVzdWx0ICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKwkJCQkJ b3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwg Y2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArICItIiA6CisJCQkJCWZhbHNlOworCQkJfTsK KwkJfSwKKworCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0 LCBsYXN0ICkgeworCQkJdmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gIm50aCIs CisJCQkJZm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09ICJsYXN0IiwKKwkJCQlvZlR5cGUg PSB3aGF0ID09PSAib2YtdHlwZSI7CisKKwkJCXJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09 PSAwID8KKworCQkJCS8vIFNob3J0Y3V0IGZvciA6bnRoLSoobikKKwkJCQlmdW5jdGlvbiggZWxl bSApIHsKKwkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOworCQkJCX0gOgorCisJCQkJZnVu Y3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKKwkJCQkJdmFyIGNhY2hlLCBvdXRlckNhY2hl LCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LAorCQkJCQkJZGlyID0gc2ltcGxlICE9PSBm b3J3YXJkID8gIm5leHRTaWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAorCQkJCQkJcGFyZW50 ID0gZWxlbS5wYXJlbnROb2RlLAorCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1l LnRvTG93ZXJDYXNlKCksCisJCQkJCQl1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTsKKworCQkJ CQlpZiAoIHBhcmVudCApIHsKKworCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxv Zi10eXBlKQorCQkJCQkJaWYgKCBzaW1wbGUgKSB7CisJCQkJCQkJd2hpbGUgKCBkaXIgKSB7CisJ CQkJCQkJCW5vZGUgPSBlbGVtOworCQkJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0p ICkgeworCQkJCQkJCQkJaWYgKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkg PT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJCQkJCXJldHVybiBmYWxz ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBm b3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKKwkJCQkJCQkJc3RhcnQgPSBk aXIgPSB0eXBlID09PSAib25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisJCQkJCQkJ fQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlzdGFydCA9IFsgZm9yd2Fy ZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOworCisJCQkJCQkvLyBu b24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAorCQkJ CQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgeworCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZy b20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAorCQkJCQkJCW91dGVyQ2FjaGUgPSBwYXJlbnRb IGV4cGFuZG8gXSB8fCAocGFyZW50WyBleHBhbmRvIF0gPSB7fSk7CisJCQkJCQkJY2FjaGUgPSBv dXRlckNhY2hlWyB0eXBlIF0gfHwgW107CisJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbMF0gPT09 IGRpcnJ1bnMgJiYgY2FjaGVbMV07CisJCQkJCQkJZGlmZiA9IGNhY2hlWzBdID09PSBkaXJydW5z ICYmIGNhY2hlWzJdOworCQkJCQkJCW5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9k ZXNbIG5vZGVJbmRleCBdOworCisJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYm IG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKKworCQkJCQkJCQkvLyBGYWxsYmFjayB0byBzZWVraW5n IGBlbGVtYCBmcm9tIHRoZSBzdGFydAorCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8 IHN0YXJ0LnBvcCgpKSApIHsKKworCQkJCQkJCQkvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVz IG9uIGBwYXJlbnRgIGFuZCBicmVhaworCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEg JiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CisJCQkJCQkJCQlvdXRlckNhY2hlWyB0eXBl IF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOworCQkJCQkJCQkJYnJlYWs7CisJCQkJ CQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCS8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50 IGluZGV4IGlmIGF2YWlsYWJsZQorCQkJCQkJfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hl ID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAm JiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKKwkJCQkJCQlkaWZmID0gY2FjaGVbMV07CisKKwkJ CQkJCS8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50 aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBVc2UgdGhl IHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorCQkJCQkJ CXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisJ CQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgeworCisJCQkJ CQkJCWlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUg OiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgeworCQkJCQkJCQkJLy8gQ2FjaGUg dGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAorCQkJCQkJCQkJaWYgKCB1c2VD YWNoZSApIHsKKwkJCQkJCQkJCQkobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0g PSB7fSkpWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKKwkJCQkJCQkJCX0KKworCQkJCQkJ CQkJaWYgKCBub2RlID09PSBlbGVtICkgeworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQor CQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUg b2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorCQkJCQkJZGlmZiAtPSBsYXN0 OworCQkJCQkJcmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYm IGRpZmYgLyBmaXJzdCA+PSAwICk7CisJCQkJCX0KKwkJCQl9OworCQl9LAorCisJCSJQU0VVRE8i OiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHsKKwkJCS8vIHBzZXVkby1jbGFzcyBuYW1l cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0 b3JzLyNwc2V1ZG8tY2xhc3NlcworCQkJLy8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5 IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnMK KwkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKKwkJ CXZhciBhcmdzLAorCQkJCWZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZp bHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHwKKwkJCQkJU2l6emxlLmVycm9yKCAidW5z dXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CisKKwkJCS8vIFRoZSB1c2VyIG1heSB1c2Ug Y3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXQKKwkJCS8vIGFyZ3VtZW50cyBhcmUgbmVlZGVk IHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCisJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2Vz CisJCQlpZiAoIGZuWyBleHBhbmRvIF0gKSB7CisJCQkJcmV0dXJuIGZuKCBhcmd1bWVudCApOwor CQkJfQorCisJCQkvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKKwkJ CWlmICggZm4ubGVuZ3RoID4gMSApIHsKKwkJCQlhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgIiIs IGFyZ3VtZW50IF07CisJCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgg cHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/CisJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2Vl ZCwgbWF0Y2hlcyApIHsKKwkJCQkJCXZhciBpZHgsCisJCQkJCQkJbWF0Y2hlZCA9IGZuKCBzZWVk LCBhcmd1bWVudCApLAorCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKKwkJCQkJCXdoaWxlICgg aS0tICkgeworCQkJCQkJCWlkeCA9IGluZGV4T2YuY2FsbCggc2VlZCwgbWF0Y2hlZFtpXSApOwor CQkJCQkJCXNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7CisJ CQkJCQl9CisJCQkJCX0pIDoKKwkJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCQlyZXR1cm4g Zm4oIGVsZW0sIDAsIGFyZ3MgKTsKKwkJCQkJfTsKKwkJCX0KKworCQkJcmV0dXJuIGZuOworCQl9 CisJfSwKKworCXBzZXVkb3M6IHsKKwkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCisJ CSJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQkJLy8gVHJpbSB0 aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGUKKwkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxl YWRpbmcgYW5kIHRyYWlsaW5nCisJCQkvLyBzcGFjZXMgYXMgY29tYmluYXRvcnMKKwkJCXZhciBp bnB1dCA9IFtdLAorCQkJCXJlc3VsdHMgPSBbXSwKKwkJCQltYXRjaGVyID0gY29tcGlsZSggc2Vs ZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSApOworCisJCQlyZXR1cm4gbWF0Y2hlclsgZXhw YW5kbyBdID8KKwkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRl eHQsIHhtbCApIHsKKwkJCQkJdmFyIGVsZW0sCisJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBz ZWVkLCBudWxsLCB4bWwsIFtdICksCisJCQkJCQlpID0gc2VlZC5sZW5ndGg7CisKKwkJCQkJLy8g TWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAorCQkJCQl3aGlsZSAoIGktLSAp IHsKKwkJCQkJCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgeworCQkJCQkJCXNlZWRbaV0g PSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pIDoKKwkJCQlm dW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworCQkJCQlpbnB1dFswXSA9IGVsZW07CisJ CQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKKwkJCQkJcmV0dXJuICFy ZXN1bHRzLnBvcCgpOworCQkJCX07CisJCX0pLAorCisJCSJoYXMiOiBtYXJrRnVuY3Rpb24oZnVu Y3Rpb24oIHNlbGVjdG9yICkgeworCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXJl dHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDsKKwkJCX07CisJCX0pLAor CisJCSJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHsKKwkJCXJldHVy biBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQlyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVs ZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xOwor CQkJfTsKKwkJfSksCisKKwkJLy8gIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBi eSBhIDpsYW5nKCkgc2VsZWN0b3IKKwkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50 J3MgbGFuZ3VhZ2UgdmFsdWUKKwkJLy8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQywK KwkJLy8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xs b3dlZCBieSAiLSIuCisJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQn cyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgorCQkvLyBU aGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1l LiIKKwkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkbworCQki bGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CisJCQkvLyBsYW5nIHZhbHVl IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCisJCQlpZiAoICFyaWRlbnRpZmllci50ZXN0KGxh bmcgfHwgIiIpICkgeworCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBs YW5nICk7CisJCQl9CisJCQlsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2Fw ZSApLnRvTG93ZXJDYXNlKCk7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJdmFy IGVsZW1MYW5nOworCQkJCWRvIHsKKwkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRN TCA/CisJCQkJCQllbGVtLmxhbmcgOgorCQkJCQkJZWxlbS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5n IikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSkgKSB7CisKKwkJCQkJCWVsZW1MYW5nID0g ZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKKwkJCQkJCXJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8 fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgIi0iICkgPT09IDA7CisJCQkJCX0KKwkJCQl9IHdo aWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTsK KwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9OworCQl9KSwKKworCQkvLyBNaXNjZWxsYW5lb3VzCisJ CSJ0YXJnZXQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBoYXNoID0gd2luZG93LmxvY2F0 aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoOworCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGlj ZSggMSApID09PSBlbGVtLmlkOworCQl9LAorCisJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7 CisJCQlyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTsKKwkJfSwKKworCQkiZm9jdXMiOiBmdW5jdGlv biggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYm ICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50 eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7CisJCX0sCisKKwkJLy8gQm9vbGVh biBwcm9wZXJ0aWVzCisJCSJlbmFibGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4g ZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7CisJCX0sCisKKwkJImRpc2FibGVkIjogZnVuY3Rpb24o IGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQki Y2hlY2tlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hv dWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCisJCQkvLyBodHRw Oi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tl ZAorCQkJdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0 dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1l ID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOworCQl9LAorCisJCSJzZWxlY3RlZCI6 IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMg c2VsZWN0ZWQtYnktZGVmYXVsdAorCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJs eQorCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVj dGVkSW5kZXg7CisJCQl9CisKKwkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOworCQl9 LAorCisJCS8vIENvbnRlbnRzCisJCSJlbXB0eSI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJLy8g aHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KKwkJCS8vIDplbXB0 eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNk YXRhOiA0OyBlbnRpdHkgcmVmOiA1KSwKKwkJCS8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1l bnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pCisJCQkvLyBub2RlVHlwZSA8 IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVu CisJCQlmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0 U2libGluZyApIHsKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkgeworCQkJCQlyZXR1cm4g ZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0sCisKKwkJInBhcmVudCI6 IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICFFeHByLnBzZXVkb3NbImVtcHR5Il0oIGVs ZW0gKTsKKwkJfSwKKworCQkvLyBFbGVtZW50L2lucHV0IHR5cGVzCisJCSJoZWFkZXIiOiBmdW5j dGlvbiggZWxlbSApIHsKKwkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsK KwkJfSwKKworCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiByaW5wdXRz LnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKKwkJfSwKKworCQkiYnV0dG9uIjogZnVuY3Rpb24oIGVs ZW0gKSB7CisJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCXJl dHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9 PT0gImJ1dHRvbiI7CisJCX0sCisKKwkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZh ciBhdHRyOworCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0 IiAmJgorCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCisKKwkJCQkvLyBTdXBwb3J0OiBJRTw4 CisJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBl YXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgorCQkJCSggKGF0dHIgPSBlbGVtLmdldEF0dHJp YnV0ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gInRleHQiICk7 CisJCX0sCisKKwkJLy8gUG9zaXRpb24taW4tY29sbGVjdGlvbgorCQkiZmlyc3QiOiBjcmVhdGVQ b3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIFsgMCBdOworCQl9KSwKKwor CQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywg bGVuZ3RoICkgeworCQkJcmV0dXJuIFsgbGVuZ3RoIC0gMSBdOworCQl9KSwKKworCQkiZXEiOiBj cmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJn dW1lbnQgKSB7CisJCQlyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6 IGFyZ3VtZW50IF07CisJCX0pLAorCisJCSJldmVuIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhm dW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisJCQl2YXIgaSA9IDA7CisJCQlmb3Ig KCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKKwkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwor CQkJfQorCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKKwkJfSksCisKKwkJIm9kZCI6IGNyZWF0ZVBv c2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgeworCQkJdmFy IGkgPSAxOworCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CisJCQkJbWF0Y2hJbmRl eGVzLnB1c2goIGkgKTsKKwkJCX0KKwkJCXJldHVybiBtYXRjaEluZGV4ZXM7CisJCX0pLAorCisJ CSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVu Z3RoLCBhcmd1bWVudCApIHsKKwkJCXZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBs ZW5ndGggOiBhcmd1bWVudDsKKwkJCWZvciAoIDsgLS1pID49IDA7ICkgeworCQkJCW1hdGNoSW5k ZXhlcy5wdXNoKCBpICk7CisJCQl9CisJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOworCQl9KSwKKwor CQkiZ3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxl bmd0aCwgYXJndW1lbnQgKSB7CisJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsg bGVuZ3RoIDogYXJndW1lbnQ7CisJCQlmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7CisJCQkJbWF0 Y2hJbmRleGVzLnB1c2goIGkgKTsKKwkJCX0KKwkJCXJldHVybiBtYXRjaEluZGV4ZXM7CisJCX0p CisJfQorfTsKKworRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKKwor Ly8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3MKK2ZvciAoIGkgaW4geyByYWRpbzogdHJ1 ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1 ZSB9ICkgeworCUV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTsKK30K K2ZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CisJRXhwci5wc2V1 ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTsKK30KKworLy8gRWFzeSBBUEkgZm9y IGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzCitmdW5jdGlvbiBzZXRGaWx0ZXJzKCkge30KK3NldEZp bHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOworRXhwci5zZXRG aWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTsKKwordG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUg PSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKKwl2YXIgbWF0Y2hlZCwgbWF0Y2gs IHRva2VucywgdHlwZSwKKwkJc29GYXIsIGdyb3VwcywgcHJlRmlsdGVycywKKwkJY2FjaGVkID0g dG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKKworCWlmICggY2FjaGVkICkgeworCQlyZXR1 cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOworCX0KKworCXNvRmFyID0gc2Vs ZWN0b3I7CisJZ3JvdXBzID0gW107CisJcHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyOworCisJ d2hpbGUgKCBzb0ZhciApIHsKKworCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCisJCWlmICggIW1h dGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkgeworCQkJaWYgKCBtYXRj aCApIHsKKwkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAorCQkJ CXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOworCQkJfQor CQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKKwkJfQorCisJCW1hdGNoZWQgPSBmYWxz ZTsKKworCQkvLyBDb21iaW5hdG9ycworCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVj KCBzb0ZhciApKSApIHsKKwkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOworCQkJdG9rZW5zLnB1 c2goeworCQkJCXZhbHVlOiBtYXRjaGVkLAorCQkJCS8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5h dG9ycyB0byBzcGFjZQorCQkJCXR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCAiICIgKQor CQkJfSk7CisJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOworCQl9CisK KwkJLy8gRmlsdGVycworCQlmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgeworCQkJaWYgKCAo bWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNb IHR5cGUgXSB8fAorCQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkg eworCQkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOworCQkJCXRva2Vucy5wdXNoKHsKKwkJCQkJ dmFsdWU6IG1hdGNoZWQsCisJCQkJCXR5cGU6IHR5cGUsCisJCQkJCW1hdGNoZXM6IG1hdGNoCisJ CQkJfSk7CisJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsKKwkJCX0K KwkJfQorCisJCWlmICggIW1hdGNoZWQgKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIFJl dHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2VzcworCS8vIGlmIHdlJ3JlIGp1c3Qg cGFyc2luZworCS8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vucwor CXJldHVybiBwYXJzZU9ubHkgPworCQlzb0Zhci5sZW5ndGggOgorCQlzb0ZhciA/CisJCQlTaXp6 bGUuZXJyb3IoIHNlbGVjdG9yICkgOgorCQkJLy8gQ2FjaGUgdGhlIHRva2VucworCQkJdG9rZW5D YWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Cit9OworCitmdW5jdGlvbiB0b1Nl bGVjdG9yKCB0b2tlbnMgKSB7CisJdmFyIGkgPSAwLAorCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAor CQlzZWxlY3RvciA9ICIiOworCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQlzZWxlY3RvciAr PSB0b2tlbnNbaV0udmFsdWU7CisJfQorCXJldHVybiBzZWxlY3RvcjsKK30KKworZnVuY3Rpb24g YWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHsKKwl2YXIgZGlyID0g Y29tYmluYXRvci5kaXIsCisJCWNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0gInBh cmVudE5vZGUiLAorCQlkb25lTmFtZSA9IGRvbmUrKzsKKworCXJldHVybiBjb21iaW5hdG9yLmZp cnN0ID8KKwkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVt ZW50CisJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisJCQl3aGlsZSAoIChlbGVt ID0gZWxlbVsgZGlyIF0pICkgeworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVj a05vbkVsZW1lbnRzICkgeworCQkJCQlyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1s ICk7CisJCQkJfQorCQkJfQorCQl9IDoKKworCQkvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rv ci9wcmVjZWRpbmcgZWxlbWVudHMKKwkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsK KwkJCXZhciBvbGRDYWNoZSwgb3V0ZXJDYWNoZSwKKwkJCQluZXdDYWNoZSA9IFsgZGlycnVucywg ZG9uZU5hbWUgXTsKKworCQkJLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBu b2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmcKKwkJCWlmICggeG1s ICkgeworCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CisJCQkJCWlmICggZWxl bS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgeworCQkJCQkJaWYgKCBtYXRj aGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJ CX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1b IGRpciBdKSApIHsKKwkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxl bWVudHMgKSB7CisJCQkJCQlvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBl eHBhbmRvIF0gPSB7fSk7CisJCQkJCQlpZiAoIChvbGRDYWNoZSA9IG91dGVyQ2FjaGVbIGRpciBd KSAmJgorCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9 PT0gZG9uZU5hbWUgKSB7CisKKwkJCQkJCQkvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0 cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cworCQkJCQkJCXJldHVybiAobmV3 Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBS ZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1l bnRzCisJCQkJCQkJb3V0ZXJDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTsKKworCQkJCQkJCS8vIEEg bWF0Y2ggbWVhbnMgd2UncmUgZG9uZTsgYSBmYWlsIG1lYW5zIHdlIGhhdmUgdG8ga2VlcCBjaGVj a2luZworCQkJCQkJCWlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0 LCB4bWwgKSkgKSB7CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJ CQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKK30KKworZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1h dGNoZXJzICkgeworCXJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID8KKwkJZnVuY3Rpb24oIGVs ZW0sIGNvbnRleHQsIHhtbCApIHsKKwkJCXZhciBpID0gbWF0Y2hlcnMubGVuZ3RoOworCQkJd2hp bGUgKCBpLS0gKSB7CisJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCAp ICkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJ CX0gOgorCQltYXRjaGVyc1swXTsKK30KKworZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2Vs ZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgeworCXZhciBpID0gMCwKKwkJbGVuID0gY29udGV4 dHMubGVuZ3RoOworCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQlTaXp6bGUoIHNlbGVjdG9y LCBjb250ZXh0c1tpXSwgcmVzdWx0cyApOworCX0KKwlyZXR1cm4gcmVzdWx0czsKK30KKworZnVu Y3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsK Kwl2YXIgZWxlbSwKKwkJbmV3VW5tYXRjaGVkID0gW10sCisJCWkgPSAwLAorCQlsZW4gPSB1bm1h dGNoZWQubGVuZ3RoLAorCQltYXBwZWQgPSBtYXAgIT0gbnVsbDsKKworCWZvciAoIDsgaSA8IGxl bjsgaSsrICkgeworCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKKwkJCWlmICggIWZp bHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgeworCQkJCW5ld1VubWF0Y2hl ZC5wdXNoKCBlbGVtICk7CisJCQkJaWYgKCBtYXBwZWQgKSB7CisJCQkJCW1hcC5wdXNoKCBpICk7 CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG5ld1VubWF0Y2hlZDsKK30KKworZnVu Y3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRl ciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgeworCWlmICggcG9zdEZpbHRlciAmJiAhcG9z dEZpbHRlclsgZXhwYW5kbyBdICkgeworCQlwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZp bHRlciApOworCX0KKwlpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8gXSAp IHsKKwkJcG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciAp OworCX0KKwlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250 ZXh0LCB4bWwgKSB7CisJCXZhciB0ZW1wLCBpLCBlbGVtLAorCQkJcHJlTWFwID0gW10sCisJCQlw b3N0TWFwID0gW10sCisJCQlwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLAorCisJCQkvLyBH ZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dAorCQkJZWxlbXMgPSBzZWVk IHx8IG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yIHx8ICIqIiwgY29udGV4dC5ub2RlVHlwZSA/ IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSwKKworCQkJLy8gUHJlZmlsdGVyIHRvIGdldCBt YXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25p emF0aW9uCisJCQltYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciAp ID8KKwkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwg KSA6CisJCQkJZWxlbXMsCisKKwkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KKwkJCQkvLyBJZiB3 ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZp bHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLAorCQkJCXBvc3RGaW5kZXIgfHwgKCBzZWVkID8g cHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID8KKworCQkJCQkvLyAuLi5p bnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkKKwkJCQkJW10gOgorCisJCQkJCS8v IC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseQorCQkJCQlyZXN1bHRzIDoKKwkJCQlt YXRjaGVySW47CisKKwkJLy8gRmluZCBwcmltYXJ5IG1hdGNoZXMKKwkJaWYgKCBtYXRjaGVyICkg eworCQkJbWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTsKKwkJ fQorCisJCS8vIEFwcGx5IHBvc3RGaWx0ZXIKKwkJaWYgKCBwb3N0RmlsdGVyICkgeworCQkJdGVt cCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CisJCQlwb3N0RmlsdGVyKCB0ZW1w LCBbXSwgY29udGV4dCwgeG1sICk7CisKKwkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMg YnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KKwkJCWkgPSB0ZW1wLmxlbmd0aDsKKwkJ CXdoaWxlICggaS0tICkgeworCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKKwkJCQkJbWF0 Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0p OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICggc2VlZCApIHsKKwkJCWlmICggcG9zdEZpbmRl ciB8fCBwcmVGaWx0ZXIgKSB7CisJCQkJaWYgKCBwb3N0RmluZGVyICkgeworCQkJCQkvLyBHZXQg dGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRv IHBvc3RGaW5kZXIgY29udGV4dHMKKwkJCQkJdGVtcCA9IFtdOworCQkJCQlpID0gbWF0Y2hlck91 dC5sZW5ndGg7CisJCQkJCXdoaWxlICggaS0tICkgeworCQkJCQkJaWYgKCAoZWxlbSA9IG1hdGNo ZXJPdXRbaV0pICkgeworCQkJCQkJCS8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMg bm90IHlldCBhIGZpbmFsIG1hdGNoCisJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0g ZWxlbSkgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hl ck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CisJCQkJfQorCisJCQkJLy8gTW92ZSBtYXRjaGVkIGVs ZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKKwkJ CQlpID0gbWF0Y2hlck91dC5sZW5ndGg7CisJCQkJd2hpbGUgKCBpLS0gKSB7CisJCQkJCWlmICgg KGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgorCQkJCQkJKHRlbXAgPSBwb3N0RmluZGVyID8gaW5k ZXhPZi5jYWxsKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CisKKwkJCQkJCXNl ZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0K KworCQkvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRl ZmluZWQKKwkJfSBlbHNlIHsKKwkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKKwkJCQltYXRjaGVy T3V0ID09PSByZXN1bHRzID8KKwkJCQkJbWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBt YXRjaGVyT3V0Lmxlbmd0aCApIDoKKwkJCQkJbWF0Y2hlck91dAorCQkJKTsKKwkJCWlmICggcG9z dEZpbmRlciApIHsKKwkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4 bWwgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCAp OworCQkJfQorCQl9CisJfSk7Cit9CisKK2Z1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tl bnMgKSB7CisJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKKwkJbGVuID0gdG9rZW5zLmxl bmd0aCwKKwkJbGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUg XSwKKwkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZl WyIgIl0sCisJCWkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKKworCQkvLyBUaGUgZm91bmRh dGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0 b3AtbGV2ZWwgY29udGV4dChzKQorCQltYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5j dGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtID09PSBjaGVja0NvbnRleHQ7CisJCX0sIGlt cGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKKwkJbWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRv ciggZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBjaGVja0NvbnRl eHQsIGVsZW0gKSA+IC0xOworCQl9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisJCW1hdGNo ZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworCQkJcmV0dXJuICggIWxl YWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkg KSB8fCAoCisJCQkJKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KKwkJCQkJbWF0 Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CisJCQkJCW1hdGNoQW55Q29udGV4dCgg ZWxlbSwgY29udGV4dCwgeG1sICkgKTsKKwkJfSBdOworCisJZm9yICggOyBpIDwgbGVuOyBpKysg KSB7CisJCWlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSAp IHsKKwkJCW1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVy cyApLCBtYXRjaGVyKSBdOworCQl9IGVsc2UgeworCQkJbWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0 b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApOworCisJCQkv LyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgorCQkJaWYg KCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7CisJCQkJLy8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBv cGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nCisJCQkJaiA9ICsraTsKKwkJCQlm b3IgKCA7IGogPCBsZW47IGorKyApIHsKKwkJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNb al0udHlwZSBdICkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHNl dE1hdGNoZXIoCisJCQkJCWkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLAorCQkJ CQlpID4gMSAmJiB0b1NlbGVjdG9yKAorCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3 YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVu dCBgKmAKKwkJCQkJCXRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9r ZW5zWyBpIC0gMiBdLnR5cGUgPT09ICIgIiA/ICIqIiA6ICIiIH0pCisJCQkJCSkucmVwbGFjZSgg cnRyaW0sICIkMSIgKSwKKwkJCQkJbWF0Y2hlciwKKwkJCQkJaSA8IGogJiYgbWF0Y2hlckZyb21U b2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksCisJCQkJCWogPCBsZW4gJiYgbWF0Y2hlckZy b21Ub2tlbnMoICh0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSkgKSwKKwkJCQkJaiA8IGxlbiAm JiB0b1NlbGVjdG9yKCB0b2tlbnMgKQorCQkJCSk7CisJCQl9CisJCQltYXRjaGVycy5wdXNoKCBt YXRjaGVyICk7CisJCX0KKwl9CisKKwlyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7 Cit9CisKK2Z1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJz LCBzZXRNYXRjaGVycyApIHsKKwl2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLAor CQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKKwkJc3VwZXJNYXRjaGVy ID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkgewor CQkJdmFyIGVsZW0sIGosIG1hdGNoZXIsCisJCQkJbWF0Y2hlZENvdW50ID0gMCwKKwkJCQlpID0g IjAiLAorCQkJCXVubWF0Y2hlZCA9IHNlZWQgJiYgW10sCisJCQkJc2V0TWF0Y2hlZCA9IFtdLAor CQkJCWNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LAorCQkJCS8vIFdlIG11c3QgYWx3 YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHQKKwkJCQll bGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJt b3N0ICksCisJCQkJLy8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJt b3N0IG1hdGNoZXIKKwkJCQlkaXJydW5zVW5pcXVlID0gKGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1 cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xKSwKKwkJCQlsZW4gPSBlbGVtcy5s ZW5ndGg7CisKKwkJCWlmICggb3V0ZXJtb3N0ICkgeworCQkJCW91dGVybW9zdENvbnRleHQgPSBj b250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0OworCQkJfQorCisJCQkvLyBBZGQgZWxlbWVu dHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0cworCQkJLy8gS2Vl cCBgaWAgYSBzdHJpbmcgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIHNvIGBtYXRjaGVkQ291bnRg IHdpbGwgYmUgIjAwIiBiZWxvdworCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCisJCQkvLyBU b2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogImxlbmd0aCI7IFNhZmFyaTogPG51bWJl cj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkCisJCQlmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxl bSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxl bSApIHsKKwkJCQkJaiA9IDA7CisJCQkJCXdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hl cnNbaisrXSkgKSB7CisJCQkJCQlpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkg eworCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQor CQkJCQl9CisJCQkJCWlmICggb3V0ZXJtb3N0ICkgeworCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNV bmlxdWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMg Zm9yIHNldCBmaWx0ZXJzCisJCQkJaWYgKCBieVNldCApIHsKKwkJCQkJLy8gVGhleSB3aWxsIGhh dmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycworCQkJCQlpZiAoIChlbGVtID0g IW1hdGNoZXIgJiYgZWxlbSkgKSB7CisJCQkJCQltYXRjaGVkQ291bnQtLTsKKwkJCQkJfQorCisJ CQkJCS8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBu b3QKKwkJCQkJaWYgKCBzZWVkICkgeworCQkJCQkJdW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKKwkJ CQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVk IGVsZW1lbnRzCisJCQltYXRjaGVkQ291bnQgKz0gaTsKKwkJCWlmICggYnlTZXQgJiYgaSAhPT0g bWF0Y2hlZENvdW50ICkgeworCQkJCWogPSAwOworCQkJCXdoaWxlICggKG1hdGNoZXIgPSBzZXRN YXRjaGVyc1tqKytdKSApIHsKKwkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBj b250ZXh0LCB4bWwgKTsKKwkJCQl9CisKKwkJCQlpZiAoIHNlZWQgKSB7CisJCQkJCS8vIFJlaW50 ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmcK KwkJCQkJaWYgKCBtYXRjaGVkQ291bnQgPiAwICkgeworCQkJCQkJd2hpbGUgKCBpLS0gKSB7CisJ CQkJCQkJaWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHsKKwkJCQkJCQkJ c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7CisJCQkJCQkJfQorCQkJCQkJfQor CQkJCQl9CisKKwkJCQkJLy8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0 IG9ubHkgYWN0dWFsIG1hdGNoZXMKKwkJCQkJc2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRj aGVkICk7CisJCQkJfQorCisJCQkJLy8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0cworCQkJCXB1c2gu YXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKKworCQkJCS8vIFNlZWRsZXNzIHNldCBtYXRj aGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29y dGluZworCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4g MCAmJgorCQkJCQkoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHsK KworCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOworCQkJCX0KKwkJCX0KKworCQkJ Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzCisJ CQlpZiAoIG91dGVybW9zdCApIHsKKwkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKKwkJCQlv dXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDsKKwkJCX0KKworCQkJcmV0dXJuIHVubWF0 Y2hlZDsKKwkJfTsKKworCXJldHVybiBieVNldCA/CisJCW1hcmtGdW5jdGlvbiggc3VwZXJNYXRj aGVyICkgOgorCQlzdXBlck1hdGNoZXI7Cit9CisKK2NvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9 IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CisJ dmFyIGksCisJCXNldE1hdGNoZXJzID0gW10sCisJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAorCQlj YWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArICIgIiBdOworCisJaWYgKCAhY2FjaGVk ICkgeworCQkvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhh dCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnQKKwkJaWYgKCAhbWF0Y2ggKSB7CisJ CQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOworCQl9CisJCWkgPSBtYXRjaC5sZW5ndGg7 CisJCXdoaWxlICggaS0tICkgeworCQkJY2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNo W2ldICk7CisJCQlpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgeworCQkJCXNldE1hdGNoZXJzLnB1 c2goIGNhY2hlZCApOworCQkJfSBlbHNlIHsKKwkJCQllbGVtZW50TWF0Y2hlcnMucHVzaCggY2Fj aGVkICk7CisJCQl9CisJCX0KKworCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KKwkJ Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVy cyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7CisKKwkJLy8gU2F2ZSBzZWxlY3Rv ciBhbmQgdG9rZW5pemF0aW9uCisJCWNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yOworCX0KKwly ZXR1cm4gY2FjaGVkOworfTsKKworLyoqCisgKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rp b24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkCisgKiAgc2VsZWN0b3IgZnVuY3Rp b25zCisgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBh IHByZS1jb21waWxlZAorICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNv bXBpbGUKKyAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dAorICogQHBhcmFtIHtBcnJheX0gW3Jl c3VsdHNdCisgKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0 Y2ggYWdhaW5zdAorICovCitzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVj dG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgeworCXZhciBpLCB0b2tlbnMsIHRva2VuLCB0 eXBlLCBmaW5kLAorCQljb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiAm JiBzZWxlY3RvciwKKwkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29t cGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CisKKwlyZXN1bHRzID0gcmVzdWx0cyB8fCBb XTsKKworCS8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG5vIHNlZWQg YW5kIG9ubHkgb25lIGdyb3VwCisJaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7CisKKwkJLy8g VGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3Ig aXMgYW4gSUQKKwkJdG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApOworCQlp ZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklE IiAmJgorCQkJCXN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRv Y3VtZW50SXNIVE1MICYmCisJCQkJRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsK KworCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxh Y2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKKwkJCWlmICgg IWNvbnRleHQgKSB7CisJCQkJcmV0dXJuIHJlc3VsdHM7CisKKwkJCS8vIFByZWNvbXBpbGVkIG1h dGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWwKKwkJ CX0gZWxzZSBpZiAoIGNvbXBpbGVkICkgeworCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5v ZGU7CisJCQl9CisKKwkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgp LnZhbHVlLmxlbmd0aCApOworCQl9CisKKwkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQt dG8tbGVmdCBtYXRjaGluZworCQlpID0gbWF0Y2hFeHByWyJuZWVkc0NvbnRleHQiXS50ZXN0KCBz ZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7CisJCXdoaWxlICggaS0tICkgeworCQkJdG9r ZW4gPSB0b2tlbnNbaV07CisKKwkJCS8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3IKKwkJ CWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgeworCQkJCWJyZWFr OworCQkJfQorCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKKwkJCQkvLyBT ZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMK KwkJCQlpZiAoIChzZWVkID0gZmluZCgKKwkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBy dW5lc2NhcGUsIGZ1bmVzY2FwZSApLAorCQkJCQlyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlw ZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CisJCQkJ KSkgKSB7CisKKwkJCQkJLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3 ZSBjYW4gcmV0dXJuIGVhcmx5CisJCQkJCXRva2Vucy5zcGxpY2UoIGksIDEgKTsKKwkJCQkJc2Vs ZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKwkJCQkJaWYgKCAh c2VsZWN0b3IgKSB7CisJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7CisJCQkJCQly ZXR1cm4gcmVzdWx0czsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQor CX0KKworCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25l IGlzIG5vdCBwcm92aWRlZAorCS8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXph dGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKwkoIGNvbXBpbGVkIHx8IGNv bXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoCisJCXNlZWQsCisJCWNvbnRleHQsCisJCSFkb2N1 bWVudElzSFRNTCwKKwkJcmVzdWx0cywKKwkJcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0 ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dAorCSk7CisJcmV0dXJu IHJlc3VsdHM7Cit9OworCisvLyBPbmUtdGltZSBhc3NpZ25tZW50cworCisvLyBTb3J0IHN0YWJp bGl0eQorc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9y ZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CisKKy8vIFN1cHBvcnQ6IENocm9tZTwxNAorLy8g QWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29t cGFyaXNvbiBmdW5jdGlvbgorc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNh dGU7CisKKy8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudAorc2V0RG9j dW1lbnQoKTsKKworLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJv bWUgMjUgKGZpeGVkIGluIENocm9tZSAyNykKKy8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5n bHkgZm9sbG93ICplYWNoIG90aGVyKgorc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVu Y3Rpb24oIGRpdjEgKSB7CisJLy8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xs b3dpbmcpCisJcmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoImRpdiIpICkgJiAxOworfSk7CisKKy8vIFN1cHBvcnQ6IElFPDgKKy8vIFBy ZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgorLy8gaHR0cDovL21zZG4u bWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAoraWYg KCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScj Jz48L2E+IjsKKwlyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09 ICIjIiA7Cit9KSApIHsKKwlhZGRIYW5kbGUoICJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIiwgZnVu Y3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgeworCQlpZiAoICFpc1hNTCApIHsKKwkJCXJldHVy biBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSAidHlwZSIg PyAxIDogMiApOworCQl9CisJfSk7Cit9CisKKy8vIFN1cHBvcnQ6IElFPDkKKy8vIFVzZSBkZWZh dWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpCitpZiAoICFzdXBwb3J0 LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCWRpdi5pbm5lckhUTUwg PSAiPGlucHV0Lz4iOworCWRpdi5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggInZhbHVlIiwgIiIg KTsKKwlyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIi OworfSkgKSB7CisJYWRkSGFuZGxlKCAidmFsdWUiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNY TUwgKSB7CisJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0g ImlucHV0IiApIHsKKwkJCXJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTsKKwkJfQorCX0pOworfQor CisvLyBTdXBwb3J0OiBJRTw5CisvLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29s ZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzCitpZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiAp IHsKKwlyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PSBudWxsOworfSkgKSB7 CisJYWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewor CQl2YXIgdmFsOworCQlpZiAoICFpc1hNTCApIHsKKwkJCXJldHVybiBlbGVtWyBuYW1lIF0gPT09 IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOgorCQkJCQkodmFsID0gZWxlbS5nZXRBdHRyaWJ1 dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgPworCQkJCQl2YWwudmFsdWUgOgorCQkJ CW51bGw7CisJCX0KKwl9KTsKK30KKworcmV0dXJuIFNpenpsZTsKKworfSkoIHdpbmRvdyApOwor CisKKworalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3Rv cnM7CitqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIucHNldWRvczsKK2pRdWVyeS51bmlx dWUgPSBTaXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7Citq UXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVlcnkuY29udGFpbnMgPSBTaXp6bGUu Y29udGFpbnM7CisKKworCit2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5l ZWRzQ29udGV4dDsKKwordmFyIHJzaW5nbGVUYWcgPSAoL148KFx3KylccypcLz8+KD86PFwvXDE+ fCkkLyk7CisKKworCit2YXIgcmlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLzsKKworLy8gSW1w bGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKK2Z1 bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgeworCWlmICggalF1ZXJ5 LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkgeworCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1l bnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKKwkJCS8qIGpzaGludCAtVzAxOCAqLworCQkJcmV0 dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OworCQl9KTsKKwor CX0KKworCWlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkgeworCQlyZXR1cm4galF1ZXJ5LmdyZXAo IGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxp ZmllciApICE9PSBub3Q7CisJCX0pOworCisJfQorCisJaWYgKCB0eXBlb2YgcXVhbGlmaWVyID09 PSAic3RyaW5nIiApIHsKKwkJaWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CisJ CQlyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7CisJCX0K KworCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7CisJ fQorCisJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJ CXJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPj0gMCApICE9PSBub3Q7 CisJfSk7Cit9CisKK2pRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCAp IHsKKwl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CisKKwlpZiAoIG5vdCApIHsKKwkJZXhwciA9ICI6 bm90KCIgKyBleHByICsgIikiOworCX0KKworCXJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYg ZWxlbS5ub2RlVHlwZSA9PT0gMSA/CisJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxl bSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6CisJCWpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIs IGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbS5u b2RlVHlwZSA9PT0gMTsKKwkJfSkpOworfTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJZmluZDog ZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgaSwKKwkJCWxlbiA9IHRoaXMubGVuZ3RoLAor CQkJcmV0ID0gW10sCisJCQlzZWxmID0gdGhpczsKKworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAh PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0 b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CisJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyAp IHsKKwkJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkgeworCQkJ CQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9KSApOworCQl9CisKKwkJZm9yICgg aSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkJCWpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsg aSBdLCByZXQgKTsKKwkJfQorCisJCS8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250 ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQorCQlyZXQgPSB0aGlz LnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisJCXJl dC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgIiAiICsgc2VsZWN0 b3IgOiBzZWxlY3RvcjsKKwkJcmV0dXJuIHJldDsKKwl9LAorCWZpbHRlcjogZnVuY3Rpb24oIHNl bGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3Rv ciB8fCBbXSwgZmFsc2UpICk7CisJfSwKKwlub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJ cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUp ICk7CisJfSwKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISF3aW5ub3co CisJCQl0aGlzLAorCisJCQkvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxl Y3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0CisJCQkvLyBzbyAkKCJw OmZpcnN0IikuaXMoInA6bGFzdCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3 byAicCIuCisJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQu dGVzdCggc2VsZWN0b3IgKSA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKKwkJCQlzZWxlY3Rv ciB8fCBbXSwKKwkJCWZhbHNlCisJCSkubGVuZ3RoOworCX0KK30pOworCisKKy8vIEluaXRpYWxp emUgYSBqUXVlcnkgb2JqZWN0CisKKworLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9v dCBqUXVlcnkoZG9jdW1lbnQpCit2YXIgcm9vdGpRdWVyeSwKKworCS8vIEEgc2ltcGxlIHdheSB0 byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCisJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0 byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQorCS8vIFN0cmljdCBIVE1MIHJl Y29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQorCXJxdWlja0V4cHIgPSAvXig/ OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAorCisJaW5pdCA9IGpRdWVyeS5mbi5p bml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQl2YXIgbWF0Y2gsIGVsZW07 CisKKwkJLy8gSEFORExFOiAkKCIiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKQor CQlpZiAoICFzZWxlY3RvciApIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJLy8gSGFuZGxl IEhUTUwgc3RyaW5ncworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CisJ CQlpZiAoIHNlbGVjdG9yWzBdID09PSAiPCIgJiYgc2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAt IDEgXSA9PT0gIj4iICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkgeworCQkJCS8vIEFzc3VtZSB0 aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAg dGhlIHJlZ2V4IGNoZWNrCisJCQkJbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07CisK KwkJCX0gZWxzZSB7CisJCQkJbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7CisJ CQl9CisKKwkJCS8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lm aWVkIGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsK KworCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hbMV0g KSB7CisJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsw XSA6IGNvbnRleHQ7CisKKwkJCQkJLy8gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdAor CQkJCQkvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRN TCBpcyBub3QgcHJlc2VudAorCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhU TUwoCisJCQkJCQltYXRjaFsxXSwKKwkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/ IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCisJCQkJCQl0cnVl CisJCQkJCSkgKTsKKworCQkJCQkvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpCisJCQkJCWlmICgg cnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250 ZXh0ICkgKSB7CisJCQkJCQlmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworCQkJCQkJCS8vIFBy b3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGUKKwkJ CQkJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CisJCQkJCQkJ CXRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTsKKworCQkJCQkJCS8vIC4uLmFuZCBv dGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl0aGlz LmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJ CQl9CisKKwkJCQkJcmV0dXJuIHRoaXM7CisKKwkJCQkvLyBIQU5ETEU6ICQoI2lkKQorCQkJCX0g ZWxzZSB7CisJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsK KworCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYg cmV0dXJucworCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50 ICM2OTYzCisJCQkJCWlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJCQkvLyBJ bmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdAorCQkJCQkJ dGhpcy5sZW5ndGggPSAxOworCQkJCQkJdGhpc1swXSA9IGVsZW07CisJCQkJCX0KKworCQkJCQl0 aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKwkJCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwor CQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9CisKKwkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikp CisJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKKwkJCQlyZXR1 cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApOworCisJCQkvLyBI QU5ETEU6ICQoZXhwciwgY29udGV4dCkKKwkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQg dG86ICQoY29udGV4dCkuZmluZChleHByKQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdGhpcy5j b25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CisJCQl9CisKKwkJLy8gSEFO RExFOiAkKERPTUVsZW1lbnQpCisJCX0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewor CQkJdGhpcy5jb250ZXh0ID0gdGhpc1swXSA9IHNlbGVjdG9yOworCQkJdGhpcy5sZW5ndGggPSAx OworCQkJcmV0dXJuIHRoaXM7CisKKwkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQorCQkvLyBTaG9y dGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKKwkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24o IHNlbGVjdG9yICkgKSB7CisJCQlyZXR1cm4gdHlwZW9mIHJvb3RqUXVlcnkucmVhZHkgIT09ICJ1 bmRlZmluZWQiID8KKwkJCQlyb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApIDoKKwkJCQkvLyBF eGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50CisJCQkJc2VsZWN0b3Io IGpRdWVyeSApOworCQl9CisKKwkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVk ICkgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yOworCQkJdGhpcy5jb250 ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkubWFrZUFycmF5 KCBzZWxlY3RvciwgdGhpcyApOworCX07CisKKy8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhl IGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KK2luaXQucHJvdG90eXBl ID0galF1ZXJ5LmZuOworCisvLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCityb290alF1 ZXJ5ID0galF1ZXJ5KCBkb2N1bWVudCApOworCisKK3ZhciBycGFyZW50c3ByZXYgPSAvXig/OnBh cmVudHN8cHJldig/OlVudGlsfEFsbCkpLywKKwkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJv ZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAorCWd1YXJh bnRlZWRVbmlxdWUgPSB7CisJCWNoaWxkcmVuOiB0cnVlLAorCQljb250ZW50czogdHJ1ZSwKKwkJ bmV4dDogdHJ1ZSwKKwkJcHJldjogdHJ1ZQorCX07CisKK2pRdWVyeS5leHRlbmQoeworCWRpcjog ZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7CisJCXZhciBtYXRjaGVkID0gW10sCisJCQl0 cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CisKKwkJd2hpbGUgKCAoZWxlbSA9IGVsZW1b IGRpciBdKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkgeworCQkJaWYgKCBlbGVtLm5vZGVUeXBl ID09PSAxICkgeworCQkJCWlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGls ICkgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltYXRjaGVkLnB1c2goIGVsZW0gKTsKKwkJ CX0KKwkJfQorCQlyZXR1cm4gbWF0Y2hlZDsKKwl9LAorCisJc2libGluZzogZnVuY3Rpb24oIG4s IGVsZW0gKSB7CisJCXZhciBtYXRjaGVkID0gW107CisKKwkJZm9yICggOyBuOyBuID0gbi5uZXh0 U2libGluZyApIHsKKwkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewor CQkJCW1hdGNoZWQucHVzaCggbiApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG1hdGNoZWQ7CisJ fQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsK KwkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLAorCQkJbCA9IHRhcmdldHMu bGVuZ3RoOworCisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXZhciBpID0g MDsKKwkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVyeS5jb250YWlucygg dGhpcywgdGFyZ2V0c1tpXSApICkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJ CX0pOworCX0sCisKKwljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewor CQl2YXIgY3VyLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGgsCisJCQltYXRjaGVkID0g W10sCisJCQlwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBz ZWxlY3RvcnMgIT09ICJzdHJpbmciID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8 fCB0aGlzLmNvbnRleHQgKSA6CisJCQkJMDsKKworCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJ CQlmb3IgKCBjdXIgPSB0aGlzW2ldOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIu cGFyZW50Tm9kZSApIHsKKwkJCQkvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHMKKwkJ CQlpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmIChwb3MgPworCQkJCQlwb3MuaW5kZXgoY3VyKSA+ IC0xIDoKKworCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKKwkJCQkJ Y3VyLm5vZGVUeXBlID09PSAxICYmCisJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3Io Y3VyLCBzZWxlY3RvcnMpKSApIHsKKworCQkJCQltYXRjaGVkLnB1c2goIGN1ciApOworCQkJCQli cmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNo ZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTsKKwl9 LAorCisJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbgorCS8v IHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cworCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsK KworCQkvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAorCQlpZiAoICFlbGVt ICkgeworCQkJcmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0 aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xOworCQl9CisKKwkJLy8gaW5kZXggaW4g c2VsZWN0b3IKKwkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4g aW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CisJCX0KKworCQkvLyBM b2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJuIGluZGV4 T2YuY2FsbCggdGhpcywKKworCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0 aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCisJCQllbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVs ZW0KKwkJKTsKKwl9LAorCisJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJ CXJldHVybiB0aGlzLnB1c2hTdGFjaygKKwkJCWpRdWVyeS51bmlxdWUoCisJCQkJalF1ZXJ5Lm1l cmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKQorCQkJKQorCQkp OworCX0sCisKKwlhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlz LmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/CisJCQl0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZP YmplY3QuZmlsdGVyKHNlbGVjdG9yKQorCQkpOworCX0KK30pOworCitmdW5jdGlvbiBzaWJsaW5n KCBjdXIsIGRpciApIHsKKwl3aGlsZSAoIChjdXIgPSBjdXJbZGlyXSkgJiYgY3VyLm5vZGVUeXBl ICE9PSAxICkge30KKwlyZXR1cm4gY3VyOworfQorCitqUXVlcnkuZWFjaCh7CisJcGFyZW50OiBm dW5jdGlvbiggZWxlbSApIHsKKwkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkJcmV0 dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKKwl9 LAorCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxl bSwgInBhcmVudE5vZGUiICk7CisJfSwKKwlwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBp LCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50 aWwgKTsKKwl9LAorCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gc2libGluZygg ZWxlbSwgIm5leHRTaWJsaW5nIiApOworCX0sCisJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CisJ CXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworCX0sCisJbmV4dEFs bDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNp YmxpbmciICk7CisJfSwKKwlwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpR dWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7CisJfSwKKwluZXh0VW50aWw6IGZ1 bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJu ZXh0U2libGluZyIsIHVudGlsICk7CisJfSwKKwlwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBp LCB1bnRpbCApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmci LCB1bnRpbCApOworCX0sCisJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4g alF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxl bSApOworCX0sCisJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5 LnNpYmxpbmcoIGVsZW0uZmlyc3RDaGlsZCApOworCX0sCisJY29udGVudHM6IGZ1bmN0aW9uKCBl bGVtICkgeworCQlyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5Lm1lcmdlKCBb XSwgZWxlbS5jaGlsZE5vZGVzICk7CisJfQorfSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgeworCWpR dWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKKwkJdmFyIG1h dGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTsKKworCQlpZiAoIG5hbWUuc2xp Y2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CisJCQlzZWxlY3RvciA9IHVudGlsOworCQl9CisKKwkJ aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJbWF0 Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7CisJCX0KKworCQlpZiAo IHRoaXMubGVuZ3RoID4gMSApIHsKKwkJCS8vIFJlbW92ZSBkdXBsaWNhdGVzCisJCQlpZiAoICFn dWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CisJCQkJalF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCAp OworCQkJfQorCisJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJp dmF0aXZlcworCQkJaWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgeworCQkJCW1hdGNo ZWQucmV2ZXJzZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRj aGVkICk7CisJfTsKK30pOwordmFyIHJub3R3aGl0ZSA9ICgvXFMrL2cpOworCisKKworLy8gU3Ry aW5nIHRvIE9iamVjdCBvcHRpb25zIGZvcm1hdCBjYWNoZQordmFyIG9wdGlvbnNDYWNoZSA9IHt9 OworCisvLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3Jt YXR0ZWQgb25lcyBhbmQgc3RvcmUgaW4gY2FjaGUKK2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9w dGlvbnMgKSB7CisJdmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsgb3B0aW9ucyBdID0ge307CisJ alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbigg XywgZmxhZyApIHsKKwkJb2JqZWN0WyBmbGFnIF0gPSB0cnVlOworCX0pOworCXJldHVybiBvYmpl Y3Q7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dp bmcgcGFyYW1ldGVyczoKKyAqCisgKglvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNl LXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93CisgKgkJCXRoZSBjYWxsYmFj ayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKKyAqCisg KiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxi YWNrIGxpc3QgYW5kIGNhbiBiZQorICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KKyAqCisgKiBQ b3NzaWJsZSBvcHRpb25zOgorICoKKyAqCW9uY2U6CQkJd2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNr IGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKQorICoKKyAqCW1l bW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwg YW55IGNhbGxiYWNrIGFkZGVkCisgKgkJCQkJYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQg cmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXplZCIKKyAqCQkJCQl2YWx1ZXMgKGxp a2UgYSBEZWZlcnJlZCkKKyAqCisgKgl1bmlxdWU6CQkJd2lsbCBlbnN1cmUgYSBjYWxsYmFjayBj YW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpCisgKgorICoJ c3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBm YWxzZQorICoKKyAqLworalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewor CisJLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9y bWF0dGVkIGlmIG5lZWRlZAorCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKKwlvcHRpb25z ID0gdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8KKwkJKCBvcHRpb25zQ2FjaGVbIG9wdGlv bnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6CisJCWpRdWVyeS5leHRlbmQoIHt9 LCBvcHRpb25zICk7CisKKwl2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRh YmxlIGxpc3RzKQorCQltZW1vcnksCisJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJl YWR5IGZpcmVkCisJCWZpcmVkLAorCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50 bHkgZmlyaW5nCisJCWZpcmluZywKKwkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBp bnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCisJCWZpcmluZ1N0YXJ0LAorCQkvLyBFbmQg b2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKKwkJZmlyaW5nTGVuZ3RoLAorCQkvLyBJbmRleCBvZiBj dXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKQor CQlmaXJpbmdJbmRleCwKKwkJLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKKwkJbGlzdCA9IFtdLAor CQkvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCisJCXN0YWNrID0g IW9wdGlvbnMub25jZSAmJiBbXSwKKwkJLy8gRmlyZSBjYWxsYmFja3MKKwkJZmlyZSA9IGZ1bmN0 aW9uKCBkYXRhICkgeworCQkJbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTsKKwkJCWZp cmVkID0gdHJ1ZTsKKwkJCWZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDsKKwkJCWZpcmlu Z1N0YXJ0ID0gMDsKKwkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOworCQkJZmlyaW5nID0g dHJ1ZTsKKwkJCWZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmly aW5nSW5kZXgrKyApIHsKKwkJCQlpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFb IDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CisJ CQkJCW1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRk CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWZpcmluZyA9IGZhbHNlOworCQkJaWYgKCBs aXN0ICkgeworCQkJCWlmICggc3RhY2sgKSB7CisJCQkJCWlmICggc3RhY2subGVuZ3RoICkgewor CQkJCQkJZmlyZSggc3RhY2suc2hpZnQoKSApOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICggbWVt b3J5ICkgeworCQkJCQlsaXN0ID0gW107CisJCQkJfSBlbHNlIHsKKwkJCQkJc2VsZi5kaXNhYmxl KCk7CisJCQkJfQorCQkJfQorCQl9LAorCQkvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdAorCQlz ZWxmID0geworCQkJLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNr cyB0byB0aGUgbGlzdAorCQkJYWRkOiBmdW5jdGlvbigpIHsKKwkJCQlpZiAoIGxpc3QgKSB7CisJ CQkJCS8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aAorCQkJCQl2YXIgc3RhcnQg PSBsaXN0Lmxlbmd0aDsKKwkJCQkJKGZ1bmN0aW9uIGFkZCggYXJncyApIHsKKwkJCQkJCWpRdWVy eS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgeworCQkJCQkJCXZhciB0eXBlID0galF1 ZXJ5LnR5cGUoIGFyZyApOworCQkJCQkJCWlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJ CQkJCQkJaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHsKKwkJCQkJ CQkJCWxpc3QucHVzaCggYXJnICk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKCBhcmcg JiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsKKwkJCQkJCQkJLy8gSW5zcGVj dCByZWN1cnNpdmVseQorCQkJCQkJCQlhZGQoIGFyZyApOworCQkJCQkJCX0KKwkJCQkJCX0pOwor CQkJCQl9KSggYXJndW1lbnRzICk7CisJCQkJCS8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxs YmFja3MgdG8gdGhlCisJCQkJCS8vIGN1cnJlbnQgZmlyaW5nIGJhdGNoPworCQkJCQlpZiAoIGZp cmluZyApIHsKKwkJCQkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOworCQkJCQkvLyBXaXRo IG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuCisJCQkJCS8vIHdlIHNob3VsZCBjYWxs IHJpZ2h0IGF3YXkKKwkJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgeworCQkJCQkJZmlyaW5nU3Rh cnQgPSBzdGFydDsKKwkJCQkJCWZpcmUoIG1lbW9yeSApOworCQkJCQl9CisJCQkJfQorCQkJCXJl dHVybiB0aGlzOworCQkJfSwKKwkJCS8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3QK KwkJCXJlbW92ZTogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBsaXN0ICkgeworCQkJCQlqUXVlcnku ZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkgeworCQkJCQkJdmFyIGluZGV4Owor CQkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXgg KSApID4gLTEgKSB7CisJCQkJCQkJbGlzdC5zcGxpY2UoIGluZGV4LCAxICk7CisJCQkJCQkJLy8g SGFuZGxlIGZpcmluZyBpbmRleGVzCisJCQkJCQkJaWYgKCBmaXJpbmcgKSB7CisJCQkJCQkJCWlm ICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkgeworCQkJCQkJCQkJZmlyaW5nTGVuZ3RoLS07CisJ CQkJCQkJCX0KKwkJCQkJCQkJaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKKwkJCQkJCQkJ CWZpcmluZ0luZGV4LS07CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0pOwor CQkJCX0KKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNh bGxiYWNrIGlzIGluIHRoZSBsaXN0LgorCQkJLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJl dHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCisJCQloYXM6 IGZ1bmN0aW9uKCBmbiApIHsKKwkJCQlyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxp c3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKKwkJCX0sCisJCQkvLyBSZW1v dmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0CisJCQllbXB0eTogZnVuY3Rpb24oKSB7CisJ CQkJbGlzdCA9IFtdOworCQkJCWZpcmluZ0xlbmd0aCA9IDA7CisJCQkJcmV0dXJuIHRoaXM7CisJ CQl9LAorCQkJLy8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUKKwkJCWRpc2FibGU6 IGZ1bmN0aW9uKCkgeworCQkJCWxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsKKwkJ CQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBJcyBpdCBkaXNhYmxlZD8KKwkJCWRpc2FibGVk OiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gIWxpc3Q7CisJCQl9LAorCQkJLy8gTG9jayB0aGUg bGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZQorCQkJbG9jazogZnVuY3Rpb24oKSB7CisJCQkJc3Rh Y2sgPSB1bmRlZmluZWQ7CisJCQkJaWYgKCAhbWVtb3J5ICkgeworCQkJCQlzZWxmLmRpc2FibGUo KTsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gSXMgaXQgbG9ja2VkPwor CQkJbG9ja2VkOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gIXN0YWNrOworCQkJfSwKKwkJCS8v IENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMK KwkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKKwkJCQlpZiAoIGxpc3Qg JiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKKwkJCQkJYXJncyA9IGFyZ3MgfHwgW107CisJCQkJ CWFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07CisJ CQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJc3RhY2sucHVzaCggYXJncyApOworCQkJCQl9IGVs c2UgeworCQkJCQkJZmlyZSggYXJncyApOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0aGlz OworCQkJfSwKKwkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJn dW1lbnRzCisJCQlmaXJlOiBmdW5jdGlvbigpIHsKKwkJCQlzZWxmLmZpcmVXaXRoKCB0aGlzLCBh cmd1bWVudHMgKTsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBUbyBrbm93IGlmIHRo ZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKKwkJCWZp cmVkOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gISFmaXJlZDsKKwkJCX0KKwkJfTsKKworCXJl dHVybiBzZWxmOworfTsKKworCitqUXVlcnkuZXh0ZW5kKHsKKworCURlZmVycmVkOiBmdW5jdGlv biggZnVuYyApIHsKKwkJdmFyIHR1cGxlcyA9IFsKKwkJCQkvLyBhY3Rpb24sIGFkZCBsaXN0ZW5l ciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGUKKwkJCQlbICJyZXNvbHZlIiwgImRvbmUiLCBq UXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQiIF0sCisJCQkJWyAicmVq ZWN0IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQi IF0sCisJCQkJWyAibm90aWZ5IiwgInByb2dyZXNzIiwgalF1ZXJ5LkNhbGxiYWNrcygibWVtb3J5 IikgXQorCQkJXSwKKwkJCXN0YXRlID0gInBlbmRpbmciLAorCQkJcHJvbWlzZSA9IHsKKwkJCQlz dGF0ZTogZnVuY3Rpb24oKSB7CisJCQkJCXJldHVybiBzdGF0ZTsKKwkJCQl9LAorCQkJCWFsd2F5 czogZnVuY3Rpb24oKSB7CisJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFy Z3VtZW50cyApOworCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCQkJCXRoZW46IGZ1bmN0aW9u KCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHsKKwkJCQkJdmFyIGZucyA9IGFy Z3VtZW50czsKKwkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIg KSB7CisJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CisJ CQkJCQkJdmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07 CisJCQkJCQkJLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2Fy ZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyCisJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVu Y3Rpb24oKSB7CisJCQkJCQkJCXZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBh cmd1bWVudHMgKTsKKwkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbigg cmV0dXJuZWQucHJvbWlzZSApICkgeworCQkJCQkJCQkJcmV0dXJuZWQucHJvbWlzZSgpCisJCQkJ CQkJCQkJLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQorCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZl ci5yZWplY3QgKQorCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7CisJCQkJ CQkJCX0gZWxzZSB7CisJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0 aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVy bmVkIF0gOiBhcmd1bWVudHMgKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0pOworCQkJCQkJfSk7CisJ CQkJCQlmbnMgPSBudWxsOworCQkJCQl9KS5wcm9taXNlKCk7CisJCQkJfSwKKwkJCQkvLyBHZXQg YSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCisJCQkJLy8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0 aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdAorCQkJCXByb21pc2U6IGZ1 bmN0aW9uKCBvYmogKSB7CisJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQo IG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKKwkJCQl9CisJCQl9LAorCQkJZGVmZXJyZWQgPSB7 fTsKKworCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CisJCXByb21pc2UucGlwZSA9IHBy b21pc2UudGhlbjsKKworCQkvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzCisJCWpRdWVyeS5l YWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKKwkJCXZhciBsaXN0ID0gdHVwbGVb IDIgXSwKKwkJCQlzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07CisKKwkJCS8vIHByb21pc2VbIGRv bmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkCisJCQlwcm9taXNlWyB0dXBsZVsxXSBd ID0gbGlzdC5hZGQ7CisKKwkJCS8vIEhhbmRsZSBzdGF0ZQorCQkJaWYgKCBzdGF0ZVN0cmluZyAp IHsKKwkJCQlsaXN0LmFkZChmdW5jdGlvbigpIHsKKwkJCQkJLy8gc3RhdGUgPSBbIHJlc29sdmVk IHwgcmVqZWN0ZWQgXQorCQkJCQlzdGF0ZSA9IHN0YXRlU3RyaW5nOworCisJCQkJLy8gWyByZWpl Y3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9jaworCQkJ CX0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayAp OworCQkJfQorCisJCQkvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCisJ CQlkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkgeworCQkJCWRlZmVycmVkWyB0dXBs ZVswXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1 bWVudHMgKTsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX07CisJCQlkZWZlcnJlZFsgdHVwbGVbMF0g KyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CisJCX0pOworCisJCS8vIE1ha2UgdGhlIGRlZmVy cmVkIGEgcHJvbWlzZQorCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CisKKwkJLy8gQ2Fs bCBnaXZlbiBmdW5jIGlmIGFueQorCQlpZiAoIGZ1bmMgKSB7CisJCQlmdW5jLmNhbGwoIGRlZmVy cmVkLCBkZWZlcnJlZCApOworCQl9CisKKwkJLy8gQWxsIGRvbmUhCisJCXJldHVybiBkZWZlcnJl ZDsKKwl9LAorCisJLy8gRGVmZXJyZWQgaGVscGVyCisJd2hlbjogZnVuY3Rpb24oIHN1Ym9yZGlu YXRlIC8qICwgLi4uLCBzdWJvcmRpbmF0ZU4gKi8gKSB7CisJCXZhciBpID0gMCwKKwkJCXJlc29s dmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKKwkJCWxlbmd0aCA9IHJlc29sdmVW YWx1ZXMubGVuZ3RoLAorCisJCQkvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5h dGVzCisJCQlyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVl cnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLAorCisJ CQkvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25s eSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC4KKwkJCWRlZmVycmVkID0gcmVtYWlu aW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKKworCQkJLy8gVXBk YXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlcworCQkJdXBk YXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkgeworCQkJCXJldHVybiBm dW5jdGlvbiggdmFsdWUgKSB7CisJCQkJCWNvbnRleHRzWyBpIF0gPSB0aGlzOworCQkJCQl2YWx1 ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkg OiB2YWx1ZTsKKwkJCQkJaWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkgeworCQkJCQkJ ZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApOworCQkJCQl9IGVsc2UgaWYg KCAhKCAtLXJlbWFpbmluZyApICkgeworCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRl eHRzLCB2YWx1ZXMgKTsKKwkJCQkJfQorCQkJCX07CisJCQl9LAorCisJCQlwcm9ncmVzc1ZhbHVl cywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzOworCisJCS8vIGFkZCBsaXN0ZW5l cnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWQKKwkJ aWYgKCBsZW5ndGggPiAxICkgeworCQkJcHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0 aCApOworCQkJcHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CisJCQlyZXNv bHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworCQkJZm9yICggOyBpIDwgbGVuZ3Ro OyBpKysgKSB7CisJCQkJaWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rp b24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7CisJCQkJCXJlc29sdmVWYWx1ZXNb IGkgXS5wcm9taXNlKCkKKwkJCQkJCS5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4 dHMsIHJlc29sdmVWYWx1ZXMgKSApCisJCQkJCQkuZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKKwkJ CQkJCS5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NW YWx1ZXMgKSApOworCQkJCX0gZWxzZSB7CisJCQkJCS0tcmVtYWluaW5nOworCQkJCX0KKwkJCX0K KwkJfQorCisJCS8vIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRo ZSBtYXN0ZXIKKwkJaWYgKCAhcmVtYWluaW5nICkgeworCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgo IHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApOworCQl9CisKKwkJcmV0dXJuIGRlZmVy cmVkLnByb21pc2UoKTsKKwl9Cit9KTsKKworCisvLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00g cmVhZHkKK3ZhciByZWFkeUxpc3Q7CisKK2pRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiAp IHsKKwkvLyBBZGQgdGhlIGNhbGxiYWNrCisJalF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBm biApOworCisJcmV0dXJuIHRoaXM7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKwkvLyBJcyB0aGUg RE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgorCWlzUmVh ZHk6IGZhbHNlLAorCisJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdh aXQgZm9yIGJlZm9yZQorCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCisJcmVh ZHlXYWl0OiAxLAorCisJLy8gSG9sZCAob3IgcmVsZWFzZSkgdGhlIHJlYWR5IGV2ZW50CisJaG9s ZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHsKKwkJaWYgKCBob2xkICkgeworCQkJalF1ZXJ5LnJl YWR5V2FpdCsrOworCQl9IGVsc2UgeworCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CisJCX0KKwl9 LAorCisJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQorCXJlYWR5OiBmdW5jdGlvbigg d2FpdCApIHsKKworCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdy ZSBhbHJlYWR5IHJlYWR5CisJCWlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2Fp dCA6IGpRdWVyeS5pc1JlYWR5ICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gUmVtZW1iZXIg dGhhdCB0aGUgRE9NIGlzIHJlYWR5CisJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKKworCQkvLyBJ ZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYg bmVlZCBiZQorCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCAp IHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQs IHRvIGV4ZWN1dGUKKwkJcmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkg XSApOworCisJCS8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cworCQlpZiAoIGpRdWVy eS5mbi50cmlnZ2VySGFuZGxlciApIHsKKwkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFu ZGxlciggInJlYWR5IiApOworCQkJalF1ZXJ5KCBkb2N1bWVudCApLm9mZiggInJlYWR5IiApOwor CQl9CisJfQorfSk7CisKKy8qKgorICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYg Y2xlYW51cCBtZXRob2QKKyAqLworZnVuY3Rpb24gY29tcGxldGVkKCkgeworCWRvY3VtZW50LnJl bW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSAp OworCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2Ug KTsKKwlqUXVlcnkucmVhZHkoKTsKK30KKworalF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlv biggb2JqICkgeworCWlmICggIXJlYWR5TGlzdCApIHsKKworCQlyZWFkeUxpc3QgPSBqUXVlcnku RGVmZXJyZWQoKTsKKworCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgp IGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4K KwkJLy8gd2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSAiaW50ZXJhY3RpdmUiIGhlcmUs IGJ1dCBpdCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZQorCQkvLyBkaXNjb3ZlcmVkIGJ5IENo cmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1 CisJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKKwkJCS8vIEhh bmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0 byBkZWxheSByZWFkeQorCQkJc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7CisKKwkJfSBlbHNl IHsKKworCQkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworCQkJZG9jdW1lbnQuYWRk RXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7CisK KwkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3Jr CisJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7 CisJCX0KKwl9CisJcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTsKK307CisKKy8vIEtp Y2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdAoralF1 ZXJ5LnJlYWR5LnByb21pc2UoKTsKKworCisKKworLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0 byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCisvLyBUaGUgdmFsdWUvcyBjYW4g b3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KK3ZhciBhY2Nlc3MgPSBq UXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxl LCBlbXB0eUdldCwgcmF3ICkgeworCXZhciBpID0gMCwKKwkJbGVuID0gZWxlbXMubGVuZ3RoLAor CQlidWxrID0ga2V5ID09IG51bGw7CisKKwkvLyBTZXRzIG1hbnkgdmFsdWVzCisJaWYgKCBqUXVl cnkudHlwZSgga2V5ICkgPT09ICJvYmplY3QiICkgeworCQljaGFpbmFibGUgPSB0cnVlOworCQlm b3IgKCBpIGluIGtleSApIHsKKwkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ld LCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7CisJCX0KKworCS8vIFNldHMgb25lIHZhbHVlCisJfSBl bHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKwkJY2hhaW5hYmxlID0gdHJ1ZTsKKwor CQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKwkJCXJhdyA9IHRydWU7CisJ CX0KKworCQlpZiAoIGJ1bGsgKSB7CisJCQkvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3Qg dGhlIGVudGlyZSBzZXQKKwkJCWlmICggcmF3ICkgeworCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1 ZSApOworCQkJCWZuID0gbnVsbDsKKworCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1 bmN0aW9uIHZhbHVlcworCQkJfSBlbHNlIHsKKwkJCQlidWxrID0gZm47CisJCQkJZm4gPSBmdW5j dGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKKwkJCQkJcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5 KCBlbGVtICksIHZhbHVlICk7CisJCQkJfTsKKwkJCX0KKwkJfQorCisJCWlmICggZm4gKSB7CisJ CQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJCQlmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8g dmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7 CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY2hhaW5hYmxlID8KKwkJZWxlbXMgOgorCisJCS8v IEdldHMKKwkJYnVsayA/CisJCQlmbi5jYWxsKCBlbGVtcyApIDoKKwkJCWxlbiA/IGZuKCBlbGVt c1swXSwga2V5ICkgOiBlbXB0eUdldDsKK307CisKKworLyoqCisgKiBEZXRlcm1pbmVzIHdoZXRo ZXIgYW4gb2JqZWN0IGNhbiBoYXZlIGRhdGEKKyAqLworalF1ZXJ5LmFjY2VwdERhdGEgPSBmdW5j dGlvbiggb3duZXIgKSB7CisJLy8gQWNjZXB0cyBvbmx5OgorCS8vICAtIE5vZGUKKwkvLyAgICAt IE5vZGUuRUxFTUVOVF9OT0RFCisJLy8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREUKKwkvLyAgLSBP YmplY3QKKwkvLyAgICAtIEFueQorCS8qIGpzaGludCAtVzAxOCAqLworCXJldHVybiBvd25lci5u b2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5 cGUgKTsKK307CisKKworZnVuY3Rpb24gRGF0YSgpIHsKKwkvLyBTdXBwb3J0OiBBbmRyb2lkIDwg NCwKKwkvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25z L2ZyZWV6ZSBtZXRob2QsCisJLy8gcmV0dXJuIG5ldyBlbXB0eSBvYmplY3QgaW5zdGVhZCB3aXRo IG5vIFtbc2V0XV0gYWNjZXNzb3IKKwlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMuY2FjaGUg PSB7fSwgMCwgeworCQlnZXQ6IGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIHt9OworCQl9CisJfSk7 CisKKwl0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIE1hdGgucmFuZG9tKCk7Cit9CisK K0RhdGEudWlkID0gMTsKK0RhdGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhOworCitEYXRh LnByb3RvdHlwZSA9IHsKKwlrZXk6IGZ1bmN0aW9uKCBvd25lciApIHsKKwkJLy8gV2UgY2FuIGFj Y2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCisJCS8v IGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCisJCS8vIEFsd2F5cyByZXR1cm4gdGhlIGtl eSBmb3IgYSBmcm96ZW4gb2JqZWN0LgorCQlpZiAoICFEYXRhLmFjY2VwdHMoIG93bmVyICkgKSB7 CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZhciBkZXNjcmlwdG9yID0ge30sCisJCQkvLyBDaGVj ayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5CisJCQl1bmxvY2sg PSBvd25lclsgdGhpcy5leHBhbmRvIF07CisKKwkJLy8gSWYgbm90LCBjcmVhdGUgb25lCisJCWlm ICggIXVubG9jayApIHsKKwkJCXVubG9jayA9IERhdGEudWlkKys7CisKKwkJCS8vIFNlY3VyZSBp dCBpbiBhIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUgcHJvcGVydHkKKwkJCXRyeSB7CisJ CQkJZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTsKKwkJCQlP YmplY3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTsKKworCQkJLy8gU3Vw cG9ydDogQW5kcm9pZCA8IDQKKwkJCS8vIEZhbGxiYWNrIHRvIGEgbGVzcyBzZWN1cmUgZGVmaW5p dGlvbgorCQkJfSBjYXRjaCAoIGUgKSB7CisJCQkJZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0g PSB1bmxvY2s7CisJCQkJalF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTsKKwkJCX0K KwkJfQorCisJCS8vIEVuc3VyZSB0aGUgY2FjaGUgb2JqZWN0CisJCWlmICggIXRoaXMuY2FjaGVb IHVubG9jayBdICkgeworCQkJdGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTsKKwkJfQorCisJCXJl dHVybiB1bmxvY2s7CisJfSwKKwlzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7 CisJCXZhciBwcm9wLAorCQkJLy8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0 aGlzIG5vZGUsCisJCQkvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyAib3duZXIiLCBj cmVhdGUgb25lIGlubGluZQorCQkJLy8gYW5kIHNldCB0aGUgdW5sb2NrIGFzIHRob3VnaCBhbiBv d25lciBlbnRyeSBoYWQgYWx3YXlzIGV4aXN0ZWQKKwkJCXVubG9jayA9IHRoaXMua2V5KCBvd25l ciApLAorCQkJY2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTsKKworCQkvLyBIYW5kbGU6IFsg b3duZXIsIGtleSwgdmFsdWUgXSBhcmdzCisJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmci ICkgeworCQkJY2FjaGVbIGRhdGEgXSA9IHZhbHVlOworCisJCS8vIEhhbmRsZTogWyBvd25lciwg eyBwcm9wZXJ0aWVzIH0gXSBhcmdzCisJCX0gZWxzZSB7CisJCQkvLyBGcmVzaCBhc3NpZ25tZW50 cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkCisJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2Jq ZWN0KCBjYWNoZSApICkgeworCQkJCWpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBd LCBkYXRhICk7CisJCQkvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9u ZSB0byB0aGUgY2FjaGUgb2JqZWN0CisJCQl9IGVsc2UgeworCQkJCWZvciAoIHByb3AgaW4gZGF0 YSApIHsKKwkJCQkJY2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTsKKwkJCQl9CisJCQl9CisJ CX0KKwkJcmV0dXJuIGNhY2hlOworCX0sCisJZ2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsK KwkJLy8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC4K KwkJLy8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQs CisJCS8vIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKKwkJLy8g ZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQu CisJCXZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07CisKKwkJcmV0 dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KKwkJCWNhY2hlIDogY2FjaGVbIGtleSBdOworCX0sCisJ YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7CisJCXZhciBzdG9yZWQ7CisJ CS8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjoKKwkJLy8KKwkJLy8gICAxLiBObyBrZXkgd2FzIHNw ZWNpZmllZAorCQkvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFs dWUgcHJvdmlkZWQKKwkJLy8KKwkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRo ZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQorCQkvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJl c3BlY3RpdmVseSBlaXRoZXI6CisJCS8vCisJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmpl Y3QKKwkJLy8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleQorCQkvLworCQlpZiAoIGtl eSA9PT0gdW5kZWZpbmVkIHx8CisJCQkJKChrZXkgJiYgdHlwZW9mIGtleSA9PT0gInN0cmluZyIp ICYmIHZhbHVlID09PSB1bmRlZmluZWQpICkgeworCisJCQlzdG9yZWQgPSB0aGlzLmdldCggb3du ZXIsIGtleSApOworCisJCQlyZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQgPworCQkJCXN0b3Jl ZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7CisJCX0KKworCQkv LyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1 ZQorCQkvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3 aXRoIGVpdGhlcjoKKwkJLy8KKwkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcworCQkv LyAgIDIuIEEga2V5IGFuZCB2YWx1ZQorCQkvLworCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFs dWUgKTsKKworCQkvLyBTaW5jZSB0aGUgInNldCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUg ZW50cnkgcG9pbnRzCisJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGlj aCBwYXRoIHdhcyB0YWtlblsqXQorCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVl IDoga2V5OworCX0sCisJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKKwkJdmFyIGks IG5hbWUsIGNhbWVsLAorCQkJdW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksCisJCQljYWNoZSA9 IHRoaXMuY2FjaGVbIHVubG9jayBdOworCisJCWlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7CisJ CQl0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9OworCisJCX0gZWxzZSB7CisJCQkvLyBTdXBwb3J0 IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5cworCQkJaWYgKCBqUXVlcnku aXNBcnJheSgga2V5ICkgKSB7CisJCQkJLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMu Li4KKwkJCQkvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIsICJ2 YWwiKSBzaWduYXR1cmUsCisJCQkJLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENh c2UuCisJCQkJLy8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2Fz IGFkZGVkLCByZW1vdmUKKwkJCQkvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4g IzEyNzg2CisJCQkJLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50 IHBhdGguCisJCQkJbmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2Ug KSApOworCQkJfSBlbHNlIHsKKwkJCQljYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApOwor CQkJCS8vIFRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uCisJ CQkJaWYgKCBrZXkgaW4gY2FjaGUgKSB7CisJCQkJCW5hbWUgPSBbIGtleSwgY2FtZWwgXTsKKwkJ CQl9IGVsc2UgeworCQkJCQkvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2Ug aXQuCisJCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13 aGl0ZXNwYWNlCisJCQkJCW5hbWUgPSBjYW1lbDsKKwkJCQkJbmFtZSA9IG5hbWUgaW4gY2FjaGUg PworCQkJCQkJWyBuYW1lIF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7CisJ CQkJfQorCQkJfQorCisJCQlpID0gbmFtZS5sZW5ndGg7CisJCQl3aGlsZSAoIGktLSApIHsKKwkJ CQlkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdOworCQkJfQorCQl9CisJfSwKKwloYXNEYXRhOiBm dW5jdGlvbiggb3duZXIgKSB7CisJCXJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoCisJCQl0 aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fQorCQkpOworCX0sCisJZGlz Y2FyZDogZnVuY3Rpb24oIG93bmVyICkgeworCQlpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSAp IHsKKwkJCWRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTsKKwkJfQor CX0KK307Cit2YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTsKKwordmFyIGRhdGFfdXNlciA9IG5l dyBEYXRhKCk7CisKKworCisvKgorCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKKworCTEuIEVuZm9y Y2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFu Y2gKKwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcg dGhlIHN0b3JhZ2UKKwkJcGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLgorCTMuIFVzZSB0aGUg c2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgInByaXZhdGUiIGFuZCAidXNlciIgZGF0 YS4KKwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86 IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQorCTUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0 aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKQorCTYu IFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtN YXAgaW4gMjAxNAorKi8KK3ZhciByYnJhY2UgPSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxd KSQvLAorCXJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOworCitmdW5jdGlvbiBkYXRhQXR0ciggZWxl bSwga2V5LCBkYXRhICkgeworCXZhciBuYW1lOworCisJLy8gSWYgbm90aGluZyB3YXMgZm91bmQg aW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQorCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0 YS0qIGF0dHJpYnV0ZQorCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUg PT09IDEgKSB7CisJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICIt JDEiICkudG9Mb3dlckNhc2UoKTsKKwkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7 CisKKwkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisJCQl0cnkgeworCQkJCWRh dGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKKwkJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZh bHNlIDoKKwkJCQkJZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6CisJCQkJCS8vIE9ubHkgY29udmVy dCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCisJCQkJCStkYXRh ICsgIiIgPT09IGRhdGEgPyArZGF0YSA6CisJCQkJCXJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVl cnkucGFyc2VKU09OKCBkYXRhICkgOgorCQkJCQlkYXRhOworCQkJfSBjYXRjaCggZSApIHt9CisK KwkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRl cgorCQkJZGF0YV91c2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7CisJCX0gZWxzZSB7CisJCQlk YXRhID0gdW5kZWZpbmVkOworCQl9CisJfQorCXJldHVybiBkYXRhOworfQorCitqUXVlcnkuZXh0 ZW5kKHsKKwloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGRhdGFfdXNlci5o YXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKTsKKwl9LAorCisJZGF0 YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CisJCXJldHVybiBkYXRhX3VzZXIuYWNj ZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBl bGVtLCBuYW1lICkgeworCQlkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisJfSwKKwor CS8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2 ZSBiZWVuIHJlcGxhY2VkCisJLy8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhv ZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgorCV9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFt ZSwgZGF0YSApIHsKKwkJcmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEg KTsKKwl9LAorCisJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlkYXRh X3ByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQo eworCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQl2YXIgaSwgbmFtZSwgZGF0YSwK KwkJCWVsZW0gPSB0aGlzWyAwIF0sCisJCQlhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVz OworCisJCS8vIEdldHMgYWxsIHZhbHVlcworCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgewor CQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKKwkJCQlkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSAp OworCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVt LCAiaGFzRGF0YUF0dHJzIiApICkgeworCQkJCQlpID0gYXR0cnMubGVuZ3RoOworCQkJCQl3aGls ZSAoIGktLSApIHsKKworCQkJCQkJLy8gU3VwcG9ydDogSUUxMSsKKwkJCQkJCS8vIFRoZSBhdHRy cyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KQorCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkg eworCQkJCQkJCW5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7CisJCQkJCQkJaWYgKCBuYW1lLmluZGV4 T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKKwkJCQkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2Uo IG5hbWUuc2xpY2UoNSkgKTsKKwkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5h bWUgXSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlkYXRhX3ByaXYuc2V0KCBl bGVtLCAiaGFzRGF0YUF0dHJzIiwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGRh dGE7CisJCX0KKworCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcworCQlpZiAoIHR5cGVvZiBrZXkg PT09ICJvYmplY3QiICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQlk YXRhX3VzZXIuc2V0KCB0aGlzLCBrZXkgKTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIGFjY2Vz cyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgeworCQkJdmFyIGRhdGEsCisJCQkJY2FtZWxLZXkg PSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTsKKworCQkJLy8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9i amVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHkKKwkJCS8vIChhbmQgdGhlcmVmb3Jl IGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCisJCQkvLyBgdmFs dWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdAor CQkJLy8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hp Y2ggd2lsbAorCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBh IGRhdGEgY2FjaGUgaXMgbWFkZS4KKwkJCWlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVk ICkgeworCQkJCS8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKwkJCQkvLyB3 aXRoIHRoZSBrZXkgYXMtaXMKKwkJCQlkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSwga2V5ICk7 CisJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXJldHVybiBkYXRhOworCQkJ CX0KKworCQkJCS8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKwkJCQkvLyB3 aXRoIHRoZSBrZXkgY2FtZWxpemVkCisJCQkJZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGNh bWVsS2V5ICk7CisJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXJldHVybiBk YXRhOworCQkJCX0KKworCQkJCS8vIEF0dGVtcHQgdG8gImRpc2NvdmVyIiB0aGUgZGF0YSBpbgor CQkJCS8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnMKKwkJCQlkYXRhID0gZGF0YUF0dHIoIGVs ZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTsKKwkJCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCAp IHsKKwkJCQkJcmV0dXJuIGRhdGE7CisJCQkJfQorCisJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhh cmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgorCQkJCXJldHVybjsKKwkJCX0KKworCQkJ Ly8gU2V0IHRoZSBkYXRhLi4uCisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJLy8gRmly c3QsIGF0dGVtcHQgdG8gc3RvcmUgYSBjb3B5IG9yIHJlZmVyZW5jZSBvZiBhbnkKKwkJCQkvLyBk YXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuCisJCQkJ dmFyIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApOworCisJCQkJLy8gRm9y IEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUgaW50ZXJvcCwgd2UgaGF2ZSB0bworCQkJCS8vIHN0b3Jl IHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uCisJCQkJLy8g VGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qCisJCQkJZGF0YV91c2Vy LnNldCggdGhpcywgY2FtZWxLZXksIHZhbHVlICk7CisKKwkJCQkvLyAqLi4uIEluIHRoZSBjYXNl IG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfCisJCQkJLy8gaGF2ZSBkYXNoZXMs IHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdAorCQkJCS8vIHVuY2hhbmdlZCBw cm9wZXJ0eS4KKwkJCQlpZiAoIGtleS5pbmRleE9mKCItIikgIT09IC0xICYmIGRhdGEgIT09IHVu ZGVmaW5lZCApIHsKKwkJCQkJZGF0YV91c2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApOworCQkJ CX0KKwkJCX0pOworCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGws IHRydWUgKTsKKwl9LAorCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKKwkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWRhdGFfdXNlci5yZW1vdmUoIHRoaXMsIGtleSAp OworCQl9KTsKKwl9Cit9KTsKKworCitqUXVlcnkuZXh0ZW5kKHsKKwlxdWV1ZTogZnVuY3Rpb24o IGVsZW0sIHR5cGUsIGRhdGEgKSB7CisJCXZhciBxdWV1ZTsKKworCQlpZiAoIGVsZW0gKSB7CisJ CQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7CisJCQlxdWV1ZSA9IGRhdGFfcHJp di5nZXQoIGVsZW0sIHR5cGUgKTsKKworCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5n IG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAorCQkJaWYgKCBkYXRhICkgewor CQkJCWlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7CisJCQkJCXF1ZXVl ID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSAp OworCQkJCX0gZWxzZSB7CisJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsKKwkJCQl9CisJCQl9CisJ CQlyZXR1cm4gcXVldWUgfHwgW107CisJCX0KKwl9LAorCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVs ZW0sIHR5cGUgKSB7CisJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisKKwkJdmFyIHF1ZXVlID0galF1 ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCisJCQlzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCwK KwkJCWZuID0gcXVldWUuc2hpZnQoKSwKKwkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBl bGVtLCB0eXBlICksCisJCQluZXh0ID0gZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5LmRlcXVldWUo IGVsZW0sIHR5cGUgKTsKKwkJCX07CisKKwkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVk LCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAorCQlpZiAoIGZuID09PSAiaW5w cm9ncmVzcyIgKSB7CisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7CisJCQlzdGFydExlbmd0aC0tOwor CQl9CisKKwkJaWYgKCBmbiApIHsKKworCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8g cHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZworCQkJLy8gYXV0b21hdGljYWxseSBkZXF1 ZXVlZAorCQkJaWYgKCB0eXBlID09PSAiZngiICkgeworCQkJCXF1ZXVlLnVuc2hpZnQoICJpbnBy b2dyZXNzIiApOworCQkJfQorCisJCQkvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1 bmN0aW9uCisJCQlkZWxldGUgaG9va3Muc3RvcDsKKwkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhv b2tzICk7CisJCX0KKworCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKKwkJCWhvb2tz LmVtcHR5LmZpcmUoKTsKKwkJfQorCX0sCisKKwkvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBj b25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRo ZSBjdXJyZW50IG9uZQorCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKwkJ dmFyIGtleSA9IHR5cGUgKyAicXVldWVIb29rcyI7CisJCXJldHVybiBkYXRhX3ByaXYuZ2V0KCBl bGVtLCBrZXkgKSB8fCBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHsKKwkJCWVtcHR5OiBq UXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKKwkJCQlkYXRh X3ByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyAicXVldWUiLCBrZXkgXSApOworCQkJfSkKKwkJ fSk7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXF1ZXVlOiBmdW5jdGlvbiggdHlw ZSwgZGF0YSApIHsKKwkJdmFyIHNldHRlciA9IDI7CisKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0g InN0cmluZyIgKSB7CisJCQlkYXRhID0gdHlwZTsKKwkJCXR5cGUgPSAiZngiOworCQkJc2V0dGVy LS07CisJCX0KKworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7CisJCQlyZXR1 cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7CisJCX0KKworCQlyZXR1cm4gZGF0YSA9 PT0gdW5kZWZpbmVkID8KKwkJCXRoaXMgOgorCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJ CXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOworCisJCQkJLy8g ZW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWUKKwkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIHRo aXMsIHR5cGUgKTsKKworCQkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlu cHJvZ3Jlc3MiICkgeworCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQkJCX0K KwkJCX0pOworCX0sCisJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisJCXJldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQl9 KTsKKwl9LAorCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5x dWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworCX0sCisJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZl ZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQorCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0 aGUgdHlwZSBieSBkZWZhdWx0KQorCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisJ CXZhciB0bXAsCisJCQljb3VudCA9IDEsCisJCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAor CQkJZWxlbWVudHMgPSB0aGlzLAorCQkJaSA9IHRoaXMubGVuZ3RoLAorCQkJcmVzb2x2ZSA9IGZ1 bmN0aW9uKCkgeworCQkJCWlmICggISggLS1jb3VudCApICkgeworCQkJCQlkZWZlci5yZXNvbHZl V2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOworCQkJCX0KKwkJCX07CisKKwkJaWYgKCB0 eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlvYmogPSB0eXBlOworCQkJdHlwZSA9IHVu ZGVmaW5lZDsKKwkJfQorCQl0eXBlID0gdHlwZSB8fCAiZngiOworCisJCXdoaWxlICggaS0tICkg eworCQkJdG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhv b2tzIiApOworCQkJaWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkgeworCQkJCWNvdW50Kys7CisJCQkJ dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOworCQkJfQorCQl9CisJCXJlc29sdmUoKTsKKwkJcmV0 dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOworCX0KK30pOwordmFyIHBudW0gPSAoL1srLV0/KD86 XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLykuc291cmNlOworCit2YXIgY3NzRXhwYW5kID0g WyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdOworCit2YXIgaXNIaWRkZW4gPSBm dW5jdGlvbiggZWxlbSwgZWwgKSB7CisJCS8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9t IGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247CisJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxs IGJlIHNlY29uZCBhcmd1bWVudAorCQllbGVtID0gZWwgfHwgZWxlbTsKKwkJcmV0dXJuIGpRdWVy eS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlucygg ZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CisJfTsKKwordmFyIHJjaGVja2FibGVUeXBlID0g KC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pKTsKKworCisKKyhmdW5jdGlvbigpIHsKKwl2YXIgZnJh Z21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCisJCWRpdiA9IGZyYWdt ZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICksCisJCWlu cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOworCisJLy8gIzExMjE3IC0g V2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0 cmlidXRlCisJLy8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKQorCS8vIGBuYW1lYCBh bmQgYHR5cGVgIG5lZWQgLnNldEF0dHJpYnV0ZSBmb3IgV1dBCisJaW5wdXQuc2V0QXR0cmlidXRl KCAidHlwZSIsICJyYWRpbyIgKTsKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNo ZWNrZWQiICk7CisJaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOworCisJZGl2LmFw cGVuZENoaWxkKCBpbnB1dCApOworCisJLy8gU3VwcG9ydDogU2FmYXJpIDUuMSwgaU9TIDUuMSwg QW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCisJLy8gb2xkIFdlYktpdCBkb2Vzbid0IGNsb25lIGNo ZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cworCXN1cHBvcnQuY2hlY2tDbG9uZSA9 IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tl ZDsKKworCS8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUg aXMgcHJvcGVybHkgY2xvbmVkCisJLy8gU3VwcG9ydDogSUU5LUlFMTErCisJZGl2LmlubmVySFRN TCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKKwlzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0g ISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsKK30pKCk7Cit2 YXIgc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZDsKKworCisKK3N1cHBvcnQuZm9jdXNp bkJ1YmJsZXMgPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CisKKwordmFyCisJcmtleUV2ZW50ID0g L15rZXkvLAorCXJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51KXxj bGljay8sCisJcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8s CisJcnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcLiguKyl8KSQvOworCitmdW5jdGlvbiBy ZXR1cm5UcnVlKCkgeworCXJldHVybiB0cnVlOworfQorCitmdW5jdGlvbiByZXR1cm5GYWxzZSgp IHsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewor CXRyeSB7CisJCXJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50OworCX0gY2F0Y2ggKCBlcnIg KSB7IH0KK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAt LSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KKyAqIFByb3BzIHRvIERlYW4gRWR3 YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuCisgKi8KK2pRdWVy eS5ldmVudCA9IHsKKworCWdsb2JhbDoge30sCisKKwlhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBl cywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7CisKKwkJdmFyIGhhbmRsZU9iakluLCBldmVu dEhhbmRsZSwgdG1wLAorCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCisJCQlzcGVjaWFsLCBoYW5k bGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCisJCQllbGVtRGF0YSA9IGRhdGFfcHJp di5nZXQoIGVsZW0gKTsKKworCQkvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0 ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKQorCQlpZiAoICFlbGVt RGF0YSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBv YmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgorCQlpZiAoIGhhbmRs ZXIuaGFuZGxlciApIHsKKwkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKKwkJCWhhbmRsZXIgPSBo YW5kbGVPYmpJbi5oYW5kbGVyOworCQkJc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsK KwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwg dXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlcgorCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisJ CQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxl bWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBm aXJzdAorCQlpZiAoICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHsKKwkJCWV2ZW50cyA9 IGVsZW1EYXRhLmV2ZW50cyA9IHt9OworCQl9CisJCWlmICggIShldmVudEhhbmRsZSA9IGVsZW1E YXRhLmhhbmRsZSkgKSB7CisJCQlldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0 aW9uKCBlICkgeworCQkJCS8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5l dmVudC50cmlnZ2VyKCkgYW5kCisJCQkJLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIg YSBwYWdlIGhhcyB1bmxvYWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBzdHJ1bmRl ZmluZWQgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID8KKwkJCQkJalF1ZXJ5 LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDsKKwkJ CX07CisJCX0KKworCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNw YWNlCisJCXR5cGVzID0gKCB0eXBlcyB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIi IF07CisJCXQgPSB0eXBlcy5sZW5ndGg7CisJCXdoaWxlICggdC0tICkgeworCQkJdG1wID0gcnR5 cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKwkJCXR5cGUgPSBvcmlnVHlwZSA9 IHRtcFsxXTsKKwkJCW5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5z b3J0KCk7CisKKwkJCS8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1l c3BhY2Utb25seSBoYW5kbGVycworCQkJaWYgKCAhdHlwZSApIHsKKwkJCQljb250aW51ZTsKKwkJ CX0KKworCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2 ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2 ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwg ZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCisJ CQl0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5k VHlwZSApIHx8IHR5cGU7CisKKwkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJl c2V0IHR5cGUKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9 OworCisJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycworCQkJ aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7CisJCQkJdHlwZTogdHlwZSwKKwkJCQlvcmlnVHlw ZTogb3JpZ1R5cGUsCisJCQkJZGF0YTogZGF0YSwKKwkJCQloYW5kbGVyOiBoYW5kbGVyLAorCQkJ CWd1aWQ6IGhhbmRsZXIuZ3VpZCwKKwkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCisJCQkJbmVlZHND b250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCgg c2VsZWN0b3IgKSwKKwkJCQluYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpCisJCQl9LCBo YW5kbGVPYmpJbiApOworCisJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdl J3JlIHRoZSBmaXJzdAorCQkJaWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgewor CQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKKwkJCQloYW5kbGVycy5kZWxlZ2F0 ZUNvdW50ID0gMDsKKworCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNw ZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQorCQkJCWlmICggIXNwZWNpYWwuc2V0 dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhh bmRsZSApID09PSBmYWxzZSApIHsKKwkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7 CisJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSAp OworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoIHNwZWNpYWwuYWRkICkgeworCQkJCXNw ZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCisJCQkJaWYgKCAhaGFuZGxlT2Jq LmhhbmRsZXIuZ3VpZCApIHsKKwkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIu Z3VpZDsKKwkJCQl9CisJCQl9CisKKwkJCS8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIg bGlzdCwgZGVsZWdhdGVzIGluIGZyb250CisJCQlpZiAoIHNlbGVjdG9yICkgeworCQkJCWhhbmRs ZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKKwkJ CX0gZWxzZSB7CisJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CisJCQl9CisKKwkJCS8v IEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVu dCBvcHRpbWl6YXRpb24KKwkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CisJ CX0KKworCX0sCisKKwkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFu IGVsZW1lbnQKKwlyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0 b3IsIG1hcHBlZFR5cGVzICkgeworCisJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKKwkJCWV2ZW50 cywgdCwgaGFuZGxlT2JqLAorCQkJc3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMs IG9yaWdUeXBlLAorCQkJZWxlbURhdGEgPSBkYXRhX3ByaXYuaGFzRGF0YSggZWxlbSApICYmIGRh dGFfcHJpdi5nZXQoIGVsZW0gKTsKKworCQlpZiAoICFlbGVtRGF0YSB8fCAhKGV2ZW50cyA9IGVs ZW1EYXRhLmV2ZW50cykgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBPbmNlIGZvciBlYWNo IHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCisJCXR5cGVzID0g KCB0eXBlcyB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07CisJCXQgPSB0eXBl cy5sZW5ndGg7CisJCXdoaWxlICggdC0tICkgeworCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhl YyggdHlwZXNbdF0gKSB8fCBbXTsKKwkJCXR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTsKKwkJCW5h bWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CisKKwkJCS8v IFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0 aGUgZWxlbWVudAorCQkJaWYgKCAhdHlwZSApIHsKKwkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyAp IHsKKwkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhh bmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJ CQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKwkJCXR5cGUg PSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkg fHwgdHlwZTsKKwkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107CisJCQl0bXAgPSB0 bXBbMl0gJiYgbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCJcXC4oPzou KlxcLnwpIikgKyAiKFxcLnwkKSIgKTsKKworCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwor CQkJb3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDsKKwkJCXdoaWxlICggai0tICkgewor CQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CisKKwkJCQlpZiAoICggbWFwcGVkVHlwZXMg fHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmCisJCQkJCSggIWhhbmRsZXIg fHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCisJCQkJCSggIXRtcCB8fCB0 bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKKwkJCQkJKCAhc2VsZWN0b3IgfHwg c2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gIioqIiAmJiBo YW5kbGVPYmouc2VsZWN0b3IgKSApIHsKKwkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CisK KwkJCQkJaWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7CisJCQkJCQloYW5kbGVycy5kZWxlZ2F0 ZUNvdW50LS07CisJCQkJCX0KKwkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsKKwkJCQkJCXNw ZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCQkJCQl9CisJCQkJfQorCQkJ fQorCisJCQkvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29t ZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CisJCQkvLyAoYXZvaWRzIHBvdGVudGlh bCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBo YW5kbGVycykKKwkJCWlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7CisJCQkJ aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5h bWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKKwkJCQkJalF1ZXJ5LnJl bW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKKwkJCQl9CisKKwkJCQlk ZWxldGUgZXZlbnRzWyB0eXBlIF07CisJCQl9CisJCX0KKworCQkvLyBSZW1vdmUgdGhlIGV4cGFu ZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBl dmVudHMgKSApIHsKKwkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7CisJCQlkYXRhX3ByaXYucmVt b3ZlKCBlbGVtLCAiZXZlbnRzIiApOworCQl9CisJfSwKKworCXRyaWdnZXI6IGZ1bmN0aW9uKCBl dmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgeworCisJCXZhciBpLCBjdXIsIHRtcCwg YnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsCisJCQlldmVudFBhdGggPSBbIGVs ZW0gfHwgZG9jdW1lbnQgXSwKKwkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiAp ID8gZXZlbnQudHlwZSA6IGV2ZW50LAorCQkJbmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVu dCwgIm5hbWVzcGFjZSIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCgiLiIpIDogW107CisKKwkJ Y3VyID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7CisKKwkJLy8gRG9uJ3QgZG8gZXZl bnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAz IHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBmb2N1 cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhl bSByaWdodCBub3cKKwkJaWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50 LnRyaWdnZXJlZCApICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCB0eXBlLmluZGV4T2Yo Ii4iKSA+PSAwICkgeworCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAg dG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQorCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3Bs aXQoIi4iKTsKKwkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisJCQluYW1lc3BhY2VzLnNv cnQoKTsKKwkJfQorCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoiKSA8IDAgJiYgIm9uIiArIHR5 cGU7CisKKwkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2Jq ZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCisJCWV2ZW50ID0gZXZlbnRbIGpRdWVy eS5leHBhbmRvIF0gPworCQkJZXZlbnQgOgorCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlw ZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOworCisJCS8vIFRyaWdnZXIgYml0bWFz azogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSkK KwkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CisJCWV2ZW50Lm5hbWVz cGFjZSA9IG5hbWVzcGFjZXMuam9pbigiLiIpOworCQlldmVudC5uYW1lc3BhY2VfcmUgPSBldmVu dC5uYW1lc3BhY2UgPworCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2lu KCJcXC4oPzouKlxcLnwpIikgKyAiKFxcLnwkKSIgKSA6CisJCQludWxsOworCisJCS8vIENsZWFu IHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZAorCQlldmVudC5yZXN1bHQg PSB1bmRlZmluZWQ7CisJCWlmICggIWV2ZW50LnRhcmdldCApIHsKKwkJCWV2ZW50LnRhcmdldCA9 IGVsZW07CisJCX0KKworCQkvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0 aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0CisJCWRhdGEgPSBkYXRhID09 IG51bGwgPworCQkJWyBldmVudCBdIDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZl bnQgXSApOworCisJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUg bGluZXMKKwkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisJ CWlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2Vy LmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJ Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBl dmVudHMgc3BlYyAoIzk5NTEpCisJCS8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3 aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpCisJCWlm ICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93 KCBlbGVtICkgKSB7CisKKwkJCWJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0 eXBlOworCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsK KwkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCX0KKwkJCWZvciAoIDsgY3VyOyBjdXIgPSBj dXIucGFyZW50Tm9kZSApIHsKKwkJCQlldmVudFBhdGgucHVzaCggY3VyICk7CisJCQkJdG1wID0g Y3VyOworCQkJfQorCisJCQkvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50 IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSkKKwkJCWlmICggdG1wID09PSAo ZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHsKKwkJCQlldmVudFBhdGgucHVzaCgg dG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7CisJCQl9CisJ CX0KKworCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCisJCWkgPSAwOworCQl3 aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9w cGVkKCkgKSB7CisKKwkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CisJCQkJYnViYmxlVHlwZSA6CisJ CQkJc3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlOworCisJCQkvLyBqUXVlcnkgaGFuZGxlcgorCQkJ aGFuZGxlID0gKCBkYXRhX3ByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQu dHlwZSBdICYmIGRhdGFfcHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKKwkJCWlmICggaGFuZGxl ICkgeworCQkJCWhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7CisJCQl9CisKKwkJCS8vIE5hdGl2 ZSBoYW5kbGVyCisJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKKwkJCWlmICgg aGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgKSB7CisJ CQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKwkJCQlpZiAoIGV2 ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7CisJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJ CQkJfQorCQkJfQorCQl9CisJCWV2ZW50LnR5cGUgPSB0eXBlOworCisJCS8vIElmIG5vYm9keSBw cmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKKwkJaWYgKCAhb25seUhhbmRs ZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKKworCQkJaWYgKCAoIXNwZWNp YWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBk YXRhICkgPT09IGZhbHNlKSAmJgorCQkJCWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CisK KwkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBz YW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCisJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rp b25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQor CQkJCWlmICggb250eXBlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAh alF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisKKwkJCQkJLy8gRG9uJ3QgcmUtdHJpZ2dlciBh biBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZAorCQkJCQl0bXAgPSBl bGVtWyBvbnR5cGUgXTsKKworCQkJCQlpZiAoIHRtcCApIHsKKwkJCQkJCWVsZW1bIG9udHlwZSBd ID0gbnVsbDsKKwkJCQkJfQorCisJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUg c2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCisJCQkJCWpRdWVy eS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOworCQkJCQllbGVtWyB0eXBlIF0oKTsKKwkJCQkJalF1 ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsKKworCQkJCQlpZiAoIHRtcCApIHsKKwkJ CQkJCWVsZW1bIG9udHlwZSBdID0gdG1wOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJ cmV0dXJuIGV2ZW50LnJlc3VsdDsKKwl9LAorCisJZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCAp IHsKKworCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBl dmVudCBvYmplY3QKKwkJZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApOworCisJCXZh ciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwKKwkJCWhhbmRsZXJRdWV1ZSA9IFtdLAor CQkJYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorCQkJaGFuZGxlcnMgPSAoIGRhdGFf cHJpdi5nZXQoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAor CQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CisK KwkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1v bmx5KSBuYXRpdmUgZXZlbnQKKwkJYXJnc1swXSA9IGV2ZW50OworCQlldmVudC5kZWxlZ2F0ZVRh cmdldCA9IHRoaXM7CisKKwkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1h cHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAorCQlpZiAoIHNwZWNpYWwucHJl RGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBm YWxzZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIERldGVybWluZSBoYW5kbGVycworCQlo YW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhh bmRsZXJzICk7CisKKwkJLy8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBz dG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXMKKwkJaSA9IDA7CisJCXdoaWxlICggKG1hdGNoZWQg PSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAp IHsKKwkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CisKKwkJCWogPSAwOwor CQkJd2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVu dC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCisJCQkJLy8gVHJpZ2dlcmVk IGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgorCQkJCS8vIDIpIGhh dmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBl dmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgorCQkJCWlmICggIWV2ZW50Lm5hbWVz cGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSAp ICkgeworCisJCQkJCWV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajsKKwkJCQkJZXZlbnQuZGF0 YSA9IGhhbmRsZU9iai5kYXRhOworCisJCQkJCXJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFs WyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVy ICkKKwkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOworCisJCQkJCWlmICggcmV0 ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCQlpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBm YWxzZSApIHsKKwkJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJCWV2ZW50LnN0 b3BQcm9wYWdhdGlvbigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJ Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQorCQlpZiAo IHNwZWNpYWwucG9zdERpc3BhdGNoICkgeworCQkJc3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCgg dGhpcywgZXZlbnQgKTsKKwkJfQorCisJCXJldHVybiBldmVudC5yZXN1bHQ7CisJfSwKKworCWhh bmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkgeworCQl2YXIgaSwgbWF0Y2hlcywg c2VsLCBoYW5kbGVPYmosCisJCQloYW5kbGVyUXVldWUgPSBbXSwKKwkJCWRlbGVnYXRlQ291bnQg PSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAorCQkJY3VyID0gZXZlbnQudGFyZ2V0OworCisJCS8v IEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKKwkJLy8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFu Y2UgdHJlZXMgKCMxMzE4MCkKKwkJLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4g RmlyZWZveCAoIzM4NjEpCisJCWlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYg KCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7CisKKwkJCWZvciAo IDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkgeworCisJCQkJ Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2 NSwgIzExMzgyLCAjMTE3NjQpCisJCQkJaWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZl bnQudHlwZSAhPT0gImNsaWNrIiApIHsKKwkJCQkJbWF0Y2hlcyA9IFtdOworCQkJCQlmb3IgKCBp ID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHsKKwkJCQkJCWhhbmRsZU9iaiA9IGhhbmRs ZXJzWyBpIF07CisKKwkJCQkJCS8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlw ZSBwcm9wZXJ0aWVzICgjMTMyMDMpCisJCQkJCQlzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyAi ICI7CisKKwkJCQkJCWlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHsKKwkJCQkJ CQltYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgPworCQkJCQkJCQlqUXVl cnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDoKKwkJCQkJCQkJalF1ZXJ5LmZpbmQo IHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDsKKwkJCQkJCX0KKwkJCQkJCWlmICgg bWF0Y2hlc1sgc2VsIF0gKSB7CisJCQkJCQkJbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTsKKwkJ CQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIG1hdGNoZXMubGVuZ3RoICkgeworCQkJCQkJaGFuZGxl clF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pOworCQkJCQl9CisJ CQkJfQorCQkJfQorCQl9CisKKwkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5k KSBoYW5kbGVycworCQlpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7CisJ CQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGlj ZSggZGVsZWdhdGVDb3VudCApIH0pOworCQl9CisKKwkJcmV0dXJuIGhhbmRsZXJRdWV1ZTsKKwl9 LAorCisJLy8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5k IE1vdXNlRXZlbnQKKwlwcm9wczogImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBj dXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRh cmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZpeEhvb2tzOiB7fSwK KworCWtleUhvb2tzOiB7CisJCXByb3BzOiAiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3Bs aXQoIiAiKSwKKwkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgeworCisJCQkv LyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJCWlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAp IHsKKwkJCQlldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5h bC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7CisJCQl9CisKKwkJCXJldHVybiBldmVudDsK KwkJfQorCX0sCisKKwltb3VzZUhvb2tzOiB7CisJCXByb3BzOiAiYnV0dG9uIGJ1dHRvbnMgY2xp ZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkg dG9FbGVtZW50Ii5zcGxpdCgiICIpLAorCQlmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2lu YWwgKSB7CisJCQl2YXIgZXZlbnREb2MsIGRvYywgYm9keSwKKwkJCQlidXR0b24gPSBvcmlnaW5h bC5idXR0b247CisKKwkJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVu dFgvWSBhdmFpbGFibGUKKwkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5j bGllbnRYICE9IG51bGwgKSB7CisJCQkJZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1 bWVudCB8fCBkb2N1bWVudDsKKwkJCQlkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7CisJ CQkJYm9keSA9IGV2ZW50RG9jLmJvZHk7CisKKwkJCQlldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNs aWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVm dCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50 TGVmdCB8fCAwICk7CisJCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsgKCBkb2Mg JiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC0gKCBk b2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOwor CQkJfQorCisJCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRk bGU7IDMgPT09IHJpZ2h0CisJCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNv IGRvbid0IHVzZSBpdAorCQkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmlu ZWQgKSB7CisJCQkJZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAy ID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApOworCQkJfQorCisJCQlyZXR1cm4gZXZl bnQ7CisJCX0KKwl9LAorCisJZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7CisJCWlmICggZXZlbnRb IGpRdWVyeS5leHBhbmRvIF0gKSB7CisJCQlyZXR1cm4gZXZlbnQ7CisJCX0KKworCQkvLyBDcmVh dGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21l IHByb3BlcnRpZXMKKwkJdmFyIGksIHByb3AsIGNvcHksCisJCQl0eXBlID0gZXZlbnQudHlwZSwK KwkJCW9yaWdpbmFsRXZlbnQgPSBldmVudCwKKwkJCWZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0 eXBlIF07CisKKwkJaWYgKCAhZml4SG9vayApIHsKKwkJCXRoaXMuZml4SG9va3NbIHR5cGUgXSA9 IGZpeEhvb2sgPQorCQkJCXJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29r cyA6CisJCQkJcmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOgorCQkJCXt9 OworCQl9CisJCWNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhv b2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKwkJZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBv cmlnaW5hbEV2ZW50ICk7CisKKwkJaSA9IGNvcHkubGVuZ3RoOworCQl3aGlsZSAoIGktLSApIHsK KwkJCXByb3AgPSBjb3B5WyBpIF07CisJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsg cHJvcCBdOworCQl9CisKKwkJLy8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1 NSkKKwkJLy8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdldDsgQ29yZG92YSBkZXZpY2Vy ZWFkeSBkb2Vzbid0CisJCWlmICggIWV2ZW50LnRhcmdldCApIHsKKwkJCWV2ZW50LnRhcmdldCA9 IGRvY3VtZW50OworCQl9CisKKwkJLy8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZSA8IDI4 CisJCS8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisJ CWlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgeworCQkJZXZlbnQudGFyZ2V0ID0g ZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CisJCX0KKworCQlyZXR1cm4gZml4SG9vay5maWx0ZXIg PyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50OworCX0sCisK KwlzcGVjaWFsOiB7CisJCWxvYWQ6IHsKKwkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxv YWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKKwkJCW5vQnViYmxlOiB0cnVl CisJCX0sCisJCWZvY3VzOiB7CisJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBz byBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKKwkJCXRyaWdnZXI6IGZ1bmN0aW9uKCkg eworCQkJCWlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkg eworCQkJCQl0aGlzLmZvY3VzKCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9LAor CQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNpbiIKKwkJfSwKKwkJYmx1cjogeworCQkJdHJpZ2dlcjog ZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRo aXMuYmx1ciApIHsKKwkJCQkJdGhpcy5ibHVyKCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9 CisJCQl9LAorCQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNvdXQiCisJCX0sCisJCWNsaWNrOiB7CisJ CQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2ls bCBiZSByaWdodAorCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB0aGlzLnR5cGUg PT09ICJjaGVja2JveCIgJiYgdGhpcy5jbGljayAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJp bnB1dCIgKSApIHsKKwkJCQkJdGhpcy5jbGljaygpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJ fQorCQkJfSwKKworCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZp cmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCisJCQlfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50 ICkgeworCQkJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CisJ CQl9CisJCX0sCisKKwkJYmVmb3JldW5sb2FkOiB7CisJCQlwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9u KCBldmVudCApIHsKKworCQkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArCisJCQkJLy8gRmlyZWZv eCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LgorCQkJ CWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCAp IHsKKwkJCQkJZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDsK KwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJc2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVt LCBldmVudCwgYnViYmxlICkgeworCQkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBz aW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCisJCS8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9p ZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZQorCQkvLyBzaW11bGF0ZWQgZXZl bnQgcHJldmVudHMgZGVmYXVsdCB0aGVuIHdlIGRvIHRoZSBzYW1lIG9uIHRoZSBkb25vci4KKwkJ dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAorCQkJbmV3IGpRdWVyeS5FdmVudCgpLAorCQkJZXZlbnQs CisJCQl7CisJCQkJdHlwZTogdHlwZSwKKwkJCQlpc1NpbXVsYXRlZDogdHJ1ZSwKKwkJCQlvcmln aW5hbEV2ZW50OiB7fQorCQkJfQorCQkpOworCQlpZiAoIGJ1YmJsZSApIHsKKwkJCWpRdWVyeS5l dmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CisJCX0gZWxzZSB7CisJCQlqUXVlcnkuZXZl bnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApOworCQl9CisJCWlmICggZS5pc0RlZmF1bHRQcmV2 ZW50ZWQoKSApIHsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCX0KKwl9Cit9OworCitq UXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgeworCWlm ICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgeworCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVu ZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKKwl9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5j dGlvbiggc3JjLCBwcm9wcyApIHsKKwkvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhl ICduZXcnIGtleXdvcmQKKwlpZiAoICEodGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCkgKSB7 CisJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7CisJfQorCisJLy8gRXZl bnQgb2JqZWN0CisJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CisJCXRoaXMub3JpZ2luYWxFdmVu dCA9IHNyYzsKKwkJdGhpcy50eXBlID0gc3JjLnR5cGU7CisKKwkJLy8gRXZlbnRzIGJ1YmJsaW5n IHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKKwkJLy8g YnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFs dWUuCisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwK KwkJCQlzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmCisJCQkJLy8gU3VwcG9y dDogQW5kcm9pZCA8IDQuMAorCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPworCQkJcmV0 dXJuVHJ1ZSA6CisJCQlyZXR1cm5GYWxzZTsKKworCS8vIEV2ZW50IHR5cGUKKwl9IGVsc2Ugewor CQl0aGlzLnR5cGUgPSBzcmM7CisJfQorCisJLy8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJv cGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3QKKwlpZiAoIHByb3BzICkgeworCQlqUXVlcnku ZXh0ZW5kKCB0aGlzLCBwcm9wcyApOworCX0KKworCS8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBp bmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lCisJdGhpcy50aW1lU3RhbXAgPSBzcmMgJiYg c3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7CisKKwkvLyBNYXJrIGl0IGFzIGZpeGVkCisJ dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7Cit9OworCisvLyBqUXVlcnkuRXZlbnQgaXMg YmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1 YWdlIEJpbmRpbmcKKy8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMt RXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbAoralF1ZXJ5LkV2ZW50LnBy b3RvdHlwZSA9IHsKKwlpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLAorCWlzUHJvcGFn YXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKKwlpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBl ZDogcmV0dXJuRmFsc2UsCisKKwlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CisJCXZhciBl ID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0 dXJuVHJ1ZTsKKworCQlpZiAoIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWUucHJldmVu dERlZmF1bHQoKTsKKwkJfQorCX0sCisJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKKwkJ dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CisKKwkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBl ZCA9IHJldHVyblRydWU7CisKKwkJaWYgKCBlICYmIGUuc3RvcFByb3BhZ2F0aW9uICkgeworCQkJ ZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJfQorCX0sCisJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9u OiBmdW5jdGlvbigpIHsKKwkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CisKKwkJdGhpcy5p c0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CisKKwkJaWYgKCBlICYm IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICkgeworCQkJZS5zdG9wSW1tZWRpYXRlUHJvcGFn YXRpb24oKTsKKwkJfQorCisJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7CisJfQorfTsKKworLy8g Q3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2 ZW50LXRpbWUgY2hlY2tzCisvLyBTdXBwb3J0OiBDaHJvbWUgMTUrCitqUXVlcnkuZWFjaCh7CisJ bW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCisJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKKwlwb2lu dGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsCisJcG9pbnRlcmxlYXZlOiAicG9pbnRlcm91dCIKK30s IGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9 IHsKKwkJZGVsZWdhdGVUeXBlOiBmaXgsCisJCWJpbmRUeXBlOiBmaXgsCisKKwkJaGFuZGxlOiBm dW5jdGlvbiggZXZlbnQgKSB7CisJCQl2YXIgcmV0LAorCQkJCXRhcmdldCA9IHRoaXMsCisJCQkJ cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCisJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFu ZGxlT2JqOworCisJCQkvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYg cmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCisJCQkvLyBOQjogTm8gcmVsYXRlZFRhcmdl dCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdworCQkJaWYgKCAh cmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdl dCwgcmVsYXRlZCApKSApIHsKKwkJCQlldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlOwor CQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJ CQlldmVudC50eXBlID0gZml4OworCQkJfQorCQkJcmV0dXJuIHJldDsKKwkJfQorCX07Cit9KTsK KworLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCisvLyBTdXBwb3J0 OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaQoraWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyAp IHsKKwlqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwg ZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKKworCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5n IGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1 c291dAorCQl2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJCQlqUXVlcnkuZXZl bnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCAp LCB0cnVlICk7CisJCQl9OworCisJCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKKwkJ CXNldHVwOiBmdW5jdGlvbigpIHsKKwkJCQl2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8 IHRoaXMsCisJCQkJCWF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKTsKKwor CQkJCWlmICggIWF0dGFjaGVzICkgeworCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywg aGFuZGxlciwgdHJ1ZSApOworCQkJCX0KKwkJCQlkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwg KCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CisJCQl9LAorCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkg eworCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKKwkJCQkJYXR0YWNo ZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTsKKworCQkJCWlmICggIWF0dGFj aGVzICkgeworCQkJCQlkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1 ZSApOworCQkJCQlkYXRhX3ByaXYucmVtb3ZlKCBkb2MsIGZpeCApOworCisJCQkJfSBlbHNlIHsK KwkJCQkJZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7CisJCQkJfQorCQkJ fQorCQl9OworCX0pOworfQorCitqUXVlcnkuZm4uZXh0ZW5kKHsKKworCW9uOiBmdW5jdGlvbigg dHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKKwkJdmFyIG9y aWdGbiwgdHlwZTsKKworCQkvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMK KwkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgeworCQkJLy8gKCB0eXBlcy1PYmpl Y3QsIHNlbGVjdG9yLCBkYXRhICkKKwkJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5n IiApIHsKKwkJCQkvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApCisJCQkJZGF0YSA9IGRhdGEgfHwg c2VsZWN0b3I7CisJCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisJCQl9CisJCQlmb3IgKCB0eXBl IGluIHR5cGVzICkgeworCQkJCXRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sg dHlwZSBdLCBvbmUgKTsKKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisKKwkJaWYgKCBkYXRh ID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHsKKwkJCS8vICggdHlwZXMsIGZuICkKKwkJCWZuID0g c2VsZWN0b3I7CisJCQlkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisJCX0gZWxzZSBpZiAo IGZuID09IG51bGwgKSB7CisJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7 CisJCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKKwkJCQlmbiA9IGRhdGE7CisJCQkJZGF0 YSA9IHVuZGVmaW5lZDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gKCB0eXBlcywgZGF0YSwgZm4gKQor CQkJCWZuID0gZGF0YTsKKwkJCQlkYXRhID0gc2VsZWN0b3I7CisJCQkJc2VsZWN0b3IgPSB1bmRl ZmluZWQ7CisJCQl9CisJCX0KKwkJaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisJCQlmbiA9IHJldHVy bkZhbHNlOworCQl9IGVsc2UgaWYgKCAhZm4gKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJ CWlmICggb25lID09PSAxICkgeworCQkJb3JpZ0ZuID0gZm47CisJCQlmbiA9IGZ1bmN0aW9uKCBl dmVudCApIHsKKwkJCQkvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFp bnMgdGhlIGluZm8KKwkJCQlqUXVlcnkoKS5vZmYoIGV2ZW50ICk7CisJCQkJcmV0dXJuIG9yaWdG bi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCQl9OworCQkJLy8gVXNlIHNhbWUgZ3VpZCBz byBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KKwkJCWZuLmd1aWQgPSBvcmlnRm4uZ3Vp ZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOworCQl9CisJCXJldHVybiB0aGlz LmVhY2goIGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZu LCBkYXRhLCBzZWxlY3RvciApOworCQl9KTsKKwl9LAorCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBz ZWxlY3RvciwgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3Is IGRhdGEsIGZuLCAxICk7CisJfSwKKwlvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZu ICkgeworCQl2YXIgaGFuZGxlT2JqLCB0eXBlOworCQlpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZl bnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHsKKwkJCS8vICggZXZlbnQgKSAgZGlzcGF0 Y2hlZCBqUXVlcnkuRXZlbnQKKwkJCWhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajsKKwkJCWpR dWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCisJCQkJaGFuZGxlT2JqLm5hbWVzcGFj ZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5k bGVPYmoub3JpZ1R5cGUsCisJCQkJaGFuZGxlT2JqLnNlbGVjdG9yLAorCQkJCWhhbmRsZU9iai5o YW5kbGVyCisJCQkpOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJaWYgKCB0eXBlb2YgdHlwZXMg PT09ICJvYmplY3QiICkgeworCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKKwkJ CWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CisJCQkJdGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0 eXBlc1sgdHlwZSBdICk7CisJCQl9CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQlpZiAoIHNlbGVj dG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CisJCQkv LyAoIHR5cGVzIFssIGZuXSApCisJCQlmbiA9IHNlbGVjdG9yOworCQkJc2VsZWN0b3IgPSB1bmRl ZmluZWQ7CisJCX0KKwkJaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisJCQlmbiA9IHJldHVybkZhbHNl OworCQl9CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZXZlbnQu cmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7CisJCX0pOworCX0sCisKKwl0cmln Z2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv bigpIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CisJCX0p OworCX0sCisJdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQl2YXIg ZWxlbSA9IHRoaXNbMF07CisJCWlmICggZWxlbSApIHsKKwkJCXJldHVybiBqUXVlcnkuZXZlbnQu dHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApOworCQl9CisJfQorfSk7CisKKwordmFy CisJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xt ZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKKwlydGFnTmFtZSA9IC88KFtcdzpdKykv LAorCXJodG1sID0gLzx8JiM/XHcrOy8sCisJcm5vSW5uZXJodG1sID0gLzwoPzpzY3JpcHR8c3R5 bGV8bGluaykvaSwKKwkvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkCisJcmNoZWNrZWQg PSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKKwlyc2NyaXB0VHlwZSA9IC9e JHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwKKwlyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVwv KC4qKS8sCisJcmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwt LSk+XHMqJC9nLAorCisJLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQg WEhUTUwgKCMxMzIwMCkKKwl3cmFwTWFwID0geworCisJCS8vIFN1cHBvcnQ6IElFIDkKKwkJb3B0 aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwK KworCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKwkJY29sOiBbIDIsICI8 dGFibGU+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAorCQl0cjogWyAyLCAi PHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKwkJdGQ6IFsgMywgIjx0YWJs ZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCisKKwkJX2RlZmF1bHQ6 IFsgMCwgIiIsICIiIF0KKwl9OworCisvLyBTdXBwb3J0OiBJRSA5Cit3cmFwTWFwLm9wdGdyb3Vw ID0gd3JhcE1hcC5vcHRpb247CisKK3dyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3Jh cE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Cit3cmFwTWFw LnRoID0gd3JhcE1hcC50ZDsKKworLy8gU3VwcG9ydDogMS54IGNvbXBhdGliaWxpdHkKKy8vIE1h bmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keQorZnVuY3Rpb24gbWFuaXB1bGF0aW9u VGFyZ2V0KCBlbGVtLCBjb250ZW50ICkgeworCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0s ICJ0YWJsZSIgKSAmJgorCQlqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDEx ID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgInRyIiApID8KKworCQllbGVtLmdldEVs ZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CisJCQllbGVtLmFwcGVuZENoaWxkKCBlbGVt Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSApIDoKKwkJZWxlbTsKK30KKwor Ly8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMg Zm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgorZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSAp IHsKKwllbGVtLnR5cGUgPSAoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSAhPT0gbnVsbCkgKyAi LyIgKyBlbGVtLnR5cGU7CisJcmV0dXJuIGVsZW07Cit9CitmdW5jdGlvbiByZXN0b3JlU2NyaXB0 KCBlbGVtICkgeworCXZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlw ZSApOworCisJaWYgKCBtYXRjaCApIHsKKwkJZWxlbS50eXBlID0gbWF0Y2hbIDEgXTsKKwl9IGVs c2UgeworCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpOworCX0KKworCXJldHVybiBlbGVt OworfQorCisvLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQK K2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHsKKwl2YXIgaSA9 IDAsCisJCWwgPSBlbGVtcy5sZW5ndGg7CisKKwlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJCWRh dGFfcHJpdi5zZXQoCisJCQllbGVtc1sgaSBdLCAiZ2xvYmFsRXZhbCIsICFyZWZFbGVtZW50cyB8 fCBkYXRhX3ByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCAiZ2xvYmFsRXZhbCIgKQorCQkpOwor CX0KK30KKworZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsKKwl2YXIgaSwg bCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50czsK KworCWlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHsKKwkJcmV0dXJuOworCX0KKworCS8vIDEu IENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuCisJaWYgKCBkYXRhX3By aXYuaGFzRGF0YSggc3JjICkgKSB7CisJCXBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3Jj ICk7CisJCXBkYXRhQ3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTsKKwkJZXZl bnRzID0gcGRhdGFPbGQuZXZlbnRzOworCisJCWlmICggZXZlbnRzICkgeworCQkJZGVsZXRlIHBk YXRhQ3VyLmhhbmRsZTsKKwkJCXBkYXRhQ3VyLmV2ZW50cyA9IHt9OworCisJCQlmb3IgKCB0eXBl IGluIGV2ZW50cyApIHsKKwkJCQlmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0 aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZl bnRzWyB0eXBlIF1bIGkgXSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIDIuIENvcHkg dXNlciBkYXRhCisJaWYgKCBkYXRhX3VzZXIuaGFzRGF0YSggc3JjICkgKSB7CisJCXVkYXRhT2xk ID0gZGF0YV91c2VyLmFjY2Vzcyggc3JjICk7CisJCXVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgg e30sIHVkYXRhT2xkICk7CisKKwkJZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTsKKwl9 Cit9CisKK2Z1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgeworCXZhciByZXQgPSBjb250 ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgg dGFnIHx8ICIqIiApIDoKKwkJCWNvbnRleHQucXVlcnlTZWxlY3RvckFsbCA/IGNvbnRleHQucXVl cnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoKKwkJCVtdOworCisJcmV0dXJuIHRhZyA9PT0g dW5kZWZpbmVkIHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUoIGNvbnRleHQsIHRhZyApID8KKwkJ alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOgorCQlyZXQ7Cit9CisKKy8vIFN1cHBv cnQ6IElFID49IDkKK2Z1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7CisJdmFyIG5vZGVO YW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCisJLy8gRmFpbHMgdG8gcGVyc2lz dCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24u CisJaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMu dHlwZSApICkgeworCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKKworCS8vIEZhaWxzIHRv IHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRl IHdoZW4gY2xvbmluZyBvcHRpb25zCisJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIg fHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CisJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3Jj LmRlZmF1bHRWYWx1ZTsKKwl9Cit9CisKK2pRdWVyeS5leHRlbmQoeworCWNsb25lOiBmdW5jdGlv biggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7CisJCXZhciBpLCBs LCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAorCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSgg dHJ1ZSApLAorCQkJaW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQs IGVsZW0gKTsKKworCQkvLyBTdXBwb3J0OiBJRSA+PSA5CisJCS8vIEZpeCBDbG9uaW5nIGlzc3Vl cworCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0g MSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCisJCQkJIWpRdWVyeS5pc1hNTERvYyggZWxl bSApICkgeworCisJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJl YXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMgorCQkJZGVzdEVsZW1l bnRzID0gZ2V0QWxsKCBjbG9uZSApOworCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsK KworCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7 CisJCQkJZml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7CisJ CQl9CisJCX0KKworCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhl IGNsb25lCisJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKKwkJCWlmICggZGVlcERhdGFBbmRFdmVu dHMgKSB7CisJCQkJc3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsK KwkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOworCisJ CQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJ CQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSAp OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7 CisJCQl9CisJCX0KKworCQkvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5CisJ CWRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsICJzY3JpcHQiICk7CisJCWlmICggZGVzdEVs ZW1lbnRzLmxlbmd0aCA+IDAgKSB7CisJCQlzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFp blBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7CisJCX0KKworCQkvLyBSZXR1cm4g dGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIGNsb25lOworCX0sCisKKwlidWlsZEZyYWdtZW50OiBm dW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHsKKwkJdmFyIGVs ZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaiwKKwkJCWZyYWdtZW50ID0gY29udGV4dC5j cmVhdGVEb2N1bWVudEZyYWdtZW50KCksCisJCQlub2RlcyA9IFtdLAorCQkJaSA9IDAsCisJCQls ID0gZWxlbXMubGVuZ3RoOworCisJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCWVsZW0gPSBl bGVtc1sgaSBdOworCisJCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKKworCQkJCS8vIEFk ZCBub2RlcyBkaXJlY3RseQorCQkJCWlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gIm9iamVj dCIgKSB7CisJCQkJCS8vIFN1cHBvcnQ6IFF0V2ViS2l0CisJCQkJCS8vIGpRdWVyeS5tZXJnZSBi ZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKwkJCQkJalF1ZXJ5Lm1lcmdl KCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApOworCisJCQkJLy8gQ29u dmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlCisJCQkJfSBlbHNlIGlmICggIXJodG1sLnRl c3QoIGVsZW0gKSApIHsKKwkJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSgg ZWxlbSApICk7CisKKwkJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKKwkJCQl9IGVs c2UgeworCQkJCQl0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3Jl YXRlRWxlbWVudCgiZGl2IikgKTsKKworCQkJCQkvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJl cHJlc2VudGF0aW9uCisJCQkJCXRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgIiIs ICIiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7CisJCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8 fCB3cmFwTWFwLl9kZWZhdWx0OworCQkJCQl0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxl bS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICkgKyB3cmFwWyAyIF07CisKKwkJCQkJ Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CisJCQkJCWog PSB3cmFwWyAwIF07CisJCQkJCXdoaWxlICggai0tICkgeworCQkJCQkJdG1wID0gdG1wLmxhc3RD aGlsZDsKKwkJCQkJfQorCisJCQkJCS8vIFN1cHBvcnQ6IFF0V2ViS2l0CisJCQkJCS8vIGpRdWVy eS5tZXJnZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKwkJCQkJalF1 ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTsKKworCQkJCQkvLyBSZW1lbWJlciB0 aGUgdG9wLWxldmVsIGNvbnRhaW5lcgorCQkJCQl0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOwor CisJCQkJCS8vIEZpeGVzICMxMjM0NgorCQkJCQkvLyBTdXBwb3J0OiBXZWJraXQsIElFCisJCQkJ CXRtcC50ZXh0Q29udGVudCA9ICIiOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIFJlbW92ZSB3 cmFwcGVyIGZyb20gZnJhZ21lbnQKKwkJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKKworCQlp ID0gMDsKKwkJd2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkgKSB7CisKKwkJCS8vICM0MDg3 IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0 aGlzIGlzCisJCQkvLyB0aGF0IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZworCQkJaWYgKCBz ZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHsK KwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVs ZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOworCisJCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKKwkJ CXRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNjcmlwdCIgKTsK KworCQkJLy8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeQorCQkJaWYgKCBjb250 YWlucyApIHsKKwkJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKKwkJCX0KKworCQkJLy8gQ2FwdHVy ZSBleGVjdXRhYmxlcworCQkJaWYgKCBzY3JpcHRzICkgeworCQkJCWogPSAwOworCQkJCXdoaWxl ICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHsKKwkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBl bGVtLnR5cGUgfHwgIiIgKSApIHsKKwkJCQkJCXNjcmlwdHMucHVzaCggZWxlbSApOworCQkJCQl9 CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGZyYWdtZW50OworCX0sCisKKwljbGVhbkRh dGE6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsIGtleSwKKwkJ CXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKKwkJCWkgPSAwOworCisJCWZvciAoIDsg KGVsZW0gPSBlbGVtc1sgaSBdKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7CisJCQlpZiAoIGpRdWVy eS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CisJCQkJa2V5ID0gZWxlbVsgZGF0YV9wcml2LmV4cGFu ZG8gXTsKKworCQkJCWlmICgga2V5ICYmIChkYXRhID0gZGF0YV9wcml2LmNhY2hlWyBrZXkgXSkg KSB7CisJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CisJCQkJCQlmb3IgKCB0eXBlIGluIGRhdGEu ZXZlbnRzICkgeworCQkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgeworCQkJCQkJCQlqUXVl cnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CisKKwkJCQkJCQkvLyBUaGlzIGlzIGEgc2hv cnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkCisJCQkJCQkJfSBl bHNlIHsKKwkJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRs ZSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIGRhdGFfcHJpdi5jYWNo ZVsga2V5IF0gKSB7CisJCQkJCQkvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRh dGEKKwkJCQkJCWRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdOworCQkJCQl9CisJCQkJfQor CQkJfQorCQkJLy8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhCisJCQlkZWxldGUg ZGF0YV91c2VyLmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07CisJCX0KKwl9Cit9 KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJdGV4dDogZnVuY3Rpb24oIHZhbHVlICkgeworCQly ZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7CisJCQlyZXR1cm4gdmFsdWUg PT09IHVuZGVmaW5lZCA/CisJCQkJalF1ZXJ5LnRleHQoIHRoaXMgKSA6CisJCQkJdGhpcy5lbXB0 eSgpLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0 aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkgeworCQkJCQkJdGhp cy50ZXh0Q29udGVudCA9IHZhbHVlOworCQkJCQl9CisJCQkJfSk7CisJCX0sIG51bGwsIHZhbHVl LCBhcmd1bWVudHMubGVuZ3RoICk7CisJfSwKKworCWFwcGVuZDogZnVuY3Rpb24oKSB7CisJCXJl dHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYg KCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9k ZVR5cGUgPT09IDkgKSB7CisJCQkJdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhp cywgZWxlbSApOworCQkJCXRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApOworCQkJfQorCQl9KTsK Kwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKCBh cmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAx IHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisJCQkJ dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOworCQkJCXRhcmdl dC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CisJCQl9CisJCX0pOwor CX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJn dW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgewor CQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKKwkJCX0KKwkJ fSk7CisJfSwKKworCWFmdGVyOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAo IGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAp IHsKKwkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJs aW5nICk7CisJCQl9CisJCX0pOworCX0sCisKKwlyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwg a2VlcERhdGEgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CisJCXZhciBlbGVtLAorCQkJZWxl bXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkgOiB0aGlzLAor CQkJaSA9IDA7CisKKwkJZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7 CisJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCWpRdWVy eS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSApICk7CisJCQl9CisKKwkJCWlmICggZWxlbS5wYXJl bnROb2RlICkgeworCQkJCWlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93 bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKKwkJCQkJc2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVt LCAic2NyaXB0IiApICk7CisJCQkJfQorCQkJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCgg ZWxlbSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVtcHR5OiBmdW5j dGlvbigpIHsKKwkJdmFyIGVsZW0sCisJCQlpID0gMDsKKworCQlmb3IgKCA7IChlbGVtID0gdGhp c1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewor CisJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKKwkJCQlqUXVlcnkuY2xlYW5EYXRhKCBnZXRB bGwoIGVsZW0sIGZhbHNlICkgKTsKKworCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVz CisJCQkJZWxlbS50ZXh0Q29udGVudCA9ICIiOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7 CisJfSwKKworCWNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVu dHMgKSB7CisJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6 IGRhdGFBbmRFdmVudHM7CisJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMg PT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKKworCQlyZXR1cm4g dGhpcy5tYXAoZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRh QW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOworCQl9KTsKKwl9LAorCisJaHRtbDogZnVu Y3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUg KSB7CisJCQl2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSwKKwkJCQlpID0gMCwKKwkJCQlsID0g dGhpcy5sZW5ndGg7CisKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVU eXBlID09PSAxICkgeworCQkJCXJldHVybiBlbGVtLmlubmVySFRNTDsKKwkJCX0KKworCQkJLy8g U2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAorCQkJ aWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFs dWUgKSAmJgorCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwg IiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgeworCisJCQkJdmFsdWUgPSB2YWx1ZS5yZXBs YWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7CisKKwkJCQl0cnkgeworCQkJCQlmb3IgKCA7 IGkgPCBsOyBpKysgKSB7CisJCQkJCQllbGVtID0gdGhpc1sgaSBdIHx8IHt9OworCisJCQkJCQkv LyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJCQkJCWlm ICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBnZXRB bGwoIGVsZW0sIGZhbHNlICkgKTsKKwkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOworCQkJ CQkJfQorCQkJCQl9CisKKwkJCQkJZWxlbSA9IDA7CisKKwkJCQkvLyBJZiB1c2luZyBpbm5lckhU TUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKKwkJCQl9IGNh dGNoKCBlICkge30KKwkJCX0KKworCQkJaWYgKCBlbGVtICkgeworCQkJCXRoaXMuZW1wdHkoKS5h cHBlbmQoIHZhbHVlICk7CisJCQl9CisJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3Ro ICk7CisJfSwKKworCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKKwkJdmFyIGFyZyA9IGFyZ3Vt ZW50c1sgMCBdOworCisJCS8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRl eHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudAorCQl0aGlzLmRvbU1hbmlwKCBhcmd1bWVu dHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJYXJnID0gdGhpcy5wYXJlbnROb2RlOworCisJCQlq UXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApOworCisJCQlpZiAoIGFyZyApIHsKKwkJ CQlhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7CisJCQl9CisJCX0pOworCisJCS8vIEZv cmNlIHJlbW92YWwgaWYgdGhlcmUgd2FzIG5vIG5ldyBjb250ZW50IChlLmcuLCBmcm9tIGVtcHR5 IGFyZ3VtZW50cykKKwkJcmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUp ID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7CisJfSwKKworCWRldGFjaDogZnVuY3Rpb24oIHNlbGVj dG9yICkgeworCQlyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7CisJfSwKKwor CWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7CisKKwkJLy8gRmxhdHRlbiBh bnkgbmVzdGVkIGFycmF5cworCQlhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOworCisJ CXZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYywKKwkJ CWkgPSAwLAorCQkJbCA9IHRoaXMubGVuZ3RoLAorCQkJc2V0ID0gdGhpcywKKwkJCWlOb0Nsb25l ID0gbCAtIDEsCisJCQl2YWx1ZSA9IGFyZ3NbIDAgXSwKKwkJCWlzRnVuY3Rpb24gPSBqUXVlcnku aXNGdW5jdGlvbiggdmFsdWUgKTsKKworCQkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRz IHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKKwkJaWYgKCBpc0Z1bmN0aW9uIHx8CisJ CQkJKCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmCisJCQkJCSFzdXBwb3J0 LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkgeworCQkJcmV0dXJuIHRo aXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7CisJCQkJdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4 ICk7CisJCQkJaWYgKCBpc0Z1bmN0aW9uICkgeworCQkJCQlhcmdzWyAwIF0gPSB2YWx1ZS5jYWxs KCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTsKKwkJCQl9CisJCQkJc2VsZi5kb21NYW5pcCgg YXJncywgY2FsbGJhY2sgKTsKKwkJCX0pOworCQl9CisKKwkJaWYgKCBsICkgeworCQkJZnJhZ21l bnQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQs IGZhbHNlLCB0aGlzICk7CisJCQlmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CisKKwkJCWlm ICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CisJCQkJZnJhZ21lbnQgPSBm aXJzdDsKKwkJCX0KKworCQkJaWYgKCBmaXJzdCApIHsKKwkJCQlzY3JpcHRzID0galF1ZXJ5Lm1h cCggZ2V0QWxsKCBmcmFnbWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOworCQkJCWhh c1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsKKworCQkJCS8vIFVzZSB0aGUgb3JpZ2luYWwgZnJh Z21lbnQgZm9yIHRoZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBj YW4gZW5kIHVwCisJCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNp dHVhdGlvbnMgKCM4MDcwKS4KKwkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisJCQkJCW5vZGUg PSBmcmFnbWVudDsKKworCQkJCQlpZiAoIGkgIT09IGlOb0Nsb25lICkgeworCQkJCQkJbm9kZSA9 IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisJCQkJCQkvLyBLZWVwIHJlZmVy ZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCisJCQkJCQlpZiAo IGhhc1NjcmlwdHMgKSB7CisJCQkJCQkJLy8gU3VwcG9ydDogUXRXZWJLaXQKKwkJCQkJCQkvLyBq UXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzCisJCQkJ CQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKKwkJ CQkJCX0KKwkJCQkJfQorCisJCQkJCWNhbGxiYWNrLmNhbGwoIHRoaXNbIGkgXSwgbm9kZSwgaSAp OworCQkJCX0KKworCQkJCWlmICggaGFzU2NyaXB0cyApIHsKKwkJCQkJZG9jID0gc2NyaXB0c1sg c2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKKworCQkJCQkvLyBSZWVuYWJsZSBz Y3JpcHRzCisJCQkJCWpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKKworCQkJ CQkvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0 aW9uCisJCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgeworCQkJCQkJbm9k ZSA9IHNjcmlwdHNbIGkgXTsKKwkJCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBl IHx8ICIiICkgJiYKKwkJCQkJCQkhZGF0YV9wcml2LmFjY2Vzcyggbm9kZSwgImdsb2JhbEV2YWwi ICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKKworCQkJCQkJCWlmICggbm9k ZS5zcmMgKSB7CisJCQkJCQkJCS8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0 IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50CisJCQkJCQkJCWlmICggalF1ZXJ5Ll9ldmFsVXJs ICkgeworCQkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOworCQkJCQkJCQl9CisJ CQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIG5vZGUudGV4dENvbnRl bnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCAiIiApICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJ CQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfQorfSk7CisKK2pRdWVy eS5lYWNoKHsKKwlhcHBlbmRUbzogImFwcGVuZCIsCisJcHJlcGVuZFRvOiAicHJlcGVuZCIsCisJ aW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKKwlpbnNlcnRBZnRlcjogImFmdGVyIiwKKwlyZXBsYWNl QWxsOiAicmVwbGFjZVdpdGgiCit9LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7CisJalF1 ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciBlbGVtcywKKwkJ CXJldCA9IFtdLAorCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAorCQkJbGFzdCA9IGlu c2VydC5sZW5ndGggLSAxLAorCQkJaSA9IDA7CisKKwkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyAp IHsKKwkJCWVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7CisJ CQlqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CisKKwkJCS8vIFN1 cHBvcnQ6IFF0V2ViS2l0CisJCQkvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5 bGlrZSkgdGhyb3dzCisJCQlwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7CisJCX0KKwor CQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApOworCX07Cit9KTsKKworCit2YXIgaWZyYW1l LAorCWVsZW1kaXNwbGF5ID0ge307CisKKy8qKgorICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNw bGF5IG9mIGEgZWxlbWVudAorICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhl IGVsZW1lbnQKKyAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0CisgKi8KKy8v IENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5CitmdW5jdGlvbiBhY3R1YWxE aXNwbGF5KCBuYW1lLCBkb2MgKSB7CisJdmFyIHN0eWxlLAorCQllbGVtID0galF1ZXJ5KCBkb2Mu Y3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksCisKKwkJLy8gZ2V0 RGVmYXVsdENvbXB1dGVkU3R5bGUgbWlnaHQgYmUgcmVsaWFibHkgdXNlZCBvbmx5IG9uIGF0dGFj aGVkIGVsZW1lbnQKKwkJZGlzcGxheSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSAm JiAoIHN0eWxlID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKSAp ID8KKworCQkJLy8gVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBs aWtlIG9wdG1pemF0aW9uKSB1bnRpbCBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLAorCQkJ Ly8gc2luY2UgaXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVjaWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQg b25seSBpbiBGRgorCQkJc3R5bGUuZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW1bIDAgXSwgImRp c3BsYXkiICk7CisKKwkvLyBXZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxl bWVudCwKKwkvLyBzbyB1c2UgImRldGFjaCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQg b2YgdGhlIGVsZW1lbnQKKwllbGVtLmRldGFjaCgpOworCisJcmV0dXJuIGRpc3BsYXk7Cit9CisK Ky8qKgorICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFu IGVsZW1lbnQKKyAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZQorICovCitmdW5jdGlvbiBkZWZh dWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CisJdmFyIGRvYyA9IGRvY3VtZW50LAorCQlkaXNwbGF5 ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07CisKKwlpZiAoICFkaXNwbGF5ICkgeworCQlkaXNw bGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOworCisJCS8vIElmIHRoZSBzaW1w bGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZQorCQlpZiAoIGRpc3BsYXkg PT09ICJub25lIiB8fCAhZGlzcGxheSApIHsKKworCQkJLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0 ZWQgaWZyYW1lIGlmIHBvc3NpYmxlCisJCQlpZnJhbWUgPSAoaWZyYW1lIHx8IGpRdWVyeSggIjxp ZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iICkpLmFwcGVuZFRv KCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7CisKKwkJCS8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1M IHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorCQkJ ZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50OworCisJCQkvLyBTdXBwb3J0OiBJRQor CQkJZG9jLndyaXRlKCk7CisJCQlkb2MuY2xvc2UoKTsKKworCQkJZGlzcGxheSA9IGFjdHVhbERp c3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKKwkJCWlmcmFtZS5kZXRhY2goKTsKKwkJfQorCisJCS8v IFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQorCQllbGVtZGlzcGxheVsgbm9kZU5h bWUgXSA9IGRpc3BsYXk7CisJfQorCisJcmV0dXJuIGRpc3BsYXk7Cit9Cit2YXIgcm1hcmdpbiA9 ICgvXm1hcmdpbi8pOworCit2YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0g KyAiKSg/IXB4KVthLXolXSskIiwgImkiICk7CisKK3ZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbigg ZWxlbSApIHsKKwkJcmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21w dXRlZFN0eWxlKCBlbGVtLCBudWxsICk7CisJfTsKKworCisKK2Z1bmN0aW9uIGN1ckNTUyggZWxl bSwgbmFtZSwgY29tcHV0ZWQgKSB7CisJdmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJl dCwKKwkJc3R5bGUgPSBlbGVtLnN0eWxlOworCisJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRT dHlsZXMoIGVsZW0gKTsKKworCS8vIFN1cHBvcnQ6IElFOQorCS8vIGdldFByb3BlcnR5VmFsdWUg aXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpIGluIElFOSwgc2VlICMxMjUzNworCWlm ICggY29tcHV0ZWQgKSB7CisJCXJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUg KSB8fCBjb21wdXRlZFsgbmFtZSBdOworCX0KKworCWlmICggY29tcHV0ZWQgKSB7CisKKwkJaWYg KCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxl bSApICkgeworCQkJcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7CisJCX0KKworCQkv LyBTdXBwb3J0OiBpT1MgPCA2CisJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBi eSBEZWFuIEVkd2FyZHMiCisJCS8vIGlPUyA8IDYgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRh Z2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxp YWJseSBwaXhlbHMKKwkJLy8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBo dHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzCisJCWlmICggcm51 bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgeworCisJCQkvLyBS ZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCisJCQl3aWR0aCA9IHN0eWxlLndpZHRoOworCQkJ bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsKKwkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7 CisKKwkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBv dXQKKwkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJl dDsKKwkJCXJldCA9IGNvbXB1dGVkLndpZHRoOworCisJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQg dmFsdWVzCisJCQlzdHlsZS53aWR0aCA9IHdpZHRoOworCQkJc3R5bGUubWluV2lkdGggPSBtaW5X aWR0aDsKKwkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CisJCX0KKwl9CisKKwlyZXR1cm4g cmV0ICE9PSB1bmRlZmluZWQgPworCQkvLyBTdXBwb3J0OiBJRQorCQkvLyBJRSByZXR1cm5zIHpJ bmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgorCQlyZXQgKyAiIiA6CisJCXJldDsKK30KKworCitm dW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CisJLy8gRGVmaW5l IHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5l ZWRlZC4KKwlyZXR1cm4geworCQlnZXQ6IGZ1bmN0aW9uKCkgeworCQkJaWYgKCBjb25kaXRpb25G bigpICkgeworCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8g dXNlIGl0IGR1ZSB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLAorCQkJCS8vIHJlbW92ZSBpdC4KKwkJ CQkvLyBTaW5jZSB0aGVyZSBhcmUgbm8gb3RoZXIgaG9va3MgZm9yIG1hcmdpblJpZ2h0LCByZW1v dmUgdGhlIHdob2xlIG9iamVjdC4KKwkJCQlkZWxldGUgdGhpcy5nZXQ7CisJCQkJcmV0dXJuOwor CQkJfQorCisJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9y dCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KKworCQkJcmV0dXJuICh0aGlzLmdldCA9IGhv b2tGbikuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQl9CisJfTsKK30KKworCisoZnVuY3Rp b24oKSB7CisJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLAorCQlk b2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorCQljb250YWluZXIgPSBkb2N1bWVu dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLAorCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCAiZGl2IiApOworCisJaWYgKCAhZGl2LnN0eWxlICkgeworCQlyZXR1cm47CisJfQorCisJZGl2 LnN0eWxlLmJhY2tncm91bmRDbGlwID0gImNvbnRlbnQtYm94IjsKKwlkaXYuY2xvbmVOb2RlKCB0 cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKKwlzdXBwb3J0LmNsZWFyQ2xvbmVTdHls ZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gImNvbnRlbnQtYm94IjsKKworCWNvbnRh aW5lci5zdHlsZS5jc3NUZXh0ID0gImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVm dDotOTk5OXB4O21hcmdpbi10b3A6MXB4OyIgKworCQkicG9zaXRpb246YWJzb2x1dGUiOworCWNv bnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7CisKKwkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBv c2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQK KwkvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vj b25kIGNvbXB1dGF0aW9uLgorCWZ1bmN0aW9uIGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6 aW5nUmVsaWFibGUoKSB7CisJCWRpdi5zdHlsZS5jc3NUZXh0ID0KKwkJCS8vIFN1cHBvcnQ6IEZp cmVmb3g8MjksIEFuZHJvaWQgMi4zCisJCQkvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmcKKwkJ CSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJv eDsiICsKKwkJCSJib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9w OjElO3RvcDoxJTsiICsKKwkJCSJib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjRweDtwb3Np dGlvbjphYnNvbHV0ZSI7CisJCWRpdi5pbm5lckhUTUwgPSAiIjsKKwkJZG9jRWxlbS5hcHBlbmRD aGlsZCggY29udGFpbmVyICk7CisKKwkJdmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVk U3R5bGUoIGRpdiwgbnVsbCApOworCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9 PSAiMSUiOworCQlib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSAiNHB4 IjsKKworCQlkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKKwl9CisKKwkvLyBTdXBw b3J0OiBub2RlLmpzIGpzZG9tCisJLy8gRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0Q29tcHV0ZWRTdHls ZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBnbG9iYWwgb2JqZWN0CisJaWYgKCB3aW5kb3cuZ2V0Q29t cHV0ZWRTdHlsZSApIHsKKwkJalF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwgeworCQkJcGl4ZWxQb3Np dGlvbjogZnVuY3Rpb24oKSB7CisJCQkJLy8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25j ZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nCisJCQkJLy8gc2luY2Ugd2UgY2FuIHVzZSB0aGUg Ym94U2l6aW5nUmVsaWFibGUgcHJlLWNvbXB1dGluZy4KKwkJCQkvLyBObyBuZWVkIHRvIGNoZWNr IGlmIHRoZSB0ZXN0IHdhcyBhbHJlYWR5IHBlcmZvcm1lZCwgdGhvdWdoLgorCQkJCWNvbXB1dGVQ aXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKTsKKwkJCQlyZXR1cm4gcGl4ZWxQb3Np dGlvblZhbDsKKwkJCX0sCisJCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CisJCQkJ aWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkgeworCQkJCQljb21wdXRlUGl4ZWxQ b3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7CisJCQkJfQorCQkJCXJldHVybiBib3hTaXpp bmdSZWxpYWJsZVZhbDsKKwkJCX0sCisJCQlyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigp IHsKKwkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMworCQkJCS8vIENoZWNrIGlmIGRpdiB3aXRo IGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKKwkJCQkvLyBn ZXRzIGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuICgj MzMzMykKKwkJCQkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5z IHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKwkJCQkvLyBUaGlzIHN1cHBvcnQgZnVuY3Rp b24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuCisJCQkJ dmFyIHJldCwKKwkJCQkJbWFyZ2luRGl2ID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVh dGVFbGVtZW50KCAiZGl2IiApICk7CisKKwkJCQkvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRp c3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nCisJCQkJbWFyZ2luRGl2LnN0eWxlLmNzc1Rl eHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9CisJCQkJCS8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFu ZHJvaWQgMi4zCisJCQkJCS8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZworCQkJCQkiLXdlYmtp dC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDsiICsK KwkJCQkJImJveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3Jk ZXI6MDtwYWRkaW5nOjAiOworCQkJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdp bkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKKwkJCQlkaXYuc3R5bGUud2lkdGggPSAiMXB4IjsKKwkJ CQlkb2NFbGVtLmFwcGVuZENoaWxkKCBjb250YWluZXIgKTsKKworCQkJCXJldCA9ICFwYXJzZUZs b2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkubWFyZ2luUmln aHQgKTsKKworCQkJCWRvY0VsZW0ucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApOworCisJCQkJcmV0 dXJuIHJldDsKKwkJCX0KKwkJfSk7CisJfQorfSkoKTsKKworCisvLyBBIG1ldGhvZCBmb3IgcXVp Y2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3Vs YXRpb25zLgoralF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ss IGFyZ3MgKSB7CisJdmFyIHJldCwgbmFtZSwKKwkJb2xkID0ge307CisKKwkvLyBSZW1lbWJlciB0 aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwlmb3IgKCBuYW1lIGluIG9w dGlvbnMgKSB7CisJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQllbGVtLnN0 eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CisJfQorCisJcmV0ID0gY2FsbGJhY2suYXBw bHkoIGVsZW0sIGFyZ3MgfHwgW10gKTsKKworCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcworCWZv ciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1l IF07CisJfQorCisJcmV0dXJuIHJldDsKK307CisKKwordmFyCisJLy8gc3dhcHBhYmxlIGlmIGRp c3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxl LWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKKwkvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1 ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXkK KwlyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCisJcm51bXNwbGl0 ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSguKikkIiwgImkiICksCisJcnJlbE51bSA9 IG5ldyBSZWdFeHAoICJeKFsrLV0pPSgiICsgcG51bSArICIpIiwgImkiICksCisKKwljc3NTaG93 ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6 ICJibG9jayIgfSwKKwljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CisJCWxldHRlclNwYWNpbmc6ICIw IiwKKwkJZm9udFdlaWdodDogIjQwMCIKKwl9LAorCisJY3NzUHJlZml4ZXMgPSBbICJXZWJraXQi LCAiTyIsICJNb3oiLCAibXMiIF07CisKKy8vIHJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQg dG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkKK2Z1bmN0aW9uIHZlbmRv clByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHsKKworCS8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0 IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkCisJaWYgKCBuYW1lIGluIHN0eWxlICkgeworCQlyZXR1 cm4gbmFtZTsKKwl9CisKKwkvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCisJdmFy IGNhcE5hbWUgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAorCQlvcmln TmFtZSA9IG5hbWUsCisJCWkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7CisKKwl3aGlsZSAoIGktLSAp IHsKKwkJbmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lOworCQlpZiAoIG5hbWUgaW4g c3R5bGUgKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCX0KKworCXJldHVybiBvcmlnTmFtZTsK K30KKworZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCAp IHsKKwl2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2YWx1ZSApOworCXJldHVybiBtYXRj aGVzID8KKwkJLy8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgInN1YnRyYWN0IiwgZS5nLiwgd2hl biB1c2VkIGFzIGluIGNzc0hvb2tzCisJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1 YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgInB4IiApIDoKKwkJdmFsdWU7Cit9 CisKK2Z1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNC b3JkZXJCb3gsIHN0eWxlcyApIHsKKwl2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8g ImJvcmRlciIgOiAiY29udGVudCIgKSA/CisJCS8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmln aHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgorCQk0IDoKKwkJLy8gT3RoZXJ3aXNl IGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllcworCQluYW1l ID09PSAid2lkdGgiID8gMSA6IDAsCisKKwkJdmFsID0gMDsKKworCWZvciAoIDsgaSA8IDQ7IGkg Kz0gMiApIHsKKwkJLy8gYm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQg aWYgd2Ugd2FudCBpdAorCQlpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKKwkJCXZhbCArPSBq UXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsK KwkJfQorCisJCWlmICggaXNCb3JkZXJCb3ggKSB7CisJCQkvLyBib3JkZXItYm94IGluY2x1ZGVz IHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQKKwkJCWlmICggZXh0cmEg PT09ICJjb250ZW50IiApIHsKKwkJCQl2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmci ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOworCQkJfQorCisJCQkvLyBhdCB0aGlz IHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgor CQkJaWYgKCBleHRyYSAhPT0gIm1hcmdpbiIgKSB7CisJCQkJdmFsIC09IGpRdWVyeS5jc3MoIGVs ZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsK KwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRl bnQsIHNvIGFkZCBwYWRkaW5nCisJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmci ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOworCisJCQkvLyBhdCB0aGlzIHBvaW50 LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyCisJCQlpZiAo IGV4dHJhICE9PSAicGFkZGluZyIgKSB7CisJCQkJdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sICJi b3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKKwkJCX0K KwkJfQorCX0KKworCXJldHVybiB2YWw7Cit9CisKK2Z1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQo IGVsZW0sIG5hbWUsIGV4dHJhICkgeworCisJLy8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHks IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWUKKwl2YXIgdmFsdWVJ c0JvcmRlckJveCA9IHRydWUsCisJCXZhbCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNl dFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsCisJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSAp LAorCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwg c3R5bGVzICkgPT09ICJib3JkZXItYm94IjsKKworCS8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMg cmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVm aW5lZAorCS8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dp P2lkPTY0OTI4NQorCS8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hv d19idWcuY2dpP2lkPTQ5MTY2OAorCWlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7CisJ CS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2Fy eQorCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOworCQlpZiAoIHZhbCA8IDAg fHwgdmFsID09IG51bGwgKSB7CisJCQl2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07CisJCX0KKwor CQkvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLgor CQlpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7CisJCQlyZXR1cm4gdmFsOworCQl9CisKKwkJ Ly8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJl dHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKKwkJLy8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50 bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQorCQl2YWx1ZUlzQm9yZGVy Qm94ID0gaXNCb3JkZXJCb3ggJiYKKwkJCSggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8 IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7CisKKwkJLy8gTm9ybWFsaXplICIiLCBhdXRv LCBhbmQgcHJlcGFyZSBmb3IgZXh0cmEKKwkJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsK Kwl9CisKKwkvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFj dCBpcnJlbGV2YW50IHN0eWxlcworCXJldHVybiAoIHZhbCArCisJCWF1Z21lbnRXaWR0aE9ySGVp Z2h0KAorCQkJZWxlbSwKKwkJCW5hbWUsCisJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJv cmRlciIgOiAiY29udGVudCIgKSwKKwkJCXZhbHVlSXNCb3JkZXJCb3gsCisJCQlzdHlsZXMKKwkJ KQorCSkgKyAicHgiOworfQorCitmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7 CisJdmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKKwkJdmFsdWVzID0gW10sCisJCWluZGV4ID0g MCwKKwkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCisJZm9yICggOyBpbmRleCA8IGxlbmd0 aDsgaW5kZXgrKyApIHsKKwkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOworCQlpZiAoICFlbGVt LnN0eWxlICkgeworCQkJY29udGludWU7CisJCX0KKworCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRh X3ByaXYuZ2V0KCBlbGVtLCAib2xkZGlzcGxheSIgKTsKKwkJZGlzcGxheSA9IGVsZW0uc3R5bGUu ZGlzcGxheTsKKwkJaWYgKCBzaG93ICkgeworCQkJLy8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5 IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpcworCQkJLy8gYmVpbmcgaGlkZGVuIGJ5 IGNhc2NhZGVkIHJ1bGVzIG9yIG5vdAorCQkJaWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3Bs YXkgPT09ICJub25lIiApIHsKKwkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJCX0KKwor CQkJLy8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxh eTogbm9uZQorCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJy b3dzZXIgc3R5bGUgaXMKKwkJCS8vIGZvciBzdWNoIGFuIGVsZW1lbnQKKwkJCWlmICggZWxlbS5z dHlsZS5kaXNwbGF5ID09PSAiIiAmJiBpc0hpZGRlbiggZWxlbSApICkgeworCQkJCXZhbHVlc1sg aW5kZXggXSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sICJvbGRkaXNwbGF5IiwgZGVmYXVsdERp c3BsYXkoZWxlbS5ub2RlTmFtZSkgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhpZGRlbiA9IGlz SGlkZGVuKCBlbGVtICk7CisKKwkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiIHx8ICFoaWRkZW4g KSB7CisJCQkJZGF0YV9wcml2LnNldCggZWxlbSwgIm9sZGRpc3BsYXkiLCBoaWRkZW4gPyBkaXNw bGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKTsKKwkJCX0KKwkJfQorCX0KKwor CS8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBs b29wCisJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCWZvciAoIGluZGV4ID0gMDsg aW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CisJCWVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsK KwkJaWYgKCAhZWxlbS5zdHlsZSApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICggIXNob3cg fHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAibm9uZSIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09 PSAiIiApIHsKKwkJCWVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0g fHwgIiIgOiAibm9uZSI7CisJCX0KKwl9CisKKwlyZXR1cm4gZWxlbWVudHM7Cit9CisKK2pRdWVy eS5leHRlbmQoeworCS8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGlu ZyB0aGUgZGVmYXVsdAorCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHls ZSBwcm9wZXJ0eQorCWNzc0hvb2tzOiB7CisJCW9wYWNpdHk6IHsKKwkJCWdldDogZnVuY3Rpb24o IGVsZW0sIGNvbXB1dGVkICkgeworCQkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJCS8vIFdlIHNo b3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5CisJCQkJCXZhciByZXQg PSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiApOworCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIx IiA6IHJldDsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLy8gRG9uJ3QgYXV0b21hdGljYWxs eSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCisJY3NzTnVt YmVyOiB7CisJCSJjb2x1bW5Db3VudCI6IHRydWUsCisJCSJmaWxsT3BhY2l0eSI6IHRydWUsCisJ CSJmbGV4R3JvdyI6IHRydWUsCisJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKKwkJImZvbnRXZWlnaHQi OiB0cnVlLAorCQkibGluZUhlaWdodCI6IHRydWUsCisJCSJvcGFjaXR5IjogdHJ1ZSwKKwkJIm9y ZGVyIjogdHJ1ZSwKKwkJIm9ycGhhbnMiOiB0cnVlLAorCQkid2lkb3dzIjogdHJ1ZSwKKwkJInpJ bmRleCI6IHRydWUsCisJCSJ6b29tIjogdHJ1ZQorCX0sCisKKwkvLyBBZGQgaW4gcHJvcGVydGll cyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCisJLy8gc2V0dGluZyBvciBnZXR0 aW5nIHRoZSB2YWx1ZQorCWNzc1Byb3BzOiB7CisJCS8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJv cGVydHkKKwkJImZsb2F0IjogImNzc0Zsb2F0IgorCX0sCisKKwkvLyBHZXQgYW5kIHNldCB0aGUg c3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQorCXN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFt ZSwgdmFsdWUsIGV4dHJhICkgeworCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNv bW1lbnQgbm9kZXMKKwkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0u bm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkv LyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKwkJdmFy IHJldCwgdHlwZSwgaG9va3MsCisJCQlvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUg KSwKKwkJCXN0eWxlID0gZWxlbS5zdHlsZTsKKworCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBv cmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5h bWUoIHN0eWxlLCBvcmlnTmFtZSApICk7CisKKwkJLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4 ZWQgdmVyc2lvbgorCQkvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCisJCWhv b2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFt ZSBdOworCisJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQorCQlpZiAoIHZhbHVl ICE9PSB1bmRlZmluZWQgKSB7CisJCQl0eXBlID0gdHlwZW9mIHZhbHVlOworCisJCQkvLyBjb252 ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVtYmVy cy4gIzczNDUKKwkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhl YyggdmFsdWUgKSkgKSB7CisJCQkJdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBh cnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOworCQkJCS8vIEZpeGVzIGJ1ZyAj OTIzNworCQkJCXR5cGUgPSAibnVtYmVyIjsKKwkJCX0KKworCQkJLy8gTWFrZSBzdXJlIHRoYXQg bnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CisJCQlpZiAoIHZhbHVl ID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJ Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9y IGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCisJCQlpZiAoIHR5cGUgPT09ICJudW1iZXIiICYmICFq UXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgeworCQkJCXZhbHVlICs9ICJweCI7CisJCQl9 CisKKwkJCS8vIEZpeGVzICM4OTA4LCBpdCBjYW4gYmUgZG9uZSBtb3JlIGNvcnJlY3RseSBieSBz cGVjaWZ5aW5nIHNldHRlcnMgaW4gY3NzSG9va3MsCisJCQkvLyBidXQgaXQgd291bGQgbWVhbiB0 byBkZWZpbmUgZWlnaHQgKGZvciBldmVyeSBwcm9ibGVtYXRpYyBwcm9wZXJ0eSkgaWRlbnRpY2Fs IGZ1bmN0aW9ucworCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09 ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CisJCQkJc3R5bGVb IG5hbWUgXSA9ICJpbmhlcml0IjsKKwkJCX0KKworCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRl ZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVl CisJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5z ZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCXN0eWxlWyBu YW1lIF0gPSB2YWx1ZTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJLy8gSWYgYSBob29rIHdhcyBw cm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCisJCQlpZiAoIGhv b2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBl eHRyYSApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCS8v IE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CisJCQly ZXR1cm4gc3R5bGVbIG5hbWUgXTsKKwkJfQorCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBlbGVtLCBu YW1lLCBleHRyYSwgc3R5bGVzICkgeworCQl2YXIgdmFsLCBudW0sIGhvb2tzLAorCQkJb3JpZ05h bWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2Un cmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCisJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNb IG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9w TmFtZSggZWxlbS5zdHlsZSwgb3JpZ05hbWUgKSApOworCisJCS8vIGdldHMgaG9vayBmb3IgdGhl IHByZWZpeGVkIHZlcnNpb24KKwkJLy8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lv bgorCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sg b3JpZ05hbWUgXTsKKworCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0 ZWQgdmFsdWUgZnJvbSB0aGVyZQorCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICkgewor CQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOworCQl9CisKKwkJLy8gT3Ro ZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRo YXQKKwkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKwkJCXZhbCA9IGN1ckNTUyggZWxlbSwg bmFtZSwgc3R5bGVzICk7CisJCX0KKworCQkvL2NvbnZlcnQgIm5vcm1hbCIgdG8gY29tcHV0ZWQg dmFsdWUKKwkJaWYgKCB2YWwgPT09ICJub3JtYWwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNm b3JtICkgeworCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CisJCX0KKworCQkv LyBSZXR1cm4sIGNvbnZlcnRpbmcgdG8gbnVtYmVyIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3 YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisJCWlmICggZXh0cmEgPT09ICIiIHx8 IGV4dHJhICkgeworCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CisJCQlyZXR1cm4gZXh0cmEg PT09IHRydWUgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKKwkJ fQorCQlyZXR1cm4gdmFsOworCX0KK30pOworCitqUXVlcnkuZWFjaChbICJoZWlnaHQiLCAid2lk dGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0g eworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisJCQlpZiAoIGNv bXB1dGVkICkgeworCQkJCS8vIGNlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGlu Zm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbQorCQkJCS8vIGhvd2V2ZXIsIGl0IG11c3QgaGF2 ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlzCisJ CQkJcmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIg KSApICYmIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgPworCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwg Y3NzU2hvdywgZnVuY3Rpb24oKSB7CisJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxl bSwgbmFtZSwgZXh0cmEgKTsKKwkJCQkJfSkgOgorCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVt LCBuYW1lLCBleHRyYSApOworCQkJfQorCQl9LAorCisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZh bHVlLCBleHRyYSApIHsKKwkJCXZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0g KTsKKwkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID8KKwkJ CQlhdWdtZW50V2lkdGhPckhlaWdodCgKKwkJCQkJZWxlbSwKKwkJCQkJbmFtZSwKKwkJCQkJZXh0 cmEsCisJCQkJCWpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkg PT09ICJib3JkZXItYm94IiwKKwkJCQkJc3R5bGVzCisJCQkJKSA6IDAKKwkJCSk7CisJCX0KKwl9 OworfSk7CisKKy8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCitqUXVlcnkuY3NzSG9va3MubWFyZ2lu UmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCwKKwlmdW5j dGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisJCWlmICggY29tcHV0ZWQgKSB7CisJCQkvLyBXZWJL aXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBt YXJnaW4tcmlnaHQKKwkJCS8vIFdvcmsgYXJvdW5kIGJ5IHRlbXBvcmFyaWx5IHNldHRpbmcgZWxl bWVudCBkaXNwbGF5IHRvIGlubGluZS1ibG9jaworCQkJcmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVt LCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwKKwkJCQljdXJDU1MsIFsgZWxlbSwgIm1h cmdpblJpZ2h0IiBdICk7CisJCX0KKwl9CispOworCisvLyBUaGVzZSBob29rcyBhcmUgdXNlZCBi eSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCitqUXVlcnkuZWFjaCh7CisJbWFyZ2luOiAi IiwKKwlwYWRkaW5nOiAiIiwKKwlib3JkZXI6ICJXaWR0aCIKK30sIGZ1bmN0aW9uKCBwcmVmaXgs IHN1ZmZpeCApIHsKKwlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0geworCQll eHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCXZhciBpID0gMCwKKwkJCQlleHBhbmRlZCA9 IHt9LAorCisJCQkJLy8gYXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nCisJ CQkJcGFydHMgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciID8gdmFsdWUuc3BsaXQoIiAiKSA6 IFsgdmFsdWUgXTsKKworCQkJZm9yICggOyBpIDwgNDsgaSsrICkgeworCQkJCWV4cGFuZGVkWyBw cmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KKwkJCQkJcGFydHNbIGkgXSB8fCBw YXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdOworCQkJfQorCisJCQlyZXR1cm4gZXhwYW5kZWQ7 CisJCX0KKwl9OworCisJaWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHsKKwkJalF1ZXJ5 LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjsKKwl9 Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJY3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUg KSB7CisJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSAp IHsKKwkJCXZhciBzdHlsZXMsIGxlbiwKKwkJCQltYXAgPSB7fSwKKwkJCQlpID0gMDsKKworCQkJ aWYgKCBqUXVlcnkuaXNBcnJheSggbmFtZSApICkgeworCQkJCXN0eWxlcyA9IGdldFN0eWxlcygg ZWxlbSApOworCQkJCWxlbiA9IG5hbWUubGVuZ3RoOworCisJCQkJZm9yICggOyBpIDwgbGVuOyBp KysgKSB7CisJCQkJCW1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBp IF0sIGZhbHNlLCBzdHlsZXMgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbWFwOworCQkJfQorCisJ CQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CisJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBu YW1lLCB2YWx1ZSApIDoKKwkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CisJCX0sIG5hbWUs IHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworCX0sCisJc2hvdzogZnVuY3Rpb24oKSB7 CisJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOworCX0sCisJaGlkZTogZnVuY3Rpb24o KSB7CisJCXJldHVybiBzaG93SGlkZSggdGhpcyApOworCX0sCisJdG9nZ2xlOiBmdW5jdGlvbigg c3RhdGUgKSB7CisJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CisJCQlyZXR1 cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpOworCQl9CisKKwkJcmV0dXJuIHRo aXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWlmICggaXNIaWRkZW4oIHRoaXMgKSApIHsKKwkJCQlq UXVlcnkoIHRoaXMgKS5zaG93KCk7CisJCQl9IGVsc2UgeworCQkJCWpRdWVyeSggdGhpcyApLmhp ZGUoKTsKKwkJCX0KKwkJfSk7CisJfQorfSk7CisKKworZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9w dGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkgeworCXJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBl LmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7Cit9CitqUXVlcnkuVHdl ZW4gPSBUd2VlbjsKKworVHdlZW4ucHJvdG90eXBlID0geworCWNvbnN0cnVjdG9yOiBUd2VlbiwK Kwlpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQg KSB7CisJCXRoaXMuZWxlbSA9IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisJCXRoaXMuZWFz aW5nID0gZWFzaW5nIHx8ICJzd2luZyI7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRo aXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7CisJCXRoaXMuZW5kID0gZW5kOworCQl0 aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgi ICk7CisJfSwKKwljdXI6IGZ1bmN0aW9uKCkgeworCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9v a3NbIHRoaXMucHJvcCBdOworCisJCXJldHVybiBob29rcyAmJiBob29rcy5nZXQgPworCQkJaG9v a3MuZ2V0KCB0aGlzICkgOgorCQkJVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyAp OworCX0sCisJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKKwkJdmFyIGVhc2VkLAorCQkJaG9v a3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOworCisJCWlmICggdGhpcy5vcHRpb25z LmR1cmF0aW9uICkgeworCQkJdGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMu ZWFzaW5nIF0oCisJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwg MCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCisJCQkpOworCQl9IGVsc2UgeworCQkJdGhpcy5w b3MgPSBlYXNlZCA9IHBlcmNlbnQ7CisJCX0KKwkJdGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhp cy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0OworCisJCWlmICggdGhpcy5vcHRpb25zLnN0 ZXAgKSB7CisJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0 aGlzICk7CisJCX0KKworCQlpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHsKKwkJCWhvb2tzLnNl dCggdGhpcyApOworCQl9IGVsc2UgeworCQkJVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCgg dGhpcyApOworCQl9CisJCXJldHVybiB0aGlzOworCX0KK307CisKK1R3ZWVuLnByb3RvdHlwZS5p bml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTsKKworVHdlZW4ucHJvcEhvb2tzID0gewor CV9kZWZhdWx0OiB7CisJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgeworCQkJdmFyIHJlc3VsdDsK KworCQkJaWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJgorCQkJCSghdHdl ZW4uZWxlbS5zdHlsZSB8fCB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCkg KSB7CisJCQkJcmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTsKKwkJCX0KKworCQkJLy8g cGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBh dXRvbWF0aWNhbGx5CisJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8g YSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzCisJCQkvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNo IGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgorCQkJLy8gY29tcGxleCB2YWx1ZXMgc3Vj aCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMuCisJCQlyZXN1bHQgPSBqUXVl cnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOworCQkJLy8gRW1wdHkgc3RyaW5n cywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgorCQkJcmV0 dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSAiYXV0byIgPyAwIDogcmVzdWx0OworCQl9LAorCQlz ZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKwkJCS8vIHVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29t cGF0IC0gdXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMKKwkJCS8v IGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlCisJCQlp ZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CisJCQkJalF1ZXJ5LmZ4LnN0ZXBb IHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKKwkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0uc3R5bGUg JiYgKCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9 IG51bGwgfHwgalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKKwkJCQlqUXVlcnku c3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTsK KwkJCX0gZWxzZSB7CisJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93Owor CQkJfQorCQl9CisJfQorfTsKKworLy8gU3VwcG9ydDogSUU5CisvLyBQYW5pYyBiYXNlZCBhcHBy b2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKKworVHdlZW4ucHJv cEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0geworCXNldDog ZnVuY3Rpb24oIHR3ZWVuICkgeworCQlpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4u ZWxlbS5wYXJlbnROb2RlICkgeworCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4u bm93OworCQl9CisJfQorfTsKKworalF1ZXJ5LmVhc2luZyA9IHsKKwlsaW5lYXI6IGZ1bmN0aW9u KCBwICkgeworCQlyZXR1cm4gcDsKKwl9LAorCXN3aW5nOiBmdW5jdGlvbiggcCApIHsKKwkJcmV0 dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKKwl9Cit9OworCitqUXVlcnku ZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsKKworLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNp b24gcG9pbnQKK2pRdWVyeS5meC5zdGVwID0ge307CisKKworCisKK3ZhcgorCWZ4Tm93LCB0aW1l cklkLAorCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAorCXJmeG51bSA9IG5l dyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICks CisJcnJ1biA9IC9xdWV1ZUhvb2tzJC8sCisJYW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVs dFByZWZpbHRlciBdLAorCXR3ZWVuZXJzID0geworCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZh bHVlICkgeworCQkJdmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKSwK KwkJCQl0YXJnZXQgPSB0d2Vlbi5jdXIoKSwKKwkJCQlwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1 ZSApLAorCQkJCXVuaXQgPSBwYXJ0cyAmJiBwYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJl clsgcHJvcCBdID8gIiIgOiAicHgiICksCisKKwkJCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRh dGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcworCQkJCXN0YXJ0 ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gInB4IiAmJiArdGFyZ2V0 ICkgJiYKKwkJCQkJcmZ4bnVtLmV4ZWMoIGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AgKSAp LAorCQkJCXNjYWxlID0gMSwKKwkJCQltYXhJdGVyYXRpb25zID0gMjA7CisKKwkJCWlmICggc3Rh cnQgJiYgc3RhcnRbIDMgXSAhPT0gdW5pdCApIHsKKwkJCQkvLyBUcnVzdCB1bml0cyByZXBvcnRl ZCBieSBqUXVlcnkuY3NzCisJCQkJdW5pdCA9IHVuaXQgfHwgc3RhcnRbIDMgXTsKKworCQkJCS8v IE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb24KKwkJCQlw YXJ0cyA9IHBhcnRzIHx8IFtdOworCisJCQkJLy8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJv bSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnQKKwkJCQlzdGFydCA9ICt0YXJnZXQgfHwgMTsKKwor CQkJCWRvIHsKKwkJCQkJLy8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJs ZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyoKKwkJCQkJLy8gVXNlIGEgc3RyaW5nIGZvciBkb3Vi bGluZyBmYWN0b3Igc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHNlZSBzY2FsZSBhcyB1bmNoYW5n ZWQgYmVsb3cKKwkJCQkJc2NhbGUgPSBzY2FsZSB8fCAiLjUiOworCisJCQkJCS8vIEFkanVzdCBh bmQgYXBwbHkKKwkJCQkJc3RhcnQgPSBzdGFydCAvIHNjYWxlOworCQkJCQlqUXVlcnkuc3R5bGUo IHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApOworCisJCQkJLy8gVXBkYXRlIHNjYWxl LCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkKKwkJCQkvLyBBbmQgYnJl YWtpbmcgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdl J3ZlIGp1c3QgaGFkIGVub3VnaAorCQkJCX0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdl ZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApOwor CQkJfQorCisJCQkvLyBVcGRhdGUgdHdlZW4gcHJvcGVydGllcworCQkJaWYgKCBwYXJ0cyApIHsK KwkJCQlzdGFydCA9IHR3ZWVuLnN0YXJ0ID0gK3N0YXJ0IHx8ICt0YXJnZXQgfHwgMDsKKwkJCQl0 d2Vlbi51bml0ID0gdW5pdDsKKwkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwg d2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KKwkJCQl0d2Vlbi5lbmQgPSBwYXJ0c1sg MSBdID8KKwkJCQkJc3RhcnQgKyAoIHBhcnRzWyAxIF0gKyAxICkgKiBwYXJ0c1sgMiBdIDoKKwkJ CQkJK3BhcnRzWyAyIF07CisJCQl9CisKKwkJCXJldHVybiB0d2VlbjsKKwkJfSBdCisJfTsKKwor Ly8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNs eQorZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CisJc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJ ZnhOb3cgPSB1bmRlZmluZWQ7CisJfSk7CisJcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkg KTsKK30KKworLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmlt YXRpb24KK2Z1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7CisJdmFyIHdoaWNo LAorCQlpID0gMCwKKwkJYXR0cnMgPSB7IGhlaWdodDogdHlwZSB9OworCisJLy8gaWYgd2UgaW5j bHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLAor CS8vIGlmIHdlIGRvbid0IGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92 ZXIgTGVmdCBhbmQgUmlnaHQKKwlpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDsK Kwlmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkgeworCQl3aGljaCA9IGNz c0V4cGFuZFsgaSBdOworCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRk aW5nIiArIHdoaWNoIF0gPSB0eXBlOworCX0KKworCWlmICggaW5jbHVkZVdpZHRoICkgeworCQlh dHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlOworCX0KKworCXJldHVybiBhdHRyczsK K30KKworZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7CisJ dmFyIHR3ZWVuLAorCQljb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29u Y2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKKwkJaW5kZXggPSAwLAorCQlsZW5ndGggPSBjb2xsZWN0 aW9uLmxlbmd0aDsKKwlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworCQlpZiAo ICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1 ZSApKSApIHsKKworCQkJLy8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHkKKwkJCXJldHVy biB0d2VlbjsKKwkJfQorCX0KK30KKworZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwg cHJvcHMsIG9wdHMgKSB7CisJLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqLworCXZhciBwcm9w LCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlz cGxheSwKKwkJYW5pbSA9IHRoaXMsCisJCW9yaWcgPSB7fSwKKwkJc3R5bGUgPSBlbGVtLnN0eWxl LAorCQloaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCisJCWRhdGFT aG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKKworCS8vIGhhbmRsZSBxdWV1 ZTogZmFsc2UgcHJvbWlzZXMKKwlpZiAoICFvcHRzLnF1ZXVlICkgeworCQlob29rcyA9IGpRdWVy eS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOworCQlpZiAoIGhvb2tzLnVucXVldWVkID09IG51 bGwgKSB7CisJCQlob29rcy51bnF1ZXVlZCA9IDA7CisJCQlvbGRmaXJlID0gaG9va3MuZW1wdHku ZmlyZTsKKwkJCWhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHsKKwkJCQlpZiAoICFob29r cy51bnF1ZXVlZCApIHsKKwkJCQkJb2xkZmlyZSgpOworCQkJCX0KKwkJCX07CisJCX0KKwkJaG9v a3MudW5xdWV1ZWQrKzsKKworCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKwkJCS8vIGRvaW5n IHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVk CisJCQkvLyBiZWZvcmUgdGhpcyBjb21wbGV0ZXMKKwkJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkg eworCQkJCWhvb2tzLnVucXVldWVkLS07CisJCQkJaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAi ZngiICkubGVuZ3RoICkgeworCQkJCQlob29rcy5lbXB0eS5maXJlKCk7CisJCQkJfQorCQkJfSk7 CisJCX0pOworCX0KKworCS8vIGhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzCisJaWYgKCBlbGVt Lm5vZGVUeXBlID09PSAxICYmICggImhlaWdodCIgaW4gcHJvcHMgfHwgIndpZHRoIiBpbiBwcm9w cyApICkgeworCQkvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKKwkJLy8gUmVj b3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90CisJCS8v IGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAorCQkvLyBv dmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQorCQlvcHRzLm92ZXJmbG93ID0gWyBz dHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsKKworCQkv LyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAor CQkvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgv aGVpZ2h0IGFuaW1hdGVkCisJCWRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIg KTsKKworCQkvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAi bm9uZSIKKwkJY2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gIm5vbmUiID8KKwkJCWRhdGFfcHJp di5nZXQoIGVsZW0sICJvbGRkaXNwbGF5IiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVO YW1lICkgOiBkaXNwbGF5OworCisJCWlmICggY2hlY2tEaXNwbGF5ID09PSAiaW5saW5lIiAmJiBq UXVlcnkuY3NzKCBlbGVtLCAiZmxvYXQiICkgPT09ICJub25lIiApIHsKKwkJCXN0eWxlLmRpc3Bs YXkgPSAiaW5saW5lLWJsb2NrIjsKKwkJfQorCX0KKworCWlmICggb3B0cy5vdmVyZmxvdyApIHsK KwkJc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7 CisJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKwkJCXN0eWxlLm92ZXJm bG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKKwkJCXN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3Zl cmZsb3dbIDIgXTsKKwkJfSk7CisJfQorCisJLy8gc2hvdy9oaWRlIHBhc3MKKwlmb3IgKCBwcm9w IGluIHByb3BzICkgeworCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CisJCWlmICggcmZ4dHlwZXMu ZXhlYyggdmFsdWUgKSApIHsKKwkJCWRlbGV0ZSBwcm9wc1sgcHJvcCBdOworCQkJdG9nZ2xlID0g dG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKKwkJCWlmICggdmFsdWUgPT09ICggaGlkZGVu ID8gImhpZGUiIDogInNob3ciICkgKSB7CisKKwkJCQkvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBs ZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8g cHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgorCQkJCWlm ICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1 bmRlZmluZWQgKSB7CisJCQkJCWhpZGRlbiA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29u dGludWU7CisJCQkJfQorCQkJfQorCQkJb3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNo b3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsKKworCQkvLyBBbnkgbm9u LWZ4IHZhbHVlIHN0b3BzIHVzIGZyb20gcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZh bHVlCisJCX0gZWxzZSB7CisJCQlkaXNwbGF5ID0gdW5kZWZpbmVkOworCQl9CisJfQorCisJaWYg KCAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKKwkJaWYgKCBkYXRhU2hvdyApIHsK KwkJCWlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7CisJCQkJaGlkZGVuID0gZGF0YVNob3cu aGlkZGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJZGF0YVNob3cgPSBkYXRhX3ByaXYuYWNjZXNz KCBlbGVtLCAiZnhzaG93Iiwge30gKTsKKwkJfQorCisJCS8vIHN0b3JlIHN0YXRlIGlmIGl0cyB0 b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gInJldmVyc2UiCisJCWlmICggdG9n Z2xlICkgeworCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKKwkJfQorCQlpZiAoIGhpZGRl biApIHsKKwkJCWpRdWVyeSggZWxlbSApLnNob3coKTsKKwkJfSBlbHNlIHsKKwkJCWFuaW0uZG9u ZShmdW5jdGlvbigpIHsKKwkJCQlqUXVlcnkoIGVsZW0gKS5oaWRlKCk7CisJCQl9KTsKKwkJfQor CQlhbmltLmRvbmUoZnVuY3Rpb24oKSB7CisJCQl2YXIgcHJvcDsKKworCQkJZGF0YV9wcml2LnJl bW92ZSggZWxlbSwgImZ4c2hvdyIgKTsKKwkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKKwkJCQlq UXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApOworCQkJfQorCQl9KTsKKwkJ Zm9yICggcHJvcCBpbiBvcmlnICkgeworCQkJdHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8g ZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTsKKworCQkJaWYgKCAhKCBwcm9wIGlu IGRhdGFTaG93ICkgKSB7CisJCQkJZGF0YVNob3dbIHByb3AgXSA9IHR3ZWVuLnN0YXJ0OworCQkJ CWlmICggaGlkZGVuICkgeworCQkJCQl0d2Vlbi5lbmQgPSB0d2Vlbi5zdGFydDsKKwkJCQkJdHdl ZW4uc3RhcnQgPSBwcm9wID09PSAid2lkdGgiIHx8IHByb3AgPT09ICJoZWlnaHQiID8gMSA6IDA7 CisJCQkJfQorCQkJfQorCQl9CisKKwkvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCku aGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWUKKwl9IGVsc2UgaWYg KCAoZGlzcGxheSA9PT0gIm5vbmUiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6 IGRpc3BsYXkpID09PSAiaW5saW5lIiApIHsKKwkJc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7CisJ fQorfQorCitmdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHsKKwl2 YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzOworCisJLy8gY2FtZWxDYXNlLCBz cGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzCisJZm9yICggaW5kZXggaW4gcHJv cHMgKSB7CisJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApOworCQllYXNpbmcgPSBz cGVjaWFsRWFzaW5nWyBuYW1lIF07CisJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CisJCWlmICgg alF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CisJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOworCQkJ dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07CisJCX0KKworCQlpZiAoIGluZGV4 ICE9PSBuYW1lICkgeworCQkJcHJvcHNbIG5hbWUgXSA9IHZhbHVlOworCQkJZGVsZXRlIHByb3Bz WyBpbmRleCBdOworCQl9CisKKwkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKKwkJ aWYgKCBob29rcyAmJiAiZXhwYW5kIiBpbiBob29rcyApIHsKKwkJCXZhbHVlID0gaG9va3MuZXhw YW5kKCB2YWx1ZSApOworCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CisKKwkJCS8vIG5vdCBxdWl0 ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KKwkJ CS8vIGFsc28gLSByZXVzaW5nICdpbmRleCcgZnJvbSBhYm92ZSBiZWNhdXNlIHdlIGhhdmUgdGhl IGNvcnJlY3QgIm5hbWUiCisJCQlmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHsKKwkJCQlpZiAoICEo IGluZGV4IGluIHByb3BzICkgKSB7CisJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4 IF07CisJCQkJCXNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7CisJCQkJfQorCQkJfQor CQl9IGVsc2UgeworCQkJc3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nOworCQl9CisJfQor fQorCitmdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7CisJ dmFyIHJlc3VsdCwKKwkJc3RvcHBlZCwKKwkJaW5kZXggPSAwLAorCQlsZW5ndGggPSBhbmltYXRp b25QcmVmaWx0ZXJzLmxlbmd0aCwKKwkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdh eXMoIGZ1bmN0aW9uKCkgeworCQkJLy8gZG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVk IHNlbGVjdG9yCisJCQlkZWxldGUgdGljay5lbGVtOworCQl9KSwKKwkJdGljayA9IGZ1bmN0aW9u KCkgeworCQkJaWYgKCBzdG9wcGVkICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXZh ciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisJCQkJcmVtYWluaW5nID0g TWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBj dXJyZW50VGltZSApLAorCQkJCS8vIGFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRv IHVzZSAxIC0gKCAwLjUgfHwgMCApICgjMTI0OTcpCisJCQkJdGVtcCA9IHJlbWFpbmluZyAvIGFu aW1hdGlvbi5kdXJhdGlvbiB8fCAwLAorCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKKwkJCQlpbmRl eCA9IDAsCisJCQkJbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7CisKKwkJCWZvciAo IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworCQkJCWFuaW1hdGlvbi50d2VlbnNbIGlu ZGV4IF0ucnVuKCBwZXJjZW50ICk7CisJCQl9CisKKwkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVs ZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7CisKKwkJCWlmICggcGVyY2Vu dCA8IDEgJiYgbGVuZ3RoICkgeworCQkJCXJldHVybiByZW1haW5pbmc7CisJCQl9IGVsc2Ugewor CQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CisJCQkJcmV0 dXJuIGZhbHNlOworCQkJfQorCQl9LAorCQlhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKHsK KwkJCWVsZW06IGVsZW0sCisJCQlwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMg KSwKKwkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsgc3BlY2lhbEVhc2luZzoge30gfSwg b3B0aW9ucyApLAorCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAorCQkJb3JpZ2lu YWxPcHRpb25zOiBvcHRpb25zLAorCQkJc3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygp LAorCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCisJCQl0d2VlbnM6IFtdLAorCQkJY3Jl YXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7CisJCQkJdmFyIHR3ZWVuID0galF1ZXJ5 LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAorCQkJCQkJYW5pbWF0aW9u Lm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApOwor CQkJCWFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTsKKwkJCQlyZXR1cm4gdHdlZW47CisJ CQl9LAorCQkJc3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7CisJCQkJdmFyIGluZGV4ID0gMCwK KwkJCQkJLy8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0 aGUgdHdlZW5zCisJCQkJCS8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydAorCQkJCQlsZW5n dGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwOworCQkJCWlmICggc3Rv cHBlZCApIHsKKwkJCQkJcmV0dXJuIHRoaXM7CisJCQkJfQorCQkJCXN0b3BwZWQgPSB0cnVlOwor CQkJCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworCQkJCQlhbmltYXRpb24u dHdlZW5zWyBpbmRleCBdLnJ1biggMSApOworCQkJCX0KKworCQkJCS8vIHJlc29sdmUgd2hlbiB3 ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKKwkJCQkvLyBvdGhlcndpc2UsIHJlamVjdAorCQkJCWlm ICggZ290b0VuZCApIHsKKwkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0 aW9uLCBnb3RvRW5kIF0gKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWZlcnJlZC5yZWplY3RXaXRo KCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CisJCQkJfQorCQkJCXJldHVybiB0aGlz OworCQkJfQorCQl9KSwKKwkJcHJvcHMgPSBhbmltYXRpb24ucHJvcHM7CisKKwlwcm9wRmlsdGVy KCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOworCisJZm9yICggOyBpbmRl eCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCXJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNb IGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTsK KwkJaWYgKCByZXN1bHQgKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJalF1ZXJ5 Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTsKKworCWlmICggalF1ZXJ5Lmlz RnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7CisJCWFuaW1hdGlvbi5vcHRzLnN0 YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOworCX0KKworCWpRdWVyeS5meC50aW1lcigKKwkJ alF1ZXJ5LmV4dGVuZCggdGljaywgeworCQkJZWxlbTogZWxlbSwKKwkJCWFuaW06IGFuaW1hdGlv biwKKwkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQorCQl9KQorCSk7CisKKwkvLyBhdHRh Y2ggY2FsbGJhY2tzIGZyb20gb3B0aW9ucworCXJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFu aW1hdGlvbi5vcHRzLnByb2dyZXNzICkKKwkJLmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFu aW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKwkJLmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKQor CQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKK30KKworalF1ZXJ5LkFuaW1hdGlv biA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwgeworCisJdHdlZW5lcjogZnVuY3Rpb24oIHBy b3BzLCBjYWxsYmFjayApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHsK KwkJCWNhbGxiYWNrID0gcHJvcHM7CisJCQlwcm9wcyA9IFsgIioiIF07CisJCX0gZWxzZSB7CisJ CQlwcm9wcyA9IHByb3BzLnNwbGl0KCIgIik7CisJCX0KKworCQl2YXIgcHJvcCwKKwkJCWluZGV4 ID0gMCwKKwkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKKworCQlmb3IgKCA7IGluZGV4IDwgbGVu Z3RoIDsgaW5kZXgrKyApIHsKKwkJCXByb3AgPSBwcm9wc1sgaW5kZXggXTsKKwkJCXR3ZWVuZXJz WyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdOworCQkJdHdlZW5lcnNbIHByb3AgXS51 bnNoaWZ0KCBjYWxsYmFjayApOworCQl9CisJfSwKKworCXByZWZpbHRlcjogZnVuY3Rpb24oIGNh bGxiYWNrLCBwcmVwZW5kICkgeworCQlpZiAoIHByZXBlbmQgKSB7CisJCQlhbmltYXRpb25QcmVm aWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7CisJCX0gZWxzZSB7CisJCQlhbmltYXRpb25QcmVm aWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CisJCX0KKwl9Cit9KTsKKworalF1ZXJ5LnNwZWVkID0g ZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgeworCXZhciBvcHQgPSBzcGVlZCAmJiB0eXBl b2Ygc3BlZWQgPT09ICJvYmplY3QiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7CisJ CWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CisJCQlqUXVlcnkuaXNGdW5jdGlvbigg c3BlZWQgKSAmJiBzcGVlZCwKKwkJZHVyYXRpb246IHNwZWVkLAorCQllYXNpbmc6IGZuICYmIGVh c2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcK Kwl9OworCisJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1 cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CisJCW9wdC5kdXJhdGlvbiBpbiBq UXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVl cnkuZnguc3BlZWRzLl9kZWZhdWx0OworCisJLy8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUv dW5kZWZpbmVkL251bGwgLT4gImZ4IgorCWlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1 ZXVlID09PSB0cnVlICkgeworCQlvcHQucXVldWUgPSAiZngiOworCX0KKworCS8vIFF1ZXVlaW5n CisJb3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsKKworCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkg eworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7CisJCQlvcHQub2xkLmNh bGwoIHRoaXMgKTsKKwkJfQorCisJCWlmICggb3B0LnF1ZXVlICkgeworCQkJalF1ZXJ5LmRlcXVl dWUoIHRoaXMsIG9wdC5xdWV1ZSApOworCQl9CisJfTsKKworCXJldHVybiBvcHQ7Cit9OworCitq UXVlcnkuZm4uZXh0ZW5kKHsKKwlmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywg Y2FsbGJhY2sgKSB7CisKKwkJLy8gc2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRp bmcgb3BhY2l0eSB0byAwCisJCXJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoICJv cGFjaXR5IiwgMCApLnNob3coKQorCisJCQkvLyBhbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZp ZWQKKwkJCS5lbmQoKS5hbmltYXRlKHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2Fs bGJhY2sgKTsKKwl9LAorCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBj YWxsYmFjayApIHsKKwkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwK KwkJCW9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSwKKwkJ CWRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7CisJCQkJLy8gT3BlcmF0ZSBvbiBhIGNvcHkgb2Yg cHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3QKKwkJCQl2YXIgYW5pbSA9 IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CisK KwkJCQkvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRl bHkKKwkJCQlpZiAoIGVtcHR5IHx8IGRhdGFfcHJpdi5nZXQoIHRoaXMsICJmaW5pc2giICkgKSB7 CisJCQkJCWFuaW0uc3RvcCggdHJ1ZSApOworCQkJCX0KKwkJCX07CisJCQlkb0FuaW1hdGlvbi5m aW5pc2ggPSBkb0FuaW1hdGlvbjsKKworCQlyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09 PSBmYWxzZSA/CisJCQl0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOgorCQkJdGhpcy5xdWV1ZSgg b3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOworCX0sCisJc3RvcDogZnVuY3Rpb24oIHR5cGUs IGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7CisJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9v a3MgKSB7CisJCQl2YXIgc3RvcCA9IGhvb2tzLnN0b3A7CisJCQlkZWxldGUgaG9va3Muc3RvcDsK KwkJCXN0b3AoIGdvdG9FbmQgKTsKKwkJfTsKKworCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3Ry aW5nIiApIHsKKwkJCWdvdG9FbmQgPSBjbGVhclF1ZXVlOworCQkJY2xlYXJRdWV1ZSA9IHR5cGU7 CisJCQl0eXBlID0gdW5kZWZpbmVkOworCQl9CisJCWlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9 PSBmYWxzZSApIHsKKwkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKKwkJfQorCisJ CXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCisJ CQkJaW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKKwkJCQl0aW1l cnMgPSBqUXVlcnkudGltZXJzLAorCQkJCWRhdGEgPSBkYXRhX3ByaXYuZ2V0KCB0aGlzICk7CisK KwkJCWlmICggaW5kZXggKSB7CisJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4 IF0uc3RvcCApIHsKKwkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CisJCQkJfQorCQkJ fSBlbHNlIHsKKwkJCQlmb3IgKCBpbmRleCBpbiBkYXRhICkgeworCQkJCQlpZiAoIGRhdGFbIGlu ZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKKwkJ CQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJ CQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgeworCQkJCWlmICggdGlt ZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGlu ZGV4IF0ucXVldWUgPT09IHR5cGUpICkgeworCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9w KCBnb3RvRW5kICk7CisJCQkJCWRlcXVldWUgPSBmYWxzZTsKKwkJCQkJdGltZXJzLnNwbGljZSgg aW5kZXgsIDEgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBx dWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJCS8vIHRpbWVycyBjdXJyZW50 bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2ggd2lsbCBkZXF1ZXVl CisJCQkvLyBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZAorCQkJaWYgKCBkZXF1ZXVlIHx8 ICFnb3RvRW5kICkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisJCQl9CisJ CX0pOworCX0sCisJZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHsKKwkJaWYgKCB0eXBlICE9PSBm YWxzZSApIHsKKwkJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisJCX0KKwkJcmV0dXJuIHRoaXMuZWFj aChmdW5jdGlvbigpIHsKKwkJCXZhciBpbmRleCwKKwkJCQlkYXRhID0gZGF0YV9wcml2LmdldCgg dGhpcyApLAorCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKKwkJCQlob29rcyA9 IGRhdGFbIHR5cGUgKyAicXVldWVIb29rcyIgXSwKKwkJCQl0aW1lcnMgPSBqUXVlcnkudGltZXJz LAorCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKKworCQkJLy8gZW5hYmxl IGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YQorCQkJZGF0YS5maW5pc2ggPSB0cnVlOwor CisJCQkvLyBlbXB0eSB0aGUgcXVldWUgZmlyc3QKKwkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlw ZSwgW10gKTsKKworCQkJaWYgKCBob29rcyAmJiBob29rcy5zdG9wICkgeworCQkJCWhvb2tzLnN0 b3AuY2FsbCggdGhpcywgdHJ1ZSApOworCQkJfQorCisJCQkvLyBsb29rIGZvciBhbnkgYWN0aXZl IGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQorCQkJZm9yICggaW5kZXggPSB0aW1lcnMubGVu Z3RoOyBpbmRleC0tOyApIHsKKwkJCQlpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlz ICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHsKKwkJCQkJdGltZXJzWyBpbmRl eCBdLmFuaW0uc3RvcCggdHJ1ZSApOworCQkJCQl0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApOwor CQkJCX0KKwkJCX0KKworCQkJLy8gbG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBx dWV1ZSBhbmQgZmluaXNoIHRoZW0KKwkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7 IGluZGV4KysgKSB7CisJCQkJaWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5m aW5pc2ggKSB7CisJCQkJCXF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7CisJCQkJ fQorCQkJfQorCisJCQkvLyB0dXJuIG9mZiBmaW5pc2hpbmcgZmxhZworCQkJZGVsZXRlIGRhdGEu ZmluaXNoOworCQl9KTsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goWyAidG9nZ2xlIiwgInNob3ci LCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJdmFyIGNzc0ZuID0galF1ZXJ5LmZu WyBuYW1lIF07CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywg Y2FsbGJhY2sgKSB7CisJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0g ImJvb2xlYW4iID8KKwkJCWNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQl0aGlz LmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7 CisJfTsKK30pOworCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25z CitqUXVlcnkuZWFjaCh7CisJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIpLAorCXNsaWRlVXA6IGdl bkZ4KCJoaWRlIiksCisJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiKSwKKwlmYWRlSW46IHsg b3BhY2l0eTogInNob3ciIH0sCisJZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKwlmYWRl VG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyAp IHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFj ayApIHsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxi YWNrICk7CisJfTsKK30pOworCitqUXVlcnkudGltZXJzID0gW107CitqUXVlcnkuZngudGljayA9 IGZ1bmN0aW9uKCkgeworCXZhciB0aW1lciwKKwkJaSA9IDAsCisJCXRpbWVycyA9IGpRdWVyeS50 aW1lcnM7CisKKwlmeE5vdyA9IGpRdWVyeS5ub3coKTsKKworCWZvciAoIDsgaSA8IHRpbWVycy5s ZW5ndGg7IGkrKyApIHsKKwkJdGltZXIgPSB0aW1lcnNbIGkgXTsKKwkJLy8gQ2hlY2tzIHRoZSB0 aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCisJCWlmICggIXRpbWVyKCkgJiYgdGlt ZXJzWyBpIF0gPT09IHRpbWVyICkgeworCQkJdGltZXJzLnNwbGljZSggaS0tLCAxICk7CisJCX0K Kwl9CisKKwlpZiAoICF0aW1lcnMubGVuZ3RoICkgeworCQlqUXVlcnkuZnguc3RvcCgpOworCX0K KwlmeE5vdyA9IHVuZGVmaW5lZDsKK307CisKK2pRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0 aW1lciApIHsKKwlqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7CisJaWYgKCB0aW1lcigpICkg eworCQlqUXVlcnkuZnguc3RhcnQoKTsKKwl9IGVsc2UgeworCQlqUXVlcnkudGltZXJzLnBvcCgp OworCX0KK307CisKK2pRdWVyeS5meC5pbnRlcnZhbCA9IDEzOworCitqUXVlcnkuZnguc3RhcnQg PSBmdW5jdGlvbigpIHsKKwlpZiAoICF0aW1lcklkICkgeworCQl0aW1lcklkID0gc2V0SW50ZXJ2 YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKwl9Cit9OworCitqUXVl cnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgeworCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwl0 aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMgPSB7CisJc2xvdzogNjAwLAor CWZhc3Q6IDIwMCwKKwkvLyBEZWZhdWx0IHNwZWVkCisJX2RlZmF1bHQ6IDQwMAorfTsKKworCisv LyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Np b24uCisvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnkt ZGVsYXkvCitqUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHsKKwl0aW1l ID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lOwor CXR5cGUgPSB0eXBlIHx8ICJmeCI7CisKKwlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rp b24oIG5leHQsIGhvb2tzICkgeworCQl2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRp bWUgKTsKKwkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworCQkJY2xlYXJUaW1lb3V0KCB0aW1l b3V0ICk7CisJCX07CisJfSk7Cit9OworCisKKyhmdW5jdGlvbigpIHsKKwl2YXIgaW5wdXQgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisJCXNlbGVjdCA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCisJCW9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9j dW1lbnQuY3JlYXRlRWxlbWVudCggIm9wdGlvbiIgKSApOworCisJaW5wdXQudHlwZSA9ICJjaGVj a2JveCI7CisKKwkvLyBTdXBwb3J0OiBpT1MgNS4xLCBBbmRyb2lkIDQueCwgQW5kcm9pZCAyLjMK KwkvLyBDaGVjayB0aGUgZGVmYXVsdCBjaGVja2JveC9yYWRpbyB2YWx1ZSAoIiIgb24gb2xkIFdl YktpdDsgIm9uIiBlbHNld2hlcmUpCisJc3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09 ICIiOworCisJLy8gTXVzdCBhY2Nlc3MgdGhlIHBhcmVudCB0byBtYWtlIGFuIG9wdGlvbiBzZWxl Y3QgcHJvcGVybHkKKwkvLyBTdXBwb3J0OiBJRTksIElFMTAKKwlzdXBwb3J0Lm9wdFNlbGVjdGVk ID0gb3B0LnNlbGVjdGVkOworCisJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRl IGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZAorCS8vIChXZWJLaXQg bWFya3MgdGhlbSBhcyBkaXNhYmxlZCkKKwlzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOworCXN1cHBv cnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkOworCisJLy8gQ2hlY2sgaWYgYW4gaW5wdXQg bWFpbnRhaW5zIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCisJLy8gU3VwcG9ydDog SUU5LCBJRTEwCisJaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICk7CisJ aW5wdXQudmFsdWUgPSAidCI7CisJaW5wdXQudHlwZSA9ICJyYWRpbyI7CisJc3VwcG9ydC5yYWRp b1ZhbHVlID0gaW5wdXQudmFsdWUgPT09ICJ0IjsKK30pKCk7CisKKwordmFyIG5vZGVIb29rLCBi b29sSG9vaywKKwlhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKKworalF1ZXJ5 LmZuLmV4dGVuZCh7CisJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworCQlyZXR1cm4g YWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGgg PiAxICk7CisJfSwKKworCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgeworCQlyZXR1cm4g dGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUg KTsKKwkJfSk7CisJfQorfSk7CisKK2pRdWVyeS5leHRlbmQoeworCWF0dHI6IGZ1bmN0aW9uKCBl bGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJdmFyIGhvb2tzLCByZXQsCisJCQluVHlwZSA9IGVsZW0u bm9kZVR5cGU7CisKKwkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1l bnQgYW5kIGF0dHJpYnV0ZSBub2RlcworCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5U eXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRmFs bGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKwkJaWYgKCB0 eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IHN0cnVuZGVmaW5lZCApIHsKKwkJCXJldHVybiBq UXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTsKKwkJfQorCisJCS8vIEFsbCBhdHRyaWJ1 dGVzIGFyZSBsb3dlcmNhc2UKKwkJLy8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVm aW5lZAorCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsK KwkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCQlob29rcyA9IGpRdWVyeS5hdHRySG9v a3NbIG5hbWUgXSB8fAorCQkJCSggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkg PyBib29sSG9vayA6IG5vZGVIb29rICk7CisJCX0KKworCQlpZiAoIHZhbHVlICE9PSB1bmRlZmlu ZWQgKSB7CisKKwkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CisJCQkJalF1ZXJ5LnJlbW92ZUF0 dHIoIGVsZW0sIG5hbWUgKTsKKworCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9v a3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5l ZCApIHsKKwkJCQlyZXR1cm4gcmV0OworCisJCQl9IGVsc2UgeworCQkJCWVsZW0uc2V0QXR0cmli dXRlKCBuYW1lLCB2YWx1ZSArICIiICk7CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCisJCX0g ZWxzZSBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVs ZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CisJCQlyZXR1cm4gcmV0OworCisJCX0gZWxzZSB7CisJ CQlyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7CisKKwkJCS8vIE5vbi1leGlz dGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisJ CQlyZXR1cm4gcmV0ID09IG51bGwgPworCQkJCXVuZGVmaW5lZCA6CisJCQkJcmV0OworCQl9CisJ fSwKKworCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJdmFyIG5hbWUs IHByb3BOYW1lLAorCQkJaSA9IDAsCisJCQlhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRj aCggcm5vdHdoaXRlICk7CisKKwkJaWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0g MSApIHsKKwkJCXdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7CisJCQkJcHJvcE5h bWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKwkJCQkvLyBCb29sZWFuIGF0 dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisJCQkJaWYgKCBqUXVlcnku ZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHsKKwkJCQkJLy8gU2V0IGNvcnJlc3BvbmRp bmcgcHJvcGVydHkgdG8gZmFsc2UKKwkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOworCQkJ CX0KKworCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7CisJCQl9CisJCX0KKwl9LAor CisJYXR0ckhvb2tzOiB7CisJCXR5cGU6IHsKKwkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVl ICkgeworCQkJCWlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gInJhZGlvIiAm JgorCQkJCQlqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSApIHsKKwkJCQkJLy8gU2V0 dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRo ZSB2YWx1ZSBpbiBJRTYtOQorCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBkZWZhdWx0IGluIGNhc2Ug dHlwZSBpcyBzZXQgYWZ0ZXIgdmFsdWUgZHVyaW5nIGNyZWF0aW9uCisJCQkJCXZhciB2YWwgPSBl bGVtLnZhbHVlOworCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOworCQkJ CQlpZiAoIHZhbCApIHsKKwkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CisJCQkJCX0KKwkJCQkJcmV0 dXJuIHZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30pOworCisvLyBIb29rcyBmb3IgYm9v bGVhbiBhdHRyaWJ1dGVzCitib29sSG9vayA9IHsKKwlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1 ZSwgbmFtZSApIHsKKwkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkvLyBSZW1vdmUgYm9v bGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlCisJCQlqUXVlcnkucmVtb3ZlQXR0cigg ZWxlbSwgbmFtZSApOworCQl9IGVsc2UgeworCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5h bWUgKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9Cit9OworalF1ZXJ5LmVhY2goIGpRdWVyeS5l eHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUg KSB7CisJdmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRy OworCisJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkg eworCQl2YXIgcmV0LCBoYW5kbGU7CisJCWlmICggIWlzWE1MICkgeworCQkJLy8gQXZvaWQgYW4g aW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20g dGhlIGdldHRlcgorCQkJaGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdOworCQkJYXR0ckhhbmRs ZVsgbmFtZSBdID0gcmV0OworCQkJcmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9 IG51bGwgPworCQkJCW5hbWUudG9Mb3dlckNhc2UoKSA6CisJCQkJbnVsbDsKKwkJCWF0dHJIYW5k bGVbIG5hbWUgXSA9IGhhbmRsZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07Cit9KTsKKworCisK KwordmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9p OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7 CisJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1l bnRzLmxlbmd0aCA+IDEgKTsKKwl9LAorCisJcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7 CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlkZWxldGUgdGhpc1sgalF1ZXJ5 LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07CisJCX0pOworCX0KK30pOworCitqUXVlcnkuZXh0 ZW5kKHsKKwlwcm9wRml4OiB7CisJCSJmb3IiOiAiaHRtbEZvciIsCisJCSJjbGFzcyI6ICJjbGFz c05hbWUiCisJfSwKKworCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJ dmFyIHJldCwgaG9va3MsIG5vdHhtbCwKKwkJCW5UeXBlID0gZWxlbS5ub2RlVHlwZTsKKworCQkv LyBkb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRl IG5vZGVzCisJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5 cGUgPT09IDIgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8 fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CisKKwkJaWYgKCBub3R4bWwgKSB7CisJCQkvLyBG aXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzCisJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUg XSB8fCBuYW1lOworCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CisJCX0KKwor CQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4gaG9va3MgJiYgInNldCIg aW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVu ZGVmaW5lZCA/CisJCQkJcmV0IDoKKwkJCQkoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CisKKwkJ fSBlbHNlIHsKKwkJCXJldHVybiBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9v a3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsID8KKwkJCQlyZXQgOgorCQkJCWVsZW1bIG5h bWUgXTsKKwkJfQorCX0sCisKKwlwcm9wSG9va3M6IHsKKwkJdGFiSW5kZXg6IHsKKwkJCWdldDog ZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJcmV0dXJuIGVsZW0uaGFzQXR0cmlidXRlKCAidGFiaW5k ZXgiICkgfHwgcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID8K KwkJCQkJZWxlbS50YWJJbmRleCA6CisJCQkJCS0xOworCQkJfQorCQl9CisJfQorfSk7CisKKy8v IFN1cHBvcnQ6IElFOSsKKy8vIFNlbGVjdGVkbmVzcyBmb3IgYW4gb3B0aW9uIGluIGFuIG9wdGdy b3VwIGNhbiBiZSBpbmFjY3VyYXRlCitpZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgeworCWpR dWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7CisJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJ CQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOworCQkJaWYgKCBwYXJlbnQgJiYgcGFyZW50 LnBhcmVudE5vZGUgKSB7CisJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJ CX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfTsKK30KKworalF1ZXJ5LmVhY2goWworCSJ0YWJJ bmRleCIsCisJInJlYWRPbmx5IiwKKwkibWF4TGVuZ3RoIiwKKwkiY2VsbFNwYWNpbmciLAorCSJj ZWxsUGFkZGluZyIsCisJInJvd1NwYW4iLAorCSJjb2xTcGFuIiwKKwkidXNlTWFwIiwKKwkiZnJh bWVCb3JkZXIiLAorCSJjb250ZW50RWRpdGFibGUiCitdLCBmdW5jdGlvbigpIHsKKwlqUXVlcnku cHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOworfSk7CisKKworCisKK3ZhciBy Y2xhc3MgPSAvW1x0XHJcblxmXS9nOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlhZGRDbGFzczog ZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwg ZmluYWxWYWx1ZSwKKwkJCXByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmIHZh bHVlLAorCQkJaSA9IDAsCisJCQlsZW4gPSB0aGlzLmxlbmd0aDsKKworCQlpZiAoIGpRdWVyeS5p c0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiAp IHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhp cy5jbGFzc05hbWUgKSApOworCQkJfSk7CisJCX0KKworCQlpZiAoIHByb2NlZWQgKSB7CisJCQkv LyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2Vl IHJlbW92ZUNsYXNzKQorCQkJY2xhc3NlcyA9ICggdmFsdWUgfHwgIiIgKS5tYXRjaCggcm5vdHdo aXRlICkgfHwgW107CisKKwkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJCWVsZW0gPSB0 aGlzWyBpIF07CisJCQkJY3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NO YW1lID8KKwkJCQkJKCAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiApLnJlcGxhY2UoIHJjbGFz cywgIiAiICkgOgorCQkJCQkiICIKKwkJCQkpOworCisJCQkJaWYgKCBjdXIgKSB7CisJCQkJCWog PSAwOworCQkJCQl3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7CisJCQkJCQlpZiAo IGN1ci5pbmRleE9mKCAiICIgKyBjbGF6eiArICIgIiApIDwgMCApIHsKKwkJCQkJCQljdXIgKz0g Y2xhenogKyAiICI7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBvbmx5IGFzc2lnbiBpZiBk aWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgorCQkJCQlmaW5hbFZhbHVlID0g alF1ZXJ5LnRyaW0oIGN1ciApOworCQkJCQlpZiAoIGVsZW0uY2xhc3NOYW1lICE9PSBmaW5hbFZh bHVlICkgeworCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBmaW5hbFZhbHVlOworCQkJCQl9CisJCQkJ fQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUNsYXNzOiBmdW5j dGlvbiggdmFsdWUgKSB7CisJCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLCBmaW5h bFZhbHVlLAorCQkJcHJvY2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIHZh bHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSwKKwkJCWkgPSAwLAorCQkJbGVuID0gdGhpcy5sZW5n dGg7CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKwkJCXJldHVybiB0 aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3Mo IHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKwkJCX0pOworCQl9CisJ CWlmICggcHJvY2VlZCApIHsKKwkJCWNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIHJu b3R3aGl0ZSApIHx8IFtdOworCisJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJCQllbGVt ID0gdGhpc1sgaSBdOworCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIg Y29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCisJCQkJY3VyID0gZWxlbS5ub2RlVHlwZSA9 PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KKwkJCQkJKCAiICIgKyBlbGVtLmNsYXNzTmFtZSAr ICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICkgOgorCQkJCQkiIgorCQkJCSk7CisKKwkJCQlp ZiAoIGN1ciApIHsKKwkJCQkJaiA9IDA7CisJCQkJCXdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tq KytdKSApIHsKKwkJCQkJCS8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKwkJCQkJCXdoaWxlICgg Y3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPj0gMCApIHsKKwkJCQkJCQljdXIgPSBj dXIucmVwbGFjZSggIiAiICsgY2xhenogKyAiICIsICIgIiApOworCQkJCQkJfQorCQkJCQl9CisK KwkJCQkJLy8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRl cmluZy4KKwkJCQkJZmluYWxWYWx1ZSA9IHZhbHVlID8galF1ZXJ5LnRyaW0oIGN1ciApIDogIiI7 CisJCQkJCWlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7CisJCQkJCQllbGVt LmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQly ZXR1cm4gdGhpczsKKwl9LAorCisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVW YWwgKSB7CisJCXZhciB0eXBlID0gdHlwZW9mIHZhbHVlOworCisJCWlmICggdHlwZW9mIHN0YXRl VmFsID09PSAiYm9vbGVhbiIgJiYgdHlwZSA9PT0gInN0cmluZyIgKSB7CisJCQlyZXR1cm4gc3Rh dGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUg KTsKKwkJfQorCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQlyZXR1 cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgeworCQkJCWpRdWVyeSggdGhpcyApLnRvZ2dsZUNs YXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGksIHRoaXMuY2xhc3NOYW1lLCBzdGF0ZVZhbCksIHN0YXRl VmFsICk7CisJCQl9KTsKKwkJfQorCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJ CQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgeworCQkJCS8vIHRvZ2dsZSBpbmRpdmlkdWFsIGNs YXNzIG5hbWVzCisJCQkJdmFyIGNsYXNzTmFtZSwKKwkJCQkJaSA9IDAsCisJCQkJCXNlbGYgPSBq UXVlcnkoIHRoaXMgKSwKKwkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUg KSB8fCBbXTsKKworCQkJCXdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSAp IHsKKwkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBs aXN0CisJCQkJCWlmICggc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICkgKSB7CisJCQkJCQlzZWxm LnJlbW92ZUNsYXNzKCBjbGFzc05hbWUgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNlbGYuYWRk Q2xhc3MoIGNsYXNzTmFtZSApOworCQkJCQl9CisJCQkJfQorCisJCQkvLyBUb2dnbGUgd2hvbGUg Y2xhc3MgbmFtZQorCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gc3RydW5kZWZpbmVkIHx8IHR5cGUg PT09ICJib29sZWFuIiApIHsKKwkJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgeworCQkJCQkvLyBz dG9yZSBjbGFzc05hbWUgaWYgc2V0CisJCQkJCWRhdGFfcHJpdi5zZXQoIHRoaXMsICJfX2NsYXNz TmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKKwkJCQl9CisKKwkJCQkvLyBJZiB0aGUgZWxlbWVu dCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCAiZmFsc2UiLAorCQkJCS8vIHRo ZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92 ZSBzYXZlZCBpdCkuCisJCQkJLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHBy ZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSwKKwkJCQkvLyBmYWxsaW5nIGJhY2sgdG8gdGhl IGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuCisJCQkJdGhpcy5jbGFzc05hbWUg PSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGRhdGFfcHJpdi5nZXQo IHRoaXMsICJfX2NsYXNzTmFtZV9fIiApIHx8ICIiOworCQkJfQorCQl9KTsKKwl9LAorCisJaGFz Q2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNl bGVjdG9yICsgIiAiLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGg7CisJCWZvciAoIDsg aSA8IGw7IGkrKyApIHsKKwkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsg dGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNs YXNzTmFtZSApID49IDAgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1 cm4gZmFsc2U7CisJfQorfSk7CisKKworCisKK3ZhciBycmV0dXJuID0gL1xyL2c7CisKK2pRdWVy eS5mbi5leHRlbmQoeworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQl2YXIgaG9va3MsIHJl dCwgaXNGdW5jdGlvbiwKKwkJCWVsZW0gPSB0aGlzWzBdOworCisJCWlmICggIWFyZ3VtZW50cy5s ZW5ndGggKSB7CisJCQlpZiAoIGVsZW0gKSB7CisJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3Nb IGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz ZSgpIF07CisKKwkJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29r cy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSkgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJcmV0dXJuIHJl dDsKKwkJCQl9CisKKwkJCQlyZXQgPSBlbGVtLnZhbHVlOworCisJCQkJcmV0dXJuIHR5cGVvZiBy ZXQgPT09ICJzdHJpbmciID8KKwkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNl cworCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOgorCQkJCQkvLyBoYW5kbGUgY2FzZXMg d2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKKwkJCQkJcmV0ID09IG51bGwgPyAi IiA6IHJldDsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisKKwkJaXNGdW5jdGlvbiA9IGpRdWVy eS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkg KSB7CisJCQl2YXIgdmFsOworCisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7CisJCQkJ cmV0dXJuOworCQkJfQorCisJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CisJCQkJdmFsID0gdmFsdWUu Y2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTsKKwkJCX0gZWxzZSB7CisJCQkJ dmFsID0gdmFsdWU7CisJCQl9CisKKwkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBj b252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCisJCQlpZiAoIHZhbCA9PSBudWxsICkgeworCQkJCXZh bCA9ICIiOworCisJCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSAibnVtYmVyIiApIHsKKwkJ CQl2YWwgKz0gIiI7CisKKwkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsK KwkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCQkJcmV0 dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiI7CisJCQkJfSk7CisJCQl9CisKKwkJ CWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3Nb IHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOworCisJCQkvLyBJZiBzZXQgcmV0dXJucyB1 bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZworCQkJaWYgKCAhaG9va3MgfHwg ISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0g dW5kZWZpbmVkICkgeworCQkJCXRoaXMudmFsdWUgPSB2YWw7CisJCQl9CisJCX0pOworCX0KK30p OworCitqUXVlcnkuZXh0ZW5kKHsKKwl2YWxIb29rczogeworCQlvcHRpb246IHsKKwkJCWdldDog ZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0s ICJ2YWx1ZSIgKTsKKwkJCQlyZXR1cm4gdmFsICE9IG51bGwgPworCQkJCQl2YWwgOgorCQkJCQkv LyBTdXBwb3J0OiBJRTEwLTExKworCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9u cyAoIzE0Njg2LCAjMTQ4NTgpCisJCQkJCWpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSAp ICk7CisJCQl9CisJCX0sCisJCXNlbGVjdDogeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsK KwkJCQl2YXIgdmFsdWUsIG9wdGlvbiwKKwkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKKwkJ CQkJaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0g InNlbGVjdC1vbmUiIHx8IGluZGV4IDwgMCwKKwkJCQkJdmFsdWVzID0gb25lID8gbnVsbCA6IFtd LAorCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCwKKwkJCQkJaSA9 IGluZGV4IDwgMCA/CisJCQkJCQltYXggOgorCQkJCQkJb25lID8gaW5kZXggOiAwOworCisJCQkJ Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9ucworCQkJCWZvciAoIDsgaSA8 IG1heDsgaSsrICkgeworCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CisKKwkJCQkJLy8gSUU2 LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCisJCQkJ CWlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJgorCQkJCQkJCS8vIERv bid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0 Z3JvdXAKKwkJCQkJCQkoIHN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDog b3B0aW9uLmdldEF0dHJpYnV0ZSggImRpc2FibGVkIiApID09PSBudWxsICkgJiYKKwkJCQkJCQko ICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24u cGFyZW50Tm9kZSwgIm9wdGdyb3VwIiApICkgKSB7CisKKwkJCQkJCS8vIEdldCB0aGUgc3BlY2lm aWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KKwkJCQkJCXZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52 YWwoKTsKKworCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMK KwkJCQkJCWlmICggb25lICkgeworCQkJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQkJCX0KKworCQkJ CQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKKwkJCQkJCXZhbHVlcy5wdXNoKCB2 YWx1ZSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIHZhbHVlczsKKwkJCX0sCisKKwkJ CXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJCXZhciBvcHRpb25TZXQsIG9wdGlv biwKKwkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKKwkJCQkJdmFsdWVzID0galF1ZXJ5Lm1h a2VBcnJheSggdmFsdWUgKSwKKwkJCQkJaSA9IG9wdGlvbnMubGVuZ3RoOworCisJCQkJd2hpbGUg KCBpLS0gKSB7CisJCQkJCW9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKwkJCQkJaWYgKCAob3B0aW9u LnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIG9wdGlvbi52YWx1ZSwgdmFsdWVzICkgPj0gMCkg KSB7CisJCQkJCQlvcHRpb25TZXQgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gZm9y Y2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1 ZSBpcyBzZXQKKwkJCQlpZiAoICFvcHRpb25TZXQgKSB7CisJCQkJCWVsZW0uc2VsZWN0ZWRJbmRl eCA9IC0xOworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfQorCQl9CisJfQorfSk7CisK Ky8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCitqUXVlcnkuZWFjaChbICJy YWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CisJalF1ZXJ5LnZhbEhvb2tzWyB0aGlz IF0gPSB7CisJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworCQkJaWYgKCBqUXVlcnku aXNBcnJheSggdmFsdWUgKSApIHsKKwkJCQlyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnku aW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTsKKwkJCX0KKwkJfQor CX07CisJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgeworCQlqUXVlcnkudmFsSG9va3NbIHRoaXMg XS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIFN1cHBvcnQ6IFdlYmtpdAorCQkJLy8g IiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVk CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPT09IG51bGwgPyAib24iIDog ZWxlbS52YWx1ZTsKKwkJfTsKKwl9Cit9KTsKKworCisKKworLy8gUmV0dXJuIGpRdWVyeSBmb3Ig YXR0cmlidXRlcy1vbmx5IGluY2x1c2lvbgorCisKK2pRdWVyeS5lYWNoKCAoImJsdXIgZm9jdXMg Zm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNr ICIgKworCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1v dXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKKwkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBr ZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIpLnNwbGl0KCIgIiksIGZ1bmN0aW9uKCBp LCBuYW1lICkgeworCisJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKKwlqUXVlcnkuZm5bIG5hbWUg XSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAw ID8KKwkJCXRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOgorCQkJdGhpcy50cmlnZ2Vy KCBuYW1lICk7CisJfTsKK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlob3ZlcjogZnVuY3Rp b24oIGZuT3ZlciwgZm5PdXQgKSB7CisJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciAp Lm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOworCX0sCisKKwliaW5kOiBmdW5jdGlvbigg dHlwZXMsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEs IGZuICk7CisJfSwKKwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7CisJCXJldHVybiB0 aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7CisJfSwKKworCWRlbGVnYXRlOiBmdW5jdGlvbigg c2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBz ZWxlY3RvciwgZGF0YSwgZm4gKTsKKwl9LAorCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3Rv ciwgdHlwZXMsIGZuICkgeworCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVz IFssIGZuXSApCisJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNl bGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIsIGZuICk7 CisJfQorfSk7CisKKwordmFyIG5vbmNlID0galF1ZXJ5Lm5vdygpOworCit2YXIgcnF1ZXJ5ID0g KC9cPy8pOworCisKKworLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKKy8vIFdvcmthcm91bmQgZmFp bHVyZSB0byBzdHJpbmctY2FzdCBudWxsIGlucHV0CitqUXVlcnkucGFyc2VKU09OID0gZnVuY3Rp b24oIGRhdGEgKSB7CisJcmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyAiIiApOworfTsKKworCisv LyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCitqUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbigg ZGF0YSApIHsKKwl2YXIgeG1sLCB0bXA7CisJaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0g InN0cmluZyIgKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8vIFN1cHBvcnQ6IElFOQorCXRy eSB7CisJCXRtcCA9IG5ldyBET01QYXJzZXIoKTsKKwkJeG1sID0gdG1wLnBhcnNlRnJvbVN0cmlu ZyggZGF0YSwgInRleHQveG1sIiApOworCX0gY2F0Y2ggKCBlICkgeworCQl4bWwgPSB1bmRlZmlu ZWQ7CisJfQorCisJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNl cmVycm9yIiApLmxlbmd0aCApIHsKKwkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBk YXRhICk7CisJfQorCXJldHVybiB4bWw7Cit9OworCisKK3ZhcgorCS8vIERvY3VtZW50IGxvY2F0 aW9uCisJYWpheExvY1BhcnRzLAorCWFqYXhMb2NhdGlvbiwKKworCXJoYXNoID0gLyMuKiQvLAor CXJ0cyA9IC8oWz8mXSlfPVteJl0qLywKKwlyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJc bl0qKSQvbWcsCisJLy8gIzc2NTMsICM4MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0 aW9uCisJcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRl bnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKKwlybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkk LywKKwlycHJvdG9jb2wgPSAvXlwvXC8vLAorCXJ1cmwgPSAvXihbXHcuKy1dKzopKD86XC9cLyg/ OlteXC8/I10qQHwpKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLywKKworCS8qIFByZWZpbHRlcnMK KwkgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNl ZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKQorCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6 CisJICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydAorCSAqICAgIC0gQUZURVIg cGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEg aXMgdHJ1ZSkKKwkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCisJICogNCkgdGhlIGNhdGNoYWxs IHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQKKwkgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRo IHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIqIiBpZiBuZWVk ZWQKKwkgKi8KKwlwcmVmaWx0ZXJzID0ge30sCisKKwkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCisJ ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZQorCSAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioi IGNhbiBiZSB1c2VkCisJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQg ZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAorCSAqLworCXRyYW5zcG9ydHMg PSB7fSwKKworCS8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7 IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvbgorCWFsbFR5cGVzID0gIiov Ii5jb25jYXQoIioiKTsKKworLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hl biBhY2Nlc3NpbmcKKy8vIGEgZmllbGQgZnJvbSB3aW5kb3cubG9jYXRpb24gaWYgZG9jdW1lbnQu ZG9tYWluIGhhcyBiZWVuIHNldAordHJ5IHsKKwlhamF4TG9jYXRpb24gPSBsb2NhdGlvbi5ocmVm OworfSBjYXRjaCggZSApIHsKKwkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxl bWVudAorCS8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9u CisJYWpheExvY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CisJYWpheExv Y2F0aW9uLmhyZWYgPSAiIjsKKwlhamF4TG9jYXRpb24gPSBhamF4TG9jYXRpb24uaHJlZjsKK30K KworLy8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzCithamF4TG9jUGFydHMgPSBydXJsLmV4 ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107CisKKy8vIEJhc2UgImNvbnN0 cnVjdG9yIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0 CitmdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHsKKwor CS8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIioiCisJ cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7CisKKwkJaWYgKCB0 eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKKwkJCWZ1bmMgPSBkYXRh VHlwZUV4cHJlc3Npb247CisJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CisJCX0KKworCQl2 YXIgZGF0YVR5cGUsCisJCQlpID0gMCwKKwkJCWRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lv bi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKKworCQlpZiAoIGpRdWVy eS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CisJCQkvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUg ZGF0YVR5cGVFeHByZXNzaW9uCisJCQl3aGlsZSAoIChkYXRhVHlwZSA9IGRhdGFUeXBlc1tpKytd KSApIHsKKwkJCQkvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZAorCQkJCWlmICggZGF0YVR5cGVbMF0g PT09ICIrIiApIHsKKwkJCQkJZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8ICIqIjsK KwkJCQkJKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBb XSkudW5zaGlmdCggZnVuYyApOworCisJCQkJLy8gT3RoZXJ3aXNlIGFwcGVuZAorCQkJCX0gZWxz ZSB7CisJCQkJCShzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0g fHwgW10pLnB1c2goIGZ1bmMgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9OworfQorCisvLyBCYXNl IGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0 aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9y aWdpbmFsT3B0aW9ucywganFYSFIgKSB7CisKKwl2YXIgaW5zcGVjdGVkID0ge30sCisJCXNlZWtp bmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApOworCisJZnVuY3Rpb24g aW5zcGVjdCggZGF0YVR5cGUgKSB7CisJCXZhciBzZWxlY3RlZDsKKwkJaW5zcGVjdGVkWyBkYXRh VHlwZSBdID0gdHJ1ZTsKKwkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBb XSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKKwkJCXZhciBkYXRhVHlwZU9y VHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMs IGpxWEhSICk7CisJCQlpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5n IiAmJiAhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0 IF0gKSB7CisJCQkJb3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9y dCApOworCQkJCWluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCQlyZXR1cm4gZmFs c2U7CisJCQl9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkgeworCQkJCXJldHVybiAhKCBz ZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiBz ZWxlY3RlZDsKKwl9CisKKwlyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSAp IHx8ICFpbnNwZWN0ZWRbICIqIiBdICYmIGluc3BlY3QoICIqIiApOworfQorCisvLyBBIHNwZWNp YWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKKy8vIHRoYXQgdGFrZXMgImZsYXQiIG9wdGlvbnMg KG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKQorLy8gRml4ZXMgIzk4ODcKK2Z1bmN0aW9uIGFqYXhF eHRlbmQoIHRhcmdldCwgc3JjICkgeworCXZhciBrZXksIGRlZXAsCisJCWZsYXRPcHRpb25zID0g alF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKKworCWZvciAoIGtleSBpbiBz cmMgKSB7CisJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgeworCQkJKCBmbGF0T3B0 aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9 IHNyY1sga2V5IF07CisJCX0KKwl9CisJaWYgKCBkZWVwICkgeworCQlqUXVlcnkuZXh0ZW5kKCB0 cnVlLCB0YXJnZXQsIGRlZXAgKTsKKwl9CisKKwlyZXR1cm4gdGFyZ2V0OworfQorCisvKiBIYW5k bGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CisgKiAtIGZpbmRzIHRoZSByaWdodCBk YXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFU eXBlKQorICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgKi8KK2Z1bmN0 aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CisKKwl2YXIg Y3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCisJCWNvbnRlbnRzID0gcy5j b250ZW50cywKKwkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7CisKKwkvLyBSZW1vdmUgYXV0byBk YXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcworCXdoaWxlICggZGF0 YVR5cGVzWyAwIF0gPT09ICIqIiApIHsKKwkJZGF0YVR5cGVzLnNoaWZ0KCk7CisJCWlmICggY3Qg PT09IHVuZGVmaW5lZCApIHsKKwkJCWN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25z ZUhlYWRlcigiQ29udGVudC1UeXBlIik7CisJCX0KKwl9CisKKwkvLyBDaGVjayBpZiB3ZSdyZSBk ZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKKwlpZiAoIGN0ICkgeworCQlmb3IgKCB0 eXBlIGluIGNvbnRlbnRzICkgeworCQkJaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRz WyB0eXBlIF0udGVzdCggY3QgKSApIHsKKwkJCQlkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUg YSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisJaWYgKCBkYXRhVHlwZXNbIDAg XSBpbiByZXNwb25zZXMgKSB7CisJCWZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKKwl9 IGVsc2UgeworCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCisJCWZvciAoIHR5cGUgaW4g cmVzcG9uc2VzICkgeworCQkJaWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0 eXBlICsgIiAiICsgZGF0YVR5cGVzWzBdIF0gKSB7CisJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7 CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgeworCQkJCWZpcnN0 RGF0YVR5cGUgPSB0eXBlOworCQkJfQorCQl9CisJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQor CQlmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlOworCX0KKwor CS8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGUKKwkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRo ZSBsaXN0IGlmIG5lZWRlZAorCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9u c2UKKwlpZiAoIGZpbmFsRGF0YVR5cGUgKSB7CisJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0 YVR5cGVzWyAwIF0gKSB7CisJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwor CQl9CisJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKKwl9Cit9CisKKy8qIENo YWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9u c2UKKyAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0 YW5jZQorICovCitmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1 Y2Nlc3MgKSB7CisJdmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsCisJCWNvbnZl cnRlcnMgPSB7fSwKKwkJLy8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3 ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvbgorCQlkYXRhVHlwZXMgPSBzLmRhdGFU eXBlcy5zbGljZSgpOworCisJLy8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNl ZCBrZXlzCisJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKKwkJZm9yICggY29udiBpbiBzLmNvbnZl cnRlcnMgKSB7CisJCQljb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVy dGVyc1sgY29udiBdOworCQl9CisJfQorCisJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwor CisJLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUKKwl3aGlsZSAoIGN1cnJl bnQgKSB7CisKKwkJaWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7CisJCQlqcVhI Ulsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKKwkJfQorCisJCS8v IEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCisJCWlmICggIXByZXYgJiYgaXNTdWNj ZXNzICYmIHMuZGF0YUZpbHRlciApIHsKKwkJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNw b25zZSwgcy5kYXRhVHlwZSApOworCQl9CisKKwkJcHJldiA9IGN1cnJlbnQ7CisJCWN1cnJlbnQg PSBkYXRhVHlwZXMuc2hpZnQoKTsKKworCQlpZiAoIGN1cnJlbnQgKSB7CisKKwkJLy8gVGhlcmUn cyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bworCQkJaWYg KCBjdXJyZW50ID09PSAiKiIgKSB7CisKKwkJCQljdXJyZW50ID0gcHJldjsKKworCQkJLy8gQ29u dmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZy b20gY3VycmVudAorCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJl bnQgKSB7CisKKwkJCQkvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlcgorCQkJCWNvbnYgPSBjb252 ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJy ZW50IF07CisKKwkJCQkvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpcgorCQkJCWlmICggIWNv bnYgKSB7CisJCQkJCWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CisKKwkJCQkJCS8vIElm IGNvbnYyIG91dHB1dHMgY3VycmVudAorCQkJCQkJdG1wID0gY29udjIuc3BsaXQoICIgIiApOwor CQkJCQkJaWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHsKKworCQkJCQkJCS8vIElmIHByZXYg Y2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dAorCQkJCQkJCWNvbnYgPSBjb252ZXJ0 ZXJzWyBwcmV2ICsgIiAiICsgdG1wWyAwIF0gXSB8fAorCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAi ICsgdG1wWyAwIF0gXTsKKwkJCQkJCQlpZiAoIGNvbnYgKSB7CisJCQkJCQkJCS8vIENvbmRlbnNl IGVxdWl2YWxlbmNlIGNvbnZlcnRlcnMKKwkJCQkJCQkJaWYgKCBjb252ID09PSB0cnVlICkgewor CQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CisKKwkJCQkJCQkJLy8gT3RoZXJ3 aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZQorCQkJCQkJCQl9IGVsc2UgaWYg KCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgeworCQkJCQkJCQkJY3VycmVudCA9IHRt cFsgMCBdOworCQkJCQkJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7CisJCQkJCQkJ CX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJ CQkJLy8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpCisJCQkJaWYgKCBj b252ICE9PSB0cnVlICkgeworCisJCQkJCS8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8g YnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0KKwkJCQkJaWYgKCBjb252ICYmIHNbICJ0aHJv d3MiIF0gKSB7CisJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CisJCQkJCX0gZWxz ZSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKwkJ CQkJCX0gY2F0Y2ggKCBlICkgeworCQkJCQkJCXJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3Ii LCBlcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAi ICsgY3VycmVudCB9OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJ cmV0dXJuIHsgc3RhdGU6ICJzdWNjZXNzIiwgZGF0YTogcmVzcG9uc2UgfTsKK30KKworalF1ZXJ5 LmV4dGVuZCh7CisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZl IHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBm b3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKwlldGFnOiB7fSwKKworCWFqYXhT ZXR0aW5nczogeworCQl1cmw6IGFqYXhMb2NhdGlvbiwKKwkJdHlwZTogIkdFVCIsCisJCWlzTG9j YWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksCisJCWdsb2JhbDog dHJ1ZSwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQljb250ZW50VHlw ZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisJ CS8qCisJCXRpbWVvdXQ6IDAsCisJCWRhdGE6IG51bGwsCisJCWRhdGFUeXBlOiBudWxsLAorCQl1 c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51bGwsCisJCWNhY2hlOiBudWxsLAorCQl0aHJv d3M6IGZhbHNlLAorCQl0cmFkaXRpb25hbDogZmFsc2UsCisJCWhlYWRlcnM6IHt9LAorCQkqLwor CisJCWFjY2VwdHM6IHsKKwkJCSIqIjogYWxsVHlwZXMsCisJCQl0ZXh0OiAidGV4dC9wbGFpbiIs CisJCQlodG1sOiAidGV4dC9odG1sIiwKKwkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94 bWwiLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIKKwkJfSwK KworCQljb250ZW50czogeworCQkJeG1sOiAveG1sLywKKwkJCWh0bWw6IC9odG1sLywKKwkJCWpz b246IC9qc29uLworCQl9LAorCisJCXJlc3BvbnNlRmllbGRzOiB7CisJCQl4bWw6ICJyZXNwb25z ZVhNTCIsCisJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKKwkJCWpzb246ICJyZXNwb25zZUpTT04i CisJCX0sCisKKwkJLy8gRGF0YSBjb252ZXJ0ZXJzCisJCS8vIEtleXMgc2VwYXJhdGUgc291cmNl IChvciBjYXRjaGFsbCAiKiIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNw YWNlCisJCWNvbnZlcnRlcnM6IHsKKworCQkJLy8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0CisJ CQkiKiB0ZXh0IjogU3RyaW5nLAorCisJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFu c2Zvcm1hdGlvbikKKwkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAorCisJCQkvLyBFdmFsdWF0ZSB0ZXh0 IGFzIGEganNvbiBleHByZXNzaW9uCisJCQkidGV4dCBqc29uIjogalF1ZXJ5LnBhcnNlSlNPTiwK KworCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKKwkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhN TAorCQl9LAorCisJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5k ZWQ6CisJCS8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKwkJ Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKKwkJLy8gZGVlcCBl eHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCisJCWZsYXRPcHRpb25zOiB7CisJCQl1cmw6IHRydWUs CisJCQljb250ZXh0OiB0cnVlCisJCX0KKwl9LAorCisJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdl ZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKKwkvLyB3aXRoIGJvdGggYWpheFNldHRpbmdz IGFuZCBzZXR0aW5ncyBmaWVsZHMuCisJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBp bnRvIGFqYXhTZXR0aW5ncy4KKwlhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdz ICkgeworCQlyZXR1cm4gc2V0dGluZ3MgPworCisJCQkvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9i amVjdAorCQkJYWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRp bmdzICksIHNldHRpbmdzICkgOgorCisJCQkvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisJCQlh amF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTsKKwl9LAorCisJYWpheFBy ZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksCisJYWph eFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCisK KwkvLyBNYWluIG1ldGhvZAorCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CisKKwkJ Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKKwkJaWYg KCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKKwkJCW9wdGlvbnMgPSB1cmw7CisJCQl1cmwg PSB1bmRlZmluZWQ7CisJCX0KKworCQkvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdAor CQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKworCQl2YXIgdHJhbnNwb3J0LAorCQkJLy8gVVJM IHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQorCQkJY2FjaGVVUkwsCisJCQkvLyBSZXNwb25zZSBo ZWFkZXJzCisJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCisJCQlyZXNwb25zZUhlYWRlcnMsCisJ CQkvLyB0aW1lb3V0IGhhbmRsZQorCQkJdGltZW91dFRpbWVyLAorCQkJLy8gQ3Jvc3MtZG9tYWlu IGRldGVjdGlvbiB2YXJzCisJCQlwYXJ0cywKKwkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50 cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAorCQkJZmlyZUdsb2JhbHMsCisJCQkvLyBMb29wIHZhcmlh YmxlCisJCQlpLAorCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAorCQkJcyA9 IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCisJCQkvLyBDYWxsYmFja3MgY29udGV4 dAorCQkJY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCisJCQkvLyBDb250ZXh0IGZv ciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9y IGpRdWVyeSBjb2xsZWN0aW9uCisJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYg KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID8K KwkJCQlqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDoKKwkJCQlqUXVlcnkuZXZlbnQsCisJCQkv LyBEZWZlcnJlZHMKKwkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCisJCQljb21wbGV0 ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwKKwkJCS8vIFN0YXR1 cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9 LAorCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKKwkJCXJlcXVlc3RI ZWFkZXJzID0ge30sCisJCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCisJCQkvLyBUaGUganFY SFIgc3RhdGUKKwkJCXN0YXRlID0gMCwKKwkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQorCQkJ c3RyQWJvcnQgPSAiY2FuY2VsZWQiLAorCQkJLy8gRmFrZSB4aHIKKwkJCWpxWEhSID0geworCQkJ CXJlYWR5U3RhdGU6IDAsCisKKwkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVl ZGVkCisJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CisJCQkJCXZhciBt YXRjaDsKKwkJCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKKwkJCQkJCWlmICggIXJlc3BvbnNlSGVh ZGVycyApIHsKKwkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB7fTsKKwkJCQkJCQl3aGlsZSAoICht YXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHsKKwkJCQkJ CQkJcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBd OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCW1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXku dG9Mb3dlckNhc2UoKSBdOworCQkJCQl9CisJCQkJCXJldHVybiBtYXRjaCA9PSBudWxsID8gbnVs bCA6IG1hdGNoOworCQkJCX0sCisKKwkJCQkvLyBSYXcgc3RyaW5nCisJCQkJZ2V0QWxsUmVzcG9u c2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKKwkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9u c2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKKwkJCQl9LAorCisJCQkJLy8gQ2FjaGVzIHRoZSBoZWFk ZXIKKwkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCQkJ CXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCQkJaWYgKCAhc3RhdGUgKSB7CisJ CQkJCQluYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJz TmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKKwkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2 YWx1ZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCisJCQkJLy8gT3ZlcnJp ZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXIKKwkJCQlvdmVycmlkZU1pbWVUeXBlOiBm dW5jdGlvbiggdHlwZSApIHsKKwkJCQkJaWYgKCAhc3RhdGUgKSB7CisJCQkJCQlzLm1pbWVUeXBl ID0gdHlwZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCisJCQkJLy8gU3Rh dHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKwkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkg eworCQkJCQl2YXIgY29kZTsKKwkJCQkJaWYgKCBtYXAgKSB7CisJCQkJCQlpZiAoIHN0YXRlIDwg MiApIHsKKwkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKKwkJCQkJCQkJLy8gTGF6eS1hZGQg dGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcworCQkJCQkJ CQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0g XTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIEV4ZWN1dGUgdGhlIGFwcHJv cHJpYXRlIGNhbGxiYWNrcworCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMg XSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisKKwkJCQkv LyBDYW5jZWwgdGhlIHJlcXVlc3QKKwkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7 CisJCQkJCXZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0OworCQkJCQlpZiAo IHRyYW5zcG9ydCApIHsKKwkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CisJCQkJ CX0KKwkJCQkJZG9uZSggMCwgZmluYWxUZXh0ICk7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0K KwkJCX07CisKKwkJLy8gQXR0YWNoIGRlZmVycmVkcworCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhI UiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7CisJCWpxWEhSLnN1Y2Nlc3MgPSBq cVhIUi5kb25lOworCQlqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7CisKKwkJLy8gUmVtb3ZlIGhh c2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCisJCS8vIEFkZCBwcm90 b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KQorCQkvLyBI YW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVu Y3kgd2l0aCBvbGQgc2lnbmF0dXJlKQorCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRl ciBpZiBhdmFpbGFibGUKKwkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGFqYXhMb2NhdGlv biApICsgIiIgKS5yZXBsYWNlKCByaGFzaCwgIiIgKQorCQkJLnJlcGxhY2UoIHJwcm90b2NvbCwg YWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CisKKwkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0 byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CisJCXMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8 IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7CisKKwkJLy8gRXh0cmFjdCBkYXRh VHlwZXMgbGlzdAorCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIq IiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgIiIgXTsKKworCQkvLyBB IGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29s Omhvc3Q6cG9ydCBtaXNtYXRjaAorCQlpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHsKKwkJ CXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CisJCQlzLmNyb3NzRG9t YWluID0gISEoIHBhcnRzICYmCisJCQkJKCBwYXJ0c1sgMSBdICE9PSBhamF4TG9jUGFydHNbIDEg XSB8fCBwYXJ0c1sgMiBdICE9PSBhamF4TG9jUGFydHNbIDIgXSB8fAorCQkJCQkoIHBhcnRzWyAz IF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gIjgwIiA6ICI0NDMiICkgKSAhPT0KKwkJ CQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6 IiA/ICI4MCIgOiAiNDQzIiApICkgKQorCQkJKTsKKwkJfQorCisJCS8vIENvbnZlcnQgZGF0YSBp ZiBub3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYm IHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgeworCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFt KCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKKwkJfQorCisJCS8vIEFwcGx5IHByZWZpbHRlcnMK KwkJaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMs IGpxWEhSICk7CisKKwkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0 ZXIsIHN0b3AgdGhlcmUKKwkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKKwkJCXJldHVybiBqcVhIUjsK KwkJfQorCisJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2Vk IHRvCisJCWZpcmVHbG9iYWxzID0gcy5nbG9iYWw7CisKKwkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNl dCBvZiByZXF1ZXN0cworCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0g MCApIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTsKKwkJfQorCisJCS8v IFVwcGVyY2FzZSB0aGUgdHlwZQorCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKKwor CQkvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudAorCQlzLmhhc0NvbnRlbnQgPSAh cm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKKworCQkvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3 ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2UKKwkJLy8gYW5kL29yIElmLU5v bmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCisJCWNhY2hlVVJMID0gcy51cmw7CisKKwkJLy8gTW9y ZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnQKKwkJaWYgKCAh cy5oYXNDb250ZW50ICkgeworCisJCQkvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRh dGEgdG8gdXJsCisJCQlpZiAoIHMuZGF0YSApIHsKKwkJCQljYWNoZVVSTCA9ICggcy51cmwgKz0g KCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgcy5kYXRhICk7CisJCQkJ Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVh bCByZXRyeQorCQkJCWRlbGV0ZSBzLmRhdGE7CisJCQl9CisKKwkJCS8vIEFkZCBhbnRpLWNhY2hl IGluIHVybCBpZiBuZWVkZWQKKwkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CisJCQkJcy51 cmwgPSBydHMudGVzdCggY2FjaGVVUkwgKSA/CisKKwkJCQkJLy8gSWYgdGhlcmUgaXMgYWxyZWFk eSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWUKKwkJCQkJY2FjaGVVUkwucmVwbGFjZSgg cnRzLCAiJDFfPSIgKyBub25jZSsrICkgOgorCisJCQkJCS8vIE90aGVyd2lzZSBhZGQgb25lIHRv IHRoZSBlbmQKKwkJCQkJY2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gIiYi IDogIj8iICkgKyAiXz0iICsgbm9uY2UrKzsKKwkJCX0KKwkJfQorCisJCS8vIFNldCB0aGUgSWYt TW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlm aWVkIG1vZGUuCisJCWlmICggcy5pZk1vZGlmaWVkICkgeworCQkJaWYgKCBqUXVlcnkubGFzdE1v ZGlmaWVkWyBjYWNoZVVSTCBdICkgeworCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1N b2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKKwkJCX0K KwkJCWlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7CisJCQkJanFYSFIuc2V0UmVxdWVz dEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOworCQkJ fQorCQl9CisKKwkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBz ZW50CisJCWlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBm YWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkgeworCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRl ciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKKwkJfQorCisJCS8vIFNldCB0aGUg QWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUK KwkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKKwkJCSJBY2NlcHQiLAorCQkJcy5kYXRhVHlwZXNb IDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gPworCQkJCXMuYWNjZXB0c1sgcy5k YXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5 cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgorCQkJCXMuYWNjZXB0c1sgIioiIF0KKwkJKTsKKwor CQkvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb24KKwkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7 CisJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOworCQl9CisK KwkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAorCQlp ZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQs IGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7CisJCQkvLyBBYm9ydCBp ZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm4KKwkJCXJldHVybiBqcVhIUi5hYm9ydCgpOwor CQl9CisKKwkJLy8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCisJCXN0ckFi b3J0ID0gImFib3J0IjsKKworCQkvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHMKKwkJ Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgeworCQkJ anFYSFJbIGkgXSggc1sgaSBdICk7CisJCX0KKworCQkvLyBHZXQgdHJhbnNwb3J0CisJCXRyYW5z cG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRp b25zLCBqcVhIUiApOworCisJCS8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydAorCQlp ZiAoICF0cmFuc3BvcnQgKSB7CisJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKKwkJfSBl bHNlIHsKKwkJCWpxWEhSLnJlYWR5U3RhdGUgPSAxOworCisJCQkvLyBTZW5kIGdsb2JhbCBldmVu dAorCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dl ciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CisJCQl9CisJCQkvLyBUaW1lb3V0CisJCQlp ZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHsKKwkJCQl0aW1lb3V0VGltZXIgPSBzZXRU aW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJCQlqcVhIUi5hYm9ydCgidGltZW91dCIpOworCQkJCX0s IHMudGltZW91dCApOworCQkJfQorCisJCQl0cnkgeworCQkJCXN0YXRlID0gMTsKKwkJCQl0cmFu c3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKKwkJCX0gY2F0Y2ggKCBlICkgewor CQkJCS8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmUKKwkJCQlpZiAo IHN0YXRlIDwgMiApIHsKKwkJCQkJZG9uZSggLTEsIGUgKTsKKwkJCQkvLyBTaW1wbHkgcmV0aHJv dyBvdGhlcndpc2UKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBlOworCQkJCX0KKwkJCX0KKwkJ fQorCisJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQorCQlmdW5jdGlv biBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsK KwkJCXZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsCisJ CQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CisKKwkJCS8vIENhbGxlZCBvbmNlCisJ CQlpZiAoIHN0YXRlID09PSAyICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gU3RhdGUg aXMgImRvbmUiIG5vdworCQkJc3RhdGUgPSAyOworCisJCQkvLyBDbGVhciB0aW1lb3V0IGlmIGl0 IGV4aXN0cworCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CisJCQkJY2xlYXJUaW1lb3V0KCB0aW1l b3V0VGltZXIgKTsKKwkJCX0KKworCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJs eSBnYXJiYWdlIGNvbGxlY3Rpb24KKwkJCS8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhS IG9iamVjdCB3aWxsIGJlIHVzZWQpCisJCQl0cmFuc3BvcnQgPSB1bmRlZmluZWQ7CisKKwkJCS8v IENhY2hlIHJlc3BvbnNlIGhlYWRlcnMKKwkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRl cnMgfHwgIiI7CisKKwkJCS8vIFNldCByZWFkeVN0YXRlCisJCQlqcVhIUi5yZWFkeVN0YXRlID0g c3RhdHVzID4gMCA/IDQgOiAwOworCisJCQkvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bAorCQkJ aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAz MDQ7CisKKwkJCS8vIEdldCByZXNwb25zZSBkYXRhCisJCQlpZiAoIHJlc3BvbnNlcyApIHsKKwkJ CQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsK KwkJCX0KKworCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VY WFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQorCQkJcmVzcG9uc2UgPSBhamF4Q29udmVydCggcywg cmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTsKKworCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFu ZGxlIHR5cGUgY2hhaW5pbmcKKwkJCWlmICggaXNTdWNjZXNzICkgeworCisJCQkJLy8gU2V0IHRo ZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlm TW9kaWZpZWQgbW9kZS4KKwkJCQlpZiAoIHMuaWZNb2RpZmllZCApIHsKKwkJCQkJbW9kaWZpZWQg PSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOworCQkJCQlpZiAoIG1v ZGlmaWVkICkgeworCQkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlm aWVkOworCQkJCQl9CisJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoImV0 YWciKTsKKwkJCQkJaWYgKCBtb2RpZmllZCApIHsKKwkJCQkJCWpRdWVyeS5ldGFnWyBjYWNoZVVS TCBdID0gbW9kaWZpZWQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBpZiBubyBjb250ZW50CisJ CQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKKwkJCQkJc3Rh dHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisJCQkJLy8gaWYgbm90IG1vZGlmaWVkCisJCQkJfSBl bHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7CisJCQkJCXN0YXR1c1RleHQgPSAibm90bW9kaWZp ZWQiOworCisJCQkJLy8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0CisJCQkJfSBl bHNlIHsKKwkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOworCQkJCQlzdWNjZXNzID0g cmVzcG9uc2UuZGF0YTsKKwkJCQkJZXJyb3IgPSByZXNwb25zZS5lcnJvcjsKKwkJCQkJaXNTdWNj ZXNzID0gIWVycm9yOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gV2UgZXh0cmFjdCBlcnJv ciBmcm9tIHN0YXR1c1RleHQKKwkJCQkvLyB0aGVuIG5vcm1hbGl6ZSBzdGF0dXNUZXh0IGFuZCBz dGF0dXMgZm9yIG5vbi1hYm9ydHMKKwkJCQllcnJvciA9IHN0YXR1c1RleHQ7CisJCQkJaWYgKCBz dGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7CisJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOworCQkJ CQlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCQkJCQlzdGF0dXMgPSAwOworCQkJCQl9CisJCQkJfQor CQkJfQorCisJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAorCQkJanFYSFIu c3RhdHVzID0gc3RhdHVzOworCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4 dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKKworCQkJLy8gU3VjY2Vzcy9FcnJvcgorCQkJaWYgKCBp c1N1Y2Nlc3MgKSB7CisJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwg WyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CisJCQl9IGVsc2UgeworCQkJCWRlZmVy cmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJy b3IgXSApOworCQkJfQorCisJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworCQkJanFY SFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOworCQkJc3RhdHVzQ29kZSA9IHVuZGVmaW5lZDsK KworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dl ciggaXNTdWNjZXNzID8gImFqYXhTdWNjZXNzIiA6ICJhamF4RXJyb3IiLAorCQkJCQlbIGpxWEhS LCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOworCQkJfQorCisJCQkvLyBDb21w bGV0ZQorCQkJY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpx WEhSLCBzdGF0dXNUZXh0IF0gKTsKKworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9i YWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwor CQkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJCWlmICggISggLS1qUXVl cnkuYWN0aXZlICkgKSB7CisJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpOwor CQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBqcVhIUjsKKwl9LAorCisJZ2V0SlNPTjogZnVu Y3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmws IGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKKwl9LAorCisJZ2V0U2NyaXB0OiBmdW5jdGlvbigg dXJsLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBj YWxsYmFjaywgInNjcmlwdCIgKTsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goIFsgImdldCIsICJw b3N0IiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkgeworCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5j dGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJLy8gc2hpZnQgYXJndW1lbnRz IGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg ZGF0YSApICkgeworCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CisJCQljYWxsYmFjayA9IGRh dGE7CisJCQlkYXRhID0gdW5kZWZpbmVkOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsK KwkJCXVybDogdXJsLAorCQkJdHlwZTogbWV0aG9kLAorCQkJZGF0YVR5cGU6IHR5cGUsCisJCQlk YXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2sKKwkJfSk7CisJfTsKK30pOworCisvLyBB dHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50 cworalF1ZXJ5LmVhY2goIFsgImFqYXhTdGFydCIsICJhamF4U3RvcCIsICJhamF4Q29tcGxldGUi LCAiYWpheEVycm9yIiwgImFqYXhTdWNjZXNzIiwgImFqYXhTZW5kIiBdLCBmdW5jdGlvbiggaSwg dHlwZSApIHsKKwlqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHsKKwkJcmV0dXJu IHRoaXMub24oIHR5cGUsIGZuICk7CisJfTsKK30pOworCisKK2pRdWVyeS5fZXZhbFVybCA9IGZ1 bmN0aW9uKCB1cmwgKSB7CisJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJdXJsOiB1cmwsCisJCXR5 cGU6ICJHRVQiLAorCQlkYXRhVHlwZTogInNjcmlwdCIsCisJCWFzeW5jOiBmYWxzZSwKKwkJZ2xv YmFsOiBmYWxzZSwKKwkJInRocm93cyI6IHRydWUKKwl9KTsKK307CisKKworalF1ZXJ5LmZuLmV4 dGVuZCh7CisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCXZhciB3cmFwOworCisJCWlm ICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVu Y3Rpb24oIGkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMs IGkpICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggdGhpc1sgMCBdICkgeworCisJCQkvLyBUaGUg ZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAorCQkJd3JhcCA9IGpRdWVyeSggaHRt bCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CisKKwkJ CWlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7CisJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRo aXNbIDAgXSApOworCQkJfQorCisJCQl3cmFwLm1hcChmdW5jdGlvbigpIHsKKwkJCQl2YXIgZWxl bSA9IHRoaXM7CisKKwkJCQl3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7CisJCQkJ CWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOworCQkJCX0KKworCQkJCXJldHVybiBlbGVt OworCQkJfSkuYXBwZW5kKCB0aGlzICk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg aHRtbCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVl cnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOworCQkJfSk7CisJCX0K KworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJdmFyIHNlbGYgPSBqUXVlcnko IHRoaXMgKSwKKwkJCQljb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKKworCQkJaWYgKCBjb250 ZW50cy5sZW5ndGggKSB7CisJCQkJY29udGVudHMud3JhcEFsbCggaHRtbCApOworCisJCQl9IGVs c2UgeworCQkJCXNlbGYuYXBwZW5kKCBodG1sICk7CisJCQl9CisJCX0pOworCX0sCisKKwl3cmFw OiBmdW5jdGlvbiggaHRtbCApIHsKKwkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlv biggaHRtbCApOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQlqUXVl cnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRt bCApOworCQl9KTsKKwl9LAorCisJdW53cmFwOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMu cGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHsKKwkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhp cywgImJvZHkiICkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hp bGROb2RlcyApOworCQkJfQorCQl9KS5lbmQoKTsKKwl9Cit9KTsKKworCitqUXVlcnkuZXhwci5m aWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgeworCS8vIFN1cHBvcnQ6IE9wZXJhIDw9 IDEyLjEyCisJLy8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMg bGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVtZW50cworCXJldHVybiBlbGVtLm9mZnNldFdpZHRo IDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMDsKK307CitqUXVlcnkuZXhwci5maWx0ZXJz LnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKKwlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRl cnMuaGlkZGVuKCBlbGVtICk7Cit9OworCisKKworCit2YXIgcjIwID0gLyUyMC9nLAorCXJicmFj a2V0ID0gL1xbXF0kLywKKwlyQ1JMRiA9IC9ccj9cbi9nLAorCXJzdWJtaXR0ZXJUeXBlcyA9IC9e KD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSwKKwlyc3VibWl0dGFibGUgPSAv Xig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7CisKK2Z1bmN0aW9uIGJ1aWxkUGFy YW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKwl2YXIgbmFtZTsKKworCWlm ICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgeworCQkvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4K KwkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CisJCQlpZiAoIHRyYWRpdGlv bmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgeworCQkJCS8vIFRyZWF0IGVhY2ggYXJy YXkgaXRlbSBhcyBhIHNjYWxhci4KKwkJCQlhZGQoIHByZWZpeCwgdiApOworCisJCQl9IGVsc2Ug eworCQkJCS8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0 cyBudW1lcmljIGluZGV4LgorCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyAoIHR5cGVv ZiB2ID09PSAib2JqZWN0IiA/IGkgOiAiIiApICsgIl0iLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7 CisJCQl9CisJCX0pOworCisJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBl KCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CisJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KKwkJ Zm9yICggbmFtZSBpbiBvYmogKSB7CisJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFt ZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJfQorCisJfSBlbHNl IHsKKwkJLy8gU2VyaWFsaXplIHNjYWxhciBpdGVtLgorCQlhZGQoIHByZWZpeCwgb2JqICk7CisJ fQorfQorCisvLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBv ZgorLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCitqUXVlcnkucGFyYW0gPSBmdW5j dGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CisJdmFyIHByZWZpeCwKKwkJcyA9IFtdLAorCQlhZGQg PSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJCS8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24s IGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZQorCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5j dGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7 CisJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVu Y29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKKwkJfTsKKworCS8vIFNldCB0cmFkaXRpb25hbCB0 byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCisJaWYgKCB0cmFkaXRpb25hbCA9 PT0gdW5kZWZpbmVkICkgeworCQl0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYg alF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKKwl9CisKKwkvLyBJZiBhbiBhcnJheSB3 YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRz LgorCWlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQ bGFpbk9iamVjdCggYSApICkgKSB7CisJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwor CQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52 YWx1ZSApOworCQl9KTsKKworCX0gZWxzZSB7CisJCS8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUg dGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgorCQkvLyBkaWQgaXQpLCBvdGhl cndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKwkJZm9yICggcHJlZml4IGluIGEgKSB7 CisJCQlidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCAp OworCQl9CisJfQorCisJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorCXJl dHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7Cit9OworCitqUXVlcnkuZm4u ZXh0ZW5kKHsKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5LnBhcmFt KCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKKwl9LAorCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlv bigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJLy8gQ2FuIGFkZCBwcm9w SG9vayBmb3IgImVsZW1lbnRzIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHMKKwkJCXZh ciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CisJCQlyZXR1cm4g ZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpczsKKwkJfSkKKwkJ LmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXZhciB0eXBlID0gdGhpcy50eXBlOworCisJCQkvLyBV c2UgLmlzKCAiOmRpc2FibGVkIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzCisJ CQlyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggIjpkaXNhYmxlZCIgKSAm JgorCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJU eXBlcy50ZXN0KCB0eXBlICkgJiYKKwkJCQkoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5 cGUudGVzdCggdHlwZSApICk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7CisJ CQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CisKKwkJCXJldHVybiB2YWwgPT0gbnVs bCA/CisJCQkJbnVsbCA6CisJCQkJalF1ZXJ5LmlzQXJyYXkoIHZhbCApID8KKwkJCQkJalF1ZXJ5 Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkgeworCQkJCQkJcmV0dXJuIHsgbmFtZTogZWxlbS5u YW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OworCQkJCQl9KSA6CisJ CQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIg KSB9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworCitqUXVlcnkuYWpheFNldHRpbmdzLnhociA9 IGZ1bmN0aW9uKCkgeworCXRyeSB7CisJCXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwl9 IGNhdGNoKCBlICkge30KK307CisKK3ZhciB4aHJJZCA9IDAsCisJeGhyQ2FsbGJhY2tzID0ge30s CisJeGhyU3VjY2Vzc1N0YXR1cyA9IHsKKwkJLy8gZmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRz IHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDAKKwkJMDogMjAwLAorCQkvLyBTdXBwb3J0OiBJRTkK KwkJLy8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUg MjA0CisJCTEyMjM6IDIwNAorCX0sCisJeGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5n cy54aHIoKTsKKworLy8gU3VwcG9ydDogSUU5CisvLyBPcGVuIHJlcXVlc3RzIG11c3QgYmUgbWFu dWFsbHkgYWJvcnRlZCBvbiB1bmxvYWQgKCM1MjgwKQoraWYgKCB3aW5kb3cuQWN0aXZlWE9iamVj dCApIHsKKwlqUXVlcnkoIHdpbmRvdyApLm9uKCAidW5sb2FkIiwgZnVuY3Rpb24oKSB7CisJCWZv ciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkgeworCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSgp OworCQl9CisJfSk7Cit9CisKK3N1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggIndp dGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7CitzdXBwb3J0LmFqYXggPSB4aHJTdXBw b3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKKworalF1ZXJ5LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24o IG9wdGlvbnMgKSB7CisJdmFyIGNhbGxiYWNrOworCisJLy8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxs b3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdAorCWlmICggc3VwcG9ydC5j b3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHsKKwkJcmV0dXJu IHsKKwkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKwkJCQl2YXIgaSwK KwkJCQkJeGhyID0gb3B0aW9ucy54aHIoKSwKKwkJCQkJaWQgPSArK3hocklkOworCisJCQkJeGhy Lm9wZW4oIG9wdGlvbnMudHlwZSwgb3B0aW9ucy51cmwsIG9wdGlvbnMuYXN5bmMsIG9wdGlvbnMu dXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQgKTsKKworCQkJCS8vIEFwcGx5IGN1c3RvbSBmaWVs ZHMgaWYgcHJvdmlkZWQKKwkJCQlpZiAoIG9wdGlvbnMueGhyRmllbGRzICkgeworCQkJCQlmb3Ig KCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgeworCQkJCQkJeGhyWyBpIF0gPSBvcHRpb25zLnho ckZpZWxkc1sgaSBdOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gT3ZlcnJpZGUgbWltZSB0eXBl IGlmIG5lZWRlZAorCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1l VHlwZSApIHsKKwkJCQkJeGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTsK KwkJCQl9CisKKwkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgorCQkJCS8vIEZvciBjcm9z cy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBh cmUKKwkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBp dCB0byBiZSBzdXJlLgorCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1 ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQorCQkJCS8vIEZvciBzYW1lLWRvbWFp biByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgorCQkJ CWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgi XSApIHsKKwkJCQkJaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdID0gIlhNTEh0dHBSZXF1ZXN0 IjsKKwkJCQl9CisKKwkJCQkvLyBTZXQgaGVhZGVycworCQkJCWZvciAoIGkgaW4gaGVhZGVycyAp IHsKKwkJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApOworCQkJCX0K KworCQkJCS8vIENhbGxiYWNrCisJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKKwkJ CQkJcmV0dXJuIGZ1bmN0aW9uKCkgeworCQkJCQkJaWYgKCBjYWxsYmFjayApIHsKKwkJCQkJCQlk ZWxldGUgeGhyQ2FsbGJhY2tzWyBpZCBdOworCQkJCQkJCWNhbGxiYWNrID0geGhyLm9ubG9hZCA9 IHhoci5vbmVycm9yID0gbnVsbDsKKworCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsK KwkJCQkJCQkJeGhyLmFib3J0KCk7CisJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImVycm9y IiApIHsKKwkJCQkJCQkJY29tcGxldGUoCisJCQkJCQkJCQkvLyBmaWxlOiBwcm90b2NvbCBhbHdh eXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwNworCQkJCQkJCQkJeGhyLnN0YXR1 cywKKwkJCQkJCQkJCXhoci5zdGF0dXNUZXh0CisJCQkJCQkJCSk7CisJCQkJCQkJfSBlbHNlIHsK KwkJCQkJCQkJY29tcGxldGUoCisJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVz IF0gfHwgeGhyLnN0YXR1cywKKwkJCQkJCQkJCXhoci5zdGF0dXNUZXh0LAorCQkJCQkJCQkJLy8g U3VwcG9ydDogSUU5CisJCQkJCQkJCQkvLyBBY2Nlc3NpbmcgYmluYXJ5LWRhdGEgcmVzcG9uc2VU ZXh0IHRocm93cyBhbiBleGNlcHRpb24KKwkJCQkJCQkJCS8vICgjMTE0MjYpCisJCQkJCQkJCQl0 eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gInN0cmluZyIgPyB7CisJCQkJCQkJCQkJdGV4dDog eGhyLnJlc3BvbnNlVGV4dAorCQkJCQkJCQkJfSA6IHVuZGVmaW5lZCwKKwkJCQkJCQkJCXhoci5n ZXRBbGxSZXNwb25zZUhlYWRlcnMoKQorCQkJCQkJCQkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJ CQkJfTsKKwkJCQl9OworCisJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cworCQkJCXhoci5vbmxvYWQg PSBjYWxsYmFjaygpOworCQkJCXhoci5vbmVycm9yID0gY2FsbGJhY2soImVycm9yIik7CisKKwkJ CQkvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrCisJCQkJY2FsbGJhY2sgPSB4aHJDYWxsYmFj a3NbIGlkIF0gPSBjYWxsYmFjaygiYWJvcnQiKTsKKworCQkJCXRyeSB7CisJCQkJCS8vIERvIHNl bmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbikKKwkJCQkJeGhyLnNl bmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOworCQkJCX0g Y2F0Y2ggKCBlICkgeworCQkJCQkvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24n dCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldAorCQkJCQlpZiAoIGNhbGxiYWNrICkgewor CQkJCQkJdGhyb3cgZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisKKwkJCWFib3J0OiBmdW5jdGlv bigpIHsKKwkJCQlpZiAoIGNhbGxiYWNrICkgeworCQkJCQljYWxsYmFjaygpOworCQkJCX0KKwkJ CX0KKwkJfTsKKwl9Cit9KTsKKworCisKKworLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKK2pR dWVyeS5hamF4U2V0dXAoeworCWFjY2VwdHM6IHsKKwkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0 LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNh dGlvbi94LWVjbWFzY3JpcHQiCisJfSwKKwljb250ZW50czogeworCQlzY3JpcHQ6IC8oPzpqYXZh fGVjbWEpc2NyaXB0LworCX0sCisJY29udmVydGVyczogeworCQkidGV4dCBzY3JpcHQiOiBmdW5j dGlvbiggdGV4dCApIHsKKwkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CisJCQlyZXR1cm4g dGV4dDsKKwkJfQorCX0KK30pOworCisvLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5k IGNyb3NzRG9tYWluCitqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBz ICkgeworCWlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkgeworCQlzLmNhY2hlID0gZmFsc2U7 CisJfQorCWlmICggcy5jcm9zc0RvbWFpbiApIHsKKwkJcy50eXBlID0gIkdFVCI7CisJfQorfSk7 CisKKy8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydAoralF1ZXJ5LmFqYXhUcmFuc3Bv cnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKKwkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRl YWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCisJaWYgKCBzLmNyb3NzRG9tYWluICkgewor CQl2YXIgc2NyaXB0LCBjYWxsYmFjazsKKwkJcmV0dXJuIHsKKwkJCXNlbmQ6IGZ1bmN0aW9uKCBf LCBjb21wbGV0ZSApIHsKKwkJCQlzY3JpcHQgPSBqUXVlcnkoIjxzY3JpcHQ+IikucHJvcCh7CisJ CQkJCWFzeW5jOiB0cnVlLAorCQkJCQljaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsCisJCQkJCXNy Yzogcy51cmwKKwkJCQl9KS5vbigKKwkJCQkJImxvYWQgZXJyb3IiLAorCQkJCQljYWxsYmFjayA9 IGZ1bmN0aW9uKCBldnQgKSB7CisJCQkJCQlzY3JpcHQucmVtb3ZlKCk7CisJCQkJCQljYWxsYmFj ayA9IG51bGw7CisJCQkJCQlpZiAoIGV2dCApIHsKKwkJCQkJCQljb21wbGV0ZSggZXZ0LnR5cGUg PT09ICJlcnJvciIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJ CQkpOworCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CisJCQl9 LAorCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggY2FsbGJhY2sgKSB7CisJCQkJCWNh bGxiYWNrKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KK30pOworCisKKworCit2YXIgb2xkQ2Fs bGJhY2tzID0gW10sCisJcmpzb25wID0gLyg9KVw/KD89JnwkKXxcP1w/LzsKKworLy8gRGVmYXVs dCBqc29ucCBzZXR0aW5ncworalF1ZXJ5LmFqYXhTZXR1cCh7CisJanNvbnA6ICJjYWxsYmFjayIs CisJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CisJCXZhciBjYWxsYmFjayA9IG9sZENhbGxi YWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBub25jZSsrICkgKTsKKwkJ dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7CisJCXJldHVybiBjYWxsYmFjazsKKwl9Cit9KTsKKwor Ly8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpz b25wIHJlcXVlc3RzCitqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlv biggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CisKKwl2YXIgY2FsbGJhY2tOYW1lLCBv dmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCisJCWpzb25Qcm9wID0gcy5qc29ucCAhPT0g ZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/CisJCQkidXJsIiA6CisJCQl0eXBlb2Yg cy5kYXRhID09PSAic3RyaW5nIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhPZigi YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0 YSApICYmICJkYXRhIgorCQkpOworCisJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0 eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKKwlpZiAoIGpzb25Q cm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09ICJqc29ucCIgKSB7CisKKwkJLy8gR2V0IGNhbGxi YWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBp dAorCQljYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbigg cy5qc29ucENhbGxiYWNrICkgPworCQkJcy5qc29ucENhbGxiYWNrKCkgOgorCQkJcy5qc29ucENh bGxiYWNrOworCisJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKKwkJ aWYgKCBqc29uUHJvcCApIHsKKwkJCXNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxh Y2UoIHJqc29ucCwgIiQxIiArIGNhbGxiYWNrTmFtZSApOworCQl9IGVsc2UgaWYgKCBzLmpzb25w ICE9PSBmYWxzZSApIHsKKwkJCXMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIg OiAiPyIgKSArIHMuanNvbnAgKyAiPSIgKyBjYWxsYmFja05hbWU7CisJCX0KKworCQkvLyBVc2Ug ZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCisJ CXMuY29udmVydGVyc1sic2NyaXB0IGpzb24iXSA9IGZ1bmN0aW9uKCkgeworCQkJaWYgKCAhcmVz cG9uc2VDb250YWluZXIgKSB7CisJCQkJalF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyAiIHdh cyBub3QgY2FsbGVkIiApOworCQkJfQorCQkJcmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07 CisJCX07CisKKwkJLy8gZm9yY2UganNvbiBkYXRhVHlwZQorCQlzLmRhdGFUeXBlc1sgMCBdID0g Impzb24iOworCisJCS8vIEluc3RhbGwgY2FsbGJhY2sKKwkJb3ZlcndyaXR0ZW4gPSB3aW5kb3db IGNhbGxiYWNrTmFtZSBdOworCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7 CisJCQlyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50czsKKwkJfTsKKworCQkvLyBDbGVhbi11 cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycykKKwkJanFYSFIuYWx3YXlzKGZ1bmN0 aW9uKCkgeworCQkJLy8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZQorCQkJd2luZG93WyBjYWxs YmFja05hbWUgXSA9IG92ZXJ3cml0dGVuOworCisJCQkvLyBTYXZlIGJhY2sgYXMgZnJlZQorCQkJ aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHsKKwkJCQkvLyBtYWtlIHN1cmUgdGhhdCByZS11c2lu ZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmQKKwkJCQlzLmpzb25wQ2Fs bGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CisKKwkJCQkvLyBzYXZlIHRo ZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlCisJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNh bGxiYWNrTmFtZSApOworCQkJfQorCisJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFu ZCB3ZSBoYXZlIGEgcmVzcG9uc2UKKwkJCWlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5 LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7CisJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNl Q29udGFpbmVyWyAwIF0gKTsKKwkJCX0KKworCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3Jp dHRlbiA9IHVuZGVmaW5lZDsKKwkJfSk7CisKKwkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CisJCXJl dHVybiAic2NyaXB0IjsKKwl9Cit9KTsKKworCisKKworLy8gZGF0YTogc3RyaW5nIG9mIGh0bWwK Ky8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBi ZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQKKy8vIGtlZXBT Y3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBp biB0aGUgaHRtbCBzdHJpbmcKK2pRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29u dGV4dCwga2VlcFNjcmlwdHMgKSB7CisJaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gInN0 cmluZyIgKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAi Ym9vbGVhbiIgKSB7CisJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKKwkJY29udGV4dCA9IGZhbHNl OworCX0KKwljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCXZhciBwYXJzZWQgPSBy c2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSwKKwkJc2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTsK KworCS8vIFNpbmdsZSB0YWcKKwlpZiAoIHBhcnNlZCApIHsKKwkJcmV0dXJuIFsgY29udGV4dC5j cmVhdGVFbGVtZW50KCBwYXJzZWRbMV0gKSBdOworCX0KKworCXBhcnNlZCA9IGpRdWVyeS5idWls ZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApOworCisJaWYgKCBzY3JpcHRz ICYmIHNjcmlwdHMubGVuZ3RoICkgeworCQlqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTsKKwl9 CisKKwlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTsKK307CisK KworLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAordmFyIF9sb2FkID0galF1 ZXJ5LmZuLmxvYWQ7CisKKy8qKgorICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZQorICovCitqUXVl cnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJaWYgKCB0 eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKKwkJcmV0dXJuIF9sb2FkLmFwcGx5 KCB0aGlzLCBhcmd1bWVudHMgKTsKKwl9CisKKwl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNl LAorCQlzZWxmID0gdGhpcywKKwkJb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKKworCWlmICggb2Zm ID49IDAgKSB7CisJCXNlbGVjdG9yID0galF1ZXJ5LnRyaW0oIHVybC5zbGljZSggb2ZmICkgKTsK KwkJdXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTsKKwl9CisKKwkvLyBJZiBpdCdzIGEgZnVuY3Rp b24KKwlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKKworCQkvLyBXZSBhc3N1 bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjaworCQljYWxsYmFjayA9IHBhcmFtczsKKwkJcGFyYW1z ID0gdW5kZWZpbmVkOworCisJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZworCX0g ZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKKwkJdHlw ZSA9ICJQT1NUIjsKKwl9CisKKwkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFr ZSB0aGUgcmVxdWVzdAorCWlmICggc2VsZi5sZW5ndGggPiAwICkgeworCQlqUXVlcnkuYWpheCh7 CisJCQl1cmw6IHVybCwKKworCQkJLy8gaWYgInR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwg dGhlbiAiR0VUIiBtZXRob2Qgd2lsbCBiZSB1c2VkCisJCQl0eXBlOiB0eXBlLAorCQkJZGF0YVR5 cGU6ICJodG1sIiwKKwkJCWRhdGE6IHBhcmFtcworCQl9KS5kb25lKGZ1bmN0aW9uKCByZXNwb25z ZVRleHQgKSB7CisKKwkJCS8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxs YmFjaworCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CisKKwkJCXNlbGYuaHRtbCggc2VsZWN0b3Ig PworCisJCQkJLy8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0 IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2CisJCQkJLy8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lk IElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzCisJCQkJalF1ZXJ5KCI8ZGl2PiIpLmFwcGVu ZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDoK KworCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CisJCQkJcmVzcG9uc2VUZXh0 ICk7CisKKwkJfSkuY29tcGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVz ICkgeworCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25z ZVRleHQsIHN0YXR1cywganFYSFIgXSApOworCQl9KTsKKwl9CisKKwlyZXR1cm4gdGhpczsKK307 CisKKworCisKK2pRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSAp IHsKKwlyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkgewor CQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKwl9KS5sZW5ndGg7Cit9OworCisKKworCit2YXIg ZG9jRWxlbSA9IHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisKKy8qKgorICogR2V0 cyBhIHdpbmRvdyBmcm9tIGFuIGVsZW1lbnQKKyAqLworZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVt ICkgeworCXJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/IGVsZW0gOiBlbGVtLm5vZGVU eXBlID09PSA5ICYmIGVsZW0uZGVmYXVsdFZpZXc7Cit9CisKK2pRdWVyeS5vZmZzZXQgPSB7CisJ c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKKwkJdmFyIGN1clBvc2l0 aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBj YWxjdWxhdGVQb3NpdGlvbiwKKwkJCXBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0 aW9uIiApLAorCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAorCQkJcHJvcHMgPSB7fTsKKwor CQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9u IHN0YXRpYyBlbGVtCisJCWlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworCQkJZWxlbS5z dHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCX0KKworCQljdXJPZmZzZXQgPSBjdXJFbGVt Lm9mZnNldCgpOworCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOworCQlj dXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQiICk7CisJCWNhbGN1bGF0ZVBvc2l0 aW9uID0gKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiAp ICYmCisJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCJhdXRvIikgPiAtMTsK KworCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0 b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4 ZWQKKwkJaWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHsKKwkJCWN1clBvc2l0aW9uID0gY3VyRWxl bS5wb3NpdGlvbigpOworCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOworCQkJY3VyTGVmdCA9 IGN1clBvc2l0aW9uLmxlZnQ7CisKKwkJfSBlbHNlIHsKKwkJCWN1clRvcCA9IHBhcnNlRmxvYXQo IGN1ckNTU1RvcCApIHx8IDA7CisJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCAp IHx8IDA7CisJCX0KKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CisJ CQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKKwkJfQorCisJ CWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKKwkJCXByb3BzLnRvcCA9ICggb3B0aW9ucy50 b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7CisJCX0KKwkJaWYgKCBvcHRpb25zLmxlZnQg IT0gbnVsbCApIHsKKwkJCXByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5s ZWZ0ICkgKyBjdXJMZWZ0OworCQl9CisKKwkJaWYgKCAidXNpbmciIGluIG9wdGlvbnMgKSB7CisJ CQlvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CisKKwkJfSBlbHNlIHsKKwkJCWN1 ckVsZW0uY3NzKCBwcm9wcyApOworCQl9CisJfQorfTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJ b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHsKKwkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkg eworCQkJcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CisJCQkJdGhpcyA6CisJCQkJdGhp cy5lYWNoKGZ1bmN0aW9uKCBpICkgeworCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhp cywgb3B0aW9ucywgaSApOworCQkJCX0pOworCQl9CisKKwkJdmFyIGRvY0VsZW0sIHdpbiwKKwkJ CWVsZW0gPSB0aGlzWyAwIF0sCisJCQlib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorCQkJZG9j ID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKwkJaWYgKCAhZG9jICkgeworCQkJcmV0 dXJuOworCQl9CisKKwkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisKKwkJLy8gTWFr ZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlCisJCWlmICggIWpRdWVyeS5j b250YWlucyggZG9jRWxlbSwgZWxlbSApICkgeworCQkJcmV0dXJuIGJveDsKKwkJfQorCisJCS8v IElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yCisJ CS8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFsIGlQaG9uZSkKKwkJaWYgKCB0eXBlb2Yg ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IHN0cnVuZGVmaW5lZCApIHsKKwkJCWJveCA9 IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisJCX0KKwkJd2luID0gZ2V0V2luZG93KCBk b2MgKTsKKwkJcmV0dXJuIHsKKwkJCXRvcDogYm94LnRvcCArIHdpbi5wYWdlWU9mZnNldCAtIGRv Y0VsZW0uY2xpZW50VG9wLAorCQkJbGVmdDogYm94LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQgLSBk b2NFbGVtLmNsaWVudExlZnQKKwkJfTsKKwl9LAorCisJcG9zaXRpb246IGZ1bmN0aW9uKCkgewor CQlpZiAoICF0aGlzWyAwIF0gKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl2YXIgb2Zmc2V0UGFy ZW50LCBvZmZzZXQsCisJCQllbGVtID0gdGhpc1sgMCBdLAorCQkJcGFyZW50T2Zmc2V0ID0geyB0 b3A6IDAsIGxlZnQ6IDAgfTsKKworCQkvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20g d2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0 cyBvbmx5IG9mZnNldCBwYXJlbnQKKwkJaWYgKCBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24i ICkgPT09ICJmaXhlZCIgKSB7CisJCQkvLyBXZSBhc3N1bWUgdGhhdCBnZXRCb3VuZGluZ0NsaWVu dFJlY3QgaXMgYXZhaWxhYmxlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWQKKwkJCW9m ZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisKKwkJfSBlbHNlIHsKKwkJCS8v IEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisJCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBh cmVudCgpOworCisJCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCisJCQlvZmZzZXQgPSB0aGlzLm9m ZnNldCgpOworCQkJaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnRbIDAgXSwgImh0 bWwiICkgKSB7CisJCQkJcGFyZW50T2Zmc2V0ID0gb2Zmc2V0UGFyZW50Lm9mZnNldCgpOworCQkJ fQorCisJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBhcmVudE9mZnNldC50b3Ag Kz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJUb3BXaWR0aCIsIHRydWUg KTsKKwkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBd LCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOworCQl9CisKKwkJLy8gU3VidHJhY3QgcGFyZW50 IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucworCQlyZXR1cm4geworCQkJdG9wOiBvZmZzZXQu dG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sICJtYXJnaW5Ub3AiLCB0 cnVlICksCisJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5 LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKKwkJfTsKKwl9LAorCisJb2Zmc2V0UGFy ZW50OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJdmFy IG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07CisKKwkJCXdoaWxl ICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50LCAiaHRt bCIgKSAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIgKSA9PT0gInN0YXRp YyIgKSApIHsKKwkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50Owor CQkJfQorCisJCQlyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07CisJCX0pOworCX0KK30p OworCisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5l YWNoKCB7IHNjcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0 IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkgeworCXZhciB0b3AgPSAicGFnZVlPZmZzZXQi ID09PSBwcm9wOworCisJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CisJ CXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHsKKwkJ CXZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTsKKworCQkJaWYgKCB2YWwgPT09IHVuZGVmaW5l ZCApIHsKKwkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKKwkJ CX0KKworCQkJaWYgKCB3aW4gKSB7CisJCQkJd2luLnNjcm9sbFRvKAorCQkJCQkhdG9wID8gdmFs IDogd2luZG93LnBhZ2VYT2Zmc2V0LAorCQkJCQl0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVlPZmZz ZXQKKwkJCQkpOworCisJCQl9IGVsc2UgeworCQkJCWVsZW1bIG1ldGhvZCBdID0gdmFsOworCQkJ fQorCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOworCX07Cit9KTsK KworLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb24K Ky8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y OTA4NAorLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQg Zm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodAorLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1v ZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9yIGl0IGhl cmUKK2pRdWVyeS5lYWNoKCBbICJ0b3AiLCAibGVmdCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7 CisJalF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQ b3NpdGlvbiwKKwkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJaWYgKCBjb21wdXRl ZCApIHsKKwkJCQljb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOworCQkJCS8vIGlmIGN1 ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAorCQkJCXJldHVybiBy bnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CisJCQkJCWpRdWVyeSggZWxlbSApLnBvc2l0aW9u KClbIHByb3AgXSArICJweCIgOgorCQkJCQljb21wdXRlZDsKKwkJCX0KKwkJfQorCSk7Cit9KTsK KworCisvLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91 dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCB7IEhlaWdodDog ImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgeworCWpR dWVyeS5lYWNoKCB7IHBhZGRpbmc6ICJpbm5lciIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCAiIjog Im91dGVyIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7CisJ CS8vIG1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aAorCQlqUXVlcnku Zm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKKwkJCXZhciBjaGFp bmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJn aW4gIT09ICJib29sZWFuIiApLAorCQkJCWV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2lu ID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApOworCisJ CQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisJ CQkJdmFyIGRvYzsKKworCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisJCQkJ CS8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3Ig TW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJlCisJCQkJCS8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNh biBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjoKKwkJCQkJ Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjQKKwkJCQkJcmV0dXJu IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXTsKKwkJCQl9 CisKKwkJCQkvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0CisJCQkJaWYgKCBlbGVtLm5v ZGVUeXBlID09PSA5ICkgeworCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKKworCQkJ CQkvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0g b3IgY2xpZW50W1dpZHRoL0hlaWdodF0sCisJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAor CQkJCQlyZXR1cm4gTWF0aC5tYXgoCisJCQkJCQllbGVtLmJvZHlbICJzY3JvbGwiICsgbmFtZSBd LCBkb2NbICJzY3JvbGwiICsgbmFtZSBdLAorCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5h bWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKKwkJCQkJCWRvY1sgImNsaWVudCIgKyBuYW1l IF0KKwkJCQkJKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisJ CQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0 IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXQKKwkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0 cmEgKSA6CisKKwkJCQkJLy8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAorCQkJ CQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOworCQkJfSwgdHlwZSwg Y2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTsKKwkJfTsK Kwl9KTsKK30pOworCisKKy8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRo ZSBtYXRjaGVkIGVsZW1lbnQgc2V0CitqUXVlcnkuZm4uc2l6ZSA9IGZ1bmN0aW9uKCkgeworCXJl dHVybiB0aGlzLmxlbmd0aDsKK307CisKK2pRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFk ZEJhY2s7CisKKworCisKKy8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2Ug alF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgorLy8gZmlsZXMgdGhhdCBtYXkg dXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhh dAorLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBz YWZlc3QgYW5kIG1vc3Qgcm9idXN0CisvLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVl cnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCisvLyBkZXJpdmVkIGZyb20g ZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNh c2UKKy8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRo YXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cworLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUg dGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgorCisvLyBOb3RlIHRoYXQgZm9y IG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3Vs ZAorLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQg c2V0dGluZyBhIGdsb2JhbCBpZiBhbgorLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkg aXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKy8vIGh0dHBzOi8v Z2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJh cmllcyN3aWtpLWFub24KKworaWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRl ZmluZS5hbWQgKSB7CisJZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0aW9uKCkgeworCQlyZXR1 cm4galF1ZXJ5OworCX0pOworfQorCisKKworCit2YXIKKwkvLyBNYXAgb3ZlciBqUXVlcnkgaW4g Y2FzZSBvZiBvdmVyd3JpdGUKKwlfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKKworCS8vIE1hcCBv dmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQgPSB3aW5kb3cuJDsKKworalF1ZXJ5 Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKKwlpZiAoIHdpbmRvdy4kID09PSBqUXVl cnkgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisJfQorCisJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVl cnkgPT09IGpRdWVyeSApIHsKKwkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisJfQorCisJcmV0 dXJuIGpRdWVyeTsKK307CisKKy8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2 ZW4gaW4KKy8vIEFNRCAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVy eS9qcXVlcnkvcHVsbC81NTcpCisvLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3Jz ICgjMTM1NjYpCitpZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gc3RydW5kZWZpbmVkICkgeworCXdp bmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKK30KKworCisKKworcmV0dXJuIGpRdWVy eTsKKworfSkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9iZW5jaG1h cmsvZml4dHVyZXMvbG9kYXNoLTIuNC4xLmpzIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9i ZW5jaG1hcmsvZml4dHVyZXMvbG9kYXNoLTIuNC4xLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLmQ2NTNlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9jb250ZXh0 LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9sb2Rhc2gtMi40LjEuanMKQEAgLTAsMCArMSw2 Nzg1IEBACisvKioKKyAqIEBsaWNlbnNlCisgKiBMby1EYXNoIDIuNC4xIChDdXN0b20gQnVpbGQp IDxodHRwOi8vbG9kYXNoLmNvbS8+CisgKiBCdWlsZDogYGxvZGFzaCBtb2Rlcm4gLW8gLi9kaXN0 L2xvZGFzaC5qc2AKKyAqIENvcHlyaWdodCAyMDEyLTIwMTMgVGhlIERvam8gRm91bmRhdGlvbiA8 aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+CisgKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEu NS4yIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgorICogQ29weXJpZ2h0IDIwMDkt MjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVw b3J0ZXJzICYgRWRpdG9ycworICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwOi8v bG9kYXNoLmNvbS9saWNlbnNlPgorICovCis7KGZ1bmN0aW9uKCkgeworCisgIC8qKiBVc2VkIGFz IGEgc2FmZSByZWZlcmVuY2UgZm9yIGB1bmRlZmluZWRgIGluIHByZSBFUzUgZW52aXJvbm1lbnRz ICovCisgIHZhciB1bmRlZmluZWQ7CisKKyAgLyoqIFVzZWQgdG8gcG9vbCBhcnJheXMgYW5kIG9i amVjdHMgdXNlZCBpbnRlcm5hbGx5ICovCisgIHZhciBhcnJheVBvb2wgPSBbXSwKKyAgICAgIG9i amVjdFBvb2wgPSBbXTsKKworICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzICovCisg IHZhciBpZENvdW50ZXIgPSAwOworCisgIC8qKiBVc2VkIHRvIHByZWZpeCBrZXlzIHRvIGF2b2lk IGlzc3VlcyB3aXRoIGBfX3Byb3RvX19gIGFuZCBwcm9wZXJ0aWVzIG9uIGBPYmplY3QucHJvdG90 eXBlYCAqLworICB2YXIga2V5UHJlZml4ID0gK25ldyBEYXRlICsgJyc7CisKKyAgLyoqIFVzZWQg YXMgdGhlIHNpemUgd2hlbiBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkIGZvciBsYXJnZSBhcnJh eXMgKi8KKyAgdmFyIGxhcmdlQXJyYXlTaXplID0gNzU7CisKKyAgLyoqIFVzZWQgYXMgdGhlIG1h eCBzaXplIG9mIHRoZSBgYXJyYXlQb29sYCBhbmQgYG9iamVjdFBvb2xgICovCisgIHZhciBtYXhQ b29sU2l6ZSA9IDQwOworCisgIC8qKiBVc2VkIHRvIGRldGVjdCBhbmQgdGVzdCB3aGl0ZXNwYWNl ICovCisgIHZhciB3aGl0ZXNwYWNlID0gKAorICAgIC8vIHdoaXRlc3BhY2UKKyAgICAnIFx0XHgw QlxmXHhBMFx1ZmVmZicgKworCisgICAgLy8gbGluZSB0ZXJtaW5hdG9ycworICAgICdcblxyXHUy MDI4XHUyMDI5JyArCisKKyAgICAvLyB1bmljb2RlIGNhdGVnb3J5ICJacyIgc3BhY2Ugc2VwYXJh dG9ycworICAgICdcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIw MDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDAnCisgICk7 CisKKyAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVk IHRlbXBsYXRlIHNvdXJjZSAqLworICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXGJfX3Ag XCs9ICcnOy9nLAorICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cYihfX3AgXCs9KSAnJyBc Ky9nLAorICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcKC4qP1wpfFxiX190XCkp IFwrXG4nJzsvZzsKKworICAvKioKKyAgICogVXNlZCB0byBtYXRjaCBFUzYgdGVtcGxhdGUgZGVs aW1pdGVycworICAgKiBodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1k cmFmdC5odG1sI3NlYy1saXRlcmFscy1zdHJpbmctbGl0ZXJhbHMKKyAgICovCisgIHZhciByZUVz VGVtcGxhdGUgPSAvXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7CisKKyAgLyoqIFVz ZWQgdG8gbWF0Y2ggcmVnZXhwIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVz ICovCisgIHZhciByZUZsYWdzID0gL1x3KiQvOworCisgIC8qKiBVc2VkIHRvIGRldGVjdGVkIG5h bWVkIGZ1bmN0aW9ucyAqLworICB2YXIgcmVGdW5jTmFtZSA9IC9eXHMqZnVuY3Rpb25bIFxuXHJc dF0rXHcvOworCisgIC8qKiBVc2VkIHRvIG1hdGNoICJpbnRlcnBvbGF0ZSIgdGVtcGxhdGUgZGVs aW1pdGVycyAqLworICB2YXIgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xzXFNdKz8pJT4vZzsKKwor ICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHplcm9zIHRvIGJlIHJl bW92ZWQgKi8KKyAgdmFyIHJlTGVhZGluZ1NwYWNlc0FuZFplcm9zID0gUmVnRXhwKCdeWycgKyB3 aGl0ZXNwYWNlICsgJ10qMCsoPz0uJCknKTsKKworICAvKiogVXNlZCB0byBlbnN1cmUgY2FwdHVy aW5nIG9yZGVyIG9mIHRlbXBsYXRlIGRlbGltaXRlcnMgKi8KKyAgdmFyIHJlTm9NYXRjaCA9IC8o JF4pLzsKKworICAvKiogVXNlZCB0byBkZXRlY3QgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgdGhp c2AgcmVmZXJlbmNlICovCisgIHZhciByZVRoaXMgPSAvXGJ0aGlzXGIvOworCisgIC8qKiBVc2Vk IHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFs cyAqLworICB2YXIgcmVVbmVzY2FwZWRTdHJpbmcgPSAvWydcblxyXHRcdTIwMjhcdTIwMjlcXF0v ZzsKKworICAvKiogVXNlZCB0byBhc3NpZ24gZGVmYXVsdCBgY29udGV4dGAgb2JqZWN0IHByb3Bl cnRpZXMgKi8KKyAgdmFyIGNvbnRleHRQcm9wcyA9IFsKKyAgICAnQXJyYXknLCAnQm9vbGVhbics ICdEYXRlJywgJ0Z1bmN0aW9uJywgJ01hdGgnLCAnTnVtYmVyJywgJ09iamVjdCcsCisgICAgJ1Jl Z0V4cCcsICdTdHJpbmcnLCAnXycsICdhdHRhY2hFdmVudCcsICdjbGVhclRpbWVvdXQnLCAnaXNG aW5pdGUnLCAnaXNOYU4nLAorICAgICdwYXJzZUludCcsICdzZXRUaW1lb3V0JworICBdOworCisg IC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkg Ki8KKyAgdmFyIHRlbXBsYXRlQ291bnRlciA9IDA7CisKKyAgLyoqIGBPYmplY3QjdG9TdHJpbmdg IHJlc3VsdCBzaG9ydGN1dHMgKi8KKyAgdmFyIGFyZ3NDbGFzcyA9ICdbb2JqZWN0IEFyZ3VtZW50 c10nLAorICAgICAgYXJyYXlDbGFzcyA9ICdbb2JqZWN0IEFycmF5XScsCisgICAgICBib29sQ2xh c3MgPSAnW29iamVjdCBCb29sZWFuXScsCisgICAgICBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRl XScsCisgICAgICBmdW5jQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLAorICAgICAgbnVtYmVy Q2xhc3MgPSAnW29iamVjdCBOdW1iZXJdJywKKyAgICAgIG9iamVjdENsYXNzID0gJ1tvYmplY3Qg T2JqZWN0XScsCisgICAgICByZWdleHBDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nLAorICAgICAg c3RyaW5nQ2xhc3MgPSAnW29iamVjdCBTdHJpbmddJzsKKworICAvKiogVXNlZCB0byBpZGVudGlm eSBvYmplY3QgY2xhc3NpZmljYXRpb25zIHRoYXQgYF8uY2xvbmVgIHN1cHBvcnRzICovCisgIHZh ciBjbG9uZWFibGVDbGFzc2VzID0ge307CisgIGNsb25lYWJsZUNsYXNzZXNbZnVuY0NsYXNzXSA9 IGZhbHNlOworICBjbG9uZWFibGVDbGFzc2VzW2FyZ3NDbGFzc10gPSBjbG9uZWFibGVDbGFzc2Vz W2FycmF5Q2xhc3NdID0KKyAgY2xvbmVhYmxlQ2xhc3Nlc1tib29sQ2xhc3NdID0gY2xvbmVhYmxl Q2xhc3Nlc1tkYXRlQ2xhc3NdID0KKyAgY2xvbmVhYmxlQ2xhc3Nlc1tudW1iZXJDbGFzc10gPSBj bG9uZWFibGVDbGFzc2VzW29iamVjdENsYXNzXSA9CisgIGNsb25lYWJsZUNsYXNzZXNbcmVnZXhw Q2xhc3NdID0gY2xvbmVhYmxlQ2xhc3Nlc1tzdHJpbmdDbGFzc10gPSB0cnVlOworCisgIC8qKiBV c2VkIGFzIGFuIGludGVybmFsIGBfLmRlYm91bmNlYCBvcHRpb25zIG9iamVjdCAqLworICB2YXIg ZGVib3VuY2VPcHRpb25zID0geworICAgICdsZWFkaW5nJzogZmFsc2UsCisgICAgJ21heFdhaXQn OiAwLAorICAgICd0cmFpbGluZyc6IGZhbHNlCisgIH07CisKKyAgLyoqIFVzZWQgYXMgdGhlIHBy b3BlcnR5IGRlc2NyaXB0b3IgZm9yIGBfX2JpbmREYXRhX19gICovCisgIHZhciBkZXNjcmlwdG9y ID0geworICAgICdjb25maWd1cmFibGUnOiBmYWxzZSwKKyAgICAnZW51bWVyYWJsZSc6IGZhbHNl LAorICAgICd2YWx1ZSc6IG51bGwsCisgICAgJ3dyaXRhYmxlJzogZmFsc2UKKyAgfTsKKworICAv KiogVXNlZCB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIGFyZSBvZiB0aGUgbGFuZ3VhZ2UgdHlwZSBP YmplY3QgKi8KKyAgdmFyIG9iamVjdFR5cGVzID0geworICAgICdib29sZWFuJzogZmFsc2UsCisg ICAgJ2Z1bmN0aW9uJzogdHJ1ZSwKKyAgICAnb2JqZWN0JzogdHJ1ZSwKKyAgICAnbnVtYmVyJzog ZmFsc2UsCisgICAgJ3N0cmluZyc6IGZhbHNlLAorICAgICd1bmRlZmluZWQnOiBmYWxzZQorICB9 OworCisgIC8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29t cGlsZWQgc3RyaW5nIGxpdGVyYWxzICovCisgIHZhciBzdHJpbmdFc2NhcGVzID0geworICAgICdc XCc6ICdcXCcsCisgICAgIiciOiAiJyIsCisgICAgJ1xuJzogJ24nLAorICAgICdccic6ICdyJywK KyAgICAnXHQnOiAndCcsCisgICAgJ1x1MjAyOCc6ICd1MjAyOCcsCisgICAgJ1x1MjAyOSc6ICd1 MjAyOScKKyAgfTsKKworICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9i amVjdCAqLworICB2YXIgcm9vdCA9IChvYmplY3RUeXBlc1t0eXBlb2Ygd2luZG93XSAmJiB3aW5k b3cpIHx8IHRoaXM7CisKKyAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYCAqLwor ICB2YXIgZnJlZUV4cG9ydHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgZXhwb3J0c10gJiYgZXhwb3J0 cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzOworCisgIC8qKiBEZXRlY3QgZnJlZSB2 YXJpYWJsZSBgbW9kdWxlYCAqLworICB2YXIgZnJlZU1vZHVsZSA9IG9iamVjdFR5cGVzW3R5cGVv ZiBtb2R1bGVdICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTsKKworICAv KiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNg ICovCisgIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9y dHMgPT09IGZyZWVFeHBvcnRzICYmIGZyZWVFeHBvcnRzOworCisgIC8qKiBEZXRlY3QgZnJlZSB2 YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUgYW5kIHVz ZSBpdCBhcyBgcm9vdGAgKi8KKyAgdmFyIGZyZWVHbG9iYWwgPSBvYmplY3RUeXBlc1t0eXBlb2Yg Z2xvYmFsXSAmJiBnbG9iYWw7CisgIGlmIChmcmVlR2xvYmFsICYmIChmcmVlR2xvYmFsLmdsb2Jh bCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkpIHsK KyAgICByb290ID0gZnJlZUdsb2JhbDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor CisgIC8qKgorICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRo b3V0IHN1cHBvcnQgZm9yIGJpbmFyeSBzZWFyY2hlcworICAgKiBvciBgZnJvbUluZGV4YCBjb25z dHJhaW50cy4KKyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkg VGhlIGFycmF5IHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8g c2VhcmNoIGZvci4KKyAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4 IHRvIHNlYXJjaCBmcm9tLgorICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRl eCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSBvciBgLTFgLgorICAgKi8KKyAgZnVuY3Rpb24gYmFzZUlu ZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHsKKyAgICB2YXIgaW5kZXggPSAoZnJvbUlu ZGV4IHx8IDApIC0gMSwKKyAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAw OworCisgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgIGlmIChhcnJheVtpbmRl eF0gPT09IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgIH0KKyAgICB9Cisg ICAgcmV0dXJuIC0xOworICB9CisKKyAgLyoqCisgICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBf LmNvbnRhaW5zYCBmb3IgY2FjaGUgb2JqZWN0cyB0aGF0IG1pbWljcyB0aGUgcmV0dXJuCisgICAq IHNpZ25hdHVyZSBvZiBgXy5pbmRleE9mYCBieSByZXR1cm5pbmcgYDBgIGlmIHRoZSB2YWx1ZSBp cyBmb3VuZCwgZWxzZSBgLTFgLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge09i amVjdH0gY2FjaGUgVGhlIGNhY2hlIG9iamVjdCB0byBpbnNwZWN0LgorICAgKiBAcGFyYW0geyp9 IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgKiBAcmV0dXJucyB7bnVtYmVyfSBS ZXR1cm5zIGAwYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGAtMWAuCisgICAqLworICBmdW5j dGlvbiBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSB7CisgICAgdmFyIHR5cGUgPSB0eXBlb2Yg dmFsdWU7CisgICAgY2FjaGUgPSBjYWNoZS5jYWNoZTsKKworICAgIGlmICh0eXBlID09ICdib29s ZWFuJyB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gY2FjaGVbdmFsdWVdID8gMCA6 IC0xOworICAgIH0KKyAgICBpZiAodHlwZSAhPSAnbnVtYmVyJyAmJiB0eXBlICE9ICdzdHJpbmcn KSB7CisgICAgICB0eXBlID0gJ29iamVjdCc7CisgICAgfQorICAgIHZhciBrZXkgPSB0eXBlID09 ICdudW1iZXInID8gdmFsdWUgOiBrZXlQcmVmaXggKyB2YWx1ZTsKKyAgICBjYWNoZSA9IChjYWNo ZSA9IGNhY2hlW3R5cGVdKSAmJiBjYWNoZVtrZXldOworCisgICAgcmV0dXJuIHR5cGUgPT0gJ29i amVjdCcKKyAgICAgID8gKGNhY2hlICYmIGJhc2VJbmRleE9mKGNhY2hlLCB2YWx1ZSkgPiAtMSA/ IDAgOiAtMSkKKyAgICAgIDogKGNhY2hlID8gMCA6IC0xKTsKKyAgfQorCisgIC8qKgorICAgKiBB ZGRzIGEgZ2l2ZW4gdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgb2JqZWN0LgorICAg KgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQg dG8gdGhlIGNhY2hlLgorICAgKi8KKyAgZnVuY3Rpb24gY2FjaGVQdXNoKHZhbHVlKSB7CisgICAg dmFyIGNhY2hlID0gdGhpcy5jYWNoZSwKKyAgICAgICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKwor ICAgIGlmICh0eXBlID09ICdib29sZWFuJyB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICBjYWNo ZVt2YWx1ZV0gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZSAhPSAnbnVtYmVy JyAmJiB0eXBlICE9ICdzdHJpbmcnKSB7CisgICAgICAgIHR5cGUgPSAnb2JqZWN0JzsKKyAgICAg IH0KKyAgICAgIHZhciBrZXkgPSB0eXBlID09ICdudW1iZXInID8gdmFsdWUgOiBrZXlQcmVmaXgg KyB2YWx1ZSwKKyAgICAgICAgICB0eXBlQ2FjaGUgPSBjYWNoZVt0eXBlXSB8fCAoY2FjaGVbdHlw ZV0gPSB7fSk7CisKKyAgICAgIGlmICh0eXBlID09ICdvYmplY3QnKSB7CisgICAgICAgICh0eXBl Q2FjaGVba2V5XSB8fCAodHlwZUNhY2hlW2tleV0gPSBbXSkpLnB1c2godmFsdWUpOworICAgICAg fSBlbHNlIHsKKyAgICAgICAgdHlwZUNhY2hlW2tleV0gPSB0cnVlOworICAgICAgfQorICAgIH0K KyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IGBfLm1heGAgYW5kIGBfLm1pbmAgYXMgdGhlIGRl ZmF1bHQgY2FsbGJhY2sgd2hlbiBhIGdpdmVuCisgICAqIGNvbGxlY3Rpb24gaXMgYSBzdHJpbmcg dmFsdWUuCisgICAqCisgICAqIEBwcml2YXRlCisgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBU aGUgY2hhcmFjdGVyIHRvIGluc3BlY3QuCisgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMg dGhlIGNvZGUgdW5pdCBvZiBnaXZlbiBjaGFyYWN0ZXIuCisgICAqLworICBmdW5jdGlvbiBjaGFy QXRDYWxsYmFjayh2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS5jaGFyQ29kZUF0KDApOworICB9 CisKKyAgLyoqCisgICAqIFVzZWQgYnkgYHNvcnRCeWAgdG8gY29tcGFyZSB0cmFuc2Zvcm1lZCBg Y29sbGVjdGlvbmAgZWxlbWVudHMsIHN0YWJsZSBzb3J0aW5nCisgICAqIHRoZW0gaW4gYXNjZW5k aW5nIG9yZGVyLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge09iamVjdH0gYSBU aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8gYGJgLgorICAgKiBAcGFyYW0ge09iamVjdH0gYiBUaGUg b2JqZWN0IHRvIGNvbXBhcmUgdG8gYGFgLgorICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5z IHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBvZiBgMWAgb3IgYC0xYC4KKyAgICovCisgIGZ1bmN0 aW9uIGNvbXBhcmVBc2NlbmRpbmcoYSwgYikgeworICAgIHZhciBhYyA9IGEuY3JpdGVyaWEsCisg ICAgICAgIGJjID0gYi5jcml0ZXJpYSwKKyAgICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgbGVu Z3RoID0gYWMubGVuZ3RoOworCisgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAg IHZhciB2YWx1ZSA9IGFjW2luZGV4XSwKKyAgICAgICAgICBvdGhlciA9IGJjW2luZGV4XTsKKwor ICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikgeworICAgICAgICBpZiAodmFsdWUgPiBvdGhlciB8 fCB0eXBlb2YgdmFsdWUgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAg ICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPCBvdGhlciB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3Vu ZGVmaW5lZCcpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAg ICB9CisgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVt YmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9ucworICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRl ciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IKKyAg ICAvLyBgYWAgYW5kIGBiYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJz Y29yZS9wdWxsLzEyNDcKKyAgICAvLworICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxl IHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuCisgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdv b2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwCisgICAgcmV0dXJuIGEuaW5kZXggLSBi LmluZGV4OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBjYWNoZSBvYmplY3QgdG8gb3B0 aW1pemUgbGluZWFyIHNlYXJjaGVzIG9mIGxhcmdlIGFycmF5cy4KKyAgICoKKyAgICogQHByaXZh dGUKKyAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gc2VhcmNoLgor ICAgKiBAcmV0dXJucyB7bnVsbHxPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIG9iamVjdCBvciBg bnVsbGAgaWYgY2FjaGluZyBzaG91bGQgbm90IGJlIHVzZWQuCisgICAqLworICBmdW5jdGlvbiBj cmVhdGVDYWNoZShhcnJheSkgeworICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICBsZW5ndGgg PSBhcnJheS5sZW5ndGgsCisgICAgICAgIGZpcnN0ID0gYXJyYXlbMF0sCisgICAgICAgIG1pZCA9 IGFycmF5WyhsZW5ndGggLyAyKSB8IDBdLAorICAgICAgICBsYXN0ID0gYXJyYXlbbGVuZ3RoIC0g MV07CisKKyAgICBpZiAoZmlyc3QgJiYgdHlwZW9mIGZpcnN0ID09ICdvYmplY3QnICYmCisgICAg ICAgIG1pZCAmJiB0eXBlb2YgbWlkID09ICdvYmplY3QnICYmIGxhc3QgJiYgdHlwZW9mIGxhc3Qg PT0gJ29iamVjdCcpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFyIGNhY2hl ID0gZ2V0T2JqZWN0KCk7CisgICAgY2FjaGVbJ2ZhbHNlJ10gPSBjYWNoZVsnbnVsbCddID0gY2Fj aGVbJ3RydWUnXSA9IGNhY2hlWyd1bmRlZmluZWQnXSA9IGZhbHNlOworCisgICAgdmFyIHJlc3Vs dCA9IGdldE9iamVjdCgpOworICAgIHJlc3VsdC5hcnJheSA9IGFycmF5OworICAgIHJlc3VsdC5j YWNoZSA9IGNhY2hlOworICAgIHJlc3VsdC5wdXNoID0gY2FjaGVQdXNoOworCisgICAgd2hpbGUg KCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2luZGV4XSk7Cisg ICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogVXNlZCBieSBgdGVt cGxhdGVgIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQKKyAg ICogc3RyaW5nIGxpdGVyYWxzLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge3N0 cmluZ30gbWF0Y2ggVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS4KKyAgICogQHJldHVy bnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCisgICAqLworICBmdW5j dGlvbiBlc2NhcGVTdHJpbmdDaGFyKG1hdGNoKSB7CisgICAgcmV0dXJuICdcXCcgKyBzdHJpbmdF c2NhcGVzW21hdGNoXTsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGFuIGFycmF5IGZyb20gdGhl IGFycmF5IHBvb2wgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgdGhlIHBvb2wgaXMgZW1wdHkuCisg ICAqCisgICAqIEBwcml2YXRlCisgICAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGFycmF5IGZyb20g dGhlIHBvb2wuCisgICAqLworICBmdW5jdGlvbiBnZXRBcnJheSgpIHsKKyAgICByZXR1cm4gYXJy YXlQb29sLnBvcCgpIHx8IFtdOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYW4gb2JqZWN0IGZy b20gdGhlIG9iamVjdCBwb29sIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIHRoZSBwb29sIGlzIGVt cHR5LgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgb2Jq ZWN0IGZyb20gdGhlIHBvb2wuCisgICAqLworICBmdW5jdGlvbiBnZXRPYmplY3QoKSB7CisgICAg cmV0dXJuIG9iamVjdFBvb2wucG9wKCkgfHwgeworICAgICAgJ2FycmF5JzogbnVsbCwKKyAgICAg ICdjYWNoZSc6IG51bGwsCisgICAgICAnY3JpdGVyaWEnOiBudWxsLAorICAgICAgJ2ZhbHNlJzog ZmFsc2UsCisgICAgICAnaW5kZXgnOiAwLAorICAgICAgJ251bGwnOiBmYWxzZSwKKyAgICAgICdu dW1iZXInOiBudWxsLAorICAgICAgJ29iamVjdCc6IG51bGwsCisgICAgICAncHVzaCc6IG51bGws CisgICAgICAnc3RyaW5nJzogbnVsbCwKKyAgICAgICd0cnVlJzogZmFsc2UsCisgICAgICAndW5k ZWZpbmVkJzogZmFsc2UsCisgICAgICAndmFsdWUnOiBudWxsCisgICAgfTsKKyAgfQorCisgIC8q KgorICAgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gYXJyYXkgYmFjayB0byB0aGUgYXJyYXkgcG9vbC4K KyAgICoKKyAgICogQHByaXZhdGUKKyAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJy YXkgdG8gcmVsZWFzZS4KKyAgICovCisgIGZ1bmN0aW9uIHJlbGVhc2VBcnJheShhcnJheSkgewor ICAgIGFycmF5Lmxlbmd0aCA9IDA7CisgICAgaWYgKGFycmF5UG9vbC5sZW5ndGggPCBtYXhQb29s U2l6ZSkgeworICAgICAgYXJyYXlQb29sLnB1c2goYXJyYXkpOworICAgIH0KKyAgfQorCisgIC8q KgorICAgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gb2JqZWN0IGJhY2sgdG8gdGhlIG9iamVjdCBwb29s LgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhl IG9iamVjdCB0byByZWxlYXNlLgorICAgKi8KKyAgZnVuY3Rpb24gcmVsZWFzZU9iamVjdChvYmpl Y3QpIHsKKyAgICB2YXIgY2FjaGUgPSBvYmplY3QuY2FjaGU7CisgICAgaWYgKGNhY2hlKSB7Cisg ICAgICByZWxlYXNlT2JqZWN0KGNhY2hlKTsKKyAgICB9CisgICAgb2JqZWN0LmFycmF5ID0gb2Jq ZWN0LmNhY2hlID0gb2JqZWN0LmNyaXRlcmlhID0gb2JqZWN0Lm9iamVjdCA9IG9iamVjdC5udW1i ZXIgPSBvYmplY3Quc3RyaW5nID0gb2JqZWN0LnZhbHVlID0gbnVsbDsKKyAgICBpZiAob2JqZWN0 UG9vbC5sZW5ndGggPCBtYXhQb29sU2l6ZSkgeworICAgICAgb2JqZWN0UG9vbC5wdXNoKG9iamVj dCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNsaWNlcyB0aGUgYGNvbGxlY3Rpb25gIGZy b20gdGhlIGBzdGFydGAgaW5kZXggdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLAorICAgKiB0aGUg YGVuZGAgaW5kZXguCisgICAqCisgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0 ZWFkIG9mIGBBcnJheSNzbGljZWAgdG8gc3VwcG9ydCBub2RlIGxpc3RzCisgICAqIGluIElFIDwg OSBhbmQgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmUgcmV0dXJuZWQuCisgICAqCisgICAqIEBw cml2YXRlCisgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUg Y29sbGVjdGlvbiB0byBzbGljZS4KKyAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFy dCBpbmRleC4KKyAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIGluZGV4LgorICAgKiBA cmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheS4KKyAgICovCisgIGZ1bmN0aW9u IHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7CisgICAgc3RhcnQgfHwgKHN0YXJ0ID0gMCk7Cisg ICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIGVuZCA9IGFycmF5ID8g YXJyYXkubGVuZ3RoIDogMDsKKyAgICB9CisgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgIGxl bmd0aCA9IGVuZCAtIHN0YXJ0IHx8IDAsCisgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCA8 IDAgPyAwIDogbGVuZ3RoKTsKKworICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAg ICByZXN1bHRbaW5kZXhdID0gYXJyYXlbc3RhcnQgKyBpbmRleF07CisgICAgfQorICAgIHJldHVy biByZXN1bHQ7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAvKioKKyAgICog Q3JlYXRlIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjb250ZXh0IG9i amVjdC4KKyAgICoKKyAgICogQHN0YXRpYworICAgKiBAbWVtYmVyT2YgXworICAgKiBAY2F0ZWdv cnkgVXRpbGl0aWVzCisgICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29u dGV4dCBvYmplY3QuCisgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFz aGAgZnVuY3Rpb24uCisgICAqLworICBmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkgewor ICAgIC8vIEF2b2lkIGlzc3VlcyB3aXRoIHNvbWUgRVMzIGVudmlyb25tZW50cyB0aGF0IGF0dGVt cHQgdG8gdXNlIHZhbHVlcywgbmFtZWQKKyAgICAvLyBhZnRlciBidWlsdC1pbiBjb25zdHJ1Y3Rv cnMgbGlrZSBgT2JqZWN0YCwgZm9yIHRoZSBjcmVhdGlvbiBvZiBsaXRlcmFscy4KKyAgICAvLyBF UzUgY2xlYXJzIHRoaXMgdXAgYnkgc3RhdGluZyB0aGF0IGxpdGVyYWxzIG11c3QgdXNlIGJ1aWx0 LWluIGNvbnN0cnVjdG9ycy4KKyAgICAvLyBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3gxMS4x LjUuCisgICAgY29udGV4dCA9IGNvbnRleHQgPyBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNv bnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKSA6IHJvb3Q7CisKKyAgICAvKiogTmF0 aXZlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMgKi8KKyAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFy cmF5LAorICAgICAgICBCb29sZWFuID0gY29udGV4dC5Cb29sZWFuLAorICAgICAgICBEYXRlID0g Y29udGV4dC5EYXRlLAorICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sCisgICAg ICAgIE1hdGggPSBjb250ZXh0Lk1hdGgsCisgICAgICAgIE51bWJlciA9IGNvbnRleHQuTnVtYmVy LAorICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCwKKyAgICAgICAgUmVnRXhwID0gY29u dGV4dC5SZWdFeHAsCisgICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLAorICAgICAgICBU eXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjsKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9y IGBBcnJheWAgbWV0aG9kIHJlZmVyZW5jZXMuCisgICAgICoKKyAgICAgKiBOb3JtYWxseSBgQXJy YXkucHJvdG90eXBlYCB3b3VsZCBzdWZmaWNlLCBob3dldmVyLCB1c2luZyBhbiBhcnJheSBsaXRl cmFsCisgICAgICogYXZvaWRzIGlzc3VlcyBpbiBOYXJ3aGFsLgorICAgICAqLworICAgIHZhciBh cnJheVJlZiA9IFtdOworCisgICAgLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNl cyAqLworICAgIHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CisKKyAgICAvKiog VXNlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBgX2AgcmVmZXJlbmNlIGluIGBub0NvbmZsaWN0 YCAqLworICAgIHZhciBvbGREYXNoID0gY29udGV4dC5fOworCisgICAgLyoqIFVzZWQgdG8gcmVz b2x2ZSB0aGUgaW50ZXJuYWwgW1tDbGFzc11dIG9mIHZhbHVlcyAqLworICAgIHZhciB0b1N0cmlu ZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOworCisgICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEg bWV0aG9kIGlzIG5hdGl2ZSAqLworICAgIHZhciByZU5hdGl2ZSA9IFJlZ0V4cCgnXicgKworICAg ICAgU3RyaW5nKHRvU3RyaW5nKQorICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxd L2csICdcXCQmJykKKyAgICAgICAgLnJlcGxhY2UoL3RvU3RyaW5nfCBmb3IgW15cXV0rL2csICcu Kj8nKSArICckJworICAgICk7CisKKyAgICAvKiogTmF0aXZlIG1ldGhvZCBzaG9ydGN1dHMgKi8K KyAgICB2YXIgY2VpbCA9IE1hdGguY2VpbCwKKyAgICAgICAgY2xlYXJUaW1lb3V0ID0gY29udGV4 dC5jbGVhclRpbWVvdXQsCisgICAgICAgIGZsb29yID0gTWF0aC5mbG9vciwKKyAgICAgICAgZm5U b1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKKyAgICAgICAgZ2V0UHJvdG90 eXBlT2YgPSBpc05hdGl2ZShnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZikg JiYgZ2V0UHJvdG90eXBlT2YsCisgICAgICAgIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8u aGFzT3duUHJvcGVydHksCisgICAgICAgIHB1c2ggPSBhcnJheVJlZi5wdXNoLAorICAgICAgICBz ZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0LAorICAgICAgICBzcGxpY2UgPSBhcnJheVJl Zi5zcGxpY2UsCisgICAgICAgIHVuc2hpZnQgPSBhcnJheVJlZi51bnNoaWZ0OworCisgICAgLyoq IFVzZWQgdG8gc2V0IG1ldGEgZGF0YSBvbiBmdW5jdGlvbnMgKi8KKyAgICB2YXIgZGVmaW5lUHJv cGVydHkgPSAoZnVuY3Rpb24oKSB7CisgICAgICAvLyBJRSA4IG9ubHkgYWNjZXB0cyBET00gZWxl bWVudHMKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBvID0ge30sCisgICAgICAgICAgICBmdW5j ID0gaXNOYXRpdmUoZnVuYyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgJiYgZnVuYywKKyAgICAg ICAgICAgIHJlc3VsdCA9IGZ1bmMobywgbywgbykgJiYgZnVuYzsKKyAgICAgIH0gY2F0Y2goZSkg eyB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0oKSk7CisKKyAgICAvKiBOYXRpdmUgbWV0 aG9kIHNob3J0Y3V0cyBmb3IgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxv ZGFzaGAgbWV0aG9kcyAqLworICAgIHZhciBuYXRpdmVDcmVhdGUgPSBpc05hdGl2ZShuYXRpdmVD cmVhdGUgPSBPYmplY3QuY3JlYXRlKSAmJiBuYXRpdmVDcmVhdGUsCisgICAgICAgIG5hdGl2ZUlz QXJyYXkgPSBpc05hdGl2ZShuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheSkgJiYgbmF0aXZl SXNBcnJheSwKKyAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLAorICAg ICAgICBuYXRpdmVJc05hTiA9IGNvbnRleHQuaXNOYU4sCisgICAgICAgIG5hdGl2ZUtleXMgPSBp c05hdGl2ZShuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMpICYmIG5hdGl2ZUtleXMsCisgICAgICAg IG5hdGl2ZU1heCA9IE1hdGgubWF4LAorICAgICAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbiwKKyAg ICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LAorICAgICAgICBuYXRpdmVS YW5kb20gPSBNYXRoLnJhbmRvbTsKKworICAgIC8qKiBVc2VkIHRvIGxvb2t1cCBhIGJ1aWx0LWlu IGNvbnN0cnVjdG9yIGJ5IFtbQ2xhc3NdXSAqLworICAgIHZhciBjdG9yQnlDbGFzcyA9IHt9Owor ICAgIGN0b3JCeUNsYXNzW2FycmF5Q2xhc3NdID0gQXJyYXk7CisgICAgY3RvckJ5Q2xhc3NbYm9v bENsYXNzXSA9IEJvb2xlYW47CisgICAgY3RvckJ5Q2xhc3NbZGF0ZUNsYXNzXSA9IERhdGU7Cisg ICAgY3RvckJ5Q2xhc3NbZnVuY0NsYXNzXSA9IEZ1bmN0aW9uOworICAgIGN0b3JCeUNsYXNzW29i amVjdENsYXNzXSA9IE9iamVjdDsKKyAgICBjdG9yQnlDbGFzc1tudW1iZXJDbGFzc10gPSBOdW1i ZXI7CisgICAgY3RvckJ5Q2xhc3NbcmVnZXhwQ2xhc3NdID0gUmVnRXhwOworICAgIGN0b3JCeUNs YXNzW3N0cmluZ0NsYXNzXSA9IFN0cmluZzsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyB0 aGUgZ2l2ZW4gdmFsdWUgdG8gZW5hYmxlIGludHVpdGl2ZQorICAgICAqIG1ldGhvZCBjaGFpbmlu Zy4KKyAgICAgKgorICAgICAqIEluIGFkZGl0aW9uIHRvIExvLURhc2ggbWV0aG9kcywgd3JhcHBl cnMgYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgYEFycmF5YCBtZXRob2RzOgorICAgICAqIGBjb25j YXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGByZXZlcnNlYCwgYHNoaWZ0YCwgYHNsaWNlYCwg YHNvcnRgLCBgc3BsaWNlYCwKKyAgICAgKiBhbmQgYHVuc2hpZnRgCisgICAgICoKKyAgICAgKiBD aGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgdmFs dWVgIG1ldGhvZCBpcworICAgICAqIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBpbmNsdWRlZCBp biB0aGUgYnVpbGQuCisgICAgICoKKyAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgZnVuY3Rp b25zIGFyZToKKyAgICAgKiBgYWZ0ZXJgLCBgYXNzaWduYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBi aW5kS2V5YCwgYGNoYWluYCwgYGNvbXBhY3RgLAorICAgICAqIGBjb21wb3NlYCwgYGNvbmNhdGAs IGBjb3VudEJ5YCwgYGNyZWF0ZWAsIGBjcmVhdGVDYWxsYmFja2AsIGBjdXJyeWAsCisgICAgICog YGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmVyYCwgYGRlbGF5YCwgYGRpZmZlcmVuY2VgLCBg ZmlsdGVyYCwgYGZsYXR0ZW5gLAorICAgICAqIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsIGBm b3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsCisgICAgICogYGZ1 bmN0aW9uc2AsIGBncm91cEJ5YCwgYGluZGV4QnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25g LCBgaW52ZXJ0YCwKKyAgICAgKiBgaW52b2tlYCwgYGtleXNgLCBgbWFwYCwgYG1heGAsIGBtZW1v aXplYCwgYG1lcmdlYCwgYG1pbmAsIGBvYmplY3RgLCBgb21pdGAsCisgICAgICogYG9uY2VgLCBg cGFpcnNgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGlja2AsIGBwbHVja2AsIGBwdWxs YCwgYHB1c2hgLAorICAgICAqIGByYW5nZWAsIGByZWplY3RgLCBgcmVtb3ZlYCwgYHJlc3RgLCBg cmV2ZXJzZWAsIGBzaHVmZmxlYCwgYHNsaWNlYCwgYHNvcnRgLAorICAgICAqIGBzb3J0QnlgLCBg c3BsaWNlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aW1lc2AsIGB0b0FycmF5YCwgYHRyYW5zZm9y bWAsCisgICAgICogYHVuaW9uYCwgYHVuaXFgLCBgdW5zaGlmdGAsIGB1bnppcGAsIGB2YWx1ZXNg LCBgd2hlcmVgLCBgd2l0aG91dGAsIGB3cmFwYCwKKyAgICAgKiBhbmQgYHppcGAKKyAgICAgKgor ICAgICAqIFRoZSBub24tY2hhaW5hYmxlIHdyYXBwZXIgZnVuY3Rpb25zIGFyZToKKyAgICAgKiBg Y2xvbmVgLCBgY2xvbmVEZWVwYCwgYGNvbnRhaW5zYCwgYGVzY2FwZWAsIGBldmVyeWAsIGBmaW5k YCwgYGZpbmRJbmRleGAsCisgICAgICogYGZpbmRLZXlgLCBgZmluZExhc3RgLCBgZmluZExhc3RJ bmRleGAsIGBmaW5kTGFzdEtleWAsIGBoYXNgLCBgaWRlbnRpdHlgLAorICAgICAqIGBpbmRleE9m YCwgYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNCb29sZWFuYCwgYGlzRGF0ZWAsIGBpc0Vs ZW1lbnRgLAorICAgICAqIGBpc0VtcHR5YCwgYGlzRXF1YWxgLCBgaXNGaW5pdGVgLCBgaXNGdW5j dGlvbmAsIGBpc05hTmAsIGBpc051bGxgLCBgaXNOdW1iZXJgLAorICAgICAqIGBpc09iamVjdGAs IGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwg YGpvaW5gLAorICAgICAqIGBsYXN0SW5kZXhPZmAsIGBtaXhpbmAsIGBub0NvbmZsaWN0YCwgYHBh cnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwKKyAgICAgKiBgcmVkdWNlUmlnaHRg LCBgcmVzdWx0YCwgYHNoaWZ0YCwgYHNpemVgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBydW5J bkNvbnRleHRgLAorICAgICAqIGB0ZW1wbGF0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGFu ZCBgdmFsdWVgCisgICAgICoKKyAgICAgKiBUaGUgd3JhcHBlciBmdW5jdGlvbnMgYGZpcnN0YCBh bmQgYGxhc3RgIHJldHVybiB3cmFwcGVkIHZhbHVlcyB3aGVuIGBuYCBpcworICAgICAqIHByb3Zp ZGVkLCBvdGhlcndpc2UgdGhleSByZXR1cm4gdW53cmFwcGVkIHZhbHVlcy4KKyAgICAgKgorICAg ICAqIEV4cGxpY2l0IGNoYWluaW5nIGNhbiBiZSBlbmFibGVkIGJ5IHVzaW5nIHRoZSBgXy5jaGFp bmAgbWV0aG9kLgorICAgICAqCisgICAgICogQG5hbWUgXworICAgICAqIEBjb25zdHJ1Y3Rvcgor ICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZh bHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJucyB7T2Jq ZWN0fSBSZXR1cm5zIGEgYGxvZGFzaGAgaW5zdGFuY2UuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pOworICAgICAqCisgICAgICogLy8g cmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUKKyAgICAgKiB3cmFwcGVkLnJlZHVjZShmdW5jdGlv bihzdW0sIG51bSkgeworICAgICAqICAgcmV0dXJuIHN1bSArIG51bTsKKyAgICAgKiB9KTsKKyAg ICAgKiAvLyA9PiA2CisgICAgICoKKyAgICAgKiAvLyByZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZQor ICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoZnVuY3Rpb24obnVtKSB7CisgICAgICog ICByZXR1cm4gbnVtICogbnVtOworICAgICAqIH0pOworICAgICAqCisgICAgICogXy5pc0FycmF5 KHNxdWFyZXMpOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmlzQXJyYXko c3F1YXJlcy52YWx1ZSgpKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rp b24gbG9kYXNoKHZhbHVlKSB7CisgICAgICAvLyBkb24ndCB3cmFwIGlmIGFscmVhZHkgd3JhcHBl ZCwgZXZlbiBpZiB3cmFwcGVkIGJ5IGEgZGlmZmVyZW50IGBsb2Rhc2hgIGNvbnN0cnVjdG9yCisg ICAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiAhaXNBcnJh eSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpCisg ICAgICAgPyB2YWx1ZQorICAgICAgIDogbmV3IGxvZGFzaFdyYXBwZXIodmFsdWUpOworICAgIH0K KworICAgIC8qKgorICAgICAqIEEgZmFzdCBwYXRoIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFw cGVyIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7Kn0g dmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS4KKyAgICAgKiBA cGFyYW0ge2Jvb2xlYW59IGNoYWluQWxsIEEgZmxhZyB0byBlbmFibGUgY2hhaW5pbmcgZm9yIGFs bCBtZXRob2RzCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIGBsb2Rhc2hgIGlu c3RhbmNlLgorICAgICAqLworICAgIGZ1bmN0aW9uIGxvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWlu QWxsKSB7CisgICAgICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7CisgICAgICB0aGlzLl9f d3JhcHBlZF9fID0gdmFsdWU7CisgICAgfQorICAgIC8vIGVuc3VyZSBgbmV3IGxvZGFzaFdyYXBw ZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBsb2Rhc2hgCisgICAgbG9kYXNoV3JhcHBlci5wcm90b3R5 cGUgPSBsb2Rhc2gucHJvdG90eXBlOworCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHVzZWQg dG8gZmxhZyBlbnZpcm9ubWVudHMgZmVhdHVyZXMuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisg ICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAdHlwZSBPYmplY3QKKyAgICAgKi8KKyAgICB2YXIg c3VwcG9ydCA9IGxvZGFzaC5zdXBwb3J0ID0ge307CisKKyAgICAvKioKKyAgICAgKiBEZXRlY3Qg aWYgZnVuY3Rpb25zIGNhbiBiZSBkZWNvbXBpbGVkIGJ5IGBGdW5jdGlvbiN0b1N0cmluZ2AKKyAg ICAgKiAoYWxsIGJ1dCBQUzMgYW5kIG9sZGVyIE9wZXJhIG1vYmlsZSBicm93c2VycyAmIGF2b2lk ZWQgaW4gV2luZG93cyA4IGFwcHMpLgorICAgICAqCisgICAgICogQG1lbWJlck9mIF8uc3VwcG9y dAorICAgICAqIEB0eXBlIGJvb2xlYW4KKyAgICAgKi8KKyAgICBzdXBwb3J0LmZ1bmNEZWNvbXAg PSAhaXNOYXRpdmUoY29udGV4dC5XaW5SVEVycm9yKSAmJiByZVRoaXMudGVzdChydW5JbkNvbnRl eHQpOworCisgICAgLyoqCisgICAgICogRGV0ZWN0IGlmIGBGdW5jdGlvbiNuYW1lYCBpcyBzdXBw b3J0ZWQgKGFsbCBidXQgSUUpLgorICAgICAqCisgICAgICogQG1lbWJlck9mIF8uc3VwcG9ydAor ICAgICAqIEB0eXBlIGJvb2xlYW4KKyAgICAgKi8KKyAgICBzdXBwb3J0LmZ1bmNOYW1lcyA9IHR5 cGVvZiBGdW5jdGlvbi5uYW1lID09ICdzdHJpbmcnOworCisgICAgLyoqCisgICAgICogQnkgZGVm YXVsdCwgdGhlIHRlbXBsYXRlIGRlbGltaXRlcnMgdXNlZCBieSBMby1EYXNoIGFyZSBzaW1pbGFy IHRvIHRob3NlIGluCisgICAgICogZW1iZWRkZWQgUnVieSAoRVJCKS4gQ2hhbmdlIHRoZSBmb2xs b3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlCisgICAgICogZGVsaW1p dGVycy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAq IEB0eXBlIE9iamVjdAorICAgICAqLworICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0gewor CisgICAgICAvKioKKyAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1 ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLgorICAgICAgICoKKyAgICAgICAqIEBtZW1iZXJPZiBfLnRl bXBsYXRlU2V0dGluZ3MKKyAgICAgICAqIEB0eXBlIFJlZ0V4cAorICAgICAgICovCisgICAgICAn ZXNjYXBlJzogLzwlLShbXHNcU10rPyklPi9nLAorCisgICAgICAvKioKKyAgICAgICAqIFVzZWQg dG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLgorICAgICAgICoKKyAgICAgICAqIEBtZW1i ZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKKyAgICAgICAqIEB0eXBlIFJlZ0V4cAorICAgICAgICov CisgICAgICAnZXZhbHVhdGUnOiAvPCUoW1xzXFNdKz8pJT4vZywKKworICAgICAgLyoqCisgICAg ICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC4KKyAg ICAgICAqCisgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCisgICAgICAgKiBA dHlwZSBSZWdFeHAKKyAgICAgICAqLworICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0 ZSwKKworICAgICAgLyoqCisgICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmpl Y3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuCisgICAgICAgKgorICAgICAgICogQG1lbWJlck9mIF8u dGVtcGxhdGVTZXR0aW5ncworICAgICAgICogQHR5cGUgc3RyaW5nCisgICAgICAgKi8KKyAgICAg ICd2YXJpYWJsZSc6ICcnLAorCisgICAgICAvKioKKyAgICAgICAqIFVzZWQgdG8gaW1wb3J0IHZh cmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBA bWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCisgICAgICAgKiBAdHlwZSBPYmplY3QKKyAgICAg ICAqLworICAgICAgJ2ltcG9ydHMnOiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgcmVm ZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICog QG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzCisgICAgICAgICAqIEB0eXBlIEZ1 bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAnXyc6IGxvZGFzaAorICAgICAgfQorICAgIH07 CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNl IGltcGxlbWVudGF0aW9uIG9mIGBfLmJpbmRgIHRoYXQgY3JlYXRlcyB0aGUgYm91bmQgZnVuY3Rp b24gYW5kCisgICAgICogc2V0cyBpdHMgbWV0YSBkYXRhLgorICAgICAqCisgICAgICogQHByaXZh dGUKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBiaW5kRGF0YSBUaGUgYmluZCBkYXRhIGFycmF5Lgor ICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9u LgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VCaW5kKGJpbmREYXRhKSB7CisgICAgICB2YXIg ZnVuYyA9IGJpbmREYXRhWzBdLAorICAgICAgICAgIHBhcnRpYWxBcmdzID0gYmluZERhdGFbMl0s CisgICAgICAgICAgdGhpc0FyZyA9IGJpbmREYXRhWzRdOworCisgICAgICBmdW5jdGlvbiBib3Vu ZCgpIHsKKyAgICAgICAgLy8gYEZ1bmN0aW9uI2JpbmRgIHNwZWMKKyAgICAgICAgLy8gaHR0cDov L2VzNS5naXRodWIuaW8vI3gxNS4zLjQuNQorICAgICAgICBpZiAocGFydGlhbEFyZ3MpIHsKKyAg ICAgICAgICAvLyBhdm9pZCBgYXJndW1lbnRzYCBvYmplY3QgZGVvcHRpbWl6YXRpb25zIGJ5IHVz aW5nIGBzbGljZWAgaW5zdGVhZAorICAgICAgICAgIC8vIG9mIGBBcnJheS5wcm90b3R5cGUuc2xp Y2UuY2FsbGAgYW5kIG5vdCBhc3NpZ25pbmcgYGFyZ3VtZW50c2AgdG8gYQorICAgICAgICAgIC8v IHZhcmlhYmxlIGFzIGEgdGVybmFyeSBleHByZXNzaW9uCisgICAgICAgICAgdmFyIGFyZ3MgPSBz bGljZShwYXJ0aWFsQXJncyk7CisgICAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMp OworICAgICAgICB9CisgICAgICAgIC8vIG1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5g IGJlaGF2aW9yCisgICAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yCisgICAg ICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHsKKyAgICAgICAgICAvLyBlbnN1cmUgYG5l dyBib3VuZGAgaXMgYW4gaW5zdGFuY2Ugb2YgYGZ1bmNgCisgICAgICAgICAgdmFyIHRoaXNCaW5k aW5nID0gYmFzZUNyZWF0ZShmdW5jLnByb3RvdHlwZSksCisgICAgICAgICAgICAgIHJlc3VsdCA9 IGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MgfHwgYXJndW1lbnRzKTsKKyAgICAgICAgICBy ZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nOworICAgICAgICB9 CisgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MgfHwgYXJndW1lbnRzKTsK KyAgICAgIH0KKyAgICAgIHNldEJpbmREYXRhKGJvdW5kLCBiaW5kRGF0YSk7CisgICAgICByZXR1 cm4gYm91bmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRp b24gb2YgYF8uY2xvbmVgIHdpdGhvdXQgYXJndW1lbnQganVnZ2xpbmcgb3Igc3VwcG9ydAorICAg ICAqIGZvciBgdGhpc0FyZ2AgYmluZGluZy4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAg ICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCisgICAgICogQHBhcmFtIHti b29sZWFufSBbaXNEZWVwPWZhbHNlXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS4KKyAgICAgKiBAcGFy YW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmlu ZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZl cnNlZCBzb3VyY2Ugb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBB c3NvY2lhdGVzIGNsb25lcyB3aXRoIHNvdXJjZSBjb3VudGVycGFydHMuCisgICAgICogQHJldHVy bnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBi YXNlQ2xvbmUodmFsdWUsIGlzRGVlcCwgY2FsbGJhY2ssIHN0YWNrQSwgc3RhY2tCKSB7CisgICAg ICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlKTsK KyAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICBy ZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBpbnNwZWN0IFtbQ2xh c3NdXQorICAgICAgdmFyIGlzT2JqID0gaXNPYmplY3QodmFsdWUpOworICAgICAgaWYgKGlzT2Jq KSB7CisgICAgICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKHZhbHVlKTsKKyAgICAg ICAgaWYgKCFjbG9uZWFibGVDbGFzc2VzW2NsYXNzTmFtZV0pIHsKKyAgICAgICAgICByZXR1cm4g dmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGN0b3IgPSBjdG9yQnlDbGFzc1tjbGFzc05h bWVdOworICAgICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkgeworICAgICAgICAgIGNhc2UgYm9vbENs YXNzOgorICAgICAgICAgIGNhc2UgZGF0ZUNsYXNzOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBj dG9yKCt2YWx1ZSk7CisKKyAgICAgICAgICBjYXNlIG51bWJlckNsYXNzOgorICAgICAgICAgIGNh c2Ugc3RyaW5nQ2xhc3M6CisgICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IodmFsdWUpOworCisg ICAgICAgICAgY2FzZSByZWdleHBDbGFzczoKKyAgICAgICAgICAgIHJlc3VsdCA9IGN0b3IodmFs dWUuc291cmNlLCByZUZsYWdzLmV4ZWModmFsdWUpKTsKKyAgICAgICAgICAgIHJlc3VsdC5sYXN0 SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXg7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg ICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9Cisg ICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChpc0RlZXApIHsKKyAg ICAgICAgLy8gY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBjb3JyZXNw b25kaW5nIGNsb25lCisgICAgICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7CisgICAgICAg IHN0YWNrQSB8fCAoc3RhY2tBID0gZ2V0QXJyYXkoKSk7CisgICAgICAgIHN0YWNrQiB8fCAoc3Rh Y2tCID0gZ2V0QXJyYXkoKSk7CisKKyAgICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7 CisgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgICAgIGlmIChzdGFja0FbbGVuZ3Ro XSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0YWNrQltsZW5ndGhdOworICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBpc0FyciA/IGN0b3IodmFsdWUubGVu Z3RoKSA6IHt9OworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGlzQXJy ID8gc2xpY2UodmFsdWUpIDogYXNzaWduKHt9LCB2YWx1ZSk7CisgICAgICB9CisgICAgICAvLyBh ZGQgYXJyYXkgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgCisgICAgICBpZiAo aXNBcnIpIHsKKyAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdpbmRleCcp KSB7CisgICAgICAgICAgcmVzdWx0LmluZGV4ID0gdmFsdWUuaW5kZXg7CisgICAgICAgIH0KKyAg ICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdpbnB1dCcpKSB7CisgICAgICAg ICAgcmVzdWx0LmlucHV0ID0gdmFsdWUuaW5wdXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAg IC8vIGV4aXQgZm9yIHNoYWxsb3cgY2xvbmUKKyAgICAgIGlmICghaXNEZWVwKSB7CisgICAgICAg IHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICAvLyBhZGQgdGhlIHNvdXJjZSB2YWx1ZSB0 byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMKKyAgICAgIC8vIGFuZCBhc3NvY2lhdGUg aXQgd2l0aCBpdHMgY2xvbmUKKyAgICAgIHN0YWNrQS5wdXNoKHZhbHVlKTsKKyAgICAgIHN0YWNr Qi5wdXNoKHJlc3VsdCk7CisKKyAgICAgIC8vIHJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChz dXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykKKyAgICAgIChpc0FyciA/IGZvckVhY2gg OiBmb3JPd24pKHZhbHVlLCBmdW5jdGlvbihvYmpWYWx1ZSwga2V5KSB7CisgICAgICAgIHJlc3Vs dFtrZXldID0gYmFzZUNsb25lKG9ialZhbHVlLCBpc0RlZXAsIGNhbGxiYWNrLCBzdGFja0EsIHN0 YWNrQik7CisgICAgICB9KTsKKworICAgICAgaWYgKGluaXRlZFN0YWNrKSB7CisgICAgICAgIHJl bGVhc2VBcnJheShzdGFja0EpOworICAgICAgICByZWxlYXNlQXJyYXkoc3RhY2tCKTsKKyAgICAg IH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJh c2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2ln bmluZworICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LgorICAgICAqCisg ICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmpl Y3QgdG8gaW5oZXJpdCBmcm9tLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl IG5ldyBvYmplY3QuCisgICAgICovCisgICAgZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90b3R5cGUs IHByb3BlcnRpZXMpIHsKKyAgICAgIHJldHVybiBpc09iamVjdChwcm90b3R5cGUpID8gbmF0aXZl Q3JlYXRlKHByb3RvdHlwZSkgOiB7fTsKKyAgICB9CisgICAgLy8gZmFsbGJhY2sgZm9yIGJyb3dz ZXJzIHdpdGhvdXQgYE9iamVjdC5jcmVhdGVgCisgICAgaWYgKCFuYXRpdmVDcmVhdGUpIHsKKyAg ICAgIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7CisgICAgICAgIGZ1bmN0aW9uIE9iamVjdCgp IHt9CisgICAgICAgIHJldHVybiBmdW5jdGlvbihwcm90b3R5cGUpIHsKKyAgICAgICAgICBpZiAo aXNPYmplY3QocHJvdG90eXBlKSkgeworICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZSA9IHBy b3RvdHlwZTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgT2JqZWN0OworICAgICAgICAg ICAgT2JqZWN0LnByb3RvdHlwZSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVy biByZXN1bHQgfHwgY29udGV4dC5PYmplY3QoKTsKKyAgICAgICAgfTsKKyAgICAgIH0oKSk7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3Jl YXRlQ2FsbGJhY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY3JlYXRpbmcKKyAgICAgKiAiXy5wbHVj ayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIEBwcml2YXRl CisgICAgICogQHBhcmFtIHsqfSBbZnVuYz1pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQg dG8gYSBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJp bmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suCisgICAgICogQHBhcmFtIHtudW1iZXJ9IFth cmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGNhbGxiYWNrIGFjY2VwdHMuCisg ICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisg ICAgICovCisgICAgZnVuY3Rpb24gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFy Z0NvdW50KSB7CisgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgeworICAgICAg ICByZXR1cm4gaWRlbnRpdHk7CisgICAgICB9CisgICAgICAvLyBleGl0IGVhcmx5IGZvciBubyBg dGhpc0FyZ2Agb3IgYWxyZWFkeSBib3VuZCBieSBgRnVuY3Rpb24jYmluZGAKKyAgICAgIGlmICh0 eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyB8fCAhKCdwcm90b3R5cGUnIGluIGZ1bmMpKSB7 CisgICAgICAgIHJldHVybiBmdW5jOworICAgICAgfQorICAgICAgdmFyIGJpbmREYXRhID0gZnVu Yy5fX2JpbmREYXRhX187CisgICAgICBpZiAodHlwZW9mIGJpbmREYXRhID09ICd1bmRlZmluZWQn KSB7CisgICAgICAgIGlmIChzdXBwb3J0LmZ1bmNOYW1lcykgeworICAgICAgICAgIGJpbmREYXRh ID0gIWZ1bmMubmFtZTsKKyAgICAgICAgfQorICAgICAgICBiaW5kRGF0YSA9IGJpbmREYXRhIHx8 ICFzdXBwb3J0LmZ1bmNEZWNvbXA7CisgICAgICAgIGlmICghYmluZERhdGEpIHsKKyAgICAgICAg ICB2YXIgc291cmNlID0gZm5Ub1N0cmluZy5jYWxsKGZ1bmMpOworICAgICAgICAgIGlmICghc3Vw cG9ydC5mdW5jTmFtZXMpIHsKKyAgICAgICAgICAgIGJpbmREYXRhID0gIXJlRnVuY05hbWUudGVz dChzb3VyY2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWJpbmREYXRhKSB7CisgICAg ICAgICAgICAvLyBjaGVja3MgaWYgYGZ1bmNgIHJlZmVyZW5jZXMgdGhlIGB0aGlzYCBrZXl3b3Jk IGFuZCBzdG9yZXMgdGhlIHJlc3VsdAorICAgICAgICAgICAgYmluZERhdGEgPSByZVRoaXMudGVz dChzb3VyY2UpOworICAgICAgICAgICAgc2V0QmluZERhdGEoZnVuYywgYmluZERhdGEpOworICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZXhpdCBlYXJseSBpZiB0aGVy ZSBhcmUgbm8gYHRoaXNgIHJlZmVyZW5jZXMgb3IgYGZ1bmNgIGlzIGJvdW5kCisgICAgICBpZiAo YmluZERhdGEgPT09IGZhbHNlIHx8IChiaW5kRGF0YSAhPT0gdHJ1ZSAmJiBiaW5kRGF0YVsxXSAm IDEpKSB7CisgICAgICAgIHJldHVybiBmdW5jOworICAgICAgfQorICAgICAgc3dpdGNoIChhcmdD b3VudCkgeworICAgICAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbih2YWx1ZSkgeworICAgICAg ICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUpOworICAgICAgICB9OworICAgICAg ICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmMu Y2FsbCh0aGlzQXJnLCBhLCBiKTsKKyAgICAgICAgfTsKKyAgICAgICAgY2FzZSAzOiByZXR1cm4g ZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIGZ1 bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgICAgICB9Owor ICAgICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4 LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhY2N1 bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgfTsKKyAgICAgIH0K KyAgICAgIHJldHVybiBiaW5kKGZ1bmMsIHRoaXNBcmcpOworICAgIH0KKworICAgIC8qKgorICAg ICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBjcmVhdGVXcmFwcGVyYCB0aGF0IGNyZWF0 ZXMgdGhlIHdyYXBwZXIgYW5kCisgICAgICogc2V0cyBpdHMgbWV0YSBkYXRhLgorICAgICAqCisg ICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBiaW5kRGF0YSBUaGUgYmluZCBk YXRhIGFycmF5LgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1 bmN0aW9uLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VDcmVhdGVXcmFwcGVyKGJpbmREYXRh KSB7CisgICAgICB2YXIgZnVuYyA9IGJpbmREYXRhWzBdLAorICAgICAgICAgIGJpdG1hc2sgPSBi aW5kRGF0YVsxXSwKKyAgICAgICAgICBwYXJ0aWFsQXJncyA9IGJpbmREYXRhWzJdLAorICAgICAg ICAgIHBhcnRpYWxSaWdodEFyZ3MgPSBiaW5kRGF0YVszXSwKKyAgICAgICAgICB0aGlzQXJnID0g YmluZERhdGFbNF0sCisgICAgICAgICAgYXJpdHkgPSBiaW5kRGF0YVs1XTsKKworICAgICAgdmFy IGlzQmluZCA9IGJpdG1hc2sgJiAxLAorICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiAy LAorICAgICAgICAgIGlzQ3VycnkgPSBiaXRtYXNrICYgNCwKKyAgICAgICAgICBpc0N1cnJ5Qm91 bmQgPSBiaXRtYXNrICYgOCwKKyAgICAgICAgICBrZXkgPSBmdW5jOworCisgICAgICBmdW5jdGlv biBib3VuZCgpIHsKKyAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6 IHRoaXM7CisgICAgICAgIGlmIChwYXJ0aWFsQXJncykgeworICAgICAgICAgIHZhciBhcmdzID0g c2xpY2UocGFydGlhbEFyZ3MpOworICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRz KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFydGlhbFJpZ2h0QXJncyB8fCBpc0N1cnJ5KSB7 CisgICAgICAgICAgYXJncyB8fCAoYXJncyA9IHNsaWNlKGFyZ3VtZW50cykpOworICAgICAgICAg IGlmIChwYXJ0aWFsUmlnaHRBcmdzKSB7CisgICAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIHBh cnRpYWxSaWdodEFyZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXNDdXJyeSAmJiBh cmdzLmxlbmd0aCA8IGFyaXR5KSB7CisgICAgICAgICAgICBiaXRtYXNrIHw9IDE2ICYgfjMyOwor ICAgICAgICAgICAgcmV0dXJuIGJhc2VDcmVhdGVXcmFwcGVyKFtmdW5jLCAoaXNDdXJyeUJvdW5k ID8gYml0bWFzayA6IGJpdG1hc2sgJiB+MyksIGFyZ3MsIG51bGwsIHRoaXNBcmcsIGFyaXR5XSk7 CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFyZ3MgfHwgKGFyZ3MgPSBhcmd1bWVu dHMpOworICAgICAgICBpZiAoaXNCaW5kS2V5KSB7CisgICAgICAgICAgZnVuYyA9IHRoaXNCaW5k aW5nW2tleV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkg eworICAgICAgICAgIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShmdW5jLnByb3RvdHlwZSk7Cisg ICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpOworICAg ICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7Cisg ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpOwor ICAgICAgfQorICAgICAgc2V0QmluZERhdGEoYm91bmQsIGJpbmREYXRhKTsKKyAgICAgIHJldHVy biBib3VuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlv biBvZiBgXy5kaWZmZXJlbmNlYCB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgYXJyYXkKKyAgICAgKiBv ZiB2YWx1ZXMgdG8gZXhjbHVkZS4KKyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBh cmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHtB cnJheX0gW3ZhbHVlc10gVGhlIGFycmF5IG9mIHZhbHVlcyB0byBleGNsdWRlLgorICAgICAqIEBy ZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCisg ICAgICovCisgICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcykgeworICAg ICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSwKKyAg ICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCisgICAgICAgICAgaXNM YXJnZSA9IGxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJiBpbmRleE9mID09PSBiYXNlSW5kZXhP ZiwKKyAgICAgICAgICByZXN1bHQgPSBbXTsKKworICAgICAgaWYgKGlzTGFyZ2UpIHsKKyAgICAg ICAgdmFyIGNhY2hlID0gY3JlYXRlQ2FjaGUodmFsdWVzKTsKKyAgICAgICAgaWYgKGNhY2hlKSB7 CisgICAgICAgICAgaW5kZXhPZiA9IGNhY2hlSW5kZXhPZjsKKyAgICAgICAgICB2YWx1ZXMgPSBj YWNoZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpc0xhcmdlID0gZmFsc2U7CisgICAg ICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAg IHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgaWYgKGluZGV4T2YodmFsdWVzLCB2 YWx1ZSkgPCAwKSB7CisgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOworICAgICAgICB9Cisg ICAgICB9CisgICAgICBpZiAoaXNMYXJnZSkgeworICAgICAgICByZWxlYXNlT2JqZWN0KHZhbHVl cyk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAg ICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGhvdXQgc3VwcG9y dCBmb3IgY2FsbGJhY2sKKyAgICAgKiBzaG9ydGhhbmRzIG9yIGB0aGlzQXJnYCBiaW5kaW5nLgor ICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUg YXJyYXkgdG8gZmxhdHRlbi4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1NoYWxsb3c9ZmFs c2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGEgc2luZ2xlIGxldmVsLgorICAg ICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0PWZhbHNlXSBBIGZsYWcgdG8gcmVzdHJpY3Qg ZmxhdHRlbmluZyB0byBhcnJheXMgYW5kIGBhcmd1bWVudHNgIG9iamVjdHMuCisgICAgICogQHBh cmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHN0YXJ0IGZyb20uCisgICAg ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGZsYXR0ZW5lZCBhcnJheS4KKyAgICAg Ki8KKyAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgaXNTaGFsbG93LCBpc1N0cmljdCwg ZnJvbUluZGV4KSB7CisgICAgICB2YXIgaW5kZXggPSAoZnJvbUluZGV4IHx8IDApIC0gMSwKKyAg ICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCisgICAgICAgICAgcmVz dWx0ID0gW107CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIHZh ciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKKworICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZh bHVlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcicKKyAgICAg ICAgICAgICYmIChpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7CisgICAg ICAgICAgLy8gcmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwg c3RhY2sgbGltaXRzKQorICAgICAgICAgIGlmICghaXNTaGFsbG93KSB7CisgICAgICAgICAgICB2 YWx1ZSA9IGJhc2VGbGF0dGVuKHZhbHVlLCBpc1NoYWxsb3csIGlzU3RyaWN0KTsKKyAgICAgICAg ICB9CisgICAgICAgICAgdmFyIHZhbEluZGV4ID0gLTEsCisgICAgICAgICAgICAgIHZhbExlbmd0 aCA9IHZhbHVlLmxlbmd0aCwKKyAgICAgICAgICAgICAgcmVzSW5kZXggPSByZXN1bHQubGVuZ3Ro OworCisgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArPSB2YWxMZW5ndGg7CisgICAgICAgICAgd2hp bGUgKCsrdmFsSW5kZXggPCB2YWxMZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRl eCsrXSA9IHZhbHVlW3ZhbEluZGV4XTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAo IWlzU3RyaWN0KSB7CisgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOworICAgICAgICB9Cisg ICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRo ZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgLCB3aXRob3V0IHN1cHBvcnQgZm9y IGB0aGlzQXJnYCBiaW5kaW5nLAorICAgICAqIHRoYXQgYWxsb3dzIHBhcnRpYWwgIl8ud2hlcmUi IHN0eWxlIGNvbXBhcmlzb25zLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFy YW0geyp9IGEgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHsqfSBiIFRoZSBv dGhlciB2YWx1ZSB0byBjb21wYXJlLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFj a10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLgorICAgICAqIEBw YXJhbSB7RnVuY3Rpb259IFtpc1doZXJlPWZhbHNlXSBBIGZsYWcgdG8gaW5kaWNhdGUgcGVyZm9y bWluZyBwYXJ0aWFsIGNvbXBhcmlzb25zLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0E9 W11dIFRyYWNrcyB0cmF2ZXJzZWQgYGFgIG9iamVjdHMuCisgICAgICogQHBhcmFtIHtBcnJheX0g W3N0YWNrQj1bXV0gVHJhY2tzIHRyYXZlcnNlZCBgYmAgb2JqZWN0cy4KKyAgICAgKiBAcmV0dXJu cyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwg ZWxzZSBgZmFsc2VgLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKGEsIGIsIGNh bGxiYWNrLCBpc1doZXJlLCBzdGFja0EsIHN0YWNrQikgeworICAgICAgLy8gdXNlZCB0byBpbmRp Y2F0ZSB0aGF0IHdoZW4gY29tcGFyaW5nIG9iamVjdHMsIGBhYCBoYXMgYXQgbGVhc3QgdGhlIHBy b3BlcnRpZXMgb2YgYGJgCisgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHJlc3Vs dCA9IGNhbGxiYWNrKGEsIGIpOworICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPSAndW5kZWZp bmVkJykgeworICAgICAgICAgIHJldHVybiAhIXJlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQor ICAgICAgLy8gZXhpdCBlYXJseSBmb3IgaWRlbnRpY2FsIHZhbHVlcworICAgICAgaWYgKGEgPT09 IGIpIHsKKyAgICAgICAgLy8gdHJlYXQgYCswYCB2cy4gYC0wYCBhcyBub3QgZXF1YWwKKyAgICAg ICAgcmV0dXJuIGEgIT09IDAgfHwgKDEgLyBhID09IDEgLyBiKTsKKyAgICAgIH0KKyAgICAgIHZh ciB0eXBlID0gdHlwZW9mIGEsCisgICAgICAgICAgb3RoZXJUeXBlID0gdHlwZW9mIGI7CisKKyAg ICAgIC8vIGV4aXQgZWFybHkgZm9yIHVubGlrZSBwcmltaXRpdmUgdmFsdWVzCisgICAgICBpZiAo YSA9PT0gYSAmJgorICAgICAgICAgICEoYSAmJiBvYmplY3RUeXBlc1t0eXBlXSkgJiYKKyAgICAg ICAgICAhKGIgJiYgb2JqZWN0VHlwZXNbb3RoZXJUeXBlXSkpIHsKKyAgICAgICAgcmV0dXJuIGZh bHNlOworICAgICAgfQorICAgICAgLy8gZXhpdCBlYXJseSBmb3IgYG51bGxgIGFuZCBgdW5kZWZp bmVkYCBhdm9pZGluZyBFUzMncyBGdW5jdGlvbiNjYWxsIGJlaGF2aW9yCisgICAgICAvLyBodHRw Oi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC40CisgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0g bnVsbCkgeworICAgICAgICByZXR1cm4gYSA9PT0gYjsKKyAgICAgIH0KKyAgICAgIC8vIGNvbXBh cmUgW1tDbGFzc11dIG5hbWVzCisgICAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChh KSwKKyAgICAgICAgICBvdGhlckNsYXNzID0gdG9TdHJpbmcuY2FsbChiKTsKKworICAgICAgaWYg KGNsYXNzTmFtZSA9PSBhcmdzQ2xhc3MpIHsKKyAgICAgICAgY2xhc3NOYW1lID0gb2JqZWN0Q2xh c3M7CisgICAgICB9CisgICAgICBpZiAob3RoZXJDbGFzcyA9PSBhcmdzQ2xhc3MpIHsKKyAgICAg ICAgb3RoZXJDbGFzcyA9IG9iamVjdENsYXNzOworICAgICAgfQorICAgICAgaWYgKGNsYXNzTmFt ZSAhPSBvdGhlckNsYXNzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAg IHN3aXRjaCAoY2xhc3NOYW1lKSB7CisgICAgICAgIGNhc2UgYm9vbENsYXNzOgorICAgICAgICBj YXNlIGRhdGVDbGFzczoKKyAgICAgICAgICAvLyBjb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRv IG51bWJlcnMsIGRhdGVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYm9vbGVhbnMKKyAgICAgICAgICAv LyB0byBgMWAgb3IgYDBgIHRyZWF0aW5nIGludmFsaWQgZGF0ZXMgY29lcmNlZCB0byBgTmFOYCBh cyBub3QgZXF1YWwKKyAgICAgICAgICByZXR1cm4gK2EgPT0gK2I7CisKKyAgICAgICAgY2FzZSBu dW1iZXJDbGFzczoKKyAgICAgICAgICAvLyB0cmVhdCBgTmFOYCB2cy4gYE5hTmAgYXMgZXF1YWwK KyAgICAgICAgICByZXR1cm4gKGEgIT0gK2EpCisgICAgICAgICAgICA/IGIgIT0gK2IKKyAgICAg ICAgICAgIC8vIGJ1dCB0cmVhdCBgKzBgIHZzLiBgLTBgIGFzIG5vdCBlcXVhbAorICAgICAgICAg ICAgOiAoYSA9PSAwID8gKDEgLyBhID09IDEgLyBiKSA6IGEgPT0gK2IpOworCisgICAgICAgIGNh c2UgcmVnZXhwQ2xhc3M6CisgICAgICAgIGNhc2Ugc3RyaW5nQ2xhc3M6CisgICAgICAgICAgLy8g Y29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42 LjQpCisgICAgICAgICAgLy8gdHJlYXQgc3RyaW5nIHByaW1pdGl2ZXMgYW5kIHRoZWlyIGNvcnJl c3BvbmRpbmcgb2JqZWN0IGluc3RhbmNlcyBhcyBlcXVhbAorICAgICAgICAgIHJldHVybiBhID09 IFN0cmluZyhiKTsKKyAgICAgIH0KKyAgICAgIHZhciBpc0FyciA9IGNsYXNzTmFtZSA9PSBhcnJh eUNsYXNzOworICAgICAgaWYgKCFpc0FycikgeworICAgICAgICAvLyB1bndyYXAgYW55IGBsb2Rh c2hgIHdyYXBwZWQgdmFsdWVzCisgICAgICAgIHZhciBhV3JhcHBlZCA9IGhhc093blByb3BlcnR5 LmNhbGwoYSwgJ19fd3JhcHBlZF9fJyksCisgICAgICAgICAgICBiV3JhcHBlZCA9IGhhc093blBy b3BlcnR5LmNhbGwoYiwgJ19fd3JhcHBlZF9fJyk7CisKKyAgICAgICAgaWYgKGFXcmFwcGVkIHx8 IGJXcmFwcGVkKSB7CisgICAgICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKGFXcmFwcGVkID8gYS5f X3dyYXBwZWRfXyA6IGEsIGJXcmFwcGVkID8gYi5fX3dyYXBwZWRfXyA6IGIsIGNhbGxiYWNrLCBp c1doZXJlLCBzdGFja0EsIHN0YWNrQik7CisgICAgICAgIH0KKyAgICAgICAgLy8gZXhpdCBmb3Ig ZnVuY3Rpb25zIGFuZCBET00gbm9kZXMKKyAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBvYmplY3RD bGFzcykgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBp biBvbGRlciB2ZXJzaW9ucyBvZiBPcGVyYSwgYGFyZ3VtZW50c2Agb2JqZWN0cyBoYXZlIGBBcnJh eWAgY29uc3RydWN0b3JzCisgICAgICAgIHZhciBjdG9yQSA9IGEuY29uc3RydWN0b3IsCisgICAg ICAgICAgICBjdG9yQiA9IGIuY29uc3RydWN0b3I7CisKKyAgICAgICAgLy8gbm9uIGBPYmplY3Rg IG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1 YWwKKyAgICAgICAgaWYgKGN0b3JBICE9IGN0b3JCICYmCisgICAgICAgICAgICAgICEoaXNGdW5j dGlvbihjdG9yQSkgJiYgY3RvckEgaW5zdGFuY2VvZiBjdG9yQSAmJiBpc0Z1bmN0aW9uKGN0b3JC KSAmJiBjdG9yQiBpbnN0YW5jZW9mIGN0b3JCKSAmJgorICAgICAgICAgICAgICAoJ2NvbnN0cnVj dG9yJyBpbiBhICYmICdjb25zdHJ1Y3RvcicgaW4gYikKKyAgICAgICAgICAgICkgeworICAgICAg ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gYXNzdW1lIGN5 Y2xpYyBzdHJ1Y3R1cmVzIGFyZSBlcXVhbAorICAgICAgLy8gdGhlIGFsZ29yaXRobSBmb3IgZGV0 ZWN0aW5nIGN5Y2xpYyBzdHJ1Y3R1cmVzIGlzIGFkYXB0ZWQgZnJvbSBFUyA1LjEKKyAgICAgIC8v IHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AgKGh0dHA6Ly9lczUuZ2l0 aHViLmlvLyN4MTUuMTIuMykKKyAgICAgIHZhciBpbml0ZWRTdGFjayA9ICFzdGFja0E7CisgICAg ICBzdGFja0EgfHwgKHN0YWNrQSA9IGdldEFycmF5KCkpOworICAgICAgc3RhY2tCIHx8IChzdGFj a0IgPSBnZXRBcnJheSgpKTsKKworICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7Cisg ICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IGEp IHsKKyAgICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF0gPT0gYjsKKyAgICAgICAgfQorICAg ICAgfQorICAgICAgdmFyIHNpemUgPSAwOworICAgICAgcmVzdWx0ID0gdHJ1ZTsKKworICAgICAg Ly8gYWRkIGBhYCBhbmQgYGJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cworICAg ICAgc3RhY2tBLnB1c2goYSk7CisgICAgICBzdGFja0IucHVzaChiKTsKKworICAgICAgLy8gcmVj dXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwg c3RhY2sgbGltaXRzKQorICAgICAgaWYgKGlzQXJyKSB7CisgICAgICAgIC8vIGNvbXBhcmUgbGVu Z3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5CisgICAg ICAgIGxlbmd0aCA9IGEubGVuZ3RoOworICAgICAgICBzaXplID0gYi5sZW5ndGg7CisgICAgICAg IHJlc3VsdCA9IHNpemUgPT0gbGVuZ3RoOworCisgICAgICAgIGlmIChyZXN1bHQgfHwgaXNXaGVy ZSkgeworICAgICAgICAgIC8vIGRlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5v bi1udW1lcmljIHByb3BlcnRpZXMKKyAgICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgICAg ICAgICB2YXIgaW5kZXggPSBsZW5ndGgsCisgICAgICAgICAgICAgICAgdmFsdWUgPSBiW3NpemVd OworCisgICAgICAgICAgICBpZiAoaXNXaGVyZSkgeworICAgICAgICAgICAgICB3aGlsZSAoaW5k ZXgtLSkgeworICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gYmFzZUlzRXF1YWwoYVtpbmRl eF0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0IpKSkgeworICAgICAg ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICB9IGVsc2UgaWYgKCEocmVzdWx0ID0gYmFzZUlzRXF1YWwoYVtzaXplXSwgdmFs dWUsIGNhbGxiYWNrLCBpc1doZXJlLCBzdGFja0EsIHN0YWNrQikpKSB7CisgICAgICAgICAgICAg IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQor ICAgICAgZWxzZSB7CisgICAgICAgIC8vIGRlZXAgY29tcGFyZSBvYmplY3RzIHVzaW5nIGBmb3JJ bmAsIGluc3RlYWQgb2YgYGZvck93bmAsIHRvIGF2b2lkIGBPYmplY3Qua2V5c2AKKyAgICAgICAg Ly8gd2hpY2gsIGluIHRoaXMgY2FzZSwgaXMgbW9yZSBjb3N0bHkKKyAgICAgICAgZm9ySW4oYiwg ZnVuY3Rpb24odmFsdWUsIGtleSwgYikgeworICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5j YWxsKGIsIGtleSkpIHsKKyAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcHJvcGVy dGllcy4KKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgIC8vIGRlZXAgY29tcGFyZSBl YWNoIHByb3BlcnR5IHZhbHVlLgorICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBoYXNPd25Q cm9wZXJ0eS5jYWxsKGEsIGtleSkgJiYgYmFzZUlzRXF1YWwoYVtrZXldLCB2YWx1ZSwgY2FsbGJh Y2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsK KworICAgICAgICBpZiAocmVzdWx0ICYmICFpc1doZXJlKSB7CisgICAgICAgICAgLy8gZW5zdXJl IGJvdGggb2JqZWN0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzCisgICAgICAg ICAgZm9ySW4oYSwgZnVuY3Rpb24odmFsdWUsIGtleSwgYSkgeworICAgICAgICAgICAgaWYgKGhh c093blByb3BlcnR5LmNhbGwoYSwga2V5KSkgeworICAgICAgICAgICAgICAvLyBgc2l6ZWAgd2ls bCBiZSBgLTFgIGlmIGBhYCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gYGJgCisgICAgICAgICAg ICAgIHJldHVybiAocmVzdWx0ID0gLS1zaXplID4gLTEpOworICAgICAgICAgICAgfQorICAgICAg ICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdGFja0EucG9wKCk7CisgICAgICBz dGFja0IucG9wKCk7CisKKyAgICAgIGlmIChpbml0ZWRTdGFjaykgeworICAgICAgICByZWxlYXNl QXJyYXkoc3RhY2tBKTsKKyAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQik7CisgICAgICB9Cisg ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGlt cGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IGFyZ3VtZW50IGp1Z2dsaW5nIG9yIHN1 cHBvcnQKKyAgICAgKiBmb3IgYHRoaXNBcmdgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcHJp dmF0ZQorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVj dC4KKyAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LgorICAg ICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6 ZSBtZXJnaW5nIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0g VHJhY2tzIHRyYXZlcnNlZCBzb3VyY2Ugb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0ge0FycmF5fSBb c3RhY2tCPVtdXSBBc3NvY2lhdGVzIHZhbHVlcyB3aXRoIHNvdXJjZSBjb3VudGVycGFydHMuCisg ICAgICovCisgICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBjYWxsYmFjaywg c3RhY2tBLCBzdGFja0IpIHsKKyAgICAgIChpc0FycmF5KHNvdXJjZSkgPyBmb3JFYWNoIDogZm9y T3duKShzb3VyY2UsIGZ1bmN0aW9uKHNvdXJjZSwga2V5KSB7CisgICAgICAgIHZhciBmb3VuZCwK KyAgICAgICAgICAgIGlzQXJyLAorICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlLAorICAgICAg ICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTsKKworICAgICAgICBpZiAoc291cmNlICYmICgoaXNB cnIgPSBpc0FycmF5KHNvdXJjZSkpIHx8IGlzUGxhaW5PYmplY3Qoc291cmNlKSkpIHsKKyAgICAg ICAgICAvLyBhdm9pZCBtZXJnaW5nIHByZXZpb3VzbHkgbWVyZ2VkIGN5Y2xpYyBzb3VyY2VzCisg ICAgICAgICAgdmFyIHN0YWNrTGVuZ3RoID0gc3RhY2tBLmxlbmd0aDsKKyAgICAgICAgICB3aGls ZSAoc3RhY2tMZW5ndGgtLSkgeworICAgICAgICAgICAgaWYgKChmb3VuZCA9IHN0YWNrQVtzdGFj a0xlbmd0aF0gPT0gc291cmNlKSkgeworICAgICAgICAgICAgICB2YWx1ZSA9IHN0YWNrQltzdGFj a0xlbmd0aF07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAg IH0KKyAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICB2YXIgaXNTaGFsbG93Owor ICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxi YWNrKHZhbHVlLCBzb3VyY2UpOworICAgICAgICAgICAgICBpZiAoKGlzU2hhbGxvdyA9IHR5cGVv ZiByZXN1bHQgIT0gJ3VuZGVmaW5lZCcpKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1 bHQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNT aGFsbG93KSB7CisgICAgICAgICAgICAgIHZhbHVlID0gaXNBcnIKKyAgICAgICAgICAgICAgICA/ IChpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10pCisgICAgICAgICAgICAgICAgOiAoaXNQbGFp bk9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IHt9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg IC8vIGFkZCBgc291cmNlYCBhbmQgYXNzb2NpYXRlZCBgdmFsdWVgIHRvIHRoZSBzdGFjayBvZiB0 cmF2ZXJzZWQgb2JqZWN0cworICAgICAgICAgICAgc3RhY2tBLnB1c2goc291cmNlKTsKKyAgICAg ICAgICAgIHN0YWNrQi5wdXNoKHZhbHVlKTsKKworICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkg bWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0 cykKKyAgICAgICAgICAgIGlmICghaXNTaGFsbG93KSB7CisgICAgICAgICAgICAgIGJhc2VNZXJn ZSh2YWx1ZSwgc291cmNlLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpOworICAgICAgICAgICAg fQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAo Y2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBzb3VyY2Up OworICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAg ICAgICAgICAgcmVzdWx0ID0gc291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg ICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAg dmFsdWUgPSByZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9iamVjdFtr ZXldID0gdmFsdWU7CisgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFz ZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgYXJndW1lbnQganVnZ2xpbmcg b3Igc3VwcG9ydAorICAgICAqIGZvciByZXR1cm5pbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4K KyAgICAgKgorICAgICAqIEBwcml2YXRlCisgICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbiBUaGUg bWluaW11bSBwb3NzaWJsZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSBt YXhpbXVtIHBvc3NpYmxlIHZhbHVlLgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMg YSByYW5kb20gbnVtYmVyLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obWluLCBt YXgpIHsKKyAgICAgIHJldHVybiBtaW4gKyBmbG9vcihuYXRpdmVSYW5kb20oKSAqIChtYXggLSBt aW4gKyAxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRp b24gb2YgYF8udW5pcWAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzCisg ICAgICogb3IgYHRoaXNBcmdgIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAg ICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLgorICAgICAqIEBw YXJhbSB7Ym9vbGVhbn0gW2lzU29ydGVkPWZhbHNlXSBBIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBg YXJyYXlgIGlzIHNvcnRlZC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRo ZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9 IFJldHVybnMgYSBkdXBsaWNhdGUtdmFsdWUtZnJlZSBhcnJheS4KKyAgICAgKi8KKyAgICBmdW5j dGlvbiBiYXNlVW5pcShhcnJheSwgaXNTb3J0ZWQsIGNhbGxiYWNrKSB7CisgICAgICB2YXIgaW5k ZXggPSAtMSwKKyAgICAgICAgICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLAorICAgICAgICAgIGxl bmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSBbXTsK KworICAgICAgdmFyIGlzTGFyZ2UgPSAhaXNTb3J0ZWQgJiYgbGVuZ3RoID49IGxhcmdlQXJyYXlT aXplICYmIGluZGV4T2YgPT09IGJhc2VJbmRleE9mLAorICAgICAgICAgIHNlZW4gPSAoY2FsbGJh Y2sgfHwgaXNMYXJnZSkgPyBnZXRBcnJheSgpIDogcmVzdWx0OworCisgICAgICBpZiAoaXNMYXJn ZSkgeworICAgICAgICB2YXIgY2FjaGUgPSBjcmVhdGVDYWNoZShzZWVuKTsKKyAgICAgICAgaW5k ZXhPZiA9IGNhY2hlSW5kZXhPZjsKKyAgICAgICAgc2VlbiA9IGNhY2hlOworICAgICAgfQorICAg ICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlb aW5kZXhdLAorICAgICAgICAgICAgY29tcHV0ZWQgPSBjYWxsYmFjayA/IGNhbGxiYWNrKHZhbHVl LCBpbmRleCwgYXJyYXkpIDogdmFsdWU7CisKKyAgICAgICAgaWYgKGlzU29ydGVkCisgICAgICAg ICAgICAgID8gIWluZGV4IHx8IHNlZW5bc2Vlbi5sZW5ndGggLSAxXSAhPT0gY29tcHV0ZWQKKyAg ICAgICAgICAgICAgOiBpbmRleE9mKHNlZW4sIGNvbXB1dGVkKSA8IDAKKyAgICAgICAgICAgICkg eworICAgICAgICAgIGlmIChjYWxsYmFjayB8fCBpc0xhcmdlKSB7CisgICAgICAgICAgICBzZWVu LnB1c2goY29tcHV0ZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQucHVzaCh2YWx1 ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc0xhcmdlKSB7CisgICAgICAgIHJl bGVhc2VBcnJheShzZWVuLmFycmF5KTsKKyAgICAgICAgcmVsZWFzZU9iamVjdChzZWVuKTsKKyAg ICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgcmVsZWFzZUFycmF5KHNlZW4pOwor ICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBD cmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGEgY29sbGVjdGlvbiwgY3JlYXRpbmcg YW4gb2JqZWN0IGNvbXBvc2VkCisgICAgICogb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVz dWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbgorICAgICAqIHRo cm91Z2ggYSBjYWxsYmFjay4gVGhlIGdpdmVuIGBzZXR0ZXJgIGZ1bmN0aW9uIHNldHMgdGhlIGtl eXMgYW5kIHZhbHVlcworICAgICAqIG9mIHRoZSBjb21wb3NlZCBvYmplY3QuCisgICAgICoKKyAg ICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgc2V0dGVy IGZ1bmN0aW9uLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFn Z3JlZ2F0b3IgZnVuY3Rpb24uCisgICAgICovCisgICAgZnVuY3Rpb24gY3JlYXRlQWdncmVnYXRv cihzZXR0ZXIpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBjYWxsYmFjaywg dGhpc0FyZykgeworICAgICAgICB2YXIgcmVzdWx0ID0ge307CisgICAgICAgIGNhbGxiYWNrID0g bG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKworICAgICAgICB2 YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0 aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicp IHsKKyAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgICAgdmFy IHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgICBzZXR0ZXIocmVzdWx0LCB2 YWx1ZSwgY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7Cisg ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvck93bihjb2xsZWN0aW9u LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBzZXR0ZXIo cmVzdWx0LCB2YWx1ZSwgY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVjdGlvbiksIGNvbGxlY3Rp b24pOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg ICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0 LCB3aGVuIGNhbGxlZCwgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2AKKyAgICAgKiB3 aXRoIGFuIG9wdGlvbmFsIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1 bWVudHMuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258 c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byByZWZlcmVuY2UuCisg ICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgb2YgbWV0aG9kIGZsYWdz IHRvIGNvbXBvc2UuCisgICAgICogIFRoZSBiaXRtYXNrIG1heSBiZSBjb21wb3NlZCBvZiB0aGUg Zm9sbG93aW5nIGZsYWdzOgorICAgICAqICAxIC0gYF8uYmluZGAKKyAgICAgKiAgMiAtIGBfLmJp bmRLZXlgCisgICAgICogIDQgLSBgXy5jdXJyeWAKKyAgICAgKiAgOCAtIGBfLmN1cnJ5YCAoYm91 bmQpCisgICAgICogIDE2IC0gYF8ucGFydGlhbGAKKyAgICAgKiAgMzIgLSBgXy5wYXJ0aWFsUmln aHRgCisgICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxBcmdzXSBBbiBhcnJheSBvZiBhcmd1 bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZQorICAgICAqICBwcm92aWRlZCB0byB0aGUgbmV3IGZ1 bmN0aW9uLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsUmlnaHRBcmdzXSBBbiBhcnJh eSBvZiBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlCisgICAgICogIHByb3ZpZGVkIHRvIHRo ZSBuZXcgZnVuY3Rpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBi aW5kaW5nIG9mIGBmdW5jYC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJp dHkgb2YgYGZ1bmNgLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3 IGZ1bmN0aW9uLgorICAgICAqLworICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZnVuYywgYml0 bWFzaywgcGFydGlhbEFyZ3MsIHBhcnRpYWxSaWdodEFyZ3MsIHRoaXNBcmcsIGFyaXR5KSB7Cisg ICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIDEsCisgICAgICAgICAgaXNCaW5kS2V5ID0gYml0 bWFzayAmIDIsCisgICAgICAgICAgaXNDdXJyeSA9IGJpdG1hc2sgJiA0LAorICAgICAgICAgIGlz Q3VycnlCb3VuZCA9IGJpdG1hc2sgJiA4LAorICAgICAgICAgIGlzUGFydGlhbCA9IGJpdG1hc2sg JiAxNiwKKyAgICAgICAgICBpc1BhcnRpYWxSaWdodCA9IGJpdG1hc2sgJiAzMjsKKworICAgICAg aWYgKCFpc0JpbmRLZXkgJiYgIWlzRnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cgbmV3 IFR5cGVFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmIChpc1BhcnRpYWwgJiYgIXBhcnRpYWxBcmdz Lmxlbmd0aCkgeworICAgICAgICBiaXRtYXNrICY9IH4xNjsKKyAgICAgICAgaXNQYXJ0aWFsID0g cGFydGlhbEFyZ3MgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChpc1BhcnRpYWxSaWdodCAm JiAhcGFydGlhbFJpZ2h0QXJncy5sZW5ndGgpIHsKKyAgICAgICAgYml0bWFzayAmPSB+MzI7Cisg ICAgICAgIGlzUGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0QXJncyA9IGZhbHNlOworICAgICAg fQorICAgICAgdmFyIGJpbmREYXRhID0gZnVuYyAmJiBmdW5jLl9fYmluZERhdGFfXzsKKyAgICAg IGlmIChiaW5kRGF0YSAmJiBiaW5kRGF0YSAhPT0gdHJ1ZSkgeworICAgICAgICAvLyBjbG9uZSBg YmluZERhdGFgCisgICAgICAgIGJpbmREYXRhID0gc2xpY2UoYmluZERhdGEpOworICAgICAgICBp ZiAoYmluZERhdGFbMl0pIHsKKyAgICAgICAgICBiaW5kRGF0YVsyXSA9IHNsaWNlKGJpbmREYXRh WzJdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZERhdGFbM10pIHsKKyAgICAgICAgICBi aW5kRGF0YVszXSA9IHNsaWNlKGJpbmREYXRhWzNdKTsKKyAgICAgICAgfQorICAgICAgICAvLyBz ZXQgYHRoaXNCaW5kaW5nYCBpcyBub3QgcHJldmlvdXNseSBib3VuZAorICAgICAgICBpZiAoaXNC aW5kICYmICEoYmluZERhdGFbMV0gJiAxKSkgeworICAgICAgICAgIGJpbmREYXRhWzRdID0gdGhp c0FyZzsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgaWYgcHJldmlvdXNseSBib3VuZCBidXQg bm90IGN1cnJlbnRseSAoc3Vic2VxdWVudCBjdXJyaWVkIGZ1bmN0aW9ucykKKyAgICAgICAgaWYg KCFpc0JpbmQgJiYgYmluZERhdGFbMV0gJiAxKSB7CisgICAgICAgICAgYml0bWFzayB8PSA4Owor ICAgICAgICB9CisgICAgICAgIC8vIHNldCBjdXJyaWVkIGFyaXR5IGlmIG5vdCB5ZXQgc2V0Cisg ICAgICAgIGlmIChpc0N1cnJ5ICYmICEoYmluZERhdGFbMV0gJiA0KSkgeworICAgICAgICAgIGJp bmREYXRhWzVdID0gYXJpdHk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYXBwZW5kIHBhcnRpYWwg bGVmdCBhcmd1bWVudHMKKyAgICAgICAgaWYgKGlzUGFydGlhbCkgeworICAgICAgICAgIHB1c2gu YXBwbHkoYmluZERhdGFbMl0gfHwgKGJpbmREYXRhWzJdID0gW10pLCBwYXJ0aWFsQXJncyk7Cisg ICAgICAgIH0KKyAgICAgICAgLy8gYXBwZW5kIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzCisgICAg ICAgIGlmIChpc1BhcnRpYWxSaWdodCkgeworICAgICAgICAgIHVuc2hpZnQuYXBwbHkoYmluZERh dGFbM10gfHwgKGJpbmREYXRhWzNdID0gW10pLCBwYXJ0aWFsUmlnaHRBcmdzKTsKKyAgICAgICAg fQorICAgICAgICAvLyBtZXJnZSBmbGFncworICAgICAgICBiaW5kRGF0YVsxXSB8PSBiaXRtYXNr OworICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlci5hcHBseShudWxsLCBiaW5kRGF0YSk7Cisg ICAgICB9CisgICAgICAvLyBmYXN0IHBhdGggZm9yIGBfLmJpbmRgCisgICAgICB2YXIgY3JlYXRl ciA9IChiaXRtYXNrID09IDEgfHwgYml0bWFzayA9PT0gMTcpID8gYmFzZUJpbmQgOiBiYXNlQ3Jl YXRlV3JhcHBlcjsKKyAgICAgIHJldHVybiBjcmVhdGVyKFtmdW5jLCBiaXRtYXNrLCBwYXJ0aWFs QXJncywgcGFydGlhbFJpZ2h0QXJncywgdGhpc0FyZywgYXJpdHldKTsKKyAgICB9CisKKyAgICAv KioKKyAgICAgKiBVc2VkIGJ5IGBlc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1M IGVudGl0aWVzLgorICAgICAqCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcGFyYW0ge3N0cmlu Z30gbWF0Y2ggVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS4KKyAgICAgKiBAcmV0dXJu cyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBm dW5jdGlvbiBlc2NhcGVIdG1sQ2hhcihtYXRjaCkgeworICAgICAgcmV0dXJuIGh0bWxFc2NhcGVz W21hdGNoXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSAi aW5kZXhPZiIgZnVuY3Rpb24uIElmIHRoZSBgXy5pbmRleE9mYCBtZXRob2QgaXMKKyAgICAgKiBj dXN0b21pemVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndp c2UgaXQgcmV0dXJucworICAgICAqIHRoZSBgYmFzZUluZGV4T2ZgIGZ1bmN0aW9uLgorICAgICAq CisgICAgICogQHByaXZhdGUKKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhl ICJpbmRleE9mIiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBnZXRJbmRleE9mKCkg eworICAgICAgdmFyIHJlc3VsdCA9IChyZXN1bHQgPSBsb2Rhc2guaW5kZXhPZikgPT09IGluZGV4 T2YgPyBiYXNlSW5kZXhPZiA6IHJlc3VsdDsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24u CisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZh bHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBp ZiB0aGUgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLgorICAgICAq LworICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlwZW9mIHZh bHVlID09ICdmdW5jdGlvbicgJiYgcmVOYXRpdmUudGVzdCh2YWx1ZSk7CisgICAgfQorCisgICAg LyoqCisgICAgICogU2V0cyBgdGhpc2AgYmluZGluZyBkYXRhIG9uIGEgZ2l2ZW4gZnVuY3Rpb24u CisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMg VGhlIGZ1bmN0aW9uIHRvIHNldCBkYXRhIG9uLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVl IFRoZSBkYXRhIGFycmF5IHRvIHNldC4KKyAgICAgKi8KKyAgICB2YXIgc2V0QmluZERhdGEgPSAh ZGVmaW5lUHJvcGVydHkgPyBub29wIDogZnVuY3Rpb24oZnVuYywgdmFsdWUpIHsKKyAgICAgIGRl c2NyaXB0b3IudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2Jp bmREYXRhX18nLCBkZXNjcmlwdG9yKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBmYWxs YmFjayBpbXBsZW1lbnRhdGlvbiBvZiBgaXNQbGFpbk9iamVjdGAgd2hpY2ggY2hlY2tzIGlmIGEg Z2l2ZW4gdmFsdWUKKyAgICAgKiBpcyBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAg Y29uc3RydWN0b3IsIGFzc3VtaW5nIG9iamVjdHMgY3JlYXRlZAorICAgICAqIGJ5IHRoZSBgT2Jq ZWN0YCBjb25zdHJ1Y3RvciBoYXZlIG5vIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMg YW5kIHRoYXQKKyAgICAgKiB0aGVyZSBhcmUgbm8gYE9iamVjdC5wcm90b3R5cGVgIGV4dGVuc2lv bnMuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhl IHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVl YCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgICAgICovCisg ICAgZnVuY3Rpb24gc2hpbUlzUGxhaW5PYmplY3QodmFsdWUpIHsKKyAgICAgIHZhciBjdG9yLAor ICAgICAgICAgIHJlc3VsdDsKKworICAgICAgLy8gYXZvaWQgbm9uIE9iamVjdCBvYmplY3RzLCBg YXJndW1lbnRzYCBvYmplY3RzLCBhbmQgRE9NIGVsZW1lbnRzCisgICAgICBpZiAoISh2YWx1ZSAm JiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykgfHwKKyAgICAgICAgICAoY3Rv ciA9IHZhbHVlLmNvbnN0cnVjdG9yLCBpc0Z1bmN0aW9uKGN0b3IpICYmICEoY3RvciBpbnN0YW5j ZW9mIGN0b3IpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBJ biBtb3N0IGVudmlyb25tZW50cyBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcyBhcmUgaXRlcmF0 ZWQgYmVmb3JlCisgICAgICAvLyBpdHMgaW5oZXJpdGVkIHByb3BlcnRpZXMuIElmIHRoZSBsYXN0 IGl0ZXJhdGVkIHByb3BlcnR5IGlzIGFuIG9iamVjdCdzCisgICAgICAvLyBvd24gcHJvcGVydHkg dGhlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy4KKyAgICAg IGZvckluKHZhbHVlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICAgIHJlc3VsdCA9IGtl eTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcg fHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBVc2VkIGJ5IGB1bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNo YXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7c3RyaW5n fSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuCisgICAgICogQHJldHVy bnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAg ICBmdW5jdGlvbiB1bmVzY2FwZUh0bWxDaGFyKG1hdGNoKSB7CisgICAgICByZXR1cm4gaHRtbFVu ZXNjYXBlc1ttYXRjaF07CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAg ICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3Qu CisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0 ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNr LgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVl YCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FyZ3VtZW50cyhhcmd1 bWVudHMpOyB9KSgxLCAyLCAzKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBf LmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlICYmIHR5 cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09ICdudW1iZXIn ICYmCisgICAgICAgIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NDbGFzcyB8fCBmYWxzZTsK KyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS4K KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBl IEZ1bmN0aW9uCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZh bHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJu cyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC4KKyAgICAg KiBAZXhhbXBsZQorICAgICAqCisgICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FycmF5 KGFyZ3VtZW50cyk7IH0pKCk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8u aXNBcnJheShbMSwgMiwgM10pOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICB2YXIg aXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgfHwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVy biB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmxlbmd0 aCA9PSAnbnVtYmVyJyAmJgorICAgICAgICB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcnJheUNs YXNzIHx8IGZhbHNlOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIGZhbGxiYWNrIGltcGxl bWVudGF0aW9uIG9mIGBPYmplY3Qua2V5c2Agd2hpY2ggcHJvZHVjZXMgYW4gYXJyYXkgb2YgdGhl CisgICAgICogZ2l2ZW4gb2JqZWN0J3Mgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMuCisg ICAgICoKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEB0eXBlIEZ1bmN0aW9uCisgICAgICogQHBh cmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgICAgICogQHJldHVy bnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgorICAgICAqLwor ICAgIHZhciBzaGltS2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgdmFyIGluZGV4LCBp dGVyYWJsZSA9IG9iamVjdCwgcmVzdWx0ID0gW107CisgICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1 cm4gcmVzdWx0OworICAgICAgaWYgKCEob2JqZWN0VHlwZXNbdHlwZW9mIG9iamVjdF0pKSByZXR1 cm4gcmVzdWx0OworICAgICAgICBmb3IgKGluZGV4IGluIGl0ZXJhYmxlKSB7CisgICAgICAgICAg aWYgKGhhc093blByb3BlcnR5LmNhbGwoaXRlcmFibGUsIGluZGV4KSkgeworICAgICAgICAgICAg cmVzdWx0LnB1c2goaW5kZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgcmV0dXJu IHJlc3VsdAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNvbXBv c2VkIG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QuCisg ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv cnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBp bnNwZWN0LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBwcm9w ZXJ0eSBuYW1lcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5rZXlzKHsgJ29u ZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0pOworICAgICAqIC8vID0+IFsnb25lJywgJ3R3 bycsICd0aHJlZSddIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52 aXJvbm1lbnRzKQorICAgICAqLworICAgIHZhciBrZXlzID0gIW5hdGl2ZUtleXMgPyBzaGltS2V5 cyA6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7Cisg ICAgICAgIHJldHVybiBbXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVj dCk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXJz IHRvIEhUTUwgZW50aXRpZXM6CisgICAgICoKKyAgICAgKiBUaG91Z2ggdGhlIGA+YCBjaGFyYWN0 ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZSBgPmAgYW5kIGAvYAor ICAgICAqIGRvbid0IHJlcXVpcmUgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFs IG1lYW5pbmcgdW5sZXNzIHRoZXkncmUgcGFydAorICAgICAqIG9mIGEgdGFnIG9yIGFuIHVucXVv dGVkIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rl cy9hbWJpZ3VvdXMtYW1wZXJzYW5kcyAodW5kZXIgInNlbWktcmVsYXRlZCBmdW4gZmFjdCIpCisg ICAgICovCisgICAgdmFyIGh0bWxFc2NhcGVzID0geworICAgICAgJyYnOiAnJmFtcDsnLAorICAg ICAgJzwnOiAnJmx0OycsCisgICAgICAnPic6ICcmZ3Q7JywKKyAgICAgICciJzogJyZxdW90Oycs CisgICAgICAiJyI6ICcmIzM5OycKKyAgICB9OworCisgICAgLyoqIFVzZWQgdG8gY29udmVydCBI VE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMgKi8KKyAgICB2YXIgaHRtbFVuZXNjYXBlcyA9IGlu dmVydChodG1sRXNjYXBlcyk7CisKKyAgICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVz IGFuZCBIVE1MIGNoYXJhY3RlcnMgKi8KKyAgICB2YXIgcmVFc2NhcGVkSHRtbCA9IFJlZ0V4cCgn KCcgKyBrZXlzKGh0bWxVbmVzY2FwZXMpLmpvaW4oJ3wnKSArICcpJywgJ2cnKSwKKyAgICAgICAg cmVVbmVzY2FwZWRIdG1sID0gUmVnRXhwKCdbJyArIGtleXMoaHRtbEVzY2FwZXMpLmpvaW4oJycp ICsgJ10nLCAnZycpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAg ICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdChz KSB0byB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBvYmplY3QuIFN1YnNlcXVlbnQgc291cmNlcyB3 aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cworICAgICAqIHNv dXJjZXMuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBw cm9kdWNlIHRoZQorICAgICAqIGFzc2lnbmVkIHZhbHVlcy4gVGhlIGNhbGxiYWNrIGlzIGJvdW5k IHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHR3bworICAgICAqIGFyZ3VtZW50czsgKG9i amVjdFZhbHVlLCBzb3VyY2VWYWx1ZSkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICog QG1lbWJlck9mIF8KKyAgICAgKiBAdHlwZSBGdW5jdGlvbgorICAgICAqIEBhbGlhcyBleHRlbmQK KyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qg VGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJj ZV0gVGhlIHNvdXJjZSBvYmplY3RzLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFj a10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25pbmcgdmFsdWVzLgorICAgICAqIEBw YXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAg ICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAg ICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5hc3NpZ24oeyAnbmFtZSc6ICdmcmVkJyB9 LCB7ICdlbXBsb3llcic6ICdzbGF0ZScgfSk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVk JywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9CisgICAgICoKKyAgICAgKiB2YXIgZGVmYXVsdHMgPSBf LnBhcnRpYWxSaWdodChfLmFzc2lnbiwgZnVuY3Rpb24oYSwgYikgeworICAgICAqICAgcmV0dXJu IHR5cGVvZiBhID09ICd1bmRlZmluZWQnID8gYiA6IGE7CisgICAgICogfSk7CisgICAgICoKKyAg ICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdiYXJuZXknIH07CisgICAgICogZGVmYXVsdHMo b2JqZWN0LCB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOworICAgICAq IC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9CisgICAgICov CisgICAgdmFyIGFzc2lnbiA9IGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBndWFyZCkgeworICAg ICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IG9iamVjdCwgcmVzdWx0ID0gaXRlcmFibGU7CisgICAg ICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0OworICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVu dHMsCisgICAgICAgICAgYXJnc0luZGV4ID0gMCwKKyAgICAgICAgICBhcmdzTGVuZ3RoID0gdHlw ZW9mIGd1YXJkID09ICdudW1iZXInID8gMiA6IGFyZ3MubGVuZ3RoOworICAgICAgaWYgKGFyZ3NM ZW5ndGggPiAzICYmIHR5cGVvZiBhcmdzW2FyZ3NMZW5ndGggLSAyXSA9PSAnZnVuY3Rpb24nKSB7 CisgICAgICAgIHZhciBjYWxsYmFjayA9IGJhc2VDcmVhdGVDYWxsYmFjayhhcmdzWy0tYXJnc0xl bmd0aCAtIDFdLCBhcmdzW2FyZ3NMZW5ndGgtLV0sIDIpOworICAgICAgfSBlbHNlIGlmIChhcmdz TGVuZ3RoID4gMiAmJiB0eXBlb2YgYXJnc1thcmdzTGVuZ3RoIC0gMV0gPT0gJ2Z1bmN0aW9uJykg eworICAgICAgICBjYWxsYmFjayA9IGFyZ3NbLS1hcmdzTGVuZ3RoXTsKKyAgICAgIH0KKyAgICAg IHdoaWxlICgrK2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsKKyAgICAgICAgaXRlcmFibGUgPSBh cmdzW2FyZ3NJbmRleF07CisgICAgICAgIGlmIChpdGVyYWJsZSAmJiBvYmplY3RUeXBlc1t0eXBl b2YgaXRlcmFibGVdKSB7CisgICAgICAgIHZhciBvd25JbmRleCA9IC0xLAorICAgICAgICAgICAg b3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdICYmIGtleXMoaXRlcmFibGUp LAorICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBvd25Qcm9wcy5sZW5ndGggOiAwOwor CisgICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgaW5kZXgg PSBvd25Qcm9wc1tvd25JbmRleF07CisgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNhbGxiYWNr ID8gY2FsbGJhY2socmVzdWx0W2luZGV4XSwgaXRlcmFibGVbaW5kZXhdKSA6IGl0ZXJhYmxlW2lu ZGV4XTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0 CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdmFsdWVgLiBJ ZiBgaXNEZWVwYCBpcyBgdHJ1ZWAgbmVzdGVkIG9iamVjdHMgd2lsbCBhbHNvCisgICAgICogYmUg Y2xvbmVkLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGFzc2lnbmVkIGJ5IHJlZmVyZW5jZS4gSWYg YSBjYWxsYmFjaworICAgICAqIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcHJv ZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgdGhlCisgICAgICogY2FsbGJhY2sgcmV0dXJucyBg dW5kZWZpbmVkYCBjbG9uaW5nIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQu CisgICAgICogVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3 aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsq fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNE ZWVwPWZhbHNlXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9u fSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZyB2YWx1ZXMuCisg ICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFj a2AuCisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS4KKyAgICAg KiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7 ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVk JywgICAnYWdlJzogNDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiB2YXIgc2hhbGxvdyA9 IF8uY2xvbmUoY2hhcmFjdGVycyk7CisgICAgICogc2hhbGxvd1swXSA9PT0gY2hhcmFjdGVyc1sw XTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmUo Y2hhcmFjdGVycywgdHJ1ZSk7CisgICAgICogZGVlcFswXSA9PT0gY2hhcmFjdGVyc1swXTsKKyAg ICAgKiAvLyA9PiBmYWxzZQorICAgICAqCisgICAgICogXy5taXhpbih7CisgICAgICogICAnY2xv bmUnOiBfLnBhcnRpYWxSaWdodChfLmNsb25lLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAqICAg ICByZXR1cm4gXy5pc0VsZW1lbnQodmFsdWUpID8gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKSA6IHVu ZGVmaW5lZDsKKyAgICAgKiAgIH0pCisgICAgICogfSk7CisgICAgICoKKyAgICAgKiB2YXIgY2xv bmUgPSBfLmNsb25lKGRvY3VtZW50LmJvZHkpOworICAgICAqIGNsb25lLmNoaWxkTm9kZXMubGVu Z3RoOworICAgICAqIC8vID0+IDAKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSwg aXNEZWVwLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0 aCAiQ29sbGVjdGlvbnMiIG1ldGhvZHMgd2l0aG91dCB1c2luZyB0aGVpciBgaW5kZXhgCisgICAg ICAvLyBhbmQgYGNvbGxlY3Rpb25gIGFyZ3VtZW50cyBmb3IgYGlzRGVlcGAgYW5kIGBjYWxsYmFj a2AKKyAgICAgIGlmICh0eXBlb2YgaXNEZWVwICE9ICdib29sZWFuJyAmJiBpc0RlZXAgIT0gbnVs bCkgeworICAgICAgICB0aGlzQXJnID0gY2FsbGJhY2s7CisgICAgICAgIGNhbGxiYWNrID0gaXNE ZWVwOworICAgICAgICBpc0RlZXAgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNl Q2xvbmUodmFsdWUsIGlzRGVlcCwgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgJiYgYmFz ZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSk7CisgICAgfQorCisgICAgLyoq CisgICAgICogQ3JlYXRlcyBhIGRlZXAgY2xvbmUgb2YgYHZhbHVlYC4gSWYgYSBjYWxsYmFjayBp cyBwcm92aWRlZCBpdCB3aWxsIGJlCisgICAgICogZXhlY3V0ZWQgdG8gcHJvZHVjZSB0aGUgY2xv bmVkIHZhbHVlcy4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYHVuZGVmaW5lZGAKKyAgICAgKiBj bG9uaW5nIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBjYWxsYmFj ayBpcyBib3VuZCB0bworICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIG9uZSBhcmd1 bWVudDsgKHZhbHVlKS4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGxvb3Nl bHkgYmFzZWQgb24gdGhlIHN0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtLiBGdW5jdGlvbnMKKyAg ICAgKiBhbmQgRE9NIG5vZGVzIGFyZSAqKm5vdCoqIGNsb25lZC4gVGhlIGVudW1lcmFibGUgcHJv cGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFuZAorICAgICAqIG9iamVjdHMgY3JlYXRl ZCBieSBjb25zdHJ1Y3RvcnMgb3RoZXIgdGhhbiBgT2JqZWN0YCBhcmUgY2xvbmVkIHRvIHBsYWlu IGBPYmplY3RgIG9iamVjdHMuCisgICAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1 L2luZnJhc3RydWN0dXJlLmh0bWwjaW50ZXJuYWwtc3RydWN0dXJlZC1jbG9uaW5nLWFsZ29yaXRo bS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBj YXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZGVl cCBjbG9uZS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlv biB0byBjdXN0b21pemUgY2xvbmluZyB2YWx1ZXMuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0Fy Z10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMgeyp9 IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoK KyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5Jywg J2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9Cisg ICAgICogXTsKKyAgICAgKgorICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAoY2hhcmFjdGVy cyk7CisgICAgICogZGVlcFswXSA9PT0gY2hhcmFjdGVyc1swXTsKKyAgICAgKiAvLyA9PiBmYWxz ZQorICAgICAqCisgICAgICogdmFyIHZpZXcgPSB7CisgICAgICogICAnbGFiZWwnOiAnZG9jcycs CisgICAgICogICAnbm9kZSc6IGVsZW1lbnQKKyAgICAgKiB9OworICAgICAqCisgICAgICogdmFy IGNsb25lID0gXy5jbG9uZURlZXAodmlldywgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgKiAgIHJl dHVybiBfLmlzRWxlbWVudCh2YWx1ZSkgPyB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSkgOiB1bmRlZmlu ZWQ7CisgICAgICogfSk7CisgICAgICoKKyAgICAgKiBjbG9uZS5ub2RlID09IHZpZXcubm9kZTsK KyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1 ZSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIHRy dWUsIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhj YWxsYmFjaywgdGhpc0FyZywgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMg YW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gYHByb3RvdHlwZWAgb2JqZWN0 LiBJZiBhCisgICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBwcm92aWRlZCBpdHMgb3duIGVu dW1lcmFibGUgcHJvcGVydGllcyBhcmUgYXNzaWduZWQKKyAgICAgKiB0byB0aGUgY3JlYXRlZCBv YmplY3QuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg KiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhl IG9iamVjdCB0byBpbmhlcml0IGZyb20uCisgICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0 aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC4KKyAgICAgKiBAcmV0 dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICAgICAqIEBleGFtcGxlCisg ICAgICoKKyAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHsKKyAgICAgKiAgIHRoaXMueCA9IDA7Cisg ICAgICogICB0aGlzLnkgPSAwOworICAgICAqIH0KKyAgICAgKgorICAgICAqIGZ1bmN0aW9uIENp cmNsZSgpIHsKKyAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7CisgICAgICogfQorICAgICAqCisg ICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwgeyAnY29u c3RydWN0b3InOiBDaXJjbGUgfSk7CisgICAgICoKKyAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENp cmNsZTsKKyAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7CisgICAgICogLy8gPT4gdHJ1 ZQorICAgICAqCisgICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7CisgICAgICogLy8gPT4g dHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMp IHsKKyAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7CisgICAgICByZXR1 cm4gcHJvcGVydGllcyA/IGFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpIDogcmVzdWx0OworICAg IH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBv ZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqIG9iamVjdCBmb3Ig YWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBP bmNlIGEKKyAgICAgKiBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgZGVmYXVsdHMgb2YgdGhl IHNhbWUgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdv cnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9u IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZV0gVGhlIHNvdXJjZSBv YmplY3RzLgorICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBBbGxvd3Mgd29ya2luZyB3 aXRoIGBfLnJlZHVjZWAgd2l0aG91dCB1c2luZyBpdHMKKyAgICAgKiAgYGtleWAgYW5kIGBvYmpl Y3RgIGFyZ3VtZW50cyBhcyBzb3VyY2VzLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVy bnMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnYmFybmV5JyB9OworICAgICAqIF8uZGVmYXVsdHMo b2JqZWN0LCB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH0pOworICAgICAq IC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9CisgICAgICov CisgICAgdmFyIGRlZmF1bHRzID0gZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIGd1YXJkKSB7Cisg ICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBpdGVyYWJsZTsKKyAg ICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7CisgICAgICB2YXIgYXJncyA9IGFyZ3Vt ZW50cywKKyAgICAgICAgICBhcmdzSW5kZXggPSAwLAorICAgICAgICAgIGFyZ3NMZW5ndGggPSB0 eXBlb2YgZ3VhcmQgPT0gJ251bWJlcicgPyAyIDogYXJncy5sZW5ndGg7CisgICAgICB3aGlsZSAo KythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CisgICAgICAgIGl0ZXJhYmxlID0gYXJnc1thcmdz SW5kZXhdOworICAgICAgICBpZiAoaXRlcmFibGUgJiYgb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJh YmxlXSkgeworICAgICAgICB2YXIgb3duSW5kZXggPSAtMSwKKyAgICAgICAgICAgIG93blByb3Bz ID0gb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSAmJiBrZXlzKGl0ZXJhYmxlKSwKKyAgICAg ICAgICAgIGxlbmd0aCA9IG93blByb3BzID8gb3duUHJvcHMubGVuZ3RoIDogMDsKKworICAgICAg ICB3aGlsZSAoKytvd25JbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIGluZGV4ID0gb3duUHJv cHNbb3duSW5kZXhdOworICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2luZGV4XSA9PSAndW5k ZWZpbmVkJykgcmVzdWx0W2luZGV4XSA9IGl0ZXJhYmxlW2luZGV4XTsKKyAgICAgICAgfQorICAg ICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgor ICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBy ZXR1cm5zIHRoZSBrZXkgb2YgdGhlCisgICAgICogZmlyc3QgZWxlbWVudCB0aGF0IHBhc3NlcyB0 aGUgY2FsbGJhY2sgY2hlY2ssIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgorICAgICAq CisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRo ZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRo ZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElm IGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVy ZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRz IHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVs c2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor ICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBU aGUgb2JqZWN0IHRvIHNlYXJjaC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJp bmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIKKyAgICAgKiAg aXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdp bGwgYmUgdXNlZCB0bworICAgICAqICBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0 eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10g VGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge3N0cmlu Z3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBg dW5kZWZpbmVkYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3Rl cnMgPSB7CisgICAgICogICAnYmFybmV5JzogeyAgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNl IH0sCisgICAgICogICAnZnJlZCc6IHsgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfSwK KyAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdibG9ja2VkJzogZmFsc2UgfQorICAg ICAqIH07CisgICAgICoKKyAgICAgKiBfLmZpbmRLZXkoY2hhcmFjdGVycywgZnVuY3Rpb24oY2hy KSB7CisgICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQwOworICAgICAqIH0pOworICAgICAqIC8v ID0+ICdiYXJuZXknIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52 aXJvbm1lbnRzKQorICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNo b3J0aGFuZAorICAgICAqIF8uZmluZEtleShjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAxIH0pOworICAg ICAqIC8vID0+ICdwZWJibGVzJworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNh bGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmluZEtleShjaGFyYWN0ZXJzLCAnYmxvY2tlZCcp OworICAgICAqIC8vID0+ICdmcmVkJworICAgICAqLworICAgIGZ1bmN0aW9uIGZpbmRLZXkob2Jq ZWN0LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIHJlc3VsdDsKKyAgICAgIGNhbGxi YWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAg IGZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgeworICAgICAgICBp ZiAoY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkgeworICAgICAgICAgIHJlc3VsdCA9IGtl eTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAg cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBs aWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAg ICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICoKKyAg ICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNy ZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHBy b3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4g b2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBz dHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhh dCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBg ZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAg ICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBv YmplY3QgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30g W2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlcgorICAgICAqICBpdGVy YXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBi ZSB1c2VkIHRvCisgICAgICogIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUg Y2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg YHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVu ZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRl ZmluZWRgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9 IHsKKyAgICAgKiAgICdiYXJuZXknOiB7ICAnYWdlJzogMzYsICdibG9ja2VkJzogdHJ1ZSB9LAor ICAgICAqICAgJ2ZyZWQnOiB7ICAgICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiBmYWxzZSB9LAorICAg ICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAgKiB9 OworICAgICAqCisgICAgICogXy5maW5kTGFzdEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIp IHsKKyAgICAgKiAgIHJldHVybiBjaHIuYWdlIDwgNDA7CisgICAgICogfSk7CisgICAgICogLy8g PT4gcmV0dXJucyBgcGViYmxlc2AsIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgYGJhcm5l eWAKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQK KyAgICAgKiBfLmZpbmRMYXN0S2V5KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDQwIH0pOworICAgICAq IC8vID0+ICdmcmVkJworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNr IHNob3J0aGFuZAorICAgICAqIF8uZmluZExhc3RLZXkoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsK KyAgICAgKiAvLyA9PiAncGViYmxlcycKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmaW5kTGFzdEtl eShvYmplY3QsIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0OworICAgICAg Y2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOwor ICAgICAgZm9yT3duUmlnaHQob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsK KyAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCkpIHsKKyAgICAgICAgICBy ZXN1bHQgPSBrZXk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9 KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0 ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2Jq ZWN0LAorICAgICAqIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggcHJvcGVydHkuIFRo ZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AKKyAgICAgKiBhbmQgaW52b2tlZCB3aXRo IHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBrZXksIG9iamVjdCkuIENhbGxiYWNrcyBtYXkgZXhp dAorICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2Vg LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5 cGUgRnVuY3Rpb24KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2Jq ZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtG dW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVy YXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9m IGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4K KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogZnVuY3Rpb24gU2hhcGUoKSB7CisgICAg ICogICB0aGlzLnggPSAwOworICAgICAqICAgdGhpcy55ID0gMDsKKyAgICAgKiB9CisgICAgICoK KyAgICAgKiBTaGFwZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKHgsIHkpIHsKKyAgICAgKiAg IHRoaXMueCArPSB4OworICAgICAqICAgdGhpcy55ICs9IHk7CisgICAgICogfTsKKyAgICAgKgor ICAgICAqIF8uZm9ySW4obmV3IFNoYXBlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICog ICBjb25zb2xlLmxvZyhrZXkpOworICAgICAqIH0pOworICAgICAqIC8vID0+IGxvZ3MgJ3gnLCAn eScsIGFuZCAnbW92ZScgKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBl bnZpcm9ubWVudHMpCisgICAgICovCisgICAgdmFyIGZvckluID0gZnVuY3Rpb24oY29sbGVjdGlv biwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBpbmRleCwgaXRlcmFibGUgPSBjb2xs ZWN0aW9uLCByZXN1bHQgPSBpdGVyYWJsZTsKKyAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiBy ZXN1bHQ7CisgICAgICBpZiAoIW9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHJldHVybiBy ZXN1bHQ7CisgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIHR5cGVvZiB0aGlzQXJnID09ICd1 bmRlZmluZWQnID8gY2FsbGJhY2sgOiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNB cmcsIDMpOworICAgICAgICBmb3IgKGluZGV4IGluIGl0ZXJhYmxlKSB7CisgICAgICAgICAgaWYg KGNhbGxiYWNrKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkg cmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH07CisK KyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhh dCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgICAgICogb2YgYSBgY29sbGVjdGlvbmAgaW4g dGhlIG9wcG9zaXRlIG9yZGVyLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0g b2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rp b259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9u LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2Fs bGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAg ICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkgeworICAgICAqICAg dGhpcy54ID0gMDsKKyAgICAgKiAgIHRoaXMueSA9IDA7CisgICAgICogfQorICAgICAqCisgICAg ICogU2hhcGUucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbih4LCB5KSB7CisgICAgICogICB0aGlz LnggKz0geDsKKyAgICAgKiAgIHRoaXMueSArPSB5OworICAgICAqIH07CisgICAgICoKKyAgICAg KiBfLmZvckluUmlnaHQobmV3IFNoYXBlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICog ICBjb25zb2xlLmxvZyhrZXkpOworICAgICAqIH0pOworICAgICAqIC8vID0+IGxvZ3MgJ21vdmUn LCAneScsIGFuZCAneCcgYXNzdW1pbmcgYF8uZm9ySW4gYCBsb2dzICd4JywgJ3knLCBhbmQgJ21v dmUnCisgICAgICovCisgICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGNhbGxiYWNrLCB0 aGlzQXJnKSB7CisgICAgICB2YXIgcGFpcnMgPSBbXTsKKworICAgICAgZm9ySW4ob2JqZWN0LCBm dW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICAgIHBhaXJzLnB1c2goa2V5LCB2YWx1ZSk7Cisg ICAgICB9KTsKKworICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzLmxlbmd0aDsKKyAgICAgIGNhbGxi YWNrID0gYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIHdo aWxlIChsZW5ndGgtLSkgeworICAgICAgICBpZiAoY2FsbGJhY2socGFpcnNbbGVuZ3RoLS1dLCBw YWlyc1tsZW5ndGhdLCBvYmplY3QpID09PSBmYWxzZSkgeworICAgICAgICAgIGJyZWFrOworICAg ICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIC8qKgor ICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmpl Y3QsIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sKKyAgICAgKiBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhl IGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCisg ICAgICogYXJndW1lbnRzOyAodmFsdWUsIGtleSwgb2JqZWN0KS4gQ2FsbGJhY2tzIG1heSBleGl0 IGl0ZXJhdGlvbiBlYXJseSBieQorICAgICAqIGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAu CisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAdHlw ZSBGdW5jdGlvbgorICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmpl Y3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1 bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJh dGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg YGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgor ICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmZvck93bih7ICcwJzogJ3plcm8nLCAn MSc6ICdvbmUnLCAnbGVuZ3RoJzogMiB9LCBmdW5jdGlvbihudW0sIGtleSkgeworICAgICAqICAg Y29uc29sZS5sb2coa2V5KTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBsb2dzICcwJywgJzEn LCBhbmQgJ2xlbmd0aCcgKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBl bnZpcm9ubWVudHMpCisgICAgICovCisgICAgdmFyIGZvck93biA9IGZ1bmN0aW9uKGNvbGxlY3Rp b24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gY29s bGVjdGlvbiwgcmVzdWx0ID0gaXRlcmFibGU7CisgICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4g cmVzdWx0OworICAgICAgaWYgKCFvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSByZXR1cm4g cmVzdWx0OworICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiB0eXBlb2YgdGhpc0FyZyA9PSAn dW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlz QXJnLCAzKTsKKyAgICAgICAgdmFyIG93bkluZGV4ID0gLTEsCisgICAgICAgICAgICBvd25Qcm9w cyA9IG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0gJiYga2V5cyhpdGVyYWJsZSksCisgICAg ICAgICAgICBsZW5ndGggPSBvd25Qcm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7CisKKyAgICAg ICAgd2hpbGUgKCsrb3duSW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICBpbmRleCA9IG93blBy b3BzW293bkluZGV4XTsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soaXRlcmFibGVbaW5kZXhdLCBp bmRleCwgY29sbGVjdGlvbikgPT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OworICAgICAgICB9Cisg ICAgICByZXR1cm4gcmVzdWx0CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9k IGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRz CisgICAgICogb2YgYSBgY29sbGVjdGlvbmAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLgorICAgICAq CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9i amVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0 ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNB cmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtP YmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAq IF8uZm9yT3duUmlnaHQoeyAnMCc6ICd6ZXJvJywgJzEnOiAnb25lJywgJ2xlbmd0aCc6IDIgfSwg ZnVuY3Rpb24obnVtLCBrZXkpIHsKKyAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CisgICAgICog fSk7CisgICAgICogLy8gPT4gbG9ncyAnbGVuZ3RoJywgJzEnLCBhbmQgJzAnIGFzc3VtaW5nIGBf LmZvck93bmAgbG9ncyAnMCcsICcxJywgYW5kICdsZW5ndGgnCisgICAgICovCisgICAgZnVuY3Rp b24gZm9yT3duUmlnaHQob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIHBy b3BzID0ga2V5cyhvYmplY3QpLAorICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKKwor ICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMp OworICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5n dGhdOworICAgICAgICBpZiAoY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KSA9PT0g ZmFsc2UpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0 dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc29ydGVkIGFy cmF5IG9mIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBlbnVtZXJhYmxlIHByb3BlcnRpZXMsCisgICAg ICogb3duIGFuZCBpbmhlcml0ZWQsIG9mIGBvYmplY3RgIHRoYXQgaGF2ZSBmdW5jdGlvbiB2YWx1 ZXMuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA YWxpYXMgbWV0aG9kcworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtP YmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0Fy cmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgaGF2ZSBmdW5jdGlv biB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uZnVuY3Rpb25zKF8p OworICAgICAqIC8vID0+IFsnYWxsJywgJ2FueScsICdiaW5kJywgJ2JpbmRBbGwnLCAnY2xvbmUn LCAnY29tcGFjdCcsICdjb21wb3NlJywgLi4uXQorICAgICAqLworICAgIGZ1bmN0aW9uIGZ1bmN0 aW9ucyhvYmplY3QpIHsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKKyAgICAgIGZvckluKG9iamVj dCwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkp IHsKKyAgICAgICAgICByZXN1bHQucHVzaChrZXkpOworICAgICAgICB9CisgICAgICB9KTsKKyAg ICAgIHJldHVybiByZXN1bHQuc29ydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNr cyBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgZXhpc3RzIGFzIGEgZGlyZWN0IHByb3Bl cnR5IG9mIGBvYmplY3RgLAorICAgICAqIGluc3RlYWQgb2YgYW4gaW5oZXJpdGVkIHByb3BlcnR5 LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3Qg dG8gaW5zcGVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBuYW1lIG9mIHRoZSBw cm9wZXJ0eSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1 ZWAgaWYga2V5IGlzIGEgZGlyZWN0IHByb3BlcnR5LCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4 YW1wbGUKKyAgICAgKgorICAgICAqIF8uaGFzKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCAn YicpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBoYXMob2JqZWN0 LCBrZXkpIHsKKyAgICAgIHJldHVybiBvYmplY3QgPyBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVj dCwga2V5KSA6IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2Jq ZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGdpdmVu IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAg ICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUg b2JqZWN0IHRvIGludmVydC4KKyAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBj cmVhdGVkIGludmVydGVkIG9iamVjdC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog Xy5pbnZlcnQoeyAnZmlyc3QnOiAnZnJlZCcsICdzZWNvbmQnOiAnYmFybmV5JyB9KTsKKyAgICAg KiAvLyA9PiB7ICdmcmVkJzogJ2ZpcnN0JywgJ2Jhcm5leSc6ICdzZWNvbmQnIH0KKyAgICAgKi8K KyAgICBmdW5jdGlvbiBpbnZlcnQob2JqZWN0KSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAg ICAgICAgICBwcm9wcyA9IGtleXMob2JqZWN0KSwKKyAgICAgICAgICBsZW5ndGggPSBwcm9wcy5s ZW5ndGgsCisgICAgICAgICAgcmVzdWx0ID0ge307CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwg bGVuZ3RoKSB7CisgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CisgICAgICAgIHJlc3Vs dFtvYmplY3Rba2V5XV0gPSBrZXk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAg IH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiB2YWx1 ZS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBj YXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hl Y2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFs dWVgIGlzIGEgYm9vbGVhbiB2YWx1ZSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisg ICAgICoKKyAgICAgKiBfLmlzQm9vbGVhbihudWxsKTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAg ICAqLworICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVl ID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fAorICAgICAgICB2YWx1ZSAmJiB0eXBlb2Yg dmFsdWUgPT0gJ29iamVjdCcgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYm9vbENsYXNzIHx8 IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEg ZGF0ZS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAq IEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8g Y2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBg dmFsdWVgIGlzIGEgZGF0ZSwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoK KyAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqLwor ICAgIGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVv ZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBkYXRlQ2xhc3Mg fHwgZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMg YSBET00gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUg dmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVg IGlmIHRoZSBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBA ZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7CisgICAg ICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkgewor ICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLm5vZGVUeXBlID09PSAxIHx8IGZhbHNlOworICAg IH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGVtcHR5LiBBcnJheXMs IHN0cmluZ3MsIG9yIGBhcmd1bWVudHNgIG9iamVjdHMgd2l0aCBhCisgICAgICogbGVuZ3RoIG9m IGAwYCBhbmQgb2JqZWN0cyB3aXRoIG5vIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYXJlIGNv bnNpZGVyZWQKKyAgICAgKiAiZW1wdHkiLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0ge0Fy cmF5fE9iamVjdHxzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgorICAgICAqIEBy ZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBlbXB0eSwg ZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmlzRW1wdHko WzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAgICAqCisgICAgICogXy5pc0VtcHR5 KHt9KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBfLmlzRW1wdHkoJycpOwor ICAgICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7 CisgICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAg cmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5j YWxsKHZhbHVlKSwKKyAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7CisKKyAgICAgIGlm ICgoY2xhc3NOYW1lID09IGFycmF5Q2xhc3MgfHwgY2xhc3NOYW1lID09IHN0cmluZ0NsYXNzIHx8 IGNsYXNzTmFtZSA9PSBhcmdzQ2xhc3MgKSB8fAorICAgICAgICAgIChjbGFzc05hbWUgPT0gb2Jq ZWN0Q2xhc3MgJiYgdHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyAmJiBpc0Z1bmN0aW9uKHZhbHVl LnNwbGljZSkpKSB7CisgICAgICAgIHJldHVybiAhbGVuZ3RoOworICAgICAgfQorICAgICAgZm9y T3duKHZhbHVlLCBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBmYWxzZSk7 CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAg ICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVy bWluZSBpZiB0aGV5IGFyZQorICAgICAqIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci4gSWYgYSBj YWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkCisgICAgICogdG8gY29tcGFy ZSB2YWx1ZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNvbXBhcmlzb25z IHdpbGwKKyAgICAgKiBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxi YWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKKyAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFy Z3VtZW50czsgKGEsIGIpLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJP ZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IGEgVGhlIHZh bHVlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHsqfSBiIFRoZSBvdGhlciB2YWx1ZSB0byBj b21wYXJlLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9u IHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNB cmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHti b29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNl IGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7 ICduYW1lJzogJ2ZyZWQnIH07CisgICAgICogdmFyIGNvcHkgPSB7ICduYW1lJzogJ2ZyZWQnIH07 CisgICAgICoKKyAgICAgKiBvYmplY3QgPT0gY29weTsKKyAgICAgKiAvLyA9PiBmYWxzZQorICAg ICAqCisgICAgICogXy5pc0VxdWFsKG9iamVjdCwgY29weSk7CisgICAgICogLy8gPT4gdHJ1ZQor ICAgICAqCisgICAgICogdmFyIHdvcmRzID0gWydoZWxsbycsICdnb29kYnllJ107CisgICAgICog dmFyIG90aGVyV29yZHMgPSBbJ2hpJywgJ2dvb2RieWUnXTsKKyAgICAgKgorICAgICAqIF8uaXNF cXVhbCh3b3Jkcywgb3RoZXJXb3JkcywgZnVuY3Rpb24oYSwgYikgeworICAgICAqICAgdmFyIHJl R3JlZXQgPSAvXig/OmhlbGxvfGhpKSQvaSwKKyAgICAgKiAgICAgICBhR3JlZXQgPSBfLmlzU3Ry aW5nKGEpICYmIHJlR3JlZXQudGVzdChhKSwKKyAgICAgKiAgICAgICBiR3JlZXQgPSBfLmlzU3Ry aW5nKGIpICYmIHJlR3JlZXQudGVzdChiKTsKKyAgICAgKgorICAgICAqICAgcmV0dXJuIChhR3Jl ZXQgfHwgYkdyZWV0KSA/IChhR3JlZXQgPT0gYkdyZWV0KSA6IHVuZGVmaW5lZDsKKyAgICAgKiB9 KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNFcXVhbChhLCBi LCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKGEsIGIsIHR5 cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFj aywgdGhpc0FyZywgMikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFs dWVgIGlzLCBvciBjYW4gYmUgY29lcmNlZCB0bywgYSBmaW5pdGUgbnVtYmVyLgorICAgICAqCisg ICAgICogTm90ZTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc0Zpbml0ZWAgd2hp Y2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3IKKyAgICAgKiBib29sZWFucyBhbmQgZW1wdHkgc3RyaW5n cy4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjUuCisgICAgICoKKyAgICAgKiBA c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAg ICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm5z IHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBmaW5pdGUsIGVsc2Ug YGZhbHNlYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc0Zpbml0ZSgtMTAx KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBfLmlzRmluaXRlKCcxMCcpOwor ICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8uaXNGaW5pdGUodHJ1ZSk7CisgICAg ICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8uaXNGaW5pdGUoJycpOworICAgICAqIC8v ID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTsKKyAgICAgKiAv LyA9PiBmYWxzZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7CisgICAg ICByZXR1cm4gbmF0aXZlSXNGaW5pdGUodmFsdWUpICYmICFuYXRpdmVJc05hTihwYXJzZUZsb2F0 KHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMg YSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor ICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFs dWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlm IHRoZSBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogXy5pc0Z1bmN0aW9uKF8pOworICAgICAqIC8vID0+IHRydWUKKyAg ICAgKi8KKyAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlw ZW9mIHZhbHVlID09ICdmdW5jdGlvbic7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tz IGlmIGB2YWx1ZWAgaXMgdGhlIGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0LgorICAgICAqIChlLmcu IGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFu ZCBgbmV3IFN0cmluZygnJylgKQorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVl IFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBg dHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgICAgICog QGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNPYmplY3Qoe30pOworICAgICAqIC8vID0+IHRy dWUKKyAgICAgKgorICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTsKKyAgICAgKiAvLyA9PiB0 cnVlCisgICAgICoKKyAgICAgKiBfLmlzT2JqZWN0KDEpOworICAgICAqIC8vID0+IGZhbHNlCisg ICAgICovCisgICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKKyAgICAgIC8vIGNoZWNrIGlm IHRoZSB2YWx1ZSBpcyB0aGUgRUNNQVNjcmlwdCBsYW5ndWFnZSB0eXBlIG9mIE9iamVjdAorICAg ICAgLy8gaHR0cDovL2VzNS5naXRodWIuaW8vI3g4CisgICAgICAvLyBhbmQgYXZvaWQgYSBWOCBi dWcKKyAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lk PTIyOTEKKyAgICAgIHJldHVybiAhISh2YWx1ZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgdmFsdWVd KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC4K KyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIG5hdGl2ZSBgaXNO YU5gIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IKKyAgICAgKiBgdW5kZWZpbmVkYCBhbmQg b3RoZXIgbm9uLW51bWVyaWMgdmFsdWVzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4x LjIuNC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAq IEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8g Y2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBg dmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor ICAgICAqIF8uaXNOYU4oTmFOKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBf LmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7CisgICAgICogLy8gPT4gdHJ1ZQorICAgICAqCisgICAg ICogaXNOYU4odW5kZWZpbmVkKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICoKKyAgICAgKiBf LmlzTmFOKHVuZGVmaW5lZCk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAgICBmdW5j dGlvbiBpc05hTih2YWx1ZSkgeworICAgICAgLy8gYE5hTmAgYXMgYSBwcmltaXRpdmUgaXMgdGhl IG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmCisgICAgICAvLyAocGVyZm9y bSB0aGUgW1tDbGFzc11dIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWUgaG9z dCBvYmplY3RzIGluIElFKQorICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAh PSArdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMg YG51bGxgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAg ICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0 byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhl IGB2YWx1ZWAgaXMgYG51bGxgLCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIF8uaXNOdWxsKG51bGwpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAg ICAqIF8uaXNOdWxsKHVuZGVmaW5lZCk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBpc051bGwodmFsdWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDsK KyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIG51bWJlci4K KyAgICAgKgorICAgICAqIE5vdGU6IGBOYU5gIGlzIGNvbnNpZGVyZWQgYSBudW1iZXIuIFNlZSBo dHRwOi8vZXM1LmdpdGh1Yi5pby8jeDguNS4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHsq fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJl dHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuCisg ICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNOdW1iZXIoOC40ICogNSk7CisgICAg ICogLy8gPT4gdHJ1ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7Cisg ICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8CisgICAgICAgIHZhbHVlICYm IHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBudW1i ZXJDbGFzcyB8fCBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYHZh bHVlYCBpcyBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuCisg ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdv cnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgor ICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEg cGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg ICAqIGZ1bmN0aW9uIFNoYXBlKCkgeworICAgICAqICAgdGhpcy54ID0gMDsKKyAgICAgKiAgIHRo aXMueSA9IDA7CisgICAgICogfQorICAgICAqCisgICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBT aGFwZSk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIF8uaXNQbGFpbk9iamVj dChbMSwgMiwgM10pOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmlzUGxh aW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICov CisgICAgdmFyIGlzUGxhaW5PYmplY3QgPSAhZ2V0UHJvdG90eXBlT2YgPyBzaGltSXNQbGFpbk9i amVjdCA6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAoISh2YWx1ZSAmJiB0b1N0cmluZy5j YWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg ICAgfQorICAgICAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mLAorICAgICAgICAgIG9ialBy b3RvID0gaXNOYXRpdmUodmFsdWVPZikgJiYgKG9ialByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFs dWVPZikpICYmIGdldFByb3RvdHlwZU9mKG9ialByb3RvKTsKKworICAgICAgcmV0dXJuIG9ialBy b3RvCisgICAgICAgID8gKHZhbHVlID09IG9ialByb3RvIHx8IGdldFByb3RvdHlwZU9mKHZhbHVl KSA9PSBvYmpQcm90bykKKyAgICAgICAgOiBzaGltSXNQbGFpbk9iamVjdCh2YWx1ZSk7CisgICAg fTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcmVndWxhciBleHBy ZXNzaW9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAg ICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0 byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhl IGB2YWx1ZWAgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sIGVsc2UgYGZhbHNlYC4KKyAgICAgKiBA ZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc1JlZ0V4cCgvZnJlZC8pOworICAgICAqIC8vID0+ IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZSkgeworICAgICAgcmV0 dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZh bHVlKSA9PSByZWdleHBDbGFzcyB8fCBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBD aGVja3MgaWYgYHZhbHVlYCBpcyBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFt IHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICogQHJldHVybnMge2Jvb2xlYW59 IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAu CisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaXNTdHJpbmcoJ2ZyZWQnKTsKKyAg ICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHsK KyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwKKyAgICAgICAgdmFsdWUg JiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0 cmluZ0NsYXNzIHx8IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBg dmFsdWVgIGlzIGB1bmRlZmluZWRgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IE9iamVjdHMKKyAgICAgKiBAcGFyYW0geyp9IHZh bHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJu cyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC4KKyAg ICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApOworICAg ICAqIC8vID0+IHRydWUKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkg eworICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJzsKKyAgICB9CisKKyAg ICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9i amVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWQgYnkKKyAgICAgKiBydW5uaW5nIGVhY2ggb3duIGVu dW1lcmFibGUgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhyb3VnaCB0aGUgY2FsbGJhY2suCisgICAg ICogVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRo cmVlIGFyZ3VtZW50czsKKyAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS4KKyAgICAgKgorICAg ICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3Jl YXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJv cGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBv YmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0 eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0 IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBm YWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAg KiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9i amVjdCB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3Ry aW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVy IGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3 aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBz dHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmdd IFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtBcnJh eX0gUmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCB2YWx1ZXMgb2YgdGhlIHJlc3VsdHMgb2YgZWFj aCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog Xy5tYXBWYWx1ZXMoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzfSAsIGZ1bmN0aW9uKG51bSkgeyBy ZXR1cm4gbnVtICogMzsgfSk7CisgICAgICogLy8gPT4geyAnYSc6IDMsICdiJzogNiwgJ2MnOiA5 IH0KKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0geworICAgICAqICAgJ2ZyZWQnOiB7 ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfSwKKyAgICAgKiAgICdwZWJibGVzJzogeyAnbmFt ZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEgfQorICAgICAqIH07CisgICAgICoKKyAgICAgKiAvLyB1 c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5tYXBWYWx1ZXMoY2hh cmFjdGVycywgJ2FnZScpOworICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAx IH0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBjYWxsYmFjaywgdGhp c0FyZykgeworICAgICAgdmFyIHJlc3VsdCA9IHt9OworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2gu Y3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICBmb3JPd24ob2Jq ZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKKyAgICAgICAgcmVzdWx0W2tleV0g PSBjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpOworICAgICAgfSk7CisgICAgICByZXR1cm4g cmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24g ZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBzb3VyY2Ugb2JqZWN0KHMpLCB0aGF0CisgICAg ICogZG9uJ3QgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBvYmpl Y3QuIFN1YnNlcXVlbnQgc291cmNlcworICAgICAqIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFz c2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuIElmIGEgY2FsbGJhY2sgaXMKKyAgICAgKiBw cm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMg b2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICogYW5kIHNvdXJjZSBwcm9wZXJ0aWVzLiBJZiB0aGUg Y2FsbGJhY2sgcmV0dXJucyBgdW5kZWZpbmVkYCBtZXJnaW5nIHdpbGwKKyAgICAgKiBiZSBoYW5k bGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlz QXJnYCBhbmQKKyAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czsgKG9iamVjdFZhbHVl LCBzb3VyY2VWYWx1ZSkuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9m IF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpl Y3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3Nv dXJjZV0gVGhlIHNvdXJjZSBvYmplY3RzLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxs YmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnaW5nIHByb3BlcnRpZXMuCisgICAg ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2Au CisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0 LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgbmFtZXMgPSB7CisgICAgICog ICAnY2hhcmFjdGVycyc6IFsKKyAgICAgKiAgICAgeyAnbmFtZSc6ICdiYXJuZXknIH0sCisgICAg ICogICAgIHsgJ25hbWUnOiAnZnJlZCcgfQorICAgICAqICAgXQorICAgICAqIH07CisgICAgICoK KyAgICAgKiB2YXIgYWdlcyA9IHsKKyAgICAgKiAgICdjaGFyYWN0ZXJzJzogWworICAgICAqICAg ICB7ICdhZ2UnOiAzNiB9LAorICAgICAqICAgICB7ICdhZ2UnOiA0MCB9CisgICAgICogICBdCisg ICAgICogfTsKKyAgICAgKgorICAgICAqIF8ubWVyZ2UobmFtZXMsIGFnZXMpOworICAgICAqIC8v ID0+IHsgJ2NoYXJhY3RlcnMnOiBbeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwgeyAn bmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1dIH0KKyAgICAgKgorICAgICAqIHZhciBmb29kID0g eworICAgICAqICAgJ2ZydWl0cyc6IFsnYXBwbGUnXSwKKyAgICAgKiAgICd2ZWdldGFibGVzJzog WydiZWV0J10KKyAgICAgKiB9OworICAgICAqCisgICAgICogdmFyIG90aGVyRm9vZCA9IHsKKyAg ICAgKiAgICdmcnVpdHMnOiBbJ2JhbmFuYSddLAorICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2Nh cnJvdCddCisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8ubWVyZ2UoZm9vZCwgb3RoZXJGb29k LCBmdW5jdGlvbihhLCBiKSB7CisgICAgICogICByZXR1cm4gXy5pc0FycmF5KGEpID8gYS5jb25j YXQoYikgOiB1bmRlZmluZWQ7CisgICAgICogfSk7CisgICAgICogLy8gPT4geyAnZnJ1aXRzJzog WydhcHBsZScsICdiYW5hbmEnXSwgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnLCAnY2Fycm90XSB9Cisg ICAgICovCisgICAgZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KSB7CisgICAgICB2YXIgYXJncyA9IGFy Z3VtZW50cywKKyAgICAgICAgICBsZW5ndGggPSAyOworCisgICAgICBpZiAoIWlzT2JqZWN0KG9i amVjdCkpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgIH0KKyAgICAgIC8vIGFsbG93 cyB3b3JraW5nIHdpdGggYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgIHdpdGhvdXQgdXNp bmcKKyAgICAgIC8vIHRoZWlyIGBpbmRleGAgYW5kIGBjb2xsZWN0aW9uYCBhcmd1bWVudHMKKyAg ICAgIGlmICh0eXBlb2YgYXJnc1syXSAhPSAnbnVtYmVyJykgeworICAgICAgICBsZW5ndGggPSBh cmdzLmxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGlmIChsZW5ndGggPiAzICYmIHR5cGVvZiBhcmdz W2xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gYmFz ZUNyZWF0ZUNhbGxiYWNrKGFyZ3NbLS1sZW5ndGggLSAxXSwgYXJnc1tsZW5ndGgtLV0sIDIpOwor ICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzW2xlbmd0aCAtIDFdID09 ICdmdW5jdGlvbicpIHsKKyAgICAgICAgY2FsbGJhY2sgPSBhcmdzWy0tbGVuZ3RoXTsKKyAgICAg IH0KKyAgICAgIHZhciBzb3VyY2VzID0gc2xpY2UoYXJndW1lbnRzLCAxLCBsZW5ndGgpLAorICAg ICAgICAgIGluZGV4ID0gLTEsCisgICAgICAgICAgc3RhY2tBID0gZ2V0QXJyYXkoKSwKKyAgICAg ICAgICBzdGFja0IgPSBnZXRBcnJheSgpOworCisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0 aCkgeworICAgICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2VzW2luZGV4XSwgY2FsbGJhY2ss IHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgIH0KKyAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpOwor ICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQik7CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0K KworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGBvYmplY3RgIGV4 Y2x1ZGluZyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCisgICAgICogUHJvcGVydHkgbmFtZXMg bWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcyBhcnJheXMgb2YK KyAgICAgKiBwcm9wZXJ0eSBuYW1lcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxs IGJlIGV4ZWN1dGVkIGZvciBlYWNoCisgICAgICogcHJvcGVydHkgb2YgYG9iamVjdGAgb21pdHRp bmcgdGhlIHByb3BlcnRpZXMgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkKKyAgICAgKiBmb3Iu IFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJl ZSBhcmd1bWVudHM7CisgICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuCisgICAgICoKKyAgICAg KiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cwor ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuCisgICAgICog QHBhcmFtIHtGdW5jdGlvbnwuLi5zdHJpbmd8c3RyaW5nW119IFtjYWxsYmFja10gVGhlIHByb3Bl cnRpZXMgdG8gb21pdCBvciB0aGUKKyAgICAgKiAgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRp b24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBj YWxsYmFja2AuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0 aG91dCB0aGUgb21pdHRlZCBwcm9wZXJ0aWVzLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAg ICAgKiBfLm9taXQoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sICdhZ2UnKTsKKyAgICAg KiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH0KKyAgICAgKgorICAgICAqIF8ub21pdCh7ICduYW1l JzogJ2ZyZWQnLCAnYWdlJzogNDAgfSwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgKiAgIHJldHVy biB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcic7CisgICAgICogfSk7CisgICAgICogLy8gPT4geyAn bmFtZSc6ICdmcmVkJyB9CisgICAgICovCisgICAgZnVuY3Rpb24gb21pdChvYmplY3QsIGNhbGxi YWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0ID0ge307CisgICAgICBpZiAodHlwZW9m IGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdmFyIHByb3BzID0gW107CisgICAg ICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICAgIHByb3Bz LnB1c2goa2V5KTsKKyAgICAgICAgfSk7CisgICAgICAgIHByb3BzID0gYmFzZURpZmZlcmVuY2Uo cHJvcHMsIGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpKTsKKworICAgICAg ICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKKwor ICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIHZhciBrZXkgPSBw cm9wc1tpbmRleF07CisgICAgICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTsKKyAgICAg ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2Fs bGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgICBmb3JJbihvYmplY3QsIGZ1bmN0 aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgeworICAgICAgICAgIGlmICghY2FsbGJhY2sodmFsdWUs IGtleSwgb2JqZWN0KSkgeworICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKKyAgICAg ICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9 CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5IG9mIGFu IG9iamVjdCdzIGtleS12YWx1ZSBwYWlycywKKyAgICAgKiBpLmUuIGBbW2tleTEsIHZhbHVlMV0s IFtrZXkyLCB2YWx1ZTJdXWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0cworICAgICAqIEBwYXJhbSB7T2JqZWN0fSBv YmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0 dXJucyBuZXcgYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzLgorICAgICAqIEBleGFtcGxlCisgICAg ICoKKyAgICAgKiBfLnBhaXJzKHsgJ2Jhcm5leSc6IDM2LCAnZnJlZCc6IDQwIH0pOworICAgICAq IC8vID0+IFtbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdXSAocHJvcGVydHkgb3JkZXIgaXMg bm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cykKKyAgICAgKi8KKyAgICBmdW5jdGlv biBwYWlycyhvYmplY3QpIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIHByb3Bz ID0ga2V5cyhvYmplY3QpLAorICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAg ICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpOworCisgICAgICB3aGlsZSAoKytpbmRleCA8IGxl bmd0aCkgeworICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdOworICAgICAgICByZXN1bHRb aW5kZXhdID0gW2tleSwgb2JqZWN0W2tleV1dOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3Vs dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBg b2JqZWN0YCBjb21wb3NlZCBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuCisgICAgICogUHJv cGVydHkgbmFtZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBh cyBhcnJheXMgb2YKKyAgICAgKiBwcm9wZXJ0eSBuYW1lcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92 aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoCisgICAgICogcHJvcGVydHkgb2YgYG9i amVjdGAgcGlja2luZyB0aGUgcHJvcGVydGllcyB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVleQor ICAgICAqIGZvci4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tl ZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS4KKyAg ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29y eSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVj dC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufC4uLnN0cmluZ3xzdHJpbmdbXX0gW2NhbGxiYWNr XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlcgorICAgICAqICBpdGVyYXRpb24gb3IgcHJvcGVydHkg bmFtZXMgdG8gcGljaywgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgcHJvcGVydHkKKyAgICAgKiAg bmFtZXMgb3IgYXJyYXlzIG9mIHByb3BlcnR5IG5hbWVzLgorICAgICAqIEBwYXJhbSB7Kn0gW3Ro aXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5z IHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgcHJvcGVy dGllcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5waWNrKHsgJ25hbWUnOiAn ZnJlZCcsICdfdXNlcmlkJzogJ2ZyZWQxJyB9LCAnbmFtZScpOworICAgICAqIC8vID0+IHsgJ25h bWUnOiAnZnJlZCcgfQorICAgICAqCisgICAgICogXy5waWNrKHsgJ25hbWUnOiAnZnJlZCcsICdf dXNlcmlkJzogJ2ZyZWQxJyB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICogICByZXR1 cm4ga2V5LmNoYXJBdCgwKSAhPSAnXyc7CisgICAgICogfSk7CisgICAgICogLy8gPT4geyAnbmFt ZSc6ICdmcmVkJyB9CisgICAgICovCisgICAgZnVuY3Rpb24gcGljayhvYmplY3QsIGNhbGxiYWNr LCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0ID0ge307CisgICAgICBpZiAodHlwZW9mIGNh bGxiYWNrICE9ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAg ICAgICBwcm9wcyA9IGJhc2VGbGF0dGVuKGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIDEpLAorICAg ICAgICAgICAgbGVuZ3RoID0gaXNPYmplY3Qob2JqZWN0KSA/IHByb3BzLmxlbmd0aCA6IDA7CisK KyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICB2YXIga2V5ID0g cHJvcHNbaW5kZXhdOworICAgICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7CisgICAgICAgICAg ICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg ICAgfSBlbHNlIHsKKyAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2Fs bGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAgICBmb3JJbihvYmplY3QsIGZ1bmN0aW9uKHZhbHVl LCBrZXksIG9iamVjdCkgeworICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmpl Y3QpKSB7CisgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlOworICAgICAgICAgIH0KKyAg ICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8q KgorICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWAgdGhpcyBtZXRob2QgdHJhbnNm b3JtcyBgb2JqZWN0YCB0byBhIG5ldworICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNo IGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd24KKyAgICAgKiBlbnVtZXJh YmxlIHByb3BlcnRpZXMgdGhyb3VnaCBhIGNhbGxiYWNrLCB3aXRoIGVhY2ggY2FsbGJhY2sgZXhl Y3V0aW9uCisgICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2Jq ZWN0LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8KKyAgICAgKiBgdGhpc0FyZ2AgYW5kIGludm9r ZWQgd2l0aCBmb3VyIGFyZ3VtZW50czsgKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3Qp LgorICAgICAqIENhbGxiYWNrcyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRs eSByZXR1cm5pbmcgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtBcnJheXxP YmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0g e0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0 ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1 bXVsYXRvciB2YWx1ZS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJp bmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNj dW11bGF0ZWQgdmFsdWUuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBzcXVh cmVzID0gXy50cmFuc2Zvcm0oWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSwgZnVuY3Rp b24ocmVzdWx0LCBudW0pIHsKKyAgICAgKiAgIG51bSAqPSBudW07CisgICAgICogICBpZiAobnVt ICUgMikgeworICAgICAqICAgICByZXR1cm4gcmVzdWx0LnB1c2gobnVtKSA8IDM7CisgICAgICog ICB9CisgICAgICogfSk7CisgICAgICogLy8gPT4gWzEsIDksIDI1XQorICAgICAqCisgICAgICog dmFyIG1hcHBlZCA9IF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCBmdW5j dGlvbihyZXN1bHQsIG51bSwga2V5KSB7CisgICAgICogICByZXN1bHRba2V5XSA9IG51bSAqIDM7 CisgICAgICogfSk7CisgICAgICogLy8gPT4geyAnYSc6IDMsICdiJzogNiwgJ2MnOiA5IH0KKyAg ICAgKi8KKyAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBjYWxsYmFjaywgYWNjdW11bGF0 b3IsIHRoaXNBcmcpIHsKKyAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KTsKKyAgICAg IGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7CisgICAgICAgIGlmIChpc0FycikgeworICAgICAg ICAgIGFjY3VtdWxhdG9yID0gW107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGN0 b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLAorICAgICAgICAgICAgICBwcm90byA9 IGN0b3IgJiYgY3Rvci5wcm90b3R5cGU7CisKKyAgICAgICAgICBhY2N1bXVsYXRvciA9IGJhc2VD cmVhdGUocHJvdG8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoY2FsbGJhY2spIHsK KyAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNB cmcsIDQpOworICAgICAgICAoaXNBcnIgPyBmb3JFYWNoIDogZm9yT3duKShvYmplY3QsIGZ1bmN0 aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7CisgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGFj Y3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7CisgICAgICAgIH0pOworICAgICAgfQor ICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0 ZXMgYW4gYXJyYXkgY29tcG9zZWQgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IHZhbHVl cyBvZiBgb2JqZWN0YC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBPYmplY3RzCisgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVj dCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5z IGFuIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg ICAgICogXy52YWx1ZXMoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMgfSk7CisgICAg ICogLy8gPT4gWzEsIDIsIDNdIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jv c3MgZW52aXJvbm1lbnRzKQorICAgICAqLworICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHsK KyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3QpLAor ICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgICAgICByZXN1bHQgPSBBcnJh eShsZW5ndGgpOworCisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICBy ZXN1bHRbaW5kZXhdID0gb2JqZWN0W3Byb3BzW2luZGV4XV07CisgICAgICB9CisgICAgICByZXR1 cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoq CisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQg aW5kZXhlcywgb3Iga2V5cywgb2YgdGhlCisgICAgICogYGNvbGxlY3Rpb25gLiBJbmRleGVzIG1h eSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzCisgICAg ICogb2YgaW5kZXhlcy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2Jq ZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisg ICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdfHN0cmluZ3xzdHJpbmdbXSl9IFtpbmRl eF0gVGhlIGluZGV4ZXMgb2YgYGNvbGxlY3Rpb25gCisgICAgICogICB0byByZXRyaWV2ZSwgc3Bl Y2lmaWVkIGFzIGluZGl2aWR1YWwgaW5kZXhlcyBvciBhcnJheXMgb2YgaW5kZXhlcy4KKyAgICAg KiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgY29ycmVz cG9uZGluZyB0byB0aGUKKyAgICAgKiAgcHJvdmlkZWQgaW5kZXhlcy4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogXy5hdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddLCBbMCwgMiwg NF0pOworICAgICAqIC8vID0+IFsnYScsICdjJywgJ2UnXQorICAgICAqCisgICAgICogXy5hdChb J2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXSwgMCwgMik7CisgICAgICogLy8gPT4gWydmcmVk JywgJ3BlYmJsZXMnXQorICAgICAqLworICAgIGZ1bmN0aW9uIGF0KGNvbGxlY3Rpb24pIHsKKyAg ICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgIGluZGV4ID0gLTEsCisgICAgICAg ICAgcHJvcHMgPSBiYXNlRmxhdHRlbihhcmdzLCB0cnVlLCBmYWxzZSwgMSksCisgICAgICAgICAg bGVuZ3RoID0gKGFyZ3NbMl0gJiYgYXJnc1syXVthcmdzWzFdXSA9PT0gY29sbGVjdGlvbikgPyAx IDogcHJvcHMubGVuZ3RoLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CisKKyAg ICAgIHdoaWxlKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNv bGxlY3Rpb25bcHJvcHNbaW5kZXhdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gdmFsdWUgaXMgcHJlc2Vu dCBpbiBhIGNvbGxlY3Rpb24gdXNpbmcgc3RyaWN0IGVxdWFsaXR5CisgICAgICogZm9yIGNvbXBh cmlzb25zLCBpLmUuIGA9PT1gLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQgaXMgdXNl ZCBhcyB0aGUKKyAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgor ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFz IGluY2x1ZGUKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Fy cmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBv dmVyLgorICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBjaGVjayBmb3IuCisg ICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBm cm9tLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHRh cmdldGAgZWxlbWVudCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgorICAgICAqIEBleGFtcGxlCisg ICAgICoKKyAgICAgKiBfLmNvbnRhaW5zKFsxLCAyLCAzXSwgMSk7CisgICAgICogLy8gPT4gdHJ1 ZQorICAgICAqCisgICAgICogXy5jb250YWlucyhbMSwgMiwgM10sIDEsIDIpOworICAgICAqIC8v ID0+IGZhbHNlCisgICAgICoKKyAgICAgKiBfLmNvbnRhaW5zKHsgJ25hbWUnOiAnZnJlZCcsICdh Z2UnOiA0MCB9LCAnZnJlZCcpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAqIF8u Y29udGFpbnMoJ3BlYmJsZXMnLCAnZWInKTsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisg ICAgZnVuY3Rpb24gY29udGFpbnMoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgpIHsKKyAg ICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksCisg ICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCwKKyAg ICAgICAgICByZXN1bHQgPSBmYWxzZTsKKworICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCA8 IDAgPyBuYXRpdmVNYXgoMCwgbGVuZ3RoICsgZnJvbUluZGV4KSA6IGZyb21JbmRleCkgfHwgMDsK KyAgICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7CisgICAgICAgIHJlc3VsdCA9IGluZGV4 T2YoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgpID4gLTE7CisgICAgICB9IGVsc2UgaWYg KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgcmVzdWx0ID0gKGlzU3RyaW5n KGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbi5pbmRleE9mKHRhcmdldCwgZnJvbUluZGV4KSA6IGlu ZGV4T2YoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgpKSA+IC0xOworICAgICAgfSBlbHNl IHsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAg ICAgaWYgKCsraW5kZXggPj0gZnJvbUluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gIShyZXN1 bHQgPSB2YWx1ZSA9PT0gdGFyZ2V0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAg fQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVz IGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9m IHJ1bm5pbmcKKyAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocm91Z2ggdGhl IGNhbGxiYWNrLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZQorICAgICAqIG9mIGVhY2gga2V5IGlz IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNr LgorICAgICAqIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQg d2l0aCB0aHJlZSBhcmd1bWVudHM7CisgICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rp b24pLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBg Y2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdp bGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAg KgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3Jl YXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAg Zm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0 LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7 QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRl IG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9 aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYg YSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQKKyAg ICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaywg cmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmlu ZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl IGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg ICAqIF8uY291bnRCeShbNC4zLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0 aC5mbG9vcihudW0pOyB9KTsKKyAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH0KKyAgICAg KgorICAgICAqIF8uY291bnRCeShbNC4zLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1 cm4gdGhpcy5mbG9vcihudW0pOyB9LCBNYXRoKTsKKyAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYn OiAyIH0KKyAgICAgKgorICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwg J2xlbmd0aCcpOworICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfQorICAgICAqLworICAg IHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBr ZXkpIHsKKyAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtr ZXldKysgOiByZXN1bHRba2V5XSA9IDEpOworICAgIH0pOworCisgICAgLyoqCisgICAgICogQ2hl Y2tzIGlmIHRoZSBnaXZlbiBjYWxsYmFjayByZXR1cm5zIHRydWV5IHZhbHVlIGZvciAqKmFsbCoq IGVsZW1lbnRzIG9mCisgICAgICogYSBjb2xsZWN0aW9uLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQg dG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKKyAgICAgKiBhcmd1bWVudHM7ICh2 YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgYWxsCisg ICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8 c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBl bGVtZW50cyBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLAorICAgICAqICBlbHNlIGBmYWxzZWAu CisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGws ICd5ZXMnXSk7CisgICAgICogLy8gPT4gZmFsc2UKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0 ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKKyAgICAg KiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBdOworICAgICAqCisg ICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZXZl cnkoY2hhcmFjdGVycywgJ2FnZScpOworICAgICAqIC8vID0+IHRydWUKKyAgICAgKgorICAgICAq IC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmV2ZXJ5KGNo YXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOworICAgICAqIC8vID0+IGZhbHNlCisgICAgICovCisg ICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAg IHZhciByZXN1bHQgPSB0cnVlOworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJh Y2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAg ICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOworCisgICAg ICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB3aGlsZSAoKytpbmRl eCA8IGxlbmd0aCkgeworICAgICAgICAgIGlmICghKHJlc3VsdCA9ICEhY2FsbGJhY2soY29sbGVj dGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNv bGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAg IHJldHVybiAocmVzdWx0ID0gISFjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKTsK KyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAg IC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uLCByZXR1 cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzCisgICAgICogdGhlIGNhbGxiYWNrIHJldHVy bnMgdHJ1ZXkgZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZAorICAg ICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xs ZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBm b3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFj ayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisg ICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhl IGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRy dWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9i amVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg ICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgc2VsZWN0CisgICAgICogQGNhdGVnb3J5IENv bGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9u IFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9u fE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAor ICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHBy b3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3Ig Il8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsq fSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJl dHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgcGFzc2Vk IHRoZSBjYWxsYmFjayBjaGVjay4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFy IGV2ZW5zID0gXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBmdW5jdGlvbihudW0pIHsgcmV0 dXJuIG51bSAlIDIgPT0gMDsgfSk7CisgICAgICogLy8gPT4gWzIsIDQsIDZdCisgICAgICoKKyAg ICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2Fn ZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAg ICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICog Ly8gdXNpbmcgIl8ucGx1Y2siIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmlsdGVyKGNo YXJhY3RlcnMsICdibG9ja2VkJyk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnZnJlZCcsICdh Z2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH1dCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53 aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgeyAn YWdlJzogMzYgfSk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2 LCAnYmxvY2tlZCc6IGZhbHNlIH1dCisgICAgICovCisgICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxl Y3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAg ICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7 CisKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24g PyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdu dW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAg dmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYgKGNhbGxiYWNrKHZh bHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVl KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvck93 bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAg ICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkgeworICAgICAgICAg ICAgcmVzdWx0LnB1c2godmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9 CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVz IG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1l bnQgdGhhdAorICAgICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5IGZvci4gVGhlIGNhbGxi YWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQKKyAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUg YXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAg KiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0 ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3Bl cnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2Jq ZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHls ZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBo YXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFs c2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICog QGFsaWFzIGRldGVjdCwgZmluZFdoZXJlCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisg ICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0 aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJp bmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIg aXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdp bGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0 eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10g VGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMgeyp9IFJl dHVybnMgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuCisgICAgICogQGV4YW1w bGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6 ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICB7ICdu YW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9LAorICAgICAqICAg eyAnbmFtZSc6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYmxvY2tlZCc6IGZhbHNlIH0KKyAgICAg KiBdOworICAgICAqCisgICAgICogXy5maW5kKGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikgewor ICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCA0MDsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiB7 ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9CisgICAgICoK KyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5m aW5kKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CisgICAgICogLy8gPT4gIHsgJ25hbWUnOiAn cGViYmxlcycsICdhZ2UnOiAxLCAnYmxvY2tlZCc6IGZhbHNlIH0KKyAgICAgKgorICAgICAqIC8v IHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLmZpbmQoY2hhcmFj dGVycywgJ2Jsb2NrZWQnKTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzog NDAsICdibG9ja2VkJzogdHJ1ZSB9CisgICAgICovCisgICAgZnVuY3Rpb24gZmluZChjb2xsZWN0 aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRl Q2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICB2YXIgaW5kZXggPSAtMSwK KyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOwor CisgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB3aGlsZSAo KytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxlY3Rpb25baW5k ZXhdOworICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7 CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAg ICB9IGVsc2UgeworICAgICAgICB2YXIgcmVzdWx0OworICAgICAgICBmb3JPd24oY29sbGVjdGlv biwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgaWYgKGNh bGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9 IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAg fSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisg ICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRl cyBvdmVyIGVsZW1lbnRzCisgICAgICogb2YgYSBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBs ZWZ0LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICog QGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5n fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFy YW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0 aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Ig b2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAi Xy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAg ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2Au CisgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYHVu ZGVmaW5lZGAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uZmluZExhc3QoWzEs IDIsIDMsIDRdLCBmdW5jdGlvbihudW0pIHsKKyAgICAgKiAgIHJldHVybiBudW0gJSAyID09IDE7 CisgICAgICogfSk7CisgICAgICogLy8gPT4gMworICAgICAqLworICAgIGZ1bmN0aW9uIGZpbmRM YXN0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgcmVzdWx0Owor ICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcs IDMpOworICAgICAgZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRl eCwgY29sbGVjdGlvbikgeworICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xs ZWN0aW9uKSkgeworICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgIHJldHVybiBm YWxzZTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K KworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9u LCBleGVjdXRpbmcgdGhlIGNhbGxiYWNrIGZvciBlYWNoCisgICAgICogZWxlbWVudC4gVGhlIGNh bGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3Vt ZW50czsKKyAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuIENhbGxiYWNrcyBt YXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkKKyAgICAgKiBleHBsaWNpdGx5IHJldHVybmluZyBg ZmFsc2VgLgorICAgICAqCisgICAgICogTm90ZTogQXMgd2l0aCBvdGhlciAiQ29sbGVjdGlvbnMi IG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIGBsZW5ndGhgIHByb3BlcnR5CisgICAgICogYXJlIGl0 ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIGBfLmZvckluYCBvciBg Xy5mb3JPd25gCisgICAgICogbWF5IGJlIHVzZWQgZm9yIG9iamVjdCBpdGVyYXRpb24uCisgICAg ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZWFj aAorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2Jq ZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24g Y2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0 aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge0FycmF5fE9iamVj dHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLgorICAgICAqIEBleGFtcGxlCisgICAgICoK KyAgICAgKiBfKFsxLCAyLCAzXSkuZm9yRWFjaChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2co bnVtKTsgfSkuam9pbignLCcpOworICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1iZXIgYW5kIHJl dHVybnMgJzEsMiwzJworICAgICAqCisgICAgICogXy5mb3JFYWNoKHsgJ29uZSc6IDEsICd0d28n OiAyLCAndGhyZWUnOiAzIH0sIGZ1bmN0aW9uKG51bSkgeyBjb25zb2xlLmxvZyhudW0pOyB9KTsK KyAgICAgKiAvLyA9PiBsb2dzIGVhY2ggbnVtYmVyIGFuZCByZXR1cm5zIHRoZSBvYmplY3QgKHBy b3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpCisgICAg ICovCisgICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykg eworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/ IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKworICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiB0 eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNhbGxi YWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdu dW1iZXInKSB7CisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAg aWYgKGNhbGxiYWNrKGNvbGxlY3Rpb25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikgPT09IGZh bHNlKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg IH0gZWxzZSB7CisgICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBjYWxsYmFjayk7CisgICAgICB9 CisgICAgICByZXR1cm4gY29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlz IG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIg ZWxlbWVudHMKKyAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCisg ICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMg ZWFjaFJpZ2h0CisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtB cnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUg b3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBm dW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJy YXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlvbmAuCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIF8oWzEsIDIsIDNdKS5mb3JFYWNoUmlnaHQoZnVuY3Rpb24obnVtKSB7 IGNvbnNvbGUubG9nKG51bSk7IH0pLmpvaW4oJywnKTsKKyAgICAgKiAvLyA9PiBsb2dzIGVhY2gg bnVtYmVyIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgcmV0dXJucyAnMywyLDEnCisgICAgICovCisg ICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7 CisgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsK KyAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5l ZCcgPyBjYWxsYmFjayA6IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7 CisgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB3aGlsZSAo bGVuZ3RoLS0pIHsKKyAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltsZW5ndGhdLCBs ZW5ndGgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgcHJvcHMgPSBr ZXlzKGNvbGxlY3Rpb24pOworICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisgICAgICAg IGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7Cisg ICAgICAgICAga2V5ID0gcHJvcHMgPyBwcm9wc1stLWxlbmd0aF0gOiAtLWxlbmd0aDsKKyAgICAg ICAgICByZXR1cm4gY2FsbGJhY2soY29sbGVjdGlvbltrZXldLCBrZXksIGNvbGxlY3Rpb24pOwor ICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2xsZWN0aW9uOworICAgIH0KKwor ICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJh dGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZworICAgICAqIGVhY2ggZWxlbWVudCBvZiBh IGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVl CisgICAgICogb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIHJlc3BvbnNp YmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuCisgICAgICogVGhlIGNhbGxiYWNrIGlzIGJvdW5k IHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsKKyAgICAgKiAo dmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3Bl cnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2si IHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9m IHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3Zp ZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjawor ICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9w ZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29s bGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24g VGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258 T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisg ICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJv dmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAi Xy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9 IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0 dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBm dW5jdGlvbihudW0pIHsgcmV0dXJuIE1hdGguZmxvb3IobnVtKTsgfSk7CisgICAgICogLy8gPT4g eyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuNF0gfQorICAgICAqCisgICAgICogXy5ncm91cEJ5 KFs0LjIsIDYuMSwgNi40XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiB0aGlzLmZsb29yKG51bSk7 IH0sIE1hdGgpOworICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjRdIH0K KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg ICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTsKKyAgICAg KiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH0KKyAgICAgKi8K KyAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1 ZSwga2V5KSB7CisgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkgPyByZXN1 bHRba2V5XSA6IHJlc3VsdFtrZXldID0gW10pLnB1c2godmFsdWUpOworICAgIH0pOworCisgICAg LyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQg ZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nCisgICAgICogZWFjaCBlbGVtZW50IG9mIHRoZSBj b2xsZWN0aW9uIHRocm91Z2ggdGhlIGdpdmVuIGNhbGxiYWNrLiBUaGUgY29ycmVzcG9uZGluZwor ICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUg Zm9yIGdlbmVyYXRpbmcgdGhlIGtleS4KKyAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8g YHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOworICAgICAqICh2YWx1 ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkg bmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5 bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhl IGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQg Zm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAg ICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRp ZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVj dGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhl IGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2Jq ZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAg ICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlk ZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53 aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0 aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJu cyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LgorICAgICAq IEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIga2V5cyA9IFsKKyAgICAgKiAgIHsgJ2Rpcic6 ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LAorICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUn OiAxMDAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLmluZGV4Qnkoa2V5cywgJ2Rpcicp OworICAgICAqIC8vID0+IHsgJ2xlZnQnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwg J3JpZ2h0JzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9CisgICAgICoKKyAgICAg KiBfLmluZGV4Qnkoa2V5cywgZnVuY3Rpb24oa2V5KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJD b2RlKGtleS5jb2RlKTsgfSk7CisgICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0Jywg J2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfQorICAg ICAqCisgICAgICogXy5pbmRleEJ5KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGtleSkgeyB0aGlzLmZy b21DaGFyQ29kZShrZXkuY29kZSk7IH0sIFN0cmluZyk7CisgICAgICogLy8gPT4geyAnYSc6IHsg J2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2Rl JzogMTAwIH0gfQorICAgICAqLworICAgIHZhciBpbmRleEJ5ID0gY3JlYXRlQWdncmVnYXRvcihm dW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHsKKyAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7 CisgICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgbmFtZWQgYnkg YG1ldGhvZE5hbWVgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGNvbGxlY3Rpb25gCisgICAgICog cmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2Qu IEFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICogd2lsbCBiZSBwcm92aWRlZCB0byBlYWNoIGlu dm9rZWQgbWV0aG9kLiBJZiBgbWV0aG9kTmFtZWAgaXMgYSBmdW5jdGlvbiBpdAorICAgICAqIHdp bGwgYmUgaW52b2tlZCBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiB0 aGUgYGNvbGxlY3Rpb25gLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJP ZiBfCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxP YmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4K KyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0 aGUgbWV0aG9kIHRvIGludm9rZSBvcgorICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIg aXRlcmF0aW9uLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGludm9r ZSB0aGUgbWV0aG9kIHdpdGguCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3 IGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuCisgICAgICogQGV4 YW1wbGUKKyAgICAgKgorICAgICAqIF8uaW52b2tlKFtbNSwgMSwgN10sIFszLCAyLCAxXV0sICdz b3J0Jyk7CisgICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXQorICAgICAqCisgICAg ICogXy5pbnZva2UoWzEyMywgNDU2XSwgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgJycpOworICAg ICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV0KKyAgICAgKi8KKyAg ICBmdW5jdGlvbiBpbnZva2UoY29sbGVjdGlvbiwgbWV0aG9kTmFtZSkgeworICAgICAgdmFyIGFy Z3MgPSBzbGljZShhcmd1bWVudHMsIDIpLAorICAgICAgICAgIGluZGV4ID0gLTEsCisgICAgICAg ICAgaXNGdW5jID0gdHlwZW9mIG1ldGhvZE5hbWUgPT0gJ2Z1bmN0aW9uJywKKyAgICAgICAgICBs ZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAorICAgICAgICAgIHJl c3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTsKKwor ICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXN1 bHRbKytpbmRleF0gPSAoaXNGdW5jID8gbWV0aG9kTmFtZSA6IHZhbHVlW21ldGhvZE5hbWVdKS5h cHBseSh2YWx1ZSwgYXJncyk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAg fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmlu ZyBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgKiB0aHJvdWdoIHRoZSBjYWxs YmFjay4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRo CisgICAgICogdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbiku CisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxs YmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCBy ZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisg ICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVk ICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3Ig ZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisg ICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGFsaWFzIGNvbGxlY3QKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlv bnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNv bGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0 fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICog IHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQg aXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVy ZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlz QXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7 QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBgY2FsbGJh Y2tgIGV4ZWN1dGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5tYXAoWzEs IDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAqIDM7IH0pOworICAgICAqIC8vID0+ IFszLCA2LCA5XQorICAgICAqCisgICAgICogXy5tYXAoeyAnb25lJzogMSwgJ3R3byc6IDIsICd0 aHJlZSc6IDMgfSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTsKKyAgICAgKiAv LyA9PiBbMywgNiwgOV0gKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBl bnZpcm9ubWVudHMpCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAg IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICogICB7ICduYW1lJzogJ2Zy ZWQnLCAgICdhZ2UnOiA0MCB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJf LnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLm1hcChjaGFyYWN0ZXJzLCAnbmFt ZScpOworICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXQorICAgICAqLworICAgIGZ1bmN0 aW9uIG1hcChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIGluZGV4 ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3Ro IDogMDsKKworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ss IHRoaXNBcmcsIDMpOworICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicpIHsKKyAg ICAgICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CisgICAgICAgIHdoaWxlICgrK2luZGV4 IDwgbGVuZ3RoKSB7CisgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNhbGxiYWNrKGNvbGxlY3Rp b25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7 CisgICAgICAgIHJlc3VsdCA9IFtdOworICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rp b24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgeworICAgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9 IGNhbGxiYWNrKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pOworICAgICAgICB9KTsKKyAgICAgIH0K KyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVz IHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgY29sbGVjdGlvbi4gSWYgdGhlIGNvbGxlY3Rpb24gaXMg ZW1wdHkgb3IKKyAgICAgKiBmYWxzZXkgYC1JbmZpbml0eWAgaXMgcmV0dXJuZWQuIElmIGEgY2Fs bGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZAorICAgICAqIGZvciBlYWNoIHZh bHVlIGluIHRoZSBjb2xsZWN0aW9uIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2gg dGhlIHZhbHVlCisgICAgICogaXMgcmFua2VkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRo aXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKKyAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwg aW5kZXgsIGNvbGxlY3Rpb24pLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlz IHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAg ICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4g ZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNh bGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxs IHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0 aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBz dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwor ICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVj dGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3Ry aW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVy IGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3 aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBz dHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmdd IFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsqfSBS ZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfLm1heChbNCwgMiwgOCwgNl0pOworICAgICAqIC8vID0+IDgKKyAgICAgKgorICAgICAqIHZh ciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYg fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBdOwor ICAgICAqCisgICAgICogXy5tYXgoY2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7IHJldHVybiBj aHIuYWdlOyB9KTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfTsK KyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAg ICAgKiBfLm1heChjaGFyYWN0ZXJzLCAnYWdlJyk7CisgICAgICogLy8gPT4geyAnbmFtZSc6ICdm cmVkJywgJ2FnZSc6IDQwIH07CisgICAgICovCisgICAgZnVuY3Rpb24gbWF4KGNvbGxlY3Rpb24s IGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgY29tcHV0ZWQgPSAtSW5maW5pdHksCisg ICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZWQ7CisKKyAgICAgIC8vIGFsbG93cyB3b3JraW5nIHdp dGggZnVuY3Rpb25zIGxpa2UgYF8ubWFwYCB3aXRob3V0IHVzaW5nCisgICAgICAvLyB0aGVpciBg aW5kZXhgIGFyZ3VtZW50IGFzIGEgY2FsbGJhY2sKKyAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sg IT0gJ2Z1bmN0aW9uJyAmJiB0aGlzQXJnICYmIHRoaXNBcmdbY2FsbGJhY2tdID09PSBjb2xsZWN0 aW9uKSB7CisgICAgICAgIGNhbGxiYWNrID0gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChjYWxs YmFjayA9PSBudWxsICYmIGlzQXJyYXkoY29sbGVjdGlvbikpIHsKKyAgICAgICAgdmFyIGluZGV4 ID0gLTEsCisgICAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKKworICAgICAg ICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxl Y3Rpb25baW5kZXhdOworICAgICAgICAgIGlmICh2YWx1ZSA+IHJlc3VsdCkgeworICAgICAgICAg ICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2Ug eworICAgICAgICBjYWxsYmFjayA9IChjYWxsYmFjayA9PSBudWxsICYmIGlzU3RyaW5nKGNvbGxl Y3Rpb24pKQorICAgICAgICAgID8gY2hhckF0Q2FsbGJhY2sKKyAgICAgICAgICA6IGxvZGFzaC5j cmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisKKyAgICAgICAgZm9yRWFjaChj b2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAgICAg ICB2YXIgY3VycmVudCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CisgICAg ICAgICAgaWYgKGN1cnJlbnQgPiBjb21wdXRlZCkgeworICAgICAgICAgICAgY29tcHV0ZWQgPSBj dXJyZW50OworICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgfQorICAgICAg ICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisg ICAgICogUmV0cmlldmVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGEgY29sbGVjdGlvbi4gSWYgdGhl IGNvbGxlY3Rpb24gaXMgZW1wdHkgb3IKKyAgICAgKiBmYWxzZXkgYEluZmluaXR5YCBpcyByZXR1 cm5lZC4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkCisgICAg ICogZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGNvbGxlY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNyaXRl cmlvbiBieSB3aGljaCB0aGUgdmFsdWUKKyAgICAgKiBpcyByYW5rZWQuIFRoZSBjYWxsYmFjayBp cyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZQorICAgICAqIGFyZ3Vt ZW50czsgKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAgKiBJZiBhIHBy b3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1 Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVl IG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHBy b3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFj aworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBw cm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAg ICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5 IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0 aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0 aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxl ZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlz IHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIg b3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFt IHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICog QHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7CisgICAgICogLy8gPT4gMgorICAg ICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5l eScsICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAg fQorICAgICAqIF07CisgICAgICoKKyAgICAgKiBfLm1pbihjaGFyYWN0ZXJzLCBmdW5jdGlvbihj aHIpIHsgcmV0dXJuIGNoci5hZ2U7IH0pOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5 JywgJ2FnZSc6IDM2IH07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJh Y2sgc2hvcnRoYW5kCisgICAgICogXy5taW4oY2hhcmFjdGVycywgJ2FnZScpOworICAgICAqIC8v ID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH07CisgICAgICovCisgICAgZnVuY3Rp b24gbWluKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgY29tcHV0 ZWQgPSBJbmZpbml0eSwKKyAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDsKKworICAgICAgLy8g YWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdpdGhvdXQgdXNpbmcK KyAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFjaworICAgICAgaWYg KHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tjYWxs YmFja10gPT09IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgY2FsbGJhY2sgPSBudWxsOworICAgICAg fQorICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgJiYgaXNBcnJheShjb2xsZWN0aW9uKSkgewor ICAgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24u bGVuZ3RoOworCisgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAg dmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07CisgICAgICAgICAgaWYgKHZhbHVlIDwgcmVz dWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAg IH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrID0gKGNhbGxiYWNrID09IG51bGwg JiYgaXNTdHJpbmcoY29sbGVjdGlvbikpCisgICAgICAgICAgPyBjaGFyQXRDYWxsYmFjaworICAg ICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKwor ICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVj dGlvbikgeworICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBj b2xsZWN0aW9uKTsKKyAgICAgICAgICBpZiAoY3VycmVudCA8IGNvbXB1dGVkKSB7CisgICAgICAg ICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7CisgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAg ICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVk IHByb3BlcnR5IGZyb20gYWxsIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAqCisg ICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgRnVuY3Rpb24K KyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVj dHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAg ICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8g cGx1Y2suCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHBy b3BlcnR5IHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGNoYXJh Y3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAorICAg ICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQorICAgICAqIF07CisgICAgICoK KyAgICAgKiBfLnBsdWNrKGNoYXJhY3RlcnMsICduYW1lJyk7CisgICAgICogLy8gPT4gWydiYXJu ZXknLCAnZnJlZCddCisgICAgICovCisgICAgdmFyIHBsdWNrID0gbWFwOworCisgICAgLyoqCisg ICAgICogUmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11 bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmcKKyAgICAgKiBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxl Y3Rpb24gdGhyb3VnaCB0aGUgY2FsbGJhY2ssIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZQorICAgICAq IGNhbGxiYWNrIGV4ZWN1dGlvbiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2 aW91cyBleGVjdXRpb24uIElmCisgICAgICogYGFjY3VtdWxhdG9yYCBpcyBub3QgcHJvdmlkZWQg dGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZQorICAgICAqIHVzZWQg YXMgdGhlIGluaXRpYWwgYGFjY3VtdWxhdG9yYCB2YWx1ZS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5k IHRvIGB0aGlzQXJnYAorICAgICAqIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM7IChh Y2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAgICAg KiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZm9sZGwsIGluamVj dAorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucworICAgICAqIEBwYXJhbSB7QXJyYXl8T2Jq ZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24g Y2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIElu aXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNB cmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHsq fSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAq CisgICAgICogdmFyIHN1bSA9IF8ucmVkdWNlKFsxLCAyLCAzXSwgZnVuY3Rpb24oc3VtLCBudW0p IHsKKyAgICAgKiAgIHJldHVybiBzdW0gKyBudW07CisgICAgICogfSk7CisgICAgICogLy8gPT4g NgorICAgICAqCisgICAgICogdmFyIG1hcHBlZCA9IF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIs ICdjJzogMyB9LCBmdW5jdGlvbihyZXN1bHQsIG51bSwga2V5KSB7CisgICAgICogICByZXN1bHRb a2V5XSA9IG51bSAqIDM7CisgICAgICogICByZXR1cm4gcmVzdWx0OworICAgICAqIH0sIHt9KTsK KyAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfQorICAgICAqLworICAgIGZ1 bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBjYWxsYmFjaywgYWNjdW11bGF0b3IsIHRoaXNBcmcp IHsKKyAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGFjY3VtdWxhdG9yOworICAgICAgdmFy IG5vYWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMzsKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNo LmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTsKKworICAgICAgdmFyIGluZGV4 ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CisKKyAgICAgIGlm ICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7CisgICAgICAgIGlmIChub2FjY3VtKSB7Cisg ICAgICAgICAgYWNjdW11bGF0b3IgPSBjb2xsZWN0aW9uWysraW5kZXhdOworICAgICAgICB9Cisg ICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgYWNjdW11bGF0b3Ig PSBjYWxsYmFjayhhY2N1bXVsYXRvciwgY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0 aW9uKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3duKGNvbGxlY3Rp b24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAgICAgIGFjY3Vt dWxhdG9yID0gbm9hY2N1bQorICAgICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2YWx1ZSkK KyAgICAgICAgICAgIDogY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVj dGlvbikKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gYWNjdW11bGF0b3I7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4 Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgICAgKiBvZiBhIGBjb2xsZWN0 aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICog QG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZm9sZHIKKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVj dGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhl IGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtj YWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAg ICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBJbml0aWFsIHZhbHVlIG9mIHRoZSBhY2N1bXVs YXRvci4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg YGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQg dmFsdWUuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBsaXN0ID0gW1swLCAx XSwgWzIsIDNdLCBbNCwgNV1dOworICAgICAqIHZhciBmbGF0ID0gXy5yZWR1Y2VSaWdodChsaXN0 LCBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSwgW10pOworICAgICAqIC8v ID0+IFs0LCA1LCAyLCAzLCAwLCAxXQorICAgICAqLworICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0 KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykgeworICAgICAgdmFy IG5vYWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMzsKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNo LmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTsKKyAgICAgIGZvckVhY2hSaWdo dChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKKyAgICAg ICAgYWNjdW11bGF0b3IgPSBub2FjY3VtCisgICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2 YWx1ZSkKKyAgICAgICAgICA6IGNhbGxiYWNrKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNv bGxlY3Rpb24pOworICAgICAgfSk7CisgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CisgICAgfQor CisgICAgLyoqCisgICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmAgdGhpcyBtZXRob2Qg cmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYQorICAgICAqIGNvbGxlY3Rpb24gdGhhdCB0aGUgY2Fs bGJhY2sgZG9lcyAqKm5vdCoqIHJldHVybiB0cnVleSBmb3IuCisgICAgICoKKyAgICAgKiBJZiBh IHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8u cGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZh bHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlz IHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxs YmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRo ZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgor ICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVn b3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xs ZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0Z1 bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNh bGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0 IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVj ayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBh cmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAg ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIHRoYXQg ZmFpbGVkIHRoZSBjYWxsYmFjayBjaGVjay4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogdmFyIG9kZHMgPSBfLnJlamVjdChbMSwgMiwgMywgNCwgNSwgNl0sIGZ1bmN0aW9uKG51bSkg eyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTsKKyAgICAgKiAvLyA9PiBbMSwgMywgNV0KKyAgICAg KgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXkn LCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJl ZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfQorICAgICAqIF07CisgICAgICoKKyAg ICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5yZWpl Y3QoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJu ZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfV0KKyAgICAgKgorICAgICAqIC8vIHVz aW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnJlamVjdChjaGFyYWN0 ZXJzLCB7ICdhZ2UnOiAzNiB9KTsKKyAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2Fn ZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfV0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZWplY3Qo Y29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNo LmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIHJldHVybiBmaWx0 ZXIoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAg ICAgIHJldHVybiAhY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKKyAgICAgIH0p OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIHJhbmRvbSBlbGVtZW50IG9y IGBuYCByYW5kb20gZWxlbWVudHMgZnJvbSBhIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBA c3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMK KyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxl Y3Rpb24gdG8gc2FtcGxlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbl0gVGhlIG51bWJlciBv ZiBlbGVtZW50cyB0byBzYW1wbGUuCisgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEFs bG93cyB3b3JraW5nIHdpdGggZnVuY3Rpb25zIGxpa2UgYF8ubWFwYAorICAgICAqICB3aXRob3V0 IHVzaW5nIHRoZWlyIGBpbmRleGAgYXJndW1lbnRzIGFzIGBuYC4KKyAgICAgKiBAcmV0dXJucyB7 QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBzYW1wbGUocykgb2YgYGNvbGxlY3Rpb25gLgorICAg ICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pOworICAg ICAqIC8vID0+IDIKKyAgICAgKgorICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSwgMik7Cisg ICAgICogLy8gPT4gWzMsIDFdCisgICAgICovCisgICAgZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rp b24sIG4sIGd1YXJkKSB7CisgICAgICBpZiAoY29sbGVjdGlvbiAmJiB0eXBlb2YgY29sbGVjdGlv bi5sZW5ndGggIT0gJ251bWJlcicpIHsKKyAgICAgICAgY29sbGVjdGlvbiA9IHZhbHVlcyhjb2xs ZWN0aW9uKTsKKyAgICAgIH0KKyAgICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHsKKyAgICAg ICAgcmV0dXJuIGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uW2Jhc2VSYW5kb20oMCwgY29sbGVjdGlv bi5sZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7CisgICAgICB9CisgICAgICB2YXIgcmVzdWx0ID0g c2h1ZmZsZShjb2xsZWN0aW9uKTsKKyAgICAgIHJlc3VsdC5sZW5ndGggPSBuYXRpdmVNaW4obmF0 aXZlTWF4KDAsIG4pLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAg fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBzaHVmZmxlZCB2YWx1ZXMs IHVzaW5nIGEgdmVyc2lvbiBvZiB0aGUgRmlzaGVyLVlhdGVzCisgICAgICogc2h1ZmZsZS4gU2Vl IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUuCisgICAg ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg Q29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rp b24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJl dHVybnMgYSBuZXcgc2h1ZmZsZWQgY29sbGVjdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAq CisgICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0LCA1LCA2XSk7CisgICAgICogLy8gPT4gWzQs IDEsIDYsIDMsIDUsIDJdCisgICAgICovCisgICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9u KSB7CisgICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9u ID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVv ZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTsKKworICAgICAgZm9yRWFjaChjb2xs ZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20o MCwgKytpbmRleCk7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSByZXN1bHRbcmFuZF07CisgICAg ICAgIHJlc3VsdFtyYW5kXSA9IHZhbHVlOworICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0 OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGBjb2xsZWN0 aW9uYCBieSByZXR1cm5pbmcgYGNvbGxlY3Rpb24ubGVuZ3RoYCBmb3IgYXJyYXlzCisgICAgICog YW5kIGFycmF5LWxpa2Ugb2JqZWN0cyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHBy b3BlcnRpZXMgZm9yIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Fy cmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC4K KyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGBjb2xsZWN0aW9uLmxlbmd0aGAgb3Ig bnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCisgICAgICogQGV4YW1wbGUKKyAg ICAgKgorICAgICAqIF8uc2l6ZShbMSwgMl0pOworICAgICAqIC8vID0+IDIKKyAgICAgKgorICAg ICAqIF8uc2l6ZSh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9KTsKKyAgICAgKiAv LyA9PiAzCisgICAgICoKKyAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTsKKyAgICAgKiAvLyA9PiA3 CisgICAgICovCisgICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7CisgICAgICB2YXIgbGVu Z3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDsKKyAgICAgIHJldHVybiB0 eXBlb2YgbGVuZ3RoID09ICdudW1iZXInID8gbGVuZ3RoIDoga2V5cyhjb2xsZWN0aW9uKS5sZW5n dGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBjYWxsYmFjayByZXR1 cm5zIGEgdHJ1ZXkgdmFsdWUgZm9yICoqYW55KiogZWxlbWVudCBvZiBhCisgICAgICogY29sbGVj dGlvbi4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYXMgc29vbiBhcyBpdCBmaW5kcyBhIHBhc3Npbmcg dmFsdWUgYW5kCisgICAgICogZG9lcyBub3QgaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgY29sbGVj dGlvbi4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvCisgICAgICogYHRoaXNBcmdgIGFuZCBpbnZv a2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbiku CisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxs YmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCBy ZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisg ICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVk ICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3Ig ZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsCisg ICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGFsaWFzIGFueQorICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9ucwor ICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVj dGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3Ry aW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVy IGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3 aWxsIGJlIHVzZWQKKyAgICAgKiAgdG8gY3JlYXRlIGEgIl8ucGx1Y2siIG9yICJfLndoZXJlIiBz dHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LgorICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmdd IFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLgorICAgICAqIEByZXR1cm5zIHtib29s ZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZWQgdGhlIGNhbGxiYWNrIGNo ZWNrLAorICAgICAqICBlbHNlIGBmYWxzZWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg ICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7CisgICAgICogLy8g PT4gdHJ1ZQorICAgICAqCisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICdu YW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LAorICAgICAqICAg eyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9CisgICAgICog XTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQK KyAgICAgKiBfLnNvbWUoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTsKKyAgICAgKiAvLyA9PiB0cnVl CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisg ICAgICogXy5zb21lKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7CisgICAgICogLy8gPT4gZmFs c2UKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlz QXJnKSB7CisgICAgICB2YXIgcmVzdWx0OworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRl Q2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworCisgICAgICB2YXIgaW5kZXggPSAtMSwK KyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwOwor CisgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykgeworICAgICAgICB3aGlsZSAo KytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgIGlmICgocmVzdWx0ID0gY2FsbGJhY2soY29s bGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSkpIHsKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yT3du KGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgeworICAgICAg ICAgIHJldHVybiAhKHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikp OworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhIXJlc3VsdDsKKyAgICB9CisK KyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4g YXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mCisgICAgICogcnVubmluZyBlYWNoIGVs ZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGlzIG1ldGhvZAor ICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHdpbGwgcHJlc2VydmUg dGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIKKyAgICAgKiBvZiBlcXVhbCBlbGVtZW50cy4gVGhlIGNh bGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoCisgICAgICogdGhy ZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICoKKyAg ICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNy ZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHBy b3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqCisgICAgICogSWYgYW4g YXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNv bGxlY3Rpb24KKyAgICAgKiB3aWxsIGJlIHNvcnRlZCBieSBlYWNoIHByb3BlcnR5IHZhbHVlLgor ICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRo ZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0dXJuIGB0 cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBv YmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRpYworICAg ICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBh cmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0 ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufE9iamVjdHxzdHJpbmd9 IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRl cmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwg YmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxl IGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhl IGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge0FycmF5fSBS ZXR1cm5zIGEgbmV3IGFycmF5IG9mIHNvcnRlZCBlbGVtZW50cy4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJu IE1hdGguc2luKG51bSk7IH0pOworICAgICAqIC8vID0+IFszLCAxLCAyXQorICAgICAqCisgICAg ICogXy5zb3J0QnkoWzEsIDIsIDNdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuc2luKG51 bSk7IH0sIE1hdGgpOworICAgICAqIC8vID0+IFszLCAxLCAyXQorICAgICAqCisgICAgICogdmFy IGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYg fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LAorICAgICAqICAg eyAnbmFtZSc6ICdiYXJuZXknLCAgJ2FnZSc6IDI2IH0sCisgICAgICogICB7ICduYW1lJzogJ2Zy ZWQnLCAgICAnYWdlJzogMzAgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAi Xy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5tYXAoXy5zb3J0QnkoY2hhcmFj dGVycywgJ2FnZScpLCBfLnZhbHVlcyk7CisgICAgICogLy8gPT4gW1snYmFybmV5JywgMjZdLCBb J2ZyZWQnLCAzMF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF1dCisgICAgICoKKyAgICAg KiAvLyBzb3J0aW5nIGJ5IG11bHRpcGxlIHByb3BlcnRpZXMKKyAgICAgKiBfLm1hcChfLnNvcnRC eShjaGFyYWN0ZXJzLCBbJ25hbWUnLCAnYWdlJ10pLCBfLnZhbHVlcyk7CisgICAgICogLy8gPSA+ IFtbJ2Jhcm5leScsIDI2XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywg NDBdXQorICAgICAqLworICAgIGZ1bmN0aW9uIHNvcnRCeShjb2xsZWN0aW9uLCBjYWxsYmFjaywg dGhpc0FyZykgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgaXNBcnIgPSBpc0Fy cmF5KGNhbGxiYWNrKSwKKyAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlv bi5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0g J251bWJlcicgPyBsZW5ndGggOiAwKTsKKworICAgICAgaWYgKCFpc0FycikgeworICAgICAgICBj YWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7Cisg ICAgICB9CisgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNv bGxlY3Rpb24pIHsKKyAgICAgICAgdmFyIG9iamVjdCA9IHJlc3VsdFsrK2luZGV4XSA9IGdldE9i amVjdCgpOworICAgICAgICBpZiAoaXNBcnIpIHsKKyAgICAgICAgICBvYmplY3QuY3JpdGVyaWEg PSBtYXAoY2FsbGJhY2ssIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfSk7Cisg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKG9iamVjdC5jcml0ZXJpYSA9IGdldEFycmF5KCkp WzBdID0gY2FsbGJhY2sodmFsdWUsIGtleSwgY29sbGVjdGlvbik7CisgICAgICAgIH0KKyAgICAg ICAgb2JqZWN0LmluZGV4ID0gaW5kZXg7CisgICAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlOwor ICAgICAgfSk7CisKKyAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7CisgICAgICByZXN1bHQu c29ydChjb21wYXJlQXNjZW5kaW5nKTsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAg ICB2YXIgb2JqZWN0ID0gcmVzdWx0W2xlbmd0aF07CisgICAgICAgIHJlc3VsdFtsZW5ndGhdID0g b2JqZWN0LnZhbHVlOworICAgICAgICBpZiAoIWlzQXJyKSB7CisgICAgICAgICAgcmVsZWFzZUFy cmF5KG9iamVjdC5jcml0ZXJpYSk7CisgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZU9iamVjdChv YmplY3QpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBDb252ZXJ0cyB0aGUgYGNvbGxlY3Rpb25gIHRvIGFuIGFycmF5LgorICAgICAqCisg ICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IENvbGxl Y3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRo ZSBjb2xsZWN0aW9uIHRvIGNvbnZlcnQuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5z IHRoZSBuZXcgY29udmVydGVkIGFycmF5LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiAoZnVuY3Rpb24oKSB7IHJldHVybiBfLnRvQXJyYXkoYXJndW1lbnRzKS5zbGljZSgxKTsgfSko MSwgMiwgMywgNCk7CisgICAgICogLy8gPT4gWzIsIDMsIDRdCisgICAgICovCisgICAgZnVuY3Rp b24gdG9BcnJheShjb2xsZWN0aW9uKSB7CisgICAgICBpZiAoY29sbGVjdGlvbiAmJiB0eXBlb2Yg Y29sbGVjdGlvbi5sZW5ndGggPT0gJ251bWJlcicpIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlKGNv bGxlY3Rpb24pOworICAgICAgfQorICAgICAgcmV0dXJuIHZhbHVlcyhjb2xsZWN0aW9uKTsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBvZiBlYWNo IGVsZW1lbnQgaW4gYSBgY29sbGVjdGlvbmAgdG8gdGhlIGdpdmVuCisgICAgICogYHByb3BlcnRp ZXNgIG9iamVjdCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUg ZXF1aXZhbGVudAorICAgICAqIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBzdGF0 aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEB0eXBlIEZ1bmN0aW9uCisgICAgICogQGNh dGVnb3J5IENvbGxlY3Rpb25zCisgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBj b2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0g e09iamVjdH0gcHJvcHMgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gZmlsdGVyIGJ5 LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBlbGVtZW50 cyB0aGF0IGhhdmUgdGhlIGdpdmVuIHByb3BlcnRpZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXkn LCAnYWdlJzogMzYsICdwZXRzJzogWydob3BweSddIH0sCisgICAgICogICB7ICduYW1lJzogJ2Zy ZWQnLCAgICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfQorICAgICAq IF07CisgICAgICoKKyAgICAgKiBfLndoZXJlKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOwor ICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ3BldHMnOiBbJ2hv cHB5J10gfV0KKyAgICAgKgorICAgICAqIF8ud2hlcmUoY2hhcmFjdGVycywgeyAncGV0cyc6IFsn ZGlubyddIH0pOworICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdw ZXRzJzogWydiYWJ5IHB1c3MnLCAnZGlubyddIH1dCisgICAgICovCisgICAgdmFyIHdoZXJlID0g ZmlsdGVyOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICAgKiBD cmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVl cyBgZmFsc2VgLCBgbnVsbGAsCisgICAgICogYDBgLCBgIiJgLCBgdW5kZWZpbmVkYCwgYW5kIGBO YU5gIGFyZSBhbGwgZmFsc2V5LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1i ZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFy cmF5IFRoZSBhcnJheSB0byBjb21wYWN0LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJu cyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7CisgICAgICogLy8g PT4gWzEsIDIsIDNdCisgICAgICovCisgICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkgeworICAg ICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5n dGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IFtdOworCisgICAgICB3aGlsZSAoKytpbmRleCA8 IGxlbmd0aCkgeworICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CisgICAgICAgIGlm ICh2YWx1ZSkgeworICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKKyAgICAgICAgfQorICAg ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVh dGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBhcnJheXMg dXNpbmcgc3RyaWN0CisgICAgICogZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1g LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBw cm9jZXNzLgorICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSBhcnJheXMgb2Yg dmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3 IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogXy5kaWZmZXJlbmNlKFsxLCAyLCAzLCA0LCA1XSwgWzUsIDIsIDEwXSk7CisgICAgICogLy8g PT4gWzEsIDMsIDRdCisgICAgICovCisgICAgZnVuY3Rpb24gZGlmZmVyZW5jZShhcnJheSkgewor ICAgICAgcmV0dXJuIGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbihhcmd1bWVudHMs IHRydWUsIHRydWUsIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBp cyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBm aXJzdAorICAgICAqIGVsZW1lbnQgdGhhdCBwYXNzZXMgdGhlIGNhbGxiYWNrIGNoZWNrLCBpbnN0 ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkg bmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5 bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhl IGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQg Zm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAg ICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRp ZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlz CisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhl IGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdl JzogMzYsICdibG9ja2VkJzogZmFsc2UgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAg ICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJs ZXMnLCAnYWdlJzogMSwgICdibG9ja2VkJzogZmFsc2UgfQorICAgICAqIF07CisgICAgICoKKyAg ICAgKiBfLmZpbmRJbmRleChjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKKyAgICAgKiAgIHJl dHVybiBjaHIuYWdlIDwgMjA7CisgICAgICogfSk7CisgICAgICogLy8gPT4gMgorICAgICAqCisg ICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8uZmlu ZEluZGV4KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pOworICAgICAqIC8vID0+IDAKKyAgICAg KgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBf LmZpbmRJbmRleChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8vID0+IDEKKyAgICAg Ki8KKyAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7Cisg ICAgICB2YXIgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxl bmd0aCA6IDA7CisKKyAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxi YWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAg ICAgIGlmIChjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKKyAgICAgICAg ICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAg ZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICAgICAqIG9mIGEgYGNvbGxl Y3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVydHkg bmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIgc3R5 bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhl IGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQg Zm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisgICAg ICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRp ZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoKKyAg ICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlz CisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KKyAgICAg KiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhl IGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5h bWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVh dGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHku CisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxs YmFja2AuCisgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhl IGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAg ICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdl JzogMzYsICdibG9ja2VkJzogdHJ1ZSB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAg J2FnZSc6IDQwLCAnYmxvY2tlZCc6IGZhbHNlIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJs ZXMnLCAnYWdlJzogMSwgICdibG9ja2VkJzogdHJ1ZSB9CisgICAgICogXTsKKyAgICAgKgorICAg ICAqIF8uZmluZExhc3RJbmRleChjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHsKKyAgICAgKiAg IHJldHVybiBjaHIuYWdlID4gMzA7CisgICAgICogfSk7CisgICAgICogLy8gPT4gMQorICAgICAq CisgICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8u ZmluZExhc3RJbmRleChjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTsKKyAgICAgKiAvLyA9PiAw CisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisg ICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7CisgICAgICogLy8g PT4gMgorICAgICAqLworICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIGNhbGxiYWNr LCB0aGlzQXJnKSB7CisgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAw OworICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNB cmcsIDMpOworICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgIGlmIChjYWxsYmFjayhh cnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSkgeworICAgICAgICAgIHJldHVybiBsZW5ndGg7 CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioK KyAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9yIGZpcnN0IGBuYCBlbGVtZW50cyBvZiBh biBhcnJheS4gSWYgYSBjYWxsYmFjaworICAgICAqIGlzIHByb3ZpZGVkIGVsZW1lbnRzIGF0IHRo ZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGFyZSByZXR1cm5lZCBhcyBsb25nCisgICAgICogYXMg dGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhp c0FyZ2AgYW5kCisgICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBp bmRleCwgYXJyYXkpLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3Zp ZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNh bGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVu dC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNr YCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVy biBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2 ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMK KyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlhcyBoZWFkLCB0YWtlCisgICAgICogQGNh dGVnb3J5IEFycmF5cworICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBx dWVyeS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2Fs bGJhY2tdIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGVsZW1lbnQgb3IgdGhlIG51 bWJlciBvZiBlbGVtZW50cyB0byByZXR1cm4uIElmIGEgcHJvcGVydHkgbmFtZSBvcgorICAgICAq ICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNr IiBvciAiXy53aGVyZSIKKyAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAg ICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNr YC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudChzKSBvZiBg YXJyYXlgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmZpcnN0KFsxLCAyLCAz XSk7CisgICAgICogLy8gPT4gMQorICAgICAqCisgICAgICogXy5maXJzdChbMSwgMiwgM10sIDIp OworICAgICAqIC8vID0+IFsxLCAyXQorICAgICAqCisgICAgICogXy5maXJzdChbMSwgMiwgM10s IGZ1bmN0aW9uKG51bSkgeworICAgICAqICAgcmV0dXJuIG51bSA8IDM7CisgICAgICogfSk7Cisg ICAgICogLy8gPT4gWzEsIDJdCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAg ICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6 ICdzbGF0ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2VkJzogZmFs c2UsICdlbXBsb3llcic6ICdzbGF0ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycs ICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICduYScgfQorICAgICAqIF07CisgICAgICoK KyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5m aXJzdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpOworICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2Jh cm5leScsICdibG9ja2VkJzogdHJ1ZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9XQorICAgICAqCisg ICAgICogLy8gdXNpbmcgIl8ud2hlcmUiIGNhbGxiYWNrIHNob3J0aGFuZAorICAgICAqIF8ucGx1 Y2soXy5maXJzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICdzbGF0ZScgfSksICduYW1lJyk7 CisgICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCisgICAgICovCisgICAgZnVuY3Rpb24g Zmlyc3QoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICB2YXIgbiA9IDAsCisgICAg ICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworCisgICAgICBpZiAodHlw ZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAg dmFyIGluZGV4ID0gLTE7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNr KGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgg JiYgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CisgICAgICAgICAgbisr OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBuID0gY2FsbGJhY2s7CisgICAg ICAgIGlmIChuID09IG51bGwgfHwgdGhpc0FyZykgeworICAgICAgICAgIHJldHVybiBhcnJheSA/ IGFycmF5WzBdIDogdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4g c2xpY2UoYXJyYXksIDAsIG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbiksIGxlbmd0aCkpOworICAg IH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW5zIGEgbmVzdGVkIGFycmF5ICh0aGUgbmVzdGlu ZyBjYW4gYmUgdG8gYW55IGRlcHRoKS4gSWYgYGlzU2hhbGxvd2AKKyAgICAgKiBpcyB0cnVleSwg dGhlIGFycmF5IHdpbGwgb25seSBiZSBmbGF0dGVuZWQgYSBzaW5nbGUgbGV2ZWwuIElmIGEgY2Fs bGJhY2sKKyAgICAgKiBpcyBwcm92aWRlZCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIHBh c3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjayBiZWZvcmUKKyAgICAgKiBmbGF0dGVuaW5nLiBUaGUg Y2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUKKyAg ICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KKyAgICAgKgorICAgICAqIElm IGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAi Xy5wbHVjayIgc3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkg dmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3Qg aXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNh bGxiYWNrCisgICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUg dGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAu CisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0 ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZs YXR0ZW4uCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTaGFsbG93PWZhbHNlXSBBIGZsYWcg dG8gcmVzdHJpY3QgZmxhdHRlbmluZyB0byBhIHNpbmdsZSBsZXZlbC4KKyAgICAgKiBAcGFyYW0g e0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9u IGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2Jq ZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAorICAgICAqICB0byBjcmVhdGUgYSAiXy5w bHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICog QHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisg ICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGZsYXR0ZW5lZCBhcnJheS4KKyAg ICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5mbGF0dGVuKFsxLCBbMl0sIFszLCBbWzRd XV1dKTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF07CisgICAgICoKKyAgICAgKiBfLmZsYXR0 ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0sIHRydWUpOworICAgICAqIC8vID0+IFsxLCAyLCAzLCBb WzRdXV07CisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25h bWUnOiAnYmFybmV5JywgJ2FnZSc6IDMwLCAncGV0cyc6IFsnaG9wcHknXSB9LAorICAgICAqICAg eyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdwZXRzJzogWydiYWJ5IHB1c3MnLCAnZGlu byddIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICogLy8gdXNpbmcgIl8ucGx1Y2siIGNhbGxi YWNrIHNob3J0aGFuZAorICAgICAqIF8uZmxhdHRlbihjaGFyYWN0ZXJzLCAncGV0cycpOworICAg ICAqIC8vID0+IFsnaG9wcHknLCAnYmFieSBwdXNzJywgJ2Rpbm8nXQorICAgICAqLworICAgIGZ1 bmN0aW9uIGZsYXR0ZW4oYXJyYXksIGlzU2hhbGxvdywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAg ICAgIC8vIGp1Z2dsZSBhcmd1bWVudHMKKyAgICAgIGlmICh0eXBlb2YgaXNTaGFsbG93ICE9ICdi b29sZWFuJyAmJiBpc1NoYWxsb3cgIT0gbnVsbCkgeworICAgICAgICB0aGlzQXJnID0gY2FsbGJh Y2s7CisgICAgICAgIGNhbGxiYWNrID0gKHR5cGVvZiBpc1NoYWxsb3cgIT0gJ2Z1bmN0aW9uJyAm JiB0aGlzQXJnICYmIHRoaXNBcmdbaXNTaGFsbG93XSA9PT0gYXJyYXkpID8gbnVsbCA6IGlzU2hh bGxvdzsKKyAgICAgICAgaXNTaGFsbG93ID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoY2Fs bGJhY2sgIT0gbnVsbCkgeworICAgICAgICBhcnJheSA9IG1hcChhcnJheSwgY2FsbGJhY2ssIHRo aXNBcmcpOworICAgICAgfQorICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBpc1NoYWxs b3cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRo ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgdXNpbmcKKyAgICAgKiBzdHJp Y3QgZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLiBJZiB0aGUgYXJyYXkgaXMg YWxyZWFkeSBzb3J0ZWQKKyAgICAgKiBwcm92aWRpbmcgYHRydWVgIGZvciBgZnJvbUluZGV4YCB3 aWxsIHJ1biBhIGZhc3RlciBiaW5hcnkgc2VhcmNoLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBwYXJh bSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCisgICAgICogQHBhcmFtIHsqfSB2 YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW58bnVt YmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbSBvciBgdHJ1ZWAKKyAg ICAgKiAgdG8gcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBzb3J0ZWQgYXJyYXkuCisgICAg ICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFs dWUgb3IgYC0xYC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pbmRleE9mKFsx LCAyLCAzLCAxLCAyLCAzXSwgMik7CisgICAgICogLy8gPT4gMQorICAgICAqCisgICAgICogXy5p bmRleE9mKFsxLCAyLCAzLCAxLCAyLCAzXSwgMiwgMyk7CisgICAgICogLy8gPT4gNAorICAgICAq CisgICAgICogXy5pbmRleE9mKFsxLCAxLCAyLCAyLCAzLCAzXSwgMiwgdHJ1ZSk7CisgICAgICog Ly8gPT4gMgorICAgICAqLworICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9t SW5kZXgpIHsKKyAgICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ID09ICdudW1iZXInKSB7CisgICAg ICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisgICAgICAgIGZyb21J bmRleCA9IChmcm9tSW5kZXggPCAwID8gbmF0aXZlTWF4KDAsIGxlbmd0aCArIGZyb21JbmRleCkg OiBmcm9tSW5kZXggfHwgMCk7CisgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCkgeworICAgICAg ICB2YXIgaW5kZXggPSBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpOworICAgICAgICByZXR1cm4g YXJyYXlbaW5kZXhdID09PSB2YWx1ZSA/IGluZGV4IDogLTE7CisgICAgICB9CisgICAgICByZXR1 cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpOworICAgIH0KKworICAgIC8q KgorICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9yIGxhc3QgYG5gIGVsZW1l bnRzIG9mIGFuIGFycmF5LiBJZiBhCisgICAgICogY2FsbGJhY2sgaXMgcHJvdmlkZWQgZWxlbWVu dHMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXJlIGV4Y2x1ZGVkIGZyb20KKyAgICAgKiB0aGUg cmVzdWx0IGFzIGxvbmcgYXMgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFj ayBpcyBib3VuZAorICAgICAqIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFy Z3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLgorICAgICAqCisgICAgICogSWYgYSBwcm9w ZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNr IiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBv ZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92 aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sK KyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJv cGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAg KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBB cnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisg ICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8bnVtYmVyfHN0cmluZ30gW2NhbGxiYWNrPTFd IFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVyIGVsZW1lbnQgb3IgdGhlIG51bWJlciBv ZiBlbGVtZW50cyB0byBleGNsdWRlLiBJZiBhIHByb3BlcnR5IG5hbWUgb3IKKyAgICAgKiAgb2Jq ZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3Ig Il8ud2hlcmUiCisgICAgICogIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuCisgICAgICog QHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisg ICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgc2xpY2Ugb2YgYGFycmF5YC4KKyAgICAg KiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7CisgICAgICog Ly8gPT4gWzEsIDJdCisgICAgICoKKyAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdLCAyKTsKKyAg ICAgKiAvLyA9PiBbMV0KKyAgICAgKgorICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10sIGZ1bmN0 aW9uKG51bSkgeworICAgICAqICAgcmV0dXJuIG51bSA+IDE7CisgICAgICogfSk7CisgICAgICog Ly8gPT4gWzFdCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsg J25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogZmFsc2UsICdlbXBsb3llcic6ICdzbGF0ZScg fSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBs b3llcic6ICdzbGF0ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2Vk JzogdHJ1ZSwgICdlbXBsb3llcic6ICduYScgfQorICAgICAqIF07CisgICAgICoKKyAgICAgKiAv LyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5pbml0aWFsKGNo YXJhY3RlcnMsICdibG9ja2VkJyk7CisgICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5Jywg ICdibG9ja2VkJzogZmFsc2UsICdlbXBsb3llcic6ICdzbGF0ZScgfV0KKyAgICAgKgorICAgICAq IC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnBsdWNrKF8u aW5pdGlhbChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICduYScgfSksICduYW1lJyk7CisgICAg ICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCisgICAgICovCisgICAgZnVuY3Rpb24gaW5pdGlh bChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIHZhciBuID0gMCwKKyAgICAgICAg ICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICAgIGlmICh0eXBlb2Yg Y2FsbGJhY2sgIT0gJ251bWJlcicgJiYgY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICB2YXIg aW5kZXggPSBsZW5ndGg7CisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNr KGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgICAgd2hpbGUgKGluZGV4LS0gJiYgY2FsbGJh Y2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CisgICAgICAgICAgbisrOworICAgICAg ICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBuID0gKGNhbGxiYWNrID09IG51bGwgfHwgdGhp c0FyZykgPyAxIDogY2FsbGJhY2sgfHwgbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzbGljZShh cnJheSwgMCwgbmF0aXZlTWluKG5hdGl2ZU1heCgwLCBsZW5ndGggLSBuKSwgbGVuZ3RoKSk7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVz IHByZXNlbnQgaW4gYWxsIHByb3ZpZGVkIGFycmF5cyB1c2luZworICAgICAqIHN0cmljdCBlcXVh bGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGlj CisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBh cmFtIHsuLi5BcnJheX0gW2FycmF5XSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICogQHJl dHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuCisgICAgICog QGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8uaW50ZXJzZWN0aW9uKFsxLCAyLCAzXSwgWzUsIDIs IDEsIDRdLCBbMiwgMV0pOworICAgICAqIC8vID0+IFsxLCAyXQorICAgICAqLworICAgIGZ1bmN0 aW9uIGludGVyc2VjdGlvbigpIHsKKyAgICAgIHZhciBhcmdzID0gW10sCisgICAgICAgICAgYXJn c0luZGV4ID0gLTEsCisgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCisg ICAgICAgICAgY2FjaGVzID0gZ2V0QXJyYXkoKSwKKyAgICAgICAgICBpbmRleE9mID0gZ2V0SW5k ZXhPZigpLAorICAgICAgICAgIHRydXN0SW5kZXhPZiA9IGluZGV4T2YgPT09IGJhc2VJbmRleE9m LAorICAgICAgICAgIHNlZW4gPSBnZXRBcnJheSgpOworCisgICAgICB3aGlsZSAoKythcmdzSW5k ZXggPCBhcmdzTGVuZ3RoKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1thcmdzSW5k ZXhdOworICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSB7 CisgICAgICAgICAgYXJncy5wdXNoKHZhbHVlKTsKKyAgICAgICAgICBjYWNoZXMucHVzaCh0cnVz dEluZGV4T2YgJiYgdmFsdWUubGVuZ3RoID49IGxhcmdlQXJyYXlTaXplICYmCisgICAgICAgICAg ICBjcmVhdGVDYWNoZShhcmdzSW5kZXggPyBhcmdzW2FyZ3NJbmRleF0gOiBzZWVuKSk7CisgICAg ICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciBhcnJheSA9IGFyZ3NbMF0sCisgICAgICAgICAgaW5k ZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsCisg ICAgICAgICAgcmVzdWx0ID0gW107CisKKyAgICAgIG91dGVyOgorICAgICAgd2hpbGUgKCsraW5k ZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzWzBdOworICAgICAgICB2 YWx1ZSA9IGFycmF5W2luZGV4XTsKKworICAgICAgICBpZiAoKGNhY2hlID8gY2FjaGVJbmRleE9m KGNhY2hlLCB2YWx1ZSkgOiBpbmRleE9mKHNlZW4sIHZhbHVlKSkgPCAwKSB7CisgICAgICAgICAg YXJnc0luZGV4ID0gYXJnc0xlbmd0aDsKKyAgICAgICAgICAoY2FjaGUgfHwgc2VlbikucHVzaCh2 YWx1ZSk7CisgICAgICAgICAgd2hpbGUgKC0tYXJnc0luZGV4KSB7CisgICAgICAgICAgICBjYWNo ZSA9IGNhY2hlc1thcmdzSW5kZXhdOworICAgICAgICAgICAgaWYgKChjYWNoZSA/IGNhY2hlSW5k ZXhPZihjYWNoZSwgdmFsdWUpIDogaW5kZXhPZihhcmdzW2FyZ3NJbmRleF0sIHZhbHVlKSkgPCAw KSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgICAgICAgfQorICAgICAg ICAgIH0KKyAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0K KyAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHsKKyAgICAgICAgY2FjaGUgPSBjYWNoZXNbYXJn c0xlbmd0aF07CisgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgIHJlbGVhc2VPYmplY3Qo Y2FjaGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZWxlYXNlQXJyYXkoY2FjaGVzKTsK KyAgICAgIHJlbGVhc2VBcnJheShzZWVuKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9yIGxhc3QgYG5gIGVsZW1l bnRzIG9mIGFuIGFycmF5LiBJZiBhIGNhbGxiYWNrIGlzCisgICAgICogcHJvdmlkZWQgZWxlbWVu dHMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXJlIHJldHVybmVkIGFzIGxvbmcgYXMgdGhlCisg ICAgICogY2FsbGJhY2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0 aGlzQXJnYCBhbmQgaW52b2tlZAorICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUs IGluZGV4LCBhcnJheSkuCisgICAgICoKKyAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJv dmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ucGx1Y2siIHN0eWxlCisgICAgICog Y2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVt ZW50LgorICAgICAqCisgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJh Y2tgIHRoZSBjcmVhdGVkICJfLndoZXJlIiBzdHlsZSBjYWxsYmFjaworICAgICAqIHdpbGwgcmV0 dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBn aXZlbiBvYmplY3QsCisgICAgICogZWxzZSBgZmFsc2VgLgorICAgICAqCisgICAgICogQHN0YXRp YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBw YXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgKiBAcGFyYW0ge0Z1 bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiBjYWxs ZWQKKyAgICAgKiAgcGVyIGVsZW1lbnQgb3IgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZXR1 cm4uIElmIGEgcHJvcGVydHkgbmFtZSBvcgorICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQg d2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIKKyAgICAgKiAg c3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJn XSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0g UmV0dXJucyB0aGUgbGFzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIF8ubGFzdChbMSwgMiwgM10pOworICAgICAqIC8vID0+IDMKKyAgICAg KgorICAgICAqIF8ubGFzdChbMSwgMiwgM10sIDIpOworICAgICAqIC8vID0+IFsyLCAzXQorICAg ICAqCisgICAgICogXy5sYXN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7CisgICAgICogICBy ZXR1cm4gbnVtID4gMTsKKyAgICAgKiB9KTsKKyAgICAgKiAvLyA9PiBbMiwgM10KKyAgICAgKgor ICAgICAqIHZhciBjaGFyYWN0ZXJzID0gWworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAg J2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAorICAgICAqICAgeyAnbmFt ZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LAor ICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVy JzogJ25hJyB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIC8vIHVzaW5nICJfLnBsdWNrIiBj YWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnBsdWNrKF8ubGFzdChjaGFyYWN0ZXJzLCAnYmxv Y2tlZCcpLCAnbmFtZScpOworICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ10KKyAgICAg KgorICAgICAqIC8vIHVzaW5nICJfLndoZXJlIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBf Lmxhc3QoY2hhcmFjdGVycywgeyAnZW1wbG95ZXInOiAnbmEnIH0pOworICAgICAqIC8vID0+IFt7 ICduYW1lJzogJ3BlYmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6ICduYScgfV0K KyAgICAgKi8KKyAgICBmdW5jdGlvbiBsYXN0KGFycmF5LCBjYWxsYmFjaywgdGhpc0FyZykgewor ICAgICAgdmFyIG4gPSAwLAorICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3Ro IDogMDsKKworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnbnVtYmVyJyAmJiBjYWxsYmFj ayAhPSBudWxsKSB7CisgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aDsKKyAgICAgICAgY2FsbGJh Y2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpOworICAgICAg ICB3aGlsZSAoaW5kZXgtLSAmJiBjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkp IHsKKyAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG4g PSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCB0aGlzQXJnKSB7CisgICAgICAg ICAgcmV0dXJuIGFycmF5ID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7CisgICAgICAg IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzbGljZShhcnJheSwgbmF0aXZlTWF4KDAsIGxlbmd0 aCAtIG4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGlj aCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgdXNpbmcgc3RyaWN0Cisg ICAgICogZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLiBJZiBgZnJvbUluZGV4 YCBpcyBuZWdhdGl2ZSwgaXQgaXMgdXNlZAorICAgICAqIGFzIHRoZSBvZmZzZXQgZnJvbSB0aGUg ZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1l IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQor ICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2 ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3Ig YGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3 aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBv ZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAq IEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAg ICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAqIEBw YXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHBhcmFtIHtu dW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJv bS4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0 Y2hlZCB2YWx1ZSBvciBgLTFgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLmxh c3RJbmRleE9mKFsxLCAyLCAzLCAxLCAyLCAzXSwgMik7CisgICAgICogLy8gPT4gNAorICAgICAq CisgICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIsIDMpOworICAgICAq IC8vID0+IDEKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUs IGZyb21JbmRleCkgeworICAgICAgdmFyIGluZGV4ID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAw OworICAgICAgaWYgKHR5cGVvZiBmcm9tSW5kZXggPT0gJ251bWJlcicpIHsKKyAgICAgICAgaW5k ZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBpbmRleCArIGZyb21JbmRleCkgOiBu YXRpdmVNaW4oZnJvbUluZGV4LCBpbmRleCAtIDEpKSArIDE7CisgICAgICB9CisgICAgICB3aGls ZSAoaW5kZXgtLSkgeworICAgICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkgeworICAg ICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIC0x OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHByb3ZpZGVkIHZhbHVlcyBm cm9tIHRoZSBnaXZlbiBhcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHkgZm9yCisgICAgICogY29t cGFyaXNvbnMsIGkuZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1l bWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0g YXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KKyAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZV0g VGhlIHZhbHVlcyB0byByZW1vdmUuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBh cnJheWAuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBhcnJheSA9IFsxLCAy LCAzLCAxLCAyLCAzXTsKKyAgICAgKiBfLnB1bGwoYXJyYXksIDIsIDMpOworICAgICAqIGNvbnNv bGUubG9nKGFycmF5KTsKKyAgICAgKiAvLyA9PiBbMSwgMV0KKyAgICAgKi8KKyAgICBmdW5jdGlv biBwdWxsKGFycmF5KSB7CisgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKKyAgICAgICAgICBh cmdzSW5kZXggPSAwLAorICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCwKKyAgICAg ICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CisKKyAgICAgIHdoaWxlICgr K2FyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHsKKyAgICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAg ICAgICAgICB2YWx1ZSA9IGFyZ3NbYXJnc0luZGV4XTsKKyAgICAgICAgd2hpbGUgKCsraW5kZXgg PCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkgeworICAg ICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LS0sIDEpOworICAgICAgICAgICAgbGVu Z3RoLS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gYXJy YXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJz IChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb20KKyAgICAgKiBgc3Rh cnRgIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIGBlbmRgLiBJZiBgc3RhcnRgIGlzIGxlc3MgdGhh biBgc3RvcGAgYQorICAgICAqIHplcm8tbGVuZ3RoIHJhbmdlIGlzIGNyZWF0ZWQgdW5sZXNzIGEg bmVnYXRpdmUgYHN0ZXBgIGlzIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAg ICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0g e251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCisgICAgICogQHBhcmFt IHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0ge251bWJl cn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuCisgICAg ICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IHJhbmdlIGFycmF5LgorICAgICAqIEBl eGFtcGxlCisgICAgICoKKyAgICAgKiBfLnJhbmdlKDQpOworICAgICAqIC8vID0+IFswLCAxLCAy LCAzXQorICAgICAqCisgICAgICogXy5yYW5nZSgxLCA1KTsKKyAgICAgKiAvLyA9PiBbMSwgMiwg MywgNF0KKyAgICAgKgorICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpOworICAgICAqIC8vID0+IFsw LCA1LCAxMCwgMTVdCisgICAgICoKKyAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7CisgICAgICog Ly8gPT4gWzAsIC0xLCAtMiwgLTNdCisgICAgICoKKyAgICAgKiBfLnJhbmdlKDEsIDQsIDApOwor ICAgICAqIC8vID0+IFsxLCAxLCAxXQorICAgICAqCisgICAgICogXy5yYW5nZSgwKTsKKyAgICAg KiAvLyA9PiBbXQorICAgICAqLworICAgIGZ1bmN0aW9uIHJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAp IHsKKyAgICAgIHN0YXJ0ID0gK3N0YXJ0IHx8IDA7CisgICAgICBzdGVwID0gdHlwZW9mIHN0ZXAg PT0gJ251bWJlcicgPyBzdGVwIDogKCtzdGVwIHx8IDEpOworCisgICAgICBpZiAoZW5kID09IG51 bGwpIHsKKyAgICAgICAgZW5kID0gc3RhcnQ7CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgIH0K KyAgICAgIC8vIHVzZSBgQXJyYXkobGVuZ3RoKWAgc28gZW5naW5lcyBsaWtlIENoYWtyYSBhbmQg VjggYXZvaWQgc2xvd2VyIG1vZGVzCisgICAgICAvLyBodHRwOi8veW91dHUuYmUvWEFxSXBHVTha WmsjdD0xN20yNXMKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9IG5h dGl2ZU1heCgwLCBjZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSkpLAorICAgICAgICAg IHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3Ro KSB7CisgICAgICAgIHJlc3VsdFtpbmRleF0gPSBzdGFydDsKKyAgICAgICAgc3RhcnQgKz0gc3Rl cDsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAg ICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSB0aGF0IHRoZSBjYWxsYmFjayBy ZXR1cm5zIHRydWV5IGZvcgorICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJlbW92ZWQg ZWxlbWVudHMuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AKKyAgICAgKiBhbmQg aW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLgorICAg ICAqCisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tg IHRoZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJu IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAq IElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53 aGVyZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1l bnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAq IGVsc2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBU aGUgYXJyYXkgdG8gbW9kaWZ5LgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmlu Z30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBp dGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2ls bCBiZSB1c2VkCisgICAgICogIHRvIGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5 bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBU aGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9 IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDQsIDUsIDZdOworICAgICAq IHZhciBldmVucyA9IF8ucmVtb3ZlKGFycmF5LCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAl IDIgPT0gMDsgfSk7CisgICAgICoKKyAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CisgICAgICog Ly8gPT4gWzEsIDMsIDVdCisgICAgICoKKyAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7CisgICAg ICogLy8gPT4gWzIsIDQsIDZdCisgICAgICovCisgICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBj YWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgbGVu Z3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLAorICAgICAgICAgIHJlc3VsdCA9IFtdOwor CisgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0Fy ZywgMyk7CisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgICB2YXIgdmFs dWUgPSBhcnJheVtpbmRleF07CisgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGFy cmF5KSkgeworICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKKyAgICAgICAgICBzcGxpY2Uu Y2FsbChhcnJheSwgaW5kZXgtLSwgMSk7CisgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgIH0K KyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog VGhlIG9wcG9zaXRlIG9mIGBfLmluaXRpYWxgIHRoaXMgbWV0aG9kIGdldHMgYWxsIGJ1dCB0aGUg Zmlyc3QgZWxlbWVudCBvcgorICAgICAqIGZpcnN0IGBuYCBlbGVtZW50cyBvZiBhbiBhcnJheS4g SWYgYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBwcm92aWRlZCBlbGVtZW50cworICAgICAqIGF0IHRo ZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSByZXN1bHQgYXMg bG9uZyBhcyB0aGUKKyAgICAgKiBjYWxsYmFjayByZXR1cm5zIHRydWV5LiBUaGUgY2FsbGJhY2sg aXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkCisgICAgICogd2l0aCB0aHJlZSBhcmd1 bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KKyAgICAgKgorICAgICAqIElmIGEgcHJvcGVy dHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy5wbHVjayIg c3R5bGUKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2Yg dGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk ZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrCisg ICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3Bl cnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwKKyAgICAgKiBlbHNlIGBmYWxzZWAuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAYWxpYXMgZHJvcCwg dGFpbAorICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJh eSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8bnVt YmVyfHN0cmluZ30gW2NhbGxiYWNrPTFdIFRoZSBmdW5jdGlvbiBjYWxsZWQKKyAgICAgKiAgcGVy IGVsZW1lbnQgb3IgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBleGNsdWRlLiBJZiBhIHByb3Bl cnR5IG5hbWUgb3IKKyAgICAgKiAgb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0 byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiCisgICAgICogIHN0eWxlIGNhbGxiYWNr LCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBi aW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEg c2xpY2Ugb2YgYGFycmF5YC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5yZXN0 KFsxLCAyLCAzXSk7CisgICAgICogLy8gPT4gWzIsIDNdCisgICAgICoKKyAgICAgKiBfLnJlc3Qo WzEsIDIsIDNdLCAyKTsKKyAgICAgKiAvLyA9PiBbM10KKyAgICAgKgorICAgICAqIF8ucmVzdChb MSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeworICAgICAqICAgcmV0dXJuIG51bSA8IDM7CisgICAg ICogfSk7CisgICAgICogLy8gPT4gWzNdCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9 IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBs b3llcic6ICdzbGF0ZScgfSwKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2Vk JzogZmFsc2UsICAnZW1wbG95ZXInOiAnc2xhdGUnIH0sCisgICAgICogICB7ICduYW1lJzogJ3Bl YmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6ICduYScgfQorICAgICAqIF07Cisg ICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAg ICogXy5wbHVjayhfLnJlc3QoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKSwgJ25hbWUnKTsKKyAgICAg KiAvLyA9PiBbJ2ZyZWQnLCAncGViYmxlcyddCisgICAgICoKKyAgICAgKiAvLyB1c2luZyAiXy53 aGVyZSIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy5yZXN0KGNoYXJhY3RlcnMsIHsgJ2Vt cGxveWVyJzogJ3NsYXRlJyB9KTsKKyAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdwZWJibGVzJywg J2Jsb2NrZWQnOiB0cnVlLCAnZW1wbG95ZXInOiAnbmEnIH1dCisgICAgICovCisgICAgZnVuY3Rp b24gcmVzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIGlmICh0eXBlb2YgY2Fs bGJhY2sgIT0gJ251bWJlcicgJiYgY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICB2YXIgbiA9 IDAsCisgICAgICAgICAgICBpbmRleCA9IC0xLAorICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkg PyBhcnJheS5sZW5ndGggOiAwOworCisgICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNh bGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTsKKyAgICAgICAgd2hpbGUgKCsraW5kZXggPCBs ZW5ndGggJiYgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CisgICAgICAg ICAgbisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBuID0gKGNhbGxiYWNr ID09IG51bGwgfHwgdGhpc0FyZykgPyAxIDogbmF0aXZlTWF4KDAsIGNhbGxiYWNrKTsKKyAgICAg IH0KKyAgICAgIHJldHVybiBzbGljZShhcnJheSwgbik7CisgICAgfQorCisgICAgLyoqCisgICAg ICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVzdCBpbmRleCBh dCB3aGljaCBhIHZhbHVlCisgICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYSBnaXZlbiBz b3J0ZWQgYXJyYXkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIHNvcnQKKyAgICAgKiBvcmRlciBv ZiB0aGUgYXJyYXkuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRl ZCBmb3IKKyAgICAgKiBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21w dXRlIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlCisgICAgICogY2FsbGJhY2sgaXMgYm91bmQgdG8g YHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgorICAgICAq CisgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRo ZSBjcmVhdGVkICJfLnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRo ZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElm IGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVy ZSIgc3R5bGUgY2FsbGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRz IHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVs c2UgYGZhbHNlYC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXwor ICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUg YXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBl dmFsdWF0ZS4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFj az1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZAorICAgICAqICBwZXIgaXRlcmF0aW9uLiBJ ZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZAor ICAgICAqICB0byBjcmVhdGUgYSAiXy5wbHVjayIgb3IgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNr LCByZXNwZWN0aXZlbHkuCisgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBi aW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0 aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQKKyAgICAgKiAgaW50 byBgYXJyYXlgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnNvcnRlZEluZGV4 KFsyMCwgMzAsIDUwXSwgNDApOworICAgICAqIC8vID0+IDIKKyAgICAgKgorICAgICAqIC8vIHVz aW5nICJfLnBsdWNrIiBjYWxsYmFjayBzaG9ydGhhbmQKKyAgICAgKiBfLnNvcnRlZEluZGV4KFt7 ICd4JzogMjAgfSwgeyAneCc6IDMwIH0sIHsgJ3gnOiA1MCB9XSwgeyAneCc6IDQwIH0sICd4Jyk7 CisgICAgICogLy8gPT4gMgorICAgICAqCisgICAgICogdmFyIGRpY3QgPSB7CisgICAgICogICAn d29yZFRvTnVtYmVyJzogeyAndHdlbnR5JzogMjAsICd0aGlydHknOiAzMCwgJ2ZvdXJ0eSc6IDQw LCAnZmlmdHknOiA1MCB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIF8uc29ydGVkSW5kZXgo Wyd0d2VudHknLCAndGhpcnR5JywgJ2ZpZnR5J10sICdmb3VydHknLCBmdW5jdGlvbih3b3JkKSB7 CisgICAgICogICByZXR1cm4gZGljdC53b3JkVG9OdW1iZXJbd29yZF07CisgICAgICogfSk7Cisg ICAgICogLy8gPT4gMgorICAgICAqCisgICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0 aGlydHknLCAnZmlmdHknXSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHsKKyAgICAgKiAgIHJl dHVybiB0aGlzLndvcmRUb051bWJlclt3b3JkXTsKKyAgICAgKiB9LCBkaWN0KTsKKyAgICAgKiAv LyA9PiAyCisgICAgICovCisgICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCBj YWxsYmFjaywgdGhpc0FyZykgeworICAgICAgdmFyIGxvdyA9IDAsCisgICAgICAgICAgaGlnaCA9 IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogbG93OworCisgICAgICAvLyBleHBsaWNpdGx5IHJlZmVy ZW5jZSBgaWRlbnRpdHlgIGZvciBiZXR0ZXIgaW5saW5pbmcgaW4gRmlyZWZveAorICAgICAgY2Fs bGJhY2sgPSBjYWxsYmFjayA/IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0Fy ZywgMSkgOiBpZGVudGl0eTsKKyAgICAgIHZhbHVlID0gY2FsbGJhY2sodmFsdWUpOworCisgICAg ICB3aGlsZSAobG93IDwgaGlnaCkgeworICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+ PiAxOworICAgICAgICAoY2FsbGJhY2soYXJyYXlbbWlkXSkgPCB2YWx1ZSkKKyAgICAgICAgICA/ IGxvdyA9IG1pZCArIDEKKyAgICAgICAgICA6IGhpZ2ggPSBtaWQ7CisgICAgICB9CisgICAgICBy ZXR1cm4gbG93OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Yg dW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIG9mIHRoZSBwcm92aWRlZCBhcnJheXMgdXNpbmcKKyAg ICAgKiBzdHJpY3QgZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgorICAgICAq CisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFy cmF5cworICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNw ZWN0LgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBjb21iaW5l ZCB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8udW5pb24oWzEsIDIs IDNdLCBbNSwgMiwgMSwgNF0sIFsyLCAxXSk7CisgICAgICogLy8gPT4gWzEsIDIsIDMsIDUsIDRd CisgICAgICovCisgICAgZnVuY3Rpb24gdW5pb24oKSB7CisgICAgICByZXR1cm4gYmFzZVVuaXEo YmFzZUZsYXR0ZW4oYXJndW1lbnRzLCB0cnVlLCB0cnVlKSk7CisgICAgfQorCisgICAgLyoqCisg ICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZS12YWx1ZS1mcmVlIHZlcnNpb24gb2YgYW4gYXJyYXkg dXNpbmcgc3RyaWN0IGVxdWFsaXR5CisgICAgICogZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1g LiBJZiB0aGUgYXJyYXkgaXMgc29ydGVkLCBwcm92aWRpbmcKKyAgICAgKiBgdHJ1ZWAgZm9yIGBp c1NvcnRlZGAgd2lsbCB1c2UgYSBmYXN0ZXIgYWxnb3JpdGhtLiBJZiBhIGNhbGxiYWNrIGlzIHBy b3ZpZGVkCisgICAgICogZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgaXMgcGFzc2VkIHRocm91Z2gg dGhlIGNhbGxiYWNrIGJlZm9yZSB1bmlxdWVuZXNzCisgICAgICogaXMgY29tcHV0ZWQuIFRoZSBj YWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZQorICAg ICAqIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLgorICAgICAqCisgICAgICogSWYg YSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkICJf LnBsdWNrIiBzdHlsZQorICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2 YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIElmIGFuIG9iamVjdCBp cyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCAiXy53aGVyZSIgc3R5bGUgY2Fs bGJhY2sKKyAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0 aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAqIGVsc2UgYGZhbHNlYC4K KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlh cyB1bmlxdWUKKyAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0g YXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNT b3J0ZWQ9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLgor ICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5 XSBUaGUgZnVuY3Rpb24gY2FsbGVkCisgICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVy dHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkCisgICAgICogIHRv IGNyZWF0ZSBhICJfLnBsdWNrIiBvciAiXy53aGVyZSIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3Rp dmVseS4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2Yg YGNhbGxiYWNrYC4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBkdXBsaWNhdGUt dmFsdWUtZnJlZSBhcnJheS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy51bmlx KFsxLCAyLCAxLCAzLCAxXSk7CisgICAgICogLy8gPT4gWzEsIDIsIDNdCisgICAgICoKKyAgICAg KiBfLnVuaXEoWzEsIDEsIDIsIDIsIDNdLCB0cnVlKTsKKyAgICAgKiAvLyA9PiBbMSwgMiwgM10K KyAgICAgKgorICAgICAqIF8udW5pcShbJ0EnLCAnYicsICdDJywgJ2EnLCAnQicsICdjJ10sIGZ1 bmN0aW9uKGxldHRlcikgeyByZXR1cm4gbGV0dGVyLnRvTG93ZXJDYXNlKCk7IH0pOworICAgICAq IC8vID0+IFsnQScsICdiJywgJ0MnXQorICAgICAqCisgICAgICogXy51bmlxKFsxLCAyLjUsIDMs IDEuNSwgMiwgMy41XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiB0aGlzLmZsb29yKG51bSk7IH0s IE1hdGgpOworICAgICAqIC8vID0+IFsxLCAyLjUsIDNdCisgICAgICoKKyAgICAgKiAvLyB1c2lu ZyAiXy5wbHVjayIgY2FsbGJhY2sgc2hvcnRoYW5kCisgICAgICogXy51bmlxKFt7ICd4JzogMSB9 LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTsKKyAgICAgKiAvLyA9PiBbeyAneCc6IDEg fSwgeyAneCc6IDIgfV0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB1bmlxKGFycmF5LCBpc1NvcnRl ZCwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKKyAgICAgIC8vIGp1Z2dsZSBhcmd1bWVudHMKKyAgICAg IGlmICh0eXBlb2YgaXNTb3J0ZWQgIT0gJ2Jvb2xlYW4nICYmIGlzU29ydGVkICE9IG51bGwpIHsK KyAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrOworICAgICAgICBjYWxsYmFjayA9ICh0eXBlb2Yg aXNTb3J0ZWQgIT0gJ2Z1bmN0aW9uJyAmJiB0aGlzQXJnICYmIHRoaXNBcmdbaXNTb3J0ZWRdID09 PSBhcnJheSkgPyBudWxsIDogaXNTb3J0ZWQ7CisgICAgICAgIGlzU29ydGVkID0gZmFsc2U7Cisg ICAgICB9CisgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICBjYWxsYmFjayA9 IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7CisgICAgICB9Cisg ICAgICByZXR1cm4gYmFzZVVuaXEoYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjayk7CisgICAgfQor CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIHByb3ZpZGVk IHZhbHVlcyB1c2luZyBzdHJpY3QgZXF1YWxpdHkgZm9yCisgICAgICogY29tcGFyaXNvbnMsIGku ZS4gYD09PWAuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAg ICAgKiBAY2F0ZWdvcnkgQXJyYXlzCisgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFy cmF5IHRvIGZpbHRlci4KKyAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZV0gVGhlIHZhbHVlcyB0 byBleGNsdWRlLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBv ZiBmaWx0ZXJlZCB2YWx1ZXMuCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIF8ud2l0 aG91dChbMSwgMiwgMSwgMCwgMywgMSwgNF0sIDAsIDEpOworICAgICAqIC8vID0+IFsyLCAzLCA0 XQorICAgICAqLworICAgIGZ1bmN0aW9uIHdpdGhvdXQoYXJyYXkpIHsKKyAgICAgIHJldHVybiBi YXNlRGlmZmVyZW5jZShhcnJheSwgc2xpY2UoYXJndW1lbnRzLCAxKSk7CisgICAgfQorCisgICAg LyoqCisgICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBzeW1tZXRyaWMgZGlmZmVy ZW5jZSBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzLgorICAgICAqIFNlZSBodHRwOi8vZW4ud2lraXBl ZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlLgorICAgICAqCisgICAgICogQHN0YXRp YworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEFycmF5cworICAgICAqIEBw YXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNwZWN0LgorICAgICAqIEBy ZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuCisgICAgICogQGV4YW1w bGUKKyAgICAgKgorICAgICAqIF8ueG9yKFsxLCAyLCAzXSwgWzUsIDIsIDEsIDRdKTsKKyAgICAg KiAvLyA9PiBbMywgNSwgNF0KKyAgICAgKgorICAgICAqIF8ueG9yKFsxLCAyLCA1XSwgWzIsIDMs IDVdLCBbMywgNCwgNV0pOworICAgICAqIC8vID0+IFsxLCA0LCA1XQorICAgICAqLworICAgIGZ1 bmN0aW9uIHhvcigpIHsKKyAgICAgIHZhciBpbmRleCA9IC0xLAorICAgICAgICAgIGxlbmd0aCA9 IGFyZ3VtZW50cy5sZW5ndGg7CisKKyAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7Cisg ICAgICAgIHZhciBhcnJheSA9IGFyZ3VtZW50c1tpbmRleF07CisgICAgICAgIGlmIChpc0FycmF5 KGFycmF5KSB8fCBpc0FyZ3VtZW50cyhhcnJheSkpIHsKKyAgICAgICAgICB2YXIgcmVzdWx0ID0g cmVzdWx0CisgICAgICAgICAgICA/IGJhc2VVbmlxKGJhc2VEaWZmZXJlbmNlKHJlc3VsdCwgYXJy YXkpLmNvbmNhdChiYXNlRGlmZmVyZW5jZShhcnJheSwgcmVzdWx0KSkpCisgICAgICAgICAgICA6 IGFycmF5OworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0IHx8IFtdOwor ICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVt ZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZSBmaXJzdAorICAgICAqIGVsZW1l bnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhl IHNlY29uZAorICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi4K KyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBhbGlh cyB1bnppcAorICAgICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0gey4uLkFycmF5 fSBbYXJyYXldIEFycmF5cyB0byBwcm9jZXNzLgorICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0 dXJucyBhIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLgorICAgICAqIEBleGFtcGxlCisg ICAgICoKKyAgICAgKiBfLnppcChbJ2ZyZWQnLCAnYmFybmV5J10sIFszMCwgNDBdLCBbdHJ1ZSwg ZmFsc2VdKTsKKyAgICAgKiAvLyA9PiBbWydmcmVkJywgMzAsIHRydWVdLCBbJ2Jhcm5leScsIDQw LCBmYWxzZV1dCisgICAgICovCisgICAgZnVuY3Rpb24gemlwKCkgeworICAgICAgdmFyIGFycmF5 ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHMgOiBhcmd1bWVudHNbMF0sCisgICAg ICAgICAgaW5kZXggPSAtMSwKKyAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IG1heChwbHVjayhh cnJheSwgJ2xlbmd0aCcpKSA6IDAsCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoIDwg MCA/IDAgOiBsZW5ndGgpOworCisgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAg ICAgICByZXN1bHRbaW5kZXhdID0gcGx1Y2soYXJyYXksIGluZGV4KTsKKyAgICAgIH0KKyAgICAg IHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBvYmpl Y3QgY29tcG9zZWQgZnJvbSBhcnJheXMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC4gUHJvdmlkZQor ICAgICAqIGVpdGhlciBhIHNpbmdsZSB0d28gZGltZW5zaW9uYWwgYXJyYXksIGkuZS4gYFtba2V5 MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYAorICAgICAqIG9yIHR3byBhcnJheXMsIG9uZSBv ZiBga2V5c2AgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIGB2YWx1ZXNgLgorICAgICAqCisgICAg ICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGFsaWFzIG9iamVjdAorICAg ICAqIEBjYXRlZ29yeSBBcnJheXMKKyAgICAgKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJh eSBvZiBrZXlzLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBhcnJheSBv ZiB2YWx1ZXMuCisgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29t cG9zZWQgb2YgdGhlIGdpdmVuIGtleXMgYW5kCisgICAgICogIGNvcnJlc3BvbmRpbmcgdmFsdWVz LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnppcE9iamVjdChbJ2ZyZWQnLCAn YmFybmV5J10sIFszMCwgNDBdKTsKKyAgICAgKiAvLyA9PiB7ICdmcmVkJzogMzAsICdiYXJuZXkn OiA0MCB9CisgICAgICovCisgICAgZnVuY3Rpb24gemlwT2JqZWN0KGtleXMsIHZhbHVlcykgewor ICAgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgICAgbGVuZ3RoID0ga2V5cyA/IGtleXMubGVu Z3RoIDogMCwKKyAgICAgICAgICByZXN1bHQgPSB7fTsKKworICAgICAgaWYgKCF2YWx1ZXMgJiYg bGVuZ3RoICYmICFpc0FycmF5KGtleXNbMF0pKSB7CisgICAgICAgIHZhbHVlcyA9IFtdOworICAg ICAgfQorICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgdmFyIGtleSA9 IGtleXNbaW5kZXhdOworICAgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgICAgcmVzdWx0W2tl eV0gPSB2YWx1ZXNbaW5kZXhdOworICAgICAgICB9IGVsc2UgaWYgKGtleSkgeworICAgICAgICAg IHJlc3VsdFtrZXlbMF1dID0ga2V5WzFdOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1 cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoq CisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYGZ1bmNgLCB3aXRoICB0 aGUgYHRoaXNgIGJpbmRpbmcgYW5kCisgICAgICogYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1 bmN0aW9uLCBvbmx5IGFmdGVyIGJlaW5nIGNhbGxlZCBgbmAgdGltZXMuCisgICAgICoKKyAgICAg KiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25z CisgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rp b24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICogIGBmdW5jYCBpcyBleGVjdXRlZC4KKyAg ICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC4KKyAg ICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0 aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2Zp bGUnLCAnc2V0dGluZ3MnXTsKKyAgICAgKgorICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZl cy5sZW5ndGgsIGZ1bmN0aW9uKCkgeworICAgICAqICAgY29uc29sZS5sb2coJ0RvbmUgc2F2aW5n IScpOworICAgICAqIH0pOworICAgICAqCisgICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlv bih0eXBlKSB7CisgICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6 IGRvbmUgfSk7CisgICAgICogfSk7CisgICAgICogLy8gPT4gbG9ncyAnRG9uZSBzYXZpbmchJywg YWZ0ZXIgYWxsIHNhdmVzIGhhdmUgY29tcGxldGVkCisgICAgICovCisgICAgZnVuY3Rpb24gYWZ0 ZXIobiwgZnVuYykgeworICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CisgICAgICAgIHRo cm93IG5ldyBUeXBlRXJyb3I7CisgICAgICB9CisgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7Cisg ICAgICAgIGlmICgtLW4gPCAxKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywg YXJndW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGludm9rZXMgYGZ1bmNgIHdp dGggdGhlIGB0aGlzYAorICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCBwcmVwZW5kcyBh bnkgYWRkaXRpb25hbCBgYmluZGAgYXJndW1lbnRzIHRvIHRob3NlCisgICAgICogcHJvdmlkZWQg dG8gdGhlIGJvdW5kIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBt ZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVu Y3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuCisgICAgICogQHBhcmFtIHsqfSBbdGhp c0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC4KKyAgICAgKiBAcGFyYW0gey4uLip9 IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KKyAgICAgKiBAcmV0dXJu cyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhh bXBsZQorICAgICAqCisgICAgICogdmFyIGZ1bmMgPSBmdW5jdGlvbihncmVldGluZykgeworICAg ICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy5uYW1lOworICAgICAqIH07CisgICAg ICoKKyAgICAgKiBmdW5jID0gXy5iaW5kKGZ1bmMsIHsgJ25hbWUnOiAnZnJlZCcgfSwgJ2hpJyk7 CisgICAgICogZnVuYygpOworICAgICAqIC8vID0+ICdoaSBmcmVkJworICAgICAqLworICAgIGZ1 bmN0aW9uIGJpbmQoZnVuYywgdGhpc0FyZykgeworICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPiAyCisgICAgICAgID8gY3JlYXRlV3JhcHBlcihmdW5jLCAxNywgc2xpY2UoYXJndW1lbnRz LCAyKSwgbnVsbCwgdGhpc0FyZykKKyAgICAgICAgOiBjcmVhdGVXcmFwcGVyKGZ1bmMsIDEsIG51 bGwsIG51bGwsIHRoaXNBcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIG1ldGhv ZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhp c3RpbmcKKyAgICAgKiBtZXRob2QuIE1ldGhvZCBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGlu ZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cworICAgICAqIG9mIG1ldGhvZCBuYW1lcy4g SWYgbm8gbWV0aG9kIG5hbWVzIGFyZSBwcm92aWRlZCBhbGwgdGhlIGZ1bmN0aW9uIHByb3BlcnRp ZXMKKyAgICAgKiBvZiBgb2JqZWN0YCB3aWxsIGJlIGJvdW5kLgorICAgICAqCisgICAgICogQHN0 YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAg ICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiaW5kIGFuZCBhc3NpZ24g dGhlIGJvdW5kIG1ldGhvZHMgdG8uCisgICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IFttZXRob2RO YW1lXSBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0bworICAgICAqICBiaW5kLCBzcGVjaWZpZWQg YXMgaW5kaXZpZHVhbCBtZXRob2QgbmFtZXMgb3IgYXJyYXlzIG9mIG1ldGhvZCBuYW1lcy4KKyAg ICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgorICAgICAqIEBleGFtcGxl CisgICAgICoKKyAgICAgKiB2YXIgdmlldyA9IHsKKyAgICAgKiAgICdsYWJlbCc6ICdkb2NzJywK KyAgICAgKiAgICdvbkNsaWNrJzogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdjbGlja2VkICcg KyB0aGlzLmxhYmVsKTsgfQorICAgICAqIH07CisgICAgICoKKyAgICAgKiBfLmJpbmRBbGwodmll dyk7CisgICAgICogalF1ZXJ5KCcjZG9jcycpLm9uKCdjbGljaycsIHZpZXcub25DbGljayk7Cisg ICAgICogLy8gPT4gbG9ncyAnY2xpY2tlZCBkb2NzJywgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNr ZWQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBiaW5kQWxsKG9iamVjdCkgeworICAgICAgdmFyIGZ1 bmNzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUs IGZhbHNlLCAxKSA6IGZ1bmN0aW9ucyhvYmplY3QpLAorICAgICAgICAgIGluZGV4ID0gLTEsCisg ICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoOworCisgICAgICB3aGlsZSAoKytpbmRleCA8 IGxlbmd0aCkgeworICAgICAgICB2YXIga2V5ID0gZnVuY3NbaW5kZXhdOworICAgICAgICBvYmpl Y3Rba2V5XSA9IGNyZWF0ZVdyYXBwZXIob2JqZWN0W2tleV0sIDEsIG51bGwsIG51bGwsIG9iamVj dCk7CisgICAgICB9CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIC8qKgorICAg ICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyB0aGUgbWV0 aG9kIGF0IGBvYmplY3Rba2V5XWAKKyAgICAgKiBhbmQgcHJlcGVuZHMgYW55IGFkZGl0aW9uYWwg YGJpbmRLZXlgIGFyZ3VtZW50cyB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYm91bmQKKyAgICAg KiBmdW5jdGlvbi4gVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5n IGJvdW5kIGZ1bmN0aW9ucyB0bworICAgICAqIHJlZmVyZW5jZSBtZXRob2RzIHRoYXQgd2lsbCBi ZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LgorICAgICAqIFNlZSBodHRwOi8vbWljaGF1 eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybi4KKyAgICAgKgor ICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5j dGlvbnMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdGhlIG1ldGhv ZCBiZWxvbmdzIHRvLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUg bWV0aG9kLgorICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGJlIHBhcnRp YWxseSBhcHBsaWVkLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3 IGJvdW5kIGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2Jq ZWN0ID0geworICAgICAqICAgJ25hbWUnOiAnZnJlZCcsCisgICAgICogICAnZ3JlZXQnOiBmdW5j dGlvbihncmVldGluZykgeworICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlz Lm5hbWU7CisgICAgICogICB9CisgICAgICogfTsKKyAgICAgKgorICAgICAqIHZhciBmdW5jID0g Xy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7CisgICAgICogZnVuYygpOworICAgICAq IC8vID0+ICdoaSBmcmVkJworICAgICAqCisgICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24o Z3JlZXRpbmcpIHsKKyAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy5uYW1l ICsgJyEnOworICAgICAqIH07CisgICAgICoKKyAgICAgKiBmdW5jKCk7CisgICAgICogLy8gPT4g J2hpeWEgZnJlZCEnCisgICAgICovCisgICAgZnVuY3Rpb24gYmluZEtleShvYmplY3QsIGtleSkg eworICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyCisgICAgICAgID8gY3JlYXRlV3Jh cHBlcihrZXksIDE5LCBzbGljZShhcmd1bWVudHMsIDIpLCBudWxsLCBvYmplY3QpCisgICAgICAg IDogY3JlYXRlV3JhcHBlcihrZXksIDMsIG51bGwsIG51bGwsIG9iamVjdCk7CisgICAgfQorCisg ICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9u IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbnMsCisgICAgICogd2hlcmUgZWFjaCBmdW5jdGlvbiBj b25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuCisg ICAgICogRm9yIGV4YW1wbGUsIGNvbXBvc2luZyB0aGUgZnVuY3Rpb25zIGBmKClgLCBgZygpYCwg YW5kIGBoKClgIHByb2R1Y2VzIGBmKGcoaCgpKSlgLgorICAgICAqIEVhY2ggZnVuY3Rpb24gaXMg ZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNvbXBvc2VkIGZ1bmN0aW9u LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IFtmdW5jXSBGdW5j dGlvbnMgdG8gY29tcG9zZS4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhl IG5ldyBjb21wb3NlZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog dmFyIHJlYWxOYW1lTWFwID0geworICAgICAqICAgJ3BlYmJsZXMnOiAncGVuZWxvcGUnCisgICAg ICogfTsKKyAgICAgKgorICAgICAqIHZhciBmb3JtYXQgPSBmdW5jdGlvbihuYW1lKSB7CisgICAg ICogICBuYW1lID0gcmVhbE5hbWVNYXBbbmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBuYW1lOworICAg ICAqICAgcmV0dXJuIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEp LnRvTG93ZXJDYXNlKCk7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIHZhciBncmVldCA9IGZ1 bmN0aW9uKGZvcm1hdHRlZCkgeworICAgICAqICAgcmV0dXJuICdIaXlhICcgKyBmb3JtYXR0ZWQg KyAnISc7CisgICAgICogfTsKKyAgICAgKgorICAgICAqIHZhciB3ZWxjb21lID0gXy5jb21wb3Nl KGdyZWV0LCBmb3JtYXQpOworICAgICAqIHdlbGNvbWUoJ3BlYmJsZXMnKTsKKyAgICAgKiAvLyA9 PiAnSGl5YSBQZW5lbG9wZSEnCisgICAgICovCisgICAgZnVuY3Rpb24gY29tcG9zZSgpIHsKKyAg ICAgIHZhciBmdW5jcyA9IGFyZ3VtZW50cywKKyAgICAgICAgICBsZW5ndGggPSBmdW5jcy5sZW5n dGg7CisKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgICBpZiAoIWlzRnVuY3Rpb24o ZnVuY3NbbGVuZ3RoXSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAg ICB9CisgICAgICB9CisgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBhcmdz ID0gYXJndW1lbnRzLAorICAgICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoOworCisgICAg ICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgICAgIGFyZ3MgPSBbZnVuY3NbbGVuZ3RoXS5h cHBseSh0aGlzLCBhcmdzKV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZ3NbMF07Cisg ICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGlj aCBhY2NlcHRzIG9uZSBvciBtb3JlIGFyZ3VtZW50cyBvZiBgZnVuY2AgdGhhdCB3aGVuCisgICAg ICogaW52b2tlZCBlaXRoZXIgZXhlY3V0ZXMgYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBp ZiBhbGwgYGZ1bmNgIGFyZ3VtZW50cworICAgICAqIGhhdmUgYmVlbiBwcm92aWRlZCwgb3IgcmV0 dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBy ZW1haW5pbmcgYGZ1bmNgIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNg IGNhbiBiZSBzcGVjaWZpZWQKKyAgICAgKiBpZiBgZnVuYy5sZW5ndGhgIGlzIG5vdCBzdWZmaWNp ZW50LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICog QGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1 bmN0aW9uIHRvIGN1cnJ5LgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5n dGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1 cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisg ICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGZ1bmN0aW9uKGEsIGIsIGMpIHsKKyAgICAgKiAg IGNvbnNvbGUubG9nKGEgKyBiICsgYyk7CisgICAgICogfSk7CisgICAgICoKKyAgICAgKiBjdXJy aWVkKDEpKDIpKDMpOworICAgICAqIC8vID0+IDYKKyAgICAgKgorICAgICAqIGN1cnJpZWQoMSwg MikoMyk7CisgICAgICogLy8gPT4gNgorICAgICAqCisgICAgICogY3VycmllZCgxLCAyLCAzKTsK KyAgICAgKiAvLyA9PiA2CisgICAgICovCisgICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHkp IHsKKyAgICAgIGFyaXR5ID0gdHlwZW9mIGFyaXR5ID09ICdudW1iZXInID8gYXJpdHkgOiAoK2Fy aXR5IHx8IGZ1bmMubGVuZ3RoKTsKKyAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIDQs IG51bGwsIG51bGwsIG51bGwsIGFyaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVh dGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGRlbGF5IHRoZSBleGVjdXRpb24gb2YgYGZ1bmNgIHVu dGlsIGFmdGVyCisgICAgICogYHdhaXRgIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2Ug dGhlIGxhc3QgdGltZSBpdCB3YXMgaW52b2tlZC4KKyAgICAgKiBQcm92aWRlIGFuIG9wdGlvbnMg b2JqZWN0IHRvIGluZGljYXRlIHRoYXQgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uCisgICAg ICogdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0 LiBTdWJzZXF1ZW50IGNhbGxzCisgICAgICogdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3aWxs IHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBjYWxsLgorICAgICAqCisgICAg ICogTm90ZTogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCBg ZnVuY2Agd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUg dGltZW91dCBvbmx5IGlmIHRoZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIGlzCisgICAgICogaW52 b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LgorICAgICAqCisg ICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0 aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91 bmNlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNv bmRzIHRvIGRlbGF5LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlv bnMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxz ZV0gU3BlY2lmeSBleGVjdXRpb24gb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4K KyAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF0gVGhlIG1heGltdW0gdGlt ZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGNhbGxlZC4KKyAg ICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgZXhl Y3V0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgorICAgICAqIEByZXR1 cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi4KKyAgICAg KiBAZXhhbXBsZQorICAgICAqCisgICAgICogLy8gYXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3 aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eAorICAgICAqIHZhciBsYXp5TGF5b3V0ID0g Xy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCk7CisgICAgICogalF1ZXJ5KHdpbmRvdyku b24oJ3Jlc2l6ZScsIGxhenlMYXlvdXQpOworICAgICAqCisgICAgICogLy8gZXhlY3V0ZSBgc2Vu ZE1haWxgIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBkZWJvdW5jaW5nIHN1YnNlcXVl bnQgY2FsbHMKKyAgICAgKiBqUXVlcnkoJyNwb3N0Ym94Jykub24oJ2NsaWNrJywgXy5kZWJvdW5j ZShzZW5kTWFpbCwgMzAwLCB7CisgICAgICogICAnbGVhZGluZyc6IHRydWUsCisgICAgICogICAn dHJhaWxpbmcnOiBmYWxzZQorICAgICAqIH0pOworICAgICAqCisgICAgICogLy8gZW5zdXJlIGBi YXRjaExvZ2AgaXMgZXhlY3V0ZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2Fs bHMKKyAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7CisgICAg ICogc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBfLmRlYm91bmNlKGJhdGNoTG9n LCAyNTAsIHsKKyAgICAgKiAgICdtYXhXYWl0JzogMTAwMAorICAgICAqIH0sIGZhbHNlKTsKKyAg ICAgKi8KKyAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7CisgICAg ICB2YXIgYXJncywKKyAgICAgICAgICBtYXhUaW1lb3V0SWQsCisgICAgICAgICAgcmVzdWx0LAor ICAgICAgICAgIHN0YW1wLAorICAgICAgICAgIHRoaXNBcmcsCisgICAgICAgICAgdGltZW91dElk LAorICAgICAgICAgIHRyYWlsaW5nQ2FsbCwKKyAgICAgICAgICBsYXN0Q2FsbGVkID0gMCwKKyAg ICAgICAgICBtYXhXYWl0ID0gZmFsc2UsCisgICAgICAgICAgdHJhaWxpbmcgPSB0cnVlOworCisg ICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJv cjsKKyAgICAgIH0KKyAgICAgIHdhaXQgPSBuYXRpdmVNYXgoMCwgd2FpdCkgfHwgMDsKKyAgICAg IGlmIChvcHRpb25zID09PSB0cnVlKSB7CisgICAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZTsKKyAg ICAgICAgdHJhaWxpbmcgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob3B0aW9u cykpIHsKKyAgICAgICAgbGVhZGluZyA9IG9wdGlvbnMubGVhZGluZzsKKyAgICAgICAgbWF4V2Fp dCA9ICdtYXhXYWl0JyBpbiBvcHRpb25zICYmIChuYXRpdmVNYXgod2FpdCwgb3B0aW9ucy5tYXhX YWl0KSB8fCAwKTsKKyAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyBv cHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7CisgICAgICB9CisgICAgICB2YXIgZGVsYXllZCA9 IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3coKSAtIHN0 YW1wKTsKKyAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7CisgICAgICAgICAgaWYgKG1heFRp bWVvdXRJZCkgeworICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7CisgICAg ICAgICAgfQorICAgICAgICAgIHZhciBpc0NhbGxlZCA9IHRyYWlsaW5nQ2FsbDsKKyAgICAgICAg ICBtYXhUaW1lb3V0SWQgPSB0aW1lb3V0SWQgPSB0cmFpbGluZ0NhbGwgPSB1bmRlZmluZWQ7Cisg ICAgICAgICAgaWYgKGlzQ2FsbGVkKSB7CisgICAgICAgICAgICBsYXN0Q2FsbGVkID0gbm93KCk7 CisgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOworICAgICAg ICAgICAgaWYgKCF0aW1lb3V0SWQgJiYgIW1heFRpbWVvdXRJZCkgeworICAgICAgICAgICAgICBh cmdzID0gdGhpc0FyZyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAg ICB9IGVsc2UgeworICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZGVsYXllZCwgcmVt YWluaW5nKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdmFyIG1heERlbGF5ZWQgPSBm dW5jdGlvbigpIHsKKyAgICAgICAgaWYgKHRpbWVvdXRJZCkgeworICAgICAgICAgIGNsZWFyVGlt ZW91dCh0aW1lb3V0SWQpOworICAgICAgICB9CisgICAgICAgIG1heFRpbWVvdXRJZCA9IHRpbWVv dXRJZCA9IHRyYWlsaW5nQ2FsbCA9IHVuZGVmaW5lZDsKKyAgICAgICAgaWYgKHRyYWlsaW5nIHx8 IChtYXhXYWl0ICE9PSB3YWl0KSkgeworICAgICAgICAgIGxhc3RDYWxsZWQgPSBub3coKTsKKyAg ICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOworICAgICAgICAgIGlm ICghdGltZW91dElkICYmICFtYXhUaW1lb3V0SWQpIHsKKyAgICAgICAgICAgIGFyZ3MgPSB0aGlz QXJnID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHJl dHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKKyAgICAgICAgc3Rh bXAgPSBub3coKTsKKyAgICAgICAgdGhpc0FyZyA9IHRoaXM7CisgICAgICAgIHRyYWlsaW5nQ2Fs bCA9IHRyYWlsaW5nICYmICh0aW1lb3V0SWQgfHwgIWxlYWRpbmcpOworCisgICAgICAgIGlmICht YXhXYWl0ID09PSBmYWxzZSkgeworICAgICAgICAgIHZhciBsZWFkaW5nQ2FsbCA9IGxlYWRpbmcg JiYgIXRpbWVvdXRJZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIW1heFRpbWVv dXRJZCAmJiAhbGVhZGluZykgeworICAgICAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wOworICAg ICAgICAgIH0KKyAgICAgICAgICB2YXIgcmVtYWluaW5nID0gbWF4V2FpdCAtIChzdGFtcCAtIGxh c3RDYWxsZWQpLAorICAgICAgICAgICAgICBpc0NhbGxlZCA9IHJlbWFpbmluZyA8PSAwOworCisg ICAgICAgICAgaWYgKGlzQ2FsbGVkKSB7CisgICAgICAgICAgICBpZiAobWF4VGltZW91dElkKSB7 CisgICAgICAgICAgICAgIG1heFRpbWVvdXRJZCA9IGNsZWFyVGltZW91dChtYXhUaW1lb3V0SWQp OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wOworICAgICAg ICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTsKKyAgICAgICAgICB9Cisg ICAgICAgICAgZWxzZSBpZiAoIW1heFRpbWVvdXRJZCkgeworICAgICAgICAgICAgbWF4VGltZW91 dElkID0gc2V0VGltZW91dChtYXhEZWxheWVkLCByZW1haW5pbmcpOworICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgICAgICBpZiAoaXNDYWxsZWQgJiYgdGltZW91dElkKSB7CisgICAgICAgICAg dGltZW91dElkID0gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CisgICAgICAgIH0KKyAgICAgICAg ZWxzZSBpZiAoIXRpbWVvdXRJZCAmJiB3YWl0ICE9PSBtYXhXYWl0KSB7CisgICAgICAgICAgdGlt ZW91dElkID0gc2V0VGltZW91dChkZWxheWVkLCB3YWl0KTsKKyAgICAgICAgfQorICAgICAgICBp ZiAobGVhZGluZ0NhbGwpIHsKKyAgICAgICAgICBpc0NhbGxlZCA9IHRydWU7CisgICAgICAgICAg cmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBp ZiAoaXNDYWxsZWQgJiYgIXRpbWVvdXRJZCAmJiAhbWF4VGltZW91dElkKSB7CisgICAgICAgICAg YXJncyA9IHRoaXNBcmcgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7 CisgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmVycyBleGVjdXRpbmcgdGhl IGBmdW5jYCBmdW5jdGlvbiB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVk LgorICAgICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgcHJvdmlkZWQgdG8gYGZ1bmNg IHdoZW4gaXQgaXMgaW52b2tlZC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVt YmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Z1bmN0 aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci4KKyAgICAgKiBAcGFyYW0gey4uLip9IFth cmddIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguCisgICAgICogQHJldHVy bnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkgeyBjb25zb2xlLmxvZyh0ZXh0KTsgfSwg J2RlZmVycmVkJyk7CisgICAgICogLy8gbG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBvciBtb3Jl IG1pbGxpc2Vjb25kcworICAgICAqLworICAgIGZ1bmN0aW9uIGRlZmVyKGZ1bmMpIHsKKyAgICAg IGlmICghaXNGdW5jdGlvbihmdW5jKSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOwor ICAgICAgfQorICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDEpOworICAgICAgcmV0 dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsg fSwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGBmdW5jYCBmdW5j dGlvbiBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBZGRpdGlvbmFsIGFyZ3VtZW50cworICAg ICAqIHdpbGwgYmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC4KKyAgICAg KgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBG dW5jdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBk ZWxheS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vj b25kcyB0byBkZWxheSBleGVjdXRpb24uCisgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1 bWVudHMgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoLgorICAgICAqIEByZXR1cm5zIHtudW1i ZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHsgY29uc29sZS5sb2codGV4dCk7IH0sIDEwMDAsICds YXRlcicpOworICAgICAqIC8vID0+IGxvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kCisgICAg ICovCisgICAgZnVuY3Rpb24gZGVsYXkoZnVuYywgd2FpdCkgeworICAgICAgaWYgKCFpc0Z1bmN0 aW9uKGZ1bmMpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7CisgICAgICB9CisgICAg ICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMik7CisgICAgICByZXR1cm4gc2V0VGltZW91 dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTsKKyAg ICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0 aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpcworICAgICAqIHByb3ZpZGVkIGl0 IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUg cmVzdWx0CisgICAgICogYmFzZWQgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVt b2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZQorICAgICAqIGZpcnN0IGFyZ3VtZW50IHBy b3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXku CisgICAgICogVGhlIGBmdW5jYCBpcyBleGVjdXRlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBv ZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uCisgICAgICogVGhlIHJlc3VsdCBjYWNoZSBpcyBleHBv c2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4KKyAg ICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29y eSBGdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0 byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jl c29sdmVyXSBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LgorICAgICAq IEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemluZyBmdW5jdGlvbi4K KyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogdmFyIGZpYm9uYWNjaSA9IF8ubWVtb2l6 ZShmdW5jdGlvbihuKSB7CisgICAgICogICByZXR1cm4gbiA8IDIgPyBuIDogZmlib25hY2NpKG4g LSAxKSArIGZpYm9uYWNjaShuIC0gMik7CisgICAgICogfSk7CisgICAgICoKKyAgICAgKiBmaWJv bmFjY2koOSkKKyAgICAgKiAvLyA9PiAzNAorICAgICAqCisgICAgICogdmFyIGRhdGEgPSB7Cisg ICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LAorICAgICAqICAg J3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9CisgICAgICogfTsKKyAg ICAgKgorICAgICAqIC8vIG1vZGlmeWluZyB0aGUgcmVzdWx0IGNhY2hlCisgICAgICogdmFyIGdl dCA9IF8ubWVtb2l6ZShmdW5jdGlvbihuYW1lKSB7IHJldHVybiBkYXRhW25hbWVdOyB9LCBfLmlk ZW50aXR5KTsKKyAgICAgKiBnZXQoJ3BlYmJsZXMnKTsKKyAgICAgKiAvLyA9PiB7ICduYW1lJzog J3BlYmJsZXMnLCAnYWdlJzogMSB9CisgICAgICoKKyAgICAgKiBnZXQuY2FjaGUucGViYmxlcy5u YW1lID0gJ3BlbmVsb3BlJzsKKyAgICAgKiBnZXQoJ3BlYmJsZXMnKTsKKyAgICAgKiAvLyA9PiB7 ICduYW1lJzogJ3BlbmVsb3BlJywgJ2FnZSc6IDEgfQorICAgICAqLworICAgIGZ1bmN0aW9uIG1l bW9pemUoZnVuYywgcmVzb2x2ZXIpIHsKKyAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkgewor ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yOworICAgICAgfQorICAgICAgdmFyIG1lbW9pemVk ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjYWNoZSA9IG1lbW9pemVkLmNhY2hlLAorICAg ICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp IDoga2V5UHJlZml4ICsgYXJndW1lbnRzWzBdOworCisgICAgICAgIHJldHVybiBoYXNPd25Qcm9w ZXJ0eS5jYWxsKGNhY2hlLCBrZXkpCisgICAgICAgICAgPyBjYWNoZVtrZXldCisgICAgICAgICAg OiAoY2FjaGVba2V5XSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CisgICAgICB9Cisg ICAgICBtZW1vaXplZC5jYWNoZSA9IHt9OworICAgICAgcmV0dXJuIG1lbW9pemVkOworICAgIH0K KworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQg dG8gZXhlY3V0ZSBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzIHRvCisgICAgICogdGhlIGZ1bmN0 aW9uIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY2FsbC4gVGhlIGBmdW5jYCBp cyBleGVjdXRlZAorICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVk IGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg ICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMg VGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0 dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAg KgorICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTsKKyAg ICAgKiBpbml0aWFsaXplKCk7CisgICAgICogaW5pdGlhbGl6ZSgpOworICAgICAqIC8vIGBpbml0 aWFsaXplYCBleGVjdXRlcyBgY3JlYXRlQXBwbGljYXRpb25gIG9uY2UKKyAgICAgKi8KKyAgICBm dW5jdGlvbiBvbmNlKGZ1bmMpIHsKKyAgICAgIHZhciByYW4sCisgICAgICAgICAgcmVzdWx0Owor CisgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVF cnJvcjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKHJh bikgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmFuID0g dHJ1ZTsKKyAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisg ICAgICAgIC8vIGNsZWFyIHRoZSBgZnVuY2AgdmFyaWFibGUgc28gdGhlIGZ1bmN0aW9uIG1heSBi ZSBnYXJiYWdlIGNvbGxlY3RlZAorICAgICAgICBmdW5jID0gbnVsbDsKKyAgICAgICAgcmV0dXJu IHJlc3VsdDsKKyAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1 bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBpbnZva2VzIGBmdW5jYCB3aXRoIGFueSBhZGRpdGlv bmFsCisgICAgICogYHBhcnRpYWxgIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gdGhvc2UgcHJvdmlk ZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBzaW1pbGFyIHRv IGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KiogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5n LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNh dGVnb3J5IEZ1bmN0aW9ucworICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0 aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uCisgICAgICogQHBhcmFtIHsuLi4q fSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCisgICAgICogQHJldHVy bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24u CisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBncmVldCA9IGZ1bmN0aW9uKGdy ZWV0aW5nLCBuYW1lKSB7IHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7IH07CisgICAgICog dmFyIGhpID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGknKTsKKyAgICAgKiBoaSgnZnJlZCcpOworICAg ICAqIC8vID0+ICdoaSBmcmVkJworICAgICAqLworICAgIGZ1bmN0aW9uIHBhcnRpYWwoZnVuYykg eworICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgMTYsIHNsaWNlKGFyZ3VtZW50cywg MSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFy dGlhbGAgZXhjZXB0IHRoYXQgYHBhcnRpYWxgIGFyZ3VtZW50cyBhcmUKKyAgICAgKiBhcHBlbmRl ZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAqCisgICAgICog QHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9ucwor ICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBh cHBseSBhcmd1bWVudHMgdG8uCisgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMg dG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1 cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uCisgICAgICogQGV4YW1wbGUK KyAgICAgKgorICAgICAqIHZhciBkZWZhdWx0c0RlZXAgPSBfLnBhcnRpYWxSaWdodChfLm1lcmdl LCBfLmRlZmF1bHRzKTsKKyAgICAgKgorICAgICAqIHZhciBvcHRpb25zID0geworICAgICAqICAg J3ZhcmlhYmxlJzogJ2RhdGEnLAorICAgICAqICAgJ2ltcG9ydHMnOiB7ICdqcSc6ICQgfQorICAg ICAqIH07CisgICAgICoKKyAgICAgKiBkZWZhdWx0c0RlZXAob3B0aW9ucywgXy50ZW1wbGF0ZVNl dHRpbmdzKTsKKyAgICAgKgorICAgICAqIG9wdGlvbnMudmFyaWFibGUKKyAgICAgKiAvLyA9PiAn ZGF0YScKKyAgICAgKgorICAgICAqIG9wdGlvbnMuaW1wb3J0cworICAgICAqIC8vID0+IHsgJ18n OiBfLCAnanEnOiAkIH0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBwYXJ0aWFsUmlnaHQoZnVuYykg eworICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgMzIsIG51bGwsIHNsaWNlKGFyZ3Vt ZW50cywgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0 aGF0LCB3aGVuIGV4ZWN1dGVkLCB3aWxsIG9ubHkgY2FsbCB0aGUgYGZ1bmNgIGZ1bmN0aW9uCisg ICAgICogYXQgbW9zdCBvbmNlIHBlciBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBQcm92aWRl IGFuIG9wdGlvbnMgb2JqZWN0IHRvCisgICAgICogaW5kaWNhdGUgdGhhdCBgZnVuY2Agc2hvdWxk IGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2UKKyAgICAgKiBv ZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBm dW5jdGlvbiB3aWxsCisgICAgICogcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNg IGNhbGwuCisgICAgICoKKyAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Ag b3B0aW9ucyBhcmUgYHRydWVgIGBmdW5jYCB3aWxsIGJlIGNhbGxlZAorICAgICAqIG9uIHRoZSB0 cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSB0aHJvdHRsZWQgZnVu Y3Rpb24gaXMKKyAgICAgKiBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRg IHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAg ICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBU aGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhl IG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgZXhlY3V0aW9ucyB0by4KKyAgICAg KiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdC4KKyAgICAgKiBA cGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV0gU3BlY2lmeSBleGVjdXRpb24g b24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KKyAgICAgKiBAcGFyYW0ge2Jvb2xl YW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgZXhlY3V0aW9uIG9uIHRoZSB0cmFp bGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0 dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi4KKyAgICAgKiBAZXhhbXBsZQorICAgICAq CisgICAgICogLy8gYXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxl IHNjcm9sbGluZworICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHVwZGF0ZVBvc2l0 aW9uLCAxMDApOworICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCB0aHJvdHRsZWQp OworICAgICAqCisgICAgICogLy8gZXhlY3V0ZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sg ZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzCisg ICAgICogalF1ZXJ5KCcuaW50ZXJhY3RpdmUnKS5vbignY2xpY2snLCBfLnRocm90dGxlKHJlbmV3 VG9rZW4sIDMwMDAwMCwgeworICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2UKKyAgICAgKiB9KSk7 CisgICAgICovCisgICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykgewor ICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLAorICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKwor ICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJy b3I7CisgICAgICB9CisgICAgICBpZiAob3B0aW9ucyA9PT0gZmFsc2UpIHsKKyAgICAgICAgbGVh ZGluZyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSkgeworICAg ICAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyBvcHRpb25zLmxlYWRpbmcgOiBs ZWFkaW5nOworICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/IG9wdGlv bnMudHJhaWxpbmcgOiB0cmFpbGluZzsKKyAgICAgIH0KKyAgICAgIGRlYm91bmNlT3B0aW9ucy5s ZWFkaW5nID0gbGVhZGluZzsKKyAgICAgIGRlYm91bmNlT3B0aW9ucy5tYXhXYWl0ID0gd2FpdDsK KyAgICAgIGRlYm91bmNlT3B0aW9ucy50cmFpbGluZyA9IHRyYWlsaW5nOworCisgICAgICByZXR1 cm4gZGVib3VuY2UoZnVuYywgd2FpdCwgZGVib3VuY2VPcHRpb25zKTsKKyAgICB9CisKKyAgICAv KioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIHRo ZSB3cmFwcGVyIGZ1bmN0aW9uIGFzIGl0cworICAgICAqIGZpcnN0IGFyZ3VtZW50LiBBZGRpdGlv bmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkCisgICAg ICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVy IGlzIGV4ZWN1dGVkIHdpdGgKKyAgICAgKiB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0 ZWQgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8K KyAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUg dmFsdWUgdG8gd3JhcC4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSB3cmFw cGVyIGZ1bmN0aW9uLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3 IGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgcCA9IF8ud3Jh cChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkgeworICAgICAqICAgcmV0dXJuICc8cD4n ICsgZnVuYyh0ZXh0KSArICc8L3A+JzsKKyAgICAgKiB9KTsKKyAgICAgKgorICAgICAqIHAoJ0Zy ZWQsIFdpbG1hLCAmIFBlYmJsZXMnKTsKKyAgICAgKiAvLyA9PiAnPHA+RnJlZCwgV2lsbWEsICZh bXA7IFBlYmJsZXM8L3A+JworICAgICAqLworICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBw ZXIpIHsKKyAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHdyYXBwZXIsIDE2LCBbdmFsdWVdKTsK KyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgICAqIENy ZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC4KKyAgICAgKgorICAgICAqIEBz dGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAg ICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1 bmN0aW9uLgorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0 aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFt ZSc6ICdmcmVkJyB9OworICAgICAqIHZhciBnZXR0ZXIgPSBfLmNvbnN0YW50KG9iamVjdCk7Cisg ICAgICogZ2V0dGVyKCkgPT09IG9iamVjdDsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisg ICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbigpIHsK KyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBQcm9kdWNlcyBhIGNhbGxiYWNrIGJvdW5kIHRvIGFuIG9wdGlvbmFsIGB0aGlzQXJnYC4gSWYg YGZ1bmNgIGlzIGEgcHJvcGVydHkKKyAgICAgKiBuYW1lIHRoZSBjcmVhdGVkIGNhbGxiYWNrIHdp bGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBnaXZlbiBlbGVtZW50LgorICAgICAq IElmIGBmdW5jYCBpcyBhbiBvYmplY3QgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4g YHRydWVgIGZvciBlbGVtZW50cworICAgICAqIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudCBv YmplY3QgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGBmYWxzZWAuCisgICAg ICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkg VXRpbGl0aWVzCisgICAgICogQHBhcmFtIHsqfSBbZnVuYz1pZGVudGl0eV0gVGhlIHZhbHVlIHRv IGNvbnZlcnQgdG8gYSBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUg YHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suCisgICAgICogQHBhcmFtIHtu dW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGNhbGxiYWNrIGFj Y2VwdHMuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgY2FsbGJhY2sgZnVu Y3Rpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBjaGFyYWN0ZXJzID0g WworICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKKyAgICAgKiAgIHsg J25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0KKyAgICAgKiBdOworICAgICAqCisgICAgICog Ly8gd3JhcCB0byBjcmVhdGUgY3VzdG9tIGNhbGxiYWNrIHNob3J0aGFuZHMKKyAgICAgKiBfLmNy ZWF0ZUNhbGxiYWNrID0gXy53cmFwKF8uY3JlYXRlQ2FsbGJhY2ssIGZ1bmN0aW9uKGZ1bmMsIGNh bGxiYWNrLCB0aGlzQXJnKSB7CisgICAgICogICB2YXIgbWF0Y2ggPSAvXiguKz8pX18oW2dsXXQp KC4rKSQvLmV4ZWMoY2FsbGJhY2spOworICAgICAqICAgcmV0dXJuICFtYXRjaCA/IGZ1bmMoY2Fs bGJhY2ssIHRoaXNBcmcpIDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICogICAgIHJldHVybiBt YXRjaFsyXSA9PSAnZ3QnID8gb2JqZWN0W21hdGNoWzFdXSA+IG1hdGNoWzNdIDogb2JqZWN0W21h dGNoWzFdXSA8IG1hdGNoWzNdOworICAgICAqICAgfTsKKyAgICAgKiB9KTsKKyAgICAgKgorICAg ICAqIF8uZmlsdGVyKGNoYXJhY3RlcnMsICdhZ2VfX2d0MzgnKTsKKyAgICAgKiAvLyA9PiBbeyAn bmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1dCisgICAgICovCisgICAgZnVuY3Rpb24gY3JlYXRl Q2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHsKKyAgICAgIHZhciB0eXBlID0gdHlw ZW9mIGZ1bmM7CisgICAgICBpZiAoZnVuYyA9PSBudWxsIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJykg eworICAgICAgICByZXR1cm4gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0Nv dW50KTsKKyAgICAgIH0KKyAgICAgIC8vIGhhbmRsZSAiXy5wbHVjayIgc3R5bGUgY2FsbGJhY2sg c2hvcnRoYW5kcworICAgICAgaWYgKHR5cGUgIT0gJ29iamVjdCcpIHsKKyAgICAgICAgcmV0dXJu IHByb3BlcnR5KGZ1bmMpOworICAgICAgfQorICAgICAgdmFyIHByb3BzID0ga2V5cyhmdW5jKSwK KyAgICAgICAgICBrZXkgPSBwcm9wc1swXSwKKyAgICAgICAgICBhID0gZnVuY1trZXldOworCisg ICAgICAvLyBoYW5kbGUgIl8ud2hlcmUiIHN0eWxlIGNhbGxiYWNrIHNob3J0aGFuZHMKKyAgICAg IGlmIChwcm9wcy5sZW5ndGggPT0gMSAmJiBhID09PSBhICYmICFpc09iamVjdChhKSkgeworICAg ICAgICAvLyBmYXN0IHBhdGggdGhlIGNvbW1vbiBjYXNlIG9mIHByb3ZpZGluZyBhbiBvYmplY3Qg d2l0aCBhIHNpbmdsZQorICAgICAgICAvLyBwcm9wZXJ0eSBjb250YWluaW5nIGEgcHJpbWl0aXZl IHZhbHVlCisgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgICAgICB2YXIg YiA9IG9iamVjdFtrZXldOworICAgICAgICAgIHJldHVybiBhID09PSBiICYmIChhICE9PSAwIHx8 ICgxIC8gYSA9PSAxIC8gYikpOworICAgICAgICB9OworICAgICAgfQorICAgICAgcmV0dXJuIGZ1 bmN0aW9uKG9iamVjdCkgeworICAgICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLAorICAg ICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisKKyAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7Cisg ICAgICAgICAgaWYgKCEocmVzdWx0ID0gYmFzZUlzRXF1YWwob2JqZWN0W3Byb3BzW2xlbmd0aF1d LCBmdW5jW3Byb3BzW2xlbmd0aF1dLCBudWxsLCB0cnVlKSkpIHsKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAg fTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBgJmAs IGA8YCwgYD5gLCBgImAsIGFuZCBgJ2AgaW4gYHN0cmluZ2AgdG8gdGhlaXIKKyAgICAgKiBjb3Jy ZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICog QG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtz dHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZS4KKyAgICAgKiBAcmV0dXJucyB7c3Ry aW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAq CisgICAgICogXy5lc2NhcGUoJ0ZyZWQsIFdpbG1hLCAmIFBlYmJsZXMnKTsKKyAgICAgKiAvLyA9 PiAnRnJlZCwgV2lsbWEsICZhbXA7IFBlYmJsZXMnCisgICAgICovCisgICAgZnVuY3Rpb24gZXNj YXBlKHN0cmluZykgeworICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxsID8gJycgOiBTdHJpbmco c3RyaW5nKS5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpOworICAgIH0K KworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50 IHByb3ZpZGVkIHRvIGl0LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJP ZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUg QW55IHZhbHVlLgorICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCisgICAgICog QGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07 CisgICAgICogXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3Q7CisgICAgICogLy8gPT4gdHJ1 ZQorICAgICAqLworICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7CisgICAgICByZXR1cm4g dmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBmdW5jdGlvbiBwcm9wZXJ0aWVz IG9mIGEgc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAqIElm IGBvYmplY3RgIGlzIGEgZnVuY3Rpb24gbWV0aG9kcyB3aWxsIGJlIGFkZGVkIHRvIGl0cyBwcm90 b3R5cGUgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2Yg XworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9i amVjdH0gW29iamVjdD1sb2Rhc2hdIG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAg ICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRk LgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0Lgor ICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0 aGVyIHRoZSBmdW5jdGlvbnMgYWRkZWQgYXJlIGNoYWluYWJsZS4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHsKKyAgICAgKiAgIHJl dHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSkudG9M b3dlckNhc2UoKTsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBfLm1peGluKHsgJ2NhcGl0YWxp emUnOiBjYXBpdGFsaXplIH0pOworICAgICAqIF8uY2FwaXRhbGl6ZSgnZnJlZCcpOworICAgICAq IC8vID0+ICdGcmVkJworICAgICAqCisgICAgICogXygnZnJlZCcpLmNhcGl0YWxpemUoKS52YWx1 ZSgpOworICAgICAqIC8vID0+ICdGcmVkJworICAgICAqCisgICAgICogXy5taXhpbih7ICdjYXBp dGFsaXplJzogY2FwaXRhbGl6ZSB9LCB7ICdjaGFpbic6IGZhbHNlIH0pOworICAgICAqIF8oJ2Zy ZWQnKS5jYXBpdGFsaXplKCk7CisgICAgICogLy8gPT4gJ0ZyZWQnCisgICAgICovCisgICAgZnVu Y3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBjaGFpbiA9 IHRydWUsCisgICAgICAgICAgbWV0aG9kTmFtZXMgPSBzb3VyY2UgJiYgZnVuY3Rpb25zKHNvdXJj ZSk7CisKKyAgICAgIGlmICghc291cmNlIHx8ICghb3B0aW9ucyAmJiAhbWV0aG9kTmFtZXMubGVu Z3RoKSkgeworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgb3B0aW9u cyA9IHNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBjdG9yID0gbG9kYXNoV3JhcHBlcjsKKyAg ICAgICAgc291cmNlID0gb2JqZWN0OworICAgICAgICBvYmplY3QgPSBsb2Rhc2g7CisgICAgICAg IG1ldGhvZE5hbWVzID0gZnVuY3Rpb25zKHNvdXJjZSk7CisgICAgICB9CisgICAgICBpZiAob3B0 aW9ucyA9PT0gZmFsc2UpIHsKKyAgICAgICAgY2hhaW4gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBp ZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB7CisgICAgICAgIGNo YWluID0gb3B0aW9ucy5jaGFpbjsKKyAgICAgIH0KKyAgICAgIHZhciBjdG9yID0gb2JqZWN0LAor ICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24oY3Rvcik7CisKKyAgICAgIGZvckVhY2gobWV0 aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdmFyIGZ1bmMgPSBvYmpl Y3RbbWV0aG9kTmFtZV0gPSBzb3VyY2VbbWV0aG9kTmFtZV07CisgICAgICAgIGlmIChpc0Z1bmMp IHsKKyAgICAgICAgICBjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewor ICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCisgICAgICAgICAgICAg ICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLAorICAgICAgICAgICAgICAgIGFyZ3MgPSBbdmFs dWVdOworCisgICAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7CisgICAgICAg ICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseShvYmplY3QsIGFyZ3MpOworICAgICAgICAgICAg aWYgKGNoYWluIHx8IGNoYWluQWxsKSB7CisgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gcmVz dWx0ICYmIGlzT2JqZWN0KHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsK KyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgY3RvcihyZXN1bHQp OworICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7CisgICAgICAgICAg ICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgIH07CisgICAgICAgIH0K KyAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldmVydHMgdGhlICdfJyB2YXJp YWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8KKyAg ICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAg ICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQHJldHVy bnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KKyAgICAgKiBAZXhh bXBsZQorICAgICAqCisgICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpOworICAgICAq LworICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7CisgICAgICBjb250ZXh0Ll8gPSBvbGREYXNo OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBuby1vcGVy YXRpb24gZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9m IF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQGV4YW1wbGUKKyAgICAgKgor ICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07CisgICAgICogXy5ub29wKG9i amVjdCkgPT09IHVuZGVmaW5lZDsKKyAgICAgKiAvLyA9PiB0cnVlCisgICAgICovCisgICAgZnVu Y3Rpb24gbm9vcCgpIHsKKyAgICAgIC8vIG5vIG9wZXJhdGlvbiBwZXJmb3JtZWQKKyAgICB9CisK KyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2 ZSBlbGFwc2VkIHNpbmNlIHRoZSBVbml4IGVwb2NoCisgICAgICogKDEgSmFudWFyeSAxOTcwIDAw OjAwOjAwIFVUQykuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8K KyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAg ICAqIHZhciBzdGFtcCA9IF8ubm93KCk7CisgICAgICogXy5kZWZlcihmdW5jdGlvbigpIHsgY29u c29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTsgfSk7CisgICAgICogLy8gPT4gbG9ncyB0aGUgbnVt YmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgZnVuY3Rpb24gdG8g YmUgY2FsbGVkCisgICAgICovCisgICAgdmFyIG5vdyA9IGlzTmF0aXZlKG5vdyA9IERhdGUubm93 KSAmJiBub3cgfHwgZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1l KCk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBp bnRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4KKyAgICAgKiBJZiBgcmFkaXhg IGlzIGB1bmRlZmluZWRgIG9yIGAwYCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyB0 aGUKKyAgICAgKiBgdmFsdWVgIGlzIGEgaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSBgcmFk aXhgIG9mIGAxNmAgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGF2 b2lkcyBkaWZmZXJlbmNlcyBpbiBuYXRpdmUgRVMzIGFuZCBFUzUgYHBhcnNlSW50YAorICAgICAq IGltcGxlbWVudGF0aW9ucy4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyNFLgorICAgICAqCisg ICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxp dGllcworICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFyc2UuCisg ICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeF0gVGhlIHJhZGl4IHVzZWQgdG8gaW50ZXJwcmV0 IHRoZSB2YWx1ZSB0byBwYXJzZS4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRo ZSBuZXcgaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy5w YXJzZUludCgnMDgnKTsKKyAgICAgKiAvLyA9PiA4CisgICAgICovCisgICAgdmFyIHBhcnNlSW50 ID0gbmF0aXZlUGFyc2VJbnQod2hpdGVzcGFjZSArICcwOCcpID09IDggPyBuYXRpdmVQYXJzZUlu dCA6IGZ1bmN0aW9uKHZhbHVlLCByYWRpeCkgeworICAgICAgLy8gRmlyZWZveCA8IDIxIGFuZCBP cGVyYSA8IDE1IGZvbGxvdyB0aGUgRVMzIHNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBgcGFy c2VJbnRgCisgICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQoaXNTdHJpbmcodmFsdWUpID8gdmFs dWUucmVwbGFjZShyZUxlYWRpbmdTcGFjZXNBbmRaZXJvcywgJycpIDogdmFsdWUsIHJhZGl4IHx8 IDApOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgIl8ucGx1Y2siIHN0eWxl IGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIHRoZSBga2V5YCB2YWx1ZSBvZiBhCisgICAgICogZ2l2 ZW4gb2JqZWN0LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAqIEBtZW1iZXJPZiBfCisg ICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhl IG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm5zIHtGdW5j dGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAqIEBleGFtcGxlCisgICAgICoK KyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAg J2FnZSc6IDQwIH0sCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9Cisg ICAgICogXTsKKyAgICAgKgorICAgICAqIHZhciBnZXROYW1lID0gXy5wcm9wZXJ0eSgnbmFtZScp OworICAgICAqCisgICAgICogXy5tYXAoY2hhcmFjdGVycywgZ2V0TmFtZSk7CisgICAgICogLy8g PT4gWydiYXJuZXknLCAnZnJlZCddCisgICAgICoKKyAgICAgKiBfLnNvcnRCeShjaGFyYWN0ZXJz LCBnZXROYW1lKTsKKyAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYg fSwgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfV0KKyAgICAgKi8KKyAgICBmdW5jdGlv biBwcm9wZXJ0eShrZXkpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAg ICAgcmV0dXJuIG9iamVjdFtrZXldOworICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAgKGluY2x1 c2l2ZSkuIElmIG9ubHkgb25lCisgICAgICogYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIg YmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXIgd2lsbCBiZQorICAgICAqIHJldHVybmVk LiBJZiBgZmxvYXRpbmdgIGlzIHRydWV5IG9yIGVpdGhlciBgbWluYCBvciBgbWF4YCBhcmUgZmxv YXRzIGEKKyAgICAgKiBmbG9hdGluZy1wb2ludCBudW1iZXIgd2lsbCBiZSByZXR1cm5lZCBpbnN0 ZWFkIG9mIGFuIGludGVnZXIuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzCisgICAgICogQHBhcmFtIHtudW1iZXJ9 IFttaW49MF0gVGhlIG1pbmltdW0gcG9zc2libGUgdmFsdWUuCisgICAgICogQHBhcmFtIHtudW1i ZXJ9IFttYXg9MV0gVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisgICAgICogQHBhcmFtIHti b29sZWFufSBbZmxvYXRpbmc9ZmFsc2VdIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9p bnQgbnVtYmVyLgorICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYSByYW5kb20gbnVt YmVyLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiBfLnJhbmRvbSgwLCA1KTsKKyAg ICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNQorICAgICAqCisgICAgICogXy5y YW5kb20oNSk7CisgICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNQor ICAgICAqCisgICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7CisgICAgICogLy8gPT4gYSBmbG9hdGlu Zy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1CisgICAgICoKKyAgICAgKiBfLnJhbmRvbSgx LjIsIDUuMik7CisgICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAx LjIgYW5kIDUuMgorICAgICAqLworICAgIGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCwgZmxvYXRp bmcpIHsKKyAgICAgIHZhciBub01pbiA9IG1pbiA9PSBudWxsLAorICAgICAgICAgIG5vTWF4ID0g bWF4ID09IG51bGw7CisKKyAgICAgIGlmIChmbG9hdGluZyA9PSBudWxsKSB7CisgICAgICAgIGlm ICh0eXBlb2YgbWluID09ICdib29sZWFuJyAmJiBub01heCkgeworICAgICAgICAgIGZsb2F0aW5n ID0gbWluOworICAgICAgICAgIG1pbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAo IW5vTWF4ICYmIHR5cGVvZiBtYXggPT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgICAgZmxvYXRpbmcg PSBtYXg7CisgICAgICAgICAgbm9NYXggPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAg ICBpZiAobm9NaW4gJiYgbm9NYXgpIHsKKyAgICAgICAgbWF4ID0gMTsKKyAgICAgIH0KKyAgICAg IG1pbiA9ICttaW4gfHwgMDsKKyAgICAgIGlmIChub01heCkgeworICAgICAgICBtYXggPSBtaW47 CisgICAgICAgIG1pbiA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXggPSArbWF4IHx8 IDA7CisgICAgICB9CisgICAgICBpZiAoZmxvYXRpbmcgfHwgbWluICUgMSB8fCBtYXggJSAxKSB7 CisgICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7CisgICAgICAgIHJldHVybiBuYXRp dmVNaW4obWluICsgKHJhbmQgKiAobWF4IC0gbWluICsgcGFyc2VGbG9hdCgnMWUtJyArICgocmFu ZCArJycpLmxlbmd0aCAtIDEpKSkpLCBtYXgpOworICAgICAgfQorICAgICAgcmV0dXJuIGJhc2VS YW5kb20obWluLCBtYXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIHRoZSB2 YWx1ZSBvZiBwcm9wZXJ0eSBga2V5YCBvbiBgb2JqZWN0YC4gSWYgYGtleWAgaXMgYSBmdW5jdGlv bgorICAgICAqIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBg b2JqZWN0YCBhbmQgaXRzIHJlc3VsdCByZXR1cm5lZCwKKyAgICAgKiBlbHNlIHRoZSBwcm9wZXJ0 eSB2YWx1ZSBpcyByZXR1cm5lZC4gSWYgYG9iamVjdGAgaXMgZmFsc2V5IHRoZW4gYHVuZGVmaW5l ZGAKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBA bWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge09i amVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmlu Z30ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLgorICAgICAqIEByZXR1 cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KKyAgICAgKiBAZXhhbXBsZQorICAg ICAqCisgICAgICogdmFyIG9iamVjdCA9IHsKKyAgICAgKiAgICdjaGVlc2UnOiAnY3J1bXBldHMn LAorICAgICAqICAgJ3N0dWZmJzogZnVuY3Rpb24oKSB7CisgICAgICogICAgIHJldHVybiAnbm9u c2Vuc2UnOworICAgICAqICAgfQorICAgICAqIH07CisgICAgICoKKyAgICAgKiBfLnJlc3VsdChv YmplY3QsICdjaGVlc2UnKTsKKyAgICAgKiAvLyA9PiAnY3J1bXBldHMnCisgICAgICoKKyAgICAg KiBfLnJlc3VsdChvYmplY3QsICdzdHVmZicpOworICAgICAqIC8vID0+ICdub25zZW5zZScKKyAg ICAgKi8KKyAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBrZXkpIHsKKyAgICAgIGlmIChvYmpl Y3QpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07CisgICAgICAgIHJldHVybiBp c0Z1bmN0aW9uKHZhbHVlKSA/IG9iamVjdFtrZXldKCkgOiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9 CisKKyAgICAvKioKKyAgICAgKiBBIG1pY3JvLXRlbXBsYXRpbmcgbWV0aG9kIHRoYXQgaGFuZGxl cyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzCisgICAgICogd2hpdGVzcGFjZSwgYW5k IGNvcnJlY3RseSBlc2NhcGVzIHF1b3RlcyB3aXRoaW4gaW50ZXJwb2xhdGVkIGNvZGUuCisgICAg ICoKKyAgICAgKiBOb3RlOiBJbiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQsIGBfLnRlbXBsYXRlYCB1 dGlsaXplcyBzb3VyY2VVUkxzIGZvciBlYXNpZXIKKyAgICAgKiBkZWJ1Z2dpbmcuIFNlZSBodHRw Oi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2Vt YXBzLyN0b2Mtc291cmNldXJsCisgICAgICoKKyAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBv biBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZToKKyAgICAgKiBodHRwOi8vbG9kYXNoLmNvbS9j dXN0b20tYnVpbGRzCisgICAgICoKKyAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJv bWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWU6CisgICAgICogaHR0cDovL2RldmVsb3Blci5jaHJv bWUuY29tL3N0YWJsZS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsLmh0bWwKKyAgICAgKgorICAg ICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBVdGlsaXRp ZXMKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGVtcGxhdGUgdGV4dC4KKyAgICAg KiBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSBvYmplY3QgdXNlZCB0byBwb3B1bGF0ZSB0 aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9i amVjdC4KKyAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlXSBUaGUgImVzY2Fw ZSIgZGVsaW1pdGVyLgorICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZV0g VGhlICJldmFsdWF0ZSIgZGVsaW1pdGVyLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9u cy5pbXBvcnRzXSBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGxvY2Fs IHZhcmlhYmxlcy4KKyAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGVd IFRoZSAiaW50ZXJwb2xhdGUiIGRlbGltaXRlci4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Nv dXJjZVVSTF0gVGhlIHNvdXJjZVVSTCBvZiB0aGUgdGVtcGxhdGUncyBjb21waWxlZCBzb3VyY2Uu CisgICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YXJpYWJsZV0gVGhlIGRhdGEgb2JqZWN0IHZhcmlh YmxlIG5hbWUuCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufHN0cmluZ30gUmV0dXJucyBhIGNv bXBpbGVkIGZ1bmN0aW9uIHdoZW4gbm8gYGRhdGFgIG9iamVjdAorICAgICAqICBpcyBnaXZlbiwg ZWxzZSBpdCByZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdGV4dC4KKyAgICAgKiBAZXhhbXBsZQor ICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVyIHRvIGNy ZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlCisgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0 ZSgnaGVsbG8gPCU9IG5hbWUgJT4nKTsKKyAgICAgKiBjb21waWxlZCh7ICduYW1lJzogJ2ZyZWQn IH0pOworICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJworICAgICAqCisgICAgICogLy8gdXNpbmcg dGhlICJlc2NhcGUiIGRlbGltaXRlciB0byBlc2NhcGUgSFRNTCBpbiBkYXRhIHByb3BlcnR5IHZh bHVlcworICAgICAqIF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nLCB7ICd2YWx1ZSc6 ICc8c2NyaXB0PicgfSk7CisgICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPicKKyAg ICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSAiZXZhbHVhdGUiIGRlbGltaXRlciB0byBnZW5lcmF0 ZSBIVE1MCisgICAgICogdmFyIGxpc3QgPSAnPCUgXy5mb3JFYWNoKHBlb3BsZSwgZnVuY3Rpb24o bmFtZSkgeyAlPjxsaT48JS0gbmFtZSAlPjwvbGk+PCUgfSk7ICU+JzsKKyAgICAgKiBfLnRlbXBs YXRlKGxpc3QsIHsgJ3Blb3BsZSc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTsKKyAgICAgKiAvLyA9 PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPicKKyAgICAgKgorICAgICAqIC8vIHVzaW5n IHRoZSBFUzYgZGVsaW1pdGVyIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBkZWZhdWx0ICJpbnRl cnBvbGF0ZSIgZGVsaW1pdGVyCisgICAgICogXy50ZW1wbGF0ZSgnaGVsbG8gJHsgbmFtZSB9Jywg eyAnbmFtZSc6ICdwZWJibGVzJyB9KTsKKyAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcycKKyAg ICAgKgorICAgICAqIC8vIHVzaW5nIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluICJl dmFsdWF0ZSIgZGVsaW1pdGVycworICAgICAqIF8udGVtcGxhdGUoJzwlIHByaW50KCJoZWxsbyAi ICsgbmFtZSk7ICU+IScsIHsgJ25hbWUnOiAnYmFybmV5JyB9KTsKKyAgICAgKiAvLyA9PiAnaGVs bG8gYmFybmV5IScKKyAgICAgKgorICAgICAqIC8vIHVzaW5nIGEgY3VzdG9tIHRlbXBsYXRlIGRl bGltaXRlcnMKKyAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7CisgICAgICogICAnaW50ZXJw b2xhdGUnOiAve3soW1xzXFNdKz8pfX0vZworICAgICAqIH07CisgICAgICoKKyAgICAgKiBfLnRl bXBsYXRlKCdoZWxsbyB7eyBuYW1lIH19IScsIHsgJ25hbWUnOiAnbXVzdGFjaGUnIH0pOworICAg ICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnCisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0aGUg YGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgalF1ZXJ5CisgICAgICogdmFyIGxpc3QgPSAnPCUg anEuZWFjaChwZW9wbGUsIGZ1bmN0aW9uKG5hbWUpIHsgJT48bGk+PCUtIG5hbWUgJT48L2xpPjwl IH0pOyAlPic7CisgICAgICogXy50ZW1wbGF0ZShsaXN0LCB7ICdwZW9wbGUnOiBbJ2ZyZWQnLCAn YmFybmV5J10gfSwgeyAnaW1wb3J0cyc6IHsgJ2pxJzogalF1ZXJ5IH0gfSk7CisgICAgICogLy8g PT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nCisgICAgICoKKyAgICAgKiAvLyB1c2lu ZyB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZv ciB0aGUgdGVtcGxhdGUKKyAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8 JT0gbmFtZSAlPicsIG51bGwsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9 KTsKKyAgICAgKiBjb21waWxlZChkYXRhKTsKKyAgICAgKiAvLyA9PiBmaW5kIHRoZSBzb3VyY2Ug b2YgImdyZWV0aW5nLmpzdCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5l bCBvZiB0aGUgd2ViIGluc3BlY3RvcgorICAgICAqCisgICAgICogLy8gdXNpbmcgdGhlIGB2YXJp YWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhl IGNvbXBpbGVkIHRlbXBsYXRlCisgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkg PCU9IGRhdGEubmFtZSAlPiEnLCBudWxsLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTsKKyAgICAg KiBjb21waWxlZC5zb3VyY2U7CisgICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkgeworICAgICAq ICAgdmFyIF9fdCwgX19wID0gJycsIF9fZSA9IF8uZXNjYXBlOworICAgICAqICAgX19wICs9ICdo aSAnICsgKChfX3QgPSAoIGRhdGEubmFtZSApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnOwor ICAgICAqICAgcmV0dXJuIF9fcDsKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiAvLyB1c2luZyB0 aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVh bmluZ2Z1bAorICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgYSBz dGFjayB0cmFjZQorICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGN3ZCwgJ2pzdC5q cycpLCAnXAorICAgICAqICAgdmFyIEpTVCA9IHtcCisgICAgICogICAgICJtYWluIjogJyArIF8u dGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcCisgICAgICogICB9O1wKKyAgICAgKiAnKTsK KyAgICAgKi8KKyAgICBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZXh0LCBkYXRhLCBvcHRpb25zKSB7Cisg ICAgICAvLyBiYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uCisgICAg ICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLwor ICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcworICAgICAgLy8gaHR0cHM6Ly9n aXRodWIuY29tL29sYWRvL2RvVAorICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRl U2V0dGluZ3M7CisgICAgICB0ZXh0ID0gU3RyaW5nKHRleHQgfHwgJycpOworCisgICAgICAvLyBh dm9pZCBtaXNzaW5nIGRlcGVuZGVuY2llcyB3aGVuIGBpdGVyYXRvclRlbXBsYXRlYCBpcyBub3Qg ZGVmaW5lZAorICAgICAgb3B0aW9ucyA9IGRlZmF1bHRzKHt9LCBvcHRpb25zLCBzZXR0aW5ncyk7 CisKKyAgICAgIHZhciBpbXBvcnRzID0gZGVmYXVsdHMoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0 dGluZ3MuaW1wb3J0cyksCisgICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLAor ICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSB2YWx1ZXMoaW1wb3J0cyk7CisKKyAgICAgIHZhciBp c0V2YWx1YXRpbmcsCisgICAgICAgICAgaW5kZXggPSAwLAorICAgICAgICAgIGludGVycG9sYXRl ID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsCisgICAgICAgICAgc291cmNlID0g Il9fcCArPSAnIjsKKworICAgICAgLy8gY29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2gg ZGVsaW1pdGVyCisgICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKAorICAgICAgICAob3B0 aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgKworICAgICAgICBpbnRlcnBv bGF0ZS5zb3VyY2UgKyAnfCcgKworICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xh dGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArCisgICAgICAgIChv cHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJworICAgICAgLCAnZycp OworCisgICAgICB0ZXh0LnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNj YXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1 ZSwgb2Zmc2V0KSB7CisgICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFs dWUgPSBlc1RlbXBsYXRlVmFsdWUpOworCisgICAgICAgIC8vIGVzY2FwZSBjaGFyYWN0ZXJzIHRo YXQgY2Fubm90IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscworICAgICAgICBzb3VyY2Ug Kz0gdGV4dC5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBl c2NhcGVTdHJpbmdDaGFyKTsKKworICAgICAgICAvLyByZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBz bmlwcGV0cworICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHsKKyAgICAgICAgICBzb3VyY2UgKz0g IicgK1xuX19lKCIgKyBlc2NhcGVWYWx1ZSArICIpICtcbiciOworICAgICAgICB9CisgICAgICAg IGlmIChldmFsdWF0ZVZhbHVlKSB7CisgICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTsKKyAg ICAgICAgICBzb3VyY2UgKz0gIic7XG4iICsgZXZhbHVhdGVWYWx1ZSArICI7XG5fX3AgKz0gJyI7 CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHsKKyAgICAgICAgICBz b3VyY2UgKz0gIicgK1xuKChfX3QgPSAoIiArIGludGVycG9sYXRlVmFsdWUgKyAiKSkgPT0gbnVs bCA/ICcnIDogX190KSArXG4nIjsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IG9mZnNldCAr IG1hdGNoLmxlbmd0aDsKKworICAgICAgICAvLyB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFk b2JlIHByb2R1Y3RzIHJlcXVpcmVzIHJldHVybmluZyB0aGUgYG1hdGNoYAorICAgICAgICAvLyBz dHJpbmcgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZQorICAg ICAgICByZXR1cm4gbWF0Y2g7CisgICAgICB9KTsKKworICAgICAgc291cmNlICs9ICInO1xuIjsK KworICAgICAgLy8gaWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkLCB3cmFwIGEgd2l0aC1z dGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWQKKyAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBk YXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbgorICAgICAgdmFyIHZhcmlh YmxlID0gb3B0aW9ucy52YXJpYWJsZSwKKyAgICAgICAgICBoYXNWYXJpYWJsZSA9IHZhcmlhYmxl OworCisgICAgICBpZiAoIWhhc1ZhcmlhYmxlKSB7CisgICAgICAgIHZhcmlhYmxlID0gJ29iaic7 CisgICAgICAgIHNvdXJjZSA9ICd3aXRoICgnICsgdmFyaWFibGUgKyAnKSB7XG4nICsgc291cmNl ICsgJ1xufVxuJzsKKyAgICAgIH0KKyAgICAgIC8vIGNsZWFudXAgY29kZSBieSBzdHJpcHBpbmcg ZW1wdHkgc3RyaW5ncworICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBs YWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpCisgICAgICAgIC5yZXBsYWNl KHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpCisgICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJp bmdUcmFpbGluZywgJyQxOycpOworCisgICAgICAvLyBmcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlv biBib2R5CisgICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArIHZhcmlhYmxlICsgJykge1xuJyAr CisgICAgICAgIChoYXNWYXJpYWJsZSA/ICcnIDogdmFyaWFibGUgKyAnIHx8ICgnICsgdmFyaWFi bGUgKyAnID0ge30pO1xuJykgKworICAgICAgICAidmFyIF9fdCwgX19wID0gJycsIF9fZSA9IF8u ZXNjYXBlIiArCisgICAgICAgIChpc0V2YWx1YXRpbmcKKyAgICAgICAgICA/ICcsIF9faiA9IEFy cmF5LnByb3RvdHlwZS5qb2luO1xuJyArCisgICAgICAgICAgICAiZnVuY3Rpb24gcHJpbnQoKSB7 IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iCisgICAgICAgICAgOiAnO1xuJwor ICAgICAgICApICsKKyAgICAgICAgc291cmNlICsKKyAgICAgICAgJ3JldHVybiBfX3Bcbn0nOwor CisgICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuCisgICAgICAv LyBodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9z b3VyY2VtYXBzLyN0b2Mtc291cmNldXJsCisgICAgICB2YXIgc291cmNlVVJMID0gJ1xuLypcbi8v IyBzb3VyY2VVUkw9JyArIChvcHRpb25zLnNvdXJjZVVSTCB8fCAnL2xvZGFzaC90ZW1wbGF0ZS9z b3VyY2VbJyArICh0ZW1wbGF0ZUNvdW50ZXIrKykgKyAnXScpICsgJ1xuKi8nOworCisgICAgICB0 cnkgeworICAgICAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24oaW1wb3J0c0tleXMsICdyZXR1cm4g JyArIHNvdXJjZSArIHNvdXJjZVVSTCkuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTsK KyAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICBlLnNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAg dGhyb3cgZTsKKyAgICAgIH0KKyAgICAgIGlmIChkYXRhKSB7CisgICAgICAgIHJldHVybiByZXN1 bHQoZGF0YSk7CisgICAgICB9CisgICAgICAvLyBwcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlv bidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2QsIGluCisgICAgICAvLyBzdXBwb3J0 ZWQgZW52aXJvbm1lbnRzLCBvciB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5j ZSBmb3IKKyAgICAgIC8vIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcyBkdXJpbmcgdGhlIGJ1 aWxkIHByb2Nlc3MKKyAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7CisgICAgICByZXR1cm4g cmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBjYWxsYmFjayBg bmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cworICAgICAqIG9mIGVh Y2ggY2FsbGJhY2sgZXhlY3V0aW9uLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdg IGFuZCBpbnZva2VkCisgICAgICogd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuCisgICAgICoK KyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgVXRp bGl0aWVzCisgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBl eGVjdXRlIHRoZSBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBU aGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uCisgICAgICogQHBhcmFtIHsqfSBbdGhp c0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuCisgICAgICogQHJldHVybnMg e0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggYGNhbGxiYWNr YCBleGVjdXRpb24uCisgICAgICogQGV4YW1wbGUKKyAgICAgKgorICAgICAqIHZhciBkaWNlUm9s bHMgPSBfLnRpbWVzKDMsIF8ucGFydGlhbChfLnJhbmRvbSwgMSwgNikpOworICAgICAqIC8vID0+ IFszLCA2LCA0XQorICAgICAqCisgICAgICogXy50aW1lcygzLCBmdW5jdGlvbihuKSB7IG1hZ2Uu Y2FzdFNwZWxsKG4pOyB9KTsKKyAgICAgKiAvLyA9PiBjYWxscyBgbWFnZS5jYXN0U3BlbGwobilg IHRocmVlIHRpbWVzLCBwYXNzaW5nIGBuYCBvZiBgMGAsIGAxYCwgYW5kIGAyYCByZXNwZWN0aXZl bHkKKyAgICAgKgorICAgICAqIF8udGltZXMoMywgZnVuY3Rpb24obikgeyB0aGlzLmNhc3Qobik7 IH0sIG1hZ2UpOworICAgICAqIC8vID0+IGFsc28gY2FsbHMgYG1hZ2UuY2FzdFNwZWxsKG4pYCB0 aHJlZSB0aW1lcworICAgICAqLworICAgIGZ1bmN0aW9uIHRpbWVzKG4sIGNhbGxiYWNrLCB0aGlz QXJnKSB7CisgICAgICBuID0gKG4gPSArbikgPiAtMSA/IG4gOiAwOworICAgICAgdmFyIGluZGV4 ID0gLTEsCisgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobik7CisKKyAgICAgIGNhbGxiYWNrID0g YmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKTsKKyAgICAgIHdoaWxlICgr K2luZGV4IDwgbikgeworICAgICAgICByZXN1bHRbaW5kZXhdID0gY2FsbGJhY2soaW5kZXgpOwor ICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBU aGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgIHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVu dGl0aWVzCisgICAgICogYCZhbXA7YCwgYCZsdDtgLCBgJmd0O2AsIGAmcXVvdDtgLCBhbmQgYCYj Mzk7YCBpbiBgc3RyaW5nYCB0byB0aGVpcgorICAgICAqIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVy cy4KKyAgICAgKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAbWVtYmVyT2YgXworICAgICAqIEBj YXRlZ29yeSBVdGlsaXRpZXMKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJp bmcgdG8gdW5lc2NhcGUuCisgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5l c2NhcGVkIHN0cmluZy4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICogXy51bmVzY2Fw ZSgnRnJlZCwgQmFybmV5ICZhbXA7IFBlYmJsZXMnKTsKKyAgICAgKiAvLyA9PiAnRnJlZCwgQmFy bmV5ICYgUGViYmxlcycKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsK KyAgICAgIHJldHVybiBzdHJpbmcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0cmluZykucmVwbGFj ZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKTsKKyAgICB9CisKKyAgICAvKioKKyAg ICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIHByb3ZpZGVkIHRoZSBJ RCB3aWxsIGJlIGFwcGVuZGVkIHRvIGl0LgorICAgICAqCisgICAgICogQHN0YXRpYworICAgICAq IEBtZW1iZXJPZiBfCisgICAgICogQGNhdGVnb3J5IFV0aWxpdGllcworICAgICAqIEBwYXJhbSB7 c3RyaW5nfSBbcHJlZml4XSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLgorICAgICAq IEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC4KKyAgICAgKiBAZXhhbXBs ZQorICAgICAqCisgICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTsKKyAgICAgKiAvLyA9PiAn Y29udGFjdF8xMDQnCisgICAgICoKKyAgICAgKiBfLnVuaXF1ZUlkKCk7CisgICAgICogLy8gPT4g JzEwNScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHsKKyAgICAgIHZh ciBpZCA9ICsraWRDb3VudGVyOworICAgICAgcmV0dXJuIFN0cmluZyhwcmVmaXggPT0gbnVsbCA/ ICcnIDogcHJlZml4KSArIGlkOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB0aGF0IHdyYXBzIHRo ZSBnaXZlbiB2YWx1ZSB3aXRoIGV4cGxpY2l0CisgICAgICogbWV0aG9kIGNoYWluaW5nIGVuYWJs ZWQuCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJlck9mIF8KKyAgICAgKiBA Y2F0ZWdvcnkgQ2hhaW5pbmcKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3 cmFwLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0 LgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFsKKyAg ICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFt ZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sCisgICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMn LCAnYWdlJzogMSB9CisgICAgICogXTsKKyAgICAgKgorICAgICAqIHZhciB5b3VuZ2VzdCA9IF8u Y2hhaW4oY2hhcmFjdGVycykKKyAgICAgKiAgICAgLnNvcnRCeSgnYWdlJykKKyAgICAgKiAgICAg Lm1hcChmdW5jdGlvbihjaHIpIHsgcmV0dXJuIGNoci5uYW1lICsgJyBpcyAnICsgY2hyLmFnZTsg fSkKKyAgICAgKiAgICAgLmZpcnN0KCkKKyAgICAgKiAgICAgLnZhbHVlKCk7CisgICAgICogLy8g PT4gJ3BlYmJsZXMgaXMgMScKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkgewor ICAgICAgdmFsdWUgPSBuZXcgbG9kYXNoV3JhcHBlcih2YWx1ZSk7CisgICAgICB2YWx1ZS5fX2No YWluX18gPSB0cnVlOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAg ICAqIEludm9rZXMgYGludGVyY2VwdG9yYCB3aXRoIHRoZSBgdmFsdWVgIGFzIHRoZSBmaXJzdCBh cmd1bWVudCBhbmQgdGhlbgorICAgICAqIHJldHVybnMgYHZhbHVlYC4gVGhlIHB1cnBvc2Ugb2Yg dGhpcyBtZXRob2QgaXMgdG8gInRhcCBpbnRvIiBhIG1ldGhvZAorICAgICAqIGNoYWluIGluIG9y ZGVyIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBpbnRlcm1lZGlhdGUgcmVzdWx0cyB3aXRoaW4K KyAgICAgKiB0aGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAc3RhdGljCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmcKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVl IFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuCisgICAgICogQHBhcmFtIHtG dW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4KKyAgICAgKiBAcmV0 dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLgorICAgICAqIEBleGFtcGxlCisgICAgICoKKyAgICAg KiBfKFsxLCAyLCAzLCA0XSkKKyAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkgeyBhcnJheS5w b3AoKTsgfSkKKyAgICAgKiAgLnJldmVyc2UoKQorICAgICAqICAudmFsdWUoKTsKKyAgICAgKiAv LyA9PiBbMywgMiwgMV0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2Vw dG9yKSB7CisgICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7CisgICAgICByZXR1cm4gdmFsdWU7Cisg ICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBleHBsaWNpdCBtZXRob2QgY2hhaW5pbmcg b24gdGhlIHdyYXBwZXIgb2JqZWN0LgorICAgICAqCisgICAgICogQG5hbWUgY2hhaW4KKyAgICAg KiBAbWVtYmVyT2YgXworICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZworICAgICAqIEByZXR1cm5z IHsqfSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAq CisgICAgICogdmFyIGNoYXJhY3RlcnMgPSBbCisgICAgICogICB7ICduYW1lJzogJ2Jhcm5leScs ICdhZ2UnOiAzNiB9LAorICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfQor ICAgICAqIF07CisgICAgICoKKyAgICAgKiAvLyB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nCisg ICAgICogXyhjaGFyYWN0ZXJzKS5maXJzdCgpOworICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFy bmV5JywgJ2FnZSc6IDM2IH0KKyAgICAgKgorICAgICAqIC8vIHdpdGggZXhwbGljaXQgY2hhaW5p bmcKKyAgICAgKiBfKGNoYXJhY3RlcnMpLmNoYWluKCkKKyAgICAgKiAgIC5maXJzdCgpCisgICAg ICogICAucGljaygnYWdlJykKKyAgICAgKiAgIC52YWx1ZSgpOworICAgICAqIC8vID0+IHsgJ2Fn ZSc6IDM2IH0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7CisgICAgICB0 aGlzLl9fY2hhaW5fXyA9IHRydWU7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAv KioKKyAgICAgKiBQcm9kdWNlcyB0aGUgYHRvU3RyaW5nYCByZXN1bHQgb2YgdGhlIHdyYXBwZWQg dmFsdWUuCisgICAgICoKKyAgICAgKiBAbmFtZSB0b1N0cmluZworICAgICAqIEBtZW1iZXJPZiBf CisgICAgICogQGNhdGVnb3J5IENoYWluaW5nCisgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0 dXJucyB0aGUgc3RyaW5nIHJlc3VsdC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqCisgICAgICog XyhbMSwgMiwgM10pLnRvU3RyaW5nKCk7CisgICAgICogLy8gPT4gJzEsMiwzJworICAgICAqLwor ICAgIGZ1bmN0aW9uIHdyYXBwZXJUb1N0cmluZygpIHsKKyAgICAgIHJldHVybiBTdHJpbmcodGhp cy5fX3dyYXBwZWRfXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMgdGhlIHdy YXBwZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAbmFtZSB2YWx1ZU9mCisgICAgICogQG1lbWJl ck9mIF8KKyAgICAgKiBAYWxpYXMgdmFsdWUKKyAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmcKKyAg ICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgd3JhcHBlZCB2YWx1ZS4KKyAgICAgKiBAZXhh bXBsZQorICAgICAqCisgICAgICogXyhbMSwgMiwgM10pLnZhbHVlT2YoKTsKKyAgICAgKiAvLyA9 PiBbMSwgMiwgM10KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWVPZigpIHsKKyAg ICAgIHJldHVybiB0aGlzLl9fd3JhcHBlZF9fOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0qLworCisgICAgLy8gYWRkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVl cyB3aGVuIGNoYWluaW5nCisgICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7CisgICAgbG9kYXNoLmFz c2lnbiA9IGFzc2lnbjsKKyAgICBsb2Rhc2guYXQgPSBhdDsKKyAgICBsb2Rhc2guYmluZCA9IGJp bmQ7CisgICAgbG9kYXNoLmJpbmRBbGwgPSBiaW5kQWxsOworICAgIGxvZGFzaC5iaW5kS2V5ID0g YmluZEtleTsKKyAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjsKKyAgICBsb2Rhc2guY29tcGFjdCA9 IGNvbXBhY3Q7CisgICAgbG9kYXNoLmNvbXBvc2UgPSBjb21wb3NlOworICAgIGxvZGFzaC5jb25z dGFudCA9IGNvbnN0YW50OworICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTsKKyAgICBsb2Rh c2guY3JlYXRlID0gY3JlYXRlOworICAgIGxvZGFzaC5jcmVhdGVDYWxsYmFjayA9IGNyZWF0ZUNh bGxiYWNrOworICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5OworICAgIGxvZGFzaC5kZWJvdW5jZSA9 IGRlYm91bmNlOworICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzOworICAgIGxvZGFzaC5k ZWZlciA9IGRlZmVyOworICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5OworICAgIGxvZGFzaC5kaWZm ZXJlbmNlID0gZGlmZmVyZW5jZTsKKyAgICBsb2Rhc2guZmlsdGVyID0gZmlsdGVyOworICAgIGxv ZGFzaC5mbGF0dGVuID0gZmxhdHRlbjsKKyAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7Cisg ICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDsKKyAgICBsb2Rhc2guZm9ySW4g PSBmb3JJbjsKKyAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7CisgICAgbG9kYXNo LmZvck93biA9IGZvck93bjsKKyAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDsK KyAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zOworICAgIGxvZGFzaC5ncm91cEJ5ID0g Z3JvdXBCeTsKKyAgICBsb2Rhc2guaW5kZXhCeSA9IGluZGV4Qnk7CisgICAgbG9kYXNoLmluaXRp YWwgPSBpbml0aWFsOworICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247Cisg ICAgbG9kYXNoLmludmVydCA9IGludmVydDsKKyAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlOwor ICAgIGxvZGFzaC5rZXlzID0ga2V5czsKKyAgICBsb2Rhc2gubWFwID0gbWFwOworICAgIGxvZGFz aC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7CisgICAgbG9kYXNoLm1heCA9IG1heDsKKyAgICBsb2Rh c2gubWVtb2l6ZSA9IG1lbW9pemU7CisgICAgbG9kYXNoLm1lcmdlID0gbWVyZ2U7CisgICAgbG9k YXNoLm1pbiA9IG1pbjsKKyAgICBsb2Rhc2gub21pdCA9IG9taXQ7CisgICAgbG9kYXNoLm9uY2Ug PSBvbmNlOworICAgIGxvZGFzaC5wYWlycyA9IHBhaXJzOworICAgIGxvZGFzaC5wYXJ0aWFsID0g cGFydGlhbDsKKyAgICBsb2Rhc2gucGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0OworICAgIGxv ZGFzaC5waWNrID0gcGljazsKKyAgICBsb2Rhc2gucGx1Y2sgPSBwbHVjazsKKyAgICBsb2Rhc2gu cHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICBsb2Rhc2gucHVsbCA9IHB1bGw7CisgICAgbG9kYXNo LnJhbmdlID0gcmFuZ2U7CisgICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDsKKyAgICBsb2Rhc2gu cmVtb3ZlID0gcmVtb3ZlOworICAgIGxvZGFzaC5yZXN0ID0gcmVzdDsKKyAgICBsb2Rhc2guc2h1 ZmZsZSA9IHNodWZmbGU7CisgICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTsKKyAgICBsb2Rhc2gu dGFwID0gdGFwOworICAgIGxvZGFzaC50aHJvdHRsZSA9IHRocm90dGxlOworICAgIGxvZGFzaC50 aW1lcyA9IHRpbWVzOworICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTsKKyAgICBsb2Rhc2gu dHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uOworICAgIGxv ZGFzaC51bmlxID0gdW5pcTsKKyAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzOworICAgIGxvZGFz aC53aGVyZSA9IHdoZXJlOworICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDsKKyAgICBsb2Rh c2gud3JhcCA9IHdyYXA7CisgICAgbG9kYXNoLnhvciA9IHhvcjsKKyAgICBsb2Rhc2guemlwID0g emlwOworICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7CisKKyAgICAvLyBhZGQgYWxp YXNlcworICAgIGxvZGFzaC5jb2xsZWN0ID0gbWFwOworICAgIGxvZGFzaC5kcm9wID0gcmVzdDsK KyAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7CisgICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVh Y2hSaWdodDsKKyAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduOworICAgIGxvZGFzaC5tZXRob2Rz ID0gZnVuY3Rpb25zOworICAgIGxvZGFzaC5vYmplY3QgPSB6aXBPYmplY3Q7CisgICAgbG9kYXNo LnNlbGVjdCA9IGZpbHRlcjsKKyAgICBsb2Rhc2gudGFpbCA9IHJlc3Q7CisgICAgbG9kYXNoLnVu aXF1ZSA9IHVuaXE7CisgICAgbG9kYXNoLnVuemlwID0gemlwOworCisgICAgLy8gYWRkIGZ1bmN0 aW9ucyB0byBgbG9kYXNoLnByb3RvdHlwZWAKKyAgICBtaXhpbihsb2Rhc2gpOworCisgICAgLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvLyBhZGQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHVu d3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmluZworICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lOwor ICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7CisgICAgbG9kYXNoLmNvbnRhaW5zID0g Y29udGFpbnM7CisgICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTsKKyAgICBsb2Rhc2guZXZlcnkg PSBldmVyeTsKKyAgICBsb2Rhc2guZmluZCA9IGZpbmQ7CisgICAgbG9kYXNoLmZpbmRJbmRleCA9 IGZpbmRJbmRleDsKKyAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7CisgICAgbG9kYXNoLmZp bmRMYXN0ID0gZmluZExhc3Q7CisgICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdElu ZGV4OworICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5OworICAgIGxvZGFzaC5o YXMgPSBoYXM7CisgICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7CisgICAgbG9kYXNoLmlu ZGV4T2YgPSBpbmRleE9mOworICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzOwor ICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTsKKyAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNC b29sZWFuOworICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7CisgICAgbG9kYXNoLmlzRWxlbWVu dCA9IGlzRWxlbWVudDsKKyAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7CisgICAgbG9kYXNo LmlzRXF1YWwgPSBpc0VxdWFsOworICAgIGxvZGFzaC5pc0Zpbml0ZSA9IGlzRmluaXRlOworICAg IGxvZGFzaC5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKKyAgICBsb2Rhc2guaXNOYU4gPSBpc05h TjsKKyAgICBsb2Rhc2guaXNOdWxsID0gaXNOdWxsOworICAgIGxvZGFzaC5pc051bWJlciA9IGlz TnVtYmVyOworICAgIGxvZGFzaC5pc09iamVjdCA9IGlzT2JqZWN0OworICAgIGxvZGFzaC5pc1Bs YWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDsKKyAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4 cDsKKyAgICBsb2Rhc2guaXNTdHJpbmcgPSBpc1N0cmluZzsKKyAgICBsb2Rhc2guaXNVbmRlZmlu ZWQgPSBpc1VuZGVmaW5lZDsKKyAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjsK KyAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjsKKyAgICBsb2Rhc2gubm9Db25mbGljdCA9IG5vQ29u ZmxpY3Q7CisgICAgbG9kYXNoLm5vb3AgPSBub29wOworICAgIGxvZGFzaC5ub3cgPSBub3c7Cisg ICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7CisgICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRv bTsKKyAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlOworICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9 IHJlZHVjZVJpZ2h0OworICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7CisgICAgbG9kYXNoLnJ1 bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDsKKyAgICBsb2Rhc2guc2l6ZSA9IHNpemU7CisgICAg bG9kYXNoLnNvbWUgPSBzb21lOworICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4 OworICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgIGxvZGFzaC51bmVzY2FwZSA9 IHVuZXNjYXBlOworICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkOworCisgICAgLy8gYWRk IGFsaWFzZXMKKyAgICBsb2Rhc2guYWxsID0gZXZlcnk7CisgICAgbG9kYXNoLmFueSA9IHNvbWU7 CisgICAgbG9kYXNoLmRldGVjdCA9IGZpbmQ7CisgICAgbG9kYXNoLmZpbmRXaGVyZSA9IGZpbmQ7 CisgICAgbG9kYXNoLmZvbGRsID0gcmVkdWNlOworICAgIGxvZGFzaC5mb2xkciA9IHJlZHVjZVJp Z2h0OworICAgIGxvZGFzaC5pbmNsdWRlID0gY29udGFpbnM7CisgICAgbG9kYXNoLmluamVjdCA9 IHJlZHVjZTsKKworICAgIG1peGluKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHNvdXJjZSA9IHt9 CisgICAgICBmb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7CisgICAg ICAgIGlmICghbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSkgeworICAgICAgICAgIHNvdXJj ZVttZXRob2ROYW1lXSA9IGZ1bmM7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJu IHNvdXJjZTsKKyAgICB9KCksIGZhbHNlKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor CisgICAgLy8gYWRkIGZ1bmN0aW9ucyBjYXBhYmxlIG9mIHJldHVybmluZyB3cmFwcGVkIGFuZCB1 bndyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmcKKyAgICBsb2Rhc2guZmlyc3QgPSBmaXJzdDsK KyAgICBsb2Rhc2gubGFzdCA9IGxhc3Q7CisgICAgbG9kYXNoLnNhbXBsZSA9IHNhbXBsZTsKKwor ICAgIC8vIGFkZCBhbGlhc2VzCisgICAgbG9kYXNoLnRha2UgPSBmaXJzdDsKKyAgICBsb2Rhc2gu aGVhZCA9IGZpcnN0OworCisgICAgZm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9k TmFtZSkgeworICAgICAgdmFyIGNhbGxiYWNrYWJsZSA9IG1ldGhvZE5hbWUgIT09ICdzYW1wbGUn OworICAgICAgaWYgKCFsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7CisgICAgICAgIGxv ZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09IGZ1bmN0aW9uKG4sIGd1YXJkKSB7CisgICAgICAg ICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sCisgICAgICAgICAgICAgIHJlc3VsdCA9 IGZ1bmModGhpcy5fX3dyYXBwZWRfXywgbiwgZ3VhcmQpOworCisgICAgICAgICAgcmV0dXJuICFj aGFpbkFsbCAmJiAobiA9PSBudWxsIHx8IChndWFyZCAmJiAhKGNhbGxiYWNrYWJsZSAmJiB0eXBl b2YgbiA9PSAnZnVuY3Rpb24nKSkpCisgICAgICAgICAgICA/IHJlc3VsdAorICAgICAgICAgICAg OiBuZXcgbG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTsKKyAgICAgICAgfTsKKyAgICAg IH0KKyAgICB9KTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAg ICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLgorICAgICAqCisgICAgICogQHN0YXRpYwor ICAgICAqIEBtZW1iZXJPZiBfCisgICAgICogQHR5cGUgc3RyaW5nCisgICAgICovCisgICAgbG9k YXNoLlZFUlNJT04gPSAnMi40LjEnOworCisgICAgLy8gYWRkICJDaGFpbmluZyIgZnVuY3Rpb25z IHRvIHRoZSB3cmFwcGVyCisgICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFp bjsKKyAgICBsb2Rhc2gucHJvdG90eXBlLnRvU3RyaW5nID0gd3JhcHBlclRvU3RyaW5nOworICAg IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWVPZjsKKyAgICBsb2Rhc2gucHJv dG90eXBlLnZhbHVlT2YgPSB3cmFwcGVyVmFsdWVPZjsKKworICAgIC8vIGFkZCBgQXJyYXlgIGZ1 bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzCisgICAgZm9yRWFjaChbJ2pvaW4n LCAncG9wJywgJ3NoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICAgIHZhciBmdW5j ID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07CisgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5h bWVdID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9f LAorICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1 bWVudHMpOworCisgICAgICAgIHJldHVybiBjaGFpbkFsbAorICAgICAgICAgID8gbmV3IGxvZGFz aFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCkKKyAgICAgICAgICA6IHJlc3VsdDsKKyAgICAgIH07 CisgICAgfSk7CisKKyAgICAvLyBhZGQgYEFycmF5YCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdGhl IGV4aXN0aW5nIHdyYXBwZWQgdmFsdWUKKyAgICBmb3JFYWNoKFsncHVzaCcsICdyZXZlcnNlJywg J3NvcnQnLCAndW5zaGlmdCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7CisgICAgICB2YXIgZnVu YyA9IGFycmF5UmVmW21ldGhvZE5hbWVdOworICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2RO YW1lXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICBmdW5jLmFwcGx5KHRoaXMuX193cmFwcGVkX18s IGFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfTsKKyAgICB9KTsKKwor ICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgd3JhcHBlZCB2YWx1 ZXMKKyAgICBmb3JFYWNoKFsnY29uY2F0JywgJ3NsaWNlJywgJ3NwbGljZSddLCBmdW5jdGlvbiht ZXRob2ROYW1lKSB7CisgICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdOworICAg ICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICBy ZXR1cm4gbmV3IGxvZGFzaFdyYXBwZXIoZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1 bWVudHMpLCB0aGlzLl9fY2hhaW5fXyk7CisgICAgICB9OworICAgIH0pOworCisgICAgcmV0dXJu IGxvZGFzaDsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8vIGV4cG9zZSBM by1EYXNoCisgIHZhciBfID0gcnVuSW5Db250ZXh0KCk7CisKKyAgLy8gc29tZSBBTUQgYnVpbGQg b3B0aW1pemVycyBsaWtlIHIuanMgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlIHRo ZSBmb2xsb3dpbmc6CisgIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9m IGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkgeworICAgIC8vIEV4cG9zZSBM by1EYXNoIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGV2ZW4gd2hlbiBhbiBBTUQgbG9hZGVyIGlzIHBy ZXNlbnQgaW4KKyAgICAvLyBjYXNlIExvLURhc2ggaXMgbG9hZGVkIHdpdGggYSBSZXF1aXJlSlMg c2hpbSBjb25maWcuCisgICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvYXBpLmh0 bWwjY29uZmlnLXNoaW0KKyAgICByb290Ll8gPSBfOworCisgICAgLy8gZGVmaW5lIGFzIGFuIGFu b255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmUKKyAgICAv LyByZWZlcmVuY2VkIGFzIHRoZSAidW5kZXJzY29yZSIgbW9kdWxlCisgICAgZGVmaW5lKGZ1bmN0 aW9uKCkgeworICAgICAgcmV0dXJuIF87CisgICAgfSk7CisgIH0KKyAgLy8gY2hlY2sgZm9yIGBl eHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgYW4g YGV4cG9ydHNgIG9iamVjdAorICBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7 CisgICAgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTCisgICAgaWYgKG1vZHVsZUV4cG9ydHMpIHsK KyAgICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXzsKKyAgICB9CisgICAgLy8gaW4g TmFyd2hhbCBvciBSaGlubyAtcmVxdWlyZQorICAgIGVsc2UgeworICAgICAgZnJlZUV4cG9ydHMu XyA9IF87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIGluIGEgYnJvd3NlciBvciBSaGlu bworICAgIHJvb3QuXyA9IF87CisgIH0KK30uY2FsbCh0aGlzKSk7CmRpZmYgLS1naXQgYS9wYWNr YWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9ta2RpcnAtMC41LjAuanMg Yi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL2JlbmNobWFyay9maXh0dXJlcy9ta2RpcnAtMC41 LjAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3NDJiMgotLS0gL2Rl di9udWxsCisrKyBiL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvYmVuY2htYXJrL2ZpeHR1cmVz L21rZGlycC0wLjUuMC5qcwpAQCAtMCwwICsxLDk3IEBACit2YXIgcGF0aCA9IHJlcXVpcmUoJ3Bh dGgnKTsKK3ZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisKK21vZHVsZS5leHBvcnRzID0gbWtkaXJQ Lm1rZGlycCA9IG1rZGlyUC5ta2RpclAgPSBta2RpclA7CisKK2Z1bmN0aW9uIG1rZGlyUCAocCwg b3B0cywgZiwgbWFkZSkgeworICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgewor ICAgICAgICBmID0gb3B0czsKKyAgICAgICAgb3B0cyA9IHt9OworICAgIH0KKyAgICBlbHNlIGlm ICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgb3B0cyA9IHsg bW9kZTogb3B0cyB9OworICAgIH0KKyAgICAKKyAgICB2YXIgbW9kZSA9IG9wdHMubW9kZTsKKyAg ICB2YXIgeGZzID0gb3B0cy5mcyB8fCBmczsKKyAgICAKKyAgICBpZiAobW9kZSA9PT0gdW5kZWZp bmVkKSB7CisgICAgICAgIG1vZGUgPSAwNzc3ICYgKH5wcm9jZXNzLnVtYXNrKCkpOworICAgIH0K KyAgICBpZiAoIW1hZGUpIG1hZGUgPSBudWxsOworICAgIAorICAgIHZhciBjYiA9IGYgfHwgZnVu Y3Rpb24gKCkge307CisgICAgcCA9IHBhdGgucmVzb2x2ZShwKTsKKyAgICAKKyAgICB4ZnMubWtk aXIocCwgbW9kZSwgZnVuY3Rpb24gKGVyKSB7CisgICAgICAgIGlmICghZXIpIHsKKyAgICAgICAg ICAgIG1hZGUgPSBtYWRlIHx8IHA7CisgICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbWFkZSk7 CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChlci5jb2RlKSB7CisgICAgICAgICAgICBjYXNl ICdFTk9FTlQnOgorICAgICAgICAgICAgICAgIG1rZGlyUChwYXRoLmRpcm5hbWUocCksIG9wdHMs IGZ1bmN0aW9uIChlciwgbWFkZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXIpIGNiKGVy LCBtYWRlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBta2RpclAocCwgb3B0cywgY2IsIG1h ZGUpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAg ICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhbnkgb3RoZXIgZXJyb3IsIGp1c3Qgc2VlIGlmIHRo ZXJlJ3MgYSBkaXIKKyAgICAgICAgICAgIC8vIHRoZXJlIGFscmVhZHkuICBJZiBzbywgdGhlbiBo b29yYXkhICBJZiBub3QsIHRoZW4gc29tZXRoaW5nCisgICAgICAgICAgICAvLyBpcyBib3JrZWQu CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHhmcy5zdGF0KHAsIGZ1bmN0 aW9uIChlcjIsIHN0YXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0YXQgZmFp bHMsIHRoZW4gdGhhdCdzIHN1cGVyIHdlaXJkLgorICAgICAgICAgICAgICAgICAgICAvLyBsZXQg dGhlIG9yaWdpbmFsIGVycm9yIGJlIHRoZSBmYWlsdXJlIHJlYXNvbi4KKyAgICAgICAgICAgICAg ICAgICAgaWYgKGVyMiB8fCAhc3RhdC5pc0RpcmVjdG9yeSgpKSBjYihlciwgbWFkZSkKKyAgICAg ICAgICAgICAgICAgICAgZWxzZSBjYihudWxsLCBtYWRlKTsKKyAgICAgICAgICAgICAgICB9KTsK KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0pOworfQorCitta2RpclAu c3luYyA9IGZ1bmN0aW9uIHN5bmMgKHAsIG9wdHMsIG1hZGUpIHsKKyAgICBpZiAoIW9wdHMgfHwg dHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7CisgICAgICAgIG9wdHMgPSB7IG1vZGU6IG9wdHMg fTsKKyAgICB9CisgICAgCisgICAgdmFyIG1vZGUgPSBvcHRzLm1vZGU7CisgICAgdmFyIHhmcyA9 IG9wdHMuZnMgfHwgZnM7CisgICAgCisgICAgaWYgKG1vZGUgPT09IHVuZGVmaW5lZCkgeworICAg ICAgICBtb2RlID0gMDc3NyAmICh+cHJvY2Vzcy51bWFzaygpKTsKKyAgICB9CisgICAgaWYgKCFt YWRlKSBtYWRlID0gbnVsbDsKKworICAgIHAgPSBwYXRoLnJlc29sdmUocCk7CisKKyAgICB0cnkg eworICAgICAgICB4ZnMubWtkaXJTeW5jKHAsIG1vZGUpOworICAgICAgICBtYWRlID0gbWFkZSB8 fCBwOworICAgIH0KKyAgICBjYXRjaCAoZXJyMCkgeworICAgICAgICBzd2l0Y2ggKGVycjAuY29k ZSkgeworICAgICAgICAgICAgY2FzZSAnRU5PRU5UJyA6CisgICAgICAgICAgICAgICAgbWFkZSA9 IHN5bmMocGF0aC5kaXJuYW1lKHApLCBvcHRzLCBtYWRlKTsKKyAgICAgICAgICAgICAgICBzeW5j KHAsIG9wdHMsIG1hZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAv LyBJbiB0aGUgY2FzZSBvZiBhbnkgb3RoZXIgZXJyb3IsIGp1c3Qgc2VlIGlmIHRoZXJlJ3MgYSBk aXIKKyAgICAgICAgICAgIC8vIHRoZXJlIGFscmVhZHkuICBJZiBzbywgdGhlbiBob29yYXkhICBJ ZiBub3QsIHRoZW4gc29tZXRoaW5nCisgICAgICAgICAgICAvLyBpcyBib3JrZWQuCisgICAgICAg ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhciBzdGF0OworICAgICAgICAgICAgICAg IHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSB4ZnMuc3RhdFN5bmMocCk7CisgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChlcnIxKSB7CisgICAgICAgICAg ICAgICAgICAgIHRocm93IGVycjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB0aHJvdyBlcnIwOworICAgICAgICAgICAgICAgIGJy ZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hZGU7Cit9OwpkaWZmIC0tZ2l0 IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9jb250ZXh0LWNvbG9yaW5nLmVsIGIvcGFja2Fn ZXMvY29udGV4dC1jb2xvcmluZy9jb250ZXh0LWNvbG9yaW5nLmVsCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjVhMzNlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9j b250ZXh0LWNvbG9yaW5nL2NvbnRleHQtY29sb3JpbmcuZWwKQEAgLTAsMCArMSw2MDcgQEAKKzs7 OyBjb250ZXh0LWNvbG9yaW5nLmVsIC0tLSBTeW50YXggaGlnaGxpZ2h0aW5nLCBleGNlcHQgbm90 IGZvciBzeW50YXguIC0qLSBsZXhpY2FsLWJpbmRpbmc6IHQ7IC0qLQorCis7OyBDb3B5cmlnaHQg KEMpIDIwMTQtMjAxNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKzs7IEF1dGhv cjogSmFja3NvbiBSYXkgSGFtaWx0b24gPGphY2tzb25AamFja3NvbnJheWhhbWlsdG9uLmNvbT4K Kzs7IFVSTDogaHR0cHM6Ly9naXRodWIuY29tL2phY2tzb25yYXloYW1pbHRvbi9jb250ZXh0LWNv bG9yaW5nCis7OyBLZXl3b3JkczogY29udGV4dCBjb2xvcmluZyBzeW50YXggaGlnaGxpZ2h0aW5n Cis7OyBWZXJzaW9uOiA0LjAuMAorOzsgUGFja2FnZS1SZXF1aXJlczogKChlbWFjcyAiMjQiKSAo anMyLW1vZGUgIjIwMTUwMTI2IikpCisKKzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFj cy4KKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OyB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworOzsgVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor OzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQorOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKKzs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCis7OzsgQ29tbWVudGFyeToKKworOzsg SGlnaGxpZ2h0cyBjb2RlIGFjY29yZGluZyB0byBmdW5jdGlvbiBjb250ZXh0LgorCis7OyAtIENv ZGUgaW4gdGhlIGdsb2JhbCBzY29wZSBpcyBvbmUgY29sb3IuICBDb2RlIGluIGZ1bmN0aW9ucyB3 aXRoaW4gdGhlIGdsb2JhbAorOzsgICBzY29wZSBpcyBhIGRpZmZlcmVudCBjb2xvciwgYW5kIGNv ZGUgd2l0aGluIHN1Y2ggZnVuY3Rpb25zIGlzIGFub3RoZXIKKzs7ICAgY29sb3IsIGFuZCBzbyBv bi4KKzs7IC0gSWRlbnRpZmllcnMgcmV0YWluIHRoZSBjb2xvciBvZiB0aGUgc2NvcGUgaW4gd2hp Y2ggdGhleSBhcmUgZGVjbGFyZWQuCisKKzs7IExleGljYWwgc2NvcGUgaW5mb3JtYXRpb24gYXQt YS1nbGFuY2UgY2FuIGFzc2lzdCBhIHByb2dyYW1tZXIgaW4KKzs7IHVuZGVyc3RhbmRpbmcgdGhl IG92ZXJhbGwgc3RydWN0dXJlIG9mIGEgcHJvZ3JhbS4gIEl0IGNhbiBoZWxwIHRvIGN1cmIgbmFz dHkKKzs7IGJ1Z3MgbGlrZSBuYW1lIHNoYWRvd2luZy4gIEEgcmFpbmJvdyBjYW4gaW5kaWNhdGUg ZXhjZXNzaXZlIGNvbXBsZXhpdHkuIFN0YXRlCis7OyBjaGFuZ2Ugd2l0aGluIGEgY2xvc3VyZSBp cyBlYXNpbHkgbW9uaXRvcmVkLgorCis7OyBCeSBkZWZhdWx0LCBDb250ZXh0IENvbG9yaW5nIHN0 aWxsIGhpZ2hsaWdodHMgY29tbWVudHMgYW5kIHN0cmluZ3MKKzs7IHN5bnRhY3RpY2FsbHkuICBJ dCBpcyBzdGlsbCBlYXN5IHRvIGRpZmZlcmVudGlhdGUgY29kZSBmcm9tIG5vbi1jb2RlLCBhbmQK Kzs7IHN0cmluZ3MgY2Fubm90IGJlIGNvbmZ1c2VkIGZvciB2YXJpYWJsZXMuCisKKzs7IFRvIHVz ZSwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciB+Ly5lbWFjczoKKworOzsgKHJlcXVpcmUgJ2Nv bnRleHQtY29sb3JpbmcpCis7OyAoYWRkLWhvb2sgJ2pzMi1tb2RlLWhvb2sgJ2NvbnRleHQtY29s b3JpbmctbW9kZSkKKworOzsganMtbW9kZSBvciBqczMtbW9kZSBzdXBwb3J0IHJlcXVpcmVzIE5v ZGUuanMgMC4xMCsgYW5kIHRoZSBzY29waWZpZXIKKzs7IGV4ZWN1dGFibGUuCisKKzs7ICQgbnBt IGluc3RhbGwgLWcgc2NvcGlmaWVyCisKKzs7OyBDb2RlOgorCisocmVxdWlyZSAnanMyLW1vZGUp CisKKworOzs7IENvbnN0YW50cworCisoZGVmY29uc3QgY29udGV4dC1jb2xvcmluZy1wYXRoCisg IChmaWxlLW5hbWUtZGlyZWN0b3J5IChvciBsb2FkLWZpbGUtbmFtZSBidWZmZXItZmlsZS1uYW1l KSkKKyAgIlRoaXMgZmlsZSdzIGRpcmVjdG9yeS4iKQorCisKKzs7OyBDdXN0b21pemFibGUgb3B0 aW9ucworCisoZGVmY3VzdG9tIGNvbnRleHQtY29sb3JpbmctZGVsYXkgMC4yNQorICAiRGVsYXkg YmV0d2VlbiBhIGJ1ZmZlciB1cGRhdGUgYW5kIGNvbG9yaXphdGlvbi4KKworSW5jcmVhc2UgdGhp cyBpZiB5b3VyIG1hY2hpbmUgaXMgaGlnaC1wZXJmb3JtaW5nLiAgRGVjcmVhc2UgaXQgaWYKK2l0 IGFpbid0LgorCitTdXBwb3J0ZWQgbW9kZXM6IGBqcy1tb2RlJywgYGpzMy1tb2RlJyIKKyAgOmdy b3VwICdjb250ZXh0LWNvbG9yaW5nKQorCisoZGVmY3VzdG9tIGNvbnRleHQtY29sb3JpbmctY29t bWVudHMtYW5kLXN0cmluZ3MgdAorICAiSWYgbm9uLW5pbCwgYWxzbyBjb2xvciBjb21tZW50cyBh bmQgc3RyaW5ncyB1c2luZyBgZm9udC1sb2NrJy4iCisgIDpncm91cCAnY29udGV4dC1jb2xvcmlu ZykKKworKGRlZmN1c3RvbSBjb250ZXh0LWNvbG9yaW5nLWpzLWJsb2NrLXNjb3BlcyBuaWwKKyAg IklmIG5vbi1uaWwsIGFsc28gY29sb3IgYmxvY2sgc2NvcGVzIGluIHRoZSBzY29wZSBoaWVyYXJj aHkgaW4gSmF2YVNjcmlwdC4KKworVGhlIGJsb2NrLXNjb3BlLWluZHVjaW5nIGBsZXQnIGFuZCBg Y29uc3QnIGFyZSBpbnRyb2R1Y2VkIGluIEVTNi4KK0lmIHlvdSBhcmUgd3JpdGluZyBFUzYgY29k ZSwgZW5hYmxlIHRoaXM7IG90aGVyd2lzZSwgZG9uJ3QuCisKK1N1cHBvcnRlZCBtb2RlczogYGpz Mi1tb2RlJyIKKyAgOmdyb3VwICdjb250ZXh0LWNvbG9yaW5nKQorCisoZGVmY3VzdG9tIGNvbnRl eHQtY29sb3JpbmctYmVuY2htYXJrLWNvbG9yaXphdGlvbiBuaWwKKyAgIklmIG5vbi1uaWwsIHRy YWNrIGhvdyBsb25nIGNvbG9yaXphdGlvbiB0YWtlcyBhbmQgcHJpbnQKK21lc3NhZ2VzIHdpdGgg dGhlIGNvbG9yaXphdGlvbiBkdXJhdGlvbi4iCisgIDpncm91cCAnY29udGV4dC1jb2xvcmluZykK KworCis7OzsgTG9jYWwgdmFyaWFibGVzCisKKyhkZWZ2YXItbG9jYWwgY29udGV4dC1jb2xvcmlu Zy1idWZmZXIgbmlsCisgICJSZWZlcmVuY2UgdG8gdGhpcyBidWZmZXIgKGZvciB0aW1lcnMpLiIp CisKKyhkZWZ2YXItbG9jYWwgY29udGV4dC1jb2xvcmluZy1zY29waWZpZXItcHJvY2VzcyBuaWwK KyAgIlJlZmVyZW5jZSB0byB0aGUgc2luZ2xlIHNjb3BpZmllciBwcm9jZXNzIHRoYXQgY2FuIGJl CisgIHJ1bm5pbmcuIikKKworKGRlZnZhci1sb2NhbCBjb250ZXh0LWNvbG9yaW5nLWNvbG9yaXpl LWlkbGUtdGltZXIgbmlsCisgICJSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseS1ydW5uaW5nIGlk bGUgdGltZXIuIikKKworKGRlZnZhci1sb2NhbCBjb250ZXh0LWNvbG9yaW5nLWNoYW5nZWQgbmls CisgICJJbmRpY2F0aW9uIHRoYXQgdGhlIGJ1ZmZlciBoYXMgY2hhbmdlZCByZWNlbnRseSwgd2hp Y2ggd291bGQKK2ltcGx5IHRoYXQgaXQgc2hvdWxkIGJlIGNvbG9yaXplZCBhZ2FpbiBieQorYGNv bnRleHQtY29sb3JpbmctY29sb3JpemUtaWRsZS10aW1lcicgaWYgdGhhdCB0aW1lciBpcyBiZWlu ZwordXNlZC4iKQorCisKKzs7OyBGYWNlcworCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1kZWZm YWNlIChsZXZlbCB0dHkgbGlnaHQgZGFyaykKKyAgKGxldCAoKGZhY2UgKGludGVybiAoZm9ybWF0 ICJjb250ZXh0LWNvbG9yaW5nLWxldmVsLSVzLWZhY2UiIGxldmVsKSkpCisgICAgICAgIChkb2Mg KGZvcm1hdCAiQ29udGV4dCBjb2xvcmluZyBmYWNlLCBsZXZlbCAlcy4iIGxldmVsKSkpCisgICAg KGV2YWwgKG1hY3JvZXhwYW5kIGAoZGVmZmFjZSAsZmFjZQorICAgICAgICAgICAgICAgICAgICAg ICAgICAnKCgoKHR5cGUgdHR5KSkgKDpmb3JlZ3JvdW5kICx0dHkpKQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICgoKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgLGxpZ2h0KSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChiYWNrZ3JvdW5kIGRhcmspKSAoOmZvcmVn cm91bmQgLGRhcmspKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLGRvYworICAgICAgICAg ICAgICAgICAgICAgICAgICA6Z3JvdXAgJ2NvbnRleHQtY29sb3JpbmcpKSkpKQorCisoZGVmdmFy IGNvbnRleHQtY29sb3JpbmctZmFjZS1jb3VudCBuaWwKKyAgIk51bWJlciBvZiBmYWNlcyBhdmFp bGFibGUgZm9yIGNvbnRleHQgY29sb3JpbmcuIikKKworKGRlZnVuIGNvbnRleHQtY29sb3Jpbmct ZGVmZmFjZS1kZWZhdWx0IChsZXZlbCkKKyAgKGNvbnRleHQtY29sb3JpbmctZGVmZmFjZSBsZXZl bCAid2hpdGUiICIjM2YzZjNmIiAiI2NkY2RjZCIpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmlu Zy1zZXQtY29sb3JzLWRlZmF1bHQgKCkKKyAgKGNvbnRleHQtY29sb3JpbmctZGVmZmFjZSAwICJ3 aGl0ZSIgICAiIzAwMDAwMCIgIiNmZmZmZmYiKQorICAoY29udGV4dC1jb2xvcmluZy1kZWZmYWNl IDEgInllbGxvdyIgICIjMDA3ZjgwIiAiI2ZmZmY4MCIpCisgIChjb250ZXh0LWNvbG9yaW5nLWRl ZmZhY2UgMiAiZ3JlZW4iICAgIiMwMDE1ODAiICIjY2RmYWNkIikKKyAgKGNvbnRleHQtY29sb3Jp bmctZGVmZmFjZSAzICJjeWFuIiAgICAiIzU1MDA4MCIgIiNkOGQ4ZmYiKQorICAoY29udGV4dC1j b2xvcmluZy1kZWZmYWNlIDQgImJsdWUiICAgICIjODAyYjAwIiAiI2U3YzdmZiIpCisgIChjb250 ZXh0LWNvbG9yaW5nLWRlZmZhY2UgNSAibWFnZW50YSIgIiM2YTgwMDAiICIjZmZjZGNkIikKKyAg KGNvbnRleHQtY29sb3JpbmctZGVmZmFjZSA2ICJyZWQiICAgICAiIzAwODAwMCIgIiNmZmUzOTAi KQorICAoY29udGV4dC1jb2xvcmluZy1kZWZmYWNlLWRlZmF1bHQgNykKKyAgKHNldHEgY29udGV4 dC1jb2xvcmluZy1mYWNlLWNvdW50IDgpKQorCisoY29udGV4dC1jb2xvcmluZy1zZXQtY29sb3Jz LWRlZmF1bHQpCisKKworOzs7IEZhY2UgZnVuY3Rpb25zCisKKyhkZWZzdWJzdCBjb250ZXh0LWNv bG9yaW5nLWZhY2Utc3ltYm9sIChsZXZlbCkKKyAgIlJldHVybnMgYSBzeW1ib2wgZm9yIGEgZmFj ZSB3aXRoIExFVkVMLiIKKyAgOzsgYGNvbmNhdCcgaXMgZmFzdGVyIHRoYW4gYGZvcm1hdCcgaGVy ZS4KKyAgKGludGVybi1zb2Z0IChjb25jYXQgImNvbnRleHQtY29sb3JpbmctbGV2ZWwtIgorICAg ICAgICAgICAgICAgICAgICAgICAobnVtYmVyLXRvLXN0cmluZyBsZXZlbCkKKyAgICAgICAgICAg ICAgICAgICAgICAgIi1mYWNlIikpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1zZXQtY29s b3JzICgmcmVzdCBjb2xvcnMpCisgICJTZXQgY29udGV4dCBjb2xvcmluZydzIGxldmVscycgY29s b3JpbmcgdG8gQ09MT1JTLCB3aGVyZSB0aGUKK050aCBlbGVtZW50IG9mIENPTE9SUyBpcyBsZXZl bCBOJ3MgY29sb3IuIgorICAoc2V0cSBjb250ZXh0LWNvbG9yaW5nLWZhY2UtY291bnQgKGxlbmd0 aCBjb2xvcnMpKQorICAobGV0ICgobGV2ZWwgMCkpCisgICAgKGRvbGlzdCAoY29sb3IgY29sb3Jz KQorICAgICAgOzsgRW5zdXJlIHRoZXJlIGFyZSBhdmFpbGFibGUgZmFjZXMgdG8gY29udGFpbiBu ZXcgY29sb3JzLgorICAgICAgKHdoZW4gKG5vdCAoY29udGV4dC1jb2xvcmluZy1mYWNlLXN5bWJv bCBsZXZlbCkpCisgICAgICAgIChjb250ZXh0LWNvbG9yaW5nLWRlZmZhY2UtZGVmYXVsdCBsZXZl bCkpCisgICAgICAoc2V0LWZhY2UtZm9yZWdyb3VuZCAoY29udGV4dC1jb2xvcmluZy1mYWNlLXN5 bWJvbCBsZXZlbCkgY29sb3IpCisgICAgICAoc2V0cSBsZXZlbCAoKyBsZXZlbCAxKSkpKSkKKwor KGRlZnN1YnN0IGNvbnRleHQtY29sb3JpbmctbGV2ZWwtZmFjZSAobGV2ZWwpCisgICJSZXR1cm5z IHRoZSBmYWNlIG5hbWUgZm9yIExFVkVMLiIKKyAgKGNvbnRleHQtY29sb3JpbmctZmFjZS1zeW1i b2wgKG1pbiBsZXZlbCBjb250ZXh0LWNvbG9yaW5nLWZhY2UtY291bnQpKSkKKworCis7OzsgQ29s b3JpemF0aW9uIHV0aWxpdGllcworCisoZGVmc3Vic3QgY29udGV4dC1jb2xvcmluZy1jb2xvcml6 ZS1yZWdpb24gKHN0YXJ0IGVuZCBsZXZlbCkKKyAgIkNvbG9yaXplcyBjaGFyYWN0ZXJzIGZyb20g dGhlIDEtaW5kZXhlZCBTVEFSVCAoaW5jbHVzaXZlKSB0bworRU5EIChleGNsdXNpdmUpIHdpdGgg dGhlIGZhY2UgY29ycmVzcG9uZGluZyB0byBMRVZFTC4iCisgIChhZGQtdGV4dC1wcm9wZXJ0aWVz CisgICBzdGFydAorICAgZW5kCisgICBgKGZhY2UgLChjb250ZXh0LWNvbG9yaW5nLWxldmVsLWZh Y2UgbGV2ZWwpKSkpCisKKyhkZWZzdWJzdCBjb250ZXh0LWNvbG9yaW5nLW1heWJlLWNvbG9yaXpl LWNvbW1lbnRzLWFuZC1zdHJpbmdzICgpCisgICJDb2xvcml6ZXMgdGhlIGN1cnJlbnQgYnVmZmVy J3MgY29tbWVudHMgYW5kIHN0cmluZ3MgaWYKK2Bjb250ZXh0LWNvbG9yaW5nLWNvbW1lbnRzLWFu ZC1zdHJpbmdzJyBpcyBub24tbmlsLiIKKyAgKHdoZW4gY29udGV4dC1jb2xvcmluZy1jb21tZW50 cy1hbmQtc3RyaW5ncworICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKGZvbnQtbG9jay1mb250 aWZ5LXN5bnRhY3RpY2FsbHktcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkpKQorCisK Kzs7OyBqczItbW9kZSBjb2xvcml6YXRpb24KKworKGRlZnZhci1sb2NhbCBjb250ZXh0LWNvbG9y aW5nLWpzMi1zY29wZS1sZXZlbC1oYXNoLXRhYmxlIG5pbAorICAiQXNzb2NpYXRlcyBganMyLXNj b3BlJyBzdHJ1Y3R1cmVzIGFuZCB3aXRoIHRoZWlyIHNjb3BlCisgIGxldmVscy4iKQorCisoZGVm c3Vic3QgY29udGV4dC1jb2xvcmluZy1qczItc2NvcGUtbGV2ZWwgKHNjb3BlKQorICAiR2V0cyB0 aGUgbGV2ZWwgb2YgU0NPUEUuIgorICAoY29uZCAoKGdldGhhc2ggc2NvcGUgY29udGV4dC1jb2xv cmluZy1qczItc2NvcGUtbGV2ZWwtaGFzaC10YWJsZSkpCisgICAgICAgICh0CisgICAgICAgICAo bGV0ICgobGV2ZWwgMCkKKyAgICAgICAgICAgICAgIChjdXJyZW50LXNjb3BlIHNjb3BlKQorICAg ICAgICAgICAgICAgZW5jbG9zaW5nLXNjb3BlKQorICAgICAgICAgICAod2hpbGUgKGFuZCBjdXJy ZW50LXNjb3BlCisgICAgICAgICAgICAgICAgICAgICAgIChqczItbm9kZS1wYXJlbnQgY3VycmVu dC1zY29wZSkKKyAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgZW5jbG9zaW5nLXNjb3BlCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqczItbm9kZS1nZXQtZW5jbG9zaW5nLXNjb3Bl IGN1cnJlbnQtc2NvcGUpKSkKKyAgICAgICAgICAgICAod2hlbiAob3IgY29udGV4dC1jb2xvcmlu Zy1qcy1ibG9jay1zY29wZXMKKyAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHR5cGUgKGpz Mi1zY29wZS10eXBlIGN1cnJlbnQtc2NvcGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAo b3IgKD0gdHlwZSBqczItU0NSSVBUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPSB0 eXBlIGpzMi1GVU5DVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD0gdHlwZSBq czItQ0FUQ0gpKSkpCisgICAgICAgICAgICAgICAoc2V0cSBsZXZlbCAoKyBsZXZlbCAxKSkpCisg ICAgICAgICAgICAgKHNldHEgY3VycmVudC1zY29wZSBlbmNsb3Npbmctc2NvcGUpKQorICAgICAg ICAgICAocHV0aGFzaCBzY29wZSBsZXZlbCBjb250ZXh0LWNvbG9yaW5nLWpzMi1zY29wZS1sZXZl bC1oYXNoLXRhYmxlKSkpKSkKKworKGRlZnN1YnN0IGNvbnRleHQtY29sb3JpbmctanMyLWxvY2Fs LW5hbWUtbm9kZS1wIChub2RlKQorICAiRGV0ZXJtaW5lcyBpZiBOT0RFIGlzIGEganMyLW5hbWUt bm9kZSByZXByZXNlbnRpbmcgYSBsb2NhbAordmFyaWFibGUuIgorICAoYW5kIChqczItbmFtZS1u b2RlLXAgbm9kZSkKKyAgICAgICAobGV0ICgocGFyZW50IChqczItbm9kZS1wYXJlbnQgbm9kZSkp KQorICAgICAgICAgKG5vdCAob3IgKGFuZCAoanMyLW9iamVjdC1wcm9wLW5vZGUtcCBwYXJlbnQp CisgICAgICAgICAgICAgICAgICAgICAgIChlcSBub2RlIChqczItb2JqZWN0LXByb3Atbm9kZS1s ZWZ0IHBhcmVudCkpKQorICAgICAgICAgICAgICAgICAgKGFuZCAoanMyLXByb3AtZ2V0LW5vZGUt cCBwYXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAgIDs7IEZvciBuZXN0ZWQgcHJvcGVydHkg bG9va3VwLCB0aGUgbm9kZSBvbiB0aGUgbGVmdCBpcyBhCisgICAgICAgICAgICAgICAgICAgICAg IDs7IGBqczItcHJvcC1nZXQtbm9kZScsIHNvIHRoaXMgYWx3YXlzIHdvcmtzLgorICAgICAgICAg ICAgICAgICAgICAgICAoZXEgbm9kZSAoanMyLXByb3AtZ2V0LW5vZGUtcmlnaHQgcGFyZW50KSkp KSkpKSkKKworKGRlZnN1YnN0IGNvbnRleHQtY29sb3JpbmctanMyLWNvbG9yaXplLW5vZGUgKG5v ZGUgbGV2ZWwpCisgICJDb2xvcnMgTk9ERSB3aXRoIHRoZSBjb2xvciBmb3IgTEVWRUwuIgorICAo bGV0ICgoc3RhcnQgKGpzMi1ub2RlLWFicy1wb3Mgbm9kZSkpKQorICAgIChjb250ZXh0LWNvbG9y aW5nLWNvbG9yaXplLXJlZ2lvbgorICAgICBzdGFydAorICAgICAoKyBzdGFydCAoanMyLW5vZGUt bGVuIG5vZGUpKSA7IEVuZAorICAgICBsZXZlbCkpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmlu Zy1qczItY29sb3JpemUgKCkKKyAgIkNvbG9yaXplcyB0aGUgY3VycmVudCBidWZmZXIgdXNpbmcg dGhlIGFic3RyYWN0IHN5bnRheCB0cmVlCitnZW5lcmF0ZWQgYnkganMyLW1vZGUuIgorICA7OyBS ZXNldCB0aGUgaGFzaCB0YWJsZTsgdGhlIG9sZCBvbmUgY291bGQgYmUgb2Jzb2xldGUuCisgIChz ZXRxIGNvbnRleHQtY29sb3JpbmctanMyLXNjb3BlLWxldmVsLWhhc2gtdGFibGUgKG1ha2UtaGFz aC10YWJsZSA6dGVzdCAnZXEpKQorICAod2l0aC1zaWxlbnQtbW9kaWZpY2F0aW9ucworICAgIChq czItdmlzaXQtYXN0CisgICAgIGpzMi1tb2RlLWFzdAorICAgICAobGFtYmRhIChub2RlIGVuZC1w KQorICAgICAgICh3aGVuIChudWxsIGVuZC1wKQorICAgICAgICAgKGNvbmQKKyAgICAgICAgICAo KGpzMi1zY29wZS1wIG5vZGUpCisgICAgICAgICAgIChjb250ZXh0LWNvbG9yaW5nLWpzMi1jb2xv cml6ZS1ub2RlCisgICAgICAgICAgICBub2RlCisgICAgICAgICAgICAoY29udGV4dC1jb2xvcmlu Zy1qczItc2NvcGUtbGV2ZWwgbm9kZSkpKQorICAgICAgICAgICgoY29udGV4dC1jb2xvcmluZy1q czItbG9jYWwtbmFtZS1ub2RlLXAgbm9kZSkKKyAgICAgICAgICAgKGxldCogKChlbmNsb3Npbmct c2NvcGUgKGpzMi1ub2RlLWdldC1lbmNsb3Npbmctc2NvcGUgbm9kZSkpCisgICAgICAgICAgICAg ICAgICAoZGVmaW5pbmctc2NvcGUgKGpzMi1nZXQtZGVmaW5pbmctc2NvcGUKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nLXNjb3BlCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChqczItbmFtZS1ub2RlLW5hbWUgbm9kZSkpKSkKKyAgICAgICAg ICAgICA7OyBUaGUgdHJlZSBzZWVtcyB0byBiZSB3YWxrZWQgbGV4aWNhbGx5LCBzbyBhbiBlbnRp cmUgc2NvcGUgd2lsbAorICAgICAgICAgICAgIDs7IGJlIGNvbG9yZWQsIGluY2x1ZGluZyBpdHMg bmFtZSBub2RlcywgYmVmb3JlIHRoZXkgYXJlIHJlYWNoZWQuCisgICAgICAgICAgICAgOzsgQ29s b3JpbmcgdGhlIG5vZGVzIGRlZmluZWQgaW4gdGhhdCBzY29wZSB3b3VsZCBiZSByZWR1bmRhbnQs IHNvCisgICAgICAgICAgICAgOzsgZG9uJ3QgZG8gaXQuCisgICAgICAgICAgICAgKHdoZW4gKG5v dCAoZXEgZGVmaW5pbmctc2NvcGUgZW5jbG9zaW5nLXNjb3BlKSkKKyAgICAgICAgICAgICAgIChj b250ZXh0LWNvbG9yaW5nLWpzMi1jb2xvcml6ZS1ub2RlCisgICAgICAgICAgICAgICAgbm9kZQor ICAgICAgICAgICAgICAgIChjb250ZXh0LWNvbG9yaW5nLWpzMi1zY29wZS1sZXZlbCBkZWZpbmlu Zy1zY29wZSkpKSkpKQorICAgICAgICAgOzsgVGhlIGB0JyBpbmRpY2F0ZXMgdG8gc2VhcmNoIGNo aWxkcmVuLgorICAgICAgICAgdCkpKQorICAgIChjb250ZXh0LWNvbG9yaW5nLW1heWJlLWNvbG9y aXplLWNvbW1lbnRzLWFuZC1zdHJpbmdzKSkpCisKKworOzs7IFNoZWxsIGNvbW1hbmQgc2NvcGlm aWNhdGlvbiAvIGNvbG9yaXphdGlvbgorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy1hcHBseS10 b2tlbnMgKHRva2VucykKKyAgIlByb2Nlc3NlcyBhIHZlY3RvciBvZiBUT0tFTlMgdG8gYXBwbHkg Y29udGV4dC1iYXNlZCBjb2xvcmluZwordG8gdGhlIGN1cnJlbnQgYnVmZmVyLiAgVG9rZW5zIGFy ZSAzIGludGVnZXJzOiBzdGFydCwgZW5kLCBsZXZlbC4KK1RoZSB2ZWN0b3IgaXMgZmxhdCwgd2l0 aCBhIG5ldyB0b2tlbiBvY2N1cnJpbmcgYWZ0ZXIgZXZlcnkgM3JkCitlbGVtZW50LiIKKyAgKHdp dGgtc2lsZW50LW1vZGlmaWNhdGlvbnMKKyAgICAobGV0ICgoaSAwKQorICAgICAgICAgIChsZW4g KGxlbmd0aCB0b2tlbnMpKSkKKyAgICAgICh3aGlsZSAoPCBpIGxlbikKKyAgICAgICAgKGNvbnRl eHQtY29sb3JpbmctY29sb3JpemUtcmVnaW9uCisgICAgICAgICAoZWx0IHRva2VucyBpKQorICAg ICAgICAgKGVsdCB0b2tlbnMgKCsgaSAxKSkKKyAgICAgICAgIChlbHQgdG9rZW5zICgrIGkgMikp KQorICAgICAgICAoc2V0cSBpICgrIGkgMykpKSkKKyAgICAoY29udGV4dC1jb2xvcmluZy1tYXli ZS1jb2xvcml6ZS1jb21tZW50cy1hbmQtc3RyaW5ncykpKQorCisoZGVmdW4gY29udGV4dC1jb2xv cmluZy1wYXJzZS1hcnJheSAoaW5wdXQpCisgICJTcGVjaWFsaXplZCBKU09OIHBhcnNlciBmb3Ig YSBmbGF0IGFycmF5IG9mIG51bWJlcnMuIgorICAodmNvbmNhdCAobWFwY2FyICdzdHJpbmctdG8t bnVtYmVyIChzcGxpdC1zdHJpbmcgKHN1YnN0cmluZyBpbnB1dCAxIC0xKSAiLCIpKSkpCisKKyhk ZWZ1biBjb250ZXh0LWNvbG9yaW5nLWtpbGwtc2NvcGlmaWVyICgpCisgICJLaWxscyB0aGUgY3Vy cmVudGx5LXJ1bm5pbmcgc2NvcGlmaWVyIHByb2Nlc3MgZm9yIHRoaXMKK2J1ZmZlci4iCisgICh3 aGVuIChub3QgKG51bGwgY29udGV4dC1jb2xvcmluZy1zY29waWZpZXItcHJvY2VzcykpCisgICAg KGRlbGV0ZS1wcm9jZXNzIGNvbnRleHQtY29sb3Jpbmctc2NvcGlmaWVyLXByb2Nlc3MpCisgICAg KHNldHEgY29udGV4dC1jb2xvcmluZy1zY29waWZpZXItcHJvY2VzcyBuaWwpKSkKKworKGRlZnVu IGNvbnRleHQtY29sb3Jpbmctc2NvcGlmeS1zaGVsbC1jb21tYW5kIChjb21tYW5kICZvcHRpb25h bCBjYWxsYmFjaykKKyAgIkludm9rZXMgYSBzY29waWZpZXIgd2l0aCB0aGUgY3VycmVudCBidWZm ZXIncyBjb250ZW50cywKK3JlYWRpbmcgdGhlIHNjb3BpZmllcidzIHJlc3BvbnNlIGFzeW5jaHJv bm91c2x5IGFuZCBhcHBseWluZyBhCitwYXJzZWQgbGlzdCBvZiB0b2tlbnMgdG8gYGNvbnRleHQt Y29sb3JpbmctYXBwbHktdG9rZW5zJy4KKworSW52b2tlcyBDQUxMQkFDSyB3aGVuIGNvbXBsZXRl LiIKKworICA7OyBQcmlvciBydW5uaW5nIHRva2VuaXphdGlvbiBpcyBpbXBsaWNpdGx5IG9ic29s ZXRlIGlmIHRoaXMgZnVuY3Rpb24gaXMKKyAgOzsgY2FsbGVkLgorICAoY29udGV4dC1jb2xvcmlu Zy1raWxsLXNjb3BpZmllcikKKworICA7OyBTdGFydCB0aGUgcHJvY2Vzcy4KKyAgKHNldHEgY29u dGV4dC1jb2xvcmluZy1zY29waWZpZXItcHJvY2VzcworICAgICAgICAoc3RhcnQtcHJvY2Vzcy1z aGVsbC1jb21tYW5kICJzY29waWZpZXIiIG5pbCBjb21tYW5kKSkKKworICAobGV0ICgob3V0cHV0 ICIiKQorICAgICAgICAoYnVmZmVyIGNvbnRleHQtY29sb3JpbmctYnVmZmVyKSkKKworICAgIDs7 IFRoZSBwcm9jZXNzIG1heSBwcm9kdWNlIG91dHB1dCBpbiBtdWx0aXBsZSBjaHVua3MuICBUaGlz IGZpbHRlcgorICAgIDs7IGFjY3VtdWxhdGVzIHRoZSBjaHVua3MgaW50byBhIG1lc3NhZ2UuCisg ICAgKHNldC1wcm9jZXNzLWZpbHRlcgorICAgICBjb250ZXh0LWNvbG9yaW5nLXNjb3BpZmllci1w cm9jZXNzCisgICAgIChsYW1iZGEgKF9wcm9jZXNzIGNodW5rKQorICAgICAgIChzZXRxIG91dHB1 dCAoY29uY2F0IG91dHB1dCBjaHVuaykpKSkKKworICAgIDs7IFdoZW4gdGhlIHByb2Nlc3MncyBt ZXNzYWdlIGlzIGNvbXBsZXRlLCB0aGlzIHNlbnRpbmVsIHBhcnNlcyBpdCBhcyBKU09OCisgICAg OzsgYW5kIGFwcGxpZXMgdGhlIHRva2VucyB0byB0aGUgYnVmZmVyLgorICAgIChzZXQtcHJvY2Vz cy1zZW50aW5lbAorICAgICBjb250ZXh0LWNvbG9yaW5nLXNjb3BpZmllci1wcm9jZXNzCisgICAg IChsYW1iZGEgKF9wcm9jZXNzIGV2ZW50KQorICAgICAgICh3aGVuIChlcXVhbCAiZmluaXNoZWRc biIgZXZlbnQpCisgICAgICAgICAobGV0ICgodG9rZW5zIChjb250ZXh0LWNvbG9yaW5nLXBhcnNl LWFycmF5IG91dHB1dCkpKQorICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIK KyAgICAgICAgICAgICAoY29udGV4dC1jb2xvcmluZy1hcHBseS10b2tlbnMgdG9rZW5zKSkKKyAg ICAgICAgICAgKHNldHEgY29udGV4dC1jb2xvcmluZy1zY29waWZpZXItcHJvY2VzcyBuaWwpCisg ICAgICAgICAgIChpZiBjYWxsYmFjayAoZnVuY2FsbCBjYWxsYmFjaykpKSkpKSkKKworICA7OyBH aXZlIHRoZSBwcm9jZXNzIGl0cyBpbnB1dCBzbyBpdCBjYW4gYmVnaW4uCisgIChwcm9jZXNzLXNl bmQtcmVnaW9uIGNvbnRleHQtY29sb3Jpbmctc2NvcGlmaWVyLXByb2Nlc3MgKHBvaW50LW1pbikg KHBvaW50LW1heCkpCisgIChwcm9jZXNzLXNlbmQtZW9mIGNvbnRleHQtY29sb3Jpbmctc2NvcGlm aWVyLXByb2Nlc3MpKQorCisKKzs7OyBEaXNwYXRjaAorCisoZGVmdmFyIGNvbnRleHQtY29sb3Jp bmctZGlzcGF0Y2gtaGFzaC10YWJsZSAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICdlcSkKKyAgIk1h cHBpbmcgb2YgZGlzcGF0Y2ggc3RyYXRlZ3kgbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZwor ICBwcm9wZXJ0eSBsaXN0cywgd2hpY2ggY29udGFpbiBkZXRhaWxzIGFib3V0IHRoZSBzdHJhdGVn aWVzLiIpCisKKyhkZWZ2YXIgY29udGV4dC1jb2xvcmluZy1tb2RlLWhhc2gtdGFibGUgKG1ha2Ut aGFzaC10YWJsZSA6dGVzdCAnZXEpCisgICJNYXBwaW5nIG9mIG1ham9yIG1vZGUgbmFtZXMgdG8g ZGlzcGF0Y2ggcHJvcGVydHkgbGlzdHMuIikKKworKGRlZnVuIGNvbnRleHQtY29sb3Jpbmctc2Vs ZWN0LWRpc3BhdGNoIChtb2RlIGRpc3BhdGNoKQorICAiVXNlIERJU1BBVENIIGZvciBNT0RFLiIK KyAgKHB1dGhhc2gKKyAgIG1vZGUKKyAgIChnZXRoYXNoCisgICAgZGlzcGF0Y2gKKyAgICBjb250 ZXh0LWNvbG9yaW5nLWRpc3BhdGNoLWhhc2gtdGFibGUpCisgICBjb250ZXh0LWNvbG9yaW5nLW1v ZGUtaGFzaC10YWJsZSkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLWRlZmluZS1kaXNwYXRj aCAoc3ltYm9sICZyZXN0IHByb3BlcnRpZXMpCisgICJEZWZpbmUgYSBuZXcgZGlzcGF0Y2ggbmFt ZWQgU1lNQk9MIHdpdGggUFJPUEVSVElFUy4KKworQSBcImRpc3BhdGNoXCIgaXMgYSBwcm9wZXJ0 eSBsaXN0IGRlc2NyaWJpbmcgYSBzdHJhdGVneSBmb3IKK2NvbG9yaW5nIGEgYnVmZmVyLiAgVGhl cmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0cmF0ZWdpZXM6IFBhcnNlCithbmQgY29sb3IgaW4gYSBz aW5nbGUgZnVuY3Rpb24gKGA6Y29sb3JpemVyJyksIHBhcnNlIGluIGEKK2Z1bmN0aW9uIHRoYXQg cmV0dXJucyBzY29wZSBkYXRhIChgOnNjb3BpZmllcicpLCBvciBwYXJzZSB3aXRoIGEKK3NoZWxs IGNvbW1hbmQgdGhhdCByZXR1cm5zIHNjb3BlIGRhdGEgKGA6Y29tbWFuZCcpLiAgSW4gdGhlCits YXR0ZXIgdHdvIGNhc2VzLCB0aGUgc2NvcGUgZGF0YSB3aWxsIGJlIHVzZWQgdG8gYXV0b21hdGlj YWxseQorY29sb3IgdGhlIGJ1ZmZlci4KKworUFJPUEVSVElFUyBtdXN0IGluY2x1ZGUgYDptb2Rl cycgYW5kIG9uZSBvZiBgOmNvbG9yaXplcicsCitgOnNjb3BpZmllcicgb3IgYDpjb21tYW5kJy4K KworYDptb2RlcycgLSBMaXN0IG9mIG1ham9yIG1vZGVzIHRoaXMgZGlzcGF0Y2ggaXMgdmFsaWQg Zm9yLgorCitgOmNvbG9yaXplcicgLSBTeW1ib2wgcmVmZXJyaW5nIHRvIGEgZnVuY3Rpb24gdGhh dCBwYXJzZXMgYW5kCitjb2xvcnMgdGhlIGJ1ZmZlci4KKworYDpzY29waWZpZXInIC0gU3ltYm9s IHJlZmVycmluZyB0byBhIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIHRoZQorYnVmZmVyIGEgcmV0dXJu cyBhIGZsYXQgdmVjdG9yIG9mIHN0YXJ0LCBlbmQgYW5kIGxldmVsIGRhdGEuCisKK2A6ZXhlY3V0 YWJsZScgLSBPcHRpb25hbCBuYW1lIG9mIGFuIGV4ZWN1dGFibGUgcmVxdWlyZWQgYnkKK2A6Y29t bWFuZCcuCisKK2A6Y29tbWFuZCcgLSBTaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGUgd2l0aCB0aGUg Y3VycmVudCBidWZmZXIKK3NlbnQgdmlhIHN0ZGluLCBhbmQgd2l0aCBhIGZsYXQgSlNPTiBhcnJh eSBvZiBzdGFydCwgZW5kIGFuZAorbGV2ZWwgZGF0YSByZXR1cm5lZCB2aWEgc3Rkb3V0LiIKKyAg KGxldCAoKG1vZGVzIChwbGlzdC1nZXQgcHJvcGVydGllcyA6bW9kZXMpKQorICAgICAgICAoY29s b3JpemVyIChwbGlzdC1nZXQgcHJvcGVydGllcyA6Y29sb3JpemVyKSkKKyAgICAgICAgKHNjb3Bp ZmllciAocGxpc3QtZ2V0IHByb3BlcnRpZXMgOnNjb3BpZmllcikpCisgICAgICAgIChjb21tYW5k IChwbGlzdC1nZXQgcHJvcGVydGllcyA6Y29tbWFuZCkpKQorICAgICh3aGVuIChudWxsIG1vZGVz KQorICAgICAgKGVycm9yICJObyBtb2RlIGRlZmluZWQgZm9yIGRpc3BhdGNoIikpCisgICAgKHdo ZW4gKG5vdCAob3IgY29sb3JpemVyCisgICAgICAgICAgICAgICAgICAgc2NvcGlmaWVyCisgICAg ICAgICAgICAgICAgICAgY29tbWFuZCkpCisgICAgICAoZXJyb3IgIk5vIGNvbG9yaXplciwgc2Nv cGlmaWVyIG9yIGNvbW1hbmQgZGVmaW5lZCBmb3IgZGlzcGF0Y2giKSkKKyAgICAocHV0aGFzaCBz eW1ib2wgcHJvcGVydGllcyBjb250ZXh0LWNvbG9yaW5nLWRpc3BhdGNoLWhhc2gtdGFibGUpCisg ICAgKGRvbGlzdCAobW9kZSBtb2RlcykKKyAgICAgICh3aGVuIChudWxsIChnZXRoYXNoIG1vZGUg Y29udGV4dC1jb2xvcmluZy1tb2RlLWhhc2gtdGFibGUpKQorICAgICAgICAocHV0aGFzaCBtb2Rl IHByb3BlcnRpZXMgY29udGV4dC1jb2xvcmluZy1tb2RlLWhhc2gtdGFibGUpKSkpKQorCisoY29u dGV4dC1jb2xvcmluZy1kZWZpbmUtZGlzcGF0Y2gKKyAnamF2YXNjcmlwdC1ub2RlCisgOm1vZGVz ICcoanMtbW9kZSBqczMtbW9kZSkKKyA6ZXhlY3V0YWJsZSAic2NvcGlmaWVyIgorIDpjb21tYW5k ICJzY29waWZpZXIiKQorCisoY29udGV4dC1jb2xvcmluZy1kZWZpbmUtZGlzcGF0Y2gKKyAnamF2 YXNjcmlwdC1qczIKKyA6bW9kZXMgJyhqczItbW9kZSkKKyA6Y29sb3JpemVyICdjb250ZXh0LWNv bG9yaW5nLWpzMi1jb2xvcml6ZSkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctZGlzcGF0Y2gg KCZvcHRpb25hbCBjYWxsYmFjaykKKyAgIkRldGVybWluZXMgdGhlIG9wdGltYWwgdHJhY2sgZm9y IHNjb3BpZmljYXRpb24gLyBjb2xvcml6YXRpb24KK29mIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhl biBleGVjdXRlcyBpdC4KKworSW52b2tlcyBDQUxMQkFDSyB3aGVuIGNvbXBsZXRlLiAgSXQgaXMg aW52b2tlZCBzeW5jaHJvbm91c2x5IGZvcgorZWxpc3AgdHJhY2tzLCBhbmQgYXN5bmNocm9ub3Vz bHkgZm9yIHNoZWxsIGNvbW1hbmQgdHJhY2tzLiIKKyAgKGxldCAoKGRpc3BhdGNoIChnZXRoYXNo IG1ham9yLW1vZGUgY29udGV4dC1jb2xvcmluZy1tb2RlLWhhc2gtdGFibGUpKSkKKyAgICAoaWYg KG51bGwgZGlzcGF0Y2gpCisgICAgICAgIChtZXNzYWdlICIlcyIgIkNvbnRleHQgY29sb3Jpbmcg aXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBtYWpvciBtb2RlIikpCisgICAgKGxldCAoY29sb3Jp emVyCisgICAgICAgICAgc2NvcGlmaWVyCisgICAgICAgICAgY29tbWFuZAorICAgICAgICAgIGV4 ZWN1dGFibGUpCisgICAgICAoY29uZAorICAgICAgICgoc2V0cSBjb2xvcml6ZXIgKHBsaXN0LWdl dCBkaXNwYXRjaCA6Y29sb3JpemVyKSkKKyAgICAgICAgKGZ1bmNhbGwgY29sb3JpemVyKQorICAg ICAgICAoaWYgY2FsbGJhY2sgKGZ1bmNhbGwgY2FsbGJhY2spKSkKKyAgICAgICAoKHNldHEgc2Nv cGlmaWVyIChwbGlzdC1nZXQgZGlzcGF0Y2ggOnNjb3BpZmllcikpCisgICAgICAgIChjb250ZXh0 LWNvbG9yaW5nLWFwcGx5LXRva2VucyAoZnVuY2FsbCBzY29waWZpZXIpKQorICAgICAgICAoaWYg Y2FsbGJhY2sgKGZ1bmNhbGwgY2FsbGJhY2spKSkKKyAgICAgICAoKHNldHEgY29tbWFuZCAocGxp c3QtZ2V0IGRpc3BhdGNoIDpjb21tYW5kKSkKKyAgICAgICAgKHNldHEgZXhlY3V0YWJsZSAocGxp c3QtZ2V0IGRpc3BhdGNoIDpleGVjdXRhYmxlKSkKKyAgICAgICAgKGlmIChhbmQgZXhlY3V0YWJs ZQorICAgICAgICAgICAgICAgICAobnVsbCAoZXhlY3V0YWJsZS1maW5kIGV4ZWN1dGFibGUpKSkK KyAgICAgICAgICAgIChtZXNzYWdlICJFeGVjdXRhYmxlIFwiJXNcIiBub3QgZm91bmQiIGV4ZWN1 dGFibGUpCisgICAgICAgICAgKGNvbnRleHQtY29sb3Jpbmctc2NvcGlmeS1zaGVsbC1jb21tYW5k IGNvbW1hbmQgY2FsbGJhY2spKSkpKSkpCisKKworOzs7IENvbG9yaXphdGlvbgorCisoZGVmdW4g Y29udGV4dC1jb2xvcmluZy1jb2xvcml6ZSAoJm9wdGlvbmFsIGNhbGxiYWNrKQorICAiQ29sb3Jz IHRoZSBjdXJyZW50IGJ1ZmZlciBieSBmdW5jdGlvbiBjb250ZXh0LgorCitJbnZva2VzIENBTExC QUNLIHdoZW4gY29tcGxldGU7IHNlZSBgY29udGV4dC1jb2xvcmluZy1kaXNwYXRjaCcuIgorICAo aW50ZXJhY3RpdmUpCisgIChsZXQgKChzdGFydC10aW1lIChmbG9hdC10aW1lKSkpCisgICAgKGNv bnRleHQtY29sb3JpbmctZGlzcGF0Y2gKKyAgICAgKGxhbWJkYSAoKQorICAgICAgICh3aGVuIGNv bnRleHQtY29sb3JpbmctYmVuY2htYXJrLWNvbG9yaXphdGlvbgorICAgICAgICAgKG1lc3NhZ2Ug IkNvbG9yaXphdGlvbiB0b29rICUuM2Ygc2Vjb25kcyIgKC0gKGZsb2F0LXRpbWUpIHN0YXJ0LXRp bWUpKSkKKyAgICAgICAoaWYgY2FsbGJhY2sgKGZ1bmNhbGwgY2FsbGJhY2spKSkpKSkKKworKGRl ZnVuIGNvbnRleHQtY29sb3JpbmctY2hhbmdlLWZ1bmN0aW9uIChfc3RhcnQgX2VuZCBfbGVuZ3Ro KQorICAiUmVnaXN0ZXJzIGEgY2hhbmdlIHNvIHRoYXQgYSBidWZmZXIgY2FuIGJlIGNvbG9yaXpl ZCBzb29uLiIKKyAgOzsgVG9rZW5pemF0aW9uIGlzIG9ic29sZXRlIGlmIHRoZXJlIHdhcyBhIGNo YW5nZS4KKyAgKGNvbnRleHQtY29sb3Jpbmcta2lsbC1zY29waWZpZXIpCisgIChzZXRxIGNvbnRl eHQtY29sb3JpbmctY2hhbmdlZCB0KSkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctbWF5YmUt Y29sb3JpemUgKCkKKyAgIkNvbG9yaXplIHVuZGVycyBjZXJ0YWluIGNvbmRpdGlvbnMuICBUaGlz IHdpbGwgcnVuIGFzIGFuIGlkbGUKK3RpbWVyLCBzbyBmaXJzdGx5IHRoZSBidWZmZXIgbXVzdCBu b3QgYmUgc29tZSBvdGhlciBidWZmZXIuCitBZGRpdGlvbmFsbHksIHRoZSBidWZmZXIgbXVzdCBo YXZlIGNoYW5nZWQsIG90aGVyd2lzZSBjb2xvcml6aW5nCit3b3VsZCBiZSByZWR1bmRhbnQuIgor ICAod2hlbiAoYW5kIChlcSBjb250ZXh0LWNvbG9yaW5nLWJ1ZmZlciAod2luZG93LWJ1ZmZlciAo c2VsZWN0ZWQtd2luZG93KSkpCisgICAgICAgICAgICAgY29udGV4dC1jb2xvcmluZy1jaGFuZ2Vk KQorICAgIChzZXRxIGNvbnRleHQtY29sb3JpbmctY2hhbmdlZCBuaWwpCisgICAgKGNvbnRleHQt Y29sb3JpbmctY29sb3JpemUpKSkKKworCis7OzsgVGhlbWVzCisKKyhkZWZ2YXIgY29udGV4dC1j b2xvcmluZy10aGVtZS1oYXNoLXRhYmxlIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgJ2VxKQorICAi TWFwcGluZyBvZiB0aGVtZSBuYW1lcyB0byB0aGVtZSBwcm9wZXJ0aWVzLiIpCisKKyhkZWZ1biBj b250ZXh0LWNvbG9yaW5nLWRlZmluZS10aGVtZSAodGhlbWUgJnJlc3QgcHJvcGVydGllcykKKyAg IkRlZmluZSBhIHRoZW1lIG5hbWVkIFRIRU1FIGZvciBjb2xvcmluZyBzY29wZSBsZXZlbHMuCitQ Uk9QRVJUSUVTIGlzIGEgcHJvcGVydHkgbGlzdCBzcGVjaWZpeWluZyB0aGUgZm9sbG93aW5nIGRl dGFpbHM6CisKK2A6Y29sb3JzJzogTGlzdCBvZiBjb2xvcnMgdGhhdCB0aGlzIHRoZW1lIHVzZXMu IgorICAocHV0aGFzaAorICAgdGhlbWUKKyAgIChsYW1iZGEgKCkKKyAgICAgKGFwcGx5ICdjb250 ZXh0LWNvbG9yaW5nLXNldC1jb2xvcnMgKHBsaXN0LWdldCBwcm9wZXJ0aWVzIDpjb2xvcnMpKSkK KyAgIGNvbnRleHQtY29sb3JpbmctdGhlbWUtaGFzaC10YWJsZSkpCisKKyhkZWZ1biBjb250ZXh0 LWNvbG9yaW5nLWxvYWQtdGhlbWUgKHRoZW1lKQorICAiQXBwbHkgVEhFTUUncyBjb2xvcnMgYW5k IG90aGVyIHByb3BlcnRpZXMgZm9yIGNvbnRleHQKK2NvbG9yaW5nLiIKKyAgKGxldCAoKGZ1bmN0 aW9uIChnZXRoYXNoIHRoZW1lIGNvbnRleHQtY29sb3JpbmctdGhlbWUtaGFzaC10YWJsZSkpKQor ICAgICh3aGVuIChudWxsIGZ1bmN0aW9uKQorICAgICAgKGVycm9yIChmb3JtYXQgIk5vIHN1Y2gg dGhlbWUgYCVzJyIgdGhlbWUpKSkKKyAgICAoZnVuY2FsbCBmdW5jdGlvbikpKQorCisoY29udGV4 dC1jb2xvcmluZy1kZWZpbmUtdGhlbWUKKyAnbW9ub2thaQorIDpjb2xvcnMgJygiI0Y4RjhGMiIK KyAgICAgICAgICAgIiM2NkQ5RUYiCisgICAgICAgICAgICIjQTFFRkU0IgorICAgICAgICAgICAi I0E2RTIyRSIKKyAgICAgICAgICAgIiNFNkRCNzQiCisgICAgICAgICAgICIjRkQ5NzFGIgorICAg ICAgICAgICAiI0Y5MjY3MiIKKyAgICAgICAgICAgIiNGRDVGRjAiCisgICAgICAgICAgICIjQUU4 MUZGIikpCisKKyhjb250ZXh0LWNvbG9yaW5nLWRlZmluZS10aGVtZQorICdzb2xhcml6ZWQKKyA6 Y29sb3JzICcoIiM4Mzk0OTYiCisgICAgICAgICAgICIjMjY4YmQyIgorICAgICAgICAgICAiIzJh YTE5OCIKKyAgICAgICAgICAgIiM4NTk5MDAiCisgICAgICAgICAgICIjYjU4OTAwIgorICAgICAg ICAgICAiI2NiNGIxNiIKKyAgICAgICAgICAgIiNkYzMyMmYiCisgICAgICAgICAgICIjZDMzNjgy IgorICAgICAgICAgICAiIzZjNzFjNCIKKyAgICAgICAgICAgIiM2OUI3RjAiCisgICAgICAgICAg ICIjNjlDQUJGIgorICAgICAgICAgICAiI0I0QzM0MiIKKyAgICAgICAgICAgIiNERUI1NDIiCisg ICAgICAgICAgICIjRjI4MDRGIgorICAgICAgICAgICAiI0ZGNkU2NCIKKyAgICAgICAgICAgIiNG NzcxQUMiCisgICAgICAgICAgICIjOUVBMEU1IikpCisKKyhjb250ZXh0LWNvbG9yaW5nLWRlZmlu ZS10aGVtZQorICd0YW5nbworIDpjb2xvcnMgJygiIzJlMzQzNiIKKyAgICAgICAgICAgIiMzNDY2 MDQiCisgICAgICAgICAgICIjMjA0YTg3IgorICAgICAgICAgICAiIzVjMzU2NiIKKyAgICAgICAg ICAgIiNhNDAwMDAiCisgICAgICAgICAgICIjYjM1MDAwIgorICAgICAgICAgICAiI2M0YTAwMCIK KyAgICAgICAgICAgIiM4YWUyMzQiCisgICAgICAgICAgICIjOGNjNGZmIgorICAgICAgICAgICAi I2FkN2ZhOCIKKyAgICAgICAgICAgIiNlZjI5MjkiCisgICAgICAgICAgICIjZmNhZjNlIgorICAg ICAgICAgICAiI2ZjZTk0ZiIpKQorCisoY29udGV4dC1jb2xvcmluZy1kZWZpbmUtdGhlbWUKKyAn emVuYnVybgorIDpjb2xvcnMgJygiI0RDRENDQyIKKyAgICAgICAgICAgIiM5M0UwRTMiCisgICAg ICAgICAgICIjQkZFQkJGIgorICAgICAgICAgICAiI0YwREZBRiIKKyAgICAgICAgICAgIiNERkFG OEYiCisgICAgICAgICAgICIjQ0M5MzkzIgorICAgICAgICAgICAiI0RDOENDMyIKKyAgICAgICAg ICAgIiM5NEJGRjMiCisgICAgICAgICAgICIjOUZDNTlGIgorICAgICAgICAgICAiI0QwQkY4RiIK KyAgICAgICAgICAgIiNEQ0EzQTMiKSkKKworCis7OzsgTWlub3IgbW9kZQorCis7OzsjIyNhdXRv bG9hZAorKGRlZmluZS1taW5vci1tb2RlIGNvbnRleHQtY29sb3JpbmctbW9kZQorICAiQ29udGV4 dC1iYXNlZCBjb2RlIGNvbG9yaW5nLCBpbnNwaXJlZCBieSBEb3VnbGFzIENyb2NrZm9yZC4iCisg IG5pbCAiIENvbnRleHQiIG5pbAorICAoaWYgKG5vdCBjb250ZXh0LWNvbG9yaW5nLW1vZGUpCisg ICAgICAocHJvZ24KKyAgICAgICAgKGNvbnRleHQtY29sb3Jpbmcta2lsbC1zY29waWZpZXIpCisg ICAgICAgICh3aGVuIGNvbnRleHQtY29sb3JpbmctY29sb3JpemUtaWRsZS10aW1lcgorICAgICAg ICAgIChjYW5jZWwtdGltZXIgY29udGV4dC1jb2xvcmluZy1jb2xvcml6ZS1pZGxlLXRpbWVyKSkK KyAgICAgICAgKHJlbW92ZS1ob29rICdqczItcG9zdC1wYXJzZS1jYWxsYmFja3MgJ2NvbnRleHQt Y29sb3JpbmctY29sb3JpemUgdCkKKyAgICAgICAgKHJlbW92ZS1ob29rICdhZnRlci1jaGFuZ2Ut ZnVuY3Rpb25zICdjb250ZXh0LWNvbG9yaW5nLWNoYW5nZS1mdW5jdGlvbiB0KQorICAgICAgICAo Zm9udC1sb2NrLW1vZGUpCisgICAgICAgIChqaXQtbG9jay1tb2RlIHQpKQorCisgICAgOzsgUmVt ZW1iZXIgdGhpcyBidWZmZXIuIFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBkeW5hbWljYWxseS1i b3VuZC4KKyAgICAoc2V0cSBjb250ZXh0LWNvbG9yaW5nLWJ1ZmZlciAoY3VycmVudC1idWZmZXIp KQorCisgICAgOzsgRm9udCBsb2NrIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgbW9kZTsgdGhl IGNvbnZlcnNlIGlzIGFsc28gdHJ1ZS4KKyAgICAoZm9udC1sb2NrLW1vZGUgMCkKKyAgICAoaml0 LWxvY2stbW9kZSBuaWwpCisKKyAgICA7OyBDb2xvcml6ZSBvbmNlIGluaXRpYWxseS4KKyAgICAo Y29udGV4dC1jb2xvcmluZy1jb2xvcml6ZSkKKworICAgIChjb25kCisgICAgICgoZXF1YWwgbWFq b3ItbW9kZSAnanMyLW1vZGUpCisgICAgICA7OyBPbmx5IHJlY29sb3Igb24gcmVwYXJzZS4KKyAg ICAgIChhZGQtaG9vayAnanMyLXBvc3QtcGFyc2UtY2FsbGJhY2tzICdjb250ZXh0LWNvbG9yaW5n LWNvbG9yaXplIG5pbCB0KSkKKyAgICAgKHQKKyAgICAgIDs7IE9ubHkgcmVjb2xvciBvbiBjaGFu Z2UuCisgICAgICAoYWRkLWhvb2sgJ2FmdGVyLWNoYW5nZS1mdW5jdGlvbnMgJ2NvbnRleHQtY29s b3JpbmctY2hhbmdlLWZ1bmN0aW9uIG5pbCB0KSkpCisKKyAgICAod2hlbiAobm90IChlcXVhbCBt YWpvci1tb2RlICdqczItbW9kZSkpCisgICAgICA7OyBPbmx5IHJlY29sb3IgaWRseS4KKyAgICAg IChzZXRxIGNvbnRleHQtY29sb3JpbmctY29sb3JpemUtaWRsZS10aW1lcgorICAgICAgICAgICAg KHJ1bi13aXRoLWlkbGUtdGltZXIKKyAgICAgICAgICAgICBjb250ZXh0LWNvbG9yaW5nLWRlbGF5 CisgICAgICAgICAgICAgdAorICAgICAgICAgICAgICdjb250ZXh0LWNvbG9yaW5nLW1heWJlLWNv bG9yaXplKSkpKSkKKworKHByb3ZpZGUgJ2NvbnRleHQtY29sb3JpbmcpCisKKzs7IExvY2FsIFZh cmlhYmxlczoKKzs7IGV2YWw6ICh3aGVuIChmYm91bmRwICdyYWluYm93LW1vZGUpIChyYWluYm93 LW1vZGUgMSkpCis7OyBFbmQ6CisKKzs7OyBjb250ZXh0LWNvbG9yaW5nLmVsIGVuZHMgaGVyZQpk aWZmIC0tZ2l0IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9zY29waWZpZXIucG5nIGIvcGFj a2FnZXMvY29udGV4dC1jb2xvcmluZy9zY29waWZpZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFlYzVkMTA0 MjY5ZDcwMGFjMTAyMGFkNDJlYjYzYWE1M2FhNjdiZTEKR0lUIGJpbmFyeSBwYXRjaApsaXRlcmFs IDI2MDkKemNtYl9lWElHTzY2R2NFIU0xbG5uYWJZYkJpd1Y2NU5QR3lQN154dmFkUSp4SjJyVmp2 UEgzVHBDUD9UK2RXbSNJCnpMSndVNlMpQFpLdHtANW80V2hFRUZaJjxmZChPPGdfbmJMJXpzIWRy bnd1Sik2fVQrRyNsPnxOYWFZZ2NteypSPQp6O3VPenU3YVN1P2I4JkhWJSNHM2QkTSpqUDAwNipY dSRoP3w3Sz1TfD1GRzJPZHBaQ0IwZlg1ckRpe21fMDYzcykKejI+PzFlSSlFTWs9cElpV0U1T2h+ NlhNIz5rXmApeHFtWEhAMCFfMFNZKnhMNiFTTzAoS21xTGdXX2Zge1d3VDAxCno0WE5SRUElS0M/ RGAofEY3OFFqdWhkPn07Mi11bW5vSylhfl9jajE0ITdXT3NnRjElVHRhT01MNjN7VStmJnFwdwp6 Vjktfj9TUDg1TzBqRXdEMlU4UFpXYDI4cEp9SUB7YUB6SldMQFA1RzA5TWU+OTZwWXlHOT96P0Y/ JktwLU81RU8KemRLa3oqUjBJRn54b2gzSHc5VFRmdVRWN31DYU9FKWJ4YTxtbWIoS21hfkNeUFRU X15jcCQ9KGY0ZW5XSW4/b0BvCno8YXQlNXU7PTFvc0lhKz96fn5JOC1HPSoqXzROWHdAKE4mWj1J VGIkXmc8R294d3RyPEozMD0za2MlYSE9LU1Udgp6ck49SjRlKkNWfEJAfU5DUU0+MUU0WSQrMzZF WlRGdXtoKD0kZTVoIVBGJHdobEc/anc4WX11NkhkJDFDdU5SaWoKelEpNm1WX1RENjx3blZWVUxY c1Fzd2BfZnRPbnV3YXUhe09sMFJmSVJLYDBvKWpPPVJRPUxGYmpMTCEhP3JXZUsmCnptUGg5MU1s OHN+P1RvJn54dnFmO24hYk55RXRBXmFUa0I3KWFmbUJTP2tVS3ZGVk13aEl6TmtCWmoxYkAjK3pS MQp6SElSSGkjMnJQLUdFYXp2cl9XNGVqbk5INXlFRHQlRWgxYFg4OHN1IWlyNWx6NUhUNCtPaGpV MVkkQnMkOHpOKU4KekFfMCR4QGpRJjxXMCM+WUlOXzxUbVdHenpFaFItMkNEO0NxKENJYkw/I2I1 cTVqPk9iUk5WV2hxQlc3JGt+VVlECnooT3dydkUhJD1tbVIxIVFKPFdUVFBpQyo9Y0NfVH4lfDEm UyUqdiFedlc4TzlYbU51KnY3TSNDRmAtX1JCPV5McAp6UE9zd1pOM3Z8NFR4fUZAISMjfGxVZEQ8 aE5xem49aXpYUTQ0MD9gUlNuTH5HU1YpalJ2RHxrYyY5Y2V8cHtqKzUKekBSNG9wQGAqVjxkVTJl RURUPDN2XmVwaFoxdyFwNncqYz1JZ15QYik3dkAqajdkTkBoY15lSms7Xk8tWXAkOV87CnpFJHJr IU1xaCtvPmR+aW4rK0g3dFpkfSRkejlEb2pzWXl0YS1pSHp2cD55I0o9JUJwXmN6TXZITGYjRnB8 SEZ9Iwp6aHgoUUpKIy1mSUBHJGdOTkUyKFpmRUNWNEs5Y21VPWk9ZSUyVlU/QjxAcjRQPEs9d0pJ WnZ4WFVXI1RHZS1penMKekN5eilTaWN2VHckSUpVZypHeVVrWjB6TTJpVC1zXnJjQS0tRTElcW5r fiQpTk04cD5uM3FKVlg9cGpDYG11TDs+CnpPfT82fDd6Z1NUeSlgTUFuUj09RnVee1g1ZSVmMUZA fE5hOEt5bEY8c29CaEYtLW96NFRIZnF7LVRzPGJEMXt7Wgp6OW4wJVlWVVlUVCokdSlWIz9YYTFp UnE/NXpuSmhwU2BQOW5gNX1QOypSY0lWSj9GVDtPMkQ9XktGQVBVKnE0MEUKemwmajB4O2wobXo0 dCpBV2s/WD9IP1k3PXtSJiRnNDVCdUp5eFJvP1YqKEs4MEhPP0lSRmt6V1ROaWEwUU4+MDNrCnpn WENfPFE/QjM2SFd9fWBJfjt5cE1EMiNVbEtmaklpP1lqM19MUHBNN28mditMRT1RO1dZWTVHNGVi WV51SE4/Ywp6JHd7aVc8PEJjal5xZnY3IyRRdnNES3pFcyhfU34/X1Q0cm1zSklpIShQaD1jRV5o MXJXKmdEISMtQHdTZmEoMHwKei17VjBjeU1tbDJadT0/YEQ+PlZTRHlSQTNrKUwyRF94M242YT5m cyhQfHdlT0lJJHdpTTVWXnM1YG1CfWVye3tOCnpDcEhtMkR9SlgrT2lTbChLZVQzbDxlS0lCcEBq T3FzdjRgeS0hdWIwQSlwZX5jR3xCWj8yM0d4eldjNE5UQSR8Mwp6VX1gVSpmaGdRJncwPmxuNGN8 ZF5iTUluI2YhIUtPJmp8R1gpTyhyZSM0JEJQZy1uRCpnUnNlK20mfTFLbklqNzAKek0mSkJxcGVJ MyspPnQrK3Vqd1pzK0JofWNVc31ObmlaflJ3dXZldHp6YUVZQmlDUCk3RkMrYXhEMVRpMl5YIUti CnpeKkN5Y1ZKaD99eihseUJFSnNAd0NLSG1UNk0jNTM4emslIXZAMFRPK2l2WXw9UmxLOERSal9Z UGQrST4hc2ZTTwp6UEVtZCF6czdOTUpReXVrbkpWY31EMVBiLUBkY3ZrZkkleUYtbkZVYT1qKzdT aTFLOSlnUVVzfXB3cXRFQSU1KHQKenBLRkQ4TiNxYmtAZVFgNiRoTX0tYEdET0lUVHY/MFMzWThL ZX02am5PVjZgUVFaIzVjb1YkSXYrNnwxfG47ZW5jCnpvO30wdEZDRnJJdCMjc3FPWn52Oz5BMHx+ JTFWUnUlfTs1PSEmaHJDck8hfXlYNT1zeztfUjdrNXNjQEJ5eFFLRwp6YDB3bGpSS05APCszQkQ2 RHoqIzVuaVYoaG4rSUpremZMZVNnaEV1Zng4MlNeTmYxZ3xVcDJCPiFhY1lyOWJ3JF8KenNMRGdC ezI+M1hCS2QoWF81NWlBKUZyNWEwO19MSjNJQVF4ZkhYRE1yaWYyPT8yNFV3JG9WV00mQ3lEQ1I7 NVF1CnotdFZwTVkzQUh5KkNyPFpHTnhpM3FJeER9UHdZTGRqSklgd1VkK2wjbT1UREB3ajJ+fmdU MUF7eHlrQU8hPGltTQp6VzJ+dSZxKlFIVytwYzcxQ2soQ2pAMkNfTGVxR3dZdTA/ZDM7OFZFdW1T RCpiUE9lb3h2RzJmamhqXiFTa3BgTkMKej88YUlybXt5djEmbkxNNXJadS1PIykrUD5NQT45eXQw QUB6ZWhjPk9MSzU2ViUzP2FDPUgkP3V5aCNmejgtSUAlCnpSJTV8K1ZJS0ItJUdhJVJ3bzFNZztZ MCpuelVyLV5Wekd5V1ZFMnUjeT5IRE0xaTR1aFhWRSlxV3Y9UzhycHxTcAp6V18zQEZOTl9eV3pk TGFpQV5vO3wlfnAqNGxuejt0PWchOWB1RDtmeitQV1kqPCs0JD96YD9+R3RsSkJjVjhpTzUKem9U QyhXYnpnI1JMb0dDfEZgQVg5bT0jKmZnNFNNOUZBOSpWZj1XPll2b09yOE1zd0lrKUQ5bnhVQT8/ Oz4hI3xkCnpkPk17Oz1sZGxCezw4LWFvanZWZDZXTDdvNV5sbz9CZXh4OV9pRU1jQ1owa1Aod34w dShtc3stcSpMdE1Oe30hVQp6QmZjNyomVj12VjsrQDtVRn1tZ2g/YFBrO0tQeFJOPmRCSEVSaCM2 UVJ+TzVvNi1KSkJIdGJDSU8tWXY0SkdndH0Kejg/TWE0PVU/LTNebWE7NENUXmE1YD1MeDFVbVcp UnMmezFrZTlKc1RmQD1eez1zNE56Qzg7cCRnUzY+clI8KTVZCnpgViNjNi0jamg8O1ZOc2otb2FN LSk4U35IJT1qeUwtYXRAN2g0I1VoO2BRTHBjfUhaKVU0PT98cmImcTBXTHwtLQp6Y3hjWnludjw4 YmQ4TClfSytqfCpJSFhOO3F6VUpGdUJgNUs7T298X3RCVGc5KSQtalVTMXdBR1B2bUNVRGc1bnoK ei1Wdjd3TVBRTDc9KzBFZmY4PWpIcDdgQyE+dz9mKlExJGBOdz5fcnM+ayV0bG1KckJ6I0QjM1pn Pjk7cVJjUVMxCnpPd144UHJCMFZ+bjQhej5vVX1qUjFKeWpUYnBFeDtubyVQNloldjZDa1J9eEl4 VlJ+Yk8wcn51M3VqQV5WKDlWbgp6MGAhZkV4XzM1b1hzUkIpIyZrPXZLSXR8a0R5dkpmOD1OYHVM IT9GRTl0UF9OP3Arc3NyQGBHRjVMKmA9S3dpOUgKemxtJjRtOW5GaDAzNENmKyZzbGdgVHZTSmFg YDdmcUZjYCh4SCNwJF93Sz8wOVNMI3hofEx+NUslRTM1SS1rViY/CnEyMU9gdnBLNyNAdCZKJUhz LTZEXmkyRlBrZU4yYnNiNldkPGp+X3pjUklnc3dJckBLUCFzZ2B3CgpsaXRlcmFsIDAKSGNtVj9k MDAwMDEKCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3NjcmVlbnNob3Qu cG5nIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9zY3JlZW5zaG90LnBuZwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw Li44OTY2NWI3N2ZmNDVmMTMzMGI3NTQ2ODJlNmM3ODdkMjJjMWE1NmRlCkdJVCBiaW5hcnkgcGF0 Y2gKbGl0ZXJhbCAyMjAwNgp6Y21hJk5ieSE+OSktX3RFNmJmeEFSOy0wV2lkIWpga2tUU1dRezE3 cnlNK1kjUTc5QzVFb19QZ2NYeCtpIUhUO0QKemNoXmhMeCN4V0VgYHYlO2V4QXRNR1VnbSgle0F3 R19TKU87dEV+OWJDJEZCfHhwVXtLIzF8M3lKOXE4QHc7JGNkCnpfaXkqaVQ3MHk7WkNyaG9SdXNL JHt7UHZhUCQmIXJWYGdVbDIhKCNTWjlxU1l8Tlh4R0R7NXRCQmBGTlchXjQ5TAp6JVpVOGxfeDFM bWpPZ3R0UHo1bjRSN0IwV3ImYzRfNGY7dlo0ZS16cWc5P0FPcyViSjJtZUNhY1lWYitUNEVqKyoK elB5VytLYWFvSjVTLXIrdEozfSQjS1hTX1AxKXQ2SEtkVSRlSHM9YVVENEJoTU80LTRFTGUrd0RF SHFfNEJCUEJtCnplI2syT3hFZSZiKjAweVlWLVVxdFdzY1U4K3EzeSRhfF9+VGUpaDUtLUZfPGNj KnRsK3tRZnlvP1VkKnM7e3ZaSgp6KH0jK0UrbztzajdaPEFPYVFHPz1sfXtlfUlvWDYtJHkoMFZ2 UEd6U2NxK0xrQklJUjAzOUowZjRwUnltTkVyKEYKemlja3w0dnk2MX1TNmRwJTQ2VSpjOUtaeVE8 YlBGXihKQzJfPmQ2MTZDZjhnMzw3OXVEZnY8RHJiZy1YK05HWX5uCnpSTSFwZUVjP2FTSGVoTjI4 RWhiS3BKM2ZtQk9CRmNxNWU2YkkzKDZ1K2A2YzFYfjY0O3Q1bGgoYyh8KFl6KGhqTwp6cEhVNUBM JkoxMkNrd01pVEcyJFRRdVRQTVFEVWwxcS16NlFfU2JNX1pjb244YyVlVUZTaFNNelM8a21NRylU a3sKem40WE9PdFB8Oyg+MTlgJT1WbD82dntibkA2N21zLXs4bV9NbFpaXnwmWHpMSlhKK1FgPj5G I3FtaDRRWHJ0NjghCnpIVUlPWXNuYWRpJmJZY3Q9OTNzUnlNU0o1Yjc4VyZrLUE3dXRnQGxDWXtj eyp8OXI+TSQqIVArQDdyQy11YDtLUQp6dX5iUUE2e1QtZFV1XjxReU1NSXlXSTUkIUJvKENtbkNn LTdQVzRUV3VPSVM/Y2FzJjwmfmwjfjMycEUhdCp7LT0KekhXWmlwRCNYRVRUaTVAXnFYQ15fdHBl QmlVWHQkVzhHPFRzdGBBaCpzVy1GdCl7QVApaD5wQFdIO31lT3B+Q3VwCnphZWxSdWJAU35DU0p2 UVhRUz1JTF4wOHN6bTZDWVIrPjVFI1A2fnBCMXNhOGlFKkZAdmViI1had3EzMllSdHFkMgp6P3Vo aXMmYWJFaTM+KlZYMmlucGIhdCZDOzd2fTJ3bXpFfT4rciEkIWdQVzVebFJZTXI0QzRLUnQtSmVD d2hISnsKekFDTEF6cV9aYGJzTy1ad2gzNERuZjlmREZ0OG5LYiQ8eDw3T2NHR31kcnY0WCVwRTgw Kz4hcSFBdEl+QHBWJjttCnpTaWNhYVoyTlByRj96PzZVYkdOYmptU2h3a0c9SzV5KkhaUklrWiQ4 MXUwQ15nd0pMPj0qQVFObWlrbyk7JCkjcwp6ZiN+TXBeJUVsRlghcSg8RXpxUFJaez4pS1V3JSZy dWVBfk5razxLOXtFej1eWlIpbk9Fc2w1cms+QSFqP1ZXYEwKemVEIXRyTkllTkAhMF5KLSVyY1pI O3ZZaDUzayE+UFVnfThvR35Dbk9gNCRTXlFZaFUtaUs7c3dBQCpndmR6aXw/CnpyKHpQfTgyZEMy aFFCTVphKGNrYUVRNjxHY1JAVDBATEQ2VEZCMmo1SjVifXg5Tig/ejRQQXBWVjUoQGMqUGBOXwp6 Mj0mMz9MZmkkI3JKeWl3OSEtZjdHR0MhT24lRHx+YVdffnZAR2l6QzMka1pIbFdGaEIoYWBNcntT WFQmMXVmcnIKekxrN3N9Z3dFYUREeklDVjBNeEA2R2ZAJVZMSlczT1g5KzJXYWY+MVFJP20yWnEy cEZoQzZBblY3Mj1MNClRakBoCnpzTk54dTNDd25vSW9ESUJGanwmVGd6Z3NaTlMpNTw/ZztBXkNK MDlnc2ZgKkZkPUZoJHZ3dHw1Q25zaSY4UikwbAp6VmNHI0l1UyZ3TEY/K2pucnpRZWY3PjBHeDYy LU5yOyVlIXQmZ1BFWDZNen4yNiU5ZH5hPnRmNDBVbn5wbz9ZOUIKeiQ2OTxaVE1sSilxaEhTREk0 ejYlaDJDPTF2P2Z+YlIpfS1AMmVDN0orI1R+P29aZSReVyQ0V0IhWUlQN1VHNitzCnpSXlVNNGJp UHxAVmpJM3s0TW9JNCFJNDgmNFgpKkBuVH16I3lQUGBoIyM5NkJNX24lNWBOS0YjN0tIMnExTjRx eAp6VklDOW9yOD12WHJIfiFPd0lYIS17JkI3d2EpVkZQPik0X2B1azZvPEVDc3M7TjdjJGc+PlBZ cHohSHtTPWM3RzIKekV4QmBgciFyWTBCblk5I21PK2skJigtVEd1R1dJMytLS19+byViM1MzQ3Ep KzxaPjJ1PStUSyh7SDwyPGwpUitiCnpiOU1GY0paSDcoODRxaVpjUWhsJnIoTlhZR1VvMX5qTH56 eCkoemxeK2BqSzkoMUVZN1UxN25ZV2QqX2d8MzRtMgp6OVIqezRMK29gOWxoSGdUbjB5ZHl2TiE5 NHZtMF4qd0o1JVkyOD1OP0M2V2FMPnI4RkBoRHclZCk3cTBHQDNyNisKemhhKmcjWWFfLUpHcmkh Z0c+QVFXeUVXczNZXmB+ezhrfURSKXEtMzF5ViU/SllMXmFMUD18dTBZSlhaemNPUHRLCnp0dCQ8 ZnF3IzFDZSpBSjJYJjlGQjtMamlLWGZROz0ybUlLd3liJExAWXteJWpJK25OQSZKTm5lOGk5K01X VkYlKgp6ayY5QUFEI3l1SVJga0l8I0dqIU9JbT4kTT48RUxlVnsjfiYpM3I2MmhBZTUjRCh3VT1h e1g1akJRSGZhP2BZd1cKekV6VnR9ZD5AfmdgVjRmPXdfc3dEWDlsXnhIOys0fUBNb2hob0slUChI dUMmUnA4YWFNUWw3QE83KmV8YDVAVEFvCnoyQ01OdCMtb1pVJDNuYXlaUyR0WnM4XyZ+JXs5SSo7 SlZIQFJuPmlwMXJrXkYjMHpgXkgybTVnVmF9ajl3dDdGUQp6VjRoaV8jeCM5aGdYbm0pQ0JlVH5f O2xBZDVlT3M8U3YhcFVEfUFNIV9AUHdZQT9lflA3O0t6YytaNlYxbnBzeiQKeiM1SXY1Rn1ANWNV WFVZKkVGKV4wS01mSzl1RjlGTGc7Yn5zLTAwNDdmVTdwcEZVPjY1TkduTVB1e09LZj9GTmBCCnpS N0lSUkA9VVJ9ZH5gemlGRn1qQG0lRkNGey18dGtfMV9Cb21FaWNPJmgoNjxAbTY2JipaJlgyVlBW TFhEWEIrOAp6VDV3YD1man44KyFTJTJfRzZ4TnVgd2I7fUw+QDJNIXo+QXBpcSsoQ0dKdFhXdDE5 ZTBYRCUmX199MUJZZV5QJFEKemskZCRMWXF0MT1sQFRnOGlMNGBpSXBQflM+Xk0heGQxfGx5cCst a3krcWd0TzVYbnQyZEZTUyNqJHgmMEYzVmQ0Cno4NFkhcDh9ZDR+K0wmSF56cSFNZUpuNnJeez1Z e35uYSpsSW0+dGk8MF9KRmYkZ2EmMWVRQzJ9ST9EUiEpMjctKgp6WkUxUEV4KypmQyphJGlDPCE3 MWt0OFpKVFZTMXsheHNQbEZBWXRebSY0flZjcSs5NW5mWUlrNTxlKEU0IWA5UnwKeitpS31qKlFk KEhYKj9jYyRHd0FhTlRETnZ4Z3o1aUpEMCpGUno+Yj8oTUBvPlo8WTwjMVZaTkxEQEpPeXR5eUJX CnpQKVNXQlZsenZRViU9NUVDNkFFKWR8ZHN1T1B8XiRMTGtDbTxnMH5wXlBwd0RtZERFKntwMyll IzlCek50d0NiKwp6aUdDSD1CUG5VK184K0ZPeF5tK0AkNUBhTHA3ZlBwKl43Z3hlcyNAV2tmMSY3 aDElVWA3MFcjNUZHN3xkTDYpdjAKelZgSTZtPTJGNHhtamQ7REtSR1MzbkFNT3o5YnJZRm9tYj9k dU5qeVpuQGRzSnRWKSlBNkFtSD88RDVxel5eWk5nCnpFWFBqPmtLZVo7e1NLUEY2eVFQaVk1RzxC Y2RXQiRkQmtHPVojMFImSDBPYHNlcitTUEF9N3MmOTk1Q19tSjc1ewp6Sn4jZXczPnVPQSVLQzR0 Mmc1JmNEN082bUI2OzRWOXU8JGhWJD5RUUJDT0JjK3dnWXU9X3VeMjR6RUIzKCltdEMKeklLU2Rs aX5jTWZmLXI8UmI2V0VTfEt6NSlBVHA8NHAmJnYyPXJEamlDO1R1JDxtVDY1X2J8SXhKWVd3cyEq K0QmCnojY3A7ZkBGcD0jZUBzNStJbDNkUDFxTkdhRmhhQH5UdzcheEIkMlVrKzxJYXIwRmtsUGBk KiZfdztvJVEqamMofAp6YmljNDhIS01+eSN1UnAlKHEyRmBMUWRXQ1ZTfGhBakVAVnAtNzMzVzJq VyFZaGZGQiFLd2chSmJNPFk7cDQtRGoKenstc1VHI09kMEpiVSMyI1pCWXQzNC1afm18M05SJmVJ cVRYOTZ+ay0/MX4ySWZZUGA+O1pOcHYyZXZNRHheN0VzCnpEejw7fkx3QnRXMEVuSUlsNUQrJCow Xk5PISZgYSY0ZDw+SlRhfXR5aVZEUE9YPnI8KmtGXjtyKHd6MXZ0VUAkbwp6JUk9U1FwV3tMUDdi WXtRYylmc2QqfH4rQ3NMe2U9TGtPSj82Pj5aMUFYcnE9MThjUXFZV3J9QGJrQyE0VnUtZV8KekBW Tjh+WEQpPFFLMllgZT9NZ1MjLWFweT00M3NvYE42JVJUU30/QjdFKCNveldVQmc8WUFmJW0jSURi a3BZYiFgCnprQ2Y9SE1pdUIhTXgzP0lAb2VDU1B+Rl41YXVXJXJFMF9nVlZ0MTdhSz9rPShrTVNt WWppKXRDdj9xcHtiMGszMwp6UWtRJkAkR3Y5UDwpVnt3LW1JVn5lKmc2Y0RUXl4wPXQyZUZGVEpg fG87RXdmZyFzYHdJJjI4UjNRX3k3JT9qI1kKemBXP0VuPmxXdUUjYChwUnglfFA+XykyM0RAMHd0 QytqRkkhdU9GcV87SnJDezhKYjN7NT5ZPnhJX2hnfVMkZ0BuCnppR3d1QlRYfCFrNlRnTDtkWipQ KXctKEtZNH5mLW5oUFBtT0RKK3pzUzVQMFBkR0RpKSQmIWc9clJEU0N2I2wySgp6YmhVWTIyZjUm T1pYYkdxPHgkT242PWp1UEojOFNkR1R4JCR5WXZvPmF+eylqPU5jSyNwKDBnc3R4I2pyajJQTz4K emJ5SGVpY1hZcXRmS19hKFpgaWc2MytDN3ReOTN8KipIVmIqI30rKSt8TTkwODktJWRNcClZLVUr RTVRZW9TQik5CnpjJGtxQXM5Si04dlZ2XlF4O3xAfm05LUhxYjRjSHF0K0FzbGk4MUZgcVZyLVdA ZDJASlpsVV8wbUUrNUp6Mj1VVgp6aFM0RXkqNH1nMlJgY0JyJU1qelh0bVhDalYrWmkwPEVWTkZ4 Nl9uYlZubXlvdj1nP00mI3VpP2JvTzFMSSs9QWIKejk/fk5pX2ghb0sjQCheKHtSWHJRUHNSMWFl RUklX2ljLUdTKSRaMUtVZDxSSHA9aHloSiVPYiExXmRVbm1pJk1GCnp0UlF7KlQmSk1xLXlZfG1T fk9jT3xKUDtINWlOYFZ4OyR7ODJYKkpBSlklekF3Z3t+PDtxej1OeyR+ND1PPy12Owp6b3wxZyg5 UmV8PHtVeGZqan5hflk2VGNyZj1zcHBQemBpNFVuMk5UNGlFcWRlNDtIYHNqfmgyIWg5WT8zUkEt bGgKenE1UCs4UTUpbU4lUGtYP2ZueG48QlZJVkh4ciZlVVdwSWIyMHdOfXN6ajx9XmFrWDtwekJO aGlSRnclIW9ZP0FiCnp3d1o0MVIoXislJG1KamBnWDlfKCMmb2g1djFTbj9Pa1Y1cz8qPXJ+by1+ SGMpe15kJE5WTztvdV9+KjgoYiRKKAp6OXNnOGtMcE1TRkdNKClgOCF4JSVvSGIrZ1gwQ3JrOWlZ JF41NFkjQE9pcDtGVWpyWFBifGcyJjBKUyMjKih2ZDUKel9KKkMlMHdVUkhfTE84Z1Y3NHNmT1Vi S0c8TWl5R2Z7ansmeng1c2pqV1hPIzRUQSppNlcrbCNJV2w1PDM5SCNPCnpBKnRmPWlXJkx2TjdG bFVEJlY1WHlgRj98cyRRPkBGeER6RGpmOyNnK3p+SkstVigpbXlffTFhYiN0P2BkR2RTTwp6KDZ4 SHxkYTh+TVdJclIrK3ZFU195N3FTIzJ5QlRqb0BZPCYpeXRpfXAlY3FGNCVRaUtNKU1WaHp4I1R+ dGRSQiQKeiNXeGB5Tj1IZkd5IWI4YSRlRzBaTDtAWmlFYm11aEclJiFAb1QzfCYjX04xXjUwR19v YzEoSjxFMyg0SCRKQXZGCnpkYmtSRCghRzRAYkdMJklZY2B4M3VoWnFWNXgpUFpkKyhedClIQEpC dmQ5cDY7ZHhCcm5abVFSTWpjP303PTdqYAp6V2smPDI0TXk5VzhyJk10YWR9T1RQdXNscW5fVkdY JT0tTEo+WDAmTGoyfkBlPypyTzM1OUBwUGZXezQ3R34wck4KemQkN3hWaT1YWDQjMTVTNE9vQjkr Y2tZPE4mYkkyTCllLUdOaW8lS1lyezJ9UCZaNCs0RGApbE05QD8lRlJvYldFCnp4SzBqQmY7KGB6 NlchQmw8ISpxbW9KSyN+aVAtYXxLOFd4KGVqZ3FqejN+cXk/JnJlP0A4PSZUWWRASD85QU9mZgp6 Uj9+TkZZTEs5MEZGdn08UGlfZE4ofiE3aEgkbmhrWHIycjJsa2dLTHI8RX5OemAobT13YzhhOEtF MWBpaDEwd14Kejt1fjg3MX5lQmo7aUc4ZiZyUW1Tc30zK0UxJV9qZUtYQjB5KWJZbFAzbUU1PDhL TlhCY3V4OWdkcmU+bUlFWTdQCnolaHRgMng1SiZCRzJMKlYqTlFvKkN4SHtueSF0Y0E0MWBRLWYo WTJJRmdYa2pAI0h5QitWKWU2KzxuWDVWPERTJgp6cUxgZlRodkxeOTVTLSF5RG88SiZlc0M3ZSZu Vm81KFA8RWFvRXN5Z2NSOCg8dEgpOTg2QT84dz40N01qYiU+alkKenk5UE9JakNjQ3YmVXpGNFFg XksrelBsQz9FWWYpaHMhOSRzdSEzI2g1IyNTV2B9cio+XzEkKT5LZ2cwRXlrYCQ8CnpCI1AjPXU1 em9OSWgjNWRxZ2BaXyota0N7NlR7T0dpOEQlez1pNm5RaU1rSyNgMVptU2VyPiFIc1B5VmxHdkQ8 Qwp6a1BNc3IxUVk4UXxNWmJJYDhMd1d3cWY8MjBTZStZdWN1NGdhJHhne1FeYVdtO3tyeUdUYFNM P2UyLX0pNFotJmgKejltRzRrQGhMeU13Iz1aWnMrbjFxY2tjTiRPcXJYYllQP3lpKD4/ZnBrb25q cGs3e0wmayljQ3JeLU1ZMXd6fEZ9CnomMWpuQUU5fW0xUTBDbyFBfk84TDJhb1BVSmV4TVBVP0FL ZzAte1l4T3Z+SENSJW1Re2V0KGdRdm9hKDBWOFF5Wgp6eX5HKjl7VG5vdjF1VldaO202ZCFFY3lC RipuOEQqJEcqd05FaShNbSl4eF9jTmB8SHx6eTA9VW0jPTdMSXw3ST4Kekp6fDJuOzN5UnAoZHZl NlJPO0JQQ0hpNGBPKWA0Nm9fVXhpbmxwczBNLTRoS2YrKjFaTnhaKV9Jdn01Vik4bXVGCnpAPT5F bzlkem9DSVJufUd2REYjSUA1Kyh+YmcjUnJgbkp4fGc8RllAPzZHO01SayE3IV5INDZtNWNfO3sj R35qOAp6WSVKamM8djs2Myh5bm5rez1YaUxgfilZcjkyRW9TZX4xdkAqTitVKTZRQ15pdHZfKzs/ PTZCLWBeJGBmZVpYcHgKej5Ve3o3ampNTGhGMlh4Ml91Vms8QD9wVGpgKmduamJiQzx8NFBOVj5L ZmEkWkRReFl5YXtZITc8YTAqNzgxWmRVCnpaNFNOO2YhPndrNlNkUl54TjgldU1RPEElIVk7SU43 eipqPGZDeHU7MComOChnRShUWGtOZDdHdlh9QEtKJW9EXgp6bFBlazFvej9HdXtsWnRBM1hwcyt2 ISFaKVRsdiZMaklAY1ZJeGtFbmBpPD4rdEVpNiE5dWNYPyZxcD9SViZCI0cKejQ4M3NzViNxfW5E ZkhmN2UqQkw2XkRaWm85TEhZNUIpRGVNYlo2VSllUzIhKCZIZVlyUnV3a0VoXkdEfDtkdEMwCno3 WiU9MTN6bTRue0NPODItPlM2KGNDYH5wUUMyS2VSeTl7SmxITFhueXkxdFdMayNXI0tSPjx6UTE4 LSRyNWo2agp6bGhVWHh1ZDQpdCZkNTw4NGplI1crTmR9WXhZPyUodTNoaWtjQX42YWcjYCZZZU5D P1VhVUM4VnNsWCUzc2JzQDkKelp4VTUrQj0+dmZmXm9Dakk7QjVsN29SNUpgMHU/R09Zan1tcitj JTwjJkozfEtHdFQobmtGUlFYVEJQeng9REx+CnprbFckSWh7bGVZRjFhajcpXilrWDwlQEhCRWVG OTImV2hMSzdmWjJxWm16VCFkJkJaXjVfV1RJTmwzUzctfUYlegp6Y1F7NitRR097QEhuLXMjbklI M21iJUFkJVNUMztAPm1FSX5ZLUlYeyZsLUYqX09UUTFEWlV1PG02dHgjMnIkbHEKemk8dVM1VX04 cHlZeUVKe1IpdkhXYG51PispKU15TWJjOVU9NGpiIShVNntEWEd3R1dtUWNMMDZtVEclUkpJPVJr CnpJdTBeZXNBJlFnSjJ6U2pibGBwTipLUT1AKVl2eWlXRyF3Wj5QPzYzamBza1d5VlBHWGdWQ1BZ QDstdHMpY0JUdQp6ejUlSzhRaVBzMThQM2xBZ0NeVXc0fEdUNFdIOVh1dj19UWNhOVBwcFZZXk4y SkRPKkhIVEw3cVhEU1MrbjM4M0oKenRSdWBSUF5hTkVMRlk0WEs/Mm1CVDBVZjhIVVkrUyoxRGRS MmYwOG5kbTRMZUsyUnYtYGxiNXxBQ0BNbHw5e1okCnpjUWZYSXd0fmB7eE5XeEZFWjc/fXYrYipD OXMrKVVoJnA8K0w5PVFzeDx+bGZgNH1OPjI9aUErVE56M2ZAezNaXwp6PW52NkJHYXNCTG1OM3tu dEN0cCNkSEBkVmw3NGVNSUc1JEJlMDElJiRFMz1eT0Fhc3hrZHx6S2c2WCElTTgpOEoKem9RUnxv LS1BI0RTUXwzP0N2QWEkRnEmdS01TVFaKjxefmkleD0keGNMaklefUl2a2FPUih7eS0zVVNhLWhJ bk55CnpgandnLSh9LXxpdyRhPWdfK1h+Qz50SkVOVHhOWnxoVnpKR0dHZ0F2TUV2MzgqI2UpX2BX R2RWcXl5SDZKQX05TAp6anZkOz1IbUNUM3Y4dDFpb1V0bHlPQGh8M0p9TTI4fDRrZzBDUip+e3l8 Qz4yVHxhVClGU3lJQGBeZnJaWDw9MzMKemc8OGRqO04lO2dHVi1oKmdWYTclYTgmUFJOPDBCVD9N fStCYikjPl9FZ3kjI09EdXcpN3F+NDc4TlklKmRaYShsCnprIWZaYSRrcURkUTx3Qn07SHtyMUpw MylteWhPT187Sm58ajd1UDZtYlhUO2xCb1M9bURxJVoldzFmPUBJTWhtfAp6cU5mNWh5K1A9RTtK Z1k3WDVRU0t4ek4xPkNkbU5EJTR7Y3hoTFE3VnxMYnBmSzVuWH17Ri11ekYpfjxTaHw1Ql4Kekw/ QTMmIUYwfkZaa21pSV55WHFPSHtubUNQbTxmOEdIV1hoXn12NSFGYXx2X0RyQCp0aV9pbGFpNTRU PVJBdGs+CnpQKUFQc1IyY0NGNTE2cWBqcHk7XyV8e2RGMTJoJipnQGgmRmR0fmZuPV9hfF9KSFZj eGNGO3YoZitQLVhXMj9PfQp6VnFtfEE7M18zJmM5IWJ1RjhpM1RuaEdDeG1MPlYzS0VVVlU+S1l5 P2NePytBKXhQalpvS2U/TzFVeHtxYGBzPH0KekIqSlQqYVYrfWpvQFI0NE5OcUEqYDR3RTxsKClU JjcrITdkJTh+UEpUTUhNUzAtZUxYO0Fva3krTT02X0d0cD4yCnpqUmtHQ2t8a31uKmZCaT92ekFo e0YhYTNFUWpzZyM0JDtKe0RRfChGIXd6eDR4LWBtPzFjVj1DaXxqbDgmLXE7cwp6VjdPY0RNNTJz NjxaTUxYPHFgQFFOamlzZGQyWl92cU5lRF5LeSRYZ2MoKklrQV5PPTF6dW1YdnBTKGQ1ZFZoTi0K ej5JMmFBSitDUVZ7bEV6QENhREBNP3JeQ0hXWjJGaURYXkdQaSN0NFlLezYxY04qJGJvQzY3KC10 YCNxP18yd2lFCnpycShhYVUtRDdzU2J3Z0d2X1M4Z0dCTnY8MSZjJllzbHxjTTQqSGZPVCZDVDUr JX5OUSh9UGVBPnp1eSl6fWpTZAp6byV3b1YpPzhjKEdRfDE/UDsoTVdoanpMUmZ9UUJFSHBaKCZK YzJ2WEVHTS0mVEhgSmE/aTg9c2pOVmBOUSpEQ1IKeiZETnw0ZF9FeClCe2VlRFlBUSoyOXl6PG1a RzA0YnRSdnJTZ3M7SjYoVkZ8cE5+PisrJFRFQkJDYkF+UHh4e19ICnpXM1RsenhjUG8+Nk1OTk4z RGIrJE54UCpyRVpLa25LKGwwdzwpa0ZGS3Mya1VWbX0/VlA3S3dvTGA8YipMeGY2Kwp6X1BsJF4l d2NzMXdsVCVOTnU/bThCMHYkN0g9Qzc5Z1poYmJjSjkzX1coYG1iJkNNeFhDc0I4cWtkMG5jK2dT P1gKenVQSiZTOXwkViY+fW4kMUFDUFMmYGs/PERIVXMwKTNHMihyKCRYWGokPG9FPCY7czwlYDN2 OW5HdzQtYStyPGZzCnpeKDJkYi1EWjZ5ezN5QWAyPHtlJSZ3fGZrVjFedFpmblN5bT1afkJJPVhi LUo1JnN6TCpjLW9seHQ9WVozeTNPfQp6VDJ+fm9HIUojfT90PEB3ZHZsRUMhNyplRFN2IyQyPEow YWw5cH5oWlJvSl5RSCY/Z1J3OS05SyRMMFFzQSluJk0KekZ3QyoyKj8+RzEleUxVajhNYDJBO1N5 ZWtgVSU9PnE2TW1oOyp5JU8xanBKNldeMTMydk0kNWZXKDN4VUpCK1cpCnp2cE8kM1R9VW0xSHJk UX40UWRebjZFOT5zaHk8Tnx7dUhld0JIZ1p+bER+MWhQWTZrQGBIUnk/UkJrWmNvP0g1fgp6I0pL aSlVKH0kbGA3NVQxbi1YQGl3PXpkZig/MDY3dHRDRmJtbEQtWTwmQnkpT2soR2BBMHY7dT9aNkgk Y3J2VTAKej1QUUJObUhgY3olNj9uK0VeSnckQUQxfU4kSGQtJWNsPEdJRmJkUWhAd1Z2a3w2NkpV Y0hjXntQfFdkRChRITh7CnpaIUZodGshPCFXS1h4KWIteCV1WUFtVXttLWViODBzYVNZeClJWDdJ TE9sXklDQU9gcCl7Mmp1aGEpQyZOO1ReNQp6ITgrQiF5MXVmY3U+Q3Q8ZTJsLWwhSD9zMDhYb15w bzxBemotX0hOc24+NmhJIUxVP0NeNDBnMjJKKGZoU3FfUXsKeipFKn5QJVhmYD4/T2RuMT1tSihf e1lgPSRveDRBNll1Pk5pcntIZT81JWo3PCpTRFBRc2ska2g/YCteQTxBZzZjCnpmZmw8I1p4eGFm O35RezVRblptXnE5QXRoYXBwe293WU1GOWRAJVhWZE9KX0xSYCs8YT9mU1VyXmwxcytoR0ckLQp6 bkp3dDd1fDNkTTRxezhgV1U/eyVUbGUmVUoteHYqbylhdjNuLWc/am18T0FgU2p9JGVSN3NYSHJi Myg8KT5nbkgKelk1Ymp+X0VHO0JEfTM3KE45aTlaRUh+T344MmNVJVo2MCV+NmJBXk54NE00UVo/ OX01YG5RTCNvSj89aDRAJC0zCnotfjVIX3VyRSsoRUNKPmpDbjUpY0pVb1V4Mm97X3ZMN2Ftc0tp PUhQZGpNUCY1bElocFNAPjlUZnB1ZnJ7fDZBcQp6KHw4cndWQm8/blEtMHRHejVDTCMlTEckJmJR XysraVpJKFBNcjh+R1BLP15vZXtCfkhtQWAjQFlnLS1KI3xNME8KejgrIX5KJE90XzR0VlFURkRL RDxDUyRiJHBSKU8qJUF2UEx6dTNLdkRxa3ZtKC0jViRuU1VNLW9TUyUtLSNWe1glCnpWNXleTmYx d2wtTXg5PVU/VX1vXjlKS2U+WT1QIWJ6a1Budzw9P3UtMTFfQFAkeHx0XkgtPU9GRUpfcUNyeVot KAp6N2JAaGAqQnMwSWtFQWdLaWJhOU07Y24wcVkwKlphO3hQaEN3TzZIOUY+R1UhWXtTZ0EhKHtG NSM7OE4jWE5+QWIKemQ2VmdyS0ltNER3bUVYTEt2QV9ZRGUpMU11b1N0bjZgPiYra2s8MyFad2RR UCl9KzQrb0RSTkZkd284alhvMm9wCnp6bldKVmt9I2JxP0JPWmZJdD5VP0x3RzJvT0tqPndNPkxD fSNiTT1BUEhqWXtUfDtkezhpPHw5WXhLakFuMnJtIwp6dnhuR1ctS0cwfjVGUjYwdEJKd3Jvc31g RkwpJSluSkAxU0Y8R0ZNWSllMWJtZCRPfW8jRGp6aCtqeCNQP2JSNUcKelAlc3RTbGIqS2YoYip2 PTl1MiRJKVdxMFRHfXpsJnc4Tnx9eX40UFBiUzQ9Z2IjcUJDKDZ+dnRqWExwbGMxdGcyCnpIc3lQ OUhHc2t3WkpCN1JHa0lJUEB1bUwkN0szdD9PMiZaQmNpVVkpTDA5am4+RzI+XnY2TF9zJUYjbl85 ST4lNAp6S2pgTG5LTjF5bWVaSShrMnU4Qyk3dlp2I1JgXzVWWkg7b0hGbkBLd1Z9dX54Uyh6RFh2 OXYmLSMtUj9Ud3RHMzcKelVvNVZ1MitNYGsxd29mZD5xfT5USTNie3s3P3Q+d240ajFvX1JMJTtQ MEstQk19cXh8RnxUSCkpXnR0Sl4wKkR0Cno/MTd6UXQtZUBSZXNoZUt2JW5ZYnBUX0c+YG8xS3Fi JFNYc3lDTyhCamJjdlZMfHtDWDhRYU05bD5Sd1BuPVdlYwp6Qjc0QjluUmMkdHVIK2lPUmxDM3Ra cWA8e2x0bSFrN2o0TFA7XldxUmM1c15QTV5VPDRaLSptczUzRW9gYVdHbVgKek0rIzQ9M3U3SUIx X1AmWEolUVVQXlpBKmVQS0pFZk8kVT95U3FXK29wYDk8XzJUc2x4Yz0mfG0kQ0l5V1g0cWl6Cnpr Tnx8cUVaYjlII1l3Km9WSFlTMD96S1FTYGw7fF45I01nbXc9QC0wVjl6biVvZHEpZkJ2ckR7Vz4l Qmx5UjlKbQp6UlV9OGRwUyRgT09PR1JvVmNhI0c3Uj9KMkx8WCVXeGQ9cT9tNz5PMj5mJWNzPTg+ Iy0rNnhvaCZ0WG9qe0U2NEsKem4yfU4wZjh5cz1aeDVuSmZVK0ZIQHdUZ2pHTkptZUI/em5pSyVi VTh4T2NPPzVMWGA/e05BdXNUKEJoWGA2UTx9CnpkKztoQktYfVgoTmhuSSZxalkyV21ORlBXdmNx fSVQcH05JEQldGFMP1UyO3VSNnFzRmo1UnBLMkc5eElQNkJJUwp6JEhsZ0EtKyZxY05eZ19fZUIk ZjQyaVVhdVVGLTV4U3t5ZGs+OCFuZT9Zbj9XU0Byek90R3dzKUU+LWZlRUAzPjsKemB9NjhwOTw1 aXtMS0A3QUd3TmheOSRaWFo3fXMkMyRlbHg4RHtsfl4qTURidGV9fjY3M0ZkSUtgNU5mVlhCYXBY CnpwKWcmME85YyQ9OEQ8IWhgZ340aDlQcDcybW85SDNhPy1geV4/bip4ZT9MWitJfCNIe1c5VW4o eVJ6d05OdjE9KQp6OzVnPXFHS1oyX0hqaDh1YlIyPEZkbTV0O1dhMiZPdFh7bDlYTHlWWVVkKDE+ YXxHVyE5TCtyYEghVG0mTylKbXUKekJUY2MjVn5Oa09WeVd+X0A4S2twNllzUj9ZfGZhJjdnKiNY TyZwSzQ1KHRhPT01NSk4S2c7bXQoS35gK0BgVDEwCnorSlUlbFchfXo8YFZeOTN5OXRHYDwrQyRl Qmt9QGB6IyNWR0doeExeMCtPdlIzMzhHIWlKRmFZMXNAJHdfcH0ofQp6P0ZoTU0rIzRWbyh9Zk90 N1Z1bitCYHxFTjdJQkEpU0gte2NNMTk2QWZgOEc7aTtZPCsyK2BBRW19REBnWWt6UCMKejd5WWlq O005KkM+ZjZUYD5iRUo3KnFUSChNdWV8VjwrRTspKTFFflBjYFltS0A4UEhLSUktcEE8VjtvJDI3 LT9ECnpGSjI5V15xTXclVzU0NWpMTTcrMjtGRX5Zd2p9fG5ERFV0R3VuKz5nNDYhZndnVDBJfDlk eSVoaTIoMWR7YE9DaQp6VmJtb2pTR0w3bilVdXpBJjxxbTBKeiFVY1pfYChsZ0ZhIThFWlZzfTVB e2NqbyhtM29LTGpYcEBQZGBiPEBfKFoKem9kUTBzWFhrN3Y5YTVqN08hcDtUZlJFeFgjT04lXk9k RUBLMUMhVmAtQFhmYXVOejtxTGt4VExiPHB3IytvdT15CnpZOyZUUmA8ZCtMbH1vOExoaEcqTGg7 e0hHQyNjS3hNWEZOVG59WjZtViNldGAjVXdXcmY0RU4leWVzMjwkNTRecAp6Qi16Yzl4T09AJmtV Uld4NWdvMT8yJElzezFYJW97elFaUlRpSXJ4IyM0bWMpRnpzM2VvYFd3VzxrRz1GQE80cXsKeipX KmhoTiZBN2FMZjdKMjA+QHhESVl2ViFkfnhsITwzdHxUJHUjKFNvODFkNWd7RjdXK3IxPWltU0le dD1TP1RxCnohNmhKZ0IrZmtDS0tKe2RYR2V1bCNpVHVIckY0QTI/UVc0I09eSFdvaW4qKFplZ0NL TnpLckxCREltU0s+JClEOQp6TFdePFBsSH1rSG1KeGZwaVNVc3FOJHNKWjx5bUVGST5AbT0oRW04 JHZtd2tsaSREK2FFbVRwKHRleG5uRmxxZkAKempRYTtZMWtmaWh6azQ2e3tBcjJrVlZlOXE1QDQp ZzZ1VE4lOThMLVEtblg1fHZGazlQfDI5UEVuM0E9YStPPnhvCno1NElgcEhyKlE9UXpna1M1c1Y2 bEtFRktqX2UzJDNnUE9UZGBhcmFCZnJ+YyRZdTd0UmcpflF3eSF6VXMoQi0jKwp6MEkkdSEkS3k7 MU5jdk9ZUVhAIUZhYmdaRkRmKEIjSGhBJHtsSytTKjVyUlY1UGtPSzxEYzlIUG53dGp4bT9xTCoK elNKOF94c05+WnhZUCo/ekk4bERoaH1WXzVxMzFlTkVeZmxDbkwhTXc4YyhFTXd4eTVHPnJtOD9Z bGNHPnZEM1VXCnp2WlJ4S2xTfG48NGFPNFJAZkBWVndwelAxYHtDa0JsP0d0elNBZE8jR0tIWDVG Vn1xQjFKWUlSLUpZMmYxVzh3RQp6T0dHckJsPk50dTAjJkkpRShLZ0hJI2tLLWd5JUd2THshSjRs NzImfnd3a3lrZk5Mc1p6NihGYnBzU2Y4eTtRQ2AKelVNN3xGZHl7dExoe0I/bW1qaCooU3FobThx bTVRQEJfdEl9SWE+UXYjaS1PdiZfU2UxaGxLUCpqX05kJjsxOThpCnpZNU5WJWtANVB5cG1SUFE3 UCRhLXE3RFZCM0ckQ3xQVm5rMzApemUrNkhiJCNMN1N6ITwheW4rRTYxWHU0PnczQgp6ZGcwQmk8 YWg/WnY/QXckS3FESzgzP3k9PU57RHlmQntOP3JfNG5pU3R6YGJsbHV5aFE4IXFXSk8jT3RLRzRt XmQKeipFWDY1QTJqMHoyKTZzNXpjVWU1b3hIZF5NQClgZnNGbX1gVkMmQmVJWUB0NFo/RWpFWWBW JjgzO3QyfGBje0Q8CnojQjdUSGVzUm5wQ3VINyljUUxNXlFkP3k3QTk3ZUZ5K1k0MyswTUtGO3kt fVRoQm5qSlNfPmFCQDxlcmxndEd6KQp6T0xIelJydXVPOGdZUytTUmBVTjM+Wkx7NmR3cGdDdk0m S1g+KjFzPHkhWSNpdUE8KzF3Uk9eeVhJdUFQYHU9NzgKejxXKUBtbGhEYiVDaytqe2F4VmRgcitN eFQ0UzVjKWZaZTFQVj08TlglQHE2LWdaRXhpY0deU3Z7YC1FTWMrPG1lCnp0bEdrK1JQbTE9d0dx Wlo3SkRIJldEYnB2PFVTIypnZElIQUVtN29Ld0E9ayhuP3tpcFRURnE/TUEpRW5aYndmcwp6dyo+ YUJBPmB3ZT9nNEkydXdNKTRnSEU0M24xYUEkPE5fYmVqU0hKSnIkeVkwJTNSSG8yP0M1cjRKJCNa eDZ4RiQKej0jXkdhKiZJJHJ8M2ZsbXBJeFJRMztRJXNvKzxsWWxPdVZJcCFUNlJHeHZsYDNnfjBE YjBTfTQyUEleVWMmQmdiCno7ajFJdGBrJW42R2xNPVI9S2VnX1JYZ0JjLUMkezNfZk42PHA3SWxM SCFvI2p6aSt1cV4wYkQ4SzhDYkBYZWVhUQp6d3V5P3wzUWN3cV9wY3M/QX1aZkRPanBUIWE0c15z d31gOV9DXnE7cU5ReXlpd0F6PSZKb3hmbUREcnp1YUdYc2oKekczU2REeGxeb29FSDxgfXspZmIt bmAlWVhXczt2OHsxIzBHKXpYdXRwPHFUVWYqUXVoLX59RCR3ZU84WGkwcX5jCnpJd3x5eU5zUitO KnhwKUB4YH1BSik4Qkh2Mmw2fWl1THQtbER9Xz5hJE4jK2tJeUhAMmwoQG48eGtkPFlJPjt0Qwp6 UShXQ0Q5WWIrN1UlNnNnJCgyZXFtMjM7JVV7NUBrcmVXKkwqWUVaWmgmajV3P2VkPXhZd014OVZo QT5OcHxJUkEKelJFTH0jWmZoTV5NfFYwNElkWGR4aFcoVChfNXVYc0U8WTFKNkFLZm9TKnJPc0RK JWM8OVdfd05jM1BWa2E7ZEEqCnpZJHp+KTI0Izk0VzhmJTZqYkkxe1h+eE5IZ3xGU3FxdC1POUR0 Uzg5LW9+eEllb3toOXpaaHIxZTw0V0lRJXdNIwp6QDNKVkIlRXYxZTgxXmZwbU1OfVJQdHVKWHJF UU9oViRjSnR5JElNZGtZSCgjcGYzcyEwO0x4ZXg4T0BEZ05mUE0KeiVldWx6Vkd5XmR3czR+Vns0 OU94Y2tiQUgtNFJYejMrdypUTHFqNlAxcnxMdEN8WVdiNyp1aURNMjhiJnpNZURICnprZH55aWEh MXk4Wk1VKElANFp+aCswXmF7ZStpUytGKzk8VyZWPzc+KShVMnh8Q1FzVzRaeFB4RU9hJVdOVGVq ZQp6I0JFaUVjY0I7cXZfR2g3UHlIb3tscX5wdzM+SUFycE82TDYmKGxseDNIcT1HWGRsI3E+R1RM NzQ4T0xJXjlWPFcKektaUntqN0B1YEorIWA9Qzc+bDUxMlYhM3RVZlUmZjA0KEZYdHpQc2g8RnRK fiMlTGVvWjI/SEhEdk5xITJ2KkgqCnpVUDh3I0pobDRrQkszOU5xZ3lVJnc9eV5lYDJSPGJUZFM/ cll3JHM/UUZXNnl6bnw4ZCFpMmEtTDVGRiRUbChGewp6dDYpNnN0bXtFUyRAKCg9aX1VbXV7Jjkl JV45SkJadWcwaz9xU281aU5abHFnSEh4Tit7d2Q3eXNEJmk0ZUhgYGAKejd1V1Q7UW5ib31uQXJC bUAhbnBrKDFvOVNrPTk5SEk7I2FudnBrPyt3RjUwaytjbmsmLTVRWntiU18mcT4pMnotCnoyZD1N O2BqKjF5Ujw+RD9yVUYqJSYjVzRgSiYqVHh5fU5jP1Y0aFlGZk1CI1h5JTRZJDU+ZStTSzJteTh2 R2RKJgp6KW5HcEIhI00/cypARW8kaVJGPDhGVEVgTSEhWGBTWXcpOV8qXykhfUBlMFlLV2dvMilj MXR6cShrfXhzSHBKO0MKejxnKzhHe0JtMTY+PShjRnp4ODZCK0orU08qSj9edU5uQTNRSlU8Xz50 WTVMeC07LUNkbHRRQ2VsZzVra0FfO1RQCno0JTw0YE03SGJkdk5EV2h6cipEPkh5TyVRelQpPjU2 MHI4fjJQWGlWTFJ3IyVUI2dLIVBqdXApPHVeVXJRZFNnTAp6Z1dgIVBsUGpqNXRkcW1EZ0ljV0c2 PCZaamp7fTM8NGAhSloxNlM5Nll3K2RgWTB0KylIdjZYQil3LXdaR2MmKGsKemVHKzgjUEYhUzcj cnR7T2N6fllWek9xblEpKFcxJDdgdHF7M0B5fGUxOWlxditYMW58KjdEVGp3dk5RSUJ2V3RXCno0 IV4qQTN5MTNJK2libFlEY0cwYj17UnUqJTNvelFGcTVBRThGS0pDO1hDQDZXd14hbWlgRH1Ceipu bnJGWXRhTwp6QXRwV05wMkR1OzJfZCVmdyh3THdSdyFjanUmdHtNejNYNDNtbjhURVYtM3dzKVZS aEAkanRXMDRiITtDbW80UmwKek1BbEE+IVAoQnRAPV58Mm9RWiZnWFNzKH42c35EYE09U0UyLUdR SnRBVn5eX1BZbUYwJkBhWjZCJlNzMS1yQzh9Cnp0ZlhNOypkYmx8UntMdj5ONUk+SyFoblM9XkFC dz0mYyMoZT1nalV7R3BDIUEpQUdOPGh+cn1UejNEQWtGZktMNAp6S1IqVHJWSkZTYSUqQG9nezJ5 Ymc2dWthUyEjMFk0YilVanQjYUAjRkd1dSVNZDNWK3N6YllPY00oQD5YZUZDPnwKenRJb3lNb3BD OT4xdytmPDE8QGpXXjUzS3d2dy1PYU83X3w0RlUkcmFqeUc8WEhoX0FZO3JDc3EwfCZJYmZpI2ZS CnpKdyp4Pj0zJEE7Q0w8ans7Mik5dj9NMVVne2o1JkdHYXpTI3EoP2gqQWh4NnZ2MERfWTUxVSlf NH1AVVZLZSFRNQp6el9MIyZrTlJqekBfNysyVCVBVktKVy1zLWhZbTVhNnYqLW9lVClnJUApeEB+ bkNFdD9pLW8hO1ZIIUg5Zj41dmUKejNoZmd0Iz9GZngzKyU+TmNRNWw9RG5OZXx1VEA3NmdhaW5T THRaQ2U4PUlfWHlKeDFTcjdmUk8mWEpFRjZYWV54Cnp4bHFGeVNtdl5wMjFQRF5kVi05JEExc04r Un5ocGtsMyR6aDhmXzIyNWl1JnZmIUshNCNCT3NVVmFrcjE/X214Ugp6JiFqaWhhbSRzPmlEIzhV M3R2M01kcW5kdm8jeyFyQkheb3w1JUQmIXBOQylOcDZSVCVRSCQmYTtXVC0lRTJnRXUKemNZbjwz JW4zNmlvYEx5QHU4ZXE3V3J9JnFCOTFPUktnZlY0JDtTdncxUVRgWUlZbHR7LXF4Ulo/X1UhbCR8 VHB3CnpjTzVNWioxayNDUk9menNsazE3XyYkNHs4MUVraz4tcnlrQVZjJFRSenFWe180U29ZYGxI SiFUZHBFKWBjfFhMOQp6UFl7VjghVnRmdnVQezlocFM4SHsmY2gzcyFtJj5EVyZfSkIzakZKaTVI MTZULSU3UFd3cThtbFY4fD5icmRHLWgKenhlQjVBUnEyZzVlfE90RntJWjZ3Sjk7dno1VmUhfUIp IylPc0xGLV5JZn1RMmp3Vml5TW9nXyh3eUc7IWolMGR6CnphdW1zYTBIXjtUbWppTXx0Vzg8SEIj WXJPeDhGWkRVUl5fOCZUdHRfbEI5aClST0E4ZGw+SjNYPngwcFFBeHV8Pwp6REoqSXhrdlN+bmg2 Qj9ZNmQ7eX1RSnUpJmlydk1sV0A/Wmh3KTcxNiFJT1h8Jl9kcTg2fntQMG9Qbyo/ZztnQVMKenlJ KlY0NDhocEQhakphbj9WeypZUypucTNaNnp3Xmc1fUJvej82MSF0fnVHMW9ZbjJgQkY8QGBVNz5M PXdCISlrCnpDMFAmcmRMfXBkOylvaih3SWteXzlAO0UzT0tIMmxNQzM7eFFaQzdfXmZtWC1nT0hm e0FSVVA9TFU9WUdXY2pfTAp6NkcjMzZhWjRFYV84SnY0JT0rLUY4eVZpeUlAZH1+TCRzPmdYSUt4 PWtHQ2o0QTt5VjNyQEEkQm1MS0ZsRyptc0EKemxrYyY5JFhsOHteaEBhS0JpaGtQRWpQSkxORl9R SzFLYilecm1hUlMlbiV7O0gxe0UyX298MkZWUUp0Qz5JU0NJCnpNdkBOY1ltOFdgdlhuZnZiO3wy ZztsIUVGMythNzMmN1NwKnRKNWw+MVpKc2BjUGVVSlRgOT5SPD9WaT0jYk8zKQp6cC1iRDZWSW9G TWVNaUIrU2xTfGoxPk9hKS1Bd30lUl5aPzJIRWRzTElNNjJDYnpzd2REfW9GfUJKPy1WYFlqWDAK ek53ek01P31LPlpNWG4xO18ybnd3X0kqWm9eZkQjLXU0ayh6I0lUQ309PFRCb0crX0B6I3lVQ1ZB e049eHN0OCRUCnp1IWxPd2A2Vk5gSmNHemB1YGcka0ZZSiQmMjdpKn1mb15zcjB7QGdHcn40dmFh MzJMeStpQ0FvZVFXJishQSVDPAp6e3s5PHQheDNjb3d9PU5qTjJQN0VVYlFrbHJWa1Q1dk9xISRR SFUxYGhvdjQ1XkF+RHtobT1GcTErXmJwb2JfQkUKek1JME9ObnktXylpbTc4NVlsSS1xMzZAT2Vu S35Ie3Rhck5LUWVuLUF4ZFF1eC18S3hmUXxCRD1AI15pfDcpTFVfCnpGTUc8XlI5WDJNUiFTRzdg cHp8dG5BPyhYRVUqP0JYQ3o+M3NzPkQpaGtudXY0ZkBBQHB0S092IyV4Q1pqUXBrcgp6RTUhb0xs Mlhob2dSOVZRLWJXJWxUPUwoT0w0I2ZjYEQ8IT0+WVBYVDB5a2VeWCVCTGtGQ1M1P0hHTilGPEgj RjMKeiZpRUpkQl5faXNhJkRiQiZQeWVYVDJsbkdWQT57NExHWGROQXEhblB8NXstVyFEWSRVc2FP bFY/ZmpudEBGTW1QCnpsS2d5aDVuTlpYYTg3QWgxYFFFPWB4XlJDZT9jej0ydDF7MjtFP15oazk2 X1M7R0VOel5aI25GMV5vPjBNQ3spSAp6NTZEb1VwJUF9LXxLZlpDZX0oTnN8MS1wd01+QylMJXNm MnFLS0Q9Y29xXigmQTg9fTdSPHFCUCs3djx1ZllAP3wKel9wTGYpX3NzWCE0NFVSMSowa0Q4Nm9D Ul9vfUJKTDFzM2h4REBLbSV5PmNadSM0dyU1PUhuNVpfSE1+fUBZMEo+CnpgYG4mdldfcXtyaUs1 Szhqb2hGTGtibGJRaiF1Uzw4TDx7Vm9EdUBibn5Fe1NlTXBfPTkmSjtecy1YJjxXUUVsWAp6NV9R Wk02I2B8ZmtTezk3WCQqXzswZiZaeyUyRnlMeSF1RE9oTEVVbmp+bEwkSnYlVEFjOWFrcDNgaUVO WnAtWW8Kem1MZjB1K19ZWmozQzc2Vjx2fldIJSZle1pPaDEkP1l0RStVfEtiZCpBOWklSioydmVR PF8hKCtAVCsjcSs1b2txCnpyUkcxSDlYSXdQZisxXmZGQV9VQTRjTTBEcWYmUnkhKk8oZWd3PE8o M1hhPlRMJHQ8NDRRRnY3antHclFmJHhuUQp6dUpDam5YT3E0X2ZgJCZkUGdfZUBwMFZ7I3Z9cC1a YUJzRThqa0tAIyltZkckQC19YWB4IXRhP0RBO0ZLQUZOYlgKelhWNTg/JHNGaSspUE5Ee1lXdjNR RmF0OUFoYGN1T2xNWVpHIVF3KE41KGQjeVRUKnAoJGlLYC12QyYxMSVoKjRuCnpLUTVwPmplYmxS YWpNTmliWkY1aE0zOTl8NE1eLT12cXB+MGpPKGopMnJ7SGxidEptKlh7b3x5Z0VmIz98SmNFfQp6 QUAyUUJYOEl+Mnd8OWB4Y3VsV2RtPCRHKiZiO1dAZUlPcmFzVWclSitRbC1JVjV5UEw/LWhQUSU3 bDI/RGZmMkEKemVyV1UjV2MxfmJlYmxpMWN+U29IQCRyM0R5I0M8RCRZPyNJaiNLP1N5IX5ofmco TCQlIWdMKCE0bjNwYyF7TVEqCnp4KVBLZjQ1bFMhbGxwNH5VdmYoKTJ8fVM+WCtAKDJRNlV+NCtG ITNLRk8kPSQhdUE1JGI/dCk0akI3cTV0cmpgcgp6V2ZDTUFSbyo8SjVPWF9QNWBAPlRHXldrJnU8 X0tNK3tTXnFeN1B8VDkrJCZYdm94VUdmYDRXcm1ZNXIyTCR8I2kKendefTwrbDZjN3k+X2kjVUln UnxGbElYRzsyZUNIdlRTTDZRI1dkS3RURkU3I2I1azNXZ2lZMyszP0tGUUdrT0VuCnpfPmkhYnp7 NiR2M2wmeGBVQTc/bjBmaHVwR21tPUFwSWd3XlEzQVY7d0omJCVOQUglfCFGVm03KUZBd1FyMG1m Mwp6KzwkRm9SQUZCNkhLYUZvUVQrQDUrd3Z7VSNFdloyKzd6JndLampGP3YqNWA1RmFGPyNfM0dI YE9jV3pSbmF5dHAKemxEdjslN21wQHJLVUVmOUtSYzFPI0VYS3VqVSEkUlQ+LWIlUlJraCZDOzdp dylWPElkZk8wPnVyTSRzbzdAd0BeCnpVZiFOaGNzR0N+LUN2Xm9FYHQwMHdZdExxKHBvTUJNfitx YE5DYkJQREdfUCU9RTBrcD1pVlpJZVIkazheJWRxZQp6QzAkJF8/ejUhWk0jZV9RTnZCSHtnMW9h PUxHNGNuMENYREcyezlRYkE+N0UjN140Szs/UXNxSkNQfCEyQ1F1cEsKekJgYlo9YEIzIWMzMlp6 K3UkY0UoTDMycExxXnpgcl5MSUwoSiNRSXU5cUk5NG1aO35TV2V6Xz5iYD5YbEorWVlhCnp4SFhf NCRGLWVYWCQ+OEhIMDlwMjVHNXRNSWJITEZnazR1V3kxVjtfcTQjNz1LakU/QVR2ajA9XlJEOGct JiF3RQp6LUk1P3M7Tk4hZk42SDNfb3FjY1M9KDl6fVloUlZIYUU8OTQ8S3tme2F3Q1RgWk1BUiM1 PmlsSWtaYypzKzNQVEQKejJSXzIlOVRLc0tDTzU9eT1idzhRYiN8ZzZzdH1kXlk4Ql4jWWdjakht bWJfcF5jazx9MU9BPkJOWS1zM21AYkBRCnpwOStKMUxgMXo8ZDZhP1V3TUU3IVkxcCg7bmVNaTNl OT1ebzRefSRYPHdxIVFubHI5NiR4MEozSlV4bUAwcXJWXgp6IW1iJVFRaz1rakRLd2tpeipkWGhB JmJiTjspRVpnaz1lVzF5LWtIPTspYTZ6dSg5QTxkUj59UUF2NlVHfE1FOWAKenYmRFprdERGZSRm KWohP3FucTZXU0ppVlN4IWl+SzRDeylFamEleEY2dXJGcXJ0PTczeTVRS29iUUhBckJSTmRICnpl UDR6RzEzPjk3OTFSWmIzdHB2SEFrfSMhWmBPMGQkYjZeYiZjRT0yPjcqdUFKfmxNNGpEP2A1QDxa T1lhNFdmfQp6VV96JXVedkQ9TDJHaCReYHxyTHJXb2VFYEVCZncqTFZzflZIM1huMG9PMWlCckZ+ TXM7VFNsPTg0cm82bVdFeX4Kemd9QW1VPj1TYVU5NTE5UGg4U3JWdmtoNGFTdWdQZCVOXmlgYTlL aTZFd2JAfHFTJjhedkZ+KzhTYDNwbT93dVpCCnpaMD5zfENtJF5gVWd0VCN8ODs7Ql49aC0zMyZg fGs5YTkpRkVQamQmeTZoTnc7I1l7KjROc3c3bz5HZjNISCk7fgp6ci1DNnBOWENBNmY7Sm03WmBn cFgjfjlhOW8jeHZjP2dzMldSSTJTbT1LczNYX3hjNDtoKTBMeSstJjNtdmBnM2AKekVjdWA+NkdV WmhRSXFjbGZYMDBlZ2d4NkxBXztHd2M2eFFZMXA5QmM/dTBOcXF0TjxyQmU8Q0goYDZ5TDd3Qmpz CnpJOUdKYVJoTlhDc2pzb0N2YFRadHB7VCREZDVYJVBGWGcyeit8QHApS0JKTW9tWmdUYllkIz5J JU5kKUEhZWRLUgp6UF9qaHp5YWRJazIrR141Jk54ZTkmdXw5YFZBNFRQOy1QOEF1eUEreTJhWmll S2pZM2kqfTxvblZwYXlTPExGbHsKelliVVU5P09WZz9YRVBSYHteJEBKejcxRH5oa3MjdjR5M3U+ dUZWYnBVN09SdGFzbGA1KEN8ZHEpaUlWUzl2O3hMCnplbFdVMHhOPHB8fEc9SjxrajF6fGlgeyt7 dG9LckhQJGM7IUMkZHh9SW1nSzs2UiR9M2hxaFcxXy1ubWlXWnRFewp6Tn1gMFNUT3Y8NGokMmtS WH1yZzc/Rnh4KVdXT3A+MDQjNzIlOGgkZiVpTCFfP1NrJkoyc1ZpPE5nUTl+ODA1UmoKeitBREkq VFJLZTwzOVgtQmc5TERMZTBJeGBXYldONW0wRi10Y3JPQUNeanhldT41Kk9sZjJqe2Q9MF94d2l8 OyskCnpUNTQwciFVeFk5JilmfU5sP15zLUMpe0VjUnY9VWk2ck5vfGNINjEtQWBOUm4mUE92OzV0 RlE+OFdycjhhIWBhYAp6VF5UWFV4aTAwMSo8YDJJcTlDQEM0dSF7P2hHYEVpIUJ2WVhOQHAoU3sq XmxQSXF3Jjh7TyU4bWQ9aDtWPkBoQloKekUoO1FEWER3dXs7dldRWGQtUzFgalZFYSo0PX0tKVNw SVdHI154Ym9hR2Vvbl5xI31JJWJ+JCt4cysxMm5UVSYxCnpePWhKKi0oVkQ5YDN2Q1RSbEJxNyhJ a35vc09qMS1EcWx+V1ZtMXY1eV9odyFfRmdJczBKaGdJRHJQTVFeIz5kTgp6RnxmNn5XKUJ2cG08 aWwtTio/ZkhlcmIpfiFOYF55Y1BeZ05pc35xPSRkZTtmeDs/O1FaS3V3QWZxQFZyYkVUfVgKekg8 Z1JuK1pjQUA3d1VULWJIZXl6ZztlfiolN29JZ0lRO2Q3VTA3YzE8RXAoPHtXTzxQdWFednIjY0Rx MjcrVDZRCnpvVDE4dVBoeyhiRDxaYllfWFVJJkgzbikoZjhlPXIoNFBleHFoe05RZGIzWCQraTQr ZShuJik1Si1sIT5zX2AxPAp6b2kqMD1SRn00Yz1vaXJEYCRASlVWentzLXxKVHBBclVwdWFIbyMj NVMzXyZiZWI7K2B6MT13ZDI/Vkc2dFpaRysKelhaN2g+QVg8cSlvOCM3VUtRRUY1ZH0jR09RUVFR NTtYeSE5MTFUaXpIZmQoMmYrbz0xN0w/ZXZTMW47PzFWSEM4Cnp6NjtHUHJLUWR0TVE7RmQpJCV1 ZmMzd3g3S1h1TjswWmVlPk5Icik2bnY9b3hVUXppRDQxdzxCdyZ6PUdsJnNHRAp6Vkw8PjZPUGN7 V15jR1ZVPDZiNzw2UDZmOXt9N05FRWtPbU1fIWoyU3NUUmMrTkYwfn1RWV9sMlVAOyhgUjUkK0IK elNzPzAhcjUqMFlaS3IzakRFZW1qS0NJTH0oUG44WUJ7MGZrM2ZjWFNwSzxmNXVkVjkxckU0fm5z cCV+bXtgeGo/CnpIfTtUXiQwO05Ze2BqJWhsQWFKKDZOb2FVZjdVRDN1KEl8TDFNdENWQyVLRT9C V1c1ZWxDfWVQKHxBczFtSGMydAp6ZnpZSU17PXJNcEt5Q1dCVT1KTilLPylCY3NTKzA8aDY2MmJu RnpZTittLTFHJEhiV294OzA7cnA5bm5zSkh4K0kKenElcWYtPyp6RnxRKkd6Qmg3bEdDcVFzaiFt XjRsMHRBRHI7TTg3akM3MyNneWk5KX16Wnc+MjdFak9EPXVAYCl8CnoqYD4wQWl6OXQ3OSRyYDM5 O1NXcHhjflF9VXo+RStXXmE0V0UoSkMlK28mUVRrfmRDcXZmWDAzPiNMUUByQlV9WQp6ZDhacjI3 M0QpXl45Z0JBNCFIVVVMc3cyK2trMzshQ09WKF5SYlJ3aFJ3KyktOSFyc3Z6cGlXNXttRz0xJlF7 KXkKelhCfFY9ZE5sMiVyUz0+Ji19SlNZUnlQWl8rTCg9bzNpTzRXeyN7eXxnKHdSJj9ldW5MbHZM T0pxST0wYzcqekdCCnolO2kwRktKPmFHZ0VNVjVOckQkdTl2T1poNUUlV1NUQHZAKWJWaClyO0F+ fj5jZHJiMktvNEt8SUduWThyemNMXgp6WW4hM3h2bGtaP09VLV4hUHJGbikqQFE1eW5VJnRCbUU9 MGh3X3d2U0U8U2lZNlVtTVdkKCZRbSQ1N148c143Q2YKek47KSZebFgpWXk3PTxaYkNVRFlpIVI1 Unl8NllkUmkwQ1BtUWx9PzNxZlBlS3pyTSRwNUUoQG4obG5SKGJsQks7Cnpsby0xPGRkVkEoXmJ3 PnxiKEBWOVhQazB7UncpYDthIWJBPXJ2ejdkMFRnYHZLIVJNQHlXQShkXndWcmxEQVQhYQp6dUNw XzNkUXhkTkl+by1YMzhRITQhfCsqYENPRFFsOzcpalo3QE0kRUQhbWx0YzdAaDIyUXhEdE90MShz RXoxZ2gKem97YWhWcTRsVjdqYkNCK3lzIXBkdGQ9QFNpKWZkVUFpSH5seDNoJFkxJmgoZ1N4SDt9 QF9GMkFjfnp+YkFicEgqCnp1TjZkXz5XJXNhMztwVERsMHkmdTJeZjwwKkZyd1JYJVNEcmUrRDk9 Yn1CTmRMUH5DXzc4eFQ4RElzX3NGQ2pIUQp6UXRZWH5Fe0ZLb1YxTnJxWnxFODh7VCM3NiZZamFa S2FUcHU/NT18WShDX0EmUEtHWFhqU2VuMDJNNCtyKCVncWQKekxCYEF2MTd7SFo8dnNVc1YwKVk3 SWMqbUstJVE5cDBHdXNIbn5hTy01YnMjVzM8Qk53cz9WTSsyVFNNZXR9OVEkCnpvQz5+QSRxZyZx KUxQfkwpeFgpQlAxJGpSeTlVYzdffi1EUnJVPW9rSUtoVmdoJnNmeU9sMEslYkhyTCVSWE4xbwp6 eTJTdTJJeV98JkctVEdOQzxacW9laCZzd0stY2ItXk5CJUV2Z0hzcEQ1Y2F4OW1HLTUrfGtSPVYq I2A2dV5NNGoKekEqK0E3WiU4bm1nVTdfMT9oYE4kbVlRTjBaT0pGU2koOVliRFgmb1E0NXBvUkAr WGdodzRIYVZ3YEk7N3Y8NDtxCnpUamhqMWhMKjIqK15jOCQte2YjWF5sX2ZSVDlBVEJUZG8rbCR+ bH1Qekl6JSl2Xmhsezl5K0RgU0pKUUVme1FYJgp6bGN7IWxiWk9XXipBMm5DJSpxQmwkNz8lWWlF KE17ITB5PkFEP3lJVT1GRklfTWliRGtnTDRPST1Fcj5KS0s7amsKelBjLUk8SG5mbyMjYn1QUW5r OU8ydmdLMkJ1bktiTDRRdkQkcFdVPyVkQWVUYV9lV3J5eHVvRU83WnE4KyZ3cW1pCno4PXYwM0RP QX4wQnlEdT81ZUlXXjljKnlTZjVhRH1XK2lOTnohQHQ5SHNGYlZTPi1Jazt2X0o3ditQPkFPYFF7 eAp6PnByPzYlejNGck1taWRfUU0lUTBfJGFYK28pMHxCUil4QVIlV2U2cVA/eHMjNjVqT3d3SUV3 bEgoZ34mPWMoWnMKeiQ8OFA/VDRwPDZSZ0tKeEEpSDh8I3hmNHZTUWI2VUo5fEZudWNRYGEyc1h8 UV5zfXtmZHc2X0MyP3FWaUtse0NUCno/Umk/bWFaNi0kamNpeyZYPFRxODJJY3dwSz57NHAzMyt1 TXJVSz1TOEtVJno/OTRmISgkP0h8cl9LZzhiLSZHVAp6S30+RTZJcnBqVSRBWXpnJUooTnNlRDFx IUUpNm5aT05FbV5MTnh2RnRFQkFNVGBSK2NUbSlgTj5RZDh3MTRieFAKenBqZDZGbENjPGc3dGBY b2gweXczS2kqcntrS3cpZSRYbjEoaUxqJThtMjM2V1BFKStxbVBFNUQ8YU8+Q0ImUjZRCnpNMkVT UWE4enBqRU8pbXF8SWRoSmB8T1g0bHhZKGJSYlBWaDE/fC0qLXx2V2NnQCFrSGhfXjVOe0BnYyEk Tl5KMAp6QHtyWElvVDFjVHJ7QzVTa3A5PVclYkEhVSZjQUBId30xdWgtUERrVTNpVntTTisxXz4l fDxDK3YqaT9ATT5qbWUKejRMMURldiFGTkxPKEFkKCFab1lEWCVhbDZGcndnfj0xJT1SdXUkKEx4 QmJyVGJNSlJgXmpBJCEwMkFLQik+LS11CnpLY15MNlpYJll7XjRqYVB6QDdmRC11TFBMcERNMDlz KT12O1RSQH4mPUAxZFY2YWtTYzJyRXM0QVErSm41VHEjTwp6TmZrbSg9JCs2N01IRSYrQVJxen5x P2JzT0FgcDYkLWVUeHJBYXFgUUBCUk14e1Z7alg/dyZJPGNrYSVkSkQrcCsKelcydX0rKl5NcS1o VWA3JVZgcjIzV0ZHI3tHUHdSRW59MyZ7dzdRYUBrTE1hbSlpcXQxJkZucUNlcFNzTFl3Rm9wCnpq OFAja2old0ZzUX5hNmFUOEZCI19QU1ZvU08hMEBia2Z2T1p4OHpALSl4UkZCRX0rPjZTcig8N08z YWp0ZmR0OQp6WFdmYj80SEZOTWgzV1ZZeFcjOWJgNig4OFNtNylwJjBtRWp2RSRWUmc1TTBXT1p0 QX1MKFhxRDJsbCZ0VzFzNkAKei1qIWYxX0MlaGR5MSZrVXZyK2FmVCppP1hVXmlLTnJBbENpSWte T3dxYjZzVGl4YTgqeG11bj4pMVBrRXgkZiNhCnopWj9qT0BhMj02a1QzMjdzWHxhQlRnXnFIdH5k aWx4Kj8tUnBMV0h3S1pCPl5mTHx0KXJnJE55cXBMc1c1VDwxVQp6XypjczspcmxBbm1uKURJN0Aj YUBWclJHci1UVXg+X2lVdTBjYUlFVW9NN1hOa3tgUnIkNUI/Z0JGMk5NYStSIWYKenRMRGpYcGJA cG1YRD5KYzAtfjN9MnEpeHgoX15kREh5biUpMy1UUjFrRjd0P3MrKCNnNW9qdyZCPmNsSUpMPDMk CnpvIT9LWHdQWFI+RnB8aXIoUzRZZj9PKHlfel9NNlgrR2o9d1pQWClpLXFPdE1rN2tYU3cmQTwy R1QyandNakAwIQp6U0BDM347Ry1wYFVgdHBvJnlPPXBuNl51dnJ9MEpQJlc5NUReR2NSNS1lcDlU ZGEpelh1KFkpTyopazA0UiZWJjgKekcyQG1wWmB9SWMpbzlrUGxtemFAKlA5Oz9ialM9I3Voa1dV VEl3Ynl5QkslZFd+WDBWSmZqfTdRVW99ckd4PzdGCnowbXRIQEUqfU9yWFk7eFZicENrOzNiNDc8 MFg7NFQtUmF7WHAldSNAX29QSTwzVmk8JFFjMUMjcmJAdCRKQzNVJgp6ZEgxZGdtTm1HQChFdVUy c3lvK0gpQVY2PGFFKjxOODVFM2JiNUttOXl4eX0xaWxzQHBkND90MWd4JDNAU3JrNU0KenVXS3FM KGt1LSNSSVcoT1NVdnMrMj4qMHJYZk1rWkdKRW5uJEwkaTkxdjY0XnZsPS00UVk5S2hZTDtNezk9 eGZMCnpfKztkVkRBYElVYVkmTVhPOT5mPXFRV3RvT2hXVj8qTWFlT28oJn5RUmw2PWV7IVMte01s OylxXjZ1P2hoNXd6SAp6OVh8YVhsUV9sa2p3Yi1jZT1mPTspLXJANyFWJmQ5UyUjQnhUTS1jdiZ5 YV9YNDlneCtEJTxTMDtDJWIoTzVZIXkKelltZy1wTCpqfSlsSUBfTjAyNkl4QX1wMFFJRWRUUmt9 UHZJRWZIKDhYOFRPK1klV3ApYD5WbHBhd05CQUteYFU7CnpgcnZUcWVUUis7O0Q0OWpVUmB2QEBG N2VwZmxlVnY0Kn1Ebno7Z3VmVVJNXzh4M2B1ZUFaK2o+MTZpVlNELTheMAp6YjBRS3l1K3x4Nyhx Nnwmd19ldGcwQkQ9ZjZMbEJhYT5jVDV7dVBgeD9CcXp0VGw+YzdifD59MTJkTFVsR1VuWCsKend9 Tyh0eS1+Q31nUypqa2shUW5FKUZJKHdLe3tfayk4fklwTTleT1hnJW96TlVSM2J2ZGhSbkxHOHNO V0pnR2ZSCnpfOCVsTjJINVpGeml6OEdZNlFnekgzWWU/NDM1UWBSa19afUZVJj5obUVpUXJlVUln NHtHfEcxPCRJMiVkJDl0Owp6e3FoU15LUGFDPlBnbjdmcC1pQntzans3c2tCSEhhd3tiMiVtQz8p dlYhO1Bha1h2aHZDMWlRQkJYIWp9THRxfUUKekdLLUBvNC1MQVIkSjxqMS1sKHRCTmtoWFBeJl4/ eDgyJmk3X0B8ZXooaXE5YlZiN1pDZjBJPEw+P31yZmVxNEdWCnpqPi0tOFQxYVNTKnY8M140KEVP I05Dd2B1dVU+SCFjSTxpWT9YKHFYK0EpM25pUmBFa0B2bGBUKHh3Znwte1g5KQp6MyMtY3tnS01o MFVhNiVoODZFVVpKSHJ0XnNkd0RoJEVWfCgxUTBOZ3cpQUNnWERgYzJuRnU0TjNFXnleOG4tY1oK enU5VSF8QD5SYi1LT21zOHs4bClfcnApNkZNTFE8RmZqYXAwbH59MUN4TG5MOypWYldYITxFT3hQ Xm04SkRxRXEmCnpwfWBnNS1CY3xoKW45VGU3NW1yZSVXYnpAWlJ+IW9KTnQ0R2ZzV3AzMkR0fEhx T2VaUEZqezw1cExVNn53KUZyUgp6aEUzUGtEa09iWmlVQUQ9akg8OGMtdnR+dSREMklfdFBfSUQj JUFCLWdJUDc4Jno/Z3ZAbm1VUWVqczlHLUhEaVMKekMkOCpOeVRTMmZhfkpIJFg4PE5xdSVUND1t fiF1KzNeTVN3M3l7KmxWOzItMG1eKnkjUVN2Z2xAfHlfJD9OSzZvCnpMUjhiVlZNNzx+bktQKkRm TWYkNjxYWiZKWH16Sk52WVIwckd4cndOZyt2UWlnN3hXJipJZlVqIzVgVFQwVm5SaQp6a2VBMiRO RlZsfU1yNj59KTkpbHdrZk5zIWpMNDxJTkB6MkckeEx5cj1eJlVYQFR4d1p3NXNgdVR5ZkNxdilk ZTEKelJ5ckd8d305RVhMcjBkbkh6Q0JTZ2NNTGk1aCN6WSQxaS1GYFFTWjF4XkVDLSNwdERoSlFj QjViOzdCeVZ1S3tFCno5ejlpciN0OUZrY0FXcGU4dS02RCpzXmMxdDY9YXY8NzMlfUI4UkBfLXxC c1gkPmJAKWVmP25lWEMpa0Z2VHVYcQp6UVpFSUxfM3hMUFpxeXopUnZ+RUo4fUdtdWhJI1I2JV8m OXY+JDIlb0p3NT5DdTtSQjU9M31LNjBpTHtKQ1V5QjAKel4tVTJnWnlaK1AkTmA7eF9aTEV5RGRE TFo+fUwoanF+fmIhUFoqeTNjOz96R3ZJR1lCOCF7dDtoTEZ2VnRjX3g/CnpUZ3w5KWR6SFZHXm5L KmJDTElIISRPOTs1OTxkRzMwNClCVHpGRFNEPlFTaXJqKGFBJF5zYjgmaClZQTJkQUUhdQp6IyM4 Xn47K3JYZ1EqI1BoMlhGM1pgQlk9UztxPDh6eT42RkRgZGdJP3cyKmhDTm5XJktLRXZ7VTBQOVJ6 XzFKWkAKemlqLXlOTml+KSlob3w8PjklJW12Nyk8PGVZbD5rak1QKnVlYChgZldWUVd0bDtIbE9+ Ym49S29ZTE1RJiYoS2cwCnpfIXlaaDdGZGA4QVJERm0qRE5Ha2NRYndBTUkmVnpHYmZTRk9QdDc/ Wit7LSReUDRQaUNtbyNZbUYpOSVYfT1hbwp6X1JxI1JFMD14Mip2YEIzKlhrWXpUaWBFQigtfior NERkO3Z7NFEyZjIlKTQyLXNWaUs/TG88Vjt5dkp2VUJeSncKens+PX4tQHRQOVdmNn1ASTBjV1Ej b30wfjx1I0pOSTlIeVp9X3kkKjQ7PXJBPTxIfD1Wbz52cXpNflNXNlBwd0RsCnpsdTJJblZzQSk4 RnM0TExCX19STU0+ejhnbDN2aTYlWkE/Xil+fmFZI1BtJUFYeV5CP0ZpQTRXcGReYUY+OUt9NAp6 KUdoJkpTRkZyNmE0aXVkX3daTGBeZkJHbUo4Qi00ZVNqUSYydip0b20wQzZBRC18KlZRX1pwMlYm Y0VyTVVvJUcKelQ+OW5wa2FYbVQqbjsqflFWO3U0KEI7OGVBZFlsKlEtYjhSMzc4V2I9YEg+UWFU MGBMUjJFKTd0MEJrZHVLO3ooCno8OG9LUGYwSmwxTCY9MXdLayY3fklhJnA+e3dyX2YtaV5XZHF9 NHVvV2B1enhnWlZUO08yczI1RUtwRXBeUzZ3Kgp6R31UfGpeNlM2fThUQHUjV29FPnY4QE0+VWV+ PT9UcjBAVkF2aXZ1I2M3ejJUdE9+UXpPKmdLdGxHR30pP155ZTUKeiFAZGwkTSNUcEA/KGR2dkNI fWRseThrTU9pc1ojOD0zYE4jNEtzQkxuamlHQWZHdDs8WnEjUkVrUig2dXVEVTU8CnohT2dPfis2 cXRpQ09oQz5YLSEpX3RsVGA2aG5PTXFpP29SN2ZOMGhLSWNXSVBUPVl5O3slfU5tRld1XzMpSys5 ZQp6SW0ocm51NFVpKVlUKi17c2VPKm88Ump4cDFQJV5hPHoybjtOVj17ZXROWkoyI2BSejRqVi10 MGR9M0pzJD5GXjEKemVqIVh3Sj55PEt5fktXfmM4Wmd0SjtNSFhKP3BXQz9TNWxmUWYjNUAkaXM7 V3t+SUc8Q01sRXI3UDZgRzB1KXI9CnpBYiVBJmtlN0d2S3oqQXpEUmRhMENqeTtDMkIoJnRHZDlU JDhTNVAqMkhET0YoaT1VNzhTXlVzZHdJcGUoWD9QbQp6KDVKYWJqM29SOVNraCVvOFQ4Q3IxWWtR bk9hNl92WXUkQ3pNcyMmYkBTJTRCWng+V2wpez5+UldjWEdOaigpMDcKekJtXm9ebmp0PUhPRylQ JGJHdk1qPGNqbUtaSzlhXjY9cSYkVmI9KWM+PGpsPmQqYytXV0d1UE5kRlNsNHg4K3hMCnpjcF5G aExsZG1GYkBuNj5DJShHdDduI05GKjk+KEw4PEdjP20keHFNbjZLMThOSSg2V3F0QCEzdV9oemkr dHd8ZAp6SjtUYyRJbzdRUzNvZ01XeHNIZVRUR0BSZGxARjJELXJGdE8qYSgrMWUpbnpQXz5mMGRG V1k2VF4zPiNuWj1rdXQKeilGRTtnVX1HYHNobm0xSV5nWm1BN1B0N2x0SmJxZD4zK2luKFR4N2FQ dEVGQ3FJRE4jZDwtaFo5UnRTcVpZRTBXCnpyU0cpT3ohVXpPYSY3SjBCWGt8S0p4JHJwPFRibHpV Zyh9bD9qdzVHSDVCQ2gjSDxPWklMb2RXZj9FWitwcGozRgp6YExkKnJtKS1zZ0preyVxOH53WlFK NVJiQ0hmVzMjQyotJGBtMU9xJk1rQTE4JChUIWI7RzVfXiowSk8paXA3ckcKemNSb3ltd0RgYz9L U3hmYilVcHByYW4tQ0MrdThVMDh6bXQjM1JpZXduPTdhSm9wVUdNdGsoSVd3RT9YbUxUTVB0Cnor TG9YNFByKE1QemUzaH0yJSFLVGwpfHl2KE48cDVoNFNrOCpLRzcyZ0JvcUA2K1BoPFRXeUNLTGFV SiVtNkJjYgp6KTZgO1lCSj11NVlkUC1GfDQkZX5mTHJZRi1lazwrUzlNcSo1X2pSMENpJlZ6cmBJ PDEpKCFyeHFjKnEzZldyWU0KekVxfFRYblNwXkVzdXckfT0lPlpMJkZzKXhUfm9EZjZeZX4rWElM KytwIzkpKGQ9TiFGPTZ+d1Z3X0JBeF8meFlNCnpSe0JsaShlWXYhakt2Mz9MRztHSEB9PzY/NFp8 TU01bm5PNGUwP218RmZ8cHBYTk9sYGh+MFlgOTx9ek9FIUFqKgp6OCFPY2t3ZjV+bHQxWDBqI3ta ckRRYHZtMWFgXyRzWk1lTmZiLSR+TERRWWRtNWpyTV9yJWdJXkskZFJ1NjlUSS0Kej13TyNpczxL RFlOcE0hUHVkS2k5VV8lU296bCQ4Q3xBcz1PPEUjYnJsQndWNmo4QHUqM0xNPDM2Tk0+UCN5JCFD Cnp2TUBMYjRoakFedWxDPVZpPj18Mk07akF9KT9tMFItJVJZb2ZXZShUaX4xUVI3JnYoP1hVOHMr WTtnQz9SJVdlTAp6IUw+MGFDUihRaj5NfX5kO3hUU30zeVB7OS1zKEI/QVM1Qykpanp3PHVLemxK O2k4Z1ZgX29qK3JQYHU/LTtNcDMKemdoWT5YdXoyPjlZaV9OeU45RUgmKUdpMU1GU1kwX0ZGeCFp enVVZ2J1SEFvKmFaTTI/OE5XKVk7RHZGNzswZ1BUCnopR3JPdERHRHlRYWFrRiFaNUlxWmRUckM/ eURmIT1QVVV0VT5RVj5ERlV9SmAyaVMpYlYjLVBeVSZsa3V3KWlFaAp6SnglMHpIITA3KE9nUGpr RGtVWDhhV3FIXmFfTzBgcXlidnooVClGbDlneis5NT5tOS14WHp7YXNYXiN6QHQmQiUKentSQCVe REs4YzIjWlB2cVltfTNgJkFrdThoaWlJeCY/Q2JVd3woX3xyWTBieHo0O05JYU4xZGswK1J0MjVx OH5tCnoqVmlKUXRvU0JBKXR3ZmpicyVlOSRscVQpPGVaaGJrNSQ/d19yKE9VcXlpSWhVelBiemdv Ui1GZU52XnwkQUROOAp6Q1c2OEphVD9wVnVXVmVldVRxJEIpezYyfTNNS2FAO3Q4fmRMKjxVXj1T STJHRzxLQ01CKGkmSlhmQFp6OEBATz0KelBvVHZsR2ElcipjcExjJE09eUI3YldqeFVvVnF2eW0l Wm51I0NJZFRwb1AoQnVAQDtNNXZfY3FITU5qNyhrPiZeCnphb2VMcnZBdHBMP1dFZ24qaSR5VGUh QDNVaDIlYiMrI3lKVnVgal9qbTFCZTtZSGcjZU9BcHNWSTlWWEFaUWl1Zgp6UWpHIW5yN09pVyNZ cmJxTTE2fWpPKjRmI21GaVEwZ35IeVhLbWlOSE07bz1fPjhKPjN5NTsle245VlNwMT8+TEYKemdH WiVgNmNaRnFpZDtsM1A0JmQoWn0mSH5DYjwrJCtvO0xOYTFLJDhmSDVAMkpYXlF1cSE1IzdySjR7 M3Rtd0VWCnpLMnpfOC1od2hFPThTV1RpRUhFQlcoWk1pdSZeLUNCVkd3cXpNU2pTMyhaJEtQYyhH MVNWbmFfP3s3PlBGfTh4Owp6WCVTKURMeUh3KlUmQys2M0pMZV5OXiFzeEV+dUlKVWx8JW55cmZt UT9XbDU/NlprNFp7SiE1c0hQKW1uXzteZGEKeiV5TS1OVkFFfnZwcVZONU41Vm1FMzJQbE51fjRg ZDwhNmRiRD14KmdCYW43eW9NcS17NUdgO0h5bChEKCpIRzckCno2fFJlR1EyYjE5PFVOPEZZQXlk RzFrMVBjen05Y3hZZ1QzOXR5REJgYSEpKUtkNEV+PXRzTGFgKDlBaGw+K0A2IQp6RXp9dj5AeEpJ YkNDVV5tRyF1fkkjc3stKWJ2eGg+XmpRMnJtZVJ+U2ttV1VodiMjSWNNcEhgaXd6SWtlKD9fRXMK emROTD57MkJ0Z3JeOG1KbTdKZkVnWHZXPUN3TzY4QlVmck0+PmU+ZHNURUErc1VAen4zaHJhOHln JTIkOWo8K2Q0CnprYlc7bU8qQ0p8IThhUCZkR0kyeV47N0hXVW1RRj90OE1LbzI1fElkWXlpfDFy RkRDK19gQzZsLWVXdilLMjNrKgp6Z1FhKVRuVFRAREJ1JioxMUVtV185R1NTO2g/YCMtLTxAK3M8 eVltMSFRUF8hPXp5NVJCaEBGaTgmUlVMbkE+MDEKelFeWEVKY2FCOSpuODhxfnk5JTt5akF4Oys+ JUl2cm8kTW5COXBqRGYzRGBRdkRSWjB0cyhwUWshd3didilNQmJ8CnozfkAmUDFwKWNVNyQxZmx4 SF8/TnpFRHs2WSVOcCg7cnZtaFo3QGQ8QT5GajNAUUE7Y1g1Y0MrMSteaTZIVHpjYQp6WFN4RW1J bmJvaDxoYFIhSmdSdztAZDMhPC0zSn4pMzhwVXg2dn5rMnUwUkNIeGlsZjdjO3NoM0k8Jih8NHty d1oKemIrVSUkKz9JP1ElXm0qfF4hX2h3XzR5OSZgYzhJYkhIR1RRaTs1b21uQkd0cmghNlJSYU0j V1c/aTBuJntSWHFvCnpfb2ElSndvO2dKIVleJGxtYmAmYmhxSmBIRW1MbH08MyhaVD5iI2A+YS1p UHFtX2hRWXFKQDV0P0RTIyhmNTE9Vgp6ZyRxWSVhLStrYiYxMEcqWXhucmU4TUBSNShOJjY0NSZp N1Z6aURrcjVqVC1xKzw7SSMkV2pUaCFUfkslUzM9LVoKem5jMjtlVWZWTCU7bzhBNTcxYm5SanJh aXNDUCFjejhYRjJwalkhVV9nWXZBOTVHQ0p0PX5NRE1qOzxqZz9eRzlsCnpBeGArT3UtcUshb3N0 aSg8LTZKaF8tPXJCSlIyKzE8KEw+Yi0jeWA3PDghUWxmVi04YnhWV1I9PEw3QHAqUytgZgpLWmkk dm4qdU1jantJMUxaCgpsaXRlcmFsIDAKSGNtVj9kMDAwMDEKCmRpZmYgLS1naXQgYS9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL3NjcmlwdHMvZG93bmxvYWQtZGVwZW5kZW5jaWVzLmVsIGIvcGFj a2FnZXMvY29udGV4dC1jb2xvcmluZy9zY3JpcHRzL2Rvd25sb2FkLWRlcGVuZGVuY2llcy5lbApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2YyNDNiCi0tLSAvZGV2L251bGwK KysrIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy9zY3JpcHRzL2Rvd25sb2FkLWRlcGVuZGVu Y2llcy5lbApAQCAtMCwwICsxLDQwIEBACis7OyAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0K KworOzsgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg SW5jLgorCis7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisKKzs7IFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5Cis7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0 aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKzs7IChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7IEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7 OyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4KKworKGRlZmNvbnN0IGRpcmVjdG9yeSAoZmlsZS1uYW1lLWRpcmVjdG9y eSAob3IgbG9hZC1maWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpKQorCisoZGVmdW4gcmVzb2x2 ZS1wYXRoIChwYXRoKQorICAoZXhwYW5kLWZpbGUtbmFtZSBwYXRoIGRpcmVjdG9yeSkpCisKKyhk ZWZ1biBzdHJpcC1oZWFkZXJzICgpCisgIChnb3RvLWNoYXIgMSkKKyAgKGtpbGwtcGFyYWdyYXBo IDEpIDsgVGhlIGhlYWRlcnMgYXJlIDEgcGFyYWdyYXBoLiBJIGhvcGUuCisgIChraWxsLWxpbmUp ICAgICAgICA7IEEgbGluZSBzZXBhcmF0ZXMgdGhlIGhlYWRlcnMgZnJvbSB0aGUgZmlsZSdzIGNv bnRlbnQuCisgICkKKworKGxldCAoKGZpbGVzICcoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250 ZW50LmNvbS9tb296L2pzMi1tb2RlL21hc3Rlci9qczItbW9kZS5lbCIKKyAgICAgICAgICAgICAg ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmVqZWVwL2VydC1hc3luYy5lbC9t YXN0ZXIvZXJ0LWFzeW5jLmVsIikpKQorICAobWFrZS1kaXJlY3RvcnkgKHJlc29sdmUtcGF0aCAi Li4vbGlicmFyaWVzIikgdCkKKyAgKGRvbGlzdCAoZmlsZSBmaWxlcykKKyAgICAobGV0KiAoKGJh c2VuYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKQorICAgICAgICAgICAoZGVzdGlu YXRpb24gKHJlc29sdmUtcGF0aCAoY29uY2F0ICIuLi9saWJyYXJpZXMvIiBiYXNlbmFtZSkpKSkK KyAgICAgICh3aGVuIChudWxsIChmaWxlLWV4aXN0cy1wIGRlc3RpbmF0aW9uKSkKKyAgICAgICAg KHdpdGgtY3VycmVudC1idWZmZXIgKHVybC1yZXRyaWV2ZS1zeW5jaHJvbm91c2x5IGZpbGUpCisg ICAgICAgICAgKHN0cmlwLWhlYWRlcnMpCisgICAgICAgICAgKHdyaXRlLWZpbGUgZGVzdGluYXRp b24pKSkpKSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9jb250 ZXh0LWNvbG9yaW5nLXRlc3QuZWwgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvY29u dGV4dC1jb2xvcmluZy10ZXN0LmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjYwNzg4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rl c3QvY29udGV4dC1jb2xvcmluZy10ZXN0LmVsCkBAIC0wLDAgKzEsMzc1IEBACis7OzsgdGVzdC9j b250ZXh0LWNvbG9yaW5nLXRlc3QuZWwgLS0tIFRlc3RzIGZvciBjb250ZXh0IGNvbG9yaW5nLiAt Ki0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KKworOzsgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUg IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCis7OyBUaGlzIGZpbGUgaXMgcGFydCBv ZiBHTlUgRW1hY3MuCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwg b3IKKzs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKzs7IFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor OzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUKKzs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworOzs7IENvZGU6CisK Kzs7OyBUZXN0IHJ1bm5pbmcgdXRpbGl0aWVzCisKKyhkZWZjb25zdCBjb250ZXh0LWNvbG9yaW5n LXRlc3QtcGF0aAorICAoZmlsZS1uYW1lLWRpcmVjdG9yeSAob3IgbG9hZC1maWxlLW5hbWUgYnVm ZmVyLWZpbGUtbmFtZSkpCisgICJUaGlzIGZpbGUncyBkaXJlY3RvcnkuIikKKworKGRlZnVuIGNv bnRleHQtY29sb3JpbmctdGVzdC1yZWFkLWZpbGUgKHBhdGgpCisgICJSZWFkIGEgZmlsZSdzIGNv bnRlbnRzIGludG8gYSBzdHJpbmcuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChpbnNlcnQt ZmlsZS1jb250ZW50cyAoZXhwYW5kLWZpbGUtbmFtZSBwYXRoIGNvbnRleHQtY29sb3JpbmctdGVz dC1wYXRoKSkKKyAgICAoYnVmZmVyLXN0cmluZykpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmlu Zy10ZXN0LXNldHVwICgpCisgICJQcmVwYXJhdGlvbiBjb2RlIHRvIHJ1biBiZWZvcmUgYWxsIHRl c3RzLiIKKyAgKHNldHEgY29udGV4dC1jb2xvcmluZy1jb21tZW50cy1hbmQtc3RyaW5ncyBuaWwp KQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWNsZWFudXAgKCkKKyAgIkNsZWFudXAg Y29kZSB0byBydW4gYWZ0ZXIgYWxsIHRlc3RzLiIKKyAgKHNldHEgY29udGV4dC1jb2xvcmluZy1j b21tZW50cy1hbmQtc3RyaW5ncyB0KQorICAoc2V0cSBjb250ZXh0LWNvbG9yaW5nLWFmdGVyLWNv bG9yaXplLWhvb2sgbmlsKQorICAoc2V0cSBjb250ZXh0LWNvbG9yaW5nLWpzLWJsb2NrLXNjb3Bl cyBuaWwpCisgIChjb250ZXh0LWNvbG9yaW5nLXNldC1jb2xvcnMtZGVmYXVsdCkpCisKKyhkZWZt YWNybyBjb250ZXh0LWNvbG9yaW5nLXRlc3Qtd2l0aC1maXh0dXJlIChmaXh0dXJlICZyZXN0IGJv ZHkpCisgICJFdmFsdWF0ZSBCT0RZIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlciB3aXRoIHRoZSByZWxh dGl2ZQorRklYVFVSRS4iCisgIGAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAodW53aW5kLXByb3Rl Y3QKKyAgICAgICAgIChwcm9nbgorICAgICAgICAgICAoY29udGV4dC1jb2xvcmluZy10ZXN0LXNl dHVwKQorICAgICAgICAgICAoaW5zZXJ0IChjb250ZXh0LWNvbG9yaW5nLXRlc3QtcmVhZC1maWxl ICxmaXh0dXJlKSkKKyAgICAgICAgICAgLEBib2R5KQorICAgICAgIChjb250ZXh0LWNvbG9yaW5n LXRlc3QtY2xlYW51cCkpKSkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctdGVzdC13aXRoLXRl bXAtYnVmZmVyLWFzeW5jIChjYWxsYmFjaykKKyAgIkNyZWF0ZSBhIHRlbXBvcmFyeSBidWZmZXIs IGFuZCBldmFsdWF0ZSBDQUxMQkFDSyB0aGVyZS4gIEEKK3RlYXJkb3duIGNhbGxiYWNrIGlzIHBh c3NlZCB0byBDQUxMQkFDSyBmb3IgaXQgdG8gaW52b2tlIHdoZW4gaXQKK2lzIGRvbmUuIgorICAo bGV0ICgodGVtcC1idWZmZXIgKG1ha2Utc3ltYm9sICJ0ZW1wLWJ1ZmZlciIpKSkKKyAgICAobGV0 ICgocHJldmlvdXMtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgICAgKHRlbXAtYnVm ZmVyIChnZW5lcmF0ZS1uZXctYnVmZmVyICIgKnRlbXAqIikpKQorICAgICAgKHNldC1idWZmZXIg dGVtcC1idWZmZXIpCisgICAgICAoZnVuY2FsbAorICAgICAgIGNhbGxiYWNrCisgICAgICAgKGxh bWJkYSAoKQorICAgICAgICAgKGFuZCAoYnVmZmVyLW5hbWUgdGVtcC1idWZmZXIpCisgICAgICAg ICAgICAgIChraWxsLWJ1ZmZlciB0ZW1wLWJ1ZmZlcikpCisgICAgICAgICAoc2V0LWJ1ZmZlciBw cmV2aW91cy1idWZmZXIpKSkpKSkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctdGVzdC13aXRo LWZpeHR1cmUtYXN5bmMgKGZpeHR1cmUgY2FsbGJhY2sgJm9wdGlvbmFsIHNldHVwKQorICAiRXZh bHVhdGUgQ0FMTEJBQ0sgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyIHdpdGggdGhlIHJlbGF0aXZlCitG SVhUVVJFLiAgQSB0ZWFyZG93biBjYWxsYmFjayBpcyBwYXNzZWQgdG8gQ0FMTEJBQ0sgZm9yIGl0 IHRvCitpbnZva2Ugd2hlbiBpdCBpcyBkb25lLiAgQW4gb3B0aW9uYWwgU0VUVVAgY2FsbGJhY2sg Y2FuIGJlIHBhc3NlZAordG8gcnVuIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgbW9kZSBpcyBp bnZva2VkLiIKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC13aXRoLXRlbXAtYnVmZmVyLWFzeW5j CisgICAobGFtYmRhIChkb25lLXdpdGgtdGVtcC1idWZmZXIpCisgICAgIChjb250ZXh0LWNvbG9y aW5nLXRlc3Qtc2V0dXApCisgICAgIChpZiBzZXR1cCAoZnVuY2FsbCBzZXR1cCkpCisgICAgIChp bnNlcnQgKGNvbnRleHQtY29sb3JpbmctdGVzdC1yZWFkLWZpbGUgZml4dHVyZSkpCisgICAgIChm dW5jYWxsCisgICAgICBjYWxsYmFjaworICAgICAgKGxhbWJkYSAoKQorICAgICAgICAoY29udGV4 dC1jb2xvcmluZy10ZXN0LWNsZWFudXApCisgICAgICAgIChmdW5jYWxsIGRvbmUtd2l0aC10ZW1w LWJ1ZmZlcikpKSkpKQorCisKKzs7OyBUZXN0IGRlZmluaW5nIHV0aWxpdGllcworCisoZGVmdW4g Y29udGV4dC1jb2xvcmluZy10ZXN0LWpzLW1vZGUgKGZpeHR1cmUgY2FsbGJhY2sgJm9wdGlvbmFs IHNldHVwKQorICAiVXNlIEZJWFRVUkUgYXMgdGhlIHN1YmplY3QgbWF0dGVyIGZvciB0ZXN0IGxv Z2ljIGluIENBTExCQUNLLgorT3B0aW9uYWxseSwgcHJvdmlkZSBzZXR1cCBjb2RlIHRvIHJ1biBi ZWZvcmUgdGhlIG1vZGUgaXMKK2luc3RhbnRpYXRlZCBpbiBTRVRVUC4iCisgIChjb250ZXh0LWNv bG9yaW5nLXRlc3Qtd2l0aC1maXh0dXJlLWFzeW5jCisgICBmaXh0dXJlCisgICAobGFtYmRhIChk b25lLXdpdGgtdGVzdCkKKyAgICAgKGpzLW1vZGUpCisgICAgIChjb250ZXh0LWNvbG9yaW5nLW1v ZGUpCisgICAgIChjb250ZXh0LWNvbG9yaW5nLWNvbG9yaXplCisgICAgICAobGFtYmRhICgpCisg ICAgICAgIChmdW5jYWxsIGNhbGxiYWNrIGRvbmUtd2l0aC10ZXN0KSkpKQorICAgc2V0dXApKQor CisoZGVmbWFjcm8gY29udGV4dC1jb2xvcmluZy10ZXN0LWpzMi1tb2RlIChmaXh0dXJlICZyZXN0 IGJvZHkpCisgICJVc2UgRklYVFVSRSBhcyB0aGUgc3ViamVjdCBtYXR0ZXIgZm9yIHRlc3QgbG9n aWMgaW4gQk9EWS4iCisgIGAoY29udGV4dC1jb2xvcmluZy10ZXN0LXdpdGgtZml4dHVyZQorICAg ICxmaXh0dXJlCisgICAgKHJlcXVpcmUgJ2pzMi1tb2RlKQorICAgIChzZXRxIGpzMi1tb2RlLXNo b3ctcGFyc2UtZXJyb3JzIG5pbCkKKyAgICAoc2V0cSBqczItbW9kZS1zaG93LXN0cmljdC13YXJu aW5ncyBuaWwpCisgICAgKGpzMi1tb2RlKQorICAgIChjb250ZXh0LWNvbG9yaW5nLW1vZGUpCisg ICAgLEBib2R5KSkKKworKGRlZm1hY3JvIGNvbnRleHQtY29sb3JpbmctdGVzdC1kZWZ0ZXN0LWpz LW1vZGUgKG5hbWUpCisgICJEZWZpbmUgYW4gYXN5bmNocm9ub3VzIHRlc3QgZm9yIGBqcy1tb2Rl JyBpbiB0aGUgdHlwaWNhbAorZm9ybWF0LiIKKyAgKGxldCAoKHRlc3QtbmFtZSAoaW50ZXJuIChm b3JtYXQgImNvbnRleHQtY29sb3JpbmctdGVzdC1qcy1tb2RlLSVzIiBuYW1lKSkpCisgICAgICAg IChmaXh0dXJlIChmb3JtYXQgIi4vZml4dHVyZXMvJXMuanMiIG5hbWUpKQorICAgICAgICAoZnVu Y3Rpb24tbmFtZSAoaW50ZXJuLXNvZnQgKGZvcm1hdCAiY29udGV4dC1jb2xvcmluZy10ZXN0LWpz LSVzIiBuYW1lKSkpKQorICAgIGAoZXJ0LWRlZnRlc3QtYXN5bmMgLHRlc3QtbmFtZSAoZG9uZSkK KyAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtanMtbW9kZQor ICAgICAgICAgICAgICAgICAgICAgICAgICxmaXh0dXJlCisgICAgICAgICAgICAgICAgICAgICAg ICAgKGxhbWJkYSAodGVhcmRvd24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW53aW5k LXByb3RlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLGZ1bmN0aW9uLW5hbWUp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIHRlYXJkb3duKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIGRvbmUpKSkpKSkKKworKGRlZm1hY3JvIGNv bnRleHQtY29sb3JpbmctdGVzdC1kZWZ0ZXN0LWpzMi1tb2RlIChuYW1lKQorICAgICJEZWZpbmUg YSB0ZXN0IGZvciBganMyLW1vZGUnIGluIHRoZSB0eXBpY2FsIGZvcm1hdC4iCisgIChsZXQgKCh0 ZXN0LW5hbWUgKGludGVybiAoZm9ybWF0ICJjb250ZXh0LWNvbG9yaW5nLXRlc3QtanMyLW1vZGUt JXMiIG5hbWUpKSkKKyAgICAgICAgKGZpeHR1cmUgKGZvcm1hdCAiLi9maXh0dXJlcy8lcy5qcyIg bmFtZSkpCisgICAgICAgIChmdW5jdGlvbi1uYW1lIChpbnRlcm4tc29mdCAoZm9ybWF0ICJjb250 ZXh0LWNvbG9yaW5nLXRlc3QtanMtJXMiIG5hbWUpKSkpCisgICAgYChlcnQtZGVmdGVzdCAsdGVz dC1uYW1lICgpCisgICAgICAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1qczItbW9kZQorICAgICAg ICAsZml4dHVyZQorICAgICAgICAoLGZ1bmN0aW9uLW5hbWUpKSkpKQorCisKKzs7OyBBc3NlcnRp b24gZnVuY3Rpb25zCisKKyhkZWZtYWNybyBjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJl Z2lvbiAoJnJlc3QgYm9keSkKKyAgIlNrZWxldG9uIGZvciBhc3NlcnRpbmcgc29tZXRoaW5nIGFi b3V0IHRoZSBmYWNlIG9mIHBvaW50cyBpbiBhCityZWdpb24uICBQcm92aWRlcyB0aGUgZnJlZSB2 YXJpYWJsZXMgYGknLCBgbGVuZ3RoJywgYHBvaW50JywKK2BmYWNlJyBhbmQgYGFjdHVhbC1sZXZl bCcuIgorICBgKGxldCAoKGkgMCkKKyAgICAgICAgIChsZW5ndGggKC0gZW5kIHN0YXJ0KSkpCisg ICAgICh3aGlsZSAoPCBpIGxlbmd0aCkKKyAgICAgICAobGV0KiAoKHBvaW50ICgrIGkgc3RhcnQp KQorICAgICAgICAgICAgICAoZmFjZSAoZ2V0LXRleHQtcHJvcGVydHkgcG9pbnQgJ2ZhY2UpKQor ICAgICAgICAgICAgICBhY3R1YWwtbGV2ZWwpCisgICAgICAgICAsQGJvZHkpCisgICAgICAgKHNl dHEgaSAoKyBpIDEpKSkpKQorCisoZGVmY29uc3QgY29udGV4dC1jb2xvcmluZy10ZXN0LWxldmVs LXJlZ2V4cAorICAiY29udGV4dC1jb2xvcmluZy1sZXZlbC1cXChbWzpkaWdpdDpdXStcXCktZmFj ZSIKKyAgIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgZXh0cmFjdGluZyBhIGxldmVsIGZyb20gYSBm YWNlLiIpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZl bCAoc3RhcnQgZW5kIGxldmVsKQorICAiQXNzZXJ0IHRoYXQgYWxsIHBvaW50cyBpbiB0aGUgcmFu Z2UgW1NUQVJULCBFTkQpIGFyZSBvZiBsZXZlbAorTEVWRUwuIgorICAoY29udGV4dC1jb2xvcmlu Zy10ZXN0LWFzc2VydC1yZWdpb24KKyAgICh3aGVuIChub3QgKHdoZW4gZmFjZQorICAgICAgICAg ICAgICAgIChsZXQqICgoZmFjZS1zdHJpbmcgKHN5bWJvbC1uYW1lIGZhY2UpKQorICAgICAgICAg ICAgICAgICAgICAgICAobWF0Y2hlcyAoc3RyaW5nLW1hdGNoCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb250ZXh0LWNvbG9yaW5nLXRlc3QtbGV2ZWwtcmVnZXhwCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLXN0cmluZykpKQorICAgICAgICAgICAgICAg ICAgKHdoZW4gbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAoc2V0cSBhY3R1YWwtbGV2ZWwg KHN0cmluZy10by1udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoc3Vic3RyaW5nIGZhY2Utc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobWF0Y2gtYmVnaW5uaW5nIDEpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtZW5kIDEpKSkpCisgICAg ICAgICAgICAgICAgICAgICg9IGxldmVsIGFjdHVhbC1sZXZlbCkpKSkpCisgICAgIChlcnQtZmFp bCAoZm9ybWF0IChjb25jYXQgIkV4cGVjdGVkIGxldmVsIGluIHJlZ2lvbiBbJXMsICVzKSwgIgor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBpcyBcIiVzXCIsIHRvIGJlICVz OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBhdCBwb2ludCAlcywgaXQg d2FzICVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgZW5kCisgICAgICAgICAgICAg ICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMgc3RhcnQgZW5kKSBsZXZl bAorICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBhY3R1YWwtbGV2ZWwpKSkpKQorCisoZGVm dW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tZmFjZSAoc3RhcnQgZW5kIGV4 cGVjdGVkLWZhY2UpCisgICJBc3NlcnQgdGhhdCBhbGwgcG9pbnRzIGluIHRoZSByYW5nZSBbU1RB UlQsIEVORCkgaGF2ZSB0aGUgZmFjZQorRVhQRUNURUQtRkFDRS4iCisgIChjb250ZXh0LWNvbG9y aW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbgorICAgKHdoZW4gKG5vdCAoZXEgZmFjZSBleHBlY3RlZC1m YWNlKSkKKyAgICAgKGVydC1mYWlsIChmb3JtYXQgKGNvbmNhdCAiRXhwZWN0ZWQgZmFjZSBpbiBy ZWdpb24gWyVzLCAlcyksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2gg aXMgXCIlc1wiLCB0byBiZSAlczsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJi dXQgYXQgcG9pbnQgJXMsIGl0IHdhcyAlcyIpCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0 IGVuZAorICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0 aWVzIHN0YXJ0IGVuZCkgZXhwZWN0ZWQtZmFjZQorICAgICAgICAgICAgICAgICAgICAgICBwb2lu dCBmYWNlKSkpKSkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9u LWNvbW1lbnQtZGVsaW1pdGVyIChzdGFydCBlbmQpCisgICJBc3NlcnQgdGhhdCBhbGwgcG9pbnRz IGluIHRoZSByYW5nZSBbU1RBUlQsIEVORCkgaGF2ZQorYGZvbnQtbG9jay1jb21tZW50LWRlbGlt aXRlci1mYWNlJy4iCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1mYWNl CisgICBzdGFydCBlbmQgJ2ZvbnQtbG9jay1jb21tZW50LWRlbGltaXRlci1mYWNlKSkKKworKGRl ZnVuIGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWNvbW1lbnQgKHN0YXJ0IGVu ZCkKKyAgICAiQXNzZXJ0IHRoYXQgYWxsIHBvaW50cyBpbiB0aGUgcmFuZ2UgW1NUQVJULCBFTkQp IGhhdmUKK2Bmb250LWxvY2stY29tbWVudC1mYWNlJy4iCisgIChjb250ZXh0LWNvbG9yaW5nLXRl c3QtYXNzZXJ0LXJlZ2lvbi1mYWNlCisgICBzdGFydCBlbmQgJ2ZvbnQtbG9jay1jb21tZW50LWZh Y2UpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tc3RyaW5n IChzdGFydCBlbmQpCisgICAgIkFzc2VydCB0aGF0IGFsbCBwb2ludHMgaW4gdGhlIHJhbmdlIFtT VEFSVCwgRU5EKSBoYXZlCitgZm9udC1sb2NrLXN0cmluZy1mYWNlJy4iCisgIChjb250ZXh0LWNv bG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1mYWNlCisgICBzdGFydCBlbmQgJ2ZvbnQtbG9jay1z dHJpbmctZmFjZSkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LW1lc3Nh Z2UgKGV4cGVjdGVkKQorICAiQXNzZXJ0IHRoYXQgdGhlICpNZXNzYWdlcyogYnVmZmVyIGhhcyBt ZXNzYWdlIEVYUEVDVEVELiIKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgIipNZXNzYWdlcyoiCisg ICAgKGxldCAoKG1lc3NhZ2VzIChzcGxpdC1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgIChi dWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAocG9p bnQtbWluKQorICAgICAgICAgICAgICAgICAgICAgIChwb2ludC1tYXgpKQorICAgICAgICAgICAg ICAgICAgICAgIlxuIikpKQorICAgICAgKGxldCAoKG1lc3NhZ2UgKGNhciAobnRoY2RyICgtIChs ZW5ndGggbWVzc2FnZXMpIDIpIG1lc3NhZ2VzKSkpKQorICAgICAgICAoc2hvdWxkIChlcXVhbCBt ZXNzYWdlIGV4cGVjdGVkKSkpKSkpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNz ZXJ0LWZhY2UgKGxldmVsIGZvcmVncm91bmQpCisgICJBc3NlcnQgdGhhdCBhIGZhY2UgZm9yIExF VkVMIGV4aXN0cyBhbmQgdGhhdCBpdHMgYDpmb3JlZ3JvdW5kJworaXMgRk9SRUdST1VORC4iCisg IChsZXQqICgoZmFjZSAoY29udGV4dC1jb2xvcmluZy1mYWNlLXN5bWJvbCBsZXZlbCkpCisgICAg ICAgICBhY3R1YWwtZm9yZWdyb3VuZCkKKyAgICAod2hlbiAobm90IGZhY2UpCisgICAgICAoZXJ0 LWZhaWwgKGZvcm1hdCAoY29uY2F0ICJFeHBlY3RlZCBmYWNlIGZvciBsZXZlbCBgJXMnIHRvIGV4 aXN0OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgaXQgZGlkbid0IikK KyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKSkpCisgICAgKHNldHEgYWN0dWFsLWZvcmVn cm91bmQgKGZhY2UtYXR0cmlidXRlIGZhY2UgOmZvcmVncm91bmQpKQorICAgICh3aGVuIChub3Qg KHN0cmluZy1lcXVhbCBmb3JlZ3JvdW5kIGFjdHVhbC1mb3JlZ3JvdW5kKSkKKyAgICAgIChlcnQt ZmFpbCAoZm9ybWF0IChjb25jYXQgIkV4cGVjdGVkIGZhY2UgZm9yIGxldmVsIGAlcycgIgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gaGF2ZSBmb3JlZ3JvdW5kIGAlcyc7IGJ1 dCBpdCB3YXMgYCVzJyIpCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbAorICAgICAgICAg ICAgICAgICAgICAgICAgZm9yZWdyb3VuZCBhY3R1YWwtZm9yZWdyb3VuZCkpKSkpCisKKworOzs7 IFRoZSB0ZXN0cworCisoZXJ0LWRlZnRlc3QgY29udGV4dC1jb2xvcmluZy10ZXN0LXVuc3VwcG9y dGVkLW1vZGUgKCkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC13aXRoLWZpeHR1cmUKKyAgICIu L2ZpeHR1cmVzL2Z1bmN0aW9uLXNjb3Blcy5qcyIKKyAgIChjb250ZXh0LWNvbG9yaW5nLW1vZGUp CisgICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1tZXNzYWdlCisgICAgIkNvbnRleHQg Y29sb3JpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBtYWpvciBtb2RlIikpKQorCisoZXJ0 LWRlZnRlc3QgY29udGV4dC1jb2xvcmluZy10ZXN0LXNldC1jb2xvcnMgKCkKKyAgOzsgVGhpcyB0 ZXN0IGhhcyBhbiBpcnJldmVyc2libGUgc2lkZS1lZmZlY3QgaW4gdGhhdCBpdCBkZWZpbmVzIGZh Y2VzIGJleW9uZAorICA7OyA3LiAgRmFjZXMgMCB0aHJvdWdoIDcgYXJlIHJlc2V0IHRvIHRoZWly IGRlZmF1bHQgc3RhdGVzLCBzbyBpdCBtaWdodCBub3QKKyAgOzsgbWF0dGVyLCBidXQgYmUgYXdh cmUgYW55d2F5LgorICAoY29udGV4dC1jb2xvcmluZy1zZXQtY29sb3JzCisgICAiIzAwMDAwMCIK KyAgICIjMTExMTExIgorICAgIiMyMjIyMjIiCisgICAiIzMzMzMzMyIKKyAgICIjNDQ0NDQ0Igor ICAgIiM1NTU1NTUiCisgICAiIzY2NjY2NiIKKyAgICIjNzc3Nzc3IgorICAgIiM4ODg4ODgiCisg ICAiIzk5OTk5OSIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgMCAiIzAw MDAwMCIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgMSAiIzExMTExMSIp CisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgMiAiIzIyMjIyMiIpCisgIChj b250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgMyAiIzMzMzMzMyIpCisgIChjb250ZXh0 LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgNCAiIzQ0NDQ0NCIpCisgIChjb250ZXh0LWNvbG9y aW5nLXRlc3QtYXNzZXJ0LWZhY2UgNSAiIzU1NTU1NSIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRl c3QtYXNzZXJ0LWZhY2UgNiAiIzY2NjY2NiIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNz ZXJ0LWZhY2UgNyAiIzc3Nzc3NyIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZh Y2UgOCAiIzg4ODg4OCIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LWZhY2UgOSAi Izk5OTk5OSIpKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWpzLWZ1bmN0aW9uLXNj b3BlcyAoKQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgMSA5 IDApCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA5IDIzIDEp CisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAyMyAyNSAwKQor ICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgMjUgMzQgMSkKKyAg KGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxldmVsIDM0IDM1IDApCisgIChj b250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAzNSA1MiAxKQorICAoY29u dGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgNTIgNjYgMikKKyAgKGNvbnRl eHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxldmVsIDY2IDcyIDEpCisgIChjb250ZXh0 LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA3MiA4MSAyKQorICAoY29udGV4dC1j b2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgODEgODIgMSkKKyAgKGNvbnRleHQtY29s b3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxldmVsIDgyIDg3IDIpCisgIChjb250ZXh0LWNvbG9y aW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA4NyA4OSAxKSkKKworKGNvbnRleHQtY29sb3Jp bmctdGVzdC1kZWZ0ZXN0LWpzLW1vZGUgZnVuY3Rpb24tc2NvcGVzKQorKGNvbnRleHQtY29sb3Jp bmctdGVzdC1kZWZ0ZXN0LWpzMi1tb2RlIGZ1bmN0aW9uLXNjb3BlcykKKworKGRlZnVuIGNvbnRl eHQtY29sb3JpbmctdGVzdC1qcy1nbG9iYWwgKCkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1h c3NlcnQtcmVnaW9uLWxldmVsIDIwIDI4IDEpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNz ZXJ0LXJlZ2lvbi1sZXZlbCAyOCAzNSAwKQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2Vy dC1yZWdpb24tbGV2ZWwgMzUgNDEgMSkpCisKKyhjb250ZXh0LWNvbG9yaW5nLXRlc3QtZGVmdGVz dC1qcy1tb2RlIGdsb2JhbCkKKyhjb250ZXh0LWNvbG9yaW5nLXRlc3QtZGVmdGVzdC1qczItbW9k ZSBnbG9iYWwpCisKKyhkZWZ1biBjb250ZXh0LWNvbG9yaW5nLXRlc3QtanMtYmxvY2stc2NvcGVz ICgpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAyMCA2NCAx KQorICAgKHNldHEgY29udGV4dC1jb2xvcmluZy1qcy1ibG9jay1zY29wZXMgdCkKKyAgIChjb250 ZXh0LWNvbG9yaW5nLWNvbG9yaXplKQorICAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQt cmVnaW9uLWxldmVsIDIwIDI3IDEpCisgICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1y ZWdpb24tbGV2ZWwgMjcgNDEgMikKKyAgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJl Z2lvbi1sZXZlbCA0MSA0MiAxKQorICAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVn aW9uLWxldmVsIDQyIDY0IDIpKQorCisoY29udGV4dC1jb2xvcmluZy10ZXN0LWRlZnRlc3QtanMy LW1vZGUgYmxvY2stc2NvcGVzKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWpzLWNh dGNoICgpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAyMCAy NyAxKQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgMjcgNTEg MikKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxldmVsIDUxIDUyIDEp CisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA1MiA3MyAyKQor ICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgNzMgMTAxIDMpCisg IChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAxMDEgMTAyIDEpCisg IChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAxMDIgMTE3IDMpCisg IChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCAxMTcgMTIzIDIpKQor CisoY29udGV4dC1jb2xvcmluZy10ZXN0LWRlZnRlc3QtanMtbW9kZSBjYXRjaCkKKyhjb250ZXh0 LWNvbG9yaW5nLXRlc3QtZGVmdGVzdC1qczItbW9kZSBjYXRjaCkKKworKGRlZnVuIGNvbnRleHQt Y29sb3JpbmctdGVzdC1qcy1rZXktbmFtZXMgKCkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1h c3NlcnQtcmVnaW9uLWxldmVsIDIwIDYzIDEpKQorCisoY29udGV4dC1jb2xvcmluZy10ZXN0LWRl ZnRlc3QtanMtbW9kZSBrZXktbmFtZXMpCisoY29udGV4dC1jb2xvcmluZy10ZXN0LWRlZnRlc3Qt anMyLW1vZGUga2V5LW5hbWVzKQorCisoZGVmdW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWpzLXBy b3BlcnR5LWxvb2t1cCAoKQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24t bGV2ZWwgMjAgMjYgMCkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxl dmVsIDI2IDM4IDEpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZl bCAzOCA0NCAwKQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwg NDQgNTIgMSkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWxldmVsIDU3 IDYzIDApCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA2MyA3 NCAxKSkKKworKGNvbnRleHQtY29sb3JpbmctdGVzdC1kZWZ0ZXN0LWpzLW1vZGUgcHJvcGVydHkt bG9va3VwKQorKGNvbnRleHQtY29sb3JpbmctdGVzdC1kZWZ0ZXN0LWpzMi1tb2RlIHByb3BlcnR5 LWxvb2t1cCkKKworKGRlZnVuIGNvbnRleHQtY29sb3JpbmctdGVzdC1qcy1rZXktdmFsdWVzICgp CisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1sZXZlbCA3OCA3OSAxKSkK KworKGNvbnRleHQtY29sb3JpbmctdGVzdC1kZWZ0ZXN0LWpzLW1vZGUga2V5LXZhbHVlcykKKyhj b250ZXh0LWNvbG9yaW5nLXRlc3QtZGVmdGVzdC1qczItbW9kZSBrZXktdmFsdWVzKQorCisoZGVm dW4gY29udGV4dC1jb2xvcmluZy10ZXN0LWpzLWNvbW1lbnRzLWFuZC1zdHJpbmdzICgpCisgIChj b250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1jb21tZW50LWRlbGltaXRlciAxIDQp CisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1jb21tZW50IDQgOCkKKyAg KGNvbnRleHQtY29sb3JpbmctdGVzdC1hc3NlcnQtcmVnaW9uLWNvbW1lbnQtZGVsaW1pdGVyIDkg MTIpCisgIChjb250ZXh0LWNvbG9yaW5nLXRlc3QtYXNzZXJ0LXJlZ2lvbi1jb21tZW50IDEyIDE5 KQorICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tc3RyaW5nIDIwIDMyKQor ICAoY29udGV4dC1jb2xvcmluZy10ZXN0LWFzc2VydC1yZWdpb24tbGV2ZWwgMzIgMzMgMCkpCisK KyhlcnQtZGVmdGVzdC1hc3luYyBjb250ZXh0LWNvbG9yaW5nLXRlc3QtanMtbW9kZS1jb21tZW50 cy1hbmQtc3RyaW5ncyAoZG9uZSkKKyAgKGNvbnRleHQtY29sb3JpbmctdGVzdC1qcy1tb2RlCisg ICAiLi9maXh0dXJlcy9jb21tZW50cy1hbmQtc3RyaW5ncy5qcyIKKyAgIChsYW1iZGEgKHRlYXJk b3duKQorICAgICAodW53aW5kLXByb3RlY3QKKyAgICAgICAgIChjb250ZXh0LWNvbG9yaW5nLXRl c3QtanMtY29tbWVudHMtYW5kLXN0cmluZ3MpCisgICAgICAgKGZ1bmNhbGwgdGVhcmRvd24pKQor ICAgICAoZnVuY2FsbCBkb25lKSkKKyAgIChsYW1iZGEgKCkKKyAgICAgKHNldHEgY29udGV4dC1j b2xvcmluZy1jb21tZW50cy1hbmQtc3RyaW5ncyB0KSkpKQorCisoZXJ0LWRlZnRlc3QgY29udGV4 dC1jb2xvcmluZy10ZXN0LWpzMi1tb2RlLWNvbW1lbnRzLWFuZC1zdHJpbmdzICgpCisgIChjb250 ZXh0LWNvbG9yaW5nLXRlc3QtanMyLW1vZGUKKyAgICIuL2ZpeHR1cmVzL2NvbW1lbnRzLWFuZC1z dHJpbmdzLmpzIgorICAgKHNldHEgY29udGV4dC1jb2xvcmluZy1jb21tZW50cy1hbmQtc3RyaW5n cyB0KQorICAgKGNvbnRleHQtY29sb3JpbmctY29sb3JpemUpCisgICAoY29udGV4dC1jb2xvcmlu Zy10ZXN0LWpzLWNvbW1lbnRzLWFuZC1zdHJpbmdzKSkpCisKKyhwcm92aWRlICdjb250ZXh0LWNv bG9yaW5nLXRlc3QpCisKKzs7OyBjb250ZXh0LWNvbG9yaW5nLXRlc3QuZWwgZW5kcyBoZXJlCmRp ZmYgLS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvYmxvY2st c2NvcGVzLmpzIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2Jsb2Nr LXNjb3Blcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVjYTZmCi0t LSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVz L2Jsb2NrLXNjb3Blcy5qcwpAQCAtMCwwICsxLDYgQEAKKyhmdW5jdGlvbiAoKSB7CisgICAgaWYg KDEpIHsKKyAgICAgICAgdmFyIGE7CisgICAgICAgIGxldCBiOworICAgIH0KK30oKSk7CmRpZmYg LS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvY2F0Y2guanMg Yi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvY2F0Y2guanMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MmNlOQotLS0gL2Rldi9udWxsCisrKyBi L3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJlcy9jYXRjaC5qcwpAQCAtMCww ICsxLDggQEAKKyhmdW5jdGlvbiAoKSB7CisgICAgdHJ5IHt9IGNhdGNoIChlKSB7CisgICAgICAg IHZhciBhID0gZTsKKyAgICAgICAgdHJ5IHt9IGNhdGNoIChlKSB7CisgICAgICAgICAgICB2YXIg YSA9IGU7CisgICAgICAgIH0KKyAgICB9Cit9KCkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvY29u dGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2NvbW1lbnRzLWFuZC1zdHJpbmdzLmpzIGIvcGFj a2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2NvbW1lbnRzLWFuZC1zdHJpbmdz LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTBiMDIKLS0tIC9kZXYv bnVsbAorKysgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvY29tbWVu dHMtYW5kLXN0cmluZ3MuanMKQEAgLTAsMCArMSwzIEBACisvLyBGb28uCisvKiBCYXIuICovCisn dXNlIHN0cmljdCc7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3Qv Zml4dHVyZXMvZnVuY3Rpb24tc2NvcGVzLmpzIGIvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90 ZXN0L2ZpeHR1cmVzL2Z1bmN0aW9uLXNjb3Blcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi4yZjZlZDMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvY29udGV4dC1j b2xvcmluZy90ZXN0L2ZpeHR1cmVzL2Z1bmN0aW9uLXNjb3Blcy5qcwpAQCAtMCwwICsxLDUgQEAK K3ZhciBhID0gZnVuY3Rpb24gKCkge307CitmdW5jdGlvbiBiKCkgeworICAgIHZhciBjID0gZnVu Y3Rpb24gKCkge307CisgICAgZnVuY3Rpb24gZCgpIHt9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMvZ2xvYmFsLmpzIGIvcGFja2FnZXMvY29u dGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2dsb2JhbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi5hMzU2MTlkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvY29u dGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2dsb2JhbC5qcwpAQCAtMCwwICsxLDMgQEAKKyhm dW5jdGlvbiAoKSB7CisgICAgdmFyIGEgPSByZXF1aXJlKCdhJyk7Cit9KCkpOwpkaWZmIC0tZ2l0 IGEvcGFja2FnZXMvY29udGV4dC1jb2xvcmluZy90ZXN0L2ZpeHR1cmVzL2tleS1uYW1lcy5qcyBi L3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJlcy9rZXktbmFtZXMuanMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhZDE3YwotLS0gL2Rldi9udWxsCisr KyBiL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJlcy9rZXktbmFtZXMuanMK QEAgLTAsMCArMSw2IEBACisoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICAgIGE6 IDAsCisgICAgICAgIGIgOiAyCisgICAgfTsKK30oKSk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9j b250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMva2V5LXZhbHVlcy5qcyBiL3BhY2thZ2VzL2Nv bnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJlcy9rZXktdmFsdWVzLmpzCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmRlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdl cy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4dHVyZXMva2V5LXZhbHVlcy5qcwpAQCAtMCwwICsx LDggQEAKKyhmdW5jdGlvbiAoKSB7CisgICAgdmFyIGE7CisgICAgKGZ1bmN0aW9uICgpIHsKKyAg ICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIGI6IGEKKyAgICAgICAgfTsKKyAgICB9KCkpOwor fSgpKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL2NvbnRleHQtY29sb3JpbmcvdGVzdC9maXh0dXJl cy9wcm9wZXJ0eS1sb29rdXAuanMgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5nL3Rlc3QvZml4 dHVyZXMvcHJvcGVydHktbG9va3VwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjRlZGNiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9jb250ZXh0LWNvbG9yaW5n L3Rlc3QvZml4dHVyZXMvcHJvcGVydHktbG9va3VwLmpzCkBAIC0wLDAgKzEsNSBAQAorKGZ1bmN0 aW9uICgpIHsKKyAgICB3aW5kb3cuZm9vKCk7CisgICAgd2luZG93LiBiYXIoKTsKKyAgICB3aW5k b3cuZm9vLmJhcigpOworfSgpKTsKLS0gCjEuOS4xCgo= --e89a8f83a6a536805d050e52c584--