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

<bugzilla version="5.0.6"
          urlbase="https://bugzilla.yoctoproject.org/"
          
          maintainer="it-coreprojects-helpdesk@linuxfoundation.org"
>

    <bug>
          <bug_id>12116</bug_id>
          
          <creation_ts>2017-09-22 05:30:32 +0000</creation_ts>
          <short_desc>bitbake server timeout - race condition on fast machines</short_desc>
          <delta_ts>2017-10-03 23:04:37 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>7</classification_id>
          <classification>Build System, Metadata &amp; Runtime</classification>
          <product>BitBake</product>
          <component>bitbake</component>
          <version>2.4</version>
          <rep_platform>x86</rep_platform>
          <op_sys>Multiple</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugzilla.yoctoproject.org/show_bug.cgi?id=11898</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>High</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>2.4 M4</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Reyna">david.reyna</reporter>
          <assigned_to name="Richard Purdie">richard.purdie</assigned_to>
          <cc>konrad.scherer</cc>
    
    <cc>mark.hatle</cc>
    
    <cc>poky.bs.watcher</cc>
    
    <cc>poky.watcher</cc>
    
    <cc>randy.macleod</cc>
          
          
          <cf_os>---</cf_os>
          <cf_regression_type>---</cf_regression_type>
          
          <cf_docchange>No (bug/feature does not impact docs)</cf_docchange>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>77056</commentid>
    <comment_count>0</comment_count>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-09-22 05:30:32 +0000</bug_when>
    <thetext>We have discovered a new instance of 11898, timeout error for the bitbake server.

We only see it on fact machines, and it can be either always hit or rarely hit. This kills Toaster on fast (e.g. Continuous Integration) machines, but also reveals a lurking vulnerability for all bitbake users.

The best way to replicate the error is to do &quot;server.runCommand([&quot;getVariable&quot;, &quot;TMPDIR&quot;])[0]&quot; several times in a row in a popular event handler in the UI of choice. One call is either enough or up to a hunderd calls is needed.

We found it trying to run Toaster on a very fast machine. I am creating the knotty replicator now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77057</commentid>
    <comment_count>1</comment_count>
      <attachid>4021</attachid>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-09-22 05:57:00 +0000</bug_when>
    <thetext>Created attachment 4021
knotty_12116.py : server timeout replicator

Attached is &quot;knotty_12116.py&quot;, a simple version of knotty that can replicate the server crash.

Here are replication steps:
  $ . ./oe-init-build-env
  $ rm -rf cache tmp/ sstate-cache/ downloads/ buildhistory/
  $ bitbake -u knotty_12116 core-image-minimal
  ...
  vvv BEFORE SERVER.RUNCOMMAND() vvv
  Timeout while waiting for a reply from the bitbake server
  $

Notes: 

1) You will observe that I added the following section to several of the high frequency event handlers, specifically &apos;bb.event.ParseProgress&apos;, &apos;bb.event.CacheLoadProgress&apos;, and &apos;bb.build.TaskProgress&apos;.

            if isinstance(event, bb.event.ParseProgress):
                ### TRY TO GET VALUE FROM BB SERVER ###
                print(&quot;vvv BEFORE SERVER.RUNCOMMAND() vvv&quot;)
                tmp_dir = server.runCommand([&quot;getVariable&quot;, &quot;TMPDIR&quot;])[0]
                tmp_dir = server.runCommand([&quot;getVariable&quot;, &quot;TMPDIR&quot;])[0]
                tmp_dir = server.runCommand([&quot;getVariable&quot;, &quot;TMPDIR&quot;])[0]
                tmp_dir = server.runCommand([&quot;getVariable&quot;, &quot;TMPDIR&quot;])[0]
                print(&quot;^^^ AFTER SERVER.RUNCOMMAND() ^^^&quot;)
 
2) I needed the &apos;core-image-minimal&apos; target. I did not hit it with for example &quot;quilt-native&apos;. I have never hit on my slower host after #11898 was fixed.

3) You will need the &quot;rm -rf&quot; command, else your build will start after the critical sections and not fault.

4) I will underline again that this is a lot harder to hit than the original issue found in #11898.

5) I you have a hard time replicating it on your (presumably slower) hosts, let us know how we can instrument our bitbake to get you data.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77063</commentid>
    <comment_count>2</comment_count>
    <who name="Richard Purdie">richard.purdie</who>
    <bug_when>2017-09-22 13:07:49 +0000</bug_when>
    <thetext>Hi David,

In lib/bb/server/process.py there is a line, &quot;self.recv.poll(5)&quot;. Could you test increasing 5 to something higher like 30 and see if that avoids the issues you&apos;ve been seeing please?

I have been able to reproduce but only vary rarely, say once every 30 minutes of a build...

Cheers,

Richard</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77065</commentid>
    <comment_count>3</comment_count>
    <who name="Konrad Scherer">konrad.scherer</who>
    <bug_when>2017-09-22 13:40:43 +0000</bug_when>
    <thetext>Changing the poll timeout to 30 helps. I alternated from 5 to 30 and I got the timeout twice with a timeout of 5 and the build started twice when the timeout was set to 30.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77066</commentid>
    <comment_count>4</comment_count>
    <who name="Richard Purdie">richard.purdie</who>
    <bug_when>2017-09-22 13:58:52 +0000</bug_when>
    <thetext>(In reply to comment #3)
&gt; Changing the poll timeout to 30 helps. I alternated from 5 to 30 and I got
&gt; the timeout twice with a timeout of 5 and the build started twice when the
&gt; timeout was set to 30.

I&apos;m suspecting this is the real fix, the code just isn&apos;t waiting long enough for a reply from the server and under real world loads, a timeout of 5s is possible. A timeout of 30s would be particularly bad...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77079</commentid>
    <comment_count>5</comment_count>
    <who name="Randy MacLeod">randy.macleod</who>
    <bug_when>2017-09-22 20:02:40 +0000</bug_when>
    <thetext>Bumping the timeout to 30 seconds (ugh!) is a workaround and a reasonable one for 2.4. It seems that the two double-digit timeouts in lib/bb/server/process.py are
now both 30 seconds so that&apos;s a bonus! :)

I&apos;ve opened an enhancement for 2.5:
   run build tasks at lower priority than bitbake UI and server
   https://bugzilla.yoctoproject.org/show_bug.cgi?id=12117

Also, in a few weeks, we could spend more time analyzing the scheduling behaviour on the systems where we see this problem to understand why the timeout is being hit. I suspect that with equal priority/niceness and 100s or 1000s of tasks, and perhaps a slow, non-empty disk, that 5 seconds is just too short.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77093</commentid>
    <comment_count>6</comment_count>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-09-25 02:25:13 +0000</bug_when>
    <thetext>I will add that with this patch my reproducer also does not fail anymore.

I may file an enhancement request to trigger an event if there should be a timeout, because currently when it happens the build instantly fails but the UI (specifically Toaster) is not informed of that fact and progress appears to hang for the user. 

I expect that there are other fatal errors that do not have events, but this is the only one I have hit in the last year or so.

I may also add code in Toaster to periodically test for such zombie builds, but that may lead into a nest of other issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77101</commentid>
    <comment_count>7</comment_count>
    <who name="Richard Purdie">richard.purdie</who>
    <bug_when>2017-09-25 14:57:04 +0000</bug_when>
    <thetext>(In reply to comment #6)
&gt; I will add that with this patch my reproducer also does not fail anymore.
&gt; 
&gt; I may file an enhancement request to trigger an event if there should be a
&gt; timeout, because currently when it happens the build instantly fails but the
&gt; UI (specifically Toaster) is not informed of that fact and progress appears
&gt; to hang for the user. 
&gt; 
&gt; I expect that there are other fatal errors that do not have events, but this
&gt; is the only one I have hit in the last year or so.
&gt; 
&gt; I may also add code in Toaster to periodically test for such zombie builds,
&gt; but that may lead into a nest of other issues.

The issue here is that the UI can&apos;t talk to the server. It tries, the server is busy (likely running something which takes longer like an event handler) and therefore doesn&apos;t respond in a time the UI is happy with.

You can&apos;t trigger an event in this context since there is no server to actually submit it to.

5s was too short for this, 30s is reasonable. The timeout was short due to other UI interaction issues but those were resolved separately so this can be bumped up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77102</commentid>
    <comment_count>8</comment_count>
    <who name="Richard Purdie">richard.purdie</who>
    <bug_when>2017-09-25 14:57:26 +0000</bug_when>
    <thetext>http://git.yoctoproject.org/cgit.cgi/poky/commit/?id=7a822506c0ae402f65c306ce10c05e195138c464</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77288</commentid>
    <comment_count>9</comment_count>
      <attachid>4044</attachid>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-10-02 23:48:52 +0000</bug_when>
    <thetext>Created attachment 4044
knotty_server_histogram.py: server call histograms</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77289</commentid>
    <comment_count>10</comment_count>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-10-02 23:51:33 +0000</bug_when>
    <thetext>To follow up I modified a version of knotty (attached) that included s histogram of inserted server call latencies, in hopes to show where we were with regards to 5 verses 30 seconds timeout setting.

To do this test I did 5 server calls for every event that knotty received, and to really test it I grabbed the larger event list that Toaster uses.

I then ran it on the machine where we were able to replicate the server timeouts and did a &quot;core-image-minimal&quot; from scratch. This is what I found.

Server latency in seconds:
Seconds	Count
0	6693
1	0
2	0
3	0
4	1
5	1
6	0
7	0
...	0

Out of 6,691 aggressive calls across the build, only two were longer than one second, and even those just barely touched the 5 second mark. 

My conclusion is that the problem was indeed solved, and that the few outliers are just that.

Here are replication steps:
  $ . ./oe-init-build-env
  $ rm -rf cache tmp/ sstate-cache/ downloads/ buildhistory/
  $ bitbake -u knotty_server_histogram core-image-minimal
  $ cat /tmp/bb_server_histogram.csv</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77328</commentid>
    <comment_count>11</comment_count>
    <who name="David Reyna">david.reyna</who>
    <bug_when>2017-10-03 23:04:37 +0000</bug_when>
    <thetext>One more comment.

I changed the threshold in the attached script to capture all events longer than 3 seconds as opposed to 5 seconds. If you do that you see the follow entries. 

Server high latency events:
Event#  Loop    Latency Event
155     2       4       &lt;bb.event.RecipeParsed object at 0x7f5ea2265d68&gt;
155     3       5       &lt;bb.event.RecipeParsed object at 0x7f5ea2265d68&gt;

The delays occur early in the Recipe Parsing phase, and is quite visible in the knotty&apos;s shell progress bar. This is consistent with the failures being observed early in the build (before the patch was applied).

Each server call is done 5 times in a fast loop, and the above &quot;Loop&quot; value is the iteration. The loop number appear random in my several runs (as opposed to always being the first call), telling me that it is one of the background parsing tasks that the server call happens to overlap with.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>4021</attachid>
            <date>2017-09-22 05:57:00 +0000</date>
            <delta_ts>2017-09-22 05:57:00 +0000</delta_ts>
            <desc>knotty_12116.py : server timeout replicator</desc>
            <filename>knotty_12116.py</filename>
            <type>text/plain</type>
            <size>30736</size>
            <attacher name="David Reyna">david.reyna</attacher>
            
              <data encoding="base64">IwojIEJpdEJha2UgKE5vKVRUWSBVSSBJbXBsZW1lbnRhdGlvbgojCiMgSGFuZGxpbmcgb3V0cHV0
IHRvIFRUWXMgb3IgZmlsZXMgKG5vIFRUWSkKIwojIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIFJp
Y2hhcmQgUHVyZGllCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YWxvbmcKIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAojIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlz
aW9uCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgeG1scnBjLmNsaWVudCBhcyB4bWxycGNs
aWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHByb2dyZXNzYmFyCmltcG9ydCBzaWduYWwKaW1wb3J0
IGJiLm1zZwppbXBvcnQgdGltZQppbXBvcnQgZmNudGwKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29w
eQppbXBvcnQgYXRleGl0Cgpmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgoKZmVhdHVyZVNldCA9
IFtiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuU0VORF9TQU5JVFlFVkVOVFNdCgpsb2dnZXIgPSBs
b2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCmludGVyYWN0aXZlID0gc3lzLnN0ZG91dC5pc2F0
dHkoKQoKY2xhc3MgQkJQcm9ncmVzcyhwcm9ncmVzc2Jhci5Qcm9ncmVzc0Jhcik6CiAgICBkZWYg
X19pbml0X18oc2VsZiwgbXNnLCBtYXh2YWwsIHdpZGdldHM9Tm9uZSwgZXh0cmFwb3M9LTEsIHJl
c2l6ZV9oYW5kbGVyPU5vbmUpOgogICAgICAgIHNlbGYubXNnID0gbXNnCiAgICAgICAgc2VsZi5l
eHRyYXBvcyA9IGV4dHJhcG9zCiAgICAgICAgaWYgbm90IHdpZGdldHM6CiAgICAgICAgICAgIHdp
ZGdldHMgPSBbcHJvZ3Jlc3NiYXIuUGVyY2VudGFnZSgpLCAnICcsIHByb2dyZXNzYmFyLkJhcigp
LCAnICcsCiAgICAgICAgICAgIHByb2dyZXNzYmFyLkVUQSgpXQogICAgICAgICAgICBzZWxmLmV4
dHJhcG9zID0gNAoKICAgICAgICBpZiByZXNpemVfaGFuZGxlcjoKICAgICAgICAgICAgc2VsZi5f
cmVzaXplX2RlZmF1bHQgPSByZXNpemVfaGFuZGxlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAg
IHNlbGYuX3Jlc2l6ZV9kZWZhdWx0ID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHV0lOQ0gp
CiAgICAgICAgcHJvZ3Jlc3NiYXIuUHJvZ3Jlc3NCYXIuX19pbml0X18oc2VsZiwgbWF4dmFsLCBb
c2VsZi5tc2cgKyAiOiAiXSArIHdpZGdldHMsIGZkPXN5cy5zdGRvdXQpCgogICAgZGVmIF9oYW5k
bGVfcmVzaXplKHNlbGYsIHNpZ251bT1Ob25lLCBmcmFtZT1Ob25lKToKICAgICAgICBwcm9ncmVz
c2Jhci5Qcm9ncmVzc0Jhci5faGFuZGxlX3Jlc2l6ZShzZWxmLCBzaWdudW0sIGZyYW1lKQogICAg
ICAgIGlmIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0OgogICAgICAgICAgICBzZWxmLl9yZXNpemVfZGVm
YXVsdChzaWdudW0sIGZyYW1lKQoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgcHJvZ3Jl
c3NiYXIuUHJvZ3Jlc3NCYXIuZmluaXNoKHNlbGYpCiAgICAgICAgaWYgc2VsZi5fcmVzaXplX2Rl
ZmF1bHQ6CiAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1dJTkNILCBzZWxmLl9y
ZXNpemVfZGVmYXVsdCkKCiAgICBkZWYgc2V0bWVzc2FnZShzZWxmLCBtc2cpOgogICAgICAgIHNl
bGYubXNnID0gbXNnCiAgICAgICAgc2VsZi53aWRnZXRzWzBdID0gbXNnCgogICAgZGVmIHNldGV4
dHJhKHNlbGYsIGV4dHJhKToKICAgICAgICBpZiBzZWxmLmV4dHJhcG9zID4gLTE6CiAgICAgICAg
ICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgZXh0cmFzdHIgPSBzdHIoZXh0cmEpCiAgICAg
ICAgICAgICAgICBpZiBleHRyYXN0clswXSAhPSAnICc6CiAgICAgICAgICAgICAgICAgICAgZXh0
cmFzdHIgPSAnICcgKyBleHRyYXN0cgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAg
ZXh0cmFzdHIgPSAnJwogICAgICAgICAgICBzZWxmLndpZGdldHNbc2VsZi5leHRyYXBvc10gPSBl
eHRyYXN0cgoKICAgIGRlZiBfbmVlZF91cGRhdGUoc2VsZik6CiAgICAgICAgIyBXZSBhbHdheXMg
d2FudCB0aGUgYmFyIHRvIHByaW50IHdoZW4gdXBkYXRlKCkgaXMgY2FsbGVkCiAgICAgICAgcmV0
dXJuIFRydWUKCmNsYXNzIE5vbkludGVyYWN0aXZlUHJvZ3Jlc3Mob2JqZWN0KToKICAgIGZvYmog
PSBzeXMuc3Rkb3V0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgbWF4dmFsKToKICAgICAg
ICBzZWxmLm1zZyA9IG1zZwogICAgICAgIHNlbGYubWF4dmFsID0gbWF4dmFsCiAgICAgICAgc2Vs
Zi5maW5pc2hlZCA9IEZhbHNlCgogICAgZGVmIHN0YXJ0KHNlbGYsIHVwZGF0ZT1UcnVlKToKICAg
ICAgICBzZWxmLmZvYmoud3JpdGUoIiVzLi4uIiAlIHNlbGYubXNnKQogICAgICAgIHNlbGYuZm9i
ai5mbHVzaCgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgdXBkYXRlKHNlbGYsIHZhbHVl
KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZp
bmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZvYmoud3JpdGUoImRvbmUu
XG4iKQogICAgICAgIHNlbGYuZm9iai5mbHVzaCgpCiAgICAgICAgc2VsZi5maW5pc2hlZCA9IFRy
dWUKCmRlZiBuZXdfcHJvZ3Jlc3MobXNnLCBtYXh2YWwpOgogICAgaWYgaW50ZXJhY3RpdmU6CiAg
ICAgICAgcmV0dXJuIEJCUHJvZ3Jlc3MobXNnLCBtYXh2YWwpCiAgICBlbHNlOgogICAgICAgIHJl
dHVybiBOb25JbnRlcmFjdGl2ZVByb2dyZXNzKG1zZywgbWF4dmFsKQoKZGVmIHBsdXJhbGlzZShz
aW5ndWxhciwgcGx1cmFsLCBxdHkpOgogICAgaWYocXR5ID09IDEpOgogICAgICAgIHJldHVybiBz
aW5ndWxhciAlIHF0eQogICAgZWxzZToKICAgICAgICByZXR1cm4gcGx1cmFsICUgcXR5CgoKY2xh
c3MgSW50ZXJhY3RDb25zb2xlTG9nRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCB0ZiwgZm9ybWF0KToKICAgICAgICBzZWxmLnRmID0gdGYKICAgICAgICBzZWxm
LmZvcm1hdCA9IGZvcm1hdAoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKICAgICAgICBp
ZiByZWNvcmQubGV2ZWxubyA9PSBzZWxmLmZvcm1hdC5OT1RFIGFuZCAocmVjb3JkLm1zZy5zdGFy
dHN3aXRoKCJSdW5uaW5nIikgb3IgcmVjb3JkLm1zZy5zdGFydHN3aXRoKCJyZWNpcGUgIikpOgog
ICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzZWxmLnRmLmNsZWFyRm9vdGVyKCkKICAg
ICAgICByZXR1cm4gVHJ1ZQoKY2xhc3MgVGVybWluYWxGaWx0ZXIob2JqZWN0KToKICAgIHJvd3Mg
PSAyNQogICAgY29sdW1ucyA9IDgwCgogICAgZGVmIHNpZ3dpbmNoX2hhbmRsZShzZWxmLCBzaWdu
dW0sIGZyYW1lKToKICAgICAgICBzZWxmLnJvd3MsIHNlbGYuY29sdW1ucyA9IHNlbGYuZ2V0VGVy
bWluYWxDb2x1bW5zKCkKICAgICAgICBpZiBzZWxmLl9zaWd3aW5jaF9kZWZhdWx0OgogICAgICAg
ICAgICBzZWxmLl9zaWd3aW5jaF9kZWZhdWx0KHNpZ251bSwgZnJhbWUpCgogICAgZGVmIGdldFRl
cm1pbmFsQ29sdW1ucyhzZWxmKToKICAgICAgICBkZWYgaW9jdGxfR1dJTlNaKGZkKToKICAgICAg
ICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3IgPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGZjbnRs
LmlvY3RsKGZkLCBzZWxmLnRlcm1pb3MuVElPQ0dXSU5TWiwgJzEyMzQnKSkKICAgICAgICAgICAg
ZXhjZXB0OgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuIGNy
CiAgICAgICAgY3IgPSBpb2N0bF9HV0lOU1ooc3lzLnN0ZG91dC5maWxlbm8oKSkKICAgICAgICBp
ZiBub3QgY3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZkID0gb3Mub3Blbihv
cy5jdGVybWlkKCksIG9zLk9fUkRPTkxZKQogICAgICAgICAgICAgICAgY3IgPSBpb2N0bF9HV0lO
U1ooZmQpCiAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgZXhjZXB0Ogog
ICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIG5vdCBjcjoKICAgICAgICAgICAgdHJ5Ogog
ICAgICAgICAgICAgICAgY3IgPSAoZW52WydMSU5FUyddLCBlbnZbJ0NPTFVNTlMnXSkKICAgICAg
ICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgY3IgPSAoMjUsIDgwKQogICAgICAgIHJldHVy
biBjcgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYWluLCBoZWxwZXIsIGNvbnNvbGUsIGVycmNv
bnNvbGUsIGZvcm1hdCwgcXVpZXQpOgogICAgICAgIHNlbGYubWFpbiA9IG1haW4KICAgICAgICBz
ZWxmLmhlbHBlciA9IGhlbHBlcgogICAgICAgIHNlbGYuY3V1ID0gTm9uZQogICAgICAgIHNlbGYu
c3RkaW5iYWNrdXAgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcmFjdGl2ZSA9IHN5cy5zdGRvdXQu
aXNhdHR5KCkKICAgICAgICBzZWxmLmZvb3Rlcl9wcmVzZW50ID0gRmFsc2UKICAgICAgICBzZWxm
Lmxhc3RwaWRzID0gW10KICAgICAgICBzZWxmLmxhc3R0aW1lID0gTm9uZQogICAgICAgIHNlbGYu
cXVpZXQgPSBxdWlldAoKICAgICAgICBpZiBub3Qgc2VsZi5pbnRlcmFjdGl2ZToKICAgICAgICAg
ICAgcmV0dXJuCgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGN1cnNlcwogICAgICAg
IGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgc3lzLmV4aXQoIkZBVEFMOiBUaGUga25v
dHR5IHVpIGNvdWxkIG5vdCBsb2FkIHRoZSByZXF1aXJlZCBjdXJzZXMgcHl0aG9uIG1vZHVsZS4i
KQoKICAgICAgICBpbXBvcnQgdGVybWlvcwogICAgICAgIHNlbGYuY3Vyc2VzID0gY3Vyc2VzCiAg
ICAgICAgc2VsZi50ZXJtaW9zID0gdGVybWlvcwogICAgICAgIHRyeToKICAgICAgICAgICAgZmQg
PSBzeXMuc3RkaW4uZmlsZW5vKCkKICAgICAgICAgICAgc2VsZi5zdGRpbmJhY2t1cCA9IHRlcm1p
b3MudGNnZXRhdHRyKGZkKQogICAgICAgICAgICBuZXcgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc3Rk
aW5iYWNrdXApCiAgICAgICAgICAgIG5ld1szXSA9IG5ld1szXSAmIH50ZXJtaW9zLkVDSE8KICAg
ICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBuZXcpCiAg
ICAgICAgICAgIGN1cnNlcy5zZXR1cHRlcm0oKQogICAgICAgICAgICBpZiBjdXJzZXMudGlnZXRu
dW0oImNvbG9ycyIpID4gMjoKICAgICAgICAgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQog
ICAgICAgICAgICBzZWxmLmVkID0gY3Vyc2VzLnRpZ2V0c3RyKCJlZCIpCiAgICAgICAgICAgIGlm
IHNlbGYuZWQ6CiAgICAgICAgICAgICAgICBzZWxmLmN1dSA9IGN1cnNlcy50aWdldHN0cigiY3V1
IikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fc2lnd2luY2hfZGVmYXVs
dCA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR1dJTkNIKQogICAgICAgICAgICAgICAgc2ln
bmFsLnNpZ25hbChzaWduYWwuU0lHV0lOQ0gsIHNlbGYuc2lnd2luY2hfaGFuZGxlKQogICAgICAg
ICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYucm93cywg
c2VsZi5jb2x1bW5zID0gc2VsZi5nZXRUZXJtaW5hbENvbHVtbnMoKQogICAgICAgIGV4Y2VwdDoK
ICAgICAgICAgICAgc2VsZi5jdXUgPSBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuY3V1OgogICAg
ICAgICAgICBzZWxmLmludGVyYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgYmIubm90ZSgiVW5h
YmxlIHRvIHVzZSBpbnRlcmFjdGl2ZSBtb2RlIGZvciB0aGlzIHRlcm1pbmFsLCB1c2luZyBmYWxs
YmFjayIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGNvbnNvbGU6CiAgICAgICAgICAg
IGNvbnNvbGUuYWRkRmlsdGVyKEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQp
KQogICAgICAgIGlmIGVycmNvbnNvbGU6CiAgICAgICAgICAgIGVycmNvbnNvbGUuYWRkRmlsdGVy
KEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQpKQoKICAgICAgICBzZWxmLm1h
aW5fcHJvZ3Jlc3MgPSBOb25lCgogICAgZGVmIGNsZWFyRm9vdGVyKHNlbGYpOgogICAgICAgIGlm
IHNlbGYuZm9vdGVyX3ByZXNlbnQ6CiAgICAgICAgICAgIGxpbmVzID0gc2VsZi5mb290ZXJfcHJl
c2VudAogICAgICAgICAgICBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZShzZWxmLmN1cnNlcy50cGFy
bShzZWxmLmN1dSwgbGluZXMpKQogICAgICAgICAgICBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZShz
ZWxmLmN1cnNlcy50cGFybShzZWxmLmVkKSkKICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgp
CiAgICAgICAgc2VsZi5mb290ZXJfcHJlc2VudCA9IEZhbHNlCgogICAgZGVmIHVwZGF0ZUZvb3Rl
cihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5jdXU6CiAgICAgICAgICAgIHJldHVybgogICAg
ICAgIGFjdGl2ZXRhc2tzID0gc2VsZi5oZWxwZXIucnVubmluZ190YXNrcwogICAgICAgIGZhaWxl
ZHRhc2tzID0gc2VsZi5oZWxwZXIuZmFpbGVkX3Rhc2tzCiAgICAgICAgcnVubmluZ3BpZHMgPSBz
ZWxmLmhlbHBlci5ydW5uaW5nX3BpZHMKICAgICAgICBjdXJyZW50dGltZSA9IHRpbWUudGltZSgp
CiAgICAgICAgaWYgbm90IHNlbGYubGFzdHRpbWUgb3IgKGN1cnJlbnR0aW1lIC0gc2VsZi5sYXN0
dGltZSA+IDUpOgogICAgICAgICAgICBzZWxmLmhlbHBlci5uZWVkVXBkYXRlID0gVHJ1ZQogICAg
ICAgICAgICBzZWxmLmxhc3R0aW1lID0gY3VycmVudHRpbWUKICAgICAgICBpZiBzZWxmLmZvb3Rl
cl9wcmVzZW50IGFuZCBub3Qgc2VsZi5oZWxwZXIubmVlZFVwZGF0ZToKICAgICAgICAgICAgcmV0
dXJuCiAgICAgICAgc2VsZi5oZWxwZXIubmVlZFVwZGF0ZSA9IEZhbHNlCiAgICAgICAgaWYgc2Vs
Zi5mb290ZXJfcHJlc2VudDoKICAgICAgICAgICAgc2VsZi5jbGVhckZvb3RlcigpCiAgICAgICAg
aWYgKG5vdCBzZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsIG9yIHNlbGYuaGVscGVyLnRhc2tu
dW1iZXJfY3VycmVudCA9PSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsKSBhbmQgbm90IGxl
bihhY3RpdmV0YXNrcyk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRhc2tzID0gW10KICAg
ICAgICBmb3IgdCBpbiBydW5uaW5ncGlkczoKICAgICAgICAgICAgcHJvZ3Jlc3MgPSBhY3RpdmV0
YXNrc1t0XS5nZXQoInByb2dyZXNzIiwgTm9uZSkKICAgICAgICAgICAgaWYgcHJvZ3Jlc3MgaXMg
bm90IE5vbmU6CiAgICAgICAgICAgICAgICBwYmFyID0gYWN0aXZldGFza3NbdF0uZ2V0KCJwcm9n
cmVzc2JhciIsIE5vbmUpCiAgICAgICAgICAgICAgICByYXRlID0gYWN0aXZldGFza3NbdF0uZ2V0
KCJyYXRlIiwgTm9uZSkKICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSBhY3RpdmV0YXNrc1t0
XS5nZXQoInN0YXJ0dGltZSIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBub3QgcGJhciBvciBw
YmFyLmJvdW5jaW5nICE9IChwcm9ncmVzcyA8IDApOgogICAgICAgICAgICAgICAgICAgIGlmIHBy
b2dyZXNzIDwgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcGJhciA9IEJCUHJvZ3Jlc3MoIjA6
ICVzIChwaWQgJXMpICIgJSAoYWN0aXZldGFza3NbdF1bInRpdGxlIl0sIHQpLCAxMDAsIHdpZGdl
dHM9W3Byb2dyZXNzYmFyLkJvdW5jaW5nU2xpZGVyKCksICcnXSwgZXh0cmFwb3M9MiwgcmVzaXpl
X2hhbmRsZXI9c2VsZi5zaWd3aW5jaF9oYW5kbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHBi
YXIuYm91bmNpbmcgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg
ICAgICAgICAgICAgcGJhciA9IEJCUHJvZ3Jlc3MoIjA6ICVzIChwaWQgJXMpICIgJSAoYWN0aXZl
dGFza3NbdF1bInRpdGxlIl0sIHQpLCAxMDAsIHdpZGdldHM9W3Byb2dyZXNzYmFyLlBlcmNlbnRh
Z2UoKSwgJyAnLCBwcm9ncmVzc2Jhci5CYXIoKSwgJyddLCBleHRyYXBvcz00LCByZXNpemVfaGFu
ZGxlcj1zZWxmLnNpZ3dpbmNoX2hhbmRsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcGJhci5i
b3VuY2luZyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgYWN0aXZldGFza3NbdF1bInByb2dy
ZXNzYmFyIl0gPSBwYmFyCiAgICAgICAgICAgICAgICB0YXNrcy5hcHBlbmQoKHBiYXIsIHByb2dy
ZXNzLCByYXRlLCBzdGFydF90aW1lKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAg
IHN0YXJ0X3RpbWUgPSBhY3RpdmV0YXNrc1t0XS5nZXQoInN0YXJ0dGltZSIsIE5vbmUpCiAgICAg
ICAgICAgICAgICBpZiBzdGFydF90aW1lOgogICAgICAgICAgICAgICAgICAgIHRhc2tzLmFwcGVu
ZCgiJXMgLSAlZHMgKHBpZCAlcykiICUgKGFjdGl2ZXRhc2tzW3RdWyJ0aXRsZSJdLCBjdXJyZW50
dGltZSAtIHN0YXJ0X3RpbWUsIHQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg
ICAgICAgICB0YXNrcy5hcHBlbmQoIiVzIChwaWQgJXMpIiAlIChhY3RpdmV0YXNrc1t0XVsidGl0
bGUiXSwgdCkpCgogICAgICAgIGlmIHNlbGYubWFpbi5zaHV0ZG93bjoKICAgICAgICAgICAgY29u
dGVudCA9ICJXYWl0aW5nIGZvciAlcyBydW5uaW5nIHRhc2tzIHRvIGZpbmlzaDoiICUgbGVuKGFj
dGl2ZXRhc2tzKQogICAgICAgICAgICBwcmludChjb250ZW50KQogICAgICAgIGVsc2U6CiAgICAg
ICAgICAgIGlmIHNlbGYucXVpZXQ6CiAgICAgICAgICAgICAgICBjb250ZW50ID0gIlJ1bm5pbmcg
dGFza3MgKCVzIG9mICVzKSIgJSAoc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50LCBzZWxm
LmhlbHBlci50YXNrbnVtYmVyX3RvdGFsKQogICAgICAgICAgICBlbGlmIG5vdCBsZW4oYWN0aXZl
dGFza3MpOgogICAgICAgICAgICAgICAgY29udGVudCA9ICJObyBjdXJyZW50bHkgcnVubmluZyB0
YXNrcyAoJXMgb2YgJXMpIiAlIChzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQsIHNlbGYu
aGVscGVyLnRhc2tudW1iZXJfdG90YWwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAg
ICBjb250ZW50ID0gIkN1cnJlbnRseSAlMnMgcnVubmluZyB0YXNrcyAoJXMgb2YgJXMpIiAlIChs
ZW4oYWN0aXZldGFza3MpLCBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQsIHNlbGYuaGVs
cGVyLnRhc2tudW1iZXJfdG90YWwpCiAgICAgICAgICAgIG1heHRhc2sgPSBzZWxmLmhlbHBlci50
YXNrbnVtYmVyX3RvdGFsCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1haW5fcHJvZ3Jlc3Mgb3Ig
c2VsZi5tYWluX3Byb2dyZXNzLm1heHZhbCAhPSBtYXh0YXNrOgogICAgICAgICAgICAgICAgd2lk
Z2V0cyA9IFsnICcsIHByb2dyZXNzYmFyLlBlcmNlbnRhZ2UoKSwgJyAnLCBwcm9ncmVzc2Jhci5C
YXIoKV0KICAgICAgICAgICAgICAgIHNlbGYubWFpbl9wcm9ncmVzcyA9IEJCUHJvZ3Jlc3MoIlJ1
bm5pbmcgdGFza3MiLCBtYXh0YXNrLCB3aWRnZXRzPXdpZGdldHMsIHJlc2l6ZV9oYW5kbGVyPXNl
bGYuc2lnd2luY2hfaGFuZGxlKQogICAgICAgICAgICAgICAgc2VsZi5tYWluX3Byb2dyZXNzLnN0
YXJ0KEZhbHNlKQogICAgICAgICAgICBzZWxmLm1haW5fcHJvZ3Jlc3Muc2V0bWVzc2FnZShjb250
ZW50KQogICAgICAgICAgICBwcm9ncmVzcyA9IHNlbGYuaGVscGVyLnRhc2tudW1iZXJfY3VycmVu
dCAtIDEKICAgICAgICAgICAgaWYgcHJvZ3Jlc3MgPCAwOgogICAgICAgICAgICAgICAgcHJvZ3Jl
c3MgPSAwCiAgICAgICAgICAgIGNvbnRlbnQgPSBzZWxmLm1haW5fcHJvZ3Jlc3MudXBkYXRlKHBy
b2dyZXNzKQogICAgICAgICAgICBwcmludCgnJykKICAgICAgICBsaW5lcyA9IDEgKyBpbnQobGVu
KGNvbnRlbnQpIC8gKHNlbGYuY29sdW1ucyArIDEpKQogICAgICAgIGlmIHNlbGYucXVpZXQgPT0g
MDoKICAgICAgICAgICAgZm9yIHRhc2tudW0sIHRhc2sgaW4gZW51bWVyYXRlKHRhc2tzWzooc2Vs
Zi5yb3dzIC0gMildKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGFzaywgdHVwbGUp
OgogICAgICAgICAgICAgICAgICAgIHBiYXIsIHByb2dyZXNzLCByYXRlLCBzdGFydF90aW1lID0g
dGFzawogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwYmFyLnN0YXJ0X3RpbWU6CiAgICAgICAg
ICAgICAgICAgICAgICAgIHBiYXIuc3RhcnQoRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAg
IGlmIHN0YXJ0X3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmFyLnN0YXJ0X3Rp
bWUgPSBzdGFydF90aW1lCiAgICAgICAgICAgICAgICAgICAgcGJhci5zZXRtZXNzYWdlKCclczol
cycgJSAodGFza251bSwgcGJhci5tc2cuc3BsaXQoJzonLCAxKVsxXSkpCiAgICAgICAgICAgICAg
ICAgICAgaWYgcHJvZ3Jlc3MgPiAtMToKICAgICAgICAgICAgICAgICAgICAgICAgcGJhci5zZXRl
eHRyYShyYXRlKQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcGJhci51cGRhdGUo
cHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGVudCA9IHBiYXIudXBkYXRlKDEpCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJycp
CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAiJXM6
ICVzIiAlICh0YXNrbnVtLCB0YXNrKQogICAgICAgICAgICAgICAgICAgIHByaW50KGNvbnRlbnQp
CiAgICAgICAgICAgICAgICBsaW5lcyA9IGxpbmVzICsgMSArIGludChsZW4oY29udGVudCkgLyAo
c2VsZi5jb2x1bW5zICsgMSkpCiAgICAgICAgc2VsZi5mb290ZXJfcHJlc2VudCA9IGxpbmVzCiAg
ICAgICAgc2VsZi5sYXN0cGlkcyA9IHJ1bm5pbmdwaWRzWzpdCiAgICAgICAgc2VsZi5sYXN0Y291
bnQgPSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQKCiAgICBkZWYgZmluaXNoKHNlbGYp
OgogICAgICAgIGlmIHNlbGYuc3RkaW5iYWNrdXA6CiAgICAgICAgICAgIGZkID0gc3lzLnN0ZGlu
LmZpbGVubygpCiAgICAgICAgICAgIHNlbGYudGVybWlvcy50Y3NldGF0dHIoZmQsIHNlbGYudGVy
bWlvcy5UQ1NBRFJBSU4sIHNlbGYuc3RkaW5iYWNrdXApCgpkZWYgcHJpbnRfZXZlbnRfbG9nKGV2
ZW50LCBpbmNsdWRlbG9ncywgbG9nbGluZXMsIHRlcm1maWx0ZXIpOgogICAgIyBGSVhNRSByZWZh
Y3RvciB0aGlzIG91dCBmdXJ0aGVyCiAgICBsb2dmaWxlID0gZXZlbnQubG9nZmlsZQogICAgaWYg
bG9nZmlsZSBhbmQgb3MucGF0aC5leGlzdHMobG9nZmlsZSk6CiAgICAgICAgdGVybWZpbHRlci5j
bGVhckZvb3RlcigpCiAgICAgICAgYmIuZXJyb3IoIkxvZ2ZpbGUgb2YgZmFpbHVyZSBzdG9yZWQg
aW46ICVzIiAlIGxvZ2ZpbGUpCiAgICAgICAgaWYgaW5jbHVkZWxvZ3MgYW5kIG5vdCBldmVudC5l
cnJwcmludGVkOgogICAgICAgICAgICBwcmludCgiTG9nIGRhdGEgZm9sbG93czoiKQogICAgICAg
ICAgICBmID0gb3Blbihsb2dmaWxlLCAiciIpCiAgICAgICAgICAgIGxpbmVzID0gW10KICAgICAg
ICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGwgPSBmLnJlYWRsaW5lKCkKICAgICAg
ICAgICAgICAgIGlmIGwgPT0gJyc6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAg
ICAgICAgIGwgPSBsLnJzdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBsb2dsaW5lczoKICAgICAg
ICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyB8ICVzJyAlIGwpCiAgICAgICAgICAgICAgICAg
ICAgaWYgbGVuKGxpbmVzKSA+IGludChsb2dsaW5lcyk6CiAgICAgICAgICAgICAgICAgICAgICAg
IGxpbmVzLnBvcCgwKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBw
cmludCgnfCAlcycgJSBsKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgaWYgbGlu
ZXM6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgICAg
ICBwcmludChsaW5lKQoKZGVmIF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIoc2VydmVyLCBvYnNl
cnZlX29ubHkpOgogICAgIyBHZXQgdmFsdWVzIG9mIHZhcmlhYmxlcyB3aGljaCBjb250cm9sIG91
ciBvdXRwdXQKICAgIGluY2x1ZGVsb2dzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0
VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HUyJdKQogICAgaWYgZXJyb3I6CiAgICAgICAgbG9nZ2Vy
LmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQklOQ0xVREVMT0dTIHZhcmlhYmxl
OiAlcyIgJSBlcnJvcikKICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQogICAgbG9n
bGluZXMsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQklOQ0xV
REVMT0dTX0xJTkVTIl0pCiAgICBpZiBlcnJvcjoKICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJs
ZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCSU5DTFVERUxPR1NfTElORVMgdmFyaWFibGU6ICVzIiAl
IGVycm9yKQogICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oZXJyb3IpCiAgICBpZiBvYnNlcnZl
X29ubHk6CiAgICAgICAgY21kID0gJ2dldFZhcmlhYmxlJwogICAgZWxzZToKICAgICAgICBjbWQg
PSAnZ2V0U2V0VmFyaWFibGUnCiAgICBjb25zb2xlbG9nZmlsZSwgZXJyb3IgPSBzZXJ2ZXIucnVu
Q29tbWFuZChbY21kLCAiQkJfQ09OU09MRUxPRyJdKQogICAgaWYgZXJyb3I6CiAgICAgICAgbG9n
Z2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQl9DT05TT0xFTE9HIHZhcmlh
YmxlOiAlcyIgJSBlcnJvcikKICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQogICAg
cmV0dXJuIGluY2x1ZGVsb2dzLCBsb2dsaW5lcywgY29uc29sZWxvZ2ZpbGUKCl9ldnRfbGlzdCA9
IFsgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQiLCAiYmIuZXZlbnQuTG9nRXhlY1RUWSIs
ICJsb2dnaW5nLkxvZ1JlY29yZCIsCiAgICAgICAgICAgICAgImJiLmJ1aWxkLlRhc2tGYWlsZWQi
LCAiYmIuYnVpbGQuVGFza0Jhc2UiLCAiYmIuZXZlbnQuUGFyc2VTdGFydGVkIiwKICAgICAgICAg
ICAgICAiYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyIsICJiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCIs
ICJiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkIiwKICAgICAgICAgICAgICAiYmIuZXZlbnQuQ2Fj
aGVMb2FkUHJvZ3Jlc3MiLCAiYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkIiwgImJiLmNvbW1h
bmQuQ29tbWFuZEZhaWxlZCIsCiAgICAgICAgICAgICAgImJiLmNvbW1hbmQuQ29tbWFuZEV4aXQi
LCAiYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkIiwgICJiYi5jb29rZXIuQ29va2VyRXhpdCIs
CiAgICAgICAgICAgICAgImJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzIiwgImJiLmV2ZW50Lk5v
UHJvdmlkZXIiLCAiYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkIiwKICAgICAgICAg
ICAgICAiYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCIsICJiYi5ydW5xdWV1ZS5ydW5R
dWV1ZVRhc2tGYWlsZWQiLCAiYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tGYWlsZWQiLAogICAg
ICAgICAgICAgICJiYi5ldmVudC5CdWlsZEJhc2UiLCAiYmIuYnVpbGQuVGFza1N0YXJ0ZWQiLCAi
YmIuYnVpbGQuVGFza1N1Y2NlZWRlZCIsICJiYi5idWlsZC5UYXNrRmFpbGVkU2lsZW50IiwKICAg
ICAgICAgICAgICAiYmIuYnVpbGQuVGFza1Byb2dyZXNzIiwgImJiLmV2ZW50LlByb2Nlc3NTdGFy
dGVkIiwgImJiLmV2ZW50LlByb2Nlc3NQcm9ncmVzcyIsICJiYi5ldmVudC5Qcm9jZXNzRmluaXNo
ZWQiXQoKZGVmIG1haW4oc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcywgdGYgPSBUZXJtaW5h
bEZpbHRlcik6CgogICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHk6CiAgICAgICAgcGFyYW1z
LnVwZGF0ZVRvU2VydmVyKHNlcnZlciwgb3MuZW52aXJvbi5jb3B5KCkpCgogICAgaW5jbHVkZWxv
Z3MsIGxvZ2xpbmVzLCBjb25zb2xlbG9nZmlsZSA9IF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIo
c2VydmVyLCBwYXJhbXMub2JzZXJ2ZV9vbmx5KQoKICAgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKSBh
bmQgc3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICBsb2dfZXhlY190dHkgPSBUcnVlCiAgICBl
bHNlOgogICAgICAgIGxvZ19leGVjX3R0eSA9IEZhbHNlCgogICAgaGVscGVyID0gdWloZWxwZXIu
QkJVSUhlbHBlcigpCgogICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rk
b3V0KQogICAgZXJyY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3RkZXJyKQog
ICAgZm9ybWF0X3N0ciA9ICIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKICAgIGZvcm1hdCA9
IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQogICAgaWYgcGFyYW1zLm9wdGlvbnMu
cXVpZXQgPT0gMDoKICAgICAgICBmb3JjZWxldmVsID0gTm9uZQogICAgZWxpZiBwYXJhbXMub3B0
aW9ucy5xdWlldCA+IDI6CiAgICAgICAgZm9yY2VsZXZlbCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRl
ci5FUlJPUgogICAgZWxzZToKICAgICAgICBmb3JjZWxldmVsID0gYmIubXNnLkJCTG9nRm9ybWF0
dGVyLldBUk5JTkcKICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGUsIGJiLm1z
Zy5CQkxvZ0ZpbHRlclN0ZE91dCwgZm9yY2VsZXZlbCkKICAgIGJiLm1zZy5hZGREZWZhdWx0bG9n
RmlsdGVyKGVycmNvbnNvbGUsIGJiLm1zZy5CQkxvZ0ZpbHRlclN0ZEVycikKICAgIGNvbnNvbGUu
c2V0Rm9ybWF0dGVyKGZvcm1hdCkKICAgIGVycmNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkK
ICAgIGlmIG5vdCBiYi5tc2cuaGFzX2NvbnNvbGVfaGFuZGxlcihsb2dnZXIpOgogICAgICAgIGxv
Z2dlci5hZGRIYW5kbGVyKGNvbnNvbGUpCiAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoZXJyY29u
c29sZSkKCiAgICBiYi51dGlscy5zZXRfcHJvY2Vzc19uYW1lKCJLbm90dHlVSSIpCgogICAgaWYg
cGFyYW1zLm9wdGlvbnMucmVtb3RlX3NlcnZlciBhbmQgcGFyYW1zLm9wdGlvbnMua2lsbF9zZXJ2
ZXI6CiAgICAgICAgc2VydmVyLnRlcm1pbmF0ZVNlcnZlcigpCiAgICAgICAgcmV0dXJuCgogICAg
Y29uc29sZWxvZyA9IE5vbmUKICAgIGlmIGNvbnNvbGVsb2dmaWxlIGFuZCBub3QgcGFyYW1zLm9w
dGlvbnMuc2hvd19lbnZpcm9ubWVudCBhbmQgbm90IHBhcmFtcy5vcHRpb25zLnNob3dfdmVyc2lv
bnM6CiAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShjb25zb2xlbG9n
ZmlsZSkpCiAgICAgICAgY29ubG9nZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKGZvcm1h
dF9zdHIpCiAgICAgICAgY29uc29sZWxvZyA9IGxvZ2dpbmcuRmlsZUhhbmRsZXIoY29uc29sZWxv
Z2ZpbGUpCiAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZWxvZykKICAg
ICAgICBjb25zb2xlbG9nLnNldEZvcm1hdHRlcihjb25sb2dmb3JtYXQpCiAgICAgICAgbG9nZ2Vy
LmFkZEhhbmRsZXIoY29uc29sZWxvZykKICAgICAgICBsb2dsaW5rID0gb3MucGF0aC5qb2luKG9z
LnBhdGguZGlybmFtZShjb25zb2xlbG9nZmlsZSksICdjb25zb2xlLWxhdGVzdC5sb2cnKQogICAg
ICAgIGJiLnV0aWxzLnJlbW92ZShsb2dsaW5rKQogICAgICAgIHRyeToKICAgICAgICAgICBvcy5z
eW1saW5rKG9zLnBhdGguYmFzZW5hbWUoY29uc29sZWxvZ2ZpbGUpLCBsb2dsaW5rKQogICAgICAg
IGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgIHBhc3MKCiAgICBsbGV2ZWwsIGRlYnVnX2RvbWFp
bnMgPSBiYi5tc2cuY29uc3RydWN0TG9nT3B0aW9ucygpCiAgICBzZXJ2ZXIucnVuQ29tbWFuZChb
InNldEV2ZW50TWFzayIsIHNlcnZlci5nZXRFdmVudEhhbmRsZSgpLCBsbGV2ZWwsIGRlYnVnX2Rv
bWFpbnMsIF9ldnRfbGlzdF0pCgogICAgdW5pdmVyc2UgPSBGYWxzZQogICAgaWYgbm90IHBhcmFt
cy5vYnNlcnZlX29ubHk6CiAgICAgICAgcGFyYW1zLnVwZGF0ZUZyb21TZXJ2ZXIoc2VydmVyKQog
ICAgICAgIGNtZGxpbmUgPSBwYXJhbXMucGFyc2VBY3Rpb25zKCkKICAgICAgICBpZiBub3QgY21k
bGluZToKICAgICAgICAgICAgcHJpbnQoIk5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29y
bGQnIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2Fn
ZSBpbmZvcm1hdGlvbi4iKQogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGlmICdtc2cnIGlu
IGNtZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoY21k
bGluZVsnbXNnJ10pCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgaWYgY21kbGluZVsnYWN0
aW9uJ11bMF0gPT0gImJ1aWxkVGFyZ2V0cyIgYW5kICJ1bml2ZXJzZSIgaW4gY21kbGluZVsnYWN0
aW9uJ11bMV06CiAgICAgICAgICAgIHVuaXZlcnNlID0gVHJ1ZQoKICAgICAgICByZXQsIGVycm9y
ID0gc2VydmVyLnJ1bkNvbW1hbmQoY21kbGluZVsnYWN0aW9uJ10pCiAgICAgICAgaWYgZXJyb3I6
CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ29tbWFuZCAnJXMnIGZhaWxlZDogJXMiICUgKGNt
ZGxpbmUsIGVycm9yKSkKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBlbGlmIHJldCAhPSBU
cnVlOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvbW1hbmQgJyVzJyBmYWlsZWQ6IHJldHVy
bmVkICVzIiAlIChjbWRsaW5lLCByZXQpKQogICAgICAgICAgICByZXR1cm4gMQoKCiAgICBwYXJz
ZXByb2dyZXNzID0gTm9uZQogICAgY2FjaGVwcm9ncmVzcyA9IE5vbmUKICAgIG1haW4uc2h1dGRv
d24gPSAwCiAgICBpbnRlcnJ1cHRlZCA9IEZhbHNlCiAgICByZXR1cm5fdmFsdWUgPSAwCiAgICBl
cnJvcnMgPSAwCiAgICB3YXJuaW5ncyA9IDAKICAgIHRhc2tmYWlsdXJlcyA9IFtdCgogICAgdGVy
bWZpbHRlciA9IHRmKG1haW4sIGhlbHBlciwgY29uc29sZSwgZXJyY29uc29sZSwgZm9ybWF0LCBw
YXJhbXMub3B0aW9ucy5xdWlldCkKICAgIGF0ZXhpdC5yZWdpc3Rlcih0ZXJtZmlsdGVyLmZpbmlz
aCkKCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHRyeToKICAgICAgICAgICAgZXZlbnQgPSBldmVu
dEhhbmRsZXIud2FpdEV2ZW50KDApCiAgICAgICAgICAgIGlmIGV2ZW50IGlzIE5vbmU6CiAgICAg
ICAgICAgICAgICBpZiBtYWluLnNodXRkb3duID4gMToKICAgICAgICAgICAgICAgICAgICBicmVh
awogICAgICAgICAgICAgICAgdGVybWZpbHRlci51cGRhdGVGb290ZXIoKQogICAgICAgICAgICAg
ICAgZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDAuMjUpCiAgICAgICAgICAgICAgICBp
ZiBldmVudCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAg
IGhlbHBlci5ldmVudEhhbmRsZXIoZXZlbnQpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZl
bnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQpOgogICAgICAgICAgICAgICAgaWYgbm90
IG1haW4uc2h1dGRvd246CiAgICAgICAgICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDEKICAg
ICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJi
LmV2ZW50LkxvZ0V4ZWNUVFkpOgogICAgICAgICAgICAgICAgaWYgbG9nX2V4ZWNfdHR5OgogICAg
ICAgICAgICAgICAgICAgIHRyaWVzID0gZXZlbnQucmV0cmllcwogICAgICAgICAgICAgICAgICAg
IHdoaWxlIHRyaWVzOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiVHJ5aW5nIHRvIHJ1
bjogJXMiICUgZXZlbnQucHJvZykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3Muc3lzdGVt
KGV2ZW50LnByb2cpID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAg
ICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGV2ZW50LnNsZWVwX2RlbGF5KQogICAgICAg
ICAgICAgICAgICAgICAgICB0cmllcyAtPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgdHJpZXM6
CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBsb2dnZXIu
d2FybmluZyhldmVudC5tc2cpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAg
aWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgogICAgICAgICAgICAgICAg
aWYgZXZlbnQubGV2ZWxubyA+PSBmb3JtYXQuRVJST1I6CiAgICAgICAgICAgICAgICAgICAgZXJy
b3JzID0gZXJyb3JzICsgMQogICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAg
ICAgICAgICAgICAgIGVsaWYgZXZlbnQubGV2ZWxubyA9PSBmb3JtYXQuV0FSTklORzoKICAgICAg
ICAgICAgICAgICAgICB3YXJuaW5ncyA9IHdhcm5pbmdzICsgMQoKICAgICAgICAgICAgICAgIGlm
IGV2ZW50LnRhc2twaWQgIT0gMDoKICAgICAgICAgICAgICAgICAgICAjIEZvciAibm9ybWFsIiBs
b2dnaW5nIGNvbmRpdGlvbnMsIGRvbid0IHNob3cgbm90ZSBsb2dzIGZyb20gdGFza3MKICAgICAg
ICAgICAgICAgICAgICAjIGJ1dCBkbyBzaG93IHRoZW0gaWYgdGhlIHVzZXIgaGFzIGNoYW5nZWQg
dGhlIGRlZmF1bHQgbG9nIGxldmVsIHRvCiAgICAgICAgICAgICAgICAgICAgIyBpbmNsdWRlIHZl
cmJvc2UvZGVidWcgbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5v
IDw9IGZvcm1hdC5OT1RFIGFuZCAoZXZlbnQubGV2ZWxubyA8IGxsZXZlbCBvciAoZXZlbnQubGV2
ZWxubyA9PSBmb3JtYXQuTk9URSBhbmQgbGxldmVsICE9IGZvcm1hdC5WRVJCT1NFKSk6CiAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgICAgICMgUHJlZml4
IHRhc2sgbWVzc2FnZXMgd2l0aCByZWNpcGUvdGFzawogICAgICAgICAgICAgICAgICAgIGlmIGV2
ZW50LnRhc2twaWQgaW4gaGVscGVyLnJ1bm5pbmdfdGFza3MgYW5kIGV2ZW50LmxldmVsbm8gIT0g
Zm9ybWF0LlBMQUlOOgogICAgICAgICAgICAgICAgICAgICAgICB0YXNraW5mbyA9IGhlbHBlci5y
dW5uaW5nX3Rhc2tzW2V2ZW50LnRhc2twaWRdCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50
Lm1zZyA9IHRhc2tpbmZvWyd0aXRsZSddICsgJzogJyArIGV2ZW50Lm1zZwogICAgICAgICAgICAg
ICAgaWYgaGFzYXR0cihldmVudCwgJ2ZuJyk6CiAgICAgICAgICAgICAgICAgICAgZXZlbnQubXNn
ID0gZXZlbnQuZm4gKyAnOiAnICsgZXZlbnQubXNnCiAgICAgICAgICAgICAgICBsb2dnZXIuaGFu
ZGxlKGV2ZW50KQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGlzaW5z
dGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWRTaWxlbnQpOgogICAgICAgICAgICAgICAg
bG9nZ2VyLndhcm5pbmcoIkxvZ2ZpbGUgZm9yIGZhaWxlZCBzZXRzY2VuZSB0YXNrIGlzICVzIiAl
IGV2ZW50LmxvZ2ZpbGUpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBp
c2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrRmFpbGVkKToKICAgICAgICAgICAgICAgIHJl
dHVybl92YWx1ZSA9IDEKICAgICAgICAgICAgICAgIHByaW50X2V2ZW50X2xvZyhldmVudCwgaW5j
bHVkZWxvZ3MsIGxvZ2xpbmVzLCB0ZXJtZmlsdGVyKQogICAgICAgICAgICBpZiBpc2luc3RhbmNl
KGV2ZW50LCBiYi5idWlsZC5UYXNrQmFzZSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhl
dmVudC5fbWVzc2FnZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlz
aW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCk6CiAgICAgICAgICAgICAgICBp
ZiBwYXJhbXMub3B0aW9ucy5xdWlldCA+IDE6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUK
ICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRvdGFsID09IDA6CiAgICAgICAgICAgICAgICAgICAg
Y29udGludWUKICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MgPSBuZXdfcHJvZ3Jlc3MoIlBh
cnNpbmcgcmVjaXBlcyIsIGV2ZW50LnRvdGFsKS5zdGFydCgpCiAgICAgICAgICAgICAgICBjb250
aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVByb2dy
ZXNzKToKICAgICAgICAgICAgICAgICMjIyBUUlkgVE8gR0VUIFZBTFVFIEZST00gQkIgU0VSVkVS
ICMjIwogICAgICAgICAgICAgICAgcHJpbnQoInZ2diBCRUZPUkUgU0VSVkVSLlJVTkNPTU1BTkQo
KSB2dnYiKQogICAgICAgICAgICAgICAgdG1wX2RpciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0
VmFyaWFibGUiLCAiVE1QRElSIl0pWzBdCiAgICAgICAgICAgICAgICB0bXBfZGlyID0gc2VydmVy
LnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUTVBESVIiXSlbMF0KICAgICAgICAgICAgICAg
IHRtcF9kaXIgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRNUERJUiJdKVsw
XQogICAgICAgICAgICAgICAgdG1wX2RpciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFi
bGUiLCAiVE1QRElSIl0pWzBdCiAgICAgICAgICAgICAgICBwcmludCgiXl5eIEFGVEVSIFNFUlZF
Ui5SVU5DT01NQU5EKCkgXl5eIikKICAgICAgICAgICAgICAgIGlmIHBhcmFtcy5vcHRpb25zLnF1
aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYg
cGFyc2Vwcm9ncmVzczoKICAgICAgICAgICAgICAgICAgICBwYXJzZXByb2dyZXNzLnVwZGF0ZShl
dmVudC5jdXJyZW50KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBi
Yi53YXJuKCJHb3QgUGFyc2VQcm9ncmVzcyBldmVudCBmb3IgcGFyc2luZyB0aGF0IG5ldmVyIHN0
YXJ0ZWQ/IikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFu
Y2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKICAgICAgICAgICAgICAgIGlmIHBh
cmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAg
ICAgICAgICAgICAgaWYgbm90IHBhcnNlcHJvZ3Jlc3M6CiAgICAgICAgICAgICAgICAgICAgY29u
dGludWUKICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MuZmluaXNoKCkKICAgICAgICAgICAg
ICAgIHBhc3JlcHJvZ3Jlc3MgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBwYXJhbXMub3B0aW9u
cy5xdWlldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHByaW50KCgiUGFyc2luZyBvZiAlZCAu
YmIgZmlsZXMgY29tcGxldGUgKCVkIGNhY2hlZCwgJWQgcGFyc2VkKS4gJWQgdGFyZ2V0cywgJWQg
c2tpcHBlZCwgJWQgbWFza2VkLCAlZCBlcnJvcnMuIgogICAgICAgICAgICAgICAgICAgICAgICAl
ICggZXZlbnQudG90YWwsIGV2ZW50LmNhY2hlZCwgZXZlbnQucGFyc2VkLCBldmVudC52aXJ0dWFs
cywgZXZlbnQuc2tpcHBlZCwgZXZlbnQubWFza2VkLCBldmVudC5lcnJvcnMpKSkKICAgICAgICAg
ICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVu
dC5DYWNoZUxvYWRTdGFydGVkKToKICAgICAgICAgICAgICAgIGlmIHBhcmFtcy5vcHRpb25zLnF1
aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY2Fj
aGVwcm9ncmVzcyA9IG5ld19wcm9ncmVzcygiTG9hZGluZyBjYWNoZSIsIGV2ZW50LnRvdGFsKS5z
dGFydCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNl
KGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyk6CiAgICAgICAgICAgICAgICAjIyMg
VFJZIFRPIEdFVCBWQUxVRSBGUk9NIEJCIFNFUlZFUiAjIyMKICAgICAgICAgICAgICAgIHByaW50
KCJ2dnYyIEJFRk9SRSBTRVJWRVIuUlVOQ09NTUFORCgpIHZ2diIpCiAgICAgICAgICAgICAgICB0
bXBfZGlyID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUTVBESVIiXSlbMF0K
ICAgICAgICAgICAgICAgIHRtcF9kaXIgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxl
IiwgIlRNUERJUiJdKVswXQogICAgICAgICAgICAgICAgdG1wX2RpciA9IHNlcnZlci5ydW5Db21t
YW5kKFsiZ2V0VmFyaWFibGUiLCAiVE1QRElSIl0pWzBdCiAgICAgICAgICAgICAgICB0bXBfZGly
ID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUTVBESVIiXSlbMF0KICAgICAg
ICAgICAgICAgIHByaW50KCJeXl4yIEFGVEVSIFNFUlZFUi5SVU5DT01NQU5EKCkgXl5eIikKICAg
ICAgICAgICAgICAgIGlmIHBhcmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY2FjaGVwcm9ncmVzcy51cGRhdGUoZXZlbnQu
Y3VycmVudCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFu
Y2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCk6CiAgICAgICAgICAgICAgICBp
ZiBwYXJhbXMub3B0aW9ucy5xdWlldCA+IDE6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUK
ICAgICAgICAgICAgICAgIGNhY2hlcHJvZ3Jlc3MuZmluaXNoKCkKICAgICAgICAgICAgICAgIGlm
IHBhcmFtcy5vcHRpb25zLnF1aWV0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkxv
YWRlZCAlZCBlbnRyaWVzIGZyb20gZGVwZW5kZW5jeSBjYWNoZS4iICUgZXZlbnQubnVtX2VudHJp
ZXMpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShl
dmVudCwgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkKToKICAgICAgICAgICAgICAgIHJldHVybl92
YWx1ZSA9IGV2ZW50LmV4aXRjb2RlCiAgICAgICAgICAgICAgICBpZiBldmVudC5lcnJvcjoKICAg
ICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCiAgICAgICAgICAgICAgICAgICAg
bG9nZ2VyLmVycm9yKHN0cihldmVudCkpCiAgICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0g
MgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVu
dCwgYmIuY29tbWFuZC5Db21tYW5kRXhpdCk6CiAgICAgICAgICAgICAgICBpZiBub3QgcmV0dXJu
X3ZhbHVlOgogICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IGV2ZW50LmV4aXRjb2Rl
CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50
LCAoYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkLCBiYi5jb29rZXIuQ29va2VyRXhpdCkpOgog
ICAgICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDIKICAgICAgICAgICAgICAgIGNvbnRpbnVl
CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlk
ZXJzKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHN0cihldmVudCkpCiAgICAgICAgICAg
ICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5O
b1Byb3ZpZGVyKToKICAgICAgICAgICAgICAgICMgRm9yIHVuaXZlcnNlIGJ1aWxkcywgb25seSBz
aG93IHRoZXNlIGFzIHdhcm5pbmdzLCBub3QgZXJyb3JzCiAgICAgICAgICAgICAgICBpZiBub3Qg
dW5pdmVyc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMQogICAgICAgICAg
ICAgICAgICAgIGVycm9ycyA9IGVycm9ycyArIDEKICAgICAgICAgICAgICAgICAgICBsb2dnZXIu
ZXJyb3Ioc3RyKGV2ZW50KSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAg
ICAgbG9nZ2VyLndhcm5pbmcoc3RyKGV2ZW50KSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgog
ICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFz
a1N0YXJ0ZWQpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJ1bm5pbmcgc2V0c2NlbmUg
dGFzayAlZCBvZiAlZCAoJXMpIiAlIChldmVudC5zdGF0cy5jb21wbGV0ZWQgKyBldmVudC5zdGF0
cy5hY3RpdmUgKyBldmVudC5zdGF0cy5mYWlsZWQgKyAxLCBldmVudC5zdGF0cy50b3RhbCwgZXZl
bnQudGFza3N0cmluZykpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYg
aXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCk6CiAgICAg
ICAgICAgICAgICBpZiBldmVudC5ub2V4ZWM6CiAgICAgICAgICAgICAgICAgICAgdGFza3R5cGUg
PSAnbm9leGVjIHRhc2snCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAg
IHRhc2t0eXBlID0gJ3Rhc2snCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUnVubmluZyAl
cyAlZCBvZiAlZCAoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2t0eXBlLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhdHMuY29tcGxldGVkICsgZXZlbnQu
c3RhdHMuYWN0aXZlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdGF0
cy5mYWlsZWQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhdHMudG90
YWwsIGV2ZW50LnRhc2tzdHJpbmcpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAg
ICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrRmFpbGVkKToK
ICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAgICAgICAgICAgICAgIHRhc2tmYWls
dXJlcy5hcHBlbmQoZXZlbnQudGFza3N0cmluZykKICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJv
cihzdHIoZXZlbnQpKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGlz
aW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkKToKICAgICAg
ICAgICAgICAgIGxvZ2dlci53YXJuaW5nKHN0cihldmVudCkpCiAgICAgICAgICAgICAgICBjb250
aW51ZQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuRGVwVHJlZUdl
bmVyYXRlZCk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgaXNpbnN0
YW5jZShldmVudCwgYmIuZXZlbnQuUHJvY2Vzc1N0YXJ0ZWQpOgogICAgICAgICAgICAgICAgaWYg
cGFyYW1zLm9wdGlvbnMucXVpZXQgPiAxOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAg
ICAgICAgICAgICAgICBwYXJzZXByb2dyZXNzID0gbmV3X3Byb2dyZXNzKGV2ZW50LnByb2Nlc3Nu
YW1lLCBldmVudC50b3RhbCkKICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3Muc3RhcnQoRmFs
c2UpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2
ZW50LCBiYi5ldmVudC5Qcm9jZXNzUHJvZ3Jlc3MpOgogICAgICAgICAgICAgICAgaWYgcGFyYW1z
Lm9wdGlvbnMucXVpZXQgPiAxOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAg
ICAgICAgICBpZiBwYXJzZXByb2dyZXNzOgogICAgICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jl
c3MudXBkYXRlKGV2ZW50LnByb2dyZXNzKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAg
ICAgICAgICAgICBiYi53YXJuKCJHb3QgUHJvY2Vzc1Byb2dyZXNzIGV2ZW50IGZvciBzb21ldGlu
ZyB0aGF0IG5ldmVyIHN0YXJ0ZWQ/IikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAg
ICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlByb2Nlc3NGaW5pc2hlZCk6CiAgICAg
ICAgICAgICAgICBpZiBwYXJhbXMub3B0aW9ucy5xdWlldCA+IDE6CiAgICAgICAgICAgICAgICAg
ICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHBhcnNlcHJvZ3Jlc3M6CiAgICAgICAgICAg
ICAgICAgICAgcGFyc2Vwcm9ncmVzcy5maW5pc2goKQogICAgICAgICAgICAgICAgcGFyc2Vwcm9n
cmVzcyA9IE5vbmUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBpc2lu
c3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrUHJvZ3Jlc3MpOgogICAgICAgICAgICAgICAgIyMj
IFRSWSBUTyBHRVQgVkFMVUUgRlJPTSBCQiBTRVJWRVIgIyMjCiAgICAgICAgICAgICAgICBwcmlu
dCgidnZ2MyBCRUZPUkUgU0VSVkVSLlJVTkNPTU1BTkQoKSB2dnYiKQogICAgICAgICAgICAgICAg
dG1wX2RpciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVE1QRElSIl0pWzBd
CiAgICAgICAgICAgICAgICB0bXBfZGlyID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJs
ZSIsICJUTVBESVIiXSlbMF0KICAgICAgICAgICAgICAgIHRtcF9kaXIgPSBzZXJ2ZXIucnVuQ29t
bWFuZChbImdldFZhcmlhYmxlIiwgIlRNUERJUiJdKVswXQogICAgICAgICAgICAgICAgdG1wX2Rp
ciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVE1QRElSIl0pWzBdCiAgICAg
ICAgICAgICAgICBwcmludCgiXl5eMyBBRlRFUiBTRVJWRVIuUlVOQ09NTUFORCgpIF5eXiIpCiAg
ICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBpZ25vcmUKICAgICAgICAgICAg
aWYgaXNpbnN0YW5jZShldmVudCwgKGJiLmV2ZW50LkJ1aWxkQmFzZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk1ldGFkYXRhRXZlbnQsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5TdGFtcFVwZGF0ZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LkNvbmZpZ1BhcnNlZCwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk11bHRpQ29uZmlnUGFyc2VkLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUGFyc2VkLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUHJlRmluYWxpc2UsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ydW5xdWV1ZS5ydW5RdWV1ZUV2ZW50LAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uU3RhcnRl
ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvbkNv
bXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJh
dGlvblByb2dyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQu
RGlza0Z1bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5IZWFy
dGJlYXRFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNiYi5idWlsZC5U
YXNrUHJvZ3Jlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOgogICAgICAg
ICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5rbm93biBldmVu
dDogJXMiLCBldmVudCkKCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgaW9lcnJv
cjoKICAgICAgICAgICAgdGVybWZpbHRlci5jbGVhckZvb3RlcigpCiAgICAgICAgICAgICMgaWdu
b3JlIGludGVycnVwdGVkIGlvCiAgICAgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0Ogog
ICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIo
aW9lcnJvcikpCiAgICAgICAgICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5OgogICAgICAg
ICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93
biJdKQogICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgogICAgICAgIGV4Y2VwdCBLZXlib2Fy
ZEludGVycnVwdDoKICAgICAgICAgICAgdGVybWZpbHRlci5jbGVhckZvb3RlcigpCiAgICAgICAg
ICAgIGlmIHBhcmFtcy5vYnNlcnZlX29ubHk6CiAgICAgICAgICAgICAgICBwcmludCgiXG5LZXli
b2FyZCBJbnRlcnJ1cHQsIGV4aXRpbmcgb2JzZXJ2ZXIuLi4iKQogICAgICAgICAgICAgICAgbWFp
bi5zaHV0ZG93biA9IDIKICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHkgYW5k
IG1haW4uc2h1dGRvd24gPT0gMToKICAgICAgICAgICAgICAgIHByaW50KCJcblNlY29uZCBLZXli
b2FyZCBJbnRlcnJ1cHQsIHN0b3BwaW5nLi4uXG4iKQogICAgICAgICAgICAgICAgXywgZXJyb3Ig
PSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQogICAgICAgICAgICAg
ICAgaWYgZXJyb3I6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8g
Y2xlYW5seSBzdG9wOiAlcyIgJSBlcnJvcikKICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5vYnNl
cnZlX29ubHkgYW5kIG1haW4uc2h1dGRvd24gPT0gMDoKICAgICAgICAgICAgICAgIHByaW50KCJc
bktleWJvYXJkIEludGVycnVwdCwgY2xvc2luZyBkb3duLi4uXG4iKQogICAgICAgICAgICAgICAg
aW50ZXJydXB0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5D
b21tYW5kKFsic3RhdGVTaHV0ZG93biJdKQogICAgICAgICAgICAgICAgaWYgZXJyb3I6CiAgICAg
ICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gY2xlYW5seSBzaHV0ZG93bjog
JXMiICUgZXJyb3IpCiAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSBtYWluLnNodXRkb3duICsg
MQogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAg
ICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUodHJhY2Vi
YWNrLmZvcm1hdF9leGMoKSkKICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHk6
CiAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3Jj
ZVNodXRkb3duIl0pCiAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAyCiAgICAgICAgICAgIHJl
dHVybl92YWx1ZSA9IDEKICAgIHRyeToKICAgICAgICB0ZXJtZmlsdGVyLmNsZWFyRm9vdGVyKCkK
ICAgICAgICBzdW1tYXJ5ID0gIiIKICAgICAgICBpZiB0YXNrZmFpbHVyZXM6CiAgICAgICAgICAg
IHN1bW1hcnkgKz0gcGx1cmFsaXNlKCJcblN1bW1hcnk6ICVzIHRhc2sgZmFpbGVkOiIsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblN1bW1hcnk6ICVzIHRhc2tzIGZhaWxlZDoi
LCBsZW4odGFza2ZhaWx1cmVzKSkKICAgICAgICAgICAgZm9yIGZhaWx1cmUgaW4gdGFza2ZhaWx1
cmVzOgogICAgICAgICAgICAgICAgc3VtbWFyeSArPSAiXG4gICVzIiAlIGZhaWx1cmUKICAgICAg
ICBpZiB3YXJuaW5nczoKICAgICAgICAgICAgc3VtbWFyeSArPSBwbHVyYWxpc2UoIlxuU3VtbWFy
eTogVGhlcmUgd2FzICVzIFdBUk5JTkcgbWVzc2FnZSBzaG93bi4iLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiXG5TdW1tYXJ5OiBUaGVyZSB3ZXJlICVzIFdBUk5JTkcgbWVzc2Fn
ZXMgc2hvd24uIiwgd2FybmluZ3MpCiAgICAgICAgaWYgcmV0dXJuX3ZhbHVlIGFuZCBlcnJvcnM6
CiAgICAgICAgICAgIHN1bW1hcnkgKz0gcGx1cmFsaXNlKCJcblN1bW1hcnk6IFRoZXJlIHdhcyAl
cyBFUlJPUiBtZXNzYWdlIHNob3duLCByZXR1cm5pbmcgYSBub24temVybyBleGl0IGNvZGUuIiwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3VtbWFyeTogVGhlcmUgd2VyZSAl
cyBFUlJPUiBtZXNzYWdlcyBzaG93biwgcmV0dXJuaW5nIGEgbm9uLXplcm8gZXhpdCBjb2RlLiIs
IGVycm9ycykKICAgICAgICBpZiBzdW1tYXJ5IGFuZCBwYXJhbXMub3B0aW9ucy5xdWlldCA9PSAw
OgogICAgICAgICAgICBwcmludChzdW1tYXJ5KQoKICAgICAgICBpZiBpbnRlcnJ1cHRlZDoKICAg
ICAgICAgICAgcHJpbnQoIkV4ZWN1dGlvbiB3YXMgaW50ZXJydXB0ZWQsIHJldHVybmluZyBhIG5v
bi16ZXJvIGV4aXQgY29kZS4iKQogICAgICAgICAgICBpZiByZXR1cm5fdmFsdWUgPT0gMDoKICAg
ICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CiAg
ICAgICAgaW1wb3J0IGVycm5vCiAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FUElQRToKICAg
ICAgICAgICAgcGFzcwoKICAgIGlmIGNvbnNvbGVsb2c6CiAgICAgICAgbG9nZ2VyLnJlbW92ZUhh
bmRsZXIoY29uc29sZWxvZykKICAgICAgICBjb25zb2xlbG9nLmNsb3NlKCkKCiAgICByZXR1cm4g
cmV0dXJuX3ZhbHVlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>4044</attachid>
            <date>2017-10-02 23:48:52 +0000</date>
            <delta_ts>2017-10-02 23:48:52 +0000</delta_ts>
            <desc>knotty_server_histogram.py: server call histograms</desc>
            <filename>knotty_server_histogram.py</filename>
            <type>application/octet-stream</type>
            <size>30468</size>
            <attacher name="David Reyna">david.reyna</attacher>
            
              <data encoding="base64">IwojIEJpdEJha2UgKE5vKVRUWSBVSSBJbXBsZW1lbnRhdGlvbgojCiMgSGFuZGxpbmcgb3V0cHV0
IHRvIFRUWXMgb3IgZmlsZXMgKG5vIFRUWSkKIwojIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIFJp
Y2hhcmQgUHVyZGllCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBH
TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YWxvbmcKIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAojIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlz
aW9uCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgeG1scnBjLmNsaWVudCBhcyB4bWxycGNs
aWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHByb2dyZXNzYmFyCmltcG9ydCBzaWduYWwKaW1wb3J0
IGJiLm1zZwppbXBvcnQgdGltZQppbXBvcnQgZmNudGwKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29w
eQppbXBvcnQgYXRleGl0Cgpmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgoKZmVhdHVyZVNldCA9
IFtiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuU0VORF9TQU5JVFlFVkVOVFNdCgpsb2dnZXIgPSBs
b2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCmludGVyYWN0aXZlID0gc3lzLnN0ZG91dC5pc2F0
dHkoKQoKIyMjIEhpc3RvZ3JhbSBmb3Igc2VydmVyIGNhbGwgbGF0ZW5jeQpISVNUX1NFUlZFUl9T
SVpFID0gMzAKSElTVF9TRVJWRVJfVEVTVF9MT09QID0gNQpISVNUX1NFUlZFUl9TQU1QTEVfTUlO
ID0gNQoKc2VydmVyX2hpc3Q9W10Kc2VydmVyX3RhYmxlPVtdCnNlcnZlcl9ldmVudF9udW1iZXIg
PSAwCgpkZWYgaGlzdG9ncmFtX2luaXQoKToKICAgIGdsb2JhbCBzZXJ2ZXJfaGlzdAogICAgZm9y
IGkgaW4gcmFuZ2UoSElTVF9TRVJWRVJfU0laRSsyKToKICAgICAgICBzZXJ2ZXJfaGlzdC5hcHBl
bmQoMCkKCmRlZiBoaXN0b2dyYW1fYWRkKHNlcnZlcixldmVudCk6CiAgICBnbG9iYWwgc2VydmVy
X2V2ZW50X251bWJlcgogICAgZ2xvYmFsIHNlcnZlcl9oaXN0CiAgICBnbG9iYWwgc2VydmVyX3Rh
YmxlCiAgICBzZXJ2ZXJfZXZlbnRfbnVtYmVyICs9IDEKICAgIGZvciBpIGluIHJhbmdlKEhJU1Rf
U0VSVkVSX1RFU1RfTE9PUCk6CiAgICAgICAgIyBHRVQgVkFMVUUgRlJPTSBCQiBTRVJWRVIKICAg
ICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIHRtcF9kaXIgPSBzZXJ2ZXIucnVuQ29tbWFu
ZChbImdldFZhcmlhYmxlIiwgIlRNUERJUiJdKVswXQogICAgICAgIGxhdGVyID0gdGltZS50aW1l
KCkKICAgICAgICBkaWZmZXJlbmNlID0gaW50KGxhdGVyIC0gbm93KQogICAgICAgIHNlcnZlcl9o
aXN0W2RpZmZlcmVuY2VdICs9IDEKICAgICAgICBpZiBkaWZmZXJlbmNlID4gSElTVF9TRVJWRVJf
U0FNUExFX01JTjoKICAgICAgICAgICAgc2VydmVyX3RhYmxlLmFwcGVuZChbc2VydmVyX2V2ZW50
X251bWJlcixpLGRpZmZlcmVuY2Usc3RyKGV2ZW50KV0pCgpkZWYgaGlzdG9ncmFtX3NhdmUoKToK
ICAgIGdsb2JhbCBzZXJ2ZXJfaGlzdAogICAgZ2xvYmFsIHNlcnZlcl90YWJsZQogICAgd2l0aCBv
cGVuKCcvdG1wL2JiX3NlcnZlcl9oaXN0b2dyYW0uY3N2JywndycpIGFzIGY6CiAgICAgICAgcHJp
bnQoIlNlcnZlciBsYXRlbmN5IGluIHNlY29uZHM6IixmaWxlPWYpCiAgICAgICAgcHJpbnQoIlNl
Y29uZHNcdENvdW50IixmaWxlPWYpCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoSElTVF9TRVJWRVJf
U0laRSsyKToKICAgICAgICAgICAgcHJpbnQoIiVkXHQlZCIgJSAoaSxzZXJ2ZXJfaGlzdFtpXSks
ZmlsZT1mKQogICAgICAgIHByaW50KCJcblNlcnZlciBoaWdoIGxhdGVuY3kgZXZlbnRzOiIsZmls
ZT1mKQogICAgICAgIHByaW50KCJFdmVudCNcdExvb3BcdExhdGVuY3lcdEV2ZW50IixmaWxlPWYp
CiAgICAgICAgcHJpbnQoIkZPTzolcyIgJSB0eXBlKHNlcnZlcl90YWJsZSkpCiAgICAgICAgZm9y
IHQgaW4gc2VydmVyX3RhYmxlOgogICAgICAgICAgICBwcmludCgiJWRcdCVkXHQlc1x0JXMiICUg
KHRbMF0sdFsxXSx0WzJdLHRbM10pLGZpbGU9ZikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKY2xh
c3MgQkJQcm9ncmVzcyhwcm9ncmVzc2Jhci5Qcm9ncmVzc0Jhcik6CiAgICBkZWYgX19pbml0X18o
c2VsZiwgbXNnLCBtYXh2YWwsIHdpZGdldHM9Tm9uZSwgZXh0cmFwb3M9LTEsIHJlc2l6ZV9oYW5k
bGVyPU5vbmUpOgogICAgICAgIHNlbGYubXNnID0gbXNnCiAgICAgICAgc2VsZi5leHRyYXBvcyA9
IGV4dHJhcG9zCiAgICAgICAgaWYgbm90IHdpZGdldHM6CiAgICAgICAgICAgIHdpZGdldHMgPSBb
cHJvZ3Jlc3NiYXIuUGVyY2VudGFnZSgpLCAnICcsIHByb2dyZXNzYmFyLkJhcigpLCAnICcsCiAg
ICAgICAgICAgIHByb2dyZXNzYmFyLkVUQSgpXQogICAgICAgICAgICBzZWxmLmV4dHJhcG9zID0g
NAoKICAgICAgICBpZiByZXNpemVfaGFuZGxlcjoKICAgICAgICAgICAgc2VsZi5fcmVzaXplX2Rl
ZmF1bHQgPSByZXNpemVfaGFuZGxlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3Jl
c2l6ZV9kZWZhdWx0ID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHV0lOQ0gpCiAgICAgICAg
cHJvZ3Jlc3NiYXIuUHJvZ3Jlc3NCYXIuX19pbml0X18oc2VsZiwgbWF4dmFsLCBbc2VsZi5tc2cg
KyAiOiAiXSArIHdpZGdldHMsIGZkPXN5cy5zdGRvdXQpCgogICAgZGVmIF9oYW5kbGVfcmVzaXpl
KHNlbGYsIHNpZ251bT1Ob25lLCBmcmFtZT1Ob25lKToKICAgICAgICBwcm9ncmVzc2Jhci5Qcm9n
cmVzc0Jhci5faGFuZGxlX3Jlc2l6ZShzZWxmLCBzaWdudW0sIGZyYW1lKQogICAgICAgIGlmIHNl
bGYuX3Jlc2l6ZV9kZWZhdWx0OgogICAgICAgICAgICBzZWxmLl9yZXNpemVfZGVmYXVsdChzaWdu
dW0sIGZyYW1lKQoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgIyBTYXZlIHNlcnZlciBo
aXN0b2dyYW0KICAgICAgICBoaXN0b2dyYW1fc2F2ZSgpCiAgICAgICAgcHJvZ3Jlc3NiYXIuUHJv
Z3Jlc3NCYXIuZmluaXNoKHNlbGYpCiAgICAgICAgaWYgc2VsZi5fcmVzaXplX2RlZmF1bHQ6CiAg
ICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1dJTkNILCBzZWxmLl9yZXNpemVfZGVm
YXVsdCkKCiAgICBkZWYgc2V0bWVzc2FnZShzZWxmLCBtc2cpOgogICAgICAgIHNlbGYubXNnID0g
bXNnCiAgICAgICAgc2VsZi53aWRnZXRzWzBdID0gbXNnCgogICAgZGVmIHNldGV4dHJhKHNlbGYs
IGV4dHJhKToKICAgICAgICBpZiBzZWxmLmV4dHJhcG9zID4gLTE6CiAgICAgICAgICAgIGlmIGV4
dHJhOgogICAgICAgICAgICAgICAgZXh0cmFzdHIgPSBzdHIoZXh0cmEpCiAgICAgICAgICAgICAg
ICBpZiBleHRyYXN0clswXSAhPSAnICc6CiAgICAgICAgICAgICAgICAgICAgZXh0cmFzdHIgPSAn
ICcgKyBleHRyYXN0cgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXh0cmFzdHIg
PSAnJwogICAgICAgICAgICBzZWxmLndpZGdldHNbc2VsZi5leHRyYXBvc10gPSBleHRyYXN0cgoK
ICAgIGRlZiBfbmVlZF91cGRhdGUoc2VsZik6CiAgICAgICAgIyBXZSBhbHdheXMgd2FudCB0aGUg
YmFyIHRvIHByaW50IHdoZW4gdXBkYXRlKCkgaXMgY2FsbGVkCiAgICAgICAgcmV0dXJuIFRydWUK
CmNsYXNzIE5vbkludGVyYWN0aXZlUHJvZ3Jlc3Mob2JqZWN0KToKICAgIGZvYmogPSBzeXMuc3Rk
b3V0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgbWF4dmFsKToKICAgICAgICBzZWxmLm1z
ZyA9IG1zZwogICAgICAgIHNlbGYubWF4dmFsID0gbWF4dmFsCiAgICAgICAgc2VsZi5maW5pc2hl
ZCA9IEZhbHNlCgogICAgZGVmIHN0YXJ0KHNlbGYsIHVwZGF0ZT1UcnVlKToKICAgICAgICBzZWxm
LmZvYmoud3JpdGUoIiVzLi4uIiAlIHNlbGYubXNnKQogICAgICAgIHNlbGYuZm9iai5mbHVzaCgp
CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgdXBkYXRlKHNlbGYsIHZhbHVlKToKICAgICAg
ICBwYXNzCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbmlzaGVkOgog
ICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZvYmoud3JpdGUoImRvbmUuXG4iKQogICAg
ICAgIHNlbGYuZm9iai5mbHVzaCgpCiAgICAgICAgc2VsZi5maW5pc2hlZCA9IFRydWUKCmRlZiBu
ZXdfcHJvZ3Jlc3MobXNnLCBtYXh2YWwpOgogICAgaWYgaW50ZXJhY3RpdmU6CiAgICAgICAgcmV0
dXJuIEJCUHJvZ3Jlc3MobXNnLCBtYXh2YWwpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25J
bnRlcmFjdGl2ZVByb2dyZXNzKG1zZywgbWF4dmFsKQoKZGVmIHBsdXJhbGlzZShzaW5ndWxhciwg
cGx1cmFsLCBxdHkpOgogICAgaWYocXR5ID09IDEpOgogICAgICAgIHJldHVybiBzaW5ndWxhciAl
IHF0eQogICAgZWxzZToKICAgICAgICByZXR1cm4gcGx1cmFsICUgcXR5CgoKY2xhc3MgSW50ZXJh
Y3RDb25zb2xlTG9nRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxm
LCB0ZiwgZm9ybWF0KToKICAgICAgICBzZWxmLnRmID0gdGYKICAgICAgICBzZWxmLmZvcm1hdCA9
IGZvcm1hdAoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKICAgICAgICBpZiByZWNvcmQu
bGV2ZWxubyA9PSBzZWxmLmZvcm1hdC5OT1RFIGFuZCAocmVjb3JkLm1zZy5zdGFydHN3aXRoKCJS
dW5uaW5nIikgb3IgcmVjb3JkLm1zZy5zdGFydHN3aXRoKCJyZWNpcGUgIikpOgogICAgICAgICAg
ICByZXR1cm4gRmFsc2UKICAgICAgICBzZWxmLnRmLmNsZWFyRm9vdGVyKCkKICAgICAgICByZXR1
cm4gVHJ1ZQoKY2xhc3MgVGVybWluYWxGaWx0ZXIob2JqZWN0KToKICAgIHJvd3MgPSAyNQogICAg
Y29sdW1ucyA9IDgwCgogICAgZGVmIHNpZ3dpbmNoX2hhbmRsZShzZWxmLCBzaWdudW0sIGZyYW1l
KToKICAgICAgICBzZWxmLnJvd3MsIHNlbGYuY29sdW1ucyA9IHNlbGYuZ2V0VGVybWluYWxDb2x1
bW5zKCkKICAgICAgICBpZiBzZWxmLl9zaWd3aW5jaF9kZWZhdWx0OgogICAgICAgICAgICBzZWxm
Ll9zaWd3aW5jaF9kZWZhdWx0KHNpZ251bSwgZnJhbWUpCgogICAgZGVmIGdldFRlcm1pbmFsQ29s
dW1ucyhzZWxmKToKICAgICAgICBkZWYgaW9jdGxfR1dJTlNaKGZkKToKICAgICAgICAgICAgdHJ5
OgogICAgICAgICAgICAgICAgY3IgPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGZjbnRsLmlvY3RsKGZk
LCBzZWxmLnRlcm1pb3MuVElPQ0dXSU5TWiwgJzEyMzQnKSkKICAgICAgICAgICAgZXhjZXB0Ogog
ICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuIGNyCiAgICAgICAg
Y3IgPSBpb2N0bF9HV0lOU1ooc3lzLnN0ZG91dC5maWxlbm8oKSkKICAgICAgICBpZiBub3QgY3I6
CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZkID0gb3Mub3Blbihvcy5jdGVybWlk
KCksIG9zLk9fUkRPTkxZKQogICAgICAgICAgICAgICAgY3IgPSBpb2N0bF9HV0lOU1ooZmQpCiAg
ICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAg
ICAgICAgcGFzcwogICAgICAgIGlmIG5vdCBjcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAg
ICAgICAgY3IgPSAoZW52WydMSU5FUyddLCBlbnZbJ0NPTFVNTlMnXSkKICAgICAgICAgICAgZXhj
ZXB0OgogICAgICAgICAgICAgICAgY3IgPSAoMjUsIDgwKQogICAgICAgIHJldHVybiBjcgoKICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBtYWluLCBoZWxwZXIsIGNvbnNvbGUsIGVycmNvbnNvbGUsIGZv
cm1hdCwgcXVpZXQpOgogICAgICAgIHNlbGYubWFpbiA9IG1haW4KICAgICAgICBzZWxmLmhlbHBl
ciA9IGhlbHBlcgogICAgICAgIHNlbGYuY3V1ID0gTm9uZQogICAgICAgIHNlbGYuc3RkaW5iYWNr
dXAgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcmFjdGl2ZSA9IHN5cy5zdGRvdXQuaXNhdHR5KCkK
ICAgICAgICBzZWxmLmZvb3Rlcl9wcmVzZW50ID0gRmFsc2UKICAgICAgICBzZWxmLmxhc3RwaWRz
ID0gW10KICAgICAgICBzZWxmLmxhc3R0aW1lID0gTm9uZQogICAgICAgIHNlbGYucXVpZXQgPSBx
dWlldAoKICAgICAgICBpZiBub3Qgc2VsZi5pbnRlcmFjdGl2ZToKICAgICAgICAgICAgcmV0dXJu
CgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGN1cnNlcwogICAgICAgIGV4Y2VwdCBJ
bXBvcnRFcnJvcjoKICAgICAgICAgICAgc3lzLmV4aXQoIkZBVEFMOiBUaGUga25vdHR5IHVpIGNv
dWxkIG5vdCBsb2FkIHRoZSByZXF1aXJlZCBjdXJzZXMgcHl0aG9uIG1vZHVsZS4iKQoKICAgICAg
ICBpbXBvcnQgdGVybWlvcwogICAgICAgIHNlbGYuY3Vyc2VzID0gY3Vyc2VzCiAgICAgICAgc2Vs
Zi50ZXJtaW9zID0gdGVybWlvcwogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBzeXMuc3Rk
aW4uZmlsZW5vKCkKICAgICAgICAgICAgc2VsZi5zdGRpbmJhY2t1cCA9IHRlcm1pb3MudGNnZXRh
dHRyKGZkKQogICAgICAgICAgICBuZXcgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc3RkaW5iYWNrdXAp
CiAgICAgICAgICAgIG5ld1szXSA9IG5ld1szXSAmIH50ZXJtaW9zLkVDSE8KICAgICAgICAgICAg
dGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBuZXcpCiAgICAgICAgICAg
IGN1cnNlcy5zZXR1cHRlcm0oKQogICAgICAgICAgICBpZiBjdXJzZXMudGlnZXRudW0oImNvbG9y
cyIpID4gMjoKICAgICAgICAgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQogICAgICAgICAg
ICBzZWxmLmVkID0gY3Vyc2VzLnRpZ2V0c3RyKCJlZCIpCiAgICAgICAgICAgIGlmIHNlbGYuZWQ6
CiAgICAgICAgICAgICAgICBzZWxmLmN1dSA9IGN1cnNlcy50aWdldHN0cigiY3V1IikKICAgICAg
ICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fc2lnd2luY2hfZGVmYXVsdCA9IHNpZ25h
bC5nZXRzaWduYWwoc2lnbmFsLlNJR1dJTkNIKQogICAgICAgICAgICAgICAgc2lnbmFsLnNpZ25h
bChzaWduYWwuU0lHV0lOQ0gsIHNlbGYuc2lnd2luY2hfaGFuZGxlKQogICAgICAgICAgICBleGNl
cHQ6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYucm93cywgc2VsZi5jb2x1
bW5zID0gc2VsZi5nZXRUZXJtaW5hbENvbHVtbnMoKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAg
ICAgc2VsZi5jdXUgPSBOb25lCiAgICAgICAgaWYgbm90IHNlbGYuY3V1OgogICAgICAgICAgICBz
ZWxmLmludGVyYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgYmIubm90ZSgiVW5hYmxlIHRvIHVz
ZSBpbnRlcmFjdGl2ZSBtb2RlIGZvciB0aGlzIHRlcm1pbmFsLCB1c2luZyBmYWxsYmFjayIpCiAg
ICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGNvbnNvbGU6CiAgICAgICAgICAgIGNvbnNvbGUu
YWRkRmlsdGVyKEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQpKQogICAgICAg
IGlmIGVycmNvbnNvbGU6CiAgICAgICAgICAgIGVycmNvbnNvbGUuYWRkRmlsdGVyKEludGVyYWN0
Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQpKQoKICAgICAgICBzZWxmLm1haW5fcHJvZ3Jl
c3MgPSBOb25lCgogICAgZGVmIGNsZWFyRm9vdGVyKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZm9v
dGVyX3ByZXNlbnQ6CiAgICAgICAgICAgIGxpbmVzID0gc2VsZi5mb290ZXJfcHJlc2VudAogICAg
ICAgICAgICBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZShzZWxmLmN1cnNlcy50cGFybShzZWxmLmN1
dSwgbGluZXMpKQogICAgICAgICAgICBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZShzZWxmLmN1cnNl
cy50cGFybShzZWxmLmVkKSkKICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAgICAgICAg
c2VsZi5mb290ZXJfcHJlc2VudCA9IEZhbHNlCgogICAgZGVmIHVwZGF0ZUZvb3RlcihzZWxmKToK
ICAgICAgICBpZiBub3Qgc2VsZi5jdXU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFjdGl2
ZXRhc2tzID0gc2VsZi5oZWxwZXIucnVubmluZ190YXNrcwogICAgICAgIGZhaWxlZHRhc2tzID0g
c2VsZi5oZWxwZXIuZmFpbGVkX3Rhc2tzCiAgICAgICAgcnVubmluZ3BpZHMgPSBzZWxmLmhlbHBl
ci5ydW5uaW5nX3BpZHMKICAgICAgICBjdXJyZW50dGltZSA9IHRpbWUudGltZSgpCiAgICAgICAg
aWYgbm90IHNlbGYubGFzdHRpbWUgb3IgKGN1cnJlbnR0aW1lIC0gc2VsZi5sYXN0dGltZSA+IDUp
OgogICAgICAgICAgICBzZWxmLmhlbHBlci5uZWVkVXBkYXRlID0gVHJ1ZQogICAgICAgICAgICBz
ZWxmLmxhc3R0aW1lID0gY3VycmVudHRpbWUKICAgICAgICBpZiBzZWxmLmZvb3Rlcl9wcmVzZW50
IGFuZCBub3Qgc2VsZi5oZWxwZXIubmVlZFVwZGF0ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAg
ICAgc2VsZi5oZWxwZXIubmVlZFVwZGF0ZSA9IEZhbHNlCiAgICAgICAgaWYgc2VsZi5mb290ZXJf
cHJlc2VudDoKICAgICAgICAgICAgc2VsZi5jbGVhckZvb3RlcigpCiAgICAgICAgaWYgKG5vdCBz
ZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsIG9yIHNlbGYuaGVscGVyLnRhc2tudW1iZXJfY3Vy
cmVudCA9PSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsKSBhbmQgbm90IGxlbihhY3RpdmV0
YXNrcyk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRhc2tzID0gW10KICAgICAgICBmb3Ig
dCBpbiBydW5uaW5ncGlkczoKICAgICAgICAgICAgcHJvZ3Jlc3MgPSBhY3RpdmV0YXNrc1t0XS5n
ZXQoInByb2dyZXNzIiwgTm9uZSkKICAgICAgICAgICAgaWYgcHJvZ3Jlc3MgaXMgbm90IE5vbmU6
CiAgICAgICAgICAgICAgICBwYmFyID0gYWN0aXZldGFza3NbdF0uZ2V0KCJwcm9ncmVzc2JhciIs
IE5vbmUpCiAgICAgICAgICAgICAgICByYXRlID0gYWN0aXZldGFza3NbdF0uZ2V0KCJyYXRlIiwg
Tm9uZSkKICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSBhY3RpdmV0YXNrc1t0XS5nZXQoInN0
YXJ0dGltZSIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBub3QgcGJhciBvciBwYmFyLmJvdW5j
aW5nICE9IChwcm9ncmVzcyA8IDApOgogICAgICAgICAgICAgICAgICAgIGlmIHByb2dyZXNzIDwg
MDoKICAgICAgICAgICAgICAgICAgICAgICAgcGJhciA9IEJCUHJvZ3Jlc3MoIjA6ICVzIChwaWQg
JXMpICIgJSAoYWN0aXZldGFza3NbdF1bInRpdGxlIl0sIHQpLCAxMDAsIHdpZGdldHM9W3Byb2dy
ZXNzYmFyLkJvdW5jaW5nU2xpZGVyKCksICcnXSwgZXh0cmFwb3M9MiwgcmVzaXplX2hhbmRsZXI9
c2VsZi5zaWd3aW5jaF9oYW5kbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHBiYXIuYm91bmNp
bmcgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAg
ICAgcGJhciA9IEJCUHJvZ3Jlc3MoIjA6ICVzIChwaWQgJXMpICIgJSAoYWN0aXZldGFza3NbdF1b
InRpdGxlIl0sIHQpLCAxMDAsIHdpZGdldHM9W3Byb2dyZXNzYmFyLlBlcmNlbnRhZ2UoKSwgJyAn
LCBwcm9ncmVzc2Jhci5CYXIoKSwgJyddLCBleHRyYXBvcz00LCByZXNpemVfaGFuZGxlcj1zZWxm
LnNpZ3dpbmNoX2hhbmRsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcGJhci5ib3VuY2luZyA9
IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgYWN0aXZldGFza3NbdF1bInByb2dyZXNzYmFyIl0g
PSBwYmFyCiAgICAgICAgICAgICAgICB0YXNrcy5hcHBlbmQoKHBiYXIsIHByb2dyZXNzLCByYXRl
LCBzdGFydF90aW1lKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXJ0X3Rp
bWUgPSBhY3RpdmV0YXNrc1t0XS5nZXQoInN0YXJ0dGltZSIsIE5vbmUpCiAgICAgICAgICAgICAg
ICBpZiBzdGFydF90aW1lOgogICAgICAgICAgICAgICAgICAgIHRhc2tzLmFwcGVuZCgiJXMgLSAl
ZHMgKHBpZCAlcykiICUgKGFjdGl2ZXRhc2tzW3RdWyJ0aXRsZSJdLCBjdXJyZW50dGltZSAtIHN0
YXJ0X3RpbWUsIHQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0
YXNrcy5hcHBlbmQoIiVzIChwaWQgJXMpIiAlIChhY3RpdmV0YXNrc1t0XVsidGl0bGUiXSwgdCkp
CgogICAgICAgIGlmIHNlbGYubWFpbi5zaHV0ZG93bjoKICAgICAgICAgICAgY29udGVudCA9ICJX
YWl0aW5nIGZvciAlcyBydW5uaW5nIHRhc2tzIHRvIGZpbmlzaDoiICUgbGVuKGFjdGl2ZXRhc2tz
KQoKICAgICAgICAgICAgcHJpbnQoY29udGVudCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBp
ZiBzZWxmLnF1aWV0OgogICAgICAgICAgICAgICAgY29udGVudCA9ICJSdW5uaW5nIHRhc2tzICgl
cyBvZiAlcykiICUgKHNlbGYuaGVscGVyLnRhc2tudW1iZXJfY3VycmVudCwgc2VsZi5oZWxwZXIu
dGFza251bWJlcl90b3RhbCkKICAgICAgICAgICAgZWxpZiBub3QgbGVuKGFjdGl2ZXRhc2tzKToK
ICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAiTm8gY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgKCVz
IG9mICVzKSIgJSAoc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50LCBzZWxmLmhlbHBlci50
YXNrbnVtYmVyX3RvdGFsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29udGVu
dCA9ICJDdXJyZW50bHkgJTJzIHJ1bm5pbmcgdGFza3MgKCVzIG9mICVzKSIgJSAobGVuKGFjdGl2
ZXRhc2tzKSwgc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50LCBzZWxmLmhlbHBlci50YXNr
bnVtYmVyX3RvdGFsKQogICAgICAgICAgICBtYXh0YXNrID0gc2VsZi5oZWxwZXIudGFza251bWJl
cl90b3RhbAogICAgICAgICAgICBpZiBub3Qgc2VsZi5tYWluX3Byb2dyZXNzIG9yIHNlbGYubWFp
bl9wcm9ncmVzcy5tYXh2YWwgIT0gbWF4dGFzazoKICAgICAgICAgICAgICAgIHdpZGdldHMgPSBb
JyAnLCBwcm9ncmVzc2Jhci5QZXJjZW50YWdlKCksICcgJywgcHJvZ3Jlc3NiYXIuQmFyKCldCiAg
ICAgICAgICAgICAgICBzZWxmLm1haW5fcHJvZ3Jlc3MgPSBCQlByb2dyZXNzKCJSdW5uaW5nIHRh
c2tzIiwgbWF4dGFzaywgd2lkZ2V0cz13aWRnZXRzLCByZXNpemVfaGFuZGxlcj1zZWxmLnNpZ3dp
bmNoX2hhbmRsZSkKICAgICAgICAgICAgICAgIHNlbGYubWFpbl9wcm9ncmVzcy5zdGFydChGYWxz
ZSkKICAgICAgICAgICAgc2VsZi5tYWluX3Byb2dyZXNzLnNldG1lc3NhZ2UoY29udGVudCkKICAg
ICAgICAgICAgcHJvZ3Jlc3MgPSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQgLSAxCiAg
ICAgICAgICAgIGlmIHByb2dyZXNzIDwgMDoKICAgICAgICAgICAgICAgIHByb2dyZXNzID0gMAog
ICAgICAgICAgICBjb250ZW50ID0gc2VsZi5tYWluX3Byb2dyZXNzLnVwZGF0ZShwcm9ncmVzcykK
ICAgICAgICAgICAgcHJpbnQoJycpCiAgICAgICAgbGluZXMgPSAxICsgaW50KGxlbihjb250ZW50
KSAvIChzZWxmLmNvbHVtbnMgKyAxKSkKICAgICAgICBpZiBzZWxmLnF1aWV0ID09IDA6CiAgICAg
ICAgICAgIGZvciB0YXNrbnVtLCB0YXNrIGluIGVudW1lcmF0ZSh0YXNrc1s6KHNlbGYucm93cyAt
IDIpXSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhc2ssIHR1cGxlKToKICAgICAg
ICAgICAgICAgICAgICBwYmFyLCBwcm9ncmVzcywgcmF0ZSwgc3RhcnRfdGltZSA9IHRhc2sKICAg
ICAgICAgICAgICAgICAgICBpZiBub3QgcGJhci5zdGFydF90aW1lOgogICAgICAgICAgICAgICAg
ICAgICAgICBwYmFyLnN0YXJ0KEZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzdGFy
dF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJhci5zdGFydF90aW1lID0gc3Rh
cnRfdGltZQogICAgICAgICAgICAgICAgICAgIHBiYXIuc2V0bWVzc2FnZSgnJXM6JXMnICUgKHRh
c2tudW0sIHBiYXIubXNnLnNwbGl0KCc6JywgMSlbMV0pKQogICAgICAgICAgICAgICAgICAgIGlm
IHByb2dyZXNzID4gLTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHBiYXIuc2V0ZXh0cmEocmF0
ZSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHBiYXIudXBkYXRlKHByb2dyZXNz
KQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRl
bnQgPSBwYmFyLnVwZGF0ZSgxKQogICAgICAgICAgICAgICAgICAgIHByaW50KCcnKQogICAgICAg
ICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gIiVzOiAlcyIgJSAo
dGFza251bSwgdGFzaykKICAgICAgICAgICAgICAgICAgICBwcmludChjb250ZW50KQogICAgICAg
ICAgICAgICAgbGluZXMgPSBsaW5lcyArIDEgKyBpbnQobGVuKGNvbnRlbnQpIC8gKHNlbGYuY29s
dW1ucyArIDEpKQogICAgICAgIHNlbGYuZm9vdGVyX3ByZXNlbnQgPSBsaW5lcwogICAgICAgIHNl
bGYubGFzdHBpZHMgPSBydW5uaW5ncGlkc1s6XQogICAgICAgIHNlbGYubGFzdGNvdW50ID0gc2Vs
Zi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50CgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAg
ICBpZiBzZWxmLnN0ZGluYmFja3VwOgogICAgICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8o
KQogICAgICAgICAgICBzZWxmLnRlcm1pb3MudGNzZXRhdHRyKGZkLCBzZWxmLnRlcm1pb3MuVENT
QURSQUlOLCBzZWxmLnN0ZGluYmFja3VwKQoKZGVmIHByaW50X2V2ZW50X2xvZyhldmVudCwgaW5j
bHVkZWxvZ3MsIGxvZ2xpbmVzLCB0ZXJtZmlsdGVyKToKICAgICMgRklYTUUgcmVmYWN0b3IgdGhp
cyBvdXQgZnVydGhlcgogICAgbG9nZmlsZSA9IGV2ZW50LmxvZ2ZpbGUKICAgIGlmIGxvZ2ZpbGUg
YW5kIG9zLnBhdGguZXhpc3RzKGxvZ2ZpbGUpOgogICAgICAgIHRlcm1maWx0ZXIuY2xlYXJGb290
ZXIoKQogICAgICAgIGJiLmVycm9yKCJMb2dmaWxlIG9mIGZhaWx1cmUgc3RvcmVkIGluOiAlcyIg
JSBsb2dmaWxlKQogICAgICAgIGlmIGluY2x1ZGVsb2dzIGFuZCBub3QgZXZlbnQuZXJycHJpbnRl
ZDoKICAgICAgICAgICAgcHJpbnQoIkxvZyBkYXRhIGZvbGxvd3M6IikKICAgICAgICAgICAgZiA9
IG9wZW4obG9nZmlsZSwgInIiKQogICAgICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgICAgIHdo
aWxlIFRydWU6CiAgICAgICAgICAgICAgICBsID0gZi5yZWFkbGluZSgpCiAgICAgICAgICAgICAg
ICBpZiBsID09ICcnOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBs
ID0gbC5yc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbG9nbGluZXM6CiAgICAgICAgICAgICAg
ICAgICAgbGluZXMuYXBwZW5kKCcgfCAlcycgJSBsKQogICAgICAgICAgICAgICAgICAgIGlmIGxl
bihsaW5lcykgPiBpbnQobG9nbGluZXMpOgogICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5w
b3AoMCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ3wg
JXMnICUgbCkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIGlmIGxpbmVzOgogICAg
ICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQo
bGluZSkKCmRlZiBfbG9nX3NldHRpbmdzX2Zyb21fc2VydmVyKHNlcnZlciwgb2JzZXJ2ZV9vbmx5
KToKICAgICMgR2V0IHZhbHVlcyBvZiB2YXJpYWJsZXMgd2hpY2ggY29udHJvbCBvdXIgb3V0cHV0
CiAgICBpbmNsdWRlbG9ncywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxl
IiwgIkJCSU5DTFVERUxPR1MiXSkKICAgIGlmIGVycm9yOgogICAgICAgIGxvZ2dlci5lcnJvcigi
VW5hYmxlIHRvIGdldCB0aGUgdmFsdWUgb2YgQkJJTkNMVURFTE9HUyB2YXJpYWJsZTogJXMiICUg
ZXJyb3IpCiAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKICAgIGxvZ2xpbmVzLCBl
cnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HU19M
SU5FUyJdKQogICAgaWYgZXJyb3I6CiAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0
IHRoZSB2YWx1ZSBvZiBCQklOQ0xVREVMT0dTX0xJTkVTIHZhcmlhYmxlOiAlcyIgJSBlcnJvcikK
ICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQogICAgaWYgb2JzZXJ2ZV9vbmx5Ogog
ICAgICAgIGNtZCA9ICdnZXRWYXJpYWJsZScKICAgIGVsc2U6CiAgICAgICAgY21kID0gJ2dldFNl
dFZhcmlhYmxlJwogICAgY29uc29sZWxvZ2ZpbGUsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQo
W2NtZCwgIkJCX0NPTlNPTEVMT0ciXSkKICAgIGlmIGVycm9yOgogICAgICAgIGxvZ2dlci5lcnJv
cigiVW5hYmxlIHRvIGdldCB0aGUgdmFsdWUgb2YgQkJfQ09OU09MRUxPRyB2YXJpYWJsZTogJXMi
ICUgZXJyb3IpCiAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKICAgIHJldHVybiBp
bmNsdWRlbG9ncywgbG9nbGluZXMsIGNvbnNvbGVsb2dmaWxlCgpfZXZ0X2xpc3QgPSBbCiAgICAi
YmIuYnVpbGQuVGFza0Jhc2UiLAogICAgImJiLmJ1aWxkLlRhc2tGYWlsZWQiLAogICAgImJiLmJ1
aWxkLlRhc2tGYWlsZWRTaWxlbnQiLAogICAgImJiLmJ1aWxkLlRhc2tTdGFydGVkIiwKICAgICJi
Yi5idWlsZC5UYXNrU3VjY2VlZGVkIiwKICAgICJiYi5jb21tYW5kLkNvbW1hbmRDb21wbGV0ZWQi
LAogICAgImJiLmNvbW1hbmQuQ29tbWFuZEV4aXQiLAogICAgImJiLmNvbW1hbmQuQ29tbWFuZEZh
aWxlZCIsCiAgICAiYmIuY29va2VyLkNvb2tlckV4aXQiLAogICAgImJiLmV2ZW50LkJ1aWxkSW5p
dCIsCiAgICAiYmIuZXZlbnQuQnVpbGRDb21wbGV0ZWQiLAogICAgImJiLmV2ZW50LkJ1aWxkU3Rh
cnRlZCIsCiAgICAiYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkIiwKICAgICJiYi5ldmVudC5D
YWNoZUxvYWRQcm9ncmVzcyIsCiAgICAiYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCIsCiAgICAi
YmIuZXZlbnQuQ29uZmlnUGFyc2VkIiwKICAgICJiYi5ldmVudC5EZXBUcmVlR2VuZXJhdGVkIiwK
ICAgICJiYi5ldmVudC5Mb2dFeGVjVFRZIiwKICAgICJiYi5ldmVudC5NZXRhZGF0YUV2ZW50IiwK
ICAgICJiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVycyIsCiAgICAiYmIuZXZlbnQuTm9Qcm92aWRl
ciIsCiAgICAiYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQiLAogICAgImJiLmV2ZW50LlBhcnNlUHJv
Z3Jlc3MiLAogICAgImJiLmV2ZW50LlBhcnNlU3RhcnRlZCIsCiAgICAiYmIuZXZlbnQuUmVjaXBl
UGFyc2VkIiwKICAgICJiYi5ldmVudC5TYW5pdHlDaGVjayIsCiAgICAiYmIuZXZlbnQuU2FuaXR5
Q2hlY2tQYXNzZWQiLAogICAgImJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25Db21wbGV0ZWQi
LAogICAgImJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25TdGFydGVkIiwKICAgICJiYi5ydW5x
dWV1ZS5ydW5RdWV1ZVRhc2tDb21wbGV0ZWQiLAogICAgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFz
a0ZhaWxlZCIsCiAgICAiYmIucnVucXVldWUucnVuUXVldWVUYXNrU2tpcHBlZCIsCiAgICAiYmIu
cnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCIsCiAgICAiYmIucnVucXVldWUuc2NlbmVRdWV1
ZVRhc2tDb21wbGV0ZWQiLAogICAgImJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkIiwK
ICAgICJiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiLAogICAgImxvZ2dpbmcuTG9n
UmVjb3JkIl0KCmRlZiBtYWluKHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMsIHRmID0gVGVy
bWluYWxGaWx0ZXIpOgoKICAgICMgSW5pdCBzZXJ2ZXIgaGlzdG9ncmFtCiAgICBoaXN0b2dyYW1f
aW5pdCgpCgogICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHk6CiAgICAgICAgcGFyYW1zLnVw
ZGF0ZVRvU2VydmVyKHNlcnZlciwgb3MuZW52aXJvbi5jb3B5KCkpCgogICAgaW5jbHVkZWxvZ3Ms
IGxvZ2xpbmVzLCBjb25zb2xlbG9nZmlsZSA9IF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIoc2Vy
dmVyLCBwYXJhbXMub2JzZXJ2ZV9vbmx5KQoKICAgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKSBhbmQg
c3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICBsb2dfZXhlY190dHkgPSBUcnVlCiAgICBlbHNl
OgogICAgICAgIGxvZ19leGVjX3R0eSA9IEZhbHNlCgogICAgaGVscGVyID0gdWloZWxwZXIuQkJV
SUhlbHBlcigpCgogICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0
KQogICAgZXJyY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3RkZXJyKQogICAg
Zm9ybWF0X3N0ciA9ICIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKICAgIGZvcm1hdCA9IGJi
Lm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQogICAgaWYgcGFyYW1zLm9wdGlvbnMucXVp
ZXQgPT0gMDoKICAgICAgICBmb3JjZWxldmVsID0gTm9uZQogICAgZWxpZiBwYXJhbXMub3B0aW9u
cy5xdWlldCA+IDI6CiAgICAgICAgZm9yY2VsZXZlbCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlci5F
UlJPUgogICAgZWxzZToKICAgICAgICBmb3JjZWxldmVsID0gYmIubXNnLkJCTG9nRm9ybWF0dGVy
LldBUk5JTkcKICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGUsIGJiLm1zZy5C
QkxvZ0ZpbHRlclN0ZE91dCwgZm9yY2VsZXZlbCkKICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmls
dGVyKGVycmNvbnNvbGUsIGJiLm1zZy5CQkxvZ0ZpbHRlclN0ZEVycikKICAgIGNvbnNvbGUuc2V0
Rm9ybWF0dGVyKGZvcm1hdCkKICAgIGVycmNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKICAg
IGlmIG5vdCBiYi5tc2cuaGFzX2NvbnNvbGVfaGFuZGxlcihsb2dnZXIpOgogICAgICAgIGxvZ2dl
ci5hZGRIYW5kbGVyKGNvbnNvbGUpCiAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoZXJyY29uc29s
ZSkKCiAgICBiYi51dGlscy5zZXRfcHJvY2Vzc19uYW1lKCJLbm90dHlVSSIpCgogICAgaWYgcGFy
YW1zLm9wdGlvbnMucmVtb3RlX3NlcnZlciBhbmQgcGFyYW1zLm9wdGlvbnMua2lsbF9zZXJ2ZXI6
CiAgICAgICAgc2VydmVyLnRlcm1pbmF0ZVNlcnZlcigpCiAgICAgICAgcmV0dXJuCgogICAgY29u
c29sZWxvZyA9IE5vbmUKICAgIGlmIGNvbnNvbGVsb2dmaWxlIGFuZCBub3QgcGFyYW1zLm9wdGlv
bnMuc2hvd19lbnZpcm9ubWVudCBhbmQgbm90IHBhcmFtcy5vcHRpb25zLnNob3dfdmVyc2lvbnM6
CiAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShjb25zb2xlbG9nZmls
ZSkpCiAgICAgICAgY29ubG9nZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKGZvcm1hdF9z
dHIpCiAgICAgICAgY29uc29sZWxvZyA9IGxvZ2dpbmcuRmlsZUhhbmRsZXIoY29uc29sZWxvZ2Zp
bGUpCiAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZWxvZykKICAgICAg
ICBjb25zb2xlbG9nLnNldEZvcm1hdHRlcihjb25sb2dmb3JtYXQpCiAgICAgICAgbG9nZ2VyLmFk
ZEhhbmRsZXIoY29uc29sZWxvZykKICAgICAgICBsb2dsaW5rID0gb3MucGF0aC5qb2luKG9zLnBh
dGguZGlybmFtZShjb25zb2xlbG9nZmlsZSksICdjb25zb2xlLWxhdGVzdC5sb2cnKQogICAgICAg
IGJiLnV0aWxzLnJlbW92ZShsb2dsaW5rKQogICAgICAgIHRyeToKICAgICAgICAgICBvcy5zeW1s
aW5rKG9zLnBhdGguYmFzZW5hbWUoY29uc29sZWxvZ2ZpbGUpLCBsb2dsaW5rKQogICAgICAgIGV4
Y2VwdCBPU0Vycm9yOgogICAgICAgICAgIHBhc3MKCiAgICBsbGV2ZWwsIGRlYnVnX2RvbWFpbnMg
PSBiYi5tc2cuY29uc3RydWN0TG9nT3B0aW9ucygpCiAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNl
dEV2ZW50TWFzayIsIHNlcnZlci5nZXRFdmVudEhhbmRsZSgpLCBsbGV2ZWwsIGRlYnVnX2RvbWFp
bnMsIF9ldnRfbGlzdF0pCgogICAgdW5pdmVyc2UgPSBGYWxzZQogICAgaWYgbm90IHBhcmFtcy5v
YnNlcnZlX29ubHk6CiAgICAgICAgcGFyYW1zLnVwZGF0ZUZyb21TZXJ2ZXIoc2VydmVyKQogICAg
ICAgIGNtZGxpbmUgPSBwYXJhbXMucGFyc2VBY3Rpb25zKCkKICAgICAgICBpZiBub3QgY21kbGlu
ZToKICAgICAgICAgICAgcHJpbnQoIk5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29ybGQn
IHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2FnZSBp
bmZvcm1hdGlvbi4iKQogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGlmICdtc2cnIGluIGNt
ZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoY21kbGlu
ZVsnbXNnJ10pCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgaWYgY21kbGluZVsnYWN0aW9u
J11bMF0gPT0gImJ1aWxkVGFyZ2V0cyIgYW5kICJ1bml2ZXJzZSIgaW4gY21kbGluZVsnYWN0aW9u
J11bMV06CiAgICAgICAgICAgIHVuaXZlcnNlID0gVHJ1ZQoKICAgICAgICByZXQsIGVycm9yID0g
c2VydmVyLnJ1bkNvbW1hbmQoY21kbGluZVsnYWN0aW9uJ10pCiAgICAgICAgaWYgZXJyb3I6CiAg
ICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ29tbWFuZCAnJXMnIGZhaWxlZDogJXMiICUgKGNtZGxp
bmUsIGVycm9yKSkKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBlbGlmIHJldCAhPSBUcnVl
OgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvbW1hbmQgJyVzJyBmYWlsZWQ6IHJldHVybmVk
ICVzIiAlIChjbWRsaW5lLCByZXQpKQogICAgICAgICAgICByZXR1cm4gMQoKCiAgICBwYXJzZXBy
b2dyZXNzID0gTm9uZQogICAgY2FjaGVwcm9ncmVzcyA9IE5vbmUKICAgIG1haW4uc2h1dGRvd24g
PSAwCiAgICBpbnRlcnJ1cHRlZCA9IEZhbHNlCiAgICByZXR1cm5fdmFsdWUgPSAwCiAgICBlcnJv
cnMgPSAwCiAgICB3YXJuaW5ncyA9IDAKICAgIHRhc2tmYWlsdXJlcyA9IFtdCgogICAgdGVybWZp
bHRlciA9IHRmKG1haW4sIGhlbHBlciwgY29uc29sZSwgZXJyY29uc29sZSwgZm9ybWF0LCBwYXJh
bXMub3B0aW9ucy5xdWlldCkKICAgIGF0ZXhpdC5yZWdpc3Rlcih0ZXJtZmlsdGVyLmZpbmlzaCkK
CiAgICB3aGlsZSBUcnVlOgogICAgICAgIHRyeToKICAgICAgICAgICAgZXZlbnQgPSBldmVudEhh
bmRsZXIud2FpdEV2ZW50KDApCiAgICAgICAgICAgIGlmIGV2ZW50IGlzIE5vbmU6CiAgICAgICAg
ICAgICAgICBpZiBtYWluLnNodXRkb3duID4gMToKICAgICAgICAgICAgICAgICAgICBicmVhawog
ICAgICAgICAgICAgICAgdGVybWZpbHRlci51cGRhdGVGb290ZXIoKQogICAgICAgICAgICAgICAg
ZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDAuMjUpCiAgICAgICAgICAgICAgICBpZiBl
dmVudCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGhl
bHBlci5ldmVudEhhbmRsZXIoZXZlbnQpCgogICAgICAgICAgICAjIEFkZCB0byBzZXJ2ZXIgaGlz
dG9ncmFtCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5IZWFy
dGJlYXRFdmVudCk6CiAgICAgICAgICAgICAgICBoaXN0b2dyYW1fYWRkKHNlcnZlcixldmVudCkK
CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhp
dFdhaXQpOgogICAgICAgICAgICAgICAgaWYgbm90IG1haW4uc2h1dGRvd246CiAgICAgICAgICAg
ICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDEKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAg
ICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkxvZ0V4ZWNUVFkpOgogICAgICAg
ICAgICAgICAgaWYgbG9nX2V4ZWNfdHR5OgogICAgICAgICAgICAgICAgICAgIHRyaWVzID0gZXZl
bnQucmV0cmllcwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHRyaWVzOgogICAgICAgICAgICAg
ICAgICAgICAgICBwcmludCgiVHJ5aW5nIHRvIHJ1bjogJXMiICUgZXZlbnQucHJvZykKICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgb3Muc3lzdGVtKGV2ZW50LnByb2cpID09IDA6CiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNs
ZWVwKGV2ZW50LnNsZWVwX2RlbGF5KQogICAgICAgICAgICAgICAgICAgICAgICB0cmllcyAtPSAx
CiAgICAgICAgICAgICAgICAgICAgaWYgdHJpZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhldmVudC5tc2cpCiAgICAgICAg
ICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2lu
Zy5Mb2dSZWNvcmQpOgogICAgICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+PSBmb3JtYXQu
RVJST1I6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQogICAgICAgICAg
ICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQubGV2
ZWxubyA9PSBmb3JtYXQuV0FSTklORzoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IHdh
cm5pbmdzICsgMQoKICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRhc2twaWQgIT0gMDoKICAgICAg
ICAgICAgICAgICAgICAjIEZvciAibm9ybWFsIiBsb2dnaW5nIGNvbmRpdGlvbnMsIGRvbid0IHNo
b3cgbm90ZSBsb2dzIGZyb20gdGFza3MKICAgICAgICAgICAgICAgICAgICAjIGJ1dCBkbyBzaG93
IHRoZW0gaWYgdGhlIHVzZXIgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgbG9nIGxldmVsIHRvCiAg
ICAgICAgICAgICAgICAgICAgIyBpbmNsdWRlIHZlcmJvc2UvZGVidWcgbWVzc2FnZXMKICAgICAg
ICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vIDw9IGZvcm1hdC5OT1RFIGFuZCAoZXZlbnQu
bGV2ZWxubyA8IGxsZXZlbCBvciAoZXZlbnQubGV2ZWxubyA9PSBmb3JtYXQuTk9URSBhbmQgbGxl
dmVsICE9IGZvcm1hdC5WRVJCT1NFKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
CgogICAgICAgICAgICAgICAgICAgICMgUHJlZml4IHRhc2sgbWVzc2FnZXMgd2l0aCByZWNpcGUv
dGFzawogICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRhc2twaWQgaW4gaGVscGVyLnJ1bm5p
bmdfdGFza3MgYW5kIGV2ZW50LmxldmVsbm8gIT0gZm9ybWF0LlBMQUlOOgogICAgICAgICAgICAg
ICAgICAgICAgICB0YXNraW5mbyA9IGhlbHBlci5ydW5uaW5nX3Rhc2tzW2V2ZW50LnRhc2twaWRd
CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1zZyA9IHRhc2tpbmZvWyd0aXRsZSddICsg
JzogJyArIGV2ZW50Lm1zZwogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihldmVudCwgJ2ZuJyk6
CiAgICAgICAgICAgICAgICAgICAgZXZlbnQubXNnID0gZXZlbnQuZm4gKyAnOiAnICsgZXZlbnQu
bXNnCiAgICAgICAgICAgICAgICBsb2dnZXIuaGFuZGxlKGV2ZW50KQogICAgICAgICAgICAgICAg
Y29udGludWUKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tG
YWlsZWRTaWxlbnQpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkxvZ2ZpbGUgZm9y
IGZhaWxlZCBzZXRzY2VuZSB0YXNrIGlzICVzIiAlIGV2ZW50LmxvZ2ZpbGUpCiAgICAgICAgICAg
ICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5U
YXNrRmFpbGVkKToKICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAgICAgICAgICAg
ICAgIHByaW50X2V2ZW50X2xvZyhldmVudCwgaW5jbHVkZWxvZ3MsIGxvZ2xpbmVzLCB0ZXJtZmls
dGVyKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrQmFzZSk6
CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudC5fbWVzc2FnZSkKICAgICAgICAgICAg
ICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBh
cnNlU3RhcnRlZCk6CiAgICAgICAgICAgICAgICBpZiBwYXJhbXMub3B0aW9ucy5xdWlldCA+IDE6
CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRv
dGFsID09IDA6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHBh
cnNlcHJvZ3Jlc3MgPSBuZXdfcHJvZ3Jlc3MoIlBhcnNpbmcgcmVjaXBlcyIsIGV2ZW50LnRvdGFs
KS5zdGFydCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3Rh
bmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVByb2dyZXNzKToKICAgICAgICAgICAgICAgIGlmIHBh
cmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAg
ICAgICAgICAgICAgaWYgcGFyc2Vwcm9ncmVzczoKICAgICAgICAgICAgICAgICAgICBwYXJzZXBy
b2dyZXNzLnVwZGF0ZShldmVudC5jdXJyZW50KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAg
ICAgICAgICAgICAgICBiYi53YXJuKCJHb3QgUGFyc2VQcm9ncmVzcyBldmVudCBmb3IgcGFyc2lu
ZyB0aGF0IG5ldmVyIHN0YXJ0ZWQ/IikKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAg
ICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKICAgICAg
ICAgICAgICAgIGlmIHBhcmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbm90IHBhcnNlcHJvZ3Jlc3M6CiAgICAgICAg
ICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MuZmluaXNo
KCkKICAgICAgICAgICAgICAgIHBhc3JlcHJvZ3Jlc3MgPSBOb25lCiAgICAgICAgICAgICAgICBp
ZiBwYXJhbXMub3B0aW9ucy5xdWlldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHByaW50KCgi
UGFyc2luZyBvZiAlZCAuYmIgZmlsZXMgY29tcGxldGUgKCVkIGNhY2hlZCwgJWQgcGFyc2VkKS4g
JWQgdGFyZ2V0cywgJWQgc2tpcHBlZCwgJWQgbWFza2VkLCAlZCBlcnJvcnMuIgogICAgICAgICAg
ICAgICAgICAgICAgICAlICggZXZlbnQudG90YWwsIGV2ZW50LmNhY2hlZCwgZXZlbnQucGFyc2Vk
LCBldmVudC52aXJ0dWFscywgZXZlbnQuc2tpcHBlZCwgZXZlbnQubWFza2VkLCBldmVudC5lcnJv
cnMpKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBpc2luc3RhbmNl
KGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkKToKICAgICAgICAgICAgICAgIGlmIHBh
cmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAg
ICAgICAgICAgICAgY2FjaGVwcm9ncmVzcyA9IG5ld19wcm9ncmVzcygiTG9hZGluZyBjYWNoZSIs
IGV2ZW50LnRvdGFsKS5zdGFydCgpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg
ICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyk6CiAgICAg
ICAgICAgICAgICBpZiBwYXJhbXMub3B0aW9ucy5xdWlldCA+IDE6CiAgICAgICAgICAgICAgICAg
ICAgY29udGludWUKICAgICAgICAgICAgICAgIGNhY2hlcHJvZ3Jlc3MudXBkYXRlKGV2ZW50LmN1
cnJlbnQpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNl
KGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRDb21wbGV0ZWQpOgogICAgICAgICAgICAgICAgaWYg
cGFyYW1zLm9wdGlvbnMucXVpZXQgPiAxOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAg
ICAgICAgICAgICAgICBjYWNoZXByb2dyZXNzLmZpbmlzaCgpCiAgICAgICAgICAgICAgICBpZiBw
YXJhbXMub3B0aW9ucy5xdWlldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHByaW50KCJMb2Fk
ZWQgJWQgZW50cmllcyBmcm9tIGRlcGVuZGVuY3kgY2FjaGUuIiAlIGV2ZW50Lm51bV9lbnRyaWVz
KQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZl
bnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CiAgICAgICAgICAgICAgICByZXR1cm5fdmFs
dWUgPSBldmVudC5leGl0Y29kZQogICAgICAgICAgICAgICAgaWYgZXZlbnQuZXJyb3I6CiAgICAg
ICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQogICAgICAgICAgICAgICAgICAgIGxv
Z2dlci5lcnJvcihzdHIoZXZlbnQpKQogICAgICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDIK
ICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQs
IGJiLmNvbW1hbmQuQ29tbWFuZEV4aXQpOgogICAgICAgICAgICAgICAgaWYgbm90IHJldHVybl92
YWx1ZToKICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSBldmVudC5leGl0Y29kZQog
ICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwg
KGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCwgYmIuY29va2VyLkNvb2tlckV4aXQpKToKICAg
ICAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAyCiAgICAgICAgICAgICAgICBjb250aW51ZQog
ICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVy
cyk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhzdHIoZXZlbnQpKQogICAgICAgICAgICAg
ICAgY29udGludWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTm9Q
cm92aWRlcik6CiAgICAgICAgICAgICAgICAjIEZvciB1bml2ZXJzZSBidWlsZHMsIG9ubHkgc2hv
dyB0aGVzZSBhcyB3YXJuaW5ncywgbm90IGVycm9ycwogICAgICAgICAgICAgICAgaWYgbm90IHVu
aXZlcnNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKICAgICAgICAgICAg
ICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVy
cm9yKHN0cihldmVudCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAg
IGxvZ2dlci53YXJuaW5nKHN0cihldmVudCkpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAg
ICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tT
dGFydGVkKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSdW5uaW5nIHNldHNjZW5lIHRh
c2sgJWQgb2YgJWQgKCVzKSIgJSAoZXZlbnQuc3RhdHMuY29tcGxldGVkICsgZXZlbnQuc3RhdHMu
YWN0aXZlICsgZXZlbnQuc3RhdHMuZmFpbGVkICsgMSwgZXZlbnQuc3RhdHMudG90YWwsIGV2ZW50
LnRhc2tzdHJpbmcpKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGlz
aW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQpOgogICAgICAg
ICAgICAgICAgaWYgZXZlbnQubm9leGVjOgogICAgICAgICAgICAgICAgICAgIHRhc2t0eXBlID0g
J25vZXhlYyB0YXNrJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0
YXNrdHlwZSA9ICd0YXNrJwogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJ1bm5pbmcgJXMg
JWQgb2YgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrdHlwZSwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0
YXRzLmFjdGl2ZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhdHMu
ZmFpbGVkICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLnRvdGFs
LCBldmVudC50YXNrc3RyaW5nKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAg
IGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0ZhaWxlZCk6CiAg
ICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAxCiAgICAgICAgICAgICAgICB0YXNrZmFpbHVy
ZXMuYXBwZW5kKGV2ZW50LnRhc2tzdHJpbmcpCiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Io
c3RyKGV2ZW50KSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBpc2lu
c3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza0ZhaWxlZCk6CiAgICAgICAg
ICAgICAgICBsb2dnZXIud2FybmluZyhzdHIoZXZlbnQpKQogICAgICAgICAgICAgICAgY29udGlu
dWUKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkRlcFRyZWVHZW5l
cmF0ZWQpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGlzaW5zdGFu
Y2UoZXZlbnQsIGJiLmV2ZW50LlByb2Nlc3NTdGFydGVkKToKICAgICAgICAgICAgICAgIGlmIHBh
cmFtcy5vcHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAg
ICAgICAgICAgICAgcGFyc2Vwcm9ncmVzcyA9IG5ld19wcm9ncmVzcyhldmVudC5wcm9jZXNzbmFt
ZSwgZXZlbnQudG90YWwpCiAgICAgICAgICAgICAgICBwYXJzZXByb2dyZXNzLnN0YXJ0KEZhbHNl
KQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVu
dCwgYmIuZXZlbnQuUHJvY2Vzc1Byb2dyZXNzKToKICAgICAgICAgICAgICAgIGlmIHBhcmFtcy5v
cHRpb25zLnF1aWV0ID4gMToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg
ICAgICAgaWYgcGFyc2Vwcm9ncmVzczoKICAgICAgICAgICAgICAgICAgICBwYXJzZXByb2dyZXNz
LnVwZGF0ZShldmVudC5wcm9ncmVzcykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAg
ICAgICAgICAgYmIud2FybigiR290IFByb2Nlc3NQcm9ncmVzcyBldmVudCBmb3Igc29tZXRpbmcg
dGhhdCBuZXZlciBzdGFydGVkPyIpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg
ICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Qcm9jZXNzRmluaXNoZWQpOgogICAgICAg
ICAgICAgICAgaWYgcGFyYW1zLm9wdGlvbnMucXVpZXQgPiAxOgogICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBwYXJzZXByb2dyZXNzOgogICAgICAgICAgICAg
ICAgICAgIHBhcnNlcHJvZ3Jlc3MuZmluaXNoKCkKICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jl
c3MgPSBOb25lCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgaXNpbnN0
YW5jZShldmVudCwgYmIuYnVpbGQuVGFza1Byb2dyZXNzKToKICAgICAgICAgICAgICAgIGNvbnRp
bnVlCgogICAgICAgICAgICAjIGlnbm9yZSBhbGwgb3RoZXIgZXZlbnRzIGZvciB0aGlzIHRlc3Qg
VUkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3Ig
YXMgaW9lcnJvcjoKICAgICAgICAgICAgdGVybWZpbHRlci5jbGVhckZvb3RlcigpCiAgICAgICAg
ICAgICMgaWdub3JlIGludGVycnVwdGVkIGlvCiAgICAgICAgICAgIGlmIGlvZXJyb3IuYXJnc1sw
XSA9PSA0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc3lzLnN0ZGVyci53
cml0ZShzdHIoaW9lcnJvcikpCiAgICAgICAgICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5
OgogICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9y
Y2VTaHV0ZG93biJdKQogICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgogICAgICAgIGV4Y2Vw
dCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgIyBTYXZlIHNlcnZlciBoaXN0b2dyYW0K
ICAgICAgICAgICAgaGlzdG9ncmFtX3NhdmUoKQogICAgICAgICAgICB0ZXJtZmlsdGVyLmNsZWFy
Rm9vdGVyKCkKICAgICAgICAgICAgaWYgcGFyYW1zLm9ic2VydmVfb25seToKICAgICAgICAgICAg
ICAgIHByaW50KCJcbktleWJvYXJkIEludGVycnVwdCwgZXhpdGluZyBvYnNlcnZlci4uLiIpCiAg
ICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgogICAgICAgICAgICBpZiBub3QgcGFyYW1z
Lm9ic2VydmVfb25seSBhbmQgbWFpbi5zaHV0ZG93biA9PSAxOgogICAgICAgICAgICAgICAgcHJp
bnQoIlxuU2Vjb25kIEtleWJvYXJkIEludGVycnVwdCwgc3RvcHBpbmcuLi5cbiIpCiAgICAgICAg
ICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3du
Il0pCiAgICAgICAgICAgICAgICBpZiBlcnJvcjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIu
ZXJyb3IoIlVuYWJsZSB0byBjbGVhbmx5IHN0b3A6ICVzIiAlIGVycm9yKQogICAgICAgICAgICBp
ZiBub3QgcGFyYW1zLm9ic2VydmVfb25seSBhbmQgbWFpbi5zaHV0ZG93biA9PSAwOgogICAgICAg
ICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgSW50ZXJydXB0LCBjbG9zaW5nIGRvd24uLi5cbiIp
CiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKICAgICAgICAgICAgICAgIF8sIGVy
cm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZVNodXRkb3duIl0pCiAgICAgICAgICAgICAg
ICBpZiBlcnJvcjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBj
bGVhbmx5IHNodXRkb3duOiAlcyIgJSBlcnJvcikKICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9
IG1haW4uc2h1dGRvd24gKyAxCiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQgRXhjZXB0
aW9uIGFzIGU6CiAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICAgICAgc3lzLnN0
ZGVyci53cml0ZSh0cmFjZWJhY2suZm9ybWF0X2V4YygpKQogICAgICAgICAgICBpZiBub3QgcGFy
YW1zLm9ic2VydmVfb25seToKICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNv
bW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9
IDIKICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMQogICAgdHJ5OgogICAgICAgIHRlcm1maWx0
ZXIuY2xlYXJGb290ZXIoKQogICAgICAgIHN1bW1hcnkgPSAiIgogICAgICAgIGlmIHRhc2tmYWls
dXJlczoKICAgICAgICAgICAgc3VtbWFyeSArPSBwbHVyYWxpc2UoIlxuU3VtbWFyeTogJXMgdGFz
ayBmYWlsZWQ6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3VtbWFyeTog
JXMgdGFza3MgZmFpbGVkOiIsIGxlbih0YXNrZmFpbHVyZXMpKQogICAgICAgICAgICBmb3IgZmFp
bHVyZSBpbiB0YXNrZmFpbHVyZXM6CiAgICAgICAgICAgICAgICBzdW1tYXJ5ICs9ICJcbiAgJXMi
ICUgZmFpbHVyZQogICAgICAgIGlmIHdhcm5pbmdzOgogICAgICAgICAgICBzdW1tYXJ5ICs9IHBs
dXJhbGlzZSgiXG5TdW1tYXJ5OiBUaGVyZSB3YXMgJXMgV0FSTklORyBtZXNzYWdlIHNob3duLiIs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblN1bW1hcnk6IFRoZXJlIHdlcmUg
JXMgV0FSTklORyBtZXNzYWdlcyBzaG93bi4iLCB3YXJuaW5ncykKICAgICAgICBpZiByZXR1cm5f
dmFsdWUgYW5kIGVycm9yczoKICAgICAgICAgICAgc3VtbWFyeSArPSBwbHVyYWxpc2UoIlxuU3Vt
bWFyeTogVGhlcmUgd2FzICVzIEVSUk9SIG1lc3NhZ2Ugc2hvd24sIHJldHVybmluZyBhIG5vbi16
ZXJvIGV4aXQgY29kZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5TdW1t
YXJ5OiBUaGVyZSB3ZXJlICVzIEVSUk9SIG1lc3NhZ2VzIHNob3duLCByZXR1cm5pbmcgYSBub24t
emVybyBleGl0IGNvZGUuIiwgZXJyb3JzKQogICAgICAgIGlmIHN1bW1hcnkgYW5kIHBhcmFtcy5v
cHRpb25zLnF1aWV0ID09IDA6CiAgICAgICAgICAgIHByaW50KHN1bW1hcnkpCgogICAgICAgIGlm
IGludGVycnVwdGVkOgogICAgICAgICAgICBwcmludCgiRXhlY3V0aW9uIHdhcyBpbnRlcnJ1cHRl
ZCwgcmV0dXJuaW5nIGEgbm9uLXplcm8gZXhpdCBjb2RlLiIpCiAgICAgICAgICAgIGlmIHJldHVy
bl92YWx1ZSA9PSAwOgogICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMQogICAgZXhjZXB0
IElPRXJyb3IgYXMgZToKICAgICAgICBpbXBvcnQgZXJybm8KICAgICAgICBpZiBlLmVycm5vID09
IGVycm5vLkVQSVBFOgogICAgICAgICAgICBwYXNzCgogICAgaWYgY29uc29sZWxvZzoKICAgICAg
ICBsb2dnZXIucmVtb3ZlSGFuZGxlcihjb25zb2xlbG9nKQogICAgICAgIGNvbnNvbGVsb2cuY2xv
c2UoKQoKICAgIHJldHVybiByZXR1cm5fdmFsdWUK
</data>

          </attachment>
      

    </bug>

</bugzilla>