<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>37886</bug_id>
          
          <creation_ts>2010-04-20 13:35:29 -0700</creation_ts>
          <short_desc>Hack up PrettyDiff to allow line-by-line comments.</short_desc>
          <delta_ts>2010-04-22 02:37:36 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://ascherkus.appspot.com/bugzilla/index.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Adam Barth">abarth</assigned_to>
          <cc>abarth</cc>
    
    <cc>aroben</cc>
    
    <cc>eric</cc>
    
    <cc>scherkus</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>214920</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-20 13:35:29 -0700</bug_when>
    <thetext>Demo at http://ascherkus.appspot.com/bugzilla/index.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214922</commentid>
    <comment_count>1</comment_count>
      <attachid>53876</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-20 13:38:43 -0700</bug_when>
    <thetext>Created attachment 53876
le patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214927</commentid>
    <comment_count>2</comment_count>
      <attachid>53876</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-04-20 13:49:51 -0700</bug_when>
    <thetext>Comment on attachment 53876
le patch

Only a &quot;drive by&quot; comment.

&gt; Index: BugsSite/PrettyPatch/PrettyPatch.rb
&gt; +&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js&quot;&gt;&lt;/script&gt; 
&gt; +&lt;script&gt;
&gt; +// Code to support inline comments in bugs.webkit.org.
&gt; +(funtion() {

function</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214934</commentid>
    <comment_count>3</comment_count>
    <who name="Andrew Scherkus">scherkus</who>
    <bug_when>2010-04-20 14:05:05 -0700</bug_when>
    <thetext>One thing to note is that in my demo I don&apos;t include the patch text in the comment box.  It starts off empty assuming you&apos;ll be double clicking and adding comments that way.

Maybe add a clear button or something?  Or just assume people will clear it themselves?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214985</commentid>
    <comment_count>4</comment_count>
      <attachid>53876</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-20 15:07:42 -0700</bug_when>
    <thetext>Comment on attachment 53876
le patch

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215180</commentid>
    <comment_count>5</comment_count>
      <attachid>53924</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-20 23:58:42 -0700</bug_when>
    <thetext>Created attachment 53924
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215182</commentid>
    <comment_count>6</comment_count>
      <attachid>53925</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-21 00:06:16 -0700</bug_when>
    <thetext>Created attachment 53925
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215184</commentid>
    <comment_count>7</comment_count>
      <attachid>53926</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-21 00:08:59 -0700</bug_when>
    <thetext>Created attachment 53926
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215253</commentid>
    <comment_count>8</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2010-04-21 04:54:53 -0700</bug_when>
    <thetext>Is using Prototype really necessary?  It’s more than 10x longer than the JavaScript itself.  It doesn’t seem like the code would be much larger if it just used the DOM directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215329</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-21 08:14:33 -0700</bug_when>
    <thetext>Prototype.js is certainly not necessary.  If we decide we like this approach, we can rewrite it to use dom directly.  Maciej and I discussed this issue over irc and our thinking was that we&apos;d like to play with the feature for a bit before investing more.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215357</commentid>
    <comment_count>10</comment_count>
      <attachid>53926</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-04-21 09:31:18 -0700</bug_when>
    <thetext>Comment on attachment 53926
Patch

Do we really need a copy of prototype?

Lets give this a try!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215358</commentid>
    <comment_count>11</comment_count>
      <attachid>53926</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-04-21 09:32:16 -0700</bug_when>
    <thetext>Comment on attachment 53926
Patch

This will dump this code into the diffs that run-webkit-tests (both new- and old-) generate, too. Maybe we need a switch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215363</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-21 09:38:34 -0700</bug_when>
    <thetext>I originally had it refer to a copy of prototype.js on the Ajax Apis site, but Maciej didn&apos;t like the external dependency.

Adding a switch is fine, but I have zero idea how to read or write ruby.

Btw, here&apos;s another option for a bugzilla integrated review tool:

http://blog.fishsoup.net/2009/09/23/splinter-patch-review/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215611</commentid>
    <comment_count>13</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-21 18:15:43 -0700</bug_when>
    <thetext>Attachment 53926 was posted by a committer and has review+, assigning to Adam Barth for commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215786</commentid>
    <comment_count>14</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-22 02:12:32 -0700</bug_when>
    <thetext>Committed r58075: &lt;http://trac.webkit.org/changeset/58075&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215794</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-22 02:37:36 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58075 might have broken Leopard Intel Debug (Tests)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53876</attachid>
            <date>2010-04-20 13:38:43 -0700</date>
            <delta_ts>2010-04-20 23:58:39 -0700</delta_ts>
            <desc>le patch</desc>
            <filename>code-review.patch</filename>
            <type>text/plain</type>
            <size>4087</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IEJ1Z3NTaXRlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBCdWdzU2l0ZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDU3OTExKQorKysgQnVnc1NpdGUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDQtMjAgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBI
YWNrIHVwIFByZXR0eURpZmYgdG8gYWxsb3cgbGluZS1ieS1saW5lIGNvbW1lbnRzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzg4NgorCisgICAgICAg
IEFkbWl0dGVkbHkgYSBiaXQgb2YgYSBoYWNrLCB0aGlzIGlzIGEgYmFzaWMgbGluZS1ieS1saW5l
IGVkaXRvciB3ZSBjYW4KKyAgICAgICAgcGxheSB3aXRoIHRoYW5rcyB0byBBbmRyZXcgU2NoZXJr
dXMuICBJdCdzIG1lYW50IHRvIGludGVncmF0ZSB3aXRoIHRoZQorICAgICAgICAicmV2aWV3IiBw
YWdlIGF0IGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICAqIFByZXR0eVBhdGNoL1ByZXR0eVBh
dGNoLnJiOgorCiAyMDEwLTAyLTIyICBUb3IgQXJuZSBWZXN0YsO4ICA8dG9yLmFybmUudmVzdGJv
QG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYWNpZWogU3RhY2hvd2lhay4KSW5k
ZXg6IEJ1Z3NTaXRlL1ByZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEJ1
Z3NTaXRlL1ByZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCShyZXZpc2lvbiA1NzkxMSkKKysrIEJ1
Z3NTaXRlL1ByZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCSh3b3JraW5nIGNvcHkpCkBAIC0xODIs
NyArMTgyLDEwNCBAQCBoMSA6aG92ZXIgewogICAgIGJhY2tncm91bmQtY29sb3I6ICNlOTk7CiAg
ICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogfQorCisvKiBTdXBwb3J0IGZvciBpbmxpbmUgY29t
bWVudHMgKi8KKy5jb21tZW50IHsKKyAgYm9yZGVyOiAxcHggd2lkdGggc29saWQgcmVkOworICBm
b250LWZhbWlseTogbW9ub3NwYWNlOworfQorIAorLmNvbW1lbnQgdGV4dGFyZWEgeworICB3aWR0
aDogMTAwJTsKKyAgaGVpZ2h0OiA2ZW07Cit9CisgCisuc3VibWl0dGVkIHsKKyAgZm9udC13ZWln
aHQ6IGJvbGQ7CisgIGNvbG9yOiByZWQ7Cit9CiA8L3N0eWxlPgorPHNjcmlwdCB0eXBlPSJ0ZXh0
L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL3By
b3RvdHlwZS8xLjYuMS4wL3Byb3RvdHlwZS5qcyI+PC9zY3JpcHQ+IAorPHNjcmlwdD4KKy8vIENv
ZGUgdG8gc3VwcG9ydCBpbmxpbmUgY29tbWVudHMgaW4gYnVncy53ZWJraXQub3JnLgorKGZ1bnRp
b24oKSB7CisgIGlmICh0b3AgPT09IHdpbmRvdykKKyAgICByZXR1cm47CisKKyAgZnVuY3Rpb24g
Z2V0U3VibWl0VGV4dEFyZWEoKSB7CisgICAgLy8gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3
aGVuIHJ1bm5pbmcgb24gc2FtZSBkb21haW4uCisgICAgcmV0dXJuIHBhcmVudC5mcmFtZXNbMV0u
ZG9jdW1lbnQuYm9keS5zZWxlY3QoInRleHRhcmVhIilbMF07CisgIH0KKworICB3aW5kb3cuYWRk
RXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgbGluZXMgPSAkJCgi
ZGl2W2NsYXNzfj0nTGluZSddIik7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5n
dGg7ICsraSkgeworICAgICAgbGluZXNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLCBv
bkxpbmVEb3VibGVDbGlja2VkKTsKKyAgICB9CisgIH0sIGZhbHNlKTsKKworICBmdW5jdGlvbiBv
bkxpbmVEb3VibGVDbGlja2VkKGUpIHsKKyAgICAvLyBGaW5kIHRoZSByaWdodCBsaW5lIGRpdi4K
KyAgICAvLyBGSVhNRTogd2h5IGRvZXMgYSBkb3VibGUgY2xpY2sgZXZlbnQgb24gbXkgZGl2IGdl
dCBpbnRlcmNlcHRlZAorICAgIC8vIGJ5IGEgc3BhbiBvciBldmVuIGRvY3VtZW50IGVsZW1lbnQg
OigKKyAgICB2YXIgbGluZSA9IGUudGFyZ2V0OworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBp
ZiAobGluZSA9PSBkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKGxpbmUuZ2V0
QXR0cmlidXRlKCJjbGFzcyIpLnN1YnN0cigwLCA0KSA9PSAiTGluZSIpCisgICAgICAgIGJyZWFr
OworICAgICAgbGluZSA9IGxpbmUudXAoKTsKKyAgICB9CisKKyAgICB2YXIgbGluZUZyb20gPSBs
aW5lLnNlbGVjdCgiW2NsYXNzPSdmcm9tIGxpbmVOdW1iZXInXSIpWzBdLmlubmVySFRNTDsKKyAg
ICB2YXIgbGluZVRvID0gbGluZS5zZWxlY3QoIltjbGFzcz0ndG8gbGluZU51bWJlciddIilbMF0u
aW5uZXJIVE1MOworICAgIHZhciBsaW5lVGV4dCA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J3RleHQn
XSIpWzBdLmlubmVySFRNTDsKKworICAgIGxpbmUuaW5zZXJ0KHthZnRlcjoKKyAgICAgICAgIjxk
aXYgY2xhc3M9J2NvbW1lbnQnPiIgKworICAgICAgICAiPHRleHRhcmVhPjwvdGV4dGFyZWE+IiAr
CisgICAgICAgICI8YnV0dG9uIG9uY2xpY2s9J29uQ29tbWVudFN1Ym1pdCh0aGlzLnVwKCkpJz5T
dWJtaXQ8L2J1dHRvbj4iICsKKyAgICAgICAgIjxidXR0b24gb25jbGljaz0nb25Db21tZW50Q2Fu
Y2VsKHRoaXMudXAoKSknPkNhbmNlbDwvYnV0dG9uPiIgKworICAgICAgICAiPC9kaXY+In0pOwor
CisgICAgdmFyIGNvbW1lbnQgPSBsaW5lLm5leHQoKTsKKyAgICB2YXIgdGV4dGFyZWEgPSBjb21t
ZW50LnNlbGVjdCgidGV4dGFyZWEiKVswXTsKKyAgICB0ZXh0YXJlYS5mb2N1cygpOworICB9CisK
KyAgZnVuY3Rpb24gb25Db21tZW50U3VibWl0KGNvbW1lbnQpIHsKKyAgICB2YXIgdGV4dGFyZWEg
PSBjb21tZW50LnNlbGVjdCgidGV4dGFyZWEiKVswXTsKKyAgICB2YXIgYnV0dG9ucyA9IGNvbW1l
bnQuc2VsZWN0KCJidXR0b24iKTsKKyAgICB2YXIgY29tbWVudFRleHQgPSB0ZXh0YXJlYS52YWx1
ZTsKKworICAgIHZhciBsaW5lID0gY29tbWVudC5wcmV2aW91cygpOworICAgIHZhciBsaW5lRnJv
bSA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J2Zyb20gbGluZU51bWJlciddIilbMF0udGV4dENvbnRl
bnQ7CisgICAgdmFyIGxpbmVUbyA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J3RvIGxpbmVOdW1iZXIn
XSIpWzBdLnRleHRDb250ZW50OworICAgIHZhciBsaW5lVGV4dCA9IGxpbmUuc2VsZWN0KCJbY2xh
c3M9J3RleHQnXSIpWzBdLnRleHRDb250ZW50OworICAgIHZhciBmaWxlbmFtZSA9IGNvbW1lbnQu
dXAoKS51cCgpLnNlbGVjdCgiaDEiKVswXS5kb3duKCkudGV4dENvbnRlbnQ7CisKKyAgICB2YXIg
c25pcHBldCA9IGZpbGVuYW1lICsgIjoiICsgbGluZVRvICsgIlxuICsgICIgKyBsaW5lVGV4dCAr
ICJcbiIgKyBjb21tZW50VGV4dCArICJcblxuIjsKKyAgICBjb25zb2xlLmxvZyhzbmlwcGV0KTsK
KworICAgIC8vIFJlbW92ZSBhbGwgdGhlIGNyYXAuCisgICAgdGV4dGFyZWEucmVtb3ZlKCk7Cisg
ICAgYnV0dG9uc1swXS5yZW1vdmUoKTsKKyAgICBidXR0b25zWzFdLnJlbW92ZSgpOworCisgICAg
Ly8gSW5zZXJ0IGEgbm9uLWVkaXRhYmxlIGZvcm0gb2Ygb3VyIGNvbW1lbnQuCisgICAgY29tbWVu
dC5pbnNlcnQoIjxwcmU+IiArIGNvbW1lbnRUZXh0ICsgIjwvcHJlPiIpOworICAgIGNvbW1lbnQu
c2V0QXR0cmlidXRlKCJjbGFzcyIsICJjb21tZW50IHN1Ym1pdHRlZCIpOworCisgICAgLy8gVXBk
YXRlIHRoZSBzdWJtaXNzaW9uIHRleHQgYXJlYS4KKyAgICB2YXIgc3VibWlzc2lvbiA9IGdldFN1
Ym1pdFRleHRBcmVhKCk7CisgICAgc3VibWlzc2lvbi52YWx1ZSA9IHN1Ym1pc3Npb24udmFsdWUg
KyBzbmlwcGV0OworICB9CisKKyAgZnVuY3Rpb24gb25Db21tZW50Q2FuY2VsKGNvbW1lbnQpIHsK
KyAgICBjb21tZW50LnJlbW92ZSgpOworICB9Cit9KSgpOworPC9zY3JpcHQ+CiBFT0YKIAogICAg
IGRlZiBzZWxmLnJldmlzaW9uT3JEZXNjcmlwdGlvbihzdHJpbmcpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53924</attachid>
            <date>2010-04-20 23:58:42 -0700</date>
            <delta_ts>2010-04-21 00:06:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37886-20100420235841.patch</filename>
            <type>text/plain</type>
            <size>4436</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0J1Z3NTaXRlL0NoYW5nZUxvZyBiL0J1Z3NTaXRlL0NoYW5nZUxvZwppbmRl
eCA0NzIzZTI0Li5jMGRjZWJmIDEwMDY0NAotLS0gYS9CdWdzU2l0ZS9DaGFuZ2VMb2cKKysrIGIv
QnVnc1NpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQtMjAgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBIYWNrIHVwIFByZXR0eURpZmYgdG8gYWxsb3cgbGluZS1ieS1saW5l
IGNvbW1lbnRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNzg4NgorCisgICAgICAgIEFkbWl0dGVkbHkgYSBiaXQgb2YgYSBoYWNrLCB0aGlzIGlzIGEg
YmFzaWMgbGluZS1ieS1saW5lIGVkaXRvciB3ZSBjYW4KKyAgICAgICAgcGxheSB3aXRoIHRoYW5r
cyB0byBBbmRyZXcgU2NoZXJrdXMuICBJdCdzIG1lYW50IHRvIGludGVncmF0ZSB3aXRoIHRoZQor
ICAgICAgICAicmV2aWV3IiBwYWdlIGF0IGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICBJIGNo
YW5nZWQgYSBjb3VwbGUgdGhpbmdzIGZyb20gQW5kcmV3J3Mgb3JpZ2luYWwgdmVyc2lvbjoKKyAg
ICAgICAgMSkgVHJpZ2dlciB0ZXh0IGJveGVzIG9uIHNpbmdsZSBjbGljayB0byBtYWtlIGlQaG9u
ZS9pUGFkIHJldmlld2luZworICAgICAgICBlYXNpZXIuCisgICAgICAgIDIpIENsZWFyIHRoZSBt
YWluIHRleHQgYm94IG9uIGxvYWQuCisKKyAgICAgICAgKiBQcmV0dHlQYXRjaC9QcmV0dHlQYXRj
aC5yYjoKKwogMjAxMC0wMi0yMiAgVG9yIEFybmUgVmVzdGLDuCAgPHRvci5hcm5lLnZlc3Rib0Bu
b2tpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dpYWsuCmRpZmYg
LS1naXQgYS9CdWdzU2l0ZS9QcmV0dHlQYXRjaC9QcmV0dHlQYXRjaC5yYiBiL0J1Z3NTaXRlL1By
ZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCmluZGV4IDBiNDExMDQuLjg5OGUzZDEgMTAwNjQ0Ci0t
LSBhL0J1Z3NTaXRlL1ByZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCisrKyBiL0J1Z3NTaXRlL1By
ZXR0eVBhdGNoL1ByZXR0eVBhdGNoLnJiCkBAIC0xODIsNyArMTgyLDEwOSBAQCBoMSA6aG92ZXIg
ewogICAgIGJhY2tncm91bmQtY29sb3I6ICNlOTk7CiAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25l
OwogfQorCisvKiBTdXBwb3J0IGZvciBpbmxpbmUgY29tbWVudHMgKi8KKy5jb21tZW50IHsKKyAg
Ym9yZGVyOiAxcHggd2lkdGggc29saWQgcmVkOworICBmb250LWZhbWlseTogbW9ub3NwYWNlOwor
fQorIAorLmNvbW1lbnQgdGV4dGFyZWEgeworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiA2ZW07
Cit9CisgCisuc3VibWl0dGVkIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGNvbG9yOiByZWQ7
Cit9CiA8L3N0eWxlPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDov
L2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL3Byb3RvdHlwZS8xLjYuMS4wL3Byb3RvdHlw
ZS5qcyI+PC9zY3JpcHQ+IAorPHNjcmlwdD4KKy8vIENvZGUgdG8gc3VwcG9ydCBpbmxpbmUgY29t
bWVudHMgaW4gYnVncy53ZWJraXQub3JnLgorKGZ1bmN0aW9uKCkgeworICBpZiAodG9wID09PSB3
aW5kb3cpCisgICAgcmV0dXJuOworCisgIGZ1bmN0aW9uIGdldFN1Ym1pdFRleHRBcmVhKCkgewor
ICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2hlbiBydW5uaW5nIG9uIHNhbWUgZG9t
YWluLgorICAgIHJldHVybiBwYXJlbnQuZnJhbWVzWzFdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCJ0ZXh0YXJlYSIpWzBdOworICB9CisKKyAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIo
ImxvYWQiLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGxpbmVzID0gJCQoImRpdltjbGFzc349J0xp
bmUnXSIpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKKyAg
ICAgIGxpbmVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgb25MaW5lQ2xpY2tlZCwgZmFs
c2UpOworICAgIH0KKyAgfSwgZmFsc2UpOworCisgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCJs
b2FkIiwgZnVuY3Rpb24gKCkgeworICAgIC8vIFJlbW92ZSB0aGUgZnVsbCBkaWZmIGZyb20gdGhl
IHN1Ym1pdCB0ZXh0IGFyZWEuCisgICAgcmV0dXJuIHBhcmVudC5mcmFtZXNbMV0uZG9jdW1lbnQu
Z2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHRhcmVhIilbMF0udmFsdWUgPSAiIjsKKyAgfSwgZmFs
c2UpOworCisgIGZ1bmN0aW9uIG9uTGluZUNsaWNrZWQoZSkgeworICAgIC8vIEZpbmQgdGhlIHJp
Z2h0IGxpbmUgZGl2LgorICAgIC8vIEZJWE1FOiB3aHkgZG9lcyBhIGNsaWNrIGV2ZW50IG9uIG15
IGRpdiBnZXQgaW50ZXJjZXB0ZWQKKyAgICAvLyBieSBhIHNwYW4gb3IgZXZlbiBkb2N1bWVudCBl
bGVtZW50IDooCisgICAgdmFyIGxpbmUgPSBlLnRhcmdldDsKKyAgICB3aGlsZSAodHJ1ZSkgewor
ICAgICAgaWYgKGxpbmUgPT0gZG9jdW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChs
aW5lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5zdWJzdHIoMCwgNCkgPT0gIkxpbmUiKQorICAgICAg
ICBicmVhazsKKyAgICAgIGxpbmUgPSBsaW5lLnVwKCk7CisgICAgfQorCisgICAgdmFyIGxpbmVG
cm9tID0gbGluZS5zZWxlY3QoIltjbGFzcz0nZnJvbSBsaW5lTnVtYmVyJ10iKVswXS5pbm5lckhU
TUw7CisgICAgdmFyIGxpbmVUbyA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J3RvIGxpbmVOdW1iZXIn
XSIpWzBdLmlubmVySFRNTDsKKyAgICB2YXIgbGluZVRleHQgPSBsaW5lLnNlbGVjdCgiW2NsYXNz
PSd0ZXh0J10iKVswXS5pbm5lckhUTUw7CisKKyAgICBsaW5lLmluc2VydCh7YWZ0ZXI6CisgICAg
ICAgICI8ZGl2IGNsYXNzPSdjb21tZW50Jz4iICsKKyAgICAgICAgIjx0ZXh0YXJlYT48L3RleHRh
cmVhPiIgKworICAgICAgICAiPGJ1dHRvbiBvbmNsaWNrPSdvbkNvbW1lbnRTdWJtaXQodGhpcy51
cCgpKSc+U3VibWl0PC9idXR0b24+IiArCisgICAgICAgICI8YnV0dG9uIG9uY2xpY2s9J29uQ29t
bWVudENhbmNlbCh0aGlzLnVwKCkpJz5DYW5jZWw8L2J1dHRvbj4iICsKKyAgICAgICAgIjwvZGl2
PiJ9KTsKKworICAgIHZhciBjb21tZW50ID0gbGluZS5uZXh0KCk7CisgICAgdmFyIHRleHRhcmVh
ID0gY29tbWVudC5zZWxlY3QoInRleHRhcmVhIilbMF07CisgICAgdGV4dGFyZWEuZm9jdXMoKTsK
KyAgfQorCisgIGZ1bmN0aW9uIG9uQ29tbWVudFN1Ym1pdChjb21tZW50KSB7CisgICAgdmFyIHRl
eHRhcmVhID0gY29tbWVudC5zZWxlY3QoInRleHRhcmVhIilbMF07CisgICAgdmFyIGJ1dHRvbnMg
PSBjb21tZW50LnNlbGVjdCgiYnV0dG9uIik7CisgICAgdmFyIGNvbW1lbnRUZXh0ID0gdGV4dGFy
ZWEudmFsdWU7CisKKyAgICB2YXIgbGluZSA9IGNvbW1lbnQucHJldmlvdXMoKTsKKyAgICB2YXIg
bGluZUZyb20gPSBsaW5lLnNlbGVjdCgiW2NsYXNzPSdmcm9tIGxpbmVOdW1iZXInXSIpWzBdLnRl
eHRDb250ZW50OworICAgIHZhciBsaW5lVG8gPSBsaW5lLnNlbGVjdCgiW2NsYXNzPSd0byBsaW5l
TnVtYmVyJ10iKVswXS50ZXh0Q29udGVudDsKKyAgICB2YXIgbGluZVRleHQgPSBsaW5lLnNlbGVj
dCgiW2NsYXNzPSd0ZXh0J10iKVswXS50ZXh0Q29udGVudDsKKyAgICB2YXIgZmlsZW5hbWUgPSBj
b21tZW50LnVwKCkudXAoKS5zZWxlY3QoImgxIilbMF0uZG93bigpLnRleHRDb250ZW50OworCisg
ICAgdmFyIHNuaXBwZXQgPSBmaWxlbmFtZSArICI6IiArIGxpbmVUbyArICJcbiArICAiICsgbGlu
ZVRleHQgKyAiXG4iICsgY29tbWVudFRleHQgKyAiXG5cbiI7CisgICAgY29uc29sZS5sb2coc25p
cHBldCk7CisKKyAgICAvLyBSZW1vdmUgYWxsIHRoZSBjcmFwLgorICAgIHRleHRhcmVhLnJlbW92
ZSgpOworICAgIGJ1dHRvbnNbMF0ucmVtb3ZlKCk7CisgICAgYnV0dG9uc1sxXS5yZW1vdmUoKTsK
KworICAgIC8vIEluc2VydCBhIG5vbi1lZGl0YWJsZSBmb3JtIG9mIG91ciBjb21tZW50LgorICAg
IGNvbW1lbnQuaW5zZXJ0KCI8cHJlPiIgKyBjb21tZW50VGV4dCArICI8L3ByZT4iKTsKKyAgICBj
b21tZW50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiY29tbWVudCBzdWJtaXR0ZWQiKTsKKworICAg
IC8vIFVwZGF0ZSB0aGUgc3VibWlzc2lvbiB0ZXh0IGFyZWEuCisgICAgdmFyIHN1Ym1pc3Npb24g
PSBnZXRTdWJtaXRUZXh0QXJlYSgpOworICAgIHN1Ym1pc3Npb24udmFsdWUgPSBzdWJtaXNzaW9u
LnZhbHVlICsgc25pcHBldDsKKyAgfQorCisgIGZ1bmN0aW9uIG9uQ29tbWVudENhbmNlbChjb21t
ZW50KSB7CisgICAgY29tbWVudC5yZW1vdmUoKTsKKyAgfQorfSkoKTsKKzwvc2NyaXB0PgogRU9G
CiAKICAgICBkZWYgc2VsZi5yZXZpc2lvbk9yRGVzY3JpcHRpb24oc3RyaW5nKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53925</attachid>
            <date>2010-04-21 00:06:16 -0700</date>
            <delta_ts>2010-04-21 00:08:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37886-20100421000614.patch</filename>
            <type>text/plain</type>
            <size>149371</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0J1Z3NTaXRlL0NoYW5nZUxvZyBiL0J1Z3NTaXRlL0NoYW5nZUxvZwppbmRl
eCA0NzIzZTI0Li41ZTAzNTQwIDEwMDY0NAotLS0gYS9CdWdzU2l0ZS9DaGFuZ2VMb2cKKysrIGIv
QnVnc1NpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDQtMjAgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBIYWNrIHVwIFByZXR0eURpZmYgdG8gYWxsb3cgbGluZS1ieS1saW5l
IGNvbW1lbnRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNzg4NgorCisgICAgICAgIEFkbWl0dGVkbHkgYSBiaXQgb2YgYSBoYWNrLCB0aGlzIGlzIGEg
YmFzaWMgbGluZS1ieS1saW5lIGVkaXRvciB3ZSBjYW4KKyAgICAgICAgcGxheSB3aXRoIHRoYW5r
cyB0byBBbmRyZXcgU2NoZXJrdXMuICBJdCdzIG1lYW50IHRvIGludGVncmF0ZSB3aXRoIHRoZQor
ICAgICAgICAicmV2aWV3IiBwYWdlIGF0IGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICBJIGNo
YW5nZWQgYSBmZXcgdGhpbmdzIGZyb20gQW5kcmV3J3Mgb3JpZ2luYWwgdmVyc2lvbjoKKyAgICAg
ICAgMSkgVHJpZ2dlciB0ZXh0IGJveGVzIG9uIHNpbmdsZSBjbGljayB0byBtYWtlIGlQaG9uZS9p
UGFkIHJldmlld2luZworICAgICAgICBlYXNpZXIuCisgICAgICAgIDIpIENsZWFyIHRoZSBtYWlu
IHRleHQgYm94IG9uIGxvYWQuCisgICAgICAgIDMpIFJlZmVyZW5jZSBhIHZlcnNpb24gb2YgcHJv
dG90eXBlLmpzIG9uIGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICAqIFByZXR0eVBhdGNoL1By
ZXR0eVBhdGNoLnJiOgorICAgICAgICAqIHByb3RvdHlwZS5qczogQWRkZWQuCisKIDIwMTAtMDIt
MjIgIFRvciBBcm5lIFZlc3Riw7ggIDx0b3IuYXJuZS52ZXN0Ym9Abm9raWEuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE1hY2llaiBTdGFjaG93aWFrLgpkaWZmIC0tZ2l0IGEvQnVnc1NpdGUv
UHJldHR5UGF0Y2gvUHJldHR5UGF0Y2gucmIgYi9CdWdzU2l0ZS9QcmV0dHlQYXRjaC9QcmV0dHlQ
YXRjaC5yYgppbmRleCAwYjQxMTA0Li4wNmU5NmE5IDEwMDY0NAotLS0gYS9CdWdzU2l0ZS9QcmV0
dHlQYXRjaC9QcmV0dHlQYXRjaC5yYgorKysgYi9CdWdzU2l0ZS9QcmV0dHlQYXRjaC9QcmV0dHlQ
YXRjaC5yYgpAQCAtMTgyLDcgKzE4MiwxMDkgQEAgaDEgOmhvdmVyIHsKICAgICBiYWNrZ3JvdW5k
LWNvbG9yOiAjZTk5OwogICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKIH0KKworLyogU3VwcG9y
dCBmb3IgaW5saW5lIGNvbW1lbnRzICovCisuY29tbWVudCB7CisgIGJvcmRlcjogMXB4IHdpZHRo
IHNvbGlkIHJlZDsKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKyAKKy5jb21tZW50IHRl
eHRhcmVhIHsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogNmVtOworfQorIAorLnN1Ym1pdHRl
ZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogcmVkOworfQogPC9zdHlsZT4KKzxz
Y3JpcHQgc3JjPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9wcm90b3R5cGUuanMiPjwvc2NyaXB0
PiAKKzxzY3JpcHQ+CisvLyBDb2RlIHRvIHN1cHBvcnQgaW5saW5lIGNvbW1lbnRzIGluIGJ1Z3Mu
d2Via2l0Lm9yZy4KKyhmdW5jdGlvbigpIHsKKyAgaWYgKHRvcCA9PT0gd2luZG93KQorICAgIHJl
dHVybjsKKworICBmdW5jdGlvbiBnZXRTdWJtaXRUZXh0QXJlYSgpIHsKKyAgICAvLyBOb3RlIHRo
YXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4gcnVubmluZyBvbiBzYW1lIGRvbWFpbi4KKyAgICByZXR1
cm4gcGFyZW50LmZyYW1lc1sxXS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGV4dGFy
ZWEiKVswXTsKKyAgfQorCisgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rp
b24gKCkgeworICAgIHZhciBsaW5lcyA9ICQkKCJkaXZbY2xhc3N+PSdMaW5lJ10iKTsKKyAgICBm
b3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CisgICAgICBsaW5lc1tpXS5h
ZGRFdmVudExpc3RlbmVyKCJjbGljayIsIG9uTGluZUNsaWNrZWQsIGZhbHNlKTsKKyAgICB9Cisg
IH0sIGZhbHNlKTsKKworICBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9u
ICgpIHsKKyAgICAvLyBSZW1vdmUgdGhlIGZ1bGwgZGlmZiBmcm9tIHRoZSBzdWJtaXQgdGV4dCBh
cmVhLgorICAgIHJldHVybiBwYXJlbnQuZnJhbWVzWzFdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCJ0ZXh0YXJlYSIpWzBdLnZhbHVlID0gIiI7CisgIH0sIGZhbHNlKTsKKworICBmdW5j
dGlvbiBvbkxpbmVDbGlja2VkKGUpIHsKKyAgICAvLyBGaW5kIHRoZSByaWdodCBsaW5lIGRpdi4K
KyAgICAvLyBGSVhNRTogd2h5IGRvZXMgYSBjbGljayBldmVudCBvbiBteSBkaXYgZ2V0IGludGVy
Y2VwdGVkCisgICAgLy8gYnkgYSBzcGFuIG9yIGV2ZW4gZG9jdW1lbnQgZWxlbWVudCA6KAorICAg
IHZhciBsaW5lID0gZS50YXJnZXQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChsaW5l
ID09IGRvY3VtZW50KQorICAgICAgICByZXR1cm47CisgICAgICBpZiAobGluZS5nZXRBdHRyaWJ1
dGUoImNsYXNzIikuc3Vic3RyKDAsIDQpID09ICJMaW5lIikKKyAgICAgICAgYnJlYWs7CisgICAg
ICBsaW5lID0gbGluZS51cCgpOworICAgIH0KKworICAgIHZhciBsaW5lRnJvbSA9IGxpbmUuc2Vs
ZWN0KCJbY2xhc3M9J2Zyb20gbGluZU51bWJlciddIilbMF0uaW5uZXJIVE1MOworICAgIHZhciBs
aW5lVG8gPSBsaW5lLnNlbGVjdCgiW2NsYXNzPSd0byBsaW5lTnVtYmVyJ10iKVswXS5pbm5lckhU
TUw7CisgICAgdmFyIGxpbmVUZXh0ID0gbGluZS5zZWxlY3QoIltjbGFzcz0ndGV4dCddIilbMF0u
aW5uZXJIVE1MOworCisgICAgbGluZS5pbnNlcnQoe2FmdGVyOgorICAgICAgICAiPGRpdiBjbGFz
cz0nY29tbWVudCc+IiArCisgICAgICAgICI8dGV4dGFyZWE+PC90ZXh0YXJlYT4iICsKKyAgICAg
ICAgIjxidXR0b24gb25jbGljaz0nb25Db21tZW50U3VibWl0KHRoaXMudXAoKSknPlN1Ym1pdDwv
YnV0dG9uPiIgKworICAgICAgICAiPGJ1dHRvbiBvbmNsaWNrPSdvbkNvbW1lbnRDYW5jZWwodGhp
cy51cCgpKSc+Q2FuY2VsPC9idXR0b24+IiArCisgICAgICAgICI8L2Rpdj4ifSk7CisKKyAgICB2
YXIgY29tbWVudCA9IGxpbmUubmV4dCgpOworICAgIHZhciB0ZXh0YXJlYSA9IGNvbW1lbnQuc2Vs
ZWN0KCJ0ZXh0YXJlYSIpWzBdOworICAgIHRleHRhcmVhLmZvY3VzKCk7CisgIH0KKworICBmdW5j
dGlvbiBvbkNvbW1lbnRTdWJtaXQoY29tbWVudCkgeworICAgIHZhciB0ZXh0YXJlYSA9IGNvbW1l
bnQuc2VsZWN0KCJ0ZXh0YXJlYSIpWzBdOworICAgIHZhciBidXR0b25zID0gY29tbWVudC5zZWxl
Y3QoImJ1dHRvbiIpOworICAgIHZhciBjb21tZW50VGV4dCA9IHRleHRhcmVhLnZhbHVlOworCisg
ICAgdmFyIGxpbmUgPSBjb21tZW50LnByZXZpb3VzKCk7CisgICAgdmFyIGxpbmVGcm9tID0gbGlu
ZS5zZWxlY3QoIltjbGFzcz0nZnJvbSBsaW5lTnVtYmVyJ10iKVswXS50ZXh0Q29udGVudDsKKyAg
ICB2YXIgbGluZVRvID0gbGluZS5zZWxlY3QoIltjbGFzcz0ndG8gbGluZU51bWJlciddIilbMF0u
dGV4dENvbnRlbnQ7CisgICAgdmFyIGxpbmVUZXh0ID0gbGluZS5zZWxlY3QoIltjbGFzcz0ndGV4
dCddIilbMF0udGV4dENvbnRlbnQ7CisgICAgdmFyIGZpbGVuYW1lID0gY29tbWVudC51cCgpLnVw
KCkuc2VsZWN0KCJoMSIpWzBdLmRvd24oKS50ZXh0Q29udGVudDsKKworICAgIHZhciBzbmlwcGV0
ID0gZmlsZW5hbWUgKyAiOiIgKyBsaW5lVG8gKyAiXG4gKyAgIiArIGxpbmVUZXh0ICsgIlxuIiAr
IGNvbW1lbnRUZXh0ICsgIlxuXG4iOworICAgIGNvbnNvbGUubG9nKHNuaXBwZXQpOworCisgICAg
Ly8gUmVtb3ZlIGFsbCB0aGUgY3JhcC4KKyAgICB0ZXh0YXJlYS5yZW1vdmUoKTsKKyAgICBidXR0
b25zWzBdLnJlbW92ZSgpOworICAgIGJ1dHRvbnNbMV0ucmVtb3ZlKCk7CisKKyAgICAvLyBJbnNl
cnQgYSBub24tZWRpdGFibGUgZm9ybSBvZiBvdXIgY29tbWVudC4KKyAgICBjb21tZW50Lmluc2Vy
dCgiPHByZT4iICsgY29tbWVudFRleHQgKyAiPC9wcmU+Iik7CisgICAgY29tbWVudC5zZXRBdHRy
aWJ1dGUoImNsYXNzIiwgImNvbW1lbnQgc3VibWl0dGVkIik7CisKKyAgICAvLyBVcGRhdGUgdGhl
IHN1Ym1pc3Npb24gdGV4dCBhcmVhLgorICAgIHZhciBzdWJtaXNzaW9uID0gZ2V0U3VibWl0VGV4
dEFyZWEoKTsKKyAgICBzdWJtaXNzaW9uLnZhbHVlID0gc3VibWlzc2lvbi52YWx1ZSArIHNuaXBw
ZXQ7CisgIH0KKworICBmdW5jdGlvbiBvbkNvbW1lbnRDYW5jZWwoY29tbWVudCkgeworICAgIGNv
bW1lbnQucmVtb3ZlKCk7CisgIH0KK30pKCk7Cis8L3NjcmlwdD4KIEVPRgogCiAgICAgZGVmIHNl
bGYucmV2aXNpb25PckRlc2NyaXB0aW9uKHN0cmluZykKZGlmZiAtLWdpdCBhL0J1Z3NTaXRlL3By
b3RvdHlwZS5qcyBiL0J1Z3NTaXRlL3Byb3RvdHlwZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi45ZmU2ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvQnVnc1NpdGUvcHJvdG90
eXBlLmpzCkBAIC0wLDAgKzEsNDg3NCBAQAorLyogIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1l
d29yaywgdmVyc2lvbiAxLjYuMQorICogIChjKSAyMDA1LTIwMDkgU2FtIFN0ZXBoZW5zb24KKyAq
CisgKiAgUHJvdG90eXBlIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBv
ZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4KKyAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5
cGUgd2ViIHNpdGU6IGh0dHA6Ly93d3cucHJvdG90eXBlanMub3JnLworICoKKyAqLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0qLworCit2YXIgUHJvdG90eXBlID0geworICBWZXJzaW9uOiAnMS42LjEnLAorCisg
IEJyb3dzZXI6IChmdW5jdGlvbigpeworICAgIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7
CisgICAgdmFyIGlzT3BlcmEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93
Lm9wZXJhKSA9PSAnW29iamVjdCBPcGVyYV0nOworICAgIHJldHVybiB7CisgICAgICBJRTogICAg
ICAgICAgICAgISF3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIWlzT3BlcmEsCisgICAgICBPcGVyYTog
ICAgICAgICAgaXNPcGVyYSwKKyAgICAgIFdlYktpdDogICAgICAgICB1YS5pbmRleE9mKCdBcHBs
ZVdlYktpdC8nKSA+IC0xLAorICAgICAgR2Vja286ICAgICAgICAgIHVhLmluZGV4T2YoJ0dlY2tv
JykgPiAtMSAmJiB1YS5pbmRleE9mKCdLSFRNTCcpID09PSAtMSwKKyAgICAgIE1vYmlsZVNhZmFy
aTogICAvQXBwbGUuKk1vYmlsZS4qU2FmYXJpLy50ZXN0KHVhKQorICAgIH0KKyAgfSkoKSwKKwor
ICBCcm93c2VyRmVhdHVyZXM6IHsKKyAgICBYUGF0aDogISFkb2N1bWVudC5ldmFsdWF0ZSwKKyAg
ICBTZWxlY3RvcnNBUEk6ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvciwKKyAgICBFbGVtZW50RXh0
ZW5zaW9uczogKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93LkVs
ZW1lbnQgfHwgd2luZG93LkhUTUxFbGVtZW50OworICAgICAgcmV0dXJuICEhKGNvbnN0cnVjdG9y
ICYmIGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7CisgICAgfSkoKSwKKyAgICBTcGVjaWZpY0VsZW1l
bnRFeHRlbnNpb25zOiAoZnVuY3Rpb24oKSB7CisgICAgICBpZiAodHlwZW9mIHdpbmRvdy5IVE1M
RGl2RWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
ICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICB2YXIgZm9y
bSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKKyAgICAgIHZhciBpc1N1cHBvcnRl
ZCA9IGZhbHNlOworCisgICAgICBpZiAoZGl2WydfX3Byb3RvX18nXSAmJiAoZGl2WydfX3Byb3Rv
X18nXSAhPT0gZm9ybVsnX19wcm90b19fJ10pKSB7CisgICAgICAgIGlzU3VwcG9ydGVkID0gdHJ1
ZTsKKyAgICAgIH0KKworICAgICAgZGl2ID0gZm9ybSA9IG51bGw7CisKKyAgICAgIHJldHVybiBp
c1N1cHBvcnRlZDsKKyAgICB9KSgpCisgIH0sCisKKyAgU2NyaXB0RnJhZ21lbnQ6ICc8c2NyaXB0
W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0PicsCisgIEpTT05GaWx0ZXI6IC9eXC9cKi1zZWN1
cmUtKFtcc1xTXSopXCpcL1xzKiQvLAorCisgIGVtcHR5RnVuY3Rpb246IGZ1bmN0aW9uKCkgeyB9
LAorICBLOiBmdW5jdGlvbih4KSB7IHJldHVybiB4IH0KK307CisKK2lmIChQcm90b3R5cGUuQnJv
d3Nlci5Nb2JpbGVTYWZhcmkpCisgIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNF
bGVtZW50RXh0ZW5zaW9ucyA9IGZhbHNlOworCisKK3ZhciBBYnN0cmFjdCA9IHsgfTsKKworCit2
YXIgVHJ5ID0geworICB0aGVzZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVyblZhbHVlOwor
CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5n
dGg7IGkrKykgeworICAgICAgdmFyIGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsKKyAgICAgIHRyeSB7
CisgICAgICAgIHJldHVyblZhbHVlID0gbGFtYmRhKCk7CisgICAgICAgIGJyZWFrOworICAgICAg
fSBjYXRjaCAoZSkgeyB9CisgICAgfQorCisgICAgcmV0dXJuIHJldHVyblZhbHVlOworICB9Cit9
OworCisvKiBCYXNlZCBvbiBBbGV4IEFybmVsbCdzIGluaGVyaXRhbmNlIGltcGxlbWVudGF0aW9u
LiAqLworCit2YXIgQ2xhc3MgPSAoZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIHN1YmNsYXNzKCkg
e307CisgIGZ1bmN0aW9uIGNyZWF0ZSgpIHsKKyAgICB2YXIgcGFyZW50ID0gbnVsbCwgcHJvcGVy
dGllcyA9ICRBKGFyZ3VtZW50cyk7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHByb3BlcnRp
ZXNbMF0pKQorICAgICAgcGFyZW50ID0gcHJvcGVydGllcy5zaGlmdCgpOworCisgICAgZnVuY3Rp
b24ga2xhc3MoKSB7CisgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKKyAgICB9CisKKyAgICBPYmplY3QuZXh0ZW5kKGtsYXNzLCBDbGFzcy5NZXRob2RzKTsKKyAg
ICBrbGFzcy5zdXBlcmNsYXNzID0gcGFyZW50OworICAgIGtsYXNzLnN1YmNsYXNzZXMgPSBbXTsK
KworICAgIGlmIChwYXJlbnQpIHsKKyAgICAgIHN1YmNsYXNzLnByb3RvdHlwZSA9IHBhcmVudC5w
cm90b3R5cGU7CisgICAgICBrbGFzcy5wcm90b3R5cGUgPSBuZXcgc3ViY2xhc3M7CisgICAgICBw
YXJlbnQuc3ViY2xhc3Nlcy5wdXNoKGtsYXNzKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0g
MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICBrbGFzcy5hZGRNZXRob2RzKHBy
b3BlcnRpZXNbaV0pOworCisgICAgaWYgKCFrbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZSkKKyAg
ICAgIGtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247
CisKKyAgICBrbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrbGFzczsKKyAgICByZXR1cm4g
a2xhc3M7CisgIH0KKworICBmdW5jdGlvbiBhZGRNZXRob2RzKHNvdXJjZSkgeworICAgIHZhciBh
bmNlc3RvciAgID0gdGhpcy5zdXBlcmNsYXNzICYmIHRoaXMuc3VwZXJjbGFzcy5wcm90b3R5cGU7
CisgICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOworCisgICAgaWYgKCFP
YmplY3Qua2V5cyh7IHRvU3RyaW5nOiB0cnVlIH0pLmxlbmd0aCkgeworICAgICAgaWYgKHNvdXJj
ZS50b1N0cmluZyAhPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKQorICAgICAgICBwcm9wZXJ0
aWVzLnB1c2goInRvU3RyaW5nIik7CisgICAgICBpZiAoc291cmNlLnZhbHVlT2YgIT0gT2JqZWN0
LnByb3RvdHlwZS52YWx1ZU9mKQorICAgICAgICBwcm9wZXJ0aWVzLnB1c2goInZhbHVlT2YiKTsK
KyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7
IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXSwg
dmFsdWUgPSBzb3VyY2VbcHJvcGVydHldOworICAgICAgaWYgKGFuY2VzdG9yICYmIE9iamVjdC5p
c0Z1bmN0aW9uKHZhbHVlKSAmJgorICAgICAgICAgIHZhbHVlLmFyZ3VtZW50TmFtZXMoKS5maXJz
dCgpID09ICIkc3VwZXIiKSB7CisgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZTsKKyAgICAgICAg
dmFsdWUgPSAoZnVuY3Rpb24obSkgeworICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0
dXJuIGFuY2VzdG9yW21dLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CisgICAgICAgIH0pKHBy
b3BlcnR5KS53cmFwKG1ldGhvZCk7CisKKyAgICAgICAgdmFsdWUudmFsdWVPZiA9IG1ldGhvZC52
YWx1ZU9mLmJpbmQobWV0aG9kKTsKKyAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBtZXRob2QudG9T
dHJpbmcuYmluZChtZXRob2QpOworICAgICAgfQorICAgICAgdGhpcy5wcm90b3R5cGVbcHJvcGVy
dHldID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICByZXR1cm4g
eworICAgIGNyZWF0ZTogY3JlYXRlLAorICAgIE1ldGhvZHM6IHsKKyAgICAgIGFkZE1ldGhvZHM6
IGFkZE1ldGhvZHMKKyAgICB9CisgIH07Cit9KSgpOworKGZ1bmN0aW9uKCkgeworCisgIHZhciBf
dG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCisgIGZ1bmN0aW9uIGV4dGVu
ZChkZXN0aW5hdGlvbiwgc291cmNlKSB7CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc291cmNl
KQorICAgICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gc291cmNlW3Byb3BlcnR5XTsKKyAgICBy
ZXR1cm4gZGVzdGluYXRpb247CisgIH0KKworICBmdW5jdGlvbiBpbnNwZWN0KG9iamVjdCkgewor
ICAgIHRyeSB7CisgICAgICBpZiAoaXNVbmRlZmluZWQob2JqZWN0KSkgcmV0dXJuICd1bmRlZmlu
ZWQnOworICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKKyAgICAgIHJl
dHVybiBvYmplY3QuaW5zcGVjdCA/IG9iamVjdC5pbnNwZWN0KCkgOiBTdHJpbmcob2JqZWN0KTsK
KyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpIHJl
dHVybiAnLi4uJzsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdG9K
U09OKG9iamVjdCkgeworICAgIHZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6CisgICAgICBjYXNlICdmdW5jdGlvbic6
CisgICAgICBjYXNlICd1bmtub3duJzogcmV0dXJuOworICAgICAgY2FzZSAnYm9vbGVhbic6IHJl
dHVybiBvYmplY3QudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0ID09PSBudWxs
KSByZXR1cm4gJ251bGwnOworICAgIGlmIChvYmplY3QudG9KU09OKSByZXR1cm4gb2JqZWN0LnRv
SlNPTigpOworICAgIGlmIChpc0VsZW1lbnQob2JqZWN0KSkgcmV0dXJuOworCisgICAgdmFyIHJl
c3VsdHMgPSBbXTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpIHsKKyAgICAgIHZh
ciB2YWx1ZSA9IHRvSlNPTihvYmplY3RbcHJvcGVydHldKTsKKyAgICAgIGlmICghaXNVbmRlZmlu
ZWQodmFsdWUpKQorICAgICAgICByZXN1bHRzLnB1c2gocHJvcGVydHkudG9KU09OKCkgKyAnOiAn
ICsgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAneycgKyByZXN1bHRzLmpvaW4oJywgJykg
KyAnfSc7CisgIH0KKworICBmdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKG9iamVjdCkgeworICAgIHJl
dHVybiAkSChvYmplY3QpLnRvUXVlcnlTdHJpbmcoKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRvSFRN
TChvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC50b0hUTUwgPyBvYmplY3Qu
dG9IVE1MKCkgOiBTdHJpbmcuaW50ZXJwcmV0KG9iamVjdCk7CisgIH0KKworICBmdW5jdGlvbiBr
ZXlzKG9iamVjdCkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgZm9yICh2YXIgcHJvcGVy
dHkgaW4gb2JqZWN0KQorICAgICAgcmVzdWx0cy5wdXNoKHByb3BlcnR5KTsKKyAgICByZXR1cm4g
cmVzdWx0czsKKyAgfQorCisgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHsKKyAgICB2YXIgcmVz
dWx0cyA9IFtdOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkKKyAgICAgIHJlc3Vs
dHMucHVzaChvYmplY3RbcHJvcGVydHldKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfQorCisg
IGZ1bmN0aW9uIGNsb25lKG9iamVjdCkgeworICAgIHJldHVybiBleHRlbmQoeyB9LCBvYmplY3Qp
OworICB9CisKKyAgZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkgeworICAgIHJldHVybiAhIShv
YmplY3QgJiYgb2JqZWN0Lm5vZGVUeXBlID09IDEpOworICB9CisKKyAgZnVuY3Rpb24gaXNBcnJh
eShvYmplY3QpIHsKKyAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAiW29iamVj
dCBBcnJheV0iOworICB9CisKKworICBmdW5jdGlvbiBpc0hhc2gob2JqZWN0KSB7CisgICAgcmV0
dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhhc2g7CisgIH0KKworICBmdW5jdGlvbiBpc0Z1bmN0aW9u
KG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAiZnVuY3Rpb24iOworICB9
CisKKyAgZnVuY3Rpb24gaXNTdHJpbmcob2JqZWN0KSB7CisgICAgcmV0dXJuIF90b1N0cmluZy5j
YWxsKG9iamVjdCkgPT0gIltvYmplY3QgU3RyaW5nXSI7CisgIH0KKworICBmdW5jdGlvbiBpc051
bWJlcihvYmplY3QpIHsKKyAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAiW29i
amVjdCBOdW1iZXJdIjsKKyAgfQorCisgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkgewor
ICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAidW5kZWZpbmVkIjsKKyAgfQorCisgIGV4dGVu
ZChPYmplY3QsIHsKKyAgICBleHRlbmQ6ICAgICAgICBleHRlbmQsCisgICAgaW5zcGVjdDogICAg
ICAgaW5zcGVjdCwKKyAgICB0b0pTT046ICAgICAgICB0b0pTT04sCisgICAgdG9RdWVyeVN0cmlu
ZzogdG9RdWVyeVN0cmluZywKKyAgICB0b0hUTUw6ICAgICAgICB0b0hUTUwsCisgICAga2V5czog
ICAgICAgICAga2V5cywKKyAgICB2YWx1ZXM6ICAgICAgICB2YWx1ZXMsCisgICAgY2xvbmU6ICAg
ICAgICAgY2xvbmUsCisgICAgaXNFbGVtZW50OiAgICAgaXNFbGVtZW50LAorICAgIGlzQXJyYXk6
ICAgICAgIGlzQXJyYXksCisgICAgaXNIYXNoOiAgICAgICAgaXNIYXNoLAorICAgIGlzRnVuY3Rp
b246ICAgIGlzRnVuY3Rpb24sCisgICAgaXNTdHJpbmc6ICAgICAgaXNTdHJpbmcsCisgICAgaXNO
dW1iZXI6ICAgICAgaXNOdW1iZXIsCisgICAgaXNVbmRlZmluZWQ6ICAgaXNVbmRlZmluZWQKKyAg
fSk7Cit9KSgpOworT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsIChmdW5jdGlvbigp
IHsKKyAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOworCisgIGZ1bmN0aW9uIHVw
ZGF0ZShhcnJheSwgYXJncykgeworICAgIHZhciBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aCwg
bGVuZ3RoID0gYXJncy5sZW5ndGg7CisgICAgd2hpbGUgKGxlbmd0aC0tKSBhcnJheVthcnJheUxl
bmd0aCArIGxlbmd0aF0gPSBhcmdzW2xlbmd0aF07CisgICAgcmV0dXJuIGFycmF5OworICB9CisK
KyAgZnVuY3Rpb24gbWVyZ2UoYXJyYXksIGFyZ3MpIHsKKyAgICBhcnJheSA9IHNsaWNlLmNhbGwo
YXJyYXksIDApOworICAgIHJldHVybiB1cGRhdGUoYXJyYXksIGFyZ3MpOworICB9CisKKyAgZnVu
Y3Rpb24gYXJndW1lbnROYW1lcygpIHsKKyAgICB2YXIgbmFtZXMgPSB0aGlzLnRvU3RyaW5nKCku
bWF0Y2goL15bXHNcKF0qZnVuY3Rpb25bXihdKlwoKFteKV0qKVwpLylbMV0KKyAgICAgIC5yZXBs
YWNlKC9cL1wvLio/W1xyXG5dfFwvXCooPzoufFtcclxuXSkqP1wqXC8vZywgJycpCisgICAgICAu
cmVwbGFjZSgvXHMrL2csICcnKS5zcGxpdCgnLCcpOworICAgIHJldHVybiBuYW1lcy5sZW5ndGgg
PT0gMSAmJiAhbmFtZXNbMF0gPyBbXSA6IG5hbWVzOworICB9CisKKyAgZnVuY3Rpb24gYmluZChj
b250ZXh0KSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIE9iamVjdC5pc1VuZGVm
aW5lZChhcmd1bWVudHNbMF0pKSByZXR1cm4gdGhpczsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlz
LCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBmdW5jdGlvbigp
IHsKKyAgICAgIHZhciBhID0gbWVyZ2UoYXJncywgYXJndW1lbnRzKTsKKyAgICAgIHJldHVybiBf
X21ldGhvZC5hcHBseShjb250ZXh0LCBhKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBiaW5k
QXNFdmVudExpc3RlbmVyKGNvbnRleHQpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdz
ID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBmdW5jdGlvbihldmVudCkg
eworICAgICAgdmFyIGEgPSB1cGRhdGUoW2V2ZW50IHx8IHdpbmRvdy5ldmVudF0sIGFyZ3MpOwor
ICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KGNvbnRleHQsIGEpOworICAgIH0KKyAgfQorCisg
IGZ1bmN0aW9uIGN1cnJ5KCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRo
aXM7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRz
LCAwKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYSA9IG1lcmdlKGFyZ3Ms
IGFyZ3VtZW50cyk7CisgICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkodGhpcywgYSk7CisgICAg
fQorICB9CisKKyAgZnVuY3Rpb24gZGVsYXkodGltZW91dCkgeworICAgIHZhciBfX21ldGhvZCA9
IHRoaXMsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgdGltZW91dCA9IHRp
bWVvdXQgKiAxMDAwCisgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLCBhcmdzKTsKKyAgICB9LCB0aW1l
b3V0KTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlZmVyKCkgeworICAgIHZhciBhcmdzID0gdXBkYXRl
KFswLjAxXSwgYXJndW1lbnRzKTsKKyAgICByZXR1cm4gdGhpcy5kZWxheS5hcHBseSh0aGlzLCBh
cmdzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHdyYXAod3JhcHBlcikgeworICAgIHZhciBfX21ldGhv
ZCA9IHRoaXM7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGEgPSB1cGRhdGUo
W19fbWV0aG9kLmJpbmQodGhpcyldLCBhcmd1bWVudHMpOworICAgICAgcmV0dXJuIHdyYXBwZXIu
YXBwbHkodGhpcywgYSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbWV0aG9kaXplKCkgewor
ICAgIGlmICh0aGlzLl9tZXRob2RpemVkKSByZXR1cm4gdGhpcy5fbWV0aG9kaXplZDsKKyAgICB2
YXIgX19tZXRob2QgPSB0aGlzOworICAgIHJldHVybiB0aGlzLl9tZXRob2RpemVkID0gZnVuY3Rp
b24oKSB7CisgICAgICB2YXIgYSA9IHVwZGF0ZShbdGhpc10sIGFyZ3VtZW50cyk7CisgICAgICBy
ZXR1cm4gX19tZXRob2QuYXBwbHkobnVsbCwgYSk7CisgICAgfTsKKyAgfQorCisgIHJldHVybiB7
CisgICAgYXJndW1lbnROYW1lczogICAgICAgYXJndW1lbnROYW1lcywKKyAgICBiaW5kOiAgICAg
ICAgICAgICAgICBiaW5kLAorICAgIGJpbmRBc0V2ZW50TGlzdGVuZXI6IGJpbmRBc0V2ZW50TGlz
dGVuZXIsCisgICAgY3Vycnk6ICAgICAgICAgICAgICAgY3VycnksCisgICAgZGVsYXk6ICAgICAg
ICAgICAgICAgZGVsYXksCisgICAgZGVmZXI6ICAgICAgICAgICAgICAgZGVmZXIsCisgICAgd3Jh
cDogICAgICAgICAgICAgICAgd3JhcCwKKyAgICBtZXRob2RpemU6ICAgICAgICAgICBtZXRob2Rp
emUKKyAgfQorfSkoKSk7CisKKworRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7
CisgIHJldHVybiAnIicgKyB0aGlzLmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKworICAgICh0aGlz
LmdldFVUQ01vbnRoKCkgKyAxKS50b1BhZGRlZFN0cmluZygyKSArICctJyArCisgICAgdGhpcy5n
ZXRVVENEYXRlKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnVCcgKworICAgIHRoaXMuZ2V0VVRDSG91
cnMoKS50b1BhZGRlZFN0cmluZygyKSArICc6JyArCisgICAgdGhpcy5nZXRVVENNaW51dGVzKCku
dG9QYWRkZWRTdHJpbmcoMikgKyAnOicgKworICAgIHRoaXMuZ2V0VVRDU2Vjb25kcygpLnRvUGFk
ZGVkU3RyaW5nKDIpICsgJ1oiJzsKK307CisKKworUmVnRXhwLnByb3RvdHlwZS5tYXRjaCA9IFJl
Z0V4cC5wcm90b3R5cGUudGVzdDsKKworUmVnRXhwLmVzY2FwZSA9IGZ1bmN0aW9uKHN0cikgewor
ICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9n
LCAnXFwkMScpOworfTsKK3ZhciBQZXJpb2RpY2FsRXhlY3V0ZXIgPSBDbGFzcy5jcmVhdGUoewor
ICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywgZnJlcXVlbmN5KSB7CisgICAgdGhpcy5j
YWxsYmFjayA9IGNhbGxiYWNrOworICAgIHRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAg
IHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7CisKKyAgICB0aGlzLnJlZ2lzdGVyQ2Fs
bGJhY2soKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsKKyAgICB0
aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhp
cy5mcmVxdWVuY3kgKiAxMDAwKTsKKyAgfSwKKworICBleGVjdXRlOiBmdW5jdGlvbigpIHsKKyAg
ICB0aGlzLmNhbGxiYWNrKHRoaXMpOworICB9LAorCisgIHN0b3A6IGZ1bmN0aW9uKCkgeworICAg
IGlmICghdGhpcy50aW1lcikgcmV0dXJuOworICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7
CisgICAgdGhpcy50aW1lciA9IG51bGw7CisgIH0sCisKKyAgb25UaW1lckV2ZW50OiBmdW5jdGlv
bigpIHsKKyAgICBpZiAoIXRoaXMuY3VycmVudGx5RXhlY3V0aW5nKSB7CisgICAgICB0cnkgewor
ICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IHRydWU7CisgICAgICAgIHRoaXMuZXhl
Y3V0ZSgpOworICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworICAgICAg
fSBjYXRjaChlKSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7Cisg
ICAgICAgIHRocm93IGU7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKK09iamVjdC5leHRlbmQo
U3RyaW5nLCB7CisgIGludGVycHJldDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gdmFs
dWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsKKyAgfSwKKyAgc3BlY2lhbENoYXI6IHsK
KyAgICAnXGInOiAnXFxiJywKKyAgICAnXHQnOiAnXFx0JywKKyAgICAnXG4nOiAnXFxuJywKKyAg
ICAnXGYnOiAnXFxmJywKKyAgICAnXHInOiAnXFxyJywKKyAgICAnXFwnOiAnXFxcXCcKKyAgfQor
fSk7CisKK09iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgKGZ1bmN0aW9uKCkgeworCisg
IGZ1bmN0aW9uIHByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCkgeworICAgIGlmIChPYmpl
Y3QuaXNGdW5jdGlvbihyZXBsYWNlbWVudCkpIHJldHVybiByZXBsYWNlbWVudDsKKyAgICB2YXIg
dGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVwbGFjZW1lbnQpOworICAgIHJldHVybiBmdW5jdGlv
bihtYXRjaCkgeyByZXR1cm4gdGVtcGxhdGUuZXZhbHVhdGUobWF0Y2gpIH07CisgIH0KKworICBm
dW5jdGlvbiBnc3ViKHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7CisgICAgdmFyIHJlc3VsdCA9ICcn
LCBzb3VyY2UgPSB0aGlzLCBtYXRjaDsKKyAgICByZXBsYWNlbWVudCA9IHByZXBhcmVSZXBsYWNl
bWVudChyZXBsYWNlbWVudCk7CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHBhdHRlcm4pKQor
ICAgICAgcGF0dGVybiA9IFJlZ0V4cC5lc2NhcGUocGF0dGVybik7CisKKyAgICBpZiAoIShwYXR0
ZXJuLmxlbmd0aCB8fCBwYXR0ZXJuLnNvdXJjZSkpIHsKKyAgICAgIHJlcGxhY2VtZW50ID0gcmVw
bGFjZW1lbnQoJycpOworICAgICAgcmV0dXJuIHJlcGxhY2VtZW50ICsgc291cmNlLnNwbGl0KCcn
KS5qb2luKHJlcGxhY2VtZW50KSArIHJlcGxhY2VtZW50OworICAgIH0KKworICAgIHdoaWxlIChz
b3VyY2UubGVuZ3RoID4gMCkgeworICAgICAgaWYgKG1hdGNoID0gc291cmNlLm1hdGNoKHBhdHRl
cm4pKSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2Uuc2xpY2UoMCwgbWF0Y2guaW5kZXgpOwor
ICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmludGVycHJldChyZXBsYWNlbWVudChtYXRjaCkpOwor
ICAgICAgICBzb3VyY2UgID0gc291cmNlLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVu
Z3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2UsIHNvdXJjZSA9
ICcnOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVuY3Rp
b24gc3ViKHBhdHRlcm4sIHJlcGxhY2VtZW50LCBjb3VudCkgeworICAgIHJlcGxhY2VtZW50ID0g
cHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKKyAgICBjb3VudCA9IE9iamVjdC5pc1Vu
ZGVmaW5lZChjb3VudCkgPyAxIDogY291bnQ7CisKKyAgICByZXR1cm4gdGhpcy5nc3ViKHBhdHRl
cm4sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBpZiAoLS1jb3VudCA8IDApIHJldHVybiBtYXRj
aFswXTsKKyAgICAgIHJldHVybiByZXBsYWNlbWVudChtYXRjaCk7CisgICAgfSk7CisgIH0KKwor
ICBmdW5jdGlvbiBzY2FuKHBhdHRlcm4sIGl0ZXJhdG9yKSB7CisgICAgdGhpcy5nc3ViKHBhdHRl
cm4sIGl0ZXJhdG9yKTsKKyAgICByZXR1cm4gU3RyaW5nKHRoaXMpOworICB9CisKKyAgZnVuY3Rp
b24gdHJ1bmNhdGUobGVuZ3RoLCB0cnVuY2F0aW9uKSB7CisgICAgbGVuZ3RoID0gbGVuZ3RoIHx8
IDMwOworICAgIHRydW5jYXRpb24gPSBPYmplY3QuaXNVbmRlZmluZWQodHJ1bmNhdGlvbikgPyAn
Li4uJyA6IHRydW5jYXRpb247CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8KKyAg
ICAgIHRoaXMuc2xpY2UoMCwgbGVuZ3RoIC0gdHJ1bmNhdGlvbi5sZW5ndGgpICsgdHJ1bmNhdGlv
biA6IFN0cmluZyh0aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHN0cmlwKCkgeworICAgIHJldHVy
biB0aGlzLnJlcGxhY2UoL15ccysvLCAnJykucmVwbGFjZSgvXHMrJC8sICcnKTsKKyAgfQorCisg
IGZ1bmN0aW9uIHN0cmlwVGFncygpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC88XHcrKFxz
KygiW14iXSoifCdbXiddKid8W14+XSkrKT8+fDxcL1x3Kz4vZ2ksICcnKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHN0cmlwU2NyaXB0cygpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdF
eHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyksICcnKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGV4dHJhY3RTY3JpcHRzKCkgeworICAgIHZhciBtYXRjaEFsbCA9IG5ldyBSZWdFeHAoUHJv
dG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7CisgICAgdmFyIG1hdGNoT25lID0gbmV3IFJl
Z0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOworICAgIHJldHVybiAodGhpcy5t
YXRjaChtYXRjaEFsbCkgfHwgW10pLm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsKKyAgICAgIHJl
dHVybiAoc2NyaXB0VGFnLm1hdGNoKG1hdGNoT25lKSB8fCBbJycsICcnXSlbMV07CisgICAgfSk7
CisgIH0KKworICBmdW5jdGlvbiBldmFsU2NyaXB0cygpIHsKKyAgICByZXR1cm4gdGhpcy5leHRy
YWN0U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3JpcHQpIHsgcmV0dXJuIGV2YWwoc2NyaXB0KSB9
KTsKKyAgfQorCisgIGZ1bmN0aW9uIGVzY2FwZUhUTUwoKSB7CisgICAgcmV0dXJuIHRoaXMucmVw
bGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0
OycpOworICB9CisKKyAgZnVuY3Rpb24gdW5lc2NhcGVIVE1MKCkgeworICAgIHJldHVybiB0aGlz
LnN0cmlwVGFncygpLnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxhY2UoLyZndDsvZywnPicpLnJl
cGxhY2UoLyZhbXA7L2csJyYnKTsKKyAgfQorCisKKyAgZnVuY3Rpb24gdG9RdWVyeVBhcmFtcyhz
ZXBhcmF0b3IpIHsKKyAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmlwKCkubWF0Y2goLyhbXj8jXSop
KCMuKik/JC8pOworICAgIGlmICghbWF0Y2gpIHJldHVybiB7IH07CisKKyAgICByZXR1cm4gbWF0
Y2hbMV0uc3BsaXQoc2VwYXJhdG9yIHx8ICcmJykuaW5qZWN0KHsgfSwgZnVuY3Rpb24oaGFzaCwg
cGFpcikgeworICAgICAgaWYgKChwYWlyID0gcGFpci5zcGxpdCgnPScpKVswXSkgeworICAgICAg
ICB2YXIga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2hpZnQoKSk7CisgICAgICAgIHZh
ciB2YWx1ZSA9IHBhaXIubGVuZ3RoID4gMSA/IHBhaXIuam9pbignPScpIDogcGFpclswXTsKKyAg
ICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQo
dmFsdWUpOworCisgICAgICAgIGlmIChrZXkgaW4gaGFzaCkgeworICAgICAgICAgIGlmICghT2Jq
ZWN0LmlzQXJyYXkoaGFzaFtrZXldKSkgaGFzaFtrZXldID0gW2hhc2hba2V5XV07CisgICAgICAg
ICAgaGFzaFtrZXldLnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaGFzaFtr
ZXldID0gdmFsdWU7CisgICAgICB9CisgICAgICByZXR1cm4gaGFzaDsKKyAgICB9KTsKKyAgfQor
CisgIGZ1bmN0aW9uIHRvQXJyYXkoKSB7CisgICAgcmV0dXJuIHRoaXMuc3BsaXQoJycpOworICB9
CisKKyAgZnVuY3Rpb24gc3VjYygpIHsKKyAgICByZXR1cm4gdGhpcy5zbGljZSgwLCB0aGlzLmxl
bmd0aCAtIDEpICsKKyAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jaGFyQ29kZUF0KHRo
aXMubGVuZ3RoIC0gMSkgKyAxKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRpbWVzKGNvdW50KSB7Cisg
ICAgcmV0dXJuIGNvdW50IDwgMSA/ICcnIDogbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbih0aGlz
KTsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbWVsaXplKCkgeworICAgIHZhciBwYXJ0cyA9IHRoaXMu
c3BsaXQoJy0nKSwgbGVuID0gcGFydHMubGVuZ3RoOworICAgIGlmIChsZW4gPT0gMSkgcmV0dXJu
IHBhcnRzWzBdOworCisgICAgdmFyIGNhbWVsaXplZCA9IHRoaXMuY2hhckF0KDApID09ICctJwor
ICAgICAgPyBwYXJ0c1swXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzWzBdLnN1YnN0
cmluZygxKQorICAgICAgOiBwYXJ0c1swXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVu
OyBpKyspCisgICAgICBjYW1lbGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNl
KCkgKyBwYXJ0c1tpXS5zdWJzdHJpbmcoMSk7CisKKyAgICByZXR1cm4gY2FtZWxpemVkOworICB9
CisKKyAgZnVuY3Rpb24gY2FwaXRhbGl6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5jaGFyQXQoMCku
dG9VcHBlckNhc2UoKSArIHRoaXMuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7CisgIH0KKwor
ICBmdW5jdGlvbiB1bmRlcnNjb3JlKCkgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLzo6L2cs
ICcvJykKKyAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKS9nLCAn
JDFfJDInKQorICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhbYS16XGRdKShbQS1aXSkvZywgJyQx
XyQyJykKKyAgICAgICAgICAgICAgIC5yZXBsYWNlKC8tL2csICdfJykKKyAgICAgICAgICAgICAg
IC50b0xvd2VyQ2FzZSgpOworICB9CisKKyAgZnVuY3Rpb24gZGFzaGVyaXplKCkgeworICAgIHJl
dHVybiB0aGlzLnJlcGxhY2UoL18vZywgJy0nKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluc3BlY3Qo
dXNlRG91YmxlUXVvdGVzKSB7CisgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSB0aGlzLnJlcGxhY2Uo
L1tceDAwLVx4MWZcXF0vZywgZnVuY3Rpb24oY2hhcmFjdGVyKSB7CisgICAgICBpZiAoY2hhcmFj
dGVyIGluIFN0cmluZy5zcGVjaWFsQ2hhcikgeworICAgICAgICByZXR1cm4gU3RyaW5nLnNwZWNp
YWxDaGFyW2NoYXJhY3Rlcl07CisgICAgICB9CisgICAgICByZXR1cm4gJ1xcdTAwJyArIGNoYXJh
Y3Rlci5jaGFyQ29kZUF0KCkudG9QYWRkZWRTdHJpbmcoMiwgMTYpOworICAgIH0pOworICAgIGlm
ICh1c2VEb3VibGVRdW90ZXMpIHJldHVybiAnIicgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLyIv
ZywgJ1xcIicpICsgJyInOworICAgIHJldHVybiAiJyIgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2Uo
LycvZywgJ1xcXCcnKSArICInIjsKKyAgfQorCisgIGZ1bmN0aW9uIHRvSlNPTigpIHsKKyAgICBy
ZXR1cm4gdGhpcy5pbnNwZWN0KHRydWUpOworICB9CisKKyAgZnVuY3Rpb24gdW5maWx0ZXJKU09O
KGZpbHRlcikgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZmlsdGVyIHx8IFByb3RvdHlwZS5K
U09ORmlsdGVyLCAnJDEnKTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzSlNPTigpIHsKKyAgICB2YXIg
c3RyID0gdGhpczsKKyAgICBpZiAoc3RyLmJsYW5rKCkpIHJldHVybiBmYWxzZTsKKyAgICBzdHIg
PSB0aGlzLnJlcGxhY2UoL1xcLi9nLCAnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiIvZywgJycp
OworICAgIHJldHVybiAoL15bLDp7fVxbXF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8pLnRl
c3Qoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGV2YWxKU09OKHNhbml0aXplKSB7CisgICAgdmFy
IGpzb24gPSB0aGlzLnVuZmlsdGVySlNPTigpOworICAgIHRyeSB7CisgICAgICBpZiAoIXNhbml0
aXplIHx8IGpzb24uaXNKU09OKCkpIHJldHVybiBldmFsKCcoJyArIGpzb24gKyAnKScpOworICAg
IH0gY2F0Y2ggKGUpIHsgfQorICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQmFkbHkgZm9ybWVk
IEpTT04gc3RyaW5nOiAnICsgdGhpcy5pbnNwZWN0KCkpOworICB9CisKKyAgZnVuY3Rpb24gaW5j
bHVkZShwYXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKSA+IC0xOwor
ICB9CisKKyAgZnVuY3Rpb24gc3RhcnRzV2l0aChwYXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMu
aW5kZXhPZihwYXR0ZXJuKSA9PT0gMDsKKyAgfQorCisgIGZ1bmN0aW9uIGVuZHNXaXRoKHBhdHRl
cm4pIHsKKyAgICB2YXIgZCA9IHRoaXMubGVuZ3RoIC0gcGF0dGVybi5sZW5ndGg7CisgICAgcmV0
dXJuIGQgPj0gMCAmJiB0aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4pID09PSBkOworICB9CisKKyAg
ZnVuY3Rpb24gZW1wdHkoKSB7CisgICAgcmV0dXJuIHRoaXMgPT0gJyc7CisgIH0KKworICBmdW5j
dGlvbiBibGFuaygpIHsKKyAgICByZXR1cm4gL15ccyokLy50ZXN0KHRoaXMpOworICB9CisKKyAg
ZnVuY3Rpb24gaW50ZXJwb2xhdGUob2JqZWN0LCBwYXR0ZXJuKSB7CisgICAgcmV0dXJuIG5ldyBU
ZW1wbGF0ZSh0aGlzLCBwYXR0ZXJuKS5ldmFsdWF0ZShvYmplY3QpOworICB9CisKKyAgcmV0dXJu
IHsKKyAgICBnc3ViOiAgICAgICAgICAgZ3N1YiwKKyAgICBzdWI6ICAgICAgICAgICAgc3ViLAor
ICAgIHNjYW46ICAgICAgICAgICBzY2FuLAorICAgIHRydW5jYXRlOiAgICAgICB0cnVuY2F0ZSwK
KyAgICBzdHJpcDogICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS50cmltID8gU3RyaW5nLnByb3Rv
dHlwZS50cmltIDogc3RyaXAsCisgICAgc3RyaXBUYWdzOiAgICAgIHN0cmlwVGFncywKKyAgICBz
dHJpcFNjcmlwdHM6ICAgc3RyaXBTY3JpcHRzLAorICAgIGV4dHJhY3RTY3JpcHRzOiBleHRyYWN0
U2NyaXB0cywKKyAgICBldmFsU2NyaXB0czogICAgZXZhbFNjcmlwdHMsCisgICAgZXNjYXBlSFRN
TDogICAgIGVzY2FwZUhUTUwsCisgICAgdW5lc2NhcGVIVE1MOiAgIHVuZXNjYXBlSFRNTCwKKyAg
ICB0b1F1ZXJ5UGFyYW1zOiAgdG9RdWVyeVBhcmFtcywKKyAgICBwYXJzZVF1ZXJ5OiAgICAgdG9R
dWVyeVBhcmFtcywKKyAgICB0b0FycmF5OiAgICAgICAgdG9BcnJheSwKKyAgICBzdWNjOiAgICAg
ICAgICAgc3VjYywKKyAgICB0aW1lczogICAgICAgICAgdGltZXMsCisgICAgY2FtZWxpemU6ICAg
ICAgIGNhbWVsaXplLAorICAgIGNhcGl0YWxpemU6ICAgICBjYXBpdGFsaXplLAorICAgIHVuZGVy
c2NvcmU6ICAgICB1bmRlcnNjb3JlLAorICAgIGRhc2hlcml6ZTogICAgICBkYXNoZXJpemUsCisg
ICAgaW5zcGVjdDogICAgICAgIGluc3BlY3QsCisgICAgdG9KU09OOiAgICAgICAgIHRvSlNPTiwK
KyAgICB1bmZpbHRlckpTT046ICAgdW5maWx0ZXJKU09OLAorICAgIGlzSlNPTjogICAgICAgICBp
c0pTT04sCisgICAgZXZhbEpTT046ICAgICAgIGV2YWxKU09OLAorICAgIGluY2x1ZGU6ICAgICAg
ICBpbmNsdWRlLAorICAgIHN0YXJ0c1dpdGg6ICAgICBzdGFydHNXaXRoLAorICAgIGVuZHNXaXRo
OiAgICAgICBlbmRzV2l0aCwKKyAgICBlbXB0eTogICAgICAgICAgZW1wdHksCisgICAgYmxhbms6
ICAgICAgICAgIGJsYW5rLAorICAgIGludGVycG9sYXRlOiAgICBpbnRlcnBvbGF0ZQorICB9Owor
fSkoKSk7CisKK3ZhciBUZW1wbGF0ZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1
bmN0aW9uKHRlbXBsYXRlLCBwYXR0ZXJuKSB7CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRl
LnRvU3RyaW5nKCk7CisgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybiB8fCBUZW1wbGF0ZS5QYXR0
ZXJuOworICB9LAorCisgIGV2YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICBpZiAob2Jq
ZWN0ICYmIE9iamVjdC5pc0Z1bmN0aW9uKG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKSkK
KyAgICAgIG9iamVjdCA9IG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCk7CisKKyAgICBy
ZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsK
KyAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuIChtYXRjaFsxXSArICcnKTsKKworICAg
ICAgdmFyIGJlZm9yZSA9IG1hdGNoWzFdIHx8ICcnOworICAgICAgaWYgKGJlZm9yZSA9PSAnXFwn
KSByZXR1cm4gbWF0Y2hbMl07CisKKyAgICAgIHZhciBjdHggPSBvYmplY3QsIGV4cHIgPSBtYXRj
aFszXTsKKyAgICAgIHZhciBwYXR0ZXJuID0gL14oW14uW10rfFxbKCg/Oi4qP1teXFxdKT8pXF0p
KFwufFxbfCQpLzsKKyAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKGV4cHIpOworICAgICAgaWYg
KG1hdGNoID09IG51bGwpIHJldHVybiBiZWZvcmU7CisKKyAgICAgIHdoaWxlIChtYXRjaCAhPSBu
dWxsKSB7CisgICAgICAgIHZhciBjb21wID0gbWF0Y2hbMV0uc3RhcnRzV2l0aCgnWycpID8gbWF0
Y2hbMl0ucmVwbGFjZSgvXFxcXF0vZywgJ10nKSA6IG1hdGNoWzFdOworICAgICAgICBjdHggPSBj
dHhbY29tcF07CisgICAgICAgIGlmIChudWxsID09IGN0eCB8fCAnJyA9PSBtYXRjaFszXSkgYnJl
YWs7CisgICAgICAgIGV4cHIgPSBleHByLnN1YnN0cmluZygnWycgPT0gbWF0Y2hbM10gPyBtYXRj
aFsxXS5sZW5ndGggOiBtYXRjaFswXS5sZW5ndGgpOworICAgICAgICBtYXRjaCA9IHBhdHRlcm4u
ZXhlYyhleHByKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJlZm9yZSArIFN0cmluZy5pbnRl
cnByZXQoY3R4KTsKKyAgICB9KTsKKyAgfQorfSk7CitUZW1wbGF0ZS5QYXR0ZXJuID0gLyhefC58
XHJ8XG4pKCNceyguKj8pXH0pLzsKKwordmFyICRicmVhayA9IHsgfTsKKwordmFyIEVudW1lcmFi
bGUgPSAoZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIGVhY2goaXRlcmF0b3IsIGNvbnRleHQpIHsK
KyAgICB2YXIgaW5kZXggPSAwOworICAgIHRyeSB7CisgICAgICB0aGlzLl9lYWNoKGZ1bmN0aW9u
KHZhbHVlKSB7CisgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4Kysp
OworICAgICAgfSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgIT0gJGJyZWFrKSB0
aHJvdyBlOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGZ1bmN0aW9uIGVhY2hT
bGljZShudW1iZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIGluZGV4ID0gLW51bWJl
ciwgc2xpY2VzID0gW10sIGFycmF5ID0gdGhpcy50b0FycmF5KCk7CisgICAgaWYgKG51bWJlciA8
IDEpIHJldHVybiBhcnJheTsKKyAgICB3aGlsZSAoKGluZGV4ICs9IG51bWJlcikgPCBhcnJheS5s
ZW5ndGgpCisgICAgICBzbGljZXMucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXgrbnVtYmVy
KSk7CisgICAgcmV0dXJuIHNsaWNlcy5jb2xsZWN0KGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgfQor
CisgIGZ1bmN0aW9uIGFsbChpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRl
cmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdCA9IHRydWU7CisgICAgdGhpcy5l
YWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmICEh
aXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKCFyZXN1bHQp
IHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgZnVu
Y3Rpb24gYW55KGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8
fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0ID0gZmFsc2U7CisgICAgdGhpcy5lYWNoKGZ1
bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKHJlc3VsdCA9ICEhaXRlcmF0b3IuY2Fs
bChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKQorICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgfSk7
CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbGxlY3QoaXRlcmF0b3Is
IGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAg
IHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkg
eworICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4
KSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICBmdW5jdGlvbiBkZXRl
Y3QoaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChm
dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQs
IHZhbHVlLCBpbmRleCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIHRocm93
ICRicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAg
ZnVuY3Rpb24gZmluZEFsbChpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHRzID0g
W107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKGl0
ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkKKyAgICAgICAgcmVzdWx0cy5wdXNo
KHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfQorCisgIGZ1bmN0aW9u
IGdyZXAoZmlsdGVyLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0
b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKworICAgIGlmIChPYmpl
Y3QuaXNTdHJpbmcoZmlsdGVyKSkKKyAgICAgIGZpbHRlciA9IG5ldyBSZWdFeHAoUmVnRXhwLmVz
Y2FwZShmaWx0ZXIpKTsKKworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsK
KyAgICAgIGlmIChmaWx0ZXIubWF0Y2godmFsdWUpKQorICAgICAgICByZXN1bHRzLnB1c2goaXRl
cmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4g
cmVzdWx0czsKKyAgfQorCisgIGZ1bmN0aW9uIGluY2x1ZGUob2JqZWN0KSB7CisgICAgaWYgKE9i
amVjdC5pc0Z1bmN0aW9uKHRoaXMuaW5kZXhPZikpCisgICAgICBpZiAodGhpcy5pbmRleE9mKG9i
amVjdCkgIT0gLTEpIHJldHVybiB0cnVlOworCisgICAgdmFyIGZvdW5kID0gZmFsc2U7CisgICAg
dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAodmFsdWUgPT0gb2JqZWN0KSB7
CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgdGhyb3cgJGJyZWFrOworICAgICAgfQor
ICAgIH0pOworICAgIHJldHVybiBmb3VuZDsKKyAgfQorCisgIGZ1bmN0aW9uIGluR3JvdXBzT2Yo
bnVtYmVyLCBmaWxsV2l0aCkgeworICAgIGZpbGxXaXRoID0gT2JqZWN0LmlzVW5kZWZpbmVkKGZp
bGxXaXRoKSA/IG51bGwgOiBmaWxsV2l0aDsKKyAgICByZXR1cm4gdGhpcy5lYWNoU2xpY2UobnVt
YmVyLCBmdW5jdGlvbihzbGljZSkgeworICAgICAgd2hpbGUoc2xpY2UubGVuZ3RoIDwgbnVtYmVy
KSBzbGljZS5wdXNoKGZpbGxXaXRoKTsKKyAgICAgIHJldHVybiBzbGljZTsKKyAgICB9KTsKKyAg
fQorCisgIGZ1bmN0aW9uIGluamVjdChtZW1vLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIHRo
aXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIG1lbW8gPSBpdGVyYXRvci5j
YWxsKGNvbnRleHQsIG1lbW8sIHZhbHVlLCBpbmRleCk7CisgICAgfSk7CisgICAgcmV0dXJuIG1l
bW87CisgIH0KKworICBmdW5jdGlvbiBpbnZva2UobWV0aG9kKSB7CisgICAgdmFyIGFyZ3MgPSAk
QShhcmd1bWVudHMpLnNsaWNlKDEpOworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1
ZSkgeworICAgICAgcmV0dXJuIHZhbHVlW21ldGhvZF0uYXBwbHkodmFsdWUsIGFyZ3MpOworICAg
IH0pOworICB9CisKKyAgZnVuY3Rpb24gbWF4KGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRl
cmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0OworICAgIHRo
aXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gaXRlcmF0b3Iu
Y2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8
IHZhbHVlID49IHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgfSk7CisgICAg
cmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIG1pbihpdGVyYXRvciwgY29udGV4dCkg
eworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3Vs
dDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICB2YWx1ZSA9
IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQg
PT0gbnVsbCB8fCB2YWx1ZSA8IHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAg
fSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnRpdGlvbihpdGVy
YXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7
CisgICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlv
bih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBp
bmRleCkgPworICAgICAgICB0cnVlcyA6IGZhbHNlcykucHVzaCh2YWx1ZSk7CisgICAgfSk7Cisg
ICAgcmV0dXJuIFt0cnVlcywgZmFsc2VzXTsKKyAgfQorCisgIGZ1bmN0aW9uIHBsdWNrKHByb3Bl
cnR5KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUpIHsKKyAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZVtwcm9wZXJ0eV0pOworICAgIH0pOworICAg
IHJldHVybiByZXN1bHRzOworICB9CisKKyAgZnVuY3Rpb24gcmVqZWN0KGl0ZXJhdG9yLCBjb250
ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUsIGluZGV4KSB7CisgICAgICBpZiAoIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGlu
ZGV4KSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4g
cmVzdWx0czsKKyAgfQorCisgIGZ1bmN0aW9uIHNvcnRCeShpdGVyYXRvciwgY29udGV4dCkgewor
ICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVy
biB7CisgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgY3JpdGVyaWE6IGl0ZXJhdG9yLmNh
bGwoY29udGV4dCwgdmFsdWUsIGluZGV4KQorICAgICAgfTsKKyAgICB9KS5zb3J0KGZ1bmN0aW9u
KGxlZnQsIHJpZ2h0KSB7CisgICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5j
cml0ZXJpYTsKKyAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKKyAgICB9
KS5wbHVjaygndmFsdWUnKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRvQXJyYXkoKSB7CisgICAgcmV0
dXJuIHRoaXMubWFwKCk7CisgIH0KKworICBmdW5jdGlvbiB6aXAoKSB7CisgICAgdmFyIGl0ZXJh
dG9yID0gUHJvdG90eXBlLkssIGFyZ3MgPSAkQShhcmd1bWVudHMpOworICAgIGlmIChPYmplY3Qu
aXNGdW5jdGlvbihhcmdzLmxhc3QoKSkpCisgICAgICBpdGVyYXRvciA9IGFyZ3MucG9wKCk7CisK
KyAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7CisgICAg
cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmV0dXJuIGl0
ZXJhdG9yKGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7CisgICAgfSk7CisgIH0KKworICBmdW5j
dGlvbiBzaXplKCkgeworICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7CisgIH0KKwor
ICBmdW5jdGlvbiBpbnNwZWN0KCkgeworICAgIHJldHVybiAnIzxFbnVtZXJhYmxlOicgKyB0aGlz
LnRvQXJyYXkoKS5pbnNwZWN0KCkgKyAnPic7CisgIH0KKworCisKKworCisKKworCisKKyAgcmV0
dXJuIHsKKyAgICBlYWNoOiAgICAgICBlYWNoLAorICAgIGVhY2hTbGljZTogIGVhY2hTbGljZSwK
KyAgICBhbGw6ICAgICAgICBhbGwsCisgICAgZXZlcnk6ICAgICAgYWxsLAorICAgIGFueTogICAg
ICAgIGFueSwKKyAgICBzb21lOiAgICAgICBhbnksCisgICAgY29sbGVjdDogICAgY29sbGVjdCwK
KyAgICBtYXA6ICAgICAgICBjb2xsZWN0LAorICAgIGRldGVjdDogICAgIGRldGVjdCwKKyAgICBm
aW5kQWxsOiAgICBmaW5kQWxsLAorICAgIHNlbGVjdDogICAgIGZpbmRBbGwsCisgICAgZmlsdGVy
OiAgICAgZmluZEFsbCwKKyAgICBncmVwOiAgICAgICBncmVwLAorICAgIGluY2x1ZGU6ICAgIGlu
Y2x1ZGUsCisgICAgbWVtYmVyOiAgICAgaW5jbHVkZSwKKyAgICBpbkdyb3Vwc09mOiBpbkdyb3Vw
c09mLAorICAgIGluamVjdDogICAgIGluamVjdCwKKyAgICBpbnZva2U6ICAgICBpbnZva2UsCisg
ICAgbWF4OiAgICAgICAgbWF4LAorICAgIG1pbjogICAgICAgIG1pbiwKKyAgICBwYXJ0aXRpb246
ICBwYXJ0aXRpb24sCisgICAgcGx1Y2s6ICAgICAgcGx1Y2ssCisgICAgcmVqZWN0OiAgICAgcmVq
ZWN0LAorICAgIHNvcnRCeTogICAgIHNvcnRCeSwKKyAgICB0b0FycmF5OiAgICB0b0FycmF5LAor
ICAgIGVudHJpZXM6ICAgIHRvQXJyYXksCisgICAgemlwOiAgICAgICAgemlwLAorICAgIHNpemU6
ICAgICAgIHNpemUsCisgICAgaW5zcGVjdDogICAgaW5zcGVjdCwKKyAgICBmaW5kOiAgICAgICBk
ZXRlY3QKKyAgfTsKK30pKCk7CitmdW5jdGlvbiAkQShpdGVyYWJsZSkgeworICBpZiAoIWl0ZXJh
YmxlKSByZXR1cm4gW107CisgIGlmICgndG9BcnJheScgaW4gT2JqZWN0KGl0ZXJhYmxlKSkgcmV0
dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKKyAgdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCB8
fCAwLCByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7CisgIHdoaWxlIChsZW5ndGgtLSkgcmVz
dWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVuZ3RoXTsKKyAgcmV0dXJuIHJlc3VsdHM7Cit9CisK
K2Z1bmN0aW9uICR3KHN0cmluZykgeworICBpZiAoIU9iamVjdC5pc1N0cmluZyhzdHJpbmcpKSBy
ZXR1cm4gW107CisgIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpOworICByZXR1cm4gc3RyaW5nID8g
c3RyaW5nLnNwbGl0KC9ccysvKSA6IFtdOworfQorCitBcnJheS5mcm9tID0gJEE7CisKKworKGZ1
bmN0aW9uKCkgeworICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwKKyAgICAgIHNs
aWNlID0gYXJyYXlQcm90by5zbGljZSwKKyAgICAgIF9lYWNoID0gYXJyYXlQcm90by5mb3JFYWNo
OyAvLyB1c2UgbmF0aXZlIGJyb3dzZXIgSlMgMS42IGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJs
ZQorCisgIGZ1bmN0aW9uIGVhY2goaXRlcmF0b3IpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVu
Z3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGl0ZXJhdG9yKHRoaXNb
aV0pOworICB9CisgIGlmICghX2VhY2gpIF9lYWNoID0gZWFjaDsKKworICBmdW5jdGlvbiBjbGVh
cigpIHsKKyAgICB0aGlzLmxlbmd0aCA9IDA7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBm
dW5jdGlvbiBmaXJzdCgpIHsKKyAgICByZXR1cm4gdGhpc1swXTsKKyAgfQorCisgIGZ1bmN0aW9u
IGxhc3QoKSB7CisgICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKKyAgfQorCisgIGZ1
bmN0aW9uIGNvbXBhY3QoKSB7CisgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVl
KSB7CisgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbDsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0
aW9uIGZsYXR0ZW4oKSB7CisgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJh
eSwgdmFsdWUpIHsKKyAgICAgIGlmIChPYmplY3QuaXNBcnJheSh2YWx1ZSkpCisgICAgICAgIHJl
dHVybiBhcnJheS5jb25jYXQodmFsdWUuZmxhdHRlbigpKTsKKyAgICAgIGFycmF5LnB1c2godmFs
dWUpOworICAgICAgcmV0dXJuIGFycmF5OworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gd2l0
aG91dCgpIHsKKyAgICB2YXIgdmFsdWVzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOworICAg
IHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuICF2YWx1
ZXMuaW5jbHVkZSh2YWx1ZSk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiByZXZlcnNlKGlu
bGluZSkgeworICAgIHJldHVybiAoaW5saW5lICE9PSBmYWxzZSA/IHRoaXMgOiB0aGlzLnRvQXJy
YXkoKSkuX3JldmVyc2UoKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVuaXEoc29ydGVkKSB7CisgICAg
cmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUsIGluZGV4KSB7Cisg
ICAgICBpZiAoMCA9PSBpbmRleCB8fCAoc29ydGVkID8gYXJyYXkubGFzdCgpICE9IHZhbHVlIDog
IWFycmF5LmluY2x1ZGUodmFsdWUpKSkKKyAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7CisgICAg
ICByZXR1cm4gYXJyYXk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBpbnRlcnNlY3QoYXJy
YXkpIHsKKyAgICByZXR1cm4gdGhpcy51bmlxKCkuZmluZEFsbChmdW5jdGlvbihpdGVtKSB7Cisg
ICAgICByZXR1cm4gYXJyYXkuZGV0ZWN0KGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpdGVtID09
PSB2YWx1ZSB9KTsKKyAgICB9KTsKKyAgfQorCisKKyAgZnVuY3Rpb24gY2xvbmUoKSB7CisgICAg
cmV0dXJuIHNsaWNlLmNhbGwodGhpcywgMCk7CisgIH0KKworICBmdW5jdGlvbiBzaXplKCkgewor
ICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgfQorCisgIGZ1bmN0aW9uIGluc3BlY3QoKSB7Cisg
ICAgcmV0dXJuICdbJyArIHRoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10n
OworICB9CisKKyAgZnVuY3Rpb24gdG9KU09OKCkgeworICAgIHZhciByZXN1bHRzID0gW107Cisg
ICAgdGhpcy5lYWNoKGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgdmFyIHZhbHVlID0gT2JqZWN0
LnRvSlNPTihvYmplY3QpOworICAgICAgaWYgKCFPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSBy
ZXN1bHRzLnB1c2godmFsdWUpOworICAgIH0pOworICAgIHJldHVybiAnWycgKyByZXN1bHRzLmpv
aW4oJywgJykgKyAnXSc7CisgIH0KKworICBmdW5jdGlvbiBpbmRleE9mKGl0ZW0sIGkpIHsKKyAg
ICBpIHx8IChpID0gMCk7CisgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgIGlmIChp
IDwgMCkgaSA9IGxlbmd0aCArIGk7CisgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAg
IGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7CisgIH0KKwor
ICBmdW5jdGlvbiBsYXN0SW5kZXhPZihpdGVtLCBpKSB7CisgICAgaSA9IGlzTmFOKGkpID8gdGhp
cy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0aCArIGkgOiBpKSArIDE7CisgICAgdmFyIG4g
PSB0aGlzLnNsaWNlKDAsIGkpLnJldmVyc2UoKS5pbmRleE9mKGl0ZW0pOworICAgIHJldHVybiAo
biA8IDApID8gbiA6IGkgLSBuIC0gMTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvbmNhdCgpIHsKKyAg
ICB2YXIgYXJyYXkgPSBzbGljZS5jYWxsKHRoaXMsIDApLCBpdGVtOworICAgIGZvciAodmFyIGkg
PSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAg
IGl0ZW0gPSBhcmd1bWVudHNbaV07CisgICAgICBpZiAoT2JqZWN0LmlzQXJyYXkoaXRlbSkgJiYg
ISgnY2FsbGVlJyBpbiBpdGVtKSkgeworICAgICAgICBmb3IgKHZhciBqID0gMCwgYXJyYXlMZW5n
dGggPSBpdGVtLmxlbmd0aDsgaiA8IGFycmF5TGVuZ3RoOyBqKyspCisgICAgICAgICAgYXJyYXku
cHVzaChpdGVtW2pdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFycmF5LnB1c2goaXRlbSk7
CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhcnJheTsKKyAgfQorCisgIE9iamVjdC5leHRl
bmQoYXJyYXlQcm90bywgRW51bWVyYWJsZSk7CisKKyAgaWYgKCFhcnJheVByb3RvLl9yZXZlcnNl
KQorICAgIGFycmF5UHJvdG8uX3JldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7CisKKyAgT2Jq
ZWN0LmV4dGVuZChhcnJheVByb3RvLCB7CisgICAgX2VhY2g6ICAgICBfZWFjaCwKKyAgICBjbGVh
cjogICAgIGNsZWFyLAorICAgIGZpcnN0OiAgICAgZmlyc3QsCisgICAgbGFzdDogICAgICBsYXN0
LAorICAgIGNvbXBhY3Q6ICAgY29tcGFjdCwKKyAgICBmbGF0dGVuOiAgIGZsYXR0ZW4sCisgICAg
d2l0aG91dDogICB3aXRob3V0LAorICAgIHJldmVyc2U6ICAgcmV2ZXJzZSwKKyAgICB1bmlxOiAg
ICAgIHVuaXEsCisgICAgaW50ZXJzZWN0OiBpbnRlcnNlY3QsCisgICAgY2xvbmU6ICAgICBjbG9u
ZSwKKyAgICB0b0FycmF5OiAgIGNsb25lLAorICAgIHNpemU6ICAgICAgc2l6ZSwKKyAgICBpbnNw
ZWN0OiAgIGluc3BlY3QsCisgICAgdG9KU09OOiAgICB0b0pTT04KKyAgfSk7CisKKyAgdmFyIENP
TkNBVF9BUkdVTUVOVFNfQlVHR1kgPSAoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFtdLmNvbmNh
dChhcmd1bWVudHMpWzBdWzBdICE9PSAxOworICB9KSgxLDIpCisKKyAgaWYgKENPTkNBVF9BUkdV
TUVOVFNfQlVHR1kpIGFycmF5UHJvdG8uY29uY2F0ID0gY29uY2F0OworCisgIGlmICghYXJyYXlQ
cm90by5pbmRleE9mKSBhcnJheVByb3RvLmluZGV4T2YgPSBpbmRleE9mOworICBpZiAoIWFycmF5
UHJvdG8ubGFzdEluZGV4T2YpIGFycmF5UHJvdG8ubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjsK
K30pKCk7CitmdW5jdGlvbiAkSChvYmplY3QpIHsKKyAgcmV0dXJuIG5ldyBIYXNoKG9iamVjdCk7
Cit9OworCit2YXIgSGFzaCA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCAoZnVuY3Rpb24oKSB7
CisgIGZ1bmN0aW9uIGluaXRpYWxpemUob2JqZWN0KSB7CisgICAgdGhpcy5fb2JqZWN0ID0gT2Jq
ZWN0LmlzSGFzaChvYmplY3QpID8gb2JqZWN0LnRvT2JqZWN0KCkgOiBPYmplY3QuY2xvbmUob2Jq
ZWN0KTsKKyAgfQorCisgIGZ1bmN0aW9uIF9lYWNoKGl0ZXJhdG9yKSB7CisgICAgZm9yICh2YXIg
a2V5IGluIHRoaXMuX29iamVjdCkgeworICAgICAgdmFyIHZhbHVlID0gdGhpcy5fb2JqZWN0W2tl
eV0sIHBhaXIgPSBba2V5LCB2YWx1ZV07CisgICAgICBwYWlyLmtleSA9IGtleTsKKyAgICAgIHBh
aXIudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGl0ZXJhdG9yKHBhaXIpOworICAgIH0KKyAgfQorCisg
IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CisgICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXld
ID0gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiBnZXQoa2V5KSB7CisgICAgaWYgKHRoaXMuX29i
amVjdFtrZXldICE9PSBPYmplY3QucHJvdG90eXBlW2tleV0pCisgICAgICByZXR1cm4gdGhpcy5f
b2JqZWN0W2tleV07CisgIH0KKworICBmdW5jdGlvbiB1bnNldChrZXkpIHsKKyAgICB2YXIgdmFs
dWUgPSB0aGlzLl9vYmplY3Rba2V5XTsKKyAgICBkZWxldGUgdGhpcy5fb2JqZWN0W2tleV07Cisg
ICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gdG9PYmplY3QoKSB7CisgICAgcmV0
dXJuIE9iamVjdC5jbG9uZSh0aGlzLl9vYmplY3QpOworICB9CisKKyAgZnVuY3Rpb24ga2V5cygp
IHsKKyAgICByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7CisgIH0KKworICBmdW5jdGlvbiB2YWx1
ZXMoKSB7CisgICAgcmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7CisgIH0KKworICBmdW5jdGlv
biBpbmRleCh2YWx1ZSkgeworICAgIHZhciBtYXRjaCA9IHRoaXMuZGV0ZWN0KGZ1bmN0aW9uKHBh
aXIpIHsKKyAgICAgIHJldHVybiBwYWlyLnZhbHVlID09PSB2YWx1ZTsKKyAgICB9KTsKKyAgICBy
ZXR1cm4gbWF0Y2ggJiYgbWF0Y2gua2V5OworICB9CisKKyAgZnVuY3Rpb24gbWVyZ2Uob2JqZWN0
KSB7CisgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS51cGRhdGUob2JqZWN0KTsKKyAgfQorCisgIGZ1
bmN0aW9uIHVwZGF0ZShvYmplY3QpIHsKKyAgICByZXR1cm4gbmV3IEhhc2gob2JqZWN0KS5pbmpl
Y3QodGhpcywgZnVuY3Rpb24ocmVzdWx0LCBwYWlyKSB7CisgICAgICByZXN1bHQuc2V0KHBhaXIu
a2V5LCBwYWlyLnZhbHVlKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSk7CisgIH0KKwor
ICBmdW5jdGlvbiB0b1F1ZXJ5UGFpcihrZXksIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1Vu
ZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBrZXk7CisgICAgcmV0dXJuIGtleSArICc9JyArIGVuY29k
ZVVSSUNvbXBvbmVudChTdHJpbmcuaW50ZXJwcmV0KHZhbHVlKSk7CisgIH0KKworICBmdW5jdGlv
biB0b1F1ZXJ5U3RyaW5nKCkgeworICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24o
cmVzdWx0cywgcGFpcikgeworICAgICAgdmFyIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYWly
LmtleSksIHZhbHVlcyA9IHBhaXIudmFsdWU7CisKKyAgICAgIGlmICh2YWx1ZXMgJiYgdHlwZW9m
IHZhbHVlcyA9PSAnb2JqZWN0JykgeworICAgICAgICBpZiAoT2JqZWN0LmlzQXJyYXkodmFsdWVz
KSkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0cy5jb25jYXQodmFsdWVzLm1hcCh0b1F1ZXJ5UGFp
ci5jdXJyeShrZXkpKSk7CisgICAgICB9IGVsc2UgcmVzdWx0cy5wdXNoKHRvUXVlcnlQYWlyKGtl
eSwgdmFsdWVzKSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9KS5qb2luKCcmJyk7Cisg
IH0KKworICBmdW5jdGlvbiBpbnNwZWN0KCkgeworICAgIHJldHVybiAnIzxIYXNoOnsnICsgdGhp
cy5tYXAoZnVuY3Rpb24ocGFpcikgeworICAgICAgcmV0dXJuIHBhaXIubWFwKE9iamVjdC5pbnNw
ZWN0KS5qb2luKCc6ICcpOworICAgIH0pLmpvaW4oJywgJykgKyAnfT4nOworICB9CisKKyAgZnVu
Y3Rpb24gdG9KU09OKCkgeworICAgIHJldHVybiBPYmplY3QudG9KU09OKHRoaXMudG9PYmplY3Qo
KSk7CisgIH0KKworICBmdW5jdGlvbiBjbG9uZSgpIHsKKyAgICByZXR1cm4gbmV3IEhhc2godGhp
cyk7CisgIH0KKworICByZXR1cm4geworICAgIGluaXRpYWxpemU6ICAgICAgICAgICAgIGluaXRp
YWxpemUsCisgICAgX2VhY2g6ICAgICAgICAgICAgICAgICAgX2VhY2gsCisgICAgc2V0OiAgICAg
ICAgICAgICAgICAgICAgc2V0LAorICAgIGdldDogICAgICAgICAgICAgICAgICAgIGdldCwKKyAg
ICB1bnNldDogICAgICAgICAgICAgICAgICB1bnNldCwKKyAgICB0b09iamVjdDogICAgICAgICAg
ICAgICB0b09iamVjdCwKKyAgICB0b1RlbXBsYXRlUmVwbGFjZW1lbnRzOiB0b09iamVjdCwKKyAg
ICBrZXlzOiAgICAgICAgICAgICAgICAgICBrZXlzLAorICAgIHZhbHVlczogICAgICAgICAgICAg
ICAgIHZhbHVlcywKKyAgICBpbmRleDogICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICBtZXJn
ZTogICAgICAgICAgICAgICAgICBtZXJnZSwKKyAgICB1cGRhdGU6ICAgICAgICAgICAgICAgICB1
cGRhdGUsCisgICAgdG9RdWVyeVN0cmluZzogICAgICAgICAgdG9RdWVyeVN0cmluZywKKyAgICBp
bnNwZWN0OiAgICAgICAgICAgICAgICBpbnNwZWN0LAorICAgIHRvSlNPTjogICAgICAgICAgICAg
ICAgIHRvSlNPTiwKKyAgICBjbG9uZTogICAgICAgICAgICAgICAgICBjbG9uZQorICB9OworfSko
KSk7CisKK0hhc2guZnJvbSA9ICRIOworT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLCAo
ZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIHRvQ29sb3JQYXJ0KCkgeworICAgIHJldHVybiB0aGlz
LnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgfQorCisgIGZ1bmN0aW9uIHN1Y2MoKSB7CisgICAg
cmV0dXJuIHRoaXMgKyAxOworICB9CisKKyAgZnVuY3Rpb24gdGltZXMoaXRlcmF0b3IsIGNvbnRl
eHQpIHsKKyAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAg
ICByZXR1cm4gdGhpczsKKyAgfQorCisgIGZ1bmN0aW9uIHRvUGFkZGVkU3RyaW5nKGxlbmd0aCwg
cmFkaXgpIHsKKyAgICB2YXIgc3RyaW5nID0gdGhpcy50b1N0cmluZyhyYWRpeCB8fCAxMCk7Cisg
ICAgcmV0dXJuICcwJy50aW1lcyhsZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZzsKKyAg
fQorCisgIGZ1bmN0aW9uIHRvSlNPTigpIHsKKyAgICByZXR1cm4gaXNGaW5pdGUodGhpcykgPyB0
aGlzLnRvU3RyaW5nKCkgOiAnbnVsbCc7CisgIH0KKworICBmdW5jdGlvbiBhYnMoKSB7CisgICAg
cmV0dXJuIE1hdGguYWJzKHRoaXMpOworICB9CisKKyAgZnVuY3Rpb24gcm91bmQoKSB7CisgICAg
cmV0dXJuIE1hdGgucm91bmQodGhpcyk7CisgIH0KKworICBmdW5jdGlvbiBjZWlsKCkgeworICAg
IHJldHVybiBNYXRoLmNlaWwodGhpcyk7CisgIH0KKworICBmdW5jdGlvbiBmbG9vcigpIHsKKyAg
ICByZXR1cm4gTWF0aC5mbG9vcih0aGlzKTsKKyAgfQorCisgIHJldHVybiB7CisgICAgdG9Db2xv
clBhcnQ6ICAgIHRvQ29sb3JQYXJ0LAorICAgIHN1Y2M6ICAgICAgICAgICBzdWNjLAorICAgIHRp
bWVzOiAgICAgICAgICB0aW1lcywKKyAgICB0b1BhZGRlZFN0cmluZzogdG9QYWRkZWRTdHJpbmcs
CisgICAgdG9KU09OOiAgICAgICAgIHRvSlNPTiwKKyAgICBhYnM6ICAgICAgICAgICAgYWJzLAor
ICAgIHJvdW5kOiAgICAgICAgICByb3VuZCwKKyAgICBjZWlsOiAgICAgICAgICAgY2VpbCwKKyAg
ICBmbG9vcjogICAgICAgICAgZmxvb3IKKyAgfTsKK30pKCkpOworCitmdW5jdGlvbiAkUihzdGFy
dCwgZW5kLCBleGNsdXNpdmUpIHsKKyAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCwgZW5k
LCBleGNsdXNpdmUpOworfQorCit2YXIgT2JqZWN0UmFuZ2UgPSBDbGFzcy5jcmVhdGUoRW51bWVy
YWJsZSwgKGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBpbml0aWFsaXplKHN0YXJ0LCBlbmQsIGV4
Y2x1c2l2ZSkgeworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB0aGlzLmVuZCA9IGVuZDsK
KyAgICB0aGlzLmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKKyAgfQorCisgIGZ1bmN0aW9uIF9lYWNo
KGl0ZXJhdG9yKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsKKyAgICB3aGlsZSAodGhp
cy5pbmNsdWRlKHZhbHVlKSkgeworICAgICAgaXRlcmF0b3IodmFsdWUpOworICAgICAgdmFsdWUg
PSB2YWx1ZS5zdWNjKCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gaW5jbHVkZSh2YWx1ZSkg
eworICAgIGlmICh2YWx1ZSA8IHRoaXMuc3RhcnQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKHRoaXMuZXhjbHVzaXZlKQorICAgICAgcmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7CisgICAg
cmV0dXJuIHZhbHVlIDw9IHRoaXMuZW5kOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBpbml0aWFs
aXplOiBpbml0aWFsaXplLAorICAgIF9lYWNoOiAgICAgIF9lYWNoLAorICAgIGluY2x1ZGU6ICAg
IGluY2x1ZGUKKyAgfTsKK30pKCkpOworCisKKwordmFyIEFqYXggPSB7CisgIGdldFRyYW5zcG9y
dDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFRyeS50aGVzZSgKKyAgICAgIGZ1bmN0aW9uKCkg
e3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKX0sCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4g
bmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyl9LAorICAgICAgZnVuY3Rpb24oKSB7
cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpfQorICAgICkgfHwg
ZmFsc2U7CisgIH0sCisKKyAgYWN0aXZlUmVxdWVzdENvdW50OiAwCit9OworCitBamF4LlJlc3Bv
bmRlcnMgPSB7CisgIHJlc3BvbmRlcnM6IFtdLAorCisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRv
cikgeworICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7CisgIH0sCisKKyAgcmVn
aXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgIGlmICghdGhpcy5pbmNsdWRlKHJlc3Bv
bmRlcikpCisgICAgICB0aGlzLnJlc3BvbmRlcnMucHVzaChyZXNwb25kZXIpOworICB9LAorCisg
IHVucmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgIHRoaXMucmVzcG9uZGVycyA9
IHRoaXMucmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcik7CisgIH0sCisKKyAgZGlzcGF0Y2g6
IGZ1bmN0aW9uKGNhbGxiYWNrLCByZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb24pIHsKKyAgICB0aGlz
LmVhY2goZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24o
cmVzcG9uZGVyW2NhbGxiYWNrXSkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25k
ZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlciwgW3JlcXVlc3QsIHRyYW5zcG9ydCwganNvbl0p
OworICAgICAgICB9IGNhdGNoIChlKSB7IH0KKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfTsKKwor
T2JqZWN0LmV4dGVuZChBamF4LlJlc3BvbmRlcnMsIEVudW1lcmFibGUpOworCitBamF4LlJlc3Bv
bmRlcnMucmVnaXN0ZXIoeworICBvbkNyZWF0ZTogICBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVS
ZXF1ZXN0Q291bnQrKyB9LAorICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVS
ZXF1ZXN0Q291bnQtLSB9Cit9KTsKK0FqYXguQmFzZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRp
YWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICB0aGlzLm9wdGlvbnMgPSB7CisgICAgICBt
ZXRob2Q6ICAgICAgICdwb3N0JywKKyAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwKKyAgICAgIGNv
bnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCisgICAgICBl
bmNvZGluZzogICAgICdVVEYtOCcsCisgICAgICBwYXJhbWV0ZXJzOiAgICcnLAorICAgICAgZXZh
bEpTT046ICAgICB0cnVlLAorICAgICAgZXZhbEpTOiAgICAgICB0cnVlCisgICAgfTsKKyAgICBP
YmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyB8fCB7IH0pOworCisgICAgdGhpcy5v
cHRpb25zLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2QudG9Mb3dlckNhc2UoKTsKKworICAg
IGlmIChPYmplY3QuaXNTdHJpbmcodGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhp
cy5vcHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycy50b1F1ZXJ5UGFy
YW1zKCk7CisgICAgZWxzZSBpZiAoT2JqZWN0LmlzSGFzaCh0aGlzLm9wdGlvbnMucGFyYW1ldGVy
cykpCisgICAgICB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyA9IHRoaXMub3B0aW9ucy5wYXJhbWV0
ZXJzLnRvT2JqZWN0KCk7CisgIH0KK30pOworQWpheC5SZXF1ZXN0ID0gQ2xhc3MuY3JlYXRlKEFq
YXguQmFzZSwgeworICBfY29tcGxldGU6IGZhbHNlLAorCisgIGluaXRpYWxpemU6IGZ1bmN0aW9u
KCRzdXBlciwgdXJsLCBvcHRpb25zKSB7CisgICAgJHN1cGVyKG9wdGlvbnMpOworICAgIHRoaXMu
dHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsKKyAgICB0aGlzLnJlcXVlc3QodXJsKTsK
KyAgfSwKKworICByZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsKKyAgICB0aGlzLnVybCA9IHVybDsK
KyAgICB0aGlzLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2Q7CisgICAgdmFyIHBhcmFtcyA9
IE9iamVjdC5jbG9uZSh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7CisKKyAgICBpZiAoIVsnZ2V0
JywgJ3Bvc3QnXS5pbmNsdWRlKHRoaXMubWV0aG9kKSkgeworICAgICAgcGFyYW1zWydfbWV0aG9k
J10gPSB0aGlzLm1ldGhvZDsKKyAgICAgIHRoaXMubWV0aG9kID0gJ3Bvc3QnOworICAgIH0KKwor
ICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtczsKKworICAgIGlmIChwYXJhbXMgPSBPYmplY3Qu
dG9RdWVyeVN0cmluZyhwYXJhbXMpKSB7CisgICAgICBpZiAodGhpcy5tZXRob2QgPT0gJ2dldCcp
CisgICAgICAgIHRoaXMudXJsICs9ICh0aGlzLnVybC5pbmNsdWRlKCc/JykgPyAnJicgOiAnPycp
ICsgcGFyYW1zOworICAgICAgZWxzZSBpZiAoL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvLnRlc3Qo
bmF2aWdhdG9yLnVzZXJBZ2VudCkpCisgICAgICAgIHBhcmFtcyArPSAnJl89JzsKKyAgICB9CisK
KyAgICB0cnkgeworICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IEFqYXguUmVzcG9uc2UodGhpcyk7
CisgICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JlYXRlKSB0aGlzLm9wdGlvbnMub25DcmVhdGUo
cmVzcG9uc2UpOworICAgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkNyZWF0ZScsIHRo
aXMsIHJlc3BvbnNlKTsKKworICAgICAgdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50
b1VwcGVyQ2FzZSgpLCB0aGlzLnVybCwKKyAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91
cyk7CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKSB0aGlzLnJlc3BvbmRU
b1JlYWR5U3RhdGUuYmluZCh0aGlzKS5kZWZlcigxKTsKKworICAgICAgdGhpcy50cmFuc3BvcnQu
b25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7CisgICAg
ICB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7CisKKyAgICAgIHRoaXMuYm9keSA9IHRoaXMubWV0
aG9kID09ICdwb3N0JyA/ICh0aGlzLm9wdGlvbnMucG9zdEJvZHkgfHwgcGFyYW1zKSA6IG51bGw7
CisgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMuYm9keSk7CisKKyAgICAgIC8qIEZvcmNl
IEZpcmVmb3ggdG8gaGFuZGxlIHJlYWR5IHN0YXRlIDQgZm9yIHN5bmNocm9ub3VzIHJlcXVlc3Rz
ICovCisgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMgJiYgdGhpcy50cmFuc3Bv
cnQub3ZlcnJpZGVNaW1lVHlwZSkKKyAgICAgICAgdGhpcy5vblN0YXRlQ2hhbmdlKCk7CisKKyAg
ICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7Cisg
ICAgfQorICB9LAorCisgIG9uU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHZhciByZWFk
eVN0YXRlID0gdGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZTsKKyAgICBpZiAocmVhZHlTdGF0ZSA+
IDEgJiYgISgocmVhZHlTdGF0ZSA9PSA0KSAmJiB0aGlzLl9jb21wbGV0ZSkpCisgICAgICB0aGlz
LnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZSk7CisgIH0sCisK
KyAgc2V0UmVxdWVzdEhlYWRlcnM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBoZWFkZXJzID0gewor
ICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLAorICAgICAgJ1gtUHJv
dG90eXBlLVZlcnNpb24nOiBQcm90b3R5cGUuVmVyc2lvbiwKKyAgICAgICdBY2NlcHQnOiAndGV4
dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKicK
KyAgICB9OworCisgICAgaWYgKHRoaXMubWV0aG9kID09ICdwb3N0JykgeworICAgICAgaGVhZGVy
c1snQ29udGVudC10eXBlJ10gPSB0aGlzLm9wdGlvbnMuY29udGVudFR5cGUgKworICAgICAgICAo
dGhpcy5vcHRpb25zLmVuY29kaW5nID8gJzsgY2hhcnNldD0nICsgdGhpcy5vcHRpb25zLmVuY29k
aW5nIDogJycpOworCisgICAgICAvKiBGb3JjZSAiQ29ubmVjdGlvbjogY2xvc2UiIGZvciBvbGRl
ciBNb3ppbGxhIGJyb3dzZXJzIHRvIHdvcmsKKyAgICAgICAqIGFyb3VuZCBhIGJ1ZyB3aGVyZSBY
TUxIdHRwUmVxdWVzdCBzZW5kcyBhbiBpbmNvcnJlY3QKKyAgICAgICAqIENvbnRlbnQtbGVuZ3Ro
IGhlYWRlci4gU2VlIE1vemlsbGEgQnVnemlsbGEgIzI0NjY1MS4KKyAgICAgICAqLworICAgICAg
aWYgKHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUgJiYKKyAgICAgICAgICAobmF2aWdh
dG9yLnVzZXJBZ2VudC5tYXRjaCgvR2Vja29cLyhcZHs0fSkvKSB8fCBbMCwyMDA1XSlbMV0gPCAy
MDA1KQorICAgICAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2Nsb3NlJzsKKyAgICB9
CisKKyAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyA9PSAnb2JqZWN0
JykgeworICAgICAgdmFyIGV4dHJhcyA9IHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyczsKKwor
ICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGV4dHJhcy5wdXNoKSkKKyAgICAgICAgZm9yICh2
YXIgaSA9IDAsIGxlbmd0aCA9IGV4dHJhcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMikKKyAg
ICAgICAgICBoZWFkZXJzW2V4dHJhc1tpXV0gPSBleHRyYXNbaSsxXTsKKyAgICAgIGVsc2UKKyAg
ICAgICAgJEgoZXh0cmFzKS5lYWNoKGZ1bmN0aW9uKHBhaXIpIHsgaGVhZGVyc1twYWlyLmtleV0g
PSBwYWlyLnZhbHVlIH0pOworICAgIH0KKworICAgIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykK
KyAgICAgIHRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1l
XSk7CisgIH0sCisKKyAgc3VjY2VzczogZnVuY3Rpb24oKSB7CisgICAgdmFyIHN0YXR1cyA9IHRo
aXMuZ2V0U3RhdHVzKCk7CisgICAgcmV0dXJuICFzdGF0dXMgfHwgKHN0YXR1cyA+PSAyMDAgJiYg
c3RhdHVzIDwgMzAwKTsKKyAgfSwKKworICBnZXRTdGF0dXM6IGZ1bmN0aW9uKCkgeworICAgIHRy
eSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RhdHVzIHx8IDA7CisgICAgfSBjYXRj
aCAoZSkgeyByZXR1cm4gMCB9CisgIH0sCisKKyAgcmVzcG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rp
b24ocmVhZHlTdGF0ZSkgeworICAgIHZhciBzdGF0ZSA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVh
ZHlTdGF0ZV0sIHJlc3BvbnNlID0gbmV3IEFqYXguUmVzcG9uc2UodGhpcyk7CisKKyAgICBpZiAo
c3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5fY29tcGxl
dGUgPSB0cnVlOworICAgICAgICAodGhpcy5vcHRpb25zWydvbicgKyByZXNwb25zZS5zdGF0dXNd
CisgICAgICAgICB8fCB0aGlzLm9wdGlvbnNbJ29uJyArICh0aGlzLnN1Y2Nlc3MoKSA/ICdTdWNj
ZXNzJyA6ICdGYWlsdXJlJyldCisgICAgICAgICB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiko
cmVzcG9uc2UsIHJlc3BvbnNlLmhlYWRlckpTT04pOworICAgICAgfSBjYXRjaCAoZSkgeworICAg
ICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgICAgfQorCisgICAgICB2YXIgY29u
dGVudFR5cGUgPSByZXNwb25zZS5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpOworICAgICAgaWYg
KHRoaXMub3B0aW9ucy5ldmFsSlMgPT0gJ2ZvcmNlJworICAgICAgICAgIHx8ICh0aGlzLm9wdGlv
bnMuZXZhbEpTICYmIHRoaXMuaXNTYW1lT3JpZ2luKCkgJiYgY29udGVudFR5cGUKKyAgICAgICAg
ICAmJiBjb250ZW50VHlwZS5tYXRjaCgvXlxzKih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT8oamF2
YXxlY21hKXNjcmlwdCg7LiopP1xzKiQvaSkpKQorICAgICAgICB0aGlzLmV2YWxSZXNwb25zZSgp
OworICAgIH0KKworICAgIHRyeSB7CisgICAgICAodGhpcy5vcHRpb25zWydvbicgKyBzdGF0ZV0g
fHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09O
KTsKKyAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nICsgc3RhdGUsIHRoaXMsIHJl
c3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0
aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSAnQ29t
cGxldGUnKSB7CisgICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBQcm90
b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICB9CisgIH0sCisKKyAgaXNTYW1lT3JpZ2luOiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgbSA9IHRoaXMudXJsLm1hdGNoKC9eXHMqaHR0cHM/OlwvXC9bXlwv
XSovKTsKKyAgICByZXR1cm4gIW0gfHwgKG1bMF0gPT0gJyN7cHJvdG9jb2x9Ly8je2RvbWFpbn0j
e3BvcnR9Jy5pbnRlcnBvbGF0ZSh7CisgICAgICBwcm90b2NvbDogbG9jYXRpb24ucHJvdG9jb2ws
CisgICAgICBkb21haW46IGRvY3VtZW50LmRvbWFpbiwKKyAgICAgIHBvcnQ6IGxvY2F0aW9uLnBv
cnQgPyAnOicgKyBsb2NhdGlvbi5wb3J0IDogJycKKyAgICB9KSk7CisgIH0sCisKKyAgZ2V0SGVh
ZGVyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5z
cG9ydC5nZXRSZXNwb25zZUhlYWRlcihuYW1lKSB8fCBudWxsOworICAgIH0gY2F0Y2ggKGUpIHsg
cmV0dXJuIG51bGw7IH0KKyAgfSwKKworICBldmFsUmVzcG9uc2U6IGZ1bmN0aW9uKCkgeworICAg
IHRyeSB7CisgICAgICByZXR1cm4gZXZhbCgodGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0IHx8
ICcnKS51bmZpbHRlckpTT04oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5kaXNw
YXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0sCisKKyAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1
bmN0aW9uKGV4Y2VwdGlvbikgeworICAgICh0aGlzLm9wdGlvbnMub25FeGNlcHRpb24gfHwgUHJv
dG90eXBlLmVtcHR5RnVuY3Rpb24pKHRoaXMsIGV4Y2VwdGlvbik7CisgICAgQWpheC5SZXNwb25k
ZXJzLmRpc3BhdGNoKCdvbkV4Y2VwdGlvbicsIHRoaXMsIGV4Y2VwdGlvbik7CisgIH0KK30pOwor
CitBamF4LlJlcXVlc3QuRXZlbnRzID0KKyAgWydVbmluaXRpYWxpemVkJywgJ0xvYWRpbmcnLCAn
TG9hZGVkJywgJ0ludGVyYWN0aXZlJywgJ0NvbXBsZXRlJ107CisKKworCisKKworCisKKworQWph
eC5SZXNwb25zZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHJlcXVl
c3QpeworICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgdmFyIHRyYW5zcG9ydCAgPSB0
aGlzLnRyYW5zcG9ydCAgPSByZXF1ZXN0LnRyYW5zcG9ydCwKKyAgICAgICAgcmVhZHlTdGF0ZSA9
IHRoaXMucmVhZHlTdGF0ZSA9IHRyYW5zcG9ydC5yZWFkeVN0YXRlOworCisgICAgaWYoKHJlYWR5
U3RhdGUgPiAyICYmICFQcm90b3R5cGUuQnJvd3Nlci5JRSkgfHwgcmVhZHlTdGF0ZSA9PSA0KSB7
CisgICAgICB0aGlzLnN0YXR1cyAgICAgICA9IHRoaXMuZ2V0U3RhdHVzKCk7CisgICAgICB0aGlz
LnN0YXR1c1RleHQgICA9IHRoaXMuZ2V0U3RhdHVzVGV4dCgpOworICAgICAgdGhpcy5yZXNwb25z
ZVRleHQgPSBTdHJpbmcuaW50ZXJwcmV0KHRyYW5zcG9ydC5yZXNwb25zZVRleHQpOworICAgICAg
dGhpcy5oZWFkZXJKU09OICAgPSB0aGlzLl9nZXRIZWFkZXJKU09OKCk7CisgICAgfQorCisgICAg
aWYocmVhZHlTdGF0ZSA9PSA0KSB7CisgICAgICB2YXIgeG1sID0gdHJhbnNwb3J0LnJlc3BvbnNl
WE1MOworICAgICAgdGhpcy5yZXNwb25zZVhNTCAgPSBPYmplY3QuaXNVbmRlZmluZWQoeG1sKSA/
IG51bGwgOiB4bWw7CisgICAgICB0aGlzLnJlc3BvbnNlSlNPTiA9IHRoaXMuX2dldFJlc3BvbnNl
SlNPTigpOworICAgIH0KKyAgfSwKKworICBzdGF0dXM6ICAgICAgMCwKKworICBzdGF0dXNUZXh0
OiAnJywKKworICBnZXRTdGF0dXM6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0U3RhdHVzLAor
CisgIGdldFN0YXR1c1RleHQ6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4g
dGhpcy50cmFuc3BvcnQuc3RhdHVzVGV4dCB8fCAnJzsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVy
biAnJyB9CisgIH0sCisKKyAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhl
YWRlciwKKworICBnZXRBbGxIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAg
cmV0dXJuIHRoaXMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgfSBjYXRjaCAoZSkgeyBy
ZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKKyAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7Cisg
IH0sCisKKyAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
dGhpcy50cmFuc3BvcnQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgIH0sCisKKyAgX2dldEhl
YWRlckpTT046IGZ1bmN0aW9uKCkgeworICAgIHZhciBqc29uID0gdGhpcy5nZXRIZWFkZXIoJ1gt
SlNPTicpOworICAgIGlmICghanNvbikgcmV0dXJuIG51bGw7CisgICAganNvbiA9IGRlY29kZVVS
SUNvbXBvbmVudChlc2NhcGUoanNvbikpOworICAgIHRyeSB7CisgICAgICByZXR1cm4ganNvbi5l
dmFsSlNPTih0aGlzLnJlcXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKKyAgICAgICAgIXRo
aXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhp
cy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBfZ2V0UmVz
cG9uc2VKU09OOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRoaXMucmVxdWVzdC5v
cHRpb25zOworICAgIGlmICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9ucy5ldmFsSlNPTiAh
PSAnZm9yY2UnICYmCisgICAgICAhKHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKSB8fCAn
JykuaW5jbHVkZSgnYXBwbGljYXRpb24vanNvbicpKSB8fAorICAgICAgICB0aGlzLnJlc3BvbnNl
VGV4dC5ibGFuaygpKQorICAgICAgICAgIHJldHVybiBudWxsOworICAgIHRyeSB7CisgICAgICBy
ZXR1cm4gdGhpcy5yZXNwb25zZVRleHQuZXZhbEpTT04ob3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwK
KyAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQor
fSk7CisKK0FqYXguVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3QsIHsKKyAgaW5p
dGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAg
IHRoaXMuY29udGFpbmVyID0geworICAgICAgc3VjY2VzczogKGNvbnRhaW5lci5zdWNjZXNzIHx8
IGNvbnRhaW5lciksCisgICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1cmUgfHwgKGNvbnRh
aW5lci5zdWNjZXNzID8gbnVsbCA6IGNvbnRhaW5lcikpCisgICAgfTsKKworICAgIG9wdGlvbnMg
PSBPYmplY3QuY2xvbmUob3B0aW9ucyk7CisgICAgdmFyIG9uQ29tcGxldGUgPSBvcHRpb25zLm9u
Q29tcGxldGU7CisgICAgb3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHJlc3BvbnNlLCBq
c29uKSB7CisgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UucmVzcG9uc2VUZXh0KTsK
KyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25Db21wbGV0ZShyZXNw
b25zZSwganNvbik7CisgICAgfSkuYmluZCh0aGlzKTsKKworICAgICRzdXBlcih1cmwsIG9wdGlv
bnMpOworICB9LAorCisgIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3BvbnNlVGV4dCkgewor
ICAgIHZhciByZWNlaXZlciA9IHRoaXMuY29udGFpbmVyW3RoaXMuc3VjY2VzcygpID8gJ3N1Y2Nl
c3MnIDogJ2ZhaWx1cmUnXSwKKyAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKworICAg
IGlmICghb3B0aW9ucy5ldmFsU2NyaXB0cykgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2VUZXh0LnN0
cmlwU2NyaXB0cygpOworCisgICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsKKyAgICAg
IGlmIChvcHRpb25zLmluc2VydGlvbikgeworICAgICAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKG9w
dGlvbnMuaW5zZXJ0aW9uKSkgeworICAgICAgICAgIHZhciBpbnNlcnRpb24gPSB7IH07IGluc2Vy
dGlvbltvcHRpb25zLmluc2VydGlvbl0gPSByZXNwb25zZVRleHQ7CisgICAgICAgICAgcmVjZWl2
ZXIuaW5zZXJ0KGluc2VydGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBvcHRpb25zLmlu
c2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2VUZXh0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmVj
ZWl2ZXIudXBkYXRlKHJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9Cit9KTsKKworQWpheC5QZXJp
b2RpY2FsVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsKKyAgaW5pdGlhbGl6ZTog
ZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAgICRzdXBlcihv
cHRpb25zKTsKKyAgICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsK
KworICAgIHRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7Cisg
ICAgdGhpcy5kZWNheSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7CisKKyAgICB0aGlzLnVw
ZGF0ZXIgPSB7IH07CisgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy51
cmwgPSB1cmw7CisKKyAgICB0aGlzLnN0YXJ0KCk7CisgIH0sCisKKyAgc3RhcnQ6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5i
aW5kKHRoaXMpOworICAgIHRoaXMub25UaW1lckV2ZW50KCk7CisgIH0sCisKKyAgc3RvcDogZnVu
Y3Rpb24oKSB7CisgICAgdGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0ZSA9IHVuZGVmaW5l
ZDsKKyAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7CisgICAgKHRoaXMub25Db21wbGV0ZSB8
fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfSwK
KworICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICBpZiAodGhpcy5v
cHRpb25zLmRlY2F5KSB7CisgICAgICB0aGlzLmRlY2F5ID0gKHJlc3BvbnNlLnJlc3BvbnNlVGV4
dCA9PSB0aGlzLmxhc3RUZXh0ID8KKyAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5k
ZWNheSA6IDEpOworCisgICAgICB0aGlzLmxhc3RUZXh0ID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0
OworICAgIH0KKyAgICB0aGlzLnRpbWVyID0gdGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKS5k
ZWxheSh0aGlzLmRlY2F5ICogdGhpcy5mcmVxdWVuY3kpOworICB9LAorCisgIG9uVGltZXJFdmVu
dDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXguVXBkYXRlcih0aGlz
LmNvbnRhaW5lciwgdGhpcy51cmwsIHRoaXMub3B0aW9ucyk7CisgIH0KK30pOworCisKKworZnVu
Y3Rpb24gJChlbGVtZW50KSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGZv
ciAodmFyIGkgPSAwLCBlbGVtZW50cyA9IFtdLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBp
IDwgbGVuZ3RoOyBpKyspCisgICAgICBlbGVtZW50cy5wdXNoKCQoYXJndW1lbnRzW2ldKSk7Cisg
ICAgcmV0dXJuIGVsZW1lbnRzOworICB9CisgIGlmIChPYmplY3QuaXNTdHJpbmcoZWxlbWVudCkp
CisgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOworICByZXR1
cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3NlckZl
YXR1cmVzLlhQYXRoKSB7CisgIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGggPSBmdW5jdGlv
bihleHByZXNzaW9uLCBwYXJlbnRFbGVtZW50KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAg
ICB2YXIgcXVlcnkgPSBkb2N1bWVudC5ldmFsdWF0ZShleHByZXNzaW9uLCAkKHBhcmVudEVsZW1l
bnQpIHx8IGRvY3VtZW50LAorICAgICAgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NO
QVBTSE9UX1RZUEUsIG51bGwpOworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBxdWVyeS5z
bmFwc2hvdExlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgcmVzdWx0cy5wdXNoKEVsZW1l
bnQuZXh0ZW5kKHF1ZXJ5LnNuYXBzaG90SXRlbShpKSkpOworICAgIHJldHVybiByZXN1bHRzOwor
ICB9OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCF3aW5kb3cuTm9kZSkgdmFy
IE5vZGUgPSB7IH07CisKK2lmICghTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgT2JqZWN0LmV4dGVu
ZChOb2RlLCB7CisgICAgRUxFTUVOVF9OT0RFOiAxLAorICAgIEFUVFJJQlVURV9OT0RFOiAyLAor
ICAgIFRFWFRfTk9ERTogMywKKyAgICBDREFUQV9TRUNUSU9OX05PREU6IDQsCisgICAgRU5USVRZ
X1JFRkVSRU5DRV9OT0RFOiA1LAorICAgIEVOVElUWV9OT0RFOiA2LAorICAgIFBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERTogNywKKyAgICBDT01NRU5UX05PREU6IDgsCisgICAgRE9DVU1FTlRf
Tk9ERTogOSwKKyAgICBET0NVTUVOVF9UWVBFX05PREU6IDEwLAorICAgIERPQ1VNRU5UX0ZSQUdN
RU5UX05PREU6IDExLAorICAgIE5PVEFUSU9OX05PREU6IDEyCisgIH0pOworfQorCisKKyhmdW5j
dGlvbihnbG9iYWwpIHsKKworICB2YXIgU0VUQVRUUklCVVRFX0lHTk9SRVNfTkFNRSA9IChmdW5j
dGlvbigpeworICAgIHZhciBlbEZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7
CisgICAgdmFyIGVsSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOworICAg
IHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworICAgIGVsSW5wdXQuc2V0QXR0
cmlidXRlKCJuYW1lIiwgInRlc3QiKTsKKyAgICBlbEZvcm0uYXBwZW5kQ2hpbGQoZWxJbnB1dCk7
CisgICAgcm9vdC5hcHBlbmRDaGlsZChlbEZvcm0pOworICAgIHZhciBpc0J1Z2d5ID0gZWxGb3Jt
LmVsZW1lbnRzCisgICAgICA/ICh0eXBlb2YgZWxGb3JtLmVsZW1lbnRzLnRlc3QgPT0gInVuZGVm
aW5lZCIpCisgICAgICA6IG51bGw7CisgICAgcm9vdC5yZW1vdmVDaGlsZChlbEZvcm0pOworICAg
IGVsRm9ybSA9IGVsSW5wdXQgPSBudWxsOworICAgIHJldHVybiBpc0J1Z2d5OworICB9KSgpOwor
CisgIHZhciBlbGVtZW50ID0gZ2xvYmFsLkVsZW1lbnQ7CisgIGdsb2JhbC5FbGVtZW50ID0gZnVu
Y3Rpb24odGFnTmFtZSwgYXR0cmlidXRlcykgeworICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVz
IHx8IHsgfTsKKyAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHZhciBj
YWNoZSA9IEVsZW1lbnQuY2FjaGU7CisgICAgaWYgKFNFVEFUVFJJQlVURV9JR05PUkVTX05BTUUg
JiYgYXR0cmlidXRlcy5uYW1lKSB7CisgICAgICB0YWdOYW1lID0gJzwnICsgdGFnTmFtZSArICcg
bmFtZT0iJyArIGF0dHJpYnV0ZXMubmFtZSArICciPic7CisgICAgICBkZWxldGUgYXR0cmlidXRl
cy5uYW1lOworICAgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCh0YWdOYW1lKSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGlmICghY2FjaGVb
dGFnTmFtZV0pIGNhY2hlW3RhZ05hbWVdID0gRWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCh0YWdOYW1lKSk7CisgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoY2Fj
aGVbdGFnTmFtZV0uY2xvbmVOb2RlKGZhbHNlKSwgYXR0cmlidXRlcyk7CisgIH07CisgIE9iamVj
dC5leHRlbmQoZ2xvYmFsLkVsZW1lbnQsIGVsZW1lbnQgfHwgeyB9KTsKKyAgaWYgKGVsZW1lbnQp
IGdsb2JhbC5FbGVtZW50LnByb3RvdHlwZSA9IGVsZW1lbnQucHJvdG90eXBlOworfSkodGhpcyk7
CisKK0VsZW1lbnQuY2FjaGUgPSB7IH07CitFbGVtZW50LmlkQ291bnRlciA9IDE7CisKK0VsZW1l
bnQuTWV0aG9kcyA9IHsKKyAgdmlzaWJsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVy
biAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOworICB9LAorCisgIHRvZ2dsZTog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIEVsZW1l
bnRbRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZW50KTsK
KyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworCisgIGhpZGU6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkg
PSAnbm9uZSc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2hvdzogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUu
ZGlzcGxheSA9ICcnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHJlbW92ZTogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQu
cGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICB1cGRhdGU6IChmdW5jdGlvbigpeworCisgICAgdmFyIFNFTEVDVF9FTEVNRU5UX0lO
TkVSSFRNTF9CVUdHWSA9IChmdW5jdGlvbigpeworICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgic2VsZWN0IiksCisgICAgICAgICAgaXNCdWdneSA9IHRydWU7CisgICAgICBl
bC5pbm5lckhUTUwgPSAiPG9wdGlvbiB2YWx1ZT1cInRlc3RcIj50ZXN0PC9vcHRpb24+IjsKKyAg
ICAgIGlmIChlbC5vcHRpb25zICYmIGVsLm9wdGlvbnNbMF0pIHsKKyAgICAgICAgaXNCdWdneSA9
IGVsLm9wdGlvbnNbMF0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gIk9QVElPTiI7CisgICAg
ICB9CisgICAgICBlbCA9IG51bGw7CisgICAgICByZXR1cm4gaXNCdWdneTsKKyAgICB9KSgpOwor
CisgICAgdmFyIFRBQkxFX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZID0gKGZ1bmN0aW9uKCl7Cisg
ICAgICB0cnkgeworICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJs
ZSIpOworICAgICAgICBpZiAoZWwgJiYgZWwudEJvZGllcykgeworICAgICAgICAgIGVsLmlubmVy
SFRNTCA9ICI8dGJvZHk+PHRyPjx0ZD50ZXN0PC90ZD48L3RyPjwvdGJvZHk+IjsKKyAgICAgICAg
ICB2YXIgaXNCdWdneSA9IHR5cGVvZiBlbC50Qm9kaWVzWzBdID09ICJ1bmRlZmluZWQiOworICAg
ICAgICAgIGVsID0gbnVsbDsKKyAgICAgICAgICByZXR1cm4gaXNCdWdneTsKKyAgICAgICAgfQor
ICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9
KSgpOworCisgICAgdmFyIFNDUklQVF9FTEVNRU5UX1JFSkVDVFNfVEVYVE5PREVfQVBQRU5ESU5H
ID0gKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi
c2NyaXB0IiksCisgICAgICAgICAgaXNCdWdneSA9IGZhbHNlOworICAgICAgdHJ5IHsKKyAgICAg
ICAgcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpOworICAgICAgICBp
c0J1Z2d5ID0gIXMuZmlyc3RDaGlsZCB8fAorICAgICAgICAgIHMuZmlyc3RDaGlsZCAmJiBzLmZp
cnN0Q2hpbGQubm9kZVR5cGUgIT09IDM7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGlz
QnVnZ3kgPSB0cnVlOworICAgICAgfQorICAgICAgcyA9IG51bGw7CisgICAgICByZXR1cm4gaXNC
dWdneTsKKyAgICB9KSgpOworCisgICAgZnVuY3Rpb24gdXBkYXRlKGVsZW1lbnQsIGNvbnRlbnQp
IHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgICBpZiAoY29udGVudCAmJiBj
b250ZW50LnRvRWxlbWVudCkKKyAgICAgICAgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7
CisKKyAgICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKQorICAgICAgICByZXR1cm4g
ZWxlbWVudC51cGRhdGUoKS5pbnNlcnQoY29udGVudCk7CisKKyAgICAgIGNvbnRlbnQgPSBPYmpl
Y3QudG9IVE1MKGNvbnRlbnQpOworCisgICAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFt
ZS50b1VwcGVyQ2FzZSgpOworCisgICAgICBpZiAodGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgU0NS
SVBUX0VMRU1FTlRfUkVKRUNUU19URVhUTk9ERV9BUFBFTkRJTkcpIHsKKyAgICAgICAgZWxlbWVu
dC50ZXh0ID0gY29udGVudDsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB9CisKKyAg
ICAgIGlmIChTRUxFQ1RfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1kgfHwgVEFCTEVfRUxFTUVOVF9J
Tk5FUkhUTUxfQlVHR1kpIHsKKyAgICAgICAgaWYgKHRhZ05hbWUgaW4gRWxlbWVudC5faW5zZXJ0
aW9uVHJhbnNsYXRpb25zLnRhZ3MpIHsKKyAgICAgICAgICB3aGlsZSAoZWxlbWVudC5maXJzdENo
aWxkKSB7CisgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGls
ZCk7CisgICAgICAgICAgfQorICAgICAgICAgIEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnlt
b3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKQorICAgICAgICAgICAg
LmVhY2goZnVuY3Rpb24obm9kZSkgeworICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxk
KG5vZGUpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNv
bnRlbnQuc3RyaXBTY3JpcHRzKCk7CisgICAgICB9CisKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlw
dHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQor
CisgICAgcmV0dXJuIHVwZGF0ZTsKKyAgfSkoKSwKKworICByZXBsYWNlOiBmdW5jdGlvbihlbGVt
ZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGNvbnRl
bnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOwor
ICAgIGVsc2UgaWYgKCFPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAgICBjb250ZW50
ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKyAgICAgIHZhciByYW5nZSA9IGVsZW1lbnQub3du
ZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShlbGVtZW50
KTsKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAg
ICAgY29udGVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChjb250ZW50LnN0cmlw
U2NyaXB0cygpKTsKKyAgICB9CisgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChj
b250ZW50LCBlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBpbnNlcnQ6
IGZ1bmN0aW9uKGVsZW1lbnQsIGluc2VydGlvbnMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoaW5zZXJ0aW9ucykgfHwgT2JqZWN0LmlzTnVt
YmVyKGluc2VydGlvbnMpIHx8CisgICAgICAgIE9iamVjdC5pc0VsZW1lbnQoaW5zZXJ0aW9ucykg
fHwgKGluc2VydGlvbnMgJiYgKGluc2VydGlvbnMudG9FbGVtZW50IHx8IGluc2VydGlvbnMudG9I
VE1MKSkpCisgICAgICAgICAgaW5zZXJ0aW9ucyA9IHtib3R0b206aW5zZXJ0aW9uc307CisKKyAg
ICB2YXIgY29udGVudCwgaW5zZXJ0LCB0YWdOYW1lLCBjaGlsZE5vZGVzOworCisgICAgZm9yICh2
YXIgcG9zaXRpb24gaW4gaW5zZXJ0aW9ucykgeworICAgICAgY29udGVudCAgPSBpbnNlcnRpb25z
W3Bvc2l0aW9uXTsKKyAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24udG9Mb3dlckNhc2UoKTsKKyAg
ICAgIGluc2VydCA9IEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9uc1twb3NpdGlvbl07CisK
KyAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVu
dC50b0VsZW1lbnQoKTsKKyAgICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7Cisg
ICAgICAgIGluc2VydChlbGVtZW50LCBjb250ZW50KTsKKyAgICAgICAgY29udGludWU7CisgICAg
ICB9CisKKyAgICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworCisgICAgICB0
YWdOYW1lID0gKChwb3NpdGlvbiA9PSAnYmVmb3JlJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKQor
ICAgICAgICA/IGVsZW1lbnQucGFyZW50Tm9kZSA6IGVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNh
c2UoKTsKKworICAgICAgY2hpbGROb2RlcyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnlt
b3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKKworICAgICAgaWYg
KHBvc2l0aW9uID09ICd0b3AnIHx8IHBvc2l0aW9uID09ICdhZnRlcicpIGNoaWxkTm9kZXMucmV2
ZXJzZSgpOworICAgICAgY2hpbGROb2Rlcy5lYWNoKGluc2VydC5jdXJyeShlbGVtZW50KSk7CisK
KyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgIH0K
KworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHdyYXA6IGZ1bmN0aW9uKGVsZW1lbnQs
IHdyYXBwZXIsIGF0dHJpYnV0ZXMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBp
ZiAoT2JqZWN0LmlzRWxlbWVudCh3cmFwcGVyKSkKKyAgICAgICQod3JhcHBlcikud3JpdGVBdHRy
aWJ1dGUoYXR0cmlidXRlcyB8fCB7IH0pOworICAgIGVsc2UgaWYgKE9iamVjdC5pc1N0cmluZyh3
cmFwcGVyKSkgd3JhcHBlciA9IG5ldyBFbGVtZW50KHdyYXBwZXIsIGF0dHJpYnV0ZXMpOworICAg
IGVsc2Ugd3JhcHBlciA9IG5ldyBFbGVtZW50KCdkaXYnLCB3cmFwcGVyKTsKKyAgICBpZiAoZWxl
bWVudC5wYXJlbnROb2RlKQorICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3
cmFwcGVyLCBlbGVtZW50KTsKKyAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAg
IHJldHVybiB3cmFwcGVyOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcmVzdWx0ID0gJzwnICsgZWxlbWVu
dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgJEgoeydpZCc6ICdpZCcsICdjbGFzc05hbWUn
OiAnY2xhc3MnfSkuZWFjaChmdW5jdGlvbihwYWlyKSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBw
YWlyLmZpcnN0KCksIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpOworICAgICAgdmFyIHZhbHVlID0g
KGVsZW1lbnRbcHJvcGVydHldIHx8ICcnKS50b1N0cmluZygpOworICAgICAgaWYgKHZhbHVlKSBy
ZXN1bHQgKz0gJyAnICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUuaW5zcGVjdCh0cnVlKTsKKyAg
ICB9KTsKKyAgICByZXR1cm4gcmVzdWx0ICsgJz4nOworICB9LAorCisgIHJlY3Vyc2l2ZWx5Q29s
bGVjdDogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1l
bnRbcHJvcGVydHldKQorICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSkKKyAgICAgICAg
ZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7CisgICAgcmV0dXJuIGVsZW1l
bnRzOworICB9LAorCisgIGFuY2VzdG9yczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVy
biBFbGVtZW50LnJlY3Vyc2l2ZWx5Q29sbGVjdChlbGVtZW50LCAncGFyZW50Tm9kZScpOworICB9
LAorCisgIGRlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIEVsZW1l
bnQuc2VsZWN0KGVsZW1lbnQsICIqIik7CisgIH0sCisKKyAgZmlyc3REZXNjZW5kYW50OiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCkuZmlyc3RDaGlsZDsKKyAg
ICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVt
ZW50Lm5leHRTaWJsaW5nOworICAgIHJldHVybiAkKGVsZW1lbnQpOworICB9LAorCisgIGltbWVk
aWF0ZURlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKCEoZWxlbWVudCA9
ICQoZWxlbWVudCkuZmlyc3RDaGlsZCkpIHJldHVybiBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCAm
JiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwor
ICAgIGlmIChlbGVtZW50KSByZXR1cm4gW2VsZW1lbnRdLmNvbmNhdCgkKGVsZW1lbnQpLm5leHRT
aWJsaW5ncygpKTsKKyAgICByZXR1cm4gW107CisgIH0sCisKKyAgcHJldmlvdXNTaWJsaW5nczog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiBFbGVtZW50LnJlY3Vyc2l2ZWx5Q29sbGVj
dChlbGVtZW50LCAncHJldmlvdXNTaWJsaW5nJyk7CisgIH0sCisKKyAgbmV4dFNpYmxpbmdzOiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQucmVjdXJzaXZlbHlDb2xsZWN0
KGVsZW1lbnQsICduZXh0U2libGluZycpOworICB9LAorCisgIHNpYmxpbmdzOiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQu
cHJldmlvdXNTaWJsaW5ncyhlbGVtZW50KS5yZXZlcnNlKCkKKyAgICAgIC5jb25jYXQoRWxlbWVu
dC5uZXh0U2libGluZ3MoZWxlbWVudCkpOworICB9LAorCisgIG1hdGNoOiBmdW5jdGlvbihlbGVt
ZW50LCBzZWxlY3RvcikgeworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc2VsZWN0b3IpKQorICAg
ICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIHJldHVybiBzZWxlY3Rv
ci5tYXRjaCgkKGVsZW1lbnQpKTsKKyAgfSwKKworICB1cDogZnVuY3Rpb24oZWxlbWVudCwgZXhw
cmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChlbGVtZW50LnBhcmVudE5vZGUpOworICAgIHZh
ciBhbmNlc3RvcnMgPSBFbGVtZW50LmFuY2VzdG9ycyhlbGVtZW50KTsKKyAgICByZXR1cm4gT2Jq
ZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gYW5jZXN0b3JzW2V4cHJlc3Npb25dIDoKKyAgICAg
IFNlbGVjdG9yLmZpbmRFbGVtZW50KGFuY2VzdG9ycywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9
LAorCisgIGRvd246IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0
dXJuIEVsZW1lbnQuZmlyc3REZXNjZW5kYW50KGVsZW1lbnQpOworICAgIHJldHVybiBPYmplY3Qu
aXNOdW1iZXIoZXhwcmVzc2lvbikgPyBFbGVtZW50LmRlc2NlbmRhbnRzKGVsZW1lbnQpW2V4cHJl
c3Npb25dIDoKKyAgICAgIEVsZW1lbnQuc2VsZWN0KGVsZW1lbnQsIGV4cHJlc3Npb24pW2luZGV4
IHx8IDBdOworICB9LAorCisgIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9u
LCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMu
bGVuZ3RoID09IDEpIHJldHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNp
YmxpbmcoZWxlbWVudCkpOworICAgIHZhciBwcmV2aW91c1NpYmxpbmdzID0gRWxlbWVudC5wcmV2
aW91c1NpYmxpbmdzKGVsZW1lbnQpOworICAgIHJldHVybiBPYmplY3QuaXNOdW1iZXIoZXhwcmVz
c2lvbikgPyBwcmV2aW91c1NpYmxpbmdzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNlbGVjdG9yLmZp
bmRFbGVtZW50KHByZXZpb3VzU2libGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKwor
ICBuZXh0OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAk
KFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhlbGVtZW50KSk7CisgICAgdmFy
IG5leHRTaWJsaW5ncyA9IEVsZW1lbnQubmV4dFNpYmxpbmdzKGVsZW1lbnQpOworICAgIHJldHVy
biBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBuZXh0U2libGluZ3NbZXhwcmVzc2lvbl0g
OgorICAgICAgU2VsZWN0b3IuZmluZEVsZW1lbnQobmV4dFNpYmxpbmdzLCBleHByZXNzaW9uLCBp
bmRleCk7CisgIH0sCisKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIg
YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgcmV0
dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsIGFyZ3MpOworICB9LAorCisg
IGFkamFjZW50OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90
b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBTZWxlY3Rvci5maW5k
Q2hpbGRFbGVtZW50cyhlbGVtZW50LnBhcmVudE5vZGUsIGFyZ3MpLndpdGhvdXQoZWxlbWVudCk7
CisgIH0sCisKKyAgaWRlbnRpZnk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICB2YXIgaWQgPSBFbGVtZW50LnJlYWRBdHRyaWJ1dGUoZWxlbWVudCwg
J2lkJyk7CisgICAgaWYgKGlkKSByZXR1cm4gaWQ7CisgICAgZG8geyBpZCA9ICdhbm9ueW1vdXNf
ZWxlbWVudF8nICsgRWxlbWVudC5pZENvdW50ZXIrKyB9IHdoaWxlICgkKGlkKSk7CisgICAgRWxl
bWVudC53cml0ZUF0dHJpYnV0ZShlbGVtZW50LCAnaWQnLCBpZCk7CisgICAgcmV0dXJuIGlkOwor
ICB9LAorCisgIHJlYWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAg
ICAgIHZhciB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQ7CisgICAgICBp
ZiAodC52YWx1ZXNbbmFtZV0pIHJldHVybiB0LnZhbHVlc1tuYW1lXShlbGVtZW50LCBuYW1lKTsK
KyAgICAgIGlmICh0Lm5hbWVzW25hbWVdKSBuYW1lID0gdC5uYW1lc1tuYW1lXTsKKyAgICAgIGlm
IChuYW1lLmluY2x1ZGUoJzonKSkgeworICAgICAgICByZXR1cm4gKCFlbGVtZW50LmF0dHJpYnV0
ZXMgfHwgIWVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXSkgPyBudWxsIDoKKyAgICAgICAgIGVsZW1l
bnQuYXR0cmlidXRlc1tuYW1lXS52YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVs
ZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOworICB9LAorCisgIHdyaXRlQXR0cmlidXRlOiBmdW5j
dGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwor
ICAgIHZhciBhdHRyaWJ1dGVzID0geyB9LCB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRp
b25zLndyaXRlOworCisgICAgaWYgKHR5cGVvZiBuYW1lID09ICdvYmplY3QnKSBhdHRyaWJ1dGVz
ID0gbmFtZTsKKyAgICBlbHNlIGF0dHJpYnV0ZXNbbmFtZV0gPSBPYmplY3QuaXNVbmRlZmluZWQo
dmFsdWUpID8gdHJ1ZSA6IHZhbHVlOworCisgICAgZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVz
KSB7CisgICAgICBuYW1lID0gdC5uYW1lc1thdHRyXSB8fCBhdHRyOworICAgICAgdmFsdWUgPSBh
dHRyaWJ1dGVzW2F0dHJdOworICAgICAgaWYgKHQudmFsdWVzW2F0dHJdKSBuYW1lID0gdC52YWx1
ZXNbYXR0cl0oZWxlbWVudCwgdmFsdWUpOworICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2
YWx1ZSA9PT0gbnVsbCkKKyAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Cisg
ICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkKKyAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1
dGUobmFtZSwgbmFtZSk7CisgICAgICBlbHNlIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZh
bHVlKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0SGVpZ2h0OiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVt
ZW50KS5oZWlnaHQ7CisgIH0sCisKKyAgZ2V0V2lkdGg6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICByZXR1cm4gRWxlbWVudC5nZXREaW1lbnNpb25zKGVsZW1lbnQpLndpZHRoOworICB9LAorCisg
IGNsYXNzTmFtZXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gbmV3IEVsZW1lbnQu
Q2xhc3NOYW1lcyhlbGVtZW50KTsKKyAgfSwKKworICBoYXNDbGFzc05hbWU6IGZ1bmN0aW9uKGVs
ZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0
dXJuOworICAgIHZhciBlbGVtZW50Q2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWU7CisgICAg
cmV0dXJuIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA+IDAgJiYgKGVsZW1lbnRDbGFzc05hbWUg
PT0gY2xhc3NOYW1lIHx8CisgICAgICBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGNsYXNzTmFtZSAr
ICIoXFxzfCQpIikudGVzdChlbGVtZW50Q2xhc3NOYW1lKSkpOworICB9LAorCisgIGFkZENsYXNz
TmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxlbWVudCA9
ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgaWYgKCFFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVt
ZW50LCBjbGFzc05hbWUpKQorICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xh
c3NOYW1lID8gJyAnIDogJycpICsgY2xhc3NOYW1lOworICAgIHJldHVybiBlbGVtZW50OworICB9
LAorCisgIHJlbW92ZUNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7Cisg
ICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgZWxlbWVudC5jbGFz
c05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKAorICAgICAgbmV3IFJlZ0V4cCgiKF58
XFxzKykiICsgY2xhc3NOYW1lICsgIihcXHMrfCQpIiksICcgJykuc3RyaXAoKTsKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfSwKKworICB0b2dnbGVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQs
IGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOwor
ICAgIHJldHVybiBFbGVtZW50W0VsZW1lbnQuaGFzQ2xhc3NOYW1lKGVsZW1lbnQsIGNsYXNzTmFt
ZSkgPworICAgICAgJ3JlbW92ZUNsYXNzTmFtZScgOiAnYWRkQ2xhc3NOYW1lJ10oZWxlbWVudCwg
Y2xhc3NOYW1lKTsKKyAgfSwKKworICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZmly
c3RDaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5u
ZXh0U2libGluZzsKKyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChu
b2RlLm5vZGVWYWx1ZSkpCisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7CisgICAg
ICBub2RlID0gbmV4dE5vZGU7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisg
IGVtcHR5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJI
VE1MLmJsYW5rKCk7CisgIH0sCisKKyAgZGVzY2VuZGFudE9mOiBmdW5jdGlvbihlbGVtZW50LCBh
bmNlc3RvcikgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBhbmNlc3RvciA9ICQoYW5jZXN0
b3IpOworCisgICAgaWYgKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pCisgICAgICBy
ZXR1cm4gKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYW5jZXN0b3IpICYgOCkgPT09
IDg7CisKKyAgICBpZiAoYW5jZXN0b3IuY29udGFpbnMpCisgICAgICByZXR1cm4gYW5jZXN0b3Iu
Y29udGFpbnMoZWxlbWVudCkgJiYgYW5jZXN0b3IgIT09IGVsZW1lbnQ7CisKKyAgICB3aGlsZSAo
ZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkKKyAgICAgIGlmIChlbGVtZW50ID09IGFuY2Vz
dG9yKSByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBzY3JvbGxU
bzogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZh
ciBwb3MgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7CisgICAgd2luZG93LnNj
cm9sbFRvKHBvc1swXSwgcG9zWzFdKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBn
ZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICBzdHlsZSA9IHN0eWxlID09ICdmbG9hdCcgPyAnY3NzRmxvYXQnIDogc3R5bGUu
Y2FtZWxpemUoKTsKKyAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnN0eWxlW3N0eWxlXTsKKyAgICBp
ZiAoIXZhbHVlIHx8IHZhbHVlID09ICdhdXRvJykgeworICAgICAgdmFyIGNzcyA9IGRvY3VtZW50
LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7CisgICAgICB2YWx1
ZSA9IGNzcyA/IGNzc1tzdHlsZV0gOiBudWxsOworICAgIH0KKyAgICBpZiAoc3R5bGUgPT0gJ29w
YWNpdHknKSByZXR1cm4gdmFsdWUgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IDEuMDsKKyAgICByZXR1
cm4gdmFsdWUgPT0gJ2F1dG8nID8gbnVsbCA6IHZhbHVlOworICB9LAorCisgIGdldE9wYWNpdHk6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5nZXRTdHlsZSgnb3Bh
Y2l0eScpOworICB9LAorCisgIHNldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZXMpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVudFN0eWxlID0gZWxlbWVu
dC5zdHlsZSwgbWF0Y2g7CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhzdHlsZXMpKSB7CisgICAg
ICBlbGVtZW50LnN0eWxlLmNzc1RleHQgKz0gJzsnICsgc3R5bGVzOworICAgICAgcmV0dXJuIHN0
eWxlcy5pbmNsdWRlKCdvcGFjaXR5JykgPworICAgICAgICBlbGVtZW50LnNldE9wYWNpdHkoc3R5
bGVzLm1hdGNoKC9vcGFjaXR5OlxzKihcZD9cLj9cZCopLylbMV0pIDogZWxlbWVudDsKKyAgICB9
CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc3R5bGVzKQorICAgICAgaWYgKHByb3BlcnR5ID09
ICdvcGFjaXR5JykgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlc1twcm9wZXJ0eV0pOworICAgICAg
ZWxzZQorICAgICAgICBlbGVtZW50U3R5bGVbKHByb3BlcnR5ID09ICdmbG9hdCcgfHwgcHJvcGVy
dHkgPT0gJ2Nzc0Zsb2F0JykgPworICAgICAgICAgIChPYmplY3QuaXNVbmRlZmluZWQoZWxlbWVu
dFN0eWxlLnN0eWxlRmxvYXQpID8gJ2Nzc0Zsb2F0JyA6ICdzdHlsZUZsb2F0JykgOgorICAgICAg
ICAgICAgcHJvcGVydHldID0gc3R5bGVzW3Byb3BlcnR5XTsKKworICAgIHJldHVybiBlbGVtZW50
OworICB9LAorCisgIHNldE9wYWNpdHk6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVl
ID09IDEgfHwgdmFsdWUgPT09ICcnKSA/ICcnIDoKKyAgICAgICh2YWx1ZSA8IDAuMDAwMDEpID8g
MCA6IHZhbHVlOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldERpbWVuc2lvbnM6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIg
ZGlzcGxheSA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKTsKKyAgICBpZiAo
ZGlzcGxheSAhPSAnbm9uZScgJiYgZGlzcGxheSAhPSBudWxsKSAvLyBTYWZhcmkgYnVnCisgICAg
ICByZXR1cm4ge3dpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zm
c2V0SGVpZ2h0fTsKKworICAgIHZhciBlbHMgPSBlbGVtZW50LnN0eWxlOworICAgIHZhciBvcmln
aW5hbFZpc2liaWxpdHkgPSBlbHMudmlzaWJpbGl0eTsKKyAgICB2YXIgb3JpZ2luYWxQb3NpdGlv
biA9IGVscy5wb3NpdGlvbjsKKyAgICB2YXIgb3JpZ2luYWxEaXNwbGF5ID0gZWxzLmRpc3BsYXk7
CisgICAgZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKyAgICBpZiAob3JpZ2luYWxQb3NpdGlv
biAhPSAnZml4ZWQnKSAvLyBTd2l0Y2hpbmcgZml4ZWQgdG8gYWJzb2x1dGUgY2F1c2VzIGlzc3Vl
cyBpbiBTYWZhcmkKKyAgICAgIGVscy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgZWxzLmRp
c3BsYXkgPSAnYmxvY2snOworICAgIHZhciBvcmlnaW5hbFdpZHRoID0gZWxlbWVudC5jbGllbnRX
aWR0aDsKKyAgICB2YXIgb3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKyAg
ICBlbHMuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTsKKyAgICBlbHMucG9zaXRpb24gPSBvcmln
aW5hbFBvc2l0aW9uOworICAgIGVscy52aXNpYmlsaXR5ID0gb3JpZ2luYWxWaXNpYmlsaXR5Owor
ICAgIHJldHVybiB7d2lkdGg6IG9yaWdpbmFsV2lkdGgsIGhlaWdodDogb3JpZ2luYWxIZWlnaHR9
OworICB9LAorCisgIG1ha2VQb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxl
bWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIHBvcyA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVu
dCwgJ3Bvc2l0aW9uJyk7CisgICAgaWYgKHBvcyA9PSAnc3RhdGljJyB8fCAhcG9zKSB7CisgICAg
ICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHRydWU7CisgICAgICBlbGVtZW50LnN0eWxlLnBv
c2l0aW9uID0gJ3JlbGF0aXZlJzsKKyAgICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkg
eworICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IDA7CisgICAgICAgIGVsZW1lbnQuc3R5bGUu
bGVmdCA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisg
IHVuZG9Qb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgaWYgKGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkKSB7CisgICAgICBlbGVtZW50
Ll9tYWRlUG9zaXRpb25lZCA9IHVuZGVmaW5lZDsKKyAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRp
b24gPQorICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUu
bGVmdCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUuYm90dG9tID0KKyAgICAgICAgZWxlbWVudC5z
dHlsZS5yaWdodCA9ICcnOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBt
YWtlQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybiBlbGVtZW50OworICAgIGVsZW1l
bnQuX292ZXJmbG93ID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnb3ZlcmZsb3cnKSB8fCAn
YXV0byc7CisgICAgaWYgKGVsZW1lbnQuX292ZXJmbG93ICE9PSAnaGlkZGVuJykKKyAgICAgIGVs
ZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICB1bmRvQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICBpZiAoIWVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsK
KyAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gZWxlbWVudC5fb3ZlcmZsb3cgPT0gJ2F1dG8n
ID8gJycgOiBlbGVtZW50Ll9vdmVyZmxvdzsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IG51bGw7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsK
KyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCAr
PSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNl
dFBhcmVudDsKKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0
dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBwb3NpdGlvbmVkT2Zmc2V0OiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAg
ZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFs
dWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgZWxlbWVudCA9IGVsZW1lbnQu
b2Zmc2V0UGFyZW50OworICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQu
dGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdCT0RZJykgYnJlYWs7CisgICAgICAgIHZhciBwID0g
RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKTsKKyAgICAgICAgaWYgKHAgIT09
ICdzdGF0aWMnKSBicmVhazsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICBy
ZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBh
YnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29s
dXRlJykgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICB2YXIgb2Zmc2V0cyA9IEVsZW1lbnQucG9zaXRp
b25lZE9mZnNldChlbGVtZW50KTsKKyAgICB2YXIgdG9wICAgICA9IG9mZnNldHNbMV07CisgICAg
dmFyIGxlZnQgICAgPSBvZmZzZXRzWzBdOworICAgIHZhciB3aWR0aCAgID0gZWxlbWVudC5jbGll
bnRXaWR0aDsKKyAgICB2YXIgaGVpZ2h0ICA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworCisgICAg
ZWxlbWVudC5fb3JpZ2luYWxMZWZ0ICAgPSBsZWZ0IC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxl
LmxlZnQgIHx8IDApOworICAgIGVsZW1lbnQuX29yaWdpbmFsVG9wICAgID0gdG9wICAtIHBhcnNl
RmxvYXQoZWxlbWVudC5zdHlsZS50b3AgfHwgMCk7CisgICAgZWxlbWVudC5fb3JpZ2luYWxXaWR0
aCAgPSBlbGVtZW50LnN0eWxlLndpZHRoOworICAgIGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0ID0g
ZWxlbWVudC5zdHlsZS5oZWlnaHQ7CisKKyAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fi
c29sdXRlJzsKKyAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7CisgICAgZWxl
bWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLndpZHRo
ICA9IHdpZHRoICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdw
eCc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVsYXRpdml6ZTogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChFbGVtZW50Lmdl
dFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdyZWxhdGl2ZScpIHJldHVybiBlbGVtZW50
OworCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgdmFyIHRv
cCAgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wICB8fCAwKSAtIChlbGVtZW50Ll9vcmln
aW5hbFRvcCB8fCAwKTsKKyAgICB2YXIgbGVmdCA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5s
ZWZ0IHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsTGVmdCB8fCAwKTsKKworICAgIGVsZW1lbnQu
c3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxl
ZnQgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2luYWxI
ZWlnaHQ7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSBlbGVtZW50Ll9vcmlnaW5hbFdpZHRo
OworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQ6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAg
ICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICB2
YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVu
dC5wYXJlbnROb2RlOworICAgIH0gd2hpbGUgKGVsZW1lbnQpOworICAgIHJldHVybiBFbGVtZW50
Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9LAorCisgIGdldE9mZnNldFBhcmVu
dDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCkgcmV0
dXJuICQoZWxlbWVudC5vZmZzZXRQYXJlbnQpOworICAgIGlmIChlbGVtZW50ID09IGRvY3VtZW50
LmJvZHkpIHJldHVybiAkKGVsZW1lbnQpOworCisgICAgd2hpbGUgKChlbGVtZW50ID0gZWxlbWVu
dC5wYXJlbnROb2RlKSAmJiBlbGVtZW50ICE9IGRvY3VtZW50LmJvZHkpCisgICAgICBpZiAoRWxl
bWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSAhPSAnc3RhdGljJykKKyAgICAgICAg
cmV0dXJuICQoZWxlbWVudCk7CisKKyAgICByZXR1cm4gJChkb2N1bWVudC5ib2R5KTsKKyAgfSwK
KworICB2aWV3cG9ydE9mZnNldDogZnVuY3Rpb24oZm9yRWxlbWVudCkgeworICAgIHZhciB2YWx1
ZVQgPSAwLCB2YWx1ZUwgPSAwOworCisgICAgdmFyIGVsZW1lbnQgPSBmb3JFbGVtZW50OworICAg
IGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZh
bHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKworICAgICAgaWYgKGVsZW1lbnQub2Zm
c2V0UGFyZW50ID09IGRvY3VtZW50LmJvZHkgJiYKKyAgICAgICAgRWxlbWVudC5nZXRTdHlsZShl
bGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSBicmVhazsKKworICAgIH0gd2hpbGUg
KGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7CisKKyAgICBlbGVtZW50ID0gZm9yRWxl
bWVudDsKKyAgICBkbyB7CisgICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyLk9wZXJhIHx8IChl
bGVtZW50LnRhZ05hbWUgJiYgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdCT0RZ
JykpKSB7CisgICAgICAgIHZhbHVlVCAtPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsKKyAgICAg
ICAgdmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOworICAgICAgfQorICAgIH0gd2hp
bGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpOworCisgICAgcmV0dXJuIEVsZW1lbnQu
X3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgY2xvbmVQb3NpdGlvbjog
ZnVuY3Rpb24oZWxlbWVudCwgc291cmNlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0
ZW5kKHsKKyAgICAgIHNldExlZnQ6ICAgIHRydWUsCisgICAgICBzZXRUb3A6ICAgICB0cnVlLAor
ICAgICAgc2V0V2lkdGg6ICAgdHJ1ZSwKKyAgICAgIHNldEhlaWdodDogIHRydWUsCisgICAgICBv
ZmZzZXRUb3A6ICAwLAorICAgICAgb2Zmc2V0TGVmdDogMAorICAgIH0sIGFyZ3VtZW50c1syXSB8
fCB7IH0pOworCisgICAgc291cmNlID0gJChzb3VyY2UpOworICAgIHZhciBwID0gRWxlbWVudC52
aWV3cG9ydE9mZnNldChzb3VyY2UpOworCisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
dmFyIGRlbHRhID0gWzAsIDBdOworICAgIHZhciBwYXJlbnQgPSBudWxsOworICAgIGlmIChFbGVt
ZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHsKKyAgICAg
IHBhcmVudCA9IEVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpOworICAgICAgZGVsdGEg
PSBFbGVtZW50LnZpZXdwb3J0T2Zmc2V0KHBhcmVudCk7CisgICAgfQorCisgICAgaWYgKHBhcmVu
dCA9PSBkb2N1bWVudC5ib2R5KSB7CisgICAgICBkZWx0YVswXSAtPSBkb2N1bWVudC5ib2R5Lm9m
ZnNldExlZnQ7CisgICAgICBkZWx0YVsxXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldFRvcDsKKyAg
ICB9CisKKyAgICBpZiAob3B0aW9ucy5zZXRMZWZ0KSAgIGVsZW1lbnQuc3R5bGUubGVmdCAgPSAo
cFswXSAtIGRlbHRhWzBdICsgb3B0aW9ucy5vZmZzZXRMZWZ0KSArICdweCc7CisgICAgaWYgKG9w
dGlvbnMuc2V0VG9wKSAgICBlbGVtZW50LnN0eWxlLnRvcCAgID0gKHBbMV0gLSBkZWx0YVsxXSAr
IG9wdGlvbnMub2Zmc2V0VG9wKSArICdweCc7CisgICAgaWYgKG9wdGlvbnMuc2V0V2lkdGgpICBl
bGVtZW50LnN0eWxlLndpZHRoID0gc291cmNlLm9mZnNldFdpZHRoICsgJ3B4JzsKKyAgICBpZiAo
b3B0aW9ucy5zZXRIZWlnaHQpIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc291cmNlLm9mZnNldEhl
aWdodCArICdweCc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0KK307CisKK09iamVjdC5leHRl
bmQoRWxlbWVudC5NZXRob2RzLCB7CisgIGdldEVsZW1lbnRzQnlTZWxlY3RvcjogRWxlbWVudC5N
ZXRob2RzLnNlbGVjdCwKKworICBjaGlsZEVsZW1lbnRzOiBFbGVtZW50Lk1ldGhvZHMuaW1tZWRp
YXRlRGVzY2VuZGFudHMKK30pOworCitFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7
CisgIHdyaXRlOiB7CisgICAgbmFtZXM6IHsKKyAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJywKKyAg
ICAgIGh0bWxGb3I6ICAgJ2ZvcicKKyAgICB9LAorICAgIHZhbHVlczogeyB9CisgIH0KK307CisK
K2lmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgeworICBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5
bGUgPSBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVk
LCBlbGVtZW50LCBzdHlsZSkgeworICAgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICBjYXNl
ICdsZWZ0JzogY2FzZSAndG9wJzogY2FzZSAncmlnaHQnOiBjYXNlICdib3R0b20nOgorICAgICAg
ICAgIGlmIChwcm9jZWVkKGVsZW1lbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykgcmV0dXJu
IG51bGw7CisgICAgICAgIGNhc2UgJ2hlaWdodCc6IGNhc2UgJ3dpZHRoJzoKKyAgICAgICAgICBp
ZiAoIUVsZW1lbnQudmlzaWJsZShlbGVtZW50KSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICB2
YXIgZGltID0gcGFyc2VJbnQocHJvY2VlZChlbGVtZW50LCBzdHlsZSksIDEwKTsKKworICAgICAg
ICAgIGlmIChkaW0gIT09IGVsZW1lbnRbJ29mZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCldKQor
ICAgICAgICAgICAgcmV0dXJuIGRpbSArICdweCc7CisKKyAgICAgICAgICB2YXIgcHJvcGVydGll
czsKKyAgICAgICAgICBpZiAoc3R5bGUgPT09ICdoZWlnaHQnKSB7CisgICAgICAgICAgICBwcm9w
ZXJ0aWVzID0gWydib3JkZXItdG9wLXdpZHRoJywgJ3BhZGRpbmctdG9wJywKKyAgICAgICAgICAg
ICAncGFkZGluZy1ib3R0b20nLCAnYm9yZGVyLWJvdHRvbS13aWR0aCddOworICAgICAgICAgIH0K
KyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbJ2JvcmRlci1sZWZ0
LXdpZHRoJywgJ3BhZGRpbmctbGVmdCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctcmlnaHQnLCAn
Ym9yZGVyLXJpZ2h0LXdpZHRoJ107CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBwcm9w
ZXJ0aWVzLmluamVjdChkaW0sIGZ1bmN0aW9uKG1lbW8sIHByb3BlcnR5KSB7CisgICAgICAgICAg
ICB2YXIgdmFsID0gcHJvY2VlZChlbGVtZW50LCBwcm9wZXJ0eSk7CisgICAgICAgICAgICByZXR1
cm4gdmFsID09PSBudWxsID8gbWVtbyA6IG1lbW8gLSBwYXJzZUludCh2YWwsIDEwKTsKKyAgICAg
ICAgICB9KSArICdweCc7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBwcm9jZWVkKGVsZW1lbnQs
IHN0eWxlKTsKKyAgICAgIH0KKyAgICB9CisgICk7CisKKyAgRWxlbWVudC5NZXRob2RzLnJlYWRB
dHRyaWJ1dGUgPSBFbGVtZW50Lk1ldGhvZHMucmVhZEF0dHJpYnV0ZS53cmFwKAorICAgIGZ1bmN0
aW9uKHByb2NlZWQsIGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgaWYgKGF0dHJpYnV0ZSA9
PT0gJ3RpdGxlJykgcmV0dXJuIGVsZW1lbnQudGl0bGU7CisgICAgICByZXR1cm4gcHJvY2VlZChl
bGVtZW50LCBhdHRyaWJ1dGUpOworICAgIH0KKyAgKTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBl
LkJyb3dzZXIuSUUpIHsKKyAgRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCA9IEVsZW1l
bnQuTWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBl
bGVtZW50KSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIHRyeSB7IGVsZW1l
bnQub2Zmc2V0UGFyZW50IH0KKyAgICAgIGNhdGNoKGUpIHsgcmV0dXJuICQoZG9jdW1lbnQuYm9k
eSkgfQorICAgICAgdmFyIHBvc2l0aW9uID0gZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKTsK
KyAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQp
OworICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH0pOworICAg
ICAgdmFyIHZhbHVlID0gcHJvY2VlZChlbGVtZW50KTsKKyAgICAgIGVsZW1lbnQuc2V0U3R5bGUo
eyBwb3NpdGlvbjogcG9zaXRpb24gfSk7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAp
OworCisgICR3KCdwb3NpdGlvbmVkT2Zmc2V0IHZpZXdwb3J0T2Zmc2V0JykuZWFjaChmdW5jdGlv
bihtZXRob2QpIHsKKyAgICBFbGVtZW50Lk1ldGhvZHNbbWV0aG9kXSA9IEVsZW1lbnQuTWV0aG9k
c1ttZXRob2RdLndyYXAoCisgICAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50KSB7CisgICAg
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAgICB0cnkgeyBlbGVtZW50Lm9mZnNldFBh
cmVudCB9CisgICAgICAgIGNhdGNoKGUpIHsgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgw
LDApIH0KKyAgICAgICAgdmFyIHBvc2l0aW9uID0gZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24n
KTsKKyAgICAgICAgaWYgKHBvc2l0aW9uICE9PSAnc3RhdGljJykgcmV0dXJuIHByb2NlZWQoZWxl
bWVudCk7CisgICAgICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtZW50LmdldE9mZnNldFBhcmVu
dCgpOworICAgICAgICBpZiAob2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudC5nZXRTdHlsZSgn
cG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykKKyAgICAgICAgICBvZmZzZXRQYXJlbnQuc2V0U3R5bGUo
eyB6b29tOiAxIH0pOworICAgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdyZWxh
dGl2ZScgfSk7CisgICAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQoZWxlbWVudCk7CisgICAgICAg
IGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRpb24gfSk7CisgICAgICAgIHJldHVy
biB2YWx1ZTsKKyAgICAgIH0KKyAgICApOworICB9KTsKKworICBFbGVtZW50Lk1ldGhvZHMuY3Vt
dWxhdGl2ZU9mZnNldCA9IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0LndyYXAoCisg
ICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAgdHJ5IHsgZWxlbWVudC5vZmZz
ZXRQYXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0
KDAsMCkgfQorICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7CisgICAgfQorICApOworCisg
IEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgc3R5bGUgPSAoc3R5bGUgPT0gJ2Zsb2F0JyB8
fCBzdHlsZSA9PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7
CisgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2YWx1ZSAm
JiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHls
ZV07CisKKyAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSB7CisgICAgICBpZiAodmFsdWUgPSAo
ZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0o
LiopXCkvKSkKKyAgICAgICAgaWYgKHZhbHVlWzFdKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZVsx
XSkgLyAxMDA7CisgICAgICByZXR1cm4gMS4wOworICAgIH0KKworICAgIGlmICh2YWx1ZSA9PSAn
YXV0bycpIHsKKyAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0
JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAhPSAnbm9uZScpKQorICAgICAgICBy
ZXR1cm4gZWxlbWVudFsnb2Zmc2V0JyArIHN0eWxlLmNhcGl0YWxpemUoKV0gKyAncHgnOworICAg
ICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKKworICBFbGVt
ZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAg
ZnVuY3Rpb24gc3RyaXBBbHBoYShmaWx0ZXIpeworICAgICAgcmV0dXJuIGZpbHRlci5yZXBsYWNl
KC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOworICAgIH0KKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICB2YXIgY3VycmVudFN0eWxlID0gZWxlbWVudC5jdXJyZW50U3R5bGU7CisgICAgaWYg
KChjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpIHx8CisgICAgICAoIWN1
cnJlbnRTdHlsZSAmJiBlbGVtZW50LnN0eWxlLnpvb20gPT0gJ25vcm1hbCcpKQorICAgICAgICBl
bGVtZW50LnN0eWxlLnpvb20gPSAxOworCisgICAgdmFyIGZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5
bGUoJ2ZpbHRlcicpLCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7CisgICAgaWYgKHZhbHVlID09IDEg
fHwgdmFsdWUgPT09ICcnKSB7CisgICAgICAoZmlsdGVyID0gc3RyaXBBbHBoYShmaWx0ZXIpKSA/
CisgICAgICAgIHN0eWxlLmZpbHRlciA9IGZpbHRlciA6IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgn
ZmlsdGVyJyk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwg
MC4wMDAwMSkgdmFsdWUgPSAwOworICAgIHN0eWxlLmZpbHRlciA9IHN0cmlwQWxwaGEoZmlsdGVy
KSArCisgICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVlICogMTAwKSArICcpJzsKKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMg
PSAoZnVuY3Rpb24oKXsKKworICAgIHZhciBjbGFzc1Byb3AgPSAnY2xhc3NOYW1lJzsKKyAgICB2
YXIgZm9yUHJvcCA9ICdmb3InOworCisgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCgnZGl2Jyk7CisKKyAgICBlbC5zZXRBdHRyaWJ1dGUoY2xhc3NQcm9wLCAneCcpOworCisgICAg
aWYgKGVsLmNsYXNzTmFtZSAhPT0gJ3gnKSB7CisgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNz
JywgJ3gnKTsKKyAgICAgIGlmIChlbC5jbGFzc05hbWUgPT09ICd4JykgeworICAgICAgICBjbGFz
c1Byb3AgPSAnY2xhc3MnOworICAgICAgfQorICAgIH0KKyAgICBlbCA9IG51bGw7CisKKyAgICBl
bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CisgICAgZWwuc2V0QXR0cmlidXRl
KGZvclByb3AsICd4Jyk7CisgICAgaWYgKGVsLmh0bWxGb3IgIT09ICd4JykgeworICAgICAgZWwu
c2V0QXR0cmlidXRlKCdodG1sRm9yJywgJ3gnKTsKKyAgICAgIGlmIChlbC5odG1sRm9yID09PSAn
eCcpIHsKKyAgICAgICAgZm9yUHJvcCA9ICdodG1sRm9yJzsKKyAgICAgIH0KKyAgICB9CisgICAg
ZWwgPSBudWxsOworCisgICAgcmV0dXJuIHsKKyAgICAgIHJlYWQ6IHsKKyAgICAgICAgbmFtZXM6
IHsKKyAgICAgICAgICAnY2xhc3MnOiAgICAgIGNsYXNzUHJvcCwKKyAgICAgICAgICAnY2xhc3NO
YW1lJzogIGNsYXNzUHJvcCwKKyAgICAgICAgICAnZm9yJzogICAgICAgIGZvclByb3AsCisgICAg
ICAgICAgJ2h0bWxGb3InOiAgICBmb3JQcm9wCisgICAgICAgIH0sCisgICAgICAgIHZhbHVlczog
eworICAgICAgICAgIF9nZXRBdHRyOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAg
ICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAg
ICAgIH0sCisgICAgICAgICAgX2dldEF0dHIyOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUp
IHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIDIp
OworICAgICAgICAgIH0sCisgICAgICAgICAgX2dldEF0dHJOb2RlOiBmdW5jdGlvbihlbGVtZW50
LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIHZhciBub2RlID0gZWxlbWVudC5nZXRBdHRyaWJ1
dGVOb2RlKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZSA/IG5vZGUudmFsdWUg
OiAiIjsKKyAgICAgICAgICB9LAorICAgICAgICAgIF9nZXRFdjogKGZ1bmN0aW9uKCl7CisKKyAg
ICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAg
ICAgICAgZWwub25jbGljayA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAgICAgICAg
dmFyIHZhbHVlID0gZWwuZ2V0QXR0cmlidXRlKCdvbmNsaWNrJyk7CisgICAgICAgICAgICB2YXIg
ZjsKKworICAgICAgICAgICAgaWYgKFN0cmluZyh2YWx1ZSkuaW5kZXhPZigneycpID4gLTEpIHsK
KyAgICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAg
ICAgICAgICAgIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7Cisg
ICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpIHJldHVybiBudWxsOworICAgICAgICAgICAg
ICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGF0
dHJpYnV0ZSA9IGF0dHJpYnV0ZS5zcGxpdCgneycpWzFdOworICAgICAgICAgICAgICAgIGF0dHJp
YnV0ZSA9IGF0dHJpYnV0ZS5zcGxpdCgnfScpWzBdOworICAgICAgICAgICAgICAgIHJldHVybiBh
dHRyaWJ1dGUuc3RyaXAoKTsKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAnJykgeworICAgICAgICAgICAgICBmID0gZnVuY3Rp
b24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gZWxl
bWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dHJp
YnV0ZSkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5zdHJp
cCgpOworICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWwgPSBu
dWxsOworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgfSkoKSwKKyAgICAgICAgICBf
ZmxhZzogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgICByZXR1cm4g
JChlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSA/IGF0dHJpYnV0ZSA6IG51bGw7Cisg
ICAgICAgICAgfSwKKyAgICAgICAgICBzdHlsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAg
ICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpOworICAgICAg
ICAgIH0sCisgICAgICAgICAgdGl0bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICAg
IHJldHVybiBlbGVtZW50LnRpdGxlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQor
ICAgIH0KKyAgfSkoKTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMud3JpdGUg
PSB7CisgICAgbmFtZXM6IE9iamVjdC5leHRlbmQoeworICAgICAgY2VsbHBhZGRpbmc6ICdjZWxs
UGFkZGluZycsCisgICAgICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJworICAgIH0sIEVsZW1l
bnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5yZWFkLm5hbWVzKSwKKyAgICB2YWx1ZXM6IHsKKyAg
ICAgIGNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgICAgIGVsZW1lbnQu
Y2hlY2tlZCA9ICEhdmFsdWU7CisgICAgICB9LAorCisgICAgICBzdHlsZTogZnVuY3Rpb24oZWxl
bWVudCwgdmFsdWUpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgPyB2
YWx1ZSA6ICcnOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVU
cmFuc2xhdGlvbnMuaGFzID0ge307CisKKyAgJHcoJ2NvbFNwYW4gcm93U3BhbiB2QWxpZ24gZGF0
ZVRpbWUgYWNjZXNzS2V5IHRhYkluZGV4ICcgKworICAgICAgJ2VuY1R5cGUgbWF4TGVuZ3RoIHJl
YWRPbmx5IGxvbmdEZXNjIGZyYW1lQm9yZGVyJykuZWFjaChmdW5jdGlvbihhdHRyKSB7CisgICAg
RWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlLm5hbWVzW2F0dHIudG9Mb3dlckNh
c2UoKV0gPSBhdHRyOworICAgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0
ci50b0xvd2VyQ2FzZSgpXSA9IGF0dHI7CisgIH0pOworCisgIChmdW5jdGlvbih2KSB7CisgICAg
T2JqZWN0LmV4dGVuZCh2LCB7CisgICAgICBocmVmOiAgICAgICAgdi5fZ2V0QXR0cjIsCisgICAg
ICBzcmM6ICAgICAgICAgdi5fZ2V0QXR0cjIsCisgICAgICB0eXBlOiAgICAgICAgdi5fZ2V0QXR0
ciwKKyAgICAgIGFjdGlvbjogICAgICB2Ll9nZXRBdHRyTm9kZSwKKyAgICAgIGRpc2FibGVkOiAg
ICB2Ll9mbGFnLAorICAgICAgY2hlY2tlZDogICAgIHYuX2ZsYWcsCisgICAgICByZWFkb25seTog
ICAgdi5fZmxhZywKKyAgICAgIG11bHRpcGxlOiAgICB2Ll9mbGFnLAorICAgICAgb25sb2FkOiAg
ICAgIHYuX2dldEV2LAorICAgICAgb251bmxvYWQ6ICAgIHYuX2dldEV2LAorICAgICAgb25jbGlj
azogICAgIHYuX2dldEV2LAorICAgICAgb25kYmxjbGljazogIHYuX2dldEV2LAorICAgICAgb25t
b3VzZWRvd246IHYuX2dldEV2LAorICAgICAgb25tb3VzZXVwOiAgIHYuX2dldEV2LAorICAgICAg
b25tb3VzZW92ZXI6IHYuX2dldEV2LAorICAgICAgb25tb3VzZW1vdmU6IHYuX2dldEV2LAorICAg
ICAgb25tb3VzZW91dDogIHYuX2dldEV2LAorICAgICAgb25mb2N1czogICAgIHYuX2dldEV2LAor
ICAgICAgb25ibHVyOiAgICAgIHYuX2dldEV2LAorICAgICAgb25rZXlwcmVzczogIHYuX2dldEV2
LAorICAgICAgb25rZXlkb3duOiAgIHYuX2dldEV2LAorICAgICAgb25rZXl1cDogICAgIHYuX2dl
dEV2LAorICAgICAgb25zdWJtaXQ6ICAgIHYuX2dldEV2LAorICAgICAgb25yZXNldDogICAgIHYu
X2dldEV2LAorICAgICAgb25zZWxlY3Q6ICAgIHYuX2dldEV2LAorICAgICAgb25jaGFuZ2U6ICAg
IHYuX2dldEV2CisgICAgfSk7CisgIH0pKEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5y
ZWFkLnZhbHVlcyk7CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4
dGVuc2lvbnMpIHsKKyAgICAoZnVuY3Rpb24oKSB7CisgICAgICBmdW5jdGlvbiBfZGVzY2VuZGFu
dHMoZWxlbWVudCkgeworICAgICAgICB2YXIgbm9kZXMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCcqJyksIHJlc3VsdHMgPSBbXTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7
IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlLnRhZ05hbWUgIT09ICIh
IikgLy8gRmlsdGVyIG91dCBjb21tZW50IG5vZGVzLgorICAgICAgICAgICAgcmVzdWx0cy5wdXNo
KG5vZGUpOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0KKworICAgICAgRWxlbWVu
dC5NZXRob2RzLmRvd24gPSBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgewor
ICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPT0gMSkgcmV0dXJuIGVsZW1lbnQuZmlyc3REZXNjZW5kYW50KCk7CisgICAgICAgIHJldHVy
biBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBfZGVzY2VuZGFudHMoZWxlbWVudClbZXhw
cmVzc2lvbl0gOgorICAgICAgICAgIEVsZW1lbnQuc2VsZWN0KGVsZW1lbnQsIGV4cHJlc3Npb24p
W2luZGV4IHx8IDBdOworICAgICAgfQorICAgIH0pKCk7CisgIH0KKworfQorCitlbHNlIGlmIChQ
cm90b3R5cGUuQnJvd3Nlci5HZWNrbyAmJiAvcnY6MVwuOFwuMC8udGVzdChuYXZpZ2F0b3IudXNl
ckFnZW50KSkgeworICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1l
bnQsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHls
ZS5vcGFjaXR5ID0gKHZhbHVlID09IDEpID8gMC45OTk5OTkgOgorICAgICAgKHZhbHVlID09PSAn
JykgPyAnJyA6ICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOworICAgIHJldHVybiBlbGVt
ZW50OworICB9OworfQorCitlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAg
RWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2
YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgPyAnJyA6CisgICAgICAodmFsdWUgPCAwLjAwMDAx
KSA/IDAgOiB2YWx1ZTsKKworICAgIGlmICh2YWx1ZSA9PSAxKQorICAgICAgaWYoZWxlbWVudC50
YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0lNRycgJiYgZWxlbWVudC53aWR0aCkgeworICAgICAg
ICBlbGVtZW50LndpZHRoKys7IGVsZW1lbnQud2lkdGgtLTsKKyAgICAgIH0gZWxzZSB0cnkgewor
ICAgICAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7CisgICAgICAgIGVs
ZW1lbnQuYXBwZW5kQ2hpbGQobik7CisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobik7Cisg
ICAgICB9IGNhdGNoIChlKSB7IH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9OworCisgIEVs
ZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0ID0gZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBl
bGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExl
ZnQgfHwgMDsKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5
KQorICAgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAn
YWJzb2x1dGUnKSBicmVhazsKKworICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50
OworICAgIH0gd2hpbGUgKGVsZW1lbnQpOworCisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9m
ZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH07Cit9CisKK2lmICgnb3V0ZXJIVE1MJyBpbiBkb2N1
bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKKyAgRWxlbWVudC5NZXRob2RzLnJlcGxhY2UgPSBmdW5j
dGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAg
ICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9F
bGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAgIGVs
ZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCwgZWxlbWVudCk7CisgICAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250
ZW50KTsKKyAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlLCB0YWdOYW1lID0gcGFy
ZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKworICAgIGlmIChFbGVtZW50Ll9pbnNlcnRpb25U
cmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXSkgeworICAgICAgdmFyIG5leHRTaWJsaW5nID0gZWxl
bWVudC5uZXh0KCk7CisgICAgICB2YXIgZnJhZ21lbnRzID0gRWxlbWVudC5fZ2V0Q29udGVudEZy
b21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpOworICAg
ICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgICAgaWYgKG5leHRTaWJsaW5nKQor
ICAgICAgICBmcmFnbWVudHMuZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5pbnNlcnRCZWZv
cmUobm9kZSwgbmV4dFNpYmxpbmcpIH0pOworICAgICAgZWxzZQorICAgICAgICBmcmFnbWVudHMu
ZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsKKyAgICB9
CisgICAgZWxzZSBlbGVtZW50Lm91dGVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CisK
KyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfTsKK30KKworRWxlbWVudC5fcmV0dXJuT2Zmc2V0ID0gZnVuY3Rpb24o
bCwgdCkgeworICB2YXIgcmVzdWx0ID0gW2wsIHRdOworICByZXN1bHQubGVmdCA9IGw7CisgIHJl
c3VsdC50b3AgPSB0OworICByZXR1cm4gcmVzdWx0OworfTsKKworRWxlbWVudC5fZ2V0Q29udGVu
dEZyb21Bbm9ueW1vdXNFbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgaHRtbCkgeworICB2YXIg
ZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpLCB0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRp
b25zLnRhZ3NbdGFnTmFtZV07CisgIGlmICh0KSB7CisgICAgZGl2LmlubmVySFRNTCA9IHRbMF0g
KyBodG1sICsgdFsxXTsKKyAgICB0WzJdLnRpbWVzKGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYuZmly
c3RDaGlsZCB9KTsKKyAgfSBlbHNlIGRpdi5pbm5lckhUTUwgPSBodG1sOworICByZXR1cm4gJEEo
ZGl2LmNoaWxkTm9kZXMpOworfTsKKworRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zID0g
eworICBiZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50LnBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQpOworICB9LAorICB0b3A6IGZ1bmN0aW9u
KGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50Lmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50
LmZpcnN0Q2hpbGQpOworICB9LAorICBib3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsK
KyAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOworICB9LAorICBhZnRlcjogZnVuY3Rpb24o
ZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9k
ZSwgZWxlbWVudC5uZXh0U2libGluZyk7CisgIH0sCisgIHRhZ3M6IHsKKyAgICBUQUJMRTogIFsn
PHRhYmxlPicsICAgICAgICAgICAgICAgICc8L3RhYmxlPicsICAgICAgICAgICAgICAgICAgIDFd
LAorICAgIFRCT0RZOiAgWyc8dGFibGU+PHRib2R5PicsICAgICAgICAgJzwvdGJvZHk+PC90YWJs
ZT4nLCAgICAgICAgICAgMl0sCisgICAgVFI6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPicsICAg
ICAnPC90cj48L3Rib2R5PjwvdGFibGU+JywgICAgICAzXSwKKyAgICBURDogICAgIFsnPHRhYmxl
Pjx0Ym9keT48dHI+PHRkPicsICc8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPicsIDRdLAorICAg
IFNFTEVDVDogWyc8c2VsZWN0PicsICAgICAgICAgICAgICAgJzwvc2VsZWN0PicsICAgICAgICAg
ICAgICAgICAgMV0KKyAgfQorfTsKKworKGZ1bmN0aW9uKCkgeworICB2YXIgdGFncyA9IEVsZW1l
bnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzOworICBPYmplY3QuZXh0ZW5kKHRhZ3MsIHsK
KyAgICBUSEVBRDogdGFncy5UQk9EWSwKKyAgICBURk9PVDogdGFncy5UQk9EWSwKKyAgICBUSDog
ICAgdGFncy5URAorICB9KTsKK30pKCk7CisKK0VsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQgPSB7
CisgIGhhc0F0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgYXR0
cmlidXRlID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhc1thdHRyaWJ1dGVdIHx8
IGF0dHJpYnV0ZTsKKyAgICB2YXIgbm9kZSA9ICQoZWxlbWVudCkuZ2V0QXR0cmlidXRlTm9kZShh
dHRyaWJ1dGUpOworICAgIHJldHVybiAhIShub2RlICYmIG5vZGUuc3BlY2lmaWVkKTsKKyAgfQor
fTsKKworRWxlbWVudC5NZXRob2RzLkJ5VGFnID0geyB9OworCitPYmplY3QuZXh0ZW5kKEVsZW1l
bnQsIEVsZW1lbnQuTWV0aG9kcyk7CisKKyhmdW5jdGlvbihkaXYpIHsKKworICBpZiAoIVByb3Rv
dHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYgZGl2WydfX3Byb3RvX18n
XSkgeworICAgIHdpbmRvdy5IVE1MRWxlbWVudCA9IHsgfTsKKyAgICB3aW5kb3cuSFRNTEVsZW1l
bnQucHJvdG90eXBlID0gZGl2WydfX3Byb3RvX18nXTsKKyAgICBQcm90b3R5cGUuQnJvd3NlckZl
YXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zID0gdHJ1ZTsKKyAgfQorCisgIGRpdiA9IG51bGw7CisK
K30pKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKQorCitFbGVtZW50LmV4dGVuZCA9IChm
dW5jdGlvbigpIHsKKworICBmdW5jdGlvbiBjaGVja0RlZmljaWVuY3kodGFnTmFtZSkgeworICAg
IGlmICh0eXBlb2Ygd2luZG93LkVsZW1lbnQgIT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIHZhciBw
cm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTsKKyAgICAgIGlmIChwcm90bykgeworICAg
ICAgICB2YXIgaWQgPSAnXycgKyAoTWF0aC5yYW5kb20oKSsnJykuc2xpY2UoMik7CisgICAgICAg
IHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CisgICAgICAgIHByb3Rv
W2lkXSA9ICd4JzsKKyAgICAgICAgdmFyIGlzQnVnZ3kgPSAoZWxbaWRdICE9PSAneCcpOworICAg
ICAgICBkZWxldGUgcHJvdG9baWRdOworICAgICAgICBlbCA9IG51bGw7CisgICAgICAgIHJldHVy
biBpc0J1Z2d5OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBm
dW5jdGlvbiBleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LCBtZXRob2RzKSB7CisgICAgZm9yICh2
YXIgcHJvcGVydHkgaW4gbWV0aG9kcykgeworICAgICAgdmFyIHZhbHVlID0gbWV0aG9kc1twcm9w
ZXJ0eV07CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYmICEocHJvcGVydHkg
aW4gZWxlbWVudCkpCisgICAgICAgIGVsZW1lbnRbcHJvcGVydHldID0gdmFsdWUubWV0aG9kaXpl
KCk7CisgICAgfQorICB9CisKKyAgdmFyIEhUTUxPQkpFQ1RFTEVNRU5UX1BST1RPVFlQRV9CVUdH
WSA9IGNoZWNrRGVmaWNpZW5jeSgnb2JqZWN0Jyk7CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2Vy
RmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucykgeworICAgIGlmIChIVE1MT0JKRUNU
RUxFTUVOVF9QUk9UT1RZUEVfQlVHR1kpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgICAgIGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50Ll9leHRlbmRlZEJ5UHJv
dG90eXBlID09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgdmFyIHQgPSBlbGVtZW50LnRhZ05h
bWU7CisgICAgICAgICAgaWYgKHQgJiYgKC9eKD86b2JqZWN0fGFwcGxldHxlbWJlZCkkL2kudGVz
dCh0KSkpIHsKKyAgICAgICAgICAgIGV4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsIEVsZW1lbnQu
TWV0aG9kcyk7CisgICAgICAgICAgICBleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LCBFbGVtZW50
Lk1ldGhvZHMuU2ltdWxhdGVkKTsKKyAgICAgICAgICAgIGV4dGVuZEVsZW1lbnRXaXRoKGVsZW1l
bnQsIEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0LnRvVXBwZXJDYXNlKCldKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiBQcm90b3R5cGUuSzsKKyAgfQorCisgIHZhciBNZXRob2RzID0geyB9LCBCeVRhZyA9
IEVsZW1lbnQuTWV0aG9kcy5CeVRhZzsKKworICB2YXIgZXh0ZW5kID0gT2JqZWN0LmV4dGVuZChm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50Ll9l
eHRlbmRlZEJ5UHJvdG90eXBlICE9ICd1bmRlZmluZWQnIHx8CisgICAgICAgIGVsZW1lbnQubm9k
ZVR5cGUgIT0gMSB8fCBlbGVtZW50ID09IHdpbmRvdykgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICB2
YXIgbWV0aG9kcyA9IE9iamVjdC5jbG9uZShNZXRob2RzKSwKKyAgICAgICAgdGFnTmFtZSA9IGVs
ZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworCisgICAgaWYgKEJ5VGFnW3RhZ05hbWVdKSBP
YmplY3QuZXh0ZW5kKG1ldGhvZHMsIEJ5VGFnW3RhZ05hbWVdKTsKKworICAgIGV4dGVuZEVsZW1l
bnRXaXRoKGVsZW1lbnQsIG1ldGhvZHMpOworCisgICAgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3Rv
dHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIHJldHVybiBlbGVtZW50OworCisg
IH0sIHsKKyAgICByZWZyZXNoOiBmdW5jdGlvbigpIHsKKyAgICAgIGlmICghUHJvdG90eXBlLkJy
b3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucykgeworICAgICAgICBPYmplY3QuZXh0ZW5k
KE1ldGhvZHMsIEVsZW1lbnQuTWV0aG9kcyk7CisgICAgICAgIE9iamVjdC5leHRlbmQoTWV0aG9k
cywgRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCk7CisgICAgICB9CisgICAgfQorICB9KTsKKwor
ICBleHRlbmQucmVmcmVzaCgpOworICByZXR1cm4gZXh0ZW5kOworfSkoKTsKKworRWxlbWVudC5o
YXNBdHRyaWJ1dGUgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgaWYgKGVsZW1l
bnQuaGFzQXR0cmlidXRlKSByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKTsK
KyAgcmV0dXJuIEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQuaGFzQXR0cmlidXRlKGVsZW1lbnQs
IGF0dHJpYnV0ZSk7Cit9OworCitFbGVtZW50LmFkZE1ldGhvZHMgPSBmdW5jdGlvbihtZXRob2Rz
KSB7CisgIHZhciBGID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcywgVCA9IEVsZW1lbnQuTWV0
aG9kcy5CeVRhZzsKKworICBpZiAoIW1ldGhvZHMpIHsKKyAgICBPYmplY3QuZXh0ZW5kKEZvcm0s
IEZvcm0uTWV0aG9kcyk7CisgICAgT2JqZWN0LmV4dGVuZChGb3JtLkVsZW1lbnQsIEZvcm0uRWxl
bWVudC5NZXRob2RzKTsKKyAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRhZywg
eworICAgICAgIkZPUk0iOiAgICAgT2JqZWN0LmNsb25lKEZvcm0uTWV0aG9kcyksCisgICAgICAi
SU5QVVQiOiAgICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLAorICAgICAgIlNF
TEVDVCI6ICAgT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKKyAgICAgICJURVhU
QVJFQSI6IE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcykKKyAgICB9KTsKKyAgfQor
CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsKKyAgICB2YXIgdGFnTmFtZSA9IG1ldGhv
ZHM7CisgICAgbWV0aG9kcyA9IGFyZ3VtZW50c1sxXTsKKyAgfQorCisgIGlmICghdGFnTmFtZSkg
T2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsIG1ldGhvZHMgfHwgeyB9KTsKKyAgZWxzZSB7
CisgICAgaWYgKE9iamVjdC5pc0FycmF5KHRhZ05hbWUpKSB0YWdOYW1lLmVhY2goZXh0ZW5kKTsK
KyAgICBlbHNlIGV4dGVuZCh0YWdOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIGV4dGVuZCh0YWdO
YW1lKSB7CisgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICBpZiAoIUVs
ZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSkKKyAgICAgIEVsZW1lbnQuTWV0aG9kcy5CeVRh
Z1t0YWdOYW1lXSA9IHsgfTsKKyAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRh
Z1t0YWdOYW1lXSwgbWV0aG9kcyk7CisgIH0KKworICBmdW5jdGlvbiBjb3B5KG1ldGhvZHMsIGRl
c3RpbmF0aW9uLCBvbmx5SWZBYnNlbnQpIHsKKyAgICBvbmx5SWZBYnNlbnQgPSBvbmx5SWZBYnNl
bnQgfHwgZmFsc2U7CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gbWV0aG9kcykgeworICAgICAg
dmFyIHZhbHVlID0gbWV0aG9kc1twcm9wZXJ0eV07CisgICAgICBpZiAoIU9iamVjdC5pc0Z1bmN0
aW9uKHZhbHVlKSkgY29udGludWU7CisgICAgICBpZiAoIW9ubHlJZkFic2VudCB8fCAhKHByb3Bl
cnR5IGluIGRlc3RpbmF0aW9uKSkKKyAgICAgICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gdmFs
dWUubWV0aG9kaXplKCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZmluZERPTUNsYXNzKHRh
Z05hbWUpIHsKKyAgICB2YXIga2xhc3M7CisgICAgdmFyIHRyYW5zID0geworICAgICAgIk9QVEdS
T1VQIjogIk9wdEdyb3VwIiwgIlRFWFRBUkVBIjogIlRleHRBcmVhIiwgIlAiOiAiUGFyYWdyYXBo
IiwKKyAgICAgICJGSUVMRFNFVCI6ICJGaWVsZFNldCIsICJVTCI6ICJVTGlzdCIsICJPTCI6ICJP
TGlzdCIsICJETCI6ICJETGlzdCIsCisgICAgICAiRElSIjogIkRpcmVjdG9yeSIsICJIMSI6ICJI
ZWFkaW5nIiwgIkgyIjogIkhlYWRpbmciLCAiSDMiOiAiSGVhZGluZyIsCisgICAgICAiSDQiOiAi
SGVhZGluZyIsICJINSI6ICJIZWFkaW5nIiwgIkg2IjogIkhlYWRpbmciLCAiUSI6ICJRdW90ZSIs
CisgICAgICAiSU5TIjogIk1vZCIsICJERUwiOiAiTW9kIiwgIkEiOiAiQW5jaG9yIiwgIklNRyI6
ICJJbWFnZSIsICJDQVBUSU9OIjoKKyAgICAgICJUYWJsZUNhcHRpb24iLCAiQ09MIjogIlRhYmxl
Q29sIiwgIkNPTEdST1VQIjogIlRhYmxlQ29sIiwgIlRIRUFEIjoKKyAgICAgICJUYWJsZVNlY3Rp
b24iLCAiVEZPT1QiOiAiVGFibGVTZWN0aW9uIiwgIlRCT0RZIjogIlRhYmxlU2VjdGlvbiIsICJU
UiI6CisgICAgICAiVGFibGVSb3ciLCAiVEgiOiAiVGFibGVDZWxsIiwgIlREIjogIlRhYmxlQ2Vs
bCIsICJGUkFNRVNFVCI6CisgICAgICAiRnJhbWVTZXQiLCAiSUZSQU1FIjogIklGcmFtZSIKKyAg
ICB9OworICAgIGlmICh0cmFuc1t0YWdOYW1lXSkga2xhc3MgPSAnSFRNTCcgKyB0cmFuc1t0YWdO
YW1lXSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1tr
bGFzc107CisgICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lICsgJ0VsZW1lbnQnOworICAgIGlm
ICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsKKyAgICBrbGFzcyA9ICdIVE1M
JyArIHRhZ05hbWUuY2FwaXRhbGl6ZSgpICsgJ0VsZW1lbnQnOworICAgIGlmICh3aW5kb3dba2xh
c3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsKKworICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKKyAgICB2YXIgcHJvdG8gPSBlbGVtZW50WydfX3Byb3Rv
X18nXSB8fCBlbGVtZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKKyAgICBlbGVtZW50ID0gbnVs
bDsKKyAgICByZXR1cm4gcHJvdG87CisgIH0KKworICB2YXIgZWxlbWVudFByb3RvdHlwZSA9IHdp
bmRvdy5IVE1MRWxlbWVudCA/IEhUTUxFbGVtZW50LnByb3RvdHlwZSA6CisgICBFbGVtZW50LnBy
b3RvdHlwZTsKKworICBpZiAoRi5FbGVtZW50RXh0ZW5zaW9ucykgeworICAgIGNvcHkoRWxlbWVu
dC5NZXRob2RzLCBlbGVtZW50UHJvdG90eXBlKTsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcy5T
aW11bGF0ZWQsIGVsZW1lbnRQcm90b3R5cGUsIHRydWUpOworICB9CisKKyAgaWYgKEYuU3BlY2lm
aWNFbGVtZW50RXh0ZW5zaW9ucykgeworICAgIGZvciAodmFyIHRhZyBpbiBFbGVtZW50Lk1ldGhv
ZHMuQnlUYWcpIHsKKyAgICAgIHZhciBrbGFzcyA9IGZpbmRET01DbGFzcyh0YWcpOworICAgICAg
aWYgKE9iamVjdC5pc1VuZGVmaW5lZChrbGFzcykpIGNvbnRpbnVlOworICAgICAgY29weShUW3Rh
Z10sIGtsYXNzLnByb3RvdHlwZSk7CisgICAgfQorICB9CisKKyAgT2JqZWN0LmV4dGVuZChFbGVt
ZW50LCBFbGVtZW50Lk1ldGhvZHMpOworICBkZWxldGUgRWxlbWVudC5CeVRhZzsKKworICBpZiAo
RWxlbWVudC5leHRlbmQucmVmcmVzaCkgRWxlbWVudC5leHRlbmQucmVmcmVzaCgpOworICBFbGVt
ZW50LmNhY2hlID0geyB9OworfTsKKworCitkb2N1bWVudC52aWV3cG9ydCA9IHsKKworICBnZXRE
aW1lbnNpb25zOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4geyB3aWR0aDogdGhpcy5nZXRXaWR0
aCgpLCBoZWlnaHQ6IHRoaXMuZ2V0SGVpZ2h0KCkgfTsKKyAgfSwKKworICBnZXRTY3JvbGxPZmZz
ZXRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KAorICAg
ICAgd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxM
ZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwKKyAgICAgIHdpbmRvdy5wYWdlWU9mZnNl
dCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICB8fCBkb2N1bWVudC5ib2R5
LnNjcm9sbFRvcCk7CisgIH0KK307CisKKyhmdW5jdGlvbih2aWV3cG9ydCkgeworICB2YXIgQiA9
IFByb3RvdHlwZS5Ccm93c2VyLCBkb2MgPSBkb2N1bWVudCwgZWxlbWVudCwgcHJvcGVydHkgPSB7
fTsKKworICBmdW5jdGlvbiBnZXRSb290RWxlbWVudCgpIHsKKyAgICBpZiAoQi5XZWJLaXQgJiYg
IWRvYy5ldmFsdWF0ZSkKKyAgICAgIHJldHVybiBkb2N1bWVudDsKKworICAgIGlmIChCLk9wZXJh
ICYmIHdpbmRvdy5wYXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpIDwgOS41KQorICAg
ICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7CisKKyAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRF
bGVtZW50OworICB9CisKKyAgZnVuY3Rpb24gZGVmaW5lKEQpIHsKKyAgICBpZiAoIWVsZW1lbnQp
IGVsZW1lbnQgPSBnZXRSb290RWxlbWVudCgpOworCisgICAgcHJvcGVydHlbRF0gPSAnY2xpZW50
JyArIEQ7CisKKyAgICB2aWV3cG9ydFsnZ2V0JyArIERdID0gZnVuY3Rpb24oKSB7IHJldHVybiBl
bGVtZW50W3Byb3BlcnR5W0RdXSB9OworICAgIHJldHVybiB2aWV3cG9ydFsnZ2V0JyArIERdKCk7
CisgIH0KKworICB2aWV3cG9ydC5nZXRXaWR0aCAgPSBkZWZpbmUuY3VycnkoJ1dpZHRoJyk7CisK
KyAgdmlld3BvcnQuZ2V0SGVpZ2h0ID0gZGVmaW5lLmN1cnJ5KCdIZWlnaHQnKTsKK30pKGRvY3Vt
ZW50LnZpZXdwb3J0KTsKKworCitFbGVtZW50LlN0b3JhZ2UgPSB7CisgIFVJRDogMQorfTsKKwor
RWxlbWVudC5hZGRNZXRob2RzKHsKKyAgZ2V0U3RvcmFnZTogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworCisgICAgdmFyIHVpZDsK
KyAgICBpZiAoZWxlbWVudCA9PT0gd2luZG93KSB7CisgICAgICB1aWQgPSAwOworICAgIH0gZWxz
ZSB7CisgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuX3Byb3RvdHlwZVVJRCA9PT0gInVuZGVmaW5l
ZCIpCisgICAgICAgIGVsZW1lbnQuX3Byb3RvdHlwZVVJRCA9IFtFbGVtZW50LlN0b3JhZ2UuVUlE
KytdOworICAgICAgdWlkID0gZWxlbWVudC5fcHJvdG90eXBlVUlEWzBdOworICAgIH0KKworICAg
IGlmICghRWxlbWVudC5TdG9yYWdlW3VpZF0pCisgICAgICBFbGVtZW50LlN0b3JhZ2VbdWlkXSA9
ICRIKCk7CisKKyAgICByZXR1cm4gRWxlbWVudC5TdG9yYWdlW3VpZF07CisgIH0sCisKKyAgc3Rv
cmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGtleSwgdmFsdWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0g
JChlbGVtZW50KSkpIHJldHVybjsKKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7
CisgICAgICBFbGVtZW50LmdldFN0b3JhZ2UoZWxlbWVudCkudXBkYXRlKGtleSk7CisgICAgfSBl
bHNlIHsKKyAgICAgIEVsZW1lbnQuZ2V0U3RvcmFnZShlbGVtZW50KS5zZXQoa2V5LCB2YWx1ZSk7
CisgICAgfQorCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmV0cmlldmU6IGZ1bmN0
aW9uKGVsZW1lbnQsIGtleSwgZGVmYXVsdFZhbHVlKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQo
ZWxlbWVudCkpKSByZXR1cm47CisgICAgdmFyIGhhc2ggPSBFbGVtZW50LmdldFN0b3JhZ2UoZWxl
bWVudCksIHZhbHVlID0gaGFzaC5nZXQoa2V5KTsKKworICAgIGlmIChPYmplY3QuaXNVbmRlZmlu
ZWQodmFsdWUpKSB7CisgICAgICBoYXNoLnNldChrZXksIGRlZmF1bHRWYWx1ZSk7CisgICAgICB2
YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0sCisK
KyAgY2xvbmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGRlZXApIHsKKyAgICBpZiAoIShlbGVtZW50ID0g
JChlbGVtZW50KSkpIHJldHVybjsKKyAgICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZShk
ZWVwKTsKKyAgICBjbG9uZS5fcHJvdG90eXBlVUlEID0gdm9pZCAwOworICAgIGlmIChkZWVwKSB7
CisgICAgICB2YXIgZGVzY2VuZGFudHMgPSBFbGVtZW50LnNlbGVjdChjbG9uZSwgJyonKSwKKyAg
ICAgICAgICBpID0gZGVzY2VuZGFudHMubGVuZ3RoOworICAgICAgd2hpbGUgKGktLSkgeworICAg
ICAgICBkZXNjZW5kYW50c1tpXS5fcHJvdG90eXBlVUlEID0gdm9pZCAwOworICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoY2xvbmUpOworICB9Cit9KTsKKy8qIFBvcnRp
b25zIG9mIHRoZSBTZWxlY3RvciBjbGFzcyBhcmUgZGVyaXZlZCBmcm9tIEphY2sgU2xvY3VtJ3Mg
RG9tUXVlcnksCisgKiBwYXJ0IG9mIFlVSS1FeHQgdmVyc2lvbiAwLjQwLCBkaXN0cmlidXRlZCB1
bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlCisgKiBsaWNlbnNlLiAgUGxlYXNlIHNlZSBo
dHRwOi8vd3d3Lnl1aS1leHQuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8KKwordmFyIFNl
bGVjdG9yID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZXhwcmVzc2lv
bikgeworICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3RyaXAoKTsKKworICAgIGlm
ICh0aGlzLnNob3VsZFVzZVNlbGVjdG9yc0FQSSgpKSB7CisgICAgICB0aGlzLm1vZGUgPSAnc2Vs
ZWN0b3JzQVBJJzsKKyAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkVXNlWFBhdGgoKSkgeworICAg
ICAgdGhpcy5tb2RlID0gJ3hwYXRoJzsKKyAgICAgIHRoaXMuY29tcGlsZVhQYXRoTWF0Y2hlcigp
OworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLm1vZGUgPSAibm9ybWFsIjsKKyAgICAgIHRoaXMu
Y29tcGlsZU1hdGNoZXIoKTsKKyAgICB9CisKKyAgfSwKKworICBzaG91bGRVc2VYUGF0aDogKGZ1
bmN0aW9uKCkgeworCisgICAgdmFyIElTX0RFU0NFTkRBTlRfU0VMRUNUT1JfQlVHR1kgPSAoZnVu
Y3Rpb24oKXsKKyAgICAgIHZhciBpc0J1Z2d5ID0gZmFsc2U7CisgICAgICBpZiAoZG9jdW1lbnQu
ZXZhbHVhdGUgJiYgd2luZG93LlhQYXRoUmVzdWx0KSB7CisgICAgICAgIHZhciBlbCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICBlbC5pbm5lckhUTUwgPSAnPHVsPjxs
aT48L2xpPjwvdWw+PGRpdj48dWw+PGxpPjwvbGk+PC91bD48L2Rpdj4nOworCisgICAgICAgIHZh
ciB4cGF0aCA9ICIuLy8qW2xvY2FsLW5hbWUoKT0ndWwnIG9yIGxvY2FsLW5hbWUoKT0nVUwnXSIg
KworICAgICAgICAgICIvLypbbG9jYWwtbmFtZSgpPSdsaScgb3IgbG9jYWwtbmFtZSgpPSdMSSdd
IjsKKworICAgICAgICB2YXIgcmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGVsLCBu
dWxsLAorICAgICAgICAgIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBu
dWxsKTsKKworICAgICAgICBpc0J1Z2d5ID0gKHJlc3VsdC5zbmFwc2hvdExlbmd0aCAhPT0gMik7
CisgICAgICAgIGVsID0gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpc0J1Z2d5OworICAg
IH0pKCk7CisKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICBpZiAoIVByb3RvdHlwZS5C
cm93c2VyRmVhdHVyZXMuWFBhdGgpIHJldHVybiBmYWxzZTsKKworICAgICAgdmFyIGUgPSB0aGlz
LmV4cHJlc3Npb247CisKKyAgICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgJiYKKyAg
ICAgICAoZS5pbmNsdWRlKCItb2YtdHlwZSIpIHx8IGUuaW5jbHVkZSgiOmVtcHR5IikpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICgoLyhcW1tcdy1dKj86fDpjaGVja2VkKS8p
LnRlc3QoZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKElTX0RFU0NFTkRB
TlRfU0VMRUNUT1JfQlVHR1kpIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgIH0pKCksCisKKyAgc2hvdWxkVXNlU2VsZWN0b3JzQVBJOiBmdW5jdGlvbigpIHsK
KyAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU2VsZWN0b3JzQVBJKSByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoU2VsZWN0b3IuQ0FTRV9JTlNFTlNJVElWRV9DTEFTU19OQU1FUykg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFTZWxlY3Rvci5fZGl2KSBTZWxlY3Rvci5fZGl2ID0g
bmV3IEVsZW1lbnQoJ2RpdicpOworCisgICAgdHJ5IHsKKyAgICAgIFNlbGVjdG9yLl9kaXYucXVl
cnlTZWxlY3Rvcih0aGlzLmV4cHJlc3Npb24pOworICAgIH0gY2F0Y2goZSkgeworICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9LAorCisgIGNvbXBpbGVN
YXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBT
ZWxlY3Rvci5wYXR0ZXJucywgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLAorICAgICAgICBjID0gU2Vs
ZWN0b3IuY3JpdGVyaWEsIGxlLCBwLCBtLCBsZW4gPSBwcy5sZW5ndGgsIG5hbWU7CisKKyAgICBp
ZiAoU2VsZWN0b3IuX2NhY2hlW2VdKSB7CisgICAgICB0aGlzLm1hdGNoZXIgPSBTZWxlY3Rvci5f
Y2FjaGVbZV07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyID0gWyJ0
aGlzLm1hdGNoZXIgPSBmdW5jdGlvbihyb290KSB7IiwKKyAgICAgICAgICAgICAgICAgICAgInZh
ciByID0gcm9vdCwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBjID0gZmFsc2UsIG47Il07CisKKyAg
ICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBsZSA9IGU7
CisgICAgICBmb3IgKHZhciBpID0gMDsgaTxsZW47IGkrKykgeworICAgICAgICBwID0gcHNbaV0u
cmU7CisgICAgICAgIG5hbWUgPSBwc1tpXS5uYW1lOworICAgICAgICBpZiAobSA9IGUubWF0Y2go
cCkpIHsKKyAgICAgICAgICB0aGlzLm1hdGNoZXIucHVzaChPYmplY3QuaXNGdW5jdGlvbihjW25h
bWVdKSA/IGNbbmFtZV0obSkgOgorICAgICAgICAgICAgbmV3IFRlbXBsYXRlKGNbbmFtZV0pLmV2
YWx1YXRlKG0pKTsKKyAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRoaXMubWF0Y2hlci5w
dXNoKCJyZXR1cm4gaC51bmlxdWUobik7XG59Iik7CisgICAgZXZhbCh0aGlzLm1hdGNoZXIuam9p
bignXG4nKSk7CisgICAgU2VsZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLm1h
dGNoZXI7CisgIH0sCisKKyAgY29tcGlsZVhQYXRoTWF0Y2hlcjogZnVuY3Rpb24oKSB7CisgICAg
dmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVybnMsCisgICAgICAg
IHggPSBTZWxlY3Rvci54cGF0aCwgbGUsIG0sIGxlbiA9IHBzLmxlbmd0aCwgbmFtZTsKKworICAg
IGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKKyAgICAgIHRoaXMueHBhdGggPSBTZWxlY3Rvci5f
Y2FjaGVbZV07IHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLm1hdGNoZXIgPSBbJy4vLyonXTsK
KyAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBsZSA9
IGU7CisgICAgICBmb3IgKHZhciBpID0gMDsgaTxsZW47IGkrKykgeworICAgICAgICBuYW1lID0g
cHNbaV0ubmFtZTsKKyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBzW2ldLnJlKSkgeworICAgICAg
ICAgIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKHhbbmFtZV0pID8geFtuYW1l
XShtKSA6CisgICAgICAgICAgICBuZXcgVGVtcGxhdGUoeFtuYW1lXSkuZXZhbHVhdGUobSkpOwor
ICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy54cGF0aCA9IHRoaXMubWF0Y2hlci5q
b2luKCcnKTsKKyAgICBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXSA9IHRoaXMueHBh
dGg7CisgIH0sCisKKyAgZmluZEVsZW1lbnRzOiBmdW5jdGlvbihyb290KSB7CisgICAgcm9vdCA9
IHJvb3QgfHwgZG9jdW1lbnQ7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHJlc3VsdHM7
CisKKyAgICBzd2l0Y2ggKHRoaXMubW9kZSkgeworICAgICAgY2FzZSAnc2VsZWN0b3JzQVBJJzoK
KyAgICAgICAgaWYgKHJvb3QgIT09IGRvY3VtZW50KSB7CisgICAgICAgICAgdmFyIG9sZElkID0g
cm9vdC5pZCwgaWQgPSAkKHJvb3QpLmlkZW50aWZ5KCk7CisgICAgICAgICAgaWQgPSBpZC5yZXBs
YWNlKC8oW1wuOl0pL2csICJcXCQxIik7CisgICAgICAgICAgZSA9ICIjIiArIGlkICsgIiAiICsg
ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdHMgPSAkQShyb290LnF1ZXJ5U2VsZWN0b3JB
bGwoZSkpLm1hcChFbGVtZW50LmV4dGVuZCk7CisgICAgICAgIHJvb3QuaWQgPSBvbGRJZDsKKwor
ICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIGNhc2UgJ3hwYXRoJzoKKyAgICAgICAgcmV0
dXJuIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgodGhpcy54cGF0aCwgcm9vdCk7CisgICAg
ICBkZWZhdWx0OgorICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXIocm9vdCk7CisgICAgfQorICB9
LAorCisgIG1hdGNoOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdGhpcy50b2tlbnMgPSBbXTsK
KworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLCBh
cyA9IFNlbGVjdG9yLmFzc2VydGlvbnM7CisgICAgdmFyIGxlLCBwLCBtLCBsZW4gPSBwcy5sZW5n
dGgsIG5hbWU7CisKKyAgICB3aGlsZSAoZSAmJiBsZSAhPT0gZSAmJiAoL1xTLykudGVzdChlKSkg
eworICAgICAgbGUgPSBlOworICAgICAgZm9yICh2YXIgaSA9IDA7IGk8bGVuOyBpKyspIHsKKyAg
ICAgICAgcCA9IHBzW2ldLnJlOworICAgICAgICBuYW1lID0gcHNbaV0ubmFtZTsKKyAgICAgICAg
aWYgKG0gPSBlLm1hdGNoKHApKSB7CisgICAgICAgICAgaWYgKGFzW25hbWVdKSB7CisgICAgICAg
ICAgICB0aGlzLnRva2Vucy5wdXNoKFtuYW1lLCBPYmplY3QuY2xvbmUobSldKTsKKyAgICAgICAg
ICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5maW5kRWxlbWVudHMoZG9jdW1lbnQpLmluY2x1ZGUoZWxlbWVudCk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1hdGNo
ID0gdHJ1ZSwgbmFtZSwgbWF0Y2hlczsKKyAgICBmb3IgKHZhciBpID0gMCwgdG9rZW47IHRva2Vu
ID0gdGhpcy50b2tlbnNbaV07IGkrKykgeworICAgICAgbmFtZSA9IHRva2VuWzBdLCBtYXRjaGVz
ID0gdG9rZW5bMV07CisgICAgICBpZiAoIVNlbGVjdG9yLmFzc2VydGlvbnNbbmFtZV0oZWxlbWVu
dCwgbWF0Y2hlcykpIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsgYnJlYWs7CisgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIG1hdGNoOworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiAiIzxTZWxlY3RvcjoiICsgdGhpcy5leHByZXNzaW9uLmluc3Bl
Y3QoKSArICI+IjsKKyAgfQorfSk7CisKK2lmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNl
bGVjdG9yc0FQSSAmJgorIGRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICdCYWNrQ29tcGF0Jykgewor
ICBTZWxlY3Rvci5DQVNFX0lOU0VOU0lUSVZFX0NMQVNTX05BTUVTID0gKGZ1bmN0aW9uKCl7Cisg
ICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLAorICAgICBzcGFuID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOworCisgICAgZGl2LmlkID0gInByb3RvdHlw
ZV90ZXN0X2lkIjsKKyAgICBzcGFuLmNsYXNzTmFtZSA9ICdUZXN0JzsKKyAgICBkaXYuYXBwZW5k
Q2hpbGQoc3Bhbik7CisgICAgdmFyIGlzSWdub3JlZCA9IChkaXYucXVlcnlTZWxlY3RvcignI3By
b3RvdHlwZV90ZXN0X2lkIC50ZXN0JykgIT09IG51bGwpOworICAgIGRpdiA9IHNwYW4gPSBudWxs
OworICAgIHJldHVybiBpc0lnbm9yZWQ7CisgIH0pKCk7Cit9CisKK09iamVjdC5leHRlbmQoU2Vs
ZWN0b3IsIHsKKyAgX2NhY2hlOiB7IH0sCisKKyAgeHBhdGg6IHsKKyAgICBkZXNjZW5kYW50OiAg
ICIvLyoiLAorICAgIGNoaWxkOiAgICAgICAgIi8qIiwKKyAgICBhZGphY2VudDogICAgICIvZm9s
bG93aW5nLXNpYmxpbmc6OipbMV0iLAorICAgIGxhdGVyU2libGluZzogJy9mb2xsb3dpbmctc2li
bGluZzo6KicsCisgICAgdGFnTmFtZTogICAgICBmdW5jdGlvbihtKSB7CisgICAgICBpZiAobVsx
XSA9PSAnKicpIHJldHVybiAnJzsKKyAgICAgIHJldHVybiAiW2xvY2FsLW5hbWUoKT0nIiArIG1b
MV0udG9Mb3dlckNhc2UoKSArCisgICAgICAgICAgICAgIicgb3IgbG9jYWwtbmFtZSgpPSciICsg
bVsxXS50b1VwcGVyQ2FzZSgpICsgIiddIjsKKyAgICB9LAorICAgIGNsYXNzTmFtZTogICAgIltj
b250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgI3sxfSAnKV0iLAorICAgIGlkOiAg
ICAgICAgICAgIltAaWQ9JyN7MX0nXSIsCisgICAgYXR0clByZXNlbmNlOiBmdW5jdGlvbihtKSB7
CisgICAgICBtWzFdID0gbVsxXS50b0xvd2VyQ2FzZSgpOworICAgICAgcmV0dXJuIG5ldyBUZW1w
bGF0ZSgiW0AjezF9XSIpLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgYXR0cjogZnVuY3Rpb24o
bSkgeworICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsKKyAgICAgIG1bM10gPSBtWzVd
IHx8IG1bNl07CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLm9wZXJh
dG9yc1ttWzJdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBwc2V1ZG86IGZ1bmN0aW9uKG0p
IHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IueHBhdGgucHNldWRvc1ttWzFdXTsKKyAgICAgIGlm
ICghaCkgcmV0dXJuICcnOworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGgpKSByZXR1cm4g
aChtKTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgucHNldWRvc1tt
WzFdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBvcGVyYXRvcnM6IHsKKyAgICAgICc9Jzog
ICJbQCN7MX09JyN7M30nXSIsCisgICAgICAnIT0nOiAiW0AjezF9IT0nI3szfSddIiwKKyAgICAg
ICdePSc6ICJbc3RhcnRzLXdpdGgoQCN7MX0sICcjezN9JyldIiwKKyAgICAgICckPSc6ICJbc3Vi
c3RyaW5nKEAjezF9LCAoc3RyaW5nLWxlbmd0aChAI3sxfSkgLSBzdHJpbmctbGVuZ3RoKCcjezN9
JykgKyAxKSk9JyN7M30nXSIsCisgICAgICAnKj0nOiAiW2NvbnRhaW5zKEAjezF9LCAnI3szfScp
XSIsCisgICAgICAnfj0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEAjezF9LCAnICcpLCAnICN7
M30gJyldIiwKKyAgICAgICd8PSc6ICJbY29udGFpbnMoY29uY2F0KCctJywgQCN7MX0sICctJyks
ICctI3szfS0nKV0iCisgICAgfSwKKyAgICBwc2V1ZG9zOiB7CisgICAgICAnZmlyc3QtY2hpbGQn
OiAnW25vdChwcmVjZWRpbmctc2libGluZzo6KildJywKKyAgICAgICdsYXN0LWNoaWxkJzogICdb
bm90KGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAorICAgICAgJ29ubHktY2hpbGQnOiAgJ1tub3Qo
cHJlY2VkaW5nLXNpYmxpbmc6Oiogb3IgZm9sbG93aW5nLXNpYmxpbmc6OiopXScsCisgICAgICAn
ZW1wdHknOiAgICAgICAiW2NvdW50KCopID0gMCBhbmQgKGNvdW50KHRleHQoKSkgPSAwKV0iLAor
ICAgICAgJ2NoZWNrZWQnOiAgICAgIltAY2hlY2tlZF0iLAorICAgICAgJ2Rpc2FibGVkJzogICAg
IlsoQGRpc2FibGVkKSBhbmQgKEB0eXBlIT0naGlkZGVuJyldIiwKKyAgICAgICdlbmFibGVkJzog
ICAgICJbbm90KEBkaXNhYmxlZCkgYW5kIChAdHlwZSE9J2hpZGRlbicpXSIsCisgICAgICAnbm90
JzogZnVuY3Rpb24obSkgeworICAgICAgICB2YXIgZSA9IG1bNl0sIHAgPSBTZWxlY3Rvci5wYXR0
ZXJucywKKyAgICAgICAgICAgIHggPSBTZWxlY3Rvci54cGF0aCwgbGUsIHYsIGxlbiA9IHAubGVu
Z3RoLCBuYW1lOworCisgICAgICAgIHZhciBleGNsdXNpb24gPSBbXTsKKyAgICAgICAgd2hpbGUg
KGUgJiYgbGUgIT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgICAgIGxlID0gZTsKKyAg
ICAgICAgICBmb3IgKHZhciBpID0gMDsgaTxsZW47IGkrKykgeworICAgICAgICAgICAgbmFtZSA9
IHBbaV0ubmFtZQorICAgICAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBbaV0ucmUpKSB7CisgICAg
ICAgICAgICAgIHYgPSBPYmplY3QuaXNGdW5jdGlvbih4W25hbWVdKSA/IHhbbmFtZV0obSkgOiBu
ZXcgVGVtcGxhdGUoeFtuYW1lXSkuZXZhbHVhdGUobSk7CisgICAgICAgICAgICAgIGV4Y2x1c2lv
bi5wdXNoKCIoIiArIHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSkgKyAiKSIpOworICAgICAg
ICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiW25v
dCgiICsgZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikgKyAiKV0iOworICAgICAgfSwKKyAgICAgICdu
dGgtY2hpbGQnOiAgICAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhw
YXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVjZWRpbmctc2libGluZzo6KikgKyAxKSAiLCBt
KTsKKyAgICAgIH0sCisgICAgICAnbnRoLWxhc3QtY2hpbGQnOiBmdW5jdGlvbihtKSB7CisgICAg
ICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGNvdW50KC4vZm9sbG93aW5n
LXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1vZi10eXBlJzog
ICAgZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5u
dGgoInBvc2l0aW9uKCkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1sYXN0LW9mLXR5cGUn
OiBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50
aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAnZmly
c3Qtb2YtdHlwZSc6ICBmdW5jdGlvbihtKSB7CisgICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBT
ZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAg
ICdsYXN0LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgbVs2XSA9ICIxIjsgcmV0
dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1sYXN0LW9mLXR5cGUnXShtKTsKKyAgICAg
IH0sCisgICAgICAnb25seS1vZi10eXBlJzogICBmdW5jdGlvbihtKSB7CisgICAgICAgIHZhciBw
ID0gU2VsZWN0b3IueHBhdGgucHNldWRvczsgcmV0dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXShtKSAr
IHBbJ2xhc3Qtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAgIG50aDogZnVuY3Rpb24oZnJh
Z21lbnQsIG0pIHsKKyAgICAgICAgdmFyIG1tLCBmb3JtdWxhID0gbVs2XSwgcHJlZGljYXRlOwor
ICAgICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7CisgICAgICAg
IGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVsYSA9ICcybisxJzsKKyAgICAgICAgaWYgKG1t
ID0gZm9ybXVsYS5tYXRjaCgvXihcZCspJC8pKSAvLyBkaWdpdCBvbmx5CisgICAgICAgICAgcmV0
dXJuICdbJyArIGZyYWdtZW50ICsgIj0gIiArIG1tWzFdICsgJ10nOworICAgICAgICBpZiAobW0g
PSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkgeyAvLyBhbitiCisg
ICAgICAgICAgaWYgKG1tWzFdID09ICItIikgbW1bMV0gPSAtMTsKKyAgICAgICAgICB2YXIgYSA9
IG1tWzFdID8gTnVtYmVyKG1tWzFdKSA6IDE7CisgICAgICAgICAgdmFyIGIgPSBtbVsyXSA/IE51
bWJlcihtbVsyXSkgOiAwOworICAgICAgICAgIHByZWRpY2F0ZSA9ICJbKCgje2ZyYWdtZW50fSAt
ICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIgKworICAgICAgICAgICIoKCN7ZnJhZ21lbnR9IC0g
I3tifSkgZGl2ICN7YX0gPj0gMCldIjsKKyAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHBy
ZWRpY2F0ZSkuZXZhbHVhdGUoeworICAgICAgICAgICAgZnJhZ21lbnQ6IGZyYWdtZW50LCBhOiBh
LCBiOiBiIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIGNyaXRlcmlh
OiB7CisgICAgdGFnTmFtZTogICAgICAnbiA9IGgudGFnTmFtZShuLCByLCAiI3sxfSIsIGMpOyAg
ICAgIGMgPSBmYWxzZTsnLAorICAgIGNsYXNzTmFtZTogICAgJ24gPSBoLmNsYXNzTmFtZShuLCBy
LCAiI3sxfSIsIGMpOyAgICBjID0gZmFsc2U7JywKKyAgICBpZDogICAgICAgICAgICduID0gaC5p
ZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAgICAgYyA9IGZhbHNlOycsCisgICAgYXR0clByZXNl
bmNlOiAnbiA9IGguYXR0clByZXNlbmNlKG4sIHIsICIjezF9IiwgYyk7IGMgPSBmYWxzZTsnLAor
ICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKKyAgICAgIG1bM10gPSAobVs1XSB8fCBtWzZdKTsKKyAg
ICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLmF0dHIobiwgciwgIiN7MX0iLCAiI3szfSIs
ICIjezJ9IiwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIHBzZXVk
bzogZnVuY3Rpb24obSkgeworICAgICAgaWYgKG1bNl0pIG1bNl0gPSBtWzZdLnJlcGxhY2UoLyIv
ZywgJ1xcIicpOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGgucHNldWRvKG4sICIj
ezF9IiwgIiN7Nn0iLCByLCBjKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOworICAgIH0sCisg
ICAgZGVzY2VuZGFudDogICAnYyA9ICJkZXNjZW5kYW50IjsnLAorICAgIGNoaWxkOiAgICAgICAg
J2MgPSAiY2hpbGQiOycsCisgICAgYWRqYWNlbnQ6ICAgICAnYyA9ICJhZGphY2VudCI7JywKKyAg
ICBsYXRlclNpYmxpbmc6ICdjID0gImxhdGVyU2libGluZyI7JworICB9LAorCisgIHBhdHRlcm5z
OiBbCisgICAgeyBuYW1lOiAnbGF0ZXJTaWJsaW5nJywgcmU6IC9eXHMqflxzKi8gfSwKKyAgICB7
IG5hbWU6ICdjaGlsZCcsICAgICAgICByZTogL15ccyo+XHMqLyB9LAorICAgIHsgbmFtZTogJ2Fk
amFjZW50JywgICAgIHJlOiAvXlxzKlwrXHMqLyB9LAorICAgIHsgbmFtZTogJ2Rlc2NlbmRhbnQn
LCAgIHJlOiAvXlxzLyB9LAorCisgICAgeyBuYW1lOiAndGFnTmFtZScsICAgICAgcmU6IC9eXHMq
KFwqfFtcd1wtXSspKFxifCQpPy8gfSwKKyAgICB7IG5hbWU6ICdpZCcsICAgICAgICAgICByZTog
L14jKFtcd1wtXCpdKykoXGJ8JCkvIH0sCisgICAgeyBuYW1lOiAnY2xhc3NOYW1lJywgICAgcmU6
IC9eXC4oW1x3XC1cKl0rKShcYnwkKS8gfSwKKyAgICB7IG5hbWU6ICdwc2V1ZG8nLCAgICAgICBy
ZTogL146KChmaXJzdHxsYXN0fG50aHxudGgtbGFzdHxvbmx5KSgtY2hpbGR8LW9mLXR5cGUpfGVt
cHR5fGNoZWNrZWR8KGVufGRpcylhYmxlZHxub3QpKFwoKC4qPylcKSk/KFxifCR8KD89XHN8Wzor
fj5dKSkvIH0sCisgICAgeyBuYW1lOiAnYXR0clByZXNlbmNlJywgcmU6IC9eXFsoKD86W1x3LV0r
Oik/W1x3LV0rKVxdLyB9LAorICAgIHsgbmFtZTogJ2F0dHInLCAgICAgICAgIHJlOiAvXFsoKD86
W1x3LV0qOik/W1x3LV0rKVxzKig/OihbIV4kKn58XT89KVxzKigoWyciXSkoW15cNF0qPylcNHwo
W14nIl1bXlxdXSo/KSkpP1xdLyB9CisgIF0sCisKKyAgYXNzZXJ0aW9uczogeworICAgIHRhZ05h
bWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBtYXRjaGVzWzFd
LnRvVXBwZXJDYXNlKCkgPT0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgfSwK
KworICAgIGNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0
dXJuIEVsZW1lbnQuaGFzQ2xhc3NOYW1lKGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgIH0sCisK
KyAgICBpZDogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIGVsZW1l
bnQuaWQgPT09IG1hdGNoZXNbMV07CisgICAgfSwKKworICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rp
b24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIEVsZW1lbnQuaGFzQXR0cmlidXRl
KGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgIH0sCisKKyAgICBhdHRyOiBmdW5jdGlvbihlbGVt
ZW50LCBtYXRjaGVzKSB7CisgICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFkQXR0cmli
dXRlKGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgICAgcmV0dXJuIG5vZGVWYWx1ZSAmJiBTZWxl
Y3Rvci5vcGVyYXRvcnNbbWF0Y2hlc1syXV0obm9kZVZhbHVlLCBtYXRjaGVzWzVdIHx8IG1hdGNo
ZXNbNl0pOworICAgIH0KKyAgfSwKKworICBoYW5kbGVyczogeworICAgIGNvbmNhdDogZnVuY3Rp
b24oYSwgYikgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKysp
CisgICAgICAgIGEucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAgICBt
YXJrOiBmdW5jdGlvbihub2RlcykgeworICAgICAgdmFyIF90cnVlID0gUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb247CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspCisgICAgICAgIG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IF90cnVlOworICAgICAgcmV0
dXJuIG5vZGVzOworICAgIH0sCisKKyAgICB1bm1hcms6IChmdW5jdGlvbigpeworCisgICAgICB2
YXIgUFJPUEVSVElFU19BVFRSSUJVVEVTX01BUCA9IChmdW5jdGlvbigpeworICAgICAgICB2YXIg
ZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKKyAgICAgICAgICAgIGlzQnVnZ3kg
PSBmYWxzZSwKKyAgICAgICAgICAgIHByb3BOYW1lID0gJ19jb3VudGVkQnlQcm90b3R5cGUnLAor
ICAgICAgICAgICAgdmFsdWUgPSAneCcKKyAgICAgICAgZWxbcHJvcE5hbWVdID0gdmFsdWU7Cisg
ICAgICAgIGlzQnVnZ3kgPSAoZWwuZ2V0QXR0cmlidXRlKHByb3BOYW1lKSA9PT0gdmFsdWUpOwor
ICAgICAgICBlbCA9IG51bGw7CisgICAgICAgIHJldHVybiBpc0J1Z2d5OworICAgICAgfSkoKTsK
KworICAgICAgcmV0dXJuIFBST1BFUlRJRVNfQVRUUklCVVRFU19NQVAgPworICAgICAgICBmdW5j
dGlvbihub2RlcykgeworICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdfY291bnRlZEJ5
UHJvdG90eXBlJyk7CisgICAgICAgICAgcmV0dXJuIG5vZGVzOworICAgICAgICB9IDoKKyAgICAg
ICAgZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9k
ZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICBub2RlLl9jb3VudGVkQnlQcm90b3R5cGUg
PSB2b2lkIDA7CisgICAgICAgICAgcmV0dXJuIG5vZGVzOworICAgICAgICB9CisgICAgfSkoKSwK
KworICAgIGluZGV4OiBmdW5jdGlvbihwYXJlbnROb2RlLCByZXZlcnNlLCBvZlR5cGUpIHsKKyAg
ICAgIHBhcmVudE5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0
aW9uOworICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgZm9yICh2YXIgbm9kZXMgPSBwYXJl
bnROb2RlLmNoaWxkTm9kZXMsIGkgPSBub2Rlcy5sZW5ndGggLSAxLCBqID0gMTsgaSA+PSAwOyBp
LS0pIHsKKyAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOworICAgICAgICAgIGlmIChub2Rl
Lm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkg
bm9kZS5ub2RlSW5kZXggPSBqKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IGZvciAodmFyIGkgPSAwLCBqID0gMSwgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXM7IG5v
ZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYg
KCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkgbm9kZS5ub2RlSW5kZXggPSBq
Kys7CisgICAgICB9CisgICAgfSwKKworICAgIHVuaXF1ZTogZnVuY3Rpb24obm9kZXMpIHsKKyAg
ICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG5vZGVzOworICAgICAgdmFyIHJlc3Vs
dHMgPSBbXSwgbjsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwg
bDsgaSsrKQorICAgICAgICBpZiAodHlwZW9mIChuID0gbm9kZXNbaV0pLl9jb3VudGVkQnlQcm90
b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICBuLl9jb3VudGVkQnlQcm90b3R5cGUg
PSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgICAgICByZXN1bHRzLnB1c2goRWxlbWVu
dC5leHRlbmQobikpOworICAgICAgICB9CisgICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxlcnMu
dW5tYXJrKHJlc3VsdHMpOworICAgIH0sCisKKyAgICBkZXNjZW5kYW50OiBmdW5jdGlvbihub2Rl
cykgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkg
PSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBo
LmNvbmNhdChyZXN1bHRzLCBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJykpOworICAgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGNoaWxkOiBmdW5jdGlvbihub2Rlcykgewor
ICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBy
ZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGZvciAo
dmFyIGogPSAwLCBjaGlsZDsgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbal07IGorKykKKyAgICAg
ICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBjaGlsZC50YWdOYW1lICE9ICchJykgcmVz
dWx0cy5wdXNoKGNoaWxkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0s
CisKKyAgICBhZGphY2VudDogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIHZh
ciBuZXh0ID0gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSk7CisgICAgICAgIGlmIChuZXh0
KSByZXN1bHRzLnB1c2gobmV4dCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAg
ICB9LAorCisgICAgbGF0ZXJTaWJsaW5nOiBmdW5jdGlvbihub2RlcykgeworICAgICAgdmFyIGgg
PSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10s
IG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBF
bGVtZW50Lm5leHRTaWJsaW5ncyhub2RlKSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9
LAorCisgICAgbmV4dEVsZW1lbnRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7CisgICAgICB3aGls
ZSAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCisgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09
IDEpIHJldHVybiBub2RlOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKworICAgIHByZXZp
b3VzRWxlbWVudFNpYmxpbmc6IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIHdoaWxlIChub2RlID0g
bm9kZS5wcmV2aW91c1NpYmxpbmcpCisgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHJl
dHVybiBub2RlOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKworICAgIHRhZ05hbWU6IGZ1
bmN0aW9uKG5vZGVzLCByb290LCB0YWdOYW1lLCBjb21iaW5hdG9yKSB7CisgICAgICB2YXIgdVRh
Z05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdLCBo
ID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBpZiAobm9kZXMpIHsKKyAgICAgICAgaWYgKGNv
bWJpbmF0b3IpIHsKKyAgICAgICAgICBpZiAoY29tYmluYXRvciA9PSAiZGVzY2VuZGFudCIpIHsK
KyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykK
KyAgICAgICAgICAgICAgaC5jb25jYXQocmVzdWx0cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFt
ZSh0YWdOYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICB9IGVs
c2Ugbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgICAgICBpZiAodGFnTmFt
ZSA9PSAiKiIpIHJldHVybiBub2RlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHZhciBpID0g
MCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgaWYgKG5vZGUudGFnTmFt
ZS50b1VwcGVyQ2FzZSgpID09PSB1VGFnTmFtZSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAg
ICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0gZWxzZSByZXR1cm4gcm9vdC5nZXRFbGVtZW50c0J5
VGFnTmFtZSh0YWdOYW1lKTsKKyAgICB9LAorCisgICAgaWQ6IGZ1bmN0aW9uKG5vZGVzLCByb290
LCBpZCwgY29tYmluYXRvcikgeworICAgICAgdmFyIHRhcmdldE5vZGUgPSAkKGlkKSwgaCA9IFNl
bGVjdG9yLmhhbmRsZXJzOworCisgICAgICBpZiAocm9vdCA9PSBkb2N1bWVudCkgeworICAgICAg
ICBpZiAoIXRhcmdldE5vZGUpIHJldHVybiBbXTsKKyAgICAgICAgaWYgKCFub2RlcykgcmV0dXJu
IFt0YXJnZXROb2RlXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcm9vdC5zb3VyY2VJ
bmRleCB8fCByb290LnNvdXJjZUluZGV4IDwgMSkgeworICAgICAgICAgIHZhciBub2RlcyA9IHJv
b3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwg
bm9kZTsgbm9kZSA9IG5vZGVzW2pdOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChub2RlLmlkID09
PSBpZCkgcmV0dXJuIFtub2RlXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKwor
ICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21iaW5hdG9yKSB7CisgICAgICAgICAg
aWYgKGNvbWJpbmF0b3IgPT0gJ2NoaWxkJykgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAgICBpZiAodGFyZ2V0Tm9k
ZS5wYXJlbnROb2RlID09IG5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBl
bHNlIGlmIChjb21iaW5hdG9yID09ICdkZXNjZW5kYW50JykgeworICAgICAgICAgICAgZm9yICh2
YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAgICBpZiAo
RWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgbm9kZSkpIHJldHVybiBbdGFyZ2V0Tm9k
ZV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdhZGphY2VudCcpIHsKKyAg
ICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAg
ICAgICAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmco
dGFyZ2V0Tm9kZSkgPT0gbm9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gW3RhcmdldE5vZGVd
OworICAgICAgICAgIH0gZWxzZSBub2RlcyA9IGhbY29tYmluYXRvcl0obm9kZXMpOworICAgICAg
ICB9CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykK
KyAgICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOwor
ICAgICAgICByZXR1cm4gW107CisgICAgICB9CisgICAgICByZXR1cm4gKHRhcmdldE5vZGUgJiYg
RWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8gW3RhcmdldE5vZGVdIDog
W107CisgICAgfSwKKworICAgIGNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNz
TmFtZSwgY29tYmluYXRvcikgeworICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVz
ID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxl
cnMuYnlDbGFzc05hbWUobm9kZXMsIHJvb3QsIGNsYXNzTmFtZSk7CisgICAgfSwKKworICAgIGJ5
Q2xhc3NOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NOYW1lKSB7CisgICAgICBpZiAo
IW5vZGVzKSBub2RlcyA9IFNlbGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRhbnQoW3Jvb3RdKTsKKyAg
ICAgIHZhciBuZWVkbGUgPSAnICcgKyBjbGFzc05hbWUgKyAnICc7CisgICAgICBmb3IgKHZhciBp
ID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlLCBub2RlQ2xhc3NOYW1lOyBub2RlID0gbm9kZXNbaV07
IGkrKykgeworICAgICAgICBub2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7CisgICAgICAg
IGlmIChub2RlQ2xhc3NOYW1lLmxlbmd0aCA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgaWYgKG5v
ZGVDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8ICgnICcgKyBub2RlQ2xhc3NOYW1lICsgJyAnKS5p
bmNsdWRlKG5lZWRsZSkpCisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQor
ICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rp
b24obm9kZXMsIHJvb3QsIGF0dHIsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmICghbm9kZXMpIG5v
ZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworICAgICAgaWYgKG5vZGVzICYm
IGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICB2YXIg
cmVzdWx0cyA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tp
XTsgaSsrKQorICAgICAgICBpZiAoRWxlbWVudC5oYXNBdHRyaWJ1dGUobm9kZSwgYXR0cikpIHJl
c3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBh
dHRyOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgYXR0ciwgdmFsdWUsIG9wZXJhdG9yLCBjb21iaW5h
dG9yKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05h
bWUoIioiKTsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29t
YmluYXRvcl0obm9kZXMpOworICAgICAgdmFyIGhhbmRsZXIgPSBTZWxlY3Rvci5vcGVyYXRvcnNb
b3BlcmF0b3JdLCByZXN1bHRzID0gW107CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9k
ZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVh
ZEF0dHJpYnV0ZShub2RlLCBhdHRyKTsKKyAgICAgICAgaWYgKG5vZGVWYWx1ZSA9PT0gbnVsbCkg
Y29udGludWU7CisgICAgICAgIGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwgdmFsdWUpKSByZXN1bHRz
LnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisg
ICAgcHNldWRvOiBmdW5jdGlvbihub2RlcywgbmFtZSwgdmFsdWUsIHJvb3QsIGNvbWJpbmF0b3Ip
IHsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRv
cl0obm9kZXMpOworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCIqIik7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvc1tuYW1lXShub2Rlcywg
dmFsdWUsIHJvb3QpOworICAgIH0KKyAgfSwKKworICBwc2V1ZG9zOiB7CisgICAgJ2ZpcnN0LWNo
aWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0g
MCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBp
ZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSkgY29udGlu
dWU7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJu
IHJlc3VsdHM7CisgICAgfSwKKyAgICAnbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1
ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9k
ZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRF
bGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5v
ZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnb25seS1j
aGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgdmFyIGggPSBTZWxl
Y3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7
IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIWgucHJldmlvdXNFbGVtZW50U2li
bGluZyhub2RlKSAmJiAhaC5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSkpCisgICAgICAgICAgcmVz
dWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnbnRo
LWNoaWxkJzogICAgICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICBy
ZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QpOworICAgIH0s
CisgICAgJ250aC1sYXN0LWNoaWxkJzogICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkg
eworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290
LCB0cnVlKTsKKyAgICB9LAorICAgICdudGgtb2YtdHlwZSc6ICAgICAgZnVuY3Rpb24obm9kZXMs
IGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2Rl
cywgZm9ybXVsYSwgcm9vdCwgZmFsc2UsIHRydWUpOworICAgIH0sCisgICAgJ250aC1sYXN0LW9m
LXR5cGUnOiBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNl
bGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVlLCB0cnVlKTsKKyAg
ICB9LAorICAgICdmaXJzdC1vZi10eXBlJzogICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJv
b3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgIjEiLCByb290
LCBmYWxzZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnbGFzdC1vZi10eXBlJzogICAgIGZ1bmN0aW9u
KG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5u
dGgobm9kZXMsICIxIiwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnb25seS1vZi10
eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICB2YXIgcCA9
IFNlbGVjdG9yLnBzZXVkb3M7CisgICAgICByZXR1cm4gcFsnbGFzdC1vZi10eXBlJ10ocFsnZmly
c3Qtb2YtdHlwZSddKG5vZGVzLCBmb3JtdWxhLCByb290KSwgZm9ybXVsYSwgcm9vdCk7CisgICAg
fSwKKworICAgIGdldEluZGljZXM6IGZ1bmN0aW9uKGEsIGIsIHRvdGFsKSB7CisgICAgICBpZiAo
YSA9PSAwKSByZXR1cm4gYiA+IDAgPyBbYl0gOiBbXTsKKyAgICAgIHJldHVybiAkUigxLCB0b3Rh
bCkuaW5qZWN0KFtdLCBmdW5jdGlvbihtZW1vLCBpKSB7CisgICAgICAgIGlmICgwID09IChpIC0g
YikgJSBhICYmIChpIC0gYikgLyBhID49IDApIG1lbW8ucHVzaChpKTsKKyAgICAgICAgcmV0dXJu
IG1lbW87CisgICAgICB9KTsKKyAgICB9LAorCisgICAgbnRoOiBmdW5jdGlvbihub2RlcywgZm9y
bXVsYSwgcm9vdCwgcmV2ZXJzZSwgb2ZUeXBlKSB7CisgICAgICBpZiAobm9kZXMubGVuZ3RoID09
IDApIHJldHVybiBbXTsKKyAgICAgIGlmIChmb3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9ICcy
biswJzsKKyAgICAgIGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVsYSA9ICcybisxJzsKKyAg
ICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIHJlc3VsdHMgPSBbXSwgaW5kZXhlZCA9IFtd
LCBtOworICAgICAgaC5tYXJrKG5vZGVzKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBu
b2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBpZiAoIW5vZGUucGFyZW50Tm9kZS5fY291
bnRlZEJ5UHJvdG90eXBlKSB7CisgICAgICAgICAgaC5pbmRleChub2RlLnBhcmVudE5vZGUsIHJl
dmVyc2UsIG9mVHlwZSk7CisgICAgICAgICAgaW5kZXhlZC5wdXNoKG5vZGUucGFyZW50Tm9kZSk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmb3JtdWxhLm1hdGNoKC9eXGQrJC8pKSB7
IC8vIGp1c3QgYSBudW1iZXIKKyAgICAgICAgZm9ybXVsYSA9IE51bWJlcihmb3JtdWxhKTsKKyAg
ICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAg
ICAgIGlmIChub2RlLm5vZGVJbmRleCA9PSBmb3JtdWxhKSByZXN1bHRzLnB1c2gobm9kZSk7Cisg
ICAgICB9IGVsc2UgaWYgKG0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCsp
KT8vKSkgeyAvLyBhbitiCisgICAgICAgIGlmIChtWzFdID09ICItIikgbVsxXSA9IC0xOworICAg
ICAgICB2YXIgYSA9IG1bMV0gPyBOdW1iZXIobVsxXSkgOiAxOworICAgICAgICB2YXIgYiA9IG1b
Ml0gPyBOdW1iZXIobVsyXSkgOiAwOworICAgICAgICB2YXIgaW5kaWNlcyA9IFNlbGVjdG9yLnBz
ZXVkb3MuZ2V0SW5kaWNlcyhhLCBiLCBub2Rlcy5sZW5ndGgpOworICAgICAgICBmb3IgKHZhciBp
ID0gMCwgbm9kZSwgbCA9IGluZGljZXMubGVuZ3RoOyBub2RlID0gbm9kZXNbaV07IGkrKykgewor
ICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbDsgaisrKQorICAgICAgICAgICAgaWYgKG5v
ZGUubm9kZUluZGV4ID09IGluZGljZXNbal0pIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgICAg
fQorICAgICAgfQorICAgICAgaC51bm1hcmsobm9kZXMpOworICAgICAgaC51bm1hcmsoaW5kZXhl
ZCk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgJ2VtcHR5JzogZnVuY3Rp
b24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9
IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBpZiAobm9kZS50YWdO
YW1lID09ICchJyB8fCBub2RlLmZpcnN0Q2hpbGQpIGNvbnRpbnVlOworICAgICAgICByZXN1bHRz
LnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisg
ICAgJ25vdCc6IGZ1bmN0aW9uKG5vZGVzLCBzZWxlY3Rvciwgcm9vdCkgeworICAgICAgdmFyIGgg
PSBTZWxlY3Rvci5oYW5kbGVycywgc2VsZWN0b3JUeXBlLCBtOworICAgICAgdmFyIGV4Y2x1c2lv
bnMgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpLmZpbmRFbGVtZW50cyhyb290KTsKKyAgICAgIGgu
bWFyayhleGNsdXNpb25zKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5v
ZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIW5vZGUuX2NvdW50ZWRCeVBy
b3RvdHlwZSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgaC51bm1hcmsoZXhjbHVzaW9ucyk7
CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgJ2VuYWJsZWQnOiBmdW5jdGlv
bihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0g
W10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIW5vZGUuZGlzYWJs
ZWQgJiYgKCFub2RlLnR5cGUgfHwgbm9kZS50eXBlICE9PSAnaGlkZGVuJykpCisgICAgICAgICAg
cmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAg
ICdkaXNhYmxlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2
YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAg
ICAgIGlmIChub2RlLmRpc2FibGVkKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4g
cmVzdWx0czsKKyAgICB9LAorCisgICAgJ2NoZWNrZWQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUs
IHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS5jaGVja2VkKSByZXN1bHRzLnB1c2go
bm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisgIH0sCisKKyAgb3BlcmF0b3Jz
OiB7CisgICAgJz0nOiAgZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHY7IH0sCisgICAg
JyE9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ICE9IHY7IH0sCisgICAgJ149JzogZnVu
Y3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYuc3RhcnRzV2l0aCh2KTsg
fSwKKyAgICAnJD0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8fCBudiAmJiBu
di5lbmRzV2l0aCh2KTsgfSwKKyAgICAnKj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYg
PT0gdiB8fCBudiAmJiBudi5pbmNsdWRlKHYpOyB9LAorICAgICd+PSc6IGZ1bmN0aW9uKG52LCB2
KSB7IHJldHVybiAoJyAnICsgbnYgKyAnICcpLmluY2x1ZGUoJyAnICsgdiArICcgJyk7IH0sCisg
ICAgJ3w9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnLScgKyAobnYgfHwgIiIpLnRvVXBw
ZXJDYXNlKCkgKworICAgICAnLScpLmluY2x1ZGUoJy0nICsgKHYgfHwgIiIpLnRvVXBwZXJDYXNl
KCkgKyAnLScpOyB9CisgIH0sCisKKyAgc3BsaXQ6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAg
ICB2YXIgZXhwcmVzc2lvbnMgPSBbXTsKKyAgICBleHByZXNzaW9uLnNjYW4oLygoW1x3Izoufj4r
KClccy1dK3xcKnxcWy4qP1xdKSspXHMqKCx8JCkvLCBmdW5jdGlvbihtKSB7CisgICAgICBleHBy
ZXNzaW9ucy5wdXNoKG1bMV0uc3RyaXAoKSk7CisgICAgfSk7CisgICAgcmV0dXJuIGV4cHJlc3Np
b25zOworICB9LAorCisgIG1hdGNoRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBleHByZXNz
aW9uKSB7CisgICAgdmFyIG1hdGNoZXMgPSAkJChleHByZXNzaW9uKSwgaCA9IFNlbGVjdG9yLmhh
bmRsZXJzOworICAgIGgubWFyayhtYXRjaGVzKTsKKyAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0
cyA9IFtdLCBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudHNbaV07IGkrKykKKyAgICAgIGlmIChl
bGVtZW50Ll9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChlbGVtZW50KTsKKyAgICBo
LnVubWFyayhtYXRjaGVzKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBmaW5kRWxl
bWVudDogZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgaWYgKE9i
amVjdC5pc051bWJlcihleHByZXNzaW9uKSkgeworICAgICAgaW5kZXggPSBleHByZXNzaW9uOyBl
eHByZXNzaW9uID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTZWxlY3Rvci5tYXRjaEVsZW1l
bnRzKGVsZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5kZXggfHwgMF07CisgIH0sCisKKyAg
ZmluZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7CisgICAg
ZXhwcmVzc2lvbnMgPSBTZWxlY3Rvci5zcGxpdChleHByZXNzaW9ucy5qb2luKCcsJykpOworICAg
IHZhciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICBmb3IgKHZhciBp
ID0gMCwgbCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0b3I7IGkgPCBsOyBpKyspIHsKKyAg
ICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGV4cHJlc3Npb25zW2ldLnN0cmlwKCkpOworICAg
ICAgaC5jb25jYXQocmVzdWx0cywgc2VsZWN0b3IuZmluZEVsZW1lbnRzKGVsZW1lbnQpKTsKKyAg
ICB9CisgICAgcmV0dXJuIChsID4gMSkgPyBoLnVuaXF1ZShyZXN1bHRzKSA6IHJlc3VsdHM7Cisg
IH0KK30pOworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgT2JqZWN0LmV4dGVuZChT
ZWxlY3Rvci5oYW5kbGVycywgeworICAgIGNvbmNhdDogZnVuY3Rpb24oYSwgYikgeworICAgICAg
Zm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCisgICAgICAgIGlmIChub2Rl
LnRhZ05hbWUgIT09ICIhIikgYS5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIGE7CisgICAgfQor
ICB9KTsKK30KKworZnVuY3Rpb24gJCQoKSB7CisgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRF
bGVtZW50cyhkb2N1bWVudCwgJEEoYXJndW1lbnRzKSk7Cit9CisKK3ZhciBGb3JtID0geworICBy
ZXNldDogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIGZvcm0ucmVz
ZXQoKTsKKyAgICByZXR1cm4gZm9ybTsKKyAgfSwKKworICBzZXJpYWxpemVFbGVtZW50czogZnVu
Y3Rpb24oZWxlbWVudHMsIG9wdGlvbnMpIHsKKyAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29i
amVjdCcpIG9wdGlvbnMgPSB7IGhhc2g6ICEhb3B0aW9ucyB9OworICAgIGVsc2UgaWYgKE9iamVj
dC5pc1VuZGVmaW5lZChvcHRpb25zLmhhc2gpKSBvcHRpb25zLmhhc2ggPSB0cnVlOworICAgIHZh
ciBrZXksIHZhbHVlLCBzdWJtaXR0ZWQgPSBmYWxzZSwgc3VibWl0ID0gb3B0aW9ucy5zdWJtaXQ7
CisKKyAgICB2YXIgZGF0YSA9IGVsZW1lbnRzLmluamVjdCh7IH0sIGZ1bmN0aW9uKHJlc3VsdCwg
ZWxlbWVudCkgeworICAgICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkg
eworICAgICAgICBrZXkgPSBlbGVtZW50Lm5hbWU7IHZhbHVlID0gJChlbGVtZW50KS5nZXRWYWx1
ZSgpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LnR5cGUgIT0gJ2ZpbGUn
ICYmIChlbGVtZW50LnR5cGUgIT0gJ3N1Ym1pdCcgfHwgKCFzdWJtaXR0ZWQgJiYKKyAgICAgICAg
ICAgIHN1Ym1pdCAhPT0gZmFsc2UgJiYgKCFzdWJtaXQgfHwga2V5ID09IHN1Ym1pdCkgJiYgKHN1
Ym1pdHRlZCA9IHRydWUpKSkpIHsKKyAgICAgICAgICBpZiAoa2V5IGluIHJlc3VsdCkgeworICAg
ICAgICAgICAgaWYgKCFPYmplY3QuaXNBcnJheShyZXN1bHRba2V5XSkpIHJlc3VsdFtrZXldID0g
W3Jlc3VsdFtrZXldXTsKKyAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOworICAg
ICAgICAgIH0KKyAgICAgICAgICBlbHNlIHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSk7CisKKyAgICByZXR1cm4gb3B0
aW9ucy5oYXNoID8gZGF0YSA6IE9iamVjdC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworICB9Cit9Owor
CitGb3JtLk1ldGhvZHMgPSB7CisgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykg
eworICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMoZm9y
bSksIG9wdGlvbnMpOworICB9LAorCisgIGdldEVsZW1lbnRzOiBmdW5jdGlvbihmb3JtKSB7Cisg
ICAgdmFyIGVsZW1lbnRzID0gJChmb3JtKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpLAorICAg
ICAgICBlbGVtZW50LAorICAgICAgICBhcnIgPSBbIF0sCisgICAgICAgIHNlcmlhbGl6ZXJzID0g
Rm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzOworICAgIGZvciAodmFyIGkgPSAwOyBlbGVtZW50ID0g
ZWxlbWVudHNbaV07IGkrKykgeworICAgICAgYXJyLnB1c2goZWxlbWVudCk7CisgICAgfQorICAg
IHJldHVybiBhcnIuaW5qZWN0KFtdLCBmdW5jdGlvbihlbGVtZW50cywgY2hpbGQpIHsKKyAgICAg
IGlmIChzZXJpYWxpemVyc1tjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQorICAgICAgICBl
bGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7CisgICAgICByZXR1cm4gZWxlbWVu
dHM7CisgICAgfSkKKyAgfSwKKworICBnZXRJbnB1dHM6IGZ1bmN0aW9uKGZvcm0sIHR5cGVOYW1l
LCBuYW1lKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7CisgICAgdmFyIGlucHV0cyA9IGZvcm0uZ2V0
RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7CisKKyAgICBpZiAoIXR5cGVOYW1lICYmICFuYW1l
KSByZXR1cm4gJEEoaW5wdXRzKS5tYXAoRWxlbWVudC5leHRlbmQpOworCisgICAgZm9yICh2YXIg
aSA9IDAsIG1hdGNoaW5nSW5wdXRzID0gW10sIGxlbmd0aCA9IGlucHV0cy5sZW5ndGg7IGkgPCBs
ZW5ndGg7IGkrKykgeworICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldOworICAgICAgaWYgKCh0
eXBlTmFtZSAmJiBpbnB1dC50eXBlICE9IHR5cGVOYW1lKSB8fCAobmFtZSAmJiBpbnB1dC5uYW1l
ICE9IG5hbWUpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIG1hdGNoaW5nSW5wdXRzLnB1c2go
RWxlbWVudC5leHRlbmQoaW5wdXQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2hpbmdJbnB1
dHM7CisgIH0sCisKKyAgZGlzYWJsZTogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZv
cm0pOworICAgIEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCdkaXNhYmxlJyk7CisgICAg
cmV0dXJuIGZvcm07CisgIH0sCisKKyAgZW5hYmxlOiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9y
bSA9ICQoZm9ybSk7CisgICAgRm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2VuYWJsZScp
OworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIGZpbmRGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9u
KGZvcm0pIHsKKyAgICB2YXIgZWxlbWVudHMgPSAkKGZvcm0pLmdldEVsZW1lbnRzKCkuZmluZEFs
bChmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICByZXR1cm4gJ2hpZGRlbicgIT0gZWxlbWVudC50
eXBlICYmICFlbGVtZW50LmRpc2FibGVkOworICAgIH0pOworICAgIHZhciBmaXJzdEJ5SW5kZXgg
PSBlbGVtZW50cy5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiBlbGVt
ZW50Lmhhc0F0dHJpYnV0ZSgndGFiSW5kZXgnKSAmJiBlbGVtZW50LnRhYkluZGV4ID49IDA7Cisg
ICAgfSkuc29ydEJ5KGZ1bmN0aW9uKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXgg
fSkuZmlyc3QoKTsKKworICAgIHJldHVybiBmaXJzdEJ5SW5kZXggPyBmaXJzdEJ5SW5kZXggOiBl
bGVtZW50cy5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiAvXig/OmlucHV0
fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbGVtZW50LnRhZ05hbWUpOworICAgIH0pOworICB9
LAorCisgIGZvY3VzRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQo
Zm9ybSk7CisgICAgZm9ybS5maW5kRmlyc3RFbGVtZW50KCkuYWN0aXZhdGUoKTsKKyAgICByZXR1
cm4gZm9ybTsKKyAgfSwKKworICByZXF1ZXN0OiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7Cisg
ICAgZm9ybSA9ICQoZm9ybSksIG9wdGlvbnMgPSBPYmplY3QuY2xvbmUob3B0aW9ucyB8fCB7IH0p
OworCisgICAgdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1ldGVycywgYWN0aW9uID0gZm9ybS5y
ZWFkQXR0cmlidXRlKCdhY3Rpb24nKSB8fCAnJzsKKyAgICBpZiAoYWN0aW9uLmJsYW5rKCkpIGFj
dGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOworICAgIG9wdGlvbnMucGFyYW1ldGVycyA9IGZv
cm0uc2VyaWFsaXplKHRydWUpOworCisgICAgaWYgKHBhcmFtcykgeworICAgICAgaWYgKE9iamVj
dC5pc1N0cmluZyhwYXJhbXMpKSBwYXJhbXMgPSBwYXJhbXMudG9RdWVyeVBhcmFtcygpOworICAg
ICAgT2JqZWN0LmV4dGVuZChvcHRpb25zLnBhcmFtZXRlcnMsIHBhcmFtcyk7CisgICAgfQorCisg
ICAgaWYgKGZvcm0uaGFzQXR0cmlidXRlKCdtZXRob2QnKSAmJiAhb3B0aW9ucy5tZXRob2QpCisg
ICAgICBvcHRpb25zLm1ldGhvZCA9IGZvcm0ubWV0aG9kOworCisgICAgcmV0dXJuIG5ldyBBamF4
LlJlcXVlc3QoYWN0aW9uLCBvcHRpb25zKTsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSovCisKKworRm9ybS5FbGVtZW50ID0geworICBmb2N1czogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgICQoZWxlbWVudCkuZm9jdXMoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBz
ZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnNlbGVjdCgpOworICAg
IHJldHVybiBlbGVtZW50OworICB9Cit9OworCitGb3JtLkVsZW1lbnQuTWV0aG9kcyA9IHsKKwor
ICBzZXJpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5uYW1lKSB7CisgICAgICB2
YXIgdmFsdWUgPSBlbGVtZW50LmdldFZhbHVlKCk7CisgICAgICBpZiAodmFsdWUgIT0gdW5kZWZp
bmVkKSB7CisgICAgICAgIHZhciBwYWlyID0geyB9OworICAgICAgICBwYWlyW2VsZW1lbnQubmFt
ZV0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIE9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhaXIpOwor
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH0sCisKKyAgZ2V0VmFsdWU6IGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbWV0aG9k
ID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVu
dC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpOworICB9LAorCisgIHNldFZhbHVlOiBmdW5j
dGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZh
ciBtZXRob2QgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICBGb3JtLkVsZW1l
bnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50LCB2YWx1ZSk7CisgICAgcmV0dXJuIGVsZW1l
bnQ7CisgIH0sCisKKyAgY2xlYXI6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQp
LnZhbHVlID0gJyc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcHJlc2VudDogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnZhbHVlICE9ICcnOworICB9
LAorCisgIGFjdGl2YXRlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgdHJ5IHsKKyAgICAgIGVsZW1lbnQuZm9jdXMoKTsKKyAgICAgIGlmIChlbGVt
ZW50LnNlbGVjdCAmJiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0JyB8
fAorICAgICAgICAgICEoL14oPzpidXR0b258cmVzZXR8c3VibWl0KSQvaS50ZXN0KGVsZW1lbnQu
dHlwZSkpKSkKKyAgICAgICAgZWxlbWVudC5zZWxlY3QoKTsKKyAgICB9IGNhdGNoIChlKSB7IH0K
KyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRy
dWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZW5hYmxlOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9
IGZhbHNlOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tKi8KKwordmFyIEZpZWxkID0gRm9ybS5FbGVtZW50OworCit2YXIgJEYgPSBGb3JtLkVsZW1l
bnQuTWV0aG9kcy5nZXRWYWx1ZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Zvcm0uRWxl
bWVudC5TZXJpYWxpemVycyA9IHsKKyAgaW5wdXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7
CisgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgY2FzZSAn
Y2hlY2tib3gnOgorICAgICAgY2FzZSAncmFkaW8nOgorICAgICAgICByZXR1cm4gRm9ybS5FbGVt
ZW50LlNlcmlhbGl6ZXJzLmlucHV0U2VsZWN0b3IoZWxlbWVudCwgdmFsdWUpOworICAgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy50ZXh0YXJlYShl
bGVtZW50LCB2YWx1ZSk7CisgICAgfQorICB9LAorCisgIGlucHV0U2VsZWN0b3I6IGZ1bmN0aW9u
KGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJl
dHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDsKKyAgICBlbHNlIGVs
ZW1lbnQuY2hlY2tlZCA9ICEhdmFsdWU7CisgIH0sCisKKyAgdGV4dGFyZWE6IGZ1bmN0aW9uKGVs
ZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVy
biBlbGVtZW50LnZhbHVlOworICAgIGVsc2UgZWxlbWVudC52YWx1ZSA9IHZhbHVlOworICB9LAor
CisgIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBpZiAoT2JqZWN0Lmlz
VW5kZWZpbmVkKHZhbHVlKSkKKyAgICAgIHJldHVybiB0aGlzW2VsZW1lbnQudHlwZSA9PSAnc2Vs
ZWN0LW9uZScgPworICAgICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7
CisgICAgZWxzZSB7CisgICAgICB2YXIgb3B0LCBjdXJyZW50VmFsdWUsIHNpbmdsZSA9ICFPYmpl
Y3QuaXNBcnJheSh2YWx1ZSk7CisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbWVu
dC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBvcHQgPSBlbGVtZW50Lm9wdGlv
bnNbaV07CisgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUob3B0KTsKKyAg
ICAgICAgaWYgKHNpbmdsZSkgeworICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gdmFsdWUp
IHsKKyAgICAgICAgICAgIG9wdC5zZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2Ugb3B0LnNlbGVjdGVkID0gdmFs
dWUuaW5jbHVkZShjdXJyZW50VmFsdWUpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBzZWxl
Y3RPbmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgaW5kZXggPSBlbGVtZW50LnNlbGVj
dGVkSW5kZXg7CisgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLm9wdGlvblZhbHVlKGVsZW1l
bnQub3B0aW9uc1tpbmRleF0pIDogbnVsbDsKKyAgfSwKKworICBzZWxlY3RNYW55OiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlcywgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7Cisg
ICAgaWYgKCFsZW5ndGgpIHJldHVybiBudWxsOworCisgICAgZm9yICh2YXIgaSA9IDAsIHZhbHVl
cyA9IFtdOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBvcHQgPSBlbGVtZW50Lm9wdGlv
bnNbaV07CisgICAgICBpZiAob3B0LnNlbGVjdGVkKSB2YWx1ZXMucHVzaCh0aGlzLm9wdGlvblZh
bHVlKG9wdCkpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVzOworICB9LAorCisgIG9wdGlvblZh
bHVlOiBmdW5jdGlvbihvcHQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQob3B0KS5oYXNB
dHRyaWJ1dGUoJ3ZhbHVlJykgPyBvcHQudmFsdWUgOiBvcHQudGV4dDsKKyAgfQorfTsKKworLyot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSovCisKKworQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IENsYXNzLmNy
ZWF0ZShQZXJpb2RpY2FsRXhlY3V0ZXIsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVy
LCBlbGVtZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7CisgICAgJHN1cGVyKGNhbGxiYWNrLCBm
cmVxdWVuY3kpOworICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsKKyAgICB0aGlzLmxh
c3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgfSwKKworICBleGVjdXRlOiBmdW5jdGlvbigp
IHsKKyAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKE9iamVjdC5pc1N0
cmluZyh0aGlzLmxhc3RWYWx1ZSkgJiYgT2JqZWN0LmlzU3RyaW5nKHZhbHVlKSA/CisgICAgICAg
IHRoaXMubGFzdFZhbHVlICE9IHZhbHVlIDogU3RyaW5nKHRoaXMubGFzdFZhbHVlKSAhPSBTdHJp
bmcodmFsdWUpKSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOwor
ICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0KK30pOworCitGb3JtLkVs
ZW1lbnQuT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgewor
ICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1
ZSh0aGlzLmVsZW1lbnQpOworICB9Cit9KTsKKworRm9ybS5PYnNlcnZlciA9IENsYXNzLmNyZWF0
ZShBYnN0cmFjdC5UaW1lZE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAg
ICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKKy8qLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0qLworCitBYnN0cmFjdC5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRl
KHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHsKKyAgICB0aGlz
LmVsZW1lbnQgID0gJChlbGVtZW50KTsKKyAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisK
KyAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICBpZiAodGhpcy5lbGVt
ZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZm9ybScpCisgICAgICB0aGlzLnJlZ2lzdGVy
Rm9ybUNhbGxiYWNrcygpOworICAgIGVsc2UKKyAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0
aGlzLmVsZW1lbnQpOworICB9LAorCisgIG9uRWxlbWVudEV2ZW50OiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKHRoaXMubGFzdFZhbHVlICE9
IHZhbHVlKSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOworICAg
ICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0sCisKKyAgcmVnaXN0ZXJGb3Jt
Q2FsbGJhY2tzOiBmdW5jdGlvbigpIHsKKyAgICBGb3JtLmdldEVsZW1lbnRzKHRoaXMuZWxlbWVu
dCkuZWFjaCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssIHRoaXMpOworICB9LAorCisgIHJlZ2lzdGVy
Q2FsbGJhY2s6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC50eXBlKSB7Cisg
ICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CisgICAgICAgIGNhc2Ug
J2NoZWNrYm94JzoKKyAgICAgICAgY2FzZSAncmFkaW8nOgorICAgICAgICAgIEV2ZW50Lm9ic2Vy
dmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKKyAg
ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBFdmVudC5vYnNlcnZl
KGVsZW1lbnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOworICAg
ICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CisKK0Zvcm0uRWxlbWVudC5F
dmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIsIHsKKyAg
Z2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUo
dGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKK0Zvcm0uRXZlbnRPYnNlcnZlciA9IENsYXNzLmNy
ZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisoZnVu
Y3Rpb24oKSB7CisKKyAgdmFyIEV2ZW50ID0geworICAgIEtFWV9CQUNLU1BBQ0U6IDgsCisgICAg
S0VZX1RBQjogICAgICAgOSwKKyAgICBLRVlfUkVUVVJOOiAgIDEzLAorICAgIEtFWV9FU0M6ICAg
ICAgMjcsCisgICAgS0VZX0xFRlQ6ICAgICAzNywKKyAgICBLRVlfVVA6ICAgICAgIDM4LAorICAg
IEtFWV9SSUdIVDogICAgMzksCisgICAgS0VZX0RPV046ICAgICA0MCwKKyAgICBLRVlfREVMRVRF
OiAgIDQ2LAorICAgIEtFWV9IT01FOiAgICAgMzYsCisgICAgS0VZX0VORDogICAgICAzNSwKKyAg
ICBLRVlfUEFHRVVQOiAgIDMzLAorICAgIEtFWV9QQUdFRE9XTjogMzQsCisgICAgS0VZX0lOU0VS
VDogICA0NSwKKworICAgIGNhY2hlOiB7fQorICB9OworCisgIHZhciBkb2NFbCA9IGRvY3VtZW50
LmRvY3VtZW50RWxlbWVudDsKKyAgdmFyIE1PVVNFRU5URVJfTU9VU0VMRUFWRV9FVkVOVFNfU1VQ
UE9SVEVEID0gJ29ubW91c2VlbnRlcicgaW4gZG9jRWwKKyAgICAmJiAnb25tb3VzZWxlYXZlJyBp
biBkb2NFbDsKKworICB2YXIgX2lzQnV0dG9uOworICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUp
IHsKKyAgICB2YXIgYnV0dG9uTWFwID0geyAwOiAxLCAxOiA0LCAyOiAyIH07CisgICAgX2lzQnV0
dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKKyAgICAgIHJldHVybiBldmVudC5idXR0b24g
PT09IGJ1dHRvbk1hcFtjb2RlXTsKKyAgICB9OworICB9IGVsc2UgaWYgKFByb3RvdHlwZS5Ccm93
c2VyLldlYktpdCkgeworICAgIF9pc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7Cisg
ICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gZXZlbnQud2hpY2gg
PT0gMSAmJiAhZXZlbnQubWV0YUtleTsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gZXZlbnQud2hp
Y2ggPT0gMSAmJiBldmVudC5tZXRhS2V5OworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7
CisgICAgICB9CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBfaXNCdXR0b24gPSBmdW5jdGlvbihl
dmVudCwgY29kZSkgeworICAgICAgcmV0dXJuIGV2ZW50LndoaWNoID8gKGV2ZW50LndoaWNoID09
PSBjb2RlICsgMSkgOiAoZXZlbnQuYnV0dG9uID09PSBjb2RlKTsKKyAgICB9OworICB9CisKKyAg
ZnVuY3Rpb24gaXNMZWZ0Q2xpY2soZXZlbnQpICAgeyByZXR1cm4gX2lzQnV0dG9uKGV2ZW50LCAw
KSB9CisKKyAgZnVuY3Rpb24gaXNNaWRkbGVDbGljayhldmVudCkgeyByZXR1cm4gX2lzQnV0dG9u
KGV2ZW50LCAxKSB9CisKKyAgZnVuY3Rpb24gaXNSaWdodENsaWNrKGV2ZW50KSAgeyByZXR1cm4g
X2lzQnV0dG9uKGV2ZW50LCAyKSB9CisKKyAgZnVuY3Rpb24gZWxlbWVudChldmVudCkgeworICAg
IGV2ZW50ID0gRXZlbnQuZXh0ZW5kKGV2ZW50KTsKKworICAgIHZhciBub2RlID0gZXZlbnQudGFy
Z2V0LCB0eXBlID0gZXZlbnQudHlwZSwKKyAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJl
bnRUYXJnZXQ7CisKKyAgICBpZiAoY3VycmVudFRhcmdldCAmJiBjdXJyZW50VGFyZ2V0LnRhZ05h
bWUpIHsKKyAgICAgIGlmICh0eXBlID09PSAnbG9hZCcgfHwgdHlwZSA9PT0gJ2Vycm9yJyB8fAor
ICAgICAgICAodHlwZSA9PT0gJ2NsaWNrJyAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dl
ckNhc2UoKSA9PT0gJ2lucHV0JworICAgICAgICAgICYmIGN1cnJlbnRUYXJnZXQudHlwZSA9PT0g
J3JhZGlvJykpCisgICAgICAgICAgICBub2RlID0gY3VycmVudFRhcmdldDsKKyAgICB9CisKKyAg
ICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkKKyAgICAgIG5vZGUgPSBub2Rl
LnBhcmVudE5vZGU7CisKKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQobm9kZSk7CisgIH0KKwor
ICBmdW5jdGlvbiBmaW5kRWxlbWVudChldmVudCwgZXhwcmVzc2lvbikgeworICAgIHZhciBlbGVt
ZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7CisgICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4g
ZWxlbWVudDsKKyAgICB2YXIgZWxlbWVudHMgPSBbZWxlbWVudF0uY29uY2F0KGVsZW1lbnQuYW5j
ZXN0b3JzKCkpOworICAgIHJldHVybiBTZWxlY3Rvci5maW5kRWxlbWVudChlbGVtZW50cywgZXhw
cmVzc2lvbiwgMCk7CisgIH0KKworICBmdW5jdGlvbiBwb2ludGVyKGV2ZW50KSB7CisgICAgcmV0
dXJuIHsgeDogcG9pbnRlclgoZXZlbnQpLCB5OiBwb2ludGVyWShldmVudCkgfTsKKyAgfQorCisg
IGZ1bmN0aW9uIHBvaW50ZXJYKGV2ZW50KSB7CisgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnQsCisgICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Nyb2xs
TGVmdDogMCB9OworCisgICAgcmV0dXJuIGV2ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsK
KyAgICAgIChkb2NFbGVtZW50LnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtCisgICAg
ICAoZG9jRWxlbWVudC5jbGllbnRMZWZ0IHx8IDApKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBvaW50
ZXJZKGV2ZW50KSB7CisgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnQsCisgICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Nyb2xsVG9wOiAwIH07CisKKyAg
ICByZXR1cm4gIGV2ZW50LnBhZ2VZIHx8IChldmVudC5jbGllbnRZICsKKyAgICAgICAoZG9jRWxl
bWVudC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3ApIC0KKyAgICAgICAoZG9jRWxlbWVudC5j
bGllbnRUb3AgfHwgMCkpOworICB9CisKKworICBmdW5jdGlvbiBzdG9wKGV2ZW50KSB7CisgICAg
RXZlbnQuZXh0ZW5kKGV2ZW50KTsKKyAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgIGV2
ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCisgICAgZXZlbnQuc3RvcHBlZCA9IHRydWU7CisgIH0K
KworICBFdmVudC5NZXRob2RzID0geworICAgIGlzTGVmdENsaWNrOiBpc0xlZnRDbGljaywKKyAg
ICBpc01pZGRsZUNsaWNrOiBpc01pZGRsZUNsaWNrLAorICAgIGlzUmlnaHRDbGljazogaXNSaWdo
dENsaWNrLAorCisgICAgZWxlbWVudDogZWxlbWVudCwKKyAgICBmaW5kRWxlbWVudDogZmluZEVs
ZW1lbnQsCisKKyAgICBwb2ludGVyOiBwb2ludGVyLAorICAgIHBvaW50ZXJYOiBwb2ludGVyWCwK
KyAgICBwb2ludGVyWTogcG9pbnRlclksCisKKyAgICBzdG9wOiBzdG9wCisgIH07CisKKworICB2
YXIgbWV0aG9kcyA9IE9iamVjdC5rZXlzKEV2ZW50Lk1ldGhvZHMpLmluamVjdCh7IH0sIGZ1bmN0
aW9uKG0sIG5hbWUpIHsKKyAgICBtW25hbWVdID0gRXZlbnQuTWV0aG9kc1tuYW1lXS5tZXRob2Rp
emUoKTsKKyAgICByZXR1cm4gbTsKKyAgfSk7CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklF
KSB7CisgICAgZnVuY3Rpb24gX3JlbGF0ZWRUYXJnZXQoZXZlbnQpIHsKKyAgICAgIHZhciBlbGVt
ZW50OworICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CisgICAgICAgIGNhc2UgJ21vdXNlb3Zl
cic6IGVsZW1lbnQgPSBldmVudC5mcm9tRWxlbWVudDsgYnJlYWs7CisgICAgICAgIGNhc2UgJ21v
dXNlb3V0JzogIGVsZW1lbnQgPSBldmVudC50b0VsZW1lbnQ7ICAgYnJlYWs7CisgICAgICAgIGRl
ZmF1bHQ6IHJldHVybiBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5k
KGVsZW1lbnQpOworICAgIH0KKworICAgIE9iamVjdC5leHRlbmQobWV0aG9kcywgeworICAgICAg
c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsgdGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlIH0s
CisgICAgICBwcmV2ZW50RGVmYXVsdDogIGZ1bmN0aW9uKCkgeyB0aGlzLnJldHVyblZhbHVlID0g
ZmFsc2UgfSwKKyAgICAgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gJ1tvYmplY3QgRXZl
bnRdJyB9CisgICAgfSk7CisKKyAgICBFdmVudC5leHRlbmQgPSBmdW5jdGlvbihldmVudCwgZWxl
bWVudCkgeworICAgICAgaWYgKCFldmVudCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGV2ZW50
Ll9leHRlbmRlZEJ5UHJvdG90eXBlKSByZXR1cm4gZXZlbnQ7CisKKyAgICAgIGV2ZW50Ll9leHRl
bmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICB2YXIgcG9p
bnRlciA9IEV2ZW50LnBvaW50ZXIoZXZlbnQpOworCisgICAgICBPYmplY3QuZXh0ZW5kKGV2ZW50
LCB7CisgICAgICAgIHRhcmdldDogZXZlbnQuc3JjRWxlbWVudCB8fCBlbGVtZW50LAorICAgICAg
ICByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldChldmVudCksCisgICAgICAgIHBhZ2VYOiAg
cG9pbnRlci54LAorICAgICAgICBwYWdlWTogIHBvaW50ZXIueQorICAgICAgfSk7CisKKyAgICAg
IHJldHVybiBPYmplY3QuZXh0ZW5kKGV2ZW50LCBtZXRob2RzKTsKKyAgICB9OworICB9IGVsc2Ug
eworICAgIEV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGUgfHwgZG9jdW1l
bnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKS5fX3Byb3RvX187CisgICAgT2JqZWN0LmV4dGVu
ZChFdmVudC5wcm90b3R5cGUsIG1ldGhvZHMpOworICAgIEV2ZW50LmV4dGVuZCA9IFByb3RvdHlw
ZS5LOworICB9CisKKyAgZnVuY3Rpb24gX2NyZWF0ZVJlc3BvbmRlcihlbGVtZW50LCBldmVudE5h
bWUsIGhhbmRsZXIpIHsKKyAgICB2YXIgcmVnaXN0cnkgPSBFbGVtZW50LnJldHJpZXZlKGVsZW1l
bnQsICdwcm90b3R5cGVfZXZlbnRfcmVnaXN0cnknKTsKKworICAgIGlmIChPYmplY3QuaXNVbmRl
ZmluZWQocmVnaXN0cnkpKSB7CisgICAgICBDQUNIRS5wdXNoKGVsZW1lbnQpOworICAgICAgcmVn
aXN0cnkgPSBFbGVtZW50LnJldHJpZXZlKGVsZW1lbnQsICdwcm90b3R5cGVfZXZlbnRfcmVnaXN0
cnknLCAkSCgpKTsKKyAgICB9CisKKyAgICB2YXIgcmVzcG9uZGVyc0ZvckV2ZW50ID0gcmVnaXN0
cnkuZ2V0KGV2ZW50TmFtZSk7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChyZXNwb25kZXJz
Rm9yRXZlbnQpKSB7CisgICAgICByZXNwb25kZXJzRm9yRXZlbnQgPSBbXTsKKyAgICAgIHJlZ2lz
dHJ5LnNldChldmVudE5hbWUsIHJlc3BvbmRlcnNGb3JFdmVudCk7CisgICAgfQorCisgICAgaWYg
KHJlc3BvbmRlcnNGb3JFdmVudC5wbHVjaygnaGFuZGxlcicpLmluY2x1ZGUoaGFuZGxlcikpIHJl
dHVybiBmYWxzZTsKKworICAgIHZhciByZXNwb25kZXI7CisgICAgaWYgKGV2ZW50TmFtZS5pbmNs
dWRlKCI6IikpIHsKKyAgICAgIHJlc3BvbmRlciA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAg
IGlmIChPYmplY3QuaXNVbmRlZmluZWQoZXZlbnQuZXZlbnROYW1lKSkKKyAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGV2ZW50LmV2ZW50TmFtZSAhPT0gZXZlbnROYW1lKQor
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBFdmVudC5leHRlbmQoZXZlbnQsIGVs
ZW1lbnQpOworICAgICAgICBoYW5kbGVyLmNhbGwoZWxlbWVudCwgZXZlbnQpOworICAgICAgfTsK
KyAgICB9IGVsc2UgeworICAgICAgaWYgKCFNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NV
UFBPUlRFRCAmJgorICAgICAgIChldmVudE5hbWUgPT09ICJtb3VzZWVudGVyIiB8fCBldmVudE5h
bWUgPT09ICJtb3VzZWxlYXZlIikpIHsKKyAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gIm1vdXNl
ZW50ZXIiIHx8IGV2ZW50TmFtZSA9PT0gIm1vdXNlbGVhdmUiKSB7CisgICAgICAgICAgcmVzcG9u
ZGVyID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAgIEV2ZW50LmV4dGVuZChldmVudCwg
ZWxlbWVudCk7CisKKyAgICAgICAgICAgIHZhciBwYXJlbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0
OworICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IGVsZW1lbnQpIHsKKyAg
ICAgICAgICAgICAgdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KKyAgICAgICAg
ICAgICAgY2F0Y2goZSkgeyBwYXJlbnQgPSBlbGVtZW50OyB9CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmIChwYXJlbnQgPT09IGVsZW1lbnQpIHJldHVybjsKKworICAgICAgICAgICAg
aGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsKKyAgICAgICAgICB9OworICAgICAgICB9Cisg
ICAgICB9IGVsc2UgeworICAgICAgICByZXNwb25kZXIgPSBmdW5jdGlvbihldmVudCkgeworICAg
ICAgICAgIEV2ZW50LmV4dGVuZChldmVudCwgZWxlbWVudCk7CisgICAgICAgICAgaGFuZGxlci5j
YWxsKGVsZW1lbnQsIGV2ZW50KTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXNwb25kZXIuaGFuZGxlciA9IGhhbmRsZXI7CisgICAgcmVzcG9uZGVyc0ZvckV2ZW50LnB1c2go
cmVzcG9uZGVyKTsKKyAgICByZXR1cm4gcmVzcG9uZGVyOworICB9CisKKyAgZnVuY3Rpb24gX2Rl
c3Ryb3lDYWNoZSgpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gQ0FDSEUubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoQ0FDSEVbaV0p
OworICAgICAgQ0FDSEVbaV0gPSBudWxsOworICAgIH0KKyAgfQorCisgIHZhciBDQUNIRSA9IFtd
OworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkKKyAgICB3aW5kb3cuYXR0YWNoRXZlbnQo
J29udW5sb2FkJywgX2Rlc3Ryb3lDYWNoZSk7CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldl
YktpdCkKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgUHJvdG90eXBlLmVt
cHR5RnVuY3Rpb24sIGZhbHNlKTsKKworCisgIHZhciBfZ2V0RE9NRXZlbnROYW1lID0gUHJvdG90
eXBlLks7CisKKyAgaWYgKCFNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRCkg
eworICAgIF9nZXRET01FdmVudE5hbWUgPSBmdW5jdGlvbihldmVudE5hbWUpIHsKKyAgICAgIHZh
ciB0cmFuc2xhdGlvbnMgPSB7IG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAi
bW91c2VvdXQiIH07CisgICAgICByZXR1cm4gZXZlbnROYW1lIGluIHRyYW5zbGF0aW9ucyA/IHRy
YW5zbGF0aW9uc1tldmVudE5hbWVdIDogZXZlbnROYW1lOworICAgIH07CisgIH0KKworICBmdW5j
dGlvbiBvYnNlcnZlKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworCisgICAgdmFyIHJlc3BvbmRlciA9IF9jcmVhdGVSZXNwb25kZXIoZWxl
bWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKKworICAgIGlmICghcmVzcG9uZGVyKSByZXR1cm4g
ZWxlbWVudDsKKworICAgIGlmIChldmVudE5hbWUuaW5jbHVkZSgnOicpKSB7CisgICAgICBpZiAo
ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKQorICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVu
ZXIoImRhdGFhdmFpbGFibGUiLCByZXNwb25kZXIsIGZhbHNlKTsKKyAgICAgIGVsc2UgeworICAg
ICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbmRhdGFhdmFpbGFibGUiLCByZXNwb25kZXIpOwor
ICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbmZpbHRlcmNoYW5nZSIsIHJlc3BvbmRlcik7
CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBhY3R1YWxFdmVudE5hbWUgPSBfZ2V0
RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlz
dGVuZXIpCisgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihhY3R1YWxFdmVudE5hbWUs
IHJlc3BvbmRlciwgZmFsc2UpOworICAgICAgZWxzZQorICAgICAgICBlbGVtZW50LmF0dGFjaEV2
ZW50KCJvbiIgKyBhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlcik7CisgICAgfQorCisgICAgcmV0
dXJuIGVsZW1lbnQ7CisgIH0KKworICBmdW5jdGlvbiBzdG9wT2JzZXJ2aW5nKGVsZW1lbnQsIGV2
ZW50TmFtZSwgaGFuZGxlcikgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgdmFy
IHJlZ2lzdHJ5ID0gRWxlbWVudC5yZXRyaWV2ZShlbGVtZW50LCAncHJvdG90eXBlX2V2ZW50X3Jl
Z2lzdHJ5Jyk7CisKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHJlZ2lzdHJ5KSkgcmV0dXJu
IGVsZW1lbnQ7CisKKyAgICBpZiAoZXZlbnROYW1lICYmICFoYW5kbGVyKSB7CisgICAgICB2YXIg
cmVzcG9uZGVycyA9IHJlZ2lzdHJ5LmdldChldmVudE5hbWUpOworCisgICAgICBpZiAoT2JqZWN0
LmlzVW5kZWZpbmVkKHJlc3BvbmRlcnMpKSByZXR1cm4gZWxlbWVudDsKKworICAgICAgcmVzcG9u
ZGVycy5lYWNoKCBmdW5jdGlvbihyKSB7CisgICAgICAgIEVsZW1lbnQuc3RvcE9ic2VydmluZyhl
bGVtZW50LCBldmVudE5hbWUsIHIuaGFuZGxlcik7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBl
bGVtZW50OworICAgIH0gZWxzZSBpZiAoIWV2ZW50TmFtZSkgeworICAgICAgcmVnaXN0cnkuZWFj
aCggZnVuY3Rpb24ocGFpcikgeworICAgICAgICB2YXIgZXZlbnROYW1lID0gcGFpci5rZXksIHJl
c3BvbmRlcnMgPSBwYWlyLnZhbHVlOworCisgICAgICAgIHJlc3BvbmRlcnMuZWFjaCggZnVuY3Rp
b24ocikgeworICAgICAgICAgIEVsZW1lbnQuc3RvcE9ic2VydmluZyhlbGVtZW50LCBldmVudE5h
bWUsIHIuaGFuZGxlcik7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICByZXR1cm4gZWxl
bWVudDsKKyAgICB9CisKKyAgICB2YXIgcmVzcG9uZGVycyA9IHJlZ2lzdHJ5LmdldChldmVudE5h
bWUpOworCisgICAgaWYgKCFyZXNwb25kZXJzKSByZXR1cm47CisKKyAgICB2YXIgcmVzcG9uZGVy
ID0gcmVzcG9uZGVycy5maW5kKCBmdW5jdGlvbihyKSB7IHJldHVybiByLmhhbmRsZXIgPT09IGhh
bmRsZXI7IH0pOworICAgIGlmICghcmVzcG9uZGVyKSByZXR1cm4gZWxlbWVudDsKKworICAgIHZh
ciBhY3R1YWxFdmVudE5hbWUgPSBfZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICBp
ZiAoZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgeworICAgICAgaWYgKGVsZW1lbnQucmVtb3ZlRXZl
bnRMaXN0ZW5lcikKKyAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYXRhYXZh
aWxhYmxlIiwgcmVzcG9uZGVyLCBmYWxzZSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgZWxlbWVu
dC5kZXRhY2hFdmVudCgib25kYXRhYXZhaWxhYmxlIiwgcmVzcG9uZGVyKTsKKyAgICAgICAgZWxl
bWVudC5kZXRhY2hFdmVudCgib25maWx0ZXJjaGFuZ2UiLCAgcmVzcG9uZGVyKTsKKyAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikKKyAg
ICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGFjdHVhbEV2ZW50TmFtZSwgcmVzcG9u
ZGVyLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoJ29u
JyArIGFjdHVhbEV2ZW50TmFtZSwgcmVzcG9uZGVyKTsKKyAgICB9CisKKyAgICByZWdpc3RyeS5z
ZXQoZXZlbnROYW1lLCByZXNwb25kZXJzLndpdGhvdXQocmVzcG9uZGVyKSk7CisKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfQorCisgIGZ1bmN0aW9uIGZpcmUoZWxlbWVudCwgZXZlbnROYW1lLCBt
ZW1vLCBidWJibGUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKworICAgIGlmIChPYmpl
Y3QuaXNVbmRlZmluZWQoYnViYmxlKSkKKyAgICAgIGJ1YmJsZSA9IHRydWU7CisKKyAgICBpZiAo
ZWxlbWVudCA9PSBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiAhZWxlbWVudC5k
aXNwYXRjaEV2ZW50KQorICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsK
KworICAgIHZhciBldmVudDsKKyAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHsKKyAgICAg
IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTsKKyAgICAgIGV2ZW50
LmluaXRFdmVudCgnZGF0YWF2YWlsYWJsZScsIHRydWUsIHRydWUpOworICAgIH0gZWxzZSB7Cisg
ICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7CisgICAgICBldmVudC5l
dmVudFR5cGUgPSBidWJibGUgPyAnb25kYXRhYXZhaWxhYmxlJyA6ICdvbmZpbHRlcmNoYW5nZSc7
CisgICAgfQorCisgICAgZXZlbnQuZXZlbnROYW1lID0gZXZlbnROYW1lOworICAgIGV2ZW50Lm1l
bW8gPSBtZW1vIHx8IHsgfTsKKworICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkKKyAgICAg
IGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgZWxzZQorICAgICAgZWxlbWVudC5m
aXJlRXZlbnQoZXZlbnQuZXZlbnRUeXBlLCBldmVudCk7CisKKyAgICByZXR1cm4gRXZlbnQuZXh0
ZW5kKGV2ZW50KTsKKyAgfQorCisKKyAgT2JqZWN0LmV4dGVuZChFdmVudCwgRXZlbnQuTWV0aG9k
cyk7CisKKyAgT2JqZWN0LmV4dGVuZChFdmVudCwgeworICAgIGZpcmU6ICAgICAgICAgIGZpcmUs
CisgICAgb2JzZXJ2ZTogICAgICAgb2JzZXJ2ZSwKKyAgICBzdG9wT2JzZXJ2aW5nOiBzdG9wT2Jz
ZXJ2aW5nCisgIH0pOworCisgIEVsZW1lbnQuYWRkTWV0aG9kcyh7CisgICAgZmlyZTogICAgICAg
ICAgZmlyZSwKKworICAgIG9ic2VydmU6ICAgICAgIG9ic2VydmUsCisKKyAgICBzdG9wT2JzZXJ2
aW5nOiBzdG9wT2JzZXJ2aW5nCisgIH0pOworCisgIE9iamVjdC5leHRlbmQoZG9jdW1lbnQsIHsK
KyAgICBmaXJlOiAgICAgICAgICBmaXJlLm1ldGhvZGl6ZSgpLAorCisgICAgb2JzZXJ2ZTogICAg
ICAgb2JzZXJ2ZS5tZXRob2RpemUoKSwKKworICAgIHN0b3BPYnNlcnZpbmc6IHN0b3BPYnNlcnZp
bmcubWV0aG9kaXplKCksCisKKyAgICBsb2FkZWQ6ICAgICAgICBmYWxzZQorICB9KTsKKworICBp
ZiAod2luZG93LkV2ZW50KSBPYmplY3QuZXh0ZW5kKHdpbmRvdy5FdmVudCwgRXZlbnQpOworICBl
bHNlIHdpbmRvdy5FdmVudCA9IEV2ZW50OworfSkoKTsKKworKGZ1bmN0aW9uKCkgeworICAvKiBT
dXBwb3J0IGZvciB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBpcyBiYXNlZCBvbiB3b3JrIGJ5
IERhbiBXZWJiLAorICAgICBNYXR0aGlhcyBNaWxsZXIsIERlYW4gRWR3YXJkcywgSm9obiBSZXNp
ZywgYW5kIERpZWdvIFBlcmluaS4gKi8KKworICB2YXIgdGltZXI7CisKKyAgZnVuY3Rpb24gZmly
ZUNvbnRlbnRMb2FkZWRFdmVudCgpIHsKKyAgICBpZiAoZG9jdW1lbnQubG9hZGVkKSByZXR1cm47
CisgICAgaWYgKHRpbWVyKSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTsKKyAgICBkb2N1bWVu
dC5sb2FkZWQgPSB0cnVlOworICAgIGRvY3VtZW50LmZpcmUoJ2RvbTpsb2FkZWQnKTsKKyAgfQor
CisgIGZ1bmN0aW9uIGNoZWNrUmVhZHlTdGF0ZSgpIHsKKyAgICBpZiAoZG9jdW1lbnQucmVhZHlT
dGF0ZSA9PT0gJ2NvbXBsZXRlJykgeworICAgICAgZG9jdW1lbnQuc3RvcE9ic2VydmluZygncmVh
ZHlzdGF0ZWNoYW5nZScsIGNoZWNrUmVhZHlTdGF0ZSk7CisgICAgICBmaXJlQ29udGVudExvYWRl
ZEV2ZW50KCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcG9sbERvU2Nyb2xsKCkgeworICAg
IHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgnbGVmdCcpOyB9CisgICAg
Y2F0Y2goZSkgeworICAgICAgdGltZXIgPSBwb2xsRG9TY3JvbGwuZGVmZXIoKTsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOworICB9CisKKyAgaWYg
KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKKyAgICBkb2N1bWVudC5hZGRFdmVudExpc3Rl
bmVyKCdET01Db250ZW50TG9hZGVkJywgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCwgZmFsc2UpOwor
ICB9IGVsc2UgeworICAgIGRvY3VtZW50Lm9ic2VydmUoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBjaGVj
a1JlYWR5U3RhdGUpOworICAgIGlmICh3aW5kb3cgPT0gdG9wKQorICAgICAgdGltZXIgPSBwb2xs
RG9TY3JvbGwuZGVmZXIoKTsKKyAgfQorCisgIEV2ZW50Lm9ic2VydmUod2luZG93LCAnbG9hZCcs
IGZpcmVDb250ZW50TG9hZGVkRXZlbnQpOworfSkoKTsKKworRWxlbWVudC5hZGRNZXRob2RzKCk7
CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVEIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIYXNoLnRvUXVlcnlTdHJpbmcgPSBPYmplY3Qu
dG9RdWVyeVN0cmluZzsKKwordmFyIFRvZ2dsZSA9IHsgZGlzcGxheTogRWxlbWVudC50b2dnbGUg
fTsKKworRWxlbWVudC5NZXRob2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFu
dE9mOworCit2YXIgSW5zZXJ0aW9uID0geworICBCZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNv
bnRlbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2JlZm9yZTpjb250
ZW50fSk7CisgIH0sCisKKyAgVG9wOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAg
cmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHt0b3A6Y29udGVudH0pOworICB9LAorCisg
IEJvdHRvbTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50
Lmluc2VydChlbGVtZW50LCB7Ym90dG9tOmNvbnRlbnR9KTsKKyAgfSwKKworICBBZnRlcjogZnVu
Y3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVt
ZW50LCB7YWZ0ZXI6Y29udGVudH0pOworICB9Cit9OworCit2YXIgJGNvbnRpbnVlID0gbmV3IEVy
cm9yKCcidGhyb3cgJGNvbnRpbnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVybiIgaW5zdGVh
ZCcpOworCit2YXIgUG9zaXRpb24gPSB7CisgIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwK
KworICBwcmVwYXJlOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmRlbHRhWCA9ICB3aW5kb3cucGFn
ZVhPZmZzZXQKKyAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Ny
b2xsTGVmdAorICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdAorICAg
ICAgICAgICAgICAgIHx8IDA7CisgICAgdGhpcy5kZWx0YVkgPSAgd2luZG93LnBhZ2VZT2Zmc2V0
CisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcAor
ICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wCisgICAgICAgICAgICAg
ICAgfHwgMDsKKyAgfSwKKworICB3aXRoaW46IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKKyAg
ICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykKKyAgICAgIHJldHVybiB0aGlzLndpdGhp
bkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7CisgICAgdGhpcy54Y29tcCA9
IHg7CisgICAgdGhpcy55Y29tcCA9IHk7CisgICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVs
YXRpdmVPZmZzZXQoZWxlbWVudCk7CisKKyAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRbMV0g
JiYKKyAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdo
dCAmJgorICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFswXSAmJgorICAgICAgICAgICAgeCA8
ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOworICB9LAorCisgIHdpdGhp
bkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKKyAgICB2
YXIgb2Zmc2V0Y2FjaGUgPSBFbGVtZW50LmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQoZWxlbWVudCk7
CisKKyAgICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7Cisg
ICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOworICAgIHRo
aXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOworCisgICAgcmV0
dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB0aGlzLnlj
b21wIDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAg
ICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHRoaXMueGNv
bXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICBv
dmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVtZW50KSB7CisgICAgaWYgKCFtb2RlKSByZXR1cm4g
MDsKKyAgICBpZiAobW9kZSA9PSAndmVydGljYWwnKQorICAgICAgcmV0dXJuICgodGhpcy5vZmZz
ZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCkgLSB0aGlzLnljb21wKSAvCisgICAgICAgIGVs
ZW1lbnQub2Zmc2V0SGVpZ2h0OworICAgIGlmIChtb2RlID09ICdob3Jpem9udGFsJykKKyAgICAg
IHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCkgLSB0aGlzLnhj
b21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7CisgIH0sCisKKworICBjdW11bGF0
aXZlT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCwKKworICBwb3NpdGlv
bmVkT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMucG9zaXRpb25lZE9mZnNldCwKKworICBhYnNvbHV0
aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgUG9zaXRpb24ucHJlcGFyZSgpOworICAgIHJl
dHVybiBFbGVtZW50LmFic29sdXRpemUoZWxlbWVudCk7CisgIH0sCisKKyAgcmVsYXRpdml6ZTog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKKyAgICByZXR1cm4g
RWxlbWVudC5yZWxhdGl2aXplKGVsZW1lbnQpOworICB9LAorCisgIHJlYWxPZmZzZXQ6IEVsZW1l
bnQuTWV0aG9kcy5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0LAorCisgIG9mZnNldFBhcmVudDogRWxl
bWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCwKKworICBwYWdlOiBFbGVtZW50Lk1ldGhvZHMu
dmlld3BvcnRPZmZzZXQsCisKKyAgY2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBvcHRp
b25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgeyB9OworICAgIHJldHVybiBFbGVtZW50
LmNsb25lUG9zaXRpb24odGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpOworICB9Cit9OworCisvKi0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
KSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRo
b2RzKXsKKyAgZnVuY3Rpb24gaXRlcihuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUuYmxhbmsoKSA/
IG51bGwgOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwgJyAiICsgbmFtZSAr
ICIgJyldIjsKKyAgfQorCisgIGluc3RhbmNlTWV0aG9kcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
ID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCA/CisgIGZ1bmN0aW9uKGVsZW1lbnQs
IGNsYXNzTmFtZSkgeworICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlw
KCk7CisgICAgdmFyIGNvbmQgPSAvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSku
bWFwKGl0ZXIpLmpvaW4oJycpIDogaXRlcihjbGFzc05hbWUpOworICAgIHJldHVybiBjb25kID8g
ZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtd
OworICB9IDogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgY2xhc3NOYW1lID0g
Y2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAoKTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xh
c3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsK
KyAgICBpZiAoIWNsYXNzTmFtZXMgJiYgIWNsYXNzTmFtZSkgcmV0dXJuIGVsZW1lbnRzOworCisg
ICAgdmFyIG5vZGVzID0gJChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworICAg
IGNsYXNzTmFtZSA9ICcgJyArIGNsYXNzTmFtZSArICcgJzsKKworICAgIGZvciAodmFyIGkgPSAw
LCBjaGlsZCwgY247IGNoaWxkID0gbm9kZXNbaV07IGkrKykgeworICAgICAgaWYgKGNoaWxkLmNs
YXNzTmFtZSAmJiAoY24gPSAnICcgKyBjaGlsZC5jbGFzc05hbWUgKyAnICcpICYmIChjbi5pbmNs
dWRlKGNsYXNzTmFtZSkgfHwKKyAgICAgICAgICAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmFs
bChmdW5jdGlvbihuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5i
bGFuaygpICYmIGNuLmluY2x1ZGUoJyAnICsgbmFtZSArICcgJyk7CisgICAgICAgICAgfSkpKSkK
KyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChjaGlsZCkpOworICAgIH0KKyAg
ICByZXR1cm4gZWxlbWVudHM7CisgIH07CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGNsYXNzTmFtZSwg
cGFyZW50RWxlbWVudCkgeworICAgIHJldHVybiAkKHBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQu
Ym9keSkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpOworICB9OworfShFbGVtZW50
Lk1ldGhvZHMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRWxlbWVudC5DbGFzc05hbWVz
ID0gQ2xhc3MuY3JlYXRlKCk7CitFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0geworICBp
bml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdGhpcy5lbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgfSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLmVs
ZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgeworICAg
ICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMDsKKyAgICB9KS5fZWFjaChpdGVyYXRvcik7CisgIH0s
CisKKyAgc2V0OiBmdW5jdGlvbihjbGFzc05hbWUpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NO
YW1lID0gY2xhc3NOYW1lOworICB9LAorCisgIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQp
IHsKKyAgICBpZiAodGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvQWRkKSkgcmV0dXJuOworICAgIHRo
aXMuc2V0KCRBKHRoaXMpLmNvbmNhdChjbGFzc05hbWVUb0FkZCkuam9pbignICcpKTsKKyAgfSwK
KworICByZW1vdmU6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvUmVtb3ZlKSB7CisgICAgaWYgKCF0aGlz
LmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEodGhp
cykud2l0aG91dChjbGFzc05hbWVUb1JlbW92ZSkuam9pbignICcpKTsKKyAgfSwKKworICB0b1N0
cmluZzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICRBKHRoaXMpLmpvaW4oJyAnKTsKKyAgfQor
fTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJh
YmxlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53926</attachid>
            <date>2010-04-21 00:08:59 -0700</date>
            <delta_ts>2010-04-21 09:32:16 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37886-20100421000858.patch</filename>
            <type>text/plain</type>
            <size>149183</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0J1Z3NTaXRlL0NoYW5nZUxvZyBiL0J1Z3NTaXRlL0NoYW5nZUxvZwppbmRl
eCA0NzIzZTI0Li41ZTAzNTQwIDEwMDY0NAotLS0gYS9CdWdzU2l0ZS9DaGFuZ2VMb2cKKysrIGIv
QnVnc1NpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDQtMjAgIEFkYW0gQmFy
dGggIDxhYmFydGhAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBIYWNrIHVwIFByZXR0eURpZmYgdG8gYWxsb3cgbGluZS1ieS1saW5l
IGNvbW1lbnRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNzg4NgorCisgICAgICAgIEFkbWl0dGVkbHkgYSBiaXQgb2YgYSBoYWNrLCB0aGlzIGlzIGEg
YmFzaWMgbGluZS1ieS1saW5lIGVkaXRvciB3ZSBjYW4KKyAgICAgICAgcGxheSB3aXRoIHRoYW5r
cyB0byBBbmRyZXcgU2NoZXJrdXMuICBJdCdzIG1lYW50IHRvIGludGVncmF0ZSB3aXRoIHRoZQor
ICAgICAgICAicmV2aWV3IiBwYWdlIGF0IGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICBJIGNo
YW5nZWQgYSBmZXcgdGhpbmdzIGZyb20gQW5kcmV3J3Mgb3JpZ2luYWwgdmVyc2lvbjoKKyAgICAg
ICAgMSkgVHJpZ2dlciB0ZXh0IGJveGVzIG9uIHNpbmdsZSBjbGljayB0byBtYWtlIGlQaG9uZS9p
UGFkIHJldmlld2luZworICAgICAgICBlYXNpZXIuCisgICAgICAgIDIpIENsZWFyIHRoZSBtYWlu
IHRleHQgYm94IG9uIGxvYWQuCisgICAgICAgIDMpIFJlZmVyZW5jZSBhIHZlcnNpb24gb2YgcHJv
dG90eXBlLmpzIG9uIGJ1Z3Mud2Via2l0Lm9yZy4KKworICAgICAgICAqIFByZXR0eVBhdGNoL1By
ZXR0eVBhdGNoLnJiOgorICAgICAgICAqIHByb3RvdHlwZS5qczogQWRkZWQuCisKIDIwMTAtMDIt
MjIgIFRvciBBcm5lIFZlc3Riw7ggIDx0b3IuYXJuZS52ZXN0Ym9Abm9raWEuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE1hY2llaiBTdGFjaG93aWFrLgpkaWZmIC0tZ2l0IGEvQnVnc1NpdGUv
UHJldHR5UGF0Y2gvUHJldHR5UGF0Y2gucmIgYi9CdWdzU2l0ZS9QcmV0dHlQYXRjaC9QcmV0dHlQ
YXRjaC5yYgppbmRleCAwYjQxMTA0Li5mM2IzN2Q1IDEwMDY0NAotLS0gYS9CdWdzU2l0ZS9QcmV0
dHlQYXRjaC9QcmV0dHlQYXRjaC5yYgorKysgYi9CdWdzU2l0ZS9QcmV0dHlQYXRjaC9QcmV0dHlQ
YXRjaC5yYgpAQCAtMTgyLDcgKzE4MiwxMDQgQEAgaDEgOmhvdmVyIHsKICAgICBiYWNrZ3JvdW5k
LWNvbG9yOiAjZTk5OwogICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKIH0KKworLyogU3VwcG9y
dCBmb3IgaW5saW5lIGNvbW1lbnRzICovCisuY29tbWVudCB7CisgIGJvcmRlcjogMXB4IHdpZHRo
IHNvbGlkIHJlZDsKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKyAKKy5jb21tZW50IHRl
eHRhcmVhIHsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogNmVtOworfQorIAorLnN1Ym1pdHRl
ZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogcmVkOworfQogPC9zdHlsZT4KKzxz
Y3JpcHQgc3JjPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9wcm90b3R5cGUuanMiPjwvc2NyaXB0
PiAKKzxzY3JpcHQ+CisvLyBDb2RlIHRvIHN1cHBvcnQgaW5saW5lIGNvbW1lbnRzIGluIGJ1Z3Mu
d2Via2l0Lm9yZy4KK2Z1bmN0aW9uIGdldFN1Ym1pdFRleHRBcmVhKCkgeworICAvLyBOb3RlIHRo
YXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4gcnVubmluZyBvbiBzYW1lIGRvbWFpbi4KKyAgcmV0dXJu
IHBhcmVudC5mcmFtZXNbMV0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHRhcmVh
IilbMF07Cit9CisKK3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24gKCkg
eworICB2YXIgbGluZXMgPSAkJCgiZGl2W2NsYXNzfj0nTGluZSddIik7CisgIGZvciAodmFyIGkg
PSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKKyAgICBsaW5lc1tpXS5hZGRFdmVudExpc3Rl
bmVyKCJjbGljayIsIG9uTGluZUNsaWNrZWQsIGZhbHNlKTsKKyAgfQorfSwgZmFsc2UpOworCitw
YXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uICgpIHsKKyAgLy8gUmVtb3Zl
IHRoZSBmdWxsIGRpZmYgZnJvbSB0aGUgc3VibWl0IHRleHQgYXJlYS4KKyAgcmV0dXJuIHBhcmVu
dC5mcmFtZXNbMV0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHRhcmVhIilbMF0u
dmFsdWUgPSAiIjsKK30sIGZhbHNlKTsKKworZnVuY3Rpb24gb25MaW5lQ2xpY2tlZChlKSB7Cisg
IC8vIEZpbmQgdGhlIHJpZ2h0IGxpbmUgZGl2LgorICAvLyBGSVhNRTogd2h5IGRvZXMgYSBjbGlj
ayBldmVudCBvbiBteSBkaXYgZ2V0IGludGVyY2VwdGVkCisgIC8vIGJ5IGEgc3BhbiBvciBldmVu
IGRvY3VtZW50IGVsZW1lbnQgOigKKyAgdmFyIGxpbmUgPSBlLnRhcmdldDsKKyAgd2hpbGUgKHRy
dWUpIHsKKyAgICBpZiAobGluZSA9PSBkb2N1bWVudCkKKyAgICAgIHJldHVybjsKKyAgICBpZiAo
bGluZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikuc3Vic3RyKDAsIDQpID09ICJMaW5lIikKKyAgICAg
IGJyZWFrOworICAgIGxpbmUgPSBsaW5lLnVwKCk7CisgIH0KKworICB2YXIgbGluZUZyb20gPSBs
aW5lLnNlbGVjdCgiW2NsYXNzPSdmcm9tIGxpbmVOdW1iZXInXSIpWzBdLmlubmVySFRNTDsKKyAg
dmFyIGxpbmVUbyA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J3RvIGxpbmVOdW1iZXInXSIpWzBdLmlu
bmVySFRNTDsKKyAgdmFyIGxpbmVUZXh0ID0gbGluZS5zZWxlY3QoIltjbGFzcz0ndGV4dCddIilb
MF0uaW5uZXJIVE1MOworCisgIGxpbmUuaW5zZXJ0KHthZnRlcjoKKyAgICAgICI8ZGl2IGNsYXNz
PSdjb21tZW50Jz4iICsKKyAgICAgICI8dGV4dGFyZWE+PC90ZXh0YXJlYT4iICsKKyAgICAgICI8
YnV0dG9uIG9uY2xpY2s9J29uQ29tbWVudFN1Ym1pdCh0aGlzLnVwKCkpJz5TdWJtaXQ8L2J1dHRv
bj4iICsKKyAgICAgICI8YnV0dG9uIG9uY2xpY2s9J29uQ29tbWVudENhbmNlbCh0aGlzLnVwKCkp
Jz5DYW5jZWw8L2J1dHRvbj4iICsKKyAgICAgICI8L2Rpdj4ifSk7CisKKyAgdmFyIGNvbW1lbnQg
PSBsaW5lLm5leHQoKTsKKyAgdmFyIHRleHRhcmVhID0gY29tbWVudC5zZWxlY3QoInRleHRhcmVh
IilbMF07CisgIHRleHRhcmVhLmZvY3VzKCk7Cit9CisKK2Z1bmN0aW9uIG9uQ29tbWVudFN1Ym1p
dChjb21tZW50KSB7CisgIHZhciB0ZXh0YXJlYSA9IGNvbW1lbnQuc2VsZWN0KCJ0ZXh0YXJlYSIp
WzBdOworICB2YXIgYnV0dG9ucyA9IGNvbW1lbnQuc2VsZWN0KCJidXR0b24iKTsKKyAgdmFyIGNv
bW1lbnRUZXh0ID0gdGV4dGFyZWEudmFsdWU7CisKKyAgdmFyIGxpbmUgPSBjb21tZW50LnByZXZp
b3VzKCk7CisgIHZhciBsaW5lRnJvbSA9IGxpbmUuc2VsZWN0KCJbY2xhc3M9J2Zyb20gbGluZU51
bWJlciddIilbMF0udGV4dENvbnRlbnQ7CisgIHZhciBsaW5lVG8gPSBsaW5lLnNlbGVjdCgiW2Ns
YXNzPSd0byBsaW5lTnVtYmVyJ10iKVswXS50ZXh0Q29udGVudDsKKyAgdmFyIGxpbmVUZXh0ID0g
bGluZS5zZWxlY3QoIltjbGFzcz0ndGV4dCddIilbMF0udGV4dENvbnRlbnQ7CisgIHZhciBmaWxl
bmFtZSA9IGNvbW1lbnQudXAoKS51cCgpLnNlbGVjdCgiaDEiKVswXS5kb3duKCkudGV4dENvbnRl
bnQ7CisKKyAgdmFyIHNuaXBwZXQgPSBmaWxlbmFtZSArICI6IiArIGxpbmVUbyArICJcbiArICAi
ICsgbGluZVRleHQgKyAiXG4iICsgY29tbWVudFRleHQgKyAiXG5cbiI7CisgIGNvbnNvbGUubG9n
KHNuaXBwZXQpOworCisgIC8vIFJlbW92ZSBhbGwgdGhlIGNyYXAuCisgIHRleHRhcmVhLnJlbW92
ZSgpOworICBidXR0b25zWzBdLnJlbW92ZSgpOworICBidXR0b25zWzFdLnJlbW92ZSgpOworCisg
IC8vIEluc2VydCBhIG5vbi1lZGl0YWJsZSBmb3JtIG9mIG91ciBjb21tZW50LgorICBjb21tZW50
Lmluc2VydCgiPHByZT4iICsgY29tbWVudFRleHQgKyAiPC9wcmU+Iik7CisgIGNvbW1lbnQuc2V0
QXR0cmlidXRlKCJjbGFzcyIsICJjb21tZW50IHN1Ym1pdHRlZCIpOworCisgIC8vIFVwZGF0ZSB0
aGUgc3VibWlzc2lvbiB0ZXh0IGFyZWEuCisgIHZhciBzdWJtaXNzaW9uID0gZ2V0U3VibWl0VGV4
dEFyZWEoKTsKKyAgc3VibWlzc2lvbi52YWx1ZSA9IHN1Ym1pc3Npb24udmFsdWUgKyBzbmlwcGV0
OworfQorCitmdW5jdGlvbiBvbkNvbW1lbnRDYW5jZWwoY29tbWVudCkgeworICBjb21tZW50LnJl
bW92ZSgpOworfQorPC9zY3JpcHQ+CiBFT0YKIAogICAgIGRlZiBzZWxmLnJldmlzaW9uT3JEZXNj
cmlwdGlvbihzdHJpbmcpCmRpZmYgLS1naXQgYS9CdWdzU2l0ZS9wcm90b3R5cGUuanMgYi9CdWdz
U2l0ZS9wcm90b3R5cGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZl
NmUxMgotLS0gL2Rldi9udWxsCisrKyBiL0J1Z3NTaXRlL3Byb3RvdHlwZS5qcwpAQCAtMCwwICsx
LDQ4NzQgQEAKKy8qICBQcm90b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmssIHZlcnNpb24gMS42
LjEKKyAqICAoYykgMjAwNS0yMDA5IFNhbSBTdGVwaGVuc29uCisgKgorICogIFByb3RvdHlwZSBp
cyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxp
Y2Vuc2UuCisgKiAgRm9yIGRldGFpbHMsIHNlZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRw
Oi8vd3d3LnByb3RvdHlwZWpzLm9yZy8KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFy
IFByb3RvdHlwZSA9IHsKKyAgVmVyc2lvbjogJzEuNi4xJywKKworICBCcm93c2VyOiAoZnVuY3Rp
b24oKXsKKyAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OworICAgIHZhciBpc09wZXJh
ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSkgPT0gJ1tvYmpl
Y3QgT3BlcmFdJzsKKyAgICByZXR1cm4geworICAgICAgSUU6ICAgICAgICAgICAgICEhd2luZG93
LmF0dGFjaEV2ZW50ICYmICFpc09wZXJhLAorICAgICAgT3BlcmE6ICAgICAgICAgIGlzT3BlcmEs
CisgICAgICBXZWJLaXQ6ICAgICAgICAgdWEuaW5kZXhPZignQXBwbGVXZWJLaXQvJykgPiAtMSwK
KyAgICAgIEdlY2tvOiAgICAgICAgICB1YS5pbmRleE9mKCdHZWNrbycpID4gLTEgJiYgdWEuaW5k
ZXhPZignS0hUTUwnKSA9PT0gLTEsCisgICAgICBNb2JpbGVTYWZhcmk6ICAgL0FwcGxlLipNb2Jp
bGUuKlNhZmFyaS8udGVzdCh1YSkKKyAgICB9CisgIH0pKCksCisKKyAgQnJvd3NlckZlYXR1cmVz
OiB7CisgICAgWFBhdGg6ICEhZG9jdW1lbnQuZXZhbHVhdGUsCisgICAgU2VsZWN0b3JzQVBJOiAh
IWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsCisgICAgRWxlbWVudEV4dGVuc2lvbnM6IChmdW5jdGlv
bigpIHsKKyAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvdy5FbGVtZW50IHx8IHdpbmRvdy5I
VE1MRWxlbWVudDsKKyAgICAgIHJldHVybiAhIShjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5w
cm90b3R5cGUpOworICAgIH0pKCksCisgICAgU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9uczogKGZ1
bmN0aW9uKCkgeworICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuSFRNTERpdkVsZW1lbnQgIT09ICd1
bmRlZmluZWQnKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgdmFyIGRpdiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdmb3JtJyk7CisgICAgICB2YXIgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAg
ICAgaWYgKGRpdlsnX19wcm90b19fJ10gJiYgKGRpdlsnX19wcm90b19fJ10gIT09IGZvcm1bJ19f
cHJvdG9fXyddKSkgeworICAgICAgICBpc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICB9CisKKyAg
ICAgIGRpdiA9IGZvcm0gPSBudWxsOworCisgICAgICByZXR1cm4gaXNTdXBwb3J0ZWQ7CisgICAg
fSkoKQorICB9LAorCisgIFNjcmlwdEZyYWdtZW50OiAnPHNjcmlwdFtePl0qPihbXFxTXFxzXSo/
KTxcL3NjcmlwdD4nLAorICBKU09ORmlsdGVyOiAvXlwvXCotc2VjdXJlLShbXHNcU10qKVwqXC9c
cyokLywKKworICBlbXB0eUZ1bmN0aW9uOiBmdW5jdGlvbigpIHsgfSwKKyAgSzogZnVuY3Rpb24o
eCkgeyByZXR1cm4geCB9Cit9OworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuTW9iaWxlU2FmYXJp
KQorICBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMg
PSBmYWxzZTsKKworCit2YXIgQWJzdHJhY3QgPSB7IH07CisKKwordmFyIFRyeSA9IHsKKyAgdGhl
c2U6IGZ1bmN0aW9uKCkgeworICAgIHZhciByZXR1cm5WYWx1ZTsKKworICAgIGZvciAodmFyIGkg
PSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAg
IHZhciBsYW1iZGEgPSBhcmd1bWVudHNbaV07CisgICAgICB0cnkgeworICAgICAgICByZXR1cm5W
YWx1ZSA9IGxhbWJkYSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKGUpIHsgfQor
ICAgIH0KKworICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgfQorfTsKKworLyogQmFzZWQgb24g
QWxleCBBcm5lbGwncyBpbmhlcml0YW5jZSBpbXBsZW1lbnRhdGlvbi4gKi8KKwordmFyIENsYXNz
ID0gKGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBzdWJjbGFzcygpIHt9OworICBmdW5jdGlvbiBj
cmVhdGUoKSB7CisgICAgdmFyIHBhcmVudCA9IG51bGwsIHByb3BlcnRpZXMgPSAkQShhcmd1bWVu
dHMpOworICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihwcm9wZXJ0aWVzWzBdKSkKKyAgICAgIHBh
cmVudCA9IHByb3BlcnRpZXMuc2hpZnQoKTsKKworICAgIGZ1bmN0aW9uIGtsYXNzKCkgeworICAg
ICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAg
T2JqZWN0LmV4dGVuZChrbGFzcywgQ2xhc3MuTWV0aG9kcyk7CisgICAga2xhc3Muc3VwZXJjbGFz
cyA9IHBhcmVudDsKKyAgICBrbGFzcy5zdWJjbGFzc2VzID0gW107CisKKyAgICBpZiAocGFyZW50
KSB7CisgICAgICBzdWJjbGFzcy5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOworICAgICAg
a2xhc3MucHJvdG90eXBlID0gbmV3IHN1YmNsYXNzOworICAgICAgcGFyZW50LnN1YmNsYXNzZXMu
cHVzaChrbGFzcyk7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVz
Lmxlbmd0aDsgaSsrKQorICAgICAga2xhc3MuYWRkTWV0aG9kcyhwcm9wZXJ0aWVzW2ldKTsKKwor
ICAgIGlmICgha2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUpCisgICAgICBrbGFzcy5wcm90b3R5
cGUuaW5pdGlhbGl6ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworCisgICAga2xhc3MucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0ga2xhc3M7CisgICAgcmV0dXJuIGtsYXNzOworICB9CisKKyAg
ZnVuY3Rpb24gYWRkTWV0aG9kcyhzb3VyY2UpIHsKKyAgICB2YXIgYW5jZXN0b3IgICA9IHRoaXMu
c3VwZXJjbGFzcyAmJiB0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOworICAgIHZhciBwcm9wZXJ0
aWVzID0gT2JqZWN0LmtleXMoc291cmNlKTsKKworICAgIGlmICghT2JqZWN0LmtleXMoeyB0b1N0
cmluZzogdHJ1ZSB9KS5sZW5ndGgpIHsKKyAgICAgIGlmIChzb3VyY2UudG9TdHJpbmcgIT0gT2Jq
ZWN0LnByb3RvdHlwZS50b1N0cmluZykKKyAgICAgICAgcHJvcGVydGllcy5wdXNoKCJ0b1N0cmlu
ZyIpOworICAgICAgaWYgKHNvdXJjZS52YWx1ZU9mICE9IE9iamVjdC5wcm90b3R5cGUudmFsdWVP
ZikKKyAgICAgICAgcHJvcGVydGllcy5wdXNoKCJ2YWx1ZU9mIik7CisgICAgfQorCisgICAgZm9y
ICh2YXIgaSA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysp
IHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV0sIHZhbHVlID0gc291cmNlW3By
b3BlcnR5XTsKKyAgICAgIGlmIChhbmNlc3RvciAmJiBPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkg
JiYKKyAgICAgICAgICB2YWx1ZS5hcmd1bWVudE5hbWVzKCkuZmlyc3QoKSA9PSAiJHN1cGVyIikg
eworICAgICAgICB2YXIgbWV0aG9kID0gdmFsdWU7CisgICAgICAgIHZhbHVlID0gKGZ1bmN0aW9u
KG0pIHsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBhbmNlc3RvclttXS5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OworICAgICAgICB9KShwcm9wZXJ0eSkud3JhcChtZXRo
b2QpOworCisgICAgICAgIHZhbHVlLnZhbHVlT2YgPSBtZXRob2QudmFsdWVPZi5iaW5kKG1ldGhv
ZCk7CisgICAgICAgIHZhbHVlLnRvU3RyaW5nID0gbWV0aG9kLnRvU3RyaW5nLmJpbmQobWV0aG9k
KTsKKyAgICAgIH0KKyAgICAgIHRoaXMucHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworICAg
IH0KKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBjcmVhdGU6IGNy
ZWF0ZSwKKyAgICBNZXRob2RzOiB7CisgICAgICBhZGRNZXRob2RzOiBhZGRNZXRob2RzCisgICAg
fQorICB9OworfSkoKTsKKyhmdW5jdGlvbigpIHsKKworICB2YXIgX3RvU3RyaW5nID0gT2JqZWN0
LnByb3RvdHlwZS50b1N0cmluZzsKKworICBmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sIHNv
dXJjZSkgeworICAgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkKKyAgICAgIGRlc3RpbmF0
aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07CisgICAgcmV0dXJuIGRlc3RpbmF0aW9u
OworICB9CisKKyAgZnVuY3Rpb24gaW5zcGVjdChvYmplY3QpIHsKKyAgICB0cnkgeworICAgICAg
aWYgKGlzVW5kZWZpbmVkKG9iamVjdCkpIHJldHVybiAndW5kZWZpbmVkJzsKKyAgICAgIGlmIChv
YmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7CisgICAgICByZXR1cm4gb2JqZWN0Lmluc3Bl
Y3QgPyBvYmplY3QuaW5zcGVjdCgpIDogU3RyaW5nKG9iamVjdCk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSByZXR1cm4gJy4uLic7CisgICAg
ICB0aHJvdyBlOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRvSlNPTihvYmplY3QpIHsKKyAg
ICB2YXIgdHlwZSA9IHR5cGVvZiBvYmplY3Q7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBj
YXNlICd1bmRlZmluZWQnOgorICAgICAgY2FzZSAnZnVuY3Rpb24nOgorICAgICAgY2FzZSAndW5r
bm93bic6IHJldHVybjsKKyAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gb2JqZWN0LnRvU3Ry
aW5nKCk7CisgICAgfQorCisgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsK
KyAgICBpZiAob2JqZWN0LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04oKTsKKyAgICBpZiAo
aXNFbGVtZW50KG9iamVjdCkpIHJldHVybjsKKworICAgIHZhciByZXN1bHRzID0gW107CisgICAg
Zm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUgPSB0b0pTT04o
b2JqZWN0W3Byb3BlcnR5XSk7CisgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHVlKSkKKyAgICAg
ICAgcmVzdWx0cy5wdXNoKHByb3BlcnR5LnRvSlNPTigpICsgJzogJyArIHZhbHVlKTsKKyAgICB9
CisKKyAgICByZXR1cm4gJ3snICsgcmVzdWx0cy5qb2luKCcsICcpICsgJ30nOworICB9CisKKyAg
ZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhvYmplY3QpIHsKKyAgICByZXR1cm4gJEgob2JqZWN0KS50
b1F1ZXJ5U3RyaW5nKCk7CisgIH0KKworICBmdW5jdGlvbiB0b0hUTUwob2JqZWN0KSB7CisgICAg
cmV0dXJuIG9iamVjdCAmJiBvYmplY3QudG9IVE1MID8gb2JqZWN0LnRvSFRNTCgpIDogU3RyaW5n
LmludGVycHJldChvYmplY3QpOworICB9CisKKyAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHsKKyAg
ICB2YXIgcmVzdWx0cyA9IFtdOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkKKyAg
ICAgIHJlc3VsdHMucHVzaChwcm9wZXJ0eSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKwor
ICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICBm
b3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpCisgICAgICByZXN1bHRzLnB1c2gob2JqZWN0W3By
b3BlcnR5XSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICBmdW5jdGlvbiBjbG9uZShv
YmplY3QpIHsKKyAgICByZXR1cm4gZXh0ZW5kKHsgfSwgb2JqZWN0KTsKKyAgfQorCisgIGZ1bmN0
aW9uIGlzRWxlbWVudChvYmplY3QpIHsKKyAgICByZXR1cm4gISEob2JqZWN0ICYmIG9iamVjdC5u
b2RlVHlwZSA9PSAxKTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzQXJyYXkob2JqZWN0KSB7CisgICAg
cmV0dXJuIF90b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gIltvYmplY3QgQXJyYXldIjsKKyAgfQor
CisKKyAgZnVuY3Rpb24gaXNIYXNoKG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QgaW5zdGFu
Y2VvZiBIYXNoOworICB9CisKKyAgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHsKKyAgICBy
ZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gImZ1bmN0aW9uIjsKKyAgfQorCisgIGZ1bmN0aW9uIGlz
U3RyaW5nKG9iamVjdCkgeworICAgIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpID09ICJb
b2JqZWN0IFN0cmluZ10iOworICB9CisKKyAgZnVuY3Rpb24gaXNOdW1iZXIob2JqZWN0KSB7Cisg
ICAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gIltvYmplY3QgTnVtYmVyXSI7Cisg
IH0KKworICBmdW5jdGlvbiBpc1VuZGVmaW5lZChvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9m
IG9iamVjdCA9PT0gInVuZGVmaW5lZCI7CisgIH0KKworICBleHRlbmQoT2JqZWN0LCB7CisgICAg
ZXh0ZW5kOiAgICAgICAgZXh0ZW5kLAorICAgIGluc3BlY3Q6ICAgICAgIGluc3BlY3QsCisgICAg
dG9KU09OOiAgICAgICAgdG9KU09OLAorICAgIHRvUXVlcnlTdHJpbmc6IHRvUXVlcnlTdHJpbmcs
CisgICAgdG9IVE1MOiAgICAgICAgdG9IVE1MLAorICAgIGtleXM6ICAgICAgICAgIGtleXMsCisg
ICAgdmFsdWVzOiAgICAgICAgdmFsdWVzLAorICAgIGNsb25lOiAgICAgICAgIGNsb25lLAorICAg
IGlzRWxlbWVudDogICAgIGlzRWxlbWVudCwKKyAgICBpc0FycmF5OiAgICAgICBpc0FycmF5LAor
ICAgIGlzSGFzaDogICAgICAgIGlzSGFzaCwKKyAgICBpc0Z1bmN0aW9uOiAgICBpc0Z1bmN0aW9u
LAorICAgIGlzU3RyaW5nOiAgICAgIGlzU3RyaW5nLAorICAgIGlzTnVtYmVyOiAgICAgIGlzTnVt
YmVyLAorICAgIGlzVW5kZWZpbmVkOiAgIGlzVW5kZWZpbmVkCisgIH0pOworfSkoKTsKK09iamVj
dC5leHRlbmQoRnVuY3Rpb24ucHJvdG90eXBlLCAoZnVuY3Rpb24oKSB7CisgIHZhciBzbGljZSA9
IEFycmF5LnByb3RvdHlwZS5zbGljZTsKKworICBmdW5jdGlvbiB1cGRhdGUoYXJyYXksIGFyZ3Mp
IHsKKyAgICB2YXIgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGgsIGxlbmd0aCA9IGFyZ3MubGVu
Z3RoOworICAgIHdoaWxlIChsZW5ndGgtLSkgYXJyYXlbYXJyYXlMZW5ndGggKyBsZW5ndGhdID0g
YXJnc1tsZW5ndGhdOworICAgIHJldHVybiBhcnJheTsKKyAgfQorCisgIGZ1bmN0aW9uIG1lcmdl
KGFycmF5LCBhcmdzKSB7CisgICAgYXJyYXkgPSBzbGljZS5jYWxsKGFycmF5LCAwKTsKKyAgICBy
ZXR1cm4gdXBkYXRlKGFycmF5LCBhcmdzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGFyZ3VtZW50TmFt
ZXMoKSB7CisgICAgdmFyIG5hbWVzID0gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eW1xzXChdKmZ1
bmN0aW9uW14oXSpcKChbXildKilcKS8pWzFdCisgICAgICAucmVwbGFjZSgvXC9cLy4qP1tcclxu
XXxcL1wqKD86LnxbXHJcbl0pKj9cKlwvL2csICcnKQorICAgICAgLnJlcGxhY2UoL1xzKy9nLCAn
Jykuc3BsaXQoJywnKTsKKyAgICByZXR1cm4gbmFtZXMubGVuZ3RoID09IDEgJiYgIW5hbWVzWzBd
ID8gW10gOiBuYW1lczsKKyAgfQorCisgIGZ1bmN0aW9uIGJpbmQoY29udGV4dCkgeworICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiBPYmplY3QuaXNVbmRlZmluZWQoYXJndW1lbnRzWzBd
KSkgcmV0dXJuIHRoaXM7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IHNsaWNlLmNh
bGwoYXJndW1lbnRzLCAxKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYSA9
IG1lcmdlKGFyZ3MsIGFyZ3VtZW50cyk7CisgICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkoY29u
dGV4dCwgYSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gYmluZEFzRXZlbnRMaXN0ZW5lcihj
b250ZXh0KSB7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IHNsaWNlLmNhbGwoYXJn
dW1lbnRzLCAxKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIHZhciBhID0g
dXBkYXRlKFtldmVudCB8fCB3aW5kb3cuZXZlbnRdLCBhcmdzKTsKKyAgICAgIHJldHVybiBfX21l
dGhvZC5hcHBseShjb250ZXh0LCBhKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjdXJyeSgp
IHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzOworICAgIHZhciBfX21l
dGhvZCA9IHRoaXMsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJu
IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGEgPSBtZXJnZShhcmdzLCBhcmd1bWVudHMpOworICAg
ICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KHRoaXMsIGEpOworICAgIH0KKyAgfQorCisgIGZ1bmN0
aW9uIGRlbGF5KHRpbWVvdXQpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHRpbWVvdXQgPSB0aW1lb3V0ICogMTAwMAorICAg
IHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21l
dGhvZC5hcHBseShfX21ldGhvZCwgYXJncyk7CisgICAgfSwgdGltZW91dCk7CisgIH0KKworICBm
dW5jdGlvbiBkZWZlcigpIHsKKyAgICB2YXIgYXJncyA9IHVwZGF0ZShbMC4wMV0sIGFyZ3VtZW50
cyk7CisgICAgcmV0dXJuIHRoaXMuZGVsYXkuYXBwbHkodGhpcywgYXJncyk7CisgIH0KKworICBm
dW5jdGlvbiB3cmFwKHdyYXBwZXIpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzOworICAgIHJl
dHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBhID0gdXBkYXRlKFtfX21ldGhvZC5iaW5kKHRo
aXMpXSwgYXJndW1lbnRzKTsKKyAgICAgIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsIGEpOwor
ICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1ldGhvZGl6ZSgpIHsKKyAgICBpZiAodGhpcy5fbWV0
aG9kaXplZCkgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQ7CisgICAgdmFyIF9fbWV0aG9kID0gdGhp
czsKKyAgICByZXR1cm4gdGhpcy5fbWV0aG9kaXplZCA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFy
IGEgPSB1cGRhdGUoW3RoaXNdLCBhcmd1bWVudHMpOworICAgICAgcmV0dXJuIF9fbWV0aG9kLmFw
cGx5KG51bGwsIGEpOworICAgIH07CisgIH0KKworICByZXR1cm4geworICAgIGFyZ3VtZW50TmFt
ZXM6ICAgICAgIGFyZ3VtZW50TmFtZXMsCisgICAgYmluZDogICAgICAgICAgICAgICAgYmluZCwK
KyAgICBiaW5kQXNFdmVudExpc3RlbmVyOiBiaW5kQXNFdmVudExpc3RlbmVyLAorICAgIGN1cnJ5
OiAgICAgICAgICAgICAgIGN1cnJ5LAorICAgIGRlbGF5OiAgICAgICAgICAgICAgIGRlbGF5LAor
ICAgIGRlZmVyOiAgICAgICAgICAgICAgIGRlZmVyLAorICAgIHdyYXA6ICAgICAgICAgICAgICAg
IHdyYXAsCisgICAgbWV0aG9kaXplOiAgICAgICAgICAgbWV0aG9kaXplCisgIH0KK30pKCkpOwor
CisKK0RhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gJyInICsg
dGhpcy5nZXRVVENGdWxsWWVhcigpICsgJy0nICsKKyAgICAodGhpcy5nZXRVVENNb250aCgpICsg
MSkudG9QYWRkZWRTdHJpbmcoMikgKyAnLScgKworICAgIHRoaXMuZ2V0VVRDRGF0ZSgpLnRvUGFk
ZGVkU3RyaW5nKDIpICsgJ1QnICsKKyAgICB0aGlzLmdldFVUQ0hvdXJzKCkudG9QYWRkZWRTdHJp
bmcoMikgKyAnOicgKworICAgIHRoaXMuZ2V0VVRDTWludXRlcygpLnRvUGFkZGVkU3RyaW5nKDIp
ICsgJzonICsKKyAgICB0aGlzLmdldFVUQ1NlY29uZHMoKS50b1BhZGRlZFN0cmluZygyKSArICda
Iic7Cit9OworCisKK1JlZ0V4cC5wcm90b3R5cGUubWF0Y2ggPSBSZWdFeHAucHJvdG90eXBlLnRl
c3Q7CisKK1JlZ0V4cC5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHsKKyAgcmV0dXJuIFN0cmluZyhz
dHIpLnJlcGxhY2UoLyhbLiorP149IToke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsKK307Cit2
YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVu
Y3Rpb24oY2FsbGJhY2ssIGZyZXF1ZW5jeSkgeworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFj
azsKKyAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICB0aGlzLmN1cnJlbnRseUV4
ZWN1dGluZyA9IGZhbHNlOworCisgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7CisgIH0sCisK
KyAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAgdGhpcy50aW1lciA9IHNldElu
dGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksIHRoaXMuZnJlcXVlbmN5ICogMTAw
MCk7CisgIH0sCisKKyAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5jYWxsYmFjayh0
aGlzKTsKKyAgfSwKKworICBzdG9wOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMudGltZXIp
IHJldHVybjsKKyAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpOworICAgIHRoaXMudGltZXIg
PSBudWxsOworICB9LAorCisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0
aGlzLmN1cnJlbnRseUV4ZWN1dGluZykgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5jdXJy
ZW50bHlFeGVjdXRpbmcgPSB0cnVlOworICAgICAgICB0aGlzLmV4ZWN1dGUoKTsKKyAgICAgICAg
dGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2goZSkgeworICAg
ICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworICAgICAgICB0aHJvdyBlOwor
ICAgICAgfQorICAgIH0KKyAgfQorfSk7CitPYmplY3QuZXh0ZW5kKFN0cmluZywgeworICBpbnRl
cnByZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6
IFN0cmluZyh2YWx1ZSk7CisgIH0sCisgIHNwZWNpYWxDaGFyOiB7CisgICAgJ1xiJzogJ1xcYics
CisgICAgJ1x0JzogJ1xcdCcsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xmJzogJ1xcZicsCisg
ICAgJ1xyJzogJ1xccicsCisgICAgJ1xcJzogJ1xcXFwnCisgIH0KK30pOworCitPYmplY3QuZXh0
ZW5kKFN0cmluZy5wcm90b3R5cGUsIChmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiBwcmVwYXJl
UmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpIHsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ocmVw
bGFjZW1lbnQpKSByZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgdmFyIHRlbXBsYXRlID0gbmV3IFRl
bXBsYXRlKHJlcGxhY2VtZW50KTsKKyAgICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJu
IHRlbXBsYXRlLmV2YWx1YXRlKG1hdGNoKSB9OworICB9CisKKyAgZnVuY3Rpb24gZ3N1YihwYXR0
ZXJuLCByZXBsYWNlbWVudCkgeworICAgIHZhciByZXN1bHQgPSAnJywgc291cmNlID0gdGhpcywg
bWF0Y2g7CisgICAgcmVwbGFjZW1lbnQgPSBwcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQp
OworCisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhwYXR0ZXJuKSkKKyAgICAgIHBhdHRlcm4gPSBS
ZWdFeHAuZXNjYXBlKHBhdHRlcm4pOworCisgICAgaWYgKCEocGF0dGVybi5sZW5ndGggfHwgcGF0
dGVybi5zb3VyY2UpKSB7CisgICAgICByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50KCcnKTsKKyAg
ICAgIHJldHVybiByZXBsYWNlbWVudCArIHNvdXJjZS5zcGxpdCgnJykuam9pbihyZXBsYWNlbWVu
dCkgKyByZXBsYWNlbWVudDsKKyAgICB9CisKKyAgICB3aGlsZSAoc291cmNlLmxlbmd0aCA+IDAp
IHsKKyAgICAgIGlmIChtYXRjaCA9IHNvdXJjZS5tYXRjaChwYXR0ZXJuKSkgeworICAgICAgICBy
ZXN1bHQgKz0gc291cmNlLnNsaWNlKDAsIG1hdGNoLmluZGV4KTsKKyAgICAgICAgcmVzdWx0ICs9
IFN0cmluZy5pbnRlcnByZXQocmVwbGFjZW1lbnQobWF0Y2gpKTsKKyAgICAgICAgc291cmNlICA9
IHNvdXJjZS5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICB9IGVs
c2UgeworICAgICAgICByZXN1bHQgKz0gc291cmNlLCBzb3VyY2UgPSAnJzsKKyAgICAgIH0KKyAg
ICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIHN1YihwYXR0ZXJuLCBy
ZXBsYWNlbWVudCwgY291bnQpIHsKKyAgICByZXBsYWNlbWVudCA9IHByZXBhcmVSZXBsYWNlbWVu
dChyZXBsYWNlbWVudCk7CisgICAgY291bnQgPSBPYmplY3QuaXNVbmRlZmluZWQoY291bnQpID8g
MSA6IGNvdW50OworCisgICAgcmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLCBmdW5jdGlvbihtYXRj
aCkgeworICAgICAgaWYgKC0tY291bnQgPCAwKSByZXR1cm4gbWF0Y2hbMF07CisgICAgICByZXR1
cm4gcmVwbGFjZW1lbnQobWF0Y2gpOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gc2Nhbihw
YXR0ZXJuLCBpdGVyYXRvcikgeworICAgIHRoaXMuZ3N1YihwYXR0ZXJuLCBpdGVyYXRvcik7Cisg
ICAgcmV0dXJuIFN0cmluZyh0aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRydW5jYXRlKGxlbmd0
aCwgdHJ1bmNhdGlvbikgeworICAgIGxlbmd0aCA9IGxlbmd0aCB8fCAzMDsKKyAgICB0cnVuY2F0
aW9uID0gT2JqZWN0LmlzVW5kZWZpbmVkKHRydW5jYXRpb24pID8gJy4uLicgOiB0cnVuY2F0aW9u
OworICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGxlbmd0aCA/CisgICAgICB0aGlzLnNsaWNlKDAs
IGxlbmd0aCAtIHRydW5jYXRpb24ubGVuZ3RoKSArIHRydW5jYXRpb24gOiBTdHJpbmcodGhpcyk7
CisgIH0KKworICBmdW5jdGlvbiBzdHJpcCgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9e
XHMrLywgJycpLnJlcGxhY2UoL1xzKyQvLCAnJyk7CisgIH0KKworICBmdW5jdGlvbiBzdHJpcFRh
Z3MoKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFx3KyhccysoIlteIl0qInwnW14nXSon
fFtePl0pKyk/Pnw8XC9cdys+L2dpLCAnJyk7CisgIH0KKworICBmdW5jdGlvbiBzdHJpcFNjcmlw
dHMoKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3Jp
cHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7CisgIH0KKworICBmdW5jdGlvbiBleHRyYWN0U2NyaXB0
cygpIHsKKyAgICB2YXIgbWF0Y2hBbGwgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFn
bWVudCwgJ2ltZycpOworICAgIHZhciBtYXRjaE9uZSA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNj
cmlwdEZyYWdtZW50LCAnaW0nKTsKKyAgICByZXR1cm4gKHRoaXMubWF0Y2gobWF0Y2hBbGwpIHx8
IFtdKS5tYXAoZnVuY3Rpb24oc2NyaXB0VGFnKSB7CisgICAgICByZXR1cm4gKHNjcmlwdFRhZy5t
YXRjaChtYXRjaE9uZSkgfHwgWycnLCAnJ10pWzFdOworICAgIH0pOworICB9CisKKyAgZnVuY3Rp
b24gZXZhbFNjcmlwdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNjcmlwdHMoKS5tYXAo
ZnVuY3Rpb24oc2NyaXB0KSB7IHJldHVybiBldmFsKHNjcmlwdCkgfSk7CisgIH0KKworICBmdW5j
dGlvbiBlc2NhcGVIVE1MKCkgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLyYvZywnJmFtcDsn
KS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNlKC8+L2csJyZndDsnKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHVuZXNjYXBlSFRNTCgpIHsKKyAgICByZXR1cm4gdGhpcy5zdHJpcFRhZ3MoKS5yZXBs
YWNlKC8mbHQ7L2csJzwnKS5yZXBsYWNlKC8mZ3Q7L2csJz4nKS5yZXBsYWNlKC8mYW1wOy9nLCcm
Jyk7CisgIH0KKworCisgIGZ1bmN0aW9uIHRvUXVlcnlQYXJhbXMoc2VwYXJhdG9yKSB7CisgICAg
dmFyIG1hdGNoID0gdGhpcy5zdHJpcCgpLm1hdGNoKC8oW14/I10qKSgjLiopPyQvKTsKKyAgICBp
ZiAoIW1hdGNoKSByZXR1cm4geyB9OworCisgICAgcmV0dXJuIG1hdGNoWzFdLnNwbGl0KHNlcGFy
YXRvciB8fCAnJicpLmluamVjdCh7IH0sIGZ1bmN0aW9uKGhhc2gsIHBhaXIpIHsKKyAgICAgIGlm
ICgocGFpciA9IHBhaXIuc3BsaXQoJz0nKSlbMF0pIHsKKyAgICAgICAgdmFyIGtleSA9IGRlY29k
ZVVSSUNvbXBvbmVudChwYWlyLnNoaWZ0KCkpOworICAgICAgICB2YXIgdmFsdWUgPSBwYWlyLmxl
bmd0aCA+IDEgPyBwYWlyLmpvaW4oJz0nKSA6IHBhaXJbMF07CisgICAgICAgIGlmICh2YWx1ZSAh
PSB1bmRlZmluZWQpIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKworICAgICAg
ICBpZiAoa2V5IGluIGhhc2gpIHsKKyAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KGhhc2hb
a2V5XSkpIGhhc2hba2V5XSA9IFtoYXNoW2tleV1dOworICAgICAgICAgIGhhc2hba2V5XS5wdXNo
KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGhhc2hba2V5XSA9IHZhbHVlOworICAg
ICAgfQorICAgICAgcmV0dXJuIGhhc2g7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiB0b0Fy
cmF5KCkgeworICAgIHJldHVybiB0aGlzLnNwbGl0KCcnKTsKKyAgfQorCisgIGZ1bmN0aW9uIHN1
Y2MoKSB7CisgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArCisgICAg
ICBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aCAtIDEpICsg
MSk7CisgIH0KKworICBmdW5jdGlvbiB0aW1lcyhjb3VudCkgeworICAgIHJldHVybiBjb3VudCA8
IDEgPyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4odGhpcyk7CisgIH0KKworICBmdW5j
dGlvbiBjYW1lbGl6ZSgpIHsKKyAgICB2YXIgcGFydHMgPSB0aGlzLnNwbGl0KCctJyksIGxlbiA9
IHBhcnRzLmxlbmd0aDsKKyAgICBpZiAobGVuID09IDEpIHJldHVybiBwYXJ0c1swXTsKKworICAg
IHZhciBjYW1lbGl6ZWQgPSB0aGlzLmNoYXJBdCgwKSA9PSAnLScKKyAgICAgID8gcGFydHNbMF0u
Y2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1swXS5zdWJzdHJpbmcoMSkKKyAgICAgIDog
cGFydHNbMF07CisKKyAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKQorICAgICAgY2Ft
ZWxpemVkICs9IHBhcnRzW2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydHNbaV0uc3Vi
c3RyaW5nKDEpOworCisgICAgcmV0dXJuIGNhbWVsaXplZDsKKyAgfQorCisgIGZ1bmN0aW9uIGNh
cGl0YWxpemUoKSB7CisgICAgcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0
aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOworICB9CisKKyAgZnVuY3Rpb24gdW5kZXJz
Y29yZSgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC86Oi9nLCAnLycpCisgICAgICAgICAg
ICAgICAucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywgJyQxXyQyJykKKyAgICAgICAg
ICAgICAgIC5yZXBsYWNlKC8oW2EtelxkXSkoW0EtWl0pL2csICckMV8kMicpCisgICAgICAgICAg
ICAgICAucmVwbGFjZSgvLS9nLCAnXycpCisgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTsK
KyAgfQorCisgIGZ1bmN0aW9uIGRhc2hlcml6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNl
KC9fL2csICctJyk7CisgIH0KKworICBmdW5jdGlvbiBpbnNwZWN0KHVzZURvdWJsZVF1b3Rlcykg
eworICAgIHZhciBlc2NhcGVkU3RyaW5nID0gdGhpcy5yZXBsYWNlKC9bXHgwMC1ceDFmXFxdL2cs
IGZ1bmN0aW9uKGNoYXJhY3RlcikgeworICAgICAgaWYgKGNoYXJhY3RlciBpbiBTdHJpbmcuc3Bl
Y2lhbENoYXIpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5zcGVjaWFsQ2hhcltjaGFyYWN0ZXJd
OworICAgICAgfQorICAgICAgcmV0dXJuICdcXHUwMCcgKyBjaGFyYWN0ZXIuY2hhckNvZGVBdCgp
LnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgICB9KTsKKyAgICBpZiAodXNlRG91YmxlUXVvdGVz
KSByZXR1cm4gJyInICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsK
KyAgICByZXR1cm4gIiciICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8nL2csICdcXFwnJykgKyAi
JyI7CisgIH0KKworICBmdW5jdGlvbiB0b0pTT04oKSB7CisgICAgcmV0dXJuIHRoaXMuaW5zcGVj
dCh0cnVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVuZmlsdGVySlNPTihmaWx0ZXIpIHsKKyAgICBy
ZXR1cm4gdGhpcy5yZXBsYWNlKGZpbHRlciB8fCBQcm90b3R5cGUuSlNPTkZpbHRlciwgJyQxJyk7
CisgIH0KKworICBmdW5jdGlvbiBpc0pTT04oKSB7CisgICAgdmFyIHN0ciA9IHRoaXM7CisgICAg
aWYgKHN0ci5ibGFuaygpKSByZXR1cm4gZmFsc2U7CisgICAgc3RyID0gdGhpcy5yZXBsYWNlKC9c
XC4vZywgJ0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoiL2csICcnKTsKKyAgICByZXR1cm4gKC9e
Wyw6e31cW1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRdKiQvKS50ZXN0KHN0cik7CisgIH0KKwor
ICBmdW5jdGlvbiBldmFsSlNPTihzYW5pdGl6ZSkgeworICAgIHZhciBqc29uID0gdGhpcy51bmZp
bHRlckpTT04oKTsKKyAgICB0cnkgeworICAgICAgaWYgKCFzYW5pdGl6ZSB8fCBqc29uLmlzSlNP
TigpKSByZXR1cm4gZXZhbCgnKCcgKyBqc29uICsgJyknKTsKKyAgICB9IGNhdGNoIChlKSB7IH0K
KyAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0JhZGx5IGZvcm1lZCBKU09OIHN0cmluZzogJyAr
IHRoaXMuaW5zcGVjdCgpKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluY2x1ZGUocGF0dGVybikgewor
ICAgIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikgPiAtMTsKKyAgfQorCisgIGZ1bmN0aW9u
IHN0YXJ0c1dpdGgocGF0dGVybikgeworICAgIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikg
PT09IDA7CisgIH0KKworICBmdW5jdGlvbiBlbmRzV2l0aChwYXR0ZXJuKSB7CisgICAgdmFyIGQg
PSB0aGlzLmxlbmd0aCAtIHBhdHRlcm4ubGVuZ3RoOworICAgIHJldHVybiBkID49IDAgJiYgdGhp
cy5sYXN0SW5kZXhPZihwYXR0ZXJuKSA9PT0gZDsKKyAgfQorCisgIGZ1bmN0aW9uIGVtcHR5KCkg
eworICAgIHJldHVybiB0aGlzID09ICcnOworICB9CisKKyAgZnVuY3Rpb24gYmxhbmsoKSB7Cisg
ICAgcmV0dXJuIC9eXHMqJC8udGVzdCh0aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGludGVycG9s
YXRlKG9iamVjdCwgcGF0dGVybikgeworICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcywgcGF0
dGVybikuZXZhbHVhdGUob2JqZWN0KTsKKyAgfQorCisgIHJldHVybiB7CisgICAgZ3N1YjogICAg
ICAgICAgIGdzdWIsCisgICAgc3ViOiAgICAgICAgICAgIHN1YiwKKyAgICBzY2FuOiAgICAgICAg
ICAgc2NhbiwKKyAgICB0cnVuY2F0ZTogICAgICAgdHJ1bmNhdGUsCisgICAgc3RyaXA6ICAgICAg
ICAgIFN0cmluZy5wcm90b3R5cGUudHJpbSA/IFN0cmluZy5wcm90b3R5cGUudHJpbSA6IHN0cmlw
LAorICAgIHN0cmlwVGFnczogICAgICBzdHJpcFRhZ3MsCisgICAgc3RyaXBTY3JpcHRzOiAgIHN0
cmlwU2NyaXB0cywKKyAgICBleHRyYWN0U2NyaXB0czogZXh0cmFjdFNjcmlwdHMsCisgICAgZXZh
bFNjcmlwdHM6ICAgIGV2YWxTY3JpcHRzLAorICAgIGVzY2FwZUhUTUw6ICAgICBlc2NhcGVIVE1M
LAorICAgIHVuZXNjYXBlSFRNTDogICB1bmVzY2FwZUhUTUwsCisgICAgdG9RdWVyeVBhcmFtczog
IHRvUXVlcnlQYXJhbXMsCisgICAgcGFyc2VRdWVyeTogICAgIHRvUXVlcnlQYXJhbXMsCisgICAg
dG9BcnJheTogICAgICAgIHRvQXJyYXksCisgICAgc3VjYzogICAgICAgICAgIHN1Y2MsCisgICAg
dGltZXM6ICAgICAgICAgIHRpbWVzLAorICAgIGNhbWVsaXplOiAgICAgICBjYW1lbGl6ZSwKKyAg
ICBjYXBpdGFsaXplOiAgICAgY2FwaXRhbGl6ZSwKKyAgICB1bmRlcnNjb3JlOiAgICAgdW5kZXJz
Y29yZSwKKyAgICBkYXNoZXJpemU6ICAgICAgZGFzaGVyaXplLAorICAgIGluc3BlY3Q6ICAgICAg
ICBpbnNwZWN0LAorICAgIHRvSlNPTjogICAgICAgICB0b0pTT04sCisgICAgdW5maWx0ZXJKU09O
OiAgIHVuZmlsdGVySlNPTiwKKyAgICBpc0pTT046ICAgICAgICAgaXNKU09OLAorICAgIGV2YWxK
U09OOiAgICAgICBldmFsSlNPTiwKKyAgICBpbmNsdWRlOiAgICAgICAgaW5jbHVkZSwKKyAgICBz
dGFydHNXaXRoOiAgICAgc3RhcnRzV2l0aCwKKyAgICBlbmRzV2l0aDogICAgICAgZW5kc1dpdGgs
CisgICAgZW1wdHk6ICAgICAgICAgIGVtcHR5LAorICAgIGJsYW5rOiAgICAgICAgICBibGFuaywK
KyAgICBpbnRlcnBvbGF0ZTogICAgaW50ZXJwb2xhdGUKKyAgfTsKK30pKCkpOworCit2YXIgVGVt
cGxhdGUgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbih0ZW1wbGF0ZSwg
cGF0dGVybikgeworICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS50b1N0cmluZygpOworICAg
IHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgVGVtcGxhdGUuUGF0dGVybjsKKyAgfSwKKworICBl
dmFsdWF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgaWYgKG9iamVjdCAmJiBPYmplY3QuaXNG
dW5jdGlvbihvYmplY3QudG9UZW1wbGF0ZVJlcGxhY2VtZW50cykpCisgICAgICBvYmplY3QgPSBv
YmplY3QudG9UZW1wbGF0ZVJlcGxhY2VtZW50cygpOworCisgICAgcmV0dXJuIHRoaXMudGVtcGxh
dGUuZ3N1Yih0aGlzLnBhdHRlcm4sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBpZiAob2JqZWN0
ID09IG51bGwpIHJldHVybiAobWF0Y2hbMV0gKyAnJyk7CisKKyAgICAgIHZhciBiZWZvcmUgPSBt
YXRjaFsxXSB8fCAnJzsKKyAgICAgIGlmIChiZWZvcmUgPT0gJ1xcJykgcmV0dXJuIG1hdGNoWzJd
OworCisgICAgICB2YXIgY3R4ID0gb2JqZWN0LCBleHByID0gbWF0Y2hbM107CisgICAgICB2YXIg
cGF0dGVybiA9IC9eKFteLltdK3xcWygoPzouKj9bXlxcXSk/KVxdKShcLnxcW3wkKS87CisgICAg
ICBtYXRjaCA9IHBhdHRlcm4uZXhlYyhleHByKTsKKyAgICAgIGlmIChtYXRjaCA9PSBudWxsKSBy
ZXR1cm4gYmVmb3JlOworCisgICAgICB3aGlsZSAobWF0Y2ggIT0gbnVsbCkgeworICAgICAgICB2
YXIgY29tcCA9IG1hdGNoWzFdLnN0YXJ0c1dpdGgoJ1snKSA/IG1hdGNoWzJdLnJlcGxhY2UoL1xc
XFxdL2csICddJykgOiBtYXRjaFsxXTsKKyAgICAgICAgY3R4ID0gY3R4W2NvbXBdOworICAgICAg
ICBpZiAobnVsbCA9PSBjdHggfHwgJycgPT0gbWF0Y2hbM10pIGJyZWFrOworICAgICAgICBleHBy
ID0gZXhwci5zdWJzdHJpbmcoJ1snID09IG1hdGNoWzNdID8gbWF0Y2hbMV0ubGVuZ3RoIDogbWF0
Y2hbMF0ubGVuZ3RoKTsKKyAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7CisgICAg
ICB9CisKKyAgICAgIHJldHVybiBiZWZvcmUgKyBTdHJpbmcuaW50ZXJwcmV0KGN0eCk7CisgICAg
fSk7CisgIH0KK30pOworVGVtcGxhdGUuUGF0dGVybiA9IC8oXnwufFxyfFxuKSgjXHsoLio/KVx9
KS87CisKK3ZhciAkYnJlYWsgPSB7IH07CisKK3ZhciBFbnVtZXJhYmxlID0gKGZ1bmN0aW9uKCkg
eworICBmdW5jdGlvbiBlYWNoKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIGluZGV4ID0g
MDsKKyAgICB0cnkgeworICAgICAgdGhpcy5fZWFjaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAg
ICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCsrKTsKKyAgICAgIH0pOworICAg
IH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlICE9ICRicmVhaykgdGhyb3cgZTsKKyAgICB9Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBmdW5jdGlvbiBlYWNoU2xpY2UobnVtYmVyLCBpdGVy
YXRvciwgY29udGV4dCkgeworICAgIHZhciBpbmRleCA9IC1udW1iZXIsIHNsaWNlcyA9IFtdLCBh
cnJheSA9IHRoaXMudG9BcnJheSgpOworICAgIGlmIChudW1iZXIgPCAxKSByZXR1cm4gYXJyYXk7
CisgICAgd2hpbGUgKChpbmRleCArPSBudW1iZXIpIDwgYXJyYXkubGVuZ3RoKQorICAgICAgc2xp
Y2VzLnB1c2goYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4K251bWJlcikpOworICAgIHJldHVybiBz
bGljZXMuY29sbGVjdChpdGVyYXRvciwgY29udGV4dCk7CisgIH0KKworICBmdW5jdGlvbiBhbGwo
aXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlw
ZS5LOworICAgIHZhciByZXN1bHQgPSB0cnVlOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1
ZSwgaW5kZXgpIHsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiAhIWl0ZXJhdG9yLmNhbGwoY29u
dGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAgIGlmICghcmVzdWx0KSB0aHJvdyAkYnJlYWs7Cisg
ICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGFueShpdGVyYXRv
ciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7Cisg
ICAgdmFyIHJlc3VsdCA9IGZhbHNlOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5k
ZXgpIHsKKyAgICAgIGlmIChyZXN1bHQgPSAhIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUs
IGluZGV4KSkKKyAgICAgICAgdGhyb3cgJGJyZWFrOworICAgIH0pOworICAgIHJldHVybiByZXN1
bHQ7CisgIH0KKworICBmdW5jdGlvbiBjb2xsZWN0KGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAg
aXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0cyA9IFtd
OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJlc3VsdHMu
cHVzaChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOworICAgIH0pOworICAg
IHJldHVybiByZXN1bHRzOworICB9CisKKyAgZnVuY3Rpb24gZGV0ZWN0KGl0ZXJhdG9yLCBjb250
ZXh0KSB7CisgICAgdmFyIHJlc3VsdDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGlu
ZGV4KSB7CisgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKSB7
CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgICB9
CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRBbGwo
aXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFj
aChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRl
eHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7
CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICBmdW5jdGlvbiBncmVwKGZpbHRlciwgaXRl
cmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5L
OworICAgIHZhciByZXN1bHRzID0gW107CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGZpbHRl
cikpCisgICAgICBmaWx0ZXIgPSBuZXcgUmVnRXhwKFJlZ0V4cC5lc2NhcGUoZmlsdGVyKSk7CisK
KyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoZmlsdGVy
Lm1hdGNoKHZhbHVlKSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4
dCwgdmFsdWUsIGluZGV4KSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKwor
ICBmdW5jdGlvbiBpbmNsdWRlKG9iamVjdCkgeworICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbih0
aGlzLmluZGV4T2YpKQorICAgICAgaWYgKHRoaXMuaW5kZXhPZihvYmplY3QpICE9IC0xKSByZXR1
cm4gdHJ1ZTsKKworICAgIHZhciBmb3VuZCA9IGZhbHNlOworICAgIHRoaXMuZWFjaChmdW5jdGlv
bih2YWx1ZSkgeworICAgICAgaWYgKHZhbHVlID09IG9iamVjdCkgeworICAgICAgICBmb3VuZCA9
IHRydWU7CisgICAgICAgIHRocm93ICRicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1
cm4gZm91bmQ7CisgIH0KKworICBmdW5jdGlvbiBpbkdyb3Vwc09mKG51bWJlciwgZmlsbFdpdGgp
IHsKKyAgICBmaWxsV2l0aCA9IE9iamVjdC5pc1VuZGVmaW5lZChmaWxsV2l0aCkgPyBudWxsIDog
ZmlsbFdpdGg7CisgICAgcmV0dXJuIHRoaXMuZWFjaFNsaWNlKG51bWJlciwgZnVuY3Rpb24oc2xp
Y2UpIHsKKyAgICAgIHdoaWxlKHNsaWNlLmxlbmd0aCA8IG51bWJlcikgc2xpY2UucHVzaChmaWxs
V2l0aCk7CisgICAgICByZXR1cm4gc2xpY2U7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBp
bmplY3QobWVtbywgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUsIGluZGV4KSB7CisgICAgICBtZW1vID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCBtZW1v
LCB2YWx1ZSwgaW5kZXgpOworICAgIH0pOworICAgIHJldHVybiBtZW1vOworICB9CisKKyAgZnVu
Y3Rpb24gaW52b2tlKG1ldGhvZCkgeworICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKS5zbGlj
ZSgxKTsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVy
biB2YWx1ZVttZXRob2RdLmFwcGx5KHZhbHVlLCBhcmdzKTsKKyAgICB9KTsKKyAgfQorCisgIGZ1
bmN0aW9uIG1heChpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3Ig
fHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUsIGluZGV4KSB7CisgICAgICB2YWx1ZSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFs
dWUsIGluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCB2YWx1ZSA+PSByZXN1bHQp
CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7Cisg
IH0KKworICBmdW5jdGlvbiBtaW4oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9
IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNo
KGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNv
bnRleHQsIHZhbHVlLCBpbmRleCk7CisgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUg
PCByZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiBy
ZXN1bHQ7CisgIH0KKworICBmdW5jdGlvbiBwYXJ0aXRpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsK
KyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciB0cnVlcyA9
IFtdLCBmYWxzZXMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7
CisgICAgICAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpID8KKyAgICAgICAg
dHJ1ZXMgOiBmYWxzZXMpLnB1c2godmFsdWUpOworICAgIH0pOworICAgIHJldHVybiBbdHJ1ZXMs
IGZhbHNlc107CisgIH0KKworICBmdW5jdGlvbiBwbHVjayhwcm9wZXJ0eSkgeworICAgIHZhciBy
ZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXN1
bHRzLnB1c2godmFsdWVbcHJvcGVydHldKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgfQorCisgIGZ1bmN0aW9uIHJlamVjdChpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciBy
ZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAg
ICAgaWYgKCFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJl
c3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKwor
ICBmdW5jdGlvbiBzb3J0QnkoaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICByZXR1cm4gdGhpcy5t
YXAoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1
ZTogdmFsdWUsCisgICAgICAgIGNyaXRlcmlhOiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVl
LCBpbmRleCkKKyAgICAgIH07CisgICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkgewor
ICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CisgICAgICBy
ZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7CisgICAgfSkucGx1Y2soJ3ZhbHVlJyk7
CisgIH0KKworICBmdW5jdGlvbiB0b0FycmF5KCkgeworICAgIHJldHVybiB0aGlzLm1hcCgpOwor
ICB9CisKKyAgZnVuY3Rpb24gemlwKCkgeworICAgIHZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5L
LCBhcmdzID0gJEEoYXJndW1lbnRzKTsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oYXJncy5s
YXN0KCkpKQorICAgICAgaXRlcmF0b3IgPSBhcmdzLnBvcCgpOworCisgICAgdmFyIGNvbGxlY3Rp
b25zID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOworICAgIHJldHVybiB0aGlzLm1hcChm
dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihjb2xsZWN0aW9u
cy5wbHVjayhpbmRleCkpOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gc2l6ZSgpIHsKKyAg
ICByZXR1cm4gdGhpcy50b0FycmF5KCkubGVuZ3RoOworICB9CisKKyAgZnVuY3Rpb24gaW5zcGVj
dCgpIHsKKyAgICByZXR1cm4gJyM8RW51bWVyYWJsZTonICsgdGhpcy50b0FycmF5KCkuaW5zcGVj
dCgpICsgJz4nOworICB9CisKKworCisKKworCisKKworCisgIHJldHVybiB7CisgICAgZWFjaDog
ICAgICAgZWFjaCwKKyAgICBlYWNoU2xpY2U6ICBlYWNoU2xpY2UsCisgICAgYWxsOiAgICAgICAg
YWxsLAorICAgIGV2ZXJ5OiAgICAgIGFsbCwKKyAgICBhbnk6ICAgICAgICBhbnksCisgICAgc29t
ZTogICAgICAgYW55LAorICAgIGNvbGxlY3Q6ICAgIGNvbGxlY3QsCisgICAgbWFwOiAgICAgICAg
Y29sbGVjdCwKKyAgICBkZXRlY3Q6ICAgICBkZXRlY3QsCisgICAgZmluZEFsbDogICAgZmluZEFs
bCwKKyAgICBzZWxlY3Q6ICAgICBmaW5kQWxsLAorICAgIGZpbHRlcjogICAgIGZpbmRBbGwsCisg
ICAgZ3JlcDogICAgICAgZ3JlcCwKKyAgICBpbmNsdWRlOiAgICBpbmNsdWRlLAorICAgIG1lbWJl
cjogICAgIGluY2x1ZGUsCisgICAgaW5Hcm91cHNPZjogaW5Hcm91cHNPZiwKKyAgICBpbmplY3Q6
ICAgICBpbmplY3QsCisgICAgaW52b2tlOiAgICAgaW52b2tlLAorICAgIG1heDogICAgICAgIG1h
eCwKKyAgICBtaW46ICAgICAgICBtaW4sCisgICAgcGFydGl0aW9uOiAgcGFydGl0aW9uLAorICAg
IHBsdWNrOiAgICAgIHBsdWNrLAorICAgIHJlamVjdDogICAgIHJlamVjdCwKKyAgICBzb3J0Qnk6
ICAgICBzb3J0QnksCisgICAgdG9BcnJheTogICAgdG9BcnJheSwKKyAgICBlbnRyaWVzOiAgICB0
b0FycmF5LAorICAgIHppcDogICAgICAgIHppcCwKKyAgICBzaXplOiAgICAgICBzaXplLAorICAg
IGluc3BlY3Q6ICAgIGluc3BlY3QsCisgICAgZmluZDogICAgICAgZGV0ZWN0CisgIH07Cit9KSgp
OworZnVuY3Rpb24gJEEoaXRlcmFibGUpIHsKKyAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOwor
ICBpZiAoJ3RvQXJyYXknIGluIE9iamVjdChpdGVyYWJsZSkpIHJldHVybiBpdGVyYWJsZS50b0Fy
cmF5KCk7CisgIHZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9IG5l
dyBBcnJheShsZW5ndGgpOworICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0
ZXJhYmxlW2xlbmd0aF07CisgIHJldHVybiByZXN1bHRzOworfQorCitmdW5jdGlvbiAkdyhzdHJp
bmcpIHsKKyAgaWYgKCFPYmplY3QuaXNTdHJpbmcoc3RyaW5nKSkgcmV0dXJuIFtdOworICBzdHJp
bmcgPSBzdHJpbmcuc3RyaXAoKTsKKyAgcmV0dXJuIHN0cmluZyA/IHN0cmluZy5zcGxpdCgvXHMr
LykgOiBbXTsKK30KKworQXJyYXkuZnJvbSA9ICRBOworCisKKyhmdW5jdGlvbigpIHsKKyAgdmFy
IGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsCisgICAgICBzbGljZSA9IGFycmF5UHJvdG8u
c2xpY2UsCisgICAgICBfZWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDsgLy8gdXNlIG5hdGl2ZSBi
cm93c2VyIEpTIDEuNiBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUKKworICBmdW5jdGlvbiBl
YWNoKGl0ZXJhdG9yKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBpdGVyYXRvcih0aGlzW2ldKTsKKyAgfQorICBpZiAo
IV9lYWNoKSBfZWFjaCA9IGVhY2g7CisKKyAgZnVuY3Rpb24gY2xlYXIoKSB7CisgICAgdGhpcy5s
ZW5ndGggPSAwOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZnVuY3Rpb24gZmlyc3QoKSB7
CisgICAgcmV0dXJuIHRoaXNbMF07CisgIH0KKworICBmdW5jdGlvbiBsYXN0KCkgeworICAgIHJl
dHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV07CisgIH0KKworICBmdW5jdGlvbiBjb21wYWN0KCkg
eworICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJu
IHZhbHVlICE9IG51bGw7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBmbGF0dGVuKCkgewor
ICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7CisgICAg
ICBpZiAoT2JqZWN0LmlzQXJyYXkodmFsdWUpKQorICAgICAgICByZXR1cm4gYXJyYXkuY29uY2F0
KHZhbHVlLmZsYXR0ZW4oKSk7CisgICAgICBhcnJheS5wdXNoKHZhbHVlKTsKKyAgICAgIHJldHVy
biBhcnJheTsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHdpdGhvdXQoKSB7CisgICAgdmFy
IHZhbHVlcyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gdGhpcy5zZWxl
Y3QoZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiAhdmFsdWVzLmluY2x1ZGUodmFsdWUp
OworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gcmV2ZXJzZShpbmxpbmUpIHsKKyAgICByZXR1
cm4gKGlubGluZSAhPT0gZmFsc2UgPyB0aGlzIDogdGhpcy50b0FycmF5KCkpLl9yZXZlcnNlKCk7
CisgIH0KKworICBmdW5jdGlvbiB1bmlxKHNvcnRlZCkgeworICAgIHJldHVybiB0aGlzLmluamVj
dChbXSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKDAgPT0gaW5k
ZXggfHwgKHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1ZSA6ICFhcnJheS5pbmNsdWRlKHZh
bHVlKSkpCisgICAgICAgIGFycmF5LnB1c2godmFsdWUpOworICAgICAgcmV0dXJuIGFycmF5Owor
ICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gaW50ZXJzZWN0KGFycmF5KSB7CisgICAgcmV0dXJu
IHRoaXMudW5pcSgpLmZpbmRBbGwoZnVuY3Rpb24oaXRlbSkgeworICAgICAgcmV0dXJuIGFycmF5
LmRldGVjdChmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXRlbSA9PT0gdmFsdWUgfSk7CisgICAg
fSk7CisgIH0KKworCisgIGZ1bmN0aW9uIGNsb25lKCkgeworICAgIHJldHVybiBzbGljZS5jYWxs
KHRoaXMsIDApOworICB9CisKKyAgZnVuY3Rpb24gc2l6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5s
ZW5ndGg7CisgIH0KKworICBmdW5jdGlvbiBpbnNwZWN0KCkgeworICAgIHJldHVybiAnWycgKyB0
aGlzLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbignLCAnKSArICddJzsKKyAgfQorCisgIGZ1bmN0
aW9uIHRvSlNPTigpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5j
dGlvbihvYmplY3QpIHsKKyAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50b0pTT04ob2JqZWN0KTsK
KyAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmVzdWx0cy5wdXNoKHZhbHVl
KTsKKyAgICB9KTsKKyAgICByZXR1cm4gJ1snICsgcmVzdWx0cy5qb2luKCcsICcpICsgJ10nOwor
ICB9CisKKyAgZnVuY3Rpb24gaW5kZXhPZihpdGVtLCBpKSB7CisgICAgaSB8fCAoaSA9IDApOwor
ICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDsKKyAgICBpZiAoaSA8IDApIGkgPSBsZW5ndGgg
KyBpOworICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBpZiAodGhpc1tpXSA9PT0g
aXRlbSkgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZnVuY3Rpb24gbGFzdElu
ZGV4T2YoaXRlbSwgaSkgeworICAgIGkgPSBpc05hTihpKSA/IHRoaXMubGVuZ3RoIDogKGkgPCAw
ID8gdGhpcy5sZW5ndGggKyBpIDogaSkgKyAxOworICAgIHZhciBuID0gdGhpcy5zbGljZSgwLCBp
KS5yZXZlcnNlKCkuaW5kZXhPZihpdGVtKTsKKyAgICByZXR1cm4gKG4gPCAwKSA/IG4gOiBpIC0g
biAtIDE7CisgIH0KKworICBmdW5jdGlvbiBjb25jYXQoKSB7CisgICAgdmFyIGFycmF5ID0gc2xp
Y2UuY2FsbCh0aGlzLCAwKSwgaXRlbTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJn
dW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBpdGVtID0gYXJndW1lbnRz
W2ldOworICAgICAgaWYgKE9iamVjdC5pc0FycmF5KGl0ZW0pICYmICEoJ2NhbGxlZScgaW4gaXRl
bSkpIHsKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGFycmF5TGVuZ3RoID0gaXRlbS5sZW5ndGg7
IGogPCBhcnJheUxlbmd0aDsgaisrKQorICAgICAgICAgIGFycmF5LnB1c2goaXRlbVtqXSk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBhcnJheS5wdXNoKGl0ZW0pOworICAgICAgfQorICAgIH0K
KyAgICByZXR1cm4gYXJyYXk7CisgIH0KKworICBPYmplY3QuZXh0ZW5kKGFycmF5UHJvdG8sIEVu
dW1lcmFibGUpOworCisgIGlmICghYXJyYXlQcm90by5fcmV2ZXJzZSkKKyAgICBhcnJheVByb3Rv
Ll9yZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlOworCisgIE9iamVjdC5leHRlbmQoYXJyYXlQ
cm90bywgeworICAgIF9lYWNoOiAgICAgX2VhY2gsCisgICAgY2xlYXI6ICAgICBjbGVhciwKKyAg
ICBmaXJzdDogICAgIGZpcnN0LAorICAgIGxhc3Q6ICAgICAgbGFzdCwKKyAgICBjb21wYWN0OiAg
IGNvbXBhY3QsCisgICAgZmxhdHRlbjogICBmbGF0dGVuLAorICAgIHdpdGhvdXQ6ICAgd2l0aG91
dCwKKyAgICByZXZlcnNlOiAgIHJldmVyc2UsCisgICAgdW5pcTogICAgICB1bmlxLAorICAgIGlu
dGVyc2VjdDogaW50ZXJzZWN0LAorICAgIGNsb25lOiAgICAgY2xvbmUsCisgICAgdG9BcnJheTog
ICBjbG9uZSwKKyAgICBzaXplOiAgICAgIHNpemUsCisgICAgaW5zcGVjdDogICBpbnNwZWN0LAor
ICAgIHRvSlNPTjogICAgdG9KU09OCisgIH0pOworCisgIHZhciBDT05DQVRfQVJHVU1FTlRTX0JV
R0dZID0gKGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBbXS5jb25jYXQoYXJndW1lbnRzKVswXVsw
XSAhPT0gMTsKKyAgfSkoMSwyKQorCisgIGlmIChDT05DQVRfQVJHVU1FTlRTX0JVR0dZKSBhcnJh
eVByb3RvLmNvbmNhdCA9IGNvbmNhdDsKKworICBpZiAoIWFycmF5UHJvdG8uaW5kZXhPZikgYXJy
YXlQcm90by5pbmRleE9mID0gaW5kZXhPZjsKKyAgaWYgKCFhcnJheVByb3RvLmxhc3RJbmRleE9m
KSBhcnJheVByb3RvLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7Cit9KSgpOworZnVuY3Rpb24g
JEgob2JqZWN0KSB7CisgIHJldHVybiBuZXcgSGFzaChvYmplY3QpOworfTsKKwordmFyIEhhc2gg
PSBDbGFzcy5jcmVhdGUoRW51bWVyYWJsZSwgKGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBpbml0
aWFsaXplKG9iamVjdCkgeworICAgIHRoaXMuX29iamVjdCA9IE9iamVjdC5pc0hhc2gob2JqZWN0
KSA/IG9iamVjdC50b09iamVjdCgpIDogT2JqZWN0LmNsb25lKG9iamVjdCk7CisgIH0KKworICBm
dW5jdGlvbiBfZWFjaChpdGVyYXRvcikgeworICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9vYmpl
Y3QpIHsKKyAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldLCBwYWlyID0gW2tleSwg
dmFsdWVdOworICAgICAgcGFpci5rZXkgPSBrZXk7CisgICAgICBwYWlyLnZhbHVlID0gdmFsdWU7
CisgICAgICBpdGVyYXRvcihwYWlyKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBzZXQoa2V5
LCB2YWx1ZSkgeworICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XSA9IHZhbHVlOworICB9CisK
KyAgZnVuY3Rpb24gZ2V0KGtleSkgeworICAgIGlmICh0aGlzLl9vYmplY3Rba2V5XSAhPT0gT2Jq
ZWN0LnByb3RvdHlwZVtrZXldKQorICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXldOworICB9
CisKKyAgZnVuY3Rpb24gdW5zZXQoa2V5KSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5fb2JqZWN0
W2tleV07CisgICAgZGVsZXRlIHRoaXMuX29iamVjdFtrZXldOworICAgIHJldHVybiB2YWx1ZTsK
KyAgfQorCisgIGZ1bmN0aW9uIHRvT2JqZWN0KCkgeworICAgIHJldHVybiBPYmplY3QuY2xvbmUo
dGhpcy5fb2JqZWN0KTsKKyAgfQorCisgIGZ1bmN0aW9uIGtleXMoKSB7CisgICAgcmV0dXJuIHRo
aXMucGx1Y2soJ2tleScpOworICB9CisKKyAgZnVuY3Rpb24gdmFsdWVzKCkgeworICAgIHJldHVy
biB0aGlzLnBsdWNrKCd2YWx1ZScpOworICB9CisKKyAgZnVuY3Rpb24gaW5kZXgodmFsdWUpIHsK
KyAgICB2YXIgbWF0Y2ggPSB0aGlzLmRldGVjdChmdW5jdGlvbihwYWlyKSB7CisgICAgICByZXR1
cm4gcGFpci52YWx1ZSA9PT0gdmFsdWU7CisgICAgfSk7CisgICAgcmV0dXJuIG1hdGNoICYmIG1h
dGNoLmtleTsKKyAgfQorCisgIGZ1bmN0aW9uIG1lcmdlKG9iamVjdCkgeworICAgIHJldHVybiB0
aGlzLmNsb25lKCkudXBkYXRlKG9iamVjdCk7CisgIH0KKworICBmdW5jdGlvbiB1cGRhdGUob2Jq
ZWN0KSB7CisgICAgcmV0dXJuIG5ldyBIYXNoKG9iamVjdCkuaW5qZWN0KHRoaXMsIGZ1bmN0aW9u
KHJlc3VsdCwgcGFpcikgeworICAgICAgcmVzdWx0LnNldChwYWlyLmtleSwgcGFpci52YWx1ZSk7
CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gdG9RdWVy
eVBhaXIoa2V5LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSBy
ZXR1cm4ga2V5OworICAgIHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3Ry
aW5nLmludGVycHJldCh2YWx1ZSkpOworICB9CisKKyAgZnVuY3Rpb24gdG9RdWVyeVN0cmluZygp
IHsKKyAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKHJlc3VsdHMsIHBhaXIpIHsK
KyAgICAgIHZhciBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQocGFpci5rZXkpLCB2YWx1ZXMgPSBw
YWlyLnZhbHVlOworCisgICAgICBpZiAodmFsdWVzICYmIHR5cGVvZiB2YWx1ZXMgPT0gJ29iamVj
dCcpIHsKKyAgICAgICAgaWYgKE9iamVjdC5pc0FycmF5KHZhbHVlcykpCisgICAgICAgICAgcmV0
dXJuIHJlc3VsdHMuY29uY2F0KHZhbHVlcy5tYXAodG9RdWVyeVBhaXIuY3Vycnkoa2V5KSkpOwor
ICAgICAgfSBlbHNlIHJlc3VsdHMucHVzaCh0b1F1ZXJ5UGFpcihrZXksIHZhbHVlcykpOworICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSkuam9pbignJicpOworICB9CisKKyAgZnVuY3Rpb24g
aW5zcGVjdCgpIHsKKyAgICByZXR1cm4gJyM8SGFzaDp7JyArIHRoaXMubWFwKGZ1bmN0aW9uKHBh
aXIpIHsKKyAgICAgIHJldHVybiBwYWlyLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbignOiAnKTsK
KyAgICB9KS5qb2luKCcsICcpICsgJ30+JzsKKyAgfQorCisgIGZ1bmN0aW9uIHRvSlNPTigpIHsK
KyAgICByZXR1cm4gT2JqZWN0LnRvSlNPTih0aGlzLnRvT2JqZWN0KCkpOworICB9CisKKyAgZnVu
Y3Rpb24gY2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyBIYXNoKHRoaXMpOworICB9CisKKyAgcmV0
dXJuIHsKKyAgICBpbml0aWFsaXplOiAgICAgICAgICAgICBpbml0aWFsaXplLAorICAgIF9lYWNo
OiAgICAgICAgICAgICAgICAgIF9lYWNoLAorICAgIHNldDogICAgICAgICAgICAgICAgICAgIHNl
dCwKKyAgICBnZXQ6ICAgICAgICAgICAgICAgICAgICBnZXQsCisgICAgdW5zZXQ6ICAgICAgICAg
ICAgICAgICAgdW5zZXQsCisgICAgdG9PYmplY3Q6ICAgICAgICAgICAgICAgdG9PYmplY3QsCisg
ICAgdG9UZW1wbGF0ZVJlcGxhY2VtZW50czogdG9PYmplY3QsCisgICAga2V5czogICAgICAgICAg
ICAgICAgICAga2V5cywKKyAgICB2YWx1ZXM6ICAgICAgICAgICAgICAgICB2YWx1ZXMsCisgICAg
aW5kZXg6ICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgbWVyZ2U6ICAgICAgICAgICAgICAg
ICAgbWVyZ2UsCisgICAgdXBkYXRlOiAgICAgICAgICAgICAgICAgdXBkYXRlLAorICAgIHRvUXVl
cnlTdHJpbmc6ICAgICAgICAgIHRvUXVlcnlTdHJpbmcsCisgICAgaW5zcGVjdDogICAgICAgICAg
ICAgICAgaW5zcGVjdCwKKyAgICB0b0pTT046ICAgICAgICAgICAgICAgICB0b0pTT04sCisgICAg
Y2xvbmU6ICAgICAgICAgICAgICAgICAgY2xvbmUKKyAgfTsKK30pKCkpOworCitIYXNoLmZyb20g
PSAkSDsKK09iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSwgKGZ1bmN0aW9uKCkgeworICBm
dW5jdGlvbiB0b0NvbG9yUGFydCgpIHsKKyAgICByZXR1cm4gdGhpcy50b1BhZGRlZFN0cmluZygy
LCAxNik7CisgIH0KKworICBmdW5jdGlvbiBzdWNjKCkgeworICAgIHJldHVybiB0aGlzICsgMTsK
KyAgfQorCisgIGZ1bmN0aW9uIHRpbWVzKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgJFIoMCwg
dGhpcywgdHJ1ZSkuZWFjaChpdGVyYXRvciwgY29udGV4dCk7CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0KKworICBmdW5jdGlvbiB0b1BhZGRlZFN0cmluZyhsZW5ndGgsIHJhZGl4KSB7CisgICAgdmFy
IHN0cmluZyA9IHRoaXMudG9TdHJpbmcocmFkaXggfHwgMTApOworICAgIHJldHVybiAnMCcudGlt
ZXMobGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7CisgIH0KKworICBmdW5jdGlvbiB0
b0pTT04oKSB7CisgICAgcmV0dXJuIGlzRmluaXRlKHRoaXMpID8gdGhpcy50b1N0cmluZygpIDog
J251bGwnOworICB9CisKKyAgZnVuY3Rpb24gYWJzKCkgeworICAgIHJldHVybiBNYXRoLmFicyh0
aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJvdW5kKCkgeworICAgIHJldHVybiBNYXRoLnJvdW5k
KHRoaXMpOworICB9CisKKyAgZnVuY3Rpb24gY2VpbCgpIHsKKyAgICByZXR1cm4gTWF0aC5jZWls
KHRoaXMpOworICB9CisKKyAgZnVuY3Rpb24gZmxvb3IoKSB7CisgICAgcmV0dXJuIE1hdGguZmxv
b3IodGhpcyk7CisgIH0KKworICByZXR1cm4geworICAgIHRvQ29sb3JQYXJ0OiAgICB0b0NvbG9y
UGFydCwKKyAgICBzdWNjOiAgICAgICAgICAgc3VjYywKKyAgICB0aW1lczogICAgICAgICAgdGlt
ZXMsCisgICAgdG9QYWRkZWRTdHJpbmc6IHRvUGFkZGVkU3RyaW5nLAorICAgIHRvSlNPTjogICAg
ICAgICB0b0pTT04sCisgICAgYWJzOiAgICAgICAgICAgIGFicywKKyAgICByb3VuZDogICAgICAg
ICAgcm91bmQsCisgICAgY2VpbDogICAgICAgICAgIGNlaWwsCisgICAgZmxvb3I6ICAgICAgICAg
IGZsb29yCisgIH07Cit9KSgpKTsKKworZnVuY3Rpb24gJFIoc3RhcnQsIGVuZCwgZXhjbHVzaXZl
KSB7CisgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2Uoc3RhcnQsIGVuZCwgZXhjbHVzaXZlKTsKK30K
KwordmFyIE9iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRlKEVudW1lcmFibGUsIChmdW5jdGlvbigp
IHsKKyAgZnVuY3Rpb24gaW5pdGlhbGl6ZShzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsKKyAgICB0
aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAgdGhpcy5leGNsdXNp
dmUgPSBleGNsdXNpdmU7CisgIH0KKworICBmdW5jdGlvbiBfZWFjaChpdGVyYXRvcikgeworICAg
IHZhciB2YWx1ZSA9IHRoaXMuc3RhcnQ7CisgICAgd2hpbGUgKHRoaXMuaW5jbHVkZSh2YWx1ZSkp
IHsKKyAgICAgIGl0ZXJhdG9yKHZhbHVlKTsKKyAgICAgIHZhbHVlID0gdmFsdWUuc3VjYygpOwor
ICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGluY2x1ZGUodmFsdWUpIHsKKyAgICBpZiAodmFsdWUg
PCB0aGlzLnN0YXJ0KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzLmV4Y2x1c2l2
ZSkKKyAgICAgIHJldHVybiB2YWx1ZSA8IHRoaXMuZW5kOworICAgIHJldHVybiB2YWx1ZSA8PSB0
aGlzLmVuZDsKKyAgfQorCisgIHJldHVybiB7CisgICAgaW5pdGlhbGl6ZTogaW5pdGlhbGl6ZSwK
KyAgICBfZWFjaDogICAgICBfZWFjaCwKKyAgICBpbmNsdWRlOiAgICBpbmNsdWRlCisgIH07Cit9
KSgpKTsKKworCisKK3ZhciBBamF4ID0geworICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiBUcnkudGhlc2UoCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IFhNTEh0
dHBSZXF1ZXN0KCl9LAorICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0
KCdNc3htbDIuWE1MSFRUUCcpfSwKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZl
WE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKX0KKyAgICApIHx8IGZhbHNlOworICB9LAorCisg
IGFjdGl2ZVJlcXVlc3RDb3VudDogMAorfTsKKworQWpheC5SZXNwb25kZXJzID0geworICByZXNw
b25kZXJzOiBbXSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLnJl
c3BvbmRlcnMuX2VhY2goaXRlcmF0b3IpOworICB9LAorCisgIHJlZ2lzdGVyOiBmdW5jdGlvbihy
ZXNwb25kZXIpIHsKKyAgICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXIpKQorICAgICAgdGhp
cy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyKTsKKyAgfSwKKworICB1bnJlZ2lzdGVyOiBmdW5j
dGlvbihyZXNwb25kZXIpIHsKKyAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlzLnJlc3BvbmRlcnMu
d2l0aG91dChyZXNwb25kZXIpOworICB9LAorCisgIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFj
aywgcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHJl
c3BvbmRlcikgeworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3BvbmRlcltjYWxsYmFj
a10pKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uZGVyW2NhbGxiYWNrXS5hcHBs
eShyZXNwb25kZXIsIFtyZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb25dKTsKKyAgICAgICAgfSBjYXRj
aCAoZSkgeyB9CisgICAgICB9CisgICAgfSk7CisgIH0KK307CisKK09iamVjdC5leHRlbmQoQWph
eC5SZXNwb25kZXJzLCBFbnVtZXJhYmxlKTsKKworQWpheC5SZXNwb25kZXJzLnJlZ2lzdGVyKHsK
KyAgb25DcmVhdGU6ICAgZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVzdENvdW50KysgfSwK
KyAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVzdENvdW50LS0gfQor
fSk7CitBamF4LkJhc2UgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihv
cHRpb25zKSB7CisgICAgdGhpcy5vcHRpb25zID0geworICAgICAgbWV0aG9kOiAgICAgICAncG9z
dCcsCisgICAgICBhc3luY2hyb25vdXM6IHRydWUsCisgICAgICBjb250ZW50VHlwZTogICdhcHBs
aWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAorICAgICAgZW5jb2Rpbmc6ICAgICAnVVRG
LTgnLAorICAgICAgcGFyYW1ldGVyczogICAnJywKKyAgICAgIGV2YWxKU09OOiAgICAgdHJ1ZSwK
KyAgICAgIGV2YWxKUzogICAgICAgdHJ1ZQorICAgIH07CisgICAgT2JqZWN0LmV4dGVuZCh0aGlz
Lm9wdGlvbnMsIG9wdGlvbnMgfHwgeyB9KTsKKworICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0
aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7CisKKyAgICBpZiAoT2JqZWN0LmlzU3Ry
aW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSkKKyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0
ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9RdWVyeVBhcmFtcygpOworICAgIGVsc2Ug
aWYgKE9iamVjdC5pc0hhc2godGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5v
cHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycy50b09iamVjdCgpOwor
ICB9Cit9KTsKK0FqYXguUmVxdWVzdCA9IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsKKyAgX2Nv
bXBsZXRlOiBmYWxzZSwKKworICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIHVybCwgb3B0
aW9ucykgeworICAgICRzdXBlcihvcHRpb25zKTsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXgu
Z2V0VHJhbnNwb3J0KCk7CisgICAgdGhpcy5yZXF1ZXN0KHVybCk7CisgIH0sCisKKyAgcmVxdWVz
dDogZnVuY3Rpb24odXJsKSB7CisgICAgdGhpcy51cmwgPSB1cmw7CisgICAgdGhpcy5tZXRob2Qg
PSB0aGlzLm9wdGlvbnMubWV0aG9kOworICAgIHZhciBwYXJhbXMgPSBPYmplY3QuY2xvbmUodGhp
cy5vcHRpb25zLnBhcmFtZXRlcnMpOworCisgICAgaWYgKCFbJ2dldCcsICdwb3N0J10uaW5jbHVk
ZSh0aGlzLm1ldGhvZCkpIHsKKyAgICAgIHBhcmFtc1snX21ldGhvZCddID0gdGhpcy5tZXRob2Q7
CisgICAgICB0aGlzLm1ldGhvZCA9ICdwb3N0JzsKKyAgICB9CisKKyAgICB0aGlzLnBhcmFtZXRl
cnMgPSBwYXJhbXM7CisKKyAgICBpZiAocGFyYW1zID0gT2JqZWN0LnRvUXVlcnlTdHJpbmcocGFy
YW1zKSkgeworICAgICAgaWYgKHRoaXMubWV0aG9kID09ICdnZXQnKQorICAgICAgICB0aGlzLnVy
bCArPSAodGhpcy51cmwuaW5jbHVkZSgnPycpID8gJyYnIDogJz8nKSArIHBhcmFtczsKKyAgICAg
IGVsc2UgaWYgKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdl
bnQpKQorICAgICAgICBwYXJhbXMgKz0gJyZfPSc7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAg
IHZhciByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOworICAgICAgaWYgKHRoaXMu
b3B0aW9ucy5vbkNyZWF0ZSkgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKHJlc3BvbnNlKTsKKyAgICAg
IEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25DcmVhdGUnLCB0aGlzLCByZXNwb25zZSk7CisK
KyAgICAgIHRoaXMudHJhbnNwb3J0Lm9wZW4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSwgdGhp
cy51cmwsCisgICAgICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpOworCisgICAgICBpZiAo
dGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cykgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlLmJpbmQo
dGhpcykuZGVmZXIoMSk7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5n
ZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zZXRSZXF1ZXN0
SGVhZGVycygpOworCisgICAgICB0aGlzLmJvZHkgPSB0aGlzLm1ldGhvZCA9PSAncG9zdCcgPyAo
dGhpcy5vcHRpb25zLnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxsOworICAgICAgdGhpcy50cmFu
c3BvcnQuc2VuZCh0aGlzLmJvZHkpOworCisgICAgICAvKiBGb3JjZSBGaXJlZm94IHRvIGhhbmRs
ZSByZWFkeSBzdGF0ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0cyAqLworICAgICAgaWYgKCF0
aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzICYmIHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5
cGUpCisgICAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSgpOworCisgICAgfQorICAgIGNhdGNoIChl
KSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBv
blN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMudHJh
bnNwb3J0LnJlYWR5U3RhdGU7CisgICAgaWYgKHJlYWR5U3RhdGUgPiAxICYmICEoKHJlYWR5U3Rh
dGUgPT0gNCkgJiYgdGhpcy5fY29tcGxldGUpKQorICAgICAgdGhpcy5yZXNwb25kVG9SZWFkeVN0
YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpOworICB9LAorCisgIHNldFJlcXVlc3RIZWFk
ZXJzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaGVhZGVycyA9IHsKKyAgICAgICdYLVJlcXVlc3Rl
ZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywKKyAgICAgICdYLVByb3RvdHlwZS1WZXJzaW9uJzog
UHJvdG90eXBlLlZlcnNpb24sCisgICAgICAnQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4
dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonCisgICAgfTsKKworICAgIGlm
ICh0aGlzLm1ldGhvZCA9PSAncG9zdCcpIHsKKyAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSdd
ID0gdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlICsKKyAgICAgICAgKHRoaXMub3B0aW9ucy5lbmNv
ZGluZyA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNvZGluZyA6ICcnKTsKKworICAg
ICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xkZXIgTW96aWxsYSBicm93c2Vy
cyB0byB3b3JrCisgICAgICAgKiBhcm91bmQgYSBidWcgd2hlcmUgWE1MSHR0cFJlcXVlc3Qgc2Vu
ZHMgYW4gaW5jb3JyZWN0CisgICAgICAgKiBDb250ZW50LWxlbmd0aCBoZWFkZXIuIFNlZSBNb3pp
bGxhIEJ1Z3ppbGxhICMyNDY2NTEuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLnRyYW5zcG9y
dC5vdmVycmlkZU1pbWVUeXBlICYmCisgICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0
Y2goL0dlY2tvXC8oXGR7NH0pLykgfHwgWzAsMjAwNV0pWzFdIDwgMjAwNSkKKyAgICAgICAgICAg
IGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7CisgICAgfQorCisgICAgaWYgKHR5cGVv
ZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnMgPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBl
eHRyYXMgPSB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM7CisKKyAgICAgIGlmIChPYmplY3Qu
aXNGdW5jdGlvbihleHRyYXMucHVzaCkpCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGgg
PSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgaGVhZGVyc1tl
eHRyYXNbaV1dID0gZXh0cmFzW2krMV07CisgICAgICBlbHNlCisgICAgICAgICRIKGV4dHJhcyku
ZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsK
KyAgICB9CisKKyAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpCisgICAgICB0aGlzLnRyYW5z
cG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOworICB9LAorCisgIHN1
Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpOwor
ICAgIHJldHVybiAhc3RhdHVzIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7Cisg
IH0sCisKKyAgZ2V0U3RhdHVzOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJu
IHRoaXMudHJhbnNwb3J0LnN0YXR1cyB8fCAwOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAg
fQorICB9LAorCisgIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsK
KyAgICB2YXIgc3RhdGUgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdLCByZXNwb25z
ZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOworCisgICAgaWYgKHN0YXRlID09ICdDb21wbGV0
ZScpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAg
ICAgKHRoaXMub3B0aW9uc1snb24nICsgcmVzcG9uc2Uuc3RhdHVzXQorICAgICAgICAgfHwgdGhp
cy5vcHRpb25zWydvbicgKyAodGhpcy5zdWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScp
XQorICAgICAgICAgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25z
ZS5oZWFkZXJKU09OKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRj
aEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbnRlbnRUeXBlID0gcmVzcG9u
c2UuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKTsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXZh
bEpTID09ICdmb3JjZScKKyAgICAgICAgICB8fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlz
LmlzU2FtZU9yaWdpbigpICYmIGNvbnRlbnRUeXBlCisgICAgICAgICAgJiYgY29udGVudFR5cGUu
bWF0Y2goL15ccyoodGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4q
KT9ccyokL2kpKSkKKyAgICAgICAgdGhpcy5ldmFsUmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICB0
cnkgeworICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0
eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CisgICAgICBBamF4LlJl
c3BvbmRlcnMuZGlzcGF0Y2goJ29uJyArIHN0YXRlLCB0aGlzLCByZXNwb25zZSwgcmVzcG9uc2Uu
aGVhZGVySlNPTik7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2Vw
dGlvbihlKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAg
dGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rp
b247CisgICAgfQorICB9LAorCisgIGlzU2FtZU9yaWdpbjogZnVuY3Rpb24oKSB7CisgICAgdmFy
IG0gPSB0aGlzLnVybC5tYXRjaCgvXlxzKmh0dHBzPzpcL1wvW15cL10qLyk7CisgICAgcmV0dXJu
ICFtIHx8IChtWzBdID09ICcje3Byb3RvY29sfS8vI3tkb21haW59I3twb3J0fScuaW50ZXJwb2xh
dGUoeworICAgICAgcHJvdG9jb2w6IGxvY2F0aW9uLnByb3RvY29sLAorICAgICAgZG9tYWluOiBk
b2N1bWVudC5kb21haW4sCisgICAgICBwb3J0OiBsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRp
b24ucG9ydCA6ICcnCisgICAgfSkpOworICB9LAorCisgIGdldEhlYWRlcjogZnVuY3Rpb24obmFt
ZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VI
ZWFkZXIobmFtZSkgfHwgbnVsbDsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9Cisg
IH0sCisKKyAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0
dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8fCAnJykudW5maWx0ZXJKU09O
KCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7
CisgICAgfQorICB9LAorCisgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24p
IHsKKyAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0
aW9uKSh0aGlzLCBleGNlcHRpb24pOworICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25F
eGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOworICB9Cit9KTsKKworQWpheC5SZXF1ZXN0LkV2
ZW50cyA9CisgIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFj
dGl2ZScsICdDb21wbGV0ZSddOworCisKKworCisKKworCisKK0FqYXguUmVzcG9uc2UgPSBDbGFz
cy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihyZXF1ZXN0KXsKKyAgICB0aGlzLnJl
cXVlc3QgPSByZXF1ZXN0OworICAgIHZhciB0cmFuc3BvcnQgID0gdGhpcy50cmFuc3BvcnQgID0g
cmVxdWVzdC50cmFuc3BvcnQsCisgICAgICAgIHJlYWR5U3RhdGUgPSB0aGlzLnJlYWR5U3RhdGUg
PSB0cmFuc3BvcnQucmVhZHlTdGF0ZTsKKworICAgIGlmKChyZWFkeVN0YXRlID4gMiAmJiAhUHJv
dG90eXBlLkJyb3dzZXIuSUUpIHx8IHJlYWR5U3RhdGUgPT0gNCkgeworICAgICAgdGhpcy5zdGF0
dXMgICAgICAgPSB0aGlzLmdldFN0YXR1cygpOworICAgICAgdGhpcy5zdGF0dXNUZXh0ICAgPSB0
aGlzLmdldFN0YXR1c1RleHQoKTsKKyAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gU3RyaW5nLmlu
dGVycHJldCh0cmFuc3BvcnQucmVzcG9uc2VUZXh0KTsKKyAgICAgIHRoaXMuaGVhZGVySlNPTiAg
ID0gdGhpcy5fZ2V0SGVhZGVySlNPTigpOworICAgIH0KKworICAgIGlmKHJlYWR5U3RhdGUgPT0g
NCkgeworICAgICAgdmFyIHhtbCA9IHRyYW5zcG9ydC5yZXNwb25zZVhNTDsKKyAgICAgIHRoaXMu
cmVzcG9uc2VYTUwgID0gT2JqZWN0LmlzVW5kZWZpbmVkKHhtbCkgPyBudWxsIDogeG1sOworICAg
ICAgdGhpcy5yZXNwb25zZUpTT04gPSB0aGlzLl9nZXRSZXNwb25zZUpTT04oKTsKKyAgICB9Cisg
IH0sCisKKyAgc3RhdHVzOiAgICAgIDAsCisKKyAgc3RhdHVzVGV4dDogJycsCisKKyAgZ2V0U3Rh
dHVzOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldFN0YXR1cywKKworICBnZXRTdGF0dXNUZXh0
OiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0
YXR1c1RleHQgfHwgJyc7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfQorICB9LAorCisg
IGdldEhlYWRlcjogQWpheC5SZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIsCisKKyAgZ2V0QWxs
SGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLmdldEFs
bFJlc3BvbnNlSGVhZGVycygpOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQorICB9
LAorCisgIGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgcmV0dXJuIHRo
aXMudHJhbnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpOworICB9LAorCisgIGdldEFsbFJl
c3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0Lmdl
dEFsbFJlc3BvbnNlSGVhZGVycygpOworICB9LAorCisgIF9nZXRIZWFkZXJKU09OOiBmdW5jdGlv
bigpIHsKKyAgICB2YXIganNvbiA9IHRoaXMuZ2V0SGVhZGVyKCdYLUpTT04nKTsKKyAgICBpZiAo
IWpzb24pIHJldHVybiBudWxsOworICAgIGpzb24gPSBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBl
KGpzb24pKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGpzb24uZXZhbEpTT04odGhpcy5yZXF1
ZXN0Lm9wdGlvbnMuc2FuaXRpemVKU09OIHx8CisgICAgICAgICF0aGlzLnJlcXVlc3QuaXNTYW1l
T3JpZ2luKCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMucmVxdWVzdC5kaXNwYXRj
aEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0sCisKKyAgX2dldFJlc3BvbnNlSlNPTjogZnVuY3Rp
b24oKSB7CisgICAgdmFyIG9wdGlvbnMgPSB0aGlzLnJlcXVlc3Qub3B0aW9uczsKKyAgICBpZiAo
IW9wdGlvbnMuZXZhbEpTT04gfHwgKG9wdGlvbnMuZXZhbEpTT04gIT0gJ2ZvcmNlJyAmJgorICAg
ICAgISh0aGlzLmdldEhlYWRlcignQ29udGVudC10eXBlJykgfHwgJycpLmluY2x1ZGUoJ2FwcGxp
Y2F0aW9uL2pzb24nKSkgfHwKKyAgICAgICAgdGhpcy5yZXNwb25zZVRleHQuYmxhbmsoKSkKKyAg
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMucmVzcG9u
c2VUZXh0LmV2YWxKU09OKG9wdGlvbnMuc2FuaXRpemVKU09OIHx8CisgICAgICAgICF0aGlzLnJl
cXVlc3QuaXNTYW1lT3JpZ2luKCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMucmVx
dWVzdC5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30pOworCitBamF4LlVwZGF0
ZXIgPSBDbGFzcy5jcmVhdGUoQWpheC5SZXF1ZXN0LCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9u
KCRzdXBlciwgY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLmNvbnRhaW5lciA9
IHsKKyAgICAgIHN1Y2Nlc3M6IChjb250YWluZXIuc3VjY2VzcyB8fCBjb250YWluZXIpLAorICAg
ICAgZmFpbHVyZTogKGNvbnRhaW5lci5mYWlsdXJlIHx8IChjb250YWluZXIuc3VjY2VzcyA/IG51
bGwgOiBjb250YWluZXIpKQorICAgIH07CisKKyAgICBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9w
dGlvbnMpOworICAgIHZhciBvbkNvbXBsZXRlID0gb3B0aW9ucy5vbkNvbXBsZXRlOworICAgIG9w
dGlvbnMub25Db21wbGV0ZSA9IChmdW5jdGlvbihyZXNwb25zZSwganNvbikgeworICAgICAgdGhp
cy51cGRhdGVDb250ZW50KHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CisgICAgICBpZiAoT2JqZWN0
LmlzRnVuY3Rpb24ob25Db21wbGV0ZSkpIG9uQ29tcGxldGUocmVzcG9uc2UsIGpzb24pOworICAg
IH0pLmJpbmQodGhpcyk7CisKKyAgICAkc3VwZXIodXJsLCBvcHRpb25zKTsKKyAgfSwKKworICB1
cGRhdGVDb250ZW50OiBmdW5jdGlvbihyZXNwb25zZVRleHQpIHsKKyAgICB2YXIgcmVjZWl2ZXIg
PSB0aGlzLmNvbnRhaW5lclt0aGlzLnN1Y2Nlc3MoKSA/ICdzdWNjZXNzJyA6ICdmYWlsdXJlJ10s
CisgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisKKyAgICBpZiAoIW9wdGlvbnMuZXZh
bFNjcmlwdHMpIHJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlVGV4dC5zdHJpcFNjcmlwdHMoKTsKKwor
ICAgIGlmIChyZWNlaXZlciA9ICQocmVjZWl2ZXIpKSB7CisgICAgICBpZiAob3B0aW9ucy5pbnNl
cnRpb24pIHsKKyAgICAgICAgaWYgKE9iamVjdC5pc1N0cmluZyhvcHRpb25zLmluc2VydGlvbikp
IHsKKyAgICAgICAgICB2YXIgaW5zZXJ0aW9uID0geyB9OyBpbnNlcnRpb25bb3B0aW9ucy5pbnNl
cnRpb25dID0gcmVzcG9uc2VUZXh0OworICAgICAgICAgIHJlY2VpdmVyLmluc2VydChpbnNlcnRp
b24pOworICAgICAgICB9CisgICAgICAgIGVsc2Ugb3B0aW9ucy5pbnNlcnRpb24ocmVjZWl2ZXIs
IHJlc3BvbnNlVGV4dCk7CisgICAgICB9CisgICAgICBlbHNlIHJlY2VpdmVyLnVwZGF0ZShyZXNw
b25zZVRleHQpOworICAgIH0KKyAgfQorfSk7CisKK0FqYXguUGVyaW9kaWNhbFVwZGF0ZXIgPSBD
bGFzcy5jcmVhdGUoQWpheC5CYXNlLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwg
Y29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICAkc3VwZXIob3B0aW9ucyk7CisgICAgdGhp
cy5vbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGU7CisKKyAgICB0aGlzLmZyZXF1
ZW5jeSA9ICh0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDIpOworICAgIHRoaXMuZGVjYXkgPSAo
dGhpcy5vcHRpb25zLmRlY2F5IHx8IDEpOworCisgICAgdGhpcy51cGRhdGVyID0geyB9OworICAg
IHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMudXJsID0gdXJsOworCisgICAg
dGhpcy5zdGFydCgpOworICB9LAorCisgIHN0YXJ0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLm9w
dGlvbnMub25Db21wbGV0ZSA9IHRoaXMudXBkYXRlQ29tcGxldGUuYmluZCh0aGlzKTsKKyAgICB0
aGlzLm9uVGltZXJFdmVudCgpOworICB9LAorCisgIHN0b3A6IGZ1bmN0aW9uKCkgeworICAgIHRo
aXMudXBkYXRlci5vcHRpb25zLm9uQ29tcGxldGUgPSB1bmRlZmluZWQ7CisgICAgY2xlYXJUaW1l
b3V0KHRoaXMudGltZXIpOworICAgICh0aGlzLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb24pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgdXBkYXRlQ29tcGxl
dGU6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgaWYgKHRoaXMub3B0aW9ucy5kZWNheSkgewor
ICAgICAgdGhpcy5kZWNheSA9IChyZXNwb25zZS5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4
dCA/CisgICAgICAgIHRoaXMuZGVjYXkgKiB0aGlzLm9wdGlvbnMuZGVjYXkgOiAxKTsKKworICAg
ICAgdGhpcy5sYXN0VGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKKyAgICB9CisgICAgdGhp
cy50aW1lciA9IHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcykuZGVsYXkodGhpcy5kZWNheSAq
IHRoaXMuZnJlcXVlbmN5KTsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgewor
ICAgIHRoaXMudXBkYXRlciA9IG5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIsIHRoaXMu
dXJsLCB0aGlzLm9wdGlvbnMpOworICB9Cit9KTsKKworCisKK2Z1bmN0aW9uICQoZWxlbWVudCkg
eworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgZWxl
bWVudHMgPSBbXSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQor
ICAgICAgZWxlbWVudHMucHVzaCgkKGFyZ3VtZW50c1tpXSkpOworICAgIHJldHVybiBlbGVtZW50
czsKKyAgfQorICBpZiAoT2JqZWN0LmlzU3RyaW5nKGVsZW1lbnQpKQorICAgIGVsZW1lbnQgPSBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKKyAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5k
KGVsZW1lbnQpOworfQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCkgewor
ICBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgcGFy
ZW50RWxlbWVudCkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdmFyIHF1ZXJ5ID0gZG9j
dW1lbnQuZXZhbHVhdGUoZXhwcmVzc2lvbiwgJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudCwK
KyAgICAgIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxs
KTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcXVlcnkuc25hcHNob3RMZW5ndGg7IGkg
PCBsZW5ndGg7IGkrKykKKyAgICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChxdWVyeS5z
bmFwc2hvdEl0ZW0oaSkpKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfTsKK30KKworLyotLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSovCisKK2lmICghd2luZG93Lk5vZGUpIHZhciBOb2RlID0geyB9OworCitp
ZiAoIU5vZGUuRUxFTUVOVF9OT0RFKSB7CisgIE9iamVjdC5leHRlbmQoTm9kZSwgeworICAgIEVM
RU1FTlRfTk9ERTogMSwKKyAgICBBVFRSSUJVVEVfTk9ERTogMiwKKyAgICBURVhUX05PREU6IDMs
CisgICAgQ0RBVEFfU0VDVElPTl9OT0RFOiA0LAorICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTog
NSwKKyAgICBFTlRJVFlfTk9ERTogNiwKKyAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6
IDcsCisgICAgQ09NTUVOVF9OT0RFOiA4LAorICAgIERPQ1VNRU5UX05PREU6IDksCisgICAgRE9D
VU1FTlRfVFlQRV9OT0RFOiAxMCwKKyAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSwKKyAg
ICBOT1RBVElPTl9OT0RFOiAxMgorICB9KTsKK30KKworCisoZnVuY3Rpb24oZ2xvYmFsKSB7CisK
KyAgdmFyIFNFVEFUVFJJQlVURV9JR05PUkVTX05BTUUgPSAoZnVuY3Rpb24oKXsKKyAgICB2YXIg
ZWxGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpOworICAgIHZhciBlbElucHV0
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICB2YXIgcm9vdCA9IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudDsKKyAgICBlbElucHV0LnNldEF0dHJpYnV0ZSgibmFtZSIsICJ0
ZXN0Iik7CisgICAgZWxGb3JtLmFwcGVuZENoaWxkKGVsSW5wdXQpOworICAgIHJvb3QuYXBwZW5k
Q2hpbGQoZWxGb3JtKTsKKyAgICB2YXIgaXNCdWdneSA9IGVsRm9ybS5lbGVtZW50cworICAgICAg
PyAodHlwZW9mIGVsRm9ybS5lbGVtZW50cy50ZXN0ID09ICJ1bmRlZmluZWQiKQorICAgICAgOiBu
dWxsOworICAgIHJvb3QucmVtb3ZlQ2hpbGQoZWxGb3JtKTsKKyAgICBlbEZvcm0gPSBlbElucHV0
ID0gbnVsbDsKKyAgICByZXR1cm4gaXNCdWdneTsKKyAgfSkoKTsKKworICB2YXIgZWxlbWVudCA9
IGdsb2JhbC5FbGVtZW50OworICBnbG9iYWwuRWxlbWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGF0
dHJpYnV0ZXMpIHsKKyAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcyB8fCB7IH07CisgICAgdGFn
TmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICB2YXIgY2FjaGUgPSBFbGVtZW50LmNh
Y2hlOworICAgIGlmIChTRVRBVFRSSUJVVEVfSUdOT1JFU19OQU1FICYmIGF0dHJpYnV0ZXMubmFt
ZSkgeworICAgICAgdGFnTmFtZSA9ICc8JyArIHRhZ05hbWUgKyAnIG5hbWU9IicgKyBhdHRyaWJ1
dGVzLm5hbWUgKyAnIj4nOworICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsKKyAgICAgIHJl
dHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFt
ZSksIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBpZiAoIWNhY2hlW3RhZ05hbWVdKSBjYWNoZVt0
YWdOYW1lXSA9IEVsZW1lbnQuZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkp
OworICAgIHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05hbWVdLmNsb25l
Tm9kZShmYWxzZSksIGF0dHJpYnV0ZXMpOworICB9OworICBPYmplY3QuZXh0ZW5kKGdsb2JhbC5F
bGVtZW50LCBlbGVtZW50IHx8IHsgfSk7CisgIGlmIChlbGVtZW50KSBnbG9iYWwuRWxlbWVudC5w
cm90b3R5cGUgPSBlbGVtZW50LnByb3RvdHlwZTsKK30pKHRoaXMpOworCitFbGVtZW50LmNhY2hl
ID0geyB9OworRWxlbWVudC5pZENvdW50ZXIgPSAxOworCitFbGVtZW50Lk1ldGhvZHMgPSB7Cisg
IHZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5zdHls
ZS5kaXNwbGF5ICE9ICdub25lJzsKKyAgfSwKKworICB0b2dnbGU6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBFbGVtZW50W0VsZW1lbnQudmlzaWJs
ZShlbGVtZW50KSA/ICdoaWRlJyA6ICdzaG93J10oZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1l
bnQ7CisgIH0sCisKKworICBoaWRlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgIHJl
dHVybiBlbGVtZW50OworICB9LAorCisgIHNob3c6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJzsKKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3Zl
Q2hpbGQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdXBkYXRlOiAo
ZnVuY3Rpb24oKXsKKworICAgIHZhciBTRUxFQ1RfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1kgPSAo
ZnVuY3Rpb24oKXsKKyAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVj
dCIpLAorICAgICAgICAgIGlzQnVnZ3kgPSB0cnVlOworICAgICAgZWwuaW5uZXJIVE1MID0gIjxv
cHRpb24gdmFsdWU9XCJ0ZXN0XCI+dGVzdDwvb3B0aW9uPiI7CisgICAgICBpZiAoZWwub3B0aW9u
cyAmJiBlbC5vcHRpb25zWzBdKSB7CisgICAgICAgIGlzQnVnZ3kgPSBlbC5vcHRpb25zWzBdLm5v
ZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICJPUFRJT04iOworICAgICAgfQorICAgICAgZWwgPSBu
dWxsOworICAgICAgcmV0dXJuIGlzQnVnZ3k7CisgICAgfSkoKTsKKworICAgIHZhciBUQUJMRV9F
TEVNRU5UX0lOTkVSSFRNTF9CVUdHWSA9IChmdW5jdGlvbigpeworICAgICAgdHJ5IHsKKyAgICAg
ICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKKyAgICAgICAgaWYg
KGVsICYmIGVsLnRCb2RpZXMpIHsKKyAgICAgICAgICBlbC5pbm5lckhUTUwgPSAiPHRib2R5Pjx0
cj48dGQ+dGVzdDwvdGQ+PC90cj48L3Rib2R5PiI7CisgICAgICAgICAgdmFyIGlzQnVnZ3kgPSB0
eXBlb2YgZWwudEJvZGllc1swXSA9PSAidW5kZWZpbmVkIjsKKyAgICAgICAgICBlbCA9IG51bGw7
CisgICAgICAgICAgcmV0dXJuIGlzQnVnZ3k7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGUp
IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSkoKTsKKworICAgIHZhciBT
Q1JJUFRfRUxFTUVOVF9SRUpFQ1RTX1RFWFROT0RFX0FQUEVORElORyA9IChmdW5jdGlvbiAoKSB7
CisgICAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLAorICAgICAg
ICAgIGlzQnVnZ3kgPSBmYWxzZTsKKyAgICAgIHRyeSB7CisgICAgICAgIHMuYXBwZW5kQ2hpbGQo
ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpKTsKKyAgICAgICAgaXNCdWdneSA9ICFzLmZpcnN0
Q2hpbGQgfHwKKyAgICAgICAgICBzLmZpcnN0Q2hpbGQgJiYgcy5maXJzdENoaWxkLm5vZGVUeXBl
ICE9PSAzOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBpc0J1Z2d5ID0gdHJ1ZTsKKyAg
ICAgIH0KKyAgICAgIHMgPSBudWxsOworICAgICAgcmV0dXJuIGlzQnVnZ3k7CisgICAgfSkoKTsK
KworICAgIGZ1bmN0aW9uIHVwZGF0ZShlbGVtZW50LCBjb250ZW50KSB7CisgICAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKworICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQp
CisgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworCisgICAgICBpZiAoT2Jq
ZWN0LmlzRWxlbWVudChjb250ZW50KSkKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCku
aW5zZXJ0KGNvbnRlbnQpOworCisgICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50
KTsKKworICAgICAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsK
KworICAgICAgaWYgKHRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIFNDUklQVF9FTEVNRU5UX1JFSkVD
VFNfVEVYVE5PREVfQVBQRU5ESU5HKSB7CisgICAgICAgIGVsZW1lbnQudGV4dCA9IGNvbnRlbnQ7
CisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgfQorCisgICAgICBpZiAoU0VMRUNUX0VM
RU1FTlRfSU5ORVJIVE1MX0JVR0dZIHx8IFRBQkxFX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZKSB7
CisgICAgICAgIGlmICh0YWdOYW1lIGluIEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50
YWdzKSB7CisgICAgICAgICAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkgeworICAgICAgICAg
ICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOworICAgICAgICAgIH0K
KyAgICAgICAgICBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFt
ZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSkKKyAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKG5v
ZGUpIHsKKyAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKQorICAgICAgICAg
ICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZWxlbWVudC5pbm5l
ckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworICAgICAgICB9CisgICAgICB9CisgICAg
ICBlbHNlIHsKKyAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0
cygpOworICAgICAgfQorCisgICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCku
ZGVmZXIoKTsKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIHJldHVybiB1cGRh
dGU7CisgIH0pKCksCisKKyAgcmVwbGFjZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9F
bGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBlbHNlIGlmICghT2Jq
ZWN0LmlzRWxlbWVudChjb250ZW50KSkgeworICAgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwo
Y29udGVudCk7CisgICAgICB2YXIgcmFuZ2UgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRl
UmFuZ2UoKTsKKyAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZWxlbWVudCk7CisgICAgICBjb250ZW50
LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICAgIGNvbnRlbnQgPSByYW5n
ZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoY29udGVudC5zdHJpcFNjcmlwdHMoKSk7CisgICAg
fQorICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCwgZWxlbWVudCk7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgaW5zZXJ0OiBmdW5jdGlvbihlbGVtZW50
LCBpbnNlcnRpb25zKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAgICBpZiAoT2Jq
ZWN0LmlzU3RyaW5nKGluc2VydGlvbnMpIHx8IE9iamVjdC5pc051bWJlcihpbnNlcnRpb25zKSB8
fAorICAgICAgICBPYmplY3QuaXNFbGVtZW50KGluc2VydGlvbnMpIHx8IChpbnNlcnRpb25zICYm
IChpbnNlcnRpb25zLnRvRWxlbWVudCB8fCBpbnNlcnRpb25zLnRvSFRNTCkpKQorICAgICAgICAg
IGluc2VydGlvbnMgPSB7Ym90dG9tOmluc2VydGlvbnN9OworCisgICAgdmFyIGNvbnRlbnQsIGlu
c2VydCwgdGFnTmFtZSwgY2hpbGROb2RlczsKKworICAgIGZvciAodmFyIHBvc2l0aW9uIGluIGlu
c2VydGlvbnMpIHsKKyAgICAgIGNvbnRlbnQgID0gaW5zZXJ0aW9uc1twb3NpdGlvbl07CisgICAg
ICBwb3NpdGlvbiA9IHBvc2l0aW9uLnRvTG93ZXJDYXNlKCk7CisgICAgICBpbnNlcnQgPSBFbGVt
ZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnNbcG9zaXRpb25dOworCisgICAgICBpZiAoY29udGVu
dCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7Cisg
ICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgeworICAgICAgICBpbnNlcnQoZWxl
bWVudCwgY29udGVudCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBjb250
ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKworICAgICAgdGFnTmFtZSA9ICgocG9zaXRp
b24gPT0gJ2JlZm9yZScgfHwgcG9zaXRpb24gPT0gJ2FmdGVyJykKKyAgICAgICAgPyBlbGVtZW50
LnBhcmVudE5vZGUgOiBlbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisKKyAgICAgIGNo
aWxkTm9kZXMgPSBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFt
ZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSk7CisKKyAgICAgIGlmIChwb3NpdGlvbiA9PSAndG9w
JyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKSBjaGlsZE5vZGVzLnJldmVyc2UoKTsKKyAgICAgIGNo
aWxkTm9kZXMuZWFjaChpbnNlcnQuY3VycnkoZWxlbWVudCkpOworCisgICAgICBjb250ZW50LmV2
YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZWxl
bWVudDsKKyAgfSwKKworICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFwcGVyLCBhdHRyaWJ1
dGVzKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1l
bnQod3JhcHBlcikpCisgICAgICAkKHdyYXBwZXIpLndyaXRlQXR0cmlidXRlKGF0dHJpYnV0ZXMg
fHwgeyB9KTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNTdHJpbmcod3JhcHBlcikpIHdyYXBwZXIg
PSBuZXcgRWxlbWVudCh3cmFwcGVyLCBhdHRyaWJ1dGVzKTsKKyAgICBlbHNlIHdyYXBwZXIgPSBu
ZXcgRWxlbWVudCgnZGl2Jywgd3JhcHBlcik7CisgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkK
KyAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBlciwgZWxlbWVudCk7
CisgICAgd3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gd3JhcHBlcjsK
KyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgdmFyIHJlc3VsdCA9ICc8JyArIGVsZW1lbnQudGFnTmFtZS50b0xvd2Vy
Q2FzZSgpOworICAgICRIKHsnaWQnOiAnaWQnLCAnY2xhc3NOYW1lJzogJ2NsYXNzJ30pLmVhY2go
ZnVuY3Rpb24ocGFpcikgeworICAgICAgdmFyIHByb3BlcnR5ID0gcGFpci5maXJzdCgpLCBhdHRy
aWJ1dGUgPSBwYWlyLmxhc3QoKTsKKyAgICAgIHZhciB2YWx1ZSA9IChlbGVtZW50W3Byb3BlcnR5
XSB8fCAnJykudG9TdHJpbmcoKTsKKyAgICAgIGlmICh2YWx1ZSkgcmVzdWx0ICs9ICcgJyArIGF0
dHJpYnV0ZSArICc9JyArIHZhbHVlLmluc3BlY3QodHJ1ZSk7CisgICAgfSk7CisgICAgcmV0dXJu
IHJlc3VsdCArICc+JzsKKyAgfSwKKworICByZWN1cnNpdmVseUNvbGxlY3Q6IGZ1bmN0aW9uKGVs
ZW1lbnQsIHByb3BlcnR5KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGVs
ZW1lbnRzID0gW107CisgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50W3Byb3BlcnR5XSkKKyAg
ICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpCisgICAgICAgIGVsZW1lbnRzLnB1c2goRWxl
bWVudC5leHRlbmQoZWxlbWVudCkpOworICAgIHJldHVybiBlbGVtZW50czsKKyAgfSwKKworICBh
bmNlc3RvcnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5yZWN1cnNp
dmVseUNvbGxlY3QoZWxlbWVudCwgJ3BhcmVudE5vZGUnKTsKKyAgfSwKKworICBkZXNjZW5kYW50
czogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiBFbGVtZW50LnNlbGVjdChlbGVtZW50
LCAiKiIpOworICB9LAorCisgIGZpcnN0RGVzY2VuZGFudDogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKGVsZW1lbnQg
JiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsK
KyAgICByZXR1cm4gJChlbGVtZW50KTsKKyAgfSwKKworICBpbW1lZGlhdGVEZXNjZW5kYW50czog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0
Q2hpbGQpKSByZXR1cm4gW107CisgICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlw
ZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsKKyAgICBpZiAoZWxlbWVudCkg
cmV0dXJuIFtlbGVtZW50XS5jb25jYXQoJChlbGVtZW50KS5uZXh0U2libGluZ3MoKSk7CisgICAg
cmV0dXJuIFtdOworICB9LAorCisgIHByZXZpb3VzU2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICByZXR1cm4gRWxlbWVudC5yZWN1cnNpdmVseUNvbGxlY3QoZWxlbWVudCwgJ3ByZXZp
b3VzU2libGluZycpOworICB9LAorCisgIG5leHRTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHJldHVybiBFbGVtZW50LnJlY3Vyc2l2ZWx5Q29sbGVjdChlbGVtZW50LCAnbmV4dFNp
YmxpbmcnKTsKKyAgfSwKKworICBzaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVs
ZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHJldHVybiBFbGVtZW50LnByZXZpb3VzU2libGluZ3Mo
ZWxlbWVudCkucmV2ZXJzZSgpCisgICAgICAuY29uY2F0KEVsZW1lbnQubmV4dFNpYmxpbmdzKGVs
ZW1lbnQpKTsKKyAgfSwKKworICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsK
KyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHNlbGVjdG9yKSkKKyAgICAgIHNlbGVjdG9yID0gbmV3
IFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2goJChlbGVtZW50
KSk7CisgIH0sCisKKyAgdXA6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7
CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0g
MSkgcmV0dXJuICQoZWxlbWVudC5wYXJlbnROb2RlKTsKKyAgICB2YXIgYW5jZXN0b3JzID0gRWxl
bWVudC5hbmNlc3RvcnMoZWxlbWVudCk7CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHBy
ZXNzaW9uKSA/IGFuY2VzdG9yc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxl
bWVudChhbmNlc3RvcnMsIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKworICBkb3duOiBmdW5j
dGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiBFbGVtZW50LmZpcnN0
RGVzY2VuZGFudChlbGVtZW50KTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Np
b24pID8gRWxlbWVudC5kZXNjZW5kYW50cyhlbGVtZW50KVtleHByZXNzaW9uXSA6CisgICAgICBF
bGVtZW50LnNlbGVjdChlbGVtZW50LCBleHByZXNzaW9uKVtpbmRleCB8fCAwXTsKKyAgfSwKKwor
ICBwcmV2aW91czogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1
cm4gJChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKGVsZW1lbnQpKTsK
KyAgICB2YXIgcHJldmlvdXNTaWJsaW5ncyA9IEVsZW1lbnQucHJldmlvdXNTaWJsaW5ncyhlbGVt
ZW50KTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gcHJldmlvdXNT
aWJsaW5nc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVudChwcmV2aW91
c1NpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0sCisKKyAgbmV4dDogZnVuY3Rpb24o
ZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVy
cy5uZXh0RWxlbWVudFNpYmxpbmcoZWxlbWVudCkpOworICAgIHZhciBuZXh0U2libGluZ3MgPSBF
bGVtZW50Lm5leHRTaWJsaW5ncyhlbGVtZW50KTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVy
KGV4cHJlc3Npb24pID8gbmV4dFNpYmxpbmdzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNlbGVjdG9y
LmZpbmRFbGVtZW50KG5leHRTaWJsaW5ncywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisK
KyAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90
b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBTZWxlY3Rvci5maW5k
Q2hpbGRFbGVtZW50cyhlbGVtZW50LCBhcmdzKTsKKyAgfSwKKworICBhZGphY2VudDogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKTsKKyAgICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxl
bWVudC5wYXJlbnROb2RlLCBhcmdzKS53aXRob3V0KGVsZW1lbnQpOworICB9LAorCisgIGlkZW50
aWZ5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
dmFyIGlkID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsICdpZCcpOworICAgIGlmIChp
ZCkgcmV0dXJuIGlkOworICAgIGRvIHsgaWQgPSAnYW5vbnltb3VzX2VsZW1lbnRfJyArIEVsZW1l
bnQuaWRDb3VudGVyKysgfSB3aGlsZSAoJChpZCkpOworICAgIEVsZW1lbnQud3JpdGVBdHRyaWJ1
dGUoZWxlbWVudCwgJ2lkJywgaWQpOworICAgIHJldHVybiBpZDsKKyAgfSwKKworICByZWFkQXR0
cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVu
dCk7CisgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgICB2YXIgdCA9IEVsZW1l
bnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5yZWFkOworICAgICAgaWYgKHQudmFsdWVzW25hbWVd
KSByZXR1cm4gdC52YWx1ZXNbbmFtZV0oZWxlbWVudCwgbmFtZSk7CisgICAgICBpZiAodC5uYW1l
c1tuYW1lXSkgbmFtZSA9IHQubmFtZXNbbmFtZV07CisgICAgICBpZiAobmFtZS5pbmNsdWRlKCc6
JykpIHsKKyAgICAgICAgcmV0dXJuICghZWxlbWVudC5hdHRyaWJ1dGVzIHx8ICFlbGVtZW50LmF0
dHJpYnV0ZXNbbmFtZV0pID8gbnVsbCA6CisgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFt
ZV0udmFsdWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0
ZShuYW1lKTsKKyAgfSwKKworICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFt
ZSwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgYXR0cmlidXRl
cyA9IHsgfSwgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZTsKKworICAg
IGlmICh0eXBlb2YgbmFtZSA9PSAnb2JqZWN0JykgYXR0cmlidXRlcyA9IG5hbWU7CisgICAgZWxz
ZSBhdHRyaWJ1dGVzW25hbWVdID0gT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSA/IHRydWUgOiB2
YWx1ZTsKKworICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykgeworICAgICAgbmFtZSA9
IHQubmFtZXNbYXR0cl0gfHwgYXR0cjsKKyAgICAgIHZhbHVlID0gYXR0cmlidXRlc1thdHRyXTsK
KyAgICAgIGlmICh0LnZhbHVlc1thdHRyXSkgbmFtZSA9IHQudmFsdWVzW2F0dHJdKGVsZW1lbnQs
IHZhbHVlKTsKKyAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwpCisg
ICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgZWxzZSBpZiAodmFs
dWUgPT09IHRydWUpCisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUpOwor
ICAgICAgZWxzZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgfQorICAg
IHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldEhlaWdodDogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHJldHVybiBFbGVtZW50LmdldERpbWVuc2lvbnMoZWxlbWVudCkuaGVpZ2h0OworICB9
LAorCisgIGdldFdpZHRoOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQu
Z2V0RGltZW5zaW9ucyhlbGVtZW50KS53aWR0aDsKKyAgfSwKKworICBjbGFzc05hbWVzOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVu
dCk7CisgIH0sCisKKyAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUp
IHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICB2YXIgZWxl
bWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOworICAgIHJldHVybiAoZWxlbWVudENs
YXNzTmFtZS5sZW5ndGggPiAwICYmIChlbGVtZW50Q2xhc3NOYW1lID09IGNsYXNzTmFtZSB8fAor
ICAgICAgbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpLnRlc3Qo
ZWxlbWVudENsYXNzTmFtZSkpKTsKKyAgfSwKKworICBhZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVs
ZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0
dXJuOworICAgIGlmICghRWxlbWVudC5oYXNDbGFzc05hbWUoZWxlbWVudCwgY2xhc3NOYW1lKSkK
KyAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/ICcgJyA6ICcn
KSArIGNsYXNzTmFtZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZW1vdmVDbGFz
c05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQg
PSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5j
bGFzc05hbWUucmVwbGFjZSgKKyAgICAgIG5ldyBSZWdFeHAoIihefFxccyspIiArIGNsYXNzTmFt
ZSArICIoXFxzK3wkKSIpLCAnICcpLnN0cmlwKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0s
CisKKyAgdG9nZ2xlQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAg
ICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICByZXR1cm4gRWxlbWVu
dFtFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVtZW50LCBjbGFzc05hbWUpID8KKyAgICAgICdyZW1v
dmVDbGFzc05hbWUnIDogJ2FkZENsYXNzTmFtZSddKGVsZW1lbnQsIGNsYXNzTmFtZSk7CisgIH0s
CisKKyAgY2xlYW5XaGl0ZXNwYWNlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgdmFyIG5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgd2hp
bGUgKG5vZGUpIHsKKyAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAg
ICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICEvXFMvLnRlc3Qobm9kZS5ub2RlVmFsdWUpKQor
ICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpOworICAgICAgbm9kZSA9IG5leHROb2Rl
OworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBlbXB0eTogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLmlubmVySFRNTC5ibGFuaygpOworICB9
LAorCisgIGRlc2NlbmRhbnRPZjogZnVuY3Rpb24oZWxlbWVudCwgYW5jZXN0b3IpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KSwgYW5jZXN0b3IgPSAkKGFuY2VzdG9yKTsKKworICAgIGlmIChl
bGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKQorICAgICAgcmV0dXJuIChlbGVtZW50LmNv
bXBhcmVEb2N1bWVudFBvc2l0aW9uKGFuY2VzdG9yKSAmIDgpID09PSA4OworCisgICAgaWYgKGFu
Y2VzdG9yLmNvbnRhaW5zKQorICAgICAgcmV0dXJuIGFuY2VzdG9yLmNvbnRhaW5zKGVsZW1lbnQp
ICYmIGFuY2VzdG9yICE9PSBlbGVtZW50OworCisgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50
LnBhcmVudE5vZGUpCisgICAgICBpZiAoZWxlbWVudCA9PSBhbmNlc3RvcikgcmV0dXJuIHRydWU7
CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgc2Nyb2xsVG86IGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0gRWxlbWVudC5j
dW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOworICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NbMF0sIHBv
c1sxXSk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0U3R5bGU6IGZ1bmN0aW9u
KGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgc3R5bGUg
PSBzdHlsZSA9PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7CisgICAg
dmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2YWx1ZSB8fCB2YWx1
ZSA9PSAnYXV0bycpIHsKKyAgICAgIHZhciBjc3MgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRD
b21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOworICAgICAgdmFsdWUgPSBjc3MgPyBjc3Nbc3R5
bGVdIDogbnVsbDsKKyAgICB9CisgICAgaWYgKHN0eWxlID09ICdvcGFjaXR5JykgcmV0dXJuIHZh
bHVlID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiAxLjA7CisgICAgcmV0dXJuIHZhbHVlID09ICdhdXRv
JyA/IG51bGwgOiB2YWx1ZTsKKyAgfSwKKworICBnZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0U3R5bGUoJ29wYWNpdHknKTsKKyAgfSwKKwor
ICBzZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzKSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgdmFyIGVsZW1lbnRTdHlsZSA9IGVsZW1lbnQuc3R5bGUsIG1hdGNoOwor
ICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc3R5bGVzKSkgeworICAgICAgZWxlbWVudC5zdHlsZS5j
c3NUZXh0ICs9ICc7JyArIHN0eWxlczsKKyAgICAgIHJldHVybiBzdHlsZXMuaW5jbHVkZSgnb3Bh
Y2l0eScpID8KKyAgICAgICAgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlcy5tYXRjaCgvb3BhY2l0
eTpccyooXGQ/XC4/XGQqKS8pWzFdKSA6IGVsZW1lbnQ7CisgICAgfQorICAgIGZvciAodmFyIHBy
b3BlcnR5IGluIHN0eWxlcykKKyAgICAgIGlmIChwcm9wZXJ0eSA9PSAnb3BhY2l0eScpIGVsZW1l
bnQuc2V0T3BhY2l0eShzdHlsZXNbcHJvcGVydHldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZWxl
bWVudFN0eWxlWyhwcm9wZXJ0eSA9PSAnZmxvYXQnIHx8IHByb3BlcnR5ID09ICdjc3NGbG9hdCcp
ID8KKyAgICAgICAgICAoT2JqZWN0LmlzVW5kZWZpbmVkKGVsZW1lbnRTdHlsZS5zdHlsZUZsb2F0
KSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcpIDoKKyAgICAgICAgICAgIHByb3BlcnR5XSA9
IHN0eWxlc1twcm9wZXJ0eV07CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzZXRP
cGFjaXR5OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09
PSAnJykgPyAnJyA6CisgICAgICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBnZXREaW1lbnNpb25zOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGRpc3BsYXkgPSBFbGVtZW50
LmdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5Jyk7CisgICAgaWYgKGRpc3BsYXkgIT0gJ25vbmUn
ICYmIGRpc3BsYXkgIT0gbnVsbCkgLy8gU2FmYXJpIGJ1ZworICAgICAgcmV0dXJuIHt3aWR0aDog
ZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodH07CisKKyAg
ICB2YXIgZWxzID0gZWxlbWVudC5zdHlsZTsKKyAgICB2YXIgb3JpZ2luYWxWaXNpYmlsaXR5ID0g
ZWxzLnZpc2liaWxpdHk7CisgICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBlbHMucG9zaXRpb247
CisgICAgdmFyIG9yaWdpbmFsRGlzcGxheSA9IGVscy5kaXNwbGF5OworICAgIGVscy52aXNpYmls
aXR5ID0gJ2hpZGRlbic7CisgICAgaWYgKG9yaWdpbmFsUG9zaXRpb24gIT0gJ2ZpeGVkJykgLy8g
U3dpdGNoaW5nIGZpeGVkIHRvIGFic29sdXRlIGNhdXNlcyBpc3N1ZXMgaW4gU2FmYXJpCisgICAg
ICBlbHMucG9zaXRpb24gPSAnYWJzb2x1dGUnOworICAgIGVscy5kaXNwbGF5ID0gJ2Jsb2NrJzsK
KyAgICB2YXIgb3JpZ2luYWxXaWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIG9y
aWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CisgICAgZWxzLmRpc3BsYXkgPSBv
cmlnaW5hbERpc3BsYXk7CisgICAgZWxzLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjsKKyAg
ICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTsKKyAgICByZXR1cm4ge3dpZHRo
OiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0fTsKKyAgfSwKKworICBtYWtl
UG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgIHZhciBwb3MgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOwor
ICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgeworICAgICAgZWxlbWVudC5fbWFkZVBv
c2l0aW9uZWQgPSB0cnVlOworICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2
ZSc7CisgICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKKyAgICAgICAgZWxlbWVu
dC5zdHlsZS50b3AgPSAwOworICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOworICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1bmRvUG9zaXRpb25lZDog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChl
bGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQg
PSB1bmRlZmluZWQ7CisgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0KKyAgICAgICAgZWxl
bWVudC5zdHlsZS50b3AgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPQorICAgICAgICBl
bGVtZW50LnN0eWxlLmJvdHRvbSA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsK
KyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgbWFrZUNsaXBwaW5nOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1l
bnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IEVs
ZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwgJ2F1dG8nOworICAgIGlmIChl
bGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicpCisgICAgICBlbGVtZW50LnN0eWxlLm92ZXJm
bG93ID0gJ2hpZGRlbic7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdW5kb0NsaXBw
aW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuIGVsZW1lbnQ7CisgICAgZWxlbWVudC5zdHls
ZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93ID09ICdhdXRvJyA/ICcnIDogZWxlbWVudC5f
b3ZlcmZsb3c7CisgICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOworICAgIHJldHVybiBlbGVt
ZW50OworICB9LAorCisgIGN1bXVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0g
ZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRM
ZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3
aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUws
IHZhbHVlVCk7CisgIH0sCisKKyAgcG9zaXRpb25lZE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVl
VCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9m
ZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAg
ICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNh
c2UoKSA9PSAnQk9EWScpIGJyZWFrOworICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUo
ZWxlbWVudCwgJ3Bvc2l0aW9uJyk7CisgICAgICAgIGlmIChwICE9PSAnc3RhdGljJykgYnJlYWs7
CisgICAgICB9CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3Jl
dHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChFbGVtZW50
LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHJldHVybiBlbGVt
ZW50OworCisgICAgdmFyIG9mZnNldHMgPSBFbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoZWxlbWVu
dCk7CisgICAgdmFyIHRvcCAgICAgPSBvZmZzZXRzWzFdOworICAgIHZhciBsZWZ0ICAgID0gb2Zm
c2V0c1swXTsKKyAgICB2YXIgd2lkdGggICA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFy
IGhlaWdodCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKworICAgIGVsZW1lbnQuX29yaWdpbmFs
TGVmdCAgID0gbGVmdCAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0ICB8fCAwKTsKKyAg
ICBlbGVtZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5
bGUudG9wIHx8IDApOworICAgIGVsZW1lbnQuX29yaWdpbmFsV2lkdGggID0gZWxlbWVudC5zdHls
ZS53aWR0aDsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVp
Z2h0OworCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgZWxl
bWVudC5zdHlsZS50b3AgICAgPSB0b3AgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUubGVmdCAg
ID0gbGVmdCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSB3aWR0aCArICdweCc7
CisgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAn
cG9zaXRpb24nKSA9PSAncmVsYXRpdmUnKSByZXR1cm4gZWxlbWVudDsKKworICAgIGVsZW1lbnQu
c3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAgIHZhciB0b3AgID0gcGFyc2VGbG9hdChl
bGVtZW50LnN0eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVudC5fb3JpZ2luYWxUb3AgfHwgMCk7Cisg
ICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVt
ZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7CisKKyAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRv
cCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsKKyAgICBl
bGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0OworICAgIGVsZW1l
bnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5fb3JpZ2luYWxXaWR0aDsKKyAgICByZXR1cm4gZWxl
bWVudDsKKyAgfSwKKworICBjdW11bGF0aXZlU2Nyb2xsT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFs
dWVUICs9IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQu
c2Nyb2xsTGVmdCB8fCAwOworICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKyAg
ICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZh
bHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBnZXRPZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHJldHVybiAkKGVsZW1lbnQub2Zm
c2V0UGFyZW50KTsKKyAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gJChl
bGVtZW50KTsKKworICAgIHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYg
ZWxlbWVudCAhPSBkb2N1bWVudC5ib2R5KQorICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxl
bWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpCisgICAgICAgIHJldHVybiAkKGVsZW1lbnQp
OworCisgICAgcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7CisgIH0sCisKKyAgdmlld3BvcnRPZmZz
ZXQ6IGZ1bmN0aW9uKGZvckVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0g
MDsKKworICAgIHZhciBlbGVtZW50ID0gZm9yRWxlbWVudDsKKyAgICBkbyB7CisgICAgICB2YWx1
ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5v
ZmZzZXRMZWZ0IHx8IDA7CisKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1
bWVudC5ib2R5ICYmCisgICAgICAgIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9u
JykgPT0gJ2Fic29sdXRlJykgYnJlYWs7CisKKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVu
dC5vZmZzZXRQYXJlbnQpOworCisgICAgZWxlbWVudCA9IGZvckVsZW1lbnQ7CisgICAgZG8gewor
ICAgICAgaWYgKCFQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSB8fCAoZWxlbWVudC50YWdOYW1lICYm
IChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PSAnQk9EWScpKSkgeworICAgICAgICB2
YWx1ZVQgLT0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICAgIHZhbHVlTCAtPSBlbGVt
ZW50LnNjcm9sbExlZnQgfHwgMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxl
bWVudC5wYXJlbnROb2RlKTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFs
dWVMLCB2YWx1ZVQpOworICB9LAorCisgIGNsb25lUG9zaXRpb246IGZ1bmN0aW9uKGVsZW1lbnQs
IHNvdXJjZSkgeworICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CisgICAgICBzZXRM
ZWZ0OiAgICB0cnVlLAorICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKKyAgICAgIHNldFdpZHRoOiAg
IHRydWUsCisgICAgICBzZXRIZWlnaHQ6ICB0cnVlLAorICAgICAgb2Zmc2V0VG9wOiAgMCwKKyAg
ICAgIG9mZnNldExlZnQ6IDAKKyAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsKKworICAgIHNv
dXJjZSA9ICQoc291cmNlKTsKKyAgICB2YXIgcCA9IEVsZW1lbnQudmlld3BvcnRPZmZzZXQoc291
cmNlKTsKKworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBkZWx0YSA9IFswLCAw
XTsKKyAgICB2YXIgcGFyZW50ID0gbnVsbDsKKyAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVt
ZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSB7CisgICAgICBwYXJlbnQgPSBFbGVtZW50
LmdldE9mZnNldFBhcmVudChlbGVtZW50KTsKKyAgICAgIGRlbHRhID0gRWxlbWVudC52aWV3cG9y
dE9mZnNldChwYXJlbnQpOworICAgIH0KKworICAgIGlmIChwYXJlbnQgPT0gZG9jdW1lbnQuYm9k
eSkgeworICAgICAgZGVsdGFbMF0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRMZWZ0OworICAgICAg
ZGVsdGFbMV0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7CisgICAgfQorCisgICAgaWYgKG9w
dGlvbnMuc2V0TGVmdCkgICBlbGVtZW50LnN0eWxlLmxlZnQgID0gKHBbMF0gLSBkZWx0YVswXSAr
IG9wdGlvbnMub2Zmc2V0TGVmdCkgKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldFRvcCkgICAg
ZWxlbWVudC5zdHlsZS50b3AgICA9IChwWzFdIC0gZGVsdGFbMV0gKyBvcHRpb25zLm9mZnNldFRv
cCkgKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldFdpZHRoKSAgZWxlbWVudC5zdHlsZS53aWR0
aCA9IHNvdXJjZS5vZmZzZXRXaWR0aCArICdweCc7CisgICAgaWYgKG9wdGlvbnMuc2V0SGVpZ2h0
KSBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQgKyAncHgnOworICAg
IHJldHVybiBlbGVtZW50OworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9k
cywgeworICBnZXRFbGVtZW50c0J5U2VsZWN0b3I6IEVsZW1lbnQuTWV0aG9kcy5zZWxlY3QsCisK
KyAgY2hpbGRFbGVtZW50czogRWxlbWVudC5NZXRob2RzLmltbWVkaWF0ZURlc2NlbmRhbnRzCit9
KTsKKworRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zID0geworICB3cml0ZTogeworICAg
IG5hbWVzOiB7CisgICAgICBjbGFzc05hbWU6ICdjbGFzcycsCisgICAgICBodG1sRm9yOiAgICdm
b3InCisgICAgfSwKKyAgICB2YWx1ZXM6IHsgfQorICB9Cit9OworCitpZiAoUHJvdG90eXBlLkJy
b3dzZXIuT3BlcmEpIHsKKyAgRWxlbWVudC5NZXRob2RzLmdldFN0eWxlID0gRWxlbWVudC5NZXRo
b2RzLmdldFN0eWxlLndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCwgc3R5bGUp
IHsKKyAgICAgIHN3aXRjaCAoc3R5bGUpIHsKKyAgICAgICAgY2FzZSAnbGVmdCc6IGNhc2UgJ3Rv
cCc6IGNhc2UgJ3JpZ2h0JzogY2FzZSAnYm90dG9tJzoKKyAgICAgICAgICBpZiAocHJvY2VlZChl
bGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHJldHVybiBudWxsOworICAgICAgICBj
YXNlICdoZWlnaHQnOiBjYXNlICd3aWR0aCc6CisgICAgICAgICAgaWYgKCFFbGVtZW50LnZpc2li
bGUoZWxlbWVudCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgdmFyIGRpbSA9IHBhcnNlSW50
KHByb2NlZWQoZWxlbWVudCwgc3R5bGUpLCAxMCk7CisKKyAgICAgICAgICBpZiAoZGltICE9PSBl
bGVtZW50WydvZmZzZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSkKKyAgICAgICAgICAgIHJldHVy
biBkaW0gKyAncHgnOworCisgICAgICAgICAgdmFyIHByb3BlcnRpZXM7CisgICAgICAgICAgaWYg
KHN0eWxlID09PSAnaGVpZ2h0JykgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVy
LXRvcC13aWR0aCcsICdwYWRkaW5nLXRvcCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctYm90dG9t
JywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7
CisgICAgICAgICAgICBwcm9wZXJ0aWVzID0gWydib3JkZXItbGVmdC13aWR0aCcsICdwYWRkaW5n
LWxlZnQnLAorICAgICAgICAgICAgICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13aWR0
aCddOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5pbmplY3QoZGlt
LCBmdW5jdGlvbihtZW1vLCBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdmFyIHZhbCA9IHByb2Nl
ZWQoZWxlbWVudCwgcHJvcGVydHkpOworICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/
IG1lbW8gOiBtZW1vIC0gcGFyc2VJbnQodmFsLCAxMCk7CisgICAgICAgICAgfSkgKyAncHgnOwor
ICAgICAgICBkZWZhdWx0OiByZXR1cm4gcHJvY2VlZChlbGVtZW50LCBzdHlsZSk7CisgICAgICB9
CisgICAgfQorICApOworCisgIEVsZW1lbnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlID0gRWxlbWVu
dC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVt
ZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJldHVy
biBlbGVtZW50LnRpdGxlOworICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCwgYXR0cmlidXRl
KTsKKyAgICB9CisgICk7Cit9CisKK2Vsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7Cisg
IEVsZW1lbnQuTWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQgPSBFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zm
c2V0UGFyZW50LndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgICB0cnkgeyBlbGVtZW50Lm9mZnNldFBhcmVudCB9
CisgICAgICBjYXRjaChlKSB7IHJldHVybiAkKGRvY3VtZW50LmJvZHkpIH0KKyAgICAgIHZhciBw
b3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CisgICAgICBpZiAocG9zaXRp
b24gIT09ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsKKyAgICAgIGVsZW1lbnQu
c2V0U3R5bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTsKKyAgICAgIHZhciB2YWx1ZSA9IHBy
b2NlZWQoZWxlbWVudCk7CisgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246IHBvc2l0
aW9uIH0pOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgKTsKKworICAkdygncG9zaXRp
b25lZE9mZnNldCB2aWV3cG9ydE9mZnNldCcpLmVhY2goZnVuY3Rpb24obWV0aG9kKSB7CisgICAg
RWxlbWVudC5NZXRob2RzW21ldGhvZF0gPSBFbGVtZW50Lk1ldGhvZHNbbWV0aG9kXS53cmFwKAor
ICAgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAgICBlbGVtZW50ID0gJChl
bGVtZW50KTsKKyAgICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQgfQorICAgICAgICBj
YXRjaChlKSB7IHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoMCwwKSB9CisgICAgICAgIHZh
ciBwb3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CisgICAgICAgIGlmIChw
b3NpdGlvbiAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgICB2
YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKTsKKyAgICAgICAgaWYg
KG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJykgPT09ICdm
aXhlZCcpCisgICAgICAgICAgb2Zmc2V0UGFyZW50LnNldFN0eWxlKHsgem9vbTogMSB9KTsKKyAg
ICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH0pOworICAgICAg
ICB2YXIgdmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgICBlbGVtZW50LnNldFN0eWxl
KHsgcG9zaXRpb246IHBvc2l0aW9uIH0pOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9
CisgICAgKTsKKyAgfSk7CisKKyAgRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQgPSBF
bGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldC53cmFwKAorICAgIGZ1bmN0aW9uKHByb2Nl
ZWQsIGVsZW1lbnQpIHsKKyAgICAgIHRyeSB7IGVsZW1lbnQub2Zmc2V0UGFyZW50IH0KKyAgICAg
IGNhdGNoKGUpIHsgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgwLDApIH0KKyAgICAgIHJl
dHVybiBwcm9jZWVkKGVsZW1lbnQpOworICAgIH0KKyAgKTsKKworICBFbGVtZW50Lk1ldGhvZHMu
Z2V0U3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIHN0eWxlID0gKHN0eWxlID09ICdmbG9hdCcgfHwgc3R5bGUgPT0gJ2Nzc0Zs
b2F0JykgPyAnc3R5bGVGbG9hdCcgOiBzdHlsZS5jYW1lbGl6ZSgpOworICAgIHZhciB2YWx1ZSA9
IGVsZW1lbnQuc3R5bGVbc3R5bGVdOworICAgIGlmICghdmFsdWUgJiYgZWxlbWVudC5jdXJyZW50
U3R5bGUpIHZhbHVlID0gZWxlbWVudC5jdXJyZW50U3R5bGVbc3R5bGVdOworCisgICAgaWYgKHN0
eWxlID09ICdvcGFjaXR5JykgeworICAgICAgaWYgKHZhbHVlID0gKGVsZW1lbnQuZ2V0U3R5bGUo
J2ZpbHRlcicpIHx8ICcnKS5tYXRjaCgvYWxwaGFcKG9wYWNpdHk9KC4qKVwpLykpCisgICAgICAg
IGlmICh2YWx1ZVsxXSkgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWVbMV0pIC8gMTAwOworICAgICAg
cmV0dXJuIDEuMDsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gJ2F1dG8nKSB7CisgICAgICBp
ZiAoKHN0eWxlID09ICd3aWR0aCcgfHwgc3R5bGUgPT0gJ2hlaWdodCcpICYmIChlbGVtZW50Lmdl
dFN0eWxlKCdkaXNwbGF5JykgIT0gJ25vbmUnKSkKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRbJ29m
ZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCldICsgJ3B4JzsKKyAgICAgIHJldHVybiBudWxsOwor
ICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH07CisKKyAgRWxlbWVudC5NZXRob2RzLnNldE9w
YWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGZ1bmN0aW9uIHN0cmlwQWxw
aGEoZmlsdGVyKXsKKyAgICAgIHJldHVybiBmaWx0ZXIucmVwbGFjZSgvYWxwaGFcKFteXCldKlwp
L2dpLCcnKTsKKyAgICB9CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGN1cnJl
bnRTdHlsZSA9IGVsZW1lbnQuY3VycmVudFN0eWxlOworICAgIGlmICgoY3VycmVudFN0eWxlICYm
ICFjdXJyZW50U3R5bGUuaGFzTGF5b3V0KSB8fAorICAgICAgKCFjdXJyZW50U3R5bGUgJiYgZWxl
bWVudC5zdHlsZS56b29tID09ICdub3JtYWwnKSkKKyAgICAgICAgZWxlbWVudC5zdHlsZS56b29t
ID0gMTsKKworICAgIHZhciBmaWx0ZXIgPSBlbGVtZW50LmdldFN0eWxlKCdmaWx0ZXInKSwgc3R5
bGUgPSBlbGVtZW50LnN0eWxlOworICAgIGlmICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykg
eworICAgICAgKGZpbHRlciA9IHN0cmlwQWxwaGEoZmlsdGVyKSkgPworICAgICAgICBzdHlsZS5m
aWx0ZXIgPSBmaWx0ZXIgOiBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbHRlcicpOworICAgICAg
cmV0dXJuIGVsZW1lbnQ7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDAwMDEpIHZhbHVlID0g
MDsKKyAgICBzdHlsZS5maWx0ZXIgPSBzdHJpcEFscGhhKGZpbHRlcikgKworICAgICAgJ2FscGhh
KG9wYWNpdHk9JyArICh2YWx1ZSAqIDEwMCkgKyAnKSc7CisgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
IH07CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zID0gKGZ1bmN0aW9uKCl7CisK
KyAgICB2YXIgY2xhc3NQcm9wID0gJ2NsYXNzTmFtZSc7CisgICAgdmFyIGZvclByb3AgPSAnZm9y
JzsKKworICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCisgICAg
ZWwuc2V0QXR0cmlidXRlKGNsYXNzUHJvcCwgJ3gnKTsKKworICAgIGlmIChlbC5jbGFzc05hbWUg
IT09ICd4JykgeworICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsICd4Jyk7CisgICAgICBp
ZiAoZWwuY2xhc3NOYW1lID09PSAneCcpIHsKKyAgICAgICAgY2xhc3NQcm9wID0gJ2NsYXNzJzsK
KyAgICAgIH0KKyAgICB9CisgICAgZWwgPSBudWxsOworCisgICAgZWwgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdsYWJlbCcpOworICAgIGVsLnNldEF0dHJpYnV0ZShmb3JQcm9wLCAneCcpOwor
ICAgIGlmIChlbC5odG1sRm9yICE9PSAneCcpIHsKKyAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHRt
bEZvcicsICd4Jyk7CisgICAgICBpZiAoZWwuaHRtbEZvciA9PT0gJ3gnKSB7CisgICAgICAgIGZv
clByb3AgPSAnaHRtbEZvcic7CisgICAgICB9CisgICAgfQorICAgIGVsID0gbnVsbDsKKworICAg
IHJldHVybiB7CisgICAgICByZWFkOiB7CisgICAgICAgIG5hbWVzOiB7CisgICAgICAgICAgJ2Ns
YXNzJzogICAgICBjbGFzc1Byb3AsCisgICAgICAgICAgJ2NsYXNzTmFtZSc6ICBjbGFzc1Byb3As
CisgICAgICAgICAgJ2Zvcic6ICAgICAgICBmb3JQcm9wLAorICAgICAgICAgICdodG1sRm9yJzog
ICAgZm9yUHJvcAorICAgICAgICB9LAorICAgICAgICB2YWx1ZXM6IHsKKyAgICAgICAgICBfZ2V0
QXR0cjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgICByZXR1cm4g
ZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgICB9LAorICAgICAgICAg
IF9nZXRBdHRyMjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgICBy
ZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAyKTsKKyAgICAgICAgICB9LAor
ICAgICAgICAgIF9nZXRBdHRyTm9kZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7Cisg
ICAgICAgICAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUp
OworICAgICAgICAgICAgcmV0dXJuIG5vZGUgPyBub2RlLnZhbHVlIDogIiI7CisgICAgICAgICAg
fSwKKyAgICAgICAgICBfZ2V0RXY6IChmdW5jdGlvbigpeworCisgICAgICAgICAgICB2YXIgZWwg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgICAgIGVsLm9uY2xpY2sg
PSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVsLmdl
dEF0dHJpYnV0ZSgnb25jbGljaycpOworICAgICAgICAgICAgdmFyIGY7CisKKyAgICAgICAgICAg
IGlmIChTdHJpbmcodmFsdWUpLmluZGV4T2YoJ3snKSA+IC0xKSB7CisgICAgICAgICAgICAgIGYg
PSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1
dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIGlm
ICghYXR0cmlidXRlKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBh
dHRyaWJ1dGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1
dGUuc3BsaXQoJ3snKVsxXTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUu
c3BsaXQoJ30nKVswXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLnN0cmlwKCk7
CisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2
YWx1ZSA9PT0gJycpIHsKKyAgICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJp
YnV0ZSkgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRl
KGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpIHJldHVybiBudWxs
OworICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuc3RyaXAoKTsKKyAgICAgICAgICAg
ICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsID0gbnVsbDsKKyAgICAgICAgICAg
IHJldHVybiBmOworICAgICAgICAgIH0pKCksCisgICAgICAgICAgX2ZsYWc6IGZ1bmN0aW9uKGVs
ZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgcmV0dXJuICQoZWxlbWVudCkuaGFzQXR0
cmlidXRlKGF0dHJpYnV0ZSkgPyBhdHRyaWJ1dGUgOiBudWxsOworICAgICAgICAgIH0sCisgICAg
ICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVt
ZW50LnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICB9LAorICAgICAgICAg
IHRpdGxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50
aXRsZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0pKCk7CisK
KyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlID0geworICAgIG5hbWVzOiBP
YmplY3QuZXh0ZW5kKHsKKyAgICAgIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLAorICAgICAg
Y2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycKKyAgICB9LCBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFu
c2xhdGlvbnMucmVhZC5uYW1lcyksCisgICAgdmFsdWVzOiB7CisgICAgICBjaGVja2VkOiBmdW5j
dGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVl
OworICAgICAgfSwKKworICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7Cisg
ICAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IHZhbHVlID8gdmFsdWUgOiAnJzsKKyAgICAg
IH0KKyAgICB9CisgIH07CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhcyA9
IHt9OworCisgICR3KCdjb2xTcGFuIHJvd1NwYW4gdkFsaWduIGRhdGVUaW1lIGFjY2Vzc0tleSB0
YWJJbmRleCAnICsKKyAgICAgICdlbmNUeXBlIG1heExlbmd0aCByZWFkT25seSBsb25nRGVzYyBm
cmFtZUJvcmRlcicpLmVhY2goZnVuY3Rpb24oYXR0cikgeworICAgIEVsZW1lbnQuX2F0dHJpYnV0
ZVRyYW5zbGF0aW9ucy53cml0ZS5uYW1lc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsKKyAg
ICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMuaGFzW2F0dHIudG9Mb3dlckNhc2UoKV0g
PSBhdHRyOworICB9KTsKKworICAoZnVuY3Rpb24odikgeworICAgIE9iamVjdC5leHRlbmQodiwg
eworICAgICAgaHJlZjogICAgICAgIHYuX2dldEF0dHIyLAorICAgICAgc3JjOiAgICAgICAgIHYu
X2dldEF0dHIyLAorICAgICAgdHlwZTogICAgICAgIHYuX2dldEF0dHIsCisgICAgICBhY3Rpb246
ICAgICAgdi5fZ2V0QXR0ck5vZGUsCisgICAgICBkaXNhYmxlZDogICAgdi5fZmxhZywKKyAgICAg
IGNoZWNrZWQ6ICAgICB2Ll9mbGFnLAorICAgICAgcmVhZG9ubHk6ICAgIHYuX2ZsYWcsCisgICAg
ICBtdWx0aXBsZTogICAgdi5fZmxhZywKKyAgICAgIG9ubG9hZDogICAgICB2Ll9nZXRFdiwKKyAg
ICAgIG9udW5sb2FkOiAgICB2Ll9nZXRFdiwKKyAgICAgIG9uY2xpY2s6ICAgICB2Ll9nZXRFdiwK
KyAgICAgIG9uZGJsY2xpY2s6ICB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2Vkb3duOiB2Ll9nZXRF
diwKKyAgICAgIG9ubW91c2V1cDogICB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2VvdmVyOiB2Ll9n
ZXRFdiwKKyAgICAgIG9ubW91c2Vtb3ZlOiB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2VvdXQ6ICB2
Ll9nZXRFdiwKKyAgICAgIG9uZm9jdXM6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uYmx1cjogICAg
ICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5cHJlc3M6ICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5ZG93
bjogICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5dXA6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uc3Vi
bWl0OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9ucmVzZXQ6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9u
c2VsZWN0OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9uY2hhbmdlOiAgICB2Ll9nZXRFdgorICAgIH0p
OworICB9KShFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC52YWx1ZXMpOworCisg
IGlmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKSB7CisgICAg
KGZ1bmN0aW9uKCkgeworICAgICAgZnVuY3Rpb24gX2Rlc2NlbmRhbnRzKGVsZW1lbnQpIHsKKyAg
ICAgICAgdmFyIG5vZGVzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpLCByZXN1
bHRzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07
IGkrKykKKyAgICAgICAgICBpZiAobm9kZS50YWdOYW1lICE9PSAiISIpIC8vIEZpbHRlciBvdXQg
Y29tbWVudCBub2Rlcy4KKyAgICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgICB9CisKKyAgICAgIEVsZW1lbnQuTWV0aG9kcy5kb3duID0g
ZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICAgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiBl
bGVtZW50LmZpcnN0RGVzY2VuZGFudCgpOworICAgICAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVy
KGV4cHJlc3Npb24pID8gX2Rlc2NlbmRhbnRzKGVsZW1lbnQpW2V4cHJlc3Npb25dIDoKKyAgICAg
ICAgICBFbGVtZW50LnNlbGVjdChlbGVtZW50LCBleHByZXNzaW9uKVtpbmRleCB8fCAwXTsKKyAg
ICAgIH0KKyAgICB9KSgpOworICB9CisKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIu
R2Vja28gJiYgL3J2OjFcLjhcLjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKKyAgRWxl
bWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1
ZSA9PSAxKSA/IDAuOTk5OTk5IDoKKyAgICAgICh2YWx1ZSA9PT0gJycpID8gJycgOiAodmFsdWUg
PCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKK30KKwor
ZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgIEVsZW1lbnQuTWV0aG9kcy5z
ZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChl
bGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSB8fCB2YWx1
ZSA9PT0gJycpID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7CisK
KyAgICBpZiAodmFsdWUgPT0gMSkKKyAgICAgIGlmKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2Fz
ZSgpID09ICdJTUcnICYmIGVsZW1lbnQud2lkdGgpIHsKKyAgICAgICAgZWxlbWVudC53aWR0aCsr
OyBlbGVtZW50LndpZHRoLS07CisgICAgICB9IGVsc2UgdHJ5IHsKKyAgICAgICAgdmFyIG4gPSBk
b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpOworICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxk
KG4pOworICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG4pOworICAgICAgfSBjYXRjaCAoZSkg
eyB9CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICBFbGVtZW50Lk1ldGhvZHMuY3Vt
dWxhdGl2ZU9mZnNldCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwg
dmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3Ag
IHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisgICAgICBp
ZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkKKyAgICAgICAgaWYgKEVs
ZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7
CisKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAgICB9IHdoaWxlIChl
bGVtZW50KTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1
ZVQpOworICB9OworfQorCitpZiAoJ291dGVySFRNTCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVt
ZW50KSB7CisgIEVsZW1lbnQuTWV0aG9kcy5yZXBsYWNlID0gZnVuY3Rpb24oZWxlbWVudCwgY29u
dGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgaWYgKGNvbnRlbnQgJiYg
Y29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAgIGlm
IChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAgICBlbGVtZW50LnBhcmVudE5vZGUu
cmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOworICAgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
ICAgfQorCisgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CisgICAgdmFyIHBh
cmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSwgdGFnTmFtZSA9IHBhcmVudC50YWdOYW1lLnRvVXBw
ZXJDYXNlKCk7CisKKyAgICBpZiAoRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3Nb
dGFnTmFtZV0pIHsKKyAgICAgIHZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dCgpOworICAg
ICAgdmFyIGZyYWdtZW50cyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVu
dCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKKyAgICAgIHBhcmVudC5yZW1vdmVD
aGlsZChlbGVtZW50KTsKKyAgICAgIGlmIChuZXh0U2libGluZykKKyAgICAgICAgZnJhZ21lbnRz
LmVhY2goZnVuY3Rpb24obm9kZSkgeyBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJs
aW5nKSB9KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnJhZ21lbnRzLmVhY2goZnVuY3Rpb24obm9k
ZSkgeyBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSkgfSk7CisgICAgfQorICAgIGVsc2UgZWxlbWVu
dC5vdXRlckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworCisgICAgY29udGVudC5ldmFs
U2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07
Cit9CisKK0VsZW1lbnQuX3JldHVybk9mZnNldCA9IGZ1bmN0aW9uKGwsIHQpIHsKKyAgdmFyIHJl
c3VsdCA9IFtsLCB0XTsKKyAgcmVzdWx0LmxlZnQgPSBsOworICByZXN1bHQudG9wID0gdDsKKyAg
cmV0dXJuIHJlc3VsdDsKK307CisKK0VsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxl
bWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGh0bWwpIHsKKyAgdmFyIGRpdiA9IG5ldyBFbGVtZW50
KCdkaXYnKSwgdCA9IEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzW3RhZ05hbWVd
OworICBpZiAodCkgeworICAgIGRpdi5pbm5lckhUTUwgPSB0WzBdICsgaHRtbCArIHRbMV07Cisg
ICAgdFsyXS50aW1lcyhmdW5jdGlvbigpIHsgZGl2ID0gZGl2LmZpcnN0Q2hpbGQgfSk7CisgIH0g
ZWxzZSBkaXYuaW5uZXJIVE1MID0gaHRtbDsKKyAgcmV0dXJuICRBKGRpdi5jaGlsZE5vZGVzKTsK
K307CisKK0VsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucyA9IHsKKyAgYmVmb3JlOiBmdW5j
dGlvbihlbGVtZW50LCBub2RlKSB7CisgICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9y
ZShub2RlLCBlbGVtZW50KTsKKyAgfSwKKyAgdG9wOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7
CisgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudC5maXJzdENoaWxkKTsKKyAg
fSwKKyAgYm90dG9tOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7CisgICAgZWxlbWVudC5hcHBl
bmRDaGlsZChub2RlKTsKKyAgfSwKKyAgYWZ0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsK
KyAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQubmV4dFNp
YmxpbmcpOworICB9LAorICB0YWdzOiB7CisgICAgVEFCTEU6ICBbJzx0YWJsZT4nLCAgICAgICAg
ICAgICAgICAnPC90YWJsZT4nLCAgICAgICAgICAgICAgICAgICAxXSwKKyAgICBUQk9EWTogIFsn
PHRhYmxlPjx0Ym9keT4nLCAgICAgICAgICc8L3Rib2R5PjwvdGFibGU+JywgICAgICAgICAgIDJd
LAorICAgIFRSOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj4nLCAgICAgJzwvdHI+PC90Ym9keT48
L3RhYmxlPicsICAgICAgM10sCisgICAgVEQ6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPjx0ZD4n
LCAnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nLCA0XSwKKyAgICBTRUxFQ1Q6IFsnPHNlbGVj
dD4nLCAgICAgICAgICAgICAgICc8L3NlbGVjdD4nLCAgICAgICAgICAgICAgICAgIDFdCisgIH0K
K307CisKKyhmdW5jdGlvbigpIHsKKyAgdmFyIHRhZ3MgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFu
c2xhdGlvbnMudGFnczsKKyAgT2JqZWN0LmV4dGVuZCh0YWdzLCB7CisgICAgVEhFQUQ6IHRhZ3Mu
VEJPRFksCisgICAgVEZPT1Q6IHRhZ3MuVEJPRFksCisgICAgVEg6ICAgIHRhZ3MuVEQKKyAgfSk7
Cit9KSgpOworCitFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkID0geworICBoYXNBdHRyaWJ1dGU6
IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgIGF0dHJpYnV0ZSA9IEVsZW1lbnQu
X2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7CisgICAg
dmFyIG5vZGUgPSAkKGVsZW1lbnQpLmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKyAgICBy
ZXR1cm4gISEobm9kZSAmJiBub2RlLnNwZWNpZmllZCk7CisgIH0KK307CisKK0VsZW1lbnQuTWV0
aG9kcy5CeVRhZyA9IHsgfTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50LCBFbGVtZW50Lk1ldGhv
ZHMpOworCisoZnVuY3Rpb24oZGl2KSB7CisKKyAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1
cmVzLkVsZW1lbnRFeHRlbnNpb25zICYmIGRpdlsnX19wcm90b19fJ10pIHsKKyAgICB3aW5kb3cu
SFRNTEVsZW1lbnQgPSB7IH07CisgICAgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSA9IGRp
dlsnX19wcm90b19fJ107CisgICAgUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0
ZW5zaW9ucyA9IHRydWU7CisgIH0KKworICBkaXYgPSBudWxsOworCit9KShkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdkaXYnKSkKKworRWxlbWVudC5leHRlbmQgPSAoZnVuY3Rpb24oKSB7CisKKyAg
ZnVuY3Rpb24gY2hlY2tEZWZpY2llbmN5KHRhZ05hbWUpIHsKKyAgICBpZiAodHlwZW9mIHdpbmRv
dy5FbGVtZW50ICE9ICd1bmRlZmluZWQnKSB7CisgICAgICB2YXIgcHJvdG8gPSB3aW5kb3cuRWxl
bWVudC5wcm90b3R5cGU7CisgICAgICBpZiAocHJvdG8pIHsKKyAgICAgICAgdmFyIGlkID0gJ18n
ICsgKE1hdGgucmFuZG9tKCkrJycpLnNsaWNlKDIpOworICAgICAgICB2YXIgZWwgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOworICAgICAgICBwcm90b1tpZF0gPSAneCc7CisgICAg
ICAgIHZhciBpc0J1Z2d5ID0gKGVsW2lkXSAhPT0gJ3gnKTsKKyAgICAgICAgZGVsZXRlIHByb3Rv
W2lkXTsKKyAgICAgICAgZWwgPSBudWxsOworICAgICAgICByZXR1cm4gaXNCdWdneTsKKyAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gZXh0ZW5kRWxl
bWVudFdpdGgoZWxlbWVudCwgbWV0aG9kcykgeworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG1l
dGhvZHMpIHsKKyAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOworICAgICAgaWYg
KE9iamVjdC5pc0Z1bmN0aW9uKHZhbHVlKSAmJiAhKHByb3BlcnR5IGluIGVsZW1lbnQpKQorICAg
ICAgICBlbGVtZW50W3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhvZGl6ZSgpOworICAgIH0KKyAgfQor
CisgIHZhciBIVE1MT0JKRUNURUxFTUVOVF9QUk9UT1RZUEVfQlVHR1kgPSBjaGVja0RlZmljaWVu
Y3koJ29iamVjdCcpOworCisgIGlmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmlj
RWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICBpZiAoSFRNTE9CSkVDVEVMRU1FTlRfUFJPVE9UWVBF
X0JVR0dZKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgICBpZiAo
ZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9PSAndW5kZWZp
bmVkJykgeworICAgICAgICAgIHZhciB0ID0gZWxlbWVudC50YWdOYW1lOworICAgICAgICAgIGlm
ICh0ICYmICgvXig/Om9iamVjdHxhcHBsZXR8ZW1iZWQpJC9pLnRlc3QodCkpKSB7CisgICAgICAg
ICAgICBleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOworICAgICAg
ICAgICAgZXh0ZW5kRWxlbWVudFdpdGgoZWxlbWVudCwgRWxlbWVudC5NZXRob2RzLlNpbXVsYXRl
ZCk7CisgICAgICAgICAgICBleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LCBFbGVtZW50Lk1ldGhv
ZHMuQnlUYWdbdC50b1VwcGVyQ2FzZSgpXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIHJldHVybiBlbGVtZW50OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHJvdG90eXBl
Lks7CisgIH0KKworICB2YXIgTWV0aG9kcyA9IHsgfSwgQnlUYWcgPSBFbGVtZW50Lk1ldGhvZHMu
QnlUYWc7CisKKyAgdmFyIGV4dGVuZCA9IE9iamVjdC5leHRlbmQoZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlw
ZSAhPSAndW5kZWZpbmVkJyB8fAorICAgICAgICBlbGVtZW50Lm5vZGVUeXBlICE9IDEgfHwgZWxl
bWVudCA9PSB3aW5kb3cpIHJldHVybiBlbGVtZW50OworCisgICAgdmFyIG1ldGhvZHMgPSBPYmpl
Y3QuY2xvbmUoTWV0aG9kcyksCisgICAgICAgIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9V
cHBlckNhc2UoKTsKKworICAgIGlmIChCeVRhZ1t0YWdOYW1lXSkgT2JqZWN0LmV4dGVuZChtZXRo
b2RzLCBCeVRhZ1t0YWdOYW1lXSk7CisKKyAgICBleHRlbmRFbGVtZW50V2l0aChlbGVtZW50LCBt
ZXRob2RzKTsKKworICAgIGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUu
ZW1wdHlGdW5jdGlvbjsKKyAgICByZXR1cm4gZWxlbWVudDsKKworICB9LCB7CisgICAgcmVmcmVz
aDogZnVuY3Rpb24oKSB7CisgICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxl
bWVudEV4dGVuc2lvbnMpIHsKKyAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2RzLCBFbGVtZW50
Lk1ldGhvZHMpOworICAgICAgICBPYmplY3QuZXh0ZW5kKE1ldGhvZHMsIEVsZW1lbnQuTWV0aG9k
cy5TaW11bGF0ZWQpOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZXh0ZW5kLnJlZnJlc2go
KTsKKyAgcmV0dXJuIGV4dGVuZDsKK30pKCk7CisKK0VsZW1lbnQuaGFzQXR0cmlidXRlID0gZnVu
Y3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSkg
cmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7CisgIHJldHVybiBFbGVtZW50
Lk1ldGhvZHMuU2ltdWxhdGVkLmhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUpOworfTsK
KworRWxlbWVudC5hZGRNZXRob2RzID0gZnVuY3Rpb24obWV0aG9kcykgeworICB2YXIgRiA9IFBy
b3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMsIFQgPSBFbGVtZW50Lk1ldGhvZHMuQnlUYWc7CisKKyAg
aWYgKCFtZXRob2RzKSB7CisgICAgT2JqZWN0LmV4dGVuZChGb3JtLCBGb3JtLk1ldGhvZHMpOwor
ICAgIE9iamVjdC5leHRlbmQoRm9ybS5FbGVtZW50LCBGb3JtLkVsZW1lbnQuTWV0aG9kcyk7Cisg
ICAgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMuQnlUYWcsIHsKKyAgICAgICJGT1JNIjog
ICAgIE9iamVjdC5jbG9uZShGb3JtLk1ldGhvZHMpLAorICAgICAgIklOUFVUIjogICAgT2JqZWN0
LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKKyAgICAgICJTRUxFQ1QiOiAgIE9iamVjdC5j
bG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCisgICAgICAiVEVYVEFSRUEiOiBPYmplY3QuY2xv
bmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpCisgICAgfSk7CisgIH0KKworICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PSAyKSB7CisgICAgdmFyIHRhZ05hbWUgPSBtZXRob2RzOworICAgIG1ldGhvZHMg
PSBhcmd1bWVudHNbMV07CisgIH0KKworICBpZiAoIXRhZ05hbWUpIE9iamVjdC5leHRlbmQoRWxl
bWVudC5NZXRob2RzLCBtZXRob2RzIHx8IHsgfSk7CisgIGVsc2UgeworICAgIGlmIChPYmplY3Qu
aXNBcnJheSh0YWdOYW1lKSkgdGFnTmFtZS5lYWNoKGV4dGVuZCk7CisgICAgZWxzZSBleHRlbmQo
dGFnTmFtZSk7CisgIH0KKworICBmdW5jdGlvbiBleHRlbmQodGFnTmFtZSkgeworICAgIHRhZ05h
bWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgaWYgKCFFbGVtZW50Lk1ldGhvZHMuQnlU
YWdbdGFnTmFtZV0pCisgICAgICBFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0gPSB7IH07
CisgICAgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0sIG1ldGhv
ZHMpOworICB9CisKKyAgZnVuY3Rpb24gY29weShtZXRob2RzLCBkZXN0aW5hdGlvbiwgb25seUlm
QWJzZW50KSB7CisgICAgb25seUlmQWJzZW50ID0gb25seUlmQWJzZW50IHx8IGZhbHNlOworICAg
IGZvciAodmFyIHByb3BlcnR5IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhciB2YWx1ZSA9IG1ldGhv
ZHNbcHJvcGVydHldOworICAgICAgaWYgKCFPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkpIGNvbnRp
bnVlOworICAgICAgaWYgKCFvbmx5SWZBYnNlbnQgfHwgIShwcm9wZXJ0eSBpbiBkZXN0aW5hdGlv
bikpCisgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhvZGl6ZSgpOwor
ICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRET01DbGFzcyh0YWdOYW1lKSB7CisgICAgdmFy
IGtsYXNzOworICAgIHZhciB0cmFucyA9IHsKKyAgICAgICJPUFRHUk9VUCI6ICJPcHRHcm91cCIs
ICJURVhUQVJFQSI6ICJUZXh0QXJlYSIsICJQIjogIlBhcmFncmFwaCIsCisgICAgICAiRklFTERT
RVQiOiAiRmllbGRTZXQiLCAiVUwiOiAiVUxpc3QiLCAiT0wiOiAiT0xpc3QiLCAiREwiOiAiRExp
c3QiLAorICAgICAgIkRJUiI6ICJEaXJlY3RvcnkiLCAiSDEiOiAiSGVhZGluZyIsICJIMiI6ICJI
ZWFkaW5nIiwgIkgzIjogIkhlYWRpbmciLAorICAgICAgIkg0IjogIkhlYWRpbmciLCAiSDUiOiAi
SGVhZGluZyIsICJINiI6ICJIZWFkaW5nIiwgIlEiOiAiUXVvdGUiLAorICAgICAgIklOUyI6ICJN
b2QiLCAiREVMIjogIk1vZCIsICJBIjogIkFuY2hvciIsICJJTUciOiAiSW1hZ2UiLCAiQ0FQVElP
TiI6CisgICAgICAiVGFibGVDYXB0aW9uIiwgIkNPTCI6ICJUYWJsZUNvbCIsICJDT0xHUk9VUCI6
ICJUYWJsZUNvbCIsICJUSEVBRCI6CisgICAgICAiVGFibGVTZWN0aW9uIiwgIlRGT09UIjogIlRh
YmxlU2VjdGlvbiIsICJUQk9EWSI6ICJUYWJsZVNlY3Rpb24iLCAiVFIiOgorICAgICAgIlRhYmxl
Um93IiwgIlRIIjogIlRhYmxlQ2VsbCIsICJURCI6ICJUYWJsZUNlbGwiLCAiRlJBTUVTRVQiOgor
ICAgICAgIkZyYW1lU2V0IiwgIklGUkFNRSI6ICJJRnJhbWUiCisgICAgfTsKKyAgICBpZiAodHJh
bnNbdGFnTmFtZV0pIGtsYXNzID0gJ0hUTUwnICsgdHJhbnNbdGFnTmFtZV0gKyAnRWxlbWVudCc7
CisgICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworICAgIGtsYXNz
ID0gJ0hUTUwnICsgdGFnTmFtZSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkg
cmV0dXJuIHdpbmRvd1trbGFzc107CisgICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lLmNhcGl0
YWxpemUoKSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRv
d1trbGFzc107CisKKyAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFn
TmFtZSk7CisgICAgdmFyIHByb3RvID0gZWxlbWVudFsnX19wcm90b19fJ10gfHwgZWxlbWVudC5j
b25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgICAgZWxlbWVudCA9IG51bGw7CisgICAgcmV0dXJuIHBy
b3RvOworICB9CisKKyAgdmFyIGVsZW1lbnRQcm90b3R5cGUgPSB3aW5kb3cuSFRNTEVsZW1lbnQg
PyBIVE1MRWxlbWVudC5wcm90b3R5cGUgOgorICAgRWxlbWVudC5wcm90b3R5cGU7CisKKyAgaWYg
KEYuRWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcywgZWxlbWVu
dFByb3RvdHlwZSk7CisgICAgY29weShFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLCBlbGVtZW50
UHJvdG90eXBlLCB0cnVlKTsKKyAgfQorCisgIGlmIChGLlNwZWNpZmljRWxlbWVudEV4dGVuc2lv
bnMpIHsKKyAgICBmb3IgKHZhciB0YWcgaW4gRWxlbWVudC5NZXRob2RzLkJ5VGFnKSB7CisgICAg
ICB2YXIga2xhc3MgPSBmaW5kRE9NQ2xhc3ModGFnKTsKKyAgICAgIGlmIChPYmplY3QuaXNVbmRl
ZmluZWQoa2xhc3MpKSBjb250aW51ZTsKKyAgICAgIGNvcHkoVFt0YWddLCBrbGFzcy5wcm90b3R5
cGUpOworICAgIH0KKyAgfQorCisgIE9iamVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVudC5NZXRo
b2RzKTsKKyAgZGVsZXRlIEVsZW1lbnQuQnlUYWc7CisKKyAgaWYgKEVsZW1lbnQuZXh0ZW5kLnJl
ZnJlc2gpIEVsZW1lbnQuZXh0ZW5kLnJlZnJlc2goKTsKKyAgRWxlbWVudC5jYWNoZSA9IHsgfTsK
K307CisKKworZG9jdW1lbnQudmlld3BvcnQgPSB7CisKKyAgZ2V0RGltZW5zaW9uczogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMuZ2V0V2lkdGgoKSwgaGVpZ2h0OiB0aGlz
LmdldEhlaWdodCgpIH07CisgIH0sCisKKyAgZ2V0U2Nyb2xsT2Zmc2V0czogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgKKyAgICAgIHdpbmRvdy5wYWdlWE9m
ZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5i
b2R5LnNjcm9sbExlZnQsCisgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50LnNjcm9sbFRvcCAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApOworICB9
Cit9OworCisoZnVuY3Rpb24odmlld3BvcnQpIHsKKyAgdmFyIEIgPSBQcm90b3R5cGUuQnJvd3Nl
ciwgZG9jID0gZG9jdW1lbnQsIGVsZW1lbnQsIHByb3BlcnR5ID0ge307CisKKyAgZnVuY3Rpb24g
Z2V0Um9vdEVsZW1lbnQoKSB7CisgICAgaWYgKEIuV2ViS2l0ICYmICFkb2MuZXZhbHVhdGUpCisg
ICAgICByZXR1cm4gZG9jdW1lbnQ7CisKKyAgICBpZiAoQi5PcGVyYSAmJiB3aW5kb3cucGFyc2VG
bG9hdCh3aW5kb3cub3BlcmEudmVyc2lvbigpKSA8IDkuNSkKKyAgICAgIHJldHVybiBkb2N1bWVu
dC5ib2R5OworCisgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgfQorCisg
IGZ1bmN0aW9uIGRlZmluZShEKSB7CisgICAgaWYgKCFlbGVtZW50KSBlbGVtZW50ID0gZ2V0Um9v
dEVsZW1lbnQoKTsKKworICAgIHByb3BlcnR5W0RdID0gJ2NsaWVudCcgKyBEOworCisgICAgdmll
d3BvcnRbJ2dldCcgKyBEXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eVtE
XV0gfTsKKyAgICByZXR1cm4gdmlld3BvcnRbJ2dldCcgKyBEXSgpOworICB9CisKKyAgdmlld3Bv
cnQuZ2V0V2lkdGggID0gZGVmaW5lLmN1cnJ5KCdXaWR0aCcpOworCisgIHZpZXdwb3J0LmdldEhl
aWdodCA9IGRlZmluZS5jdXJyeSgnSGVpZ2h0Jyk7Cit9KShkb2N1bWVudC52aWV3cG9ydCk7CisK
KworRWxlbWVudC5TdG9yYWdlID0geworICBVSUQ6IDEKK307CisKK0VsZW1lbnQuYWRkTWV0aG9k
cyh7CisgIGdldFN0b3JhZ2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoIShlbGVtZW50
ID0gJChlbGVtZW50KSkpIHJldHVybjsKKworICAgIHZhciB1aWQ7CisgICAgaWYgKGVsZW1lbnQg
PT09IHdpbmRvdykgeworICAgICAgdWlkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHR5
cGVvZiBlbGVtZW50Ll9wcm90b3R5cGVVSUQgPT09ICJ1bmRlZmluZWQiKQorICAgICAgICBlbGVt
ZW50Ll9wcm90b3R5cGVVSUQgPSBbRWxlbWVudC5TdG9yYWdlLlVJRCsrXTsKKyAgICAgIHVpZCA9
IGVsZW1lbnQuX3Byb3RvdHlwZVVJRFswXTsKKyAgICB9CisKKyAgICBpZiAoIUVsZW1lbnQuU3Rv
cmFnZVt1aWRdKQorICAgICAgRWxlbWVudC5TdG9yYWdlW3VpZF0gPSAkSCgpOworCisgICAgcmV0
dXJuIEVsZW1lbnQuU3RvcmFnZVt1aWRdOworICB9LAorCisgIHN0b3JlOiBmdW5jdGlvbihlbGVt
ZW50LCBrZXksIHZhbHVlKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1
cm47CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgRWxlbWVudC5n
ZXRTdG9yYWdlKGVsZW1lbnQpLnVwZGF0ZShrZXkpOworICAgIH0gZWxzZSB7CisgICAgICBFbGVt
ZW50LmdldFN0b3JhZ2UoZWxlbWVudCkuc2V0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIHJl
dHVybiBlbGVtZW50OworICB9LAorCisgIHJldHJpZXZlOiBmdW5jdGlvbihlbGVtZW50LCBrZXks
IGRlZmF1bHRWYWx1ZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJu
OworICAgIHZhciBoYXNoID0gRWxlbWVudC5nZXRTdG9yYWdlKGVsZW1lbnQpLCB2YWx1ZSA9IGhh
c2guZ2V0KGtleSk7CisKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgeworICAg
ICAgaGFzaC5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpOworICAgICAgdmFsdWUgPSBkZWZhdWx0VmFs
dWU7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworICB9LAorCisgIGNsb25lOiBmdW5jdGlv
bihlbGVtZW50LCBkZWVwKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1
cm47CisgICAgdmFyIGNsb25lID0gZWxlbWVudC5jbG9uZU5vZGUoZGVlcCk7CisgICAgY2xvbmUu
X3Byb3RvdHlwZVVJRCA9IHZvaWQgMDsKKyAgICBpZiAoZGVlcCkgeworICAgICAgdmFyIGRlc2Nl
bmRhbnRzID0gRWxlbWVudC5zZWxlY3QoY2xvbmUsICcqJyksCisgICAgICAgICAgaSA9IGRlc2Nl
bmRhbnRzLmxlbmd0aDsKKyAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgZGVzY2VuZGFudHNb
aV0uX3Byb3RvdHlwZVVJRCA9IHZvaWQgMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVs
ZW1lbnQuZXh0ZW5kKGNsb25lKTsKKyAgfQorfSk7CisvKiBQb3J0aW9ucyBvZiB0aGUgU2VsZWN0
b3IgY2xhc3MgYXJlIGRlcml2ZWQgZnJvbSBKYWNrIFNsb2N1bSdzIERvbVF1ZXJ5LAorICogcGFy
dCBvZiBZVUktRXh0IHZlcnNpb24gMC40MCwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9m
IGFuIE1JVC1zdHlsZQorICogbGljZW5zZS4gIFBsZWFzZSBzZWUgaHR0cDovL3d3dy55dWktZXh0
LmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uICovCisKK3ZhciBTZWxlY3RvciA9IENsYXNzLmNy
ZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAgICB0aGlzLmV4
cHJlc3Npb24gPSBleHByZXNzaW9uLnN0cmlwKCk7CisKKyAgICBpZiAodGhpcy5zaG91bGRVc2VT
ZWxlY3RvcnNBUEkoKSkgeworICAgICAgdGhpcy5tb2RlID0gJ3NlbGVjdG9yc0FQSSc7CisgICAg
fSBlbHNlIGlmICh0aGlzLnNob3VsZFVzZVhQYXRoKCkpIHsKKyAgICAgIHRoaXMubW9kZSA9ICd4
cGF0aCc7CisgICAgICB0aGlzLmNvbXBpbGVYUGF0aE1hdGNoZXIoKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgdGhpcy5tb2RlID0gIm5vcm1hbCI7CisgICAgICB0aGlzLmNvbXBpbGVNYXRjaGVyKCk7
CisgICAgfQorCisgIH0sCisKKyAgc2hvdWxkVXNlWFBhdGg6IChmdW5jdGlvbigpIHsKKworICAg
IHZhciBJU19ERVNDRU5EQU5UX1NFTEVDVE9SX0JVR0dZID0gKGZ1bmN0aW9uKCl7CisgICAgICB2
YXIgaXNCdWdneSA9IGZhbHNlOworICAgICAgaWYgKGRvY3VtZW50LmV2YWx1YXRlICYmIHdpbmRv
dy5YUGF0aFJlc3VsdCkgeworICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdkaXYnKTsKKyAgICAgICAgZWwuaW5uZXJIVE1MID0gJzx1bD48bGk+PC9saT48L3VsPjxkaXY+
PHVsPjxsaT48L2xpPjwvdWw+PC9kaXY+JzsKKworICAgICAgICB2YXIgeHBhdGggPSAiLi8vKlts
b2NhbC1uYW1lKCk9J3VsJyBvciBsb2NhbC1uYW1lKCk9J1VMJ10iICsKKyAgICAgICAgICAiLy8q
W2xvY2FsLW5hbWUoKT0nbGknIG9yIGxvY2FsLW5hbWUoKT0nTEknXSI7CisKKyAgICAgICAgdmFy
IHJlc3VsdCA9IGRvY3VtZW50LmV2YWx1YXRlKHhwYXRoLCBlbCwgbnVsbCwKKyAgICAgICAgICBY
UGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7CisKKyAgICAgICAg
aXNCdWdneSA9IChyZXN1bHQuc25hcHNob3RMZW5ndGggIT09IDIpOworICAgICAgICBlbCA9IG51
bGw7CisgICAgICB9CisgICAgICByZXR1cm4gaXNCdWdneTsKKyAgICB9KSgpOworCisgICAgcmV0
dXJuIGZ1bmN0aW9uKCkgeworICAgICAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQ
YXRoKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uOworCisg
ICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0ICYmCisgICAgICAgKGUuaW5jbHVkZSgi
LW9mLXR5cGUiKSB8fCBlLmluY2x1ZGUoIjplbXB0eSIpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICBpZiAoKC8oXFtbXHctXSo/Onw6Y2hlY2tlZCkvKS50ZXN0KGUpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChJU19ERVNDRU5EQU5UX1NFTEVDVE9SX0JVR0dZ
KSByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB9KSgpLAor
CisgIHNob3VsZFVzZVNlbGVjdG9yc0FQSTogZnVuY3Rpb24oKSB7CisgICAgaWYgKCFQcm90b3R5
cGUuQnJvd3NlckZlYXR1cmVzLlNlbGVjdG9yc0FQSSkgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KFNlbGVjdG9yLkNBU0VfSU5TRU5TSVRJVkVfQ0xBU1NfTkFNRVMpIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmICghU2VsZWN0b3IuX2RpdikgU2VsZWN0b3IuX2RpdiA9IG5ldyBFbGVtZW50KCdkaXYn
KTsKKworICAgIHRyeSB7CisgICAgICBTZWxlY3Rvci5fZGl2LnF1ZXJ5U2VsZWN0b3IodGhpcy5l
eHByZXNzaW9uKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSwKKworICBjb21waWxlTWF0Y2hlcjogZnVuY3Rpb24o
KSB7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVybnMs
IGggPSBTZWxlY3Rvci5oYW5kbGVycywKKyAgICAgICAgYyA9IFNlbGVjdG9yLmNyaXRlcmlhLCBs
ZSwgcCwgbSwgbGVuID0gcHMubGVuZ3RoLCBuYW1lOworCisgICAgaWYgKFNlbGVjdG9yLl9jYWNo
ZVtlXSkgeworICAgICAgdGhpcy5tYXRjaGVyID0gU2VsZWN0b3IuX2NhY2hlW2VdOworICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIHRoaXMubWF0Y2hlciA9IFsidGhpcy5tYXRjaGVyID0gZnVu
Y3Rpb24ocm9vdCkgeyIsCisgICAgICAgICAgICAgICAgICAgICJ2YXIgciA9IHJvb3QsIGggPSBT
ZWxlY3Rvci5oYW5kbGVycywgYyA9IGZhbHNlLCBuOyJdOworCisgICAgd2hpbGUgKGUgJiYgbGUg
IT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUgPSBlOworICAgICAgZm9yICh2YXIg
aSA9IDA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgcCA9IHBzW2ldLnJlOworICAgICAgICBuYW1l
ID0gcHNbaV0ubmFtZTsKKyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHApKSB7CisgICAgICAgICAg
dGhpcy5tYXRjaGVyLnB1c2goT2JqZWN0LmlzRnVuY3Rpb24oY1tuYW1lXSkgPyBjW25hbWVdKG0p
IDoKKyAgICAgICAgICAgIG5ldyBUZW1wbGF0ZShjW25hbWVdKS5ldmFsdWF0ZShtKSk7CisgICAg
ICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLm1hdGNoZXIucHVzaCgicmV0dXJuIGgudW5p
cXVlKG4pO1xufSIpOworICAgIGV2YWwodGhpcy5tYXRjaGVyLmpvaW4oJ1xuJykpOworICAgIFNl
bGVjdG9yLl9jYWNoZVt0aGlzLmV4cHJlc3Npb25dID0gdGhpcy5tYXRjaGVyOworICB9LAorCisg
IGNvbXBpbGVYUGF0aE1hdGNoZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciBlID0gdGhpcy5leHBy
ZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLAorICAgICAgICB4ID0gU2VsZWN0b3IueHBh
dGgsIGxlLCBtLCBsZW4gPSBwcy5sZW5ndGgsIG5hbWU7CisKKyAgICBpZiAoU2VsZWN0b3IuX2Nh
Y2hlW2VdKSB7CisgICAgICB0aGlzLnhwYXRoID0gU2VsZWN0b3IuX2NhY2hlW2VdOyByZXR1cm47
CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyID0gWycuLy8qJ107CisgICAgd2hpbGUgKGUgJiYg
bGUgIT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUgPSBlOworICAgICAgZm9yICh2
YXIgaSA9IDA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgbmFtZSA9IHBzW2ldLm5hbWU7CisgICAg
ICAgIGlmIChtID0gZS5tYXRjaChwc1tpXS5yZSkpIHsKKyAgICAgICAgICB0aGlzLm1hdGNoZXIu
cHVzaChPYmplY3QuaXNGdW5jdGlvbih4W25hbWVdKSA/IHhbbmFtZV0obSkgOgorICAgICAgICAg
ICAgbmV3IFRlbXBsYXRlKHhbbmFtZV0pLmV2YWx1YXRlKG0pKTsKKyAgICAgICAgICBlID0gZS5y
ZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQor
ICAgIH0KKworICAgIHRoaXMueHBhdGggPSB0aGlzLm1hdGNoZXIuam9pbignJyk7CisgICAgU2Vs
ZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLnhwYXRoOworICB9LAorCisgIGZp
bmRFbGVtZW50czogZnVuY3Rpb24ocm9vdCkgeworICAgIHJvb3QgPSByb290IHx8IGRvY3VtZW50
OworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCByZXN1bHRzOworCisgICAgc3dpdGNoICh0
aGlzLm1vZGUpIHsKKyAgICAgIGNhc2UgJ3NlbGVjdG9yc0FQSSc6CisgICAgICAgIGlmIChyb290
ICE9PSBkb2N1bWVudCkgeworICAgICAgICAgIHZhciBvbGRJZCA9IHJvb3QuaWQsIGlkID0gJChy
b290KS5pZGVudGlmeSgpOworICAgICAgICAgIGlkID0gaWQucmVwbGFjZSgvKFtcLjpdKS9nLCAi
XFwkMSIpOworICAgICAgICAgIGUgPSAiIyIgKyBpZCArICIgIiArIGU7CisgICAgICAgIH0KKwor
ICAgICAgICByZXN1bHRzID0gJEEocm9vdC5xdWVyeVNlbGVjdG9yQWxsKGUpKS5tYXAoRWxlbWVu
dC5leHRlbmQpOworICAgICAgICByb290LmlkID0gb2xkSWQ7CisKKyAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgICBjYXNlICd4cGF0aCc6CisgICAgICAgIHJldHVybiBkb2N1bWVudC5fZ2V0
RWxlbWVudHNCeVhQYXRoKHRoaXMueHBhdGgsIHJvb3QpOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICByZXR1cm4gdGhpcy5tYXRjaGVyKHJvb3QpOworICAgIH0KKyAgfSwKKworICBtYXRjaDogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHRoaXMudG9rZW5zID0gW107CisKKyAgICB2YXIgZSA9IHRo
aXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywgYXMgPSBTZWxlY3Rvci5hc3Nl
cnRpb25zOworICAgIHZhciBsZSwgcCwgbSwgbGVuID0gcHMubGVuZ3RoLCBuYW1lOworCisgICAg
d2hpbGUgKGUgJiYgbGUgIT09IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgIGxlID0gZTsK
KyAgICAgIGZvciAodmFyIGkgPSAwOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIHAgPSBwc1tpXS5y
ZTsKKyAgICAgICAgbmFtZSA9IHBzW2ldLm5hbWU7CisgICAgICAgIGlmIChtID0gZS5tYXRjaChw
KSkgeworICAgICAgICAgIGlmIChhc1tuYW1lXSkgeworICAgICAgICAgICAgdGhpcy50b2tlbnMu
cHVzaChbbmFtZSwgT2JqZWN0LmNsb25lKG0pXSk7CisgICAgICAgICAgICBlID0gZS5yZXBsYWNl
KG1bMF0sICcnKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMu
ZmluZEVsZW1lbnRzKGRvY3VtZW50KS5pbmNsdWRlKGVsZW1lbnQpOworICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHZhciBtYXRjaCA9IHRydWUsIG5hbWUsIG1h
dGNoZXM7CisgICAgZm9yICh2YXIgaSA9IDAsIHRva2VuOyB0b2tlbiA9IHRoaXMudG9rZW5zW2ld
OyBpKyspIHsKKyAgICAgIG5hbWUgPSB0b2tlblswXSwgbWF0Y2hlcyA9IHRva2VuWzFdOworICAg
ICAgaWYgKCFTZWxlY3Rvci5hc3NlcnRpb25zW25hbWVdKGVsZW1lbnQsIG1hdGNoZXMpKSB7Cisg
ICAgICAgIG1hdGNoID0gZmFsc2U7IGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVy
biBtYXRjaDsKKyAgfSwKKworICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRo
aXMuZXhwcmVzc2lvbjsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gIiM8U2VsZWN0b3I6IiArIHRoaXMuZXhwcmVzc2lvbi5pbnNwZWN0KCkgKyAiPiI7CisgIH0K
K30pOworCitpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TZWxlY3RvcnNBUEkgJiYKKyBk
b2N1bWVudC5jb21wYXRNb2RlID09PSAnQmFja0NvbXBhdCcpIHsKKyAgU2VsZWN0b3IuQ0FTRV9J
TlNFTlNJVElWRV9DTEFTU19OQU1FUyA9IChmdW5jdGlvbigpeworICAgIHZhciBkaXYgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKKyAgICAgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoJ3NwYW4nKTsKKworICAgIGRpdi5pZCA9ICJwcm90b3R5cGVfdGVzdF9pZCI7CisgICAg
c3Bhbi5jbGFzc05hbWUgPSAnVGVzdCc7CisgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pOworICAg
IHZhciBpc0lnbm9yZWQgPSAoZGl2LnF1ZXJ5U2VsZWN0b3IoJyNwcm90b3R5cGVfdGVzdF9pZCAu
dGVzdCcpICE9PSBudWxsKTsKKyAgICBkaXYgPSBzcGFuID0gbnVsbDsKKyAgICByZXR1cm4gaXNJ
Z25vcmVkOworICB9KSgpOworfQorCitPYmplY3QuZXh0ZW5kKFNlbGVjdG9yLCB7CisgIF9jYWNo
ZTogeyB9LAorCisgIHhwYXRoOiB7CisgICAgZGVzY2VuZGFudDogICAiLy8qIiwKKyAgICBjaGls
ZDogICAgICAgICIvKiIsCisgICAgYWRqYWNlbnQ6ICAgICAiL2ZvbGxvd2luZy1zaWJsaW5nOjoq
WzFdIiwKKyAgICBsYXRlclNpYmxpbmc6ICcvZm9sbG93aW5nLXNpYmxpbmc6OionLAorICAgIHRh
Z05hbWU6ICAgICAgZnVuY3Rpb24obSkgeworICAgICAgaWYgKG1bMV0gPT0gJyonKSByZXR1cm4g
Jyc7CisgICAgICByZXR1cm4gIltsb2NhbC1uYW1lKCk9JyIgKyBtWzFdLnRvTG93ZXJDYXNlKCkg
KworICAgICAgICAgICAgICInIG9yIGxvY2FsLW5hbWUoKT0nIiArIG1bMV0udG9VcHBlckNhc2Uo
KSArICInXSI7CisgICAgfSwKKyAgICBjbGFzc05hbWU6ICAgICJbY29udGFpbnMoY29uY2F0KCcg
JywgQGNsYXNzLCAnICcpLCAnICN7MX0gJyldIiwKKyAgICBpZDogICAgICAgICAgICJbQGlkPScj
ezF9J10iLAorICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rpb24obSkgeworICAgICAgbVsxXSA9IG1b
MV0udG9Mb3dlckNhc2UoKTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoIltAI3sxfV0iKS5l
dmFsdWF0ZShtKTsKKyAgICB9LAorICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKKyAgICAgIG1bMV0g
PSBtWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICBtWzNdID0gbVs1XSB8fCBtWzZdOworICAgICAg
cmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5vcGVyYXRvcnNbbVsyXV0pLmV2YWx1
YXRlKG0pOworICAgIH0sCisgICAgcHNldWRvOiBmdW5jdGlvbihtKSB7CisgICAgICB2YXIgaCA9
IFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsxXV07CisgICAgICBpZiAoIWgpIHJldHVybiAnJzsK
KyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihoKSkgcmV0dXJuIGgobSk7CisgICAgICByZXR1
cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsxXV0pLmV2YWx1YXRlKG0p
OworICAgIH0sCisgICAgb3BlcmF0b3JzOiB7CisgICAgICAnPSc6ICAiW0AjezF9PScjezN9J10i
LAorICAgICAgJyE9JzogIltAI3sxfSE9JyN7M30nXSIsCisgICAgICAnXj0nOiAiW3N0YXJ0cy13
aXRoKEAjezF9LCAnI3szfScpXSIsCisgICAgICAnJD0nOiAiW3N1YnN0cmluZyhAI3sxfSwgKHN0
cmluZy1sZW5ndGgoQCN7MX0pIC0gc3RyaW5nLWxlbmd0aCgnI3szfScpICsgMSkpPScjezN9J10i
LAorICAgICAgJyo9JzogIltjb250YWlucyhAI3sxfSwgJyN7M30nKV0iLAorICAgICAgJ349Jzog
Iltjb250YWlucyhjb25jYXQoJyAnLCBAI3sxfSwgJyAnKSwgJyAjezN9ICcpXSIsCisgICAgICAn
fD0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnLScsIEAjezF9LCAnLScpLCAnLSN7M30tJyldIgorICAg
IH0sCisgICAgcHNldWRvczogeworICAgICAgJ2ZpcnN0LWNoaWxkJzogJ1tub3QocHJlY2VkaW5n
LXNpYmxpbmc6OiopXScsCisgICAgICAnbGFzdC1jaGlsZCc6ICAnW25vdChmb2xsb3dpbmctc2li
bGluZzo6KildJywKKyAgICAgICdvbmx5LWNoaWxkJzogICdbbm90KHByZWNlZGluZy1zaWJsaW5n
OjoqIG9yIGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAorICAgICAgJ2VtcHR5JzogICAgICAgIltj
b3VudCgqKSA9IDAgYW5kIChjb3VudCh0ZXh0KCkpID0gMCldIiwKKyAgICAgICdjaGVja2VkJzog
ICAgICJbQGNoZWNrZWRdIiwKKyAgICAgICdkaXNhYmxlZCc6ICAgICJbKEBkaXNhYmxlZCkgYW5k
IChAdHlwZSE9J2hpZGRlbicpXSIsCisgICAgICAnZW5hYmxlZCc6ICAgICAiW25vdChAZGlzYWJs
ZWQpIGFuZCAoQHR5cGUhPSdoaWRkZW4nKV0iLAorICAgICAgJ25vdCc6IGZ1bmN0aW9uKG0pIHsK
KyAgICAgICAgdmFyIGUgPSBtWzZdLCBwID0gU2VsZWN0b3IucGF0dGVybnMsCisgICAgICAgICAg
ICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCB2LCBsZW4gPSBwLmxlbmd0aCwgbmFtZTsKKworICAg
ICAgICB2YXIgZXhjbHVzaW9uID0gW107CisgICAgICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYg
KC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgICAgICBsZSA9IGU7CisgICAgICAgICAgZm9yICh2YXIg
aSA9IDA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgIG5hbWUgPSBwW2ldLm5hbWUKKyAgICAg
ICAgICAgIGlmIChtID0gZS5tYXRjaChwW2ldLnJlKSkgeworICAgICAgICAgICAgICB2ID0gT2Jq
ZWN0LmlzRnVuY3Rpb24oeFtuYW1lXSkgPyB4W25hbWVdKG0pIDogbmV3IFRlbXBsYXRlKHhbbmFt
ZV0pLmV2YWx1YXRlKG0pOworICAgICAgICAgICAgICBleGNsdXNpb24ucHVzaCgiKCIgKyB2LnN1
YnN0cmluZygxLCB2Lmxlbmd0aCAtIDEpICsgIikiKTsKKyAgICAgICAgICAgICAgZSA9IGUucmVw
bGFjZShtWzBdLCAnJyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIltub3QoIiArIGV4Y2x1c2lvbi5q
b2luKCIgYW5kICIpICsgIildIjsKKyAgICAgIH0sCisgICAgICAnbnRoLWNoaWxkJzogICAgICBm
dW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgi
KGNvdW50KC4vcHJlY2VkaW5nLXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAgICB9LAorICAg
ICAgJ250aC1sYXN0LWNoaWxkJzogZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2VsZWN0
b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL2ZvbGxvd2luZy1zaWJsaW5nOjoqKSArIDEp
ICIsIG0pOworICAgICAgfSwKKyAgICAgICdudGgtb2YtdHlwZSc6ICAgIGZ1bmN0aW9uKG0pIHsK
KyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCJwb3NpdGlvbigpICIs
IG0pOworICAgICAgfSwKKyAgICAgICdudGgtbGFzdC1vZi10eXBlJzogZnVuY3Rpb24obSkgewor
ICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihsYXN0KCkgKyAxIC0g
cG9zaXRpb24oKSkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ2ZpcnN0LW9mLXR5cGUnOiAgZnVu
Y3Rpb24obSkgeworICAgICAgICBtWzZdID0gIjEiOyByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNl
dWRvc1snbnRoLW9mLXR5cGUnXShtKTsKKyAgICAgIH0sCisgICAgICAnbGFzdC1vZi10eXBlJzog
ICBmdW5jdGlvbihtKSB7CisgICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBTZWxlY3Rvci54cGF0
aC5wc2V1ZG9zWydudGgtbGFzdC1vZi10eXBlJ10obSk7CisgICAgICB9LAorICAgICAgJ29ubHkt
b2YtdHlwZSc6ICAgZnVuY3Rpb24obSkgeworICAgICAgICB2YXIgcCA9IFNlbGVjdG9yLnhwYXRo
LnBzZXVkb3M7IHJldHVybiBwWydmaXJzdC1vZi10eXBlJ10obSkgKyBwWydsYXN0LW9mLXR5cGUn
XShtKTsKKyAgICAgIH0sCisgICAgICBudGg6IGZ1bmN0aW9uKGZyYWdtZW50LCBtKSB7CisgICAg
ICAgIHZhciBtbSwgZm9ybXVsYSA9IG1bNl0sIHByZWRpY2F0ZTsKKyAgICAgICAgaWYgKGZvcm11
bGEgPT0gJ2V2ZW4nKSBmb3JtdWxhID0gJzJuKzAnOworICAgICAgICBpZiAoZm9ybXVsYSA9PSAn
b2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CisgICAgICAgIGlmIChtbSA9IGZvcm11bGEubWF0Y2go
L14oXGQrKSQvKSkgLy8gZGlnaXQgb25seQorICAgICAgICAgIHJldHVybiAnWycgKyBmcmFnbWVu
dCArICI9ICIgKyBtbVsxXSArICddJzsKKyAgICAgICAgaWYgKG1tID0gZm9ybXVsYS5tYXRjaCgv
XigtP1xkKik/bigoWystXSkoXGQrKSk/LykpIHsgLy8gYW4rYgorICAgICAgICAgIGlmIChtbVsx
XSA9PSAiLSIpIG1tWzFdID0gLTE7CisgICAgICAgICAgdmFyIGEgPSBtbVsxXSA/IE51bWJlciht
bVsxXSkgOiAxOworICAgICAgICAgIHZhciBiID0gbW1bMl0gPyBOdW1iZXIobW1bMl0pIDogMDsK
KyAgICAgICAgICBwcmVkaWNhdGUgPSAiWygoI3tmcmFnbWVudH0gLSAje2J9KSBtb2QgI3thfSA9
IDApIGFuZCAiICsKKyAgICAgICAgICAiKCgje2ZyYWdtZW50fSAtICN7Yn0pIGRpdiAje2F9ID49
IDApXSI7CisgICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShwcmVkaWNhdGUpLmV2YWx1YXRl
KHsKKyAgICAgICAgICAgIGZyYWdtZW50OiBmcmFnbWVudCwgYTogYSwgYjogYiB9KTsKKyAgICAg
ICAgfQorICAgICAgfQorICAgIH0KKyAgfSwKKworICBjcml0ZXJpYTogeworICAgIHRhZ05hbWU6
ICAgICAgJ24gPSBoLnRhZ05hbWUobiwgciwgIiN7MX0iLCBjKTsgICAgICBjID0gZmFsc2U7JywK
KyAgICBjbGFzc05hbWU6ICAgICduID0gaC5jbGFzc05hbWUobiwgciwgIiN7MX0iLCBjKTsgICAg
YyA9IGZhbHNlOycsCisgICAgaWQ6ICAgICAgICAgICAnbiA9IGguaWQobiwgciwgIiN7MX0iLCBj
KTsgICAgICAgICAgIGMgPSBmYWxzZTsnLAorICAgIGF0dHJQcmVzZW5jZTogJ24gPSBoLmF0dHJQ
cmVzZW5jZShuLCByLCAiI3sxfSIsIGMpOyBjID0gZmFsc2U7JywKKyAgICBhdHRyOiBmdW5jdGlv
bihtKSB7CisgICAgICBtWzNdID0gKG1bNV0gfHwgbVs2XSk7CisgICAgICByZXR1cm4gbmV3IFRl
bXBsYXRlKCduID0gaC5hdHRyKG4sIHIsICIjezF9IiwgIiN7M30iLCAiI3syfSIsIGMpOyBjID0g
ZmFsc2U7JykuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBwc2V1ZG86IGZ1bmN0aW9uKG0pIHsK
KyAgICAgIGlmIChtWzZdKSBtWzZdID0gbVs2XS5yZXBsYWNlKC8iL2csICdcXCInKTsKKyAgICAg
IHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLnBzZXVkbyhuLCAiI3sxfSIsICIjezZ9Iiwgciwg
Yyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIGRlc2NlbmRhbnQ6ICAg
J2MgPSAiZGVzY2VuZGFudCI7JywKKyAgICBjaGlsZDogICAgICAgICdjID0gImNoaWxkIjsnLAor
ICAgIGFkamFjZW50OiAgICAgJ2MgPSAiYWRqYWNlbnQiOycsCisgICAgbGF0ZXJTaWJsaW5nOiAn
YyA9ICJsYXRlclNpYmxpbmciOycKKyAgfSwKKworICBwYXR0ZXJuczogWworICAgIHsgbmFtZTog
J2xhdGVyU2libGluZycsIHJlOiAvXlxzKn5ccyovIH0sCisgICAgeyBuYW1lOiAnY2hpbGQnLCAg
ICAgICAgcmU6IC9eXHMqPlxzKi8gfSwKKyAgICB7IG5hbWU6ICdhZGphY2VudCcsICAgICByZTog
L15ccypcK1xzKi8gfSwKKyAgICB7IG5hbWU6ICdkZXNjZW5kYW50JywgICByZTogL15ccy8gfSwK
KworICAgIHsgbmFtZTogJ3RhZ05hbWUnLCAgICAgIHJlOiAvXlxzKihcKnxbXHdcLV0rKShcYnwk
KT8vIH0sCisgICAgeyBuYW1lOiAnaWQnLCAgICAgICAgICAgcmU6IC9eIyhbXHdcLVwqXSspKFxi
fCQpLyB9LAorICAgIHsgbmFtZTogJ2NsYXNzTmFtZScsICAgIHJlOiAvXlwuKFtcd1wtXCpdKyko
XGJ8JCkvIH0sCisgICAgeyBuYW1lOiAncHNldWRvJywgICAgICAgcmU6IC9eOigoZmlyc3R8bGFz
dHxudGh8bnRoLWxhc3R8b25seSkoLWNoaWxkfC1vZi10eXBlKXxlbXB0eXxjaGVja2VkfChlbnxk
aXMpYWJsZWR8bm90KShcKCguKj8pXCkpPyhcYnwkfCg/PVxzfFs6K34+XSkpLyB9LAorICAgIHsg
bmFtZTogJ2F0dHJQcmVzZW5jZScsIHJlOiAvXlxbKCg/Oltcdy1dKzopP1tcdy1dKylcXS8gfSwK
KyAgICB7IG5hbWU6ICdhdHRyJywgICAgICAgICByZTogL1xbKCg/Oltcdy1dKjopP1tcdy1dKylc
cyooPzooWyFeJCp+fF0/PSlccyooKFsnIl0pKFteXDRdKj8pXDR8KFteJyJdW15cXV0qPykpKT9c
XS8gfQorICBdLAorCisgIGFzc2VydGlvbnM6IHsKKyAgICB0YWdOYW1lOiBmdW5jdGlvbihlbGVt
ZW50LCBtYXRjaGVzKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc1sxXS50b1VwcGVyQ2FzZSgpID09
IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgIH0sCisKKyAgICBjbGFzc05hbWU6
IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBFbGVtZW50Lmhhc0Ns
YXNzTmFtZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisgICAgaWQ6IGZ1bmN0aW9u
KGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBlbGVtZW50LmlkID09PSBtYXRjaGVz
WzFdOworICAgIH0sCisKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNo
ZXMpIHsKKyAgICAgIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShlbGVtZW50LCBtYXRjaGVz
WzFdKTsKKyAgICB9LAorCisgICAgYXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgewor
ICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShlbGVtZW50LCBtYXRj
aGVzWzFdKTsKKyAgICAgIHJldHVybiBub2RlVmFsdWUgJiYgU2VsZWN0b3Iub3BlcmF0b3JzW21h
dGNoZXNbMl1dKG5vZGVWYWx1ZSwgbWF0Y2hlc1s1XSB8fCBtYXRjaGVzWzZdKTsKKyAgICB9Cisg
IH0sCisKKyAgaGFuZGxlcnM6IHsKKyAgICBjb25jYXQ6IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gYltpXTsgaSsrKQorICAgICAgICBhLnB1c2go
bm9kZSk7CisgICAgICByZXR1cm4gYTsKKyAgICB9LAorCisgICAgbWFyazogZnVuY3Rpb24obm9k
ZXMpIHsKKyAgICAgIHZhciBfdHJ1ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAg
Zm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBub2Rl
Ll9jb3VudGVkQnlQcm90b3R5cGUgPSBfdHJ1ZTsKKyAgICAgIHJldHVybiBub2RlczsKKyAgICB9
LAorCisgICAgdW5tYXJrOiAoZnVuY3Rpb24oKXsKKworICAgICAgdmFyIFBST1BFUlRJRVNfQVRU
UklCVVRFU19NQVAgPSAoZnVuY3Rpb24oKXsKKyAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgnZGl2JyksCisgICAgICAgICAgICBpc0J1Z2d5ID0gZmFsc2UsCisgICAgICAg
ICAgICBwcm9wTmFtZSA9ICdfY291bnRlZEJ5UHJvdG90eXBlJywKKyAgICAgICAgICAgIHZhbHVl
ID0gJ3gnCisgICAgICAgIGVsW3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICBpc0J1Z2d5ID0g
KGVsLmdldEF0dHJpYnV0ZShwcm9wTmFtZSkgPT09IHZhbHVlKTsKKyAgICAgICAgZWwgPSBudWxs
OworICAgICAgICByZXR1cm4gaXNCdWdneTsKKyAgICAgIH0pKCk7CisKKyAgICAgIHJldHVybiBQ
Uk9QRVJUSUVTX0FUVFJJQlVURVNfTUFQID8KKyAgICAgICAgZnVuY3Rpb24obm9kZXMpIHsKKyAg
ICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAg
ICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnX2NvdW50ZWRCeVByb3RvdHlwZScpOworICAg
ICAgICAgIHJldHVybiBub2RlczsKKyAgICAgICAgfSA6CisgICAgICAgIGZ1bmN0aW9uKG5vZGVz
KSB7CisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsr
KQorICAgICAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlID0gdm9pZCAwOworICAgICAg
ICAgIHJldHVybiBub2RlczsKKyAgICAgICAgfQorICAgIH0pKCksCisKKyAgICBpbmRleDogZnVu
Y3Rpb24ocGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKSB7CisgICAgICBwYXJlbnROb2RlLl9j
b3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgIGlmIChy
ZXZlcnNlKSB7CisgICAgICAgIGZvciAodmFyIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVz
LCBpID0gbm9kZXMubGVuZ3RoIC0gMSwgaiA9IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAg
dmFyIG5vZGUgPSBub2Rlc1tpXTsKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYm
ICghb2ZUeXBlIHx8IG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0g
aisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHZhciBpID0gMCwg
aiA9IDEsIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzOyBub2RlID0gbm9kZXNbaV07IGkr
KykKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICghb2ZUeXBlIHx8IG5vZGUu
X2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0gaisrOworICAgICAgfQorICAg
IH0sCisKKyAgICB1bmlxdWU6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBpZiAobm9kZXMubGVu
Z3RoID09IDApIHJldHVybiBub2RlczsKKyAgICAgIHZhciByZXN1bHRzID0gW10sIG47CisgICAg
ICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykKKyAgICAgICAg
aWYgKHR5cGVvZiAobiA9IG5vZGVzW2ldKS5fY291bnRlZEJ5UHJvdG90eXBlID09ICd1bmRlZmlu
ZWQnKSB7CisgICAgICAgICAgbi5fY291bnRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb247CisgICAgICAgICAgcmVzdWx0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKG4pKTsKKyAg
ICAgICAgfQorICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJzLnVubWFyayhyZXN1bHRzKTsK
KyAgICB9LAorCisgICAgZGVzY2VuZGFudDogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBo
ID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtd
LCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaC5jb25jYXQocmVzdWx0cywg
bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKTsKKyAgICAgIHJldHVybiByZXN1bHRzOwor
ICAgIH0sCisKKyAgICBjaGlsZDogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2Vs
ZWN0b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2Rl
OyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBmb3IgKHZhciBqID0gMCwgY2hpbGQ7
IGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW2pdOyBqKyspCisgICAgICAgICAgaWYgKGNoaWxkLm5v
ZGVUeXBlID09IDEgJiYgY2hpbGQudGFnTmFtZSAhPSAnIScpIHJlc3VsdHMucHVzaChjaGlsZCk7
CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgYWRqYWNlbnQ6
IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBu
b2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICB2YXIgbmV4dCA9IHRoaXMubmV4
dEVsZW1lbnRTaWJsaW5nKG5vZGUpOworICAgICAgICBpZiAobmV4dCkgcmVzdWx0cy5wdXNoKG5l
eHQpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGxhdGVy
U2libGluZzogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxl
cnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgaC5jb25jYXQocmVzdWx0cywgRWxlbWVudC5uZXh0U2libGlu
Z3Mobm9kZSkpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIG5leHRFbGVt
ZW50U2libGluZzogZnVuY3Rpb24obm9kZSkgeworICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLm5l
eHRTaWJsaW5nKQorICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSByZXR1cm4gbm9kZTsK
KyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisKKyAgICBwcmV2aW91c0VsZW1lbnRTaWJsaW5n
OiBmdW5jdGlvbihub2RlKSB7CisgICAgICB3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJs
aW5nKQorICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSByZXR1cm4gbm9kZTsKKyAgICAg
IHJldHVybiBudWxsOworICAgIH0sCisKKyAgICB0YWdOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9v
dCwgdGFnTmFtZSwgY29tYmluYXRvcikgeworICAgICAgdmFyIHVUYWdOYW1lID0gdGFnTmFtZS50
b1VwcGVyQ2FzZSgpOworICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgaCA9IFNlbGVjdG9yLmhhbmRs
ZXJzOworICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21iaW5hdG9yKSB7CisgICAg
ICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gImRlc2NlbmRhbnQiKSB7CisgICAgICAgICAgICBmb3Ig
KHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGgu
Y29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOworICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgfSBlbHNlIG5vZGVzID0gdGhpc1tj
b21iaW5hdG9yXShub2Rlcyk7CisgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIioiKSByZXR1cm4g
bm9kZXM7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBu
b2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9
PT0gdVRhZ05hbWUpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7
CisgICAgICB9IGVsc2UgcmV0dXJuIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7
CisgICAgfSwKKworICAgIGlkOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgaWQsIGNvbWJpbmF0b3Ip
IHsKKyAgICAgIHZhciB0YXJnZXROb2RlID0gJChpZCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsK
KworICAgICAgaWYgKHJvb3QgPT0gZG9jdW1lbnQpIHsKKyAgICAgICAgaWYgKCF0YXJnZXROb2Rl
KSByZXR1cm4gW107CisgICAgICAgIGlmICghbm9kZXMpIHJldHVybiBbdGFyZ2V0Tm9kZV07Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXJvb3Quc291cmNlSW5kZXggfHwgcm9vdC5zb3Vy
Y2VJbmRleCA8IDEpIHsKKyAgICAgICAgICB2YXIgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCcqJyk7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIG5vZGU7IG5vZGUgPSBub2Rl
c1tqXTsgaisrKSB7CisgICAgICAgICAgICBpZiAobm9kZS5pZCA9PT0gaWQpIHJldHVybiBbbm9k
ZV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChub2Rlcykg
eworICAgICAgICBpZiAoY29tYmluYXRvcikgeworICAgICAgICAgIGlmIChjb21iaW5hdG9yID09
ICdjaGlsZCcpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUucGFyZW50Tm9kZSA9PSBu
b2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmluYXRv
ciA9PSAnZGVzY2VuZGFudCcpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBu
b2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKEVsZW1lbnQuZGVzY2VuZGFu
dE9mKHRhcmdldE5vZGUsIG5vZGUpKSByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgICAgIH0g
ZWxzZSBpZiAoY29tYmluYXRvciA9PSAnYWRqYWNlbnQnKSB7CisgICAgICAgICAgICBmb3IgKHZh
ciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGlmIChT
ZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKHRhcmdldE5vZGUpID09IG5v
ZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAgICAgICAgICB9IGVs
c2Ugbm9kZXMgPSBoW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgICAgfQorICAgICAgICBmb3Ig
KHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgaWYgKG5v
ZGUgPT0gdGFyZ2V0Tm9kZSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAgICAgICAgcmV0dXJuIFtd
OworICAgICAgfQorICAgICAgcmV0dXJuICh0YXJnZXROb2RlICYmIEVsZW1lbnQuZGVzY2VuZGFu
dE9mKHRhcmdldE5vZGUsIHJvb3QpKSA/IFt0YXJnZXROb2RlXSA6IFtdOworICAgIH0sCisKKyAg
ICBjbGFzc05hbWU6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBjbGFzc05hbWUsIGNvbWJpbmF0b3Ip
IHsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRv
cl0obm9kZXMpOworICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJzLmJ5Q2xhc3NOYW1lKG5v
ZGVzLCByb290LCBjbGFzc05hbWUpOworICAgIH0sCisKKyAgICBieUNsYXNzTmFtZTogZnVuY3Rp
b24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSkgeworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSBT
ZWxlY3Rvci5oYW5kbGVycy5kZXNjZW5kYW50KFtyb290XSk7CisgICAgICB2YXIgbmVlZGxlID0g
JyAnICsgY2xhc3NOYW1lICsgJyAnOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBb
XSwgbm9kZSwgbm9kZUNsYXNzTmFtZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAg
bm9kZUNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lOworICAgICAgICBpZiAobm9kZUNsYXNzTmFt
ZS5sZW5ndGggPT0gMCkgY29udGludWU7CisgICAgICAgIGlmIChub2RlQ2xhc3NOYW1lID09IGNs
YXNzTmFtZSB8fCAoJyAnICsgbm9kZUNsYXNzTmFtZSArICcgJykuaW5jbHVkZShuZWVkbGUpKQor
ICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1
bHRzOworICAgIH0sCisKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBh
dHRyLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2Rl
cyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAg
ICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAg
aWYgKEVsZW1lbnQuaGFzQXR0cmlidXRlKG5vZGUsIGF0dHIpKSByZXN1bHRzLnB1c2gobm9kZSk7
CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgYXR0cjogZnVuY3Rpb24obm9k
ZXMsIHJvb3QsIGF0dHIsIHZhbHVlLCBvcGVyYXRvciwgY29tYmluYXRvcikgeworICAgICAgaWYg
KCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisgICAgICBp
ZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsK
KyAgICAgIHZhciBoYW5kbGVyID0gU2VsZWN0b3Iub3BlcmF0b3JzW29wZXJhdG9yXSwgcmVzdWx0
cyA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsr
KSB7CisgICAgICAgIHZhciBub2RlVmFsdWUgPSBFbGVtZW50LnJlYWRBdHRyaWJ1dGUobm9kZSwg
YXR0cik7CisgICAgICAgIGlmIChub2RlVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlOworICAgICAg
ICBpZiAoaGFuZGxlcihub2RlVmFsdWUsIHZhbHVlKSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAg
ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIHBzZXVkbzogZnVuY3Rp
b24obm9kZXMsIG5hbWUsIHZhbHVlLCByb290LCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAobm9k
ZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAg
IGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworICAg
ICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3NbbmFtZV0obm9kZXMsIHZhbHVlLCByb290KTsKKyAg
ICB9CisgIH0sCisKKyAgcHNldWRvczogeworICAgICdmaXJzdC1jaGlsZCc6IGZ1bmN0aW9uKG5v
ZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRs
ZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcobm9kZSkpIGNvbnRpbnVlOworICAgICAgICAgIHJl
c3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0s
CisgICAgJ2xhc3QtY2hpbGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsr
KSB7CisgICAgICAgIGlmIChTZWxlY3Rvci5oYW5kbGVycy5uZXh0RWxlbWVudFNpYmxpbmcobm9k
ZSkpIGNvbnRpbnVlOworICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisgICAgJ29ubHktY2hpbGQnOiBmdW5jdGlvbihu
b2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnM7Cisg
ICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07
IGkrKykKKyAgICAgICAgaWYgKCFoLnByZXZpb3VzRWxlbWVudFNpYmxpbmcobm9kZSkgJiYgIWgu
bmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpKQorICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsK
KyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisgICAgJ250aC1jaGlsZCc6ICAgICAgICBm
dW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBz
ZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290KTsKKyAgICB9LAorICAgICdudGgtbGFzdC1j
aGlsZCc6ICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBT
ZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgdHJ1ZSk7CisgICAgfSwK
KyAgICAnbnRoLW9mLXR5cGUnOiAgICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7
CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3Qs
IGZhbHNlLCB0cnVlKTsKKyAgICB9LAorICAgICdudGgtbGFzdC1vZi10eXBlJzogZnVuY3Rpb24o
bm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50
aChub2RlcywgZm9ybXVsYSwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnZmlyc3Qt
b2YtdHlwZSc6ICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1
cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwgZmFsc2UsIHRydWUpOwor
ICAgIH0sCisgICAgJ2xhc3Qtb2YtdHlwZSc6ICAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwg
cm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCAiMSIsIHJv
b3QsIHRydWUsIHRydWUpOworICAgIH0sCisgICAgJ29ubHktb2YtdHlwZSc6ICAgICBmdW5jdGlv
bihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgdmFyIHAgPSBTZWxlY3Rvci5wc2V1ZG9z
OworICAgICAgcmV0dXJuIHBbJ2xhc3Qtb2YtdHlwZSddKHBbJ2ZpcnN0LW9mLXR5cGUnXShub2Rl
cywgZm9ybXVsYSwgcm9vdCksIGZvcm11bGEsIHJvb3QpOworICAgIH0sCisKKyAgICBnZXRJbmRp
Y2VzOiBmdW5jdGlvbihhLCBiLCB0b3RhbCkgeworICAgICAgaWYgKGEgPT0gMCkgcmV0dXJuIGIg
PiAwID8gW2JdIDogW107CisgICAgICByZXR1cm4gJFIoMSwgdG90YWwpLmluamVjdChbXSwgZnVu
Y3Rpb24obWVtbywgaSkgeworICAgICAgICBpZiAoMCA9PSAoaSAtIGIpICUgYSAmJiAoaSAtIGIp
IC8gYSA+PSAwKSBtZW1vLnB1c2goaSk7CisgICAgICAgIHJldHVybiBtZW1vOworICAgICAgfSk7
CisgICAgfSwKKworICAgIG50aDogZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QsIHJldmVy
c2UsIG9mVHlwZSkgeworICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107Cisg
ICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7CisgICAgICBpZiAo
Zm9ybXVsYSA9PSAnb2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CisgICAgICB2YXIgaCA9IFNlbGVj
dG9yLmhhbmRsZXJzLCByZXN1bHRzID0gW10sIGluZGV4ZWQgPSBbXSwgbTsKKyAgICAgIGgubWFy
ayhub2Rlcyk7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspIHsKKyAgICAgICAgaWYgKCFub2RlLnBhcmVudE5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkg
eworICAgICAgICAgIGguaW5kZXgobm9kZS5wYXJlbnROb2RlLCByZXZlcnNlLCBvZlR5cGUpOwor
ICAgICAgICAgIGluZGV4ZWQucHVzaChub2RlLnBhcmVudE5vZGUpOworICAgICAgICB9CisgICAg
ICB9CisgICAgICBpZiAoZm9ybXVsYS5tYXRjaCgvXlxkKyQvKSkgeyAvLyBqdXN0IGEgbnVtYmVy
CisgICAgICAgIGZvcm11bGEgPSBOdW1iZXIoZm9ybXVsYSk7CisgICAgICAgIGZvciAodmFyIGkg
PSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZS5ub2Rl
SW5kZXggPT0gZm9ybXVsYSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfSBlbHNlIGlmICht
ID0gZm9ybXVsYS5tYXRjaCgvXigtP1xkKik/bigoWystXSkoXGQrKSk/LykpIHsgLy8gYW4rYgor
ICAgICAgICBpZiAobVsxXSA9PSAiLSIpIG1bMV0gPSAtMTsKKyAgICAgICAgdmFyIGEgPSBtWzFd
ID8gTnVtYmVyKG1bMV0pIDogMTsKKyAgICAgICAgdmFyIGIgPSBtWzJdID8gTnVtYmVyKG1bMl0p
IDogMDsKKyAgICAgICAgdmFyIGluZGljZXMgPSBTZWxlY3Rvci5wc2V1ZG9zLmdldEluZGljZXMo
YSwgYiwgbm9kZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUsIGwgPSBp
bmRpY2VzLmxlbmd0aDsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgICBmb3IgKHZh
ciBqID0gMDsgaiA8IGw7IGorKykKKyAgICAgICAgICAgIGlmIChub2RlLm5vZGVJbmRleCA9PSBp
bmRpY2VzW2pdKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAg
IGgudW5tYXJrKG5vZGVzKTsKKyAgICAgIGgudW5tYXJrKGluZGV4ZWQpOworICAgICAgcmV0dXJu
IHJlc3VsdHM7CisgICAgfSwKKworICAgICdlbXB0eSc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwg
cm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PSAnIScgfHwgbm9k
ZS5maXJzdENoaWxkKSBjb250aW51ZTsKKyAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAg
ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdub3QnOiBmdW5jdGlv
bihub2Rlcywgc2VsZWN0b3IsIHJvb3QpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxl
cnMsIHNlbGVjdG9yVHlwZSwgbTsKKyAgICAgIHZhciBleGNsdXNpb25zID0gbmV3IFNlbGVjdG9y
KHNlbGVjdG9yKS5maW5kRWxlbWVudHMocm9vdCk7CisgICAgICBoLm1hcmsoZXhjbHVzaW9ucyk7
CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNb
aV07IGkrKykKKyAgICAgICAgaWYgKCFub2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMu
cHVzaChub2RlKTsKKyAgICAgIGgudW5tYXJrKGV4Y2x1c2lvbnMpOworICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgfSwKKworICAgICdlbmFibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCBy
b290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0g
bm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKCFub2RlLmRpc2FibGVkICYmICghbm9kZS50eXBl
IHx8IG5vZGUudHlwZSAhPT0gJ2hpZGRlbicpKQorICAgICAgICAgIHJlc3VsdHMucHVzaChub2Rl
KTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZGlzYWJsZWQnOiBmdW5j
dGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRz
ID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS5kaXNh
YmxlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwK
KworICAgICdjaGVja2VkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBm
b3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykK
KyAgICAgICAgaWYgKG5vZGUuY2hlY2tlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0
dXJuIHJlc3VsdHM7CisgICAgfQorICB9LAorCisgIG9wZXJhdG9yczogeworICAgICc9JzogIGZ1
bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2OyB9LAorICAgICchPSc6IGZ1bmN0aW9uKG52
LCB2KSB7IHJldHVybiBudiAhPSB2OyB9LAorICAgICdePSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJl
dHVybiBudiA9PSB2IHx8IG52ICYmIG52LnN0YXJ0c1dpdGgodik7IH0sCisgICAgJyQ9JzogZnVu
Y3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYuZW5kc1dpdGgodik7IH0s
CisgICAgJyo9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYu
aW5jbHVkZSh2KTsgfSwKKyAgICAnfj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gKCcgJyAr
IG52ICsgJyAnKS5pbmNsdWRlKCcgJyArIHYgKyAnICcpOyB9LAorICAgICd8PSc6IGZ1bmN0aW9u
KG52LCB2KSB7IHJldHVybiAoJy0nICsgKG52IHx8ICIiKS50b1VwcGVyQ2FzZSgpICsKKyAgICAg
Jy0nKS5pbmNsdWRlKCctJyArICh2IHx8ICIiKS50b1VwcGVyQ2FzZSgpICsgJy0nKTsgfQorICB9
LAorCisgIHNwbGl0OiBmdW5jdGlvbihleHByZXNzaW9uKSB7CisgICAgdmFyIGV4cHJlc3Npb25z
ID0gW107CisgICAgZXhwcmVzc2lvbi5zY2FuKC8oKFtcdyM6Ln4+KygpXHMtXSt8XCp8XFsuKj9c
XSkrKVxzKigsfCQpLywgZnVuY3Rpb24obSkgeworICAgICAgZXhwcmVzc2lvbnMucHVzaChtWzFd
LnN0cmlwKCkpOworICAgIH0pOworICAgIHJldHVybiBleHByZXNzaW9uczsKKyAgfSwKKworICBt
YXRjaEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbikgeworICAgIHZhciBt
YXRjaGVzID0gJCQoZXhwcmVzc2lvbiksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICBoLm1h
cmsobWF0Y2hlcyk7CisgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgZWxlbWVudDsg
ZWxlbWVudCA9IGVsZW1lbnRzW2ldOyBpKyspCisgICAgICBpZiAoZWxlbWVudC5fY291bnRlZEJ5
UHJvdG90eXBlKSByZXN1bHRzLnB1c2goZWxlbWVudCk7CisgICAgaC51bm1hcmsobWF0Y2hlcyk7
CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9uKGVs
ZW1lbnRzLCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGlmIChPYmplY3QuaXNOdW1iZXIoZXhw
cmVzc2lvbikpIHsKKyAgICAgIGluZGV4ID0gZXhwcmVzc2lvbjsgZXhwcmVzc2lvbiA9IGZhbHNl
OworICAgIH0KKyAgICByZXR1cm4gU2VsZWN0b3IubWF0Y2hFbGVtZW50cyhlbGVtZW50cywgZXhw
cmVzc2lvbiB8fCAnKicpW2luZGV4IHx8IDBdOworICB9LAorCisgIGZpbmRDaGlsZEVsZW1lbnRz
OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9ucykgeworICAgIGV4cHJlc3Npb25zID0gU2Vs
ZWN0b3Iuc3BsaXQoZXhwcmVzc2lvbnMuam9pbignLCcpKTsKKyAgICB2YXIgcmVzdWx0cyA9IFtd
LCBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBleHByZXNz
aW9ucy5sZW5ndGgsIHNlbGVjdG9yOyBpIDwgbDsgaSsrKSB7CisgICAgICBzZWxlY3RvciA9IG5l
dyBTZWxlY3RvcihleHByZXNzaW9uc1tpXS5zdHJpcCgpKTsKKyAgICAgIGguY29uY2F0KHJlc3Vs
dHMsIHNlbGVjdG9yLmZpbmRFbGVtZW50cyhlbGVtZW50KSk7CisgICAgfQorICAgIHJldHVybiAo
bCA+IDEpID8gaC51bmlxdWUocmVzdWx0cykgOiByZXN1bHRzOworICB9Cit9KTsKKworaWYgKFBy
b3RvdHlwZS5Ccm93c2VyLklFKSB7CisgIE9iamVjdC5leHRlbmQoU2VsZWN0b3IuaGFuZGxlcnMs
IHsKKyAgICBjb25jYXQ6IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBu
b2RlOyBub2RlID0gYltpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS50YWdOYW1lICE9PSAiISIp
IGEucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgfSk7Cit9CisKK2Z1bmN0
aW9uICQkKCkgeworICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZG9jdW1lbnQs
ICRBKGFyZ3VtZW50cykpOworfQorCit2YXIgRm9ybSA9IHsKKyAgcmVzZXQ6IGZ1bmN0aW9uKGZv
cm0pIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICBmb3JtLnJlc2V0KCk7CisgICAgcmV0dXJu
IGZvcm07CisgIH0sCisKKyAgc2VyaWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBv
cHRpb25zKSB7CisgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKSBvcHRpb25zID0g
eyBoYXNoOiAhIW9wdGlvbnMgfTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNVbmRlZmluZWQob3B0
aW9ucy5oYXNoKSkgb3B0aW9ucy5oYXNoID0gdHJ1ZTsKKyAgICB2YXIga2V5LCB2YWx1ZSwgc3Vi
bWl0dGVkID0gZmFsc2UsIHN1Ym1pdCA9IG9wdGlvbnMuc3VibWl0OworCisgICAgdmFyIGRhdGEg
PSBlbGVtZW50cy5pbmplY3QoeyB9LCBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnQpIHsKKyAgICAg
IGlmICghZWxlbWVudC5kaXNhYmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKKyAgICAgICAga2V5ID0g
ZWxlbWVudC5uYW1lOyB2YWx1ZSA9ICQoZWxlbWVudCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYg
KHZhbHVlICE9IG51bGwgJiYgZWxlbWVudC50eXBlICE9ICdmaWxlJyAmJiAoZWxlbWVudC50eXBl
ICE9ICdzdWJtaXQnIHx8ICghc3VibWl0dGVkICYmCisgICAgICAgICAgICBzdWJtaXQgIT09IGZh
bHNlICYmICghc3VibWl0IHx8IGtleSA9PSBzdWJtaXQpICYmIChzdWJtaXR0ZWQgPSB0cnVlKSkp
KSB7CisgICAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgICAgIGlmICghT2Jq
ZWN0LmlzQXJyYXkocmVzdWx0W2tleV0pKSByZXN1bHRba2V5XSA9IFtyZXN1bHRba2V5XV07Cisg
ICAgICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAg
ICAgZWxzZSByZXN1bHRba2V5XSA9IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0pOworCisgICAgcmV0dXJuIG9wdGlvbnMuaGFzaCA/IGRhdGEg
OiBPYmplY3QudG9RdWVyeVN0cmluZyhkYXRhKTsKKyAgfQorfTsKKworRm9ybS5NZXRob2RzID0g
eworICBzZXJpYWxpemU6IGZ1bmN0aW9uKGZvcm0sIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gRm9y
bS5zZXJpYWxpemVFbGVtZW50cyhGb3JtLmdldEVsZW1lbnRzKGZvcm0pLCBvcHRpb25zKTsKKyAg
fSwKKworICBnZXRFbGVtZW50czogZnVuY3Rpb24oZm9ybSkgeworICAgIHZhciBlbGVtZW50cyA9
ICQoZm9ybSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSwKKyAgICAgICAgZWxlbWVudCwKKyAg
ICAgICAgYXJyID0gWyBdLAorICAgICAgICBzZXJpYWxpemVycyA9IEZvcm0uRWxlbWVudC5TZXJp
YWxpemVyczsKKyAgICBmb3IgKHZhciBpID0gMDsgZWxlbWVudCA9IGVsZW1lbnRzW2ldOyBpKysp
IHsKKyAgICAgIGFyci5wdXNoKGVsZW1lbnQpOworICAgIH0KKyAgICByZXR1cm4gYXJyLmluamVj
dChbXSwgZnVuY3Rpb24oZWxlbWVudHMsIGNoaWxkKSB7CisgICAgICBpZiAoc2VyaWFsaXplcnNb
Y2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKKyAgICAgICAgZWxlbWVudHMucHVzaChFbGVt
ZW50LmV4dGVuZChjaGlsZCkpOworICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgIH0pCisgIH0s
CisKKyAgZ2V0SW5wdXRzOiBmdW5jdGlvbihmb3JtLCB0eXBlTmFtZSwgbmFtZSkgeworICAgIGZv
cm0gPSAkKGZvcm0pOworICAgIHZhciBpbnB1dHMgPSBmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCdpbnB1dCcpOworCisgICAgaWYgKCF0eXBlTmFtZSAmJiAhbmFtZSkgcmV0dXJuICRBKGlucHV0
cykubWFwKEVsZW1lbnQuZXh0ZW5kKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBtYXRjaGluZ0lu
cHV0cyA9IFtdLCBsZW5ndGggPSBpbnB1dHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAg
ICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTsKKyAgICAgIGlmICgodHlwZU5hbWUgJiYgaW5wdXQu
dHlwZSAhPSB0eXBlTmFtZSkgfHwgKG5hbWUgJiYgaW5wdXQubmFtZSAhPSBuYW1lKSkKKyAgICAg
ICAgY29udGludWU7CisgICAgICBtYXRjaGluZ0lucHV0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGlu
cHV0KSk7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoaW5nSW5wdXRzOworICB9LAorCisgIGRp
c2FibGU6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICBGb3JtLmdl
dEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZGlzYWJsZScpOworICAgIHJldHVybiBmb3JtOworICB9
LAorCisgIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAg
IEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCdlbmFibGUnKTsKKyAgICByZXR1cm4gZm9y
bTsKKyAgfSwKKworICBmaW5kRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CisgICAgdmFy
IGVsZW1lbnRzID0gJChmb3JtKS5nZXRFbGVtZW50cygpLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgICAgcmV0dXJuICdoaWRkZW4nICE9IGVsZW1lbnQudHlwZSAmJiAhZWxlbWVudC5k
aXNhYmxlZDsKKyAgICB9KTsKKyAgICB2YXIgZmlyc3RCeUluZGV4ID0gZWxlbWVudHMuZmluZEFs
bChmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUo
J3RhYkluZGV4JykgJiYgZWxlbWVudC50YWJJbmRleCA+PSAwOworICAgIH0pLnNvcnRCeShmdW5j
dGlvbihlbGVtZW50KSB7IHJldHVybiBlbGVtZW50LnRhYkluZGV4IH0pLmZpcnN0KCk7CisKKyAg
ICByZXR1cm4gZmlyc3RCeUluZGV4ID8gZmlyc3RCeUluZGV4IDogZWxlbWVudHMuZmluZChmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgICByZXR1cm4gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEp
JC9pLnRlc3QoZWxlbWVudC50YWdOYW1lKTsKKyAgICB9KTsKKyAgfSwKKworICBmb2N1c0ZpcnN0
RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIGZvcm0u
ZmluZEZpcnN0RWxlbWVudCgpLmFjdGl2YXRlKCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisK
KyAgcmVxdWVzdDogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgeworICAgIGZvcm0gPSAkKGZvcm0p
LCBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMgfHwgeyB9KTsKKworICAgIHZhciBwYXJh
bXMgPSBvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbiA9IGZvcm0ucmVhZEF0dHJpYnV0ZSgnYWN0
aW9uJykgfHwgJyc7CisgICAgaWYgKGFjdGlvbi5ibGFuaygpKSBhY3Rpb24gPSB3aW5kb3cubG9j
YXRpb24uaHJlZjsKKyAgICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNlcmlhbGl6ZSh0cnVl
KTsKKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgIGlmIChPYmplY3QuaXNTdHJpbmcocGFyYW1z
KSkgcGFyYW1zID0gcGFyYW1zLnRvUXVlcnlQYXJhbXMoKTsKKyAgICAgIE9iamVjdC5leHRlbmQo
b3B0aW9ucy5wYXJhbWV0ZXJzLCBwYXJhbXMpOworICAgIH0KKworICAgIGlmIChmb3JtLmhhc0F0
dHJpYnV0ZSgnbWV0aG9kJykgJiYgIW9wdGlvbnMubWV0aG9kKQorICAgICAgb3B0aW9ucy5tZXRo
b2QgPSBmb3JtLm1ldGhvZDsKKworICAgIHJldHVybiBuZXcgQWpheC5SZXF1ZXN0KGFjdGlvbiwg
b3B0aW9ucyk7CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK0Zvcm0uRWxl
bWVudCA9IHsKKyAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLmZv
Y3VzKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2VsZWN0OiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgJChlbGVtZW50KS5zZWxlY3QoKTsKKyAgICByZXR1cm4gZWxlbWVudDsK
KyAgfQorfTsKKworRm9ybS5FbGVtZW50Lk1ldGhvZHMgPSB7CisKKyAgc2VyaWFsaXplOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKCFlbGVt
ZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgeworICAgICAgdmFyIHZhbHVlID0gZWxlbWVu
dC5nZXRWYWx1ZSgpOworICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgeworICAgICAgICB2
YXIgcGFpciA9IHsgfTsKKyAgICAgICAgcGFpcltlbGVtZW50Lm5hbWVdID0gdmFsdWU7CisgICAg
ICAgIHJldHVybiBPYmplY3QudG9RdWVyeVN0cmluZyhwYWlyKTsKKyAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuICcnOworICB9LAorCisgIGdldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFt
ZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0
aG9kXShlbGVtZW50KTsKKyAgfSwKKworICBzZXRWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFs
dWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbWV0aG9kID0gZWxlbWVu
dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW21l
dGhvZF0oZWxlbWVudCwgdmFsdWUpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGNs
ZWFyOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChlbGVtZW50KS52YWx1ZSA9ICcnOworICAg
IHJldHVybiBlbGVtZW50OworICB9LAorCisgIHByZXNlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICByZXR1cm4gJChlbGVtZW50KS52YWx1ZSAhPSAnJzsKKyAgfSwKKworICBhY3RpdmF0ZTog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHRyeSB7
CisgICAgICBlbGVtZW50LmZvY3VzKCk7CisgICAgICBpZiAoZWxlbWVudC5zZWxlY3QgJiYgKGVs
ZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgfHwKKyAgICAgICAgICAhKC9e
KD86YnV0dG9ufHJlc2V0fHN1Ym1pdCkkL2kudGVzdChlbGVtZW50LnR5cGUpKSkpCisgICAgICAg
IGVsZW1lbnQuc2VsZWN0KCk7CisgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgcmV0dXJuIGVsZW1l
bnQ7CisgIH0sCisKKyAgZGlzYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGVuYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTsKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZhciBGaWVs
ZCA9IEZvcm0uRWxlbWVudDsKKwordmFyICRGID0gRm9ybS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFs
dWU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMg
PSB7CisgIGlucHV0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZWxl
bWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNhc2UgJ2NoZWNrYm94JzoKKyAgICAg
IGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy5p
bnB1dFNlbGVjdG9yKGVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJl
dHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMudGV4dGFyZWEoZWxlbWVudCwgdmFsdWUpOwor
ICAgIH0KKyAgfSwKKworICBpbnB1dFNlbGVjdG9yOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkg
eworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gZWxlbWVudC5jaGVj
a2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7CisgICAgZWxzZSBlbGVtZW50LmNoZWNrZWQgPSAh
IXZhbHVlOworICB9LAorCisgIHRleHRhcmVhOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewor
ICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gZWxlbWVudC52YWx1ZTsK
KyAgICBlbHNlIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKKyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0
aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkp
CisgICAgICByZXR1cm4gdGhpc1tlbGVtZW50LnR5cGUgPT0gJ3NlbGVjdC1vbmUnID8KKyAgICAg
ICAgJ3NlbGVjdE9uZScgOiAnc2VsZWN0TWFueSddKGVsZW1lbnQpOworICAgIGVsc2UgeworICAg
ICAgdmFyIG9wdCwgY3VycmVudFZhbHVlLCBzaW5nbGUgPSAhT2JqZWN0LmlzQXJyYXkodmFsdWUp
OworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOyBpIDwgbGVu
Z3RoOyBpKyspIHsKKyAgICAgICAgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOworICAgICAgICBj
dXJyZW50VmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKG9wdCk7CisgICAgICAgIGlmIChzaW5nbGUp
IHsKKyAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09IHZhbHVlKSB7CisgICAgICAgICAgICBv
cHQuc2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBlbHNlIG9wdC5zZWxlY3RlZCA9IHZhbHVlLmluY2x1ZGUoY3VycmVu
dFZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgc2VsZWN0T25lOiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgdmFyIGluZGV4ID0gZWxlbWVudC5zZWxlY3RlZEluZGV4OworICAgIHJl
dHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhd
KSA6IG51bGw7CisgIH0sCisKKyAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IHZhciB2YWx1ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOworICAgIGlmICghbGVuZ3RoKSBy
ZXR1cm4gbnVsbDsKKworICAgIGZvciAodmFyIGkgPSAwLCB2YWx1ZXMgPSBbXTsgaSA8IGxlbmd0
aDsgaSsrKSB7CisgICAgICB2YXIgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOworICAgICAgaWYg
KG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRpb25WYWx1ZShvcHQpKTsKKyAgICB9
CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBvcHRpb25WYWx1ZTogZnVuY3Rpb24ob3B0
KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKG9wdCkuaGFzQXR0cmlidXRlKCd2YWx1ZScp
ID8gb3B0LnZhbHVlIDogb3B0LnRleHQ7CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0q
LworCisKK0Fic3RyYWN0LlRpbWVkT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4
ZWN1dGVyLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgZWxlbWVudCwgZnJlcXVl
bmN5LCBjYWxsYmFjaykgeworICAgICRzdXBlcihjYWxsYmFjaywgZnJlcXVlbmN5KTsKKyAgICB0
aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7CisgICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdl
dFZhbHVlKCk7CisgIH0sCisKKyAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVl
ID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmIChPYmplY3QuaXNTdHJpbmcodGhpcy5sYXN0VmFs
dWUpICYmIE9iamVjdC5pc1N0cmluZyh2YWx1ZSkgPworICAgICAgICB0aGlzLmxhc3RWYWx1ZSAh
PSB2YWx1ZSA6IFN0cmluZyh0aGlzLmxhc3RWYWx1ZSkgIT0gU3RyaW5nKHZhbHVlKSkgeworICAg
ICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIHRoaXMubGFzdFZh
bHVlID0gdmFsdWU7CisgICAgfQorICB9Cit9KTsKKworRm9ybS5FbGVtZW50Lk9ic2VydmVyID0g
Q2xhc3MuY3JlYXRlKEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsK
KyAgfQorfSk7CisKK0Zvcm0uT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRP
YnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2Vy
aWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8K
KworQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6
IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7CisgICAgdGhpcy5lbGVtZW50ICA9ICQoZWxl
bWVudCk7CisgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgdGhpcy5sYXN0VmFs
dWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93
ZXJDYXNlKCkgPT0gJ2Zvcm0nKQorICAgICAgdGhpcy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsK
KyAgICBlbHNlCisgICAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5lbGVtZW50KTsKKyAg
fSwKKworICBvbkVsZW1lbnRFdmVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhp
cy5nZXRWYWx1ZSgpOworICAgIGlmICh0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1ZSkgeworICAgICAg
dGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVl
ID0gdmFsdWU7CisgICAgfQorICB9LAorCisgIHJlZ2lzdGVyRm9ybUNhbGxiYWNrczogZnVuY3Rp
b24oKSB7CisgICAgRm9ybS5nZXRFbGVtZW50cyh0aGlzLmVsZW1lbnQpLmVhY2godGhpcy5yZWdp
c3RlckNhbGxiYWNrLCB0aGlzKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQudHlwZSkgeworICAgICAgc3dpdGNoIChlbGVt
ZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgICBjYXNlICdjaGVja2JveCc6CisgICAg
ICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGlj
aycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CisgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdl
JywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgIH0KKyAgICB9CisgIH0KK30pOworCitGb3JtLkVsZW1lbnQuRXZlbnRPYnNlcnZlciA9IENs
YXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7Cisg
IH0KK30pOworCitGb3JtLkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZl
bnRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0u
c2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworKGZ1bmN0aW9uKCkgeworCisgIHZh
ciBFdmVudCA9IHsKKyAgICBLRVlfQkFDS1NQQUNFOiA4LAorICAgIEtFWV9UQUI6ICAgICAgIDks
CisgICAgS0VZX1JFVFVSTjogICAxMywKKyAgICBLRVlfRVNDOiAgICAgIDI3LAorICAgIEtFWV9M
RUZUOiAgICAgMzcsCisgICAgS0VZX1VQOiAgICAgICAzOCwKKyAgICBLRVlfUklHSFQ6ICAgIDM5
LAorICAgIEtFWV9ET1dOOiAgICAgNDAsCisgICAgS0VZX0RFTEVURTogICA0NiwKKyAgICBLRVlf
SE9NRTogICAgIDM2LAorICAgIEtFWV9FTkQ6ICAgICAgMzUsCisgICAgS0VZX1BBR0VVUDogICAz
MywKKyAgICBLRVlfUEFHRURPV046IDM0LAorICAgIEtFWV9JTlNFUlQ6ICAgNDUsCisKKyAgICBj
YWNoZToge30KKyAgfTsKKworICB2YXIgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7
CisgIHZhciBNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRCA9ICdvbm1vdXNl
ZW50ZXInIGluIGRvY0VsCisgICAgJiYgJ29ubW91c2VsZWF2ZScgaW4gZG9jRWw7CisKKyAgdmFy
IF9pc0J1dHRvbjsKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgdmFyIGJ1dHRv
bk1hcCA9IHsgMDogMSwgMTogNCwgMjogMiB9OworICAgIF9pc0J1dHRvbiA9IGZ1bmN0aW9uKGV2
ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4gZXZlbnQuYnV0dG9uID09PSBidXR0b25NYXBbY29k
ZV07CisgICAgfTsKKyAgfSBlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAg
ICBfaXNCdXR0b24gPSBmdW5jdGlvbihldmVudCwgY29kZSkgeworICAgICAgc3dpdGNoIChjb2Rl
KSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIGV2ZW50LndoaWNoID09IDEgJiYgIWV2ZW50Lm1l
dGFLZXk7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50LndoaWNoID09IDEgJiYgZXZlbnQu
bWV0YUtleTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH07
CisgIH0gZWxzZSB7CisgICAgX2lzQnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKKyAg
ICAgIHJldHVybiBldmVudC53aGljaCA/IChldmVudC53aGljaCA9PT0gY29kZSArIDEpIDogKGV2
ZW50LmJ1dHRvbiA9PT0gY29kZSk7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzTGVmdENs
aWNrKGV2ZW50KSAgIHsgcmV0dXJuIF9pc0J1dHRvbihldmVudCwgMCkgfQorCisgIGZ1bmN0aW9u
IGlzTWlkZGxlQ2xpY2soZXZlbnQpIHsgcmV0dXJuIF9pc0J1dHRvbihldmVudCwgMSkgfQorCisg
IGZ1bmN0aW9uIGlzUmlnaHRDbGljayhldmVudCkgIHsgcmV0dXJuIF9pc0J1dHRvbihldmVudCwg
MikgfQorCisgIGZ1bmN0aW9uIGVsZW1lbnQoZXZlbnQpIHsKKyAgICBldmVudCA9IEV2ZW50LmV4
dGVuZChldmVudCk7CisKKyAgICB2YXIgbm9kZSA9IGV2ZW50LnRhcmdldCwgdHlwZSA9IGV2ZW50
LnR5cGUsCisgICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0OworCisgICAg
aWYgKGN1cnJlbnRUYXJnZXQgJiYgY3VycmVudFRhcmdldC50YWdOYW1lKSB7CisgICAgICBpZiAo
dHlwZSA9PT0gJ2xvYWQnIHx8IHR5cGUgPT09ICdlcnJvcicgfHwKKyAgICAgICAgKHR5cGUgPT09
ICdjbGljaycgJiYgY3VycmVudFRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1
dCcKKyAgICAgICAgICAmJiBjdXJyZW50VGFyZ2V0LnR5cGUgPT09ICdyYWRpbycpKQorICAgICAg
ICAgICAgbm9kZSA9IGN1cnJlbnRUYXJnZXQ7CisgICAgfQorCisgICAgaWYgKG5vZGUubm9kZVR5
cGUgPT0gTm9kZS5URVhUX05PREUpCisgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOworCisg
ICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKG5vZGUpOworICB9CisKKyAgZnVuY3Rpb24gZmluZEVs
ZW1lbnQoZXZlbnQsIGV4cHJlc3Npb24pIHsKKyAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmVsZW1l
bnQoZXZlbnQpOworICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuIGVsZW1lbnQ7CisgICAgdmFy
IGVsZW1lbnRzID0gW2VsZW1lbnRdLmNvbmNhdChlbGVtZW50LmFuY2VzdG9ycygpKTsKKyAgICBy
ZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQoZWxlbWVudHMsIGV4cHJlc3Npb24sIDApOworICB9
CisKKyAgZnVuY3Rpb24gcG9pbnRlcihldmVudCkgeworICAgIHJldHVybiB7IHg6IHBvaW50ZXJY
KGV2ZW50KSwgeTogcG9pbnRlclkoZXZlbnQpIH07CisgIH0KKworICBmdW5jdGlvbiBwb2ludGVy
WChldmVudCkgeworICAgIHZhciBkb2NFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50
LAorICAgICBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCB7IHNjcm9sbExlZnQ6IDAgfTsKKworICAg
IHJldHVybiBldmVudC5wYWdlWCB8fCAoZXZlbnQuY2xpZW50WCArCisgICAgICAoZG9jRWxlbWVu
dC5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdCkgLQorICAgICAgKGRvY0VsZW1lbnQuY2xp
ZW50TGVmdCB8fCAwKSk7CisgIH0KKworICBmdW5jdGlvbiBwb2ludGVyWShldmVudCkgeworICAg
IHZhciBkb2NFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorICAgICBib2R5ID0g
ZG9jdW1lbnQuYm9keSB8fCB7IHNjcm9sbFRvcDogMCB9OworCisgICAgcmV0dXJuICBldmVudC5w
YWdlWSB8fCAoZXZlbnQuY2xpZW50WSArCisgICAgICAgKGRvY0VsZW1lbnQuc2Nyb2xsVG9wIHx8
IGJvZHkuc2Nyb2xsVG9wKSAtCisgICAgICAgKGRvY0VsZW1lbnQuY2xpZW50VG9wIHx8IDApKTsK
KyAgfQorCisKKyAgZnVuY3Rpb24gc3RvcChldmVudCkgeworICAgIEV2ZW50LmV4dGVuZChldmVu
dCk7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICBldmVudC5zdG9wUHJvcGFnYXRp
b24oKTsKKworICAgIGV2ZW50LnN0b3BwZWQgPSB0cnVlOworICB9CisKKyAgRXZlbnQuTWV0aG9k
cyA9IHsKKyAgICBpc0xlZnRDbGljazogaXNMZWZ0Q2xpY2ssCisgICAgaXNNaWRkbGVDbGljazog
aXNNaWRkbGVDbGljaywKKyAgICBpc1JpZ2h0Q2xpY2s6IGlzUmlnaHRDbGljaywKKworICAgIGVs
ZW1lbnQ6IGVsZW1lbnQsCisgICAgZmluZEVsZW1lbnQ6IGZpbmRFbGVtZW50LAorCisgICAgcG9p
bnRlcjogcG9pbnRlciwKKyAgICBwb2ludGVyWDogcG9pbnRlclgsCisgICAgcG9pbnRlclk6IHBv
aW50ZXJZLAorCisgICAgc3RvcDogc3RvcAorICB9OworCisKKyAgdmFyIG1ldGhvZHMgPSBPYmpl
Y3Qua2V5cyhFdmVudC5NZXRob2RzKS5pbmplY3QoeyB9LCBmdW5jdGlvbihtLCBuYW1lKSB7Cisg
ICAgbVtuYW1lXSA9IEV2ZW50Lk1ldGhvZHNbbmFtZV0ubWV0aG9kaXplKCk7CisgICAgcmV0dXJu
IG07CisgIH0pOworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgeworICAgIGZ1bmN0aW9u
IF9yZWxhdGVkVGFyZ2V0KGV2ZW50KSB7CisgICAgICB2YXIgZWxlbWVudDsKKyAgICAgIHN3aXRj
aCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlICdtb3VzZW92ZXInOiBlbGVtZW50ID0gZXZl
bnQuZnJvbUVsZW1lbnQ7IGJyZWFrOworICAgICAgICBjYXNlICdtb3VzZW91dCc6ICBlbGVtZW50
ID0gZXZlbnQudG9FbGVtZW50OyAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVs
bDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KTsKKyAgICB9
CisKKyAgICBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIHsKKyAgICAgIHN0b3BQcm9wYWdhdGlvbjog
ZnVuY3Rpb24oKSB7IHRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZSB9LAorICAgICAgcHJldmVudERl
ZmF1bHQ6ICBmdW5jdGlvbigpIHsgdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlIH0sCisgICAgICBp
bnNwZWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuICdbb2JqZWN0IEV2ZW50XScgfQorICAgIH0pOwor
CisgICAgRXZlbnQuZXh0ZW5kID0gZnVuY3Rpb24oZXZlbnQsIGVsZW1lbnQpIHsKKyAgICAgIGlm
ICghZXZlbnQpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChldmVudC5fZXh0ZW5kZWRCeVByb3Rv
dHlwZSkgcmV0dXJuIGV2ZW50OworCisgICAgICBldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9
IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAgdmFyIHBvaW50ZXIgPSBFdmVudC5wb2lu
dGVyKGV2ZW50KTsKKworICAgICAgT2JqZWN0LmV4dGVuZChldmVudCwgeworICAgICAgICB0YXJn
ZXQ6IGV2ZW50LnNyY0VsZW1lbnQgfHwgZWxlbWVudCwKKyAgICAgICAgcmVsYXRlZFRhcmdldDog
X3JlbGF0ZWRUYXJnZXQoZXZlbnQpLAorICAgICAgICBwYWdlWDogIHBvaW50ZXIueCwKKyAgICAg
ICAgcGFnZVk6ICBwb2ludGVyLnkKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gT2JqZWN0LmV4
dGVuZChldmVudCwgbWV0aG9kcyk7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBFdmVudC5wcm90
b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlIHx8IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdI
VE1MRXZlbnRzJykuX19wcm90b19fOworICAgIE9iamVjdC5leHRlbmQoRXZlbnQucHJvdG90eXBl
LCBtZXRob2RzKTsKKyAgICBFdmVudC5leHRlbmQgPSBQcm90b3R5cGUuSzsKKyAgfQorCisgIGZ1
bmN0aW9uIF9jcmVhdGVSZXNwb25kZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7Cisg
ICAgdmFyIHJlZ2lzdHJ5ID0gRWxlbWVudC5yZXRyaWV2ZShlbGVtZW50LCAncHJvdG90eXBlX2V2
ZW50X3JlZ2lzdHJ5Jyk7CisKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHJlZ2lzdHJ5KSkg
eworICAgICAgQ0FDSEUucHVzaChlbGVtZW50KTsKKyAgICAgIHJlZ2lzdHJ5ID0gRWxlbWVudC5y
ZXRyaWV2ZShlbGVtZW50LCAncHJvdG90eXBlX2V2ZW50X3JlZ2lzdHJ5JywgJEgoKSk7CisgICAg
fQorCisgICAgdmFyIHJlc3BvbmRlcnNGb3JFdmVudCA9IHJlZ2lzdHJ5LmdldChldmVudE5hbWUp
OworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQocmVzcG9uZGVyc0ZvckV2ZW50KSkgeworICAg
ICAgcmVzcG9uZGVyc0ZvckV2ZW50ID0gW107CisgICAgICByZWdpc3RyeS5zZXQoZXZlbnROYW1l
LCByZXNwb25kZXJzRm9yRXZlbnQpOworICAgIH0KKworICAgIGlmIChyZXNwb25kZXJzRm9yRXZl
bnQucGx1Y2soJ2hhbmRsZXInKS5pbmNsdWRlKGhhbmRsZXIpKSByZXR1cm4gZmFsc2U7CisKKyAg
ICB2YXIgcmVzcG9uZGVyOworICAgIGlmIChldmVudE5hbWUuaW5jbHVkZSgiOiIpKSB7CisgICAg
ICByZXNwb25kZXIgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgICBpZiAoT2JqZWN0LmlzVW5k
ZWZpbmVkKGV2ZW50LmV2ZW50TmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIGlmIChldmVudC5ldmVudE5hbWUgIT09IGV2ZW50TmFtZSkKKyAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgRXZlbnQuZXh0ZW5kKGV2ZW50LCBlbGVtZW50KTsKKyAgICAgICAg
aGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAg
ICAgIGlmICghTU9VU0VFTlRFUl9NT1VTRUxFQVZFX0VWRU5UU19TVVBQT1JURUQgJiYKKyAgICAg
ICAoZXZlbnROYW1lID09PSAibW91c2VlbnRlciIgfHwgZXZlbnROYW1lID09PSAibW91c2VsZWF2
ZSIpKSB7CisgICAgICAgIGlmIChldmVudE5hbWUgPT09ICJtb3VzZWVudGVyIiB8fCBldmVudE5h
bWUgPT09ICJtb3VzZWxlYXZlIikgeworICAgICAgICAgIHJlc3BvbmRlciA9IGZ1bmN0aW9uKGV2
ZW50KSB7CisgICAgICAgICAgICBFdmVudC5leHRlbmQoZXZlbnQsIGVsZW1lbnQpOworCisgICAg
ICAgICAgICB2YXIgcGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldDsKKyAgICAgICAgICAgIHdo
aWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBlbGVtZW50KSB7CisgICAgICAgICAgICAgIHRyeSB7
IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CisgICAgICAgICAgICAgIGNhdGNoKGUpIHsg
cGFyZW50ID0gZWxlbWVudDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFy
ZW50ID09PSBlbGVtZW50KSByZXR1cm47CisKKyAgICAgICAgICAgIGhhbmRsZXIuY2FsbChlbGVt
ZW50LCBldmVudCk7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmVzcG9uZGVyID0gZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICBFdmVudC5leHRl
bmQoZXZlbnQsIGVsZW1lbnQpOworICAgICAgICAgIGhhbmRsZXIuY2FsbChlbGVtZW50LCBldmVu
dCk7CisgICAgICAgIH07CisgICAgICB9CisgICAgfQorCisgICAgcmVzcG9uZGVyLmhhbmRsZXIg
PSBoYW5kbGVyOworICAgIHJlc3BvbmRlcnNGb3JFdmVudC5wdXNoKHJlc3BvbmRlcik7CisgICAg
cmV0dXJuIHJlc3BvbmRlcjsKKyAgfQorCisgIGZ1bmN0aW9uIF9kZXN0cm95Q2FjaGUoKSB7Cisg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IENBQ0hFLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsr
KSB7CisgICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKENBQ0hFW2ldKTsKKyAgICAgIENBQ0hFW2ld
ID0gbnVsbDsKKyAgICB9CisgIH0KKworICB2YXIgQ0FDSEUgPSBbXTsKKworICBpZiAoUHJvdG90
eXBlLkJyb3dzZXIuSUUpCisgICAgd2luZG93LmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIF9kZXN0
cm95Q2FjaGUpOworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpCisgICAgd2luZG93
LmFkZEV2ZW50TGlzdGVuZXIoJ3VubG9hZCcsIFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uLCBmYWxz
ZSk7CisKKworICB2YXIgX2dldERPTUV2ZW50TmFtZSA9IFByb3RvdHlwZS5LOworCisgIGlmICgh
TU9VU0VFTlRFUl9NT1VTRUxFQVZFX0VWRU5UU19TVVBQT1JURUQpIHsKKyAgICBfZ2V0RE9NRXZl
bnROYW1lID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgICB2YXIgdHJhbnNsYXRpb25zID0g
eyBtb3VzZWVudGVyOiAibW91c2VvdmVyIiwgbW91c2VsZWF2ZTogIm1vdXNlb3V0IiB9OworICAg
ICAgcmV0dXJuIGV2ZW50TmFtZSBpbiB0cmFuc2xhdGlvbnMgPyB0cmFuc2xhdGlvbnNbZXZlbnRO
YW1lXSA6IGV2ZW50TmFtZTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gb2JzZXJ2ZShlbGVt
ZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKwor
ICAgIHZhciByZXNwb25kZXIgPSBfY3JlYXRlUmVzcG9uZGVyKGVsZW1lbnQsIGV2ZW50TmFtZSwg
aGFuZGxlcik7CisKKyAgICBpZiAoIXJlc3BvbmRlcikgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICBp
ZiAoZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgeworICAgICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRM
aXN0ZW5lcikKKyAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJkYXRhYXZhaWxhYmxl
IiwgcmVzcG9uZGVyLCBmYWxzZSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgZWxlbWVudC5hdHRh
Y2hFdmVudCgib25kYXRhYXZhaWxhYmxlIiwgcmVzcG9uZGVyKTsKKyAgICAgICAgZWxlbWVudC5h
dHRhY2hFdmVudCgib25maWx0ZXJjaGFuZ2UiLCByZXNwb25kZXIpOworICAgICAgfQorICAgIH0g
ZWxzZSB7CisgICAgICB2YXIgYWN0dWFsRXZlbnROYW1lID0gX2dldERPTUV2ZW50TmFtZShldmVu
dE5hbWUpOworCisgICAgICBpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKQorICAgICAgICBl
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYWN0dWFsRXZlbnROYW1lLCByZXNwb25kZXIsIGZhbHNl
KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgib24iICsgYWN0dWFs
RXZlbnROYW1lLCByZXNwb25kZXIpOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9
CisKKyAgZnVuY3Rpb24gc3RvcE9ic2VydmluZyhlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKworICAgIHZhciByZWdpc3RyeSA9IEVsZW1l
bnQucmV0cmlldmUoZWxlbWVudCwgJ3Byb3RvdHlwZV9ldmVudF9yZWdpc3RyeScpOworCisgICAg
aWYgKE9iamVjdC5pc1VuZGVmaW5lZChyZWdpc3RyeSkpIHJldHVybiBlbGVtZW50OworCisgICAg
aWYgKGV2ZW50TmFtZSAmJiAhaGFuZGxlcikgeworICAgICAgdmFyIHJlc3BvbmRlcnMgPSByZWdp
c3RyeS5nZXQoZXZlbnROYW1lKTsKKworICAgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChyZXNw
b25kZXJzKSkgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgIHJlc3BvbmRlcnMuZWFjaCggZnVuY3Rp
b24ocikgeworICAgICAgICBFbGVtZW50LnN0b3BPYnNlcnZpbmcoZWxlbWVudCwgZXZlbnROYW1l
LCByLmhhbmRsZXIpOworICAgICAgfSk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9IGVs
c2UgaWYgKCFldmVudE5hbWUpIHsKKyAgICAgIHJlZ2lzdHJ5LmVhY2goIGZ1bmN0aW9uKHBhaXIp
IHsKKyAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHBhaXIua2V5LCByZXNwb25kZXJzID0gcGFpci52
YWx1ZTsKKworICAgICAgICByZXNwb25kZXJzLmVhY2goIGZ1bmN0aW9uKHIpIHsKKyAgICAgICAg
ICBFbGVtZW50LnN0b3BPYnNlcnZpbmcoZWxlbWVudCwgZXZlbnROYW1lLCByLmhhbmRsZXIpOwor
ICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisg
ICAgdmFyIHJlc3BvbmRlcnMgPSByZWdpc3RyeS5nZXQoZXZlbnROYW1lKTsKKworICAgIGlmICgh
cmVzcG9uZGVycykgcmV0dXJuOworCisgICAgdmFyIHJlc3BvbmRlciA9IHJlc3BvbmRlcnMuZmlu
ZCggZnVuY3Rpb24ocikgeyByZXR1cm4gci5oYW5kbGVyID09PSBoYW5kbGVyOyB9KTsKKyAgICBp
ZiAoIXJlc3BvbmRlcikgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICB2YXIgYWN0dWFsRXZlbnROYW1l
ID0gX2dldERPTUV2ZW50TmFtZShldmVudE5hbWUpOworCisgICAgaWYgKGV2ZW50TmFtZS5pbmNs
dWRlKCc6JykpIHsKKyAgICAgIGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpCisgICAg
ICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGF0YWF2YWlsYWJsZSIsIHJlc3BvbmRl
ciwgZmFsc2UpOworICAgICAgZWxzZSB7CisgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoIm9u
ZGF0YWF2YWlsYWJsZSIsIHJlc3BvbmRlcik7CisgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQo
Im9uZmlsdGVyY2hhbmdlIiwgIHJlc3BvbmRlcik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAg
ICAgIGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpCisgICAgICAgIGVsZW1lbnQucmVt
b3ZlRXZlbnRMaXN0ZW5lcihhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlciwgZmFsc2UpOworICAg
ICAgZWxzZQorICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBhY3R1YWxFdmVudE5h
bWUsIHJlc3BvbmRlcik7CisgICAgfQorCisgICAgcmVnaXN0cnkuc2V0KGV2ZW50TmFtZSwgcmVz
cG9uZGVycy53aXRob3V0KHJlc3BvbmRlcikpOworCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0K
KworICBmdW5jdGlvbiBmaXJlKGVsZW1lbnQsIGV2ZW50TmFtZSwgbWVtbywgYnViYmxlKSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGJ1
YmJsZSkpCisgICAgICBidWJibGUgPSB0cnVlOworCisgICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1l
bnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVsZW1lbnQuZGlzcGF0Y2hFdmVudCkKKyAg
ICAgIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICB2YXIgZXZlbnQ7
CisgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CisgICAgICBldmVudCA9IGRvY3VtZW50
LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CisgICAgICBldmVudC5pbml0RXZlbnQoJ2RhdGFh
dmFpbGFibGUnLCB0cnVlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZXZlbnQgPSBkb2N1
bWVudC5jcmVhdGVFdmVudE9iamVjdCgpOworICAgICAgZXZlbnQuZXZlbnRUeXBlID0gYnViYmxl
ID8gJ29uZGF0YWF2YWlsYWJsZScgOiAnb25maWx0ZXJjaGFuZ2UnOworICAgIH0KKworICAgIGV2
ZW50LmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKKyAgICBldmVudC5tZW1vID0gbWVtbyB8fCB7IH07
CisKKyAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpCisgICAgICBlbGVtZW50LmRpc3BhdGNo
RXZlbnQoZXZlbnQpOworICAgIGVsc2UKKyAgICAgIGVsZW1lbnQuZmlyZUV2ZW50KGV2ZW50LmV2
ZW50VHlwZSwgZXZlbnQpOworCisgICAgcmV0dXJuIEV2ZW50LmV4dGVuZChldmVudCk7CisgIH0K
KworCisgIE9iamVjdC5leHRlbmQoRXZlbnQsIEV2ZW50Lk1ldGhvZHMpOworCisgIE9iamVjdC5l
eHRlbmQoRXZlbnQsIHsKKyAgICBmaXJlOiAgICAgICAgICBmaXJlLAorICAgIG9ic2VydmU6ICAg
ICAgIG9ic2VydmUsCisgICAgc3RvcE9ic2VydmluZzogc3RvcE9ic2VydmluZworICB9KTsKKwor
ICBFbGVtZW50LmFkZE1ldGhvZHMoeworICAgIGZpcmU6ICAgICAgICAgIGZpcmUsCisKKyAgICBv
YnNlcnZlOiAgICAgICBvYnNlcnZlLAorCisgICAgc3RvcE9ic2VydmluZzogc3RvcE9ic2Vydmlu
ZworICB9KTsKKworICBPYmplY3QuZXh0ZW5kKGRvY3VtZW50LCB7CisgICAgZmlyZTogICAgICAg
ICAgZmlyZS5tZXRob2RpemUoKSwKKworICAgIG9ic2VydmU6ICAgICAgIG9ic2VydmUubWV0aG9k
aXplKCksCisKKyAgICBzdG9wT2JzZXJ2aW5nOiBzdG9wT2JzZXJ2aW5nLm1ldGhvZGl6ZSgpLAor
CisgICAgbG9hZGVkOiAgICAgICAgZmFsc2UKKyAgfSk7CisKKyAgaWYgKHdpbmRvdy5FdmVudCkg
T2JqZWN0LmV4dGVuZCh3aW5kb3cuRXZlbnQsIEV2ZW50KTsKKyAgZWxzZSB3aW5kb3cuRXZlbnQg
PSBFdmVudDsKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKKyAgLyogU3VwcG9ydCBmb3IgdGhlIERP
TUNvbnRlbnRMb2FkZWQgZXZlbnQgaXMgYmFzZWQgb24gd29yayBieSBEYW4gV2ViYiwKKyAgICAg
TWF0dGhpYXMgTWlsbGVyLCBEZWFuIEVkd2FyZHMsIEpvaG4gUmVzaWcsIGFuZCBEaWVnbyBQZXJp
bmkuICovCisKKyAgdmFyIHRpbWVyOworCisgIGZ1bmN0aW9uIGZpcmVDb250ZW50TG9hZGVkRXZl
bnQoKSB7CisgICAgaWYgKGRvY3VtZW50LmxvYWRlZCkgcmV0dXJuOworICAgIGlmICh0aW1lcikg
d2luZG93LmNsZWFyVGltZW91dCh0aW1lcik7CisgICAgZG9jdW1lbnQubG9hZGVkID0gdHJ1ZTsK
KyAgICBkb2N1bWVudC5maXJlKCdkb206bG9hZGVkJyk7CisgIH0KKworICBmdW5jdGlvbiBjaGVj
a1JlYWR5U3RhdGUoKSB7CisgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0
ZScpIHsKKyAgICAgIGRvY3VtZW50LnN0b3BPYnNlcnZpbmcoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBj
aGVja1JlYWR5U3RhdGUpOworICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOworICAgIH0K
KyAgfQorCisgIGZ1bmN0aW9uIHBvbGxEb1Njcm9sbCgpIHsKKyAgICB0cnkgeyBkb2N1bWVudC5k
b2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoJ2xlZnQnKTsgfQorICAgIGNhdGNoKGUpIHsKKyAgICAg
IHRpbWVyID0gcG9sbERvU2Nyb2xsLmRlZmVyKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAg
IGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKKyAgfQorCisgIGlmIChkb2N1bWVudC5hZGRFdmVu
dExpc3RlbmVyKSB7CisgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExv
YWRlZCcsIGZpcmVDb250ZW50TG9hZGVkRXZlbnQsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBk
b2N1bWVudC5vYnNlcnZlKCdyZWFkeXN0YXRlY2hhbmdlJywgY2hlY2tSZWFkeVN0YXRlKTsKKyAg
ICBpZiAod2luZG93ID09IHRvcCkKKyAgICAgIHRpbWVyID0gcG9sbERvU2Nyb2xsLmRlZmVyKCk7
CisgIH0KKworICBFdmVudC5vYnNlcnZlKHdpbmRvdywgJ2xvYWQnLCBmaXJlQ29udGVudExvYWRl
ZEV2ZW50KTsKK30pKCk7CisKK0VsZW1lbnQuYWRkTWV0aG9kcygpOworCisvKi0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gREVQUkVDQVRFRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKi8KKworSGFzaC50b1F1ZXJ5U3RyaW5nID0gT2JqZWN0LnRvUXVlcnlTdHJpbmc7CisK
K3ZhciBUb2dnbGUgPSB7IGRpc3BsYXk6IEVsZW1lbnQudG9nZ2xlIH07CisKK0VsZW1lbnQuTWV0
aG9kcy5jaGlsZE9mID0gRWxlbWVudC5NZXRob2RzLmRlc2NlbmRhbnRPZjsKKwordmFyIEluc2Vy
dGlvbiA9IHsKKyAgQmVmb3JlOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0
dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHtiZWZvcmU6Y29udGVudH0pOworICB9LAorCisg
IFRvcDogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmlu
c2VydChlbGVtZW50LCB7dG9wOmNvbnRlbnR9KTsKKyAgfSwKKworICBCb3R0b206IGZ1bmN0aW9u
KGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwg
e2JvdHRvbTpjb250ZW50fSk7CisgIH0sCisKKyAgQWZ0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGNv
bnRlbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2FmdGVyOmNvbnRl
bnR9KTsKKyAgfQorfTsKKwordmFyICRjb250aW51ZSA9IG5ldyBFcnJvcignInRocm93ICRjb250
aW51ZSIgaXMgZGVwcmVjYXRlZCwgdXNlICJyZXR1cm4iIGluc3RlYWQnKTsKKwordmFyIFBvc2l0
aW9uID0geworICBpbmNsdWRlU2Nyb2xsT2Zmc2V0czogZmFsc2UsCisKKyAgcHJlcGFyZTogZnVu
Y3Rpb24oKSB7CisgICAgdGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VYT2Zmc2V0CisgICAgICAg
ICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQKKyAgICAgICAg
ICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQKKyAgICAgICAgICAgICAgICB8fCAw
OworICAgIHRoaXMuZGVsdGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldAorICAgICAgICAgICAgICAg
IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AKKyAgICAgICAgICAgICAgICB8
fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcAorICAgICAgICAgICAgICAgIHx8IDA7CisgIH0sCisK
KyAgd2l0aGluOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgaWYgKHRoaXMuaW5jbHVk
ZVNjcm9sbE9mZnNldHMpCisgICAgICByZXR1cm4gdGhpcy53aXRoaW5JbmNsdWRpbmdTY3JvbGxv
ZmZzZXRzKGVsZW1lbnQsIHgsIHkpOworICAgIHRoaXMueGNvbXAgPSB4OworICAgIHRoaXMueWNv
bXAgPSB5OworICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1l
bnQpOworCisgICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB5
IDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAgICAg
IHggPj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHggPCAgdGhpcy5vZmZzZXRbMF0g
KyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICB3aXRoaW5JbmNsdWRpbmdTY3JvbGxv
ZmZzZXRzOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgdmFyIG9mZnNldGNhY2hlID0g
RWxlbWVudC5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1lbnQpOworCisgICAgdGhpcy54Y29t
cCA9IHggKyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFYOworICAgIHRoaXMueWNvbXAgPSB5
ICsgb2Zmc2V0Y2FjaGVbMV0gLSB0aGlzLmRlbHRhWTsKKyAgICB0aGlzLm9mZnNldCA9IEVsZW1l
bnQuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAgIHJldHVybiAodGhpcy55Y29tcCA+
PSB0aGlzLm9mZnNldFsxXSAmJgorICAgICAgICAgICAgdGhpcy55Y29tcCA8ICB0aGlzLm9mZnNl
dFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAgICAgICAgICB0aGlzLnhjb21wID49
IHRoaXMub2Zmc2V0WzBdICYmCisgICAgICAgICAgICB0aGlzLnhjb21wIDwgIHRoaXMub2Zmc2V0
WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCk7CisgIH0sCisKKyAgb3ZlcmxhcDogZnVuY3Rpb24o
bW9kZSwgZWxlbWVudCkgeworICAgIGlmICghbW9kZSkgcmV0dXJuIDA7CisgICAgaWYgKG1vZGUg
PT0gJ3ZlcnRpY2FsJykKKyAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5v
ZmZzZXRIZWlnaHQpIC0gdGhpcy55Y29tcCkgLworICAgICAgICBlbGVtZW50Lm9mZnNldEhlaWdo
dDsKKyAgICBpZiAobW9kZSA9PSAnaG9yaXpvbnRhbCcpCisgICAgICByZXR1cm4gKCh0aGlzLm9m
ZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpIC0gdGhpcy54Y29tcCkgLworICAgICAgICBl
bGVtZW50Lm9mZnNldFdpZHRoOworICB9LAorCisKKyAgY3VtdWxhdGl2ZU9mZnNldDogRWxlbWVu
dC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQsCisKKyAgcG9zaXRpb25lZE9mZnNldDogRWxlbWVu
dC5NZXRob2RzLnBvc2l0aW9uZWRPZmZzZXQsCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKKyAgICByZXR1cm4gRWxlbWVudC5hYnNv
bHV0aXplKGVsZW1lbnQpOworICB9LAorCisgIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CisgICAgcmV0dXJuIEVsZW1lbnQucmVsYXRpdml6
ZShlbGVtZW50KTsKKyAgfSwKKworICByZWFsT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMuY3VtdWxh
dGl2ZVNjcm9sbE9mZnNldCwKKworICBvZmZzZXRQYXJlbnQ6IEVsZW1lbnQuTWV0aG9kcy5nZXRP
ZmZzZXRQYXJlbnQsCisKKyAgcGFnZTogRWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LAor
CisgIGNsb25lOiBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgb3B0aW9ucykgeworICAgIG9wdGlv
bnMgPSBvcHRpb25zIHx8IHsgfTsKKyAgICByZXR1cm4gRWxlbWVudC5jbG9uZVBvc2l0aW9uKHRh
cmdldCwgc291cmNlLCBvcHRpb25zKTsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSov
CisKK2lmICghZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgZG9jdW1lbnQuZ2V0RWxl
bWVudHNCeUNsYXNzTmFtZSA9IGZ1bmN0aW9uKGluc3RhbmNlTWV0aG9kcyl7CisgIGZ1bmN0aW9u
IGl0ZXIobmFtZSkgeworICAgIHJldHVybiBuYW1lLmJsYW5rKCkgPyBudWxsIDogIltjb250YWlu
cyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgIiArIG5hbWUgKyAiICcpXSI7CisgIH0KKwor
ICBpbnN0YW5jZU1ldGhvZHMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IFByb3RvdHlwZS5Ccm93
c2VyRmVhdHVyZXMuWFBhdGggPworICBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAg
ICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9TdHJpbmcoKS5zdHJpcCgpOworICAgIHZhciBjb25k
ID0gL1xzLy50ZXN0KGNsYXNzTmFtZSkgPyAkdyhjbGFzc05hbWUpLm1hcChpdGVyKS5qb2luKCcn
KSA6IGl0ZXIoY2xhc3NOYW1lKTsKKyAgICByZXR1cm4gY29uZCA/IGRvY3VtZW50Ll9nZXRFbGVt
ZW50c0J5WFBhdGgoJy4vLyonICsgY29uZCwgZWxlbWVudCkgOiBbXTsKKyAgfSA6IGZ1bmN0aW9u
KGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmlu
ZygpLnN0cmlwKCk7CisgICAgdmFyIGVsZW1lbnRzID0gW10sIGNsYXNzTmFtZXMgPSAoL1xzLy50
ZXN0KGNsYXNzTmFtZSkgPyAkdyhjbGFzc05hbWUpIDogbnVsbCk7CisgICAgaWYgKCFjbGFzc05h
bWVzICYmICFjbGFzc05hbWUpIHJldHVybiBlbGVtZW50czsKKworICAgIHZhciBub2RlcyA9ICQo
ZWxlbWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKKyAgICBjbGFzc05hbWUgPSAnICcg
KyBjbGFzc05hbWUgKyAnICc7CisKKyAgICBmb3IgKHZhciBpID0gMCwgY2hpbGQsIGNuOyBjaGls
ZCA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgIGlmIChjaGlsZC5jbGFzc05hbWUgJiYgKGNuID0g
JyAnICsgY2hpbGQuY2xhc3NOYW1lICsgJyAnKSAmJiAoY24uaW5jbHVkZShjbGFzc05hbWUpIHx8
CisgICAgICAgICAgKGNsYXNzTmFtZXMgJiYgY2xhc3NOYW1lcy5hbGwoZnVuY3Rpb24obmFtZSkg
eworICAgICAgICAgICAgcmV0dXJuICFuYW1lLnRvU3RyaW5nKCkuYmxhbmsoKSAmJiBjbi5pbmNs
dWRlKCcgJyArIG5hbWUgKyAnICcpOworICAgICAgICAgIH0pKSkpCisgICAgICAgIGVsZW1lbnRz
LnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnRz
OworICB9OworCisgIHJldHVybiBmdW5jdGlvbihjbGFzc05hbWUsIHBhcmVudEVsZW1lbnQpIHsK
KyAgICByZXR1cm4gJChwYXJlbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLmdldEVsZW1lbnRz
QnlDbGFzc05hbWUoY2xhc3NOYW1lKTsKKyAgfTsKK30oRWxlbWVudC5NZXRob2RzKTsKKworLyot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSovCisKK0VsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgp
OworRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CisgIH0sCisKKyAg
X2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZS5z
cGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgIHJldHVybiBuYW1lLmxl
bmd0aCA+IDA7CisgICAgfSkuX2VhY2goaXRlcmF0b3IpOworICB9LAorCisgIHNldDogZnVuY3Rp
b24oY2xhc3NOYW1lKSB7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsK
KyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvQWRkKSB7CisgICAgaWYgKHRoaXMu
aW5jbHVkZShjbGFzc05hbWVUb0FkZCkpIHJldHVybjsKKyAgICB0aGlzLnNldCgkQSh0aGlzKS5j
b25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5j
dGlvbihjbGFzc05hbWVUb1JlbW92ZSkgeworICAgIGlmICghdGhpcy5pbmNsdWRlKGNsYXNzTmFt
ZVRvUmVtb3ZlKSkgcmV0dXJuOworICAgIHRoaXMuc2V0KCRBKHRoaXMpLndpdGhvdXQoY2xhc3NO
YW1lVG9SZW1vdmUpLmpvaW4oJyAnKSk7CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiAkQSh0aGlzKS5qb2luKCcgJyk7CisgIH0KK307CisKK09iamVjdC5leHRl
bmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7CisKKy8qLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0qLwo=
</data>
<flag name="review"
          id="37760"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>