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

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

    <bug>
          <bug_id>128227</bug_id>
          
          <creation_ts>2014-02-04 18:57:59 -0800</creation_ts>
          <short_desc>DoYouEvenBench: Update Ember.js test case</short_desc>
          <delta_ts>2014-02-04 21:31:13 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>976613</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2014-02-04 18:57:59 -0800</bug_when>
    <thetext>Right now, Ember.js test case in DoYouEvenBench uses Ember.js version 1.0.0-rc1.
We should update that to the latest Ember.js.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>976614</commentid>
    <comment_count>1</comment_count>
      <attachid>223196</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2014-02-04 19:01:21 -0800</bug_when>
    <thetext>Created attachment 223196
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>976654</commentid>
    <comment_count>2</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2014-02-04 21:31:13 -0800</bug_when>
    <thetext>Committed r163429: &lt;http://trac.webkit.org/changeset/163429&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>223196</attachid>
            <date>2014-02-04 19:01:21 -0800</date>
            <delta_ts>2014-02-04 19:35:16 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-128227-20140204190132.patch</filename>
            <type>text/plain</type>
            <size>3166241</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYzNDE4CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCmluZGV4IDcyMjlkMTY2Yjlh
N2MxMDBhMzY1MmQzODAzZGVmOTc1NzQxMTA5YWIuLjc2NTUwNDM0ZmM2NDVhMDZhOTc3NTk3YTY4
ZTYxZjgwM2M4NzRhNGEgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzUgQEAKKzIwMTQtMDIt
MDQgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgRG9Zb3VFdmVu
QmVuY2g6IFVwZGF0ZSBFbWJlci5qcyB0ZXN0IGNhc2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyODIyNworCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0ZWQgdGhlIEVtYmVyLmpzIFRvZG9NVkMgaW1w
bGVtZW50YXRpb24uCisKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdGVzdHMu
anM6CisgICAgICAgICogRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXIuanNvbjoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5j
aC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9j
b21wb25lbnRzL2VtYmVyLWRhdGEvZW1iZXItZGF0YS5qczogQWRkZWQuCisgICAgICAgICogRG9Z
b3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3Jh
Z2VfYWRhcHRlci5qczoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyL2Vt
YmVyLmpzOgorICAgICAgICAqIERvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5k
bGViYXJzLmpzOgorICAgICAgICAqIERvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVy
eS5qczoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jh
c2UuY3NzOgorICAgICAgICAqIERvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24v
YmFzZS5qczoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9pbmRleC5odG1sOgorICAgICAgICAqIERvWW91RXZl
bkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pz
L2FwcC5qczoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2RvX2NvbnRyb2xsZXIu
anM6CisgICAgICAgICogRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb3NfY29udHJvbGxlci5qczoK
KyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy9oZWxwZXJzL3BsdXJhbGl6ZS5qczogQWRkZWQuCisgICAgICAg
ICogRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvanMvbGlicy9lbWJlci1kYXRhLmpzOiBSZW1vdmVkLgorICAgICAgICAqIERvWW91
RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2pzL21vZGVscy9zdG9yZS5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9tb2RlbHMv
dG9kby5qczoKKyAgICAgICAgKiBEb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9yb3V0ZXIuanM6CisgICAgICAgICogRG9Zb3VF
dmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
anMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanM6CisgICAgICAgICogRG9Zb3VFdmVuQmVuY2gvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvdG9k
b3Nfdmlldy5qczogQWRkZWQuCisgICAgICAgICogRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvcmVhZG1lLm1kOgorICAgICAgICAq
IERvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3Rlc3QuaHRtbDoKKwogMjAxNC0wMS0xNyAgTWFudWVsIFJlZ28gQ2FzYXNub3ZhcyAg
PHJlZ29AaWdhbGlhLmNvbT4KIAogICAgICAgICBbQ1NTIFJlZ2lvbnNdIE1pbm9yIGZpeGVzIGlu
IHJlZ2lvbnMgcGVyZm9ybWFuY2UgdGVzdHMKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMv
RG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3Rlc3RzLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lv
dUV2ZW5CZW5jaC9yZXNvdXJjZXMvdGVzdHMuanMKaW5kZXggOWU1MDg4ODgwNjljY2ViNTI5MjQ2
ZTAwYTBkYjE0ZTAxZWY3MjFhOC4uOTZiMmYyZWM1OGQyNDY4YTRlYzM3OTQwMGExMTIxMDExN2Qz
YWVkZCAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJj
ZXMvdGVzdHMuanMKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJj
ZXMvdGVzdHMuanMKQEAgLTM1LDEyICszNSw2IEBAIFN1aXRlcy5wdXNoKHsKICAgICBuYW1lOiAn
RW1iZXJKUy1Ub2RvTVZDJywKICAgICB1cmw6ICd0b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL2luZGV4Lmh0bWwnLAogICAgIHByZXBhcmU6IGZ1bmN0aW9uIChydW5uZXIsIGNv
bnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgewotICAgICAgICBjb250ZW50V2luZG93LlRv
ZG9zLlN0b3JlID0gY29udGVudFdpbmRvdy5EUy5TdG9yZS5leHRlbmQoewotICAgICAgICAgICAg
cmV2aXNpb246IDEyLAotICAgICAgICAgICAgYWRhcHRlcjogJ1RvZG9zLkxTQWRhcHRlcicsCi0g
ICAgICAgICAgICBjb21taXQ6IGZ1bmN0aW9uICgpIHsgfQotICAgICAgICB9KTsKLQogICAgICAg
ICByZXR1cm4gcnVubmVyLndhaXRGb3JFbGVtZW50KCcjbmV3LXRvZG8nKS50aGVuKGZ1bmN0aW9u
IChlbGVtZW50KSB7CiAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgICBy
ZXR1cm4gewpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlci5qc29uIGIv
UGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlci5qc29uCmluZGV4IDhiM2FkNjY3Y2QwNzhkMjkw
MGU4OThlMmFjOTdmMDYyYzA5OTUzODQuLmU5OWU0OTgyMmFmMDViNjRlOTZhMTMwZTk5ODcxYjQw
OTk4OTA4Y2YgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXIuanNvbgor
KysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyLmpzb24KQEAgLTMsOSArMywxMCBAQAog
ICAidmVyc2lvbiI6ICIwLjAuMCIsCiAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgInRvZG9tdmMt
Y29tbW9uIjogIn4wLjEuNCIsCi0gICAgImpxdWVyeSI6ICJ+MS45LjEiLAotICAgICJoYW5kbGVi
YXJzIjogIn4xLjAuMC1yYy4zIiwKLSAgICAiZW1iZXIiOiAifjEuMC4wLXJjLjEiLAorICAgICJq
cXVlcnkiOiAifjIuMS4wIiwKKyAgICAiaGFuZGxlYmFycyI6ICJ+MS4zLjAiLAorICAgICJlbWJl
ciI6ICJ+MS4zLjEiLAorICAgICJlbWJlci1kYXRhIjogIjEuMC4wLWJldGEuNiIsCiAgICAgImVt
YmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyIjogImxhdGVzdCIKICAgfQogfQpkaWZmIC0tZ2l0IGEv
UGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWRhdGEvZW1iZXIt
ZGF0YS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1k
YXRhL2VtYmVyLWRhdGEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzYyYTlkNzc5NWJhZGY2NDAyZDAzNmViYjU5
MDkzMTBkNGViMzZjMgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VF
dmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy9lbWJlci1kYXRhL2VtYmVyLWRhdGEuanMKQEAgLTAsMCArMSwxMDYy
MCBAQAorLyohCisgKiBAb3ZlcnZpZXcgIEVtYmVyIERhdGEKKyAqIEBjb3B5cmlnaHQgQ29weXJp
Z2h0IDIwMTEtMjAxNCBUaWxkZSBJbmMuIGFuZCBjb250cmlidXRvcnMuCisgKiAgICAgICAgICAg
IFBvcnRpb25zIENvcHlyaWdodCAyMDExIExpdmluZ1NvY2lhbCBJbmMuCisgKiBAbGljZW5zZSAg
IExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlIChzZWUgbGljZW5zZS5qcykKKyAqIEB2ZXJzaW9u
ICAgMS4wLjAtYmV0YS42CisgKi8KKworCisoZnVuY3Rpb24oKSB7Cit2YXIgZGVmaW5lLCByZXF1
aXJlTW9kdWxlOworCisoZnVuY3Rpb24oKSB7CisgIHZhciByZWdpc3RyeSA9IHt9LCBzZWVuID0g
e307CisKKyAgZGVmaW5lID0gZnVuY3Rpb24obmFtZSwgZGVwcywgY2FsbGJhY2spIHsKKyAgICBy
ZWdpc3RyeVtuYW1lXSA9IHsgZGVwczogZGVwcywgY2FsbGJhY2s6IGNhbGxiYWNrIH07CisgIH07
CisKKyAgcmVxdWlyZU1vZHVsZSA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICBpZiAoc2VlbltuYW1l
XSkgeyByZXR1cm4gc2VlbltuYW1lXTsgfQorICAgIHNlZW5bbmFtZV0gPSB7fTsKKworICAgIHZh
ciBtb2QsIGRlcHMsIGNhbGxiYWNrLCByZWlmaWVkICwgZXhwb3J0czsKKworICAgIG1vZCA9IHJl
Z2lzdHJ5W25hbWVdOworCisgICAgaWYgKCFtb2QpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigi
TW9kdWxlICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKKyAgICB9CisKKyAgICBkZXBzID0g
bW9kLmRlcHM7CisgICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2s7CisgICAgcmVpZmllZCA9IFtd
OworICAgIGV4cG9ydHM7CisKKyAgICBmb3IgKHZhciBpPTAsIGw9ZGVwcy5sZW5ndGg7IGk8bDsg
aSsrKSB7CisgICAgICBpZiAoZGVwc1tpXSA9PT0gJ2V4cG9ydHMnKSB7CisgICAgICAgIHJlaWZp
ZWQucHVzaChleHBvcnRzID0ge30pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpZmllZC5w
dXNoKHJlcXVpcmVNb2R1bGUoZGVwc1tpXSkpOworICAgICAgfQorICAgIH0KKworICAgIHZhciB2
YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIHJlaWZpZWQpOworICAgIHJldHVybiBzZWVuW25h
bWVdID0gZXhwb3J0cyB8fCB2YWx1ZTsKKyAgfTsKK30pKCk7CisoZnVuY3Rpb24oKSB7CisvKioK
KyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCisvKioKKyAgQWxsIEVtYmVyIERhdGEgbWV0aG9k
cyBhbmQgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiB0aGlzIG5hbWVzcGFjZS4KKwor
ICBAY2xhc3MgRFMKKyAgQHN0YXRpYworKi8KK3ZhciBEUzsKK2lmICgndW5kZWZpbmVkJyA9PT0g
dHlwZW9mIERTKSB7CisgIC8qKgorICAgIEBwcm9wZXJ0eSBWRVJTSU9OCisgICAgQHR5cGUgU3Ry
aW5nCisgICAgQGRlZmF1bHQgJzEuMC4wLWJldGEuNicKKyAgICBAc3RhdGljCisgICovCisgIERT
ID0gRW1iZXIuTmFtZXNwYWNlLmNyZWF0ZSh7CisgICAgVkVSU0lPTjogJzEuMC4wLWJldGEuNicK
KyAgfSk7CisKKyAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93KSB7CisgICAgd2lu
ZG93LkRTID0gRFM7CisgIH0KKworICBpZiAoRW1iZXIubGlicmFyaWVzKSB7CisgICAgRW1iZXIu
bGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyIERhdGEnLCBEUy5WRVJTSU9OKTsK
KyAgfQorfQorCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIFRoaXMgaXMgdXNl
ZCBpbnRlcm5hbGx5IHRvIGVuYWJsZSBkZXByZWNhdGlvbiBvZiBjb250YWluZXIgcGF0aHMgYW5k
IHByb3ZpZGUKKyAgYSBkZWNlbnQgbWVzc2FnZSB0byB0aGUgdXNlciBpbmRpY2F0aW5nIGhvdyB0
byBmaXggdGhlIGlzc3VlLgorCisgIEBjbGFzcyBDb250YWluZXJQcm94eQorICBAbmFtZXNwYWNl
IERTCisgIEBwcml2YXRlCisqLwordmFyIENvbnRhaW5lclByb3h5ID0gZnVuY3Rpb24gKGNvbnRh
aW5lcil7CisgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworfTsKKworQ29udGFpbmVyUHJv
eHkucHJvdG90eXBlLmFsaWFzZWRGYWN0b3J5ID0gZnVuY3Rpb24ocGF0aCwgcHJlTG9va3VwKSB7
CisgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgcmV0dXJuIHtjcmVhdGU6IGZ1bmN0aW9uKCl7IAor
ICAgIGlmIChwcmVMb29rdXApIHsgcHJlTG9va3VwKCk7IH0KKworICAgIHJldHVybiBfdGhpcy5j
b250YWluZXIubG9va3VwKHBhdGgpOyAKKyAgfX07Cit9OworCitDb250YWluZXJQcm94eS5wcm90
b3R5cGUucmVnaXN0ZXJBbGlhcyA9IGZ1bmN0aW9uKHNvdXJjZSwgZGVzdCwgcHJlTG9va3VwKSB7
CisgIHZhciBmYWN0b3J5ID0gdGhpcy5hbGlhc2VkRmFjdG9yeShkZXN0LCBwcmVMb29rdXApOwor
CisgIHJldHVybiB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcihzb3VyY2UsIGZhY3RvcnkpOworfTsK
KworQ29udGFpbmVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyRGVwcmVjYXRpb24gPSBmdW5jdGlv
bihkZXByZWNhdGVkLCB2YWxpZCkgeworICB2YXIgcHJlTG9va3VwQ2FsbGJhY2sgPSBmdW5jdGlv
bigpeworICAgIEVtYmVyLmRlcHJlY2F0ZSgiWW91IHRyaWVkIHRvIGxvb2sgdXAgJyIgKyBkZXBy
ZWNhdGVkICsgIicsICIgKworICAgICAgICAgICAgICAgICAgICAiYnV0IHRoaXMgaGFzIGJlZW4g
ZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnIiArIHZhbGlkICsgIicuIiwgZmFsc2UpOworICB9Owor
CisgIHJldHVybiB0aGlzLnJlZ2lzdGVyQWxpYXMoZGVwcmVjYXRlZCwgdmFsaWQsIHByZUxvb2t1
cENhbGxiYWNrKTsKK307CisKK0NvbnRhaW5lclByb3h5LnByb3RvdHlwZS5yZWdpc3RlckRlcHJl
Y2F0aW9ucyA9IGZ1bmN0aW9uKHByb3h5UGFpcnMpIHsKKyAgZm9yICh2YXIgaSA9IHByb3h5UGFp
cnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7CisgICAgdmFyIHByb3h5UGFpciA9IHByb3h5UGFpcnNb
aSAtIDFdLAorICAgICAgICBkZXByZWNhdGVkID0gcHJveHlQYWlyWydkZXByZWNhdGVkJ10sCisg
ICAgICAgIHZhbGlkID0gcHJveHlQYWlyWyd2YWxpZCddOworCisgICAgdGhpcy5yZWdpc3RlckRl
cHJlY2F0aW9uKGRlcHJlY2F0ZWQsIHZhbGlkKTsKKyAgfQorfTsKKworRFMuQ29udGFpbmVyUHJv
eHkgPSBDb250YWluZXJQcm94eTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIuaXNOb25lOwor
CisvLyBTaW1wbGUgZGlzcGF0Y2hlciB0byBzdXBwb3J0IG92ZXJyaWRpbmcgdGhlIGFsaWFzZWQK
Ky8vIG1ldGhvZCBpbiBzdWJjbGFzc2VzLgorZnVuY3Rpb24gYWxpYXNNZXRob2QobWV0aG9kTmFt
ZSkgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0u
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfTsKK30KKworLyoqCisgIEluIEVtYmVyIERhdGEg
YSBTZXJpYWxpemVyIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorICByZWNv
cmRzIHdoZW4gdGhleSBhcmUgdHJhbnNmZXJyZWQgaW4gYW5kIG91dCBvZiBhbiBleHRlcm5hbCBz
b3VyY2UuCisgIFRoaXMgcHJvY2VzcyBpbnZvbHZlcyBub3JtYWxpemluZyBwcm9wZXJ0eSBuYW1l
cywgdHJhbnNmb3JtaW5nCisgIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIHNlcmlhbGl6aW5nIHJlbGF0
aW9uc2hpcHMuCisKKyAgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgRW1iZXIgRGF0YSByZWNvbW1l
bmRzIHlvdSB1c2UgdGhlCisgIFtSRVNUU2VyaWFsaXplcl0oRFMuUkVTVFNlcmlhbGl6ZXIuaHRt
bCkgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLgorCisgIGBKU09OU2VyaWFsaXplcmAgaXMgdXNl
ZnVsIGZvciBzaW1wbGVyIG9yIGxlZ2FjeSBiYWNrZW5kcyB0aGF0IG1heQorICBub3Qgc3VwcG9y
dCB0aGUgaHR0cDovL2pzb25hcGkub3JnLyBzcGVjLgorCisgIEBjbGFzcyBKU09OU2VyaWFsaXpl
cgorICBAbmFtZXNwYWNlIERTCisqLworRFMuSlNPTlNlcmlhbGl6ZXIgPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKKyAgLyoqCisgICAgVGhlIHByaW1hcnlLZXkgaXMgdXNlZCB3aGVuIHNlcmlhbGl6
aW5nIGFuZCBkZXNlcmlhbGl6aW5nCisgICAgZGF0YS4gRW1iZXIgRGF0YSBhbHdheXMgdXNlcyB0
aGUgYGlkYCBwcm9wZXJ0eSB0byBzdG9yZSB0aGUgaWQgb2YKKyAgICB0aGUgcmVjb3JkLiBUaGUg
ZXh0ZXJuYWwgc291cmNlIG1heSBub3QgYWx3YXlzIGZvbGxvdyB0aGlzCisgICAgY29udmVudGlv
bi4gSW4gdGhlc2UgY2FzZXMgaXQgaXMgdXNlZnVsIHRvIG92ZXJyaWRlIHRoZQorICAgIHByaW1h
cnlLZXkgcHJvcGVydHkgdG8gbWF0Y2ggdGhlIHByaW1hcnlLZXkgb2YgeW91ciBleHRlcm5hbAor
ICAgIHN0b3JlLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5B
cHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAgICAg
cHJpbWFyeUtleTogJ19pZCcKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBwcmlt
YXJ5S2V5CisgICAgQHR5cGUge1N0cmluZ30KKyAgICBAZGVmYXVsdCAnaWQnCisgICovCisgIHBy
aW1hcnlLZXk6ICdpZCcsCisKKyAgLyoqCisgICBHaXZlbiBhIHN1YmNsYXNzIG9mIGBEUy5Nb2Rl
bGAgYW5kIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRob2Qgd2lsbAorICAgaXRlcmF0ZSB0aHJvdWdo
IGVhY2ggYXR0cmlidXRlIG9mIHRoZSBgRFMuTW9kZWxgIGFuZCBpbnZva2UgdGhlCisgICBgRFMu
VHJhbnNmb3JtI2Rlc2VyaWFsaXplYCBtZXRob2Qgb24gdGhlIG1hdGNoaW5nIHByb3BlcnR5IG9m
IHRoZQorICAgSlNPTiBvYmplY3QuICBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGFm
dGVyIHRoZQorICAgc2VyaWFsaXplcidzIGBub3JtYWxpemVgIG1ldGhvZC4KKworICAgQG1ldGhv
ZCBhcHBseVRyYW5zZm9ybXMKKyAgIEBwcml2YXRlCisgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCisgICBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSB0byB0cmFuc2Zv
cm0KKyAgIEByZXR1cm4ge09iamVjdH0gZGF0YSBUaGUgdHJhbnNmb3JtZWQgZGF0YSBvYmplY3QK
KyAgKi8KKyAgYXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7CisgICAgdHlw
ZS5lYWNoVHJhbnNmb3JtZWRBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5LCB0eXBlKSB7CisgICAgICB2
YXIgdHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1Gb3IodHlwZSk7CisgICAgICBkYXRhW2tleV0g
PSB0cmFuc2Zvcm0uZGVzZXJpYWxpemUoZGF0YVtrZXldKTsKKyAgICB9LCB0aGlzKTsKKworICAg
IHJldHVybiBkYXRhOworICB9LAorCisgIC8qKgorICAgIE5vcm1hbGl6ZXMgYSBwYXJ0IG9mIHRo
ZSBKU09OIHBheWxvYWQgcmV0dXJuZWQgYnkKKyAgICB0aGUgc2VydmVyLiBZb3Ugc2hvdWxkIG92
ZXJyaWRlIHRoaXMgbWV0aG9kLCBtdW5nZSB0aGUgaGFzaAorICAgIGFuZCBjYWxsIHN1cGVyIGlm
IHlvdSBoYXZlIGdlbmVyaWMgbm9ybWFsaXphdGlvbiB0byBkby4KKworICAgIEl0IHRha2VzIHRo
ZSB0eXBlIG9mIHRoZSByZWNvcmQgdGhhdCBpcyBiZWluZyBub3JtYWxpemVkCisgICAgKGFzIGEg
RFMuTW9kZWwgY2xhc3MpLCB0aGUgcHJvcGVydHkgd2hlcmUgdGhlIGhhc2ggd2FzCisgICAgb3Jp
Z2luYWxseSBmb3VuZCwgYW5kIHRoZSBoYXNoIHRvIG5vcm1hbGl6ZS4KKworICAgIFlvdSBjYW4g
dXNlIHRoaXMgbWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gbm9ybWFsaXplIHVuZGVyc2NvcmVkIGtl
eXMgdG8gY2FtZWxpemVkCisgICAgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIG5vcm1hbGl6YXRp
b25zLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5BcHBsaWNh
dGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAgICAgbm9ybWFs
aXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CisgICAgICAgIHZhciBmaWVsZHMgPSBFbWJlci5n
ZXQodHlwZSwgJ2ZpZWxkcycpOworICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVs
ZCkgeworICAgICAgICAgIHZhciBwYXlsb2FkRmllbGQgPSBFbWJlci5TdHJpbmcudW5kZXJzY29y
ZShmaWVsZCk7CisgICAgICAgICAgaWYgKGZpZWxkID09PSBwYXlsb2FkRmllbGQpIHsgcmV0dXJu
OyB9CisKKyAgICAgICAgICBoYXNoW2ZpZWxkXSA9IGhhc2hbcGF5bG9hZEZpZWxkXTsKKyAgICAg
ICAgICBkZWxldGUgaGFzaFtwYXlsb2FkRmllbGRdOworICAgICAgICB9KTsKKyAgICAgICAgcmV0
dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisgICAgfSk7
CisgICAgYGBgCisKKyAgICBAbWV0aG9kIG5vcm1hbGl6ZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mg
b2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09iamVjdH0gaGFzaAorICAgIEByZXR1cm4g
e09iamVjdH0KKyAgKi8KKyAgbm9ybWFsaXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CisgICAg
aWYgKCFoYXNoKSB7IHJldHVybiBoYXNoOyB9CisKKyAgICB0aGlzLmFwcGx5VHJhbnNmb3Jtcyh0
eXBlLCBoYXNoKTsKKyAgICByZXR1cm4gaGFzaDsKKyAgfSwKKworICAvLyBTRVJJQUxJWkUKKyAg
LyoqCisgICAgQ2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgc2F2ZWQgaW4gb3JkZXIgdG8gY29udmVy
dCB0aGUKKyAgICByZWNvcmQgaW50byBKU09OLgorCisgICAgQnkgZGVmYXVsdCwgaXQgY3JlYXRl
cyBhIEpTT04gb2JqZWN0IHdpdGggYSBrZXkgZm9yCisgICAgZWFjaCBhdHRyaWJ1dGUgYW5kIGJl
bG9uZ3NUbyByZWxhdGlvbnNoaXAuCisKKyAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBt
b2RlbDoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4
dGVuZCh7CisgICAgICB0aXRsZTogRFMuYXR0cigpLAorICAgICAgYm9keTogRFMuYXR0cigpLAor
CisgICAgICBhdXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicpCisgICAgfSk7CisgICAgYGBgCisK
KyAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0
IGxpa2U6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeworICAgICAgInRpdGxlIjogIlJhaWxz
IGlzIHVuYWdpIiwKKyAgICAgICJib2R5IjogIlJhaWxzPyBPbWFrYXNlPyBPX08iLAorICAgICAg
ImF1dGhvciI6IDEyCisgICAgfQorICAgIGBgYAorCisgICAgQnkgZGVmYXVsdCwgYXR0cmlidXRl
cyBhcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMsIHVubGVzcworICAgIHlvdSBzcGVjaWZpZWQgYW4g
YXR0cmlidXRlIHR5cGUgKGBEUy5hdHRyKCdkYXRlJylgKS4gSWYKKyAgICB5b3Ugc3BlY2lmeSBh
IHRyYW5zZm9ybSwgdGhlIEphdmFTY3JpcHQgdmFsdWUgd2lsbCBiZQorICAgIHNlcmlhbGl6ZWQg
d2hlbiBpbnNlcnRlZCBpbnRvIHRoZSBKU09OIGhhc2guCisKKyAgICBCeSBkZWZhdWx0LCBiZWxv
bmdzLXRvIHJlbGF0aW9uc2hpcHMgYXJlIGNvbnZlcnRlZCBpbnRvCisgICAgSURzIHdoZW4gaW5z
ZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgorCisgICAgIyMgSURzCisKKyAgICBgc2VyaWFsaXpl
YCB0YWtlcyBhbiBvcHRpb25zIGhhc2ggd2l0aCBhIHNpbmdsZSBvcHRpb246CisgICAgYGluY2x1
ZGVJZGAuIElmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgYHNlcmlhbGl6ZWAgd2lsbCwKKyAgICBi
eSBkZWZhdWx0IGluY2x1ZGUgdGhlIElEIGluIHRoZSBKU09OIG9iamVjdCBpdCBidWlsZHMuCisK
KyAgICBUaGUgYWRhcHRlciBwYXNzZXMgaW4gYGluY2x1ZGVJZDogdHJ1ZWAgd2hlbiBzZXJpYWxp
emluZworICAgIGEgcmVjb3JkIGZvciBgY3JlYXRlUmVjb3JkYCwgYnV0IG5vdCBmb3IgYHVwZGF0
ZVJlY29yZGAuCisKKyAgICAjIyBDdXN0b21pemF0aW9uCisKKyAgICBZb3VyIHNlcnZlciBtYXkg
ZXhwZWN0IGEgZGlmZmVyZW50IEpTT04gZm9ybWF0IHRoYW4gdGhlCisgICAgYnVpbHQtaW4gc2Vy
aWFsaXphdGlvbiBmb3JtYXQuCisKKyAgICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gaW1wbGVtZW50
IGBzZXJpYWxpemVgIHlvdXJzZWxmIGFuZAorICAgIHJldHVybiBhIEpTT04gaGFzaCBvZiB5b3Vy
IGNob29zaW5nLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9
IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7CisgICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHBv
c3QsIG9wdGlvbnMpIHsKKyAgICAgICAgdmFyIGpzb24gPSB7CisgICAgICAgICAgUE9TVF9UVEw6
IHBvc3QuZ2V0KCd0aXRsZScpLAorICAgICAgICAgIFBPU1RfQkRZOiBwb3N0LmdldCgnYm9keScp
LAorICAgICAgICAgIFBPU1RfQ01TOiBwb3N0LmdldCgnY29tbWVudHMnKS5tYXBQcm9wZXJ0eSgn
aWQnKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUlkKSB7CisgICAg
ICAgICAganNvbi5QT1NUX0lEXyA9IHBvc3QuZ2V0KCdpZCcpOworICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuIGpzb247CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICAjIyBDdXN0
b21pemluZyBhbiBBcHAtV2lkZSBTZXJpYWxpemVyCisKKyAgICBJZiB5b3Ugd2FudCB0byBkZWZp
bmUgYSBzZXJpYWxpemVyIGZvciB5b3VyIGVudGlyZQorICAgIGFwcGxpY2F0aW9uLCB5b3UnbGwg
cHJvYmFibHkgd2FudCB0byB1c2UgYGVhY2hBdHRyaWJ1dGVgCisgICAgYW5kIGBlYWNoUmVsYXRp
b25zaGlwYCBvbiB0aGUgcmVjb3JkLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5BcHBs
aWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAgICAgc2Vy
aWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKKyAgICAgICAgdmFyIGpzb24gPSB7
fTsKKworICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7CisgICAg
ICAgICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSk7
CisgICAgICAgIH0pCisKKyAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24o
bmFtZSwgcmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09
PSAnaGFzTWFueScpIHsKKyAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUobmFtZSld
ID0gcmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsKKyAgICAgICAgICB9CisgICAgICAgIH0p
OworCisgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgeworICAgICAgICAgIGpzb24uSURf
ID0gcmVjb3JkLmdldCgnaWQnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uOwor
ICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFtZShhdHRy
aWJ1dGUpIHsKKyAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBwZXJDYXNl
KCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgeworICAg
ICAgcmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSArICJfSURT
IjsKKyAgICB9CisgICAgYGBgCisKKyAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBK
U09OIHRoYXQgbG9va3MgbGlrZSB0aGlzOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHsKKyAg
ICAgICJUSVRMRSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKKyAgICAgICJCT0RZIjogIlllcC4gT21h
a2FzZS4iLAorICAgICAgIkNPTU1FTlRfSURTIjogWyAxLCAyLCAzIF0KKyAgICB9CisgICAgYGBg
CisKKyAgICAjIyBUd2Vha2luZyB0aGUgRGVmYXVsdCBKU09OCisKKyAgICBJZiB5b3UganVzdCB3
YW50IHRvIGRvIHNvbWUgc21hbGwgdHdlYWtzIG9uIHRoZSBkZWZhdWx0IEpTT04sCisgICAgeW91
IGNhbiBjYWxsIHN1cGVyIGZpcnN0IGFuZCBtYWtlIHRoZSB0d2Vha3Mgb24gdGhlIHJldHVybmVk
CisgICAgSlNPTi4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuUG9zdFNlcmlhbGl6ZXIg
PSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihy
ZWNvcmQsIG9wdGlvbnMpIHsKKyAgICAgICAgdmFyIGpzb24gPSB0aGlzLl9zdXBlci5hcHBseSh0
aGlzLCBhcmd1bWVudHMpOworCisgICAgICAgIGpzb24uc3ViamVjdCA9IGpzb24udGl0bGU7Cisg
ICAgICAgIGRlbGV0ZSBqc29uLnRpdGxlOworCisgICAgICAgIHJldHVybiBqc29uOworICAgICAg
fQorICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCBzZXJpYWxpemUKKyAgICBAcGFyYW0g
e3N1YmNsYXNzIG9mIERTLk1vZGVsfSByZWNvcmQKKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9u
cworICAgIEByZXR1cm4ge09iamVjdH0ganNvbgorICAqLworICBzZXJpYWxpemU6IGZ1bmN0aW9u
KHJlY29yZCwgb3B0aW9ucykgeworICAgIHZhciBqc29uID0ge307CisKKyAgICBpZiAob3B0aW9u
cyAmJiBvcHRpb25zLmluY2x1ZGVJZCkgeworICAgICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lk
Jyk7CisKKyAgICAgIGlmIChpZCkgeworICAgICAgICBqc29uW2dldCh0aGlzLCAncHJpbWFyeUtl
eScpXSA9IGlkOworICAgICAgfQorICAgIH0KKworICAgIHJlY29yZC5lYWNoQXR0cmlidXRlKGZ1
bmN0aW9uKGtleSwgYXR0cmlidXRlKSB7CisgICAgICB0aGlzLnNlcmlhbGl6ZUF0dHJpYnV0ZShy
ZWNvcmQsIGpzb24sIGtleSwgYXR0cmlidXRlKTsKKyAgICB9LCB0aGlzKTsKKworICAgIHJlY29y
ZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7CisgICAgICBp
ZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7CisgICAgICAgIHRoaXMuc2Vy
aWFsaXplQmVsb25nc1RvKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKTsKKyAgICAgIH0gZWxz
ZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55JykgeworICAgICAgICB0aGlzLnNl
cmlhbGl6ZUhhc01hbnkocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApOworICAgICAgfQorICAg
IH0sIHRoaXMpOworCisgICAgcmV0dXJuIGpzb247CisgIH0sCisKKyAgLyoqCisgICBgc2VyaWFs
aXplQXR0cmlidXRlYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgaG93IGBEUy5hdHRyYAorICAg
cHJvcGVydGllcyBhcmUgc2VyaWFsaXplZAorCisgICBGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudGVk
IHRvIGVuc3VyZSBhbGwgeW91IGF0dHJpYnV0ZXMgd2VyZSBhbHdheXMKKyAgIHNlcmlhbGl6ZWQg
YXMgcHJvcGVydGllcyBvbiBhbiBgYXR0cmlidXRlc2Agb2JqZWN0IHlvdSBjb3VsZAorICAgd3Jp
dGU6CisKKyAgIGBgYGphdmFzY3JpcHQKKyAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBE
Uy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAgICBzZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0
aW9uKHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGVzKSB7CisgICAgICAganNvbi5hdHRyaWJ1
dGVzID0ganNvbi5hdHRyaWJ1dGVzIHx8IHt9OworICAgICAgIHRoaXMuX3N1cGVyKHJlY29yZCwg
anNvbi5hdHRyaWJ1dGVzLCBrZXksIGF0dHJpYnV0ZXMpOworICAgICB9CisgICB9KTsKKyAgIGBg
YAorCisgICBAbWV0aG9kIHNlcmlhbGl6ZUF0dHJpYnV0ZQorICAgQHBhcmFtIHtEUy5Nb2RlbH0g
cmVjb3JkCisgICBAcGFyYW0ge09iamVjdH0ganNvbgorICAgQHBhcmFtIHtTdHJpbmd9IGtleQor
ICAgQHBhcmFtIHtPYmplY3R9IGF0dHJpYnV0ZQorICAqLworICBzZXJpYWxpemVBdHRyaWJ1dGU6
IGZ1bmN0aW9uKHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGUpIHsKKyAgICB2YXIgYXR0cnMg
PSBnZXQodGhpcywgJ2F0dHJzJyk7CisgICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KSwg
dHlwZSA9IGF0dHJpYnV0ZS50eXBlOworCisgICAgaWYgKHR5cGUpIHsKKyAgICAgIHZhciB0cmFu
c2Zvcm0gPSB0aGlzLnRyYW5zZm9ybUZvcih0eXBlKTsKKyAgICAgIHZhbHVlID0gdHJhbnNmb3Jt
LnNlcmlhbGl6ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLy8gaWYgcHJvdmlkZWQsIHVzZSB0aGUg
bWFwcGluZyBwcm92aWRlZCBieSBgYXR0cnNgIGluCisgICAgLy8gdGhlIHNlcmlhbGl6ZXIKKyAg
ICBrZXkgPSBhdHRycyAmJiBhdHRyc1trZXldIHx8ICh0aGlzLmtleUZvckF0dHJpYnV0ZSA/IHRo
aXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXkpOworCisgICAganNvbltrZXldID0gdmFsdWU7
CisgIH0sCisKKyAgLyoqCisgICBgc2VyaWFsaXplQmVsb25nc1RvYCBjYW4gYmUgdXNlZCB0byBj
dXN0b21pemUgaG93IGBEUy5iZWxvbmdzVG9gCisgICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVk
LgorCisgICBFeGFtcGxlCisKKyAgIGBgYGphdmFzY3JpcHQKKyAgIEFwcC5Qb3N0U2VyaWFsaXpl
ciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7CisgICAgIHNlcmlhbGl6ZUJlbG9uZ3NUbzog
ZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsKKyAgICAgICB2YXIga2V5ID0g
cmVsYXRpb25zaGlwLmtleTsKKworICAgICAgIHZhciBiZWxvbmdzVG8gPSBnZXQocmVjb3JkLCBr
ZXkpOworCisgICAgICAga2V5ID0gdGhpcy5rZXlGb3JSZWxhdGlvbnNoaXAgPyB0aGlzLmtleUZv
clJlbGF0aW9uc2hpcChrZXksICJiZWxvbmdzVG8iKSA6IGtleTsKKworICAgICAgIGpzb25ba2V5
XSA9IEVtYmVyLmlzTm9uZShiZWxvbmdzVG8pID8gYmVsb25nc1RvIDogYmVsb25nc1RvLnRvSlNP
TigpOworICAgICB9CisgICB9KTsKKyAgIGBgYAorCisgICBAbWV0aG9kIHNlcmlhbGl6ZUJlbG9u
Z3NUbworICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICBAcGFyYW0ge09iamVjdH0ganNv
bgorICAgQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcAorICAqLworICBzZXJpYWxpemVCZWxv
bmdzVG86IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7CisgICAgdmFyIGtl
eSA9IHJlbGF0aW9uc2hpcC5rZXk7CisKKyAgICB2YXIgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwg
a2V5KTsKKworICAgIGtleSA9IHRoaXMua2V5Rm9yUmVsYXRpb25zaGlwID8gdGhpcy5rZXlGb3JS
ZWxhdGlvbnNoaXAoa2V5LCAiYmVsb25nc1RvIikgOiBrZXk7CisKKyAgICBpZiAoaXNOb25lKGJl
bG9uZ3NUbykpIHsKKyAgICAgIGpzb25ba2V5XSA9IGJlbG9uZ3NUbzsKKyAgICB9IGVsc2Ugewor
ICAgICAganNvbltrZXldID0gZ2V0KGJlbG9uZ3NUbywgJ2lkJyk7CisgICAgfQorCisgICAgaWYg
KHJlbGF0aW9uc2hpcC5vcHRpb25zLnBvbHltb3JwaGljKSB7CisgICAgICB0aGlzLnNlcmlhbGl6
ZVBvbHltb3JwaGljVHlwZShyZWNvcmQsIGpzb24sIHJlbGF0aW9uc2hpcCk7CisgICAgfQorICB9
LAorCisgIC8qKgorICAgYHNlcmlhbGl6ZUhhc01hbnlgIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6
ZSBob3cgYERTLmhhc01hbnlgCisgICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkLgorCisgICBF
eGFtcGxlCisKKyAgIGBgYGphdmFzY3JpcHQKKyAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpT
T05TZXJpYWxpemVyLmV4dGVuZCh7CisgICAgIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJl
Y29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7CisgICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hp
cC5rZXk7CisgICAgICAgaWYgKGtleSA9PT0gJ2NvbW1lbnRzJykgeworICAgICAgICAgcmV0dXJu
OworICAgICAgIH0gZWxzZSB7CisgICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworICAgICAgIH0KKyAgICAgfQorICAgfSk7CisgICBgYGAKKworICAgQG1ldGhvZCBz
ZXJpYWxpemVIYXNNYW55CisgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgIEBwYXJhbSB7
T2JqZWN0fSBqc29uCisgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCisgICovCisgIHNl
cmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Cisg
ICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7CisKKyAgICB2YXIgcmVsYXRpb25zaGlwVHlw
ZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlKHJlY29y
ZC5jb25zdHJ1Y3RvciwgcmVsYXRpb25zaGlwKTsKKworICAgIGlmIChyZWxhdGlvbnNoaXBUeXBl
ID09PSAnbWFueVRvTm9uZScgfHwgcmVsYXRpb25zaGlwVHlwZSA9PT0gJ21hbnlUb01hbnknKSB7
CisgICAgICBqc29uW2tleV0gPSBnZXQocmVjb3JkLCBrZXkpLm1hcEJ5KCdpZCcpOworICAgICAg
Ly8gVE9ETyBzdXBwb3J0IGZvciBwb2x5bW9ycGhpYyBtYW55VG9Ob25lIGFuZCBtYW55VG9NYW55
IHJlbGF0aW9uc2hpcHMKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgWW91IGNhbiB1c2UgdGhp
cyBtZXRob2QgdG8gY3VzdG9taXplIGhvdyBwb2x5bW9ycGhpYyBvYmplY3RzIGFyZQorICAgIHNl
cmlhbGl6ZWQuIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcG9seW1vcnBoaWMgaWYKKyAg
ICBge3BvbHltb3JwaGljOiB0cnVlfWAgaXMgcGFzcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRv
IHRoZQorICAgIGBEUy5iZWxvbmdzVG9gIGZ1bmN0aW9uLgorCisgICAgRXhhbXBsZQorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEFwcC5Db21tZW50U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxp
emVyLmV4dGVuZCh7CisgICAgICBzZXJpYWxpemVQb2x5bW9ycGhpY1R5cGU6IGZ1bmN0aW9uKHJl
Y29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7CisgICAgICAgIHZhciBrZXkgPSByZWxhdGlvbnNo
aXAua2V5LAorICAgICAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKKyAgICAg
ICAga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUgPyB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkp
IDoga2V5OworICAgICAgICBqc29uW2tleSArICJfdHlwZSJdID0gYmVsb25nc1RvLmNvbnN0cnVj
dG9yLnR5cGVLZXk7CisgICAgICB9CisgICAgfSk7CisgICBgYGAKKworICAgIEBtZXRob2Qgc2Vy
aWFsaXplUG9seW1vcnBoaWNUeXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAg
QHBhcmFtIHtPYmplY3R9IGpzb24KKyAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCisg
ICovCisgIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTogRW1iZXIuSywKKworICAvLyBFWFRSQUNU
CisKKyAgLyoqCisgICAgVGhlIGBleHRyYWN0YCBtZXRob2QgaXMgdXNlZCB0byBkZXNlcmlhbGl6
ZSBwYXlsb2FkIGRhdGEgZnJvbSB0aGUKKyAgICBzZXJ2ZXIuIEJ5IGRlZmF1bHQgdGhlIGBKU09O
U2VyaWFsaXplcmAgZG9lcyBub3QgcHVzaCB0aGUgcmVjb3JkcworICAgIGludG8gdGhlIHN0b3Jl
LiBIb3dldmVyIHJlY29yZHMgdGhhdCBzdWJjbGFzcyBgSlNPTlNlcmlhbGl6ZXJgCisgICAgc3Vj
aCBhcyB0aGUgYFJFU1RTZXJpYWxpemVyYCBtYXkgcHVzaCByZWNvcmRzIGludG8gdGhlIHN0b3Jl
IGFzCisgICAgcGFydCBvZiB0aGUgZXh0cmFjdCBjYWxsLgorCisgICAgVGhpcyBtZXRob2QgZGVs
ZWdhdGVzIHRvIGEgbW9yZSBzcGVjaWZpYyBleHRyYWN0IG1ldGhvZCBiYXNlZCBvbgorICAgIHRo
ZSBgcmVxdWVzdFR5cGVgLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBnZXQgPSBFbWJlci5nZXQ7CisgICAgc29ja2V0Lm9uKCdtZXNzYWdlJywgZnVuY3Rpb24o
bWVzc2FnZSkgeworICAgICAgdmFyIG1vZGVsTmFtZSA9IG1lc3NhZ2UubW9kZWw7CisgICAgICB2
YXIgZGF0YSA9IG1lc3NhZ2UuZGF0YTsKKyAgICAgIHZhciB0eXBlID0gc3RvcmUubW9kZWxGb3Io
bW9kZWxOYW1lKTsKKyAgICAgIHZhciBzZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0
eXBlLnR5cGVLZXkpOworICAgICAgdmFyIHJlY29yZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9y
ZSwgdHlwZSwgZGF0YSwgZ2V0KGRhdGEsICdpZCcpLCAnc2luZ2xlJyk7CisgICAgICBzdG9yZS5w
dXNoKG1vZGVsTmFtZSwgcmVjb3JkKTsKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2Qg
ZXh0cmFjdAorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCisgICAgQHBh
cmFtIHtTdHJpbmcgb3IgTnVtYmVyfSBpZAorICAgIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VHlw
ZQorICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKKyAg
Ki8KKyAgZXh0cmFjdDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0
VHlwZSkgeworICAgIHRoaXMuZXh0cmFjdE1ldGEoc3RvcmUsIHR5cGUsIHBheWxvYWQpOworCisg
ICAgdmFyIHNwZWNpZmljRXh0cmFjdCA9ICJleHRyYWN0IiArIHJlcXVlc3RUeXBlLmNoYXJBdCgw
KS50b1VwcGVyQ2FzZSgpICsgcmVxdWVzdFR5cGUuc3Vic3RyKDEpOworICAgIHJldHVybiB0aGlz
W3NwZWNpZmljRXh0cmFjdF0oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7
CisgIH0sCisKKyAgLyoqCisgICAgYGV4dHJhY3RGaW5kQWxsYCBpcyBhIGhvb2sgaW50byB0aGUg
ZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuIGEKKyAgICBjYWxsIGlzIG1hZGUgdG8gYERTLlN0b3Jl
I2ZpbmRBbGxgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCisgICAgYWxpYXMgZm9yIFtl
eHRyYWN0QXJyYXldKCNtZXRob2RfZXh0cmFjdEFycmF5KS4KKworICAgIEBtZXRob2QgZXh0cmFj
dEZpbmRBbGwKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xh
c3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAorICAgIEBy
ZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICAq
LworICBleHRyYWN0RmluZEFsbDogYWxpYXNNZXRob2QoJ2V4dHJhY3RBcnJheScpLAorICAvKioK
KyAgICBgZXh0cmFjdEZpbmRRdWVyeWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9k
IHVzZWQgd2hlbiBhCisgICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kUXVlcnlgLiBC
eSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCisgICAgYWxpYXMgZm9yIFtleHRyYWN0QXJyYXld
KCNtZXRob2RfZXh0cmFjdEFycmF5KS4KKworICAgIEBtZXRob2QgZXh0cmFjdEZpbmRRdWVyeQor
ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCisgICAgQHJldHVybiB7QXJy
YXl9IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCisgICovCisgIGV4dHJh
Y3RGaW5kUXVlcnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKKyAgLyoqCisgICAgYGV4
dHJhY3RGaW5kTWFueWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hl
biBhCisgICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kTWFueWAuIEJ5IGRlZmF1bHQg
dGhpcyBtZXRob2QgaXMKKyAgICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRy
YWN0QXJyYXkpLgorCisgICAgQG1ldGhvZCBleHRyYWN0RmluZE1hbnkKKyAgICBAcGFyYW0ge0RT
LlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAg
ICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBh
cnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICAqLworICBleHRyYWN0RmluZE1hbnk6IGFs
aWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKKyAgLyoqCisgICAgYGV4dHJhY3RGaW5kSGFzTWFu
eWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCisgICAgY2Fs
bCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kSGFzTWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRo
b2QgaXMKKyAgICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkp
LgorCisgICAgQG1ldGhvZCBleHRyYWN0RmluZEhhc01hbnkKKyAgICBAcGFyYW0ge0RTLlN0b3Jl
fSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFy
YW0ge09iamVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBv
ZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICAqLworICBleHRyYWN0RmluZEhhc01hbnk6IGFsaWFz
TWV0aG9kKCdleHRyYWN0QXJyYXknKSwKKworICAvKioKKyAgICBgZXh0cmFjdENyZWF0ZVJlY29y
ZGAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCisgICAgY2Fs
bCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNjcmVhdGVSZWNvcmRgLiBCeSBkZWZhdWx0IHRoaXMgbWV0
aG9kIGlzCisgICAgYWxpYXMgZm9yIFtleHRyYWN0U2F2ZV0oI21ldGhvZF9leHRyYWN0U2F2ZSku
CisKKyAgICBAbWV0aG9kIGV4dHJhY3RDcmVhdGVSZWNvcmQKKyAgICBAcGFyYW0ge0RTLlN0b3Jl
fSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFy
YW0ge09iamVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJp
YWxpemVkIHBheWxvYWQKKyAgKi8KKyAgZXh0cmFjdENyZWF0ZVJlY29yZDogYWxpYXNNZXRob2Qo
J2V4dHJhY3RTYXZlJyksCisgIC8qKgorICAgIGBleHRyYWN0VXBkYXRlUmVjb3JkYCBpcyBhIGhv
b2sgaW50byB0aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuCisgICAgYSBjYWxsIGlzIG1hZGUg
dG8gYERTLlN0b3JlI3VwZGF0ZWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMgYWxpYXMKKyAg
ICBmb3IgW2V4dHJhY3RTYXZlXSgjbWV0aG9kX2V4dHJhY3RTYXZlKS4KKworICAgIEBtZXRob2Qg
ZXh0cmFjdFVwZGF0ZVJlY29yZAorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBh
cmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXls
b2FkCisgICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9hZAor
ICAqLworICBleHRyYWN0VXBkYXRlUmVjb3JkOiBhbGlhc01ldGhvZCgnZXh0cmFjdFNhdmUnKSwK
KyAgLyoqCisgICAgYGV4dHJhY3REZWxldGVSZWNvcmRgIGlzIGEgaG9vayBpbnRvIHRoZSBleHRy
YWN0IG1ldGhvZCB1c2VkIHdoZW4KKyAgICBhIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZGVs
ZXRlUmVjb3JkYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcworICAgIGFsaWFzIGZvciBbZXh0
cmFjdFNhdmVdKCNtZXRob2RfZXh0cmFjdFNhdmUpLgorCisgICAgQG1ldGhvZCBleHRyYWN0RGVs
ZXRlUmVjb3JkCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKKyAgICBA
cmV0dXJuIHtPYmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2FkCisgICovCisgIGV4
dHJhY3REZWxldGVSZWNvcmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2F2ZScpLAorCisgIC8qKgor
ICAgIGBleHRyYWN0RmluZGAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQg
d2hlbgorICAgIGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kYC4gQnkgZGVmYXVsdCB0
aGlzIG1ldGhvZCBpcworICAgIGFsaWFzIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRy
YWN0U2luZ2xlKS4KKworICAgIEBtZXRob2QgZXh0cmFjdEZpbmQKKyAgICBAcGFyYW0ge0RTLlN0
b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBA
cGFyYW0ge09iamVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVz
ZXJpYWxpemVkIHBheWxvYWQKKyAgKi8KKyAgZXh0cmFjdEZpbmQ6IGFsaWFzTWV0aG9kKCdleHRy
YWN0U2luZ2xlJyksCisgIC8qKgorICAgIGBleHRyYWN0RmluZEJlbG9uZ3NUb2AgaXMgYSBob29r
IGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgorICAgIGEgY2FsbCBpcyBtYWRlIHRv
IGBEUy5TdG9yZSNmaW5kQmVsb25nc1RvYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcworICAg
IGFsaWFzIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KKworICAg
IEBtZXRob2QgZXh0cmFjdEZpbmRCZWxvbmdzVG8KKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y
ZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09i
amVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVk
IHBheWxvYWQKKyAgKi8KKyAgZXh0cmFjdEZpbmRCZWxvbmdzVG86IGFsaWFzTWV0aG9kKCdleHRy
YWN0U2luZ2xlJyksCisgIC8qKgorICAgIGBleHRyYWN0U2F2ZWAgaXMgYSBob29rIGludG8gdGhl
IGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhIGNhbGwKKyAgICBpcyBtYWRlIHRvIGBEUy5Nb2Rl
bCNzYXZlYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyBhbGlhcworICAgIGZvciBbZXh0cmFj
dFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KKworICAgIEBtZXRob2QgZXh0cmFjdFNh
dmUKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAorICAgIEByZXR1cm4g
e09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKKyAgKi8KKyAgZXh0cmFjdFNh
dmU6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCisKKyAgLyoqCisgICAgYGV4dHJhY3RT
aW5nbGVgIGlzIHVzZWQgdG8gZGVzZXJpYWxpemUgYSBzaW5nbGUgcmVjb3JkIHJldHVybmVkCisg
ICAgZnJvbSB0aGUgYWRhcHRlci4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQK
KyAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoeworICAg
ICAgZXh0cmFjdFNpbmdsZTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKKyAgICAg
ICAgcGF5bG9hZC5jb21tZW50cyA9IHBheWxvYWQuX2VtYmVkZGVkLmNvbW1lbnQ7CisgICAgICAg
IGRlbGV0ZSBwYXlsb2FkLl9lbWJlZGRlZDsKKworICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIo
c3RvcmUsIHR5cGUsIHBheWxvYWQpOworICAgICAgfSwKKyAgICB9KTsKKyAgICBgYGAKKworICAg
IEBtZXRob2QgZXh0cmFjdFNpbmdsZQorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAg
QHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBw
YXlsb2FkCisgICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9h
ZAorICAqLworICBleHRyYWN0U2luZ2xlOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkg
eworICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0eXBlLCBwYXlsb2FkKTsKKyAgfSwKKworICAv
KioKKyAgICBgZXh0cmFjdEFycmF5YCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFuIGFycmF5IG9m
IHJlY29yZHMKKyAgICByZXR1cm5lZCBmcm9tIHRoZSBhZGFwdGVyLgorCisgICAgRXhhbXBsZQor
CisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJp
YWxpemVyLmV4dGVuZCh7CisgICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCBwYXlsb2FkKSB7CisgICAgICAgIHJldHVybiBwYXlsb2FkLm1hcChmdW5jdGlvbihqc29uKSB7
CisgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNpbmdsZShqc29uKTsKKyAgICAgICAgfSwg
dGhpcyk7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGV4dHJhY3RB
cnJheQorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCisgICAgQHJldHVy
biB7QXJyYXl9IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCisgICovCisg
IGV4dHJhY3RBcnJheTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKKyAgICByZXR1
cm4gdGhpcy5ub3JtYWxpemUodHlwZSwgcGF5bG9hZCk7CisgIH0sCisKKyAgLyoqCisgICAgYGV4
dHJhY3RNZXRhYCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFueSBtZXRhIGluZm9ybWF0aW9uIGlu
IHRoZQorICAgIGFkYXB0ZXIgcGF5bG9hZC4gQnkgZGVmYXVsdCBFbWJlciBEYXRhIGV4cGVjdHMg
bWV0YSBpbmZvcm1hdGlvbiB0bworICAgIGJlIGxvY2F0ZWQgb24gdGhlIGBtZXRhYCBwcm9wZXJ0
eSBvZiB0aGUgcGF5bG9hZCBvYmplY3QuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsK
KyAgICAgIGV4dHJhY3RNZXRhOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeworICAg
ICAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLl9wYWdpbmF0aW9uKSB7CisgICAgICAgICAgc3Rv
cmUubWV0YUZvclR5cGUodHlwZSwgcGF5bG9hZC5fcGFnaW5hdGlvbik7CisgICAgICAgICAgZGVs
ZXRlIHBheWxvYWQuX3BhZ2luYXRpb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAg
ICBgYGAKKworICAgIEBtZXRob2QgZXh0cmFjdE1ldGEKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0g
e09iamVjdH0gcGF5bG9hZAorICAqLworICBleHRyYWN0TWV0YTogZnVuY3Rpb24oc3RvcmUsIHR5
cGUsIHBheWxvYWQpIHsKKyAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLm1ldGEpIHsKKyAgICAg
IHN0b3JlLm1ldGFGb3JUeXBlKHR5cGUsIHBheWxvYWQubWV0YSk7CisgICAgICBkZWxldGUgcGF5
bG9hZC5tZXRhOworICAgIH0KKyAgfSwKKworICAvKioKKyAgIGBrZXlGb3JBdHRyaWJ1dGVgIGNh
biBiZSB1c2VkIHRvIGRlZmluZSBydWxlcyBmb3IgaG93IHRvIGNvbnZlcnQgYW4KKyAgIGF0dHJp
YnV0ZSBuYW1lIGluIHlvdXIgbW9kZWwgdG8gYSBrZXkgaW4geW91ciBKU09OLgorCisgICBFeGFt
cGxlCisKKyAgIGBgYGphdmFzY3JpcHQKKyAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBE
Uy5SRVNUU2VyaWFsaXplci5leHRlbmQoeworICAgICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9u
KGF0dHIpIHsKKyAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0cikudG9V
cHBlckNhc2UoKTsKKyAgICAgfQorICAgfSk7CisgICBgYGAKKworICAgQG1ldGhvZCBrZXlGb3JB
dHRyaWJ1dGUKKyAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKKyAgIEByZXR1cm4ge1N0cmluZ30gbm9y
bWFsaXplZCBrZXkKKyAgKi8KKworCisgIC8qKgorICAgYGtleUZvclJlbGF0aW9uc2hpcGAgY2Fu
IGJlIHVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGtleSB3aGVuCisgICBzZXJpYWxpemluZyByZWxh
dGlvbnNoaXAgcHJvcGVydGllcy4gQnkgZGVmYXVsdCBgSlNPTlNlcmlhbGl6ZXJgCisgICBkb2Vz
IG5vdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorCisgICBFeGFt
cGxlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNP
TlNlcmlhbGl6ZXIuZXh0ZW5kKHsKKyAgICAgIGtleUZvclJlbGF0aW9uc2hpcDogZnVuY3Rpb24o
a2V5LCByZWxhdGlvbnNoaXApIHsKKyAgICAgICAgIHJldHVybiAncmVsXycgKyBFbWJlci5TdHJp
bmcudW5kZXJzY29yZShrZXkpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICBAbWV0
aG9kIGtleUZvclJlbGF0aW9uc2hpcAorICAgQHBhcmFtIHtTdHJpbmd9IGtleQorICAgQHBhcmFt
IHtTdHJpbmd9IHJlbGF0aW9uc2hpcCB0eXBlCisgICBAcmV0dXJuIHtTdHJpbmd9IG5vcm1hbGl6
ZWQga2V5CisgICovCisKKyAgLy8gSEVMUEVSUworCisgIC8qKgorICAgQG1ldGhvZCB0cmFuc2Zv
cm1Gb3IKKyAgIEBwcml2YXRlCisgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlVHlwZQorICAg
QHBhcmFtIHtCb29sZWFufSBza2lwQXNzZXJ0aW9uCisgICBAcmV0dXJuIHtEUy5UcmFuc2Zvcm19
IHRyYW5zZm9ybQorICAqLworICB0cmFuc2Zvcm1Gb3I6IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUs
IHNraXBBc3NlcnRpb24pIHsKKyAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5jb250YWluZXIubG9v
a3VwKCd0cmFuc2Zvcm06JyArIGF0dHJpYnV0ZVR5cGUpOworICAgIEVtYmVyLmFzc2VydCgiVW5h
YmxlIHRvIGZpbmQgdHJhbnNmb3JtIGZvciAnIiArIGF0dHJpYnV0ZVR5cGUgKyAiJyIsIHNraXBB
c3NlcnRpb24gfHwgISF0cmFuc2Zvcm0pOworICAgIHJldHVybiB0cmFuc2Zvcm07CisgIH0KK30p
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0
YQorKi8KK3ZhciBnZXQgPSBFbWJlci5nZXQsIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2Fw
aXRhbGl6ZSwgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLCBEUyA9IHdpbmRv
dy5EUyA7CisKKy8qKgorICBFeHRlbmQgYEVtYmVyLkRhdGFBZGFwdGVyYCB3aXRoIEVEIHNwZWNp
ZmljIGNvZGUuCisKKyAgQGNsYXNzIERlYnVnQWRhcHRlcgorICBAbmFtZXNwYWNlIERTCisgIEBl
eHRlbmRzIEVtYmVyLkRhdGFBZGFwdGVyCisgIEBwcml2YXRlCisqLworRFMuRGVidWdBZGFwdGVy
ID0gRW1iZXIuRGF0YUFkYXB0ZXIuZXh0ZW5kKHsKKyAgZ2V0RmlsdGVyczogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIFsKKyAgICAgIHsgbmFtZTogJ2lzTmV3JywgZGVzYzogJ05ldycgfSwKKyAg
ICAgIHsgbmFtZTogJ2lzTW9kaWZpZWQnLCBkZXNjOiAnTW9kaWZpZWQnIH0sCisgICAgICB7IG5h
bWU6ICdpc0NsZWFuJywgZGVzYzogJ0NsZWFuJyB9CisgICAgXTsKKyAgfSwKKworICBkZXRlY3Q6
IGZ1bmN0aW9uKGtsYXNzKSB7CisgICAgcmV0dXJuIGtsYXNzICE9PSBEUy5Nb2RlbCAmJiBEUy5N
b2RlbC5kZXRlY3Qoa2xhc3MpOworICB9LAorCisgIGNvbHVtbnNGb3JUeXBlOiBmdW5jdGlvbih0
eXBlKSB7CisgICAgdmFyIGNvbHVtbnMgPSBbeyBuYW1lOiAnaWQnLCBkZXNjOiAnSWQnIH1dLCBj
b3VudCA9IDAsIHNlbGYgPSB0aGlzOworICAgIGdldCh0eXBlLCAnYXR0cmlidXRlcycpLmZvckVh
Y2goZnVuY3Rpb24obmFtZSwgbWV0YSkgeworICAgICAgICBpZiAoY291bnQrKyA+IHNlbGYuYXR0
cmlidXRlTGltaXQpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHZhciBkZXNjID0gY2FwaXRh
bGl6ZSh1bmRlcnNjb3JlKG5hbWUpLnJlcGxhY2UoJ18nLCAnICcpKTsKKyAgICAgICAgY29sdW1u
cy5wdXNoKHsgbmFtZTogbmFtZSwgZGVzYzogZGVzYyB9KTsKKyAgICB9KTsKKyAgICByZXR1cm4g
Y29sdW1uczsKKyAgfSwKKworICBnZXRSZWNvcmRzOiBmdW5jdGlvbih0eXBlKSB7CisgICAgcmV0
dXJuIHRoaXMuZ2V0KCdzdG9yZScpLmFsbCh0eXBlKTsKKyAgfSwKKworICBnZXRSZWNvcmRDb2x1
bW5WYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHZhciBzZWxmID0gdGhpcywgY291bnQg
PSAwLAorICAgICAgICBjb2x1bW5WYWx1ZXMgPSB7IGlkOiBnZXQocmVjb3JkLCAnaWQnKSB9Owor
CisgICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7CisgICAgICBpZiAoY291
bnQrKyA+IHNlbGYuYXR0cmlidXRlTGltaXQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgfQorICAgICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KTsKKyAgICAgIGNvbHVtblZh
bHVlc1trZXldID0gdmFsdWU7CisgICAgfSk7CisgICAgcmV0dXJuIGNvbHVtblZhbHVlczsKKyAg
fSwKKworICBnZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgdmFyIGtl
eXdvcmRzID0gW10sIGtleXMgPSBFbWJlci5BKFsnaWQnXSk7CisgICAgcmVjb3JkLmVhY2hBdHRy
aWJ1dGUoZnVuY3Rpb24oa2V5KSB7CisgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICB9KTsKKyAg
ICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CisgICAgICBrZXl3b3Jkcy5wdXNoKGdldChy
ZWNvcmQsIGtleSkpOworICAgIH0pOworICAgIHJldHVybiBrZXl3b3JkczsKKyAgfSwKKworICBn
ZXRSZWNvcmRGaWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHJldHVybiB7Cisg
ICAgICBpc05ldzogcmVjb3JkLmdldCgnaXNOZXcnKSwKKyAgICAgIGlzTW9kaWZpZWQ6IHJlY29y
ZC5nZXQoJ2lzRGlydHknKSAmJiAhcmVjb3JkLmdldCgnaXNOZXcnKSwKKyAgICAgIGlzQ2xlYW46
ICFyZWNvcmQuZ2V0KCdpc0RpcnR5JykKKyAgICB9OworICB9LAorCisgIGdldFJlY29yZENvbG9y
OiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICB2YXIgY29sb3IgPSAnYmxhY2snOworICAgIGlmIChy
ZWNvcmQuZ2V0KCdpc05ldycpKSB7CisgICAgICBjb2xvciA9ICdncmVlbic7CisgICAgfSBlbHNl
IGlmIChyZWNvcmQuZ2V0KCdpc0RpcnR5JykpIHsKKyAgICAgIGNvbG9yID0gJ2JsdWUnOworICAg
IH0KKyAgICByZXR1cm4gY29sb3I7CisgIH0sCisKKyAgb2JzZXJ2ZVJlY29yZDogZnVuY3Rpb24o
cmVjb3JkLCByZWNvcmRVcGRhdGVkKSB7CisgICAgdmFyIHJlbGVhc2VNZXRob2RzID0gRW1iZXIu
QSgpLCBzZWxmID0gdGhpcywKKyAgICAgICAga2V5c1RvT2JzZXJ2ZSA9IEVtYmVyLkEoWydpZCcs
ICdpc05ldycsICdpc0RpcnR5J10pOworCisgICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rp
b24oa2V5KSB7CisgICAgICBrZXlzVG9PYnNlcnZlLnB1c2goa2V5KTsKKyAgICB9KTsKKworICAg
IGtleXNUb09ic2VydmUuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZhciBoYW5kbGVy
ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHJlY29yZFVwZGF0ZWQoc2VsZi53cmFwUmVjb3JkKHJl
Y29yZCkpOworICAgICAgfTsKKyAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHJlY29yZCwga2V5LCBo
YW5kbGVyKTsKKyAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goZnVuY3Rpb24oKSB7CisgICAgICAg
IEVtYmVyLnJlbW92ZU9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsKKyAgICAgIH0pOwor
ICAgIH0pOworCisgICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJlbGVhc2VN
ZXRob2RzLmZvckVhY2goZnVuY3Rpb24oZm4pIHsgZm4oKTsgfSApOworICAgIH07CisKKyAgICBy
ZXR1cm4gcmVsZWFzZTsKKyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsK
Ky8qKgorICBUaGUgYERTLlRyYW5zZm9ybWAgY2xhc3MgaXMgdXNlZCB0byBzZXJpYWxpemUgYW5k
IGRlc2VyaWFsaXplIG1vZGVsCisgIGF0dHJpYnV0ZXMgd2hlbiB0aGV5IGFyZSBzYXZlZCBvciBs
b2FkZWQgZnJvbSBhbgorICBhZGFwdGVyLiBTdWJjbGFzc2luZyBgRFMuVHJhbnNmb3JtYCBpcyB1
c2VmdWwgZm9yIGNyZWF0aW5nIGN1c3RvbQorICBhdHRyaWJ1dGVzLiBBbGwgc3ViY2xhc3NlcyBv
ZiBgRFMuVHJhbnNmb3JtYCBtdXN0IGltcGxlbWVudCBhCisgIGBzZXJpYWxpemVgIGFuZCBhIGBk
ZXNlcmlhbGl6ZWAgbWV0aG9kLgorCisgIEV4YW1wbGUKKworICBgYGBqYXZhc2NyaXB0CisgIEFw
cC5SYXdUcmFuc2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKKyAgICBkZXNlcmlhbGl6ZTog
ZnVuY3Rpb24oc2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7CisgICAgfSwK
KyAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIGRl
c2VyaWFsaXplZDsKKyAgICB9CisgIH0pOworICBgYGAKKworICBVc2FnZQorCisgIGBgYGphdmFz
Y3JpcHQKKyAgdmFyIGF0dHIgPSBEUy5hdHRyOworICBBcHAuUmVxdWlyZW1lbnQgPSBEUy5Nb2Rl
bC5leHRlbmQoeworICAgIG5hbWU6IGF0dHIoJ3N0cmluZycpLAorICAgIG9wdGlvbnNBcnJheTog
YXR0cigncmF3JykKKyAgfSk7CisgIGBgYAorCisgIEBjbGFzcyBUcmFuc2Zvcm0KKyAgQG5hbWVz
cGFjZSBEUworICovCitEUy5UcmFuc2Zvcm0gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgLyoq
CisgICAgV2hlbiBnaXZlbiBhIGRlc2VyaWFsaXplZCB2YWx1ZSBmcm9tIGEgcmVjb3JkIGF0dHJp
YnV0ZSB0aGlzCisgICAgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzZXJpYWxpemVkIHZhbHVlLgor
CisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHNlcmlhbGl6ZTogZnVuY3Rp
b24oZGVzZXJpYWxpemVkKSB7CisgICAgICByZXR1cm4gRW1iZXIuaXNFbXB0eShkZXNlcmlhbGl6
ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOworICAgIH0KKyAgICBgYGAKKworICAg
IEBtZXRob2Qgc2VyaWFsaXplCisgICAgQHBhcmFtIGRlc2VyaWFsaXplZCBUaGUgZGVzZXJpYWxp
emVkIHZhbHVlCisgICAgQHJldHVybiBUaGUgc2VyaWFsaXplZCB2YWx1ZQorICAqLworICBzZXJp
YWxpemU6IEVtYmVyLnJlcXVpcmVkKCksCisKKyAgLyoqCisgICAgV2hlbiBnaXZlbiBhIHNlcmlh
bGl6ZSB2YWx1ZSBmcm9tIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRob2QgbXVzdAorICAgIHJldHVy
biB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGZvciB0aGUgcmVjb3JkIGF0dHJpYnV0ZS4KKworICAg
IEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24o
c2VyaWFsaXplZCkgeworICAgICAgcmV0dXJuIGVtcHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51
bWJlcihzZXJpYWxpemVkKTsKKyAgICB9CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGRlc2VyaWFs
aXplCisgICAgQHBhcmFtIHNlcmlhbGl6ZWQgVGhlIHNlcmlhbGl6ZWQgdmFsdWUKKyAgICBAcmV0
dXJuIFRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUKKyAgKi8KKyAgZGVzZXJpYWxpemU6IEVtYmVyLnJl
cXVpcmVkKCkKKworfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKKy8qKgorICBU
aGUgYERTLkJvb2xlYW5UcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBk
ZXNlcmlhbGl6ZQorICBib29sZWFuIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0YSByZWNvcmQgb2Jq
ZWN0cy4gVGhpcyB0cmFuc2Zvcm0gaXMKKyAgdXNlZCB3aGVuIGBib29sZWFuYCBpcyBwYXNzZWQg
YXMgdGhlIHR5cGUgcGFyYW1ldGVyIHRvIHRoZQorICBbRFMuYXR0cl0oLi4vLi4vZGF0YSNtZXRo
b2RfYXR0cikgZnVuY3Rpb24uCisKKyAgVXNhZ2UKKworICBgYGBqYXZhc2NyaXB0CisgIHZhciBh
dHRyID0gRFMuYXR0cjsKKyAgQXBwLlVzZXIgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgIGlzQWRt
aW46IGF0dHIoJ2Jvb2xlYW4nKSwKKyAgICBuYW1lOiBhdHRyKCdzdHJpbmcnKSwKKyAgICBlbWFp
bDogYXR0cignc3RyaW5nJykKKyAgfSk7CisgIGBgYAorCisgIEBjbGFzcyBCb29sZWFuVHJhbnNm
b3JtCisgIEBleHRlbmRzIERTLlRyYW5zZm9ybQorICBAbmFtZXNwYWNlIERTCisgKi8KK0RTLkJv
b2xlYW5UcmFuc2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKKyAgZGVzZXJpYWxpemU6IGZ1
bmN0aW9uKHNlcmlhbGl6ZWQpIHsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwor
CisgICAgaWYgKHR5cGUgPT09ICJib29sZWFuIikgeworICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7
CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAic3RyaW5nIikgeworICAgICAgcmV0dXJuIHNlcmlh
bGl6ZWQubWF0Y2goL150cnVlJHxedCR8XjEkL2kpICE9PSBudWxsOworICAgIH0gZWxzZSBpZiAo
dHlwZSA9PT0gIm51bWJlciIpIHsKKyAgICAgIHJldHVybiBzZXJpYWxpemVkID09PSAxOworICAg
IH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9LAorCisgIHNlcmlhbGl6
ZTogZnVuY3Rpb24oZGVzZXJpYWxpemVkKSB7CisgICAgcmV0dXJuIEJvb2xlYW4oZGVzZXJpYWxp
emVkKTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKKyAgVGhl
IGBEUy5EYXRlVHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJp
YWxpemUKKyAgZGF0ZSBhdHRyaWJ1dGVzIG9uIEVtYmVyIERhdGEgcmVjb3JkIG9iamVjdHMuIFRo
aXMgdHJhbnNmb3JtIGlzIHVzZWQKKyAgd2hlbiBgZGF0ZWAgaXMgcGFzc2VkIGFzIHRoZSB0eXBl
IHBhcmFtZXRlciB0byB0aGUKKyAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0dHIpIGZ1
bmN0aW9uLgorCisgIGBgYGphdmFzY3JpcHQKKyAgdmFyIGF0dHIgPSBEUy5hdHRyOworICBBcHAu
U2NvcmUgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKKyAg
ICBwbGF5ZXI6IERTLmJlbG9uZ3NUbygncGxheWVyJyksCisgICAgZGF0ZTogYXR0cignZGF0ZScp
CisgIH0pOworICBgYGAKKworICBAY2xhc3MgRGF0ZVRyYW5zZm9ybQorICBAZXh0ZW5kcyBEUy5U
cmFuc2Zvcm0KKyAgQG5hbWVzcGFjZSBEUworICovCitEUy5EYXRlVHJhbnNmb3JtID0gRFMuVHJh
bnNmb3JtLmV4dGVuZCh7CisKKyAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsK
KyAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOworCisgICAgaWYgKHR5cGUgPT09ICJz
dHJpbmciKSB7CisgICAgICByZXR1cm4gbmV3IERhdGUoRW1iZXIuRGF0ZS5wYXJzZShzZXJpYWxp
emVkKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAibnVtYmVyIikgeworICAgICAgcmV0dXJu
IG5ldyBEYXRlKHNlcmlhbGl6ZWQpOworICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZCA9PT0gbnVs
bCB8fCBzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHsKKyAgICAgIC8vIGlmIHRoZSB2YWx1ZSBp
cyBub3QgcHJlc2VudCBpbiB0aGUgZGF0YSwKKyAgICAgIC8vIHJldHVybiB1bmRlZmluZWQsIG5v
dCBudWxsLgorICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJl
dHVybiBudWxsOworICAgIH0KKyAgfSwKKworICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRhdGUpIHsK
KyAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgIC8vIFNlcmlhbGl6ZSBpdCBh
cyBhIG51bWJlciB0byBtYWludGFpbiBtaWxsaXNlY29uZCBwcmVjaXNpb24KKyAgICAgIHJldHVy
biBOdW1iZXIoZGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0K
KyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBlbXB0eSA9IEVt
YmVyLmlzRW1wdHk7CisvKioKKyAgVGhlIGBEUy5OdW1iZXJUcmFuc2Zvcm1gIGNsYXNzIGlzIHVz
ZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorICBudW1lcmljIGF0dHJpYnV0ZXMgb24g
RW1iZXIgRGF0YSByZWNvcmQgb2JqZWN0cy4gVGhpcyB0cmFuc2Zvcm0gaXMKKyAgdXNlZCB3aGVu
IGBudW1iZXJgIGlzIHBhc3NlZCBhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgdG8gdGhlCisgIFtEUy5h
dHRyXSguLi8uLi9kYXRhI21ldGhvZF9hdHRyKSBmdW5jdGlvbi4KKworICBVc2FnZQorCisgIGBg
YGphdmFzY3JpcHQKKyAgdmFyIGF0dHIgPSBEUy5hdHRyOworICBBcHAuU2NvcmUgPSBEUy5Nb2Rl
bC5leHRlbmQoeworICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKKyAgICBwbGF5ZXI6IERTLmJl
bG9uZ3NUbygncGxheWVyJyksCisgICAgZGF0ZTogYXR0cignZGF0ZScpCisgIH0pOworICBgYGAK
KworICBAY2xhc3MgTnVtYmVyVHJhbnNmb3JtCisgIEBleHRlbmRzIERTLlRyYW5zZm9ybQorICBA
bmFtZXNwYWNlIERTCisgKi8KK0RTLk51bWJlclRyYW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRl
bmQoeworCisgIGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7CisgICAgcmV0dXJu
IGVtcHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsKKyAgfSwKKwor
ICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgeworICAgIHJldHVybiBlbXB0eShk
ZXNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOworICB9Cit9KTsKKwor
fSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBub25lID0gRW1iZXIuaXNOb25lOworCisv
KioKKyAgVGhlIGBEUy5TdHJpbmdUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXpl
IGFuZCBkZXNlcmlhbGl6ZQorICBzdHJpbmcgYXR0cmlidXRlcyBvbiBFbWJlciBEYXRhIHJlY29y
ZCBvYmplY3RzLiBUaGlzIHRyYW5zZm9ybSBpcworICB1c2VkIHdoZW4gYHN0cmluZ2AgaXMgcGFz
c2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKKyAgW0RTLmF0dHJdKC4uLy4uL2RhdGEj
bWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgorCisgIFVzYWdlCisKKyAgYGBgamF2YXNjcmlwdAorICB2
YXIgYXR0ciA9IERTLmF0dHI7CisgIEFwcC5Vc2VyID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBp
c0FkbWluOiBhdHRyKCdib29sZWFuJyksCisgICAgbmFtZTogYXR0cignc3RyaW5nJyksCisgICAg
ZW1haWw6IGF0dHIoJ3N0cmluZycpCisgIH0pOworICBgYGAKKworICBAY2xhc3MgU3RyaW5nVHJh
bnNmb3JtCisgIEBleHRlbmRzIERTLlRyYW5zZm9ybQorICBAbmFtZXNwYWNlIERTCisgKi8KK0RT
LlN0cmluZ1RyYW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQoeworCisgIGRlc2VyaWFsaXpl
OiBmdW5jdGlvbihzZXJpYWxpemVkKSB7CisgICAgcmV0dXJuIG5vbmUoc2VyaWFsaXplZCkgPyBu
dWxsIDogU3RyaW5nKHNlcmlhbGl6ZWQpOworICB9LAorCisgIHNlcmlhbGl6ZTogZnVuY3Rpb24o
ZGVzZXJpYWxpemVkKSB7CisgICAgcmV0dXJuIG5vbmUoZGVzZXJpYWxpemVkKSA/IG51bGwgOiBT
dHJpbmcoZGVzZXJpYWxpemVkKTsKKyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlv
bigpIHsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorICBAbW9kdWxlIGVtYmVy
LWRhdGEKKyovCisKK3ZhciBzZXQgPSBFbWJlci5zZXQ7CisKKy8qCisgIFRoaXMgY29kZSByZWdp
c3RlcnMgYW4gaW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlvbi4KKworICBJZiBhbiBFbWJl
ci5qcyBkZXZlbG9wZXIgZGVmaW5lcyBhIHN1YmNsYXNzIG9mIERTLlN0b3JlIG9uIHRoZWlyIGFw
cGxpY2F0aW9uLAorICB0aGlzIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlIGl0
IGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBvbiB0aGUKKyAgcm91dGVyLgorCisgIEFkZGl0aW9uYWxs
eSwgYWZ0ZXIgYW4gYXBwbGljYXRpb24ncyBjb250cm9sbGVycyBoYXZlIGJlZW4gaW5qZWN0ZWQs
IHRoZXkgd2lsbAorICBlYWNoIGhhdmUgdGhlIHN0b3JlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZW0u
CisKKyAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMgYXBwbGljYXRpb24gd2l0aCB0
aGUgZm9sbG93aW5nIGNsYXNzZXM6CisKKyAgQXBwLlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKHsK
KyAgICBhZGFwdGVyOiAnY3VzdG9tJworICB9KTsKKworICBBcHAuUG9zdHNDb250cm9sbGVyID0g
RW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7CisgICAgLy8gLi4uCisgIH0pOworCisgIFdo
ZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLCBgQXBwLlN0b3JlYCB3aWxsIGF1dG9t
YXRpY2FsbHkgYmUKKyAgaW5zdGFudGlhdGVkLCBhbmQgdGhlIGluc3RhbmNlIG9mIGBBcHAuUG9z
dHNDb250cm9sbGVyYCB3aWxsIGhhdmUgaXRzIGBzdG9yZWAKKyAgcHJvcGVydHkgc2V0IHRvIHRo
YXQgaW5zdGFuY2UuCisKKyAgTm90ZSB0aGF0IHRoaXMgY29kZSB3aWxsIG9ubHkgYmUgcnVuIGlm
IHRoZSBgZW1iZXItYXBwbGljYXRpb25gIHBhY2thZ2UgaXMKKyAgbG9hZGVkLiBJZiBFbWJlciBE
YXRhIGlzIGJlaW5nIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgb3RoZXIgdGhhbiBhCisgIHR5cGlj
YWwgYXBwbGljYXRpb24gKGUuZy4sIG5vZGUuanMgd2hlcmUgb25seSBgZW1iZXItcnVudGltZWAg
aXMgYXZhaWxhYmxlKSwKKyAgdGhpcyBjb2RlIHdpbGwgYmUgaWdub3JlZC4KKyovCisKK0VtYmVy
Lm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgeworICBB
cHBsaWNhdGlvbi5pbml0aWFsaXplcih7CisgICAgbmFtZTogInN0b3JlIiwKKworICAgIGluaXRp
YWxpemU6IGZ1bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKKyAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRpb24uU3RvcmUgfHwgRFMuU3RvcmUp
OworCisgICAgICAvLyBhbGxvdyBvbGRlciBuYW1lcyB0byBiZSBsb29rZWQgdXAKKworICAgICAg
dmFyIHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7CisgICAgICBwcm94
eS5yZWdpc3RlckRlcHJlY2F0aW9ucyhbCisgICAgICAgIHtkZXByZWNhdGVkOiAnc2VyaWFsaXpl
cjpfZGVmYXVsdCcsICB2YWxpZDogJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnfSwKKyAgICAgICAge2Rl
cHJlY2F0ZWQ6ICdzZXJpYWxpemVyOl9yZXN0JywgICAgIHZhbGlkOiAnc2VyaWFsaXplcjotcmVz
dCd9LAorICAgICAgICB7ZGVwcmVjYXRlZDogJ2FkYXB0ZXI6X3Jlc3QnLCAgICAgICAgdmFsaWQ6
ICdhZGFwdGVyOi1yZXN0J30KKyAgICAgIF0pOworCisgICAgICAvLyBuZXcgZ28gZm9yd2FyZCBw
YXRocworICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnLCBE
Uy5KU09OU2VyaWFsaXplcik7CisgICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2VyaWFsaXpl
cjotcmVzdCcsIERTLlJFU1RTZXJpYWxpemVyKTsKKyAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVy
KCdhZGFwdGVyOi1yZXN0JywgRFMuUkVTVEFkYXB0ZXIpOworCisgICAgICAvLyBFYWdlcmx5IGdl
bmVyYXRlIHRoZSBzdG9yZSBzbyBkZWZhdWx0U3RvcmUgaXMgcG9wdWxhdGVkLgorICAgICAgLy8g
VE9ETzogRG8gdGhpcyBpbiBhIGZpbmlzaGVyIGhvb2sKKyAgICAgIGNvbnRhaW5lci5sb29rdXAo
J3N0b3JlOm1haW4nKTsKKyAgICB9CisgIH0pOworCisgIEFwcGxpY2F0aW9uLmluaXRpYWxpemVy
KHsKKyAgICBuYW1lOiAidHJhbnNmb3JtcyIsCisgICAgYmVmb3JlOiAic3RvcmUiLAorCisgICAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgeworICAgICAgYXBw
bGljYXRpb24ucmVnaXN0ZXIoJ3RyYW5zZm9ybTpib29sZWFuJywgRFMuQm9vbGVhblRyYW5zZm9y
bSk7CisgICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcigndHJhbnNmb3JtOmRhdGUnLCBEUy5EYXRl
VHJhbnNmb3JtKTsKKyAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06bnVtYmVy
JywgRFMuTnVtYmVyVHJhbnNmb3JtKTsKKyAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFu
c2Zvcm06c3RyaW5nJywgRFMuU3RyaW5nVHJhbnNmb3JtKTsKKyAgICB9CisgIH0pOworCisgIEFw
cGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICBuYW1lOiAiZGF0YS1hZGFwdGVyIiwKKyAgICBi
ZWZvcmU6ICJzdG9yZSIsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFw
cGxpY2F0aW9uKSB7CisgICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YS1hZGFwdGVyOm1h
aW4nLCBEUy5EZWJ1Z0FkYXB0ZXIpOworICAgIH0KKyAgfSk7CisKKyAgQXBwbGljYXRpb24uaW5p
dGlhbGl6ZXIoeworICAgIG5hbWU6ICJpbmplY3RTdG9yZSIsCisgICAgYmVmb3JlOiAic3RvcmUi
LAorCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewor
ICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdjb250cm9sbGVyJywgJ3N0b3JlJywgJ3N0b3JlOm1h
aW4nKTsKKyAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91dGUnLCAnc3RvcmUnLCAnc3RvcmU6
bWFpbicpOworICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdzZXJpYWxpemVyJywgJ3N0b3JlJywg
J3N0b3JlOm1haW4nKTsKKyAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgnZGF0YS1hZGFwdGVyJywg
J3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKKyAgICB9CisgIH0pOworCit9KTsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKy8qKgorICBAbW9kdWxlIGVtYmVyLWRhdGEKKyovCisKKy8qKgor
ICBEYXRlLnBhcnNlIHdpdGggcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQgZm9yIElTTyA4NjAxIDxo
dHRwczovL2dpdGh1Yi5jb20vY3Nub3Zlci9qcy1pc284NjAxPgorCisgIMKpIDIwMTEgQ29saW4g
U25vdmVyIDxodHRwOi8vemV0YWZsZWV0LmNvbT4KKworICBSZWxlYXNlZCB1bmRlciBNSVQgbGlj
ZW5zZS4KKworICBAY2xhc3MgRGF0ZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzdGF0aWMKKyov
CitFbWJlci5EYXRlID0gRW1iZXIuRGF0ZSB8fCB7fTsKKwordmFyIG9yaWdQYXJzZSA9IERhdGUu
cGFyc2UsIG51bWVyaWNLZXlzID0gWyAxLCA0LCA1LCA2LCA3LCAxMCwgMTEgXTsKKworLyoqCisg
IEBtZXRob2QgcGFyc2UKKyAgQHBhcmFtIGRhdGUKKyovCitFbWJlci5EYXRlLnBhcnNlID0gZnVu
Y3Rpb24gKGRhdGUpIHsKKyAgICB2YXIgdGltZXN0YW1wLCBzdHJ1Y3QsIG1pbnV0ZXNPZmZzZXQg
PSAwOworCisgICAgLy8gRVM1IMKnMTUuOS40LjIgc3RhdGVzIHRoYXQgdGhlIHN0cmluZyBzaG91
bGQgYXR0ZW1wdCB0byBiZSBwYXJzZWQgYXMgYSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdCBzdHJp
bmcKKyAgICAvLyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGFueSBpbXBsZW1lbnRhdGlvbi1zcGVj
aWZpYyBkYXRlIHBhcnNpbmcsIHNvIHRoYXTigJlzIHdoYXQgd2UgZG8sIGV2ZW4gaWYgbmF0aXZl
CisgICAgLy8gaW1wbGVtZW50YXRpb25zIGNvdWxkIGJlIGZhc3RlcgorICAgIC8vICAgICAgICAg
ICAgICAxIFlZWVkgICAgICAgICAgICAgICAgMiBNTSAgICAgICAzIEREICAgICAgICAgICA0IEhI
ICAgIDUgbW0gICAgICAgNiBzcyAgICAgICAgNyBtc2VjICAgICAgICA4IFogOSDCsSAgICAxMCB0
ekhIICAgIDExIHR6bW0KKyAgICBpZiAoKHN0cnVjdCA9IC9eKFxkezR9fFsrXC1dXGR7Nn0pKD86
LShcZHsyfSkoPzotKFxkezJ9KSk/KT8oPzpUKFxkezJ9KTooXGR7Mn0pKD86OihcZHsyfSkoPzpc
LihcZHszfSkpPyk/KD86KFopfChbK1wtXSkoXGR7Mn0pKD86OihcZHsyfSkpPyk/KT8kLy5leGVj
KGRhdGUpKSkgeworICAgICAgICAvLyBhdm9pZCBOYU4gdGltZXN0YW1wcyBjYXVzZWQgYnkg4oCc
dW5kZWZpbmVk4oCdIHZhbHVlcyBiZWluZyBwYXNzZWQgdG8gRGF0ZS5VVEMKKyAgICAgICAgZm9y
ICh2YXIgaSA9IDAsIGs7IChrID0gbnVtZXJpY0tleXNbaV0pOyArK2kpIHsKKyAgICAgICAgICAg
IHN0cnVjdFtrXSA9ICtzdHJ1Y3Rba10gfHwgMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFs
bG93IHVuZGVmaW5lZCBkYXlzIGFuZCBtb250aHMKKyAgICAgICAgc3RydWN0WzJdID0gKCtzdHJ1
Y3RbMl0gfHwgMSkgLSAxOworICAgICAgICBzdHJ1Y3RbM10gPSArc3RydWN0WzNdIHx8IDE7CisK
KyAgICAgICAgaWYgKHN0cnVjdFs4XSAhPT0gJ1onICYmIHN0cnVjdFs5XSAhPT0gdW5kZWZpbmVk
KSB7CisgICAgICAgICAgICBtaW51dGVzT2Zmc2V0ID0gc3RydWN0WzEwXSAqIDYwICsgc3RydWN0
WzExXTsKKworICAgICAgICAgICAgaWYgKHN0cnVjdFs5XSA9PT0gJysnKSB7CisgICAgICAgICAg
ICAgICAgbWludXRlc09mZnNldCA9IDAgLSBtaW51dGVzT2Zmc2V0OworICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5VVEMoc3RydWN0WzFdLCBzdHJ1
Y3RbMl0sIHN0cnVjdFszXSwgc3RydWN0WzRdLCBzdHJ1Y3RbNV0gKyBtaW51dGVzT2Zmc2V0LCBz
dHJ1Y3RbNl0sIHN0cnVjdFs3XSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lc3Rh
bXAgPSBvcmlnUGFyc2UgPyBvcmlnUGFyc2UoZGF0ZSkgOiBOYU47CisgICAgfQorCisgICAgcmV0
dXJuIHRpbWVzdGFtcDsKK307CisKK2lmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1
ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5EYXRlKSB7CisgIERhdGUucGFyc2UgPSBFbWJl
ci5EYXRlLnBhcnNlOworfQorCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFy
IGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgQSByZWNvcmQgYXJy
YXkgaXMgYW4gYXJyYXkgdGhhdCBjb250YWlucyByZWNvcmRzIG9mIGEgY2VydGFpbiB0eXBlLiBU
aGUgcmVjb3JkCisgIGFycmF5IG1hdGVyaWFsaXplcyByZWNvcmRzIGFzIG5lZWRlZCB3aGVuIHRo
ZXkgYXJlIHJldHJpZXZlZCBmb3IgdGhlIGZpcnN0CisgIHRpbWUuIFlvdSBzaG91bGQgbm90IGNy
ZWF0ZSByZWNvcmQgYXJyYXlzIHlvdXJzZWxmLiBJbnN0ZWFkLCBhbiBpbnN0YW5jZSBvZgorICBg
RFMuUmVjb3JkQXJyYXlgIG9yIGl0cyBzdWJjbGFzc2VzIHdpbGwgYmUgcmV0dXJuZWQgYnkgeW91
ciBhcHBsaWNhdGlvbidzIHN0b3JlCisgIGluIHJlc3BvbnNlIHRvIHF1ZXJpZXMuCisKKyAgQGNs
YXNzIFJlY29yZEFycmF5CisgIEBuYW1lc3BhY2UgRFMKKyAgQGV4dGVuZHMgRW1iZXIuQXJyYXlQ
cm94eQorICBAdXNlcyBFbWJlci5FdmVudGVkCisqLworCitEUy5SZWNvcmRBcnJheSA9IEVtYmVy
LkFycmF5UHJveHkuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKKyAgLyoqCisgICAgVGhlIG1vZGVs
IHR5cGUgY29udGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5LgorCisgICAgQHByb3BlcnR5IHR5
cGUKKyAgICBAdHlwZSBEUy5Nb2RlbAorICAqLworICB0eXBlOiBudWxsLAorCisgIC8qKgorICAg
IFRoZSBhcnJheSBvZiBjbGllbnQgaWRzIGJhY2tpbmcgdGhlIHJlY29yZCBhcnJheS4gV2hlbiBh
CisgICAgcmVjb3JkIGlzIHJlcXVlc3RlZCBmcm9tIHRoZSByZWNvcmQgYXJyYXksIHRoZSByZWNv
cmQKKyAgICBmb3IgdGhlIGNsaWVudCBpZCBhdCB0aGUgc2FtZSBpbmRleCBpcyBtYXRlcmlhbGl6
ZWQsIGlmCisgICAgbmVjZXNzYXJ5LCBieSB0aGUgc3RvcmUuCisKKyAgICBAcHJvcGVydHkgY29u
dGVudAorICAgIEBwcml2YXRlCisgICAgQHR5cGUgRW1iZXIuQXJyYXkKKyAgKi8KKyAgY29udGVu
dDogbnVsbCwKKworICAvKioKKyAgICBUaGUgZmxhZyB0byBzaWduYWwgYSBgUmVjb3JkQXJyYXlg
IGlzIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgdmFyIHBlb3BsZSA9IHN0b3JlLmFsbChBcHAuUGVyc29uKTsKKyAgICBwZW9w
bGUuZ2V0KCdpc0xvYWRlZCcpOyAvLyB0cnVlCisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgaXNM
b2FkZWQKKyAgICBAdHlwZSBCb29sZWFuCisgICovCisgIGlzTG9hZGVkOiBmYWxzZSwKKyAgLyoq
CisgICAgVGhlIGZsYWcgdG8gc2lnbmFsIGEgYFJlY29yZEFycmF5YCBpcyBjdXJyZW50bHkgbG9h
ZGluZyBkYXRhLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBw
ZW9wbGUgPSBzdG9yZS5hbGwoQXBwLlBlcnNvbik7CisgICAgcGVvcGxlLmdldCgnaXNVcGRhdGlu
ZycpOyAvLyBmYWxzZQorICAgIHBlb3BsZS51cGRhdGUoKTsKKyAgICBwZW9wbGUuZ2V0KCdpc1Vw
ZGF0aW5nJyk7IC8vIHRydWUKKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBpc1VwZGF0aW5nCisg
ICAgQHR5cGUgQm9vbGVhbgorICAqLworICBpc1VwZGF0aW5nOiBmYWxzZSwKKworICAvKioKKyAg
ICBUaGUgc3RvcmUgdGhhdCBjcmVhdGVkIHRoaXMgcmVjb3JkIGFycmF5LgorCisgICAgQHByb3Bl
cnR5IHN0b3JlCisgICAgQHByaXZhdGUKKyAgICBAdHlwZSBEUy5TdG9yZQorICAqLworICBzdG9y
ZTogbnVsbCwKKworICAvKioKKyAgICBSZXRyaWV2ZXMgYW4gb2JqZWN0IGZyb20gdGhlIGNvbnRl
bnQgYnkgaW5kZXguCisKKyAgICBAbWV0aG9kIG9iamVjdEF0Q29udGVudAorICAgIEBwcml2YXRl
CisgICAgQHBhcmFtIHtOdW1iZXJ9IGluZGV4CisgICAgQHJldHVybiB7RFMuTW9kZWx9IHJlY29y
ZAorICAqLworICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgdmFyIGNv
bnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKKworICAgIHJldHVybiBjb250ZW50Lm9iamVj
dEF0KGluZGV4KTsKKyAgfSwKKworICAvKioKKyAgICBVc2VkIHRvIGdldCB0aGUgbGF0ZXN0IHZl
cnNpb24gb2YgYWxsIG9mIHRoZSByZWNvcmRzIGluIHRoaXMgYXJyYXkKKyAgICBmcm9tIHRoZSBh
ZGFwdGVyLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwZW9w
bGUgPSBzdG9yZS5hbGwoQXBwLlBlcnNvbik7CisgICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycp
OyAvLyBmYWxzZQorICAgIHBlb3BsZS51cGRhdGUoKTsKKyAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0
aW5nJyk7IC8vIHRydWUKKyAgICBgYGAKKworICAgIEBtZXRob2QgdXBkYXRlCisgICovCisgIHVw
ZGF0ZTogZnVuY3Rpb24oKSB7CisgICAgaWYgKGdldCh0aGlzLCAnaXNVcGRhdGluZycpKSB7IHJl
dHVybjsgfQorCisgICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLAorICAgICAgICB0
eXBlID0gZ2V0KHRoaXMsICd0eXBlJyk7CisKKyAgICByZXR1cm4gc3RvcmUuZmV0Y2hBbGwodHlw
ZSwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAgQWRkcyBhIHJlY29yZCB0byB0aGUgYFJlY29y
ZEFycmF5YC4KKworICAgIEBtZXRob2QgYWRkUmVjb3JkCisgICAgQHByaXZhdGUKKyAgICBAcGFy
YW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgYWRkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQp
IHsKKyAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3QocmVjb3JkKTsKKyAgfSwKKwor
ICAvKioKKyAgICBSZW1vdmVzIGEgcmVjb3JkIHRvIHRoZSBgUmVjb3JkQXJyYXlgLgorCisgICAg
QG1ldGhvZCByZW1vdmVSZWNvcmQKKyAgICBAcHJpdmF0ZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9
IHJlY29yZAorICAqLworICByZW1vdmVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIGdl
dCh0aGlzLCAnY29udGVudCcpLnJlbW92ZU9iamVjdChyZWNvcmQpOworICB9LAorCisgIC8qKgor
ICAgIFNhdmVzIGFsbCBvZiB0aGUgcmVjb3JkcyBpbiB0aGUgYFJlY29yZEFycmF5YC4KKworICAg
IEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgbWVzc2FnZXMgPSBzdG9yZS5h
bGwoQXBwLk1lc3NhZ2UpOworICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkg
eworICAgICAgbWVzc2FnZS5zZXQoJ2hhc0JlZW5TZWVuJywgdHJ1ZSk7CisgICAgfSk7CisgICAg
bWVzc2FnZXMuc2F2ZSgpOworICAgIGBgYAorCisgICAgQG1ldGhvZCBzYXZlCisgICAgQHJldHVy
biB7RFMuUHJvbWlzZUFycmF5fSBwcm9taXNlCisgICovCisgIHNhdmU6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciBwcm9taXNlTGFiZWwgPSAiRFM6IFJlY29yZEFycmF5I3NhdmUgIiArIGdldCh0aGlz
LCAndHlwZScpOworICAgIHZhciBwcm9taXNlID0gRW1iZXIuUlNWUC5hbGwodGhpcy5pbnZva2Uo
InNhdmUiKSwgcHJvbWlzZUxhYmVsKS50aGVuKGZ1bmN0aW9uKGFycmF5KSB7CisgICAgICByZXR1
cm4gRW1iZXIuQShhcnJheSk7CisgICAgfSwgbnVsbCwgIkRTOiBSZWNvcmRBcnJheSNzYXZlIGFw
cGx5IEVtYmVyLk5hdGl2ZUFycmF5Iik7CisKKyAgICByZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNy
ZWF0ZSh7IHByb21pc2U6IHByb21pc2UgfSk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1
bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGdldCA9IEVt
YmVyLmdldDsKKworLyoqCisgIFJlcHJlc2VudHMgYSBsaXN0IG9mIHJlY29yZHMgd2hvc2UgbWVt
YmVyc2hpcCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICBzdG9yZS4gQXMgcmVjb3JkcyBhcmUgY3Jl
YXRlZCwgbG9hZGVkLCBvciBtb2RpZmllZCwgdGhlIHN0b3JlCisgIGV2YWx1YXRlcyB0aGVtIHRv
IGRldGVybWluZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQKKyAgYXJyYXku
CisKKyAgQGNsYXNzIEZpbHRlcmVkUmVjb3JkQXJyYXkKKyAgQG5hbWVzcGFjZSBEUworICBAZXh0
ZW5kcyBEUy5SZWNvcmRBcnJheQorKi8KK0RTLkZpbHRlcmVkUmVjb3JkQXJyYXkgPSBEUy5SZWNv
cmRBcnJheS5leHRlbmQoeworICAvKioKKyAgICBUaGUgZmlsdGVyRnVuY3Rpb24gaXMgYSBmdW5j
dGlvbiB1c2VkIHRvIHRlc3QgcmVjb3JkcyBmcm9tIHRoZSBzdG9yZSB0bworICAgIGRldGVybWlu
ZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQgYXJyYXkuCisKKyAgICBFeGFt
cGxlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFsbFBlb3BsZSA9IHN0b3JlLmFsbCgn
cGVyc29uJyk7CisgICAgYWxsUGVvcGxlLm1hcEJ5KCduYW1lJyk7IC8vIFsiVG9tIERhbGUiLCAi
WWVodWRhIEthdHoiLCAiVHJlayBHbG93YWNraSJdCisKKyAgICB2YXIgcGVvcGxlID0gc3RvcmUu
ZmlsdGVyKCdwZXJzb24nLCBmdW5jdGlvbihwZXJzb24pIHsKKyAgICAgIGlmIChwZXJzb24uZ2V0
KCduYW1lJykubWF0Y2goL0thdHokLykpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB9KTsKKyAgICBw
ZW9wbGUubWFwQnkoJ25hbWUnKTsgLy8gWyJZZWh1ZGEgS2F0eiJdCisKKyAgICB2YXIgbm90S2F0
ekZpbHRlciA9IGZ1bmN0aW9uKHBlcnNvbikgeworICAgICAgcmV0dXJuICFwZXJzb24uZ2V0KCdu
YW1lJykubWF0Y2goL0thdHokLyk7CisgICAgfTsKKyAgICBwZW9wbGUuc2V0KCdmaWx0ZXJGdW5j
dGlvbicsIG5vdEthdHpGaWx0ZXIpOworICAgIHBlb3BsZS5tYXBCeSgnbmFtZScpOyAvLyBbIlRv
bSBEYWxlIiwgIlRyZWsgR2xvd2Fja2kiXQorICAgIGBgYAorCisgICAgQG1ldGhvZCBmaWx0ZXJG
dW5jdGlvbgorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEByZXR1cm4ge0Jvb2xl
YW59IGB0cnVlYCBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbiB0aGUgYXJyYXkKKyAgKi8KKyAg
ZmlsdGVyRnVuY3Rpb246IG51bGwsCisgIGlzTG9hZGVkOiB0cnVlLAorCisgIHJlcGxhY2U6IGZ1
bmN0aW9uKCkgeworICAgIHZhciB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJykudG9TdHJpbmcoKTsK
KyAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSByZXN1bHQgb2YgYSBjbGllbnQtc2lkZSBmaWx0ZXIg
KG9uICIgKyB0eXBlICsgIikgaXMgaW1tdXRhYmxlLiIpOworICB9LAorCisgIC8qKgorICAgIEBt
ZXRob2QgdXBkYXRlRmlsdGVyCisgICAgQHByaXZhdGUKKyAgKi8KKyAgdXBkYXRlRmlsdGVyOiBF
bWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKKyAgICB2YXIgbWFuYWdlciA9IGdldCh0aGlzLCAn
bWFuYWdlcicpOworICAgIG1hbmFnZXIudXBkYXRlRmlsdGVyKHRoaXMsIGdldCh0aGlzLCAndHlw
ZScpLCBnZXQodGhpcywgJ2ZpbHRlckZ1bmN0aW9uJykpOworICB9LCAnZmlsdGVyRnVuY3Rpb24n
KQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJl
ci1kYXRhCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8q
KgorICBSZXByZXNlbnRzIGFuIG9yZGVyZWQgbGlzdCBvZiByZWNvcmRzIHdob3NlIG9yZGVyIGFu
ZCBtZW1iZXJzaGlwIGlzCisgIGRldGVybWluZWQgYnkgdGhlIGFkYXB0ZXIuIEZvciBleGFtcGxl
LCBhIHF1ZXJ5IHNlbnQgdG8gdGhlIGFkYXB0ZXIKKyAgbWF5IHRyaWdnZXIgYSBzZWFyY2ggb24g
dGhlIHNlcnZlciwgd2hvc2UgcmVzdWx0cyB3b3VsZCBiZSBsb2FkZWQKKyAgaW50byBhbiBpbnN0
YW5jZSBvZiB0aGUgYEFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheWAuCisKKyAgQGNsYXNzIEFk
YXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQorICBAbmFtZXNwYWNlIERTCisgIEBleHRlbmRzIERT
LlJlY29yZEFycmF5CisqLworRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5ID0gRFMuUmVj
b3JkQXJyYXkuZXh0ZW5kKHsKKyAgcXVlcnk6IG51bGwsCisKKyAgcmVwbGFjZTogZnVuY3Rpb24o
KSB7CisgICAgdmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmluZygpOworICAgIHRo
cm93IG5ldyBFcnJvcigiVGhlIHJlc3VsdCBvZiBhIHNlcnZlciBxdWVyeSAob24gIiArIHR5cGUg
KyAiKSBpcyBpbW11dGFibGUuIik7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBsb2FkCisg
ICAgQHByaXZhdGUKKyAgICBAcGFyYW0ge0FycmF5fSBkYXRhCisgICovCisgIGxvYWQ6IGZ1bmN0
aW9uKGRhdGEpIHsKKyAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCisgICAgICAg
IHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKSwKKyAgICAgICAgcmVjb3JkcyA9IHN0b3JlLnB1c2hN
YW55KHR5cGUsIGRhdGEpLAorICAgICAgICBtZXRhID0gc3RvcmUubWV0YWRhdGFGb3IodHlwZSk7
CisKKyAgICB0aGlzLnNldFByb3BlcnRpZXMoeworICAgICAgY29udGVudDogRW1iZXIuQShyZWNv
cmRzKSwKKyAgICAgIGlzTG9hZGVkOiB0cnVlLAorICAgICAgbWV0YTogbWV0YQorICAgIH0pOwor
CisgICAgLy8gVE9ETzogZG9lcyB0cmlnZ2VyaW5nIGRpZExvYWQgZXZlbnQgc2hvdWxkIGJlIHRo
ZSBsYXN0IGFjdGlvbiBvZiB0aGUgcnVuTG9vcD8KKyAgICBFbWJlci5ydW4ub25jZSh0aGlzLCAn
dHJpZ2dlcicsICdkaWRMb2FkJyk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0OwordmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7
CisKKy8qKgorICBBIGBNYW55QXJyYXlgIGlzIGEgYFJlY29yZEFycmF5YCB0aGF0IHJlcHJlc2Vu
dHMgdGhlIGNvbnRlbnRzIG9mIGEgaGFzLW1hbnkKKyAgcmVsYXRpb25zaGlwLgorCisgIFRoZSBg
TWFueUFycmF5YCBpcyBpbnN0YW50aWF0ZWQgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIHRoZSByZWxh
dGlvbnNoaXAgaXMKKyAgcmVxdWVzdGVkLgorCisgICMjIyBJbnZlcnNlcworCisgIE9mdGVuLCB0
aGUgcmVsYXRpb25zaGlwcyBpbiBFbWJlciBEYXRhIGFwcGxpY2F0aW9ucyB3aWxsIGhhdmUKKyAg
YW4gaW52ZXJzZS4gRm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyBtb2RlbHMgYXJl
CisgIGRlZmluZWQ6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuUG9zdCA9IERTLk1vZGVsLmV4
dGVuZCh7CisgICAgY29tbWVudHM6IERTLmhhc01hbnkoJ2NvbW1lbnQnKQorICB9KTsKKworICBB
cHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgcG9zdDogRFMuYmVsb25nc1RvKCdw
b3N0JykKKyAgfSk7CisgIGBgYAorCisgIElmIHlvdSBjcmVhdGVkIGEgbmV3IGluc3RhbmNlIG9m
IGBBcHAuUG9zdGAgYW5kIGFkZGVkCisgIGEgYEFwcC5Db21tZW50YCByZWNvcmQgdG8gaXRzIGBj
b21tZW50c2AgaGFzLW1hbnkKKyAgcmVsYXRpb25zaGlwLCB5b3Ugd291bGQgZXhwZWN0IHRoZSBj
b21tZW50J3MgYHBvc3RgCisgIHByb3BlcnR5IHRvIGJlIHNldCB0byB0aGUgcG9zdCB0aGF0IGNv
bnRhaW5lZAorICB0aGUgaGFzLW1hbnkuCisKKyAgV2UgY2FsbCB0aGUgcmVjb3JkIHRvIHdoaWNo
IGEgcmVsYXRpb25zaGlwIGJlbG9uZ3MgdGhlCisgIHJlbGF0aW9uc2hpcCdzIF9vd25lcl8uCisK
KyAgQGNsYXNzIE1hbnlBcnJheQorICBAbmFtZXNwYWNlIERTCisgIEBleHRlbmRzIERTLlJlY29y
ZEFycmF5CisqLworRFMuTWFueUFycmF5ID0gRFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKKyAgaW5p
dDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
KyAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jID0gRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKKyAg
fSwKKworICAvKioKKyAgICBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCisK
KyAgICBAcHJvcGVydHkge1N0cmluZ30gbmFtZQorICAgIEBwcml2YXRlCisgICovCisgIG5hbWU6
IG51bGwsCisKKyAgLyoqCisgICAgVGhlIHJlY29yZCB0byB3aGljaCB0aGlzIHJlbGF0aW9uc2hp
cCBiZWxvbmdzLgorCisgICAgQHByb3BlcnR5IHtEUy5Nb2RlbH0gb3duZXIKKyAgICBAcHJpdmF0
ZQorICAqLworICBvd25lcjogbnVsbCwKKworICAvKioKKyAgICBgdHJ1ZWAgaWYgdGhlIHJlbGF0
aW9uc2hpcCBpcyBwb2x5bW9ycGhpYywgYGZhbHNlYCBvdGhlcndpc2UuCisKKyAgICBAcHJvcGVy
dHkge0Jvb2xlYW59IGlzUG9seW1vcnBoaWMKKyAgICBAcHJpdmF0ZQorICAqLworICBpc1BvbHlt
b3JwaGljOiBmYWxzZSwKKworICAvLyBMT0FESU5HIFNUQVRFCisKKyAgaXNMb2FkZWQ6IGZhbHNl
LAorCisgIC8qKgorICAgIFVzZWQgZm9yIGFzeW5jIGBoYXNNYW55YCBhcnJheXMKKyAgICB0byBr
ZWVwIHRyYWNrIG9mIHdoZW4gdGhleSB3aWxsIHJlc29sdmUuCisKKyAgICBAcHJvcGVydHkge0Vt
YmVyLlJTVlAuUHJvbWlzZX0gcHJvbWlzZQorICAgIEBwcml2YXRlCisgICovCisgIHByb21pc2U6
IG51bGwsCisKKyAgLyoqCisgICAgQG1ldGhvZCBsb2FkaW5nUmVjb3Jkc0NvdW50CisgICAgQHBh
cmFtIHtOdW1iZXJ9IGNvdW50CisgICAgQHByaXZhdGUKKyAgKi8KKyAgbG9hZGluZ1JlY29yZHND
b3VudDogZnVuY3Rpb24oY291bnQpIHsKKyAgICB0aGlzLmxvYWRpbmdSZWNvcmRzQ291bnQgPSBj
b3VudDsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIGxvYWRlZFJlY29yZAorICAgIEBwcml2
YXRlCisgICovCisgIGxvYWRlZFJlY29yZDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5sb2FkaW5n
UmVjb3Jkc0NvdW50LS07CisgICAgaWYgKHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9PT0gMCkg
eworICAgICAgc2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOworICAgICAgdGhpcy50cmlnZ2Vy
KCdkaWRMb2FkJyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgZmV0Y2gKKyAg
ICBAcHJpdmF0ZQorICAqLworICBmZXRjaDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlY29yZHMg
PSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKKyAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3Jl
JyksCisgICAgICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAorICAgICAgICByZXNvbHZl
ciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBNYW55QXJyYXkjZmV0Y2ggIiArIGdldCh0aGlzLCAn
dHlwZScpKTsKKworICAgIHZhciB1bmxvYWRlZFJlY29yZHMgPSByZWNvcmRzLmZpbHRlclByb3Bl
cnR5KCdpc0VtcHR5JywgdHJ1ZSk7CisgICAgc3RvcmUuZmV0Y2hNYW55KHVubG9hZGVkUmVjb3Jk
cywgb3duZXIsIHJlc29sdmVyKTsKKyAgfSwKKworICAvLyBPdmVycmlkZXMgRW1iZXIuQXJyYXkn
cyByZXBsYWNlIG1ldGhvZCB0byBpbXBsZW1lbnQKKyAgcmVwbGFjZUNvbnRlbnQ6IGZ1bmN0aW9u
KGluZGV4LCByZW1vdmVkLCBhZGRlZCkgeworICAgIC8vIE1hcCB0aGUgYXJyYXkgb2YgcmVjb3Jk
IG9iamVjdHMgaW50byBhbiBhcnJheSBvZiAgY2xpZW50IGlkcy4KKyAgICBhZGRlZCA9IG1hcChh
ZGRlZCwgZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3Qg
YWRkICciICsgcmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMg
cmVsYXRpb25zaGlwIChvbmx5ICciICsgdGhpcy50eXBlLnR5cGVLZXkgKyAiJyBhbGxvd2VkKSIs
ICF0aGlzLnR5cGUgfHwgcmVjb3JkIGluc3RhbmNlb2YgdGhpcy50eXBlKTsKKyAgICAgIHJldHVy
biByZWNvcmQ7CisgICAgfSwgdGhpcyk7CisKKyAgICB0aGlzLl9zdXBlcihpbmRleCwgcmVtb3Zl
ZCwgYWRkZWQpOworICB9LAorCisgIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24o
KSB7CisgICAgRW1iZXIucnVuLm9uY2UodGhpcywgJ2ZldGNoJyk7CisgIH0sCisKKyAgYXJyYXlD
b250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZWQsIGFkZGVkKSB7CisgICAg
dmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAorICAgICAgICBuYW1lID0gZ2V0KHRoaXMs
ICduYW1lJyk7CisKKyAgICBpZiAoIW93bmVyLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzKSB7Cisg
ICAgICAvLyBUaGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2YgY29kZSB0aGF0IGNvbnRpbnVl
cyBpbnNpZGUKKyAgICAgIC8vIG9mIGFycmF5Q29udGVudERpZENoYW5nZS4gSXQgZ2V0cyBvciBj
cmVhdGVzIGEgY2hhbmdlIGZyb20KKyAgICAgIC8vIHRoZSBjaGlsZCBvYmplY3QsIGFkZHMgdGhl
IGN1cnJlbnQgb3duZXIgYXMgdGhlIG9sZAorICAgICAgLy8gcGFyZW50IGlmIHRoaXMgaXMgdGhl
IGZpcnN0IHRpbWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAorICAgICAgLy8gZnJvbSBhIE1hbnlB
cnJheSwgYW5kIHNldHMgYG5ld1BhcmVudGAgdG8gbnVsbC4KKyAgICAgIC8vCisgICAgICAvLyBM
YXRlciwgaWYgdGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVyIE1hbnlBcnJheSwKKyAgICAg
IC8vIHRoZSBgYXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3aWxsIHNldCBgbmV3UGFyZW50YCBvbgor
ICAgICAgLy8gdGhlIGNoYW5nZS4KKyAgICAgIGZvciAodmFyIGk9aW5kZXg7IGk8aW5kZXgrcmVt
b3ZlZDsgaSsrKSB7CisgICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5v
YmplY3RBdChpKTsKKworICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdl
LmNyZWF0ZUNoYW5nZShvd25lciwgcmVjb3JkLCBnZXQodGhpcywgJ3N0b3JlJyksIHsKKyAgICAg
ICAgICBwYXJlbnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwKKyAgICAgICAgICBjaGFuZ2VUeXBl
OiAicmVtb3ZlIiwKKyAgICAgICAgICBraW5kOiAiaGFzTWFueSIsCisgICAgICAgICAga2V5OiBu
YW1lCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuYWRkKGNoYW5n
ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7CisgIH0sCisKKyAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihp
bmRleCwgcmVtb3ZlZCwgYWRkZWQpIHsKKyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworCisgICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAorICAgICAgICBu
YW1lID0gZ2V0KHRoaXMsICduYW1lJyksCisgICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9y
ZScpOworCisgICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcykgeworICAgICAg
Ly8gVGhpcyBjb2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBjb2RlIHRoYXQgc3RhcnRlZCBpbgor
ICAgICAgLy8gYGFycmF5Q29udGVudFdpbGxDaGFuZ2VgLiBJdCBnZXRzIG9yIGNyZWF0ZXMgYSBj
aGFuZ2UKKyAgICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwgYW5kIGFkZHMgdGhlIGN1cnJl
bnQgb3duZXIgYXMKKyAgICAgIC8vIHRoZSBuZXcgcGFyZW50LgorICAgICAgZm9yICh2YXIgaT1p
bmRleDsgaTxpbmRleCthZGRlZDsgaSsrKSB7CisgICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhp
cywgJ2NvbnRlbnQnKS5vYmplY3RBdChpKTsKKworICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVs
YXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lciwgcmVjb3JkLCBzdG9yZSwgeworICAg
ICAgICAgIHBhcmVudFR5cGU6IG93bmVyLmNvbnN0cnVjdG9yLAorICAgICAgICAgIGNoYW5nZVR5
cGU6ICJhZGQiLAorICAgICAgICAgIGtpbmQ6Imhhc01hbnkiLAorICAgICAgICAgIGtleTogbmFt
ZQorICAgICAgICB9KTsKKyAgICAgICAgY2hhbmdlLmhhc01hbnlOYW1lID0gbmFtZTsKKworICAg
ICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2UpOworICAgICAgfQorCisgICAgICAv
LyBXZSB3YWl0IHVudGlsIHRoZSBhcnJheSBoYXMgZmluaXNoZWQgYmVpbmcKKyAgICAgIC8vIG11
dGF0ZWQgYmVmb3JlIHN5bmNpbmcgdGhlIE9uZVRvTWFueUNoYW5nZXMgY3JlYXRlZAorICAgICAg
Ly8gaW4gYXJyYXlDb250ZW50V2lsbENoYW5nZSwgc28gdGhhdCB0aGUgYXJyYXkKKyAgICAgIC8v
IG1lbWJlcnNoaXAgdGVzdCBpbiB0aGUgc3luYygpIGxvZ2ljIG9wZXJhdGVzCisgICAgICAvLyBv
biB0aGUgZmluYWwgcmVzdWx0cy4KKyAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuZm9yRWFjaChm
dW5jdGlvbihjaGFuZ2UpIHsKKyAgICAgICAgY2hhbmdlLnN5bmMoKTsKKyAgICAgIH0pOworCisg
ICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7CisgICAgfQorICB9LAorCisgIC8qKgor
ICAgIENyZWF0ZSBhIGNoaWxkIHJlY29yZCB3aXRoaW4gdGhlIG93bmVyCisKKyAgICBAbWV0aG9k
IGNyZWF0ZVJlY29yZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKKyAg
ICBAcmV0dXJuIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIGNyZWF0ZVJlY29yZDogZnVuY3Rp
b24oaGFzaCkgeworICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKSwKKyAgICAgICAg
c3RvcmUgPSBnZXQob3duZXIsICdzdG9yZScpLAorICAgICAgICB0eXBlID0gZ2V0KHRoaXMsICd0
eXBlJyksCisgICAgICAgIHJlY29yZDsKKworICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBh
ZGQgJyIgKyB0eXBlLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcG9seW1vcnBoaWMgcmVs
YXRpb25zaGlwLiIsICFnZXQodGhpcywgJ2lzUG9seW1vcnBoaWMnKSk7CisKKyAgICByZWNvcmQg
PSBzdG9yZS5jcmVhdGVSZWNvcmQuY2FsbChzdG9yZSwgdHlwZSwgaGFzaCk7CisgICAgdGhpcy5w
dXNoT2JqZWN0KHJlY29yZCk7CisKKyAgICByZXR1cm4gcmVjb3JkOworICB9CisKK30pOworCit9
KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8K
KworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qZ2xvYmFscyBFbWJlciovCisvKmpzaGlu
dCBlcW51bGw6dHJ1ZSovCisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCit2YXIgZ2V0
ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cit2YXIgb25jZSA9IEVtYmVyLnJ1bi5vbmNl
OwordmFyIGlzTm9uZSA9IEVtYmVyLmlzTm9uZTsKK3ZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVy
YWJsZVV0aWxzLmZvckVhY2g7Cit2YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5p
bmRleE9mOwordmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Cit2YXIgcmVzb2x2
ZSA9IEVtYmVyLlJTVlAucmVzb2x2ZTsKK3ZhciBjb3B5ID0gRW1iZXIuY29weTsKKworLy8gSW1w
bGVtZW50b3JzIE5vdGU6CisvLworLy8gICBUaGUgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBhcmUg
Y29uc2lzdGVudGx5IG5hbWVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisvLyAgIHNjaGVt
ZToKKy8vCisvLyAgICogK2lkKyBtZWFucyBhbiBpZGVudGlmaWVyIG1hbmFnZWQgYnkgYW4gZXh0
ZXJuYWwgc291cmNlLCBwcm92aWRlZCBpbnNpZGUKKy8vICAgICB0aGUgZGF0YSBwcm92aWRlZCBi
eSB0aGF0IHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJlIHN0cmluZ3MKKy8v
ICAgICBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LgorLy8gICAqICtjbGllbnRJZCsgbWVh
bnMgYSB0cmFuc2llbnQgbnVtZXJpY2FsIGlkZW50aWZpZXIgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUg
YnkKKy8vICAgICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50IHByaW1hcmlseSBiZWNh
dXNlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cyBtYXkKKy8vICAgICBub3QgeWV0IGhhdmUgYW4gZXh0
ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCisvLyAgICogK3JlZmVyZW5jZSsgbWVhbnMgYSByZWNvcmQg
cmVmZXJlbmNlIG9iamVjdCwgd2hpY2ggaG9sZHMgbWV0YWRhdGEgYWJvdXQgYQorLy8gICAgIHJl
Y29yZCwgZXZlbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IG1hdGVyaWFsaXplZC4KKy8v
ICAgKiArdHlwZSsgbWVhbnMgYSBzdWJjbGFzcyBvZiBEUy5Nb2RlbC4KKworLy8gVXNlZCBieSB0
aGUgc3RvcmUgdG8gbm9ybWFsaXplIElEcyBlbnRlcmluZyB0aGUgc3RvcmUuICBEZXNwaXRlIHRo
ZSBmYWN0CisvLyB0aGF0IGRldmVsb3BlcnMgbWF5IHByb3ZpZGUgSURzIGFzIG51bWJlcnMgKGUu
Zy4sIGBzdG9yZS5maW5kKFBlcnNvbiwgMSlgKSwKKy8vIGl0IGlzIGltcG9ydGFudCB0aGF0IGlu
dGVybmFsbHkgd2UgdXNlIHN0cmluZ3MsIHNpbmNlIElEcyBtYXkgYmUgc2VyaWFsaXplZAorLy8g
YW5kIGxvc2UgdHlwZSBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBFbWJlcidzIHJvdXRlciBt
YXkgcHV0IGEgcmVjb3JkJ3MKKy8vIElEIGludG8gdGhlIFVSTCwgYW5kIGlmIHdlIGxhdGVyIHRy
eSB0byBkZXNlcmlhbGl6ZSB0aGF0IFVSTCBhbmQgZmluZCB0aGUKKy8vIGNvcnJlc3BvbmRpbmcg
cmVjb3JkLCB3ZSB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGEgc3RyaW5nIG9yIGEgbnVtYmVyLgor
dmFyIGNvZXJjZUlkID0gZnVuY3Rpb24oaWQpIHsKKyAgcmV0dXJuIGlkID09IG51bGwgPyBudWxs
IDogaWQrJyc7Cit9OworCisvKioKKyAgVGhlIHN0b3JlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0
YSBmb3IgcmVjb3JkcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgorICBJdCBpcyBhbHNvIHJlc3Bv
bnNpYmxlIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYERTLk1vZGVsYCB0aGF0IHdyYXAKKyAg
dGhlIGluZGl2aWR1YWwgZGF0YSBmb3IgYSByZWNvcmQsIHNvIHRoYXQgdGhleSBjYW4gYmUgYm91
bmQgdG8gaW4geW91cgorICBIYW5kbGViYXJzIHRlbXBsYXRlcy4KKworICBEZWZpbmUgeW91ciBh
cHBsaWNhdGlvbidzIHN0b3JlIGxpa2UgdGhpczoKKworICBgYGBqYXZhc2NyaXB0CisgIE15QXBw
LlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKCk7CisgIGBgYAorCisgIE1vc3QgRW1iZXIuanMgYXBw
bGljYXRpb25zIHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIGBEUy5TdG9yZWAgdGhhdCBpcworICBh
dXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlaXIgYEVtYmVyLkFwcGxpY2F0aW9uYC4KKworICBZ
b3UgY2FuIHJldHJpZXZlIG1vZGVscyBmcm9tIHRoZSBzdG9yZSBpbiBzZXZlcmFsIHdheXMuIFRv
IHJldHJpZXZlIGEgcmVjb3JkCisgIGZvciBhIHNwZWNpZmljIGlkLCB1c2UgYERTLlN0b3JlYCdz
IGBmaW5kKClgIG1ldGhvZDoKKworICBgYGBqYXZhc2NyaXB0CisgIHZhciBwZXJzb24gPSBzdG9y
ZS5maW5kKCdwZXJzb24nLCAxMjMpOworICBgYGAKKworICBJZiB5b3VyIGFwcGxpY2F0aW9uIGhh
cyBtdWx0aXBsZSBgRFMuU3RvcmVgIGluc3RhbmNlcyAoYW4gdW51c3VhbCBjYXNlKSwgeW91IGNh
bgorICBzcGVjaWZ5IHdoaWNoIHN0b3JlIHNob3VsZCBiZSB1c2VkOgorCisgIGBgYGphdmFzY3Jp
cHQKKyAgdmFyIHBlcnNvbiA9IHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgMTIzKTsKKyAgYGBgCisK
KyAgQnkgZGVmYXVsdCwgdGhlIHN0b3JlIHdpbGwgdGFsayB0byB5b3VyIGJhY2tlbmQgdXNpbmcg
YSBzdGFuZGFyZAorICBSRVNUIG1lY2hhbmlzbS4gWW91IGNhbiBjdXN0b21pemUgaG93IHRoZSBz
dG9yZSB0YWxrcyB0byB5b3VyCisgIGJhY2tlbmQgYnkgc3BlY2lmeWluZyBhIGN1c3RvbSBhZGFw
dGVyOgorCisgIGBgYGphdmFzY3JpcHQKKyAgIE15QXBwLnN0b3JlID0gRFMuU3RvcmUuY3JlYXRl
KHsKKyAgICAgYWRhcHRlcjogJ015QXBwLkN1c3RvbUFkYXB0ZXInCisgICB9KTsKKyAgIGBgYAor
CisgIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCB3cml0aW5nIGEgY3VzdG9tIGFkYXB0ZXIgYnkg
cmVhZGluZyB0aGUgYERTLkFkYXB0ZXJgCisgIGRvY3VtZW50YXRpb24uCisKKyAgQGNsYXNzIFN0
b3JlCisgIEBuYW1lc3BhY2UgRFMKKyAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisqLworRFMuU3Rv
cmUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKworICAvKioKKyAgICBAbWV0aG9kIGluaXQKKyAg
ICBAcHJpdmF0ZQorICAqLworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICAvLyBpbnRlcm5hbCBi
b29ra2VlcGluZzsgbm90IG9ic2VydmFibGUKKyAgICB0aGlzLnR5cGVNYXBzID0ge307CisgICAg
dGhpcy5yZWNvcmRBcnJheU1hbmFnZXIgPSBEUy5SZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlKHsK
KyAgICAgIHN0b3JlOiB0aGlzCisgICAgfSk7CisgICAgdGhpcy5fcmVsYXRpb25zaGlwQ2hhbmdl
cyA9IHt9OworICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107CisgIH0sCisKKyAgLyoqCisgICAg
VGhlIGFkYXB0ZXIgdG8gdXNlIHRvIGNvbW11bmljYXRlIHRvIGEgYmFja2VuZCBzZXJ2ZXIgb3Ig
b3RoZXIgcGVyc2lzdGVuY2UgbGF5ZXIuCisKKyAgICBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMg
YW4gaW5zdGFuY2UsIGNsYXNzLCBvciBzdHJpbmcuCisKKyAgICBJZiB5b3Ugd2FudCB0byBzcGVj
aWZ5IGBBcHAuQ3VzdG9tQWRhcHRlcmAgYXMgYSBzdHJpbmcsIGRvOgorCisgICAgYGBganMKKyAg
ICBhZGFwdGVyOiAnY3VzdG9tJworICAgIGBgYAorCisgICAgQHByb3BlcnR5IGFkYXB0ZXIKKyAg
ICBAZGVmYXVsdCBEUy5SRVNUQWRhcHRlcgorICAgIEB0eXBlIHtEUy5BZGFwdGVyfFN0cmluZ30K
KyAgKi8KKyAgYWRhcHRlcjogJy1yZXN0JywKKworICAvKioKKyAgICBSZXR1cm5zIGEgSlNPTiBy
ZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIGEgY3VzdG9tCisgICAgdHlwZS1zcGVj
aWZpYyBzZXJpYWxpemVyLCBpZiBvbmUgZXhpc3RzLgorCisgICAgVGhlIGF2YWlsYWJsZSBvcHRp
b25zIGFyZToKKworICAgICogYGluY2x1ZGVJZGA6IGB0cnVlYCBpZiB0aGUgcmVjb3JkJ3MgSUQg
c2hvdWxkIGJlIGluY2x1ZGVkIGluCisgICAgICB0aGUgSlNPTiByZXByZXNlbnRhdGlvbgorCisg
ICAgQG1ldGhvZCBzZXJpYWxpemUKKyAgICBAcHJpdmF0ZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9
IHJlY29yZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRp
b25zIGFuIG9wdGlvbnMgaGFzaAorICAqLworICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
b3B0aW9ucykgeworICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXJGb3IocmVjb3JkLmNvbnN0cnVj
dG9yLnR5cGVLZXkpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOworICB9LAorCisgIC8qKgor
ICAgIFRoaXMgcHJvcGVydHkgcmV0dXJucyB0aGUgYWRhcHRlciwgYWZ0ZXIgcmVzb2x2aW5nIGEg
cG9zc2libGUKKyAgICBzdHJpbmcga2V5LgorCisgICAgSWYgdGhlIHN1cHBsaWVkIGBhZGFwdGVy
YCB3YXMgYSBjbGFzcywgb3IgYSBTdHJpbmcgcHJvcGVydHkKKyAgICBwYXRoIHJlc29sdmVkIHRv
IGEgY2xhc3MsIHRoaXMgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZSB0aGUKKyAgICBjbGFzcy4K
KworICAgIFRoaXMgcHJvcGVydHkgaXMgY2FjaGVhYmxlLCBzbyB0aGUgc2FtZSBpbnN0YW5jZSBv
ZiBhIHNwZWNpZmllZAorICAgIGFkYXB0ZXIgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBs
aWZldGltZSBvZiB0aGUgc3RvcmUuCisKKyAgICBAcHJvcGVydHkgZGVmYXVsdEFkYXB0ZXIKKyAg
ICBAcHJpdmF0ZQorICAgIEByZXR1cm5zIERTLkFkYXB0ZXIKKyAgKi8KKyAgZGVmYXVsdEFkYXB0
ZXI6IEVtYmVyLmNvbXB1dGVkKCdhZGFwdGVyJywgZnVuY3Rpb24oKSB7CisgICAgdmFyIGFkYXB0
ZXIgPSBnZXQodGhpcywgJ2FkYXB0ZXInKTsKKworICAgIEVtYmVyLmFzc2VydCgnWW91IHRyaWVk
IHRvIHNldCBgYWRhcHRlcmAgcHJvcGVydHkgdG8gYW4gaW5zdGFuY2Ugb2YgYERTLkFkYXB0ZXJg
LCB3aGVyZSBpdCBzaG91bGQgYmUgYSBuYW1lIG9yIGEgZmFjdG9yeScsICEoYWRhcHRlciBpbnN0
YW5jZW9mIERTLkFkYXB0ZXIpKTsKKworICAgIGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ3N0cmlu
ZycpIHsKKyAgICAgIGFkYXB0ZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyAr
IGFkYXB0ZXIpIHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicp
IHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjotcmVzdCcpOworICAgIH0KKworICAg
IGlmIChEUy5BZGFwdGVyLmRldGVjdChhZGFwdGVyKSkgeworICAgICAgYWRhcHRlciA9IGFkYXB0
ZXIuY3JlYXRlKHsgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciB9KTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gYWRhcHRlcjsKKyAgfSksCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8v
IC4gQ1JFQVRFIE5FVyBSRUNPUkQgLgorICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworICAv
KioKKyAgICBDcmVhdGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJyZW50IHN0b3JlLiBUaGUgcHJv
cGVydGllcyBwYXNzZWQKKyAgICB0byB0aGlzIG1ldGhvZCBhcmUgc2V0IG9uIHRoZSBuZXdseSBj
cmVhdGVkIHJlY29yZC4KKworICAgIFRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBgQXBwLlBv
c3RgOgorCisgICAgYGBganMKKyAgICBzdG9yZS5jcmVhdGVSZWNvcmQoJ3Bvc3QnLCB7CisgICAg
ICB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0
aG9kIGNyZWF0ZVJlY29yZAorICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgQHBhcmFtIHtP
YmplY3R9IHByb3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZQorICAg
ICAgbmV3bHkgY3JlYXRlZCByZWNvcmQuCisgICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQK
KyAgKi8KKyAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0aWVzKSB7CisgICAg
dHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CisKKyAgICBwcm9wZXJ0aWVzID0gY29weShwcm9w
ZXJ0aWVzKSB8fCB7fTsKKworICAgIC8vIElmIHRoZSBwYXNzZWQgcHJvcGVydGllcyBkbyBub3Qg
aW5jbHVkZSBhIHByaW1hcnkga2V5LAorICAgIC8vIGdpdmUgdGhlIGFkYXB0ZXIgYW4gb3Bwb3J0
dW5pdHkgdG8gZ2VuZXJhdGUgb25lLiBUeXBpY2FsbHksCisgICAgLy8gY2xpZW50LXNpZGUgSUQg
Z2VuZXJhdG9ycyB3aWxsIHVzZSBzb21ldGhpbmcgbGlrZSB1dWlkLmpzCisgICAgLy8gdG8gYXZv
aWQgY29uZmxpY3RzLgorCisgICAgaWYgKGlzTm9uZShwcm9wZXJ0aWVzLmlkKSkgeworICAgICAg
cHJvcGVydGllcy5pZCA9IHRoaXMuX2dlbmVyYXRlSWQodHlwZSk7CisgICAgfQorCisgICAgLy8g
Q29lcmNlIElEIHRvIGEgc3RyaW5nCisgICAgcHJvcGVydGllcy5pZCA9IGNvZXJjZUlkKHByb3Bl
cnRpZXMuaWQpOworCisgICAgdmFyIHJlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQodHlwZSwgcHJv
cGVydGllcy5pZCk7CisKKyAgICAvLyBNb3ZlIHRoZSByZWNvcmQgb3V0IG9mIGl0cyBpbml0aWFs
IGBlbXB0eWAgc3RhdGUgaW50bworICAgIC8vIHRoZSBgbG9hZGVkYCBzdGF0ZS4KKyAgICByZWNv
cmQubG9hZGVkRGF0YSgpOworCisgICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBv
biB0aGUgcmVjb3JkLgorICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisg
ICAgcmV0dXJuIHJlY29yZDsKKyAgfSwKKworICAvKioKKyAgICBJZiBwb3NzaWJsZSwgdGhpcyBt
ZXRob2QgYXNrcyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBhbiBJRCBmb3IKKyAgICBhIG5ld2x5
IGNyZWF0ZWQgcmVjb3JkLgorCisgICAgQG1ldGhvZCBfZ2VuZXJhdGVJZAorICAgIEBwcml2YXRl
CisgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKKyAgICBAcmV0dXJucyB7U3RyaW5nfSBpZiB0aGUg
YWRhcHRlciBjYW4gZ2VuZXJhdGUgb25lLCBhbiBJRAorICAqLworICBfZ2VuZXJhdGVJZDogZnVu
Y3Rpb24odHlwZSkgeworICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwor
CisgICAgaWYgKGFkYXB0ZXIgJiYgYWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKSB7CisgICAg
ICByZXR1cm4gYWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKHRoaXMpOworICAgIH0KKworICAg
IHJldHVybiBudWxsOworICB9LAorCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIC4gREVM
RVRFIFJFQ09SRCAuCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uCisKKyAgLyoqCisgICAgRm9yIHN5
bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgZGVsZXRlZCB2aWEgdGhlIHN0b3JlLgorCisgICAgRXhh
bXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwb3N0ID0gc3RvcmUuY3JlYXRlUmVj
b3JkKCdwb3N0JywgeworICAgICAgdGl0bGU6ICJSYWlscyBpcyBvbWFrYXNlIgorICAgIH0pOwor
CisgICAgc3RvcmUuZGVsZXRlUmVjb3JkKHBvc3QpOworICAgIGBgYAorCisgICAgQG1ldGhvZCBk
ZWxldGVSZWNvcmQKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgZGVsZXRl
UmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7Cisg
IH0sCisKKyAgLyoqCisgICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgdW5sb2FkZWQg
dmlhIHRoZSBzdG9yZS4gT25seQorICAgIG5vbi1kaXJ0eSByZWNvcmRzIGNhbiBiZSB1bmxvYWRl
ZC4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBzdG9yZS5maW5kKCdw
b3N0JywgMSkudGhlbihmdW5jdGlvbihwb3N0KSB7CisgICAgICBzdG9yZS51bmxvYWRSZWNvcmQo
cG9zdCk7CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHVubG9hZFJlY29yZAorICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAqLworICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9u
KHJlY29yZCkgeworICAgIHJlY29yZC51bmxvYWRSZWNvcmQoKTsKKyAgfSwKKworICAvLyAuLi4u
Li4uLi4uLi4uLi4uCisgIC8vIC4gRklORCBSRUNPUkRTIC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4u
LgorCisgIC8qKgorICAgIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byBmaW5kaW5n
IHJlY29yZHMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8KKyAgICB0aGlzIG1ldGhvZCBpcyB0aGUg
bW9kZWwncyBuYW1lIGFzIGEgc3RyaW5nLgorCisgICAgLS0tCisKKyAgICBUbyBmaW5kIGEgcmVj
b3JkIGJ5IElELCBwYXNzIHRoZSBgaWRgIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyOgorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIHN0b3JlLmZpbmQoJ3BlcnNvbicsIDEpOworICAgIGBgYAorCisg
ICAgVGhlIGBmaW5kYCBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGEgKipwcm9taXNlKiogdGhh
dCB3aWxsIGJlIHJlc29sdmVkCisgICAgd2l0aCB0aGUgcmVjb3JkLiBJZiB0aGUgcmVjb3JkIHdh
cyBhbHJlYWR5IGluIHRoZSBzdG9yZSwgdGhlIHByb21pc2Ugd2lsbAorICAgIGJlIHJlc29sdmVk
IGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIHRoZSBzdG9yZSB3aWxsIGFzayB0aGUgYWRhcHRlcidz
IGBmaW5kYAorICAgIG1ldGhvZCB0byBmaW5kIHRoZSBuZWNlc3NhcnkgZGF0YS4KKworICAgIFRo
ZSBgZmluZGAgbWV0aG9kIHdpbGwgYWx3YXlzIHJlc29sdmUgaXRzIHByb21pc2Ugd2l0aCB0aGUg
c2FtZSBvYmplY3QgZm9yCisgICAgYSBnaXZlbiB0eXBlIGFuZCBgaWRgLgorCisgICAgLS0tCisK
KyAgICBUbyBmaW5kIGFsbCByZWNvcmRzIGZvciBhIHR5cGUsIGNhbGwgYGZpbmRgIHdpdGggbm8g
YWRkaXRpb25hbCBwYXJhbWV0ZXJzOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHN0b3JlLmZp
bmQoJ3BlcnNvbicpOworICAgIGBgYAorCisgICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRlcidz
IGBmaW5kQWxsYCBtZXRob2QgdG8gZmluZCB0aGUgcmVjb3JkcyBmb3IgdGhlCisgICAgZ2l2ZW4g
dHlwZSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhl
IHNlcnZlcgorICAgIHJldHVybnMgdGhlIHZhbHVlcy4KKworICAgIC0tLQorCisgICAgVG8gZmlu
ZCBhIHJlY29yZCBieSBhIHF1ZXJ5LCBjYWxsIGBmaW5kYCB3aXRoIGEgaGFzaCBhcyB0aGUgc2Vj
b25kCisgICAgcGFyYW1ldGVyOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHN0b3JlLmZpbmQo
QXBwLlBlcnNvbiwgeyBwYWdlOiAxIH0pOworICAgIGBgYAorCisgICAgVGhpcyB3aWxsIGFzayB0
aGUgYWRhcHRlcidzIGBmaW5kUXVlcnlgIG1ldGhvZCB0byBmaW5kIHRoZSByZWNvcmRzIGZvcgor
ICAgIHRoZSBxdWVyeSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVk
IG9uY2UgdGhlIHNlcnZlcgorICAgIHJlc3BvbmRzLgorCisgICAgQG1ldGhvZCBmaW5kCisgICAg
QHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0g
e09iamVjdHxTdHJpbmd8SW50ZWdlcnxudWxsfSBpZAorICAgIEByZXR1cm4ge1Byb21pc2V9IHBy
b21pc2UKKyAgKi8KKyAgZmluZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKKyAgICBpZiAoaWQgPT09
IHVuZGVmaW5lZCkgeworICAgICAgcmV0dXJuIHRoaXMuZmluZEFsbCh0eXBlKTsKKyAgICB9CisK
KyAgICAvLyBXZSBhcmUgcGFzc2VkIGEgcXVlcnkgaW5zdGVhZCBvZiBhbiBpZC4KKyAgICBpZiAo
RW1iZXIudHlwZU9mKGlkKSA9PT0gJ29iamVjdCcpIHsKKyAgICAgIHJldHVybiB0aGlzLmZpbmRR
dWVyeSh0eXBlLCBpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuZmluZEJ5SWQodHlwZSwg
Y29lcmNlSWQoaWQpKTsKKyAgfSwKKworICAvKioKKyAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEg
cmVjb3JkIGZvciBhIGdpdmVuIHR5cGUgYW5kIGlkIGNvbWJpbmF0aW9uLgorCisgICAgQG1ldGhv
ZCBmaW5kQnlJZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mg
b2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBpZAorICAgIEBy
ZXR1cm4ge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmluZEJ5SWQ6IGZ1bmN0aW9uKHR5cGUs
IGlkKSB7CisgICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CisKKyAgICB2YXIgcmVjb3Jk
ID0gdGhpcy5yZWNvcmRGb3JJZCh0eXBlLCBpZCk7CisKKyAgICB2YXIgcHJvbWlzZSA9IHRoaXMu
ZmV0Y2hSZWNvcmQocmVjb3JkKSB8fCByZXNvbHZlKHJlY29yZCwgIkRTOiBTdG9yZSNmaW5kQnlJ
ZCAiICsgdHlwZSArICIgd2l0aCBpZDogIiArIGlkKTsKKyAgICByZXR1cm4gcHJvbWlzZU9iamVj
dChwcm9taXNlKTsKKyAgfSwKKworICAvKioKKyAgICBUaGlzIG1ldGhvZCBtYWtlcyBhIHNlcmll
cyBvZiByZXF1ZXN0cyB0byB0aGUgYWRhcHRlcidzIGBmaW5kYCBtZXRob2QKKyAgICBhbmQgcmV0
dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZXkgYXJlIGFsbCBsb2FkZWQuCisK
KyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZmluZEJ5SWRzCisgICAgQHBhcmFtIHtTdHJpbmd9
IHR5cGUKKyAgICBAcGFyYW0ge0FycmF5fSBpZHMKKyAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJv
bWlzZQorICAqLworICBmaW5kQnlJZHM6IGZ1bmN0aW9uKHR5cGUsIGlkcykgeworICAgIHZhciBz
dG9yZSA9IHRoaXM7CisgICAgdmFyIHByb21pc2VMYWJlbCA9ICJEUzogU3RvcmUjZmluZEJ5SWRz
ICIgKyB0eXBlOworICAgIHJldHVybiBwcm9taXNlQXJyYXkoRW1iZXIuUlNWUC5hbGwobWFwKGlk
cywgZnVuY3Rpb24oaWQpIHsKKyAgICAgIHJldHVybiBzdG9yZS5maW5kQnlJZCh0eXBlLCBpZCk7
CisgICAgfSkpLnRoZW4oRW1iZXIuQSwgbnVsbCwgIkRTOiBTdG9yZSNmaW5kQnlJZHMgb2YgIiAr
IHR5cGUgKyAiIGNvbXBsZXRlIikpOworICB9LAorCisgIC8qKgorICAgIFRoaXMgbWV0aG9kIGlz
IGNhbGxlZCBieSBgZmluZEJ5SWRgIGlmIGl0IGRpc2NvdmVycyB0aGF0IGEgcGFydGljdWxhcgor
ICAgIHR5cGUvaWQgcGFpciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0IHRvIGtpY2sgb2ZmIGEgcmVx
dWVzdCB0byB0aGUKKyAgICBhZGFwdGVyLgorCisgICAgQG1ldGhvZCBmZXRjaFJlY29yZAorICAg
IEBwcml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHJldHVybnMge1By
b21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmV0Y2hSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewor
ICAgIGlmIChpc05vbmUocmVjb3JkKSkgeyByZXR1cm4gbnVsbDsgfQorICAgIGlmIChyZWNvcmQu
X2xvYWRpbmdQcm9taXNlKSB7IHJldHVybiByZWNvcmQuX2xvYWRpbmdQcm9taXNlOyB9CisgICAg
aWYgKCFnZXQocmVjb3JkLCAnaXNFbXB0eScpKSB7IHJldHVybiBudWxsOyB9CisKKyAgICB2YXIg
dHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKKyAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAnaWQn
KTsKKworICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOworCisgICAgRW1i
ZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gZmluZCBhIHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRh
cHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKKyAgICBFbWJlci5hc3NlcnQoIllv
dSB0cmllZCB0byBmaW5kIGEgcmVjb3JkIGJ1dCB5b3VyIGFkYXB0ZXIgKGZvciAiICsgdHlwZSAr
ICIpIGRvZXMgbm90IGltcGxlbWVudCAnZmluZCciLCBhZGFwdGVyLmZpbmQpOworCisgICAgdmFy
IHByb21pc2UgPSBfZmluZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBpZCk7CisgICAgcmVjb3JkLmxv
YWRpbmdEYXRhKHByb21pc2UpOworICAgIHJldHVybiBwcm9taXNlOworICB9LAorCisgIC8qKgor
ICAgIEdldCBhIHJlY29yZCBieSBhIGdpdmVuIHR5cGUgYW5kIElEIHdpdGhvdXQgdHJpZ2dlcmlu
ZyBhIGZldGNoLgorCisgICAgVGhpcyBtZXRob2Qgd2lsbCBzeW5jaHJvbm91c2x5IHJldHVybiB0
aGUgcmVjb3JkIGlmIGl0J3MgYXZhaWxhYmxlLgorICAgIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1
cm4gbnVsbC4KKworICAgIGBgYGpzCisgICAgdmFyIHBvc3QgPSBzdG9yZS5nZXRCeUlkKCdwb3N0
JywgMSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGdldEJ5SWQKKyAgICBAcGFyYW0ge1N0cmlu
ZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5nfEludGVn
ZXJ9IGlkCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIGdldEJ5SWQ6IGZ1
bmN0aW9uKHR5cGUsIGlkKSB7CisgICAgaWYgKHRoaXMuaGFzUmVjb3JkRm9ySWQodHlwZSwgaWQp
KSB7CisgICAgICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0eXBlLCBpZCk7CisgICAgfSBlbHNl
IHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgYnkgdGhlIHJlY29yZCdzIGByZWxvYWRgIG1ldGhvZC4KKworICAgIFRo
aXMgbWV0aG9kIGNhbGxzIHRoZSBhZGFwdGVyJ3MgYGZpbmRgIG1ldGhvZCwgd2hpY2ggcmV0dXJu
cyBhIHByb21pc2UuIFdoZW4KKyAgICAqKnRoYXQqKiBwcm9taXNlIHJlc29sdmVzLCBgcmVsb2Fk
UmVjb3JkYCB3aWxsIHJlc29sdmUgdGhlIHByb21pc2UgcmV0dXJuZWQKKyAgICBieSB0aGUgcmVj
b3JkJ3MgYHJlbG9hZGAuCisKKyAgICBAbWV0aG9kIHJlbG9hZFJlY29yZAorICAgIEBwcml2YXRl
CisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZQorICAqLworICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHZhciB0
eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLAorICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVy
Rm9yKHR5cGUpLAorICAgICAgICBpZCA9IGdldChyZWNvcmQsICdpZCcpOworCisgICAgRW1iZXIu
YXNzZXJ0KCJZb3UgY2Fubm90IHJlbG9hZCBhIHJlY29yZCB3aXRob3V0IGFuIElEIiwgaWQpOwor
ICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHJlbG9hZCBhIHJlY29yZCBidXQgeW91IGhh
dmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKKyAgICBFbWJlci5h
c3NlcnQoIllvdSB0cmllZCB0byByZWxvYWQgYSByZWNvcmQgYnV0IHlvdXIgYWRhcHRlciBkb2Vz
IG5vdCBpbXBsZW1lbnQgYGZpbmRgIiwgYWRhcHRlci5maW5kKTsKKworICAgIHJldHVybiBfZmlu
ZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBpZCk7CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRo
b2QgdGFrZXMgYSBsaXN0IG9mIHJlY29yZHMsIGdyb3VwcyB0aGUgcmVjb3JkcyBieSB0eXBlLAor
ICAgIGNvbnZlcnRzIHRoZSByZWNvcmRzIGludG8gSURzLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBh
ZGFwdGVyJ3MgYGZpbmRNYW55YAorICAgIG1ldGhvZC4KKworICAgIFRoZSByZWNvcmRzIGFyZSBn
cm91cGVkIGJ5IHR5cGUgdG8gaW52b2tlIGBmaW5kTWFueWAgb24gYWRhcHRlcnMKKyAgICBmb3Ig
ZWFjaCB1bmlxdWUgdHlwZSBpbiByZWNvcmRzLgorCisgICAgSXQgaXMgdXNlZCBib3RoIGJ5IGEg
YnJhbmQgbmV3IHJlbGF0aW9uc2hpcCAodmlhIHRoZSBgZmluZE1hbnlgCisgICAgbWV0aG9kKSBv
ciB3aGVuIHRoZSBkYXRhIHVuZGVybHlpbmcgYW4gZXhpc3RpbmcgcmVsYXRpb25zaGlwCisgICAg
Y2hhbmdlcy4KKworICAgIEBtZXRob2QgZmV0Y2hNYW55CisgICAgQHByaXZhdGUKKyAgICBAcGFy
YW0ge0FycmF5fSByZWNvcmRzCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKKyAgICBAcGFy
YW0ge1Jlc29sdmVyfSByZXNvbHZlcgorICAqLworICBmZXRjaE1hbnk6IGZ1bmN0aW9uKHJlY29y
ZHMsIG93bmVyLCByZXNvbHZlcikgeworICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHsgcmV0dXJu
OyB9CisKKyAgICAvLyBHcm91cCBCeSBUeXBlCisgICAgdmFyIHJlY29yZHNCeVR5cGVNYXAgPSBF
bWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoeworICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlv
bigpIHsgcmV0dXJuIEVtYmVyLkEoKTsgfQorICAgIH0pOworCisgICAgZm9yRWFjaChyZWNvcmRz
LCBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHJlY29yZHNCeVR5cGVNYXAuZ2V0KHJlY29yZC5j
b25zdHJ1Y3RvcikucHVzaChyZWNvcmQpOworICAgIH0pOworCisgICAgZm9yRWFjaChyZWNvcmRz
QnlUeXBlTWFwLCBmdW5jdGlvbih0eXBlLCByZWNvcmRzKSB7CisgICAgICB2YXIgaWRzID0gcmVj
b3Jkcy5tYXBQcm9wZXJ0eSgnaWQnKSwKKyAgICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVy
Rm9yKHR5cGUpOworCisgICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIG1hbnkg
cmVjb3JkcyBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFw
dGVyKTsKKyAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgbWFueSByZWNvcmRz
IGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5kTWFueWAiLCBhZGFwdGVy
LmZpbmRNYW55KTsKKworICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZE1hbnkoYWRhcHRlciwg
dGhpcywgdHlwZSwgaWRzLCBvd25lcikpOworICAgIH0sIHRoaXMpOworICB9LAorCisgIC8qKgor
ICAgIFJldHVybnMgdHJ1ZSBpZiBhIHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJRCBpcyBh
bHJlYWR5IGxvYWRlZC4KKworICAgIEBtZXRob2QgaGFzUmVjb3JkRm9ySWQKKyAgICBAcGFyYW0g
e1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5n
fEludGVnZXJ9IGlkCisgICAgQHJldHVybnMge0Jvb2xlYW59CisgICovCisgIGhhc1JlY29yZEZv
cklkOiBmdW5jdGlvbih0eXBlLCBpZCkgeworICAgIGlkID0gY29lcmNlSWQoaWQpOworICAgIHR5
cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOworICAgIHJldHVybiAhIXRoaXMudHlwZU1hcEZvcih0
eXBlKS5pZFRvUmVjb3JkW2lkXTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGlkIHJlY29y
ZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJRC4gSWYgb25lIGlzbid0IGFscmVhZHkgbG9hZGVkLAor
ICAgIGl0IGJ1aWxkcyBhIG5ldyByZWNvcmQgYW5kIGxlYXZlcyBpdCBpbiB0aGUgYGVtcHR5YCBz
dGF0ZS4KKworICAgIEBtZXRob2QgcmVjb3JkRm9ySWQKKyAgICBAcHJpdmF0ZQorICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtTdHJp
bmd8SW50ZWdlcn0gaWQKKyAgICBAcmV0dXJucyB7RFMuTW9kZWx9IHJlY29yZAorICAqLworICBy
ZWNvcmRGb3JJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKKyAgICB0eXBlID0gdGhpcy5tb2RlbEZv
cih0eXBlKTsKKworICAgIGlkID0gY29lcmNlSWQoaWQpOworCisgICAgdmFyIHJlY29yZCA9IHRo
aXMudHlwZU1hcEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKKworICAgIGlmICghcmVjb3JkKSB7
CisgICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKHR5cGUsIGlkKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gcmVjb3JkOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgZmluZE1hbnkKKyAg
ICBAcHJpdmF0ZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IG93bmVyCisgICAgQHBhcmFtIHtBcnJh
eX0gcmVjb3JkcworICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0
eXBlCisgICAgQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKKyAgICBAcmV0dXJuIHtEUy5NYW55
QXJyYXl9IHJlY29yZHMKKyAgKi8KKyAgZmluZE1hbnk6IGZ1bmN0aW9uKG93bmVyLCByZWNvcmRz
LCB0eXBlLCByZXNvbHZlcikgeworICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOworCisg
ICAgcmVjb3JkcyA9IEVtYmVyLkEocmVjb3Jkcyk7CisKKyAgICB2YXIgdW5sb2FkZWRSZWNvcmRz
ID0gcmVjb3Jkcy5maWx0ZXJQcm9wZXJ0eSgnaXNFbXB0eScsIHRydWUpLAorICAgICAgICBtYW55
QXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVNYW55QXJyYXkodHlwZSwgcmVj
b3Jkcyk7CisKKyAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7
CisgICAgICByZWNvcmQubG9hZGluZ0RhdGEoKTsKKyAgICB9KTsKKworICAgIG1hbnlBcnJheS5s
b2FkaW5nUmVjb3Jkc0NvdW50ID0gdW5sb2FkZWRSZWNvcmRzLmxlbmd0aDsKKworICAgIGlmICh1
bmxvYWRlZFJlY29yZHMubGVuZ3RoKSB7CisgICAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3Jkcywg
ZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICAgIHRoaXMucmVjb3JkQXJyYXlNYW5hZ2VyLnJlZ2lz
dGVyV2FpdGluZ1JlY29yZEFycmF5KHJlY29yZCwgbWFueUFycmF5KTsKKyAgICAgIH0sIHRoaXMp
OworCisgICAgICB0aGlzLmZldGNoTWFueSh1bmxvYWRlZFJlY29yZHMsIG93bmVyLCByZXNvbHZl
cik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZXNvbHZlcikgeyByZXNvbHZlci5yZXNvbHZl
KCk7IH0KKyAgICAgIG1hbnlBcnJheS5zZXQoJ2lzTG9hZGVkJywgdHJ1ZSk7CisgICAgICBFbWJl
ci5ydW4ub25jZShtYW55QXJyYXksICd0cmlnZ2VyJywgJ2RpZExvYWQnKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gbWFueUFycmF5OworICB9LAorCisgIC8qKgorICAgIElmIGEgcmVsYXRpb25zaGlw
IHdhcyBvcmlnaW5hbGx5IHBvcHVsYXRlZCBieSB0aGUgYWRhcHRlciBhcyBhIGxpbmsKKyAgICAo
YXMgb3Bwb3NlZCB0byBhIGxpc3Qgb2YgSURzKSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4g
dGhlCisgICAgcmVsYXRpb25zaGlwIGlzIGZldGNoZWQuCisKKyAgICBUaGUgbGluayAod2hpY2gg
aXMgdXN1YWxseSBhIFVSTCkgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCBzbyB0aGUKKyAg
ICBhZGFwdGVyIGNhbiBtYWtlIHdoYXRldmVyIHJlcXVlc3QgaXQgd2FudHMuCisKKyAgICBUaGUg
dXN1YWwgdXNlLWNhc2UgaXMgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVnaXN0ZXIgYSBVUkwgYXMgYSBs
aW5rLCBhbmQKKyAgICB0aGVuIHVzZSB0aGF0IFVSTCBpbiB0aGUgZnV0dXJlIHRvIG1ha2UgYSBy
ZXF1ZXN0IGZvciB0aGUgcmVsYXRpb25zaGlwLgorCisgICAgQG1ldGhvZCBmaW5kSGFzTWFueQor
ICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKKyAgICBAcGFyYW0ge2Fu
eX0gbGluaworICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
CisgICAgQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKKyAgICBAcmV0dXJuIHtEUy5NYW55QXJy
YXl9CisgICovCisgIGZpbmRIYXNNYW55OiBmdW5jdGlvbihvd25lciwgbGluaywgcmVsYXRpb25z
aGlwLCByZXNvbHZlcikgeworICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKG93bmVy
LmNvbnN0cnVjdG9yKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBo
YXNNYW55IHJlbGF0aW9uc2hpcCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyBvd25l
ci5jb25zdHJ1Y3RvciArICIpIiwgYWRhcHRlcik7CisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJp
ZWQgdG8gbG9hZCBhIGhhc01hbnkgcmVsYXRpb25zaGlwIGZyb20gYSBzcGVjaWZpZWQgYGxpbmtg
IGluIHRoZSBvcmlnaW5hbCBwYXlsb2FkIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVt
ZW50IGBmaW5kSGFzTWFueWAiLCBhZGFwdGVyLmZpbmRIYXNNYW55KTsKKworICAgIHZhciByZWNv
cmRzID0gdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlTWFueUFycmF5KHJlbGF0aW9uc2hp
cC50eXBlLCBFbWJlci5BKFtdKSk7CisgICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEhhc01hbnko
YWRhcHRlciwgdGhpcywgb3duZXIsIGxpbmssIHJlbGF0aW9uc2hpcCkpOworICAgIHJldHVybiBy
ZWNvcmRzOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgZmluZEJlbG9uZ3NUbworICAgIEBw
cml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKKyAgICBAcGFyYW0ge2FueX0gbGlu
aworICAgIEBwYXJhbSB7UmVsYXRpb25zaGlwfSByZWxhdGlvbnNoaXAKKyAgICBAcGFyYW0ge1Jl
c29sdmVyfSByZXNvbHZlcgorICAqLworICBmaW5kQmVsb25nc1RvOiBmdW5jdGlvbihvd25lciwg
bGluaywgcmVsYXRpb25zaGlwLCByZXNvbHZlcikgeworICAgIHZhciBhZGFwdGVyID0gdGhpcy5h
ZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVjdG9yKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91IHRy
aWVkIHRvIGxvYWQgYSBiZWxvbmdzVG8gcmVsYXRpb25zaGlwIGJ1dCB5b3UgaGF2ZSBubyBhZGFw
dGVyIChmb3IgIiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBhZGFwdGVyKTsKKyAgICBFbWJl
ci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGEgYmVsb25nc1RvIHJlbGF0aW9uc2hpcCBmcm9t
IGEgc3BlY2lmaWVkIGBsaW5rYCBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZCBidXQgeW91ciBhZGFw
dGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZEJlbG9uZ3NUb2AiLCBhZGFwdGVyLmZpbmRCZWxv
bmdzVG8pOworCisgICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEJlbG9uZ3NUbyhhZGFwdGVyLCB0
aGlzLCBvd25lciwgbGluaywgcmVsYXRpb25zaGlwKSk7CisgIH0sCisKKyAgLyoqCisgICAgVGhp
cyBtZXRob2QgZGVsZWdhdGVzIGEgcXVlcnkgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgaXMgdGhlIG9u
ZSBwbGFjZSB3aGVyZQorICAgIGFkYXB0ZXItbGV2ZWwgc2VtYW50aWNzIGFyZSBleHBvc2VkIHRv
IHRoZSBhcHBsaWNhdGlvbi4KKworICAgIEV4cG9zaW5nIHF1ZXJpZXMgdGhpcyB3YXkgc2VlbXMg
cHJlZmVyYWJsZSB0byBjcmVhdGluZyBhbiBhYnN0cmFjdCBxdWVyeQorICAgIGxhbmd1YWdlIGZv
ciBhbGwgc2VydmVyLXNpZGUgcXVlcmllcywgYW5kIHRoZW4gcmVxdWlyZSBhbGwgYWRhcHRlcnMg
dG8KKyAgICBpbXBsZW1lbnQgdGhlbS4KKworICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9t
aXNlLCB3aGljaCBpcyByZXNvbHZlZCB3aXRoIGEgYFJlY29yZEFycmF5YAorICAgIG9uY2UgdGhl
IHNlcnZlciByZXR1cm5zLgorCisgICAgQG1ldGhvZCBmaW5kUXVlcnkKKyAgICBAcHJpdmF0ZQor
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBh
cmFtIHthbnl9IHF1ZXJ5IGFuIG9wYXF1ZSBxdWVyeSB0byBiZSB1c2VkIGJ5IHRoZSBhZGFwdGVy
CisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kUXVlcnk6IGZ1bmN0
aW9uKHR5cGUsIHF1ZXJ5KSB7CisgICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CisKKyAg
ICB2YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgorICAgICAgLmNyZWF0ZUFkYXB0
ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheSh0eXBlLCBxdWVyeSk7CisKKyAgICB2YXIgYWRhcHRlciA9
IHRoaXMuYWRhcHRlckZvcih0eXBlKSwKKyAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBTdG9y
ZSNmaW5kUXVlcnkgIiArIHR5cGUsCisgICAgICAgIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZl
cihwcm9taXNlTGFiZWwpOworCisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBh
IHF1ZXJ5IGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0
ZXIpOworICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBxdWVyeSBidXQgeW91
ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZFF1ZXJ5YCIsIGFkYXB0ZXIuZmluZFF1
ZXJ5KTsKKworICAgIHJlc29sdmVyLnJlc29sdmUoX2ZpbmRRdWVyeShhZGFwdGVyLCB0aGlzLCB0
eXBlLCBxdWVyeSwgYXJyYXkpKTsKKworICAgIHJldHVybiBwcm9taXNlQXJyYXkocmVzb2x2ZXIu
cHJvbWlzZSk7CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJh
eSBvZiBhbGwgcmVjb3JkcyBhZGFwdGVyIGNhbiBmaW5kLgorICAgIEl0IHRyaWdnZXJzIHRoZSBh
ZGFwdGVyJ3MgYGZpbmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFuIG9wcG9ydHVuaXR5IHRvIHBv
cHVsYXRlCisgICAgdGhlIGFycmF5IHdpdGggcmVjb3JkcyBvZiB0aGF0IHR5cGUuCisKKyAgICBA
bWV0aG9kIGZpbmRBbGwKKyAgICBAcHJpdmF0ZQorICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHJldHVybiB7RFMuQWRhcHRlclBvcHVsYXRlZFJl
Y29yZEFycmF5fQorICAqLworICBmaW5kQWxsOiBmdW5jdGlvbih0eXBlKSB7CisgICAgdHlwZSA9
IHRoaXMubW9kZWxGb3IodHlwZSk7CisKKyAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCh0eXBlLCB0
aGlzLmFsbCh0eXBlKSk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBmZXRjaEFsbAorICAg
IEBwcml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuUmVj
b3JkQXJyYXl9IGFycmF5CisgICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAg
ZmV0Y2hBbGw6IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7CisgICAgdmFyIGFkYXB0ZXIgPSB0aGlz
LmFkYXB0ZXJGb3IodHlwZSksCisgICAgICAgIHNpbmNlVG9rZW4gPSB0aGlzLnR5cGVNYXBGb3Io
dHlwZSkubWV0YWRhdGEuc2luY2U7CisKKyAgICBzZXQoYXJyYXksICdpc1VwZGF0aW5nJywgdHJ1
ZSk7CisKKyAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGFsbCByZWNvcmRzIGJ1
dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOworICAg
IEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYWxsIHJlY29yZHMgYnV0IHlvdXIgYWRh
cHRlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRBbGxgIiwgYWRhcHRlci5maW5kQWxsKTsKKwor
ICAgIHJldHVybiBwcm9taXNlQXJyYXkoX2ZpbmRBbGwoYWRhcHRlciwgdGhpcywgdHlwZSwgc2lu
Y2VUb2tlbikpOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgZGlkVXBkYXRlQWxsCisgICAg
QHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQorICAqLworICBkaWRVcGRhdGVBbGw6IGZ1bmN0aW9uKHR5
cGUpIHsKKyAgICB2YXIgZmluZEFsbENhY2hlID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLmZpbmRB
bGxDYWNoZTsKKyAgICBzZXQoZmluZEFsbENhY2hlLCAnaXNVcGRhdGluZycsIGZhbHNlKTsKKyAg
fSwKKworICAvKioKKyAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZmlsdGVyZWQgYXJyYXkgdGhh
dCBjb250YWlucyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMKKyAgICBmb3IgYSBnaXZlbiB0eXBl
LgorCisgICAgTm90ZSB0aGF0IGJlY2F1c2UgaXQncyBqdXN0IGEgZmlsdGVyLCBpdCB3aWxsIGhh
dmUgYW55IGxvY2FsbHkKKyAgICBjcmVhdGVkIHJlY29yZHMgb2YgdGhlIHR5cGUuCisKKyAgICBB
bHNvIG5vdGUgdGhhdCBtdWx0aXBsZSBjYWxscyB0byBgYWxsYCBmb3IgYSBnaXZlbiB0eXBlIHdp
bGwgYWx3YXlzCisgICAgcmV0dXJuIHRoZSBzYW1lIFJlY29yZEFycmF5LgorCisgICAgRXhhbXBs
ZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBsb2NhbF9wb3N0cyA9IHN0b3JlLmFsbChB
cHAuUG9zdCk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGFsbAorICAgIEBwYXJhbSB7U3RyaW5n
IG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHJldHVybiB7RFMuUmVjb3JkQXJy
YXl9CisgICovCisgIGFsbDogZnVuY3Rpb24odHlwZSkgeworICAgIHR5cGUgPSB0aGlzLm1vZGVs
Rm9yKHR5cGUpOworCisgICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCisg
ICAgICAgIGZpbmRBbGxDYWNoZSA9IHR5cGVNYXAuZmluZEFsbENhY2hlOworCisgICAgaWYgKGZp
bmRBbGxDYWNoZSkgeyByZXR1cm4gZmluZEFsbENhY2hlOyB9CisKKyAgICB2YXIgYXJyYXkgPSB0
aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVSZWNvcmRBcnJheSh0eXBlKTsKKworICAgIHR5
cGVNYXAuZmluZEFsbENhY2hlID0gYXJyYXk7CisgICAgcmV0dXJuIGFycmF5OworICB9LAorCisK
KyAgLyoqCisgICAgVGhpcyBtZXRob2QgdW5sb2FkcyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMg
Zm9yIGEgZ2l2ZW4gdHlwZS4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBzdG9yZS51bmxvYWRB
bGwoQXBwLlBvc3QpOworICAgIGBgYAorCisgICAgQG1ldGhvZCB1bmxvYWRBbGwKKyAgICBAcGFy
YW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAqLworICB1bmxvYWRB
bGw6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKKwor
ICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAorICAgICAgICByZWNvcmRz
ID0gdHlwZU1hcC5yZWNvcmRzLnNwbGljZSgwKSwgcmVjb3JkOworCisgICAgd2hpbGUocmVjb3Jk
ID0gcmVjb3Jkcy5wb3AoKSkgeworICAgICAgcmVjb3JkLnVubG9hZFJlY29yZCgpOworICAgIH0K
KworICAgIHR5cGVNYXAuZmluZEFsbENhY2hlID0gbnVsbDsKKyAgfSwKKworICAvKioKKyAgICBU
YWtlcyBhIHR5cGUgYW5kIGZpbHRlciBmdW5jdGlvbiwgYW5kIHJldHVybnMgYSBsaXZlIFJlY29y
ZEFycmF5IHRoYXQKKyAgICByZW1haW5zIHVwIHRvIGRhdGUgYXMgbmV3IHJlY29yZHMgYXJlIGxv
YWRlZCBpbnRvIHRoZSBzdG9yZSBvciBjcmVhdGVkCisgICAgbG9jYWxseS4KKworICAgIFRoZSBj
YWxsYmFjayBmdW5jdGlvbiB0YWtlcyBhIG1hdGVyaWFsaXplZCByZWNvcmQsIGFuZCByZXR1cm5z
IHRydWUKKyAgICBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVy
IGFuZCBmYWxzZSBpZiBpdCBzaG91bGQKKyAgICBub3QuCisKKyAgICBUaGUgZmlsdGVyIGZ1bmN0
aW9uIGlzIGNhbGxlZCBvbmNlIG9uIGFsbCByZWNvcmRzIGZvciB0aGUgdHlwZSB3aGVuCisgICAg
aXQgaXMgY3JlYXRlZCwgYW5kIHRoZW4gb25jZSBvbiBlYWNoIG5ld2x5IGxvYWRlZCBvciBjcmVh
dGVkIHJlY29yZC4KKworICAgIElmIGFueSBvZiBhIHJlY29yZCdzIHByb3BlcnRpZXMgY2hhbmdl
LCBvciBpZiBpdCBjaGFuZ2VzIHN0YXRlLCB0aGUKKyAgICBmaWx0ZXIgZnVuY3Rpb24gd2lsbCBi
ZSBpbnZva2VkIGFnYWluIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZAorICAgIHN0aWxs
IGJlIGluIHRoZSBhcnJheS4KKworICAgIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgcXVlcnkg
d2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgYXQgZmlyc3QuIFRoZQorICAgIHJlc3VsdHMgcmV0dXJu
ZWQgYnkgdGhlIHNlcnZlciBjb3VsZCB0aGVuIGFwcGVhciBpbiB0aGUgZmlsdGVyIGlmIHRoZXkK
KyAgICBtYXRjaCB0aGUgZmlsdGVyIGZ1bmN0aW9uLgorCisgICAgRXhhbXBsZQorCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHN0b3JlLmZpbHRlcihBcHAuUG9zdCwge3VucmVhZDogdHJ1ZX0sIGZ1
bmN0aW9uKHBvc3QpIHsKKyAgICAgIHJldHVybiBwb3N0LmdldCgndW5yZWFkJyk7CisgICAgfSku
dGhlbihmdW5jdGlvbih1bnJlYWRQb3N0cykgeworICAgICAgdW5yZWFkUG9zdHMuZ2V0KCdsZW5n
dGgnKTsgLy8gNQorICAgICAgdmFyIHVucmVhZFBvc3QgPSB1bnJlYWRQb3N0cy5vYmplY3RBdCgw
KTsKKyAgICAgIHVucmVhZFBvc3Quc2V0KCd1bnJlYWQnLCBmYWxzZSk7CisgICAgICB1bnJlYWRQ
b3N0cy5nZXQoJ2xlbmd0aCcpOyAvLyA0CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9k
IGZpbHRlcgorICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
CisgICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5IG9wdGlvbmFsIHF1ZXJ5CisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZmlsdGVyCisgICAgQHJldHVybiB7RFMuUHJvbWlzZUFycmF5fQorICAqLworICBm
aWx0ZXI6IGZ1bmN0aW9uKHR5cGUsIHF1ZXJ5LCBmaWx0ZXIpIHsKKyAgICB2YXIgcHJvbWlzZTsK
KworICAgIC8vIGFsbG93IGFuIG9wdGlvbmFsIHNlcnZlciBxdWVyeQorICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoID09PSAzKSB7CisgICAgICBwcm9taXNlID0gdGhpcy5maW5kUXVlcnkodHlwZSwg
cXVlcnkpOworICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAg
ZmlsdGVyID0gcXVlcnk7CisgICAgfQorCisgICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7
CisKKyAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgorICAgICAgLmNyZWF0
ZUZpbHRlcmVkUmVjb3JkQXJyYXkodHlwZSwgZmlsdGVyKTsKKyAgICBwcm9taXNlID0gcHJvbWlz
ZSB8fCByZXNvbHZlKGFycmF5KTsKKworICAgIHJldHVybiBwcm9taXNlQXJyYXkocHJvbWlzZS50
aGVuKGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIGFycmF5OworICAgIH0sIG51bGwsICJEUzog
U3RvcmUjZmlsdGVyIG9mICIgKyB0eXBlKSk7CisgIH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRo
b2QgcmV0dXJucyBpZiBhIGNlcnRhaW4gcmVjb3JkIGlzIGFscmVhZHkgbG9hZGVkCisgICAgaW4g
dGhlIHN0b3JlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBrbm93IGJlZm9yZWhhbmQgaWYgYSBmaW5k
KCkKKyAgICB3aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhhdCBpdCB3aWxsIGJlIGEgY2Fj
aGUgaGl0LgorCisgICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBzdG9yZS5y
ZWNvcmRJc0xvYWRlZChBcHAuUG9zdCwgMSk7IC8vIGZhbHNlCisgICAgc3RvcmUuZmluZChBcHAu
UG9zdCwgMSkudGhlbihmdW5jdGlvbigpIHsKKyAgICAgIHN0b3JlLnJlY29yZElzTG9hZGVkKEFw
cC5Qb3N0LCAxKTsgLy8gdHJ1ZQorICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCByZWNv
cmRJc0xvYWRlZAorICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0
eXBlCisgICAgQHBhcmFtIHtzdHJpbmd9IGlkCisgICAgQHJldHVybiB7Ym9vbGVhbn0KKyAgKi8K
KyAgcmVjb3JkSXNMb2FkZWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7CisgICAgaWYgKCF0aGlzLmhh
c1JlY29yZEZvcklkKHR5cGUsIGlkKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICByZXR1cm4gIWdl
dCh0aGlzLnJlY29yZEZvcklkKHR5cGUsIGlkKSwgJ2lzRW1wdHknKTsKKyAgfSwKKworICAvKioK
KyAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyB0eXBl
LgorCisgICAgQG1ldGhvZCBtZXRhZGF0YUZvcgorICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHJldHVybiB7b2JqZWN0fQorICAqLworICBtZXRh
ZGF0YUZvcjogZnVuY3Rpb24odHlwZSkgeworICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUp
OworICAgIHJldHVybiB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0YWRhdGE7CisgIH0sCisKKyAg
Ly8gLi4uLi4uLi4uLi4uCisgIC8vIC4gVVBEQVRJTkcgLgorICAvLyAuLi4uLi4uLi4uLi4KKwor
ICAvKioKKyAgICBJZiB0aGUgYWRhcHRlciB1cGRhdGVzIGF0dHJpYnV0ZXMgb3IgYWNrbm93bGVk
Z2VzIGNyZWF0aW9uCisgICAgb3IgZGVsZXRpb24sIHRoZSByZWNvcmQgd2lsbCBub3RpZnkgdGhl
IHN0b3JlIHRvIHVwZGF0ZSBpdHMKKyAgICBtZW1iZXJzaGlwIGluIGFueSBmaWx0ZXJzLgorICAg
IFRvIGF2b2lkIHRocmFzaGluZywgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5IG9uY2UgcGVy
CisKKyAgICBydW4gbG9vcCBwZXIgcmVjb3JkLgorCisgICAgQG1ldGhvZCBkYXRhV2FzVXBkYXRl
ZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtDbGFzc30gdHlwZQorICAgIEBwYXJhbSB7RFMu
TW9kZWx9IHJlY29yZAorICAqLworICBkYXRhV2FzVXBkYXRlZDogZnVuY3Rpb24odHlwZSwgcmVj
b3JkKSB7CisgICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29y
ZCk7CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4KKyAgLy8gLiBQRVJTSVNUSU5HIC4KKyAg
Ly8gLi4uLi4uLi4uLi4uLi4KKworICAvKioKKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkg
YHJlY29yZC5zYXZlYCwgYW5kIGdldHMgcGFzc2VkIGEKKyAgICByZXNvbHZlciBmb3IgdGhlIHBy
b21pc2UgdGhhdCBgcmVjb3JkLnNhdmVgIHJldHVybnMuCisKKyAgICBJdCBzY2hlZHVsZXMgc2F2
aW5nIHRvIGhhcHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcC4KKworICAgIEBtZXRob2Qg
c2NoZWR1bGVTYXZlCisgICAgQHByaXZhdGUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQK
KyAgICBAcGFyYW0ge1Jlc29sdmVyfSByZXNvbHZlcgorICAqLworICBzY2hlZHVsZVNhdmU6IGZ1
bmN0aW9uKHJlY29yZCwgcmVzb2x2ZXIpIHsKKyAgICByZWNvcmQuYWRhcHRlcldpbGxDb21taXQo
KTsKKyAgICB0aGlzLl9wZW5kaW5nU2F2ZS5wdXNoKFtyZWNvcmQsIHJlc29sdmVyXSk7CisgICAg
b25jZSh0aGlzLCAnZmx1c2hQZW5kaW5nU2F2ZScpOworICB9LAorCisgIC8qKgorICAgIFRoaXMg
bWV0aG9kIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcCwgYW5kCisgICAgZmx1
c2hlcyBhbnkgcmVjb3JkcyBwYXNzZWQgaW50byBgc2NoZWR1bGVTYXZlYAorCisgICAgQG1ldGhv
ZCBmbHVzaFBlbmRpbmdTYXZlCisgICAgQHByaXZhdGUKKyAgKi8KKyAgZmx1c2hQZW5kaW5nU2F2
ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nU2F2ZS5zbGlj
ZSgpOworICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107CisKKyAgICBmb3JFYWNoKHBlbmRpbmcs
IGZ1bmN0aW9uKHR1cGxlKSB7CisgICAgICB2YXIgcmVjb3JkID0gdHVwbGVbMF0sIHJlc29sdmVy
ID0gdHVwbGVbMV0sCisgICAgICAgICAgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcihyZWNvcmQu
Y29uc3RydWN0b3IpLAorICAgICAgICAgIG9wZXJhdGlvbjsKKworICAgICAgaWYgKGdldChyZWNv
cmQsICdpc05ldycpKSB7CisgICAgICAgIG9wZXJhdGlvbiA9ICdjcmVhdGVSZWNvcmQnOworICAg
ICAgfSBlbHNlIGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsKKyAgICAgICAgb3BlcmF0
aW9uID0gJ2RlbGV0ZVJlY29yZCc7CisgICAgICB9IGVsc2UgeworICAgICAgICBvcGVyYXRpb24g
PSAndXBkYXRlUmVjb3JkJzsKKyAgICAgIH0KKworICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfY29t
bWl0KGFkYXB0ZXIsIHRoaXMsIG9wZXJhdGlvbiwgcmVjb3JkKSk7CisgICAgfSwgdGhpcyk7Cisg
IH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgdGhlIHByb21pc2Ug
cmV0dXJuZWQgYnkgYW4KKyAgICBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNv
cmRgIG9yIGBkZWxldGVSZWNvcmRgCisgICAgaXMgcmVzb2x2ZWQuCisKKyAgICBJZiB0aGUgZGF0
YSBwcm92aWRlcyBhIHNlcnZlci1nZW5lcmF0ZWQgSUQsIGl0IHdpbGwKKyAgICB1cGRhdGUgdGhl
IHJlY29yZCBhbmQgdGhlIHN0b3JlJ3MgaW5kZXhlcy4KKworICAgIEBtZXRob2QgZGlkU2F2ZVJl
Y29yZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSBpbi1m
bGlnaHQgcmVjb3JkCisgICAgQHBhcmFtIHtPYmplY3R9IGRhdGEgb3B0aW9uYWwgZGF0YSAoc2Vl
IGFib3ZlKQorICAqLworICBkaWRTYXZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIGRhdGEpIHsK
KyAgICBpZiAoZGF0YSkgeworICAgICAgLy8gbm9ybWFsaXplIHJlbGF0aW9uc2hpcCBJRHMgaW50
byByZWNvcmRzCisgICAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlwcyh0aGlzLCByZWNv
cmQuY29uc3RydWN0b3IsIGRhdGEsIHJlY29yZCk7CisKKyAgICAgIHRoaXMudXBkYXRlSWQocmVj
b3JkLCBkYXRhKTsKKyAgICB9CisKKyAgICByZWNvcmQuYWRhcHRlckRpZENvbW1pdChkYXRhKTsK
KyAgfSwKKworICAvKioKKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlz
ZSByZXR1cm5lZCBieSBhbgorICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJl
Y29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKKyAgICBpcyByZWplY3RlZCB3aXRoIGEgYERTLkludmFs
aWRFcnJvcmAuCisKKyAgICBAbWV0aG9kIHJlY29yZFdhc0ludmFsaWQKKyAgICBAcHJpdmF0ZQor
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7T2JqZWN0fSBlcnJvcnMK
KyAgKi8KKyAgcmVjb3JkV2FzSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkLCBlcnJvcnMpIHsKKyAg
ICByZWNvcmQuYWRhcHRlckRpZEludmFsaWRhdGUoZXJyb3JzKTsKKyAgfSwKKworICAvKioKKyAg
ICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhbgor
ICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJl
Y29yZGAKKyAgICBpcyByZWplY3RlZCAod2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGEgYERTLklu
dmFsaWRFcnJvcmApLgorCisgICAgQG1ldGhvZCByZWNvcmRXYXNFcnJvcgorICAgIEBwcml2YXRl
CisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIHJlY29yZFdhc0Vycm9yOiBm
dW5jdGlvbihyZWNvcmQpIHsKKyAgICByZWNvcmQuYWRhcHRlckRpZEVycm9yKCk7CisgIH0sCisK
KyAgLyoqCisgICAgV2hlbiBhbiBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNv
cmRgIG9yIGBkZWxldGVSZWNvcmRgCisgICAgcmVzb2x2ZXMgd2l0aCBkYXRhLCB0aGlzIG1ldGhv
ZCBleHRyYWN0cyB0aGUgSUQgZnJvbSB0aGUgc3VwcGxpZWQKKyAgICBkYXRhLgorCisgICAgQG1l
dGhvZCB1cGRhdGVJZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
CisgICAgQHBhcmFtIHtPYmplY3R9IGRhdGEKKyAgKi8KKyAgdXBkYXRlSWQ6IGZ1bmN0aW9uKHJl
Y29yZCwgZGF0YSkgeworICAgIHZhciBvbGRJZCA9IGdldChyZWNvcmQsICdpZCcpLAorICAgICAg
ICBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpOworCisgICAgRW1iZXIuYXNzZXJ0KCJBbiBhZGFwdGVy
IGNhbm5vdCBhc3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5IGhhcyBhbiBp
ZC4gIiArIHJlY29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3UgdHJpZWQgdG8g
dXBkYXRlIGl0IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkgaGFwcGVuZWQgYmVjYXVzZSB5
b3VyIHNlcnZlciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRvIGEgZmluZCBvciB1cGRhdGUg
dGhhdCBoYWQgYSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIsIG9sZElkID09
PSBudWxsIHx8IGlkID09PSBvbGRJZCk7CisKKyAgICB0aGlzLnR5cGVNYXBGb3IocmVjb3JkLmNv
bnN0cnVjdG9yKS5pZFRvUmVjb3JkW2lkXSA9IHJlY29yZDsKKworICAgIHNldChyZWNvcmQsICdp
ZCcsIGlkKTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIGEgbWFwIG9mIElEcyB0byBjbGll
bnQgSURzIGZvciBhIGdpdmVuIHR5cGUuCisKKyAgICBAbWV0aG9kIHR5cGVNYXBGb3IKKyAgICBA
cHJpdmF0ZQorICAgIEBwYXJhbSB0eXBlCisgICAgQHJldHVybiB7T2JqZWN0fSB0eXBlTWFwCisg
ICovCisgIHR5cGVNYXBGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB2YXIgdHlwZU1hcHMgPSBn
ZXQodGhpcywgJ3R5cGVNYXBzJyksCisgICAgICAgIGd1aWQgPSBFbWJlci5ndWlkRm9yKHR5cGUp
LAorICAgICAgICB0eXBlTWFwOworCisgICAgdHlwZU1hcCA9IHR5cGVNYXBzW2d1aWRdOworCisg
ICAgaWYgKHR5cGVNYXApIHsgcmV0dXJuIHR5cGVNYXA7IH0KKworICAgIHR5cGVNYXAgPSB7Cisg
ICAgICBpZFRvUmVjb3JkOiB7fSwKKyAgICAgIHJlY29yZHM6IFtdLAorICAgICAgbWV0YWRhdGE6
IHt9CisgICAgfTsKKworICAgIHR5cGVNYXBzW2d1aWRdID0gdHlwZU1hcDsKKworICAgIHJldHVy
biB0eXBlTWFwOworICB9LAorCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gLiBMT0FESU5H
IERBVEEgLgorICAvLyAuLi4uLi4uLi4uLi4uLi4uCisKKyAgLyoqCisgICAgVGhpcyBpbnRlcm5h
bCBtZXRob2QgaXMgdXNlZCBieSBgcHVzaGAuCisKKyAgICBAbWV0aG9kIF9sb2FkCisgICAgQHBy
aXZhdGUKKyAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQor
ICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCisgICAgQHBhcmFtIHtCb29sZWFufSBwYXJ0aWFsIHRo
ZSBkYXRhIHNob3VsZCBiZSBtZXJnZWQgaW50bworICAgICAgdGhlIGV4aXN0aW5nIGRhdGEsIG5v
dCByZXBsYWNlIGl0LgorICAqLworICBfbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgcGFydGlh
bCkgeworICAgIHZhciBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpLAorICAgICAgICByZWNvcmQgPSB0
aGlzLnJlY29yZEZvcklkKHR5cGUsIGlkKTsKKworICAgIHJlY29yZC5zZXR1cERhdGEoZGF0YSwg
cGFydGlhbCk7CisgICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJl
Y29yZCk7CisKKyAgICByZXR1cm4gcmVjb3JkOworICB9LAorCisgIC8qKgorICAgIFJldHVybnMg
YSBtb2RlbCBjbGFzcyBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gVXNlZCBieQorICAgIG1ldGhvZHMg
dGhhdCB0YWtlIGEgdHlwZSBrZXkgKGxpa2UgYGZpbmRgLCBgY3JlYXRlUmVjb3JkYCwKKyAgICBl
dGMuKQorCisgICAgQG1ldGhvZCBtb2RlbEZvcgorICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSBrZXkKKyAgICBAcmV0dXJucyB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
CisgICovCisgIG1vZGVsRm9yOiBmdW5jdGlvbihrZXkpIHsKKyAgICB2YXIgZmFjdG9yeTsKKwor
CisgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7CisgICAgICB2YXIgbm9ybWFsaXpl
ZEtleSA9IHRoaXMuY29udGFpbmVyLm5vcm1hbGl6ZSgnbW9kZWw6JyArIGtleSk7CisKKyAgICAg
IGZhY3RvcnkgPSB0aGlzLmNvbnRhaW5lci5sb29rdXBGYWN0b3J5KG5vcm1hbGl6ZWRLZXkpOwor
ICAgICAgaWYgKCFmYWN0b3J5KSB7IHRocm93IG5ldyBFbWJlci5FcnJvcigiTm8gbW9kZWwgd2Fz
IGZvdW5kIGZvciAnIiArIGtleSArICInIik7IH0KKyAgICAgIGZhY3RvcnkudHlwZUtleSA9IG5v
cm1hbGl6ZWRLZXkuc3BsaXQoJzonLCAyKVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQSBm
YWN0b3J5IGFscmVhZHkgc3VwcGxpZWQuCisgICAgICBmYWN0b3J5ID0ga2V5OworICAgIH0KKwor
ICAgIGZhY3Rvcnkuc3RvcmUgPSB0aGlzOworICAgIHJldHVybiBmYWN0b3J5OworICB9LAorCisg
IC8qKgorICAgIFB1c2ggc29tZSBkYXRhIGZvciBhIGdpdmVuIHR5cGUgaW50byB0aGUgc3RvcmUu
CisKKyAgICBUaGlzIG1ldGhvZCBleHBlY3RzIG5vcm1hbGl6ZWQgZGF0YToKKworICAgICogVGhl
IElEIGlzIGEga2V5IG5hbWVkIGBpZGAgKGFuIElEIGlzIG1hbmRhdG9yeSkKKyAgICAqIFRoZSBu
YW1lcyBvZiBhdHRyaWJ1dGVzIGFyZSB0aGUgb25lcyB5b3UgdXNlZCBpbgorICAgICAgeW91ciBt
b2RlbCdzIGBEUy5hdHRyYHMuCisgICAgKiBZb3VyIHJlbGF0aW9uc2hpcHMgbXVzdCBiZToKKyAg
ICAgICogcmVwcmVzZW50ZWQgYXMgSURzIG9yIEFycmF5cyBvZiBJRHMKKyAgICAgICogcmVwcmVz
ZW50ZWQgYXMgbW9kZWwgaW5zdGFuY2VzCisgICAgICAqIHJlcHJlc2VudGVkIGFzIFVSTHMsIHVu
ZGVyIHRoZSBgbGlua3NgIGtleQorCisgICAgRm9yIHRoaXMgbW9kZWw6CisKKyAgICBgYGBqcwor
ICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAgZmlyc3ROYW1lOiBEUy5h
dHRyKCksCisgICAgICBsYXN0TmFtZTogRFMuYXR0cigpLAorCisgICAgICBjaGlsZHJlbjogRFMu
aGFzTWFueSgncGVyc29uJykKKyAgICB9KTsKKyAgICBgYGAKKworICAgIFRvIHJlcHJlc2VudCB0
aGUgY2hpbGRyZW4gYXMgSURzOgorCisgICAgYGBganMKKyAgICB7CisgICAgICBpZDogMSwKKyAg
ICAgIGZpcnN0TmFtZTogIlRvbSIsCisgICAgICBsYXN0TmFtZTogIkRhbGUiLAorICAgICAgY2hp
bGRyZW46IFsxLCAyLCAzXQorICAgIH0KKyAgICBgYGAKKworICAgIFRvIHJlcHJlc2VudCB0aGUg
Y2hpbGRyZW4gcmVsYXRpb25zaGlwIGFzIGEgVVJMOgorCisgICAgYGBganMKKyAgICB7CisgICAg
ICBpZDogMSwKKyAgICAgIGZpcnN0TmFtZTogIlRvbSIsCisgICAgICBsYXN0TmFtZTogIkRhbGUi
LAorICAgICAgbGlua3M6IHsKKyAgICAgICAgY2hpbGRyZW46ICIvcGVvcGxlLzEvY2hpbGRyZW4i
CisgICAgICB9CisgICAgfQorICAgIGBgYAorCisgICAgSWYgeW91J3JlIHN0cmVhbWluZyBkYXRh
IG9yIGltcGxlbWVudGluZyBhbiBhZGFwdGVyLAorICAgIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZl
IGNvbnZlcnRlZCB0aGUgaW5jb21pbmcgZGF0YQorICAgIGludG8gdGhpcyBmb3JtLgorCisgICAg
VGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldworICAgIHJl
Y29yZHMsIGFzIHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCisKKyAgICBAbWV0
aG9kIHB1c2gKKyAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCisgICAgQHJldHVybnMge0RTLk1vZGVsfSB0aGUg
cmVjb3JkIHRoYXQgd2FzIGNyZWF0ZWQgb3IKKyAgICAgIHVwZGF0ZWQuCisgICovCisgIHB1c2g6
IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIF9wYXJ0aWFsKSB7CisgICAgLy8gX3BhcnRpYWwgaXMgYW4g
aW50ZXJuYWwgcGFyYW0gdXNlZCBieSBgdXBkYXRlYC4KKyAgICAvLyBJZiBwYXNzZWQsIGl0IG1l
YW5zIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlCisgICAgLy8gbWVyZ2VkIGludG8gdGhlIGV4aXN0
aW5nIGRhdGEsIG5vdCByZXBsYWNlIGl0LgorCisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBp
bmNsdWRlIGFuIGBpZGAgaW4gYSBoYXNoIHBhc3NlZCB0byBgcHVzaGAiLCBkYXRhLmlkICE9IG51
bGwpOworCisgICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CisKKyAgICAvLyBub3JtYWxp
emUgcmVsYXRpb25zaGlwIElEcyBpbnRvIHJlY29yZHMKKyAgICBkYXRhID0gbm9ybWFsaXplUmVs
YXRpb25zaGlwcyh0aGlzLCB0eXBlLCBkYXRhKTsKKworICAgIHRoaXMuX2xvYWQodHlwZSwgZGF0
YSwgX3BhcnRpYWwpOworCisgICAgcmV0dXJuIHRoaXMucmVjb3JkRm9ySWQodHlwZSwgZGF0YS5p
ZCk7CisgIH0sCisKKyAgLyoqCisgICAgUHVzaCBzb21lIHJhdyBkYXRhIGludG8gdGhlIHN0b3Jl
LgorCisgICAgVGhlIGRhdGEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlc2VyaWFsaXplZCB1c2lu
ZyB0aGUKKyAgICBzZXJpYWxpemVyIGZvciB0aGUgYHR5cGVgIHBhcmFtLgorCisgICAgVGhpcyBt
ZXRob2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldworICAgIHJlY29yZHMs
IGFzIHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCisKKyAgICBZb3UgY2FuIHB1
c2ggaW4gbW9yZSB0aGFuIG9uZSB0eXBlIG9mIG9iamVjdCBhdCBvbmNlLgorICAgIEFsbCBvYmpl
Y3RzIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZQorICAgIHNlcmlhbGl6
ZXIuCisKKyAgICBgYGBqcworICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5BY3Rp
dmVNb2RlbFNlcmlhbGl6ZXI7CisKKyAgICB2YXIgcHVzaERhdGEgPSB7CisgICAgICBwb3N0czog
WworICAgICAgICB7aWQ6IDEsIHBvc3RfdGl0bGU6ICJHcmVhdCBwb3N0IiwgY29tbWVudF9pZHM6
IFsyXX0KKyAgICAgIF0sCisgICAgICBjb21tZW50czogWworICAgICAgICB7aWQ6IDIsIGNvbW1l
bnRfYm9keTogIkluc2lnaHRmdWwgY29tbWVudCJ9CisgICAgICBdCisgICAgfQorCisgICAgc3Rv
cmUucHVzaFBheWxvYWQoJ3Bvc3QnLCBwdXNoRGF0YSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9k
IHB1c2hQYXlsb2FkCisgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKKyAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAorICAgIEByZXR1cm4ge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRoYXQgd2FzIGNy
ZWF0ZWQgb3IgdXBkYXRlZC4KKyAgKi8KKyAgcHVzaFBheWxvYWQ6IGZ1bmN0aW9uICh0eXBlLCBw
YXlsb2FkKSB7CisgICAgdmFyIHNlcmlhbGl6ZXI7CisgICAgaWYgKCFwYXlsb2FkKSB7CisgICAg
ICBwYXlsb2FkID0gdHlwZTsKKyAgICAgIHNlcmlhbGl6ZXIgPSBkZWZhdWx0U2VyaWFsaXplcih0
aGlzLmNvbnRhaW5lcik7CisgICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgdXNlIGBzdG9y
ZSNwdXNoUGF5bG9hZGAgd2l0aG91dCBhIHR5cGUgdW5sZXNzIHlvdXIgZGVmYXVsdCBzZXJpYWxp
emVyIGRlZmluZXMgYHB1c2hQYXlsb2FkYCIsIHNlcmlhbGl6ZXIucHVzaFBheWxvYWQpOworICAg
IH0gZWxzZSB7CisgICAgICBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKHR5cGUpOwor
ICAgIH0KKyAgICBzZXJpYWxpemVyLnB1c2hQYXlsb2FkKHRoaXMsIHBheWxvYWQpOworICB9LAor
CisgIHVwZGF0ZTogZnVuY3Rpb24odHlwZSwgZGF0YSkgeworICAgIEVtYmVyLmFzc2VydCgiWW91
IG11c3QgaW5jbHVkZSBhbiBgaWRgIGluIGEgaGFzaCBwYXNzZWQgdG8gYHVwZGF0ZWAiLCBkYXRh
LmlkICE9IG51bGwpOworCisgICAgcmV0dXJuIHRoaXMucHVzaCh0eXBlLCBkYXRhLCB0cnVlKTsK
KyAgfSwKKworICAvKioKKyAgICBJZiB5b3UgaGF2ZSBhbiBBcnJheSBvZiBub3JtYWxpemVkIGRh
dGEgdG8gcHVzaCwKKyAgICB5b3UgY2FuIGNhbGwgYHB1c2hNYW55YCB3aXRoIHRoZSBBcnJheSwg
YW5kIGl0IHdpbGwKKyAgICBjYWxsIGBwdXNoYCByZXBlYXRlZGx5IGZvciB5b3UuCisKKyAgICBA
bWV0aG9kIHB1c2hNYW55CisgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKKyAgICBAcGFyYW0ge0FycmF5fSBkYXRhcworICAgIEByZXR1cm4ge0FycmF5fQor
ICAqLworICBwdXNoTWFueTogZnVuY3Rpb24odHlwZSwgZGF0YXMpIHsKKyAgICByZXR1cm4gbWFw
KGRhdGFzLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICByZXR1cm4gdGhpcy5wdXNoKHR5cGUsIGRh
dGEpOworICAgIH0sIHRoaXMpOworICB9LAorCisgIC8qKgorICAgIElmIHlvdSBoYXZlIHNvbWUg
bWV0YWRhdGEgdG8gc2V0IGZvciBhIHR5cGUKKyAgICB5b3UgY2FuIGNhbGwgYG1ldGFGb3JUeXBl
YC4KKworICAgIEBtZXRob2QgbWV0YUZvclR5cGUKKyAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBtZXRhZGF0YQorICAq
LworICBtZXRhRm9yVHlwZTogZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEpIHsKKyAgICB0eXBlID0g
dGhpcy5tb2RlbEZvcih0eXBlKTsKKworICAgIEVtYmVyLm1lcmdlKHRoaXMudHlwZU1hcEZvcih0
eXBlKS5tZXRhZGF0YSwgbWV0YWRhdGEpOworICB9LAorCisgIC8qKgorICAgIEJ1aWxkIGEgYnJh
bmQgbmV3IHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlLCBJRCwgYW5kCisgICAgaW5pdGlhbCBkYXRh
LgorCisgICAgQG1ldGhvZCBidWlsZFJlY29yZAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtz
dWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5nfSBpZAorICAgIEBw
YXJhbSB7T2JqZWN0fSBkYXRhCisgICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8K
KyAgYnVpbGRSZWNvcmQ6IGZ1bmN0aW9uKHR5cGUsIGlkLCBkYXRhKSB7CisgICAgdmFyIHR5cGVN
YXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCisgICAgICAgIGlkVG9SZWNvcmQgPSB0eXBlTWFw
LmlkVG9SZWNvcmQ7CisKKyAgICBFbWJlci5hc3NlcnQoJ1RoZSBpZCAnICsgaWQgKyAnIGhhcyBh
bHJlYWR5IGJlZW4gdXNlZCB3aXRoIGFub3RoZXIgcmVjb3JkIG9mIHR5cGUgJyArIHR5cGUudG9T
dHJpbmcoKSArICcuJywgIWlkIHx8ICFpZFRvUmVjb3JkW2lkXSk7CisKKyAgICAvLyBsb29rdXBG
YWN0b3J5IHNob3VsZCByZWFsbHkgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNyZWF0ZXMKKyAgICAv
LyBpbnN0YW5jZXMgd2l0aCB0aGUgaW5qZWN0aW9ucyBhcHBsaWVkCisgICAgdmFyIHJlY29yZCA9
IHR5cGUuX2NyZWF0ZSh7CisgICAgICBpZDogaWQsCisgICAgICBzdG9yZTogdGhpcywKKyAgICAg
IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIKKyAgICB9KTsKKworICAgIGlmIChkYXRhKSB7Cisg
ICAgICByZWNvcmQuc2V0dXBEYXRhKGRhdGEpOworICAgIH0KKworICAgIC8vIGlmIHdlJ3JlIGNy
ZWF0aW5nIGFuIGl0ZW0sIHRoaXMgcHJvY2VzcyB3aWxsIGJlIGRvbmUKKyAgICAvLyBsYXRlciwg
b25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIHBlcnNpc3RlZC4KKyAgICBpZiAoaWQpIHsKKyAgICAg
IGlkVG9SZWNvcmRbaWRdID0gcmVjb3JkOworICAgIH0KKworICAgIHR5cGVNYXAucmVjb3Jkcy5w
dXNoKHJlY29yZCk7CisKKyAgICByZXR1cm4gcmVjb3JkOworICB9LAorCisgIC8vIC4uLi4uLi4u
Li4uLi4uLgorICAvLyAuIERFU1RSVUNUSU9OIC4KKyAgLy8gLi4uLi4uLi4uLi4uLi4uCisKKyAg
LyoqCisgICAgV2hlbiBhIHJlY29yZCBpcyBkZXN0cm95ZWQsIHRoaXMgdW4taW5kZXhlcyBpdCBh
bmQKKyAgICByZW1vdmVzIGl0IGZyb20gYW55IHJlY29yZCBhcnJheXMgc28gaXQgY2FuIGJlIEdD
ZWQuCisKKyAgICBAbWV0aG9kIGRlbWF0ZXJpYWxpemVSZWNvcmQKKyAgICBAcHJpdmF0ZQorICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAqLworICBkZW1hdGVyaWFsaXplUmVjb3JkOiBm
dW5jdGlvbihyZWNvcmQpIHsKKyAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKKyAg
ICAgICAgdHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKKyAgICAgICAgaWQgPSBnZXQo
cmVjb3JkLCAnaWQnKTsKKworICAgIHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKKworICAg
IGlmIChpZCkgeworICAgICAgZGVsZXRlIHR5cGVNYXAuaWRUb1JlY29yZFtpZF07CisgICAgfQor
CisgICAgdmFyIGxvYyA9IGluZGV4T2YodHlwZU1hcC5yZWNvcmRzLCByZWNvcmQpOworICAgIHR5
cGVNYXAucmVjb3Jkcy5zcGxpY2UobG9jLCAxKTsKKyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gLiBSRUxBVElPTlNISVAgQ0hBTkdFUyAuCisgIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgorCisgIGFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcjogZnVuY3Rpb24o
Y2hpbGRSZWNvcmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBhcmVudEtleSwgY2hhbmdlKSB7
CisgICAgdmFyIGNsaWVudElkID0gY2hpbGRSZWNvcmQuY2xpZW50SWQsCisgICAgICAgIHBhcmVu
dENsaWVudElkID0gcGFyZW50UmVjb3JkID8gcGFyZW50UmVjb3JkIDogcGFyZW50UmVjb3JkOwor
ICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKKyAgICB2YXIgY2hhbmdlcyA9IHRo
aXMuX3JlbGF0aW9uc2hpcENoYW5nZXM7CisgICAgaWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykp
IHsKKyAgICAgIGNoYW5nZXNbY2xpZW50SWRdID0ge307CisgICAgfQorICAgIGlmICghKHBhcmVu
dENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSkgeworICAgICAgY2hhbmdlc1tjbGllbnRJ
ZF1bcGFyZW50Q2xpZW50SWRdID0ge307CisgICAgfQorICAgIGlmICghKGtleSBpbiBjaGFuZ2Vz
W2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF0pKSB7CisgICAgICBjaGFuZ2VzW2NsaWVudElkXVtw
YXJlbnRDbGllbnRJZF1ba2V5XSA9IHt9OworICAgIH0KKyAgICBjaGFuZ2VzW2NsaWVudElkXVtw
YXJlbnRDbGllbnRJZF1ba2V5XVtjaGFuZ2UuY2hhbmdlVHlwZV0gPSBjaGFuZ2U7CisgIH0sCisK
KyAgcmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdlRm9yOiBmdW5jdGlvbihjbGllbnRSZWNvcmQsIGNo
aWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBhcmVudEtleSwgdHlwZSkgeworICAgIHZhciBjbGllbnRJ
ZCA9IGNsaWVudFJlY29yZC5jbGllbnRJZCwKKyAgICAgICAgcGFyZW50Q2xpZW50SWQgPSBwYXJl
bnRSZWNvcmQgPyBwYXJlbnRSZWNvcmQuY2xpZW50SWQgOiBwYXJlbnRSZWNvcmQ7CisgICAgdmFy
IGNoYW5nZXMgPSB0aGlzLl9yZWxhdGlvbnNoaXBDaGFuZ2VzOworICAgIHZhciBrZXkgPSBjaGls
ZEtleSArIHBhcmVudEtleTsKKyAgICBpZiAoIShjbGllbnRJZCBpbiBjaGFuZ2VzKSB8fCAhKHBh
cmVudENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSB8fCAhKGtleSBpbiBjaGFuZ2VzW2Ns
aWVudElkXVtwYXJlbnRDbGllbnRJZF0pKXsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVs
ZXRlIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtrZXldW3R5cGVdOworICB9LAor
CisgIHJlbGF0aW9uc2hpcENoYW5nZVBhaXJzRm9yOiBmdW5jdGlvbihyZWNvcmQpeworICAgIHZh
ciB0b1JldHVybiA9IFtdOworCisgICAgaWYoICFyZWNvcmQgKSB7IHJldHVybiB0b1JldHVybjsg
fQorCisgICAgLy9UT0RPKElnb3IpIFdoYXQgYWJvdXQgdGhlIG90aGVyIHNpZGUKKyAgICB2YXIg
Y2hhbmdlc09iamVjdCA9IHRoaXMuX3JlbGF0aW9uc2hpcENoYW5nZXNbcmVjb3JkLmNsaWVudElk
XTsKKyAgICBmb3IgKHZhciBvYmpLZXkgaW4gY2hhbmdlc09iamVjdCl7CisgICAgICBpZihjaGFu
Z2VzT2JqZWN0Lmhhc093blByb3BlcnR5KG9iaktleSkpeworICAgICAgICBmb3IgKHZhciBjaGFu
Z2VLZXkgaW4gY2hhbmdlc09iamVjdFtvYmpLZXldKXsKKyAgICAgICAgICBpZihjaGFuZ2VzT2Jq
ZWN0W29iaktleV0uaGFzT3duUHJvcGVydHkoY2hhbmdlS2V5KSl7CisgICAgICAgICAgICB0b1Jl
dHVybi5wdXNoKGNoYW5nZXNPYmplY3Rbb2JqS2V5XVtjaGFuZ2VLZXldKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRvUmV0dXJuOworICB9LAor
CisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gLiBQRVItVFlQRSBBREFQVEVSUwor
ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgYWRh
cHRlciBmb3IgYSBnaXZlbiB0eXBlLgorCisgICAgQG1ldGhvZCBhZGFwdGVyRm9yCisgICAgQHBy
aXZhdGUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHJldHVy
bnMgRFMuQWRhcHRlcgorICAqLworICBhZGFwdGVyRm9yOiBmdW5jdGlvbih0eXBlKSB7CisgICAg
dmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBhZGFwdGVyOworCisgICAgaWYgKGNvbnRh
aW5lcikgeworICAgICAgYWRhcHRlciA9IGNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyArIHR5
cGUudHlwZUtleSkgfHwgY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicpOwor
ICAgIH0KKworICAgIHJldHVybiBhZGFwdGVyIHx8IGdldCh0aGlzLCAnZGVmYXVsdEFkYXB0ZXIn
KTsKKyAgfSwKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gLiBS
RUNPUkQgQ0hBTkdFIE5PVElGSUNBVElPTiAuCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgorCisgIC8qKgorICAgIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcmlhbGl6
ZXIgZm9yIGEgZ2l2ZW4gdHlwZS4gRm9yCisgICAgZXhhbXBsZSwgYHNlcmlhbGl6ZXJGb3IoJ3Bl
cnNvbicpYCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgorICAgIGBBcHAuUGVyc29uU2VyaWFs
aXplcmAuCisKKyAgICBJZiBubyBgQXBwLlBlcnNvblNlcmlhbGl6ZXJgIGlzIGZvdW5kLCB0aGlz
IG1ldGhvZCB3aWxsIGxvb2sKKyAgICBmb3IgYW4gYEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXJg
ICh0aGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvcgorICAgIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9u
KS4KKworICAgIElmIG5vIGBBcHAuQXBwbGljYXRpb25TZXJpYWxpemVyYCBpcyBmb3VuZCwgaXQg
d2lsbCBmYWxsIGJhY2sKKyAgICB0byBhbiBpbnN0YW5jZSBvZiBgRFMuSlNPTlNlcmlhbGl6ZXJg
LgorCisgICAgQG1ldGhvZCBzZXJpYWxpemVyRm9yCisgICAgQHByaXZhdGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gdHlwZSB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQorICAgIEByZXR1cm4ge0RTLlNl
cmlhbGl6ZXJ9CisgICovCisgIHNlcmlhbGl6ZXJGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICB0
eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKKyAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRl
ckZvcih0eXBlKTsKKworICAgIHJldHVybiBzZXJpYWxpemVyRm9yKHRoaXMuY29udGFpbmVyLCB0
eXBlLnR5cGVLZXksIGFkYXB0ZXIgJiYgYWRhcHRlci5kZWZhdWx0U2VyaWFsaXplcik7CisgIH0K
K30pOworCitmdW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbnNoaXBzKHN0b3JlLCB0eXBlLCBkYXRh
LCByZWNvcmQpIHsKKyAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRp
b25zaGlwKSB7CisgICAgLy8gQSBsaW5rICh1c3VhbGx5IGEgVVJMKSB3YXMgYWxyZWFkeSBwcm92
aWRlZCBpbgorICAgIC8vIG5vcm1hbGl6ZWQgZm9ybQorICAgIGlmIChkYXRhLmxpbmtzICYmIGRh
dGEubGlua3Nba2V5XSkgeworICAgICAgaWYgKHJlY29yZCAmJiByZWxhdGlvbnNoaXAub3B0aW9u
cy5hc3luYykgeyByZWNvcmQuX3JlbGF0aW9uc2hpcHNba2V5XSA9IG51bGw7IH0KKyAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICB2YXIga2luZCA9IHJlbGF0aW9uc2hpcC5raW5kLAorICAgICAg
ICB2YWx1ZSA9IGRhdGFba2V5XTsKKworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7IHJldHVybjsg
fQorCisgICAgaWYgKGtpbmQgPT09ICdiZWxvbmdzVG8nKSB7CisgICAgICBkZXNlcmlhbGl6ZVJl
Y29yZElkKHN0b3JlLCBkYXRhLCBrZXksIHJlbGF0aW9uc2hpcCwgdmFsdWUpOworICAgIH0gZWxz
ZSBpZiAoa2luZCA9PT0gJ2hhc01hbnknKSB7CisgICAgICBkZXNlcmlhbGl6ZVJlY29yZElkcyhz
dG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIHZhbHVlKTsKKyAgICAgIGFkZFVuc2F2ZWRS
ZWNvcmRzKHJlY29yZCwga2V5LCB2YWx1ZSk7CisgICAgfQorICB9KTsKKworICByZXR1cm4gZGF0
YTsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRJZChzdG9yZSwgZGF0YSwga2V5LCBy
ZWxhdGlvbnNoaXAsIGlkKSB7CisgIGlmIChpc05vbmUoaWQpIHx8IGlkIGluc3RhbmNlb2YgRFMu
TW9kZWwpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZW9m
IGlkID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7CisgICAgdHlwZSA9
IHR5cGVGb3IocmVsYXRpb25zaGlwLCBrZXksIGRhdGEpOworICAgIGRhdGFba2V5XSA9IHN0b3Jl
LnJlY29yZEZvcklkKHR5cGUsIGlkKTsKKyAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdvYmpl
Y3QnKSB7CisgICAgLy8gcG9seW1vcnBoaWMKKyAgICBkYXRhW2tleV0gPSBzdG9yZS5yZWNvcmRG
b3JJZChpZC50eXBlLCBpZC5pZCk7CisgIH0KK30KKworZnVuY3Rpb24gdHlwZUZvcihyZWxhdGlv
bnNoaXAsIGtleSwgZGF0YSkgeworICBpZiAocmVsYXRpb25zaGlwLm9wdGlvbnMucG9seW1vcnBo
aWMpIHsKKyAgICByZXR1cm4gZGF0YVtrZXkgKyAiVHlwZSJdOworICB9IGVsc2UgeworICAgIHJl
dHVybiByZWxhdGlvbnNoaXAudHlwZTsKKyAgfQorfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZVJl
Y29yZElkcyhzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIGlkcykgeworICBmb3IgKHZh
ciBpPTAsIGw9aWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBkZXNlcmlhbGl6ZVJlY29yZElk
KHN0b3JlLCBpZHMsIGksIHJlbGF0aW9uc2hpcCwgaWRzW2ldKTsKKyAgfQorfQorCisvLyBJZiB0
aGVyZSBhcmUgYW55IHVuc2F2ZWQgcmVjb3JkcyB0aGF0IGFyZSBpbiBhIGhhc01hbnkgdGhleSB3
b24ndCBiZQorLy8gaW4gdGhlIHBheWxvYWQsIHNvIGFkZCB0aGVtIGJhY2sgaW4gbWFudWFsbHku
CitmdW5jdGlvbiBhZGRVbnNhdmVkUmVjb3JkcyhyZWNvcmQsIGtleSwgZGF0YSkgeworICBpZihy
ZWNvcmQpIHsKKyAgICBkYXRhLnB1c2hPYmplY3RzKHJlY29yZC5nZXQoa2V5KS5maWx0ZXJCeSgn
aXNOZXcnKSk7CisgIH0KK30KKworLy8gRGVsZWdhdGlvbiB0byB0aGUgYWRhcHRlciBhbmQgcHJv
bWlzZSBtYW5hZ2VtZW50CisvKioKKyAgQSBgUHJvbWlzZUFycmF5YCBpcyBhbiBvYmplY3QgdGhh
dCBhY3RzIGxpa2UgYm90aCBhbiBgRW1iZXIuQXJyYXlgCisgIGFuZCBhIHByb21pc2UuIFdoZW4g
dGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdGhlIHRoZSByZXN1bHRpbmcgdmFsdWUKKyAgd2lsbCBi
ZSBzZXQgdG8gdGhlIGBQcm9taXNlQXJyYXlgJ3MgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1h
a2VzCisgIGl0IGVhc3kgdG8gY3JlYXRlIGRhdGEgYmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VB
cnJheWAgdGhhdCB3aWxsIGJlCisgIHVwZGF0ZWQgd2hlbiB0aGUgcHJvbWlzZSByZXNvbHZlcy4K
KworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIFtFbWJlci5Qcm9taXNlUHJveHlNaXhp
bgorICBkb2N1bWVudGF0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4u
aHRtbCkuCisKKyAgRXhhbXBsZQorCisgIGBgYGphdmFzY3JpcHQKKyAgdmFyIHByb21pc2VBcnJh
eSA9IERTLlByb21pc2VBcnJheS5jcmVhdGUoeworICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3Nv
bWUvcmVtb3RlL2RhdGEuanNvbicpCisgIH0pOworCisgIHByb21pc2VBcnJheS5nZXQoJ2xlbmd0
aCcpOyAvLyAwCisKKyAgcHJvbWlzZUFycmF5LnRoZW4oZnVuY3Rpb24oKSB7CisgICAgcHJvbWlz
ZUFycmF5LmdldCgnbGVuZ3RoJyk7IC8vIDEwMAorICB9KTsKKyAgYGBgCisKKyAgQGNsYXNzIFBy
b21pc2VBcnJheQorICBAbmFtZXNwYWNlIERTCisgIEBleHRlbmRzIEVtYmVyLkFycmF5UHJveHkK
KyAgQHVzZXMgRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KKyovCitEUy5Qcm9taXNlQXJyYXkgPSBF
bWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7CisvKioKKyAg
QSBgUHJvbWlzZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBsaWtlIGJvdGggYW4gYEVt
YmVyLk9iamVjdGAKKyAgYW5kIGEgcHJvbWlzZS4gV2hlbiB0aGUgcHJvbWlzZSBpcyByZXNvbHZl
ZCB0aGUgdGhlIHJlc3VsdGluZyB2YWx1ZQorICB3aWxsIGJlIHNldCB0byB0aGUgYFByb21pc2VP
YmplY3RgJ3MgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2VzCisgIGl0IGVhc3kgdG8gY3Jl
YXRlIGRhdGEgYmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VPYmplY3RgIHRoYXQgd2lsbAorICBi
ZSB1cGRhdGVkIHdoZW4gdGhlIHByb21pc2UgcmVzb2x2ZXMuCisKKyAgRm9yIG1vcmUgaW5mb3Jt
YXRpb24gc2VlIHRoZSBbRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KKyAgZG9jdW1lbnRhdGlvbl0o
L2FwaS9jbGFzc2VzL0VtYmVyLlByb21pc2VQcm94eU1peGluLmh0bWwpLgorCisgIEV4YW1wbGUK
KworICBgYGBqYXZhc2NyaXB0CisgIHZhciBwcm9taXNlT2JqZWN0ID0gRFMuUHJvbWlzZU9iamVj
dC5jcmVhdGUoeworICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3RlL2RhdGEuanNv
bicpCisgIH0pOworCisgIHByb21pc2VPYmplY3QuZ2V0KCduYW1lJyk7IC8vIG51bGwKKworICBw
cm9taXNlT2JqZWN0LnRoZW4oZnVuY3Rpb24oKSB7CisgICAgcHJvbWlzZU9iamVjdC5nZXQoJ25h
bWUnKTsgLy8gJ1RvbXN0ZXInCisgIH0pOworICBgYGAKKworICBAY2xhc3MgUHJvbWlzZU9iamVj
dAorICBAbmFtZXNwYWNlIERTCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdFByb3h5CisgIEB1c2Vz
IEVtYmVyLlByb21pc2VQcm94eU1peGluCisqLworRFMuUHJvbWlzZU9iamVjdCA9IEVtYmVyLk9i
amVjdFByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7CisKK2Z1bmN0aW9uIHBy
b21pc2VPYmplY3QocHJvbWlzZSkgeworICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUo
eyBwcm9taXNlOiBwcm9taXNlIH0pOworfQorCitmdW5jdGlvbiBwcm9taXNlQXJyYXkocHJvbWlz
ZSkgeworICByZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2Ug
fSk7Cit9CisKK2Z1bmN0aW9uIGlzVGhlbmFibGUob2JqZWN0KSB7CisgIHJldHVybiBvYmplY3Qg
JiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nOworfQorCitmdW5jdGlvbiBzZXJp
YWxpemVyRm9yKGNvbnRhaW5lciwgdHlwZSwgZGVmYXVsdFNlcmlhbGl6ZXIpIHsKKyAgcmV0dXJu
IGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6Jyt0eXBlKSB8fAorICAgICAgICAgICAgICAg
ICBjb250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKKyAgICAgICAg
ICAgICAgICAgY29udGFpbmVyLmxvb2t1cCgnc2VyaWFsaXplcjonICsgZGVmYXVsdFNlcmlhbGl6
ZXIpIHx8CisgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRl
ZmF1bHQnKTsKK30KKworZnVuY3Rpb24gZGVmYXVsdFNlcmlhbGl6ZXIoY29udGFpbmVyKSB7Cisg
IHJldHVybiBjb250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKKyAg
ICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsKK30KKworZnVu
Y3Rpb24gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSkgeworICB2YXIgc2VyaWFs
aXplciA9IGFkYXB0ZXIuc2VyaWFsaXplciwKKyAgICAgIGRlZmF1bHRTZXJpYWxpemVyID0gYWRh
cHRlci5kZWZhdWx0U2VyaWFsaXplciwKKyAgICAgIGNvbnRhaW5lciA9IGFkYXB0ZXIuY29udGFp
bmVyOworCisgIGlmIChjb250YWluZXIgJiYgc2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3IoY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGRl
ZmF1bHRTZXJpYWxpemVyKTsKKyAgfQorCisgIGlmIChzZXJpYWxpemVyID09PSBudWxsIHx8IHNl
cmlhbGl6ZXIgPT09IHVuZGVmaW5lZCkgeworICAgIHNlcmlhbGl6ZXIgPSB7CisgICAgICBleHRy
YWN0OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeyByZXR1cm4gcGF5bG9hZDsgfQor
ICAgIH07CisgIH0KKworICByZXR1cm4gc2VyaWFsaXplcjsKK30KKworZnVuY3Rpb24gX2ZpbmQo
YWRhcHRlciwgc3RvcmUsIHR5cGUsIGlkKSB7CisgIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5k
KHN0b3JlLCB0eXBlLCBpZCksCisgICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0
ZXIoYWRhcHRlciwgdHlwZSk7CisKKyAgcmV0dXJuIHJlc29sdmUocHJvbWlzZSwgIkRTOiBIYW5k
bGUgQWRhcHRlciNmaW5kIG9mICIgKyB0eXBlICsgIiB3aXRoIGlkOiAiICsgaWQpLnRoZW4oZnVu
Y3Rpb24ocGF5bG9hZCkgeworICAgIEVtYmVyLmFzc2VydCgiWW91IG1hZGUgYSByZXF1ZXN0IGZv
ciBhICIgKyB0eXBlLnR5cGVLZXkgKyAiIHdpdGggaWQgIiArIGlkICsgIiwgYnV0IHRoZSBhZGFw
dGVyJ3MgcmVzcG9uc2UgZGlkIG5vdCBoYXZlIGFueSBkYXRhIiwgcGF5bG9hZCk7CisgICAgcGF5
bG9hZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgaWQsICdmaW5k
Jyk7CisKKyAgICByZXR1cm4gc3RvcmUucHVzaCh0eXBlLCBwYXlsb2FkKTsKKyAgfSwgZnVuY3Rp
b24oZXJyb3IpIHsKKyAgICB2YXIgcmVjb3JkID0gc3RvcmUuZ2V0QnlJZCh0eXBlLCBpZCk7Cisg
ICAgcmVjb3JkLm5vdEZvdW5kKCk7CisgICAgdGhyb3cgZXJyb3I7CisgIH0sICJEUzogRXh0cmFj
dCBwYXlsb2FkIG9mICciICsgdHlwZSArICInIik7Cit9CisKK2Z1bmN0aW9uIF9maW5kTWFueShh
ZGFwdGVyLCBzdG9yZSwgdHlwZSwgaWRzLCBvd25lcikgeworICB2YXIgcHJvbWlzZSA9IGFkYXB0
ZXIuZmluZE1hbnkoc3RvcmUsIHR5cGUsIGlkcywgb3duZXIpLAorICAgICAgc2VyaWFsaXplciA9
IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpOworCisgIHJldHVybiByZXNvbHZl
KHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZE1hbnkgb2YgIiArIHR5cGUpLnRoZW4o
ZnVuY3Rpb24ocGF5bG9hZCkgeworICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3Rv
cmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5kTWFueScpOworCisgICAgRW1iZXIuYXNzZXJ0
KCJUaGUgcmVzcG9uc2UgZnJvbSBhIGZpbmRNYW55IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsg
RW1iZXIuaW5zcGVjdChwYXlsb2FkKSwgRW1iZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXkn
KTsKKworICAgIHN0b3JlLnB1c2hNYW55KHR5cGUsIHBheWxvYWQpOworICB9LCBudWxsLCAiRFM6
IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgdHlwZSk7Cit9CisKK2Z1bmN0aW9uIF9maW5kSGFzTWFu
eShhZGFwdGVyLCBzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApIHsKKyAgdmFyIHBy
b21pc2UgPSBhZGFwdGVyLmZpbmRIYXNNYW55KHN0b3JlLCByZWNvcmQsIGxpbmssIHJlbGF0aW9u
c2hpcCksCisgICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwg
cmVsYXRpb25zaGlwLnR5cGUpOworCisgIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFu
ZGxlIEFkYXB0ZXIjZmluZEhhc01hbnkgb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25z
aGlwLnR5cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgeworICAgIHBheWxvYWQgPSBzZXJpYWxp
emVyLmV4dHJhY3Qoc3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmlu
ZEhhc01hbnknKTsKKworICAgIEVtYmVyLmFzc2VydCgiVGhlIHJlc3BvbnNlIGZyb20gYSBmaW5k
SGFzTWFueSBtdXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCks
IEVtYmVyLnR5cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7CisKKyAgICB2YXIgcmVjb3JkcyA9
IHN0b3JlLnB1c2hNYW55KHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkKTsKKyAgICByZWNvcmQu
dXBkYXRlSGFzTWFueShyZWxhdGlvbnNoaXAua2V5LCByZWNvcmRzKTsKKyAgfSwgbnVsbCwgIkRT
OiBFeHRyYWN0IHBheWxvYWQgb2YgIiArIHJlY29yZCArICIgOiBoYXNNYW55ICIgKyByZWxhdGlv
bnNoaXAudHlwZSk7Cit9CisKK2Z1bmN0aW9uIF9maW5kQmVsb25nc1RvKGFkYXB0ZXIsIHN0b3Jl
LCByZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCkgeworICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIu
ZmluZEJlbG9uZ3NUbyhzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApLAorICAgICAg
c2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHJlbGF0aW9uc2hpcC50
eXBlKTsKKworICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2Zp
bmRCZWxvbmdzVG8gb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUpLnRo
ZW4oZnVuY3Rpb24ocGF5bG9hZCkgeworICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qo
c3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZEJlbG9uZ3NUbycp
OworCisgICAgdmFyIHJlY29yZCA9IHN0b3JlLnB1c2gocmVsYXRpb25zaGlwLnR5cGUsIHBheWxv
YWQpOworICAgIHJlY29yZC51cGRhdGVCZWxvbmdzVG8ocmVsYXRpb25zaGlwLmtleSwgcmVjb3Jk
KTsKKyAgICByZXR1cm4gcmVjb3JkOworICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBv
ZiAiICsgcmVjb3JkICsgIiA6ICIgKyByZWxhdGlvbnNoaXAudHlwZSk7Cit9CisKK2Z1bmN0aW9u
IF9maW5kQWxsKGFkYXB0ZXIsIHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7CisgIHZhciBwcm9t
aXNlID0gYWRhcHRlci5maW5kQWxsKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSwKKyAgICAgIHNl
cmlhbGl6ZXIgPSBzZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVyLCB0eXBlKTsKKworICByZXR1
cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRBbGwgb2YgIiArIHR5
cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgeworICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4
dHJhY3Qoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5kQWxsJyk7CisKKyAgICBFbWJl
ci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9tIGEgZmluZEFsbCBtdXN0IGJlIGFuIEFycmF5LCBu
b3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5cGVPZihwYXlsb2FkKSA9PT0g
J2FycmF5Jyk7CisKKyAgICBzdG9yZS5wdXNoTWFueSh0eXBlLCBwYXlsb2FkKTsKKyAgICBzdG9y
ZS5kaWRVcGRhdGVBbGwodHlwZSk7CisgICAgcmV0dXJuIHN0b3JlLmFsbCh0eXBlKTsKKyAgfSwg
bnVsbCwgIkRTOiBFeHRyYWN0IHBheWxvYWQgb2YgZmluZEFsbCAiICsgdHlwZSk7Cit9CisKK2Z1
bmN0aW9uIF9maW5kUXVlcnkoYWRhcHRlciwgc3RvcmUsIHR5cGUsIHF1ZXJ5LCByZWNvcmRBcnJh
eSkgeworICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZFF1ZXJ5KHN0b3JlLCB0eXBlLCBxdWVy
eSwgcmVjb3JkQXJyYXkpLAorICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVy
KGFkYXB0ZXIsIHR5cGUpOworCisgIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxl
IEFkYXB0ZXIjZmluZFF1ZXJ5IG9mICIgKyB0eXBlKS50aGVuKGZ1bmN0aW9uKHBheWxvYWQpIHsK
KyAgICBwYXlsb2FkID0gc2VyaWFsaXplci5leHRyYWN0KHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBu
dWxsLCAnZmluZFF1ZXJ5Jyk7CisKKyAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9t
IGEgZmluZFF1ZXJ5IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5zcGVjdChwYXls
b2FkKSwgRW1iZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXknKTsKKworICAgIHJlY29yZEFy
cmF5LmxvYWQocGF5bG9hZCk7CisgICAgcmV0dXJuIHJlY29yZEFycmF5OworICB9LCBudWxsLCAi
RFM6IEV4dHJhY3QgcGF5bG9hZCBvZiBmaW5kUXVlcnkgIiArIHR5cGUpOworfQorCitmdW5jdGlv
biBfY29tbWl0KGFkYXB0ZXIsIHN0b3JlLCBvcGVyYXRpb24sIHJlY29yZCkgeworICB2YXIgdHlw
ZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKKyAgICAgIHByb21pc2UgPSBhZGFwdGVyW29wZXJhdGlv
bl0oc3RvcmUsIHR5cGUsIHJlY29yZCksCisgICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZv
ckFkYXB0ZXIoYWRhcHRlciwgdHlwZSk7CisKKyAgRW1iZXIuYXNzZXJ0KCJZb3VyIGFkYXB0ZXIn
cyAnIiArIG9wZXJhdGlvbiArICInIG1ldGhvZCBtdXN0IHJldHVybiBhIHByb21pc2UsIGJ1dCBp
dCByZXR1cm5lZCAiICsgcHJvbWlzZSwgaXNUaGVuYWJsZShwcm9taXNlKSk7CisKKyAgcmV0dXJu
IHByb21pc2UudGhlbihmdW5jdGlvbihwYXlsb2FkKSB7CisgICAgaWYgKHBheWxvYWQpIHsgcGF5
bG9hZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgZ2V0KHJlY29y
ZCwgJ2lkJyksIG9wZXJhdGlvbik7IH0KKyAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29yZCwg
cGF5bG9hZCk7CisgICAgcmV0dXJuIHJlY29yZDsKKyAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Cisg
ICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIERTLkludmFsaWRFcnJvcikgeworICAgICAgc3RvcmUu
cmVjb3JkV2FzSW52YWxpZChyZWNvcmQsIHJlYXNvbi5lcnJvcnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICBzdG9yZS5yZWNvcmRXYXNFcnJvcihyZWNvcmQsIHJlYXNvbik7CisgICAgfQorCisgICAg
dGhyb3cgcmVhc29uOworICB9LCAiRFM6IEV4dHJhY3QgYW5kIG5vdGlmeSBhYm91dCAiICsgb3Bl
cmF0aW9uICsgIiBjb21wbGV0aW9uIG9mICIgKyByZWNvcmQpOworfQorCit9KSgpOworCisKKwor
KGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworLyoKKyAgVGhpcyBmaWxlIGVuY2Fwc3VsYXRl
cyB0aGUgdmFyaW91cyBzdGF0ZXMgdGhhdCBhIHJlY29yZCBjYW4gdHJhbnNpdGlvbgorICB0aHJv
dWdoIGR1cmluZyBpdHMgbGlmZWN5Y2xlLgorKi8KKy8qKgorICAjIyMgU3RhdGUKKworICBFYWNo
IHJlY29yZCBoYXMgYSBgY3VycmVudFN0YXRlYCBwcm9wZXJ0eSB0aGF0IGV4cGxpY2l0bHkgdHJh
Y2tzIHdoYXQKKyAgc3RhdGUgYSByZWNvcmQgaXMgaW4gYXQgYW55IGdpdmVuIHRpbWUuIEZvciBp
bnN0YW5jZSwgaWYgYSByZWNvcmQgaXMKKyAgbmV3bHkgY3JlYXRlZCBhbmQgaGFzIG5vdCB5ZXQg
YmVlbiBzZW50IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLAorICBpdCB3b3VsZCBiZSBpbiB0
aGUgYHJvb3QubG9hZGVkLmNyZWF0ZWQudW5jb21taXR0ZWRgIHN0YXRlLiAgSWYgYQorICByZWNv
cmQgaGFzIGhhZCBsb2NhbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gaXQgdGhhdCBhcmUgaW4gdGhl
CisgIHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSByZWNvcmQgd291bGQgYmUgaW4gdGhlCisg
IGByb290LmxvYWRlZC51cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4gKFRoZXNlIHN0YXRlIHBhdGhz
IHdpbGwgYmUKKyAgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LikKKworICBFdmVudHMg
YXJlIHNlbnQgYnkgdGhlIHJlY29yZCBvciBpdHMgc3RvcmUgdG8gdGhlIHJlY29yZCdzCisgIGBj
dXJyZW50U3RhdGVgIHByb3BlcnR5LiBIb3cgdGhlIHN0YXRlIHJlYWN0cyB0byB0aGVzZSBldmVu
dHMgaXMKKyAgZGVwZW5kZW50IG9uIHdoaWNoIHN0YXRlIGl0IGlzIGluLiBJbiBzb21lIHN0YXRl
cywgY2VydGFpbiBldmVudHMKKyAgd2lsbCBiZSBpbnZhbGlkIGFuZCB3aWxsIGNhdXNlIGFuIGV4
Y2VwdGlvbiB0byBiZSByYWlzZWQuCisKKyAgU3RhdGVzIGFyZSBoaWVyYXJjaGljYWwgYW5kIGV2
ZXJ5IHN0YXRlIGlzIGEgc3Vic3RhdGUgb2YgdGhlCisgIGBSb290U3RhdGVgLiBGb3IgZXhhbXBs
ZSwgYSByZWNvcmQgY2FuIGJlIGluIHRoZQorICBgcm9vdC5kZWxldGVkLnVuY29tbWl0dGVkYCBz
dGF0ZSwgdGhlbiB0cmFuc2l0aW9uIGludG8gdGhlCisgIGByb290LmRlbGV0ZWQuaW5GbGlnaHRg
IHN0YXRlLiBJZiBhIGNoaWxkIHN0YXRlIGRvZXMgbm90IGltcGxlbWVudAorICBhbiBldmVudCBo
YW5kbGVyLCB0aGUgc3RhdGUgbWFuYWdlciB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBldmVu
dAorICBvbiBhbGwgcGFyZW50IHN0YXRlcyB1bnRpbCB0aGUgcm9vdCBzdGF0ZSBpcyByZWFjaGVk
LiBUaGUgc3RhdGUKKyAgaGllcmFyY2h5IG9mIGEgcmVjb3JkIGlzIGRlc2NyaWJlZCBpbiB0ZXJt
cyBvZiBhIHBhdGggc3RyaW5nLiBZb3UKKyAgY2FuIGRldGVybWluZSBhIHJlY29yZCdzIGN1cnJl
bnQgc3RhdGUgYnkgZ2V0dGluZyB0aGUgc3RhdGUncworICBgc3RhdGVOYW1lYCBwcm9wZXJ0eToK
KworICBgYGBqYXZhc2NyaXB0CisgIHJlY29yZC5nZXQoJ2N1cnJlbnRTdGF0ZS5zdGF0ZU5hbWUn
KTsKKyAgLy89PiAicm9vdC5jcmVhdGVkLnVuY29tbWl0dGVkIgorICAgYGBgCisKKyAgVGhlIGhp
ZXJhcmNoeSBvZiB2YWxpZCBzdGF0ZXMgdGhhdCBzaGlwIHdpdGggZW1iZXIgZGF0YSBsb29rcyBs
aWtlCisgIHRoaXM6CisKKyAgYGBgdGV4dAorICAqIHJvb3QKKyAgICAqIGRlbGV0ZWQKKyAgICAg
ICogc2F2ZWQKKyAgICAgICogdW5jb21taXR0ZWQKKyAgICAgICogaW5GbGlnaHQKKyAgICAqIGVt
cHR5CisgICAgKiBsb2FkZWQKKyAgICAgICogY3JlYXRlZAorICAgICAgICAqIHVuY29tbWl0dGVk
CisgICAgICAgICogaW5GbGlnaHQKKyAgICAgICogc2F2ZWQKKyAgICAgICogdXBkYXRlZAorICAg
ICAgICAqIHVuY29tbWl0dGVkCisgICAgICAgICogaW5GbGlnaHQKKyAgICAqIGxvYWRpbmcKKyAg
YGBgCisKKyAgVGhlIGBEUy5Nb2RlbGAgc3RhdGVzIGFyZSB0aGVtc2VsdmVzIHN0YXRlbGVzcy4g
V2hhdCB3ZSBtZWFuIGlzCisgIHRoYXQsIHRoZSBoaWVyYXJjaGljYWwgc3RhdGVzIHRoYXQgZWFj
aCBvZiAqdGhvc2UqIHBvaW50cyB0byBpcyBhCisgIHNoYXJlZCBkYXRhIHN0cnVjdHVyZS4gRm9y
IHBlcmZvcm1hbmNlIHJlYXNvbnMsIGluc3RlYWQgb2YgZWFjaAorICByZWNvcmQgZ2V0dGluZyBp
dHMgb3duIGNvcHkgb2YgdGhlIGhpZXJhcmNoeSBvZiBzdGF0ZXMsIGVhY2ggcmVjb3JkCisgIHBv
aW50cyB0byB0aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBpbnN0YW5jZS4gSG93IGRvZXMg
YSBzdGF0ZQorICBrbm93IHdoaWNoIHJlY29yZCBpdCBzaG91bGQgYmUgYWN0aW5nIG9uPyBXZSBw
YXNzIHRoZSByZWNvcmQKKyAgaW5zdGFuY2UgaW50byB0aGUgc3RhdGUncyBldmVudCBoYW5kbGVy
cyBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCisKKyAgVGhlIHJlY29yZCBwYXNzZWQgYXMgdGhlIGZp
cnN0IHBhcmFtZXRlciBpcyB3aGVyZSB5b3Ugc2hvdWxkIHN0YXNoCisgIHN0YXRlIGFib3V0IHRo
ZSByZWNvcmQgaWYgbmVlZGVkOyB5b3Ugc2hvdWxkIG5ldmVyIHN0b3JlIGRhdGEgb24gdGhlIHN0
YXRlCisgIG9iamVjdCBpdHNlbGYuCisKKyAgIyMjIEV2ZW50cyBhbmQgRmxhZ3MKKworICBBIHN0
YXRlIG1heSBpbXBsZW1lbnQgemVybyBvciBtb3JlIGV2ZW50cyBhbmQgZmxhZ3MuCisKKyAgIyMj
IyBFdmVudHMKKworICBFdmVudHMgYXJlIG5hbWVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnZva2Vk
IHdoZW4gc2VudCB0byBhIHJlY29yZC4gVGhlCisgIHJlY29yZCB3aWxsIGZpcnN0IGxvb2sgZm9y
IGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgb24gdGhlCisgIGN1cnJlbnQgc3RhdGUuIElm
IG5vIG1ldGhvZCBpcyBmb3VuZCwgaXQgd2lsbCBzZWFyY2ggdGhlIGN1cnJlbnQKKyAgc3RhdGUn
cyBwYXJlbnQsIGFuZCB0aGVuIGl0cyBncmFuZHBhcmVudCwgYW5kIHNvIG9uIHVudGlsIHJlYWNo
aW5nCisgIHRoZSB0b3Agb2YgdGhlIGhpZXJhcmNoeS4gSWYgdGhlIHJvb3QgaXMgcmVhY2hlZCB3
aXRob3V0IGFuIGV2ZW50CisgIGhhbmRsZXIgYmVpbmcgZm91bmQsIGFuIGV4Y2VwdGlvbiB3aWxs
IGJlIHJhaXNlZC4gVGhpcyBjYW4gYmUgdmVyeQorICBoZWxwZnVsIHdoZW4gZGVidWdnaW5nIG5l
dyBmZWF0dXJlcy4KKworICBIZXJlJ3MgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHN0
YXRlIHdpdGggYSBgbXlFdmVudGAgZXZlbnQgaGFuZGxlcjoKKworICBgYGBqYXZhc2NyaXB0Cisg
IGFTdGF0ZTogRFMuU3RhdGUuY3JlYXRlKHsKKyAgICBteUV2ZW50OiBmdW5jdGlvbihtYW5hZ2Vy
LCBwYXJhbSkgeworICAgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIG15RXZlbnQgd2l0aCIsIHBh
cmFtKTsKKyAgICB9CisgIH0pCisgIGBgYAorCisgIFRvIHRyaWdnZXIgdGhpcyBldmVudDoKKwor
ICBgYGBqYXZhc2NyaXB0CisgIHJlY29yZC5zZW5kKCdteUV2ZW50JywgJ2ZvbycpOworICAvLz0+
ICJSZWNlaXZlZCBteUV2ZW50IHdpdGggZm9vIgorICBgYGAKKworICBOb3RlIHRoYXQgYW4gb3B0
aW9uYWwgcGFyYW1ldGVyIGNhbiBiZSBzZW50IHRvIGEgcmVjb3JkJ3MgYHNlbmQoKWAgbWV0aG9k
LAorICB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byB0aGUg
ZXZlbnQgaGFuZGxlci4KKworICBFdmVudHMgc2hvdWxkIHRyYW5zaXRpb24gdG8gYSBkaWZmZXJl
bnQgc3RhdGUgaWYgYXBwcm9wcmlhdGUuIFRoaXMgY2FuIGJlCisgIGRvbmUgYnkgY2FsbGluZyB0
aGUgcmVjb3JkJ3MgYHRyYW5zaXRpb25UbygpYCBtZXRob2Qgd2l0aCBhIHBhdGggdG8gdGhlCisg
IGRlc2lyZWQgc3RhdGUuIFRoZSBzdGF0ZSBtYW5hZ2VyIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZl
IHRoZSBzdGF0ZSBwYXRoCisgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlLiBJZiBubyBz
dGF0ZSBpcyBmb3VuZCBhdCB0aGF0IHBhdGgsIGl0IHdpbGwKKyAgYXR0ZW1wdCB0byByZXNvbHZl
IGl0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlJ3MgcGFyZW50LCBhbmQgdGhlbiBpdHMK
KyAgcGFyZW50LCBhbmQgc28gb24gdW50aWwgdGhlIHJvb3QgaXMgcmVhY2hlZC4gRm9yIGV4YW1w
bGUsIGltYWdpbmUgYSBoaWVyYXJjaHkKKyAgbGlrZSB0aGlzOgorCisgICAgICAqIGNyZWF0ZWQK
KyAgICAgICAgKiB1bmNvbW1pdHRlZCA8LS0gY3VycmVudFN0YXRlCisgICAgICAgICogaW5GbGln
aHQKKyAgICAgICogdXBkYXRlZAorICAgICAgICAqIGluRmxpZ2h0CisKKyAgSWYgd2UgYXJlIGN1
cnJlbnRseSBpbiB0aGUgYHVuY29tbWl0dGVkYCBzdGF0ZSwgY2FsbGluZworICBgdHJhbnNpdGlv
blRvKCdpbkZsaWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvIHRoZSBgY3JlYXRlZC5pbkZsaWdo
dGAgc3RhdGUsCisgIHdoaWxlIGNhbGxpbmcgYHRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdo
dCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvCisgIHRoZSBgdXBkYXRlZC5pbkZsaWdodGAgc3RhdGUu
CisKKyAgUmVtZW1iZXIgdGhhdCAqb25seSBldmVudHMqIHNob3VsZCBldmVyIGNhdXNlIGEgc3Rh
dGUgdHJhbnNpdGlvbi4gWW91IHNob3VsZAorICBuZXZlciBjYWxsIGB0cmFuc2l0aW9uVG8oKWAg
ZnJvbSBvdXRzaWRlIGEgc3RhdGUncyBldmVudCBoYW5kbGVyLiBJZiB5b3UgYXJlCisgIHRlbXB0
ZWQgdG8gZG8gc28sIGNyZWF0ZSBhIG5ldyBldmVudCBhbmQgc2VuZCB0aGF0IHRvIHRoZSBzdGF0
ZSBtYW5hZ2VyLgorCisgICMjIyMgRmxhZ3MKKworICBGbGFncyBhcmUgQm9vbGVhbiB2YWx1ZXMg
dGhhdCBjYW4gYmUgdXNlZCB0byBpbnRyb3NwZWN0IGEgcmVjb3JkJ3MgY3VycmVudAorICBzdGF0
ZSBpbiBhIG1vcmUgdXNlci1mcmllbmRseSB3YXkgdGhhbiBleGFtaW5pbmcgaXRzIHN0YXRlIHBh
dGguIEZvciBleGFtcGxlLAorICBpbnN0ZWFkIG9mIGRvaW5nIHRoaXM6CisKKyAgYGBgamF2YXNj
cmlwdAorICB2YXIgc3RhdGVQYXRoID0gcmVjb3JkLmdldCgnc3RhdGVNYW5hZ2VyLmN1cnJlbnRQ
YXRoJyk7CisgIGlmIChzdGF0ZVBhdGggPT09ICdjcmVhdGVkLmluRmxpZ2h0JykgeworICAgIGRv
U29tZXRoaW5nKCk7CisgIH0KKyAgYGBgCisKKyAgWW91IGNhbiBzYXk6CisKKyAgYGBgamF2YXNj
cmlwdAorICBpZiAocmVjb3JkLmdldCgnaXNOZXcnKSAmJiByZWNvcmQuZ2V0KCdpc1NhdmluZycp
KSB7CisgICAgZG9Tb21ldGhpbmcoKTsKKyAgfQorICBgYGAKKworICBJZiB5b3VyIHN0YXRlIGRv
ZXMgbm90IHNldCBhIHZhbHVlIGZvciBhIGdpdmVuIGZsYWcsIHRoZSB2YWx1ZSB3aWxsCisgIGJl
IGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgKG9yIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgc3Rh
dGUgaGllcmFyY2h5CisgIHdoZXJlIGl0IGlzIGRlZmluZWQpLgorCisgIFRoZSBjdXJyZW50IHNl
dCBvZiBmbGFncyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IGZs
YWcsCisgIGluIGFkZGl0aW9uIHRvIHRoZSBhcmVhIGJlbG93LCB5b3Ugd2lsbCBhbHNvIG5lZWQg
dG8gZGVjbGFyZSBpdCBpbiB0aGUKKyAgYERTLk1vZGVsYCBjbGFzcy4KKworCisgICAqIFtpc0Vt
cHR5XShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lzRW1wdHkpCisgICAqIFtpc0xvYWRpbmddKERT
Lk1vZGVsLmh0bWwjcHJvcGVydHlfaXNMb2FkaW5nKQorICAgKiBbaXNMb2FkZWRdKERTLk1vZGVs
Lmh0bWwjcHJvcGVydHlfaXNMb2FkZWQpCisgICAqIFtpc0RpcnR5XShEUy5Nb2RlbC5odG1sI3By
b3BlcnR5X2lzRGlydHkpCisgICAqIFtpc1NhdmluZ10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9p
c1NhdmluZykKKyAgICogW2lzRGVsZXRlZF0oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc0RlbGV0
ZWQpCisgICAqIFtpc05ld10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc05ldykKKyAgICogW2lz
VmFsaWRdKERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNWYWxpZCkKKworICBAbmFtZXNwYWNlIERT
CisgIEBjbGFzcyBSb290U3RhdGUKKyovCisKK3ZhciBoYXNEZWZpbmVkUHJvcGVydGllcyA9IGZ1
bmN0aW9uKG9iamVjdCkgeworICAvLyBJZ25vcmUgaW50ZXJuYWwgcHJvcGVydHkgZGVmaW5lZCBi
eSBzaW11bGF0ZWQgYEVtYmVyLmNyZWF0ZWAuCisgIHZhciBuYW1lcyA9IEVtYmVyLmtleXMob2Jq
ZWN0KTsKKyAgdmFyIGksIGwsIG5hbWU7CisgIGZvciAoaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7
IGkgPCBsOyBpKysgKSB7CisgICAgbmFtZSA9IG5hbWVzW2ldOworICAgIGlmIChvYmplY3QuaGFz
T3duUHJvcGVydHkobmFtZSkgJiYgb2JqZWN0W25hbWVdKSB7IHJldHVybiB0cnVlOyB9CisgIH0K
KworICByZXR1cm4gZmFsc2U7Cit9OworCit2YXIgZGlkU2V0UHJvcGVydHkgPSBmdW5jdGlvbihy
ZWNvcmQsIGNvbnRleHQpIHsKKyAgaWYgKGNvbnRleHQudmFsdWUgPT09IGNvbnRleHQub3JpZ2lu
YWxWYWx1ZSkgeworICAgIGRlbGV0ZSByZWNvcmQuX2F0dHJpYnV0ZXNbY29udGV4dC5uYW1lXTsK
KyAgICByZWNvcmQuc2VuZCgncHJvcGVydHlXYXNSZXNldCcsIGNvbnRleHQubmFtZSk7CisgIH0g
ZWxzZSBpZiAoY29udGV4dC52YWx1ZSAhPT0gY29udGV4dC5vbGRWYWx1ZSkgeworICAgIHJlY29y
ZC5zZW5kKCdiZWNvbWVEaXJ0eScpOworICB9CisKKyAgcmVjb3JkLnVwZGF0ZVJlY29yZEFycmF5
c0xhdGVyKCk7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKKy8vCisvLyBFYWNoIHN0
YXRlIGhhcyBhIGJvb2xlYW4gdmFsdWUgZm9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgor
Ly8KKy8vICogaXNMb2FkZWQ6IFRoZSByZWNvcmQgaGFzIGEgcG9wdWxhdGVkIGBkYXRhYCBwcm9w
ZXJ0eS4gV2hlbiBhCisvLyAgIHJlY29yZCBpcyBsb2FkZWQgdmlhIGBzdG9yZS5maW5kYCwgYGlz
TG9hZGVkYCBpcyBmYWxzZQorLy8gICB1bnRpbCB0aGUgYWRhcHRlciBzZXRzIGl0LiBXaGVuIGEg
cmVjb3JkIGlzIGNyZWF0ZWQgbG9jYWxseSwKKy8vICAgaXRzIGBpc0xvYWRlZGAgcHJvcGVydHkg
aXMgYWx3YXlzIHRydWUuCisvLyAqIGlzRGlydHk6IFRoZSByZWNvcmQgaGFzIGxvY2FsIGNoYW5n
ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgorLy8gICBzYXZlZCBieSB0aGUgYWRhcHRlci4gVGhp
cyBpbmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCisvLyAgIGNyZWF0ZWQgKGJ1dCBub3Qg
eWV0IHNhdmVkKSBvciBkZWxldGVkLgorLy8gKiBpc1NhdmluZzogVGhlIHJlY29yZCBoYXMgYmVl
biBjb21taXR0ZWQsIGJ1dAorLy8gICB0aGUgYWRhcHRlciBoYXMgbm90IHlldCBhY2tub3dsZWRn
ZWQgdGhhdCB0aGUgY2hhbmdlcyBoYXZlCisvLyAgIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBiYWNr
ZW5kLgorLy8gKiBpc0RlbGV0ZWQ6IFRoZSByZWNvcmQgd2FzIG1hcmtlZCBmb3IgZGVsZXRpb24u
IFdoZW4gYGlzRGVsZXRlZGAKKy8vICAgaXMgdHJ1ZSBhbmQgYGlzRGlydHlgIGlzIHRydWUsIHRo
ZSByZWNvcmQgaXMgZGVsZXRlZCBsb2NhbGx5CisvLyAgIGJ1dCB0aGUgZGVsZXRpb24gd2FzIG5v
dCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMKKy8vICAgdHJ1ZSwgdGhlIGNoYW5n
ZSBpcyBpbi1mbGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0eWAgYW5kCisvLyAgIGBpc1NhdmluZ2Ag
YXJlIGZhbHNlLCB0aGUgY2hhbmdlIGhhcyBwZXJzaXN0ZWQuCisvLyAqIGlzRXJyb3I6IFRoZSBh
ZGFwdGVyIHJlcG9ydGVkIHRoYXQgaXQgd2FzIHVuYWJsZSB0byBzYXZlCisvLyAgIGxvY2FsIGNo
YW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZQorLy8gICBy
ZWNvcmQgaGF2aW5nIGl0cyBgaXNWYWxpZGAgcHJvcGVydHkgYmVjb21lIGZhbHNlIGlmIHRoZQor
Ly8gICBhZGFwdGVyIHJlcG9ydGVkIHRoYXQgc2VydmVyLXNpZGUgdmFsaWRhdGlvbnMgZmFpbGVk
LgorLy8gKiBpc05ldzogVGhlIHJlY29yZCB3YXMgY3JlYXRlZCBvbiB0aGUgY2xpZW50IGFuZCB0
aGUgYWRhcHRlcgorLy8gICBkaWQgbm90IHlldCByZXBvcnQgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1
bGx5IHNhdmVkLgorLy8gKiBpc1ZhbGlkOiBObyBjbGllbnQtc2lkZSB2YWxpZGF0aW9ucyBoYXZl
IGZhaWxlZCBhbmQgdGhlCisvLyAgIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55IHNlcnZlci1z
aWRlIHZhbGlkYXRpb24gZmFpbHVyZXMuCisKKy8vIFRoZSBkaXJ0eSBzdGF0ZSBpcyBhIGFic3Ry
YWN0IHN0YXRlIHdob3NlIGZ1bmN0aW9uYWxpdHkgaXMKKy8vIHNoYXJlZCBiZXR3ZWVuIHRoZSBg
Y3JlYXRlZGAgYW5kIGB1cGRhdGVkYCBzdGF0ZXMuCisvLworLy8gVGhlIGRlbGV0ZWQgc3RhdGUg
c2hhcmVzIHRoZSBgaXNEaXJ0eWAgZmxhZyB3aXRoIHRoZQorLy8gc3ViY2xhc3NlcyBvZiBgRGly
dHlTdGF0ZWAsIGJ1dCB3aXRoIGEgdmVyeSBkaWZmZXJlbnQKKy8vIGltcGxlbWVudGF0aW9uLgor
Ly8KKy8vIERpcnR5IHN0YXRlcyBoYXZlIHRocmVlIGNoaWxkIHN0YXRlczoKKy8vCisvLyBgdW5j
b21taXR0ZWRgOiB0aGUgc3RvcmUgaGFzIG5vdCB5ZXQgaGFuZGVkIG9mZiB0aGUgcmVjb3JkCisv
LyAgIHRvIGJlIHNhdmVkLgorLy8gYGluRmxpZ2h0YDogdGhlIHN0b3JlIGhhcyBoYW5kZWQgb2Zm
IHRoZSByZWNvcmQgdG8gYmUgc2F2ZWQsCisvLyAgIGJ1dCB0aGUgYWRhcHRlciBoYXMgbm90IHll
dCBhY2tub3dsZWRnZWQgc3VjY2Vzcy4KKy8vIGBpbnZhbGlkYDogdGhlIHJlY29yZCBoYXMgaW52
YWxpZCBpbmZvcm1hdGlvbiBhbmQgY2Fubm90IGJlCisvLyAgIHNlbmQgdG8gdGhlIGFkYXB0ZXIg
eWV0LgordmFyIERpcnR5U3RhdGUgPSB7CisgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywK
KworICAvLyBGTEFHUworICBpc0RpcnR5OiB0cnVlLAorCisgIC8vIFNVQlNUQVRFUworCisgIC8v
IFdoZW4gYSByZWNvcmQgZmlyc3QgYmVjb21lcyBkaXJ0eSwgaXQgaXMgYHVuY29tbWl0dGVkYC4K
KyAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBsb2NhbCBwZW5kaW5nIGNoYW5nZXMsIGJ1
dCB0aGV5CisgIC8vIGhhdmUgbm90IHlldCBiZWd1biB0byBiZSBzYXZlZCwgYW5kIGFyZSBub3Qg
aW52YWxpZC4KKyAgdW5jb21taXR0ZWQ6IHsKKyAgICAvLyBFVkVOVFMKKyAgICBkaWRTZXRQcm9w
ZXJ0eTogZGlkU2V0UHJvcGVydHksCisKKyAgICBwcm9wZXJ0eVdhc1Jlc2V0OiBmdW5jdGlvbihy
ZWNvcmQsIG5hbWUpIHsKKyAgICAgIHZhciBzdGlsbERpcnR5ID0gZmFsc2U7CisKKyAgICAgIGZv
ciAodmFyIHByb3AgaW4gcmVjb3JkLl9hdHRyaWJ1dGVzKSB7CisgICAgICAgIHN0aWxsRGlydHkg
PSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdGlsbERpcnR5
KSB7IHJlY29yZC5zZW5kKCdyb2xsZWRCYWNrJyk7IH0KKyAgICB9LAorCisgICAgcHVzaGVkRGF0
YTogRW1iZXIuSywKKworICAgIGJlY29tZURpcnR5OiBFbWJlci5LLAorCisgICAgd2lsbENvbW1p
dDogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbkZsaWdo
dCcpOworICAgIH0sCisKKyAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCwgcmVzb2x2
ZSkgeworICAgICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVj
b3JkKSk7CisgICAgfSwKKworICAgIHJvbGxlZEJhY2s6IGZ1bmN0aW9uKHJlY29yZCkgeworICAg
ICAgcmVjb3JkLnRyYW5zaXRpb25UbygnbG9hZGVkLnNhdmVkJyk7CisgICAgfSwKKworICAgIGJl
Y2FtZUludmFsaWQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgcmVjb3JkLnRyYW5zaXRpb25U
bygnaW52YWxpZCcpOworICAgIH0sCisKKyAgICByb2xsYmFjazogZnVuY3Rpb24ocmVjb3JkKSB7
CisgICAgICByZWNvcmQucm9sbGJhY2soKTsKKyAgICB9CisgIH0sCisKKyAgLy8gT25jZSBhIHJl
Y29yZCBoYXMgYmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBhZGFwdGVyIHRvIGJlCisgIC8vIHNhdmVk
LCBpdCBpcyBpbiB0aGUgJ2luIGZsaWdodCcgc3RhdGUuIENoYW5nZXMgdG8gdGhlCisgIC8vIHJl
Y29yZCBjYW5ub3QgYmUgbWFkZSBkdXJpbmcgdGhpcyB3aW5kb3cuCisgIGluRmxpZ2h0OiB7Cisg
ICAgLy8gRkxBR1MKKyAgICBpc1NhdmluZzogdHJ1ZSwKKworICAgIC8vIEVWRU5UUworICAgIGRp
ZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0eSwKKyAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywK
KyAgICBwdXNoZWREYXRhOiBFbWJlci5LLAorCisgICAgLy8gVE9ETzogTW9yZSByb2J1c3Qgc2Vt
YW50aWNzIGFyb3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAorICAgIHdpbGxDb21taXQ6IEVtYmVy
LkssCisKKyAgICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgdmFyIGRpcnR5
VHlwZSA9IGdldCh0aGlzLCAnZGlydHlUeXBlJyk7CisKKyAgICAgIHJlY29yZC50cmFuc2l0aW9u
VG8oJ3NhdmVkJyk7CisgICAgICByZWNvcmQuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tz
JywgZGlydHlUeXBlKTsKKyAgICB9LAorCisgICAgYmVjYW1lSW52YWxpZDogZnVuY3Rpb24ocmVj
b3JkKSB7CisgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbnZhbGlkJyk7CisgICAgICByZWNv
cmQuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJyk7CisgICAgfSwKKworICAgIGJlY2Ft
ZUVycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3Vu
Y29tbWl0dGVkJyk7CisgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJl
Y29yZCk7CisgICAgfQorICB9LAorCisgIC8vIEEgcmVjb3JkIGlzIGluIHRoZSBgaW52YWxpZGAg
c3RhdGUgd2hlbiBpdHMgY2xpZW50LXNpZGUKKyAgLy8gaW52YWxpZGF0aW9ucyBoYXZlIGZhaWxl
ZCwgb3IgaWYgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZAorICAvLyB0aGUgdGhlIHJlY29yZCBm
YWlsZWQgc2VydmVyLXNpZGUgaW52YWxpZGF0aW9ucy4KKyAgaW52YWxpZDogeworICAgIC8vIEZM
QUdTCisgICAgaXNWYWxpZDogZmFsc2UsCisKKyAgICAvLyBFVkVOVFMKKyAgICBkZWxldGVSZWNv
cmQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRl
ZC51bmNvbW1pdHRlZCcpOworICAgICAgcmVjb3JkLmNsZWFyUmVsYXRpb25zaGlwcygpOworICAg
IH0sCisKKyAgICBkaWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24ocmVjb3JkLCBjb250ZXh0KSB7Cisg
ICAgICBnZXQocmVjb3JkLCAnZXJyb3JzJykucmVtb3ZlKGNvbnRleHQubmFtZSk7CisKKyAgICAg
IGRpZFNldFByb3BlcnR5KHJlY29yZCwgY29udGV4dCk7CisgICAgfSwKKworICAgIGJlY29tZURp
cnR5OiBFbWJlci5LLAorCisgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAg
ICBnZXQocmVjb3JkLCAnZXJyb3JzJykuY2xlYXIoKTsKKyAgICB9LAorCisgICAgYmVjYW1lVmFs
aWQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndW5jb21t
aXR0ZWQnKTsKKyAgICB9LAorCisgICAgaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlv
bihyZWNvcmQpIHsKKyAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2JlY2FtZUludmFsaWQnLCBy
ZWNvcmQpOworICAgIH0KKyAgfQorfTsKKworLy8gVGhlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQgc3Rh
dGVzIGFyZSBjcmVhdGVkIG91dHNpZGUgdGhlIHN0YXRlCisvLyBjaGFydCBzbyB3ZSBjYW4gcmVv
cGVuIHRoZWlyIHN1YnN0YXRlcyBhbmQgYWRkIG1peGlucyBhcworLy8gbmVjZXNzYXJ5LgorCitm
dW5jdGlvbiBkZWVwQ2xvbmUob2JqZWN0KSB7CisgIHZhciBjbG9uZSA9IHt9LCB2YWx1ZTsKKwor
ICBmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgeworICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwor
ICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7CisgICAgICBjbG9u
ZVtwcm9wXSA9IGRlZXBDbG9uZSh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb25lW3By
b3BdID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNsb25lOworfQorCitmdW5jdGlv
biBtaXhpbihvcmlnaW5hbCwgaGFzaCkgeworICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKKyAg
ICBvcmlnaW5hbFtwcm9wXSA9IGhhc2hbcHJvcF07CisgIH0KKworICByZXR1cm4gb3JpZ2luYWw7
Cit9CisKK2Z1bmN0aW9uIGRpcnR5U3RhdGUob3B0aW9ucykgeworICB2YXIgbmV3U3RhdGUgPSBk
ZWVwQ2xvbmUoRGlydHlTdGF0ZSk7CisgIHJldHVybiBtaXhpbihuZXdTdGF0ZSwgb3B0aW9ucyk7
Cit9CisKK3ZhciBjcmVhdGVkU3RhdGUgPSBkaXJ0eVN0YXRlKHsKKyAgZGlydHlUeXBlOiAnY3Jl
YXRlZCcsCisKKyAgLy8gRkxBR1MKKyAgaXNOZXc6IHRydWUKK30pOworCitjcmVhdGVkU3RhdGUu
dW5jb21taXR0ZWQucm9sbGVkQmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgeworICByZWNvcmQudHJh
bnNpdGlvblRvKCdkZWxldGVkLnNhdmVkJyk7Cit9OworCit2YXIgdXBkYXRlZFN0YXRlID0gZGly
dHlTdGF0ZSh7CisgIGRpcnR5VHlwZTogJ3VwZGF0ZWQnCit9KTsKKworY3JlYXRlZFN0YXRlLnVu
Y29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkgeworICByZWNvcmQuY2xl
YXJSZWxhdGlvbnNoaXBzKCk7CisgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQn
KTsKK307CisKK2NyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5yb2xsYmFjayA9IGZ1bmN0aW9uKHJl
Y29yZCkgeworICBEaXJ0eVN0YXRlLnVuY29tbWl0dGVkLnJvbGxiYWNrLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKK307CisK
K2NyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5wcm9wZXJ0eVdhc1Jlc2V0ID0gRW1iZXIuSzsKKwor
dXBkYXRlZFN0YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkg
eworICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7CisgIHJlY29y
ZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKK307CisKK3ZhciBSb290U3RhdGUgPSB7CisgIC8vIEZM
QUdTCisgIGlzRW1wdHk6IGZhbHNlLAorICBpc0xvYWRpbmc6IGZhbHNlLAorICBpc0xvYWRlZDog
ZmFsc2UsCisgIGlzRGlydHk6IGZhbHNlLAorICBpc1NhdmluZzogZmFsc2UsCisgIGlzRGVsZXRl
ZDogZmFsc2UsCisgIGlzTmV3OiBmYWxzZSwKKyAgaXNWYWxpZDogdHJ1ZSwKKworICAvLyBERUZB
VUxUIEVWRU5UUworCisgIC8vIFRyeWluZyB0byByb2xsIGJhY2sgaWYgeW91J3JlIG5vdCBpbiB0
aGUgZGlydHkgc3RhdGUKKyAgLy8gZG9lc24ndCBjaGFuZ2UgeW91ciBzdGF0ZS4gRm9yIGV4YW1w
bGUsIGlmIHlvdSdyZSBpbiB0aGUKKyAgLy8gaW4tZmxpZ2h0IHN0YXRlLCByb2xsaW5nIGJhY2sg
dGhlIHJlY29yZCBkb2Vzbid0IG1vdmUKKyAgLy8geW91IG91dCBvZiB0aGUgaW4tZmxpZ2h0IHN0
YXRlLgorICByb2xsZWRCYWNrOiBFbWJlci5LLAorCisgIHByb3BlcnR5V2FzUmVzZXQ6IEVtYmVy
LkssCisKKyAgLy8gU1VCU1RBVEVTCisKKyAgLy8gQSByZWNvcmQgYmVnaW5zIGl0cyBsaWZlY3lj
bGUgaW4gdGhlIGBlbXB0eWAgc3RhdGUuCisgIC8vIElmIGl0cyBkYXRhIHdpbGwgY29tZSBmcm9t
IHRoZSBhZGFwdGVyLCBpdCB3aWxsCisgIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGxvYWRpbmdg
IHN0YXRlLiBPdGhlcndpc2UsIGlmCisgIC8vIHRoZSByZWNvcmQgaXMgYmVpbmcgY3JlYXRlZCBv
biB0aGUgY2xpZW50LCBpdCB3aWxsCisgIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGNyZWF0ZWRg
IHN0YXRlLgorICBlbXB0eTogeworICAgIGlzRW1wdHk6IHRydWUsCisKKyAgICAvLyBFVkVOVFMK
KyAgICBsb2FkaW5nRGF0YTogZnVuY3Rpb24ocmVjb3JkLCBwcm9taXNlKSB7CisgICAgICByZWNv
cmQuX2xvYWRpbmdQcm9taXNlID0gcHJvbWlzZTsKKyAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8o
J2xvYWRpbmcnKTsKKyAgICB9LAorCisgICAgbG9hZGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7
CisgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuY3JlYXRlZC51bmNvbW1pdHRlZCcp
OworCisgICAgICByZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigp
IHsKKyAgICAgICAgcmVjb3JkLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7CisgICAgICB9
KTsKKyAgICB9LAorCisgICAgcHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICBy
ZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKKyAgICAgIHJlY29yZC50cmlnZ2Vy
TGF0ZXIoJ2RpZExvYWQnKTsKKyAgICB9CisgIH0sCisKKyAgLy8gQSByZWNvcmQgZW50ZXJzIHRo
aXMgc3RhdGUgd2hlbiB0aGUgc3RvcmUgYXNrcworICAvLyB0aGUgYWRhcHRlciBmb3IgaXRzIGRh
dGEuIEl0IHJlbWFpbnMgaW4gdGhpcyBzdGF0ZQorICAvLyB1bnRpbCB0aGUgYWRhcHRlciBwcm92
aWRlcyB0aGUgcmVxdWVzdGVkIGRhdGEuCisgIC8vCisgIC8vIFVzdWFsbHksIHRoaXMgcHJvY2Vz
cyBpcyBhc3luY2hyb25vdXMsIHVzaW5nIGFuCisgIC8vIFhIUiB0byByZXRyaWV2ZSB0aGUgZGF0
YS4KKyAgbG9hZGluZzogeworICAgIC8vIEZMQUdTCisgICAgaXNMb2FkaW5nOiB0cnVlLAorCisg
ICAgZXhpdDogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICByZWNvcmQuX2xvYWRpbmdQcm9taXNl
ID0gbnVsbDsKKyAgICB9LAorCisgICAgLy8gRVZFTlRTCisgICAgcHVzaGVkRGF0YTogZnVuY3Rp
b24ocmVjb3JkKSB7CisgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsK
KyAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKKyAgICAgIHNldChyZWNvcmQs
ICdpc0Vycm9yJywgZmFsc2UpOworICAgIH0sCisKKyAgICBiZWNhbWVFcnJvcjogZnVuY3Rpb24o
cmVjb3JkKSB7CisgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29y
ZCk7CisgICAgfSwKKworICAgIG5vdEZvdW5kOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIHJl
Y29yZC50cmFuc2l0aW9uVG8oJ2VtcHR5Jyk7CisgICAgfQorICB9LAorCisgIC8vIEEgcmVjb3Jk
IGVudGVycyB0aGlzIHN0YXRlIHdoZW4gaXRzIGRhdGEgaXMgcG9wdWxhdGVkLgorICAvLyBNb3N0
IG9mIGEgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMKKyAgLy8g
b2YgdGhlIGBsb2FkZWRgIHN0YXRlLgorICBsb2FkZWQ6IHsKKyAgICBpbml0aWFsU3RhdGU6ICdz
YXZlZCcsCisKKyAgICAvLyBGTEFHUworICAgIGlzTG9hZGVkOiB0cnVlLAorCisgICAgLy8gU1VC
U1RBVEVTCisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwgY2hhbmdlcyB0byBhIHJlY29y
ZCwgaXQgcmVtYWlucworICAgIC8vIGluIHRoZSBgc2F2ZWRgIHN0YXRlLgorICAgIHNhdmVkOiB7
CisgICAgICBzZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICAgIHZhciBhdHRycyA9IHJl
Y29yZC5fYXR0cmlidXRlcywKKyAgICAgICAgICAgIGlzRGlydHkgPSBmYWxzZTsKKworICAgICAg
ICBmb3IgKHZhciBwcm9wIGluIGF0dHJzKSB7CisgICAgICAgICAgaWYgKGF0dHJzLmhhc093blBy
b3BlcnR5KHByb3ApKSB7CisgICAgICAgICAgICBpc0RpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0RpcnR5KSB7
CisgICAgICAgICAgcmVjb3JkLmFkYXB0ZXJEaWREaXJ0eSgpOworICAgICAgICB9CisgICAgICB9
LAorCisgICAgICAvLyBFVkVOVFMKKyAgICAgIGRpZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0
eSwKKworICAgICAgcHVzaGVkRGF0YTogRW1iZXIuSywKKworICAgICAgYmVjb21lRGlydHk6IGZ1
bmN0aW9uKHJlY29yZCkgeworICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1cGRhdGVkLnVu
Y29tbWl0dGVkJyk7CisgICAgICB9LAorCisgICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNv
cmQpIHsKKyAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpOwor
ICAgICAgfSwKKworICAgICAgcmVsb2FkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlc29sdmUp
IHsKKyAgICAgICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVj
b3JkKSk7CisgICAgICB9LAorCisgICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkg
eworICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7Cisg
ICAgICAgIHJlY29yZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKKyAgICAgIH0sCisKKyAgICAgIHVu
bG9hZFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICAgIC8vIGNsZWFyIHJlbGF0aW9u
c2hpcHMgYmVmb3JlIG1vdmluZyB0byBkZWxldGVkIHN0YXRlCisgICAgICAgIC8vIG90aGVyd2lz
ZSBpdCBmYWlscworICAgICAgICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBzKCk7CisgICAgICAg
IHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKKyAgICAgIH0sCisKKyAgICAg
IGRpZENvbW1pdDogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICAgIHJlY29yZC5zZW5kKCdpbnZv
a2VMaWZlY3ljbGVDYWxsYmFja3MnLCBnZXQocmVjb3JkLCAnbGFzdERpcnR5VHlwZScpKTsKKyAg
ICAgIH0sCisKKyAgICAgIC8vIGxvYWRlZC5zYXZlZC5ub3RGb3VuZCB3b3VsZCBiZSB0cmlnZ2Vy
ZWQgYnkgYSBmYWlsZWQKKyAgICAgIC8vIGByZWxvYWQoKWAgb24gYW4gdW5jaGFuZ2VkIHJlY29y
ZAorICAgICAgbm90Rm91bmQ6IEVtYmVyLksKKworICAgIH0sCisKKyAgICAvLyBBIHJlY29yZCBp
cyBpbiB0aGlzIHN0YXRlIGFmdGVyIGl0IGhhcyBiZWVuIGxvY2FsbHkKKyAgICAvLyBjcmVhdGVk
IGJ1dCBiZWZvcmUgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZCB0aGF0CisgICAgLy8gaXQgaGFz
IGJlZW4gc2F2ZWQuCisgICAgY3JlYXRlZDogY3JlYXRlZFN0YXRlLAorCisgICAgLy8gQSByZWNv
cmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisgICAgLy8gc2F2ZWQg
dG8gdGhlIHNlcnZlciwgYnV0IHRoZXJlIGFyZSBuZXcgbG9jYWwgY2hhbmdlcworICAgIC8vIHRo
YXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQuCisgICAgdXBkYXRlZDogdXBkYXRlZFN0YXRlCisg
IH0sCisKKyAgLy8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCB3YXMgZGVsZXRlZCBm
cm9tIHRoZSBzdG9yZS4KKyAgZGVsZXRlZDogeworICAgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0
dGVkJywKKyAgICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKKworICAgIC8vIEZMQUdTCisgICAgaXNE
ZWxldGVkOiB0cnVlLAorICAgIGlzTG9hZGVkOiB0cnVlLAorICAgIGlzRGlydHk6IHRydWUsCisK
KyAgICAvLyBUUkFOU0lUSU9OUworICAgIHNldHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAg
IHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKKyAgICB9LAorCisgICAgLy8gU1VCU1RBVEVT
CisKKyAgICAvLyBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0ZWQsIGl0IGVudGVycyB0aGUgYHN0YXJ0
YAorICAgIC8vIHN0YXRlLiBJdCB3aWxsIGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSByZWNvcmQK
KyAgICAvLyBzdGFydHMgdG8gY29tbWl0LgorICAgIHVuY29tbWl0dGVkOiB7CisKKyAgICAgIC8v
IEVWRU5UUworCisgICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgICAg
cmVjb3JkLnRyYW5zaXRpb25UbygnaW5GbGlnaHQnKTsKKyAgICAgIH0sCisKKyAgICAgIHJvbGxi
YWNrOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgICAgcmVjb3JkLnJvbGxiYWNrKCk7CisgICAg
ICB9LAorCisgICAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKKyAgICAgIGRlbGV0ZVJlY29yZDog
RW1iZXIuSywKKworICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICAg
IHJlY29yZC50cmFuc2l0aW9uVG8oJ2xvYWRlZC5zYXZlZCcpOworICAgICAgfQorICAgIH0sCisK
KyAgICAvLyBBZnRlciBhIHJlY29yZCBzdGFydHMgY29tbWl0dGluZywgYnV0CisgICAgLy8gYmVm
b3JlIHRoZSBhZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZSBkZWxldGlvbgorICAgIC8vIGhhcyBz
YXZlZCB0byB0aGUgc2VydmVyLCBhIHJlY29yZCBpcyBpbiB0aGUKKyAgICAvLyBgaW5GbGlnaHRg
IHN1YnN0YXRlIG9mIGBkZWxldGVkYC4KKyAgICBpbkZsaWdodDogeworICAgICAgLy8gRkxBR1MK
KyAgICAgIGlzU2F2aW5nOiB0cnVlLAorCisgICAgICAvLyBFVkVOVFMKKworICAgICAgLy8gVE9E
TzogTW9yZSByb2J1c3Qgc2VtYW50aWNzIGFyb3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAorICAg
ICAgd2lsbENvbW1pdDogRW1iZXIuSywKKyAgICAgIGRpZENvbW1pdDogZnVuY3Rpb24ocmVjb3Jk
KSB7CisgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVkJyk7CisKKyAgICAgICAgcmVj
b3JkLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOworICAgICAgfSwKKworICAgICAg
YmVjYW1lRXJyb3I6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgICByZWNvcmQudHJhbnNpdGlv
blRvKCd1bmNvbW1pdHRlZCcpOworICAgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVF
cnJvcicsIHJlY29yZCk7CisgICAgICB9CisgICAgfSwKKworICAgIC8vIE9uY2UgdGhlIGFkYXB0
ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGRlbGV0aW9uIGhhcworICAgIC8vIGJlZW4gc2F2ZWQsIHRo
ZSByZWNvcmQgZW50ZXJzIHRoZSBgc2F2ZWRgIHN1YnN0YXRlCisgICAgLy8gb2YgYGRlbGV0ZWRg
LgorICAgIHNhdmVkOiB7CisgICAgICAvLyBGTEFHUworICAgICAgaXNEaXJ0eTogZmFsc2UsCisK
KyAgICAgIHNldHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgICAgdmFyIHN0b3JlID0gZ2V0
KHJlY29yZCwgJ3N0b3JlJyk7CisgICAgICAgIHN0b3JlLmRlbWF0ZXJpYWxpemVSZWNvcmQocmVj
b3JkKTsKKyAgICAgIH0sCisKKyAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rp
b24ocmVjb3JkKSB7CisgICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZERlbGV0ZScsIHJl
Y29yZCk7CisgICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENvbW1pdCcsIHJlY29yZCk7
CisgICAgICB9CisgICAgfQorICB9LAorCisgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVu
Y3Rpb24ocmVjb3JkLCBkaXJ0eVR5cGUpIHsKKyAgICBpZiAoZGlydHlUeXBlID09PSAnY3JlYXRl
ZCcpIHsKKyAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENyZWF0ZScsIHJlY29yZCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZFVwZGF0ZScsIHJlY29y
ZCk7CisgICAgfQorCisgICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlkQ29tbWl0JywgcmVjb3Jk
KTsKKyAgfQorfTsKKworZnVuY3Rpb24gd2lyZVN0YXRlKG9iamVjdCwgcGFyZW50LCBuYW1lKSB7
CisgIC8qanNoaW50IHByb3RvOnRydWUqLworICAvLyBUT0RPOiBVc2UgT2JqZWN0LmNyZWF0ZSBh
bmQgY29weSBpbnN0ZWFkCisgIG9iamVjdCA9IG1peGluKHBhcmVudCA/IEVtYmVyLmNyZWF0ZShw
YXJlbnQpIDoge30sIG9iamVjdCk7CisgIG9iamVjdC5wYXJlbnRTdGF0ZSA9IHBhcmVudDsKKyAg
b2JqZWN0LnN0YXRlTmFtZSA9IG5hbWU7CisKKyAgZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHsK
KyAgICBpZiAoIW9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBwcm9wID09PSAncGFyZW50
U3RhdGUnIHx8IHByb3AgPT09ICdzdGF0ZU5hbWUnKSB7IGNvbnRpbnVlOyB9CisgICAgaWYgKHR5
cGVvZiBvYmplY3RbcHJvcF0gPT09ICdvYmplY3QnKSB7CisgICAgICBvYmplY3RbcHJvcF0gPSB3
aXJlU3RhdGUob2JqZWN0W3Byb3BdLCBvYmplY3QsIG5hbWUgKyAiLiIgKyBwcm9wKTsKKyAgICB9
CisgIH0KKworICByZXR1cm4gb2JqZWN0OworfQorCitSb290U3RhdGUgPSB3aXJlU3RhdGUoUm9v
dFN0YXRlLCBudWxsLCAicm9vdCIpOworCitEUy5Sb290U3RhdGUgPSBSb290U3RhdGU7CisKK30p
KCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpc0VtcHR5ID0g
RW1iZXIuaXNFbXB0eTsKKworLyoqCitAbW9kdWxlIGVtYmVyLWRhdGEKKyovCisKKy8qKgorICBI
b2xkcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiByZWNvcmQgb3JnYW5pemVkIGJ5IGF0
dHJpYnV0ZSBuYW1lcy4KKworICBAY2xhc3MgRXJyb3JzCisgIEBuYW1lc3BhY2UgRFMKKyAgQGV4
dGVuZHMgRW1iZXIuT2JqZWN0CisgIEB1c2VzIEVtYmVyLkVudW1lcmFibGUKKyAgQHVzZXMgRW1i
ZXIuRXZlbnRlZAorICovCitEUy5FcnJvcnMgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkVu
dW1lcmFibGUsIEVtYmVyLkV2ZW50ZWQsIHsKKyAgLyoqCisgICAgUmVnaXN0ZXIgd2l0aCB0YXJn
ZXQgaGFuZGxlcgorCisgICAgQG1ldGhvZCByZWdpc3RlckhhbmRsZXJzCisgICAgQHBhcmFtIHtP
YmplY3R9IHRhcmdldAorICAgIEBwYXJhbSB7RnVuY3Rpb259IGJlY2FtZUludmFsaWQKKyAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBiZWNhbWVWYWxpZAorICAqLworICByZWdpc3RlckhhbmRsZXJzOiBm
dW5jdGlvbih0YXJnZXQsIGJlY2FtZUludmFsaWQsIGJlY2FtZVZhbGlkKSB7CisgICAgdGhpcy5v
bignYmVjYW1lSW52YWxpZCcsIHRhcmdldCwgYmVjYW1lSW52YWxpZCk7CisgICAgdGhpcy5vbign
YmVjYW1lVmFsaWQnLCB0YXJnZXQsIGJlY2FtZVZhbGlkKTsKKyAgfSwKKworICAvKioKKyAgICBA
cHJvcGVydHkgZXJyb3JzQnlBdHRyaWJ1dGVOYW1lCisgICAgQHR5cGUge0VtYmVyLk1hcFdpdGhE
ZWZhdWx0fQorICAgIEBwcml2YXRlCisgICovCisgIGVycm9yc0J5QXR0cmlidXRlTmFtZTogRW1i
ZXIucmVkdWNlQ29tcHV0ZWQoImNvbnRlbnQiLCB7CisgICAgaW5pdGlhbFZhbHVlOiBmdW5jdGlv
bigpIHsKKyAgICAgIHJldHVybiBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoeworICAgICAg
ICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiBFbWJlci5BKCk7
CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sCisKKyAgICBhZGRlZEl0ZW06IGZ1bmN0aW9u
KGVycm9ycywgZXJyb3IpIHsKKyAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmlidXRlKS5wdXNo
T2JqZWN0KGVycm9yKTsKKworICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9LAorCisgICAgcmVt
b3ZlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywgZXJyb3IpIHsKKyAgICAgIGVycm9ycy5nZXQoZXJy
b3IuYXR0cmlidXRlKS5yZW1vdmVPYmplY3QoZXJyb3IpOworCisgICAgICByZXR1cm4gZXJyb3Jz
OworICAgIH0KKyAgfSksCisKKyAgLyoqCisgICAgUmV0dXJucyBlcnJvcnMgZm9yIGEgZ2l2ZW4g
YXR0cmlidXRlCisKKyAgICBAbWV0aG9kIGVycm9yc0ZvcgorICAgIEBwYXJhbSB7U3RyaW5nfSBh
dHRyaWJ1dGUKKyAgICBAcmV0dXJucyB7QXJyYXl9CisgICovCisgIGVycm9yc0ZvcjogZnVuY3Rp
b24oYXR0cmlidXRlKSB7CisgICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3JzQnlBdHRyaWJ1dGVO
YW1lJykuZ2V0KGF0dHJpYnV0ZSk7CisgIH0sCisKKyAgLyoqCisgICovCisgIG1lc3NhZ2VzOiBF
bWJlci5jb21wdXRlZC5tYXBCeSgnY29udGVudCcsICdtZXNzYWdlJyksCisKKyAgLyoqCisgICAg
QHByb3BlcnR5IGNvbnRlbnQKKyAgICBAdHlwZSB7QXJyYXl9CisgICAgQHByaXZhdGUKKyAgKi8K
KyAgY29udGVudDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEVtYmVy
LkEoKTsKKyAgfSksCisKKyAgLyoqCisgICAgQG1ldGhvZCB1bmtub3duUHJvcGVydHkKKyAgICBA
cHJpdmF0ZQorICAqLworICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSkgewor
ICAgIHZhciBlcnJvcnMgPSB0aGlzLmVycm9yc0ZvcihhdHRyaWJ1dGUpOworICAgIGlmIChpc0Vt
cHR5KGVycm9ycykpIHsgcmV0dXJuIG51bGw7IH0KKyAgICByZXR1cm4gZXJyb3JzOworICB9LAor
CisgIC8qKgorICAgIEBtZXRob2QgbmV4dE9iamVjdAorICAgIEBwcml2YXRlCisgICovCisgIG5l
eHRPYmplY3Q6IGZ1bmN0aW9uKGluZGV4LCBwcmV2aW91c09iamVjdCwgY29udGV4dCkgeworICAg
IHJldHVybiBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpbmRleCk7CisgIH0sCisKKyAg
LyoqCisgICAgVG90YWwgbnVtYmVyIG9mIGVycm9ycy4KKworICAgIEBwcm9wZXJ0eSBsZW5ndGgK
KyAgICBAdHlwZSB7TnVtYmVyfQorICAgIEByZWFkT25seQorICAqLworICBsZW5ndGg6IEVtYmVy
LmNvbXB1dGVkLm9uZVdheSgnY29udGVudC5sZW5ndGgnKS5yZWFkT25seSgpLAorCisgIC8qKgor
ICAgIEBwcm9wZXJ0eSBpc0VtcHR5CisgICAgQHR5cGUge0Jvb2xlYW59CisgICAgQHJlYWRPbmx5
CisgICovCisgIGlzRW1wdHk6IEVtYmVyLmNvbXB1dGVkLm5vdCgnbGVuZ3RoJykucmVhZE9ubHko
KSwKKworICAvKioKKyAgICBBZGRzIGVycm9yIG1lc3NhZ2VzIHRvIGEgZ2l2ZW4gYXR0cmlidXRl
IGFuZCBzZW5kcworICAgIGBiZWNhbWVJbnZhbGlkYCBldmVudCB0byB0aGUgcmVjb3JkLgorCisg
ICAgQG1ldGhvZCBhZGQKKyAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCisgICAgQHBhcmFt
IHtBcnJheXxTdHJpbmd9IG1lc3NhZ2VzCisgICovCisgIGFkZDogZnVuY3Rpb24oYXR0cmlidXRl
LCBtZXNzYWdlcykgeworICAgIHZhciB3YXNFbXB0eSA9IGdldCh0aGlzLCAnaXNFbXB0eScpOwor
CisgICAgbWVzc2FnZXMgPSB0aGlzLl9maW5kT3JDcmVhdGVNZXNzYWdlcyhhdHRyaWJ1dGUsIG1l
c3NhZ2VzKTsKKyAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3RzKG1lc3NhZ2VzKTsK
KworICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlKTsKKyAgICB0aGlzLmVu
dW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKCk7CisKKyAgICBpZiAod2FzRW1wdHkgJiYgIWdldCh0
aGlzLCAnaXNFbXB0eScpKSB7CisgICAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUludmFsaWQnKTsK
KyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBfZmluZE9yQ3JlYXRlTWVzc2FnZXMK
KyAgICBAcHJpdmF0ZQorICAqLworICBfZmluZE9yQ3JlYXRlTWVzc2FnZXM6IGZ1bmN0aW9uKGF0
dHJpYnV0ZSwgbWVzc2FnZXMpIHsKKyAgICB2YXIgZXJyb3JzID0gdGhpcy5lcnJvcnNGb3IoYXR0
cmlidXRlKTsKKworICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXkobWVzc2FnZXMpLm1hcChmdW5j
dGlvbihtZXNzYWdlKSB7CisgICAgICByZXR1cm4gZXJyb3JzLmZpbmRCeSgnbWVzc2FnZScsIG1l
c3NhZ2UpIHx8IHsKKyAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGUsCisgICAgICAgIG1lc3Nh
Z2U6IG1lc3NhZ2UKKyAgICAgIH07CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisgICAgUmVtb3Zl
cyBhbGwgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5kcwor
ICAgIGBiZWNhbWVWYWxpZGAgZXZlbnQgdG8gdGhlIHJlY29yZCBpZiB0aGVyZSBubyBtb3JlIGVy
cm9ycyBsZWZ0LgorCisgICAgQG1ldGhvZCByZW1vdmUKKyAgICBAcGFyYW0ge1N0cmluZ30gYXR0
cmlidXRlCisgICovCisgIHJlbW92ZTogZnVuY3Rpb24oYXR0cmlidXRlKSB7CisgICAgaWYgKGdl
dCh0aGlzLCAnaXNFbXB0eScpKSB7IHJldHVybjsgfQorCisgICAgdmFyIGNvbnRlbnQgPSBnZXQo
dGhpcywgJ2NvbnRlbnQnKS5yZWplY3RCeSgnYXR0cmlidXRlJywgYXR0cmlidXRlKTsKKyAgICBn
ZXQodGhpcywgJ2NvbnRlbnQnKS5zZXRPYmplY3RzKGNvbnRlbnQpOworCisgICAgdGhpcy5ub3Rp
ZnlQcm9wZXJ0eUNoYW5nZShhdHRyaWJ1dGUpOworICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRE
aWRDaGFuZ2UoKTsKKworICAgIGlmIChnZXQodGhpcywgJ2lzRW1wdHknKSkgeworICAgICAgdGhp
cy50cmlnZ2VyKCdiZWNhbWVWYWxpZCcpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBSZW1v
dmVzIGFsbCBlcnJvciBtZXNzYWdlcyBhbmQgc2VuZHMgYGJlY2FtZVZhbGlkYCBldmVudAorICAg
IHRvIHRoZSByZWNvcmQuCisKKyAgICBAbWV0aG9kIGNsZWFyCisgICovCisgIGNsZWFyOiBmdW5j
dGlvbigpIHsKKyAgICBpZiAoZ2V0KHRoaXMsICdpc0VtcHR5JykpIHsgcmV0dXJuOyB9CisKKyAg
ICBnZXQodGhpcywgJ2NvbnRlbnQnKS5jbGVhcigpOworICAgIHRoaXMuZW51bWVyYWJsZUNvbnRl
bnREaWRDaGFuZ2UoKTsKKworICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmFsaWQnKTsKKyAgfSwK
KworICAvKioKKyAgICBDaGVja3MgaWYgdGhlcmUgaXMgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBn
aXZlbiBhdHRyaWJ1dGUuCisKKyAgICBAbWV0aG9kIGhhcworICAgIEBwYXJhbSB7U3RyaW5nfSBh
dHRyaWJ1dGUKKyAgICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGVyZSBzb21lIGVycm9y
cyBvbiBnaXZlbiBhdHRyaWJ1dGUKKyAgKi8KKyAgaGFzOiBmdW5jdGlvbihhdHRyaWJ1dGUpIHsK
KyAgICByZXR1cm4gIWlzRW1wdHkodGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKSk7CisgIH0KK30p
OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0
YQorKi8KKwordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAorICAgIG1lcmdl
ID0gRW1iZXIubWVyZ2U7CisKK3ZhciByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUgPSBFbWJlci5j
b21wdXRlZCgnY3VycmVudFN0YXRlJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICByZXR1cm4g
Z2V0KGdldCh0aGlzLCAnY3VycmVudFN0YXRlJyksIGtleSk7Cit9KS5yZWFkT25seSgpOworCisv
KioKKworICBUaGUgbW9kZWwgY2xhc3MgdGhhdCBhbGwgRW1iZXIgRGF0YSByZWNvcmRzIGRlc2Nl
bmQgZnJvbS4KKworICBAY2xhc3MgTW9kZWwKKyAgQG5hbWVzcGFjZSBEUworICBAZXh0ZW5kcyBF
bWJlci5PYmplY3QKKyAgQHVzZXMgRW1iZXIuRXZlbnRlZAorKi8KK0RTLk1vZGVsID0gRW1iZXIu
T2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVkLCB7CisgIC8qKgorICAgIElmIHRoaXMgcHJvcGVy
dHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBlbXB0eWAKKyAgICBzdGF0ZS4gRW1w
dHkgaXMgdGhlIGZpcnN0IHN0YXRlIGFsbCByZWNvcmRzIGVudGVyIGFmdGVyIHRoZXkgaGF2ZQor
ICAgIGJlZW4gY3JlYXRlZC4gTW9zdCByZWNvcmRzIGNyZWF0ZWQgYnkgdGhlIHN0b3JlIHdpbGwg
cXVpY2tseQorICAgIHRyYW5zaXRpb24gdG8gdGhlIGBsb2FkaW5nYCBzdGF0ZSBpZiBkYXRhIG5l
ZWRzIHRvIGJlIGZldGNoZWQgZnJvbQorICAgIHRoZSBzZXJ2ZXIgb3IgdGhlIGBjcmVhdGVkYCBz
dGF0ZSBpZiB0aGUgcmVjb3JkIGlzIGNyZWF0ZWQgb24gdGhlCisgICAgY2xpZW50LiBBIHJlY29y
ZCBjYW4gYWxzbyBlbnRlciB0aGUgZW1wdHkgc3RhdGUgaWYgdGhlIGFkYXB0ZXIgaXMKKyAgICB1
bmFibGUgdG8gbG9jYXRlIHRoZSByZWNvcmQuCisKKyAgICBAcHJvcGVydHkgaXNFbXB0eQorICAg
IEB0eXBlIHtCb29sZWFufQorICAgIEByZWFkT25seQorICAqLworICBpc0VtcHR5OiByZXRyaWV2
ZUZyb21DdXJyZW50U3RhdGUsCisgIC8qKgorICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVg
IHRoZSByZWNvcmQgaXMgaW4gdGhlIGBsb2FkaW5nYCBzdGF0ZS4gQQorICAgIHJlY29yZCBlbnRl
cnMgdGhpcyBzdGF0ZSB3aGVuIHRoZSBzdG9yZSBhc2tzIHRoZSBhZGFwdGVyIGZvciBpdHMKKyAg
ICBkYXRhLiBJdCByZW1haW5zIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIGFkYXB0ZXIgcHJvdmlk
ZXMgdGhlCisgICAgcmVxdWVzdGVkIGRhdGEuCisKKyAgICBAcHJvcGVydHkgaXNMb2FkaW5nCisg
ICAgQHR5cGUge0Jvb2xlYW59CisgICAgQHJlYWRPbmx5CisgICovCisgIGlzTG9hZGluZzogcmV0
cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICAvKioKKyAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0
cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgbG9hZGVkYCBzdGF0ZS4gQQorICAgIHJlY29yZCBl
bnRlcnMgdGhpcyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlzIHBvcHVsYXRlZC4gTW9zdCBvZiBhCisg
ICAgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMgb2YgdGhlIGBs
b2FkZWRgCisgICAgc3RhdGUuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOworICAgIHJlY29y
ZC5nZXQoJ2lzTG9hZGVkJyk7IC8vIHRydWUKKworICAgIHN0b3JlLmZpbmQoJ21vZGVsJywgMSku
dGhlbihmdW5jdGlvbihtb2RlbCkgeworICAgICAgbW9kZWwuZ2V0KCdpc0xvYWRlZCcpOyAvLyB0
cnVlCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgaXNMb2FkZWQKKyAgICBAdHlw
ZSB7Qm9vbGVhbn0KKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgaXNMb2FkZWQ6IHJldHJpZXZlRnJv
bUN1cnJlbnRTdGF0ZSwKKyAgLyoqCisgICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhl
IHJlY29yZCBpcyBpbiB0aGUgYGRpcnR5YCBzdGF0ZS4gVGhlCisgICAgcmVjb3JkIGhhcyBsb2Nh
bCBjaGFuZ2VzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQgYnkgdGhlCisgICAgYWRhcHRl
ci4gVGhpcyBpbmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgKGJ1dCBub3Qg
eWV0CisgICAgc2F2ZWQpIG9yIGRlbGV0ZWQuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOwor
ICAgIHJlY29yZC5nZXQoJ2lzRGlydHknKTsgLy8gdHJ1ZQorCisgICAgc3RvcmUuZmluZCgnbW9k
ZWwnLCAxKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICBtb2RlbC5nZXQoJ2lzRGlydHkn
KTsgLy8gZmFsc2UKKyAgICAgIG1vZGVsLnNldCgnZm9vJywgJ3NvbWUgdmFsdWUnKTsKKyAgICAg
IG1vZGVsLnNldCgnaXNEaXJ0eScpOyAvLyB0cnVlCisgICAgfSk7CisgICAgYGBgCisKKyAgICBA
cHJvcGVydHkgaXNEaXJ0eQorICAgIEB0eXBlIHtCb29sZWFufQorICAgIEByZWFkT25seQorICAq
LworICBpc0RpcnR5OiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCisgIC8qKgorICAgIElmIHRo
aXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBzYXZpbmdgIHN0YXRl
LiBBCisgICAgcmVjb3JkIGVudGVycyB0aGUgc2F2aW5nIHN0YXRlIHdoZW4gYHNhdmVgIGlzIGNh
bGxlZCwgYnV0IHRoZQorICAgIGFkYXB0ZXIgaGFzIG5vdCB5ZXQgYWNrbm93bGVkZ2VkIHRoYXQg
dGhlIGNoYW5nZXMgaGF2ZSBiZWVuCisgICAgcGVyc2lzdGVkIHRvIHRoZSBiYWNrZW5kLgorCisg
ICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciByZWNvcmQgPSBzdG9yZS5j
cmVhdGVSZWNvcmQoQXBwLk1vZGVsKTsKKyAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycpOyAvLyBm
YWxzZQorICAgIHZhciBwcm9taXNlID0gcmVjb3JkLnNhdmUoKTsKKyAgICByZWNvcmQuZ2V0KCdp
c1NhdmluZycpOyAvLyB0cnVlCisgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgeworICAgICAg
cmVjb3JkLmdldCgnaXNTYXZpbmcnKTsgLy8gZmFsc2UKKyAgICB9KTsKKyAgICBgYGAKKworICAg
IEBwcm9wZXJ0eSBpc1NhdmluZworICAgIEB0eXBlIHtCb29sZWFufQorICAgIEByZWFkT25seQor
ICAqLworICBpc1NhdmluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorICAvKioKKyAgICBJ
ZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgZGVsZXRlZGAg
c3RhdGUKKyAgICBhbmQgaGFzIGJlZW4gbWFya2VkIGZvciBkZWxldGlvbi4gV2hlbiBgaXNEZWxl
dGVkYCBpcyB0cnVlIGFuZAorICAgIGBpc0RpcnR5YCBpcyB0cnVlLCB0aGUgcmVjb3JkIGlzIGRl
bGV0ZWQgbG9jYWxseSBidXQgdGhlIGRlbGV0aW9uCisgICAgd2FzIG5vdCB5ZXQgcGVyc2lzdGVk
LiBXaGVuIGBpc1NhdmluZ2AgaXMgdHJ1ZSwgdGhlIGNoYW5nZSBpcworICAgIGluLWZsaWdodC4g
V2hlbiBib3RoIGBpc0RpcnR5YCBhbmQgYGlzU2F2aW5nYCBhcmUgZmFsc2UsIHRoZQorICAgIGNo
YW5nZSBoYXMgcGVyc2lzdGVkLgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBwLk1vZGVsKTsKKyAgICByZWNv
cmQuZ2V0KCdpc0RlbGV0ZWQnKTsgLy8gZmFsc2UKKyAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7
CisgICAgcmVjb3JkLmdldCgnaXNEZWxldGVkJyk7IC8vIHRydWUKKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSBpc0RlbGV0ZWQKKyAgICBAdHlwZSB7Qm9vbGVhbn0KKyAgICBAcmVhZE9ubHkKKyAg
Ki8KKyAgaXNEZWxldGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCisgIC8qKgorICAgIElm
IHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBuZXdgIHN0YXRl
LiBBCisgICAgcmVjb3JkIHdpbGwgYmUgaW4gdGhlIGBuZXdgIHN0YXRlIHdoZW4gaXQgaGFzIGJl
ZW4gY3JlYXRlZCBvbiB0aGUKKyAgICBjbGllbnQgYW5kIHRoZSBhZGFwdGVyIGhhcyBub3QgeWV0
IHJlcG9ydCB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkKKyAgICBzYXZlZC4KKworICAgIEV4YW1w
bGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVj
b3JkKEFwcC5Nb2RlbCk7CisgICAgcmVjb3JkLmdldCgnaXNOZXcnKTsgLy8gdHJ1ZQorCisgICAg
cmVjb3JkLnNhdmUoKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICBtb2RlbC5nZXQoJ2lz
TmV3Jyk7IC8vIGZhbHNlCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgaXNOZXcK
KyAgICBAdHlwZSB7Qm9vbGVhbn0KKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgaXNOZXc6IHJldHJp
ZXZlRnJvbUN1cnJlbnRTdGF0ZSwKKyAgLyoqCisgICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1
ZWAgdGhlIHJlY29yZCBpcyBpbiB0aGUgYHZhbGlkYCBzdGF0ZS4gQQorICAgIHJlY29yZCB3aWxs
IGJlIGluIHRoZSBgdmFsaWRgIHN0YXRlIHdoZW4gbm8gY2xpZW50LXNpZGUKKyAgICB2YWxpZGF0
aW9ucyBoYXZlIGZhaWxlZCBhbmQgdGhlIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55CisgICAg
c2VydmVyLXNpZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KKworICAgIEBwcm9wZXJ0eSBpc1ZhbGlk
CisgICAgQHR5cGUge0Jvb2xlYW59CisgICAgQHJlYWRPbmx5CisgICovCisgIGlzVmFsaWQ6IHJl
dHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKKyAgLyoqCisgICAgSWYgdGhlIHJlY29yZCBpcyBpbiB0
aGUgZGlydHkgc3RhdGUgdGhpcyBwcm9wZXJ0eSB3aWxsIHJlcG9ydCB3aGF0CisgICAga2luZCBv
ZiBjaGFuZ2UgaGFzIGNhdXNlZCBpdCB0byBtb3ZlIGludG8gdGhlIGRpcnR5CisgICAgc3RhdGUu
IFBvc3NpYmxlIHZhbHVlcyBhcmU6CisKKyAgICAtIGBjcmVhdGVkYCBUaGUgcmVjb3JkIGhhcyBi
ZWVuIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRl
ci4KKyAgICAtIGB1cGRhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGNs
aWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KKyAgICAtIGBkZWxldGVkYCBU
aGUgcmVjb3JkIGhhcyBiZWVuIGRlbGV0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZl
ZCB0byB0aGUgYWRhcHRlci4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAg
ICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7CisgICAgcmVjb3Jk
LmdldCgnZGlydHlUeXBlJyk7IC8vICdjcmVhdGVkJworICAgIGBgYAorCisgICAgQHByb3BlcnR5
IGRpcnR5VHlwZQorICAgIEB0eXBlIHtTdHJpbmd9CisgICAgQHJlYWRPbmx5CisgICovCisgIGRp
cnR5VHlwZTogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAorCisgIC8qKgorICAgIElmIGB0cnVl
YCB0aGUgYWRhcHRlciByZXBvcnRlZCB0aGF0IGl0IHdhcyB1bmFibGUgdG8gc2F2ZSBsb2NhbAor
ICAgIGNoYW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZSBy
ZWNvcmQgaGF2aW5nCisgICAgaXRzIGBpc1ZhbGlkYCBwcm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYg
dGhlIGFkYXB0ZXIgcmVwb3J0ZWQgdGhhdAorICAgIHNlcnZlci1zaWRlIHZhbGlkYXRpb25zIGZh
aWxlZC4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICByZWNvcmQuZ2V0
KCdpc0Vycm9yJyk7IC8vIGZhbHNlCisgICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFs
dWUnKTsKKyAgICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7CisgICAgICBy
ZWNvcmQuZ2V0KCdpc0Vycm9yJyk7IC8vIHRydWUKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSBpc0Vycm9yCisgICAgQHR5cGUge0Jvb2xlYW59CisgICAgQHJlYWRPbmx5CisgICov
CisgIGlzRXJyb3I6IGZhbHNlLAorICAvKioKKyAgICBJZiBgdHJ1ZWAgdGhlIHN0b3JlIGlzIGF0
dGVtcHRpbmcgdG8gcmVsb2FkIHRoZSByZWNvcmQgZm9ybSB0aGUgYWRhcHRlci4KKworICAgIEV4
YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICByZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycp
OyAvLyBmYWxzZQorICAgIHJlY29yZC5yZWxvYWQoKTsKKyAgICByZWNvcmQuZ2V0KCdpc1JlbG9h
ZGluZycpOyAvLyB0cnVlCisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgaXNSZWxvYWRpbmcKKyAg
ICBAdHlwZSB7Qm9vbGVhbn0KKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgaXNSZWxvYWRpbmc6IGZh
bHNlLAorCisgIC8qKgorICAgIFRoZSBgY2xpZW50SWRgIHByb3BlcnR5IGlzIGEgdHJhbnNpZW50
IG51bWVyaWNhbCBpZGVudGlmaWVyCisgICAgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkgdGhlIGRh
dGEgc3RvcmUuIEl0IGlzIGltcG9ydGFudAorICAgIHByaW1hcmlseSBiZWNhdXNlIG5ld2x5IGNy
ZWF0ZWQgb2JqZWN0cyBtYXkgbm90IHlldCBoYXZlIGFuCisgICAgZXh0ZXJuYWxseSBnZW5lcmF0
ZWQgaWQuCisKKyAgICBAcHJvcGVydHkgY2xpZW50SWQKKyAgICBAcHJpdmF0ZQorICAgIEB0eXBl
IHtOdW1iZXJ8U3RyaW5nfQorICAqLworICBjbGllbnRJZDogbnVsbCwKKyAgLyoqCisgICAgQWxs
IGVtYmVyIG1vZGVscyBoYXZlIGFuIGlkIHByb3BlcnR5LiBUaGlzIGlzIGFuIGlkZW50aWZpZXIK
KyAgICBtYW5hZ2VkIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2Vy
Y2VkIHRvIGJlCisgICAgc3RyaW5ncyBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LiBOb3Rl
IHdoZW4gZGVjbGFyaW5nIHRoZQorICAgIGF0dHJpYnV0ZXMgZm9yIGEgbW9kZWwgaXQgaXMgYW4g
ZXJyb3IgdG8gZGVjbGFyZSBhbiBpZAorICAgIGF0dHJpYnV0ZS4KKworICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7CisgICAg
cmVjb3JkLmdldCgnaWQnKTsgLy8gbnVsbAorCisgICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50
aGVuKGZ1bmN0aW9uKG1vZGVsKSB7CisgICAgICBtb2RlbC5nZXQoJ2lkJyk7IC8vICcxJworICAg
IH0pOworICAgIGBgYAorCisgICAgQHByb3BlcnR5IGlkCisgICAgQHR5cGUge1N0cmluZ30KKyAg
Ki8KKyAgaWQ6IG51bGwsCisgIHRyYW5zYWN0aW9uOiBudWxsLAorICAvKioKKyAgICBAcHJvcGVy
dHkgY3VycmVudFN0YXRlCisgICAgQHByaXZhdGUKKyAgICBAdHlwZSB7T2JqZWN0fQorICAqLwor
ICBjdXJyZW50U3RhdGU6IG51bGwsCisgIC8qKgorICAgIFdoZW4gdGhlIHJlY29yZCBpcyBpbiB0
aGUgYGludmFsaWRgIHN0YXRlIHRoaXMgb2JqZWN0IHdpbGwgY29udGFpbgorICAgIGFueSBlcnJv
cnMgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuIFdoZW4gcHJlc2VudCB0aGUgZXJyb3JzIGhhc2gK
KyAgICB0eXBpY2FsbHkgY29udGFpbnMga2V5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnZhbGlk
IHByb3BlcnR5IG5hbWVzCisgICAgYW5kIHZhbHVlcyB3aGljaCBhcmUgYW4gYXJyYXkgb2YgZXJy
b3IgbWVzc2FnZXMuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcmVjb3JkLmdldCgnZXJyb3Jz
Lmxlbmd0aCcpOyAvLyAwCisgICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFsdWUnKTsK
KyAgICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7CisgICAgICByZWNvcmQu
Z2V0KCdlcnJvcnMnKS5nZXQoJ2ZvbycpOyAvLyBbJ2ZvbyBzaG91bGQgYmUgYSBudW1iZXIuJ10K
KyAgICB9KTsKKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBlcnJvcnMKKyAgICBAdHlwZSB7T2Jq
ZWN0fQorICAqLworICBlcnJvcnM6IG51bGwsCisKKyAgLyoqCisgICAgQ3JlYXRlIGEgSlNPTiBy
ZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkLCB1c2luZyB0aGUgc2VyaWFsaXphdGlvbgorICAg
IHN0cmF0ZWd5IG9mIHRoZSBzdG9yZSdzIGFkYXB0ZXIuCisKKyAgIGBzZXJpYWxpemVgIHRha2Vz
IGFuIG9wdGlvbmFsIGhhc2ggYXMgYSBwYXJhbWV0ZXIsIGN1cnJlbnRseQorICAgIHN1cHBvcnRl
ZCBvcHRpb25zIGFyZToKKworICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQn
cyBJRCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICBKU09OIHJlcHJlc2VudGF0aW9u
LgorCisgICAgQG1ldGhvZCBzZXJpYWxpemUKKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwor
ICAgIEByZXR1cm5zIHtPYmplY3R9IGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2
ZSBKU09OIHZhbHVlcyBvbmx5CisgICovCisgIHNlcmlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykg
eworICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKKyAgICByZXR1cm4gc3RvcmUu
c2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOworICB9LAorCisgIC8qKgorICAgIFVzZSBbRFMuSlNP
TlNlcmlhbGl6ZXJdKERTLkpTT05TZXJpYWxpemVyLmh0bWwpIHRvCisgICAgZ2V0IHRoZSBKU09O
IHJlcHJlc2VudGF0aW9uIG9mIGEgcmVjb3JkLgorCisgICAgYHRvSlNPTmAgdGFrZXMgYW4gb3B0
aW9uYWwgaGFzaCBhcyBhIHBhcmFtZXRlciwgY3VycmVudGx5CisgICAgc3VwcG9ydGVkIG9wdGlv
bnMgYXJlOgorCisgICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBz
aG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICBKU09OIHJlcHJlc2VudGF0aW9uLgorCisg
ICAgQG1ldGhvZCB0b0pTT04KKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgIEByZXR1
cm5zIHtPYmplY3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorICAqLwor
ICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICAvLyBjb250YWluZXIgaXMgZm9yIGxh
enkgdHJhbnNmb3JtIGxvb2t1cHMKKyAgICB2YXIgc2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxp
emVyLmNyZWF0ZSh7IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIgfSk7CisgICAgcmV0dXJuIHNl
cmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOworICB9LAorCisgIC8qKgorICAgIEZp
cmVkIHdoZW4gdGhlIHJlY29yZCBpcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgorCisgICAgQGV2
ZW50IGRpZExvYWQKKyAgKi8KKyAgZGlkTG9hZDogRW1iZXIuSywKKworICAvKioKKyAgICBGaXJl
ZCB3aGVuIHRoZSByZWNvcmQgaXMgdXBkYXRlZC4KKworICAgIEBldmVudCBkaWRVcGRhdGUKKyAg
Ki8KKyAgZGlkVXBkYXRlOiBFbWJlci5LLAorCisgIC8qKgorICAgIEZpcmVkIHdoZW4gdGhlIHJl
Y29yZCBpcyBjcmVhdGVkLgorCisgICAgQGV2ZW50IGRpZENyZWF0ZQorICAqLworICBkaWRDcmVh
dGU6IEVtYmVyLkssCisKKyAgLyoqCisgICAgRmlyZWQgd2hlbiB0aGUgcmVjb3JkIGlzIGRlbGV0
ZWQuCisKKyAgICBAZXZlbnQgZGlkRGVsZXRlCisgICovCisgIGRpZERlbGV0ZTogRW1iZXIuSywK
KworICAvKioKKyAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgYmVjb21lcyBpbnZhbGlkLgorCisg
ICAgQGV2ZW50IGJlY2FtZUludmFsaWQKKyAgKi8KKyAgYmVjYW1lSW52YWxpZDogRW1iZXIuSywK
KworICAvKioKKyAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgZW50ZXJzIHRoZSBlcnJvciBzdGF0
ZS4KKworICAgIEBldmVudCBiZWNhbWVFcnJvcgorICAqLworICBiZWNhbWVFcnJvcjogRW1iZXIu
SywKKworICAvKioKKyAgICBAcHJvcGVydHkgZGF0YQorICAgIEBwcml2YXRlCisgICAgQHR5cGUg
e09iamVjdH0KKyAgKi8KKyAgZGF0YTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAg
dGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEgfHwge307CisgICAgcmV0dXJuIHRoaXMuX2RhdGE7Cisg
IH0pLnByb3BlcnR5KCksCisKKyAgX2RhdGE6IG51bGwsCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7
CisgICAgc2V0KHRoaXMsICdjdXJyZW50U3RhdGUnLCBEUy5Sb290U3RhdGUuZW1wdHkpOworICAg
IHZhciBlcnJvcnMgPSBEUy5FcnJvcnMuY3JlYXRlKCk7CisgICAgZXJyb3JzLnJlZ2lzdGVySGFu
ZGxlcnModGhpcywgZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnNlbmQoJ2JlY2FtZUludmFsaWQn
KTsKKyAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuc2VuZCgnYmVjYW1lVmFsaWQnKTsK
KyAgICB9KTsKKyAgICBzZXQodGhpcywgJ2Vycm9ycycsIGVycm9ycyk7CisgICAgdGhpcy5fc3Vw
ZXIoKTsKKyAgICB0aGlzLl9zZXR1cCgpOworICB9LAorCisgIF9zZXR1cDogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy5fY2hhbmdlc1RvU3luYyA9IHt9OworICAgIHRoaXMuX2RlZmVycmVkVHJpZ2dl
cnMgPSBbXTsKKyAgICB0aGlzLl9kYXRhID0ge307CisgICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9
OworICAgIHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9OworICAgIHRoaXMuX3JlbGF0aW9u
c2hpcHMgPSB7fTsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIHNlbmQKKyAgICBAcHJpdmF0
ZQorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lCisgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQK
KyAgKi8KKyAgc2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgeworICAgIHZhciBjdXJyZW50
U3RhdGUgPSBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpOworCisgICAgaWYgKCFjdXJyZW50U3Rh
dGVbbmFtZV0pIHsKKyAgICAgIHRoaXMuX3VuaGFuZGxlZEV2ZW50KGN1cnJlbnRTdGF0ZSwgbmFt
ZSwgY29udGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZVtuYW1lXSh0aGlz
LCBjb250ZXh0KTsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIHRyYW5zaXRpb25UbworICAg
IEBwcml2YXRlCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKKyAgKi8KKyAgdHJhbnNpdGlvblRv
OiBmdW5jdGlvbihuYW1lKSB7CisgICAgLy8gUE9TU0lCTEUgVE9ETzogUmVtb3ZlIHRoaXMgY29k
ZSBhbmQgcmVwbGFjZSB3aXRoCisgICAgLy8gYWx3YXlzIGhhdmluZyBkaXJlY3QgcmVmZXJlbmNl
cyB0byBzdGF0ZSBvYmplY3RzCisKKyAgICB2YXIgcGl2b3ROYW1lID0gbmFtZS5zcGxpdCgiLiIs
IDEpLAorICAgICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpLAor
ICAgICAgICBzdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKKworICAgIGRvIHsKKyAgICAgIGlmIChzdGF0
ZS5leGl0KSB7IHN0YXRlLmV4aXQodGhpcyk7IH0KKyAgICAgIHN0YXRlID0gc3RhdGUucGFyZW50
U3RhdGU7CisgICAgfSB3aGlsZSAoIXN0YXRlLmhhc093blByb3BlcnR5KHBpdm90TmFtZSkpOwor
CisgICAgdmFyIHBhdGggPSBuYW1lLnNwbGl0KCIuIik7CisKKyAgICB2YXIgc2V0dXBzID0gW10s
IGVudGVycyA9IFtdLCBpLCBsOworCisgICAgZm9yIChpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsg
aSsrKSB7CisgICAgICBzdGF0ZSA9IHN0YXRlW3BhdGhbaV1dOworCisgICAgICBpZiAoc3RhdGUu
ZW50ZXIpIHsgZW50ZXJzLnB1c2goc3RhdGUpOyB9CisgICAgICBpZiAoc3RhdGUuc2V0dXApIHsg
c2V0dXBzLnB1c2goc3RhdGUpOyB9CisgICAgfQorCisgICAgZm9yIChpPTAsIGw9ZW50ZXJzLmxl
bmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIGVudGVyc1tpXS5lbnRlcih0aGlzKTsKKyAgICB9CisK
KyAgICBzZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScsIHN0YXRlKTsKKworICAgIGZvciAoaT0wLCBs
PXNldHVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICBzZXR1cHNbaV0uc2V0dXAodGhpcyk7
CisgICAgfQorCisgICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOworICB9LAorCisg
IF91bmhhbmRsZWRFdmVudDogZnVuY3Rpb24oc3RhdGUsIG5hbWUsIGNvbnRleHQpIHsKKyAgICB2
YXIgZXJyb3JNZXNzYWdlID0gIkF0dGVtcHRlZCB0byBoYW5kbGUgZXZlbnQgYCIgKyBuYW1lICsg
ImAgIjsKKyAgICBlcnJvck1lc3NhZ2UgICAgKz0gIm9uICIgKyBTdHJpbmcodGhpcykgKyAiIHdo
aWxlIGluIHN0YXRlICI7CisgICAgZXJyb3JNZXNzYWdlICAgICs9IHN0YXRlLnN0YXRlTmFtZSAr
ICIuICI7CisKKyAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBlcnJvck1l
c3NhZ2UgICs9ICJDYWxsZWQgd2l0aCAiICsgRW1iZXIuaW5zcGVjdChjb250ZXh0KSArICIuIjsK
KyAgICB9CisKKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJyb3JNZXNzYWdlKTsKKyAgfSwK
KworICB3aXRoVHJhbnNhY3Rpb246IGZ1bmN0aW9uKGZuKSB7CisgICAgdmFyIHRyYW5zYWN0aW9u
ID0gZ2V0KHRoaXMsICd0cmFuc2FjdGlvbicpOworICAgIGlmICh0cmFuc2FjdGlvbikgeyBmbih0
cmFuc2FjdGlvbik7IH0KKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIGxvYWRpbmdEYXRhCisg
ICAgQHByaXZhdGUKKyAgICBAcGFyYW0ge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgbG9hZGlu
Z0RhdGE6IGZ1bmN0aW9uKHByb21pc2UpIHsKKyAgICB0aGlzLnNlbmQoJ2xvYWRpbmdEYXRhJywg
cHJvbWlzZSk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBsb2FkZWREYXRhCisgICAgQHBy
aXZhdGUKKyAgKi8KKyAgbG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZW5kKCds
b2FkZWREYXRhJyk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBub3RGb3VuZAorICAgIEBw
cml2YXRlCisgICovCisgIG5vdEZvdW5kOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnNlbmQoJ25v
dEZvdW5kJyk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBwdXNoZWREYXRhCisgICAgQHBy
aXZhdGUKKyAgKi8KKyAgcHVzaGVkRGF0YTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZW5kKCdw
dXNoZWREYXRhJyk7CisgIH0sCisKKyAgLyoqCisgICAgTWFya3MgdGhlIHJlY29yZCBhcyBkZWxl
dGVkIGJ1dCBkb2VzIG5vdCBzYXZlIGl0LiBZb3UgbXVzdCBjYWxsCisgICAgYHNhdmVgIGFmdGVy
d2FyZHMgaWYgeW91IHdhbnQgdG8gcGVyc2lzdCBpdC4gWW91IG1pZ2h0IHVzZSB0aGlzCisgICAg
bWV0aG9kIGlmIHlvdSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHN0aWxsIGByb2xsYmFjaygp
YCBhCisgICAgZGVsZXRlIGFmdGVyIGl0IHdhcyBtYWRlLgorCisgICAgRXhhbXBsZQorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0
ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgc29mdERlbGV0ZTogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykuZGVsZXRlUmVjb3JkKCk7CisgICAgICAgIH0s
CisgICAgICAgIGNvbmZpcm06IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMuZ2V0KCdtb2Rl
bCcpLnNhdmUoKTsKKyAgICAgICAgfSwKKyAgICAgICAgdW5kbzogZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgdGhpcy5nZXQoJ21vZGVsJykucm9sbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgfQor
ICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKKyAgKi8KKyAgZGVs
ZXRlUmVjb3JkOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnNlbmQoJ2RlbGV0ZVJlY29yZCcpOwor
ICB9LAorCisgIC8qKgorICAgIFNhbWUgYXMgYGRlbGV0ZVJlY29yZGAsIGJ1dCBzYXZlcyB0aGUg
cmVjb3JkIGltbWVkaWF0ZWx5LgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFj
dGlvbnM6IHsKKyAgICAgICAgZGVsZXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY29u
dHJvbGxlciA9IHRoaXMuY29udHJvbGxlcjsKKyAgICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5k
ZXN0cm95UmVjb3JkKCkudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIu
dHJhbnNpdGlvblRvUm91dGUoJ21vZGVsLmluZGV4Jyk7CisgICAgICAgICAgfSk7CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2QgZGVzdHJveVJlY29y
ZAorICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQg
d2hlbiB0aGUgYWRhcHRlciByZXR1cm5zCisgICAgc3VjY2Vzc2Z1bGx5IG9yIHJlamVjdGVkIGlm
IHRoZSBhZGFwdGVyIHJldHVybnMgd2l0aCBhbiBlcnJvci4KKyAgKi8KKyAgZGVzdHJveVJlY29y
ZDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5kZWxldGVSZWNvcmQoKTsKKyAgICByZXR1cm4gdGhp
cy5zYXZlKCk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCB1bmxvYWRSZWNvcmQKKyAgICBA
cHJpdmF0ZQorICAqLworICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKCkgeworICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbiBvbmx5IHVubG9hZCBhIGxvYWRlZCwgbm9uLWRpcnR5IHJlY29yZC4iLCAh
Z2V0KHRoaXMsICdpc0RpcnR5JykpOworCisgICAgdGhpcy5zZW5kKCd1bmxvYWRSZWNvcmQnKTsK
KyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIGNsZWFyUmVsYXRpb25zaGlwcworICAgIEBwcml2
YXRlCisgICovCisgIGNsZWFyUmVsYXRpb25zaGlwczogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5l
YWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgeworICAgICAgaWYg
KHJlbGF0aW9uc2hpcC5raW5kID09PSAnYmVsb25nc1RvJykgeworICAgICAgICBzZXQodGhpcywg
bmFtZSwgbnVsbCk7CisgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFz
TWFueScpIHsKKyAgICAgICAgdmFyIGhhc01hbnkgPSB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0
aW9uc2hpcC5uYW1lXTsKKyAgICAgICAgaWYgKGhhc01hbnkpIHsgaGFzTWFueS5jbGVhcigpOyB9
CisgICAgICB9CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCB1cGRh
dGVSZWNvcmRBcnJheXMKKyAgICBAcHJpdmF0ZQorICAqLworICB1cGRhdGVSZWNvcmRBcnJheXM6
IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3VwZGF0aW5nUmVjb3JkQXJyYXlzTGF0ZXIgPSBmYWxz
ZTsKKyAgICBnZXQodGhpcywgJ3N0b3JlJykuZGF0YVdhc1VwZGF0ZWQodGhpcy5jb25zdHJ1Y3Rv
ciwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAgUmV0dXJucyBhbiBvYmplY3QsIHdob3NlIGtl
eXMgYXJlIGNoYW5nZWQgcHJvcGVydGllcywgYW5kIHZhbHVlIGlzCisgICAgYW4gW29sZFByb3As
IG5ld1Byb3BdIGFycmF5LgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAg
IEFwcC5NYXNjb3QgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAgbmFtZTogYXR0cignc3RyaW5n
JykKKyAgICB9KTsKKworICAgIHZhciBwZXJzb24gPSBzdG9yZS5jcmVhdGVSZWNvcmQoJ3BlcnNv
bicpOworICAgIHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7fQorICAgIHBlcnNvbi5z
ZXQoJ25hbWUnLCAnVG9tc3RlcicpOworICAgIHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAv
LyB7bmFtZTogW3VuZGVmaW5lZCwgJ1RvbXN0ZXInXX0KKyAgICBgYGAKKworICAgIEBtZXRob2Qg
Y2hhbmdlZEF0dHJpYnV0ZXMKKyAgICBAcmV0dXJuIHtPYmplY3R9IGFuIG9iamVjdCwgd2hvc2Ug
a2V5cyBhcmUgY2hhbmdlZCBwcm9wZXJ0aWVzLAorICAgICAgYW5kIHZhbHVlIGlzIGFuIFtvbGRQ
cm9wLCBuZXdQcm9wXSBhcnJheS4KKyAgKi8KKyAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9u
KCkgeworICAgIHZhciBvbGREYXRhID0gZ2V0KHRoaXMsICdfZGF0YScpLAorICAgICAgICBuZXdE
YXRhID0gZ2V0KHRoaXMsICdfYXR0cmlidXRlcycpLAorICAgICAgICBkaWZmRGF0YSA9IHt9LAor
ICAgICAgICBwcm9wOworCisgICAgZm9yIChwcm9wIGluIG5ld0RhdGEpIHsKKyAgICAgIGRpZmZE
YXRhW3Byb3BdID0gW29sZERhdGFbcHJvcF0sIG5ld0RhdGFbcHJvcF1dOworICAgIH0KKworICAg
IHJldHVybiBkaWZmRGF0YTsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIGFkYXB0ZXJXaWxs
Q29tbWl0CisgICAgQHByaXZhdGUKKyAgKi8KKyAgYWRhcHRlcldpbGxDb21taXQ6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMuc2VuZCgnd2lsbENvbW1pdCcpOworICB9LAorCisgIC8qKgorICAgIElm
IHRoZSBhZGFwdGVyIGRpZCBub3QgcmV0dXJuIGEgaGFzaCBpbiByZXNwb25zZSB0byBhIGNvbW1p
dCwKKyAgICBtZXJnZSB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGlu
dG8gdGhlIGV4aXN0aW5nCisgICAgc2F2ZWQgZGF0YS4KKworICAgIEBtZXRob2QgYWRhcHRlckRp
ZENvbW1pdAorICAqLworICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5jdGlvbihkYXRhKSB7CisgICAg
c2V0KHRoaXMsICdpc0Vycm9yJywgZmFsc2UpOworCisgICAgaWYgKGRhdGEpIHsKKyAgICAgIHRo
aXMuX2RhdGEgPSBkYXRhOworICAgIH0gZWxzZSB7CisgICAgICBFbWJlci5taXhpbih0aGlzLl9k
YXRhLCB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIHRoaXMuX2luRmxp
Z2h0QXR0cmlidXRlcyA9IHt9OworCisgICAgdGhpcy5zZW5kKCdkaWRDb21taXQnKTsKKyAgICB0
aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7CisKKyAgICBpZiAoIWRhdGEpIHsgcmV0dXJu
OyB9CisKKyAgICB0aGlzLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKSB7
CisgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7CisgICAgfSk7CisgIH0s
CisKKyAgLyoqCisgICAgQG1ldGhvZCBhZGFwdGVyRGlkRGlydHkKKyAgICBAcHJpdmF0ZQorICAq
LworICBhZGFwdGVyRGlkRGlydHk6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VuZCgnYmVjb21l
RGlydHknKTsKKyAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7CisgIH0sCisKKyAg
ZGF0YURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CisgICAgdGhpcy5yZWxv
YWRIYXNNYW55cygpOworICB9LCAnZGF0YScpLAorCisgIHJlbG9hZEhhc01hbnlzOiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgcmVsYXRpb25zaGlwcyA9IGdldCh0aGlzLmNvbnN0cnVjdG9yLCAncmVs
YXRpb25zaGlwc0J5TmFtZScpOworICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXIoKTsK
KyAgICByZWxhdGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7
CisgICAgICBpZiAodGhpcy5fZGF0YS5saW5rcyAmJiB0aGlzLl9kYXRhLmxpbmtzW25hbWVdKSB7
IHJldHVybjsgfQorICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsK
KyAgICAgICAgdGhpcy5oYXNNYW55RGlkQ2hhbmdlKHJlbGF0aW9uc2hpcC5rZXkpOworICAgICAg
fQorICAgIH0sIHRoaXMpOworICB9LAorCisgIGhhc01hbnlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtl
eSkgeworICAgIHZhciBoYXNNYW55ID0gdGhpcy5fcmVsYXRpb25zaGlwc1trZXldOworCisgICAg
aWYgKGhhc01hbnkpIHsKKyAgICAgIHZhciByZWNvcmRzID0gdGhpcy5fZGF0YVtrZXldIHx8IFtd
OworCisgICAgICBzZXQoaGFzTWFueSwgJ2NvbnRlbnQnLCBFbWJlci5BKHJlY29yZHMpKTsKKyAg
ICAgIHNldChoYXNNYW55LCAnaXNMb2FkZWQnLCB0cnVlKTsKKyAgICAgIGhhc01hbnkudHJpZ2dl
cignZGlkTG9hZCcpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIHVwZGF0ZVJl
Y29yZEFycmF5c0xhdGVyCisgICAgQHByaXZhdGUKKyAgKi8KKyAgdXBkYXRlUmVjb3JkQXJyYXlz
TGF0ZXI6IGZ1bmN0aW9uKCkgeworICAgIC8vIHF1aWNrIGhhY2sgKHNvbWV0aGluZyBsaWtlIHRo
aXMgY291bGQgYmUgcHVzaGVkIGludG8gcnVuLm9uY2UKKyAgICBpZiAodGhpcy5fdXBkYXRpbmdS
ZWNvcmRBcnJheXNMYXRlcikgeyByZXR1cm47IH0KKyAgICB0aGlzLl91cGRhdGluZ1JlY29yZEFy
cmF5c0xhdGVyID0gdHJ1ZTsKKworICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRo
aXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKTsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9k
IHNldHVwRGF0YQorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtPYmplY3R9IGRhdGEKKyAgICBA
cGFyYW0ge0Jvb2xlYW59IHBhcnRpYWwgdGhlIGRhdGEgc2hvdWxkIGJlIG1lcmdlZCBpbnRvCisg
ICAgICB0aGUgZXhpc3RpbmcgZGF0YSwgbm90IHJlcGxhY2UgaXQuCisgICovCisgIHNldHVwRGF0
YTogZnVuY3Rpb24oZGF0YSwgcGFydGlhbCkgeworICAgIGlmIChwYXJ0aWFsKSB7CisgICAgICBF
bWJlci5tZXJnZSh0aGlzLl9kYXRhLCBkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5f
ZGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSB0aGlzLl9yZWxh
dGlvbnNoaXBzOworCisgICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJl
bCkgeworICAgICAgaWYgKGRhdGEubGlua3MgJiYgZGF0YS5saW5rc1tuYW1lXSkgeyByZXR1cm47
IH0KKyAgICAgIGlmIChyZWwub3B0aW9ucy5hc3luYykgeyByZWxhdGlvbnNoaXBzW25hbWVdID0g
bnVsbDsgfQorICAgIH0pOworCisgICAgaWYgKGRhdGEpIHsgdGhpcy5wdXNoZWREYXRhKCk7IH0K
KworICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKKyAg
ICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsKKyAgICB9KTsKKyAgfSwKKwor
ICBtYXRlcmlhbGl6ZUlkOiBmdW5jdGlvbihpZCkgeworICAgIHNldCh0aGlzLCAnaWQnLCBpZCk7
CisgIH0sCisKKyAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7
CisgICAgRW1iZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBoYXNoIG9mIGF0dHJpYnV0ZXMgdG8gbWF0
ZXJpYWxpemVBdHRyaWJ1dGVzIiwgISFhdHRyaWJ1dGVzKTsKKyAgICBtZXJnZSh0aGlzLl9kYXRh
LCBhdHRyaWJ1dGVzKTsKKyAgfSwKKworICBtYXRlcmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24o
bmFtZSwgdmFsdWUpIHsKKyAgICB0aGlzLl9kYXRhW25hbWVdID0gdmFsdWU7CisgIH0sCisKKyAg
LyoqCisgICAgQG1ldGhvZCB1cGRhdGVIYXNNYW55CisgICAgQHByaXZhdGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7QXJyYXl9IHJlY29yZHMKKyAgKi8KKyAgdXBkYXRl
SGFzTWFueTogZnVuY3Rpb24obmFtZSwgcmVjb3JkcykgeworICAgIHRoaXMuX2RhdGFbbmFtZV0g
PSByZWNvcmRzOworICAgIHRoaXMuaGFzTWFueURpZENoYW5nZShuYW1lKTsKKyAgfSwKKworICAv
KioKKyAgICBAbWV0aG9kIHVwZGF0ZUJlbG9uZ3NUbworICAgIEBwcml2YXRlCisgICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgKi8KKyAgdXBk
YXRlQmVsb25nc1RvOiBmdW5jdGlvbihuYW1lLCByZWNvcmQpIHsKKyAgICB0aGlzLl9kYXRhW25h
bWVdID0gcmVjb3JkOworICB9LAorCisgIC8qKgorICAgIElmIHRoZSBtb2RlbCBgaXNEaXJ0eWAg
dGhpcyBmdW5jdGlvbiB3aWxsIGRpc2NhcmQgYW55IHVuc2F2ZWQKKyAgICBjaGFuZ2VzCisKKyAg
ICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcmVjb3JkLmdldCgnbmFtZScpOyAv
LyAnVW50aXRsZWQgRG9jdW1lbnQnCisgICAgcmVjb3JkLnNldCgnbmFtZScsICdEb2MgMScpOwor
ICAgIHJlY29yZC5nZXQoJ25hbWUnKTsgLy8gJ0RvYyAxJworICAgIHJlY29yZC5yb2xsYmFjaygp
OworICAgIHJlY29yZC5nZXQoJ25hbWUnKTsgLy8gJ1VudGl0bGVkIERvY3VtZW50JworICAgIGBg
YAorCisgICAgQG1ldGhvZCByb2xsYmFjaworICAqLworICByb2xsYmFjazogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9OworCisgICAgaWYgKGdldCh0aGlzLCAnaXNFcnJv
cicpKSB7CisgICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgIHNldCh0
aGlzLCAnaXNFcnJvcicsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIWdldCh0aGlzLCAnaXNW
YWxpZCcpKSB7CisgICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKKyAgICB9CisK
KyAgICB0aGlzLnNlbmQoJ3JvbGxlZEJhY2snKTsKKworICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9u
c2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFu
Z2UoJ2RhdGEnKTsKKyAgICB9KTsKKyAgfSwKKworICB0b1N0cmluZ0V4dGVuc2lvbjogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIGdldCh0aGlzLCAnaWQnKTsKKyAgfSwKKworICAvKioKKyAgICBU
aGUgZ29hbCBvZiB0aGlzIG1ldGhvZCBpcyB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHNwZWNpZmlj
IG9ic2VydmVycworICAgIHRoYXQgdGFrZSBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gYXBwbGljYXRp
b24gY2hhbmdlcy4KKworICAgIFRoaXMgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gbWFrZSBjaGFuZ2Vz
IChzdWNoIGFzIG1hdGVyaWFsaXphdGlvbiBhbmQKKyAgICByb2xsYmFjaykgdGhhdCBzaG91bGQg
bm90IHRyaWdnZXIgc2Vjb25kYXJ5IGJlaGF2aW9yIChzdWNoIGFzIHNldHRpbmcgYW4KKyAgICBp
bnZlcnNlIHJlbGF0aW9uc2hpcCBvciBtYXJraW5nIHJlY29yZHMgYXMgZGlydHkpLgorCisgICAg
VGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IGNoYW5nZSBhcyBFbWJlciBw
cm9wZXIgcHJvdmlkZXMKKyAgICBiZXR0ZXIgaW5mcmFzdHJ1Y3R1cmUgZm9yIHN1c3BlbmRpbmcg
Z3JvdXBzIG9mIG9ic2VydmVycywgYW5kIGlmIEFycmF5CisgICAgb2JzZXJ2YXRpb24gYmVjb21l
cyBtb3JlIHVuaWZpZWQgd2l0aCByZWd1bGFyIG9ic2VydmVycy4KKworICAgIEBtZXRob2Qgc3Vz
cGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycworICAgIEBwcml2YXRlCisgICAgQHBhcmFtIGNhbGxi
YWNrCisgICAgQHBhcmFtIGJpbmRpbmcKKyAgKi8KKyAgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2Vy
dmVyczogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICB2YXIgb2JzZXJ2ZXJzID0g
Z2V0KHRoaXMuY29uc3RydWN0b3IsICdyZWxhdGlvbnNoaXBOYW1lcycpLmJlbG9uZ3NUbzsKKyAg
ICB2YXIgc2VsZiA9IHRoaXM7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5fc3VzcGVuZGVkUmVs
YXRpb25zaGlwcyA9IHRydWU7CisgICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVycyhzZWxmLCBv
YnNlcnZlcnMsIG51bGwsICdiZWxvbmdzVG9EaWRDaGFuZ2UnLCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgRW1iZXIuX3N1c3BlbmRCZWZvcmVPYnNlcnZlcnMoc2VsZiwgb2JzZXJ2ZXJzLCBudWxsLCAn
YmVsb25nc1RvV2lsbENoYW5nZScsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGNhbGxiYWNrLmNh
bGwoYmluZGluZyB8fCBzZWxmKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9IGZpbmFs
bHkgeworICAgICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IGZhbHNlOworICAgIH0K
KyAgfSwKKworICAvKioKKyAgICBTYXZlIHRoZSByZWNvcmQgYW5kIHBlcnNpc3QgYW55IGNoYW5n
ZXMgdG8gdGhlIHJlY29yZCB0byBhbgorICAgIGV4dGVuYWwgc291cmNlIHZpYSB0aGUgYWRhcHRl
ci4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICByZWNvcmQuc2V0KCdu
YW1lJywgJ1RvbXN0ZXInKTsKKyAgICByZWNvcmQuc2F2ZSgpLnRoZW4oZnVuY3Rpb24oKXsKKyAg
ICAgIC8vIFN1Y2Nlc3MgY2FsbGJhY2sKKyAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgIC8vIEVy
cm9yIGNhbGxiYWNrCisgICAgfSk7CisgICAgYGBgCisgICAgQG1ldGhvZCBzYXZlCisgICAgQHJl
dHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBh
ZGFwdGVyIHJldHVybnMKKyAgICBzdWNjZXNzZnVsbHkgb3IgcmVqZWN0ZWQgaWYgdGhlIGFkYXB0
ZXIgcmV0dXJucyB3aXRoIGFuIGVycm9yLgorICAqLworICBzYXZlOiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgcHJvbWlzZUxhYmVsID0gIkRTOiBNb2RlbCNzYXZlICIgKyB0aGlzOworICAgIHZhciBy
ZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIocHJvbWlzZUxhYmVsKTsKKworICAgIHRoaXMuZ2V0
KCdzdG9yZScpLnNjaGVkdWxlU2F2ZSh0aGlzLCByZXNvbHZlcik7CisgICAgdGhpcy5faW5GbGln
aHRBdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlczsKKyAgICB0aGlzLl9hdHRyaWJ1dGVzID0g
e307CisKKyAgICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNv
bHZlci5wcm9taXNlIH0pOworICB9LAorCisgIC8qKgorICAgIFJlbG9hZCB0aGUgcmVjb3JkIGZy
b20gdGhlIGFkYXB0ZXIuCisKKyAgICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSByZWNvcmQg
aGFzIGFscmVhZHkgZmluaXNoZWQgbG9hZGluZworICAgIGFuZCBoYXMgbm90IHlldCBiZWVuIG1v
ZGlmaWVkIChgaXNMb2FkZWRgIGJ1dCBub3QgYGlzRGlydHlgLAorICAgIG9yIGBpc1NhdmluZ2Ap
LgorCisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Nb2RlbFZpZXdS
b3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHJl
bG9hZDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykucmVsb2FkKCk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2QgcmVs
b2FkCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZl
ZCB3aXRoIHRoZSByZWNvcmQgd2hlbiB0aGUKKyAgICBhZGFwdGVyIHJldHVybnMgc3VjY2Vzc2Z1
bGx5IG9yIHJlamVjdGVkIGlmIHRoZSBhZGFwdGVyIHJldHVybnMKKyAgICB3aXRoIGFuIGVycm9y
LgorICAqLworICByZWxvYWQ6IGZ1bmN0aW9uKCkgeworICAgIHNldCh0aGlzLCAnaXNSZWxvYWRp
bmcnLCB0cnVlKTsKKworICAgIHZhciAgcmVjb3JkID0gdGhpczsKKworICAgIHZhciBwcm9taXNl
TGFiZWwgPSAiRFM6IE1vZGVsI3JlbG9hZCBvZiAiICsgdGhpczsKKyAgICB2YXIgcHJvbWlzZSA9
IG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSl7CisgICAgICAgcmVjb3Jk
LnNlbmQoJ3JlbG9hZFJlY29yZCcsIHJlc29sdmUpOworICAgIH0sIHByb21pc2VMYWJlbCkudGhl
bihmdW5jdGlvbigpIHsKKyAgICAgIHJlY29yZC5zZXQoJ2lzUmVsb2FkaW5nJywgZmFsc2UpOwor
ICAgICAgcmVjb3JkLnNldCgnaXNFcnJvcicsIGZhbHNlKTsKKyAgICAgIHJldHVybiByZWNvcmQ7
CisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICByZWNvcmQuc2V0KCdpc0Vycm9yJywg
dHJ1ZSk7CisgICAgICB0aHJvdyByZWFzb247CisgICAgfSwgIkRTOiBNb2RlbCNyZWxvYWQgY29t
cGxldGUsIHVwZGF0ZSBmbGFncyIpOworCisgICAgcmV0dXJuIERTLlByb21pc2VPYmplY3QuY3Jl
YXRlKHsgcHJvbWlzZTogcHJvbWlzZSB9KTsKKyAgfSwKKworICAvLyBGT1IgVVNFIERVUklORyBD
T01NSVQgUFJPQ0VTUworCisgIGFkYXB0ZXJEaWRVcGRhdGVBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0
dHJpYnV0ZU5hbWUsIHZhbHVlKSB7CisKKyAgICAvLyBJZiBhIHZhbHVlIGlzIHBhc3NlZCBpbiwg
dXBkYXRlIHRoZSBpbnRlcm5hbCBhdHRyaWJ1dGVzIGFuZCBjbGVhcgorICAgIC8vIHRoZSBhdHRy
aWJ1dGUgY2FjaGUgc28gaXQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZS4gT3RoZXJ3aXNlLAorICAg
IC8vIGNvbGxhcHNlIHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGludGVybmFsIGF0dHJpYnV0
ZXMgYmVjYXVzZQorICAgIC8vIHRoZSBhZGFwdGVyIGhhcyBhY2tub3dsZWRnZWQgaXQuCisgICAg
aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFt
ZV0gPSB2YWx1ZTsKKyAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlTmFt
ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFtZV0gPSB0aGlz
Ll9pbkZsaWdodEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07CisgICAgfQorCisgICAgdGhpcy51
cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOworICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgYWRh
cHRlckRpZEludmFsaWRhdGUKKyAgICBAcHJpdmF0ZQorICAqLworICBhZGFwdGVyRGlkSW52YWxp
ZGF0ZTogZnVuY3Rpb24oZXJyb3JzKSB7CisgICAgdmFyIHJlY29yZEVycm9ycyA9IGdldCh0aGlz
LCAnZXJyb3JzJyk7CisgICAgZnVuY3Rpb24gYWRkRXJyb3IobmFtZSkgeworICAgICAgaWYgKGVy
cm9yc1tuYW1lXSkgeworICAgICAgICByZWNvcmRFcnJvcnMuYWRkKG5hbWUsIGVycm9yc1tuYW1l
XSk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5lYWNoQXR0cmlidXRlKGFkZEVycm9yKTsK
KyAgICB0aGlzLmVhY2hSZWxhdGlvbnNoaXAoYWRkRXJyb3IpOworICB9LAorCisgIC8qKgorICAg
IEBtZXRob2QgYWRhcHRlckRpZEVycm9yCisgICAgQHByaXZhdGUKKyAgKi8KKyAgYWRhcHRlckRp
ZEVycm9yOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnNlbmQoJ2JlY2FtZUVycm9yJyk7CisgICAg
c2V0KHRoaXMsICdpc0Vycm9yJywgdHJ1ZSk7CisgIH0sCisKKyAgLyoqCisgICAgT3ZlcnJpZGUg
dGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gRW1iZXIuRXZlbnRlZCB0bworICAgIGFsc28g
Y2FsbCBtZXRob2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisKKyAgICBAbWV0aG9kIHRyaWdnZXIK
KyAgICBAcHJpdmF0ZQorICAgIEBwYXJhbSBuYW1lCisgICovCisgIHRyaWdnZXI6IGZ1bmN0aW9u
KG5hbWUpIHsKKyAgICBFbWJlci50cnlJbnZva2UodGhpcywgbmFtZSwgW10uc2xpY2UuY2FsbChh
cmd1bWVudHMsIDEpKTsKKyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICB9LAorCisgIHRyaWdnZXJMYXRlcjogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX2RlZmVy
cmVkVHJpZ2dlcnMucHVzaChhcmd1bWVudHMpICE9PSAxKSB7IHJldHVybjsgfQorICAgIEVtYmVy
LnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsICdfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnMn
KTsKKyAgfSwKKworICBfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnM6IGZ1bmN0aW9uKCkgeworICAg
IGZvciAodmFyIGk9MCwgbD10aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aDsgaTxsOyBpKysp
IHsKKyAgICAgIHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCB0aGlzLl9kZWZlcnJlZFRyaWdnZXJz
W2ldKTsKKyAgICB9CisKKyAgICB0aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aCA9IDA7Cisg
IH0KK30pOworCitEUy5Nb2RlbC5yZW9wZW5DbGFzcyh7CisKKyAgLyoqCisgICAgQWxpYXMgRFMu
TW9kZWwncyBgY3JlYXRlYCBtZXRob2QgdG8gYF9jcmVhdGVgLiBUaGlzIGFsbG93cyB1cyB0byBj
cmVhdGUgRFMuTW9kZWwKKyAgICBpbnN0YW5jZXMgZnJvbSB3aXRoaW4gdGhlIHN0b3JlLCBidXQg
aWYgZW5kIHVzZXJzIGFjY2lkZW50YWxseSBjYWxsIGBjcmVhdGUoKWAKKyAgICAoaW5zdGVhZCBv
ZiBgY3JlYXRlUmVjb3JkKClgKSwgd2UgY2FuIHJhaXNlIGFuIGVycm9yLgorCisgICAgQG1ldGhv
ZCBfY3JlYXRlCisgICAgQHByaXZhdGUKKyAgICBAc3RhdGljCisgICovCisgIF9jcmVhdGU6IERT
Lk1vZGVsLmNyZWF0ZSwKKworICAvKioKKyAgICBPdmVycmlkZSB0aGUgY2xhc3MnIGBjcmVhdGUo
KWAgbWV0aG9kIHRvIHJhaXNlIGFuIGVycm9yLiBUaGlzCisgICAgcHJldmVudHMgZW5kIHVzZXJz
IGZyb20gaW5hZHZlcnRlbnRseSBjYWxsaW5nIGBjcmVhdGUoKWAgaW5zdGVhZAorICAgIG9mIGBj
cmVhdGVSZWNvcmQoKWAuIFRoZSBzdG9yZSBpcyBzdGlsbCBhYmxlIHRvIGNyZWF0ZSBpbnN0YW5j
ZXMKKyAgICBieSBjYWxsaW5nIHRoZSBgX2NyZWF0ZSgpYCBtZXRob2QuIFRvIGNyZWF0ZSBhbiBp
bnN0YW5jZSBvZiBhCisgICAgYERTLk1vZGVsYCB1c2UgW3N0b3JlLmNyZWF0ZVJlY29yZF0oRFMu
U3RvcmUuaHRtbCNtZXRob2RfY3JlYXRlUmVjb3JkKS4KKworICAgIEBtZXRob2QgY3JlYXRlCisg
ICAgQHByaXZhdGUKKyAgICBAc3RhdGljCisgICovCisgIGNyZWF0ZTogZnVuY3Rpb24oKSB7Cisg
ICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJZb3Ugc2hvdWxkIG5vdCBjYWxsIGBjcmVhdGVgIG9u
IGEgbW9kZWwuIEluc3RlYWQsIGNhbGwgYHN0b3JlLmNyZWF0ZVJlY29yZGAgd2l0aCB0aGUgYXR0
cmlidXRlcyB5b3Ugd291bGQgbGlrZSB0byBzZXQuIik7CisgIH0KK30pOworCit9KSgpOworCisK
KworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGdl
dCA9IEVtYmVyLmdldDsKKworLyoqCisgIEBjbGFzcyBNb2RlbAorICBAbmFtZXNwYWNlIERTCisq
LworRFMuTW9kZWwucmVvcGVuQ2xhc3MoeworICAvKioKKyAgICBBIG1hcCB3aG9zZSBrZXlzIGFy
ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKKyAgICBkZXNjcmliZWQg
YnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUK
KyAgICBwcm9wZXJ0eS4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKworICAg
IEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAgZmlyc3ROYW1lOiBhdHRyKCdz
dHJpbmcnKSwKKyAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKKyAgICAgIGJpcnRoZGF5
OiBhdHRyKCdkYXRlJykKKyAgICB9KTsKKworICAgIHZhciBhdHRyaWJ1dGVzID0gRW1iZXIuZ2V0
KEFwcC5QZXJzb24sICdhdHRyaWJ1dGVzJykKKworICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5j
dGlvbihuYW1lLCBtZXRhKSB7CisgICAgICBjb25zb2xlLmxvZyhuYW1lLCBtZXRhKTsKKyAgICB9
KTsKKworICAgIC8vIHByaW50czoKKyAgICAvLyBmaXJzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBp
c0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwg
bmFtZTogImZpcnN0TmFtZSJ9CisgICAgLy8gbGFzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0
dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFt
ZTogImxhc3ROYW1lIn0KKyAgICAvLyBiaXJ0aGRheSB7dHlwZTogImRhdGUiLCBpc0F0dHJpYnV0
ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImJp
cnRoZGF5In0KKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVzCisgICAgQHN0YXRp
YworICAgIEB0eXBlIHtFbWJlci5NYXB9CisgICAgQHJlYWRPbmx5CisgICovCisgIGF0dHJpYnV0
ZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBtYXAgPSBFbWJlci5NYXAu
Y3JlYXRlKCk7CisKKyAgICB0aGlzLmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUs
IG1ldGEpIHsKKyAgICAgIGlmIChtZXRhLmlzQXR0cmlidXRlKSB7CisgICAgICAgIEVtYmVyLmFz
c2VydCgiWW91IG1heSBub3Qgc2V0IGBpZGAgYXMgYW4gYXR0cmlidXRlIG9uIHlvdXIgbW9kZWwu
IFBsZWFzZSByZW1vdmUgYW55IGxpbmVzIHRoYXQgbG9vayBsaWtlOiBgaWQ6IERTLmF0dHIoJzx0
eXBlPicpYCBmcm9tICIgKyB0aGlzLnRvU3RyaW5nKCksIG5hbWUgIT09ICdpZCcpOworCisgICAg
ICAgIG1ldGEubmFtZSA9IG5hbWU7CisgICAgICAgIG1hcC5zZXQobmFtZSwgbWV0YSk7CisgICAg
ICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gbWFwOworICB9KSwKKworICAvKioKKyAgICBBIG1h
cCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMK
KyAgICBkZXNjcmliZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdHlwZSBvZiB0
cmFuc2Zvcm1hdGlvbgorICAgIGFwcGxpZWQgdG8gZWFjaCBhdHRyaWJ1dGUuIFRoaXMgbWFwIGRv
ZXMgbm90IGluY2x1ZGUgYW55CisgICAgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRy
YW5zZm9ybWF0aW9uIHR5cGUuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgQXBwLlBlcnNvbiA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgICBmaXJzdE5hbWU6IGF0dHIo
KSwKKyAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKKyAgICAgIGJpcnRoZGF5OiBhdHRy
KCdkYXRlJykKKyAgICB9KTsKKworICAgIHZhciB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMgPSBFbWJl
ci5nZXQoQXBwLlBlcnNvbiwgJ3RyYW5zZm9ybWVkQXR0cmlidXRlcycpCisKKyAgICB0cmFuc2Zv
cm1lZEF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgdHlwZSkgeworICAgICAgY29u
c29sZS5sb2coZmllbGQsIHR5cGUpOworICAgIH0pOworCisgICAgLy8gcHJpbnRzOgorICAgIC8v
IGxhc3ROYW1lIHN0cmluZworICAgIC8vIGJpcnRoZGF5IGRhdGUKKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMKKyAgICBAc3RhdGljCisgICAgQHR5cGUge0Vt
YmVyLk1hcH0KKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgdHJhbnNmb3JtZWRBdHRyaWJ1dGVzOiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0
ZSgpOworCisgICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSwgbWV0YSkgeworICAg
ICAgaWYgKG1ldGEudHlwZSkgeworICAgICAgICBtYXAuc2V0KGtleSwgbWV0YS50eXBlKTsKKyAg
ICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBtYXA7CisgIH0pLAorCisgIC8qKgorICAgIEl0
ZXJhdGVzIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG1vZGVsLCBjYWxsaW5nIHRoZSBw
YXNzZWQgZnVuY3Rpb24gb24gZWFjaAorICAgIGF0dHJpYnV0ZS4KKworICAgIFRoZSBjYWxsYmFj
ayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUg
KGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKworICAgIGBgYGphdmFzY3JpcHQK
KyAgICBmdW5jdGlvbihuYW1lLCBtZXRhKTsKKyAgICBgYGAKKworICAgIC0gYG5hbWVgIHRoZSBu
YW1lIG9mIHRoZSBjdXJyZW50IHByb3BlcnR5IGluIHRoZSBpdGVyYXRpb24KKyAgICAtIGBtZXRh
YCB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgcHJvcGVydHkgaW4gdGhlIGl0ZXJh
dGlvbgorCisgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4g
YWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0
IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgIGZpcnN0TmFt
ZTogYXR0cignc3RyaW5nJyksCisgICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCisgICAg
ICBiaXJ0aGRheTogYXR0cignZGF0ZScpCisgICAgfSk7CisKKyAgICBBcHAuUGVyc29uLmVhY2hB
dHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0YSkgeworICAgICAgY29uc29sZS5sb2cobmFtZSwg
bWV0YSk7CisgICAgfSk7CisKKyAgICAvLyBwcmludHM6CisgICAgLy8gZmlyc3ROYW1lIHt0eXBl
OiAic3RyaW5nIiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlw
ZTogZnVuY3Rpb24sIG5hbWU6ICJmaXJzdE5hbWUifQorICAgIC8vIGxhc3ROYW1lIHt0eXBlOiAi
c3RyaW5nIiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTog
ZnVuY3Rpb24sIG5hbWU6ICJsYXN0TmFtZSJ9CisgICAgLy8gYmlydGhkYXkge3R5cGU6ICJkYXRl
IiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rp
b24sIG5hbWU6ICJiaXJ0aGRheSJ9CisgICBgYGAKKworICAgIEBtZXRob2QgZWFjaEF0dHJpYnV0
ZQorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRl
CisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQor
ICAgIEBzdGF0aWMKKyAgKi8KKyAgZWFjaEF0dHJpYnV0ZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJp
bmRpbmcpIHsKKyAgICBnZXQodGhpcywgJ2F0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5h
bWUsIG1ldGEpIHsKKyAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgbWV0YSk7Cisg
ICAgfSwgYmluZGluZyk7CisgIH0sCisKKyAgLyoqCisgICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUg
dHJhbnNmb3JtZWRBdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCwgY2FsbGluZworICAgIHRoZSBwYXNz
ZWQgZnVuY3Rpb24gb24gZWFjaCBhdHRyaWJ1dGUuIE5vdGUgdGhlIGNhbGxiYWNrIHdpbGwgbm90
IGJlCisgICAgY2FsbGVkIGZvciBhbnkgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRy
YW5zZm9ybWF0aW9uIHR5cGUuCisKKyAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRl
IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICBwYXJhbWV0ZXJz
IGFyZSBvcHRpb25hbCk6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24obmFtZSwg
dHlwZSk7CisgICAgYGBgCisKKyAgICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBw
cm9wZXJ0eSBpbiB0aGUgaXRlcmF0aW9uCisgICAgLSBgdHlwZWAgYSBzdHJpbmcgY29udGFpbmlu
ZyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0cmFuc2Zvcm1lZAorICAgICAgYXBwbGllZCB0byB0
aGUgYXR0cmlidXRlCisKKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywg
eW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRoYXQgd2ls
bCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LgorCisgICAgRXhhbXBsZQorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAg
Zmlyc3ROYW1lOiBhdHRyKCksCisgICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCisgICAg
ICBiaXJ0aGRheTogYXR0cignZGF0ZScpCisgICAgfSk7CisKKyAgICBBcHAuUGVyc29uLmVhY2hU
cmFuc2Zvcm1lZEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lLCB0eXBlKSB7CisgICAgICBjb25zb2xl
LmxvZyhuYW1lLCB0eXBlKTsKKyAgICB9KTsKKworICAgIC8vIHByaW50czoKKyAgICAvLyBsYXN0
TmFtZSBzdHJpbmcKKyAgICAvLyBiaXJ0aGRheSBkYXRlCisgICBgYGAKKworICAgIEBtZXRob2Qg
ZWFjaFRyYW5zZm9ybWVkQXR0cmlidXRlCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sg
VGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhl
IHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgQHN0YXRpYworICAqLworICBlYWNoVHJhbnNmb3Jt
ZWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgZ2V0KHRoaXMs
ICd0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsK
KyAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgdHlwZSk7CisgICAgfSk7CisgIH0K
K30pOworCisKK0RTLk1vZGVsLnJlb3Blbih7CisgIGVhY2hBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNh
bGxiYWNrLCBiaW5kaW5nKSB7CisgICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoQXR0cmlidXRlKGNh
bGxiYWNrLCBiaW5kaW5nKTsKKyAgfQorfSk7CisKK2Z1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShy
ZWNvcmQsIG9wdGlvbnMsIGtleSkgeworICBpZiAodHlwZW9mIG9wdGlvbnMuZGVmYXVsdFZhbHVl
ID09PSAiZnVuY3Rpb24iKSB7CisgICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlKCk7Cisg
IH0gZWxzZSB7CisgICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlOworICB9Cit9CisKK2Z1
bmN0aW9uIGhhc1ZhbHVlKHJlY29yZCwga2V5KSB7CisgIHJldHVybiByZWNvcmQuX2F0dHJpYnV0
ZXMuaGFzT3duUHJvcGVydHkoa2V5KSB8fAorICAgICAgICAgcmVjb3JkLl9pbkZsaWdodEF0dHJp
YnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSB8fAorICAgICAgICAgcmVjb3JkLl9kYXRhLmhhc093
blByb3BlcnR5KGtleSk7Cit9CisKK2Z1bmN0aW9uIGdldFZhbHVlKHJlY29yZCwga2V5KSB7Cisg
IGlmIChyZWNvcmQuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgIHJldHVy
biByZWNvcmQuX2F0dHJpYnV0ZXNba2V5XTsKKyAgfSBlbHNlIGlmIChyZWNvcmQuX2luRmxpZ2h0
QXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgcmV0dXJuIHJlY29yZC5faW5G
bGlnaHRBdHRyaWJ1dGVzW2tleV07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlY29yZC5fZGF0
YVtrZXldOworICB9Cit9CisKKy8qKgorICBgRFMuYXR0cmAgZGVmaW5lcyBhbiBhdHRyaWJ1dGUg
b24gYSBbRFMuTW9kZWxdKERTLk1vZGVsLmh0bWwpLgorICBCeSBkZWZhdWx0LCBhdHRyaWJ1dGVz
IGFyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcywgaG93ZXZlciB5b3UgY2FuIHNwZWNpZnkgYW4KKyAg
b3B0aW9uYWwgdHlwZSB0byBoYXZlIHRoZSB2YWx1ZSBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVk
LgorICBFbWJlciBEYXRhIHNoaXBzIHdpdGggZm91ciBiYXNpYyB0cmFuc2Zvcm0gdHlwZXM6IGBz
dHJpbmdgLCBgbnVtYmVyYCwKKyAgYGJvb2xlYW5gIGFuZCBgZGF0ZWAuIFlvdSBjYW4gZGVmaW5l
IHlvdXIgb3duIHRyYW5zZm9ybXMgYnkgc3ViY2xhc3NpbmcKKyAgW0RTLlRyYW5zZm9ybV0oRFMu
VHJhbnNmb3JtLmh0bWwpLgorCisgIGBEUy5hdHRyYCB0YWtlcyBhbiBvcHRpb25hbCBoYXNoIGFz
IGEgc2Vjb25kIHBhcmFtZXRlciwgY3VycmVudGx5CisgIHN1cHBvcnRlZCBvcHRpb25zIGFyZToK
KworICAtIGBkZWZhdWx0VmFsdWVgOiBQYXNzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdG8gYmUg
Y2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIHRvIGEgZGVm
YXVsdCB2YWx1ZSBpZiBub25lIGlzIHN1cHBsaWVkLgorCisgIEV4YW1wbGUKKworICBgYGBqYXZh
c2NyaXB0CisgIHZhciBhdHRyID0gRFMuYXR0cjsKKworICBBcHAuVXNlciA9IERTLk1vZGVsLmV4
dGVuZCh7CisgICAgdXNlcm5hbWU6IGF0dHIoJ3N0cmluZycpLAorICAgIGVtYWlsOiBhdHRyKCdz
dHJpbmcnKSwKKyAgICB2ZXJpZmllZDogYXR0cignYm9vbGVhbicsIHtkZWZhdWx0VmFsdWU6IGZh
bHNlfSkKKyAgfSk7CisgIGBgYAorCisgIEBuYW1lc3BhY2UKKyAgQG1ldGhvZCBhdHRyCisgIEBm
b3IgRFMKKyAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIGF0dHJpYnV0ZSB0eXBlCisgIEBwYXJh
bSB7T2JqZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCisgIEByZXR1cm4ge0F0dHJpYnV0
ZX0KKyovCisKK0RTLmF0dHIgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7CisgIG9wdGlvbnMg
PSBvcHRpb25zIHx8IHt9OworCisgIHZhciBtZXRhID0geworICAgIHR5cGU6IHR5cGUsCisgICAg
aXNBdHRyaWJ1dGU6IHRydWUsCisgICAgb3B0aW9uczogb3B0aW9ucworICB9OworCisgIHJldHVy
biBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50
cy5sZW5ndGggPiAxKSB7CisgICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkgbm90IHNldCBgaWRg
IGFzIGFuIGF0dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2UgcmVtb3ZlIGFueSBsaW5lcyB0
aGF0IGxvb2sgbGlrZTogYGlkOiBEUy5hdHRyKCc8dHlwZT4nKWAgZnJvbSAiICsgdGhpcy5jb25z
dHJ1Y3Rvci50b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOworICAgICAgdmFyIG9sZFZhbHVlID0g
dGhpcy5fYXR0cmlidXRlc1trZXldIHx8IHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlc1trZXldIHx8
IHRoaXMuX2RhdGFba2V5XTsKKworICAgICAgdGhpcy5zZW5kKCdkaWRTZXRQcm9wZXJ0eScsIHsK
KyAgICAgICAgbmFtZToga2V5LAorICAgICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsCisgICAgICAg
IG9yaWdpbmFsVmFsdWU6IHRoaXMuX2RhdGFba2V5XSwKKyAgICAgICAgdmFsdWU6IHZhbHVlCisg
ICAgICB9KTsKKworICAgICAgdGhpcy5fYXR0cmlidXRlc1trZXldID0gdmFsdWU7CisgICAgICBy
ZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIGlmIChoYXNWYWx1ZSh0aGlzLCBrZXkpKSB7CisgICAg
ICByZXR1cm4gZ2V0VmFsdWUodGhpcywga2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJu
IGdldERlZmF1bHRWYWx1ZSh0aGlzLCBvcHRpb25zLCBrZXkpOworICAgIH0KKworICAvLyBgZGF0
YWAgaXMgbmV2ZXIgc2V0IGRpcmVjdGx5LiBIb3dldmVyLCBpdCBtYXkgYmUKKyAgLy8gaW52YWxp
ZGF0ZWQgZnJvbSB0aGUgc3RhdGUgbWFuYWdlcidzIHNldERhdGEKKyAgLy8gZXZlbnQuCisgIH0p
LnByb3BlcnR5KCdkYXRhJykubWV0YShtZXRhKTsKK307CisKKworfSkoKTsKKworCisKKyhmdW5j
dGlvbigpIHsKKy8qKgorICBAbW9kdWxlIGVtYmVyLWRhdGEKKyovCisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCisvKioKKyAgQW4g
QXR0cmlidXRlQ2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHdoZW5ldmVyIGEgcmVjb3JkJ3MKKyAg
YXR0cmlidXRlIGNoYW5nZXMgdmFsdWUuIEl0IGlzIHVzZWQgdG8gdHJhY2sgY2hhbmdlcyB0byBh
CisgIHJlY29yZCBiZXR3ZWVuIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisKKyAgQGNsYXNzIEF0dHJp
YnV0ZUNoYW5nZQorICBAbmFtZXNwYWNlIERTCisgIEBwcml2YXRlCisgIEBjb25zdHJ1Y3Rvcgor
Ki8KK3ZhciBBdHRyaWJ1dGVDaGFuZ2UgPSBEUy5BdHRyaWJ1dGVDaGFuZ2UgPSBmdW5jdGlvbihv
cHRpb25zKSB7CisgIHRoaXMucmVjb3JkID0gb3B0aW9ucy5yZWNvcmQ7CisgIHRoaXMuc3RvcmUg
PSBvcHRpb25zLnN0b3JlOworICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7CisgIHRoaXMudmFs
dWUgPSBvcHRpb25zLnZhbHVlOworICB0aGlzLm9sZFZhbHVlID0gb3B0aW9ucy5vbGRWYWx1ZTsK
K307CisKK0F0dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7
CisgIHJldHVybiBuZXcgQXR0cmlidXRlQ2hhbmdlKG9wdGlvbnMpOworfTsKKworQXR0cmlidXRl
Q2hhbmdlLnByb3RvdHlwZSA9IHsKKyAgc3luYzogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMu
dmFsdWUgIT09IHRoaXMub2xkVmFsdWUpIHsKKyAgICAgIHRoaXMucmVjb3JkLnNlbmQoJ2JlY29t
ZURpcnR5Jyk7CisgICAgICB0aGlzLnJlY29yZC51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwor
ICAgIH0KKworICAgIC8vIFRPRE86IFVzZSB0aGlzIG9iamVjdCBpbiB0aGUgY29tbWl0IHByb2Nl
c3MKKyAgICB0aGlzLmRlc3Ryb3koKTsKKyAgfSwKKworICAvKioKKyAgICBJZiB0aGUgQXR0cmli
dXRlQ2hhbmdlIGlzIGRlc3Ryb3llZCAoZWl0aGVyIGJ5IGJlaW5nIHJvbGxlZCBiYWNrCisgICAg
b3IgYmVpbmcgY29tbWl0dGVkKSwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgcGVuZGluZyBj
aGFuZ2VzCisgICAgb24gdGhlIHJlY29yZC4KKworICAgIEBtZXRob2QgZGVzdHJveQorICAqLwor
ICBkZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICBkZWxldGUgdGhpcy5yZWNvcmQuX2NoYW5nZXNU
b1N5bmNbdGhpcy5uYW1lXTsKKyAgfQorfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsK
Ky8qKgorICBAbW9kdWxlIGVtYmVyLWRhdGEKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKK3ZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVh
Y2g7CisKKy8qKgorICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlCisgIEBuYW1lc3BhY2UgRFMK
KyAgQHByaXZhdGUKKyAgQGNvbnN0cnVjdG9yCisqLworRFMuUmVsYXRpb25zaGlwQ2hhbmdlID0g
ZnVuY3Rpb24ob3B0aW9ucykgeworICB0aGlzLnBhcmVudFJlY29yZCA9IG9wdGlvbnMucGFyZW50
UmVjb3JkOworICB0aGlzLmNoaWxkUmVjb3JkID0gb3B0aW9ucy5jaGlsZFJlY29yZDsKKyAgdGhp
cy5maXJzdFJlY29yZCA9IG9wdGlvbnMuZmlyc3RSZWNvcmQ7CisgIHRoaXMuZmlyc3RSZWNvcmRL
aW5kID0gb3B0aW9ucy5maXJzdFJlY29yZEtpbmQ7CisgIHRoaXMuZmlyc3RSZWNvcmROYW1lID0g
b3B0aW9ucy5maXJzdFJlY29yZE5hbWU7CisgIHRoaXMuc2Vjb25kUmVjb3JkID0gb3B0aW9ucy5z
ZWNvbmRSZWNvcmQ7CisgIHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9IG9wdGlvbnMuc2Vjb25kUmVj
b3JkS2luZDsKKyAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gb3B0aW9ucy5zZWNvbmRSZWNvcmRO
YW1lOworICB0aGlzLmNoYW5nZVR5cGUgPSBvcHRpb25zLmNoYW5nZVR5cGU7CisgIHRoaXMuc3Rv
cmUgPSBvcHRpb25zLnN0b3JlOworCisgIHRoaXMuY29tbWl0dGVkID0ge307Cit9OworCisvKioK
KyAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZUFkZAorICBAbmFtZXNwYWNlIERTCisgIEBwcml2
YXRlCisgIEBjb25zdHJ1Y3RvcgorKi8KK0RTLlJlbGF0aW9uc2hpcENoYW5nZUFkZCA9IGZ1bmN0
aW9uKG9wdGlvbnMpeworICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY2FsbCh0aGlzLCBvcHRpb25z
KTsKK307CisKKy8qKgorICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlCisgIEBuYW1l
c3BhY2UgRFMKKyAgQHByaXZhdGUKKyAgQGNvbnN0cnVjdG9yCisqLworRFMuUmVsYXRpb25zaGlw
Q2hhbmdlUmVtb3ZlID0gZnVuY3Rpb24ob3B0aW9ucyl7CisgIERTLlJlbGF0aW9uc2hpcENoYW5n
ZS5jYWxsKHRoaXMsIG9wdGlvbnMpOworfTsKKworRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0
ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgcmV0dXJuIG5ldyBEUy5SZWxhdGlvbnNoaXBDaGFu
Z2Uob3B0aW9ucyk7Cit9OworCitEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlID0gZnVu
Y3Rpb24ob3B0aW9ucykgeworICByZXR1cm4gbmV3IERTLlJlbGF0aW9uc2hpcENoYW5nZUFkZChv
cHRpb25zKTsKK307CisKK0RTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5jcmVhdGUgPSBmdW5j
dGlvbihvcHRpb25zKSB7CisgIHJldHVybiBuZXcgRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3Zl
KG9wdGlvbnMpOworfTsKKworRFMuT25lVG9NYW55Q2hhbmdlID0ge307CitEUy5PbmVUb05vbmVD
aGFuZ2UgPSB7fTsKK0RTLk1hbnlUb05vbmVDaGFuZ2UgPSB7fTsKK0RTLk9uZVRvT25lQ2hhbmdl
ID0ge307CitEUy5NYW55VG9NYW55Q2hhbmdlID0ge307CisKK0RTLlJlbGF0aW9uc2hpcENoYW5n
ZS5fY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24ob3B0aW9ucyl7CisgIGlmKG9wdGlvbnMuY2hhbmdl
VHlwZSA9PT0gImFkZCIpeworICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3Jl
YXRlKG9wdGlvbnMpOworICB9CisgIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gInJlbW92ZSIp
eworICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmUuY3JlYXRlKG9wdGlvbnMp
OworICB9Cit9OworCisKK0RTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNo
aXBUeXBlID0gZnVuY3Rpb24ocmVjb3JkVHlwZSwga25vd25TaWRlKXsKKyAgdmFyIGtub3duS2V5
ID0ga25vd25TaWRlLmtleSwga2V5LCBvdGhlcktpbmQ7CisgIHZhciBrbm93bktpbmQgPSBrbm93
blNpZGUua2luZDsKKworICB2YXIgaW52ZXJzZSA9IHJlY29yZFR5cGUuaW52ZXJzZUZvcihrbm93
bktleSk7CisKKyAgaWYgKGludmVyc2UpeworICAgIGtleSA9IGludmVyc2UubmFtZTsKKyAgICBv
dGhlcktpbmQgPSBpbnZlcnNlLmtpbmQ7CisgIH0KKworICBpZiAoIWludmVyc2UpeworICAgIHJl
dHVybiBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvTm9uZSIgOiAibWFueVRvTm9u
ZSI7CisgIH0KKyAgZWxzZXsKKyAgICBpZihvdGhlcktpbmQgPT09ICJiZWxvbmdzVG8iKXsKKyAg
ICAgIHJldHVybiBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvT25lIiA6ICJtYW55
VG9PbmUiOworICAgIH0KKyAgICBlbHNleworICAgICAgcmV0dXJuIGtub3duS2luZCA9PT0gImJl
bG9uZ3NUbyIgPyAib25lVG9NYW55IiA6ICJtYW55VG9NYW55IjsKKyAgICB9CisgIH0KKworfTsK
KworRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGZpcnN0UmVj
b3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKXsKKyAgLy8gR2V0IHRoZSB0eXBlIG9m
IHRoZSBjaGlsZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKKyAgdmFyIGZpcnN0UmVj
b3JkVHlwZSA9IGZpcnN0UmVjb3JkLmNvbnN0cnVjdG9yLCBjaGFuZ2VUeXBlOworICBjaGFuZ2VU
eXBlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUoZmly
c3RSZWNvcmRUeXBlLCBvcHRpb25zKTsKKyAgaWYgKGNoYW5nZVR5cGUgPT09ICJvbmVUb01hbnki
KXsKKyAgICByZXR1cm4gRFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29y
ZCwgc2Vjb25kUmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7CisgIH0KKyAgZWxzZSBpZiAoY2hhbmdl
VHlwZSA9PT0gIm1hbnlUb09uZSIpeworICAgIHJldHVybiBEUy5PbmVUb01hbnlDaGFuZ2UuY3Jl
YXRlQ2hhbmdlKHNlY29uZFJlY29yZCwgZmlyc3RSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKKyAg
fQorICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9Ob25lIil7CisgICAgcmV0dXJuIERT
Lk9uZVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmQsIHNlY29uZFJlY29yZCwg
c3RvcmUsIG9wdGlvbnMpOworICB9CisgIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJtYW55VG9O
b25lIil7CisgICAgcmV0dXJuIERTLk1hbnlUb05vbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0
UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKKyAgfQorICBlbHNlIGlmIChj
aGFuZ2VUeXBlID09PSAib25lVG9PbmUiKXsKKyAgICByZXR1cm4gRFMuT25lVG9PbmVDaGFuZ2Uu
Y3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsK
KyAgfQorICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAibWFueVRvTWFueSIpeworICAgIHJldHVy
biBEUy5NYW55VG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25kUmVj
b3JkLCBzdG9yZSwgb3B0aW9ucyk7CisgIH0KK307CisKK0RTLk9uZVRvTm9uZUNoYW5nZS5jcmVh
dGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50UmVjb3JkLCBzdG9yZSwgb3B0
aW9ucykgeworICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7CisgIHZhciBjaGFuZ2UgPSBEUy5SZWxh
dGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7CisgICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVu
dFJlY29yZCwKKyAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKKyAgICAgIGZpcnN0UmVj
b3JkOiBjaGlsZFJlY29yZCwKKyAgICAgIHN0b3JlOiBzdG9yZSwKKyAgICAgIGNoYW5nZVR5cGU6
IG9wdGlvbnMuY2hhbmdlVHlwZSwKKyAgICAgIGZpcnN0UmVjb3JkTmFtZToga2V5LAorICAgICAg
Zmlyc3RSZWNvcmRLaW5kOiAiYmVsb25nc1RvIgorICB9KTsKKworICBzdG9yZS5hZGRSZWxhdGlv
bnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBudWxsLCBjaGFu
Z2UpOworCisgIHJldHVybiBjaGFuZ2U7Cit9OworCitEUy5NYW55VG9Ob25lQ2hhbmdlLmNyZWF0
ZUNoYW5nZSA9IGZ1bmN0aW9uKGNoaWxkUmVjb3JkLCBwYXJlbnRSZWNvcmQsIHN0b3JlLCBvcHRp
b25zKSB7CisgIHZhciBrZXkgPSBvcHRpb25zLmtleTsKKyAgdmFyIGNoYW5nZSA9IERTLlJlbGF0
aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKKyAgICAgIHBhcmVudFJlY29yZDogY2hpbGRS
ZWNvcmQsCisgICAgICBjaGlsZFJlY29yZDogcGFyZW50UmVjb3JkLAorICAgICAgc2Vjb25kUmVj
b3JkOiBjaGlsZFJlY29yZCwKKyAgICAgIHN0b3JlOiBzdG9yZSwKKyAgICAgIGNoYW5nZVR5cGU6
IG9wdGlvbnMuY2hhbmdlVHlwZSwKKyAgICAgIHNlY29uZFJlY29yZE5hbWU6IG9wdGlvbnMua2V5
LAorICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiCisgIH0pOworCisgIHN0b3JlLmFk
ZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51
bGwsIGNoYW5nZSk7CisgIHJldHVybiBjaGFuZ2U7Cit9OworCisKK0RTLk1hbnlUb01hbnlDaGFu
Z2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3Rv
cmUsIG9wdGlvbnMpIHsKKyAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRlIG9m
IHRoZSByZWxhdGlvbnNoaXAgaXMgc3BlY2lmaWVkLAorICAvLyB1c2UgdGhhdAorICAvLyBJZiB0
aGUgdHlwZSBvZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBvbiB0aGUgY2hp
bGQncyB0eXBlCisgIC8vIGRlZmluaXRpb24uCisgIHZhciBrZXkgPSBvcHRpb25zLmtleTsKKwor
ICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoeworICAg
ICAgcGFyZW50UmVjb3JkOiBwYXJlbnRSZWNvcmQsCisgICAgICBjaGlsZFJlY29yZDogY2hpbGRS
ZWNvcmQsCisgICAgICBmaXJzdFJlY29yZDogY2hpbGRSZWNvcmQsCisgICAgICBzZWNvbmRSZWNv
cmQ6IHBhcmVudFJlY29yZCwKKyAgICAgIGZpcnN0UmVjb3JkS2luZDogImhhc01hbnkiLAorICAg
ICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiLAorICAgICAgc3RvcmU6IHN0b3JlLAorICAg
ICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAorICAgICAgZmlyc3RSZWNvcmROYW1l
OiAga2V5CisgIH0pOworCisgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJl
Y29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7CisKKworICByZXR1cm4gY2hh
bmdlOworfTsKKworRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hp
bGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKKyAgdmFyIGtleTsKKwor
ICAvLyBJZiB0aGUgbmFtZSBvZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hp
cCBpcyBzcGVjaWZpZWQsCisgIC8vIHVzZSB0aGF0CisgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBw
YXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKKyAgLy8g
ZGVmaW5pdGlvbi4KKyAgaWYgKG9wdGlvbnMucGFyZW50VHlwZSkgeworICAgIGtleSA9IG9wdGlv
bnMucGFyZW50VHlwZS5pbnZlcnNlRm9yKG9wdGlvbnMua2V5KS5uYW1lOworICB9IGVsc2UgaWYg
KG9wdGlvbnMua2V5KSB7CisgICAga2V5ID0gb3B0aW9ucy5rZXk7CisgIH0gZWxzZSB7CisgICAg
RW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHBhcmVudFR5cGUgb3IgYmVsb25n
c1RvTmFtZSBvcHRpb24gdG8gT25lVG9NYW55Q2hhbmdlLmZvckNoaWxkQW5kUGFyZW50IiwgZmFs
c2UpOworICB9CisKKyAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRl
Q2hhbmdlKHsKKyAgICAgIHBhcmVudFJlY29yZDogcGFyZW50UmVjb3JkLAorICAgICAgY2hpbGRS
ZWNvcmQ6IGNoaWxkUmVjb3JkLAorICAgICAgZmlyc3RSZWNvcmQ6IGNoaWxkUmVjb3JkLAorICAg
ICAgc2Vjb25kUmVjb3JkOiBwYXJlbnRSZWNvcmQsCisgICAgICBmaXJzdFJlY29yZEtpbmQ6ICJi
ZWxvbmdzVG8iLAorICAgICAgc2Vjb25kUmVjb3JkS2luZDogImJlbG9uZ3NUbyIsCisgICAgICBz
dG9yZTogc3RvcmUsCisgICAgICBjaGFuZ2VUeXBlOiBvcHRpb25zLmNoYW5nZVR5cGUsCisgICAg
ICBmaXJzdFJlY29yZE5hbWU6ICBrZXkKKyAgfSk7CisKKyAgc3RvcmUuYWRkUmVsYXRpb25zaGlw
Q2hhbmdlRm9yKGNoaWxkUmVjb3JkLCBrZXksIHBhcmVudFJlY29yZCwgbnVsbCwgY2hhbmdlKTsK
KworCisgIHJldHVybiBjaGFuZ2U7Cit9OworCitEUy5PbmVUb09uZUNoYW5nZS5tYWludGFpbklu
dmFyaWFudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlY29yZCwga2V5KXsKKyAg
aWYgKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFkZCIgJiYgc3RvcmUucmVjb3JkSXNNYXRlcmlh
bGl6ZWQoY2hpbGRSZWNvcmQpKSB7CisgICAgdmFyIG9sZFBhcmVudCA9IGdldChjaGlsZFJlY29y
ZCwga2V5KTsKKyAgICBpZiAob2xkUGFyZW50KXsKKyAgICAgIHZhciBjb3JyZXNwb25kaW5nQ2hh
bmdlID0gRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNoaWxkUmVjb3JkLCBvbGRQYXJl
bnQsIHN0b3JlLCB7CisgICAgICAgICAgcGFyZW50VHlwZTogb3B0aW9ucy5wYXJlbnRUeXBlLAor
ICAgICAgICAgIGhhc01hbnlOYW1lOiBvcHRpb25zLmhhc01hbnlOYW1lLAorICAgICAgICAgIGNo
YW5nZVR5cGU6ICJyZW1vdmUiLAorICAgICAgICAgIGtleTogb3B0aW9ucy5rZXkKKyAgICAgICAg
fSk7CisgICAgICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtl
eSwgb3B0aW9ucy5wYXJlbnRSZWNvcmQgLCBudWxsLCBjb3JyZXNwb25kaW5nQ2hhbmdlKTsKKyAg
ICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5jKCk7CisgICAgfQorICB9Cit9OworCitEUy5PbmVU
b01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJl
Y29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKKyAgdmFyIGtleTsKKworICAvLyBJZiB0aGUgbmFtZSBv
ZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVjaWZpZWQsCisg
IC8vIHVzZSB0aGF0CisgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVk
LCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKKyAgLy8gZGVmaW5pdGlvbi4KKyAgaWYg
KG9wdGlvbnMucGFyZW50VHlwZSkgeworICAgIGtleSA9IG9wdGlvbnMucGFyZW50VHlwZS5pbnZl
cnNlRm9yKG9wdGlvbnMua2V5KS5uYW1lOworICAgIERTLk9uZVRvTWFueUNoYW5nZS5tYWludGFp
bkludmFyaWFudCggb3B0aW9ucywgc3RvcmUsIGNoaWxkUmVjb3JkLCBrZXkgKTsKKyAgfSBlbHNl
IGlmIChvcHRpb25zLmtleSkgeworICAgIGtleSA9IG9wdGlvbnMua2V5OworICB9IGVsc2Ugewor
ICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBlaXRoZXIgYSBwYXJlbnRUeXBlIG9yIGJl
bG9uZ3NUb05hbWUgb3B0aW9uIHRvIE9uZVRvTWFueUNoYW5nZS5mb3JDaGlsZEFuZFBhcmVudCIs
IGZhbHNlKTsKKyAgfQorCisgIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2Ny
ZWF0ZUNoYW5nZSh7CisgICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwKKyAgICAgIGNo
aWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKKyAgICAgIGZpcnN0UmVjb3JkOiBjaGlsZFJlY29yZCwK
KyAgICAgIHNlY29uZFJlY29yZDogcGFyZW50UmVjb3JkLAorICAgICAgZmlyc3RSZWNvcmRLaW5k
OiAiYmVsb25nc1RvIiwKKyAgICAgIHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKKyAgICAg
IHN0b3JlOiBzdG9yZSwKKyAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKKyAg
ICAgIGZpcnN0UmVjb3JkTmFtZTogIGtleQorICB9KTsKKworICBzdG9yZS5hZGRSZWxhdGlvbnNo
aXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBjaGFuZ2UuZ2V0U2Vj
b25kUmVjb3JkTmFtZSgpLCBjaGFuZ2UpOworCisKKyAgcmV0dXJuIGNoYW5nZTsKK307CisKKwor
RFMuT25lVG9NYW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50ID0gZnVuY3Rpb24ob3B0aW9ucywg
c3RvcmUsIGNoaWxkUmVjb3JkLCBrZXkpeworICBpZiAob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAi
YWRkIiAmJiBjaGlsZFJlY29yZCkgeworICAgIHZhciBvbGRQYXJlbnQgPSBnZXQoY2hpbGRSZWNv
cmQsIGtleSk7CisgICAgaWYgKG9sZFBhcmVudCl7CisgICAgICB2YXIgY29ycmVzcG9uZGluZ0No
YW5nZSA9IERTLk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWNvcmQsIG9sZFBh
cmVudCwgc3RvcmUsIHsKKyAgICAgICAgICBwYXJlbnRUeXBlOiBvcHRpb25zLnBhcmVudFR5cGUs
CisgICAgICAgICAgaGFzTWFueU5hbWU6IG9wdGlvbnMuaGFzTWFueU5hbWUsCisgICAgICAgICAg
Y2hhbmdlVHlwZTogInJlbW92ZSIsCisgICAgICAgICAga2V5OiBvcHRpb25zLmtleQorICAgICAg
ICB9KTsKKyAgICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwg
a2V5LCBvcHRpb25zLnBhcmVudFJlY29yZCwgY29ycmVzcG9uZGluZ0NoYW5nZS5nZXRTZWNvbmRS
ZWNvcmROYW1lKCksIGNvcnJlc3BvbmRpbmdDaGFuZ2UpOworICAgICAgY29ycmVzcG9uZGluZ0No
YW5nZS5zeW5jKCk7CisgICAgfQorICB9Cit9OworCisvKioKKyAgQGNsYXNzIFJlbGF0aW9uc2hp
cENoYW5nZQorICBAbmFtZXNwYWNlIERTCisqLworRFMuUmVsYXRpb25zaGlwQ2hhbmdlLnByb3Rv
dHlwZSA9IHsKKworICBnZXRTZWNvbmRSZWNvcmROYW1lOiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
bmFtZSA9IHRoaXMuc2Vjb25kUmVjb3JkTmFtZSwgcGFyZW50OworCisgICAgaWYgKCFuYW1lKSB7
CisgICAgICBwYXJlbnQgPSB0aGlzLnNlY29uZFJlY29yZDsKKyAgICAgIGlmICghcGFyZW50KSB7
IHJldHVybjsgfQorCisgICAgICB2YXIgY2hpbGRUeXBlID0gdGhpcy5maXJzdFJlY29yZC5jb25z
dHJ1Y3RvcjsKKyAgICAgIHZhciBpbnZlcnNlID0gY2hpbGRUeXBlLmludmVyc2VGb3IodGhpcy5m
aXJzdFJlY29yZE5hbWUpOworICAgICAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gaW52ZXJzZS5u
YW1lOworICAgIH0KKworICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZE5hbWU7CisgIH0sCisK
KyAgLyoqCisgICAgR2V0IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgb24gdGhlIGJlbG9u
Z3NUbyBzaWRlLgorCisgICAgQG1ldGhvZCBnZXRGaXJzdFJlY29yZE5hbWUKKyAgICBAcmV0dXJu
IHtTdHJpbmd9CisgICovCisgIGdldEZpcnN0UmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7CisgICAg
dmFyIG5hbWUgPSB0aGlzLmZpcnN0UmVjb3JkTmFtZTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfSwK
KworICAvKioKKyAgICBAbWV0aG9kIGRlc3Ryb3kKKyAgICBAcHJpdmF0ZQorICAqLworICBkZXN0
cm95OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgY2hpbGRSZWNvcmQgPSB0aGlzLmNoaWxkUmVjb3Jk
LAorICAgICAgICBiZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwKKyAg
ICAgICAgaGFzTWFueU5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKKyAgICAgICAg
c3RvcmUgPSB0aGlzLnN0b3JlOworCisgICAgc3RvcmUucmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdl
Rm9yKGNoaWxkUmVjb3JkLCBiZWxvbmdzVG9OYW1lLCB0aGlzLnBhcmVudFJlY29yZCwgaGFzTWFu
eU5hbWUsIHRoaXMuY2hhbmdlVHlwZSk7CisgIH0sCisKKyAgZ2V0U2Vjb25kUmVjb3JkOiBmdW5j
dGlvbigpeworICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZDsKKyAgfSwKKworICAvKioKKyAg
ICBAbWV0aG9kIGdldEZpcnN0UmVjb3JkCisgICAgQHByaXZhdGUKKyAgKi8KKyAgZ2V0Rmlyc3RS
ZWNvcmQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmZpcnN0UmVjb3JkOworICB9LAor
CisgIGNvYWxlc2NlOiBmdW5jdGlvbigpeworICAgIHZhciByZWxhdGlvbnNoaXBQYWlycyA9IHRo
aXMuc3RvcmUucmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IodGhpcy5maXJzdFJlY29yZCk7Cisg
ICAgZm9yRWFjaChyZWxhdGlvbnNoaXBQYWlycywgZnVuY3Rpb24ocGFpcil7CisgICAgICB2YXIg
YWRkZWRDaGFuZ2UgPSBwYWlyWyJhZGQiXTsKKyAgICAgIHZhciByZW1vdmVkQ2hhbmdlID0gcGFp
clsicmVtb3ZlIl07CisgICAgICBpZihhZGRlZENoYW5nZSAmJiByZW1vdmVkQ2hhbmdlKSB7Cisg
ICAgICAgIGFkZGVkQ2hhbmdlLmRlc3Ryb3koKTsKKyAgICAgICAgcmVtb3ZlZENoYW5nZS5kZXN0
cm95KCk7CisgICAgICB9CisgICAgfSk7CisgIH0KK307CisKK0RTLlJlbGF0aW9uc2hpcENoYW5n
ZUFkZC5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0
ZSh7fSkpOworRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZSA9IEVtYmVyLmNy
ZWF0ZShEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7CisKKy8vIHRoZSBvYmplY3Qg
aXMgYSB2YWx1ZSwgYW5kIG5vdCBhIHByb21pc2UKK2Z1bmN0aW9uIGlzVmFsdWUob2JqZWN0KSB7
CisgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiAoIW9iamVjdC50aGVuIHx8
IHR5cGVvZiBvYmplY3QudGhlbiAhPT0gJ2Z1bmN0aW9uJyk7Cit9CisKK0RTLlJlbGF0aW9uc2hp
cENoYW5nZUFkZC5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJhZGQiOworRFMuUmVsYXRpb25zaGlw
Q2hhbmdlQWRkLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWNvbmRSZWNv
cmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCisgICAgICBmaXJzdFJlY29yZE5h
bWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAorICAgICAgZmlyc3RSZWNvcmQgPSB0aGlz
LmdldEZpcnN0UmVjb3JkKCksCisgICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJl
Y29yZCgpOworCisgIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiAr
IGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8
IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRpZCBu
b3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3Is
IGJlbG9uZ3NUb05hbWUpOworICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9u
Z3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAi
IGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlO
YW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCku
Y29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7CisKKyAgaWYgKHNlY29uZFJlY29yZCBpbnN0YW5j
ZW9mIERTLk1vZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsKKyAgICBp
Zih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKKyAgICAgIHNlY29uZFJl
Y29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7CisgICAgICAgIHNl
dChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIGZpcnN0UmVjb3JkKTsKKyAgICAgIH0p
OworCisgICAgIH0KKyAgICAgZWxzZSBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJoYXNN
YW55Iil7CisgICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhm
dW5jdGlvbigpeworICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KHNlY29uZFJlY29yZCwg
c2Vjb25kUmVjb3JkTmFtZSk7CisgICAgICAgIGlmIChpc1ZhbHVlKHJlbGF0aW9uc2hpcCkpIHsg
cmVsYXRpb25zaGlwLmFkZE9iamVjdChmaXJzdFJlY29yZCk7IH0KKyAgICAgIH0pOworICAgIH0K
KyAgfQorCisgIGlmIChmaXJzdFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIHNlY29uZFJl
Y29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmRO
YW1lKSAhPT0gc2Vjb25kUmVjb3JkKSB7CisgICAgaWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09
ICJiZWxvbmdzVG8iKXsKKyAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNl
cnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5h
bWUsIHNlY29uZFJlY29yZCk7CisgICAgICB9KTsKKyAgICB9CisgICAgZWxzZSBpZih0aGlzLmZp
cnN0UmVjb3JkS2luZCA9PT0gImhhc01hbnkiKXsKKyAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRS
ZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgdmFyIHJlbGF0aW9uc2hp
cCA9IGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKTsKKyAgICAgICAgaWYgKGlzVmFs
dWUocmVsYXRpb25zaGlwKSkgeyByZWxhdGlvbnNoaXAuYWRkT2JqZWN0KHNlY29uZFJlY29yZCk7
IH0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHRoaXMuY29hbGVzY2UoKTsKK307CisKK0RT
LlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJyZW1vdmUi
OworRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24o
KSB7CisgIHZhciBzZWNvbmRSZWNvcmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCks
CisgICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAorICAg
ICAgZmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCisgICAgICBzZWNvbmRSZWNv
cmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOworCisgIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3Bl
Y2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1Rv
TmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0
cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAi
ICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOworICAvL0VtYmVyLmFzc2VydCgi
WW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsg
Y2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNN
YW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRo
aXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7CisKKyAgaWYg
KHNlY29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNl
b2YgRFMuTW9kZWwpIHsKKyAgICBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdz
VG8iKXsKKyAgICAgIHNlY29uZFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1
bmN0aW9uKCl7CisgICAgICAgIHNldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIG51
bGwpOworICAgICAgfSk7CisgICAgfQorICAgIGVsc2UgaWYodGhpcy5zZWNvbmRSZWNvcmRLaW5k
ID09PSAiaGFzTWFueSIpeworICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBP
YnNlcnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChzZWNv
bmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUpOworICAgICAgICBpZiAoaXNWYWx1ZShyZWxhdGlv
bnNoaXApKSB7IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3QoZmlyc3RSZWNvcmQpOyB9CisgICAg
ICB9KTsKKyAgICB9CisgIH0KKworICBpZiAoZmlyc3RSZWNvcmQgaW5zdGFuY2VvZiBEUy5Nb2Rl
bCAmJiBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSkpIHsKKyAgICBpZih0aGlzLmZp
cnN0UmVjb3JkS2luZCA9PT0gImJlbG9uZ3NUbyIpeworICAgICAgZmlyc3RSZWNvcmQuc3VzcGVu
ZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpeworICAgICAgICBzZXQoZmlyc3RSZWNv
cmQsIGZpcnN0UmVjb3JkTmFtZSwgbnVsbCk7CisgICAgICB9KTsKKyAgICAgfQorICAgICBlbHNl
IGlmKHRoaXMuZmlyc3RSZWNvcmRLaW5kID09PSAiaGFzTWFueSIpeworICAgICAgIGZpcnN0UmVj
b3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKKyAgICAgICAgIHZh
ciByZWxhdGlvbnNoaXAgPSBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSk7CisgICAg
ICAgICBpZiAoaXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmpl
Y3Qoc2Vjb25kUmVjb3JkKTsgfQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgdGhpcy5jb2Fs
ZXNjZSgpOworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorICBAbW9kdWxl
IGVtYmVyLWRhdGEKKyovCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgZ2V0ID0g
RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCisgICAgaXNOb25lID0gRW1iZXIuaXNOb25lOwor
CisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCitmdW5jdGlvbiBhc3luY0JlbG9uZ3NU
byh0eXBlLCBvcHRpb25zLCBtZXRhKSB7CisgIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bihrZXksIHZhbHVlKSB7CisgICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKKyAgICAg
ICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCisgICAgICAgIHByb21pc2VMYWJlbCA9ICJE
UzogQXN5bmMgYmVsb25nc1RvICIgKyB0aGlzICsgIiA6ICIgKyBrZXk7CisKKyAgICBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkg
YWRkIGEgJyIgKyB0eXBlICsgIicgcmVjb3JkIHRvIHRoaXMgcmVsYXRpb25zaGlwIiwgIXZhbHVl
IHx8IHZhbHVlIGluc3RhbmNlb2Ygc3RvcmUubW9kZWxGb3IodHlwZSkpOworICAgICAgcmV0dXJu
IHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBw
cm9taXNlOiBFbWJlci5SU1ZQLnJlc29sdmUodmFsdWUsIHByb21pc2VMYWJlbCkgfSk7CisgICAg
fQorCisgICAgdmFyIGxpbmsgPSBkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nba2V5XSwKKyAgICAg
ICAgYmVsb25nc1RvID0gZGF0YVtrZXldOworCisgICAgaWYoIWlzTm9uZShiZWxvbmdzVG8pKSB7
CisgICAgICB2YXIgcHJvbWlzZSA9IHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbykgfHwgRW1i
ZXIuUlNWUC5yZXNvbHZlKGJlbG9uZ3NUbywgcHJvbWlzZUxhYmVsKTsKKyAgICAgIHJldHVybiBE
Uy5Qcm9taXNlT2JqZWN0LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2V9KTsKKyAgICB9IGVsc2Ug
aWYgKGxpbmspIHsKKyAgICAgIHZhciByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBB
c3luYyBiZWxvbmdzVG8gKGxpbmspICIgKyB0aGlzICsgIiA6ICIgKyBrZXkpOworICAgICAgc3Rv
cmUuZmluZEJlbG9uZ3NUbyh0aGlzLCBsaW5rLCBtZXRhLCByZXNvbHZlcik7CisgICAgICByZXR1
cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9taXNlIH0p
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0pLnByb3BlcnR5
KCdkYXRhJykubWV0YShtZXRhKTsKK30KKworLyoqCisgIGBEUy5iZWxvbmdzVG9gIGlzIHVzZWQg
dG8gZGVmaW5lIE9uZS1Uby1PbmUgYW5kIE9uZS1Uby1NYW55CisgIHJlbGF0aW9uc2hpcHMgb24g
YSBbRFMuTW9kZWxdKERTLk1vZGVsLmh0bWwpLgorCisKKyAgYERTLmJlbG9uZ3NUb2AgdGFrZXMg
YW4gb3B0aW9uYWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRseQorICBzdXBw
b3J0ZWQgb3B0aW9ucyBhcmU6CisKKyAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFsdWUgdXNlZCB0
byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlvbnNoaXAuCisg
IC0gYGludmVyc2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZlcnNlIHByb3Bl
cnR5IG9uIGEKKyAgICByZWxhdGVkIG1vZGVsIGluIGEgT25lLVRvLU1hbnkgcmVsYXRpb25zaGlw
LiBTZWUgW0V4cGxpY2l0IEludmVyc2VzXSgjdG9jX2V4cGxpY2l0LWludmVyc2VzKQorCisgICMj
IyMgT25lLVRvLU9uZQorICBUbyBkZWNsYXJlIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0
d2VlbiB0d28gbW9kZWxzLCB1c2UKKyAgYERTLmJlbG9uZ3NUb2A6CisKKyAgYGBgamF2YXNjcmlw
dAorICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgcHJvZmlsZTogRFMuYmVsb25n
c1RvKCdwcm9maWxlJykKKyAgfSk7CisKKyAgQXBwLlByb2ZpbGUgPSBEUy5Nb2RlbC5leHRlbmQo
eworICAgIHVzZXI6IERTLmJlbG9uZ3NUbygndXNlcicpCisgIH0pOworICBgYGAKKworICAjIyMj
IE9uZS1Uby1NYW55CisgIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0
d2VlbiB0d28gbW9kZWxzLCB1c2UKKyAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0
aCBgRFMuaGFzTWFueWAsIGxpa2UgdGhpczoKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5Qb3N0
ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcp
CisgIH0pOworCisgIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBwb3N0OiBE
Uy5iZWxvbmdzVG8oJ3Bvc3QnKQorICB9KTsKKyAgYGBgCisKKyAgQG5hbWVzcGFjZQorICBAbWV0
aG9kIGJlbG9uZ3NUbworICBAZm9yIERTCisgIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1vZGVsfSB0
eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKKyAgQHBhcmFtIHtPYmplY3R9
IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlvbnMKKyAgQHJldHVybiB7RW1iZXIuY29tcHV0ZWR9IHJl
bGF0aW9uc2hpcAorKi8KK0RTLmJlbG9uZ3NUbyA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsK
KyAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JykgeworICAgIG9wdGlvbnMgPSB0eXBlOwor
ICAgIHR5cGUgPSB1bmRlZmluZWQ7CisgIH0gZWxzZSB7CisgICAgRW1iZXIuYXNzZXJ0KCJUaGUg
Zmlyc3QgYXJndW1lbnQgRFMuYmVsb25nc1RvIG11c3QgYmUgYSBtb2RlbCB0eXBlIG9yIHN0cmlu
ZywgbGlrZSBEUy5iZWxvbmdzVG8oQXBwLlBlcnNvbikiLCAhIXR5cGUgJiYgKHR5cGVvZiB0eXBl
ID09PSAnc3RyaW5nJyB8fCBEUy5Nb2RlbC5kZXRlY3QodHlwZSkpKTsKKyAgfQorCisgIG9wdGlv
bnMgPSBvcHRpb25zIHx8IHt9OworCisgIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0
aW9uc2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2JlbG9uZ3NUbycgfTsKKwor
ICBpZiAob3B0aW9ucy5hc3luYykgeworICAgIHJldHVybiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBv
cHRpb25zLCBtZXRhKTsKKyAgfQorCisgIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7CisgICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKKyAgICAgICAg
c3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksIGJlbG9uZ3NUbywgdHlwZUNsYXNzOworCisgICAg
aWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgeworICAgICAgdHlwZUNsYXNzID0gc3RvcmUu
bW9kZWxGb3IodHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVDbGFzcyA9IHR5cGU7Cisg
ICAgfQorCisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKKyAgICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbiBvbmx5IGFkZCBhICciICsgdHlwZSArICInIHJlY29yZCB0byB0aGlzIHJl
bGF0aW9uc2hpcCIsICF2YWx1ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIHR5cGVDbGFzcyk7CisgICAg
ICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTsKKyAgICB9CisKKyAg
ICBiZWxvbmdzVG8gPSBkYXRhW2tleV07CisKKyAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykpIHsg
cmV0dXJuIG51bGw7IH0KKworICAgIHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbyk7CisKKyAg
ICByZXR1cm4gYmVsb25nc1RvOworICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Cit9
OworCisvKioKKyAgVGhlc2Ugb2JzZXJ2ZXJzIG9ic2VydmUgYWxsIGBiZWxvbmdzVG9gIHJlbGF0
aW9uc2hpcHMgb24gdGhlIHJlY29yZC4gU2VlCisgIGByZWxhdGlvbnNoaXBzL2V4dGAgdG8gc2Vl
IGhvdyB0aGVzZSBvYnNlcnZlcnMgZ2V0IHRoZWlyIGRlcGVuZGVuY2llcy4KKworICBAY2xhc3Mg
TW9kZWwKKyAgQG5hbWVzcGFjZSBEUworKi8KK0RTLk1vZGVsLnJlb3Blbih7CisKKyAgLyoqCisg
ICAgQG1ldGhvZCBiZWxvbmdzVG9XaWxsQ2hhbmdlCisgICAgQHByaXZhdGUKKyAgICBAc3RhdGlj
CisgICAgQHBhcmFtIHJlY29yZAorICAgIEBwYXJhbSBrZXkKKyAgKi8KKyAgYmVsb25nc1RvV2ls
bENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKKyAg
ICBpZiAoZ2V0KHJlY29yZCwgJ2lzTG9hZGVkJykpIHsKKyAgICAgIHZhciBvbGRQYXJlbnQgPSBn
ZXQocmVjb3JkLCBrZXkpOworCisgICAgICBpZiAob2xkUGFyZW50KSB7CisgICAgICAgIHZhciBz
dG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpLAorICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVs
YXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG9sZFBhcmVudCwgc3RvcmUsIHsg
a2V5OiBrZXksIGtpbmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBlOiAicmVtb3ZlIiB9KTsKKwor
ICAgICAgICBjaGFuZ2Uuc3luYygpOworICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0g
PSBjaGFuZ2U7CisgICAgICB9CisgICAgfQorICB9KSwKKworICAvKioKKyAgICBAbWV0aG9kIGJl
bG9uZ3NUb0RpZENoYW5nZQorICAgIEBwcml2YXRlCisgICAgQHN0YXRpYworICAgIEBwYXJhbSBy
ZWNvcmQKKyAgICBAcGFyYW0ga2V5CisgICovCisgIGJlbG9uZ3NUb0RpZENoYW5nZTogRW1iZXIu
aW1tZWRpYXRlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKKyAgICBpZiAoZ2V0KHJl
Y29yZCwgJ2lzTG9hZGVkJykpIHsKKyAgICAgIHZhciBuZXdQYXJlbnQgPSBnZXQocmVjb3JkLCBr
ZXkpOworCisgICAgICBpZiAobmV3UGFyZW50KSB7CisgICAgICAgIHZhciBzdG9yZSA9IGdldChy
ZWNvcmQsICdzdG9yZScpLAorICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hh
bmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG5ld1BhcmVudCwgc3RvcmUsIHsga2V5OiBrZXksIGtp
bmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBlOiAiYWRkIiB9KTsKKworICAgICAgICBjaGFuZ2Uu
c3luYygpOworICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSB0aGlzLl9jaGFuZ2VzVG9TeW5j
W2tleV07CisgIH0pCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorICBA
bW9kdWxlIGVtYmVyLWRhdGEKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldCwgc2V0UHJvcGVydGllcyA9IEVtYmVyLnNldFByb3BlcnRpZXM7CisKK2Z1bmN0aW9uIGFz
eW5jSGFzTWFueSh0eXBlLCBvcHRpb25zLCBtZXRhKSB7CisgIHJldHVybiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgdmFyIHJlbGF0aW9uc2hpcCA9IHRoaXMuX3Jl
bGF0aW9uc2hpcHNba2V5XSwKKyAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBBc3luYyBoYXNN
YW55ICIgKyB0aGlzICsgIiA6ICIgKyBrZXk7CisKKyAgICBpZiAoIXJlbGF0aW9uc2hpcCkgewor
ICAgICAgdmFyIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNlTGFiZWwpOworICAg
ICAgcmVsYXRpb25zaGlwID0gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBm
dW5jdGlvbihzdG9yZSwgZGF0YSkgeworICAgICAgICB2YXIgbGluayA9IGRhdGEubGlua3MgJiYg
ZGF0YS5saW5rc1trZXldOworICAgICAgICB2YXIgcmVsOworICAgICAgICBpZiAobGluaykgewor
ICAgICAgICAgIHJlbCA9IHN0b3JlLmZpbmRIYXNNYW55KHRoaXMsIGxpbmssIG1ldGEsIHJlc29s
dmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZWwgPSBzdG9yZS5maW5kTWFueSh0
aGlzLCBkYXRhW2tleV0sIG1ldGEudHlwZSwgcmVzb2x2ZXIpOworICAgICAgICB9CisgICAgICAg
IC8vIGNhY2hlIHRoZSBwcm9taXNlIHNvIHdlIGNhbiB1c2UgaXQKKyAgICAgICAgLy8gd2hlbiB3
ZSBjb21lIGJhY2sgYW5kIGRvbid0IG5lZWQgdG8gcmVidWlsZAorICAgICAgICAvLyB0aGUgcmVs
YXRpb25zaGlwLgorICAgICAgICBzZXQocmVsLCAncHJvbWlzZScsIHJlc29sdmVyLnByb21pc2Up
OworICAgICAgICByZXR1cm4gcmVsOworICAgICAgfSk7CisgICAgfQorCisgICAgdmFyIHByb21p
c2UgPSByZWxhdGlvbnNoaXAuZ2V0KCdwcm9taXNlJykudGhlbihmdW5jdGlvbigpIHsKKyAgICAg
IHJldHVybiByZWxhdGlvbnNoaXA7CisgICAgfSwgbnVsbCwgIkRTOiBBc3luYyBoYXNNYW55IHJl
Y29yZHMgcmVjZWl2ZWQiKTsKKworICAgIHJldHVybiBEUy5Qcm9taXNlQXJyYXkuY3JlYXRlKHsg
cHJvbWlzZTogcHJvbWlzZSB9KTsKKyAgfSkucHJvcGVydHkoJ2RhdGEnKS5tZXRhKG1ldGEpOwor
fQorCitmdW5jdGlvbiBidWlsZFJlbGF0aW9uc2hpcChyZWNvcmQsIGtleSwgb3B0aW9ucywgY2Fs
bGJhY2spIHsKKyAgdmFyIHJlbHMgPSByZWNvcmQuX3JlbGF0aW9uc2hpcHM7CisKKyAgaWYgKHJl
bHNba2V5XSkgeyByZXR1cm4gcmVsc1trZXldOyB9CisKKyAgdmFyIGRhdGEgPSBnZXQocmVjb3Jk
LCAnZGF0YScpLAorICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKKworICB2YXIg
cmVsYXRpb25zaGlwID0gcmVsc1trZXldID0gY2FsbGJhY2suY2FsbChyZWNvcmQsIHN0b3JlLCBk
YXRhKTsKKworICByZXR1cm4gc2V0UHJvcGVydGllcyhyZWxhdGlvbnNoaXAsIHsKKyAgICBvd25l
cjogcmVjb3JkLCBuYW1lOiBrZXksIGlzUG9seW1vcnBoaWM6IG9wdGlvbnMucG9seW1vcnBoaWMK
KyAgfSk7Cit9CisKK2Z1bmN0aW9uIGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKSB7Cisg
IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBp
c1JlbGF0aW9uc2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2hhc01hbnknIH07
CisKKyAgaWYgKG9wdGlvbnMuYXN5bmMpIHsKKyAgICByZXR1cm4gYXN5bmNIYXNNYW55KHR5cGUs
IG9wdGlvbnMsIG1ldGEpOworICB9CisKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBv
cHRpb25zLCBmdW5jdGlvbihzdG9yZSwgZGF0YSkgeworICAgICAgdmFyIHJlY29yZHMgPSBkYXRh
W2tleV07CisgICAgICBFbWJlci5hc3NlcnQoIllvdSBsb29rZWQgdXAgdGhlICciICsga2V5ICsg
IicgcmVsYXRpb25zaGlwIG9uICciICsgdGhpcyArICInIGJ1dCBzb21lIG9mIHRoZSBhc3NvY2lh
dGVkIHJlY29yZHMgd2VyZSBub3QgbG9hZGVkLiBFaXRoZXIgbWFrZSBzdXJlIHRoZXkgYXJlIGFs
bCBsb2FkZWQgdG9nZXRoZXIgd2l0aCB0aGUgcGFyZW50IHJlY29yZCwgb3Igc3BlY2lmeSB0aGF0
IHRoZSByZWxhdGlvbnNoaXAgaXMgYXN5bmMgKGBEUy5oYXNNYW55KHsgYXN5bmM6IHRydWUgfSlg
KSIsIEVtYmVyLkEocmVjb3JkcykuZXZlcnlQcm9wZXJ0eSgnaXNFbXB0eScsIGZhbHNlKSk7Cisg
ICAgICByZXR1cm4gc3RvcmUuZmluZE1hbnkodGhpcywgZGF0YVtrZXldLCBtZXRhLnR5cGUpOwor
ICAgIH0pOworICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Cit9CisKKy8qKgorICBg
RFMuaGFzTWFueWAgaXMgdXNlZCB0byBkZWZpbmUgT25lLVRvLU1hbnkgYW5kIE1hbnktVG8tTWFu
eQorICByZWxhdGlvbnNoaXBzIG9uIGEgW0RTLk1vZGVsXShEUy5Nb2RlbC5odG1sKS4KKworICBg
RFMuaGFzTWFueWAgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIs
IGN1cnJlbnRseQorICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6CisKKyAgLSBgYXN5bmNgOiBBIGJv
b2xlYW4gdmFsdWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3lu
YyByZWxhdGlvbnNoaXAuCisgIC0gYGludmVyc2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5
IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9uIGEgcmVsYXRlZCBtb2RlbC4KKworICAjIyMjIE9uZS1U
by1NYW55CisgIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0
d28gbW9kZWxzLCB1c2UKKyAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0aCBgRFMu
aGFzTWFueWAsIGxpa2UgdGhpczoKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5Qb3N0ID0gRFMu
TW9kZWwuZXh0ZW5kKHsKKyAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCisgIH0p
OworCisgIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBwb3N0OiBEUy5iZWxv
bmdzVG8oJ3Bvc3QnKQorICB9KTsKKyAgYGBgCisKKyAgIyMjIyBNYW55LVRvLU1hbnkKKyAgVG8g
ZGVjbGFyZSBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1
c2UKKyAgYERTLmhhc01hbnlgOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLlBvc3QgPSBEUy5N
b2RlbC5leHRlbmQoeworICAgIHRhZ3M6IERTLmhhc01hbnkoJ3RhZycpCisgIH0pOworCisgIEFw
cC5UYWcgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykK
KyAgfSk7CisgIGBgYAorCisgICMjIyMgRXhwbGljaXQgSW52ZXJzZXMKKworICBFbWJlciBEYXRh
IHdpbGwgZG8gaXRzIGJlc3QgdG8gZGlzY292ZXIgd2hpY2ggcmVsYXRpb25zaGlwcyBtYXAgdG8K
KyAgb25lIGFub3RoZXIuIEluIHRoZSBvbmUtdG8tbWFueSBjb2RlIGFib3ZlLCBmb3IgZXhhbXBs
ZSwgRW1iZXIgRGF0YQorICBjYW4gZmlndXJlIG91dCB0aGF0IGNoYW5naW5nIHRoZSBgY29tbWVu
dHNgIHJlbGF0aW9uc2hpcCBzaG91bGQgdXBkYXRlCisgIHRoZSBgcG9zdGAgcmVsYXRpb25zaGlw
IG9uIHRoZSBpbnZlcnNlIGJlY2F1c2UgcG9zdCBpcyB0aGUgb25seQorICByZWxhdGlvbnNoaXAg
dG8gdGhhdCBtb2RlbC4KKworICBIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSBoYXZlIG11bHRp
cGxlIGBiZWxvbmdzVG9gL2BoYXNNYW55c2AgZm9yIHRoZQorICBzYW1lIHR5cGUuIFlvdSBjYW4g
c3BlY2lmeSB3aGljaCBwcm9wZXJ0eSBvbiB0aGUgcmVsYXRlZCBtb2RlbCBpcworICB0aGUgaW52
ZXJzZSB1c2luZyBgRFMuaGFzTWFueWAncyBgaW52ZXJzZWAgb3B0aW9uOgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgdmFyIGJlbG9uZ3NUbyA9IERTLmJlbG9uZ3NUbywKKyAgICAgIGhhc01hbnkgPSBE
Uy5oYXNNYW55OworCisgIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBvbmVQ
b3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKKyAgICB0d29Qb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwK
KyAgICByZWRQb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKKyAgICBibHVlUG9zdDogYmVsb25nc1Rv
KCdwb3N0JykKKyAgfSk7CisKKyAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgIGNv
bW1lbnRzOiBoYXNNYW55KCdjb21tZW50JywgeworICAgICAgaW52ZXJzZTogJ3JlZFBvc3QnCisg
ICAgfSkKKyAgfSk7CisgIGBgYAorCisgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGludmVyc2Ug
b24gYSBgYmVsb25nc1RvYCwgd2hpY2ggd29ya3MgaG93CisgIHlvdSdkIGV4cGVjdC4KKworICBA
bmFtZXNwYWNlCisgIEBtZXRob2QgaGFzTWFueQorICBAZm9yIERTCisgIEBwYXJhbSB7U3RyaW5n
IG9yIERTLk1vZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKKyAg
QHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlvbnMKKyAgQHJldHVybiB7RW1i
ZXIuY29tcHV0ZWR9IHJlbGF0aW9uc2hpcAorKi8KK0RTLmhhc01hbnkgPSBmdW5jdGlvbih0eXBl
LCBvcHRpb25zKSB7CisgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHsKKyAgICBvcHRp
b25zID0gdHlwZTsKKyAgICB0eXBlID0gdW5kZWZpbmVkOworICB9CisgIHJldHVybiBoYXNSZWxh
dGlvbnNoaXAodHlwZSwgb3B0aW9ucyk7Cit9OworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkg
ewordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworCisvKioKKyAgQG1vZHVs
ZSBlbWJlci1kYXRhCisqLworCisvKgorICBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIGV4dGVu
c2lvbnMgdG8gdGhlIGJhc2UgYERTLk1vZGVsYCBjbGFzcyB0aGF0CisgIGFkZCBzdXBwb3J0IGZv
ciBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXBzLgorKi8KKworLyoqCisgIEBjbGFzcyBNb2RlbAor
ICBAbmFtZXNwYWNlIERTCisqLworRFMuTW9kZWwucmVvcGVuKHsKKworICAvKioKKyAgICBUaGlz
IEVtYmVyLmpzIGhvb2sgYWxsb3dzIGFuIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGEgcHJv
cGVydHkKKyAgICBpcyBkZWZpbmVkLgorCisgICAgSW4gdGhpcyBjYXNlLCB3ZSB1c2UgaXQgdG8g
YmUgbm90aWZpZWQgd2hlbiBhbiBFbWJlciBEYXRhIHVzZXIgZGVmaW5lcyBhCisgICAgYmVsb25n
cy10byByZWxhdGlvbnNoaXAuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBzZXQgdXAgb2JzZXJ2
ZXJzIGZvcgorICAgIGVhY2ggb25lLCBhbGxvd2luZyB1cyB0byB0cmFjayByZWxhdGlvbnNoaXAg
Y2hhbmdlcyBhbmQgYXV0b21hdGljYWxseQorICAgIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgaW52
ZXJzZSBoYXMtbWFueSBhcnJheS4KKworICAgIFRoaXMgaG9vayBwYXNzZXMgdGhlIGNsYXNzIGJl
aW5nIHNldCB1cCwgYXMgd2VsbCBhcyB0aGUga2V5IGFuZCB2YWx1ZQorICAgIGJlaW5nIGRlZmlu
ZWQuIFNvLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlciBkb2VzIHRoaXM6CisKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgIHBhcmVudDogRFMuYmVsb25n
c1RvKCd1c2VyJykKKyAgICB9KTsKKyAgICBgYGAKKworICAgIFRoaXMgaG9vayB3b3VsZCBiZSBj
YWxsZWQgd2l0aCAicGFyZW50IiBhcyB0aGUga2V5IGFuZCB0aGUgY29tcHV0ZWQKKyAgICBwcm9w
ZXJ0eSByZXR1cm5lZCBieSBgRFMuYmVsb25nc1RvYCBhcyB0aGUgdmFsdWUuCisKKyAgICBAbWV0
aG9kIGRpZERlZmluZVByb3BlcnR5CisgICAgQHBhcmFtIHByb3RvCisgICAgQHBhcmFtIGtleQor
ICAgIEBwYXJhbSB2YWx1ZQorICAqLworICBkaWREZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24ocHJv
dG8sIGtleSwgdmFsdWUpIHsKKyAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgYmVpbmcgc2V0IGlz
IGEgY29tcHV0ZWQgcHJvcGVydHkuCisgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRW1iZXIuRGVz
Y3JpcHRvcikgeworCisgICAgICAvLyBJZiBpdCBpcywgZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhl
IHJlbGF0aW9uc2hpcC4gVGhpcyBpcworICAgICAgLy8gcG9wdWxhdGVkIGJ5IHRoZSBgRFMuYmVs
b25nc1RvYCBoZWxwZXIgd2hlbiBpdCBpcyBjcmVhdGluZworICAgICAgLy8gdGhlIGNvbXB1dGVk
IHByb3BlcnR5LgorICAgICAgdmFyIG1ldGEgPSB2YWx1ZS5tZXRhKCk7CisKKyAgICAgIGlmICht
ZXRhLmlzUmVsYXRpb25zaGlwICYmIG1ldGEua2luZCA9PT0gJ2JlbG9uZ3NUbycpIHsKKyAgICAg
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2JlbG9uZ3NUb0RpZENoYW5n
ZScpOworICAgICAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcihwcm90bywga2V5LCBudWxsLCAn
YmVsb25nc1RvV2lsbENoYW5nZScpOworICAgICAgfQorCisgICAgICBtZXRhLnBhcmVudFR5cGUg
PSBwcm90by5jb25zdHJ1Y3RvcjsKKyAgICB9CisgIH0KK30pOworCisvKgorICBUaGVzZSBEUy5N
b2RlbCBleHRlbnNpb25zIGFkZCBjbGFzcyBtZXRob2RzIHRoYXQgcHJvdmlkZSByZWxhdGlvbnNo
aXAKKyAgaW50cm9zcGVjdGlvbiBhYmlsaXRpZXMgYWJvdXQgcmVsYXRpb25zaGlwcy4KKworICBB
IG5vdGUgYWJvdXQgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgY29udGFpbmVkIGhlcmU6CisKKyAg
KipUaGVzZSBwcm9wZXJ0aWVzIGFyZSBlZmZlY3RpdmVseSBzZWFsZWQgb25jZSBjYWxsZWQgZm9y
IHRoZSBmaXJzdCB0aW1lLioqCisgIFRvIGF2b2lkIHJlcGVhdGVkbHkgZG9pbmcgZXhwZW5zaXZl
IGl0ZXJhdGlvbiBvdmVyIGEgbW9kZWwncyBmaWVsZHMsIHRoZXNlCisgIHZhbHVlcyBhcmUgY29t
cHV0ZWQgb25jZSBhbmQgdGhlbiBjYWNoZWQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJ1bnRp
bWUgb2YKKyAgeW91ciBhcHBsaWNhdGlvbi4KKworICBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRz
IHRvIG1vZGlmeSBhIGNsYXNzIGFmdGVyIGl0cyBpbml0aWFsIGRlZmluaXRpb24KKyAgKGZvciBl
eGFtcGxlLCB1c2luZyBgcmVvcGVuKClgIHRvIGFkZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMpLCBt
YWtlIHN1cmUgeW91CisgIGRvIGl0IGJlZm9yZSB1c2luZyB5b3VyIG1vZGVsIHdpdGggdGhlIHN0
b3JlLCB3aGljaCB1c2VzIHRoZXNlIHByb3BlcnRpZXMKKyAgZXh0ZW5zaXZlbHkuCisqLworCitE
Uy5Nb2RlbC5yZW9wZW5DbGFzcyh7CisgIC8qKgorICAgIEZvciBhIGdpdmVuIHJlbGF0aW9uc2hp
cCBuYW1lLCByZXR1cm5zIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAuCisKKyAg
ICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIG1vZGVsIGxpa2UgdGhpczoKKworICAgYGBg
amF2YXNjcmlwdAorICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICAgIGNvbW1l
bnRzOiBEUy5oYXNNYW55KCdjb21tZW50JykKKyAgICB9KTsKKyAgIGBgYAorCisgICAgQ2FsbGlu
ZyBgQXBwLlBvc3QudHlwZUZvclJlbGF0aW9uc2hpcCgnY29tbWVudHMnKWAgd2lsbCByZXR1cm4g
YEFwcC5Db21tZW50YC4KKworICAgIEBtZXRob2QgdHlwZUZvclJlbGF0aW9uc2hpcAorICAgIEBz
dGF0aWMKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25z
aGlwCisgICAgQHJldHVybiB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHRoZSB0eXBlIG9mIHRoZSBy
ZWxhdGlvbnNoaXAsIG9yIHVuZGVmaW5lZAorICAqLworICB0eXBlRm9yUmVsYXRpb25zaGlwOiBm
dW5jdGlvbihuYW1lKSB7CisgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldCh0aGlzLCAncmVsYXRp
b25zaGlwc0J5TmFtZScpLmdldChuYW1lKTsKKyAgICByZXR1cm4gcmVsYXRpb25zaGlwICYmIHJl
bGF0aW9uc2hpcC50eXBlOworICB9LAorCisgIGludmVyc2VGb3I6IGZ1bmN0aW9uKG5hbWUpIHsK
KyAgICB2YXIgaW52ZXJzZVR5cGUgPSB0aGlzLnR5cGVGb3JSZWxhdGlvbnNoaXAobmFtZSk7CisK
KyAgICBpZiAoIWludmVyc2VUeXBlKSB7IHJldHVybiBudWxsOyB9CisKKyAgICB2YXIgb3B0aW9u
cyA9IHRoaXMubWV0YUZvclByb3BlcnR5KG5hbWUpLm9wdGlvbnM7CisKKyAgICBpZiAob3B0aW9u
cy5pbnZlcnNlID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9CisKKyAgICB2YXIgaW52ZXJzZU5h
bWUsIGludmVyc2VLaW5kOworCisgICAgaWYgKG9wdGlvbnMuaW52ZXJzZSkgeworICAgICAgaW52
ZXJzZU5hbWUgPSBvcHRpb25zLmludmVyc2U7CisgICAgICBpbnZlcnNlS2luZCA9IEVtYmVyLmdl
dChpbnZlcnNlVHlwZSwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5nZXQoaW52ZXJzZU5hbWUpLmtp
bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBwb3NzaWJsZVJlbGF0aW9uc2hpcHMgPSBmaW5k
UG9zc2libGVJbnZlcnNlcyh0aGlzLCBpbnZlcnNlVHlwZSk7CisKKyAgICAgIGlmIChwb3NzaWJs
ZVJlbGF0aW9uc2hpcHMubGVuZ3RoID09PSAwKSB7IHJldHVybiBudWxsOyB9CisKKyAgICAgIEVt
YmVyLmFzc2VydCgiWW91IGRlZmluZWQgdGhlICciICsgbmFtZSArICInIHJlbGF0aW9uc2hpcCBv
biAiICsgdGhpcyArICIsIGJ1dCBtdWx0aXBsZSBwb3NzaWJsZSBpbnZlcnNlIHJlbGF0aW9uc2hp
cHMgb2YgdHlwZSAiICsgdGhpcyArICIgd2VyZSBmb3VuZCBvbiAiICsgaW52ZXJzZVR5cGUgKyAi
LiBMb29rIGF0IGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvbW9kZWxzL2RlZmluaW5nLW1vZGVs
cy8jdG9jX2V4cGxpY2l0LWludmVyc2VzIGZvciBob3cgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGlu
dmVyc2VzIiwgcG9zc2libGVSZWxhdGlvbnNoaXBzLmxlbmd0aCA9PT0gMSk7CisKKyAgICAgIGlu
dmVyc2VOYW1lID0gcG9zc2libGVSZWxhdGlvbnNoaXBzWzBdLm5hbWU7CisgICAgICBpbnZlcnNl
S2luZCA9IHBvc3NpYmxlUmVsYXRpb25zaGlwc1swXS5raW5kOworICAgIH0KKworICAgIGZ1bmN0
aW9uIGZpbmRQb3NzaWJsZUludmVyc2VzKHR5cGUsIGludmVyc2VUeXBlLCBwb3NzaWJsZVJlbGF0
aW9uc2hpcHMpIHsKKyAgICAgIHBvc3NpYmxlUmVsYXRpb25zaGlwcyA9IHBvc3NpYmxlUmVsYXRp
b25zaGlwcyB8fCBbXTsKKworICAgICAgdmFyIHJlbGF0aW9uc2hpcE1hcCA9IGdldChpbnZlcnNl
VHlwZSwgJ3JlbGF0aW9uc2hpcHMnKTsKKyAgICAgIGlmICghcmVsYXRpb25zaGlwTWFwKSB7IHJl
dHVybjsgfQorCisgICAgICB2YXIgcmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcE1hcC5nZXQo
dHlwZSk7CisgICAgICBpZiAocmVsYXRpb25zaGlwcykgeworICAgICAgICBwb3NzaWJsZVJlbGF0
aW9uc2hpcHMucHVzaC5hcHBseShwb3NzaWJsZVJlbGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcE1h
cC5nZXQodHlwZSkpOworICAgICAgfQorCisgICAgICBpZiAodHlwZS5zdXBlcmNsYXNzKSB7Cisg
ICAgICAgIGZpbmRQb3NzaWJsZUludmVyc2VzKHR5cGUuc3VwZXJjbGFzcywgaW52ZXJzZVR5cGUs
IHBvc3NpYmxlUmVsYXRpb25zaGlwcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBwb3NzaWJs
ZVJlbGF0aW9uc2hpcHM7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHR5cGU6IGludmVy
c2VUeXBlLAorICAgICAgbmFtZTogaW52ZXJzZU5hbWUsCisgICAgICBraW5kOiBpbnZlcnNlS2lu
ZAorICAgIH07CisgIH0sCisKKyAgLyoqCisgICAgVGhlIG1vZGVsJ3MgcmVsYXRpb25zaGlwcyBh
cyBhIG1hcCwga2V5ZWQgb24gdGhlIHR5cGUgb2YgdGhlCisgICAgcmVsYXRpb25zaGlwLiBUaGUg
dmFsdWUgb2YgZWFjaCBlbnRyeSBpcyBhbiBhcnJheSBjb250YWluaW5nIGEgZGVzY3JpcHRvcgor
ICAgIGZvciBlYWNoIHJlbGF0aW9uc2hpcCB3aXRoIHRoYXQgdHlwZSwgZGVzY3JpYmluZyB0aGUg
bmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCisgICAgYXMgd2VsbCBhcyB0aGUgdHlwZS4KKworICAg
IEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1vZGVsIGRlZmluaXRpb246CisKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoeworICAgICAg
dXNlcnM6IERTLmhhc01hbnkoJ3VzZXInKSwKKyAgICAgIG93bmVyOiBEUy5iZWxvbmdzVG8oJ3Vz
ZXInKSwKKyAgICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKKyAgICB9KTsKKyAgICBgYGAK
KworICAgIFRoaXMgY29tcHV0ZWQgcHJvcGVydHkgd291bGQgcmV0dXJuIGEgbWFwIGRlc2NyaWJp
bmcgdGhlc2UKKyAgICByZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM6CisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdyZWxhdGlv
bnNoaXBzJyk7CisgICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlVzZXIpOworICAgIC8vPT4gWyB7
IG5hbWU6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAorICAgIC8vICAgICB7IG5hbWU6ICdv
d25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nIH0gXQorICAgIHJlbGF0aW9uc2hpcHMuZ2V0KEFwcC5Q
b3N0KTsKKyAgICAvLz0+IFsgeyBuYW1lOiAncG9zdHMnLCBraW5kOiAnaGFzTWFueScgfSBdCisg
ICAgYGBgCisKKyAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwcworICAgIEBzdGF0aWMKKyAgICBA
dHlwZSBFbWJlci5NYXAKKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgcmVsYXRpb25zaGlwczogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIG1hcCA9IG5ldyBFbWJlci5NYXBXaXRo
RGVmYXVsdCh7CisgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0K
KyAgICB9KTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGNvbXB1dGVkIHByb3BlcnR5IG9u
IHRoZSBjbGFzcworICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwg
bWV0YSkgeworCisgICAgICAvLyBJZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgYSByZWxhdGlv
bnNoaXAsIGFkZAorICAgICAgLy8gaXQgdG8gdGhlIG1hcC4KKyAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwKSB7CisgICAgICAgIGlmICh0eXBlb2YgbWV0YS50eXBlID09PSAnc3RyaW5nJykg
eworICAgICAgICAgIG1ldGEudHlwZSA9IHRoaXMuc3RvcmUubW9kZWxGb3IobWV0YS50eXBlKTsK
KyAgICAgICAgfQorCisgICAgICAgIHZhciByZWxhdGlvbnNoaXBzRm9yVHlwZSA9IG1hcC5nZXQo
bWV0YS50eXBlKTsKKworICAgICAgICByZWxhdGlvbnNoaXBzRm9yVHlwZS5wdXNoKHsgbmFtZTog
bmFtZSwga2luZDogbWV0YS5raW5kIH0pOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJu
IG1hcDsKKyAgfSksCisKKyAgLyoqCisgICAgQSBoYXNoIGNvbnRhaW5pbmcgbGlzdHMgb2YgdGhl
IG1vZGVsJ3MgcmVsYXRpb25zaGlwcywgZ3JvdXBlZAorICAgIGJ5IHRoZSByZWxhdGlvbnNoaXAg
a2luZC4gRm9yIGV4YW1wbGUsIGdpdmVuIGEgbW9kZWwgd2l0aCB0aGlzCisgICAgZGVmaW5pdGlv
bjoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7
CisgICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAorICAgICAgb3duZXI6IERTLmJlbG9u
Z3NUbygndXNlcicpLAorCisgICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCisgICAgfSk7
CisgICAgYGBgCisKKyAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2lu
ZzoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcmVsYXRpb25zaGlwTmFtZXMgPSBFbWJl
ci5nZXQoQXBwLkJsb2csICdyZWxhdGlvbnNoaXBOYW1lcycpOworICAgIHJlbGF0aW9uc2hpcE5h
bWVzLmhhc01hbnk7CisgICAgLy89PiBbJ3VzZXJzJywgJ3Bvc3RzJ10KKyAgICByZWxhdGlvbnNo
aXBOYW1lcy5iZWxvbmdzVG87CisgICAgLy89PiBbJ293bmVyJ10KKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSByZWxhdGlvbnNoaXBOYW1lcworICAgIEBzdGF0aWMKKyAgICBAdHlwZSBPYmplY3QK
KyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgcmVsYXRpb25zaGlwTmFtZXM6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgeworICAgIHZhciBuYW1lcyA9IHsgaGFzTWFueTogW10sIGJlbG9uZ3NUbzog
W10gfTsKKworICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0
YSkgeworICAgICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgbmFtZXNbbWV0
YS5raW5kXS5wdXNoKG5hbWUpOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIG5hbWVz
OworICB9KSwKKworICAvKioKKyAgICBBbiBhcnJheSBvZiB0eXBlcyBkaXJlY3RseSByZWxhdGVk
IHRvIGEgbW9kZWwuIEVhY2ggdHlwZSB3aWxsIGJlCisgICAgaW5jbHVkZWQgb25jZSwgcmVnYXJk
bGVzcyBvZiB0aGUgbnVtYmVyIG9mIHJlbGF0aW9uc2hpcHMgaXQgaGFzIHdpdGgKKyAgICB0aGUg
bW9kZWwuCisKKyAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMgZGVmaW5p
dGlvbjoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVu
ZCh7CisgICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAorICAgICAgb3duZXI6IERTLmJl
bG9uZ3NUbygndXNlcicpLAorCisgICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCisgICAg
fSk7CisgICAgYGBgCisKKyAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxv
d2luZzoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcmVsYXRlZFR5cGVzID0gRW1iZXIu
Z2V0KEFwcC5CbG9nLCAncmVsYXRlZFR5cGVzJyk7CisgICAgLy89PiBbIEFwcC5Vc2VyLCBBcHAu
UG9zdCBdCisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgcmVsYXRlZFR5cGVzCisgICAgQHN0YXRp
YworICAgIEB0eXBlIEVtYmVyLkFycmF5CisgICAgQHJlYWRPbmx5CisgICovCisgIHJlbGF0ZWRU
eXBlczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIHR5cGUsCisgICAgICAg
IHR5cGVzID0gRW1iZXIuQSgpOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY29tcHV0ZWQg
cHJvcGVydHkgb24gdGhlIGNsYXNzLAorICAgIC8vIGFuZCBjcmVhdGUgYW4gYXJyYXkgb2YgdGhl
IHVuaXF1ZSB0eXBlcyBpbnZvbHZlZAorICAgIC8vIGluIHJlbGF0aW9uc2hpcHMKKyAgICB0aGlz
LmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKKyAgICAgIGlmICht
ZXRhLmlzUmVsYXRpb25zaGlwKSB7CisgICAgICAgIHR5cGUgPSBtZXRhLnR5cGU7CisKKyAgICAg
ICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgeworICAgICAgICAgIHR5cGUgPSBnZXQo
dGhpcywgdHlwZSwgZmFsc2UpIHx8IHRoaXMuc3RvcmUubW9kZWxGb3IodHlwZSk7CisgICAgICAg
IH0KKworICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgYSBoYXNNYW55ICgiICsg
bWV0YS50eXBlICsgIikgb24gIiArIG1ldGEucGFyZW50VHlwZSArICIgYnV0ICIgKyBtZXRhLnR5
cGUgKyAiIHdhcyBub3QgZm91bmQuIiwgIHR5cGUpOworCisgICAgICAgIGlmICghdHlwZXMuY29u
dGFpbnModHlwZSkpIHsKKyAgICAgICAgICBFbWJlci5hc3NlcnQoIlRyeWluZyB0byBzaWRlbG9h
ZCAiICsgbmFtZSArICIgb24gIiArIHRoaXMudG9TdHJpbmcoKSArICIgYnV0IHRoZSB0eXBlIGRv
ZXNuJ3QgZXhpc3QuIiwgISF0eXBlKTsKKyAgICAgICAgICB0eXBlcy5wdXNoKHR5cGUpOworICAg
ICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gdHlwZXM7CisgIH0pLAorCisg
IC8qKgorICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSByZWxhdGlvbnNoaXBzIG9mIGEgbW9k
ZWwgYW5kIHdob3NlIHZhbHVlcyBhcmUKKyAgICByZWxhdGlvbnNoaXAgZGVzY3JpcHRvcnMuCisK
KyAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMKKyAgICBkZWZpbml0aW9u
OgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsK
KyAgICAgIHVzZXJzOiBEUy5oYXNNYW55KCd1c2VyJyksCisgICAgICBvd25lcjogRFMuYmVsb25n
c1RvKCd1c2VyJyksCisKKyAgICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKKyAgICB9KTsK
KyAgICBgYGAKKworICAgIFRoaXMgcHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5n
OgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciByZWxhdGlvbnNoaXBzQnlOYW1lID0gRW1i
ZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRpb25zaGlwc0J5TmFtZScpOworICAgIHJlbGF0aW9uc2hp
cHNCeU5hbWUuZ2V0KCd1c2VycycpOworICAgIC8vPT4geyBrZXk6ICd1c2VycycsIGtpbmQ6ICdo
YXNNYW55JywgdHlwZTogQXBwLlVzZXIgfQorICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCdv
d25lcicpOworICAgIC8vPT4geyBrZXk6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nLCB0eXBl
OiBBcHAuVXNlciB9CisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwc0J5TmFt
ZQorICAgIEBzdGF0aWMKKyAgICBAdHlwZSBFbWJlci5NYXAKKyAgICBAcmVhZE9ubHkKKyAgKi8K
KyAgcmVsYXRpb25zaGlwc0J5TmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAg
dmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKKworICAgIHRoaXMuZWFjaENvbXB1
dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgeworICAgICAgaWYgKG1ldGEuaXNSZWxh
dGlvbnNoaXApIHsKKyAgICAgICAgbWV0YS5rZXkgPSBuYW1lOworICAgICAgICB0eXBlID0gbWV0
YS50eXBlOworCisgICAgICAgIGlmICghdHlwZSAmJiBtZXRhLmtpbmQgPT09ICdoYXNNYW55Jykg
eworICAgICAgICAgIHR5cGUgPSBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUobmFtZSk7CisgICAg
ICAgIH0gZWxzZSBpZiAoIXR5cGUpIHsKKyAgICAgICAgICB0eXBlID0gbmFtZTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICBt
ZXRhLnR5cGUgPSB0aGlzLnN0b3JlLm1vZGVsRm9yKHR5cGUpOworICAgICAgICB9CisKKyAgICAg
ICAgbWFwLnNldChuYW1lLCBtZXRhKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBt
YXA7CisgIH0pLAorCisgIC8qKgorICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSBmaWVsZHMg
b2YgdGhlIG1vZGVsIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHN0cmluZ3MKKyAgICBkZXNjcmliaW5n
IHRoZSBraW5kIG9mIHRoZSBmaWVsZC4gQSBtb2RlbCdzIGZpZWxkcyBhcmUgdGhlIHVuaW9uIG9m
IGFsbCBvZiBpdHMKKyAgICBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzLgorCisgICAgRm9y
IGV4YW1wbGU6CisKKyAgICBgYGBqYXZhc2NyaXB0CisKKyAgICBBcHAuQmxvZyA9IERTLk1vZGVs
LmV4dGVuZCh7CisgICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAorICAgICAgb3duZXI6
IERTLmJlbG9uZ3NUbygndXNlcicpLAorCisgICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcp
LAorCisgICAgICB0aXRsZTogRFMuYXR0cignc3RyaW5nJykKKyAgICB9KTsKKworICAgIHZhciBm
aWVsZHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdmaWVsZHMnKTsKKyAgICBmaWVsZHMuZm9yRWFj
aChmdW5jdGlvbihmaWVsZCwga2luZCkgeworICAgICAgY29uc29sZS5sb2coZmllbGQsIGtpbmQp
OworICAgIH0pOworCisgICAgLy8gcHJpbnRzOgorICAgIC8vIHVzZXJzLCBoYXNNYW55CisgICAg
Ly8gb3duZXIsIGJlbG9uZ3NUbworICAgIC8vIHBvc3RzLCBoYXNNYW55CisgICAgLy8gdGl0bGUs
IGF0dHJpYnV0ZQorICAgIGBgYAorCisgICAgQHByb3BlcnR5IGZpZWxkcworICAgIEBzdGF0aWMK
KyAgICBAdHlwZSBFbWJlci5NYXAKKyAgICBAcmVhZE9ubHkKKyAgKi8KKyAgZmllbGRzOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgp
OworCisgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRhKSB7
CisgICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgeworICAgICAgICBtYXAuc2V0KG5hbWUs
IG1ldGEua2luZCk7CisgICAgICB9IGVsc2UgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsKKyAgICAg
ICAgbWFwLnNldChuYW1lLCAnYXR0cmlidXRlJyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBy
ZXR1cm4gbWFwOworICB9KSwKKworICAvKioKKyAgICBHaXZlbiBhIGNhbGxiYWNrLCBpdGVyYXRl
cyBvdmVyIGVhY2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIG1vZGVsLAorICAgIGludm9r
aW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBuYW1lIG9mIGVhY2ggcmVsYXRpb25zaGlwIGFuZCBp
dHMgcmVsYXRpb25zaGlwCisgICAgZGVzY3JpcHRvci4KKworICAgIEBtZXRob2QgZWFjaFJlbGF0
aW9uc2hpcAorICAgIEBzdGF0aWMKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUg
Y2FsbGJhY2sgdG8gaW52b2tlCisgICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRv
IHdoaWNoIHRoZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKKyAgKi8KKyAgZWFj
aFJlbGF0aW9uc2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICBnZXQodGhp
cywgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9u
c2hpcCkgeworICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBuYW1lLCByZWxhdGlvbnNoaXAp
OworICAgIH0pOworICB9LAorCisgIC8qKgorICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVz
IG92ZXIgZWFjaCBvZiB0aGUgdHlwZXMgcmVsYXRlZCB0byBhIG1vZGVsLAorICAgIGludm9raW5n
IHRoZSBjYWxsYmFjayB3aXRoIHRoZSByZWxhdGVkIHR5cGUncyBjbGFzcy4gRWFjaCB0eXBlIHdp
bGwgYmUKKyAgICByZXR1cm5lZCBqdXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZGlm
ZmVyZW50IHJlbGF0aW9uc2hpcHMgaXQgaGFzCisgICAgd2l0aCBhIG1vZGVsLgorCisgICAgQG1l
dGhvZCBlYWNoUmVsYXRlZFR5cGUKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIHtGdW5jdGlvbn0g
Y2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQorICAgIEBwYXJhbSB7YW55fSBiaW5kaW5n
IHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5k
CisgICovCisgIGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsK
KyAgICBnZXQodGhpcywgJ3JlbGF0ZWRUeXBlcycpLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewor
ICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCB0eXBlKTsKKyAgICB9KTsKKyAgfQorfSk7CisK
K0RTLk1vZGVsLnJlb3Blbih7CisgIC8qKgorICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVz
IG92ZXIgZWFjaCBvZiB0aGUgcmVsYXRpb25zaGlwcyBpbiB0aGUgbW9kZWwsCisgICAgaW52b2tp
bmcgdGhlIGNhbGxiYWNrIHdpdGggdGhlIG5hbWUgb2YgZWFjaCByZWxhdGlvbnNoaXAgYW5kIGl0
cyByZWxhdGlvbnNoaXAKKyAgICBkZXNjcmlwdG9yLgorCisgICAgQG1ldGhvZCBlYWNoUmVsYXRp
b25zaGlwCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGlu
dm9rZQorICAgIEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2Fs
bGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5kCisgICovCisgIGVhY2hSZWxhdGlvbnNoaXA6
IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNo
UmVsYXRpb25zaGlwKGNhbGxiYWNrLCBiaW5kaW5nKTsKKyAgfQorfSk7CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFy
IGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwordmFyIGZvckVhY2ggPSBFbWJlci5F
bnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKKworLyoqCisgIEBjbGFzcyBSZWNvcmRBcnJheU1hbmFn
ZXIKKyAgQG5hbWVzcGFjZSBEUworICBAcHJpdmF0ZQorICBAZXh0ZW5kcyBFbWJlci5PYmplY3QK
KyovCitEUy5SZWNvcmRBcnJheU1hbmFnZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgaW5p
dDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5maWx0ZXJlZFJlY29yZEFycmF5cyA9IEVtYmVyLk1h
cFdpdGhEZWZhdWx0LmNyZWF0ZSh7CisgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyBy
ZXR1cm4gW107IH0KKyAgICB9KTsKKworICAgIHRoaXMuY2hhbmdlZFJlY29yZHMgPSBbXTsKKyAg
fSwKKworICByZWNvcmREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIGlmICh0aGlz
LmNoYW5nZWRSZWNvcmRzLnB1c2gocmVjb3JkKSAhPT0gMSkgeyByZXR1cm47IH0KKworICAgIEVt
YmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlz
KTsKKyAgfSwKKworICByZWNvcmRBcnJheXNGb3JSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewor
ICAgIHJlY29yZC5fcmVjb3JkQXJyYXlzID0gcmVjb3JkLl9yZWNvcmRBcnJheXMgfHwgRW1iZXIu
T3JkZXJlZFNldC5jcmVhdGUoKTsKKyAgICByZXR1cm4gcmVjb3JkLl9yZWNvcmRBcnJheXM7Cisg
IH0sCisKKyAgLyoqCisgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuZXZlciBkYXRhIGlz
IGxvYWRlZCBpbnRvIHRoZSBzdG9yZSBieSB0aGUKKyAgICBhZGFwdGVyIG9yIHVwZGF0ZWQgYnkg
dGhlIGFkYXB0ZXIsIG9yIHdoZW4gYSByZWNvcmQgaGFzIGNoYW5nZWQuCisKKyAgICBJdCB1cGRh
dGVzIGFsbCByZWNvcmQgYXJyYXlzIHRoYXQgYSByZWNvcmQgYmVsb25ncyB0by4KKworICAgIFRv
IGF2b2lkIHRocmFzaGluZywgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZSBwZXIgcnVuIGxvb3Au
CisKKyAgICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5cworICAgIEBwYXJhbSB7Q2xhc3N9IHR5
cGUKKyAgICBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGNsaWVudElkCisgICovCisgIHVwZGF0ZVJl
Y29yZEFycmF5czogZnVuY3Rpb24oKSB7CisgICAgZm9yRWFjaCh0aGlzLmNoYW5nZWRSZWNvcmRz
LCBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAgIGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykp
IHsKKyAgICAgICAgdGhpcy5fcmVjb3JkV2FzRGVsZXRlZChyZWNvcmQpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgdGhpcy5fcmVjb3JkV2FzQ2hhbmdlZChyZWNvcmQpOworICAgICAgfQorICAg
IH0sIHRoaXMpOworCisgICAgdGhpcy5jaGFuZ2VkUmVjb3Jkcy5sZW5ndGggPSAwOworICB9LAor
CisgIF9yZWNvcmRXYXNEZWxldGVkOiBmdW5jdGlvbiAocmVjb3JkKSB7CisgICAgdmFyIHJlY29y
ZEFycmF5cyA9IHJlY29yZC5fcmVjb3JkQXJyYXlzOworCisgICAgaWYgKCFyZWNvcmRBcnJheXMp
IHsgcmV0dXJuOyB9CisKKyAgICBmb3JFYWNoKHJlY29yZEFycmF5cywgZnVuY3Rpb24oYXJyYXkp
IHsKKyAgICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOworICAgIH0pOworICB9LAorCisg
IF9yZWNvcmRXYXNDaGFuZ2VkOiBmdW5jdGlvbiAocmVjb3JkKSB7CisgICAgdmFyIHR5cGUgPSBy
ZWNvcmQuY29uc3RydWN0b3IsCisgICAgICAgIHJlY29yZEFycmF5cyA9IHRoaXMuZmlsdGVyZWRS
ZWNvcmRBcnJheXMuZ2V0KHR5cGUpLAorICAgICAgICBmaWx0ZXI7CisKKyAgICBmb3JFYWNoKHJl
Y29yZEFycmF5cywgZnVuY3Rpb24oYXJyYXkpIHsKKyAgICAgIGZpbHRlciA9IGdldChhcnJheSwg
J2ZpbHRlckZ1bmN0aW9uJyk7CisgICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBm
aWx0ZXIsIHR5cGUsIHJlY29yZCk7CisgICAgfSwgdGhpcyk7CisKKyAgICAvLyBsb29wIHRocm91
Z2ggYWxsIG1hbnlBcnJheXMgY29udGFpbmluZyBhbiB1bmxvYWRlZCBjb3B5IG9mIHRoaXMKKyAg
ICAvLyBjbGllbnRJZCBhbmQgbm90aWZ5IHRoZW0gdGhhdCB0aGUgcmVjb3JkIHdhcyBsb2FkZWQu
CisgICAgdmFyIG1hbnlBcnJheXMgPSByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXM7CisKKyAg
ICBpZiAobWFueUFycmF5cykgeworICAgICAgZm9yICh2YXIgaT0wLCBsPW1hbnlBcnJheXMubGVu
Z3RoOyBpPGw7IGkrKykgeworICAgICAgICBtYW55QXJyYXlzW2ldLmxvYWRlZFJlY29yZCgpOwor
ICAgICAgfQorCisgICAgICByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXMgPSBbXTsKKyAgICB9
CisgIH0sCisKKyAgLyoqCisgICAgVXBkYXRlIGFuIGluZGl2aWR1YWwgZmlsdGVyLgorCisgICAg
QG1ldGhvZCB1cGRhdGVSZWNvcmRBcnJheQorICAgIEBwYXJhbSB7RFMuRmlsdGVyZWRSZWNvcmRB
cnJheX0gYXJyYXkKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKKyAgICBAcGFyYW0ge0Ns
YXNzfSB0eXBlCisgICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJZAorICAqLworICB1
cGRhdGVSZWNvcmRBcnJheTogZnVuY3Rpb24oYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKSB7
CisgICAgdmFyIHNob3VsZEJlSW5BcnJheTsKKworICAgIGlmICghZmlsdGVyKSB7CisgICAgICBz
aG91bGRCZUluQXJyYXkgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBzaG91bGRCZUluQXJy
YXkgPSBmaWx0ZXIocmVjb3JkKTsKKyAgICB9CisKKyAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhp
cy5yZWNvcmRBcnJheXNGb3JSZWNvcmQocmVjb3JkKTsKKworICAgIGlmIChzaG91bGRCZUluQXJy
YXkpIHsKKyAgICAgIHJlY29yZEFycmF5cy5hZGQoYXJyYXkpOworICAgICAgYXJyYXkuYWRkUmVj
b3JkKHJlY29yZCk7CisgICAgfSBlbHNlIGlmICghc2hvdWxkQmVJbkFycmF5KSB7CisgICAgICBy
ZWNvcmRBcnJheXMucmVtb3ZlKGFycmF5KTsKKyAgICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNv
cmQpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGlm
IHRoZSBgZmlsdGVyRnVuY3Rpb25gIHByb3BlcnR5IGlzCisgICAgY2hhbmdlZCBvbiBhIGBEUy5G
aWx0ZXJlZFJlY29yZEFycmF5YC4KKworICAgIEl0IGVzc2VudGlhbGx5IHJlLXJ1bnMgdGhlIGZp
bHRlciBmcm9tIHNjcmF0Y2guIFRoaXMgc2FtZQorICAgIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4g
dGhlIGZpbHRlciBpcyBjcmVhdGVkIGluIHRoIGZpcnN0IHBsYWNlLgorCisgICAgQG1ldGhvZCB1
cGRhdGVGaWx0ZXIKKyAgICBAcGFyYW0gYXJyYXkKKyAgICBAcGFyYW0gdHlwZQorICAgIEBwYXJh
bSBmaWx0ZXIKKyAgKi8KKyAgdXBkYXRlRmlsdGVyOiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmls
dGVyKSB7CisgICAgdmFyIHR5cGVNYXAgPSB0aGlzLnN0b3JlLnR5cGVNYXBGb3IodHlwZSksCisg
ICAgICAgIHJlY29yZHMgPSB0eXBlTWFwLnJlY29yZHMsIHJlY29yZDsKKworICAgIGZvciAodmFy
IGk9MCwgbD1yZWNvcmRzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIHJlY29yZCA9IHJlY29y
ZHNbaV07CisKKyAgICAgIGlmICghZ2V0KHJlY29yZCwgJ2lzRGVsZXRlZCcpICYmICFnZXQocmVj
b3JkLCAnaXNFbXB0eScpKSB7CisgICAgICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXkoYXJyYXks
IGZpbHRlciwgdHlwZSwgcmVjb3JkKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLyoqCisg
ICAgQ3JlYXRlIGEgYERTLk1hbnlBcnJheWAgZm9yIGEgdHlwZSBhbmQgbGlzdCBvZiByZWNvcmQg
cmVmZXJlbmNlcywgYW5kIGluZGV4CisgICAgdGhlIGBNYW55QXJyYXlgIHVuZGVyIGVhY2ggcmVm
ZXJlbmNlLiBUaGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSByZW1vdmUKKyAgICByZWNvcmRz
IGZyb20gYE1hbnlBcnJheWBzIHdoZW4gdGhleSBhcmUgZGVsZXRlZC4KKworICAgIEBtZXRob2Qg
Y3JlYXRlTWFueUFycmF5CisgICAgQHBhcmFtIHtDbGFzc30gdHlwZQorICAgIEBwYXJhbSB7QXJy
YXl9IHJlZmVyZW5jZXMKKyAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9CisgICovCisgIGNyZWF0
ZU1hbnlBcnJheTogZnVuY3Rpb24odHlwZSwgcmVjb3JkcykgeworICAgIHZhciBtYW55QXJyYXkg
PSBEUy5NYW55QXJyYXkuY3JlYXRlKHsKKyAgICAgIHR5cGU6IHR5cGUsCisgICAgICBjb250ZW50
OiByZWNvcmRzLAorICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKKyAgICB9KTsKKworICAgIGZvckVh
Y2gocmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7CisgICAgICB2YXIgYXJyYXlzID0gdGhpcy5y
ZWNvcmRBcnJheXNGb3JSZWNvcmQocmVjb3JkKTsKKyAgICAgIGFycmF5cy5hZGQobWFueUFycmF5
KTsKKyAgICB9LCB0aGlzKTsKKworICAgIHJldHVybiBtYW55QXJyYXk7CisgIH0sCisKKyAgLyoq
CisgICAgQ3JlYXRlIGEgYERTLlJlY29yZEFycmF5YCBmb3IgYSB0eXBlIGFuZCByZWdpc3RlciBp
dCBmb3IgdXBkYXRlcy4KKworICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkQXJyYXkKKyAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlCisgICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9CisgICovCisgIGNy
ZWF0ZVJlY29yZEFycmF5OiBmdW5jdGlvbih0eXBlKSB7CisgICAgdmFyIGFycmF5ID0gRFMuUmVj
b3JkQXJyYXkuY3JlYXRlKHsKKyAgICAgIHR5cGU6IHR5cGUsCisgICAgICBjb250ZW50OiBFbWJl
ci5BKCksCisgICAgICBzdG9yZTogdGhpcy5zdG9yZSwKKyAgICAgIGlzTG9hZGVkOiB0cnVlCisg
ICAgfSk7CisKKyAgICB0aGlzLnJlZ2lzdGVyRmlsdGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlw
ZSk7CisKKyAgICByZXR1cm4gYXJyYXk7CisgIH0sCisKKyAgLyoqCisgICAgQ3JlYXRlIGEgYERT
LkZpbHRlcmVkUmVjb3JkQXJyYXlgIGZvciBhIHR5cGUgYW5kIHJlZ2lzdGVyIGl0IGZvciB1cGRh
dGVzLgorCisgICAgQG1ldGhvZCBjcmVhdGVGaWx0ZXJlZFJlY29yZEFycmF5CisgICAgQHBhcmFt
IHtDbGFzc30gdHlwZQorICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgorICAgIEByZXR1cm4g
e0RTLkZpbHRlcmVkUmVjb3JkQXJyYXl9CisgICovCisgIGNyZWF0ZUZpbHRlcmVkUmVjb3JkQXJy
YXk6IGZ1bmN0aW9uKHR5cGUsIGZpbHRlcikgeworICAgIHZhciBhcnJheSA9IERTLkZpbHRlcmVk
UmVjb3JkQXJyYXkuY3JlYXRlKHsKKyAgICAgIHR5cGU6IHR5cGUsCisgICAgICBjb250ZW50OiBF
bWJlci5BKCksCisgICAgICBzdG9yZTogdGhpcy5zdG9yZSwKKyAgICAgIG1hbmFnZXI6IHRoaXMs
CisgICAgICBmaWx0ZXJGdW5jdGlvbjogZmlsdGVyCisgICAgfSk7CisKKyAgICB0aGlzLnJlZ2lz
dGVyRmlsdGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSwgZmlsdGVyKTsKKworICAgIHJldHVy
biBhcnJheTsKKyAgfSwKKworICAvKioKKyAgICBDcmVhdGUgYSBgRFMuQWRhcHRlclBvcHVsYXRl
ZFJlY29yZEFycmF5YCBmb3IgYSB0eXBlIHdpdGggZ2l2ZW4gcXVlcnkuCisKKyAgICBAbWV0aG9k
IGNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQorICAgIEBwYXJhbSB7Q2xhc3N9IHR5
cGUKKyAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKKyAgICBAcmV0dXJuIHtEUy5BZGFwdGVyUG9w
dWxhdGVkUmVjb3JkQXJyYXl9CisgICovCisgIGNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRB
cnJheTogZnVuY3Rpb24odHlwZSwgcXVlcnkpIHsKKyAgICByZXR1cm4gRFMuQWRhcHRlclBvcHVs
YXRlZFJlY29yZEFycmF5LmNyZWF0ZSh7CisgICAgICB0eXBlOiB0eXBlLAorICAgICAgcXVlcnk6
IHF1ZXJ5LAorICAgICAgY29udGVudDogRW1iZXIuQSgpLAorICAgICAgc3RvcmU6IHRoaXMuc3Rv
cmUKKyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBSZWdpc3RlciBhIFJlY29yZEFycmF5IGZv
ciBhIGdpdmVuIHR5cGUgdG8gYmUgYmFja2VkIGJ5CisgICAgYSBmaWx0ZXIgZnVuY3Rpb24uIFRo
aXMgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gdXBkYXRlCisgICAgYXV0b21hdGljYWxseSB3aGVu
IHJlY29yZHMgb2YgdGhhdCB0eXBlIGNoYW5nZSBhdHRyaWJ1dGUKKyAgICB2YWx1ZXMgb3Igc3Rh
dGVzLgorCisgICAgQG1ldGhvZCByZWdpc3RlckZpbHRlcmVkUmVjb3JkQXJyYXkKKyAgICBAcGFy
YW0ge0RTLlJlY29yZEFycmF5fSBhcnJheQorICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKKyAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKKyAgKi8KKyAgcmVnaXN0ZXJGaWx0ZXJlZFJlY29yZEFy
cmF5OiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7CisgICAgdmFyIHJlY29yZEFycmF5
cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUpOworICAgIHJlY29yZEFycmF5
cy5wdXNoKGFycmF5KTsKKworICAgIHRoaXMudXBkYXRlRmlsdGVyKGFycmF5LCB0eXBlLCBmaWx0
ZXIpOworICB9LAorCisgIC8vIEludGVybmFsbHksIHdlIG1haW50YWluIGEgbWFwIG9mIGFsbCB1
bmxvYWRlZCBJRHMgcmVxdWVzdGVkIGJ5CisgIC8vIGEgTWFueUFycmF5LiBBcyB0aGUgYWRhcHRl
ciBsb2FkcyBkYXRhIGludG8gdGhlIHN0b3JlLCB0aGUKKyAgLy8gc3RvcmUgbm90aWZpZXMgYW55
IGludGVyZXN0ZWQgTWFueUFycmF5cy4gV2hlbiB0aGUgTWFueUFycmF5J3MKKyAgLy8gdG90YWwg
bnVtYmVyIG9mIGxvYWRpbmcgcmVjb3JkcyBkcm9wcyB0byB6ZXJvLCBpdCBiZWNvbWVzCisgIC8v
IGBpc0xvYWRlZGAgYW5kIGZpcmVzIGEgYGRpZExvYWRgIGV2ZW50LgorICByZWdpc3RlcldhaXRp
bmdSZWNvcmRBcnJheTogZnVuY3Rpb24ocmVjb3JkLCBhcnJheSkgeworICAgIHZhciBsb2FkaW5n
UmVjb3JkQXJyYXlzID0gcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzIHx8IFtdOworICAgIGxv
YWRpbmdSZWNvcmRBcnJheXMucHVzaChhcnJheSk7CisgICAgcmVjb3JkLl9sb2FkaW5nUmVjb3Jk
QXJyYXlzID0gbG9hZGluZ1JlY29yZEFycmF5czsKKyAgfQorfSk7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCit2YXIgZ2V0ID0g
RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cit2YXIgbWFwID0gRW1iZXIuQXJyYXlQb2x5Zmls
bHMubWFwOworCit2YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAn
bGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107CisKKy8q
KgorICBBIGBEUy5JbnZhbGlkRXJyb3JgIGlzIHVzZWQgYnkgYW4gYWRhcHRlciB0byBzaWduYWwg
dGhlIGV4dGVybmFsIEFQSQorICB3YXMgdW5hYmxlIHRvIHByb2Nlc3MgYSByZXF1ZXN0IGJlY2F1
c2UgdGhlIGNvbnRlbnQgd2FzIG5vdAorICBzZW1hbnRpY2FsbHkgY29ycmVjdCBvciBtZWFuaW5n
ZnVsIHBlciB0aGUgQVBJLiBVc3VhbGx5IHRoaXMgbWVhbnMgYQorICByZWNvcmQgZmFpbGVkIHNv
bWUgZm9ybSBvZiBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uLiBXaGVuIGEgcHJvbWlzZQorICBmcm9t
IGFuIGFkYXB0ZXIgaXMgcmVqZWN0ZWQgd2l0aCBhIGBEUy5JbnZhbGlkRXJyb3JgIHRoZSByZWNv
cmQgd2lsbAorICB0cmFuc2l0aW9uIHRvIHRoZSBgaW52YWxpZGAgc3RhdGUgYW5kIHRoZSBlcnJv
cnMgd2lsbCBiZSBzZXQgdG8gdGhlCisgIGBlcnJvcnNgIHByb3BlcnR5IG9uIHRoZSByZWNvcmQu
CisKKyAgRXhhbXBsZQorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkFwcGxpY2F0aW9uQWRhcHRl
ciA9IERTLlJFU1RBZGFwdGVyLmV4dGVuZCh7CisgICAgYWpheEVycm9yOiBmdW5jdGlvbihqcVhI
UikgeworICAgICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOworCisgICAgICBpZiAo
anFYSFIgJiYganFYSFIuc3RhdHVzID09PSA0MjIpIHsKKyAgICAgICAgdmFyIGpzb25FcnJvcnMg
PSBFbWJlci4kLnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQpWyJlcnJvcnMiXTsKKyAgICAg
ICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9ycyk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9KTsKKyAgYGBgCisK
KyAgQGNsYXNzIEludmFsaWRFcnJvcgorICBAbmFtZXNwYWNlIERTCisqLworRFMuSW52YWxpZEVy
cm9yID0gZnVuY3Rpb24oZXJyb3JzKSB7CisgIHZhciB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29u
c3RydWN0b3IuY2FsbCh0aGlzLCAiVGhlIGJhY2tlbmQgcmVqZWN0ZWQgdGhlIGNvbW1pdCBiZWNh
dXNlIGl0IHdhcyBpbnZhbGlkOiAiICsgRW1iZXIuaW5zcGVjdChlcnJvcnMpKTsKKyAgdGhpcy5l
cnJvcnMgPSBlcnJvcnM7CisKKyAgZm9yICh2YXIgaT0wLCBsPWVycm9yUHJvcHMubGVuZ3RoOyBp
PGw7IGkrKykgeworICAgIHRoaXNbZXJyb3JQcm9wc1tpXV0gPSB0bXBbZXJyb3JQcm9wc1tpXV07
CisgIH0KK307CitEUy5JbnZhbGlkRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9y
LnByb3RvdHlwZSk7CisKKy8qKgorICBBbiBhZGFwdGVyIGlzIGFuIG9iamVjdCB0aGF0IHJlY2Vp
dmVzIHJlcXVlc3RzIGZyb20gYSBzdG9yZSBhbmQKKyAgdHJhbnNsYXRlcyB0aGVtIGludG8gdGhl
IGFwcHJvcHJpYXRlIGFjdGlvbiB0byB0YWtlIGFnYWluc3QgeW91cgorICBwZXJzaXN0ZW5jZSBs
YXllci4gVGhlIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkgYW4gSFRUUCBBUEksIGJ1dAor
ICBtYXkgYmUgYW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlLiBU
eXBpY2FsbHkgdGhlCisgIGFkYXB0ZXIgaXMgbm90IGludm9rZWQgZGlyZWN0bHkgaW5zdGVhZCBp
dHMgZnVuY3Rpb25hbGl0eSBpcyBhY2Nlc3NlZAorICB0aHJvdWdoIHRoZSBgc3RvcmVgLgorCisg
ICMjIyBDcmVhdGluZyBhbiBBZGFwdGVyCisKKyAgRmlyc3QsIGNyZWF0ZSBhIG5ldyBzdWJjbGFz
cyBvZiBgRFMuQWRhcHRlcmA6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuTXlBZGFwdGVyID0g
RFMuQWRhcHRlci5leHRlbmQoeworICAgIC8vIC4uLnlvdXIgY29kZSBoZXJlCisgIH0pOworICBg
YGAKKworICBUbyB0ZWxsIHlvdXIgc3RvcmUgd2hpY2ggYWRhcHRlciB0byB1c2UsIHNldCBpdHMg
YGFkYXB0ZXJgIHByb3BlcnR5OgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLnN0b3JlID0gRFMu
U3RvcmUuY3JlYXRlKHsKKyAgICBhZGFwdGVyOiAnTXlBZGFwdGVyJworICB9KTsKKyAgYGBgCisK
KyAgYERTLkFkYXB0ZXJgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCB5b3Ugc2hvdWxk
IG92ZXJyaWRlIGluIHlvdXIKKyAgYXBwbGljYXRpb24gdG8gY3VzdG9taXplIGl0IGZvciB5b3Vy
IGJhY2tlbmQuIFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCisgIHRoYXQgeW91IHNob3VsZCBp
bXBsZW1lbnQgaXM6CisKKyAgICAqIGBmaW5kKClgCisgICAgKiBgY3JlYXRlUmVjb3JkKClgCisg
ICAgKiBgdXBkYXRlUmVjb3JkKClgCisgICAgKiBgZGVsZXRlUmVjb3JkKClgCisgICAgKiBgZmlu
ZEFsbCgpYAorICAgICogYGZpbmRRdWVyeSgpYAorCisgIFRvIGltcHJvdmUgdGhlIG5ldHdvcmsg
cGVyZm9ybWFuY2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiBvcHRpbWl6ZQorICB5b3Vy
IGFkYXB0ZXIgYnkgb3ZlcnJpZGluZyB0aGVzZSBsb3dlci1sZXZlbCBtZXRob2RzOgorCisgICAg
KiBgZmluZE1hbnkoKWAKKworCisgIEZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uLCBzZWUg
YERTLlJFU1RBZGFwdGVyYCwgdGhlCisgIGluY2x1ZGVkIFJFU1QgYWRhcHRlci4KKworICBAY2xh
c3MgQWRhcHRlcgorICBAbmFtZXNwYWNlIERTCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorKi8K
KworRFMuQWRhcHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworCisgIC8qKgorICAgIElmIHlv
dSB3b3VsZCBsaWtlIHlvdXIgYWRhcHRlciB0byB1c2UgYSBjdXN0b20gc2VyaWFsaXplciB5b3Ug
Y2FuCisgICAgc2V0IHRoZSBgZGVmYXVsdFNlcmlhbGl6ZXJgIHByb3BlcnR5IHRvIGJlIHRoZSBu
YW1lIG9mIHRoZSBjdXN0b20KKyAgICBzZXJpYWxpemVyLgorCisgICAgTm90ZSB0aGUgYGRlZmF1
bHRTZXJpYWxpemVyYCBzZXJpYWxpemVyIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoZW4KKyAgICBh
IG1vZGVsIHNwZWNpZmljIHNlcmlhbGl6ZXIgKGkuZS4gYFBvc3RTZXJpYWxpemVyYCkgb3IgdGhl
CisgICAgYGFwcGxpY2F0aW9uYCBzZXJpYWxpemVyLgorCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBEamFuZ29BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoeworICAgICAgZGVmYXVsdFNl
cmlhbGl6ZXI6ICdkamFuZ28nCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAcHJvcGVydHkgZGVm
YXVsdFNlcmlhbGl6ZXIKKyAgICBAdHlwZSB7U3RyaW5nfQorICAqLworCisgIC8qKgorICAgIFRo
ZSBgZmluZCgpYCBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzdG9yZSBpcyBhc2tlZCBmb3Ig
YSByZWNvcmQgdGhhdAorICAgIGhhcyBub3QgcHJldmlvdXNseSBiZWVuIGxvYWRlZC4gSW4gcmVz
cG9uc2UgdG8gYGZpbmQoKWAgYmVpbmcgY2FsbGVkLCB5b3UKKyAgICBzaG91bGQgcXVlcnkgeW91
ciBwZXJzaXN0ZW5jZSBsYXllciBmb3IgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQuIE9uY2UK
KyAgICBmb3VuZCwgeW91IGNhbiBhc3luY2hyb25vdXNseSBjYWxsIHRoZSBzdG9yZSdzIGBwdXNo
KClgIG1ldGhvZCB0byBwdXNoCisgICAgdGhlIHJlY29yZCBpbnRvIHRoZSBzdG9yZS4KKworICAg
IEhlcmUgaXMgYW4gZXhhbXBsZSBgZmluZGAgaW1wbGVtZW50YXRpb246CisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsK
KyAgICAgIGZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgeworICAgICAgICB2YXIgdXJs
ID0gW3R5cGUsIGlkXS5qb2luKCcvJyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQ
LlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgICAgalF1ZXJ5Lmdl
dEpTT04odXJsKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgIEVtYmVyLnJ1bihu
dWxsLCByZXNvbHZlLCBkYXRhKTsKKyAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgeworICAg
ICAgICAgICAganFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVk
IHByb21pc2VzCisgICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7Cisg
ICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisg
ICAgQG1ldGhvZCBmaW5kCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0g
e3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtTdHJpbmd9IGlkCisgICAg
QHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kOiBFbWJlci5yZXF1aXJlZChG
dW5jdGlvbiksCisKKyAgLyoqCisgICAgVGhlIGBmaW5kQWxsKClgIG1ldGhvZCBpcyBjYWxsZWQg
d2hlbiB5b3UgY2FsbCBgZmluZGAgb24gdGhlIHN0b3JlCisgICAgd2l0aG91dCBhbiBJRCAoaS5l
LiBgc3RvcmUuZmluZCgncG9zdCcpYCkuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKKyAg
ICAgIGZpbmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7CisgICAgICAg
IHZhciB1cmwgPSB0eXBlOworICAgICAgICB2YXIgcXVlcnkgPSB7IHNpbmNlOiBzaW5jZVRva2Vu
IH07CisgICAgICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29s
dmUsIHJlamVjdCkgeworICAgICAgICAgIGpRdWVyeS5nZXRKU09OKHVybCwgcXVlcnkpLnRoZW4o
ZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRh
dGEpOworICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7CisgICAgICAgICAgICBqcVhIUi50
aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKKyAgICAg
ICAgICAgIEVtYmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKKyAgICAgICAgICB9KTsKKyAg
ICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgZmluZEFsbAorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRv
a2VuCisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kQWxsOiBudWxs
LAorCisgIC8qKgorICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHlvdSBjYWxsIGBmaW5k
YCBvbiB0aGUgc3RvcmUgd2l0aCBhCisgICAgcXVlcnkgb2JqZWN0IGFzIHRoZSBzZWNvbmQgcGFy
YW1ldGVyIChpLmUuIGBzdG9yZS5maW5kKCdwZXJzb24nLCB7CisgICAgcGFnZTogMSB9KWApLgor
CisgICAgRXhhbXBsZQorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5BcHBsaWNhdGlvbkFk
YXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7CisgICAgICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCBxdWVyeSkgeworICAgICAgICB2YXIgdXJsID0gdHlwZTsKKyAgICAgICAgcmV0
dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Cisg
ICAgICAgICAgalF1ZXJ5LmdldEpTT04odXJsLCBxdWVyeSkudGhlbihmdW5jdGlvbihkYXRhKSB7
CisgICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7CisgICAgICAgICAg
fSwgZnVuY3Rpb24oanFYSFIpIHsKKyAgICAgICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0
YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBwcm9taXNlcworICAgICAgICAgICAgRW1iZXIucnVu
KG51bGwsIHJlamVjdCwganFYSFIpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAg
IH0KKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBmaW5kUXVl
cnkKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKKyAgICBAcGFyYW0ge0RT
LkFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheX0gcmVjb3JkQXJyYXkKKyAgICBAcmV0dXJuIHtQ
cm9taXNlfSBwcm9taXNlCisgICovCisgIGZpbmRRdWVyeTogbnVsbCwKKworICAvKioKKyAgICBJ
ZiB0aGUgZ2xvYmFsbHkgdW5pcXVlIElEcyBmb3IgeW91ciByZWNvcmRzIHNob3VsZCBiZSBnZW5l
cmF0ZWQgb24gdGhlIGNsaWVudCwKKyAgICBpbXBsZW1lbnQgdGhlIGBnZW5lcmF0ZUlkRm9yUmVj
b3JkKClgIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCisgICAgZWFjaCB0aW1l
IHlvdSBjcmVhdGUgYSBuZXcgcmVjb3JkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gaXQg
d2lsbCBiZQorICAgIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQncyBgcHJpbWFyeUtleWAuCisKKyAg
ICBNb3N0IHRyYWRpdGlvbmFsIFJFU1QtbGlrZSBIVFRQIEFQSXMgd2lsbCBub3QgdXNlIHRoaXMg
bWV0aG9kLiBJbnN0ZWFkLCB0aGUgSUQKKyAgICBvZiB0aGUgcmVjb3JkIHdpbGwgYmUgc2V0IGJ5
IHRoZSBzZXJ2ZXIsIGFuZCB5b3VyIGFkYXB0ZXIgd2lsbCB1cGRhdGUgdGhlIHN0b3JlCisgICAg
d2l0aCB0aGUgbmV3IElEIHdoZW4gaXQgY2FsbHMgYGRpZENyZWF0ZVJlY29yZCgpYC4gT25seSBp
bXBsZW1lbnQgdGhpcyBtZXRob2QgaWYKKyAgICB5b3UgaW50ZW5kIHRvIGdlbmVyYXRlIHJlY29y
ZCBJRHMgb24gdGhlIGNsaWVudC1zaWRlLgorCisgICAgVGhlIGBnZW5lcmF0ZUlkRm9yUmVjb3Jk
KClgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmVxdWVzdGluZyBzdG9yZSBhcwor
ICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSBuZXdseSBjcmVhdGVkIHJlY29yZCBhcyB0
aGUgc2Vjb25kIHBhcmFtZXRlcjoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBnZW5lcmF0ZUlk
Rm9yUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgcmVjb3JkKSB7CisgICAgICB2YXIgdXVpZCA9IEFw
cC5nZW5lcmF0ZVVVSURXaXRoU3RhdGlzdGljYWxseUxvd09kZHNPZkNvbGxpc2lvbigpOworICAg
ICAgcmV0dXJuIHV1aWQ7CisgICAgfQorICAgIGBgYAorCisgICAgQG1ldGhvZCBnZW5lcmF0ZUlk
Rm9yUmVjb3JkCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQKKyAgICBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfSBpZAorICAqLworICBnZW5l
cmF0ZUlkRm9yUmVjb3JkOiBudWxsLAorCisgIC8qKgorICAgIFByb3hpZXMgdG8gdGhlIHNlcmlh
bGl6ZXIncyBgc2VyaWFsaXplYCBtZXRob2QuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsK
KyAgICAgIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAg
ICAgICB2YXIgZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUg
fSk7CisgICAgICAgIHZhciB1cmwgPSB0eXBlOworCisgICAgICAgIC8vIC4uLgorICAgICAgfQor
ICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCBzZXJpYWxpemUKKyAgICBAcGFyYW0ge0RT
Lk1vZGVsfSByZWNvcmQKKyAgICBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zCisgICAgQHJldHVy
biB7T2JqZWN0fSBzZXJpYWxpemVkIHJlY29yZAorICAqLworICBzZXJpYWxpemU6IGZ1bmN0aW9u
KHJlY29yZCwgb3B0aW9ucykgeworICAgIHJldHVybiBnZXQocmVjb3JkLCAnc3RvcmUnKS5zZXJp
YWxpemVyRm9yKHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5KS5zZXJpYWxpemUocmVjb3JkLCBv
cHRpb25zKTsKKyAgfSwKKworICAvKioKKyAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBz
dWJjbGFzcyB0byBoYW5kbGUgdGhlIGNyZWF0aW9uIG9mCisgICAgbmV3IHJlY29yZHMuCisKKyAg
ICBTZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KKworICAg
IEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25BZGFwdGVy
ID0gRFMuQWRhcHRlci5leHRlbmQoeworICAgICAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9y
ZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgICAgIHZhciBkYXRhID0gdGhpcy5zZXJpYWxpemUocmVj
b3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KTsKKyAgICAgICAgdmFyIHVybCA9IHR5cGU7CisKKyAg
ICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVq
ZWN0KSB7CisgICAgICAgICAgalF1ZXJ5LmFqYXgoeworICAgICAgICAgICAgdHlwZTogJ1BPU1Qn
LAorICAgICAgICAgICAgdXJsOiB1cmwsCisgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAor
ICAgICAgICAgICAgZGF0YTogZGF0YQorICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YSkg
eworICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOworICAgICAgICAg
IH0sIGZ1bmN0aW9uKGpxWEhSKSB7CisgICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8g
dGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKKyAgICAgICAgICAgIEVtYmVyLnJ1
bihudWxsLCByZWplY3QsIGpxWEhSKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAg
ICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAorICAgIEBw
YXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0g
dHlwZSAgIHRoZSBEUy5Nb2RlbCBjbGFzcyBvZiB0aGUgcmVjb3JkCisgICAgQHBhcmFtIHtEUy5N
b2RlbH0gcmVjb3JkCisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBjcmVh
dGVSZWNvcmQ6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKKworICAvKioKKyAgICBJbXBsZW1l
bnQgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlIHVwZGF0aW5nIG9mCisg
ICAgYSByZWNvcmQuCisKKyAgICBTZXJpYWxpemVzIHRoZSByZWNvcmQgdXBkYXRlIGFuZCBzZW5k
IGl0IHRvIHRoZSBzZXJ2ZXIuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKKyAgICAgIHVw
ZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAgICAgICB2YXIg
ZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7CisgICAg
ICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lkJyk7CisgICAgICAgIHZhciB1cmwgPSBbdHlwZSwg
aWRdLmpvaW4oJy8nKTsKKworICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShm
dW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgICAgICBqUXVlcnkuYWpheCh7CisgICAg
ICAgICAgICB0eXBlOiAnUFVUJywKKyAgICAgICAgICAgIHVybDogdXJsLAorICAgICAgICAgICAg
ZGF0YVR5cGU6ICdqc29uJywKKyAgICAgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgICAgICB9KS50
aGVuKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZl
LCBkYXRhKTsKKyAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgeworICAgICAgICAgICAganFY
SFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2VzCisg
ICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7CisgICAgICAgICAgfSk7
CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCB1
cGRhdGVSZWNvcmQKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUgICB0aGUgRFMuTW9kZWwgY2xhc3Mgb2YgdGhlIHJlY29y
ZAorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEByZXR1cm4ge1Byb21pc2V9IHBy
b21pc2UKKyAgKi8KKyAgdXBkYXRlUmVjb3JkOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCisK
KyAgLyoqCisgICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gaGFuZGxl
IHRoZSBkZWxldGlvbiBvZgorICAgIGEgcmVjb3JkLgorCisgICAgU2VuZHMgYSBkZWxldGUgcmVx
dWVzdCBmb3IgdGhlIHJlY29yZCB0byB0aGUgc2VydmVyLgorCisgICAgRXhhbXBsZQorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4
dGVuZCh7CisgICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQp
IHsKKyAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlk
OiB0cnVlIH0pOworICAgICAgICB2YXIgaWQgPSByZWNvcmQuZ2V0KCdpZCcpOworICAgICAgICB2
YXIgdXJsID0gW3R5cGUsIGlkXS5qb2luKCcvJyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBFbWJl
ci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgICAgalF1
ZXJ5LmFqYXgoeworICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsCisgICAgICAgICAgICB1cmw6
IHVybCwKKyAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCisgICAgICAgICAgICBkYXRhOiBk
YXRhCisgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICBFbWJl
ci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7CisgICAgICAgICAgfSwgZnVuY3Rpb24oanFYSFIp
IHsKKyAgICAgICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBt
YW5uZXJlZCBwcm9taXNlcworICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVjdCwganFY
SFIpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBg
YGAKKworICAgIEBtZXRob2QgZGVsZXRlUmVjb3JkCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3Rv
cmUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAgdGhlIERTLk1vZGVs
IGNsYXNzIG9mIHRoZSByZWNvcmQKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgICBA
cmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCisgICovCisgIGRlbGV0ZVJlY29yZDogRW1iZXIucmVx
dWlyZWQoRnVuY3Rpb24pLAorCisgIC8qKgorICAgIEZpbmQgbXVsdGlwbGUgcmVjb3JkcyBhdCBv
bmNlLgorCisgICAgQnkgZGVmYXVsdCwgaXQgbG9vcHMgb3ZlciB0aGUgcHJvdmlkZWQgaWRzIGFu
ZCBjYWxscyBgZmluZGAgb24gZWFjaC4KKyAgICBNYXkgYmUgb3ZlcndyaXR0ZW4gdG8gaW1wcm92
ZSBwZXJmb3JtYW5jZSBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YKKyAgICBzZXJ2ZXIgcmVxdWVz
dHMuCisKKyAgICBFeGFtcGxlCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLkFwcGxpY2F0
aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKKyAgICAgIGZpbmRNYW55OiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgaWRzKSB7CisgICAgICAgIHZhciB1cmwgPSB0eXBlOworICAgICAgICBy
ZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsK
KyAgICAgICAgICBqUXVlcnkuZ2V0SlNPTih1cmwsIHtpZHM6IGlkc30pLnRoZW4oZnVuY3Rpb24o
ZGF0YSkgeworICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOworICAg
ICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7CisgICAgICAgICAgICBqcVhIUi50aGVuID0gbnVs
bDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKKyAgICAgICAgICAgIEVt
YmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7
CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGZpbmRNYW55CisgICAg
QHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVs
fSB0eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNvcmRzCisgICAgQHBhcmFtIHtB
cnJheX0gICAgaWRzCisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5k
TWFueTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgeworICAgIHZhciBwcm9taXNlcyA9IG1h
cC5jYWxsKGlkcywgZnVuY3Rpb24oaWQpIHsKKyAgICAgIHJldHVybiB0aGlzLmZpbmQoc3RvcmUs
IHR5cGUsIGlkKTsKKyAgICB9LCB0aGlzKTsKKworICAgIHJldHVybiBFbWJlci5SU1ZQLmFsbChw
cm9taXNlcyk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisg
IEBtb2R1bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGdldCA9IEVtYmVyLmdldCwgZm10ID0gRW1i
ZXIuU3RyaW5nLmZtdCwKKyAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4
T2Y7CisKK3ZhciBjb3VudGVyID0gMDsKKworLyoqCisgIGBEUy5GaXh0dXJlQWRhcHRlcmAgaXMg
YW4gYWRhcHRlciB0aGF0IGxvYWRzIHJlY29yZHMgZnJvbSBtZW1vcnkuCisgIEl0cyBwcmltYXJp
bHkgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuIFlvdSBjYW4gYWxzbyB1c2UKKyAg
YERTLkZpeHR1cmVBZGFwdGVyYCB3aGlsZSB3b3JraW5nIG9uIHRoZSBBUEkgYnV0IGFyZSBub3Qg
cmVhZHkgdG8KKyAgaW50ZWdyYXRlIHlldC4gSXQgaXMgYSBmdWxseSBmdW5jdGlvbmluZyBhZGFw
dGVyLiBBbGwgQ1JVRCBtZXRob2RzCisgIGFyZSBpbXBsZW1lbnRlZC4gWW91IGNhbiBhbHNvIGlt
cGxlbWVudCBxdWVyeSBsb2dpYyB0aGF0IGEgcmVtb3RlCisgIHN5c3RlbSB3b3VsZCBkby4gSXRz
IHBvc3NpYmxlIHRvIGRvIGRldmVsb3AgeW91ciBlbnRpcmUgYXBwbGljYXRpb24KKyAgd2l0aCBg
RFMuRml4dHVyZUFkYXB0ZXJgLgorCisgIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRo
ZSBgRml4dHVyZUFkYXB0ZXJgIGluIHlvdXIKKyAgYXBwbGljYXRpb24gcGxlYXNlIHNlZSB0aGUg
W0ZpeHR1cmVBZGFwdGVyCisgIGd1aWRlXSgvZ3VpZGVzL21vZGVscy90aGUtZml4dHVyZS1hZGFw
dGVyLykuCisKKyAgQGNsYXNzIEZpeHR1cmVBZGFwdGVyCisgIEBuYW1lc3BhY2UgRFMKKyAgQGV4
dGVuZHMgRFMuQWRhcHRlcgorKi8KK0RTLkZpeHR1cmVBZGFwdGVyID0gRFMuQWRhcHRlci5leHRl
bmQoeworICAvLyBieSBkZWZhdWx0LCBmaXh0dXJlcyBhcmUgYWxyZWFkeSBpbiBub3JtYWxpemVk
IGZvcm0KKyAgc2VyaWFsaXplcjogbnVsbCwKKworICAvKioKKyAgICBJZiBgc2ltdWxhdGVSZW1v
dGVSZXNwb25zZWAgaXMgYHRydWVgIHRoZSBgRml4dHVyZUFkYXB0ZXJgIHdpbGwKKyAgICB3YWl0
IGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGgg
dGhlCisgICAgZml4dHVyZSB2YWx1ZXMuIFRoZSB3YWl0IHRpbWUgY2FuIGJlIGNvbmZpZ3VyZWQg
dmlhIHRoZSBgbGF0ZW5jeWAKKyAgICBwcm9wZXJ0eS4KKworICAgIEBwcm9wZXJ0eSBzaW11bGF0
ZVJlbW90ZVJlc3BvbnNlCisgICAgQHR5cGUge0Jvb2xlYW59CisgICAgQGRlZmF1bHQgdHJ1ZQor
ICAqLworICBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlOiB0cnVlLAorCisgIC8qKgorICAgIEJ5IGRl
ZmF1bHQgdGhlIGBGaXh0dXJlQWRhcHRlcmAgd2lsbCBzaW11bGF0ZSBhIHdhaXQgb2YgdGhlCisg
ICAgYGxhdGVuY3lgIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGgg
dGhlIGZpeHR1cmUKKyAgICB2YWx1ZXMuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHR1cm5lZCBvZmYg
dmlhIHRoZQorICAgIGBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlYCBwcm9wZXJ0eS4KKworICAgIEBw
cm9wZXJ0eSBsYXRlbmN5CisgICAgQHR5cGUge051bWJlcn0KKyAgICBAZGVmYXVsdCA1MAorICAq
LworICBsYXRlbmN5OiA1MCwKKworICAvKioKKyAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4g
b3JkZXIgdG8gcHJvdmlkZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUKKworICAgIEBtZXRo
b2QgZml4dHVyZXNGb3JUeXBlCisgICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQorICAgIEByZXR1cm4ge0FycmF5fQorICAqLworICBmaXh0dXJlc0ZvclR5cGU6IGZ1bmN0aW9u
KHR5cGUpIHsKKyAgICBpZiAodHlwZS5GSVhUVVJFUykgeworICAgICAgdmFyIGZpeHR1cmVzID0g
RW1iZXIuQSh0eXBlLkZJWFRVUkVTKTsKKyAgICAgIHJldHVybiBmaXh0dXJlcy5tYXAoZnVuY3Rp
b24oZml4dHVyZSl7CisgICAgICAgIHZhciBmaXh0dXJlSWRUeXBlID0gdHlwZW9mIGZpeHR1cmUu
aWQ7CisgICAgICAgIGlmKGZpeHR1cmVJZFR5cGUgIT09ICJudW1iZXIiICYmIGZpeHR1cmVJZFR5
cGUgIT09ICJzdHJpbmciKXsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZm10KCd0aGUgaWQg
cHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkIGFzIGEgbnVtYmVyIG9yIHN0cmluZyBmb3IgZml4dHVy
ZSAlQCcsIFtmaXh0dXJlXSkpOworICAgICAgICB9CisgICAgICAgIGZpeHR1cmUuaWQgPSBmaXh0
dXJlLmlkICsgJyc7CisgICAgICAgIHJldHVybiBmaXh0dXJlOworICAgICAgfSk7CisgICAgfQor
ICAgIHJldHVybiBudWxsOworICB9LAorCisgIC8qKgorICAgIEltcGxlbWVudCB0aGlzIG1ldGhv
ZCBpbiBvcmRlciB0byBxdWVyeSBmaXh0dXJlcyBkYXRhCisKKyAgICBAbWV0aG9kIHF1ZXJ5Rml4
dHVyZXMKKyAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCisgICAgQHBhcmFtIHtPYmplY3R9IHF1
ZXJ5CisgICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEByZXR1cm4g
e1Byb21pc2V8QXJyYXl9CisgICovCisgIHF1ZXJ5Rml4dHVyZXM6IGZ1bmN0aW9uKGZpeHR1cmVz
LCBxdWVyeSwgdHlwZSkgeworICAgIEVtYmVyLmFzc2VydCgnTm90IGltcGxlbWVudGVkOiBZb3Ug
bXVzdCBvdmVycmlkZSB0aGUgRFMuRml4dHVyZUFkYXB0ZXI6OnF1ZXJ5Rml4dHVyZXMgbWV0aG9k
IHRvIHN1cHBvcnQgcXVlcnlpbmcgdGhlIGZpeHR1cmUgc3RvcmUuJyk7CisgIH0sCisKKyAgLyoq
CisgICAgQG1ldGhvZCB1cGRhdGVGaXh0dXJlcworICAgIEBwYXJhbSB7U3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCisgICovCisgIHVwZGF0ZUZp
eHR1cmVzOiBmdW5jdGlvbih0eXBlLCBmaXh0dXJlKSB7CisgICAgaWYoIXR5cGUuRklYVFVSRVMp
IHsKKyAgICAgIHR5cGUuRklYVFVSRVMgPSBbXTsKKyAgICB9CisKKyAgICB2YXIgZml4dHVyZXMg
PSB0eXBlLkZJWFRVUkVTOworCisgICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0dXJlKHR5cGUsIGZp
eHR1cmUpOworCisgICAgZml4dHVyZXMucHVzaChmaXh0dXJlKTsKKyAgfSwKKworICAvKioKKyAg
ICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBqc29uIGZvciBDUlVE
IG1ldGhvZHMKKworICAgIEBtZXRob2QgbW9ja0pTT04KKyAgICBAcGFyYW0ge1N1YmNsYXNzIG9m
IERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICovCisgIG1v
Y2tKU09OOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgcmV0dXJuIHN0b3Jl
LnNlcmlhbGl6ZXJGb3IodHlwZSkuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUg
fSk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3JkCisgICAg
QHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAg
ICBAcmV0dXJuIHtTdHJpbmd9IGlkCisgICovCisgIGdlbmVyYXRlSWRGb3JSZWNvcmQ6IGZ1bmN0
aW9uKHN0b3JlKSB7CisgICAgcmV0dXJuICJmaXh0dXJlLSIgKyBjb3VudGVyKys7CisgIH0sCisK
KyAgLyoqCisgICAgQG1ldGhvZCBmaW5kCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAg
ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtTdHJpbmd9
IGlkCisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kOiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgaWQpIHsKKyAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9y
VHlwZSh0eXBlKSwKKyAgICAgICAgZml4dHVyZTsKKworICAgIEVtYmVyLmFzc2VydCgiVW5hYmxl
IHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1
cmVzKTsKKworICAgIGlmIChmaXh0dXJlcykgeworICAgICAgZml4dHVyZSA9IEVtYmVyLkEoZml4
dHVyZXMpLmZpbmRQcm9wZXJ0eSgnaWQnLCBpZCk7CisgICAgfQorCisgICAgaWYgKGZpeHR1cmUp
IHsKKyAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKKyAg
ICAgICAgcmV0dXJuIGZpeHR1cmU7CisgICAgICB9LCB0aGlzKTsKKyAgICB9CisgIH0sCisKKyAg
LyoqCisgICAgQG1ldGhvZCBmaW5kTWFueQorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisg
ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7QXJyYXl9
IGlkcworICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmluZE1hbnk6IGZ1
bmN0aW9uKHN0b3JlLCB0eXBlLCBpZHMpIHsKKyAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1
cmVzRm9yVHlwZSh0eXBlKTsKKworICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4
dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKKworICAg
IGlmIChmaXh0dXJlcykgeworICAgICAgZml4dHVyZXMgPSBmaXh0dXJlcy5maWx0ZXIoZnVuY3Rp
b24oaXRlbSkgeworICAgICAgICByZXR1cm4gaW5kZXhPZihpZHMsIGl0ZW0uaWQpICE9PSAtMTsK
KyAgICAgIH0pOworICAgIH0KKworICAgIGlmIChmaXh0dXJlcykgeworICAgICAgcmV0dXJuIHRo
aXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gZml4dHVy
ZXM7CisgICAgICB9LCB0aGlzKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgQHByaXZhdGUK
KyAgICBAbWV0aG9kIGZpbmRBbGwKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBw
YXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge1N0cmluZ30gc2lu
Y2VUb2tlbgorICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmluZEFsbDog
ZnVuY3Rpb24oc3RvcmUsIHR5cGUpIHsKKyAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVz
Rm9yVHlwZSh0eXBlKTsKKworICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVy
ZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKKworICAgIHJl
dHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBm
aXh0dXJlczsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgZmluZFF1ZXJ5CisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFy
YW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5
CisgICAgQHBhcmFtIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9IHJlY29yZEFycmF5
CisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kUXVlcnk6IGZ1bmN0
aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSwgYXJyYXkpIHsKKyAgICB2YXIgZml4dHVyZXMgPSB0aGlz
LmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKKworICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZp
bmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsK
KworICAgIGZpeHR1cmVzID0gdGhpcy5xdWVyeUZpeHR1cmVzKGZpeHR1cmVzLCBxdWVyeSwgdHlw
ZSk7CisKKyAgICBpZiAoZml4dHVyZXMpIHsKKyAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVt
b3RlQ2FsbChmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGZpeHR1cmVzOworICAgICAgfSwg
dGhpcyk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkCisg
ICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1v
ZGVsfSB0eXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCisgICAgQHJldHVybiB7UHJv
bWlzZX0gcHJvbWlzZQorICAqLworICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCByZWNvcmQpIHsKKyAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9ja0pTT04oc3RvcmUsIHR5cGUs
IHJlY29yZCk7CisKKyAgICB0aGlzLnVwZGF0ZUZpeHR1cmVzKHR5cGUsIGZpeHR1cmUpOworCisg
ICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgeworICAgICAgcmV0
dXJuIGZpeHR1cmU7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCB1
cGRhdGVSZWNvcmQKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAg
ICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCisgICovCisgIHVwZGF0ZVJlY29yZDogZnVuY3Rp
b24oc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAgIHZhciBmaXh0dXJlID0gdGhpcy5tb2NrSlNP
TihzdG9yZSwgdHlwZSwgcmVjb3JkKTsKKworICAgIHRoaXMudXBkYXRlRml4dHVyZXModHlwZSwg
Zml4dHVyZSk7CisKKyAgICByZXR1cm4gdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24o
KSB7CisgICAgICByZXR1cm4gZml4dHVyZTsKKyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioK
KyAgICBAbWV0aG9kIGRlbGV0ZVJlY29yZAorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisg
ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuTW9k
ZWx9IHJlY29yZAorICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZGVsZXRl
UmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgdmFyIGZpeHR1cmUg
PSB0aGlzLm1vY2tKU09OKHN0b3JlLCB0eXBlLCByZWNvcmQpOworCisgICAgdGhpcy5kZWxldGVM
b2FkZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOworCisgICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVS
ZW1vdGVDYWxsKGZ1bmN0aW9uKCkgeworICAgICAgLy8gbm8gcGF5bG9hZCBpbiBhIGRlbGV0aW9u
CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9KTsKKyAgfSwKKworICAvKgorICAgIEBtZXRob2Qg
ZGVsZXRlTG9hZGVkRml4dHVyZQorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHR5cGUKKyAgICBA
cGFyYW0gcmVjb3JkCisgICovCisgIGRlbGV0ZUxvYWRlZEZpeHR1cmU6IGZ1bmN0aW9uKHR5cGUs
IHJlY29yZCkgeworICAgIHZhciBleGlzdGluZ0ZpeHR1cmUgPSB0aGlzLmZpbmRFeGlzdGluZ0Zp
eHR1cmUodHlwZSwgcmVjb3JkKTsKKworICAgIGlmKGV4aXN0aW5nRml4dHVyZSkgeworICAgICAg
dmFyIGluZGV4ID0gaW5kZXhPZih0eXBlLkZJWFRVUkVTLCBleGlzdGluZ0ZpeHR1cmUpOworICAg
ICAgdHlwZS5GSVhUVVJFUy5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICB9LAorCisgIC8qCisgICAgQG1ldGhvZCBmaW5kRXhpc3RpbmdGaXh0dXJlCisgICAg
QHByaXZhdGUKKyAgICBAcGFyYW0gdHlwZQorICAgIEBwYXJhbSByZWNvcmQKKyAgKi8KKyAgZmlu
ZEV4aXN0aW5nRml4dHVyZTogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7CisgICAgdmFyIGZpeHR1
cmVzID0gdGhpcy5maXh0dXJlc0ZvclR5cGUodHlwZSk7CisgICAgdmFyIGlkID0gZ2V0KHJlY29y
ZCwgJ2lkJyk7CisKKyAgICByZXR1cm4gdGhpcy5maW5kRml4dHVyZUJ5SWQoZml4dHVyZXMsIGlk
KTsKKyAgfSwKKworICAvKgorICAgIEBtZXRob2QgZmluZEZpeHR1cmVCeUlkCisgICAgQHByaXZh
dGUKKyAgICBAcGFyYW0gZml4dHVyZXMKKyAgICBAcGFyYW0gaWQKKyAgKi8KKyAgZmluZEZpeHR1
cmVCeUlkOiBmdW5jdGlvbihmaXh0dXJlcywgaWQpIHsKKyAgICByZXR1cm4gRW1iZXIuQShmaXh0
dXJlcykuZmluZChmdW5jdGlvbihyKSB7CisgICAgICBpZignJytnZXQociwgJ2lkJykgPT09ICcn
K2lkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgfQorICAgIH0pOworICB9LAorCisgIC8qCisgICAgQG1ldGhvZCBz
aW11bGF0ZVJlbW90ZUNhbGwKKyAgICBAcHJpdmF0ZQorICAgIEBwYXJhbSBjYWxsYmFjaworICAg
IEBwYXJhbSBjb250ZXh0CisgICovCisgIHNpbXVsYXRlUmVtb3RlQ2FsbDogZnVuY3Rpb24oY2Fs
bGJhY2ssIGNvbnRleHQpIHsKKyAgICB2YXIgYWRhcHRlciA9IHRoaXM7CisKKyAgICByZXR1cm4g
bmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7CisgICAgICBpZiAoZ2V0
KGFkYXB0ZXIsICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsKKyAgICAgICAgLy8gU2NoZWR1
bGUgd2l0aCBzZXRUaW1lb3V0CisgICAgICAgIEVtYmVyLnJ1bi5sYXRlcihmdW5jdGlvbigpIHsK
KyAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrLmNhbGwoY29udGV4dCkpOworICAgICAgICB9LCBn
ZXQoYWRhcHRlciwgJ2xhdGVuY3knKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBc3lu
Y2hyb25vdXMsIGJ1dCBhdCB0aGUgb2YgdGhlIHJ1bmxvb3Agd2l0aCB6ZXJvIGxhdGVuY3kKKyAg
ICAgICAgRW1iZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgbnVsbCwgZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgcmVzb2x2ZShjYWxsYmFjay5jYWxsKGNvbnRleHQpKTsKKyAgICAgICAgfSk7Cisg
ICAgICB9CisgICAgfSwgIkRTOiBGaXh0dXJlQWRhcHRlciNzaW11bGF0ZVJlbW90ZUNhbGwiKTsK
KyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBl
bWJlci1kYXRhCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cit2
YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Cit2YXIgbWFwID0gRW1i
ZXIuQXJyYXlQb2x5ZmlsbHMubWFwOworCitmdW5jdGlvbiBjb2VyY2VJZChpZCkgeworICByZXR1
cm4gaWQgPT0gbnVsbCA/IG51bGwgOiBpZCsnJzsKK30KKworLyoqCisgIE5vcm1hbGx5LCBhcHBs
aWNhdGlvbnMgd2lsbCB1c2UgdGhlIGBSRVNUU2VyaWFsaXplcmAgYnkgaW1wbGVtZW50aW5nCisg
IHRoZSBgbm9ybWFsaXplYCBtZXRob2QgYW5kIGluZGl2aWR1YWwgbm9ybWFsaXphdGlvbnMgdW5k
ZXIKKyAgYG5vcm1hbGl6ZUhhc2hgLgorCisgIFRoaXMgYWxsb3dzIHlvdSB0byBkbyB3aGF0ZXZl
ciBraW5kIG9mIG11bmdpbmcgeW91IG5lZWQsIGFuZCBpcworICBlc3BlY2lhbGx5IHVzZWZ1bCBp
ZiB5b3VyIHNlcnZlciBpcyBpbmNvbnNpc3RlbnQgYW5kIHlvdSBuZWVkIHRvCisgIGRvIG11bmdp
bmcgZGlmZmVyZW50bHkgZm9yIG1hbnkgZGlmZmVyZW50IGtpbmRzIG9mIHJlc3BvbnNlcy4KKwor
ICBTZWUgdGhlIGBub3JtYWxpemVgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24u
CisKKyAgIyMgQWNyb3NzIHRoZSBCb2FyZCBOb3JtYWxpemF0aW9uCisKKyAgVGhlcmUgYXJlIGFs
c28gYSBudW1iZXIgb2YgaG9va3MgdGhhdCB5b3UgbWlnaHQgZmluZCB1c2VmdWwgdG8gZGVmaW5l
ZAorICBhY3Jvc3MtdGhlLWJvYXJkIHJ1bGVzIGZvciB5b3VyIHBheWxvYWQuIFRoZXNlIHJ1bGVz
IHdpbGwgYmUgdXNlZnVsCisgIGlmIHlvdXIgc2VydmVyIGlzIGNvbnNpc3RlbnQsIG9yIGlmIHlv
dSdyZSBidWlsZGluZyBhbiBhZGFwdGVyIGZvcgorICBhbiBpbmZyYXN0cnVjdHVyZSBzZXJ2aWNl
LCBsaWtlIFBhcnNlLCBhbmQgd2FudCB0byBlbmNvZGUgc2VydmljZQorICBjb252ZW50aW9ucy4K
KworICBGb3IgZXhhbXBsZSwgaWYgYWxsIG9mIHlvdXIga2V5cyBhcmUgdW5kZXJzY29yZWQgYW5k
IGFsbC1jYXBzLCBidXQKKyAgb3RoZXJ3aXNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgbmFtZXMgeW91
IHVzZSBpbiB5b3VyIG1vZGVscywgeW91CisgIGNhbiBpbXBsZW1lbnQgYWNyb3NzLXRoZS1ib2Fy
ZCBydWxlcyBmb3IgaG93IHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlCisgIG5hbWUgaW4geW91ciBt
b2RlbCB0byBhIGtleSBpbiB5b3VyIEpTT04uCisKKyAgYGBganMKKyAgQXBwLkFwcGxpY2F0aW9u
U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7CisgICAga2V5Rm9yQXR0cmli
dXRlOiBmdW5jdGlvbihhdHRyKSB7CisgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2Nv
cmUoYXR0cikudG9VcHBlckNhc2UoKTsKKyAgICB9CisgIH0pOworICBgYGAKKworICBZb3UgY2Fu
IGFsc28gaW1wbGVtZW50IGBrZXlGb3JSZWxhdGlvbnNoaXBgLCB3aGljaCB0YWtlcyB0aGUgbmFt
ZQorICBvZiB0aGUgcmVsYXRpb25zaGlwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFuZCB0aGUg
a2luZCBvZgorICByZWxhdGlvbnNoaXAgKGBoYXNNYW55YCBvciBgYmVsb25nc1RvYCkgYXMgdGhl
IHNlY29uZCBwYXJhbWV0ZXIuCisKKyAgQGNsYXNzIFJFU1RTZXJpYWxpemVyCisgIEBuYW1lc3Bh
Y2UgRFMKKyAgQGV4dGVuZHMgRFMuSlNPTlNlcmlhbGl6ZXIKKyovCitEUy5SRVNUU2VyaWFsaXpl
ciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7CisgIC8qKgorICAgIElmIHlvdSB3YW50IHRv
IGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwg
eW91CisgICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hgLgorCisgICAg
Rm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcganNvbiB3aGVyZSB0aGUgdGhlIGBJRHNg
IHVuZGVyCisgICAgYCJjb21tZW50cyJgIGFyZSBwcm92aWRlZCBhcyBgX2lkYCBpbnN0ZWFkIG9m
IGBpZGAuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeworICAgICAgInBvc3QiOiB7CisgICAg
ICAgICJpZCI6IDEsCisgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKKyAgICAg
ICAgImNvbW1lbnRzIjogWyAxLCAyIF0KKyAgICAgIH0sCisgICAgICAiY29tbWVudHMiOiBbewor
ICAgICAgICAiX2lkIjogMSwKKyAgICAgICAgImJvZHkiOiAiRklSU1QiCisgICAgICB9LCB7Cisg
ICAgICAgICJfaWQiOiAyLAorICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKKyAgICAg
IH1dCisgICAgfQorICAgIGBgYAorCisgICAgWW91IHVzZSBgbm9ybWFsaXplSGFzaGAgdG8gbm9y
bWFsaXplIGp1c3QgdGhlIGNvbW1lbnRzOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Q
b3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7CisgICAgICBub3JtYWxp
emVIYXNoOiB7CisgICAgICAgIGNvbW1lbnRzOiBmdW5jdGlvbihoYXNoKSB7CisgICAgICAgICAg
aGFzaC5pZCA9IGhhc2guX2lkOworICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKKyAgICAgICAg
ICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisg
ICAgVGhlIGtleSB1bmRlciBgbm9ybWFsaXplSGFzaGAgaXMgdXN1YWxseSBqdXN0IHRoZSBvcmln
aW5hbCBrZXkKKyAgICB0aGF0IHdhcyBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZC4gSG93ZXZlciwg
a2V5IG5hbWVzIHdpbGwgYmUKKyAgICBpbXBhY3RlZCBieSBhbnkgbW9kaWZpY2F0aW9ucyBkb25l
IGluIHRoZSBgbm9ybWFsaXplUGF5bG9hZGAKKyAgICBtZXRob2QuIFRoZSBgRFMuUkVTVFNlcmlh
bGl6ZXJgJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBubworICAgIGNoYW5nZXMgdG8g
dGhlIHBheWxvYWQga2V5cy4KKworICAgIEBwcm9wZXJ0eSBub3JtYWxpemVIYXNoCisgICAgQHR5
cGUge09iamVjdH0KKyAgICBAZGVmYXVsdCB1bmRlZmluZWQKKyAgKi8KKworICAvKioKKyAgICBO
b3JtYWxpemVzIGEgcGFydCBvZiB0aGUgSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5CisgICAgdGhl
IHNlcnZlci4gWW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgbXVuZ2UgdGhlIGhhc2gK
KyAgICBhbmQgY2FsbCBzdXBlciBpZiB5b3UgaGF2ZSBnZW5lcmljIG5vcm1hbGl6YXRpb24gdG8g
ZG8uCisKKyAgICBJdCB0YWtlcyB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHRoYXQgaXMgYmVpbmcg
bm9ybWFsaXplZAorICAgIChhcyBhIERTLk1vZGVsIGNsYXNzKSwgdGhlIHByb3BlcnR5IHdoZXJl
IHRoZSBoYXNoIHdhcworICAgIG9yaWdpbmFsbHkgZm91bmQsIGFuZCB0aGUgaGFzaCB0byBub3Jt
YWxpemUuCisKKyAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXlsb2FkIHRoYXQgbG9v
a3MgbGlrZSB0aGlzOgorCisgICAgYGBganMKKyAgICB7CisgICAgICAicG9zdCI6IHsKKyAgICAg
ICAgImlkIjogMSwKKyAgICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAorICAgICAg
ICAiY29tbWVudHMiOiBbIDEsIDIgXQorICAgICAgfSwKKyAgICAgICJjb21tZW50cyI6IFt7Cisg
ICAgICAgICJpZCI6IDEsCisgICAgICAgICJib2R5IjogIkZJUlNUIgorICAgICAgfSwgeworICAg
ICAgICAiaWQiOiAyLAorICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKKyAgICAgIH1d
CisgICAgfQorICAgIGBgYAorCisgICAgVGhlIGBub3JtYWxpemVgIG1ldGhvZCB3aWxsIGJlIGNh
bGxlZCB0aHJlZSB0aW1lczoKKworICAgICogV2l0aCBgQXBwLlBvc3RgLCBgInBvc3RzImAgYW5k
IGB7IGlkOiAxLCB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiLCAuLi4gfWAKKyAgICAqIFdpdGgg
YEFwcC5Db21tZW50YCwgYCJjb21tZW50cyJgIGFuZCBgeyBpZDogMSwgYm9keTogIkZJUlNUIiB9
YAorICAgICogV2l0aCBgQXBwLkNvbW1lbnRgLCBgImNvbW1lbnRzImAgYW5kIGB7IGlkOiAyLCBi
b2R5OiAiUmFpbHMgaXMgdW5hZ2kiIH1gCisKKyAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCwg
Zm9yIGV4YW1wbGUsIHRvIG5vcm1hbGl6ZSB1bmRlcnNjb3JlZCBrZXlzIHRvIGNhbWVsaXplZAor
ICAgIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSBub3JtYWxpemF0aW9ucy4KKworICAgIElmIHlv
dSB3YW50IHRvIGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUg
cGF5bG9hZCwgeW91CisgICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hg
LgorCisgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBgSURzYCB1bmRlciBgImNvbW1lbnRzImAgYXJl
IHByb3ZpZGVkIGFzIGBfaWRgIGluc3RlYWQgb2YKKyAgICBgaWRgLCB5b3UgY2FuIHNwZWNpZnkg
aG93IHRvIG5vcm1hbGl6ZSBqdXN0IHRoZSBjb21tZW50czoKKworICAgIGBgYGpzCisgICAgQXBw
LlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKKyAgICAgIG5vcm1h
bGl6ZUhhc2g6IHsKKyAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9uKGhhc2gpIHsKKyAgICAgICAg
ICBoYXNoLmlkID0gaGFzaC5faWQ7CisgICAgICAgICAgZGVsZXRlIGhhc2guX2lkOworICAgICAg
ICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisK
KyAgICBUaGUga2V5IHVuZGVyIGBub3JtYWxpemVIYXNoYCBpcyBqdXN0IHRoZSBvcmlnaW5hbCBr
ZXkgdGhhdCB3YXMgaW4gdGhlIG9yaWdpbmFsCisgICAgcGF5bG9hZC4KKworICAgIEBtZXRob2Qg
bm9ybWFsaXplCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBw
YXJhbSB7T2JqZWN0fSBoYXNoCisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3AKKyAgICBAcmV0dXJu
cyB7T2JqZWN0fQorICAqLworICBub3JtYWxpemU6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIHByb3Ap
IHsKKyAgICB0aGlzLm5vcm1hbGl6ZUlkKGhhc2gpOworICAgIHRoaXMubm9ybWFsaXplQXR0cmli
dXRlcyh0eXBlLCBoYXNoKTsKKyAgICB0aGlzLm5vcm1hbGl6ZVJlbGF0aW9uc2hpcHModHlwZSwg
aGFzaCk7CisKKyAgICB0aGlzLm5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nKHR5cGUsIGhh
c2gpOworCisgICAgaWYgKHRoaXMubm9ybWFsaXplSGFzaCAmJiB0aGlzLm5vcm1hbGl6ZUhhc2hb
cHJvcF0pIHsKKyAgICAgIHRoaXMubm9ybWFsaXplSGFzaFtwcm9wXShoYXNoKTsKKyAgICB9CisK
KyAgICByZXR1cm4gdGhpcy5fc3VwZXIodHlwZSwgaGFzaCwgcHJvcCk7CisgIH0sCisKKyAgLyoq
CisgICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm9ybWFsaXplIGFsbCBwYXlsb2Fkcywg
cmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkKKyAgICByZXByZXNlbnQgc2luZ2xlIHJlY29yZHMg
b3IgYW4gYXJyYXkuCisKKyAgICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcmVtb3Zl
IHNvbWUgZXh0cmFuZW91cyBkYXRhIGZyb20gdGhlIHBheWxvYWQ6CisKKyAgICBgYGBqcworICAg
IEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewor
ICAgICAgbm9ybWFsaXplUGF5bG9hZDogZnVuY3Rpb24odHlwZSwgcGF5bG9hZCkgeworICAgICAg
ICBkZWxldGUgcGF5bG9hZC52ZXJzaW9uOworICAgICAgICBkZWxldGUgcGF5bG9hZC5zdGF0dXM7
CisgICAgICAgIHJldHVybiBwYXlsb2FkOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisg
ICAgQG1ldGhvZCBub3JtYWxpemVQYXlsb2FkCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCisgICAgQHJldHVybnMge09iamVj
dH0gdGhlIG5vcm1hbGl6ZWQgcGF5bG9hZAorICAqLworICBub3JtYWxpemVQYXlsb2FkOiBmdW5j
dGlvbih0eXBlLCBwYXlsb2FkKSB7CisgICAgcmV0dXJuIHBheWxvYWQ7CisgIH0sCisKKyAgLyoq
CisgICAgQG1ldGhvZCBub3JtYWxpemVJZAorICAgIEBwcml2YXRlCisgICovCisgIG5vcm1hbGl6
ZUlkOiBmdW5jdGlvbihoYXNoKSB7CisgICAgdmFyIHByaW1hcnlLZXkgPSBnZXQodGhpcywgJ3By
aW1hcnlLZXknKTsKKworICAgIGlmIChwcmltYXJ5S2V5ID09PSAnaWQnKSB7IHJldHVybjsgfQor
CisgICAgaGFzaC5pZCA9IGhhc2hbcHJpbWFyeUtleV07CisgICAgZGVsZXRlIGhhc2hbcHJpbWFy
eUtleV07CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBub3JtYWxpemVVc2luZ0RlY2xhcmVk
TWFwcGluZworICAgIEBwcml2YXRlCisgICovCisgIG5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBw
aW5nOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CisgICAgdmFyIGF0dHJzID0gZ2V0KHRoaXMsICdh
dHRycycpLCBwYXlsb2FkS2V5LCBrZXk7CisKKyAgICBpZiAoYXR0cnMpIHsKKyAgICAgIGZvciAo
a2V5IGluIGF0dHJzKSB7CisgICAgICAgIHBheWxvYWRLZXkgPSBhdHRyc1trZXldOworICAgICAg
ICBpZiAocGF5bG9hZEtleSAmJiBwYXlsb2FkS2V5LmtleSkgeworICAgICAgICAgIHBheWxvYWRL
ZXkgPSBwYXlsb2FkS2V5LmtleTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZW9mIHBheWxv
YWRLZXkgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgaGFzaFtrZXldID0gaGFzaFtwYXlsb2Fk
S2V5XTsKKyAgICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIG5vcm1hbGl6ZUF0dHJpYnV0
ZXMKKyAgICBAcHJpdmF0ZQorICAqLworICBub3JtYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbih0
eXBlLCBoYXNoKSB7CisgICAgdmFyIHBheWxvYWRLZXksIGtleTsKKworICAgIGlmICh0aGlzLmtl
eUZvckF0dHJpYnV0ZSkgeworICAgICAgdHlwZS5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSkg
eworICAgICAgICBwYXlsb2FkS2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKKyAgICAg
ICAgaWYgKGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KKworICAgICAgICBoYXNoW2tl
eV0gPSBoYXNoW3BheWxvYWRLZXldOworICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsK
KyAgICAgIH0sIHRoaXMpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIG5vcm1h
bGl6ZVJlbGF0aW9uc2hpcHMKKyAgICBAcHJpdmF0ZQorICAqLworICBub3JtYWxpemVSZWxhdGlv
bnNoaXBzOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CisgICAgdmFyIHBheWxvYWRLZXksIGtleTsK
KworICAgIGlmICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgeworICAgICAgdHlwZS5lYWNoUmVs
YXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7CisgICAgICAgIHBheWxvYWRL
ZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKKyAg
ICAgICAgaWYgKGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KKworICAgICAgICBoYXNo
W2tleV0gPSBoYXNoW3BheWxvYWRLZXldOworICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5
XTsKKyAgICAgIH0sIHRoaXMpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBDYWxsZWQgd2hl
biB0aGUgc2VydmVyIGhhcyByZXR1cm5lZCBhIHBheWxvYWQgcmVwcmVzZW50aW5nCisgICAgYSBz
aW5nbGUgcmVjb3JkLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRgIG9yIGBzYXZlYC4K
KworICAgIEl0IGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdXAgdGhlIHNlcnZlcidzIHJl
c3BvbnNlIGludG8gdGhlIG5vcm1hbGl6ZWQKKyAgICBmb3JtIGV4cGVjdGVkIGJ5IEVtYmVyIERh
dGEuCisKKyAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBqdXN0IHJlc3RydWN0dXJlIHRoZSB0b3At
bGV2ZWwgb2YgeW91ciBwYXlsb2FkLCBhbmQKKyAgICBkbyBtb3JlIGZpbmUtZ3JhaW5lZCBub3Jt
YWxpemF0aW9uIGluIHRoZSBgbm9ybWFsaXplYCBtZXRob2QuCisKKyAgICBGb3IgZXhhbXBsZSwg
aWYgeW91IGhhdmUgYSBwYXlsb2FkIGxpa2UgdGhpcyBpbiByZXNwb25zZSB0byBhIHJlcXVlc3Qg
Zm9yCisgICAgcG9zdCAxOgorCisgICAgYGBganMKKyAgICB7CisgICAgICAiaWQiOiAxLAorICAg
ICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAorCisgICAgICAiX2VtYmVkZGVkIjogewor
ICAgICAgICAiY29tbWVudCI6IFt7CisgICAgICAgICAgIl9pZCI6IDEsCisgICAgICAgICAgImNv
bW1lbnRfdGl0bGUiOiAiRklSU1QiCisgICAgICAgIH0sIHsKKyAgICAgICAgICAiX2lkIjogMiwK
KyAgICAgICAgICAiY29tbWVudF90aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIKKyAgICAgICAgfV0K
KyAgICAgIH0KKyAgICB9CisgICAgYGBgCisKKyAgICBZb3UgY291bGQgaW1wbGVtZW50IGEgc2Vy
aWFsaXplciB0aGF0IGxvb2tzIGxpa2UgdGhpcyB0byBnZXQgeW91ciBwYXlsb2FkCisgICAgaW50
byBzaGFwZToKKworICAgIGBgYGpzCisgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNl
cmlhbGl6ZXIuZXh0ZW5kKHsKKyAgICAgIC8vIEZpcnN0LCByZXN0cnVjdHVyZSB0aGUgdG9wLWxl
dmVsIHNvIGl0J3Mgb3JnYW5pemVkIGJ5IHR5cGUKKyAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0
aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsKKyAgICAgICAgdmFy
IGNvbW1lbnRzID0gcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudDsKKyAgICAgICAgZGVsZXRlIHBh
eWxvYWQuX2VtYmVkZGVkOworCisgICAgICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50
cywgcG9zdDogcGF5bG9hZCB9OworICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5
cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7CisgICAgICB9LAorCisgICAgICBub3JtYWxp
emVIYXNoOiB7CisgICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRz
LCB3aGljaCAoYWZ0ZXIgYGV4dHJhY3RgKQorICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5k
ZXIgYGNvbW1lbnRzYAorICAgICAgICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgeworICAgICAg
ICAgIGhhc2guaWQgPSBoYXNoLl9pZDsKKyAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21t
ZW50X3RpdGxlOworICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKKyAgICAgICAgICBkZWxldGUg
aGFzaC5jb21tZW50X3RpdGxlOworICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfSkKKyAgICBgYGAKKworICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5
b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdFNpbmdsZWAsIHRoZQorICAgIGJ1aWx0
LWluIGltcGxlbWVudGF0aW9uIHdpbGwgZmluZCB0aGUgcHJpbWFyeSByZWNvcmQgaW4geW91ciBu
b3JtYWxpemVkCisgICAgcGF5bG9hZCBhbmQgcHVzaCB0aGUgcmVtYWluaW5nIHJlY29yZHMgaW50
byB0aGUgc3RvcmUuCisKKyAgICBUaGUgcHJpbWFyeSByZWNvcmQgaXMgdGhlIHNpbmdsZSBoYXNo
IGZvdW5kIHVuZGVyIGBwb3N0YCBvciB0aGUgZmlyc3QKKyAgICBlbGVtZW50IG9mIHRoZSBgcG9z
dHNgIGFycmF5LgorCisgICAgVGhlIHByaW1hcnkgcmVjb3JkIGhhcyBzcGVjaWFsIG1lYW5pbmcg
d2hlbiB0aGUgcmVjb3JkIGlzIGJlaW5nIGNyZWF0ZWQKKyAgICBmb3IgdGhlIGZpcnN0IHRpbWUg
b3IgdXBkYXRlZCAoYGNyZWF0ZVJlY29yZGAgb3IgYHVwZGF0ZVJlY29yZGApLiBJbgorICAgIHBh
cnRpY3VsYXIsIGl0IHdpbGwgdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZWNvcmQgdGhh
dCB3YXMgc2F2ZWQuCisKKyAgICBAbWV0aG9kIGV4dHJhY3RTaW5nbGUKKyAgICBAcGFyYW0ge0RT
LlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAg
ICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAorICAgIEBwYXJhbSB7U3RyaW5nfSBpZAorICAgIEBw
YXJhbSB7J2ZpbmQnfCdjcmVhdGVSZWNvcmQnfCd1cGRhdGVSZWNvcmQnfCdkZWxldGVSZWNvcmQn
fSByZXF1ZXN0VHlwZQorICAgIEByZXR1cm5zIHtPYmplY3R9IHRoZSBwcmltYXJ5IHJlc3BvbnNl
IHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0CisgICovCisgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9u
KHN0b3JlLCBwcmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7Cisg
ICAgcGF5bG9hZCA9IHRoaXMubm9ybWFsaXplUGF5bG9hZChwcmltYXJ5VHlwZSwgcGF5bG9hZCk7
CisKKyAgICB2YXIgcHJpbWFyeVR5cGVOYW1lID0gcHJpbWFyeVR5cGUudHlwZUtleSwKKyAgICAg
ICAgcHJpbWFyeVJlY29yZDsKKworICAgIGZvciAodmFyIHByb3AgaW4gcGF5bG9hZCkgeworICAg
ICAgdmFyIHR5cGVOYW1lICA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCisgICAgICAgICAgdHlw
ZSA9IHN0b3JlLm1vZGVsRm9yKHR5cGVOYW1lKSwKKyAgICAgICAgICBpc1ByaW1hcnkgPSB0eXBl
LnR5cGVLZXkgPT09IHByaW1hcnlUeXBlTmFtZTsKKworICAgICAgLy8gbGVnYWN5IHN1cHBvcnQg
Zm9yIHNpbmd1bGFyIHJlc291cmNlcworICAgICAgaWYgKGlzUHJpbWFyeSAmJiBFbWJlci50eXBl
T2YocGF5bG9hZFtwcm9wXSkgIT09ICJhcnJheSIgKSB7CisgICAgICAgIHByaW1hcnlSZWNvcmQg
PSB0aGlzLm5vcm1hbGl6ZShwcmltYXJ5VHlwZSwgcGF5bG9hZFtwcm9wXSwgcHJvcCk7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8K
KyAgICAgIGZvckVhY2guY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7CisgICAg
ICAgIHZhciB0eXBlTmFtZSA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCisgICAgICAgICAgICB0
eXBlID0gc3RvcmUubW9kZWxGb3IodHlwZU5hbWUpLAorICAgICAgICAgICAgdHlwZVNlcmlhbGl6
ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUpOworCisgICAgICAgIGhhc2ggPSB0eXBlU2Vy
aWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7CisKKyAgICAgICAgdmFyIGlzRmly
c3RDcmVhdGVkUmVjb3JkID0gaXNQcmltYXJ5ICYmICFyZWNvcmRJZCAmJiAhcHJpbWFyeVJlY29y
ZCwKKyAgICAgICAgICAgIGlzVXBkYXRlZFJlY29yZCA9IGlzUHJpbWFyeSAmJiBjb2VyY2VJZCho
YXNoLmlkKSA9PT0gcmVjb3JkSWQ7CisKKyAgICAgICAgLy8gZmluZCB0aGUgcHJpbWFyeSByZWNv
cmQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEl0J3MgZWl0aGVyOgorICAgICAgICAvLyAqIHRo
ZSByZWNvcmQgd2l0aCB0aGUgc2FtZSBJRCBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdAorICAgICAg
ICAvLyAqIGluIHRoZSBjYXNlIG9mIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgdGhhdCBkaWRuJ3Qg
aGF2ZSBhbiBJRCwgdGhlIGZpcnN0CisgICAgICAgIC8vICAgcmVjb3JkIGluIHRoZSBBcnJheQor
ICAgICAgICBpZiAoaXNGaXJzdENyZWF0ZWRSZWNvcmQgfHwgaXNVcGRhdGVkUmVjb3JkKSB7Cisg
ICAgICAgICAgcHJpbWFyeVJlY29yZCA9IGhhc2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgc3RvcmUucHVzaCh0eXBlTmFtZSwgaGFzaCk7CisgICAgICAgIH0KKyAgICAgIH0sIHRoaXMp
OworICAgIH0KKworICAgIHJldHVybiBwcmltYXJ5UmVjb3JkOworICB9LAorCisgIC8qKgorICAg
IENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkIGEgcGF5bG9hZCByZXByZXNlbnRp
bmcKKyAgICBtdWx0aXBsZSByZWNvcmRzLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRB
bGxgIG9yIGBmaW5kUXVlcnlgLgorCisgICAgSXQgaXMgeW91ciBvcHBvcnR1bml0eSB0byBjbGVh
biB1cCB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgaW50byB0aGUgbm9ybWFsaXplZAorICAgIGZvcm0g
ZXhwZWN0ZWQgYnkgRW1iZXIgRGF0YS4KKworICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGp1c3Qg
cmVzdHJ1Y3R1cmUgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIHBheWxvYWQsIGFuZAorICAgIGRvIG1v
cmUgZmluZS1ncmFpbmVkIG5vcm1hbGl6YXRpb24gaW4gdGhlIGBub3JtYWxpemVgIG1ldGhvZC4K
KworICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBheWxvYWQgbGlrZSB0aGlzIGluIHJl
c3BvbnNlIHRvIGEgcmVxdWVzdCBmb3IKKyAgICBhbGwgcG9zdHM6CisKKyAgICBgYGBqcworICAg
IHsKKyAgICAgICJfZW1iZWRkZWQiOiB7CisgICAgICAgICJwb3N0IjogW3sKKyAgICAgICAgICAi
aWQiOiAxLAorICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIgorICAgICAgICB9
LCB7CisgICAgICAgICAgImlkIjogMiwKKyAgICAgICAgICAidGl0bGUiOiAiVGhlIFBhcmxleSBM
ZXR0ZXIiCisgICAgICAgIH1dLAorICAgICAgICAiY29tbWVudCI6IFt7CisgICAgICAgICAgIl9p
ZCI6IDEsCisgICAgICAgICAgImNvbW1lbnRfdGl0bGUiOiAiUmFpbHMgaXMgdW5hZ2kiCisgICAg
ICAgICAgInBvc3RfaWQiOiAxCisgICAgICAgIH0sIHsKKyAgICAgICAgICAiX2lkIjogMiwKKyAg
ICAgICAgICAiY29tbWVudF90aXRsZSI6ICJEb24ndCB0cmVhZCBvbiBtZSIsCisgICAgICAgICAg
InBvc3RfaWQiOiAyCisgICAgICAgIH1dCisgICAgICB9CisgICAgfQorICAgIGBgYAorCisgICAg
WW91IGNvdWxkIGltcGxlbWVudCBhIHNlcmlhbGl6ZXIgdGhhdCBsb29rcyBsaWtlIHRoaXMgdG8g
Z2V0IHlvdXIgcGF5bG9hZAorICAgIGludG8gc2hhcGU6CisKKyAgICBgYGBqcworICAgIEFwcC5Q
b3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7CisgICAgICAvLyBGaXJz
dCwgcmVzdHJ1Y3R1cmUgdGhlIHRvcC1sZXZlbCBzbyBpdCdzIG9yZ2FuaXplZCBieSB0eXBlCisg
ICAgICAvLyBhbmQgdGhlIGNvbW1lbnRzIGFyZSBsaXN0ZWQgdW5kZXIgYSBwb3N0J3MgYGNvbW1l
bnRzYCBrZXkuCisgICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXls
b2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsKKyAgICAgICAgdmFyIHBvc3RzID0gcGF5bG9hZC5fZW1i
ZWRkZWQucG9zdDsKKyAgICAgICAgdmFyIGNvbW1lbnRzID0gW107CisgICAgICAgIHZhciBwb3N0
Q2FjaGUgPSB7fTsKKworICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1bmN0aW9uKHBvc3QpIHsKKyAg
ICAgICAgICBwb3N0LmNvbW1lbnRzID0gW107CisgICAgICAgICAgcG9zdENhY2hlW3Bvc3QuaWRd
ID0gcG9zdDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVu
dC5mb3JFYWNoKGZ1bmN0aW9uKGNvbW1lbnQpIHsKKyAgICAgICAgICBjb21tZW50cy5wdXNoKGNv
bW1lbnQpOworICAgICAgICAgIHBvc3RDYWNoZVtjb21tZW50LnBvc3RfaWRdLmNvbW1lbnRzLnB1
c2goY29tbWVudCk7CisgICAgICAgICAgZGVsZXRlIGNvbW1lbnQucG9zdF9pZDsKKyAgICAgICAg
fQorCisgICAgICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdHM6IHBheWxv
YWQgfTsKKworICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQs
IGlkLCByZXF1ZXN0VHlwZSk7CisgICAgICB9LAorCisgICAgICBub3JtYWxpemVIYXNoOiB7Cisg
ICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAoYWZ0
ZXIgYGV4dHJhY3RgKQorICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1lbnRz
YAorICAgICAgICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgeworICAgICAgICAgIGhhc2guaWQg
PSBoYXNoLl9pZDsKKyAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxlOwor
ICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKKyAgICAgICAgICBkZWxldGUgaGFzaC5jb21tZW50
X3RpdGxlOworICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgICB9CisgICAg
fSkKKyAgICBgYGAKKworICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBpbXBs
ZW1lbnRhdGlvbiBvZiBgZXh0cmFjdEFycmF5YCwgdGhlCisgICAgYnVpbHQtaW4gaW1wbGVtZW50
YXRpb24gd2lsbCBmaW5kIHRoZSBwcmltYXJ5IGFycmF5IGluIHlvdXIgbm9ybWFsaXplZAorICAg
IHBheWxvYWQgYW5kIHB1c2ggdGhlIHJlbWFpbmluZyByZWNvcmRzIGludG8gdGhlIHN0b3JlLgor
CisgICAgVGhlIHByaW1hcnkgYXJyYXkgaXMgdGhlIGFycmF5IGZvdW5kIHVuZGVyIGBwb3N0c2Au
CisKKyAgICBUaGUgcHJpbWFyeSByZWNvcmQgaGFzIHNwZWNpYWwgbWVhbmluZyB3aGVuIHJlc3Bv
bmRpbmcgdG8gYGZpbmRRdWVyeWAKKyAgICBvciBgZmluZEhhc01hbnlgLiBJbiBwYXJ0aWN1bGFy
LCB0aGUgcHJpbWFyeSBhcnJheSB3aWxsIGJlY29tZSB0aGUKKyAgICBsaXN0IG9mIHJlY29yZHMg
aW4gdGhlIHJlY29yZCBhcnJheSB0aGF0IGtpY2tlZCBvZmYgdGhlIHJlcXVlc3QuCisKKyAgICBJ
ZiB5b3VyIHByaW1hcnkgYXJyYXkgY29udGFpbnMgc2Vjb25kYXJ5IChlbWJlZGRlZCkgcmVjb3Jk
cyBvZiB0aGUgc2FtZSB0eXBlLAorICAgIHlvdSBjYW5ub3QgcGxhY2UgdGhlc2UgaW50byB0aGUg
cHJpbWFyeSBhcnJheSBgcG9zdHNgLiBJbnN0ZWFkLCBwbGFjZSB0aGUKKyAgICBzZWNvbmRhcnkg
aXRlbXMgaW50byBhbiB1bmRlcnNjb3JlIHByZWZpeGVkIHByb3BlcnR5IGBfcG9zdHNgLCB3aGlj
aCB3aWxsCisgICAgcHVzaCB0aGVzZSBpdGVtcyBpbnRvIHRoZSBzdG9yZSBhbmQgd2lsbCBub3Qg
YWZmZWN0IHRoZSByZXN1bHRpbmcgcXVlcnkuCisKKyAgICBAbWV0aG9kIGV4dHJhY3RBcnJheQor
ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCisgICAgQHBhcmFtIHsnZmlu
ZEFsbCd8J2ZpbmRNYW55J3wnZmluZEhhc01hbnknfCdmaW5kUXVlcnknfSByZXF1ZXN0VHlwZQor
ICAgIEByZXR1cm5zIHtBcnJheX0gVGhlIHByaW1hcnkgYXJyYXkgdGhhdCB3YXMgcmV0dXJuZWQg
aW4gcmVzcG9uc2UKKyAgICAgIHRvIHRoZSBvcmlnaW5hbCBxdWVyeS4KKyAgKi8KKyAgZXh0cmFj
dEFycmF5OiBmdW5jdGlvbihzdG9yZSwgcHJpbWFyeVR5cGUsIHBheWxvYWQpIHsKKyAgICBwYXls
b2FkID0gdGhpcy5ub3JtYWxpemVQYXlsb2FkKHByaW1hcnlUeXBlLCBwYXlsb2FkKTsKKworICAg
IHZhciBwcmltYXJ5VHlwZU5hbWUgPSBwcmltYXJ5VHlwZS50eXBlS2V5LAorICAgICAgICBwcmlt
YXJ5QXJyYXk7CisKKyAgICBmb3IgKHZhciBwcm9wIGluIHBheWxvYWQpIHsKKyAgICAgIHZhciB0
eXBlS2V5ID0gcHJvcCwKKyAgICAgICAgICBmb3JjZWRTZWNvbmRhcnkgPSBmYWxzZTsKKworICAg
ICAgaWYgKHByb3AuY2hhckF0KDApID09PSAnXycpIHsKKyAgICAgICAgZm9yY2VkU2Vjb25kYXJ5
ID0gdHJ1ZTsKKyAgICAgICAgdHlwZUtleSA9IHByb3Auc3Vic3RyKDEpOworICAgICAgfQorCisg
ICAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHR5cGVLZXkpLAorICAgICAgICAg
IHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSksCisgICAgICAgICAgdHlwZVNlcmlhbGl6
ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUpLAorICAgICAgICAgIGlzUHJpbWFyeSA9ICgh
Zm9yY2VkU2Vjb25kYXJ5ICYmICh0eXBlLnR5cGVLZXkgPT09IHByaW1hcnlUeXBlTmFtZSkpOwor
CisgICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KKyAgICAgIHZhciBub3JtYWxpemVkQXJy
YXkgPSBtYXAuY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7CisgICAgICAgIHJl
dHVybiB0eXBlU2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7CisgICAgICB9
LCB0aGlzKTsKKworICAgICAgaWYgKGlzUHJpbWFyeSkgeworICAgICAgICBwcmltYXJ5QXJyYXkg
PSBub3JtYWxpemVkQXJyYXk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdG9yZS5wdXNoTWFu
eSh0eXBlTmFtZSwgbm9ybWFsaXplZEFycmF5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gcHJpbWFyeUFycmF5OworICB9LAorCisgIC8qKgorICAgIFRoaXMgbWV0aG9kIGFsbG93cyB5
b3UgdG8gcHVzaCBhIHBheWxvYWQgY29udGFpbmluZyB0b3AtbGV2ZWwKKyAgICBjb2xsZWN0aW9u
cyBvZiByZWNvcmRzIG9yZ2FuaXplZCBwZXIgdHlwZS4KKworICAgIGBgYGpzCisgICAgeworICAg
ICAgInBvc3RzIjogW3sKKyAgICAgICAgImlkIjogIjEiLAorICAgICAgICAidGl0bGUiOiAiUmFp
bHMgaXMgb21ha2FzZSIsCisgICAgICAgICJhdXRob3IiLCAiMSIsCisgICAgICAgICJjb21tZW50
cyI6IFsgIjEiIF0KKyAgICAgIH1dLAorICAgICAgImNvbW1lbnRzIjogW3sKKyAgICAgICAgImlk
IjogIjEiLAorICAgICAgICAiYm9keSI6ICJGSVJTVCIKKyAgICAgIH1dLAorICAgICAgInVzZXJz
IjogW3sKKyAgICAgICAgImlkIjogIjEiLAorICAgICAgICAibmFtZSI6ICJAZDJoIgorICAgICAg
fV0KKyAgICB9CisgICAgYGBgCisKKyAgICBJdCB3aWxsIGZpcnN0IG5vcm1hbGl6ZSB0aGUgcGF5
bG9hZCwgc28geW91IGNhbiB1c2UgdGhpcyB0byBwdXNoCisgICAgaW4gZGF0YSBzdHJlYW1pbmcg
aW4gZnJvbSB5b3VyIHNlcnZlciBzdHJ1Y3R1cmVkIHRoZSBzYW1lIHdheQorICAgIHRoYXQgZmV0
Y2hlcyBhbmQgc2F2ZXMgYXJlIHN0cnVjdHVyZWQuCisKKyAgICBAbWV0aG9kIHB1c2hQYXlsb2Fk
CisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9h
ZAorICAqLworICBwdXNoUGF5bG9hZDogZnVuY3Rpb24oc3RvcmUsIHBheWxvYWQpIHsKKyAgICBw
YXlsb2FkID0gdGhpcy5ub3JtYWxpemVQYXlsb2FkKG51bGwsIHBheWxvYWQpOworCisgICAgZm9y
ICh2YXIgcHJvcCBpbiBwYXlsb2FkKSB7CisgICAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLnR5cGVG
b3JSb290KHByb3ApLAorICAgICAgICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSk7
CisKKyAgICAgIC8qanNoaW50IGxvb3BmdW5jOnRydWUqLworICAgICAgdmFyIG5vcm1hbGl6ZWRB
cnJheSA9IG1hcC5jYWxsKEVtYmVyLm1ha2VBcnJheShwYXlsb2FkW3Byb3BdKSwgZnVuY3Rpb24o
aGFzaCkgeworICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7
CisgICAgICB9LCB0aGlzKTsKKworICAgICAgc3RvcmUucHVzaE1hbnkodHlwZU5hbWUsIG5vcm1h
bGl6ZWRBcnJheSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIFlvdSBjYW4gdXNlIHRoaXMg
bWV0aG9kIHRvIG5vcm1hbGl6ZSB0aGUgSlNPTiByb290IGtleXMgcmV0dXJuZWQKKyAgICBpbnRv
IHRoZSBtb2RlbCB0eXBlIGV4cGVjdGVkIGJ5IHlvdXIgc3RvcmUuCisKKyAgICBGb3IgZXhhbXBs
ZSwgeW91ciBzZXJ2ZXIgbWF5IHJldHVybiB1bmRlcnNjb3JlZCByb290IGtleXMgcmF0aGVyIHRo
YW4KKyAgICB0aGUgZXhwZWN0ZWQgY2FtZWxjYXNlZCB2ZXJzaW9ucy4KKworICAgIGBgYGpzCisg
ICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7
CisgICAgICB0eXBlRm9yUm9vdDogZnVuY3Rpb24ocm9vdCkgeworICAgICAgICB2YXIgY2FtZWxp
emVkID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKHJvb3QpOworICAgICAgICByZXR1cm4gRW1iZXIu
U3RyaW5nLnNpbmd1bGFyaXplKGNhbWVsaXplZCk7CisgICAgICB9CisgICAgfSk7CisgICAgYGBg
CisKKyAgICBAbWV0aG9kIHR5cGVGb3JSb290CisgICAgQHBhcmFtIHtTdHJpbmd9IHJvb3QKKyAg
ICBAcmV0dXJucyB7U3RyaW5nfSB0aGUgbW9kZWwncyB0eXBlS2V5CisgICovCisgIHR5cGVGb3JS
b290OiBmdW5jdGlvbihyb290KSB7CisgICAgcmV0dXJuIEVtYmVyLlN0cmluZy5zaW5ndWxhcml6
ZShyb290KTsKKyAgfSwKKworICAvLyBTRVJJQUxJWkUKKworICAvKioKKyAgICBDYWxsZWQgd2hl
biBhIHJlY29yZCBpcyBzYXZlZCBpbiBvcmRlciB0byBjb252ZXJ0IHRoZQorICAgIHJlY29yZCBp
bnRvIEpTT04uCisKKyAgICBCeSBkZWZhdWx0LCBpdCBjcmVhdGVzIGEgSlNPTiBvYmplY3Qgd2l0
aCBhIGtleSBmb3IKKyAgICBlYWNoIGF0dHJpYnV0ZSBhbmQgYmVsb25nc1RvIHJlbGF0aW9uc2hp
cC4KKworICAgIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIG1vZGVsOgorCisgICAgYGBganMK
KyAgICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7CisgICAgICB0aXRsZTogRFMuYXR0
cigpLAorICAgICAgYm9keTogRFMuYXR0cigpLAorCisgICAgICBhdXRob3I6IERTLmJlbG9uZ3NU
bygndXNlcicpCisgICAgfSk7CisgICAgYGBgCisKKyAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0
aW9uIHdvdWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6CisKKyAgICBgYGBqcworICAgIHsK
KyAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIsCisgICAgICAiYm9keSI6ICJSYWlscz8g
T21ha2FzZT8gT19PIiwKKyAgICAgICJhdXRob3IiOiAxMgorICAgIH0KKyAgICBgYGAKKworICAg
IEJ5IGRlZmF1bHQsIGF0dHJpYnV0ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzLCB1bmxlc3MK
KyAgICB5b3Ugc3BlY2lmaWVkIGFuIGF0dHJpYnV0ZSB0eXBlIChgRFMuYXR0cignZGF0ZScpYCku
IElmCisgICAgeW91IHNwZWNpZnkgYSB0cmFuc2Zvcm0sIHRoZSBKYXZhU2NyaXB0IHZhbHVlIHdp
bGwgYmUKKyAgICBzZXJpYWxpemVkIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgor
CisgICAgQnkgZGVmYXVsdCwgYmVsb25ncy10byByZWxhdGlvbnNoaXBzIGFyZSBjb252ZXJ0ZWQg
aW50bworICAgIElEcyB3aGVuIGluc2VydGVkIGludG8gdGhlIEpTT04gaGFzaC4KKworICAgICMj
IElEcworCisgICAgYHNlcmlhbGl6ZWAgdGFrZXMgYW4gb3B0aW9ucyBoYXNoIHdpdGggYSBzaW5n
bGUgb3B0aW9uOgorICAgIGBpbmNsdWRlSWRgLiBJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIGBz
ZXJpYWxpemVgIHdpbGwsCisgICAgYnkgZGVmYXVsdCBpbmNsdWRlIHRoZSBJRCBpbiB0aGUgSlNP
TiBvYmplY3QgaXQgYnVpbGRzLgorCisgICAgVGhlIGFkYXB0ZXIgcGFzc2VzIGluIGBpbmNsdWRl
SWQ6IHRydWVgIHdoZW4gc2VyaWFsaXppbmcKKyAgICBhIHJlY29yZCBmb3IgYGNyZWF0ZVJlY29y
ZGAsIGJ1dCBub3QgZm9yIGB1cGRhdGVSZWNvcmRgLgorCisgICAgIyMgQ3VzdG9taXphdGlvbgor
CisgICAgWW91ciBzZXJ2ZXIgbWF5IGV4cGVjdCBhIGRpZmZlcmVudCBKU09OIGZvcm1hdCB0aGFu
IHRoZQorICAgIGJ1aWx0LWluIHNlcmlhbGl6YXRpb24gZm9ybWF0LgorCisgICAgSW4gdGhhdCBj
YXNlLCB5b3UgY2FuIGltcGxlbWVudCBgc2VyaWFsaXplYCB5b3Vyc2VsZiBhbmQKKyAgICByZXR1
cm4gYSBKU09OIGhhc2ggb2YgeW91ciBjaG9vc2luZy4KKworICAgIGBgYGpzCisgICAgQXBwLlBv
c3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKKyAgICAgIHNlcmlhbGl6
ZTogZnVuY3Rpb24ocG9zdCwgb3B0aW9ucykgeworICAgICAgICB2YXIganNvbiA9IHsKKyAgICAg
ICAgICBQT1NUX1RUTDogcG9zdC5nZXQoJ3RpdGxlJyksCisgICAgICAgICAgUE9TVF9CRFk6IHBv
c3QuZ2V0KCdib2R5JyksCisgICAgICAgICAgUE9TVF9DTVM6IHBvc3QuZ2V0KCdjb21tZW50cycp
Lm1hcFByb3BlcnR5KCdpZCcpCisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5pbmNs
dWRlSWQpIHsKKyAgICAgICAgICBqc29uLlBPU1RfSURfID0gcG9zdC5nZXQoJ2lkJyk7CisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4ganNvbjsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAK
KworICAgICMjIEN1c3RvbWl6aW5nIGFuIEFwcC1XaWRlIFNlcmlhbGl6ZXIKKworICAgIElmIHlv
dSB3YW50IHRvIGRlZmluZSBhIHNlcmlhbGl6ZXIgZm9yIHlvdXIgZW50aXJlCisgICAgYXBwbGlj
YXRpb24sIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSBgZWFjaEF0dHJpYnV0ZWAKKyAgICBh
bmQgYGVhY2hSZWxhdGlvbnNoaXBgIG9uIHRoZSByZWNvcmQuCisKKyAgICBgYGBqcworICAgIEFw
cC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoeworICAg
ICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKKyAgICAgICAgdmFyIGpz
b24gPSB7fTsKKworICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7
CisgICAgICAgICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQo
bmFtZSk7CisgICAgICAgIH0pCisKKyAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVu
Y3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5r
aW5kID09PSAnaGFzTWFueScpIHsKKyAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUo
bmFtZSldID0gcmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsKKyAgICAgICAgICB9CisgICAg
ICAgIH0pOworCisgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgeworICAgICAgICAgIGpz
b24uSURfID0gcmVjb3JkLmdldCgnaWQnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBq
c29uOworICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFt
ZShhdHRyaWJ1dGUpIHsKKyAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBw
ZXJDYXNlKCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkg
eworICAgICAgcmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSAr
ICJfSURTIjsKKyAgICB9CisgICAgYGBgCisKKyAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5l
cmF0ZSBKU09OIHRoYXQgbG9va3MgbGlrZSB0aGlzOgorCisgICAgYGBganMKKyAgICB7CisgICAg
ICAiVElUTEUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCisgICAgICAiQk9EWSI6ICJZZXAuIE9tYWth
c2UuIiwKKyAgICAgICJDT01NRU5UX0lEUyI6IFsgMSwgMiwgMyBdCisgICAgfQorICAgIGBgYAor
CisgICAgIyMgVHdlYWtpbmcgdGhlIERlZmF1bHQgSlNPTgorCisgICAgSWYgeW91IGp1c3Qgd2Fu
dCB0byBkbyBzb21lIHNtYWxsIHR3ZWFrcyBvbiB0aGUgZGVmYXVsdCBKU09OLAorICAgIHlvdSBj
YW4gY2FsbCBzdXBlciBmaXJzdCBhbmQgbWFrZSB0aGUgdHdlYWtzIG9uIHRoZSByZXR1cm5lZAor
ICAgIEpTT04uCisKKyAgICBgYGBqcworICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RT
ZXJpYWxpemVyLmV4dGVuZCh7CisgICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0
aW9ucykgeworICAgICAgICB2YXIganNvbiA9IHRoaXMuX3N1cGVyKHJlY29yZCwgb3B0aW9ucyk7
CisKKyAgICAgICAganNvbi5zdWJqZWN0ID0ganNvbi50aXRsZTsKKyAgICAgICAgZGVsZXRlIGpz
b24udGl0bGU7CisKKyAgICAgICAgcmV0dXJuIGpzb247CisgICAgICB9CisgICAgfSk7CisgICAg
YGBgCisKKyAgICBAbWV0aG9kIHNlcmlhbGl6ZQorICAgIEBwYXJhbSByZWNvcmQKKyAgICBAcGFy
YW0gb3B0aW9ucworICAqLworICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykg
eworICAgIHJldHVybiB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9LAor
CisgIC8qKgorICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgcm9v
dCBrZXlzIHNlcmlhbGl6ZWQgaW50byB0aGUgSlNPTi4KKyAgICBCeSBkZWZhdWx0IHRoZSBSRVNU
IFNlcmlhbGl6ZXIgc2VuZHMgY2FtZWxpemVkIHJvb3Qga2V5cy4KKyAgICBGb3IgZXhhbXBsZSwg
eW91ciBzZXJ2ZXIgbWF5IGV4cGVjdCB1bmRlcnNjb3JlZCByb290IG9iamVjdHMuCisKKyAgICBg
YGBqcworICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5l
eHRlbmQoeworICAgICAgc2VyaWFsaXplSW50b0hhc2g6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJl
Y29yZCwgb3B0aW9ucykgeworICAgICAgICB2YXIgcm9vdCA9IEVtYmVyLlN0cmluZy5kZWNhbWVs
aXplKHR5cGUudHlwZUtleSk7CisgICAgICAgIGRhdGFbcm9vdF0gPSB0aGlzLnNlcmlhbGl6ZShy
ZWNvcmQsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhv
ZCBzZXJpYWxpemVJbnRvSGFzaAorICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCisgICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y
ZAorICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICovCisgIHNlcmlhbGl6ZUludG9IYXNo
OiBmdW5jdGlvbihoYXNoLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMpIHsKKyAgICB2YXIgcm9vdCA9
IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSh0eXBlLnR5cGVLZXkpOworICAgIGhhc2hbcm9vdF0gPSB0
aGlzLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOworICB9LAorCisgIC8qKgorICAgIFlvdSBj
YW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBob3cgcG9seW1vcnBoaWMgb2JqZWN0cyBh
cmUgc2VyaWFsaXplZC4KKyAgICBCeSBkZWZhdWx0IHRoZSBKU09OIFNlcmlhbGl6ZXIgY3JlYXRl
cyB0aGUga2V5IGJ5IGFwcGVuZGluZyBgVHlwZWAgdG8KKyAgICB0aGUgYXR0cmlidXRlIGFuZCB2
YWx1ZSBmcm9tIHRoZSBtb2RlbCdzIGNhbWVsY2FzZWQgbW9kZWwgbmFtZS4KKworICAgIEBtZXRo
b2Qgc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
CisgICAgQHBhcmFtIHtPYmplY3R9IGpzb24KKyAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25z
aGlwCisgICovCisgIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTogZnVuY3Rpb24ocmVjb3JkLCBq
c29uLCByZWxhdGlvbnNoaXApIHsKKyAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleSwKKyAg
ICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKKyAgICBrZXkgPSB0aGlzLmtleUZv
ckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXk7CisgICAganNvbltr
ZXkgKyAiVHlwZSJdID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKGJlbG9uZ3NUby5jb25zdHJ1Y3Rv
ci50eXBlS2V5KTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioK
KyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBF
bWJlci5zZXQ7Cit2YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7CisK
Ky8qKgorICBUaGUgUkVTVCBhZGFwdGVyIGFsbG93cyB5b3VyIHN0b3JlIHRvIGNvbW11bmljYXRl
IHdpdGggYW4gSFRUUCBzZXJ2ZXIgYnkKKyAgdHJhbnNtaXR0aW5nIEpTT04gdmlhIFhIUi4gTW9z
dCBFbWJlci5qcyBhcHBzIHRoYXQgY29uc3VtZSBhIEpTT04gQVBJCisgIHNob3VsZCB1c2UgdGhl
IFJFU1QgYWRhcHRlci4KKworICBUaGlzIGFkYXB0ZXIgaXMgZGVzaWduZWQgYXJvdW5kIHRoZSBp
ZGVhIHRoYXQgdGhlIEpTT04gZXhjaGFuZ2VkIHdpdGgKKyAgdGhlIHNlcnZlciBzaG91bGQgYmUg
Y29udmVudGlvbmFsLgorCisgICMjIEpTT04gU3RydWN0dXJlCisKKyAgVGhlIFJFU1QgYWRhcHRl
ciBleHBlY3RzIHRoZSBKU09OIHJldHVybmVkIGZyb20geW91ciBzZXJ2ZXIgdG8gZm9sbG93Cisg
IHRoZXNlIGNvbnZlbnRpb25zLgorCisgICMjIyBPYmplY3QgUm9vdAorCisgIFRoZSBKU09OIHBh
eWxvYWQgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZWNvcmQgaW5zaWRl
IGEKKyAgcm9vdCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGluIHJlc3BvbnNlIHRvIGEgYEdFVGAg
cmVxdWVzdCBmb3IKKyAgYC9wb3N0cy8xYCwgdGhlIEpTT04gc2hvdWxkIGxvb2sgbGlrZSB0aGlz
OgorCisgIGBgYGpzCisgIHsKKyAgICAicG9zdCI6IHsKKyAgICAgICJ0aXRsZSI6ICJJJ20gUnVu
bmluZyB0byBSZWZvcm0gdGhlIFczQydzIFRhZyIsCisgICAgICAiYXV0aG9yIjogIlllaHVkYSBL
YXR6IgorICAgIH0KKyAgfQorICBgYGAKKworICAjIyMgQ29udmVudGlvbmFsIE5hbWVzCisKKyAg
QXR0cmlidXRlIG5hbWVzIGluIHlvdXIgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSB0aGUgY2FtZWxD
YXNlZCB2ZXJzaW9ucyBvZgorICB0aGUgYXR0cmlidXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVs
cy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVyc29uYCBtb2RlbDoKKworICBg
YGBqcworICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKKyAgICBmaXJzdE5hbWU6IERT
LmF0dHIoJ3N0cmluZycpLAorICAgIGxhc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKKyAgICBv
Y2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQorICB9KTsKKyAgYGBgCisKKyAgVGhlIEpTT04g
cmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisgIGBgYGpzCisgIHsKKyAgICAicGVy
c29uIjogeworICAgICAgImZpcnN0TmFtZSI6ICJCYXJhY2siLAorICAgICAgImxhc3ROYW1lIjog
Ik9iYW1hIiwKKyAgICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKKyAgICB9CisgIH0KKyAg
YGBgCisKKyAgIyMgQ3VzdG9taXphdGlvbgorCisgICMjIyBFbmRwb2ludCBwYXRoIGN1c3RvbWl6
YXRpb24KKworICBFbmRwb2ludCBwYXRocyBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIGBuYW1lc3Bh
Y2VgIGJ5IHNldHRpbmcgdGhlIG5hbWVzcGFjZQorICBwcm9wZXJ0eSBvbiB0aGUgYWRhcHRlcjoK
KworICBgYGBqcworICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oeworICAgIG5hbWVzcGFjZTogJ2Fw
aS8xJworICB9KTsKKyAgYGBgCisgIFJlcXVlc3RzIGZvciBgQXBwLlBlcnNvbmAgd291bGQgbm93
IHRhcmdldCBgL2FwaS8xL3Blb3BsZS8xYC4KKworICAjIyMgSG9zdCBjdXN0b21pemF0aW9uCisK
KyAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0
YCBwcm9wZXJ0eS4KKworICBgYGBqcworICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oeworICAgIGhv
c3Q6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScKKyAgfSk7CisgIGBgYAorCisgICMjIyBIZWFk
ZXJzIGN1c3RvbWl6YXRpb24KKworICBTb21lIEFQSXMgcmVxdWlyZSBIVFRQIGhlYWRlcnMsIGUu
Zy4gdG8gcHJvdmlkZSBhbiBBUEkga2V5LiBBbiBhcnJheSBvZgorICBoZWFkZXJzIGNhbiBiZSBh
ZGRlZCB0byB0aGUgYWRhcHRlciB3aGljaCBhcmUgcGFzc2VkIHdpdGggZXZlcnkgcmVxdWVzdDoK
KworICBgYGBqcworICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oeworICAgIGhlYWRlcnM6IHsKKyAg
ICAgICJBUElfS0VZIjogInNlY3JldCBrZXkiLAorICAgICAgIkFOT1RIRVJfSEVBREVSIjogIlNv
bWUgaGVhZGVyIHZhbHVlIgorICAgIH0KKyAgfSk7CisgIGBgYAorCisgIEBjbGFzcyBSRVNUQWRh
cHRlcgorICBAY29uc3RydWN0b3IKKyAgQG5hbWVzcGFjZSBEUworICBAZXh0ZW5kcyBEUy5BZGFw
dGVyCisqLworRFMuUkVTVEFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7CisgIGRlZmF1bHRT
ZXJpYWxpemVyOiAnLXJlc3QnLAorCisKKyAgLyoqCisgICAgRW5kcG9pbnQgcGF0aHMgY2FuIGJl
IHByZWZpeGVkIHdpdGggYSBgbmFtZXNwYWNlYCBieSBzZXR0aW5nIHRoZSBuYW1lc3BhY2UKKyAg
ICBwcm9wZXJ0eSBvbiB0aGUgYWRhcHRlcjoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBEUy5S
RVNUQWRhcHRlci5yZW9wZW4oeworICAgICAgbmFtZXNwYWNlOiAnYXBpLzEnCisgICAgfSk7Cisg
ICAgYGBgCisKKyAgICBSZXF1ZXN0cyBmb3IgYEFwcC5Qb3N0YCB3b3VsZCBub3cgdGFyZ2V0IGAv
YXBpLzEvcG9zdC9gLgorCisgICAgQHByb3BlcnR5IG5hbWVzcGFjZQorICAgIEB0eXBlIHtTdHJp
bmd9CisgICovCisKKyAgLyoqCisgICAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3Rz
IGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4KKworICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oeworICAgICAgaG9zdDogJ2h0dHBzOi8vYXBpLmV4YW1w
bGUuY29tJworICAgIH0pOworICAgIGBgYAorCisgICAgUmVxdWVzdHMgZm9yIGBBcHAuUG9zdGAg
d291bGQgbm93IHRhcmdldCBgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vcG9zdC9gLgorCisgICAg
QHByb3BlcnR5IGhvc3QKKyAgICBAdHlwZSB7U3RyaW5nfQorICAqLworCisgIC8qKgorICAgIFNv
bWUgQVBJcyByZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBwcm92aWRlIGFuIEFQSSBrZXku
IEFuIGFycmF5IG9mCisgICAgaGVhZGVycyBjYW4gYmUgYWRkZWQgdG8gdGhlIGFkYXB0ZXIgd2hp
Y2ggYXJlIHBhc3NlZCB3aXRoIGV2ZXJ5IHJlcXVlc3Q6CisKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgRFMuUkVTVEFkYXB0ZXIucmVvcGVuKHsKKyAgICAgIGhlYWRlcnM6IHsKKyAgICAgICAgIkFQ
SV9LRVkiOiAic2VjcmV0IGtleSIsCisgICAgICAgICJBTk9USEVSX0hFQURFUiI6ICJTb21lIGhl
YWRlciB2YWx1ZSIKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBo
ZWFkZXJzCisgICAgQHR5cGUge09iamVjdH0KKyAgKi8KKworICAvKioKKyAgICBDYWxsZWQgYnkg
dGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIHRoZSBKU09OIGZvciBhIGdpdmVuCisgICAgdHlw
ZSBhbmQgSUQuCisKKyAgICBUaGUgYGZpbmRgIG1ldGhvZCBtYWtlcyBhbiBBamF4IHJlcXVlc3Qg
dG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwgYW5kIHJldHVybnMgYQorICAgIHByb21p
c2UgZm9yIHRoZSByZXN1bHRpbmcgcGF5bG9hZC4KKworICAgIFRoaXMgbWV0aG9kIHBlcmZvcm1z
IGFuIEhUVFAgYEdFVGAgcmVxdWVzdCB3aXRoIHRoZSBpZCBwcm92aWRlZCBhcyBwYXJ0IG9mIHRo
ZSBxdWVyeSBzdHJpbmcuCisKKyAgICBAbWV0aG9kIGZpbmQKKyAgICBAcGFyYW0ge0RTLlN0b3Jl
fSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFy
YW0ge1N0cmluZ30gaWQKKyAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBm
aW5kOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWQpIHsKKyAgICByZXR1cm4gdGhpcy5hamF4KHRo
aXMuYnVpbGRVUkwodHlwZS50eXBlS2V5LCBpZCksICdHRVQnKTsKKyAgfSwKKworICAvKioKKyAg
ICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3Ig
YWxsCisgICAgb2YgdGhlIHJlY29yZHMgZm9yIGEgZ2l2ZW4gdHlwZS4KKworICAgIFRoZSBgZmlu
ZEFsbGAgbWV0aG9kIG1ha2VzIGFuIEFqYXggKEhUVFAgR0VUKSByZXF1ZXN0IHRvIGEgVVJMIGNv
bXB1dGVkIGJ5IGBidWlsZFVSTGAsIGFuZCByZXR1cm5zIGEKKyAgICBwcm9taXNlIGZvciB0aGUg
cmVzdWx0aW5nIHBheWxvYWQuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZmluZEFsbAor
ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQorICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCisgICAgQHJldHVybnMg
e1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IHNpbmNlVG9rZW4pIHsKKyAgICB2YXIgcXVlcnk7CisKKyAgICBpZiAoc2luY2VUb2tlbikgewor
ICAgICAgcXVlcnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07CisgICAgfQorCisgICAgcmV0dXJu
IHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHF1
ZXJ5IH0pOworICB9LAorCisgIC8qKgorICAgIENhbGxlZCBieSB0aGUgc3RvcmUgaW4gb3JkZXIg
dG8gZmV0Y2ggYSBKU09OIGFycmF5IGZvcgorICAgIHRoZSByZWNvcmRzIHRoYXQgbWF0Y2ggYSBw
YXJ0aWN1bGFyIHF1ZXJ5LgorCisgICAgVGhlIGBmaW5kUXVlcnlgIG1ldGhvZCBtYWtlcyBhbiBB
amF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBh
bmQgcmV0dXJucyBhCisgICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXlsb2FkLgorCisg
ICAgVGhlIGBxdWVyeWAgYXJndW1lbnQgaXMgYSBzaW1wbGUgSmF2YVNjcmlwdCBvYmplY3QgdGhh
dCB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseQorICAgIHRvIHRoZSBzZXJ2ZXIgYXMgcGFyYW1ldGVy
cy4KKworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBmaW5kUXVlcnkKKyAgICBAcGFyYW0ge0RT
LlN0b3JlfSBzdG9yZQorICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAg
ICBAcGFyYW0ge09iamVjdH0gcXVlcnkKKyAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQor
ICAqLworICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSkgeworICAgIHJl
dHVybiB0aGlzLmFqYXgodGhpcy5idWlsZFVSTCh0eXBlLnR5cGVLZXkpLCAnR0VUJywgeyBkYXRh
OiBxdWVyeSB9KTsKKyAgfSwKKworICAvKioKKyAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9y
ZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IKKyAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBp
biBhIGhhcy1tYW55IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQorICAgIHNwZWNp
ZmllZCBhcyBJRHMuCisKKyAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIG9yaWdpbmFsIHBheWxvYWQg
bG9va3MgbGlrZToKKworICAgIGBgYGpzCisgICAgeworICAgICAgImlkIjogMSwKKyAgICAgICJ0
aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKKyAgICAgICJjb21tZW50cyI6IFsgMSwgMiwgMyBd
CisgICAgfQorICAgIGBgYAorCisgICAgVGhlIElEcyB3aWxsIGJlIHBhc3NlZCBhcyBhIFVSTC1l
bmNvZGVkIEFycmF5IG9mIElEcywgaW4gdGhpcyBmb3JtOgorCisgICAgYGBgCisgICAgaWRzW109
MSZpZHNbXT0yJmlkc1tdPTMKKyAgICBgYGAKKworICAgIE1hbnkgc2VydmVycywgc3VjaCBhcyBS
YWlscyBhbmQgUEhQLCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCB0aGlzIFVSTC1lbmNvZGVk
IGFycmF5CisgICAgaW50byBhbiBBcnJheSBmb3IgeW91IG9uIHRoZSBzZXJ2ZXItc2lkZS4gSWYg
eW91IHdhbnQgdG8gZW5jb2RlIHRoZQorICAgIElEcywgZGlmZmVyZW50bHksIGp1c3Qgb3ZlcnJp
ZGUgdGhpcyAob25lLWxpbmUpIG1ldGhvZC4KKworICAgIFRoZSBgZmluZE1hbnlgIG1ldGhvZCBt
YWtlcyBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVp
bGRVUkxgLCBhbmQgcmV0dXJucyBhCisgICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXls
b2FkLgorCisgICAgQG1ldGhvZCBmaW5kTWFueQorICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3Jl
CisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQorICAgIEBwYXJhbSB7QXJy
YXl9IGlkcworICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCisgICovCisgIGZpbmRNYW55
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWRzKSB7CisgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlz
LmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHsgaWRzOiBpZHMgfSB9KTsK
KyAgfSwKKworICAvKioKKyAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNo
IGEgSlNPTiBhcnJheSBmb3IKKyAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1tYW55
IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQorICAgIHNwZWNpZmllZCBhcyBhIFVS
TCAoaW5zaWRlIG9mIGBsaW5rc2ApLgorCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgb3JpZ2lu
YWwgcGF5bG9hZCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICBgYGBqcworICAgIHsKKyAgICAgICJw
b3N0IjogeworICAgICAgICAiaWQiOiAxLAorICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21h
a2FzZSIsCisgICAgICAgICJsaW5rcyI6IHsgImNvbW1lbnRzIjogIi9wb3N0cy8xL2NvbW1lbnRz
IiB9CisgICAgICB9CisgICAgfQorICAgIGBgYAorCisgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBj
YWxsZWQgd2l0aCB0aGUgcGFyZW50IHJlY29yZCBhbmQgYC9wb3N0cy8xL2NvbW1lbnRzYC4KKwor
ICAgIFRoZSBgZmluZEhhc01hbnlgIG1ldGhvZCB3aWxsIG1ha2UgYW4gQWpheCAoSFRUUCBHRVQp
IHJlcXVlc3QgdG8gdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIFVSTC4KKyAgICBJZiB0aGUgVVJM
IGlzIGhvc3QtcmVsYXRpdmUgKHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgc2xhc2gpLCB0aGUKKyAg
ICByZXF1ZXN0IHdpbGwgdXNlIHRoZSBob3N0IHNwZWNpZmllZCBvbiB0aGUgYWRhcHRlciAoaWYg
YW55KS4KKworICAgIEBtZXRob2QgZmluZEhhc01hbnkKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7U3RyaW5nfSB1
cmwKKyAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBmaW5kSGFzTWFueTog
ZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJsKSB7CisgICAgdmFyIGhvc3QgPSBnZXQodGhpcywg
J2hvc3QnKSwKKyAgICAgICAgaWQgICA9IGdldChyZWNvcmQsICdpZCcpLAorICAgICAgICB0eXBl
ID0gcmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXk7CisKKyAgICBpZiAoaG9zdCAmJiB1cmwuY2hh
ckF0KDApID09PSAnLycgJiYgdXJsLmNoYXJBdCgxKSAhPT0gJy8nKSB7CisgICAgICB1cmwgPSBo
b3N0ICsgdXJsOworICAgIH0KKworICAgIHJldHVybiB0aGlzLmFqYXgodGhpcy51cmxQcmVmaXgo
dXJsLCB0aGlzLmJ1aWxkVVJMKHR5cGUsIGlkKSksICdHRVQnKTsKKyAgfSwKKworICAvKioKKyAg
ICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IK
KyAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwIHRo
YXQgd2VyZSBvcmlnaW5hbGx5CisgICAgc3BlY2lmaWVkIGFzIGEgVVJMIChpbnNpZGUgb2YgYGxp
bmtzYCkuCisKKyAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBvcmlnaW5hbCBwYXlsb2FkIGxvb2tz
IGxpa2UgdGhpczoKKworICAgIGBgYGpzCisgICAgeworICAgICAgInBlcnNvbiI6IHsKKyAgICAg
ICAgImlkIjogMSwKKyAgICAgICAgIm5hbWUiOiAiVG9tIERhbGUiLAorICAgICAgICAibGlua3Mi
OiB7ICJncm91cCI6ICIvcGVvcGxlLzEvZ3JvdXAiIH0KKyAgICAgIH0KKyAgICB9CisgICAgYGBg
CisKKyAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJlbnQgcmVjb3Jk
IGFuZCBgL3Blb3BsZS8xL2dyb3VwYC4KKworICAgIFRoZSBgZmluZEJlbG9uZ3NUb2AgbWV0aG9k
IHdpbGwgbWFrZSBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byB0aGUgb3JpZ2luYWxseSBz
cGVjaWZpZWQgVVJMLgorCisgICAgQG1ldGhvZCBmaW5kQmVsb25nc1RvCisgICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKKyAgICBAcGFyYW0g
e1N0cmluZ30gdXJsCisgICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZmlu
ZEJlbG9uZ3NUbzogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJsKSB7CisgICAgdmFyIGlkICAg
PSBnZXQocmVjb3JkLCAnaWQnKSwKKyAgICAgICAgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3Rvci50
eXBlS2V5OworCisgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLnVybFByZWZpeCh1cmwsIHRoaXMu
YnVpbGRVUkwodHlwZSwgaWQpKSwgJ0dFVCcpOworICB9LAorCisgIC8qKgorICAgIENhbGxlZCBi
eSB0aGUgc3RvcmUgd2hlbiBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIGlzCisgICAgc2F2ZWQgdmlh
IHRoZSBgc2F2ZWAgbWV0aG9kIG9uIGEgbW9kZWwgcmVjb3JkIGluc3RhbmNlLgorCisgICAgVGhl
IGBjcmVhdGVSZWNvcmRgIG1ldGhvZCBzZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIG1ha2VzIGFu
IEFqYXggKEhUVFAgUE9TVCkgcmVxdWVzdAorICAgIHRvIGEgVVJMIGNvbXB1dGVkIGJ5IGBidWls
ZFVSTGAuCisKKyAgICBTZWUgYHNlcmlhbGl6ZWAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBj
dXN0b21pemUgdGhlIHNlcmlhbGl6ZWQgZm9ybQorICAgIG9mIGEgcmVjb3JkLgorCisgICAgQG1l
dGhvZCBjcmVhdGVSZWNvcmQKKyAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQorICAgIEBwYXJh
bSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNv
cmQKKyAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBjcmVhdGVSZWNvcmQ6
IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICB2YXIgZGF0YSA9IHt9OworICAg
IHZhciBzZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVLZXkpOworCisg
ICAgc2VyaWFsaXplci5zZXJpYWxpemVJbnRvSGFzaChkYXRhLCB0eXBlLCByZWNvcmQsIHsgaW5j
bHVkZUlkOiB0cnVlIH0pOworCisgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5
cGUudHlwZUtleSksICJQT1NUIiwgeyBkYXRhOiBkYXRhIH0pOworICB9LAorCisgIC8qKgorICAg
IENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhbiBleGlzdGluZyByZWNvcmQgaXMgc2F2ZWQKKyAg
ICB2aWEgdGhlIGBzYXZlYCBtZXRob2Qgb24gYSBtb2RlbCByZWNvcmQgaW5zdGFuY2UuCisKKyAg
ICBUaGUgYHVwZGF0ZVJlY29yZGAgbWV0aG9kIHNlcmlhbGl6ZXMgdGhlIHJlY29yZCBhbmQgbWFr
ZXMgYW4gQWpheCAoSFRUUCBQVVQpIHJlcXVlc3QKKyAgICB0byBhIFVSTCBjb21wdXRlZCBieSBg
YnVpbGRVUkxgLgorCisgICAgU2VlIGBzZXJpYWxpemVgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cg
dG8gY3VzdG9taXplIHRoZSBzZXJpYWxpemVkIGZvcm0KKyAgICBvZiBhIHJlY29yZC4KKworICAg
IEBtZXRob2QgdXBkYXRlUmVjb3JkCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKKyAgICBA
cGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtEUy5Nb2RlbH0g
cmVjb3JkCisgICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgdXBkYXRlUmVj
b3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgdmFyIGRhdGEgPSB7fTsK
KyAgICB2YXIgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IodHlwZS50eXBlS2V5KTsK
KworICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplSW50b0hhc2goZGF0YSwgdHlwZSwgcmVjb3JkKTsK
KworICAgIHZhciBpZCA9IGdldChyZWNvcmQsICdpZCcpOworCisgICAgcmV0dXJuIHRoaXMuYWph
eCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSwgaWQpLCAiUFVUIiwgeyBkYXRhOiBkYXRhIH0p
OworICB9LAorCisgIC8qKgorICAgIENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhIHJlY29yZCBp
cyBkZWxldGVkLgorCisgICAgVGhlIGBkZWxldGVSZWNvcmRgIG1ldGhvZCAgbWFrZXMgYW4gQWph
eCAoSFRUUCBERUxFVEUpIHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYC4K
KworICAgIEBtZXRob2QgZGVsZXRlUmVjb3JkCisgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK
KyAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCisgICAgQHBhcmFtIHtEUy5N
b2RlbH0gcmVjb3JkCisgICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKKyAgKi8KKyAgZGVs
ZXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CisgICAgdmFyIGlkID0g
Z2V0KHJlY29yZCwgJ2lkJyk7CisKKyAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwo
dHlwZS50eXBlS2V5LCBpZCksICJERUxFVEUiKTsKKyAgfSwKKworICAvKioKKyAgICBCdWlsZHMg
YSBVUkwgZm9yIGEgZ2l2ZW4gdHlwZSBhbmQgb3B0aW9uYWwgSUQuCisKKyAgICBCeSBkZWZhdWx0
LCBpdCBwbHVyYWxpemVzIHRoZSB0eXBlJ3MgbmFtZSAoZm9yIGV4YW1wbGUsICdwb3N0JworICAg
IGJlY29tZXMgJ3Bvc3RzJyBhbmQgJ3BlcnNvbicgYmVjb21lcyAncGVvcGxlJykuIFRvIG92ZXJy
aWRlIHRoZQorICAgIHBsdXJhbGl6YXRpb24gc2VlIFtwYXRoRm9yVHlwZV0oI21ldGhvZF9wYXRo
Rm9yVHlwZSkuCisKKyAgICBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIGl0IGFkZHMgdGhlIElEIHRv
IHRoZSBwYXRoIGdlbmVyYXRlZAorICAgIGZvciB0aGUgdHlwZSwgc2VwYXJhdGVkIGJ5IGEgYC9g
LgorCisgICAgQG1ldGhvZCBidWlsZFVSTAorICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAg
QHBhcmFtIHtTdHJpbmd9IGlkCisgICAgQHJldHVybnMge1N0cmluZ30gdXJsCisgICovCisgIGJ1
aWxkVVJMOiBmdW5jdGlvbih0eXBlLCBpZCkgeworICAgIHZhciB1cmwgPSBbXSwKKyAgICAgICAg
aG9zdCA9IGdldCh0aGlzLCAnaG9zdCcpLAorICAgICAgICBwcmVmaXggPSB0aGlzLnVybFByZWZp
eCgpOworCisgICAgaWYgKHR5cGUpIHsgdXJsLnB1c2godGhpcy5wYXRoRm9yVHlwZSh0eXBlKSk7
IH0KKyAgICBpZiAoaWQpIHsgdXJsLnB1c2goaWQpOyB9CisKKyAgICBpZiAocHJlZml4KSB7IHVy
bC51bnNoaWZ0KHByZWZpeCk7IH0KKworICAgIHVybCA9IHVybC5qb2luKCcvJyk7CisgICAgaWYg
KCFob3N0ICYmIHVybCkgeyB1cmwgPSAnLycgKyB1cmw7IH0KKworICAgIHJldHVybiB1cmw7Cisg
IH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCB1cmxQcmVmaXgKKyAgICBAcHJpdmF0ZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhcmVudFVybAorICAgIEBy
ZXR1cm4ge1N0cmluZ30gdXJsUHJlZml4CisgICovCisgIHVybFByZWZpeDogZnVuY3Rpb24ocGF0
aCwgcGFyZW50VVJMKSB7CisgICAgdmFyIGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwKKyAgICAg
ICAgbmFtZXNwYWNlID0gZ2V0KHRoaXMsICduYW1lc3BhY2UnKSwKKyAgICAgICAgdXJsID0gW107
CisKKyAgICBpZiAocGF0aCkgeworICAgICAgLy8gQWJzb2x1dGUgcGF0aAorICAgICAgaWYgKHBh
dGguY2hhckF0KDApID09PSAnLycpIHsKKyAgICAgICAgaWYgKGhvc3QpIHsKKyAgICAgICAgICBw
YXRoID0gcGF0aC5zbGljZSgxKTsKKyAgICAgICAgICB1cmwucHVzaChob3N0KTsKKyAgICAgICAg
fQorICAgICAgLy8gUmVsYXRpdmUgcGF0aAorICAgICAgfSBlbHNlIGlmICghL15odHRwKHMpPzpc
L1wvLy50ZXN0KHBhdGgpKSB7CisgICAgICAgIHVybC5wdXNoKHBhcmVudFVSTCk7CisgICAgICB9
CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChob3N0KSB7IHVybC5wdXNoKGhvc3QpOyB9CisgICAg
ICBpZiAobmFtZXNwYWNlKSB7IHVybC5wdXNoKG5hbWVzcGFjZSk7IH0KKyAgICB9CisKKyAgICBp
ZiAocGF0aCkgeworICAgICAgdXJsLnB1c2gocGF0aCk7CisgICAgfQorCisgICAgcmV0dXJuIHVy
bC5qb2luKCcvJyk7CisgIH0sCisKKyAgLyoqCisgICAgRGV0ZXJtaW5lcyB0aGUgcGF0aG5hbWUg
Zm9yIGEgZ2l2ZW4gdHlwZS4KKworICAgIEJ5IGRlZmF1bHQsIGl0IHBsdXJhbGl6ZXMgdGhlIHR5
cGUncyBuYW1lIChmb3IgZXhhbXBsZSwKKyAgICAncG9zdCcgYmVjb21lcyAncG9zdHMnIGFuZCAn
cGVyc29uJyBiZWNvbWVzICdwZW9wbGUnKS4KKworICAgICMjIyBQYXRobmFtZSBjdXN0b21pemF0
aW9uCisKKyAgICBGb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBvYmplY3QgTGluZUl0ZW0gd2l0
aCBhbgorICAgIGVuZHBvaW50IG9mICIvbGluZV9pdGVtcy8iLgorCisgICAgYGBganMKKyAgICBE
Uy5SRVNUQWRhcHRlci5yZW9wZW4oeworICAgICAgcGF0aEZvclR5cGU6IGZ1bmN0aW9uKHR5cGUp
IHsKKyAgICAgICAgdmFyIGRlY2FtZWxpemVkID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUodHlw
ZSk7CisgICAgICAgIHJldHVybiBFbWJlci5TdHJpbmcucGx1cmFsaXplKGRlY2FtZWxpemVkKTsK
KyAgICAgIH07CisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIHBhdGhGb3JUeXBlCisg
ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKKyAgICBAcmV0dXJucyB7U3RyaW5nfSBwYXRoCisgICoq
LworICBwYXRoRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgeworICAgIHZhciBjYW1lbGl6ZWQgPSBF
bWJlci5TdHJpbmcuY2FtZWxpemUodHlwZSk7CisgICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVy
YWxpemUoY2FtZWxpemVkKTsKKyAgfSwKKworICAvKioKKyAgICBUYWtlcyBhbiBhamF4IHJlc3Bv
bnNlLCBhbmQgcmV0dXJucyBhIHJlbGV2YW50IGVycm9yLgorCisgICAgUmV0dXJuaW5nIGEgYERT
LkludmFsaWRFcnJvcmAgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIHRoZQorICAgIHJlY29y
ZCB0byB0cmFuc2l0aW9uIGludG8gdGhlIGBpbnZhbGlkYCBzdGF0ZSBhbmQgbWFrZSB0aGUKKyAg
ICBgZXJyb3JzYCBvYmplY3QgYXZhaWxhYmxlIG9uIHRoZSByZWNvcmQuCisKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJFU1RBZGFwdGVyLmV4dGVu
ZCh7CisgICAgICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7CisgICAgICAgIHZhciBlcnJv
ciA9IHRoaXMuX3N1cGVyKGpxWEhSKTsKKworICAgICAgICBpZiAoanFYSFIgJiYganFYSFIuc3Rh
dHVzID09PSA0MjIpIHsKKyAgICAgICAgICB2YXIganNvbkVycm9ycyA9IEVtYmVyLiQucGFyc2VK
U09OKGpxWEhSLnJlc3BvbnNlVGV4dClbImVycm9ycyJdOworCisgICAgICAgICAgcmV0dXJuIG5l
dyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9ycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisK
KyAgICBOb3RlOiBBcyBhIGNvcnJlY3RuZXNzIG9wdGltaXphdGlvbiwgdGhlIGRlZmF1bHQgaW1w
bGVtZW50YXRpb24gb2YKKyAgICB0aGUgYGFqYXhFcnJvcmAgbWV0aG9kIHN0cmlwcyBvdXQgdGhl
IGB0aGVuYCBtZXRob2QgZnJvbSBqcXVlcnkncworICAgIGFqYXggcmVzcG9uc2UgKGpxWEhSKS4g
VGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUganFYSFIncworICAgIGB0aGVuYCBtZXRob2Qg
ZnVsZmlsbHMgdGhlIHByb21pc2Ugd2l0aCBpdHNlbGYgcmVzdWx0aW5nIGluIGEKKyAgICBjaXJj
dWxhciAidGhlbmFibGUiIGNoYWluIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZQor
ICAgIHByb21pc2UgbGlicmFyaWVzLgorCisgICAgQG1ldGhvZCBhamF4RXJyb3IKKyAgICBAcGFy
YW0gIHtPYmplY3R9IGpxWEhSCisgICAgQHJldHVybiB7T2JqZWN0fSBqcVhIUgorICAqLworICBh
amF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7CisgICAgaWYgKGpxWEhSKSB7CisgICAgICBqcVhI
Ui50aGVuID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4ganFYSFI7CisgIH0sCisKKyAgLyoq
CisgICAgVGFrZXMgYSBVUkwsIGFuIEhUVFAgbWV0aG9kIGFuZCBhIGhhc2ggb2YgZGF0YSwgYW5k
IG1ha2VzIGFuCisgICAgSFRUUCByZXF1ZXN0LgorCisgICAgV2hlbiB0aGUgc2VydmVyIHJlc3Bv
bmRzIHdpdGggYSBwYXlsb2FkLCBFbWJlciBEYXRhIHdpbGwgY2FsbCBpbnRvIGBleHRyYWN0U2lu
Z2xlYAorICAgIG9yIGBleHRyYWN0QXJyYXlgIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgb3Jp
Z2luYWwgcXVlcnkgd2FzIGZvciBvbmUgcmVjb3JkIG9yCisgICAgbWFueSByZWNvcmRzKS4KKwor
ICAgIEJ5IGRlZmF1bHQsIGBhamF4YCBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6
CisKKyAgICAqIEl0IHNldHMgdGhlIHJlc3BvbnNlIGBkYXRhVHlwZWAgdG8gYCJqc29uImAKKyAg
ICAqIElmIHRoZSBIVFRQIG1ldGhvZCBpcyBub3QgYCJHRVQiYCwgaXQgc2V0cyB0aGUgYENvbnRl
bnQtVHlwZWAgdG8gYmUKKyAgICAgIGBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04YAor
ICAgICogSWYgdGhlIEhUVFAgbWV0aG9kIGlzIG5vdCBgIkdFVCJgLCBpdCBzdHJpbmdpZmllcyB0
aGUgZGF0YSBwYXNzZWQgaW4uIFRoZQorICAgICAgZGF0YSBpcyB0aGUgc2VyaWFsaXplZCByZWNv
cmQgaW4gdGhlIGNhc2Ugb2YgYSBzYXZlLgorICAgICogUmVnaXN0ZXJzIHN1Y2Nlc3MgYW5kIGZh
aWx1cmUgaGFuZGxlcnMuCisKKyAgICBAbWV0aG9kIGFqYXgKKyAgICBAcHJpdmF0ZQorICAgIEBw
YXJhbSB7U3RyaW5nfSB1cmwKKyAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgcmVxdWVzdCB0
eXBlIEdFVCwgUE9TVCwgUFVULCBERUxFVEUgZXRjLgorICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNo
CisgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAqLworICBhamF4OiBmdW5jdGlvbih1
cmwsIHR5cGUsIGhhc2gpIHsKKyAgICB2YXIgYWRhcHRlciA9IHRoaXM7CisKKyAgICByZXR1cm4g
bmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKKyAgICAg
IGhhc2ggPSBhZGFwdGVyLmFqYXhPcHRpb25zKHVybCwgdHlwZSwgaGFzaCk7CisKKyAgICAgIGhh
c2guc3VjY2VzcyA9IGZ1bmN0aW9uKGpzb24pIHsKKyAgICAgICAgRW1iZXIucnVuKG51bGwsIHJl
c29sdmUsIGpzb24pOworICAgICAgfTsKKworICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uKGpx
WEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgeworICAgICAgICBFbWJlci5ydW4obnVsbCwg
cmVqZWN0LCBhZGFwdGVyLmFqYXhFcnJvcihqcVhIUikpOworICAgICAgfTsKKworICAgICAgRW1i
ZXIuJC5hamF4KGhhc2gpOworICAgIH0sICJEUzogUmVzdEFkYXB0ZXIjYWpheCAiICsgdHlwZSAr
ICIgdG8gIiArIHVybCk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBhamF4T3B0aW9ucwor
ICAgIEBwcml2YXRlCisgICAgQHBhcmFtIHtTdHJpbmd9IHVybAorICAgIEBwYXJhbSB7U3RyaW5n
fSB0eXBlIFRoZSByZXF1ZXN0IHR5cGUgR0VULCBQT1NULCBQVVQsIERFTEVURSBldGMuCisgICAg
QHBhcmFtIHtPYmplY3R9IGhhc2gKKyAgICBAcmV0dXJuIHtPYmplY3R9IGhhc2gKKyAgKi8KKyAg
YWpheE9wdGlvbnM6IGZ1bmN0aW9uKHVybCwgdHlwZSwgaGFzaCkgeworICAgIGhhc2ggPSBoYXNo
IHx8IHt9OworICAgIGhhc2gudXJsID0gdXJsOworICAgIGhhc2gudHlwZSA9IHR5cGU7CisgICAg
aGFzaC5kYXRhVHlwZSA9ICdqc29uJzsKKyAgICBoYXNoLmNvbnRleHQgPSB0aGlzOworCisgICAg
aWYgKGhhc2guZGF0YSAmJiB0eXBlICE9PSAnR0VUJykgeworICAgICAgaGFzaC5jb250ZW50VHlw
ZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JzsKKyAgICAgIGhhc2guZGF0YSA9
IEpTT04uc3RyaW5naWZ5KGhhc2guZGF0YSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuaGVhZGVy
cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB2YXIgaGVhZGVycyA9IHRoaXMuaGVhZGVyczsKKyAg
ICAgIGhhc2guYmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4aHIpIHsKKyAgICAgICAgZm9yRWFjaC5j
YWxsKEVtYmVyLmtleXMoaGVhZGVycyksIGZ1bmN0aW9uKGtleSkgeworICAgICAgICAgIHhoci5z
ZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTsKKyAgICAgICAgfSk7CisgICAgICB9
OworICAgIH0KKworCisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworfSk7CisKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJlci1kYXRhCisqLworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworRFMuTW9kZWwucmVvcGVuKHsKKworICAvKioKKyAgICBQcm92
aWRlcyBpbmZvIGFib3V0IHRoZSBtb2RlbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgICAgYnkg
Z3JvdXBpbmcgdGhlIHByb3BlcnRpZXMgaW50byBtb3JlIHNlbWFudGljIGdyb3Vwcy4KKworICAg
IE1lYW50IHRvIGJlIHVzZWQgYnkgZGVidWdnaW5nIHRvb2xzIHN1Y2ggYXMgdGhlIENocm9tZSBF
bWJlciBFeHRlbnNpb24uCisKKyAgICAtIEdyb3VwcyBhbGwgYXR0cmlidXRlcyBpbiAiQXR0cmli
dXRlcyIgZ3JvdXAuCisgICAgLSBHcm91cHMgYWxsIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXBzIGlu
ICJCZWxvbmdzIFRvIiBncm91cC4KKyAgICAtIEdyb3VwcyBhbGwgaGFzTWFueSByZWxhdGlvbnNo
aXBzIGluICJIYXMgTWFueSIgZ3JvdXAuCisgICAgLSBHcm91cHMgYWxsIGZsYWdzIGluICJGbGFn
cyIgZ3JvdXAuCisgICAgLSBGbGFncyByZWxhdGlvbnNoaXAgQ1BzIGFzIGV4cGVuc2l2ZSBwcm9w
ZXJ0aWVzLgorCisgICAgQG1ldGhvZCBfZGVidWdJbmZvCisgICAgQGZvciBEUy5Nb2RlbAorICAg
IEBwcml2YXRlCisgICovCisgIF9kZWJ1Z0luZm86IGZ1bmN0aW9uKCkgeworICAgIHZhciBhdHRy
aWJ1dGVzID0gWydpZCddLAorICAgICAgICByZWxhdGlvbnNoaXBzID0geyBiZWxvbmdzVG86IFtd
LCBoYXNNYW55OiBbXSB9LAorICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzID0gW107CisKKyAg
ICB0aGlzLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0YSkgeworICAgICAgYXR0cmli
dXRlcy5wdXNoKG5hbWUpOworICAgIH0sIHRoaXMpOworCisgICAgdGhpcy5lYWNoUmVsYXRpb25z
aGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgeworICAgICAgcmVsYXRpb25zaGlwc1ty
ZWxhdGlvbnNoaXAua2luZF0ucHVzaChuYW1lKTsKKyAgICAgIGV4cGVuc2l2ZVByb3BlcnRpZXMu
cHVzaChuYW1lKTsKKyAgICB9KTsKKworICAgIHZhciBncm91cHMgPSBbCisgICAgICB7CisgICAg
ICAgIG5hbWU6ICdBdHRyaWJ1dGVzJywKKyAgICAgICAgcHJvcGVydGllczogYXR0cmlidXRlcywK
KyAgICAgICAgZXhwYW5kOiB0cnVlCisgICAgICB9LAorICAgICAgeworICAgICAgICBuYW1lOiAn
QmVsb25ncyBUbycsCisgICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuYmVsb25nc1Rv
LAorICAgICAgICBleHBhbmQ6IHRydWUKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIG5hbWU6
ICdIYXMgTWFueScsCisgICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuaGFzTWFueSwK
KyAgICAgICAgZXhwYW5kOiB0cnVlCisgICAgICB9LAorICAgICAgeworICAgICAgICBuYW1lOiAn
RmxhZ3MnLAorICAgICAgICBwcm9wZXJ0aWVzOiBbJ2lzTG9hZGVkJywgJ2lzRGlydHknLCAnaXNT
YXZpbmcnLCAnaXNEZWxldGVkJywgJ2lzRXJyb3InLCAnaXNOZXcnLCAnaXNWYWxpZCddCisgICAg
ICB9CisgICAgXTsKKworICAgIHJldHVybiB7CisgICAgICBwcm9wZXJ0eUluZm86IHsKKyAgICAg
ICAgLy8gaW5jbHVkZSBhbGwgb3RoZXIgbWl4aW5zIC8gcHJvcGVydGllcyAobm90IGp1c3QgdGhl
IGdyb3VwZWQgb25lcykKKyAgICAgICAgaW5jbHVkZU90aGVyUHJvcGVydGllczogdHJ1ZSwKKyAg
ICAgICAgZ3JvdXBzOiBncm91cHMsCisgICAgICAgIC8vIGRvbid0IHByZS1jYWxjdWxhdGUgdW5s
ZXNzIGNhY2hlZAorICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzOiBleHBlbnNpdmVQcm9wZXJ0
aWVzCisgICAgICB9CisgICAgfTsKKyAgfQorCit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlv
bigpIHsKKy8qKgorICBAbW9kdWxlIGVtYmVyLWRhdGEKKyovCisKK30pKCk7CisKKworCisoZnVu
Y3Rpb24oKSB7CisvKioKKyAgRW1iZXIgRGF0YQorCisgIEBtb2R1bGUgZW1iZXItZGF0YQorICBA
bWFpbiBlbWJlci1kYXRhCisqLworCit9KSgpOworCisoZnVuY3Rpb24oKSB7CitFbWJlci5TdHJp
bmcucGx1cmFsaXplID0gZnVuY3Rpb24od29yZCkgeworICByZXR1cm4gRW1iZXIuSW5mbGVjdG9y
LmluZmxlY3Rvci5wbHVyYWxpemUod29yZCk7Cit9OworCitFbWJlci5TdHJpbmcuc2luZ3VsYXJp
emUgPSBmdW5jdGlvbih3b3JkKSB7CisgIHJldHVybiBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9y
LnNpbmd1bGFyaXplKHdvcmQpOworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3Zh
ciBCTEFOS19SRUdFWCA9IC9eXHMqJC87CisKK2Z1bmN0aW9uIGxvYWRVbmNvdW50YWJsZShydWxl
cywgdW5jb3VudGFibGUpIHsKKyAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHVuY291bnRhYmxl
Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgcnVsZXMudW5jb3VudGFibGVbdW5jb3Vu
dGFibGVbaV0udG9Mb3dlckNhc2UoKV0gPSB0cnVlOworICB9Cit9CisKK2Z1bmN0aW9uIGxvYWRJ
cnJlZ3VsYXIocnVsZXMsIGlycmVndWxhclBhaXJzKSB7CisgIHZhciBwYWlyOworCisgIGZvciAo
dmFyIGkgPSAwLCBsZW5ndGggPSBpcnJlZ3VsYXJQYWlycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkr
KykgeworICAgIHBhaXIgPSBpcnJlZ3VsYXJQYWlyc1tpXTsKKworICAgIHJ1bGVzLmlycmVndWxh
cltwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFpclsxXTsKKyAgICBydWxlcy5pcnJlZ3VsYXJJ
bnZlcnNlW3BhaXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOworICB9Cit9CisKKy8qKgor
ICBJbmZsZWN0b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHN1cHBseWluZyBpbmZs
ZWN0aW9uIHJ1bGVzIGZvciB5b3VyCisgIGFwcGxpY2F0aW9uLiBFbWJlciBpbmNsdWRlcyBhIGRl
ZmF1bHQgc2V0IG9mIGluZmxlY3Rpb24gcnVsZXMsIGFuZCBwcm92aWRlcyBhbgorICBBUEkgZm9y
IHByb3ZpZGluZyBhZGRpdGlvbmFsIHJ1bGVzLgorCisgIEV4YW1wbGVzOgorCisgIENyZWF0aW5n
IGFuIGluZmxlY3RvciB3aXRoIG5vIHJ1bGVzLgorCisgIGBgYGpzCisgIHZhciBpbmZsZWN0b3Ig
PSBuZXcgRW1iZXIuSW5mbGVjdG9yKCk7CisgIGBgYAorCisgIENyZWF0aW5nIGFuIGluZmxlY3Rv
ciB3aXRoIHRoZSBkZWZhdWx0IGVtYmVyIHJ1bGVzZXQuCisKKyAgYGBganMKKyAgdmFyIGluZmxl
Y3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7
CisKKyAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnY293JykgLy89PiAna2luZScKKyAgaW5mbGVjdG9y
LnNpbmd1bGFyaXplKCdraW5lJykgLy89PiAnY293JworICBgYGAKKworICBDcmVhdGluZyBhbiBp
bmZsZWN0b3IgYW5kIGFkZGluZyBydWxlcyBsYXRlci4KKworICBgYGBqYXZhc2NyaXB0CisgIHZh
ciBpbmZsZWN0b3IgPSBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yOworCisgIGluZmxlY3Rvci5w
bHVyYWxpemUoJ2FkdmljZScpIC8vID0+ICdhZHZpY2VzJworICBpbmZsZWN0b3IudW5jb3VudGFi
bGUoJ2FkdmljZScpOworICBpbmZsZWN0b3IucGx1cmFsaXplKCdhZHZpY2UnKSAvLyA9PiAnYWR2
aWNlJworCisgIGluZmxlY3Rvci5wbHVyYWxpemUoJ2Zvcm11bGEnKSAvLyA9PiAnZm9ybXVsYXMn
CisgIGluZmxlY3Rvci5pcnJlZ3VsYXIoJ2Zvcm11bGEnLCAnZm9ybXVsYWUnKTsKKyAgaW5mbGVj
dG9yLnBsdXJhbGl6ZSgnZm9ybXVsYScpIC8vID0+ICdmb3JtdWxhZScKKworICAvLyB5b3Ugd291
bGQgbm90IG5lZWQgdG8gYWRkIHRoZXNlIGFzIHRoZXkgYXJlIHRoZSBkZWZhdWx0IHJ1bGVzCisg
IGluZmxlY3Rvci5wbHVyYWwoLyQvLCAncycpOworICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ks
ICcnKTsKKyAgYGBgCisKKyAgQ3JlYXRpbmcgYW4gaW5mbGVjdG9yIHdpdGggYSBub25kZWZhdWx0
IHJ1bGVzZXQuCisKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgcnVsZXMgPSB7CisgICAgcGx1cmFs
czogIFsgLyQvLCAncycgXSwKKyAgICBzaW5ndWxhcjogWyAvXHMkLywgJycgXSwKKyAgICBpcnJl
Z3VsYXJQYWlyczogWworICAgICAgWyAnY293JywgJ2tpbmUnIF0KKyAgICBdLAorICAgIHVuY291
bnRhYmxlOiBbICdmaXNoJyBdCisgIH07CisKKyAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5J
bmZsZWN0b3IocnVsZXMpOworICBgYGAKKworICBAY2xhc3MgSW5mbGVjdG9yCisgIEBuYW1lc3Bh
Y2UgRW1iZXIKKyovCitmdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNldCkgeworICBydWxlU2V0ID0g
cnVsZVNldCB8fCB7fTsKKyAgcnVsZVNldC51bmNvdW50YWJsZSA9IHJ1bGVTZXQudW5jb3VudGFi
bGUgfHwge307CisgIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgPSBydWxlU2V0LmlycmVndWxhclBh
aXJzIHx8IHt9OworCisgIHZhciBydWxlcyA9IHRoaXMucnVsZXMgPSB7CisgICAgcGx1cmFsczog
IHJ1bGVTZXQucGx1cmFscyB8fCBbXSwKKyAgICBzaW5ndWxhcjogcnVsZVNldC5zaW5ndWxhciB8
fCBbXSwKKyAgICBpcnJlZ3VsYXI6IHt9LAorICAgIGlycmVndWxhckludmVyc2U6IHt9LAorICAg
IHVuY291bnRhYmxlOiB7fQorICB9OworCisgIGxvYWRVbmNvdW50YWJsZShydWxlcywgcnVsZVNl
dC51bmNvdW50YWJsZSk7CisgIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQuaXJyZWd1bGFy
UGFpcnMpOworfQorCitJbmZsZWN0b3IucHJvdG90eXBlID0geworICAvKioKKyAgICBAbWV0aG9k
IHBsdXJhbAorICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAorICAgIEBwYXJhbSB7U3RyaW5nfSBz
dHJpbmcKKyAgKi8KKyAgcGx1cmFsOiBmdW5jdGlvbihyZWdleCwgc3RyaW5nKSB7CisgICAgdGhp
cy5ydWxlcy5wbHVyYWxzLnB1c2goW3JlZ2V4LCBzdHJpbmcudG9Mb3dlckNhc2UoKV0pOworICB9
LAorCisgIC8qKgorICAgIEBtZXRob2Qgc2luZ3VsYXIKKyAgICBAcGFyYW0ge1JlZ0V4cH0gcmVn
ZXgKKyAgICBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCisgICovCisgIHNpbmd1bGFyOiBmdW5jdGlv
bihyZWdleCwgc3RyaW5nKSB7CisgICAgdGhpcy5ydWxlcy5zaW5ndWxhci5wdXNoKFtyZWdleCwg
c3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKKyAgfSwKKworICAvKioKKyAgICBAbWV0aG9kIHVuY291
bnRhYmxlCisgICAgQHBhcmFtIHtTdHJpbmd9IHJlZ2V4CisgICovCisgIHVuY291bnRhYmxlOiBm
dW5jdGlvbihzdHJpbmcpIHsKKyAgICBsb2FkVW5jb3VudGFibGUodGhpcy5ydWxlcywgW3N0cmlu
Zy50b0xvd2VyQ2FzZSgpXSk7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBpcnJlZ3VsYXIK
KyAgICBAcGFyYW0ge1N0cmluZ30gc2luZ3VsYXIKKyAgICBAcGFyYW0ge1N0cmluZ30gcGx1cmFs
CisgICovCisgIGlycmVndWxhcjogZnVuY3Rpb24gKHNpbmd1bGFyLCBwbHVyYWwpIHsKKyAgICBs
b2FkSXJyZWd1bGFyKHRoaXMucnVsZXMsIFtbc2luZ3VsYXIsIHBsdXJhbF1dKTsKKyAgfSwKKwor
ICAvKioKKyAgICBAbWV0aG9kIHBsdXJhbGl6ZQorICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCisg
ICovCisgIHBsdXJhbGl6ZTogZnVuY3Rpb24od29yZCkgeworICAgIHJldHVybiB0aGlzLmluZmxl
Y3Qod29yZCwgdGhpcy5ydWxlcy5wbHVyYWxzLCB0aGlzLnJ1bGVzLmlycmVndWxhcik7CisgIH0s
CisKKyAgLyoqCisgICAgQG1ldGhvZCBzaW5ndWxhcml6ZQorICAgIEBwYXJhbSB7U3RyaW5nfSB3
b3JkCisgICovCisgIHNpbmd1bGFyaXplOiBmdW5jdGlvbih3b3JkKSB7CisgICAgcmV0dXJuIHRo
aXMuaW5mbGVjdCh3b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCAgdGhpcy5ydWxlcy5pcnJlZ3Vs
YXJJbnZlcnNlKTsKKyAgfSwKKworICAvKioKKyAgICBAcHJvdGVjdGVkCisKKyAgICBAbWV0aG9k
IGluZmxlY3QKKyAgICBAcGFyYW0ge1N0cmluZ30gd29yZAorICAgIEBwYXJhbSB7T2JqZWN0fSB0
eXBlUnVsZXMKKyAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFyCisgICovCisgIGluZmxlY3Q6
IGZ1bmN0aW9uKHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7CisgICAgdmFyIGluZmxlY3Rp
b24sIHN1YnN0aXR1dGlvbiwgcmVzdWx0LCBsb3dlcmNhc2UsIGlzQmxhbmssCisgICAgaXNVbmNv
dW50YWJsZSwgaXNJcnJlZ3VsYXIsIGlzSXJyZWd1bGFySW52ZXJzZSwgcnVsZTsKKworICAgIGlz
QmxhbmsgPSBCTEFOS19SRUdFWC50ZXN0KHdvcmQpOworCisgICAgaWYgKGlzQmxhbmspIHsKKyAg
ICAgIHJldHVybiB3b3JkOworICAgIH0KKworICAgIGxvd2VyY2FzZSA9IHdvcmQudG9Mb3dlckNh
c2UoKTsKKworICAgIGlzVW5jb3VudGFibGUgPSB0aGlzLnJ1bGVzLnVuY291bnRhYmxlW2xvd2Vy
Y2FzZV07CisKKyAgICBpZiAoaXNVbmNvdW50YWJsZSkgeworICAgICAgcmV0dXJuIHdvcmQ7Cisg
ICAgfQorCisgICAgaXNJcnJlZ3VsYXIgPSBpcnJlZ3VsYXIgJiYgaXJyZWd1bGFyW2xvd2VyY2Fz
ZV07CisKKyAgICBpZiAoaXNJcnJlZ3VsYXIpIHsKKyAgICAgIHJldHVybiBpc0lycmVndWxhcjsK
KyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gdHlwZVJ1bGVzLmxlbmd0aCwgbWluID0gMDsgaSA+
IG1pbjsgaS0tKSB7CisgICAgICAgaW5mbGVjdGlvbiA9IHR5cGVSdWxlc1tpLTFdOworICAgICAg
IHJ1bGUgPSBpbmZsZWN0aW9uWzBdOworCisgICAgICBpZiAocnVsZS50ZXN0KHdvcmQpKSB7Cisg
ICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGluZmxlY3Rpb24gPSBpbmZsZWN0
aW9uIHx8IFtdOworCisgICAgcnVsZSA9IGluZmxlY3Rpb25bMF07CisgICAgc3Vic3RpdHV0aW9u
ID0gaW5mbGVjdGlvblsxXTsKKworICAgIHJlc3VsdCA9IHdvcmQucmVwbGFjZShydWxlLCBzdWJz
dGl0dXRpb24pOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKKworRW1iZXIuSW5mbGVj
dG9yID0gSW5mbGVjdG9yOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworRW1iZXIuSW5m
bGVjdG9yLmRlZmF1bHRSdWxlcyA9IHsKKyAgcGx1cmFsczogWworICAgIFsvJC8sICdzJ10sCisg
ICAgWy9zJC9pLCAncyddLAorICAgIFsvXihheHx0ZXN0KWlzJC9pLCAnJDFlcyddLAorICAgIFsv
KG9jdG9wfHZpcil1cyQvaSwgJyQxaSddLAorICAgIFsvKG9jdG9wfHZpcilpJC9pLCAnJDFpJ10s
CisgICAgWy8oYWxpYXN8c3RhdHVzKSQvaSwgJyQxZXMnXSwKKyAgICBbLyhidSlzJC9pLCAnJDFz
ZXMnXSwKKyAgICBbLyhidWZmYWx8dG9tYXQpbyQvaSwgJyQxb2VzJ10sCisgICAgWy8oW3RpXSl1
bSQvaSwgJyQxYSddLAorICAgIFsvKFt0aV0pYSQvaSwgJyQxYSddLAorICAgIFsvc2lzJC9pLCAn
c2VzJ10sCisgICAgWy8oPzooW15mXSlmZXwoW2xyXSlmKSQvaSwgJyQxJDJ2ZXMnXSwKKyAgICBb
LyhoaXZlKSQvaSwgJyQxcyddLAorICAgIFsvKFteYWVpb3V5XXxxdSl5JC9pLCAnJDFpZXMnXSwK
KyAgICBbLyh4fGNofHNzfHNoKSQvaSwgJyQxZXMnXSwKKyAgICBbLyhtYXRyfHZlcnR8aW5kKSg/
Oml4fGV4KSQvaSwgJyQxaWNlcyddLAorICAgIFsvXihtfGwpb3VzZSQvaSwgJyQxaWNlJ10sCisg
ICAgWy9eKG18bClpY2UkL2ksICckMWljZSddLAorICAgIFsvXihveCkkL2ksICckMWVuJ10sCisg
ICAgWy9eKG94ZW4pJC9pLCAnJDEnXSwKKyAgICBbLyhxdWl6KSQvaSwgJyQxemVzJ10KKyAgXSwK
KworICBzaW5ndWxhcjogWworICAgIFsvcyQvaSwgJyddLAorICAgIFsvKHNzKSQvaSwgJyQxJ10s
CisgICAgWy8obilld3MkL2ksICckMWV3cyddLAorICAgIFsvKFt0aV0pYSQvaSwgJyQxdW0nXSwK
KyAgICBbLygoYSluYWx5fChiKWF8KGQpaWFnbm98KHApYXJlbnRoZXwocClyb2dub3wocyl5bm9w
fCh0KWhlKShzaXN8c2VzKSQvaSwgJyQxc2lzJ10sCisgICAgWy8oXmFuYWx5KShzaXN8c2VzKSQv
aSwgJyQxc2lzJ10sCisgICAgWy8oW15mXSl2ZXMkL2ksICckMWZlJ10sCisgICAgWy8oaGl2ZSlz
JC9pLCAnJDEnXSwKKyAgICBbLyh0aXZlKXMkL2ksICckMSddLAorICAgIFsvKFtscl0pdmVzJC9p
LCAnJDFmJ10sCisgICAgWy8oW15hZWlvdXldfHF1KWllcyQvaSwgJyQxeSddLAorICAgIFsvKHMp
ZXJpZXMkL2ksICckMWVyaWVzJ10sCisgICAgWy8obSlvdmllcyQvaSwgJyQxb3ZpZSddLAorICAg
IFsvKHh8Y2h8c3N8c2gpZXMkL2ksICckMSddLAorICAgIFsvXihtfGwpaWNlJC9pLCAnJDFvdXNl
J10sCisgICAgWy8oYnVzKShlcyk/JC9pLCAnJDEnXSwKKyAgICBbLyhvKWVzJC9pLCAnJDEnXSwK
KyAgICBbLyhzaG9lKXMkL2ksICckMSddLAorICAgIFsvKGNyaXN8dGVzdCkoaXN8ZXMpJC9pLCAn
JDFpcyddLAorICAgIFsvXihhKXhbaWVdcyQvaSwgJyQxeGlzJ10sCisgICAgWy8ob2N0b3B8dmly
KSh1c3xpKSQvaSwgJyQxdXMnXSwKKyAgICBbLyhhbGlhc3xzdGF0dXMpKGVzKT8kL2ksICckMSdd
LAorICAgIFsvXihveCllbi9pLCAnJDEnXSwKKyAgICBbLyh2ZXJ0fGluZClpY2VzJC9pLCAnJDFl
eCddLAorICAgIFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwKKyAgICBbLyhxdWl6KXplcyQvaSwg
JyQxJ10sCisgICAgWy8oZGF0YWJhc2UpcyQvaSwgJyQxJ10KKyAgXSwKKworICBpcnJlZ3VsYXJQ
YWlyczogWworICAgIFsncGVyc29uJywgJ3Blb3BsZSddLAorICAgIFsnbWFuJywgJ21lbiddLAor
ICAgIFsnY2hpbGQnLCAnY2hpbGRyZW4nXSwKKyAgICBbJ3NleCcsICdzZXhlcyddLAorICAgIFsn
bW92ZScsICdtb3ZlcyddLAorICAgIFsnY293JywgJ2tpbmUnXSwKKyAgICBbJ3pvbWJpZScsICd6
b21iaWVzJ10KKyAgXSwKKworICB1bmNvdW50YWJsZTogWworICAgICdlcXVpcG1lbnQnLAorICAg
ICdpbmZvcm1hdGlvbicsCisgICAgJ3JpY2UnLAorICAgICdtb25leScsCisgICAgJ3NwZWNpZXMn
LAorICAgICdzZXJpZXMnLAorICAgICdmaXNoJywKKyAgICAnc2hlZXAnLAorICAgICdqZWFucycs
CisgICAgJ3BvbGljZScKKyAgXQorfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK2lm
IChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9U
WVBFUy5TdHJpbmcpIHsKKyAgLyoqCisgICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5n
L3BsdXJhbGl6ZSJ9fXt7L2Nyb3NzTGlua319CisKKyAgICBAbWV0aG9kIHBsdXJhbGl6ZQorICAg
IEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUucGx1cmFsaXplID0gZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxpemUodGhpcyk7CisgIH07CisK
KyAgLyoqCisgICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3Npbmd1bGFyaXplIn19
e3svY3Jvc3NMaW5rfX0KKworICAgIEBtZXRob2Qgc2luZ3VsYXJpemUKKyAgICBAZm9yIFN0cmlu
ZworICAqLworICBTdHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXplID0gZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZSh0aGlzKTsKKyAgfTsKK30KKworfSko
KTsKKworCisKKyhmdW5jdGlvbigpIHsKK0VtYmVyLkluZmxlY3Rvci5pbmZsZWN0b3IgPSBuZXcg
RW1iZXIuSW5mbGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0UnVsZXMpOworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1v
ZHVsZSBlbWJlci1kYXRhCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LAorICAgIGZvckVhY2gg
PSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKKyAgICBjYW1lbGl6ZSA9ICAgRW1iZXIu
U3RyaW5nLmNhbWVsaXplLAorICAgIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6
ZSwKKyAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCisgICAgc2luZ3Vs
YXJpemUgPSBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUsCisgICAgdW5kZXJzY29yZSA9IEVtYmVy
LlN0cmluZy51bmRlcnNjb3JlOworCitEUy5BY3RpdmVNb2RlbFNlcmlhbGl6ZXIgPSBEUy5SRVNU
U2VyaWFsaXplci5leHRlbmQoeworICAvLyBTRVJJQUxJWkUKKworICAvKioKKyAgICBDb252ZXJ0
cyBjYW1lbGNhc2VkIGF0dHJpYnV0ZXMgdG8gdW5kZXJzY29yZWQgd2hlbiBzZXJpYWxpemluZy4K
KworICAgIEBtZXRob2Qga2V5Rm9yQXR0cmlidXRlCisgICAgQHBhcmFtIHtTdHJpbmd9IGF0dHJp
YnV0ZQorICAgIEByZXR1cm5zIFN0cmluZworICAqLworICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0
aW9uKGF0dHIpIHsKKyAgICByZXR1cm4gZGVjYW1lbGl6ZShhdHRyKTsKKyAgfSwKKworICAvKioK
KyAgICBVbmRlcnNjb3JlcyByZWxhdGlvbnNoaXAgbmFtZXMgYW5kIGFwcGVuZHMgIl9pZCIgb3Ig
Il9pZHMiIHdoZW4gc2VyaWFsaXppbmcKKyAgICByZWxhdGlvbnNoaXAga2V5cy4KKworICAgIEBt
ZXRob2Qga2V5Rm9yUmVsYXRpb25zaGlwCisgICAgQHBhcmFtIHtTdHJpbmd9IGtleQorICAgIEBw
YXJhbSB7U3RyaW5nfSBraW5kCisgICAgQHJldHVybnMgU3RyaW5nCisgICovCisgIGtleUZvclJl
bGF0aW9uc2hpcDogZnVuY3Rpb24oa2V5LCBraW5kKSB7CisgICAga2V5ID0gZGVjYW1lbGl6ZShr
ZXkpOworICAgIGlmIChraW5kID09PSAiYmVsb25nc1RvIikgeworICAgICAgcmV0dXJuIGtleSAr
ICJfaWQiOworICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImhhc01hbnkiKSB7CisgICAgICByZXR1
cm4gc2luZ3VsYXJpemUoa2V5KSArICJfaWRzIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJu
IGtleTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgRG9lcyBub3Qgc2VyaWFsaXplIGhhc01h
bnkgcmVsYXRpb25zaGlwcyBieSBkZWZhdWx0LgorICAqLworICBzZXJpYWxpemVIYXNNYW55OiBF
bWJlci5LLAorCisgIC8qKgorICAgIFVuZGVyc2NvcmVzIHRoZSBKU09OIHJvb3Qga2V5cyB3aGVu
IHNlcmlhbGl6aW5nLgorCisgICAgQG1ldGhvZCBzZXJpYWxpemVJbnRvSGFzaAorICAgIEBwYXJh
bSB7T2JqZWN0fSBoYXNoCisgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQor
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25z
CisgICovCisgIHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByZWNvcmQs
IG9wdGlvbnMpIHsKKyAgICB2YXIgcm9vdCA9IHVuZGVyc2NvcmUoZGVjYW1lbGl6ZSh0eXBlLnR5
cGVLZXkpKTsKKyAgICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCBvcHRpb25z
KTsKKyAgfSwKKworICAvKioKKyAgICBTZXJpYWxpemVzIGEgcG9seW1vcnBoaWMgdHlwZSBhcyBh
IGZ1bGx5IGNhcGl0YWxpemVkIG1vZGVsIG5hbWUuCisKKyAgICBAbWV0aG9kIHNlcmlhbGl6ZVBv
bHltb3JwaGljVHlwZQorICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAorICAgIEBwYXJhbSB7
T2JqZWN0fSBqc29uCisgICAgQHBhcmFtIHJlbGF0aW9uc2hpcAorICAqLworICBzZXJpYWxpemVQ
b2x5bW9ycGhpY1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Cisg
ICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXksCisgICAgICAgIGJlbG9uZ3NUbyA9IGdldChy
ZWNvcmQsIGtleSk7CisgICAga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKKyAgICBq
c29uW2tleSArICJfdHlwZSJdID0gY2FwaXRhbGl6ZShjYW1lbGl6ZShiZWxvbmdzVG8uY29uc3Ry
dWN0b3IudHlwZUtleSkpOworICB9LAorCisgIC8vIEVYVFJBQ1QKKworICAvKioKKyAgICBFeHRy
YWN0cyB0aGUgbW9kZWwgdHlwZUtleSBmcm9tIHVuZGVyc2NvcmVkIHJvb3Qgb2JqZWN0cy4KKwor
ICAgIEBtZXRob2QgdHlwZUZvclJvb3QKKyAgICBAcGFyYW0ge1N0cmluZ30gcm9vdAorICAgIEBy
ZXR1cm5zIFN0cmluZyB0aGUgbW9kZWwncyB0eXBlS2V5CisgICovCisgIHR5cGVGb3JSb290OiBm
dW5jdGlvbihyb290KSB7CisgICAgdmFyIGNhbWVsaXplZCA9IGNhbWVsaXplKHJvb3QpOworICAg
IHJldHVybiBzaW5ndWxhcml6ZShjYW1lbGl6ZWQpOworICB9LAorCisgIC8qKgorICAgIEFkZCBl
eHRyYSBzdGVwIHRvIGBEUy5SRVNUU2VyaWFsaXplci5ub3JtYWxpemVgIHNvIGxpbmtzIGFyZQor
ICAgIG5vcm1hbGl6ZWQuCisKKyAgICBJZiB5b3VyIHBheWxvYWQgbG9va3MgbGlrZSB0aGlzCisK
KyAgICBgYGBqcworICAgIHsKKyAgICAgICJwb3N0IjogeworICAgICAgICAiaWQiOiAxLAorICAg
ICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCisgICAgICAgICJsaW5rcyI6IHsgImZs
YWdnZWRfY29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KKyAgICAgIH0KKyAgICB9
CisgICAgYGBgCisgICAgVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiB3b3VsZCBsb29rIGxpa2UgdGhp
cworCisgICAgYGBganMKKyAgICB7CisgICAgICAicG9zdCI6IHsKKyAgICAgICAgImlkIjogMSwK
KyAgICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAorICAgICAgICAibGlua3MiOiB7
ICJmbGFnZ2VkQ29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KKyAgICAgIH0KKyAg
ICB9CisgICAgYGBgCisKKyAgICBAbWV0aG9kIG5vcm1hbGl6ZQorICAgIEBwYXJhbSB7c3ViY2xh
c3Mgb2YgRFMuTW9kZWx9IHR5cGUKKyAgICBAcGFyYW0ge09iamVjdH0gaGFzaAorICAgIEBwYXJh
bSB7U3RyaW5nfSBwcm9wCisgICAgQHJldHVybnMgT2JqZWN0CisgICovCisKKyAgbm9ybWFsaXpl
OiBmdW5jdGlvbih0eXBlLCBoYXNoLCBwcm9wKSB7CisgICAgdGhpcy5ub3JtYWxpemVMaW5rcyho
YXNoKTsKKworICAgIHJldHVybiB0aGlzLl9zdXBlcih0eXBlLCBoYXNoLCBwcm9wKTsKKyAgfSwK
KworICAvKioKKyAgICBDb252ZXJ0IGBzbmFrZV9jYXNlZGAgbGlua3MgIHRvIGBjYW1lbENhc2Vg
CisKKyAgICBAbWV0aG9kIG5vcm1hbGl6ZUxpbmtzCisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2gK
KyAgKi8KKworICBub3JtYWxpemVMaW5rczogZnVuY3Rpb24oZGF0YSl7CisgICAgaWYgKGRhdGEu
bGlua3MpIHsKKyAgICAgIHZhciBsaW5rcyA9IGRhdGEubGlua3M7CisKKyAgICAgIGZvciAodmFy
IGxpbmsgaW4gbGlua3MpIHsKKyAgICAgICAgdmFyIGNhbWVsaXplZExpbmsgPSBjYW1lbGl6ZShs
aW5rKTsKKworICAgICAgICBpZiAoY2FtZWxpemVkTGluayAhPT0gbGluaykgeworICAgICAgICAg
IGxpbmtzW2NhbWVsaXplZExpbmtdID0gbGlua3NbbGlua107CisgICAgICAgICAgZGVsZXRlIGxp
bmtzW2xpbmtdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIC8qKgorICAg
IE5vcm1hbGl6ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSBmcm9tIHRoZSBKU09OLgorCisgICAgTm9y
bWFsaXplOgorICAgIGBgYGpzCisgICAgICB7CisgICAgICAgIGlkOiAiMSIKKyAgICAgICAgbWlu
aW9uOiB7IHR5cGU6ICJldmlsX21pbmlvbiIsIGlkOiAiMTIifQorICAgICAgfQorICAgIGBgYAor
CisgICAgVG86CisgICAgYGBganMKKyAgICAgIHsKKyAgICAgICAgaWQ6ICIxIgorICAgICAgICBt
aW5pb246IHsgdHlwZTogImV2aWxNaW5pb24iLCBpZDogIjEyIn0KKyAgICAgIH0KKyAgICBgYGAK
KworICAgIEBtZXRob2Qgbm9ybWFsaXplUmVsYXRpb25zaGlwcworICAgIEBwcml2YXRlCisgICov
CisgIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcHM6IGZ1bmN0aW9uKHR5cGUsIGhhc2gpIHsKKyAgICB2
YXIgcGF5bG9hZEtleSwgcGF5bG9hZDsKKworICAgIGlmICh0aGlzLmtleUZvclJlbGF0aW9uc2hp
cCkgeworICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25z
aGlwKSB7CisgICAgICAgIGlmIChyZWxhdGlvbnNoaXAub3B0aW9ucy5wb2x5bW9ycGhpYykgewor
ICAgICAgICAgIHBheWxvYWRLZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpOworICAgICAg
ICAgIHBheWxvYWQgPSBoYXNoW3BheWxvYWRLZXldOworICAgICAgICAgIGlmIChwYXlsb2FkICYm
IHBheWxvYWQudHlwZSkgeworICAgICAgICAgICAgcGF5bG9hZC50eXBlID0gdGhpcy50eXBlRm9y
Um9vdChwYXlsb2FkLnR5cGUpOworICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiByZWxh
dGlvbnNoaXAua2luZCA9PT0gImhhc01hbnkiKSB7CisgICAgICAgICAgICB2YXIgc2VsZiA9IHRo
aXM7CisgICAgICAgICAgICBmb3JFYWNoKHBheWxvYWQsIGZ1bmN0aW9uKHNpbmdsZSkgeworICAg
ICAgICAgICAgICBzaW5nbGUudHlwZSA9IHNlbGYudHlwZUZvclJvb3Qoc2luZ2xlLnR5cGUpOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IHBheWxvYWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5r
aW5kKTsKKyAgICAgICAgICBwYXlsb2FkID0gaGFzaFtwYXlsb2FkS2V5XTsKKyAgICAgICAgfQor
CisgICAgICAgIGhhc2hba2V5XSA9IHBheWxvYWQ7CisKKyAgICAgICAgaWYgKGtleSAhPT0gcGF5
bG9hZEtleSkgeworICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxvYWRLZXldOworICAgICAgICB9
CisgICAgICB9LCB0aGlzKTsKKyAgICB9CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0
aW9uKCkgewordmFyIGdldCA9IEVtYmVyLmdldDsKK3ZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVy
YWJsZVV0aWxzLmZvckVhY2g7CisKKy8qKgorICBUaGUgRW1iZWRkZWRSZWNvcmRzTWl4aW4gYWxs
b3dzIHlvdSB0byBhZGQgZW1iZWRkZWQgcmVjb3JkIHN1cHBvcnQgdG8geW91cgorICBzZXJpYWxp
emVycy4KKyAgVG8gc2V0IHVwIGVtYmVkZGVkIHJlY29yZHMsIHlvdSBpbmNsdWRlIHRoZSBtaXhp
biBpbnRvIHRoZSBzZXJpYWxpemVyIGFuZCB0aGVuCisgIGRlZmluZSB5b3VyIGVtYmVkZGVkIHJl
bGF0aW9ucy4KKworICBgYGBqcworICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2Rl
bFNlcmlhbGl6ZXIuZXh0ZW5kKERTLkVtYmVkZGVkUmVjb3Jkc01peGluLCB7CisgICAgYXR0cnM6
IHsKKyAgICAgIGNvbW1lbnRzOiB7ZW1iZWRkZWQ6ICdhbHdheXMnfQorICAgIH0KKyAgfSkKKyAg
YGBgCisKKyAgQ3VycmVudGx5IG9ubHkgYHtlbWJlZGRlZDogJ2Fsd2F5cyd9YCByZWNvcmRzIGFy
ZSBzdXBwb3J0ZWQuCisKKyAgQGNsYXNzIEVtYmVkZGVkUmVjb3Jkc01peGluCisgIEBuYW1lc3Bh
Y2UgRFMKKyovCitEUy5FbWJlZGRlZFJlY29yZHNNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7
CisKKyAgLyoqCisgICAgU2VyaWFsaXplIGhhcy1tYXkgcmVsYXRpb25zaGlwIHdoZW4gaXQgaXMg
Y29uZmlndXJlZCBhcyBlbWJlZGRlZCBvYmplY3RzLgorCisgICAgQG1ldGhvZCBzZXJpYWxpemVI
YXNNYW55CisgICovCisgIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwg
cmVsYXRpb25zaGlwKSB7CisgICAgdmFyIGtleSAgID0gcmVsYXRpb25zaGlwLmtleSwKKyAgICAg
ICAgYXR0cnMgPSBnZXQodGhpcywgJ2F0dHJzJyksCisgICAgICAgIGVtYmVkID0gYXR0cnMgJiYg
YXR0cnNba2V5XSAmJiBhdHRyc1trZXldLmVtYmVkZGVkID09PSAnYWx3YXlzJzsKKworICAgIGlm
IChlbWJlZCkgeworICAgICAganNvblt0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpXSA9IGdldChy
ZWNvcmQsIGtleSkubWFwKGZ1bmN0aW9uKHJlbGF0aW9uKSB7CisgICAgICAgIHZhciBkYXRhID0g
cmVsYXRpb24uc2VyaWFsaXplKCksCisgICAgICAgICAgICBwcmltYXJ5S2V5ID0gZ2V0KHRoaXMs
ICdwcmltYXJ5S2V5Jyk7CisKKyAgICAgICAgZGF0YVtwcmltYXJ5S2V5XSA9IGdldChyZWxhdGlv
biwgcHJpbWFyeUtleSk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICB9LCB0aGlzKTsK
KyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgRXh0cmFjdCBlbWJlZGRlZCBvYmplY3RzIG91dCBv
ZiB0aGUgcGF5bG9hZCBmb3IgYSBzaW5nbGUgb2JqZWN0CisgICAgYW5kIGFkZCB0aGVtIGFzIHNp
ZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgorCisgICAgQG1ldGhvZCBleHRyYWN0U2luZ2xlCisg
ICovCisgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBwcmltYXJ5VHlwZSwgcGF5bG9h
ZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7CisgICAgdmFyIHJvb3QgPSB0aGlzLmtleUZvckF0
dHJpYnV0ZShwcmltYXJ5VHlwZS50eXBlS2V5KSwKKyAgICAgICAgcGFydGlhbCA9IHBheWxvYWRb
cm9vdF07CisKKyAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCB0aGlzLCBwcmlt
YXJ5VHlwZSwgcGFydGlhbCwgcGF5bG9hZCk7CisKKyAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3Rv
cmUsIHByaW1hcnlUeXBlLCBwYXlsb2FkLCByZWNvcmRJZCwgcmVxdWVzdFR5cGUpOworICB9LAor
CisgIC8qKgorICAgIEV4dHJhY3QgZW1iZWRkZWQgb2JqZWN0cyBvdXQgb2YgYSBzdGFuZGFyZCBw
YXlsb2FkCisgICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgor
CisgICAgQG1ldGhvZCBleHRyYWN0QXJyYXkKKyAgKi8KKyAgZXh0cmFjdEFycmF5OiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeworICAgIHZhciByb290ID0gdGhpcy5rZXlGb3JBdHRy
aWJ1dGUodHlwZS50eXBlS2V5KSwKKyAgICAgICAgcGFydGlhbHMgPSBwYXlsb2FkW0VtYmVyLlN0
cmluZy5wbHVyYWxpemUocm9vdCldOworCisgICAgZm9yRWFjaChwYXJ0aWFscywgZnVuY3Rpb24o
cGFydGlhbCkgeworICAgICAgdXBkYXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgdGhpcywg
dHlwZSwgcGFydGlhbCwgcGF5bG9hZCk7CisgICAgfSwgdGhpcyk7CisKKyAgICByZXR1cm4gdGhp
cy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQpOworICB9Cit9KTsKKworZnVuY3Rpb24gdXBk
YXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgc2VyaWFsaXplciwgdHlwZSwgcGFydGlhbCwg
cGF5bG9hZCkgeworICB2YXIgYXR0cnMgPSBnZXQoc2VyaWFsaXplciwgJ2F0dHJzJyk7CisKKyAg
aWYgKCFhdHRycykgeworICAgIHJldHVybjsKKyAgfQorCisgIHR5cGUuZWFjaFJlbGF0aW9uc2hp
cChmdW5jdGlvbihrZXksIHJlbGF0aW9uc2hpcCkgeworICAgIHZhciBleHBhbmRlZEtleSwgZW1i
ZWRkZWRUeXBlS2V5LCBhdHRyaWJ1dGUsIGlkcywKKyAgICAgICAgY29uZmlnID0gYXR0cnNba2V5
XSwKKyAgICAgICAgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IocmVsYXRpb25zaGlw
LnR5cGUudHlwZUtleSksCisgICAgICAgIHByaW1hcnlLZXkgPSBnZXQoc2VyaWFsaXplciwgInBy
aW1hcnlLZXkiKTsKKworICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCAhPT0gImhhc01hbnkiKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNvbmZpZyAmJiAoY29uZmlnLmVtYmVk
ZGVkID09PSAnYWx3YXlzJyB8fCBjb25maWcuZW1iZWRkZWQgPT09ICdsb2FkJykpIHsKKyAgICAg
IC8vIHVuZGVyc2NvcmUgZm9yY2VzIHRoZSBlbWJlZGRlZCByZWNvcmRzIHRvIGJlIHNpZGUgbG9h
ZGVkLgorICAgICAgLy8gaXQgaXMgbmVlZGVkIHdoZW4gbWFpbiB0eXBlID09PSByZWxhdGlvbnNo
aXAudHlwZQorICAgICAgZW1iZWRkZWRUeXBlS2V5ID0gJ18nICsgRW1iZXIuU3RyaW5nLnBsdXJh
bGl6ZShyZWxhdGlvbnNoaXAudHlwZS50eXBlS2V5KTsKKyAgICAgIGV4cGFuZGVkS2V5ID0gdGhp
cy5rZXlGb3JSZWxhdGlvbnNoaXAoa2V5LCByZWxhdGlvbnNoaXAua2luZCk7CisgICAgICBhdHRy
aWJ1dGUgID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKKyAgICAgIGlkcyA9IFtdOworCisg
ICAgICBpZiAoIXBhcnRpYWxbYXR0cmlidXRlXSkgeworICAgICAgICByZXR1cm47CisgICAgICB9
CisKKyAgICAgIHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSA9IHBheWxvYWRbZW1iZWRkZWRUeXBl
S2V5XSB8fCBbXTsKKworICAgICAgZm9yRWFjaChwYXJ0aWFsW2F0dHJpYnV0ZV0sIGZ1bmN0aW9u
KGRhdGEpIHsKKyAgICAgICAgdmFyIGVtYmVkZGVkVHlwZSA9IHN0b3JlLm1vZGVsRm9yKHJlbGF0
aW9uc2hpcC50eXBlLnR5cGVLZXkpOworICAgICAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVk
KHN0b3JlLCBzZXJpYWxpemVyLCBlbWJlZGRlZFR5cGUsIGRhdGEsIHBheWxvYWQpOworICAgICAg
ICBpZHMucHVzaChkYXRhW3ByaW1hcnlLZXldKTsKKyAgICAgICAgcGF5bG9hZFtlbWJlZGRlZFR5
cGVLZXldLnB1c2goZGF0YSk7CisgICAgICB9KTsKKworICAgICAgcGFydGlhbFtleHBhbmRlZEtl
eV0gPSBpZHM7CisgICAgICBkZWxldGUgcGFydGlhbFthdHRyaWJ1dGVdOworICAgIH0KKyAgfSwg
c2VyaWFsaXplcik7Cit9Cit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCisgIEBtb2R1
bGUgZW1iZXItZGF0YQorKi8KKwordmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
Zm9yRWFjaDsKK3ZhciBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCisgICAg
dW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLAorICAgIHBsdXJhbGl6ZSAgPSBF
bWJlci5TdHJpbmcucGx1cmFsaXplOworCisvKioKKyAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBp
cyBhIHN1YmNsYXNzIG9mIHRoZSBSRVNUQWRhcHRlciBkZXNpZ25lZCB0byBpbnRlZ3JhdGUKKyAg
d2l0aCBhIEpTT04gQVBJIHRoYXQgdXNlcyBhbiB1bmRlcnNjb3JlZCBuYW1pbmcgY29udmVudGlv
biBpbnN0ZWFkIG9mIGNhbWVsY2FzaW5nLgorICBJdCBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3Jr
IG91dCBvZiB0aGUgYm94IHdpdGggdGhlCisgIFthY3RpdmVfbW9kZWxfc2VyaWFsaXplcnNdKGh0
dHA6Ly9naXRodWIuY29tL3JhaWxzLWFwaS9hY3RpdmVfbW9kZWxfc2VyaWFsaXplcnMpCisgIFJ1
YnkgZ2VtLgorCisgIFRoaXMgYWRhcHRlciBleHRlbmRzIHRoZSBEUy5SRVNUQWRhcHRlciBieSBt
YWtpbmcgY29uc2lzdGVudCB1c2Ugb2YgdGhlIGNhbWVsaXphdGlvbiwKKyAgZGVjYW1lbGl6YXRp
b24gYW5kIHBsdXJhbGl6YXRpb24gbWV0aG9kcyB0byBub3JtYWxpemUgdGhlIHNlcmlhbGl6ZWQg
SlNPTiBpbnRvIGEKKyAgZm9ybWF0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGEgY29udmVudGlv
bmFsIFJhaWxzIGJhY2tlbmQgYW5kIEVtYmVyIERhdGEuCisKKyAgIyMgSlNPTiBTdHJ1Y3R1cmUK
KworICBUaGUgQWN0aXZlTW9kZWxBZGFwdGVyIGV4cGVjdHMgdGhlIEpTT04gcmV0dXJuZWQgZnJv
bSB5b3VyIHNlcnZlciB0byBmb2xsb3cKKyAgdGhlIFJFU1QgYWRhcHRlciBjb252ZW50aW9ucyBz
dWJzdGl0dXRpbmcgdW5kZXJzY29yZWQga2V5cyBmb3IgY2FtZWxjYXNlZCBvbmVzLgorCisgICMj
IyBDb252ZW50aW9uYWwgTmFtZXMKKworICBBdHRyaWJ1dGUgbmFtZXMgaW4geW91ciBKU09OIHBh
eWxvYWQgc2hvdWxkIGJlIHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9ucyBvZgorICB0aGUgYXR0cmli
dXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVscy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGhh
dmUgYSBgUGVyc29uYCBtb2RlbDoKKworICBgYGBqcworICBBcHAuRmFtb3VzUGVyc29uID0gRFMu
TW9kZWwuZXh0ZW5kKHsKKyAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAorICAgIGxh
c3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKKyAgICBvY2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJp
bmcnKQorICB9KTsKKyAgYGBgCisKKyAgVGhlIEpTT04gcmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlr
ZSB0aGlzOgorCisgIGBgYGpzCisgIHsKKyAgICAiZmFtb3VzX3BlcnNvbiI6IHsKKyAgICAgICJm
aXJzdF9uYW1lIjogIkJhcmFjayIsCisgICAgICAibGFzdF9uYW1lIjogIk9iYW1hIiwKKyAgICAg
ICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKKyAgICB9CisgIH0KKyAgYGBgCisKKyAgQGNsYXNz
IEFjdGl2ZU1vZGVsQWRhcHRlcgorICBAY29uc3RydWN0b3IKKyAgQG5hbWVzcGFjZSBEUworICBA
ZXh0ZW5kcyBEUy5BZGFwdGVyCisqKi8KKworRFMuQWN0aXZlTW9kZWxBZGFwdGVyID0gRFMuUkVT
VEFkYXB0ZXIuZXh0ZW5kKHsKKyAgZGVmYXVsdFNlcmlhbGl6ZXI6ICctYWN0aXZlLW1vZGVsJywK
KyAgLyoqCisgICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBwYXRoRm9y
VHlwZWAgbWV0aG9kIHRvIGJ1aWxkCisgICAgdW5kZXJzY29yZWQgVVJMcyBieSBkZWNhbWVsaXpp
bmcgYW5kIHBsdXJhbGl6aW5nIHRoZSBvYmplY3QgdHlwZSBuYW1lLgorCisgICAgYGBganMKKyAg
ICAgIHRoaXMucGF0aEZvclR5cGUoImZhbW91c1BlcnNvbiIpOworICAgICAgLy89PiAiZmFtb3Vz
X3Blb3BsZSIKKyAgICBgYGAKKworICAgIEBtZXRob2QgcGF0aEZvclR5cGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gdHlwZQorICAgIEByZXR1cm5zIFN0cmluZworICAqLworICBwYXRoRm9yVHlwZTog
ZnVuY3Rpb24odHlwZSkgeworICAgIHZhciBkZWNhbWVsaXplZCA9IGRlY2FtZWxpemUodHlwZSk7
CisgICAgdmFyIHVuZGVyc2NvcmVkID0gdW5kZXJzY29yZShkZWNhbWVsaXplZCk7CisgICAgcmV0
dXJuIHBsdXJhbGl6ZSh1bmRlcnNjb3JlZCk7CisgIH0sCisKKyAgLyoqCisgICAgVGhlIEFjdGl2
ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBhamF4RXJyb3JgIG1ldGhvZAorICAgIHRvIHJl
dHVybiBhIERTLkludmFsaWRFcnJvciBmb3IgYWxsIDQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eQor
ICAgIHJlc3BvbnNlcy4KKworICAgIEEgNDIyIEhUVFAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVy
IGdlbmVyYWxseSBpbXBsaWVzIHRoYXQgdGhlIHJlcXVlc3QKKyAgICB3YXMgd2VsbCBmb3JtZWQg
YnV0IHRoZSBBUEkgd2FzIHVuYWJsZSB0byBwcm9jZXNzIGl0IGJlY2F1c2UgdGhlCisgICAgY29u
dGVudCB3YXMgbm90IHNlbWFudGljYWxseSBjb3JyZWN0IG9yIG1lYW5pbmdmdWwgcGVyIHRoZSBB
UEkuCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiA0MjIgSFRUUCBFcnJvciBjb2RlIHNl
ZSAxMS4yIFdlYkRBViBSRkMgNDkxOAorICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9y
ZmM0OTE4I3NlY3Rpb24tMTEuMgorCisgICAgQG1ldGhvZCBhamF4RXJyb3IKKyAgICBAcGFyYW0g
anFYSFIKKyAgICBAcmV0dXJucyBlcnJvcgorICAqLworICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpx
WEhSKSB7CisgICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOworCisgICAgaWYgKGpx
WEhSICYmIGpxWEhSLnN0YXR1cyA9PT0gNDIyKSB7CisgICAgICB2YXIgcmVzcG9uc2UgPSBFbWJl
ci4kLnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQpLAorICAgICAgICAgIGVycm9ycyA9IHt9
OworCisgICAgICBpZiAocmVzcG9uc2UuZXJyb3JzICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAg
dmFyIGpzb25FcnJvcnMgPSByZXNwb25zZS5lcnJvcnM7CisKKyAgICAgICAgZm9yRWFjaChFbWJl
ci5rZXlzKGpzb25FcnJvcnMpLCBmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICBlcnJvcnNbRW1i
ZXIuU3RyaW5nLmNhbWVsaXplKGtleSldID0ganNvbkVycm9yc1trZXldOworICAgICAgICB9KTsK
KyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoZXJyb3JzKTsKKyAg
ICB9IGVsc2UgeworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgfQorfSk7CisKK30pKCk7
CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CitFbWJl
ci5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24oQXBwbGljYXRpb24pIHsKKyAg
QXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgIG5hbWU6ICJhY3RpdmVNb2RlbEFkYXB0ZXIi
LAorCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewor
ICAgICAgdmFyIHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7CisgICAg
ICBwcm94eS5yZWdpc3RlckRlcHJlY2F0aW9ucyhbCisgICAgICAgIHtkZXByZWNhdGVkOiAnc2Vy
aWFsaXplcjpfYW1zJywgIHZhbGlkOiAnc2VyaWFsaXplcjotYWN0aXZlLW1vZGVsJ30sCisgICAg
ICAgIHtkZXByZWNhdGVkOiAnYWRhcHRlcjpfYW1zJywgICAgIHZhbGlkOiAnYWRhcHRlcjotYWN0
aXZlLW1vZGVsJ30KKyAgICAgIF0pOworCisgICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2Vy
aWFsaXplcjotYWN0aXZlLW1vZGVsJywgRFMuQWN0aXZlTW9kZWxTZXJpYWxpemVyKTsKKyAgICAg
IGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1hY3RpdmUtbW9kZWwnLCBEUy5BY3RpdmVN
b2RlbEFkYXB0ZXIpOworICAgIH0KKyAgfSk7Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlv
bigpIHsKKworfSkoKTsKKworCit9KSgpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9E
b1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3Rv
cmFnZV9hZGFwdGVyLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRz
L2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVyLmpzCmluZGV4
IDYwYmMwNGM3YmQ3OGU3NGI4Mjg3MTZlY2Q4NTQzNjllZWY4ODBlNDIuLjlhOTE5MjY0ZTRkNzIw
OTA5MWI3NThhNzY2N2I4MmJjMWVjZTE4OTAgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMv
RG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0
b3JhZ2VfYWRhcHRlci5qcworKysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBv
bmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2FkYXB0ZXIuanMK
QEAgLTEsNjUgKzEsMzAgQEAKLURTLkxTU2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4
dGVuZCh7Ci0KLSAgYWRkQmVsb25nc1RvOiBmdW5jdGlvbihkYXRhLCByZWNvcmQsIGtleSwgYXNz
b2NpYXRpb24pIHsKLSAgICBkYXRhW2tleV0gPSByZWNvcmQuZ2V0KGtleSArICcuaWQnKTsKLSAg
fSwKLQotICBhZGRIYXNNYW55OiBmdW5jdGlvbihkYXRhLCByZWNvcmQsIGtleSwgYXNzb2NpYXRp
b24pIHsKLSAgICBkYXRhW2tleV0gPSByZWNvcmQuZ2V0KGtleSkubWFwKGZ1bmN0aW9uKHJlY29y
ZCkgewotICAgICAgcmV0dXJuIHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAg
Ly8gZXh0cmFjdCBleHBlY3RzIGEgcm9vdCBrZXksIHdlIGRvbid0IHdhbnQgdG8gc2F2ZSBhbGwg
dGhlc2Uga2V5cyB0bwotICAvLyBsb2NhbFN0b3JhZ2Ugc28gd2UgZ2VuZXJhdGUgdGhlIHJvb3Qg
a2V5cyBoZXJlCi0gIGV4dHJhY3Q6IGZ1bmN0aW9uKGxvYWRlciwganNvbiwgdHlwZSwgcmVjb3Jk
KSB7Ci0gICAgdGhpcy5fc3VwZXIobG9hZGVyLCB0aGlzLnJvb3RKU09OKGpzb24sIHR5cGUpLCB0
eXBlLCByZWNvcmQpOwotICB9LAotCi0gIGV4dHJhY3RNYW55OiBmdW5jdGlvbihsb2FkZXIsIGpz
b24sIHR5cGUsIHJlY29yZHMpIHsKLSAgICB0aGlzLl9zdXBlcihsb2FkZXIsIHRoaXMucm9vdEpT
T04oanNvbiwgdHlwZSwgJ3BsdXJhbGl6ZScpLCB0eXBlLCByZWNvcmRzKTsKLSAgfSwKLQotICBy
b290SlNPTjogZnVuY3Rpb24oanNvbiwgdHlwZSwgcGx1cmFsaXplKSB7Ci0gICAgdmFyIHJvb3Qg
PSB0aGlzLnJvb3RGb3JUeXBlKHR5cGUpOwotICAgIGlmIChwbHVyYWxpemUgPT0gJ3BsdXJhbGl6
ZScpIHsgcm9vdCA9IHRoaXMucGx1cmFsaXplKHJvb3QpOyB9Ci0gICAgdmFyIHJvb3RlZEpTT04g
PSB7fTsKLSAgICByb290ZWRKU09OW3Jvb3RdID0ganNvbjsKLSAgICByZXR1cm4gcm9vdGVkSlNP
TjsKLSAgfQotCi19KTsKKy8qZ2xvYmFsIEVtYmVyKi8KKy8qZ2xvYmFsIERTKi8KKyd1c2Ugc3Ry
aWN0JzsKIAogRFMuTFNBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoRW1iZXIuRXZlbnRlZCwg
ewogCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX2xvYWREYXRhKCk7Ci0gIH0sCi0K
LSAgZ2VuZXJhdGVJZEZvclJlY29yZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIE1hdGgucmFu
ZG9tKCkudG9TdHJpbmcoMzIpLnNsaWNlKDIpLnN1YnN0cigwLDUpOwotICB9LAotCi0gIHNlcmlh
bGl6ZXI6IERTLkxTU2VyaWFsaXplci5jcmVhdGUoKSwKLQotICBmaW5kOiBmdW5jdGlvbihzdG9y
ZSwgdHlwZSwgaWQpIHsKLSAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlw
ZSh0eXBlKTsKLSAgICB0aGlzLl9hc3luYyhmdW5jdGlvbigpewotICAgICAgdmFyIGNvcHkgPSBF
bWJlci5jb3B5KG5hbWVzcGFjZS5yZWNvcmRzW2lkXSk7Ci0gICAgICB0aGlzLmRpZEZpbmRSZWNv
cmQoc3RvcmUsIHR5cGUsIGNvcHksIGlkKTsKLSAgICB9KTsKLSAgfSwKLQotICBmaW5kTWFueTog
ZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgewotICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9u
YW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgIHRoaXMuX2FzeW5jKGZ1bmN0aW9uKCl7Ci0gICAg
ICB2YXIgcmVzdWx0cyA9IFtdOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3Ro
OyBpKyspIHsKLSAgICAgICAgcmVzdWx0cy5wdXNoKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29y
ZHNbaWRzW2ldXSkpOwotICAgICAgfQotICAgICAgdGhpcy5kaWRGaW5kTWFueShzdG9yZSwgdHlw
ZSwgcmVzdWx0cyk7Ci0gICAgfSk7Ci0gIH0sCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAg
ICAgICB0aGlzLl9sb2FkRGF0YSgpOworICAgIH0sCisKKyAgICBnZW5lcmF0ZUlkRm9yUmVjb3Jk
OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMy
KS5zbGljZSgyKS5zdWJzdHIoMCwgNSk7CisgICAgfSwKKworICAgIGZpbmQ6IGZ1bmN0aW9uIChz
dG9yZSwgdHlwZSwgaWQpIHsKKyAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFj
ZUZvclR5cGUodHlwZSk7CisgICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUoRW1iZXIu
Y29weShuYW1lc3BhY2UucmVjb3Jkc1tpZF0pKTsKKyAgICB9LAorCisgICAgZmluZE1hbnk6IGZ1
bmN0aW9uIChzdG9yZSwgdHlwZSwgaWRzKSB7CisgICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlz
Ll9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOworICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAg
cmVzdWx0cy5wdXNoKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29yZHNbaWRzW2ldXSkpOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUocmVzdWx0cyk7CisgICAg
fSwKIAogICAvLyBTdXBwb3J0cyBxdWVyaWVzIHRoYXQgbG9vayBsaWtlIHRoaXM6CiAgIC8vCkBA
IC03NSwxNDEgKzQwLDg3IEBAIERTLkxTQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKEVtYmVy
LkV2ZW50ZWQsIHsKICAgLy8gIG1hdGNoIHJlY29yZHMgd2l0aCAiY29tcGxldGU6IHRydWUiIGFu
ZCB0aGUgbmFtZSAiZm9vIiBvciAiYmFyIgogICAvLwogICAvLyAgICB7IGNvbXBsZXRlOiB0cnVl
LCBuYW1lOiAvZm9vfGJhci8gfQotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBx
dWVyeSwgcmVjb3JkQXJyYXkpIHsKLSAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNl
Rm9yVHlwZSh0eXBlKTsKLSAgICB0aGlzLl9hc3luYyhmdW5jdGlvbigpIHsKLSAgICAgIHZhciBy
ZXN1bHRzID0gdGhpcy5xdWVyeShuYW1lc3BhY2UucmVjb3JkcywgcXVlcnkpOwotICAgICAgdGhp
cy5kaWRGaW5kUXVlcnkoc3RvcmUsIHR5cGUsIHJlc3VsdHMsIHJlY29yZEFycmF5KTsKLSAgICB9
KTsKLSAgfSwKLQotICBxdWVyeTogZnVuY3Rpb24ocmVjb3JkcywgcXVlcnkpIHsKLSAgICB2YXIg
cmVzdWx0cyA9IFtdOwotICAgIHZhciBpZCwgcmVjb3JkLCBwcm9wZXJ0eSwgdGVzdCwgcHVzaDsK
LSAgICBmb3IgKGlkIGluIHJlY29yZHMpIHsKLSAgICAgIHJlY29yZCA9IHJlY29yZHNbaWRdOwot
ICAgICAgZm9yIChwcm9wZXJ0eSBpbiBxdWVyeSkgewotICAgICAgICB0ZXN0ID0gcXVlcnlbcHJv
cGVydHldOwotICAgICAgICBwdXNoID0gZmFsc2U7Ci0gICAgICAgIGlmIChPYmplY3QucHJvdG90
eXBlLnRvU3RyaW5nLmNhbGwodGVzdCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHsKLSAgICAgICAg
ICBwdXNoID0gdGVzdC50ZXN0KHJlY29yZFtwcm9wZXJ0eV0pOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgIHB1c2ggPSByZWNvcmRbcHJvcGVydHldID09PSB0ZXN0OworICAgIGZpbmRRdWVy
eTogZnVuY3Rpb24gKHN0b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3JkQXJyYXkpIHsKKyAgICAgICAg
dmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7CisgICAgICAgIHZh
ciByZXN1bHRzID0gdGhpcy5xdWVyeShuYW1lc3BhY2UucmVjb3JkcywgcXVlcnkpOworICAgICAg
ICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKHJlc3VsdHMpOworICAgIH0sCisKKyAgICBxdWVy
eTogZnVuY3Rpb24gKHJlY29yZHMsIHF1ZXJ5KSB7CisgICAgICAgIHZhciByZXN1bHRzID0gW107
CisgICAgICAgIHZhciBpZCwgcmVjb3JkLCBwcm9wZXJ0eSwgdGVzdCwgcHVzaDsKKyAgICAgICAg
Zm9yIChpZCBpbiByZWNvcmRzKSB7CisgICAgICAgICAgICByZWNvcmQgPSByZWNvcmRzW2lkXTsK
KyAgICAgICAgICAgIGZvciAocHJvcGVydHkgaW4gcXVlcnkpIHsKKyAgICAgICAgICAgICAgICB0
ZXN0ID0gcXVlcnlbcHJvcGVydHldOworICAgICAgICAgICAgICAgIHB1c2ggPSBmYWxzZTsKKyAg
ICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRlc3QpID09
PSAnW29iamVjdCBSZWdFeHBdJykgeworICAgICAgICAgICAgICAgICAgICBwdXNoID0gdGVzdC50
ZXN0KHJlY29yZFtwcm9wZXJ0eV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAgICAgICAgIHB1c2ggPSByZWNvcmRbcHJvcGVydHldID09PSB0ZXN0OworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdXNoKSB7CisgICAgICAg
ICAgICAgICAgcmVzdWx0cy5wdXNoKHJlY29yZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0K
LSAgICAgIH0KLSAgICAgIGlmIChwdXNoKSB7Ci0gICAgICAgIHJlc3VsdHMucHVzaChyZWNvcmQp
OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0czsKLSAgfSwKLQotICBmaW5kQWxs
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSkgewotICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1l
c3BhY2VGb3JUeXBlKHR5cGUpOwotICAgIHRoaXMuX2FzeW5jKGZ1bmN0aW9uKCkgewotICAgICAg
dmFyIHJlc3VsdHMgPSBbXTsKLSAgICAgIGZvciAodmFyIGlkIGluIG5hbWVzcGFjZS5yZWNvcmRz
KSB7Ci0gICAgICAgIHJlc3VsdHMucHVzaChFbWJlci5jb3B5KG5hbWVzcGFjZS5yZWNvcmRzW2lk
XSkpOwotICAgICAgfQotICAgICAgdGhpcy5kaWRGaW5kQWxsKHN0b3JlLCB0eXBlLCByZXN1bHRz
KTsKLSAgICB9KTsKLSAgfSwKLQotICBjcmVhdGVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlw
ZSwgcmVjb3JkcykgewotICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBl
KHR5cGUpOwotICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHRo
aXMuX2FkZFJlY29yZFRvTmFtZXNwYWNlKG5hbWVzcGFjZSwgcmVjb3JkKTsKLSAgICB9LCB0aGlz
KTsKLSAgICB0aGlzLl9hc3luYyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX2RpZFNhdmVSZWNv
cmRzKHN0b3JlLCB0eXBlLCByZWNvcmRzKTsKLSAgICB9KTsKLSAgfSwKLQotICB1cGRhdGVSZWNv
cmRzOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcykgewotICAgIHZhciBuYW1lc3BhY2Ug
PSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgIHRoaXMuX2FzeW5jKGZ1bmN0aW9u
KCkgewotICAgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgeworICAgICAgICBy
ZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgZmluZEFsbDogZnVuY3Rpb24gKHN0b3JlLCB0
eXBlKSB7CisgICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5
cGUpOworICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgICAgICBmb3IgKHZhciBpZCBpbiBu
YW1lc3BhY2UucmVjb3JkcykgeworICAgICAgICAgICAgcmVzdWx0cy5wdXNoKEVtYmVyLmNvcHko
bmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVtYmVy
LlJTVlAucmVzb2x2ZShyZXN1bHRzKTsKKyAgICB9LAorCisgICAgY3JlYXRlUmVjb3JkOiBmdW5j
dGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkgeworICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgdGhpcy5fYWRkUmVjb3JkVG9OYW1l
c3BhY2UobmFtZXNwYWNlLCByZWNvcmQpOworICAgICAgICB0aGlzLl9zYXZlRGF0YSgpOworICAg
ICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKCk7CisgICAgfSwKKworICAgIHVwZGF0ZVJl
Y29yZDogZnVuY3Rpb24gKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICAgICAgdmFyIG5hbWVz
cGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7CiAgICAgICAgIHZhciBpZCA9IHJl
Y29yZC5nZXQoJ2lkJyk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNvcmRzW2lkXSA9IHJlY29yZC5z
ZXJpYWxpemUoe2luY2x1ZGVJZDp0cnVlfSk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICAgIHRoaXMu
X2RpZFNhdmVSZWNvcmRzKHN0b3JlLCB0eXBlLCByZWNvcmRzKTsKLSAgICB9KTsKLSAgfSwKLQot
ICBkZWxldGVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcykgewotICAgIHZh
ciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgIHRoaXMuX2Fz
eW5jKGZ1bmN0aW9uKCkgewotICAgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkg
eworICAgICAgICBuYW1lc3BhY2UucmVjb3Jkc1tpZF0gPSByZWNvcmQudG9KU09OKHsgaW5jbHVk
ZUlkOiB0cnVlIH0pOworICAgICAgICB0aGlzLl9zYXZlRGF0YSgpOworICAgICAgICByZXR1cm4g
RW1iZXIuUlNWUC5yZXNvbHZlKCk7CisgICAgfSwKKworICAgIGRlbGV0ZVJlY29yZDogZnVuY3Rp
b24gKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKKyAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMu
X25hbWVzcGFjZUZvclR5cGUodHlwZSk7CiAgICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lk
Jyk7CiAgICAgICAgIGRlbGV0ZSBuYW1lc3BhY2UucmVjb3Jkc1tpZF07Ci0gICAgICB9KTsKLSAg
ICAgIHRoaXMuX2RpZFNhdmVSZWNvcmRzKHN0b3JlLCB0eXBlLCByZWNvcmRzKTsKLSAgICB9KTsK
KyAgICAgICAgdGhpcy5fc2F2ZURhdGEoKTsKKyAgICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVz
b2x2ZSgpOworICAgIH0sCiAKLSAgfSwKKyAgLy8gcHJpdmF0ZQogCi0gIGRpcnR5UmVjb3Jkc0Zv
ckhhc01hbnlDaGFuZ2U6IGZ1bmN0aW9uKGRpcnR5U2V0LCBwYXJlbnQsIHJlbGF0aW9uc2hpcCkg
ewotICAgIGRpcnR5U2V0LmFkZChwYXJlbnQpOwotICB9LAorICAgIF9nZXROYW1lc3BhY2U6IGZ1
bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlIHx8ICdEUy5MU0FkYXB0
ZXInOworICAgIH0sCiAKLSAgZGlydHlSZWNvcmRzRm9yQmVsb25nc1RvQ2hhbmdlOiBmdW5jdGlv
bihkaXJ0eVNldCwgY2hpbGQsIHJlbGF0aW9uc2hpcCkgewotICAgIGRpcnR5U2V0LmFkZChjaGls
ZCk7Ci0gIH0sCisgICAgX2xvYWREYXRhOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHRoaXMuX2Rh
dGEgPSB7fTsKKyAgICB9LAogCi0gIC8vIHByaXZhdGUKKyAgICBfc2F2ZURhdGE6IGZ1bmN0aW9u
ICgpIHsKKyAgICB9LAogCi0gIF9nZXROYW1lc3BhY2U6IGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biB0aGlzLm5hbWVzcGFjZSB8fCAnRFMuTFNBZGFwdGVyJzsKLSAgfSwKLQotICBfbG9hZERhdGE6
IGZ1bmN0aW9uKCkgewotICAgIHZhciBzdG9yYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhp
cy5fZ2V0TmFtZXNwYWNlKCkpOwotICAgIHRoaXMuX2RhdGEgPSBzdG9yYWdlID8gSlNPTi5wYXJz
ZShzdG9yYWdlKSA6IHt9OwotICB9LAotCi0gIF9kaWRTYXZlUmVjb3JkczogZnVuY3Rpb24oc3Rv
cmUsIHR5cGUsIHJlY29yZHMpIHsKLSAgICB2YXIgc3VjY2VzcyA9IHRoaXMuX3NhdmVEYXRhKCk7
Ci0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgIHN0b3JlLmRpZFNhdmVSZWNvcmRzKHJlY29yZHMp
OwotICAgIH0gZWxzZSB7Ci0gICAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7
Ci0gICAgICAgIHN0b3JlLnJlY29yZFdhc0Vycm9yKHJlY29yZCk7Ci0gICAgICB9KTsKLSAgICAg
IHRoaXMudHJpZ2dlcignUVVPVEFfRVhDRUVERURfRVJSJywgcmVjb3Jkcyk7Ci0gICAgfQotICB9
LAotCi0gIF9zYXZlRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGxvY2FsU3Rv
cmFnZS5zZXRJdGVtKHRoaXMuX2dldE5hbWVzcGFjZSgpLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9k
YXRhKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICBp
ZiAoZXJyb3IubmFtZSA9PSAnUVVPVEFfRVhDRUVERURfRVJSJykgewotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpOwot
ICAgICAgfQotICAgIH0KLSAgfSwKLQotICBfbmFtZXNwYWNlRm9yVHlwZTogZnVuY3Rpb24odHlw
ZSkgewotICAgIHZhciBuYW1lc3BhY2UgPSB0eXBlLnVybCB8fCB0eXBlLnRvU3RyaW5nKCk7Ci0g
ICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZXNwYWNlXSB8fCAoCi0gICAgICB0aGlzLl9kYXRhW25h
bWVzcGFjZV0gPSB7cmVjb3Jkczoge319Ci0gICAgKTsKLSAgfSwKLQotICBfYWRkUmVjb3JkVG9O
YW1lc3BhY2U6IGZ1bmN0aW9uKG5hbWVzcGFjZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGRhdGEgPSBy
ZWNvcmQuc2VyaWFsaXplKHtpbmNsdWRlSWQ6IHRydWV9KTsKLSAgICBuYW1lc3BhY2UucmVjb3Jk
c1tkYXRhLmlkXSA9IGRhdGE7Ci0gIH0sCi0KLSAgX2FzeW5jOiBmdW5jdGlvbihjYWxsYmFjaykg
ewotICAgIHZhciBfdGhpcyA9IHRoaXM7Ci0gICAgc2V0VGltZW91dChmdW5jdGlvbigpewotICAg
ICAgRW1iZXIucnVuKF90aGlzLCBjYWxsYmFjayk7Ci0gICAgfSwgMSk7Ci0gIH0KKyAgICBfbmFt
ZXNwYWNlRm9yVHlwZTogZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgICAgdmFyIG5hbWVzcGFjZSA9
IHR5cGUudXJsIHx8IHR5cGUudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFb
bmFtZXNwYWNlXSB8fCAoCisgICAgICAgICAgICB0aGlzLl9kYXRhW25hbWVzcGFjZV0gPSB7cmVj
b3Jkczoge319CisgICAgICAgICk7CisgICAgfSwKIAorICAgIF9hZGRSZWNvcmRUb05hbWVzcGFj
ZTogZnVuY3Rpb24gKG5hbWVzcGFjZSwgcmVjb3JkKSB7CisgICAgICAgIHZhciBkYXRhID0gcmVj
b3JkLnNlcmlhbGl6ZSh7aW5jbHVkZUlkOiB0cnVlfSk7CisgICAgICAgIG5hbWVzcGFjZS5yZWNv
cmRzW2RhdGEuaWRdID0gZGF0YTsKKyAgICB9CiB9KTsKLQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFu
Y2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyL2VtYmVyLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyL2VtYmVyLmpzCmluZGV4IDA2OWMz
NjllY2U4MWU3ZTllODEyM2M4OWEyY2U0NTI3YjY4YTMxMDIuLmRjNGJiNTAwZDlkMjg2MDc0ZDMz
MjFlOTg5Yzc3YTgyYTcyYmYxZGEgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VF
dmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJlci5qcworKysgYi9QZXJmb3JtYW5jZVRlc3RzL0Rv
WW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMKQEAgLTEsNSArMSwxMiBAQAotLy8g
VmVyc2lvbjogdjEuMC4wLXJjLjEKLS8vIExhc3QgY29tbWl0OiA4YjA2MWI0ICgyMDEzLTAyLTE1
IDEyOjEwOjIyIC0wODAwKQorLyohCisgKiBAb3ZlcnZpZXcgIEVtYmVyIC0gSmF2YVNjcmlwdCBB
cHBsaWNhdGlvbiBGcmFtZXdvcmsKKyAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEtMjAxNCBU
aWxkZSBJbmMuIGFuZCBjb250cmlidXRvcnMKKyAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJp
Z2h0IDIwMDYtMjAxMSBTdHJvYmUgSW5jLgorICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmln
aHQgMjAwOC0yMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEBsaWNlbnNl
ICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UKKyAqICAgICAgICAgICAgU2VlIGh0dHBzOi8v
cmF3LmdpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElDRU5TRQorICogQHZlcnNp
b24gICAxLjMuMQorICovCiAKIAogKGZ1bmN0aW9uKCkgewpAQCAtMjQsNyArMzEsMjAgQEAgaWYg
KCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIpIHsKICAgfQogfQogCi1FbWJlci5FTlYgPSAn
dW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVOViA/IHt9IDogRU5WOworLy8gVGhpcyBuZWVkcyB0byBi
ZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbG9naWMgaW4KKy8vIGBwYWNrYWdlcy9lbWJlci1tZXRh
bC9saWIvY29yZS5qc2AuCisvLworLy8gVGhpcyBpcyBkdXBsaWNhdGVkIGhlcmUgdG8gZW5zdXJl
IHRoYXQgYEVtYmVyLkVOVmAKKy8vIGlzIHNldHVwIGV2ZW4gaWYgYEVtYmVyYCBpcyBub3QgbG9h
ZGVkIHlldC4KK2lmIChFbWJlci5FTlYpIHsKKyAgLy8gZG8gbm90aGluZyBpZiBFbWJlci5FTlYg
aXMgYWxyZWFkeSBzZXR1cAorfSBlbHNlIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEVtYmVy
RU5WKSB7CisgIEVtYmVyLkVOViA9IEVtYmVyRU5WOworfSBlbHNlIGlmKCd1bmRlZmluZWQnICE9
PSB0eXBlb2YgRU5WKSB7CisgIEVtYmVyLkVOViA9IEVOVjsKK30gZWxzZSB7CisgIEVtYmVyLkVO
ViA9IHt9OworfQogCiBpZiAoISgnTUFOREFUT1JZX1NFVFRFUicgaW4gRW1iZXIuRU5WKSkgewog
ICBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUiA9IHRydWU7IC8vIGRlZmF1bHQgdG8gdHJ1ZSBm
b3IgZGVidWcgZGlzdApAQCAtNDksNyArNjksMTQgQEAgaWYgKCEoJ01BTkRBVE9SWV9TRVRURVIn
IGluIEVtYmVyLkVOVikpIHsKICAgICBmYWxzeSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3du
LgogKi8KIEVtYmVyLmFzc2VydCA9IGZ1bmN0aW9uKGRlc2MsIHRlc3QpIHsKLSAgaWYgKCF0ZXN0
KSB0aHJvdyBuZXcgRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIrZGVzYyk7CisgIGlmICghdGVz
dCkgeworICAgIEVtYmVyLkxvZ2dlci5hc3NlcnQodGVzdCwgZGVzYyk7CisgIH0KKworICBpZiAo
RW1iZXIudGVzdGluZyAmJiAhdGVzdCkgeworICAgIC8vIHdoZW4gdGVzdGluZywgZW5zdXJlIHRl
c3QgZmFpbHVyZXMgd2hlbiBhc3NlcnRpb25zIGZhaWwKKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoIkFzc2VydGlvbiBGYWlsZWQ6ICIgKyBkZXNjKTsKKyAgfQogfTsKIAogCkBAIC05NSwxMiAr
MTIyLDEyIEBAIEVtYmVyLmRlYnVnID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgIHdpbGwgYmUg
ZGlzcGxheWVkLgogKi8KIEVtYmVyLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHRlc3Qp
IHsKLSAgaWYgKEVtYmVyICYmIEVtYmVyLlRFU1RJTkdfREVQUkVDQVRJT04pIHsgcmV0dXJuOyB9
CisgIGlmIChFbWJlci5URVNUSU5HX0RFUFJFQ0FUSU9OKSB7IHJldHVybjsgfQogCiAgIGlmIChh
cmd1bWVudHMubGVuZ3RoID09PSAxKSB7IHRlc3QgPSBmYWxzZTsgfQogICBpZiAodGVzdCkgeyBy
ZXR1cm47IH0KIAotICBpZiAoRW1iZXIgJiYgRW1iZXIuRU5WLlJBSVNFX09OX0RFUFJFQ0FUSU9O
KSB7IHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsgfQorICBpZiAoRW1iZXIuRU5WLlJBSVNFX09O
X0RFUFJFQ0FUSU9OKSB7IHRocm93IG5ldyBFbWJlci5FcnJvcihtZXNzYWdlKTsgfQogCiAgIHZh
ciBlcnJvcjsKIApAQCAtMTMxLDE1ICsxNTgsMjIgQEAgRW1iZXIuZGVwcmVjYXRlID0gZnVuY3Rp
b24obWVzc2FnZSwgdGVzdCkgewogCiAKIC8qKgorICBBbGlhcyBhbiBvbGQsIGRlcHJlY2F0ZWQg
bWV0aG9kIHdpdGggaXRzIG5ldyBjb3VudGVycGFydC4KKwogICBEaXNwbGF5IGEgZGVwcmVjYXRp
b24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBhIHN0YWNrIHRyYWNlCi0g
IChDaHJvbWUgYW5kIEZpcmVmb3ggb25seSkgd2hlbiB0aGUgd3JhcHBlZCBtZXRob2QgaXMgY2Fs
bGVkLgorICAoQ2hyb21lIGFuZCBGaXJlZm94IG9ubHkpIHdoZW4gdGhlIGFzc2lnbmVkIG1ldGhv
ZCBpcyBjYWxsZWQuCiAKICAgRW1iZXIgYnVpbGQgdG9vbHMgd2lsbCBub3QgcmVtb3ZlIGNhbGxz
IHRvIGBFbWJlci5kZXByZWNhdGVGdW5jKClgLCB0aG91Z2gKICAgbm8gd2FybmluZ3Mgd2lsbCBi
ZSBzaG93biBpbiBwcm9kdWN0aW9uLgogCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIub2xkTWV0
aG9kID0gRW1iZXIuZGVwcmVjYXRlRnVuYygiUGxlYXNlIHVzZSB0aGUgbmV3LCB1cGRhdGVkIG1l
dGhvZCIsIEVtYmVyLm5ld01ldGhvZCk7CisgIGBgYAorCiAgIEBtZXRob2QgZGVwcmVjYXRlRnVu
YwogICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNh
dGlvbi4KLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmUgZGVwcmVj
YXRlZC4KKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgbmV3IGZ1bmN0aW9uIGNhbGxlZCB0
byByZXBsYWNlIGl0cyBkZXByZWNhdGVkIGNvdW50ZXJwYXJ0LgorICBAcmV0dXJuIHtGdW5jdGlv
bn0gYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcGVkIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRo
IGEgZGVwcmVjYXRpb24gd2FybmluZwogKi8KIEVtYmVyLmRlcHJlY2F0ZUZ1bmMgPSBmdW5jdGlv
bihtZXNzYWdlLCBmdW5jKSB7CiAgIHJldHVybiBmdW5jdGlvbigpIHsKQEAgLTE0OCwxNCArMTgy
LDMzIEBAIEVtYmVyLmRlcHJlY2F0ZUZ1bmMgPSBmdW5jdGlvbihtZXNzYWdlLCBmdW5jKSB7CiAg
IH07CiB9OwogCisKKy8vIEluZm9ybSB0aGUgZGV2ZWxvcGVyIGFib3V0IHRoZSBFbWJlciBJbnNw
ZWN0b3IgaWYgbm90IGluc3RhbGxlZC4KK2lmICghRW1iZXIudGVzdGluZykgeworICBpZiAodHlw
ZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNocm9tZSAmJiB3aW5kb3cuYWRk
RXZlbnRMaXN0ZW5lcikgeworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVu
Y3Rpb24oKSB7CisgICAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmRhdGFz
ZXQgJiYgIWRvY3VtZW50LmJvZHkuZGF0YXNldC5lbWJlckV4dGVuc2lvbikgeworICAgICAgICBF
bWJlci5kZWJ1ZygnRm9yIG1vcmUgYWR2YW5jZWQgZGVidWdnaW5nLCBpbnN0YWxsIHRoZSBFbWJl
ciBJbnNwZWN0b3IgZnJvbSBodHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFp
bC9lbWJlci1pbnNwZWN0b3IvYm1kYmxuY2Vna2Vua2FjaWVpaGZocGpmcHBvY29uaGknKTsKKyAg
ICAgIH0KKyAgICB9LCBmYWxzZSk7CisgIH0KK30KKwogfSkoKTsKIAotLy8gVmVyc2lvbjogdjEu
MC4wLXJjLjEKLS8vIExhc3QgY29tbWl0OiA4YjA2MWI0ICgyMDEzLTAyLTE1IDEyOjEwOjIyIC0w
ODAwKQorLyohCisgKiBAb3ZlcnZpZXcgIEVtYmVyIC0gSmF2YVNjcmlwdCBBcHBsaWNhdGlvbiBG
cmFtZXdvcmsKKyAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEtMjAxNCBUaWxkZSBJbmMuIGFu
ZCBjb250cmlidXRvcnMKKyAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYtMjAx
MSBTdHJvYmUgSW5jLgorICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwOC0yMDEx
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEBsaWNlbnNlICAgTGljZW5zZWQg
dW5kZXIgTUlUIGxpY2Vuc2UKKyAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5j
b20vZW1iZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElDRU5TRQorICogQHZlcnNpb24gICAxLjMuMQor
ICovCiAKIAogKGZ1bmN0aW9uKCkgewotdmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZTsKK3ZhciBk
ZWZpbmUsIHJlcXVpcmVNb2R1bGUsIHJlcXVpcmUsIHJlcXVpcmVqczsKIAogKGZ1bmN0aW9uKCkg
ewogICB2YXIgcmVnaXN0cnkgPSB7fSwgc2VlbiA9IHt9OwpAQCAtMTY0LDEwICsyMTcsMTYgQEAg
dmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZTsKICAgICByZWdpc3RyeVtuYW1lXSA9IHsgZGVwczog
ZGVwcywgY2FsbGJhY2s6IGNhbGxiYWNrIH07CiAgIH07CiAKLSAgcmVxdWlyZU1vZHVsZSA9IGZ1
bmN0aW9uKG5hbWUpIHsKKyAgcmVxdWlyZWpzID0gcmVxdWlyZSA9IHJlcXVpcmVNb2R1bGUgPSBm
dW5jdGlvbihuYW1lKSB7CisgIHJlcXVpcmVqcy5fZWFrX3NlZW4gPSByZWdpc3RyeTsKKwogICAg
IGlmIChzZWVuW25hbWVdKSB7IHJldHVybiBzZWVuW25hbWVdOyB9CiAgICAgc2VlbltuYW1lXSA9
IHt9OwogCisgICAgaWYgKCFyZWdpc3RyeVtuYW1lXSkgeworICAgICAgdGhyb3cgbmV3IEVycm9y
KCJDb3VsZCBub3QgZmluZCBtb2R1bGUgIiArIG5hbWUpOworICAgIH0KKwogICAgIHZhciBtb2Qg
PSByZWdpc3RyeVtuYW1lXSwKICAgICAgICAgZGVwcyA9IG1vZC5kZXBzLAogICAgICAgICBjYWxs
YmFjayA9IG1vZC5jYWxsYmFjaywKQEAgLTE3OCwxNiArMjM3LDMyIEBAIHZhciBkZWZpbmUsIHJl
cXVpcmVNb2R1bGU7CiAgICAgICBpZiAoZGVwc1tpXSA9PT0gJ2V4cG9ydHMnKSB7CiAgICAgICAg
IHJlaWZpZWQucHVzaChleHBvcnRzID0ge30pOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVp
ZmllZC5wdXNoKHJlcXVpcmVNb2R1bGUoZGVwc1tpXSkpOworICAgICAgICByZWlmaWVkLnB1c2go
cmVxdWlyZU1vZHVsZShyZXNvbHZlKGRlcHNbaV0pKSk7CiAgICAgICB9CiAgICAgfQogCiAgICAg
dmFyIHZhbHVlID0gY2FsbGJhY2suYXBwbHkodGhpcywgcmVpZmllZCk7CiAgICAgcmV0dXJuIHNl
ZW5bbmFtZV0gPSBleHBvcnRzIHx8IHZhbHVlOworCisgICAgZnVuY3Rpb24gcmVzb2x2ZShjaGls
ZCkgeworICAgICAgaWYgKGNoaWxkLmNoYXJBdCgwKSAhPT0gJy4nKSB7IHJldHVybiBjaGlsZDsg
fQorICAgICAgdmFyIHBhcnRzID0gY2hpbGQuc3BsaXQoIi8iKTsKKyAgICAgIHZhciBwYXJlbnRC
YXNlID0gbmFtZS5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKTsKKworICAgICAgZm9yICh2YXIgaT0w
LCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tp
XTsKKworICAgICAgICBpZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNlLnBvcCgpOyB9Cisg
ICAgICAgIGVsc2UgaWYgKHBhcnQgPT09ICcuJykgeyBjb250aW51ZTsgfQorICAgICAgICBlbHNl
IHsgcGFyZW50QmFzZS5wdXNoKHBhcnQpOyB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBwYXJl
bnRCYXNlLmpvaW4oIi8iKTsKKyAgICB9CiAgIH07CiB9KSgpOwogKGZ1bmN0aW9uKCkgewotLypn
bG9iYWxzIEVtOnRydWUgRU5WICovCisvKmdsb2JhbHMgRW06dHJ1ZSBFTlYgRW1iZXJFTlYgTWV0
YW1vcnBoRU5WOnRydWUgKi8KIAogLyoqCiBAbW9kdWxlIGVtYmVyCkBAIC0yMTEsNyArMjg2LDcg
QEAgdmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZTsKIAogICBAY2xhc3MgRW1iZXIKICAgQHN0YXRp
YwotICBAdmVyc2lvbiAxLjAuMC1yYy4xCisgIEB2ZXJzaW9uIDEuMy4xCiAqLwogCiBpZiAoJ3Vu
ZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlcikgewpAQCAtMjM4LDIzICszMTMsODYgQEAgRW1iZXIu
dG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJFbWJlciI7IH07CiAvKioKICAgQHByb3Bl
cnR5IFZFUlNJT04KICAgQHR5cGUgU3RyaW5nCi0gIEBkZWZhdWx0ICcxLjAuMC1yYy4xJwotICBA
ZmluYWwKKyAgQGRlZmF1bHQgJzEuMy4xJworICBAc3RhdGljCiAqLwotRW1iZXIuVkVSU0lPTiA9
ICcxLjAuMC1yYy4xJzsKK0VtYmVyLlZFUlNJT04gPSAnMS4zLjEnOwogCiAvKioKLSAgU3RhbmRh
cmQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMuIFlvdSBjYW4gZGVmaW5lIHRoZXNlIGluIGEgZ2xv
YmFsIGBFTlZgCi0gIHZhcmlhYmxlIGJlZm9yZSBsb2FkaW5nIEVtYmVyIHRvIGNvbnRyb2wgdmFy
aW91cyBjb25maWd1cmF0aW9uCi0gIHNldHRpbmdzLgorICBTdGFuZGFyZCBlbnZpcm9ubWVudGFs
IHZhcmlhYmxlcy4gWW91IGNhbiBkZWZpbmUgdGhlc2UgaW4gYSBnbG9iYWwgYEVtYmVyRU5WYAor
ICB2YXJpYWJsZSBiZWZvcmUgbG9hZGluZyBFbWJlciB0byBjb250cm9sIHZhcmlvdXMgY29uZmln
dXJhdGlvbiBzZXR0aW5ncy4KKworICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBl
YXJsaWVyIHZlcnNpb25zIG9mIEVtYmVyIHRoZSBnbG9iYWwgYEVOVmAKKyAgdmFyaWFibGUgd2ls
bCBiZSB1c2VkIGlmIGBFbWJlckVOVmAgaXMgbm90IGRlZmluZWQuCiAKICAgQHByb3BlcnR5IEVO
VgogICBAdHlwZSBIYXNoCiAqLwotRW1iZXIuRU5WID0gRW1iZXIuRU5WIHx8ICgndW5kZWZpbmVk
JyA9PT0gdHlwZW9mIEVOViA/IHt9IDogRU5WKTsKKworLy8gVGhpcyBuZWVkcyB0byBiZSBrZXB0
IGluIHN5bmMgd2l0aCB0aGUgbG9naWMgaW4KKy8vIGBwYWNrYWdlcy9lbWJlci1kZWJ1Zy9saWIv
bWFpbi5qc2AuCitpZiAoRW1iZXIuRU5WKSB7CisgIC8vIGRvIG5vdGhpbmcgaWYgRW1iZXIuRU5W
IGlzIGFscmVhZHkgc2V0dXAKK30gZWxzZSBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFbWJl
ckVOVikgeworICBFbWJlci5FTlYgPSBFbWJlckVOVjsKK30gZWxzZSBpZigndW5kZWZpbmVkJyAh
PT0gdHlwZW9mIEVOVikgeworICBFbWJlci5FTlYgPSBFTlY7Cit9IGVsc2UgeworICBFbWJlci5F
TlYgPSB7fTsKK30KIAogRW1iZXIuY29uZmlnID0gRW1iZXIuY29uZmlnIHx8IHt9OwogCisvLyBX
ZSBkaXNhYmxlIHRoZSBSQU5HRSBBUEkgYnkgZGVmYXVsdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29u
cworaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuRU5WLkRJU0FCTEVfUkFOR0VfQVBJ
KSB7CisgIEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQSSA9IHRydWU7Cit9CisKK2lmICgidW5k
ZWZpbmVkIiA9PT0gdHlwZW9mIE1ldGFtb3JwaEVOVikgeworICBleHBvcnRzLk1ldGFtb3JwaEVO
ViA9IHt9OworfQorCitNZXRhbW9ycGhFTlYuRElTQUJMRV9SQU5HRV9BUEkgPSBFbWJlci5FTlYu
RElTQUJMRV9SQU5HRV9BUEk7CisKKy8qKgorICBIYXNoIG9mIGVuYWJsZWQgQ2FuYXJ5IGZlYXR1
cmVzLiBBZGQgdG8gYmVmb3JlIGNyZWF0aW5nIHlvdXIgYXBwbGljYXRpb24uCisKKyAgWW91IGNh
biBhbHNvIGRlZmluZSBgRU5WLkZFQVRVUkVTYCBpZiB5b3UgbmVlZCB0byBlbmFibGUgZmVhdHVy
ZXMgZmxhZ2dlZCBhdCBydW50aW1lLgorCisgIEBwcm9wZXJ0eSBGRUFUVVJFUworICBAdHlwZSBI
YXNoCisqLworCitFbWJlci5GRUFUVVJFUyA9IEVtYmVyLkVOVi5GRUFUVVJFUyB8fCB7fTsKKwor
LyoqCisgIFRlc3QgdGhhdCBhIGZlYXR1cmUgaXMgZW5hYmxlZC4gUGFyc2VkIGJ5IEVtYmVyJ3Mg
YnVpbGQgdG9vbHMgdG8gbGVhdmUKKyAgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG91dCBvZiBiZXRh
L3N0YWJsZSBidWlsZHMuCisKKyAgWW91IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBjb25maWd1
cmF0aW9uIG9wdGlvbnM6CisKKyAgKiBgRU5WLkVOQUJMRV9BTExfRkVBVFVSRVNgIC0gZm9yY2Ug
YWxsIGZlYXR1cmVzIHRvIGJlIGVuYWJsZWQuCisgICogYEVOVi5FTkFCTEVfT1BUSU9OQUxfRkVB
VFVSRVNgIC0gZW5hYmxlIGFueSBmZWF0dXJlcyB0aGF0IGhhdmUgbm90IGJlZW4gZXhwbGljaXRs
eQorICAgIGVuYWJsZWQvZGlzYWJsZWQuCisKKyAgQG1ldGhvZCBpc0VuYWJsZWQKKyAgQHBhcmFt
IHtzdHJpbmd9IGZlYXR1cmUKKyovCisKK0VtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCA9IGZ1bmN0
aW9uKGZlYXR1cmUpIHsKKyAgdmFyIGZlYXR1cmVWYWx1ZSA9IEVtYmVyLkZFQVRVUkVTW2ZlYXR1
cmVdOworCisgIGlmIChFbWJlci5FTlYuRU5BQkxFX0FMTF9GRUFUVVJFUykgeworICAgIHJldHVy
biB0cnVlOworICB9IGVsc2UgaWYgKGZlYXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFs
dWUgPT09IGZhbHNlIHx8IGZlYXR1cmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgcmV0dXJu
IGZlYXR1cmVWYWx1ZTsKKyAgfSBlbHNlIGlmIChFbWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZF
QVRVUkVTKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNl
OworICB9Cit9OworCiAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCiAvLyBCT09UU1RSQVAKIC8vCkBAIC0yOTgsNyArNDM2LDE2IEBA
IEVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OID0gKEVtYmVyLkVOVi5MT0dfU1RB
Q0tUUkFDRV9PTl9ERVBSRUNBVElPTiAhCiBFbWJlci5TSElNX0VTNSA9IChFbWJlci5FTlYuU0hJ
TV9FUzUgPT09IGZhbHNlKSA/IGZhbHNlIDogRW1iZXIuRVhURU5EX1BST1RPVFlQRVM7CiAKIC8q
KgotICBFbXB0eSBmdW5jdGlvbi4gVXNlZnVsIGZvciBzb21lIG9wZXJhdGlvbnMuCisgIERldGVy
bWluZXMgd2hldGhlciBFbWJlciBsb2dzIGluZm8gYWJvdXQgdmVyc2lvbiBvZiB1c2VkIGxpYnJh
cmllcworCisgIEBwcm9wZXJ0eSBMT0dfVkVSU0lPTgorICBAdHlwZSBCb29sZWFuCisgIEBkZWZh
dWx0IHRydWUKKyovCitFbWJlci5MT0dfVkVSU0lPTiA9IChFbWJlci5FTlYuTE9HX1ZFUlNJT04g
PT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsKKworLyoqCisgIEVtcHR5IGZ1bmN0aW9uLiBVc2Vm
dWwgZm9yIHNvbWUgb3BlcmF0aW9ucy4gQWx3YXlzIHJldHVybnMgYHRoaXNgLgogCiAgIEBtZXRo
b2QgSwogICBAcHJpdmF0ZQpAQCAtMzI3LDg3ICs0NzQsODAgQEAgaWYgKCd1bmRlZmluZWQnID09
PSB0eXBlb2YgRW1iZXIuZGVwcmVjYXRlRnVuYykgewogKi8KIEVtYmVyLnV1aWQgPSAwOwogCi0v
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCi0vLyBMT0dHRVIKLS8vCi0KLWZ1bmN0aW9uIGNvbnNvbGVNZXRob2QobmFtZSkgewotICBp
ZiAoaW1wb3J0cy5jb25zb2xlICYmIGltcG9ydHMuY29uc29sZVtuYW1lXSkgewotICAgIC8vIE9s
ZGVyIElFIGRvZXNuJ3Qgc3VwcG9ydCBhcHBseSwgYnV0IENocm9tZSBuZWVkcyBpdAotICAgIGlm
IChpbXBvcnRzLmNvbnNvbGVbbmFtZV0uYXBwbHkpIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbigp
IHsKLSAgICAgICAgaW1wb3J0cy5jb25zb2xlW25hbWVdLmFwcGx5KGltcG9ydHMuY29uc29sZSwg
YXJndW1lbnRzKTsKLSAgICAgIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmdW5jdGlv
bigpIHsKLSAgICAgICAgdmFyIG1lc3NhZ2UgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFy
Z3VtZW50cywgJywgJyk7Ci0gICAgICAgIGltcG9ydHMuY29uc29sZVtuYW1lXShtZXNzYWdlKTsK
LSAgICAgIH07Ci0gICAgfQotICB9Ci19Ci0KIC8qKgotICBJbnNpZGUgRW1iZXItTWV0YWwsIHNp
bXBseSB1c2VzIHRoZSBtZXRob2RzIGZyb20gYGltcG9ydHMuY29uc29sZWAuCi0gIE92ZXJyaWRl
IHRoaXMgdG8gcHJvdmlkZSBtb3JlIHJvYnVzdCBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkuCisgIE1l
cmdlIHRoZSBjb250ZW50cyBvZiB0d28gb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBv
YmplY3QuCiAKLSAgQGNsYXNzIExvZ2dlcgotICBAbmFtZXNwYWNlIEVtYmVyCisgIGBgYGphdmFz
Y3JpcHQKKyAgRW1iZXIubWVyZ2Uoe2ZpcnN0OiAnVG9tJ30sIHtsYXN0OiAnRGFsZSd9KTsgLy8g
e2ZpcnN0OiAnVG9tJywgbGFzdDogJ0RhbGUnfQorICB2YXIgYSA9IHtmaXJzdDogJ1llaHVkYSd9
LCBiID0ge2xhc3Q6ICdLYXR6J307CisgIEVtYmVyLm1lcmdlKGEsIGIpOyAvLyBhID09IHtmaXJz
dDogJ1llaHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0ge2xhc3Q6ICdLYXR6J30KKyAgYGBgCisK
KyAgQG1ldGhvZCBtZXJnZQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5h
bCBUaGUgb2JqZWN0IHRvIG1lcmdlIGludG8KKyAgQHBhcmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhl
IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbQorICBAcmV0dXJuIHtPYmplY3R9CiAqLwot
RW1iZXIuTG9nZ2VyID0gewotICBsb2c6ICAgY29uc29sZU1ldGhvZCgnbG9nJykgICB8fCBFbWJl
ci5LLAotICB3YXJuOiAgY29uc29sZU1ldGhvZCgnd2FybicpICB8fCBFbWJlci5LLAotICBlcnJv
cjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBFbWJlci5LLAotICBpbmZvOiAgY29uc29sZU1l
dGhvZCgnaW5mbycpICB8fCBFbWJlci5LLAotICBkZWJ1ZzogY29uc29sZU1ldGhvZCgnZGVidWcn
KSB8fCBjb25zb2xlTWV0aG9kKCdpbmZvJykgfHwgRW1iZXIuSworRW1iZXIubWVyZ2UgPSBmdW5j
dGlvbihvcmlnaW5hbCwgdXBkYXRlcykgeworICBmb3IgKHZhciBwcm9wIGluIHVwZGF0ZXMpIHsK
KyAgICBpZiAoIXVwZGF0ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KKyAg
ICBvcmlnaW5hbFtwcm9wXSA9IHVwZGF0ZXNbcHJvcF07CisgIH0KKyAgcmV0dXJuIG9yaWdpbmFs
OwogfTsKIAotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uCi0vLyBFUlJPUiBIQU5ETElORwotLy8KLQogLyoqCi0gIEEgZnVuY3Rp
b24gbWF5IGJlIGFzc2lnbmVkIHRvIGBFbWJlci5vbmVycm9yYCB0byBiZSBjYWxsZWQgd2hlbiBF
bWJlcgotICBpbnRlcm5hbHMgZW5jb3VudGVyIGFuIGVycm9yLiBUaGlzIGlzIHVzZWZ1bCBmb3Ig
c3BlY2lhbGl6ZWQgZXJyb3IgaGFuZGxpbmcKLSAgYW5kIHJlcG9ydGluZyBjb2RlLgorICBSZXR1
cm5zIHRydWUgaWYgdGhlIHBhc3NlZCB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZC4gVGhpcyBh
dm9pZHMgZXJyb3JzCisgIGZyb20gSlNMaW50IGNvbXBsYWluaW5nIGFib3V0IHVzZSBvZiA9PSwg
d2hpY2ggY2FuIGJlIHRlY2huaWNhbGx5CisgIGNvbmZ1c2luZy4KIAotICBAZXZlbnQgb25lcnJv
cgorICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLmlzTm9uZSgpOyAgICAgICAgICAgICAgLy8gdHJ1
ZQorICBFbWJlci5pc05vbmUobnVsbCk7ICAgICAgICAgIC8vIHRydWUKKyAgRW1iZXIuaXNOb25l
KHVuZGVmaW5lZCk7ICAgICAvLyB0cnVlCisgIEVtYmVyLmlzTm9uZSgnJyk7ICAgICAgICAgICAg
Ly8gZmFsc2UKKyAgRW1iZXIuaXNOb25lKFtdKTsgICAgICAgICAgICAvLyBmYWxzZQorICBFbWJl
ci5pc05vbmUoZnVuY3Rpb24oKSB7fSk7ICAvLyBmYWxzZQorICBgYGAKKworICBAbWV0aG9kIGlz
Tm9uZQogICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7RXhjZXB0aW9ufSBlcnJvciB0aGUgZXJyb3Ig
b2JqZWN0CisgIEBwYXJhbSB7T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICBAcmV0dXJuIHtC
b29sZWFufQogKi8KLUVtYmVyLm9uZXJyb3IgPSBudWxsOworRW1iZXIuaXNOb25lID0gZnVuY3Rp
b24ob2JqKSB7CisgIHJldHVybiBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7Cit9
OworRW1iZXIubm9uZSA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLm5vbmUgaXMgZGVwcmVj
YXRlZC4gUGxlYXNlIHVzZSBFbWJlci5pc05vbmUgaW5zdGVhZC4iLCBFbWJlci5pc05vbmUpOwog
CiAvKioKLSAgQHByaXZhdGUKKyAgVmVyaWZpZXMgdGhhdCBhIHZhbHVlIGlzIGBudWxsYCBvciBh
biBlbXB0eSBzdHJpbmcsIGVtcHR5IGFycmF5LAorICBvciBlbXB0eSBmdW5jdGlvbi4KIAotICBX
cmFwIGNvZGUgYmxvY2sgaW4gYSB0cnkvY2F0Y2ggaWYge3sjY3Jvc3NMaW5rICJFbWJlci9vbmVy
cm9yIn19e3svY3Jvc3NMaW5rfX0gaXMgc2V0LgorICBDb25zdHJhaW5zIHRoZSBydWxlcyBvbiBg
RW1iZXIuaXNOb25lYCBieSByZXR1cm5pbmcgZmFsc2UgZm9yIGVtcHR5CisgIHN0cmluZyBhbmQg
ZW1wdHkgYXJyYXlzLgogCi0gIEBtZXRob2QgaGFuZGxlRXJyb3JzCisgIGBgYGphdmFzY3JpcHQK
KyAgRW1iZXIuaXNFbXB0eSgpOyAgICAgICAgICAgICAgICAvLyB0cnVlCisgIEVtYmVyLmlzRW1w
dHkobnVsbCk7ICAgICAgICAgICAgLy8gdHJ1ZQorICBFbWJlci5pc0VtcHR5KHVuZGVmaW5lZCk7
ICAgICAgIC8vIHRydWUKKyAgRW1iZXIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAvLyB0cnVl
CisgIEVtYmVyLmlzRW1wdHkoW10pOyAgICAgICAgICAgICAgLy8gdHJ1ZQorICBFbWJlci5pc0Vt
cHR5KCdBZGFtIEhhd2tpbnMnKTsgIC8vIGZhbHNlCisgIEVtYmVyLmlzRW1wdHkoWzAsMSwyXSk7
ICAgICAgICAgLy8gZmFsc2UKKyAgYGBgCisKKyAgQG1ldGhvZCBpc0VtcHR5CiAgIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcGFyYW0gW2NvbnRleHRdCisgIEBwYXJh
bSB7T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICBAcmV0dXJuIHtCb29sZWFufQogKi8KLUVt
YmVyLmhhbmRsZUVycm9ycyA9IGZ1bmN0aW9uKGZ1bmMsIGNvbnRleHQpIHsKLSAgLy8gVW5mb3J0
dW5hdGVseSBpbiBzb21lIGJyb3dzZXJzIHdlIGxvc2UgdGhlIGJhY2t0cmFjZSBpZiB3ZSByZXRo
cm93IHRoZSBleGlzdGluZyBlcnJvciwKLSAgLy8gc28gaW4gdGhlIGV2ZW50IHRoYXQgd2UgZG9u
J3QgaGF2ZSBhbiBgb25lcnJvcmAgaGFuZGxlciB3ZSBkb24ndCB3cmFwIGluIGEgdHJ5L2NhdGNo
Ci0gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgRW1iZXIub25lcnJvcikgewotICAgIHRyeSB7
Ci0gICAgICByZXR1cm4gZnVuYy5hcHBseShjb250ZXh0IHx8IHRoaXMpOwotICAgIH0gY2F0Y2gg
KGVycm9yKSB7Ci0gICAgICBFbWJlci5vbmVycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0gZWxzZSB7
Ci0gICAgcmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCB8fCB0aGlzKTsKLSAgfQorRW1iZXIuaXNF
bXB0eSA9IGZ1bmN0aW9uKG9iaikgeworICByZXR1cm4gRW1iZXIuaXNOb25lKG9iaikgfHwgKG9i
ai5sZW5ndGggPT09IDAgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBv
YmogPT09ICdvYmplY3QnICYmIEVtYmVyLmdldChvYmosICdsZW5ndGgnKSA9PT0gMCk7CiB9Owor
RW1iZXIuZW1wdHkgPSBFbWJlci5kZXByZWNhdGVGdW5jKCJFbWJlci5lbXB0eSBpcyBkZXByZWNh
dGVkLiBQbGVhc2UgdXNlIEVtYmVyLmlzRW1wdHkgaW5zdGVhZC4iLCBFbWJlci5pc0VtcHR5KSA7
CiAKLUVtYmVyLm1lcmdlID0gZnVuY3Rpb24ob3JpZ2luYWwsIHVwZGF0ZXMpIHsKLSAgZm9yICh2
YXIgcHJvcCBpbiB1cGRhdGVzKSB7Ci0gICAgaWYgKCF1cGRhdGVzLmhhc093blByb3BlcnR5KHBy
b3ApKSB7IGNvbnRpbnVlOyB9Ci0gICAgb3JpZ2luYWxbcHJvcF0gPSB1cGRhdGVzW3Byb3BdOwot
ICB9Ci19OwogCiB9KSgpOwogCkBAIC00MzcsNiArNTc3LDEzIEBAIHZhciBwbGF0Zm9ybSA9IEVt
YmVyLnBsYXRmb3JtID0ge307CiAqLwogRW1iZXIuY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKIAor
Ly8gSUU4IGhhcyBPYmplY3QuY3JlYXRlIGJ1dCBpdCBjb3VsZG4ndCB0cmVhdCBwcm9wZXJ0eSBk
ZXNjcmlwdG9ycy4KK2lmIChFbWJlci5jcmVhdGUpIHsKKyAgaWYgKEVtYmVyLmNyZWF0ZSh7YTog
MX0sIHthOiB7dmFsdWU6IDJ9fSkuYSAhPT0gMikgeworICAgIEVtYmVyLmNyZWF0ZSA9IG51bGw7
CisgIH0KK30KKwogLy8gU1RVQl9PQkpFQ1RfQ1JFQVRFIGFsbG93cyB1cyB0byBvdmVycmlkZSBv
dGhlciBsaWJyYXJpZXMgdGhhdCBzdHViCiAvLyBPYmplY3QuY3JlYXRlIGRpZmZlcmVudCB0aGFu
IHdlIHdvdWxkIHByZWZlcgogaWYgKCFFbWJlci5jcmVhdGUgfHwgRW1iZXIuRU5WLlNUVUJfT0JK
RUNUX0NSRUFURSkgewpAQCAtNDY2LDcgKzYxMyw3IEBAIHZhciBjYW5SZWRlZmluZVByb3BlcnRp
ZXMsIGNhbkRlZmluZVByb3BlcnR5T25ET007CiAvLyBDYXRjaCBJRTggd2hlcmUgT2JqZWN0LmRl
ZmluZVByb3BlcnR5IGV4aXN0cyBidXQgb25seSB3b3JrcyBvbiBET00gZWxlbWVudHMKIGlmIChk
ZWZpbmVQcm9wZXJ0eSkgewogICB0cnkgewotICAgIGRlZmluZVByb3BlcnR5KHt9LCAnYScse2dl
dDpmdW5jdGlvbigpe319KTsKKyAgICBkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLHtnZXQ6ZnVuY3Rp
b24oKSB7fX0pOwogICB9IGNhdGNoIChlKSB7CiAgICAgZGVmaW5lUHJvcGVydHkgPSBudWxsOwog
ICB9CkBAIC00OTcsNyArNjQ0LDcgQEAgaWYgKGRlZmluZVByb3BlcnR5KSB7CiAKICAgLy8gVGhp
cyBpcyBmb3IgU2FmYXJpIDUuMCwgd2hpY2ggc3VwcG9ydHMgT2JqZWN0LmRlZmluZVByb3BlcnR5
LCBidXQgbm90CiAgIC8vIG9uIERPTSBub2Rlcy4KLSAgY2FuRGVmaW5lUHJvcGVydHlPbkRPTSA9
IChmdW5jdGlvbigpeworICBjYW5EZWZpbmVQcm9wZXJ0eU9uRE9NID0gKGZ1bmN0aW9uKCkgewog
ICAgIHRyeSB7CiAgICAgICBkZWZpbmVQcm9wZXJ0eShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKSwgJ2RlZmluZVByb3BlcnR5T25ET00nLCB7fSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAg
LTUwOSw3ICs2NTYsNyBAQCBpZiAoZGVmaW5lUHJvcGVydHkpIHsKICAgaWYgKCFjYW5SZWRlZmlu
ZVByb3BlcnRpZXMpIHsKICAgICBkZWZpbmVQcm9wZXJ0eSA9IG51bGw7CiAgIH0gZWxzZSBpZiAo
IWNhbkRlZmluZVByb3BlcnR5T25ET00pIHsKLSAgICBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9u
KG9iaiwga2V5TmFtZSwgZGVzYyl7CisgICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihvYmos
IGtleU5hbWUsIGRlc2MpIHsKICAgICAgIHZhciBpc05vZGU7CiAKICAgICAgIGlmICh0eXBlb2Yg
Tm9kZSA9PT0gIm9iamVjdCIpIHsKQEAgLTU3Miw3NiArNzE5LDI2NCBAQCBpZiAoRW1iZXIuRU5W
Lk1BTkRBVE9SWV9TRVRURVIgJiYgIXBsYXRmb3JtLmhhc1Byb3BlcnR5QWNjZXNzb3JzKSB7CiAK
IAogKGZ1bmN0aW9uKCkgeworLypqc2hpbnQgbmV3Y2FwOmZhbHNlKi8KIC8qKgogQG1vZHVsZSBl
bWJlci1tZXRhbAogKi8KIAorLy8gTk9URTogVGhlcmUgaXMgYSBidWcgaW4ganNoaW50IHRoYXQg
ZG9lc24ndCByZWNvZ25pemUgYE9iamVjdCgpYCB3aXRob3V0IGBuZXdgCisvLyBhcyBiZWluZyBv
ayB1bmxlc3MgYm90aCBgbmV3Y2FwOmZhbHNlYCBhbmQgbm90IGB1c2Ugc3RyaWN0YC4KKy8vIGh0
dHBzOi8vZ2l0aHViLmNvbS9qc2hpbnQvanNoaW50L2lzc3Vlcy8zOTIKIAotdmFyIG9fZGVmaW5l
UHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwKLSAgICBvX2NyZWF0ZSA9
IEVtYmVyLmNyZWF0ZSwKLSAgICAvLyBVc2VkIGZvciBndWlkIGdlbmVyYXRpb24uLi4KLSAgICBH
VUlEX0tFWSA9ICdfX2VtYmVyJysgKCsgbmV3IERhdGUoKSksCi0gICAgdXVpZCAgICAgICAgID0g
MCwKLSAgICBudW1iZXJDYWNoZSAgPSBbXSwKLSAgICBzdHJpbmdDYWNoZSAgPSB7fTsKLQotdmFy
IE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUjsKKy8vIFRlc3Rp
bmcgdGhpcyBpcyBub3QgaWRlYWwsIGJ1dCB3ZSB3YW50IHRvIHVzZSBuYXRpdmUgZnVuY3Rpb25z
CisvLyBpZiBhdmFpbGFibGUsIGJ1dCBub3QgdG8gdXNlIHZlcnNpb25zIGNyZWF0ZWQgYnkgbGli
cmFyaWVzIGxpa2UgUHJvdG90eXBlCit2YXIgaXNOYXRpdmVGdW5jID0gZnVuY3Rpb24oZnVuYykg
eworICAvLyBUaGlzIHNob3VsZCBwcm9iYWJseSB3b3JrIGluIGFsbCBicm93c2VycyBsaWtlbHkg
dG8gaGF2ZSBFUzUgYXJyYXkgbWV0aG9kcworICByZXR1cm4gZnVuYyAmJiBGdW5jdGlvbi5wcm90
b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykgPiAtMTsK
K307CiAKLS8qKgotICBAcHJpdmF0ZQorLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxs
YS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvbWFwCit2
YXIgYXJyYXlNYXAgPSBpc05hdGl2ZUZ1bmMoQXJyYXkucHJvdG90eXBlLm1hcCkgPyBBcnJheS5w
cm90b3R5cGUubWFwIDogZnVuY3Rpb24oZnVuIC8qLCB0aGlzcCAqLykgeworICAvLyJ1c2Ugc3Ry
aWN0IjsKIAotICBBIHVuaXF1ZSBrZXkgdXNlZCB0byBhc3NpZ24gZ3VpZHMgYW5kIG90aGVyIHBy
aXZhdGUgbWV0YWRhdGEgdG8gb2JqZWN0cy4KLSAgSWYgeW91IGluc3BlY3QgYW4gb2JqZWN0IGlu
IHlvdXIgYnJvd3NlciBkZWJ1Z2dlciB5b3Ugd2lsbCBvZnRlbiBzZWUgdGhlc2UuCi0gIFRoZXkg
Y2FuIGJlIHNhZmVseSBpZ25vcmVkLgorICBpZiAodGhpcyA9PT0gdm9pZCAwIHx8IHRoaXMgPT09
IG51bGwpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgIH0KIAotICBPbiBicm93c2Vy
cyB0aGF0IHN1cHBvcnQgaXQsIHRoZXNlIHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGggZW51bWVy
YXRpb24KLSAgZGlzYWJsZWQgc28gdGhleSB3b24ndCBzaG93IHVwIHdoZW4geW91IGl0ZXJhdGUg
b3ZlciB5b3VyIHByb3BlcnRpZXMuCisgIHZhciB0ID0gT2JqZWN0KHRoaXMpOworICB2YXIgbGVu
ID0gdC5sZW5ndGggPj4+IDA7CisgIGlmICh0eXBlb2YgZnVuICE9PSAiZnVuY3Rpb24iKSB7Cisg
ICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOworICB9CiAKLSAgQHByb3BlcnR5IEdVSURfS0VZCi0g
IEBmb3IgRW1iZXIKLSAgQHR5cGUgU3RyaW5nCi0gIEBmaW5hbAotKi8KLUVtYmVyLkdVSURfS0VZ
ID0gR1VJRF9LRVk7CisgIHZhciByZXMgPSBuZXcgQXJyYXkobGVuKTsKKyAgdmFyIHRoaXNwID0g
YXJndW1lbnRzWzFdOworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaWYg
KGkgaW4gdCkgeworICAgICAgcmVzW2ldID0gZnVuLmNhbGwodGhpc3AsIHRbaV0sIGksIHQpOwor
ICAgIH0KKyAgfQogCi12YXIgR1VJRF9ERVNDID0gewotICB3cml0YWJsZTogICAgZmFsc2UsCi0g
IGNvbmZpZ3VyYWJsZTogZmFsc2UsCi0gIGVudW1lcmFibGU6ICBmYWxzZSwKLSAgdmFsdWU6IG51
bGwKKyAgcmV0dXJuIHJlczsKIH07CiAKLS8qKgotICBAcHJpdmF0ZQotCi0gIEdlbmVyYXRlcyBh
IG5ldyBndWlkLCBvcHRpb25hbGx5IHNhdmluZyB0aGUgZ3VpZCB0byB0aGUgb2JqZWN0IHRoYXQg
eW91Ci0gIHBhc3MgaW4uIFlvdSB3aWxsIHJhcmVseSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZC4g
SW5zdGVhZCB5b3Ugc2hvdWxkCi0gIGNhbGwgYEVtYmVyLmd1aWRGb3Iob2JqKWAsIHdoaWNoIHJl
dHVybiBhbiBleGlzdGluZyBndWlkIGlmIGF2YWlsYWJsZS4KLQotICBAbWV0aG9kIGdlbmVyYXRl
R3VpZAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBbb2JqXSBPYmplY3QgdGhlIGd1
aWQgd2lsbCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0aGUgZ3VpZCB3aWxsCi0gICAgYmUg
c2F2ZWQgb24gdGhlIG9iamVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlvdSBwYXNzIHRoZSBzYW1l
IG9iamVjdAotICAgIGFnYWluLgorLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5v
cmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yZWFjaAor
dmFyIGFycmF5Rm9yRWFjaCA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkg
PyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsK
KyAgLy8idXNlIHN0cmljdCI7CiAKLSAgICBJZiBubyBvYmplY3QgaXMgcGFzc2VkLCBqdXN0IGdl
bmVyYXRlIGEgbmV3IGd1aWQuCi0gIEBwYXJhbSB7U3RyaW5nfSBbcHJlZml4XSBQcmVmaXggdG8g
cGxhY2UgaW4gZnJvbnQgb2YgdGhlIGd1aWQuIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCi0gICAg
c2VwYXJhdGUgdGhlIGd1aWQgaW50byBzZXBhcmF0ZSBuYW1lc3BhY2VzLgotICBAcmV0dXJuIHtT
dHJpbmd9IHRoZSBndWlkCi0qLwotRW1iZXIuZ2VuZXJhdGVHdWlkID0gZnVuY3Rpb24gZ2VuZXJh
dGVHdWlkKG9iaiwgcHJlZml4KSB7Ci0gIGlmICghcHJlZml4KSBwcmVmaXggPSAnZW1iZXInOwot
ICB2YXIgcmV0ID0gKHByZWZpeCArICh1dWlkKyspKTsKLSAgaWYgKG9iaikgewotICAgIEdVSURf
REVTQy52YWx1ZSA9IHJldDsKLSAgICBvX2RlZmluZVByb3BlcnR5KG9iaiwgR1VJRF9LRVksIEdV
SURfREVTQyk7CisgIGlmICh0aGlzID09PSB2b2lkIDAgfHwgdGhpcyA9PT0gbnVsbCkgeworICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgfQotICByZXR1cm4gcmV0IDsKLX07CiAKLS8qKgot
ICBAcHJpdmF0ZQorICB2YXIgdCA9IE9iamVjdCh0aGlzKTsKKyAgdmFyIGxlbiA9IHQubGVuZ3Ro
ID4+PiAwOworICBpZiAodHlwZW9mIGZ1biAhPT0gImZ1bmN0aW9uIikgeworICAgIHRocm93IG5l
dyBUeXBlRXJyb3IoKTsKKyAgfQorCisgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKKyAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGlmIChpIGluIHQpIHsKKyAgICAgIGZ1
bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKKyAgICB9CisgIH0KK307CisKK3ZhciBhcnJheUlu
ZGV4T2YgPSBpc05hdGl2ZUZ1bmMoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpID8gQXJyYXkucHJv
dG90eXBlLmluZGV4T2YgOiBmdW5jdGlvbiAob2JqLCBmcm9tSW5kZXgpIHsKKyAgaWYgKGZyb21J
bmRleCA9PT0gbnVsbCB8fCBmcm9tSW5kZXggPT09IHVuZGVmaW5lZCkgeyBmcm9tSW5kZXggPSAw
OyB9CisgIGVsc2UgaWYgKGZyb21JbmRleCA8IDApIHsgZnJvbUluZGV4ID0gTWF0aC5tYXgoMCwg
dGhpcy5sZW5ndGggKyBmcm9tSW5kZXgpOyB9CisgIGZvciAodmFyIGkgPSBmcm9tSW5kZXgsIGog
PSB0aGlzLmxlbmd0aDsgaSA8IGo7IGkrKykgeworICAgIGlmICh0aGlzW2ldID09PSBvYmopIHsg
cmV0dXJuIGk7IH0KKyAgfQorICByZXR1cm4gLTE7Cit9OworCisvKioKKyAgQXJyYXkgcG9seWZp
bGxzIHRvIHN1cHBvcnQgRVM1IGZlYXR1cmVzIGluIG9sZGVyIGJyb3dzZXJzLgorCisgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgQHByb3BlcnR5IEFycmF5UG9seWZpbGxzCisqLworRW1iZXIuQXJyYXlQ
b2x5ZmlsbHMgPSB7CisgIG1hcDogYXJyYXlNYXAsCisgIGZvckVhY2g6IGFycmF5Rm9yRWFjaCwK
KyAgaW5kZXhPZjogYXJyYXlJbmRleE9mCit9OworCitpZiAoRW1iZXIuU0hJTV9FUzUpIHsKKyAg
aWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CisgICAgQXJyYXkucHJvdG90eXBlLm1hcCA9IGFy
cmF5TWFwOworICB9CisKKyAgaWYgKCFBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgeworICAgIEFy
cmF5LnByb3RvdHlwZS5mb3JFYWNoID0gYXJyYXlGb3JFYWNoOworICB9CisKKyAgaWYgKCFBcnJh
eS5wcm90b3R5cGUuaW5kZXhPZikgeworICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gYXJy
YXlJbmRleE9mOworICB9Cit9CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgZXJy
b3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNz
YWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107CisKKy8qKgorICBBIHN1YmNsYXNzIG9m
IHRoZSBKYXZhU2NyaXB0IEVycm9yIG9iamVjdCBmb3IgdXNlIGluIEVtYmVyLgorCisgIEBjbGFz
cyBFcnJvcgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVycm9yCisgIEBjb25zdHJ1
Y3RvcgorKi8KK0VtYmVyLkVycm9yID0gZnVuY3Rpb24oKSB7CisgIHZhciB0bXAgPSBFcnJvci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgIC8vIEFkZHMgYSBgc3RhY2tgIHByb3BlcnR5IHRv
IHRoZSBnaXZlbiBlcnJvciBvYmplY3QgdGhhdCB3aWxsIHlpZWxkIHRoZQorICAvLyBzdGFjayB0
cmFjZSBhdCB0aGUgdGltZSBjYXB0dXJlU3RhY2tUcmFjZSB3YXMgY2FsbGVkLgorICAvLyBXaGVu
IGNvbGxlY3RpbmcgdGhlIHN0YWNrIHRyYWNlIGFsbCBmcmFtZXMgYWJvdmUgdGhlIHRvcG1vc3Qg
Y2FsbAorICAvLyB0byB0aGlzIGZ1bmN0aW9uLCBpbmNsdWRpbmcgdGhhdCBjYWxsLCB3aWxsIGJl
IGxlZnQgb3V0IG9mIHRoZQorICAvLyBzdGFjayB0cmFjZS4KKyAgLy8gVGhpcyBpcyB1c2VmdWwg
YmVjYXVzZSB3ZSBjYW4gaGlkZSBFbWJlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgIC8vIHRo
YXQgYXJlIG5vdCB2ZXJ5IGhlbHBmdWwgZm9yIHRoZSB1c2VyLgorICBpZiAoRXJyb3IuY2FwdHVy
ZVN0YWNrVHJhY2UpIHsKKyAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFbWJlci5F
cnJvcik7CisgIH0KKyAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxl
IGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsu
CisgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykgewor
ICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOworICB9Cit9
OworCitFbWJlci5FcnJvci5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoRXJyb3IucHJvdG90eXBl
KTsKKworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgorLy8gRVJST1IgSEFORExJTkcKKy8vCisKKy8qKgorICBBIGZ1bmN0aW9uIG1h
eSBiZSBhc3NpZ25lZCB0byBgRW1iZXIub25lcnJvcmAgdG8gYmUgY2FsbGVkIHdoZW4gRW1iZXIK
KyAgaW50ZXJuYWxzIGVuY291bnRlciBhbiBlcnJvci4gVGhpcyBpcyB1c2VmdWwgZm9yIHNwZWNp
YWxpemVkIGVycm9yIGhhbmRsaW5nCisgIGFuZCByZXBvcnRpbmcgY29kZS4KKworICBgYGBqYXZh
c2NyaXB0CisgIEVtYmVyLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikgeworICAgIEVtLiQuYWph
eCgnL3JlcG9ydC1lcnJvcicsICdQT1NUJywgeworICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLAor
ICAgICAgb3RoZXJJbmZvcm1hdGlvbjogJ3doYXRldmVyIGFwcCBzdGF0ZSB5b3Ugd2FudCB0byBw
cm92aWRlJworICAgIH0pOworICB9OworICBgYGAKKworICBAZXZlbnQgb25lcnJvcgorICBAZm9y
IEVtYmVyCisgIEBwYXJhbSB7RXhjZXB0aW9ufSBlcnJvciB0aGUgZXJyb3Igb2JqZWN0CisqLwor
RW1iZXIub25lcnJvciA9IG51bGw7CisKKy8qKgorICBXcmFwIGNvZGUgYmxvY2sgaW4gYSB0cnkv
Y2F0Y2ggaWYgYEVtYmVyLm9uZXJyb3JgIGlzIHNldC4KKworICBAcHJpdmF0ZQorICBAbWV0aG9k
IGhhbmRsZUVycm9ycworICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKKyAg
QHBhcmFtIFtjb250ZXh0XQorKi8KK0VtYmVyLmhhbmRsZUVycm9ycyA9IGZ1bmN0aW9uKGZ1bmMs
IGNvbnRleHQpIHsKKyAgLy8gVW5mb3J0dW5hdGVseSBpbiBzb21lIGJyb3dzZXJzIHdlIGxvc2Ug
dGhlIGJhY2t0cmFjZSBpZiB3ZSByZXRocm93IHRoZSBleGlzdGluZyBlcnJvciwKKyAgLy8gc28g
aW4gdGhlIGV2ZW50IHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBgb25lcnJvcmAgaGFuZGxlciB3ZSBk
b24ndCB3cmFwIGluIGEgdHJ5L2NhdGNoCisgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgRW1i
ZXIub25lcnJvcikgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQg
fHwgdGhpcyk7CisgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIEVtYmVyLm9uZXJyb3IoZXJy
b3IpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQgfHwg
dGhpcyk7CisgIH0KK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXItbWV0YWwKKyovCisKKy8qKgorICBQcmVmaXggdXNlZCBmb3IgZ3VpZHMgdGhyb3Vn
aCBvdXQgRW1iZXIuCisgIEBwcml2YXRlCisqLworRW1iZXIuR1VJRF9QUkVGSVggPSAnZW1iZXIn
OworCisKK3ZhciBvX2RlZmluZVByb3BlcnR5ID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVy
dHksCisgICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCisgICAgLy8gVXNlZCBmb3IgZ3VpZCBn
ZW5lcmF0aW9uLi4uCisgICAgR1VJRF9LRVkgPSAnX19lbWJlcicrICgrIG5ldyBEYXRlKCkpLAor
ICAgIHV1aWQgICAgICAgICA9IDAsCisgICAgbnVtYmVyQ2FjaGUgID0gW10sCisgICAgc3RyaW5n
Q2FjaGUgID0ge307CisKK3ZhciBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9S
WV9TRVRURVI7CisKKy8qKgorICBBIHVuaXF1ZSBrZXkgdXNlZCB0byBhc3NpZ24gZ3VpZHMgYW5k
IG90aGVyIHByaXZhdGUgbWV0YWRhdGEgdG8gb2JqZWN0cy4KKyAgSWYgeW91IGluc3BlY3QgYW4g
b2JqZWN0IGluIHlvdXIgYnJvd3NlciBkZWJ1Z2dlciB5b3Ugd2lsbCBvZnRlbiBzZWUgdGhlc2Uu
CisgIFRoZXkgY2FuIGJlIHNhZmVseSBpZ25vcmVkLgorCisgIE9uIGJyb3dzZXJzIHRoYXQgc3Vw
cG9ydCBpdCwgdGhlc2UgcHJvcGVydGllcyBhcmUgYWRkZWQgd2l0aCBlbnVtZXJhdGlvbgorICBk
aXNhYmxlZCBzbyB0aGV5IHdvbid0IHNob3cgdXAgd2hlbiB5b3UgaXRlcmF0ZSBvdmVyIHlvdXIg
cHJvcGVydGllcy4KKworICBAcHJpdmF0ZQorICBAcHJvcGVydHkgR1VJRF9LRVkKKyAgQGZvciBF
bWJlcgorICBAdHlwZSBTdHJpbmcKKyAgQGZpbmFsCisqLworRW1iZXIuR1VJRF9LRVkgPSBHVUlE
X0tFWTsKKwordmFyIEdVSURfREVTQyA9IHsKKyAgd3JpdGFibGU6ICAgIGZhbHNlLAorICBjb25m
aWd1cmFibGU6IGZhbHNlLAorICBlbnVtZXJhYmxlOiAgZmFsc2UsCisgIHZhbHVlOiBudWxsCit9
OworCisvKioKKyAgR2VuZXJhdGVzIGEgbmV3IGd1aWQsIG9wdGlvbmFsbHkgc2F2aW5nIHRoZSBn
dWlkIHRvIHRoZSBvYmplY3QgdGhhdCB5b3UKKyAgcGFzcyBpbi4gWW91IHdpbGwgcmFyZWx5IG5l
ZWQgdG8gdXNlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkIHlvdSBzaG91bGQKKyAgY2FsbCBgRW1iZXIu
Z3VpZEZvcihvYmopYCwgd2hpY2ggcmV0dXJuIGFuIGV4aXN0aW5nIGd1aWQgaWYgYXZhaWxhYmxl
LgorCisgIEBwcml2YXRlCisgIEBtZXRob2QgZ2VuZXJhdGVHdWlkCisgIEBmb3IgRW1iZXIKKyAg
QHBhcmFtIHtPYmplY3R9IFtvYmpdIE9iamVjdCB0aGUgZ3VpZCB3aWxsIGJlIHVzZWQgZm9yLiBJ
ZiBwYXNzZWQgaW4sIHRoZSBndWlkIHdpbGwKKyAgICBiZSBzYXZlZCBvbiB0aGUgb2JqZWN0IGFu
ZCByZXVzZWQgd2hlbmV2ZXIgeW91IHBhc3MgdGhlIHNhbWUgb2JqZWN0CisgICAgYWdhaW4uCisK
KyAgICBJZiBubyBvYmplY3QgaXMgcGFzc2VkLCBqdXN0IGdlbmVyYXRlIGEgbmV3IGd1aWQuCisg
IEBwYXJhbSB7U3RyaW5nfSBbcHJlZml4XSBQcmVmaXggdG8gcGxhY2UgaW4gZnJvbnQgb2YgdGhl
IGd1aWQuIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCisgICAgc2VwYXJhdGUgdGhlIGd1aWQgaW50
byBzZXBhcmF0ZSBuYW1lc3BhY2VzLgorICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBndWlkCisqLwor
RW1iZXIuZ2VuZXJhdGVHdWlkID0gZnVuY3Rpb24gZ2VuZXJhdGVHdWlkKG9iaiwgcHJlZml4KSB7
CisgIGlmICghcHJlZml4KSBwcmVmaXggPSBFbWJlci5HVUlEX1BSRUZJWDsKKyAgdmFyIHJldCA9
IChwcmVmaXggKyAodXVpZCsrKSk7CisgIGlmIChvYmopIHsKKyAgICBHVUlEX0RFU0MudmFsdWUg
PSByZXQ7CisgICAgb19kZWZpbmVQcm9wZXJ0eShvYmosIEdVSURfS0VZLCBHVUlEX0RFU0MpOwor
ICB9CisgIHJldHVybiByZXQ7Cit9OwogCisvKioKICAgUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3Ig
dGhlIG9iamVjdC4gSWYgdGhlIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGd1aWQsCiAgIG9u
ZSB3aWxsIGJlIGFzc2lnbmVkIHRvIGl0LiBZb3UgY2FuIGNhbGwgdGhpcyBvbiBhbnkgb2JqZWN0
LAogICBgRW1iZXIuT2JqZWN0YC1iYXNlZCBvciBub3QsIGJ1dCBiZSBhd2FyZSB0aGF0IGl0IHdp
bGwgYWRkIGEgYF9ndWlkYApAQCAtNjQ5LDkgKzk4NCwxMCBAQCBFbWJlci5nZW5lcmF0ZUd1aWQg
PSBmdW5jdGlvbiBnZW5lcmF0ZUd1aWQob2JqLCBwcmVmaXgpIHsKIAogICBZb3UgY2FuIGFsc28g
dXNlIHRoaXMgbWV0aG9kIG9uIERPTSBFbGVtZW50IG9iamVjdHMuCiAKKyAgQHByaXZhdGUKICAg
QG1ldGhvZCBndWlkRm9yCiAgIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iaiB7T2JqZWN0fSBhbnkg
b2JqZWN0LCBzdHJpbmcsIG51bWJlciwgRWxlbWVudCwgb3IgcHJpbWl0aXZlCisgIEBwYXJhbSB7
T2JqZWN0fSBvYmogYW55IG9iamVjdCwgc3RyaW5nLCBudW1iZXIsIEVsZW1lbnQsIG9yIHByaW1p
dGl2ZQogICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmlxdWUgZ3VpZCBmb3IgdGhpcyBpbnN0YW5j
ZS4KICovCiBFbWJlci5ndWlkRm9yID0gZnVuY3Rpb24gZ3VpZEZvcihvYmopIHsKQEAgLTY2MCw3
ICs5OTYsNyBAQCBFbWJlci5ndWlkRm9yID0gZnVuY3Rpb24gZ3VpZEZvcihvYmopIHsKICAgaWYg
KG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gIih1bmRlZmluZWQpIjsKICAgaWYgKG9iaiA9PT0g
bnVsbCkgcmV0dXJuICIobnVsbCkiOwogCi0gIHZhciBjYWNoZSwgcmV0OworICB2YXIgcmV0Owog
ICB2YXIgdHlwZSA9IHR5cGVvZiBvYmo7CiAKICAgLy8gRG9uJ3QgYWxsb3cgcHJvdG90eXBlIGNo
YW5nZXMgdG8gU3RyaW5nIGV0Yy4gdG8gY2hhbmdlIHRoZSBndWlkRm9yCkBAIC03MTMsMTggKzEw
NDksNiBAQCB2YXIgTUVUQV9LRVkgPSBFbWJlci5HVUlEX0tFWSsnX21ldGEnOwogKi8KIEVtYmVy
Lk1FVEFfS0VZID0gTUVUQV9LRVk7CiAKLS8vIFBsYWNlaG9sZGVyIGZvciBub24td3JpdGFibGUg
bWV0YXMuCi12YXIgRU1QVFlfTUVUQSA9IHsKLSAgZGVzY3M6IHt9LAotICB3YXRjaGluZzoge30K
LX07Ci0KLWlmIChNQU5EQVRPUllfU0VUVEVSKSB7IEVNUFRZX01FVEEudmFsdWVzID0ge307IH0K
LQotRW1iZXIuRU1QVFlfTUVUQSA9IEVNUFRZX01FVEE7Ci0KLWlmIChPYmplY3QuZnJlZXplKSBP
YmplY3QuZnJlZXplKEVNUFRZX01FVEEpOwotCiB2YXIgaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRl
ZCA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5LmlzU2ltdWxhdGVkOwogCiBmdW5jdGlv
biBNZXRhKG9iaikgewpAQCAtNzM0LDYgKzEwNTgsMjAgQEAgZnVuY3Rpb24gTWV0YShvYmopIHsK
ICAgdGhpcy5zb3VyY2UgPSBvYmo7CiB9CiAKK01ldGEucHJvdG90eXBlID0geworICBkZXNjczog
bnVsbCwKKyAgZGVwczogbnVsbCwKKyAgd2F0Y2hpbmc6IG51bGwsCisgIGxpc3RlbmVyczogbnVs
bCwKKyAgY2FjaGU6IG51bGwsCisgIHNvdXJjZTogbnVsbCwKKyAgbWl4aW5zOiBudWxsLAorICBi
aW5kaW5nczogbnVsbCwKKyAgY2hhaW5zOiBudWxsLAorICBjaGFpbldhdGNoZXJzOiBudWxsLAor
ICB2YWx1ZXM6IG51bGwKK307CisKIGlmIChpc0RlZmluZVByb3BlcnR5U2ltdWxhdGVkKSB7CiAg
IC8vIG9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgZW51bWVyYWJsZSBmYWxzZQogICAv
LyBtYWtlIG1ldGEgZmFpbCBqUXVlcnkuaXNQbGFpbk9iamVjdCgpIHRvIGhpZGUgZnJvbQpAQCAt
NzQ2LDYgKzEwODQsMTMgQEAgaWYgKGlzRGVmaW5lUHJvcGVydHlTaW11bGF0ZWQpIHsKICAgTWV0
YS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgeyB9OwogfQogCisvLyBQbGFjZWhvbGRl
ciBmb3Igbm9uLXdyaXRhYmxlIG1ldGFzLgordmFyIEVNUFRZX01FVEEgPSBuZXcgTWV0YShudWxs
KTsKKworaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgRU1QVFlfTUVUQS52YWx1ZXMgPSB7fTsgfQor
CitFbWJlci5FTVBUWV9NRVRBID0gRU1QVFlfTUVUQTsKKwogLyoqCiAgIFJldHJpZXZlcyB0aGUg
bWV0YSBoYXNoIGZvciBhbiBvYmplY3QuIElmIGB3cml0YWJsZWAgaXMgdHJ1ZSBlbnN1cmVzIHRo
ZQogICBoYXNoIGlzIHdyaXRhYmxlIGZvciB0aGlzIG9iamVjdCBhcyB3ZWxsLgpAQCAtNzYyLDcg
KzExMDcsNyBAQCBpZiAoaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCkgewogICBAcGFyYW0ge09i
amVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgbWV0YSBmb3IKICAgQHBhcmFtIHtCb29s
ZWFufSBbd3JpdGFibGU9dHJ1ZV0gUGFzcyBgZmFsc2VgIGlmIHlvdSBkbyBub3QgaW50ZW5kIHRv
IG1vZGlmeQogICAgIHRoZSBtZXRhIGhhc2gsIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYXZvaWQg
bWFraW5nIGFuIHVubmVjZXNzYXJ5IGNvcHkuCi0gIEByZXR1cm4ge0hhc2h9CisgIEByZXR1cm4g
e09iamVjdH0gdGhlIG1ldGEgaGFzaCBmb3IgYW4gb2JqZWN0CiAqLwogRW1iZXIubWV0YSA9IGZ1
bmN0aW9uIG1ldGEob2JqLCB3cml0YWJsZSkgewogCkBAIC04MDksNiArMTE1NCw3IEBAIEVtYmVy
LnNldE1ldGEgPSBmdW5jdGlvbiBzZXRNZXRhKG9iaiwgcHJvcGVydHksIHZhbHVlKSB7CiB9Owog
CiAvKioKKyAgQGRlcHJlY2F0ZWQKICAgQHByaXZhdGUKIAogICBJbiBvcmRlciB0byBzdG9yZSBk
ZWZhdWx0cyBmb3IgYSBjbGFzcywgYSBwcm90b3R5cGUgbWF5IG5lZWQgdG8gY3JlYXRlCkBAIC04
NDEsNiArMTE4Nyw3IEBAIEVtYmVyLnNldE1ldGEgPSBmdW5jdGlvbiBzZXRNZXRhKG9iaiwgcHJv
cGVydHksIHZhbHVlKSB7CiAgICAgc2hhcmVkIHdpdGggaXRzIGNvbnN0cnVjdG9yCiAqLwogRW1i
ZXIubWV0YVBhdGggPSBmdW5jdGlvbiBtZXRhUGF0aChvYmosIHBhdGgsIHdyaXRhYmxlKSB7Cisg
IEVtYmVyLmRlcHJlY2F0ZSgiRW1iZXIubWV0YVBhdGggaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBi
ZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiIpOwogICB2YXIgbWV0YSA9IEVtYmVyLm1l
dGEob2JqLCB3cml0YWJsZSksIGtleU5hbWUsIHZhbHVlOwogCiAgIGZvciAodmFyIGk9MCwgbD1w
YXRoLmxlbmd0aDsgaTxsOyBpKyspIHsKQEAgLTg2MywxMiArMTIxMCwxMSBAQCBFbWJlci5tZXRh
UGF0aCA9IGZ1bmN0aW9uIG1ldGFQYXRoKG9iaiwgcGF0aCwgd3JpdGFibGUpIHsKIH07CiAKIC8q
KgotICBAcHJpdmF0ZQotCiAgIFdyYXBzIHRoZSBwYXNzZWQgZnVuY3Rpb24gc28gdGhhdCBgdGhp
cy5fc3VwZXJgIHdpbGwgcG9pbnQgdG8gdGhlIHN1cGVyRnVuYwogICB3aGVuIHRoZSBmdW5jdGlv
biBpcyBpbnZva2VkLiBUaGlzIGlzIHRoZSBwcmltaXRpdmUgd2UgdXNlIHRvIGltcGxlbWVudAog
ICBjYWxscyB0byBzdXBlci4KIAorICBAcHJpdmF0ZQogICBAbWV0aG9kIHdyYXAKICAgQGZvciBF
bWJlcgogICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYWxsCkBAIC04
ODksNiArMTIzNSw3IEBAIEVtYmVyLndyYXAgPSBmdW5jdGlvbihmdW5jLCBzdXBlckZ1bmMpIHsK
ICAgc3VwZXJXcmFwcGVyLndyYXBwZWRGdW5jdGlvbiA9IGZ1bmM7CiAgIHN1cGVyV3JhcHBlci5f
X2VtYmVyX29ic2VydmVzX18gPSBmdW5jLl9fZW1iZXJfb2JzZXJ2ZXNfXzsKICAgc3VwZXJXcmFw
cGVyLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyA9IGZ1bmMuX19lbWJlcl9vYnNlcnZlc0JlZm9y
ZV9fOworICBzdXBlcldyYXBwZXIuX19lbWJlcl9saXN0ZW5zX18gPSBmdW5jLl9fZW1iZXJfbGlz
dGVuc19fOwogCiAgIHJldHVybiBzdXBlcldyYXBwZXI7CiB9OwpAQCAtOTE0LDcgKzEyNjEsNyBA
QCBFbWJlci53cmFwID0gZnVuY3Rpb24oZnVuYywgc3VwZXJGdW5jKSB7CiAgIEBtZXRob2QgaXNB
cnJheQogICBAZm9yIEVtYmVyCiAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byB0
ZXN0Ci0gIEByZXR1cm4ge0Jvb2xlYW59CisgIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhl
IHBhc3NlZCBvYmplY3QgaXMgYW4gYXJyYXkgb3IgQXJyYXktbGlrZQogKi8KIEVtYmVyLmlzQXJy
YXkgPSBmdW5jdGlvbihvYmopIHsKICAgaWYgKCFvYmogfHwgb2JqLnNldEludGVydmFsKSB7IHJl
dHVybiBmYWxzZTsgfQpAQCAtOTU3LDEwICsxMzA0LDE4IEBAIGZ1bmN0aW9uIGNhbkludm9rZShv
YmosIG1ldGhvZE5hbWUpIHsKIC8qKgogICBDaGVja3MgdG8gc2VlIGlmIHRoZSBgbWV0aG9kTmFt
ZWAgZXhpc3RzIG9uIHRoZSBgb2JqYC4KIAorICBgYGBqYXZhc2NyaXB0CisgIHZhciBmb28gPSB7
YmFyOiBFbWJlci5LLCBiYXo6IG51bGx9OworICBFbWJlci5jYW5JbnZva2UoZm9vLCAnYmFyJyk7
IC8vIHRydWUKKyAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JheicpOyAvLyBmYWxzZQorICBFbWJl
ci5jYW5JbnZva2UoZm9vLCAnYmF0Jyk7IC8vIGZhbHNlCisgIGBgYAorCiAgIEBtZXRob2QgY2Fu
SW52b2tlCiAgIEBmb3IgRW1iZXIKICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRv
IGNoZWNrIGZvciB0aGUgbWV0aG9kCiAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIFRoZSBt
ZXRob2QgbmFtZSB0byBjaGVjayBmb3IKKyAgQHJldHVybiB7Qm9vbGVhbn0KICovCiBFbWJlci5j
YW5JbnZva2UgPSBjYW5JbnZva2U7CiAKQEAgLTk2OCwxMiArMTMyMywxOSBAQCBFbWJlci5jYW5J
bnZva2UgPSBjYW5JbnZva2U7CiAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGBtZXRob2ROYW1lYCBl
eGlzdHMgb24gdGhlIGBvYmpgLAogICBhbmQgaWYgaXQgZG9lcywgaW52b2tlcyBpdCB3aXRoIHRo
ZSBhcmd1bWVudHMgcGFzc2VkLgogCisgIGBgYGphdmFzY3JpcHQKKyAgdmFyIGQgPSBuZXcgRGF0
ZSgnMDMvMTUvMjAxMycpOworICBFbWJlci50cnlJbnZva2UoZCwgJ2dldFRpbWUnKTsgLy8gMTM2
MzMyMDAwMDAwMAorICBFbWJlci50cnlJbnZva2UoZCwgJ3NldEZ1bGxZZWFyJywgWzIwMTRdKTsg
Ly8gMTM5NDg1NjAwMDAwMAorICBFbWJlci50cnlJbnZva2UoZCwgJ25vU3VjaE1ldGhvZCcsIFsy
MDE0XSk7IC8vIHVuZGVmaW5lZAorICBgYGAKKwogICBAbWV0aG9kIHRyeUludm9rZQogICBAZm9y
IEVtYmVyCiAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhl
IG1ldGhvZAogICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8g
Y2hlY2sgZm9yCiAgIEBwYXJhbSB7QXJyYXl9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIHBhc3Mg
dG8gdGhlIG1ldGhvZAotICBAcmV0dXJuIHthbnl0aGluZ30gdGhlIHJldHVybiB2YWx1ZSBvZiB0
aGUgaW52b2tlZCBtZXRob2Qgb3IgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSBpbnZva2VkCisg
IEByZXR1cm4geyp9IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGludm9rZWQgbWV0aG9kIG9yIHVu
ZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgaW52b2tlZAogKi8KIEVtYmVyLnRyeUludm9rZSA9IGZ1
bmN0aW9uKG9iaiwgbWV0aG9kTmFtZSwgYXJncykgewogICBpZiAoY2FuSW52b2tlKG9iaiwgbWV0
aG9kTmFtZSkpIHsKQEAgLTk5OSwxMyArMTM2MSwyNCBAQCB2YXIgbmVlZHNGaW5hbGx5Rml4ID0g
KGZ1bmN0aW9uKCkgewogICBQcm92aWRlcyB0cnkgeyB9IGZpbmFsbHkgeyB9IGZ1bmN0aW9uYWxp
dHksIHdoaWxlIHdvcmtpbmcKICAgYXJvdW5kIFNhZmFyaSdzIGRvdWJsZSBmaW5hbGx5IGJ1Zy4K
IAorICBgYGBqYXZhc2NyaXB0CisgIHZhciB0cnlhYmxlID0gZnVuY3Rpb24oKSB7CisgICAgc29t
ZVJlc291cmNlLmxvY2soKTsKKyAgICBydW5DYWxsYmFjaygpOyAvLyBNYXkgdGhyb3cgZXJyb3Iu
CisgIH07CisgIHZhciBmaW5hbGl6ZXIgPSBmdW5jdGlvbigpIHsKKyAgICBzb21lUmVzb3VyY2Uu
dW5sb2NrKCk7CisgIH07CisgIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsK
KyAgYGBgCisKICAgQG1ldGhvZCB0cnlGaW5hbGx5CiAgIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgdHJ5IGNhbGxiYWNrCi0g
IEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIGZpbmFs
bHkgY2FsbGJhY2sKLSAgQHBhcmFtIFtiaW5kaW5nXQotICBAcmV0dXJuIHthbnl0aGluZ30gVGhl
IHJldHVybiB2YWx1ZSBpcyB0aGUgdGhhdCBvZiB0aGUgZmluYWxpemVyLAotICB1bmxlc3MgdGhh
dCB2YWx1ZWlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgcmV0dXJuIHZhbHVl
CisgIEBwYXJhbSB7RnVuY3Rpb259IHRyeWFibGUgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgdHJ5
IGNhbGxiYWNrCisgIEBwYXJhbSB7RnVuY3Rpb259IGZpbmFsaXplciBUaGUgZnVuY3Rpb24gdG8g
cnVuIHRoZSBmaW5hbGx5IGNhbGxiYWNrCisgIEBwYXJhbSB7T2JqZWN0fSBbYmluZGluZ10gVGhl
IG9wdGlvbmFsIGNhbGxpbmcgb2JqZWN0LiBEZWZhdWx0cyB0byAndGhpcycKKyAgQHJldHVybiB7
Kn0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGhhdCBvZiB0aGUgZmluYWxpemVyLAorICB1bmxl
c3MgdGhhdCB2YWx1ZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHJldHVy
biB2YWx1ZQogICBvZiB0aGUgdHJ5YWJsZQogKi8KIApAQCAtMTAyMCw3ICsxMzkzLDcgQEAgaWYg
KG5lZWRzRmluYWxseUZpeCkgewogICAgIH0gZmluYWxseSB7CiAgICAgICB0cnkgewogICAgICAg
ICBmaW5hbFJlc3VsdCA9IGZpbmFsaXplci5jYWxsKGJpbmRpbmcpOwotICAgICAgfSBjYXRjaCAo
ZSl7CisgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgIGZpbmFsRXJyb3IgPSBlOwogICAgICAg
fQogICAgIH0KQEAgLTEwNDksMTkgKzE0MjIsNDMgQEAgaWYgKG5lZWRzRmluYWxseUZpeCkgewog
ICBQcm92aWRlcyB0cnkgeyB9IGNhdGNoIGZpbmFsbHkgeyB9IGZ1bmN0aW9uYWxpdHksIHdoaWxl
IHdvcmtpbmcKICAgYXJvdW5kIFNhZmFyaSdzIGRvdWJsZSBmaW5hbGx5IGJ1Zy4KIAorICBgYGBq
YXZhc2NyaXB0CisgIHZhciB0cnlhYmxlID0gZnVuY3Rpb24oKSB7CisgICAgZm9yIChpPTAsIGw9
bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJz
W2ldOworICAgICAgYmVmb3JlVmFsdWVzW2ldID0gbGlzdGVuZXIuYmVmb3JlKG5hbWUsIHRpbWUo
KSwgcGF5bG9hZCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoYmluZGluZyk7
CisgIH07CisKKyAgdmFyIGNhdGNoYWJsZSA9IGZ1bmN0aW9uKGUpIHsKKyAgICBwYXlsb2FkID0g
cGF5bG9hZCB8fCB7fTsKKyAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7CisgIH07CisKKyAgdmFy
IGZpbmFsaXplciA9IGZ1bmN0aW9uKCkgeworICAgIGZvciAoaT0wLCBsPWxpc3RlbmVycy5sZW5n
dGg7IGk8bDsgaSsrKSB7CisgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKyAgICAgIGxp
c3RlbmVyLmFmdGVyKG5hbWUsIHRpbWUoKSwgcGF5bG9hZCwgYmVmb3JlVmFsdWVzW2ldKTsKKyAg
ICB9CisgIH07CisgIEVtYmVyLnRyeUNhdGNoRmluYWxseSh0cnlhYmxlLCBjYXRjaGFibGUsIGZp
bmFsaXplcik7CisgIGBgYAorCiAgIEBtZXRob2QgdHJ5Q2F0Y2hGaW5hbGx5CiAgIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUg
dHJ5IGNhbGxiYWNrCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0
byBydW4gdGhlIGNhdGNoYWJsZSBjYWxsYmFjawotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdGlv
biBUaGUgZnVuY3Rpb24gdG8gcnVuIHRoZSBmaW5hbGx5IGNhbGxiYWNrCi0gIEBwYXJhbSBbYmlu
ZGluZ10KLSAgQHJldHVybiB7YW55dGhpbmd9IFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRoYXQg
b2YgdGhlIGZpbmFsaXplciwKKyAgQHBhcmFtIHtGdW5jdGlvbn0gdHJ5YWJsZSBUaGUgZnVuY3Rp
b24gdG8gcnVuIHRoZSB0cnkgY2FsbGJhY2sKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY2F0Y2hhYmxl
IFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIGNhdGNoYWJsZSBjYWxsYmFjaworICBAcGFyYW0ge0Z1
bmN0aW9ufSBmaW5hbGl6ZXIgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgZmluYWxseSBjYWxsYmFj
aworICBAcGFyYW0ge09iamVjdH0gW2JpbmRpbmddIFRoZSBvcHRpb25hbCBjYWxsaW5nIG9iamVj
dC4gRGVmYXVsdHMgdG8gJ3RoaXMnCisgIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgaXMg
dGhlIHRoYXQgb2YgdGhlIGZpbmFsaXplciwKICAgdW5sZXNzIHRoYXQgdmFsdWUgaXMgdW5kZWZp
bmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUKICAgb2YgdGhlIHRyeWFi
bGUuCiAqLwogaWYgKG5lZWRzRmluYWxseUZpeCkgewogICBFbWJlci50cnlDYXRjaEZpbmFsbHkg
PSBmdW5jdGlvbih0cnlhYmxlLCBjYXRjaGFibGUsIGZpbmFsaXplciwgYmluZGluZykgewotICAg
IHZhciByZXN1bHQsIGZpbmFsUmVzdWx0LCBmaW5hbEVycm9yLCBmaW5hbFJldHVybjsKKyAgICB2
YXIgcmVzdWx0LCBmaW5hbFJlc3VsdCwgZmluYWxFcnJvcjsKIAogICAgIGJpbmRpbmcgPSBiaW5k
aW5nIHx8IHRoaXM7CiAKQEAgLTEwNzIsNyArMTQ2OSw3IEBAIGlmIChuZWVkc0ZpbmFsbHlGaXgp
IHsKICAgICB9IGZpbmFsbHkgewogICAgICAgdHJ5IHsKICAgICAgICAgZmluYWxSZXN1bHQgPSBm
aW5hbGl6ZXIuY2FsbChiaW5kaW5nKTsKLSAgICAgIH0gY2F0Y2ggKGUpeworICAgICAgfSBjYXRj
aCAoZSkgewogICAgICAgICBmaW5hbEVycm9yID0gZTsKICAgICAgIH0KICAgICB9CkBAIC0xMDk5
LDcgKzE0OTYsODcgQEAgaWYgKG5lZWRzRmluYWxseUZpeCkgewogICB9OwogfQogCi19KSgpOwor
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gVFlQSU5HICYg
QVJSQVkgTUVTU0FHSU5HCisvLworCit2YXIgVFlQRV9NQVAgPSB7fTsKK3ZhciB0ID0gIkJvb2xl
YW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0
KCIgIik7CitFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLmNhbGwodCwgZnVuY3Rpb24obmFt
ZSkgeworICBUWVBFX01BUFsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dl
ckNhc2UoKTsKK30pOworCit2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5n
OworCisvKioKKyAgUmV0dXJucyBhIGNvbnNpc3RlbnQgdHlwZSBmb3IgdGhlIHBhc3NlZCBpdGVt
LgorCisgIFVzZSB0aGlzIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluIGB0eXBlb2ZgIHRvIGdldCB0
aGUgdHlwZSBvZiBhbiBpdGVtLgorICBJdCB3aWxsIHJldHVybiB0aGUgc2FtZSByZXN1bHQgYWNy
b3NzIGFsbCBicm93c2VycyBhbmQgaW5jbHVkZXMgYSBiaXQKKyAgbW9yZSBkZXRhaWwuIEhlcmUg
aXMgd2hhdCB3aWxsIGJlIHJldHVybmVkOgorCisgICAgICB8IFJldHVybiBWYWx1ZSAgfCBNZWFu
aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAg
IHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tfAorICAgICAgfCAnc3RyaW5nJyAgICAgIHwgU3RyaW5nIHByaW1pdGl2
ZSBvciBTdHJpbmcgb2JqZWN0LiAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICdudW1iZXIn
ICAgICAgfCBOdW1iZXIgcHJpbWl0aXZlIG9yIE51bWJlciBvYmplY3QuICAgICAgICAgICAgICAg
ICAgIHwKKyAgICAgIHwgJ2Jvb2xlYW4nICAgICB8IEJvb2xlYW4gcHJpbWl0aXZlIG9yIEJvb2xl
YW4gb2JqZWN0LiAgICAgICAgICAgICAgICAgfAorICAgICAgfCAnbnVsbCcgICAgICAgIHwgTnVs
bCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAg
ICB8ICd1bmRlZmluZWQnICAgfCBVbmRlZmluZWQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgJ2Z1bmN0aW9uJyAgICB8IEEgZnVuY3Rpb24gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAnYXJyYXkn
ICAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisgICAgICB8ICdyZWdleHAnICAgICAgfCBBbiBpbnN0YW5jZSBvZiBSZWdFeHAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgJ2RhdGUnICAgICAgICB8IEFu
IGluc3RhbmNlIG9mIERhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAg
ICAgfCAnY2xhc3MnICAgICAgIHwgQW4gRW1iZXIgY2xhc3MgKGNyZWF0ZWQgdXNpbmcgRW1iZXIu
T2JqZWN0LmV4dGVuZCgpKSB8CisgICAgICB8ICdpbnN0YW5jZScgICAgfCBBbiBFbWJlciBvYmpl
Y3QgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgJ2Vycm9y
JyAgICAgICB8IEFuIGluc3RhbmNlIG9mIHRoZSBFcnJvciBvYmplY3QgICAgICAgICAgICAgICAg
ICAgICAgfAorICAgICAgfCAnb2JqZWN0JyAgICAgIHwgQSBKYXZhU2NyaXB0IG9iamVjdCBub3Qg
aW5oZXJpdGluZyBmcm9tIEVtYmVyLk9iamVjdCB8CisKKyAgRXhhbXBsZXM6CisKKyAgYGBgamF2
YXNjcmlwdAorICBFbWJlci50eXBlT2YoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vICd1bmRl
ZmluZWQnCisgIEVtYmVyLnR5cGVPZihudWxsKTsgICAgICAgICAgICAgICAgICAgLy8gJ251bGwn
CisgIEVtYmVyLnR5cGVPZih1bmRlZmluZWQpOyAgICAgICAgICAgICAgLy8gJ3VuZGVmaW5lZCcK
KyAgRW1iZXIudHlwZU9mKCdtaWNoYWVsJyk7ICAgICAgICAgICAgICAvLyAnc3RyaW5nJworICBF
bWJlci50eXBlT2YobmV3IFN0cmluZygnbWljaGFlbCcpKTsgIC8vICdzdHJpbmcnCisgIEVtYmVy
LnR5cGVPZigxMDEpOyAgICAgICAgICAgICAgICAgICAgLy8gJ251bWJlcicKKyAgRW1iZXIudHlw
ZU9mKG5ldyBOdW1iZXIoMTAxKSk7ICAgICAgICAvLyAnbnVtYmVyJworICBFbWJlci50eXBlT2Yo
dHJ1ZSk7ICAgICAgICAgICAgICAgICAgIC8vICdib29sZWFuJworICBFbWJlci50eXBlT2YobmV3
IEJvb2xlYW4odHJ1ZSkpOyAgICAgIC8vICdib29sZWFuJworICBFbWJlci50eXBlT2YoRW1iZXIu
bWFrZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKKyAgRW1iZXIudHlwZU9mKFsxLDIsOTBd
KTsgICAgICAgICAgICAgICAvLyAnYXJyYXknCisgIEVtYmVyLnR5cGVPZigvYWJjLyk7ICAgICAg
ICAgICAgICAgICAgLy8gJ3JlZ2V4cCcKKyAgRW1iZXIudHlwZU9mKG5ldyBEYXRlKCkpOyAgICAg
ICAgICAgICAvLyAnZGF0ZScKKyAgRW1iZXIudHlwZU9mKEVtYmVyLk9iamVjdC5leHRlbmQoKSk7
ICAvLyAnY2xhc3MnCisgIEVtYmVyLnR5cGVPZihFbWJlci5PYmplY3QuY3JlYXRlKCkpOyAgLy8g
J2luc3RhbmNlJworICBFbWJlci50eXBlT2YobmV3IEVycm9yKCd0ZWFtb2NpbCcpKTsgIC8vICdl
cnJvcicKKworICAvLyAibm9ybWFsIiBKYXZhU2NyaXB0IG9iamVjdAorICBFbWJlci50eXBlT2Yo
e2E6ICdiJ30pOyAgICAgICAgICAgICAgLy8gJ29iamVjdCcKKyAgYGBgCisKKyAgQG1ldGhvZCB0
eXBlT2YKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gaXRlbSB0aGUgaXRlbSB0byBj
aGVjaworICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB0eXBlCisqLworRW1iZXIudHlwZU9mID0gZnVu
Y3Rpb24oaXRlbSkgeworICB2YXIgcmV0OworCisgIHJldCA9IChpdGVtID09PSBudWxsIHx8IGl0
ZW0gPT09IHVuZGVmaW5lZCkgPyBTdHJpbmcoaXRlbSkgOiBUWVBFX01BUFt0b1N0cmluZy5jYWxs
KGl0ZW0pXSB8fCAnb2JqZWN0JzsKKworICBpZiAocmV0ID09PSAnZnVuY3Rpb24nKSB7CisgICAg
aWYgKEVtYmVyLk9iamVjdCAmJiBFbWJlci5PYmplY3QuZGV0ZWN0KGl0ZW0pKSByZXQgPSAnY2xh
c3MnOworICB9IGVsc2UgaWYgKHJldCA9PT0gJ29iamVjdCcpIHsKKyAgICBpZiAoaXRlbSBpbnN0
YW5jZW9mIEVycm9yKSByZXQgPSAnZXJyb3InOworICAgIGVsc2UgaWYgKEVtYmVyLk9iamVjdCAm
JiBpdGVtIGluc3RhbmNlb2YgRW1iZXIuT2JqZWN0KSByZXQgPSAnaW5zdGFuY2UnOworICAgIGVs
c2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBEYXRlKSByZXQgPSAnZGF0ZSc7CisgIH0KKworICByZXR1
cm4gcmV0OworfTsKKworfSkoKTsKIAogCiAKQEAgLTExNzEsMTMgKzE2NDgsMjMgQEAgdmFyIHBv
cHVsYXRlTGlzdGVuZXJzID0gZnVuY3Rpb24obmFtZSkgewogfTsKIAogdmFyIHRpbWUgPSAoZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyA/
IHdpbmRvdy5wZXJmb3JtYW5jZSB8fCB7fSA6IHt9OwotICAgIHZhciBmbiA9IHBlcmYubm93IHx8
IHBlcmYubW96Tm93IHx8IHBlcmYud2Via2l0Tm93IHx8IHBlcmYubXNOb3cgfHwgcGVyZi5vTm93
OwotICAgIC8vIGZuLmJpbmQgd2lsbCBiZSBhdmFpbGFibGUgaW4gYWxsIHRoZSBicm93c2VycyB0
aGF0IHN1cHBvcnQgdGhlIGFkdmFuY2VkIHdpbmRvdy5wZXJmb3JtYW5jZS4uLiA7LSkKLSAgICBy
ZXR1cm4gZm4gPyBmbi5iaW5kKHBlcmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3IERhdGUo
KTsgfTsKKyAgdmFyIHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRv
dy5wZXJmb3JtYW5jZSB8fCB7fSA6IHt9OworICB2YXIgZm4gPSBwZXJmLm5vdyB8fCBwZXJmLm1v
ek5vdyB8fCBwZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdzsKKyAgLy8g
Zm4uYmluZCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhbGwgdGhlIGJyb3dzZXJzIHRoYXQgc3VwcG9y
dCB0aGUgYWR2YW5jZWQgd2luZG93LnBlcmZvcm1hbmNlLi4uIDstKQorICByZXR1cm4gZm4gPyBm
bi5iaW5kKHBlcmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3IERhdGUoKTsgfTsKIH0pKCk7
CiAKKy8qKgorICBOb3RpZmllcyBldmVudCdzIHN1YnNjcmliZXJzLCBjYWxscyBgYmVmb3JlYCBh
bmQgYGFmdGVyYCBob29rcy4KKworICBAbWV0aG9kIGluc3RydW1lbnQKKyAgQG5hbWVzcGFjZSBF
bWJlci5JbnN0cnVtZW50YXRpb24KIAorICBAcGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFj
ZWQgZXZlbnQgbmFtZS4KKyAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKKyAgQHBhcmFtIHtGdW5j
dGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gdGhhdCB5b3UncmUgaW5zdHJ1bWVudGluZy4KKyAgQHBh
cmFtIHtPYmplY3R9IGJpbmRpbmcgQ29udGV4dCB0aGF0IGluc3RydW1lbnQgZnVuY3Rpb24gaXMg
Y2FsbGVkIHdpdGguCisqLwogRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQgPSBmdW5j
dGlvbihuYW1lLCBwYXlsb2FkLCBjYWxsYmFjaywgYmluZGluZykgewogICB2YXIgbGlzdGVuZXJz
ID0gY2FjaGVbbmFtZV0sIHRpbWVOYW1lLCByZXQ7CiAKQEAgLTExOTgsNyArMTY4NSw3IEBAIEVt
YmVyLkluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50ID0gZnVuY3Rpb24obmFtZSwgcGF5bG9hZCwg
Y2FsbGJhY2ssIGJpbmRpbmcpIHsKIAogICB2YXIgYmVmb3JlVmFsdWVzID0gW10sIGxpc3RlbmVy
LCBpLCBsOwogCi0gIGZ1bmN0aW9uIHRyeWFibGUoKXsKKyAgZnVuY3Rpb24gdHJ5YWJsZSgpIHsK
ICAgICBmb3IgKGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgbGlz
dGVuZXIgPSBsaXN0ZW5lcnNbaV07CiAgICAgICBiZWZvcmVWYWx1ZXNbaV0gPSBsaXN0ZW5lci5i
ZWZvcmUobmFtZSwgdGltZSgpLCBwYXlsb2FkKTsKQEAgLTEyMDcsNyArMTY5NCw3IEBAIEVtYmVy
Lkluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50ID0gZnVuY3Rpb24obmFtZSwgcGF5bG9hZCwgY2Fs
bGJhY2ssIGJpbmRpbmcpIHsKICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKICAg
fQogCi0gIGZ1bmN0aW9uIGNhdGNoYWJsZShlKXsKKyAgZnVuY3Rpb24gY2F0Y2hhYmxlKGUpIHsK
ICAgICBwYXlsb2FkID0gcGF5bG9hZCB8fCB7fTsKICAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7
CiAgIH0KQEAgLTEyMjYsNiArMTcxMywxNyBAQCBFbWJlci5JbnN0cnVtZW50YXRpb24uaW5zdHJ1
bWVudCA9IGZ1bmN0aW9uKG5hbWUsIHBheWxvYWQsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CiAgIHJl
dHVybiBFbWJlci50cnlDYXRjaEZpbmFsbHkodHJ5YWJsZSwgY2F0Y2hhYmxlLCBmaW5hbGl6ZXIp
OwogfTsKIAorLyoqCisgIFN1YnNjcmliZXMgdG8gYSBwYXJ0aWN1bGFyIGV2ZW50IG9yIGluc3Ry
dW1lbnRlZCBibG9jayBvZiBjb2RlLgorCisgIEBtZXRob2Qgc3Vic2NyaWJlCisgIEBuYW1lc3Bh
Y2UgRW1iZXIuSW5zdHJ1bWVudGF0aW9uCisKKyAgQHBhcmFtIHtTdHJpbmd9IFtwYXR0ZXJuXSBO
YW1lc3BhY2VkIGV2ZW50IG5hbWUuCisgIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBCZWZvcmUg
YW5kIEFmdGVyIGhvb2tzLgorCisgIEByZXR1cm4ge1N1YnNjcmliZXJ9CisqLwogRW1iZXIuSW5z
dHJ1bWVudGF0aW9uLnN1YnNjcmliZSA9IGZ1bmN0aW9uKHBhdHRlcm4sIG9iamVjdCkgewogICB2
YXIgcGF0aHMgPSBwYXR0ZXJuLnNwbGl0KCIuIiksIHBhdGgsIHJlZ2V4ID0gW107CiAKQEAgLTEy
NTMsNiArMTc1MSwxNCBAQCBFbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlID0gZnVuY3Rp
b24ocGF0dGVybiwgb2JqZWN0KSB7CiAgIHJldHVybiBzdWJzY3JpYmVyOwogfTsKIAorLyoqCisg
IFVuc3Vic2NyaWJlcyBmcm9tIGEgcGFydGljdWxhciBldmVudCBvciBpbnN0cnVtZW50ZWQgYmxv
Y2sgb2YgY29kZS4KKworICBAbWV0aG9kIHVuc3Vic2NyaWJlCisgIEBuYW1lc3BhY2UgRW1iZXIu
SW5zdHJ1bWVudGF0aW9uCisKKyAgQHBhcmFtIHtPYmplY3R9IFtzdWJzY3JpYmVyXQorKi8KIEVt
YmVyLkluc3RydW1lbnRhdGlvbi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsK
ICAgdmFyIGluZGV4OwogCkBAIC0xMjY2LDYgKzE3NzIsMTIgQEAgRW1iZXIuSW5zdHJ1bWVudGF0
aW9uLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICBjYWNoZSA9IHt9Owog
fTsKIAorLyoqCisgIFJlc2V0cyBgRW1iZXIuSW5zdHJ1bWVudGF0aW9uYCBieSBmbHVzaGluZyBs
aXN0IG9mIHN1YnNjcmliZXJzLgorCisgIEBtZXRob2QgcmVzZXQKKyAgQG5hbWVzcGFjZSBFbWJl
ci5JbnN0cnVtZW50YXRpb24KKyovCiBFbWJlci5JbnN0cnVtZW50YXRpb24ucmVzZXQgPSBmdW5j
dGlvbigpIHsKICAgc3Vic2NyaWJlcnMgPSBbXTsKICAgY2FjaGUgPSB7fTsKQEAgLTEyNzMsMjMg
KzE3ODUsMjggQEAgRW1iZXIuSW5zdHJ1bWVudGF0aW9uLnJlc2V0ID0gZnVuY3Rpb24oKSB7CiAK
IEVtYmVyLmluc3RydW1lbnQgPSBFbWJlci5JbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudDsKIEVt
YmVyLnN1YnNjcmliZSA9IEVtYmVyLkluc3RydW1lbnRhdGlvbi5zdWJzY3JpYmU7Ci0KIH0pKCk7
CiAKIAogCiAoZnVuY3Rpb24oKSB7Cit2YXIgbWFwLCBmb3JFYWNoLCBpbmRleE9mLCBzcGxpY2U7
CittYXAgICAgID0gQXJyYXkucHJvdG90eXBlLm1hcCAgICAgfHwgRW1iZXIuQXJyYXlQb2x5Zmls
bHMubWFwOworZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIHx8IEVtYmVyLkFycmF5
UG9seWZpbGxzLmZvckVhY2g7CitpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwg
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKK3NwbGljZSA9IEFycmF5LnByb3RvdHlwZS5z
cGxpY2U7CisKIHZhciB1dGlscyA9IEVtYmVyLkVudW1lcmFibGVVdGlscyA9IHsKICAgbWFwOiBm
dW5jdGlvbihvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSB7Ci0gICAgcmV0dXJuIG9iai5tYXAgPyBv
YmoubWFwLmNhbGwob2JqLCBjYWxsYmFjaywgdGhpc0FyZykgOiBBcnJheS5wcm90b3R5cGUubWFw
LmNhbGwob2JqLCBjYWxsYmFjaywgdGhpc0FyZyk7CisgICAgcmV0dXJuIG9iai5tYXAgPyBvYmou
bWFwLmNhbGwob2JqLCBjYWxsYmFjaywgdGhpc0FyZykgOiBtYXAuY2FsbChvYmosIGNhbGxiYWNr
LCB0aGlzQXJnKTsKICAgfSwKIAogICBmb3JFYWNoOiBmdW5jdGlvbihvYmosIGNhbGxiYWNrLCB0
aGlzQXJnKSB7Ci0gICAgcmV0dXJuIG9iai5mb3JFYWNoID8gb2JqLmZvckVhY2guY2FsbChvYmos
IGNhbGxiYWNrLCB0aGlzQXJnKSA6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob2JqLCBj
YWxsYmFjaywgdGhpc0FyZyk7CisgICAgcmV0dXJuIG9iai5mb3JFYWNoID8gb2JqLmZvckVhY2gu
Y2FsbChvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSA6IGZvckVhY2guY2FsbChvYmosIGNhbGxiYWNr
LCB0aGlzQXJnKTsKICAgfSwKIAogICBpbmRleE9mOiBmdW5jdGlvbihvYmosIGVsZW1lbnQsIGlu
ZGV4KSB7Ci0gICAgcmV0dXJuIG9iai5pbmRleE9mID8gb2JqLmluZGV4T2YuY2FsbChvYmosIGVs
ZW1lbnQsIGluZGV4KSA6IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwob2JqLCBlbGVtZW50
LCBpbmRleCk7CisgICAgcmV0dXJuIG9iai5pbmRleE9mID8gb2JqLmluZGV4T2YuY2FsbChvYmos
IGVsZW1lbnQsIGluZGV4KSA6IGluZGV4T2YuY2FsbChvYmosIGVsZW1lbnQsIGluZGV4KTsKICAg
fSwKIAogICBpbmRleGVzT2Y6IGZ1bmN0aW9uKG9iaiwgZWxlbWVudHMpIHsKQEAgLTEzMDgsMjAg
KzE4MjUsMzkgQEAgdmFyIHV0aWxzID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzID0gewogICAgIGlm
IChpbmRleCAhPT0gLTEpIHsgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsgfQogICB9LAogCisgIF9y
ZXBsYWNlOiBmdW5jdGlvbihhcnJheSwgaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICB2YXIgYXJn
cyA9IFtdLmNvbmNhdChvYmplY3RzKSwgY2h1bmssIHJldCA9IFtdLAorICAgICAgICAvLyBodHRw
czovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTY1ODgKKyAg
ICAgICAgc2l6ZSA9IDYwMDAwLCBzdGFydCA9IGlkeCwgZW5kcyA9IGFtdCwgY291bnQ7CisKKyAg
ICB3aGlsZSAoYXJncy5sZW5ndGgpIHsKKyAgICAgIGNvdW50ID0gZW5kcyA+IHNpemUgPyBzaXpl
IDogZW5kczsKKyAgICAgIGlmIChjb3VudCA8PSAwKSB7IGNvdW50ID0gMDsgfQorCisgICAgICBj
aHVuayA9IGFyZ3Muc3BsaWNlKDAsIHNpemUpOworICAgICAgY2h1bmsgPSBbc3RhcnQsIGNvdW50
XS5jb25jYXQoY2h1bmspOworCisgICAgICBzdGFydCArPSBzaXplOworICAgICAgZW5kcyAtPSBj
b3VudDsKKworICAgICAgcmV0ID0gcmV0LmNvbmNhdChzcGxpY2UuYXBwbHkoYXJyYXksIGNodW5r
KSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0sCisKICAgcmVwbGFjZTogZnVuY3Rpb24o
YXJyYXksIGlkeCwgYW10LCBvYmplY3RzKSB7CiAgICAgaWYgKGFycmF5LnJlcGxhY2UpIHsKICAg
ICAgIHJldHVybiBhcnJheS5yZXBsYWNlKGlkeCwgYW10LCBvYmplY3RzKTsKICAgICB9IGVsc2Ug
ewotICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtpZHgsIGFt
dF0sIG9iamVjdHMpOwotICAgICAgcmV0dXJuIGFycmF5LnNwbGljZS5hcHBseShhcnJheSwgYXJn
cyk7CisgICAgICByZXR1cm4gdXRpbHMuX3JlcGxhY2UoYXJyYXksIGlkeCwgYW10LCBvYmplY3Rz
KTsKICAgICB9CiAgIH0sCiAKICAgaW50ZXJzZWN0aW9uOiBmdW5jdGlvbihhcnJheTEsIGFycmF5
MikgewogICAgIHZhciBpbnRlcnNlY3Rpb24gPSBbXTsKIAotICAgIGFycmF5MS5mb3JFYWNoKGZ1
bmN0aW9uKGVsZW1lbnQpIHsKLSAgICAgIGlmIChhcnJheTIuaW5kZXhPZihlbGVtZW50KSA+PSAw
KSB7CisgICAgdXRpbHMuZm9yRWFjaChhcnJheTEsIGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAg
IGlmICh1dGlscy5pbmRleE9mKGFycmF5MiwgZWxlbWVudCkgPj0gMCkgewogICAgICAgICBpbnRl
cnNlY3Rpb24ucHVzaChlbGVtZW50KTsKICAgICAgIH0KICAgICB9KTsKQEAgLTEzMzUsMTg0NCAr
MTg3MSwxODM4IEBAIHZhciB1dGlscyA9IEVtYmVyLkVudW1lcmFibGVVdGlscyA9IHsKIAogCiAo
ZnVuY3Rpb24oKSB7Ci0vKmpzaGludCBuZXdjYXA6ZmFsc2UqLwogLyoqCiBAbW9kdWxlIGVtYmVy
LW1ldGFsCiAqLwogCi0vLyBOT1RFOiBUaGVyZSBpcyBhIGJ1ZyBpbiBqc2hpbnQgdGhhdCBkb2Vz
bid0IHJlY29nbml6ZSBgT2JqZWN0KClgIHdpdGhvdXQgYG5ld2AKLS8vIGFzIGJlaW5nIG9rIHVu
bGVzcyBib3RoIGBuZXdjYXA6ZmFsc2VgIGFuZCBub3QgYHVzZSBzdHJpY3RgLgotLy8gaHR0cHM6
Ly9naXRodWIuY29tL2pzaGludC9qc2hpbnQvaXNzdWVzLzM5MgordmFyIE1FVEFfS0VZID0gRW1i
ZXIuTUVUQV9LRVksIGdldDsKIAotLy8gVGVzdGluZyB0aGlzIGlzIG5vdCBpZGVhbCwgYnV0IHdl
IHdhbnQgdG8gdXNlIG5hdGl2ZSBmdW5jdGlvbnMKLS8vIGlmIGF2YWlsYWJsZSwgYnV0IG5vdCB0
byB1c2UgdmVyc2lvbnMgY3JlYXRlZCBieSBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUKLXZhciBp
c05hdGl2ZUZ1bmMgPSBmdW5jdGlvbihmdW5jKSB7Ci0gIC8vIFRoaXMgc2hvdWxkIHByb2JhYmx5
IHdvcmsgaW4gYWxsIGJyb3dzZXJzIGxpa2VseSB0byBoYXZlIEVTNSBhcnJheSBtZXRob2RzCi0g
IHJldHVybiBmdW5jICYmIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmMpLmlu
ZGV4T2YoJ1tuYXRpdmUgY29kZV0nKSA+IC0xOwotfTsKK3ZhciBNQU5EQVRPUllfU0VUVEVSID0g
RW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVI7CiAKLS8vIEZyb206IGh0dHBzOi8vZGV2ZWxvcGVy
Lm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5
L21hcAotdmFyIGFycmF5TWFwID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5tYXApID8g
QXJyYXkucHJvdG90eXBlLm1hcCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKLSAgLy8i
dXNlIHN0cmljdCI7Cit2YXIgSVNfR0xPQkFMX1BBVEggPSAvXihbQS1aJF18KFswLTldW0EtWiRd
KSkuKltcLlwqXS87Cit2YXIgSEFTX1RISVMgID0gL150aGlzW1wuXCpdLzsKK3ZhciBGSVJTVF9L
RVkgPSAvXihbXlwuXCpdKykvOwogCi0gIGlmICh0aGlzID09PSB2b2lkIDAgfHwgdGhpcyA9PT0g
bnVsbCkgewotICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKLSAgfQorLy8gLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gR0VUIEFO
RCBTRVQKKy8vCisvLyBJZiB3ZSBhcmUgb24gYSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIGFjY2Vz
c29ycyB3ZSBjYW4gdXNlIHRob3NlLgorLy8gT3RoZXJ3aXNlIHNpbXVsYXRlIGFjY2Vzc29ycyBi
eSBsb29raW5nIHVwIHRoZSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUKKy8vIG9iamVjdC4KIAot
ICB2YXIgdCA9IE9iamVjdCh0aGlzKTsKLSAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwOwotICBp
ZiAodHlwZW9mIGZ1biAhPT0gImZ1bmN0aW9uIikgewotICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
KTsKLSAgfQorLyoqCisgIEdldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0
LiBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0ZWQsCisgIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGlu
dm9rZWQuIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBidXQgdGhlCisgIG9iamVjdCBp
bXBsZW1lbnRzIHRoZSBgdW5rbm93blByb3BlcnR5YCBtZXRob2QgdGhlbiB0aGF0IHdpbGwgYmUg
aW52b2tlZC4KIAotICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbik7Ci0gIHZhciB0aGlzcCA9IGFy
Z3VtZW50c1sxXTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChp
IGluIHQpIHsKLSAgICAgIHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKLSAg
ICB9Ci0gIH0KKyAgSWYgeW91IHBsYW4gdG8gcnVuIG9uIElFOCBhbmQgb2xkZXIgYnJvd3NlcnMg
dGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGlzCisgIG1ldGhvZCBhbnl0aW1lIHlvdSB3YW50IHRvIHJl
dHJpZXZlIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0CisgIGtub3cgZm9y
IHN1cmUgaXMgcHJpdmF0ZS4gKFByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29y
ZSAnXycKKyAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4pCiAKLSAgcmV0dXJuIHJlczsKLX07Cisg
IE9uIGFsbCBuZXdlciBicm93c2VycywgeW91IG9ubHkgbmVlZCB0byB1c2UgdGhpcyBtZXRob2Qg
dG8gcmV0cmlldmUKKyAgcHJvcGVydGllcyBpZiB0aGUgcHJvcGVydHkgbWlnaHQgbm90IGJlIGRl
ZmluZWQgb24gdGhlIG9iamVjdCBhbmQgeW91IHdhbnQKKyAgdG8gcmVzcGVjdCB0aGUgYHVua25v
d25Qcm9wZXJ0eWAgaGFuZGxlci4gT3RoZXJ3aXNlIHlvdSBjYW4gaWdub3JlIHRoaXMKKyAgbWV0
aG9kLgogCi0vLyBGcm9tOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2Ny
aXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JlYWNoCi12YXIgYXJyYXlGb3JF
YWNoID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSA/IEFycmF5LnByb3Rv
dHlwZS5mb3JFYWNoIDogZnVuY3Rpb24oZnVuIC8qLCB0aGlzcCAqLykgewotICAvLyJ1c2Ugc3Ry
aWN0IjsKKyAgTm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRlZmluZWRgLCB0
aGlzIG1ldGhvZCB3aWxsIHRocm93CisgIGFuIGVycm9yLgogCi0gIGlmICh0aGlzID09PSB2b2lk
IDAgfHwgdGhpcyA9PT0gbnVsbCkgewotICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKKyAgQG1l
dGhvZCBnZXQKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qg
dG8gcmV0cmlldmUgZnJvbS4KKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5
IGtleSB0byByZXRyaWV2ZQorICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBv
ciBgbnVsbGAuCisqLworZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iaiwga2V5TmFtZSkgeworICAvLyBI
ZWxwZXJzIHRoYXQgb3BlcmF0ZSB3aXRoICd0aGlzJyB3aXRoaW4gYW4gI2VhY2gKKyAgaWYgKGtl
eU5hbWUgPT09ICcnKSB7CisgICAgcmV0dXJuIG9iajsKICAgfQogCi0gIHZhciB0ID0gT2JqZWN0
KHRoaXMpOwotICB2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7Ci0gIGlmICh0eXBlb2YgZnVuICE9
PSAiZnVuY3Rpb24iKSB7Ci0gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOworICBpZiAoIWtleU5h
bWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2JqKSB7CisgICAga2V5TmFtZSA9IG9iajsKKyAgICBv
YmogPSBudWxsOwogICB9CiAKLSAgdmFyIHRoaXNwID0gYXJndW1lbnRzWzFdOwotICBmb3IgKHZh
ciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgaWYgKGkgaW4gdCkgewotICAgICAgZnVuLmNh
bGwodGhpc3AsIHRbaV0sIGksIHQpOwotICAgIH0KLSAgfQotfTsKKyAgRW1iZXIuYXNzZXJ0KCJD
YW5ub3QgY2FsbCBnZXQgd2l0aCAiKyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5hbWUpOworICBF
bWJlci5hc3NlcnQoIkNhbm5vdCBjYWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsiJyBvbiBhbiB1
bmRlZmluZWQgb2JqZWN0LiIsIG9iaiAhPT0gdW5kZWZpbmVkKTsKIAotdmFyIGFycmF5SW5kZXhP
ZiA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgPyBBcnJheS5wcm90b3R5
cGUuaW5kZXhPZiA6IGZ1bmN0aW9uIChvYmosIGZyb21JbmRleCkgewotICBpZiAoZnJvbUluZGV4
ID09PSBudWxsIHx8IGZyb21JbmRleCA9PT0gdW5kZWZpbmVkKSB7IGZyb21JbmRleCA9IDA7IH0K
LSAgZWxzZSBpZiAoZnJvbUluZGV4IDwgMCkgeyBmcm9tSW5kZXggPSBNYXRoLm1heCgwLCB0aGlz
Lmxlbmd0aCArIGZyb21JbmRleCk7IH0KLSAgZm9yICh2YXIgaSA9IGZyb21JbmRleCwgaiA9IHRo
aXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7Ci0gICAgaWYgKHRoaXNbaV0gPT09IG9iaikgeyByZXR1
cm4gaTsgfQorICBpZiAob2JqID09PSBudWxsIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAt
MSkgeworICAgIHJldHVybiBnZXRQYXRoKG9iaiwga2V5TmFtZSk7CiAgIH0KLSAgcmV0dXJuIC0x
OwotfTsKIAotRW1iZXIuQXJyYXlQb2x5ZmlsbHMgPSB7Ci0gIG1hcDogYXJyYXlNYXAsCi0gIGZv
ckVhY2g6IGFycmF5Rm9yRWFjaCwKLSAgaW5kZXhPZjogYXJyYXlJbmRleE9mCi19OworICB2YXIg
bWV0YSA9IG9ialtNRVRBX0tFWV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nba2V5TmFtZV0s
IHJldDsKKyAgaWYgKGRlc2MpIHsKKyAgICByZXR1cm4gZGVzYy5nZXQob2JqLCBrZXlOYW1lKTsK
KyAgfSBlbHNlIHsKKyAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBtZXRhICYmIG1ldGEud2F0
Y2hpbmdba2V5TmFtZV0gPiAwKSB7CisgICAgICByZXQgPSBtZXRhLnZhbHVlc1trZXlOYW1lXTsK
KyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gb2JqW2tleU5hbWVdOworICAgIH0KIAotaWYgKEVt
YmVyLlNISU1fRVM1KSB7Ci0gIGlmICghQXJyYXkucHJvdG90eXBlLm1hcCkgewotICAgIEFycmF5
LnByb3RvdHlwZS5tYXAgPSBhcnJheU1hcDsKLSAgfQorICAgIGlmIChyZXQgPT09IHVuZGVmaW5l
ZCAmJgorICAgICAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4gb2Jq
KSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnVua25vd25Qcm9wZXJ0eSkgeworICAgICAg
cmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7CisgICAgfQogCi0gIGlmICghQXJy
YXkucHJvdG90eXBlLmZvckVhY2gpIHsKLSAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGFy
cmF5Rm9yRWFjaDsKKyAgICByZXR1cm4gcmV0OwogICB9Cit9OwogCi0gIGlmICghQXJyYXkucHJv
dG90eXBlLmluZGV4T2YpIHsKLSAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGFycmF5SW5k
ZXhPZjsKLSAgfQorLy8gQ3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRlc3RzCitp
ZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKSB7CisgIEVtYmVyLmdldCA9IGdldDsK
KyAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7CisgIGdldCA9IEVtYmVyLmdldDsK
IH0KIAotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKIC8qKgotQG1vZHVsZSBlbWJlci1tZXRh
bAotKi8KLQotLyoKLSAgSmF2YVNjcmlwdCAoYmVmb3JlIEVTNikgZG9lcyBub3QgaGF2ZSBhIE1h
cCBpbXBsZW1lbnRhdGlvbi4gT2JqZWN0cywKLSAgd2hpY2ggYXJlIG9mdGVuIHVzZWQgYXMgZGlj
dGlvbmFyaWVzLCBtYXkgb25seSBoYXZlIFN0cmluZ3MgYXMga2V5cy4KLQotICBCZWNhdXNlIEVt
YmVyIGhhcyBhIHdheSB0byBnZXQgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZXZlcnkgb2JqZWN0
Ci0gIHZpYSBgRW1iZXIuZ3VpZEZvcmAsIHdlIGNhbiBpbXBsZW1lbnQgYSBwZXJmb3JtYW50IE1h
cCB3aXRoIGFyYml0cmFyeQotICBrZXlzLiBCZWNhdXNlIGl0IGlzIGNvbW1vbmx5IHVzZWQgaW4g
bG93LWxldmVsIGJvb2trZWVwaW5nLCBNYXAgaXMKLSAgaW1wbGVtZW50ZWQgYXMgYSBwdXJlIEph
dmFTY3JpcHQgb2JqZWN0IGZvciBwZXJmb3JtYW5jZS4KLQotICBUaGlzIGltcGxlbWVudGF0aW9u
IGZvbGxvd3MgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIG9mIHRoZSBFUzYgcHJvcG9zYWwgZm9yCi0g
IG1hcHMgKGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWhhcm1vbnk6c2lt
cGxlX21hcHNfYW5kX3NldHMpLAotICB3aXRoIHR3byBleGNlcHRpb25zLiBGaXJzdCwgYmVjYXVz
ZSB3ZSBuZWVkIG91ciBpbXBsZW1lbnRhdGlvbiB0byBiZSBwbGVhc2FudAotICBvbiBvbGRlciBi
cm93c2Vycywgd2UgZG8gbm90IHVzZSB0aGUgYGRlbGV0ZWAgbmFtZSAodXNpbmcgYHJlbW92ZWAg
aW5zdGVhZCkuCi0gIFNlY29uZCwgYXMgd2UgZG8gbm90IGhhdmUgdGhlIGx1eHVyeSBvZiBpbi1W
TSBpdGVyYXRpb24sIHdlIGltcGxlbWVudCBhCi0gIGZvckVhY2ggbWV0aG9kIGZvciBpdGVyYXRp
b24uCisgIE5vcm1hbGl6ZXMgYSB0YXJnZXQvcGF0aCBwYWlyIHRvIHJlZmxlY3QgdGhhdCBhY3R1
YWwgdGFyZ2V0L3BhdGggdGhhdCBzaG91bGQKKyAgYmUgb2JzZXJ2ZWQsIGV0Yy4gVGhpcyB0YWtl
cyBpbnRvIGFjY291bnQgcGFzc2luZyBpbiBnbG9iYWwgcHJvcGVydHkKKyAgcGF0aHMgKGkuZS4g
YSBwYXRoIGJlZ2lubmluZyB3aXRoIGEgY2FwdGlhbCBsZXR0ZXIgbm90IGRlZmluZWQgb24gdGhl
CisgIHRhcmdldCkgYW5kICogc2VwYXJhdG9ycy4KIAotICBNYXAgaXMgbW9ja2VkIG91dCB0byBs
b29rIGxpa2UgYW4gRW1iZXIgb2JqZWN0LCBzbyB5b3UgY2FuIGRvCi0gIGBFbWJlci5NYXAuY3Jl
YXRlKClgIGZvciBzeW1tZXRyeSB3aXRoIG90aGVyIEVtYmVyIGNsYXNzZXMuCisgIEBwcml2YXRl
CisgIEBtZXRob2Qgbm9ybWFsaXplVHVwbGUKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVj
dH0gdGFyZ2V0IFRoZSBjdXJyZW50IHRhcmdldC4gTWF5IGJlIGBudWxsYC4KKyAgQHBhcmFtIHtT
dHJpbmd9IHBhdGggQSBwYXRoIG9uIHRoZSB0YXJnZXQgb3IgYSBnbG9iYWwgcHJvcGVydHkgcGF0
aC4KKyAgQHJldHVybiB7QXJyYXl9IGEgdGVtcG9yYXJ5IGFycmF5IHdpdGggdGhlIG5vcm1hbGl6
ZWQgdGFyZ2V0L3BhdGggcGFpci4KICovCi12YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0g
ICAgaW5kZXhPZiA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmluZGV4T2Y7Cit2YXIgbm9ybWFsaXpl
VHVwbGUgPSBFbWJlci5ub3JtYWxpemVUdXBsZSA9IGZ1bmN0aW9uKHRhcmdldCwgcGF0aCkgewor
ICB2YXIgaGFzVGhpcyAgPSBIQVNfVEhJUy50ZXN0KHBhdGgpLAorICAgICAgaXNHbG9iYWwgPSAh
aGFzVGhpcyAmJiBJU19HTE9CQUxfUEFUSC50ZXN0KHBhdGgpLAorICAgICAga2V5OwogCi12YXIg
Y29weSA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgb3V0cHV0ID0ge307CisgIGlmICghdGFyZ2V0
IHx8IGlzR2xvYmFsKSB0YXJnZXQgPSBFbWJlci5sb29rdXA7CisgIGlmIChoYXNUaGlzKSBwYXRo
ID0gcGF0aC5zbGljZSg1KTsKIAotICBmb3IgKHZhciBwcm9wIGluIG9iaikgewotICAgIGlmIChv
YmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsgb3V0cHV0W3Byb3BdID0gb2JqW3Byb3BdOyB9Cisg
IGlmICh0YXJnZXQgPT09IEVtYmVyLmxvb2t1cCkgeworICAgIGtleSA9IHBhdGgubWF0Y2goRklS
U1RfS0VZKVswXTsKKyAgICB0YXJnZXQgPSBnZXQodGFyZ2V0LCBrZXkpOworICAgIHBhdGggICA9
IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKICAgfQogCi0gIHJldHVybiBvdXRwdXQ7CisgIC8v
IG11c3QgcmV0dXJuIHNvbWUga2luZCBvZiBwYXRoIHRvIGJlIHZhbGlkIGVsc2Ugb3RoZXIgdGhp
bmdzIHdpbGwgYnJlYWsuCisgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aD09PTApIHRocm93IG5l
dyBFbWJlci5FcnJvcignSW52YWxpZCBQYXRoJyk7CisKKyAgcmV0dXJuIFsgdGFyZ2V0LCBwYXRo
IF07CiB9OwogCi12YXIgY29weU1hcCA9IGZ1bmN0aW9uKG9yaWdpbmFsLCBuZXdPYmplY3QpIHsK
LSAgdmFyIGtleXMgPSBvcmlnaW5hbC5rZXlzLmNvcHkoKSwKLSAgICAgIHZhbHVlcyA9IGNvcHko
b3JpZ2luYWwudmFsdWVzKTsKK3ZhciBnZXRQYXRoID0gRW1iZXIuX2dldFBhdGggPSBmdW5jdGlv
bihyb290LCBwYXRoKSB7CisgIHZhciBoYXNUaGlzLCBwYXJ0cywgdHVwbGUsIGlkeCwgbGVuOwog
Ci0gIG5ld09iamVjdC5rZXlzID0ga2V5czsKLSAgbmV3T2JqZWN0LnZhbHVlcyA9IHZhbHVlczsK
KyAgLy8gSWYgdGhlcmUgaXMgbm8gcm9vdCBhbmQgcGF0aCBpcyBhIGtleSBuYW1lLCByZXR1cm4g
dGhhdAorICAvLyBwcm9wZXJ0eSBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LgorICAvLyBFLmcuIGdl
dCgnRW1iZXInKSAtPiBFbWJlcgorICBpZiAocm9vdCA9PT0gbnVsbCAmJiBwYXRoLmluZGV4T2Yo
Jy4nKSA9PT0gLTEpIHsgcmV0dXJuIGdldChFbWJlci5sb29rdXAsIHBhdGgpOyB9CiAKLSAgcmV0
dXJuIG5ld09iamVjdDsKKyAgLy8gZGV0ZWN0IGNvbXBsaWNhdGVkIHBhdGhzIGFuZCBub3JtYWxp
emUgdGhlbQorICBoYXNUaGlzICA9IEhBU19USElTLnRlc3QocGF0aCk7CisKKyAgaWYgKCFyb290
IHx8IGhhc1RoaXMpIHsKKyAgICB0dXBsZSA9IG5vcm1hbGl6ZVR1cGxlKHJvb3QsIHBhdGgpOwor
ICAgIHJvb3QgPSB0dXBsZVswXTsKKyAgICBwYXRoID0gdHVwbGVbMV07CisgICAgdHVwbGUubGVu
Z3RoID0gMDsKKyAgfQorCisgIHBhcnRzID0gcGF0aC5zcGxpdCgiLiIpOworICBsZW4gPSBwYXJ0
cy5sZW5ndGg7CisgIGZvciAoaWR4ID0gMDsgcm9vdCAhPSBudWxsICYmIGlkeCA8IGxlbjsgaWR4
KyspIHsKKyAgICByb290ID0gZ2V0KHJvb3QsIHBhcnRzW2lkeF0sIHRydWUpOworICAgIGlmIChy
b290ICYmIHJvb3QuaXNEZXN0cm95ZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQorICB9CisgIHJl
dHVybiByb290OwogfTsKIAotLyoqCi0gIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5
IEVtYmVyIGFuZCBFbWJlciBEYXRhLgotICBQbGVhc2UgZG8gbm90IHVzZSBpdCBhdCB0aGlzIHRp
bWUuIFdlIHBsYW4gdG8gY2xlYW4gaXQgdXAKLSAgYW5kIGFkZCBtYW55IHRlc3RzIHNvb24uCitF
bWJlci5nZXRXaXRoRGVmYXVsdCA9IGZ1bmN0aW9uKHJvb3QsIGtleSwgZGVmYXVsdFZhbHVlKSB7
CisgIHZhciB2YWx1ZSA9IGdldChyb290LCBrZXkpOwogCi0gIEBjbGFzcyBPcmRlcmVkU2V0Ci0g
IEBuYW1lc3BhY2UgRW1iZXIKLSAgQGNvbnN0cnVjdG9yCi0gIEBwcml2YXRlCi0qLwotdmFyIE9y
ZGVyZWRTZXQgPSBFbWJlci5PcmRlcmVkU2V0ID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMuY2xlYXIo
KTsKKyAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRlZmF1bHRWYWx1ZTsgfQor
ICByZXR1cm4gdmFsdWU7CiB9OwogCisKK0VtYmVyLmdldCA9IGdldDsKKworfSkoKTsKKworCisK
KyhmdW5jdGlvbigpIHsKIC8qKgotICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0gIEByZXR1
cm4ge0VtYmVyLk9yZGVyZWRTZXR9CitAbW9kdWxlIGVtYmVyLW1ldGFsCiAqLwotT3JkZXJlZFNl
dC5jcmVhdGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIG5ldyBPcmRlcmVkU2V0KCk7Ci19Owog
Cit2YXIgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCisgICAgbWV0YUZvciA9IEVtYmVyLm1ldGEs
CisgICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwKKyAgICBhX3NsaWNlID0gW10uc2xpY2Us
CisgICAgLyogbGlzdGVuZXIgZmxhZ3MgKi8KKyAgICBPTkNFID0gMSwgU1VTUEVOREVEID0gMjsK
IAotT3JkZXJlZFNldC5wcm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIEBtZXRob2QgY2xlYXIKLSAg
Ki8KLSAgY2xlYXI6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucHJlc2VuY2VTZXQgPSB7fTsKLSAg
ICB0aGlzLmxpc3QgPSBbXTsKLSAgfSwKKy8qCisgIFRoZSBldmVudCBzeXN0ZW0gdXNlcyBhIHNl
cmllcyBvZiBuZXN0ZWQgaGFzaGVzIHRvIHN0b3JlIGxpc3RlbmVycyBvbiBhbgorICBvYmplY3Qu
IFdoZW4gYSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50IGFycml2ZXMs
IHRoZXNlCisgIGhhc2hlcyBhcmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGljaCB0YXJnZXQg
YW5kIGFjdGlvbiBwYWlyIHRvIGludm9rZS4KIAotICAvKioKLSAgICBAbWV0aG9kIGFkZAotICAg
IEBwYXJhbSBvYmoKLSAgKi8KLSAgYWRkOiBmdW5jdGlvbihvYmopIHsKLSAgICB2YXIgZ3VpZCA9
IGd1aWRGb3Iob2JqKSwKLSAgICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0LAot
ICAgICAgICBsaXN0ID0gdGhpcy5saXN0OworICBUaGUgaGFzaGVzIGFyZSBzdG9yZWQgaW4gdGhl
IG9iamVjdCdzIG1ldGEgaGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgogCi0gICAgaWYgKGd1aWQg
aW4gcHJlc2VuY2VTZXQpIHsgcmV0dXJuOyB9CisgICAgICAvLyBPYmplY3QncyBtZXRhIGhhc2gK
KyAgICAgIHsKKyAgICAgICAgbGlzdGVuZXJzOiB7ICAgICAgIC8vIHZhcmlhYmxlIG5hbWU6IGBs
aXN0ZW5lclNldGAKKyAgICAgICAgICAiZm9vOmNoYW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5hbWU6
IGBhY3Rpb25zYAorICAgICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGZsYWdzCisgICAgICAgICAg
XQorICAgICAgICB9CisgICAgICB9CiAKLSAgICBwcmVzZW5jZVNldFtndWlkXSA9IHRydWU7Ci0g
ICAgbGlzdC5wdXNoKG9iaik7Ci0gIH0sCisqLwogCi0gIC8qKgotICAgIEBtZXRob2QgcmVtb3Zl
Ci0gICAgQHBhcmFtIG9iagotICAqLwotICByZW1vdmU6IGZ1bmN0aW9uKG9iaikgewotICAgIHZh
ciBndWlkID0gZ3VpZEZvcihvYmopLAotICAgICAgICBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2Vu
Y2VTZXQsCi0gICAgICAgIGxpc3QgPSB0aGlzLmxpc3Q7CitmdW5jdGlvbiBpbmRleE9mKGFycmF5
LCB0YXJnZXQsIG1ldGhvZCkgeworICB2YXIgaW5kZXggPSAtMTsKKyAgZm9yICh2YXIgaSA9IDAs
IGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMpIHsKKyAgICBpZiAodGFyZ2V0ID09PSBh
cnJheVtpXSAmJiBtZXRob2QgPT09IGFycmF5W2krMV0pIHsgaW5kZXggPSBpOyBicmVhazsgfQor
ICB9CisgIHJldHVybiBpbmRleDsKK30KIAotICAgIGRlbGV0ZSBwcmVzZW5jZVNldFtndWlkXTsK
K2Z1bmN0aW9uIGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpIHsKKyAgdmFyIG1ldGEgPSBtZXRh
Rm9yKG9iaiwgdHJ1ZSksCisgICAgICBhY3Rpb25zOwogCi0gICAgdmFyIGluZGV4ID0gaW5kZXhP
Zi5jYWxsKGxpc3QsIG9iaik7Ci0gICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgIGxpc3Quc3Bs
aWNlKGluZGV4LCAxKTsKLSAgICB9Ci0gIH0sCisgIGlmICghbWV0YS5saXN0ZW5lcnMpIHsgbWV0
YS5saXN0ZW5lcnMgPSB7fTsgfQogCi0gIC8qKgotICAgIEBtZXRob2QgaXNFbXB0eQotICAgIEBy
ZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGlzRW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biB0aGlzLmxpc3QubGVuZ3RoID09PSAwOwotICB9LAorICBpZiAoIW1ldGEuaGFzT3duUHJvcGVy
dHkoJ2xpc3RlbmVycycpKSB7CisgICAgLy8gc2V0dXAgaW5oZXJpdGVkIGNvcHkgb2YgdGhlIGxp
c3RlbmVycyBvYmplY3QKKyAgICBtZXRhLmxpc3RlbmVycyA9IG9fY3JlYXRlKG1ldGEubGlzdGVu
ZXJzKTsKKyAgfQogCi0gIC8qKgotICAgIEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIG9iagotICAg
IEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhczogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFy
IGd1aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5j
ZVNldDsKKyAgYWN0aW9ucyA9IG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07CiAKLSAgICByZXR1
cm4gZ3VpZCBpbiBwcmVzZW5jZVNldDsKLSAgfSwKKyAgLy8gaWYgdGhlcmUgYXJlIGFjdGlvbnMs
IGJ1dCB0aGUgZXZlbnROYW1lIGRvZXNuJ3QgZXhpc3QgaW4gb3VyIGxpc3RlbmVycywgdGhlbiBj
b3B5IHRoZW0gZnJvbSB0aGUgcHJvdG90eXBlCisgIGlmIChhY3Rpb25zICYmICFtZXRhLmxpc3Rl
bmVycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CisgICAgYWN0aW9ucyA9IG1ldGEubGlz
dGVuZXJzW2V2ZW50TmFtZV0gPSBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdLnNsaWNlKCk7Cisg
IH0gZWxzZSBpZiAoIWFjdGlvbnMpIHsKKyAgICBhY3Rpb25zID0gbWV0YS5saXN0ZW5lcnNbZXZl
bnROYW1lXSA9IFtdOworICB9CiAKLSAgLyoqCi0gICAgQG1ldGhvZCBmb3JFYWNoCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gZnVuY3Rpb24KLSAgICBAcGFyYW0gdGFyZ2V0Ci0gICovCi0gIGZvckVh
Y2g6IGZ1bmN0aW9uKGZuLCBzZWxmKSB7Ci0gICAgLy8gYWxsb3cgbXV0YXRpb24gZHVyaW5nIGl0
ZXJhdGlvbgotICAgIHZhciBsaXN0ID0gdGhpcy5saXN0LnNsaWNlKCk7CisgIHJldHVybiBhY3Rp
b25zOworfQogCi0gICAgZm9yICh2YXIgaSA9IDAsIGogPSBsaXN0Lmxlbmd0aDsgaSA8IGo7IGkr
KykgewotICAgICAgZm4uY2FsbChzZWxmLCBsaXN0W2ldKTsKK2Z1bmN0aW9uIGFjdGlvbnNVbmlv
bihvYmosIGV2ZW50TmFtZSwgb3RoZXJBY3Rpb25zKSB7CisgIHZhciBtZXRhID0gb2JqW01FVEFf
S0VZXSwKKyAgICAgIGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlz
dGVuZXJzW2V2ZW50TmFtZV07CisKKyAgaWYgKCFhY3Rpb25zKSB7IHJldHVybjsgfQorICBmb3Ig
KHZhciBpID0gYWN0aW9ucy5sZW5ndGggLSAzOyBpID49IDA7IGkgLT0gMykgeworICAgIHZhciB0
YXJnZXQgPSBhY3Rpb25zW2ldLAorICAgICAgICBtZXRob2QgPSBhY3Rpb25zW2krMV0sCisgICAg
ICAgIGZsYWdzID0gYWN0aW9uc1tpKzJdLAorICAgICAgICBhY3Rpb25JbmRleCA9IGluZGV4T2Yo
b3RoZXJBY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7CisKKyAgICBpZiAoYWN0aW9uSW5kZXggPT09
IC0xKSB7CisgICAgICBvdGhlckFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3MpOwog
ICAgIH0KLSAgfSwKKyAgfQorfQogCi0gIC8qKgotICAgIEBtZXRob2QgdG9BcnJheQotICAgIEBy
ZXR1cm4ge0FycmF5fQotICAqLwotICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy5saXN0LnNsaWNlKCk7Ci0gIH0sCitmdW5jdGlvbiBhY3Rpb25zRGlmZihvYmosIGV2ZW50
TmFtZSwgb3RoZXJBY3Rpb25zKSB7CisgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwKKyAgICAg
IGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50
TmFtZV0sCisgICAgICBkaWZmQWN0aW9ucyA9IFtdOwogCi0gIC8qKgotICAgIEBtZXRob2QgY29w
eQotICAgIEByZXR1cm4ge0VtYmVyLk9yZGVyZWRTZXR9Ci0gICovCi0gIGNvcHk6IGZ1bmN0aW9u
KCkgewotICAgIHZhciBzZXQgPSBuZXcgT3JkZXJlZFNldCgpOworICBpZiAoIWFjdGlvbnMpIHsg
cmV0dXJuOyB9CisgIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAt
PSAzKSB7CisgICAgdmFyIHRhcmdldCA9IGFjdGlvbnNbaV0sCisgICAgICAgIG1ldGhvZCA9IGFj
dGlvbnNbaSsxXSwKKyAgICAgICAgZmxhZ3MgPSBhY3Rpb25zW2krMl0sCisgICAgICAgIGFjdGlv
bkluZGV4ID0gaW5kZXhPZihvdGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKIAotICAgIHNl
dC5wcmVzZW5jZVNldCA9IGNvcHkodGhpcy5wcmVzZW5jZVNldCk7Ci0gICAgc2V0Lmxpc3QgPSB0
aGlzLmxpc3Quc2xpY2UoKTsKKyAgICBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7IGNvbnRpbnVl
OyB9CiAKLSAgICByZXR1cm4gc2V0OworICAgIG90aGVyQWN0aW9ucy5wdXNoKHRhcmdldCwgbWV0
aG9kLCBmbGFncyk7CisgICAgZGlmZkFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3Mp
OwogICB9Ci19OworCisgIHJldHVybiBkaWZmQWN0aW9uczsKK30KIAogLyoqCi0gIEEgTWFwIHN0
b3JlcyB2YWx1ZXMgaW5kZXhlZCBieSBrZXlzLiBVbmxpa2UgSmF2YVNjcmlwdCdzCi0gIGRlZmF1
bHQgT2JqZWN0cywgdGhlIGtleXMgb2YgYSBNYXAgY2FuIGJlIGFueSBKYXZhU2NyaXB0Ci0gIG9i
amVjdC4KKyAgQWRkIGFuIGV2ZW50IGxpc3RlbmVyCiAKLSAgSW50ZXJuYWxseSwgYSBNYXAgaGFz
IHR3byBkYXRhIHN0cnVjdHVyZXM6CisgIEBtZXRob2QgYWRkTGlzdGVuZXIKKyAgQGZvciBFbWJl
cgorICBAcGFyYW0gb2JqCisgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgQHBhcmFtIHtP
YmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kIEEgdGFyZ2V0IG9iamVjdCBvciBhIGZ1bmN0
aW9uCisgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBmdW5jdGlvbiBvciB0aGUg
bmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0YAorICBAcGFyYW0ge0Jv
b2xlYW59IG9uY2UgQSBmbGFnIHdoZXRoZXIgYSBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxs
ZWQgb25jZQorKi8KK2Z1bmN0aW9uIGFkZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQs
IG1ldGhvZCwgb25jZSkgeworICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgYXQgbGVhc3Qg
YW4gb2JqZWN0IGFuZCBldmVudCBuYW1lIHRvIEVtYmVyLmFkZExpc3RlbmVyIiwgISFvYmogJiYg
ISFldmVudE5hbWUpOwogCi0gIDEuIGBrZXlzYDogYW4gT3JkZXJlZFNldCBvZiBhbGwgb2YgdGhl
IGV4aXN0aW5nIGtleXMKLSAgMi4gYHZhbHVlc2A6IGEgSmF2YVNjcmlwdCBPYmplY3QgaW5kZXhl
ZCBieSB0aGUgYEVtYmVyLmd1aWRGb3Ioa2V5KWAKKyAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9u
JyA9PT0gdHlwZW9mIHRhcmdldCkgeworICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICB0YXJnZXQg
PSBudWxsOworICB9CiAKLSAgV2hlbiBhIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIGZvciB0aGUg
Zmlyc3QgdGltZSwgd2UKLSAgYWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBPcmRlcmVkU2V0LCBh
bmQgY3JlYXRlIG9yCi0gIHJlcGxhY2UgYW4gZW50cnkgaW4gYHZhbHVlc2AuIFdoZW4gYW4gZW50
cnkgaXMgZGVsZXRlZCwKLSAgd2UgZGVsZXRlIGl0cyBlbnRyeSBpbiBga2V5c2AgYW5kIGB2YWx1
ZXNgLgorICB2YXIgYWN0aW9ucyA9IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpLAorICAgICAg
YWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKSwKKyAgICAgIGZs
YWdzID0gMDsKIAotICBAY2xhc3MgTWFwCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUK
LSAgQGNvbnN0cnVjdG9yCi0qLwotdmFyIE1hcCA9IEVtYmVyLk1hcCA9IGZ1bmN0aW9uKCkgewot
ICB0aGlzLmtleXMgPSBFbWJlci5PcmRlcmVkU2V0LmNyZWF0ZSgpOwotICB0aGlzLnZhbHVlcyA9
IHt9OwotfTsKKyAgaWYgKG9uY2UpIGZsYWdzIHw9IE9OQ0U7CiAKLS8qKgotICBAbWV0aG9kIGNy
ZWF0ZQotICBAc3RhdGljCi0qLwotTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4g
bmV3IE1hcCgpOwotfTsKKyAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgeyByZXR1cm47IH0KIAot
TWFwLnByb3RvdHlwZSA9IHsKLSAgLyoqCi0gICAgUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCBhIGdpdmVuIGtleS4KKyAgYWN0aW9ucy5wdXNoKHRhcmdldCwgbWV0aG9kLCBmbGFn
cyk7CiAKLSAgICBAbWV0aG9kIGdldAotICAgIEBwYXJhbSB7YW55dGhpbmd9IGtleQotICAgIEBy
ZXR1cm4ge2FueXRoaW5nfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIGB1
bmRlZmluZWRgCi0gICovCi0gIGdldDogZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHZhbHVlcyA9
IHRoaXMudmFsdWVzLAotICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOworICBpZiAoJ2Z1bmN0
aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRBZGRMaXN0ZW5lcikgeworICAgIG9iai5kaWRBZGRMaXN0
ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgfQorfQogCi0gICAgcmV0dXJuIHZh
bHVlc1tndWlkXTsKLSAgfSwKKy8qKgorICBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIKIAotICAv
KioKLSAgICBBZGRzIGEgdmFsdWUgdG8gdGhlIG1hcC4gSWYgYSB2YWx1ZSBmb3IgdGhlIGdpdmVu
IGtleSBoYXMgYWxyZWFkeSBiZWVuCi0gICAgcHJvdmlkZWQsIHRoZSBuZXcgdmFsdWUgd2lsbCBy
ZXBsYWNlIHRoZSBvbGQgdmFsdWUuCisgIEFyZ3VtZW50cyBzaG91bGQgbWF0Y2ggdGhvc2UgcGFz
c2VkIHRvIGBFbWJlci5hZGRMaXN0ZW5lcmAuCiAKLSAgICBAbWV0aG9kIHNldAotICAgIEBwYXJh
bSB7YW55dGhpbmd9IGtleQotICAgIEBwYXJhbSB7YW55dGhpbmd9IHZhbHVlCi0gICovCi0gIHNl
dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBrZXlzID0gdGhpcy5rZXlzLAotICAg
ICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsK
KyAgQG1ldGhvZCByZW1vdmVMaXN0ZW5lcgorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoKKyAg
QHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFy
Z2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KKyAgQHBhcmFtIHtGdW5j
dGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24g
dG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisqLworZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIob2Jq
LCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKSB7CisgIEVtYmVyLmFzc2VydCgiWW91IG11c3Qg
cGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIucmVtb3ZlTGlz
dGVuZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7CiAKLSAgICBrZXlzLmFkZChrZXkpOwotICAg
IHZhbHVlc1tndWlkXSA9IHZhbHVlOwotICB9LAorICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24n
ID09PSB0eXBlb2YgdGFyZ2V0KSB7CisgICAgbWV0aG9kID0gdGFyZ2V0OworICAgIHRhcmdldCA9
IG51bGw7CisgIH0KIAotICAvKioKLSAgICBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbWFwIGZv
ciBhbiBhc3NvY2lhdGVkIGtleS4KKyAgZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwg
bWV0aG9kKSB7CisgICAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwK
KyAgICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsK
IAotICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgQHBhcmFtIHthbnl0aGluZ30ga2V5Ci0gICAgQHJl
dHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbiBpdGVtIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndp
c2UKLSAgKi8KLSAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKLSAgICAvLyBkb24ndCB1c2UgRVM2
ICJkZWxldGUiIGJlY2F1c2UgaXQgd2lsbCBiZSBhbm5veWluZwotICAgIC8vIHRvIHVzZSBpbiBi
cm93c2VycyB0aGF0IGFyZSBub3QgRVM2IGZyaWVuZGx5OwotICAgIHZhciBrZXlzID0gdGhpcy5r
ZXlzLAotICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRG
b3Ioa2V5KSwKLSAgICAgICAgdmFsdWU7CisgICAgLy8gYWN0aW9uIGRvZXNuJ3QgZXhpc3QsIGdp
dmUgdXAgc2lsZW50bHkKKyAgICBpZiAoYWN0aW9uSW5kZXggPT09IC0xKSB7IHJldHVybjsgfQog
Ci0gICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgewotICAgICAga2V5cy5yZW1v
dmUoa2V5KTsKLSAgICAgIHZhbHVlID0gdmFsdWVzW2d1aWRdOwotICAgICAgZGVsZXRlIHZhbHVl
c1tndWlkXTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotICB9LAorICAgIGFjdGlvbnMuc3BsaWNlKGFjdGlvbkluZGV4LCAzKTsK
IAotICAvKioKLSAgICBDaGVjayB3aGV0aGVyIGEga2V5IGlzIHByZXNlbnQuCisgICAgaWYgKCdm
dW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkUmVtb3ZlTGlzdGVuZXIpIHsKKyAgICAgIG9iai5k
aWRSZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICB9CisgIH0K
IAotICAgIEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIHthbnl0aGluZ30ga2V5Ci0gICAgQHJldHVy
biB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSB3YXMgcHJlc2VudCwgZmFsc2Ugb3RoZXJ3aXNl
Ci0gICovCi0gIGhhczogZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHZhbHVlcyA9IHRoaXMudmFs
dWVzLAotICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOworICBpZiAobWV0aG9kKSB7CisgICAg
X3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgbWV0
YSA9IG9ialtNRVRBX0tFWV0sCisgICAgICAgIGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVu
ZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07CiAKLSAgICByZXR1cm4gdmFsdWVzLmhh
c093blByb3BlcnR5KGd1aWQpOwotICB9LAorICAgIGlmICghYWN0aW9ucykgeyByZXR1cm47IH0K
KyAgICBmb3IgKHZhciBpID0gYWN0aW9ucy5sZW5ndGggLSAzOyBpID49IDA7IGkgLT0gMykgewor
ICAgICAgX3JlbW92ZUxpc3RlbmVyKGFjdGlvbnNbaV0sIGFjdGlvbnNbaSsxXSk7CisgICAgfQor
ICB9Cit9CiAKLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVyIGFsbCB0aGUga2V5cyBhbmQgdmFsdWVz
LiBDYWxscyB0aGUgZnVuY3Rpb24gb25jZQotICAgIGZvciBlYWNoIGtleSwgcGFzc2luZyBpbiB0
aGUga2V5IGFuZCB2YWx1ZSwgaW4gdGhhdCBvcmRlci4KKy8qKgorICBTdXNwZW5kIGxpc3RlbmVy
IGR1cmluZyBjYWxsYmFjay4KIAotICAgIFRoZSBrZXlzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGl0
ZXJhdGVkIG92ZXIgaW4gaW5zZXJ0aW9uIG9yZGVyLgorICBUaGlzIHNob3VsZCBvbmx5IGJlIHVz
ZWQgYnkgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgbGlzdGVuZXIKKyAgd2hlbiBpdCBpcyB0YWtp
bmcgYW4gYWN0aW9uIHRoYXQgd291bGQgY2F1c2UgdGhlIGV2ZW50LCBlLmcuCisgIGFuIG9iamVj
dCBtaWdodCBzdXNwZW5kIGl0cyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgd2hpbGUgaXQgaXMK
KyAgc2V0dGluZyB0aGF0IHByb3BlcnR5LgogCi0gICAgQG1ldGhvZCBmb3JFYWNoCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcGFyYW0ge2FueXRoaW5nfSBzZWxmIGlmIHBh
c3NlZCwgdGhlIGB0aGlzYCB2YWx1ZSBpbnNpZGUgdGhlCi0gICAgICBjYWxsYmFjay4gQnkgZGVm
YXVsdCwgYHRoaXNgIGlzIHRoZSBtYXAuCi0gICovCi0gIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxi
YWNrLCBzZWxmKSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLmtleXMsCi0gICAgICAgIHZhbHVlcyA9
IHRoaXMudmFsdWVzOworICBAcHJpdmF0ZQorICBAbWV0aG9kIHN1c3BlbmRMaXN0ZW5lcgorICBA
Zm9yIEVtYmVyCisgIEBwYXJhbSBvYmoKKyAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBA
cGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9y
IGEgZnVuY3Rpb24KKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9u
IG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisqLworZnVuY3Rpb24gc3VzcGVuZExpc3RlbmVyKG9i
aiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKKyAgaWYgKCFtZXRob2Qg
JiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgeworICAgIG1ldGhvZCA9IHRhcmdldDsK
KyAgICB0YXJnZXQgPSBudWxsOworICB9CiAKLSAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5
KSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwo
c2VsZiwga2V5LCB2YWx1ZXNbZ3VpZF0pOwotICAgIH0pOwotICB9LAorICB2YXIgYWN0aW9ucyA9
IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpLAorICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9m
KGFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKIAotICAvKioKLSAgICBAbWV0aG9kIGNvcHkKLSAg
ICBAcmV0dXJuIHtFbWJlci5NYXB9Ci0gICovCi0gIGNvcHk6IGZ1bmN0aW9uKCkgewotICAgIHJl
dHVybiBjb3B5TWFwKHRoaXMsIG5ldyBNYXAoKSk7CisgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEp
IHsKKyAgICBhY3Rpb25zW2FjdGlvbkluZGV4KzJdIHw9IFNVU1BFTkRFRDsgLy8gbWFyayB0aGUg
YWN0aW9uIGFzIHN1c3BlbmRlZAogICB9Ci19OworCisgIGZ1bmN0aW9uIHRyeWFibGUoKSAgIHsg
cmV0dXJuIGNhbGxiYWNrLmNhbGwodGFyZ2V0KTsgfQorICBmdW5jdGlvbiBmaW5hbGl6ZXIoKSB7
IGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsgYWN0aW9uc1thY3Rpb25JbmRleCsyXSAmPSB+U1VT
UEVOREVEOyB9IH0KKworICByZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6
ZXIpOworfQogCiAvKioKLSAgQGNsYXNzIE1hcFdpdGhEZWZhdWx0Ci0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQGV4dGVuZHMgRW1iZXIuTWFwCisgIFN1c3BlbmRzIG11bHRpcGxlIGxpc3RlbmVycyBk
dXJpbmcgYSBjYWxsYmFjay4KKwogICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSAgQHBhcmFt
IFtvcHRpb25zXQotICAgIEBwYXJhbSB7YW55dGhpbmd9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV0K
KyAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXJzCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIG9iagor
ICBAcGFyYW0ge0FycmF5fSBldmVudE5hbWUgQXJyYXkgb2YgZXZlbnQgbmFtZXMKKyAgQHBhcmFt
IHtPYmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kIEEgdGFyZ2V0IG9iamVjdCBvciBhIGZ1
bmN0aW9uCisgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBmdW5jdGlvbiBvciB0
aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0YAorICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjawogKi8KLXZhciBNYXBXaXRoRGVmYXVsdCA9IEVtYmVyLk1hcFdp
dGhEZWZhdWx0ID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBNYXAuY2FsbCh0aGlzKTsKLSAgdGhp
cy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTsKLX07CitmdW5jdGlvbiBzdXNw
ZW5kTGlzdGVuZXJzKG9iaiwgZXZlbnROYW1lcywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7
CisgIGlmICghbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICBt
ZXRob2QgPSB0YXJnZXQ7CisgICAgdGFyZ2V0ID0gbnVsbDsKKyAgfQogCi0vKioKLSAgQG1ldGhv
ZCBjcmVhdGUKLSAgQHN0YXRpYwotICBAcGFyYW0gW29wdGlvbnNdCi0gICAgQHBhcmFtIHthbnl0
aGluZ30gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQotICBAcmV0dXJuIHtFbWJlci5NYXBXaXRoRGVm
YXVsdHxFbWJlci5NYXB9IElmIG9wdGlvbnMgYXJlIHBhc3NlZCwgcmV0dXJucyAKLSAgICBgRW1i
ZXIuTWFwV2l0aERlZmF1bHRgIG90aGVyd2lzZSByZXR1cm5zIGBFbWJlci5NYXBgCi0qLwotTWFw
V2l0aERlZmF1bHQuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBpZiAob3B0aW9ucykg
ewotICAgIHJldHVybiBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0g
ICAgcmV0dXJuIG5ldyBNYXAoKTsKKyAgdmFyIHN1c3BlbmRlZEFjdGlvbnMgPSBbXSwKKyAgICAg
IGFjdGlvbnNMaXN0ID0gW10sCisgICAgICBldmVudE5hbWUsIGFjdGlvbnMsIGksIGw7CisKKyAg
Zm9yIChpPTAsIGw9ZXZlbnROYW1lcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgZXZlbnROYW1l
ID0gZXZlbnROYW1lc1tpXTsKKyAgICBhY3Rpb25zID0gYWN0aW9uc0ZvcihvYmosIGV2ZW50TmFt
ZSk7CisgICAgdmFyIGFjdGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhv
ZCk7CisKKyAgICBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7CisgICAgICBhY3Rpb25zW2FjdGlv
bkluZGV4KzJdIHw9IFNVU1BFTkRFRDsKKyAgICAgIHN1c3BlbmRlZEFjdGlvbnMucHVzaChhY3Rp
b25JbmRleCk7CisgICAgICBhY3Rpb25zTGlzdC5wdXNoKGFjdGlvbnMpOworICAgIH0KICAgfQot
fTsKIAotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKE1hcC5wcm90b3R5
cGUpOworICBmdW5jdGlvbiB0cnlhYmxlKCkgeyByZXR1cm4gY2FsbGJhY2suY2FsbCh0YXJnZXQp
OyB9CisKKyAgZnVuY3Rpb24gZmluYWxpemVyKCkgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0g
c3VzcGVuZGVkQWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHZhciBhY3Rpb25J
bmRleCA9IHN1c3BlbmRlZEFjdGlvbnNbaV07CisgICAgICBhY3Rpb25zTGlzdFtpXVthY3Rpb25J
bmRleCsyXSAmPSB+U1VTUEVOREVEOworICAgIH0KKyAgfQorCisgIHJldHVybiBFbWJlci50cnlG
aW5hbGx5KHRyeWFibGUsIGZpbmFsaXplcik7Cit9CiAKIC8qKgotICBSZXRyaWV2ZSB0aGUgdmFs
dWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LgorICBSZXR1cm4gYSBsaXN0IG9mIGN1cnJl
bnRseSB3YXRjaGVkIGV2ZW50cwogCi0gIEBtZXRob2QgZ2V0Ci0gIEBwYXJhbSB7YW55dGhpbmd9
IGtleQotICBAcmV0dXJuIHthbnl0aGluZ30gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUg
a2V5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQorICBAcHJpdmF0ZQorICBAbWV0aG9kIHdhdGNoZWRF
dmVudHMKKyAgQGZvciBFbWJlcgorICBAcGFyYW0gb2JqCiAqLwotTWFwV2l0aERlZmF1bHQucHJv
dG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkgewotICB2YXIgaGFzVmFsdWUgPSB0aGlzLmhhcyhr
ZXkpOworZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsKKyAgdmFyIGxpc3RlbmVycyA9IG9i
altNRVRBX0tFWV0ubGlzdGVuZXJzLCByZXQgPSBbXTsKIAotICBpZiAoaGFzVmFsdWUpIHsKLSAg
ICByZXR1cm4gTWFwLnByb3RvdHlwZS5nZXQuY2FsbCh0aGlzLCBrZXkpOwotICB9IGVsc2Ugewot
ICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZShrZXkpOwotICAgIHRoaXMu
c2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICBpZiAo
bGlzdGVuZXJzKSB7CisgICAgZm9yKHZhciBldmVudE5hbWUgaW4gbGlzdGVuZXJzKSB7CisgICAg
ICBpZiAobGlzdGVuZXJzW2V2ZW50TmFtZV0pIHsgcmV0LnB1c2goZXZlbnROYW1lKTsgfQorICAg
IH0KICAgfQotfTsKKyAgcmV0dXJuIHJldDsKK30KIAogLyoqCi0gIEBtZXRob2QgY29weQotICBA
cmV0dXJuIHtFbWJlci5NYXBXaXRoRGVmYXVsdH0KKyAgU2VuZCBhbiBldmVudC4gVGhlIGV4ZWN1
dGlvbiBvZiBzdXNwZW5kZWQgbGlzdGVuZXJzCisgIGlzIHNraXBwZWQsIGFuZCBvbmNlIGxpc3Rl
bmVycyBhcmUgcmVtb3ZlZC4gQSBsaXN0ZW5lciB3aXRob3V0CisgIGEgdGFyZ2V0IGlzIGV4ZWN1
dGVkIG9uIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiBhbiBhcnJheSBvZiBhY3Rpb25zCisgIGlzIG5v
dCBwYXNzZWQsIHRoZSBhY3Rpb25zIHN0b3JlZCBvbiB0aGUgcGFzc2VkIG9iamVjdCBhcmUgaW52
b2tlZC4KKworICBAbWV0aG9kIHNlbmRFdmVudAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoK
KyAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgT3B0
aW9uYWwgcGFyYW1ldGVycyBmb3IgZWFjaCBsaXN0ZW5lci4KKyAgQHBhcmFtIHtBcnJheX0gYWN0
aW9ucyBPcHRpb25hbCBhcnJheSBvZiBhY3Rpb25zIChsaXN0ZW5lcnMpLgorICBAcmV0dXJuIHRy
dWUKICovCi1NYXBXaXRoRGVmYXVsdC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkgewotICBy
ZXR1cm4gY29weU1hcCh0aGlzLCBuZXcgTWFwV2l0aERlZmF1bHQoewotICAgIGRlZmF1bHRWYWx1
ZTogdGhpcy5kZWZhdWx0VmFsdWUKLSAgfSkpOwotfTsKK2Z1bmN0aW9uIHNlbmRFdmVudChvYmos
IGV2ZW50TmFtZSwgcGFyYW1zLCBhY3Rpb25zKSB7CisgIC8vIGZpcnN0IGdpdmUgb2JqZWN0IGEg
Y2hhbmNlIHRvIGhhbmRsZSBpdAorICBpZiAob2JqICE9PSBFbWJlciAmJiAnZnVuY3Rpb24nID09
PSB0eXBlb2Ygb2JqLnNlbmRFdmVudCkgeworICAgIG9iai5zZW5kRXZlbnQoZXZlbnROYW1lLCBw
YXJhbXMpOworICB9CiAKLX0pKCk7CisgIGlmICghYWN0aW9ucykgeworICAgIHZhciBtZXRhID0g
b2JqW01FVEFfS0VZXTsKKyAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBt
ZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOworICB9CiAKKyAgaWYgKCFhY3Rpb25zKSB7IHJldHVy
bjsgfQogCisgIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAz
KSB7IC8vIGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKKyAgICB2YXIgdGFy
Z2V0ID0gYWN0aW9uc1tpXSwgbWV0aG9kID0gYWN0aW9uc1tpKzFdLCBmbGFncyA9IGFjdGlvbnNb
aSsyXTsKKyAgICBpZiAoIW1ldGhvZCkgeyBjb250aW51ZTsgfQorICAgIGlmIChmbGFncyAmIFNV
U1BFTkRFRCkgeyBjb250aW51ZTsgfQorICAgIGlmIChmbGFncyAmIE9OQ0UpIHsgcmVtb3ZlTGlz
dGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsgfQorICAgIGlmICghdGFyZ2V0
KSB7IHRhcmdldCA9IG9iajsgfQorICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1ldGhvZCkg
eyBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsgfQorICAgIGlmIChwYXJhbXMpIHsKKyAgICAgIG1l
dGhvZC5hcHBseSh0YXJnZXQsIHBhcmFtcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1ldGhvZC5j
YWxsKHRhcmdldCk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQogCi0oZnVuY3Rpb24o
KSB7CiAvKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKKyAgQHByaXZhdGUKKyAgQG1ldGhvZCBoYXNM
aXN0ZW5lcnMKKyAgQGZvciBFbWJlcgorICBAcGFyYW0gb2JqCisgIEBwYXJhbSB7U3RyaW5nfSBl
dmVudE5hbWUKICovCitmdW5jdGlvbiBoYXNMaXN0ZW5lcnMob2JqLCBldmVudE5hbWUpIHsKKyAg
dmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAorICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5s
aXN0ZW5lcnMgJiYgbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXTsKIAotdmFyIE1FVEFfS0VZID0g
RW1iZXIuTUVUQV9LRVksIGdldCwgc2V0OworICByZXR1cm4gISEoYWN0aW9ucyAmJiBhY3Rpb25z
Lmxlbmd0aCk7Cit9CiAKLXZhciBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9S
WV9TRVRURVI7CisvKioKKyAgQHByaXZhdGUKKyAgQG1ldGhvZCBsaXN0ZW5lcnNGb3IKKyAgQGZv
ciBFbWJlcgorICBAcGFyYW0gb2JqCisgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyovCitm
dW5jdGlvbiBsaXN0ZW5lcnNGb3Iob2JqLCBldmVudE5hbWUpIHsKKyAgdmFyIHJldCA9IFtdOwor
ICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCisgICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRh
Lmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwogCi12YXIgSVNfR0xPQkFM
ID0gL14oW0EtWiRdfChbMC05XVtBLVokXSkpLzsKLXZhciBJU19HTE9CQUxfUEFUSCA9IC9eKFtB
LVokXXwoWzAtOV1bQS1aJF0pKS4qW1wuXCpdLzsKLXZhciBIQVNfVEhJUyAgPSAvXnRoaXNbXC5c
Kl0vOwotdmFyIEZJUlNUX0tFWSA9IC9eKFteXC5cKl0rKS87CisgIGlmICghYWN0aW9ucykgeyBy
ZXR1cm4gcmV0OyB9CiAKLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEdFVCBBTkQgU0VUCi0vLwotLy8gSWYgd2UgYXJlIG9u
IGEgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIGdldCB1c2UgdGhvc2Uu
Ci0vLyBPdGhlcndpc2Ugc2ltdWxhdGUgYWNjZXNzb3JzIGJ5IGxvb2tpbmcgdXAgdGhlIHByb3Bl
cnR5IGRpcmVjdGx5IG9uIHRoZQotLy8gb2JqZWN0LgorICBmb3IgKHZhciBpID0gMCwgbCA9IGFj
dGlvbnMubGVuZ3RoOyBpIDwgbDsgaSArPSAzKSB7CisgICAgdmFyIHRhcmdldCA9IGFjdGlvbnNb
aV0sCisgICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaSsxXTsKKyAgICByZXQucHVzaChbdGFyZ2V0
LCBtZXRob2RdKTsKKyAgfQogCi0vKioKLSAgR2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBv
biBhbiBvYmplY3QuIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCwKLSAgdGhlIGZ1bmN0aW9u
IHdpbGwgYmUgaW52b2tlZC4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGJ1dCB0aGUK
LSAgb2JqZWN0IGltcGxlbWVudHMgdGhlIGB1bmtub3duUHJvcGVydHlgIG1ldGhvZCB0aGVuIHRo
YXQgd2lsbCBiZSBpbnZva2VkLgorICByZXR1cm4gcmV0OworfQogCi0gIElmIHlvdSBwbGFuIHRv
IHJ1biBvbiBJRTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcwot
ICBtZXRob2QgYW55dGltZSB5b3Ugd2FudCB0byByZXRyaWV2ZSBhIHByb3BlcnR5IG9uIGFuIG9i
amVjdCB0aGF0IHlvdSBkb24ndAotICBrbm93IGZvciBzdXJlIGlzIHByaXZhdGUuIChQcm9wZXJ0
aWVzIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUgJ18nIAotICBhcmUgY29uc2lkZXJlZCBw
cml2YXRlLikKKy8qKgorICBEZWZpbmUgYSBwcm9wZXJ0eSBhcyBhIGZ1bmN0aW9uIHRoYXQgc2hv
dWxkIGJlIGV4ZWN1dGVkIHdoZW4KKyAgYSBzcGVjaWZpZWQgZXZlbnQgb3IgZXZlbnRzIGFyZSB0
cmlnZ2VyZWQuCiAKLSAgT24gYWxsIG5ld2VyIGJyb3dzZXJzLCB5b3Ugb25seSBuZWVkIHRvIHVz
ZSB0aGlzIG1ldGhvZCB0byByZXRyaWV2ZQotICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBt
aWdodCBub3QgYmUgZGVmaW5lZCBvbiB0aGUgb2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNw
ZWN0IHRoZSBgdW5rbm93blByb3BlcnR5YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25v
cmUgdGhpcwotICBtZXRob2QuCiAKLSAgTm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlz
IGB1bmRlZmluZWRgLCB0aGlzIG1ldGhvZCB3aWxsIHRocm93Ci0gIGFuIGVycm9yLgorICBgYGAg
amF2YXNjcmlwdAorICB2YXIgSm9iID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgbG9nQ29t
cGxldGVkOiBFbWJlci5vbignY29tcGxldGVkJywgZnVuY3Rpb24oKXsKKyAgICAgIGNvbnNvbGUu
bG9nKCdKb2IgY29tcGxldGVkIScpOworICAgIH0pCisgIH0pOworICB2YXIgam9iID0gSm9iLmNy
ZWF0ZSgpOworICBFbWJlci5zZW5kRXZlbnQoam9iLCAnY29tcGxldGVkJyk7IC8vIExvZ3MgIkpv
YiBjb21wbGV0ZWQhIgorIGBgYAogCi0gIEBtZXRob2QgZ2V0CisgIEBtZXRob2Qgb24KICAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgZnJv
bS4KLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0byByZXRyaWV2
ZQotICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBgbnVsbGAuCisgIEBw
YXJhbSB7U3RyaW5nfSBldmVudE5hbWVzKgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgIEBy
ZXR1cm4gZnVuYwogKi8KLWdldCA9IGZ1bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKLSAgLy8g
SGVscGVycyB0aGF0IG9wZXJhdGUgd2l0aCAndGhpcycgd2l0aGluIGFuICNlYWNoCi0gIGlmIChr
ZXlOYW1lID09PSAnJykgewotICAgIHJldHVybiBvYmo7Ci0gIH0KK0VtYmVyLm9uID0gZnVuY3Rp
b24oKXsKKyAgdmFyIGZ1bmMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF0sCisgICAg
ICBldmVudHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7CisgIGZ1bmMuX19lbWJl
cl9saXN0ZW5zX18gPSBldmVudHM7CisgIHJldHVybiBmdW5jOworfTsKIAotICBpZiAoIWtleU5h
bWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2JqKSB7Ci0gICAga2V5TmFtZSA9IG9iajsKLSAgICBv
YmogPSBudWxsOwotICB9CitFbWJlci5hZGRMaXN0ZW5lciA9IGFkZExpc3RlbmVyOworRW1iZXIu
cmVtb3ZlTGlzdGVuZXIgPSByZW1vdmVMaXN0ZW5lcjsKK0VtYmVyLl9zdXNwZW5kTGlzdGVuZXIg
PSBzdXNwZW5kTGlzdGVuZXI7CitFbWJlci5fc3VzcGVuZExpc3RlbmVycyA9IHN1c3BlbmRMaXN0
ZW5lcnM7CitFbWJlci5zZW5kRXZlbnQgPSBzZW5kRXZlbnQ7CitFbWJlci5oYXNMaXN0ZW5lcnMg
PSBoYXNMaXN0ZW5lcnM7CitFbWJlci53YXRjaGVkRXZlbnRzID0gd2F0Y2hlZEV2ZW50czsKK0Vt
YmVyLmxpc3RlbmVyc0ZvciA9IGxpc3RlbmVyc0ZvcjsKK0VtYmVyLmxpc3RlbmVyc0RpZmYgPSBh
Y3Rpb25zRGlmZjsKK0VtYmVyLmxpc3RlbmVyc1VuaW9uID0gYWN0aW9uc1VuaW9uOwogCi0gIGlm
ICghb2JqIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgewotICAgIEVtYmVyLmFzc2Vy
dCgiQ2Fubm90IGNhbGwgZ2V0IHdpdGggJyIrIGtleU5hbWUgKyInIG9uIGFuIHVuZGVmaW5lZCBv
YmplY3QuIiwgb2JqICE9PSB1bmRlZmluZWQpOwotICAgIHJldHVybiBnZXRQYXRoKG9iaiwga2V5
TmFtZSk7Ci0gIH0KK30pKCk7CiAKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbmVlZCB0byBwcm92aWRl
IGFuIG9iamVjdCBhbmQga2V5IHRvIGBnZXRgLiIsICEhb2JqICYmIGtleU5hbWUpOwogCi0gIHZh
ciBtZXRhID0gb2JqW01FVEFfS0VZXSwgZGVzYyA9IG1ldGEgJiYgbWV0YS5kZXNjc1trZXlOYW1l
XSwgcmV0OwotICBpZiAoZGVzYykgewotICAgIHJldHVybiBkZXNjLmdldChvYmosIGtleU5hbWUp
OwotICB9IGVsc2UgewotICAgIGlmIChNQU5EQVRPUllfU0VUVEVSICYmIG1ldGEgJiYgbWV0YS53
YXRjaGluZ1trZXlOYW1lXSA+IDApIHsKLSAgICAgIHJldCA9IG1ldGEudmFsdWVzW2tleU5hbWVd
OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSBvYmpba2V5TmFtZV07Ci0gICAgfQogCi0gICAg
aWYgKHJldCA9PT0gdW5kZWZpbmVkICYmCi0gICAgICAgICdvYmplY3QnID09PSB0eXBlb2Ygb2Jq
ICYmICEoa2V5TmFtZSBpbiBvYmopICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmoudW5rbm93
blByb3BlcnR5KSB7Ci0gICAgICByZXR1cm4gb2JqLnVua25vd25Qcm9wZXJ0eShrZXlOYW1lKTsK
LSAgICB9CisoZnVuY3Rpb24oKSB7Cit2YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCisgICAg
c2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50OwogCi0gICAgcmV0dXJuIHJldDsKLSAgfQorLyoK
KyAgdGhpcy5vYnNlcnZlclNldCA9IHsKKyAgICBbc2VuZGVyR3VpZF06IHsgLy8gdmFyaWFibGUg
bmFtZTogYGtleVNldGAKKyAgICAgIFtrZXlOYW1lXTogbGlzdEluZGV4CisgICAgfQorICB9LAor
ICB0aGlzLm9ic2VydmVycyA9IFsKKyAgICB7CisgICAgICBzZW5kZXI6IG9iaiwKKyAgICAgIGtl
eU5hbWU6IGtleU5hbWUsCisgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKKyAgICAgIGxpc3Rl
bmVyczogWworICAgICAgICBbdGFyZ2V0LCBtZXRob2QsIGZsYWdzXQorICAgICAgXQorICAgIH0s
CisgICAgLi4uCisgIF0KKyovCit2YXIgT2JzZXJ2ZXJTZXQgPSBFbWJlci5fT2JzZXJ2ZXJTZXQg
PSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jbGVhcigpOwogfTsKIAotLyoqCi0gIFNldHMgdGhlIHZh
bHVlIG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LCByZXNwZWN0aW5nIGNvbXB1dGVkIHByb3Bl
cnRpZXMKLSAgYW5kIG5vdGlmeWluZyBvYnNlcnZlcnMgYW5kIG90aGVyIGxpc3RlbmVycyBvZiB0
aGUgY2hhbmdlLiBJZiB0aGUKLSAgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgYnV0IHRoZSBvYmpl
Y3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Qcm9wZXJ0eWAKLSAgbWV0aG9kIHRoZW4gdGhhdCB3
aWxsIGJlIGludm9rZWQgYXMgd2VsbC4KLQotICBJZiB5b3UgcGxhbiB0byBydW4gb24gSUU4IGFu
ZCBvbGRlciBicm93c2VycyB0aGVuIHlvdSBzaG91bGQgdXNlIHRoaXMKLSAgbWV0aG9kIGFueXRp
bWUgeW91IHdhbnQgdG8gc2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0
Ci0gIGtub3cgZm9yIHN1cmUgaXMgcHJpdmF0ZS4gKFByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGgg
YW4gdW5kZXJzY29yZSAnXycgCi0gIGFyZSBjb25zaWRlcmVkIHByaXZhdGUuKQotCi0gIE9uIGFs
bCBuZXdlciBicm93c2VycywgeW91IG9ubHkgbmVlZCB0byB1c2UgdGhpcyBtZXRob2QgdG8gc2V0
Ci0gIHByb3BlcnRpZXMgaWYgdGhlIHByb3BlcnR5IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIG9uIHRo
ZSBvYmplY3QgYW5kIHlvdSB3YW50Ci0gIHRvIHJlc3BlY3QgdGhlIGB1bmtub3duUHJvcGVydHlg
IGhhbmRsZXIuIE90aGVyd2lzZSB5b3UgY2FuIGlnbm9yZSB0aGlzCi0gIG1ldGhvZC4KK09ic2Vy
dmVyU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihzZW5kZXIsIGtleU5hbWUsIGV2ZW50TmFt
ZSkgeworICB2YXIgb2JzZXJ2ZXJTZXQgPSB0aGlzLm9ic2VydmVyU2V0LAorICAgICAgb2JzZXJ2
ZXJzID0gdGhpcy5vYnNlcnZlcnMsCisgICAgICBzZW5kZXJHdWlkID0gZ3VpZEZvcihzZW5kZXIp
LAorICAgICAga2V5U2V0ID0gb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0sCisgICAgICBpbmRleDsK
IAotICBAbWV0aG9kIHNldAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl
IG9iamVjdCB0byBtb2RpZnkuCi0gIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0
eSBrZXkgdG8gc2V0Ci0gIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0g
IEByZXR1cm4ge09iamVjdH0gdGhlIHBhc3NlZCB2YWx1ZS4KLSovCi1zZXQgPSBmdW5jdGlvbiBz
ZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSwgdG9sZXJhbnQpIHsKLSAgaWYgKHR5cGVvZiBvYmogPT09
ICdzdHJpbmcnKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJQYXRoICciICsgb2JqICsgIicgbXVzdCBi
ZSBnbG9iYWwgaWYgbm8gb2JqIGlzIGdpdmVuLiIsIElTX0dMT0JBTC50ZXN0KG9iaikpOwotICAg
IHZhbHVlID0ga2V5TmFtZTsKLSAgICBrZXlOYW1lID0gb2JqOwotICAgIG9iaiA9IG51bGw7Cisg
IGlmICgha2V5U2V0KSB7CisgICAgb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0gPSBrZXlTZXQgPSB7
fTsKICAgfQotCi0gIGlmICghb2JqIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgewot
ICAgIHJldHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRvbGVyYW50KTsKKyAgaW5k
ZXggPSBrZXlTZXRba2V5TmFtZV07CisgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7CisgICAg
aW5kZXggPSBvYnNlcnZlcnMucHVzaCh7CisgICAgICBzZW5kZXI6IHNlbmRlciwKKyAgICAgIGtl
eU5hbWU6IGtleU5hbWUsCisgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKKyAgICAgIGxpc3Rl
bmVyczogW10KKyAgICB9KSAtIDE7CisgICAga2V5U2V0W2tleU5hbWVdID0gaW5kZXg7CiAgIH0K
KyAgcmV0dXJuIG9ic2VydmVyc1tpbmRleF0ubGlzdGVuZXJzOworfTsKIAotICBFbWJlci5hc3Nl
cnQoIllvdSBuZWVkIHRvIHByb3ZpZGUgYW4gb2JqZWN0IGFuZCBrZXkgdG8gYHNldGAuIiwgISFv
YmogJiYga2V5TmFtZSAhPT0gdW5kZWZpbmVkKTsKLSAgRW1iZXIuYXNzZXJ0KCdjYWxsaW5nIHNl
dCBvbiBkZXN0cm95ZWQgb2JqZWN0JywgIW9iai5pc0Rlc3Ryb3llZCk7Ci0KLSAgdmFyIG1ldGEg
PSBvYmpbTUVUQV9LRVldLCBkZXNjID0gbWV0YSAmJiBtZXRhLmRlc2NzW2tleU5hbWVdLAotICAg
ICAgaXNVbmtub3duLCBjdXJyZW50VmFsdWU7Ci0gIGlmIChkZXNjKSB7Ci0gICAgZGVzYy5zZXQo
b2JqLCBrZXlOYW1lLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgaXNVbmtub3duID0gJ29iamVj
dCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGluIG9iaik7Ci0KLSAgICAvLyBzZXRVbmtu
b3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlzIGFuIG9iamVjdCwKLSAgICAvLyB0aGUg
cHJvcGVydHkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQotICAgIC8vIGBzZXRVbmtu
b3duUHJvcGVydHlgIG1ldGhvZCBleGlzdHMgb24gdGhlIG9iamVjdAotICAgIGlmIChpc1Vua25v
d24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZXRVbmtub3duUHJvcGVydHkpIHsKLSAg
ICAgIG9iai5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwgdmFsdWUpOwotICAgIH0gZWxzZSBp
ZiAobWV0YSAmJiBtZXRhLndhdGNoaW5nW2tleU5hbWVdID4gMCkgewotICAgICAgaWYgKE1BTkRB
VE9SWV9TRVRURVIpIHsKLSAgICAgICAgY3VycmVudFZhbHVlID0gbWV0YS52YWx1ZXNba2V5TmFt
ZV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJyZW50VmFsdWUgPSBvYmpba2V5TmFtZV07
Ci0gICAgICB9Ci0gICAgICAvLyBvbmx5IHRyaWdnZXIgYSBjaGFuZ2UgaWYgdGhlIHZhbHVlIGhh
cyBjaGFuZ2VkCi0gICAgICBpZiAodmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkgewotICAgICAgICBF
bWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsKLSAgICAgICAgaWYgKE1BTkRB
VE9SWV9TRVRURVIpIHsKLSAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQg
JiYgIShrZXlOYW1lIGluIG9iaikpIHsKLSAgICAgICAgICAgIEVtYmVyLmRlZmluZVByb3BlcnR5
KG9iaiwga2V5TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkgc2V0dGVyCi0g
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGEudmFsdWVzW2tleU5hbWVdID0gdmFs
dWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG9ialtrZXlOYW1l
XSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKG9i
aiwga2V5TmFtZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9ialtrZXlOYW1lXSA9
IHZhbHVlOwotICAgIH0KK09ic2VydmVyU2V0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkg
eworICB2YXIgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMsIGksIGxlbiwgb2JzZXJ2ZXIsIHNl
bmRlcjsKKyAgdGhpcy5jbGVhcigpOworICBmb3IgKGk9MCwgbGVuPW9ic2VydmVycy5sZW5ndGg7
IGkgPCBsZW47ICsraSkgeworICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJzW2ldOworICAgIHNlbmRl
ciA9IG9ic2VydmVyLnNlbmRlcjsKKyAgICBpZiAoc2VuZGVyLmlzRGVzdHJveWluZyB8fCBzZW5k
ZXIuaXNEZXN0cm95ZWQpIHsgY29udGludWU7IH0KKyAgICBzZW5kRXZlbnQoc2VuZGVyLCBvYnNl
cnZlci5ldmVudE5hbWUsIFtzZW5kZXIsIG9ic2VydmVyLmtleU5hbWVdLCBvYnNlcnZlci5saXN0
ZW5lcnMpOwogICB9Ci0gIHJldHVybiB2YWx1ZTsKIH07CiAKLS8vIEN1cnJlbnRseSB1c2VkIG9u
bHkgYnkgRW1iZXIgRGF0YSB0ZXN0cwotaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlkZUFjY2Vzc29y
cykgewotICBFbWJlci5nZXQgPSBnZXQ7Ci0gIEVtYmVyLnNldCA9IHNldDsKLSAgRW1iZXIuY29u
ZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIGdldCA9IEVtYmVyLmdldDsKLSAgc2V0ID0gRW1i
ZXIuc2V0OwotfQotCi1mdW5jdGlvbiBmaXJzdEtleShwYXRoKSB7Ci0gIHJldHVybiBwYXRoLm1h
dGNoKEZJUlNUX0tFWSlbMF07Ci19CitPYnNlcnZlclNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5j
dGlvbigpIHsKKyAgdGhpcy5vYnNlcnZlclNldCA9IHt9OworICB0aGlzLm9ic2VydmVycyA9IFtd
OworfTsKK30pKCk7CiAKLS8vIGFzc3VtZXMgcGF0aCBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQKLWZ1
bmN0aW9uIG5vcm1hbGl6ZVR1cGxlKHRhcmdldCwgcGF0aCkgewotICB2YXIgaGFzVGhpcyAgPSBI
QVNfVEhJUy50ZXN0KHBhdGgpLAotICAgICAgaXNHbG9iYWwgPSAhaGFzVGhpcyAmJiBJU19HTE9C
QUxfUEFUSC50ZXN0KHBhdGgpLAotICAgICAga2V5OwogCi0gIGlmICghdGFyZ2V0IHx8IGlzR2xv
YmFsKSB0YXJnZXQgPSBFbWJlci5sb29rdXA7Ci0gIGlmIChoYXNUaGlzKSBwYXRoID0gcGF0aC5z
bGljZSg1KTsKIAotICBpZiAodGFyZ2V0ID09PSBFbWJlci5sb29rdXApIHsKLSAgICBrZXkgPSBm
aXJzdEtleShwYXRoKTsKLSAgICB0YXJnZXQgPSBnZXQodGFyZ2V0LCBrZXkpOwotICAgIHBhdGgg
ICA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKLSAgfQorKGZ1bmN0aW9uKCkgewordmFyIG1l
dGFGb3IgPSBFbWJlci5tZXRhLAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAorICAgIHRy
eUZpbmFsbHkgPSBFbWJlci50cnlGaW5hbGx5LAorICAgIHNlbmRFdmVudCA9IEVtYmVyLnNlbmRF
dmVudCwKKyAgICBsaXN0ZW5lcnNVbmlvbiA9IEVtYmVyLmxpc3RlbmVyc1VuaW9uLAorICAgIGxp
c3RlbmVyc0RpZmYgPSBFbWJlci5saXN0ZW5lcnNEaWZmLAorICAgIE9ic2VydmVyU2V0ID0gRW1i
ZXIuX09ic2VydmVyU2V0LAorICAgIGJlZm9yZU9ic2VydmVyU2V0ID0gbmV3IE9ic2VydmVyU2V0
KCksCisgICAgb2JzZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2ZXJTZXQoKSwKKyAgICBkZWZlcnJlZCA9
IDA7CiAKLSAgLy8gbXVzdCByZXR1cm4gc29tZSBraW5kIG9mIHBhdGggdG8gYmUgdmFsaWQgZWxz
ZSBvdGhlciB0aGluZ3Mgd2lsbCBicmVhay4KLSAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoPT09
MCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBhdGgnKTsKKy8vIC4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIFBST1BFUlRZIENI
QU5HRVMKKy8vCiAKLSAgcmV0dXJuIFsgdGFyZ2V0LCBwYXRoIF07Ci19CisvKioKKyAgVGhpcyBm
dW5jdGlvbiBpcyBjYWxsZWQganVzdCBiZWZvcmUgYW4gb2JqZWN0IHByb3BlcnR5IGlzIGFib3V0
IHRvIGNoYW5nZS4KKyAgSXQgd2lsbCBub3RpZnkgYW55IGJlZm9yZSBvYnNlcnZlcnMgYW5kIHBy
ZXBhcmUgY2FjaGVzIGFtb25nIG90aGVyIHRoaW5ncy4KIAotZnVuY3Rpb24gZ2V0UGF0aChyb290
LCBwYXRoKSB7Ci0gIHZhciBoYXNUaGlzLCBwYXJ0cywgdHVwbGUsIGlkeCwgbGVuOworICBOb3Jt
YWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBp
ZiBmb3Igc29tZQorICByZWFzb24geW91IGNhbid0IGRpcmVjdGx5IHdhdGNoIGEgcHJvcGVydHkg
eW91IGNhbiBpbnZva2UgdGhpcyBtZXRob2QKKyAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIu
cHJvcGVydHlEaWRDaGFuZ2UoKWAgd2hpY2ggeW91IHNob3VsZCBjYWxsIGp1c3QKKyAgYWZ0ZXIg
dGhlIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMuCiAKLSAgLy8gSWYgdGhlcmUgaXMgbm8gcm9vdCBh
bmQgcGF0aCBpcyBhIGtleSBuYW1lLCByZXR1cm4gdGhhdAotICAvLyBwcm9wZXJ0eSBmcm9tIHRo
ZSBnbG9iYWwgb2JqZWN0LgotICAvLyBFLmcuIGdldCgnRW1iZXInKSAtPiBFbWJlcgotICBpZiAo
cm9vdCA9PT0gbnVsbCAmJiBwYXRoLmluZGV4T2YoJy4nKSA9PT0gLTEpIHsgcmV0dXJuIGdldChF
bWJlci5sb29rdXAsIHBhdGgpOyB9CisgIEBtZXRob2QgcHJvcGVydHlXaWxsQ2hhbmdlCisgIEBm
b3IgRW1iZXIKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3Bl
cnR5IHRoYXQgd2lsbCBjaGFuZ2UKKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3Bl
cnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KKyAgQHJldHVybiB7dm9pZH0KKyov
CitmdW5jdGlvbiBwcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKSB7CisgIHZhciBtID0g
bWV0YUZvcihvYmosIGZhbHNlKSwKKyAgICAgIHdhdGNoaW5nID0gbS53YXRjaGluZ1trZXlOYW1l
XSA+IDAgfHwga2V5TmFtZSA9PT0gJ2xlbmd0aCcsCisgICAgICBwcm90byA9IG0ucHJvdG8sCisg
ICAgICBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsKIAotICAvLyBkZXRlY3QgY29tcGxpY2F0ZWQg
cGF0aHMgYW5kIG5vcm1hbGl6ZSB0aGVtCi0gIGhhc1RoaXMgID0gSEFTX1RISVMudGVzdChwYXRo
KTsKKyAgaWYgKCF3YXRjaGluZykgeyByZXR1cm47IH0KKyAgaWYgKHByb3RvID09PSBvYmopIHsg
cmV0dXJuOyB9CisgIGlmIChkZXNjICYmIGRlc2Mud2lsbENoYW5nZSkgeyBkZXNjLndpbGxDaGFu
Z2Uob2JqLCBrZXlOYW1lKTsgfQorICBkZXBlbmRlbnRLZXlzV2lsbENoYW5nZShvYmosIGtleU5h
bWUsIG0pOworICBjaGFpbnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7CisgIG5vdGlmeUJl
Zm9yZU9ic2VydmVycyhvYmosIGtleU5hbWUpOworfQorRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdl
ID0gcHJvcGVydHlXaWxsQ2hhbmdlOwogCi0gIGlmICghcm9vdCB8fCBoYXNUaGlzKSB7Ci0gICAg
dHVwbGUgPSBub3JtYWxpemVUdXBsZShyb290LCBwYXRoKTsKLSAgICByb290ID0gdHVwbGVbMF07
Ci0gICAgcGF0aCA9IHR1cGxlWzFdOwotICAgIHR1cGxlLmxlbmd0aCA9IDA7Ci0gIH0KKy8qKgor
ICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBo
YXMgY2hhbmdlZC4KKyAgSXQgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyBhbmQgY2xlYXIgY2Fj
aGVzIGFtb25nIG90aGVyIHRoaW5ncy4KIAotICBwYXJ0cyA9IHBhdGguc3BsaXQoIi4iKTsKLSAg
bGVuID0gcGFydHMubGVuZ3RoOwotICBmb3IgKGlkeD0wOyByb290ICYmIGlkeDxsZW47IGlkeCsr
KSB7Ci0gICAgcm9vdCA9IGdldChyb290LCBwYXJ0c1tpZHhdLCB0cnVlKTsKLSAgICBpZiAocm9v
dCAmJiByb290LmlzRGVzdHJveWVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0KLSAgfQotICByZXR1
cm4gcm9vdDsKLX0KKyAgTm9ybWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1l
dGhvZCBkaXJlY3RseSBidXQgaWYgZm9yIHNvbWUKKyAgcmVhc29uIHlvdSBjYW4ndCBkaXJlY3Rs
eSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4gaW52b2tlIHRoaXMgbWV0aG9kCisgIG1hbnVhbGx5
IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSgpYCB3aGljaCB5b3Ugc2hvdWxk
IGNhbGwganVzdAorICBiZWZvcmUgdGhlIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMuCiAKLWZ1bmN0
aW9uIHNldFBhdGgocm9vdCwgcGF0aCwgdmFsdWUsIHRvbGVyYW50KSB7Ci0gIHZhciBrZXlOYW1l
OworICBAbWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdlCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtP
YmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UK
KyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhh
dCB3aWxsIGNoYW5nZS4KKyAgQHJldHVybiB7dm9pZH0KKyovCitmdW5jdGlvbiBwcm9wZXJ0eURp
ZENoYW5nZShvYmosIGtleU5hbWUpIHsKKyAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLAor
ICAgICAgd2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tleU5hbWVdID4gMCB8fCBrZXlOYW1lID09PSAn
bGVuZ3RoJywKKyAgICAgIHByb3RvID0gbS5wcm90bywKKyAgICAgIGRlc2MgPSBtLmRlc2NzW2tl
eU5hbWVdOwogCi0gIC8vIGdldCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRoCi0gIGtleU5hbWUg
PSBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoJy4nKSArIDEpOworICBpZiAocHJvdG8gPT09
IG9iaikgeyByZXR1cm47IH0KIAotICAvLyBnZXQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhcnQK
LSAgcGF0aCAgICA9IHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGgtKGtleU5hbWUubGVuZ3RoKzEp
KTsKKyAgLy8gc2hvdWxkbid0IHRoaXMgbWVhbiB0aGF0IHdlJ3JlIHdhdGNoaW5nIHRoaXMga2V5
PworICBpZiAoZGVzYyAmJiBkZXNjLmRpZENoYW5nZSkgeyBkZXNjLmRpZENoYW5nZShvYmosIGtl
eU5hbWUpOyB9CisgIGlmICghd2F0Y2hpbmcgJiYga2V5TmFtZSAhPT0gJ2xlbmd0aCcpIHsgcmV0
dXJuOyB9CiAKLSAgLy8gdW5sZXNzIHRoZSBwYXRoIGlzIHRoaXMsIGxvb2sgdXAgdGhlIGZpcnN0
IHBhcnQgdG8KLSAgLy8gZ2V0IHRoZSByb290Ci0gIGlmIChwYXRoICE9PSAndGhpcycpIHsKLSAg
ICByb290ID0gZ2V0UGF0aChyb290LCBwYXRoKTsKLSAgfQorICBkZXBlbmRlbnRLZXlzRGlkQ2hh
bmdlKG9iaiwga2V5TmFtZSwgbSk7CisgIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0s
IGZhbHNlKTsKKyAgbm90aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSk7Cit9CitFbWJlci5wcm9w
ZXJ0eURpZENoYW5nZSA9IHByb3BlcnR5RGlkQ2hhbmdlOwogCi0gIGlmICgha2V5TmFtZSB8fCBr
ZXlOYW1lLmxlbmd0aCA9PT0gMCkgewotICAgIHRocm93IG5ldyBFcnJvcignWW91IHBhc3NlZCBh
biBlbXB0eSBwYXRoJyk7Ci0gIH0KK3ZhciBXSUxMX1NFRU4sIERJRF9TRUVOOwogCi0gIGlmICgh
cm9vdCkgewotICAgIGlmICh0b2xlcmFudCkgeyByZXR1cm47IH0KLSAgICBlbHNlIHsgdGhyb3cg
bmV3IEVycm9yKCdPYmplY3QgaW4gcGF0aCAnK3BhdGgrJyBjb3VsZCBub3QgYmUgZm91bmQgb3Ig
d2FzIGRlc3Ryb3llZC4nKTsgfQotICB9CisvLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBp
cyBhYm91dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNhY2hlIG9mIGFueSBkZXBlbmRlbnQga2V5
cyAoYW5kIG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9mIGNoYW5nZXMsIGV0Yy4uLikKK2Z1bmN0
aW9uIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwgZGVwS2V5LCBtZXRhKSB7CisgIGlmIChv
YmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQogCi0gIHJldHVybiBzZXQocm9vdCwga2V5TmFt
ZSwgdmFsdWUpOworICB2YXIgc2VlbiA9IFdJTExfU0VFTiwgdG9wID0gIXNlZW47CisgIGlmICh0
b3ApIHsgc2VlbiA9IFdJTExfU0VFTiA9IHt9OyB9CisgIGl0ZXJEZXBzKHByb3BlcnR5V2lsbENo
YW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOworICBpZiAodG9wKSB7IFdJTExfU0VFTiA9
IG51bGw7IH0KIH0KIAotLyoqCi0gIEBwcml2YXRlCisvLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9w
ZXJ0eSBoYXMganVzdCBjaGFuZ2VkIHRvIHVwZGF0ZSBkZXBlbmRlbnQga2V5cworZnVuY3Rpb24g
ZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRlcEtleSwgbWV0YSkgeworICBpZiAob2JqLmlz
RGVzdHJveWluZykgeyByZXR1cm47IH0KIAotICBOb3JtYWxpemVzIGEgdGFyZ2V0L3BhdGggcGFp
ciB0byByZWZsZWN0IHRoYXQgYWN0dWFsIHRhcmdldC9wYXRoIHRoYXQgc2hvdWxkCi0gIGJlIG9i
c2VydmVkLCBldGMuIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IHBhc3NpbmcgaW4gZ2xvYmFsIHBy
b3BlcnR5Ci0gIHBhdGhzIChpLmUuIGEgcGF0aCBiZWdpbm5pbmcgd2l0aCBhIGNhcHRpYWwgbGV0
dGVyIG5vdCBkZWZpbmVkIG9uIHRoZQotICB0YXJnZXQpIGFuZCAqIHNlcGFyYXRvcnMuCisgIHZh
ciBzZWVuID0gRElEX1NFRU4sIHRvcCA9ICFzZWVuOworICBpZiAodG9wKSB7IHNlZW4gPSBESURf
U0VFTiA9IHt9OyB9CisgIGl0ZXJEZXBzKHByb3BlcnR5RGlkQ2hhbmdlLCBvYmosIGRlcEtleSwg
c2VlbiwgbWV0YSk7CisgIGlmICh0b3ApIHsgRElEX1NFRU4gPSBudWxsOyB9Cit9CiAKLSAgQG1l
dGhvZCBub3JtYWxpemVUdXBsZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSB0YXJn
ZXQgVGhlIGN1cnJlbnQgdGFyZ2V0LiBNYXkgYmUgYG51bGxgLgotICBAcGFyYW0ge1N0cmluZ30g
cGF0aCBBIHBhdGggb24gdGhlIHRhcmdldCBvciBhIGdsb2JhbCBwcm9wZXJ0eSBwYXRoLgotICBA
cmV0dXJuIHtBcnJheX0gYSB0ZW1wb3JhcnkgYXJyYXkgd2l0aCB0aGUgbm9ybWFsaXplZCB0YXJn
ZXQvcGF0aCBwYWlyLgotKi8KLUVtYmVyLm5vcm1hbGl6ZVR1cGxlID0gZnVuY3Rpb24odGFyZ2V0
LCBwYXRoKSB7Ci0gIHJldHVybiBub3JtYWxpemVUdXBsZSh0YXJnZXQsIHBhdGgpOwotfTsKK2Z1
bmN0aW9uIGl0ZXJEZXBzKG1ldGhvZCwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpIHsKKyAgdmFy
IGd1aWQgPSBndWlkRm9yKG9iaik7CisgIGlmICghc2VlbltndWlkXSkgc2VlbltndWlkXSA9IHt9
OworICBpZiAoc2VlbltndWlkXVtkZXBLZXldKSByZXR1cm47CisgIHNlZW5bZ3VpZF1bZGVwS2V5
XSA9IHRydWU7CiAKLUVtYmVyLmdldFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ocm9vdCwga2V5LCBk
ZWZhdWx0VmFsdWUpIHsKLSAgdmFyIHZhbHVlID0gZ2V0KHJvb3QsIGtleSk7CisgIHZhciBkZXBz
ID0gbWV0YS5kZXBzOworICBkZXBzID0gZGVwcyAmJiBkZXBzW2RlcEtleV07CisgIGlmIChkZXBz
KSB7CisgICAgZm9yKHZhciBrZXkgaW4gZGVwcykgeworICAgICAgdmFyIGRlc2MgPSBtZXRhLmRl
c2NzW2tleV07CisgICAgICBpZiAoZGVzYyAmJiBkZXNjLl9zdXNwZW5kZWQgPT09IG9iaikgY29u
dGludWU7CisgICAgICBtZXRob2Qob2JqLCBrZXkpOworICAgIH0KKyAgfQorfQogCi0gIGlmICh2
YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBkZWZhdWx0VmFsdWU7IH0KLSAgcmV0dXJuIHZh
bHVlOwotfTsKK2Z1bmN0aW9uIGNoYWluc1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKSB7Cisg
IGlmICghKG0uaGFzT3duUHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSAmJgorICAgICAgICBtLmNo
YWluV2F0Y2hlcnNba2V5TmFtZV0pKSB7CisgICAgcmV0dXJuOworICB9CiAKKyAgdmFyIG5vZGVz
ID0gbS5jaGFpbldhdGNoZXJzW2tleU5hbWVdLAorICAgICAgZXZlbnRzID0gW10sCisgICAgICBp
LCBsOwogCi1FbWJlci5nZXQgPSBnZXQ7Ci1FbWJlci5nZXRQYXRoID0gRW1iZXIuZGVwcmVjYXRl
RnVuYygnZ2V0UGF0aCBpcyBkZXByZWNhdGVkIHNpbmNlIGdldCBub3cgc3VwcG9ydHMgcGF0aHMn
LCBFbWJlci5nZXQpOworICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKKyAgICBub2Rlc1tpXS53aWxsQ2hhbmdlKGV2ZW50cyk7CisgIH0KIAotRW1iZXIuc2V0ID0g
c2V0OwotRW1iZXIuc2V0UGF0aCA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoJ3NldFBhdGggaXMgZGVw
cmVjYXRlZCBzaW5jZSBzZXQgbm93IHN1cHBvcnRzIHBhdGhzJywgRW1iZXIuc2V0KTsKKyAgZm9y
IChpID0gMCwgbCA9IGV2ZW50cy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKKyAgICBwcm9wZXJ0
eVdpbGxDaGFuZ2UoZXZlbnRzW2ldLCBldmVudHNbaSsxXSk7CisgIH0KK30KIAotLyoqCi0gIEVy
cm9yLXRvbGVyYW50IGZvcm0gb2YgYEVtYmVyLnNldGAuIFdpbGwgbm90IGJsb3cgdXAgaWYgYW55
IHBhcnQgb2YgdGhlCi0gIGNoYWluIGlzIGB1bmRlZmluZWRgLCBgbnVsbGAsIG9yIGRlc3Ryb3ll
ZC4KK2Z1bmN0aW9uIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0sIHN1cHByZXNzRXZl
bnRzKSB7CisgIGlmICghKG0uaGFzT3duUHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSAmJgorICAg
ICAgICBtLmNoYWluV2F0Y2hlcnNba2V5TmFtZV0pKSB7CisgICAgcmV0dXJuOworICB9CiAKLSAg
VGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1heSB0
cnkgdG8gdXBkYXRlIGFmdGVyCi0gIGFuIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCisgIHZh
ciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1lXSwKKyAgICAgIGV2ZW50cyA9IHN1cHBy
ZXNzRXZlbnRzID8gbnVsbCA6IFtdLAorICAgICAgaSwgbDsKIAotICBAbWV0aG9kIHRyeVNldAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBtb2RpZnku
Ci0gIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0Ci0gIEBw
YXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0qLwotRW1iZXIudHJ5U2V0ID0g
ZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKLSAgcmV0dXJuIHNldChyb290LCBwYXRoLCB2
YWx1ZSwgdHJ1ZSk7CisgIGZvcihpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykg
eworICAgIG5vZGVzW2ldLmRpZENoYW5nZShldmVudHMpOworICB9CisKKyAgaWYgKHN1cHByZXNz
RXZlbnRzKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpID0gMCwgbCA9IGV2ZW50cy5s
ZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKKyAgICBwcm9wZXJ0eURpZENoYW5nZShldmVudHNbaV0s
IGV2ZW50c1tpKzFdKTsKKyAgfQorfQorCitFbWJlci5vdmVycmlkZUNoYWlucyA9IGZ1bmN0aW9u
KG9iaiwga2V5TmFtZSwgbSkgeworICBjaGFpbnNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtLCB0
cnVlKTsKIH07Ci1FbWJlci50cnlTZXRQYXRoID0gRW1iZXIuZGVwcmVjYXRlRnVuYygndHJ5U2V0
UGF0aCBoYXMgYmVlbiByZW5hbWVkIHRvIHRyeVNldCcsIEVtYmVyLnRyeVNldCk7CiAKIC8qKgot
ICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcuLCBgTXlB
cHAuZm9vQ29udHJvbGxlci5iYXJgKQotICBpbnN0ZWFkIG9mIGxvY2FsIChgZm9vLmJhci5iYXpg
KS4KLQotICBAbWV0aG9kIGlzR2xvYmFsUGF0aAotICBAZm9yIEVtYmVyCisgIEBtZXRob2QgYmVn
aW5Qcm9wZXJ0eUNoYW5nZXMKKyAgQGNoYWluYWJsZQogICBAcHJpdmF0ZQotICBAcGFyYW0ge1N0
cmluZ30gcGF0aAotICBAcmV0dXJuIEJvb2xlYW4KICovCi1FbWJlci5pc0dsb2JhbFBhdGggPSBm
dW5jdGlvbihwYXRoKSB7Ci0gIHJldHVybiBJU19HTE9CQUwudGVzdChwYXRoKTsKLX07Ci0KLQot
fSkoKTsKLQorZnVuY3Rpb24gYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKSB7CisgIGRlZmVycmVkKys7
Cit9CiAKK0VtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVnaW5Qcm9wZXJ0eUNoYW5nZXM7
CiAKLShmdW5jdGlvbigpIHsKIC8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAorICBAbWV0aG9kIGVu
ZFByb3BlcnR5Q2hhbmdlcworICBAcHJpdmF0ZQogKi8KK2Z1bmN0aW9uIGVuZFByb3BlcnR5Q2hh
bmdlcygpIHsKKyAgZGVmZXJyZWQtLTsKKyAgaWYgKGRlZmVycmVkPD0wKSB7CisgICAgYmVmb3Jl
T2JzZXJ2ZXJTZXQuY2xlYXIoKTsKKyAgICBvYnNlcnZlclNldC5mbHVzaCgpOworICB9Cit9CiAK
LXZhciBHVUlEX0tFWSA9IEVtYmVyLkdVSURfS0VZLAotICAgIE1FVEFfS0VZID0gRW1iZXIuTUVU
QV9LRVksCi0gICAgRU1QVFlfTUVUQSA9IEVtYmVyLkVNUFRZX01FVEEsCi0gICAgbWV0YUZvciA9
IEVtYmVyLm1ldGEsCi0gICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCi0gICAgb2JqZWN0RGVm
aW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eTsKLQotdmFyIE1BTkRB
VE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUjsKLQotLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVT
Q1JJUFRPUgotLy8KK0VtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcyA9IGVuZFByb3BlcnR5Q2hhbmdl
czsKIAogLyoqCi0gIE9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQgYW4gaW50ZXJm
YWNlIHRvIHJlc3BvbmRzIHJlcXVlc3RzIHRvCi0gIGdldCBhbmQgc2V0LiBUaGUgZGVmYXVsdCBp
bXBsZW1lbnRhdGlvbiBoYW5kbGVzIHNpbXBsZSBwcm9wZXJ0aWVzLgorICBNYWtlIGEgc2VyaWVz
IG9mIHByb3BlcnR5IGNoYW5nZXMgdG9nZXRoZXIgaW4gYW4KKyAgZXhjZXB0aW9uLXNhZmUgd2F5
LgogCi0gIFlvdSBnZW5lcmFsbHkgd29uJ3QgbmVlZCB0byBjcmVhdGUgb3Igc3ViY2xhc3MgdGhp
cyBkaXJlY3RseS4KKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1
bmN0aW9uKCkgeworICAgIG9iajEuc2V0KCdmb28nLCBtYXlCbG93VXBXaGVuU2V0KTsKKyAgICBv
YmoyLnNldCgnYmFyJywgYmF6KTsKKyAgfSk7CisgIGBgYAogCi0gIEBjbGFzcyBEZXNjcmlwdG9y
Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCisgIEBtZXRo
b2QgY2hhbmdlUHJvcGVydGllcworICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICBAcGFy
YW0gW2JpbmRpbmddCiAqLwotdmFyIERlc2NyaXB0b3IgPSBFbWJlci5EZXNjcmlwdG9yID0gZnVu
Y3Rpb24oKSB7fTsKK0VtYmVyLmNoYW5nZVByb3BlcnRpZXMgPSBmdW5jdGlvbihjYiwgYmluZGlu
ZykgeworICBiZWdpblByb3BlcnR5Q2hhbmdlcygpOworICB0cnlGaW5hbGx5KGNiLCBlbmRQcm9w
ZXJ0eUNoYW5nZXMsIGJpbmRpbmcpOworfTsKIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVGSU5JTkcgUFJPUEVSVElF
UyBBUEkKLS8vCitmdW5jdGlvbiBub3RpZnlCZWZvcmVPYnNlcnZlcnMob2JqLCBrZXlOYW1lKSB7
CisgIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQogCi12YXIgTUFOREFUT1JZX1NF
VFRFUl9GVU5DVElPTiA9IEVtYmVyLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04gPSBmdW5jdGlv
bih2YWx1ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0byBh
Y2Nlc3MgdGhpcyBwcm9wZXJ0eSAob2YgIiArIHRoaXMgKyAiKSIsIGZhbHNlKTsKLX07CisgIHZh
ciBldmVudE5hbWUgPSBrZXlOYW1lICsgJzpiZWZvcmUnLCBsaXN0ZW5lcnMsIGRpZmY7CisgIGlm
IChkZWZlcnJlZCkgeworICAgIGxpc3RlbmVycyA9IGJlZm9yZU9ic2VydmVyU2V0LmFkZChvYmos
IGtleU5hbWUsIGV2ZW50TmFtZSk7CisgICAgZGlmZiA9IGxpc3RlbmVyc0RpZmYob2JqLCBldmVu
dE5hbWUsIGxpc3RlbmVycyk7CisgICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBr
ZXlOYW1lXSwgZGlmZik7CisgIH0gZWxzZSB7CisgICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1l
LCBbb2JqLCBrZXlOYW1lXSk7CisgIH0KK30KIAotdmFyIERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9O
ID0gRW1iZXIuREVGQVVMVF9HRVRURVJfRlVOQ1RJT04gPSBmdW5jdGlvbihuYW1lKSB7Ci0gIHJl
dHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWV0YSA9IHRoaXNbTUVUQV9LRVldOwotICAgIHJl
dHVybiBtZXRhICYmIG1ldGEudmFsdWVzW25hbWVdOwotICB9OwotfTsKK2Z1bmN0aW9uIG5vdGlm
eU9ic2VydmVycyhvYmosIGtleU5hbWUpIHsKKyAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsgcmV0
dXJuOyB9CiAKLS8qKgotICBAcHJpdmF0ZQorICB2YXIgZXZlbnROYW1lID0ga2V5TmFtZSArICc6
Y2hhbmdlJywgbGlzdGVuZXJzOworICBpZiAoZGVmZXJyZWQpIHsKKyAgICBsaXN0ZW5lcnMgPSBv
YnNlcnZlclNldC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOworICAgIGxpc3RlbmVyc1Vu
aW9uKG9iaiwgZXZlbnROYW1lLCBsaXN0ZW5lcnMpOworICB9IGVsc2UgeworICAgIHNlbmRFdmVu
dChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFtZV0pOworICB9Cit9CiAKLSAgTk9URTogVGhp
cyBpcyBhIGxvdy1sZXZlbCBtZXRob2QgdXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgQVBJLiBZ
b3UgYWxtb3N0Ci0gIG5ldmVyIHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5z
dGVhZCB5b3Ugc2hvdWxkIHVzZQotICBgRW1iZXIubWl4aW4oKWAgdG8gZGVmaW5lIG5ldyBwcm9w
ZXJ0aWVzLgorfSkoKTsKIAotICBEZWZpbmVzIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBUaGlz
IG1ldGhvZCB3b3JrcyBtdWNoIGxpa2UgdGhlIEVTNQotICBgT2JqZWN0LmRlZmluZVByb3BlcnR5
KClgIG1ldGhvZCBleGNlcHQgdGhhdCBpdCBjYW4gYWxzbyBhY2NlcHQgY29tcHV0ZWQKLSAgcHJv
cGVydGllcyBhbmQgb3RoZXIgc3BlY2lhbCBkZXNjcmlwdG9ycy4KIAotICBOb3JtYWxseSB0aGlz
IG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRlcnMuIEhvd2V2ZXIgaWYgeW91IHBhc3Mg
YW4KLSAgaW5zdGFuY2Ugb2YgYEVtYmVyLkRlc2NyaXB0b3JgIGFzIHRoZSB0aGlyZCBwYXJhbSB0
aGVuIHlvdSBjYW4gcGFzcyBhbgotICBvcHRpb25hbCB2YWx1ZSBhcyB0aGUgZm91cnRoIHBhcmFt
ZXRlci4gVGhpcyBpcyBvZnRlbiBtb3JlIGVmZmljaWVudCB0aGFuCi0gIGNyZWF0aW5nIG5ldyBk
ZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0eS4KIAotICAjIyBFeGFtcGxlcworKGZ1
bmN0aW9uKCkgeworLy8gTUVUQV9LRVkKKy8vIF9nZXRQYXRoCisvLyBwcm9wZXJ0eVdpbGxDaGFu
Z2UsIHByb3BlcnR5RGlkQ2hhbmdlCiAKLSAgYGBgamF2YXNjcmlwdAotICAvLyBFUzUgY29tcGF0
aWJsZSBtb2RlCi0gIEVtYmVyLmRlZmluZVByb3BlcnR5KGNvbnRhY3QsICdmaXJzdE5hbWUnLCB7
Ci0gICAgd3JpdGFibGU6IHRydWUsCi0gICAgY29uZmlndXJhYmxlOiBmYWxzZSwKLSAgICBlbnVt
ZXJhYmxlOiB0cnVlLAotICAgIHZhbHVlOiAnQ2hhcmxlcycKLSAgfSk7Cit2YXIgTUVUQV9LRVkg
PSBFbWJlci5NRVRBX0tFWSwKKyAgICBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRB
VE9SWV9TRVRURVIsCisgICAgSVNfR0xPQkFMID0gL14oW0EtWiRdfChbMC05XVtBLVokXSkpLywK
KyAgICBnZXRQYXRoID0gRW1iZXIuX2dldFBhdGg7CiAKLSAgLy8gZGVmaW5lIGEgc2ltcGxlIHBy
b3BlcnR5Ci0gIEVtYmVyLmRlZmluZVByb3BlcnR5KGNvbnRhY3QsICdsYXN0TmFtZScsIHVuZGVm
aW5lZCwgJ0pvbGxleScpOworLyoqCisgIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb24g
YW4gb2JqZWN0LCByZXNwZWN0aW5nIGNvbXB1dGVkIHByb3BlcnRpZXMKKyAgYW5kIG5vdGlmeWlu
ZyBvYnNlcnZlcnMgYW5kIG90aGVyIGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlLiBJZiB0aGUKKyAg
cHJvcGVydHkgaXMgbm90IGRlZmluZWQgYnV0IHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUgYHNl
dFVua25vd25Qcm9wZXJ0eWAKKyAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQgYXMg
d2VsbC4KIAotICAvLyBkZWZpbmUgYSBjb21wdXRlZCBwcm9wZXJ0eQotICBFbWJlci5kZWZpbmVQ
cm9wZXJ0eShjb250YWN0LCAnZnVsbE5hbWUnLCBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsK
LSAgICByZXR1cm4gdGhpcy5maXJzdE5hbWUrJyAnK3RoaXMubGFzdE5hbWU7Ci0gIH0pLnByb3Bl
cnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKSk7Ci0gIGBgYAorICBJZiB5b3UgcGxhbiB0byBy
dW4gb24gSUU4IGFuZCBvbGRlciBicm93c2VycyB0aGVuIHlvdSBzaG91bGQgdXNlIHRoaXMKKyAg
bWV0aG9kIGFueXRpbWUgeW91IHdhbnQgdG8gc2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHRo
YXQgeW91IGRvbid0CisgIGtub3cgZm9yIHN1cmUgaXMgcHJpdmF0ZS4gKFByb3BlcnRpZXMgYmVn
aW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZSAnXycKKyAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4p
CiAKLSAgQG1ldGhvZCBkZWZpbmVQcm9wZXJ0eQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2Jq
ZWN0fSBvYmogdGhlIG9iamVjdCB0byBkZWZpbmUgdGhpcyBwcm9wZXJ0eSBvbi4gVGhpcyBtYXkg
YmUgYSBwcm90b3R5cGUuCi0gIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIHRoZSBuYW1lIG9mIHRo
ZSBwcm9wZXJ0eQotICBAcGFyYW0ge0VtYmVyLkRlc2NyaXB0b3J9IFtkZXNjXSBhbiBpbnN0YW5j
ZSBvZiBgRW1iZXIuRGVzY3JpcHRvcmAgKHR5cGljYWxseSBhCi0gICAgY29tcHV0ZWQgcHJvcGVy
dHkpIG9yIGFuIEVTNSBkZXNjcmlwdG9yLgotICAgIFlvdSBtdXN0IHByb3ZpZGUgdGhpcyBvciBg
ZGF0YWAgYnV0IG5vdCBib3RoLgotICBAcGFyYW0ge2FueXRoaW5nfSBbZGF0YV0gc29tZXRoaW5n
IG90aGVyIHRoYW4gYSBkZXNjcmlwdG9yLCB0aGF0IHdpbGwKLSAgICBiZWNvbWUgdGhlIGV4cGxp
Y2l0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuCi0qLwotRW1iZXIuZGVmaW5lUHJvcGVydHkgPSBm
dW5jdGlvbihvYmosIGtleU5hbWUsIGRlc2MsIGRhdGEsIG1ldGEpIHsKLSAgdmFyIGRlc2NzLCBl
eGlzdGluZ0Rlc2MsIHdhdGNoaW5nLCB2YWx1ZTsKKyAgT24gYWxsIG5ld2VyIGJyb3dzZXJzLCB5
b3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQKKyAgcHJvcGVydGllcyBpZiB0
aGUgcHJvcGVydHkgbWlnaHQgbm90IGJlIGRlZmluZWQgb24gdGhlIG9iamVjdCBhbmQgeW91IHdh
bnQKKyAgdG8gcmVzcGVjdCB0aGUgYHNldFVua25vd25Qcm9wZXJ0eWAgaGFuZGxlci4gT3RoZXJ3
aXNlIHlvdSBjYW4gaWdub3JlIHRoaXMKKyAgbWV0aG9kLgogCi0gIGlmICghbWV0YSkgbWV0YSA9
IG1ldGFGb3Iob2JqKTsKLSAgZGVzY3MgPSBtZXRhLmRlc2NzOwotICBleGlzdGluZ0Rlc2MgPSBt
ZXRhLmRlc2NzW2tleU5hbWVdOwotICB3YXRjaGluZyA9IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0g
PiAwOworICBAbWV0aG9kIHNldAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmog
VGhlIG9iamVjdCB0byBtb2RpZnkuCisgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9w
ZXJ0eSBrZXkgdG8gc2V0CisgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0
CisgIEByZXR1cm4ge09iamVjdH0gdGhlIHBhc3NlZCB2YWx1ZS4KKyovCit2YXIgc2V0ID0gZnVu
Y3Rpb24gc2V0KG9iaiwga2V5TmFtZSwgdmFsdWUsIHRvbGVyYW50KSB7CisgIGlmICh0eXBlb2Yg
b2JqID09PSAnc3RyaW5nJykgeworICAgIEVtYmVyLmFzc2VydCgiUGF0aCAnIiArIG9iaiArICIn
IG11c3QgYmUgZ2xvYmFsIGlmIG5vIG9iaiBpcyBnaXZlbi4iLCBJU19HTE9CQUwudGVzdChvYmop
KTsKKyAgICB2YWx1ZSA9IGtleU5hbWU7CisgICAga2V5TmFtZSA9IG9iajsKKyAgICBvYmogPSBu
dWxsOworICB9CiAKLSAgaWYgKGV4aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0
b3IpIHsKLSAgICBleGlzdGluZ0Rlc2MudGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKKyAgRW1iZXIu
YXNzZXJ0KCJDYW5ub3QgY2FsbCBzZXQgd2l0aCAiKyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5h
bWUpOworCisgIGlmICghb2JqIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgeworICAg
IHJldHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRvbGVyYW50KTsKICAgfQogCi0g
IGlmIChkZXNjIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikgewotICAgIHZhbHVlID0gZGVz
YzsKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbmVlZCB0byBwcm92aWRlIGFuIG9iamVjdCBhbmQga2V5
IHRvIGBzZXRgLiIsICEhb2JqICYmIGtleU5hbWUgIT09IHVuZGVmaW5lZCk7CisgIEVtYmVyLmFz
c2VydCgnY2FsbGluZyBzZXQgb24gZGVzdHJveWVkIG9iamVjdCcsICFvYmouaXNEZXN0cm95ZWQp
OwogCi0gICAgZGVzY3Nba2V5TmFtZV0gPSBkZXNjOwotICAgIGlmIChNQU5EQVRPUllfU0VUVEVS
ICYmIHdhdGNoaW5nKSB7Ci0gICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUs
IHsKLSAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgICBlbnVtZXJhYmxlOiB0cnVl
LAotICAgICAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCAvLyBt
YWtlIGVudW1lcmFibGUKLSAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBvYmpba2V5TmFt
ZV0gPSB1bmRlZmluZWQ7IC8vIG1ha2UgZW51bWVyYWJsZQotICAgIH0KLSAgICBkZXNjLnNldHVw
KG9iaiwga2V5TmFtZSk7CisgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwgZGVzYyA9IG1ldGEg
JiYgbWV0YS5kZXNjc1trZXlOYW1lXSwKKyAgICAgIGlzVW5rbm93biwgY3VycmVudFZhbHVlOwor
ICBpZiAoZGVzYykgeworICAgIGRlc2Muc2V0KG9iaiwga2V5TmFtZSwgdmFsdWUpOwogICB9IGVs
c2UgewotICAgIGRlc2NzW2tleU5hbWVdID0gdW5kZWZpbmVkOyAvLyBzaGFkb3cgZGVzY3JpcHRv
ciBpbiBwcm90bwotICAgIGlmIChkZXNjID09IG51bGwpIHsKLSAgICAgIHZhbHVlID0gZGF0YTsK
KyAgICBpc1Vua25vd24gPSAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4g
b2JqKTsKIAotICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYgd2F0Y2hpbmcpIHsKLSAgICAg
ICAgbWV0YS52YWx1ZXNba2V5TmFtZV0gPSBkYXRhOwotICAgICAgICBvYmplY3REZWZpbmVQcm9w
ZXJ0eShvYmosIGtleU5hbWUsIHsKLSAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCi0gICAg
ICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgICAgICBzZXQ6IE1BTkRBVE9SWV9TRVRURVJf
RlVOQ1RJT04sCi0gICAgICAgICAgZ2V0OiBERUZBVUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1l
KQotICAgICAgICB9KTsKKyAgICAvLyBzZXRVbmtub3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBv
YmpgIGlzIGFuIG9iamVjdCwKKyAgICAvLyB0aGUgcHJvcGVydHkgZG9lcyBub3QgYWxyZWFkeSBl
eGlzdCwgYW5kIHRoZQorICAgIC8vIGBzZXRVbmtub3duUHJvcGVydHlgIG1ldGhvZCBleGlzdHMg
b24gdGhlIG9iamVjdAorICAgIGlmIChpc1Vua25vd24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9m
IG9iai5zZXRVbmtub3duUHJvcGVydHkpIHsKKyAgICAgIG9iai5zZXRVbmtub3duUHJvcGVydHko
a2V5TmFtZSwgdmFsdWUpOworICAgIH0gZWxzZSBpZiAobWV0YSAmJiBtZXRhLndhdGNoaW5nW2tl
eU5hbWVdID4gMCkgeworICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKKyAgICAgICAgY3Vy
cmVudFZhbHVlID0gbWV0YS52YWx1ZXNba2V5TmFtZV07CiAgICAgICB9IGVsc2UgewotICAgICAg
ICBvYmpba2V5TmFtZV0gPSBkYXRhOworICAgICAgICBjdXJyZW50VmFsdWUgPSBvYmpba2V5TmFt
ZV07CisgICAgICB9CisgICAgICAvLyBvbmx5IHRyaWdnZXIgYSBjaGFuZ2UgaWYgdGhlIHZhbHVl
IGhhcyBjaGFuZ2VkCisgICAgICBpZiAodmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkgeworICAgICAg
ICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsKKyAgICAgICAgaWYgKE1B
TkRBVE9SWV9TRVRURVIpIHsKKyAgICAgICAgICBpZiAoKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZp
bmVkICYmICEoa2V5TmFtZSBpbiBvYmopKSB8fCAhb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtl
eU5hbWUpKSB7CisgICAgICAgICAgICBFbWJlci5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUs
IG51bGwsIHZhbHVlKTsgLy8gc2V0dXAgbWFuZGF0b3J5IHNldHRlcgorICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBtZXRhLnZhbHVlc1trZXlOYW1lXSA9IHZhbHVlOworICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKKyAg
ICAgICAgfQorICAgICAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpOwog
ICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB2YWx1ZSA9IGRlc2M7Ci0KLSAgICAgIC8vIGNv
bXBhdGliaWxpdHkgd2l0aCBFUzUKLSAgICAgIG9iamVjdERlZmluZVByb3BlcnR5KG9iaiwga2V5
TmFtZSwgZGVzYyk7CisgICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKICAgICB9CiAgIH0KKyAg
cmV0dXJuIHZhbHVlOworfTsKIAotICAvLyBpZiBrZXkgaXMgYmVpbmcgd2F0Y2hlZCwgb3ZlcnJp
ZGUgY2hhaW5zIHRoYXQKLSAgLy8gd2VyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm90b3R5cGUK
LSAgaWYgKHdhdGNoaW5nKSB7IEVtYmVyLm92ZXJyaWRlQ2hhaW5zKG9iaiwga2V5TmFtZSwgbWV0
YSk7IH0KKy8vIEN1cnJlbnRseSB1c2VkIG9ubHkgYnkgRW1iZXIgRGF0YSB0ZXN0cworaWYgKEVt
YmVyLmNvbmZpZy5vdmVycmlkZUFjY2Vzc29ycykgeworICBFbWJlci5zZXQgPSBzZXQ7CisgIEVt
YmVyLmNvbmZpZy5vdmVycmlkZUFjY2Vzc29ycygpOworICBzZXQgPSBFbWJlci5zZXQ7Cit9CiAK
LSAgLy8gVGhlIGB2YWx1ZWAgcGFzc2VkIHRvIHRoZSBgZGlkRGVmaW5lUHJvcGVydHlgIGhvb2sg
aXMKLSAgLy8gZWl0aGVyIHRoZSBkZXNjcmlwdG9yIG9yIGRhdGEsIHdoaWNoZXZlciB3YXMgcGFz
c2VkLgotICBpZiAob2JqLmRpZERlZmluZVByb3BlcnR5KSB7IG9iai5kaWREZWZpbmVQcm9wZXJ0
eShvYmosIGtleU5hbWUsIHZhbHVlKTsgfQorZnVuY3Rpb24gc2V0UGF0aChyb290LCBwYXRoLCB2
YWx1ZSwgdG9sZXJhbnQpIHsKKyAgdmFyIGtleU5hbWU7CiAKLSAgcmV0dXJuIHRoaXM7Ci19Owor
ICAvLyBnZXQgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aAorICBrZXlOYW1lID0gcGF0aC5zbGlj
ZShwYXRoLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKworICAvLyBnZXQgdGhlIGZpcnN0IHBhcnQg
b2YgdGhlIHBhcnQKKyAgcGF0aCAgICA9IChwYXRoID09PSBrZXlOYW1lKSA/IGtleU5hbWUgOiBw
YXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoLShrZXlOYW1lLmxlbmd0aCsxKSk7CisKKyAgLy8gdW5s
ZXNzIHRoZSBwYXRoIGlzIHRoaXMsIGxvb2sgdXAgdGhlIGZpcnN0IHBhcnQgdG8KKyAgLy8gZ2V0
IHRoZSByb290CisgIGlmIChwYXRoICE9PSAndGhpcycpIHsKKyAgICByb290ID0gZ2V0UGF0aChy
b290LCBwYXRoKTsKKyAgfQorCisgIGlmICgha2V5TmFtZSB8fCBrZXlOYW1lLmxlbmd0aCA9PT0g
MCkgeworICAgIHRocm93IG5ldyBFbWJlci5FcnJvcignUHJvcGVydHkgc2V0IGZhaWxlZDogWW91
IHBhc3NlZCBhbiBlbXB0eSBwYXRoJyk7CisgIH0KKworICBpZiAoIXJvb3QpIHsKKyAgICBpZiAo
dG9sZXJhbnQpIHsgcmV0dXJuOyB9CisgICAgZWxzZSB7IHRocm93IG5ldyBFbWJlci5FcnJvcign
UHJvcGVydHkgc2V0IGZhaWxlZDogb2JqZWN0IGluIHBhdGggIicrcGF0aCsnIiBjb3VsZCBub3Qg
YmUgZm91bmQgb3Igd2FzIGRlc3Ryb3llZC4nKTsgfQorICB9CisKKyAgcmV0dXJuIHNldChyb290
LCBrZXlOYW1lLCB2YWx1ZSk7Cit9CisKK0VtYmVyLnNldCA9IHNldDsKKworLyoqCisgIEVycm9y
LXRvbGVyYW50IGZvcm0gb2YgYEVtYmVyLnNldGAuIFdpbGwgbm90IGJsb3cgdXAgaWYgYW55IHBh
cnQgb2YgdGhlCisgIGNoYWluIGlzIGB1bmRlZmluZWRgLCBgbnVsbGAsIG9yIGRlc3Ryb3llZC4K
KworICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHdoZW4gc3luY2luZyBiaW5kaW5ncywgd2hpY2gg
bWF5IHRyeSB0byB1cGRhdGUgYWZ0ZXIKKyAgYW4gb2JqZWN0IGhhcyBiZWVuIGRlc3Ryb3llZC4K
IAorICBAbWV0aG9kIHRyeVNldAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmog
VGhlIG9iamVjdCB0byBtb2RpZnkuCisgIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0
eSBwYXRoIHRvIHNldAorICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAor
Ki8KK0VtYmVyLnRyeVNldCA9IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIHZhbHVlKSB7CisgIHJldHVy
biBzZXQocm9vdCwgcGF0aCwgdmFsdWUsIHRydWUpOworfTsKIAogfSkoKTsKIAogCiAKIChmdW5j
dGlvbigpIHsKLS8vIEVtYmVyLnRyeUZpbmFsbHkKIC8qKgogQG1vZHVsZSBlbWJlci1tZXRhbAog
Ki8KIAotdmFyIEFGVEVSX09CU0VSVkVSUyA9ICc6Y2hhbmdlJzsKLXZhciBCRUZPUkVfT0JTRVJW
RVJTID0gJzpiZWZvcmUnOworLyoKKyAgSmF2YVNjcmlwdCAoYmVmb3JlIEVTNikgZG9lcyBub3Qg
aGF2ZSBhIE1hcCBpbXBsZW1lbnRhdGlvbi4gT2JqZWN0cywKKyAgd2hpY2ggYXJlIG9mdGVuIHVz
ZWQgYXMgZGljdGlvbmFyaWVzLCBtYXkgb25seSBoYXZlIFN0cmluZ3MgYXMga2V5cy4KIAotdmFy
IGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOworICBCZWNhdXNlIEVtYmVyIGhhcyBhIHdheSB0byBn
ZXQgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZXZlcnkgb2JqZWN0CisgIHZpYSBgRW1iZXIuZ3Vp
ZEZvcmAsIHdlIGNhbiBpbXBsZW1lbnQgYSBwZXJmb3JtYW50IE1hcCB3aXRoIGFyYml0cmFyeQor
ICBrZXlzLiBCZWNhdXNlIGl0IGlzIGNvbW1vbmx5IHVzZWQgaW4gbG93LWxldmVsIGJvb2trZWVw
aW5nLCBNYXAgaXMKKyAgaW1wbGVtZW50ZWQgYXMgYSBwdXJlIEphdmFTY3JpcHQgb2JqZWN0IGZv
ciBwZXJmb3JtYW5jZS4KIAotdmFyIGRlZmVycmVkID0gMDsKKyAgVGhpcyBpbXBsZW1lbnRhdGlv
biBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgor
ICBtYXBzIChodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnNp
bXBsZV9tYXBzX2FuZF9zZXRzKSwKKyAgd2l0aCB0d28gZXhjZXB0aW9ucy4gRmlyc3QsIGJlY2F1
c2Ugd2UgbmVlZCBvdXIgaW1wbGVtZW50YXRpb24gdG8gYmUgcGxlYXNhbnQKKyAgb24gb2xkZXIg
YnJvd3NlcnMsIHdlIGRvIG5vdCB1c2UgdGhlIGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVg
IGluc3RlYWQpLgorICBTZWNvbmQsIGFzIHdlIGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4t
Vk0gaXRlcmF0aW9uLCB3ZSBpbXBsZW1lbnQgYQorICBmb3JFYWNoIG1ldGhvZCBmb3IgaXRlcmF0
aW9uLgogCi0vKgotICB0aGlzLm9ic2VydmVyU2V0ID0gewotICAgIFtzZW5kZXJHdWlkXTogeyAv
LyB2YXJpYWJsZSBuYW1lOiBga2V5U2V0YAotICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKLSAg
ICB9Ci0gIH0sCi0gIHRoaXMub2JzZXJ2ZXJzID0gWwotICAgIHsKLSAgICAgIHNlbmRlcjogb2Jq
LAotICAgICAga2V5TmFtZToga2V5TmFtZSwKLSAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAot
ICAgICAgbGlzdGVuZXJzOiBbCi0gICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgb25jZUZsYWcsIHN1
c3BlbmRlZEZsYWddCi0gICAgICBdCi0gICAgfSwKLSAgICAuLi4KLSAgXQorICBNYXAgaXMgbW9j
a2VkIG91dCB0byBsb29rIGxpa2UgYW4gRW1iZXIgb2JqZWN0LCBzbyB5b3UgY2FuIGRvCisgIGBF
bWJlci5NYXAuY3JlYXRlKClgIGZvciBzeW1tZXRyeSB3aXRoIG90aGVyIEVtYmVyIGNsYXNzZXMu
CiAqLwotZnVuY3Rpb24gT2JzZXJ2ZXJTZXQoKSB7Ci0gIHRoaXMuY2xlYXIoKTsKLX0KK3ZhciBz
ZXQgPSBFbWJlci5zZXQsCisgICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCisgICAgaW5kZXhP
ZiA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmluZGV4T2Y7CiAKLU9ic2VydmVyU2V0LnByb3RvdHlw
ZS5hZGQgPSBmdW5jdGlvbihzZW5kZXIsIGtleU5hbWUsIGV2ZW50TmFtZSkgewotICB2YXIgb2Jz
ZXJ2ZXJTZXQgPSB0aGlzLm9ic2VydmVyU2V0LAotICAgICAgb2JzZXJ2ZXJzID0gdGhpcy5vYnNl
cnZlcnMsCi0gICAgICBzZW5kZXJHdWlkID0gRW1iZXIuZ3VpZEZvcihzZW5kZXIpLAotICAgICAg
a2V5U2V0ID0gb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0sCi0gICAgICBpbmRleDsKK3ZhciBjb3B5
ID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciBvdXRwdXQgPSB7fTsKIAotICBpZiAoIWtleVNldCkg
ewotICAgIG9ic2VydmVyU2V0W3NlbmRlckd1aWRdID0ga2V5U2V0ID0ge307Ci0gIH0KLSAgaW5k
ZXggPSBrZXlTZXRba2V5TmFtZV07Ci0gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAg
aW5kZXggPSBvYnNlcnZlcnMucHVzaCh7Ci0gICAgICBzZW5kZXI6IHNlbmRlciwKLSAgICAgIGtl
eU5hbWU6IGtleU5hbWUsCi0gICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKLSAgICAgIGxpc3Rl
bmVyczogW10KLSAgICB9KSAtIDE7Ci0gICAga2V5U2V0W2tleU5hbWVdID0gaW5kZXg7CisgIGZv
ciAodmFyIHByb3AgaW4gb2JqKSB7CisgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkg
eyBvdXRwdXRbcHJvcF0gPSBvYmpbcHJvcF07IH0KICAgfQotICByZXR1cm4gb2JzZXJ2ZXJzW2lu
ZGV4XS5saXN0ZW5lcnM7Ci19OwogCi1PYnNlcnZlclNldC5wcm90b3R5cGUuZmx1c2ggPSBmdW5j
dGlvbigpIHsKLSAgdmFyIG9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzLCBpLCBsZW4sIG9ic2Vy
dmVyLCBzZW5kZXI7Ci0gIHRoaXMuY2xlYXIoKTsKLSAgZm9yIChpPTAsIGxlbj1vYnNlcnZlcnMu
bGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICBvYnNlcnZlciA9IG9ic2VydmVyc1tpXTsKLSAg
ICBzZW5kZXIgPSBvYnNlcnZlci5zZW5kZXI7Ci0gICAgaWYgKHNlbmRlci5pc0Rlc3Ryb3lpbmcg
fHwgc2VuZGVyLmlzRGVzdHJveWVkKSB7IGNvbnRpbnVlOyB9Ci0gICAgRW1iZXIuc2VuZEV2ZW50
KHNlbmRlciwgb2JzZXJ2ZXIuZXZlbnROYW1lLCBbc2VuZGVyLCBvYnNlcnZlci5rZXlOYW1lXSwg
b2JzZXJ2ZXIubGlzdGVuZXJzKTsKLSAgfQorICByZXR1cm4gb3V0cHV0OwogfTsKIAotT2JzZXJ2
ZXJTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMub2JzZXJ2ZXJTZXQg
PSB7fTsKLSAgdGhpcy5vYnNlcnZlcnMgPSBbXTsKLX07Cit2YXIgY29weU1hcCA9IGZ1bmN0aW9u
KG9yaWdpbmFsLCBuZXdPYmplY3QpIHsKKyAgdmFyIGtleXMgPSBvcmlnaW5hbC5rZXlzLmNvcHko
KSwKKyAgICAgIHZhbHVlcyA9IGNvcHkob3JpZ2luYWwudmFsdWVzKTsKIAotdmFyIGJlZm9yZU9i
c2VydmVyU2V0ID0gbmV3IE9ic2VydmVyU2V0KCksIG9ic2VydmVyU2V0ID0gbmV3IE9ic2VydmVy
U2V0KCk7CisgIG5ld09iamVjdC5rZXlzID0ga2V5czsKKyAgbmV3T2JqZWN0LnZhbHVlcyA9IHZh
bHVlczsKKyAgbmV3T2JqZWN0Lmxlbmd0aCA9IG9yaWdpbmFsLmxlbmd0aDsKIAotLyoqCi0gIEBt
ZXRob2QgYmVnaW5Qcm9wZXJ0eUNoYW5nZXMKLSAgQGNoYWluYWJsZQotKi8KLUVtYmVyLmJlZ2lu
UHJvcGVydHlDaGFuZ2VzID0gZnVuY3Rpb24oKSB7Ci0gIGRlZmVycmVkKys7CisgIHJldHVybiBu
ZXdPYmplY3Q7CiB9OwogCiAvKioKLSAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKKyAgVGhp
cyBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1iZXIgYW5kIEVtYmVyIERhdGEuCisgIFBs
ZWFzZSBkbyBub3QgdXNlIGl0IGF0IHRoaXMgdGltZS4gV2UgcGxhbiB0byBjbGVhbiBpdCB1cAor
ICBhbmQgYWRkIG1hbnkgdGVzdHMgc29vbi4KKworICBAY2xhc3MgT3JkZXJlZFNldAorICBAbmFt
ZXNwYWNlIEVtYmVyCisgIEBjb25zdHJ1Y3RvcgorICBAcHJpdmF0ZQogKi8KLUVtYmVyLmVuZFBy
b3BlcnR5Q2hhbmdlcyA9IGZ1bmN0aW9uKCkgewotICBkZWZlcnJlZC0tOwotICBpZiAoZGVmZXJy
ZWQ8PTApIHsKLSAgICBiZWZvcmVPYnNlcnZlclNldC5jbGVhcigpOwotICAgIG9ic2VydmVyU2V0
LmZsdXNoKCk7Ci0gIH0KK3ZhciBPcmRlcmVkU2V0ID0gRW1iZXIuT3JkZXJlZFNldCA9IGZ1bmN0
aW9uKCkgeworICB0aGlzLmNsZWFyKCk7CiB9OwogCiAvKioKLSAgTWFrZSBhIHNlcmllcyBvZiBw
cm9wZXJ0eSBjaGFuZ2VzIHRvZ2V0aGVyIGluIGFuCi0gIGV4Y2VwdGlvbi1zYWZlIHdheS4KLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24oKSB7Ci0g
ICAgb2JqMS5zZXQoJ2ZvbycsIG1heUJsb3dVcFdoZW5TZXQpOwotICAgIG9iajIuc2V0KCdiYXIn
LCBiYXopOwotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBjaGFuZ2VQcm9wZXJ0aWVzCi0gIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0gIEBwYXJhbSBbYmluZGluZ10KKyAgQG1ldGhvZCBj
cmVhdGUKKyAgQHN0YXRpYworICBAcmV0dXJuIHtFbWJlci5PcmRlcmVkU2V0fQogKi8KLUVtYmVy
LmNoYW5nZVByb3BlcnRpZXMgPSBmdW5jdGlvbihjYiwgYmluZGluZyl7Ci0gIEVtYmVyLmJlZ2lu
UHJvcGVydHlDaGFuZ2VzKCk7Ci0gIEVtYmVyLnRyeUZpbmFsbHkoY2IsIEVtYmVyLmVuZFByb3Bl
cnR5Q2hhbmdlcywgYmluZGluZyk7CitPcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewor
ICByZXR1cm4gbmV3IE9yZGVyZWRTZXQoKTsKIH07CiAKLS8qKgotICBTZXQgYSBsaXN0IG9mIHBy
b3BlcnRpZXMgb24gYW4gb2JqZWN0LiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgaW5zaWRlCi0g
IGEgc2luZ2xlIGBiZWdpblByb3BlcnR5Q2hhbmdlc2AgYW5kIGBlbmRQcm9wZXJ0eUNoYW5nZXNg
IGJhdGNoLCBzbwotICBvYnNlcnZlcnMgd2lsbCBiZSBidWZmZXJlZC4KLQotICBAbWV0aG9kIHNl
dFByb3BlcnRpZXMKLSAgQHBhcmFtIHRhcmdldAotICBAcGFyYW0ge0hhc2h9IHByb3BlcnRpZXMK
LSAgQHJldHVybiB0YXJnZXQKLSovCi1FbWJlci5zZXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc2Vs
ZiwgaGFzaCkgewotICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCl7Ci0gICAgZm9y
KHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICAgIGlmIChoYXNoLmhhc093blByb3BlcnR5KHByb3Ap
KSBFbWJlci5zZXQoc2VsZiwgcHJvcCwgaGFzaFtwcm9wXSk7Ci0gICAgfQotICB9KTsKLSAgcmV0
dXJuIHNlbGY7Ci19OwogCitPcmRlcmVkU2V0LnByb3RvdHlwZSA9IHsKKyAgLyoqCisgICAgQG1l
dGhvZCBjbGVhcgorICAqLworICBjbGVhcjogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5wcmVzZW5j
ZVNldCA9IHt9OworICAgIHRoaXMubGlzdCA9IFtdOworICB9LAogCi1mdW5jdGlvbiBjaGFuZ2VF
dmVudChrZXlOYW1lKSB7Ci0gIHJldHVybiBrZXlOYW1lK0FGVEVSX09CU0VSVkVSUzsKLX0KKyAg
LyoqCisgICAgQG1ldGhvZCBhZGQKKyAgICBAcGFyYW0gb2JqCisgICovCisgIGFkZDogZnVuY3Rp
b24ob2JqKSB7CisgICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCisgICAgICAgIHByZXNlbmNl
U2V0ID0gdGhpcy5wcmVzZW5jZVNldCwKKyAgICAgICAgbGlzdCA9IHRoaXMubGlzdDsKIAotZnVu
Y3Rpb24gYmVmb3JlRXZlbnQoa2V5TmFtZSkgewotICByZXR1cm4ga2V5TmFtZStCRUZPUkVfT0JT
RVJWRVJTOwotfQorICAgIGlmIChndWlkIGluIHByZXNlbmNlU2V0KSB7IHJldHVybjsgfQogCi0v
KioKLSAgQG1ldGhvZCBhZGRPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5n
fSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFy
YW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5hZGRPYnNlcnZlciA9IGZ1
bmN0aW9uKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgRW1iZXIuYWRkTGlzdGVuZXIo
b2JqLCBjaGFuZ2VFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QpOwotICBFbWJlci53YXRjaChv
YmosIHBhdGgpOwotICByZXR1cm4gdGhpczsKLX07CisgICAgcHJlc2VuY2VTZXRbZ3VpZF0gPSB0
cnVlOworICAgIGxpc3QucHVzaChvYmopOworICB9LAogCi1FbWJlci5vYnNlcnZlcnNGb3IgPSBm
dW5jdGlvbihvYmosIHBhdGgpIHsKLSAgcmV0dXJuIEVtYmVyLmxpc3RlbmVyc0ZvcihvYmosIGNo
YW5nZUV2ZW50KHBhdGgpKTsKLX07CisgIC8qKgorICAgIEBtZXRob2QgcmVtb3ZlCisgICAgQHBh
cmFtIG9iagorICAqLworICByZW1vdmU6IGZ1bmN0aW9uKG9iaikgeworICAgIHZhciBndWlkID0g
Z3VpZEZvcihvYmopLAorICAgICAgICBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQsCisg
ICAgICAgIGxpc3QgPSB0aGlzLmxpc3Q7CiAKLS8qKgotICBAbWV0aG9kIHJlbW92ZU9ic2VydmVy
Ci0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKLSAgQHBhcmFtIHtPYmplY3R8
RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0
aG9kXQotKi8KLUVtYmVyLnJlbW92ZU9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB0YXJn
ZXQsIG1ldGhvZCkgewotICBFbWJlci51bndhdGNoKG9iaiwgcGF0aCk7Ci0gIEVtYmVyLnJlbW92
ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKLSAgcmV0
dXJuIHRoaXM7Ci19OworICAgIGRlbGV0ZSBwcmVzZW5jZVNldFtndWlkXTsKIAotLyoqCi0gIEBt
ZXRob2QgYWRkQmVmb3JlT2JzZXJ2ZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30g
cGF0aAotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QKLSAgQHBhcmFt
IHtGdW5jdGlvbnxTdHJpbmd9IFttZXRob2RdCi0qLwotRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIg
PSBmdW5jdGlvbihvYmosIHBhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLmFkZExpc3Rl
bmVyKG9iaiwgYmVmb3JlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKLSAgRW1iZXIud2F0
Y2gob2JqLCBwYXRoKTsKLSAgcmV0dXJuIHRoaXM7Ci19OworICAgIHZhciBpbmRleCA9IGluZGV4
T2YuY2FsbChsaXN0LCBvYmopOworICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICBsaXN0LnNw
bGljZShpbmRleCwgMSk7CisgICAgfQorICB9LAogCi0vLyBTdXNwZW5kIG9ic2VydmVyIGR1cmlu
ZyBjYWxsYmFjay4KLS8vCi0vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHRhcmdl
dCBvZiB0aGUgb2JzZXJ2ZXIKLS8vIHdoaWxlIGl0IGlzIHNldHRpbmcgdGhlIG9ic2VydmVkIHBh
dGguCi1FbWJlci5fc3VzcGVuZEJlZm9yZU9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB0
YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVu
ZXIob2JqLCBiZWZvcmVFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsKLX07
CisgIC8qKgorICAgIEBtZXRob2QgaXNFbXB0eQorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICov
CisgIGlzRW1wdHk6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoID09
PSAwOworICB9LAogCi1FbWJlci5fc3VzcGVuZE9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRo
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlz
dGVuZXIob2JqLCBjaGFuZ2VFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsK
LX07CisgIC8qKgorICAgIEBtZXRob2QgaGFzCisgICAgQHBhcmFtIG9iagorICAgIEByZXR1cm4g
e0Jvb2xlYW59CisgICovCisgIGhhczogZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIGd1aWQgPSBn
dWlkRm9yKG9iaiksCisgICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldDsKIAot
dmFyIG1hcCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcDsKKyAgICByZXR1cm4gZ3VpZCBpbiBw
cmVzZW5jZVNldDsKKyAgfSwKIAotRW1iZXIuX3N1c3BlbmRCZWZvcmVPYnNlcnZlcnMgPSBmdW5j
dGlvbihvYmosIHBhdGhzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgdmFyIGV2ZW50
cyA9IG1hcC5jYWxsKHBhdGhzLCBiZWZvcmVFdmVudCk7Ci0gIHJldHVybiBFbWJlci5fc3VzcGVu
ZExpc3RlbmVycyhvYmosIGV2ZW50cywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsKLX07Cisg
IC8qKgorICAgIEBtZXRob2QgZm9yRWFjaAorICAgIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgICAg
QHBhcmFtIHNlbGYKKyAgKi8KKyAgZm9yRWFjaDogZnVuY3Rpb24oZm4sIHNlbGYpIHsKKyAgICAv
LyBhbGxvdyBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uCisgICAgdmFyIGxpc3QgPSB0aGlzLnRv
QXJyYXkoKTsKIAotRW1iZXIuX3N1c3BlbmRPYnNlcnZlcnMgPSBmdW5jdGlvbihvYmosIHBhdGhz
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgdmFyIGV2ZW50cyA9IG1hcC5jYWxsKHBh
dGhzLCBjaGFuZ2VFdmVudCk7Ci0gIHJldHVybiBFbWJlci5fc3VzcGVuZExpc3RlbmVycyhvYmos
IGV2ZW50cywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsKLX07CisgICAgZm9yICh2YXIgaSA9
IDAsIGogPSBsaXN0Lmxlbmd0aDsgaSA8IGo7IGkrKykgeworICAgICAgZm4uY2FsbChzZWxmLCBs
aXN0W2ldKTsKKyAgICB9CisgIH0sCiAKLUVtYmVyLmJlZm9yZU9ic2VydmVyc0ZvciA9IGZ1bmN0
aW9uKG9iaiwgcGF0aCkgewotICByZXR1cm4gRW1iZXIubGlzdGVuZXJzRm9yKG9iaiwgYmVmb3Jl
RXZlbnQocGF0aCkpOwotfTsKKyAgLyoqCisgICAgQG1ldGhvZCB0b0FycmF5CisgICAgQHJldHVy
biB7QXJyYXl9CisgICovCisgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlz
Lmxpc3Quc2xpY2UoKTsKKyAgfSwKIAotLyoqCi0gIEBtZXRob2QgcmVtb3ZlQmVmb3JlT2JzZXJ2
ZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30gcGF0aAotICBAcGFyYW0ge09iamVj
dHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QKLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFtt
ZXRob2RdCi0qLwotRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIHBh
dGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLnVud2F0Y2gob2JqLCBwYXRoKTsKLSAgRW1i
ZXIucmVtb3ZlTGlzdGVuZXIob2JqLCBiZWZvcmVFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2Qp
OwotICByZXR1cm4gdGhpczsKLX07CisgIC8qKgorICAgIEBtZXRob2QgY29weQorICAgIEByZXR1
cm4ge0VtYmVyLk9yZGVyZWRTZXR9CisgICovCisgIGNvcHk6IGZ1bmN0aW9uKCkgeworICAgIHZh
ciBzZXQgPSBuZXcgT3JkZXJlZFNldCgpOwogCi1FbWJlci5ub3RpZnlCZWZvcmVPYnNlcnZlcnMg
PSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsgcmV0
dXJuOyB9CisgICAgc2V0LnByZXNlbmNlU2V0ID0gY29weSh0aGlzLnByZXNlbmNlU2V0KTsKKyAg
ICBzZXQubGlzdCA9IHRoaXMudG9BcnJheSgpOwogCi0gIHZhciBldmVudE5hbWUgPSBiZWZvcmVF
dmVudChrZXlOYW1lKSwgbGlzdGVuZXJzLCBsaXN0ZW5lcnNEaWZmOwotICBpZiAoZGVmZXJyZWQp
IHsKLSAgICBsaXN0ZW5lcnMgPSBiZWZvcmVPYnNlcnZlclNldC5hZGQob2JqLCBrZXlOYW1lLCBl
dmVudE5hbWUpOwotICAgIGxpc3RlbmVyc0RpZmYgPSBFbWJlci5saXN0ZW5lcnNEaWZmKG9iaiwg
ZXZlbnROYW1lLCBsaXN0ZW5lcnMpOwotICAgIEVtYmVyLnNlbmRFdmVudChvYmosIGV2ZW50TmFt
ZSwgW29iaiwga2V5TmFtZV0sIGxpc3RlbmVyc0RpZmYpOwotICB9IGVsc2UgewotICAgIEVtYmVy
LnNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFtZV0pOworICAgIHJldHVybiBz
ZXQ7CiAgIH0KIH07CiAKLUVtYmVyLm5vdGlmeU9ic2VydmVycyA9IGZ1bmN0aW9uKG9iaiwga2V5
TmFtZSkgewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KKy8qKgorICBBIE1h
cCBzdG9yZXMgdmFsdWVzIGluZGV4ZWQgYnkga2V5cy4gVW5saWtlIEphdmFTY3JpcHQncworICBk
ZWZhdWx0IE9iamVjdHMsIHRoZSBrZXlzIG9mIGEgTWFwIGNhbiBiZSBhbnkgSmF2YVNjcmlwdAor
ICBvYmplY3QuCiAKLSAgdmFyIGV2ZW50TmFtZSA9IGNoYW5nZUV2ZW50KGtleU5hbWUpLCBsaXN0
ZW5lcnM7Ci0gIGlmIChkZWZlcnJlZCkgewotICAgIGxpc3RlbmVycyA9IG9ic2VydmVyU2V0LmFk
ZChvYmosIGtleU5hbWUsIGV2ZW50TmFtZSk7Ci0gICAgRW1iZXIubGlzdGVuZXJzVW5pb24ob2Jq
LCBldmVudE5hbWUsIGxpc3RlbmVycyk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuc2VuZEV2ZW50
KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlOYW1lXSk7Ci0gIH0KLX07CisgIEludGVybmFsbHks
IGEgTWFwIGhhcyB0d28gZGF0YSBzdHJ1Y3R1cmVzOgogCi19KSgpOworICAxLiBga2V5c2A6IGFu
IE9yZGVyZWRTZXQgb2YgYWxsIG9mIHRoZSBleGlzdGluZyBrZXlzCisgIDIuIGB2YWx1ZXNgOiBh
IEphdmFTY3JpcHQgT2JqZWN0IGluZGV4ZWQgYnkgdGhlIGBFbWJlci5ndWlkRm9yKGtleSlgCiAK
KyAgV2hlbiBhIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIGZvciB0aGUgZmlyc3QgdGltZSwgd2UK
KyAgYWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBPcmRlcmVkU2V0LCBhbmQgY3JlYXRlIG9yCisg
IHJlcGxhY2UgYW4gZW50cnkgaW4gYHZhbHVlc2AuIFdoZW4gYW4gZW50cnkgaXMgZGVsZXRlZCwK
KyAgd2UgZGVsZXRlIGl0cyBlbnRyeSBpbiBga2V5c2AgYW5kIGB2YWx1ZXNgLgogCisgIEBjbGFz
cyBNYXAKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAcHJpdmF0ZQorICBAY29uc3RydWN0b3IKKyov
Cit2YXIgTWFwID0gRW1iZXIuTWFwID0gZnVuY3Rpb24oKSB7CisgIHRoaXMua2V5cyA9IEVtYmVy
Lk9yZGVyZWRTZXQuY3JlYXRlKCk7CisgIHRoaXMudmFsdWVzID0ge307Cit9OwogCi0oZnVuY3Rp
b24oKSB7CiAvKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKKyAgQG1ldGhvZCBjcmVhdGUKKyAgQHN0
YXRpYwogKi8KK01hcC5jcmVhdGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBNYXAoKTsK
K307CiAKLXZhciBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwgLy8gdXRpbHMuanMKLSAgICBtZXRh
Rm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMuanMKLSAgICBnZXQgPSBFbWJlci5nZXQsIC8vIGFj
Y2Vzc29ycy5qcwotICAgIHNldCA9IEVtYmVyLnNldCwgLy8gYWNjZXNzb3JzLmpzCi0gICAgbm9y
bWFsaXplVHVwbGUgPSBFbWJlci5ub3JtYWxpemVUdXBsZSwgLy8gYWNjZXNzb3JzLmpzCi0gICAg
R1VJRF9LRVkgPSBFbWJlci5HVUlEX0tFWSwgLy8gdXRpbHMuanMKLSAgICBNRVRBX0tFWSA9IEVt
YmVyLk1FVEFfS0VZLCAvLyB1dGlscy5qcwotICAgIC8vIGNpcmN1bGFyIHJlZmVyZW5jZSBvYnNl
cnZlciBkZXBlbmRzIG9uIEVtYmVyLndhdGNoCi0gICAgLy8gd2Ugc2hvdWxkIG1vdmUgY2hhbmdl
IGV2ZW50cyB0byB0aGlzIGZpbGUgb3IgaXRzIG93biBwcm9wZXJ0eV9ldmVudHMuanMKLSAgICBu
b3RpZnlPYnNlcnZlcnMgPSBFbWJlci5ub3RpZnlPYnNlcnZlcnMsIC8vIG9ic2VydmVyLmpzCi0g
ICAgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2gsIC8vIGFycmF5LmpzCi0g
ICAgRklSU1RfS0VZID0gL14oW15cLlwqXSspLywKLSAgICBJU19QQVRIID0gL1tcLlwqXS87Ci0K
LXZhciBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIsCi1vX2Rl
ZmluZVByb3BlcnR5ID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHk7Ci0KLWZ1bmN0aW9u
IGZpcnN0S2V5KHBhdGgpIHsKLSAgcmV0dXJuIHBhdGgubWF0Y2goRklSU1RfS0VZKVswXTsKLX0K
K01hcC5wcm90b3R5cGUgPSB7CisgIC8qKgorICAgIFRoaXMgcHJvcGVydHkgd2lsbCBjaGFuZ2Ug
YXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBtYXAgY2hhbmdlcy4KKyAgIAorICAgIEBw
cm9wZXJ0eSBsZW5ndGgKKyAgICBAdHlwZSBudW1iZXIKKyAgICBAZGVmYXVsdCAwCisgICovCisg
IGxlbmd0aDogMCwKKyAgICAKKyAgICAKKyAgLyoqCisgICAgUmV0cmlldmUgdGhlIHZhbHVlIGFz
c29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS4KIAotLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNz
ZWQgcGF0aCBpcyBqdXN0IGEga2V5TmFtZQotZnVuY3Rpb24gaXNLZXlOYW1lKHBhdGgpIHsKLSAg
cmV0dXJuIHBhdGg9PT0nKicgfHwgIUlTX1BBVEgudGVzdChwYXRoKTsKLX0KKyAgICBAbWV0aG9k
IGdldAorICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgQHJldHVybiB7Kn0gdGhlIHZhbHVlIGFzc29j
aWF0ZWQgd2l0aCB0aGUga2V5LCBvciBgdW5kZWZpbmVkYAorICAqLworICBnZXQ6IGZ1bmN0aW9u
KGtleSkgeworICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKKyAgICAgICAgZ3VpZCA9IGd1
aWRGb3Ioa2V5KTsKIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVQRU5ERU5UIEtFWVMKLS8vCisgICAgcmV0dXJuIHZh
bHVlc1tndWlkXTsKKyAgfSwKIAotZnVuY3Rpb24gaXRlckRlcHMobWV0aG9kLCBvYmosIGRlcEtl
eSwgc2VlbiwgbWV0YSkgeworICAvKioKKyAgICBBZGRzIGEgdmFsdWUgdG8gdGhlIG1hcC4gSWYg
YSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBoYXMgYWxyZWFkeSBiZWVuCisgICAgcHJvdmlkZWQs
IHRoZSBuZXcgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSBvbGQgdmFsdWUuCiAKLSAgdmFyIGd1aWQg
PSBndWlkRm9yKG9iaik7Ci0gIGlmICghc2VlbltndWlkXSkgc2VlbltndWlkXSA9IHt9OwotICBp
ZiAoc2VlbltndWlkXVtkZXBLZXldKSByZXR1cm47Ci0gIHNlZW5bZ3VpZF1bZGVwS2V5XSA9IHRy
dWU7CisgICAgQG1ldGhvZCBzZXQKKyAgICBAcGFyYW0geyp9IGtleQorICAgIEBwYXJhbSB7Kn0g
dmFsdWUKKyAgKi8KKyAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgdmFyIGtleXMg
PSB0aGlzLmtleXMsCisgICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLAorICAgICAgICBndWlk
ID0gZ3VpZEZvcihrZXkpOwogCi0gIHZhciBkZXBzID0gbWV0YS5kZXBzOwotICBkZXBzID0gZGVw
cyAmJiBkZXBzW2RlcEtleV07Ci0gIGlmIChkZXBzKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gZGVw
cykgewotICAgICAgdmFyIGRlc2MgPSBtZXRhLmRlc2NzW2tleV07Ci0gICAgICBpZiAoZGVzYyAm
JiBkZXNjLl9zdXNwZW5kZWQgPT09IG9iaikgY29udGludWU7Ci0gICAgICBtZXRob2Qob2JqLCBr
ZXkpOwotICAgIH0KLSAgfQotfQorICAgIGtleXMuYWRkKGtleSk7CisgICAgdmFsdWVzW2d1aWRd
ID0gdmFsdWU7CisgICAgc2V0KHRoaXMsICdsZW5ndGgnLCBrZXlzLmxpc3QubGVuZ3RoKTsKKyAg
fSwKIAorICAvKioKKyAgICBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbWFwIGZvciBhbiBhc3Nv
Y2lhdGVkIGtleS4KIAotdmFyIFdJTExfU0VFTiwgRElEX1NFRU47CisgICAgQG1ldGhvZCByZW1v
dmUKKyAgICBAcGFyYW0geyp9IGtleQorICAgIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgYW4g
aXRlbSB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICovCisgIHJlbW92ZTogZnVuY3Rp
b24oa2V5KSB7CisgICAgLy8gZG9uJ3QgdXNlIEVTNiAiZGVsZXRlIiBiZWNhdXNlIGl0IHdpbGwg
YmUgYW5ub3lpbmcKKyAgICAvLyB0byB1c2UgaW4gYnJvd3NlcnMgdGhhdCBhcmUgbm90IEVTNiBm
cmllbmRseTsKKyAgICB2YXIga2V5cyA9IHRoaXMua2V5cywKKyAgICAgICAgdmFsdWVzID0gdGhp
cy52YWx1ZXMsCisgICAgICAgIGd1aWQgPSBndWlkRm9yKGtleSk7CiAKLS8vIGNhbGxlZCB3aGVu
ZXZlciBhIHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZSB0byBjbGVhciB0aGUgY2FjaGUgb2Yg
YW55IGRlcGVuZGVudCBrZXlzIChhbmQgbm90aWZ5IHRob3NlIHByb3BlcnRpZXMgb2YgY2hhbmdl
cywgZXRjLi4uKQotZnVuY3Rpb24gZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBkZXBLZXks
IG1ldGEpIHsKLSAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9CisgICAgaWYgKHZh
bHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgeworICAgICAga2V5cy5yZW1vdmUoa2V5KTsKKyAg
ICAgIGRlbGV0ZSB2YWx1ZXNbZ3VpZF07CisgICAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGtleXMu
bGlzdC5sZW5ndGgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisgIH0sCiAKLSAgdmFyIHNlZW4gPSBXSUxMX1NFRU4sIHRvcCA9
ICFzZWVuOwotICBpZiAodG9wKSB7IHNlZW4gPSBXSUxMX1NFRU4gPSB7fTsgfQotICBpdGVyRGVw
cyhwcm9wZXJ0eVdpbGxDaGFuZ2UsIG9iaiwgZGVwS2V5LCBzZWVuLCBtZXRhKTsKLSAgaWYgKHRv
cCkgeyBXSUxMX1NFRU4gPSBudWxsOyB9Ci19CisgIC8qKgorICAgIENoZWNrIHdoZXRoZXIgYSBr
ZXkgaXMgcHJlc2VudC4KIAotLy8gY2FsbGVkIHdoZW5ldmVyIGEgcHJvcGVydHkgaGFzIGp1c3Qg
Y2hhbmdlZCB0byB1cGRhdGUgZGVwZW5kZW50IGtleXMKLWZ1bmN0aW9uIGRlcGVuZGVudEtleXNE
aWRDaGFuZ2Uob2JqLCBkZXBLZXksIG1ldGEpIHsKLSAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsg
cmV0dXJuOyB9CisgICAgQG1ldGhvZCBoYXMKKyAgICBAcGFyYW0geyp9IGtleQorICAgIEByZXR1
cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gd2FzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lz
ZQorICAqLworICBoYXM6IGZ1bmN0aW9uKGtleSkgeworICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZh
bHVlcywKKyAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKIAotICB2YXIgc2VlbiA9IERJRF9T
RUVOLCB0b3AgPSAhc2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0gRElEX1NFRU4gPSB7fTsgfQot
ICBpdGVyRGVwcyhwcm9wZXJ0eURpZENoYW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOwot
ICBpZiAodG9wKSB7IERJRF9TRUVOID0gbnVsbDsgfQotfQorICAgIHJldHVybiB2YWx1ZXMuaGFz
T3duUHJvcGVydHkoZ3VpZCk7CisgIH0sCiAKLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIENIQUlOCi0vLworICAvKioKKyAg
ICBJdGVyYXRlIG92ZXIgYWxsIHRoZSBrZXlzIGFuZCB2YWx1ZXMuIENhbGxzIHRoZSBmdW5jdGlv
biBvbmNlCisgICAgZm9yIGVhY2gga2V5LCBwYXNzaW5nIGluIHRoZSBrZXkgYW5kIHZhbHVlLCBp
biB0aGF0IG9yZGVyLgogCi1mdW5jdGlvbiBhZGRDaGFpbldhdGNoZXIob2JqLCBrZXlOYW1lLCBu
b2RlKSB7Ci0gIGlmICghb2JqIHx8ICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaikpIHsgcmV0dXJu
OyB9IC8vIG5vdGhpbmcgdG8gZG8KKyAgICBUaGUga2V5cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBp
dGVyYXRlZCBvdmVyIGluIGluc2VydGlvbiBvcmRlci4KIAotICB2YXIgbSA9IG1ldGFGb3Iob2Jq
KSwgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnM7CisgICAgQG1ldGhvZCBmb3JFYWNoCisgICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcGFyYW0geyp9IHNlbGYgaWYgcGFzc2VkLCB0
aGUgYHRoaXNgIHZhbHVlIGluc2lkZSB0aGUKKyAgICAgIGNhbGxiYWNrLiBCeSBkZWZhdWx0LCBg
dGhpc2AgaXMgdGhlIG1hcC4KKyAgKi8KKyAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHNl
bGYpIHsKKyAgICB2YXIga2V5cyA9IHRoaXMua2V5cywKKyAgICAgICAgdmFsdWVzID0gdGhpcy52
YWx1ZXM7CiAKLSAgaWYgKCFtLmhhc093blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykpIHsKLSAg
ICBub2RlcyA9IG0uY2hhaW5XYXRjaGVycyA9IHt9OworICAgIGtleXMuZm9yRWFjaChmdW5jdGlv
bihrZXkpIHsKKyAgICAgIHZhciBndWlkID0gZ3VpZEZvcihrZXkpOworICAgICAgY2FsbGJhY2su
Y2FsbChzZWxmLCBrZXksIHZhbHVlc1tndWlkXSk7CisgICAgfSk7CisgIH0sCisKKyAgLyoqCisg
ICAgQG1ldGhvZCBjb3B5CisgICAgQHJldHVybiB7RW1iZXIuTWFwfQorICAqLworICBjb3B5OiBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gY29weU1hcCh0aGlzLCBuZXcgTWFwKCkpOwogICB9Cit9
OwogCi0gIGlmICghbm9kZXNba2V5TmFtZV0pIHsgbm9kZXNba2V5TmFtZV0gPSBbXTsgfQotICBu
b2Rlc1trZXlOYW1lXS5wdXNoKG5vZGUpOwotICBFbWJlci53YXRjaChvYmosIGtleU5hbWUpOwot
fQorLyoqCisgIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBl
eHRlbmRzIEVtYmVyLk1hcAorICBAcHJpdmF0ZQorICBAY29uc3RydWN0b3IKKyAgQHBhcmFtIFtv
cHRpb25zXQorICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQorKi8KK3ZhciBN
YXBXaXRoRGVmYXVsdCA9IEVtYmVyLk1hcFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ob3B0aW9ucykg
eworICBNYXAuY2FsbCh0aGlzKTsKKyAgdGhpcy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1
bHRWYWx1ZTsKK307CiAKLWZ1bmN0aW9uIHJlbW92ZUNoYWluV2F0Y2hlcihvYmosIGtleU5hbWUs
IG5vZGUpIHsKLSAgaWYgKCFvYmogfHwgJ29iamVjdCcgIT09IHR5cGVvZiBvYmopIHsgcmV0dXJu
OyB9IC8vIG5vdGhpbmcgdG8gZG8KKy8qKgorICBAbWV0aG9kIGNyZWF0ZQorICBAc3RhdGljCisg
IEBwYXJhbSBbb3B0aW9uc10KKyAgICBAcGFyYW0geyp9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV0K
KyAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIuTWFwfSBJZiBvcHRpb25zIGFy
ZSBwYXNzZWQsIHJldHVybnMKKyAgICBgRW1iZXIuTWFwV2l0aERlZmF1bHRgIG90aGVyd2lzZSBy
ZXR1cm5zIGBFbWJlci5NYXBgCisqLworTWFwV2l0aERlZmF1bHQuY3JlYXRlID0gZnVuY3Rpb24o
b3B0aW9ucykgeworICBpZiAob3B0aW9ucykgeworICAgIHJldHVybiBuZXcgTWFwV2l0aERlZmF1
bHQob3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBNYXAoKTsKKyAgfQorfTsK
IAotICB2YXIgbSA9IG1ldGFGb3Iob2JqLCBmYWxzZSk7Ci0gIGlmICghbS5oYXNPd25Qcm9wZXJ0
eSgnY2hhaW5XYXRjaGVycycpKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCitNYXBXaXRo
RGVmYXVsdC5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoTWFwLnByb3RvdHlwZSk7CiAKLSAgdmFy
IG5vZGVzID0gbS5jaGFpbldhdGNoZXJzOworLyoqCisgIFJldHJpZXZlIHRoZSB2YWx1ZSBhc3Nv
Y2lhdGVkIHdpdGggYSBnaXZlbiBrZXkuCiAKLSAgaWYgKG5vZGVzW2tleU5hbWVdKSB7Ci0gICAg
bm9kZXMgPSBub2Rlc1trZXlOYW1lXTsKLSAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxl
bmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgaWYgKG5vZGVzW2ldID09PSBub2RlKSB7IG5vZGVz
LnNwbGljZShpLCAxKTsgfQotICAgIH0KKyAgQG1ldGhvZCBnZXQKKyAgQHBhcmFtIHsqfSBrZXkK
KyAgQHJldHVybiB7Kn0gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciB0aGUg
ZGVmYXVsdCB2YWx1ZQorKi8KK01hcFdpdGhEZWZhdWx0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlv
bihrZXkpIHsKKyAgdmFyIGhhc1ZhbHVlID0gdGhpcy5oYXMoa2V5KTsKKworICBpZiAoaGFzVmFs
dWUpIHsKKyAgICByZXR1cm4gTWFwLnByb3RvdHlwZS5nZXQuY2FsbCh0aGlzLCBrZXkpOworICB9
IGVsc2UgeworICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZShrZXkpOwor
ICAgIHRoaXMuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKyAgICByZXR1cm4gZGVmYXVsdFZhbHVl
OwogICB9Ci0gIEVtYmVyLnVud2F0Y2gob2JqLCBrZXlOYW1lKTsKLX0KK307CiAKLXZhciBwZW5k
aW5nUXVldWUgPSBbXTsKKy8qKgorICBAbWV0aG9kIGNvcHkKKyAgQHJldHVybiB7RW1iZXIuTWFw
V2l0aERlZmF1bHR9CisqLworTWFwV2l0aERlZmF1bHQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlv
bigpIHsKKyAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IE1hcFdpdGhEZWZhdWx0KHsKKyAgICBk
ZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlCisgIH0pKTsKK307CiAKLS8vIGF0dGVtcHRz
IHRvIGFkZCB0aGUgcGVuZGluZ1F1ZXVlIGNoYWlucyBhZ2Fpbi4gSWYgc29tZSBvZiB0aGVtIGVu
ZCB1cAotLy8gYmFjayBpbiB0aGUgcXVldWUgYW5kIHJlc2NoZWR1bGUgaXMgdHJ1ZSwgc2NoZWR1
bGVzIGEgdGltZW91dCB0byB0cnkKLS8vIGFnYWluLgotZnVuY3Rpb24gZmx1c2hQZW5kaW5nQ2hh
aW5zKCkgewotICBpZiAocGVuZGluZ1F1ZXVlLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH0gLy8g
bm90aGluZyB0byBkbworfSkoKTsKIAotICB2YXIgcXVldWUgPSBwZW5kaW5nUXVldWU7Ci0gIHBl
bmRpbmdRdWV1ZSA9IFtdOwogCi0gIGZvckVhY2guY2FsbChxdWV1ZSwgZnVuY3Rpb24ocSkgeyBx
WzBdLmFkZChxWzFdKTsgfSk7CiAKLSAgRW1iZXIud2FybignV2F0Y2hpbmcgYW4gdW5kZWZpbmVk
IGdsb2JhbCwgRW1iZXIgZXhwZWN0cyB3YXRjaGVkIGdsb2JhbHMgdG8gYmUgc2V0dXAgYnkgdGhl
IHRpbWUgdGhlIHJ1biBsb29wIGlzIGZsdXNoZWQsIGNoZWNrIGZvciB0eXBvcycsIHBlbmRpbmdR
dWV1ZS5sZW5ndGggPT09IDApOworKGZ1bmN0aW9uKCkgeworZnVuY3Rpb24gY29uc29sZU1ldGhv
ZChuYW1lKSB7CisgIHZhciBjb25zb2xlT2JqLCBsb2dUb0NvbnNvbGU7CisgIGlmIChFbWJlci5p
bXBvcnRzLmNvbnNvbGUpIHsKKyAgICBjb25zb2xlT2JqID0gRW1iZXIuaW1wb3J0cy5jb25zb2xl
OworICB9IGVsc2UgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgIGNv
bnNvbGVPYmogPSBjb25zb2xlOworICB9CisKKyAgdmFyIG1ldGhvZCA9IHR5cGVvZiBjb25zb2xl
T2JqID09PSAnb2JqZWN0JyA/IGNvbnNvbGVPYmpbbmFtZV0gOiBudWxsOworCisgIGlmIChtZXRo
b2QpIHsKKyAgICAvLyBPbGRlciBJRSBkb2Vzbid0IHN1cHBvcnQgYXBwbHksIGJ1dCBDaHJvbWUg
bmVlZHMgaXQKKyAgICBpZiAobWV0aG9kLmFwcGx5KSB7CisgICAgICBsb2dUb0NvbnNvbGUgPSBm
dW5jdGlvbigpIHsKKyAgICAgICAgbWV0aG9kLmFwcGx5KGNvbnNvbGVPYmosIGFyZ3VtZW50cyk7
CisgICAgICB9OworICAgICAgbG9nVG9Db25zb2xlLmRpc3BsYXlOYW1lID0gJ2NvbnNvbGUuJyAr
IG5hbWU7CisgICAgICByZXR1cm4gbG9nVG9Db25zb2xlOworICAgIH0gZWxzZSB7CisgICAgICBy
ZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gQXJyYXkucHJvdG90eXBl
LmpvaW4uY2FsbChhcmd1bWVudHMsICcsICcpOworICAgICAgICBtZXRob2QobWVzc2FnZSk7Cisg
ICAgICB9OworICAgIH0KKyAgfQogfQogCi1mdW5jdGlvbiBpc1Byb3RvKHB2YWx1ZSkgewotICBy
ZXR1cm4gbWV0YUZvcihwdmFsdWUsIGZhbHNlKS5wcm90byA9PT0gcHZhbHVlOworZnVuY3Rpb24g
YXNzZXJ0UG9seWZpbGwodGVzdCwgbWVzc2FnZSkgeworICBpZiAoIXRlc3QpIHsKKyAgICB0cnkg
eworICAgICAgLy8gYXR0ZW1wdCB0byBwcmVzZXJ2ZSB0aGUgc3RhY2sKKyAgICAgIHRocm93IG5l
dyBFbWJlci5FcnJvcigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOworICAgIH0gY2F0
Y2goZXJyb3IpIHsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgIHRocm93
IGVycm9yOworICAgICAgfSwgMCk7CisgICAgfQorICB9CiB9CiAKLS8vIEEgQ2hhaW5Ob2RlIHdh
dGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBzdGFydGlu
ZwotLy8gdmFsdWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3b24ndCBhY3R1YWxseSB3YXRj
aCBpdC4gRm9yIGEgcm9vdCBub2RlCi0vLyBwYXNzIG51bGwgZm9yIHBhcmVudCBhbmQga2V5IGFu
ZCBvYmplY3QgZm9yIHZhbHVlLgotdmFyIENoYWluTm9kZSA9IGZ1bmN0aW9uKHBhcmVudCwga2V5
LCB2YWx1ZSkgewotICB2YXIgb2JqOwotICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7Ci0gIHRoaXMu
X2tleSAgICA9IGtleTsKKy8qKgorICBJbnNpZGUgRW1iZXItTWV0YWwsIHNpbXBseSB1c2VzIHRo
ZSBtZXRob2RzIGZyb20gYGltcG9ydHMuY29uc29sZWAuCisgIE92ZXJyaWRlIHRoaXMgdG8gcHJv
dmlkZSBtb3JlIHJvYnVzdCBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkuCiAKLSAgLy8gX3dhdGNoaW5n
IGlzIHRydWUgd2hlbiBjYWxsaW5nIGdldCh0aGlzLl9wYXJlbnQsIHRoaXMuX2tleSkgd2lsbAot
ICAvLyByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4KLSAgLy8KLSAgLy8gSXQgaXMgZmFs
c2UgZm9yIHRoZSByb290IG9mIGEgY2hhaW4gKGJlY2F1c2Ugd2UgaGF2ZSBubyBwYXJlbnQpCi0g
IC8vIGFuZCBmb3IgZ2xvYmFsIHBhdGhzIChiZWNhdXNlIHRoZSBwYXJlbnQgbm9kZSBpcyB0aGUg
b2JqZWN0IHdpdGgKLSAgLy8gdGhlIG9ic2VydmVyIG9uIGl0KQotICB0aGlzLl93YXRjaGluZyA9
IHZhbHVlPT09dW5kZWZpbmVkOworICBAY2xhc3MgTG9nZ2VyCisgIEBuYW1lc3BhY2UgRW1iZXIK
KyovCitFbWJlci5Mb2dnZXIgPSB7CisgIC8qKgorICAgTG9ncyB0aGUgYXJndW1lbnRzIHRvIHRo
ZSBjb25zb2xlLgorICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50
IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KIAotICB0aGlz
Ll92YWx1ZSAgPSB2YWx1ZTsKLSAgdGhpcy5fcGF0aHMgPSB7fTsKLSAgaWYgKHRoaXMuX3dhdGNo
aW5nKSB7Ci0gICAgdGhpcy5fb2JqZWN0ID0gcGFyZW50LnZhbHVlKCk7Ci0gICAgaWYgKHRoaXMu
X29iamVjdCkgeyBhZGRDaGFpbldhdGNoZXIodGhpcy5fb2JqZWN0LCB0aGlzLl9rZXksIHRoaXMp
OyB9Ci0gIH0KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGZvbyA9IDE7CisgICAgRW1iZXIu
TG9nZ2VyLmxvZygnbG9nIHZhbHVlIG9mIGZvbzonLCBmb28pOyAvLyAibG9nIHZhbHVlIG9mIGZv
bzogMSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlCisgICAgYGBgCiAKLSAgLy8gU3Bl
Y2lhbC1jYXNlOiB0aGUgRWFjaFByb3h5IHJlbGllcyBvbiBpbW1lZGlhdGUgZXZhbHVhdGlvbiB0
bwotICAvLyBlc3RhYmxpc2ggaXRzIG9ic2VydmVycy4KLSAgLy8KLSAgLy8gVE9ETzogUmVwbGFj
ZSB0aGlzIHdpdGggYW4gZWZmaWNpZW50IGNhbGxiYWNrIHRoYXQgdGhlIEVhY2hQcm94eQotICAv
LyBjYW4gaW1wbGVtZW50LgotICBpZiAodGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fa2V5
ID09PSAnQGVhY2gnKSB7Ci0gICAgdGhpcy52YWx1ZSgpOwotICB9Ci19OworICAgQG1ldGhvZCBs
b2cKKyAgIEBmb3IgRW1iZXIuTG9nZ2VyCisgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAqLwor
ICBsb2c6ICAgY29uc29sZU1ldGhvZCgnbG9nJykgICB8fCBFbWJlci5LLAogCi12YXIgQ2hhaW5O
b2RlUHJvdG90eXBlID0gQ2hhaW5Ob2RlLnByb3RvdHlwZTsKKyAgLyoqCisgICBQcmludHMgdGhl
IGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRoIGEgd2FybmluZyBpY29uLgorICAgWW91IGNh
biBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9p
bmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KIAotQ2hhaW5Ob2RlUHJvdG90eXBlLnZhbHVlID0g
ZnVuY3Rpb24oKSB7Ci0gIGlmICh0aGlzLl92YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dh
dGNoaW5nKSB7Ci0gICAgdmFyIG9iaiA9IHRoaXMuX3BhcmVudC52YWx1ZSgpOwotICAgIHRoaXMu
X3ZhbHVlID0gKG9iaiAmJiAhaXNQcm90byhvYmopKSA/IGdldChvYmosIHRoaXMuX2tleSkgOiB1
bmRlZmluZWQ7Ci0gIH0KLSAgcmV0dXJuIHRoaXMuX3ZhbHVlOwotfTsKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuTG9nZ2VyLndhcm4oJ1NvbWV0aGluZyBoYXBwZW5lZCEnKTsgLy8gIlNv
bWV0aGluZyBoYXBwZW5lZCEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSB3aXRoIGEg
d2FybmluZyBpY29uLgorICAgIGBgYAogCi1DaGFpbk5vZGVQcm90b3R5cGUuZGVzdHJveSA9IGZ1
bmN0aW9uKCkgewotICBpZiAodGhpcy5fd2F0Y2hpbmcpIHsKLSAgICB2YXIgb2JqID0gdGhpcy5f
b2JqZWN0OwotICAgIGlmIChvYmopIHsgcmVtb3ZlQ2hhaW5XYXRjaGVyKG9iaiwgdGhpcy5fa2V5
LCB0aGlzKTsgfQotICAgIHRoaXMuX3dhdGNoaW5nID0gZmFsc2U7IC8vIHNvIGZ1dHVyZSBjYWxs
cyBkbyBub3RoaW5nCi0gIH0KLX07CisgICBAbWV0aG9kIHdhcm4KKyAgIEBmb3IgRW1iZXIuTG9n
Z2VyCisgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAqLworICB3YXJuOiAgY29uc29sZU1ldGhv
ZCgnd2FybicpICB8fCBFbWJlci5LLAogCi0vLyBjb3BpZXMgYSB0b3AgbGV2ZWwgb2JqZWN0IG9u
bHkKLUNoYWluTm9kZVByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHZhciByZXQg
PSBuZXcgQ2hhaW5Ob2RlKG51bGwsIG51bGwsIG9iaiksCi0gICAgICBwYXRocyA9IHRoaXMuX3Bh
dGhzLCBwYXRoOwotICBmb3IgKHBhdGggaW4gcGF0aHMpIHsKLSAgICBpZiAocGF0aHNbcGF0aF0g
PD0gMCkgeyBjb250aW51ZTsgfSAvLyB0aGlzIGNoZWNrIHdpbGwgYWxzbyBjYXRjaCBub24tbnVt
YmVyIHZhbHMuCi0gICAgcmV0LmFkZChwYXRoKTsKLSAgfQotICByZXR1cm4gcmV0OwotfTsKKyAg
LyoqCisgICBQcmludHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRoIGFuIGVycm9y
IGljb24sIHJlZCB0ZXh0IGFuZCBhIHN0YWNrIHRyYWNlLgorICAgWW91IGNhbiBwYXNzIGFzIG1h
bnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVy
IHdpdGggYSBzcGFjZS4KIAotLy8gY2FsbGVkIG9uIHRoZSByb290IG5vZGUgb2YgYSBjaGFpbiB0
byBzZXR1cCB3YXRjaGVycyBvbiB0aGUgc3BlY2lmaWVkCi0vLyBwYXRoLgotQ2hhaW5Ob2RlUHJv
dG90eXBlLmFkZCA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgdmFyIG9iaiwgdHVwbGUsIGtleSwgc3Jj
LCBwYXRoczsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuTG9nZ2VyLmVycm9yKCdEYW5n
ZXIhIERhbmdlciEnKTsgLy8gIkRhbmdlciEgRGFuZ2VyISIgd2lsbCBiZSBwcmludGVkIHRvIHRo
ZSBjb25zb2xlIGluIHJlZCB0ZXh0LgorICAgIGBgYAogCi0gIHBhdGhzID0gdGhpcy5fcGF0aHM7
Ci0gIHBhdGhzW3BhdGhdID0gKHBhdGhzW3BhdGhdIHx8IDApICsgMTsKKyAgIEBtZXRob2QgZXJy
b3IKKyAgIEBmb3IgRW1iZXIuTG9nZ2VyCisgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAqLwor
ICBlcnJvcjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBFbWJlci5LLAogCi0gIG9iaiA9IHRo
aXMudmFsdWUoKTsKLSAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgpOworICAvKioK
KyAgIExvZ3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZS4KKyAgIFlvdSBjYW4gcGFzcyBh
cyBtYW55IGFyZ3VtZW50cyBhcyB5b3Ugd2FudCBhbmQgdGhleSB3aWxsIGJlIGpvaW5lZCB0b2dl
dGhlciB3aXRoIGEgc3BhY2UuCiAKLSAgLy8gdGhlIHBhdGggd2FzIGEgbG9jYWwgcGF0aAotICBp
ZiAodHVwbGVbMF0gJiYgdHVwbGVbMF0gPT09IG9iaikgewotICAgIHBhdGggPSB0dXBsZVsxXTsK
LSAgICBrZXkgID0gZmlyc3RLZXkocGF0aCk7Ci0gICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxl
bmd0aCsxKTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGZvbyA9IDE7CisgICAgRW1iZXIu
TG9nZ2VyLmluZm8oJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBm
b286IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZQorICAgIGBgYAogCi0gIC8vIGds
b2JhbCBwYXRoLCBidXQgb2JqZWN0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgLy8gcHV0IGludG8g
YSBxdWV1ZSBhbmQgdHJ5IHRvIGNvbm5lY3QgbGF0ZXIuCi0gIH0gZWxzZSBpZiAoIXR1cGxlWzBd
KSB7Ci0gICAgcGVuZGluZ1F1ZXVlLnB1c2goW3RoaXMsIHBhdGhdKTsKLSAgICB0dXBsZS5sZW5n
dGggPSAwOwotICAgIHJldHVybjsKLQotICAvLyBnbG9iYWwgcGF0aCwgYW5kIG9iamVjdCBhbHJl
YWR5IGV4aXN0cwotICB9IGVsc2UgewotICAgIHNyYyAgPSB0dXBsZVswXTsKLSAgICBrZXkgID0g
cGF0aC5zbGljZSgwLCAwLSh0dXBsZVsxXS5sZW5ndGgrMSkpOwotICAgIHBhdGggPSB0dXBsZVsx
XTsKLSAgfQotCi0gIHR1cGxlLmxlbmd0aCA9IDA7Ci0gIHRoaXMuY2hhaW4oa2V5LCBwYXRoLCBz
cmMpOwotfTsKLQotLy8gY2FsbGVkIG9uIHRoZSByb290IG5vZGUgb2YgYSBjaGFpbiB0byB0ZWFy
ZG93biB3YXRjaGVyIG9uIHRoZSBzcGVjaWZpZWQKLS8vIHBhdGgKLUNoYWluTm9kZVByb3RvdHlw
ZS5yZW1vdmUgPSBmdW5jdGlvbihwYXRoKSB7Ci0gIHZhciBvYmosIHR1cGxlLCBrZXksIHNyYywg
cGF0aHM7Ci0KLSAgcGF0aHMgPSB0aGlzLl9wYXRoczsKLSAgaWYgKHBhdGhzW3BhdGhdID4gMCkg
eyBwYXRoc1twYXRoXS0tOyB9CisgICBAbWV0aG9kIGluZm8KKyAgIEBmb3IgRW1iZXIuTG9nZ2Vy
CisgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAqLworICBpbmZvOiAgY29uc29sZU1ldGhvZCgn
aW5mbycpICB8fCBFbWJlci5LLAogCi0gIG9iaiA9IHRoaXMudmFsdWUoKTsKLSAgdHVwbGUgPSBu
b3JtYWxpemVUdXBsZShvYmosIHBhdGgpOwotICBpZiAodHVwbGVbMF0gPT09IG9iaikgewotICAg
IHBhdGggPSB0dXBsZVsxXTsKLSAgICBrZXkgID0gZmlyc3RLZXkocGF0aCk7Ci0gICAgcGF0aCA9
IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKLSAgfSBlbHNlIHsKLSAgICBzcmMgID0gdHVwbGVb
MF07Ci0gICAga2V5ICA9IHBhdGguc2xpY2UoMCwgMC0odHVwbGVbMV0ubGVuZ3RoKzEpKTsKLSAg
ICBwYXRoID0gdHVwbGVbMV07Ci0gIH0KKyAgLyoqCisgICBMb2dzIHRoZSBhcmd1bWVudHMgdG8g
dGhlIGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgorICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1l
bnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBz
cGFjZS4KIAotICB0dXBsZS5sZW5ndGggPSAwOwotICB0aGlzLnVuY2hhaW4oa2V5LCBwYXRoKTsK
LX07CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBmb28gPSAxOworICAgIEVtYmVyLkxvZ2dl
ci5kZWJ1ZygnbG9nIHZhbHVlIG9mIGZvbzonLCBmb28pOyAvLyAibG9nIHZhbHVlIG9mIGZvbzog
MSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlCisgICAgYGBgCiAKLUNoYWluTm9kZVBy
b3RvdHlwZS5jb3VudCA9IDA7CisgICBAbWV0aG9kIGRlYnVnCisgICBAZm9yIEVtYmVyLkxvZ2dl
cgorICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKKyAgKi8KKyAgZGVidWc6IGNvbnNvbGVNZXRob2Qo
J2RlYnVnJykgfHwgY29uc29sZU1ldGhvZCgnaW5mbycpIHx8IEVtYmVyLkssCiAKLUNoYWluTm9k
ZVByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGtleSwgcGF0aCwgc3JjKSB7Ci0gIHZhciBjaGFp
bnMgPSB0aGlzLl9jaGFpbnMsIG5vZGU7Ci0gIGlmICghY2hhaW5zKSB7IGNoYWlucyA9IHRoaXMu
X2NoYWlucyA9IHt9OyB9CisgIC8qKgorICAgSWYgdGhlIHZhbHVlIHBhc3NlZCBpbnRvIGBFbWJl
ci5Mb2dnZXIuYXNzZXJ0YCBpcyBub3QgdHJ1dGh5IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3Igd2l0
aCBhIHN0YWNrIHRyYWNlLgogCi0gIG5vZGUgPSBjaGFpbnNba2V5XTsKLSAgaWYgKCFub2RlKSB7
IG5vZGUgPSBjaGFpbnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCBzcmMpOyB9Ci0g
IG5vZGUuY291bnQrKzsgLy8gY291bnQgY2hhaW5zLi4uCisgICAgYGBgamF2YXNjcmlwdAorICAg
IEVtYmVyLkxvZ2dlci5hc3NlcnQodHJ1ZSk7IC8vIHVuZGVmaW5lZAorICAgIEVtYmVyLkxvZ2dl
ci5hc3NlcnQodHJ1ZSA9PT0gZmFsc2UpOyAvLyBUaHJvd3MgYW4gQXNzZXJ0aW9uIGZhaWxlZCBl
cnJvci4KKyAgICBgYGAKIAotICAvLyBjaGFpbiByZXN0IG9mIHBhdGggaWYgdGhlcmUgaXMgb25l
Ci0gIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoPjApIHsKLSAgICBrZXkgPSBmaXJzdEtleShwYXRo
KTsKLSAgICBwYXRoID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICAgIG5vZGUuY2hhaW4o
a2V5LCBwYXRoKTsgLy8gTk9URTogbm8gc3JjIG1lYW5zIGl0IHdpbGwgb2JzZXJ2ZSBjaGFuZ2Vz
Li4uCi0gIH0KKyAgIEBtZXRob2QgYXNzZXJ0CisgICBAZm9yIEVtYmVyLkxvZ2dlcgorICAgQHBh
cmFtIHtCb29sZWFufSBib29sIFZhbHVlIHRvIHRlc3QKKyAgKi8KKyAgYXNzZXJ0OiBjb25zb2xl
TWV0aG9kKCdhc3NlcnQnKSB8fCBhc3NlcnRQb2x5ZmlsbAogfTsKIAotQ2hhaW5Ob2RlUHJvdG90
eXBlLnVuY2hhaW4gPSBmdW5jdGlvbihrZXksIHBhdGgpIHsKLSAgdmFyIGNoYWlucyA9IHRoaXMu
X2NoYWlucywgbm9kZSA9IGNoYWluc1trZXldOwotCi0gIC8vIHVuY2hhaW4gcmVzdCBvZiBwYXRo
IGZpcnN0Li4uCi0gIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoPjEpIHsKLSAgICBrZXkgID0gZmly
c3RLZXkocGF0aCk7Ci0gICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKLSAgICBu
b2RlLnVuY2hhaW4oa2V5LCBwYXRoKTsKLSAgfQogCi0gIC8vIGRlbGV0ZSBub2RlIGlmIG5lZWRl
ZC4KLSAgbm9kZS5jb3VudC0tOwotICBpZiAobm9kZS5jb3VudDw9MCkgewotICAgIGRlbGV0ZSBj
aGFpbnNbbm9kZS5fa2V5XTsKLSAgICBub2RlLmRlc3Ryb3koKTsKLSAgfQorfSkoKTsKIAotfTsK
IAotQ2hhaW5Ob2RlUHJvdG90eXBlLndpbGxDaGFuZ2UgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGNo
YWlucyA9IHRoaXMuX2NoYWluczsKLSAgaWYgKGNoYWlucykgewotICAgIGZvcih2YXIga2V5IGlu
IGNoYWlucykgewotICAgICAgaWYgKCFjaGFpbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250
aW51ZTsgfQotICAgICAgY2hhaW5zW2tleV0ud2lsbENoYW5nZSgpOwotICAgIH0KLSAgfQogCi0g
IGlmICh0aGlzLl9wYXJlbnQpIHsgdGhpcy5fcGFyZW50LmNoYWluV2lsbENoYW5nZSh0aGlzLCB0
aGlzLl9rZXksIDEpOyB9Ci19OworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyLW1l
dGFsCisqLwogCi1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5XaWxsQ2hhbmdlID0gZnVuY3Rpb24o
Y2hhaW4sIHBhdGgsIGRlcHRoKSB7Ci0gIGlmICh0aGlzLl9rZXkpIHsgcGF0aCA9IHRoaXMuX2tl
eSArICcuJyArIHBhdGg7IH0KK3ZhciBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZLAorICAgIG1l
dGFGb3IgPSBFbWJlci5tZXRhLAorICAgIG9iamVjdERlZmluZVByb3BlcnR5ID0gRW1iZXIucGxh
dGZvcm0uZGVmaW5lUHJvcGVydHk7CiAKLSAgaWYgKHRoaXMuX3BhcmVudCkgewotICAgIHRoaXMu
X3BhcmVudC5jaGFpbldpbGxDaGFuZ2UodGhpcywgcGF0aCwgZGVwdGgrMSk7Ci0gIH0gZWxzZSB7
Ci0gICAgaWYgKGRlcHRoID4gMSkgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcy52YWx1
ZSgpLCBwYXRoKTsgfQotICAgIHBhdGggPSAndGhpcy4nICsgcGF0aDsKLSAgICBpZiAodGhpcy5f
cGF0aHNbcGF0aF0gPiAwKSB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLnZhbHVlKCks
IHBhdGgpOyB9Ci0gIH0KLX07Cit2YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5E
QVRPUllfU0VUVEVSOwogCi1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5EaWRDaGFuZ2UgPSBmdW5j
dGlvbihjaGFpbiwgcGF0aCwgZGVwdGgpIHsKLSAgaWYgKHRoaXMuX2tleSkgeyBwYXRoID0gdGhp
cy5fa2V5ICsgJy4nICsgcGF0aDsgfQotICBpZiAodGhpcy5fcGFyZW50KSB7Ci0gICAgdGhpcy5f
cGFyZW50LmNoYWluRGlkQ2hhbmdlKHRoaXMsIHBhdGgsIGRlcHRoKzEpOwotICB9IGVsc2Ugewot
ICAgIGlmIChkZXB0aCA+IDEpIHsgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcy52YWx1ZSgp
LCBwYXRoKTsgfQotICAgIHBhdGggPSAndGhpcy4nICsgcGF0aDsKLSAgICBpZiAodGhpcy5fcGF0
aHNbcGF0aF0gPiAwKSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMudmFsdWUoKSwgcGF0
aCk7IH0KLSAgfQotfTsKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIERFU0NSSVBUT1IKKy8vCiAKLUNoYWluTm9kZVByb3Rv
dHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbihzdXBwcmVzc0V2ZW50KSB7Ci0gIC8vIGludmFsaWRh
dGUgbXkgb3duIHZhbHVlIGZpcnN0LgotICBpZiAodGhpcy5fd2F0Y2hpbmcpIHsKLSAgICB2YXIg
b2JqID0gdGhpcy5fcGFyZW50LnZhbHVlKCk7Ci0gICAgaWYgKG9iaiAhPT0gdGhpcy5fb2JqZWN0
KSB7Ci0gICAgICByZW1vdmVDaGFpbldhdGNoZXIodGhpcy5fb2JqZWN0LCB0aGlzLl9rZXksIHRo
aXMpOwotICAgICAgdGhpcy5fb2JqZWN0ID0gb2JqOwotICAgICAgYWRkQ2hhaW5XYXRjaGVyKG9i
aiwgdGhpcy5fa2V5LCB0aGlzKTsKLSAgICB9Ci0gICAgdGhpcy5fdmFsdWUgID0gdW5kZWZpbmVk
OworLyoqCisgIE9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQgYW4gaW50ZXJmYWNl
IHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgdG8KKyAgZ2V0IGFuZCBzZXQuIFRoZSBkZWZhdWx0IGlt
cGxlbWVudGF0aW9uIGhhbmRsZXMgc2ltcGxlIHByb3BlcnRpZXMuCiAKLSAgICAvLyBTcGVjaWFs
LWNhc2U6IHRoZSBFYWNoUHJveHkgcmVsaWVzIG9uIGltbWVkaWF0ZSBldmFsdWF0aW9uIHRvCi0g
ICAgLy8gZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCi0gICAgaWYgKHRoaXMuX3BhcmVudCAmJiB0
aGlzLl9wYXJlbnQuX2tleSA9PT0gJ0BlYWNoJykKLSAgICAgIHRoaXMudmFsdWUoKTsKLSAgfQor
ICBZb3UgZ2VuZXJhbGx5IHdvbid0IG5lZWQgdG8gY3JlYXRlIG9yIHN1YmNsYXNzIHRoaXMgZGly
ZWN0bHkuCiAKLSAgLy8gdGhlbiBub3RpZnkgY2hhaW5zLi4uCi0gIHZhciBjaGFpbnMgPSB0aGlz
Ll9jaGFpbnM7Ci0gIGlmIChjaGFpbnMpIHsKLSAgICBmb3IodmFyIGtleSBpbiBjaGFpbnMpIHsK
LSAgICAgIGlmICghY2hhaW5zLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAg
ICAgIGNoYWluc1trZXldLmRpZENoYW5nZShzdXBwcmVzc0V2ZW50KTsKLSAgICB9Ci0gIH0KKyAg
QGNsYXNzIERlc2NyaXB0b3IKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAcHJpdmF0ZQorICBAY29u
c3RydWN0b3IKKyovCitFbWJlci5EZXNjcmlwdG9yID0gZnVuY3Rpb24oKSB7fTsKIAotICBpZiAo
c3VwcHJlc3NFdmVudCkgeyByZXR1cm47IH0KKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIERFRklOSU5HIFBST1BFUlRJRVMg
QVBJCisvLwogCi0gIC8vIGFuZCBmaW5hbGx5IHRlbGwgcGFyZW50IGFib3V0IG15IHBhdGggY2hh
bmdpbmcuLi4KLSAgaWYgKHRoaXMuX3BhcmVudCkgeyB0aGlzLl9wYXJlbnQuY2hhaW5EaWRDaGFu
Z2UodGhpcywgdGhpcy5fa2V5LCAxKTsgfQordmFyIE1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04g
PSBFbWJlci5NQU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OID0gZnVuY3Rpb24odmFsdWUpIHsKKyAg
RW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCB1c2UgRW1iZXIuc2V0KCkgdG8gYWNjZXNzIHRoaXMgcHJv
cGVydHkgKG9mICIgKyB0aGlzICsgIikiLCBmYWxzZSk7CiB9OwogCi0vLyBnZXQgdGhlIGNoYWlu
cyBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0LiBJZiB0aGUgY3VycmVudCBvYmplY3QgaGFzCi0vLyBj
aGFpbnMgaW5oZXJpdGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBiZSBjbG9uZWQgYW5kIHJl
Y29uZmlndXJlZCBmb3IKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLWZ1bmN0aW9uIGNoYWluc0Zv
cihvYmopIHsKLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiksIHJldCA9IG0uY2hhaW5zOwotICBpZiAo
IXJldCkgewotICAgIHJldCA9IG0uY2hhaW5zID0gbmV3IENoYWluTm9kZShudWxsLCBudWxsLCBv
YmopOwotICB9IGVsc2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmopIHsKLSAgICByZXQgPSBtLmNo
YWlucyA9IHJldC5jb3B5KG9iaik7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotRW1iZXIub3Zl
cnJpZGVDaGFpbnMgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIG0pIHsKLSAgY2hhaW5zRGlkQ2hh
bmdlKG9iaiwga2V5TmFtZSwgbSwgdHJ1ZSk7Cit2YXIgREVGQVVMVF9HRVRURVJfRlVOQ1RJT04g
PSBFbWJlci5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgcmV0
dXJuIGZ1bmN0aW9uKCkgeworICAgIHZhciBtZXRhID0gdGhpc1tNRVRBX0tFWV07CisgICAgcmV0
dXJuIG1ldGEgJiYgbWV0YS52YWx1ZXNbbmFtZV07CisgIH07CiB9OwogCi1mdW5jdGlvbiBjaGFp
bnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSwgYXJnKSB7Ci0gIGlmICghbS5oYXNPd25Qcm9w
ZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAg
dmFyIG5vZGVzID0gbS5jaGFpbldhdGNoZXJzOwotCi0gIG5vZGVzID0gbm9kZXNba2V5TmFtZV07
Ci0gIGlmICghbm9kZXMpIHsgcmV0dXJuOyB9CisvKioKKyAgTk9URTogVGhpcyBpcyBhIGxvdy1s
ZXZlbCBtZXRob2QgdXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgQVBJLiBZb3UgYWxtb3N0Cisg
IG5ldmVyIHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCB5b3Ugc2hv
dWxkIHVzZQorICBgRW1iZXIubWl4aW4oKWAgdG8gZGVmaW5lIG5ldyBwcm9wZXJ0aWVzLgogCi0g
IGZvcih2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBub2Rl
c1tpXS53aWxsQ2hhbmdlKGFyZyk7Ci0gIH0KLX0KKyAgRGVmaW5lcyBhIHByb3BlcnR5IG9uIGFu
IG9iamVjdC4gVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBFUzUKKyAgYE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSgpYCBtZXRob2QgZXhjZXB0IHRoYXQgaXQgY2FuIGFsc28gYWNjZXB0IGNv
bXB1dGVkCisgIHByb3BlcnRpZXMgYW5kIG90aGVyIHNwZWNpYWwgZGVzY3JpcHRvcnMuCiAKLWZ1
bmN0aW9uIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0sIGFyZykgewotICBpZiAoIW0u
aGFzT3duUHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8gbm90aGluZyB0
byBkbworICBOb3JtYWxseSB0aGlzIG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRlcnMu
IEhvd2V2ZXIgaWYgeW91IHBhc3MgYW4KKyAgaW5zdGFuY2Ugb2YgYEVtYmVyLkRlc2NyaXB0b3Jg
IGFzIHRoZSB0aGlyZCBwYXJhbSB0aGVuIHlvdSBjYW4gcGFzcyBhbgorICBvcHRpb25hbCB2YWx1
ZSBhcyB0aGUgZm91cnRoIHBhcmFtZXRlci4gVGhpcyBpcyBvZnRlbiBtb3JlIGVmZmljaWVudCB0
aGFuCisgIGNyZWF0aW5nIG5ldyBkZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0eS4K
IAotICB2YXIgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnM7CisgICMjIEV4YW1wbGVzCiAKLSAgbm9k
ZXMgPSBub2Rlc1trZXlOYW1lXTsKLSAgaWYgKCFub2RlcykgeyByZXR1cm47IH0KKyAgYGBgamF2
YXNjcmlwdAorICAvLyBFUzUgY29tcGF0aWJsZSBtb2RlCisgIEVtYmVyLmRlZmluZVByb3BlcnR5
KGNvbnRhY3QsICdmaXJzdE5hbWUnLCB7CisgICAgd3JpdGFibGU6IHRydWUsCisgICAgY29uZmln
dXJhYmxlOiBmYWxzZSwKKyAgICBlbnVtZXJhYmxlOiB0cnVlLAorICAgIHZhbHVlOiAnQ2hhcmxl
cycKKyAgfSk7CiAKLSAgLy8gbG9vcGluZyBpbiByZXZlcnNlIGJlY2F1c2UgdGhlIGNoYWluV2F0
Y2hlcnMgYXJyYXkgY2FuIGJlIG1vZGlmaWVkIGluc2lkZSBkaWRDaGFuZ2UKLSAgZm9yICh2YXIg
aSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgbm9kZXNbaV0uZGlkQ2hh
bmdlKGFyZyk7Ci0gIH0KLX0KKyAgLy8gZGVmaW5lIGEgc2ltcGxlIHByb3BlcnR5CisgIEVtYmVy
LmRlZmluZVByb3BlcnR5KGNvbnRhY3QsICdsYXN0TmFtZScsIHVuZGVmaW5lZCwgJ0pvbGxleScp
OwogCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0vLyBXQVRDSAotLy8KKyAgLy8gZGVmaW5lIGEgY29tcHV0ZWQgcHJvcGVydHkK
KyAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1lJywgRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlzLmxhc3RO
YW1lOworICB9KS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykpOworICBgYGAKIAot
LyoqCiAgIEBwcml2YXRlCi0KLSAgU3RhcnRzIHdhdGNoaW5nIGEgcHJvcGVydHkgb24gYW4gb2Jq
ZWN0LiBXaGVuZXZlciB0aGUgcHJvcGVydHkgY2hhbmdlcywKLSAgaW52b2tlcyBgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlYCBhbmQgYEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlYC4gVGhpcyBpcyB0
aGUKLSAgcHJpbWl0aXZlIHVzZWQgYnkgb2JzZXJ2ZXJzIGFuZCBkZXBlbmRlbnQga2V5czsgdXN1
YWxseSB5b3Ugd2lsbCBuZXZlciBjYWxsCi0gIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpbnN0
ZWFkIHVzZSBoaWdoZXIgbGV2ZWwgbWV0aG9kcyBsaWtlCi0gIGBFbWJlci5hZGRPYnNlcnZlcigp
YAotCi0gIEBtZXRob2Qgd2F0Y2gKKyAgQG1ldGhvZCBkZWZpbmVQcm9wZXJ0eQogICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUKKyAgQHBhcmFtIHtP
YmplY3R9IG9iaiB0aGUgb2JqZWN0IHRvIGRlZmluZSB0aGlzIHByb3BlcnR5IG9uLiBUaGlzIG1h
eSBiZSBhIHByb3RvdHlwZS4KKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgdGhlIG5hbWUgb2Yg
dGhlIHByb3BlcnR5CisgIEBwYXJhbSB7RW1iZXIuRGVzY3JpcHRvcn0gW2Rlc2NdIGFuIGluc3Rh
bmNlIG9mIGBFbWJlci5EZXNjcmlwdG9yYCAodHlwaWNhbGx5IGEKKyAgICBjb21wdXRlZCBwcm9w
ZXJ0eSkgb3IgYW4gRVM1IGRlc2NyaXB0b3IuCisgICAgWW91IG11c3QgcHJvdmlkZSB0aGlzIG9y
IGBkYXRhYCBidXQgbm90IGJvdGguCisgIEBwYXJhbSB7Kn0gW2RhdGFdIHNvbWV0aGluZyBvdGhl
ciB0aGFuIGEgZGVzY3JpcHRvciwgdGhhdCB3aWxsCisgICAgYmVjb21lIHRoZSBleHBsaWNpdCB2
YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgogKi8KLUVtYmVyLndhdGNoID0gZnVuY3Rpb24ob2JqLCBr
ZXlOYW1lKSB7Ci0gIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBBcnJheSAtIGl0IGlzIHNwZWNp
YWwuLi4KLSAgaWYgKGtleU5hbWUgPT09ICdsZW5ndGgnICYmIEVtYmVyLnR5cGVPZihvYmopID09
PSAnYXJyYXknKSB7IHJldHVybiB0aGlzOyB9CitFbWJlci5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0
aW9uKG9iaiwga2V5TmFtZSwgZGVzYywgZGF0YSwgbWV0YSkgeworICB2YXIgZGVzY3MsIGV4aXN0
aW5nRGVzYywgd2F0Y2hpbmcsIHZhbHVlOwogCi0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRj
aGluZyA9IG0ud2F0Y2hpbmcsIGRlc2M7CisgIGlmICghbWV0YSkgbWV0YSA9IG1ldGFGb3Iob2Jq
KTsKKyAgZGVzY3MgPSBtZXRhLmRlc2NzOworICBleGlzdGluZ0Rlc2MgPSBtZXRhLmRlc2NzW2tl
eU5hbWVdOworICB3YXRjaGluZyA9IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0gPiAwOwogCi0gIC8v
IGFjdGl2YXRlIHdhdGNoaW5nIGZpcnN0IHRpbWUKLSAgaWYgKCF3YXRjaGluZ1trZXlOYW1lXSkg
ewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gMTsKLSAgICBpZiAoaXNLZXlOYW1lKGtleU5hbWUp
KSB7Ci0gICAgICBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsKLSAgICAgIGlmIChkZXNjICYmIGRl
c2Mud2lsbFdhdGNoKSB7IGRlc2Mud2lsbFdhdGNoKG9iaiwga2V5TmFtZSk7IH0KKyAgaWYgKGV4
aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3IpIHsKKyAgICBleGlzdGluZ0Rl
c2MudGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKKyAgfQogCi0gICAgICBpZiAoJ2Z1bmN0aW9uJyA9
PT0gdHlwZW9mIG9iai53aWxsV2F0Y2hQcm9wZXJ0eSkgewotICAgICAgICBvYmoud2lsbFdhdGNo
UHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgICB9CisgIGlmIChkZXNjIGluc3RhbmNlb2YgRW1iZXIu
RGVzY3JpcHRvcikgeworICAgIHZhbHVlID0gZGVzYzsKIAotICAgICAgaWYgKE1BTkRBVE9SWV9T
RVRURVIgJiYga2V5TmFtZSBpbiBvYmopIHsKLSAgICAgICAgbS52YWx1ZXNba2V5TmFtZV0gPSBv
Ympba2V5TmFtZV07Ci0gICAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7Ci0g
ICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgICAgIGVudW1lcmFibGU6IHRydWUs
Ci0gICAgICAgICAgc2V0OiBFbWJlci5NQU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OLAotICAgICAg
ICAgIGdldDogRW1iZXIuREVGQVVMVF9HRVRURVJfRlVOQ1RJT04oa2V5TmFtZSkKLSAgICAgICAg
fSk7Ci0gICAgICB9CisgICAgZGVzY3Nba2V5TmFtZV0gPSBkZXNjOworICAgIGlmIChNQU5EQVRP
UllfU0VUVEVSICYmIHdhdGNoaW5nKSB7CisgICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmos
IGtleU5hbWUsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAgICBlbnVtZXJh
YmxlOiB0cnVlLAorICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgdmFsdWU6IHVuZGVm
aW5lZCAvLyBtYWtlIGVudW1lcmFibGUKKyAgICAgIH0pOwogICAgIH0gZWxzZSB7Ci0gICAgICBj
aGFpbnNGb3Iob2JqKS5hZGQoa2V5TmFtZSk7CisgICAgICBvYmpba2V5TmFtZV0gPSB1bmRlZmlu
ZWQ7IC8vIG1ha2UgZW51bWVyYWJsZQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkZXNjc1trZXlO
YW1lXSA9IHVuZGVmaW5lZDsgLy8gc2hhZG93IGRlc2NyaXB0b3IgaW4gcHJvdG8KKyAgICBpZiAo
ZGVzYyA9PSBudWxsKSB7CisgICAgICB2YWx1ZSA9IGRhdGE7CiAKLSAgfSAgZWxzZSB7Ci0gICAg
d2F0Y2hpbmdba2V5TmFtZV0gPSAod2F0Y2hpbmdba2V5TmFtZV0gfHwgMCkgKyAxOwotICB9Ci0g
IHJldHVybiB0aGlzOwotfTsKLQotRW1iZXIuaXNXYXRjaGluZyA9IGZ1bmN0aW9uIGlzV2F0Y2hp
bmcob2JqLCBrZXkpIHsKLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldOwotICByZXR1cm4gKG1l
dGEgJiYgbWV0YS53YXRjaGluZ1trZXldKSA+IDA7Ci19OwotCi1FbWJlci53YXRjaC5mbHVzaFBl
bmRpbmcgPSBmbHVzaFBlbmRpbmdDaGFpbnM7Ci0KLUVtYmVyLnVud2F0Y2ggPSBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKLSAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMg
c3BlY2lhbC4uLgotICBpZiAoa2V5TmFtZSA9PT0gJ2xlbmd0aCcgJiYgRW1iZXIudHlwZU9mKG9i
aikgPT09ICdhcnJheScpIHsgcmV0dXJuIHRoaXM7IH0KLQotICB2YXIgbSA9IG1ldGFGb3Iob2Jq
KSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nLCBkZXNjOwotCi0gIGlmICh3YXRjaGluZ1trZXlOYW1l
XSA9PT0gMSkgewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gMDsKLQotICAgIGlmIChpc0tleU5h
bWUoa2V5TmFtZSkpIHsKLSAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOwotICAgICAgaWYg
KGRlc2MgJiYgZGVzYy5kaWRVbndhdGNoKSB7IGRlc2MuZGlkVW53YXRjaChvYmosIGtleU5hbWUp
OyB9Ci0KLSAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRpZFVud2F0Y2hQcm9w
ZXJ0eSkgewotICAgICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5KGtleU5hbWUpOwotICAgICAg
fQotCi0gICAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBrZXlOYW1lIGluIG9iaikgewotICAg
ICAgICBvX2RlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeworICAgICAgaWYgKE1BTkRBVE9S
WV9TRVRURVIgJiYgd2F0Y2hpbmcpIHsKKyAgICAgICAgbWV0YS52YWx1ZXNba2V5TmFtZV0gPSBk
YXRhOworICAgICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKICAgICAg
ICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAg
ICAgICAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICAgICAgICB2YWx1ZTogbS52YWx1ZXNba2V5TmFt
ZV0KKyAgICAgICAgICBzZXQ6IE1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04sCisgICAgICAgICAg
Z2V0OiBERUZBVUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1lKQogICAgICAgICB9KTsKLSAgICAg
ICAgZGVsZXRlIG0udmFsdWVzW2tleU5hbWVdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2Jq
W2tleU5hbWVdID0gZGF0YTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgY2hhaW5zRm9y
KG9iaikucmVtb3ZlKGtleU5hbWUpOwotICAgIH0KKyAgICAgIHZhbHVlID0gZGVzYzsKIAotICB9
IGVsc2UgaWYgKHdhdGNoaW5nW2tleU5hbWVdPjEpIHsKLSAgICB3YXRjaGluZ1trZXlOYW1lXS0t
OworICAgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIEVTNQorICAgICAgb2JqZWN0RGVmaW5lUHJv
cGVydHkob2JqLCBrZXlOYW1lLCBkZXNjKTsKKyAgICB9CiAgIH0KIAorICAvLyBpZiBrZXkgaXMg
YmVpbmcgd2F0Y2hlZCwgb3ZlcnJpZGUgY2hhaW5zIHRoYXQKKyAgLy8gd2VyZSBpbml0aWFsaXpl
ZCB3aXRoIHRoZSBwcm90b3R5cGUKKyAgaWYgKHdhdGNoaW5nKSB7IEVtYmVyLm92ZXJyaWRlQ2hh
aW5zKG9iaiwga2V5TmFtZSwgbWV0YSk7IH0KKworICAvLyBUaGUgYHZhbHVlYCBwYXNzZWQgdG8g
dGhlIGBkaWREZWZpbmVQcm9wZXJ0eWAgaG9vayBpcworICAvLyBlaXRoZXIgdGhlIGRlc2NyaXB0
b3Igb3IgZGF0YSwgd2hpY2hldmVyIHdhcyBwYXNzZWQuCisgIGlmIChvYmouZGlkRGVmaW5lUHJv
cGVydHkpIHsgb2JqLmRpZERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgdmFsdWUpOyB9CisK
ICAgcmV0dXJuIHRoaXM7CiB9OwogCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIg
Z2V0ID0gRW1iZXIuZ2V0OworCiAvKioKLSAgQHByaXZhdGUKKyAgVG8gZ2V0IG11bHRpcGxlIHBy
b3BlcnRpZXMgYXQgb25jZSwgY2FsbCBgRW1iZXIuZ2V0UHJvcGVydGllc2AKKyAgd2l0aCBhbiBv
YmplY3QgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHN0cmluZ3Mgb3IgYW4gYXJyYXk6CiAKLSAgQ2Fs
bCBvbiBhbiBvYmplY3Qgd2hlbiB5b3UgZmlyc3QgYmVnZXQgaXQgZnJvbSBhbm90aGVyIG9iamVj
dC4gVGhpcyB3aWxsCi0gIHNldHVwIGFueSBjaGFpbmVkIHdhdGNoZXJzIG9uIHRoZSBvYmplY3Qg
aW5zdGFuY2UgYXMgbmVlZGVkLiBUaGlzIG1ldGhvZCBpcwotICBzYWZlIHRvIGNhbGwgbXVsdGlw
bGUgdGltZXMuCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuZ2V0UHJvcGVydGllcyhyZWNvcmQs
ICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZScpOyAgLy8geyBmaXJzdE5hbWU6ICdK
b2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0KKyAgYGBgCiAKLSAgQG1l
dGhvZCByZXdhdGNoCi0gIEBmb3IgRW1iZXIKKyAgaXMgZXF1aXZhbGVudCB0bzoKKworICBgYGBq
YXZhc2NyaXB0CisgIEVtYmVyLmdldFByb3BlcnRpZXMocmVjb3JkLCBbJ2ZpcnN0TmFtZScsICds
YXN0TmFtZScsICd6aXBDb2RlJ10pOyAgLy8geyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6
ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0KKyAgYGBgCisKKyAgQG1ldGhvZCBnZXRQcm9wZXJ0
aWVzCiAgIEBwYXJhbSBvYmoKKyAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5
cyB0byBnZXQKKyAgQHJldHVybiB7SGFzaH0KICovCi1FbWJlci5yZXdhdGNoID0gZnVuY3Rpb24o
b2JqKSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmosIGZhbHNlKSwgY2hhaW5zID0gbS5jaGFpbnM7
CitFbWJlci5nZXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciByZXQgPSB7fSwK
KyAgICAgIHByb3BlcnR5TmFtZXMgPSBhcmd1bWVudHMsCisgICAgICBpID0gMTsKIAotICAvLyBt
YWtlIHN1cmUgdGhlIG9iamVjdCBoYXMgaXRzIG93biBndWlkLgotICBpZiAoR1VJRF9LRVkgaW4g
b2JqICYmICFvYmouaGFzT3duUHJvcGVydHkoR1VJRF9LRVkpKSB7Ci0gICAgRW1iZXIuZ2VuZXJh
dGVHdWlkKG9iaiwgJ2VtYmVyJyk7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIEVt
YmVyLnR5cGVPZihhcmd1bWVudHNbMV0pID09PSAnYXJyYXknKSB7CisgICAgaSA9IDA7CisgICAg
cHJvcGVydHlOYW1lcyA9IGFyZ3VtZW50c1sxXTsKICAgfQotCi0gIC8vIG1ha2Ugc3VyZSBhbnkg
Y2hhaW5lZCB3YXRjaGVycyB1cGRhdGUuCi0gIGlmIChjaGFpbnMgJiYgY2hhaW5zLnZhbHVlKCkg
IT09IG9iaikgewotICAgIG0uY2hhaW5zID0gY2hhaW5zLmNvcHkob2JqKTsKKyAgZm9yKHZhciBs
ZW4gPSBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgcmV0W3Byb3Bl
cnR5TmFtZXNbaV1dID0gZ2V0KG9iaiwgcHJvcGVydHlOYW1lc1tpXSk7CiAgIH0KLQotICByZXR1
cm4gdGhpczsKKyAgcmV0dXJuIHJldDsKIH07CiAKLUVtYmVyLmZpbmlzaENoYWlucyA9IGZ1bmN0
aW9uKG9iaikgewotICB2YXIgbSA9IG1ldGFGb3Iob2JqLCBmYWxzZSksIGNoYWlucyA9IG0uY2hh
aW5zOwotICBpZiAoY2hhaW5zKSB7Ci0gICAgaWYgKGNoYWlucy52YWx1ZSgpICE9PSBvYmopIHsK
LSAgICAgIG0uY2hhaW5zID0gY2hhaW5zID0gY2hhaW5zLmNvcHkob2JqKTsKLSAgICB9Ci0gICAg
Y2hhaW5zLmRpZENoYW5nZSh0cnVlKTsKLSAgfQotfTsKK30pKCk7CiAKLS8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIFBST1BF
UlRZIENIQU5HRVMKLS8vCisKKworKGZ1bmN0aW9uKCkgewordmFyIGNoYW5nZVByb3BlcnRpZXMg
PSBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzLAorICAgIHNldCA9IEVtYmVyLnNldDsKIAogLyoqCi0g
IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGFuIG9iamVjdCBwcm9wZXJ0eSBp
cyBhYm91dCB0byBjaGFuZ2UuCi0gIEl0IHdpbGwgbm90aWZ5IGFueSBiZWZvcmUgb2JzZXJ2ZXJz
IGFuZCBwcmVwYXJlIGNhY2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCisgIFNldCBhIGxpc3Qgb2Yg
cHJvcGVydGllcyBvbiBhbiBvYmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUK
KyAgYSBzaW5nbGUgYGJlZ2luUHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdl
c2AgYmF0Y2gsIHNvCisgIG9ic2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgogCi0gIE5vcm1hbGx5
IHlvdSB3aWxsIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgYnV0IGlmIGZv
ciBzb21lCi0gIHJlYXNvbiB5b3UgY2FuJ3QgZGlyZWN0bHkgd2F0Y2ggYSBwcm9wZXJ0eSB5b3Ug
Y2FuIGludm9rZSB0aGlzIG1ldGhvZAotICBtYW51YWxseSBhbG9uZyB3aXRoIGBFbWJlci5wcm9w
ZXJ0eURpZENoYW5nZSgpYCB3aGljaCB5b3Ugc2hvdWxkIGNhbGwganVzdAotICBhZnRlciB0aGUg
cHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KKyAgYGBgamF2YXNjcmlwdAorICBhbk9iamVjdC5zZXRQ
cm9wZXJ0aWVzKHsKKyAgICBmaXJzdE5hbWU6ICJTdGFubGV5IiwKKyAgICBsYXN0TmFtZTogIlN0
dWFydCIsCisgICAgYWdlOiAiMjEiCisgIH0pCisgIGBgYAogCi0gIEBtZXRob2QgcHJvcGVydHlX
aWxsQ2hhbmdlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0
IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtl
eU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJl
dHVybiB7dm9pZH0KKyAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCisgIEBwYXJhbSBzZWxmCisgIEBw
YXJhbSB7T2JqZWN0fSBoYXNoCisgIEByZXR1cm4gc2VsZgogKi8KLWZ1bmN0aW9uIHByb3BlcnR5
V2lsbENoYW5nZShvYmosIGtleU5hbWUsIHZhbHVlKSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmos
IGZhbHNlKSwKLSAgICAgIHdhdGNoaW5nID0gbS53YXRjaGluZ1trZXlOYW1lXSA+IDAgfHwga2V5
TmFtZSA9PT0gJ2xlbmd0aCcsCi0gICAgICBwcm90byA9IG0ucHJvdG8sCi0gICAgICBkZXNjID0g
bS5kZXNjc1trZXlOYW1lXTsKK0VtYmVyLnNldFByb3BlcnRpZXMgPSBmdW5jdGlvbihzZWxmLCBo
YXNoKSB7CisgIGNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24oKSB7CisgICAgZm9yKHZhciBwcm9w
IGluIGhhc2gpIHsKKyAgICAgIGlmIChoYXNoLmhhc093blByb3BlcnR5KHByb3ApKSB7IHNldChz
ZWxmLCBwcm9wLCBoYXNoW3Byb3BdKTsgfQorICAgIH0KKyAgfSk7CisgIHJldHVybiBzZWxmOwor
fTsKIAotICBpZiAoIXdhdGNoaW5nKSB7IHJldHVybjsgfQotICBpZiAocHJvdG8gPT09IG9iaikg
eyByZXR1cm47IH0KLSAgaWYgKGRlc2MgJiYgZGVzYy53aWxsQ2hhbmdlKSB7IGRlc2Mud2lsbENo
YW5nZShvYmosIGtleU5hbWUpOyB9Ci0gIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwga2V5
TmFtZSwgbSk7Ci0gIGNoYWluc1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKLSAgRW1iZXIu
bm90aWZ5QmVmb3JlT2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSk7Ci19Cit9KSgpOwogCi1FbWJlci5w
cm9wZXJ0eVdpbGxDaGFuZ2UgPSBwcm9wZXJ0eVdpbGxDaGFuZ2U7CiAKLS8qKgotICBUaGlzIGZ1
bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdl
ZC4KLSAgSXQgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyBhbmQgY2xlYXIgY2FjaGVzIGFtb25n
IG90aGVyIHRoaW5ncy4KIAotICBOb3JtYWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRo
aXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Igc29tZQotICByZWFzb24geW91IGNhbid0IGRp
cmVjdGx5IHdhdGNoIGEgcHJvcGVydHkgeW91IGNhbiBpbnZva2UgdGhpcyBtZXRob2QKLSAgbWFu
dWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVydHlXaWxMQ2hhbmdlKClgIHdoaWNoIHlvdSBz
aG91bGQgY2FsbCBqdXN0Ci0gIGJlZm9yZSB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KKyhm
dW5jdGlvbigpIHsKK3ZhciBtZXRhRm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMuanMKKyAgICB0
eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxzLmpzCisgICAgTUFOREFUT1JZX1NFVFRFUiA9
IEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSLAorICAgIG9fZGVmaW5lUHJvcGVydHkgPSBFbWJl
ci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eTsKIAotICBAbWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdl
Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhl
IHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhl
IHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJldHVybiB7dm9p
ZH0KLSovCi1mdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpIHsKLSAgdmFy
IG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLAotICAgICAgd2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tl
eU5hbWVdID4gMCB8fCBrZXlOYW1lID09PSAnbGVuZ3RoJywKLSAgICAgIHByb3RvID0gbS5wcm90
bywKLSAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOworRW1iZXIud2F0Y2hLZXkgPSBmdW5j
dGlvbihvYmosIGtleU5hbWUpIHsKKyAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0g
aXQgaXMgc3BlY2lhbC4uLgorICBpZiAoa2V5TmFtZSA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9mKG9i
aikgPT09ICdhcnJheScpIHsgcmV0dXJuOyB9CiAKLSAgaWYgKHByb3RvID09PSBvYmopIHsgcmV0
dXJuOyB9CisgIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7CiAK
LSAgLy8gc2hvdWxkbid0IHRoaXMgbWVhbiB0aGF0IHdlJ3JlIHdhdGNoaW5nIHRoaXMga2V5Pwot
ICBpZiAoZGVzYyAmJiBkZXNjLmRpZENoYW5nZSkgeyBkZXNjLmRpZENoYW5nZShvYmosIGtleU5h
bWUpOyB9Ci0gIGlmICghd2F0Y2hpbmcgJiYga2V5TmFtZSAhPT0gJ2xlbmd0aCcpIHsgcmV0dXJu
OyB9CisgIC8vIGFjdGl2YXRlIHdhdGNoaW5nIGZpcnN0IHRpbWUKKyAgaWYgKCF3YXRjaGluZ1tr
ZXlOYW1lXSkgeworICAgIHdhdGNoaW5nW2tleU5hbWVdID0gMTsKIAotICBkZXBlbmRlbnRLZXlz
RGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7Ci0gIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5h
bWUsIG0pOwotICBFbWJlci5ub3RpZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKLX0KKyAgICBp
ZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai53aWxsV2F0Y2hQcm9wZXJ0eSkgeworICAgICAg
b2JqLndpbGxXYXRjaFByb3BlcnR5KGtleU5hbWUpOworICAgIH0KIAotRW1iZXIucHJvcGVydHlE
aWRDaGFuZ2UgPSBwcm9wZXJ0eURpZENoYW5nZTsKKyAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAm
JiBrZXlOYW1lIGluIG9iaikgeworICAgICAgbS52YWx1ZXNba2V5TmFtZV0gPSBvYmpba2V5TmFt
ZV07CisgICAgICBvX2RlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeworICAgICAgICBjb25m
aWd1cmFibGU6IHRydWUsCisgICAgICAgIGVudW1lcmFibGU6IG9iai5wcm9wZXJ0eUlzRW51bWVy
YWJsZShrZXlOYW1lKSwKKyAgICAgICAgc2V0OiBFbWJlci5NQU5EQVRPUllfU0VUVEVSX0ZVTkNU
SU9OLAorICAgICAgICBnZXQ6IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUp
CisgICAgICB9KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2F0Y2hpbmdba2V5TmFtZV0gPSAo
d2F0Y2hpbmdba2V5TmFtZV0gfHwgMCkgKyAxOworICB9Cit9OwogCi12YXIgTk9ERV9TVEFDSyA9
IFtdOwogCi0vKioKLSAgVGVhcnMgZG93biB0aGUgbWV0YSBvbiBhbiBvYmplY3Qgc28gdGhhdCBp
dCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIE11bHRpcGxlIGNhbGxzIHdpbGwgaGF2ZSBu
byBlZmZlY3QuCitFbWJlci51bndhdGNoS2V5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Cisg
IHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7CiAKLSAgQG1ldGhv
ZCBkZXN0cm95Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiAgdGhlIG9iamVj
dCB0byBkZXN0cm95Ci0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIuZGVzdHJveSA9IGZ1bmN0
aW9uIChvYmopIHsKLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLCBub2RlLCBub2Rlcywga2V5
LCBub2RlT2JqZWN0OwotICBpZiAobWV0YSkgewotICAgIG9ialtNRVRBX0tFWV0gPSBudWxsOwot
ICAgIC8vIHJlbW92ZSBjaGFpbldhdGNoZXJzIHRvIHJlbW92ZSBjaXJjdWxhciByZWZlcmVuY2Vz
IHRoYXQgd291bGQgcHJldmVudCBHQwotICAgIG5vZGUgPSBtZXRhLmNoYWluczsKLSAgICBpZiAo
bm9kZSkgewotICAgICAgTk9ERV9TVEFDSy5wdXNoKG5vZGUpOwotICAgICAgLy8gcHJvY2VzcyB0
cmVlCi0gICAgICB3aGlsZSAoTk9ERV9TVEFDSy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIG5vZGUg
PSBOT0RFX1NUQUNLLnBvcCgpOwotICAgICAgICAvLyBwdXNoIGNoaWxkcmVuCi0gICAgICAgIG5v
ZGVzID0gbm9kZS5fY2hhaW5zOwotICAgICAgICBpZiAobm9kZXMpIHsKLSAgICAgICAgICBmb3Ig
KGtleSBpbiBub2RlcykgewotICAgICAgICAgICAgaWYgKG5vZGVzLmhhc093blByb3BlcnR5KGtl
eSkpIHsKLSAgICAgICAgICAgICAgTk9ERV9TVEFDSy5wdXNoKG5vZGVzW2tleV0pOwotICAgICAg
ICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgY2hhaW5X
YXRjaGVyIGluIG5vZGUgb2JqZWN0Ci0gICAgICAgIGlmIChub2RlLl93YXRjaGluZykgewotICAg
ICAgICAgIG5vZGVPYmplY3QgPSBub2RlLl9vYmplY3Q7Ci0gICAgICAgICAgaWYgKG5vZGVPYmpl
Y3QpIHsKLSAgICAgICAgICAgIHJlbW92ZUNoYWluV2F0Y2hlcihub2RlT2JqZWN0LCBub2RlLl9r
ZXksIG5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQorICBpZiAod2F0Y2hp
bmdba2V5TmFtZV0gPT09IDEpIHsKKyAgICB3YXRjaGluZ1trZXlOYW1lXSA9IDA7CisKKyAgICBp
ZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRVbndhdGNoUHJvcGVydHkpIHsKKyAgICAg
IG9iai5kaWRVbndhdGNoUHJvcGVydHkoa2V5TmFtZSk7CisgICAgfQorCisgICAgaWYgKE1BTkRB
VE9SWV9TRVRURVIgJiYga2V5TmFtZSBpbiBvYmopIHsKKyAgICAgIG9fZGVmaW5lUHJvcGVydHko
b2JqLCBrZXlOYW1lLCB7CisgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgZW51
bWVyYWJsZTogb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtleU5hbWUpLAorICAgICAgICBzZXQ6
IGZ1bmN0aW9uKHZhbCkgeworICAgICAgICAgIC8vIHJlZGVmaW5lIHRvIHNldCBhcyBlbnVtZXJh
YmxlCisgICAgICAgICAgb19kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKKyAgICAgICAg
ICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAg
ICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHZhbHVlOiB2YWwKKyAgICAg
ICAgICB9KTsKKyAgICAgICAgICBkZWxldGUgbS52YWx1ZXNba2V5TmFtZV07CisgICAgICAgIH0s
CisgICAgICAgIGdldDogRW1iZXIuREVGQVVMVF9HRVRURVJfRlVOQ1RJT04oa2V5TmFtZSkKKyAg
ICAgIH0pOwogICAgIH0KKyAgfSBlbHNlIGlmICh3YXRjaGluZ1trZXlOYW1lXSA+IDEpIHsKKyAg
ICB3YXRjaGluZ1trZXlOYW1lXS0tOwogICB9CiB9OwogCkBAIC0zMTgxLDQ3MCArMzcxMSwzODQg
QEAgRW1iZXIuZGVzdHJveSA9IGZ1bmN0aW9uIChvYmopIHsKIAogCiAoZnVuY3Rpb24oKSB7Ci0v
KioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCit2YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsIC8v
IHV0aWxzLmpzCisgICAgZ2V0ID0gRW1iZXIuZ2V0LCAvLyBwcm9wZXJ0eV9nZXQuanMKKyAgICBu
b3JtYWxpemVUdXBsZSA9IEVtYmVyLm5vcm1hbGl6ZVR1cGxlLCAvLyBwcm9wZXJ0eV9nZXQuanMK
KyAgICBmb3JFYWNoID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaCwgLy8gYXJyYXkuanMK
KyAgICB3YXJuID0gRW1iZXIud2FybiwKKyAgICB3YXRjaEtleSA9IEVtYmVyLndhdGNoS2V5LAor
ICAgIHVud2F0Y2hLZXkgPSBFbWJlci51bndhdGNoS2V5LAorICAgIEZJUlNUX0tFWSA9IC9eKFte
XC5cKl0rKS87CiAKLUVtYmVyLndhcm4oIlRoZSBDUF9ERUZBVUxUX0NBQ0hFQUJMRSBmbGFnIGhh
cyBiZWVuIHJlbW92ZWQgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBjYWNoZWQg
YnkgZGVmYXVsdC4gVXNlIGB2b2xhdGlsZWAgaWYgeW91IGRvbid0IHdhbnQgY2FjaGluZy4iLCBF
bWJlci5FTlYuQ1BfREVGQVVMVF9DQUNIRUFCTEUgIT09IGZhbHNlKTsKK2Z1bmN0aW9uIGZpcnN0
S2V5KHBhdGgpIHsKKyAgcmV0dXJuIHBhdGgubWF0Y2goRklSU1RfS0VZKVswXTsKK30KIAordmFy
IHBlbmRpbmdRdWV1ZSA9IFtdOwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHNldCA9IEVt
YmVyLnNldCwKLSAgICBtZXRhRm9yID0gRW1iZXIubWV0YSwKLSAgICBndWlkRm9yID0gRW1iZXIu
Z3VpZEZvciwKLSAgICBhX3NsaWNlID0gW10uc2xpY2UsCi0gICAgb19jcmVhdGUgPSBFbWJlci5j
cmVhdGUsCi0gICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwKLSAgICB3YXRjaCA9IEVtYmVy
LndhdGNoLAotICAgIHVud2F0Y2ggPSBFbWJlci51bndhdGNoOworLy8gYXR0ZW1wdHMgdG8gYWRk
IHRoZSBwZW5kaW5nUXVldWUgY2hhaW5zIGFnYWluLiBJZiBzb21lIG9mIHRoZW0gZW5kIHVwCisv
LyBiYWNrIGluIHRoZSBxdWV1ZSBhbmQgcmVzY2hlZHVsZSBpcyB0cnVlLCBzY2hlZHVsZXMgYSB0
aW1lb3V0IHRvIHRyeQorLy8gYWdhaW4uCitFbWJlci5mbHVzaFBlbmRpbmdDaGFpbnMgPSBmdW5j
dGlvbigpIHsKKyAgaWYgKHBlbmRpbmdRdWV1ZS5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9IC8v
IG5vdGhpbmcgdG8gZG8KIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVQRU5ERU5UIEtFWVMKLS8vCisgIHZhciBxdWV1
ZSA9IHBlbmRpbmdRdWV1ZTsKKyAgcGVuZGluZ1F1ZXVlID0gW107CiAKLS8vIGRhdGEgc3RydWN0
dXJlOgotLy8gIG1ldGEuZGVwcyA9IHsKLS8vICAgJ2RlcEtleSc6IHsKLS8vICAgICAna2V5TmFt
ZSc6IGNvdW50LAotLy8gICB9Ci0vLyAgfQorICBmb3JFYWNoLmNhbGwocXVldWUsIGZ1bmN0aW9u
KHEpIHsgcVswXS5hZGQocVsxXSk7IH0pOwogCi0vKgotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMg
YSBtYXAgb2YgdW5pcXVlIGRlcGVuZGVuY2llcyBmb3IgYQotICBnaXZlbiBvYmplY3QgYW5kIGtl
eS4KLSovCi1mdW5jdGlvbiBrZXlzRm9yRGVwKG9iaiwgZGVwc01ldGEsIGRlcEtleSkgewotICB2
YXIga2V5cyA9IGRlcHNNZXRhW2RlcEtleV07Ci0gIGlmICgha2V5cykgewotICAgIC8vIGlmIHRo
ZXJlIGFyZSBubyBkZXBlbmRlbmNpZXMgeWV0IGZvciBhIHRoZSBnaXZlbiBrZXkKLSAgICAvLyBj
cmVhdGUgYSBuZXcgZW1wdHkgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBrZXkKLSAgICBr
ZXlzID0gZGVwc01ldGFbZGVwS2V5XSA9IHt9OwotICB9IGVsc2UgaWYgKCFkZXBzTWV0YS5oYXNP
d25Qcm9wZXJ0eShkZXBLZXkpKSB7Ci0gICAgLy8gb3RoZXJ3aXNlIGlmIHRoZSBkZXBlbmRlbmN5
IGxpc3QgaXMgaW5oZXJpdGVkIGZyb20KLSAgICAvLyBhIHN1cGVyY2xhc3MsIGNsb25lIHRoZSBo
YXNoCi0gICAga2V5cyA9IGRlcHNNZXRhW2RlcEtleV0gPSBvX2NyZWF0ZShrZXlzKTsKLSAgfQot
ICByZXR1cm4ga2V5czsKLX0KKyAgd2FybignV2F0Y2hpbmcgYW4gdW5kZWZpbmVkIGdsb2JhbCwg
RW1iZXIgZXhwZWN0cyB3YXRjaGVkIGdsb2JhbHMgdG8gYmUgc2V0dXAgYnkgdGhlIHRpbWUgdGhl
IHJ1biBsb29wIGlzIGZsdXNoZWQsIGNoZWNrIGZvciB0eXBvcycsIHBlbmRpbmdRdWV1ZS5sZW5n
dGggPT09IDApOworfTsKIAotLyogcmV0dXJuIG9ialtNRVRBX0tFWV0uZGVwcyAqLwotZnVuY3Rp
b24gbWV0YUZvckRlcHMob2JqLCBtZXRhKSB7Ci0gIHZhciBkZXBzID0gbWV0YS5kZXBzOwotICAv
LyBJZiB0aGUgY3VycmVudCBvYmplY3QgaGFzIG5vIGRlcGVuZGVuY2llcy4uLgotICBpZiAoIWRl
cHMpIHsKLSAgICAvLyBpbml0aWFsaXplIHRoZSBkZXBlbmRlbmNpZXMgd2l0aCBhIHBvaW50ZXIg
YmFjayB0bwotICAgIC8vIHRoZSBjdXJyZW50IG9iamVjdAotICAgIGRlcHMgPSBtZXRhLmRlcHMg
PSB7fTsKLSAgfSBlbHNlIGlmICghbWV0YS5oYXNPd25Qcm9wZXJ0eSgnZGVwcycpKSB7Ci0gICAg
Ly8gb3RoZXJ3aXNlIGlmIHRoZSBkZXBlbmRlbmNpZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZQot
ICAgIC8vIG9iamVjdCdzIHN1cGVyY2xhc3MsIGNsb25lIHRoZSBkZXBzCi0gICAgZGVwcyA9IG1l
dGEuZGVwcyA9IG9fY3JlYXRlKGRlcHMpOwotICB9Ci0gIHJldHVybiBkZXBzOwotfQogCi1mdW5j
dGlvbiBhZGREZXBlbmRlbnRLZXlzKGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgewotICAvLyB0
aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRlcGVuZGVudCBrZXlzLCBzbwotICAvLyBhZGQg
YWxsIG9mIGl0cyBkZXBlbmRlbnQga2V5cy4KLSAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRl
bnRLZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4sIGRlcEtleSwga2V5czsKLSAgaWYgKCFkZXBLZXlz
KSByZXR1cm47CitmdW5jdGlvbiBhZGRDaGFpbldhdGNoZXIob2JqLCBrZXlOYW1lLCBub2RlKSB7
CisgIGlmICghb2JqIHx8ICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaikpIHsgcmV0dXJuOyB9IC8v
IG5vdGhpbmcgdG8gZG8KIAotICBkZXBzTWV0YSA9IG1ldGFGb3JEZXBzKG9iaiwgbWV0YSk7Cisg
IHZhciBtID0gbWV0YUZvcihvYmopLCBub2RlcyA9IG0uY2hhaW5XYXRjaGVyczsKIAotICBmb3Io
aWR4ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBk
ZXBLZXkgPSBkZXBLZXlzW2lkeF07Ci0gICAgLy8gTG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5
Ci0gICAga2V5cyA9IGtleXNGb3JEZXAob2JqLCBkZXBzTWV0YSwgZGVwS2V5KTsKLSAgICAvLyBJ
bmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyBkZXBLZXkgZGVwZW5kcyBvbiBrZXlOYW1lLgot
ICAgIGtleXNba2V5TmFtZV0gPSAoa2V5c1trZXlOYW1lXSB8fCAwKSArIDE7Ci0gICAgLy8gV2F0
Y2ggdGhlIGRlcEtleQotICAgIHdhdGNoKG9iaiwgZGVwS2V5KTsKKyAgaWYgKCFtLmhhc093blBy
b3BlcnR5KCdjaGFpbldhdGNoZXJzJykpIHsKKyAgICBub2RlcyA9IG0uY2hhaW5XYXRjaGVycyA9
IHt9OwogICB9CisKKyAgaWYgKCFub2Rlc1trZXlOYW1lXSkgeyBub2Rlc1trZXlOYW1lXSA9IFtd
OyB9CisgIG5vZGVzW2tleU5hbWVdLnB1c2gobm9kZSk7CisgIHdhdGNoS2V5KG9iaiwga2V5TmFt
ZSk7CiB9CiAKLWZ1bmN0aW9uIHJlbW92ZURlcGVuZGVudEtleXMoZGVzYywgb2JqLCBrZXlOYW1l
LCBtZXRhKSB7Ci0gIC8vIHRoZSBkZXNjcmlwdG9yIGhhcyBhIGxpc3Qgb2YgZGVwZW5kZW50IGtl
eXMsIHNvCi0gIC8vIGFkZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBrZXlzLgotICB2YXIgZGVwS2V5
cyA9IGRlc2MuX2RlcGVuZGVudEtleXMsIGRlcHNNZXRhLCBpZHgsIGxlbiwgZGVwS2V5LCBrZXlz
OwotICBpZiAoIWRlcEtleXMpIHJldHVybjsKK3ZhciByZW1vdmVDaGFpbldhdGNoZXIgPSBFbWJl
ci5yZW1vdmVDaGFpbldhdGNoZXIgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIG5vZGUpIHsKKyAg
aWYgKCFvYmogfHwgJ29iamVjdCcgIT09IHR5cGVvZiBvYmopIHsgcmV0dXJuOyB9IC8vIG5vdGhp
bmcgdG8gZG8KIAotICBkZXBzTWV0YSA9IG1ldGFGb3JEZXBzKG9iaiwgbWV0YSk7CisgIHZhciBt
ID0gbWV0YUZvcihvYmosIGZhbHNlKTsKKyAgaWYgKCFtLmhhc093blByb3BlcnR5KCdjaGFpbldh
dGNoZXJzJykpIHsgcmV0dXJuOyB9IC8vIG5vdGhpbmcgdG8gZG8KIAotICBmb3IoaWR4ID0gMCwg
bGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBkZXBLZXkgPSBk
ZXBLZXlzW2lkeF07Ci0gICAgLy8gTG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5Ci0gICAga2V5
cyA9IGtleXNGb3JEZXAob2JqLCBkZXBzTWV0YSwgZGVwS2V5KTsKLSAgICAvLyBJbmNyZW1lbnQg
dGhlIG51bWJlciBvZiB0aW1lcyBkZXBLZXkgZGVwZW5kcyBvbiBrZXlOYW1lLgotICAgIGtleXNb
a2V5TmFtZV0gPSAoa2V5c1trZXlOYW1lXSB8fCAwKSAtIDE7Ci0gICAgLy8gV2F0Y2ggdGhlIGRl
cEtleQotICAgIHVud2F0Y2gob2JqLCBkZXBLZXkpOwotICB9Ci19CisgIHZhciBub2RlcyA9IG0u
Y2hhaW5XYXRjaGVyczsKIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQ09NUFVURUQgUFJPUEVSVFkKLS8vCisgIGlmIChu
b2Rlc1trZXlOYW1lXSkgeworICAgIG5vZGVzID0gbm9kZXNba2V5TmFtZV07CisgICAgZm9yICh2
YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGlmIChub2Rl
c1tpXSA9PT0gbm9kZSkgeyBub2Rlcy5zcGxpY2UoaSwgMSk7IH0KKyAgICB9CisgIH0KKyAgdW53
YXRjaEtleShvYmosIGtleU5hbWUpOworfTsKIAotLyoqCi0gIEBjbGFzcyBDb21wdXRlZFByb3Bl
cnR5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuRGVzY3JpcHRvcgotICBA
Y29uc3RydWN0b3IKLSovCi1mdW5jdGlvbiBDb21wdXRlZFByb3BlcnR5KGZ1bmMsIG9wdHMpIHsK
LSAgdGhpcy5mdW5jID0gZnVuYzsKLSAgdGhpcy5fY2FjaGVhYmxlID0gKG9wdHMgJiYgb3B0cy5j
YWNoZWFibGUgIT09IHVuZGVmaW5lZCkgPyBvcHRzLmNhY2hlYWJsZSA6IHRydWU7Ci0gIHRoaXMu
X2RlcGVuZGVudEtleXMgPSBvcHRzICYmIG9wdHMuZGVwZW5kZW50S2V5czsKLX0KKy8vIEEgQ2hh
aW5Ob2RlIHdhdGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUg
YSBzdGFydGluZworLy8gdmFsdWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3b24ndCBhY3R1
YWxseSB3YXRjaCBpdC4gRm9yIGEgcm9vdCBub2RlCisvLyBwYXNzIG51bGwgZm9yIHBhcmVudCBh
bmQga2V5IGFuZCBvYmplY3QgZm9yIHZhbHVlLgordmFyIENoYWluTm9kZSA9IEVtYmVyLl9DaGFp
bk5vZGUgPSBmdW5jdGlvbihwYXJlbnQsIGtleSwgdmFsdWUpIHsKKyAgdGhpcy5fcGFyZW50ID0g
cGFyZW50OworICB0aGlzLl9rZXkgICAgPSBrZXk7CiAKLUVtYmVyLkNvbXB1dGVkUHJvcGVydHkg
PSBDb21wdXRlZFByb3BlcnR5OwotQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcgRW1i
ZXIuRGVzY3JpcHRvcigpOworICAvLyBfd2F0Y2hpbmcgaXMgdHJ1ZSB3aGVuIGNhbGxpbmcgZ2V0
KHRoaXMuX3BhcmVudCwgdGhpcy5fa2V5KSB3aWxsCisgIC8vIHJldHVybiB0aGUgdmFsdWUgb2Yg
dGhpcyBub2RlLgorICAvLworICAvLyBJdCBpcyBmYWxzZSBmb3IgdGhlIHJvb3Qgb2YgYSBjaGFp
biAoYmVjYXVzZSB3ZSBoYXZlIG5vIHBhcmVudCkKKyAgLy8gYW5kIGZvciBnbG9iYWwgcGF0aHMg
KGJlY2F1c2UgdGhlIHBhcmVudCBub2RlIGlzIHRoZSBvYmplY3Qgd2l0aAorICAvLyB0aGUgb2Jz
ZXJ2ZXIgb24gaXQpCisgIHRoaXMuX3dhdGNoaW5nID0gdmFsdWU9PT11bmRlZmluZWQ7CiAKLXZh
ciBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlID0gQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGU7
CisgIHRoaXMuX3ZhbHVlICA9IHZhbHVlOworICB0aGlzLl9wYXRocyA9IHt9OworICBpZiAodGhp
cy5fd2F0Y2hpbmcpIHsKKyAgICB0aGlzLl9vYmplY3QgPSBwYXJlbnQudmFsdWUoKTsKKyAgICBp
ZiAodGhpcy5fb2JqZWN0KSB7IGFkZENoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tl
eSwgdGhpcyk7IH0KKyAgfQogCi0vKioKLSAgQ2FsbCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5IHRv
IHNldCBpdCBpbnRvIGNhY2hlYWJsZSBtb2RlLiBXaGVuIGluIHRoaXMKLSAgbW9kZSB0aGUgY29t
cHV0ZWQgcHJvcGVydHkgd2lsbCBhdXRvbWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1cm4gdmFsdWUg
b2YKLSAgeW91ciBmdW5jdGlvbiB1bnRpbCBvbmUgb2YgdGhlIGRlcGVuZGVudCBrZXlzIGNoYW5n
ZXMuCisgIC8vIFNwZWNpYWwtY2FzZTogdGhlIEVhY2hQcm94eSByZWxpZXMgb24gaW1tZWRpYXRl
IGV2YWx1YXRpb24gdG8KKyAgLy8gZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCisgIC8vCisgIC8v
IFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGFuIGVmZmljaWVudCBjYWxsYmFjayB0aGF0IHRoZSBF
YWNoUHJveHkKKyAgLy8gY2FuIGltcGxlbWVudC4KKyAgaWYgKHRoaXMuX3BhcmVudCAmJiB0aGlz
Ll9wYXJlbnQuX2tleSA9PT0gJ0BlYWNoJykgeworICAgIHRoaXMudmFsdWUoKTsKKyAgfQorfTsK
IAotICBgYGBqYXZhc2NyaXB0Ci0gIE15QXBwLnByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5jcmVh
dGUoewotICAgIGZ1bGxOYW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdldCgn
Zmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKK3ZhciBDaGFpbk5vZGVQ
cm90b3R5cGUgPSBDaGFpbk5vZGUucHJvdG90eXBlOwogCi0gICAgICAvLyBBZnRlciBjYWxjdWxh
dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiwgRW1iZXIgd2lsbAotICAgICAgLy8gcmV0
dXJuIHRoYXQgdmFsdWUgd2l0aG91dCByZS1leGVjdXRpbmcgdGhpcyBmdW5jdGlvbiB1bnRpbAot
ICAgICAgLy8gb25lIG9mIHRoZSBkZXBlbmRlbnQgcHJvcGVydGllcyBjaGFuZ2UuCi0gICAgfS5w
cm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKLSAgfSk7Ci0gIGBgYAorZnVuY3Rpb24g
bGF6eUdldChvYmosIGtleSkgeworICBpZiAoIW9iaikgcmV0dXJuIHVuZGVmaW5lZDsKIAotICBQ
cm9wZXJ0aWVzIGFyZSBjYWNoZWFibGUgYnkgZGVmYXVsdC4KKyAgdmFyIG1ldGEgPSBtZXRhRm9y
KG9iaiwgZmFsc2UpOworICAvLyBjaGVjayBpZiBvYmplY3QgbWVhbnQgb25seSB0byBiZSBhIHBy
b3RvdHlwZQorICBpZiAobWV0YS5wcm90byA9PT0gb2JqKSByZXR1cm4gdW5kZWZpbmVkOwogCi0g
IEBtZXRob2QgY2FjaGVhYmxlCi0gIEBwYXJhbSB7Qm9vbGVhbn0gYUZsYWcgb3B0aW9uYWwgc2V0
IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBjYWNoaW5nCi0gIEBjaGFpbmFibGUKLSovCi1Db21wdXRl
ZFByb3BlcnR5UHJvdG90eXBlLmNhY2hlYWJsZSA9IGZ1bmN0aW9uKGFGbGFnKSB7Ci0gIHRoaXMu
X2NhY2hlYWJsZSA9IGFGbGFnICE9PSBmYWxzZTsKLSAgcmV0dXJuIHRoaXM7Ci19OworICBpZiAo
a2V5ID09PSAiQGVhY2giKSByZXR1cm4gZ2V0KG9iaiwga2V5KTsKIAotLyoqCi0gIENhbGwgb24g
YSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUuIFdoZW4g
aW4gdGhpcwotICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG5vdCBhdXRvbWF0aWNh
bGx5IGNhY2hlIHRoZSByZXR1cm4gdmFsdWUuCisgIC8vIGlmIGEgQ1Agb25seSByZXR1cm4gY2Fj
aGVkIHZhbHVlCisgIHZhciBkZXNjID0gbWV0YS5kZXNjc1trZXldOworICBpZiAoZGVzYyAmJiBk
ZXNjLl9jYWNoZWFibGUpIHsKKyAgICBpZiAoa2V5IGluIG1ldGEuY2FjaGUpIHsKKyAgICAgIHJl
dHVybiBtZXRhLmNhY2hlW2tleV07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1bmRlZmlu
ZWQ7CisgICAgfQorICB9CiAKLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5vdXRzaWRlU2Vydmlj
ZSA9IEVtYmVyLk9iamVjdC5jcmVhdGUoewotICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICAg
IHJldHVybiBPdXRzaWRlU2VydmljZS5nZXRWYWx1ZSgpOwotICAgIH0ucHJvcGVydHkoKS52b2xh
dGlsZSgpCi0gIH0pOwotICBgYGAKKyAgcmV0dXJuIGdldChvYmosIGtleSk7Cit9CiAKLSAgQG1l
dGhvZCB2b2xhdGlsZQotICBAY2hhaW5hYmxlCi0qLwotQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlw
ZS52b2xhdGlsZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5jYWNoZWFibGUoZmFsc2Up
OworQ2hhaW5Ob2RlUHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oKSB7CisgIGlmICh0aGlzLl92
YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dhdGNoaW5nKSB7CisgICAgdmFyIG9iaiA9IHRo
aXMuX3BhcmVudC52YWx1ZSgpOworICAgIHRoaXMuX3ZhbHVlID0gbGF6eUdldChvYmosIHRoaXMu
X2tleSk7CisgIH0KKyAgcmV0dXJuIHRoaXMuX3ZhbHVlOwogfTsKIAotLyoqCi0gIFNldHMgdGhl
IGRlcGVuZGVudCBrZXlzIG9uIHRoaXMgY29tcHV0ZWQgcHJvcGVydHkuIFBhc3MgYW55IG51bWJl
ciBvZgotICBhcmd1bWVudHMgY29udGFpbmluZyBrZXkgcGF0aHMgdGhhdCB0aGlzIGNvbXB1dGVk
IHByb3BlcnR5IGRlcGVuZHMgb24uCi0KLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5wcmVzaWRl
bnQgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICBmdWxsTmFtZTogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsg
dGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgIC8vIFRlbGwgRW1iZXIgdGhhdCB0aGlzIGNv
bXB1dGVkIHByb3BlcnR5IGRlcGVuZHMgb24gZmlyc3ROYW1lCi0gICAgICAvLyBhbmQgbGFzdE5h
bWUKLSAgICB9KS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKLSAgfSk7Ci0gIGBg
YAorQ2hhaW5Ob2RlUHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMu
X3dhdGNoaW5nKSB7CisgICAgdmFyIG9iaiA9IHRoaXMuX29iamVjdDsKKyAgICBpZiAob2JqKSB7
IHJlbW92ZUNoYWluV2F0Y2hlcihvYmosIHRoaXMuX2tleSwgdGhpcyk7IH0KKyAgICB0aGlzLl93
YXRjaGluZyA9IGZhbHNlOyAvLyBzbyBmdXR1cmUgY2FsbHMgZG8gbm90aGluZworICB9Cit9Owog
Ci0gIEBtZXRob2QgcHJvcGVydHkKLSAgQHBhcmFtIHtTdHJpbmd9IHBhdGgqIHplcm8gb3IgbW9y
ZSBwcm9wZXJ0eSBwYXRocwotICBAY2hhaW5hYmxlCi0qLwotQ29tcHV0ZWRQcm9wZXJ0eVByb3Rv
dHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgewotICB2YXIgYXJncyA9IFtdOwotICBmb3IgKHZh
ciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBhcmdzLnB1
c2goYXJndW1lbnRzW2ldKTsKKy8vIGNvcGllcyBhIHRvcCBsZXZlbCBvYmplY3Qgb25seQorQ2hh
aW5Ob2RlUHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihvYmopIHsKKyAgdmFyIHJldCA9IG5ldyBD
aGFpbk5vZGUobnVsbCwgbnVsbCwgb2JqKSwKKyAgICAgIHBhdGhzID0gdGhpcy5fcGF0aHMsIHBh
dGg7CisgIGZvciAocGF0aCBpbiBwYXRocykgeworICAgIGlmIChwYXRoc1twYXRoXSA8PSAwKSB7
IGNvbnRpbnVlOyB9IC8vIHRoaXMgY2hlY2sgd2lsbCBhbHNvIGNhdGNoIG5vbi1udW1iZXIgdmFs
cy4KKyAgICByZXQuYWRkKHBhdGgpOwogICB9Ci0gIHRoaXMuX2RlcGVuZGVudEtleXMgPSBhcmdz
OwotICByZXR1cm4gdGhpczsKKyAgcmV0dXJuIHJldDsKIH07CiAKLS8qKgotICBJbiBzb21lIGNh
c2VzLCB5b3UgbWF5IHdhbnQgdG8gYW5ub3RhdGUgY29tcHV0ZWQgcHJvcGVydGllcyB3aXRoIGFk
ZGl0aW9uYWwKLSAgbWV0YWRhdGEgYWJvdXQgaG93IHRoZXkgZnVuY3Rpb24gb3Igd2hhdCB2YWx1
ZXMgdGhleSBvcGVyYXRlIG9uLiBGb3IgZXhhbXBsZSwKLSAgY29tcHV0ZWQgcHJvcGVydHkgZnVu
Y3Rpb25zIG1heSBjbG9zZSBvdmVyIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuIG5vIGxvbmdlcgot
ICBhdmFpbGFibGUgZm9yIGludHJvc3BlY3Rpb24uCisvLyBjYWxsZWQgb24gdGhlIHJvb3Qgbm9k
ZSBvZiBhIGNoYWluIHRvIHNldHVwIHdhdGNoZXJzIG9uIHRoZSBzcGVjaWZpZWQKKy8vIHBhdGgu
CitDaGFpbk5vZGVQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24ocGF0aCkgeworICB2YXIgb2JqLCB0
dXBsZSwga2V5LCBzcmMsIHBhdGhzOwogCi0gIFlvdSBjYW4gcGFzcyBhIGhhc2ggb2YgdGhlc2Ug
dmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVydHkgbGlrZSB0aGlzOgorICBwYXRocyA9IHRoaXMu
X3BhdGhzOworICBwYXRoc1twYXRoXSA9IChwYXRoc1twYXRoXSB8fCAwKSArIDE7CiAKLSAgYGBg
Ci0gIHBlcnNvbjogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHBlcnNvbklkID0gdGhpcy5nZXQoJ3Bl
cnNvbklkJyk7Ci0gICAgcmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsgaWQ6IHBlcnNvbklkIH0p
OwotICB9LnByb3BlcnR5KCkubWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKLSAgYGBgCisgIG9i
aiA9IHRoaXMudmFsdWUoKTsKKyAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgpOwog
Ci0gIFRoZSBoYXNoIHRoYXQgeW91IHBhc3MgdG8gdGhlIGBtZXRhKClgIGZ1bmN0aW9uIHdpbGwg
YmUgc2F2ZWQgb24gdGhlCi0gIGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3IgdW5kZXIgdGhl
IGBfbWV0YWAga2V5LiBFbWJlciBydW50aW1lCi0gIGV4cG9zZXMgYSBwdWJsaWMgQVBJIGZvciBy
ZXRyaWV2aW5nIHRoZXNlIHZhbHVlcyBmcm9tIGNsYXNzZXMsCi0gIHZpYSB0aGUgYG1ldGFGb3JQ
cm9wZXJ0eSgpYCBmdW5jdGlvbi4KKyAgLy8gdGhlIHBhdGggd2FzIGEgbG9jYWwgcGF0aAorICBp
ZiAodHVwbGVbMF0gJiYgdHVwbGVbMF0gPT09IG9iaikgeworICAgIHBhdGggPSB0dXBsZVsxXTsK
KyAgICBrZXkgID0gZmlyc3RLZXkocGF0aCk7CisgICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxl
bmd0aCsxKTsKIAotICBAbWV0aG9kIG1ldGEKLSAgQHBhcmFtIHtIYXNofSBtZXRhCi0gIEBjaGFp
bmFibGUKLSovCisgIC8vIGdsb2JhbCBwYXRoLCBidXQgb2JqZWN0IGRvZXMgbm90IGV4aXN0IHll
dC4KKyAgLy8gcHV0IGludG8gYSBxdWV1ZSBhbmQgdHJ5IHRvIGNvbm5lY3QgbGF0ZXIuCisgIH0g
ZWxzZSBpZiAoIXR1cGxlWzBdKSB7CisgICAgcGVuZGluZ1F1ZXVlLnB1c2goW3RoaXMsIHBhdGhd
KTsKKyAgICB0dXBsZS5sZW5ndGggPSAwOworICAgIHJldHVybjsKIAotQ29tcHV0ZWRQcm9wZXJ0
eVByb3RvdHlwZS5tZXRhID0gZnVuY3Rpb24obWV0YSkgewotICBpZiAoYXJndW1lbnRzLmxlbmd0
aCA9PT0gMCkgewotICAgIHJldHVybiB0aGlzLl9tZXRhIHx8IHt9OworICAvLyBnbG9iYWwgcGF0
aCwgYW5kIG9iamVjdCBhbHJlYWR5IGV4aXN0cwogICB9IGVsc2UgewotICAgIHRoaXMuX21ldGEg
PSBtZXRhOwotICAgIHJldHVybiB0aGlzOworICAgIHNyYyAgPSB0dXBsZVswXTsKKyAgICBrZXkg
ID0gcGF0aC5zbGljZSgwLCAwLSh0dXBsZVsxXS5sZW5ndGgrMSkpOworICAgIHBhdGggPSB0dXBs
ZVsxXTsKICAgfQotfTsKIAotLyogaW1wbCBkZXNjcmlwdG9yIEFQSSAqLwotQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS53aWxsV2F0Y2ggPSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgLy8g
d2F0Y2ggYWxyZWFkeSBjcmVhdGVzIG1ldGEgZm9yIHRoaXMgaW5zdGFuY2UKLSAgdmFyIG1ldGEg
PSBvYmpbTUVUQV9LRVldOwotICBFbWJlci5hc3NlcnQoJ3dhdGNoIHNob3VsZCBoYXZlIHNldHVw
IG1ldGEgdG8gYmUgd3JpdGFibGUnLCBtZXRhLnNvdXJjZSA9PT0gb2JqKTsKLSAgaWYgKCEoa2V5
TmFtZSBpbiBtZXRhLmNhY2hlKSkgewotICAgIGFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBr
ZXlOYW1lLCBtZXRhKTsKLSAgfQorICB0dXBsZS5sZW5ndGggPSAwOworICB0aGlzLmNoYWluKGtl
eSwgcGF0aCwgc3JjKTsKIH07CiAKLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZGlkVW53YXRj
aCA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV07
Ci0gIEVtYmVyLmFzc2VydCgndW53YXRjaCBzaG91bGQgaGF2ZSBzZXR1cCBtZXRhIHRvIGJlIHdy
aXRhYmxlJywgbWV0YS5zb3VyY2UgPT09IG9iaik7Ci0gIGlmICghKGtleU5hbWUgaW4gbWV0YS5j
YWNoZSkpIHsKLSAgICAvLyB1bndhdGNoIGFscmVhZHkgY3JlYXRlcyBtZXRhIGZvciB0aGlzIGlu
c3RhbmNlCi0gICAgcmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUsIG1ldGEp
OwotICB9Ci19OworLy8gY2FsbGVkIG9uIHRoZSByb290IG5vZGUgb2YgYSBjaGFpbiB0byB0ZWFy
ZG93biB3YXRjaGVyIG9uIHRoZSBzcGVjaWZpZWQKKy8vIHBhdGgKK0NoYWluTm9kZVByb3RvdHlw
ZS5yZW1vdmUgPSBmdW5jdGlvbihwYXRoKSB7CisgIHZhciBvYmosIHR1cGxlLCBrZXksIHNyYywg
cGF0aHM7CiAKLS8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90
b3R5cGUuZGlkQ2hhbmdlID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gIC8vIF9zdXNwZW5k
ZWQgaXMgc2V0IHZpYSBhIENQLnNldCB0byBlbnN1cmUgd2UgZG9uJ3QgY2xlYXIKLSAgLy8gdGhl
IGNhY2hlZCB2YWx1ZSBzZXQgYnkgdGhlIHNldHRlcgotICBpZiAodGhpcy5fY2FjaGVhYmxlICYm
IHRoaXMuX3N1c3BlbmRlZCAhPT0gb2JqKSB7Ci0gICAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7
Ci0gICAgaWYgKGtleU5hbWUgaW4gbWV0YS5jYWNoZSkgewotICAgICAgZGVsZXRlIG1ldGEuY2Fj
aGVba2V5TmFtZV07Ci0gICAgICBpZiAoIW1ldGEud2F0Y2hpbmdba2V5TmFtZV0pIHsKLSAgICAg
ICAgcmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUsIG1ldGEpOwotICAgICAg
fQotICAgIH0KKyAgcGF0aHMgPSB0aGlzLl9wYXRoczsKKyAgaWYgKHBhdGhzW3BhdGhdID4gMCkg
eyBwYXRoc1twYXRoXS0tOyB9CisKKyAgb2JqID0gdGhpcy52YWx1ZSgpOworICB0dXBsZSA9IG5v
cm1hbGl6ZVR1cGxlKG9iaiwgcGF0aCk7CisgIGlmICh0dXBsZVswXSA9PT0gb2JqKSB7CisgICAg
cGF0aCA9IHR1cGxlWzFdOworICAgIGtleSAgPSBmaXJzdEtleShwYXRoKTsKKyAgICBwYXRoID0g
cGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOworICB9IGVsc2UgeworICAgIHNyYyAgPSB0dXBsZVsw
XTsKKyAgICBrZXkgID0gcGF0aC5zbGljZSgwLCAwLSh0dXBsZVsxXS5sZW5ndGgrMSkpOworICAg
IHBhdGggPSB0dXBsZVsxXTsKICAgfQorCisgIHR1cGxlLmxlbmd0aCA9IDA7CisgIHRoaXMudW5j
aGFpbihrZXksIHBhdGgpOwogfTsKIAotLyogaW1wbCBkZXNjcmlwdG9yIEFQSSAqLwotQ29tcHV0
ZWRQcm9wZXJ0eVByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgdmFy
IHJldCwgY2FjaGUsIG1ldGE7Ci0gIGlmICh0aGlzLl9jYWNoZWFibGUpIHsKLSAgICBtZXRhID0g
bWV0YUZvcihvYmopOwotICAgIGNhY2hlID0gbWV0YS5jYWNoZTsKLSAgICBpZiAoa2V5TmFtZSBp
biBjYWNoZSkgeyByZXR1cm4gY2FjaGVba2V5TmFtZV07IH0KLSAgICByZXQgPSBjYWNoZVtrZXlO
YW1lXSA9IHRoaXMuZnVuYy5jYWxsKG9iaiwga2V5TmFtZSk7Ci0gICAgaWYgKCFtZXRhLndhdGNo
aW5nW2tleU5hbWVdKSB7Ci0gICAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFt
ZSwgbWV0YSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldCA9IHRoaXMuZnVuYy5jYWxsKG9i
aiwga2V5TmFtZSk7CitDaGFpbk5vZGVQcm90b3R5cGUuY291bnQgPSAwOworCitDaGFpbk5vZGVQ
cm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihrZXksIHBhdGgsIHNyYykgeworICB2YXIgY2hhaW5z
ID0gdGhpcy5fY2hhaW5zLCBub2RlOworICBpZiAoIWNoYWlucykgeyBjaGFpbnMgPSB0aGlzLl9j
aGFpbnMgPSB7fTsgfQorCisgIG5vZGUgPSBjaGFpbnNba2V5XTsKKyAgaWYgKCFub2RlKSB7IG5v
ZGUgPSBjaGFpbnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCBzcmMpOyB9CisgIG5v
ZGUuY291bnQrKzsgLy8gY291bnQgY2hhaW5zLi4uCisKKyAgLy8gY2hhaW4gcmVzdCBvZiBwYXRo
IGlmIHRoZXJlIGlzIG9uZQorICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aD4wKSB7CisgICAga2V5
ID0gZmlyc3RLZXkocGF0aCk7CisgICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsK
KyAgICBub2RlLmNoYWluKGtleSwgcGF0aCk7IC8vIE5PVEU6IG5vIHNyYyBtZWFucyBpdCB3aWxs
IG9ic2VydmUgY2hhbmdlcy4uLgogICB9Ci0gIHJldHVybiByZXQ7CiB9OwogCi0vKiBpbXBsIGRl
c2NyaXB0b3IgQVBJICovCi1Db21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnNldCA9IGZ1bmN0aW9u
KG9iaiwga2V5TmFtZSwgdmFsdWUpIHsKLSAgdmFyIGNhY2hlYWJsZSA9IHRoaXMuX2NhY2hlYWJs
ZSwKLSAgICAgIGZ1bmMgPSB0aGlzLmZ1bmMsCi0gICAgICBtZXRhID0gbWV0YUZvcihvYmosIGNh
Y2hlYWJsZSksCi0gICAgICB3YXRjaGVkID0gbWV0YS53YXRjaGluZ1trZXlOYW1lXSwKLSAgICAg
IG9sZFN1c3BlbmRlZCA9IHRoaXMuX3N1c3BlbmRlZCwKLSAgICAgIGhhZENhY2hlZFZhbHVlID0g
ZmFsc2UsCi0gICAgICBjYWNoZSA9IG1ldGEuY2FjaGUsCi0gICAgICBjYWNoZWRWYWx1ZSwgcmV0
OworQ2hhaW5Ob2RlUHJvdG90eXBlLnVuY2hhaW4gPSBmdW5jdGlvbihrZXksIHBhdGgpIHsKKyAg
dmFyIGNoYWlucyA9IHRoaXMuX2NoYWlucywgbm9kZSA9IGNoYWluc1trZXldOwogCi0gIHRoaXMu
X3N1c3BlbmRlZCA9IG9iajsKKyAgLy8gdW5jaGFpbiByZXN0IG9mIHBhdGggZmlyc3QuLi4KKyAg
aWYgKHBhdGggJiYgcGF0aC5sZW5ndGg+MSkgeworICAgIGtleSAgPSBmaXJzdEtleShwYXRoKTsK
KyAgICBwYXRoID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOworICAgIG5vZGUudW5jaGFpbihr
ZXksIHBhdGgpOworICB9CiAKLSAgdHJ5IHsKLSAgICBpZiAoY2FjaGVhYmxlICYmIGNhY2hlLmhh
c093blByb3BlcnR5KGtleU5hbWUpKSB7Ci0gICAgICBjYWNoZWRWYWx1ZSA9IGNhY2hlW2tleU5h
bWVdOwotICAgICAgaGFkQ2FjaGVkVmFsdWUgPSB0cnVlOwotICAgIH0KKyAgLy8gZGVsZXRlIG5v
ZGUgaWYgbmVlZGVkLgorICBub2RlLmNvdW50LS07CisgIGlmIChub2RlLmNvdW50PD0wKSB7Cisg
ICAgZGVsZXRlIGNoYWluc1tub2RlLl9rZXldOworICAgIG5vZGUuZGVzdHJveSgpOworICB9CiAK
LSAgICAvLyBDaGVjayBpZiB0aGUgQ1AgaGFzIGJlZW4gd3JhcHBlZAotICAgIGlmIChmdW5jLndy
YXBwZWRGdW5jdGlvbikgeyBmdW5jID0gZnVuYy53cmFwcGVkRnVuY3Rpb247IH0KK307CiAKLSAg
ICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21wdXRlZCBwcm9wZXJ0aWVz
Ci0gICAgLy8gdGhhdCBjaGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiB0byBkZXRlcm1p
bmUgaWYKLSAgICAvLyB0aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBvbmx5IHBhc3MgdGhlIG9s
ZCBjYWNoZWQKLSAgICAvLyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgb3B0cyBpbnRv
IGEgdGhpcmQKLSAgICAvLyBhcmd1bWVudC4KLSAgICBpZiAoZnVuYy5sZW5ndGggPT09IDMpIHsK
LSAgICAgIHJldCA9IGZ1bmMuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlLCBjYWNoZWRWYWx1ZSk7
Ci0gICAgfSBlbHNlIGlmIChmdW5jLmxlbmd0aCA9PT0gMikgewotICAgICAgcmV0ID0gZnVuYy5j
YWxsKG9iaiwga2V5TmFtZSwgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5kZWZp
bmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIGNhY2hlZFZhbHVlKTsKLSAgICAgIEVtYmVy
LnNldChvYmosIGtleU5hbWUsIHZhbHVlKTsKLSAgICAgIHJldHVybjsKK0NoYWluTm9kZVByb3Rv
dHlwZS53aWxsQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnRzKSB7CisgIHZhciBjaGFpbnMgPSB0aGlz
Ll9jaGFpbnM7CisgIGlmIChjaGFpbnMpIHsKKyAgICBmb3IodmFyIGtleSBpbiBjaGFpbnMpIHsK
KyAgICAgIGlmICghY2hhaW5zLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KKyAg
ICAgIGNoYWluc1trZXldLndpbGxDaGFuZ2UoZXZlbnRzKTsKICAgICB9CisgIH0KIAotICAgIGlm
IChoYWRDYWNoZWRWYWx1ZSAmJiBjYWNoZWRWYWx1ZSA9PT0gcmV0KSB7IHJldHVybjsgfQorICBp
ZiAodGhpcy5fcGFyZW50KSB7IHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2UodGhpcywgdGhp
cy5fa2V5LCAxLCBldmVudHMpOyB9Cit9OwogCi0gICAgaWYgKHdhdGNoZWQpIHsgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSk7IH0KK0NoYWluTm9kZVByb3RvdHlwZS5jaGFp
bldpbGxDaGFuZ2UgPSBmdW5jdGlvbihjaGFpbiwgcGF0aCwgZGVwdGgsIGV2ZW50cykgeworICBp
ZiAodGhpcy5fa2V5KSB7IHBhdGggPSB0aGlzLl9rZXkgKyAnLicgKyBwYXRoOyB9CiAKLSAgICBp
ZiAoaGFkQ2FjaGVkVmFsdWUpIHsKLSAgICAgIGRlbGV0ZSBjYWNoZVtrZXlOYW1lXTsKKyAgaWYg
KHRoaXMuX3BhcmVudCkgeworICAgIHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2UodGhpcywg
cGF0aCwgZGVwdGgrMSwgZXZlbnRzKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVwdGggPiAxKSB7
CisgICAgICBldmVudHMucHVzaCh0aGlzLnZhbHVlKCksIHBhdGgpOwogICAgIH0KLQotICAgIGlm
IChjYWNoZWFibGUpIHsKLSAgICAgIGlmICghd2F0Y2hlZCAmJiAhaGFkQ2FjaGVkVmFsdWUpIHsK
LSAgICAgICAgYWRkRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUsIG1ldGEpOwotICAg
ICAgfQotICAgICAgY2FjaGVba2V5TmFtZV0gPSByZXQ7CisgICAgcGF0aCA9ICd0aGlzLicgKyBw
YXRoOworICAgIGlmICh0aGlzLl9wYXRoc1twYXRoXSA+IDApIHsKKyAgICAgIGV2ZW50cy5wdXNo
KHRoaXMudmFsdWUoKSwgcGF0aCk7CiAgICAgfQotCi0gICAgaWYgKHdhdGNoZWQpIHsgRW1iZXIu
cHJvcGVydHlEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKTsgfQotICB9IGZpbmFsbHkgewotICAgIHRo
aXMuX3N1c3BlbmRlZCA9IG9sZFN1c3BlbmRlZDsKICAgfQotICByZXR1cm4gcmV0OwogfTsKIAot
LyogY2FsbGVkIHdoZW4gcHJvcGVydHkgaXMgZGVmaW5lZCAqLwotQ29tcHV0ZWRQcm9wZXJ0eVBy
b3RvdHlwZS5zZXR1cCA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICB2YXIgbWV0YSA9IG9i
altNRVRBX0tFWV07Ci0gIGlmIChtZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5TmFtZV0pIHsKLSAg
ICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YUZvcihvYmopKTsKK0No
YWluTm9kZVByb3RvdHlwZS5jaGFpbkRpZENoYW5nZSA9IGZ1bmN0aW9uKGNoYWluLCBwYXRoLCBk
ZXB0aCwgZXZlbnRzKSB7CisgIGlmICh0aGlzLl9rZXkpIHsgcGF0aCA9IHRoaXMuX2tleSArICcu
JyArIHBhdGg7IH0KKyAgaWYgKHRoaXMuX3BhcmVudCkgeworICAgIHRoaXMuX3BhcmVudC5jaGFp
bkRpZENoYW5nZSh0aGlzLCBwYXRoLCBkZXB0aCsxLCBldmVudHMpOworICB9IGVsc2UgeworICAg
IGlmIChkZXB0aCA+IDEpIHsKKyAgICAgIGV2ZW50cy5wdXNoKHRoaXMudmFsdWUoKSwgcGF0aCk7
CisgICAgfQorICAgIHBhdGggPSAndGhpcy4nICsgcGF0aDsKKyAgICBpZiAodGhpcy5fcGF0aHNb
cGF0aF0gPiAwKSB7CisgICAgICBldmVudHMucHVzaCh0aGlzLnZhbHVlKCksIHBhdGgpOworICAg
IH0KICAgfQogfTsKIAotLyogY2FsbGVkIGJlZm9yZSBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuICov
Ci1Db21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24ob2JqLCBrZXlO
YW1lKSB7Ci0gIHZhciBtZXRhID0gbWV0YUZvcihvYmopOworQ2hhaW5Ob2RlUHJvdG90eXBlLmRp
ZENoYW5nZSA9IGZ1bmN0aW9uKGV2ZW50cykgeworICAvLyBpbnZhbGlkYXRlIG15IG93biB2YWx1
ZSBmaXJzdC4KKyAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7CisgICAgdmFyIG9iaiA9IHRoaXMuX3Bh
cmVudC52YWx1ZSgpOworICAgIGlmIChvYmogIT09IHRoaXMuX29iamVjdCkgeworICAgICAgcmVt
b3ZlQ2hhaW5XYXRjaGVyKHRoaXMuX29iamVjdCwgdGhpcy5fa2V5LCB0aGlzKTsKKyAgICAgIHRo
aXMuX29iamVjdCA9IG9iajsKKyAgICAgIGFkZENoYWluV2F0Y2hlcihvYmosIHRoaXMuX2tleSwg
dGhpcyk7CisgICAgfQorICAgIHRoaXMuX3ZhbHVlICA9IHVuZGVmaW5lZDsKIAotICBpZiAobWV0
YS53YXRjaGluZ1trZXlOYW1lXSB8fCBrZXlOYW1lIGluIG1ldGEuY2FjaGUpIHsKLSAgICByZW1v
dmVEZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7CisgICAgLy8gU3BlY2lh
bC1jYXNlOiB0aGUgRWFjaFByb3h5IHJlbGllcyBvbiBpbW1lZGlhdGUgZXZhbHVhdGlvbiB0bwor
ICAgIC8vIGVzdGFibGlzaCBpdHMgb2JzZXJ2ZXJzLgorICAgIGlmICh0aGlzLl9wYXJlbnQgJiYg
dGhpcy5fcGFyZW50Ll9rZXkgPT09ICdAZWFjaCcpCisgICAgICB0aGlzLnZhbHVlKCk7CiAgIH0K
IAotICBpZiAodGhpcy5fY2FjaGVhYmxlKSB7IGRlbGV0ZSBtZXRhLmNhY2hlW2tleU5hbWVdOyB9
CisgIC8vIHRoZW4gbm90aWZ5IGNoYWlucy4uLgorICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5z
OworICBpZiAoY2hhaW5zKSB7CisgICAgZm9yKHZhciBrZXkgaW4gY2hhaW5zKSB7CisgICAgICBp
ZiAoIWNoYWlucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9CisgICAgICBjaGFp
bnNba2V5XS5kaWRDaGFuZ2UoZXZlbnRzKTsKKyAgICB9CisgIH0KIAotICByZXR1cm4gbnVsbDsg
Ly8gbm8gdmFsdWUgdG8gcmVzdG9yZQotfTsKKyAgLy8gaWYgbm8gZXZlbnRzIGFyZSBwYXNzZWQg
aW4gdGhlbiB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGFib3ZlIHdpcmluZyB1cGRhdGUKKyAgaWYg
KGV2ZW50cyA9PT0gbnVsbCkgeyByZXR1cm47IH0KIAorICAvLyBhbmQgZmluYWxseSB0ZWxsIHBh
cmVudCBhYm91dCBteSBwYXRoIGNoYW5naW5nLi4uCisgIGlmICh0aGlzLl9wYXJlbnQpIHsgdGhp
cy5fcGFyZW50LmNoYWluRGlkQ2hhbmdlKHRoaXMsIHRoaXMuX2tleSwgMSwgZXZlbnRzKTsgfQor
fTsKIAotLyoqCi0gIFRoaXMgaGVscGVyIHJldHVybnMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRv
ciB0aGF0IHdyYXBzIHRoZSBwYXNzZWQKLSAgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb24uIFlv
dSBjYW4gdXNlIHRoaXMgaGVscGVyIHRvIGRlZmluZSBwcm9wZXJ0aWVzCi0gIHdpdGggbWl4aW5z
IG9yIHZpYSBgRW1iZXIuZGVmaW5lUHJvcGVydHkoKWAuCitFbWJlci5maW5pc2hDaGFpbnMgPSBm
dW5jdGlvbihvYmopIHsKKyAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBt
LmNoYWluczsKKyAgaWYgKGNoYWlucykgeworICAgIGlmIChjaGFpbnMudmFsdWUoKSAhPT0gb2Jq
KSB7CisgICAgICBtLmNoYWlucyA9IGNoYWlucyA9IGNoYWlucy5jb3B5KG9iaik7CisgICAgfQor
ICAgIGNoYWlucy5kaWRDaGFuZ2UobnVsbCk7CisgIH0KK307CiAKLSAgVGhlIGZ1bmN0aW9uIHlv
dSBwYXNzIHdpbGwgYmUgdXNlZCB0byBib3RoIGdldCBhbmQgc2V0IHByb3BlcnR5IHZhbHVlcy4K
LSAgVGhlIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgdHdvIHBhcmFtZXRlcnMsIGtleSBhbmQgdmFs
dWUuIElmIHZhbHVlIGlzIG5vdAotICB1bmRlZmluZWQgeW91IHNob3VsZCBzZXQgdGhlIHZhbHVl
IGZpcnN0LiBJbiBlaXRoZXIgY2FzZSByZXR1cm4gdGhlCi0gIGN1cnJlbnQgdmFsdWUgb2YgdGhl
IHByb3BlcnR5LgorfSkoKTsKIAotICBAbWV0aG9kIGNvbXB1dGVkCi0gIEBmb3IgRW1iZXIKLSAg
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb24uCi0g
IEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHByb3BlcnR5IGRlc2NyaXB0b3IgaW5z
dGFuY2UKLSovCi1FbWJlci5jb21wdXRlZCA9IGZ1bmN0aW9uKGZ1bmMpIHsKLSAgdmFyIGFyZ3M7
CiAKLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgYXJncyA9IGFfc2xpY2UuY2Fs
bChhcmd1bWVudHMsIDAsIC0xKTsKLSAgICBmdW5jID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywg
LTEpWzBdOwotICB9CiAKLSAgdmFyIGNwID0gbmV3IENvbXB1dGVkUHJvcGVydHkoZnVuYyk7Ciso
ZnVuY3Rpb24oKSB7CiAKLSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5hcHBseShjcCwg
YXJncyk7Ci0gIH0KK30pKCk7CiAKLSAgcmV0dXJuIGNwOwotfTsKIAotLyoqCi0gIFJldHVybnMg
dGhlIGNhY2hlZCB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSwgaWYgb25lIGV4aXN0cy4KLSAgVGhpcyBj
YW4gYmUgdXNlZnVsIGZvciBwZWVraW5nIGF0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkCi0gIHBy
b3BlcnR5IHRoYXQgaXMgZ2VuZXJhdGVkIGxhemlseSwgd2l0aG91dCBhY2NpZGVudGFsbHkgY2F1
c2luZwotICBpdCB0byBiZSBjcmVhdGVkLgogCi0gIEBtZXRob2QgY2FjaGVGb3IKLSAgQGZvciBF
bWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIHRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgeW91
IHdhbnQgdG8gY2hlY2sKLSAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgbmFtZSBvZiB0aGUgcHJv
cGVydHkgd2hvc2UgY2FjaGVkIHZhbHVlIHlvdSB3YW50Ci0gICAgdG8gcmV0dXJuCi0qLwotRW1i
ZXIuY2FjaGVGb3IgPSBmdW5jdGlvbiBjYWNoZUZvcihvYmosIGtleSkgewotICB2YXIgY2FjaGUg
PSBtZXRhRm9yKG9iaiwgZmFsc2UpLmNhY2hlOworKGZ1bmN0aW9uKCkgewordmFyIG1ldGFGb3Ig
PSBFbWJlci5tZXRhLCAvLyB1dGlscy5qcworICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZiwgLy8g
dXRpbHMuanMKKyAgICBDaGFpbk5vZGUgPSBFbWJlci5fQ2hhaW5Ob2RlOyAvLyBjaGFpbnMuanMK
IAotICBpZiAoY2FjaGUgJiYga2V5IGluIGNhY2hlKSB7Ci0gICAgcmV0dXJuIGNhY2hlW2tleV07
CisvLyBnZXQgdGhlIGNoYWlucyBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0LiBJZiB0aGUgY3VycmVu
dCBvYmplY3QgaGFzCisvLyBjaGFpbnMgaW5oZXJpdGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2ls
bCBiZSBjbG9uZWQgYW5kIHJlY29uZmlndXJlZCBmb3IKKy8vIHRoZSBjdXJyZW50IG9iamVjdC4K
K2Z1bmN0aW9uIGNoYWluc0ZvcihvYmopIHsKKyAgdmFyIG0gPSBtZXRhRm9yKG9iaiksIHJldCA9
IG0uY2hhaW5zOworICBpZiAoIXJldCkgeworICAgIHJldCA9IG0uY2hhaW5zID0gbmV3IENoYWlu
Tm9kZShudWxsLCBudWxsLCBvYmopOworICB9IGVsc2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmop
IHsKKyAgICByZXQgPSBtLmNoYWlucyA9IHJldC5jb3B5KG9iaik7CiAgIH0KLX07CisgIHJldHVy
biByZXQ7Cit9CiAKLS8qKgotICBAbWV0aG9kIGNvbXB1dGVkLm5vdAotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSovCi1FbWJlci5jb21wdXRlZC5ub3QgPSBm
dW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVu
dEtleSwgZnVuY3Rpb24oa2V5KSB7Ci0gICAgcmV0dXJuICFnZXQodGhpcywgZGVwZW5kZW50S2V5
KTsKLSAgfSk7Ci19OworRW1iZXIud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2JqLCBrZXlQYXRoKSB7
CisgIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBBcnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KKyAg
aWYgKGtleVBhdGggPT09ICdsZW5ndGgnICYmIHR5cGVPZihvYmopID09PSAnYXJyYXknKSB7IHJl
dHVybjsgfQogCi0vKioKLSAgQG1ldGhvZCBjb21wdXRlZC5lbXB0eQotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSovCi1FbWJlci5jb21wdXRlZC5lbXB0eSA9
IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5k
ZW50S2V5LCBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgdmFsID0gZ2V0KHRoaXMsIGRlcGVuZGVu
dEtleSk7Ci0gICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCB2
YWwgPT09ICcnIHx8IChFbWJlci5pc0FycmF5KHZhbCkgJiYgZ2V0KHZhbCwgJ2xlbmd0aCcpID09
PSAwKTsKLSAgfSk7Ci19OworICB2YXIgbSA9IG1ldGFGb3Iob2JqKSwgd2F0Y2hpbmcgPSBtLndh
dGNoaW5nOwogCi0vKioKLSAgQG1ldGhvZCBjb21wdXRlZC5ib29sCi0gIEBmb3IgRW1iZXIKLSAg
QHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotKi8KLUVtYmVyLmNvbXB1dGVkLmJvb2wgPSBm
dW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVu
dEtleSwgZnVuY3Rpb24oa2V5KSB7Ci0gICAgcmV0dXJuICEhZ2V0KHRoaXMsIGRlcGVuZGVudEtl
eSk7Ci0gIH0pOworICBpZiAoIXdhdGNoaW5nW2tleVBhdGhdKSB7IC8vIGFjdGl2YXRlIHdhdGNo
aW5nIGZpcnN0IHRpbWUKKyAgICB3YXRjaGluZ1trZXlQYXRoXSA9IDE7CisgICAgY2hhaW5zRm9y
KG9iaikuYWRkKGtleVBhdGgpOworICB9IGVsc2UgeworICAgIHdhdGNoaW5nW2tleVBhdGhdID0g
KHdhdGNoaW5nW2tleVBhdGhdIHx8IDApICsgMTsKKyAgfQogfTsKIAotLyoqCi0gIEBtZXRob2Qg
Y29tcHV0ZWQuYWxpYXMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50
S2V5Ci0qLwotRW1iZXIuY29tcHV0ZWQuYWxpYXMgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsK
LSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oa2V5LCB2YWx1
ZSl7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIHJldHVybiBnZXQo
dGhpcywgZGVwZW5kZW50S2V5KTsKLSAgICB9IGVsc2UgewotICAgICAgc2V0KHRoaXMsIGRlcGVu
ZGVudEtleSwgdmFsdWUpOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgfSk7Ci19Owor
RW1iZXIudW53YXRjaFBhdGggPSBmdW5jdGlvbihvYmosIGtleVBhdGgpIHsKKyAgdmFyIG0gPSBt
ZXRhRm9yKG9iaiksIHdhdGNoaW5nID0gbS53YXRjaGluZzsKIAorICBpZiAod2F0Y2hpbmdba2V5
UGF0aF0gPT09IDEpIHsKKyAgICB3YXRjaGluZ1trZXlQYXRoXSA9IDA7CisgICAgY2hhaW5zRm9y
KG9iaikucmVtb3ZlKGtleVBhdGgpOworICB9IGVsc2UgaWYgKHdhdGNoaW5nW2tleVBhdGhdID4g
MSkgeworICAgIHdhdGNoaW5nW2tleVBhdGhdLS07CisgIH0KK307CiB9KSgpOwogCiAKQEAgLTM2
NTQsMzU5NyArNDA5OCwzODYzIEBAIEVtYmVyLmNvbXB1dGVkLmFsaWFzID0gZnVuY3Rpb24oZGVw
ZW5kZW50S2V5KSB7CiBAbW9kdWxlIGVtYmVyLW1ldGFsCiAqLwogCi12YXIgb19jcmVhdGUgPSBF
bWJlci5jcmVhdGUsCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgbWV0YVBhdGggPSBF
bWJlci5tZXRhUGF0aCwKLSAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZOwordmFyIG1ldGFG
b3IgPSBFbWJlci5tZXRhLCAvLyB1dGlscy5qcworICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9L
RVksIC8vIHV0aWxzLmpzCisgICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwgLy8gdXRpbHMu
anMKKyAgICByZW1vdmVDaGFpbldhdGNoZXIgPSBFbWJlci5yZW1vdmVDaGFpbldhdGNoZXIsCisg
ICAgd2F0Y2hLZXkgPSBFbWJlci53YXRjaEtleSwgLy8gd2F0Y2hfa2V5LmpzCisgICAgdW53YXRj
aEtleSA9IEVtYmVyLnVud2F0Y2hLZXksCisgICAgd2F0Y2hQYXRoID0gRW1iZXIud2F0Y2hQYXRo
LCAvLyB3YXRjaF9wYXRoLmpzCisgICAgdW53YXRjaFBhdGggPSBFbWJlci51bndhdGNoUGF0aCwK
KyAgICB0eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxzLmpzCisgICAgZ2VuZXJhdGVHdWlk
ID0gRW1iZXIuZ2VuZXJhdGVHdWlkLAorICAgIElTX1BBVEggPSAvW1wuXCpdLzsKIAotLyoKLSAg
VGhlIGV2ZW50IHN5c3RlbSB1c2VzIGEgc2VyaWVzIG9mIG5lc3RlZCBoYXNoZXMgdG8gc3RvcmUg
bGlzdGVuZXJzIG9uIGFuCi0gIG9iamVjdC4gV2hlbiBhIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQs
IG9yIHdoZW4gYW4gZXZlbnQgYXJyaXZlcywgdGhlc2UKLSAgaGFzaGVzIGFyZSBjb25zdWx0ZWQg
dG8gZGV0ZXJtaW5lIHdoaWNoIHRhcmdldCBhbmQgYWN0aW9uIHBhaXIgdG8gaW52b2tlLgorLy8g
cmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgcGF0aCBpcyBqdXN0IGEga2V5TmFtZQorZnVuY3Rp
b24gaXNLZXlOYW1lKHBhdGgpIHsKKyAgcmV0dXJuIHBhdGg9PT0nKicgfHwgIUlTX1BBVEgudGVz
dChwYXRoKTsKK30KIAotICBUaGUgaGFzaGVzIGFyZSBzdG9yZWQgaW4gdGhlIG9iamVjdCdzIG1l
dGEgaGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAvLyBPYmplY3QncyBtZXRhIGhh
c2gKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJzOiB7ICAgICAgIC8vIHZhcmlhYmxlIG5hbWU6
IGBsaXN0ZW5lclNldGAKLSAgICAgICAgICAiZm9vOmNoYW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5h
bWU6IGBhY3Rpb25zYAotICAgICAgICAgICAgW3RhcmdldCwgbWV0aG9kLCBvbmNlRmxhZywgc3Vz
cGVuZGVkRmxhZ10KLSAgICAgICAgICBdCi0gICAgICAgIH0KLSAgICAgIH0KKy8qKgorICBTdGFy
dHMgd2F0Y2hpbmcgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QuIFdoZW5ldmVyIHRoZSBwcm9wZXJ0
eSBjaGFuZ2VzLAorICBpbnZva2VzIGBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2VgIGFuZCBgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2VgLiBUaGlzIGlzIHRoZQorICBwcmltaXRpdmUgdXNlZCBieSBv
YnNlcnZlcnMgYW5kIGRlcGVuZGVudCBrZXlzOyB1c3VhbGx5IHlvdSB3aWxsIG5ldmVyIGNhbGwK
KyAgdGhpcyBtZXRob2QgZGlyZWN0bHkgYnV0IGluc3RlYWQgdXNlIGhpZ2hlciBsZXZlbCBtZXRo
b2RzIGxpa2UKKyAgYEVtYmVyLmFkZE9ic2VydmVyKClgCiAKKyAgQHByaXZhdGUKKyAgQG1ldGhv
ZCB3YXRjaAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoKKyAgQHBhcmFtIHtTdHJpbmd9IGtl
eU5hbWUKICovCitFbWJlci53YXRjaCA9IGZ1bmN0aW9uKG9iaiwgX2tleVBhdGgpIHsKKyAgLy8g
Y2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMgc3BlY2lhbC4uLgorICBpZiAoX2tl
eVBhdGggPT09ICdsZW5ndGgnICYmIHR5cGVPZihvYmopID09PSAnYXJyYXknKSB7IHJldHVybjsg
fQogCi1mdW5jdGlvbiBpbmRleE9mKGFycmF5LCB0YXJnZXQsIG1ldGhvZCkgewotICB2YXIgaW5k
ZXggPSAtMTsKLSAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKLSAgICBpZiAodGFyZ2V0ID09PSBhcnJheVtpXVswXSAmJiBtZXRob2QgPT09IGFycmF5W2ld
WzFdKSB7IGluZGV4ID0gaTsgYnJlYWs7IH0KKyAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsK
KyAgICB3YXRjaEtleShvYmosIF9rZXlQYXRoKTsKKyAgfSBlbHNlIHsKKyAgICB3YXRjaFBhdGgo
b2JqLCBfa2V5UGF0aCk7CiAgIH0KLSAgcmV0dXJuIGluZGV4OwotfQotCi1mdW5jdGlvbiBhY3Rp
b25zRm9yKG9iaiwgZXZlbnROYW1lKSB7Ci0gIHZhciBtZXRhID0gbWV0YUZvcihvYmosIHRydWUp
LAotICAgICAgYWN0aW9uczsKK307CiAKLSAgaWYgKCFtZXRhLmxpc3RlbmVycykgeyBtZXRhLmxp
c3RlbmVycyA9IHt9OyB9CitFbWJlci5pc1dhdGNoaW5nID0gZnVuY3Rpb24gaXNXYXRjaGluZyhv
YmosIGtleSkgeworICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV07CisgIHJldHVybiAobWV0YSAm
JiBtZXRhLndhdGNoaW5nW2tleV0pID4gMDsKK307CiAKLSAgaWYgKCFtZXRhLmhhc093blByb3Bl
cnR5KCdsaXN0ZW5lcnMnKSkgewotICAgIC8vIHNldHVwIGluaGVyaXRlZCBjb3B5IG9mIHRoZSBs
aXN0ZW5lcnMgb2JqZWN0Ci0gICAgbWV0YS5saXN0ZW5lcnMgPSBvX2NyZWF0ZShtZXRhLmxpc3Rl
bmVycyk7Ci0gIH0KK0VtYmVyLndhdGNoLmZsdXNoUGVuZGluZyA9IEVtYmVyLmZsdXNoUGVuZGlu
Z0NoYWluczsKIAotICBhY3Rpb25zID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXTsKK0VtYmVy
LnVud2F0Y2ggPSBmdW5jdGlvbihvYmosIF9rZXlQYXRoKSB7CisgIC8vIGNhbid0IHdhdGNoIGxl
bmd0aCBvbiBBcnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KKyAgaWYgKF9rZXlQYXRoID09PSAnbGVu
Z3RoJyAmJiB0eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0KIAotICAvLyBpZiB0
aGVyZSBhcmUgYWN0aW9ucywgYnV0IHRoZSBldmVudE5hbWUgZG9lc24ndCBleGlzdCBpbiBvdXIg
bGlzdGVuZXJzLCB0aGVuIGNvcHkgdGhlbSBmcm9tIHRoZSBwcm90b3R5cGUKLSAgaWYgKGFjdGlv
bnMgJiYgIW1ldGEubGlzdGVuZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHsKLSAgICBh
Y3Rpb25zID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IG1ldGEubGlzdGVuZXJzW2V2ZW50
TmFtZV0uc2xpY2UoKTsKLSAgfSBlbHNlIGlmICghYWN0aW9ucykgewotICAgIGFjdGlvbnMgPSBt
ZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdID0gW107CisgIGlmIChpc0tleU5hbWUoX2tleVBhdGgp
KSB7CisgICAgdW53YXRjaEtleShvYmosIF9rZXlQYXRoKTsKKyAgfSBlbHNlIHsKKyAgICB1bndh
dGNoUGF0aChvYmosIF9rZXlQYXRoKTsKICAgfQorfTsKIAotICByZXR1cm4gYWN0aW9uczsKLX0K
LQotZnVuY3Rpb24gYWN0aW9uc1VuaW9uKG9iaiwgZXZlbnROYW1lLCBvdGhlckFjdGlvbnMpIHsK
LSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAotICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0
YS5saXN0ZW5lcnMgJiYgbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXTsKKy8qKgorICBDYWxsIG9u
IGFuIG9iamVjdCB3aGVuIHlvdSBmaXJzdCBiZWdldCBpdCBmcm9tIGFub3RoZXIgb2JqZWN0LiBU
aGlzIHdpbGwKKyAgc2V0dXAgYW55IGNoYWluZWQgd2F0Y2hlcnMgb24gdGhlIG9iamVjdCBpbnN0
YW5jZSBhcyBuZWVkZWQuIFRoaXMgbWV0aG9kIGlzCisgIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0
aW1lcy4KIAotICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gIGZvciAodmFyIGkgPSBhY3Rp
b25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFyIHRhcmdldCA9IGFjdGlvbnNb
aV1bMF0sCi0gICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaV1bMV0sCi0gICAgICAgIG9uY2UgPSBh
Y3Rpb25zW2ldWzJdLAotICAgICAgICBzdXNwZW5kZWQgPSBhY3Rpb25zW2ldWzNdLAotICAgICAg
ICBhY3Rpb25JbmRleCA9IGluZGV4T2Yob3RoZXJBY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7Cisg
IEBwcml2YXRlCisgIEBtZXRob2QgcmV3YXRjaAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSBvYmoK
KyovCitFbWJlci5yZXdhdGNoID0gZnVuY3Rpb24ob2JqKSB7CisgIHZhciBtID0gbWV0YUZvcihv
YmosIGZhbHNlKSwgY2hhaW5zID0gbS5jaGFpbnM7CiAKLSAgICBpZiAoYWN0aW9uSW5kZXggPT09
IC0xKSB7Ci0gICAgICBvdGhlckFjdGlvbnMucHVzaChbdGFyZ2V0LCBtZXRob2QsIG9uY2UsIHN1
c3BlbmRlZF0pOwotICAgIH0KKyAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaGFzIGl0cyBvd24g
Z3VpZC4KKyAgaWYgKEdVSURfS0VZIGluIG9iaiAmJiAhb2JqLmhhc093blByb3BlcnR5KEdVSURf
S0VZKSkgeworICAgIGdlbmVyYXRlR3VpZChvYmopOwogICB9Ci19Ci0KLWZ1bmN0aW9uIGFjdGlv
bnNEaWZmKG9iaiwgZXZlbnROYW1lLCBvdGhlckFjdGlvbnMpIHsKLSAgdmFyIG1ldGEgPSBvYmpb
TUVUQV9LRVldLAotICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0
YS5saXN0ZW5lcnNbZXZlbnROYW1lXSwKLSAgICAgIGRpZmZBY3Rpb25zID0gW107CiAKLSAgaWYg
KCFhY3Rpb25zKSB7IHJldHVybjsgfQotICBmb3IgKHZhciBpID0gYWN0aW9ucy5sZW5ndGggLSAx
OyBpID49IDA7IGktLSkgewotICAgIHZhciB0YXJnZXQgPSBhY3Rpb25zW2ldWzBdLAotICAgICAg
ICBtZXRob2QgPSBhY3Rpb25zW2ldWzFdLAotICAgICAgICBvbmNlID0gYWN0aW9uc1tpXVsyXSwK
LSAgICAgICAgc3VzcGVuZGVkID0gYWN0aW9uc1tpXVszXSwKLSAgICAgICAgYWN0aW9uSW5kZXgg
PSBpbmRleE9mKG90aGVyQWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0gICAgaWYgKGFjdGlv
bkluZGV4ICE9PSAtMSkgeyBjb250aW51ZTsgfQotCi0gICAgb3RoZXJBY3Rpb25zLnB1c2goW3Rh
cmdldCwgbWV0aG9kLCBvbmNlLCBzdXNwZW5kZWRdKTsKLSAgICBkaWZmQWN0aW9ucy5wdXNoKFt0
YXJnZXQsIG1ldGhvZCwgb25jZSwgc3VzcGVuZGVkXSk7CisgIC8vIG1ha2Ugc3VyZSBhbnkgY2hh
aW5lZCB3YXRjaGVycyB1cGRhdGUuCisgIGlmIChjaGFpbnMgJiYgY2hhaW5zLnZhbHVlKCkgIT09
IG9iaikgeworICAgIG0uY2hhaW5zID0gY2hhaW5zLmNvcHkob2JqKTsKICAgfQorfTsKIAotICBy
ZXR1cm4gZGlmZkFjdGlvbnM7Ci19Cit2YXIgTk9ERV9TVEFDSyA9IFtdOwogCiAvKioKLSAgQWRk
IGFuIGV2ZW50IGxpc3RlbmVyCisgIFRlYXJzIGRvd24gdGhlIG1ldGEgb24gYW4gb2JqZWN0IHNv
IHRoYXQgaXQgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICBNdWx0aXBsZSBjYWxscyB3aWxs
IGhhdmUgbm8gZWZmZWN0LgogCi0gIEBtZXRob2QgYWRkTGlzdGVuZXIKKyAgQG1ldGhvZCBkZXN0
cm95CiAgIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30gZXZlbnRO
YW1lCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZCBBIHRhcmdldCBv
YmplY3Qgb3IgYSBmdW5jdGlvbgotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEg
ZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdl
dGAKKyAgQHBhcmFtIHtPYmplY3R9IG9iaiAgdGhlIG9iamVjdCB0byBkZXN0cm95CisgIEByZXR1
cm4ge3ZvaWR9CiAqLwotZnVuY3Rpb24gYWRkTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdl
dCwgbWV0aG9kLCBvbmNlKSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBsZWFz
dCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIuYWRkTGlzdGVuZXIiLCAhIW9iaiAm
JiAhIWV2ZW50TmFtZSk7Ci0KLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9m
IHRhcmdldCkgewotICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxsOworRW1i
ZXIuZGVzdHJveSA9IGZ1bmN0aW9uIChvYmopIHsKKyAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVld
LCBub2RlLCBub2Rlcywga2V5LCBub2RlT2JqZWN0OworICBpZiAobWV0YSkgeworICAgIG9ialtN
RVRBX0tFWV0gPSBudWxsOworICAgIC8vIHJlbW92ZSBjaGFpbldhdGNoZXJzIHRvIHJlbW92ZSBj
aXJjdWxhciByZWZlcmVuY2VzIHRoYXQgd291bGQgcHJldmVudCBHQworICAgIG5vZGUgPSBtZXRh
LmNoYWluczsKKyAgICBpZiAobm9kZSkgeworICAgICAgTk9ERV9TVEFDSy5wdXNoKG5vZGUpOwor
ICAgICAgLy8gcHJvY2VzcyB0cmVlCisgICAgICB3aGlsZSAoTk9ERV9TVEFDSy5sZW5ndGggPiAw
KSB7CisgICAgICAgIG5vZGUgPSBOT0RFX1NUQUNLLnBvcCgpOworICAgICAgICAvLyBwdXNoIGNo
aWxkcmVuCisgICAgICAgIG5vZGVzID0gbm9kZS5fY2hhaW5zOworICAgICAgICBpZiAobm9kZXMp
IHsKKyAgICAgICAgICBmb3IgKGtleSBpbiBub2RlcykgeworICAgICAgICAgICAgaWYgKG5vZGVz
Lmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICAgICAgTk9ERV9TVEFDSy5wdXNoKG5v
ZGVzW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICAvLyByZW1vdmUgY2hhaW5XYXRjaGVyIGluIG5vZGUgb2JqZWN0CisgICAgICAgIGlmIChub2Rl
Ll93YXRjaGluZykgeworICAgICAgICAgIG5vZGVPYmplY3QgPSBub2RlLl9vYmplY3Q7CisgICAg
ICAgICAgaWYgKG5vZGVPYmplY3QpIHsKKyAgICAgICAgICAgIHJlbW92ZUNoYWluV2F0Y2hlcihu
b2RlT2JqZWN0LCBub2RlLl9rZXksIG5vZGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0KICAgfQorfTsKIAotICB2YXIgYWN0aW9ucyA9IGFjdGlvbnNGb3Iob2JqLCBl
dmVudE5hbWUpLAotICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwg
bWV0aG9kKTsKLQotICBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7IHJldHVybjsgfQorfSkoKTsK
IAotICBhY3Rpb25zLnB1c2goW3RhcmdldCwgbWV0aG9kLCBvbmNlLCB1bmRlZmluZWRdKTsKIAot
ICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRBZGRMaXN0ZW5lcikgewotICAgIG9i
ai5kaWRBZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKLSAgfQotfQogCiso
ZnVuY3Rpb24oKSB7CiAvKioKLSAgUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyCi0KLSAgQXJndW1l
bnRzIHNob3VsZCBtYXRjaCB0aG9zZSBwYXNzZWQgdG8ge3sjY3Jvc3NMaW5rICJFbWJlci9hZGRM
aXN0ZW5lciJ9fXt7L2Nyb3NzTGlua319Ci0KLSAgQG1ldGhvZCByZW1vdmVMaXN0ZW5lcgotICBA
Zm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBA
cGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9y
IGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9u
IG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCitAbW9k
dWxlIGVtYmVyLW1ldGFsCiAqLwotZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIob2JqLCBldmVudE5h
bWUsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBs
ZWFzdCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIucmVtb3ZlTGlzdGVuZXIiLCAh
IW9iaiAmJiAhIWV2ZW50TmFtZSk7CiAKLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0g
dHlwZW9mIHRhcmdldCkgewotICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxs
OwotICB9CitFbWJlci53YXJuKCJUaGUgQ1BfREVGQVVMVF9DQUNIRUFCTEUgZmxhZyBoYXMgYmVl
biByZW1vdmVkIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgY2FjaGVkIGJ5IGRl
ZmF1bHQuIFVzZSBgdm9sYXRpbGVgIGlmIHlvdSBkb24ndCB3YW50IGNhY2hpbmcuIiwgRW1iZXIu
RU5WLkNQX0RFRkFVTFRfQ0FDSEVBQkxFICE9PSBmYWxzZSk7CiAKLSAgZnVuY3Rpb24gX3JlbW92
ZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kLCBvbmNlKSB7Ci0gICAgdmFyIGFjdGlvbnMgPSBhY3Rp
b25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFj
dGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKIAotICAgIC8vIGFjdGlvbiBkb2Vzbid0IGV4aXN0LCBn
aXZlIHVwIHNpbGVudGx5Ci0gICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkgeyByZXR1cm47IH0K
K3ZhciBnZXQgPSBFbWJlci5nZXQsCisgICAgc2V0ID0gRW1iZXIuc2V0LAorICAgIG1ldGFGb3Ig
PSBFbWJlci5tZXRhLAorICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKKyAgICBvX2NyZWF0ZSA9IEVt
YmVyLmNyZWF0ZSwKKyAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZLAorICAgIHdhdGNoID0g
RW1iZXIud2F0Y2gsCisgICAgdW53YXRjaCA9IEVtYmVyLnVud2F0Y2g7CiAKLSAgICBhY3Rpb25z
LnNwbGljZShhY3Rpb25JbmRleCwgMSk7CiAKLSAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9m
IG9iai5kaWRSZW1vdmVMaXN0ZW5lcikgewotICAgICAgb2JqLmRpZFJlbW92ZUxpc3RlbmVyKGV2
ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2QpOwotICAgIH0KLSAgfQorLy8gLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gREVQRU5ERU5U
IEtFWVMKKy8vCiAKLSAgaWYgKG1ldGhvZCkgewotICAgIF9yZW1vdmVMaXN0ZW5lcih0YXJnZXQs
IG1ldGhvZCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAotICAg
ICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tl
dmVudE5hbWVdOworLy8gZGF0YSBzdHJ1Y3R1cmU6CisvLyAgbWV0YS5kZXBzID0geworLy8gICAn
ZGVwS2V5JzogeworLy8gICAgICdrZXlOYW1lJzogY291bnQsCisvLyAgIH0KKy8vICB9CiAKLSAg
ICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gICAgZm9yICh2YXIgaSA9IGFjdGlvbnMubGVu
Z3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIF9yZW1vdmVMaXN0ZW5lcihhY3Rpb25zW2ld
WzBdLCBhY3Rpb25zW2ldWzFdKTsKLSAgICB9CisvKgorICBUaGlzIGZ1bmN0aW9uIHJldHVybnMg
YSBtYXAgb2YgdW5pcXVlIGRlcGVuZGVuY2llcyBmb3IgYQorICBnaXZlbiBvYmplY3QgYW5kIGtl
eS4KKyovCitmdW5jdGlvbiBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkpIHsKKyAgdmFyIGtl
eXMgPSBkZXBzTWV0YVtkZXBLZXldOworICBpZiAoIWtleXMpIHsKKyAgICAvLyBpZiB0aGVyZSBh
cmUgbm8gZGVwZW5kZW5jaWVzIHlldCBmb3IgYSB0aGUgZ2l2ZW4ga2V5CisgICAgLy8gY3JlYXRl
IGEgbmV3IGVtcHR5IGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciB0aGUga2V5CisgICAga2V5cyA9
IGRlcHNNZXRhW2RlcEtleV0gPSB7fTsKKyAgfSBlbHNlIGlmICghZGVwc01ldGEuaGFzT3duUHJv
cGVydHkoZGVwS2V5KSkgeworICAgIC8vIG90aGVyd2lzZSBpZiB0aGUgZGVwZW5kZW5jeSBsaXN0
IGlzIGluaGVyaXRlZCBmcm9tCisgICAgLy8gYSBzdXBlcmNsYXNzLCBjbG9uZSB0aGUgaGFzaAor
ICAgIGtleXMgPSBkZXBzTWV0YVtkZXBLZXldID0gb19jcmVhdGUoa2V5cyk7CiAgIH0KKyAgcmV0
dXJuIGtleXM7CiB9CiAKLS8qKgotICBAcHJpdmF0ZQorZnVuY3Rpb24gbWV0YUZvckRlcHMobWV0
YSkgeworICByZXR1cm4ga2V5c0ZvckRlcChtZXRhLCAnZGVwcycpOworfQogCi0gIFN1c3BlbmQg
bGlzdGVuZXIgZHVyaW5nIGNhbGxiYWNrLgorZnVuY3Rpb24gYWRkRGVwZW5kZW50S2V5cyhkZXNj
LCBvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgLy8gdGhlIGRlc2NyaXB0b3IgaGFzIGEgbGlzdCBv
ZiBkZXBlbmRlbnQga2V5cywgc28KKyAgLy8gYWRkIGFsbCBvZiBpdHMgZGVwZW5kZW50IGtleXMu
CisgIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5cywgZGVwc01ldGEsIGlkeCwgbGVu
LCBkZXBLZXksIGtleXM7CisgIGlmICghZGVwS2V5cykgcmV0dXJuOwogCi0gIFRoaXMgc2hvdWxk
IG9ubHkgYmUgdXNlZCBieSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBsaXN0ZW5lcgotICB3aGVu
IGl0IGlzIHRha2luZyBhbiBhY3Rpb24gdGhhdCB3b3VsZCBjYXVzZSB0aGUgZXZlbnQsIGUuZy4K
LSAgYW4gb2JqZWN0IG1pZ2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB3
aGlsZSBpdCBpcwotICBzZXR0aW5nIHRoYXQgcHJvcGVydHkuCisgIGRlcHNNZXRhID0gbWV0YUZv
ckRlcHMobWV0YSk7CiAKLSAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIKLSAgQGZvciBFbWJlcgot
ICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKLSAgQHBhcmFtIHtPYmpl
Y3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kIEEgdGFyZ2V0IG9iamVjdCBvciBhIGZ1bmN0aW9u
Ci0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBmdW5jdGlvbiBvciB0aGUgbmFt
ZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0YAotICBAcGFyYW0ge0Z1bmN0
aW9ufSBjYWxsYmFjawotKi8KLWZ1bmN0aW9uIHN1c3BlbmRMaXN0ZW5lcihvYmosIGV2ZW50TmFt
ZSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7Ci0gIGlmICghbWV0aG9kICYmICdmdW5jdGlv
bicgPT09IHR5cGVvZiB0YXJnZXQpIHsKLSAgICBtZXRob2QgPSB0YXJnZXQ7Ci0gICAgdGFyZ2V0
ID0gbnVsbDsKKyAgZm9yKGlkeCA9IDAsIGxlbiA9IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47
IGlkeCsrKSB7CisgICAgZGVwS2V5ID0gZGVwS2V5c1tpZHhdOworICAgIC8vIExvb2t1cCBrZXlz
IG1ldGEgZm9yIGRlcEtleQorICAgIGtleXMgPSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkp
OworICAgIC8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9u
IGtleU5hbWUuCisgICAga2V5c1trZXlOYW1lXSA9IChrZXlzW2tleU5hbWVdIHx8IDApICsgMTsK
KyAgICAvLyBXYXRjaCB0aGUgZGVwS2V5CisgICAgd2F0Y2gob2JqLCBkZXBLZXkpOwogICB9Cit9
CiAKLSAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgIGFj
dGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCksCi0gICAgICBhY3Rp
b247Ci0KLSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgewotICAgIGFjdGlvbiA9IGFjdGlvbnNb
YWN0aW9uSW5kZXhdLnNsaWNlKCk7IC8vIGNvcHkgaXQsIG90aGVyd2lzZSB3ZSdyZSBtb2RpZnlp
bmcgYSBzaGFyZWQgb2JqZWN0Ci0gICAgYWN0aW9uWzNdID0gdHJ1ZTsgLy8gbWFyayB0aGUgYWN0
aW9uIGFzIHN1c3BlbmRlZAotICAgIGFjdGlvbnNbYWN0aW9uSW5kZXhdID0gYWN0aW9uOyAvLyBy
ZXBsYWNlIHRoZSBzaGFyZWQgb2JqZWN0IHdpdGggb3VyIGNvcHkKLSAgfQorZnVuY3Rpb24gcmVt
b3ZlRGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgLy8gdGhlIGRl
c2NyaXB0b3IgaGFzIGEgbGlzdCBvZiBkZXBlbmRlbnQga2V5cywgc28KKyAgLy8gYWRkIGFsbCBv
ZiBpdHMgZGVwZW5kZW50IGtleXMuCisgIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5
cywgZGVwc01ldGEsIGlkeCwgbGVuLCBkZXBLZXksIGtleXM7CisgIGlmICghZGVwS2V5cykgcmV0
dXJuOwogCi0gIGZ1bmN0aW9uIHRyeWFibGUoKSAgIHsgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGFy
Z2V0KTsgfQotICBmdW5jdGlvbiBmaW5hbGl6ZXIoKSB7IGlmIChhY3Rpb24pIHsgYWN0aW9uWzNd
ID0gdW5kZWZpbmVkOyB9IH0KKyAgZGVwc01ldGEgPSBtZXRhRm9yRGVwcyhtZXRhKTsKIAotICBy
ZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6ZXIpOworICBmb3IoaWR4ID0g
MCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICBkZXBLZXkg
PSBkZXBLZXlzW2lkeF07CisgICAgLy8gTG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5CisgICAg
a2V5cyA9IGtleXNGb3JEZXAoZGVwc01ldGEsIGRlcEtleSk7CisgICAgLy8gSW5jcmVtZW50IHRo
ZSBudW1iZXIgb2YgdGltZXMgZGVwS2V5IGRlcGVuZHMgb24ga2V5TmFtZS4KKyAgICBrZXlzW2tl
eU5hbWVdID0gKGtleXNba2V5TmFtZV0gfHwgMCkgLSAxOworICAgIC8vIFdhdGNoIHRoZSBkZXBL
ZXkKKyAgICB1bndhdGNoKG9iaiwgZGVwS2V5KTsKKyAgfQogfQogCisvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBDT01QVVRF
RCBQUk9QRVJUWQorLy8KKwogLyoqCi0gIEBwcml2YXRlCisgIEEgY29tcHV0ZWQgcHJvcGVydHkg
dHJhbnNmb3JtcyBhbiBvYmplY3RzIGZ1bmN0aW9uIGludG8gYSBwcm9wZXJ0eS4KIAotICBTdXNw
ZW5kIGxpc3RlbmVyIGR1cmluZyBjYWxsYmFjay4KKyAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24g
YmFja2luZyB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGNhbGxlZAorICBvbmNl
IGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLiBZb3UgY2FuIHNwZWNpZnkgdmFyaW91cyBw
cm9wZXJ0aWVzCisgIHRoYXQgeW91ciBjb21wdXRlZCBwcm9wZXJ0eSBpcyBkZXBlbmRlbnQgb24u
IFRoaXMgd2lsbCBmb3JjZSB0aGUgY2FjaGVkCisgIHJlc3VsdCB0byBiZSByZWNvbXB1dGVkIGlm
IHRoZSBkZXBlbmRlbmNpZXMgYXJlIG1vZGlmaWVkLgogCi0gIFRoaXMgc2hvdWxkIG9ubHkgYmUg
dXNlZCBieSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBsaXN0ZW5lcgotICB3aGVuIGl0IGlzIHRh
a2luZyBhbiBhY3Rpb24gdGhhdCB3b3VsZCBjYXVzZSB0aGUgZXZlbnQsIGUuZy4KLSAgYW4gb2Jq
ZWN0IG1pZ2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB3aGlsZSBpdCBp
cwotICBzZXR0aW5nIHRoYXQgcHJvcGVydHkuCi0KLSAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIK
LSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7QXJyYXl9IGV2ZW50TmFtZSBB
cnJheSBvZiBldmVudCBuYW1lcwotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JN
ZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUg
Y2FsbGVkIG9uIGB0YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0qLwotZnVu
Y3Rpb24gc3VzcGVuZExpc3RlbmVycyhvYmosIGV2ZW50TmFtZXMsIHRhcmdldCwgbWV0aG9kLCBj
YWxsYmFjaykgewotICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0
KSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICB2
YXIgc3VzcGVuZGVkQWN0aW9ucyA9IFtdLAotICAgICAgZXZlbnROYW1lLCBhY3Rpb25zLCBhY3Rp
b24sIGksIGw7Ci0KLSAgZm9yIChpPTAsIGw9ZXZlbnROYW1lcy5sZW5ndGg7IGk8bDsgaSsrKSB7
Ci0gICAgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTsKLSAgICBhY3Rpb25zID0gYWN0aW9uc0Zv
cihvYmosIGV2ZW50TmFtZSk7Ci0gICAgdmFyIGFjdGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25z
LCB0YXJnZXQsIG1ldGhvZCk7CisgIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3ZSBkZWNsYXJl
IGEgY29tcHV0ZWQgcHJvcGVydHkgKGJ5IGNhbGxpbmcKKyAgYC5wcm9wZXJ0eSgpYCBvbiB0aGUg
ZnVsbE5hbWUgZnVuY3Rpb24pIGFuZCBzZXR1cCB0aGUgcHJvcGVydGllcworICBkZXBlbmRlbmNp
ZXMgKGRlcGVuZGluZyBvbiBmaXJzdE5hbWUgYW5kIGxhc3ROYW1lKS4gVGhlIGZ1bGxOYW1lIGZ1
bmN0aW9uCisgIHdpbGwgYmUgY2FsbGVkIG9uY2UgKHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGlt
ZXMgaXQgaXMgYWNjZXNzZWQpIGFzIGxvbmcKKyAgYXMgaXQncyBkZXBlbmRlbmNpZXMgaGF2ZSBu
b3QgYmVlbiBjaGFuZ2VkLiBPbmNlIGZpcnN0TmFtZSBvciBsYXN0TmFtZSBhcmUgdXBkYXRlZAor
ICBhbnkgZnV0dXJlIGNhbGxzIChvciBhbnl0aGluZyBib3VuZCkgdG8gZnVsbE5hbWUgd2lsbCBp
bmNvcnBvcmF0ZSB0aGUgbmV3CisgIHZhbHVlcy4KIAotICAgIGlmIChhY3Rpb25JbmRleCAhPT0g
LTEpIHsKLSAgICAgIGFjdGlvbiA9IGFjdGlvbnNbYWN0aW9uSW5kZXhdLnNsaWNlKCk7Ci0gICAg
ICBhY3Rpb25bM10gPSB0cnVlOwotICAgICAgYWN0aW9uc1thY3Rpb25JbmRleF0gPSBhY3Rpb247
Ci0gICAgICBzdXNwZW5kZWRBY3Rpb25zLnB1c2goYWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBm
dW5jdGlvbiB0cnlhYmxlKCkgeyByZXR1cm4gY2FsbGJhY2suY2FsbCh0YXJnZXQpOyB9Ci0KLSAg
ZnVuY3Rpb24gZmluYWxpemVyKCkgewotICAgIGZvciAoaSA9IDAsIGwgPSBzdXNwZW5kZWRBY3Rp
b25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgc3VzcGVuZGVkQWN0aW9uc1tpXVszXSA9
IHVuZGVmaW5lZDsKLSAgICB9Ci0gIH0KKyAgYGBgamF2YXNjcmlwdAorICBQZXJzb24gPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKKyAgICAvLyB0aGVzZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IGBjcmVh
dGVgCisgICAgZmlyc3ROYW1lOiBudWxsLAorICAgIGxhc3ROYW1lOiBudWxsLAogCi0gIHJldHVy
biBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIGZpbmFsaXplcik7Ci19CisgICAgZnVsbE5hbWU6
IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGZpcnN0TmFtZSA9IHRoaXMuZ2V0KCdmaXJzdE5hbWUn
KTsKKyAgICAgIHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwogCi0vKioKLSAg
QHByaXZhdGUKKyAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAgIH0u
cHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCisgIH0pOwogCi0gIFJldHVybiBhIGxp
c3Qgb2YgY3VycmVudGx5IHdhdGNoZWQgZXZlbnRzCisgIHZhciB0b20gPSBQZXJzb24uY3JlYXRl
KHsKKyAgICBmaXJzdE5hbWU6ICJUb20iLAorICAgIGxhc3ROYW1lOiAiRGFsZSIKKyAgfSk7CiAK
LSAgQG1ldGhvZCB3YXRjaGVkRXZlbnRzCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotKi8K
LWZ1bmN0aW9uIHdhdGNoZWRFdmVudHMob2JqKSB7Ci0gIHZhciBsaXN0ZW5lcnMgPSBvYmpbTUVU
QV9LRVldLmxpc3RlbmVycywgcmV0ID0gW107CisgIHRvbS5nZXQoJ2Z1bGxOYW1lJykgLy8gIlRv
bSBEYWxlIgorICBgYGAKIAotICBpZiAobGlzdGVuZXJzKSB7Ci0gICAgZm9yKHZhciBldmVudE5h
bWUgaW4gbGlzdGVuZXJzKSB7Ci0gICAgICBpZiAobGlzdGVuZXJzW2V2ZW50TmFtZV0pIHsgcmV0
LnB1c2goZXZlbnROYW1lKTsgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmV0OwotfQorICBZb3Ug
Y2FuIGFsc28gZGVmaW5lIHdoYXQgRW1iZXIgc2hvdWxkIGRvIHdoZW4gc2V0dGluZyBhIGNvbXB1
dGVkIHByb3BlcnR5LgorICBJZiB5b3UgdHJ5IHRvIHNldCBhIGNvbXB1dGVkIHByb3BlcnR5LCBp
dCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUga2V5IGFuZAorICB2YWx1ZSB5b3Ugd2FudCB0byBz
ZXQgaXQgdG8uIFlvdSBjYW4gYWxzbyBhY2NlcHQgdGhlIHByZXZpb3VzIHZhbHVlIGFzIHRoZQor
ICB0aGlyZCBwYXJhbWV0ZXIuCiAKLS8qKgotICBAbWV0aG9kIHNlbmRFdmVudAotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBAcGFyYW0g
e0FycmF5fSBwYXJhbXMKLSAgQHJldHVybiB0cnVlCi0qLwotZnVuY3Rpb24gc2VuZEV2ZW50KG9i
aiwgZXZlbnROYW1lLCBwYXJhbXMsIGFjdGlvbnMpIHsKLSAgLy8gZmlyc3QgZ2l2ZSBvYmplY3Qg
YSBjaGFuY2UgdG8gaGFuZGxlIGl0Ci0gIGlmIChvYmogIT09IEVtYmVyICYmICdmdW5jdGlvbicg
PT09IHR5cGVvZiBvYmouc2VuZEV2ZW50KSB7Ci0gICAgb2JqLnNlbmRFdmVudChldmVudE5hbWUs
IHBhcmFtcyk7Ci0gIH0KKyAgYGBgamF2YXNjcmlwdAogCi0gIGlmICghYWN0aW9ucykgewotICAg
IHZhciBtZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxp
c3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotICB9CisgUGVyc29uID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgLy8gdGhlc2Ugd2lsbCBiZSBzdXBwbGllZCBieSBgY3Jl
YXRlYAorICAgIGZpcnN0TmFtZTogbnVsbCwKKyAgICBsYXN0TmFtZTogbnVsbCwKIAotICBpZiAo
IWFjdGlvbnMpIHsgcmV0dXJuOyB9CisgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKGtleSwgdmFsdWUs
IG9sZFZhbHVlKSB7CisgICAgICAvLyBnZXR0ZXIKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3Ro
ID09PSAxKSB7CisgICAgICAgIHZhciBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7
CisgICAgICAgIHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwogCi0gIGZvciAo
dmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIGxvb3BpbmcgaW4g
cmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKLSAgICBpZiAoIWFjdGlvbnNbaV0gfHwgYWN0aW9u
c1tpXVszXSA9PT0gdHJ1ZSkgeyBjb250aW51ZTsgfQorICAgICAgICByZXR1cm4gZmlyc3ROYW1l
ICsgJyAnICsgbGFzdE5hbWU7CiAKLSAgICB2YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXVswXSwKLSAg
ICAgICAgbWV0aG9kID0gYWN0aW9uc1tpXVsxXSwKLSAgICAgICAgb25jZSA9IGFjdGlvbnNbaV1b
Ml07CisgICAgICAvLyBzZXR0ZXIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBuYW1lID0g
dmFsdWUuc3BsaXQoIiAiKTsKIAotICAgIGlmIChvbmNlKSB7IHJlbW92ZUxpc3RlbmVyKG9iaiwg
ZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCk7IH0KLSAgICBpZiAoIXRhcmdldCkgeyB0YXJnZXQg
PSBvYmo7IH0KLSAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBtZXRob2QpIHsgbWV0aG9kID0g
dGFyZ2V0W21ldGhvZF07IH0KLSAgICBpZiAocGFyYW1zKSB7Ci0gICAgICBtZXRob2QuYXBwbHko
dGFyZ2V0LCBwYXJhbXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRob2QuYXBwbHkodGFyZ2V0
KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CisgICAgICAgIHRoaXMuc2V0KCdmaXJz
dE5hbWUnLCBuYW1lWzBdKTsKKyAgICAgICAgdGhpcy5zZXQoJ2xhc3ROYW1lJywgbmFtZVsxXSk7
CiAKLS8qKgotICBAcHJpdmF0ZQotICBAbWV0aG9kIGhhc0xpc3RlbmVycwotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotKi8KLWZ1bmN0aW9u
IGhhc0xpc3RlbmVycyhvYmosIGV2ZW50TmFtZSkgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tF
WV0sCi0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3Rl
bmVyc1tldmVudE5hbWVdOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgfS5w
cm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgfSk7CiAKLSAgcmV0dXJuICEhKGFj
dGlvbnMgJiYgYWN0aW9ucy5sZW5ndGgpOwotfQorICB2YXIgcGVyc29uID0gUGVyc29uLmNyZWF0
ZSgpOworICBwZXJzb24uc2V0KCdmdWxsTmFtZScsICJQZXRlciBXYWdlbmV0Iik7CisgIHBlcnNv
bi5nZXQoJ2ZpcnN0TmFtZScpIC8vIFBldGVyCisgIHBlcnNvbi5nZXQoJ2xhc3ROYW1lJykgLy8g
V2FnZW5ldAorICBgYGAKIAotLyoqCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgbGlzdGVuZXJzRm9y
Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1l
CisgIEBjbGFzcyBDb21wdXRlZFByb3BlcnR5CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVu
ZHMgRW1iZXIuRGVzY3JpcHRvcgorICBAY29uc3RydWN0b3IKICovCi1mdW5jdGlvbiBsaXN0ZW5l
cnNGb3Iob2JqLCBldmVudE5hbWUpIHsKLSAgdmFyIHJldCA9IFtdOwotICB2YXIgbWV0YSA9IG9i
altNRVRBX0tFWV0sCi0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBt
ZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotCi0gIGlmICghYWN0aW9ucykgeyByZXR1cm4gcmV0
OyB9Ci0KLSAgZm9yICh2YXIgaSA9IDAsIGwgPSBhY3Rpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykg
ewotICAgIHZhciB0YXJnZXQgPSBhY3Rpb25zW2ldWzBdLAotICAgICAgICBtZXRob2QgPSBhY3Rp
b25zW2ldWzFdOwotICAgIHJldC5wdXNoKFt0YXJnZXQsIG1ldGhvZF0pOwotICB9CitmdW5jdGlv
biBDb21wdXRlZFByb3BlcnR5KGZ1bmMsIG9wdHMpIHsKKyAgdGhpcy5mdW5jID0gZnVuYzsKIAot
ICByZXR1cm4gcmV0OworICB0aGlzLl9jYWNoZWFibGUgPSAob3B0cyAmJiBvcHRzLmNhY2hlYWJs
ZSAhPT0gdW5kZWZpbmVkKSA/IG9wdHMuY2FjaGVhYmxlIDogdHJ1ZTsKKyAgdGhpcy5fZGVwZW5k
ZW50S2V5cyA9IG9wdHMgJiYgb3B0cy5kZXBlbmRlbnRLZXlzOworICB0aGlzLl9yZWFkT25seSA9
IG9wdHMgJiYgKG9wdHMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCB8fCAhIW9wdHMucmVhZE9ubHkp
OwogfQogCi1FbWJlci5hZGRMaXN0ZW5lciA9IGFkZExpc3RlbmVyOwotRW1iZXIucmVtb3ZlTGlz
dGVuZXIgPSByZW1vdmVMaXN0ZW5lcjsKLUVtYmVyLl9zdXNwZW5kTGlzdGVuZXIgPSBzdXNwZW5k
TGlzdGVuZXI7Ci1FbWJlci5fc3VzcGVuZExpc3RlbmVycyA9IHN1c3BlbmRMaXN0ZW5lcnM7Ci1F
bWJlci5zZW5kRXZlbnQgPSBzZW5kRXZlbnQ7Ci1FbWJlci5oYXNMaXN0ZW5lcnMgPSBoYXNMaXN0
ZW5lcnM7Ci1FbWJlci53YXRjaGVkRXZlbnRzID0gd2F0Y2hlZEV2ZW50czsKLUVtYmVyLmxpc3Rl
bmVyc0ZvciA9IGxpc3RlbmVyc0ZvcjsKLUVtYmVyLmxpc3RlbmVyc0RpZmYgPSBhY3Rpb25zRGlm
ZjsKLUVtYmVyLmxpc3RlbmVyc1VuaW9uID0gYWN0aW9uc1VuaW9uOwotCi19KSgpOwotCi0KK0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHkgPSBDb21wdXRlZFByb3BlcnR5OworQ29tcHV0ZWRQcm9wZXJ0
eS5wcm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwogCi0oZnVuY3Rpb24oKSB7Ci0v
LyBFbWJlci5Mb2dnZXIKLS8vIEVtYmVyLndhdGNoLmZsdXNoUGVuZGluZwotLy8gRW1iZXIuYmVn
aW5Qcm9wZXJ0eUNoYW5nZXMsIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcwotLy8gRW1iZXIuZ3Vp
ZEZvciwgRW1iZXIudHJ5RmluYWxseQordmFyIENvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUgPSBD
b21wdXRlZFByb3BlcnR5LnByb3RvdHlwZTsKIAogLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0q
LworICBQcm9wZXJ0aWVzIGFyZSBjYWNoZWFibGUgYnkgZGVmYXVsdC4gQ29tcHV0ZWQgcHJvcGVy
dHkgd2lsbCBhdXRvbWF0aWNhbGx5CisgIGNhY2hlIHRoZSByZXR1cm4gdmFsdWUgb2YgeW91ciBm
dW5jdGlvbiB1bnRpbCBvbmUgb2YgdGhlIGRlcGVuZGVudCBrZXlzIGNoYW5nZXMuCiAKLS8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
LS8vIEhFTFBFUlMKLS8vCisgIENhbGwgYHZvbGF0aWxlKClgIHRvIHNldCBpdCBpbnRvIG5vbi1j
YWNoZWQgbW9kZS4gV2hlbiBpbiB0aGlzIG1vZGUKKyAgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdp
bGwgbm90IGF1dG9tYXRpY2FsbHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KIAotdmFyIHNsaWNl
ID0gW10uc2xpY2UsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7
CisgIEhvd2V2ZXIsIGlmIGEgcHJvcGVydHkgaXMgcHJvcGVybHkgb2JzZXJ2YWJsZSwgdGhlcmUg
aXMgbm8gcmVhc29uIHRvIGRpc2FibGUKKyAgY2FjaGluZy4KIAotLy8gaW52b2tlcyBwYXNzZWQg
cGFyYW1zIC0gbm9ybWFsaXppbmcgc28geW91IGNhbiBwYXNzIHRhcmdldC9mdW5jLAotLy8gdGFy
Z2V0L3N0cmluZyBvciBqdXN0IGZ1bmMKLWZ1bmN0aW9uIGludm9rZSh0YXJnZXQsIG1ldGhvZCwg
YXJncywgaWdub3JlKSB7CisgIEBtZXRob2QgY2FjaGVhYmxlCisgIEBwYXJhbSB7Qm9vbGVhbn0g
YUZsYWcgb3B0aW9uYWwgc2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBjYWNoaW5nCisgIEByZXR1
cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKKyAgQGNoYWluYWJsZQorKi8KK0NvbXB1
dGVkUHJvcGVydHlQcm90b3R5cGUuY2FjaGVhYmxlID0gZnVuY3Rpb24oYUZsYWcpIHsKKyAgdGhp
cy5fY2FjaGVhYmxlID0gYUZsYWcgIT09IGZhbHNlOworICByZXR1cm4gdGhpczsKK307CiAKLSAg
aWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAgIHRh
cmdldCA9IHVuZGVmaW5lZDsKLSAgfQorLyoqCisgIENhbGwgb24gYSBjb21wdXRlZCBwcm9wZXJ0
eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUuIFdoZW4gaW4gdGhpcworICBtb2RlIHRo
ZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1
cm4gdmFsdWUuCiAKLSAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgbWV0aG9kKSB7IG1ldGhvZCA9
IHRhcmdldFttZXRob2RdOyB9Ci0gIGlmIChhcmdzICYmIGlnbm9yZSA+IDApIHsKLSAgICBhcmdz
ID0gYXJncy5sZW5ndGggPiBpZ25vcmUgPyBzbGljZS5jYWxsKGFyZ3MsIGlnbm9yZSkgOiBudWxs
OwotICB9CisgIGBgYGphdmFzY3JpcHQKKyAgTXlBcHAub3V0c2lkZVNlcnZpY2UgPSBFbWJlci5P
YmplY3QuZXh0ZW5kKHsKKyAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gT3V0
c2lkZVNlcnZpY2UuZ2V0VmFsdWUoKTsKKyAgICB9LnByb3BlcnR5KCkudm9sYXRpbGUoKQorICB9
KS5jcmVhdGUoKTsKKyAgYGBgCiAKLSAgcmV0dXJuIEVtYmVyLmhhbmRsZUVycm9ycyhmdW5jdGlv
bigpIHsKLSAgICAvLyBJRTgncyBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkgZG9lc24ndCBhY2Nl
cHQgdW5kZWZpbmVkL251bGwgYXJndW1lbnRzLgotICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFy
Z2V0IHx8IHRoaXMsIGFyZ3MgfHwgW10pOwotICB9LCB0aGlzKTsKLX0KKyAgQG1ldGhvZCB2b2xh
dGlsZQorICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgIEBjaGFpbmFi
bGUKKyovCitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnZvbGF0aWxlID0gZnVuY3Rpb24oKSB7
CisgIHJldHVybiB0aGlzLmNhY2hlYWJsZShmYWxzZSk7Cit9OwogCisvKioKKyAgQ2FsbCBvbiBh
IGNvbXB1dGVkIHByb3BlcnR5IHRvIHNldCBpdCBpbnRvIHJlYWQtb25seSBtb2RlLiBXaGVuIGlu
IHRoaXMKKyAgbW9kZSB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCB0aHJvdyBhbiBlcnJvciB3
aGVuIHNldC4KIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgotLy8gUlVOTE9PUAotLy8KKyAgYGBgamF2YXNjcmlwdAorICBNeUFw
cC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICBndWlkOiBmdW5jdGlvbigpIHsK
KyAgICAgIHJldHVybiAnZ3VpZC1ndWlkLWd1aWQnOworICAgIH0ucHJvcGVydHkoKS5yZWFkT25s
eSgpCisgIH0pOwogCi12YXIgdGltZXJNYXJrOyAvLyB1c2VkIGJ5IHRpbWVycy4uLgorICBNeUFw
cC5wZXJzb24gPSBNeUFwcC5QZXJzb24uY3JlYXRlKCk7CiAKLS8qKgotRW1iZXIgUnVuTG9vcCAo
UHJpdmF0ZSkKKyAgTXlBcHAucGVyc29uLnNldCgnZ3VpZCcsICduZXctZ3VpZCcpOyAvLyB3aWxs
IHRocm93IGFuIGV4Y2VwdGlvbgorICBgYGAKIAotQGNsYXNzIFJ1bkxvb3AKLUBuYW1lc3BhY2Ug
RW1iZXIKLUBwcml2YXRlCi1AY29uc3RydWN0b3IKKyAgQG1ldGhvZCByZWFkT25seQorICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgIEBjaGFpbmFibGUKICovCi12YXIg
UnVuTG9vcCA9IGZ1bmN0aW9uKHByZXYpIHsKLSAgdGhpcy5fcHJldiA9IHByZXYgfHwgbnVsbDsK
LSAgdGhpcy5vbmNlVGltZXJzID0ge307CitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnJlYWRP
bmx5ID0gZnVuY3Rpb24ocmVhZE9ubHkpIHsKKyAgdGhpcy5fcmVhZE9ubHkgPSByZWFkT25seSA9
PT0gdW5kZWZpbmVkIHx8ICEhcmVhZE9ubHk7CisgIHJldHVybiB0aGlzOwogfTsKIAotUnVuTG9v
cC5wcm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIEBtZXRob2QgZW5kCi0gICovCi0gIGVuZDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5mbHVzaCgpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2Qg
cHJldgotICAqLwotICBwcmV2OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5fcHJldjsK
LSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uCi0gIC8vIERlbGF5ZWQgQWN0aW9ucwotICAvLwotCi0gIC8qKgotICAg
IEBtZXRob2Qgc2NoZWR1bGUKLSAgICBAcGFyYW0ge1N0cmluZ30gcXVldWVOYW1lCi0gICAgQHBh
cmFtIHRhcmdldAotICAgIEBwYXJhbSBtZXRob2QKLSAgKi8KLSAgc2NoZWR1bGU6IGZ1bmN0aW9u
KHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICB2YXIgcXVldWVzID0gdGhpcy5fcXVl
dWVzLCBxdWV1ZTsKLSAgICBpZiAoIXF1ZXVlcykgeyBxdWV1ZXMgPSB0aGlzLl9xdWV1ZXMgPSB7
fTsgfQotICAgIHF1ZXVlID0gcXVldWVzW3F1ZXVlTmFtZV07Ci0gICAgaWYgKCFxdWV1ZSkgeyBx
dWV1ZSA9IHF1ZXVlc1txdWV1ZU5hbWVdID0gW107IH0KKy8qKgorICBTZXRzIHRoZSBkZXBlbmRl
bnQga2V5cyBvbiB0aGlzIGNvbXB1dGVkIHByb3BlcnR5LiBQYXNzIGFueSBudW1iZXIgb2YKKyAg
YXJndW1lbnRzIGNvbnRhaW5pbmcga2V5IHBhdGhzIHRoYXQgdGhpcyBjb21wdXRlZCBwcm9wZXJ0
eSBkZXBlbmRzIG9uLgogCi0gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNs
aWNlLmNhbGwoYXJndW1lbnRzLCAzKSA6IG51bGw7Ci0gICAgcXVldWUucHVzaCh7IHRhcmdldDog
dGFyZ2V0LCBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9KTsKLSAgICByZXR1cm4gdGhpczsK
LSAgfSwKKyAgYGBgamF2YXNjcmlwdAorICBNeUFwcC5QcmVzaWRlbnQgPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKKyAgICBmdWxsTmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAg
ICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1l
Jyk7CiAKLSAgLyoqCi0gICAgQG1ldGhvZCBmbHVzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBxdWV1
ZU5hbWUKLSAgKi8KLSAgZmx1c2g6IGZ1bmN0aW9uKHF1ZXVlTmFtZSkgewotICAgIHZhciBxdWV1
ZU5hbWVzLCBpZHgsIGxlbiwgcXVldWUsIGxvZzsKKyAgICAgIC8vIFRlbGwgRW1iZXIgdGhhdCB0
aGlzIGNvbXB1dGVkIHByb3BlcnR5IGRlcGVuZHMgb24gZmlyc3ROYW1lCisgICAgICAvLyBhbmQg
bGFzdE5hbWUKKyAgICB9KS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgfSk7
CiAKLSAgICBpZiAoIXRoaXMuX3F1ZXVlcykgeyByZXR1cm4gdGhpczsgfSAvLyBub3RoaW5nIHRv
IGRvCisgIE15QXBwLnByZXNpZGVudCA9IE15QXBwLlByZXNpZGVudC5jcmVhdGUoeworICAgIGZp
cnN0TmFtZTogJ0JhcmFjaycsCisgICAgbGFzdE5hbWU6ICdPYmFtYScsCisgIH0pOworICBNeUFw
cC5wcmVzaWRlbnQuZ2V0KCdmdWxsTmFtZScpOyAvLyBCYXJhY2sgT2JhbWEKKyAgYGBgCiAKLSAg
ICBmdW5jdGlvbiBpdGVyKGl0ZW0pIHsKLSAgICAgIGludm9rZShpdGVtLnRhcmdldCwgaXRlbS5t
ZXRob2QsIGl0ZW0uYXJncyk7Ci0gICAgfQorICBAbWV0aG9kIHByb3BlcnR5CisgIEBwYXJhbSB7
U3RyaW5nfSBwYXRoKiB6ZXJvIG9yIG1vcmUgcHJvcGVydHkgcGF0aHMKKyAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gdGhpcworICBAY2hhaW5hYmxlCisqLworQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgeworICB2YXIgYXJnczsKIAotICAg
IGZ1bmN0aW9uIHRyeWFibGUoKSB7Ci0gICAgICBmb3JFYWNoLmNhbGwocXVldWUsIGl0ZXIpOwot
ICAgIH0KKyAgCisgICAgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOworICAKIAotICAg
IEVtYmVyLndhdGNoLmZsdXNoUGVuZGluZygpOyAvLyBtYWtlIHN1cmUgYWxsIGNoYWluZWQgd2F0
Y2hlcnMgYXJlIHNldHVwCisgIHRoaXMuX2RlcGVuZGVudEtleXMgPSBhcmdzOworICByZXR1cm4g
dGhpczsKK307CiAKLSAgICBpZiAocXVldWVOYW1lKSB7Ci0gICAgICB3aGlsZSAodGhpcy5fcXVl
dWVzICYmIChxdWV1ZSA9IHRoaXMuX3F1ZXVlc1txdWV1ZU5hbWVdKSkgewotICAgICAgICB0aGlz
Ll9xdWV1ZXNbcXVldWVOYW1lXSA9IG51bGw7CisvKioKKyAgSW4gc29tZSBjYXNlcywgeW91IG1h
eSB3YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aCBhZGRpdGlvbmFsCisg
IG1ldGFkYXRhIGFib3V0IGhvdyB0aGV5IGZ1bmN0aW9uIG9yIHdoYXQgdmFsdWVzIHRoZXkgb3Bl
cmF0ZSBvbi4gRm9yIGV4YW1wbGUsCisgIGNvbXB1dGVkIHByb3BlcnR5IGZ1bmN0aW9ucyBtYXkg
Y2xvc2Ugb3ZlciB2YXJpYWJsZXMgdGhhdCBhcmUgdGhlbiBubyBsb25nZXIKKyAgYXZhaWxhYmxl
IGZvciBpbnRyb3NwZWN0aW9uLgogCi0gICAgICAgIC8vIHRoZSBzeW5jIHBoYXNlIGlzIHRvIGFs
bG93IHByb3BlcnR5IGNoYW5nZXMgdG8gcHJvcGFnYXRlLiBkb24ndAotICAgICAgICAvLyBpbnZv
a2Ugb2JzZXJ2ZXJzIHVudGlsIHRoYXQgaXMgZmluaXNoZWQuCi0gICAgICAgIGlmIChxdWV1ZU5h
bWUgPT09ICdzeW5jJykgewotICAgICAgICAgIGxvZyA9IEVtYmVyLkxPR19CSU5ESU5HUzsKLSAg
ICAgICAgICBpZiAobG9nKSB7IEVtYmVyLkxvZ2dlci5sb2coJ0JlZ2luOiBGbHVzaCBTeW5jIFF1
ZXVlJyk7IH0KKyAgWW91IGNhbiBwYXNzIGEgaGFzaCBvZiB0aGVzZSB2YWx1ZXMgdG8gYSBjb21w
dXRlZCBwcm9wZXJ0eSBsaWtlIHRoaXM6CiAKLSAgICAgICAgICBFbWJlci5iZWdpblByb3BlcnR5
Q2hhbmdlcygpOworICBgYGAKKyAgcGVyc29uOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcGVyc29u
SWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsKKyAgICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUo
eyBpZDogcGVyc29uSWQgfSk7CisgIH0ucHJvcGVydHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNv
biB9KQorICBgYGAKIAotICAgICAgICAgIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgRW1iZXIu
ZW5kUHJvcGVydHlDaGFuZ2VzKTsKKyAgVGhlIGhhc2ggdGhhdCB5b3UgcGFzcyB0byB0aGUgYG1l
dGEoKWAgZnVuY3Rpb24gd2lsbCBiZSBzYXZlZCBvbiB0aGUKKyAgY29tcHV0ZWQgcHJvcGVydHkg
ZGVzY3JpcHRvciB1bmRlciB0aGUgYF9tZXRhYCBrZXkuIEVtYmVyIHJ1bnRpbWUKKyAgZXhwb3Nl
cyBhIHB1YmxpYyBBUEkgZm9yIHJldHJpZXZpbmcgdGhlc2UgdmFsdWVzIGZyb20gY2xhc3NlcywK
KyAgdmlhIHRoZSBgbWV0YUZvclByb3BlcnR5KClgIGZ1bmN0aW9uLgogCi0gICAgICAgICAgaWYg
KGxvZykgeyBFbWJlci5Mb2dnZXIubG9nKCdFbmQ6IEZsdXNoIFN5bmMgUXVldWUnKTsgfQorICBA
bWV0aG9kIG1ldGEKKyAgQHBhcmFtIHtIYXNofSBtZXRhCisgIEBjaGFpbmFibGUKKyovCiAKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3JFYWNoLmNhbGwocXVldWUsIGl0ZXIpOwotICAg
ICAgICB9Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgcXVldWVOYW1lcyA9IEVtYmVy
LnJ1bi5xdWV1ZXM7Ci0gICAgICBsZW4gPSBxdWV1ZU5hbWVzLmxlbmd0aDsKLSAgICAgIGlkeCA9
IDA7CitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbihtZXRhKSB7Cisg
IGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIHRoaXMuX21ldGEgfHwg
e307CisgIH0gZWxzZSB7CisgICAgdGhpcy5fbWV0YSA9IG1ldGE7CisgICAgcmV0dXJuIHRoaXM7
CisgIH0KK307CiAKLSAgICAgIG91dGVybG9vcDoKLSAgICAgIHdoaWxlIChpZHggPCBsZW4pIHsK
LSAgICAgICAgcXVldWVOYW1lID0gcXVldWVOYW1lc1tpZHhdOwotICAgICAgICBxdWV1ZSA9IHRo
aXMuX3F1ZXVlcyAmJiB0aGlzLl9xdWV1ZXNbcXVldWVOYW1lXTsKLSAgICAgICAgZGVsZXRlIHRo
aXMuX3F1ZXVlc1txdWV1ZU5hbWVdOworLyogaW1wbCBkZXNjcmlwdG9yIEFQSSAqLworQ29tcHV0
ZWRQcm9wZXJ0eVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsK
KyAgLy8gX3N1c3BlbmRlZCBpcyBzZXQgdmlhIGEgQ1Auc2V0IHRvIGVuc3VyZSB3ZSBkb24ndCBj
bGVhcgorICAvLyB0aGUgY2FjaGVkIHZhbHVlIHNldCBieSB0aGUgc2V0dGVyCisgIGlmICh0aGlz
Ll9jYWNoZWFibGUgJiYgdGhpcy5fc3VzcGVuZGVkICE9PSBvYmopIHsKKyAgICB2YXIgbWV0YSA9
IG1ldGFGb3Iob2JqKTsKKyAgICBpZiAoa2V5TmFtZSBpbiBtZXRhLmNhY2hlKSB7CisgICAgICBk
ZWxldGUgbWV0YS5jYWNoZVtrZXlOYW1lXTsKKyAgICAgIHJlbW92ZURlcGVuZGVudEtleXModGhp
cywgb2JqLCBrZXlOYW1lLCBtZXRhKTsKKyAgICB9CisgIH0KK307CiAKLSAgICAgICAgaWYgKHF1
ZXVlKSB7Ci0gICAgICAgICAgLy8gdGhlIHN5bmMgcGhhc2UgaXMgdG8gYWxsb3cgcHJvcGVydHkg
Y2hhbmdlcyB0byBwcm9wYWdhdGUuIGRvbid0Ci0gICAgICAgICAgLy8gaW52b2tlIG9ic2VydmVy
cyB1bnRpbCB0aGF0IGlzIGZpbmlzaGVkLgotICAgICAgICAgIGlmIChxdWV1ZU5hbWUgPT09ICdz
eW5jJykgewotICAgICAgICAgICAgbG9nID0gRW1iZXIuTE9HX0JJTkRJTkdTOwotICAgICAgICAg
ICAgaWYgKGxvZykgeyBFbWJlci5Mb2dnZXIubG9nKCdCZWdpbjogRmx1c2ggU3luYyBRdWV1ZScp
OyB9CitmdW5jdGlvbiBmaW5pc2hDaGFpbnMoY2hhaW5Ob2RlcykKK3sKKyAgZm9yICh2YXIgaT0w
LCBsPWNoYWluTm9kZXMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIGNoYWluTm9kZXNbaV0uZGlk
Q2hhbmdlKG51bGwpOworICB9Cit9CiAKLSAgICAgICAgICAgIEVtYmVyLmJlZ2luUHJvcGVydHlD
aGFuZ2VzKCk7CisvKioKKyAgQWNjZXNzIHRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYmFja2lu
ZyB0aGUgY29tcHV0ZWQgcHJvcGVydHkuCisgIElmIHRoaXMgcHJvcGVydHkgaGFzIGFscmVhZHkg
YmVlbiBjYWNoZWQsIHJldHVybiB0aGUgY2FjaGVkIHJlc3VsdC4KKyAgT3RoZXJ3aXNlLCBjYWxs
IHRoZSBmdW5jdGlvbiBwYXNzaW5nIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIGFuIGFyZ3VtZW50Lgog
Ci0gICAgICAgICAgICBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIEVtYmVyLmVuZFByb3BlcnR5
Q2hhbmdlcyk7CisgIGBgYGphdmFzY3JpcHQKKyAgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7CisgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICAgIC8vIHRoZSBrZXlO
YW1lIHBhcmFtZXRlciBpcyAnZnVsbE5hbWUnIGluIHRoaXMgY2FzZS4KIAotICAgICAgICAgICAg
aWYgKGxvZykgeyBFbWJlci5Mb2dnZXIubG9nKCdFbmQ6IEZsdXNoIFN5bmMgUXVldWUnKTsgfQot
ICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JFYWNoLmNhbGwocXVldWUsIGl0ZXIp
OwotICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdmaXJzdE5h
bWUnKSArICcgJyArIHRoaXMuZ2V0KCdsYXN0TmFtZScpOworICAgIH0ucHJvcGVydHkoJ2ZpcnN0
TmFtZScsICdsYXN0TmFtZScpCisgIH0pOwogCi0gICAgICAgIC8vIExvb3AgdGhyb3VnaCBwcmlv
ciBxdWV1ZXMKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaWR4OyBpKyspIHsKLSAgICAg
ICAgICBpZiAodGhpcy5fcXVldWVzICYmIHRoaXMuX3F1ZXVlc1txdWV1ZU5hbWVzW2ldXSkgewot
ICAgICAgICAgICAgLy8gU3RhcnQgb3ZlciBhdCB0aGUgZmlyc3QgcXVldWUgd2l0aCBjb250ZW50
cwotICAgICAgICAgICAgaWR4ID0gaTsKLSAgICAgICAgICAgIGNvbnRpbnVlIG91dGVybG9vcDsK
LSAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZHgrKzsKLSAgICAgIH0KLSAgICB9
CisgIHZhciB0b20gPSBQZXJzb24uY3JlYXRlKHsKKyAgICBmaXJzdE5hbWU6ICJUb20iLAorICAg
IGxhc3ROYW1lOiAiRGFsZSIKKyAgfSk7CiAKLSAgICB0aW1lck1hcmsgPSBudWxsOworICB0b20u
Z2V0KCdmdWxsTmFtZScpIC8vICJUb20gRGFsZSIKKyAgYGBgCiAKLSAgICByZXR1cm4gdGhpczsK
KyAgQG1ldGhvZCBnZXQKKyAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIGtleSBiZWluZyBh
Y2Nlc3NlZC4KKyAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5j
dGlvbiBiYWNraW5nIHRoZSBDUC4KKyovCitDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLmdldCA9
IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICB2YXIgcmV0LCBjYWNoZSwgbWV0YSwgY2hhaW5O
b2RlczsKKyAgaWYgKHRoaXMuX2NhY2hlYWJsZSkgeworICAgIG1ldGEgPSBtZXRhRm9yKG9iaik7
CisgICAgY2FjaGUgPSBtZXRhLmNhY2hlOworICAgIGlmIChrZXlOYW1lIGluIGNhY2hlKSB7IHJl
dHVybiBjYWNoZVtrZXlOYW1lXTsgfQorICAgIHJldCA9IGNhY2hlW2tleU5hbWVdID0gdGhpcy5m
dW5jLmNhbGwob2JqLCBrZXlOYW1lKTsKKyAgICBjaGFpbk5vZGVzID0gbWV0YS5jaGFpbldhdGNo
ZXJzICYmIG1ldGEuY2hhaW5XYXRjaGVyc1trZXlOYW1lXTsKKyAgICBpZiAoY2hhaW5Ob2Rlcykg
eyBmaW5pc2hDaGFpbnMoY2hhaW5Ob2Rlcyk7IH0KKyAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMs
IG9iaiwga2V5TmFtZSwgbWV0YSk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gdGhpcy5mdW5jLmNh
bGwob2JqLCBrZXlOYW1lKTsKICAgfQotCisgIHJldHVybiByZXQ7CiB9OwogCi1FbWJlci5SdW5M
b29wID0gUnVuTG9vcDsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gRW1iZXIucnVuIC0gdGhpcyBpcyBpZGVhbGx5IHRo
ZSBvbmx5IHB1YmxpYyBBUEkgdGhlIGRldiBzZWVzCi0vLwotCiAvKioKLSAgUnVucyB0aGUgcGFz
c2VkIHRhcmdldCBhbmQgbWV0aG9kIGluc2lkZSBvZiBhIFJ1bkxvb3AsIGVuc3VyaW5nIGFueQot
ICBkZWZlcnJlZCBhY3Rpb25zIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBkYXRlcyBh
cmUgZmx1c2hlZCBhdCB0aGUKLSAgZW5kLgotCi0gIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5l
ZWQgdG8gaW52b2tlIHRoaXMgbWV0aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCi0gIHlvdSBhcmUg
aW1wbGVtZW50aW5nIHJhdyBldmVudCBoYW5kbGVycyB3aGVuIGludGVyZmFjaW5nIHdpdGggb3Ro
ZXIKLSAgbGlicmFyaWVzIG9yIHBsdWdpbnMsIHlvdSBzaG91bGQgcHJvYmFibHkgd3JhcCBhbGwg
b2YgeW91ciBjb2RlIGluc2lkZSB0aGlzCi0gIGNhbGwuCisgIFNldCB0aGUgdmFsdWUgb2YgYSBj
b21wdXRlZCBwcm9wZXJ0eS4gSWYgdGhlIGZ1bmN0aW9uIHRoYXQgYmFja3MgeW91cgorICBjb21w
dXRlZCBwcm9wZXJ0eSBkb2VzIG5vdCBhY2NlcHQgYXJndW1lbnRzIHRoZW4gdGhlIGRlZmF1bHQg
YWN0aW9uIGZvcgorICBzZXR0aW5nIHdvdWxkIGJlIHRvIGRlZmluZSB0aGUgcHJvcGVydHkgb24g
dGhlIGN1cnJlbnQgb2JqZWN0LCBhbmQgc2V0CisgIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkg
dG8gdGhlIHZhbHVlIGJlaW5nIHNldC4KIAotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bihm
dW5jdGlvbigpewotICAgIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wIAot
ICB9KTsKLSAgYGBgCisgIEdlbmVyYWxseSBzcGVha2luZyBpZiB5b3UgaW50ZW5kIGZvciB5b3Vy
IGNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIHNldAorICB5b3VyIGJhY2tpbmcgZnVuY3Rpb24gc2hv
dWxkIGFjY2VwdCBlaXRoZXIgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy4KIAotICBAY2xhc3MgcnVu
Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHN0YXRpYwotICBAY29uc3RydWN0b3IKLSAgQHBhcmFt
IHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gY2FsbAotICBAcGFyYW0ge0Z1
bmN0aW9ufFN0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBpbnZva2UuCi0gICAgTWF5IGJlIGEgZnVu
Y3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCi0gICAgdGhlbiBpdCB3aWxs
IGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KLSAgQHBhcmFtIHtPYmplY3R9IFth
cmdzKl0gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHlvdSB3aXNoIHRvIHBhc3MgdG8gdGhlIG1l
dGhvZC4KLSAgQHJldHVybiB7T2JqZWN0fSByZXR1cm4gdmFsdWUgZnJvbSBpbnZva2luZyB0aGUg
cGFzc2VkIGZ1bmN0aW9uLgorICBAbWV0aG9kIHNldAorICBAcGFyYW0ge1N0cmluZ30ga2V5TmFt
ZSBUaGUga2V5IGJlaW5nIGFjY2Vzc2VkLgorICBAcGFyYW0ge09iamVjdH0gbmV3VmFsdWUgVGhl
IG5ldyB2YWx1ZSBiZWluZyBhc3NpZ25lZC4KKyAgQHBhcmFtIHtTdHJpbmd9IG9sZFZhbHVlIFRo
ZSBvbGQgdmFsdWUgYmVpbmcgcmVwbGFjZWQuCisgIEByZXR1cm4ge09iamVjdH0gVGhlIHJldHVy
biB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYmFja2luZyB0aGUgQ1AuCiAqLwotRW1iZXIucnVuID0g
ZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIGxvb3AsCi0gIGFyZ3MgPSBhcmd1bWVu
dHM7Ci0gIHJ1bi5iZWdpbigpOworQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5j
dGlvbihvYmosIGtleU5hbWUsIHZhbHVlKSB7CisgIHZhciBjYWNoZWFibGUgPSB0aGlzLl9jYWNo
ZWFibGUsCisgICAgICBmdW5jID0gdGhpcy5mdW5jLAorICAgICAgbWV0YSA9IG1ldGFGb3Iob2Jq
LCBjYWNoZWFibGUpLAorICAgICAgd2F0Y2hlZCA9IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0sCisg
ICAgICBvbGRTdXNwZW5kZWQgPSB0aGlzLl9zdXNwZW5kZWQsCisgICAgICBoYWRDYWNoZWRWYWx1
ZSA9IGZhbHNlLAorICAgICAgY2FjaGUgPSBtZXRhLmNhY2hlLAorICAgICAgZnVuY0FyZ0xlbmd0
aCwgY2FjaGVkVmFsdWUsIHJldDsKIAotICBmdW5jdGlvbiB0cnlhYmxlKCkgewotICAgIGlmICh0
YXJnZXQgfHwgbWV0aG9kKSB7Ci0gICAgICByZXR1cm4gaW52b2tlKHRhcmdldCwgbWV0aG9kLCBh
cmdzLCAyKTsKLSAgICB9CisgIGlmICh0aGlzLl9yZWFkT25seSkgeworICAgIHRocm93IG5ldyBF
bWJlci5FcnJvcignQ2Fubm90IFNldDogJyArIGtleU5hbWUgKyAnIG9uOiAnICsgb2JqLnRvU3Ry
aW5nKCkgKTsKICAgfQogCi0gIHJldHVybiBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIHJ1bi5l
bmQpOwotfTsKLQotdmFyIHJ1biA9IEVtYmVyLnJ1bjsKKyAgdGhpcy5fc3VzcGVuZGVkID0gb2Jq
OwogCisgIHRyeSB7CiAKLS8qKgotICBCZWdpbnMgYSBuZXcgUnVuTG9vcC4gQW55IGRlZmVycmVk
IGFjdGlvbnMgaW52b2tlZCBhZnRlciB0aGUgYmVnaW4gd2lsbAotICBiZSBidWZmZXJlZCB1bnRp
bCB5b3UgaW52b2tlIGEgbWF0Y2hpbmcgY2FsbCB0byBgRW1iZXIucnVuLmVuZCgpYC4gVGhpcyBp
cwotICBhbiBsb3dlci1sZXZlbCB3YXkgdG8gdXNlIGEgUnVuTG9vcCBpbnN0ZWFkIG9mIHVzaW5n
IGBFbWJlci5ydW4oKWAuCisgICAgaWYgKGNhY2hlYWJsZSAmJiBjYWNoZS5oYXNPd25Qcm9wZXJ0
eShrZXlOYW1lKSkgeworICAgICAgY2FjaGVkVmFsdWUgPSBjYWNoZVtrZXlOYW1lXTsKKyAgICAg
IGhhZENhY2hlZFZhbHVlID0gdHJ1ZTsKKyAgICB9CiAKLSAgYGBgamF2YXNjcmlwdAotICBFbWJl
ci5ydW4uYmVnaW4oKTsKLSAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3Ag
Ci0gIEVtYmVyLnJ1bi5lbmQoKTsKLSAgYGBgCisgICAgLy8gQ2hlY2sgaWYgdGhlIENQIGhhcyBi
ZWVuIHdyYXBwZWQuIElmIGlmIGhhcywgdXNlIHRoZQorICAgIC8vIGxlbmd0aCBmcm9tIHRoZSB3
cmFwcGVkIGZ1bmN0aW9uLgorICAgIGZ1bmNBcmdMZW5ndGggPSAoZnVuYy53cmFwcGVkRnVuY3Rp
b24gPyBmdW5jLndyYXBwZWRGdW5jdGlvbi5sZW5ndGggOiBmdW5jLmxlbmd0aCk7CiAKLSAgQG1l
dGhvZCBiZWdpbgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1bi5iZWdpbiA9IGZ1bmN0
aW9uKCkgewotICBydW4uY3VycmVudFJ1bkxvb3AgPSBuZXcgUnVuTG9vcChydW4uY3VycmVudFJ1
bkxvb3ApOwotfTsKKyAgICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21w
dXRlZCBwcm9wZXJ0aWVzCisgICAgLy8gdGhhdCBjaGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9
PT0gMiB0byBkZXRlcm1pbmUgaWYKKyAgICAvLyB0aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBv
bmx5IHBhc3MgdGhlIG9sZCBjYWNoZWQKKyAgICAvLyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJv
cGVydHkgb3B0cyBpbnRvIGEgdGhpcmQKKyAgICAvLyBhcmd1bWVudC4KKyAgICBpZiAoZnVuY0Fy
Z0xlbmd0aCA9PT0gMykgeworICAgICAgcmV0ID0gZnVuYy5jYWxsKG9iaiwga2V5TmFtZSwgdmFs
dWUsIGNhY2hlZFZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZ1bmNBcmdMZW5ndGggPT09IDIpIHsK
KyAgICAgIHJldCA9IGZ1bmMuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICB9IGVsc2Ug
eworICAgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBudWxsLCBjYWNoZWRW
YWx1ZSk7CisgICAgICBFbWJlci5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgICAgICByZXR1
cm47CisgICAgfQogCi0vKioKLSAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBjYWxsZWQg
c29tZXRpbWUgYWZ0ZXIgeW91IGNhbGwKLSAgYEVtYmVyLnJ1bi5iZWdpbigpYCB0byBmbHVzaCBh
bnkgZGVmZXJyZWQgYWN0aW9ucy4gVGhpcyBpcyBhIGxvd2VyLWxldmVsIHdheQotICB0byB1c2Ug
YSBSdW5Mb29wIGluc3RlYWQgb2YgdXNpbmcgYEVtYmVyLnJ1bigpYC4KKyAgICBpZiAoaGFkQ2Fj
aGVkVmFsdWUgJiYgY2FjaGVkVmFsdWUgPT09IHJldCkgeyByZXR1cm47IH0KIAotICBgYGBqYXZh
c2NyaXB0Ci0gIEVtYmVyLnJ1bi5iZWdpbigpOwotICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGUgd2l0
aGluIGEgUnVuTG9vcCAKLSAgRW1iZXIucnVuLmVuZCgpOwotICBgYGAKKyAgICBpZiAod2F0Y2hl
ZCkgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsgfQogCi0gIEBtZXRo
b2QgZW5kCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLmVuZCA9IGZ1bmN0aW9uKCkg
ewotICBFbWJlci5hc3NlcnQoJ211c3QgaGF2ZSBhIGN1cnJlbnQgcnVuIGxvb3AnLCBydW4uY3Vy
cmVudFJ1bkxvb3ApOworICAgIGlmIChoYWRDYWNoZWRWYWx1ZSkgeworICAgICAgZGVsZXRlIGNh
Y2hlW2tleU5hbWVdOworICAgIH0KIAotICBmdW5jdGlvbiB0cnlhYmxlKCkgICB7IHJ1bi5jdXJy
ZW50UnVuTG9vcC5lbmQoKTsgIH0KLSAgZnVuY3Rpb24gZmluYWxpemVyKCkgeyBydW4uY3VycmVu
dFJ1bkxvb3AgPSBydW4uY3VycmVudFJ1bkxvb3AucHJldigpOyB9CisgICAgaWYgKGNhY2hlYWJs
ZSkgeworICAgICAgaWYgKCFoYWRDYWNoZWRWYWx1ZSkgeworICAgICAgICBhZGREZXBlbmRlbnRL
ZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7CisgICAgICB9CisgICAgICBjYWNoZVtrZXlO
YW1lXSA9IHJldDsKKyAgICB9CiAKLSAgRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6
ZXIpOworICAgIGlmICh3YXRjaGVkKSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKG9iaiwga2V5
TmFtZSk7IH0KKyAgfSBmaW5hbGx5IHsKKyAgICB0aGlzLl9zdXNwZW5kZWQgPSBvbGRTdXNwZW5k
ZWQ7CisgIH0KKyAgcmV0dXJuIHJldDsKIH07CiAKLS8qKgotICBBcnJheSBvZiBuYW1lZCBxdWV1
ZXMuIFRoaXMgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcXVldWVzCi0gIGFy
ZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgdGhlIFJ1bkxvb3AuIFlvdSBjYW4gZGVmaW5lIHlvdXIg
b3duIHF1ZXVlcyBieQotICBzaW1wbHkgYWRkaW5nIHRoZSBxdWV1ZSBuYW1lIHRvIHRoaXMgYXJy
YXkuIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQKLSAgdG8gaW5zcGVjdCBvciBtb2RpZnkg
dGhpcyBwcm9wZXJ0eS4KLQotICBAcHJvcGVydHkgcXVldWVzCi0gIEB0eXBlIEFycmF5Ci0gIEBk
ZWZhdWx0IFsnc3luYycsICdhY3Rpb25zJywgJ2Rlc3Ryb3knLCAndGltZXJzJ10KLSovCi1FbWJl
ci5ydW4ucXVldWVzID0gWydzeW5jJywgJ2FjdGlvbnMnLCAnZGVzdHJveScsICd0aW1lcnMnXTsK
Ky8qIGNhbGxlZCBiZWZvcmUgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiAqLworQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICB2YXIg
bWV0YSA9IG1ldGFGb3Iob2JqKTsKIAotLyoqCi0gIEFkZHMgdGhlIHBhc3NlZCB0YXJnZXQvbWV0
aG9kIGFuZCBhbnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBuYW1lZAotICBxdWV1ZSB0byBi
ZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBJZiB5b3UgaGF2ZSBub3QgYWxy
ZWFkeQotICBzdGFydGVkIGEgUnVuTG9vcCB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgb25lIHdp
bGwgYmUgc3RhcnRlZCBmb3IgeW91Ci0gIGF1dG9tYXRpY2FsbHkuCisgIGlmIChrZXlOYW1lIGlu
IG1ldGEuY2FjaGUpIHsKKyAgICByZW1vdmVEZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFt
ZSwgbWV0YSk7CisgIH0KIAotICBBdCB0aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMg
c2NoZWR1bGVkIGluIHRoaXMgd2F5IHdpbGwgYmUgaW52b2tlZC4KLSAgTWV0aG9kcyB3aWxsIGJl
IGludm9rZWQgaW4gYW4gb3JkZXIgbWF0Y2hpbmcgdGhlIG5hbWVkIHF1ZXVlcyBkZWZpbmVkIGlu
Ci0gIHRoZSBgcnVuLnF1ZXVlc2AgcHJvcGVydHkuCisgIGlmICh0aGlzLl9jYWNoZWFibGUpIHsg
ZGVsZXRlIG1ldGEuY2FjaGVba2V5TmFtZV07IH0KIAotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVy
LnJ1bi5zY2hlZHVsZSgndGltZXJzJywgdGhpcywgZnVuY3Rpb24oKXsKLSAgICAvLyB0aGlzIHdp
bGwgYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgUnVuTG9vcCwgd2hlbiB0aW1lcnMgYXJl
IHJ1bgotICAgIGNvbnNvbGUubG9nKCJzY2hlZHVsZWQgb24gdGltZXJzIHF1ZXVlIik7Ci0gIH0p
OworICByZXR1cm4gbnVsbDsgLy8gbm8gdmFsdWUgdG8gcmVzdG9yZQorfTsKIAotICBFbWJlci5y
dW4uc2NoZWR1bGUoJ3N5bmMnLCB0aGlzLCBmdW5jdGlvbigpewotICAgIC8vIHRoaXMgd2lsbCBi
ZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLCB3aGVuIGJpbmRpbmdzIGFyZSBz
eW5jZWQKLSAgICBjb25zb2xlLmxvZygic2NoZWR1bGVkIG9uIHN5bmMgcXVldWUiKTsKLSAgfSk7
CiAKLSAgLy8gTm90ZSB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgcnVuIGluIG9yZGVyIGJhc2VkIG9u
IHRoZSBydW4gcXVldWVzIG9yZGVyLiBPdXRwdXQgd291bGQgYmU6Ci0gIC8vICAgc2NoZWR1bGVk
IG9uIHN5bmMgcXVldWUKLSAgLy8gICBzY2hlZHVsZWQgb24gdGltZXJzIHF1ZXVlCi0gIGBgYAor
LyoqCisgIFRoaXMgaGVscGVyIHJldHVybnMgYSBuZXcgcHJvcGVydHkgZGVzY3JpcHRvciB0aGF0
IHdyYXBzIHRoZSBwYXNzZWQKKyAgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb24uIFlvdSBjYW4g
dXNlIHRoaXMgaGVscGVyIHRvIGRlZmluZSBwcm9wZXJ0aWVzCisgIHdpdGggbWl4aW5zIG9yIHZp
YSBgRW1iZXIuZGVmaW5lUHJvcGVydHkoKWAuCiAKLSAgQG1ldGhvZCBzY2hlZHVsZQotICBAcGFy
YW0ge1N0cmluZ30gcXVldWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIHNjaGVkdWxlIGFnYWlu
c3QuCi0gICAgRGVmYXVsdCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlvbnMnCi0gIEBwYXJh
bSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgY29udGV4dCB3
aGVuIGludm9raW5nIGEgbWV0aG9kLgotICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9k
IFRoZSBtZXRob2QgdG8gaW52b2tlLiBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdAotICAgIHdpbGwg
YmUgcmVzb2x2ZWQgb24gdGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIHRpbWUgdGhlIHNjaGVkdWxl
ZCBpdGVtIGlzCi0gICAgaW52b2tlZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0YXJnZXQg
ZnVuY3Rpb24uCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzKl0gT3B0aW9uYWwgYXJndW1l
bnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVldWVkIG1ldGhvZC4KLSAgQHJldHVybiB7dm9pZH0K
KyAgVGhlIGZ1bmN0aW9uIHlvdSBwYXNzIHdpbGwgYmUgdXNlZCB0byBib3RoIGdldCBhbmQgc2V0
IHByb3BlcnR5IHZhbHVlcy4KKyAgVGhlIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgdHdvIHBhcmFt
ZXRlcnMsIGtleSBhbmQgdmFsdWUuIElmIHZhbHVlIGlzIG5vdAorICB1bmRlZmluZWQgeW91IHNo
b3VsZCBzZXQgdGhlIHZhbHVlIGZpcnN0LiBJbiBlaXRoZXIgY2FzZSByZXR1cm4gdGhlCisgIGN1
cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICBAbWV0aG9kIGNvbXB1dGVkCisgIEBmb3Ig
RW1iZXIKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgY29tcHV0ZWQgcHJvcGVydHkgZnVu
Y3Rpb24uCisgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHByb3BlcnR5IGRlc2Ny
aXB0b3IgaW5zdGFuY2UKICovCi1FbWJlci5ydW4uc2NoZWR1bGUgPSBmdW5jdGlvbihxdWV1ZSwg
dGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIGxvb3AgPSBydW4uYXV0b3J1bigpOwotICBsb29wLnNj
aGVkdWxlLmFwcGx5KGxvb3AsIGFyZ3VtZW50cyk7Ci19OwotCi12YXIgc2NoZWR1bGVkQXV0b3J1
bjsKLWZ1bmN0aW9uIGF1dG9ydW4oKSB7Ci0gIHNjaGVkdWxlZEF1dG9ydW4gPSBudWxsOwotICBp
ZiAocnVuLmN1cnJlbnRSdW5Mb29wKSB7IHJ1bi5lbmQoKTsgfQotfQotCi0vLyBVc2VkIGJ5IGds
b2JhbCB0ZXN0IHRlYXJkb3duCi1FbWJlci5ydW4uaGFzU2NoZWR1bGVkVGltZXJzID0gZnVuY3Rp
b24oKSB7Ci0gIHJldHVybiAhIShzY2hlZHVsZWRBdXRvcnVuIHx8IHNjaGVkdWxlZExhdGVyIHx8
IHNjaGVkdWxlZE5leHQpOwotfTsKK0VtYmVyLmNvbXB1dGVkID0gZnVuY3Rpb24oZnVuYykgewor
ICB2YXIgYXJnczsKIAotLy8gVXNlZCBieSBnbG9iYWwgdGVzdCB0ZWFyZG93bgotRW1iZXIucnVu
LmNhbmNlbFRpbWVycyA9IGZ1bmN0aW9uICgpIHsKLSAgaWYgKHNjaGVkdWxlZEF1dG9ydW4pIHsK
LSAgICBjbGVhclRpbWVvdXQoc2NoZWR1bGVkQXV0b3J1bik7Ci0gICAgc2NoZWR1bGVkQXV0b3J1
biA9IG51bGw7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGFyZ3MgPSBhX3Ns
aWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7CisgICAgZnVuYyA9IGFfc2xpY2UuY2FsbChhcmd1
bWVudHMsIC0xKVswXTsKICAgfQotICBpZiAoc2NoZWR1bGVkTGF0ZXIpIHsKLSAgICBjbGVhclRp
bWVvdXQoc2NoZWR1bGVkTGF0ZXIpOwotICAgIHNjaGVkdWxlZExhdGVyID0gbnVsbDsKKworICBp
ZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoIkNvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYSBwcm9wZXJ0eSBmdW5jdGlv
biIpOwogICB9Ci0gIGlmIChzY2hlZHVsZWROZXh0KSB7Ci0gICAgY2xlYXJUaW1lb3V0KHNjaGVk
dWxlZE5leHQpOwotICAgIHNjaGVkdWxlZE5leHQgPSBudWxsOworCisgIHZhciBjcCA9IG5ldyBD
b21wdXRlZFByb3BlcnR5KGZ1bmMpOworCisgIGlmIChhcmdzKSB7CisgICAgY3AucHJvcGVydHku
YXBwbHkoY3AsIGFyZ3MpOwogICB9Ci0gIHRpbWVycyA9IHt9OworCisgIHJldHVybiBjcDsKIH07
CiAKIC8qKgotICBCZWdpbnMgYSBuZXcgUnVuTG9vcCBpZiBuZWNlc3NhcnkgYW5kIHNjaGVkdWxl
cyBhIHRpbWVyIHRvIGZsdXNoIHRoZQotICBSdW5Mb29wIGF0IGEgbGF0ZXIgdGltZS4gVGhpcyBt
ZXRob2QgaXMgdXNlZCBieSBwYXJ0cyBvZiBFbWJlciB0bwotICBlbnN1cmUgdGhlIFJ1bkxvb3Ag
YWx3YXlzIGZpbmlzaGVzLiBZb3Ugbm9ybWFsbHkgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGlzCi0g
IG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgYEVtYmVyLnJ1bigpYAorICBSZXR1cm5zIHRo
ZSBjYWNoZWQgdmFsdWUgZm9yIGEgcHJvcGVydHksIGlmIG9uZSBleGlzdHMuCisgIFRoaXMgY2Fu
IGJlIHVzZWZ1bCBmb3IgcGVla2luZyBhdCB0aGUgdmFsdWUgb2YgYSBjb21wdXRlZAorICBwcm9w
ZXJ0eSB0aGF0IGlzIGdlbmVyYXRlZCBsYXppbHksIHdpdGhvdXQgYWNjaWRlbnRhbGx5IGNhdXNp
bmcKKyAgaXQgdG8gYmUgY3JlYXRlZC4KIAotICBAbWV0aG9kIGF1dG9ydW4KLSAgQGV4YW1wbGUK
LSAgICBFbWJlci5ydW4uYXV0b3J1bigpOwotICBAcmV0dXJuIHtFbWJlci5SdW5Mb29wfSB0aGUg
bmV3IGN1cnJlbnQgUnVuTG9vcAorICBAbWV0aG9kIGNhY2hlRm9yCisgIEBmb3IgRW1iZXIKKyAg
QHBhcmFtIHtPYmplY3R9IG9iaiB0aGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IHlvdSB3YW50IHRv
IGNoZWNrCisgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdo
b3NlIGNhY2hlZCB2YWx1ZSB5b3Ugd2FudAorICAgIHRvIHJldHVybgorICBAcmV0dXJuIHtPYmpl
Y3R9IHRoZSBjYWNoZWQgdmFsdWUKICovCi1FbWJlci5ydW4uYXV0b3J1biA9IGZ1bmN0aW9uKCkg
ewotICBpZiAoIXJ1bi5jdXJyZW50UnVuTG9vcCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGhh
dmUgdHVybmVkIG9uIHRlc3RpbmcgbW9kZSwgd2hpY2ggZGlzYWJsZWQgdGhlIHJ1bi1sb29wJ3Mg
YXV0b3J1bi4gWW91IHdpbGwgbmVlZCB0byB3cmFwIGFueSBjb2RlIHdpdGggYXN5bmNocm9ub3Vz
IHNpZGUtZWZmZWN0cyBpbiBhbiBFbWJlci5ydW4iLCAhRW1iZXIudGVzdGluZyk7CitFbWJlci5j
YWNoZUZvciA9IGZ1bmN0aW9uIGNhY2hlRm9yKG9iaiwga2V5KSB7CisgIHZhciBjYWNoZSA9IG1l
dGFGb3Iob2JqLCBmYWxzZSkuY2FjaGU7CiAKLSAgICBydW4uYmVnaW4oKTsKKyAgaWYgKGNhY2hl
ICYmIGtleSBpbiBjYWNoZSkgeworICAgIHJldHVybiBjYWNoZVtrZXldOworICB9Cit9OwogCi0g
ICAgaWYgKCFzY2hlZHVsZWRBdXRvcnVuKSB7Ci0gICAgICBzY2hlZHVsZWRBdXRvcnVuID0gc2V0
VGltZW91dChhdXRvcnVuLCAxKTsKLSAgICB9CitmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKHNlbGYs
IHByb3BlcnR5TmFtZXMpIHsKKyAgdmFyIHJldCA9IHt9OworICBmb3IodmFyIGkgPSAwOyBpIDwg
cHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgeworICAgIHJldFtwcm9wZXJ0eU5hbWVzW2ldXSA9
IGdldChzZWxmLCBwcm9wZXJ0eU5hbWVzW2ldKTsKICAgfQorICByZXR1cm4gcmV0OworfQogCi0g
IHJldHVybiBydW4uY3VycmVudFJ1bkxvb3A7Ci19OworZnVuY3Rpb24gcmVnaXN0ZXJDb21wdXRl
ZChuYW1lLCBtYWNybykgeworICBFbWJlci5jb21wdXRlZFtuYW1lXSA9IGZ1bmN0aW9uKGRlcGVu
ZGVudEtleSkgeworICAgIHZhciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAg
cmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oKSB7CisgICAgICBy
ZXR1cm4gbWFjcm8uYXBwbHkodGhpcywgYXJncyk7CisgICAgfSk7CisgIH07Cit9CiAKLS8qKgot
ICBJbW1lZGlhdGVseSBmbHVzaGVzIGFueSBldmVudHMgc2NoZWR1bGVkIGluIHRoZSAnc3luYycg
cXVldWUuIEJpbmRpbmdzCi0gIHVzZSB0aGlzIHF1ZXVlIHNvIHRoaXMgbWV0aG9kIGlzIGEgdXNl
ZnVsIHdheSB0byBpbW1lZGlhdGVseSBmb3JjZSBhbGwKLSAgYmluZGluZ3MgaW4gdGhlIGFwcGxp
Y2F0aW9uIHRvIHN5bmMuCitmdW5jdGlvbiByZWdpc3RlckNvbXB1dGVkV2l0aFByb3BlcnRpZXMo
bmFtZSwgbWFjcm8pIHsKKyAgRW1iZXIuY29tcHV0ZWRbbmFtZV0gPSBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgcHJvcGVydGllcyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwogCi0gIFlvdSBzaG91
bGQgY2FsbCB0aGlzIG1ldGhvZCBhbnl0aW1lIHlvdSBuZWVkIGFueSBjaGFuZ2VkIHN0YXRlIHRv
IHByb3BhZ2F0ZQotICB0aHJvdWdob3V0IHRoZSBhcHAgaW1tZWRpYXRlbHkgd2l0aG91dCByZXBh
aW50aW5nIHRoZSBVSS4KKyAgICB2YXIgY29tcHV0ZWQgPSBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKKyAgICAgIHJldHVybiBtYWNyby5hcHBseSh0aGlzLCBbZ2V0UHJvcGVydGllcyh0aGlz
LCBwcm9wZXJ0aWVzKV0pOworICAgIH0pOworCisgICAgcmV0dXJuIGNvbXB1dGVkLnByb3BlcnR5
LmFwcGx5KGNvbXB1dGVkLCBwcm9wZXJ0aWVzKTsKKyAgfTsKK30KKworLyoqCisgIEEgY29tcHV0
ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXBlbmRl
bnQKKyAgcHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3Ig
ZW1wdHkgZnVuY3Rpb24uCisKKyAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQuZW1w
dHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bworICB1c2UgdGhlIGBhcnJheS5bXWAg
c3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRpb25zCisgIGZy
b20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRlcy4KKworICBFeGFtcGxlCiAKICAgYGBgamF2YXNj
cmlwdAotICBFbWJlci5ydW4uc3luYygpOworICB2YXIgVG9Eb0xpc3QgPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKKyAgICBkb25lOiBFbWJlci5jb21wdXRlZC5lbXB0eSgndG9kb3MuW10nKSAvLyBk
ZXRlY3QgYXJyYXkgY2hhbmdlcworICB9KTsKKyAgdmFyIHRvZG9MaXN0ID0gVG9Eb0xpc3QuY3Jl
YXRlKHt0b2RvczogWydVbml0IFRlc3QnLCAnRG9jdW1lbnRhdGlvbicsICdSZWxlYXNlJ119KTsK
KyAgdG9kb0xpc3QuZ2V0KCdkb25lJyk7IC8vIGZhbHNlCisgIHRvZG9MaXN0LmdldCgndG9kb3Mn
KS5jbGVhcigpOyAvLyBbXQorICB0b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gdHJ1ZQogICBgYGAK
IAotICBAbWV0aG9kIHN5bmMKLSAgQHJldHVybiB7dm9pZH0KKyAgQG1ldGhvZCBjb21wdXRlZC5l
bXB0eQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggbmVn
YXRlCisgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkKICovCi1FbWJlci5ydW4uc3lu
YyA9IGZ1bmN0aW9uKCkgewotICBydW4uYXV0b3J1bigpOwotICBydW4uY3VycmVudFJ1bkxvb3Au
Zmx1c2goJ3N5bmMnKTsKLX07CityZWdpc3RlckNvbXB1dGVkKCdlbXB0eScsIGZ1bmN0aW9uKGRl
cGVuZGVudEtleSkgeworICByZXR1cm4gRW1iZXIuaXNFbXB0eShnZXQodGhpcywgZGVwZW5kZW50
S2V5KSk7Cit9KTsKIAotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgotLy8gVElNRVJTCi0vLworLyoqCisgIEEgY29tcHV0ZWQgcHJv
cGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXBlbmRlbnQKKyAg
cHJvcGVydHkgaXMgTk9UIG51bGwsIGFuIGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksIG9yIGVt
cHR5IGZ1bmN0aW9uLgogCi12YXIgdGltZXJzID0ge307IC8vIGFjdGl2ZSB0aW1lcnMuLi4KLQot
dmFyIHNjaGVkdWxlZExhdGVyOwotZnVuY3Rpb24gaW52b2tlTGF0ZXJUaW1lcnMoKSB7Ci0gIHNj
aGVkdWxlZExhdGVyID0gbnVsbDsKLSAgdmFyIG5vdyA9ICgrIG5ldyBEYXRlKCkpLCBlYXJsaWVz
dCA9IC0xOwotICBmb3IgKHZhciBrZXkgaW4gdGltZXJzKSB7Ci0gICAgaWYgKCF0aW1lcnMuaGFz
T3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQotICAgIHZhciB0aW1lciA9IHRpbWVyc1tr
ZXldOwotICAgIGlmICh0aW1lciAmJiB0aW1lci5leHBpcmVzKSB7Ci0gICAgICBpZiAobm93ID49
IHRpbWVyLmV4cGlyZXMpIHsKLSAgICAgICAgZGVsZXRlIHRpbWVyc1trZXldOwotICAgICAgICBp
bnZva2UodGltZXIudGFyZ2V0LCB0aW1lci5tZXRob2QsIHRpbWVyLmFyZ3MsIDIpOwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgaWYgKGVhcmxpZXN0PDAgfHwgKHRpbWVyLmV4cGlyZXMgPCBlYXJs
aWVzdCkpIGVhcmxpZXN0PXRpbWVyLmV4cGlyZXM7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIE5v
dGU6IFdoZW4gdXNpbmcgYEVtYmVyLmNvbXB1dGVkLm5vdEVtcHR5YCB0byB3YXRjaCBhbiBhcnJh
eSBtYWtlIHN1cmUgdG8KKyAgdXNlIHRoZSBgYXJyYXkuW11gIHN5bnRheCBzbyB0aGUgY29tcHV0
ZWQgY2FuIHN1YnNjcmliZSB0byB0cmFuc2l0aW9ucworICBmcm9tIGVtcHR5IHRvIG5vbi1lbXB0
eSBzdGF0ZXMuCiAKLSAgLy8gc2NoZWR1bGUgbmV4dCB0aW1lb3V0IHRvIGZpcmUuLi4KLSAgaWYg
KGVhcmxpZXN0ID4gMCkgeyBzY2hlZHVsZWRMYXRlciA9IHNldFRpbWVvdXQoaW52b2tlTGF0ZXJU
aW1lcnMsIGVhcmxpZXN0LSgrIG5ldyBEYXRlKCkpKTsgfQotfQorICBFeGFtcGxlCisKKyAgYGBg
amF2YXNjcmlwdAorICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIGhh
c1N0dWZmOiBFbWJlci5jb21wdXRlZC5ub3RFbXB0eSgnYmFja3BhY2suW10nKQorICB9KTsKKyAg
dmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7YmFja3BhY2s6IFsnRm9vZCcsICdTbGVlcGlu
ZyBCYWcnLCAnVGVudCddfSk7CisgIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAvLyB0cnVlCisg
IGhhbXN0ZXIuZ2V0KCdiYWNrcGFjaycpLmNsZWFyKCk7IC8vIFtdCisgIGhhbXN0ZXIuZ2V0KCdo
YXNTdHVmZicpOyAvLyBmYWxzZQorICBgYGAKKworICBAbWV0aG9kIGNvbXB1dGVkLm5vdEVtcHR5
CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcmV0dXJu
IHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5z
IHRydWUgaWYKKyAgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4KKyov
CityZWdpc3RlckNvbXB1dGVkKCdub3RFbXB0eScsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewor
ICByZXR1cm4gIUVtYmVyLmlzRW1wdHkoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOworfSk7CiAK
IC8qKgotICBJbnZva2VzIHRoZSBwYXNzZWQgdGFyZ2V0L21ldGhvZCBhbmQgb3B0aW9uYWwgYXJn
dW1lbnRzIGFmdGVyIGEgc3BlY2lmaWVkCi0gIHBlcmlvZCBpZiB0aW1lLiBUaGUgbGFzdCBwYXJh
bWV0ZXIgb2YgdGhpcyBtZXRob2QgbXVzdCBhbHdheXMgYmUgYSBudW1iZXIKLSAgb2YgbWlsbGlz
ZWNvbmRzLgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2
YWx1ZSBvZiB0aGUgZGVwZW5kZW50CisgIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcKKyAgYWJvdXQgdXNlIG9m
ID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkgY29uZnVzaW5nLgogCi0gIFlvdSBzaG91bGQg
dXNlIHRoaXMgbWV0aG9kIHdoZW5ldmVyIHlvdSBuZWVkIHRvIHJ1biBzb21lIGFjdGlvbiBhZnRl
ciBhCi0gIHBlcmlvZCBvZiB0aW1lIGluc3RlYWQgb2YgdXNpbmcgYHNldFRpbWVvdXQoKWAuIFRo
aXMgbWV0aG9kIHdpbGwgZW5zdXJlIHRoYXQKLSAgaXRlbXMgdGhhdCBleHBpcmUgZHVyaW5nIHRo
ZSBzYW1lIHNjcmlwdCBleGVjdXRpb24gY3ljbGUgYWxsIGV4ZWN1dGUKLSAgdG9nZXRoZXIsIHdo
aWNoIGlzIG9mdGVuIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgYSByZWFsIHNldFRpbWVvdXQu
CisgIEV4YW1wbGUKIAogICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bi5sYXRlcihteUNvbnRl
eHQsIGZ1bmN0aW9uKCl7Ci0gICAgLy8gY29kZSBoZXJlIHdpbGwgZXhlY3V0ZSB3aXRoaW4gYSBS
dW5Mb29wIGluIGFib3V0IDUwMG1zIHdpdGggdGhpcyA9PSBteUNvbnRleHQKLSAgfSwgNTAwKTsK
KyAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICBpc0h1bmdyeTogRW1i
ZXIuY29tcHV0ZWQubm9uZSgnZm9vZCcpCisgIH0pOworICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIu
Y3JlYXRlKCk7CisgIGhhbXN0ZXIuZ2V0KCdpc0h1bmdyeScpOyAvLyB0cnVlCisgIGhhbXN0ZXIu
c2V0KCdmb29kJywgJ0JhbmFuYScpOworICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8gZmFs
c2UKKyAgaGFtc3Rlci5zZXQoJ2Zvb2QnLCBudWxsKTsKKyAgaGFtc3Rlci5nZXQoJ2lzSHVuZ3J5
Jyk7IC8vIHRydWUKICAgYGBgCiAKLSAgQG1ldGhvZCBsYXRlcgotICBAcGFyYW0ge09iamVjdH0g
W3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZva2UKLSAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBJZiB5b3UgcGFzcyBhIHN0
cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQotICAgIHRhcmdldCBhdCB0aGUgdGltZSB0
aGUgbWV0aG9kIGlzIGludm9rZWQuCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFs
IGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgotICBAcGFyYW0ge051bWJlcn0gd2Fp
dAotICAgIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KLSAgQHJldHVybiB7U3RyaW5n
fSBhIHN0cmluZyB5b3UgY2FuIHVzZSB0byBjYW5jZWwgdGhlIHRpbWVyIGluCi0gICAge3sjY3Jv
c3NMaW5rICJFbWJlci9ydW4uY2FuY2VsIn19e3svY3Jvc3NMaW5rfX0gbGF0ZXIuCisgIEBtZXRo
b2QgY29tcHV0ZWQubm9uZQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl
bnRLZXkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVy
dHkgd2hpY2gKKyAgcmV0dXJucyB0cnVlIGlmIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBp
cyBudWxsIG9yIHVuZGVmaW5lZC4KICovCi1FbWJlci5ydW4ubGF0ZXIgPSBmdW5jdGlvbih0YXJn
ZXQsIG1ldGhvZCkgewotICB2YXIgYXJncywgZXhwaXJlcywgdGltZXIsIGd1aWQsIHdhaXQ7Ci0K
LSAgLy8gc2V0VGltZW91dCBjb21wYXRpYmlsaXR5Li4uCi0gIGlmIChhcmd1bWVudHMubGVuZ3Ro
PT09MiAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgd2FpdCAgID0gbWV0
aG9kOwotICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSB1bmRlZmluZWQ7Ci0gICAg
YXJncyAgID0gW3RhcmdldCwgbWV0aG9kXTsKLSAgfSBlbHNlIHsKLSAgICBhcmdzID0gc2xpY2Uu
Y2FsbChhcmd1bWVudHMpOwotICAgIHdhaXQgPSBhcmdzLnBvcCgpOwotICB9CityZWdpc3RlckNv
bXB1dGVkKCdub25lJywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7CisgIHJldHVybiBFbWJlci5p
c05vbmUoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOworfSk7CiAKLSAgZXhwaXJlcyA9ICgrIG5l
dyBEYXRlKCkpICsgd2FpdDsKLSAgdGltZXIgICA9IHsgdGFyZ2V0OiB0YXJnZXQsIG1ldGhvZDog
bWV0aG9kLCBleHBpcmVzOiBleHBpcmVzLCBhcmdzOiBhcmdzIH07Ci0gIGd1aWQgICAgPSBFbWJl
ci5ndWlkRm9yKHRpbWVyKTsKLSAgdGltZXJzW2d1aWRdID0gdGltZXI7Ci0gIHJ1bi5vbmNlKHRp
bWVycywgaW52b2tlTGF0ZXJUaW1lcnMpOwotICByZXR1cm4gZ3VpZDsKLX07CisvKioKKyAgQSBj
b21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGludmVyc2UgYm9vbGVhbiB2YWx1ZQor
ICBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRoZSBkZXBlbmRlbnQgcHJvcGVydHkuCiAKLWZ1
bmN0aW9uIGludm9rZU9uY2VUaW1lcihndWlkLCBvbmNlVGltZXJzKSB7Ci0gIGlmIChvbmNlVGlt
ZXJzW3RoaXMudGd1aWRdKSB7IGRlbGV0ZSBvbmNlVGltZXJzW3RoaXMudGd1aWRdW3RoaXMubWd1
aWRdOyB9Ci0gIGlmICh0aW1lcnNbZ3VpZF0pIHsgaW52b2tlKHRoaXMudGFyZ2V0LCB0aGlzLm1l
dGhvZCwgdGhpcy5hcmdzKTsgfQotICBkZWxldGUgdGltZXJzW2d1aWRdOwotfQorICBFeGFtcGxl
CiAKLWZ1bmN0aW9uIHNjaGVkdWxlT25jZShxdWV1ZSwgdGFyZ2V0LCBtZXRob2QsIGFyZ3MpIHsK
LSAgdmFyIHRndWlkID0gRW1iZXIuZ3VpZEZvcih0YXJnZXQpLAotICAgIG1ndWlkID0gRW1iZXIu
Z3VpZEZvcihtZXRob2QpLAotICAgIG9uY2VUaW1lcnMgPSBydW4uYXV0b3J1bigpLm9uY2VUaW1l
cnMsCi0gICAgZ3VpZCA9IG9uY2VUaW1lcnNbdGd1aWRdICYmIG9uY2VUaW1lcnNbdGd1aWRdW21n
dWlkXSwKLSAgICB0aW1lcjsKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgVXNlciA9IEVtYmVyLk9i
amVjdC5leHRlbmQoeworICAgIGlzQW5vbnltb3VzOiBFbWJlci5jb21wdXRlZC5ub3QoJ2xvZ2dl
ZEluJykKKyAgfSk7CisgIHZhciB1c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0p
OworICB1c2VyLmdldCgnaXNBbm9ueW1vdXMnKTsgLy8gdHJ1ZQorICB1c2VyLnNldCgnbG9nZ2Vk
SW4nLCB0cnVlKTsKKyAgdXNlci5nZXQoJ2lzQW5vbnltb3VzJyk7IC8vIGZhbHNlCisgIGBgYAog
Ci0gIGlmIChndWlkICYmIHRpbWVyc1tndWlkXSkgewotICAgIHRpbWVyc1tndWlkXS5hcmdzID0g
YXJnczsgLy8gcmVwbGFjZSBhcmdzCi0gIH0gZWxzZSB7Ci0gICAgdGltZXIgPSB7Ci0gICAgICB0
YXJnZXQ6IHRhcmdldCwKLSAgICAgIG1ldGhvZDogbWV0aG9kLAotICAgICAgYXJnczogICBhcmdz
LAotICAgICAgdGd1aWQ6ICB0Z3VpZCwKLSAgICAgIG1ndWlkOiAgbWd1aWQKLSAgICB9OworICBA
bWV0aG9kIGNvbXB1dGVkLm5vdAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBkZXBl
bmRlbnRLZXkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJv
cGVydHkgd2hpY2ggcmV0dXJucworICBpbnZlcnNlIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3Ig
cHJvcGVydHkKKyovCityZWdpc3RlckNvbXB1dGVkKCdub3QnLCBmdW5jdGlvbihkZXBlbmRlbnRL
ZXkpIHsKKyAgcmV0dXJuICFnZXQodGhpcywgZGVwZW5kZW50S2V5KTsKK30pOwogCi0gICAgZ3Vp
ZCAgPSBFbWJlci5ndWlkRm9yKHRpbWVyKTsKLSAgICB0aW1lcnNbZ3VpZF0gPSB0aW1lcjsKLSAg
ICBpZiAoIW9uY2VUaW1lcnNbdGd1aWRdKSB7IG9uY2VUaW1lcnNbdGd1aWRdID0ge307IH0KLSAg
ICBvbmNlVGltZXJzW3RndWlkXVttZ3VpZF0gPSBndWlkOyAvLyBzbyBpdCBpc24ndCBzY2hlZHVs
ZWQgbW9yZSB0aGFuIG9uY2UKKy8qKgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY29udmVy
dHMgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0eQorICBpbnRvIGEgYm9vbGVhbiB2YWx1
ZS4KIAotICAgIHJ1bi5zY2hlZHVsZShxdWV1ZSwgdGltZXIsIGludm9rZU9uY2VUaW1lciwgZ3Vp
ZCwgb25jZVRpbWVycyk7Ci0gIH0KKyAgYGBgamF2YXNjcmlwdAorICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoeworICAgIGhhc0JhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmJvb2wo
J251bUJhbmFuYXMnKQorICB9KTsKKyAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwor
ICBoYW1zdGVyLmdldCgnaGFzQmFuYW5hcycpOyAvLyBmYWxzZQorICBoYW1zdGVyLnNldCgnbnVt
QmFuYW5hcycsIDApOworICBoYW1zdGVyLmdldCgnaGFzQmFuYW5hcycpOyAvLyBmYWxzZQorICBo
YW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDEpOworICBoYW1zdGVyLmdldCgnaGFzQmFuYW5hcycp
OyAvLyB0cnVlCisgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgbnVsbCk7CisgIGhhbXN0ZXIu
Z2V0KCdoYXNCYW5hbmFzJyk7IC8vIGZhbHNlCisgIGBgYAogCi0gIHJldHVybiBndWlkOwotfQor
ICBAbWV0aG9kIGNvbXB1dGVkLmJvb2wKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30g
ZGVwZW5kZW50S2V5CisgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVk
IHByb3BlcnR5IHdoaWNoIGNvbnZlcnRzCisgIHRvIGJvb2xlYW4gdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eQorKi8KK3JlZ2lzdGVyQ29tcHV0ZWQoJ2Jvb2wnLCBmdW5jdGlvbihkZXBl
bmRlbnRLZXkpIHsKKyAgcmV0dXJuICEhZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7Cit9KTsKIAog
LyoqCi0gIFNjaGVkdWxlcyBhbiBpdGVtIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhlIGN1cnJl
bnQgUnVuTG9vcC4gQ2FsbGluZwotICB0aGlzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHRhcmdldC9t
ZXRob2QgY29tYmluYXRpb24gd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgQSBjb21wdXRlZCBwcm9w
ZXJ0eSB3aGljaCBtYXRjaGVzIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlCisgIGRlcGVuZGVu
dCBwcm9wZXJ0eSBhZ2FpbnN0IGEgZ2l2ZW4gUmVnRXhwLCByZXR1cm5pbmcgYHRydWVgCisgIGlm
IHRoZXkgdmFsdWVzIG1hdGNoZXMgdGhlIFJlZ0V4cCBhbmQgYGZhbHNlYCBpZiBpdCBkb2VzIG5v
dC4KIAotICBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IGNhbiBwYXNzIG9wdGlvbmFsIGFyZ3VtZW50
cyB0aGVzZSB3aWxsIG5vdCBiZQotICBjb25zaWRlcmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGlj
YXRlcy4gTmV3IGFyZ3VtZW50cyB3aWxsIHJlcGxhY2UgcHJldmlvdXMKLSAgY2FsbHMuCisgIEV4
YW1wbGUKIAogICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bihmdW5jdGlvbigpewotICAgIHZh
ciBkb0ZvbyA9IGZ1bmN0aW9uKCkgeyBmb28oKTsgfQotICAgIEVtYmVyLnJ1bi5vbmNlKG15Q29u
dGV4dCwgZG9Gb28pOwotICAgIEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4dCwgZG9Gb28pOwotICAg
IC8vIGRvRm9vIHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlIGF0IHRoZSBlbmQgb2YgdGhlIFJ1
bkxvb3AKKyAgdmFyIFVzZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICBoYXNWYWxpZEVt
YWlsOiBFbWJlci5jb21wdXRlZC5tYXRjaCgnZW1haWwnLCAvXi4rQC4rXC4uKyQvKQogICB9KTsK
KyAgdmFyIHVzZXIgPSBVc2VyLmNyZWF0ZSh7bG9nZ2VkSW46IGZhbHNlfSk7CisgIHVzZXIuZ2V0
KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCisgIHVzZXIuc2V0KCdlbWFpbCcsICcnKTsKKyAg
dXNlci5nZXQoJ2hhc1ZhbGlkRW1haWwnKTsgLy8gZmFsc2UKKyAgdXNlci5zZXQoJ2VtYWlsJywg
J2VtYmVyX2hhbXN0ZXJAZXhhbXBsZS5jb20nKTsKKyAgdXNlci5nZXQoJ2hhc1ZhbGlkRW1haWwn
KTsgLy8gdHJ1ZQogICBgYGAKIAotICBAbWV0aG9kIG9uY2UKLSAgQHBhcmFtIHtPYmplY3R9IFt0
YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCi0gIEBwYXJhbSB7RnVuY3Rpb258U3Ry
aW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCi0gICAgSWYgeW91IHBhc3MgYSBzdHJp
bmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKLSAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhl
IG1ldGhvZCBpcyBpbnZva2VkLgotICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBh
cmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAgQHJldHVybiB7T2JqZWN0fSB0aW1l
cgorICBAbWV0aG9kIGNvbXB1dGVkLm1hdGNoCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtTdHJp
bmd9IGRlcGVuZGVudEtleQorICBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwCisgIEByZXR1cm4ge0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG1hdGNoCisgIHRo
ZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgYWdhaW5zdCBhIGdpdmVuIFJlZ0V4cAogKi8K
LUVtYmVyLnJ1bi5vbmNlID0gZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAgcmV0dXJuIHNj
aGVkdWxlT25jZSgnYWN0aW9ucycsIHRhcmdldCwgbWV0aG9kLCBzbGljZS5jYWxsKGFyZ3VtZW50
cywgMikpOwotfTsKLQotRW1iZXIucnVuLnNjaGVkdWxlT25jZSA9IGZ1bmN0aW9uKHF1ZXVlLCB0
YXJnZXQsIG1ldGhvZCwgYXJncykgewotICByZXR1cm4gc2NoZWR1bGVPbmNlKHF1ZXVlLCB0YXJn
ZXQsIG1ldGhvZCwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpKTsKLX07Ci0KLXZhciBzY2hlZHVs
ZWROZXh0OwotZnVuY3Rpb24gaW52b2tlTmV4dFRpbWVycygpIHsKLSAgc2NoZWR1bGVkTmV4dCA9
IG51bGw7Ci0gIGZvcih2YXIga2V5IGluIHRpbWVycykgewotICAgIGlmICghdGltZXJzLmhhc093
blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICB2YXIgdGltZXIgPSB0aW1lcnNba2V5
XTsKLSAgICBpZiAodGltZXIubmV4dCkgewotICAgICAgZGVsZXRlIHRpbWVyc1trZXldOwotICAg
ICAgaW52b2tlKHRpbWVyLnRhcmdldCwgdGltZXIubWV0aG9kLCB0aW1lci5hcmdzLCAyKTsKLSAg
ICB9Ci0gIH0KLX0KK3JlZ2lzdGVyQ29tcHV0ZWQoJ21hdGNoJywgZnVuY3Rpb24oZGVwZW5kZW50
S2V5LCByZWdleHApIHsKKyAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7Cisg
IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcmVnZXhwLnRlc3QodmFsdWUpIDog
ZmFsc2U7Cit9KTsKIAogLyoqCi0gIFNjaGVkdWxlcyBhbiBpdGVtIHRvIHJ1biBhZnRlciBjb250
cm9sIGhhcyBiZWVuIHJldHVybmVkIHRvIHRoZSBzeXN0ZW0uCi0gIFRoaXMgaXMgb2Z0ZW4gZXF1
aXZhbGVudCB0byBjYWxsaW5nIGBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge30sIDEpYC4KKyAgQSBj
b21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5k
ZW50IHByb3BlcnR5CisgIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKworICBFeGFtcGxl
CiAKICAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4ubmV4dChteUNvbnRleHQsIGZ1bmN0aW9u
KCl7Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlZCBpbiB0aGUgbmV4dCBSdW5Mb29wLCB3aGlj
aCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3VycmVudCBvbmUKKyAgdmFyIEhhbXN0ZXIg
PSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICBuYXBUaW1lOiBFbWJlci5jb21wdXRlZC5lcXVh
bCgnc3RhdGUnLCAnc2xlZXB5JykKICAgfSk7CisgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVh
dGUoKTsKKyAgaGFtc3Rlci5nZXQoJ25hcFRpbWUnKTsgLy8gZmFsc2UKKyAgaGFtc3Rlci5zZXQo
J3N0YXRlJywgJ3NsZWVweScpOworICBoYW1zdGVyLmdldCgnbmFwVGltZScpOyAvLyB0cnVlCisg
IGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdodW5ncnknKTsKKyAgaGFtc3Rlci5nZXQoJ25hcFRpbWUn
KTsgLy8gZmFsc2UKICAgYGBgCiAKLSAgQG1ldGhvZCBuZXh0Ci0gIEBwYXJhbSB7T2JqZWN0fSBb
dGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGludm9rZQotICBAcGFyYW0ge0Z1bmN0aW9ufFN0
cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEgc3Ry
aW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRo
ZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwg
YXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0gdGlt
ZXIKKyAgQG1ldGhvZCBjb21wdXRlZC5lcXVhbAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3Ry
aW5nfSBkZXBlbmRlbnRLZXkKKyAgQHBhcmFtIHtTdHJpbmd8TnVtYmVyfE9iamVjdH0gdmFsdWUK
KyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hp
Y2ggcmV0dXJucyB0cnVlIGlmCisgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMg
ZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgogKi8KLUVtYmVyLnJ1bi5uZXh0ID0gZnVuY3Rpb24o
dGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIGd1aWQsCi0gICAgICB0aW1lciA9IHsKLSAgICAgICAg
dGFyZ2V0OiB0YXJnZXQsCi0gICAgICAgIG1ldGhvZDogbWV0aG9kLAotICAgICAgICBhcmdzOiBz
bGljZS5jYWxsKGFyZ3VtZW50cyksCi0gICAgICAgIG5leHQ6IHRydWUKLSAgICAgIH07CityZWdp
c3RlckNvbXB1dGVkKCdlcXVhbCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKKyAg
cmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID09PSB2YWx1ZTsKK30pOwogCi0gIGd1aWQg
PSBFbWJlci5ndWlkRm9yKHRpbWVyKTsKLSAgdGltZXJzW2d1aWRdID0gdGltZXI7CisvKioKKyAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmllZCBkZXBl
bmRlbnQgcHJvcGVydHkKKyAgaXMgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS4KIAot
ICBpZiAoIXNjaGVkdWxlZE5leHQpIHsgc2NoZWR1bGVkTmV4dCA9IHNldFRpbWVvdXQoaW52b2tl
TmV4dFRpbWVycywgMSk7IH0KLSAgcmV0dXJuIGd1aWQ7Ci19OworICBFeGFtcGxlCisKKyAgYGBg
amF2YXNjcmlwdAorICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIGhh
c1Rvb01hbnlCYW5hbmFzOiBFbWJlci5jb21wdXRlZC5ndCgnbnVtQmFuYW5hcycsIDEwKQorICB9
KTsKKyAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICBoYW1zdGVyLmdldCgnaGFz
VG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKKyAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAz
KTsKKyAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIGZhbHNlCisgIGhhbXN0
ZXIuc2V0KCdudW1CYW5hbmFzJywgMTEpOworICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFu
YXMnKTsgLy8gdHJ1ZQorICBgYGAKKworICBAbWV0aG9kIGNvbXB1dGVkLmd0CisgIEBmb3IgRW1i
ZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcGFyYW0ge051bWJlcn0gdmFs
dWUKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkg
d2hpY2ggcmV0dXJucyB0cnVlIGlmCisgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkg
aXMgZ3JlYXRlciB0aGVuIGdpdmVuIHZhbHVlLgorKi8KK3JlZ2lzdGVyQ29tcHV0ZWQoJ2d0Jywg
ZnVuY3Rpb24oZGVwZW5kZW50S2V5LCB2YWx1ZSkgeworICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVu
ZGVudEtleSkgPiB2YWx1ZTsKK30pOwogCiAvKioKLSAgQ2FuY2VscyBhIHNjaGVkdWxlZCBpdGVt
LiBNdXN0IGJlIGEgdmFsdWUgcmV0dXJuZWQgYnkgYEVtYmVyLnJ1bi5sYXRlcigpYCwKLSAgYEVt
YmVyLnJ1bi5vbmNlKClgLCBvciBgRW1iZXIucnVuLm5leHQoKWAuCisgIEEgY29tcHV0ZWQgcHJv
cGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0
eQorICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLgorCisg
IEV4YW1wbGUKIAogICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBydW5OZXh0ID0gRW1iZXIucnVuLm5l
eHQobXlDb250ZXh0LCBmdW5jdGlvbigpewotICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisg
IHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgaGFzVG9vTWFueUJhbmFu
YXM6IEVtYmVyLmNvbXB1dGVkLmd0ZSgnbnVtQmFuYW5hcycsIDEwKQogICB9KTsKLSAgRW1iZXIu
cnVuLmNhbmNlbChydW5OZXh0KTsKKyAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwor
ICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKKyAgaGFtc3Rlci5z
ZXQoJ251bUJhbmFuYXMnLCAzKTsKKyAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7
IC8vIGZhbHNlCisgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMTApOworICBoYW1zdGVyLmdl
dCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gdHJ1ZQorICBgYGAKIAotICB2YXIgcnVuTGF0ZXIg
PSBFbWJlci5ydW4ubGF0ZXIobXlDb250ZXh0LCBmdW5jdGlvbigpewotICAgIC8vIHdpbGwgbm90
IGJlIGV4ZWN1dGVkCi0gIH0sIDUwMCk7Ci0gIEVtYmVyLnJ1bi5jYW5jZWwocnVuTGF0ZXIpOwor
ICBAbWV0aG9kIGNvbXB1dGVkLmd0ZQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBk
ZXBlbmRlbnRLZXkKKyAgQHBhcmFtIHtOdW1iZXJ9IHZhbHVlCisgIEByZXR1cm4ge0VtYmVyLkNv
bXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgor
ICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhl
biBnaXZlbiB2YWx1ZS4KKyovCityZWdpc3RlckNvbXB1dGVkKCdndGUnLCBmdW5jdGlvbihkZXBl
bmRlbnRLZXksIHZhbHVlKSB7CisgIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA+PSB2
YWx1ZTsKK30pOwogCi0gIHZhciBydW5PbmNlID0gRW1iZXIucnVuLm9uY2UobXlDb250ZXh0LCBm
dW5jdGlvbigpewotICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisvKioKKyAgQSBjb21wdXRl
ZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHBy
b3BlcnR5CisgIGlzIGxlc3MgdGhhbiB0aGUgcHJvdmlkZWQgdmFsdWUuCisKKyAgRXhhbXBsZQor
CisgIGBgYGphdmFzY3JpcHQKKyAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
KyAgICBuZWVkc01vcmVCYW5hbmFzOiBFbWJlci5jb21wdXRlZC5sdCgnbnVtQmFuYW5hcycsIDMp
CiAgIH0pOwotICBFbWJlci5ydW4uY2FuY2VsKHJ1bk9uY2UpOworICB2YXIgaGFtc3RlciA9IEhh
bXN0ZXIuY3JlYXRlKCk7CisgIGhhbXN0ZXIuZ2V0KCduZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRy
dWUKKyAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKKyAgaGFtc3Rlci5nZXQoJ25lZWRz
TW9yZUJhbmFuYXMnKTsgLy8gZmFsc2UKKyAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAyKTsK
KyAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQogICBgYGAKIAotICBA
bWV0aG9kIGNhbmNlbAotICBAcGFyYW0ge09iamVjdH0gdGltZXIgVGltZXIgb2JqZWN0IHRvIGNh
bmNlbAotICBAcmV0dXJuIHt2b2lkfQorICBAbWV0aG9kIGNvbXB1dGVkLmx0CisgIEBmb3IgRW1i
ZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcGFyYW0ge051bWJlcn0gdmFs
dWUKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkg
d2hpY2ggcmV0dXJucyB0cnVlIGlmCisgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkg
aXMgbGVzcyB0aGVuIGdpdmVuIHZhbHVlLgogKi8KLUVtYmVyLnJ1bi5jYW5jZWwgPSBmdW5jdGlv
bih0aW1lcikgewotICBkZWxldGUgdGltZXJzW3RpbWVyXTsKLX07CityZWdpc3RlckNvbXB1dGVk
KCdsdCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKKyAgcmV0dXJuIGdldCh0aGlz
LCBkZXBlbmRlbnRLZXkpIDwgdmFsdWU7Cit9KTsKIAotfSkoKTsKKy8qKgorICBBIGNvbXB1dGVk
IHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJv
cGVydHkKKyAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4KIAor
ICBFeGFtcGxlCiAKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVj
dC5leHRlbmQoeworICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmx0ZSgnbnVt
QmFuYW5hcycsIDMpCisgIH0pOworICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Cisg
IGhhbXN0ZXIuZ2V0KCduZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRydWUKKyAgaGFtc3Rlci5zZXQo
J251bUJhbmFuYXMnLCA1KTsKKyAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8g
ZmFsc2UKKyAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKKyAgaGFtc3Rlci5nZXQoJ25l
ZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQorICBgYGAKIAotKGZ1bmN0aW9uKCkgewotLy8gRW1i
ZXIuTG9nZ2VyCi0vLyBnZXQsIHNldCwgdHJ5U2V0Ci0vLyBndWlkRm9yLCBpc0FycmF5LCBtZXRh
Ci0vLyBhZGRPYnNlcnZlciwgcmVtb3ZlT2JzZXJ2ZXIKLS8vIEVtYmVyLnJ1bi5zY2hlZHVsZQot
LyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCisgIEBtZXRob2QgY29tcHV0ZWQubHRlCisgIEBmb3Ig
RW1iZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcGFyYW0ge051bWJlcn0g
dmFsdWUKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVy
dHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCisgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVy
dHkgaXMgbGVzcyBvciBlcXVhbCB0aGVuIGdpdmVuIHZhbHVlLgogKi8KLQotLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQ09O
U1RBTlRTCi0vLworcmVnaXN0ZXJDb21wdXRlZCgnbHRlJywgZnVuY3Rpb24oZGVwZW5kZW50S2V5
LCB2YWx1ZSkgeworICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkgPD0gdmFsdWU7Cit9
KTsKIAogLyoqCi0gIERlYnVnIHBhcmFtZXRlciB5b3UgY2FuIHR1cm4gb24uIFRoaXMgd2lsbCBs
b2cgYWxsIGJpbmRpbmdzIHRoYXQgZmlyZSB0bwotICB0aGUgY29uc29sZS4gVGhpcyBzaG91bGQg
YmUgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiBOb3RlIHRoYXQgeW91Ci0gIGNhbiBhbHNv
IGVuYWJsZSB0aGlzIGZyb20gdGhlIGNvbnNvbGUgb3IgdGVtcG9yYXJpbHkuCisgIEEgY29tcHV0
ZWQgcHJvcGVydHkgdGhhdCBwZXJmb3JtcyBhIGxvZ2ljYWwgYGFuZGAgb24gdGhlCisgIG9yaWdp
bmFsIHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0aWVzLgogCi0gIEBw
cm9wZXJ0eSBMT0dfQklORElOR1MKKyAgRXhhbXBsZQorCisgIGBgYGphdmFzY3JpcHQKKyAgdmFy
IEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICByZWFkeUZvckNhbXA6IEVtYmVy
LmNvbXB1dGVkLmFuZCgnaGFzVGVudCcsICdoYXNCYWNrcGFjaycpCisgIH0pOworICB2YXIgaGFt
c3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIGhhbXN0ZXIuZ2V0KCdyZWFkeUZvckNhbXAnKTsg
Ly8gZmFsc2UKKyAgaGFtc3Rlci5zZXQoJ2hhc1RlbnQnLCB0cnVlKTsKKyAgaGFtc3Rlci5nZXQo
J3JlYWR5Rm9yQ2FtcCcpOyAvLyBmYWxzZQorICBoYW1zdGVyLnNldCgnaGFzQmFja3BhY2snLCB0
cnVlKTsKKyAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyB0cnVlCisgIGBgYAorCisg
IEBtZXRob2QgY29tcHV0ZWQuYW5kCiAgIEBmb3IgRW1iZXIKLSAgQHR5cGUgQm9vbGVhbgotICBA
ZGVmYXVsdCBmYWxzZQorICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICBAcmV0dXJu
IHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBwZXJmb3Jt
cworICBhIGxvZ2ljYWwgYGFuZGAgb24gdGhlIHZhbHVlcyBvZiBhbGwgdGhlIG9yaWdpbmFsIHZh
bHVlcyBmb3IgcHJvcGVydGllcy4KICovCi1FbWJlci5MT0dfQklORElOR1MgPSBmYWxzZSB8fCAh
IUVtYmVyLkVOVi5MT0dfQklORElOR1M7Ci0KLXZhciBnZXQgICAgID0gRW1iZXIuZ2V0LAotICAg
IHNldCAgICAgPSBFbWJlci5zZXQsCi0gICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAg
aXNHbG9iYWxQYXRoID0gRW1iZXIuaXNHbG9iYWxQYXRoOworcmVnaXN0ZXJDb21wdXRlZFdpdGhQ
cm9wZXJ0aWVzKCdhbmQnLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7CisgIGZvciAodmFyIGtleSBp
biBwcm9wZXJ0aWVzKSB7CisgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAm
JiAhcHJvcGVydGllc1trZXldKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cisg
IHJldHVybiB0cnVlOworfSk7CiAKKy8qKgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBl
cmZvcm1zIGEgbG9naWNhbCBgb3JgIG9uIHRoZQorICBvcmlnaW5hbCB2YWx1ZXMgZm9yIHRoZSBw
cm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGllcy4KIAotZnVuY3Rpb24gZ2V0V2l0aEdsb2JhbHMo
b2JqLCBwYXRoKSB7Ci0gIHJldHVybiBnZXQoaXNHbG9iYWxQYXRoKHBhdGgpID8gRW1iZXIubG9v
a3VwIDogb2JqLCBwYXRoKTsKLX0KKyAgRXhhbXBsZQogCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBCSU5ESU5HCi0vLwor
ICBgYGBqYXZhc2NyaXB0CisgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Cisg
ICAgcmVhZHlGb3JSYWluOiBFbWJlci5jb21wdXRlZC5vcignaGFzSmFja2V0JywgJ2hhc1VtYnJl
bGxhJykKKyAgfSk7CisgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgaGFtc3Rl
ci5nZXQoJ3JlYWR5Rm9yUmFpbicpOyAvLyBmYWxzZQorICBoYW1zdGVyLnNldCgnaGFzSmFja2V0
JywgdHJ1ZSk7CisgIGhhbXN0ZXIuZ2V0KCdyZWFkeUZvclJhaW4nKTsgLy8gdHJ1ZQorICBgYGAK
IAotdmFyIEJpbmRpbmcgPSBmdW5jdGlvbih0b1BhdGgsIGZyb21QYXRoKSB7Ci0gIHRoaXMuX2Rp
cmVjdGlvbiA9ICdmd2QnOwotICB0aGlzLl9mcm9tID0gZnJvbVBhdGg7Ci0gIHRoaXMuX3RvICAg
PSB0b1BhdGg7Ci0gIHRoaXMuX2RpcmVjdGlvbk1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKTsKLX07
CisgIEBtZXRob2QgY29tcHV0ZWQub3IKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30g
ZGVwZW5kZW50S2V5KgorICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRl
ZCBwcm9wZXJ0eSB3aGljaCBwZXJmb3JtcworICBhIGxvZ2ljYWwgYG9yYCBvbiB0aGUgdmFsdWVz
IG9mIGFsbCB0aGUgb3JpZ2luYWwgdmFsdWVzIGZvciBwcm9wZXJ0aWVzLgorKi8KK3JlZ2lzdGVy
Q29tcHV0ZWRXaXRoUHJvcGVydGllcygnb3InLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7CisgIGZv
ciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CisgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJv
cGVydHkoa2V5KSAmJiBwcm9wZXJ0aWVzW2tleV0pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9KTsKIAogLyoqCi1AY2xhc3MgQmluZGluZwotQG5h
bWVzcGFjZSBFbWJlcgotKi8KKyAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhl
IGZpcnN0IHRydXRoeSB2YWx1ZQorICBmcm9tIGEgbGlzdCBvZiBkZXBlbmRlbnQgcHJvcGVydGll
cy4KIAotQmluZGluZy5wcm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIFRoaXMgY29waWVzIHRoZSBC
aW5kaW5nIHNvIGl0IGNhbiBiZSBjb25uZWN0ZWQgdG8gYW5vdGhlciBvYmplY3QuCisgIEV4YW1w
bGUKIAotICAgIEBtZXRob2QgY29weQotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9Ci0gICov
Ci0gIGNvcHk6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgY29weSA9IG5ldyBCaW5kaW5nKHRoaXMu
X3RvLCB0aGlzLl9mcm9tKTsKLSAgICBpZiAodGhpcy5fb25lV2F5KSB7IGNvcHkuX29uZVdheSA9
IHRydWU7IH0KLSAgICByZXR1cm4gY29weTsKLSAgfSwKKyAgYGBgamF2YXNjcmlwdAorICB2YXIg
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIGhhc0Nsb3RoZXM6IEVtYmVyLmNv
bXB1dGVkLmFueSgnaGF0JywgJ3NoaXJ0JykKKyAgfSk7CisgIHZhciBoYW1zdGVyID0gSGFtc3Rl
ci5jcmVhdGUoKTsKKyAgaGFtc3Rlci5nZXQoJ2hhc0Nsb3RoZXMnKTsgLy8gbnVsbAorICBoYW1z
dGVyLnNldCgnc2hpcnQnLCAnSGF3YWlpYW4gU2hpcnQnKTsKKyAgaGFtc3Rlci5nZXQoJ2hhc0Ns
b3RoZXMnKTsgLy8gJ0hhd2FpaWFuIFNoaXJ0JworICBgYGAKIAotICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIENPTkZJ
RwotICAvLworICBAbWV0aG9kIGNvbXB1dGVkLmFueQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkqCisgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9
IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMKKyAgdGhlIGZpcnN0IHRydXRoeSB2YWx1
ZSBvZiBnaXZlbiBsaXN0IG9mIHByb3BlcnRpZXMuCisqLworcmVnaXN0ZXJDb21wdXRlZFdpdGhQ
cm9wZXJ0aWVzKCdhbnknLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7CisgIGZvciAodmFyIGtleSBp
biBwcm9wZXJ0aWVzKSB7CisgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAm
JiBwcm9wZXJ0aWVzW2tleV0pIHsKKyAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2tleV07CisgICAg
fQorICB9CisgIHJldHVybiBudWxsOworfSk7CiAKLSAgLyoqCi0gICAgVGhpcyB3aWxsIHNldCBg
ZnJvbWAgcHJvcGVydHkgcGF0aCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJdCB3aWxsIG5vdAot
ICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4gYWN0dWFsIG9i
amVjdCB1bnRpbCB5b3UKLSAgICBjb25uZWN0IHRoZSBiaW5kaW5nLgorLyoqCisgIEEgY29tcHV0
ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRoZSBhcnJheSBvZiB2YWx1ZXMKKyAgZm9yIHRoZSBw
cm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGllcy4KIAotICAgIFRoZSBiaW5kaW5nIHdpbGwgc2Vh
cmNoIGZvciB0aGUgcHJvcGVydHkgcGF0aCBzdGFydGluZyBhdCB0aGUgcm9vdCBvYmplY3QKLSAg
ICB5b3UgcGFzcyB3aGVuIHlvdSBgY29ubmVjdCgpYCB0aGUgYmluZGluZy4gSXQgZm9sbG93cyB0
aGUgc2FtZSBydWxlcyBhcwotICAgIGBnZXQoKWAgLSBzZWUgdGhhdCBtZXRob2QgZm9yIG1vcmUg
aW5mb3JtYXRpb24uCisgIEV4YW1wbGUKIAotICAgIEBtZXRob2QgZnJvbQotICAgIEBwYXJhbSB7
U3RyaW5nfSBwcm9wZXJ0eVBhdGggdGhlIHByb3BlcnR5IHBhdGggdG8gY29ubmVjdCB0bwotICAg
IEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBmcm9tOiBmdW5jdGlvbihw
YXRoKSB7Ci0gICAgdGhpcy5fZnJvbSA9IHBhdGg7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisg
IGBgYGphdmFzY3JpcHQKKyAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAg
ICBjbG90aGVzOiBFbWJlci5jb21wdXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQnKQorICB9KTsK
KyAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICBoYW1zdGVyLmdldCgnY2xvdGhl
cycpOyAvLyBbbnVsbCwgbnVsbF0KKyAgaGFtc3Rlci5zZXQoJ2hhdCcsICdDYW1wIEhhdCcpOwor
ICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGlydCcpOworICBoYW1zdGVyLmdldCgnY2xv
dGhlcycpOyAvLyBbJ0NhbXAgSGF0JywgJ0NhbXAgU2hpcnQnXQorICBgYGAKIAotICAvKioKLSAg
ICBUaGlzIHdpbGwgc2V0IHRoZSBgdG9gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2
YWx1ZS4gSXQgd2lsbCBub3QKLSAgICBhdHRlbXB0IHRvIHJlc29sdmUgdGhpcyBwcm9wZXJ0eSBw
YXRoIHRvIGFuIGFjdHVhbCBvYmplY3QgdW50aWwgeW91Ci0gICAgY29ubmVjdCB0aGUgYmluZGlu
Zy4KKyAgQG1ldGhvZCBjb21wdXRlZC5jb2xsZWN0CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtT
dHJpbmd9IGRlcGVuZGVudEtleSoKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0g
Y29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggbWFwcworICB2YWx1ZXMgb2YgYWxsIHBhc3NlZCBwcm9w
ZXJ0aWVzIGluIHRvIGFuIGFycmF5LgorKi8KK3JlZ2lzdGVyQ29tcHV0ZWRXaXRoUHJvcGVydGll
cygnY29sbGVjdCcsIGZ1bmN0aW9uKHByb3BlcnRpZXMpIHsKKyAgdmFyIHJlcyA9IFtdOworICBm
b3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgeworICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blBy
b3BlcnR5KGtleSkpIHsKKyAgICAgIGlmIChFbWJlci5pc05vbmUocHJvcGVydGllc1trZXldKSkg
eworICAgICAgICByZXMucHVzaChudWxsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy5w
dXNoKHByb3BlcnRpZXNba2V5XSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXM7
Cit9KTsKIAotICAgIFRoZSBiaW5kaW5nIHdpbGwgc2VhcmNoIGZvciB0aGUgcHJvcGVydHkgcGF0
aCBzdGFydGluZyBhdCB0aGUgcm9vdCBvYmplY3QKLSAgICB5b3UgcGFzcyB3aGVuIHlvdSBgY29u
bmVjdCgpYCB0aGUgYmluZGluZy4gSXQgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcwotICAgIGBn
ZXQoKWAgLSBzZWUgdGhhdCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisvKioKKyAgQ3Jl
YXRlcyBhIG5ldyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIHByb3BlcnR5
CisgIG9uIGFuIG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBi
ZWhhdmUgYXMKKyAgdGhvdWdoIHRoZXkgd2VyZSBjYWxsZWQgb24gdGhlIG9yaWdpbmFsIHByb3Bl
cnR5LgogCi0gICAgQG1ldGhvZCB0bwotICAgIEBwYXJhbSB7U3RyaW5nfFR1cGxlfSBwcm9wZXJ0
eVBhdGggQSBwcm9wZXJ0eSBwYXRoIG9yIHR1cGxlCi0gICAgQHJldHVybiB7RW1iZXIuQmluZGlu
Z30gYHRoaXNgCi0gICovCi0gIHRvOiBmdW5jdGlvbihwYXRoKSB7Ci0gICAgdGhpcy5fdG8gPSBw
YXRoOwotICAgIHJldHVybiB0aGlzOwotICB9LAorICBgYGBqYXZhc2NyaXB0CisgIFBlcnNvbiA9
IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIG5hbWU6ICdBbGV4IE1hdGNobmVlcicsCisgICAg
bm9tZW46IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCduYW1lJykKKyAgfSk7CiAKLSAgLyoqCi0gICAg
Q29uZmlndXJlcyB0aGUgYmluZGluZyBhcyBvbmUgd2F5LiBBIG9uZS13YXkgYmluZGluZyB3aWxs
IHJlbGF5IGNoYW5nZXMKLSAgICBvbiB0aGUgYGZyb21gIHNpZGUgdG8gdGhlIGB0b2Agc2lkZSwg
YnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gVGhpcwotICAgIG1lYW5zIHRoYXQgaWYgeW91
IGNoYW5nZSB0aGUgYHRvYCBzaWRlIGRpcmVjdGx5LCB0aGUgYGZyb21gIHNpZGUgbWF5IGhhdmUK
LSAgICBhIGRpZmZlcmVudCB2YWx1ZS4KKyAgYWxleCA9IFBlcnNvbi5jcmVhdGUoKTsKKyAgYWxl
eC5nZXQoJ25vbWVuJyk7IC8vICdBbGV4IE1hdGNobmVlcicKKyAgYWxleC5nZXQoJ25hbWUnKTsg
IC8vICdBbGV4IE1hdGNobmVlcicKIAotICAgIEBtZXRob2Qgb25lV2F5Ci0gICAgQHJldHVybiB7
RW1iZXIuQmluZGluZ30gYHRoaXNgCi0gICovCi0gIG9uZVdheTogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5fb25lV2F5ID0gdHJ1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgYWxleC5zZXQo
J25vbWVuJywgJ0BtYWNodHknKTsKKyAgYWxleC5nZXQoJ25hbWUnKTsgIC8vICdAbWFjaHR5Jwor
ICBgYGAKKyAgQG1ldGhvZCBjb21wdXRlZC5hbGlhcworICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0g
Y29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY3JlYXRlcyBhbgorICBhbGlhcyB0byB0aGUgb3JpZ2lu
YWwgdmFsdWUgZm9yIHByb3BlcnR5LgorKi8KK0VtYmVyLmNvbXB1dGVkLmFsaWFzID0gZnVuY3Rp
b24oZGVwZW5kZW50S2V5KSB7CisgIHJldHVybiBFbWJlci5jb21wdXRlZChkZXBlbmRlbnRLZXks
IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsK
KyAgICAgIHNldCh0aGlzLCBkZXBlbmRlbnRLZXksIHZhbHVlKTsKKyAgICAgIHJldHVybiB2YWx1
ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwor
ICAgIH0KKyAgfSk7Cit9OwogCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb25l
V2F5ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXldJyA6ICcnOwotICAgIHJldHVybiAiRW1iZXIu
QmluZGluZzwiICsgZ3VpZEZvcih0aGlzKSArICI+KCIgKyB0aGlzLl9mcm9tICsgIiAtPiAiICsg
dGhpcy5fdG8gKyAiKSIgKyBvbmVXYXk7Ci0gIH0sCisvKioKKyAgV2hlcmUgYGNvbXB1dGVkLmFs
aWFzYCBhbGlhc2VzIGBnZXRgIGFuZCBgc2V0YCwgYW5kIGFsbG93cyBmb3IgYmlkaXJlY3Rpb25h
bAorICBkYXRhIGZsb3csIGBjb21wdXRlZC5vbmVXYXlgIG9ubHkgcHJvdmlkZXMgYW4gYWxpYXNl
ZCBgZ2V0YC4gVGhlIGBzZXRgIHdpbGwKKyAgbm90IG11dGF0ZSB0aGUgdXBzdHJlYW0gcHJvcGVy
dHksIHJhdGhlciBjYXVzZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkgdG8KKyAgYmVjb21lIHRoZSB2
YWx1ZSBzZXQuIFRoaXMgY2F1c2VzIHRoZSBkb3duc3RyZWFtIHByb3BlcnR5IHRvIHBlcm1lbnRh
bnRseQorICBkaXZlcmdlIGZyb20gdGhlIHVwc3RyZWFtIHByb3BlcnR5LgogCi0gIC8vIC4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAg
Ly8gQ09OTkVDVCBBTkQgU1lOQwotICAvLworICBFeGFtcGxlCiAKLSAgLyoqCi0gICAgQXR0ZW1w
dHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVjZWl2
ZSBhbmQgcmVsYXkKLSAgICBjaGFuZ2VzLiBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4Y2Vw
dGlvbiBpZiB5b3UgaGF2ZSBub3Qgc2V0IHRoZQotICAgIGZyb20vdG8gcHJvcGVydGllcyB5ZXQu
CisgIGBgYGphdmFzY3JpcHQKKyAgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIGZp
cnN0TmFtZTogbnVsbCwKKyAgICBsYXN0TmFtZTogbnVsbCwKKyAgICBuaWNrTmFtZTogRW1iZXIu
Y29tcHV0ZWQub25lV2F5KCdmaXJzdE5hbWUnKQorICB9KTsKIAotICAgIEBtZXRob2QgY29ubmVj
dAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIHJvb3Qgb2JqZWN0IGZvciB0aGlzIGJpbmRp
bmcuCi0gICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCi0gICovCi0gIGNvbm5lY3Q6
IGZ1bmN0aW9uKG9iaikgewotICAgIEVtYmVyLmFzc2VydCgnTXVzdCBwYXNzIGEgdmFsaWQgb2Jq
ZWN0IHRvIEVtYmVyLkJpbmRpbmcuY29ubmVjdCgpJywgISFvYmopOworICB1c2VyID0gVXNlci5j
cmVhdGUoeworICAgIGZpcnN0TmFtZTogJ1RlZGR5JywKKyAgICBsYXN0TmFtZTogICdaZWVubnkn
CisgIH0pOwogCi0gICAgdmFyIGZyb21QYXRoID0gdGhpcy5fZnJvbSwgdG9QYXRoID0gdGhpcy5f
dG87Ci0gICAgRW1iZXIudHJ5U2V0KG9iaiwgdG9QYXRoLCBnZXRXaXRoR2xvYmFscyhvYmosIGZy
b21QYXRoKSk7CisgIHVzZXIuZ2V0KCduaWNrTmFtZScpOworICAjICdUZWRkeScKIAotICAgIC8v
IGFkZCBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGJp
bmRpbmcgc2hvdWxkIGJlIHVwZGF0ZWQKLSAgICBFbWJlci5hZGRPYnNlcnZlcihvYmosIGZyb21Q
YXRoLCB0aGlzLCB0aGlzLmZyb21EaWRDaGFuZ2UpOworICB1c2VyLnNldCgnbmlja05hbWUnLCAn
VGVkZHlCZWFyJyk7CisgICMgJ1RlZGR5QmVhcicKIAotICAgIC8vIGlmIHRoZSBiaW5kaW5nIGlz
IGEgdHdvLXdheSBiaW5kaW5nLCBhbHNvIHNldCB1cCBhbiBvYnNlcnZlciBvbiB0aGUgdGFyZ2V0
Ci0gICAgaWYgKCF0aGlzLl9vbmVXYXkpIHsgRW1iZXIuYWRkT2JzZXJ2ZXIob2JqLCB0b1BhdGgs
IHRoaXMsIHRoaXMudG9EaWRDaGFuZ2UpOyB9CisgIHVzZXIuZ2V0KCdmaXJzdE5hbWUnKTsKKyAg
IyAnVGVkZHknCisgIGBgYAogCi0gICAgdGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOworICBAbWV0
aG9kIGNvbXB1dGVkLm9uZVdheQorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBkZXBl
bmRlbnRLZXkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJv
cGVydHkgd2hpY2ggY3JlYXRlcyBhCisgIG9uZSB3YXkgY29tcHV0ZWQgcHJvcGVydHkgdG8gdGhl
IG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKyovCitFbWJlci5jb21wdXRlZC5vbmVXYXkg
PSBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVu
ZGVudEtleSwgZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkp
OworICB9KTsKK307CiAKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKIAotICAvKioKLSAgICBEaXNj
b25uZWN0cyB0aGUgYmluZGluZyBpbnN0YW5jZS4gQ2hhbmdlcyB3aWxsIG5vIGxvbmdlciBiZSBy
ZWxheWVkLiBZb3UKLSAgICB3aWxsIG5vdCB1c3VhbGx5IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhv
ZC4KKy8qKgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgYWN0cyBsaWtlIGEgc3RhbmRhcmQg
Z2V0dGVyIGFuZCBzZXR0ZXIsCisgIGJ1dCByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgcHJvdmlk
ZWQgYGRlZmF1bHRQYXRoYCBpZiB0aGUKKyAgcHJvcGVydHkgaXRzZWxmIGhhcyBub3QgYmVlbiBz
ZXQgdG8gYSB2YWx1ZQogCi0gICAgQG1ldGhvZCBkaXNjb25uZWN0Ci0gICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgcm9vdCBvYmplY3QgeW91IHBhc3NlZCB3aGVuIGNvbm5lY3RpbmcgdGhlIGJp
bmRpbmcuCi0gICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCi0gICovCi0gIGRpc2Nv
bm5lY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIEVtYmVyLmFzc2VydCgnTXVzdCBwYXNzIGEgdmFs
aWQgb2JqZWN0IHRvIEVtYmVyLkJpbmRpbmcuZGlzY29ubmVjdCgpJywgISFvYmopOworICBFeGFt
cGxlCiAKLSAgICB2YXIgdHdvV2F5ID0gIXRoaXMuX29uZVdheTsKKyAgYGBgamF2YXNjcmlwdAor
ICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIHdpc2hMaXN0OiBFbWJl
ci5jb21wdXRlZC5kZWZhdWx0VG8oJ2Zhdm9yaXRlRm9vZCcpCisgIH0pOworICB2YXIgaGFtc3Rl
ciA9IEhhbXN0ZXIuY3JlYXRlKHtmYXZvcml0ZUZvb2Q6ICdCYW5hbmEnfSk7CisgIGhhbXN0ZXIu
Z2V0KCd3aXNoTGlzdCcpOyAvLyAnQmFuYW5hJworICBoYW1zdGVyLnNldCgnd2lzaExpc3QnLCAn
TW9yZSBVbml0IFRlc3RzJyk7CisgIGhhbXN0ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnTW9yZSBV
bml0IFRlc3RzJworICBoYW1zdGVyLmdldCgnZmF2b3JpdGVGb29kJyk7IC8vICdCYW5hbmEnCisg
IGBgYAogCi0gICAgLy8gcmVtb3ZlIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3Qgc28gd2UncmUg
bm8gbG9uZ2VyIG5vdGlmaWVkIG9mCi0gICAgLy8gY2hhbmdlcyB0aGF0IHNob3VsZCB1cGRhdGUg
YmluZGluZ3MuCi0gICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIob2JqLCB0aGlzLl9mcm9tLCB0aGlz
LCB0aGlzLmZyb21EaWRDaGFuZ2UpOworICBAbWV0aG9kIGNvbXB1dGVkLmRlZmF1bHRUbworICBA
Zm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0UGF0aAorICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBhY3RzIGxpa2UKKyAg
YSBzdGFuZGFyZCBnZXR0ZXIgYW5kIHNldHRlciwgYnV0IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBm
cm9tIGBkZWZhdWx0UGF0aGAuCisqLworRW1iZXIuY29tcHV0ZWQuZGVmYXVsdFRvID0gZnVuY3Rp
b24oZGVmYXVsdFBhdGgpIHsKKyAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwg
bmV3VmFsdWUsIGNhY2hlZFZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEp
IHsKKyAgICAgIHJldHVybiBjYWNoZWRWYWx1ZSAhPSBudWxsID8gY2FjaGVkVmFsdWUgOiBnZXQo
dGhpcywgZGVmYXVsdFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gbmV3VmFsdWUgIT0gbnVsbCA/
IG5ld1ZhbHVlIDogZ2V0KHRoaXMsIGRlZmF1bHRQYXRoKTsKKyAgfSk7Cit9OwogCi0gICAgLy8g
aWYgdGhlIGJpbmRpbmcgaXMgdHdvLXdheSwgcmVtb3ZlIHRoZSBvYnNlcnZlciBmcm9tIHRoZSB0
YXJnZXQgYXMgd2VsbAotICAgIGlmICh0d29XYXkpIHsgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIob2Jq
LCB0aGlzLl90bywgdGhpcywgdGhpcy50b0RpZENoYW5nZSk7IH0KIAotICAgIHRoaXMuX3JlYWR5
VG9TeW5jID0gZmFsc2U7IC8vIGRpc2FibGUgc2NoZWR1bGVkIHN5bmNzLi4uCi0gICAgcmV0dXJu
IHRoaXM7Ci0gIH0sCit9KSgpOwogCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gUFJJVkFURQotICAvLwogCi0gIC8q
IGNhbGxlZCB3aGVuIHRoZSBmcm9tIHNpZGUgY2hhbmdlcyAqLwotICBmcm9tRGlkQ2hhbmdlOiBm
dW5jdGlvbih0YXJnZXQpIHsKLSAgICB0aGlzLl9zY2hlZHVsZVN5bmModGFyZ2V0LCAnZndkJyk7
Ci0gIH0sCiAKLSAgLyogY2FsbGVkIHdoZW4gdGhlIHRvIHNpZGUgY2hhbmdlcyAqLwotICB0b0Rp
ZENoYW5nZTogZnVuY3Rpb24odGFyZ2V0KSB7Ci0gICAgdGhpcy5fc2NoZWR1bGVTeW5jKHRhcmdl
dCwgJ2JhY2snKTsKLSAgfSwKKyhmdW5jdGlvbigpIHsKKy8vIEVtYmVyLnRyeUZpbmFsbHkKKy8q
KgorQG1vZHVsZSBlbWJlci1tZXRhbAorKi8KIAotICBfc2NoZWR1bGVTeW5jOiBmdW5jdGlvbihv
YmosIGRpcikgewotICAgIHZhciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7Ci0g
ICAgdmFyIGV4aXN0aW5nRGlyID0gZGlyZWN0aW9uTWFwLmdldChvYmopOwordmFyIEFGVEVSX09C
U0VSVkVSUyA9ICc6Y2hhbmdlJywKKyAgICBCRUZPUkVfT0JTRVJWRVJTID0gJzpiZWZvcmUnOwog
Ci0gICAgLy8gaWYgd2UgaGF2ZW4ndCBzY2hlZHVsZWQgdGhlIGJpbmRpbmcgeWV0LCBzY2hlZHVs
ZSBpdAotICAgIGlmICghZXhpc3RpbmdEaXIpIHsKLSAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgn
c3luYycsIHRoaXMsIHRoaXMuX3N5bmMsIG9iaik7Ci0gICAgICBkaXJlY3Rpb25NYXAuc2V0KG9i
aiwgZGlyKTsKLSAgICB9CitmdW5jdGlvbiBjaGFuZ2VFdmVudChrZXlOYW1lKSB7CisgIHJldHVy
biBrZXlOYW1lK0FGVEVSX09CU0VSVkVSUzsKK30KIAotICAgIC8vIElmIGJvdGggYSAnYmFjaycg
YW5kICdmd2QnIHN5bmMgaGF2ZSBiZWVuIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBvYmplY3QsCi0g
ICAgLy8gZGVmYXVsdCB0byBhICdmd2QnIHN5bmMgc28gdGhhdCBpdCByZW1haW5zIGRldGVybWlu
aXN0aWMuCi0gICAgaWYgKGV4aXN0aW5nRGlyID09PSAnYmFjaycgJiYgZGlyID09PSAnZndkJykg
ewotICAgICAgZGlyZWN0aW9uTWFwLnNldChvYmosICdmd2QnKTsKLSAgICB9Ci0gIH0sCitmdW5j
dGlvbiBiZWZvcmVFdmVudChrZXlOYW1lKSB7CisgIHJldHVybiBrZXlOYW1lK0JFRk9SRV9PQlNF
UlZFUlM7Cit9CiAKLSAgX3N5bmM6IGZ1bmN0aW9uKG9iaikgewotICAgIHZhciBsb2cgPSBFbWJl
ci5MT0dfQklORElOR1M7CisvKioKKyAgQG1ldGhvZCBhZGRPYnNlcnZlcgorICBAcGFyYW0gb2Jq
CisgIEBwYXJhbSB7U3RyaW5nfSBwYXRoCisgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJn
ZXRPck1ldGhvZAorICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KKyovCitFbWJl
ci5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Cisg
IEVtYmVyLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhv
ZCk7CisgIEVtYmVyLndhdGNoKG9iaiwgX3BhdGgpOwogCi0gICAgLy8gZG9uJ3Qgc3luY2hyb25p
emUgZGVzdHJveWVkIG9iamVjdHMgb3IgZGlzY29ubmVjdGVkIGJpbmRpbmdzCi0gICAgaWYgKG9i
ai5pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsgcmV0dXJuOyB9CisgIHJldHVy
biB0aGlzOworfTsKIAotICAgIC8vIGdldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBiaW5kaW5nIGZv
ciB0aGUgb2JqZWN0IHdlIGFyZQotICAgIC8vIHN5bmNocm9uaXppbmcgZnJvbQotICAgIHZhciBk
aXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7Ci0gICAgdmFyIGRpcmVjdGlvbiA9IGRp
cmVjdGlvbk1hcC5nZXQob2JqKTsKK0VtYmVyLm9ic2VydmVyc0ZvciA9IGZ1bmN0aW9uKG9iaiwg
cGF0aCkgeworICByZXR1cm4gRW1iZXIubGlzdGVuZXJzRm9yKG9iaiwgY2hhbmdlRXZlbnQocGF0
aCkpOworfTsKIAotICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMu
X3RvOworLyoqCisgIEBtZXRob2QgcmVtb3ZlT2JzZXJ2ZXIKKyAgQHBhcmFtIG9iagorICBAcGFy
YW0ge1N0cmluZ30gcGF0aAorICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRo
b2QKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFttZXRob2RdCisqLworRW1iZXIucmVtb3Zl
T2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIF9wYXRoLCB0YXJnZXQsIG1ldGhvZCkgeworICBFbWJl
ci51bndhdGNoKG9iaiwgX3BhdGgpOworICBFbWJlci5yZW1vdmVMaXN0ZW5lcihvYmosIGNoYW5n
ZUV2ZW50KF9wYXRoKSwgdGFyZ2V0LCBtZXRob2QpOwogCi0gICAgZGlyZWN0aW9uTWFwLnJlbW92
ZShvYmopOworICByZXR1cm4gdGhpczsKK307CiAKLSAgICAvLyBpZiB3ZSdyZSBzeW5jaHJvbml6
aW5nIGZyb20gdGhlIHJlbW90ZSBvYmplY3QuLi4KLSAgICBpZiAoZGlyZWN0aW9uID09PSAnZndk
JykgewotICAgICAgdmFyIGZyb21WYWx1ZSA9IGdldFdpdGhHbG9iYWxzKG9iaiwgdGhpcy5fZnJv
bSk7Ci0gICAgICBpZiAobG9nKSB7Ci0gICAgICAgIEVtYmVyLkxvZ2dlci5sb2coJyAnLCB0aGlz
LnRvU3RyaW5nKCksICctPicsIGZyb21WYWx1ZSwgb2JqKTsKLSAgICAgIH0KLSAgICAgIGlmICh0
aGlzLl9vbmVXYXkpIHsKLSAgICAgICAgRW1iZXIudHJ5U2V0KG9iaiwgdG9QYXRoLCBmcm9tVmFs
dWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRW1iZXIuX3N1c3BlbmRPYnNlcnZlcihvYmos
IHRvUGF0aCwgdGhpcywgdGhpcy50b0RpZENoYW5nZSwgZnVuY3Rpb24gKCkgewotICAgICAgICAg
IEVtYmVyLnRyeVNldChvYmosIHRvUGF0aCwgZnJvbVZhbHVlKTsKLSAgICAgICAgfSk7Ci0gICAg
ICB9Ci0gICAgLy8gaWYgd2UncmUgc3luY2hyb25pemluZyAqdG8qIHRoZSByZW1vdGUgb2JqZWN0
Ci0gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdiYWNrJykgewotICAgICAgdmFyIHRvVmFs
dWUgPSBnZXQob2JqLCB0aGlzLl90byk7Ci0gICAgICBpZiAobG9nKSB7Ci0gICAgICAgIEVtYmVy
LkxvZ2dlci5sb2coJyAnLCB0aGlzLnRvU3RyaW5nKCksICc8LScsIHRvVmFsdWUsIG9iaik7Ci0g
ICAgICB9Ci0gICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgsIHRoaXMs
IHRoaXMuZnJvbURpZENoYW5nZSwgZnVuY3Rpb24gKCkgewotICAgICAgICBFbWJlci50cnlTZXQo
RW1iZXIuaXNHbG9iYWxQYXRoKGZyb21QYXRoKSA/IEVtYmVyLmxvb2t1cCA6IG9iaiwgZnJvbVBh
dGgsIHRvVmFsdWUpOwotICAgICAgfSk7Ci0gICAgfQotICB9CisvKioKKyAgQG1ldGhvZCBhZGRC
ZWZvcmVPYnNlcnZlcgorICBAcGFyYW0gb2JqCisgIEBwYXJhbSB7U3RyaW5nfSBwYXRoCisgIEBw
YXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAorICBAcGFyYW0ge0Z1bmN0aW9u
fFN0cmluZ30gW21ldGhvZF0KKyovCitFbWJlci5hZGRCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9u
KG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7CisgIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwg
YmVmb3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7CisgIEVtYmVyLndhdGNoKG9iaiwg
X3BhdGgpOwogCisgIHJldHVybiB0aGlzOwogfTsKIAotZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVz
KHRvLCBmcm9tKSB7Ci0gIGZvciAodmFyIGtleSBpbiBmcm9tKSB7Ci0gICAgaWYgKGZyb20uaGFz
T3duUHJvcGVydHkoa2V5KSkgewotICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKLSAgICB9Ci0g
IH0KLX0KKy8vIFN1c3BlbmQgb2JzZXJ2ZXIgZHVyaW5nIGNhbGxiYWNrLgorLy8KKy8vIFRoaXMg
c2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgdGFyZ2V0IG9mIHRoZSBvYnNlcnZlcgorLy8gd2hp
bGUgaXQgaXMgc2V0dGluZyB0aGUgb2JzZXJ2ZWQgcGF0aC4KK0VtYmVyLl9zdXNwZW5kQmVmb3Jl
T2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIHBhdGgsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykg
eworICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KHBhdGgp
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOworfTsKIAotbWl4aW5Qcm9wZXJ0aWVzKEJpbmRp
bmcsIHsKK0VtYmVyLl9zdXNwZW5kT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIHBhdGgsIHRhcmdl
dCwgbWV0aG9kLCBjYWxsYmFjaykgeworICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcihv
YmosIGNoYW5nZUV2ZW50KHBhdGgpLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOworfTsKIAot
ICAvKioKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5CaW5kaW5nL2Zyb20ifX17ey9jcm9z
c0xpbmt9fQordmFyIG1hcCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcDsKIAotICAgIEBtZXRo
b2QgZnJvbQotICAgIEBzdGF0aWMKLSAgKi8KLSAgZnJvbTogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IEMgPSB0aGlzLCBiaW5kaW5nID0gbmV3IEMoKTsKLSAgICByZXR1cm4gYmluZGluZy5mcm9tLmFw
cGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7Ci0gIH0sCitFbWJlci5fc3VzcGVuZEJlZm9yZU9ic2Vy
dmVycyA9IGZ1bmN0aW9uKG9iaiwgcGF0aHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewor
ICB2YXIgZXZlbnRzID0gbWFwLmNhbGwocGF0aHMsIGJlZm9yZUV2ZW50KTsKKyAgcmV0dXJuIEVt
YmVyLl9zdXNwZW5kTGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJh
Y2spOworfTsKIAotICAvKioKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5CaW5kaW5nL3Rv
In19e3svY3Jvc3NMaW5rfX0KK0VtYmVyLl9zdXNwZW5kT2JzZXJ2ZXJzID0gZnVuY3Rpb24ob2Jq
LCBwYXRocywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgIHZhciBldmVudHMgPSBtYXAu
Y2FsbChwYXRocywgY2hhbmdlRXZlbnQpOworICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5l
cnMob2JqLCBldmVudHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7Cit9OwogCi0gICAgQG1l
dGhvZCB0bwotICAgIEBzdGF0aWMKLSAgKi8KLSAgdG86IGZ1bmN0aW9uKCkgewotICAgIHZhciBD
ID0gdGhpcywgYmluZGluZyA9IG5ldyBDKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmcudG8uYXBwbHko
YmluZGluZywgYXJndW1lbnRzKTsKLSAgfSwKK0VtYmVyLmJlZm9yZU9ic2VydmVyc0ZvciA9IGZ1
bmN0aW9uKG9iaiwgcGF0aCkgeworICByZXR1cm4gRW1iZXIubGlzdGVuZXJzRm9yKG9iaiwgYmVm
b3JlRXZlbnQocGF0aCkpOworfTsKIAotICAvKioKLSAgICBDcmVhdGVzIGEgbmV3IEJpbmRpbmcg
aW5zdGFuY2UgYW5kIG1ha2VzIGl0IGFwcGx5IGluIGEgc2luZ2xlIGRpcmVjdGlvbi4KLSAgICBB
IG9uZS13YXkgYmluZGluZyB3aWxsIHJlbGF5IGNoYW5nZXMgb24gdGhlIGBmcm9tYCBzaWRlIG9i
amVjdCAoc3VwcGxpZWQKLSAgICBhcyB0aGUgYGZyb21gIGFyZ3VtZW50KSB0aGUgYHRvYCBzaWRl
LCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgotICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5
b3UgY2hhbmdlIHRoZSAidG8iIHNpZGUgZGlyZWN0bHksIHRoZSAiZnJvbSIgc2lkZSBtYXkgaGF2
ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgorLyoqCisgIEBtZXRob2QgcmVtb3ZlQmVmb3JlT2Jz
ZXJ2ZXIKKyAgQHBhcmFtIG9iagorICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICBAcGFyYW0ge09i
amVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9
IFttZXRob2RdCisqLworRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmos
IF9wYXRoLCB0YXJnZXQsIG1ldGhvZCkgeworICBFbWJlci51bndhdGNoKG9iaiwgX3BhdGgpOwor
ICBFbWJlci5yZW1vdmVMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KF9wYXRoKSwgdGFyZ2V0LCBt
ZXRob2QpOwogCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiQmluZGluZy9vbmVXYXkifX17ey9jcm9z
c0xpbmt9fQorICByZXR1cm4gdGhpczsKK307CiAKLSAgICBAbWV0aG9kIG9uZVdheQotICAgIEBw
YXJhbSB7U3RyaW5nfSBmcm9tIGZyb20gcGF0aC4KLSAgICBAcGFyYW0ge0Jvb2xlYW59IFtmbGFn
XSAoT3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBoZXJlIHdpbGwgbWFrZSB0aGUKLSAgICAgIGJp
bmRpbmcgYG9uZVdheWAuIFlvdSBjYW4gaW5zdGVhZCBwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBg
b25lV2F5YCwgbWFraW5nIHRoZQotICAgICAgYmluZGluZyB0d28gd2F5IGFnYWluLgotICAqLwot
ICBvbmVXYXk6IGZ1bmN0aW9uKGZyb20sIGZsYWcpIHsKLSAgICB2YXIgQyA9IHRoaXMsIGJpbmRp
bmcgPSBuZXcgQyhudWxsLCBmcm9tKTsKLSAgICByZXR1cm4gYmluZGluZy5vbmVXYXkoZmxhZyk7
Ci0gIH0KK30pKCk7CiAKLX0pOwogCi0vKioKLSAgQW4gYEVtYmVyLkJpbmRpbmdgIGNvbm5lY3Rz
IHRoZSBwcm9wZXJ0aWVzIG9mIHR3byBvYmplY3RzIHNvIHRoYXQgd2hlbmV2ZXIKLSAgdGhlIHZh
bHVlIG9mIG9uZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0aGUgb3RoZXIgcHJvcGVydHkgd2lsbCBiZSBj
aGFuZ2VkIGFsc28uCiAKLSAgIyMgQXV0b21hdGljIENyZWF0aW9uIG9mIEJpbmRpbmdzIHdpdGgg
YC9eKkJpbmRpbmcvYC1uYW1lZCBQcm9wZXJ0aWVzCisoZnVuY3Rpb24oKSB7CitkZWZpbmUoImJh
Y2tidXJuZXIvcXVldWUiLAorICBbImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19leHBvcnRzX18p
IHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgZnVuY3Rpb24gUXVldWUoZGFxLCBuYW1lLCBvcHRp
b25zKSB7CisgICAgICB0aGlzLmRhcSA9IGRhcTsKKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7Cisg
ICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgdGhpcy5fcXVldWUgPSBbXTsKKyAg
ICB9CisKKyAgICBRdWV1ZS5wcm90b3R5cGUgPSB7CisgICAgICBkYXE6IG51bGwsCisgICAgICBu
YW1lOiBudWxsLAorICAgICAgb3B0aW9uczogbnVsbCwKKyAgICAgIF9xdWV1ZTogbnVsbCwKKwor
ICAgICAgcHVzaDogZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7CisgICAg
ICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlOworICAgICAgICBxdWV1ZS5wdXNoKHRhcmdldCwg
bWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgICAgIHJldHVybiB7cXVldWU6IHRoaXMsIHRhcmdl
dDogdGFyZ2V0LCBtZXRob2Q6IG1ldGhvZH07CisgICAgICB9LAogCi0gIFlvdSBkbyBub3QgdXN1
YWxseSBjcmVhdGUgQmluZGluZyBvYmplY3RzIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIGRlc2NyaWJl
Ci0gIGJpbmRpbmdzIGluIHlvdXIgY2xhc3Mgb3Igb2JqZWN0IGRlZmluaXRpb24gdXNpbmcgYXV0
b21hdGljIGJpbmRpbmcKLSAgZGV0ZWN0aW9uLgorICAgICAgcHVzaFVuaXF1ZTogZnVuY3Rpb24o
dGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7CisgICAgICAgIHZhciBxdWV1ZSA9IHRoaXMu
X3F1ZXVlLCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0aG9kLCBpLCBsOwogCi0gIFByb3BlcnRp
ZXMgZW5kaW5nIGluIGEgYEJpbmRpbmdgIHN1ZmZpeCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgRW1i
ZXIuQmluZGluZ2AKLSAgaW5zdGFuY2VzLiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91
bGQgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcGF0aAotICB0byBhbm90aGVyIG9iamVjdCBv
ciBhIGN1c3RvbSBiaW5kaW5nIGluc3RhbmNlZCBjcmVhdGVkIHVzaW5nIEJpbmRpbmcgaGVscGVy
cwotICAoc2VlICJDdXN0b21pemluZyBZb3VyIEJpbmRpbmdzIik6CisgICAgICAgIGZvciAoaSA9
IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKKyAgICAgICAgICBjdXJyZW50
VGFyZ2V0ID0gcXVldWVbaV07CisgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHF1ZXVlW2krMV07
CiAKLSAgYGBgCi0gIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250cm9sbGVyLnRpdGxlIgot
ICBgYGAKKyAgICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PT0gdGFyZ2V0ICYmIGN1cnJlbnRN
ZXRob2QgPT09IG1ldGhvZCkgeworICAgICAgICAgICAgcXVldWVbaSsyXSA9IGFyZ3M7IC8vIHJl
cGxhY2UgYXJncworICAgICAgICAgICAgcXVldWVbaSszXSA9IHN0YWNrOyAvLyByZXBsYWNlIHN0
YWNrCisgICAgICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0
aG9kOiBtZXRob2R9OyAvLyBUT0RPOiB0ZXN0IHRoaXMgY29kZSBwYXRoCisgICAgICAgICAgfQor
ICAgICAgICB9CiAKLSAgVGhpcyB3aWxsIGNyZWF0ZSBhIGJpbmRpbmcgZnJvbSBgTXlBcHAuc29t
ZUNvbnRyb2xsZXIudGl0bGVgIHRvIHRoZSBgdmFsdWVgCi0gIHByb3BlcnR5IG9mIHlvdXIgb2Jq
ZWN0IGluc3RhbmNlIGF1dG9tYXRpY2FsbHkuIE5vdyB0aGUgdHdvIHZhbHVlcyB3aWxsIGJlCi0g
IGtlcHQgaW4gc3luYy4KKyAgICAgICAgdGhpcy5fcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwg
YXJncywgc3RhY2spOworICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdl
dCwgbWV0aG9kOiBtZXRob2R9OworICAgICAgfSwKIAotICAjIyBPbmUgV2F5IEJpbmRpbmdzCisg
ICAgICAvLyBUT0RPOiByZW1vdmUgbWUsIG9ubHkgYmVpbmcgdXNlZCBmb3IgRW1iZXIucnVuLnN5
bmMKKyAgICAgIGZsdXNoOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHF1ZXVlID0gdGhpcy5f
cXVldWUsCisgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAorICAgICAgICAgICAg
YmVmb3JlID0gb3B0aW9ucyAmJiBvcHRpb25zLmJlZm9yZSwKKyAgICAgICAgICAgIGFmdGVyID0g
b3B0aW9ucyAmJiBvcHRpb25zLmFmdGVyLAorICAgICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGFy
Z3MsIHN0YWNrLCBpLCBsID0gcXVldWUubGVuZ3RoOworCisgICAgICAgIGlmIChsICYmIGJlZm9y
ZSkgeyBiZWZvcmUoKTsgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSA0KSB7Cisg
ICAgICAgICAgdGFyZ2V0ID0gcXVldWVbaV07CisgICAgICAgICAgbWV0aG9kID0gcXVldWVbaSsx
XTsKKyAgICAgICAgICBhcmdzICAgPSBxdWV1ZVtpKzJdOworICAgICAgICAgIHN0YWNrICA9IHF1
ZXVlW2krM107IC8vIERlYnVnZ2luZyBhc3Npc3RhbmNlCisKKyAgICAgICAgICAvLyBUT0RPOiBl
cnJvciBoYW5kbGluZworICAgICAgICAgIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkgewor
ICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRhcmdldCk7CisgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIGlmIChsICYmIGFmdGVyKSB7IGFmdGVyKCk7IH0KIAotICBPbmUgZXNwZWNp
YWxseSB1c2VmdWwgYmluZGluZyBjdXN0b21pemF0aW9uIHlvdSBjYW4gdXNlIGlzIHRoZSBgb25l
V2F5KClgCi0gIGhlbHBlci4gVGhpcyBoZWxwZXIgdGVsbHMgRW1iZXIgdGhhdCB5b3UgYXJlIG9u
bHkgaW50ZXJlc3RlZCBpbgotICByZWNlaXZpbmcgY2hhbmdlcyBvbiB0aGUgb2JqZWN0IHlvdSBh
cmUgYmluZGluZyBmcm9tLiBGb3IgZXhhbXBsZSwgaWYgeW91Ci0gIGFyZSBiaW5kaW5nIHRvIGEg
cHJlZmVyZW5jZSBhbmQgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgaWYgdGhlIHByZWZlcmVuY2UK
LSAgaGFzIGNoYW5nZWQsIGJ1dCB5b3VyIG9iamVjdCB3aWxsIG5vdCBiZSBjaGFuZ2luZyB0aGUg
cHJlZmVyZW5jZSBpdHNlbGYsIHlvdQotICBjb3VsZCBkbzoKKyAgICAgICAgLy8gY2hlY2sgaWYg
bmV3IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZAorICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gbCkg
eworICAgICAgICAgIHRoaXMuX3F1ZXVlID0gcXVldWUuc2xpY2UobCk7CisgICAgICAgICAgdGhp
cy5mbHVzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuX3F1ZXVlLmxlbmd0
aCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0sCiAKLSAgYGBgCi0gIGJpZ1RpdGxlc0JpbmRpbmc6
IEVtYmVyLkJpbmRpbmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0
bGVzIikKLSAgYGBgCisgICAgICBjYW5jZWw6IGZ1bmN0aW9uKGFjdGlvblRvQ2FuY2VsKSB7Cisg
ICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0
aG9kLCBpLCBsOwogCi0gIFRoaXMgd2F5IGlmIHRoZSB2YWx1ZSBvZiBgTXlBcHAucHJlZmVyZW5j
ZXNDb250cm9sbGVyLmJpZ1RpdGxlc2AgY2hhbmdlcyB0aGUKLSAgYGJpZ1RpdGxlc2AgcHJvcGVy
dHkgb2YgeW91ciBvYmplY3Qgd2lsbCBjaGFuZ2UgYWxzby4gSG93ZXZlciwgaWYgeW91Ci0gIGNo
YW5nZSB0aGUgdmFsdWUgb2YgeW91ciBgYmlnVGl0bGVzYCBwcm9wZXJ0eSwgaXQgd2lsbCBub3Qg
dXBkYXRlIHRoZQotICBgcHJlZmVyZW5jZXNDb250cm9sbGVyYC4KKyAgICAgICAgZm9yIChpID0g
MCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gNCkgeworICAgICAgICAgIGN1cnJlbnRU
YXJnZXQgPSBxdWV1ZVtpXTsKKyAgICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsK
IAotICBPbmUgd2F5IGJpbmRpbmdzIGFyZSBhbG1vc3QgdHdpY2UgYXMgZmFzdCB0byBzZXR1cCBh
bmQgdHdpY2UgYXMgZmFzdCB0bwotICBleGVjdXRlIGJlY2F1c2UgdGhlIGJpbmRpbmcgb25seSBo
YXMgdG8gd29ycnkgYWJvdXQgY2hhbmdlcyB0byBvbmUgc2lkZS4KKyAgICAgICAgICBpZiAoY3Vy
cmVudFRhcmdldCA9PT0gYWN0aW9uVG9DYW5jZWwudGFyZ2V0ICYmIGN1cnJlbnRNZXRob2QgPT09
IGFjdGlvblRvQ2FuY2VsLm1ldGhvZCkgeworICAgICAgICAgICAgcXVldWUuc3BsaWNlKGksIDQp
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CiAKLSAg
WW91IHNob3VsZCBjb25zaWRlciB1c2luZyBvbmUgd2F5IGJpbmRpbmdzIGFueXRpbWUgeW91IGhh
dmUgYW4gb2JqZWN0IHRoYXQKLSAgbWF5IGJlIGNyZWF0ZWQgZnJlcXVlbnRseSBhbmQgeW91IGRv
IG5vdCBpbnRlbmQgdG8gY2hhbmdlIGEgcHJvcGVydHk7IG9ubHkKLSAgdG8gbW9uaXRvciBpdCBm
b3IgY2hhbmdlcy4gKHN1Y2ggYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLgorICAgICAgICAvLyBp
ZiBub3QgZm91bmQgaW4gY3VycmVudCBxdWV1ZQorICAgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUg
cXVldWUgdGhhdCBpcyBiZWluZyBmbHVzaGVkCisgICAgICAgIHF1ZXVlID0gdGhpcy5fcXVldWVC
ZWluZ0ZsdXNoZWQ7CisgICAgICAgIGlmICghcXVldWUpIHsKKyAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkg
Kz0gNCkgeworICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKKyAgICAgICAgICBj
dXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKKworICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0
ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9D
YW5jZWwubWV0aG9kKSB7CisgICAgICAgICAgICAvLyBkb24ndCBtZXNzIHdpdGggYXJyYXkgZHVy
aW5nIGZsdXNoCisgICAgICAgICAgICAvLyBqdXN0IG51bGxpZnkgdGhlIG1ldGhvZAorICAgICAg
ICAgICAgcXVldWVbaSsxXSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OwogCi0gICMjIEFkZGluZyBCaW5kaW5n
cyBNYW51YWxseQogCi0gIEFsbCBvZiB0aGUgZXhhbXBsZXMgYWJvdmUgc2hvdyB5b3UgaG93IHRv
IGNvbmZpZ3VyZSBhIGN1c3RvbSBiaW5kaW5nLCBidXQgdGhlCi0gIHJlc3VsdCBvZiB0aGVzZSBj
dXN0b21pemF0aW9ucyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkgYWN0
aXZlCi0gIEJpbmRpbmcgaW5zdGFuY2UuIFRoZSBiaW5kaW5nIHdpbGwgYWN0dWFsbHkgYmVjb21l
IGFjdGl2ZSBvbmx5IHdoZW4geW91Ci0gIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgdGhlIGJpbmRp
bmcgYmVsb25ncyB0by4gSXQgaXMgdXNlZnVsIGhvd2V2ZXIsIHRvCi0gIHVuZGVyc3RhbmQgd2hh
dCBhY3R1YWxseSBoYXBwZW5zIHdoZW4gdGhlIGJpbmRpbmcgaXMgYWN0aXZhdGVkLgorICAgIF9f
ZXhwb3J0c19fLlF1ZXVlID0gUXVldWU7CisgIH0pOwogCi0gIEZvciBhIGJpbmRpbmcgdG8gZnVu
Y3Rpb24gaXQgbXVzdCBoYXZlIGF0IGxlYXN0IGEgYGZyb21gIHByb3BlcnR5IGFuZCBhIGB0b2AK
LSAgcHJvcGVydHkuIFRoZSBgZnJvbWAgcHJvcGVydHkgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVj
dC9rZXkgdGhhdCB5b3Ugd2FudCB0bwotICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2AgcGF0aCBw
b2ludHMgdG8gdGhlIG9iamVjdC9rZXkgeW91IHdhbnQgdG8gYmluZCB0by4KK2RlZmluZSgiYmFj
a2J1cm5lci9kZWZlcnJlZF9hY3Rpb25fcXVldWVzIiwKKyAgWyJiYWNrYnVybmVyL3F1ZXVlIiwi
ZXhwb3J0cyJdLAorICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7Cisg
ICAgInVzZSBzdHJpY3QiOworICAgIHZhciBRdWV1ZSA9IF9fZGVwZW5kZW5jeTFfXy5RdWV1ZTsK
IAotICBXaGVuIHlvdSBkZWZpbmUgYSBjdXN0b20gYmluZGluZywgeW91IGFyZSB1c3VhbGx5IGRl
c2NyaWJpbmcgdGhlIHByb3BlcnR5Ci0gIHlvdSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBg
TXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWVgIGluIHRoZSBleGFtcGxlcwotICBhYm92ZSkuIFdo
ZW4geW91ciBvYmplY3QgaXMgY3JlYXRlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0
aGUgdmFsdWUKLSAgeW91IHdhbnQgdG8gYmluZCBgdG9gIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHlv
dXIgYmluZGluZyBrZXkuIEluIHRoZQotICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVt
YmVyIG9iamVjdHMgd2lsbCBlZmZlY3RpdmVseSBjYWxsCi0gIHNvbWV0aGluZyBsaWtlIHRoaXMg
b24geW91ciBiaW5kaW5nOgorICAgIGZ1bmN0aW9uIERlZmVycmVkQWN0aW9uUXVldWVzKHF1ZXVl
TmFtZXMsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBxdWV1ZXMgPSB0aGlzLnF1ZXVlcyA9IHt9Owor
ICAgICAgdGhpcy5xdWV1ZU5hbWVzID0gcXVldWVOYW1lcyA9IHF1ZXVlTmFtZXMgfHwgW107CiAK
LSAgYGBgamF2YXNjcmlwdAotICBiaW5kaW5nID0gRW1iZXIuQmluZGluZy5mcm9tKHRoaXMudmFs
dWVCaW5kaW5nKS50bygidmFsdWUiKTsKLSAgYGBgCisgICAgICB2YXIgcXVldWVOYW1lOworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGwgPSBxdWV1ZU5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgICBxdWV1ZU5hbWUgPSBxdWV1ZU5hbWVzW2ldOworICAgICAgICBxdWV1ZXNbcXVldWVO
YW1lXSA9IG5ldyBRdWV1ZSh0aGlzLCBxdWV1ZU5hbWUsIG9wdGlvbnNbcXVldWVOYW1lXSk7Cisg
ICAgICB9CisgICAgfQogCi0gIFRoaXMgY3JlYXRlcyBhIG5ldyBiaW5kaW5nIGluc3RhbmNlIGJh
c2VkIG9uIHRoZSB0ZW1wbGF0ZSB5b3UgcHJvdmlkZSwgYW5kCi0gIHNldHMgdGhlIHRvIHBhdGgg
dG8gdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2YgdGhlIG5ldyBvYmplY3QuIE5vdyB0aGF0IHRoZQot
ICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBp
dCBzaW1wbHkgbmVlZHMgdG8gYmUKLSAgY29ubmVjdGVkIHRvIGJlY29tZSBhY3RpdmUuIFRoaXMg
aXMgZG9uZSB0aHJvdWdoIHRoZSBgY29ubmVjdCgpYCBtZXRob2Q6CisgICAgRGVmZXJyZWRBY3Rp
b25RdWV1ZXMucHJvdG90eXBlID0geworICAgICAgcXVldWVOYW1lczogbnVsbCwKKyAgICAgIHF1
ZXVlczogbnVsbCwKIAotICBgYGBqYXZhc2NyaXB0Ci0gIGJpbmRpbmcuY29ubmVjdCh0aGlzKTsK
LSAgYGBgCisgICAgICBzY2hlZHVsZTogZnVuY3Rpb24ocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhv
ZCwgYXJncywgb25jZUZsYWcsIHN0YWNrKSB7CisgICAgICAgIHZhciBxdWV1ZXMgPSB0aGlzLnF1
ZXVlcywKKyAgICAgICAgICAgIHF1ZXVlID0gcXVldWVzW3F1ZXVlTmFtZV07CiAKLSAgTm90ZSB0
aGF0IHdoZW4geW91IGNvbm5lY3QgYSBiaW5kaW5nIHlvdSBwYXNzIHRoZSBvYmplY3QgeW91IHdh
bnQgaXQgdG8gYmUKLSAgY29ubmVjdGVkIHRvLiBUaGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgYXMg
dGhlIHJvb3QgZm9yIGJvdGggdGhlIGZyb20gYW5kCi0gIHRvIHNpZGUgb2YgdGhlIGJpbmRpbmcg
d2hlbiBpbnNwZWN0aW5nIHJlbGF0aXZlIHBhdGhzLiBUaGlzIGFsbG93cyB0aGUKLSAgYmluZGlu
ZyB0byBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBieSBzdWJjbGFzc2VkIG9iamVjdHMgYXMg
d2VsbC4KKyAgICAgICAgaWYgKCFxdWV1ZSkgeyB0aHJvdyBuZXcgRXJyb3IoIllvdSBhdHRlbXB0
ZWQgdG8gc2NoZWR1bGUgYW4gYWN0aW9uIGluIGEgcXVldWUgKCIgKyBxdWV1ZU5hbWUgKyAiKSB0
aGF0IGRvZXNuJ3QgZXhpc3QiKTsgfQogCi0gIE5vdyB0aGF0IHRoZSBiaW5kaW5nIGlzIGNvbm5l
Y3RlZCwgaXQgd2lsbCBvYnNlcnZlIGJvdGggdGhlIGZyb20gYW5kIHRvIHNpZGUKLSAgYW5kIHJl
bGF5IGNoYW5nZXMuCisgICAgICAgIGlmIChvbmNlRmxhZykgeworICAgICAgICAgIHJldHVybiBx
dWV1ZS5wdXNoVW5pcXVlKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHF1ZXVlLnB1c2godGFyZ2V0LCBtZXRob2QsIGFyZ3Ms
IHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgfSwKIAotICBJZiB5b3UgZXZlciBuZWVkZWQgdG8g
ZG8gc28gKHlvdSBhbG1vc3QgbmV2ZXIgd2lsbCwgYnV0IGl0IGlzIHVzZWZ1bCB0bwotICB1bmRl
cnN0YW5kIHRoaXMgYW55d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBhY3RpdmUg
YmluZGluZyBieQotICB1c2luZyB0aGUgYEVtYmVyLmJpbmQoKWAgaGVscGVyIG1ldGhvZC4gKFRo
aXMgaXMgdGhlIHNhbWUgbWV0aG9kIHVzZWQgYnkKLSAgdG8gc2V0dXAgeW91ciBiaW5kaW5ncyBv
biBvYmplY3RzKToKKyAgICAgIGZsdXNoOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHF1ZXVl
cyA9IHRoaXMucXVldWVzLAorICAgICAgICAgICAgcXVldWVOYW1lcyA9IHRoaXMucXVldWVOYW1l
cywKKyAgICAgICAgICAgIHF1ZXVlTmFtZSwgcXVldWUsIHF1ZXVlSXRlbXMsIHByaW9yUXVldWVO
YW1lSW5kZXgsCisgICAgICAgICAgICBxdWV1ZU5hbWVJbmRleCA9IDAsIG51bWJlck9mUXVldWVz
ID0gcXVldWVOYW1lcy5sZW5ndGg7CisKKyAgICAgICAgb3V0ZXJsb29wOgorICAgICAgICB3aGls
ZSAocXVldWVOYW1lSW5kZXggPCBudW1iZXJPZlF1ZXVlcykgeworICAgICAgICAgIHF1ZXVlTmFt
ZSA9IHF1ZXVlTmFtZXNbcXVldWVOYW1lSW5kZXhdOworICAgICAgICAgIHF1ZXVlID0gcXVldWVz
W3F1ZXVlTmFtZV07CisgICAgICAgICAgcXVldWVJdGVtcyA9IHF1ZXVlLl9xdWV1ZUJlaW5nRmx1
c2hlZCA9IHF1ZXVlLl9xdWV1ZS5zbGljZSgpOworICAgICAgICAgIHF1ZXVlLl9xdWV1ZSA9IFtd
OworCisgICAgICAgICAgdmFyIG9wdGlvbnMgPSBxdWV1ZS5vcHRpb25zLAorICAgICAgICAgICAg
ICBiZWZvcmUgPSBvcHRpb25zICYmIG9wdGlvbnMuYmVmb3JlLAorICAgICAgICAgICAgICBhZnRl
ciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hZnRlciwKKyAgICAgICAgICAgICAgdGFyZ2V0LCBtZXRo
b2QsIGFyZ3MsIHN0YWNrLAorICAgICAgICAgICAgICBxdWV1ZUluZGV4ID0gMCwgbnVtYmVyT2ZR
dWV1ZUl0ZW1zID0gcXVldWVJdGVtcy5sZW5ndGg7CisKKyAgICAgICAgICBpZiAobnVtYmVyT2ZR
dWV1ZUl0ZW1zICYmIGJlZm9yZSkgeyBiZWZvcmUoKTsgfQorICAgICAgICAgIHdoaWxlIChxdWV1
ZUluZGV4IDwgbnVtYmVyT2ZRdWV1ZUl0ZW1zKSB7CisgICAgICAgICAgICB0YXJnZXQgPSBxdWV1
ZUl0ZW1zW3F1ZXVlSW5kZXhdOworICAgICAgICAgICAgbWV0aG9kID0gcXVldWVJdGVtc1txdWV1
ZUluZGV4KzFdOworICAgICAgICAgICAgYXJncyAgID0gcXVldWVJdGVtc1txdWV1ZUluZGV4KzJd
OworICAgICAgICAgICAgc3RhY2sgID0gcXVldWVJdGVtc1txdWV1ZUluZGV4KzNdOyAvLyBEZWJ1
Z2dpbmcgYXNzaXN0YW5jZQorCisgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0
cmluZycpIHsgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07IH0KKworICAgICAgICAgICAgLy8gbWV0
aG9kIGNvdWxkIGhhdmUgYmVlbiBudWxsaWZpZWQgLyBjYW5jZWxlZCBkdXJpbmcgZmx1c2gKKyAg
ICAgICAgICAgIGlmIChtZXRob2QpIHsKKyAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFu
ZGxpbmcKKyAgICAgICAgICAgICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CisgICAg
ICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0KTsKKyAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuYmluZChNeUFw
cC5hbm90aGVyT2JqZWN0LCAidmFsdWUiLCAiTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWUiKTsK
LSAgYGBgCisgICAgICAgICAgICBxdWV1ZUluZGV4ICs9IDQ7CisgICAgICAgICAgfQorICAgICAg
ICAgIHF1ZXVlLl9xdWV1ZUJlaW5nRmx1c2hlZCA9IG51bGw7CisgICAgICAgICAgaWYgKG51bWJl
ck9mUXVldWVJdGVtcyAmJiBhZnRlcikgeyBhZnRlcigpOyB9CiAKLSAgQm90aCBvZiB0aGVzZSBj
b2RlIGZyYWdtZW50cyBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBkb2luZyB0aGUgbW9zdCBmcmll
bmRseQotICBmb3JtIG9mIGJpbmRpbmcgY3JlYXRpb24gbGlrZSBzbzoKKyAgICAgICAgICBpZiAo
KHByaW9yUXVldWVOYW1lSW5kZXggPSBpbmRleE9mUHJpb3JRdWV1ZVdpdGhBY3Rpb25zKHRoaXMs
IHF1ZXVlTmFtZUluZGV4KSkgIT09IC0xKSB7CisgICAgICAgICAgICBxdWV1ZU5hbWVJbmRleCA9
IHByaW9yUXVldWVOYW1lSW5kZXg7CisgICAgICAgICAgICBjb250aW51ZSBvdXRlcmxvb3A7Cisg
ICAgICAgICAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAuYW5vdGhlck9iamVjdCA9IEVt
YmVyLk9iamVjdC5jcmVhdGUoewotICAgIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250cm9s
bGVyLnZhbHVlIiwKKyAgICAgICAgICBxdWV1ZU5hbWVJbmRleCsrOworICAgICAgICB9CisgICAg
ICB9CisgICAgfTsKIAotICAgIC8vIE9USEVSIENPREUgRk9SIFRISVMgT0JKRUNULi4uCi0gIH0p
OwotICBgYGAKKyAgICBmdW5jdGlvbiBpbmRleE9mUHJpb3JRdWV1ZVdpdGhBY3Rpb25zKGRhcSwg
Y3VycmVudFF1ZXVlSW5kZXgpIHsKKyAgICAgIHZhciBxdWV1ZU5hbWUsIHF1ZXVlOwogCi0gIEVt
YmVyJ3MgYnVpbHQgaW4gYmluZGluZyBjcmVhdGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBh
dXRvbWF0aWNhbGx5Ci0gIGNyZWF0ZSBiaW5kaW5ncyBmb3IgeW91LiBZb3Ugc2hvdWxkIGFsd2F5
cyB1c2UgdGhlIGhpZ2hlc3QtbGV2ZWwgQVBJcwotICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVu
ZGVyc3RhbmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCisgICAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGN1cnJlbnRRdWV1ZUluZGV4OyBpIDw9IGw7IGkrKykgeworICAgICAgICBxdWV1ZU5hbWUg
PSBkYXEucXVldWVOYW1lc1tpXTsKKyAgICAgICAgcXVldWUgPSBkYXEucXVldWVzW3F1ZXVlTmFt
ZV07CisgICAgICAgIGlmIChxdWV1ZS5fcXVldWUubGVuZ3RoKSB7IHJldHVybiBpOyB9CisgICAg
ICB9CiAKLSAgQGNsYXNzIEJpbmRpbmcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc2luY2UgRW1i
ZXIgMC45Ci0qLwotRW1iZXIuQmluZGluZyA9IEJpbmRpbmc7CisgICAgICByZXR1cm4gLTE7Cisg
ICAgfQogCiAKLS8qKgotICBHbG9iYWwgaGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgYmlu
ZGluZy4gSnVzdCBwYXNzIHRoZSByb290IG9iamVjdAotICBhbG9uZyB3aXRoIGEgYHRvYCBhbmQg
YGZyb21gIHBhdGggdG8gY3JlYXRlIGFuZCBjb25uZWN0IHRoZSBiaW5kaW5nLgorICAgIF9fZXhw
b3J0c19fLkRlZmVycmVkQWN0aW9uUXVldWVzID0gRGVmZXJyZWRBY3Rpb25RdWV1ZXM7CisgIH0p
OwogCi0gIEBtZXRob2QgYmluZAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmog
VGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB0cmFuc2Zvcm0uCi0gIEBwYXJhbSB7U3RyaW5nfSB0byBU
aGUgcGF0aCB0byB0aGUgJ3RvJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgotICAgIE11c3QgYmUgcmVs
YXRpdmUgdG8gb2JqLgotICBAcGFyYW0ge1N0cmluZ30gZnJvbSBUaGUgcGF0aCB0byB0aGUgJ2Zy
b20nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCi0gICAgTXVzdCBiZSByZWxhdGl2ZSB0byBvYmogb3Ig
YSBnbG9iYWwgcGF0aC4KLSAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYmluZGluZyBpbnN0YW5j
ZQotKi8KLUVtYmVyLmJpbmQgPSBmdW5jdGlvbihvYmosIHRvLCBmcm9tKSB7Ci0gIHJldHVybiBu
ZXcgRW1iZXIuQmluZGluZyh0bywgZnJvbSkuY29ubmVjdChvYmopOwotfTsKK2RlZmluZSgiYmFj
a2J1cm5lciIsCisgIFsiYmFja2J1cm5lci9kZWZlcnJlZF9hY3Rpb25fcXVldWVzIiwiZXhwb3J0
cyJdLAorICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVz
ZSBzdHJpY3QiOworICAgIHZhciBEZWZlcnJlZEFjdGlvblF1ZXVlcyA9IF9fZGVwZW5kZW5jeTFf
Xy5EZWZlcnJlZEFjdGlvblF1ZXVlczsKKworICAgIHZhciBzbGljZSA9IFtdLnNsaWNlLAorICAg
ICAgICBwb3AgPSBbXS5wb3AsCisgICAgICAgIHRocm90dGxlcnMgPSBbXSwKKyAgICAgICAgZGVi
b3VuY2VlcyA9IFtdLAorICAgICAgICB0aW1lcnMgPSBbXSwKKyAgICAgICAgYXV0b3J1biwgbGF0
ZXJUaW1lciwgbGF0ZXJUaW1lckV4cGlyZXNBdCwKKyAgICAgICAgZ2xvYmFsID0gdGhpcywKKyAg
ICAgICAgTlVNQkVSID0gL1xkKy87CisKKyAgICBmdW5jdGlvbiBpc0NvZXJjYWJsZU51bWJlcihu
dW1iZXIpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJyB8fCBOVU1C
RVIudGVzdChudW1iZXIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIEJhY2tidXJuZXIocXVldWVO
YW1lcywgb3B0aW9ucykgeworICAgICAgdGhpcy5xdWV1ZU5hbWVzID0gcXVldWVOYW1lczsKKyAg
ICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgICAgICBpZiAoIXRoaXMub3B0aW9u
cy5kZWZhdWx0UXVldWUpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZSA9IHF1
ZXVlTmFtZXNbMF07CisgICAgICB9CisgICAgICB0aGlzLmluc3RhbmNlU3RhY2sgPSBbXTsKKyAg
ICB9CiAKLS8qKgotICBAbWV0aG9kIG9uZVdheQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2Jq
ZWN0fSBvYmogVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB0cmFuc2Zvcm0uCi0gIEBwYXJhbSB7U3Ry
aW5nfSB0byBUaGUgcGF0aCB0byB0aGUgJ3RvJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgotICAgIE11
c3QgYmUgcmVsYXRpdmUgdG8gb2JqLgotICBAcGFyYW0ge1N0cmluZ30gZnJvbSBUaGUgcGF0aCB0
byB0aGUgJ2Zyb20nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCi0gICAgTXVzdCBiZSByZWxhdGl2ZSB0
byBvYmogb3IgYSBnbG9iYWwgcGF0aC4KLSAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYmluZGlu
ZyBpbnN0YW5jZQotKi8KLUVtYmVyLm9uZVdheSA9IGZ1bmN0aW9uKG9iaiwgdG8sIGZyb20pIHsK
LSAgcmV0dXJuIG5ldyBFbWJlci5CaW5kaW5nKHRvLCBmcm9tKS5vbmVXYXkoKS5jb25uZWN0KG9i
aik7Ci19OworICAgIEJhY2tidXJuZXIucHJvdG90eXBlID0geworICAgICAgcXVldWVOYW1lczog
bnVsbCwKKyAgICAgIG9wdGlvbnM6IG51bGwsCisgICAgICBjdXJyZW50SW5zdGFuY2U6IG51bGws
CisgICAgICBpbnN0YW5jZVN0YWNrOiBudWxsLAogCi19KSgpOworICAgICAgYmVnaW46IGZ1bmN0
aW9uKCkgeworICAgICAgICB2YXIgb25CZWdpbiA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlv
bnMub25CZWdpbiwKKyAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSB0aGlzLmN1cnJlbnRJ
bnN0YW5jZTsKIAorICAgICAgICBpZiAocHJldmlvdXNJbnN0YW5jZSkgeworICAgICAgICAgIHRo
aXMuaW5zdGFuY2VTdGFjay5wdXNoKHByZXZpb3VzSW5zdGFuY2UpOworICAgICAgICB9CiAKKyAg
ICAgICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBuZXcgRGVmZXJyZWRBY3Rpb25RdWV1ZXModGhp
cy5xdWV1ZU5hbWVzLCB0aGlzLm9wdGlvbnMpOworICAgICAgICBpZiAob25CZWdpbikgeworICAg
ICAgICAgIG9uQmVnaW4odGhpcy5jdXJyZW50SW5zdGFuY2UsIHByZXZpb3VzSW5zdGFuY2UpOwor
ICAgICAgICB9CisgICAgICB9LAogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIt
bWV0YWwKLSovCisgICAgICBlbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgb25FbmQgPSB0
aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm9uRW5kLAorICAgICAgICAgICAgY3VycmVudElu
c3RhbmNlID0gdGhpcy5jdXJyZW50SW5zdGFuY2UsCisgICAgICAgICAgICBuZXh0SW5zdGFuY2Ug
PSBudWxsOwogCi12YXIgTWl4aW4sIFJFUVVJUkVELCBBbGlhcywKLSAgICBhX21hcCA9IEVtYmVy
LkFycmF5UG9seWZpbGxzLm1hcCwKLSAgICBhX2luZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxs
cy5pbmRleE9mLAotICAgIGFfZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2gs
Ci0gICAgYV9zbGljZSA9IFtdLnNsaWNlLAotICAgIEVNUFRZX01FVEEgPSB7fSwgLy8gZHVtbXkg
Zm9yIG5vbi13cml0YWJsZSBtZXRhCi0gICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCi0gICAg
ZGVmaW5lUHJvcGVydHkgPSBFbWJlci5kZWZpbmVQcm9wZXJ0eSwKLSAgICBndWlkRm9yID0gRW1i
ZXIuZ3VpZEZvcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1
c2goKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5j
ZSA9IG51bGw7CiAKLWZ1bmN0aW9uIG1peGluc01ldGEob2JqKSB7Ci0gIHZhciBtID0gRW1iZXIu
bWV0YShvYmosIHRydWUpLCByZXQgPSBtLm1peGluczsKLSAgaWYgKCFyZXQpIHsKLSAgICByZXQg
PSBtLm1peGlucyA9IHt9OwotICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdtaXhpbnMn
KSkgewotICAgIHJldCA9IG0ubWl4aW5zID0gb19jcmVhdGUocmV0KTsKLSAgfQotICByZXR1cm4g
cmV0OwotfQorICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlU3RhY2subGVuZ3RoKSB7CisgICAg
ICAgICAgICBuZXh0SW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlU3RhY2sucG9wKCk7CisgICAgICAg
ICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTsKKyAgICAgICAgICB9CiAK
LWZ1bmN0aW9uIGluaXRNaXhpbihtaXhpbiwgYXJncykgewotICBpZiAoYXJncyAmJiBhcmdzLmxl
bmd0aCA+IDApIHsKLSAgICBtaXhpbi5taXhpbnMgPSBhX21hcC5jYWxsKGFyZ3MsIGZ1bmN0aW9u
KHgpIHsKLSAgICAgIGlmICh4IGluc3RhbmNlb2YgTWl4aW4pIHsgcmV0dXJuIHg7IH0KKyAgICAg
ICAgICBpZiAob25FbmQpIHsKKyAgICAgICAgICAgIG9uRW5kKGN1cnJlbnRJbnN0YW5jZSwgbmV4
dEluc3RhbmNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCiAKLSAgICAgIC8v
IE5vdGU6IE1hbnVhbGx5IHNldHVwIGEgcHJpbWl0aXZlIG1peGluIGhlcmUuIFRoaXMgaXMgdGhl
IG9ubHkKLSAgICAgIC8vIHdheSB0byBhY3R1YWxseSBnZXQgYSBwcmltaXRpdmUgbWl4aW4uIFRo
aXMgd2F5IG5vcm1hbCBjcmVhdGlvbgotICAgICAgLy8gb2YgbWl4aW5zIHdpbGwgZ2l2ZSB5b3Ug
Y29tYmluZWQgbWl4aW5zLi4uCi0gICAgICB2YXIgbWl4aW4gPSBuZXcgTWl4aW4oKTsKLSAgICAg
IG1peGluLnByb3BlcnRpZXMgPSB4OwotICAgICAgcmV0dXJuIG1peGluOwotICAgIH0pOwotICB9
Ci0gIHJldHVybiBtaXhpbjsKLX0KKyAgICAgIHJ1bjogZnVuY3Rpb24odGFyZ2V0LCBtZXRob2Qg
LyosIGFyZ3MgKi8pIHsKKyAgICAgICAgdmFyIHJldDsKKyAgICAgICAgdGhpcy5iZWdpbigpOwog
Ci1mdW5jdGlvbiBpc01ldGhvZChvYmopIHsKLSAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVv
ZiBvYmogJiYKLSAgICAgICAgIG9iai5pc01ldGhvZCAhPT0gZmFsc2UgJiYKLSAgICAgICAgIG9i
aiAhPT0gQm9vbGVhbiAmJiBvYmogIT09IE9iamVjdCAmJiBvYmogIT09IE51bWJlciAmJiBvYmog
IT09IEFycmF5ICYmIG9iaiAhPT0gRGF0ZSAmJiBvYmogIT09IFN0cmluZzsKLX0KKyAgICAgICAg
aWYgKCFtZXRob2QpIHsKKyAgICAgICAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgICAgICAgdGFy
Z2V0ID0gbnVsbDsKKyAgICAgICAgfQogCi12YXIgQ09OVElOVUUgPSB7fTsKKyAgICAgICAgaWYg
KHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgbWV0aG9kID0gdGFyZ2V0
W21ldGhvZF07CisgICAgICAgIH0KIAotZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKG1peGluc01l
dGEsIG1peGluKSB7Ci0gIHZhciBndWlkOworICAgICAgICAvLyBQcmV2ZW50IFNhZmFyaSBkb3Vi
bGUtZmluYWxseS4KKyAgICAgICAgdmFyIGZpbmFsbHlBbHJlYWR5Q2FsbGVkID0gZmFsc2U7Cisg
ICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAg
ICAgICAgICByZXQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBzbGljZS5jYWxsKGFyZ3VtZW50cywg
MikpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBtZXRob2QuY2FsbCh0
YXJnZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAo
IWZpbmFsbHlBbHJlYWR5Q2FsbGVkKSB7CisgICAgICAgICAgICBmaW5hbGx5QWxyZWFkeUNhbGxl
ZCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgfSwKIAotICBpZiAobWl4aW4gaW5zdGFuY2Vv
ZiBNaXhpbikgewotICAgIGd1aWQgPSBndWlkRm9yKG1peGluKTsKLSAgICBpZiAobWl4aW5zTWV0
YVtndWlkXSkgeyByZXR1cm4gQ09OVElOVUU7IH0KLSAgICBtaXhpbnNNZXRhW2d1aWRdID0gbWl4
aW47Ci0gICAgcmV0dXJuIG1peGluLnByb3BlcnRpZXM7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJu
IG1peGluOyAvLyBhcHBseSBhbm9ueW1vdXMgbWl4aW4gcHJvcGVydGllcwotICB9Ci19CisgICAg
ICBkZWZlcjogZnVuY3Rpb24ocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCAvKiAsIGFyZ3MgKi8p
IHsKKyAgICAgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgICAgICBtZXRob2QgPSB0YXJnZXQ7Cisg
ICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgfQogCi1mdW5jdGlvbiBjb25jYXRlbmF0
ZWRQcm9wZXJ0aWVzKHByb3BzLCB2YWx1ZXMsIGJhc2UpIHsKLSAgdmFyIGNvbmNhdHM7CisgICAg
ICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykgeworICAgICAgICAgIG1ldGhvZCA9
IHRhcmdldFttZXRob2RdOworICAgICAgICB9CiAKLSAgLy8gcmVzZXQgYmVmb3JlIGFkZGluZyBl
YWNoIG5ldyBtaXhpbiB0byBwaWNrdXAgY29uY2F0cyBmcm9tIHByZXZpb3VzCi0gIGNvbmNhdHMg
PSB2YWx1ZXMuY29uY2F0ZW5hdGVkUHJvcGVydGllcyB8fCBiYXNlLmNvbmNhdGVuYXRlZFByb3Bl
cnRpZXM7Ci0gIGlmIChwcm9wcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSB7Ci0gICAgY29uY2F0
cyA9IGNvbmNhdHMgPyBjb25jYXRzLmNvbmNhdChwcm9wcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVz
KSA6IHByb3BzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7Ci0gIH0KKyAgICAgICAgdmFyIHN0YWNr
ID0gdGhpcy5ERUJVRyA/IG5ldyBFcnJvcigpIDogdW5kZWZpbmVkLAorICAgICAgICAgICAgYXJn
cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpIDogdW5k
ZWZpbmVkOworICAgICAgICBpZiAoIXRoaXMuY3VycmVudEluc3RhbmNlKSB7IGNyZWF0ZUF1dG9y
dW4odGhpcyk7IH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEluc3RhbmNlLnNjaGVkdWxl
KHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QsIGFyZ3MsIGZhbHNlLCBzdGFjayk7CisgICAgICB9
LAogCi0gIHJldHVybiBjb25jYXRzOwotfQorICAgICAgZGVmZXJPbmNlOiBmdW5jdGlvbihxdWV1
ZU5hbWUsIHRhcmdldCwgbWV0aG9kIC8qICwgYXJncyAqLykgeworICAgICAgICBpZiAoIW1ldGhv
ZCkgeworICAgICAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICAgICAgICB0YXJnZXQgPSBudWxs
OworICAgICAgICB9CiAKLWZ1bmN0aW9uIGdpdmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCBw
cm9wZXJ0eSwgdmFsdWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJQcm9wZXJ0eTsKKyAgICAgICAg
aWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgbWV0aG9kID0gdGFy
Z2V0W21ldGhvZF07CisgICAgICAgIH0KIAotICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJy
aWRlIG1ldGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCi0gIGlmICh2YWx1ZXNb
a2V5XSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRv
ciBpbiBhIHBhcmVudCBtaXhpbgotICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOwotICB9
CisgICAgICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBuZXcgRXJyb3IoKSA6IHVuZGVmaW5l
ZCwKKyAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwo
YXJndW1lbnRzLCAzKSA6IHVuZGVmaW5lZDsKKyAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0
YW5jZSkgeyBjcmVhdGVBdXRvcnVuKHRoaXMpOyB9CisgICAgICAgIHJldHVybiB0aGlzLmN1cnJl
bnRJbnN0YW5jZS5zY2hlZHVsZShxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCB0cnVl
LCBzdGFjayk7CisgICAgICB9LAogCi0gIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmlnaW5h
bCBkZXNjcmlwdG9yIGluIGEgcGFyZW50IG1peGluLCBmaW5kCi0gIC8vIGl0IG9uIHRoZSBvcmln
aW5hbCBvYmplY3QuCi0gIHN1cGVyUHJvcGVydHkgPSBzdXBlclByb3BlcnR5IHx8IG1ldGEuZGVz
Y3Nba2V5XTsKKyAgICAgIHNldFRpbWVvdXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgYXJn
cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3MubGVu
Z3RoOworICAgICAgICB2YXIgbWV0aG9kLCB3YWl0LCB0YXJnZXQ7CisgICAgICAgIHZhciBzZWxm
ID0gdGhpczsKKyAgICAgICAgdmFyIG1ldGhvZE9yVGFyZ2V0LCBtZXRob2RPcldhaXQsIG1ldGhv
ZE9yQXJnczsKIAotICBpZiAoIXN1cGVyUHJvcGVydHkgfHwgIShzdXBlclByb3BlcnR5IGluc3Rh
bmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkpIHsKLSAgICByZXR1cm4gcHJvcGVydHk7Ci0g
IH0KKyAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDEpIHsKKyAgICAgICAgICBtZXRob2QgPSBhcmdzLnNo
aWZ0KCk7CisgICAgICAgICAgd2FpdCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09
PSAyKSB7CisgICAgICAgICAgbWV0aG9kT3JUYXJnZXQgPSBhcmdzWzBdOworICAgICAgICAgIG1l
dGhvZE9yV2FpdCA9IGFyZ3NbMV07CisKKyAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZE9yV2Fp
dCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgIG1ldGhvZE9yVGFyZ2V0W21ldGhvZE9yV2FpdF0g
PT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hpZnQoKTsKKyAg
ICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIHdhaXQgPSAwOwor
ICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb2VyY2FibGVOdW1iZXIobWV0aG9kT3JXYWl0KSkgewor
ICAgICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgd2FpdCA9IGFy
Z3Muc2hpZnQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kID0gYXJn
cy5zaGlmdCgpOworICAgICAgICAgICAgd2FpdCA9ICAwOworICAgICAgICAgIH0KKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICB2YXIgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKIAot
ICAvLyBTaW5jZSBtdWx0aXBsZSBtaXhpbnMgbWF5IGluaGVyaXQgZnJvbSB0aGUgc2FtZSBwYXJl
bnQsIHdlIG5lZWQKLSAgLy8gdG8gY2xvbmUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHNvIHRoYXQg
b3RoZXIgbWl4aW5zIGRvIG5vdCByZWNlaXZlCi0gIC8vIHRoZSB3cmFwcGVkIHZlcnNpb24uCi0g
IHByb3BlcnR5ID0gb19jcmVhdGUocHJvcGVydHkpOwotICBwcm9wZXJ0eS5mdW5jID0gRW1iZXIu
d3JhcChwcm9wZXJ0eS5mdW5jLCBzdXBlclByb3BlcnR5LmZ1bmMpOworICAgICAgICAgIGlmIChp
c0NvZXJjYWJsZU51bWJlcihsYXN0KSkgeworICAgICAgICAgICAgd2FpdCA9IGFyZ3MucG9wKCk7
CisgICAgICAgICAgfQogCi0gIHJldHVybiBwcm9wZXJ0eTsKLX0KKyAgICAgICAgICBtZXRob2RP
clRhcmdldCA9IGFyZ3NbMF07CisgICAgICAgICAgbWV0aG9kT3JBcmdzID0gYXJnc1sxXTsKIAot
ZnVuY3Rpb24gZ2l2ZU1ldGhvZFN1cGVyKG9iaiwga2V5LCBtZXRob2QsIHZhbHVlcywgZGVzY3Mp
IHsKLSAgdmFyIHN1cGVyTWV0aG9kOworICAgICAgICAgIGlmICh0eXBlb2YgbWV0aG9kT3JBcmdz
ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgbWV0aG9kT3JBcmdzID09PSAnc3RyaW5nJyAmJgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRo
b2RPclRhcmdldCAhPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtZXRob2RPckFyZ3MgaW4gbWV0aG9kT3JUYXJnZXQpKSB7Cisg
ICAgICAgICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBtZXRob2QgPSBh
cmdzLnNoaWZ0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IGFy
Z3Muc2hpZnQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotICAvLyBNZXRob2RzIG92ZXJ3
cml0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzLCBhbmQgZG8gbm90IGNhbGwgc3VwZXIgdG8gdGhlbS4K
LSAgaWYgKGRlc2NzW2tleV0gPT09IHVuZGVmaW5lZCkgewotICAgIC8vIEZpbmQgdGhlIG9yaWdp
bmFsIG1ldGhvZCBpbiBhIHBhcmVudCBtaXhpbgotICAgIHN1cGVyTWV0aG9kID0gdmFsdWVzW2tl
eV07Ci0gIH0KKyAgICAgICAgdmFyIGV4ZWN1dGVBdCA9ICgrbmV3IERhdGUoKSkgKyBwYXJzZUlu
dCh3YWl0LCAxMCk7CiAKLSAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIHZhbHVl
IGluIGEgcGFyZW50IG1peGluLCBmaW5kIGl0IGluCi0gIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QK
LSAgc3VwZXJNZXRob2QgPSBzdXBlck1ldGhvZCB8fCBvYmpba2V5XTsKKyAgICAgICAgaWYgKHR5
cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21l
dGhvZF07CisgICAgICAgIH0KIAotICAvLyBPbmx5IHdyYXAgdGhlIG5ldyBtZXRob2QgaWYgdGhl
IG9yaWdpbmFsIG1ldGhvZCB3YXMgYSBmdW5jdGlvbgotICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlw
ZW9mIHN1cGVyTWV0aG9kKSB7Ci0gICAgcmV0dXJuIG1ldGhvZDsKLSAgfQorICAgICAgICBmdW5j
dGlvbiBmbigpIHsKKyAgICAgICAgICBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmdzKTsKKyAgICAg
ICAgfQogCi0gIHJldHVybiBFbWJlci53cmFwKG1ldGhvZCwgc3VwZXJNZXRob2QpOwotfQorICAg
ICAgICAvLyBmaW5kIHBvc2l0aW9uIHRvIGluc2VydCAtIFRPRE86IGJpbmFyeSBzZWFyY2gKKyAg
ICAgICAgdmFyIGksIGw7CisgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aW1lcnMubGVuZ3RoOyBp
IDwgbDsgaSArPSAyKSB7CisgICAgICAgICAgaWYgKGV4ZWN1dGVBdCA8IHRpbWVyc1tpXSkgeyBi
cmVhazsgfQorICAgICAgICB9CiAKLWZ1bmN0aW9uIGFwcGx5Q29uY2F0ZW5hdGVkUHJvcGVydGll
cyhvYmosIGtleSwgdmFsdWUsIHZhbHVlcykgewotICB2YXIgYmFzZVZhbHVlID0gdmFsdWVzW2tl
eV0gfHwgb2JqW2tleV07CisgICAgICAgIHRpbWVycy5zcGxpY2UoaSwgMCwgZXhlY3V0ZUF0LCBm
bik7CiAKLSAgaWYgKGJhc2VWYWx1ZSkgewotICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Yg
YmFzZVZhbHVlLmNvbmNhdCkgewotICAgICAgcmV0dXJuIGJhc2VWYWx1ZS5jb25jYXQodmFsdWUp
OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gRW1iZXIubWFrZUFycmF5KGJhc2VWYWx1ZSku
Y29uY2F0KHZhbHVlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEVtYmVyLm1ha2VB
cnJheSh2YWx1ZSk7Ci0gIH0KLX0KKyAgICAgICAgdXBkYXRlTGF0ZXJUaW1lcihzZWxmLCBleGVj
dXRlQXQsIHdhaXQpOwogCi1mdW5jdGlvbiBhZGROb3JtYWxpemVkUHJvcGVydHkoYmFzZSwga2V5
LCB2YWx1ZSwgbWV0YSwgZGVzY3MsIHZhbHVlcywgY29uY2F0cykgewotICBpZiAodmFsdWUgaW5z
dGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yKSB7Ci0gICAgaWYgKHZhbHVlID09PSBSRVFVSVJFRCAm
JiBkZXNjc1trZXldKSB7IHJldHVybiBDT05USU5VRTsgfQorICAgICAgICByZXR1cm4gZm47Cisg
ICAgICB9LAogCi0gICAgLy8gV3JhcCBkZXNjcmlwdG9yIGZ1bmN0aW9uIHRvIGltcGxlbWVudAot
ICAgIC8vIF9zdXBlcigpIGlmIG5lZWRlZAotICAgIGlmICh2YWx1ZS5mdW5jKSB7Ci0gICAgICB2
YWx1ZSA9IGdpdmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCB2YWx1ZSwgdmFsdWVzLCBkZXNj
cyk7Ci0gICAgfQorICAgICAgdGhyb3R0bGU6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qICwg
YXJncywgd2FpdCAqLykgeworICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCisgICAgICAgICAgICBh
cmdzID0gYXJndW1lbnRzLAorICAgICAgICAgICAgd2FpdCA9IHBhcnNlSW50KHBvcC5jYWxsKGFy
Z3MpLCAxMCksCisgICAgICAgICAgICB0aHJvdHRsZXIsCisgICAgICAgICAgICBpbmRleCwKKyAg
ICAgICAgICAgIHRpbWVyOwogCi0gICAgZGVzY3Nba2V5XSAgPSB2YWx1ZTsKLSAgICB2YWx1ZXNb
a2V5XSA9IHVuZGVmaW5lZDsKLSAgfSBlbHNlIHsKLSAgICAvLyBpbXBsIHN1cGVyIGlmIG5lZWRl
ZC4uLgotICAgIGlmIChpc01ldGhvZCh2YWx1ZSkpIHsKLSAgICAgIHZhbHVlID0gZ2l2ZU1ldGhv
ZFN1cGVyKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVzY3MpOwotICAgIH0gZWxzZSBpZiAo
KGNvbmNhdHMgJiYgYV9pbmRleE9mLmNhbGwoY29uY2F0cywga2V5KSA+PSAwKSB8fCBrZXkgPT09
ICdjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzJykgewotICAgICAgdmFsdWUgPSBhcHBseUNvbmNhdGVu
YXRlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2YWx1ZSwgdmFsdWVzKTsKLSAgICB9CisgICAgICAg
IGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCk7CisgICAgICAgIGlmIChpbmRl
eCA+IC0xKSB7IHJldHVybiB0aHJvdHRsZXJzW2luZGV4XTsgfSAvLyB0aHJvdHRsZWQKIAotICAg
IGRlc2NzW2tleV0gPSB1bmRlZmluZWQ7Ci0gICAgdmFsdWVzW2tleV0gPSB2YWx1ZTsKLSAgfQot
fQorICAgICAgICB0aW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAg
ICAgIHNlbGYucnVuLmFwcGx5KHNlbGYsIGFyZ3MpOwogCi1mdW5jdGlvbiBtZXJnZU1peGlucyht
aXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UpIHsKLSAgdmFyIG1peGluLCBwcm9wcywga2V5
LCBjb25jYXRzLCBtZXRhOworICAgICAgICAgIHZhciBpbmRleCA9IGZpbmRUaHJvdHRsZXIodGFy
Z2V0LCBtZXRob2QpOworICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7IHRocm90dGxlcnMuc3Bs
aWNlKGluZGV4LCAxKTsgfQorICAgICAgICB9LCB3YWl0KTsKIAotICBmdW5jdGlvbiByZW1vdmVL
ZXlzKGtleU5hbWUpIHsKLSAgICBkZWxldGUgZGVzY3Nba2V5TmFtZV07Ci0gICAgZGVsZXRlIHZh
bHVlc1trZXlOYW1lXTsKLSAgfQorICAgICAgICB0aHJvdHRsZXIgPSBbdGFyZ2V0LCBtZXRob2Qs
IHRpbWVyXTsKIAotICBmb3IodmFyIGk9MCwgbD1taXhpbnMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgIG1peGluID0gbWl4aW5zW2ldOwotICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0ZWQgaGFzaCBv
ciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
bWl4aW4pLCB0eXBlb2YgbWl4aW4gPT09ICdvYmplY3QnICYmIG1peGluICE9PSBudWxsICYmIE9i
amVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtaXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScp
OworICAgICAgICB0aHJvdHRsZXJzLnB1c2godGhyb3R0bGVyKTsKIAotICAgIHByb3BzID0gbWl4
aW5Qcm9wZXJ0aWVzKG0sIG1peGluKTsKLSAgICBpZiAocHJvcHMgPT09IENPTlRJTlVFKSB7IGNv
bnRpbnVlOyB9CisgICAgICAgIHJldHVybiB0aHJvdHRsZXI7CisgICAgICB9LAogCi0gICAgaWYg
KHByb3BzKSB7Ci0gICAgICBtZXRhID0gRW1iZXIubWV0YShiYXNlKTsKLSAgICAgIGNvbmNhdHMg
PSBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKHByb3BzLCB2YWx1ZXMsIGJhc2UpOworICAgICAgZGVi
b3VuY2U6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywgd2FpdCwgW2ltbWVkaWF0
ZV0gKi8pIHsKKyAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAorICAgICAgICAgICAgYXJncyA9IGFy
Z3VtZW50cywKKyAgICAgICAgICAgIGltbWVkaWF0ZSA9IHBvcC5jYWxsKGFyZ3MpLAorICAgICAg
ICAgICAgd2FpdCwKKyAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgZGVib3VuY2VlLAor
ICAgICAgICAgICAgdGltZXI7CisKKyAgICAgICAgaWYgKHR5cGVvZiBpbW1lZGlhdGUgPT09ICJu
dW1iZXIiIHx8IHR5cGVvZiBpbW1lZGlhdGUgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgd2Fp
dCA9IGltbWVkaWF0ZTsKKyAgICAgICAgICBpbW1lZGlhdGUgPSBmYWxzZTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICB3YWl0ID0gcG9wLmNhbGwoYXJncyk7CisgICAgICAgIH0KIAotICAg
ICAgZm9yIChrZXkgaW4gcHJvcHMpIHsKLSAgICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0
eShrZXkpKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNl
LCBrZXksIHByb3BzW2tleV0sIG1ldGEsIGRlc2NzLCB2YWx1ZXMsIGNvbmNhdHMpOwotICAgICAg
fQorICAgICAgICB3YWl0ID0gcGFyc2VJbnQod2FpdCwgMTApOworICAgICAgICAvLyBSZW1vdmUg
ZGVib3VuY2VlCisgICAgICAgIGluZGV4ID0gZmluZERlYm91bmNlZSh0YXJnZXQsIG1ldGhvZCk7
CiAKLSAgICAgIC8vIG1hbnVhbGx5IGNvcHkgdG9TdHJpbmcoKSBiZWNhdXNlIHNvbWUgSlMgZW5n
aW5lcyBkbyBub3QgZW51bWVyYXRlIGl0Ci0gICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHko
J3RvU3RyaW5nJykpIHsgYmFzZS50b1N0cmluZyA9IHByb3BzLnRvU3RyaW5nOyB9Ci0gICAgfSBl
bHNlIGlmIChtaXhpbi5taXhpbnMpIHsKLSAgICAgIG1lcmdlTWl4aW5zKG1peGluLm1peGlucywg
bSwgZGVzY3MsIHZhbHVlcywgYmFzZSk7Ci0gICAgICBpZiAobWl4aW4uX3dpdGhvdXQpIHsgYV9m
b3JFYWNoLmNhbGwobWl4aW4uX3dpdGhvdXQsIHJlbW92ZUtleXMpOyB9Ci0gICAgfQotICB9Ci19
CisgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgICAgZGVib3VuY2VlID0gZGVib3Vu
Y2Vlc1tpbmRleF07CisgICAgICAgICAgZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOworICAg
ICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZWVbMl0pOworICAgICAgICB9CiAKLWZ1bmN0aW9u
IHdyaXRhYmxlUmVxKG9iaikgewotICB2YXIgbSA9IEVtYmVyLm1ldGEob2JqKSwgcmVxID0gbS5y
ZXF1aXJlZDsKLSAgaWYgKCFyZXEgfHwgIW0uaGFzT3duUHJvcGVydHkoJ3JlcXVpcmVkJykpIHsK
LSAgICByZXEgPSBtLnJlcXVpcmVkID0gcmVxID8gb19jcmVhdGUocmVxKSA6IHt9OwotICB9Ci0g
IHJldHVybiByZXE7Ci19CisgICAgICAgIHRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rp
b24oKSB7CisgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHsKKyAgICAgICAgICAgIHNlbGYucnVu
LmFwcGx5KHNlbGYsIGFyZ3MpOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgaW5kZXggPSBm
aW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKKyAgICAgICAgICBpZiAoaW5kZXggPiAtMSkg
eworICAgICAgICAgICAgZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgICAgIH0K
KyAgICAgICAgfSwgd2FpdCk7CiAKLXZhciBJU19CSU5ESU5HID0gRW1iZXIuSVNfQklORElORyA9
IC9eLitCaW5kaW5nJC87CisgICAgICAgIGlmIChpbW1lZGlhdGUgJiYgaW5kZXggPT09IC0xKSB7
CisgICAgICAgICAgc2VsZi5ydW4uYXBwbHkoc2VsZiwgYXJncyk7CisgICAgICAgIH0KIAotZnVu
Y3Rpb24gZGV0ZWN0QmluZGluZyhvYmosIGtleSwgdmFsdWUsIG0pIHsKLSAgaWYgKElTX0JJTkRJ
TkcudGVzdChrZXkpKSB7Ci0gICAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsKLSAgICBpZiAo
IWJpbmRpbmdzKSB7Ci0gICAgICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsKLSAgICB9IGVs
c2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICBiaW5kaW5ncyA9
IG0uYmluZGluZ3MgPSBvX2NyZWF0ZShtLmJpbmRpbmdzKTsKLSAgICB9Ci0gICAgYmluZGluZ3Nb
a2V5XSA9IHZhbHVlOwotICB9Ci19CisgICAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhv
ZCwgdGltZXJdOwogCi1mdW5jdGlvbiBjb25uZWN0QmluZGluZ3Mob2JqLCBtKSB7Ci0gIC8vIFRP
RE8gTWl4aW4uYXBwbHkoaW5zdGFuY2UpIHNob3VsZCBkaXNjb25uZWN0IGJpbmRpbmcgaWYgZXhp
c3RzCi0gIHZhciBiaW5kaW5ncyA9IG0uYmluZGluZ3MsIGtleSwgYmluZGluZywgdG87Ci0gIGlm
IChiaW5kaW5ncykgewotICAgIGZvciAoa2V5IGluIGJpbmRpbmdzKSB7Ci0gICAgICBiaW5kaW5n
ID0gYmluZGluZ3Nba2V5XTsKLSAgICAgIGlmIChiaW5kaW5nKSB7Ci0gICAgICAgIHRvID0ga2V5
LnNsaWNlKDAsIC03KTsgLy8gc3RyaXAgQmluZGluZyBvZmYgZW5kCi0gICAgICAgIGlmIChiaW5k
aW5nIGluc3RhbmNlb2YgRW1iZXIuQmluZGluZykgewotICAgICAgICAgIGJpbmRpbmcgPSBiaW5k
aW5nLmNvcHkoKTsgLy8gY29weSBwcm90b3R5cGVzJyBpbnN0YW5jZQotICAgICAgICAgIGJpbmRp
bmcudG8odG8pOwotICAgICAgICB9IGVsc2UgeyAvLyBiaW5kaW5nIGlzIHN0cmluZyBwYXRoCi0g
ICAgICAgICAgYmluZGluZyA9IG5ldyBFbWJlci5CaW5kaW5nKHRvLCBiaW5kaW5nKTsKLSAgICAg
ICAgfQotICAgICAgICBiaW5kaW5nLmNvbm5lY3Qob2JqKTsKLSAgICAgICAgb2JqW2tleV0gPSBi
aW5kaW5nOwotICAgICAgfQotICAgIH0KLSAgICAvLyBtYXJrIGFzIGFwcGxpZWQKLSAgICBtLmJp
bmRpbmdzID0ge307Ci0gIH0KLX0KKyAgICAgICAgZGVib3VuY2Vlcy5wdXNoKGRlYm91bmNlZSk7
CiAKLWZ1bmN0aW9uIGZpbmlzaFBhcnRpYWwob2JqLCBtKSB7Ci0gIGNvbm5lY3RCaW5kaW5ncyhv
YmosIG0gfHwgRW1iZXIubWV0YShvYmopKTsKLSAgcmV0dXJuIG9iajsKLX0KKyAgICAgICAgcmV0
dXJuIGRlYm91bmNlZTsKKyAgICAgIH0sCiAKLWZ1bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwgZGVz
YywgbSwgZGVzY3MsIHZhbHVlcykgewotICB2YXIgYWx0S2V5ID0gZGVzYy5tZXRob2ROYW1lLCB2
YWx1ZTsKLSAgaWYgKGRlc2NzW2FsdEtleV0gfHwgdmFsdWVzW2FsdEtleV0pIHsKLSAgICB2YWx1
ZSA9IHZhbHVlc1thbHRLZXldOwotICAgIGRlc2MgID0gZGVzY3NbYWx0S2V5XTsKLSAgfSBlbHNl
IGlmIChtLmRlc2NzW2FsdEtleV0pIHsKLSAgICBkZXNjICA9IG0uZGVzY3NbYWx0S2V5XTsKLSAg
ICB2YWx1ZSA9IHVuZGVmaW5lZDsKLSAgfSBlbHNlIHsKLSAgICBkZXNjID0gdW5kZWZpbmVkOwot
ICAgIHZhbHVlID0gb2JqW2FsdEtleV07Ci0gIH0KKyAgICAgIGNhbmNlbFRpbWVyczogZnVuY3Rp
b24oKSB7CisgICAgICAgIHZhciBpLCBsZW47CiAKLSAgcmV0dXJuIHsgZGVzYzogZGVzYywgdmFs
dWU6IHZhbHVlIH07Ci19CisgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRocm90dGxlcnMubGVu
Z3RoOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICBjbGVhclRpbWVvdXQodGhyb3R0bGVyc1tp
XVsyXSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3R0bGVycyA9IFtdOwogCi1mdW5jdGlvbiB1
cGRhdGVPYnNlcnZlcnMob2JqLCBrZXksIG9ic2VydmVyLCBvYnNlcnZlcktleSwgbWV0aG9kKSB7
Ci0gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2Ygb2JzZXJ2ZXIpIHsgcmV0dXJuOyB9CisgICAg
ICAgIGZvciAoaSA9IDAsIGxlbiA9IGRlYm91bmNlZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2Vlc1tpXVsyXSk7CisgICAgICAgIH0KKyAg
ICAgICAgZGVib3VuY2VlcyA9IFtdOwogCi0gIHZhciBwYXRocyA9IG9ic2VydmVyW29ic2VydmVy
S2V5XTsKKyAgICAgICAgaWYgKGxhdGVyVGltZXIpIHsKKyAgICAgICAgICBjbGVhclRpbWVvdXQo
bGF0ZXJUaW1lcik7CisgICAgICAgICAgbGF0ZXJUaW1lciA9IG51bGw7CisgICAgICAgIH0KKyAg
ICAgICAgdGltZXJzID0gW107CiAKLSAgaWYgKHBhdGhzKSB7Ci0gICAgZm9yICh2YXIgaT0wLCBs
PXBhdGhzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIEVtYmVyW21ldGhvZF0ob2JqLCBwYXRo
c1tpXSwgbnVsbCwga2V5KTsKLSAgICB9Ci0gIH0KLX0KKyAgICAgICAgaWYgKGF1dG9ydW4pIHsK
KyAgICAgICAgICBjbGVhclRpbWVvdXQoYXV0b3J1bik7CisgICAgICAgICAgYXV0b3J1biA9IG51
bGw7CisgICAgICAgIH0KKyAgICAgIH0sCiAKLWZ1bmN0aW9uIHJlcGxhY2VPYnNlcnZlcnMob2Jq
LCBrZXksIG9ic2VydmVyKSB7Ci0gIHZhciBwcmV2T2JzZXJ2ZXIgPSBvYmpba2V5XTsKKyAgICAg
IGhhc1RpbWVyczogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAhIXRpbWVycy5sZW5ndGgg
fHwgYXV0b3J1bjsKKyAgICAgIH0sCiAKLSAgdXBkYXRlT2JzZXJ2ZXJzKG9iaiwga2V5LCBwcmV2
T2JzZXJ2ZXIsICdfX2VtYmVyX29ic2VydmVzQmVmb3JlX18nLCAncmVtb3ZlQmVmb3JlT2JzZXJ2
ZXInKTsKLSAgdXBkYXRlT2JzZXJ2ZXJzKG9iaiwga2V5LCBwcmV2T2JzZXJ2ZXIsICdfX2VtYmVy
X29ic2VydmVzX18nLCAncmVtb3ZlT2JzZXJ2ZXInKTsKKyAgICAgIGNhbmNlbDogZnVuY3Rpb24o
dGltZXIpIHsKKyAgICAgICAgdmFyIHRpbWVyVHlwZSA9IHR5cGVvZiB0aW1lcjsKIAotICB1cGRh
dGVPYnNlcnZlcnMob2JqLCBrZXksIG9ic2VydmVyLCAnX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9f
JywgJ2FkZEJlZm9yZU9ic2VydmVyJyk7Ci0gIHVwZGF0ZU9ic2VydmVycyhvYmosIGtleSwgb2Jz
ZXJ2ZXIsICdfX2VtYmVyX29ic2VydmVzX18nLCAnYWRkT2JzZXJ2ZXInKTsKLX0KKyAgICAgICAg
aWYgKHRpbWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVjdCcgJiYgdGltZXIucXVldWUgJiYgdGlt
ZXIubWV0aG9kKSB7IC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBkZWZlck9uY2UKKyAgICAgICAgICBy
ZXR1cm4gdGltZXIucXVldWUuY2FuY2VsKHRpbWVyKTsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1l
clR5cGUgPT09ICdmdW5jdGlvbicpIHsgLy8gd2UncmUgY2FuY2VsbGluZyBhIHNldFRpbWVvdXQK
KyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRpbWVycy5sZW5ndGg7IGkgPCBsOyBpICs9
IDIpIHsKKyAgICAgICAgICAgIGlmICh0aW1lcnNbaSArIDFdID09PSB0aW1lcikgeworICAgICAg
ICAgICAgICB0aW1lcnMuc3BsaWNlKGksIDIpOyAvLyByZW1vdmUgdGhlIHR3byBlbGVtZW50cwor
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSBpZiAod2luZG93LnRvU3RyaW5nLmNhbGwodGltZXIpID09PSAiW29iamVj
dCBBcnJheV0iKXsgLy8gd2UncmUgY2FuY2VsbGluZyBhIHRocm90dGxlIG9yIGRlYm91bmNlCisg
ICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNlbEl0ZW0oZmluZFRocm90dGxlciwgdGhyb3R0bGVy
cywgdGltZXIpIHx8IAorICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbEl0ZW0oZmluZERl
Ym91bmNlZSwgZGVib3VuY2VlcywgdGltZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IHJldHVybjsgLy8gdGltZXIgd2FzIG51bGwgb3Igbm90IGEgdGltZXIKKyAgICAgICAgfQorICAg
ICAgfSwKIAotZnVuY3Rpb24gYXBwbHlNaXhpbihvYmosIG1peGlucywgcGFydGlhbCkgewotICB2
YXIgZGVzY3MgPSB7fSwgdmFsdWVzID0ge30sIG0gPSBFbWJlci5tZXRhKG9iaiksCi0gICAgICBr
ZXksIHZhbHVlLCBkZXNjOworICAgICAgX2NhbmNlbEl0ZW06IGZ1bmN0aW9uKGZpbmRNZXRob2Qs
IGFycmF5LCB0aW1lcil7CisgICAgICAgIHZhciBpdGVtLAorICAgICAgICAgICAgaW5kZXg7CiAK
LSAgLy8gR28gdGhyb3VnaCBhbGwgbWl4aW5zIGFuZCBoYXNoZXMgcGFzc2VkIGluLCBhbmQ6Ci0g
IC8vCi0gIC8vICogSGFuZGxlIGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzCi0gIC8vICogU2V0IHVw
IF9zdXBlciB3cmFwcGluZyBpZiBuZWNlc3NhcnkKLSAgLy8gKiBTZXQgdXAgY29tcHV0ZWQgcHJv
cGVydHkgZGVzY3JpcHRvcnMKLSAgLy8gKiBDb3B5aW5nIGB0b1N0cmluZ2AgaW4gYnJva2VuIGJy
b3dzZXJzCi0gIG1lcmdlTWl4aW5zKG1peGlucywgbWl4aW5zTWV0YShvYmopLCBkZXNjcywgdmFs
dWVzLCBvYmopOworICAgICAgICBpZiAodGltZXIubGVuZ3RoIDwgMykgeyByZXR1cm4gZmFsc2U7
IH0KIAotICBmb3Ioa2V5IGluIHZhbHVlcykgewotICAgIGlmIChrZXkgPT09ICdjb250cnVjdG9y
JyB8fCAhdmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KKyAgICAgICAg
aW5kZXggPSBmaW5kTWV0aG9kKHRpbWVyWzBdLCB0aW1lclsxXSk7CiAKLSAgICBkZXNjID0gZGVz
Y3Nba2V5XTsKLSAgICB2YWx1ZSA9IHZhbHVlc1trZXldOworICAgICAgICBpZihpbmRleCA+IC0x
KSB7CiAKLSAgICBpZiAoZGVzYyA9PT0gUkVRVUlSRUQpIHsgY29udGludWU7IH0KKyAgICAgICAg
ICBpdGVtID0gYXJyYXlbaW5kZXhdOwogCi0gICAgd2hpbGUgKGRlc2MgJiYgZGVzYyBpbnN0YW5j
ZW9mIEFsaWFzKSB7Ci0gICAgICB2YXIgZm9sbG93ZWQgPSBmb2xsb3dBbGlhcyhvYmosIGRlc2Ms
IG0sIGRlc2NzLCB2YWx1ZXMpOwotICAgICAgZGVzYyA9IGZvbGxvd2VkLmRlc2M7Ci0gICAgICB2
YWx1ZSA9IGZvbGxvd2VkLnZhbHVlOwotICAgIH0KKyAgICAgICAgICBpZihpdGVtWzJdID09PSB0
aW1lclsyXSl7CisgICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgICAg
ICAgY2xlYXJUaW1lb3V0KHRpbWVyWzJdKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiB2YWx1
ZSA9PT0gdW5kZWZpbmVkKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgIH0KIAotICAgIHJlcGxhY2VPYnNlcnZlcnMob2JqLCBrZXksIHZhbHVlKTsKLSAgICBkZXRl
Y3RCaW5kaW5nKG9iaiwga2V5LCB2YWx1ZSwgbSk7Ci0gICAgZGVmaW5lUHJvcGVydHkob2JqLCBr
ZXksIGRlc2MsIHZhbHVlLCBtKTsKLSAgfQorICAgIH07CiAKLSAgaWYgKCFwYXJ0aWFsKSB7IC8v
IGRvbid0IGFwcGx5IHRvIHByb3RvdHlwZQotICAgIGZpbmlzaFBhcnRpYWwob2JqLCBtKTsKLSAg
fQorICAgIEJhY2tidXJuZXIucHJvdG90eXBlLnNjaGVkdWxlID0gQmFja2J1cm5lci5wcm90b3R5
cGUuZGVmZXI7CisgICAgQmFja2J1cm5lci5wcm90b3R5cGUuc2NoZWR1bGVPbmNlID0gQmFja2J1
cm5lci5wcm90b3R5cGUuZGVmZXJPbmNlOworICAgIEJhY2tidXJuZXIucHJvdG90eXBlLmxhdGVy
ID0gQmFja2J1cm5lci5wcm90b3R5cGUuc2V0VGltZW91dDsKIAotICByZXR1cm4gb2JqOwotfQor
ICAgIGZ1bmN0aW9uIGNyZWF0ZUF1dG9ydW4oYmFja2J1cm5lcikgeworICAgICAgYmFja2J1cm5l
ci5iZWdpbigpOworICAgICAgYXV0b3J1biA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkg
eworICAgICAgICBhdXRvcnVuID0gbnVsbDsKKyAgICAgICAgYmFja2J1cm5lci5lbmQoKTsKKyAg
ICAgIH0pOworICAgIH0KIAotLyoqCi0gIEBtZXRob2QgbWl4aW4KLSAgQGZvciBFbWJlcgotICBA
cGFyYW0gb2JqCi0gIEBwYXJhbSBtaXhpbnMqCi0gIEByZXR1cm4gb2JqCi0qLwotRW1iZXIubWl4
aW4gPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRz
LCAxKTsKLSAgYXBwbHlNaXhpbihvYmosIGFyZ3MsIGZhbHNlKTsKLSAgcmV0dXJuIG9iajsKLX07
CisgICAgZnVuY3Rpb24gdXBkYXRlTGF0ZXJUaW1lcihzZWxmLCBleGVjdXRlQXQsIHdhaXQpIHsK
KyAgICAgIGlmICghbGF0ZXJUaW1lciB8fCBleGVjdXRlQXQgPCBsYXRlclRpbWVyRXhwaXJlc0F0
KSB7CisgICAgICAgIGlmIChsYXRlclRpbWVyKSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0KGxh
dGVyVGltZXIpOworICAgICAgICB9CisgICAgICAgIGxhdGVyVGltZXIgPSBnbG9iYWwuc2V0VGlt
ZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICBsYXRlclRpbWVyID0gbnVsbDsKKyAgICAgICAg
ICBsYXRlclRpbWVyRXhwaXJlc0F0ID0gbnVsbDsKKyAgICAgICAgICBleGVjdXRlVGltZXJzKHNl
bGYpOworICAgICAgICB9LCB3YWl0KTsKKyAgICAgICAgbGF0ZXJUaW1lckV4cGlyZXNBdCA9IGV4
ZWN1dGVBdDsKKyAgICAgIH0KKyAgICB9CiAKLS8qKgotICBUaGUgYEVtYmVyLk1peGluYCBjbGFz
cyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtaXhpbnMsIHdob3NlIHByb3BlcnRpZXMgY2FuIGJlCi0g
IGFkZGVkIHRvIG90aGVyIGNsYXNzZXMuIEZvciBpbnN0YW5jZSwKKyAgICBmdW5jdGlvbiBleGVj
dXRlVGltZXJzKHNlbGYpIHsKKyAgICAgIHZhciBub3cgPSArbmV3IERhdGUoKSwKKyAgICAgICAg
ICB0aW1lLCBmbnMsIGksIGw7CiAKLSAgYGBgamF2YXNjcmlwdAotICBBcHAuRWRpdGFibGUgPSBF
bWJlci5NaXhpbi5jcmVhdGUoewotICAgIGVkaXQ6IGZ1bmN0aW9uKCkgewotICAgICAgY29uc29s
ZS5sb2coJ3N0YXJ0aW5nIHRvIGVkaXQnKTsKLSAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcnLCB0
cnVlKTsKLSAgICB9LAotICAgIGlzRWRpdGluZzogZmFsc2UKLSAgfSk7CisgICAgICBzZWxmLnJ1
bihmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gVE9ETzogYmluYXJ5IHNlYXJjaAorICAgICAgICBm
b3IgKGkgPSAwLCBsID0gdGltZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgeworICAgICAgICAg
IHRpbWUgPSB0aW1lcnNbaV07CisgICAgICAgICAgaWYgKHRpbWUgPiBub3cpIHsgYnJlYWs7IH0K
KyAgICAgICAgfQogCi0gIC8vIE1peCBtaXhpbnMgaW50byBjbGFzc2VzIGJ5IHBhc3NpbmcgdGhl
bSBhcyB0aGUgZmlyc3QgYXJndW1lbnRzIHRvCi0gIC8vIC5leHRlbmQgb3IgLmNyZWF0ZS4KLSAg
QXBwLkNvbW1lbnRWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoQXBwLkVkaXRhYmxlLCB7Ci0gICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgne3sjaWYgaXNFZGl0aW5nfX0uLi57
e2Vsc2V9fS4uLnt7L2lmfX0nKQotICB9KTsKKyAgICAgICAgZm5zID0gdGltZXJzLnNwbGljZSgw
LCBpKTsKIAotICBjb21tZW50VmlldyA9IEFwcC5Db21tZW50Vmlldy5jcmVhdGUoKTsKLSAgY29t
bWVudFZpZXcuZWRpdCgpOyAvLyBvdXRwdXRzICdzdGFydGluZyB0byBlZGl0JwotICBgYGAKLQot
ICBOb3RlIHRoYXQgTWl4aW5zIGFyZSBjcmVhdGVkIHdpdGggYEVtYmVyLk1peGluLmNyZWF0ZWAs
IG5vdAotICBgRW1iZXIuTWl4aW4uZXh0ZW5kYC4KLQotICBAY2xhc3MgTWl4aW4KLSAgQG5hbWVz
cGFjZSBFbWJlcgotKi8KLUVtYmVyLk1peGluID0gZnVuY3Rpb24oKSB7IHJldHVybiBpbml0TWl4
aW4odGhpcywgYXJndW1lbnRzKTsgfTsKLQotTWl4aW4gPSBFbWJlci5NaXhpbjsKKyAgICAgICAg
Zm9yIChpID0gMSwgbCA9IGZucy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKKyAgICAgICAgICBz
ZWxmLnNjaGVkdWxlKHNlbGYub3B0aW9ucy5kZWZhdWx0UXVldWUsIG51bGwsIGZuc1tpXSk7Cisg
ICAgICAgIH0KKyAgICAgIH0pOwogCi1NaXhpbi5fYXBwbHkgPSBhcHBseU1peGluOworICAgICAg
aWYgKHRpbWVycy5sZW5ndGgpIHsKKyAgICAgICAgdXBkYXRlTGF0ZXJUaW1lcihzZWxmLCB0aW1l
cnNbMF0sIHRpbWVyc1swXSAtIG5vdyk7CisgICAgICB9CisgICAgfQogCi1NaXhpbi5hcHBseVBh
cnRpYWwgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1l
bnRzLCAxKTsKLSAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBhcmdzLCB0cnVlKTsKLX07CisgICAg
ZnVuY3Rpb24gZmluZERlYm91bmNlZSh0YXJnZXQsIG1ldGhvZCkgeworICAgICAgdmFyIGRlYm91
bmNlZSwKKyAgICAgICAgICBpbmRleCA9IC0xOwogCi1NaXhpbi5maW5pc2hQYXJ0aWFsID0gZmlu
aXNoUGFydGlhbDsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVib3VuY2Vlcy5sZW5ndGg7
IGkgPCBsOyBpKyspIHsKKyAgICAgICAgZGVib3VuY2VlID0gZGVib3VuY2Vlc1tpXTsKKyAgICAg
ICAgaWYgKGRlYm91bmNlZVswXSA9PT0gdGFyZ2V0ICYmIGRlYm91bmNlZVsxXSA9PT0gbWV0aG9k
KSB7CisgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICB9CiAKLUVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7CisgICAgICByZXR1
cm4gaW5kZXg7CisgICAgfQogCi0vKioKLSAgQG1ldGhvZCBjcmVhdGUKLSAgQHN0YXRpYwotICBA
cGFyYW0gYXJndW1lbnRzKgotKi8KLU1peGluLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICBFbWJl
ci5hbnlVbnByb2Nlc3NlZE1peGlucyA9IHRydWU7Ci0gIHZhciBNID0gdGhpczsKLSAgcmV0dXJu
IGluaXRNaXhpbihuZXcgTSgpLCBhcmd1bWVudHMpOwotfTsKKyAgICBmdW5jdGlvbiBmaW5kVGhy
b3R0bGVyKHRhcmdldCwgbWV0aG9kKSB7CisgICAgICB2YXIgdGhyb3R0bGVyLAorICAgICAgICAg
IGluZGV4ID0gLTE7CiAKLXZhciBNaXhpblByb3RvdHlwZSA9IE1peGluLnByb3RvdHlwZTsKKyAg
ICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhyb3R0bGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgICAgdGhyb3R0bGVyID0gdGhyb3R0bGVyc1tpXTsKKyAgICAgICAgaWYgKHRocm90dGxl
clswXSA9PT0gdGFyZ2V0ICYmIHRocm90dGxlclsxXSA9PT0gbWV0aG9kKSB7CisgICAgICAgICAg
aW5kZXggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CiAKLS8qKgot
ICBAbWV0aG9kIHJlb3BlbgotICBAcGFyYW0gYXJndW1lbnRzKgotKi8KLU1peGluUHJvdG90eXBl
LnJlb3BlbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgbWl4aW4sIHRtcDsKKyAgICAgIHJldHVybiBp
bmRleDsKKyAgICB9CiAKLSAgaWYgKHRoaXMucHJvcGVydGllcykgewotICAgIG1peGluID0gTWl4
aW4uY3JlYXRlKCk7Ci0gICAgbWl4aW4ucHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKLSAg
ICBkZWxldGUgdGhpcy5wcm9wZXJ0aWVzOwotICAgIHRoaXMubWl4aW5zID0gW21peGluXTsKLSAg
fSBlbHNlIGlmICghdGhpcy5taXhpbnMpIHsKLSAgICB0aGlzLm1peGlucyA9IFtdOwotICB9CiAK
LSAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1peGlucyA9IHRoaXMubWl4aW5zLCBpZHg7
CisgICAgX19leHBvcnRzX18uQmFja2J1cm5lciA9IEJhY2tidXJuZXI7CisgIH0pOworfSkoKTsK
IAotICBmb3IoaWR4PTA7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBtaXhpbiA9IGFyZ3VtZW50
c1tpZHhdOwotICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5j
ZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWl4aW4pLCB0eXBlb2Yg
bWl4aW4gPT09ICdvYmplY3QnICYmIG1peGluICE9PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUu
dG9TdHJpbmcuY2FsbChtaXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOwogCi0gICAgaWYgKG1p
eGluIGluc3RhbmNlb2YgTWl4aW4pIHsKLSAgICAgIG1peGlucy5wdXNoKG1peGluKTsKLSAgICB9
IGVsc2UgewotICAgICAgdG1wID0gTWl4aW4uY3JlYXRlKCk7Ci0gICAgICB0bXAucHJvcGVydGll
cyA9IG1peGluOwotICAgICAgbWl4aW5zLnB1c2godG1wKTsKLSAgICB9Ci0gIH0KIAotICByZXR1
cm4gdGhpczsKKyhmdW5jdGlvbigpIHsKK3ZhciBvbkJlZ2luID0gZnVuY3Rpb24oY3VycmVudCkg
eworICBFbWJlci5ydW4uY3VycmVudFJ1bkxvb3AgPSBjdXJyZW50OwogfTsKIAotLyoqCi0gIEBt
ZXRob2QgYXBwbHkKLSAgQHBhcmFtIG9iagotICBAcmV0dXJuIGFwcGxpZWQgb2JqZWN0Ci0qLwot
TWl4aW5Qcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbihvYmopIHsKLSAgcmV0dXJuIGFwcGx5TWl4
aW4ob2JqLCBbdGhpc10sIGZhbHNlKTsKK3ZhciBvbkVuZCA9IGZ1bmN0aW9uKGN1cnJlbnQsIG5l
eHQpIHsKKyAgRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gbmV4dDsKIH07CiAKLU1peGluUHJv
dG90eXBlLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uKG9iaikgewotICByZXR1cm4gYXBwbHlNaXhp
bihvYmosIFt0aGlzXSwgdHJ1ZSk7Ci19OwordmFyIEJhY2tidXJuZXIgPSByZXF1aXJlTW9kdWxl
KCdiYWNrYnVybmVyJykuQmFja2J1cm5lciwKKyAgICBiYWNrYnVybmVyID0gbmV3IEJhY2tidXJu
ZXIoWydzeW5jJywgJ2FjdGlvbnMnLCAnZGVzdHJveSddLCB7CisgICAgICBzeW5jOiB7CisgICAg
ICAgIGJlZm9yZTogRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMsCisgICAgICAgIGFmdGVyOiBF
bWJlci5lbmRQcm9wZXJ0eUNoYW5nZXMKKyAgICAgIH0sCisgICAgICBkZWZhdWx0UXVldWU6ICdh
Y3Rpb25zJywKKyAgICAgIG9uQmVnaW46IG9uQmVnaW4sCisgICAgICBvbkVuZDogb25FbmQKKyAg
ICB9KSwKKyAgICBzbGljZSA9IFtdLnNsaWNlOwogCi1mdW5jdGlvbiBfZGV0ZWN0KGN1ck1peGlu
LCB0YXJnZXRNaXhpbiwgc2VlbikgewotICB2YXIgZ3VpZCA9IGd1aWRGb3IoY3VyTWl4aW4pOwor
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgorLy8gRW1iZXIucnVuIC0gdGhpcyBpcyBpZGVhbGx5IHRoZSBvbmx5IHB1YmxpYyBBUEkg
dGhlIGRldiBzZWVzCisvLwogCi0gIGlmIChzZWVuW2d1aWRdKSB7IHJldHVybiBmYWxzZTsgfQot
ICBzZWVuW2d1aWRdID0gdHJ1ZTsKKy8qKgorICBSdW5zIHRoZSBwYXNzZWQgdGFyZ2V0IGFuZCBt
ZXRob2QgaW5zaWRlIG9mIGEgUnVuTG9vcCwgZW5zdXJpbmcgYW55CisgIGRlZmVycmVkIGFjdGlv
bnMgaW5jbHVkaW5nIGJpbmRpbmdzIGFuZCB2aWV3cyB1cGRhdGVzIGFyZSBmbHVzaGVkIGF0IHRo
ZQorICBlbmQuCiAKLSAgaWYgKGN1ck1peGluID09PSB0YXJnZXRNaXhpbikgeyByZXR1cm4gdHJ1
ZTsgfQotICB2YXIgbWl4aW5zID0gY3VyTWl4aW4ubWl4aW5zLCBsb2MgPSBtaXhpbnMgPyBtaXhp
bnMubGVuZ3RoIDogMDsKLSAgd2hpbGUgKC0tbG9jID49IDApIHsKLSAgICBpZiAoX2RldGVjdCht
aXhpbnNbbG9jXSwgdGFyZ2V0TWl4aW4sIHNlZW4pKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLSAg
cmV0dXJuIGZhbHNlOwotfQorICBOb3JtYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGludm9r
ZSB0aGlzIG1ldGhvZCB5b3Vyc2VsZi4gSG93ZXZlciBpZgorICB5b3UgYXJlIGltcGxlbWVudGlu
ZyByYXcgZXZlbnQgaGFuZGxlcnMgd2hlbiBpbnRlcmZhY2luZyB3aXRoIG90aGVyCisgIGxpYnJh
cmllcyBvciBwbHVnaW5zLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHdyYXAgYWxsIG9mIHlvdXIgY29k
ZSBpbnNpZGUgdGhpcworICBjYWxsLgogCi0vKioKLSAgQG1ldGhvZCBkZXRlY3QKLSAgQHBhcmFt
IG9iagotICBAcmV0dXJuIHtCb29sZWFufQorICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLnJ1bihm
dW5jdGlvbigpIHsKKyAgICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcAor
ICB9KTsKKyAgYGBgCisKKyAgQGNsYXNzIHJ1bgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzdGF0
aWMKKyAgQGNvbnN0cnVjdG9yCisgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2Yg
bWV0aG9kIHRvIGNhbGwKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRob2Qg
dG8gaW52b2tlLgorICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFz
cyBhIHN0cmluZworICAgIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0
YXJnZXQuCisgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50
cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgIEByZXR1cm4ge09iamVjdH0gcmV0
dXJuIHZhbHVlIGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4KICovCi1NaXhpblBy
b3RvdHlwZS5kZXRlY3QgPSBmdW5jdGlvbihvYmopIHsKLSAgaWYgKCFvYmopIHsgcmV0dXJuIGZh
bHNlOyB9Ci0gIGlmIChvYmogaW5zdGFuY2VvZiBNaXhpbikgeyByZXR1cm4gX2RldGVjdChvYmos
IHRoaXMsIHt9KTsgfQotICB2YXIgbWl4aW5zID0gRW1iZXIubWV0YShvYmosIGZhbHNlKS5taXhp
bnM7Ci0gIGlmIChtaXhpbnMpIHsKLSAgICByZXR1cm4gISFtaXhpbnNbZ3VpZEZvcih0aGlzKV07
CitFbWJlci5ydW4gPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgeworICB2YXIgcmV0OworCisg
IGlmIChFbWJlci5vbmVycm9yKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldCA9IGJhY2tidXJuZXIu
cnVuLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7CisgICAgfSBjYXRjaCAoZSkgeworICAg
ICAgRW1iZXIub25lcnJvcihlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0ID0gYmFja2J1
cm5lci5ydW4uYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKICAgfQotICByZXR1cm4gZmFs
c2U7Ci19OwogCi1NaXhpblByb3RvdHlwZS53aXRob3V0ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBy
ZXQgPSBuZXcgTWl4aW4odGhpcyk7Ci0gIHJldC5fd2l0aG91dCA9IGFfc2xpY2UuY2FsbChhcmd1
bWVudHMpOwogICByZXR1cm4gcmV0OwogfTsKIAotZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwg
c2VlbikgewotICBpZiAoc2VlbltndWlkRm9yKG1peGluKV0pIHsgcmV0dXJuOyB9Ci0gIHNlZW5b
Z3VpZEZvcihtaXhpbildID0gdHJ1ZTsKKy8qKgorICBJZiBubyBydW4tbG9vcCBpcyBwcmVzZW50
LCBpdCBjcmVhdGVzIGEgbmV3IG9uZS4gSWYgYSBydW4gbG9vcCBpcworICBwcmVzZW50IGl0IHdp
bGwgcXVldWUgaXRzZWxmIHRvIHJ1biBvbiB0aGUgZXhpc3RpbmcgcnVuLWxvb3BzIGFjdGlvbgor
ICBxdWV1ZS4KIAotICBpZiAobWl4aW4ucHJvcGVydGllcykgewotICAgIHZhciBwcm9wcyA9IG1p
eGluLnByb3BlcnRpZXM7Ci0gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7Ci0gICAgICBpZiAo
cHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyByZXRba2V5XSA9IHRydWU7IH0KLSAgICB9Ci0g
IH0gZWxzZSBpZiAobWl4aW4ubWl4aW5zKSB7Ci0gICAgYV9mb3JFYWNoLmNhbGwobWl4aW4ubWl4
aW5zLCBmdW5jdGlvbih4KSB7IF9rZXlzKHJldCwgeCwgc2Vlbik7IH0pOwotICB9Ci19CisgIFBs
ZWFzZSBub3RlOiBUaGlzIGlzIG5vdCBmb3Igbm9ybWFsIHVzYWdlLCBhbmQgc2hvdWxkIGJlIHVz
ZWQgc3BhcmluZ2x5LgogCi1NaXhpblByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7Ci0gIHZh
ciBrZXlzID0ge30sIHNlZW4gPSB7fSwgcmV0ID0gW107Ci0gIF9rZXlzKGtleXMsIHRoaXMsIHNl
ZW4pOwotICBmb3IodmFyIGtleSBpbiBrZXlzKSB7Ci0gICAgaWYgKGtleXMuaGFzT3duUHJvcGVy
dHkoa2V5KSkgeyByZXQucHVzaChrZXkpOyB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX07CisgIElm
IGludm9rZWQgd2hlbiBub3Qgd2l0aGluIGEgcnVuIGxvb3A6CiAKLS8vIHJldHVybnMgdGhlIG1p
eGlucyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdAotLy8gVE9ETzog
TWFrZSBFbWJlci5taXhpbgotTWl4aW4ubWl4aW5zID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHZhciBt
aXhpbnMgPSBFbWJlci5tZXRhKG9iaiwgZmFsc2UpLm1peGlucywgcmV0ID0gW107CisgIGBgYGph
dmFzY3JpcHQKKyAgRW1iZXIucnVuLmpvaW4oZnVuY3Rpb24oKSB7CisgICAgLy8gY3JlYXRlcyBh
IG5ldyBydW4tbG9vcAorICB9KTsKKyAgYGBgCiAKLSAgaWYgKCFtaXhpbnMpIHsgcmV0dXJuIHJl
dDsgfQorICBBbHRlcm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGluIGFuIGV4aXN0aW5nIHJ1biBs
b29wOgogCi0gIGZvciAodmFyIGtleSBpbiBtaXhpbnMpIHsKLSAgICB2YXIgbWl4aW4gPSBtaXhp
bnNba2V5XTsKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7CisgICAg
Ly8gY3JlYXRlcyBhIG5ldyBydW4tbG9vcAorICAgIEVtYmVyLnJ1bi5qb2luKGZ1bmN0aW9uKCkg
eworICAgICAgLy8gam9pbnMgd2l0aCB0aGUgZXhpc3RpbmcgcnVuLWxvb3AsIGFuZCBxdWV1ZXMg
Zm9yIGludm9jYXRpb24gb24KKyAgICAgIC8vIHRoZSBleGlzdGluZyBydW4tbG9vcHMgYWN0aW9u
IHF1ZXVlLgorICAgIH0pOworICB9KTsKKyAgYGBgCiAKLSAgICAvLyBza2lwIHByaW1pdGl2ZSBt
aXhpbnMgc2luY2UgdGhlc2UgYXJlIGFsd2F5cyBhbm9ueW1vdXMKLSAgICBpZiAoIW1peGluLnBy
b3BlcnRpZXMpIHsgcmV0LnB1c2gobWl4aW4pOyB9CisgIEBtZXRob2Qgam9pbgorICBAbmFtZXNw
YWNlIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRv
IGNhbGwKKyAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gaW52b2tl
LgorICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmlu
ZworICAgIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0YXJnZXQuCisg
IEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB5b3Ugd2lz
aCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgIEByZXR1cm4ge09iamVjdH0gUmV0dXJuIHZhbHVl
IGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4gUGxlYXNlIG5vdGUsCisgIHdoZW4g
Y2FsbGVkIHdpdGhpbiBhbiBleGlzdGluZyBsb29wLCBubyByZXR1cm4gdmFsdWUgaXMgcG9zc2li
bGUuCisqLworRW1iZXIucnVuLmpvaW4gPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgeworICBp
ZiAoIUVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCkgeworICAgIHJldHVybiBFbWJlci5ydW4uYXBw
bHkoRW1iZXIucnVuLCBhcmd1bWVudHMpOwogICB9CiAKLSAgcmV0dXJuIHJldDsKKyAgdmFyIGFy
Z3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgIGFyZ3MudW5zaGlmdCgnYWN0aW9ucycpOwor
ICBFbWJlci5ydW4uc2NoZWR1bGUuYXBwbHkoRW1iZXIucnVuLCBhcmdzKTsKIH07CiAKLVJFUVVJ
UkVEID0gbmV3IEVtYmVyLkRlc2NyaXB0b3IoKTsKLVJFUVVJUkVELnRvU3RyaW5nID0gZnVuY3Rp
b24oKSB7IHJldHVybiAnKFJlcXVpcmVkIFByb3BlcnR5KSc7IH07CitFbWJlci5ydW4uYmFja2J1
cm5lciA9IGJhY2tidXJuZXI7CiAKLS8qKgotICBEZW5vdGVzIGEgcmVxdWlyZWQgcHJvcGVydHkg
Zm9yIGEgbWl4aW4KK3ZhciBydW4gPSBFbWJlci5ydW47CiAKLSAgQG1ldGhvZCByZXF1aXJlZAot
ICBAZm9yIEVtYmVyCi0qLwotRW1iZXIucmVxdWlyZWQgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJu
IFJFUVVJUkVEOwotfTsKK0VtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCA9IG51bGw7CiAKLUFsaWFz
ID0gZnVuY3Rpb24obWV0aG9kTmFtZSkgewotICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1l
OwotfTsKLUFsaWFzLnByb3RvdHlwZSA9IG5ldyBFbWJlci5EZXNjcmlwdG9yKCk7CitFbWJlci5y
dW4ucXVldWVzID0gYmFja2J1cm5lci5xdWV1ZU5hbWVzOwogCiAvKioKLSAgTWFrZXMgYSBwcm9w
ZXJ0eSBvciBtZXRob2QgYXZhaWxhYmxlIHZpYSBhbiBhZGRpdGlvbmFsIG5hbWUuCisgIEJlZ2lu
cyBhIG5ldyBSdW5Mb29wLiBBbnkgZGVmZXJyZWQgYWN0aW9ucyBpbnZva2VkIGFmdGVyIHRoZSBi
ZWdpbiB3aWxsCisgIGJlIGJ1ZmZlcmVkIHVudGlsIHlvdSBpbnZva2UgYSBtYXRjaGluZyBjYWxs
IHRvIGBFbWJlci5ydW4uZW5kKClgLiBUaGlzIGlzCisgIGEgbG93ZXItbGV2ZWwgd2F5IHRvIHVz
ZSBhIFJ1bkxvb3AgaW5zdGVhZCBvZiB1c2luZyBgRW1iZXIucnVuKClgLgogCiAgIGBgYGphdmFz
Y3JpcHQKLSAgQXBwLlBhaW50U2FtcGxlID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgY29s
b3I6ICdyZWQnLAotICAgIGNvbG91cjogRW1iZXIuYWxpYXMoJ2NvbG9yJyksCi0gICAgbmFtZTog
ZnVuY3Rpb24oKXsKLSAgICAgIHJldHVybiAiWmVkIjsKLSAgICB9LAotICAgIG1vbmlrZXI6IEVt
YmVyLmFsaWFzKCJuYW1lIikKLSAgfSk7Ci0KLSAgdmFyIHBhaW50U2FtcGxlID0gQXBwLlBhaW50
U2FtcGxlLmNyZWF0ZSgpCi0gIHBhaW50U2FtcGxlLmdldCgnY29sb3VyJyk7ICAvLyAncmVkJwot
ICBwYWludFNhbXBsZS5tb25pa2VyKCk7ICAgICAgLy8gJ1plZCcKKyAgRW1iZXIucnVuLmJlZ2lu
KCk7CisgIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wCisgIEVtYmVyLnJ1
bi5lbmQoKTsKICAgYGBgCiAKLSAgQG1ldGhvZCBhbGlhcwotICBAZm9yIEVtYmVyCi0gIEBwYXJh
bSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCBvciBwcm9wZXJ0eSB0byBh
bGlhcwotICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotICBAZGVwcmVjYXRlZCBVc2UgYEVt
YmVyLmFsaWFzTWV0aG9kYCBvciBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgIGluc3RlYWQKKyAgQG1l
dGhvZCBiZWdpbgorICBAcmV0dXJuIHt2b2lkfQogKi8KLUVtYmVyLmFsaWFzID0gZnVuY3Rpb24o
bWV0aG9kTmFtZSkgewotICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOworRW1iZXIucnVu
LmJlZ2luID0gZnVuY3Rpb24oKSB7CisgIGJhY2tidXJuZXIuYmVnaW4oKTsKIH07CiAKLUVtYmVy
LmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLmFsaWFzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRW1i
ZXIuYWxpYXNNZXRob2Qgb3IgRW1iZXIuY29tcHV0ZWQuYWxpYXMgaW5zdGVhZC4iLCBFbWJlci5h
bGlhcyk7Ci0KIC8qKgotICBNYWtlcyBhIG1ldGhvZCBhdmFpbGFibGUgdmlhIGFuIGFkZGl0aW9u
YWwgbmFtZS4KKyAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBjYWxsZWQgc29tZXRpbWUg
YWZ0ZXIgeW91IGNhbGwKKyAgYEVtYmVyLnJ1bi5iZWdpbigpYCB0byBmbHVzaCBhbnkgZGVmZXJy
ZWQgYWN0aW9ucy4gVGhpcyBpcyBhIGxvd2VyLWxldmVsIHdheQorICB0byB1c2UgYSBSdW5Mb29w
IGluc3RlYWQgb2YgdXNpbmcgYEVtYmVyLnJ1bigpYC4KIAogICBgYGBqYXZhc2NyaXB0Ci0gIEFw
cC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBuYW1lOiBmdW5jdGlvbigpewot
ICAgICAgcmV0dXJuICdUb21odWRhIEthdHpkYWxlJzsKLSAgICB9LAotICAgIG1vbmlrZXI6IEVt
YmVyLmFsaWFzTWV0aG9kKCduYW1lJykKLSAgfSk7Ci0KLSAgdmFyIGdvb2RHdXkgPSBBcHAuUGVy
c29uLmNyZWF0ZSgpCisgIEVtYmVyLnJ1bi5iZWdpbigpOworICAvLyBjb2RlIHRvIGJlIGV4ZWN1
dGUgd2l0aGluIGEgUnVuTG9vcAorICBFbWJlci5ydW4uZW5kKCk7CiAgIGBgYAogCi0gIEBtZXRo
b2QgYWxpYXNNZXRob2QKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFt
ZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYWxpYXMKLSAgQHJldHVybiB7RW1iZXIuRGVzY3JpcHRv
cn0KKyAgQG1ldGhvZCBlbmQKKyAgQHJldHVybiB7dm9pZH0KICovCi1FbWJlci5hbGlhc01ldGhv
ZCA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgcmV0dXJuIG5ldyBBbGlhcyhtZXRob2ROYW1l
KTsKK0VtYmVyLnJ1bi5lbmQgPSBmdW5jdGlvbigpIHsKKyAgYmFja2J1cm5lci5lbmQoKTsKIH07
CiAKLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLS8vIE9CU0VSVkVSIEhFTFBFUgotLy8KLQogLyoqCi0gIEBtZXRob2Qgb2JzZXJ2
ZXIKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCi0gIEBwYXJhbSB7U3Ry
aW5nfSBwcm9wZXJ0eU5hbWVzKgotICBAcmV0dXJuIGZ1bmMKKyAgQXJyYXkgb2YgbmFtZWQgcXVl
dWVzLiBUaGlzIGFycmF5IGRldGVybWluZXMgdGhlIG9yZGVyIGluIHdoaWNoIHF1ZXVlcworICBh
cmUgZmx1c2hlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBZb3UgY2FuIGRlZmluZSB5b3Vy
IG93biBxdWV1ZXMgYnkKKyAgc2ltcGx5IGFkZGluZyB0aGUgcXVldWUgbmFtZSB0byB0aGlzIGFy
cmF5LiBOb3JtYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkCisgIHRvIGluc3BlY3Qgb3IgbW9kaWZ5
IHRoaXMgcHJvcGVydHkuCisKKyAgQHByb3BlcnR5IHF1ZXVlcworICBAdHlwZSBBcnJheQorICBA
ZGVmYXVsdCBbJ3N5bmMnLCAnYWN0aW9ucycsICdkZXN0cm95J10KICovCi1FbWJlci5vYnNlcnZl
ciA9IGZ1bmN0aW9uKGZ1bmMpIHsKLSAgdmFyIHBhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50
cywgMSk7Ci0gIGZ1bmMuX19lbWJlcl9vYnNlcnZlc19fID0gcGF0aHM7Ci0gIHJldHVybiBmdW5j
OwotfTsKIAotLy8gSWYgb2JzZXJ2ZXJzIGV2ZXIgYmVjb21lIGFzeW5jaHJvbm91cywgRW1iZXIu
aW1tZWRpYXRlT2JzZXJ2ZXIKLS8vIG11c3QgcmVtYWluIHN5bmNocm9ub3VzLgogLyoqCi0gIEBt
ZXRob2QgaW1tZWRpYXRlT2JzZXJ2ZXIKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jCi0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWVzKgotICBAcmV0dXJuIGZ1bmMK
KyAgQWRkcyB0aGUgcGFzc2VkIHRhcmdldC9tZXRob2QgYW5kIGFueSBvcHRpb25hbCBhcmd1bWVu
dHMgdG8gdGhlIG5hbWVkCisgIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhl
IFJ1bkxvb3AuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5CisgIHN0YXJ0ZWQgYSBSdW5Mb29wIHdo
ZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UKKyAgYXV0
b21hdGljYWxseS4KKworICBBdCB0aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMgc2No
ZWR1bGVkIGluIHRoaXMgd2F5IHdpbGwgYmUgaW52b2tlZC4KKyAgTWV0aG9kcyB3aWxsIGJlIGlu
dm9rZWQgaW4gYW4gb3JkZXIgbWF0Y2hpbmcgdGhlIG5hbWVkIHF1ZXVlcyBkZWZpbmVkIGluCisg
IHRoZSBgRW1iZXIucnVuLnF1ZXVlc2AgcHJvcGVydHkuCisKKyAgYGBgamF2YXNjcmlwdAorICBF
bWJlci5ydW4uc2NoZWR1bGUoJ3N5bmMnLCB0aGlzLCBmdW5jdGlvbigpIHsKKyAgICAvLyB0aGlz
IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4gYmluZGlu
Z3MgYXJlIHN5bmNlZAorICAgIGNvbnNvbGUubG9nKCJzY2hlZHVsZWQgb24gc3luYyBxdWV1ZSIp
OworICB9KTsKKworICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlv
bigpIHsKKyAgICAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlICdhY3Rpb25zJyBxdWV1
ZSwgYWZ0ZXIgYmluZGluZ3MgaGF2ZSBzeW5jZWQuCisgICAgY29uc29sZS5sb2coInNjaGVkdWxl
ZCBvbiBhY3Rpb25zIHF1ZXVlIik7CisgIH0pOworCisgIC8vIE5vdGUgdGhlIGZ1bmN0aW9ucyB3
aWxsIGJlIHJ1biBpbiBvcmRlciBiYXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4KKyAgLy8g
T3V0cHV0IHdvdWxkIGJlOgorICAvLyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlCisgIC8vICAg
c2NoZWR1bGVkIG9uIGFjdGlvbnMgcXVldWUKKyAgYGBgCisKKyAgQG1ldGhvZCBzY2hlZHVsZQor
ICBAcGFyYW0ge1N0cmluZ30gcXVldWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIHNjaGVkdWxl
IGFnYWluc3QuCisgICAgRGVmYXVsdCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlvbnMnCisg
IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgY29u
dGV4dCB3aGVuIGludm9raW5nIGEgbWV0aG9kLgorICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0g
bWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLiBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdAorICAg
IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIHRpbWUgdGhlIHNj
aGVkdWxlZCBpdGVtIGlzCisgICAgaW52b2tlZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0
YXJnZXQgZnVuY3Rpb24uCisgIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzKl0gT3B0aW9uYWwg
YXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVldWVkIG1ldGhvZC4KKyAgQHJldHVybiB7
dm9pZH0KICovCi1FbWJlci5pbW1lZGlhdGVPYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICBmb3Ig
KHZhciBpPTAsIGw9YXJndW1lbnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICB2YXIgYXJnID0g
YXJndW1lbnRzW2ldOwotICAgIEVtYmVyLmFzc2VydCgiSW1tZWRpYXRlIG9ic2VydmVycyBtdXN0
IG9ic2VydmUgaW50ZXJuYWwgcHJvcGVydGllcyBvbmx5LCBub3QgcHJvcGVydGllcyBvbiBvdGhl
ciBvYmplY3RzLiIsIHR5cGVvZiBhcmcgIT09ICJzdHJpbmciIHx8IGFyZy5pbmRleE9mKCcuJykg
PT09IC0xKTsKLSAgfQorRW1iZXIucnVuLnNjaGVkdWxlID0gZnVuY3Rpb24ocXVldWUsIHRhcmdl
dCwgbWV0aG9kKSB7CisgIGNoZWNrQXV0b1J1bigpOworICBiYWNrYnVybmVyLnNjaGVkdWxlLmFw
cGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7Cit9OwogCi0gIHJldHVybiBFbWJlci5vYnNlcnZl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworLy8gVXNlZCBieSBnbG9iYWwgdGVzdCB0ZWFyZG93
bgorRW1iZXIucnVuLmhhc1NjaGVkdWxlZFRpbWVycyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4g
YmFja2J1cm5lci5oYXNUaW1lcnMoKTsKK307CisKKy8vIFVzZWQgYnkgZ2xvYmFsIHRlc3QgdGVh
cmRvd24KK0VtYmVyLnJ1bi5jYW5jZWxUaW1lcnMgPSBmdW5jdGlvbiAoKSB7CisgIGJhY2tidXJu
ZXIuY2FuY2VsVGltZXJzKCk7CiB9OwogCiAvKioKLSAgQG1ldGhvZCBiZWZvcmVPYnNlcnZlcgot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKLSAgQHBhcmFtIHtTdHJpbmd9
IHByb3BlcnR5TmFtZXMqCi0gIEByZXR1cm4gZnVuYworICBJbW1lZGlhdGVseSBmbHVzaGVzIGFu
eSBldmVudHMgc2NoZWR1bGVkIGluIHRoZSAnc3luYycgcXVldWUuIEJpbmRpbmdzCisgIHVzZSB0
aGlzIHF1ZXVlIHNvIHRoaXMgbWV0aG9kIGlzIGEgdXNlZnVsIHdheSB0byBpbW1lZGlhdGVseSBm
b3JjZSBhbGwKKyAgYmluZGluZ3MgaW4gdGhlIGFwcGxpY2F0aW9uIHRvIHN5bmMuCisKKyAgWW91
IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGFueXRpbWUgeW91IG5lZWQgYW55IGNoYW5nZWQgc3Rh
dGUgdG8gcHJvcGFnYXRlCisgIHRocm91Z2hvdXQgdGhlIGFwcCBpbW1lZGlhdGVseSB3aXRob3V0
IHJlcGFpbnRpbmcgdGhlIFVJICh3aGljaCBoYXBwZW5zCisgIGluIHRoZSBsYXRlciAncmVuZGVy
JyBxdWV1ZSBhZGRlZCBieSB0aGUgYGVtYmVyLXZpZXdzYCBwYWNrYWdlKS4KKworICBgYGBqYXZh
c2NyaXB0CisgIEVtYmVyLnJ1bi5zeW5jKCk7CisgIGBgYAorCisgIEBtZXRob2Qgc3luYworICBA
cmV0dXJuIHt2b2lkfQogKi8KLUVtYmVyLmJlZm9yZU9ic2VydmVyID0gZnVuY3Rpb24oZnVuYykg
ewotICB2YXIgcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgZnVuYy5fX2Vt
YmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsKLSAgcmV0dXJuIGZ1bmM7CitFbWJlci5ydW4u
c3luYyA9IGZ1bmN0aW9uKCkgeworICBpZiAoYmFja2J1cm5lci5jdXJyZW50SW5zdGFuY2UpIHsK
KyAgICBiYWNrYnVybmVyLmN1cnJlbnRJbnN0YW5jZS5xdWV1ZXMuc3luYy5mbHVzaCgpOworICB9
CiB9OwogCi19KSgpOworLyoqCisgIEludm9rZXMgdGhlIHBhc3NlZCB0YXJnZXQvbWV0aG9kIGFu
ZCBvcHRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgYSBzcGVjaWZpZWQKKyAgcGVyaW9kIGlmIHRpbWUu
IFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBhIG51bWJl
cgorICBvZiBtaWxsaXNlY29uZHMuCiAKKyAgWW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hl
bmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUgYWN0aW9uIGFmdGVyIGEKKyAgcGVyaW9kIG9mIHRp
bWUgaW5zdGVhZCBvZiB1c2luZyBgc2V0VGltZW91dCgpYC4gVGhpcyBtZXRob2Qgd2lsbCBlbnN1
cmUgdGhhdAorICBpdGVtcyB0aGF0IGV4cGlyZSBkdXJpbmcgdGhlIHNhbWUgc2NyaXB0IGV4ZWN1
dGlvbiBjeWNsZSBhbGwgZXhlY3V0ZQorICB0b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9yZSBl
ZmZpY2llbnQgdGhhbiB1c2luZyBhIHJlYWwgc2V0VGltZW91dC4KIAorICBgYGBqYXZhc2NyaXB0
CisgIEVtYmVyLnJ1bi5sYXRlcihteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgIC8vIGNvZGUg
aGVyZSB3aWxsIGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcCBpbiBhYm91dCA1MDBtcyB3aXRoIHRo
aXMgPT0gbXlDb250ZXh0CisgIH0sIDUwMCk7CisgIGBgYAorCisgIEBtZXRob2QgbGF0ZXIKKyAg
QHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCisgIEBw
YXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAg
SWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKKyAgICB0YXJn
ZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICBAcGFyYW0ge09iamVjdH0g
W2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAgQHBh
cmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LgorICBAcmV0
dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHlvdSBjYW4gdXNlIHRvIGNhbmNlbCB0aGUgdGltZXIgaW4K
KyAgICBgRW1iZXIucnVuLmNhbmNlbGAgbGF0ZXIuCisqLworRW1iZXIucnVuLmxhdGVyID0gZnVu
Y3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKKyAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBwbHko
YmFja2J1cm5lciwgYXJndW1lbnRzKTsKK307CiAKLShmdW5jdGlvbigpIHsKIC8qKgotRW1iZXIg
TWV0YWwKKyAgU2NoZWR1bGUgYSBmdW5jdGlvbiB0byBydW4gb25lIHRpbWUgZHVyaW5nIHRoZSBj
dXJyZW50IFJ1bkxvb3AuIFRoaXMgaXMgZXF1aXZhbGVudAorICB0byBjYWxsaW5nIGBzY2hlZHVs
ZU9uY2VgIHdpdGggdGhlICJhY3Rpb25zIiBxdWV1ZS4KIAotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1tZXRhbAorICBAbWV0aG9kIG9uY2UKKyAgQHBhcmFtIHtPYmplY3R9IFt0YXJn
ZXRdIFRoZSB0YXJnZXQgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuCisgIEBwYXJhbSB7RnVuY3Rp
b258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgSWYgeW91IHBhc3Mg
YSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKKyAgICB0YXJnZXQgYXQgdGhlIHRp
bWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRp
b25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAgQHJldHVybiB7T2JqZWN0
fSB0aW1lcgogKi8KK0VtYmVyLnJ1bi5vbmNlID0gZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsK
KyAgY2hlY2tBdXRvUnVuKCk7CisgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwor
ICBhcmdzLnVuc2hpZnQoJ2FjdGlvbnMnKTsKKyAgcmV0dXJuIGJhY2tidXJuZXIuc2NoZWR1bGVP
bmNlLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3MpOworfTsKIAotfSkoKTsKKy8qKgorICBTY2hlZHVs
ZXMgYSBmdW5jdGlvbiB0byBydW4gb25lIHRpbWUgaW4gYSBnaXZlbiBxdWV1ZSBvZiB0aGUgY3Vy
cmVudCBSdW5Mb29wLgorICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUgcXVldWUv
dGFyZ2V0L21ldGhvZCBjb21iaW5hdGlvbiB3aWxsIGhhdmUKKyAgbm8gZWZmZWN0IChwYXN0IHRo
ZSBpbml0aWFsIGNhbGwpLgogCi0oZnVuY3Rpb24oKSB7Ci1kZWZpbmUoInJzdnAiLAotICBbXSwK
LSAgZnVuY3Rpb24oKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBicm93c2VyR2xvYmFs
ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdyA6IHt9OworICBOb3Rl
IHRoYXQgYWx0aG91Z2ggeW91IGNhbiBwYXNzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGVzZSB3aWxs
IG5vdCBiZQorICBjb25zaWRlcmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4gTmV3IGFy
Z3VtZW50cyB3aWxsIHJlcGxhY2UgcHJldmlvdXMKKyAgY2FsbHMuCiAKLSAgICB2YXIgTXV0YXRp
b25PYnNlcnZlciA9IGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xv
YmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7Ci0gICAgdmFyIFJTVlAsIGFzeW5jOworICBgYGBq
YXZhc2NyaXB0CisgIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKKyAgICB2YXIgc2F5SGkgPSBmdW5j
dGlvbigpIHsgY29uc29sZS5sb2coJ2hpJyk7IH0KKyAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNl
KCdhZnRlclJlbmRlcicsIG15Q29udGV4dCwgc2F5SGkpOworICAgIEVtYmVyLnJ1bi5zY2hlZHVs
ZU9uY2UoJ2FmdGVyUmVuZGVyJywgbXlDb250ZXh0LCBzYXlIaSk7CisgICAgLy8gc2F5SGkgd2ls
bCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UsIGluIHRoZSBhZnRlclJlbmRlciBxdWV1ZSBvZiB0aGUg
UnVuTG9vcAorICB9KTsKKyAgYGBgCiAKLSAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRl
ZmluZWQnICYmCi0gICAgICB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBw
cm9jZXNzXScpIHsKLSAgICAgIGFzeW5jID0gZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsK
LSAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKLSAgICAgICAgICBjYWxsYmFj
ay5jYWxsKGJpbmRpbmcpOwotICAgICAgICB9KTsKLSAgICAgIH07Ci0gICAgfSBlbHNlIGlmIChN
dXRhdGlvbk9ic2VydmVyKSB7Ci0gICAgICB2YXIgcXVldWUgPSBbXTsKKyAgQWxzbyBub3RlIHRo
YXQgcGFzc2luZyBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gdG8gYEVtYmVyLnJ1bi5zY2hlZHVsZU9u
Y2VgIHdpbGwKKyAgbm90IHByZXZlbnQgYWRkaXRpb25hbCBjYWxscyB3aXRoIGFuIGlkZW50aWNh
bCBhbm9ueW1vdXMgZnVuY3Rpb24gZnJvbQorICBzY2hlZHVsaW5nIHRoZSBpdGVtcyBtdWx0aXBs
ZSB0aW1lcywgZS5nLjoKIAotICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2
ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciB0b1Byb2Nlc3MgPSBxdWV1ZS5zbGljZSgpOwot
ICAgICAgICBxdWV1ZSA9IFtdOworICBgYGBqYXZhc2NyaXB0CisgIGZ1bmN0aW9uIHNjaGVkdWxl
SXQoKSB7CisgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgnYWN0aW9ucycsIG15Q29udGV4dCwg
ZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCJDbG9zdXJlIik7IH0pOworICB9CisgIHNjaGVkdWxl
SXQoKTsKKyAgc2NoZWR1bGVJdCgpOworICAvLyAiQ2xvc3VyZSIgd2lsbCBwcmludCB0d2ljZSwg
ZXZlbiB0aG91Z2ggd2UncmUgdXNpbmcgYEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2VgLAorICAvLyBi
ZWNhdXNlIHRoZSBmdW5jdGlvbiB3ZSBwYXNzIHRvIGl0IGlzIGFub255bW91cyBhbmQgd29uJ3Qg
bWF0Y2ggdGhlCisgIC8vIHByZXZpb3VzbHkgc2NoZWR1bGVkIG9wZXJhdGlvbi4KKyAgYGBgCiAK
LSAgICAgICAgdG9Qcm9jZXNzLmZvckVhY2goZnVuY3Rpb24odHVwbGUpIHsKLSAgICAgICAgICB2
YXIgY2FsbGJhY2sgPSB0dXBsZVswXSwgYmluZGluZyA9IHR1cGxlWzFdOwotICAgICAgICAgIGNh
bGxiYWNrLmNhbGwoYmluZGluZyk7Ci0gICAgICAgIH0pOwotICAgICAgfSk7CisgIEF2YWlsYWJs
ZSBxdWV1ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZvdW5kIGF0IGBFbWJlci5ydW4ucXVl
dWVzYAogCi0gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp
OwotICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7
CisgIEBtZXRob2Qgc2NoZWR1bGVPbmNlCisgIEBwYXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBu
YW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBhZ2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUg
J3N5bmMnIGFuZCAnYWN0aW9ucycuCisgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFy
Z2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgorICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30g
bWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0
IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCisgICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRo
b2QgaXMgaW52b2tlZC4KKyAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1l
bnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCisgIEByZXR1cm4ge09iamVjdH0gdGltZXIKKyov
CitFbWJlci5ydW4uc2NoZWR1bGVPbmNlID0gZnVuY3Rpb24ocXVldWUsIHRhcmdldCwgbWV0aG9k
KSB7CisgIGNoZWNrQXV0b1J1bigpOworICByZXR1cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2Uu
YXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKK307CiAKLSAgICAgIC8vIENocm9tZSBNZW1v
cnkgTGVhazogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkzNjYxCi0g
ICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgZnVuY3Rpb24oKXsKLSAgICAg
ICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwotICAgICAgICBvYnNlcnZlciA9IG51bGw7Ci0gICAg
ICB9KTsKKy8qKgorICBTY2hlZHVsZXMgYW4gaXRlbSB0byBydW4gZnJvbSB3aXRoaW4gYSBzZXBh
cmF0ZSBydW4gbG9vcCwgYWZ0ZXIKKyAgY29udHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUg
c3lzdGVtLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICBgRW1iZXIucnVuLmxhdGVy
YCB3aXRoIGEgd2FpdCB0aW1lIG9mIDFtcy4KIAotICAgICAgYXN5bmMgPSBmdW5jdGlvbihjYWxs
YmFjaywgYmluZGluZykgewotICAgICAgICBxdWV1ZS5wdXNoKFtjYWxsYmFjaywgYmluZGluZ10p
OwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJhaW5RdWV1ZScsICdkcmFpblF1ZXVl
Jyk7Ci0gICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3luYyA9IGZ1bmN0aW9uKGNhbGxi
YWNrLCBiaW5kaW5nKSB7Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKLSAgICAgICAgfSwgMSk7Ci0gICAgICB9OwotICAg
IH0KKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5ydW4ubmV4dChteUNvbnRleHQsIGZ1bmN0aW9u
KCkgeworICAgIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG5leHQgcnVuIGxvb3AsCisg
ICAgLy8gd2hpY2ggd2lsbCBiZSBzY2hlZHVsZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lCisgIH0p
OworICBgYGAKIAotICAgIHZhciBFdmVudCA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAg
ICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIE11bHRpcGxlIG9wZXJhdGlvbnMgc2NoZWR1bGVkIHdp
dGggYEVtYmVyLnJ1bi5uZXh0YCB3aWxsIGNvYWxlc2NlCisgIGludG8gdGhlIHNhbWUgbGF0ZXIg
cnVuIGxvb3AsIGFsb25nIHdpdGggYW55IG90aGVyIG9wZXJhdGlvbnMKKyAgc2NoZWR1bGVkIGJ5
IGBFbWJlci5ydW4ubGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQorICB0
aW1lIHRoYXQgYEVtYmVyLnJ1bi5uZXh0YCBvcGVyYXRpb25zIHdpbGwgZmlyZS4KIAotICAgICAg
Zm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnMpIHsKLSAgICAgICAgaWYgKCFvcHRpb25zLmhhc093
blByb3BlcnR5KG9wdGlvbikpIHsgY29udGludWU7IH0KKyAgTm90ZSB0aGF0IHRoZXJlIGFyZSBv
ZnRlbiBhbHRlcm5hdGl2ZXMgdG8gdXNpbmcgYEVtYmVyLnJ1bi5uZXh0YC4KKyAgRm9yIGluc3Rh
bmNlLCBpZiB5b3UnZCBsaWtlIHRvIHNjaGVkdWxlIGFuIG9wZXJhdGlvbiB0byBoYXBwZW4KKyAg
YWZ0ZXIgYWxsIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGF2ZSBjb21wbGV0ZWQgd2l0aGluIHRo
ZSBjdXJyZW50CisgIHJ1biBsb29wLCB5b3UgY2FuIG1ha2UgdXNlIG9mIHRoZSBgYWZ0ZXJSZW5k
ZXJgIHJ1biBsb29wIHF1ZXVlIChhZGRlZAorICBieSB0aGUgYGVtYmVyLXZpZXdzYCBwYWNrYWdl
LCBhbG9uZyB3aXRoIHRoZSBwcmVjZWRpbmcgYHJlbmRlcmAgcXVldWUKKyAgd2hlcmUgYWxsIHRo
ZSBET00gZWxlbWVudCBvcGVyYXRpb25zIGhhcHBlbikuIEV4YW1wbGU6CiAKLSAgICAgICAgdGhp
c1tvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dOwotICAgICAgfQotICAgIH07CisgIGBgYGphdmFz
Y3JpcHQKKyAgQXBwLk15Q29sbGVjdGlvblZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRl
bmQoeworICAgIGRpZEluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgICAgRW1iZXIucnVu
LnNjaGVkdWxlT25jZSgnYWZ0ZXJSZW5kZXInLCB0aGlzLCAncHJvY2Vzc0NoaWxkRWxlbWVudHMn
KTsKKyAgICB9LAorICAgIHByb2Nlc3NDaGlsZEVsZW1lbnRzOiBmdW5jdGlvbigpIHsKKyAgICAg
IC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCBjb2xsZWN0aW9uVmlldydzIGNoaWxkIHZpZXcKKyAg
ICAgIC8vIGVsZW1lbnRzIGFmdGVyIHRoZXkndmUgZmluaXNoZWQgcmVuZGVyaW5nLCB3aGljaAor
ICAgICAgLy8gY2FuJ3QgYmUgZG9uZSB3aXRoaW4gdGhlIENvbGxlY3Rpb25WaWV3J3MKKyAgICAg
IC8vIGBkaWRJbnNlcnRFbGVtZW50YCBob29rIGJlY2F1c2UgdGhhdCBnZXRzIHJ1bgorICAgICAg
Ly8gYmVmb3JlIHRoZSBjaGlsZCBlbGVtZW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4K
KyAgICB9CisgIH0pOworICBgYGAKIAotICAgIHZhciBpbmRleE9mID0gZnVuY3Rpb24oY2FsbGJh
Y2tzLCBjYWxsYmFjaykgewotICAgICAgZm9yICh2YXIgaT0wLCBsPWNhbGxiYWNrcy5sZW5ndGg7
IGk8bDsgaSsrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NbaV1bMF0gPT09IGNhbGxiYWNrKSB7
IHJldHVybiBpOyB9Ci0gICAgICB9CisgIE9uZSBiZW5lZml0IG9mIHRoZSBhYm92ZSBhcHByb2Fj
aCBjb21wYXJlZCB0byB1c2luZyBgRW1iZXIucnVuLm5leHRgIGlzCisgIHRoYXQgeW91IHdpbGwg
YmUgYWJsZSB0byBwZXJmb3JtIERPTS9DU1Mgb3BlcmF0aW9ucyBiZWZvcmUgdW5wcm9jZXNzZWQK
KyAgZWxlbWVudHMgYXJlIHJlbmRlcmVkIHRvIHRoZSBzY3JlZW4sIHdoaWNoIG1heSBwcmV2ZW50
IGZsaWNrZXJpbmcgb3IKKyAgb3RoZXIgYXJ0aWZhY3RzIGNhdXNlZCBieSBkZWxheWluZyBwcm9j
ZXNzaW5nIHVudGlsIGFmdGVyIHJlbmRlcmluZy4KIAotICAgICAgcmV0dXJuIC0xOwotICAgIH07
CisgIFRoZSBvdGhlciBtYWpvciBiZW5lZml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0
IGBFbWJlci5ydW4ubmV4dGAKKyAgaW50cm9kdWNlcyBhbiBlbGVtZW50IG9mIG5vbi1kZXRlcm1p
bmlzbSwgd2hpY2ggY2FuIG1ha2UgdGhpbmdzIG11Y2gKKyAgaGFyZGVyIHRvIHRlc3QsIGR1ZSB0
byBpdHMgcmVsaWFuY2Ugb24gYHNldFRpbWVvdXRgOyBpdCdzIG11Y2ggaGFyZGVyCisgIHRvIGd1
YXJhbnRlZSB0aGUgb3JkZXIgb2Ygc2NoZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBz
Y2hlZHVsZWQKKyAgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBydW4gbG9vcCwgaS5lLiB3aXRoIGBF
bWJlci5ydW4ubmV4dGAuCiAKLSAgICB2YXIgY2FsbGJhY2tzRm9yID0gZnVuY3Rpb24ob2JqZWN0
KSB7Ci0gICAgICB2YXIgY2FsbGJhY2tzID0gb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tzOworICBA
bWV0aG9kIG5leHQKKyAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2Qg
dG8gaW52b2tlCisgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0
byBpbnZva2UuCisgICAgSWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBv
biB0aGUKKyAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICBA
cGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUg
dGltZW91dC4KKyAgQHJldHVybiB7T2JqZWN0fSB0aW1lcgorKi8KK0VtYmVyLnJ1bi5uZXh0ID0g
ZnVuY3Rpb24oKSB7CisgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOworICBhcmdz
LnB1c2goMSk7CisgIHJldHVybiBiYWNrYnVybmVyLmxhdGVyLmFwcGx5KGJhY2tidXJuZXIsIGFy
Z3MpOworfTsKIAotICAgICAgaWYgKCFjYWxsYmFja3MpIHsKLSAgICAgICAgY2FsbGJhY2tzID0g
b2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tzID0ge307Ci0gICAgICB9CisvKioKKyAgQ2FuY2VscyBh
IHNjaGVkdWxlZCBpdGVtLiBNdXN0IGJlIGEgdmFsdWUgcmV0dXJuZWQgYnkgYEVtYmVyLnJ1bi5s
YXRlcigpYCwKKyAgYEVtYmVyLnJ1bi5vbmNlKClgLCBvciBgRW1iZXIucnVuLm5leHQoKWAuCiAK
LSAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfTsKKyAgYGBgamF2YXNjcmlwdAorICB2YXIg
cnVuTmV4dCA9IEVtYmVyLnJ1bi5uZXh0KG15Q29udGV4dCwgZnVuY3Rpb24oKSB7CisgICAgLy8g
d2lsbCBub3QgYmUgZXhlY3V0ZWQKKyAgfSk7CisgIEVtYmVyLnJ1bi5jYW5jZWwocnVuTmV4dCk7
CiAKLSAgICB2YXIgRXZlbnRUYXJnZXQgPSB7Ci0gICAgICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0
KSB7Ci0gICAgICAgIG9iamVjdC5vbiA9IHRoaXMub247Ci0gICAgICAgIG9iamVjdC5vZmYgPSB0
aGlzLm9mZjsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIgPSB0aGlzLnRyaWdnZXI7Ci0gICAgICAg
IHJldHVybiBvYmplY3Q7Ci0gICAgICB9LAorICB2YXIgcnVuTGF0ZXIgPSBFbWJlci5ydW4ubGF0
ZXIobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKKyAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAor
ICB9LCA1MDApOworICBFbWJlci5ydW4uY2FuY2VsKHJ1bkxhdGVyKTsKIAotICAgICAgb246IGZ1
bmN0aW9uKGV2ZW50TmFtZXMsIGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgICAgIHZhciBhbGxD
YWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksIGNhbGxiYWNrcywgZXZlbnROYW1lOwotICAg
ICAgICBldmVudE5hbWVzID0gZXZlbnROYW1lcy5zcGxpdCgvXHMrLyk7Ci0gICAgICAgIGJpbmRp
bmcgPSBiaW5kaW5nIHx8IHRoaXM7CisgIHZhciBydW5PbmNlID0gRW1iZXIucnVuLm9uY2UobXlD
b250ZXh0LCBmdW5jdGlvbigpIHsKKyAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAorICB9KTsK
KyAgRW1iZXIucnVuLmNhbmNlbChydW5PbmNlKTsKKyAgYGBgCiAKLSAgICAgICAgd2hpbGUgKGV2
ZW50TmFtZSA9IGV2ZW50TmFtZXMuc2hpZnQoKSkgewotICAgICAgICAgIGNhbGxiYWNrcyA9IGFs
bENhbGxiYWNrc1tldmVudE5hbWVdOworICBAbWV0aG9kIGNhbmNlbAorICBAcGFyYW0ge09iamVj
dH0gdGltZXIgVGltZXIgb2JqZWN0IHRvIGNhbmNlbAorICBAcmV0dXJuIHt2b2lkfQorKi8KK0Vt
YmVyLnJ1bi5jYW5jZWwgPSBmdW5jdGlvbih0aW1lcikgeworICByZXR1cm4gYmFja2J1cm5lci5j
YW5jZWwodGltZXIpOworfTsKIAotICAgICAgICAgIGlmICghY2FsbGJhY2tzKSB7Ci0gICAgICAg
ICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXSA9IFtdOwotICAgICAgICAg
IH0KKy8qKgorICBEZWxheSBjYWxsaW5nIHRoZSB0YXJnZXQgbWV0aG9kIHVudGlsIHRoZSBkZWJv
dW5jZSBwZXJpb2QgaGFzIGVsYXBzZWQKKyAgd2l0aCBubyBhZGRpdGlvbmFsIGRlYm91bmNlIGNh
bGxzLiBJZiBgZGVib3VuY2VgIGlzIGNhbGxlZCBhZ2FpbiBiZWZvcmUKKyAgdGhlIHNwZWNpZmll
ZCB0aW1lIGhhcyBlbGFwc2VkLCB0aGUgdGltZXIgaXMgcmVzZXQgYW5kIHRoZSBlbnRpcmUgcGVy
aW9kCisgIG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUgdGhlIHRhcmdldCBtZXRob2QgaXMgY2FsbGVk
LgogCi0gICAgICAgICAgaWYgKGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFjaykgPT09IC0xKSB7
Ci0gICAgICAgICAgICBjYWxsYmFja3MucHVzaChbY2FsbGJhY2ssIGJpbmRpbmddKTsKLSAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0sCisgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2Vk
IHdoZW4gYW4gZXZlbnQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcworICBidXQgdGhlIGFj
dGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSB3aGVuIHRoZSBldmVudCBpcyBkb25lIGZp
cmluZy4KKyAgQSBjb21tb24gZXhhbXBsZSBpcyBmb3Igc2Nyb2xsIGV2ZW50cyB3aGVyZSB5b3Ug
b25seSB3YW50IHVwZGF0ZXMgdG8KKyAgaGFwcGVuIG9uY2Ugc2Nyb2xsaW5nIGhhcyBjZWFzZWQu
CiAKLSAgICAgIG9mZjogZnVuY3Rpb24oZXZlbnROYW1lcywgY2FsbGJhY2spIHsKLSAgICAgICAg
dmFyIGFsbENhbGxiYWNrcyA9IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJhY2tzLCBldmVudE5h
bWUsIGluZGV4OwotICAgICAgICBldmVudE5hbWVzID0gZXZlbnROYW1lcy5zcGxpdCgvXHMrLyk7
CisgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUu
bG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OworICAgIHZhciBteUNvbnRleHQgPSB7bmFtZTog
J2RlYm91bmNlJ307CiAKLSAgICAgICAgd2hpbGUgKGV2ZW50TmFtZSA9IGV2ZW50TmFtZXMuc2hp
ZnQoKSkgewotICAgICAgICAgIGlmICghY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGFsbENhbGxi
YWNrc1tldmVudE5hbWVdID0gW107Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9
CisgICAgRW1iZXIucnVuLmRlYm91bmNlKG15Q29udGV4dCwgbXlGdW5jLCAxNTApOwogCi0gICAg
ICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV07CisgICAgLy8gbGVzcyB0
aGFuIDE1MG1zIHBhc3NlcwogCi0gICAgICAgICAgaW5kZXggPSBpbmRleE9mKGNhbGxiYWNrcywg
Y2FsbGJhY2spOworICAgIEVtYmVyLnJ1bi5kZWJvdW5jZShteUNvbnRleHQsIG15RnVuYywgMTUw
KTsKIAotICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsgY2FsbGJhY2tzLnNwbGljZShpbmRl
eCwgMSk7IH0KLSAgICAgICAgfQotICAgICAgfSwKKyAgICAvLyAxNTBtcyBwYXNzZXMKKyAgICAv
LyBteUZ1bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0CisgICAgLy8gY29uc29s
ZSBsb2dzICdkZWJvdW5jZSByYW4uJyBvbmUgdGltZS4KKyAgYGBgCiAKLSAgICAgIHRyaWdnZXI6
IGZ1bmN0aW9uKGV2ZW50TmFtZSwgb3B0aW9ucykgewotICAgICAgICB2YXIgYWxsQ2FsbGJhY2tz
ID0gY2FsbGJhY2tzRm9yKHRoaXMpLAotICAgICAgICAgICAgY2FsbGJhY2tzLCBjYWxsYmFja1R1
cGxlLCBjYWxsYmFjaywgYmluZGluZywgZXZlbnQ7CisgIEBtZXRob2QgZGVib3VuY2UKKyAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCisgIEBwYXJh
bSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgTWF5
IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCisgICAgdGhl
biBpdCB3aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KKyAgQHBhcmFtIHtP
YmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQu
CisgIEBwYXJhbSB7TnVtYmVyfSB3YWl0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4K
KyAgQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgVHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhl
IGxlYWRpbmcgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgd2FpdCBpbnRlcnZh
bC4KKyAgQHJldHVybiB7dm9pZH0KKyovCitFbWJlci5ydW4uZGVib3VuY2UgPSBmdW5jdGlvbigp
IHsKKyAgcmV0dXJuIGJhY2tidXJuZXIuZGVib3VuY2UuYXBwbHkoYmFja2J1cm5lciwgYXJndW1l
bnRzKTsKK307CiAKLSAgICAgICAgaWYgKGNhbGxiYWNrcyA9IGFsbENhbGxiYWNrc1tldmVudE5h
bWVdKSB7Ci0gICAgICAgICAgLy8gRG9uJ3QgY2FjaGUgdGhlIGNhbGxiYWNrcy5sZW5ndGggc2lu
Y2UgaXQgbWF5IGdyb3cKLSAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8Y2FsbGJhY2tzLmxlbmd0
aDsgaSsrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja1R1cGxlID0gY2FsbGJhY2tzW2ldOwotICAg
ICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja1R1cGxlWzBdOwotICAgICAgICAgICAgYmluZGlu
ZyA9IGNhbGxiYWNrVHVwbGVbMV07CisvKioKKyAgRW5zdXJlIHRoYXQgdGhlIHRhcmdldCBtZXRo
b2QgaXMgbmV2ZXIgY2FsbGVkIG1vcmUgZnJlcXVlbnRseSB0aGFuCisgIHRoZSBzcGVjaWZpZWQg
c3BhY2luZyBwZXJpb2QuCiAKLSAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29i
amVjdCcpIHsKLSAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgZGV0YWlsOiBvcHRpb25zIH07Ci0g
ICAgICAgICAgICB9CisgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24o
KSB7IGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OworICAgIHZhciBteUNvbnRl
eHQgPSB7bmFtZTogJ3Rocm90dGxlJ307CiAKLSAgICAgICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50
KGV2ZW50TmFtZSwgb3B0aW9ucyk7Ci0gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcs
IGV2ZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OworICAgIEVt
YmVyLnJ1bi50aHJvdHRsZShteUNvbnRleHQsIG15RnVuYywgMTUwKTsKIAotICAgIHZhciBQcm9t
aXNlID0gZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLm9uKCdwcm9taXNlOnJlc29sdmVkJywgZnVu
Y3Rpb24oZXZlbnQpIHsKLSAgICAgICAgdGhpcy50cmlnZ2VyKCdzdWNjZXNzJywgeyBkZXRhaWw6
IGV2ZW50LmRldGFpbCB9KTsKLSAgICAgIH0sIHRoaXMpOworICAgIC8vIDUwbXMgcGFzc2VzCisg
ICAgRW1iZXIucnVuLnRocm90dGxlKG15Q29udGV4dCwgbXlGdW5jLCAxNTApOwogCi0gICAgICB0
aGlzLm9uKCdwcm9taXNlOmZhaWxlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICAgIHRoaXMu
dHJpZ2dlcignZXJyb3InLCB7IGRldGFpbDogZXZlbnQuZGV0YWlsIH0pOwotICAgICAgfSwgdGhp
cyk7Ci0gICAgfTsKKyAgICAvLyA1MG1zIHBhc3NlcworICAgIEVtYmVyLnJ1bi50aHJvdHRsZSht
eUNvbnRleHQsIG15RnVuYywgMTUwKTsKIAotICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTsK
KyAgICAvLyA1MG1zIHBhc3NlcworICAgIEVtYmVyLnJ1bi50aHJvdHRsZShteUNvbnRleHQsIG15
RnVuYywgMTUwKTsKIAotICAgIHZhciBpbnZva2VDYWxsYmFjayA9IGZ1bmN0aW9uKHR5cGUsIHBy
b21pc2UsIGNhbGxiYWNrLCBldmVudCkgewotICAgICAgdmFyIGhhc0NhbGxiYWNrID0gdHlwZW9m
IGNhbGxiYWNrID09PSAnZnVuY3Rpb24nLAotICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2Vl
ZGVkLCBmYWlsZWQ7CisgICAgLy8gMTUwbXMgcGFzc2VzCisgICAgLy8gbXlGdW5jIGlzIGludm9r
ZWQgd2l0aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNvbnNvbGUgbG9ncyAndGhyb3R0bGUg
cmFuLicgdHdpY2UsIDE1MG1zIGFwYXJ0LgorICBgYGAKIAotICAgICAgaWYgKGhhc0NhbGxiYWNr
KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgdmFsdWUgPSBjYWxsYmFjayhldmVudC5kZXRh
aWwpOwotICAgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2goZSkgewot
ICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgZXJyb3IgPSBlOwotICAgICAgICB9
Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZSA9IGV2ZW50LmRldGFpbDsKLSAgICAgICAg
c3VjY2VlZGVkID0gdHJ1ZTsKLSAgICAgIH0KKyAgQG1ldGhvZCB0aHJvdHRsZQorICBAcGFyYW0g
e09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZva2UKKyAgQHBhcmFtIHtG
dW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICBNYXkgYmUg
YSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcKKyAgICB0aGVuIGl0
IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgorICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAg
QHBhcmFtIHtOdW1iZXJ9IHNwYWNpbmcgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzcGFjZSBv
dXQgcmVxdWVzdHMuCisgIEByZXR1cm4ge3ZvaWR9CisqLworRW1iZXIucnVuLnRocm90dGxlID0g
ZnVuY3Rpb24oKSB7CisgIHJldHVybiBiYWNrYnVybmVyLnRocm90dGxlLmFwcGx5KGJhY2tidXJu
ZXIsIGFyZ3VtZW50cyk7Cit9OwogCi0gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRo
ZW4gPT09ICdmdW5jdGlvbicpIHsKLSAgICAgICAgdmFsdWUudGhlbihmdW5jdGlvbih2YWx1ZSkg
ewotICAgICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7Ci0gICAgICAgIH0sIGZ1bmN0aW9u
KGVycm9yKSB7Ci0gICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpOwotICAgICAgICB9KTsK
LSAgICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3VjY2VlZGVkKSB7Ci0gICAgICAgIHBy
b21pc2UucmVzb2x2ZSh2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkgewotICAgICAg
ICBwcm9taXNlLnJlamVjdChlcnJvcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcm9taXNl
W3R5cGVdKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9OworLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGFu
IGF1dG9ydW4gZHVyaW5nIHRlc3RpbmcKK2Z1bmN0aW9uIGNoZWNrQXV0b1J1bigpIHsKKyAgaWYg
KCFFbWJlci5ydW4uY3VycmVudFJ1bkxvb3ApIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBoYXZl
IHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4tbG9vcCdzIGF1
dG9ydW4uIFlvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5jaHJvbm91cyBz
aWRlLWVmZmVjdHMgaW4gYW4gRW1iZXIucnVuIiwgIUVtYmVyLnRlc3RpbmcpOworICB9Cit9CiAK
LSAgICBQcm9taXNlLnByb3RvdHlwZSA9IHsKLSAgICAgIHRoZW46IGZ1bmN0aW9uKGRvbmUsIGZh
aWwpIHsKLSAgICAgICAgdmFyIHRoZW5Qcm9taXNlID0gbmV3IFByb21pc2UoKTsKK30pKCk7CiAK
LSAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCkgewotICAgICAgICAgIFJTVlAuYXN5bmMoZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICBpbnZva2VDYWxsYmFjaygncmVzb2x2ZScsIHRoZW5Qcm9t
aXNlLCBkb25lLCB7IGRldGFpbDogdGhpcy5yZXNvbHZlZFZhbHVlIH0pOwotICAgICAgICAgIH0s
IHRoaXMpOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRoaXMuaXNSZWplY3RlZCkgewotICAg
ICAgICAgIFJTVlAuYXN5bmMoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpbnZva2VDYWxsYmFj
aygncmVqZWN0JywgdGhlblByb21pc2UsIGZhaWwsIHsgZGV0YWlsOiB0aGlzLnJlamVjdGVkVmFs
dWUgfSk7Ci0gICAgICAgICAgfSwgdGhpcyk7Ci0gICAgICAgIH0KIAotICAgICAgICB0aGlzLm9u
KCdwcm9taXNlOnJlc29sdmVkJywgZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgICAgICBpbnZva2VD
YWxsYmFjaygncmVzb2x2ZScsIHRoZW5Qcm9taXNlLCBkb25lLCBldmVudCk7Ci0gICAgICAgIH0p
OworKGZ1bmN0aW9uKCkgeworLy8gRW1iZXIuTG9nZ2VyCisvLyBnZXQKKy8vIHNldAorLy8gZ3Vp
ZEZvciwgbWV0YQorLy8gYWRkT2JzZXJ2ZXIsIHJlbW92ZU9ic2VydmVyCisvLyBFbWJlci5ydW4u
c2NoZWR1bGUKKy8qKgorQG1vZHVsZSBlbWJlci1tZXRhbAorKi8KIAotICAgICAgICB0aGlzLm9u
KCdwcm9taXNlOmZhaWxlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICAgICAgaW52b2tlQ2Fs
bGJhY2soJ3JlamVjdCcsIHRoZW5Qcm9taXNlLCBmYWlsLCBldmVudCk7Ci0gICAgICAgIH0pOwor
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgorLy8gQ09OU1RBTlRTCisvLwogCi0gICAgICAgIHJldHVybiB0aGVuUHJvbWlzZTsKLSAg
ICAgIH0sCisvKioKKyAgRGVidWcgcGFyYW1ldGVyIHlvdSBjYW4gdHVybiBvbi4gVGhpcyB3aWxs
IGxvZyBhbGwgYmluZGluZ3MgdGhhdCBmaXJlIHRvCisgIHRoZSBjb25zb2xlLiBUaGlzIHNob3Vs
ZCBiZSBkaXNhYmxlZCBpbiBwcm9kdWN0aW9uIGNvZGUuIE5vdGUgdGhhdCB5b3UKKyAgY2FuIGFs
c28gZW5hYmxlIHRoaXMgZnJvbSB0aGUgY29uc29sZSBvciB0ZW1wb3JhcmlseS4KIAotICAgICAg
cmVzb2x2ZTogZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgICAgcmVzb2x2ZSh0aGlzLCB2YWx1ZSk7
CisgIEBwcm9wZXJ0eSBMT0dfQklORElOR1MKKyAgQGZvciBFbWJlcgorICBAdHlwZSBCb29sZWFu
CisgIEBkZWZhdWx0IGZhbHNlCisqLworRW1iZXIuTE9HX0JJTkRJTkdTID0gZmFsc2UgfHwgISFF
bWJlci5FTlYuTE9HX0JJTkRJTkdTOwogCi0gICAgICAgIHRoaXMucmVzb2x2ZSA9IG5vb3A7Ci0g
ICAgICAgIHRoaXMucmVqZWN0ID0gbm9vcDsKLSAgICAgIH0sCit2YXIgZ2V0ICAgICA9IEVtYmVy
LmdldCwKKyAgICBzZXQgICAgID0gRW1iZXIuc2V0LAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlk
Rm9yLAorICAgIElTX0dMT0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS87CiAKLSAgICAg
IHJlamVjdDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgICAgcmVqZWN0KHRoaXMsIHZhbHVlKTsK
Ky8qKgorICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcu
LCBgTXlBcHAuZm9vQ29udHJvbGxlci5iYXJgKQorICBpbnN0ZWFkIG9mIGxvY2FsIChgZm9vLmJh
ci5iYXpgKS4KIAotICAgICAgICB0aGlzLnJlc29sdmUgPSBub29wOwotICAgICAgICB0aGlzLnJl
amVjdCA9IG5vb3A7Ci0gICAgICB9Ci0gICAgfTsKKyAgQG1ldGhvZCBpc0dsb2JhbFBhdGgKKyAg
QGZvciBFbWJlcgorICBAcHJpdmF0ZQorICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICBAcmV0dXJu
IEJvb2xlYW4KKyovCit2YXIgaXNHbG9iYWxQYXRoID0gRW1iZXIuaXNHbG9iYWxQYXRoID0gZnVu
Y3Rpb24ocGF0aCkgeworICByZXR1cm4gSVNfR0xPQkFMLnRlc3QocGF0aCk7Cit9OwogCi0gICAg
ZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkgewotICAgICAgUlNWUC5hc3luYyhmdW5j
dGlvbigpIHsKLSAgICAgICAgcHJvbWlzZS50cmlnZ2VyKCdwcm9taXNlOnJlc29sdmVkJywgeyBk
ZXRhaWw6IHZhbHVlIH0pOwotICAgICAgICBwcm9taXNlLmlzUmVzb2x2ZWQgPSB0cnVlOwotICAg
ICAgICBwcm9taXNlLnJlc29sdmVkVmFsdWUgPSB2YWx1ZTsKLSAgICAgIH0pOwotICAgIH0KK2Z1
bmN0aW9uIGdldFdpdGhHbG9iYWxzKG9iaiwgcGF0aCkgeworICByZXR1cm4gZ2V0KGlzR2xvYmFs
UGF0aChwYXRoKSA/IEVtYmVyLmxvb2t1cCA6IG9iaiwgcGF0aCk7Cit9CiAKLSAgICBmdW5jdGlv
biByZWplY3QocHJvbWlzZSwgdmFsdWUpIHsKLSAgICAgIFJTVlAuYXN5bmMoZnVuY3Rpb24oKSB7
Ci0gICAgICAgIHByb21pc2UudHJpZ2dlcigncHJvbWlzZTpmYWlsZWQnLCB7IGRldGFpbDogdmFs
dWUgfSk7Ci0gICAgICAgIHByb21pc2UuaXNSZWplY3RlZCA9IHRydWU7Ci0gICAgICAgIHByb21p
c2UucmVqZWN0ZWRWYWx1ZSA9IHZhbHVlOwotICAgICAgfSk7Ci0gICAgfQorLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorLy8gQklO
RElORworLy8KIAotICAgIGZ1bmN0aW9uIGFsbChwcm9taXNlcykgewotICAgIHZhciBpLCByZXN1
bHRzID0gW107Ci0gICAgdmFyIGFsbFByb21pc2UgPSBuZXcgUHJvbWlzZSgpOwotICAgIHZhciBy
ZW1haW5pbmcgPSBwcm9taXNlcy5sZW5ndGg7Cit2YXIgQmluZGluZyA9IGZ1bmN0aW9uKHRvUGF0
aCwgZnJvbVBhdGgpIHsKKyAgdGhpcy5fZGlyZWN0aW9uID0gJ2Z3ZCc7CisgIHRoaXMuX2Zyb20g
PSBmcm9tUGF0aDsKKyAgdGhpcy5fdG8gICA9IHRvUGF0aDsKKyAgdGhpcy5fZGlyZWN0aW9uTWFw
ID0gRW1iZXIuTWFwLmNyZWF0ZSgpOworfTsKIAotICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkg
ewotICAgICAgICBhbGxQcm9taXNlLnJlc29sdmUoW10pOwotICAgICAgfQorLyoqCitAY2xhc3Mg
QmluZGluZworQG5hbWVzcGFjZSBFbWJlcgorKi8KIAotICAgIHZhciByZXNvbHZlciA9IGZ1bmN0
aW9uKGluZGV4KSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgcmVzb2x2ZShp
bmRleCwgdmFsdWUpOwotICAgIH07Ci0gICAgfTsKK0JpbmRpbmcucHJvdG90eXBlID0geworICAv
KioKKyAgICBUaGlzIGNvcGllcyB0aGUgQmluZGluZyBzbyBpdCBjYW4gYmUgY29ubmVjdGVkIHRv
IGFub3RoZXIgb2JqZWN0LgogCi0gICAgdmFyIHJlc29sdmUgPSBmdW5jdGlvbihpbmRleCwgdmFs
dWUpIHsKLSAgICByZXN1bHRzW2luZGV4XSA9IHZhbHVlOwotICAgIGlmICgtLXJlbWFpbmluZyA9
PT0gMCkgewotICAgIGFsbFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTsKLSAgICB9Ci0gICAgfTsK
KyAgICBAbWV0aG9kIGNvcHkKKyAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKKyAg
Ki8KKyAgY29weTogZnVuY3Rpb24gKCkgeworICAgIHZhciBjb3B5ID0gbmV3IEJpbmRpbmcodGhp
cy5fdG8sIHRoaXMuX2Zyb20pOworICAgIGlmICh0aGlzLl9vbmVXYXkpIHsgY29weS5fb25lV2F5
ID0gdHJ1ZTsgfQorICAgIHJldHVybiBjb3B5OworICB9LAogCi0gICAgdmFyIHJlamVjdCA9IGZ1
bmN0aW9uKGVycm9yKSB7Ci0gICAgYWxsUHJvbWlzZS5yZWplY3QoZXJyb3IpOwotICAgIH07Cisg
IC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4KKyAgLy8gQ09ORklHCisgIC8vCiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVtYWluaW5n
OyBpKyspIHsKLSAgICBwcm9taXNlc1tpXS50aGVuKHJlc29sdmVyKGkpLCByZWplY3QpOwotICAg
IH0KLSAgICByZXR1cm4gYWxsUHJvbWlzZTsKLSAgICB9CisgIC8qKgorICAgIFRoaXMgd2lsbCBz
ZXQgYGZyb21gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2lsbCBu
b3QKKyAgICBhdHRlbXB0IHRvIHJlc29sdmUgdGhpcyBwcm9wZXJ0eSBwYXRoIHRvIGFuIGFjdHVh
bCBvYmplY3QgdW50aWwgeW91CisgICAgY29ubmVjdCB0aGUgYmluZGluZy4KIAotICAgIEV2ZW50
VGFyZ2V0Lm1peGluKFByb21pc2UucHJvdG90eXBlKTsKKyAgICBUaGUgYmluZGluZyB3aWxsIHNl
YXJjaCBmb3IgdGhlIHByb3BlcnR5IHBhdGggc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2JqZWN0Cisg
ICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRpbmcuIEl0IGZvbGxvd3Mg
dGhlIHNhbWUgcnVsZXMgYXMKKyAgICBgZ2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBtb3Jl
IGluZm9ybWF0aW9uLgogCi0gICAgUlNWUCA9IHsgYXN5bmM6IGFzeW5jLCBQcm9taXNlOiBQcm9t
aXNlLCBFdmVudDogRXZlbnQsIEV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCwgYWxsOiBhbGwsIHJh
aXNlT25VbmNhdWdodEV4Y2VwdGlvbnM6IHRydWUgfTsKLSAgICByZXR1cm4gUlNWUDsKLSAgfSk7
CisgICAgQG1ldGhvZCBmcm9tCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggdGhlIHByb3BlcnR5
IHBhdGggdG8gY29ubmVjdCB0bworICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAor
ICAqLworICBmcm9tOiBmdW5jdGlvbihwYXRoKSB7CisgICAgdGhpcy5fZnJvbSA9IHBhdGg7Cisg
ICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLX0pKCk7CisgIC8qKgorICAgIFRoaXMgd2lsbCBzZXQg
dGhlIGB0b2AgcHJvcGVydHkgcGF0aCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJdCB3aWxsIG5v
dAorICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4gYWN0dWFs
IG9iamVjdCB1bnRpbCB5b3UKKyAgICBjb25uZWN0IHRoZSBiaW5kaW5nLgogCi0oZnVuY3Rpb24o
KSB7Ci1kZWZpbmUoImNvbnRhaW5lciIsCi0gIFtdLAotICBmdW5jdGlvbigpIHsKKyAgICBUaGUg
YmluZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBhdGggc3RhcnRpbmcgYXQgdGhl
IHJvb3Qgb2JqZWN0CisgICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRp
bmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKKyAgICBgZ2V0KClgIC0gc2VlIHRoYXQg
bWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi0gICAgdmFyIG9iamVjdENyZWF0ZSA9IE9i
amVjdC5jcmVhdGUgfHwgZnVuY3Rpb24ocGFyZW50KSB7Ci0gICAgICBmdW5jdGlvbiBGKCkge30K
LSAgICAgIEYucHJvdG90eXBlID0gcGFyZW50OwotICAgICAgcmV0dXJuIG5ldyBGKCk7Ci0gICAg
fTsKKyAgICBAbWV0aG9kIHRvCisgICAgQHBhcmFtIHtTdHJpbmd8VHVwbGV9IHBhdGggQSBwcm9w
ZXJ0eSBwYXRoIG9yIHR1cGxlCisgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCisg
ICovCisgIHRvOiBmdW5jdGlvbihwYXRoKSB7CisgICAgdGhpcy5fdG8gPSBwYXRoOworICAgIHJl
dHVybiB0aGlzOworICB9LAogCi0gICAgZnVuY3Rpb24gSW5oZXJpdGluZ0RpY3QocGFyZW50KSB7
Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuZGljdCA9IHt9OwotICAg
IH0KKyAgLyoqCisgICAgQ29uZmlndXJlcyB0aGUgYmluZGluZyBhcyBvbmUgd2F5LiBBIG9uZS13
YXkgYmluZGluZyB3aWxsIHJlbGF5IGNoYW5nZXMKKyAgICBvbiB0aGUgYGZyb21gIHNpZGUgdG8g
dGhlIGB0b2Agc2lkZSwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gVGhpcworICAgIG1l
YW5zIHRoYXQgaWYgeW91IGNoYW5nZSB0aGUgYHRvYCBzaWRlIGRpcmVjdGx5LCB0aGUgYGZyb21g
IHNpZGUgbWF5IGhhdmUKKyAgICBhIGRpZmZlcmVudCB2YWx1ZS4KIAotICAgIEluaGVyaXRpbmdE
aWN0LnByb3RvdHlwZSA9IHsKLSAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZh
ciBkaWN0ID0gdGhpcy5kaWN0OworICAgIEBtZXRob2Qgb25lV2F5CisgICAgQHJldHVybiB7RW1i
ZXIuQmluZGluZ30gYHRoaXNgCisgICovCisgIG9uZVdheTogZnVuY3Rpb24oKSB7CisgICAgdGhp
cy5fb25lV2F5ID0gdHJ1ZTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKIAotICAgICAgICBpZiAo
ZGljdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAgICAgcmV0dXJuIGRpY3Rba2V5XTsK
LSAgICAgICAgfQorICAvKioKKyAgICBAbWV0aG9kIHRvU3RyaW5nCisgICAgQHJldHVybiB7U3Ry
aW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYmluZGluZworICAqLworICB0b1N0cmluZzog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIG9uZVdheSA9IHRoaXMuX29uZVdheSA/ICdbb25lV2F5XScg
OiAnJzsKKyAgICByZXR1cm4gIkVtYmVyLkJpbmRpbmc8IiArIGd1aWRGb3IodGhpcykgKyAiPigi
ICsgdGhpcy5fZnJvbSArICIgLT4gIiArIHRoaXMuX3RvICsgIikiICsgb25lV2F5OworICB9LAog
Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgewotICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVu
dC5nZXQoa2V5KTsKLSAgICAgICAgfQotICAgICAgfSwKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBDT05ORUNUIEFO
RCBTWU5DCisgIC8vCiAKLSAgICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgICAg
ICB0aGlzLmRpY3Rba2V5XSA9IHZhbHVlOwotICAgICAgfSwKKyAgLyoqCisgICAgQXR0ZW1wdHMg
dG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBh
bmQgcmVsYXkKKyAgICBjaGFuZ2VzLiBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlv
biBpZiB5b3UgaGF2ZSBub3Qgc2V0IHRoZQorICAgIGZyb20vdG8gcHJvcGVydGllcyB5ZXQuCiAK
LSAgICAgIGhhczogZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhpcy5kaWN0
OworICAgIEBtZXRob2QgY29ubmVjdAorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIHJvb3Qg
b2JqZWN0IGZvciB0aGlzIGJpbmRpbmcuCisgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRo
aXNgCisgICovCisgIGNvbm5lY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIEVtYmVyLmFzc2VydCgn
TXVzdCBwYXNzIGEgdmFsaWQgb2JqZWN0IHRvIEVtYmVyLkJpbmRpbmcuY29ubmVjdCgpJywgISFv
YmopOwogCi0gICAgICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb20s
IHRvUGF0aCA9IHRoaXMuX3RvOworICAgIEVtYmVyLnRyeVNldChvYmosIHRvUGF0aCwgZ2V0V2l0
aEdsb2JhbHMob2JqLCBmcm9tUGF0aCkpOwogCi0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgewot
ICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5oYXMoa2V5KTsKLSAgICAgICAgfQorICAgIC8v
IGFkZCBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGJp
bmRpbmcgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICBFbWJlci5hZGRPYnNlcnZlcihvYmosIGZyb21Q
YXRoLCB0aGlzLCB0aGlzLmZyb21EaWRDaGFuZ2UpOwogCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgIH0sCisgICAgLy8gaWYgdGhlIGJpbmRpbmcgaXMgYSB0d28td2F5IGJpbmRpbmcsIGFs
c28gc2V0IHVwIGFuIG9ic2VydmVyIG9uIHRoZSB0YXJnZXQKKyAgICBpZiAoIXRoaXMuX29uZVdh
eSkgeyBFbWJlci5hZGRPYnNlcnZlcihvYmosIHRvUGF0aCwgdGhpcywgdGhpcy50b0RpZENoYW5n
ZSk7IH0KIAotICAgICAgZWFjaExvY2FsOiBmdW5jdGlvbihjYWxsYmFjaywgYmluZGluZykgewot
ICAgICAgICB2YXIgZGljdCA9IHRoaXMuZGljdDsKKyAgICB0aGlzLl9yZWFkeVRvU3luYyA9IHRy
dWU7CiAKLSAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBkaWN0KSB7Ci0gICAgICAgICAgaWYgKGRp
Y3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmlu
ZGluZywgcHJvcCwgZGljdFtwcm9wXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9
Ci0gICAgfTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKIAotICAgIGZ1bmN0aW9uIENvbnRhaW5l
cihwYXJlbnQpIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jaGls
ZHJlbiA9IFtdOworICAvKioKKyAgICBEaXNjb25uZWN0cyB0aGUgYmluZGluZyBpbnN0YW5jZS4g
Q2hhbmdlcyB3aWxsIG5vIGxvbmdlciBiZSByZWxheWVkLiBZb3UKKyAgICB3aWxsIG5vdCB1c3Vh
bGx5IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KIAotICAgICAgdGhpcy5yZXNvbHZlciA9IHBh
cmVudCAmJiBwYXJlbnQucmVzb2x2ZXIgfHwgZnVuY3Rpb24oKSB7fTsKLSAgICAgIHRoaXMucmVn
aXN0cnkgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBhcmVudC5yZWdpc3RyeSk7Ci0g
ICAgICB0aGlzLmNhY2hlID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQuY2Fj
aGUpOwotICAgICAgdGhpcy50eXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJl
bnQgJiYgcGFyZW50LnR5cGVJbmplY3Rpb25zKTsKLSAgICAgIHRoaXMuaW5qZWN0aW9ucyA9IHt9
OwotICAgICAgdGhpcy5fb3B0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFy
ZW50Ll9vcHRpb25zKTsKLSAgICAgIHRoaXMuX3R5cGVPcHRpb25zID0gbmV3IEluaGVyaXRpbmdE
aWN0KHBhcmVudCAmJiBwYXJlbnQuX3R5cGVPcHRpb25zKTsKLSAgICB9CisgICAgQG1ldGhvZCBk
aXNjb25uZWN0CisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3QgeW91IHBh
c3NlZCB3aGVuIGNvbm5lY3RpbmcgdGhlIGJpbmRpbmcuCisgICAgQHJldHVybiB7RW1iZXIuQmlu
ZGluZ30gYHRoaXNgCisgICovCisgIGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIEVt
YmVyLmFzc2VydCgnTXVzdCBwYXNzIGEgdmFsaWQgb2JqZWN0IHRvIEVtYmVyLkJpbmRpbmcuZGlz
Y29ubmVjdCgpJywgISFvYmopOwogCi0gICAgQ29udGFpbmVyLnByb3RvdHlwZSA9IHsKLSAgICAg
IGNoaWxkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWlu
ZXIodGhpcyk7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjb250YWluZXIpOwotICAgICAg
ICByZXR1cm4gY29udGFpbmVyOwotICAgICAgfSwKKyAgICB2YXIgdHdvV2F5ID0gIXRoaXMuX29u
ZVdheTsKIAotICAgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKLSAgICAg
ICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKLSAgICAgIH0sCisgICAgLy8gcmVtb3ZlIGFuIG9ic2Vy
dmVyIG9uIHRoZSBvYmplY3Qgc28gd2UncmUgbm8gbG9uZ2VyIG5vdGlmaWVkIG9mCisgICAgLy8g
Y2hhbmdlcyB0aGF0IHNob3VsZCB1cGRhdGUgYmluZGluZ3MuCisgICAgRW1iZXIucmVtb3ZlT2Jz
ZXJ2ZXIob2JqLCB0aGlzLl9mcm9tLCB0aGlzLCB0aGlzLmZyb21EaWRDaGFuZ2UpOwogCi0gICAg
ICByZWdpc3RlcjogZnVuY3Rpb24odHlwZSwgbmFtZSwgZmFjdG9yeSwgb3B0aW9ucykgewotICAg
ICAgICB2YXIgZnVsbE5hbWU7CisgICAgLy8gaWYgdGhlIGJpbmRpbmcgaXMgdHdvLXdheSwgcmVt
b3ZlIHRoZSBvYnNlcnZlciBmcm9tIHRoZSB0YXJnZXQgYXMgd2VsbAorICAgIGlmICh0d29XYXkp
IHsgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIob2JqLCB0aGlzLl90bywgdGhpcywgdGhpcy50b0RpZENo
YW5nZSk7IH0KIAorICAgIHRoaXMuX3JlYWR5VG9TeW5jID0gZmFsc2U7IC8vIGRpc2FibGUgc2No
ZWR1bGVkIHN5bmNzLi4uCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLSAgICAgICAgaWYgKHR5
cGUuaW5kZXhPZignOicpICE9PSAtMSl7Ci0gICAgICAgICAgb3B0aW9ucyA9IGZhY3Rvcnk7Ci0g
ICAgICAgICAgZmFjdG9yeSA9IG5hbWU7Ci0gICAgICAgICAgZnVsbE5hbWUgPSB0eXBlOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIEVtYmVyLmRlcHJlY2F0ZSgncmVnaXN0ZXIoIicrdHlw
ZSArJyIsICInKyBuYW1lKyciKSBpcyBub3cgZGVwcmVjYXRlZCBpbi1mYXZvdXIgb2YgcmVnaXN0
ZXIoIicrdHlwZSsnOicrbmFtZSsnIik7JywgdHJ1ZSk7Ci0gICAgICAgICAgZnVsbE5hbWUgPSB0
eXBlICsgIjoiICsgbmFtZTsKLSAgICAgICAgfQorICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIFBSSVZBVEUKKyAgLy8K
IAotICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldChmdWxsTmFtZSwgZmFjdG9yeSk7Ci0gICAgICAg
IHRoaXMuX29wdGlvbnMuc2V0KGZ1bGxOYW1lLCBvcHRpb25zIHx8IHt9KTsKLSAgICAgIH0sCisg
IC8qIGNhbGxlZCB3aGVuIHRoZSBmcm9tIHNpZGUgY2hhbmdlcyAqLworICBmcm9tRGlkQ2hhbmdl
OiBmdW5jdGlvbih0YXJnZXQpIHsKKyAgICB0aGlzLl9zY2hlZHVsZVN5bmModGFyZ2V0LCAnZndk
Jyk7CisgIH0sCiAKLSAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgICAg
IHJldHVybiB0aGlzLnJlc29sdmVyKGZ1bGxOYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChmdWxs
TmFtZSk7Ci0gICAgICB9LAorICAvKiBjYWxsZWQgd2hlbiB0aGUgdG8gc2lkZSBjaGFuZ2VzICov
CisgIHRvRGlkQ2hhbmdlOiBmdW5jdGlvbih0YXJnZXQpIHsKKyAgICB0aGlzLl9zY2hlZHVsZVN5
bmModGFyZ2V0LCAnYmFjaycpOworICB9LAogCi0gICAgICBsb29rdXA6IGZ1bmN0aW9uKGZ1bGxO
YW1lKSB7Ci0gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKLSAgICAgICAg
ICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoZnVsbE5hbWUpOwotICAgICAgICB9CisgIF9zY2hlZHVs
ZVN5bmM6IGZ1bmN0aW9uKG9iaiwgZGlyKSB7CisgICAgdmFyIGRpcmVjdGlvbk1hcCA9IHRoaXMu
X2RpcmVjdGlvbk1hcDsKKyAgICB2YXIgZXhpc3RpbmdEaXIgPSBkaXJlY3Rpb25NYXAuZ2V0KG9i
aik7CiAKLSAgICAgICAgdmFyIHZhbHVlID0gaW5zdGFudGlhdGUodGhpcywgZnVsbE5hbWUpOwor
ICAgIC8vIGlmIHdlIGhhdmVuJ3Qgc2NoZWR1bGVkIHRoZSBiaW5kaW5nIHlldCwgc2NoZWR1bGUg
aXQKKyAgICBpZiAoIWV4aXN0aW5nRGlyKSB7CisgICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ3N5
bmMnLCB0aGlzLCB0aGlzLl9zeW5jLCBvYmopOworICAgICAgZGlyZWN0aW9uTWFwLnNldChvYmos
IGRpcik7CisgICAgfQogCi0gICAgICAgIGlmICghdmFsdWUpIHsgcmV0dXJuOyB9CisgICAgLy8g
SWYgYm90aCBhICdiYWNrJyBhbmQgJ2Z3ZCcgc3luYyBoYXZlIGJlZW4gc2NoZWR1bGVkIG9uIHRo
ZSBzYW1lIG9iamVjdCwKKyAgICAvLyBkZWZhdWx0IHRvIGEgJ2Z3ZCcgc3luYyBzbyB0aGF0IGl0
IHJlbWFpbnMgZGV0ZXJtaW5pc3RpYy4KKyAgICBpZiAoZXhpc3RpbmdEaXIgPT09ICdiYWNrJyAm
JiBkaXIgPT09ICdmd2QnKSB7CisgICAgICBkaXJlY3Rpb25NYXAuc2V0KG9iaiwgJ2Z3ZCcpOwor
ICAgIH0KKyAgfSwKIAotICAgICAgICBpZiAoaXNTaW5nbGV0b24odGhpcywgZnVsbE5hbWUpKSB7
Ci0gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoZnVsbE5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQor
ICBfc3luYzogZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIGxvZyA9IEVtYmVyLkxPR19CSU5ESU5H
UzsKIAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9LAorICAgIC8vIGRvbid0IHN5bmNo
cm9uaXplIGRlc3Ryb3llZCBvYmplY3RzIG9yIGRpc2Nvbm5lY3RlZCBiaW5kaW5ncworICAgIGlm
IChvYmouaXNEZXN0cm95ZWQgfHwgIXRoaXMuX3JlYWR5VG9TeW5jKSB7IHJldHVybjsgfQogCi0g
ICAgICBoYXM6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgICAgIGlmICh0aGlzLmNhY2hlLmhh
cyhmdWxsTmFtZSkpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgIC8v
IGdldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBiaW5kaW5nIGZvciB0aGUgb2JqZWN0IHdlIGFyZQor
ICAgIC8vIHN5bmNocm9uaXppbmcgZnJvbQorICAgIHZhciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9k
aXJlY3Rpb25NYXA7CisgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvbk1hcC5nZXQob2JqKTsK
IAotICAgICAgICByZXR1cm4gISFmYWN0b3J5Rm9yKHRoaXMsIGZ1bGxOYW1lKTsKLSAgICAgIH0s
CisgICAgdmFyIGZyb21QYXRoID0gdGhpcy5fZnJvbSwgdG9QYXRoID0gdGhpcy5fdG87CiAKLSAg
ICAgIG9wdGlvbnNGb3JUeXBlOiBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7Ci0gICAgICAgIGlm
ICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ29wdGlvbnNGb3JUeXBlJyk7
IH0KKyAgICBkaXJlY3Rpb25NYXAucmVtb3ZlKG9iaik7CiAKLSAgICAgICAgdGhpcy5fdHlwZU9w
dGlvbnMuc2V0KHR5cGUsIG9wdGlvbnMpOwotICAgICAgfSwKKyAgICAvLyBpZiB3ZSdyZSBzeW5j
aHJvbml6aW5nIGZyb20gdGhlIHJlbW90ZSBvYmplY3QuLi4KKyAgICBpZiAoZGlyZWN0aW9uID09
PSAnZndkJykgeworICAgICAgdmFyIGZyb21WYWx1ZSA9IGdldFdpdGhHbG9iYWxzKG9iaiwgdGhp
cy5fZnJvbSk7CisgICAgICBpZiAobG9nKSB7CisgICAgICAgIEVtYmVyLkxvZ2dlci5sb2coJyAn
LCB0aGlzLnRvU3RyaW5nKCksICctPicsIGZyb21WYWx1ZSwgb2JqKTsKKyAgICAgIH0KKyAgICAg
IGlmICh0aGlzLl9vbmVXYXkpIHsKKyAgICAgICAgRW1iZXIudHJ5U2V0KG9iaiwgdG9QYXRoLCBm
cm9tVmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRW1iZXIuX3N1c3BlbmRPYnNlcnZl
cihvYmosIHRvUGF0aCwgdGhpcywgdGhpcy50b0RpZENoYW5nZSwgZnVuY3Rpb24gKCkgeworICAg
ICAgICAgIEVtYmVyLnRyeVNldChvYmosIHRvUGF0aCwgZnJvbVZhbHVlKTsKKyAgICAgICAgfSk7
CisgICAgICB9CisgICAgLy8gaWYgd2UncmUgc3luY2hyb25pemluZyAqdG8qIHRoZSByZW1vdGUg
b2JqZWN0CisgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdiYWNrJykgeworICAgICAgdmFy
IHRvVmFsdWUgPSBnZXQob2JqLCB0aGlzLl90byk7CisgICAgICBpZiAobG9nKSB7CisgICAgICAg
IEVtYmVyLkxvZ2dlci5sb2coJyAnLCB0aGlzLnRvU3RyaW5nKCksICc8LScsIHRvVmFsdWUsIG9i
aik7CisgICAgICB9CisgICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgs
IHRoaXMsIHRoaXMuZnJvbURpZENoYW5nZSwgZnVuY3Rpb24gKCkgeworICAgICAgICBFbWJlci50
cnlTZXQoRW1iZXIuaXNHbG9iYWxQYXRoKGZyb21QYXRoKSA/IEVtYmVyLmxvb2t1cCA6IG9iaiwg
ZnJvbVBhdGgsIHRvVmFsdWUpOworICAgICAgfSk7CisgICAgfQorICB9CiAKLSAgICAgIG9wdGlv
bnM6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zRm9yVHlw
ZSh0eXBlLCBvcHRpb25zKTsKLSAgICAgIH0sCit9OwogCi0gICAgICB0eXBlSW5qZWN0aW9uOiBm
dW5jdGlvbih0eXBlLCBwcm9wZXJ0eSwgZnVsbE5hbWUpIHsKLSAgICAgICAgaWYgKHRoaXMucGFy
ZW50KSB7IGlsbGVnYWxDaGlsZE9wZXJhdGlvbigndHlwZUluamVjdGlvbicpOyB9CitmdW5jdGlv
biBtaXhpblByb3BlcnRpZXModG8sIGZyb20pIHsKKyAgZm9yICh2YXIga2V5IGluIGZyb20pIHsK
KyAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICB0b1trZXldID0gZnJv
bVtrZXldOworICAgIH0KKyAgfQorfQogCi0gICAgICAgIHZhciBpbmplY3Rpb25zID0gdGhpcy50
eXBlSW5qZWN0aW9ucy5nZXQodHlwZSk7Ci0gICAgICAgIGlmICghaW5qZWN0aW9ucykgewotICAg
ICAgICAgIGluamVjdGlvbnMgPSBbXTsKLSAgICAgICAgICB0aGlzLnR5cGVJbmplY3Rpb25zLnNl
dCh0eXBlLCBpbmplY3Rpb25zKTsKLSAgICAgICAgfQotICAgICAgICBpbmplY3Rpb25zLnB1c2go
eyBwcm9wZXJ0eTogcHJvcGVydHksIGZ1bGxOYW1lOiBmdWxsTmFtZSB9KTsKLSAgICAgIH0sCitt
aXhpblByb3BlcnRpZXMoQmluZGluZywgewogCi0gICAgICBpbmplY3Rpb246IGZ1bmN0aW9uKGZh
Y3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSkgewotICAgICAgICBpZiAodGhpcy5w
YXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdpbmplY3Rpb24nKTsgfQorICAvKgorICAg
IFNlZSBgRW1iZXIuQmluZGluZy5mcm9tYC4KIAotICAgICAgICBpZiAoZmFjdG9yeU5hbWUuaW5k
ZXhPZignOicpID09PSAtMSkgewotICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVJbmplY3Rpb24o
ZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKTsKLSAgICAgICAgfQorICAgIEBt
ZXRob2QgZnJvbQorICAgIEBzdGF0aWMKKyAgKi8KKyAgZnJvbTogZnVuY3Rpb24oKSB7CisgICAg
dmFyIEMgPSB0aGlzLCBiaW5kaW5nID0gbmV3IEMoKTsKKyAgICByZXR1cm4gYmluZGluZy5mcm9t
LmFwcGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7CisgIH0sCiAKLSAgICAgICAgdmFyIGluamVjdGlv
bnMgPSB0aGlzLmluamVjdGlvbnNbZmFjdG9yeU5hbWVdID0gdGhpcy5pbmplY3Rpb25zW2ZhY3Rv
cnlOYW1lXSB8fCBbXTsKLSAgICAgICAgaW5qZWN0aW9ucy5wdXNoKHsgcHJvcGVydHk6IHByb3Bl
cnR5LCBmdWxsTmFtZTogaW5qZWN0aW9uTmFtZSB9KTsKLSAgICAgIH0sCisgIC8qCisgICAgU2Vl
IGBFbWJlci5CaW5kaW5nLnRvYC4KIAotICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlOworICAgIEBtZXRob2QgdG8KKyAgICBAc3RhdGlj
CisgICovCisgIHRvOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgQyA9IHRoaXMsIGJpbmRpbmcgPSBu
ZXcgQygpOworICAgIHJldHVybiBiaW5kaW5nLnRvLmFwcGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7
CisgIH0sCiAKLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPXRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBp
PGw7IGkrKykgewotICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGVzdHJveSgpOwotICAgICAg
ICB9CisgIC8qKgorICAgIENyZWF0ZXMgYSBuZXcgQmluZGluZyBpbnN0YW5jZSBhbmQgbWFrZXMg
aXQgYXBwbHkgaW4gYSBzaW5nbGUgZGlyZWN0aW9uLgorICAgIEEgb25lLXdheSBiaW5kaW5nIHdp
bGwgcmVsYXkgY2hhbmdlcyBvbiB0aGUgYGZyb21gIHNpZGUgb2JqZWN0IChzdXBwbGllZAorICAg
IGFzIHRoZSBgZnJvbWAgYXJndW1lbnQpIHRoZSBgdG9gIHNpZGUsIGJ1dCBub3QgdGhlIG90aGVy
IHdheSBhcm91bmQuCisgICAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBjaGFuZ2UgdGhlICJ0byIg
c2lkZSBkaXJlY3RseSwgdGhlICJmcm9tIiBzaWRlIG1heSBoYXZlCisgICAgYSBkaWZmZXJlbnQg
dmFsdWUuCiAKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOworICAgIFNlZSBgQmluZGluZy5v
bmVXYXlgLgogCi0gICAgICAgIGVhY2hEZXN0cm95YWJsZSh0aGlzLCBmdW5jdGlvbihpdGVtKSB7
Ci0gICAgICAgICAgaXRlbS5pc0Rlc3Ryb3lpbmcgPSB0cnVlOwotICAgICAgICB9KTsKKyAgICBA
bWV0aG9kIG9uZVdheQorICAgIEBwYXJhbSB7U3RyaW5nfSBmcm9tIGZyb20gcGF0aC4KKyAgICBA
cGFyYW0ge0Jvb2xlYW59IFtmbGFnXSAoT3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBoZXJlIHdp
bGwgbWFrZSB0aGUKKyAgICAgIGJpbmRpbmcgYG9uZVdheWAuIFlvdSBjYW4gaW5zdGVhZCBwYXNz
IGBmYWxzZWAgdG8gZGlzYWJsZSBgb25lV2F5YCwgbWFraW5nIHRoZQorICAgICAgYmluZGluZyB0
d28gd2F5IGFnYWluLgorICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAqLwor
ICBvbmVXYXk6IGZ1bmN0aW9uKGZyb20sIGZsYWcpIHsKKyAgICB2YXIgQyA9IHRoaXMsIGJpbmRp
bmcgPSBuZXcgQyhudWxsLCBmcm9tKTsKKyAgICByZXR1cm4gYmluZGluZy5vbmVXYXkoZmxhZyk7
CisgIH0KIAotICAgICAgICBlYWNoRGVzdHJveWFibGUodGhpcywgZnVuY3Rpb24oaXRlbSkgewot
ICAgICAgICAgIGl0ZW0uZGVzdHJveSgpOwotICAgICAgICB9KTsKK30pOwogCi0gICAgICAgIGRl
bGV0ZSB0aGlzLnBhcmVudDsKLSAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7Ci0gICAg
ICB9LAorLyoqCisgIEFuIGBFbWJlci5CaW5kaW5nYCBjb25uZWN0cyB0aGUgcHJvcGVydGllcyBv
ZiB0d28gb2JqZWN0cyBzbyB0aGF0IHdoZW5ldmVyCisgIHRoZSB2YWx1ZSBvZiBvbmUgcHJvcGVy
dHkgY2hhbmdlcywgdGhlIG90aGVyIHByb3BlcnR5IHdpbGwgYmUgY2hhbmdlZCBhbHNvLgogCi0g
ICAgICByZXNldDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlzLmNo
aWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICByZXNldENhY2hlKHRoaXMuY2hp
bGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgICAgIHJlc2V0Q2FjaGUodGhpcyk7Ci0gICAgICB9
Ci0gICAgfTsKKyAgIyMgQXV0b21hdGljIENyZWF0aW9uIG9mIEJpbmRpbmdzIHdpdGggYC9eKkJp
bmRpbmcvYC1uYW1lZCBQcm9wZXJ0aWVzCiAKLSAgICBmdW5jdGlvbiBpbGxlZ2FsQ2hpbGRPcGVy
YXRpb24ob3BlcmF0aW9uKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3Iob3BlcmF0aW9uICsgIiBp
cyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBjaGlsZCBjb250YWluZXJzIik7Ci0gICAgfQor
ICBZb3UgZG8gbm90IHVzdWFsbHkgY3JlYXRlIEJpbmRpbmcgb2JqZWN0cyBkaXJlY3RseSBidXQg
aW5zdGVhZCBkZXNjcmliZQorICBiaW5kaW5ncyBpbiB5b3VyIGNsYXNzIG9yIG9iamVjdCBkZWZp
bml0aW9uIHVzaW5nIGF1dG9tYXRpYyBiaW5kaW5nCisgIGRldGVjdGlvbi4KIAotICAgIGZ1bmN0
aW9uIGlzU2luZ2xldG9uKGNvbnRhaW5lciwgZnVsbE5hbWUpIHsKLSAgICAgIHZhciBzaW5nbGV0
b24gPSBvcHRpb24oY29udGFpbmVyLCBmdWxsTmFtZSwgJ3NpbmdsZXRvbicpOworICBQcm9wZXJ0
aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5nYCBzdWZmaXggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYEVt
YmVyLkJpbmRpbmdgCisgIGluc3RhbmNlcy4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgc2hv
dWxkIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBhdGgKKyAgdG8gYW5vdGhlciBvYmplY3Qg
b3IgYSBjdXN0b20gYmluZGluZyBpbnN0YW5jZWQgY3JlYXRlZCB1c2luZyBCaW5kaW5nIGhlbHBl
cnMKKyAgKHNlZSAiT25lIFdheSBCaW5kaW5ncyIpOgogCi0gICAgICByZXR1cm4gc2luZ2xldG9u
ICE9PSBmYWxzZTsKLSAgICB9CisgIGBgYAorICB2YWx1ZUJpbmRpbmc6ICJNeUFwcC5zb21lQ29u
dHJvbGxlci50aXRsZSIKKyAgYGBgCiAKLSAgICBmdW5jdGlvbiBidWlsZEluamVjdGlvbnMoY29u
dGFpbmVyLCBpbmplY3Rpb25zKSB7Ci0gICAgICB2YXIgaGFzaCA9IHt9OworICBUaGlzIHdpbGwg
Y3JlYXRlIGEgYmluZGluZyBmcm9tIGBNeUFwcC5zb21lQ29udHJvbGxlci50aXRsZWAgdG8gdGhl
IGB2YWx1ZWAKKyAgcHJvcGVydHkgb2YgeW91ciBvYmplY3QgaW5zdGFuY2UgYXV0b21hdGljYWxs
eS4gTm93IHRoZSB0d28gdmFsdWVzIHdpbGwgYmUKKyAga2VwdCBpbiBzeW5jLgogCi0gICAgICBp
ZiAoIWluamVjdGlvbnMpIHsgcmV0dXJuIGhhc2g7IH0KKyAgIyMgT25lIFdheSBCaW5kaW5ncwog
Ci0gICAgICB2YXIgaW5qZWN0aW9uLCBsb29rdXA7CisgIE9uZSBlc3BlY2lhbGx5IHVzZWZ1bCBi
aW5kaW5nIGN1c3RvbWl6YXRpb24geW91IGNhbiB1c2UgaXMgdGhlIGBvbmVXYXkoKWAKKyAgaGVs
cGVyLiBUaGlzIGhlbHBlciB0ZWxscyBFbWJlciB0aGF0IHlvdSBhcmUgb25seSBpbnRlcmVzdGVk
IGluCisgIHJlY2VpdmluZyBjaGFuZ2VzIG9uIHRoZSBvYmplY3QgeW91IGFyZSBiaW5kaW5nIGZy
b20uIEZvciBleGFtcGxlLCBpZiB5b3UKKyAgYXJlIGJpbmRpbmcgdG8gYSBwcmVmZXJlbmNlIGFu
ZCB5b3Ugd2FudCB0byBiZSBub3RpZmllZCBpZiB0aGUgcHJlZmVyZW5jZQorICBoYXMgY2hhbmdl
ZCwgYnV0IHlvdXIgb2JqZWN0IHdpbGwgbm90IGJlIGNoYW5naW5nIHRoZSBwcmVmZXJlbmNlIGl0
c2VsZiwgeW91CisgIGNvdWxkIGRvOgogCi0gICAgICBmb3IgKHZhciBpPTAsIGw9aW5qZWN0aW9u
cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGluamVjdGlvbiA9IGluamVjdGlvbnNbaV07
Ci0gICAgICAgIGxvb2t1cCA9IGNvbnRhaW5lci5sb29rdXAoaW5qZWN0aW9uLmZ1bGxOYW1lKTsK
LSAgICAgICAgaGFzaFtpbmplY3Rpb24ucHJvcGVydHldID0gbG9va3VwOwotICAgICAgfQorICBg
YGAKKyAgYmlnVGl0bGVzQmluZGluZzogRW1iZXIuQmluZGluZy5vbmVXYXkoIk15QXBwLnByZWZl
cmVuY2VzQ29udHJvbGxlci5iaWdUaXRsZXMiKQorICBgYGAKIAotICAgICAgcmV0dXJuIGhhc2g7
Ci0gICAgfQorICBUaGlzIHdheSBpZiB0aGUgdmFsdWUgb2YgYE15QXBwLnByZWZlcmVuY2VzQ29u
dHJvbGxlci5iaWdUaXRsZXNgIGNoYW5nZXMgdGhlCisgIGBiaWdUaXRsZXNgIHByb3BlcnR5IG9m
IHlvdXIgb2JqZWN0IHdpbGwgY2hhbmdlIGFsc28uIEhvd2V2ZXIsIGlmIHlvdQorICBjaGFuZ2Ug
dGhlIHZhbHVlIG9mIHlvdXIgYGJpZ1RpdGxlc2AgcHJvcGVydHksIGl0IHdpbGwgbm90IHVwZGF0
ZSB0aGUKKyAgYHByZWZlcmVuY2VzQ29udHJvbGxlcmAuCiAKLSAgICBmdW5jdGlvbiBvcHRpb24o
Y29udGFpbmVyLCBmdWxsTmFtZSwgb3B0aW9uTmFtZSkgewotICAgICAgdmFyIG9wdGlvbnMgPSBj
b250YWluZXIuX29wdGlvbnMuZ2V0KGZ1bGxOYW1lKTsKKyAgT25lIHdheSBiaW5kaW5ncyBhcmUg
YWxtb3N0IHR3aWNlIGFzIGZhc3QgdG8gc2V0dXAgYW5kIHR3aWNlIGFzIGZhc3QgdG8KKyAgZXhl
Y3V0ZSBiZWNhdXNlIHRoZSBiaW5kaW5nIG9ubHkgaGFzIHRvIHdvcnJ5IGFib3V0IGNoYW5nZXMg
dG8gb25lIHNpZGUuCiAKLSAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbb3B0aW9uTmFtZV0g
IT09IHVuZGVmaW5lZCkgewotICAgICAgICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXTsKLSAg
ICAgIH0KKyAgWW91IHNob3VsZCBjb25zaWRlciB1c2luZyBvbmUgd2F5IGJpbmRpbmdzIGFueXRp
bWUgeW91IGhhdmUgYW4gb2JqZWN0IHRoYXQKKyAgbWF5IGJlIGNyZWF0ZWQgZnJlcXVlbnRseSBh
bmQgeW91IGRvIG5vdCBpbnRlbmQgdG8gY2hhbmdlIGEgcHJvcGVydHk7IG9ubHkKKyAgdG8gbW9u
aXRvciBpdCBmb3IgY2hhbmdlcyAoc3VjaCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuCiAKLSAg
ICAgIHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoIjoiKVswXTsKLSAgICAgIG9wdGlvbnMgPSBj
b250YWluZXIuX3R5cGVPcHRpb25zLmdldCh0eXBlKTsKKyAgIyMgQWRkaW5nIEJpbmRpbmdzIE1h
bnVhbGx5CiAKLSAgICAgIGlmIChvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zW29w
dGlvbk5hbWVdOwotICAgICAgfQotICAgIH0KKyAgQWxsIG9mIHRoZSBleGFtcGxlcyBhYm92ZSBz
aG93IHlvdSBob3cgdG8gY29uZmlndXJlIGEgY3VzdG9tIGJpbmRpbmcsIGJ1dCB0aGUKKyAgcmVz
dWx0IG9mIHRoZXNlIGN1c3RvbWl6YXRpb25zIHdpbGwgYmUgYSBiaW5kaW5nIHRlbXBsYXRlLCBu
b3QgYSBmdWxseSBhY3RpdmUKKyAgQmluZGluZyBpbnN0YW5jZS4gVGhlIGJpbmRpbmcgd2lsbCBh
Y3R1YWxseSBiZWNvbWUgYWN0aXZlIG9ubHkgd2hlbiB5b3UKKyAgaW5zdGFudGlhdGUgdGhlIG9i
amVjdCB0aGUgYmluZGluZyBiZWxvbmdzIHRvLiBJdCBpcyB1c2VmdWwgaG93ZXZlciwgdG8KKyAg
dW5kZXJzdGFuZCB3aGF0IGFjdHVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgYmluZGluZyBpcyBhY3Rp
dmF0ZWQuCiAKLSAgICBmdW5jdGlvbiBmYWN0b3J5Rm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpIHsK
LSAgICAgIHJldHVybiBjb250YWluZXIucmVzb2x2ZShmdWxsTmFtZSk7Ci0gICAgfQorICBGb3Ig
YSBiaW5kaW5nIHRvIGZ1bmN0aW9uIGl0IG11c3QgaGF2ZSBhdCBsZWFzdCBhIGBmcm9tYCBwcm9w
ZXJ0eSBhbmQgYSBgdG9gCisgIHByb3BlcnR5LiBUaGUgYGZyb21gIHByb3BlcnR5IHBhdGggcG9p
bnRzIHRvIHRoZSBvYmplY3Qva2V5IHRoYXQgeW91IHdhbnQgdG8KKyAgYmluZCBmcm9tIHdoaWxl
IHRoZSBgdG9gIHBhdGggcG9pbnRzIHRvIHRoZSBvYmplY3Qva2V5IHlvdSB3YW50IHRvIGJpbmQg
dG8uCiAKLSAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZShjb250YWluZXIsIGZ1bGxOYW1lKSB7Ci0g
ICAgICB2YXIgZmFjdG9yeSA9IGZhY3RvcnlGb3IoY29udGFpbmVyLCBmdWxsTmFtZSk7CisgIFdo
ZW4geW91IGRlZmluZSBhIGN1c3RvbSBiaW5kaW5nLCB5b3UgYXJlIHVzdWFsbHkgZGVzY3JpYmlu
ZyB0aGUgcHJvcGVydHkKKyAgeW91IHdhbnQgdG8gYmluZCBmcm9tIChzdWNoIGFzIGBNeUFwcC5z
b21lQ29udHJvbGxlci52YWx1ZWAgaW4gdGhlIGV4YW1wbGVzCisgIGFib3ZlKS4gV2hlbiB5b3Vy
IG9iamVjdCBpcyBjcmVhdGVkLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXNzaWduIHRoZSB2YWx1
ZQorICB5b3Ugd2FudCB0byBiaW5kIGB0b2AgYmFzZWQgb24gdGhlIG5hbWUgb2YgeW91ciBiaW5k
aW5nIGtleS4gSW4gdGhlCisgIGV4YW1wbGVzIGFib3ZlLCBkdXJpbmcgaW5pdCwgRW1iZXIgb2Jq
ZWN0cyB3aWxsIGVmZmVjdGl2ZWx5IGNhbGwKKyAgc29tZXRoaW5nIGxpa2UgdGhpcyBvbiB5b3Vy
IGJpbmRpbmc6CiAKLSAgICAgIHZhciBzcGxpdE5hbWUgPSBmdWxsTmFtZS5zcGxpdCgiOiIpLAot
ICAgICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0sIG5hbWUgPSBzcGxpdE5hbWVbMV0sCi0gICAg
ICAgICAgdmFsdWU7CisgIGBgYGphdmFzY3JpcHQKKyAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcu
ZnJvbSh0aGlzLnZhbHVlQmluZGluZykudG8oInZhbHVlIik7CisgIGBgYAogCi0gICAgICBpZiAo
b3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBmYWxzZSkgewot
ICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICAgIH0KKyAgVGhpcyBjcmVhdGVzIGEgbmV3IGJp
bmRpbmcgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHRlbXBsYXRlIHlvdSBwcm92aWRlLCBhbmQKKyAg
c2V0cyB0aGUgdG8gcGF0aCB0byB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBvZiB0aGUgbmV3IG9iamVj
dC4gTm93IHRoYXQgdGhlCisgIGJpbmRpbmcgaXMgZnVsbHkgY29uZmlndXJlZCB3aXRoIGEgYGZy
b21gIGFuZCBhIGB0b2AsIGl0IHNpbXBseSBuZWVkcyB0byBiZQorICBjb25uZWN0ZWQgdG8gYmVj
b21lIGFjdGl2ZS4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjb25uZWN0KClgIG1ldGhvZDoK
IAotICAgICAgaWYgKGZhY3RvcnkpIHsKLSAgICAgICAgdmFyIGluamVjdGlvbnMgPSBbXTsKLSAg
ICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci50eXBlSW5qZWN0
aW9ucy5nZXQodHlwZSkgfHwgW10pOwotICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9ucy5j
b25jYXQoY29udGFpbmVyLmluamVjdGlvbnNbZnVsbE5hbWVdIHx8IFtdKTsKKyAgYGBgamF2YXNj
cmlwdAorICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7CisgIGBgYAogCi0gICAgICAgIHZhciBoYXNo
ID0gYnVpbGRJbmplY3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucyk7Ci0gICAgICAgIGhhc2gu
Y29udGFpbmVyID0gY29udGFpbmVyOwotICAgICAgICBoYXNoLl9kZWJ1Z0NvbnRhaW5lcktleSA9
IGZ1bGxOYW1lOworICBOb3RlIHRoYXQgd2hlbiB5b3UgY29ubmVjdCBhIGJpbmRpbmcgeW91IHBh
c3MgdGhlIG9iamVjdCB5b3Ugd2FudCBpdCB0byBiZQorICBjb25uZWN0ZWQgdG8uIFRoaXMgb2Jq
ZWN0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBmb3IgYm90aCB0aGUgZnJvbSBhbmQKKyAgdG8g
c2lkZSBvZiB0aGUgYmluZGluZyB3aGVuIGluc3BlY3RpbmcgcmVsYXRpdmUgcGF0aHMuIFRoaXMg
YWxsb3dzIHRoZQorICBiaW5kaW5nIHRvIGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJ5IHN1
YmNsYXNzZWQgb2JqZWN0cyBhcyB3ZWxsLgogCi0gICAgICAgIHZhbHVlID0gZmFjdG9yeS5jcmVh
dGUoaGFzaCk7CisgIE5vdyB0aGF0IHRoZSBiaW5kaW5nIGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBv
YnNlcnZlIGJvdGggdGhlIGZyb20gYW5kIHRvIHNpZGUKKyAgYW5kIHJlbGF5IGNoYW5nZXMuCiAK
LSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgIH0KKyAgSWYgeW91IGV2ZXIgbmVl
ZGVkIHRvIGRvIHNvICh5b3UgYWxtb3N0IG5ldmVyIHdpbGwsIGJ1dCBpdCBpcyB1c2VmdWwgdG8K
KyAgdW5kZXJzdGFuZCB0aGlzIGFueXdheSksIHlvdSBjb3VsZCBtYW51YWxseSBjcmVhdGUgYW4g
YWN0aXZlIGJpbmRpbmcgYnkKKyAgdXNpbmcgdGhlIGBFbWJlci5iaW5kKClgIGhlbHBlciBtZXRo
b2QuIChUaGlzIGlzIHRoZSBzYW1lIG1ldGhvZCB1c2VkIGJ5CisgIHRvIHNldHVwIHlvdXIgYmlu
ZGluZ3Mgb24gb2JqZWN0cyk6CiAKLSAgICBmdW5jdGlvbiBlYWNoRGVzdHJveWFibGUoY29udGFp
bmVyLCBjYWxsYmFjaykgewotICAgICAgY29udGFpbmVyLmNhY2hlLmVhY2hMb2NhbChmdW5jdGlv
bihrZXksIHZhbHVlKSB7Ci0gICAgICAgIGlmIChvcHRpb24oY29udGFpbmVyLCBrZXksICdpbnN0
YW50aWF0ZScpID09PSBmYWxzZSkgeyByZXR1cm47IH0KLSAgICAgICAgY2FsbGJhY2sodmFsdWUp
OwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gcmVzZXRDYWNoZShjb250YWluZXIp
IHsKLSAgICAgIGNvbnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5LCB2YWx1ZSkg
ewotICAgICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlhdGUnKSA9PT0g
ZmFsc2UpIHsgcmV0dXJuOyB9Ci0gICAgICAgIHZhbHVlLmRlc3Ryb3koKTsKLSAgICAgIH0pOwot
ICAgICAgY29udGFpbmVyLmNhY2hlLmRpY3QgPSB7fTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQ29u
dGFpbmVyOwotfSk7Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBFTlYgKi8K
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIg
aW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOwotCi0vLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBUWVBJTkcgJiBBUlJBWSBNRVNTQUdJ
TkcKLS8vCi0KLXZhciBUWVBFX01BUCA9IHt9OwotdmFyIHQgPSAiQm9vbGVhbiBOdW1iZXIgU3Ry
aW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKTsKLUVtYmVy
LkFycmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBmdW5jdGlvbihuYW1lKSB7Ci0gIFRZUEVf
TUFQWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotfSk7
Ci0KLXZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Ci0KLS8qKgotICBS
ZXR1cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIGl0ZW0uCi0KLSAgVXNlIHRo
aXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBlIG9mIGFu
IGl0ZW0uCi0gIEl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhY3Jvc3MgYWxsIGJyb3dz
ZXJzIGFuZCBpbmNsdWRlcyBhIGJpdAotICBtb3JlIGRldGFpbC4gSGVyZSBpcyB3aGF0IHdpbGwg
YmUgcmV0dXJuZWQ6Ci0KLSAgICAgIHwgUmV0dXJuIFZhbHVlICB8IE1lYW5pbmcgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfC0tLS0tLS0tLS0t
LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS18Ci0gICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0aXZlICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ251bWJlcicgICAgICB8IE51bWJl
ciBwcmltaXRpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAg
fCAnYm9vbGVhbicgICAgIHwgQm9vbGVhbiBwcmltaXRpdmUgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB8Ci0gICAgICB8ICdudWxsJyAgICAgICAgfCBOdWxsIHZhbHVlICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ3VuZGVmaW5l
ZCcgICB8IFVuZGVmaW5lZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfAotICAgICAgfCAnZnVuY3Rpb24nICAgIHwgQSBmdW5jdGlvbiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdhcnJheScgICAgICAgfCBBbiBp
bnN0YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAg
IHwgJ2NsYXNzJyAgICAgICB8IEEgRW1iZXIgY2xhc3MgKGNyZWF0ZWQgdXNpbmcgRW1iZXIuT2Jq
ZWN0LmV4dGVuZCgpKSAgfAotICAgICAgfCAnaW5zdGFuY2UnICAgIHwgQSBFbWJlciBvYmplY3Qg
aW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdlcnJvcicg
ICAgICAgfCBBbiBpbnN0YW5jZSBvZiB0aGUgRXJyb3Igb2JqZWN0ICAgICAgICAgICAgICAgICAg
ICAgIHwKLSAgICAgIHwgJ29iamVjdCcgICAgICB8IEEgSmF2YVNjcmlwdCBvYmplY3Qgbm90IGlu
aGVyaXRpbmcgZnJvbSBFbWJlci5PYmplY3QgfAorICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLmJp
bmQoTXlBcHAuYW5vdGhlck9iamVjdCwgInZhbHVlIiwgIk15QXBwLnNvbWVDb250cm9sbGVyLnZh
bHVlIik7CisgIGBgYAogCi0gIEV4YW1wbGVzOgorICBCb3RoIG9mIHRoZXNlIGNvZGUgZnJhZ21l
bnRzIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIGRvaW5nIHRoZSBtb3N0IGZyaWVuZGx5CisgIGZv
cm0gb2YgYmluZGluZyBjcmVhdGlvbiBsaWtlIHNvOgogCiAgIGBgYGphdmFzY3JpcHQKLSAgRW1i
ZXIudHlwZU9mKCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyAndW5kZWZpbmVkJwotICBFbWJl
ci50eXBlT2YobnVsbCk7ICAgICAgICAgICAgICAgICAgIC8vICdudWxsJwotICBFbWJlci50eXBl
T2YodW5kZWZpbmVkKTsgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCi0gIEVtYmVyLnR5cGVP
ZignbWljaGFlbCcpOyAgICAgICAgICAgICAgLy8gJ3N0cmluZycKLSAgRW1iZXIudHlwZU9mKDEw
MSk7ICAgICAgICAgICAgICAgICAgICAvLyAnbnVtYmVyJwotICBFbWJlci50eXBlT2YodHJ1ZSk7
ICAgICAgICAgICAgICAgICAgIC8vICdib29sZWFuJwotICBFbWJlci50eXBlT2YoRW1iZXIubWFr
ZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKLSAgRW1iZXIudHlwZU9mKFsxLDIsOTBdKTsg
ICAgICAgICAgICAgICAvLyAnYXJyYXknCi0gIEVtYmVyLnR5cGVPZihFbWJlci5PYmplY3QuZXh0
ZW5kKCkpOyAgLy8gJ2NsYXNzJwotICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmNyZWF0ZSgp
KTsgIC8vICdpbnN0YW5jZScKLSAgRW1iZXIudHlwZU9mKG5ldyBFcnJvcigndGVhbW9jaWwnKSk7
ICAvLyAnZXJyb3InCisgIE15QXBwLmFub3RoZXJPYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRl
KHsKKyAgICB2YWx1ZUJpbmRpbmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci52YWx1ZSIsCiAKLSAg
Ly8gIm5vcm1hbCIgSmF2YVNjcmlwdCBvYmplY3QKLSAgRW1iZXIudHlwZU9mKHthOiAnYid9KTsg
ICAgICAgICAgICAgIC8vICdvYmplY3QnCisgICAgLy8gT1RIRVIgQ09ERSBGT1IgVEhJUyBPQkpF
Q1QuLi4KKyAgfSk7CiAgIGBgYAogCi0gIEBtZXRob2QgdHlwZU9mCi0gIEBmb3IgRW1iZXIKLSAg
QHBhcmFtIGl0ZW0ge09iamVjdH0gdGhlIGl0ZW0gdG8gY2hlY2sKLSAgQHJldHVybiB7U3RyaW5n
fSB0aGUgdHlwZQotKi8KLUVtYmVyLnR5cGVPZiA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgdmFyIHJl
dDsKLQotICByZXQgPSAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpID8gU3Ry
aW5nKGl0ZW0pIDogVFlQRV9NQVBbdG9TdHJpbmcuY2FsbChpdGVtKV0gfHwgJ29iamVjdCc7Cisg
IEVtYmVyJ3MgYnVpbHQgaW4gYmluZGluZyBjcmVhdGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0
byBhdXRvbWF0aWNhbGx5CisgIGNyZWF0ZSBiaW5kaW5ncyBmb3IgeW91LiBZb3Ugc2hvdWxkIGFs
d2F5cyB1c2UgdGhlIGhpZ2hlc3QtbGV2ZWwgQVBJcworICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91
IHVuZGVyc3RhbmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCiAKLSAgaWYgKHJldCA9PT0gJ2Z1
bmN0aW9uJykgewotICAgIGlmIChFbWJlci5PYmplY3QgJiYgRW1iZXIuT2JqZWN0LmRldGVjdChp
dGVtKSkgcmV0ID0gJ2NsYXNzJzsKLSAgfSBlbHNlIGlmIChyZXQgPT09ICdvYmplY3QnKSB7Ci0g
ICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvcikgcmV0ID0gJ2Vycm9yJzsKLSAgICBlbHNlIGlm
IChFbWJlci5PYmplY3QgJiYgaXRlbSBpbnN0YW5jZW9mIEVtYmVyLk9iamVjdCkgcmV0ID0gJ2lu
c3RhbmNlJzsKLSAgICBlbHNlIHJldCA9ICdvYmplY3QnOwotICB9CisgIEBjbGFzcyBCaW5kaW5n
CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQHNpbmNlIEVtYmVyIDAuOQorKi8KK0VtYmVyLkJpbmRp
bmcgPSBCaW5kaW5nOwogCi0gIHJldHVybiByZXQ7Ci19OwogCiAvKioKLSAgUmV0dXJucyB0cnVl
IGlmIHRoZSBwYXNzZWQgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQuIFRoaXMgYXZvaWRzIGVy
cm9ycwotICBmcm9tIEpTTGludCBjb21wbGFpbmluZyBhYm91dCB1c2Ugb2YgPT0sIHdoaWNoIGNh
biBiZSB0ZWNobmljYWxseQotICBjb25mdXNpbmcuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJl
ci5pc05vbmUoKTsgICAgICAgICAgICAgIC8vIHRydWUKLSAgRW1iZXIuaXNOb25lKG51bGwpOyAg
ICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzTm9uZSh1bmRlZmluZWQpOyAgICAgLy8gdHJ1ZQot
ICBFbWJlci5pc05vbmUoJycpOyAgICAgICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlzTm9uZShb
XSk7ICAgICAgICAgICAgLy8gZmFsc2UKLSAgRW1iZXIuaXNOb25lKGZ1bmN0aW9uKCl7fSk7ICAv
LyBmYWxzZQotICBgYGAKKyAgR2xvYmFsIGhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGJp
bmRpbmcuIEp1c3QgcGFzcyB0aGUgcm9vdCBvYmplY3QKKyAgYWxvbmcgd2l0aCBhIGB0b2AgYW5k
IGBmcm9tYCBwYXRoIHRvIGNyZWF0ZSBhbmQgY29ubmVjdCB0aGUgYmluZGluZy4KIAotICBAbWV0
aG9kIGlzTm9uZQorICBAbWV0aG9kIGJpbmQKICAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVj
dH0gb2JqIFZhbHVlIHRvIHRlc3QKLSAgQHJldHVybiB7Qm9vbGVhbn0KKyAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHRyYW5zZm9ybS4KKyAgQHBhcmFtIHtTdHJp
bmd9IHRvIFRoZSBwYXRoIHRvIHRoZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCisgICAgTXVz
dCBiZSByZWxhdGl2ZSB0byBvYmouCisgIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBwYXRoIHRv
IHRoZSAnZnJvbScgc2lkZSBvZiB0aGUgYmluZGluZy4KKyAgICBNdXN0IGJlIHJlbGF0aXZlIHRv
IG9iaiBvciBhIGdsb2JhbCBwYXRoLgorICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBiaW5kaW5n
IGluc3RhbmNlCiAqLwotRW1iZXIuaXNOb25lID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVybiBv
YmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7CitFbWJlci5iaW5kID0gZnVuY3Rpb24o
b2JqLCB0bywgZnJvbSkgeworICByZXR1cm4gbmV3IEVtYmVyLkJpbmRpbmcodG8sIGZyb20pLmNv
bm5lY3Qob2JqKTsKIH07Ci1FbWJlci5ub25lID0gRW1iZXIuZGVwcmVjYXRlRnVuYygiRW1iZXIu
bm9uZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLmlzTm9uZSBpbnN0ZWFkLiIsIEVt
YmVyLmlzTm9uZSk7CiAKIC8qKgotICBWZXJpZmllcyB0aGF0IGEgdmFsdWUgaXMgYG51bGxgIG9y
IGFuIGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksCi0gIG9yIGVtcHR5IGZ1bmN0aW9uLgotCi0g
IENvbnN0cmFpbnMgdGhlIHJ1bGVzIG9uIGBFbWJlci5pc05vbmVgIGJ5IHJldHVybmluZyBmYWxz
ZSBmb3IgZW1wdHkKLSAgc3RyaW5nIGFuZCBlbXB0eSBhcnJheXMuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5pc0VtcHR5KCk7ICAgICAgICAgICAgICAgIC8vIHRydWUKLSAgRW1iZXIuaXNF
bXB0eShudWxsKTsgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkodW5kZWZpbmVk
KTsgICAgICAgLy8gdHJ1ZQotICBFbWJlci5pc0VtcHR5KCcnKTsgICAgICAgICAgICAgIC8vIHRy
dWUKLSAgRW1iZXIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlz
RW1wdHkoJ0FkYW0gSGF3a2lucycpOyAgLy8gZmFsc2UKLSAgRW1iZXIuaXNFbXB0eShbMCwxLDJd
KTsgICAgICAgICAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGlzRW1wdHkKKyAgQG1ldGhv
ZCBvbmVXYXkKICAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFZhbHVlIHRvIHRl
c3QKLSAgQHJldHVybiB7Qm9vbGVhbn0KKyAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBv
YmplY3Qgb2YgdGhlIHRyYW5zZm9ybS4KKyAgQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRv
IHRoZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCisgICAgTXVzdCBiZSByZWxhdGl2ZSB0byBv
YmouCisgIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBwYXRoIHRvIHRoZSAnZnJvbScgc2lkZSBv
ZiB0aGUgYmluZGluZy4KKyAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iaiBvciBhIGdsb2JhbCBw
YXRoLgorICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBiaW5kaW5nIGluc3RhbmNlCiAqLwotRW1i
ZXIuaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikgewotICByZXR1cm4gb2JqID09PSBudWxsIHx8IG9i
aiA9PT0gdW5kZWZpbmVkIHx8IChvYmoubGVuZ3RoID09PSAwICYmIHR5cGVvZiBvYmogIT09ICdm
dW5jdGlvbicpIHx8ICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBFbWJlci5nZXQob2JqLCAn
bGVuZ3RoJykgPT09IDApOworRW1iZXIub25lV2F5ID0gZnVuY3Rpb24ob2JqLCB0bywgZnJvbSkg
eworICByZXR1cm4gbmV3IEVtYmVyLkJpbmRpbmcodG8sIGZyb20pLm9uZVdheSgpLmNvbm5lY3Qo
b2JqKTsKIH07Ci1FbWJlci5lbXB0eSA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLmVtcHR5
IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRW1iZXIuaXNFbXB0eSBpbnN0ZWFkLiIsIEVtYmVy
LmlzRW1wdHkpIDsKIAotLyoqCi0gVGhpcyB3aWxsIGNvbXBhcmUgdHdvIGphdmFzY3JpcHQgdmFs
dWVzIG9mIHBvc3NpYmx5IGRpZmZlcmVudCB0eXBlcy4KLSBJdCB3aWxsIHRlbGwgeW91IHdoaWNo
IG9uZSBpcyBncmVhdGVyIHRoYW4gdGhlIG90aGVyIGJ5IHJldHVybmluZzoKLQotICAtIC0xIGlm
IHRoZSBmaXJzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwKLSAgLSAwIGlmIGJvdGggYXJl
IGVxdWFsLAotICAtIDEgaWYgdGhlIGZpcnN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgor
fSkoKTsKIAotIFRoZSBvcmRlciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIGBFbWJlci5PUkRFUl9E
RUZJTklUSU9OYCwgaWYgdHlwZXMgYXJlIGRpZmZlcmVudC4KLSBJbiBjYXNlIHRoZXkgaGF2ZSB0
aGUgc2FtZSB0eXBlIGFuIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZm9yIHRoaXMgdHlwZSBpcyBt
YWRlLgogCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuY29tcGFyZSgnaGVsbG8nLCAnaGVsbG8n
KTsgIC8vIDAKLSAgRW1iZXIuY29tcGFyZSgnYWJjJywgJ2RmZycpOyAgICAgIC8vIC0xCi0gIEVt
YmVyLmNvbXBhcmUoMiwgMSk7ICAgICAgICAgICAgICAvLyAxCi0gIGBgYAogCi0gQG1ldGhvZCBj
b21wYXJlCi0gQGZvciBFbWJlcgotIEBwYXJhbSB7T2JqZWN0fSB2IEZpcnN0IHZhbHVlIHRvIGNv
bXBhcmUKLSBAcGFyYW0ge09iamVjdH0gdyBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZQotIEByZXR1
cm4ge051bWJlcn0gLTEgaWYgdiA8IHcsIDAgaWYgdiA9IHcgYW5kIDEgaWYgdiA+IHcuCisoZnVu
Y3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItbWV0YWwKICov
Ci1FbWJlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSh2LCB3KSB7Ci0gIGlmICh2ID09PSB3
KSB7IHJldHVybiAwOyB9CiAKLSAgdmFyIHR5cGUxID0gRW1iZXIudHlwZU9mKHYpOwotICB2YXIg
dHlwZTIgPSBFbWJlci50eXBlT2Yodyk7Cit2YXIgTWl4aW4sIFJFUVVJUkVELCBBbGlhcywKKyAg
ICBhX21hcCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcCwKKyAgICBhX2luZGV4T2YgPSBFbWJl
ci5BcnJheVBvbHlmaWxscy5pbmRleE9mLAorICAgIGFfZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9s
eWZpbGxzLmZvckVhY2gsCisgICAgYV9zbGljZSA9IFtdLnNsaWNlLAorICAgIG9fY3JlYXRlID0g
RW1iZXIuY3JlYXRlLAorICAgIGRlZmluZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVydHks
CisgICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7CiAKLSAgdmFyIENvbXBhcmFibGUgPSBFbWJl
ci5Db21wYXJhYmxlOwotICBpZiAoQ29tcGFyYWJsZSkgewotICAgIGlmICh0eXBlMT09PSdpbnN0
YW5jZScgJiYgQ29tcGFyYWJsZS5kZXRlY3Qodi5jb25zdHJ1Y3RvcikpIHsKLSAgICAgIHJldHVy
biB2LmNvbnN0cnVjdG9yLmNvbXBhcmUodiwgdyk7Ci0gICAgfQogCi0gICAgaWYgKHR5cGUyID09
PSAnaW5zdGFuY2UnICYmIENvbXBhcmFibGUuZGV0ZWN0KHcuY29uc3RydWN0b3IpKSB7Ci0gICAg
ICByZXR1cm4gMS13LmNvbnN0cnVjdG9yLmNvbXBhcmUodywgdik7Ci0gICAgfQorZnVuY3Rpb24g
bWl4aW5zTWV0YShvYmopIHsKKyAgdmFyIG0gPSBFbWJlci5tZXRhKG9iaiwgdHJ1ZSksIHJldCA9
IG0ubWl4aW5zOworICBpZiAoIXJldCkgeworICAgIHJldCA9IG0ubWl4aW5zID0ge307CisgIH0g
ZWxzZSBpZiAoIW0uaGFzT3duUHJvcGVydHkoJ21peGlucycpKSB7CisgICAgcmV0ID0gbS5taXhp
bnMgPSBvX2NyZWF0ZShyZXQpOwogICB9CisgIHJldHVybiByZXQ7Cit9CiAKLSAgLy8gSWYgd2Ug
aGF2ZW4ndCB5ZXQgZ2VuZXJhdGVkIGEgcmV2ZXJzZS1tYXBwaW5nIG9mIEVtYmVyLk9SREVSX0RF
RklOSVRJT04sCi0gIC8vIGRvIHNvIG5vdy4KLSAgdmFyIG1hcHBpbmcgPSBFbWJlci5PUkRFUl9E
RUZJTklUSU9OX01BUFBJTkc7Ci0gIGlmICghbWFwcGluZykgewotICAgIHZhciBvcmRlciA9IEVt
YmVyLk9SREVSX0RFRklOSVRJT047Ci0gICAgbWFwcGluZyA9IEVtYmVyLk9SREVSX0RFRklOSVRJ
T05fTUFQUElORyA9IHt9OwotICAgIHZhciBpZHgsIGxlbjsKLSAgICBmb3IgKGlkeCA9IDAsIGxl
biA9IG9yZGVyLmxlbmd0aDsgaWR4IDwgbGVuOyAgKytpZHgpIHsKLSAgICAgIG1hcHBpbmdbb3Jk
ZXJbaWR4XV0gPSBpZHg7Ci0gICAgfQorZnVuY3Rpb24gaW5pdE1peGluKG1peGluLCBhcmdzKSB7
CisgIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkgeworICAgIG1peGluLm1peGlucyA9IGFf
bWFwLmNhbGwoYXJncywgZnVuY3Rpb24oeCkgeworICAgICAgaWYgKHggaW5zdGFuY2VvZiBNaXhp
bikgeyByZXR1cm4geDsgfQogCi0gICAgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgRW1iZXIuT1JERVJf
REVGSU5JVElPTi4KLSAgICBkZWxldGUgRW1iZXIuT1JERVJfREVGSU5JVElPTjsKKyAgICAgIC8v
IE5vdGU6IE1hbnVhbGx5IHNldHVwIGEgcHJpbWl0aXZlIG1peGluIGhlcmUuIFRoaXMgaXMgdGhl
IG9ubHkKKyAgICAgIC8vIHdheSB0byBhY3R1YWxseSBnZXQgYSBwcmltaXRpdmUgbWl4aW4uIFRo
aXMgd2F5IG5vcm1hbCBjcmVhdGlvbgorICAgICAgLy8gb2YgbWl4aW5zIHdpbGwgZ2l2ZSB5b3Ug
Y29tYmluZWQgbWl4aW5zLi4uCisgICAgICB2YXIgbWl4aW4gPSBuZXcgTWl4aW4oKTsKKyAgICAg
IG1peGluLnByb3BlcnRpZXMgPSB4OworICAgICAgcmV0dXJuIG1peGluOworICAgIH0pOwogICB9
CisgIHJldHVybiBtaXhpbjsKK30KIAotICB2YXIgdHlwZTFJbmRleCA9IG1hcHBpbmdbdHlwZTFd
OwotICB2YXIgdHlwZTJJbmRleCA9IG1hcHBpbmdbdHlwZTJdOworZnVuY3Rpb24gaXNNZXRob2Qo
b2JqKSB7CisgIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqICYmCisgICAgICAgICBv
YmouaXNNZXRob2QgIT09IGZhbHNlICYmCisgICAgICAgICBvYmogIT09IEJvb2xlYW4gJiYgb2Jq
ICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBBcnJheSAmJiBvYmogIT09
IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Cit9CiAKLSAgaWYgKHR5cGUxSW5kZXggPCB0eXBlMklu
ZGV4KSB7IHJldHVybiAtMTsgfQotICBpZiAodHlwZTFJbmRleCA+IHR5cGUySW5kZXgpIHsgcmV0
dXJuIDE7IH0KK3ZhciBDT05USU5VRSA9IHt9OwogCi0gIC8vIHR5cGVzIGFyZSBlcXVhbCAtIHNv
IHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5vdwotICBzd2l0Y2ggKHR5cGUxKSB7Ci0gICAgY2Fz
ZSAnYm9vbGVhbic6Ci0gICAgY2FzZSAnbnVtYmVyJzoKLSAgICAgIGlmICh2IDwgdykgeyByZXR1
cm4gLTE7IH0KLSAgICAgIGlmICh2ID4gdykgeyByZXR1cm4gMTsgfQotICAgICAgcmV0dXJuIDA7
CitmdW5jdGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwgbWl4aW4pIHsKKyAgdmFyIGd1
aWQ7CiAKLSAgICBjYXNlICdzdHJpbmcnOgotICAgICAgdmFyIGNvbXAgPSB2LmxvY2FsZUNvbXBh
cmUodyk7Ci0gICAgICBpZiAoY29tcCA8IDApIHsgcmV0dXJuIC0xOyB9Ci0gICAgICBpZiAoY29t
cCA+IDApIHsgcmV0dXJuIDE7IH0KLSAgICAgIHJldHVybiAwOworICBpZiAobWl4aW4gaW5zdGFu
Y2VvZiBNaXhpbikgeworICAgIGd1aWQgPSBndWlkRm9yKG1peGluKTsKKyAgICBpZiAobWl4aW5z
TWV0YVtndWlkXSkgeyByZXR1cm4gQ09OVElOVUU7IH0KKyAgICBtaXhpbnNNZXRhW2d1aWRdID0g
bWl4aW47CisgICAgcmV0dXJuIG1peGluLnByb3BlcnRpZXM7CisgIH0gZWxzZSB7CisgICAgcmV0
dXJuIG1peGluOyAvLyBhcHBseSBhbm9ueW1vdXMgbWl4aW4gcHJvcGVydGllcworICB9Cit9CiAK
LSAgICBjYXNlICdhcnJheSc6Ci0gICAgICB2YXIgdkxlbiA9IHYubGVuZ3RoOwotICAgICAgdmFy
IHdMZW4gPSB3Lmxlbmd0aDsKLSAgICAgIHZhciBsID0gTWF0aC5taW4odkxlbiwgd0xlbik7Ci0g
ICAgICB2YXIgciA9IDA7Ci0gICAgICB2YXIgaSA9IDA7Ci0gICAgICB3aGlsZSAociA9PT0gMCAm
JiBpIDwgbCkgewotICAgICAgICByID0gY29tcGFyZSh2W2ldLHdbaV0pOwotICAgICAgICBpKys7
Ci0gICAgICB9Ci0gICAgICBpZiAociAhPT0gMCkgeyByZXR1cm4gcjsgfQorZnVuY3Rpb24gY29u
Y2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKGNvbmNhdFByb3AsIHByb3BzLCB2YWx1ZXMsIGJhc2Up
IHsKKyAgdmFyIGNvbmNhdHM7CiAKLSAgICAgIC8vIGFsbCBlbGVtZW50cyBhcmUgZXF1YWwgbm93
Ci0gICAgICAvLyBzaG9ydGVyIGFycmF5IHNob3VsZCBiZSBvcmRlcmVkIGZpcnN0Ci0gICAgICBp
ZiAodkxlbiA8IHdMZW4pIHsgcmV0dXJuIC0xOyB9Ci0gICAgICBpZiAodkxlbiA+IHdMZW4pIHsg
cmV0dXJuIDE7IH0KLSAgICAgIC8vIGFycmF5cyBhcmUgZXF1YWwgbm93Ci0gICAgICByZXR1cm4g
MDsKKyAgLy8gcmVzZXQgYmVmb3JlIGFkZGluZyBlYWNoIG5ldyBtaXhpbiB0byBwaWNrdXAgY29u
Y2F0cyBmcm9tIHByZXZpb3VzCisgIGNvbmNhdHMgPSB2YWx1ZXNbY29uY2F0UHJvcF0gfHwgYmFz
ZVtjb25jYXRQcm9wXTsKKyAgaWYgKHByb3BzW2NvbmNhdFByb3BdKSB7CisgICAgY29uY2F0cyA9
IGNvbmNhdHMgPyBjb25jYXRzLmNvbmNhdChwcm9wc1tjb25jYXRQcm9wXSkgOiBwcm9wc1tjb25j
YXRQcm9wXTsKKyAgfQogCi0gICAgY2FzZSAnaW5zdGFuY2UnOgotICAgICAgaWYgKEVtYmVyLkNv
bXBhcmFibGUgJiYgRW1iZXIuQ29tcGFyYWJsZS5kZXRlY3QodikpIHsKLSAgICAgICAgcmV0dXJu
IHYuY29tcGFyZSh2LCB3KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOworICByZXR1cm4gY29u
Y2F0czsKK30KIAotICAgIGNhc2UgJ2RhdGUnOgotICAgICAgdmFyIHZOdW0gPSB2LmdldFRpbWUo
KTsKLSAgICAgIHZhciB3TnVtID0gdy5nZXRUaW1lKCk7Ci0gICAgICBpZiAodk51bSA8IHdOdW0p
IHsgcmV0dXJuIC0xOyB9Ci0gICAgICBpZiAodk51bSA+IHdOdW0pIHsgcmV0dXJuIDE7IH0KLSAg
ICAgIHJldHVybiAwOworZnVuY3Rpb24gZ2l2ZURlc2NyaXB0b3JTdXBlcihtZXRhLCBrZXksIHBy
b3BlcnR5LCB2YWx1ZXMsIGRlc2NzKSB7CisgIHZhciBzdXBlclByb3BlcnR5OwogCi0gICAgZGVm
YXVsdDoKLSAgICAgIHJldHVybiAwOworICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJyaWRl
IG1ldGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCisgIGlmICh2YWx1ZXNba2V5
XSA9PT0gdW5kZWZpbmVkKSB7CisgICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBp
biBhIHBhcmVudCBtaXhpbgorICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOwogICB9Ci19
OwogCi1mdW5jdGlvbiBfY29weShvYmosIGRlZXAsIHNlZW4sIGNvcGllcykgewotICB2YXIgcmV0
LCBsb2MsIGtleTsKLQotICAvLyBwcmltaXRpdmUgZGF0YSB0eXBlcyBhcmUgaW1tdXRhYmxlLCBq
dXN0IHJldHVybiB0aGVtLgotICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBvYmogfHwgb2JqPT09
bnVsbCkgcmV0dXJuIG9iajsKKyAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIGRl
c2NyaXB0b3IgaW4gYSBwYXJlbnQgbWl4aW4sIGZpbmQKKyAgLy8gaXQgb24gdGhlIG9yaWdpbmFs
IG9iamVjdC4KKyAgc3VwZXJQcm9wZXJ0eSA9IHN1cGVyUHJvcGVydHkgfHwgbWV0YS5kZXNjc1tr
ZXldOwogCi0gIC8vIGF2b2lkIGN5Y2xpY2FsIGxvb3BzCi0gIGlmIChkZWVwICYmIChsb2M9aW5k
ZXhPZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGllc1tsb2NdOworICBpZiAoIXN1cGVyUHJv
cGVydHkgfHwgIShzdXBlclByb3BlcnR5IGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0
eSkpIHsKKyAgICByZXR1cm4gcHJvcGVydHk7CisgIH0KIAotICBFbWJlci5hc3NlcnQoJ0Nhbm5v
dCBjbG9uZSBhbiBFbWJlci5PYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgRW1iZXIuQ29w
eWFibGUnLCAhKG9iaiBpbnN0YW5jZW9mIEVtYmVyLk9iamVjdCkgfHwgKEVtYmVyLkNvcHlhYmxl
ICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSk7CisgIC8vIFNpbmNlIG11bHRpcGxlIG1p
eGlucyBtYXkgaW5oZXJpdCBmcm9tIHRoZSBzYW1lIHBhcmVudCwgd2UgbmVlZAorICAvLyB0byBj
bG9uZSB0aGUgY29tcHV0ZWQgcHJvcGVydHkgc28gdGhhdCBvdGhlciBtaXhpbnMgZG8gbm90IHJl
Y2VpdmUKKyAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KKyAgcHJvcGVydHkgPSBvX2NyZWF0ZShw
cm9wZXJ0eSk7CisgIHByb3BlcnR5LmZ1bmMgPSBFbWJlci53cmFwKHByb3BlcnR5LmZ1bmMsIHN1
cGVyUHJvcGVydHkuZnVuYyk7CiAKLSAgLy8gSU1QT1JUQU5UOiB0aGlzIHNwZWNpZmljIHRlc3Qg
d2lsbCBkZXRlY3QgYSBuYXRpdmUgYXJyYXkgb25seS4gQW55IG90aGVyCi0gIC8vIG9iamVjdCB3
aWxsIG5lZWQgdG8gaW1wbGVtZW50IENvcHlhYmxlLgotICBpZiAoRW1iZXIudHlwZU9mKG9iaikg
PT09ICdhcnJheScpIHsKLSAgICByZXQgPSBvYmouc2xpY2UoKTsKLSAgICBpZiAoZGVlcCkgewot
ICAgICAgbG9jID0gcmV0Lmxlbmd0aDsKLSAgICAgIHdoaWxlKC0tbG9jPj0wKSByZXRbbG9jXSA9
IF9jb3B5KHJldFtsb2NdLCBkZWVwLCBzZWVuLCBjb3BpZXMpOwotICAgIH0KLSAgfSBlbHNlIGlm
IChFbWJlci5Db3B5YWJsZSAmJiBFbWJlci5Db3B5YWJsZS5kZXRlY3Qob2JqKSkgewotICAgIHJl
dCA9IG9iai5jb3B5KGRlZXAsIHNlZW4sIGNvcGllcyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0ID0g
e307Ci0gICAgZm9yKGtleSBpbiBvYmopIHsKLSAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5
KGtleSkpIGNvbnRpbnVlOworICByZXR1cm4gcHJvcGVydHk7Cit9CiAKLSAgICAgIC8vIFByZXZl
bnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCi0g
ICAgICAvLyBjb3B5aW5nIGludGVybmFsIEVtYmVyIHByb3BlcnRpZXMKLSAgICAgIGlmIChrZXku
c3Vic3RyaW5nKDAsMikgPT09ICdfXycpIGNvbnRpbnVlOworZnVuY3Rpb24gZ2l2ZU1ldGhvZFN1
cGVyKG9iaiwga2V5LCBtZXRob2QsIHZhbHVlcywgZGVzY3MpIHsKKyAgdmFyIHN1cGVyTWV0aG9k
OwogCi0gICAgICByZXRba2V5XSA9IGRlZXAgPyBfY29weShvYmpba2V5XSwgZGVlcCwgc2Vlbiwg
Y29waWVzKSA6IG9ialtrZXldOwotICAgIH0KKyAgLy8gTWV0aG9kcyBvdmVyd3JpdGUgY29tcHV0
ZWQgcHJvcGVydGllcywgYW5kIGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCisgIGlmIChkZXNj
c1trZXldID09PSB1bmRlZmluZWQpIHsKKyAgICAvLyBGaW5kIHRoZSBvcmlnaW5hbCBtZXRob2Qg
aW4gYSBwYXJlbnQgbWl4aW4KKyAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXldOwogICB9CiAK
LSAgaWYgKGRlZXApIHsKLSAgICBzZWVuLnB1c2gob2JqKTsKLSAgICBjb3BpZXMucHVzaChyZXQp
OworICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCB0aGUgb3JpZ2luYWwgdmFsdWUgaW4gYSBwYXJlbnQg
bWl4aW4sIGZpbmQgaXQgaW4KKyAgLy8gdGhlIG9yaWdpbmFsIG9iamVjdAorICBzdXBlck1ldGhv
ZCA9IHN1cGVyTWV0aG9kIHx8IG9ialtrZXldOworCisgIC8vIE9ubHkgd3JhcCB0aGUgbmV3IG1l
dGhvZCBpZiB0aGUgb3JpZ2luYWwgbWV0aG9kIHdhcyBhIGZ1bmN0aW9uCisgIGlmICgnZnVuY3Rp
b24nICE9PSB0eXBlb2Ygc3VwZXJNZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kOwogICB9CiAK
LSAgcmV0dXJuIHJldDsKKyAgcmV0dXJuIEVtYmVyLndyYXAobWV0aG9kLCBzdXBlck1ldGhvZCk7
CiB9CiAKLS8qKgotICBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHBhc3NlZCBvYmplY3QuIFRoaXMg
ZnVuY3Rpb24gY2FuIHRha2UganVzdCBhYm91dAotICBhbnkgdHlwZSBvZiBvYmplY3QgYW5kIGNy
ZWF0ZSBhIGNsb25lIG9mIGl0LCBpbmNsdWRpbmcgcHJpbWl0aXZlIHZhbHVlcwotICAod2hpY2gg
YXJlIG5vdCBhY3R1YWxseSBjbG9uZWQgYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUpLgorZnVu
Y3Rpb24gYXBwbHlDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKG9iaiwga2V5LCB2YWx1ZSwgdmFsdWVz
KSB7CisgIHZhciBiYXNlVmFsdWUgPSB2YWx1ZXNba2V5XSB8fCBvYmpba2V5XTsKIAotICBJZiB0
aGUgcGFzc2VkIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBgY2xvbmUoKWAgbWV0aG9kLCB0aGVuIHRo
aXMgZnVuY3Rpb24KLSAgd2lsbCBzaW1wbHkgY2FsbCB0aGF0IG1ldGhvZCBhbmQgcmV0dXJuIHRo
ZSByZXN1bHQuCisgIGlmIChiYXNlVmFsdWUpIHsKKyAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlw
ZW9mIGJhc2VWYWx1ZS5jb25jYXQpIHsKKyAgICAgIHJldHVybiBiYXNlVmFsdWUuY29uY2F0KHZh
bHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEVtYmVyLm1ha2VBcnJheShiYXNlVmFs
dWUpLmNvbmNhdCh2YWx1ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBFbWJlci5t
YWtlQXJyYXkodmFsdWUpOworICB9Cit9CiAKLSAgQG1ldGhvZCBjb3B5Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lCi0gIEBwYXJhbSB7
Qm9vbGVhbn0gZGVlcCBJZiB0cnVlLCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IGlzIG1hZGUK
LSAgQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmVkIG9iamVjdAotKi8KLUVtYmVyLmNvcHkgPSBm
dW5jdGlvbihvYmosIGRlZXApIHsKLSAgLy8gZmFzdCBwYXRocwotICBpZiAoJ29iamVjdCcgIT09
IHR5cGVvZiBvYmogfHwgb2JqPT09bnVsbCkgcmV0dXJuIG9iajsgLy8gY2FuJ3QgY29weSBwcmlt
aXRpdmVzCi0gIGlmIChFbWJlci5Db3B5YWJsZSAmJiBFbWJlci5Db3B5YWJsZS5kZXRlY3Qob2Jq
KSkgcmV0dXJuIG9iai5jb3B5KGRlZXApOwotICByZXR1cm4gX2NvcHkob2JqLCBkZWVwLCBkZWVw
ID8gW10gOiBudWxsLCBkZWVwID8gW10gOiBudWxsKTsKLX07CitmdW5jdGlvbiBhcHBseU1lcmdl
ZFByb3BlcnRpZXMob2JqLCBrZXksIHZhbHVlLCB2YWx1ZXMpIHsKKyAgdmFyIGJhc2VWYWx1ZSA9
IHZhbHVlc1trZXldIHx8IG9ialtrZXldOwogCi0vKioKLSAgQ29udmVuaWVuY2UgbWV0aG9kIHRv
IGluc3BlY3QgYW4gb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KLSAgY29udmVy
dCB0aGUgb2JqZWN0IGludG8gYSB1c2VmdWwgc3RyaW5nIGRlc2NyaXB0aW9uLgorICBpZiAoIWJh
c2VWYWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KIAotICBJdCBpcyBhIHByZXR0eSBzaW1wbGUgaW1w
bGVtZW50YXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBtb3JlIHJvYnVzdCwKLSAgdXNlIHNv
bWV0aGluZyBsaWtlIEpTRHVtcDogaHR0cHM6Ly9naXRodWIuY29tL05WL2pzRHVtcAorICB2YXIg
bmV3QmFzZSA9IEVtYmVyLm1lcmdlKHt9LCBiYXNlVmFsdWUpOworICBmb3IgKHZhciBwcm9wIGlu
IHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51
ZTsgfQogCi0gIEBtZXRob2QgaW5zcGVjdAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBvYmogVGhlIG9iamVjdCB5b3Ugd2FudCB0byBpbnNwZWN0LgotICBAcmV0dXJuIHtTdHJpbmd9
IEEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAotKi8KLUVtYmVyLmluc3BlY3QgPSBmdW5jdGlv
bihvYmopIHsKLSAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkg
ewotICAgIHJldHVybiBvYmogKyAnJzsKKyAgICB2YXIgcHJvcFZhbHVlID0gdmFsdWVbcHJvcF07
CisgICAgaWYgKGlzTWV0aG9kKHByb3BWYWx1ZSkpIHsKKyAgICAgIC8vIFRPRE86IHN1cHBvcnQg
Zm9yIENvbXB1dGVkIFByb3BlcnRpZXMsIGV0Yz8KKyAgICAgIG5ld0Jhc2VbcHJvcF0gPSBnaXZl
TWV0aG9kU3VwZXIob2JqLCBwcm9wLCBwcm9wVmFsdWUsIGJhc2VWYWx1ZSwge30pOworICAgIH0g
ZWxzZSB7CisgICAgICBuZXdCYXNlW3Byb3BdID0gcHJvcFZhbHVlOworICAgIH0KICAgfQogCi0g
IHZhciB2LCByZXQgPSBbXTsKLSAgZm9yKHZhciBrZXkgaW4gb2JqKSB7Ci0gICAgaWYgKG9iai5o
YXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICB2ID0gb2JqW2tleV07Ci0gICAgICBpZiAodiA9
PT0gJ3RvU3RyaW5nJykgeyBjb250aW51ZTsgfSAvLyBpZ25vcmUgdXNlbGVzcyBpdGVtcwotICAg
ICAgaWYgKEVtYmVyLnR5cGVPZih2KSA9PT0gJ2Z1bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkg
eyAuLi4gfSI7IH0KLSAgICAgIHJldC5wdXNoKGtleSArICI6ICIgKyB2KTsKKyAgcmV0dXJuIG5l
d0Jhc2U7Cit9CisKK2Z1bmN0aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHZh
bHVlLCBtZXRhLCBkZXNjcywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncykgeworICBpZiAodmFs
dWUgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yKSB7CisgICAgaWYgKHZhbHVlID09PSBSRVFV
SVJFRCAmJiBkZXNjc1trZXldKSB7IHJldHVybiBDT05USU5VRTsgfQorCisgICAgLy8gV3JhcCBk
ZXNjcmlwdG9yIGZ1bmN0aW9uIHRvIGltcGxlbWVudAorICAgIC8vIF9zdXBlcigpIGlmIG5lZWRl
ZAorICAgIGlmICh2YWx1ZS5mdW5jKSB7CisgICAgICB2YWx1ZSA9IGdpdmVEZXNjcmlwdG9yU3Vw
ZXIobWV0YSwga2V5LCB2YWx1ZSwgdmFsdWVzLCBkZXNjcyk7CisgICAgfQorCisgICAgZGVzY3Nb
a2V5XSAgPSB2YWx1ZTsKKyAgICB2YWx1ZXNba2V5XSA9IHVuZGVmaW5lZDsKKyAgfSBlbHNlIHsK
KyAgICBpZiAoKGNvbmNhdHMgJiYgYV9pbmRleE9mLmNhbGwoY29uY2F0cywga2V5KSA+PSAwKSB8
fAorICAgICAgICAgICAgICAgIGtleSA9PT0gJ2NvbmNhdGVuYXRlZFByb3BlcnRpZXMnIHx8Cisg
ICAgICAgICAgICAgICAga2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycpIHsKKyAgICAgIHZhbHVl
ID0gYXBwbHlDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7
CisgICAgfSBlbHNlIGlmICgobWVyZ2luZ3MgJiYgYV9pbmRleE9mLmNhbGwobWVyZ2luZ3MsIGtl
eSkgPj0gMCkpIHsKKyAgICAgIHZhbHVlID0gYXBwbHlNZXJnZWRQcm9wZXJ0aWVzKGJhc2UsIGtl
eSwgdmFsdWUsIHZhbHVlcyk7CisgICAgfSBlbHNlIGlmIChpc01ldGhvZCh2YWx1ZSkpIHsKKyAg
ICAgIHZhbHVlID0gZ2l2ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVz
Y3MpOwogICAgIH0KKworICAgIGRlc2NzW2tleV0gPSB1bmRlZmluZWQ7CisgICAgdmFsdWVzW2tl
eV0gPSB2YWx1ZTsKICAgfQotICByZXR1cm4gInsiICsgcmV0LmpvaW4oIiwgIikgKyAifSI7Ci19
OworfQogCi0vKioKLSAgQ29tcGFyZXMgdHdvIG9iamVjdHMsIHJldHVybmluZyB0cnVlIGlmIHRo
ZXkgYXJlIGxvZ2ljYWxseSBlcXVhbC4gVGhpcyBpcwotICBhIGRlZXBlciBjb21wYXJpc29uIHRo
YW4gYSBzaW1wbGUgdHJpcGxlIGVxdWFsLiBGb3Igc2V0cyBpdCB3aWxsIGNvbXBhcmUgdGhlCi0g
IGludGVybmFsIG9iamVjdHMuIEZvciBhbnkgb3RoZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBg
aXNFcXVhbCgpYCBpdCB3aWxsCi0gIHJlc3BlY3QgdGhhdCBtZXRob2QuCitmdW5jdGlvbiBtZXJn
ZU1peGlucyhtaXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UsIGtleXMpIHsKKyAgdmFyIG1p
eGluLCBwcm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywgbWV0YTsKIAotICBgYGBqYXZhc2Ny
aXB0Ci0gIEVtYmVyLmlzRXF1YWwoJ2hlbGxvJywgJ2hlbGxvJyk7ICAvLyB0cnVlCi0gIEVtYmVy
LmlzRXF1YWwoMSwgMik7ICAgICAgICAgICAgICAvLyBmYWxzZQotICBFbWJlci5pc0VxdWFsKFs0
LDJdLCBbNCwyXSk7ICAgICAgLy8gZmFsc2UKLSAgYGBgCisgIGZ1bmN0aW9uIHJlbW92ZUtleXMo
a2V5TmFtZSkgeworICAgIGRlbGV0ZSBkZXNjc1trZXlOYW1lXTsKKyAgICBkZWxldGUgdmFsdWVz
W2tleU5hbWVdOworICB9CiAKLSAgQG1ldGhvZCBpc0VxdWFsCi0gIEBmb3IgRW1iZXIKLSAgQHBh
cmFtIHtPYmplY3R9IGEgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKLSAgQHBhcmFtIHtPYmplY3R9
IGIgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1i
ZXIuaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHsKLSAgaWYgKGEgJiYgJ2Z1bmN0aW9uJz09PXR5
cGVvZiBhLmlzRXF1YWwpIHJldHVybiBhLmlzRXF1YWwoYik7Ci0gIHJldHVybiBhID09PSBiOwot
fTsKKyAgZm9yKHZhciBpPTAsIGw9bWl4aW5zLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBtaXhp
biA9IG1peGluc1tpXTsKKyAgICBFbWJlci5hc3NlcnQoJ0V4cGVjdGVkIGhhc2ggb3IgTWl4aW4g
aW5zdGFuY2UsIGdvdCAnICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1peGluKSwK
KyAgICAgICAgICAgICAgICAgdHlwZW9mIG1peGluID09PSAnb2JqZWN0JyAmJiBtaXhpbiAhPT0g
bnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWl4aW4pICE9PSAnW29iamVj
dCBBcnJheV0nKTsKIAotLy8gVXNlZCBieSBFbWJlci5jb21wYXJlCi1FbWJlci5PUkRFUl9ERUZJ
TklUSU9OID0gRW1iZXIuRU5WLk9SREVSX0RFRklOSVRJT04gfHwgWwotICAndW5kZWZpbmVkJywK
LSAgJ251bGwnLAotICAnYm9vbGVhbicsCi0gICdudW1iZXInLAotICAnc3RyaW5nJywKLSAgJ2Fy
cmF5JywKLSAgJ29iamVjdCcsCi0gICdpbnN0YW5jZScsCi0gICdmdW5jdGlvbicsCi0gICdjbGFz
cycsCi0gICdkYXRlJwotXTsKKyAgICBwcm9wcyA9IG1peGluUHJvcGVydGllcyhtLCBtaXhpbik7
CisgICAgaWYgKHByb3BzID09PSBDT05USU5VRSkgeyBjb250aW51ZTsgfQogCi0vKioKLSAgUmV0
dXJucyBhbGwgb2YgdGhlIGtleXMgZGVmaW5lZCBvbiBhbiBvYmplY3Qgb3IgaGFzaC4gVGhpcyBp
cyB1c2VmdWwKLSAgd2hlbiBpbnNwZWN0aW5nIG9iamVjdHMgZm9yIGRlYnVnZ2luZy4gT24gYnJv
d3NlcnMgdGhhdCBzdXBwb3J0IGl0LCB0aGlzCi0gIHVzZXMgdGhlIG5hdGl2ZSBgT2JqZWN0Lmtl
eXNgIGltcGxlbWVudGF0aW9uLgorICAgIGlmIChwcm9wcykgeworICAgICAgbWV0YSA9IEVtYmVy
Lm1ldGEoYmFzZSk7CisgICAgICBpZiAoYmFzZS53aWxsTWVyZ2VNaXhpbikgeyBiYXNlLndpbGxN
ZXJnZU1peGluKHByb3BzKTsgfQorICAgICAgY29uY2F0cyA9IGNvbmNhdGVuYXRlZE1peGluUHJv
cGVydGllcygnY29uY2F0ZW5hdGVkUHJvcGVydGllcycsIHByb3BzLCB2YWx1ZXMsIGJhc2UpOwor
ICAgICAgbWVyZ2luZ3MgPSBjb25jYXRlbmF0ZWRNaXhpblByb3BlcnRpZXMoJ21lcmdlZFByb3Bl
cnRpZXMnLCBwcm9wcywgdmFsdWVzLCBiYXNlKTsKIAotICBAbWV0aG9kIGtleXMKLSAgQGZvciBF
bWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqCi0gIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250
YWluaW5nIGtleXMgb2Ygb2JqCi0qLwotRW1iZXIua2V5cyA9IE9iamVjdC5rZXlzOworICAgICAg
Zm9yIChrZXkgaW4gcHJvcHMpIHsKKyAgICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShr
ZXkpKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIGtleXMucHVzaChrZXkpOworICAgICAgICBhZGRO
b3JtYWxpemVkUHJvcGVydHkoYmFzZSwga2V5LCBwcm9wc1trZXldLCBtZXRhLCBkZXNjcywgdmFs
dWVzLCBjb25jYXRzLCBtZXJnaW5ncyk7CisgICAgICB9CiAKLWlmICghRW1iZXIua2V5cykgewot
ICBFbWJlci5rZXlzID0gZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIHJldCA9IFtdOwotICAgIGZv
cih2YXIga2V5IGluIG9iaikgewotICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7
IHJldC5wdXNoKGtleSk7IH0KKyAgICAgIC8vIG1hbnVhbGx5IGNvcHkgdG9TdHJpbmcoKSBiZWNh
dXNlIHNvbWUgSlMgZW5naW5lcyBkbyBub3QgZW51bWVyYXRlIGl0CisgICAgICBpZiAocHJvcHMu
aGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHsgYmFzZS50b1N0cmluZyA9IHByb3BzLnRvU3Ry
aW5nOyB9CisgICAgfSBlbHNlIGlmIChtaXhpbi5taXhpbnMpIHsKKyAgICAgIG1lcmdlTWl4aW5z
KG1peGluLm1peGlucywgbSwgZGVzY3MsIHZhbHVlcywgYmFzZSwga2V5cyk7CisgICAgICBpZiAo
bWl4aW4uX3dpdGhvdXQpIHsgYV9mb3JFYWNoLmNhbGwobWl4aW4uX3dpdGhvdXQsIHJlbW92ZUtl
eXMpOyB9CiAgICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH07CisgIH0KIH0KIAotLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8g
RVJST1IKLS8vCit2YXIgSVNfQklORElORyA9IEVtYmVyLklTX0JJTkRJTkcgPSAvXi4rQmluZGlu
ZyQvOwogCi12YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGlu
ZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107CitmdW5jdGlv
biBkZXRlY3RCaW5kaW5nKG9iaiwga2V5LCB2YWx1ZSwgbSkgeworICBpZiAoSVNfQklORElORy50
ZXN0KGtleSkpIHsKKyAgICB2YXIgYmluZGluZ3MgPSBtLmJpbmRpbmdzOworICAgIGlmICghYmlu
ZGluZ3MpIHsKKyAgICAgIGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IHt9OworICAgIH0gZWxzZSBp
ZiAoIW0uaGFzT3duUHJvcGVydHkoJ2JpbmRpbmdzJykpIHsKKyAgICAgIGJpbmRpbmdzID0gbS5i
aW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3MpOworICAgIH0KKyAgICBiaW5kaW5nc1trZXld
ID0gdmFsdWU7CisgIH0KK30KIAotLyoqCi0gIEEgc3ViY2xhc3Mgb2YgdGhlIEphdmFTY3JpcHQg
RXJyb3Igb2JqZWN0IGZvciB1c2UgaW4gRW1iZXIuCitmdW5jdGlvbiBjb25uZWN0QmluZGluZ3Mo
b2JqLCBtKSB7CisgIC8vIFRPRE8gTWl4aW4uYXBwbHkoaW5zdGFuY2UpIHNob3VsZCBkaXNjb25u
ZWN0IGJpbmRpbmcgaWYgZXhpc3RzCisgIHZhciBiaW5kaW5ncyA9IG0uYmluZGluZ3MsIGtleSwg
YmluZGluZywgdG87CisgIGlmIChiaW5kaW5ncykgeworICAgIGZvciAoa2V5IGluIGJpbmRpbmdz
KSB7CisgICAgICBiaW5kaW5nID0gYmluZGluZ3Nba2V5XTsKKyAgICAgIGlmIChiaW5kaW5nKSB7
CisgICAgICAgIHRvID0ga2V5LnNsaWNlKDAsIC03KTsgLy8gc3RyaXAgQmluZGluZyBvZmYgZW5k
CisgICAgICAgIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgRW1iZXIuQmluZGluZykgeworICAgICAg
ICAgIGJpbmRpbmcgPSBiaW5kaW5nLmNvcHkoKTsgLy8gY29weSBwcm90b3R5cGVzJyBpbnN0YW5j
ZQorICAgICAgICAgIGJpbmRpbmcudG8odG8pOworICAgICAgICB9IGVsc2UgeyAvLyBiaW5kaW5n
IGlzIHN0cmluZyBwYXRoCisgICAgICAgICAgYmluZGluZyA9IG5ldyBFbWJlci5CaW5kaW5nKHRv
LCBiaW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgICBiaW5kaW5nLmNvbm5lY3Qob2JqKTsKKyAg
ICAgICAgb2JqW2tleV0gPSBiaW5kaW5nOworICAgICAgfQorICAgIH0KKyAgICAvLyBtYXJrIGFz
IGFwcGxpZWQKKyAgICBtLmJpbmRpbmdzID0ge307CisgIH0KK30KIAotICBAY2xhc3MgRXJyb3IK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFcnJvcgotICBAY29uc3RydWN0b3IKLSov
Ci1FbWJlci5FcnJvciA9IGZ1bmN0aW9uKCkgewotICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBl
LmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CitmdW5jdGlvbiBmaW5pc2hQYXJ0
aWFsKG9iaiwgbSkgeworICBjb25uZWN0QmluZGluZ3Mob2JqLCBtIHx8IEVtYmVyLm1ldGEob2Jq
KSk7CisgIHJldHVybiBvYmo7Cit9CiAKLSAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5v
dCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBk
b2Vzbid0IHdvcmsuCi0gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3Ro
OyBpZHgrKykgewotICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lk
eF1dOworZnVuY3Rpb24gZm9sbG93QWxpYXMob2JqLCBkZXNjLCBtLCBkZXNjcywgdmFsdWVzKSB7
CisgIHZhciBhbHRLZXkgPSBkZXNjLm1ldGhvZE5hbWUsIHZhbHVlOworICBpZiAoZGVzY3NbYWx0
S2V5XSB8fCB2YWx1ZXNbYWx0S2V5XSkgeworICAgIHZhbHVlID0gdmFsdWVzW2FsdEtleV07Cisg
ICAgZGVzYyAgPSBkZXNjc1thbHRLZXldOworICB9IGVsc2UgaWYgKG0uZGVzY3NbYWx0S2V5XSkg
eworICAgIGRlc2MgID0gbS5kZXNjc1thbHRLZXldOworICAgIHZhbHVlID0gdW5kZWZpbmVkOwor
ICB9IGVsc2UgeworICAgIGRlc2MgPSB1bmRlZmluZWQ7CisgICAgdmFsdWUgPSBvYmpbYWx0S2V5
XTsKICAgfQotfTsKIAotRW1iZXIuRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9y
LnByb3RvdHlwZSk7CisgIHJldHVybiB7IGRlc2M6IGRlc2MsIHZhbHVlOiB2YWx1ZSB9OworfQog
Ci19KSgpOworZnVuY3Rpb24gdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBv
YnNlcnZlck9yTGlzdGVuZXIsIHBhdGhzS2V5LCB1cGRhdGVNZXRob2QpIHsKKyAgdmFyIHBhdGhz
ID0gb2JzZXJ2ZXJPckxpc3RlbmVyW3BhdGhzS2V5XTsKIAorICBpZiAocGF0aHMpIHsKKyAgICBm
b3IgKHZhciBpPTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgRW1iZXJbdXBk
YXRlTWV0aG9kXShvYmosIHBhdGhzW2ldLCBudWxsLCBrZXkpOworICAgIH0KKyAgfQorfQogCitm
dW5jdGlvbiByZXBsYWNlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9y
TGlzdGVuZXIpIHsKKyAgdmFyIHByZXYgPSBvYmpba2V5XTsKIAotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCisgIGlmICgnZnVu
Y3Rpb24nID09PSB0eXBlb2YgcHJldikgeworICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVy
cyhvYmosIGtleSwgcHJldiwgJ19fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXycsICdyZW1vdmVCZWZv
cmVPYnNlcnZlcicpOworICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwg
cHJldiwgJ19fZW1iZXJfb2JzZXJ2ZXNfXycsICdyZW1vdmVPYnNlcnZlcicpOworICAgIHVwZGF0
ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgcHJldiwgJ19fZW1iZXJfbGlzdGVuc19f
JywgJ3JlbW92ZUxpc3RlbmVyJyk7CisgIH0KIAotdmFyIFNUUklOR19EQVNIRVJJWkVfUkVHRVhQ
ID0gKC9bIF9dL2cpOwotdmFyIFNUUklOR19EQVNIRVJJWkVfQ0FDSEUgPSB7fTsKLXZhciBTVFJJ
TkdfREVDQU1FTElaRV9SRUdFWFAgPSAoLyhbYS16XSkoW0EtWl0pL2cpOwotdmFyIFNUUklOR19D
QU1FTElaRV9SRUdFWFAgPSAoLyhcLXxffFwufFxzKSsoLik/L2cpOwotdmFyIFNUUklOR19VTkRF
UlNDT1JFX1JFR0VYUF8xID0gKC8oW2EtelxkXSkoW0EtWl0rKS9nKTsKLXZhciBTVFJJTkdfVU5E
RVJTQ09SRV9SRUdFWFBfMiA9ICgvXC18XHMrL2cpOworICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlw
ZW9mIG9ic2VydmVyT3JMaXN0ZW5lcikgeworICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVy
cyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9f
JywgJ2FkZEJlZm9yZU9ic2VydmVyJyk7CisgICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJz
KG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVyX29ic2VydmVzX18nLCAnYWRk
T2JzZXJ2ZXInKTsKKyAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9i
c2VydmVyT3JMaXN0ZW5lciwgJ19fZW1iZXJfbGlzdGVuc19fJywgJ2FkZExpc3RlbmVyJyk7Cisg
IH0KK30KIAotLyoqCi0gIERlZmluZXMgdGhlIGhhc2ggb2YgbG9jYWxpemVkIHN0cmluZ3MgZm9y
IHRoZSBjdXJyZW50IGxhbmd1YWdlLiBVc2VkIGJ5Ci0gIHRoZSBgRW1iZXIuU3RyaW5nLmxvYygp
YCBoZWxwZXIuIFRvIGxvY2FsaXplLCBhZGQgc3RyaW5nIHZhbHVlcyB0byB0aGlzCi0gIGhhc2gu
CitmdW5jdGlvbiBhcHBseU1peGluKG9iaiwgbWl4aW5zLCBwYXJ0aWFsKSB7CisgIHZhciBkZXNj
cyA9IHt9LCB2YWx1ZXMgPSB7fSwgbSA9IEVtYmVyLm1ldGEob2JqKSwKKyAgICAgIGtleSwgdmFs
dWUsIGRlc2MsIGtleXMgPSBbXTsKIAotICBAcHJvcGVydHkgU1RSSU5HUwotICBAZm9yIEVtYmVy
Ci0gIEB0eXBlIEhhc2gKLSovCi1FbWJlci5TVFJJTkdTID0ge307CisgIC8vIEdvIHRocm91Z2gg
YWxsIG1peGlucyBhbmQgaGFzaGVzIHBhc3NlZCBpbiwgYW5kOgorICAvLworICAvLyAqIEhhbmRs
ZSBjb25jYXRlbmF0ZWQgcHJvcGVydGllcworICAvLyAqIEhhbmRsZSBtZXJnZWQgcHJvcGVydGll
cworICAvLyAqIFNldCB1cCBfc3VwZXIgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5CisgIC8vICogU2V0
IHVwIGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCisgIC8vICogQ29weWluZyBgdG9TdHJp
bmdgIGluIGJyb2tlbiBicm93c2VycworICBtZXJnZU1peGlucyhtaXhpbnMsIG1peGluc01ldGEo
b2JqKSwgZGVzY3MsIHZhbHVlcywgb2JqLCBrZXlzKTsKIAotLyoqCi0gIERlZmluZXMgc3RyaW5n
IGhlbHBlciBtZXRob2RzIGluY2x1ZGluZyBzdHJpbmcgZm9ybWF0dGluZyBhbmQgbG9jYWxpemF0
aW9uLgotICBVbmxlc3MgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLlN0cmluZ2AgaXMgYGZhbHNl
YCB0aGVzZSBtZXRob2RzIHdpbGwgYWxzbyBiZQotICBhZGRlZCB0byB0aGUgYFN0cmluZy5wcm90
b3R5cGVgIGFzIHdlbGwuCisgIGZvcih2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7
IGkrKykgeworICAgIGtleSA9IGtleXNbaV07CisgICAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9y
JyB8fCAhdmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KIAotICBAY2xh
c3MgU3RyaW5nCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlN0cmlu
ZyA9IHsKKyAgICBkZXNjID0gZGVzY3Nba2V5XTsKKyAgICB2YWx1ZSA9IHZhbHVlc1trZXldOwog
Ci0gIC8qKgotICAgIEFwcGx5IGZvcm1hdHRpbmcgb3B0aW9ucyB0byB0aGUgc3RyaW5nLiBUaGlz
IHdpbGwgbG9vayBmb3Igb2NjdXJyZW5jZXMKLSAgICBvZiAiJUAiIGluIHlvdXIgc3RyaW5nIGFu
ZCBzdWJzdGl0dXRlIHRoZW0gd2l0aCB0aGUgYXJndW1lbnRzIHlvdSBwYXNzIGludG8KLSAgICB0
aGlzIG1ldGhvZC4gSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3BlY2lmaWMgb3JkZXIgb2Yg
cmVwbGFjZW1lbnQsCi0gICAgeW91IGNhbiBhZGQgYSBudW1iZXIgYWZ0ZXIgdGhlIGtleSBhcyB3
ZWxsIHRvIGluZGljYXRlIHdoaWNoIGFyZ3VtZW50Ci0gICAgeW91IHdhbnQgdG8gaW5zZXJ0Lgor
ICAgIGlmIChkZXNjID09PSBSRVFVSVJFRCkgeyBjb250aW51ZTsgfQogCi0gICAgT3JkZXJlZCBp
bnNlcnRpb25zIGFyZSBtb3N0IHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGxvYyBzdHJpbmdzIHdoZXJl
IHZhbHVlcwotICAgIHlvdSBuZWVkIHRvIGluc2VydCBtYXkgYXBwZWFyIGluIGRpZmZlcmVudCBv
cmRlcnMuCisgICAgd2hpbGUgKGRlc2MgJiYgZGVzYyBpbnN0YW5jZW9mIEFsaWFzKSB7CisgICAg
ICB2YXIgZm9sbG93ZWQgPSBmb2xsb3dBbGlhcyhvYmosIGRlc2MsIG0sIGRlc2NzLCB2YWx1ZXMp
OworICAgICAgZGVzYyA9IGZvbGxvd2VkLmRlc2M7CisgICAgICB2YWx1ZSA9IGZvbGxvd2VkLnZh
bHVlOworICAgIH0KIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICAiSGVsbG8gJUAgJUAiLmZtdCgn
Sm9obicsICdEb2UnKTsgICAgIC8vICJIZWxsbyBKb2huIERvZSIKLSAgICAiSGVsbG8gJUAyLCAl
QDEiLmZtdCgnSm9obicsICdEb2UnKTsgIC8vICJIZWxsbyBEb2UsIEpvaG4iCi0gICAgYGBgCisg
ICAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IGNvbnRp
bnVlOyB9CiAKLSAgICBAbWV0aG9kIGZtdAotICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBbYXJnc10K
LSAgICBAcmV0dXJuIHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcKLSAgKi8KLSAgZm10OiBmdW5j
dGlvbihzdHIsIGZvcm1hdHMpIHsKLSAgICAvLyBmaXJzdCwgcmVwbGFjZSBhbnkgT1JERVJFRCBy
ZXBsYWNlbWVudHMuCi0gICAgdmFyIGlkeCAgPSAwOyAvLyB0aGUgY3VycmVudCBpbmRleCBmb3Ig
bm9uLW51bWVyaWNhbCByZXBsYWNlbWVudHMKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVAKFsw
LTldKyk/L2csIGZ1bmN0aW9uKHMsIGFyZ0luZGV4KSB7Ci0gICAgICBhcmdJbmRleCA9IChhcmdJ
bmRleCkgPyBwYXJzZUludChhcmdJbmRleCwwKSAtIDEgOiBpZHgrKyA7Ci0gICAgICBzID0gZm9y
bWF0c1thcmdJbmRleF07Ci0gICAgICByZXR1cm4gKChzID09PSBudWxsKSA/ICcobnVsbCknIDog
KHMgPT09IHVuZGVmaW5lZCkgPyAnJyA6IHMpLnRvU3RyaW5nKCk7Ci0gICAgfSkgOwotICB9LAor
ICAgIHJlcGxhY2VPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHZhbHVlKTsKKyAgICBk
ZXRlY3RCaW5kaW5nKG9iaiwga2V5LCB2YWx1ZSwgbSk7CisgICAgZGVmaW5lUHJvcGVydHkob2Jq
LCBrZXksIGRlc2MsIHZhbHVlLCBtKTsKKyAgfQogCi0gIC8qKgotICAgIEZvcm1hdHMgdGhlIHBh
c3NlZCBzdHJpbmcsIGJ1dCBmaXJzdCBsb29rcyB1cCB0aGUgc3RyaW5nIGluIHRoZSBsb2NhbGl6
ZWQKLSAgICBzdHJpbmdzIGhhc2guIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6
ZSB0ZXh0LiBTZWUKLSAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBmb3IgbW9yZSBpbmZvcm1hdGlv
biBvbiBmb3JtYXR0aW5nLgorICBpZiAoIXBhcnRpYWwpIHsgLy8gZG9uJ3QgYXBwbHkgdG8gcHJv
dG90eXBlCisgICAgZmluaXNoUGFydGlhbChvYmosIG0pOworICB9CiAKLSAgICBOb3RlIHRoYXQg
aXQgaXMgdHJhZGl0aW9uYWwgYnV0IG5vdCByZXF1aXJlZCB0byBwcmVmaXggbG9jYWxpemVkIHN0
cmluZwotICAgIGtleXMgd2l0aCBhbiB1bmRlcnNjb3JlIG9yIG90aGVyIGNoYXJhY3RlciBzbyB5
b3UgY2FuIGVhc2lseSBpZGVudGlmeQotICAgIGxvY2FsaXplZCBzdHJpbmdzLgorICByZXR1cm4g
b2JqOworfQogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlNUUklOR1MgPSB7Ci0gICAg
ICAnX0hlbGxvIFdvcmxkJzogJ0JvbmpvdXIgbGUgbW9uZGUnLAotICAgICAgJ19IZWxsbyAlQCAl
QCc6ICdCb25qb3VyICVAICVAJwotICAgIH07CisvKioKKyAgQG1ldGhvZCBtaXhpbgorICBAZm9y
IEVtYmVyCisgIEBwYXJhbSBvYmoKKyAgQHBhcmFtIG1peGlucyoKKyAgQHJldHVybiBvYmoKKyov
CitFbWJlci5taXhpbiA9IGZ1bmN0aW9uKG9iaikgeworICB2YXIgYXJncyA9IGFfc2xpY2UuY2Fs
bChhcmd1bWVudHMsIDEpOworICBhcHBseU1peGluKG9iaiwgYXJncywgZmFsc2UpOworICByZXR1
cm4gb2JqOworfTsKIAotICAgIEVtYmVyLlN0cmluZy5sb2MoIl9IZWxsbyBXb3JsZCIpOyAgLy8g
J0JvbmpvdXIgbGUgbW9uZGUnOwotICAgIEVtYmVyLlN0cmluZy5sb2MoIl9IZWxsbyAlQCAlQCIs
IFsiSm9obiIsICJTbWl0aCJdKTsgIC8vICJCb25qb3VyIEpvaG4gU21pdGgiOwotICAgIGBgYAor
LyoqCisgIFRoZSBgRW1iZXIuTWl4aW5gIGNsYXNzIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1peGlu
cywgd2hvc2UgcHJvcGVydGllcyBjYW4gYmUKKyAgYWRkZWQgdG8gb3RoZXIgY2xhc3Nlcy4gRm9y
IGluc3RhbmNlLAogCi0gICAgQG1ldGhvZCBsb2MKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRo
ZSBzdHJpbmcgdG8gZm9ybWF0Ci0gICAgQHBhcmFtIHtBcnJheX0gZm9ybWF0cyBPcHRpb25hbCBh
cnJheSBvZiBwYXJhbWV0ZXJzIHRvIGludGVycG9sYXRlIGludG8gc3RyaW5nLgotICAgIEByZXR1
cm4ge1N0cmluZ30gZm9ybWF0dGVkIHN0cmluZwotICAqLwotICBsb2M6IGZ1bmN0aW9uKHN0ciwg
Zm9ybWF0cykgewotICAgIHN0ciA9IEVtYmVyLlNUUklOR1Nbc3RyXSB8fCBzdHI7Ci0gICAgcmV0
dXJuIEVtYmVyLlN0cmluZy5mbXQoc3RyLCBmb3JtYXRzKSA7Ci0gIH0sCisgIGBgYGphdmFzY3Jp
cHQKKyAgQXBwLkVkaXRhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgICBlZGl0OiBmdW5j
dGlvbigpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdzdGFydGluZyB0byBlZGl0Jyk7CisgICAgICB0
aGlzLnNldCgnaXNFZGl0aW5nJywgdHJ1ZSk7CisgICAgfSwKKyAgICBpc0VkaXRpbmc6IGZhbHNl
CisgIH0pOwogCi0gIC8qKgotICAgIFNwbGl0cyBhIHN0cmluZyBpbnRvIHNlcGFyYXRlIHVuaXRz
IHNlcGFyYXRlZCBieSBzcGFjZXMsIGVsaW1pbmF0aW5nIGFueQotICAgIGVtcHR5IHN0cmluZ3Mg
aW4gdGhlIHByb2Nlc3MuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNwbGl0IHRo
YXQKLSAgICBpcyBtb3N0bHkgdXNlZnVsIHdoZW4gYXBwbGllZCB0byB0aGUgYFN0cmluZy5wcm90
b3R5cGVgLgorICAvLyBNaXggbWl4aW5zIGludG8gY2xhc3NlcyBieSBwYXNzaW5nIHRoZW0gYXMg
dGhlIGZpcnN0IGFyZ3VtZW50cyB0bworICAvLyAuZXh0ZW5kLgorICBBcHAuQ29tbWVudFZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZChBcHAuRWRpdGFibGUsIHsKKyAgICB0ZW1wbGF0ZTogRW1iZXIu
SGFuZGxlYmFycy5jb21waWxlKCd7eyNpZiB2aWV3LmlzRWRpdGluZ319Li4ue3tlbHNlfX0uLi57
ey9pZn19JykKKyAgfSk7CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuU3RyaW5nLnco
ImFscGhhIGJldGEgZ2FtbWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgewotICAgICAgY29uc29s
ZS5sb2coa2V5KTsKLSAgICB9KTsKKyAgY29tbWVudFZpZXcgPSBBcHAuQ29tbWVudFZpZXcuY3Jl
YXRlKCk7CisgIGNvbW1lbnRWaWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRpbmcgdG8gZWRp
dCcKKyAgYGBgCiAKLSAgICAvLyA+IGFscGhhCi0gICAgLy8gPiBiZXRhCi0gICAgLy8gPiBnYW1t
YQotICAgIGBgYAorICBOb3RlIHRoYXQgTWl4aW5zIGFyZSBjcmVhdGVkIHdpdGggYEVtYmVyLk1p
eGluLmNyZWF0ZWAsIG5vdAorICBgRW1iZXIuTWl4aW4uZXh0ZW5kYC4KIAotICAgIEBtZXRob2Qg
dwotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdAotICAgIEByZXR1
cm4ge1N0cmluZ30gc3BsaXQgc3RyaW5nCi0gICovCi0gIHc6IGZ1bmN0aW9uKHN0cikgeyByZXR1
cm4gc3RyLnNwbGl0KC9ccysvKTsgfSwKKyAgTm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBjb25z
dHJ1Y3RvcidzIHByb3RvdHlwZSBzbyBhcnJheXMgYW5kIG9iamVjdCBsaXRlcmFscworICBkZWZp
bmVkIGFzIHByb3BlcnRpZXMgd2lsbCBiZSBzaGFyZWQgYW1vbmdzdCBvYmplY3RzIHRoYXQgaW1w
bGVtZW50IHRoZSBtaXhpbi4KKyAgSWYgeW91IHdhbnQgdG8gZGVmaW5lIGFuIHByb3BlcnR5IGlu
IGEgbWl4aW4gdGhhdCBpcyBub3Qgc2hhcmVkLCB5b3UgY2FuIGRlZmluZQorICBpdCBlaXRoZXIg
YXMgYSBjb21wdXRlZCBwcm9wZXJ0eSBvciBoYXZlIGl0IGJlIGNyZWF0ZWQgb24gaW5pdGlhbGl6
YXRpb24gb2YgdGhlIG9iamVjdC4KIAotICAvKioKLSAgICBDb252ZXJ0cyBhIGNhbWVsaXplZCBz
dHJpbmcgaW50byBhbGwgbG93ZXIgY2FzZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuCisgIGBg
YGphdmFzY3JpcHQKKyAgLy9maWx0ZXJzIGFycmF5IHdpbGwgYmUgc2hhcmVkIGFtb25nc3QgYW55
IG9iamVjdCBpbXBsZW1lbnRpbmcgbWl4aW4KKyAgQXBwLkZpbHRlcmFibGUgPSBFbWJlci5NaXhp
bi5jcmVhdGUoeworICAgIGZpbHRlcnM6IEVtYmVyLkEoKQorICB9KTsKIAotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICAnaW5uZXJIVE1MJy5kZWNhbWVsaXplKCk7ICAgICAgICAgICAvLyAnaW5uZXJf
aHRtbCcKLSAgICAnYWN0aW9uX25hbWUnLmRlY2FtZWxpemUoKTsgICAgICAgIC8vICdhY3Rpb25f
bmFtZScKLSAgICAnY3NzLWNsYXNzLW5hbWUnLmRlY2FtZWxpemUoKTsgICAgIC8vICdjc3MtY2xh
c3MtbmFtZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmRlY2FtZWxpemUoKTsgIC8vICdteSBm
YXZvcml0ZSBpdGVtcycKLSAgICBgYGAKKyAgLy9maWx0ZXJzIHdpbGwgYmUgYSBzZXBhcmF0ZSAg
YXJyYXkgZm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1peGluCisgIEFwcC5GaWx0
ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgICBmaWx0ZXJzOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpe3JldHVybiBFbWJlci5BKCk7fSkKKyAgfSk7CiAKLSAgICBAbWV0aG9kIGRl
Y2FtZWxpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZGVjYW1lbGl6
ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBzdHJpbmcuCi0gICovCi0g
IGRlY2FtZWxpemU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJ
TkdfREVDQU1FTElaRV9SRUdFWFAsICckMV8kMicpLnRvTG93ZXJDYXNlKCk7Ci0gIH0sCisgIC8v
ZmlsdGVycyB3aWxsIGJlIGNyZWF0ZWQgYXMgYSBzZXBhcmF0ZSBhcnJheSBkdXJpbmcgdGhlIG9i
amVjdCdzIGluaXRpYWxpemF0aW9uCisgIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3Jl
YXRlKHsKKyAgICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuX3N1cGVyKCk7CisgICAg
ICB0aGlzLnNldCgiZmlsdGVycyIsIEVtYmVyLkEoKSk7CisgICAgfQorICB9KTsKKyAgYGBgCiAK
LSAgLyoqCi0gICAgUmVwbGFjZXMgdW5kZXJzY29yZXMgb3Igc3BhY2VzIHdpdGggZGFzaGVzLgor
ICBAY2xhc3MgTWl4aW4KKyAgQG5hbWVzcGFjZSBFbWJlcgorKi8KK0VtYmVyLk1peGluID0gZnVu
Y3Rpb24oKSB7IHJldHVybiBpbml0TWl4aW4odGhpcywgYXJndW1lbnRzKTsgfTsKIAotICAgIGBg
YGphdmFzY3JpcHQKLSAgICAnaW5uZXJIVE1MJy5kYXNoZXJpemUoKTsgICAgICAgICAgLy8gJ2lu
bmVyLWh0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy5kYXNoZXJpemUoKTsgICAgICAgIC8vICdhY3Rp
b24tbmFtZScKLSAgICAnY3NzLWNsYXNzLW5hbWUnLmRhc2hlcml6ZSgpOyAgICAgLy8gJ2Nzcy1j
bGFzcy1uYW1lJwotICAgICdteSBmYXZvcml0ZSBpdGVtcycuZGFzaGVyaXplKCk7ICAvLyAnbXkt
ZmF2b3JpdGUtaXRlbXMnCi0gICAgYGBgCitNaXhpbiA9IEVtYmVyLk1peGluOwogCi0gICAgQG1l
dGhvZCBkYXNoZXJpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZGFz
aGVyaXplLgotICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIGRhc2hlcml6ZWQgc3RyaW5nLgotICAq
LwotICBkYXNoZXJpemU6IGZ1bmN0aW9uKHN0cikgewotICAgIHZhciBjYWNoZSA9IFNUUklOR19E
QVNIRVJJWkVfQ0FDSEUsCi0gICAgICAgIHJldCAgID0gY2FjaGVbc3RyXTsKLQotICAgIGlmIChy
ZXQpIHsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldCA9IEVtYmVy
LlN0cmluZy5kZWNhbWVsaXplKHN0cikucmVwbGFjZShTVFJJTkdfREFTSEVSSVpFX1JFR0VYUCwn
LScpOwotICAgICAgY2FjaGVbc3RyXSA9IHJldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0Owot
ICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGxvd2VyQ2FzZUNhbWVsIGZvcm0gb2YgYSBz
dHJpbmcuCitNaXhpbi5wcm90b3R5cGUgPSB7CisgIHByb3BlcnRpZXM6IG51bGwsCisgIG1peGlu
czogbnVsbCwKKyAgb3duZXJDb25zdHJ1Y3RvcjogbnVsbAorfTsKIAotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAnaW5uZXJIVE1MJy5jYW1lbGl6ZSgpOyAgICAgICAgICAvLyAnaW5uZXJIVE1MJwot
ICAgICdhY3Rpb25fbmFtZScuY2FtZWxpemUoKTsgICAgICAgIC8vICdhY3Rpb25OYW1lJwotICAg
ICdjc3MtY2xhc3MtbmFtZScuY2FtZWxpemUoKTsgICAgIC8vICdjc3NDbGFzc05hbWUnCi0gICAg
J215IGZhdm9yaXRlIGl0ZW1zJy5jYW1lbGl6ZSgpOyAgLy8gJ215RmF2b3JpdGVJdGVtcycKLSAg
ICBgYGAKK01peGluLl9hcHBseSA9IGFwcGx5TWl4aW47CiAKLSAgICBAbWV0aG9kIGNhbWVsaXpl
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNhbWVsaXplLgotICAgIEBy
ZXR1cm4ge1N0cmluZ30gdGhlIGNhbWVsaXplZCBzdHJpbmcuCi0gICovCi0gIGNhbWVsaXplOiBm
dW5jdGlvbihzdHIpIHsKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0NBTUVMSVpFX1JF
R0VYUCwgZnVuY3Rpb24obWF0Y2gsIHNlcGFyYXRvciwgY2hyKSB7Ci0gICAgICByZXR1cm4gY2hy
ID8gY2hyLnRvVXBwZXJDYXNlKCkgOiAnJzsKLSAgICB9KTsKLSAgfSwKK01peGluLmFwcGx5UGFy
dGlhbCA9IGZ1bmN0aW9uKG9iaikgeworICB2YXIgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDEpOworICByZXR1cm4gYXBwbHlNaXhpbihvYmosIGFyZ3MsIHRydWUpOworfTsKIAotICAv
KioKLSAgICBSZXR1cm5zIHRoZSBVcHBlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgorTWl4
aW4uZmluaXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgJ2lubmVySFRNTCcuY2xhc3NpZnkoKTsgICAgICAgICAgLy8gJ0lubmVySFRNTCcKLSAgICAn
YWN0aW9uX25hbWUnLmNsYXNzaWZ5KCk7ICAgICAgICAvLyAnQWN0aW9uTmFtZScKLSAgICAnY3Nz
LWNsYXNzLW5hbWUnLmNsYXNzaWZ5KCk7ICAgICAvLyAnQ3NzQ2xhc3NOYW1lJwotICAgICdteSBm
YXZvcml0ZSBpdGVtcycuY2xhc3NpZnkoKTsgIC8vICdNeUZhdm9yaXRlSXRlbXMnCi0gICAgYGBg
IAorRW1iZXIuYW55VW5wcm9jZXNzZWRNaXhpbnMgPSBmYWxzZTsKIAotICAgIEBtZXRob2QgY2xh
c3NpZnkKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY2xhc3NpZnkKLSAg
ICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lmaWVkIHN0cmluZwotICAqLwotICBjbGFzc2lm
eTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCIuIiksCi0gICAg
ICAgIG91dCA9IFtdOworLyoqCisgIEBtZXRob2QgY3JlYXRlCisgIEBzdGF0aWMKKyAgQHBhcmFt
IGFyZ3VtZW50cyoKKyovCitNaXhpbi5jcmVhdGUgPSBmdW5jdGlvbigpIHsKKyAgRW1iZXIuYW55
VW5wcm9jZXNzZWRNaXhpbnMgPSB0cnVlOworICB2YXIgTSA9IHRoaXM7CisgIHJldHVybiBpbml0
TWl4aW4obmV3IE0oKSwgYXJndW1lbnRzKTsKK307CiAKLSAgICBmb3IgKHZhciBpPTAsIGw9cGFy
dHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgdmFyIGNhbWVsaXplZCA9IEVtYmVyLlN0cmlu
Zy5jYW1lbGl6ZShwYXJ0c1tpXSk7Ci0gICAgICBvdXQucHVzaChjYW1lbGl6ZWQuY2hhckF0KDAp
LnRvVXBwZXJDYXNlKCkgKyBjYW1lbGl6ZWQuc3Vic3RyKDEpKTsKLSAgICB9Cit2YXIgTWl4aW5Q
cm90b3R5cGUgPSBNaXhpbi5wcm90b3R5cGU7CiAKLSAgICByZXR1cm4gb3V0LmpvaW4oIi4iKTsK
LSAgfSwKKy8qKgorICBAbWV0aG9kIHJlb3BlbgorICBAcGFyYW0gYXJndW1lbnRzKgorKi8KK01p
eGluUHJvdG90eXBlLnJlb3BlbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbWl4aW4sIHRtcDsKIAot
ICAvKioKLSAgICBNb3JlIGdlbmVyYWwgdGhhbiBkZWNhbWVsaXplLiBSZXR1cm5zIHRoZSBsb3dl
clxfY2FzZVxfYW5kXF91bmRlcnNjb3JlZAotICAgIGZvcm0gb2YgYSBzdHJpbmcuCisgIGlmICh0
aGlzLnByb3BlcnRpZXMpIHsKKyAgICBtaXhpbiA9IE1peGluLmNyZWF0ZSgpOworICAgIG1peGlu
LnByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CisgICAgZGVsZXRlIHRoaXMucHJvcGVydGll
czsKKyAgICB0aGlzLm1peGlucyA9IFttaXhpbl07CisgIH0gZWxzZSBpZiAoIXRoaXMubWl4aW5z
KSB7CisgICAgdGhpcy5taXhpbnMgPSBbXTsKKyAgfQogCi0gICAgYGBgamF2YXNjcmlwdAotICAg
ICdpbm5lckhUTUwnLnVuZGVyc2NvcmUoKTsgICAgICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAg
J2FjdGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAg
J2Nzcy1jbGFzcy1uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAvLyAnY3NzX2NsYXNzX25hbWUnCi0g
ICAgJ215IGZhdm9yaXRlIGl0ZW1zJy51bmRlcnNjb3JlKCk7ICAvLyAnbXlfZmF2b3JpdGVfaXRl
bXMnCi0gICAgYGBgCisgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaXhpbnMgPSB0aGlz
Lm1peGlucywgaWR4OwogCi0gICAgQG1ldGhvZCB1bmRlcnNjb3JlCi0gICAgQHBhcmFtIHtTdHJp
bmd9IHN0ciBUaGUgc3RyaW5nIHRvIHVuZGVyc2NvcmUuCi0gICAgQHJldHVybiB7U3RyaW5nfSB0
aGUgdW5kZXJzY29yZWQgc3RyaW5nLgotICAqLwotICB1bmRlcnNjb3JlOiBmdW5jdGlvbihzdHIp
IHsKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzEsICck
MV8kMicpLgotICAgICAgcmVwbGFjZShTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMiwgJ18nKS50
b0xvd2VyQ2FzZSgpOwotICB9LAorICBmb3IoaWR4PTA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAg
ICBtaXhpbiA9IGFyZ3VtZW50c1tpZHhdOworICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0ZWQgaGFz
aCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNh
bGwobWl4aW4pLAorICAgICAgICAgICAgICAgICB0eXBlb2YgbWl4aW4gPT09ICdvYmplY3QnICYm
IG1peGluICE9PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtaXhpbikg
IT09ICdbb2JqZWN0IEFycmF5XScpOwogCi0gIC8qKgotICAgIFJldHVybnMgdGhlIENhcGl0YWxp
emVkIGZvcm0gb2YgYSBzdHJpbmcKKyAgICBpZiAobWl4aW4gaW5zdGFuY2VvZiBNaXhpbikgewor
ICAgICAgbWl4aW5zLnB1c2gobWl4aW4pOworICAgIH0gZWxzZSB7CisgICAgICB0bXAgPSBNaXhp
bi5jcmVhdGUoKTsKKyAgICAgIHRtcC5wcm9wZXJ0aWVzID0gbWl4aW47CisgICAgICBtaXhpbnMu
cHVzaCh0bXApOworICAgIH0KKyAgfQogCi0gICAgICAgJ2lubmVySFRNTCcuY2FwaXRhbGl6ZSgp
ICAgICAgICAgPT4gJ0lubmVySFRNTCcKLSAgICAgICAnYWN0aW9uX25hbWUnLmNhcGl0YWxpemUo
KSAgICAgICA9PiAnQWN0aW9uX25hbWUnCi0gICAgICAgJ2Nzcy1jbGFzcy1uYW1lJy5jYXBpdGFs
aXplKCkgICAgPT4gJ0Nzcy1jbGFzcy1uYW1lJwotICAgICAgICdteSBmYXZvcml0ZSBpdGVtcycu
Y2FwaXRhbGl6ZSgpID0+ICdNeSBmYXZvcml0ZSBpdGVtcycKKyAgcmV0dXJuIHRoaXM7Cit9Owog
Ci0gICAgQG1ldGhvZCBjYXBpdGFsaXplCi0gICAgQHBhcmFtIHtTdHJpbmd9IHN0cgotICAgIEBy
ZXR1cm4ge1N0cmluZ30KLSAgKi8KLSAgY2FwaXRhbGl6ZTogZnVuY3Rpb24oc3RyKSB7Ci0gICAg
cmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHIoMSk7Ci0gIH0K
Ky8qKgorICBAbWV0aG9kIGFwcGx5CisgIEBwYXJhbSBvYmoKKyAgQHJldHVybiBhcHBsaWVkIG9i
amVjdAorKi8KK01peGluUHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24ob2JqKSB7CisgIHJldHVy
biBhcHBseU1peGluKG9iaiwgW3RoaXNdLCBmYWxzZSk7Cit9OwogCitNaXhpblByb3RvdHlwZS5h
cHBseVBhcnRpYWwgPSBmdW5jdGlvbihvYmopIHsKKyAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBb
dGhpc10sIHRydWUpOwogfTsKIAotfSkoKTsKK2Z1bmN0aW9uIF9kZXRlY3QoY3VyTWl4aW4sIHRh
cmdldE1peGluLCBzZWVuKSB7CisgIHZhciBndWlkID0gZ3VpZEZvcihjdXJNaXhpbik7CiAKKyAg
aWYgKHNlZW5bZ3VpZF0pIHsgcmV0dXJuIGZhbHNlOyB9CisgIHNlZW5bZ3VpZF0gPSB0cnVlOwog
CisgIGlmIChjdXJNaXhpbiA9PT0gdGFyZ2V0TWl4aW4pIHsgcmV0dXJuIHRydWU7IH0KKyAgdmFy
IG1peGlucyA9IGN1ck1peGluLm1peGlucywgbG9jID0gbWl4aW5zID8gbWl4aW5zLmxlbmd0aCA6
IDA7CisgIHdoaWxlICgtLWxvYyA+PSAwKSB7CisgICAgaWYgKF9kZXRlY3QobWl4aW5zW2xvY10s
IHRhcmdldE1peGluLCBzZWVuKSkgeyByZXR1cm4gdHJ1ZTsgfQorICB9CisgIHJldHVybiBmYWxz
ZTsKK30KIAotKGZ1bmN0aW9uKCkgewogLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKKyAgQG1ldGhvZCBkZXRlY3QKKyAgQHBhcmFtIG9iagorICBAcmV0dXJuIHtC
b29sZWFufQogKi8KK01peGluUHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uKG9iaikgeworICBp
ZiAoIW9iaikgeyByZXR1cm4gZmFsc2U7IH0KKyAgaWYgKG9iaiBpbnN0YW5jZW9mIE1peGluKSB7
IHJldHVybiBfZGV0ZWN0KG9iaiwgdGhpcywge30pOyB9CisgIHZhciBtaXhpbnMgPSBFbWJlci5t
ZXRhKG9iaiwgZmFsc2UpLm1peGluczsKKyAgaWYgKG1peGlucykgeworICAgIHJldHVybiAhIW1p
eGluc1tndWlkRm9yKHRoaXMpXTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9OwogCitNaXhpblBy
b3RvdHlwZS53aXRob3V0ID0gZnVuY3Rpb24oKSB7CisgIHZhciByZXQgPSBuZXcgTWl4aW4odGhp
cyk7CisgIHJldC5fd2l0aG91dCA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOworICByZXR1cm4g
cmV0OworfTsKIAorZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgeworICBpZiAoc2Vl
bltndWlkRm9yKG1peGluKV0pIHsgcmV0dXJuOyB9CisgIHNlZW5bZ3VpZEZvcihtaXhpbildID0g
dHJ1ZTsKIAotdmFyIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgdyAgID0gRW1iZXIuU3Ry
aW5nLncsCi0gICAgbG9jID0gRW1iZXIuU3RyaW5nLmxvYywKLSAgICBjYW1lbGl6ZSA9IEVtYmVy
LlN0cmluZy5jYW1lbGl6ZSwKLSAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxp
emUsCi0gICAgZGFzaGVyaXplID0gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZSwKLSAgICB1bmRlcnNj
b3JlID0gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUsCi0gICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0
cmluZy5jYXBpdGFsaXplLAotICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNsYXNzaWZ5Owor
ICBpZiAobWl4aW4ucHJvcGVydGllcykgeworICAgIHZhciBwcm9wcyA9IG1peGluLnByb3BlcnRp
ZXM7CisgICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7CisgICAgICBpZiAocHJvcHMuaGFzT3du
UHJvcGVydHkoa2V5KSkgeyByZXRba2V5XSA9IHRydWU7IH0KKyAgICB9CisgIH0gZWxzZSBpZiAo
bWl4aW4ubWl4aW5zKSB7CisgICAgYV9mb3JFYWNoLmNhbGwobWl4aW4ubWl4aW5zLCBmdW5jdGlv
bih4KSB7IF9rZXlzKHJldCwgeCwgc2Vlbik7IH0pOworICB9Cit9CiAKLWlmIChFbWJlci5FWFRF
TkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcp
IHsKK01peGluUHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGtleXMgPSB7fSwg
c2VlbiA9IHt9LCByZXQgPSBbXTsKKyAgX2tleXMoa2V5cywgdGhpcywgc2Vlbik7CisgIGZvcih2
YXIga2V5IGluIGtleXMpIHsKKyAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJl
dC5wdXNoKGtleSk7IH0KKyAgfQorICByZXR1cm4gcmV0OworfTsKIAotICAvKioKLSAgICBTZWUg
e3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvZm10In19e3svY3Jvc3NMaW5rfX0KKy8vIHJldHVy
bnMgdGhlIG1peGlucyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdAor
Ly8gVE9ETzogTWFrZSBFbWJlci5taXhpbgorTWl4aW4ubWl4aW5zID0gZnVuY3Rpb24ob2JqKSB7
CisgIHZhciBtaXhpbnMgPSBFbWJlci5tZXRhKG9iaiwgZmFsc2UpLm1peGlucywgcmV0ID0gW107
CiAKLSAgICBAbWV0aG9kIGZtdAotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90
b3R5cGUuZm10ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZtdCh0aGlzLCBhcmd1bWVudHMp
OwotICB9OworICBpZiAoIW1peGlucykgeyByZXR1cm4gcmV0OyB9CiAKLSAgLyoqCi0gICAgU2Vl
IHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3cifX17ey9jcm9zc0xpbmt9fQorICBmb3IgKHZh
ciBrZXkgaW4gbWl4aW5zKSB7CisgICAgdmFyIG1peGluID0gbWl4aW5zW2tleV07CiAKLSAgICBA
bWV0aG9kIHcKLSAgICBAZm9yIFN0cmluZwotICAqLwotICBTdHJpbmcucHJvdG90eXBlLncgPSBm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gdyh0aGlzKTsKLSAgfTsKKyAgICAvLyBza2lwIHByaW1p
dGl2ZSBtaXhpbnMgc2luY2UgdGhlc2UgYXJlIGFsd2F5cyBhbm9ueW1vdXMKKyAgICBpZiAoIW1p
eGluLnByb3BlcnRpZXMpIHsgcmV0LnB1c2gobWl4aW4pOyB9CisgIH0KIAotICAvKioKLSAgICBT
ZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvbG9jIn19e3svY3Jvc3NMaW5rfX0KKyAgcmV0
dXJuIHJldDsKK307CiAKLSAgICBAbWV0aG9kIGxvYwotICAgIEBmb3IgU3RyaW5nCi0gICovCi0g
IFN0cmluZy5wcm90b3R5cGUubG9jID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGxvYyh0aGlz
LCBhcmd1bWVudHMpOwotICB9OworUkVRVUlSRUQgPSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwor
UkVRVUlSRUQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICcoUmVxdWlyZWQgUHJvcGVy
dHkpJzsgfTsKIAotICAvKioKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvY2Ft
ZWxpemUifX17ey9jcm9zc0xpbmt9fQorLyoqCisgIERlbm90ZXMgYSByZXF1aXJlZCBwcm9wZXJ0
eSBmb3IgYSBtaXhpbgogCi0gICAgQG1ldGhvZCBjYW1lbGl6ZQotICAgIEBmb3IgU3RyaW5nCi0g
ICovCi0gIFN0cmluZy5wcm90b3R5cGUuY2FtZWxpemUgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gY2FtZWxpemUodGhpcyk7Ci0gIH07CisgIEBtZXRob2QgcmVxdWlyZWQKKyAgQGZvciBFbWJl
cgorKi8KK0VtYmVyLnJlcXVpcmVkID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBSRVFVSVJFRDsK
K307CiAKLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL2RlY2FtZWxp
emUifX17ey9jcm9zc0xpbmt9fQorQWxpYXMgPSBmdW5jdGlvbihtZXRob2ROYW1lKSB7CisgIHRo
aXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Cit9OworQWxpYXMucHJvdG90eXBlID0gbmV3IEVt
YmVyLkRlc2NyaXB0b3IoKTsKIAotICAgIEBtZXRob2QgZGVjYW1lbGl6ZQotICAgIEBmb3IgU3Ry
aW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuZGVjYW1lbGl6ZSA9IGZ1bmN0aW9uKCkgewot
ICAgIHJldHVybiBkZWNhbWVsaXplKHRoaXMpOwotICB9OworLyoqCisgIE1ha2VzIGEgcHJvcGVy
dHkgb3IgbWV0aG9kIGF2YWlsYWJsZSB2aWEgYW4gYWRkaXRpb25hbCBuYW1lLgogCi0gIC8qKgot
ICAgIFNlZSB7eyNjcm9zc0xpbmsgIkVtYmVyLlN0cmluZy9kYXNoZXJpemUifX17ey9jcm9zc0xp
bmt9fQorICBgYGBqYXZhc2NyaXB0CisgIEFwcC5QYWludFNhbXBsZSA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoeworICAgIGNvbG9yOiAncmVkJywKKyAgICBjb2xvdXI6IEVtYmVyLmFsaWFzKCdjb2xv
cicpLAorICAgIG5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICJaZWQiOworICAgIH0s
CisgICAgbW9uaWtlcjogRW1iZXIuYWxpYXMoIm5hbWUiKQorICB9KTsKIAotICAgIEBtZXRob2Qg
ZGFzaGVyaXplCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5kYXNo
ZXJpemUgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gZGFzaGVyaXplKHRoaXMpOwotICB9Owor
ICB2YXIgcGFpbnRTYW1wbGUgPSBBcHAuUGFpbnRTYW1wbGUuY3JlYXRlKCkKKyAgcGFpbnRTYW1w
bGUuZ2V0KCdjb2xvdXInKTsgIC8vICdyZWQnCisgIHBhaW50U2FtcGxlLm1vbmlrZXIoKTsgICAg
ICAvLyAnWmVkJworICBgYGAKIAotICAvKioKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5T
dHJpbmcvdW5kZXJzY29yZSJ9fXt7L2Nyb3NzTGlua319CisgIEBtZXRob2QgYWxpYXMKKyAgQGZv
ciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Qg
b3IgcHJvcGVydHkgdG8gYWxpYXMKKyAgQHJldHVybiB7RW1iZXIuRGVzY3JpcHRvcn0KKyAgQGRl
cHJlY2F0ZWQgVXNlIGBFbWJlci5hbGlhc01ldGhvZGAgb3IgYEVtYmVyLmNvbXB1dGVkLmFsaWFz
YCBpbnN0ZWFkCisqLworRW1iZXIuYWxpYXMgPSBmdW5jdGlvbihtZXRob2ROYW1lKSB7CisgIEVt
YmVyLmRlcHJlY2F0ZSgiRW1iZXIuYWxpYXMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJl
ci5hbGlhc01ldGhvZCBvciBFbWJlci5jb21wdXRlZC5hbGlhcyBpbnN0ZWFkLiIpOworICByZXR1
cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOworfTsKIAotICAgIEBtZXRob2QgdW5kZXJzY29yZQot
ICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUudW5kZXJzY29yZSA9IGZ1
bmN0aW9uKCkgewotICAgIHJldHVybiB1bmRlcnNjb3JlKHRoaXMpOwotICB9OworLyoqCisgIE1h
a2VzIGEgbWV0aG9kIGF2YWlsYWJsZSB2aWEgYW4gYWRkaXRpb25hbCBuYW1lLgogCi0gIC8qKgot
ICAgIFNlZSB7eyNjcm9zc0xpbmsgIkVtYmVyLlN0cmluZy9jbGFzc2lmeSJ9fXt7L2Nyb3NzTGlu
a319CisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
eworICAgIG5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICdUb21odWRhIEthdHpkYWxl
JzsKKyAgICB9LAorICAgIG1vbmlrZXI6IEVtYmVyLmFsaWFzTWV0aG9kKCduYW1lJykKKyAgfSk7
CiAKLSAgICBAbWV0aG9kIGNsYXNzaWZ5Ci0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5n
LnByb3RvdHlwZS5jbGFzc2lmeSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjbGFzc2lmeSh0
aGlzKTsKLSAgfTsKKyAgdmFyIGdvb2RHdXkgPSBBcHAuUGVyc29uLmNyZWF0ZSgpCisgIGBgYAog
Ci0gIC8qKgotICAgIFNlZSB7eyNjcm9zc0xpbmsgIkVtYmVyLlN0cmluZy9jYXBpdGFsaXplIn19
e3svY3Jvc3NMaW5rfX0KKyAgQG1ldGhvZCBhbGlhc01ldGhvZAorICBAZm9yIEVtYmVyCisgIEBw
YXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBhbGlhcworICBA
cmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQorKi8KK0VtYmVyLmFsaWFzTWV0aG9kID0gZnVuY3Rp
b24obWV0aG9kTmFtZSkgeworICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOworfTsKIAot
ICAgIEBtZXRob2QgY2FwaXRhbGl6ZQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5w
cm90b3R5cGUuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjYXBpdGFsaXpl
KHRoaXMpOwotICB9OworLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgorLy8gT0JTRVJWRVIgSEVMUEVSCisvLwogCi19CisvKioKKyAg
U3BlY2lmeSBhIG1ldGhvZCB0aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCisKKyAgYGBg
amF2YXNjcmlwdAorICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICB2YWx1ZU9ic2VydmVyOiBF
bWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbigpIHsKKyAgICAgIC8vIEV4ZWN1dGVzIHdo
ZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICB9KQorICB9KTsKKyAgYGBg
CiAKKyAgSW4gdGhlIGZ1dHVyZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4g
SWYgeW91IHdhbnQgdG8gZW5zdXJlCisgIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1c2UgYGltbWVk
aWF0ZU9ic2VydmVyYC4KIAotfSkoKTsKKyAgQWxzbyBhdmFpbGFibGUgYXMgYEZ1bmN0aW9uLnBy
b3RvdHlwZS5vYnNlcnZlc2AgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgIGVuYWJsZWQu
CisKKyAgQG1ldGhvZCBvYnNlcnZlcgorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBw
cm9wZXJ0eU5hbWVzKgorICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgIEByZXR1cm4gZnVuYwor
Ki8KK0VtYmVyLm9ic2VydmVyID0gZnVuY3Rpb24oKSB7CisgIHZhciBmdW5jICA9IGFfc2xpY2Uu
Y2FsbChhcmd1bWVudHMsIC0xKVswXTsKKyAgdmFyIHBhdGhzOwogCisgIAorICAgIHBhdGhzID0g
YV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpOwogCisgICAgaWYgKHR5cGVvZiBmdW5jICE9
PSAiZnVuY3Rpb24iKSB7CisgICAgICAvLyByZXZlcnQgdG8gb2xkLCBzb2Z0LWRlcHJlY2F0ZWQg
YXJndW1lbnQgb3JkZXJpbmcKKworICAgICAgZnVuYyAgPSBhcmd1bWVudHNbMF07CisgICAgICBw
YXRocyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIH0KKyAgCisKKyAgaWYgKHR5
cGVvZiBmdW5jICE9PSAiZnVuY3Rpb24iKSB7CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJF
bWJlci5vYnNlcnZlciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uIik7CisgIH0KKworICBmdW5j
Ll9fZW1iZXJfb2JzZXJ2ZXNfXyA9IHBhdGhzOworICByZXR1cm4gZnVuYzsKK307CiAKLShmdW5j
dGlvbigpIHsKIC8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0q
LworICBTcGVjaWZ5IGEgbWV0aG9kIHRoYXQgb2JzZXJ2ZXMgcHJvcGVydHkgY2hhbmdlcy4KIAot
dmFyIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgIGBgYGphdmFzY3JpcHQKKyAg
RW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgdmFsdWVPYnNlcnZlcjogRW1iZXIuaW1tZWRpYXRl
T2JzZXJ2ZXIoJ3ZhbHVlJywgZnVuY3Rpb24oKSB7CisgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZl
ciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgfSkKKyAgfSk7CisgIGBgYAogCi1p
ZiAoRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RP
VFlQRVMuRnVuY3Rpb24pIHsKKyAgSW4gdGhlIGZ1dHVyZSwgYEVtYmVyLm9ic2VydmVyYCBtYXkg
YmVjb21lIGFzeW5jaHJvbm91cy4gSW4gdGhpcyBldmVudCwKKyAgYEVtYmVyLmltbWVkaWF0ZU9i
c2VydmVyYCB3aWxsIG1haW50YWluIHRoZSBzeW5jaHJvbm91cyBiZWhhdmlvci4KIAotICAvKioK
LSAgICBUaGUgYHByb3BlcnR5YCBleHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1bmN0aW9uIHBy
b3RvdHlwZSBpcyBhdmFpbGFibGUKLSAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Ag
b3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcwotICAgIGB0cnVlYCwgd2hp
Y2ggaXMgdGhlIGRlZmF1bHQuCisgIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5
cGUub2JzZXJ2ZXNJbW1lZGlhdGVseWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgIGVu
YWJsZWQuCiAKLSAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFsbG93IHlvdSB0byB0cmVhdCBhIGZ1
bmN0aW9uIGxpa2UgYSBwcm9wZXJ0eToKKyAgQG1ldGhvZCBpbW1lZGlhdGVPYnNlcnZlcgorICBA
Zm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWVzKgorICBAcGFyYW0ge0Z1
bmN0aW9ufSBmdW5jCisgIEByZXR1cm4gZnVuYworKi8KK0VtYmVyLmltbWVkaWF0ZU9ic2VydmVy
ID0gZnVuY3Rpb24oKSB7CisgIGZvciAodmFyIGk9MCwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7
IGkrKykgeworICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07CisgICAgRW1iZXIuYXNzZXJ0KCJJ
bW1lZGlhdGUgb2JzZXJ2ZXJzIG11c3Qgb2JzZXJ2ZSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG9ubHks
IG5vdCBwcm9wZXJ0aWVzIG9uIG90aGVyIG9iamVjdHMuIiwgdHlwZW9mIGFyZyAhPT0gInN0cmlu
ZyIgfHwgYXJnLmluZGV4T2YoJy4nKSA9PT0gLTEpOworICB9CiAKLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgTXlBcHAucHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICBmaXJz
dE5hbWU6ICJCYXJhY2siLAotICAgICAgbGFzdE5hbWU6ICJPYmFtYSIsCisgIHJldHVybiBFbWJl
ci5vYnNlcnZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKIAotICAgICAgZnVsbE5hbWU6
IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAn
ICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisvKioKKyAgV2hlbiBvYnNlcnZlcnMgZmlyZSwgdGhl
eSBhcmUgY2FsbGVkIHdpdGggdGhlIGFyZ3VtZW50cyBgb2JqYCwgYGtleU5hbWVgLgogCi0gICAg
ICAgIC8vIENhbGwgdGhpcyBmbGFnIHRvIG1hcmsgdGhlIGZ1bmN0aW9uIGFzIGEgcHJvcGVydHkK
LSAgICAgIH0ucHJvcGVydHkoKQotICAgIH0pOworICBOb3RlLCBgQGVhY2gucHJvcGVydHlgIG9i
c2VydmVyIGlzIGNhbGxlZCBwZXIgZWFjaCBhZGQgb3IgcmVwbGFjZSBvZiBhbiBlbGVtZW50Cisg
IGFuZCBpdCdzIG5vdCBjYWxsZWQgd2l0aCBhIHNwZWNpZmljIGVudW1lcmF0aW9uIGl0ZW0uCiAK
LSAgICBNeUFwcC5wcmVzaWRlbnQuZ2V0KCdmdWxsTmFtZScpOyAgICAvLyAiQmFyYWNrIE9iYW1h
IgotICAgIGBgYAorICBBIGBiZWZvcmVPYnNlcnZlcmAgZmlyZXMgYmVmb3JlIGEgcHJvcGVydHkg
Y2hhbmdlcy4KIAotICAgIFRyZWF0aW5nIGEgZnVuY3Rpb24gbGlrZSBhIHByb3BlcnR5IGlzIHVz
ZWZ1bCBiZWNhdXNlIHRoZXkgY2FuIHdvcmsgd2l0aAotICAgIGJpbmRpbmdzLCBqdXN0IGxpa2Ug
YW55IG90aGVyIHByb3BlcnR5LgorICBBIGBiZWZvcmVPYnNlcnZlcmAgaXMgYW4gYWx0ZXJuYXRp
dmUgZm9ybSBvZiBgLm9ic2VydmVzQmVmb3JlKClgLgogCi0gICAgTWFueSBjb21wdXRlZCBwcm9w
ZXJ0aWVzIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG90aGVyIHByb3BlcnRpZXMuIEZvcgotICAgIGV4
YW1wbGUsIGluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgYGZ1bGxOYW1lYCBwcm9wZXJ0eSBkZXBl
bmRzIG9uCi0gICAgYGZpcnN0TmFtZWAgYW5kIGBsYXN0TmFtZWAgdG8gZGV0ZXJtaW5lIGl0cyB2
YWx1ZS4gWW91IGNhbiB0ZWxsIEVtYmVyCi0gICAgYWJvdXQgdGhlc2UgZGVwZW5kZW5jaWVzIGxp
a2UgdGhpczoKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBNeUFwcC5wcmVzaWRlbnQgPSBFbWJl
ci5PYmplY3QuY3JlYXRlKHsKLSAgICAgIGZpcnN0TmFtZTogIkJhcmFjayIsCi0gICAgICBsYXN0
TmFtZTogIk9iYW1hIiwKKyAgICBmcmllbmRzOiBbeyBuYW1lOiAnVG9tJyB9LCB7IG5hbWU6ICdT
dGVmYW4nIH0sIHsgbmFtZTogJ0tyaXMnIH1dLAogCi0gICAgICBmdWxsTmFtZTogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdl
dCgnbGFzdE5hbWUnKTsKKyAgICB2YWx1ZVdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVy
KCdjb250ZW50LnZhbHVlJywgZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7CisgICAgICB0aGlzLmNo
YW5naW5nRnJvbSA9IG9iai5nZXQoa2V5TmFtZSk7CisgICAgfSksCiAKLSAgICAgICAgLy8gVGVs
bCBFbWJlci5qcyB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5h
bWUKLSAgICAgICAgLy8gYW5kIGxhc3ROYW1lCi0gICAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUn
LCAnbGFzdE5hbWUnKQotICAgIH0pOwotICAgIGBgYAorICAgIHZhbHVlRGlkQ2hhbmdlOiBFbWJl
ci5vYnNlcnZlcignY29udGVudC52YWx1ZScsIGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICAg
ICAgICAvLyBvbmx5IHJ1biBpZiB1cGRhdGluZyBhIHZhbHVlIGFscmVhZHkgaW4gdGhlIERPTQor
ICAgICAgICBpZiAodGhpcy5nZXQoJ3N0YXRlJykgPT09ICdpbkRPTScpIHsKKyAgICAgICAgICB2
YXIgY29sb3IgPSBvYmouZ2V0KGtleU5hbWUpID4gdGhpcy5jaGFuZ2luZ0Zyb20gPyAnZ3JlZW4n
IDogJ3JlZCc7CisgICAgICAgICAgLy8gbG9naWMKKyAgICAgICAgfQorICAgIH0pLAogCi0gICAg
TWFrZSBzdXJlIHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2llcyBzbyBFbWJlciBrbm93cyB3aGVu
IHRvIHVwZGF0ZQotICAgIGJpbmRpbmdzIHRoYXQgY29ubmVjdCB0byBhIGNvbXB1dGVkIHByb3Bl
cnR5LiBDaGFuZ2luZyBhIGRlcGVuZGVuY3kKLSAgICB3aWxsIG5vdCBpbW1lZGlhdGVseSB0cmln
Z2VyIGFuIHVwZGF0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHksIGJ1dAotICAgIHdpbGwgaW5z
dGVhZCBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1cGRhdGVkIHdoZW4gdGhlIG5leHQg
YGdldGAKLSAgICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5LgorICAgIGZyaWVuZHNEaWRDaGFu
Z2U6IEVtYmVyLm9ic2VydmVyKCdmcmllbmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihvYmosIGtl
eU5hbWUpIHsKKyAgICAgIC8vIHNvbWUgbG9naWMKKyAgICAgIC8vIG9iai5nZXQoa2V5TmFtZSkg
cmV0dXJucyBmcmllbmRzIGFycmF5CisgICAgfSkKKyAgfSk7CisgIGBgYAogCi0gICAgU2VlIHt7
I2Nyb3NzTGluayAiRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LAotICAg
ICAge3sjY3Jvc3NMaW5rICJFbWJlci9jb21wdXRlZCJ9fXt7L2Nyb3NzTGlua319CisgIEFsc28g
YXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNCZWZvcmVgIGlmIHByb3Rv
dHlwZSBleHRlbnNpb25zIGFyZQorICBlbmFibGVkLgogCi0gICAgQG1ldGhvZCBwcm9wZXJ0eQot
ICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8KLSAgRnVuY3Rpb24ucHJvdG90eXBlLnByb3BlcnR5ID0g
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldCA9IEVtYmVyLmNvbXB1dGVkKHRoaXMpOwotICAgIHJl
dHVybiByZXQucHJvcGVydHkuYXBwbHkocmV0LCBhcmd1bWVudHMpOwotICB9OworICBAbWV0aG9k
IGJlZm9yZU9ic2VydmVyCisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5
TmFtZXMqCisgIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKKyAgQHJldHVybiBmdW5jCisqLworRW1i
ZXIuYmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGZ1bmMgID0gYV9zbGljZS5j
YWxsKGFyZ3VtZW50cywgLTEpWzBdOworICB2YXIgcGF0aHM7CiAKLSAgLyoqCi0gICAgVGhlIGBv
YnNlcnZlc2AgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMg
YXZhaWxhYmxlCi0gICAgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMKLSAgICB0cnVlLCB3aGljaCBpcyB0aGUgZGVm
YXVsdC4KKyAgCisgICAgcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7CiAK
LSAgICBZb3UgY2FuIG9ic2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRo
ZSBgb2JzZXJ2ZXNgCi0gICAgY2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kIGRlY2xhcmF0
aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgotICAgIEZvciBleGFtcGxlOgorICAgIGlm
ICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9uIikgeworICAgICAgLy8gcmV2ZXJ0IHRvIG9sZCwg
c29mdC1kZXByZWNhdGVkIGFyZ3VtZW50IG9yZGVyaW5nCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigp
IHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgY2hh
bmdlcwotICAgICAgfS5vYnNlcnZlcygndmFsdWUnKQotICAgIH0pOwotICAgIGBgYAorICAgICAg
ZnVuYyAgPSBhcmd1bWVudHNbMF07CisgICAgICBwYXRocyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDEpOworICAgIH0KKyAgCiAKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5PYnNlcnZh
YmxlL29ic2VydmVzIn19e3svY3Jvc3NMaW5rfX0KKyAgaWYgKHR5cGVvZiBmdW5jICE9PSAiZnVu
Y3Rpb24iKSB7CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJFbWJlci5iZWZvcmVPYnNlcnZl
ciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uIik7CisgIH0KIAotICAgIEBtZXRob2Qgb2JzZXJ2
ZXMKLSAgICBAZm9yIEZ1bmN0aW9uCi0gICovCi0gIEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZl
cyA9IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX19lbWJlcl9vYnNlcnZlc19fID0gYV9zbGljZS5j
YWxsKGFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH07CisgIGZ1bmMuX19lbWJlcl9v
YnNlcnZlc0JlZm9yZV9fID0gcGF0aHM7CisgIHJldHVybiBmdW5jOworfTsKIAotICAvKioKLSAg
ICBUaGUgYG9ic2VydmVzQmVmb3JlYCBleHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1bmN0aW9u
IHByb3RvdHlwZSBpcwotICAgIGF2YWlsYWJsZSB3aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBF
U2Agb3IKLSAgICBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb25gIGlzIHRydWUsIHdo
aWNoIGlzIHRoZSBkZWZhdWx0LgorfSkoKTsKIAotICAgIFlvdSBjYW4gZ2V0IG5vdGlmaWVkIHdo
ZW4gYSBwcm9wZXJ0eSBjaGFuZ2VzIGlzIGFib3V0IHRvIGhhcHBlbiBieQotICAgIGJ5IGFkZGlu
ZyB0aGUgYG9ic2VydmVzQmVmb3JlYCBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QKLSAg
ICBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyB0aGF0IHlvdSB3cml0ZS4gRm9yIGV4YW1wbGU6CiAK
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICB2YWx1
ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhl
ICJ2YWx1ZSIgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlCi0gICAgICB9Lm9ic2VydmVzQmVm
b3JlKCd2YWx1ZScpCi0gICAgfSk7Ci0gICAgYGBgCiAKLSAgICBTZWUge3sjY3Jvc3NMaW5rICJF
bWJlci5PYnNlcnZhYmxlL29ic2VydmVzQmVmb3JlIn19e3svY3Jvc3NMaW5rfX0KKyhmdW5jdGlv
bigpIHsKKy8vIFByb3ZpZGVzIGEgd2F5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgdmVyc2lvbnMgd2l0
aCBlbWJlci4KK3ZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCisg
ICAgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOwogCi0gICAgQG1ldGhv
ZCBvYnNlcnZlc0JlZm9yZQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8KLSAgRnVuY3Rpb24ucHJv
dG90eXBlLm9ic2VydmVzQmVmb3JlID0gZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fX2VtYmVyX29i
c2VydmVzQmVmb3JlX18gPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICByZXR1cm4gdGhp
czsKK0VtYmVyLmxpYnJhcmllcyA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGlicmFyaWVzICAgID0g
W107CisgIHZhciBjb3JlTGliSW5kZXggPSAwOworCisgIHZhciBnZXRMaWJyYXJ5ID0gZnVuY3Rp
b24obmFtZSkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsr
KSB7CisgICAgICBpZiAobGlicmFyaWVzW2ldLm5hbWUgPT09IG5hbWUpIHsKKyAgICAgICAgcmV0
dXJuIGxpYnJhcmllc1tpXTsKKyAgICAgIH0KKyAgICB9CiAgIH07CiAKLX0KKyAgbGlicmFyaWVz
LnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgdmVyc2lvbikgeworICAgIGlmICghZ2V0TGlicmFy
eShuYW1lKSkgeworICAgICAgbGlicmFyaWVzLnB1c2goe25hbWU6IG5hbWUsIHZlcnNpb246IHZl
cnNpb259KTsKKyAgICB9CisgIH07CiAKKyAgbGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkg
PSBmdW5jdGlvbihuYW1lLCB2ZXJzaW9uKSB7CisgICAgaWYgKCFnZXRMaWJyYXJ5KG5hbWUpKSB7
CisgICAgICBsaWJyYXJpZXMuc3BsaWNlKGNvcmVMaWJJbmRleCsrLCAwLCB7bmFtZTogbmFtZSwg
dmVyc2lvbjogdmVyc2lvbn0pOworICAgIH0KKyAgfTsKIAotfSkoKTsKKyAgbGlicmFyaWVzLmRl
UmVnaXN0ZXIgPSBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGxpYiA9IGdldExpYnJhcnkobmFt
ZSk7CisgICAgaWYgKGxpYikgbGlicmFyaWVzLnNwbGljZShpbmRleE9mKGxpYnJhcmllcywgbGli
KSwgMSk7CisgIH07CiAKKyAgbGlicmFyaWVzLmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsK
KyAgICBmb3JFYWNoKGxpYnJhcmllcywgZnVuY3Rpb24obGliKSB7CisgICAgICBjYWxsYmFjayhs
aWIubmFtZSwgbGliLnZlcnNpb24pOworICAgIH0pOworICB9OwogCisgIHJldHVybiBsaWJyYXJp
ZXM7Cit9KCk7CiAKLShmdW5jdGlvbigpIHsKK0VtYmVyLmxpYnJhcmllcy5yZWdpc3RlckNvcmVM
aWJyYXJ5KCdFbWJlcicsIEVtYmVyLlZFUlNJT04pOwogCiB9KSgpOwogCkBAIC03MjUyLDMxODUg
Kzc5NjIsMzYxNiBAQCBpZiAoRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1i
ZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb24pIHsKIAogKGZ1bmN0aW9uKCkgewogLyoqCitF
bWJlciBNZXRhbAorCiBAbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKK0Bz
dWJtb2R1bGUgZW1iZXItbWV0YWwKICovCiAKLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEhFTFBFUlMKLS8vCit9KSgpOwog
Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgYV9zbGljZSA9IEFy
cmF5LnByb3RvdHlwZS5zbGljZTsKLXZhciBhX2luZGV4T2YgPSBFbWJlci5FbnVtZXJhYmxlVXRp
bHMuaW5kZXhPZjsKKyhmdW5jdGlvbigpIHsKKy8qKgorICBAY2xhc3MgUlNWUAorICBAbW9kdWxl
IFJTVlAKKyAgKi8KK2RlZmluZSgicnN2cC9hbGwiLCAKKyAgWyIuL3Byb21pc2UiLCJleHBvcnRz
Il0sCisgIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKKyAgICAidXNl
IHN0cmljdCI7CisgICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsK
IAotdmFyIGNvbnRleHRzID0gW107CisgICAgLyoqCisgICAgICBUaGlzIGlzIGEgY29udmVuaWVu
dCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5hbGxgLgorCisgICAgICBAbWV0aG9kIGFsbAorICAg
ICAgQGZvciBSU1ZQCisgICAgICBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSBvZiBwcm9taXNl
cy4KKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBbiBvcHRpb25hbCBsYWJlbC4gVGhpcyBp
cyB1c2VmdWwKKyAgICAgIGZvciB0b29saW5nLgorICAgICAgQHN0YXRpYworICAgICovCisgICAg
X19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGFsbChhcnJheSwgbGFiZWwpIHsKKyAg
ICAgIHJldHVybiBQcm9taXNlLmFsbChhcnJheSwgbGFiZWwpOworICAgIH07CisgIH0pOworZGVm
aW5lKCJyc3ZwL2FsbF9zZXR0bGVkIiwgCisgIFsiLi9wcm9taXNlIiwiLi91dGlscyIsImV4cG9y
dHMiXSwKKyAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZXhw
b3J0c19fKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRl
bmN5MV9fWyJkZWZhdWx0Il07CisgICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kyX18uaXNB
cnJheTsKKyAgICB2YXIgaXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTJfXy5pc05vblRoZW5h
YmxlOwogCi1mdW5jdGlvbiBwb3BDdHgoKSB7Ci0gIHJldHVybiBjb250ZXh0cy5sZW5ndGg9PT0w
ID8ge30gOiBjb250ZXh0cy5wb3AoKTsKLX0KLQotZnVuY3Rpb24gcHVzaEN0eChjdHgpIHsKLSAg
Y29udGV4dHMucHVzaChjdHgpOwotICByZXR1cm4gbnVsbDsKLX0KKyAgICAvKioKKyAgICAgIGBS
U1ZQLmFsbFNldHRsZWRgIGlzIHNpbWlsYXIgdG8gYFJTVlAuYWxsYCwgYnV0IGluc3RlYWQgb2Yg
aW1wbGVtZW50aW5nCisgICAgICBhIGZhaWwtZmFzdCBtZXRob2QsIGl0IHdhaXRzIHVudGlsIGFs
bCB0aGUgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQKKyAgICAgIHNob3dzIHlvdSBhbGwgdGhl
IHJlc3VsdHMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBtdWx0aXBsZQor
ICAgICAgcHJvbWlzZXMnIGZhaWx1cmUgc3RhdGVzIHRvZ2V0aGVyIGFzIGEgc2V0LgorCisgICAg
ICBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCB0aGUgZ2l2ZW4g
cHJvbWlzZXMgaGF2ZSBiZWVuCisgICAgICBzZXR0bGVkLiBUaGUgcmV0dXJuIHByb21pc2UgaXMg
ZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgdGhlIHN0YXRlcyBvZgorICAgICAgdGhlIHByb21p
c2VzIHBhc3NlZCBpbnRvIHRoZSBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50LgorCisgICAgICBF
YWNoIHN0YXRlIG9iamVjdCB3aWxsIGVpdGhlciBpbmRpY2F0ZSBmdWxmaWxsbWVudCBvciByZWpl
Y3Rpb24sIGFuZAorICAgICAgcHJvdmlkZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvciByZWFz
b24uIFRoZSBzdGF0ZXMgd2lsbCB0YWtlIG9uZSBvZgorICAgICAgdGhlIGZvbGxvd2luZyBmb3Jt
YXRzOgorCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB7IHN0YXRlOiAnZnVsZmlsbGVkJywg
dmFsdWU6IHZhbHVlIH0KKyAgICAgICAgb3IKKyAgICAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJl
YXNvbjogcmVhc29uIH0KKyAgICAgIGBgYAogCi1mdW5jdGlvbiBpdGVyKGtleSwgdmFsdWUpIHsK
LSAgdmFyIHZhbHVlUHJvdmlkZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyOworICAgICAgRXhh
bXBsZToKKworICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHByb21pc2UxID0gUlNWUC5Q
cm9taXNlLnJlc29sdmUoMSk7CisgICAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLlByb21pc2UucmVq
ZWN0KG5ldyBFcnJvcignMicpKTsKKyAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAuUHJvbWlzZS5y
ZWplY3QobmV3IEVycm9yKCczJykpOworICAgICAgdmFyIHByb21pc2VzID0gWyBwcm9taXNlMSwg
cHJvbWlzZTIsIHByb21pc2UzIF07CisKKyAgICAgIFJTVlAuYWxsU2V0dGxlZChwcm9taXNlcyku
dGhlbihmdW5jdGlvbihhcnJheSl7CisgICAgICAgIC8vIGFycmF5ID09IFsKKyAgICAgICAgLy8g
ICB7IHN0YXRlOiAnZnVsZmlsbGVkJywgdmFsdWU6IDEgfSwKKyAgICAgICAgLy8gICB7IHN0YXRl
OiAncmVqZWN0ZWQnLCByZWFzb246IEVycm9yIH0sCisgICAgICAgIC8vICAgeyBzdGF0ZTogJ3Jl
amVjdGVkJywgcmVhc29uOiBFcnJvciB9CisgICAgICAgIC8vIF0KKyAgICAgICAgLy8gTm90ZSB0
aGF0IGZvciB0aGUgc2Vjb25kIGl0ZW0sIHJlYXNvbi5tZXNzYWdlIHdpbGwgYmUgIjIiLCBhbmQg
Zm9yIHRoZQorICAgICAgICAvLyB0aGlyZCBpdGVtLCByZWFzb24ubWVzc2FnZSB3aWxsIGJlICIz
Ii4KKyAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIC8vIE5vdCBydW4uIChUaGlz
IGJsb2NrIHdvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsbFNldHRsZWQgaGFkIGZhaWxlZCwKKyAg
ICAgICAgLy8gZm9yIGluc3RhbmNlIGlmIHBhc3NlZCBhbiBpbmNvcnJlY3QgYXJndW1lbnQgdHlw
ZS4pCisgICAgICB9KTsKKyAgICAgIGBgYAogCi0gIGZ1bmN0aW9uIGkoaXRlbSkgewotICAgIHZh
ciBjdXIgPSBnZXQoaXRlbSwga2V5KTsKLSAgICByZXR1cm4gdmFsdWVQcm92aWRlZCA/IHZhbHVl
PT09Y3VyIDogISFjdXI7Ci0gIH0KLSAgcmV0dXJuIGkgOwotfQorICAgICAgQG1ldGhvZCBhbGxT
ZXR0bGVkCisgICAgICBAZm9yIFJTVlAKKyAgICAgIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNjcmli
ZXMgdGhlIHByb21pc2UuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgICBAcmV0dXJu
IHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgdGhl
IHNldHRsZWQKKyAgICAgIHN0YXRlcyBvZiB0aGUgY29uc3RpdHVlbnQgcHJvbWlzZXMuCisgICAg
ICBAc3RhdGljCisgICAgKi8KIAotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgY29tbW9u
IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBlbnVtZXJhYmxlIG9iamVjdHMKLSAgaW4gRW1iZXIu
IE1vc3Qgb2YgdGhlc2UgbWV0aG9kcyBmb2xsb3cgdGhlIHN0YW5kYXJkIEFycmF5IGl0ZXJhdGlv
bgotICBBUEkgZGVmaW5lZCB1cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVkaW5nIGxhbmd1YWdl
LXNwZWNpZmljIGZlYXR1cmVzIHRoYXQKLSAgY2Fubm90IGJlIGVtdWxhdGVkIGluIG9sZGVyIHZl
cnNpb25zIG9mIEphdmFTY3JpcHQpLgorICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5j
dGlvbiBhbGxTZXR0bGVkKGVudHJpZXMsIGxhYmVsKSB7CisgICAgICByZXR1cm4gbmV3IFByb21p
c2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgIGlmICghaXNBcnJheShlbnRy
aWVzKSkgeworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4g
YXJyYXkgdG8gYWxsU2V0dGxlZC4nKTsKKyAgICAgICAgfQogCi0gIFRoaXMgbWl4aW4gaXMgYXBw
bGllZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBBcnJheSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlv
dQotICBjYW4gdXNlIGFueSBvZiB0aGVzZSBtZXRob2RzIG9uIHNpbXBsZSBhcnJheXMuIElmIEFy
cmF5IGFscmVhZHkgaW1wbGVtZW50cwotICBvbmUgb2YgdGhlc2UgbWV0aG9kcywgdGhlIG1peGlu
IHdpbGwgbm90IG92ZXJyaWRlIHRoZW0uCisgICAgICAgIHZhciByZW1haW5pbmcgPSBlbnRyaWVz
Lmxlbmd0aDsKKyAgICAgICAgdmFyIGVudHJ5OwogCi0gICMjIFdyaXRpbmcgWW91ciBPd24gRW51
bWVyYWJsZQorICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKSB7CisgICAgICAgICAgcmVzb2x2
ZShbXSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgVG8gbWFrZSB5b3VyIG93
biBjdXN0b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5lZWQgdHdvIGl0ZW1zOgorICAgICAgICB2
YXIgcmVzdWx0cyA9IG5ldyBBcnJheShyZW1haW5pbmcpOwogCi0gIDEuIFlvdSBtdXN0IGhhdmUg
YSBsZW5ndGggcHJvcGVydHkuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGNoYW5nZSB3aGVuZXZlcgot
ICAgICB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdl
cy4gSWYgeW91IHVzaW5nIHRoaXMKLSAgICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFz
cywgeW91IHNob3VsZCBiZSBzdXJlIHRvIGNoYW5nZSB0aGUgbGVuZ3RoCi0gICAgIHByb3BlcnR5
IHVzaW5nIGBzZXQoKS5gCisgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZFJlc29sdmVyKGluZGV4
KSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgICByZXNv
bHZlQWxsKGluZGV4LCBmdWxmaWxsZWQodmFsdWUpKTsKKyAgICAgICAgICB9OworICAgICAgICB9
CiAKLSAgMi4gSWYgeW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9jdW1l
bnRhdGlvbi4KKyAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWRSZXNvbHZlcihpbmRleCkgeworICAg
ICAgICAgIHJldHVybiBmdW5jdGlvbihyZWFzb24pIHsKKyAgICAgICAgICAgIHJlc29sdmVBbGwo
aW5kZXgsIHJlamVjdGVkKHJlYXNvbikpOworICAgICAgICAgIH07CisgICAgICAgIH0KIAotICBP
bmNlIHlvdSBoYXZlIHRoZXNlIHR3byBtZXRob2RzIGltcGxlbWVudCwgYXBwbHkgdGhlIGBFbWJl
ci5FbnVtZXJhYmxlYCBtaXhpbgotICB0byB5b3VyIGNsYXNzIGFuZCB5b3Ugd2lsbCBiZSBhYmxl
IHRvIGVudW1lcmF0ZSB0aGUgY29udGVudHMgb2YgeW91ciBvYmplY3QKLSAgbGlrZSBhbnkgb3Ro
ZXIgY29sbGVjdGlvbi4KKyAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUFsbChpbmRleCwgdmFsdWUp
IHsKKyAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IHZhbHVlOworICAgICAgICAgIGlmICgtLXJl
bWFpbmluZyA9PT0gMCkgeworICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsKKyAgICAgICAg
ICB9CisgICAgICAgIH0KIAotICAjIyBVc2luZyBFbWJlciBFbnVtZXJhdGlvbiB3aXRoIE90aGVy
IExpYnJhcmllcworICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZW50cmllcy5s
ZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdOwogCi0g
IE1hbnkgb3RoZXIgbGlicmFyaWVzIHByb3ZpZGUgc29tZSBraW5kIG9mIGl0ZXJhdG9yIG9yIGVu
dW1lcmF0aW9uIGxpa2UKLSAgZmFjaWxpdHkuIFRoaXMgaXMgb2Z0ZW4gd2hlcmUgdGhlIG1vc3Qg
Y29tbW9uIEFQSSBjb25mbGljdHMgb2NjdXIuCi0gIEVtYmVyJ3MgQVBJIGlzIGRlc2lnbmVkIHRv
IGJlIGFzIGZyaWVuZGx5IGFzIHBvc3NpYmxlIHdpdGggb3RoZXIKLSAgbGlicmFyaWVzIGJ5IGlt
cGxlbWVudGluZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkgY29ycmVzcG9uZCB0byB0aGUKLSAg
SmF2YVNjcmlwdCAxLjggQVBJLgorICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVudHJ5KSkg
eworICAgICAgICAgICAgcmVzb2x2ZUFsbChpbmRleCwgZnVsZmlsbGVkKGVudHJ5KSk7CisgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb21pc2UuY2FzdChlbnRyeSkudGhlbihmdWxm
aWxsZWRSZXNvbHZlcihpbmRleCksIHJlamVjdGVkUmVzb2x2ZXIoaW5kZXgpKTsKKyAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgIH0sIGxhYmVsKTsKKyAgICB9OwogCi0gIEBjbGFzcyBFbnVt
ZXJhYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KLSAgQHNp
bmNlIEVtYmVyIDAuOQotKi8KLUVtYmVyLkVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUo
Ci0gIC8qKiBAc2NvcGUgRW1iZXIuRW51bWVyYWJsZS5wcm90b3R5cGUgKi8geworICAgIGZ1bmN0
aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeworICAgICAgcmV0dXJuIHsgc3RhdGU6ICdmdWxmaWxsZWQn
LCB2YWx1ZTogdmFsdWUgfTsKKyAgICB9CiAKLSAgLy8gY29tcGF0aWJpbGl0eQotICBpc0VudW1l
cmFibGU6IHRydWUsCisgICAgZnVuY3Rpb24gcmVqZWN0ZWQocmVhc29uKSB7CisgICAgICByZXR1
cm4geyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiByZWFzb24gfTsKKyAgICB9CisgIH0pOwor
ZGVmaW5lKCJyc3ZwL2NvbmZpZyIsIAorICBbIi4vZXZlbnRzIiwiZXhwb3J0cyJdLAorICBmdW5j
dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBzdHJpY3QiOwor
ICAgIHZhciBFdmVudFRhcmdldCA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogCi0gIC8q
KgotICAgIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xhc3MgZW51bWVyYWJs
ZS4KKyAgICB2YXIgY29uZmlnID0geworICAgICAgaW5zdHJ1bWVudDogZmFsc2UKKyAgICB9Owog
Ci0gICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsIHJlcGVhdGVkbHkgZHVyaW5nIGVudW1lcmF0
aW9uLiBUaGUgaW5kZXggdmFsdWUKLSAgICB3aWxsIGFsd2F5cyBiZWdpbiB3aXRoIDAgYW5kIGlu
Y3JlbWVudCBtb25vdG9uaWNhbGx5LiBZb3UgZG9uJ3QgaGF2ZSB0bwotICAgIHJlbHkgb24gdGhl
IGluZGV4IHZhbHVlIHRvIGRldGVybWluZSB3aGF0IG9iamVjdCB0byByZXR1cm4sIGJ1dCB5b3Ug
c2hvdWxkCi0gICAgYWx3YXlzIGNoZWNrIHRoZSB2YWx1ZSBhbmQgc3RhcnQgZnJvbSB0aGUgYmVn
aW5uaW5nIHdoZW4geW91IHNlZSB0aGUKLSAgICByZXF1ZXN0ZWQgaW5kZXggaXMgMC4KKyAgICBF
dmVudFRhcmdldC5taXhpbihjb25maWcpOwogCi0gICAgVGhlIGBwcmV2aW91c09iamVjdGAgaXMg
dGhlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IGNhbGwKLSAgICB0byBg
bmV4dE9iamVjdGAgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbi4gVGhpcyBpcyBhIHVzZWZ1bCB3
YXkgdG8KLSAgICBtYW5hZ2UgaXRlcmF0aW9uIGlmIHlvdSBhcmUgdHJhY2luZyBhIGxpbmtlZCBs
aXN0LCBmb3IgZXhhbXBsZS4KKyAgICBmdW5jdGlvbiBjb25maWd1cmUobmFtZSwgdmFsdWUpIHsK
KyAgICAgIGlmIChuYW1lID09PSAnb25lcnJvcicpIHsKKyAgICAgICAgLy8gaGFuZGxlIGZvciBs
ZWdhY3kgdXNlcnMgdGhhdCBleHBlY3QgdGhlIGFjdHVhbAorICAgICAgICAvLyBlcnJvciB0byBi
ZSBwYXNzZWQgdG8gdGhlaXIgZnVuY3Rpb24gYWRkZWQgdmlhCisgICAgICAgIC8vIGBSU1ZQLmNv
bmZpZ3VyZSgnb25lcnJvcicsIHNvbWVGdW5jdGlvbkhlcmUpO2AKKyAgICAgICAgY29uZmlnLm9u
KCdlcnJvcicsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogCi0gICAgRmluYWxs
eSB0aGUgY29udGV4dCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNh
biB1c2UgYXMKLSAgICBhICJzY3JhdGNocGFkIiB0byBtYWludGFpbiBhbnkgb3RoZXIgc3RhdGUg
eW91IG5lZWQgaW4gb3JkZXIgdG8gaXRlcmF0ZQotICAgIHByb3Blcmx5LiBUaGUgY29udGV4dCBv
YmplY3QgaXMgcmV1c2VkIGFuZCBpcyBub3QgcmVzZXQgYmV0d2VlbgotICAgIGl0ZXJhdGlvbnMg
c28gbWFrZSBzdXJlIHlvdSBzZXR1cCB0aGUgY29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hl
bmV2ZXIKLSAgICB0aGUgaW5kZXggcGFyYW1ldGVyIGlzIDAuCisgICAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMikgeworICAgICAgICBjb25maWdbbmFtZV0gPSB2YWx1ZTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHJldHVybiBjb25maWdbbmFtZV07CisgICAgICB9CisgICAgfQogCi0g
ICAgR2VuZXJhbGx5IGl0ZXJhdG9ycyB3aWxsIGNvbnRpbnVlIHRvIGNhbGwgYG5leHRPYmplY3Rg
IHVudGlsIHRoZSBpbmRleAotICAgIHJlYWNoZXMgdGhlIHlvdXIgY3VycmVudCBsZW5ndGgtMS4g
SWYgeW91IHJ1biBvdXQgb2YgZGF0YSBiZWZvcmUgdGhpcwotICAgIHRpbWUgZm9yIHNvbWUgcmVh
c29uLCB5b3Ugc2hvdWxkIHNpbXBseSByZXR1cm4gdW5kZWZpbmVkLgorICAgIF9fZXhwb3J0c19f
LmNvbmZpZyA9IGNvbmZpZzsKKyAgICBfX2V4cG9ydHNfXy5jb25maWd1cmUgPSBjb25maWd1cmU7
CisgIH0pOworZGVmaW5lKCJyc3ZwL2RlZmVyIiwgCisgIFsiLi9wcm9taXNlIiwiZXhwb3J0cyJd
LAorICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBz
dHJpY3QiOworICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CiAK
LSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaW1wbHkgbG9v
a3MgdXAgdGhlIGluZGV4LgotICAgIFRoaXMgd29ya3MgZ3JlYXQgb24gYW55IEFycmF5LWxpa2Ug
b2JqZWN0cy4KKyAgICAvKioKKyAgICAgIGBSU1ZQLmRlZmVyYCByZXR1cm5zIGFuIG9iamVjdCBz
aW1pbGFyIHRvIGpRdWVyeSdzIGAkLkRlZmVycmVkYC4KKyAgICAgIGBSU1ZQLmRlZmVyYCBzaG91
bGQgYmUgdXNlZCB3aGVuIHBvcnRpbmcgb3ZlciBjb2RlIHJlbGlhbnQgb24gYCQuRGVmZXJyZWRg
J3MKKyAgICAgIGludGVyZmFjZS4gTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgYFJTVlAuUHJvbWlz
ZWAgY29uc3RydWN0b3IgaW5zdGVhZC4KIAotICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBw
YXJhbSB7TnVtYmVyfSBpbmRleCB0aGUgY3VycmVudCBpbmRleCBvZiB0aGUgaXRlcmF0aW9uCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHByZXZpb3VzT2JqZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0
aGUgbGFzdCBjYWxsIHRvIAotICAgICAgYG5leHRPYmplY3RgLgotICAgIEBwYXJhbSB7T2JqZWN0
fSBjb250ZXh0IGEgY29udGV4dCBvYmplY3QgeW91IGNhbiB1c2UgdG8gbWFpbnRhaW4gc3RhdGUu
Ci0gICAgQHJldHVybiB7T2JqZWN0fSB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0ZXJhdGlvbiBv
ciB1bmRlZmluZWQKLSAgKi8KLSAgbmV4dE9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24p
LAorICAgICAgVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGBSU1ZQLmRlZmVyYCBpcyBhIHBsYWlu
IG9iamVjdCB3aXRoIHRocmVlIHByb3BlcnRpZXM6CiAKLSAgLyoqCi0gICAgSGVscGVyIG1ldGhv
ZCByZXR1cm5zIHRoZSBmaXJzdCBvYmplY3QgZnJvbSBhIGNvbGxlY3Rpb24uIFRoaXMgaXMgdXN1
YWxseQotICAgIHVzZWQgYnkgYmluZGluZ3MgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBmcmFtZXdv
cmsgdG8gZXh0cmFjdCBhIHNpbmdsZQotICAgIG9iamVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250
YWlucyBvbmx5IG9uZSBpdGVtLgorICAgICAgKiBwcm9taXNlIC0gYW4gYFJTVlAuUHJvbWlzZWAu
CisgICAgICAqIHJlamVjdCAtIGEgZnVuY3Rpb24gdGhhdCBjYXVzZXMgdGhlIGBwcm9taXNlYCBw
cm9wZXJ0eSBvbiB0aGlzIG9iamVjdCB0bworICAgICAgICBiZWNvbWUgcmVqZWN0ZWQKKyAgICAg
ICogcmVzb2x2ZSAtIGEgZnVuY3Rpb24gdGhhdCBjYXVzZXMgdGhlIGBwcm9taXNlYCBwcm9wZXJ0
eSBvbiB0aGlzIG9iamVjdCB0bworICAgICAgICBiZWNvbWUgZnVsZmlsbGVkLgogCi0gICAgSWYg
eW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBpdCBzbyB0aGF0
IGl0IHdpbGwKLSAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGVhY2ggdGltZSBpdCBp
cyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQotICAgIGNvbnRhaW5zIG9ubHkgb25lIG9iamVj
dCwgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhhdCBvYmplY3QuCi0gICAgSWYg
eW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB1bmRl
ZmluZWRgLgorICAgICAgRXhhbXBsZToKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgYXJy
ID0gWyJhIiwgImIiLCAiYyJdOwotICAgIGFyci5maXJzdE9iamVjdCgpOyAgLy8gImEiCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgIHZhciBkZWZlcnJlZCA9IFJTVlAuZGVmZXIoKTsKIAot
ICAgIHZhciBhcnIgPSBbXTsKLSAgICBhcnIuZmlyc3RPYmplY3QoKTsgIC8vIHVuZGVmaW5lZAot
ICAgIGBgYAorICAgICAgIGRlZmVycmVkLnJlc29sdmUoIlN1Y2Nlc3MhIik7CiAKLSAgICBAcHJv
cGVydHkgZmlyc3RPYmplY3QKLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBvYmplY3Qgb3IgdW5k
ZWZpbmVkCi0gICovCi0gIGZpcnN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsK
LSAgICBpZiAoZ2V0KHRoaXMsICdsZW5ndGgnKT09PTApIHJldHVybiB1bmRlZmluZWQgOworICAg
ICAgIGRlZmVyZWQucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKKyAgICAgICAgIC8vIHZh
bHVlIGhlcmUgaXMgIlN1Y2Nlc3MhIgorICAgICAgIH0pOworICAgICAgIGBgYAogCi0gICAgLy8g
aGFuZGxlIGdlbmVyaWMgZW51bWVyYWJsZXMKLSAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgpLCBy
ZXQ7Ci0gICAgcmV0ID0gdGhpcy5uZXh0T2JqZWN0KDAsIG51bGwsIGNvbnRleHQpOwotICAgIHB1
c2hDdHgoY29udGV4dCk7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0pLnByb3BlcnR5KCdbXScpLAor
ICAgICAgQG1ldGhvZCBkZWZlcgorICAgICAgQGZvciBSU1ZQCisgICAgICBAcGFyYW0ge1N0cmlu
Z30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAgICAg
IFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAgIEByZXR1cm4ge09iamVjdH0KKyAgICAgKi8KIAot
ICAvKioKLSAgICBIZWxwZXIgbWV0aG9kIHJldHVybnMgdGhlIGxhc3Qgb2JqZWN0IGZyb20gYSBj
b2xsZWN0aW9uLiBJZiB5b3VyIGVudW1lcmFibGUKLSAgICBjb250YWlucyBvbmx5IG9uZSBvYmpl
Y3QsIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoYXQgb2JqZWN0LgotICAgIElm
IHlvdXIgZW51bWVyYWJsZSBpcyBlbXB0eSwgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBgdW5k
ZWZpbmVkYC4KKyAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gZGVmZXIobGFi
ZWwpIHsKKyAgICAgIHZhciBkZWZlcnJlZCA9IHsgfTsKIAotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgYXJyID0gWyJhIiwgImIiLCAiYyJdOwotICAgIGFyci5sYXN0T2JqZWN0KCk7ICAvLyAi
YyIKKyAgICAgIGRlZmVycmVkLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZl
LCByZWplY3QpIHsKKyAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSA9IHJlc29sdmU7CisgICAgICAg
IGRlZmVycmVkLnJlamVjdCA9IHJlamVjdDsKKyAgICAgIH0sIGxhYmVsKTsKIAotICAgIHZhciBh
cnIgPSBbXTsKLSAgICBhcnIubGFzdE9iamVjdCgpOyAgLy8gdW5kZWZpbmVkCi0gICAgYGBgCisg
ICAgICByZXR1cm4gZGVmZXJyZWQ7CisgICAgfTsKKyAgfSk7CitkZWZpbmUoInJzdnAvZXZlbnRz
IiwgCisgIFsiZXhwb3J0cyJdLAorICBmdW5jdGlvbihfX2V4cG9ydHNfXykgeworICAgICJ1c2Ug
c3RyaWN0IjsKKyAgICB2YXIgaW5kZXhPZiA9IGZ1bmN0aW9uKGNhbGxiYWNrcywgY2FsbGJhY2sp
IHsKKyAgICAgIGZvciAodmFyIGk9MCwgbD1jYWxsYmFja3MubGVuZ3RoOyBpPGw7IGkrKykgewor
ICAgICAgICBpZiAoY2FsbGJhY2tzW2ldID09PSBjYWxsYmFjaykgeyByZXR1cm4gaTsgfQorICAg
ICAgfQogCi0gICAgQHByb3BlcnR5IGxhc3RPYmplY3QKLSAgICBAcmV0dXJuIHtPYmplY3R9IHRo
ZSBsYXN0IG9iamVjdCBvciB1bmRlZmluZWQKLSAgKi8KLSAgbGFzdE9iamVjdDogRW1iZXIuY29t
cHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0g
ICAgaWYgKGxlbj09PTApIHJldHVybiB1bmRlZmluZWQgOwotICAgIHZhciBjb250ZXh0ID0gcG9w
Q3R4KCksIGlkeD0wLCBjdXIsIGxhc3QgPSBudWxsOwotICAgIGRvIHsKLSAgICAgIGxhc3QgPSBj
dXI7Ci0gICAgICBjdXIgPSB0aGlzLm5leHRPYmplY3QoaWR4KyssIGxhc3QsIGNvbnRleHQpOwot
ICAgIH0gd2hpbGUgKGN1ciAhPT0gdW5kZWZpbmVkKTsKLSAgICBwdXNoQ3R4KGNvbnRleHQpOwot
ICAgIHJldHVybiBsYXN0OwotICB9KS5wcm9wZXJ0eSgnW10nKSwKKyAgICAgIHJldHVybiAtMTsK
KyAgICB9OwogCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgb2JqZWN0
IGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVjZWl2ZXIuIFRoZQotICAgIGRlZmF1bHQgdmVyc2lvbiB3
aWxsIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZW51bWVyYWJsZSB1bnRpbCB0aGUgb2JqZWN0Ci0gICAg
aXMgZm91bmQuIFlvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzIHdpdGggYSBtb3JlIGVmZmlj
aWVudCB2ZXJzaW9uLgorICAgIHZhciBjYWxsYmFja3NGb3IgPSBmdW5jdGlvbihvYmplY3QpIHsK
KyAgICAgIHZhciBjYWxsYmFja3MgPSBvYmplY3QuX3Byb21pc2VDYWxsYmFja3M7CiAKLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAgICBhcnIuY29u
dGFpbnMoImEiKTsgLy8gdHJ1ZQotICAgIGFyci5jb250YWlucygieiIpOyAvLyBmYWxzZQotICAg
IGBgYAorICAgICAgaWYgKCFjYWxsYmFja3MpIHsKKyAgICAgICAgY2FsbGJhY2tzID0gb2JqZWN0
Ll9wcm9taXNlQ2FsbGJhY2tzID0ge307CisgICAgICB9CiAKLSAgICBAbWV0aG9kIGNvbnRhaW5z
Ci0gICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IuCi0gICAg
QHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIG9iamVjdCBpcyBmb3VuZCBpbiBlbnVtZXJhYmxl
LgotICAqLwotICBjb250YWluczogZnVuY3Rpb24ob2JqKSB7Ci0gICAgcmV0dXJuIHRoaXMuZmlu
ZChmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtPT09b2JqOyB9KSAhPT0gdW5kZWZpbmVkOwot
ICB9LAorICAgICAgcmV0dXJuIGNhbGxiYWNrczsKKyAgICB9OwogCi0gIC8qKgotICAgIEl0ZXJh
dGVzIHRocm91Z2ggdGhlIGVudW1lcmFibGUsIGNhbGxpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbiBv
biBlYWNoCi0gICAgaXRlbS4gVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIGBmb3JFYWNo
KClgIG1ldGhvZCBkZWZpbmVkIGluCi0gICAgSmF2YVNjcmlwdCAxLjYuCisgICAgLyoqCisgICAg
ICBAY2xhc3MgUlNWUC5FdmVudFRhcmdldAorICAgICovCisgICAgX19leHBvcnRzX19bImRlZmF1
bHQiXSA9IHsKIAotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhh
dmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlv
bmFsKToKKyAgICAgIC8qKgorICAgICAgICBgUlNWUC5FdmVudFRhcmdldC5taXhpbmAgZXh0ZW5k
cyBhbiBvYmplY3Qgd2l0aCBFdmVudFRhcmdldCBtZXRob2RzLiBGb3IKKyAgICAgICAgRXhhbXBs
ZToKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVy
YWJsZSk7Ci0gICAgYGBgCisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgdmFyIG9iamVj
dCA9IHt9OwogCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0
aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9u
LgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisg
ICAgICAgIFJTVlAuRXZlbnRUYXJnZXQubWl4aW4ob2JqZWN0KTsKIAotICAgIE5vdGUgdGhhdCBp
biBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0
YXJnZXQKLSAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRl
eHQuIFRoaXMgaXMgYSBnb29kIHdheQotICAgIHRvIGdpdmUgeW91ciBpdGVyYXRvciBmdW5jdGlv
biBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAgICBvYmplY3Qub24oImZpbmlz
aGVkIiwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAvLyBoYW5kbGUgZXZlbnQKKyAgICAg
ICAgfSk7CiAKLSAgICBAbWV0aG9kIGZvckVhY2gKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs
YmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0
XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVy
Ci0gICovCi0gIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICBpZiAo
dHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkgOwot
ICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpLCBsYXN0ID0gbnVsbCwgY29udGV4dCA9
IHBvcEN0eCgpOworICAgICAgICBvYmplY3QudHJpZ2dlcigiZmluaXNoZWQiLCB7IGRldGFpbDog
dmFsdWUgfSk7CisgICAgICAgIGBgYAogCi0gICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB0
YXJnZXQgPSBudWxsOworICAgICAgICBgRXZlbnRUYXJnZXQubWl4aW5gIGFsc28gd29ya3Mgd2l0
aCBwcm90b3R5cGVzOgogCi0gICAgZm9yKHZhciBpZHg9MDtpZHg8bGVuO2lkeCsrKSB7Ci0gICAg
ICB2YXIgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQpIDsKLSAgICAg
IGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpOwotICAgICAgbGFzdCA9IG5l
eHQgOwotICAgIH0KLSAgICBsYXN0ID0gbnVsbCA7Ci0gICAgY29udGV4dCA9IHB1c2hDdHgoY29u
dGV4dCk7Ci0gICAgcmV0dXJuIHRoaXMgOwotICB9LAorICAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICAgIHZhciBQZXJzb24gPSBmdW5jdGlvbigpIHt9OworICAgICAgICBSU1ZQLkV2ZW50VGFy
Z2V0Lm1peGluKFBlcnNvbi5wcm90b3R5cGUpOwogCi0gIC8qKgotICAgIEFsaWFzIGZvciBgbWFw
UHJvcGVydHlgCisgICAgICAgIHZhciB5ZWh1ZGEgPSBuZXcgUGVyc29uKCk7CisgICAgICAgIHZh
ciB0b20gPSBuZXcgUGVyc29uKCk7CiAKLSAgICBAbWV0aG9kIGdldEVhY2gKLSAgICBAcGFyYW0g
e1N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgQHJldHVybiB7QXJyYXl9IFRo
ZSBtYXBwZWQgYXJyYXkuCi0gICovCi0gIGdldEVhY2g6IGZ1bmN0aW9uKGtleSkgewotICAgIHJl
dHVybiB0aGlzLm1hcFByb3BlcnR5KGtleSk7Ci0gIH0sCisgICAgICAgIHllaHVkYS5vbigicG9r
ZSIsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgY29uc29sZS5sb2coIlllaHVkYSBzYXlz
IE9XIik7CisgICAgICAgIH0pOwogCi0gIC8qKgotICAgIFNldHMgdGhlIHZhbHVlIG9uIHRoZSBu
YW1lZCBwcm9wZXJ0eSBmb3IgZWFjaCBtZW1iZXIuIFRoaXMgaXMgbW9yZQotICAgIGVmZmljaWVu
dCB0aGFuIHVzaW5nIG90aGVyIG1ldGhvZHMgZGVmaW5lZCBvbiB0aGlzIGhlbHBlci4gSWYgdGhl
IG9iamVjdAotICAgIGltcGxlbWVudHMgRW1iZXIuT2JzZXJ2YWJsZSwgdGhlIHZhbHVlIHdpbGwg
YmUgY2hhbmdlZCB0byBgc2V0KCksYCBvdGhlcndpc2UKLSAgICBpdCB3aWxsIGJlIHNldCBkaXJl
Y3RseS4gYG51bGxgIG9iamVjdHMgYXJlIHNraXBwZWQuCisgICAgICAgIHRvbS5vbigicG9rZSIs
IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgY29uc29sZS5sb2coIlRvbSBzYXlzIE9XIik7
CisgICAgICAgIH0pOwogCi0gICAgQG1ldGhvZCBzZXRFYWNoCi0gICAgQHBhcmFtIHtTdHJpbmd9
IGtleSBUaGUga2V5IHRvIHNldAotICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgb2JqZWN0
IHRvIHNldAotICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2ZXIKLSAgKi8KLSAgc2V0RWFjaDog
ZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHJldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24o
aXRlbSkgewotICAgICAgc2V0KGl0ZW0sIGtleSwgdmFsdWUpOwotICAgIH0pOwotICB9LAorICAg
ICAgICB5ZWh1ZGEudHJpZ2dlcigicG9rZSIpOworICAgICAgICB0b20udHJpZ2dlcigicG9rZSIp
OworICAgICAgICBgYGAKIAotICAvKioKLSAgICBNYXBzIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhl
IGVudW1lcmF0aW9uIHRvIGFub3RoZXIgdmFsdWUsIHJldHVybmluZwotICAgIGEgbmV3IGFycmF5
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFwKClgIGRlZmluZWQgaW4gSmF2YVNjcmlw
dCAxLjYuCisgICAgICAgIEBtZXRob2QgbWl4aW4KKyAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9i
amVjdCBvYmplY3QgdG8gZXh0ZW5kIHdpdGggRXZlbnRUYXJnZXQgbWV0aG9kcworICAgICAgICBA
cHJpdmF0ZQorICAgICAgKi8KKyAgICAgIG1peGluOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAg
ICAgb2JqZWN0Lm9uID0gdGhpcy5vbjsKKyAgICAgICAgb2JqZWN0Lm9mZiA9IHRoaXMub2ZmOwor
ICAgICAgICBvYmplY3QudHJpZ2dlciA9IHRoaXMudHJpZ2dlcjsKKyAgICAgICAgb2JqZWN0Ll9w
cm9taXNlQ2FsbGJhY2tzID0gdW5kZWZpbmVkOworICAgICAgICByZXR1cm4gb2JqZWN0OworICAg
ICAgfSwKIAotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUg
dGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFs
KToKKyAgICAgIC8qKgorICAgICAgICBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBleGVjdXRl
ZCB3aGVuIGBldmVudE5hbWVgIGlzIHRyaWdnZXJlZAogCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKKyAgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgICBvYmplY3Qub24oJ2V2ZW50JywgZnVuY3Rpb24oZXZlbnRJbmZv
KXsKKyAgICAgICAgICAvLyBoYW5kbGUgdGhlIGV2ZW50CisgICAgICAgIH0pOwogCi0gICAgLSBg
aXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGluZGV4
YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1lcmFi
bGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgIG9iamVjdC50cmln
Z2VyKCdldmVudCcpOworICAgICAgICBgYGAKIAotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIG1h
cHBlZCB2YWx1ZS4KKyAgICAgICAgQG1ldGhvZCBvbgorICAgICAgICBAcGFyYW0ge1N0cmluZ30g
ZXZlbnROYW1lIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IKKyAgICAgICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50
IGlzIHRyaWdnZXJlZC4KKyAgICAgICAgQHByaXZhdGUKKyAgICAgICovCisgICAgICBvbjogZnVu
Y3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0g
Y2FsbGJhY2tzRm9yKHRoaXMpLCBjYWxsYmFja3M7CiAKLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRp
b24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0g
ICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlz
IGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNz
IHRvIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tz
W2V2ZW50TmFtZV07CiAKLSAgICBAbWV0aG9kIG1hcAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNh
bGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJn
ZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFw
cGVkIGFycmF5LgotICAqLwotICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAg
ICB2YXIgcmV0ID0gW107Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewot
ICAgICAgcmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LGkpOwotICAgIH0p
OwotICAgIHJldHVybiByZXQgOwotICB9LAorICAgICAgICBpZiAoIWNhbGxiYWNrcykgeworICAg
ICAgICAgIGNhbGxiYWNrcyA9IGFsbENhbGxiYWNrc1tldmVudE5hbWVdID0gW107CisgICAgICAg
IH0KIAotICAvKioKLSAgICBTaW1pbGFyIHRvIG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlv
biByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKLSAgICBwcm9wZXJ0eSBvbiBhbGwgaXRl
bXMgaW4gdGhlIGVudW1lcmF0aW9uLgorICAgICAgICBpZiAoaW5kZXhPZihjYWxsYmFja3MsIGNh
bGxiYWNrKSA9PT0gLTEpIHsKKyAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7Cisg
ICAgICAgIH0KKyAgICAgIH0sCiAKLSAgICBAbWV0aG9kIG1hcFByb3BlcnR5Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEByZXR1cm4ge0FycmF5fSBU
aGUgbWFwcGVkIGFycmF5LgotICAqLwotICBtYXBQcm9wZXJ0eTogZnVuY3Rpb24oa2V5KSB7Ci0g
ICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG5leHQpIHsKLSAgICAgIHJldHVybiBnZXQobmV4
dCwga2V5KTsKLSAgICB9KTsKLSAgfSwKKyAgICAgIC8qKgorICAgICAgICBZb3UgY2FuIHVzZSBg
b2ZmYCB0byBzdG9wIGZpcmluZyBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgZm9yIGFuIGV2ZW50Ogog
Ci0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRo
ZSBlbnVtZXJhdGlvbiB0aGF0IHRoZSBwYXNzZWQKLSAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUg
Zm9yLiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgZmlsdGVyKClgIGRlZmluZWQgaW4KLSAg
ICBKYXZhU2NyaXB0IDEuNi4KKyAgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICBmdW5jdGlv
biBkb1N0dWZmKCkgeyAvLyBkbyBzdHVmZiEgfQorICAgICAgICBvYmplY3Qub24oJ3N0dWZmJywg
ZG9TdHVmZik7CiAKLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRp
b25hbCk6CisgICAgICAgIG9iamVjdC50cmlnZ2VyKCdzdHVmZicpOyAvLyBkb1N0dWZmIHdpbGwg
YmUgY2FsbGVkCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgs
IGVudW1lcmFibGUpOwotICAgIGBgYAorICAgICAgICAvLyBVbnJlZ2lzdGVyIE9OTFkgdGhlIGRv
U3R1ZmYgY2FsbGJhY2sKKyAgICAgICAgb2JqZWN0Lm9mZignc3R1ZmYnLCBkb1N0dWZmKTsKKyAg
ICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGRvU3R1ZmYgd2lsbCBOT1QgYmUgY2Fs
bGVkCisgICAgICAgIGBgYAogCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0
aGUgaXRlcmF0aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUg
aXRlcmF0aW9uLgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBp
dHNlbGYuCisgICAgICAgIElmIHlvdSBkb24ndCBwYXNzIGEgYGNhbGxiYWNrYCBhcmd1bWVudCB0
byBgb2ZmYCwgQUxMIGNhbGxiYWNrcyBmb3IgdGhlCisgICAgICAgIGV2ZW50IHdpbGwgbm90IGJl
IGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IGZpcmVzLiBGb3IgZXhhbXBsZToKIAotICAgIEl0IHNo
b3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRz
LCBgZmFsc2VgCi0gICAgb3RoZXJ3aXNlLgorICAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAg
IHZhciBjYWxsYmFjazEgPSBmdW5jdGlvbigpe307CisgICAgICAgIHZhciBjYWxsYmFjazIgPSBm
dW5jdGlvbigpe307CiAKLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywg
eW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2ls
bCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAg
ICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9i
amVjdC4KKyAgICAgICAgb2JqZWN0Lm9uKCdzdHVmZicsIGNhbGxiYWNrMSk7CisgICAgICAgIG9i
amVjdC5vbignc3R1ZmYnLCBjYWxsYmFjazIpOwogCi0gICAgQG1ldGhvZCBmaWx0ZXIKLSAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBw
YXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0
dXJuIHtBcnJheX0gQSBmaWx0ZXJlZCBhcnJheS4KLSAgKi8KLSAgZmlsdGVyOiBmdW5jdGlvbihj
YWxsYmFjaywgdGFyZ2V0KSB7Ci0gICAgdmFyIHJldCA9IFtdOwotICAgIHRoaXMuZm9yRWFjaChm
dW5jdGlvbih4LCBpZHgsIGkpIHsKLSAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwg
aWR4LCBpKSkgcmV0LnB1c2goeCk7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCisg
ICAgICAgIG9iamVjdC50cmlnZ2VyKCdzdHVmZicpOyAvLyBjYWxsYmFjazEgYW5kIGNhbGxiYWNr
MiB3aWxsIGJlIGV4ZWN1dGVkLgogCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBh
bGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB3aGVyZSB0aGUgcGFzc2VkCi0gICAg
ZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IuIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9m
IGZpbHRlcigpLgorICAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicpOworICAgICAgICBvYmplY3Qu
dHJpZ2dlcignc3R1ZmYnKTsgLy8gY2FsbGJhY2sxIGFuZCBjYWxsYmFjazIgd2lsbCBub3QgYmUg
ZXhlY3V0ZWQhCisgICAgICAgIGBgYAogCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJv
dmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFyYW1l
dGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAgICBAbWV0aG9kIG9mZgorICAgICAgICBAcGFyYW0g
e1N0cmluZ30gZXZlbnROYW1lIGV2ZW50IHRvIHN0b3AgbGlzdGVuaW5nIHRvCisgICAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3VtZW50LiBJZiBnaXZlbiwgb25s
eSB0aGUgZnVuY3Rpb24KKyAgICAgICAgZ2l2ZW4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGV2
ZW50J3MgY2FsbGJhY2sgcXVldWUuIElmIG5vIGBjYWxsYmFja2AKKyAgICAgICAgYXJndW1lbnQg
aXMgZ2l2ZW4sIGFsbCBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGV2ZW50J3Mg
Y2FsbGJhY2sKKyAgICAgICAgcXVldWUuCisgICAgICAgIEBwcml2YXRlCiAKLSAgICAgICAgICBm
dW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgICAqLworICAgICAgb2ZmOiBm
dW5jdGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CisgICAgICAgIHZhciBhbGxDYWxsYmFja3Mg
PSBjYWxsYmFja3NGb3IodGhpcyksIGNhbGxiYWNrcywgaW5kZXg7CiAKLSAgICAtICppdGVtKiBp
cyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSAqaW5kZXgqIGlzIHRo
ZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24KLSAgICAtICplbnVtZXJhYmxlKiBpcyB0
aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgICBpZiAoIWNhbGxiYWNrKSB7Cisg
ICAgICAgICAgYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKKyAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KIAotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGEgZmFsc2V5IHZhbHVlIHRv
IGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMuCisgICAgICAgIGNhbGxiYWNrcyA9IGFs
bENhbGxiYWNrc1tldmVudE5hbWVdOwogCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEg
Y2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVj
dCB0aGF0IHdpbGwgYmUgc2V0IGFzICJ0aGlzIiBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdv
b2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUg
Y3VycmVudCBvYmplY3QuCisgICAgICAgIGluZGV4ID0gaW5kZXhPZihjYWxsYmFja3MsIGNhbGxi
YWNrKTsKIAotICAgIEBtZXRob2QgcmVqZWN0Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJh
Y2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0g
VGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7QXJyYXl9IEEgcmVqZWN0ZWQg
YXJyYXkuCi0gICAqLwotICByZWplY3Q6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAg
ICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gIShjYWxsYmFj
ay5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cykpOwotICAgIH0pOwotICB9LAorICAgICAgICBpZiAo
aW5kZXggIT09IC0xKSB7IGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpOyB9CisgICAgICB9LAog
Ci0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBpdGVtcyB3aXRoIHRo
ZSBtYXRjaGVkIHByb3BlcnR5LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQg
YXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAgICB0aGlzIHdpbGwg
bWF0Y2ggYW55IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KKyAgICAgIC8qKgor
ICAgICAgICBVc2UgYHRyaWdnZXJgIHRvIGZpcmUgY3VzdG9tIGV2ZW50cy4gRm9yIGV4YW1wbGU6
CiAKLSAgICBAbWV0aG9kIGZpbHRlclByb3BlcnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0
aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFs
IHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBAcmV0dXJuIHtBcnJheX0gZmlsdGVyZWQgYXJy
YXkKLSAgKi8KLSAgZmlsdGVyUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBy
ZXR1cm4gdGhpcy5maWx0ZXIoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKLSAgfSwKKyAg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICBvYmplY3Qub24oJ2ZvbycsIGZ1bmN0aW9uKCl7
CisgICAgICAgICAgY29uc29sZS5sb2coJ2ZvbyBldmVudCBoYXBwZW5lZCEnKTsKKyAgICAgICAg
fSk7CisgICAgICAgIG9iamVjdC50cmlnZ2VyKCdmb28nKTsKKyAgICAgICAgLy8gJ2ZvbyBldmVu
dCBoYXBwZW5lZCEnIGxvZ2dlZCB0byB0aGUgY29uc29sZQorICAgICAgICBgYGAKIAotICAvKioK
LSAgICBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGl0ZW1zIHRoYXQgZG8gbm90IGhhdmUgdHJ1
dGh5IHZhbHVlcyBmb3IKLSAgICBrZXkuICBZb3UgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25k
IGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4gIE90aGVyd2lzZQotICAgIHRoaXMgd2ls
bCBtYXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gZmFsc2UuCisgICAgICAgIFlv
dSBjYW4gYWxzbyBwYXNzIGEgdmFsdWUgYXMgYSBzZWNvbmQgYXJndW1lbnQgdG8gYHRyaWdnZXJg
IHRoYXQgd2lsbCBiZQorICAgICAgICBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gYWxsIGV2ZW50
IGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50OgogCi0gICAgQG1ldGhvZCByZWplY3RQcm9wZXJ0eQot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0g
e1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJl
dHVybiB7QXJyYXl9IHJlamVjdGVkIGFycmF5Ci0gICovCi0gIHJlamVjdFByb3BlcnR5OiBmdW5j
dGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIGV4YWN0VmFsdWUgPSBmdW5jdGlvbihpdGVtKSB7
IHJldHVybiBnZXQoaXRlbSwga2V5KSA9PT0gdmFsdWU7IH0sCi0gICAgICAgIGhhc1ZhbHVlID0g
ZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gISFnZXQoaXRlbSwga2V5KTsgfSwKLSAgICAgICAgdXNl
ID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyBleGFjdFZhbHVlIDogaGFzVmFsdWUpOworICAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAgIG9iamVjdC5vbignZm9vJywgZnVuY3Rpb24odmFs
dWUpeworICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlLm5hbWUpOworICAgICAgICB9KTsKIAot
ICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOwotICB9LAorICAgICAgICBvYmplY3QudHJpZ2dl
cignZm9vJywgeyBuYW1lOiAnYmFyJyB9KTsKKyAgICAgICAgLy8gJ2JhcicgbG9nZ2VkIHRvIHRo
ZSBjb25zb2xlCisgICAgICAgIGBgYAogCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGZpcnN0IGl0
ZW0gaW4gdGhlIGFycmF5IGZvciB3aGljaCB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgotICAg
IFRoaXMgbWV0aG9kIHdvcmtzIHNpbWlsYXIgdG8gdGhlIGBmaWx0ZXIoKWAgbWV0aG9kIGRlZmlu
ZWQgaW4gSmF2YVNjcmlwdCAxLjYKLSAgICBleGNlcHQgdGhhdCBpdCB3aWxsIHN0b3Agd29ya2lu
ZyBvbiB0aGUgYXJyYXkgb25jZSBhIG1hdGNoIGlzIGZvdW5kLgorICAgICAgICBAbWV0aG9kIHRy
aWdnZXIKKyAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBuYW1lIG9mIHRoZSBldmVu
dCB0byBiZSB0cmlnZ2VyZWQKKyAgICAgICAgQHBhcmFtIHtBbnl9IG9wdGlvbnMgb3B0aW9uYWwg
dmFsdWUgdG8gYmUgcGFzc2VkIHRvIGFueSBldmVudCBoYW5kbGVycyBmb3IKKyAgICAgICAgdGhl
IGdpdmVuIGBldmVudE5hbWVgCisgICAgICAgIEBwcml2YXRlCisgICAgICAqLworICAgICAgdHJp
Z2dlcjogZnVuY3Rpb24oZXZlbnROYW1lLCBvcHRpb25zKSB7CisgICAgICAgIHZhciBhbGxDYWxs
YmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAgICBjYWxsYmFja3MsIGNhbGxi
YWNrVHVwbGUsIGNhbGxiYWNrLCBiaW5kaW5nOwogCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5
b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAg
cGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAgICBpZiAoY2FsbGJhY2tzID0gYWxsQ2Fs
bGJhY2tzW2V2ZW50TmFtZV0pIHsKKyAgICAgICAgICAvLyBEb24ndCBjYWNoZSB0aGUgY2FsbGJh
Y2tzLmxlbmd0aCBzaW5jZSBpdCBtYXkgZ3JvdworICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxj
YWxsYmFja3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tz
W2ldOwogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVt
ZXJhYmxlKTsKLSAgICBgYGAKKyAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIH0pOworZGVmaW5lKCJyc3ZwL2Zp
bHRlciIsIAorICBbIi4vYWxsIiwiLi9tYXAiLCIuL3V0aWxzIiwiZXhwb3J0cyJdLAorICBmdW5j
dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBf
X2V4cG9ydHNfXykgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgYWxsID0gX19kZXBlbmRl
bmN5MV9fWyJkZWZhdWx0Il07CisgICAgdmFyIG1hcCA9IF9fZGVwZW5kZW5jeTJfX1siZGVmYXVs
dCJdOworICAgIHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5M19fLmlzRnVuY3Rpb247Cisg
ICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kzX18uaXNBcnJheTsKIAotICAgIC0gYGl0ZW1g
IGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMg
dGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBp
cyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgIC8qKgorICAgICBgUlNWUC5maWx0
ZXJgIGlzIHNpbWlsYXIgdG8gSmF2YVNjcmlwdCdzIG5hdGl2ZSBgZmlsdGVyYCBtZXRob2QsIGV4
Y2VwdCB0aGF0IGl0CisgICAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29tZSBmdWxm
aWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBmaWx0ZXJGbmAgb24KKyAgICAgIGVhY2ggaXRlbSBp
biBnaXZlbiB0byBgcHJvbWlzZXNgLiBgUlNWUC5maWx0ZXJgIHJldHVybnMgYSBwcm9taXNlIHRo
YXQgd2lsbAorICAgICAgYmVjb21lIGZ1bGZpbGxlZCB3aXRoIHRoZSByZXN1bHQgb2YgcnVubmlu
ZyBgZmlsdGVyRm5gIG9uIHRoZSB2YWx1ZXMgdGhlCisgICAgICBwcm9taXNlcyBiZWNvbWUgZnVs
ZmlsbGVkIHdpdGguCiAKLSAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBgdHJ1ZWAgdG8gaW5jbHVk
ZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0cywgYGZhbHNlYAotICAgIG90aGVyd2lzZS4KKyAgICAg
IEZvciBleGFtcGxlOgogCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ss
IHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdp
bGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5Ci0g
ICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBv
YmplY3QuCisgICAgICBgYGBqYXZhc2NyaXB0CiAKLSAgICBAbWV0aG9kIGZpbmQKLSAgICBAcGFy
YW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJh
bSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJu
IHtPYmplY3R9IEZvdW5kIGl0ZW0gb3IgYHVuZGVmaW5lZGAuCi0gICovCi0gIGZpbmQ6IGZ1bmN0
aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgn
KSA7Ci0gICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB0YXJnZXQgPSBudWxsOworICAgICAg
dmFyIHByb21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOworICAgICAgdmFyIHByb21pc2UyID0gUlNW
UC5yZXNvbHZlKDIpOworICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMpOwogCi0g
ICAgdmFyIGxhc3QgPSBudWxsLCBuZXh0LCBmb3VuZCA9IGZhbHNlLCByZXQgOwotICAgIHZhciBj
b250ZXh0ID0gcG9wQ3R4KCk7Ci0gICAgZm9yKHZhciBpZHg9MDtpZHg8bGVuICYmICFmb3VuZDtp
ZHgrKykgewotICAgICAgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQp
IDsKLSAgICAgIGlmIChmb3VuZCA9IGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRo
aXMpKSByZXQgPSBuZXh0IDsKLSAgICAgIGxhc3QgPSBuZXh0IDsKLSAgICB9Ci0gICAgbmV4dCA9
IGxhc3QgPSBudWxsIDsKLSAgICBjb250ZXh0ID0gcHVzaEN0eChjb250ZXh0KTsKLSAgICByZXR1
cm4gcmV0IDsKLSAgfSwKKyAgICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0peworICAg
ICAgICByZXR1cm4gaXRlbSA+IDE7CisgICAgICB9OwogCi0gIC8qKgotICAgIFJldHVybnMgdGhl
IGZpcnN0IGl0ZW0gd2l0aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBwYXNzZWQgdmFsdWUuIFlv
dQotICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aXRoIHRoZSB0YXJn
ZXQgdmFsdWUuIE90aGVyd2lzZQotICAgIHRoaXMgd2lsbCBtYXRjaCBhbnkgcHJvcGVydHkgdGhh
dCBldmFsdWF0ZXMgdG8gYHRydWVgLgorICAgICAgUlNWUC5maWx0ZXIocHJvbWlzZXMsIGZpbHRl
ckZuKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CisgICAgICAgIC8vIHJlc3VsdCBpcyBbIDIsIDMg
XQorICAgICAgfSk7CisgICAgICBgYGAKIAotICAgIFRoaXMgbWV0aG9kIHdvcmtzIG11Y2ggbGlr
ZSB0aGUgbW9yZSBnZW5lcmljIGBmaW5kKClgIG1ldGhvZC4KKyAgICAgIElmIGFueSBvZiB0aGUg
YHByb21pc2VzYCBnaXZlbiB0byBgUlNWUC5maWx0ZXJgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0
IHByb21pc2UKKyAgICAgIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1
bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZSdzCisgICAgICByZWplY3Rpb24gaGFuZGxlci4g
Rm9yIGV4YW1wbGU6CiAKLSAgICBAbWV0aG9kIGZpbmRQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVl
XSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7T2JqZWN0fSBm
b3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgCi0gICovCi0gIGZpbmRQcm9wZXJ0eTogZnVuY3Rpb24o
a2V5LCB2YWx1ZSkgewotICAgIHJldHVybiB0aGlzLmZpbmQoaXRlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpKTsKLSAgfSwKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBwcm9taXNlMSA9
IFJTVlAucmVzb2x2ZSgxKTsKKyAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVqZWN0KG5ldyBF
cnJvcigiMiIpKTsKKyAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigi
MyIpKTsKKyAgICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNl
MyBdOwogCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24g
cmV0dXJucyB0cnVlIGZvciBldmVyeSBpdGVtIGluIHRoZQotICAgIGVudW1lcmF0aW9uLiBUaGlz
IGNvcnJlc3BvbmRzIHdpdGggdGhlIGBldmVyeSgpYCBtZXRob2QgaW4gSmF2YVNjcmlwdCAxLjYu
CisgICAgICB2YXIgZmlsdGVyRm4gPSBmdW5jdGlvbihpdGVtKXsKKyAgICAgICAgcmV0dXJuIGl0
ZW0gPiAxOworICAgICAgfTsKIAotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUg
c2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMg
YXJlIG9wdGlvbmFsKToKKyAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbikudGhl
bihmdW5jdGlvbihhcnJheSl7CisgICAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1
c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQorICAgICAgfSwgZnVuY3Rpb24ocmVhc29u
KSB7CisgICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAiMiIKKyAgICAgIH0pOworICAgICAg
YGBgCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1l
cmFibGUpOwotICAgIGBgYAorICAgICAgYFJTVlAuZmlsdGVyYCB3aWxsIGFsc28gd2FpdCBmb3Ig
YW55IHByb21pc2VzIHJldHVybmVkIGZyb20gYGZpbHRlckZuYC4KKyAgICAgIEZvciBpbnN0YW5j
ZSwgeW91IG1heSB3YW50IHRvIGZldGNoIGEgbGlzdCBvZiB1c2VycyB0aGVuIHJldHVybiBhIHN1
YnNldAorICAgICAgb2YgdGhvc2UgdXNlcnMgYmFzZWQgb24gc29tZSBhc3luY2hyb25vdXMgb3Bl
cmF0aW9uOgogCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0
aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9u
LgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisg
ICAgICBgYGBqYXZhc2NyaXB0CiAKLSAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBgdHJ1ZWAgb3Ig
YGZhbHNlYC4KKyAgICAgIHZhciBhbGljZSA9IHsgbmFtZTogJ2FsaWNlJyB9OworICAgICAgdmFy
IGJvYiAgID0geyBuYW1lOiAnYm9iJyB9OworICAgICAgdmFyIHVzZXJzID0gWyBhbGljZSwgYm9i
IF07CiAKLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZl
IHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KKyAg
ICAgIHZhciBwcm9taXNlcyA9IHVzZXJzLm1hcChmdW5jdGlvbih1c2VyKXsKKyAgICAgICAgcmV0
dXJuIFJTVlAucmVzb2x2ZSh1c2VyKTsKKyAgICAgIH0pOwogCi0gICAgRXhhbXBsZSBVc2FnZToK
KyAgICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKHVzZXIpeworICAgICAgICAvLyBIZXJlLCBB
bGljZSBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGEgYmxvZyBwb3N0LCBidXQgQm9iIGRvZXMg
bm90LgorICAgICAgICByZXR1cm4gZ2V0UHJpdmlsZWdlc0ZvclVzZXIodXNlcikudGhlbihmdW5j
dGlvbihwcml2cyl7CisgICAgICAgICAgcmV0dXJuIHByaXZzLmNhbl9jcmVhdGVfYmxvZ19wb3N0
ID09PSB0cnVlOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgICBSU1ZQLmZpbHRlcihwcm9t
aXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24odXNlcnMpeworICAgICAgICAvLyB0cnVlLCBi
ZWNhdXNlIHRoZSBzZXJ2ZXIgdG9sZCB1cyBvbmx5IEFsaWNlIGNhbiBjcmVhdGUgYSBibG9nIHBv
c3QuCisgICAgICAgIHVzZXJzLmxlbmd0aCA9PT0gMTsKKyAgICAgICAgLy8gZmFsc2UsIGJlY2F1
c2UgQWxpY2UgaXMgdGhlIG9ubHkgdXNlciBwcmVzZW50IGluIGB1c2Vyc2AKKyAgICAgICAgdXNl
cnNbMF0gPT09IGJvYjsKKyAgICAgIH0pOworICAgICAgYGBgCiAKLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgaWYgKHBlb3BsZS5ldmVyeShpc0VuZ2luZWVyKSkgeyBQYXljaGVja3MuYWRkQmlnQm9u
dXMoKTsgfQotICAgIGBgYAorICAgICAgQG1ldGhvZCBmaWx0ZXIKKyAgICAgIEBmb3IgUlNWUAor
ICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZp
bHRlckZuIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggcmVzb2x2ZWQgdmFsdWUgdG8K
KyAgICAgIGZpbHRlciB0aGUgZmluYWwgcmVzdWx0cy4KKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBs
YWJlbCBvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4gVXNlZnVsIGZvcgor
ICAgICAgdG9vbGluZy4KKyAgICAgIEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8KKyAgICBmdW5j
dGlvbiBmaWx0ZXIocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkgeworICAgICAgcmV0dXJuIGFs
bChwcm9taXNlcywgbGFiZWwpLnRoZW4oZnVuY3Rpb24odmFsdWVzKXsKKyAgICAgICAgaWYgKCFp
c0FycmF5KHByb21pc2VzKSkgeworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBt
dXN0IHBhc3MgYW4gYXJyYXkgdG8gZmlsdGVyLicpOworICAgICAgICB9CiAKLSAgICBAbWV0aG9k
IGV2ZXJ5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4
ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8g
dXNlCi0gICAgQHJldHVybiB7Qm9vbGVhbn0KLSAgKi8KLSAgZXZlcnk6IGZ1bmN0aW9uKGNhbGxi
YWNrLCB0YXJnZXQpIHsKLSAgICByZXR1cm4gIXRoaXMuZmluZChmdW5jdGlvbih4LCBpZHgsIGkp
IHsKLSAgICAgIHJldHVybiAhY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7Ci0gICAg
fSk7Ci0gIH0sCisgICAgICAgIGlmICghaXNGdW5jdGlvbihmaWx0ZXJGbikpeworICAgICAgICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiB0byBmaWx0ZXIn
cyBzZWNvbmQgYXJndW1lbnQuIik7CisgICAgICAgIH0KIAotICAvKioKLSAgICBSZXR1cm5zIGB0
cnVlYCBpZiB0aGUgcGFzc2VkIHByb3BlcnR5IHJlc29sdmVzIHRvIGB0cnVlYCBmb3IgYWxsIGl0
ZW1zIGluCi0gICAgdGhlIGVudW1lcmFibGUuIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHNpbXBsZXIv
ZmFzdGVyIHRoYW4gdXNpbmcgYSBjYWxsYmFjay4KKyAgICAgICAgcmV0dXJuIG1hcChwcm9taXNl
cywgZmlsdGVyRm4sIGxhYmVsKS50aGVuKGZ1bmN0aW9uKGZpbHRlclJlc3VsdHMpeworICAgICAg
ICAgICB2YXIgaSwKKyAgICAgICAgICAgICAgIHZhbHVlc0xlbiA9IHZhbHVlcy5sZW5ndGgsCisg
ICAgICAgICAgICAgICBmaWx0ZXJlZCA9IFtdOwogCi0gICAgQG1ldGhvZCBldmVyeVByb3BlcnR5
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJh
bSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBA
cmV0dXJuIHtCb29sZWFufQotICAqLwotICBldmVyeVByb3BlcnR5OiBmdW5jdGlvbihrZXksIHZh
bHVlKSB7Ci0gICAgcmV0dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp
KTsKLSAgfSwKKyAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlc0xlbjsgaSsrKXsKKyAg
ICAgICAgICAgICBpZihmaWx0ZXJSZXN1bHRzW2ldKSBmaWx0ZXJlZC5wdXNoKHZhbHVlc1tpXSk7
CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgICAgICB9KTsK
KyAgICAgIH0pOworICAgIH0KIAorICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmaWx0ZXI7
CisgIH0pOworZGVmaW5lKCJyc3ZwL2hhc2giLCAKKyAgWyIuL3Byb21pc2UiLCIuL3V0aWxzIiwi
ZXhwb3J0cyJdLAorICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywg
X19leHBvcnRzX18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIFByb21pc2UgPSBfX2Rl
cGVuZGVuY3kxX19bImRlZmF1bHQiXTsKKyAgICB2YXIgaXNOb25UaGVuYWJsZSA9IF9fZGVwZW5k
ZW5jeTJfXy5pc05vblRoZW5hYmxlOworICAgIHZhciBrZXlzT2YgPSBfX2RlcGVuZGVuY3kyX18u
a2V5c09mOwogCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rp
b24gcmV0dXJucyB0cnVlIGZvciBhbnkgaXRlbSBpbiB0aGUKLSAgICBlbnVtZXJhdGlvbi4gVGhp
cyBjb3JyZXNwb25kcyB3aXRoIHRoZSBgc29tZSgpYCBtZXRob2QgaW4gSmF2YVNjcmlwdCAxLjYu
CisgICAgLyoqCisgICAgICBgUlNWUC5oYXNoYCBpcyBzaW1pbGFyIHRvIGBSU1ZQLmFsbGAsIGJ1
dCB0YWtlcyBhbiBvYmplY3QgaW5zdGVhZCBvZiBhbiBhcnJheQorICAgICAgZm9yIGl0cyBgcHJv
bWlzZXNgIGFyZ3VtZW50LgorCisgICAgICBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZp
bGxlZCB3aGVuIGFsbCB0aGUgZ2l2ZW4gcHJvbWlzZXMgaGF2ZSBiZWVuCisgICAgICBmdWxmaWxs
ZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC4gVGhlIHJldHVy
bmVkIHByb21pc2UKKyAgICAgIGlzIGZ1bGZpbGxlZCB3aXRoIGEgaGFzaCB0aGF0IGhhcyB0aGUg
c2FtZSBrZXkgbmFtZXMgYXMgdGhlIGBwcm9taXNlc2Agb2JqZWN0CisgICAgICBhcmd1bWVudC4g
SWYgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG9iamVjdCBhcmUgbm90IHByb21pc2VzLCB0aGV5
IHdpbGwKKyAgICAgIHNpbXBseSBiZSBjb3BpZWQgb3ZlciB0byB0aGUgZnVsZmlsbGVkIG9iamVj
dC4KKworICAgICAgRXhhbXBsZToKKworICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHBy
b21pc2VzID0geworICAgICAgICBteVByb21pc2U6IFJTVlAucmVzb2x2ZSgxKSwKKyAgICAgICAg
eW91clByb21pc2U6IFJTVlAucmVzb2x2ZSgyKSwKKyAgICAgICAgdGhlaXJQcm9taXNlOiBSU1ZQ
LnJlc29sdmUoMyksCisgICAgICAgIG5vdEFQcm9taXNlOiA0CisgICAgICB9OwogCi0gICAgVGhl
IGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAgUlNWUC5o
YXNoKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGhhc2gpeworICAgICAgICAvLyBoYXNoIGhlcmUg
aXMgYW4gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToKKyAgICAgICAgLy8geworICAgICAgICAvLyAg
IG15UHJvbWlzZTogMSwKKyAgICAgICAgLy8gICB5b3VyUHJvbWlzZTogMiwKKyAgICAgICAgLy8g
ICB0aGVpclByb21pc2U6IDMsCisgICAgICAgIC8vICAgbm90QVByb21pc2U6IDQKKyAgICAgICAg
Ly8gfQorICAgICAgfSk7CisgICAgICBgYGBgCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVu
Y3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAorICAgICAgSWYgYW55IG9m
IHRoZSBgcHJvbWlzZXNgIGdpdmVuIHRvIGBSU1ZQLmhhc2hgIGFyZSByZWplY3RlZCwgdGhlIGZp
cnN0IHByb21pc2UKKyAgICAgIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyB0aGUg
cmVhc29uIHRvIHRoZSByZWplY3Rpb24gaGFuZGxlci4KIAotICAgIC0gYGl0ZW1gIGlzIHRoZSBj
dXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJl
bnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51
bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgRXhhbXBsZToKIAotICAgIEl0IHNob3VsZCBy
ZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFs
c2VgCi0gICAgb3RoZXJ3aXNlLgorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHByb21p
c2VzID0geworICAgICAgICBteVByb21pc2U6IFJTVlAucmVzb2x2ZSgxKSwKKyAgICAgICAgcmVq
ZWN0ZWRQcm9taXNlOiBSU1ZQLnJlamVjdChuZXcgRXJyb3IoInJlamVjdGVkUHJvbWlzZSIpKSwK
KyAgICAgICAgYW5vdGhlclJlamVjdGVkUHJvbWlzZTogUlNWUC5yZWplY3QobmV3IEVycm9yKCJh
bm90aGVyUmVqZWN0ZWRQcm9taXNlIikpLAorICAgICAgfTsKIAotICAgIE5vdGUgdGhhdCBpbiBh
ZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJn
ZXQKLSAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQu
IFRoaXMgaXMgYSBnb29kIHdheQotICAgIHRvIGdpdmUgeW91ciBpdGVyYXRvciBmdW5jdGlvbiBh
Y2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAgUlNWUC5oYXNoKHByb21pc2VzKS50
aGVuKGZ1bmN0aW9uKGhhc2gpeworICAgICAgICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVucyBiZWNh
dXNlIHRoZXJlIGFyZSByZWplY3RlZCBwcm9taXNlcyEKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNv
bikgeworICAgICAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gInJlamVjdGVkUHJvbWlzZSIKKyAg
ICAgIH0pOworICAgICAgYGBgCiAKLSAgICBVc2FnZSBFeGFtcGxlOgorICAgICAgQW4gaW1wb3J0
YW50IG5vdGU6IGBSU1ZQLmhhc2hgIGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9i
amVjdHMgdGhhdAorICAgICAgYXJlIGp1c3QgYSBzZXQgb2Yga2V5cyBhbmQgdmFsdWVzLiBgUlNW
UC5oYXNoYCB3aWxsIE5PVCBwcmVzZXJ2ZSBwcm90b3R5cGUKKyAgICAgIGNoYWlucy4KIAotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBpZiAocGVvcGxlLnNvbWUoaXNNYW5hZ2VyKSkgeyBQYXljaGVj
a3MuYWRkQmlnZ2VyQm9udXMoKTsgfQotICAgIGBgYAorICAgICAgRXhhbXBsZToKIAotICAgIEBt
ZXRob2Qgc29tZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0
byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQotICAgIEByZXR1cm4ge0FycmF5fSBBIGZpbHRlcmVkIGFycmF5LgotICAqLwotICBz
b21lOiBmdW5jdGlvbihjYWxsYmFjaywgdGFyZ2V0KSB7Ci0gICAgcmV0dXJuICEhdGhpcy5maW5k
KGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0dXJuICEhY2FsbGJhY2suY2FsbCh0YXJn
ZXQsIHgsIGlkeCwgaSk7Ci0gICAgfSk7Ci0gIH0sCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICBmdW5jdGlvbiBNeUNvbnN0cnVjdG9yKCl7CisgICAgICAgIHRoaXMuZXhhbXBsZSA9IFJTVlAu
cmVzb2x2ZSgiRXhhbXBsZSIpOworICAgICAgfQogCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVg
IGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gYHRydWVgIGZvciBhbnkgaXRlbSBp
bgotICAgIHRoZSBlbnVtZXJhYmxlLiBUaGlzIG1ldGhvZCBpcyBvZnRlbiBzaW1wbGVyL2Zhc3Rl
ciB0aGFuIHVzaW5nIGEgY2FsbGJhY2suCisgICAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9
IHsKKyAgICAgICAgcHJvdG9Qcm9wZXJ0eTogUlNWUC5yZXNvbHZlKCJQcm90byBQcm9wZXJ0eSIp
CisgICAgICB9OwogCi0gICAgQG1ldGhvZCBzb21lUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmlu
Z30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0g
b3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0
cnVlYAotICAqLwotICBzb21lUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBy
ZXR1cm4gdGhpcy5zb21lKGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7Ci0gIH0sCisgICAg
ICB2YXIgbXlPYmplY3QgPSBuZXcgTXlDb25zdHJ1Y3RvcigpOworCisgICAgICBSU1ZQLmhhc2go
bXlPYmplY3QpLnRoZW4oZnVuY3Rpb24oaGFzaCl7CisgICAgICAgIC8vIHByb3RvUHJvcGVydHkg
d2lsbCBub3QgYmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUgYW4KKyAgICAg
ICAgLy8gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToKKyAgICAgICAgLy8geworICAgICAgICAvLyAg
IGV4YW1wbGU6ICJFeGFtcGxlIgorICAgICAgICAvLyB9CisgICAgICAgIC8vCisgICAgICAgIC8v
IGhhc2guaGFzT3duUHJvcGVydHkoJ3Byb3RvUHJvcGVydHknKTsgLy8gZmFsc2UKKyAgICAgICAg
Ly8gJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBoYXNoLnByb3RvUHJvcGVydHkKKyAgICAgIH0pOwor
ICAgICAgYGBgCiAKLSAgLyoqCi0gICAgVGhpcyB3aWxsIGNvbWJpbmUgdGhlIHZhbHVlcyBvZiB0
aGUgZW51bWVyYXRvciBpbnRvIGEgc2luZ2xlIHZhbHVlLiBJdAotICAgIGlzIGEgdXNlZnVsIHdh
eSB0byBjb2xsZWN0IGEgc3VtbWFyeSB2YWx1ZSBmcm9tIGFuIGVudW1lcmF0aW9uLiBUaGlzCi0g
ICAgY29ycmVzcG9uZHMgdG8gdGhlIGByZWR1Y2UoKWAgbWV0aG9kIGRlZmluZWQgaW4gSmF2YVNj
cmlwdCAxLjguCisgICAgICBAbWV0aG9kIGhhc2gKKyAgICAgIEBmb3IgUlNWUAorICAgICAgQHBh
cmFtIHtPYmplY3R9IHByb21pc2VzCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9u
YWwgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9taXNlLgorICAgICAgVXNlZnVsIGZvciB0
b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxl
ZCB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKKyAgICAgIGhhdmUgYmVlbiBmdWxm
aWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC4KKyAgICAg
IEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBo
YXNoKG9iamVjdCwgbGFiZWwpIHsKKyAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpeworICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OworICAgICAgICB2YXIg
a2V5cyA9IGtleXNPZihvYmplY3QpOworICAgICAgICB2YXIgcmVtYWluaW5nID0ga2V5cy5sZW5n
dGg7CisgICAgICAgIHZhciBlbnRyeSwgcHJvcGVydHk7CisKKyAgICAgICAgaWYgKHJlbWFpbmlu
ZyA9PT0gMCkgeworICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7CisgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CiAKLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3Vs
ZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBv
cHRpb25hbCk6CisgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkVG8ocHJvcGVydHkpIHsKKyAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICAgIHJlc3VsdHNbcHJvcGVy
dHldID0gdmFsdWU7CisgICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIHsKKyAgICAg
ICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9Owor
ICAgICAgICB9CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24ocHJldmlvdXNWYWx1
ZSwgaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAorICAgICAgICBmdW5jdGlvbiBv
blJlamVjdGlvbihyZWFzb24pIHsKKyAgICAgICAgICByZW1haW5pbmcgPSAwOworICAgICAgICAg
IHJlamVjdChyZWFzb24pOworICAgICAgICB9CiAKLSAgICAtIGBwcmV2aW91c1ZhbHVlYCBpcyB0
aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0byB0aGUgaXRlcmF0b3IuCi0gICAg
LSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGlu
ZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1l
cmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHByb3BlcnR5ID0ga2V5
c1tpXTsKKyAgICAgICAgICBlbnRyeSA9IG9iamVjdFtwcm9wZXJ0eV07CiAKLSAgICBSZXR1cm4g
dGhlIG5ldyBjdW11bGF0aXZlIHZhbHVlLgorICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVu
dHJ5KSkgeworICAgICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSBlbnRyeTsKKyAgICAgICAg
ICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgeworICAgICAgICAgICAgICByZXNvbHZlKHJlc3Vs
dHMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcm9t
aXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkVG8ocHJvcGVydHkpLCBvblJlamVjdGlvbik7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9OworICB9KTsKK2RlZmlu
ZSgicnN2cC9pbnN0cnVtZW50IiwgCisgIFsiLi9jb25maWciLCIuL3V0aWxzIiwiZXhwb3J0cyJd
LAorICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19leHBvcnRz
X18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGNvbmZpZyA9IF9fZGVwZW5kZW5jeTFf
Xy5jb25maWc7CisgICAgdmFyIG5vdyA9IF9fZGVwZW5kZW5jeTJfXy5ub3c7CiAKLSAgICBJbiBh
ZGRpdGlvbiB0byB0aGUgY2FsbGJhY2sgeW91IGNhbiBhbHNvIHBhc3MgYW4gYGluaXRpYWxWYWx1
ZWAuIEFuIGVycm9yCi0gICAgd2lsbCBiZSByYWlzZWQgaWYgeW91IGRvIG5vdCBwYXNzIGFuIGlu
aXRpYWwgdmFsdWUgYW5kIHRoZSBlbnVtZXJhdG9yIGlzCi0gICAgZW1wdHkuCisgICAgX19leHBv
cnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGluc3RydW1lbnQoZXZlbnROYW1lLCBwcm9taXNl
LCBjaGlsZCkgeworICAgICAgLy8gaW5zdHJ1bWVudGF0aW9uIHNob3VsZCBub3QgZGlzcnVwdCBu
b3JtYWwgdXNhZ2UuCisgICAgICB0cnkgeworICAgICAgICBjb25maWcudHJpZ2dlcihldmVudE5h
bWUsIHsKKyAgICAgICAgICBndWlkOiBwcm9taXNlLl9ndWlkS2V5ICsgcHJvbWlzZS5faWQsCisg
ICAgICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUsCisgICAgICAgICAgZGV0YWlsOiBwcm9taXNl
Ll9kZXRhaWwsCisgICAgICAgICAgY2hpbGRHdWlkOiBjaGlsZCAmJiBwcm9taXNlLl9ndWlkS2V5
ICsgY2hpbGQuX2lkLAorICAgICAgICAgIGxhYmVsOiBwcm9taXNlLl9sYWJlbCwKKyAgICAgICAg
ICB0aW1lU3RhbXA6IG5vdygpLAorICAgICAgICAgIHN0YWNrOiBuZXcgRXJyb3IocHJvbWlzZS5f
bGFiZWwpLnN0YWNrCisgICAgICAgIH0pOworICAgICAgfSBjYXRjaChlcnJvcikgeworICAgICAg
ICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAg
IH0sIDApOworICAgICAgfQorICAgIH07CisgIH0pOworZGVmaW5lKCJyc3ZwL21hcCIsIAorICBb
Ii4vcHJvbWlzZSIsIi4vYWxsIiwiLi91dGlscyIsImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19k
ZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19leHBvcnRz
X18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kx
X19bImRlZmF1bHQiXTsKKyAgICB2YXIgYWxsID0gX19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07
CisgICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kzX18uaXNBcnJheTsKKyAgICB2YXIgaXNG
dW5jdGlvbiA9IF9fZGVwZW5kZW5jeTNfXy5pc0Z1bmN0aW9uOwogCi0gICAgTm90ZSB0aGF0IHVu
bGlrZSB0aGUgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgYWxsb3cgeW91IHRv
Ci0gICAgcGFzcyBhIHRhcmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9yIHRoZSBjYWxsYmFj
ay4gSXQncyBwYXJ0IG9mIHRoZQotICAgIHNwZWMuIFNvcnJ5LgorICAgIC8qKgorICAgICBgUlNW
UC5tYXBgIGlzIHNpbWlsYXIgdG8gSmF2YVNjcmlwdCdzIG5hdGl2ZSBgbWFwYCBtZXRob2QsIGV4
Y2VwdCB0aGF0IGl0CisgICAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29tZSBmdWxm
aWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBtYXBGbmAgb24KKyAgICAgIGVhY2ggaXRlbSBpbiBn
aXZlbiB0byBgcHJvbWlzZXNgLiBgUlNWUC5tYXBgIHJldHVybnMgYSBwcm9taXNlIHRoYXQgd2ls
bAorICAgICAgYmVjb21lIGZ1bGZpbGxlZCB3aXRoIHRoZSByZXN1bHQgb2YgcnVubmluZyBgbWFw
Rm5gIG9uIHRoZSB2YWx1ZXMgdGhlIHByb21pc2VzCisgICAgICBiZWNvbWUgZnVsZmlsbGVkIHdp
dGguCiAKLSAgICBAbWV0aG9kIHJlZHVjZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr
IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGluaXRpYWxWYWx1
ZSBJbml0aWFsIHZhbHVlIGZvciB0aGUgcmVkdWNlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHJlZHVj
ZXJQcm9wZXJ0eSBpbnRlcm5hbCB1c2Ugb25seS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBy
ZWR1Y2VkIHZhbHVlLgotICAqLwotICByZWR1Y2U6IGZ1bmN0aW9uKGNhbGxiYWNrLCBpbml0aWFs
VmFsdWUsIHJlZHVjZXJQcm9wZXJ0eSkgewotICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJm
dW5jdGlvbiIpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyB9CisgICAgICBGb3IgZXhhbXBsZToK
IAotICAgIHZhciByZXQgPSBpbml0aWFsVmFsdWU7CisgICAgICBgYGBqYXZhc2NyaXB0CiAKLSAg
ICB0aGlzLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaSkgewotICAgICAgcmV0ID0gY2FsbGJhY2su
Y2FsbChudWxsLCByZXQsIGl0ZW0sIGksIHRoaXMsIHJlZHVjZXJQcm9wZXJ0eSk7Ci0gICAgfSwg
dGhpcyk7CisgICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7CisgICAgICB2YXIg
cHJvbWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7CisgICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJl
c29sdmUoMyk7CisgICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJv
bWlzZTMgXTsKIAotICAgIHJldHVybiByZXQ7Ci0gIH0sCisgICAgICB2YXIgbWFwRm4gPSBmdW5j
dGlvbihpdGVtKXsKKyAgICAgICAgcmV0dXJuIGl0ZW0gKyAxOworICAgICAgfTsKIAotICAvKioK
LSAgICBJbnZva2VzIHRoZSBuYW1lZCBtZXRob2Qgb24gZXZlcnkgb2JqZWN0IGluIHRoZSByZWNl
aXZlciB0aGF0Ci0gICAgaW1wbGVtZW50cyBpdC4gVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8g
dGhlIGltcGxlbWVudGF0aW9uIGluCi0gICAgUHJvdG90eXBlIDEuNi4KKyAgICAgIFJTVlAubWFw
KHByb21pc2VzLCBtYXBGbikudGhlbihmdW5jdGlvbihyZXN1bHQpeworICAgICAgICAvLyByZXN1
bHQgaXMgWyAyLCAzLCA0IF0KKyAgICAgIH0pOworICAgICAgYGBgCiAKLSAgICBAbWV0aG9kIGlu
dm9rZQotICAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRo
b2QKLSAgICBAcGFyYW0ge09iamVjdC4uLn0gYXJncyBvcHRpb25hbCBhcmd1bWVudHMgdG8gcGFz
cyBhcyB3ZWxsLgotICAgIEByZXR1cm4ge0FycmF5fSByZXR1cm4gdmFsdWVzIGZyb20gY2FsbGlu
ZyBpbnZva2UuCi0gICovCi0gIGludm9rZTogZnVuY3Rpb24obWV0aG9kTmFtZSkgewotICAgIHZh
ciBhcmdzLCByZXQgPSBbXTsKLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD4xKSBhcmdzID0gYV9z
bGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2Ag
Z2l2ZW4gdG8gYFJTVlAubWFwYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCisgICAg
ICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJl
dHVybmVkIHByb21pc2UncworICAgICAgcmVqZWN0aW9uIGhhbmRsZXIuIEZvciBleGFtcGxlOgog
Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCkgewotICAgICAgdmFyIG1ldGhvZCA9
IHggJiYgeFttZXRob2ROYW1lXTsKLSAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgbWV0
aG9kKSB7Ci0gICAgICAgIHJldFtpZHhdID0gYXJncyA/IG1ldGhvZC5hcHBseSh4LCBhcmdzKSA6
IG1ldGhvZC5jYWxsKHgpOwotICAgICAgfQotICAgIH0sIHRoaXMpOworICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgdmFyIHByb21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOworICAgICAgdmFyIHBy
b21pc2UyID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIyIikpOworICAgICAgdmFyIHByb21pc2Uz
ID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIzIikpOworICAgICAgdmFyIHByb21pc2VzID0gWyBw
cm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07CiAKLSAgICByZXR1cm4gcmV0OwotICB9LAor
ICAgICAgdmFyIG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7CisgICAgICAgIHJldHVybiBpdGVtICsg
MTsKKyAgICAgIH07CiAKLSAgLyoqCi0gICAgU2ltcGx5IGNvbnZlcnRzIHRoZSBlbnVtZXJhYmxl
IGludG8gYSBnZW51aW5lIGFycmF5LiBUaGUgb3JkZXIgaXMgbm90Ci0gICAgZ3VhcmFudGVlZC4g
Q29ycmVzcG9uZHMgdG8gdGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBieSBQcm90b3R5cGUuCisgICAg
ICBSU1ZQLm1hcChwcm9taXNlcywgbWFwRm4pLnRoZW4oZnVuY3Rpb24oYXJyYXkpeworICAgICAg
ICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVucyBiZWNhdXNlIHRoZXJlIGFyZSByZWplY3RlZCBwcm9t
aXNlcyEKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgeworICAgICAgICAvLyByZWFzb24ubWVz
c2FnZSA9PT0gIjIiCisgICAgICB9KTsKKyAgICAgIGBgYAogCi0gICAgQG1ldGhvZCB0b0FycmF5
Ci0gICAgQHJldHVybiB7QXJyYXl9IHRoZSBlbnVtZXJhYmxlIGFzIGFuIGFycmF5LgotICAqLwot
ICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcmV0ID0gW107Ci0gICAgdGhpcy5mb3JF
YWNoKGZ1bmN0aW9uKG8sIGlkeCkgeyByZXRbaWR4XSA9IG87IH0pOwotICAgIHJldHVybiByZXQg
OwotICB9LAorICAgICAgYFJTVlAubWFwYCB3aWxsIGFsc28gd2FpdCBpZiBhIHByb21pc2UgaXMg
cmV0dXJuZWQgZnJvbSBgbWFwRm5gLiBGb3IgZXhhbXBsZSwKKyAgICAgIHNheSB5b3Ugd2FudCB0
byBnZXQgYWxsIGNvbW1lbnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywgYnV0IHlvdSBuZWVk
CisgICAgICB0aGUgYmxvZyBwb3N0cyBmaXJzdCBiZWN1YXNlIHRoZXkgY29udGFpbiBhIHVybCB0
byB0aG9zZSBjb21tZW50cy4KIAotICAvKioKLSAgICBSZXR1cm5zIGEgY29weSBvZiB0aGUgYXJy
YXkgd2l0aCBhbGwgbnVsbCBlbGVtZW50cyByZW1vdmVkLgorICAgICAgYGBgamF2c2NyaXB0CiAK
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsIG51bGwsICJjIiwgbnVsbF07
Ci0gICAgYXJyLmNvbXBhY3QoKTsgIC8vIFsiYSIsICJjIl0KLSAgICBgYGAKKyAgICAgIHZhciBt
YXBGbiA9IGZ1bmN0aW9uKGJsb2dQb3N0KXsKKyAgICAgICAgLy8gZ2V0Q29tbWVudHMgZG9lcyBz
b21lIGFqYXggYW5kIHJldHVybnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkCisg
ICAgICAgIC8vIHdpdGggc29tZSBjb21tZW50cyBkYXRhCisgICAgICAgIHJldHVybiBnZXRDb21t
ZW50cyhibG9nUG9zdC5jb21tZW50c191cmwpOworICAgICAgfTsKIAotICAgIEBtZXRob2QgY29t
cGFjdAotICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91dCBudWxsIGVsZW1lbnRz
LgotICAqLwotICBjb21wYWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMud2l0aG91dChudWxs
KTsgfSwKKyAgICAgIC8vIGdldEJsb2dQb3N0cyBkb2VzIHNvbWUgYWpheCBhbmQgcmV0dXJucyBh
biBSU1ZQLlByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQKKyAgICAgIC8vIHdpdGggc29tZSBibG9n
IHBvc3QgZGF0YQorICAgICAgUlNWUC5tYXAoZ2V0QmxvZ1Bvc3RzKCksIG1hcEZuKS50aGVuKGZ1
bmN0aW9uKGNvbW1lbnRzKXsKKyAgICAgICAgLy8gY29tbWVudHMgaXMgdGhlIHJlc3VsdCBvZiBh
c2tpbmcgdGhlIHNlcnZlciBmb3IgdGhlIGNvbW1lbnRzCisgICAgICAgIC8vIG9mIGFsbCBibG9n
IHBvc3RzIHJldHVybmVkIGZyb20gZ2V0QmxvZ1Bvc3RzKCkKKyAgICAgIH0pOworICAgICAgYGBg
CiAKLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgZXhjbHVkZXMgdGhl
IHBhc3NlZCB2YWx1ZS4gVGhlIGRlZmF1bHQKLSAgICBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFu
IGFycmF5IHJlZ2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUgdW5sZXNzCi0gICAgdGhlIHJl
Y2VpdmVyIGRvZXMgbm90IGNvbnRhaW4gdGhlIHZhbHVlLgorICAgICAgQG1ldGhvZCBtYXAKKyAg
ICAgIEBmb3IgUlNWUAorICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKKyAgICAgIEBwYXJh
bSB7RnVuY3Rpb259IG1hcEZuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIGZ1bGZpbGxl
ZCBwcm9taXNlLgorICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBm
b3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAg
ICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHJl
c3VsdCBvZiBjYWxsaW5nCisgICAgICBgbWFwRm5gIG9uIGVhY2ggZnVsZmlsbGVkIHByb21pc2Ug
b3IgdmFsdWUgd2hlbiB0aGV5IGJlY29tZSBmdWxmaWxsZWQuCisgICAgICAgVGhlIHByb21pc2Ug
d2lsbCBiZSByZWplY3RlZCBpZiBhbnkgb2YgdGhlIGdpdmVuIGBwcm9taXNlc2AgYmVjb21lIHJl
amVjdGVkLgorICAgICAgQHN0YXRpYworICAgICovCisgICAgX19leHBvcnRzX19bImRlZmF1bHQi
XSA9IGZ1bmN0aW9uIG1hcChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7CisgICAgICByZXR1cm4g
YWxsKHByb21pc2VzLCBsYWJlbCkudGhlbihmdW5jdGlvbihyZXN1bHRzKXsKKyAgICAgICAgaWYg
KCFpc0FycmF5KHByb21pc2VzKSkgeworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lv
dSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gbWFwLicpOworICAgICAgICB9CiAKLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImEiLCAiYyJdOwotICAgIGFyci53aXRo
b3V0KCJhIik7ICAvLyBbImIiLCAiYyJdCi0gICAgYGBgCisgICAgICAgIGlmICghaXNGdW5jdGlv
bihtYXBGbikpeworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3Mg
YSBmdW5jdGlvbiB0byBtYXAncyBzZWNvbmQgYXJndW1lbnQuIik7CisgICAgICAgIH0KIAotICAg
IEBtZXRob2Qgd2l0aG91dAotICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZQotICAgIEByZXR1cm4g
e0VtYmVyLkVudW1lcmFibGV9Ci0gICovCi0gIHdpdGhvdXQ6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0g
ICAgaWYgKCF0aGlzLmNvbnRhaW5zKHZhbHVlKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8g
ZG8KLSAgICB2YXIgcmV0ID0gW10gOwotICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrKSB7Ci0g
ICAgICBpZiAoayAhPT0gdmFsdWUpIHJldFtyZXQubGVuZ3RoXSA9IGs7Ci0gICAgfSkgOwotICAg
IHJldHVybiByZXQgOwotICB9LAogCi0gIC8qKgotICAgIFJldHVybnMgYSBuZXcgZW51bWVyYWJs
ZSB0aGF0IGNvbnRhaW5zIG9ubHkgdW5pcXVlIHZhbHVlcy4gVGhlIGRlZmF1bHQKLSAgICBpbXBs
ZW1lbnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJlZ2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5
cGUuCisgICAgICAgIHZhciByZXN1bHRMZW4gPSByZXN1bHRzLmxlbmd0aCwKKyAgICAgICAgICAg
IG1hcHBlZFJlc3VsdHMgPSBbXSwKKyAgICAgICAgICAgIGk7CiAKLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgdmFyIGFyciA9IFsiYSIsICJhIiwgImIiLCAiYiJdOwotICAgIGFyci51bmlxKCk7ICAv
LyBbImEiLCAiYiJdCi0gICAgYGBgCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHRMZW47
IGkrKyl7CisgICAgICAgICAgbWFwcGVkUmVzdWx0cy5wdXNoKG1hcEZuKHJlc3VsdHNbaV0pKTsK
KyAgICAgICAgfQogCi0gICAgQG1ldGhvZCB1bmlxCi0gICAgQHJldHVybiB7RW1iZXIuRW51bWVy
YWJsZX0KLSAgKi8KLSAgdW5pcTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldCA9IFtdOwotICAg
IHRoaXMuZm9yRWFjaChmdW5jdGlvbihrKXsKLSAgICAgIGlmIChhX2luZGV4T2YocmV0LCBrKTww
KSByZXQucHVzaChrKTsKLSAgICB9KTsKLSAgICByZXR1cm4gcmV0OwotICB9LAorICAgICAgICBy
ZXR1cm4gYWxsKG1hcHBlZFJlc3VsdHMsIGxhYmVsKTsKKyAgICAgIH0pOworICAgIH07CisgIH0p
OworZGVmaW5lKCJyc3ZwL25vZGUiLCAKKyAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCisgIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKKyAgICAidXNlIHN0cmljdCI7
CisgICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKIAotICAvKioK
LSAgICBUaGlzIHByb3BlcnR5IHdpbGwgdHJpZ2dlciBhbnl0aW1lIHRoZSBlbnVtZXJhYmxlJ3Mg
Y29udGVudCBjaGFuZ2VzLgotICAgIFlvdSBjYW4gb2JzZXJ2ZSB0aGlzIHByb3BlcnR5IHRvIGJl
IG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIGVudW1lcmFibGVzCi0gICAgY29udGVudC4KKyAg
ICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAKLSAgICBGb3IgcGxhaW4gZW51
bWVyYWJsZXMsIHRoaXMgcHJvcGVydHkgaXMgcmVhZCBvbmx5LiBgRW1iZXIuQXJyYXlgIG92ZXJy
aWRlcwotICAgIHRoaXMgbWV0aG9kLgorICAgIGZ1bmN0aW9uIG1ha2VOb2RlQ2FsbGJhY2tGb3Io
cmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCB2YWx1ZSkg
eworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICByZWplY3QoZXJyb3IpOworICAgICAg
ICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAgICAgICAgcmVzb2x2ZShz
bGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJl
c29sdmUodmFsdWUpOworICAgICAgICB9CisgICAgICB9OworICAgIH0KIAotICAgIEBwcm9wZXJ0
eSBbXQotICAgIEB0eXBlIEVtYmVyLkFycmF5Ci0gICovCi0gICdbXSc6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfSksCisgICAgLyoq
CisgICAgICBgUlNWUC5kZW5vZGVpZnlgIHRha2VzIGEgIm5vZGUtc3R5bGUiIGZ1bmN0aW9uIGFu
ZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdAorICAgICAgd2lsbCByZXR1cm4gYW4gYFJTVlAuUHJv
bWlzZWAuIFlvdSBjYW4gdXNlIGBkZW5vZGVpZnlgIGluIE5vZGUuanMgb3IgdGhlCisgICAgICBi
cm93c2VyIHdoZW4geW91J2QgcHJlZmVyIHRvIHVzZSBwcm9taXNlcyBvdmVyIHVzaW5nIGNhbGxi
YWNrcy4gRm9yIGV4YW1wbGUsCisgICAgICBgZGVub2RlaWZ5YCB0cmFuc2Zvcm1zIHRoZSBmb2xs
b3dpbmc6CiAKLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgotICAvLyBFTlVNRVJBQkxFIE9CU0VSVkVSUwotICAvLworICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKIAotICAvKioKLSAg
ICBSZWdpc3RlcnMgYW4gZW51bWVyYWJsZSBvYnNlcnZlci4gTXVzdCBpbXBsZW1lbnQgYEVtYmVy
LkVudW1lcmFibGVPYnNlcnZlcmAKLSAgICBtaXhpbi4KKyAgICAgIGZzLnJlYWRGaWxlKCdteWZp
bGUudHh0JywgZnVuY3Rpb24oZXJyLCBkYXRhKXsKKyAgICAgICAgaWYgKGVycikgcmV0dXJuIGhh
bmRsZUVycm9yKGVycik7CisgICAgICAgIGhhbmRsZURhdGEoZGF0YSk7CisgICAgICB9KTsKKyAg
ICAgIGBgYAogCi0gICAgQG1ldGhvZCBhZGRFbnVtZXJhYmxlT2JzZXJ2ZXIKLSAgICBAcGFyYW0g
dGFyZ2V0IHtPYmplY3R9Ci0gICAgQHBhcmFtIG9wdHMge0hhc2h9Ci0gICovCi0gIGFkZEVudW1l
cmFibGVPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7Ci0gICAgdmFyIHdpbGxDaGFu
Z2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdlbnVtZXJhYmxlV2lsbENoYW5nZScs
Ci0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5nZSkgfHwgJ2VudW1l
cmFibGVEaWRDaGFuZ2UnOworICAgICAgaW50bzoKIAotICAgIHZhciBoYXNPYnNlcnZlcnMgPSBn
ZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKLSAgICBpZiAoIWhhc09ic2VydmVy
cykgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJz
Jyk7Ci0gICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgJ0BlbnVtZXJhYmxlOmJlZm9yZScsIHRh
cmdldCwgd2lsbENoYW5nZSk7Ci0gICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgJ0BlbnVtZXJh
YmxlOmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKLSAgICBpZiAoIWhhc09ic2VydmVycykg
RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsK
LSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBm
cyA9IHJlcXVpcmUoJ2ZzJyk7CiAKLSAgLyoqCi0gICAgUmVtb3ZlcyBhIHJlZ2lzdGVyZWQgZW51
bWVyYWJsZSBvYnNlcnZlci4KKyAgICAgIHZhciByZWFkRmlsZSA9IFJTVlAuZGVub2RlaWZ5KGZz
LnJlYWRGaWxlKTsKIAotICAgIEBtZXRob2QgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyCi0gICAg
QHBhcmFtIHRhcmdldCB7T2JqZWN0fQotICAgIEBwYXJhbSBbb3B0c10ge0hhc2h9Ci0gICovCi0g
IHJlbW92ZUVudW1lcmFibGVPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7Ci0gICAg
dmFyIHdpbGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdlbnVtZXJhYmxl
V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5n
ZSkgfHwgJ2VudW1lcmFibGVEaWRDaGFuZ2UnOworICAgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQn
KS50aGVuKGhhbmRsZURhdGEsIGhhbmRsZUVycm9yKTsKKyAgICAgIGBgYAogCi0gICAgdmFyIGhh
c09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIGlm
IChoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFzRW51bWVy
YWJsZU9ic2VydmVycycpOwotICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVy
YWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLnJlbW92ZUxpc3Rl
bmVyKHRoaXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0gICAg
aWYgKGhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1l
cmFibGVPYnNlcnZlcnMnKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgICAgIFVzaW5nIGBk
ZW5vZGVpZnlgIG1ha2VzIGl0IGVhc2llciB0byBjb21wb3NlIGFzeW5jaHJvbm91cyBvcGVyYXRp
b25zIGluc3RlYWQKKyAgICAgIG9mIHVzaW5nIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIGluc3Rl
YWQgb2Y6CiAKLSAgLyoqCi0gICAgQmVjb21lcyB0cnVlIHdoZW5ldmVyIHRoZSBhcnJheSBjdXJy
ZW50bHkgaGFzIG9ic2VydmVycyB3YXRjaGluZyBjaGFuZ2VzCi0gICAgb24gdGhlIGFycmF5Lgor
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKKyAgICAg
IHZhciBsb2cgPSByZXF1aXJlKCdzb21lLWFzeW5jLWxvZ2dlcicpOwogCi0gICAgQHByb3BlcnR5
IGhhc0VudW1lcmFibGVPYnNlcnZlcnMKLSAgICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGhhc0Vu
dW1lcmFibGVPYnNlcnZlcnM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biBFbWJlci5oYXNMaXN0ZW5lcnModGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScpIHx8IEVtYmVy
Lmhhc0xpc3RlbmVycyh0aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJyk7Ci0gIH0pLAorICAgICAg
ZnMucmVhZEZpbGUoJ215ZmlsZS50eHQnLCBmdW5jdGlvbihlcnIsIGRhdGEpeworICAgICAgICBp
ZiAoZXJyKSByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgZnMud3JpdGVGaWxlKCdt
eWZpbGUyLnR4dCcsIGRhdGEsIGZ1bmN0aW9uKGVycil7CisgICAgICAgICAgaWYgKGVycikgdGhy
b3cgZXJyOworICAgICAgICAgIGxvZygnc3VjY2VzcycsIGZ1bmN0aW9uKGVycikgeworICAgICAg
ICAgICAgaWYgKGVycikgdGhyb3cgZXJyOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAg
ICAgIH0pOworICAgICAgYGBgCiAKKyAgICAgIFlvdSBjYW4gY2hhaW4gdGhlIG9wZXJhdGlvbnMg
dG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20gdGhlIHJldHVybmVkIHByb21pc2U6CisKKyAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgICAgICB2YXIg
ZGVub2RlaWZ5ID0gUlNWUC5kZW5vZGVpZnk7CisgICAgICB2YXIgcmVhZEZpbGUgPSBkZW5vZGVp
ZnkoZnMucmVhZEZpbGUpOworICAgICAgdmFyIHdyaXRlRmlsZSA9IGRlbm9kZWlmeShmcy53cml0
ZUZpbGUpOworICAgICAgdmFyIGxvZyA9IGRlbm9kZWlmeShyZXF1aXJlKCdzb21lLWFzeW5jLWxv
Z2dlcicpKTsKKworICAgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0aW9uKGRh
dGEpeworICAgICAgICByZXR1cm4gd3JpdGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEpOworICAg
ICAgfSkudGhlbihmdW5jdGlvbigpeworICAgICAgICByZXR1cm4gbG9nKCdTVUNDRVNTJyk7Cisg
ICAgICB9KS50aGVuKGZ1bmN0aW9uKCl7CisgICAgICAgIC8vIHN1Y2Nlc3MgaGFuZGxlcgorICAg
ICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKKyAgICAgICAgLy8gcmVqZWN0aW9uIGhhbmRsZXIKKyAg
ICAgIH0pOworICAgICAgYGBgCiAKLSAgLyoqCi0gICAgSW52b2tlIHRoaXMgbWV0aG9kIGp1c3Qg
YmVmb3JlIHRoZSBjb250ZW50cyBvZiB5b3VyIGVudW1lcmFibGUgd2lsbAotICAgIGNoYW5nZS4g
WW91IGNhbiBlaXRoZXIgb21pdCB0aGUgcGFyYW1ldGVycyBjb21wbGV0ZWx5IG9yIHBhc3MgdGhl
IG9iamVjdHMKLSAgICB0byBiZSByZW1vdmVkIG9yIGFkZGVkIGlmIGF2YWlsYWJsZSBvciBqdXN0
IGEgY291bnQuCisgICAgICBAbWV0aG9kIGRlbm9kZWlmeQorICAgICAgQGZvciBSU1ZQCisgICAg
ICBAcGFyYW0ge0Z1bmN0aW9ufSBub2RlRnVuYyBhICJub2RlLXN0eWxlIiBmdW5jdGlvbiB0aGF0
IHRha2VzIGEgY2FsbGJhY2sgYXMKKyAgICAgIGl0cyBsYXN0IGFyZ3VtZW50LiBUaGUgY2FsbGJh
Y2sgZXhwZWN0cyBhbiBlcnJvciB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0CisgICAgICBhcmd1
bWVudCAoaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG90aGVyd2lzZSBudWxsKSwgYW5kIHRoZSB2YWx1
ZSBmcm9tIHRoZQorICAgICAgb3BlcmF0aW9uIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQgKCJmdW5j
dGlvbihlcnIsIHZhbHVlKXsgfSIpLgorICAgICAgQHBhcmFtIHtBbnl9IGJpbmRpbmcgb3B0aW9u
YWwgYXJndW1lbnQgZm9yIGJpbmRpbmcgdGhlICJ0aGlzIiB2YWx1ZSB3aGVuCisgICAgICBjYWxs
aW5nIHRoZSBgbm9kZUZ1bmNgIGZ1bmN0aW9uLgorICAgICAgQHJldHVybiB7RnVuY3Rpb259IGEg
ZnVuY3Rpb24gdGhhdCB3cmFwcyBgbm9kZUZ1bmNgIHRvIHJldHVybiBhbgorICAgICAgYFJTVlAu
UHJvbWlzZWAKKyAgICAgIEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0
Il0gPSBmdW5jdGlvbiBkZW5vZGVpZnkobm9kZUZ1bmMsIGJpbmRpbmcpIHsKKyAgICAgIHJldHVy
biBmdW5jdGlvbigpICB7CisgICAgICAgIHZhciBub2RlQXJncyA9IHNsaWNlLmNhbGwoYXJndW1l
bnRzKSwgcmVzb2x2ZSwgcmVqZWN0OworICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXMgfHwgYmlu
ZGluZzsKKworICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVq
ZWN0KSB7CisgICAgICAgICAgUHJvbWlzZS5hbGwobm9kZUFyZ3MpLnRoZW4oZnVuY3Rpb24obm9k
ZUFyZ3MpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG5vZGVBcmdzLnB1c2go
bWFrZU5vZGVDYWxsYmFja0ZvcihyZXNvbHZlLCByZWplY3QpKTsKKyAgICAgICAgICAgICAgbm9k
ZUZ1bmMuYXBwbHkodGhpc0FyZywgbm9kZUFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaChlKSB7
CisgICAgICAgICAgICAgIHJlamVjdChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsK
KyAgICAgICAgfSk7CisgICAgICB9OworICAgIH07CisgIH0pOworZGVmaW5lKCJyc3ZwL3Byb21p
c2UiLCAKKyAgWyIuL2NvbmZpZyIsIi4vZXZlbnRzIiwiLi9pbnN0cnVtZW50IiwiLi91dGlscyIs
Ii4vcHJvbWlzZS9jYXN0IiwiLi9wcm9taXNlL2FsbCIsIi4vcHJvbWlzZS9yYWNlIiwiLi9wcm9t
aXNlL3Jlc29sdmUiLCIuL3Byb21pc2UvcmVqZWN0IiwiZXhwb3J0cyJdLAorICBmdW5jdGlvbihf
X2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2RlcGVu
ZGVuY3k0X18sIF9fZGVwZW5kZW5jeTVfXywgX19kZXBlbmRlbmN5Nl9fLCBfX2RlcGVuZGVuY3k3
X18sIF9fZGVwZW5kZW5jeThfXywgX19kZXBlbmRlbmN5OV9fLCBfX2V4cG9ydHNfXykgeworICAg
ICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgY29uZmlnID0gX19kZXBlbmRlbmN5MV9fLmNvbmZpZzsK
KyAgICB2YXIgRXZlbnRUYXJnZXQgPSBfX2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsKKyAgICB2
YXIgaW5zdHJ1bWVudCA9IF9fZGVwZW5kZW5jeTNfX1siZGVmYXVsdCJdOworICAgIHZhciBvYmpl
Y3RPckZ1bmN0aW9uID0gX19kZXBlbmRlbmN5NF9fLm9iamVjdE9yRnVuY3Rpb247CisgICAgdmFy
IGlzRnVuY3Rpb24gPSBfX2RlcGVuZGVuY3k0X18uaXNGdW5jdGlvbjsKKyAgICB2YXIgbm93ID0g
X19kZXBlbmRlbmN5NF9fLm5vdzsKKyAgICB2YXIgY2FzdCA9IF9fZGVwZW5kZW5jeTVfX1siZGVm
YXVsdCJdOworICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3k2X19bImRlZmF1bHQiXTsKKyAgICB2
YXIgcmFjZSA9IF9fZGVwZW5kZW5jeTdfX1siZGVmYXVsdCJdOworICAgIHZhciBSZXNvbHZlID0g
X19kZXBlbmRlbmN5OF9fWyJkZWZhdWx0Il07CisgICAgdmFyIFJlamVjdCA9IF9fZGVwZW5kZW5j
eTlfX1siZGVmYXVsdCJdOwogCi0gICAgQG1ldGhvZCBlbnVtZXJhYmxlQ29udGVudFdpbGxDaGFu
Z2UKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSByZW1vdmluZyBBbiBlbnVt
ZXJhYmxlIG9mIHRoZSBvYmplY3RzIHRvCi0gICAgICBiZSByZW1vdmVkIG9yIHRoZSBudW1iZXIg
b2YgaXRlbXMgdG8gYmUgcmVtb3ZlZC4KLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVt
YmVyfSBhZGRpbmcgQW4gZW51bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0byBiZQotICAgICAgYWRk
ZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBhZGRlZC4KLSAgICBAY2hhaW5hYmxlCi0g
ICovCi0gIGVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24ocmVtb3ZpbmcsIGFk
ZGluZykgeworICAgIHZhciBndWlkS2V5ID0gJ3JzdnBfJyArIG5vdygpICsgJy0nOworICAgIHZh
ciBjb3VudGVyID0gMDsKIAotICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVsdGE7Cisg
ICAgZnVuY3Rpb24gbm9vcCgpIHt9CiAKLSAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiByZW1v
dmluZykgcmVtb3ZlQ250ID0gcmVtb3Zpbmc7Ci0gICAgZWxzZSBpZiAocmVtb3ZpbmcpIHJlbW92
ZUNudCA9IGdldChyZW1vdmluZywgJ2xlbmd0aCcpOwotICAgIGVsc2UgcmVtb3ZlQ250ID0gcmVt
b3ZpbmcgPSAtMTsKKyAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gUHJvbWlzZTsKIAotICAg
IGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRkaW5nOwotICAgIGVs
c2UgaWYgKGFkZGluZykgYWRkQ250ID0gZ2V0KGFkZGluZywnbGVuZ3RoJyk7Ci0gICAgZWxzZSBh
ZGRDbnQgPSBhZGRpbmcgPSAtMTsKIAotICAgIGhhc0RlbHRhID0gYWRkQ250PDAgfHwgcmVtb3Zl
Q250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9PTA7CisgICAgLyoqCisgICAgICBQcm9taXNlIG9i
amVjdHMgcmVwcmVzZW50IHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9w
ZXJhdGlvbi4gVGhlCisgICAgICBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJv
bWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLCB3aGljaAorICAgICAgcmVnaXN0ZXJz
IGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2XigJlzIGV2ZW50dWFsIHZhbHVl
IG9yIHRoZSByZWFzb24KKyAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVk
LgogCi0gICAgaWYgKHJlbW92aW5nID09PSAtMSkgcmVtb3ZpbmcgPSBudWxsOwotICAgIGlmIChh
ZGRpbmcgICA9PT0gLTEpIGFkZGluZyAgID0gbnVsbDsKKyAgICAgIFRlcm1pbm9sb2d5CisgICAg
ICAtLS0tLS0tLS0tLQogCi0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdbXScp
OwotICAgIGlmIChoYXNEZWx0YSkgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsZW5n
dGgnKTsKLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BlbnVtZXJhYmxlOmJlZm9yZScsIFt0
aGlzLCByZW1vdmluZywgYWRkaW5nXSk7CisgICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qg
b3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMg
dG8gdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBv
ciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLgorICAgICAgLSBgdmFsdWVg
IGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRo
ZW5hYmxlLCBvciBhIHByb21pc2UpLgorICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRo
YXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCisgICAgICAtIGByZWFzb25g
IGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuCisg
ICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1
bGZpbGxlZCBvciByZWplY3RlZC4KIAotICAgIHJldHVybiB0aGlzOwotICB9LAorICAgICAgQSBw
cm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQs
IG9yIHJlamVjdGVkLgogCi0gIC8qKgotICAgIEludm9rZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBj
b250ZW50cyBvZiB5b3VyIGVudW1lcmFibGUgaGFzIGNoYW5nZWQuCi0gICAgVGhpcyB3aWxsIG5v
dGlmeSBhbnkgb2JzZXJ2ZXJzIHdhdGNoaW5nIGZvciBjb250ZW50IGNoYW5nZXMuIElmIHlvdXIg
YXJlCi0gICAgaW1wbGVtZW50aW5nIGFuIG9yZGVyZWQgZW51bWVyYWJsZSAoc3VjaCBhcyBhbiBh
cnJheSksIGFsc28gcGFzcyB0aGUKLSAgICBzdGFydCBhbmQgZW5kIHZhbHVlcyB3aGVyZSB0aGUg
Y29udGVudCBjaGFuZ2VkIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8KLSAgICBub3RpZnkgcmFu
Z2Ugb2JzZXJ2ZXJzLgorICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBm
dWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWQKKyAgICAgIHN0YXRlLiAg
UHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFy
ZSBpbiB0aGUKKyAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBu
ZXZlciBhIHRoZW5hYmxlLiAgU2ltaWxhcmx5LCBhCisgICAgICByZWplY3Rpb24gcmVhc29uIGlz
IG5ldmVyIGEgdGhlbmFibGUuCiAKLSAgICBAbWV0aG9kIGVudW1lcmFibGVDb250ZW50RGlkQ2hh
bmdlCi0gICAgQHBhcmFtIHtOdW1iZXJ9IFtzdGFydF0gb3B0aW9uYWwgc3RhcnQgb2Zmc2V0IGZv
ciB0aGUgY29udGVudCBjaGFuZ2UuCi0gICAgICBGb3IgdW5vcmRlcmVkIGVudW1lcmFibGVzLCB5
b3Ugc2hvdWxkIGFsd2F5cyBwYXNzIC0xLgotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZXxO
dW1iZXJ9IHJlbW92aW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KLSAgICAgIGJl
IHJlbW92ZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSByZW1vdmVkLgotICAgIEBwYXJh
bSB7RW1iZXIuRW51bWVyYWJsZXxOdW1iZXJ9IGFkZGluZyAgQW4gZW51bWVyYWJsZSBvZiB0aGUg
b2JqZWN0cyB0bwotICAgICAgYmUgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBh
ZGRlZC4KLSAgICBAY2hhaW5hYmxlCi0gICovCi0gIGVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdl
OiBmdW5jdGlvbihyZW1vdmluZywgYWRkaW5nKSB7Ci0gICAgdmFyIG5vdGlmeSA9IHRoaXMucHJv
cGVydHlEaWRDaGFuZ2UsIHJlbW92ZUNudCwgYWRkQ250LCBoYXNEZWx0YTsKKyAgICAgIFByb21p
c2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVl
IGlzIGFsc28gYQorICAgICAgcHJvbWlzZSwgdGhlbiB0aGUgb3JpZ2luYWwgcHJvbWlzZSdzIHNl
dHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0aGUgdmFsdWUncworICAgICAgc2V0dGxlZCBzdGF0ZS4g
IFNvIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxs
CisgICAgICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHBy
b21pc2UgdGhhdCBmdWxmaWxscyB3aWxsCisgICAgICBpdHNlbGYgZnVsZmlsbC4KIAotICAgIGlm
ICgnbnVtYmVyJyA9PT0gdHlwZW9mIHJlbW92aW5nKSByZW1vdmVDbnQgPSByZW1vdmluZzsKLSAg
ICBlbHNlIGlmIChyZW1vdmluZykgcmVtb3ZlQ250ID0gZ2V0KHJlbW92aW5nLCAnbGVuZ3RoJyk7
Ci0gICAgZWxzZSByZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOwogCi0gICAgaWYgKCdudW1iZXIn
ID09PSB0eXBlb2YgYWRkaW5nKSBhZGRDbnQgPSBhZGRpbmc7Ci0gICAgZWxzZSBpZiAoYWRkaW5n
KSBhZGRDbnQgPSBnZXQoYWRkaW5nLCAnbGVuZ3RoJyk7Ci0gICAgZWxzZSBhZGRDbnQgPSBhZGRp
bmcgPSAtMTsKKyAgICAgIEJhc2ljIFVzYWdlOgorICAgICAgLS0tLS0tLS0tLS0tCiAKLSAgICBo
YXNEZWx0YSA9IGFkZENudDwwIHx8IHJlbW92ZUNudDwwIHx8IGFkZENudC1yZW1vdmVDbnQhPT0w
OworICAgICAgYGBganMKKyAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24o
cmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgIC8vIG9uIHN1Y2Nlc3MKKyAgICAgICAgcmVzb2x2
ZSh2YWx1ZSk7CiAKLSAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSByZW1vdmluZyA9IG51bGw7Ci0g
ICAgaWYgKGFkZGluZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOworICAgICAgICAvLyBvbiBm
YWlsdXJlCisgICAgICAgIHJlamVjdChyZWFzb24pOworICAgICAgfSk7CiAKLSAgICBFbWJlci5z
ZW5kRXZlbnQodGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScsIFt0aGlzLCByZW1vdmluZywgYWRk
aW5nXSk7Ci0gICAgaWYgKGhhc0RlbHRhKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAn
bGVuZ3RoJyk7Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ1tdJyk7CisgICAg
ICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgLy8gb24gZnVsZmlsbG1l
bnQKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgeworICAgICAgICAvLyBvbiByZWplY3Rpb24K
KyAgICAgIH0pOworICAgICAgYGBgCiAKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0KKyAgICAgIEFk
dmFuY2VkIFVzYWdlOgorICAgICAgLS0tLS0tLS0tLS0tLS0tCiAKLX0pIDsKKyAgICAgIFByb21p
c2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25z
IHN1Y2ggYXMKKyAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLgogCi19KSgpOworICAgICAgYGBganMK
KyAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpeworICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1M
SHR0cFJlcXVlc3QoKTsKIAorICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpOworICAgICAg
ICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyOworICAgICAgICAgIHhoci5yZXNw
b25zZVR5cGUgPSAnanNvbic7CisgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2Vw
dCcsICdhcHBsaWNhdGlvbi9qc29uJyk7CisgICAgICAgICAgeGhyLnNlbmQoKTsKIAorICAgICAg
ICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRl
ID09PSB0aGlzLkRPTkUpIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAp
IHsKKyAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpOworICAgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoImdldEpTT046IGAi
ICsgdXJsICsgImAgZmFpbGVkIHdpdGggc3RhdHVzOiBbIiArIHRoaXMuc3RhdHVzICsgIl0iKTsK
KyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0p
OworICAgICAgfQogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1
bGUgZW1iZXItcnVudGltZQotKi8KKyAgICAgIGdldEpTT04oJy9wb3N0cy5qc29uJykudGhlbihm
dW5jdGlvbihqc29uKSB7CisgICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50CisgICAgICB9LCBmdW5j
dGlvbihyZWFzb24pIHsKKyAgICAgICAgLy8gb24gcmVqZWN0aW9uCisgICAgICB9KTsKKyAgICAg
IGBgYAogCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uCi0vLyBIRUxQRVJTCi0vLworICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJv
bWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy4KIAotdmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0LCBtZXRhID0gRW1iZXIubWV0YSwgbWFwID0gRW1iZXIuRW51
bWVyYWJsZVV0aWxzLm1hcCwgY2FjaGVGb3IgPSBFbWJlci5jYWNoZUZvcjsKKyAgICAgIGBgYGpz
CisgICAgICBQcm9taXNlLmFsbChbCisgICAgICAgIGdldEpTT04oJy9wb3N0cycpLAorICAgICAg
ICBnZXRKU09OKCcvY29tbWVudHMnKQorICAgICAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpewor
ICAgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OCisgICAgICAgIHZhbHVlc1sxXSAvLyA9
PiBjb21tZW50c0pTT04KIAotZnVuY3Rpb24gbm9uZShvYmopIHsgcmV0dXJuIG9iaj09PW51bGwg
fHwgb2JqPT09dW5kZWZpbmVkOyB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgICB9KTsK
KyAgICAgIGBgYAogCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCi0vLyBBUlJBWQotLy8KLS8qKgotICBUaGlzIG1vZHVsZSBpbXBs
ZW1lbnRzIE9ic2VydmVyLWZyaWVuZGx5IEFycmF5LWxpa2UgYmVoYXZpb3IuIFRoaXMgbWl4aW4g
aXMKLSAgcGlja2VkIHVwIGJ5IHRoZSBBcnJheSBjbGFzcyBhcyB3ZWxsIGFzIG90aGVyIGNvbnRy
b2xsZXJzLCBldGMuIHRoYXQgd2FudCB0bwotICBhcHBlYXIgdG8gYmUgYXJyYXlzLgorICAgICAg
QGNsYXNzIFJTVlAuUHJvbWlzZQorICAgICAgQHBhcmFtIHtmdW5jdGlvbn0KKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNl
LgorICAgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQGNvbnN0cnVjdG9yCisgICAgKi8K
KyAgICBmdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyLCBsYWJlbCkgeworICAgICAgaWYgKCFpc0Z1
bmN0aW9uKHJlc29sdmVyKSkgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVz
dCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBw
cm9taXNlIGNvbnN0cnVjdG9yJyk7CisgICAgICB9CiAKLSAgVW5saWtlIGBFbWJlci5FbnVtZXJh
YmxlLGAgdGhpcyBtaXhpbiBkZWZpbmVzIG1ldGhvZHMgc3BlY2lmaWNhbGx5IGZvcgotICBjb2xs
ZWN0aW9ucyB0aGF0IHByb3ZpZGUgaW5kZXgtb3JkZXJlZCBhY2Nlc3MgdG8gdGhlaXIgY29udGVu
dHMuIFdoZW4geW91Ci0gIGFyZSBkZXNpZ25pbmcgY29kZSB0aGF0IG5lZWRzIHRvIGFjY2VwdCBh
bnkga2luZCBvZiBBcnJheS1saWtlIG9iamVjdCwgeW91Ci0gIHNob3VsZCB1c2UgdGhlc2UgbWV0
aG9kcyBpbnN0ZWFkIG9mIEFycmF5IHByaW1pdGl2ZXMgYmVjYXVzZSB0aGVzZSB3aWxsCi0gIHBy
b3Blcmx5IG5vdGlmeSBvYnNlcnZlcnMgb2YgY2hhbmdlcyB0byB0aGUgYXJyYXkuCisgICAgICBp
ZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcn
IG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEg
ZnVuY3Rpb24uIik7CisgICAgICB9CiAKLSAgQWx0aG91Z2ggdGhlc2UgbWV0aG9kcyBhcmUgZWZm
aWNpZW50LCB0aGV5IGRvIGFkZCBhIGxheWVyIG9mIGluZGlyZWN0aW9uIHRvCi0gIHlvdXIgYXBw
bGljYXRpb24gc28gaXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIHRoZW0gb25seSB3aGVuIHlvdSBu
ZWVkIHRoZQotICBmbGV4aWJpbGl0eSBvZiB1c2luZyBib3RoIHRydWUgSmF2YVNjcmlwdCBhcnJh
eXMgYW5kICJ2aXJ0dWFsIiBhcnJheXMgc3VjaAotICBhcyBjb250cm9sbGVycyBhbmQgY29sbGVj
dGlvbnMuCisgICAgICB0aGlzLl9pZCA9IGNvdW50ZXIrKzsKKyAgICAgIHRoaXMuX2xhYmVsID0g
bGFiZWw7CisgICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdOwogCi0gIFlvdSBjYW4gdXNlIHRo
ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgdG8gYWNjZXNzIGFuZCBtb2RpZnkgYXJy
YXkKLSAgY29udGVudHMgaW4gYSBLVk8tZnJpZW5kbHkgd2F5LiBZb3UgY2FuIGFsc28gYmUgbm90
aWZpZWQgd2hlbmV2ZXIgdGhlCi0gIG1lbWJlcnNoaXAgaWYgYW4gYXJyYXkgY2hhbmdlcyBieSBj
aGFuZ2luZyB0aGUgc3ludGF4IG9mIHRoZSBwcm9wZXJ0eSB0bwotICBgLm9ic2VydmVzKCcqbXlQ
cm9wZXJ0eS5bXScpYC4KKyAgICAgIGlmIChjb25maWcuaW5zdHJ1bWVudCkgeworICAgICAgICBp
bnN0cnVtZW50KCdjcmVhdGVkJywgdGhpcyk7CisgICAgICB9CiAKLSAgVG8gc3VwcG9ydCBgRW1i
ZXIuQXJyYXlgIGluIHlvdXIgb3duIGNsYXNzLCB5b3UgbXVzdCBvdmVycmlkZSB0d28KLSAgcHJp
bWl0aXZlcyB0byB1c2UgaXQ6IGByZXBsYWNlKClgIGFuZCBgb2JqZWN0QXQoKWAuCisgICAgICBp
ZiAobm9vcCAhPT0gcmVzb2x2ZXIpIHsKKyAgICAgICAgaW52b2tlUmVzb2x2ZXIocmVzb2x2ZXIs
IHRoaXMpOworICAgICAgfQorICAgIH0KIAotICBOb3RlIHRoYXQgdGhlIEVtYmVyLkFycmF5IG1p
eGluIGFsc28gaW5jb3Jwb3JhdGVzIHRoZSBgRW1iZXIuRW51bWVyYWJsZWAKLSAgbWl4aW4uIEFs
bCBgRW1iZXIuQXJyYXlgLWxpa2Ugb2JqZWN0cyBhcmUgYWxzbyBlbnVtZXJhYmxlLgorICAgIGZ1
bmN0aW9uIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNlKSB7CisgICAgICBmdW5jdGlv
biByZXNvbHZlUHJvbWlzZSh2YWx1ZSkgeworICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVl
KTsKKyAgICAgIH0KIAotICBAY2xhc3MgQXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5NaXhpbgotICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0gIEBzaW5jZSBFbWJl
ciAwLjkuMAotKi8KLUVtYmVyLkFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkVudW1l
cmFibGUsIC8qKiBAc2NvcGUgRW1iZXIuQXJyYXkucHJvdG90eXBlICovIHsKKyAgICAgIGZ1bmN0
aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7CisgICAgICAgIHJlamVjdChwcm9taXNlLCByZWFz
b24pOworICAgICAgfQogCi0gIC8vIGNvbXBhdGliaWxpdHkKLSAgaXNTQ0FycmF5OiB0cnVlLAor
ICAgICAgdHJ5IHsKKyAgICAgICAgcmVzb2x2ZXIocmVzb2x2ZVByb21pc2UsIHJlamVjdFByb21p
c2UpOworICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgIHJlamVjdFByb21pc2UoZSk7CisgICAg
ICB9CisgICAgfQogCi0gIC8qKgotICAgIFlvdXIgYXJyYXkgbXVzdCBzdXBwb3J0IHRoZSBgbGVu
Z3RoYCBwcm9wZXJ0eS4gWW91ciByZXBsYWNlIG1ldGhvZHMgc2hvdWxkCi0gICAgc2V0IHRoaXMg
cHJvcGVydHkgd2hlbmV2ZXIgaXQgY2hhbmdlcy4KKyAgICBQcm9taXNlLmNhc3QgPSBjYXN0Owor
ICAgIFByb21pc2UuYWxsID0gYWxsOworICAgIFByb21pc2UucmFjZSA9IHJhY2U7CisgICAgUHJv
bWlzZS5yZXNvbHZlID0gUmVzb2x2ZTsKKyAgICBQcm9taXNlLnJlamVjdCA9IFJlamVjdDsKIAot
ICAgIEBwcm9wZXJ0eSB7TnVtYmVyfSBsZW5ndGgKLSAgKi8KLSAgbGVuZ3RoOiBFbWJlci5yZXF1
aXJlZCgpLAorICAgIHZhciBQRU5ESU5HICAgPSB2b2lkIDA7CisgICAgdmFyIFNFQUxFRCAgICA9
IDA7CisgICAgdmFyIEZVTEZJTExFRCA9IDE7CisgICAgdmFyIFJFSkVDVEVEICA9IDI7CiAKLSAg
LyoqCi0gICAgUmV0dXJucyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBgaW5kZXhgLiBJZiB0aGUg
Z2l2ZW4gYGluZGV4YCBpcyBuZWdhdGl2ZQotICAgIG9yIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhh
biB0aGUgYXJyYXkgbGVuZ3RoLCByZXR1cm5zIGB1bmRlZmluZWRgLgorICAgIGZ1bmN0aW9uIHN1
YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikgeworICAg
ICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVyczsKKyAgICAgIHZhciBsZW5n
dGggPSBzdWJzY3JpYmVycy5sZW5ndGg7CiAKLSAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0
aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIElm
IHlvdXIgb2JqZWN0IHN1cHBvcnRzIHJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGFycmF5IGl0
ZW0gdXNpbmcgYGdldCgpYAotICAgIChpLmUuIGBteUFycmF5LmdldCgwKWApLCB0aGVuIHlvdSBk
byBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICB5b3Vyc2VsZi4KKyAgICAg
IHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDsKKyAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCAr
IEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50OworICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsg
UkVKRUNURURdICA9IG9uUmVqZWN0aW9uOworICAgIH0KIAotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycsICdkJ107Ci0gICAgYXJyLm9iamVjdEF0KDApOyAg
IC8vICJhIgotICAgIGFyci5vYmplY3RBdCgzKTsgICAvLyAiZCIKLSAgICBhcnIub2JqZWN0QXQo
LTEpOyAgLy8gdW5kZWZpbmVkCi0gICAgYXJyLm9iamVjdEF0KDQpOyAgIC8vIHVuZGVmaW5lZAot
ICAgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQKLSAgICBgYGAKKyAgICBmdW5jdGlv
biBwdWJsaXNoKHByb21pc2UsIHNldHRsZWQpIHsKKyAgICAgIHZhciBjaGlsZCwgY2FsbGJhY2ss
IHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnMsIGRldGFpbCA9IHByb21pc2UuX2Rl
dGFpbDsKIAotICAgIEBtZXRob2Qgb2JqZWN0QXQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRo
ZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4uCi0gICovCi0gIG9iamVjdEF0OiBmdW5jdGlv
bihpZHgpIHsKLSAgICBpZiAoKGlkeCA8IDApIHx8IChpZHg+PWdldCh0aGlzLCAnbGVuZ3RoJykp
KSByZXR1cm4gdW5kZWZpbmVkIDsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGlkeCk7Ci0gIH0sCisg
ICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKKyAgICAgICAgaW5zdHJ1bWVudChzZXR0bGVk
ID09PSBGVUxGSUxMRUQgPyAnZnVsZmlsbGVkJyA6ICdyZWplY3RlZCcsIHByb21pc2UpOworICAg
ICAgfQogCi0gIC8qKgotICAgIFRoaXMgcmV0dXJucyB0aGUgb2JqZWN0cyBhdCB0aGUgc3BlY2lm
aWVkIGluZGV4ZXMsIHVzaW5nIGBvYmplY3RBdGAuCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAzKSB7CisgICAgICAgIGNoaWxkID0gc3Vic2NyaWJl
cnNbaV07CisgICAgICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdOwogCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107Ci0g
ICAgYXJyLm9iamVjdHNBdChbMCwgMSwgMl0pOyAgLy8gWyJhIiwgImIiLCAiYyJdCi0gICAgYXJy
Lm9iamVjdHNBdChbMiwgMywgNF0pOyAgLy8gWyJjIiwgImQiLCB1bmRlZmluZWRdCi0gICAgYGBg
CisgICAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWls
KTsKKyAgICAgIH0KIAotICAgIEBtZXRob2Qgb2JqZWN0c0F0Ci0gICAgQHBhcmFtIHtBcnJheX0g
aW5kZXhlcyBBbiBhcnJheSBvZiBpbmRleGVzIG9mIGl0ZW1zIHRvIHJldHVybi4KLSAgICovCi0g
IG9iamVjdHNBdDogZnVuY3Rpb24oaW5kZXhlcykgewotICAgIHZhciBzZWxmID0gdGhpczsKLSAg
ICByZXR1cm4gbWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGlkeCl7IHJldHVybiBzZWxmLm9iamVjdEF0
KGlkeCk7IH0pOwotICB9LAorICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMgPSBudWxsOworICAg
IH0KIAotICAvLyBvdmVycmlkZXMgRW1iZXIuRW51bWVyYWJsZSB2ZXJzaW9uCi0gIG5leHRPYmpl
Y3Q6IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVybiB0aGlzLm9iamVjdEF0KGlkeCk7Ci0gIH0s
CisgICAgUHJvbWlzZS5wcm90b3R5cGUgPSB7CisgICAgICBjb25zdHJ1Y3RvcjogUHJvbWlzZSwK
IAotICAvKioKLSAgICBUaGlzIGlzIHRoZSBoYW5kbGVyIGZvciB0aGUgc3BlY2lhbCBhcnJheSBj
b250ZW50IHByb3BlcnR5LiBJZiB5b3UgZ2V0Ci0gICAgdGhpcyBwcm9wZXJ0eSwgaXQgd2lsbCBy
ZXR1cm4gdGhpcy4gSWYgeW91IHNldCB0aGlzIHByb3BlcnR5IGl0IGEgbmV3Ci0gICAgYXJyYXks
IGl0IHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBjb250ZW50LgorICAgICAgX2lkOiB1bmRlZmlu
ZWQsCisgICAgICBfZ3VpZEtleTogZ3VpZEtleSwKKyAgICAgIF9sYWJlbDogdW5kZWZpbmVkLAog
Ci0gICAgVGhpcyBwcm9wZXJ0eSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcHJvcGVydHkgZGVmaW5l
ZCBpbiBgRW1iZXIuRW51bWVyYWJsZWAuCisgICAgICBfc3RhdGU6IHVuZGVmaW5lZCwKKyAgICAg
IF9kZXRhaWw6IHVuZGVmaW5lZCwKKyAgICAgIF9zdWJzY3JpYmVyczogdW5kZWZpbmVkLAogCi0g
ICAgQHByb3BlcnR5IFtdCi0gICovCi0gICdbXSc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtl
eSwgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBsYWNlKDAs
IGdldCh0aGlzLCAnbGVuZ3RoJyksIHZhbHVlKSA7Ci0gICAgcmV0dXJuIHRoaXMgOwotICB9KSwK
KyAgICAgIF9vbmVycm9yOiBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIGNvbmZpZy50cmln
Z2VyKCdlcnJvcicsIHJlYXNvbik7CisgICAgICB9LAogCi0gIGZpcnN0T2JqZWN0OiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5vYmplY3RBdCgwKTsKLSAgfSks
CisgICAgLyoqCisgICAgICBUaGUgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHBy
b21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwKKyAgICAgIHdoaWNoIHJlZ2lzdGVy
cyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUg
b3IgdGhlCisgICAgICByZWFzb24gd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQu
CisKKyAgICAgIGBgYGpzCisgICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7Cisg
ICAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlCisgICAgICB9LCBmdW5jdGlvbihyZWFzb24pewor
ICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91IGFyZSBnaXZlbiB0aGUgcmVh
c29uIHdoeQorICAgICAgfSk7CisgICAgICBgYGAKIAotICBsYXN0T2JqZWN0OiBFbWJlci5jb21w
dXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5vYmplY3RBdChnZXQodGhpcywgJ2xl
bmd0aCcpLTEpOwotICB9KSwKKyAgICAgIENoYWluaW5nCisgICAgICAtLS0tLS0tLQorCisgICAg
ICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBz
ZWNvbmQsICJkb3duc3RyZWFtIgorICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSBy
ZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudAorICAgICAgb3Ig
cmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBl
eGNlcHRpb24uCisKKyAgICAgIGBgYGpzCisgICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24g
KHVzZXIpIHsKKyAgICAgICAgcmV0dXJuIHVzZXIubmFtZTsKKyAgICAgIH0sIGZ1bmN0aW9uIChy
ZWFzb24pIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IG5hbWUiOworICAgICAgfSkudGhlbihm
dW5jdGlvbiAodXNlck5hbWUpIHsKKyAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQs
IGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdAorICAgICAg
ICAvLyB3aWxsIGJlIGAiZGVmYXVsdCBuYW1lImAKKyAgICAgIH0pOwogCi0gIC8vIG9wdGltaXpl
ZCB2ZXJzaW9uIGZyb20gRW51bWVyYWJsZQotICBjb250YWluczogZnVuY3Rpb24ob2JqKXsKLSAg
ICByZXR1cm4gdGhpcy5pbmRleE9mKG9iaikgPj0gMDsKLSAgfSwKKyAgICAgIGZpbmRVc2VyKCku
dGhlbihmdW5jdGlvbiAodXNlcikgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZvdW5kIHVz
ZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Iik7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7Cisg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5o
YXBweSIpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgLy8gbmV2
ZXIgcmVhY2hlZAorICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAvLyBpZiBg
ZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAiRm91bmQgdXNlciwgYnV0IHN0
aWxsIHVuaGFwcHkiLgorICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29u
YCB3aWxsIGJlICJgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Ii4KKyAgICAg
IH0pOworICAgICAgYGBgCisgICAgICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90
IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBw
cm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS4KKworICAgICAgYGBganMKKyAgICAgIGZpbmRV
c2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikgeworICAgICAgICB0aHJvdyBuZXcgUGVkYWdvZ2lj
YWxFeGNlcHRpb24oIlVwc3RyZWFtIGVycm9yIik7CisgICAgICB9KS50aGVuKGZ1bmN0aW9uICh2
YWx1ZSkgeworICAgICAgICAvLyBuZXZlciByZWFjaGVkCisgICAgICB9KS50aGVuKGZ1bmN0aW9u
ICh2YWx1ZSkgeworICAgICAgICAvLyBuZXZlciByZWFjaGVkCisgICAgICB9LCBmdW5jdGlvbiAo
cmVhc29uKSB7CisgICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHByb3Bh
Z2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlCisgICAgICB9KTsKKyAgICAgIGBgYAogCi0g
IC8vIEFkZCBhbnkgZXh0cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0aGF0IGFyZSBuYXRpdmUg
dG8gdGhlIGJ1aWx0LWluIEFycmF5LgotICAvKioKLSAgICBSZXR1cm5zIGEgbmV3IGFycmF5IHRo
YXQgaXMgYSBzbGljZSBvZiB0aGUgcmVjZWl2ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICB1
c2VzIHRoZSBvYnNlcnZhYmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG9iamVjdHMg
Zm9yIHRoZSBuZXcKLSAgICBzbGljZS4KKyAgICAgIEFzc2ltaWxhdGlvbgorICAgICAgLS0tLS0t
LS0tLS0tCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsncmVkJywgJ2dyZWVu
JywgJ2JsdWUnXTsKLSAgICBhcnIuc2xpY2UoMCk7ICAgICAgIC8vIFsncmVkJywgJ2dyZWVuJywg
J2JsdWUnXQotICAgIGFyci5zbGljZSgwLCAyKTsgICAgLy8gWydyZWQnLCAnZ3JlZW4nXQotICAg
IGFyci5zbGljZSgxLCAxMDApOyAgLy8gWydncmVlbicsICdibHVlJ10KLSAgICBgYGAKKyAgICAg
IFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVh
bSBwcm9taXNlIGNhbiBvbmx5IGJlCisgICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRo
aXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlCisgICAgICBm
dWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3
aWxsIHRoZW4gYmUgcGVuZGluZworICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMg
c2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouCiAKLSAgICBAbWV0aG9kIHNs
aWNlCi0gICAgQHBhcmFtIGJlZ2luSW5kZXgge0ludGVnZXJ9IChPcHRpb25hbCkgaW5kZXggdG8g
YmVnaW4gc2xpY2luZyBmcm9tLgotICAgIEBwYXJhbSBlbmRJbmRleCB7SW50ZWdlcn0gKE9wdGlv
bmFsKSBpbmRleCB0byBlbmQgdGhlIHNsaWNlIGF0LgotICAgIEByZXR1cm4ge0FycmF5fSBOZXcg
YXJyYXkgd2l0aCBzcGVjaWZpZWQgc2xpY2UKLSAgKi8KLSAgc2xpY2U6IGZ1bmN0aW9uKGJlZ2lu
SW5kZXgsIGVuZEluZGV4KSB7Ci0gICAgdmFyIHJldCA9IFtdOwotICAgIHZhciBsZW5ndGggPSBn
ZXQodGhpcywgJ2xlbmd0aCcpIDsKLSAgICBpZiAobm9uZShiZWdpbkluZGV4KSkgYmVnaW5JbmRl
eCA9IDAgOwotICAgIGlmIChub25lKGVuZEluZGV4KSB8fCAoZW5kSW5kZXggPiBsZW5ndGgpKSBl
bmRJbmRleCA9IGxlbmd0aCA7Ci0gICAgd2hpbGUoYmVnaW5JbmRleCA8IGVuZEluZGV4KSB7Ci0g
ICAgICByZXRbcmV0Lmxlbmd0aF0gPSB0aGlzLm9iamVjdEF0KGJlZ2luSW5kZXgrKykgOwotICAg
IH0KLSAgICByZXR1cm4gcmV0IDsKLSAgfSwKKyAgICAgIGBgYGpzCisgICAgICBmaW5kVXNlcigp
LnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0
aG9yKHVzZXIpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKKyAgICAgICAg
Ly8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZQorICAgICAgfSk7CisgICAg
ICBgYGAKIAotICAvKioKLSAgICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0
J3MgZmlyc3Qgb2NjdXJyZW5jZS4KLSAgICBJZiBubyBgc3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2
ZW4sIHRoZSBzdGFydGluZyBsb2NhdGlvbiB0bwotICAgIHNlYXJjaCBpcyAwLiBJZiBpdCdzIG5l
Z2F0aXZlLCB3aWxsIGNvdW50IGJhY2t3YXJkIGZyb20KLSAgICB0aGUgZW5kIG9mIHRoZSBhcnJh
eS4gUmV0dXJucyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KKyAgICAgIElmIHRoZSBhc3NpbWxp
YXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFs
c28gcmVqZWN0LgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIs
ICJjIiwgImQiLCAiYSJdOwotICAgIGFyci5pbmRleE9mKCJhIik7ICAgICAgIC8vICAwCi0gICAg
YXJyLmluZGV4T2YoInoiKTsgICAgICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDIpOyAg
ICAvLyAgNAotICAgIGFyci5pbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0Ci0gICAgYXJyLmluZGV4
T2YoImIiLCAzKTsgICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDEwMCk7ICAvLyAtMQot
ICAgIGBgYAorICAgICAgYGBganMKKyAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNl
cikgeworICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7CisgICAgICB9
KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykgeworICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRz
QnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZlIHRoZSB2YWx1ZSBoZXJlCisgICAgICB9LCBm
dW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAg
cmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmUKKyAgICAgIH0pOworICAgICAgYGBg
CiAKLSAgICBAbWV0aG9kIGluZGV4T2YKLSAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBp
dGVtIHRvIHNlYXJjaCBmb3IKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnRBdCBvcHRpb25hbCBz
dGFydGluZyBsb2NhdGlvbiB0byBzZWFyY2gsIGRlZmF1bHQgMAotICAgIEByZXR1cm4ge051bWJl
cn0gaW5kZXggb3IgLTEgaWYgbm90IGZvdW5kCi0gICovCi0gIGluZGV4T2Y6IGZ1bmN0aW9uKG9i
amVjdCwgc3RhcnRBdCkgewotICAgIHZhciBpZHgsIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7
CisgICAgICBTaW1wbGUgRXhhbXBsZQorICAgICAgLS0tLS0tLS0tLS0tLS0KIAotICAgIGlmIChz
dGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSAwOwotICAgIGlmIChzdGFydEF0IDwgMCkg
c3RhcnRBdCArPSBsZW47CisgICAgICBTeW5jaHJvbm91cyBFeGFtcGxlCiAKLSAgICBmb3IoaWR4
PXN0YXJ0QXQ7aWR4PGxlbjtpZHgrKykgewotICAgICAgaWYgKHRoaXMub2JqZWN0QXQoaWR4LCB0
cnVlKSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9
LAorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHJlc3VsdDsKIAotICAvKioKLSAgICBS
ZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgbGFzdCBvY2N1cnJlbmNlLgot
ICAgIElmIG5vIGBzdGFydEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHNlYXJjaCBzdGFydHMg
ZnJvbQotICAgIHRoZSBsYXN0IHBvc2l0aW9uLiBJZiBpdCdzIG5lZ2F0aXZlLCB3aWxsIGNvdW50
IGJhY2t3YXJkCi0gICAgZnJvbSB0aGUgZW5kIG9mIHRoZSBhcnJheS4gUmV0dXJucyAtMSBpZiBu
byBtYXRjaCBpcyBmb3VuZC4KKyAgICAgIHRyeSB7CisgICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1
bHQoKTsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAgfSBjYXRjaChyZWFzb24pIHsKKyAgICAg
ICAgLy8gZmFpbHVyZQorICAgICAgfQorICAgICAgYGBgCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiLCAiZCIsICJhIl07Ci0gICAgYXJyLmxhc3RJbmRl
eE9mKCJhIik7ICAgICAgIC8vICA0Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJ6Iik7ICAgICAgIC8v
IC0xCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgMik7ICAgIC8vICAwCi0gICAgYXJyLmxhc3RJ
bmRleE9mKCJhIiwgLTEpOyAgIC8vICA0Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJiIiwgMyk7ICAg
IC8vICAxCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgMTAwKTsgIC8vICA0Ci0gICAgYGBgCisg
ICAgICBFcnJiYWNrIEV4YW1wbGUKIAotICAgIEBtZXRob2QgbGFzdEluZGV4T2YKLSAgICBAcGFy
YW0ge09iamVjdH0gb2JqZWN0IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3IKLSAgICBAcGFyYW0ge051
bWJlcn0gc3RhcnRBdCBvcHRpb25hbCBzdGFydGluZyBsb2NhdGlvbiB0byBzZWFyY2gsIGRlZmF1
bHQgMAotICAgIEByZXR1cm4ge051bWJlcn0gaW5kZXggb3IgLTEgaWYgbm90IGZvdW5kCi0gICov
Ci0gIGxhc3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4
LCBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOworICAgICAgYGBganMKKyAgICAgIGZpbmRSZXN1
bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpeworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAg
Ly8gZmFpbHVyZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAg
ICAgfQorICAgICAgfSk7CisgICAgICBgYGAKIAotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmlu
ZWQgfHwgc3RhcnRBdCA+PSBsZW4pIHN0YXJ0QXQgPSBsZW4tMTsKLSAgICBpZiAoc3RhcnRBdCA8
IDApIHN0YXJ0QXQgKz0gbGVuOworICAgICAgUHJvbWlzZSBFeGFtcGxlOwogCi0gICAgZm9yKGlk
eD1zdGFydEF0O2lkeD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXMub2JqZWN0QXQoaWR4KSA9
PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAorICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0
KXsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKKyAgICAg
ICAgLy8gZmFpbHVyZQorICAgICAgfSk7CisgICAgICBgYGAKIAotICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIEFSUkFZ
IE9CU0VSVkVSUwotICAvLworICAgICAgQWR2YW5jZWQgRXhhbXBsZQorICAgICAgLS0tLS0tLS0t
LS0tLS0KIAotICAvKioKLSAgICBBZGRzIGFuIGFycmF5IG9ic2VydmVyIHRvIHRoZSByZWNlaXZp
bmcgYXJyYXkuIFRoZSBhcnJheSBvYnNlcnZlciBvYmplY3QKLSAgICBub3JtYWxseSBtdXN0IGlt
cGxlbWVudCB0d28gbWV0aG9kczoKKyAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGUKIAotICAgICog
YGFycmF5V2lsbENoYW5nZShzdGFydCwgcmVtb3ZlQ291bnQsIGFkZENvdW50KWAgLSBUaGlzIG1l
dGhvZCB3aWxsIGJlCi0gICAgICBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGFycmF5IGlzIG1vZGlm
aWVkLgotICAgICogYGFycmF5RGlkQ2hhbmdlKHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQp
YCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhcnJh
eSBpcyBtb2RpZmllZC4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBhdXRob3IsIGJv
b2tzOwogCi0gICAgQm90aCBjYWxsYmFja3Mgd2lsbCBiZSBwYXNzZWQgdGhlIHN0YXJ0aW5nIGlu
ZGV4IG9mIHRoZSBjaGFuZ2UgYXMgd2VsbCBhCi0gICAgYSBjb3VudCBvZiB0aGUgaXRlbXMgdG8g
YmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNlIHRoZXNlIGNhbGxiYWNrcwotICAgIHRv
IG9wdGlvbmFsbHkgaW5zcGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFuZ2UsIGNsZWFyIGNh
Y2hlcywgb3IgZG8KLSAgICBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNzYXJ5LgorICAgICAg
dHJ5IHsKKyAgICAgICAgYXV0aG9yID0gZmluZEF1dGhvcigpOworICAgICAgICBib29rcyAgPSBm
aW5kQm9va3NCeUF1dGhvcihhdXRob3IpOworICAgICAgICAvLyBzdWNjZXNzCisgICAgICB9IGNh
dGNoKHJlYXNvbikgeworICAgICAgICAvLyBmYWlsdXJlCisgICAgICB9CisgICAgICBgYGAKIAot
ICAgIEluIGFkZGl0aW9uIHRvIHBhc3NpbmcgYSB0YXJnZXQsIHlvdSBjYW4gYWxzbyBpbmNsdWRl
IGFuIG9wdGlvbnMgaGFzaAotICAgIHdoaWNoIHlvdSBjYW4gdXNlIHRvIG92ZXJyaWRlIHRoZSBt
ZXRob2QgbmFtZXMgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gdGhlCi0gICAgdGFyZ2V0LgorICAg
ICAgRXJyYmFjayBFeGFtcGxlCiAKLSAgICBAbWV0aG9kIGFkZEFycmF5T2JzZXJ2ZXIKLSAgICBA
cGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSBvYnNlcnZlciBvYmplY3QuCi0gICAgQHBhcmFtIHtI
YXNofSBvcHRzIE9wdGlvbmFsIGhhc2ggb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGlu
ZwotICAgICAgYHdpbGxDaGFuZ2VgLCBgZGlkQ2hhbmdlYCwgYW5kIGEgYGNvbnRleHRgIG9wdGlv
bi4KLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgYWRkQXJyYXlP
YnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7Ci0gICAgdmFyIHdpbGxDaGFuZ2UgPSAo
b3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdhcnJheVdpbGxDaGFuZ2UnLAotICAgICAgICBk
aWRDaGFuZ2UgID0gKG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UpIHx8ICdhcnJheURpZENoYW5nZSc7
CisgICAgICBgYGBqcwogCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzQXJy
YXlPYnNlcnZlcnMnKTsKLSAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlXaWxs
Q2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVtYmVyLmFkZExpc3RlbmVy
KHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKLSAgICBFbWJlci5h
ZGRMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKLSAg
ICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0Fy
cmF5T2JzZXJ2ZXJzJyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICBmdW5jdGlvbiBm
b3VuZEJvb2tzKGJvb2tzKSB7CiAKLSAgLyoqCi0gICAgUmVtb3ZlcyBhbiBhcnJheSBvYnNlcnZl
ciBmcm9tIHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKLSAgICByZWdpc3Rl
cmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgb2Jq
ZWN0IHdpbGwKLSAgICBoYXZlIG5vIGVmZmVjdC4KKyAgICAgIH0KIAotICAgIEBtZXRob2QgcmVt
b3ZlQXJyYXlPYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBv
YnNlcnZpbmcgdGhlIGFycmF5LgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgot
ICAqLwotICByZW1vdmVBcnJheU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsKLSAg
ICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2FycmF5V2ls
bENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5nZSkg
fHwgJ2FycmF5RGlkQ2hhbmdlJzsKKyAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7CiAK
LSAgICB2YXIgaGFzT2JzZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwot
ICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFz
QXJyYXlPYnNlcnZlcnMnKTsKLSAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGFycmF5
OmJlZm9yZScsIHRhcmdldCwgd2lsbENoYW5nZSk7Ci0gICAgRW1iZXIucmVtb3ZlTGlzdGVuZXIo
dGhpcywgJ0BhcnJheTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0gICAgaWYgKGhhc09i
c2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJz
Jyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICB9CiAKLSAgLyoqCi0gICAgQmVjb21l
cyB0cnVlIHdoZW5ldmVyIHRoZSBhcnJheSBjdXJyZW50bHkgaGFzIG9ic2VydmVycyB3YXRjaGlu
ZyBjaGFuZ2VzCi0gICAgb24gdGhlIGFycmF5LgorICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihh
dXRob3IsIGVycil7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICBmYWlsdXJlKGVycik7
CisgICAgICAgICAgLy8gZmFpbHVyZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyeSB7
CisgICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywg
ZXJyKSB7CisgICAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJl
KGVycik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAg
ICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpOworICAgICAgICAgICAgICAgIH0gY2F0
Y2gocmVhc29uKSB7CisgICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9
IGNhdGNoKGVycm9yKSB7CisgICAgICAgICAgICBmYWlsdXJlKGVycik7CisgICAgICAgICAgfQor
ICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKIAot
ICAgIEBwcm9wZXJ0eSBCb29sZWFuCi0gICovCi0gIGhhc0FycmF5T2JzZXJ2ZXJzOiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMs
ICdAYXJyYXk6Y2hhbmdlJykgfHwgRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6YmVm
b3JlJyk7Ci0gIH0pLAorICAgICAgUHJvbWlzZSBFeGFtcGxlOwogCi0gIC8qKgotICAgIElmIHlv
dSBhcmUgaW1wbGVtZW50aW5nIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGBFbWJlci5BcnJheWAs
IGNhbGwgdGhpcwotICAgIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgY29udGVudCBjaGFu
Z2VzIHRvIG5vdGlmeSBhbnkgb2JzZXJ2ZXJzIGFuZAotICAgIGludmFsaWRhdGUgYW55IHJlbGF0
ZWQgcHJvcGVydGllcy4gUGFzcyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGNoYW5nZQotICAg
IGFzIHdlbGwgYXMgYSBkZWx0YSBvZiB0aGUgYW1vdW50cyB0byBjaGFuZ2UuCisgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICBmaW5kQXV0aG9yKCkuCisgICAgICAgIHRoZW4oZmluZEJvb2tzQnlB
dXRob3IpLgorICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXsKKyAgICAgICAgICAvLyBmb3Vu
ZCBib29rcworICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKKyAgICAgICAgLy8gc29t
ZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgIH0pOworICAgICAgYGBgCiAKLSAgICBAbWV0aG9kIGFy
cmF5Q29udGVudFdpbGxDaGFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0
YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSB0aGF0IHdpbGwgY2hhbmdlLgotICAgIEBwYXJhbSB7
TnVtYmVyfSByZW1vdmVBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgcmVtb3Zl
ZC4gSWYgeW91IAotICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwCi0gICAgQHBhcmFtIHtOdW1i
ZXJ9IGFkZEFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBhZGRlZCAgSWYgeW91
IAotICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwLgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5
fSByZWNlaXZlcgotICAqLwotICBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5jdGlvbihzdGFy
dElkeCwgcmVtb3ZlQW10LCBhZGRBbXQpIHsKKyAgICAgIEBtZXRob2QgdGhlbgorICAgICAgQHBh
cmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVq
ZWN0ZWQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxh
YmVsaW5nIHRoZSBwcm9taXNlLgorICAgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJl
dHVybiB7UHJvbWlzZX0KKyAgICAqLworICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVu
dCwgb25SZWplY3Rpb24sIGxhYmVsKSB7CisgICAgICAgIHZhciBwcm9taXNlID0gdGhpczsKKyAg
ICAgICAgdGhpcy5fb25lcnJvciA9IG51bGw7CiAKLSAgICAvLyBpZiBubyBhcmdzIGFyZSBwYXNz
ZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hhbmdlcwotICAgIGlmIChzdGFydElkeD09PXVuZGVmaW5l
ZCkgewotICAgICAgc3RhcnRJZHggPSAwOwotICAgICAgcmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChyZW1vdmVBbXQgPT09IHVuZGVmaW5lZCkgcmVtb3Zl
QW10PS0xOwotICAgICAgaWYgKGFkZEFtdCAgICA9PT0gdW5kZWZpbmVkKSBhZGRBbXQ9LTE7Ci0g
ICAgfQorICAgICAgICB2YXIgdGhlblByb21pc2UgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29w
LCBsYWJlbCk7CiAKLSAgICAvLyBNYWtlIHN1cmUgdGhlIEBlYWNoIHByb3h5IGlzIHNldCB1cCBp
ZiBhbnlvbmUgaXMgb2JzZXJ2aW5nIEBlYWNoCi0gICAgaWYgKEVtYmVyLmlzV2F0Y2hpbmcodGhp
cywgJ0BlYWNoJykpIHsgZ2V0KHRoaXMsICdAZWFjaCcpOyB9CisgICAgICAgIGlmICh0aGlzLl9z
dGF0ZSkgeworICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBhcmd1bWVudHM7CisgICAgICAgICAg
Y29uZmlnLmFzeW5jKGZ1bmN0aW9uIGludm9rZVByb21pc2VDYWxsYmFjaygpIHsKKyAgICAgICAg
ICAgIGludm9rZUNhbGxiYWNrKHByb21pc2UuX3N0YXRlLCB0aGVuUHJvbWlzZSwgY2FsbGJhY2tz
W3Byb21pc2UuX3N0YXRlIC0gMV0sIHByb21pc2UuX2RldGFpbCk7CisgICAgICAgICAgfSk7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3Vic2NyaWJlKHRoaXMsIHRoZW5Qcm9taXNlLCBv
bkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7CisgICAgICAgIH0KIAotICAgIEVtYmVyLnNlbmRF
dmVudCh0aGlzLCAnQGFycmF5OmJlZm9yZScsIFt0aGlzLCBzdGFydElkeCwgcmVtb3ZlQW10LCBh
ZGRBbXRdKTsKKyAgICAgICAgaWYgKGNvbmZpZy5pbnN0cnVtZW50KSB7CisgICAgICAgICAgaW5z
dHJ1bWVudCgnY2hhaW5lZCcsIHByb21pc2UsIHRoZW5Qcm9taXNlKTsKKyAgICAgICAgfQogCi0g
ICAgdmFyIHJlbW92aW5nLCBsaW07Ci0gICAgaWYgKHN0YXJ0SWR4Pj0wICYmIHJlbW92ZUFtdD49
MCAmJiBnZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKSkgewotICAgICAgcmVtb3Zp
bmcgPSBbXTsKLSAgICAgIGxpbSA9IHN0YXJ0SWR4K3JlbW92ZUFtdDsKLSAgICAgIGZvcih2YXIg
aWR4PXN0YXJ0SWR4O2lkeDxsaW07aWR4KyspIHJlbW92aW5nLnB1c2godGhpcy5vYmplY3RBdChp
ZHgpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVtb3ZpbmcgPSByZW1vdmVBbXQ7Ci0gICAgfQor
ICAgICAgICByZXR1cm4gdGhlblByb21pc2U7CisgICAgICB9LAogCi0gICAgdGhpcy5lbnVtZXJh
YmxlQ29udGVudFdpbGxDaGFuZ2UocmVtb3ZpbmcsIGFkZEFtdCk7CisgICAgLyoqCisgICAgICBg
Y2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilg
IHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lCisgICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0
cnkvY2F0Y2ggc3RhdGVtZW50LgogCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICBgYGBq
cworICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpeworICAgICAgICB0aHJvdyBuZXcgRXJyb3Io
ImNvdWxkbid0IGZpbmQgdGhhdCBhdXRob3IiKTsKKyAgICAgIH0KIAotICBhcnJheUNvbnRlbnRE
aWRDaGFuZ2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgeworICAgICAg
Ly8gc3luY2hyb25vdXMKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmRBdXRob3IoKTsKKyAgICAg
IH0gY2F0Y2gocmVhc29uKSB7CisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nCisgICAg
ICB9CiAKLSAgICAvLyBpZiBubyBhcmdzIGFyZSBwYXNzZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hh
bmdlcwotICAgIGlmIChzdGFydElkeD09PXVuZGVmaW5lZCkgewotICAgICAgc3RhcnRJZHggPSAw
OwotICAgICAgcmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlm
IChyZW1vdmVBbXQgPT09IHVuZGVmaW5lZCkgcmVtb3ZlQW10PS0xOwotICAgICAgaWYgKGFkZEFt
dCAgICA9PT0gdW5kZWZpbmVkKSBhZGRBbXQ9LTE7Ci0gICAgfQorICAgICAgLy8gYXN5bmMgd2l0
aCBwcm9taXNlcworICAgICAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7Cisg
ICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICB9KTsKKyAgICAgIGBgYAogCi0g
ICAgdmFyIGFkZGluZywgbGltOwotICAgIGlmIChzdGFydElkeD49MCAmJiBhZGRBbXQ+PTAgJiYg
Z2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJykpIHsKLSAgICAgIGFkZGluZyA9IFtd
OwotICAgICAgbGltID0gc3RhcnRJZHgrYWRkQW10OwotICAgICAgZm9yKHZhciBpZHg9c3RhcnRJ
ZHg7aWR4PGxpbTtpZHgrKykgYWRkaW5nLnB1c2godGhpcy5vYmplY3RBdChpZHgpKTsKLSAgICB9
IGVsc2UgewotICAgICAgYWRkaW5nID0gYWRkQW10OwotICAgIH0KKyAgICAgIEBtZXRob2QgY2F0
Y2gKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCisgICAgICBAcGFyYW0ge1N0
cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAg
ICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAgIEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8K
KyAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uLCBsYWJlbCkgeworICAgICAgICBy
ZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uLCBsYWJlbCk7CisgICAgICB9LAogCi0g
ICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShyZW1vdmVBbXQsIGFkZGluZyk7Ci0g
ICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsICdAYXJyYXk6Y2hhbmdlJywgW3RoaXMsIHN0YXJ0SWR4
LCByZW1vdmVBbXQsIGFkZEFtdF0pOworICAgIC8qKgorICAgICAgYGZpbmFsbHlgIHdpbGwgYmUg
aW52b2tlZCByZWdhcmRsZXNzIG9mIHRoZSBwcm9taXNlJ3MgZmF0ZSBqdXN0IGFzIG5hdGl2ZQor
ICAgICAgdHJ5L2NhdGNoL2ZpbmFsbHkgYmVoYXZlcwogCi0gICAgdmFyIGxlbmd0aCAgICAgID0g
Z2V0KHRoaXMsICdsZW5ndGgnKSwKLSAgICAgICAgY2FjaGVkRmlyc3QgPSBjYWNoZUZvcih0aGlz
LCAnZmlyc3RPYmplY3QnKSwKLSAgICAgICAgY2FjaGVkTGFzdCAgPSBjYWNoZUZvcih0aGlzLCAn
bGFzdE9iamVjdCcpOwotICAgIGlmICh0aGlzLm9iamVjdEF0KDApICE9PSBjYWNoZWRGaXJzdCkg
ewotICAgICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOwot
ICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7Ci0gICAg
fQotICAgIGlmICh0aGlzLm9iamVjdEF0KGxlbmd0aC0xKSAhPT0gY2FjaGVkTGFzdCkgewotICAg
ICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0gICAgICBF
bWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOwotICAgIH0KKyAgICAg
IFN5bmNocm9ub3VzIGV4YW1wbGU6CiAKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgICAgIGBg
YGpzCisgICAgICBmaW5kQXV0aG9yKCkgeworICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDAu
NSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBuZXcgQXV0aG9yKCk7CisgICAgICB9CiAKLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBFTlVNRVJBVEVEIFBS
T1BFUlRJRVMKLSAgLy8KKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBmaW5kQXV0aG9yKCk7
IC8vIHN1Y2NlZWQgb3IgZmFpbAorICAgICAgfSBjYXRjaChlcnJvcikgeworICAgICAgICByZXR1
cm4gZmluZE90aGVyQXV0aGVyKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAvLyBhbHdh
eXMgcnVucworICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlCisgICAg
ICB9CisgICAgICBgYGAKIAotICAvKioKLSAgICBSZXR1cm5zIGEgc3BlY2lhbCBvYmplY3QgdGhh
dCBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGluZGl2aWR1YWwgcHJvcGVydGllcwotICAgIG9uIHRo
ZSBhcnJheS4gSnVzdCBnZXQgYW4gZXF1aXZhbGVudCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCBh
bmQgaXQgd2lsbAotICAgIHJldHVybiBhbiBlbnVtZXJhYmxlIHRoYXQgbWFwcyBhdXRvbWF0aWNh
bGx5IHRvIHRoZSBuYW1lZCBrZXkgb24gdGhlCi0gICAgbWVtYmVyIG9iamVjdHMuCisgICAgICBB
c3luY2hyb25vdXMgZXhhbXBsZToKIAotICAgIEBwcm9wZXJ0eSBAZWFjaAotICAqLwotICAnQGVh
Y2gnOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuX19lYWNoKSB0
aGlzLl9fZWFjaCA9IG5ldyBFbWJlci5FYWNoUHJveHkodGhpcyk7Ci0gICAgcmV0dXJuIHRoaXMu
X19lYWNoOwotICB9KQorICAgICAgYGBganMKKyAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5j
dGlvbihyZWFzb24peworICAgICAgICByZXR1cm4gZmluZE90aGVyQXV0aGVyKCk7CisgICAgICB9
KS5maW5hbGx5KGZ1bmN0aW9uKCl7CisgICAgICAgIC8vIGF1dGhvciB3YXMgZWl0aGVyIGZvdW5k
LCBvciBub3QKKyAgICAgIH0pOworICAgICAgYGBgCiAKLX0pIDsKKyAgICAgIEBtZXRob2QgZmlu
YWxseQorICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgICAqLwor
ICAgICAgJ2ZpbmFsbHknOiBmdW5jdGlvbihjYWxsYmFjaywgbGFiZWwpIHsKKyAgICAgICAgdmFy
IGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjsKIAotfSkoKTsKKyAgICAgICAgcmV0dXJu
IHRoaXMudGhlbihmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rv
ci5jYXN0KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKXsKKyAgICAgICAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAg
ICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmNhc3QoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigp
eworICAgICAgICAgICAgdGhyb3cgcmVhc29uOworICAgICAgICAgIH0pOworICAgICAgICB9LCBs
YWJlbCk7CisgICAgICB9CisgICAgfTsKIAorICAgIGZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHNl
dHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHsKKyAgICAgIHZhciBoYXNDYWxsYmFj
ayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLAorICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2Vl
ZGVkLCBmYWlsZWQ7CiAKKyAgICAgIGlmIChoYXNDYWxsYmFjaykgeworICAgICAgICB0cnkgewor
ICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soZGV0YWlsKTsKKyAgICAgICAgICBzdWNjZWVkZWQg
PSB0cnVlOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOwor
ICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg
dmFsdWUgPSBkZXRhaWw7CisgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7CisgICAgICB9CiAKLShm
dW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1l
Ci0qLworICAgICAgaWYgKGhhbmRsZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKSkgeworICAgICAg
ICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkgewor
ICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoZmFpbGVk
KSB7CisgICAgICAgIHJlamVjdChwcm9taXNlLCBlcnJvcik7CisgICAgICB9IGVsc2UgaWYgKHNl
dHRsZWQgPT09IEZVTEZJTExFRCkgeworICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsK
KyAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gUkVKRUNURUQpIHsKKyAgICAgICAgcmVqZWN0
KHByb21pc2UsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CiAKKyAgICBmdW5jdGlvbiBoYW5kbGVU
aGVuYWJsZShwcm9taXNlLCB2YWx1ZSkgeworICAgICAgdmFyIHRoZW4gPSBudWxsLAorICAgICAg
cmVzb2x2ZWQ7CiAKLS8qKgotICBJbXBsZW1lbnRzIHNvbWUgc3RhbmRhcmQgbWV0aG9kcyBmb3Ig
Y29tcGFyaW5nIG9iamVjdHMuIEFkZCB0aGlzIG1peGluIHRvCi0gIGFueSBjbGFzcyB5b3UgY3Jl
YXRlIHRoYXQgY2FuIGNvbXBhcmUgaXRzIGluc3RhbmNlcy4KKyAgICAgIHRyeSB7CisgICAgICAg
IGlmIChwcm9taXNlID09PSB2YWx1ZSkgeworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
IkEgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4iKTsK
KyAgICAgICAgfQogCi0gIFlvdSBzaG91bGQgaW1wbGVtZW50IHRoZSBgY29tcGFyZSgpYCBtZXRo
b2QuCisgICAgICAgIGlmIChvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkgeworICAgICAgICAgIHRo
ZW4gPSB2YWx1ZS50aGVuOwogCi0gIEBjbGFzcyBDb21wYXJhYmxlCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVy
LkNvbXBhcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoIC8qKiBAc2NvcGUgRW1iZXIuQ29tcGFy
YWJsZS5wcm90b3R5cGUgKi97CisgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhlbikpIHsKKyAg
ICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVuY3Rpb24odmFsKSB7CisgICAgICAgICAgICAg
IGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgICByZXNvbHZlZCA9
IHRydWU7CiAKLSAgLyoqCi0gICAgd2FsayBsaWtlIGEgZHVjay4gSW5kaWNhdGVzIHRoYXQgdGhl
IG9iamVjdCBjYW4gYmUgY29tcGFyZWQuCisgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdmFs
KSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWwpOworICAgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTsKKyAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfSwgZnVuY3Rpb24odmFsKSB7CisgICAgICAgICAgICAg
IGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgICByZXNvbHZlZCA9
IHRydWU7CiAKLSAgICBAcHJvcGVydHkgaXNDb21wYXJhYmxlCi0gICAgQHR5cGUgQm9vbGVhbgot
ICAgIEBkZWZhdWx0IHRydWUKLSAgKi8KLSAgaXNDb21wYXJhYmxlOiB0cnVlLAorICAgICAgICAg
ICAgICByZWplY3QocHJvbWlzZSwgdmFsKTsKKyAgICAgICAgICAgIH0sICdkZXJpdmVkIGZyb206
ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7CiAKLSAgLyoqCi0g
ICAgT3ZlcnJpZGUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gb2YgdGhl
IHR3byBwYXJhbWV0ZXJzLiBUaGUKLSAgICBjb21wYXJlIG1ldGhvZCBzaG91bGQgcmV0dXJuOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9
IGNhdGNoIChlcnJvcikgeworICAgICAgICBpZiAocmVzb2x2ZWQpIHsgcmV0dXJuIHRydWU7IH0K
KyAgICAgICAgcmVqZWN0KHByb21pc2UsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICB9CiAKLSAgICAtIGAtMWAgaWYgYGEgPCBiYAotICAgIC0gYDBgIGlmIGBhID09IGJgCi0g
ICAgLSBgMWAgaWYgYGEgPiBiYAorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIERl
ZmF1bHQgaW1wbGVtZW50YXRpb24gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICBmdW5jdGlvbiBy
ZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7CisgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHsK
KyAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKCFoYW5k
bGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpIHsKKyAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2
YWx1ZSk7CisgICAgICB9CisgICAgfQogCi0gICAgQG1ldGhvZCBjb21wYXJlCi0gICAgQHBhcmFt
IGEge09iamVjdH0gdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgQHBhcmFtIGIge09i
amVjdH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQotICAgIEByZXR1cm4ge0ludGVnZXJ9
IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KLSAgKi8KLSAgY29tcGFyZTogRW1iZXIucmVx
dWlyZWQoRnVuY3Rpb24pCisgICAgZnVuY3Rpb24gZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkgewor
ICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7IHJldHVybjsgfQorICAgICAg
cHJvbWlzZS5fc3RhdGUgPSBTRUFMRUQ7CisgICAgICBwcm9taXNlLl9kZXRhaWwgPSB2YWx1ZTsK
IAotfSk7CisgICAgICBjb25maWcuYXN5bmMocHVibGlzaEZ1bGZpbGxtZW50LCBwcm9taXNlKTsK
KyAgICB9CiAKKyAgICBmdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7CisgICAgICBp
ZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9CisgICAgICBwcm9taXNl
Ll9zdGF0ZSA9IFNFQUxFRDsKKyAgICAgIHByb21pc2UuX2RldGFpbCA9IHJlYXNvbjsKIAotfSko
KTsKKyAgICAgIGNvbmZpZy5hc3luYyhwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTsKKyAgICB9
CiAKKyAgICBmdW5jdGlvbiBwdWJsaXNoRnVsZmlsbG1lbnQocHJvbWlzZSkgeworICAgICAgcHVi
bGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRCk7CisgICAgfQogCisgICAg
ZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7CisgICAgICBpZiAocHJvbWlzZS5f
b25lcnJvcikgeworICAgICAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX2RldGFpbCk7Cisg
ICAgICB9CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCi0qLworICAgICAgcHVibGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9
IFJFSkVDVEVEKTsKKyAgICB9CisgIH0pOworZGVmaW5lKCJyc3ZwL3Byb21pc2UvYWxsIiwgCisg
IFsiLi4vdXRpbHMiLCJleHBvcnRzIl0sCisgIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19l
eHBvcnRzX18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVu
ZGVuY3kxX18uaXNBcnJheTsKKyAgICB2YXIgaXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFf
Xy5pc05vblRoZW5hYmxlOwogCisgICAgLyoqCisgICAgICBgUlNWUC5Qcm9taXNlLmFsbGAgYWNj
ZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGlj
aAorICAgICAgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVz
IGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBvcgorICAgICAgcmVqZWN0ZWQgd2l0aCB0aGUgcmVh
c29uIG9mIHRoZSBmaXJzdCBwYXNzZWQgcHJvbWlzZSB0byBiZSByZWplY3RlZC4gSXQgY2FzdHMg
YWxsCisgICAgICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFz
IGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCiAKKyAgICAgIEV4YW1wbGU6CiAKLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZh
ciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAu
cmVzb2x2ZSgyKTsKKyAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVzb2x2ZSgzKTsKKyAgICAg
IHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwogCi0vKioK
LSAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvcHlpbmcgYW4gb2JqZWN0
LiBBZGQgdGhpcyBtaXhpbiB0bwotICBhbnkgb2JqZWN0IHlvdSBjcmVhdGUgdGhhdCBjYW4gY3Jl
YXRlIGEgY29weSBvZiBpdHNlbGYuIFRoaXMgbWl4aW4gaXMKLSAgYWRkZWQgYXV0b21hdGljYWxs
eSB0byB0aGUgYnVpbHQtaW4gYXJyYXkuCisgICAgICBSU1ZQLlByb21pc2UuYWxsKHByb21pc2Vz
KS50aGVuKGZ1bmN0aW9uKGFycmF5KXsKKyAgICAgICAgLy8gVGhlIGFycmF5IGhlcmUgd291bGQg
YmUgWyAxLCAyLCAzIF07CisgICAgICB9KTsKKyAgICAgIGBgYAogCi0gIFlvdSBzaG91bGQgZ2Vu
ZXJhbGx5IGltcGxlbWVudCB0aGUgYGNvcHkoKWAgbWV0aG9kIHRvIHJldHVybiBhIGNvcHkgb2Yg
dGhlCi0gIHJlY2VpdmVyLgorICAgICAgSWYgYW55IG9mIHRoZSBgcHJvbWlzZXNgIGdpdmVuIHRv
IGBSU1ZQLmFsbGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQorICAgICAgdGhhdCBp
cyByZWplY3RlZCB3aWxsIGJlIGdpdmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSByZXR1cm5lZCBw
cm9taXNlcydzCisgICAgICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6CiAKLSAgTm90
ZSB0aGF0IGBmcm96ZW5Db3B5KClgIHdpbGwgb25seSB3b3JrIGlmIHlvdSBhbHNvIGltcGxlbWVu
dAotICBgRW1iZXIuRnJlZXphYmxlYC4KKyAgICAgIEV4YW1wbGU6CiAKLSAgQGNsYXNzIENvcHlh
YmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KLSAgQHNpbmNl
IEVtYmVyIDAuOQotKi8KLUVtYmVyLkNvcHlhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKAotLyoq
IEBzY29wZSBFbWJlci5Db3B5YWJsZS5wcm90b3R5cGUgKi8geworICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgdmFyIHByb21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOworICAgICAgdmFyIHByb21p
c2UyID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIyIikpOworICAgICAgdmFyIHByb21pc2UzID0g
UlNWUC5yZWplY3QobmV3IEVycm9yKCIzIikpOworICAgICAgdmFyIHByb21pc2VzID0gWyBwcm9t
aXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07CiAKLSAgLyoqCi0gICAgT3ZlcnJpZGUgdG8gcmV0
dXJuIGEgY29weSBvZiB0aGUgcmVjZWl2ZXIuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcmFpc2Vz
Ci0gICAgYW4gZXhjZXB0aW9uLgorICAgICAgUlNWUC5Qcm9taXNlLmFsbChwcm9taXNlcykudGhl
bihmdW5jdGlvbihhcnJheSl7CisgICAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1
c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQorICAgICAgfSwgZnVuY3Rpb24oZXJyb3Ip
IHsKKyAgICAgICAgLy8gZXJyb3IubWVzc2FnZSA9PT0gIjIiCisgICAgICB9KTsKKyAgICAgIGBg
YAogCi0gICAgQG1ldGhvZCBjb3B5Ci0gICAgQHBhcmFtIGRlZXAge0Jvb2xlYW59IGlmIGB0cnVl
YCwgYSBkZWVwIGNvcHkgb2YgdGhlIG9iamVjdCBzaG91bGQgYmUgbWFkZQotICAgIEByZXR1cm4g
e09iamVjdH0gY29weSBvZiByZWNlaXZlcgotICAqLwotICBjb3B5OiBFbWJlci5yZXF1aXJlZChG
dW5jdGlvbiksCisgICAgICBAbWV0aG9kIGFsbAorICAgICAgQGZvciBSU1ZQLlByb21pc2UKKyAg
ICAgIEBwYXJhbSB7QXJyYXl9IGVudHJpZXMgYXJyYXkgb2YgcHJvbWlzZXMKKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNl
LgorICAgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBgcHJvbWlzZXNgIGhhdmUgYmVlbgorICAg
ICAgZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkgb2YgdGhlbSBiZWNvbWUgcmVqZWN0ZWQu
CisgICAgICBAc3RhdGljCisgICAgKi8KKyAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVu
Y3Rpb24gYWxsKGVudHJpZXMsIGxhYmVsKSB7CiAKLSAgLyoqCi0gICAgSWYgdGhlIG9iamVjdCBp
bXBsZW1lbnRzIGBFbWJlci5GcmVlemFibGVgLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYSBuZXcK
LSAgICBjb3B5IGlmIHRoZSBvYmplY3QgaXMgbm90IGZyb3plbiBhbmQgdGhlIHJlY2VpdmVyIGlm
IHRoZSBvYmplY3QgaXMgZnJvemVuLgorICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8K
KyAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CiAKLSAgICBSYWlzZXMgYW4gZXhjZXB0aW9u
IGlmIHlvdSB0cnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBhIG9iamVjdCB0aGF0IGRvZXMKLSAg
ICBub3Qgc3VwcG9ydCBmcmVlemluZy4KKyAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVu
Y3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICAgIGlmICghaXNBcnJheShlbnRyaWVzKSkg
eworICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkg
dG8gYWxsLicpOworICAgICAgICB9CiAKLSAgICBZb3Ugc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB3
aGVuZXZlciB5b3Ugd2FudCBhIGNvcHkgb2YgYSBmcmVlemFibGUgb2JqZWN0Ci0gICAgc2luY2Ug
YSBmcmVlemFibGUgb2JqZWN0IGNhbiBzaW1wbHkgcmV0dXJuIGl0c2VsZiB3aXRob3V0IGFjdHVh
bGx5Ci0gICAgY29uc3VtaW5nIG1vcmUgbWVtb3J5LgorICAgICAgICB2YXIgcmVtYWluaW5nID0g
ZW50cmllcy5sZW5ndGg7CisgICAgICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KHJlbWFpbmlu
Zyk7CisgICAgICAgIHZhciBlbnRyeSwgcGVuZGluZyA9IHRydWU7CiAKLSAgICBAbWV0aG9kIGZy
b3plbkNvcHkKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNvcHkgb2YgcmVjZWl2ZXIgb3IgcmVjZWl2
ZXIKLSAgKi8KLSAgZnJvemVuQ29weTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKEVtYmVyLkZyZWV6
YWJsZSAmJiBFbWJlci5GcmVlemFibGUuZGV0ZWN0KHRoaXMpKSB7Ci0gICAgICByZXR1cm4gZ2V0
KHRoaXMsICdpc0Zyb3plbicpID8gdGhpcyA6IHRoaXMuY29weSgpLmZyZWV6ZSgpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoRW1iZXIuU3RyaW5nLmZtdCgiJUAgZG9lcyBu
b3Qgc3VwcG9ydCBmcmVlemluZyIsIFt0aGlzXSkpOwotICAgIH0KLSAgfQotfSk7CisgICAgICAg
IGlmIChyZW1haW5pbmcgPT09IDApIHsKKyAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOworICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi19KSgpOworICAgICAgICBmdW5jdGlvbiBmdWxm
aWxsbWVudEF0KGluZGV4KSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7Cisg
ICAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IHZhbHVlOworICAgICAgICAgICAgaWYgKC0tcmVt
YWluaW5nID09PSAwKSB7CisgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfQogCisgICAgICAgIGZ1bmN0aW9uIG9uUmVq
ZWN0aW9uKHJlYXNvbikgeworICAgICAgICAgIHJlbWFpbmluZyA9IDA7CisgICAgICAgICAgcmVq
ZWN0KHJlYXNvbik7CisgICAgICAgIH0KIAorICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGlu
ZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICBlbnRyeSA9IGVudHJp
ZXNbaW5kZXhdOworICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVudHJ5KSkgeworICAgICAg
ICAgICAgcmVzdWx0c1tpbmRleF0gPSBlbnRyeTsKKyAgICAgICAgICAgIGlmICgtLXJlbWFpbmlu
ZyA9PT0gMCkgeworICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOworICAgICAgICAgICAg
fQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb25zdHJ1Y3Rvci5jYXN0KGVudHJ5
KS50aGVuKGZ1bGZpbGxtZW50QXQoaW5kZXgpLCBvblJlamVjdGlvbik7CisgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICB9LCBsYWJlbCk7CisgICAgfTsKKyAgfSk7CitkZWZpbmUoInJzdnAv
cHJvbWlzZS9jYXN0IiwgCisgIFsiZXhwb3J0cyJdLAorICBmdW5jdGlvbihfX2V4cG9ydHNfXykg
eworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICAvKioKKyAgICAgIGBSU1ZQLlByb21pc2UuY2FzdGAg
Y29lcmNlcyBpdHMgYXJndW1lbnQgdG8gYSBwcm9taXNlLCBvciByZXR1cm5zIHRoZQorICAgICAg
YXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhIHByb21pc2Ugd2hpY2ggc2hhcmVzIGEgY29uc3Ry
dWN0b3Igd2l0aCB0aGUgY2FzdGVyLgogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KKyAgICAgIEV4YW1wbGU6CiAKKyAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBwcm9taXNlID0gUlNWUC5Qcm9taXNlLnJlc29sdmUo
MSk7CisgICAgICB2YXIgY2FzdGVkID0gUlNWUC5Qcm9taXNlLmNhc3QocHJvbWlzZSk7CiAKLXZh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKyAgICAgIGNvbnNvbGUubG9nKHBy
b21pc2UgPT09IGNhc3RlZCk7IC8vIHRydWUKKyAgICAgIGBgYAogCi0vKioKLSAgVGhlIGBFbWJl
ci5GcmVlemFibGVgIG1peGluIGltcGxlbWVudHMgc29tZSBiYXNpYyBtZXRob2RzIGZvciBtYXJr
aW5nIGFuCi0gIG9iamVjdCBhcyBmcm96ZW4uIE9uY2UgYW4gb2JqZWN0IGlzIGZyb3plbiBpdCBz
aG91bGQgYmUgcmVhZCBvbmx5LiBObyBjaGFuZ2VzCi0gIG1heSBiZSBtYWRlIHRoZSBpbnRlcm5h
bCBzdGF0ZSBvZiB0aGUgb2JqZWN0LgorICAgICAgSW4gdGhlIGNhc2Ugb2YgYSBwcm9taXNlIHdo
b3NlIGNvbnN0cnVjdG9yIGRvZXMgbm90IG1hdGNoLCBpdCBpcyBhc3NpbWlsYXRlZC4KKyAgICAg
IFRoZSByZXN1bHRpbmcgcHJvbWlzZSB3aWxsIGZ1bGZpbGwgb3IgcmVqZWN0IGJhc2VkIG9uIHRo
ZSBvdXRjb21lIG9mIHRoZQorICAgICAgcHJvbWlzZSBiZWluZyBjYXN0ZWQuCiAKLSAgIyMgRW5m
b3JjZW1lbnQKKyAgICAgIEV4YW1wbGU6CiAKLSAgVG8gZnVsbHkgc3VwcG9ydCBmcmVlemluZyBp
biB5b3VyIHN1YmNsYXNzLCB5b3UgbXVzdCBpbmNsdWRlIHRoaXMgbWl4aW4gYW5kCi0gIG92ZXJy
aWRlIGFueSBtZXRob2QgdGhhdCBtaWdodCBhbHRlciBhbnkgcHJvcGVydHkgb24gdGhlIG9iamVj
dCB0byBpbnN0ZWFkCi0gIHJhaXNlIGFuIGV4Y2VwdGlvbi4gWW91IGNhbiBjaGVjayB0aGUgc3Rh
dGUgb2YgYW4gb2JqZWN0IGJ5IGNoZWNraW5nIHRoZQotICBgaXNGcm96ZW5gIHByb3BlcnR5Lgor
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHRoZW5uYWJsZSA9ICQuZ2V0SlNPTignL2Fw
aS9mb28nKTsKKyAgICAgIHZhciBjYXN0ZWQgPSBSU1ZQLlByb21pc2UuY2FzdCh0aGVubmFibGUp
OwogCi0gIEFsdGhvdWdoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBKYXZhU2NyaXB0IG1heSBzdXBwb3J0
IGxhbmd1YWdlLWxldmVsIGZyZWV6aW5nCi0gIG9iamVjdCBvYmplY3RzLCB0aGF0IGlzIG5vdCB0
aGUgY2FzZSB0b2RheS4gRXZlbiBpZiBhbiBvYmplY3QgaXMgZnJlZXphYmxlLAotICBpdCBpcyBz
dGlsbCB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIG9iamVjdCwgZXZlbiB0aG91
Z2ggaXQgY291bGQKLSAgYnJlYWsgb3RoZXIgcGFydHMgb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0
IGRvIG5vdCBleHBlY3QgYSBmcm96ZW4gb2JqZWN0IHRvCi0gIGNoYW5nZS4gSXQgaXMsIHRoZXJl
Zm9yZSwgdmVyeSBpbXBvcnRhbnQgdGhhdCB5b3UgYWx3YXlzIHJlc3BlY3QgdGhlCi0gIGBpc0Zy
b3plbmAgcHJvcGVydHkgb24gYWxsIGZyZWV6YWJsZSBvYmplY3RzLgorICAgICAgY29uc29sZS5s
b2codGhlbm5hYmxlID09PSBjYXN0ZWQpOyAvLyBmYWxzZQorICAgICAgY29uc29sZS5sb2coY2Fz
dGVkIGluc3RhbmNlb2YgUlNWUC5Qcm9taXNlKSAvLyB0cnVlCiAKLSAgIyMgRXhhbXBsZSBVc2Fn
ZQorICAgICAgY2FzdGVkLnRoZW4oZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAvLyBkYXRhIGlz
IHRoZSB2YWx1ZSBnZXRKU09OIGZ1bGZpbGxzIHdpdGgKKyAgICAgIH0pOworICAgICAgYGBgCiAK
LSAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgYSBzaW1wbGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50
IHRoZSBgRW1iZXIuRnJlZXphYmxlYAotICBwcm90b2NvbC4KKyAgICAgIEluIHRoZSBjYXNlIG9m
IGEgbm9uLXByb21pc2UsIGEgcHJvbWlzZSB3aGljaCB3aWxsIGZ1bGZpbGwgd2l0aCB0aGF0IHZh
bHVlIGlzCisgICAgICByZXR1cm5lZC4KIAotICBgYGBqYXZhc2NyaXB0Ci0gIENvbnRhY3QgPSBF
bWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkZyZWV6YWJsZSwgewotICAgIGZpcnN0TmFtZTogbnVs
bCwKLSAgICBsYXN0TmFtZTogbnVsbCwKKyAgICAgIEV4YW1wbGU6CiAKLSAgICAvLyBzd2FwcyB0
aGUgbmFtZXMKLSAgICBzd2FwTmFtZXM6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMuZ2V0
KCdpc0Zyb3plbicpKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7Ci0gICAgICB2YXIgdG1wID0g
dGhpcy5nZXQoJ2ZpcnN0TmFtZScpOwotICAgICAgdGhpcy5zZXQoJ2ZpcnN0TmFtZScsIHRoaXMu
Z2V0KCdsYXN0TmFtZScpKTsKLSAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScsIHRtcCk7Ci0gICAg
ICByZXR1cm4gdGhpczsKLSAgICB9CisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgdmFs
dWUgPSAxOyAvLyBjb3VsZCBiZSBhIG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCB1bmRlZmluZWQu
Li4KKyAgICAgIHZhciBjYXN0ZWQgPSBSU1ZQLlByb21pc2UuY2FzdCh2YWx1ZSk7CiAKLSAgfSk7
CisgICAgICBjb25zb2xlLmxvZyh2YWx1ZSA9PT0gY2FzdGVkKTsgLy8gZmFsc2UKKyAgICAgIGNv
bnNvbGUubG9nKGNhc3RlZCBpbnN0YW5jZW9mIFJTVlAuUHJvbWlzZSkgLy8gdHJ1ZQogCi0gIGMg
PSBDb250ZXh0LmNyZWF0ZSh7IGZpcnN0TmFtZTogIkpvaG4iLCBsYXN0TmFtZTogIkRvZSIgfSk7
Ci0gIGMuc3dhcE5hbWVzKCk7ICAvLyByZXR1cm5zIGMKLSAgYy5mcmVlemUoKTsKLSAgYy5zd2Fw
TmFtZXMoKTsgIC8vIEVYQ0VQVElPTgotICBgYGAKKyAgICAgIGNhc3RlZC50aGVuKGZ1bmN0aW9u
KHZhbCkgeworICAgICAgICB2YWwgPT09IHZhbHVlIC8vID0+IHRydWUKKyAgICAgIH0pOworICAg
ICAgYGBgCiAKLSAgIyMgQ29weWluZworICAgICAgYFJTVlAuUHJvbWlzZS5jYXN0YCBpcyBzaW1p
bGFyIHRvIGBSU1ZQLlByb21pc2UucmVzb2x2ZWAsIGJ1dCBgUlNWUC5Qcm9taXNlLmNhc3RgIGRp
ZmZlcnMgaW4gdGhlCisgICAgICBmb2xsb3dpbmcgd2F5czoKKworICAgICAgKiBgUlNWUC5Qcm9t
aXNlLmNhc3RgIHNlcnZlcyBhcyBhIG1lbW9yeS1lZmZpY2llbnQgd2F5IG9mIGdldHRpbmcgYSBw
cm9taXNlLCB3aGVuIHlvdQorICAgICAgaGF2ZSBzb21ldGhpbmcgdGhhdCBjb3VsZCBlaXRoZXIg
YmUgYSBwcm9taXNlIG9yIGEgdmFsdWUuIFJTVlAucmVzb2x2ZQorICAgICAgd2lsbCBoYXZlIHRo
ZSBzYW1lIGVmZmVjdCBidXQgd2lsbCBjcmVhdGUgYSBuZXcgcHJvbWlzZSB3cmFwcGVyIGlmIHRo
ZQorICAgICAgYXJndW1lbnQgaXMgYSBwcm9taXNlLgorICAgICAgKiBgUlNWUC5Qcm9taXNlLmNh
c3RgIGlzIGEgd2F5IG9mIGNhc3RpbmcgaW5jb21pbmcgdGhlbmFibGVzIG9yIHByb21pc2Ugc3Vi
Y2xhc3NlcyB0bworICAgICAgcHJvbWlzZXMgb2YgdGhlIGV4YWN0IGNsYXNzIHNwZWNpZmllZCwg
c28gdGhhdCB0aGUgcmVzdWx0aW5nIG9iamVjdCdzIGB0aGVuYCBpcworICAgICAgZW5zdXJlZCB0
byBoYXZlIHRoZSBiZWhhdmlvciBvZiB0aGUgY29uc3RydWN0b3IgeW91IGFyZSBjYWxsaW5nIGNh
c3Qgb24gKGkuZS4sIFJTVlAuUHJvbWlzZSkuCisKKyAgICAgIEBtZXRob2QgY2FzdAorICAgICAg
QHBhcmFtIHtPYmplY3R9IG9iamVjdCB0byBiZSBjYXN0ZWQKKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAgICAg
VXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQorICAg
ICAgQHN0YXRpYworICAgICovCiAKLSAgVXN1YWxseSB0aGUgYEVtYmVyLkZyZWV6YWJsZWAgcHJv
dG9jb2wgaXMgaW1wbGVtZW50ZWQgaW4gY29vcGVyYXRpb24gd2l0aCB0aGUKLSAgYEVtYmVyLkNv
cHlhYmxlYCBwcm90b2NvbCwgd2hpY2ggZGVmaW5lcyBhIGBmcm96ZW5Db3B5KClgIG1ldGhvZCB0
aGF0IHdpbGwKLSAgcmV0dXJuIGEgZnJvemVuIG9iamVjdCwgaWYgdGhlIG9iamVjdCBpbXBsZW1l
bnRzIHRoaXMgbWV0aG9kIGFzIHdlbGwuCisgICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1
bmN0aW9uIGNhc3Qob2JqZWN0LCBsYWJlbCkgeworICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRy
dWUgKi8KKyAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CiAKLSAgQGNsYXNzIEZyZWV6YWJs
ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0gIEBzaW5jZSBF
bWJlciAwLjkKLSovCi1FbWJlci5GcmVlemFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoCi0vKiog
QHNjb3BlIEVtYmVyLkZyZWV6YWJsZS5wcm90b3R5cGUgKi8geworICAgICAgaWYgKG9iamVjdCAm
JiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENv
bnN0cnVjdG9yKSB7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICB9CiAKLSAgLyoqCi0g
ICAgU2V0IHRvIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgZnJvemVuLiBVc2UgdGhpcyBwcm9w
ZXJ0eSB0byBkZXRlY3QKLSAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZyb3plbiBvciBub3Qu
CisgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUpIHsKKyAgICAg
ICAgcmVzb2x2ZShvYmplY3QpOworICAgICAgfSwgbGFiZWwpOworICAgIH07CisgIH0pOworZGVm
aW5lKCJyc3ZwL3Byb21pc2UvcmFjZSIsIAorICBbIi4uL3V0aWxzIiwiZXhwb3J0cyJdLAorICBm
dW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBzdHJpY3Qi
OworICAgIC8qIGdsb2JhbCB0b1N0cmluZyAqLwogCi0gICAgQHByb3BlcnR5IGlzRnJvemVuCi0g
ICAgQHR5cGUgQm9vbGVhbgotICAqLwotICBpc0Zyb3plbjogZmFsc2UsCisgICAgdmFyIGlzQXJy
YXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKKyAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVw
ZW5kZW5jeTFfXy5pc0Z1bmN0aW9uOworICAgIHZhciBpc05vblRoZW5hYmxlID0gX19kZXBlbmRl
bmN5MV9fLmlzTm9uVGhlbmFibGU7CiAKLSAgLyoqCi0gICAgRnJlZXplcyB0aGUgb2JqZWN0LiBP
bmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB0aGUgb2JqZWN0IHNob3VsZAotICAgIG5v
IGxvbmdlciBhbGxvdyBhbnkgcHJvcGVydGllcyB0byBiZSBlZGl0ZWQuCisgICAgLyoqCisgICAg
ICBgUlNWUC5Qcm9taXNlLnJhY2VgIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaCBpcyBzZXR0
bGVkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUKKyAgICAgIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRv
IHNldHRsZS4KIAotICAgIEBtZXRob2QgZnJlZXplCi0gICAgQHJldHVybiB7T2JqZWN0fSByZWNl
aXZlcgotICAqLwotICBmcmVlemU6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2lz
RnJvemVuJykpIHJldHVybiB0aGlzOwotICAgIHNldCh0aGlzLCAnaXNGcm96ZW4nLCB0cnVlKTsK
LSAgICByZXR1cm4gdGhpczsKLSAgfQorICAgICAgRXhhbXBsZToKIAotfSk7CisgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICB2YXIgcHJvbWlzZTEgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9u
KHJlc29sdmUsIHJlamVjdCl7CisgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyAgICAg
ICAgICByZXNvbHZlKCJwcm9taXNlIDEiKTsKKyAgICAgICAgfSwgMjAwKTsKKyAgICAgIH0pOwog
Ci1FbWJlci5GUk9aRU5fRVJST1IgPSAiRnJvemVuIG9iamVjdCBjYW5ub3QgYmUgbW9kaWZpZWQu
IjsKKyAgICAgIHZhciBwcm9taXNlMiA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2
ZSwgcmVqZWN0KXsKKyAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpeworICAgICAgICAgIHJl
c29sdmUoInByb21pc2UgMiIpOworICAgICAgICB9LCAxMDApOworICAgICAgfSk7CiAKLX0pKCk7
CisgICAgICBSU1ZQLlByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5j
dGlvbihyZXN1bHQpeworICAgICAgICAvLyByZXN1bHQgPT09ICJwcm9taXNlIDIiIGJlY2F1c2Ug
aXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMQorICAgICAgICAvLyB3YXMgcmVzb2x2ZWQu
CisgICAgICB9KTsKKyAgICAgIGBgYAogCisgICAgICBgUlNWUC5Qcm9taXNlLnJhY2VgIGlzIGRl
dGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3QKKyAgICAgIHNl
dHRsZWQgcHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBsZSwgZXZlbiBpZiBvdGhlciBwcm9taXNl
cyBnaXZlbiB0byB0aGUKKyAgICAgIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQgYXJlIHJlc29s
dmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlzZSBoYXMKKyAgICAgIGJlY29tZSByZWpl
Y3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJlY2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1
cm5lZAorICAgICAgcHJvbWlzZSB3aWxsIGJlY29tZSByZWplY3RlZDoKKworICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgdmFyIHByb21pc2UxID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpeworICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICAg
ICAgcmVzb2x2ZSgicHJvbWlzZSAxIik7CisgICAgICAgIH0sIDIwMCk7CisgICAgICB9KTsKIAor
ICAgICAgdmFyIHByb21pc2UyID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpeworICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICAgICAgcmVqZWN0
KG5ldyBFcnJvcigicHJvbWlzZSAyIikpOworICAgICAgICB9LCAxMDApOworICAgICAgfSk7CiAK
LShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50
aW1lCi0qLworICAgICAgUlNWUC5Qcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRo
ZW4oZnVuY3Rpb24ocmVzdWx0KXsKKyAgICAgICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMKKyAg
ICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAi
cHJvbWlzZTIiIGJlY2F1c2UgcHJvbWlzZSAyIGJlY2FtZSByZWplY3RlZCBiZWZvcmUKKyAgICAg
ICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWQKKyAgICAgIH0pOworICAgICAgYGBgCiAK
LXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7CisgICAgICBBbiBl
eGFtcGxlIHJlYWwtd29ybGQgdXNlIGNhc2UgaXMgaW1wbGVtZW50aW5nIHRpbWVvdXRzOgogCi0v
KioKLSAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWluZyBnZW5lcmljIGVu
dW1lcmFibGVzLiBUaGVzZSBtZXRob2RzCi0gIGNhbiBiZSBhcHBsaWVkIHRvIGFuIG9iamVjdCBy
ZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgb3JkZXJlZCBvcgotICB1bm9yZGVyZWQuCisgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBSU1ZQLlByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24n
KSwgdGltZW91dCg1MDAwKV0pCisgICAgICBgYGAKIAotICBOb3RlIHRoYXQgYW4gRW51bWVyYWJs
ZSBjYW4gY2hhbmdlIGV2ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCi0g
IEZvciBleGFtcGxlLCBhIE1hcHBlZEVudW1lcmFibGUgY2Fubm90IGJlIGRpcmVjdGx5IG1vZGlm
aWVkIGJ1dCBpZiBpdHMKLSAgdW5kZXJseWluZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwg
Y2hhbmdlIGFsc28uCisgICAgICBAbWV0aG9kIHJhY2UKKyAgICAgIEBwYXJhbSB7QXJyYXl9IHBy
b21pc2VzIGFycmF5IG9mIHByb21pc2VzIHRvIG9ic2VydmUKKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGRlc2NyaWJpbmcgdGhlIHByb21pc2UgcmV0dXJu
ZWQuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgICBAcmV0dXJuIHtQcm9taXNlfSBh
IHByb21pc2Ugd2hpY2ggc2V0dGxlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0IHBhc3Nl
ZAorICAgICAgcHJvbWlzZSB0byBzZXR0bGUuCisgICAgICBAc3RhdGljCisgICAgKi8KKyAgICBf
X2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmFjZShlbnRyaWVzLCBsYWJlbCkgewor
ICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KKyAgICAgIHZhciBDb25zdHJ1Y3RvciA9
IHRoaXMsIGVudHJ5OwogCi0gICMjIEFkZGluZyBPYmplY3RzCisgICAgICByZXR1cm4gbmV3IENv
bnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgeworICAgICAgICBpZiAoIWlzQXJy
YXkoZW50cmllcykpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBw
YXNzIGFuIGFycmF5IHRvIHJhY2UuJyk7CisgICAgICAgIH0KIAotICBUbyBhZGQgYW4gb2JqZWN0
IHRvIGFuIGVudW1lcmFibGUsIHVzZSB0aGUgYGFkZE9iamVjdCgpYCBtZXRob2QuIFRoaXMKLSAg
bWV0aG9kIHdpbGwgb25seSBhZGQgdGhlIG9iamVjdCB0byB0aGUgZW51bWVyYWJsZSBpZiB0aGUg
b2JqZWN0IGlzIG5vdAotICBhbHJlYWR5IHByZXNlbnQgYW5kIHRoZSBvYmplY3QgaWYgb2YgYSB0
eXBlIHN1cHBvcnRlZCBieSB0aGUgZW51bWVyYWJsZS4KKyAgICAgICAgdmFyIHBlbmRpbmcgPSB0
cnVlOwogCi0gIGBgYGphdmFzY3JpcHQKLSAgc2V0LmFkZE9iamVjdChjb250YWN0KTsKLSAgYGBg
CisgICAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHsgaWYgKHBlbmRpbmcpIHsg
cGVuZGluZyA9IGZhbHNlOyByZXNvbHZlKHZhbHVlKTsgfSB9CisgICAgICAgIGZ1bmN0aW9uIG9u
UmVqZWN0aW9uKHJlYXNvbikgIHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyByZWpl
Y3QocmVhc29uKTsgfSB9CiAKLSAgIyMgUmVtb3ZpbmcgT2JqZWN0cworICAgICAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBlbnRyeSA9IGVu
dHJpZXNbaV07CisgICAgICAgICAgaWYgKGlzTm9uVGhlbmFibGUoZW50cnkpKSB7CisgICAgICAg
ICAgICBwZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICByZXNvbHZlKGVudHJ5KTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29uc3RydWN0
b3IuY2FzdChlbnRyeSkudGhlbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7CisgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICB9LCBsYWJlbCk7CisgICAgfTsKKyAgfSk7CitkZWZpbmUo
InJzdnAvcHJvbWlzZS9yZWplY3QiLCAKKyAgWyJleHBvcnRzIl0sCisgIGZ1bmN0aW9uKF9fZXhw
b3J0c19fKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIC8qKgorICAgICAgYFJTVlAuUHJvbWlz
ZS5yZWplY3RgIHJldHVybnMgYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhlIHBhc3NlZCBgcmVh
c29uYC4KKyAgICAgIEl0IGlzIHNob3J0aGFuZCBmb3IgdGhlIGZvbGxvd2luZzoKIAotICBUbyBy
ZW1vdmUgYW4gb2JqZWN0IGZvcm0gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0
KClgIG1ldGhvZC4gVGhpcwotICB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBvYmplY3QgaWYgaXQgaXMg
YWxyZWFkeSBpbiB0aGUgZW51bWVyYWJsZSwgb3RoZXJ3aXNlCi0gIHRoaXMgbWV0aG9kIGhhcyBu
byBlZmZlY3QuCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBS
U1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKKyAgICAgICAgcmVqZWN0KG5l
dyBFcnJvcignV0hPT1BTJykpOworICAgICAgfSk7CiAKLSAgYGBgamF2YXNjcmlwdAotICBzZXQu
cmVtb3ZlT2JqZWN0KGNvbnRhY3QpOwotICBgYGAKKyAgICAgIHByb21pc2UudGhlbihmdW5jdGlv
bih2YWx1ZSl7CisgICAgICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBw
cm9taXNlIGlzIHJlamVjdGVkIQorICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKKyAgICAgICAg
Ly8gcmVhc29uLm1lc3NhZ2UgPT09ICdXSE9PUFMnCisgICAgICB9KTsKKyAgICAgIGBgYAogCi0g
ICMjIEltcGxlbWVudGluZyBJbiBZb3VyIE93biBDb2RlCisgICAgICBJbnN0ZWFkIG9mIHdyaXRp
bmcgdGhlIGFib3ZlLCB5b3VyIGNvZGUgbm93IHNpbXBseSBiZWNvbWVzIHRoZSBmb2xsb3dpbmc6
CiAKLSAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IGFuZCB3YW50IHRvIHN1cHBv
cnQgdGhpcyBBUEksIGp1c3QgaW5jbHVkZQotICB0aGlzIG1peGluIGluIHlvdXIgY2xhc3MgYW5k
IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgbWV0aG9kcy4gSW4geW91ciB1bml0Ci0gIHRlc3RzLCBi
ZSBzdXJlIHRvIGFwcGx5IHRoZSBFbWJlci5NdXRhYmxlRW51bWVyYWJsZVRlc3RzIHRvIHlvdXIg
b2JqZWN0LgorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHByb21pc2UgPSBSU1ZQLlBy
b21pc2UucmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpOwogCi0gIEBjbGFzcyBNdXRhYmxlRW51
bWVyYWJsZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0gIEB1
c2VzIEVtYmVyLkVudW1lcmFibGUKLSovCi1FbWJlci5NdXRhYmxlRW51bWVyYWJsZSA9IEVtYmVy
Lk1peGluLmNyZWF0ZShFbWJlci5FbnVtZXJhYmxlLAotICAvKiogQHNjb3BlIEVtYmVyLk11dGFi
bGVFbnVtZXJhYmxlLnByb3RvdHlwZSAqLyB7CisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24o
dmFsdWUpeworICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJv
bWlzZSBpcyByZWplY3RlZCEKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8v
IHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJworICAgICAgfSk7CisgICAgICBgYGAKIAotICAv
KioKLSAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBh
cHBseSB0aGlzIG1peGluLgorICAgICAgQG1ldGhvZCByZWplY3QKKyAgICAgIEBwYXJhbSB7QW55
fSByZWFzb24gdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVk
IHdpdGguCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBp
ZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGlu
Zy4KKyAgICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBn
aXZlbiBgcmVhc29uYC4KKyAgICAgIEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJk
ZWZhdWx0Il0gPSBmdW5jdGlvbiByZWplY3QocmVhc29uLCBsYWJlbCkgeworICAgICAgLypqc2hp
bnQgdmFsaWR0aGlzOnRydWUgKi8KKyAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CiAKLSAg
ICBBdHRlbXB0cyB0byBhZGQgdGhlIHBhc3NlZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRo
ZSBvYmplY3QgaXMgbm90Ci0gICAgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJ
ZiB0aGUgb2JqZWN0IGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCi0gICAgaGFzIG5vIGVmZmVjdC4K
KyAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkg
eworICAgICAgICByZWplY3QocmVhc29uKTsKKyAgICAgIH0sIGxhYmVsKTsKKyAgICB9OworICB9
KTsKK2RlZmluZSgicnN2cC9wcm9taXNlL3Jlc29sdmUiLCAKKyAgWyJleHBvcnRzIl0sCisgIGZ1
bmN0aW9uKF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIC8qKgorICAgICAg
YFJTVlAuUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21l
IHJlc29sdmVkIHdpdGggdGhlCisgICAgICBwYXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRoYW5k
IGZvciB0aGUgZm9sbG93aW5nOgogCi0gICAgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgb2YgYSB0
eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlY2VpdmVyCi0gICAgdGhlbiB0aGlzIG1ldGhvZCBz
aG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFy
IHByb21pc2UgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Cisg
ICAgICAgIHJlc29sdmUoMSk7CisgICAgICB9KTsKIAotICAgIEBtZXRob2QgYWRkT2JqZWN0Ci0g
ICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgZW51bWVy
YWJsZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgb2JqZWN0Ci0gICovCi0gIGFk
ZE9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAorICAgICAgcHJvbWlzZS50aGVuKGZ1
bmN0aW9uKHZhbHVlKXsKKyAgICAgICAgLy8gdmFsdWUgPT09IDEKKyAgICAgIH0pOworICAgICAg
YGBgCiAKLSAgLyoqCi0gICAgQWRkcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFi
bGUgdG8gdGhlIHJlY2VpdmVyLgorICAgICAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwg
eW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOgogCi0gICAgQG1ldGhv
ZCBhZGRPYmplY3RzCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBv
YmplY3RzIHRvIGFkZC4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGFk
ZE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hh
bmdlcyh0aGlzKTsKLSAgICBmb3JFYWNoKG9iamVjdHMsIGZ1bmN0aW9uKG9iaikgeyB0aGlzLmFk
ZE9iamVjdChvYmopOyB9LCB0aGlzKTsKLSAgICBFbWJlci5lbmRQcm9wZXJ0eUNoYW5nZXModGhp
cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2
YXIgcHJvbWlzZSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwogCi0gIC8qKgotICAgIF9fUmVx
dWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4
aW4uCisgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpeworICAgICAgICAvLyB2YWx1
ZSA9PT0gMQorICAgICAgfSk7CisgICAgICBgYGAKIAotICAgIEF0dGVtcHRzIHRvIHJlbW92ZSB0
aGUgcGFzc2VkIG9iamVjdCBmcm9tIHRoZSByZWNlaXZlciBjb2xsZWN0aW9uIGlmIHRoZQotICAg
IG9iamVjdCBpcyBpbiBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJZiB0aGUgb2JqZWN0IGlz
IG5vdCBwcmVzZW50LAotICAgIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCisgICAgICBAbWV0
aG9kIHJlc29sdmUKKyAgICAgIEBwYXJhbSB7QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSByZXR1
cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aAorICAgICAgQHBhcmFtIHtTdHJpbmd9
IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHByb21p
c2UuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgICBAcmV0dXJuIHtQcm9taXNlfSBh
IHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAg
IGB2YWx1ZWAKKyAgICAgIEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0
Il0gPSBmdW5jdGlvbiByZXNvbHZlKHZhbHVlLCBsYWJlbCkgeworICAgICAgLypqc2hpbnQgdmFs
aWR0aGlzOnRydWUgKi8KKyAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CiAKLSAgICBJZiB0
aGUgcGFzc2VkIG9iamVjdCBpcyBvZiBhIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGUgcmVjZWl2
ZXIKLSAgICB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCisgICAg
ICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgeworICAg
ICAgICByZXNvbHZlKHZhbHVlKTsKKyAgICAgIH0sIGxhYmVsKTsKKyAgICB9OworICB9KTsKK2Rl
ZmluZSgicnN2cC9yYWNlIiwgCisgIFsiLi9wcm9taXNlIiwiZXhwb3J0cyJdLAorICBmdW5jdGlv
bihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBzdHJpY3QiOworICAg
IHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CiAKLSAgICBAbWV0aG9k
IHJlbW92ZU9iamVjdAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBy
ZW1vdmUgZnJvbSB0aGUgZW51bWVyYWJsZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNz
ZWQgb2JqZWN0Ci0gICovCi0gIHJlbW92ZU9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24p
LAorICAgIC8qKgorICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIGBSU1ZQLlBy
b21pc2UucmFjZWAuCiAKKyAgICAgIEBtZXRob2QgcmFjZQorICAgICAgQHBhcmFtIHtBcnJheX0g
YXJyYXkgQXJyYXkgb2YgcHJvbWlzZXMuCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgQW4g
b3B0aW9uYWwgbGFiZWwuIFRoaXMgaXMgdXNlZnVsCisgICAgICBmb3IgdG9vbGluZy4KKyAgICAg
IEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBy
YWNlKGFycmF5LCBsYWJlbCkgeworICAgICAgcmV0dXJuIFByb21pc2UucmFjZShhcnJheSwgbGFi
ZWwpOworICAgIH07CisgIH0pOworZGVmaW5lKCJyc3ZwL3JlamVjdCIsIAorICBbIi4vcHJvbWlz
ZSIsImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykg
eworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1si
ZGVmYXVsdCJdOwogCi0gIC8qKgotICAgIFJlbW92ZXMgZWFjaCBvYmplY3RzIGluIHRoZSBwYXNz
ZWQgZW51bWVyYWJsZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAvKioKKyAgICAgIFRoaXMgaXMg
YSBjb252ZW5pZW50IGFsaWFzIGZvciBgUlNWUC5Qcm9taXNlLnJlamVjdGAuCisKKyAgICAgIEBt
ZXRob2QgcmVqZWN0CisgICAgICBAZm9yIFJTVlAKKyAgICAgIEBwYXJhbSB7QW55fSByZWFzb24g
dmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGguCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWlu
ZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVh
c29uYC4KKyAgICAgIEBzdGF0aWMKKyAgICAqLworICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0g
PSBmdW5jdGlvbiByZWplY3QocmVhc29uLCBsYWJlbCkgeworICAgICAgcmV0dXJuIFByb21pc2Uu
cmVqZWN0KHJlYXNvbiwgbGFiZWwpOworICAgIH07CisgIH0pOworZGVmaW5lKCJyc3ZwL3Jlc29s
dmUiLCAKKyAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCisgIGZ1bmN0aW9uKF9fZGVwZW5kZW5j
eTFfXywgX19leHBvcnRzX18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIFByb21pc2Ug
PSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKIAotICAgIEBtZXRob2QgcmVtb3ZlT2JqZWN0
cwotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBy
ZW1vdmUKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIHJlbW92ZU9iamVj
dHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcyh0
aGlzKTsKLSAgICBmb3JFYWNoKG9iamVjdHMsIGZ1bmN0aW9uKG9iaikgeyB0aGlzLnJlbW92ZU9i
amVjdChvYmopOyB9LCB0aGlzKTsKLSAgICBFbWJlci5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyk7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KKyAgICAvKioKKyAgICAgIFRoaXMgaXMgYSBjb252ZW5p
ZW50IGFsaWFzIGZvciBgUlNWUC5Qcm9taXNlLnJlc29sdmVgLgorCisgICAgICBAbWV0aG9kIHJl
c29sdmUKKyAgICAgIEBmb3IgUlNWUAorICAgICAgQHBhcmFtIHtBbnl9IHZhbHVlIHZhbHVlIHRo
YXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoCisgICAgICBAcGFy
YW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0
dXJuZWQgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAgIEByZXR1cm4g
e1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIGZ1bGZpbGxlZCB3aXRoIHRoZSBn
aXZlbgorICAgICAgYHZhbHVlYAorICAgICAgQHN0YXRpYworICAgICovCisgICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJlc29sdmUodmFsdWUsIGxhYmVsKSB7CisgICAgICBy
ZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLCBsYWJlbCk7CisgICAgfTsKKyAgfSk7CitkZWZp
bmUoInJzdnAvcmV0aHJvdyIsIAorICBbImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19leHBvcnRz
X18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgLyoqCisgICAgICBgUlNWUC5yZXRocm93YCB3
aWxsIHJldGhyb3cgYW4gZXJyb3Igb24gdGhlIG5leHQgdHVybiBvZiB0aGUgSmF2YVNjcmlwdCBl
dmVudAorICAgICAgbG9vcCBpbiBvcmRlciB0byBhaWQgZGVidWdnaW5nLgorCisgICAgICBQcm9t
aXNlcyBBKyBzcGVjaWZpZXMgdGhhdCBhbnkgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIHdpdGggYSBw
cm9taXNlIG11c3QgYmUKKyAgICAgIGNhdWdodCBieSB0aGUgcHJvbWlzZXMgaW1wbGVtZW50YXRp
b24gYW5kIGJ1YmJsZWQgdG8gdGhlIGxhc3QgaGFuZGxlci4gRm9yCisgICAgICB0aGlzIHJlYXNv
biwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzIHNwZWNpZnkgYSBzZWNvbmQgcmVq
ZWN0aW9uCisgICAgICBoYW5kbGVyIGZ1bmN0aW9uIHRvIGB0aGVuYC4gSG93ZXZlciwgYFJTVlAu
cmV0aHJvd2Agd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uCisgICAgICBvdXRzaWRlIG9mIHRoZSBw
cm9taXNlLCBzbyBpdCBidWJibGVzIHVwIHRvIHlvdXIgY29uc29sZSBpZiBpbiB0aGUgYnJvd3Nl
ciwKKyAgICAgIG9yIGRvbWFpbi9jYXVzZSB1bmNhdWdodCBleGNlcHRpb24gaW4gTm9kZS4gYHJl
dGhyb3dgIHdpbGwgYWxzbyB0aHJvdyB0aGUKKyAgICAgIGVycm9yIGFnYWluIHNvIHRoZSBlcnJv
ciBjYW4gYmUgaGFuZGxlZCBieSB0aGUgcHJvbWlzZSBwZXIgdGhlIHNwZWMuCisKKyAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIGZ1bmN0aW9uIHRocm93cygpeworICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoJ1dob29wcyEnKTsKKyAgICAgIH0KIAotfSk7CisgICAgICB2YXIgcHJvbWlzZSA9IG5l
dyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKKyAgICAgICAgdGhyb3dz
KCk7CisgICAgICB9KTsKIAotfSkoKTsKKyAgICAgIHByb21pc2UuY2F0Y2goUlNWUC5yZXRocm93
KS50aGVuKGZ1bmN0aW9uKCl7CisgICAgICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNh
dXNlIHRoZSBwcm9taXNlIGJlY2FtZSByZWplY3RlZCBkdWUgdG8gYW4KKyAgICAgICAgLy8gZXJy
b3IhCisgICAgICB9LCBmdW5jdGlvbiAoZXJyKXsKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBlcnJv
ciBoZXJlCisgICAgICB9KTsKKyAgICAgIGBgYAogCisgICAgICBUaGUgJ1dob29wcycgZXJyb3Ig
d2lsbCBiZSB0aHJvd24gb24gdGhlIG5leHQgdHVybiBvZiB0aGUgZXZlbnQgbG9vcAorICAgICAg
YW5kIHlvdSBjYW4gd2F0Y2ggZm9yIGl0IGluIHlvdXIgY29uc29sZS4gWW91IGNhbiBhbHNvIGhh
bmRsZSBpdCB1c2luZyBhCisgICAgICByZWplY3Rpb24gaGFuZGxlciBnaXZlbiB0byBgLnRoZW5g
IG9yIGAuY2F0Y2hgIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlLgogCisgICAgICBAbWV0aG9kIHJl
dGhyb3cKKyAgICAgIEBmb3IgUlNWUAorICAgICAgQHBhcmFtIHtFcnJvcn0gcmVhc29uIHJlYXNv
biB0aGUgcHJvbWlzZSBiZWNhbWUgcmVqZWN0ZWQuCisgICAgICBAdGhyb3dzIEVycm9yCisgICAg
ICBAc3RhdGljCisgICAgKi8KKyAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24g
cmV0aHJvdyhyZWFzb24pIHsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAg
IHRocm93IHJlYXNvbjsKKyAgICAgIH0pOworICAgICAgdGhyb3cgcmVhc29uOworICAgIH07Cisg
IH0pOworZGVmaW5lKCJyc3ZwL3V0aWxzIiwgCisgIFsiZXhwb3J0cyJdLAorICBmdW5jdGlvbihf
X2V4cG9ydHNfXykgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICBmdW5jdGlvbiBvYmplY3RPckZ1
bmN0aW9uKHgpIHsKKyAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiB8fCAodHlw
ZW9mIHggPT09ICJvYmplY3QiICYmIHggIT09IG51bGwpOworICAgIH0KIAotKGZ1bmN0aW9uKCkg
ewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0vLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Ci0vLyBDT05TVEFOVFMKLS8vCisgICAgX19leHBvcnRzX18ub2JqZWN0T3JGdW5jdGlvbiA9IG9i
amVjdE9yRnVuY3Rpb247ZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7CisgICAgICByZXR1cm4gdHlw
ZW9mIHggPT09ICJmdW5jdGlvbiI7CisgICAgfQogCi12YXIgT1VUX09GX1JBTkdFX0VYQ0VQVElP
TiA9ICJJbmRleCBvdXQgb2YgcmFuZ2UiIDsKLXZhciBFTVBUWSA9IFtdOworICAgIF9fZXhwb3J0
c19fLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO2Z1bmN0aW9uIGlzTm9uVGhlbmFibGUoeCkgewor
ICAgICAgcmV0dXJuICFvYmplY3RPckZ1bmN0aW9uKHgpOworICAgIH0KIAotLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gSEVM
UEVSUwotLy8KKyAgICBfX2V4cG9ydHNfXy5pc05vblRoZW5hYmxlID0gaXNOb25UaGVuYWJsZTtm
dW5jdGlvbiBpc0FycmF5KHgpIHsKKyAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3Ry
aW5nLmNhbGwoeCkgPT09ICJbb2JqZWN0IEFycmF5XSI7CisgICAgfQogCi12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
Zm9yRWFjaDsKKyAgICBfX2V4cG9ydHNfXy5pc0FycmF5ID0gaXNBcnJheTsvLyBEYXRlLm5vdyBp
cyBub3QgYXZhaWxhYmxlIGluIGJyb3dzZXJzIDwgSUU5CisgICAgLy8gaHR0cHM6Ly9kZXZlbG9w
ZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFs
X09iamVjdHMvRGF0ZS9ub3cjQ29tcGF0aWJpbGl0eQorICAgIHZhciBub3cgPSBEYXRlLm5vdyB8
fCBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9OworICAgIF9fZXhw
b3J0c19fLm5vdyA9IG5vdzsKKyAgICB2YXIga2V5c09mID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rp
b24ob2JqZWN0KSB7CisgICAgICB2YXIgcmVzdWx0ID0gW107CiAKLS8qKgotICBUaGlzIG1peGlu
IGRlZmluZXMgdGhlIEFQSSBmb3IgbW9kaWZ5aW5nIGFycmF5LWxpa2Ugb2JqZWN0cy4gVGhlc2Ug
bWV0aG9kcwotICBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIGEgY29sbGVjdGlvbiB0aGF0IGtlZXBz
IGl0cyBpdGVtcyBpbiBhbiBvcmRlcmVkIHNldC4KKyAgICAgIGZvciAodmFyIHByb3AgaW4gb2Jq
ZWN0KSB7CisgICAgICAgIHJlc3VsdC5wdXNoKHByb3ApOworICAgICAgfQogCi0gIE5vdGUgdGhh
dCBhbiBBcnJheSBjYW4gY2hhbmdlIGV2ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMg
bWl4aW4uCi0gIEZvciBleGFtcGxlLCBvbmUgbWlnaHQgaW1wbGVtZW50IGEgU3BhcnNlQXJyYXkg
dGhhdCBjYW5ub3QgYmUgZGlyZWN0bHkKLSAgbW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWlu
ZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCisgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH07CisgICAgX19leHBvcnRzX18ua2V5c09mID0ga2V5c09mOworICB9KTsK
K2RlZmluZSgicnN2cCIsIAorICBbIi4vcnN2cC9wcm9taXNlIiwiLi9yc3ZwL2V2ZW50cyIsIi4v
cnN2cC9ub2RlIiwiLi9yc3ZwL2FsbCIsIi4vcnN2cC9hbGxfc2V0dGxlZCIsIi4vcnN2cC9yYWNl
IiwiLi9yc3ZwL2hhc2giLCIuL3JzdnAvcmV0aHJvdyIsIi4vcnN2cC9kZWZlciIsIi4vcnN2cC9j
b25maWciLCIuL3JzdnAvbWFwIiwiLi9yc3ZwL3Jlc29sdmUiLCIuL3JzdnAvcmVqZWN0IiwiLi9y
c3ZwL2ZpbHRlciIsImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2Rl
cGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBfX2RlcGVuZGVu
Y3k1X18sIF9fZGVwZW5kZW5jeTZfXywgX19kZXBlbmRlbmN5N19fLCBfX2RlcGVuZGVuY3k4X18s
IF9fZGVwZW5kZW5jeTlfXywgX19kZXBlbmRlbmN5MTBfXywgX19kZXBlbmRlbmN5MTFfXywgX19k
ZXBlbmRlbmN5MTJfXywgX19kZXBlbmRlbmN5MTNfXywgX19kZXBlbmRlbmN5MTRfXywgX19leHBv
cnRzX18pIHsKKyAgICAidXNlIHN0cmljdCI7CisgICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVu
Y3kxX19bImRlZmF1bHQiXTsKKyAgICB2YXIgRXZlbnRUYXJnZXQgPSBfX2RlcGVuZGVuY3kyX19b
ImRlZmF1bHQiXTsKKyAgICB2YXIgZGVub2RlaWZ5ID0gX19kZXBlbmRlbmN5M19fWyJkZWZhdWx0
Il07CisgICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTRfX1siZGVmYXVsdCJdOworICAgIHZhciBh
bGxTZXR0bGVkID0gX19kZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07CisgICAgdmFyIHJhY2UgPSBf
X2RlcGVuZGVuY3k2X19bImRlZmF1bHQiXTsKKyAgICB2YXIgaGFzaCA9IF9fZGVwZW5kZW5jeTdf
X1siZGVmYXVsdCJdOworICAgIHZhciByZXRocm93ID0gX19kZXBlbmRlbmN5OF9fWyJkZWZhdWx0
Il07CisgICAgdmFyIGRlZmVyID0gX19kZXBlbmRlbmN5OV9fWyJkZWZhdWx0Il07CisgICAgdmFy
IGNvbmZpZyA9IF9fZGVwZW5kZW5jeTEwX18uY29uZmlnOworICAgIHZhciBjb25maWd1cmUgPSBf
X2RlcGVuZGVuY3kxMF9fLmNvbmZpZ3VyZTsKKyAgICB2YXIgbWFwID0gX19kZXBlbmRlbmN5MTFf
X1siZGVmYXVsdCJdOworICAgIHZhciByZXNvbHZlID0gX19kZXBlbmRlbmN5MTJfX1siZGVmYXVs
dCJdOworICAgIHZhciByZWplY3QgPSBfX2RlcGVuZGVuY3kxM19fWyJkZWZhdWx0Il07CisgICAg
dmFyIGZpbHRlciA9IF9fZGVwZW5kZW5jeTE0X19bImRlZmF1bHQiXTsKKworICAgIGZ1bmN0aW9u
IGFzeW5jKGNhbGxiYWNrLCBhcmcpIHsKKyAgICAgIGNvbmZpZy5hc3luYyhjYWxsYmFjaywgYXJn
KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvbigpIHsKKyAgICAgIGNvbmZpZy5vbi5hcHBseShj
b25maWcsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gb2ZmKCkgeworICAgICAg
Y29uZmlnLm9mZi5hcHBseShjb25maWcsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLy8gU2V0
IHVwIGluc3RydW1lbnRhdGlvbiB0aHJvdWdoIGB3aW5kb3cuX19QUk9NSVNFX0lOVFJVTUVOVEFU
SU9OX19gCisgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3
aW5kb3cuX19QUk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fID09PSAnb2JqZWN0JykgeworICAgICAg
dmFyIGNhbGxiYWNrcyA9IHdpbmRvdy5fX1BST01JU0VfSU5TVFJVTUVOVEFUSU9OX187CisgICAg
ICBjb25maWd1cmUoJ2luc3RydW1lbnQnLCB0cnVlKTsKKyAgICAgIGZvciAodmFyIGV2ZW50TmFt
ZSBpbiBjYWxsYmFja3MpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrcy5oYXNPd25Qcm9wZXJ0eShl
dmVudE5hbWUpKSB7CisgICAgICAgICAgb24oZXZlbnROYW1lLCBjYWxsYmFja3NbZXZlbnROYW1l
XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKLSAgQGNsYXNzIE11dGFibGVBcnJheQot
ICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0gIEB1c2VzIEVtYmVy
LkFycmF5Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVFbnVtZXJhYmxlCisgICAgX19leHBvcnRzX18u
UHJvbWlzZSA9IFByb21pc2U7CisgICAgX19leHBvcnRzX18uRXZlbnRUYXJnZXQgPSBFdmVudFRh
cmdldDsKKyAgICBfX2V4cG9ydHNfXy5hbGwgPSBhbGw7CisgICAgX19leHBvcnRzX18uYWxsU2V0
dGxlZCA9IGFsbFNldHRsZWQ7CisgICAgX19leHBvcnRzX18ucmFjZSA9IHJhY2U7CisgICAgX19l
eHBvcnRzX18uaGFzaCA9IGhhc2g7CisgICAgX19leHBvcnRzX18ucmV0aHJvdyA9IHJldGhyb3c7
CisgICAgX19leHBvcnRzX18uZGVmZXIgPSBkZWZlcjsKKyAgICBfX2V4cG9ydHNfXy5kZW5vZGVp
ZnkgPSBkZW5vZGVpZnk7CisgICAgX19leHBvcnRzX18uY29uZmlndXJlID0gY29uZmlndXJlOwor
ICAgIF9fZXhwb3J0c19fLm9uID0gb247CisgICAgX19leHBvcnRzX18ub2ZmID0gb2ZmOworICAg
IF9fZXhwb3J0c19fLnJlc29sdmUgPSByZXNvbHZlOworICAgIF9fZXhwb3J0c19fLnJlamVjdCA9
IHJlamVjdDsKKyAgICBfX2V4cG9ydHNfXy5hc3luYyA9IGFzeW5jOworICAgIF9fZXhwb3J0c19f
Lm1hcCA9IG1hcDsKKyAgICBfX2V4cG9ydHNfXy5maWx0ZXIgPSBmaWx0ZXI7CisgIH0pOworCit9
KSgpOworCisoZnVuY3Rpb24oKSB7CisvKioKK1B1YmxpYyBhcGkgZm9yIHRoZSBjb250YWluZXIg
aXMgc3RpbGwgaW4gZmx1eC4KK1RoZSBwdWJsaWMgYXBpLCBzcGVjaWZpZWQgb24gdGhlIGFwcGxp
Y2F0aW9uIG5hbWVzcGFjZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgc3RhYmxlIGFwaS4KKy8v
IEBtb2R1bGUgY29udGFpbmVyCisgIEBwcml2YXRlCiAqLwotRW1iZXIuTXV0YWJsZUFycmF5ID0g
RW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFycmF5LCBFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwK
LSAgLyoqIEBzY29wZSBFbWJlci5NdXRhYmxlQXJyYXkucHJvdG90eXBlICovIHsKIAotICAvKioK
LSAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBs
eSB0aGlzIG1peGluLgorLyoKKyBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIG1vZGVsIGZhY3Rvcnkg
aW5qZWN0aW9ucyAoZGlzYWJsZWQgYnkgZGVmYXVsdCkKKyBJZiBtb2RlbCBmYWN0b3J5IGluamVj
dGlvbnMgYXJlIGVuYWJsZWQsIG1vZGVscyBzaG91bGQgbm90IGJlCisgYWNjZXNzZWQgZ2xvYmFs
bHkgKG9ubHkgdGhyb3VnaCBgY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOm1vZGVsTmFt
ZScpKWApOworKi8KK0VtYmVyLk1PREVMX0ZBQ1RPUllfSU5KRUNUSU9OUyA9IGZhbHNlIHx8ICEh
RW1iZXIuRU5WLk1PREVMX0ZBQ1RPUllfSU5KRUNUSU9OUzsKIAotICAgIFRoaXMgaXMgb25lIG9m
IHRoZSBwcmltaXRpdmVzIHlvdSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0IGBFbWJlci5BcnJh
eWAuCi0gICAgWW91IHNob3VsZCByZXBsYWNlIGFtdCBvYmplY3RzIHN0YXJ0ZWQgYXQgaWR4IHdp
dGggdGhlIG9iamVjdHMgaW4gdGhlCi0gICAgcGFzc2VkIGFycmF5LiBZb3Ugc2hvdWxkIGFsc28g
Y2FsbCBgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZSgpYAorZGVmaW5lKCJjb250YWlu
ZXIiLAorICBbXSwKKyAgZnVuY3Rpb24oKSB7CiAKLSAgICBAbWV0aG9kIHJlcGxhY2UKLSAgICBA
cGFyYW0ge051bWJlcn0gaWR4IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSB0byByZXBsYWNl
LiBJZiAKLSAgICAgIGlkeCA+PSBsZW5ndGgsIHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhl
IGFycmF5LgotICAgIEBwYXJhbSB7TnVtYmVyfSBhbXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQg
c2hvdWxkIGJlIHJlbW92ZWQgZnJvbSAKLSAgICAgIHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlk
eCouCi0gICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUg
b2JqZWN0cyB0aGF0IHNob3VsZCBiZSAKLSAgICAgIGluc2VydGVkIGludG8gdGhlIGFycmF5IGF0
ICppZHgqCi0gICovCi0gIHJlcGxhY2U6IEVtYmVyLnJlcXVpcmVkKCksCisgICAgLy8gQSBzYWZl
IGFuZCBzaW1wbGUgaW5oZXJpdGluZyBvYmplY3QuCisgICAgZnVuY3Rpb24gSW5oZXJpdGluZ0Rp
Y3QocGFyZW50KSB7CisgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgIHRoaXMuZGlj
dCA9IHt9OworICAgIH0KIAotICAvKioKLSAgICBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gc2Vs
Zi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91Ci0gICAgd2FudCB0byByZXVzZSBhbiBleGlzdGluZyBh
cnJheSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBpdC4KKyAgICBJbmhlcml0aW5nRGljdC5w
cm90b3R5cGUgPSB7CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvci5sZW5ndGgoKTsgICAvLyAgMwotICAgIGNv
bG9ycy5jbGVhcigpOyAgIC8vICBbXQotICAgIGNvbG9ycy5sZW5ndGgoKTsgIC8vICAwCi0gICAg
YGBgCisgICAgICAvKioKKyAgICAgICAgQHByb3BlcnR5IHBhcmVudAorICAgICAgICBAdHlwZSBJ
bmhlcml0aW5nRGljdAorICAgICAgICBAZGVmYXVsdCBudWxsCisgICAgICAqLwogCi0gICAgQG1l
dGhvZCBjbGVhcgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSBBbiBlbXB0eSBBcnJheS4KLSAg
Ki8KLSAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5n
dGgnKTsKLSAgICBpZiAobGVuID09PSAwKSByZXR1cm4gdGhpczsKLSAgICB0aGlzLnJlcGxhY2Uo
MCwgbGVuLCBFTVBUWSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICBwYXJlbnQ6IG51
bGwsCiAKLSAgLyoqCi0gICAgVGhpcyB3aWxsIHVzZSB0aGUgcHJpbWl0aXZlIGByZXBsYWNlKClg
IG1ldGhvZCB0byBpbnNlcnQgYW4gb2JqZWN0IGF0IHRoZQotICAgIHNwZWNpZmllZCBpbmRleC4K
KyAgICAgIC8qKgorICAgICAgICBPYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBub2Rl
cyBkYXRhLgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJn
cmVlbiIsICJibHVlIl07Ci0gICAgY29sb3JzLmluc2VydEF0KDIsICJ5ZWxsb3ciKTsgIC8vIFsi
cmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIl0KLSAgICBjb2xvcnMuaW5zZXJ0QXQoNSwg
Im9yYW5nZSIpOyAgLy8gRXJyb3I6IEluZGV4IG91dCBvZiByYW5nZQotICAgIGBgYAorICAgICAg
ICBAcHJvcGVydHkgZGljdAorICAgICAgICBAdHlwZSBPYmplY3QKKyAgICAgICAgQGRlZmF1bHQg
T2JqZWN0CisgICAgICAqLworICAgICAgZGljdDogbnVsbCwKIAotICAgIEBtZXRob2QgaW5zZXJ0
QXQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IGluZGV4IG9mIGluc2VydCB0aGUgb2JqZWN0IGF0
LgotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb2JqZWN0IHRvIGluc2VydAotICAqLwotICBp
bnNlcnRBdDogZnVuY3Rpb24oaWR4LCBvYmplY3QpIHsKLSAgICBpZiAoaWR4ID4gZ2V0KHRoaXMs
ICdsZW5ndGgnKSkgdGhyb3cgbmV3IEVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pIDsKLSAg
ICB0aGlzLnJlcGxhY2UoaWR4LCAwLCBbb2JqZWN0XSkgOwotICAgIHJldHVybiB0aGlzIDsKLSAg
fSwKKyAgICAgIC8qKgorICAgICAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZ2l2ZW4gYSBrZXksIGlm
IHRoZSB2YWx1ZSBpcyBwcmVzZW50IGF0IHRoZSBjdXJyZW50CisgICAgICAgIGxldmVsIHVzZSBp
dCwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgYW5kIHRyeSBhZ2Fpbi4g
SWYKKyAgICAgICAgbm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5kLCByZXR1cm4gdW5kZWZpbmVkLgog
Ci0gIC8qKgotICAgIFJlbW92ZSBhbiBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB1c2lu
ZyB0aGUgYHJlcGxhY2UoKWAgcHJpbWl0aXZlCi0gICAgbWV0aG9kLiBZb3UgY2FuIHBhc3MgZWl0
aGVyIGEgc2luZ2xlIGluZGV4LCBvciBhIHN0YXJ0IGFuZCBhIGxlbmd0aC4KKyAgICAgICAgQG1l
dGhvZCBnZXQKKyAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQorICAgICAgICBAcmV0dXJuIHth
bnl9CisgICAgICAqLworICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgdmFyIGRp
Y3QgPSB0aGlzLmRpY3Q7CiAKLSAgICBJZiB5b3UgcGFzcyBhIHN0YXJ0IGFuZCBsZW5ndGggdGhh
dCBpcyBiZXlvbmQgdGhlCi0gICAgbGVuZ3RoIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gYEVt
YmVyLk9VVF9PRl9SQU5HRV9FWENFUFRJT05gCisgICAgICAgIGlmIChkaWN0Lmhhc093blByb3Bl
cnR5KGtleSkpIHsKKyAgICAgICAgICByZXR1cm4gZGljdFtrZXldOworICAgICAgICB9CiAKLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUi
LCAieWVsbG93IiwgIm9yYW5nZSJdOwotICAgIGNvbG9ycy5yZW1vdmVBdCgwKTsgICAgIC8vIFsi
Z3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ciLCAib3JhbmdlIl0KLSAgICBjb2xvcnMucmVtb3ZlQXQo
MiwgMik7ICAvLyBbImdyZWVuIiwgImJsdWUiXQotICAgIGNvbG9ycy5yZW1vdmVBdCg0LCAyKTsg
IC8vIEVycm9yOiBJbmRleCBvdXQgb2YgcmFuZ2UKLSAgICBgYGAKKyAgICAgICAgaWYgKHRoaXMu
cGFyZW50KSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldChrZXkpOworICAgICAg
ICB9CisgICAgICB9LAogCi0gICAgQG1ldGhvZCByZW1vdmVBdAotICAgIEBwYXJhbSB7TnVtYmVy
fSBzdGFydCBpbmRleCwgc3RhcnQgb2YgcmFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gbGVuIGxl
bmd0aCBvZiBwYXNzaW5nIHJhbmdlCi0gICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAq
LwotICByZW1vdmVBdDogZnVuY3Rpb24oc3RhcnQsIGxlbikgewotICAgIGlmICgnbnVtYmVyJyA9
PT0gdHlwZW9mIHN0YXJ0KSB7CisgICAgICAvKioKKyAgICAgICAgU2V0IHRoZSBnaXZlbiB2YWx1
ZSBmb3IgdGhlIGdpdmVuIGtleSwgYXQgdGhlIGN1cnJlbnQgbGV2ZWwuCiAKLSAgICAgIGlmICgo
c3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKLSAgICAgICAg
dGhyb3cgbmV3IEVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgICAgfQorICAgICAg
ICBAbWV0aG9kIHNldAorICAgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5CisgICAgICAgIEBwYXJh
bSB7QW55fSB2YWx1ZQorICAgICAgKi8KKyAgICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkg
eworICAgICAgICB0aGlzLmRpY3Rba2V5XSA9IHZhbHVlOworICAgICAgfSwKIAotICAgICAgLy8g
ZmFzdCBjYXNlCi0gICAgICBpZiAobGVuID09PSB1bmRlZmluZWQpIGxlbiA9IDE7Ci0gICAgICB0
aGlzLnJlcGxhY2Uoc3RhcnQsIGxlbiwgRU1QVFkpOwotICAgIH0KKyAgICAgIC8qKgorICAgICAg
ICBEZWxldGUgdGhlIGdpdmVuIGtleQogCi0gICAgcmV0dXJuIHRoaXMgOwotICB9LAorICAgICAg
ICBAbWV0aG9kIHJlbW92ZQorICAgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5CisgICAgICAqLwor
ICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgZGVsZXRlIHRoaXMuZGljdFtr
ZXldOworICAgICAgfSwKIAotICAvKioKLSAgICBQdXNoIHRoZSBvYmplY3Qgb250byB0aGUgZW5k
IG9mIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGBwdXNoKClgIGJ1dCBpdAotICAgIGlzIEtW
Ty1jb21wbGlhbnQuCisgICAgICAvKioKKyAgICAgICAgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ug
b2YgZ2l2ZW4gYSBrZXksIGlmIHRoZSBrZXkgaXMgcHJlc2VudCBhdCB0aGUgY3VycmVudAorICAg
ICAgICBsZXZlbCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVy
YXJjaHkgYW5kIHRyeSBhZ2Fpbi4gSWYKKyAgICAgICAgbm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5k
LCByZXR1cm4gZmFsc2UuCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsi
cmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvcnMucHVzaE9iamVjdCgiYmxhY2siKTsg
ICAgICAgICAgICAgICAvLyBbInJlZCIsICJncmVlbiIsICJibHVlIiwgImJsYWNrIl0KLSAgICBj
b2xvcnMucHVzaE9iamVjdChbInllbGxvdyIsICJvcmFuZ2UiXSk7ICAvLyBbInJlZCIsICJncmVl
biIsICJibHVlIiwgImJsYWNrIiwgWyJ5ZWxsb3ciLCAib3JhbmdlIl1dCi0gICAgYGBgCisgICAg
ICAgIEBtZXRob2QgaGFzCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKKyAgICAgICAgQHJl
dHVybiB7Qm9vbGVhbn0KKyAgICAgICovCisgICAgICBoYXM6IGZ1bmN0aW9uKGtleSkgeworICAg
ICAgICB2YXIgZGljdCA9IHRoaXMuZGljdDsKIAotICAgIEBtZXRob2QgcHVzaE9iamVjdAotICAg
IEBwYXJhbSB7YW55dGhpbmd9IG9iaiBvYmplY3QgdG8gcHVzaAotICAqLwotICBwdXNoT2JqZWN0
OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLmluc2VydEF0KGdldCh0aGlzLCAnbGVuZ3RoJyks
IG9iaikgOwotICAgIHJldHVybiBvYmogOwotICB9LAorICAgICAgICBpZiAoZGljdC5oYXNPd25Q
cm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotICAv
KioKLSAgICBBZGQgdGhlIG9iamVjdHMgaW4gdGhlIHBhc3NlZCBudW1lcmFibGUgdG8gdGhlIGVu
ZCBvZiB0aGUgYXJyYXkuIERlZmVycwotICAgIG5vdGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNo
YW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRkZWQuCisgICAgICAgIGlmICh0aGlzLnBhcmVu
dCkgeworICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5oYXMoa2V5KTsKKyAgICAgICAgfQog
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJi
bHVlIl07Ci0gICAgY29sb3JzLnB1c2hPYmplY3RzKCJibGFjayIpOyAgICAgICAgICAgICAgIC8v
IFsicmVkIiwgImdyZWVuIiwgImJsdWUiLCAiYmxhY2siXQotICAgIGNvbG9ycy5wdXNoT2JqZWN0
cyhbInllbGxvdyIsICJvcmFuZ2UiXSk7ICAvLyBbInJlZCIsICJncmVlbiIsICJibHVlIiwgImJs
YWNrIiwgInllbGxvdyIsICJvcmFuZ2UiXQotICAgIGBgYAorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICB9LAogCi0gICAgQG1ldGhvZCBwdXNoT2JqZWN0cwotICAgIEBwYXJhbSB7RW1iZXIu
RW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKLSAgICBAcmV0dXJuIHtFbWJl
ci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgcHVzaE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMp
IHsKLSAgICB0aGlzLnJlcGxhY2UoZ2V0KHRoaXMsICdsZW5ndGgnKSwgMCwgb2JqZWN0cyk7Ci0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICAvKioKKyAgICAgICAgSXRlcmF0ZSBhbmQgaW52
b2tlIGEgY2FsbGJhY2sgZm9yIGVhY2ggbG9jYWwga2V5LXZhbHVlIHBhaXIuCiAKLSAgLyoqCi0g
ICAgUG9wIG9iamVjdCBmcm9tIGFycmF5IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBq
dXN0IGxpa2UgYHBvcCgpYCBidXQKLSAgICBpdCBpcyBLVk8tY29tcGxpYW50LgorICAgICAgICBA
bWV0aG9kIGVhY2hMb2NhbAorICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAg
ICAgICBAcGFyYW0ge09iamVjdH0gYmluZGluZworICAgICAgKi8KKyAgICAgIGVhY2hMb2NhbDog
ZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICAgICAgdmFyIGRpY3QgPSB0aGlzLmRp
Y3Q7CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVu
IiwgImJsdWUiXTsKLSAgICBjb2xvcnMucG9wT2JqZWN0KCk7ICAgLy8gImJsdWUiCi0gICAgY29u
c29sZS5sb2coY29sb3JzKTsgIC8vIFsicmVkIiwgImdyZWVuIl0KLSAgICBgYGAKKyAgICAgICAg
Zm9yICh2YXIgcHJvcCBpbiBkaWN0KSB7CisgICAgICAgICAgaWYgKGRpY3QuaGFzT3duUHJvcGVy
dHkocHJvcCkpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgcHJvcCwgZGlj
dFtwcm9wXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfTsKIAotICAg
IEBtZXRob2QgcG9wT2JqZWN0Ci0gICAgQHJldHVybiBvYmplY3QKLSAgKi8KLSAgcG9wT2JqZWN0
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7Ci0gICAg
aWYgKGxlbiA9PT0gMCkgcmV0dXJuIG51bGwgOwogCi0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0
QXQobGVuLTEpIDsKLSAgICB0aGlzLnJlbW92ZUF0KGxlbi0xLCAxKSA7Ci0gICAgcmV0dXJuIHJl
dCA7Ci0gIH0sCisgICAgLy8gQSBsaWdodHdlaWdodCBjb250YWluZXIgdGhhdCBoZWxwcyB0byBh
c3NlbWJsZSBhbmQgZGVjb3VwbGUgY29tcG9uZW50cy4KKyAgICAvLyBQdWJsaWMgYXBpIGZvciB0
aGUgY29udGFpbmVyIGlzIHN0aWxsIGluIGZsdXguCisgICAgLy8gVGhlIHB1YmxpYyBhcGksIHNw
ZWNpZmllZCBvbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHNob3VsZCBiZSBjb25zaWRlcmVk
IHRoZSBzdGFibGUgYXBpLgorICAgIGZ1bmN0aW9uIENvbnRhaW5lcihwYXJlbnQpIHsKKyAgICAg
IHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogCi0gIC8q
KgotICAgIFNoaWZ0IGFuIG9iamVjdCBmcm9tIHN0YXJ0IG9mIGFycmF5IG9yIG5pbCBpZiBub25l
IGFyZSBsZWZ0LiBXb3JrcyBqdXN0Ci0gICAgbGlrZSBgc2hpZnQoKWAgYnV0IGl0IGlzIEtWTy1j
b21wbGlhbnQuCisgICAgICB0aGlzLnJlc29sdmVyID0gcGFyZW50ICYmIHBhcmVudC5yZXNvbHZl
ciB8fCBmdW5jdGlvbigpIHt9OwogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMg
PSBbInJlZCIsICJncmVlbiIsICJibHVlIl07Ci0gICAgY29sb3JzLnNoaWZ0T2JqZWN0KCk7ICAv
LyAicmVkIgotICAgIGNvbnNvbGUubG9nKGNvbG9ycyk7ICAgLy8gWyJncmVlbiIsICJibHVlIl0K
LSAgICBgYGAKKyAgICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50
ICYmIHBhcmVudC5yZWdpc3RyeSk7CisgICAgICB0aGlzLmNhY2hlID0gbmV3IEluaGVyaXRpbmdE
aWN0KHBhcmVudCAmJiBwYXJlbnQuY2FjaGUpOworICAgICAgdGhpcy5mYWN0b3J5Q2FjaGUgPSBu
ZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBhcmVudC5jYWNoZSk7CisgICAgICB0aGlzLnR5
cGVJbmplY3Rpb25zID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQudHlwZUlu
amVjdGlvbnMpOworICAgICAgdGhpcy5pbmplY3Rpb25zID0ge307CiAKLSAgICBAbWV0aG9kIHNo
aWZ0T2JqZWN0Ci0gICAgQHJldHVybiBvYmplY3QKLSAgKi8KLSAgc2hpZnRPYmplY3Q6IGZ1bmN0
aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2xlbmd0aCcpID09PSAwKSByZXR1cm4gbnVsbCA7
Ci0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQoMCkgOwotICAgIHRoaXMucmVtb3ZlQXQoMCkg
OwotICAgIHJldHVybiByZXQgOwotICB9LAorICAgICAgdGhpcy5mYWN0b3J5VHlwZUluamVjdGlv
bnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBhcmVudC5mYWN0b3J5VHlwZUluamVj
dGlvbnMpOworICAgICAgdGhpcy5mYWN0b3J5SW5qZWN0aW9ucyA9IHt9OwogCi0gIC8qKgotICAg
IFVuc2hpZnQgYW4gb2JqZWN0IHRvIHN0YXJ0IG9mIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHVu
c2hpZnQoKWAgYnV0IGl0IGlzCi0gICAgS1ZPLWNvbXBsaWFudC4KKyAgICAgIHRoaXMuX29wdGlv
bnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBhcmVudC5fb3B0aW9ucyk7CisgICAg
ICB0aGlzLl90eXBlT3B0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50
Ll90eXBlT3B0aW9ucyk7CisgICAgfQogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xv
cnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIl07Ci0gICAgY29sb3JzLnVuc2hpZnRPYmplY3Qo
InllbGxvdyIpOyAgICAgICAgICAgICAvLyBbInllbGxvdyIsICJyZWQiLCAiZ3JlZW4iLCAiYmx1
ZSJdCi0gICAgY29sb3JzLnVuc2hpZnRPYmplY3QoWyJibGFjayIsICJ3aGl0ZSJdKTsgICAvLyBb
WyJibGFjayIsICJ3aGl0ZSJdLCAieWVsbG93IiwgInJlZCIsICJncmVlbiIsICJibHVlIl0KLSAg
ICBgYGAKKyAgICBDb250YWluZXIucHJvdG90eXBlID0gewogCi0gICAgQG1ldGhvZCB1bnNoaWZ0
T2JqZWN0Ci0gICAgQHBhcmFtIHthbnl0aGluZ30gb2JqIG9iamVjdCB0byB1bnNoaWZ0Ci0gICov
Ci0gIHVuc2hpZnRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIHRoaXMuaW5zZXJ0QXQoMCwg
b2JqKSA7Ci0gICAgcmV0dXJuIG9iaiA7Ci0gIH0sCisgICAgICAvKioKKyAgICAgICAgQHByb3Bl
cnR5IHBhcmVudAorICAgICAgICBAdHlwZSBDb250YWluZXIKKyAgICAgICAgQGRlZmF1bHQgbnVs
bAorICAgICAgKi8KKyAgICAgIHBhcmVudDogbnVsbCwKIAotICAvKioKLSAgICBBZGRzIHRoZSBu
YW1lZCBvYmplY3RzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBEZWZlcnMgbm90aWZ5
aW5nCi0gICAgb2JzZXJ2ZXJzIHVudGlsIGFsbCBvYmplY3RzIGhhdmUgYmVlbiBhZGRlZC4KKyAg
ICAgIC8qKgorICAgICAgICBAcHJvcGVydHkgY2hpbGRyZW4KKyAgICAgICAgQHR5cGUgQXJyYXkK
KyAgICAgICAgQGRlZmF1bHQgW10KKyAgICAgICovCisgICAgICBjaGlsZHJlbjogbnVsbCwKIAot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1
ZSJdOwotICAgIGNvbG9ycy51bnNoaWZ0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8v
IFsiYmxhY2siLCAid2hpdGUiLCAicmVkIiwgImdyZWVuIiwgImJsdWUiXQotICAgIGNvbG9ycy51
bnNoaWZ0T2JqZWN0cygieWVsbG93Iik7ICAgICAgICAgICAgIC8vIFR5cGUgRXJyb3I6ICd1bmRl
ZmluZWQnIGlzIG5vdCBhIGZ1bmN0aW9uCi0gICAgYGBgCisgICAgICAvKioKKyAgICAgICAgQHBy
b3BlcnR5IHJlc29sdmVyCisgICAgICAgIEB0eXBlIGZ1bmN0aW9uCisgICAgICAqLworICAgICAg
cmVzb2x2ZXI6IG51bGwsCiAKLSAgICBAbWV0aG9kIHVuc2hpZnRPYmplY3RzCi0gICAgQHBhcmFt
IHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIGFkZAotICAgIEByZXR1
cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgotICAqLwotICB1bnNoaWZ0T2JqZWN0czogZnVuY3Rp
b24ob2JqZWN0cykgewotICAgIHRoaXMucmVwbGFjZSgwLCAwLCBvYmplY3RzKTsKLSAgICByZXR1
cm4gdGhpczsKLSAgfSwKKyAgICAgIC8qKgorICAgICAgICBAcHJvcGVydHkgcmVnaXN0cnkKKyAg
ICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgICovCisgICAgICByZWdpc3RyeTogbnVs
bCwKIAotICAvKioKLSAgICBSZXZlcnNlIG9iamVjdHMgaW4gdGhlIGFycmF5LiBXb3JrcyBqdXN0
IGxpa2UgYHJldmVyc2UoKWAgYnV0IGl0IGlzCi0gICAgS1ZPLWNvbXBsaWFudC4KKyAgICAgIC8q
KgorICAgICAgICBAcHJvcGVydHkgY2FjaGUKKyAgICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QK
KyAgICAgICovCisgICAgICBjYWNoZTogbnVsbCwKIAotICAgIEBtZXRob2QgcmV2ZXJzZU9iamVj
dHMKLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgICovCi0gIHJldmVyc2VP
YmplY3RzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsK
LSAgICBpZiAobGVuID09PSAwKSByZXR1cm4gdGhpczsKLSAgICB2YXIgb2JqZWN0cyA9IHRoaXMu
dG9BcnJheSgpLnJldmVyc2UoKTsKLSAgICB0aGlzLnJlcGxhY2UoMCwgbGVuLCBvYmplY3RzKTsK
LSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgICAgIC8qKgorICAgICAgICBAcHJvcGVydHkgdHlw
ZUluamVjdGlvbnMKKyAgICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgICovCisgICAg
ICB0eXBlSW5qZWN0aW9uczogbnVsbCwKIAotICAvKioKLSAgICBSZXBsYWNlIGFsbCB0aGUgdGhl
IHJlY2VpdmVyJ3MgY29udGVudCB3aXRoIGNvbnRlbnQgb2YgdGhlIGFyZ3VtZW50LgotICAgIElm
IGFyZ3VtZW50IGlzIGFuIGVtcHR5IGFycmF5IHJlY2VpdmVyIHdpbGwgYmUgY2xlYXJlZC4KKyAg
ICAgIC8qKgorICAgICAgICBAcHJvcGVydHkgaW5qZWN0aW9ucworICAgICAgICBAdHlwZSBPYmpl
Y3QKKyAgICAgICAgQGRlZmF1bHQge30KKyAgICAgICovCisgICAgICBpbmplY3Rpb25zOiBudWxs
LAogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIs
ICJibHVlIl07Ci0gICAgY29sb3JzLnNldE9iamVjdHMoWyJibGFjayIsICJ3aGl0ZSJdKTsgIC8v
IFsiYmxhY2siLCAid2hpdGUiXQotICAgIGNvbG9ycy5zZXRPYmplY3RzKFtdKTsgICAgICAgICAg
ICAgICAgICAvLyBbXQotICAgIGBgYAorICAgICAgLyoqCisgICAgICAgIEBwcml2YXRlCiAKLSAg
ICBAbWV0aG9kIHNldE9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkFycmF5fSBvYmplY3RzIGFy
cmF5IHdob3NlIGNvbnRlbnQgd2lsbCBiZSB1c2VkIGZvciByZXBsYWNpbmcKLSAgICAgICAgdGhl
IGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2Vp
dmVyIHdpdGggdGhlIG5ldyBjb250ZW50Ci0gICAqLwotICBzZXRPYmplY3RzOiBmdW5jdGlvbihv
YmplY3RzKSB7Ci0gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5jbGVh
cigpOworICAgICAgICBAcHJvcGVydHkgX29wdGlvbnMKKyAgICAgICAgQHR5cGUgSW5oZXJpdGlu
Z0RpY3QKKyAgICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgKi8KKyAgICAgIF9vcHRpb25zOiBu
dWxsLAogCi0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgdGhpcy5yZXBs
YWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgICAvKioK
KyAgICAgICAgQHByaXZhdGUKIAotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIElNUExFTUVOVCBFbWJlci5NdXRhYmxl
RW51bWVyYWJsZQotICAvLworICAgICAgICBAcHJvcGVydHkgX3R5cGVPcHRpb25zCisgICAgICAg
IEB0eXBlIEluaGVyaXRpbmdEaWN0CisgICAgICAqLworICAgICAgX3R5cGVPcHRpb25zOiBudWxs
LAogCi0gIHJlbW92ZU9iamVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGxvYyA9IGdldCh0
aGlzLCAnbGVuZ3RoJykgfHwgMDsKLSAgICB3aGlsZSgtLWxvYyA+PSAwKSB7Ci0gICAgICB2YXIg
Y3VyT2JqZWN0ID0gdGhpcy5vYmplY3RBdChsb2MpIDsKLSAgICAgIGlmIChjdXJPYmplY3QgPT09
IG9iaikgdGhpcy5yZW1vdmVBdChsb2MpIDsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXMgOwotICB9
LAorICAgICAgLyoqCisgICAgICAgIFJldHVybnMgYSBuZXcgY2hpbGQgb2YgdGhlIGN1cnJlbnQg
Y29udGFpbmVyLiBUaGVzZSBjaGlsZHJlbiBhcmUgY29uZmlndXJlZAorICAgICAgICB0byBjb3Jy
ZWN0bHkgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50IGNvbnRhaW5lci4KIAotICBhZGRPYmplY3Q6
IGZ1bmN0aW9uKG9iaikgewotICAgIGlmICghdGhpcy5jb250YWlucyhvYmopKSB0aGlzLnB1c2hP
YmplY3Qob2JqKTsKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0KKyAgICAgICAgQG1ldGhvZCBjaGls
ZAorICAgICAgICBAcmV0dXJuIHtDb250YWluZXJ9CisgICAgICAqLworICAgICAgY2hpbGQ6IGZ1
bmN0aW9uKCkgeworICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcih0aGlzKTsK
KyAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7CisgICAgICAgIHJldHVybiBj
b250YWluZXI7CisgICAgICB9LAogCi19KTsKKyAgICAgIC8qKgorICAgICAgICBTZXRzIGEga2V5
LXZhbHVlIHBhaXIgb24gdGhlIGN1cnJlbnQgY29udGFpbmVyLiBJZiBhIHBhcmVudCBjb250YWlu
ZXIsCisgICAgICAgIGhhcyB0aGUgc2FtZSBrZXksIG9uY2Ugc2V0IG9uIGEgY2hpbGQsIHRoZSBw
YXJlbnQgYW5kIGNoaWxkIHdpbGwgZGl2ZXJnZQorICAgICAgICBhcyBleHBlY3RlZC4KKworICAg
ICAgICBAbWV0aG9kIHNldAorICAgICAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0CisgICAgICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXkKKyAgICAgICAgQHBhcmFtIHthbnl9IHZhbHVlCisgICAgICAq
LworICAgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKKyAgICAgICAgb2Jq
ZWN0W2tleV0gPSB2YWx1ZTsKKyAgICAgIH0sCiAKKyAgICAgIC8qKgorICAgICAgICBSZWdpc3Rl
cnMgYSBmYWN0b3J5IGZvciBsYXRlciBpbmplY3Rpb24uCiAKLX0pKCk7CisgICAgICAgIEV4YW1w
bGU6CiAKKyAgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3
IENvbnRhaW5lcigpOwogCisgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignbW9kZWw6dXNlcics
IFBlcnNvbiwge3NpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rl
cignZnJ1aXQ6ZmF2b3JpdGUnLCBPcmFuZ2UpOworICAgICAgICBjb250YWluZXIucmVnaXN0ZXIo
J2NvbW11bmljYXRpb246bWFpbicsIEVtYWlsLCB7c2luZ2xldG9uOiBmYWxzZX0pOworICAgICAg
ICBgYGAKIAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKLSovCisgICAgICAgIEBtZXRob2QgcmVnaXN0ZXIKKyAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkKKyAg
ICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgICovCisgICAgICByZWdpc3Rlcjog
ZnVuY3Rpb24oZnVsbE5hbWUsIGZhY3RvcnksIG9wdGlvbnMpIHsKKyAgICAgICAgaWYgKGZ1bGxO
YW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9y
KCJtYWxmb3JtZWQgZnVsbE5hbWUsIGV4cGVjdGVkOiBgdHlwZTpuYW1lYCBnb3Q6ICIgKyBmdWxs
TmFtZSArICIiKTsKKyAgICAgICAgfQogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJl
ci5zZXQsIGRlZmluZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVydHk7CisgICAgICAgIGlm
IChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9y
KCdBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGFuIHVua25vd24gZmFjdG9yeTogYCcgKyBmdWxsTmFt
ZSArICdgJyk7CisgICAgICAgIH0KIAotLyoqCi0gICMjIE92ZXJ2aWV3CisgICAgICAgIHZhciBu
b3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1lKTsKIAotICBUaGlzIG1peGlu
IHByb3ZpZGVzIHByb3BlcnRpZXMgYW5kIHByb3BlcnR5IG9ic2VydmluZyBmdW5jdGlvbmFsaXR5
LCBjb3JlCi0gIGZlYXR1cmVzIG9mIHRoZSBFbWJlciBvYmplY3QgbW9kZWwuCisgICAgICAgIGlm
ICh0aGlzLmNhY2hlLmhhcyhub3JtYWxpemVkTmFtZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoJ0Nhbm5vdCByZS1yZWdpc3RlcjogYCcgKyBmdWxsTmFtZSArJ2AsIGFzIGl0IGhhcyBh
bHJlYWR5IGJlZW4gbG9va2VkIHVwLicpOworICAgICAgICB9CiAKLSAgUHJvcGVydGllcyBhbmQg
b2JzZXJ2ZXJzIGFsbG93IG9uZSBvYmplY3QgdG8gb2JzZXJ2ZSBjaGFuZ2VzIHRvIGEKLSAgcHJv
cGVydHkgb24gYW5vdGhlciBvYmplY3QuIFRoaXMgaXMgb25lIG9mIHRoZSBmdW5kYW1lbnRhbCB3
YXlzIHRoYXQKLSAgbW9kZWxzLCBjb250cm9sbGVycyBhbmQgdmlld3MgY29tbXVuaWNhdGUgd2l0
aCBlYWNoIG90aGVyIGluIGFuIEVtYmVyCi0gIGFwcGxpY2F0aW9uLgorICAgICAgICB0aGlzLnJl
Z2lzdHJ5LnNldChub3JtYWxpemVkTmFtZSwgZmFjdG9yeSk7CisgICAgICAgIHRoaXMuX29wdGlv
bnMuc2V0KG5vcm1hbGl6ZWROYW1lLCBvcHRpb25zIHx8IHt9KTsKKyAgICAgIH0sCiAKLSAgQW55
IG9iamVjdCB0aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4gb2JzZXJ2
ZXIKLSAgb3BlcmF0aW9ucy4gVGhhdCBpbmNsdWRlcyBgRW1iZXIuT2JqZWN0YCBhbmQgbW9zdCBv
YmplY3RzIHlvdSB3aWxsCi0gIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIgRW1iZXIg
YXBwbGljYXRpb24uCisgICAgICAvKioKKyAgICAgICAgVW5yZWdpc3RlciBhIGZ1bGxOYW1lCiAK
LSAgTm90ZSB0aGF0IHlvdSB3aWxsIG5vdCBnZW5lcmFsbHkgYXBwbHkgdGhpcyBtaXhpbiB0byBj
bGFzc2VzIHlvdXJzZWxmLAotICBidXQgeW91IHdpbGwgdXNlIHRoZSBmZWF0dXJlcyBwcm92aWRl
ZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBzbyBpdAotICBpcyBpbXBvcnRhbnQgdG8gdW5k
ZXJzdGFuZCBob3cgdG8gdXNlIGl0LgorICAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAgIHZh
ciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rl
cignbW9kZWw6dXNlcicsIFVzZXIpOwogCi0gICMjIFVzaW5nIGBnZXQoKWAgYW5kIGBzZXQoKWAK
KyAgICAgICAgY29udGFpbmVyLmxvb2t1cCgnbW9kZWw6dXNlcicpIGluc3RhbmNlb2YgVXNlciAv
Lz0+IHRydWUKIAotICBCZWNhdXNlIG9mIEVtYmVyJ3Mgc3VwcG9ydCBmb3IgYmluZGluZ3MgYW5k
IG9ic2VydmVycywgeW91IHdpbGwgYWx3YXlzCi0gIGFjY2VzcyBwcm9wZXJ0aWVzIHVzaW5nIHRo
ZSBnZXQgbWV0aG9kLCBhbmQgc2V0IHByb3BlcnRpZXMgdXNpbmcgdGhlCi0gIHNldCBtZXRob2Qu
IFRoaXMgYWxsb3dzIHRoZSBvYnNlcnZpbmcgb2JqZWN0cyB0byBiZSBub3RpZmllZCBhbmQKLSAg
Y29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSBoYW5kbGVkIHByb3Blcmx5LgorICAgICAgICBjb250
YWluZXIudW5yZWdpc3RlcignbW9kZWw6dXNlcicpCisgICAgICAgIGNvbnRhaW5lci5sb29rdXAo
J21vZGVsOnVzZXInKSA9PT0gdW5kZWZpbmVkIC8vPT4gdHJ1ZQorICAgICAgICBgYGAKIAotICBN
b3JlIGRvY3VtZW50YXRpb24gYWJvdXQgYGdldGAgYW5kIGBzZXRgIGFyZSBiZWxvdy4KKyAgICAg
ICAgQG1ldGhvZCB1bnJlZ2lzdGVyCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQor
ICAgICAgICovCisgICAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihmdWxsTmFtZSkgeworICAgICAg
ICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CiAKLSAgIyMg
T2JzZXJ2aW5nIFByb3BlcnR5IENoYW5nZXMKKyAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1vdmUo
bm9ybWFsaXplZE5hbWUpOworICAgICAgICB0aGlzLmNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFt
ZSk7CisgICAgICAgIHRoaXMuZmFjdG9yeUNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7Cisg
ICAgICAgIHRoaXMuX29wdGlvbnMucmVtb3ZlKG5vcm1hbGl6ZWROYW1lKTsKKyAgICAgIH0sCiAK
LSAgWW91IHR5cGljYWxseSBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGlu
ZyB0aGUgYG9ic2VydmVzYAotICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFy
YXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCi0gIEZvciBleGFtcGxlOgorICAgICAg
LyoqCisgICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZh
Y3RvcnkuCiAKLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICB2
YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRo
ZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKLSAgICB9Lm9ic2VydmVzKCd2YWx1ZScpCi0gIH0p
OwotICBgYGAKKyAgICAgICAgQnkgZGVmYXVsdCBgcmVzb2x2ZWAgd2lsbCByZXRyaWV2ZSB0aGUg
ZmFjdG9yeSBmcm9tCisgICAgICAgIGl0cyBjb250YWluZXIncyByZWdpc3RyeS4KIAotICBBbHRo
b3VnaCB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gYWRkIGFuIG9ic2VydmVyLCB0aGlz
IGNhcGFiaWxpdHkKLSAgaXMgYWN0dWFsbHkgYnVpbHQgaW50byB0aGUgYEVtYmVyLk9iamVjdGAg
Y2xhc3Mgb24gdG9wIG9mIHR3byBtZXRob2RzCi0gIGRlZmluZWQgaW4gdGhpcyBtaXhpbjogYGFk
ZE9ic2VydmVyYCBhbmQgYHJlbW92ZU9ic2VydmVyYC4gWW91IGNhbiB1c2UKLSAgdGhlc2UgdHdv
IG1ldGhvZHMgdG8gYWRkIGFuZCByZW1vdmUgb2JzZXJ2ZXJzIHlvdXJzZWxmIGlmIHlvdSBuZWVk
IHRvCi0gIGRvIHNvIGF0IHJ1bnRpbWUuCisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAg
dmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKKyAgICAgICAgY29udGFpbmVyLnJlZ2lz
dGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwogCi0gIFRvIGFkZCBhbiBvYnNlcnZlciBmb3Ig
YSBwcm9wZXJ0eSwgY2FsbDoKKyAgICAgICAgY29udGFpbmVyLnJlc29sdmUoJ2FwaTp0d2l0dGVy
JykgLy8gPT4gVHdpdHRlcgorICAgICAgICBgYGAKIAotICBgYGBqYXZhc2NyaXB0Ci0gIG9iamVj
dC5hZGRPYnNlcnZlcigncHJvcGVydHlLZXknLCB0YXJnZXRPYmplY3QsIHRhcmdldEFjdGlvbikK
LSAgYGBgCisgICAgICAgIE9wdGlvbmFsbHkgdGhlIGNvbnRhaW5lciBjYW4gYmUgcHJvdmlkZWQg
d2l0aCBhIGN1c3RvbSByZXNvbHZlci4KKyAgICAgICAgSWYgcHJvdmlkZWQsIGByZXNvbHZlYCB3
aWxsIGZpcnN0IHByb3ZpZGUgdGhlIGN1c3RvbSByZXNvbHZlcgorICAgICAgICB0aGUgb3BwZXJ0
dW5pdHkgdG8gcmVzb2x2ZSB0aGUgZnVsbE5hbWUsIG90aGVyd2lzZSBpdCB3aWxsIGZhbGxiYWNr
CisgICAgICAgIHRvIHRoZSByZWdpc3RyeS4KIAotICBUaGlzIHdpbGwgY2FsbCB0aGUgYHRhcmdl
dEFjdGlvbmAgbWV0aG9kIG9uIHRoZSBgdGFyZ2V0T2JqZWN0YCB0byBiZSBjYWxsZWQKLSAgd2hl
bmV2ZXIgdGhlIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNoYW5nZXMuCisgICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKKyAg
ICAgICAgY29udGFpbmVyLnJlc29sdmVyID0gZnVuY3Rpb24oZnVsbE5hbWUpIHsKKyAgICAgICAg
ICAvLyBsb29rdXAgdmlhIHRoZSBtb2R1bGUgc3lzdGVtIG9mIGNob2ljZQorICAgICAgICB9Owog
Ci0gIE5vdGUgdGhhdCBpZiBgcHJvcGVydHlLZXlgIGlzIGEgY29tcHV0ZWQgcHJvcGVydHksIHRo
ZSBvYnNlcnZlciB3aWxsIGJlCi0gIGNhbGxlZCB3aGVuIGFueSBvZiB0aGUgcHJvcGVydHkgZGVw
ZW5kZW5jaWVzIGFyZSBjaGFuZ2VkLCBldmVuIGlmIHRoZQotICByZXN1bHRpbmcgdmFsdWUgb2Yg
dGhlIGNvbXB1dGVkIHByb3BlcnR5IGlzIHVuY2hhbmdlZC4gVGhpcyBpcyBuZWNlc3NhcnkKLSAg
YmVjYXVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBub3QgY29tcHV0ZWQgdW50aWwgYGdldGAg
aXMgY2FsbGVkLgorICAgICAgICAvLyB0aGUgdHdpdHRlciBmYWN0b3J5IGlzIGFkZGVkIHRvIHRo
ZSBtb2R1bGUgc3lzdGVtCisgICAgICAgIGNvbnRhaW5lci5yZXNvbHZlKCdhcGk6dHdpdHRlcicp
IC8vID0+IFR3aXR0ZXIKKyAgICAgICAgYGBgCiAKLSAgQGNsYXNzIE9ic2VydmFibGUKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5NaXhpbgotKi8KLUVtYmVyLk9ic2VydmFi
bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoLyoqIEBzY29wZSBFbWJlci5PYnNlcnZhYmxlLnByb3Rv
dHlwZSAqLyB7CisgICAgICAgIEBtZXRob2QgcmVzb2x2ZQorICAgICAgICBAcGFyYW0ge1N0cmlu
Z30gZnVsbE5hbWUKKyAgICAgICAgQHJldHVybiB7RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9y
eQorICAgICAgKi8KKyAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgICAg
IHJldHVybiB0aGlzLnJlc29sdmVyKGZ1bGxOYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChmdWxs
TmFtZSk7CisgICAgICB9LAogCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBw
cm9wZXJ0eSBmcm9tIHRoZSBvYmplY3QuCisgICAgICAvKioKKyAgICAgICAgQSBob29rIHRoYXQg
Y2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHRoZSByZXNvbHZlciB3aWxsCisgICAgICAgIGF0
dGVtcHQgdG8gZmluZCB0aGUgZmFjdG9yeS4KIAotICAgIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkg
c2ltaWxhciB0byB1c2luZyBgb2JqZWN0W2tleU5hbWVdYCBvciBgb2JqZWN0LmtleU5hbWVgLAot
ICAgIGhvd2V2ZXIgaXQgc3VwcG9ydHMgYm90aCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCB0aGUg
dW5rbm93blByb3BlcnR5Ci0gICAgaGFuZGxlci4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBk
ZWZhdWx0IEVtYmVyIGAuZGVzY3JpYmVgIHJldHVybnMgdGhlIGZ1bGwKKyAgICAgICAgY2xhc3Mg
bmFtZSAoaW5jbHVkaW5nIG5hbWVzcGFjZSkgd2hlcmUgRW1iZXIncyByZXNvbHZlciBleHBlY3Rz
CisgICAgICAgIHRvIGZpbmQgdGhlIGBmdWxsTmFtZWAuCiAKLSAgICBCZWNhdXNlIGBnZXRgIHVu
aWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5nIGFsbCB0aGVzZSBraW5kcwotICAgIG9mIHBy
b3BlcnRpZXMsIGl0IGNhbiBtYWtlIG1hbnkgcmVmYWN0b3JpbmdzIGVhc2llciwgc3VjaCBhcyBy
ZXBsYWNpbmcgYQotICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJvcGVydHks
IG9yIHZpY2UgdmVyc2EuCisgICAgICAgIEBtZXRob2QgZGVzY3JpYmUKKyAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgICAgIEByZXR1cm4ge3N0cmluZ30gZGVzY3JpYmVkIGZ1
bGxOYW1lCisgICAgICAqLworICAgICAgZGVzY3JpYmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Cisg
ICAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICAgIH0sCiAKLSAgICAjIyMgQ29tcHV0ZWQgUHJv
cGVydGllcworICAgICAgLyoqCisgICAgICAgIEEgaG9vayB0byBlbmFibGUgY3VzdG9tIGZ1bGxO
YW1lIG5vcm1hbGl6YXRpb24gYmVoYXZpb3VyCiAKLSAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFy
ZSBtZXRob2RzIGRlZmluZWQgd2l0aCB0aGUgYHByb3BlcnR5YCBtb2RpZmllcgotICAgIGRlY2xh
cmVkIGF0IHRoZSBlbmQsIHN1Y2ggYXM6CisgICAgICAgIEBtZXRob2Qgbm9ybWFsaXplCisgICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICAgICBAcmV0dXJuIHtzdHJpbmd9IG5v
cm1hbGl6ZWQgZnVsbE5hbWUKKyAgICAgICovCisgICAgICBub3JtYWxpemU6IGZ1bmN0aW9uKGZ1
bGxOYW1lKSB7CisgICAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICAgIH0sCiAKLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMu
Z2V0RWFjaCgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykuY29tcGFjdCgpLmpvaW4oJyAnKTsKLSAg
ICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAgIGBgYAorICAgICAgLyoq
CisgICAgICAgIEBtZXRob2QgbWFrZVRvU3RyaW5nCiAKLSAgICBXaGVuIHlvdSBjYWxsIGBnZXRg
IG9uIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBmdW5jdGlvbiB3aWxsIGJlCi0gICAgY2FsbGVk
IGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgZnVu
Y3Rpb24KLSAgICBpdHNlbGYuCisgICAgICAgIEBwYXJhbSB7YW55fSBmYWN0b3J5CisgICAgICAg
IEBwYXJhbSB7c3RyaW5nfSBmdWxsTmFtZQorICAgICAgICBAcmV0dXJuIHtmdW5jdGlvbn0gdG9T
dHJpbmcgZnVuY3Rpb24KKyAgICAgICovCisgICAgICBtYWtlVG9TdHJpbmc6IGZ1bmN0aW9uKGZh
Y3RvcnksIGZ1bGxOYW1lKSB7CisgICAgICAgIHJldHVybiBmYWN0b3J5LnRvU3RyaW5nKCk7Cisg
ICAgICB9LAogCi0gICAgIyMjIFVua25vd24gUHJvcGVydGllcworICAgICAgLyoqCisgICAgICAg
IEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZS4KIAotICAg
IExpa2V3aXNlLCBpZiB5b3UgdHJ5IHRvIGNhbGwgYGdldGAgb24gYSBwcm9wZXJ0eSB3aG9zZSB2
YWx1ZSBpcwotICAgIGB1bmRlZmluZWRgLCB0aGUgYHVua25vd25Qcm9wZXJ0eSgpYCBtZXRob2Qg
d2lsbCBiZSBjYWxsZWQgb24gdGhlIG9iamVjdC4KLSAgICBJZiB0aGlzIG1ldGhvZCByZXR1cm5z
IGFueSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLCBpdCB3aWxsIGJlIHJldHVybmVkCi0g
ICAgaW5zdGVhZC4gVGhpcyBhbGxvd3MgeW91IHRvIGltcGxlbWVudCAidmlydHVhbCIgcHJvcGVy
dGllcyB0aGF0IGFyZQotICAgIG5vdCBkZWZpbmVkIHVwZnJvbnQuCisgICAgICAgIFRoZSBkZWZh
dWx0IGJlaGF2aW91ciBpcyBmb3IgbG9va3VwIHRvIHJldHVybiBhIHNpbmdsZXRvbiBpbnN0YW5j
ZS4KKyAgICAgICAgVGhlIHNpbmdsZXRvbiBpcyBzY29wZWQgdG8gdGhlIGNvbnRhaW5lciwgYWxs
b3dpbmcgbXVsdGlwbGUgY29udGFpbmVycworICAgICAgICB0byBhbGwgaGF2ZSB0aGVpciBvd24g
bG9jYWxseSBzY29wZWQgc2luZ2xldG9ucy4KIAotICAgIEBtZXRob2QgZ2V0Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IGtleSBUaGUgcHJvcGVydHkgdG8gcmV0cmlldmUKLSAgICBAcmV0dXJuIHtPYmpl
Y3R9IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB1bmRlZmluZWQuCi0gICovCi0gIGdldDogZnVuY3Rp
b24oa2V5TmFtZSkgewotICAgIHJldHVybiBnZXQodGhpcywga2V5TmFtZSk7Ci0gIH0sCisgICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIo
KTsKKyAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwog
Ci0gIC8qKgotICAgIFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYGdl
dFByb3BlcnRpZXNgCi0gICAgd2l0aCBhIGxpc3Qgb2Ygc3RyaW5ncyBvciBhbiBhcnJheToKKyAg
ICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRlcicpOwogCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHJlY29yZC5nZXRQcm9wZXJ0aWVzKCdmaXJzdE5hbWUnLCAn
bGFzdE5hbWUnLCAnemlwQ29kZScpOyAgLy8geyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6
ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0KLSAgICBgYGAKKyAgICAgICAgdHdpdHRlciBpbnN0
YW5jZW9mIFR3aXR0ZXI7IC8vID0+IHRydWUKIAotICAgIGlzIGVxdWl2YWxlbnQgdG86CisgICAg
ICAgIC8vIGJ5IGRlZmF1bHQgdGhlIGNvbnRhaW5lciB3aWxsIHJldHVybiBzaW5nbGV0b25zCisg
ICAgICAgIHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJyk7Cisg
ICAgICAgIHR3aXR0ZXIgaW5zdGFuY2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCiAKLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgcmVjb3JkLmdldFByb3BlcnRpZXMoWydmaXJzdE5hbWUnLCAnbGFzdE5h
bWUnLCAnemlwQ29kZSddKTsgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9l
JywgemlwQ29kZTogJzEwMDExJyB9Ci0gICAgYGBgCisgICAgICAgIHR3aXR0ZXIgPT09IHR3aXR0
ZXIyOyAvLz0+IHRydWUKKyAgICAgICAgYGBgCiAKLSAgICBAbWV0aG9kIGdldFByb3BlcnRpZXMK
LSAgICBAcGFyYW0ge1N0cmluZy4uLnxBcnJheX0gbGlzdCBvZiBrZXlzIHRvIGdldAotICAgIEBy
ZXR1cm4ge0hhc2h9Ci0gICovCi0gIGdldFByb3BlcnRpZXM6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciByZXQgPSB7fTsKLSAgICB2YXIgcHJvcGVydHlOYW1lcyA9IGFyZ3VtZW50czsKLSAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBFbWJlci50eXBlT2YoYXJndW1lbnRzWzBdKSA9PT0g
J2FycmF5JykgewotICAgICAgcHJvcGVydHlOYW1lcyA9IGFyZ3VtZW50c1swXTsKLSAgICB9Ci0g
ICAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAg
IHJldFtwcm9wZXJ0eU5hbWVzW2ldXSA9IGdldCh0aGlzLCBwcm9wZXJ0eU5hbWVzW2ldKTsKLSAg
ICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAvKioKLSAgICBTZXRzIHRoZSBwcm92aWRl
ZCBrZXkgb3IgcGF0aCB0byB0aGUgdmFsdWUuCisgICAgICAgIElmIHNpbmdsZXRvbnMgYXJlIG5v
dCB3YW50ZWQgYW4gb3B0aW9uYWwgZmxhZyBjYW4gYmUgcHJvdmlkZWQgYXQgbG9va3VwLgogCi0g
ICAgVGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IHZlcnkgc2ltaWxhciB0byBjYWxsaW5nIGBvYmpl
Y3Rba2V5XSA9IHZhbHVlYCBvcgotICAgIGBvYmplY3Qua2V5ID0gdmFsdWVgLCBleGNlcHQgdGhh
dCBpdCBwcm92aWRlcyBzdXBwb3J0IGZvciBjb21wdXRlZAotICAgIHByb3BlcnRpZXMsIHRoZSBg
dW5rbm93blByb3BlcnR5KClgIG1ldGhvZCBhbmQgcHJvcGVydHkgb2JzZXJ2ZXJzLgorICAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7
CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignYXBpOnR3aXR0ZXInLCBUd2l0dGVyKTsKIAot
ICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVzCisgICAgICAgIHZhciB0d2l0dGVyID0gY29udGFp
bmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgICAg
IHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJywgeyBzaW5nbGV0
b246IGZhbHNlIH0pOwogCi0gICAgSWYgeW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0
aGF0IGhhcyBhIGNvbXB1dGVkIHByb3BlcnR5IGhhbmRsZXIKLSAgICBkZWZpbmVkIChzZWUgdGhl
IGBnZXQoKWAgbWV0aG9kIGZvciBhbiBleGFtcGxlKSwgdGhlbiBgc2V0KClgIHdpbGwgY2FsbAot
ICAgIHRoYXQgbWV0aG9kLCBwYXNzaW5nIGJvdGggdGhlIHZhbHVlIGFuZCBrZXkgaW5zdGVhZCBv
ZiBzaW1wbHkgY2hhbmdpbmcKLSAgICB0aGUgdmFsdWUgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBm
b3IgdGhvc2UgdGltZXMgd2hlbiB5b3UgbmVlZCB0bwotICAgIGltcGxlbWVudCBhIHByb3BlcnR5
IHRoYXQgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgbWVtYmVyCi0gICAgcHJvcGVydGllcy4K
KyAgICAgICAgdHdpdHRlciA9PT0gdHdpdHRlcjI7IC8vPT4gZmFsc2UKKyAgICAgICAgYGBgCiAK
LSAgICAjIyMgVW5rbm93biBQcm9wZXJ0aWVzCisgICAgICAgIEBtZXRob2QgbG9va3VwCisgICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0
aW9ucworICAgICAgICBAcmV0dXJuIHthbnl9CisgICAgICAqLworICAgICAgbG9va3VwOiBmdW5j
dGlvbihmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgICBmdWxsTmFtZSA9IHRoaXMubm9ybWFs
aXplKGZ1bGxOYW1lKTsKIAotICAgIElmIHlvdSB0cnkgdG8gc2V0IGEgdmFsdWUgb24gYSBrZXkg
dGhhdCBpcyB1bmRlZmluZWQgaW4gdGhlIHRhcmdldAotICAgIG9iamVjdCwgdGhlbiB0aGUgYHVu
a25vd25Qcm9wZXJ0eSgpYCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGluc3RlYWQuIFRoaXMKLSAg
ICBnaXZlcyB5b3UgYW4gb3Bwb3J0dW5pdHkgdG8gaW1wbGVtZW50IGNvbXBsZXggInZpcnR1YWwi
IHByb3BlcnRpZXMgdGhhdAotICAgIGFyZSBub3QgcHJlZGVmaW5lZCBvbiB0aGUgb2JqZWN0LiBJ
ZiBgdW5rbm93blByb3BlcnR5KClgIHJldHVybnMKLSAgICB1bmRlZmluZWQsIHRoZW4gYHNldCgp
YCB3aWxsIHNpbXBseSBzZXQgdGhlIHZhbHVlIG9uIHRoZSBvYmplY3QuCisgICAgICAgIG9wdGlv
bnMgPSBvcHRpb25zIHx8IHt9OwogCi0gICAgIyMjIFByb3BlcnR5IE9ic2VydmVycworICAgICAg
ICBpZiAodGhpcy5jYWNoZS5oYXMoZnVsbE5hbWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBm
YWxzZSkgeworICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChmdWxsTmFtZSk7CisgICAg
ICAgIH0KIAotICAgIEluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBwcm9wZXJ0eSwgYHNldCgp
YCB3aWxsIGFsc28gcmVnaXN0ZXIgYSBwcm9wZXJ0eQotICAgIGNoYW5nZSB3aXRoIHRoZSBvYmpl
Y3QuIFVubGVzcyB5b3UgaGF2ZSBwbGFjZWQgdGhpcyBjYWxsIGluc2lkZSBvZiBhCi0gICAgYGJl
Z2luUHJvcGVydHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxv
Y2FsIiBvYnNlcnZlcnMKLSAgICAoaS5lLiBvYnNlcnZlciBtZXRob2RzIGRlY2xhcmVkIG9uIHRo
ZSBzYW1lIG9iamVjdCksIHdpbGwgYmUgY2FsbGVkCi0gICAgaW1tZWRpYXRlbHkuIEFueSAicmVt
b3RlIiBvYnNlcnZlcnMgKGkuZS4gb2JzZXJ2ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbgotICAgIGFu
b3RoZXIgb2JqZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBs
YXRlciB0aW1lIGluIGEKLSAgICBjb2FsZXNjZWQgbWFubmVyLgorICAgICAgICB2YXIgdmFsdWUg
PSBpbnN0YW50aWF0ZSh0aGlzLCBmdWxsTmFtZSk7CiAKLSAgICAjIyMgQ2hhaW5pbmcKKyAgICAg
ICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9CiAKLSAgICBJbiBhZGRpdGlv
biB0byBwcm9wZXJ0eSBjaGFuZ2VzLCBgc2V0KClgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBv
YmplY3QKLSAgICBpdHNlbGYgc28geW91IGNhbiBkbyBjaGFpbmluZyBsaWtlIHRoaXM6CisgICAg
ICAgIGlmIChpc1NpbmdsZXRvbih0aGlzLCBmdWxsTmFtZSkgJiYgb3B0aW9ucy5zaW5nbGV0b24g
IT09IGZhbHNlKSB7CisgICAgICAgICAgdGhpcy5jYWNoZS5zZXQoZnVsbE5hbWUsIHZhbHVlKTsK
KyAgICAgICAgfQogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHJlY29yZC5zZXQoJ2ZpcnN0TmFt
ZScsICdDaGFybGVzJykuc2V0KCdsYXN0TmFtZScsICdKb2xsZXknKTsKLSAgICBgYGAKKyAgICAg
ICAgcmV0dXJuIHZhbHVlOworICAgICAgfSwKIAotICAgIEBtZXRob2Qgc2V0Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IGtleSBUaGUgcHJvcGVydHkgdG8gc2V0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHZh
bHVlIFRoZSB2YWx1ZSB0byBzZXQgb3IgYG51bGxgLgotICAgIEByZXR1cm4ge0VtYmVyLk9ic2Vy
dmFibGV9Ci0gICovCi0gIHNldDogZnVuY3Rpb24oa2V5TmFtZSwgdmFsdWUpIHsKLSAgICBzZXQo
dGhpcywga2V5TmFtZSwgdmFsdWUpOwotICAgIHJldHVybiB0aGlzOwotICB9LAorICAgICAgLyoq
CisgICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZhY3Rv
cnkuCiAKLSAgLyoqCi0gICAgVG8gc2V0IG11bHRpcGxlIHByb3BlcnRpZXMgYXQgb25jZSwgY2Fs
bCBgc2V0UHJvcGVydGllc2AKLSAgICB3aXRoIGEgSGFzaDoKKyAgICAgICAgQG1ldGhvZCBsb29r
dXBGYWN0b3J5CisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICAgICBAcmV0
dXJuIHthbnl9CisgICAgICAqLworICAgICAgbG9va3VwRmFjdG9yeTogZnVuY3Rpb24oZnVsbE5h
bWUpIHsKKyAgICAgICAgcmV0dXJuIGZhY3RvcnlGb3IodGhpcywgZnVsbE5hbWUpOworICAgICAg
fSwKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuc2V0UHJvcGVydGllcyh7IGZpcnN0
TmFtZTogJ0NoYXJsZXMnLCBsYXN0TmFtZTogJ0pvbGxleScgfSk7Ci0gICAgYGBgCisgICAgICAv
KioKKyAgICAgICAgR2l2ZW4gYSBmdWxsTmFtZSBjaGVjayBpZiB0aGUgY29udGFpbmVyIGlzIGF3
YXJlIG9mIGl0cyBmYWN0b3J5CisgICAgICAgIG9yIHNpbmdsZXRvbiBpbnN0YW5jZS4KIAotICAg
IEBtZXRob2Qgc2V0UHJvcGVydGllcwotICAgIEBwYXJhbSB7SGFzaH0gaGFzaCB0aGUgaGFzaCBv
ZiBrZXlzIGFuZCB2YWx1ZXMgdG8gc2V0Ci0gICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0K
LSAgKi8KLSAgc2V0UHJvcGVydGllczogZnVuY3Rpb24oaGFzaCkgewotICAgIHJldHVybiBFbWJl
ci5zZXRQcm9wZXJ0aWVzKHRoaXMsIGhhc2gpOwotICB9LAorICAgICAgICBAbWV0aG9kIGhhcwor
ICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgICAgQHJldHVybiB7Qm9vbGVh
bn0KKyAgICAgICovCisgICAgICBoYXM6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgICAgIGlm
ICh0aGlzLmNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQogCi0gIC8qKgotICAgIEJlZ2lucyBhIGdyb3VwaW5nIG9mIHByb3BlcnR5IGNoYW5n
ZXMuCisgICAgICAgIHJldHVybiAhIXRoaXMucmVzb2x2ZShmdWxsTmFtZSk7CisgICAgICB9LAog
Ci0gICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gZ3JvdXAgcHJvcGVydHkgY2hhbmdlcyBz
byB0aGF0IG5vdGlmaWNhdGlvbnMKLSAgICB3aWxsIG5vdCBiZSBzZW50IHVudGlsIHRoZSBjaGFu
Z2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCi0gICAgbGFyZ2UgbnVtYmVy
IG9mIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGF0IG9uZSB0aW1lLCB5b3Ugc2hvdWxkIGNhbGwgdGhp
cwotICAgIG1ldGhvZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGJlZ2luIGRl
ZmVycmluZyBjaGFuZ2UKLSAgICBub3RpZmljYXRpb25zLiBXaGVuIHlvdSBhcmUgZG9uZSBtYWtp
bmcgY2hhbmdlcywgY2FsbAotICAgIGBlbmRQcm9wZXJ0eUNoYW5nZXMoKWAgdG8gZGVsaXZlciB0
aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZAotICAgIGRlZmVycmluZy4K
KyAgICAgIC8qKgorICAgICAgICBBbGxvdyByZWdpc3RlcmluZyBvcHRpb25zIGZvciBhbGwgZmFj
dG9yaWVzIG9mIGEgdHlwZS4KIAotICAgIEBtZXRob2QgYmVnaW5Qcm9wZXJ0eUNoYW5nZXMKLSAg
ICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwotICBiZWdpblByb3BlcnR5Q2hhbmdl
czogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKTsKLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKKyAgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICB2YXIgY29u
dGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwogCi0gIC8qKgotICAgIEVuZHMgYSBncm91cGluZyBv
ZiBwcm9wZXJ0eSBjaGFuZ2VzLgorICAgICAgICAvLyBpZiBhbGwgb2YgdHlwZSBgY29ubmVjdGlv
bmAgbXVzdCBub3QgYmUgc2luZ2xldG9ucworICAgICAgICBjb250YWluZXIub3B0aW9uc0ZvclR5
cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7CiAKLSAgICBZb3UgY2FuIHVz
ZSB0aGlzIG1ldGhvZCB0byBncm91cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQgbm90aWZpY2F0
aW9ucwotICAgIHdpbGwgbm90IGJlIHNlbnQgdW50aWwgdGhlIGNoYW5nZXMgYXJlIGZpbmlzaGVk
LiBJZiB5b3UgcGxhbiB0byBtYWtlIGEKLSAgICBsYXJnZSBudW1iZXIgb2YgY2hhbmdlcyB0byBh
biBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91bGQgY2FsbAotICAgIGBiZWdpblByb3BlcnR5
Q2hhbmdlcygpYCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGRlZmVyIGNoYW5n
ZQotICAgIG5vdGlmaWNhdGlvbnMuIFdoZW4geW91IGFyZSBkb25lIG1ha2luZyBjaGFuZ2VzLCBj
YWxsIHRoaXMgbWV0aG9kIHRvCi0gICAgZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlm
aWNhdGlvbnMgYW5kIGVuZCBkZWZlcnJpbmcuCisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcign
Y29ubmVjdGlvbjp0d2l0dGVyJywgVHdpdHRlckNvbm5lY3Rpb24pOworICAgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2Nvbm5lY3Rpb246ZmFjZWJvb2snLCBGYWNlYm9va0Nvbm5lY3Rpb24pOwog
Ci0gICAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKLSAgICBAcmV0dXJuIHtFbWJlci5PYnNl
cnZhYmxlfQotICAqLwotICBlbmRQcm9wZXJ0eUNoYW5nZXM6IGZ1bmN0aW9uKCkgewotICAgIEVt
YmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpOwotICAgIHJldHVybiB0aGlzOwotICB9LAorICAgICAg
ICB2YXIgdHdpdHRlciA9IGNvbnRhaW5lci5sb29rdXAoJ2Nvbm5lY3Rpb246dHdpdHRlcicpOwor
ICAgICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIubG9va3VwKCdjb25uZWN0aW9uOnR3aXR0
ZXInKTsKIAotICAvKioKLSAgICBOb3RpZnkgdGhlIG9ic2VydmVyIHN5c3RlbSB0aGF0IGEgcHJv
cGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlLgorICAgICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsg
Ly8gPT4gZmFsc2UKIAotICAgIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2UgYSB2YWx1ZSBk
aXJlY3RseSBvciBpbmRpcmVjdGx5IHdpdGhvdXQKLSAgICBhY3R1YWxseSBjYWxsaW5nIGBnZXQo
KWAgb3IgYHNldCgpYCBvbiBpdC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSB0aGlzCi0gICAg
bWV0aG9kIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0
d28gbWV0aG9kcwotICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0
aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5Ci0gICAgY2hhbmdlZCB2YWx1ZS4KKyAgICAgICAg
dmFyIGZhY2Vib29rID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOwor
ICAgICAgICB2YXIgZmFjZWJvb2syID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNl
Ym9vaycpOwogCi0gICAgTm90ZSB0aGF0IHlvdSBtdXN0IGFsd2F5cyBjYWxsIGBwcm9wZXJ0eVdp
bGxDaGFuZ2VgIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2VgCi0gICAgYXMgYSBwYWlyLiBJZiB5b3Ug
ZG8gbm90LCBpdCBtYXkgZ2V0IHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZ3JvdXBzIG91dCBvZgotICAg
IG9yZGVyIGFuZCBjYXVzZSBub3RpZmljYXRpb25zIHRvIGJlIGRlbGl2ZXJlZCBtb3JlIG9mdGVu
IHRoYW4geW91IHdvdWxkCi0gICAgbGlrZS4KKyAgICAgICAgZmFjZWJvb2sgPT09IGZhY2Vib29r
MjsgLy8gPT4gZmFsc2UKKyAgICAgICAgYGBgCiAKLSAgICBAbWV0aG9kIHByb3BlcnR5V2lsbENo
YW5nZQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIHByb3BlcnR5IGtleSB0aGF0IGlzIGFi
b3V0IHRvIGNoYW5nZS4KLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwotICBw
cm9wZXJ0eVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGtleU5hbWUpewotICAgIEVtYmVyLnByb3BlcnR5
V2lsbENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgICAg
ICAgQG1ldGhvZCBvcHRpb25zRm9yVHlwZQorICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQor
ICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgICAgKi8KKyAgICAgIG9wdGlvbnNG
b3JUeXBlOiBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7CisgICAgICAgIGlmICh0aGlzLnBhcmVu
dCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ29wdGlvbnNGb3JUeXBlJyk7IH0KIAotICAvKioK
LSAgICBOb3RpZnkgdGhlIG9ic2VydmVyIHN5c3RlbSB0aGF0IGEgcHJvcGVydHkgaGFzIGp1c3Qg
Y2hhbmdlZC4KKyAgICAgICAgdGhpcy5fdHlwZU9wdGlvbnMuc2V0KHR5cGUsIG9wdGlvbnMpOwor
ICAgICAgfSwKIAotICAgIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2UgYSB2YWx1ZSBkaXJl
Y3RseSBvciBpbmRpcmVjdGx5IHdpdGhvdXQKLSAgICBhY3R1YWxseSBjYWxsaW5nIGBnZXQoKWAg
b3IgYHNldCgpYCBvbiBpdC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSB0aGlzCi0gICAgbWV0
aG9kIGFuZCBgcHJvcGVydHlXaWxsQ2hhbmdlKClgIGluc3RlYWQuIENhbGxpbmcgdGhlc2UgdHdv
IG1ldGhvZHMKLSAgICB0b2dldGhlciB3aWxsIG5vdGlmeSBhbGwgb2JzZXJ2ZXJzIHRoYXQgdGhl
IHByb3BlcnR5IGhhcyBwb3RlbnRpYWxseQotICAgIGNoYW5nZWQgdmFsdWUuCisgICAgICAvKioK
KyAgICAgICAgQG1ldGhvZCBvcHRpb25zCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisg
ICAgICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgICAqLworICAgICAgb3B0aW9uczog
ZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnNGb3JUeXBlKHR5
cGUsIG9wdGlvbnMpOworICAgICAgfSwKIAotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMg
Y2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAotICAgIGFz
IGEgcGFpci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdy
b3VwcyBvdXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxp
dmVyZWQgbW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAgIGxpa2UuCisgICAgICAvKioKKyAg
ICAgICAgVXNlZCBvbmx5IHZpYSBgaW5qZWN0aW9uYC4KIAotICAgIEBtZXRob2QgcHJvcGVydHlE
aWRDaGFuZ2UKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5IHRo
YXQgaGFzIGp1c3QgY2hhbmdlZC4KLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAq
LwotICBwcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24oa2V5TmFtZSkgewotICAgIEVtYmVyLnBy
b3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwotICAgIHJldHVybiB0aGlzOwotICB9LAor
ICAgICAgICBQcm92aWRlcyBhIHNwZWNpYWxpemVkIGZvcm0gb2YgaW5qZWN0aW9uLCBzcGVjaWZp
Y2FsbHkgZW5hYmxpbmcKKyAgICAgICAgYWxsIG9iamVjdHMgb2Ygb25lIHR5cGUgdG8gYmUgaW5q
ZWN0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgICAgIG9iamVjdC4KIAotICAv
KioKLSAgICBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBh
bmQgYHByb3BlcnR5RGlkQ2hhbmdlYCBpbgotICAgIHN1Y2Nlc3Npb24uCisgICAgICAgIEZvciBl
eGFtcGxlLCBwcm92aWRlZCBlYWNoIG9iamVjdCBvZiB0eXBlIGBjb250cm9sbGVyYCBuZWVkZWQg
YSBgcm91dGVyYC4KKyAgICAgICAgb25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICBA
bWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUg
VGhlIHByb3BlcnR5IGtleSB0byBiZSBub3RpZmllZCBhYm91dC4KLSAgICBAcmV0dXJuIHtFbWJl
ci5PYnNlcnZhYmxlfQotICAqLwotICBub3RpZnlQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24oa2V5
TmFtZSkgewotICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGtleU5hbWUpOwotICAgIHRoaXMu
cHJvcGVydHlEaWRDaGFuZ2Uoa2V5TmFtZSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIo
KTsKIAotICBhZGRCZWZvcmVPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIG1ldGhvZCkg
ewotICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2Qp
OwotICB9LAorICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3JvdXRlcjptYWluJywgUm91dGVy
KTsKKyAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb250cm9sbGVyOnVzZXInLCBVc2VyQ29u
dHJvbGxlcik7CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjpwb3N0Jywg
UG9zdENvbnRyb2xsZXIpOwogCi0gIC8qKgotICAgIEFkZHMgYW4gb2JzZXJ2ZXIgb24gYSBwcm9w
ZXJ0eS4KKyAgICAgICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAncm91
dGVyJywgJ3JvdXRlcjptYWluJyk7CiAKLSAgICBUaGlzIGlzIHRoZSBjb3JlIG1ldGhvZCB1c2Vk
IHRvIHJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHByb3BlcnR5LgorICAgICAgICB2YXIgdXNl
ciA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6dXNlcicpOworICAgICAgICB2YXIgcG9z
dCA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6cG9zdCcpOwogCi0gICAgT25jZSB5b3Ug
Y2FsbCB0aGlzIG1ldGhvZCwgYW55dGltZSB0aGUga2V5J3MgdmFsdWUgaXMgc2V0LCB5b3VyIG9i
c2VydmVyCi0gICAgd2lsbCBiZSBub3RpZmllZC4gTm90ZSB0aGF0IHRoZSBvYnNlcnZlcnMgYXJl
IHRyaWdnZXJlZCBhbnl0aW1lIHRoZQotICAgIHZhbHVlIGlzIHNldCwgcmVnYXJkbGVzcyBvZiB3
aGV0aGVyIGl0IGhhcyBhY3R1YWxseSBjaGFuZ2VkLiBZb3VyCi0gICAgb2JzZXJ2ZXIgc2hvdWxk
IGJlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGF0LgorICAgICAgICB1c2VyLnJvdXRlciBpbnN0YW5j
ZW9mIFJvdXRlcjsgLy89PiB0cnVlCisgICAgICAgIHBvc3Qucm91dGVyIGluc3RhbmNlb2YgUm91
dGVyOyAvLz0+IHRydWUKIAotICAgIFlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIGNvbnRl
eHQgcGFyYW1ldGVyIHRvIHRoaXMgbWV0aG9kLiBUaGUKLSAgICBjb250ZXh0IHdpbGwgYmUgcGFz
c2VkIHRvIHlvdXIgb2JzZXJ2ZXIgbWV0aG9kIHdoZW5ldmVyIGl0IGlzIHRyaWdnZXJlZC4KLSAg
ICBOb3RlIHRoYXQgaWYgeW91IGFkZCB0aGUgc2FtZSB0YXJnZXQvbWV0aG9kIHBhaXIgb24gYSBr
ZXkgbXVsdGlwbGUgdGltZXMKLSAgICB3aXRoIGRpZmZlcmVudCBjb250ZXh0IHBhcmFtZXRlcnMs
IHlvdXIgb2JzZXJ2ZXIgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbmNlCi0gICAgd2l0aCB0aGUgbGFz
dCBjb250ZXh0IHlvdSBwYXNzZWQuCisgICAgICAgIC8vIGJvdGggY29udHJvbGxlcnMgc2hhcmUg
dGhlIHNhbWUgcm91dGVyCisgICAgICAgIHVzZXIucm91dGVyID09PSBwb3N0LnJvdXRlcjsgLy89
PiB0cnVlCisgICAgICAgIGBgYAogCi0gICAgIyMjIE9ic2VydmVyIE1ldGhvZHMKKyAgICAgICAg
QHByaXZhdGUKKyAgICAgICAgQG1ldGhvZCB0eXBlSW5qZWN0aW9uCisgICAgICAgIEBwYXJhbSB7
U3RyaW5nfSB0eXBlCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQorICAgICAgICBA
cGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgICovCisgICAgICB0eXBlSW5qZWN0aW9uOiBm
dW5jdGlvbih0eXBlLCBwcm9wZXJ0eSwgZnVsbE5hbWUpIHsKKyAgICAgICAgaWYgKHRoaXMucGFy
ZW50KSB7IGlsbGVnYWxDaGlsZE9wZXJhdGlvbigndHlwZUluamVjdGlvbicpOyB9CiAKLSAgICBP
YnNlcnZlciBtZXRob2RzIHlvdSBwYXNzIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSB0aGUgZm9sbG93
aW5nIHNpZ25hdHVyZSBpZgotICAgIHlvdSBkbyBub3QgcGFzcyBhIGBjb250ZXh0YCBwYXJhbWV0
ZXI6CisgICAgICAgIGFkZFR5cGVJbmplY3Rpb24odGhpcy50eXBlSW5qZWN0aW9ucywgdHlwZSwg
cHJvcGVydHksIGZ1bGxOYW1lKTsKKyAgICAgIH0sCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
Zm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIHJldikgeyB9OwotICAg
IGBgYAorICAgICAgLyoqCisgICAgICAgIERlZmluZXMgaW5qZWN0aW9uIHJ1bGVzLgogCi0gICAg
VGhlIHNlbmRlciBpcyB0aGUgb2JqZWN0IHRoYXQgY2hhbmdlZC4gVGhlIGtleSBpcyB0aGUgcHJv
cGVydHkgdGhhdAotICAgIGNoYW5nZXMuIFRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBjdXJyZW50bHkg
cmVzZXJ2ZWQgYW5kIHVudXNlZC4gVGhlIHJldgotICAgIGlzIHRoZSBsYXN0IHByb3BlcnR5IHJl
dmlzaW9uIG9mIHRoZSBvYmplY3Qgd2hlbiBpdCBjaGFuZ2VkLCB3aGljaCB5b3UgY2FuCi0gICAg
dXNlIHRvIGRldGVjdCBpZiB0aGUga2V5IHZhbHVlIGhhcyByZWFsbHkgY2hhbmdlZCBvciBub3Qu
CisgICAgICAgIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGluamVjdCBkZXBlbmRlbmNpZXMgb250
byBvYmplY3RzIHdoZW4gdGhleQorICAgICAgICBhcmUgaW5zdGFudGlhdGVkLgogCi0gICAgSWYg
eW91IHBhc3MgYSBgY29udGV4dGAgcGFyYW1ldGVyLCB0aGUgY29udGV4dCB3aWxsIGJlIHBhc3Nl
ZCBiZWZvcmUgdGhlCi0gICAgcmV2aXNpb24gbGlrZSBzbzoKKyAgICAgICAgVHdvIGZvcm1zIG9m
IGluamVjdGlvbnMgYXJlIHBvc3NpYmxlOgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZvb0Rp
ZENoYW5nZTogZnVuY3Rpb24oc2VuZGVyLCBrZXksIHZhbHVlLCBjb250ZXh0LCByZXYpIHsgfTsK
LSAgICBgYGAKKyAgICAgICAgKiBJbmplY3Rpbmcgb25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVs
bE5hbWUKKyAgICAgICAgKiBJbmplY3Rpbmcgb25lIGZ1bGxOYW1lIG9uIGEgdHlwZQogCi0gICAg
VXN1YWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0aGUgdmFsdWUsIGNvbnRleHQgb3IgcmV2aXNpb24g
cGFyYW1ldGVycyBhdAotICAgIHRoZSBlbmQuIEluIHRoaXMgY2FzZSwgaXQgaXMgY29tbW9uIHRv
IHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0YWtlCi0gICAgb25seSBhIHNlbmRlciBhbmQg
a2V5IHZhbHVlIGFzIHBhcmFtZXRlcnMgb3IsIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbgot
ICAgIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRvIHdyaXRlIGFuIG9ic2VydmVyIHRoYXQgaGFzIG5v
IHBhcmFtZXRlcnMgYXQgYWxsLgorICAgICAgICBFeGFtcGxlOgogCi0gICAgQG1ldGhvZCBhZGRP
YnNlcnZlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgotICAg
IEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCi0gICAg
QHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAg
ICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHNlbGYKLSAgKi8KLSAgYWRkT2JzZXJ2ZXI6IGZ1bmN0
aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlzLCBr
ZXksIHRhcmdldCwgbWV0aG9kKTsKLSAgfSwKKyAgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
ICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwogCi0gIC8qKgotICAgIFJlbW92ZSBh
biBvYnNlcnZlciB5b3UgaGF2ZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gdGhpcyBvYmplY3Qu
IFBhc3MKLSAgICB0aGUgc2FtZSBrZXksIHRhcmdldCwgYW5kIG1ldGhvZCB5b3UgcGFzc2VkIHRv
IGBhZGRPYnNlcnZlcigpYCBhbmQgeW91cgotICAgIHRhcmdldCB3aWxsIG5vIGxvbmdlciByZWNl
aXZlIG5vdGlmaWNhdGlvbnMuCisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcignc291cmNlOm1h
aW4nLCBTb3VyY2UpOworICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBV
c2VyKTsKKyAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDpwb3N0JywgUG9zdCk7CiAK
LSAgICBAbWV0aG9kIHJlbW92ZU9ic2VydmVyCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSBUaGUg
a2V5IHRvIG9ic2VydmVyCi0gICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgdGFyZ2V0IG9i
amVjdCB0byBpbnZva2UKLSAgICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBt
ZXRob2QgdG8gaW52b2tlLgotICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9IHJlY2VpdmVy
Ci0gICovCi0gIHJlbW92ZU9ic2VydmVyOiBmdW5jdGlvbihrZXksIHRhcmdldCwgbWV0aG9kKSB7
Ci0gICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywga2V5LCB0YXJnZXQsIG1ldGhvZCk7Ci0g
IH0sCisgICAgICAgIC8vIGluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFt
ZQorICAgICAgICAvLyBlZy4gZWFjaCB1c2VyIG1vZGVsIGdldHMgYSBwb3N0IG1vZGVsCisgICAg
ICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ21vZGVsOnVzZXInLCAncG9zdCcsICdtb2RlbDpwb3N0
Jyk7CiAKLSAgLyoqCi0gICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBjdXJyZW50bHkg
aGFzIG9ic2VydmVycyByZWdpc3RlcmVkIGZvciBhCi0gICAgcGFydGljdWxhciBrZXkuIFlvdSBj
YW4gdXNlIHRoaXMgbWV0aG9kIHRvIHBvdGVudGlhbGx5IGRlZmVyIHBlcmZvcm1pbmcKLSAgICBh
biBleHBlbnNpdmUgYWN0aW9uIHVudGlsIHNvbWVvbmUgYmVnaW5zIG9ic2VydmluZyBhIHBhcnRp
Y3VsYXIgcHJvcGVydHkKLSAgICBvbiB0aGUgb2JqZWN0LgorICAgICAgICAvLyBpbmplY3Rpbmcg
b25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgdHlwZQorICAgICAgICBjb250YWluZXIuaW5qZWN0aW9u
KCdtb2RlbCcsICdzb3VyY2UnLCAnc291cmNlOm1haW4nKTsKIAotICAgIEBtZXRob2QgaGFzT2Jz
ZXJ2ZXJGb3IKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBjaGVjawotICAgIEByZXR1
cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhc09ic2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsKLSAg
ICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIGtleSsnOmNoYW5nZScpOwotICB9LAor
ICAgICAgICB2YXIgdXNlciA9IGNvbnRhaW5lci5sb29rdXAoJ21vZGVsOnVzZXInKTsKKyAgICAg
ICAgdmFyIHBvc3QgPSBjb250YWluZXIubG9va3VwKCdtb2RlbDpwb3N0Jyk7CiAKLSAgLyoqCi0g
ICAgQGRlcHJlY2F0ZWQKLSAgICBAbWV0aG9kIGdldFBhdGgKLSAgICBAcGFyYW0ge1N0cmluZ30g
cGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byByZXRyaWV2ZQotICAgIEByZXR1cm4ge09iamVjdH0g
VGhlIHByb3BlcnR5IHZhbHVlIG9yIHVuZGVmaW5lZC4KLSAgKi8KLSAgZ2V0UGF0aDogZnVuY3Rp
b24ocGF0aCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgiZ2V0UGF0aCBpcyBkZXByZWNhdGVkIHNp
bmNlIGdldCBub3cgc3VwcG9ydHMgcGF0aHMiKTsKLSAgICByZXR1cm4gdGhpcy5nZXQocGF0aCk7
Ci0gIH0sCisgICAgICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2YgU291cmNlOyAvLz0+IHRydWUK
KyAgICAgICAgcG9zdC5zb3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQogCi0gIC8q
KgotICAgIEBkZXByZWNhdGVkCi0gICAgQG1ldGhvZCBzZXRQYXRoCi0gICAgQHBhcmFtIHtTdHJp
bmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBzZXQKLSAgICBA
cGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBvciBgbnVsbGAuCi0gICAgQHJl
dHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgc2V0UGF0aDogZnVuY3Rpb24ocGF0aCwg
dmFsdWUpIHsKLSAgICBFbWJlci5kZXByZWNhdGUoInNldFBhdGggaXMgZGVwcmVjYXRlZCBzaW5j
ZSBzZXQgbm93IHN1cHBvcnRzIHBhdGhzIik7Ci0gICAgcmV0dXJuIHRoaXMuc2V0KHBhdGgsIHZh
bHVlKTsKLSAgfSwKKyAgICAgICAgdXNlci5wb3N0IGluc3RhbmNlb2YgUG9zdDsgLy89PiB0cnVl
CiAKLSAgLyoqCi0gICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LCBvciBhIGRl
ZmF1bHQgdmFsdWUgaW4gdGhlIGNhc2UgdGhhdCB0aGUKLSAgICBwcm9wZXJ0eSByZXR1cm5zIGB1
bmRlZmluZWRgLgorICAgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUgdGhlIHNhbWUgc291
cmNlCisgICAgICAgIHVzZXIuc291cmNlID09PSBwb3N0LnNvdXJjZTsgLy89PiB0cnVlCisgICAg
ICAgIGBgYAogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHBlcnNvbi5nZXRXaXRoRGVmYXVsdCgn
bGFzdE5hbWUnLCAnRG9lJyk7Ci0gICAgYGBgCisgICAgICAgIEBtZXRob2QgaW5qZWN0aW9uCisg
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmYWN0b3J5TmFtZQorICAgICAgICBAcGFyYW0ge1N0cmlu
Z30gcHJvcGVydHkKKyAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGluamVjdGlvbk5hbWUKKyAgICAg
ICovCisgICAgICBpbmplY3Rpb246IGZ1bmN0aW9uKGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5q
ZWN0aW9uTmFtZSkgeworICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3Bl
cmF0aW9uKCdpbmplY3Rpb24nKTsgfQogCi0gICAgQG1ldGhvZCBnZXRXaXRoRGVmYXVsdAotICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRy
aWV2ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHJldHVy
biBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdW5kZWZpbmVkCi0gICAgQHJldHVybiB7T2JqZWN0
fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHRWYWx1ZS4KLSAgKi8KLSAgZ2V0V2l0
aERlZmF1bHQ6IGZ1bmN0aW9uKGtleU5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBF
bWJlci5nZXRXaXRoRGVmYXVsdCh0aGlzLCBrZXlOYW1lLCBkZWZhdWx0VmFsdWUpOwotICB9LAor
ICAgICAgICBpZiAoZmFjdG9yeU5hbWUuaW5kZXhPZignOicpID09PSAtMSkgeworICAgICAgICAg
IHJldHVybiB0aGlzLnR5cGVJbmplY3Rpb24oZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmplY3Rp
b25OYW1lKTsKKyAgICAgICAgfQogCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9w
ZXJ0eSB0byB0aGUgY3VycmVudCB2YWx1ZSBwbHVzIHNvbWUgYW1vdW50LgorICAgICAgICBhZGRJ
bmplY3Rpb24odGhpcy5pbmplY3Rpb25zLCBmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlv
bk5hbWUpOworICAgICAgfSwKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBwZXJzb24uaW5jcmVt
ZW50UHJvcGVydHkoJ2FnZScpOwotICAgIHRlYW0uaW5jcmVtZW50UHJvcGVydHkoJ3Njb3JlJywg
Mik7Ci0gICAgYGBgCiAKLSAgICBAbWV0aG9kIGluY3JlbWVudFByb3BlcnR5Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGluY3JlbWVudAot
ICAgIEBwYXJhbSB7T2JqZWN0fSBpbmNyZW1lbnQgVGhlIGFtb3VudCB0byBpbmNyZW1lbnQgYnku
IERlZmF1bHRzIHRvIDEKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgcHJvcGVydHkgdmFs
dWUKLSAgKi8KLSAgaW5jcmVtZW50UHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUsIGluY3JlbWVu
dCkgewotICAgIGlmICghaW5jcmVtZW50KSB7IGluY3JlbWVudCA9IDE7IH0KLSAgICBzZXQodGhp
cywga2V5TmFtZSwgKGdldCh0aGlzLCBrZXlOYW1lKSB8fCAwKStpbmNyZW1lbnQpOwotICAgIHJl
dHVybiBnZXQodGhpcywga2V5TmFtZSk7Ci0gIH0sCisgICAgICAvKioKKyAgICAgICAgVXNlZCBv
bmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCiAKLSAgLyoqCi0gICAgU2V0IHRoZSB2YWx1ZSBv
ZiBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIHNvbWUgYW1vdW50LgorICAg
ICAgICBQcm92aWRlcyBhIHNwZWNpYWxpemVkIGZvcm0gb2YgaW5qZWN0aW9uLCBzcGVjaWZpY2Fs
bHkgZW5hYmxpbmcKKyAgICAgICAgYWxsIGZhY3Rvcnkgb2Ygb25lIHR5cGUgdG8gYmUgaW5qZWN0
ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgICAgIG9iamVjdC4KIAotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBwbGF5ZXIuZGVjcmVtZW50UHJvcGVydHkoJ2xpdmVzJyk7Ci0gICAg
b3JjLmRlY3JlbWVudFByb3BlcnR5KCdoZWFsdGgnLCA1KTsKLSAgICBgYGAKKyAgICAgICAgRm9y
IGV4YW1wbGUsIHByb3ZpZGVkIGVhY2ggZmFjdG9yeSBvZiB0eXBlIGBtb2RlbGAgbmVlZGVkIGEg
YHN0b3JlYC4KKyAgICAgICAgb25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICBAbWV0
aG9kIGRlY3JlbWVudFByb3BlcnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5h
bWUgb2YgdGhlIHByb3BlcnR5IHRvIGRlY3JlbWVudAotICAgIEBwYXJhbSB7T2JqZWN0fSBpbmNy
ZW1lbnQgVGhlIGFtb3VudCB0byBkZWNyZW1lbnQgYnkuIERlZmF1bHRzIHRvIDEKLSAgICBAcmV0
dXJuIHtPYmplY3R9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKLSAgKi8KLSAgZGVjcmVtZW50UHJv
cGVydHk6IGZ1bmN0aW9uKGtleU5hbWUsIGluY3JlbWVudCkgewotICAgIGlmICghaW5jcmVtZW50
KSB7IGluY3JlbWVudCA9IDE7IH0KLSAgICBzZXQodGhpcywga2V5TmFtZSwgKGdldCh0aGlzLCBr
ZXlOYW1lKSB8fCAwKS1pbmNyZW1lbnQpOwotICAgIHJldHVybiBnZXQodGhpcywga2V5TmFtZSk7
Ci0gIH0sCisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5l
dyBDb250YWluZXIoKTsKIAotICAvKioKLSAgICBTZXQgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBw
cm9wZXJ0eSB0byB0aGUgb3Bwb3NpdGUgb2YgaXQncwotICAgIGN1cnJlbnQgdmFsdWUuCisgICAg
ICAgIGNvbnRhaW5lci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFNvbWVTdG9yZSk7CiAKLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgc3RhcnNoaXAudG9nZ2xlUHJvcGVydHkoJ3dhcnBEcml2ZUVuYWdl
ZCcpOwotICAgIGBgYAorICAgICAgICBjb250YWluZXIuZmFjdG9yeVR5cGVJbmplY3Rpb24oJ21v
ZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKIAotICAgIEBtZXRob2QgdG9nZ2xlUHJvcGVy
dHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkg
dG8gdG9nZ2xlCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlCi0g
ICovCi0gIHRvZ2dsZVByb3BlcnR5OiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgc2V0KHRoaXMs
IGtleU5hbWUsICFnZXQodGhpcywga2V5TmFtZSkpOwotICAgIHJldHVybiBnZXQodGhpcywga2V5
TmFtZSk7Ci0gIH0sCisgICAgICAgIHZhciBzdG9yZSA9IGNvbnRhaW5lci5sb29rdXAoJ3N0b3Jl
Om1haW4nKTsKKyAgICAgICAgdmFyIFVzZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3Rv
cnkoJ21vZGVsOnVzZXInKTsKIAotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUg
b2YgYSBjb21wdXRlZCBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLgotICAgIFRoaXMgYWxsb3dzIHlv
dSB0byBpbnNwZWN0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgd2l0aG91
dCBhY2NpZGVudGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAgICBn
ZW5lcmF0ZWQgbGF6aWx5LgorICAgICAgICBVc2VyRmFjdG9yeS5zdG9yZSBpbnN0YW5jZW9mIFNv
bWVTdG9yZTsgLy89PiB0cnVlCisgICAgICAgIGBgYAogCi0gICAgQG1ldGhvZCBjYWNoZUZvcgot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgY2Fj
aGVkIHZhbHVlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSwgaWYgYW55Ci0gICovCi0gIGNhY2hl
Rm9yOiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmNhY2hlRm9yKHRoaXMs
IGtleU5hbWUpOwotICB9LAorICAgICAgICBAcHJpdmF0ZQorICAgICAgICBAbWV0aG9kIGZhY3Rv
cnlUeXBlSW5qZWN0aW9uCisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgICAgIEBw
YXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQorICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUK
KyAgICAgICovCisgICAgICBmYWN0b3J5VHlwZUluamVjdGlvbjogZnVuY3Rpb24odHlwZSwgcHJv
cGVydHksIGZ1bGxOYW1lKSB7CisgICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hp
bGRPcGVyYXRpb24oJ2ZhY3RvcnlUeXBlSW5qZWN0aW9uJyk7IH0KIAotICAvLyBpbnRlbmRlZCBm
b3IgZGVidWdnaW5nIHB1cnBvc2VzCi0gIG9ic2VydmVyc0ZvcktleTogZnVuY3Rpb24oa2V5TmFt
ZSkgewotICAgIHJldHVybiBFbWJlci5vYnNlcnZlcnNGb3IodGhpcywga2V5TmFtZSk7Ci0gIH0K
LX0pOworICAgICAgICBhZGRUeXBlSW5qZWN0aW9uKHRoaXMuZmFjdG9yeVR5cGVJbmplY3Rpb25z
LCB0eXBlLCBwcm9wZXJ0eSwgZnVsbE5hbWUpOworICAgICAgfSwKIAorICAgICAgLyoqCisgICAg
ICAgIERlZmluZXMgZmFjdG9yeSBpbmplY3Rpb24gcnVsZXMuCiAKLX0pKCk7CisgICAgICAgIFNp
bWlsYXIgdG8gcmVndWxhciBpbmplY3Rpb24gcnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWluc3QgZmFj
dG9yaWVzLCB2aWEKKyAgICAgICAgYENvbnRhaW5lciNsb29rdXBGYWN0b3J5YC4KIAorICAgICAg
ICBUaGVzZSBydWxlcyBhcmUgdXNlZCB0byBpbmplY3Qgb2JqZWN0cyBvbnRvIGZhY3RvcmllcyB3
aGVuIHRoZXkKKyAgICAgICAgYXJlIGxvb2tlZCB1cC4KIAorICAgICAgICBUd28gZm9ybXMgb2Yg
aW5qZWN0aW9ucyBhcmUgcG9zc2libGU6CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBl
bWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLworICAgICAgKiBJbmplY3Rpbmcgb25l
IGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVsbE5hbWUKKyAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxs
TmFtZSBvbiBhIHR5cGUKIAotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0Owor
ICAgICAgICBFeGFtcGxlOgogCi0vKioKLUBjbGFzcyBUYXJnZXRBY3Rpb25TdXBwb3J0Ci1AbmFt
ZXNwYWNlIEVtYmVyCi1AZXh0ZW5kcyBFbWJlci5NaXhpbgotKi8KLUVtYmVyLlRhcmdldEFjdGlv
blN1cHBvcnQgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICB0YXJnZXQ6IG51bGwsCi0gIGFjdGlv
bjogbnVsbCwKKyAgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICB2YXIgY29udGFpbmVyID0g
bmV3IENvbnRhaW5lcigpOwogCi0gIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0Jyk7CisgICAgICAgIGNv
bnRhaW5lci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFN0b3JlKTsKKyAgICAgICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdzdG9yZTpzZWNvbmRhcnknLCBPdGhlclN0b3JlKTsKKyAgICAgICAgY29udGFp
bmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgVXNlcik7CisgICAgICAgIGNvbnRhaW5lci5yZWdp
c3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOwogCi0gICAgaWYgKEVtYmVyLnR5cGVPZih0YXJnZXQp
ID09PSAic3RyaW5nIikgewotICAgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIHRhcmdldCk7Ci0g
ICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IGdldChFbWJlci5sb29rdXAs
IHRhcmdldCk7IH0KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0
dXJuIHRhcmdldDsKLSAgICB9Ci0gIH0pLnByb3BlcnR5KCd0YXJnZXQnKSwKKyAgICAgICAgLy8g
aW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKKyAgICAgICAgY29udGFpbmVy
LmZhY3RvcnlJbmplY3Rpb24oJ21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKIAotICB0
cmlnZ2VyQWN0aW9uOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYWN0aW9uID0gZ2V0KHRoaXMsICdh
Y3Rpb24nKSwKLSAgICAgICAgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXRPYmplY3QnKTsKKyAg
ICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1lCisgICAg
ICAgIGNvbnRhaW5lci5mYWN0b3J5SW5qZWN0aW9uKCdtb2RlbDpwb3N0JywgJ3NlY29uZGFyeVN0
b3JlJywgJ3N0b3JlOnNlY29uZGFyeScpOwogCi0gICAgaWYgKHRhcmdldCAmJiBhY3Rpb24pIHsK
LSAgICAgIHZhciByZXQ7CisgICAgICAgIHZhciBVc2VyRmFjdG9yeSA9IGNvbnRhaW5lci5sb29r
dXBGYWN0b3J5KCdtb2RlbDp1c2VyJyk7CisgICAgICAgIHZhciBQb3N0RmFjdG9yeSA9IGNvbnRh
aW5lci5sb29rdXBGYWN0b3J5KCdtb2RlbDpwb3N0Jyk7CisgICAgICAgIHZhciBzdG9yZSA9IGNv
bnRhaW5lci5sb29rdXAoJ3N0b3JlOm1haW4nKTsKIAotICAgICAgaWYgKHR5cGVvZiB0YXJnZXQu
c2VuZCA9PT0gJ2Z1bmN0aW9uJykgewotICAgICAgICByZXQgPSB0YXJnZXQuc2VuZChhY3Rpb24s
IHRoaXMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdz
dHJpbmcnKSB7Ci0gICAgICAgICAgYWN0aW9uID0gdGFyZ2V0W2FjdGlvbl07CisgICAgICAgIFVz
ZXJGYWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU3RvcmU7IC8vPT4gdHJ1ZQorICAgICAgICBVc2Vy
RmFjdG9yeS5zZWNvbmRhcnlTdG9yZSBpbnN0YW5jZW9mIE90aGVyU3RvcmU7IC8vPT4gZmFsc2UK
KworICAgICAgICBQb3N0RmFjdG9yeS5zdG9yZSBpbnN0YW5jZW9mIFN0b3JlOyAvLz0+IHRydWUK
KyAgICAgICAgUG9zdEZhY3Rvcnkuc2Vjb25kYXJ5U3RvcmUgaW5zdGFuY2VvZiBPdGhlclN0b3Jl
OyAvLz0+IHRydWUKKworICAgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUgdGhlIHNhbWUg
c291cmNlIGluc3RhbmNlCisgICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQb3N0RmFjdG9y
eS5zdG9yZTsgLy89PiB0cnVlCisgICAgICAgIGBgYAorCisgICAgICAgIEBtZXRob2QgZmFjdG9y
eUluamVjdGlvbgorICAgICAgICBAcGFyYW0ge1N0cmluZ30gZmFjdG9yeU5hbWUKKyAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5CisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBpbmplY3Rp
b25OYW1lCisgICAgICAqLworICAgICAgZmFjdG9yeUluamVjdGlvbjogZnVuY3Rpb24oZmFjdG9y
eU5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7CisgICAgICAgIGlmICh0aGlzLnBhcmVu
dCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9CisKKyAgICAgICAgaWYg
KGZhY3RvcnlOYW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKKyAgICAgICAgICByZXR1cm4gdGhp
cy5mYWN0b3J5VHlwZUluamVjdGlvbihmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5h
bWUpOwogICAgICAgICB9Ci0gICAgICAgIHJldCA9IGFjdGlvbi5jYWxsKHRhcmdldCwgdGhpcyk7
Ci0gICAgICB9Ci0gICAgICBpZiAocmV0ICE9PSBmYWxzZSkgcmV0ID0gdHJ1ZTsKIAotICAgICAg
cmV0dXJuIHJldDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
fQotfSk7CisgICAgICAgIGFkZEluamVjdGlvbih0aGlzLmZhY3RvcnlJbmplY3Rpb25zLCBmYWN0
b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpOworICAgICAgfSwKIAotfSkoKTsKKyAg
ICAgIC8qKgorICAgICAgICBBIGRlcHRoIGZpcnN0IHRyYXZlcnNhbCwgZGVzdHJveWluZyB0aGUg
Y29udGFpbmVyLCBpdHMgZGVzY2VuZGFudCBjb250YWluZXJzIGFuZCBhbGwKKyAgICAgICAgdGhl
aXIgbWFuYWdlZCBvYmplY3RzLgogCisgICAgICAgIEBtZXRob2QgZGVzdHJveQorICAgICAgKi8K
KyAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogCisgICAgICAgIGZvciAodmFyIGk9MCwgbD10
aGlzLmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgICB0aGlzLmNoaWxkcmVu
W2ldLmRlc3Ryb3koKTsKKyAgICAgICAgfQogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KKyAgICAgICAgdGhpcy5jaGlsZHJl
biA9IFtdOwogCi0vKioKLSAgVGhpcyBtaXhpbiBhbGxvd3MgZm9yIEVtYmVyIG9iamVjdHMgdG8g
c3Vic2NyaWJlIHRvIGFuZCBlbWl0IGV2ZW50cy4KKyAgICAgICAgZWFjaERlc3Ryb3lhYmxlKHRo
aXMsIGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKKyAgICAgICAg
fSk7CiAKLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZChFbWJlci5FdmVudGVkLCB7Ci0gICAgZ3JlZXQ6IGZ1bmN0aW9uKCkgewotICAgICAgLy8gLi4u
Ci0gICAgICB0aGlzLnRyaWdnZXIoJ2dyZWV0Jyk7CisgICAgICAgIHRoaXMucGFyZW50ID0gdW5k
ZWZpbmVkOworICAgICAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgIH0sCisKKyAg
ICAgIC8qKgorICAgICAgICBAbWV0aG9kIHJlc2V0CisgICAgICAqLworICAgICAgcmVzZXQ6IGZ1
bmN0aW9uKCkgeworICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5jaGlsZHJlbi5sZW5ndGg7
IGk8bDsgaSsrKSB7CisgICAgICAgICAgcmVzZXRDYWNoZSh0aGlzLmNoaWxkcmVuW2ldKTsKKyAg
ICAgICAgfQorICAgICAgICByZXNldENhY2hlKHRoaXMpOworICAgICAgfQorICAgIH07CisKKyAg
ICBmdW5jdGlvbiBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24ob3BlcmF0aW9uKSB7CisgICAgICB0aHJv
dyBuZXcgRXJyb3Iob3BlcmF0aW9uICsgIiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBj
aGlsZCBjb250YWluZXJzIik7CiAgICAgfQotICB9KTsKIAotICB2YXIgcGVyc29uID0gQXBwLlBl
cnNvbi5jcmVhdGUoKTsKKyAgICBmdW5jdGlvbiBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxO
YW1lKSB7CisgICAgICB2YXIgc2luZ2xldG9uID0gb3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUs
ICdzaW5nbGV0b24nKTsKIAotICBwZXJzb24ub24oJ2dyZWV0JywgZnVuY3Rpb24oKSB7Ci0gICAg
Y29uc29sZS5sb2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKLSAgfSk7CisgICAgICByZXR1
cm4gc2luZ2xldG9uICE9PSBmYWxzZTsKKyAgICB9CiAKLSAgcGVyc29uLmdyZWV0KCk7CisgICAg
ZnVuY3Rpb24gYnVpbGRJbmplY3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucykgeworICAgICAg
dmFyIGhhc2ggPSB7fTsKIAotICAvLyBvdXRwdXRzOiAnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcK
LSAgYGBgCisgICAgICBpZiAoIWluamVjdGlvbnMpIHsgcmV0dXJuIGhhc2g7IH0KIAotICBAY2xh
c3MgRXZlbnRlZAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0g
Ki8KLUVtYmVyLkV2ZW50ZWQgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgdmFyIGluamVj
dGlvbiwgbG9va3VwOwogCi0gIC8qKgotICAgU3Vic2NyaWJlcyB0byBhIG5hbWVkIGV2ZW50IHdp
dGggZ2l2ZW4gZnVuY3Rpb24uCisgICAgICBmb3IgKHZhciBpPTAsIGw9aW5qZWN0aW9ucy5sZW5n
dGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGluamVjdGlvbiA9IGluamVjdGlvbnNbaV07CisgICAg
ICAgIGxvb2t1cCA9IGNvbnRhaW5lci5sb29rdXAoaW5qZWN0aW9uLmZ1bGxOYW1lKTsKIAotICAg
YGBgamF2YXNjcmlwdAotICAgcGVyc29uLm9uKCdkaWRMb2FkJywgZnVuY3Rpb24oKSB7Ci0gICAg
IC8vIGZpcmVkIG9uY2UgdGhlIHBlcnNvbiBoYXMgbG9hZGVkCi0gICB9KTsKLSAgIGBgYAorICAg
ICAgICBpZiAobG9va3VwICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBoYXNoW2luamVjdGlv
bi5wcm9wZXJ0eV0gPSBsb29rdXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIGluamVjdCBhbiB1bmtub3duIGluamVjdGlvbjogYCcg
KyBpbmplY3Rpb24uZnVsbE5hbWUgKyAnYCcpOworICAgICAgICB9CisgICAgICB9CiAKLSAgIEFu
IG9wdGlvbmFsIHRhcmdldCBjYW4gYmUgcGFzc2VkIGluIGFzIHRoZSAybmQgYXJndW1lbnQgdGhh
dCB3aWxsCi0gICBiZSBzZXQgYXMgdGhlICJ0aGlzIiBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlz
IGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3VyCi0gICBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVj
dCB0cmlnZ2VyaW5nIHRoZSBldmVudC4gV2hlbiB0aGUgdGFyZ2V0Ci0gICBwYXJhbWV0ZXIgaXMg
dXNlZCB0aGUgY2FsbGJhY2sgYmVjb21lcyB0aGUgdGhpcmQgYXJndW1lbnQuCisgICAgICByZXR1
cm4gaGFzaDsKKyAgICB9CiAKLSAgIEBtZXRob2Qgb24KLSAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAi
dGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCi0gICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRo
b2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgKi8KLSAgb246IGZ1bmN0aW9uKG5hbWUsIHRh
cmdldCwgbWV0aG9kKSB7Ci0gICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwgdGFyZ2V0
LCBtZXRob2QpOwotICB9LAorICAgIGZ1bmN0aW9uIG9wdGlvbihjb250YWluZXIsIGZ1bGxOYW1l
LCBvcHRpb25OYW1lKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IGNvbnRhaW5lci5fb3B0aW9ucy5n
ZXQoZnVsbE5hbWUpOwogCi0gIC8qKgotICAgIFN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBhIG5h
bWVkIGV2ZW50IGFuZCB0aGVuIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbgotICAgIGFmdGVyIHRo
ZSBmaXJzdCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIEl0IGlzIGdvb2QgdG8gdXNlIGBg
b25lYGAgd2hlbgotICAgIHlvdSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IHRpbWUgYW4gZXZl
bnQgaGFzIHRha2VuIHBsYWNlLgorICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRpb25O
YW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVd
OworICAgICAgfQogCi0gICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBvcHRpb25hbCAybmQgYXJn
dW1lbnQgdGhhdCB3aWxsIGJlY29tZSB0aGUgInRoaXMiCi0gICAgdmFsdWUgZm9yIHRoZSBjYWxs
YmFjay4gSWYgdGhpcyBhcmd1bWVudCBpcyBwYXNzZWQgdGhlbiB0aGUgM3JkIGFyZ3VtZW50Ci0g
ICAgYmVjb21lcyB0aGUgZnVuY3Rpb24uCisgICAgICB2YXIgdHlwZSA9IGZ1bGxOYW1lLnNwbGl0
KCI6IilbMF07CisgICAgICBvcHRpb25zID0gY29udGFpbmVyLl90eXBlT3B0aW9ucy5nZXQodHlw
ZSk7CiAKLSAgICBAbWV0aG9kIG9uZQotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1l
IG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgInRoaXMiIGJp
bmRpbmcgZm9yIHRoZSBjYWxsYmFjawotICAgIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUg
Y2FsbGJhY2sgdG8gZXhlY3V0ZQotICAqLwotICBvbmU6IGZ1bmN0aW9uKG5hbWUsIHRhcmdldCwg
bWV0aG9kKSB7Ci0gICAgaWYgKCFtZXRob2QpIHsKLSAgICAgIG1ldGhvZCA9IHRhcmdldDsKLSAg
ICAgIHRhcmdldCA9IG51bGw7CisgICAgICBpZiAob3B0aW9ucykgeworICAgICAgICByZXR1cm4g
b3B0aW9uc1tvcHRpb25OYW1lXTsKKyAgICAgIH0KICAgICB9CiAKLSAgICBFbWJlci5hZGRMaXN0
ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCwgdHJ1ZSk7Ci0gIH0sCisgICAgZnVuY3Rp
b24gZmFjdG9yeUZvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgICB2YXIgbmFtZSA9IGNv
bnRhaW5lci5ub3JtYWxpemUoZnVsbE5hbWUpOworICAgICAgdmFyIGZhY3RvcnkgPSBjb250YWlu
ZXIucmVzb2x2ZShuYW1lKTsKKyAgICAgIHZhciBpbmplY3RlZEZhY3Rvcnk7CisgICAgICB2YXIg
Y2FjaGUgPSBjb250YWluZXIuZmFjdG9yeUNhY2hlOworICAgICAgdmFyIHR5cGUgPSBmdWxsTmFt
ZS5zcGxpdCgiOiIpWzBdOwogCi0gIC8qKgotICAgIFRyaWdnZXJzIGEgbmFtZWQgZXZlbnQgZm9y
IHRoZSBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICAgIHdpbGwgYmUgcGFzc2Vk
IGFzIHBhcmFtZXRlcnMgdG8gdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdWJzY3JpYmVkIHRvIHRo
ZQotICAgIGV2ZW50LgorICAgICAgaWYgKGZhY3RvcnkgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47
IH0KIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBwZXJzb24ub24oJ2RpZEVhdCcsIGZ1bmN0aW9u
KGZvb2QpIHsKLSAgICAgIGNvbnNvbGUubG9nKCdwZXJzb24gYXRlIHNvbWUgJyArIGZvb2QpOwot
ICAgIH0pOworICAgICAgaWYgKGNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKKyAgICAgICAgcmV0dXJu
IGNhY2hlLmdldChmdWxsTmFtZSk7CisgICAgICB9CiAKLSAgICBwZXJzb24udHJpZ2dlcignZGlk
RWF0JywgJ2Jyb2Njb2xpJyk7CisgICAgICBpZiAoIWZhY3RvcnkgfHwgdHlwZW9mIGZhY3Rvcnku
ZXh0ZW5kICE9PSAnZnVuY3Rpb24nIHx8ICghRW1iZXIuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05T
ICYmIHR5cGUgPT09ICdtb2RlbCcpKSB7CisgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGEg
J3NhZmUnIG1lcmdlIHN0eWxlIGV4dGVuc2lvbgorICAgICAgICAvLyBmb3Igbm93IGp1c3QgZmFs
bGJhY2sgdG8gY3JlYXRlIHRpbWUgaW5qZWN0aW9uCisgICAgICAgIHJldHVybiBmYWN0b3J5Owor
ICAgICAgfSBlbHNlIHsKIAotICAgIC8vIG91dHB1dHM6IHBlcnNvbiBhdGUgc29tZSBicm9jY29s
aQotICAgIGBgYAotICAgIEBtZXRob2QgdHJpZ2dlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlv
bmFsIGFyZ3VtZW50cyB0byBwYXNzIG9uCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKLSAgICB2YXIgYXJncyA9IFtdLCBpLCBsOwotICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVu
dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsK
LSAgICB9Ci0gICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsIG5hbWUsIGFyZ3MpOwotICB9LAorICAg
ICAgICB2YXIgaW5qZWN0aW9ucyAgICAgICAgPSBpbmplY3Rpb25zRm9yKGNvbnRhaW5lciwgZnVs
bE5hbWUpOworICAgICAgICB2YXIgZmFjdG9yeUluamVjdGlvbnMgPSBmYWN0b3J5SW5qZWN0aW9u
c0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKTsKIAotICBmaXJlOiBmdW5jdGlvbihuYW1lKSB7Ci0g
ICAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5FdmVudGVkI2ZpcmUoKSBoYXMgYmVlbiBkZXByZWNh
dGVkIGluIGZhdm9yIG9mIHRyaWdnZXIoKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGpRdWVyeS4g
SXQgd2lsbCBiZSByZW1vdmVkIGluIDEuMC4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gY2Fs
bCB0cmlnZ2VyKCkgaW5zdGVhZC4iKTsKLSAgICB0aGlzLnRyaWdnZXIuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKLSAgfSwKKyAgICAgICAgZmFjdG9yeUluamVjdGlvbnMuX3RvU3RyaW5nID0gY29u
dGFpbmVyLm1ha2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7CiAKLSAgLyoqCi0gICAgQ2Fu
Y2VscyBzdWJzY3JpcHRpb24gZm9yIGdpdmUgbmFtZSwgdGFyZ2V0LCBhbmQgbWV0aG9kLgotCi0g
ICAgQG1ldGhvZCBvZmYKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUg
ZXZlbnQKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHN1YnNj
cmlwdGlvbgotICAgIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUgZnVuY3Rpb24gb2YgdGhl
IHN1YnNjcmlwdGlvbgotICAqLwotICBvZmY6IGZ1bmN0aW9uKG5hbWUsIHRhcmdldCwgbWV0aG9k
KSB7Ci0gICAgRW1iZXIucmVtb3ZlTGlzdGVuZXIodGhpcywgbmFtZSwgdGFyZ2V0LCBtZXRob2Qp
OwotICB9LAotCi0gIC8qKgotICAgIENoZWNrcyB0byBzZWUgaWYgb2JqZWN0IGhhcyBhbnkgc3Vi
c2NyaXB0aW9ucyBmb3IgbmFtZWQgZXZlbnQuCi0KLSAgICBAbWV0aG9kIGhhcwotICAgIEBwYXJh
bSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEByZXR1cm4ge0Jvb2xl
YW59IGRvZXMgdGhlIG9iamVjdCBoYXZlIGEgc3Vic2NyaXB0aW9uIGZvciBldmVudAotICAgKi8K
LSAgaGFzOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0
aGlzLCBuYW1lKTsKLSAgfQotfSk7Ci0KLX0pKCk7CisgICAgICAgIGluamVjdGVkRmFjdG9yeSA9
IGZhY3RvcnkuZXh0ZW5kKGluamVjdGlvbnMpOworICAgICAgICBpbmplY3RlZEZhY3RvcnkucmVv
cGVuQ2xhc3MoZmFjdG9yeUluamVjdGlvbnMpOwogCisgICAgICAgIGNhY2hlLnNldChmdWxsTmFt
ZSwgaW5qZWN0ZWRGYWN0b3J5KTsKIAorICAgICAgICByZXR1cm4gaW5qZWN0ZWRGYWN0b3J5Owor
ICAgICAgfQorICAgIH0KIAotKGZ1bmN0aW9uKCkgewotdmFyIFJTVlAgPSByZXF1aXJlTW9kdWxl
KCJyc3ZwIik7Ci0KLVJTVlAuYXN5bmMgPSBmdW5jdGlvbihjYWxsYmFjaywgYmluZGluZykgewot
ICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBiaW5kaW5nLCBjYWxsYmFjayk7Ci19Owot
Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KKyAgICBm
dW5jdGlvbiBpbmplY3Rpb25zRm9yKGNvbnRhaW5lciAsZnVsbE5hbWUpIHsKKyAgICAgIHZhciBz
cGxpdE5hbWUgPSBmdWxsTmFtZS5zcGxpdCgiOiIpLAorICAgICAgICB0eXBlID0gc3BsaXROYW1l
WzBdLAorICAgICAgICBpbmplY3Rpb25zID0gW107CiAKLXZhciBnZXQgPSBFbWJlci5nZXQsCi0g
ICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgICAgICBpbmplY3Rpb25zID0gaW5q
ZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLnR5cGVJbmplY3Rpb25zLmdldCh0eXBlKSB8fCBbXSk7
CisgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLmluamVjdGlv
bnNbZnVsbE5hbWVdIHx8IFtdKTsKIAotLyoqCi0gIEBjbGFzcyBEZWZlcnJlZAotICBAbmFtZXNw
YWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0gKi8KLUVtYmVyLkRlZmVycmVkTWl4
aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAvKioKLSAgICBBZGQgaGFuZGxlcnMgdG8gYmUg
Y2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIG9iamVjdCBpcyByZXNvbHZlZCBvciByZWplY3RlZC4K
KyAgICAgIGluamVjdGlvbnMgPSBidWlsZEluamVjdGlvbnMoY29udGFpbmVyLCBpbmplY3Rpb25z
KTsKKyAgICAgIGluamVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5ID0gZnVsbE5hbWU7CisgICAg
ICBpbmplY3Rpb25zLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKIAotICAgIEBtZXRob2QgdGhlbgot
ICAgIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVDYWxsYmFjayBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRv
IGJlIGNhbGxlZCB3aGVuIGRvbmUKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmYWlsQ2FsbGJhY2sg
YSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBmYWlsZWQKLSAgKi8KLSAgdGhl
bjogZnVuY3Rpb24oZG9uZUNhbGxiYWNrLCBmYWlsQ2FsbGJhY2spIHsKLSAgICB2YXIgcHJvbWlz
ZSA9IGdldCh0aGlzLCAncHJvbWlzZScpOwotICAgIHJldHVybiBwcm9taXNlLnRoZW4uYXBwbHko
cHJvbWlzZSwgYXJndW1lbnRzKTsKLSAgfSwKKyAgICAgIHJldHVybiBpbmplY3Rpb25zOworICAg
IH0KIAotICAvKioKLSAgICBSZXNvbHZlIGEgRGVmZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBg
ZG9uZUNhbGxiYWNrc2Agd2l0aCB0aGUgZ2l2ZW4gYXJncy4KKyAgICBmdW5jdGlvbiBmYWN0b3J5
SW5qZWN0aW9uc0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgICB2YXIgc3BsaXROYW1l
ID0gZnVsbE5hbWUuc3BsaXQoIjoiKSwKKyAgICAgICAgdHlwZSA9IHNwbGl0TmFtZVswXSwKKyAg
ICAgICAgZmFjdG9yeUluamVjdGlvbnMgPSBbXTsKIAotICAgIEBtZXRob2QgcmVzb2x2ZQotICAq
LwotICByZXNvbHZlOiBmdW5jdGlvbih2YWx1ZSkgewotICAgIGdldCh0aGlzLCAncHJvbWlzZScp
LnJlc29sdmUodmFsdWUpOwotICB9LAorICAgICAgZmFjdG9yeUluamVjdGlvbnMgPSBmYWN0b3J5
SW5qZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLmZhY3RvcnlUeXBlSW5qZWN0aW9ucy5nZXQodHlw
ZSkgfHwgW10pOworICAgICAgZmFjdG9yeUluamVjdGlvbnMgPSBmYWN0b3J5SW5qZWN0aW9ucy5j
b25jYXQoY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb25zW2Z1bGxOYW1lXSB8fCBbXSk7CiAKLSAg
LyoqCi0gICAgUmVqZWN0IGEgRGVmZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBgZmFpbENhbGxi
YWNrc2Agd2l0aCB0aGUgZ2l2ZW4gYXJncy4KKyAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0gYnVp
bGRJbmplY3Rpb25zKGNvbnRhaW5lciwgZmFjdG9yeUluamVjdGlvbnMpOworICAgICAgZmFjdG9y
eUluamVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5ID0gZnVsbE5hbWU7CiAKLSAgICBAbWV0aG9k
IHJlamVjdAotICAqLwotICByZWplY3Q6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgZ2V0KHRoaXMs
ICdwcm9taXNlJykucmVqZWN0KHZhbHVlKTsKLSAgfSwKKyAgICAgIHJldHVybiBmYWN0b3J5SW5q
ZWN0aW9uczsKKyAgICB9CiAKLSAgcHJvbWlzZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIG5ldyBSU1ZQLlByb21pc2UoKTsKLSAgfSkKLX0pOworICAgIGZ1bmN0aW9u
IGluc3RhbnRpYXRlKGNvbnRhaW5lciwgZnVsbE5hbWUpIHsKKyAgICAgIHZhciBmYWN0b3J5ID0g
ZmFjdG9yeUZvcihjb250YWluZXIsIGZ1bGxOYW1lKTsKIAorICAgICAgaWYgKG9wdGlvbihjb250
YWluZXIsIGZ1bGxOYW1lLCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgcmV0
dXJuIGZhY3Rvcnk7CisgICAgICB9CiAKLX0pKCk7CisgICAgICBpZiAoZmFjdG9yeSkgeworICAg
ICAgICBpZiAodHlwZW9mIGZhY3RvcnkuZXh0ZW5kID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAg
ICAgLy8gYXNzdW1lIHRoZSBmYWN0b3J5IHdhcyBleHRlbmRhYmxlIGFuZCBpcyBhbHJlYWR5IGlu
amVjdGVkCisgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKCk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgLy8gYXNzdW1lIHRoZSBmYWN0b3J5IHdhcyBleHRlbmRhYmxlCisgICAg
ICAgICAgLy8gdG8gY3JlYXRlIHRpbWUgaW5qZWN0aW9ucworICAgICAgICAgIC8vIFRPRE86IHN1
cHBvcnQgbmV3J2luZyBmb3IgaW5zdGFudGlhdGlvbiBhbmQgbWVyZ2UgaW5qZWN0aW9ucyBmb3Ig
cHVyZSBKUyBGdW5jdGlvbnMKKyAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoaW5qZWN0
aW9uc0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9
CiAKKyAgICBmdW5jdGlvbiBlYWNoRGVzdHJveWFibGUoY29udGFpbmVyLCBjYWxsYmFjaykgewor
ICAgICAgY29udGFpbmVyLmNhY2hlLmVhY2hMb2NhbChmdW5jdGlvbihrZXksIHZhbHVlKSB7Cisg
ICAgICAgIGlmIChvcHRpb24oY29udGFpbmVyLCBrZXksICdpbnN0YW50aWF0ZScpID09PSBmYWxz
ZSkgeyByZXR1cm47IH0KKyAgICAgICAgY2FsbGJhY2sodmFsdWUpOworICAgICAgfSk7CisgICAg
fQogCisgICAgZnVuY3Rpb24gcmVzZXRDYWNoZShjb250YWluZXIpIHsKKyAgICAgIGNvbnRhaW5l
ci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAob3B0
aW9uKGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9
CisgICAgICAgIHZhbHVlLmRlc3Ryb3koKTsKKyAgICAgIH0pOworICAgICAgY29udGFpbmVyLmNh
Y2hlLmRpY3QgPSB7fTsKKyAgICB9CiAKLShmdW5jdGlvbigpIHsKKyAgICBmdW5jdGlvbiBhZGRU
eXBlSW5qZWN0aW9uKHJ1bGVzLCB0eXBlLCBwcm9wZXJ0eSwgZnVsbE5hbWUpIHsKKyAgICAgIHZh
ciBpbmplY3Rpb25zID0gcnVsZXMuZ2V0KHR5cGUpOwogCi19KSgpOworICAgICAgaWYgKCFpbmpl
Y3Rpb25zKSB7CisgICAgICAgIGluamVjdGlvbnMgPSBbXTsKKyAgICAgICAgcnVsZXMuc2V0KHR5
cGUsIGluamVjdGlvbnMpOworICAgICAgfQogCisgICAgICBpbmplY3Rpb25zLnB1c2goeworICAg
ICAgICBwcm9wZXJ0eTogcHJvcGVydHksCisgICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZQorICAg
ICAgfSk7CisgICAgfQogCisgICAgZnVuY3Rpb24gYWRkSW5qZWN0aW9uKHJ1bGVzLCBmYWN0b3J5
TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpIHsKKyAgICAgIHZhciBpbmplY3Rpb25zID0g
cnVsZXNbZmFjdG9yeU5hbWVdID0gcnVsZXNbZmFjdG9yeU5hbWVdIHx8IFtdOworICAgICAgaW5q
ZWN0aW9ucy5wdXNoKHsgcHJvcGVydHk6IHByb3BlcnR5LCBmdWxsTmFtZTogaW5qZWN0aW9uTmFt
ZSB9KTsKKyAgICB9CiAKLShmdW5jdGlvbigpIHsKLUVtYmVyLkNvbnRhaW5lciA9IHJlcXVpcmVN
b2R1bGUoJ2NvbnRhaW5lcicpOwotRW1iZXIuQ29udGFpbmVyLnNldCA9IEVtYmVyLnNldDsKKyAg
ICByZXR1cm4gQ29udGFpbmVyOworfSk7CiAKIH0pKCk7CiAKLQotCiAoZnVuY3Rpb24oKSB7Cisv
Kmdsb2JhbHMgRU5WICovCiAvKioKIEBtb2R1bGUgZW1iZXIKIEBzdWJtb2R1bGUgZW1iZXItcnVu
dGltZQogKi8KIAordmFyIGluZGV4T2YgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuaW5kZXhPZjsK
IAotLy8gTk9URTogdGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIGJlIGluY2x1ZGVkIGRpcmVjdGx5
LiBJbnN0ZWFkIHVzZSBFbWJlci4KLS8vIEVtYmVyLk9iamVjdC4gV2Ugb25seSBkZWZpbmUgdGhp
cyBzZXBhcmF0ZWx5IHNvIHRoYXQgRW1iZXIuU2V0IGNhbiBkZXBlbmQgb24gaXQKLQorLyoqCisg
VGhpcyB3aWxsIGNvbXBhcmUgdHdvIGphdmFzY3JpcHQgdmFsdWVzIG9mIHBvc3NpYmx5IGRpZmZl
cmVudCB0eXBlcy4KKyBJdCB3aWxsIHRlbGwgeW91IHdoaWNoIG9uZSBpcyBncmVhdGVyIHRoYW4g
dGhlIG90aGVyIGJ5IHJldHVybmluZzoKIAotdmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0gRW1i
ZXIuZ2V0LAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG9fZGVmaW5lUHJvcGVy
dHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwKLSAgICBhX3NsaWNlID0gQXJyYXku
cHJvdG90eXBlLnNsaWNlLAotICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9LRVksCi0gICAgZ3Vp
ZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgZ2VuZXJhdGVHdWlkID0gRW1iZXIuZ2VuZXJhdGVH
dWlkLAotICAgIG1ldGEgPSBFbWJlci5tZXRhLAotICAgIHJld2F0Y2ggPSBFbWJlci5yZXdhdGNo
LAotICAgIGZpbmlzaENoYWlucyA9IEVtYmVyLmZpbmlzaENoYWlucywKLSAgICBkZXN0cm95ID0g
RW1iZXIuZGVzdHJveSwKLSAgICBzY2hlZHVsZSA9IEVtYmVyLnJ1bi5zY2hlZHVsZSwKLSAgICBN
aXhpbiA9IEVtYmVyLk1peGluLAotICAgIGFwcGx5TWl4aW4gPSBNaXhpbi5fYXBwbHksCi0gICAg
ZmluaXNoUGFydGlhbCA9IE1peGluLmZpbmlzaFBhcnRpYWwsCi0gICAgcmVvcGVuID0gTWl4aW4u
cHJvdG90eXBlLnJlb3BlbiwKLSAgICBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRB
VE9SWV9TRVRURVIsCi0gICAgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9m
OworICAtIC0xIGlmIHRoZSBmaXJzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwKKyAgLSAw
IGlmIGJvdGggYXJlIGVxdWFsLAorICAtIDEgaWYgdGhlIGZpcnN0IGlzIGdyZWF0ZXIgdGhhbiB0
aGUgc2Vjb25kLgogCi12YXIgdW5kZWZpbmVkRGVzY3JpcHRvciA9IHsKLSAgY29uZmlndXJhYmxl
OiB0cnVlLAotICB3cml0YWJsZTogdHJ1ZSwKLSAgZW51bWVyYWJsZTogZmFsc2UsCi0gIHZhbHVl
OiB1bmRlZmluZWQKLX07CisgVGhlIG9yZGVyIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gYEVtYmVy
Lk9SREVSX0RFRklOSVRJT05gLCBpZiB0eXBlcyBhcmUgZGlmZmVyZW50LgorIEluIGNhc2UgdGhl
eSBoYXZlIHRoZSBzYW1lIHR5cGUgYW4gYXBwcm9wcmlhdGUgY29tcGFyaXNvbiBmb3IgdGhpcyB0
eXBlIGlzIG1hZGUuCiAKLWZ1bmN0aW9uIG1ha2VDdG9yKCkgeworICBgYGBqYXZhc2NyaXB0Cisg
IEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywgJ2hlbGxvJyk7ICAvLyAwCisgIEVtYmVyLmNvbXBhcmUo
J2FiYycsICdkZmcnKTsgICAgICAvLyAtMQorICBFbWJlci5jb21wYXJlKDIsIDEpOyAgICAgICAg
ICAgICAgLy8gMQorICBgYGAKIAotICAvLyBOb3RlOiBhdm9pZCBhY2Nlc3NpbmcgYW55IHByb3Bl
cnRpZXMgb24gdGhlIG9iamVjdCBzaW5jZSBpdCBtYWtlcyB0aGUKLSAgLy8gbWV0aG9kIGEgbG90
IGZhc3Rlci4gVGhpcyBpcyBnbHVlIGNvZGUgc28gd2Ugd2FudCBpdCB0byBiZSBhcyBmYXN0IGFz
Ci0gIC8vIHBvc3NpYmxlLgorIEBtZXRob2QgY29tcGFyZQorIEBmb3IgRW1iZXIKKyBAcGFyYW0g
e09iamVjdH0gdiBGaXJzdCB2YWx1ZSB0byBjb21wYXJlCisgQHBhcmFtIHtPYmplY3R9IHcgU2Vj
b25kIHZhbHVlIHRvIGNvbXBhcmUKKyBAcmV0dXJuIHtOdW1iZXJ9IC0xIGlmIHYgPCB3LCAwIGlm
IHYgPSB3IGFuZCAxIGlmIHYgPiB3LgorKi8KK0VtYmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21w
YXJlKHYsIHcpIHsKKyAgaWYgKHYgPT09IHcpIHsgcmV0dXJuIDA7IH0KIAotICB2YXIgd2FzQXBw
bGllZCA9IGZhbHNlLCBpbml0TWl4aW5zLCBpbml0UHJvcGVydGllczsKKyAgdmFyIHR5cGUxID0g
RW1iZXIudHlwZU9mKHYpOworICB2YXIgdHlwZTIgPSBFbWJlci50eXBlT2Yodyk7CiAKLSAgdmFy
IENsYXNzID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF3YXNBcHBsaWVkKSB7Ci0gICAgICBDbGFz
cy5wcm90bygpOyAvLyBwcmVwYXJlIHByb3RvdHlwZS4uLgorICB2YXIgQ29tcGFyYWJsZSA9IEVt
YmVyLkNvbXBhcmFibGU7CisgIGlmIChDb21wYXJhYmxlKSB7CisgICAgaWYgKHR5cGUxPT09J2lu
c3RhbmNlJyAmJiBDb21wYXJhYmxlLmRldGVjdCh2LmNvbnN0cnVjdG9yKSkgeworICAgICAgcmV0
dXJuIHYuY29uc3RydWN0b3IuY29tcGFyZSh2LCB3KTsKICAgICB9Ci0gICAgb19kZWZpbmVQcm9w
ZXJ0eSh0aGlzLCBHVUlEX0tFWSwgdW5kZWZpbmVkRGVzY3JpcHRvcik7Ci0gICAgb19kZWZpbmVQ
cm9wZXJ0eSh0aGlzLCAnX3N1cGVyJywgdW5kZWZpbmVkRGVzY3JpcHRvcik7Ci0gICAgdmFyIG0g
PSBtZXRhKHRoaXMpOwotICAgIG0ucHJvdG8gPSB0aGlzOwotICAgIGlmIChpbml0TWl4aW5zKSB7
Ci0gICAgICAvLyBjYXB0dXJlIGxvY2FsbHkgc28gd2UgY2FuIGNsZWFyIHRoZSBjbG9zZWQgb3Zl
ciB2YXJpYWJsZQotICAgICAgdmFyIG1peGlucyA9IGluaXRNaXhpbnM7Ci0gICAgICBpbml0TWl4
aW5zID0gbnVsbDsKLSAgICAgIHRoaXMucmVvcGVuLmFwcGx5KHRoaXMsIG1peGlucyk7CisKKyAg
ICBpZiAodHlwZTIgPT09ICdpbnN0YW5jZScgJiYgQ29tcGFyYWJsZS5kZXRlY3Qody5jb25zdHJ1
Y3RvcikpIHsKKyAgICAgIHJldHVybiAxLXcuY29uc3RydWN0b3IuY29tcGFyZSh3LCB2KTsKICAg
ICB9Ci0gICAgaWYgKGluaXRQcm9wZXJ0aWVzKSB7Ci0gICAgICAvLyBjYXB0dXJlIGxvY2FsbHkg
c28gd2UgY2FuIGNsZWFyIHRoZSBjbG9zZWQgb3ZlciB2YXJpYWJsZQotICAgICAgdmFyIHByb3Bz
ID0gaW5pdFByb3BlcnRpZXM7Ci0gICAgICBpbml0UHJvcGVydGllcyA9IG51bGw7CisgIH0KIAot
ICAgICAgdmFyIGNvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSB0aGlzLmNvbmNhdGVuYXRlZFByb3Bl
cnRpZXM7CisgIC8vIElmIHdlIGhhdmVuJ3QgeWV0IGdlbmVyYXRlZCBhIHJldmVyc2UtbWFwcGlu
ZyBvZiBFbWJlci5PUkRFUl9ERUZJTklUSU9OLAorICAvLyBkbyBzbyBub3cuCisgIHZhciBtYXBw
aW5nID0gRW1iZXIuT1JERVJfREVGSU5JVElPTl9NQVBQSU5HOworICBpZiAoIW1hcHBpbmcpIHsK
KyAgICB2YXIgb3JkZXIgPSBFbWJlci5PUkRFUl9ERUZJTklUSU9OOworICAgIG1hcHBpbmcgPSBF
bWJlci5PUkRFUl9ERUZJTklUSU9OX01BUFBJTkcgPSB7fTsKKyAgICB2YXIgaWR4LCBsZW47Cisg
ICAgZm9yIChpZHggPSAwLCBsZW4gPSBvcmRlci5sZW5ndGg7IGlkeCA8IGxlbjsgICsraWR4KSB7
CisgICAgICBtYXBwaW5nW29yZGVyW2lkeF1dID0gaWR4OworICAgIH0KIAotICAgICAgZm9yICh2
YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgdmFyIHBy
b3BlcnRpZXMgPSBwcm9wc1tpXTsKLSAgICAgICAgZm9yICh2YXIga2V5TmFtZSBpbiBwcm9wZXJ0
aWVzKSB7Ci0gICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleU5hbWUp
KSB7IGNvbnRpbnVlOyB9CisgICAgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgRW1iZXIuT1JERVJfREVG
SU5JVElPTi4KKyAgICBkZWxldGUgRW1iZXIuT1JERVJfREVGSU5JVElPTjsKKyAgfQogCi0gICAg
ICAgICAgdmFyIHZhbHVlID0gcHJvcGVydGllc1trZXlOYW1lXSwKLSAgICAgICAgICAgICAgSVNf
QklORElORyA9IEVtYmVyLklTX0JJTkRJTkc7CisgIHZhciB0eXBlMUluZGV4ID0gbWFwcGluZ1t0
eXBlMV07CisgIHZhciB0eXBlMkluZGV4ID0gbWFwcGluZ1t0eXBlMl07CiAKLSAgICAgICAgICBp
ZiAoSVNfQklORElORy50ZXN0KGtleU5hbWUpKSB7Ci0gICAgICAgICAgICB2YXIgYmluZGluZ3Mg
PSBtLmJpbmRpbmdzOwotICAgICAgICAgICAgaWYgKCFiaW5kaW5ncykgewotICAgICAgICAgICAg
ICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW0u
aGFzT3duUHJvcGVydHkoJ2JpbmRpbmdzJykpIHsKLSAgICAgICAgICAgICAgYmluZGluZ3MgPSBt
LmJpbmRpbmdzID0gb19jcmVhdGUobS5iaW5kaW5ncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBiaW5kaW5nc1trZXlOYW1lXSA9IHZhbHVlOwotICAgICAgICAgIH0KKyAgaWYgKHR5cGUx
SW5kZXggPCB0eXBlMkluZGV4KSB7IHJldHVybiAtMTsgfQorICBpZiAodHlwZTFJbmRleCA+IHR5
cGUySW5kZXgpIHsgcmV0dXJuIDE7IH0KIAotICAgICAgICAgIHZhciBkZXNjID0gbS5kZXNjc1tr
ZXlOYW1lXTsKKyAgLy8gdHlwZXMgYXJlIGVxdWFsIC0gc28gd2UgaGF2ZSB0byBjaGVjayB2YWx1
ZXMgbm93CisgIHN3aXRjaCAodHlwZTEpIHsKKyAgICBjYXNlICdib29sZWFuJzoKKyAgICBjYXNl
ICdudW1iZXInOgorICAgICAgaWYgKHYgPCB3KSB7IHJldHVybiAtMTsgfQorICAgICAgaWYgKHYg
PiB3KSB7IHJldHVybiAxOyB9CisgICAgICByZXR1cm4gMDsKIAotICAgICAgICAgIEVtYmVyLmFz
c2VydCgiRW1iZXIuT2JqZWN0LmNyZWF0ZSBubyBsb25nZXIgc3VwcG9ydHMgZGVmaW5pbmcgY29t
cHV0ZWQgcHJvcGVydGllcy4iLCAhKHZhbHVlIGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9w
ZXJ0eSkpOwotICAgICAgICAgIEVtYmVyLmFzc2VydCgiRW1iZXIuT2JqZWN0LmNyZWF0ZSBubyBs
b25nZXIgc3VwcG9ydHMgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwgX3N1cGVyLiIsICEodHlw
ZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZignLl9z
dXBlcicpICE9PSAtMSkpOworICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICB2YXIgY29tcCA9IHYu
bG9jYWxlQ29tcGFyZSh3KTsKKyAgICAgIGlmIChjb21wIDwgMCkgeyByZXR1cm4gLTE7IH0KKyAg
ICAgIGlmIChjb21wID4gMCkgeyByZXR1cm4gMTsgfQorICAgICAgcmV0dXJuIDA7CiAKLSAgICAg
ICAgICBpZiAoY29uY2F0ZW5hdGVkUHJvcGVydGllcyAmJiBpbmRleE9mKGNvbmNhdGVuYXRlZFBy
b3BlcnRpZXMsIGtleU5hbWUpID49IDApIHsKLSAgICAgICAgICAgIHZhciBiYXNlVmFsdWUgPSB0
aGlzW2tleU5hbWVdOworICAgIGNhc2UgJ2FycmF5JzoKKyAgICAgIHZhciB2TGVuID0gdi5sZW5n
dGg7CisgICAgICB2YXIgd0xlbiA9IHcubGVuZ3RoOworICAgICAgdmFyIGwgPSBNYXRoLm1pbih2
TGVuLCB3TGVuKTsKKyAgICAgIHZhciByID0gMDsKKyAgICAgIHZhciBpID0gMDsKKyAgICAgIHdo
aWxlIChyID09PSAwICYmIGkgPCBsKSB7CisgICAgICAgIHIgPSBjb21wYXJlKHZbaV0sd1tpXSk7
CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICAgIGlmIChyICE9PSAwKSB7IHJldHVybiByOyB9
CiAKLSAgICAgICAgICAgIGlmIChiYXNlVmFsdWUpIHsKLSAgICAgICAgICAgICAgaWYgKCdmdW5j
dGlvbicgPT09IHR5cGVvZiBiYXNlVmFsdWUuY29uY2F0KSB7Ci0gICAgICAgICAgICAgICAgdmFs
dWUgPSBiYXNlVmFsdWUuY29uY2F0KHZhbHVlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICB2YWx1ZSA9IEVtYmVyLm1ha2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2
YWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgIHZhbHVlID0gRW1iZXIubWFrZUFycmF5KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICB9CisgICAgICAvLyBhbGwgZWxlbWVudHMgYXJlIGVxdWFsIG5vdworICAgICAgLy8gc2hv
cnRlciBhcnJheSBzaG91bGQgYmUgb3JkZXJlZCBmaXJzdAorICAgICAgaWYgKHZMZW4gPCB3TGVu
KSB7IHJldHVybiAtMTsgfQorICAgICAgaWYgKHZMZW4gPiB3TGVuKSB7IHJldHVybiAxOyB9Cisg
ICAgICAvLyBhcnJheXMgYXJlIGVxdWFsIG5vdworICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAg
ICBpZiAoZGVzYykgewotICAgICAgICAgICAgZGVzYy5zZXQodGhpcywga2V5TmFtZSwgdmFsdWUp
OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0VW5r
bm93blByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmICEoa2V5TmFtZSBpbiB0aGlzKSkgewotICAg
ICAgICAgICAgICB0aGlzLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1lLCB2YWx1ZSk7Ci0gICAg
ICAgICAgICB9IGVsc2UgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgICAgICAgRW1i
ZXIuZGVmaW5lUHJvcGVydHkodGhpcywga2V5TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBt
YW5kYXRvcnkgc2V0dGVyCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0aGlz
W2tleU5hbWVdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9
CisgICAgY2FzZSAnaW5zdGFuY2UnOgorICAgICAgaWYgKEVtYmVyLkNvbXBhcmFibGUgJiYgRW1i
ZXIuQ29tcGFyYWJsZS5kZXRlY3QodikpIHsKKyAgICAgICAgcmV0dXJuIHYuY29tcGFyZSh2LCB3
KTsKICAgICAgIH0KLSAgICB9Ci0gICAgZmluaXNoUGFydGlhbCh0aGlzLCBtKTsKLSAgICBkZWxl
dGUgbS5wcm90bzsKLSAgICBmaW5pc2hDaGFpbnModGhpcyk7Ci0gICAgdGhpcy5pbml0LmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07CisgICAgICByZXR1cm4gMDsKIAotICBDbGFzcy50b1N0
cmluZyA9IE1peGluLnByb3RvdHlwZS50b1N0cmluZzsKLSAgQ2xhc3Mud2lsbFJlb3BlbiA9IGZ1
bmN0aW9uKCkgewotICAgIGlmICh3YXNBcHBsaWVkKSB7Ci0gICAgICBDbGFzcy5Qcm90b3R5cGVN
aXhpbiA9IE1peGluLmNyZWF0ZShDbGFzcy5Qcm90b3R5cGVNaXhpbik7Ci0gICAgfQorICAgIGNh
c2UgJ2RhdGUnOgorICAgICAgdmFyIHZOdW0gPSB2LmdldFRpbWUoKTsKKyAgICAgIHZhciB3TnVt
ID0gdy5nZXRUaW1lKCk7CisgICAgICBpZiAodk51bSA8IHdOdW0pIHsgcmV0dXJuIC0xOyB9Cisg
ICAgICBpZiAodk51bSA+IHdOdW0pIHsgcmV0dXJuIDE7IH0KKyAgICAgIHJldHVybiAwOwogCi0g
ICAgd2FzQXBwbGllZCA9IGZhbHNlOwotICB9OwotICBDbGFzcy5faW5pdE1peGlucyA9IGZ1bmN0
aW9uKGFyZ3MpIHsgaW5pdE1peGlucyA9IGFyZ3M7IH07Ci0gIENsYXNzLl9pbml0UHJvcGVydGll
cyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdFByb3BlcnRpZXMgPSBhcmdzOyB9OworICAgIGRlZmF1
bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfTsKIAotICBDbGFzcy5wcm90byA9IGZ1bmN0aW9u
KCkgewotICAgIHZhciBzdXBlcmNsYXNzID0gQ2xhc3Muc3VwZXJjbGFzczsKLSAgICBpZiAoc3Vw
ZXJjbGFzcykgeyBzdXBlcmNsYXNzLnByb3RvKCk7IH0KK2Z1bmN0aW9uIF9jb3B5KG9iaiwgZGVl
cCwgc2VlbiwgY29waWVzKSB7CisgIHZhciByZXQsIGxvYywga2V5OwogCi0gICAgaWYgKCF3YXNB
cHBsaWVkKSB7Ci0gICAgICB3YXNBcHBsaWVkID0gdHJ1ZTsKLSAgICAgIENsYXNzLlByb3RvdHlw
ZU1peGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOwotICAgICAgcmV3YXRjaChDbGFz
cy5wcm90b3R5cGUpOworICAvLyBwcmltaXRpdmUgZGF0YSB0eXBlcyBhcmUgaW1tdXRhYmxlLCBq
dXN0IHJldHVybiB0aGVtLgorICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBvYmogfHwgb2JqPT09
bnVsbCkgcmV0dXJuIG9iajsKKworICAvLyBhdm9pZCBjeWNsaWNhbCBsb29wcworICBpZiAoZGVl
cCAmJiAobG9jPWluZGV4T2Yoc2Vlbiwgb2JqKSk+PTApIHJldHVybiBjb3BpZXNbbG9jXTsKKwor
ICBFbWJlci5hc3NlcnQoJ0Nhbm5vdCBjbG9uZSBhbiBFbWJlci5PYmplY3QgdGhhdCBkb2VzIG5v
dCBpbXBsZW1lbnQgRW1iZXIuQ29weWFibGUnLCAhKG9iaiBpbnN0YW5jZW9mIEVtYmVyLk9iamVj
dCkgfHwgKEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSk7CisK
KyAgLy8gSU1QT1JUQU5UOiB0aGlzIHNwZWNpZmljIHRlc3Qgd2lsbCBkZXRlY3QgYSBuYXRpdmUg
YXJyYXkgb25seS4gQW55IG90aGVyCisgIC8vIG9iamVjdCB3aWxsIG5lZWQgdG8gaW1wbGVtZW50
IENvcHlhYmxlLgorICBpZiAoRW1iZXIudHlwZU9mKG9iaikgPT09ICdhcnJheScpIHsKKyAgICBy
ZXQgPSBvYmouc2xpY2UoKTsKKyAgICBpZiAoZGVlcCkgeworICAgICAgbG9jID0gcmV0Lmxlbmd0
aDsKKyAgICAgIHdoaWxlKC0tbG9jPj0wKSByZXRbbG9jXSA9IF9jb3B5KHJldFtsb2NdLCBkZWVw
LCBzZWVuLCBjb3BpZXMpOwogICAgIH0KKyAgfSBlbHNlIGlmIChFbWJlci5Db3B5YWJsZSAmJiBF
bWJlci5Db3B5YWJsZS5kZXRlY3Qob2JqKSkgeworICAgIHJldCA9IG9iai5jb3B5KGRlZXAsIHNl
ZW4sIGNvcGllcyk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0ge307CisgICAgZm9yKGtleSBpbiBv
YmopIHsKKyAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlOwogCi0g
ICAgcmV0dXJuIHRoaXMucHJvdG90eXBlOwotICB9OworICAgICAgLy8gUHJldmVudHMgYnJvd3Nl
cnMgdGhhdCBkb24ndCByZXNwZWN0IG5vbi1lbnVtZXJhYmlsaXR5IGZyb20KKyAgICAgIC8vIGNv
cHlpbmcgaW50ZXJuYWwgRW1iZXIgcHJvcGVydGllcworICAgICAgaWYgKGtleS5zdWJzdHJpbmco
MCwyKSA9PT0gJ19fJykgY29udGludWU7CiAKLSAgcmV0dXJuIENsYXNzOworICAgICAgcmV0W2tl
eV0gPSBkZWVwID8gX2NvcHkob2JqW2tleV0sIGRlZXAsIHNlZW4sIGNvcGllcykgOiBvYmpba2V5
XTsKKyAgICB9CisgIH0KKworICBpZiAoZGVlcCkgeworICAgIHNlZW4ucHVzaChvYmopOworICAg
IGNvcGllcy5wdXNoKHJldCk7CisgIH0KIAorICByZXR1cm4gcmV0OwogfQogCi12YXIgQ29yZU9i
amVjdCA9IG1ha2VDdG9yKCk7Ci1Db3JlT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJl
dHVybiAiRW1iZXIuQ29yZU9iamVjdCI7IH07CisvKioKKyAgQ3JlYXRlcyBhIGNsb25lIG9mIHRo
ZSBwYXNzZWQgb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGNhbiB0YWtlIGp1c3QgYWJvdXQKKyAgYW55
IHR5cGUgb2Ygb2JqZWN0IGFuZCBjcmVhdGUgYSBjbG9uZSBvZiBpdCwgaW5jbHVkaW5nIHByaW1p
dGl2ZSB2YWx1ZXMKKyAgKHdoaWNoIGFyZSBub3QgYWN0dWFsbHkgY2xvbmVkIGJlY2F1c2UgdGhl
eSBhcmUgaW1tdXRhYmxlKS4KIAotQ29yZU9iamVjdC5Qcm90b3R5cGVNaXhpbiA9IE1peGluLmNy
ZWF0ZSh7Ci0gIHJlb3BlbjogZnVuY3Rpb24oKSB7Ci0gICAgYXBwbHlNaXhpbih0aGlzLCBhcmd1
bWVudHMsIHRydWUpOwotICAgIHJldHVybiB0aGlzOwotICB9LAorICBJZiB0aGUgcGFzc2VkIG9i
amVjdCBpbXBsZW1lbnRzIHRoZSBgY2xvbmUoKWAgbWV0aG9kLCB0aGVuIHRoaXMgZnVuY3Rpb24K
KyAgd2lsbCBzaW1wbHkgY2FsbCB0aGF0IG1ldGhvZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCiAK
LSAgaXNJbnN0YW5jZTogdHJ1ZSwKKyAgQG1ldGhvZCBjb3B5CisgIEBmb3IgRW1iZXIKKyAgQHBh
cmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lCisgIEBwYXJhbSB7Qm9vbGVhbn0g
ZGVlcCBJZiB0cnVlLCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IGlzIG1hZGUKKyAgQHJldHVy
biB7T2JqZWN0fSBUaGUgY2xvbmVkIG9iamVjdAorKi8KK0VtYmVyLmNvcHkgPSBmdW5jdGlvbihv
YmosIGRlZXApIHsKKyAgLy8gZmFzdCBwYXRocworICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBv
YmogfHwgb2JqPT09bnVsbCkgcmV0dXJuIG9iajsgLy8gY2FuJ3QgY29weSBwcmltaXRpdmVzCisg
IGlmIChFbWJlci5Db3B5YWJsZSAmJiBFbWJlci5Db3B5YWJsZS5kZXRlY3Qob2JqKSkgcmV0dXJu
IG9iai5jb3B5KGRlZXApOworICByZXR1cm4gX2NvcHkob2JqLCBkZWVwLCBkZWVwID8gW10gOiBu
dWxsLCBkZWVwID8gW10gOiBudWxsKTsKK307CiAKLSAgaW5pdDogZnVuY3Rpb24oKSB7fSwKKy8q
KgorICBDb252ZW5pZW5jZSBtZXRob2QgdG8gaW5zcGVjdCBhbiBvYmplY3QuIFRoaXMgbWV0aG9k
IHdpbGwgYXR0ZW1wdCB0bworICBjb252ZXJ0IHRoZSBvYmplY3QgaW50byBhIHVzZWZ1bCBzdHJp
bmcgZGVzY3JpcHRpb24uCiAKLSAgLyoqCi0gICAgRGVmaW5lcyB0aGUgcHJvcGVydGllcyB0aGF0
IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MKLSAgICAoaW5zdGVhZCBv
ZiBvdmVycmlkZGVuKS4KKyAgSXQgaXMgYSBwcmV0dHkgc2ltcGxlIGltcGxlbWVudGF0aW9uLiBJ
ZiB5b3Ugd2FudCBzb21ldGhpbmcgbW9yZSByb2J1c3QsCisgIHVzZSBzb21ldGhpbmcgbGlrZSBK
U0R1bXA6IGh0dHBzOi8vZ2l0aHViLmNvbS9OVi9qc0R1bXAKIAotICAgIEJ5IGRlZmF1bHQsIHdo
ZW4geW91IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3BlcnR5IGRlZmluZWQgaW4KLSAgICB0
aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQg
aXMgZGVmaW5lZAotICAgIGluIHRoZSBzdXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29t
ZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVmZXJhYmxlCi0gICAgdG8gYnVpbGQgdXAgYSBwcm9wZXJ0
eSdzIHZhbHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFzcycgcHJvcGVydHkKLSAgICB2YWx1
ZSB3aXRoIHRoZSBzdWJjbGFzcycgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ugd2l0
aGluIEVtYmVyCi0gICAgaXMgdGhlIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIuVmll
d2AuCisgIEBtZXRob2QgaW5zcGVjdAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBv
YmogVGhlIG9iamVjdCB5b3Ugd2FudCB0byBpbnNwZWN0LgorICBAcmV0dXJuIHtTdHJpbmd9IEEg
ZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAorKi8KK0VtYmVyLmluc3BlY3QgPSBmdW5jdGlvbihv
YmopIHsKKyAgdmFyIHR5cGUgPSBFbWJlci50eXBlT2Yob2JqKTsKKyAgaWYgKHR5cGUgPT09ICdh
cnJheScpIHsKKyAgICByZXR1cm4gJ1snICsgb2JqICsgJ10nOworICB9CisgIGlmICh0eXBlICE9
PSAnb2JqZWN0JykgeworICAgIHJldHVybiBvYmogKyAnJzsKKyAgfQogCi0gICAgSGVyZSBpcyBz
b21lIHNhbXBsZSBjb2RlIHNob3dpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvbmNhdGVu
YXRlZAotICAgIHByb3BlcnR5IGFuZCBhIG5vcm1hbCBvbmU6CisgIHZhciB2LCByZXQgPSBbXTsK
KyAgZm9yKHZhciBrZXkgaW4gb2JqKSB7CisgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkp
KSB7CisgICAgICB2ID0gb2JqW2tleV07CisgICAgICBpZiAodiA9PT0gJ3RvU3RyaW5nJykgeyBj
b250aW51ZTsgfSAvLyBpZ25vcmUgdXNlbGVzcyBpdGVtcworICAgICAgaWYgKEVtYmVyLnR5cGVP
Zih2KSA9PT0gJ2Z1bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkgeyAuLi4gfSI7IH0KKyAgICAg
IHJldC5wdXNoKGtleSArICI6ICIgKyB2KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICJ7IiArIHJl
dC5qb2luKCIsICIpICsgIn0iOworfTsKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmFy
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9w
ZXJ0eTogWydiYXInXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnYmFyJ10KLSAgICB9KTsKKy8qKgor
ICBDb21wYXJlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIHRydWUgaWYgdGhleSBhcmUgbG9naWNh
bGx5IGVxdWFsLiBUaGlzIGlzCisgIGEgZGVlcGVyIGNvbXBhcmlzb24gdGhhbiBhIHNpbXBsZSB0
cmlwbGUgZXF1YWwuIEZvciBzZXRzIGl0IHdpbGwgY29tcGFyZSB0aGUKKyAgaW50ZXJuYWwgb2Jq
ZWN0cy4gRm9yIGFueSBvdGhlciBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGBpc0VxdWFsKClgIGl0
IHdpbGwKKyAgcmVzcGVjdCB0aGF0IG1ldGhvZC4KIAotICAgIEFwcC5Gb29CYXJWaWV3ID0gQXBw
LkJhclZpZXcuZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydm
b28nXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCi0gICAgfSk7CisgIGBgYGphdmFzY3Jp
cHQKKyAgRW1iZXIuaXNFcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRydWUKKyAgRW1iZXIu
aXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgIC8vIGZhbHNlCisgIEVtYmVyLmlzRXF1YWwoWzQs
Ml0sIFs0LDJdKTsgICAgICAvLyBmYWxzZQorICBgYGAKIAotICAgIHZhciBmb29CYXJWaWV3ID0g
QXBwLkZvb0JhclZpZXcuY3JlYXRlKCk7Ci0gICAgZm9vQmFyVmlldy5nZXQoJ3NvbWVOb25Db25j
YXRlbmF0ZWRQcm9wZXJ0eScpOyAvLyBbJ2ZvbyddCi0gICAgZm9vQmFyVmlldy5nZXQoJ2NsYXNz
TmFtZXMnKTsgLy8gWydlbWJlci12aWV3JywgJ2JhcicsICdmb28nXQotICAgIGBgYAorICBAbWV0
aG9kIGlzRXF1YWwKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge09iamVjdH0gYSBmaXJzdCBvYmpl
Y3QgdG8gY29tcGFyZQorICBAcGFyYW0ge09iamVjdH0gYiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBh
cmUKKyAgQHJldHVybiB7Qm9vbGVhbn0KKyovCitFbWJlci5pc0VxdWFsID0gZnVuY3Rpb24oYSwg
YikgeworICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9mIGEuaXNFcXVhbCkgcmV0dXJuIGEu
aXNFcXVhbChiKTsKKyAgcmV0dXJuIGEgPT09IGI7Cit9OwogCi0gICAgVGhpcyBiZWhhdmlvciBl
eHRlbmRzIHRvIG9iamVjdCBjcmVhdGlvbiBhcyB3ZWxsLiBDb250aW51aW5nIHRoZQotICAgIGFi
b3ZlIGV4YW1wbGU6CisvLyBVc2VkIGJ5IEVtYmVyLmNvbXBhcmUKK0VtYmVyLk9SREVSX0RFRklO
SVRJT04gPSBFbWJlci5FTlYuT1JERVJfREVGSU5JVElPTiB8fCBbCisgICd1bmRlZmluZWQnLAor
ICAnbnVsbCcsCisgICdib29sZWFuJywKKyAgJ251bWJlcicsCisgICdzdHJpbmcnLAorICAnYXJy
YXknLAorICAnb2JqZWN0JywKKyAgJ2luc3RhbmNlJywKKyAgJ2Z1bmN0aW9uJywKKyAgJ2NsYXNz
JywKKyAgJ2RhdGUnCitdOwogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciB2aWV3ID0gQXBw
LkZvb0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTog
WydiYXonXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnYmF6J10KLSAgICB9KQotICAgIHZpZXcuZ2V0
KCdzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydiYXonXQotICAgIHZpZXcuZ2V0
KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJywgJ2JheiddCi0g
ICAgYGBgCi0gICAgQWRkaW5nIGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgaXMgbm90IGFuIGFycmF5
IHdpbGwganVzdCBhZGQgaXQgaW4gdGhlIGFycmF5OgotICAgIAotICAgIGBgYGphdmFzY3JpcHQK
LSAgICB2YXIgdmlldyA9IEFwcC5Gb29CYXJWaWV3LmNyZWF0ZSh7Ci0gICAgICBjbGFzc05hbWVz
OiAnYmF6JwotICAgIH0pCi0gICAgdmlldy5nZXQoJ2NsYXNzTmFtZXMnKTsgLy8gWydlbWJlci12
aWV3JywgJ2JhcicsICdmb28nLCAnYmF6J10KLSAgICBgYGAKLSAgICAKLSAgICBVc2luZyB0aGUg
YGNvbmNhdGVuYXRlZFByb3BlcnRpZXNgIHByb3BlcnR5LCB3ZSBjYW4gdGVsbCB0byBFbWJlciB0
aGF0IG1peAotICAgIHRoZSBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzLgorLyoqCisgIFJldHVy
bnMgYWxsIG9mIHRoZSBrZXlzIGRlZmluZWQgb24gYW4gb2JqZWN0IG9yIGhhc2guIFRoaXMgaXMg
dXNlZnVsCisgIHdoZW4gaW5zcGVjdGluZyBvYmplY3RzIGZvciBkZWJ1Z2dpbmcuIE9uIGJyb3dz
ZXJzIHRoYXQgc3VwcG9ydCBpdCwgdGhpcworICB1c2VzIHRoZSBuYXRpdmUgYE9iamVjdC5rZXlz
YCBpbXBsZW1lbnRhdGlvbi4KIAotICAgIEluIGBFbWJlci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJp
bmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0aWVzCi0gICAgYXJlIGFsc28g
Y29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlvbiB0byBgY2xhc3NOYW1lc2AuCisgIEBtZXRob2Qga2V5
cworICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7T2JqZWN0fSBvYmoKKyAgQHJldHVybiB7QXJyYXl9
IEFycmF5IGNvbnRhaW5pbmcga2V5cyBvZiBvYmoKKyovCitFbWJlci5rZXlzID0gT2JqZWN0Lmtl
eXM7CiAKLSAgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3UgdG8gdXNlIHRocm91
Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKLSAgICBhbHRob3VnaCB0eXBpY2FsIGFwcCBk
ZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGluZnJlcXVlbnRseS4KK2lmICghRW1iZXIu
a2V5cyB8fCBFbWJlci5jcmVhdGUuaXNTaW11bGF0ZWQpIHsKKyAgdmFyIHByb3RvdHlwZVByb3Bl
cnRpZXMgPSBbCisgICAgJ2NvbnN0cnVjdG9yJywKKyAgICAnaGFzT3duUHJvcGVydHknLAorICAg
ICdpc1Byb3RvdHlwZU9mJywKKyAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLAorICAgICd2YWx1
ZU9mJywKKyAgICAndG9Mb2NhbGVTdHJpbmcnLAorICAgICd0b1N0cmluZycKKyAgXSwKKyAgcHVz
aFByb3BlcnR5TmFtZSA9IGZ1bmN0aW9uKG9iaiwgYXJyYXksIGtleSkgeworICAgIC8vIFByZXZl
bnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCisg
ICAgLy8gY29weWluZyBpbnRlcm5hbCBFbWJlciBwcm9wZXJ0aWVzCisgICAgaWYgKGtleS5zdWJz
dHJpbmcoMCwyKSA9PT0gJ19fJykgcmV0dXJuOworICAgIGlmIChrZXkgPT09ICdfc3VwZXInKSBy
ZXR1cm47CisgICAgaWYgKGluZGV4T2YoYXJyYXksIGtleSkgPj0gMCkgcmV0dXJuOworICAgIGlm
ICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybjsKKworICAgIGFycmF5LnB1c2goa2V5
KTsKKyAgfTsKIAotICAgIEBwcm9wZXJ0eSBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzCi0gICAgQHR5
cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGNvbmNhdGVuYXRlZFByb3BlcnRp
ZXM6IG51bGwsCisgIEVtYmVyLmtleXMgPSBmdW5jdGlvbihvYmopIHsKKyAgICB2YXIgcmV0ID0g
W10sIGtleTsKKyAgICBmb3IgKGtleSBpbiBvYmopIHsKKyAgICAgIHB1c2hQcm9wZXJ0eU5hbWUo
b2JqLCByZXQsIGtleSk7CisgICAgfQogCi0gIC8qKgotICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3ll
ZAotICAgIEBkZWZhdWx0IGZhbHNlCi0gICovCi0gIGlzRGVzdHJveWVkOiBmYWxzZSwKKyAgICAv
LyBJRTggZG9lc24ndCBlbnVtZXJhdGUgcHJvcGVydHkgdGhhdCBuYW1lZCB0aGUgc2FtZSBhcyBw
cm90b3R5cGUgcHJvcGVydGllcy4KKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHByb3RvdHlwZVBy
b3BlcnRpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBrZXkgPSBwcm90b3R5cGVQcm9w
ZXJ0aWVzW2ldOwogCi0gIC8qKgotICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3lpbmcKLSAgICBAZGVm
YXVsdCBmYWxzZQotICAqLwotICBpc0Rlc3Ryb3lpbmc6IGZhbHNlLAorICAgICAgcHVzaFByb3Bl
cnR5TmFtZShvYmosIHJldCwga2V5KTsKKyAgICB9CiAKLSAgLyoqCi0gICAgRGVzdHJveXMgYW4g
b2JqZWN0IGJ5IHNldHRpbmcgdGhlIGBpc0Rlc3Ryb3llZGAgZmxhZyBhbmQgcmVtb3ZpbmcgaXRz
Ci0gICAgbWV0YWRhdGEsIHdoaWNoIGVmZmVjdGl2ZWx5IGRlc3Ryb3lzIG9ic2VydmVycyBhbmQg
YmluZGluZ3MuCisgICAgcmV0dXJuIHJldDsKKyAgfTsKK30KIAotICAgIElmIHlvdSB0cnkgdG8g
c2V0IGEgcHJvcGVydHkgb24gYSBkZXN0cm95ZWQgb2JqZWN0LCBhbiBleGNlcHRpb24gd2lsbCBi
ZQotICAgIHJhaXNlZC4KK30pKCk7CiAKLSAgICBOb3RlIHRoYXQgZGVzdHJ1Y3Rpb24gaXMgc2No
ZWR1bGVkIGZvciB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcCBhbmQgZG9lcyBub3QKLSAgICBoYXBw
ZW4gaW1tZWRpYXRlbHkuCiAKLSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICBAcmV0dXJuIHtFbWJl
ci5PYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIGlm
ICh0aGlzLl9kaWRDYWxsRGVzdHJveSkgeyByZXR1cm47IH0KIAotICAgIHRoaXMuaXNEZXN0cm95
aW5nID0gdHJ1ZTsKLSAgICB0aGlzLl9kaWRDYWxsRGVzdHJveSA9IHRydWU7Ci0KLSAgICBpZiAo
dGhpcy53aWxsRGVzdHJveSkgeyB0aGlzLndpbGxEZXN0cm95KCk7IH0KLQotICAgIHNjaGVkdWxl
KCdkZXN0cm95JywgdGhpcywgdGhpcy5fc2NoZWR1bGVkRGVzdHJveSk7Ci0gICAgcmV0dXJuIHRo
aXM7Ci0gIH0sCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQorKi8KIAotICAvKioKLSAgICBAcHJpdmF0ZQordmFyIFNUUklOR19EQVNI
RVJJWkVfUkVHRVhQID0gKC9bIF9dL2cpOwordmFyIFNUUklOR19EQVNIRVJJWkVfQ0FDSEUgPSB7
fTsKK3ZhciBTVFJJTkdfREVDQU1FTElaRV9SRUdFWFAgPSAoLyhbYS16XGRdKShbQS1aXSkvZyk7
Cit2YXIgU1RSSU5HX0NBTUVMSVpFX1JFR0VYUCA9ICgvKFwtfF98XC58XHMpKyguKT8vZyk7Cit2
YXIgU1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzEgPSAoLyhbYS16XGRdKShbQS1aXSspL2cpOwor
dmFyIFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yID0gKC9cLXxccysvZyk7CiAKLSAgICBJbnZv
a2VkIGJ5IHRoZSBydW4gbG9vcCB0byBhY3R1YWxseSBkZXN0cm95IHRoZSBvYmplY3QuIFRoaXMg
aXMKLSAgICBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbiBieSB0aGUgYGRlc3Ryb3lgIG1ldGhvZC4K
Ky8qKgorICBEZWZpbmVzIHRoZSBoYXNoIG9mIGxvY2FsaXplZCBzdHJpbmdzIGZvciB0aGUgY3Vy
cmVudCBsYW5ndWFnZS4gVXNlZCBieQorICB0aGUgYEVtYmVyLlN0cmluZy5sb2MoKWAgaGVscGVy
LiBUbyBsb2NhbGl6ZSwgYWRkIHN0cmluZyB2YWx1ZXMgdG8gdGhpcworICBoYXNoLgogCi0gICAg
QG1ldGhvZCBfc2NoZWR1bGVkRGVzdHJveQotICAqLwotICBfc2NoZWR1bGVkRGVzdHJveTogZnVu
Y3Rpb24oKSB7Ci0gICAgZGVzdHJveSh0aGlzKTsKLSAgICBzZXQodGhpcywgJ2lzRGVzdHJveWVk
JywgdHJ1ZSk7CisgIEBwcm9wZXJ0eSBTVFJJTkdTCisgIEBmb3IgRW1iZXIKKyAgQHR5cGUgSGFz
aAorKi8KK0VtYmVyLlNUUklOR1MgPSB7fTsKIAotICAgIGlmICh0aGlzLmRpZERlc3Ryb3kpIHsg
dGhpcy5kaWREZXN0cm95KCk7IH0KLSAgfSwKKy8qKgorICBEZWZpbmVzIHN0cmluZyBoZWxwZXIg
bWV0aG9kcyBpbmNsdWRpbmcgc3RyaW5nIGZvcm1hdHRpbmcgYW5kIGxvY2FsaXphdGlvbi4KKyAg
VW5sZXNzIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmdgIGlzIGBmYWxzZWAgdGhlc2Ug
bWV0aG9kcyB3aWxsIGFsc28gYmUKKyAgYWRkZWQgdG8gdGhlIGBTdHJpbmcucHJvdG90eXBlYCBh
cyB3ZWxsLgogCi0gIGJpbmQ6IGZ1bmN0aW9uKHRvLCBmcm9tKSB7Ci0gICAgaWYgKCEoZnJvbSBp
bnN0YW5jZW9mIEVtYmVyLkJpbmRpbmcpKSB7IGZyb20gPSBFbWJlci5CaW5kaW5nLmZyb20oZnJv
bSk7IH0KLSAgICBmcm9tLnRvKHRvKS5jb25uZWN0KHRoaXMpOwotICAgIHJldHVybiBmcm9tOwot
ICB9LAorICBAY2xhc3MgU3RyaW5nCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQHN0YXRpYworKi8K
K0VtYmVyLlN0cmluZyA9IHsKIAogICAvKioKLSAgICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2Vu
dGF0aW9uIHdoaWNoIGF0dGVtcHRzIHRvIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbgotICAgIHRo
YW4gSmF2YXNjcmlwdCdzIGB0b1N0cmluZ2AgdHlwaWNhbGx5IGRvZXMsIGluIGEgZ2VuZXJpYyB3
YXkgZm9yIGFsbCBFbWJlcgotICAgIG9iamVjdHMuCi0KLSAgICAgICAgQXBwLlBlcnNvbiA9IEVt
Lk9iamVjdC5leHRlbmQoKQotICAgICAgICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCi0g
ICAgICAgIHBlcnNvbi50b1N0cmluZygpIC8vPT4gIjxBcHAuUGVyc29uOmVtYmVyMTAyND4iCi0K
LSAgICBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgaXMgbm90IGRlZmluZWQgb24gYW4gRW1iZXIgbmFt
ZXNwYWNlLCBpdCB3aWxsCi0gICAgaW5kaWNhdGUgaXQgaXMgYSBzdWJjbGFzcyBvZiB0aGUgcmVn
aXN0ZXJlZCBzdXBlcmNsYXNzOgotCi0gICAgICAgIFN0dWRlbnQgPSBBcHAuUGVyc29uLmV4dGVu
ZCgpCi0gICAgICAgIHN0dWRlbnQgPSBTdHVkZW50LmNyZWF0ZSgpCi0gICAgICAgIHN0dWRlbnQu
dG9TdHJpbmcoKSAvLz0+ICI8KHN1YmNsYXNzIG9mIEFwcC5QZXJzb24pOmVtYmVyMTAyNT4iCisg
ICAgQXBwbHkgZm9ybWF0dGluZyBvcHRpb25zIHRvIHRoZSBzdHJpbmcuIFRoaXMgd2lsbCBsb29r
IGZvciBvY2N1cnJlbmNlcworICAgIG9mICIlQCIgaW4geW91ciBzdHJpbmcgYW5kIHN1YnN0aXR1
dGUgdGhlbSB3aXRoIHRoZSBhcmd1bWVudHMgeW91IHBhc3MgaW50bworICAgIHRoaXMgbWV0aG9k
LiBJZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBzcGVjaWZpYyBvcmRlciBvZiByZXBsYWNlbWVu
dCwKKyAgICB5b3UgY2FuIGFkZCBhIG51bWJlciBhZnRlciB0aGUga2V5IGFzIHdlbGwgdG8gaW5k
aWNhdGUgd2hpY2ggYXJndW1lbnQKKyAgICB5b3Ugd2FudCB0byBpbnNlcnQuCiAKLSAgICBJZiB0
aGUgbWV0aG9kIGB0b1N0cmluZ0V4dGVuc2lvbmAgaXMgZGVmaW5lZCwgaXRzIHJldHVybiB2YWx1
ZSB3aWxsIGJlCi0gICAgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKyAgICBPcmRlcmVkIGluc2Vy
dGlvbnMgYXJlIG1vc3QgdXNlZnVsIHdoZW4gYnVpbGRpbmcgbG9jIHN0cmluZ3Mgd2hlcmUgdmFs
dWVzCisgICAgeW91IG5lZWQgdG8gaW5zZXJ0IG1heSBhcHBlYXIgaW4gZGlmZmVyZW50IG9yZGVy
cy4KIAotICAgICAgICBBcHAuVGVhY2hlciA9IEFwcC5QZXJzb24uZXh0ZW5kKHsKLSAgICAgICAg
ICB0b1N0cmluZ0V4dGVuc2lvbjogZnVuY3Rpb24oKXsKLSAgICAgICAgICAgIHJldHVybiB0aGlz
LmdldCgnZnVsbE5hbWUnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0ZWFj
aGVyID0gQXBwLlRlYWNoZXIuY3JlYXRlKCkKLSAgICAgICAgdGVhY2hlci50b1N0cmluZygpOyAv
LyAjPT4gIjxBcHAuVGVhY2hlcjplbWJlcjEwMjY6VG9tIERhbGU+IgorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAiSGVsbG8gJUAgJUAiLmZtdCgnSm9obicsICdEb2UnKTsgICAgIC8vICJIZWxsbyBK
b2huIERvZSIKKyAgICAiSGVsbG8gJUAyLCAlQDEiLmZtdCgnSm9obicsICdEb2UnKTsgIC8vICJI
ZWxsbyBEb2UsIEpvaG4iCisgICAgYGBgCiAKLSAgICBAbWV0aG9kIHRvU3RyaW5nCi0gICAgQHJl
dHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICBAbWV0aG9kIGZtdAorICAg
IEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKKyAgICBAcGFyYW0ge0Fy
cmF5fSBmb3JtYXRzIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gaW50ZXJwb2xhdGUgaW50byBz
dHJpbmcuCisgICAgQHJldHVybiB7U3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nCiAgICovCi0gIHRv
U3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHsKLSAgICB2YXIgaGFzVG9TdHJpbmdFeHRlbnNp
b24gPSB0eXBlb2YgdGhpcy50b1N0cmluZ0V4dGVuc2lvbiA9PT0gJ2Z1bmN0aW9uJywKLSAgICAg
ICAgZXh0ZW5zaW9uID0gaGFzVG9TdHJpbmdFeHRlbnNpb24gPyAiOiIgKyB0aGlzLnRvU3RyaW5n
RXh0ZW5zaW9uKCkgOiAnJzsKLSAgICB2YXIgcmV0ID0gJzwnK3RoaXMuY29uc3RydWN0b3IudG9T
dHJpbmcoKSsnOicrZ3VpZEZvcih0aGlzKStleHRlbnNpb24rJz4nOwotICAgIHRoaXMudG9TdHJp
bmcgPSBtYWtlVG9TdHJpbmcocmV0KTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci19KTsKLQotQ29y
ZU9iamVjdC5Qcm90b3R5cGVNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsKLQot
ZnVuY3Rpb24gbWFrZVRvU3RyaW5nKHJldCkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVy
biByZXQ7IH07Ci19Ci0KLWlmIChFbWJlci5jb25maWcub3ZlcnJpZGVQcm90b3R5cGVNaXhpbikg
ewotICBFbWJlci5jb25maWcub3ZlcnJpZGVQcm90b3R5cGVNaXhpbihDb3JlT2JqZWN0LlByb3Rv
dHlwZU1peGluKTsKLX0KLQotQ29yZU9iamVjdC5fX3N1cGVyX18gPSBudWxsOworICBmbXQ6IGZ1
bmN0aW9uKHN0ciwgZm9ybWF0cykgeworICAgIC8vIGZpcnN0LCByZXBsYWNlIGFueSBPUkRFUkVE
IHJlcGxhY2VtZW50cy4KKyAgICB2YXIgaWR4ICA9IDA7IC8vIHRoZSBjdXJyZW50IGluZGV4IGZv
ciBub24tbnVtZXJpY2FsIHJlcGxhY2VtZW50cworICAgIHJldHVybiBzdHIucmVwbGFjZSgvJUAo
WzAtOV0rKT8vZywgZnVuY3Rpb24ocywgYXJnSW5kZXgpIHsKKyAgICAgIGFyZ0luZGV4ID0gKGFy
Z0luZGV4KSA/IHBhcnNlSW50KGFyZ0luZGV4LCAxMCkgLSAxIDogaWR4Kys7CisgICAgICBzID0g
Zm9ybWF0c1thcmdJbmRleF07CisgICAgICByZXR1cm4gKHMgPT09IG51bGwpID8gJyhudWxsKScg
OiAocyA9PT0gdW5kZWZpbmVkKSA/ICcnIDogRW1iZXIuaW5zcGVjdChzKTsKKyAgICB9KSA7Cisg
IH0sCiAKLXZhciBDbGFzc01peGluID0gTWl4aW4uY3JlYXRlKHsKKyAgLyoqCisgICAgRm9ybWF0
cyB0aGUgcGFzc2VkIHN0cmluZywgYnV0IGZpcnN0IGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhl
IGxvY2FsaXplZAorICAgIHN0cmluZ3MgaGFzaC4gVGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IHRv
IGxvY2FsaXplIHRleHQuIFNlZQorICAgIGBFbWJlci5TdHJpbmcuZm10KClgIGZvciBtb3JlIGlu
Zm9ybWF0aW9uIG9uIGZvcm1hdHRpbmcuCiAKLSAgQ2xhc3NNaXhpbjogRW1iZXIucmVxdWlyZWQo
KSwKKyAgICBOb3RlIHRoYXQgaXQgaXMgdHJhZGl0aW9uYWwgYnV0IG5vdCByZXF1aXJlZCB0byBw
cmVmaXggbG9jYWxpemVkIHN0cmluZworICAgIGtleXMgd2l0aCBhbiB1bmRlcnNjb3JlIG9yIG90
aGVyIGNoYXJhY3RlciBzbyB5b3UgY2FuIGVhc2lseSBpZGVudGlmeQorICAgIGxvY2FsaXplZCBz
dHJpbmdzLgogCi0gIFByb3RvdHlwZU1peGluOiBFbWJlci5yZXF1aXJlZCgpLAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBFbWJlci5TVFJJTkdTID0geworICAgICAgJ19IZWxsbyBXb3JsZCc6ICdC
b25qb3VyIGxlIG1vbmRlJywKKyAgICAgICdfSGVsbG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcK
KyAgICB9OwogCi0gIGlzQ2xhc3M6IHRydWUsCisgICAgRW1iZXIuU3RyaW5nLmxvYygiX0hlbGxv
IFdvcmxkIik7ICAvLyAnQm9uam91ciBsZSBtb25kZSc7CisgICAgRW1iZXIuU3RyaW5nLmxvYygi
X0hlbGxvICVAICVAIiwgWyJKb2huIiwgIlNtaXRoIl0pOyAgLy8gIkJvbmpvdXIgSm9obiBTbWl0
aCI7CisgICAgYGBgCiAKLSAgaXNNZXRob2Q6IGZhbHNlLAorICAgIEBtZXRob2QgbG9jCisgICAg
QHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAorICAgIEBwYXJhbSB7QXJy
YXl9IGZvcm1hdHMgT3B0aW9uYWwgYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBvbGF0ZSBp
bnRvIHN0cmluZy4KKyAgICBAcmV0dXJuIHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcKKyAgKi8K
KyAgbG9jOiBmdW5jdGlvbihzdHIsIGZvcm1hdHMpIHsKKyAgICBzdHIgPSBFbWJlci5TVFJJTkdT
W3N0cl0gfHwgc3RyOworICAgIHJldHVybiBFbWJlci5TdHJpbmcuZm10KHN0ciwgZm9ybWF0cykg
OworICB9LAogCi0gIGV4dGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIENsYXNzID0gbWFrZUN0
b3IoKSwgcHJvdG87Ci0gICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IE1peGluLmNyZWF0ZSh0aGlzLkNs
YXNzTWl4aW4pOwotICAgIENsYXNzLlByb3RvdHlwZU1peGluID0gTWl4aW4uY3JlYXRlKHRoaXMu
UHJvdG90eXBlTWl4aW4pOworICAvKioKKyAgICBTcGxpdHMgYSBzdHJpbmcgaW50byBzZXBhcmF0
ZSB1bml0cyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKKyAgICBlbXB0eSBz
dHJpbmdzIGluIHRoZSBwcm9jZXNzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBz
cGxpdCB0aGF0CisgICAgaXMgbW9zdGx5IHVzZWZ1bCB3aGVuIGFwcGxpZWQgdG8gdGhlIGBTdHJp
bmcucHJvdG90eXBlYC4KIAotICAgIENsYXNzLkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9
IENsYXNzOwotICAgIENsYXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBDbGFz
czsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuU3RyaW5nLncoImFscGhhIGJldGEgZ2Ft
bWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeworICAgICAgY29uc29sZS5sb2coa2V5KTsKKyAg
ICB9KTsKIAotICAgIHJlb3Blbi5hcHBseShDbGFzcy5Qcm90b3R5cGVNaXhpbiwgYXJndW1lbnRz
KTsKKyAgICAvLyA+IGFscGhhCisgICAgLy8gPiBiZXRhCisgICAgLy8gPiBnYW1tYQorICAgIGBg
YAogCi0gICAgQ2xhc3Muc3VwZXJjbGFzcyA9IHRoaXM7Ci0gICAgQ2xhc3MuX19zdXBlcl9fICA9
IHRoaXMucHJvdG90eXBlOworICAgIEBtZXRob2QgdworICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIg
VGhlIHN0cmluZyB0byBzcGxpdAorICAgIEByZXR1cm4ge1N0cmluZ30gc3BsaXQgc3RyaW5nCisg
ICovCisgIHc6IGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnNwbGl0KC9ccysvKTsgfSwKIAot
ICAgIHByb3RvID0gQ2xhc3MucHJvdG90eXBlID0gb19jcmVhdGUodGhpcy5wcm90b3R5cGUpOwot
ICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQ2xhc3M7Ci0gICAgZ2VuZXJhdGVHdWlkKHByb3RvLCAn
ZW1iZXInKTsKLSAgICBtZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0aGlzIHdpbGwgZGlz
YWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCisgIC8qKgorICAgIENvbnZlcnRzIGEgY2FtZWxp
emVkIHN0cmluZyBpbnRvIGFsbCBsb3dlciBjYXNlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy4K
IAotICAgIENsYXNzLkNsYXNzTWl4aW4uYXBwbHkoQ2xhc3MpOwotICAgIHJldHVybiBDbGFzczsK
LSAgfSwKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRNTCcuZGVjYW1lbGl6ZSgpOyAg
ICAgICAgICAgLy8gJ2lubmVyX2h0bWwnCisgICAgJ2FjdGlvbl9uYW1lJy5kZWNhbWVsaXplKCk7
ICAgICAgICAvLyAnYWN0aW9uX25hbWUnCisgICAgJ2Nzcy1jbGFzcy1uYW1lJy5kZWNhbWVsaXpl
KCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCisgICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5kZWNh
bWVsaXplKCk7ICAvLyAnbXkgZmF2b3JpdGUgaXRlbXMnCisgICAgYGBgCiAKLSAgY3JlYXRlV2l0
aE1peGluczogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdE1peGlucyhhcmd1bWVudHMpOyB9Ci0gICAgcmV0dXJu
IG5ldyBDKCk7CisgICAgQG1ldGhvZCBkZWNhbWVsaXplCisgICAgQHBhcmFtIHtTdHJpbmd9IHN0
ciBUaGUgc3RyaW5nIHRvIGRlY2FtZWxpemUuCisgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgZGVj
YW1lbGl6ZWQgc3RyaW5nLgorICAqLworICBkZWNhbWVsaXplOiBmdW5jdGlvbihzdHIpIHsKKyAg
ICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0RFQ0FNRUxJWkVfUkVHRVhQLCAnJDFfJDInKS50
b0xvd2VyQ2FzZSgpOwogICB9LAogCi0gIGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMg
PSB0aGlzOwotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdFByb3BlcnRp
ZXMoYXJndW1lbnRzKTsgfQotICAgIHJldHVybiBuZXcgQygpOwotICB9LAorICAvKioKKyAgICBS
ZXBsYWNlcyB1bmRlcnNjb3Jlcywgc3BhY2VzLCBvciBjYW1lbENhc2Ugd2l0aCBkYXNoZXMuCiAK
LSAgcmVvcGVuOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLndpbGxSZW9wZW4oKTsKLSAgICByZW9w
ZW4uYXBwbHkodGhpcy5Qcm90b3R5cGVNaXhpbiwgYXJndW1lbnRzKTsKLSAgICByZXR1cm4gdGhp
czsKLSAgfSwKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRNTCcuZGFzaGVyaXplKCk7
ICAgICAgICAgIC8vICdpbm5lci1odG1sJworICAgICdhY3Rpb25fbmFtZScuZGFzaGVyaXplKCk7
ICAgICAgICAvLyAnYWN0aW9uLW5hbWUnCisgICAgJ2Nzcy1jbGFzcy1uYW1lJy5kYXNoZXJpemUo
KTsgICAgIC8vICdjc3MtY2xhc3MtbmFtZScKKyAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmRhc2hl
cml6ZSgpOyAgLy8gJ215LWZhdm9yaXRlLWl0ZW1zJworICAgIGBgYAogCi0gIHJlb3BlbkNsYXNz
OiBmdW5jdGlvbigpIHsKLSAgICByZW9wZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBhcmd1bWVu
dHMpOwotICAgIGFwcGx5TWl4aW4odGhpcywgYXJndW1lbnRzLCBmYWxzZSk7Ci0gICAgcmV0dXJu
IHRoaXM7Ci0gIH0sCisgICAgQG1ldGhvZCBkYXNoZXJpemUKKyAgICBAcGFyYW0ge1N0cmluZ30g
c3RyIFRoZSBzdHJpbmcgdG8gZGFzaGVyaXplLgorICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIGRh
c2hlcml6ZWQgc3RyaW5nLgorICAqLworICBkYXNoZXJpemU6IGZ1bmN0aW9uKHN0cikgeworICAg
IHZhciBjYWNoZSA9IFNUUklOR19EQVNIRVJJWkVfQ0FDSEUsCisgICAgICAgIGhpdCAgID0gY2Fj
aGUuaGFzT3duUHJvcGVydHkoc3RyKSwKKyAgICAgICAgcmV0OwogCi0gIGRldGVjdDogZnVuY3Rp
b24ob2JqKSB7Ci0gICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBvYmopIHsgcmV0dXJuIGZh
bHNlOyB9Ci0gICAgd2hpbGUob2JqKSB7Ci0gICAgICBpZiAob2JqPT09dGhpcykgeyByZXR1cm4g
dHJ1ZTsgfQotICAgICAgb2JqID0gb2JqLnN1cGVyY2xhc3M7CisgICAgaWYgKGhpdCkgeworICAg
ICAgcmV0dXJuIGNhY2hlW3N0cl07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEVtYmVyLlN0
cmluZy5kZWNhbWVsaXplKHN0cikucmVwbGFjZShTVFJJTkdfREFTSEVSSVpFX1JFR0VYUCwnLScp
OworICAgICAgY2FjaGVbc3RyXSA9IHJldDsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9
LAogCi0gIGRldGVjdEluc3RhbmNlOiBmdW5jdGlvbihvYmopIHsKLSAgICByZXR1cm4gb2JqIGlu
c3RhbmNlb2YgdGhpczsKKyAgICByZXR1cm4gcmV0OwogICB9LAogCiAgIC8qKgotICAgIEluIHNv
bWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBhbm5vdGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdp
dGggYWRkaXRpb25hbAotICAgIG1ldGFkYXRhIGFib3V0IGhvdyB0aGV5IGZ1bmN0aW9uIG9yIHdo
YXQgdmFsdWVzIHRoZXkgb3BlcmF0ZSBvbi4gRm9yCi0gICAgZXhhbXBsZSwgY29tcHV0ZWQgcHJv
cGVydHkgZnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuCi0g
ICAgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgaW50cm9zcGVjdGlvbi4KLQotICAgIFlvdSBjYW4g
cGFzcyBhIGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVydHkgbGlrZSB0
aGlzOgorICAgIFJldHVybnMgdGhlIGxvd2VyQ2FtZWxDYXNlIGZvcm0gb2YgYSBzdHJpbmcuCiAK
ICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBw
ZXJzb25JZCA9IHRoaXMuZ2V0KCdwZXJzb25JZCcpOwotICAgICAgcmV0dXJuIEFwcC5QZXJzb24u
Y3JlYXRlKHsgaWQ6IHBlcnNvbklkIH0pOwotICAgIH0ucHJvcGVydHkoKS5tZXRhKHsgdHlwZTog
QXBwLlBlcnNvbiB9KQorICAgICdpbm5lckhUTUwnLmNhbWVsaXplKCk7ICAgICAgICAgIC8vICdp
bm5lckhUTUwnCisgICAgJ2FjdGlvbl9uYW1lJy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlv
bk5hbWUnCisgICAgJ2Nzcy1jbGFzcy1uYW1lJy5jYW1lbGl6ZSgpOyAgICAgLy8gJ2Nzc0NsYXNz
TmFtZScKKyAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhbWVsaXplKCk7ICAvLyAnbXlGYXZvcml0
ZUl0ZW1zJworICAgICdNeSBGYXZvcml0ZSBJdGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZhdm9y
aXRlSXRlbXMnCiAgICAgYGBgCiAKLSAgICBPbmNlIHlvdSd2ZSBkb25lIHRoaXMsIHlvdSBjYW4g
cmV0cmlldmUgdGhlIHZhbHVlcyBzYXZlZCB0byB0aGUgY29tcHV0ZWQKLSAgICBwcm9wZXJ0eSBm
cm9tIHlvdXIgY2xhc3MgbGlrZSB0aGlzOgorICAgIEBtZXRob2QgY2FtZWxpemUKKyAgICBAcGFy
YW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FtZWxpemUuCisgICAgQHJldHVybiB7U3Ry
aW5nfSB0aGUgY2FtZWxpemVkIHN0cmluZy4KKyAgKi8KKyAgY2FtZWxpemU6IGZ1bmN0aW9uKHN0
cikgeworICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfQ0FNRUxJWkVfUkVHRVhQLCBmdW5j
dGlvbihtYXRjaCwgc2VwYXJhdG9yLCBjaHIpIHsKKyAgICAgIHJldHVybiBjaHIgPyBjaHIudG9V
cHBlckNhc2UoKSA6ICcnOworICAgIH0pLnJlcGxhY2UoL14oW0EtWl0pLywgZnVuY3Rpb24obWF0
Y2gsIHNlcGFyYXRvciwgY2hyKSB7CisgICAgICByZXR1cm4gbWF0Y2gudG9Mb3dlckNhc2UoKTsK
KyAgICB9KTsKKyAgfSwKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBVcHBlckNhbWVsQ2FzZSBm
b3JtIG9mIGEgc3RyaW5nLgogCiAgICAgYGBgamF2YXNjcmlwdAotICAgIE15Q2xhc3MubWV0YUZv
clByb3BlcnR5KCdwZXJzb24nKTsKKyAgICAnaW5uZXJIVE1MJy5jbGFzc2lmeSgpOyAgICAgICAg
ICAvLyAnSW5uZXJIVE1MJworICAgICdhY3Rpb25fbmFtZScuY2xhc3NpZnkoKTsgICAgICAgIC8v
ICdBY3Rpb25OYW1lJworICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3NpZnkoKTsgICAgIC8vICdD
c3NDbGFzc05hbWUnCisgICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jbGFzc2lmeSgpOyAgLy8gJ015
RmF2b3JpdGVJdGVtcycKICAgICBgYGAKIAotICAgIFRoaXMgd2lsbCByZXR1cm4gdGhlIG9yaWdp
bmFsIGhhc2ggdGhhdCB3YXMgcGFzc2VkIHRvIGBtZXRhKClgLgotCi0gICAgQG1ldGhvZCBtZXRh
Rm9yUHJvcGVydHkKLSAgICBAcGFyYW0ga2V5IHtTdHJpbmd9IHByb3BlcnR5IG5hbWUKKyAgICBA
bWV0aG9kIGNsYXNzaWZ5CisgICAgQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGNs
YXNzaWZ5CisgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgY2xhc3NpZmllZCBzdHJpbmcKICAgKi8K
LSAgbWV0YUZvclByb3BlcnR5OiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgZGVzYyA9IG1ldGEo
dGhpcy5wcm90bygpLCBmYWxzZSkuZGVzY3Nba2V5XTsKKyAgY2xhc3NpZnk6IGZ1bmN0aW9uKHN0
cikgeworICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgiLiIpLAorICAgICAgICBvdXQgPSBbXTsK
IAotICAgIEVtYmVyLmFzc2VydCgibWV0YUZvclByb3BlcnR5KCkgY291bGQgbm90IGZpbmQgYSBj
b21wdXRlZCBwcm9wZXJ0eSB3aXRoIGtleSAnIitrZXkrIicuIiwgISFkZXNjICYmIGRlc2MgaW5z
dGFuY2VvZiBFbWJlci5Db21wdXRlZFByb3BlcnR5KTsKLSAgICByZXR1cm4gZGVzYy5fbWV0YSB8
fCB7fTsKKyAgICBmb3IgKHZhciBpPTAsIGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAg
ICAgdmFyIGNhbWVsaXplZCA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZShwYXJ0c1tpXSk7CisgICAg
ICBvdXQucHVzaChjYW1lbGl6ZWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjYW1lbGl6ZWQu
c3Vic3RyKDEpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LmpvaW4oIi4iKTsKICAgfSwKIAog
ICAvKioKLSAgICBJdGVyYXRlIG92ZXIgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSBmb3IgdGhlIGNs
YXNzLCBwYXNzaW5nIGl0cyBuYW1lCi0gICAgYW5kIGFueSBhc3NvY2lhdGVkIG1ldGFkYXRhIChz
ZWUgYG1ldGFGb3JQcm9wZXJ0eWApIHRvIHRoZSBjYWxsYmFjay4KLQotICAgIEBtZXRob2QgZWFj
aENvbXB1dGVkUHJvcGVydHkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICAgIEBw
YXJhbSB7T2JqZWN0fSBiaW5kaW5nCi0gICovCi0gIGVhY2hDb21wdXRlZFByb3BlcnR5OiBmdW5j
dGlvbihjYWxsYmFjaywgYmluZGluZykgewotICAgIHZhciBwcm90byA9IHRoaXMucHJvdG8oKSwK
LSAgICAgICAgZGVzY3MgPSBtZXRhKHByb3RvKS5kZXNjcywKLSAgICAgICAgZW1wdHkgPSB7fSwK
LSAgICAgICAgcHJvcGVydHk7CisgICAgTW9yZSBnZW5lcmFsIHRoYW4gZGVjYW1lbGl6ZS4gUmV0
dXJucyB0aGUgbG93ZXJcX2Nhc2VcX2FuZFxfdW5kZXJzY29yZWQKKyAgICBmb3JtIG9mIGEgc3Ry
aW5nLgogCi0gICAgZm9yICh2YXIgbmFtZSBpbiBkZXNjcykgewotICAgICAgcHJvcGVydHkgPSBk
ZXNjc1tuYW1lXTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRNTCcudW5kZXJzY29y
ZSgpOyAgICAgICAgICAvLyAnaW5uZXJfaHRtbCcKKyAgICAnYWN0aW9uX25hbWUnLnVuZGVyc2Nv
cmUoKTsgICAgICAgIC8vICdhY3Rpb25fbmFtZScKKyAgICAnY3NzLWNsYXNzLW5hbWUnLnVuZGVy
c2NvcmUoKTsgICAgIC8vICdjc3NfY2xhc3NfbmFtZScKKyAgICAnbXkgZmF2b3JpdGUgaXRlbXMn
LnVuZGVyc2NvcmUoKTsgIC8vICdteV9mYXZvcml0ZV9pdGVtcycKKyAgICBgYGAKIAotICAgICAg
aWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkgewotICAgICAg
ICBjYWxsYmFjay5jYWxsKGJpbmRpbmcgfHwgdGhpcywgbmFtZSwgcHJvcGVydHkuX21ldGEgfHwg
ZW1wdHkpOwotICAgICAgfQotICAgIH0KLSAgfQorICAgIEBtZXRob2QgdW5kZXJzY29yZQorICAg
IEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byB1bmRlcnNjb3JlLgorICAgIEByZXR1
cm4ge1N0cmluZ30gdGhlIHVuZGVyc2NvcmVkIHN0cmluZy4KKyAgKi8KKyAgdW5kZXJzY29yZTog
ZnVuY3Rpb24oc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19VTkRFUlNDT1JF
X1JFR0VYUF8xLCAnJDFfJDInKS4KKyAgICAgIHJlcGxhY2UoU1RSSU5HX1VOREVSU0NPUkVfUkVH
RVhQXzIsICdfJykudG9Mb3dlckNhc2UoKTsKKyAgfSwKIAotfSk7CisgIC8qKgorICAgIFJldHVy
bnMgdGhlIENhcGl0YWxpemVkIGZvcm0gb2YgYSBzdHJpbmcKIAotQ2xhc3NNaXhpbi5vd25lckNv
bnN0cnVjdG9yID0gQ29yZU9iamVjdDsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgJ2lubmVySFRN
TCcuY2FwaXRhbGl6ZSgpICAgICAgICAgLy8gJ0lubmVySFRNTCcKKyAgICAnYWN0aW9uX25hbWUn
LmNhcGl0YWxpemUoKSAgICAgICAvLyAnQWN0aW9uX25hbWUnCisgICAgJ2Nzcy1jbGFzcy1uYW1l
Jy5jYXBpdGFsaXplKCkgICAgLy8gJ0Nzcy1jbGFzcy1uYW1lJworICAgICdteSBmYXZvcml0ZSBp
dGVtcycuY2FwaXRhbGl6ZSgpIC8vICdNeSBmYXZvcml0ZSBpdGVtcycKKyAgICBgYGAKIAotaWYg
KEVtYmVyLmNvbmZpZy5vdmVycmlkZUNsYXNzTWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJy
aWRlQ2xhc3NNaXhpbihDbGFzc01peGluKTsKLX0KKyAgICBAbWV0aG9kIGNhcGl0YWxpemUKKyAg
ICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS4KKyAgICBAcmV0
dXJuIHtTdHJpbmd9IFRoZSBjYXBpdGFsaXplZCBzdHJpbmcuCisgICovCisgIGNhcGl0YWxpemU6
IGZ1bmN0aW9uKHN0cikgeworICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkg
KyBzdHIuc3Vic3RyKDEpOworICB9Cit9OwogCi1Db3JlT2JqZWN0LkNsYXNzTWl4aW4gPSBDbGFz
c01peGluOwotQ2xhc3NNaXhpbi5hcHBseShDb3JlT2JqZWN0KTsKIAotLyoqCi0gIEBjbGFzcyBD
b3JlT2JqZWN0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5Db3JlT2JqZWN0ID0gQ29y
ZU9iamVjdDsKIAogfSkoKTsKIApAQCAtMTA0NDIsMTMxMiArMTE1ODMsMTM2NCBAQCBFbWJlci5D
b3JlT2JqZWN0ID0gQ29yZU9iamVjdDsKIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQogKi8KIAot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBndWlkRm9yID0gRW1iZXIuZ3Vp
ZEZvciwgbm9uZSA9IEVtYmVyLmlzTm9uZTsKIAotLyoqCi0gIEFuIHVub3JkZXJlZCBjb2xsZWN0
aW9uIG9mIG9iamVjdHMuCiAKLSAgQSBTZXQgd29ya3MgYSBiaXQgbGlrZSBhbiBhcnJheSBleGNl
cHQgdGhhdCBpdHMgaXRlbXMgYXJlIG5vdCBvcmRlcmVkLiBZb3UKLSAgY2FuIGNyZWF0ZSBhIHNl
dCB0byBlZmZpY2llbnRseSB0ZXN0IGZvciBtZW1iZXJzaGlwIGZvciBhbiBvYmplY3QuIFlvdSBj
YW4KLSAgYWxzbyBpdGVyYXRlIHRocm91Z2ggYSBzZXQganVzdCBsaWtlIGFuIGFycmF5LCBldmVu
IGFjY2Vzc2luZyBvYmplY3RzIGJ5Ci0gIGluZGV4LCBob3dldmVyIHRoZXJlIGlzIG5vIGd1YXJh
bnRlZSBhcyB0byB0aGVpciBvcmRlci4KK3ZhciBmbXQgPSBFbWJlci5TdHJpbmcuZm10LAorICAg
IHcgICA9IEVtYmVyLlN0cmluZy53LAorICAgIGxvYyA9IEVtYmVyLlN0cmluZy5sb2MsCisgICAg
Y2FtZWxpemUgPSBFbWJlci5TdHJpbmcuY2FtZWxpemUsCisgICAgZGVjYW1lbGl6ZSA9IEVtYmVy
LlN0cmluZy5kZWNhbWVsaXplLAorICAgIGRhc2hlcml6ZSA9IEVtYmVyLlN0cmluZy5kYXNoZXJp
emUsCisgICAgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLAorICAgIGNhcGl0
YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwKKyAgICBjbGFzc2lmeSA9IEVtYmVyLlN0
cmluZy5jbGFzc2lmeTsKIAotICBBbGwgU2V0cyBhcmUgb2JzZXJ2YWJsZSB2aWEgdGhlIEVudW1l
cmFibGUgT2JzZXJ2ZXIgQVBJIC0gd2hpY2ggd29ya3MKLSAgb24gYW55IGVudW1lcmFibGUgb2Jq
ZWN0IGluY2x1ZGluZyBib3RoIFNldHMgYW5kIEFycmF5cy4KIAotICAjIyBDcmVhdGluZyBhIFNl
dAoraWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9Q
Uk9UT1RZUEVTLlN0cmluZykgewogCi0gIFlvdSBjYW4gY3JlYXRlIGEgc2V0IGxpa2UgeW91IHdv
dWxkIG1vc3Qgb2JqZWN0cyB1c2luZwotICBgbmV3IEVtYmVyLlNldCgpYC4gTW9zdCBuZXcgc2V0
cyB5b3UgY3JlYXRlIHdpbGwgYmUgZW1wdHksIGJ1dCB5b3UgY2FuCi0gIGFsc28gaW5pdGlhbGl6
ZSB0aGUgc2V0IHdpdGggc29tZSBjb250ZW50IGJ5IHBhc3NpbmcgYW4gYXJyYXkgb3Igb3RoZXIK
LSAgZW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgLyoqCisgICAg
U2VlIFtFbWJlci5TdHJpbmcuZm10XSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0
aG9kX2ZtdCkuCiAKLSAgRmluYWxseSwgeW91IGNhbiBwYXNzIGluIGFuIGV4aXN0aW5nIHNldCBh
bmQgdGhlIHNldCB3aWxsIGJlIGNvcGllZC4gWW91Ci0gIGNhbiBhbHNvIGNyZWF0ZSBhIGNvcHkg
b2YgYSBzZXQgYnkgY2FsbGluZyBgRW1iZXIuU2V0I2NvcHkoKWAuCisgICAgQG1ldGhvZCBmbXQK
KyAgICBAZm9yIFN0cmluZworICAqLworICBTdHJpbmcucHJvdG90eXBlLmZtdCA9IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiBmbXQodGhpcywgYXJndW1lbnRzKTsKKyAgfTsKIAotICBgYGBqYXZh
c2NyaXB0Ci0gIC8vIGNyZWF0ZXMgYSBuZXcgZW1wdHkgc2V0Ci0gIHZhciBmb3VuZE5hbWVzID0g
bmV3IEVtYmVyLlNldCgpOworICAvKioKKyAgICBTZWUgW0VtYmVyLlN0cmluZy53XSgvYXBpL2Ns
YXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX3cpLgogCi0gIC8vIGNyZWF0ZXMgYSBzZXQg
d2l0aCBmb3VyIG5hbWVzIGluIGl0LgotICB2YXIgbmFtZXMgPSBuZXcgRW1iZXIuU2V0KFsiQ2hh
cmxlcyIsICJUb20iLCAiSnVhbiIsICJBbGV4Il0pOyAvLyA6UAorICAgIEBtZXRob2QgdworICAg
IEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUudyA9IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiB3KHRoaXMpOworICB9OwogCi0gIC8vIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBu
YW1lcyBzZXQuCi0gIHZhciBuYW1lc0NvcHkgPSBuZXcgRW1iZXIuU2V0KG5hbWVzKTsKKyAgLyoq
CisgICAgU2VlIFtFbWJlci5TdHJpbmcubG9jXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0
bWwjbWV0aG9kX2xvYykuCiAKLSAgLy8gc2FtZSBhcyBhYm92ZS4KLSAgdmFyIGFub3RoZXJOYW1l
c0NvcHkgPSBuYW1lcy5jb3B5KCk7Ci0gIGBgYAorICAgIEBtZXRob2QgbG9jCisgICAgQGZvciBT
dHJpbmcKKyAgKi8KKyAgU3RyaW5nLnByb3RvdHlwZS5sb2MgPSBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gbG9jKHRoaXMsIGFyZ3VtZW50cyk7CisgIH07CiAKLSAgIyMgQWRkaW5nL1JlbW92aW5n
IE9iamVjdHMKKyAgLyoqCisgICAgU2VlIFtFbWJlci5TdHJpbmcuY2FtZWxpemVdKC9hcGkvY2xh
c3Nlcy9FbWJlci5TdHJpbmcuaHRtbCNtZXRob2RfY2FtZWxpemUpLgogCi0gIFlvdSBnZW5lcmFs
bHkgYWRkIG9yIHJlbW92ZSBvYmplY3RzIGZyb20gYSBzZXQgdXNpbmcgYGFkZCgpYCBvcgotICBg
cmVtb3ZlKClgLiBZb3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBvYmplY3QgaW5jbHVkaW5nIHByaW1p
dGl2ZXMgc3VjaCBhcwotICBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuCisgICAgQG1l
dGhvZCBjYW1lbGl6ZQorICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUu
Y2FtZWxpemUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gY2FtZWxpemUodGhpcyk7CisgIH07
CiAKLSAgVW5saWtlIGFycmF5cywgb2JqZWN0cyBjYW4gb25seSBleGlzdCBvbmUgdGltZSBpbiBh
IHNldC4gSWYgeW91IGNhbGwgYGFkZCgpYAotICBvbiBhIHNldCB3aXRoIHRoZSBzYW1lIG9iamVj
dCBtdWx0aXBsZSB0aW1lcywgdGhlIG9iamVjdCB3aWxsIG9ubHkgYmUgYWRkZWQKLSAgb25jZS4g
TGlrZXdpc2UsIGNhbGxpbmcgYHJlbW92ZSgpYCB3aXRoIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBs
ZSB0aW1lcyB3aWxsCi0gIHJlbW92ZSB0aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGFuZCBoYXZl
IG5vIGVmZmVjdCBvbiBmdXR1cmUgY2FsbHMgdW50aWwKLSAgeW91IGFkZCB0aGUgb2JqZWN0IHRv
IHRoZSBzZXQgYWdhaW4uCisgIC8qKgorICAgIFNlZSBbRW1iZXIuU3RyaW5nLmRlY2FtZWxpemVd
KC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcuaHRtbCNtZXRob2RfZGVjYW1lbGl6ZSkuCiAKLSAg
Tk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3ZlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhIHNl
dC4gQW55IGF0dGVtcHQgdG8gZG8KLSAgc28gd2lsbCBiZSBpZ25vcmVkLgorICAgIEBtZXRob2Qg
ZGVjYW1lbGl6ZQorICAgIEBmb3IgU3RyaW5nCisgICovCisgIFN0cmluZy5wcm90b3R5cGUuZGVj
YW1lbGl6ZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkZWNhbWVsaXplKHRoaXMpOworICB9
OwogCi0gIEluIGFkZGl0aW9uIHRvIGFkZC9yZW1vdmUgeW91IGNhbiBhbHNvIGNhbGwgYHB1c2go
KWAvYHBvcCgpYC4gUHVzaCBiZWhhdmVzCi0gIGp1c3QgbGlrZSBgYWRkKClgIGJ1dCBgcG9wKClg
LCB1bmxpa2UgYHJlbW92ZSgpYCB3aWxsIHBpY2sgYW4gYXJiaXRyYXJ5Ci0gIG9iamVjdCwgcmVt
b3ZlIGl0IGFuZCByZXR1cm4gaXQuIFRoaXMgaXMgYSBnb29kIHdheSB0byB1c2UgYSBzZXQgYXMg
YSBqb2IKLSAgcXVldWUgd2hlbiB5b3UgZG9uJ3QgY2FyZSB3aGljaCBvcmRlciB0aGUgam9icyBh
cmUgZXhlY3V0ZWQgaW4uCisgIC8qKgorICAgIFNlZSBbRW1iZXIuU3RyaW5nLmRhc2hlcml6ZV0o
L2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9kYXNoZXJpemUpLgogCi0gICMj
IFRlc3RpbmcgZm9yIGFuIE9iamVjdAorICAgIEBtZXRob2QgZGFzaGVyaXplCisgICAgQGZvciBT
dHJpbmcKKyAgKi8KKyAgU3RyaW5nLnByb3RvdHlwZS5kYXNoZXJpemUgPSBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gZGFzaGVyaXplKHRoaXMpOworICB9OwogCi0gIFRvIHRlc3QgZm9yIGFuIG9i
amVjdCdzIHByZXNlbmNlIGluIGEgc2V0IHlvdSBzaW1wbHkgY2FsbAotICBgRW1iZXIuU2V0I2Nv
bnRhaW5zKClgLgorICAvKioKKyAgICBTZWUgW0VtYmVyLlN0cmluZy51bmRlcnNjb3JlXSgvYXBp
L2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX3VuZGVyc2NvcmUpLgogCi0gICMjIE9i
c2VydmluZyBjaGFuZ2VzCisgICAgQG1ldGhvZCB1bmRlcnNjb3JlCisgICAgQGZvciBTdHJpbmcK
KyAgKi8KKyAgU3RyaW5nLnByb3RvdHlwZS51bmRlcnNjb3JlID0gZnVuY3Rpb24oKSB7CisgICAg
cmV0dXJuIHVuZGVyc2NvcmUodGhpcyk7CisgIH07CiAKLSAgV2hlbiB1c2luZyBgRW1iZXIuU2V0
YCwgeW91IGNhbiBvYnNlcnZlIHRoZSBgIltdImAgcHJvcGVydHkgdG8gYmUKLSAgYWxlcnRlZCB3
aGVuZXZlciB0aGUgY29udGVudCBjaGFuZ2VzLiBZb3UgY2FuIGFsc28gYWRkIGFuIGVudW1lcmFi
bGUKLSAgb2JzZXJ2ZXIgdG8gdGhlIHNldCB0byBiZSBub3RpZmllZCBvZiBzcGVjaWZpYyBvYmpl
Y3RzIHRoYXQgYXJlIGFkZGVkIGFuZAotICByZW1vdmVkIGZyb20gdGhlIHNldC4gU2VlIGBFbWJl
ci5FbnVtZXJhYmxlYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgotICBlbnVtZXJhYmxlcy4KKyAg
LyoqCisgICAgU2VlIFtFbWJlci5TdHJpbmcuY2xhc3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5T
dHJpbmcuaHRtbCNtZXRob2RfY2xhc3NpZnkpLgogCi0gIFRoaXMgaXMgb2Z0ZW4gdW5oZWxwZnVs
LiBJZiB5b3UgYXJlIGZpbHRlcmluZyBzZXRzIG9mIG9iamVjdHMsIGZvciBpbnN0YW5jZSwKLSAg
aXQgaXMgdmVyeSBpbmVmZmljaWVudCB0byByZS1maWx0ZXIgYWxsIG9mIHRoZSBpdGVtcyBlYWNo
IHRpbWUgdGhlIHNldAotICBjaGFuZ2VzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91IGNvdWxk
IGp1c3QgYWRqdXN0IHRoZSBmaWx0ZXJlZCBzZXQgYmFzZWQKLSAgb24gd2hhdCB3YXMgY2hhbmdl
ZCBvbiB0aGUgb3JpZ2luYWwgc2V0LiBUaGUgc2FtZSBpc3N1ZSBhcHBsaWVzIHRvIG1lcmdpbmcK
LSAgc2V0cywgYXMgd2VsbC4KKyAgICBAbWV0aG9kIGNsYXNzaWZ5CisgICAgQGZvciBTdHJpbmcK
KyAgKi8KKyAgU3RyaW5nLnByb3RvdHlwZS5jbGFzc2lmeSA9IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiBjbGFzc2lmeSh0aGlzKTsKKyAgfTsKIAotICAjIyBPdGhlciBNZXRob2RzCisgIC8qKgor
ICAgIFNlZSBbRW1iZXIuU3RyaW5nLmNhcGl0YWxpemVdKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJp
bmcuaHRtbCNtZXRob2RfY2FwaXRhbGl6ZSkuCiAKLSAgYEVtYmVyLlNldGAgcHJpbWFyeSBpbXBs
ZW1lbnRzIG90aGVyIG1peGluIEFQSXMuIEZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZQotICBvbiB0
aGUgbWV0aG9kcyB5b3Ugd2lsbCB1c2Ugd2l0aCBgRW1iZXIuU2V0YCwgcGxlYXNlIGNvbnN1bHQg
dGhlc2UgbWl4aW5zLgotICBUaGUgbW9zdCB1c2VmdWwgb25lcyB3aWxsIGJlIGBFbWJlci5FbnVt
ZXJhYmxlYCBhbmQKLSAgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlYCB3aGljaCBpbXBsZW1lbnQg
bW9zdCBvZiB0aGUgY29tbW9uIGl0ZXJhdG9yCi0gIG1ldGhvZHMgeW91IGFyZSB1c2VkIHRvIG9u
IEFycmF5LgorICAgIEBtZXRob2QgY2FwaXRhbGl6ZQorICAgIEBmb3IgU3RyaW5nCisgICovCisg
IFN0cmluZy5wcm90b3R5cGUuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBj
YXBpdGFsaXplKHRoaXMpOworICB9OwogCi0gIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNlIHRo
ZSBgRW1iZXIuQ29weWFibGVgIGFuZCBgRW1iZXIuRnJlZXphYmxlYAotICBBUElzIG9uIGBFbWJl
ci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBzZXQgaXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIgYmUK
LSAgbW9kaWZpZWQuIFRoZSBiZW5lZml0IG9mIHRoaXMgaXMgdGhhdCB3aGVuIHlvdSBjYWxsIGBm
cm96ZW5Db3B5KClgIG9uIGl0LAotICBFbWJlciB3aWxsIGF2b2lkIG1ha2luZyBjb3BpZXMgb2Yg
dGhlIHNldC4gVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlCi0gIGNvZGUgdGhhdCBjYW4ga25vdyB3
aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1bmRlcmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKLSAgd2ls
bCBub3QgYmUgbW9kaWZpZWQuCisgIAorfQogCi0gIEBjbGFzcyBTZXQKLSAgQG5hbWVzcGFjZSBF
bWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3JlT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVF
bnVtZXJhYmxlCi0gIEB1c2VzIEVtYmVyLkNvcHlhYmxlCi0gIEB1c2VzIEVtYmVyLkZyZWV6YWJs
ZQotICBAc2luY2UgRW1iZXIgMC45Ci0qLwotRW1iZXIuU2V0ID0gRW1iZXIuQ29yZU9iamVjdC5l
eHRlbmQoRW1iZXIuTXV0YWJsZUVudW1lcmFibGUsIEVtYmVyLkNvcHlhYmxlLCBFbWJlci5GcmVl
emFibGUsCi0gIC8qKiBAc2NvcGUgRW1iZXIuU2V0LnByb3RvdHlwZSAqLyB7CiAKLSAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgot
ICAvLyBJTVBMRU1FTlQgRU5VTUVSQUJMRSBBUElTCi0gIC8vCit9KSgpOwogCi0gIC8qKgotICAg
IFRoaXMgcHJvcGVydHkgd2lsbCBjaGFuZ2UgYXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRo
ZSBzZXQgY2hhbmdlcy4KIAotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlwZSBudW1iZXIK
LSAgICBAZGVmYXVsdCAwCi0gICovCi0gIGxlbmd0aDogMCwKIAotICAvKioKLSAgICBDbGVhcnMg
dGhlIHNldC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmV1c2UgYW4gZXhpc3Rpbmcg
c2V0Ci0gICAgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCisoZnVuY3Rpb24oKSB7Cisv
KioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KIAotICAgIGBg
YGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldChbInJlZCIsICJncmVl
biIsICJibHVlIl0pOwotICAgIGNvbG9ycy5sZW5ndGg7ICAvLyAzCi0gICAgY29sb3JzLmNsZWFy
KCk7Ci0gICAgY29sb3JzLmxlbmd0aDsgIC8vIDAKLSAgICBgYGAKK3ZhciBnZXQgPSBFbWJlci5n
ZXQsCisgICAgc2V0ID0gRW1iZXIuc2V0LAorICAgIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNs
aWNlLAorICAgIGdldFByb3BlcnRpZXMgPSBFbWJlci5nZXRQcm9wZXJ0aWVzOwogCi0gICAgQG1l
dGhvZCBjbGVhcgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gQW4gZW1wdHkgU2V0Ci0gICovCi0g
IGNsZWFyOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc0Zyb3plbikgeyB0aHJvdyBuZXcg
RXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsgfQorLyoqCisgICMjIE92ZXJ2aWV3CiAKLSAgICB2
YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICBpZiAobGVuID09PSAwKSB7IHJldHVy
biB0aGlzOyB9CisgIFRoaXMgbWl4aW4gcHJvdmlkZXMgcHJvcGVydGllcyBhbmQgcHJvcGVydHkg
b2JzZXJ2aW5nIGZ1bmN0aW9uYWxpdHksIGNvcmUKKyAgZmVhdHVyZXMgb2YgdGhlIEVtYmVyIG9i
amVjdCBtb2RlbC4KIAotICAgIHZhciBndWlkOworICBQcm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMg
YWxsb3cgb25lIG9iamVjdCB0byBvYnNlcnZlIGNoYW5nZXMgdG8gYQorICBwcm9wZXJ0eSBvbiBh
bm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFsIHdheXMgdGhhdAor
ICBtb2RlbHMsIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3Ro
ZXIgaW4gYW4gRW1iZXIKKyAgYXBwbGljYXRpb24uCiAKLSAgICB0aGlzLmVudW1lcmFibGVDb250
ZW50V2lsbENoYW5nZShsZW4sIDApOwotICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LCAnZmlyc3RPYmplY3QnKTsKLSAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xh
c3RPYmplY3QnKTsKKyAgQW55IG9iamVjdCB0aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2Fu
IGJlIHVzZWQgaW4gb2JzZXJ2ZXIKKyAgb3BlcmF0aW9ucy4gVGhhdCBpbmNsdWRlcyBgRW1iZXIu
T2JqZWN0YCBhbmQgbW9zdCBvYmplY3RzIHlvdSB3aWxsCisgIGludGVyYWN0IHdpdGggYXMgeW91
IHdyaXRlIHlvdXIgRW1iZXIgYXBwbGljYXRpb24uCiAKLSAgICBmb3IgKHZhciBpPTA7IGkgPCBs
ZW47IGkrKyl7Ci0gICAgICBndWlkID0gZ3VpZEZvcih0aGlzW2ldKTsKLSAgICAgIGRlbGV0ZSB0
aGlzW2d1aWRdOwotICAgICAgZGVsZXRlIHRoaXNbaV07Ci0gICAgfQorICBOb3RlIHRoYXQgeW91
IHdpbGwgbm90IGdlbmVyYWxseSBhcHBseSB0aGlzIG1peGluIHRvIGNsYXNzZXMgeW91cnNlbGYs
CisgIGJ1dCB5b3Ugd2lsbCB1c2UgdGhlIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxl
IGZyZXF1ZW50bHksIHNvIGl0CisgIGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyB0byB1
c2UgaXQuCiAKLSAgICBzZXQodGhpcywgJ2xlbmd0aCcsIDApOworICAjIyBVc2luZyBgZ2V0KClg
IGFuZCBgc2V0KClgCiAKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnZmlyc3RP
YmplY3QnKTsKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcp
OwotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UobGVuLCAwKTsKKyAgQmVjYXVz
ZSBvZiBFbWJlcidzIHN1cHBvcnQgZm9yIGJpbmRpbmdzIGFuZCBvYnNlcnZlcnMsIHlvdSB3aWxs
IGFsd2F5cworICBhY2Nlc3MgcHJvcGVydGllcyB1c2luZyB0aGUgZ2V0IG1ldGhvZCwgYW5kIHNl
dCBwcm9wZXJ0aWVzIHVzaW5nIHRoZQorICBzZXQgbWV0aG9kLiBUaGlzIGFsbG93cyB0aGUgb2Jz
ZXJ2aW5nIG9iamVjdHMgdG8gYmUgbm90aWZpZWQgYW5kCisgIGNvbXB1dGVkIHByb3BlcnRpZXMg
dG8gYmUgaGFuZGxlZCBwcm9wZXJseS4KIAotICAgIHJldHVybiB0aGlzOwotICB9LAorICBNb3Jl
IGRvY3VtZW50YXRpb24gYWJvdXQgYGdldGAgYW5kIGBzZXRgIGFyZSBiZWxvdy4KIAotICAvKioK
LSAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYWxzbyBhbiBlbnVtZXJh
YmxlIHRoYXQgY29udGFpbnMgdGhlCi0gICAgc2FtZSBvYmplY3RzIGFzIHRoZSByZWNlaXZlci4K
KyAgIyMgT2JzZXJ2aW5nIFByb3BlcnR5IENoYW5nZXMKIAotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdLAotICAgICAgICBzYW1lX2Nv
bG9ycyA9IG5ldyBFbWJlci5TZXQoY29sb3JzKTsKKyAgWW91IHR5cGljYWxseSBvYnNlcnZlIHBy
b3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAorICBjYWxsIHRv
IHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ug
d3JpdGUuCisgIEZvciBleGFtcGxlOgogCi0gICAgc2FtZV9jb2xvcnMuaXNFcXVhbChjb2xvcnMp
OyAgICAgICAgICAgICAgIC8vIHRydWUKLSAgICBzYW1lX2NvbG9ycy5pc0VxdWFsKFsicHVycGxl
IiwgImJyb3duIl0pOyAgLy8gZmFsc2UKLSAgICBgYGAKKyAgYGBgamF2YXNjcmlwdAorICBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKKyAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKKyAgICAg
IC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICB9
Lm9ic2VydmVzKCd2YWx1ZScpCisgIH0pOworICBgYGAKIAotICAgIEBtZXRob2QgaXNFcXVhbAot
ICAgIEBwYXJhbSB7RW1iZXIuU2V0fSBvYmogdGhlIG90aGVyIG9iamVjdC4KLSAgICBAcmV0dXJu
IHtCb29sZWFufQotICAqLwotICBpc0VxdWFsOiBmdW5jdGlvbihvYmopIHsKLSAgICAvLyBmYWls
IGZhc3QKLSAgICBpZiAoIUVtYmVyLkVudW1lcmFibGUuZGV0ZWN0KG9iaikpIHJldHVybiBmYWxz
ZTsKKyAgQWx0aG91Z2ggdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gd2F5IHRvIGFkZCBhbiBvYnNl
cnZlciwgdGhpcyBjYXBhYmlsaXR5CisgIGlzIGFjdHVhbGx5IGJ1aWx0IGludG8gdGhlIGBFbWJl
ci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0d28gbWV0aG9kcworICBkZWZpbmVkIGluIHRoaXMg
bWl4aW46IGBhZGRPYnNlcnZlcmAgYW5kIGByZW1vdmVPYnNlcnZlcmAuIFlvdSBjYW4gdXNlCisg
IHRoZXNlIHR3byBtZXRob2RzIHRvIGFkZCBhbmQgcmVtb3ZlIG9ic2VydmVycyB5b3Vyc2VsZiBp
ZiB5b3UgbmVlZCB0bworICBkbyBzbyBhdCBydW50aW1lLgogCi0gICAgdmFyIGxvYyA9IGdldCh0
aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYgKGdldChvYmosICdsZW5ndGgnKSAhPT0gbG9jKSByZXR1
cm4gZmFsc2U7CisgIFRvIGFkZCBhbiBvYnNlcnZlciBmb3IgYSBwcm9wZXJ0eSwgY2FsbDoKIAot
ICAgIHdoaWxlKC0tbG9jID49IDApIHsKLSAgICAgIGlmICghb2JqLmNvbnRhaW5zKHRoaXNbbG9j
XSkpIHJldHVybiBmYWxzZTsKLSAgICB9CisgIGBgYGphdmFzY3JpcHQKKyAgb2JqZWN0LmFkZE9i
c2VydmVyKCdwcm9wZXJ0eUtleScsIHRhcmdldE9iamVjdCwgdGFyZ2V0QWN0aW9uKQorICBgYGAK
IAotICAgIHJldHVybiB0cnVlOwotICB9LAorICBUaGlzIHdpbGwgY2FsbCB0aGUgYHRhcmdldEFj
dGlvbmAgbWV0aG9kIG9uIHRoZSBgdGFyZ2V0T2JqZWN0YCB3aGVuZXZlcgorICB0aGUgdmFsdWUg
b2YgdGhlIGBwcm9wZXJ0eUtleWAgY2hhbmdlcy4KKworICBOb3RlIHRoYXQgaWYgYHByb3BlcnR5
S2V5YCBpcyBhIGNvbXB1dGVkIHByb3BlcnR5LCB0aGUgb2JzZXJ2ZXIgd2lsbCBiZQorICBjYWxs
ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3BlcnR5IGRlcGVuZGVuY2llcyBhcmUgY2hhbmdlZCwgZXZl
biBpZiB0aGUKKyAgcmVzdWx0aW5nIHZhbHVlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBpcyB1
bmNoYW5nZWQuIFRoaXMgaXMgbmVjZXNzYXJ5CisgIGJlY2F1c2UgY29tcHV0ZWQgcHJvcGVydGll
cyBhcmUgbm90IGNvbXB1dGVkIHVudGlsIGBnZXRgIGlzIGNhbGxlZC4KKworICBAY2xhc3MgT2Jz
ZXJ2YWJsZQorICBAbmFtZXNwYWNlIEVtYmVyCisqLworRW1iZXIuT2JzZXJ2YWJsZSA9IEVtYmVy
Lk1peGluLmNyZWF0ZSh7CiAKICAgLyoqCi0gICAgQWRkcyBhbiBvYmplY3QgdG8gdGhlIHNldC4g
T25seSBub24tYG51bGxgIG9iamVjdHMgY2FuIGJlIGFkZGVkIHRvIGEgc2V0Ci0gICAgYW5kIHRo
b3NlIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UuIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0
aGUgc2V0IG9yCi0gICAgdGhlIHBhc3NlZCB2YWx1ZSBpcyBudWxsIHRoaXMgbWV0aG9kIHdpbGwg
aGF2ZSBubyBlZmZlY3QuCisgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGZy
b20gdGhlIG9iamVjdC4KIAotICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxl
RW51bWVyYWJsZS5hZGRPYmplY3QoKWAuCisgICAgVGhpcyBtZXRob2QgaXMgdXN1YWxseSBzaW1p
bGFyIHRvIHVzaW5nIGBvYmplY3Rba2V5TmFtZV1gIG9yIGBvYmplY3Qua2V5TmFtZWAsCisgICAg
aG93ZXZlciBpdCBzdXBwb3J0cyBib3RoIGNvbXB1dGVkIHByb3BlcnRpZXMgYW5kIHRoZSB1bmtu
b3duUHJvcGVydHkKKyAgICBoYW5kbGVyLgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBj
b2xvcnMgPSBuZXcgRW1iZXIuU2V0KCk7Ci0gICAgY29sb3JzLmFkZCgiYmx1ZSIpOyAgICAgLy8g
WyJibHVlIl0KLSAgICBjb2xvcnMuYWRkKCJibHVlIik7ICAgICAvLyBbImJsdWUiXQotICAgIGNv
bG9ycy5hZGQoInJlZCIpOyAgICAgIC8vIFsiYmx1ZSIsICJyZWQiXQotICAgIGNvbG9ycy5hZGQo
bnVsbCk7ICAgICAgIC8vIFsiYmx1ZSIsICJyZWQiXQotICAgIGNvbG9ycy5hZGQodW5kZWZpbmVk
KTsgIC8vIFsiYmx1ZSIsICJyZWQiXQotICAgIGBgYAorICAgIEJlY2F1c2UgYGdldGAgdW5pZmll
cyB0aGUgc3ludGF4IGZvciBhY2Nlc3NpbmcgYWxsIHRoZXNlIGtpbmRzCisgICAgb2YgcHJvcGVy
dGllcywgaXQgY2FuIG1ha2UgbWFueSByZWZhY3RvcmluZ3MgZWFzaWVyLCBzdWNoIGFzIHJlcGxh
Y2luZyBhCisgICAgc2ltcGxlIHByb3BlcnR5IHdpdGggYSBjb21wdXRlZCBwcm9wZXJ0eSwgb3Ig
dmljZSB2ZXJzYS4KIAotICAgIEBtZXRob2QgYWRkCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iaiBU
aGUgb2JqZWN0IHRvIGFkZC4KLSAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxm
LgotICAqLwotICBhZGQ6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmplY3QnKSwKKyAgICAjIyMg
Q29tcHV0ZWQgUHJvcGVydGllcwogCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIG9iamVjdCBmcm9t
IHRoZSBzZXQgaWYgaXQgaXMgZm91bmQuIElmIHlvdSBwYXNzIGEgYG51bGxgIHZhbHVlCi0gICAg
b3IgYW4gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBub3QgaW4gdGhlIHNldCwgdGhpcyBtZXRob2Qg
d2lsbCBoYXZlIG5vCi0gICAgZWZmZWN0LiBUaGlzIGlzIGFuIGFsaWFzIGZvciBgRW1iZXIuTXV0
YWJsZUVudW1lcmFibGUucmVtb3ZlT2JqZWN0KClgLgorICAgIENvbXB1dGVkIHByb3BlcnRpZXMg
YXJlIG1ldGhvZHMgZGVmaW5lZCB3aXRoIHRoZSBgcHJvcGVydHlgIG1vZGlmaWVyCisgICAgZGVj
bGFyZWQgYXQgdGhlIGVuZCwgc3VjaCBhczoKIAogICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIg
Y29sb3JzID0gbmV3IEVtYmVyLlNldChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOwotICAgIGNv
bG9ycy5yZW1vdmUoInJlZCIpOyAgICAgLy8gWyJibHVlIiwgImdyZWVuIl0KLSAgICBjb2xvcnMu
cmVtb3ZlKCJwdXJwbGUiKTsgIC8vIFsiYmx1ZSIsICJncmVlbiJdCi0gICAgY29sb3JzLnJlbW92
ZShudWxsKTsgICAgICAvLyBbImJsdWUiLCAiZ3JlZW4iXQorICAgIGZ1bGxOYW1lOiBmdW5jdGlv
bigpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdl
dCgnbGFzdE5hbWUnKTsKKyAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQog
ICAgIGBgYAogCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRo
ZSBvYmplY3QgdG8gcmVtb3ZlCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2Vs
Zi4KLSAgKi8KLSAgcmVtb3ZlOiBFbWJlci5hbGlhc01ldGhvZCgncmVtb3ZlT2JqZWN0JyksCisg
ICAgV2hlbiB5b3UgY2FsbCBgZ2V0YCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5LCB0aGUgZnVuY3Rp
b24gd2lsbCBiZQorICAgIGNhbGxlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHJldHVy
bmVkIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uCisgICAgaXRzZWxmLgogCi0gIC8qKgotICAgIFJl
bW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9yIGBu
dWxsYCBpZiBpdCdzIGVtcHR5LgorICAgICMjIyBVbmtub3duIFByb3BlcnRpZXMKIAotICAgIGBg
YGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldChbImdyZWVuIiwgImJs
dWUiXSk7Ci0gICAgY29sb3JzLnBvcCgpOyAgLy8gImJsdWUiCi0gICAgY29sb3JzLnBvcCgpOyAg
Ly8gImdyZWVuIgotICAgIGNvbG9ycy5wb3AoKTsgIC8vIG51bGwKLSAgICBgYGAKKyAgICBMaWtl
d2lzZSwgaWYgeW91IHRyeSB0byBjYWxsIGBnZXRgIG9uIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUg
aXMKKyAgICBgdW5kZWZpbmVkYCwgdGhlIGB1bmtub3duUHJvcGVydHkoKWAgbWV0aG9kIHdpbGwg
YmUgY2FsbGVkIG9uIHRoZSBvYmplY3QuCisgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBhbnkg
dmFsdWUgb3RoZXIgdGhhbiBgdW5kZWZpbmVkYCwgaXQgd2lsbCBiZSByZXR1cm5lZAorICAgIGlu
c3RlYWQuIFRoaXMgYWxsb3dzIHlvdSB0byBpbXBsZW1lbnQgInZpcnR1YWwiIHByb3BlcnRpZXMg
dGhhdCBhcmUKKyAgICBub3QgZGVmaW5lZCB1cGZyb250LgogCi0gICAgQG1ldGhvZCBwb3AKLSAg
ICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZW1vdmVkIG9iamVjdCBmcm9tIHRoZSBzZXQgb3IgbnVs
bC4KKyAgICBAbWV0aG9kIGdldAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9w
ZXJ0eSB0byByZXRyaWV2ZQorICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHByb3BlcnR5IHZhbHVl
IG9yIHVuZGVmaW5lZC4KICAgKi8KLSAgcG9wOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRo
aXMsICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAg
ICB2YXIgb2JqID0gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51bGw7
Ci0gICAgdGhpcy5yZW1vdmUob2JqKTsKLSAgICByZXR1cm4gb2JqOworICBnZXQ6IGZ1bmN0aW9u
KGtleU5hbWUpIHsKKyAgICByZXR1cm4gZ2V0KHRoaXMsIGtleU5hbWUpOwogICB9LAogCiAgIC8q
KgotICAgIEluc2VydHMgdGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQu
IEl0IHJldHVybnMKLSAgICB0aGUgc2V0IGl0c2VsZi4KKyAgICBUbyBnZXQgbXVsdGlwbGUgcHJv
cGVydGllcyBhdCBvbmNlLCBjYWxsIGBnZXRQcm9wZXJ0aWVzYAorICAgIHdpdGggYSBsaXN0IG9m
IHN0cmluZ3Mgb3IgYW4gYXJyYXk6CiAKLSAgICBUaGlzIGlzIGFuIGFsaWFzIGZvciBgRW1iZXIu
TXV0YWJsZUVudW1lcmFibGUuYWRkT2JqZWN0KClgLgorICAgIGBgYGphdmFzY3JpcHQKKyAgICBy
ZWNvcmQuZ2V0UHJvcGVydGllcygnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsg
IC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDEx
JyB9CisgICAgYGBgCisKKyAgICBpcyBlcXVpdmFsZW50IHRvOgogCiAgICAgYGBgamF2YXNjcmlw
dAotICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KCk7Ci0gICAgY29sb3JzLnB1c2goInJl
ZCIpOyAgIC8vIFsicmVkIl0KLSAgICBjb2xvcnMucHVzaCgiZ3JlZW4iKTsgLy8gWyJyZWQiLCAi
Z3JlZW4iXQotICAgIGNvbG9ycy5wdXNoKCJibHVlIik7ICAvLyBbInJlZCIsICJncmVlbiIsICJi
bHVlIl0KKyAgICByZWNvcmQuZ2V0UHJvcGVydGllcyhbJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScs
ICd6aXBDb2RlJ10pOyAgLy8geyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6
aXBDb2RlOiAnMTAwMTEnIH0KICAgICBgYGAKIAotICAgIEBtZXRob2QgcHVzaAotICAgIEByZXR1
cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCisgICAgQG1ldGhvZCBnZXRQcm9wZXJ0aWVz
CisgICAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKKyAgICBA
cmV0dXJuIHtIYXNofQogICAqLwotICBwdXNoOiBFbWJlci5hbGlhc01ldGhvZCgnYWRkT2JqZWN0
JyksCisgIGdldFByb3BlcnRpZXM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBnZXRQcm9wZXJ0
aWVzLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7Cisg
IH0sCiAKICAgLyoqCi0gICAgUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHNldCBh
bmQgcmV0dXJucyBpdCwgb3IgYG51bGxgIGlmIGl0J3MgZW1wdHkuCisgICAgU2V0cyB0aGUgcHJv
dmlkZWQga2V5IG9yIHBhdGggdG8gdGhlIHZhbHVlLgogCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBm
b3IgYEVtYmVyLlNldC5wb3AoKWAuCisgICAgVGhpcyBtZXRob2QgaXMgZ2VuZXJhbGx5IHZlcnkg
c2ltaWxhciB0byBjYWxsaW5nIGBvYmplY3Rba2V5XSA9IHZhbHVlYCBvcgorICAgIGBvYmplY3Qu
a2V5ID0gdmFsdWVgLCBleGNlcHQgdGhhdCBpdCBwcm92aWRlcyBzdXBwb3J0IGZvciBjb21wdXRl
ZAorICAgIHByb3BlcnRpZXMsIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClgIG1ldGhvZCBhbmQg
cHJvcGVydHkgb2JzZXJ2ZXJzLgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMg
PSBuZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xvcnMuc2hpZnQoKTsg
IC8vICJibHVlIgotICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gImdyZWVuIgotICAgIGNvbG9ycy5z
aGlmdCgpOyAgLy8gbnVsbAotICAgIGBgYAorICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVzCiAK
LSAgICBAbWV0aG9kIHNoaWZ0Ci0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVtb3ZlZCBvYmpl
Y3QgZnJvbSB0aGUgc2V0IG9yIG51bGwuCi0gICovCi0gIHNoaWZ0OiBFbWJlci5hbGlhc01ldGhv
ZCgncG9wJyksCisgICAgSWYgeW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGhh
cyBhIGNvbXB1dGVkIHByb3BlcnR5IGhhbmRsZXIKKyAgICBkZWZpbmVkIChzZWUgdGhlIGBnZXQo
KWAgbWV0aG9kIGZvciBhbiBleGFtcGxlKSwgdGhlbiBgc2V0KClgIHdpbGwgY2FsbAorICAgIHRo
YXQgbWV0aG9kLCBwYXNzaW5nIGJvdGggdGhlIHZhbHVlIGFuZCBrZXkgaW5zdGVhZCBvZiBzaW1w
bHkgY2hhbmdpbmcKKyAgICB0aGUgdmFsdWUgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhv
c2UgdGltZXMgd2hlbiB5b3UgbmVlZCB0bworICAgIGltcGxlbWVudCBhIHByb3BlcnR5IHRoYXQg
aXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgbWVtYmVyCisgICAgcHJvcGVydGllcy4KIAotICAv
KioKLSAgICBJbnNlcnRzIHRoZSBnaXZlbiBvYmplY3Qgb24gdG8gdGhlIGVuZCBvZiB0aGUgc2V0
LiBJdCByZXR1cm5zCi0gICAgdGhlIHNldCBpdHNlbGYuCisgICAgIyMjIFVua25vd24gUHJvcGVy
dGllcwogCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBvZiBgRW1iZXIuU2V0LnB1c2goKWAKKyAgICBJ
ZiB5b3UgdHJ5IHRvIHNldCBhIHZhbHVlIG9uIGEga2V5IHRoYXQgaXMgdW5kZWZpbmVkIGluIHRo
ZSB0YXJnZXQKKyAgICBvYmplY3QsIHRoZW4gdGhlIGBzZXRVbmtub3duUHJvcGVydHkoKWAgaGFu
ZGxlciB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkLiBUaGlzCisgICAgZ2l2ZXMgeW91IGFuIG9wcG9y
dHVuaXR5IHRvIGltcGxlbWVudCBjb21wbGV4ICJ2aXJ0dWFsIiBwcm9wZXJ0aWVzIHRoYXQKKyAg
ICBhcmUgbm90IHByZWRlZmluZWQgb24gdGhlIG9iamVjdC4gSWYgYHNldFVua25vd25Qcm9wZXJ0
eSgpYCByZXR1cm5zCisgICAgdW5kZWZpbmVkLCB0aGVuIGBzZXQoKWAgd2lsbCBzaW1wbHkgc2V0
IHRoZSB2YWx1ZSBvbiB0aGUgb2JqZWN0LgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBj
b2xvcnMgPSBuZXcgRW1iZXIuU2V0KCk7Ci0gICAgY29sb3JzLnVuc2hpZnQoInJlZCIpOyAgICAv
LyBbInJlZCJdCi0gICAgY29sb3JzLnVuc2hpZnQoImdyZWVuIik7ICAvLyBbInJlZCIsICJncmVl
biJdCi0gICAgY29sb3JzLnVuc2hpZnQoImJsdWUiKTsgICAvLyBbInJlZCIsICJncmVlbiIsICJi
bHVlIl0KLSAgICBgYGAKKyAgICAjIyMgUHJvcGVydHkgT2JzZXJ2ZXJzCiAKLSAgICBAbWV0aG9k
IHVuc2hpZnQKLSAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgotICAqLwot
ICB1bnNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncHVzaCcpLAorICAgIEluIGFkZGl0aW9uIHRv
IGNoYW5naW5nIHRoZSBwcm9wZXJ0eSwgYHNldCgpYCB3aWxsIGFsc28gcmVnaXN0ZXIgYSBwcm9w
ZXJ0eQorICAgIGNoYW5nZSB3aXRoIHRoZSBvYmplY3QuIFVubGVzcyB5b3UgaGF2ZSBwbGFjZWQg
dGhpcyBjYWxsIGluc2lkZSBvZiBhCisgICAgYGJlZ2luUHJvcGVydHlDaGFuZ2VzKClgIGFuZCBg
ZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxvY2FsIiBvYnNlcnZlcnMKKyAgICAoaS5lLiBv
YnNlcnZlciBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBzYW1lIG9iamVjdCksIHdpbGwgYmUgY2Fs
bGVkCisgICAgaW1tZWRpYXRlbHkuIEFueSAicmVtb3RlIiBvYnNlcnZlcnMgKGkuZS4gb2JzZXJ2
ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbgorICAgIGFub3RoZXIgb2JqZWN0KSB3aWxsIGJlIHBsYWNl
ZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBsYXRlciB0aW1lIGluIGEKKyAgICBjb2FsZXNj
ZWQgbWFubmVyLgogCi0gIC8qKgotICAgIEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBl
bnVtZXJhYmxlIHRvIHRoZSBzZXQuCisgICAgIyMjIENoYWluaW5nCiAKLSAgICBUaGlzIGlzIGFu
IGFsaWFzIG9mIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3RzKClgCisgICAgSW4g
YWRkaXRpb24gdG8gcHJvcGVydHkgY2hhbmdlcywgYHNldCgpYCByZXR1cm5zIHRoZSB2YWx1ZSBv
ZiB0aGUgb2JqZWN0CisgICAgaXRzZWxmIHNvIHlvdSBjYW4gZG8gY2hhaW5pbmcgbGlrZSB0aGlz
OgogCiAgICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KCk7
Ci0gICAgY29sb3JzLmFkZEVhY2goWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsgIC8vIFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXQorICAgIHJlY29yZC5zZXQoJ2ZpcnN0TmFtZScsICdDaGFybGVz
Jykuc2V0KCdsYXN0TmFtZScsICdKb2xsZXknKTsKICAgICBgYGAKIAotICAgIEBtZXRob2QgYWRk
RWFjaAotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0
byBhZGQuCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KKyAgICBAbWV0
aG9kIHNldAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSB0byBzZXQK
KyAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBvciBgbnVsbGAuCisg
ICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KICAgKi8KLSAgYWRkRWFjaDogRW1iZXIuYWxp
YXNNZXRob2QoJ2FkZE9iamVjdHMnKSwKKyAgc2V0OiBmdW5jdGlvbihrZXlOYW1lLCB2YWx1ZSkg
eworICAgIHNldCh0aGlzLCBrZXlOYW1lLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0s
CiAKLSAgLyoqCi0gICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFi
bGUgdG8gdGhlIHNldC4KIAotICAgIFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11dGFibGVF
bnVtZXJhYmxlLnJlbW92ZU9iamVjdHMoKWAKKyAgLyoqCisgICAgU2V0cyBhIGxpc3Qgb2YgcHJv
cGVydGllcyBhdCBvbmNlLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgaW5zaWRlCisgICAgYSBz
aW5nbGUgYGJlZ2luUHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0
Y2gsIHNvCisgICAgb2JzZXJ2ZXJzIHdpbGwgYmUgYnVmZmVyZWQuCiAKICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1
ZSJdKTsKLSAgICBjb2xvcnMucmVtb3ZlRWFjaChbInJlZCIsICJibHVlIl0pOyAgLy8gIFsiZ3Jl
ZW4iXQorICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHsgZmlyc3ROYW1lOiAnQ2hhcmxlcycsIGxh
c3ROYW1lOiAnSm9sbGV5JyB9KTsKICAgICBgYGAKIAotICAgIEBtZXRob2QgcmVtb3ZlRWFjaAot
ICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byByZW1v
dmUuCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KKyAgICBAbWV0aG9k
IHNldFByb3BlcnRpZXMKKyAgICBAcGFyYW0ge0hhc2h9IGhhc2ggdGhlIGhhc2ggb2Yga2V5cyBh
bmQgdmFsdWVzIHRvIHNldAorICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9CiAgICovCi0g
IHJlbW92ZUVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZW1vdmVPYmplY3RzJyksCi0KLSAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotICAvLyBQUklWQVRFIEVOVU1FUkFCTEUgU1VQUE9SVAotICAvLwotCi0gIGluaXQ6IGZ1bmN0
aW9uKGl0ZW1zKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICBpZiAoaXRlbXMpIHRoaXMuYWRk
T2JqZWN0cyhpdGVtcyk7Ci0gIH0sCi0KLSAgLy8gaW1wbGVtZW50IEVtYmVyLkVudW1lcmFibGUK
LSAgbmV4dE9iamVjdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRoaXNbaWR4XTsKKyAg
c2V0UHJvcGVydGllczogZnVuY3Rpb24oaGFzaCkgeworICAgIHJldHVybiBFbWJlci5zZXRQcm9w
ZXJ0aWVzKHRoaXMsIGhhc2gpOwogICB9LAogCi0gIC8vIG1vcmUgb3B0aW1pemVkIHZlcnNpb24K
LSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0
aGlzLmxlbmd0aCA+IDAgPyB0aGlzWzBdIDogdW5kZWZpbmVkOwotICB9KSwKLQotICAvLyBtb3Jl
IG9wdGltaXplZCB2ZXJzaW9uCi0gIGxhc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgewotICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IDAgPyB0aGlzW3RoaXMubGVuZ3RoLTFdIDog
dW5kZWZpbmVkOwotICB9KSwKLQotICAvLyBpbXBsZW1lbnRzIEVtYmVyLk11dGFibGVFbnVtZXJh
YmxlCi0gIGFkZE9iamVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNG
cm96ZW4nKSkgdGhyb3cgbmV3IEVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7Ci0gICAgaWYgKG5v
bmUob2JqKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQotICAgIHZhciBndWlkID0g
Z3VpZEZvcihvYmopLAotICAgICAgICBpZHggID0gdGhpc1tndWlkXSwKLSAgICAgICAgbGVuICA9
IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGFkZGVkIDsKLQotICAgIGlmIChpZHg+PTAg
JiYgaWR4PGxlbiAmJiAodGhpc1tpZHhdID09PSBvYmopKSByZXR1cm4gdGhpczsgLy8gYWRkZWQK
KyAgLyoqCisgICAgQmVnaW5zIGEgZ3JvdXBpbmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KIAotICAg
IGFkZGVkID0gW29ial07CisgICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gZ3JvdXAgcHJv
cGVydHkgY2hhbmdlcyBzbyB0aGF0IG5vdGlmaWNhdGlvbnMKKyAgICB3aWxsIG5vdCBiZSBzZW50
IHVudGlsIHRoZSBjaGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisg
ICAgbGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGF0IG9uZSB0aW1lLCB5b3Ug
c2hvdWxkIGNhbGwgdGhpcworICAgIG1ldGhvZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFu
Z2VzIHRvIGJlZ2luIGRlZmVycmluZyBjaGFuZ2UKKyAgICBub3RpZmljYXRpb25zLiBXaGVuIHlv
dSBhcmUgZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbAorICAgIGBlbmRQcm9wZXJ0eUNoYW5nZXMo
KWAgdG8gZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZAor
ICAgIGRlZmVycmluZy4KIAotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlKG51
bGwsIGFkZGVkKTsKLSAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmpl
Y3QnKTsKKyAgICBAbWV0aG9kIGJlZ2luUHJvcGVydHlDaGFuZ2VzCisgICAgQHJldHVybiB7RW1i
ZXIuT2JzZXJ2YWJsZX0KKyAgKi8KKyAgYmVnaW5Qcm9wZXJ0eUNoYW5nZXM6IGZ1bmN0aW9uKCkg
eworICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0sCiAKLSAgICBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIHRoaXNbZ3VpZF0gPSBs
ZW47Ci0gICAgdGhpc1tsZW5dID0gb2JqOwotICAgIHNldCh0aGlzLCAnbGVuZ3RoJywgbGVuKzEp
OworICAvKioKKyAgICBFbmRzIGEgZ3JvdXBpbmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KIAotICAg
IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0gICAgdGhpcy5l
bnVtZXJhYmxlQ29udGVudERpZENoYW5nZShudWxsLCBhZGRlZCk7CisgICAgWW91IGNhbiB1c2Ug
dGhpcyBtZXRob2QgdG8gZ3JvdXAgcHJvcGVydHkgY2hhbmdlcyBzbyB0aGF0IG5vdGlmaWNhdGlv
bnMKKyAgICB3aWxsIG5vdCBiZSBzZW50IHVudGlsIHRoZSBjaGFuZ2VzIGFyZSBmaW5pc2hlZC4g
SWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAgbGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgdG8gYW4g
b2JqZWN0IGF0IG9uZSB0aW1lLCB5b3Ugc2hvdWxkIGNhbGwKKyAgICBgYmVnaW5Qcm9wZXJ0eUNo
YW5nZXMoKWAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhbmdlcyB0byBkZWZlciBjaGFuZ2UK
KyAgICBub3RpZmljYXRpb25zLiBXaGVuIHlvdSBhcmUgZG9uZSBtYWtpbmcgY2hhbmdlcywgY2Fs
bCB0aGlzIG1ldGhvZCB0bworICAgIGRlbGl2ZXIgdGhlIGRlZmVycmVkIGNoYW5nZSBub3RpZmlj
YXRpb25zIGFuZCBlbmQgZGVmZXJyaW5nLgogCisgICAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5n
ZXMKKyAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQorICAqLworICBlbmRQcm9wZXJ0eUNo
YW5nZXM6IGZ1bmN0aW9uKCkgeworICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpOwogICAg
IHJldHVybiB0aGlzOwogICB9LAogCi0gIC8vIGltcGxlbWVudHMgRW1iZXIuTXV0YWJsZUVudW1l
cmFibGUKLSAgcmVtb3ZlT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICBpZiAoZ2V0KHRoaXMs
ICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICBp
ZiAobm9uZShvYmopKSByZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotCi0gICAgdmFyIGd1
aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAgIGlkeCAgPSB0aGlzW2d1aWRdLAotICAgICAgICBs
ZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpLAotICAgICAgICBpc0ZpcnN0ID0gaWR4ID09PSAwLAot
ICAgICAgICBpc0xhc3QgPSBpZHggPT09IGxlbi0xLAotICAgICAgICBsYXN0LCByZW1vdmVkOwor
ICAvKioKKyAgICBOb3RpZnkgdGhlIG9ic2VydmVyIHN5c3RlbSB0aGF0IGEgcHJvcGVydHkgaXMg
YWJvdXQgdG8gY2hhbmdlLgogCisgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBhIHZh
bHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAorICAgIGFjdHVhbGx5IGNhbGxpbmcg
YGdldCgpYCBvciBgc2V0KClgIG9uIGl0LiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdXNlIHRoaXMK
KyAgICBtZXRob2QgYW5kIGBwcm9wZXJ0eURpZENoYW5nZSgpYCBpbnN0ZWFkLiBDYWxsaW5nIHRo
ZXNlIHR3byBtZXRob2RzCisgICAgdG9nZXRoZXIgd2lsbCBub3RpZnkgYWxsIG9ic2VydmVycyB0
aGF0IHRoZSBwcm9wZXJ0eSBoYXMgcG90ZW50aWFsbHkKKyAgICBjaGFuZ2VkIHZhbHVlLgogCi0g
ICAgaWYgKGlkeD49MCAmJiBpZHg8bGVuICYmICh0aGlzW2lkeF0gPT09IG9iaikpIHsKLSAgICAg
IHJlbW92ZWQgPSBbb2JqXTsKKyAgICBOb3RlIHRoYXQgeW91IG11c3QgYWx3YXlzIGNhbGwgYHBy
b3BlcnR5V2lsbENoYW5nZWAgYW5kIGBwcm9wZXJ0eURpZENoYW5nZWAKKyAgICBhcyBhIHBhaXIu
IElmIHlvdSBkbyBub3QsIGl0IG1heSBnZXQgdGhlIHByb3BlcnR5IGNoYW5nZSBncm91cHMgb3V0
IG9mCisgICAgb3JkZXIgYW5kIGNhdXNlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZGVsaXZlcmVkIG1v
cmUgb2Z0ZW4gdGhhbiB5b3Ugd291bGQKKyAgICBsaWtlLgogCi0gICAgICB0aGlzLmVudW1lcmFi
bGVDb250ZW50V2lsbENoYW5nZShyZW1vdmVkLCBudWxsKTsKLSAgICAgIGlmIChpc0ZpcnN0KSB7
IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsgfQotICAgICAg
aWYgKGlzTGFzdCkgIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0
Jyk7IH0KKyAgICBAbWV0aG9kIHByb3BlcnR5V2lsbENoYW5nZQorICAgIEBwYXJhbSB7U3RyaW5n
fSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0byBjaGFuZ2UuCisgICAg
QHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgKi8KKyAgcHJvcGVydHlXaWxsQ2hhbmdlOiBm
dW5jdGlvbihrZXlOYW1lKSB7CisgICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtl
eU5hbWUpOworICAgIHJldHVybiB0aGlzOworICB9LAogCi0gICAgICAvLyBzd2FwIGl0ZW1zIC0g
YmFzaWNhbGx5IG1vdmUgdGhlIGl0ZW0gdG8gdGhlIGVuZCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAot
ICAgICAgaWYgKGlkeCA8IGxlbi0xKSB7Ci0gICAgICAgIGxhc3QgPSB0aGlzW2xlbi0xXTsKLSAg
ICAgICAgdGhpc1tpZHhdID0gbGFzdDsKLSAgICAgICAgdGhpc1tndWlkRm9yKGxhc3QpXSA9IGlk
eDsKLSAgICAgIH0KKyAgLyoqCisgICAgTm90aWZ5IHRoZSBvYnNlcnZlciBzeXN0ZW0gdGhhdCBh
IHByb3BlcnR5IGhhcyBqdXN0IGNoYW5nZWQuCiAKLSAgICAgIGRlbGV0ZSB0aGlzW2d1aWRdOwot
ICAgICAgZGVsZXRlIHRoaXNbbGVuLTFdOwotICAgICAgc2V0KHRoaXMsICdsZW5ndGgnLCBsZW4t
MSk7CisgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBhIHZhbHVlIGRpcmVjdGx5IG9y
IGluZGlyZWN0bHkgd2l0aG91dAorICAgIGFjdHVhbGx5IGNhbGxpbmcgYGdldCgpYCBvciBgc2V0
KClgIG9uIGl0LiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdXNlIHRoaXMKKyAgICBtZXRob2QgYW5k
IGBwcm9wZXJ0eVdpbGxDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28gbWV0aG9k
cworICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVy
dHkgaGFzIHBvdGVudGlhbGx5CisgICAgY2hhbmdlZCB2YWx1ZS4KIAotICAgICAgaWYgKGlzRmly
c3QpIHsgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7IH0KLSAg
ICAgIGlmIChpc0xhc3QpICB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2Jq
ZWN0Jyk7IH0KLSAgICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlZCwg
bnVsbCk7Ci0gICAgfQorICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJvcGVy
dHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAorICAgIGFzIGEgcGFpci4gSWYg
eW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBvdXQgb2YK
KyAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQgbW9yZSBv
ZnRlbiB0aGFuIHlvdSB3b3VsZAorICAgIGxpa2UuCiAKKyAgICBAbWV0aG9kIHByb3BlcnR5RGlk
Q2hhbmdlCisgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0aGF0
IGhhcyBqdXN0IGNoYW5nZWQuCisgICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgKi8K
KyAgcHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICBFbWJlci5wcm9w
ZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKICAgICByZXR1cm4gdGhpczsKICAgfSwKIAot
ICAvLyBvcHRpbWl6ZWQgdmVyc2lvbgotICBjb250YWluczogZnVuY3Rpb24ob2JqKSB7Ci0gICAg
cmV0dXJuIHRoaXNbZ3VpZEZvcihvYmopXT49MDsKLSAgfSwKKyAgLyoqCisgICAgQ29udmVuaWVu
Y2UgbWV0aG9kIHRvIGNhbGwgYHByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBwcm9wZXJ0eURpZENo
YW5nZWAgaW4KKyAgICBzdWNjZXNzaW9uLgogCi0gIGNvcHk6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBDID0gdGhpcy5jb25zdHJ1Y3RvciwgcmV0ID0gbmV3IEMoKSwgbG9jID0gZ2V0KHRoaXMsICds
ZW5ndGgnKTsKLSAgICBzZXQocmV0LCAnbGVuZ3RoJywgbG9jKTsKLSAgICB3aGlsZSgtLWxvYz49
MCkgewotICAgICAgcmV0W2xvY10gPSB0aGlzW2xvY107Ci0gICAgICByZXRbZ3VpZEZvcih0aGlz
W2xvY10pXSA9IGxvYzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICBAbWV0aG9kIG5vdGlm
eVByb3BlcnR5Q2hhbmdlCisgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5
IGtleSB0byBiZSBub3RpZmllZCBhYm91dC4KKyAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxl
fQorICAqLworICBub3RpZnlQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24oa2V5TmFtZSkgeworICAg
IHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGtleU5hbWUpOworICAgIHRoaXMucHJvcGVydHlEaWRD
aGFuZ2Uoa2V5TmFtZSk7CisgICAgcmV0dXJuIHRoaXM7CiAgIH0sCiAKLSAgdG9TdHJpbmc6IGZ1
bmN0aW9uKCkgewotICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCwgaWR4LCBhcnJheSA9IFtdOwot
ICAgIGZvcihpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgICBhcnJheVtpZHhdID0g
dGhpc1tpZHhdOwotICAgIH0KLSAgICByZXR1cm4gIkVtYmVyLlNldDwlQD4iLmZtdChhcnJheS5q
b2luKCcsJykpOwotICB9CisgIGFkZEJlZm9yZU9ic2VydmVyOiBmdW5jdGlvbihrZXksIHRhcmdl
dCwgbWV0aG9kKSB7CisgICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcywga2V5LCB0YXJn
ZXQsIG1ldGhvZCk7CisgIH0sCiAKLX0pOworICAvKioKKyAgICBBZGRzIGFuIG9ic2VydmVyIG9u
IGEgcHJvcGVydHkuCiAKLX0pKCk7CisgICAgVGhpcyBpcyB0aGUgY29yZSBtZXRob2QgdXNlZCB0
byByZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBwcm9wZXJ0eS4KIAorICAgIE9uY2UgeW91IGNh
bGwgdGhpcyBtZXRob2QsIGFueSB0aW1lIHRoZSBrZXkncyB2YWx1ZSBpcyBzZXQsIHlvdXIgb2Jz
ZXJ2ZXIKKyAgICB3aWxsIGJlIG5vdGlmaWVkLiBOb3RlIHRoYXQgdGhlIG9ic2VydmVycyBhcmUg
dHJpZ2dlcmVkIGFueSB0aW1lIHRoZQorICAgIHZhbHVlIGlzIHNldCwgcmVnYXJkbGVzcyBvZiB3
aGV0aGVyIGl0IGhhcyBhY3R1YWxseSBjaGFuZ2VkLiBZb3VyCisgICAgb2JzZXJ2ZXIgc2hvdWxk
IGJlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGF0LgogCisgICAgWW91IGNhbiBhbHNvIHBhc3MgYW4g
b3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgdG8gdGhpcyBtZXRob2QuIFRoZQorICAgIGNvbnRl
eHQgd2lsbCBiZSBwYXNzZWQgdG8geW91ciBvYnNlcnZlciBtZXRob2Qgd2hlbmV2ZXIgaXQgaXMg
dHJpZ2dlcmVkLgorICAgIE5vdGUgdGhhdCBpZiB5b3UgYWRkIHRoZSBzYW1lIHRhcmdldC9tZXRo
b2QgcGFpciBvbiBhIGtleSBtdWx0aXBsZSB0aW1lcworICAgIHdpdGggZGlmZmVyZW50IGNvbnRl
eHQgcGFyYW1ldGVycywgeW91ciBvYnNlcnZlciB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UKKyAg
ICB3aXRoIHRoZSBsYXN0IGNvbnRleHQgeW91IHBhc3NlZC4KIAotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCisgICAgIyMjIE9i
c2VydmVyIE1ldGhvZHMKIAotLyoqCi0gIGBFbWJlci5PYmplY3RgIGlzIHRoZSBtYWluIGJhc2Ug
Y2xhc3MgZm9yIGFsbCBFbWJlciBvYmplY3RzLiBJdCBpcyBhIHN1YmNsYXNzCi0gIG9mIGBFbWJl
ci5Db3JlT2JqZWN0YCB3aXRoIHRoZSBgRW1iZXIuT2JzZXJ2YWJsZWAgbWl4aW4gYXBwbGllZC4g
Rm9yIGRldGFpbHMsCi0gIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBvZiB0aGVzZS4K
KyAgICBPYnNlcnZlciBtZXRob2RzIHlvdSBwYXNzIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSB0aGUg
Zm9sbG93aW5nIHNpZ25hdHVyZSBpZgorICAgIHlvdSBkbyBub3QgcGFzcyBhIGBjb250ZXh0YCBw
YXJhbWV0ZXI6CiAKLSAgQGNsYXNzIE9iamVjdAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRl
bmRzIEVtYmVyLkNvcmVPYmplY3QKLSAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQotKi8KLUVtYmVy
Lk9iamVjdCA9IEVtYmVyLkNvcmVPYmplY3QuZXh0ZW5kKEVtYmVyLk9ic2VydmFibGUpOwotRW1i
ZXIuT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuT2JqZWN0Ijsg
fTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIs
IGtleSwgdmFsdWUsIHJldikgeyB9OworICAgIGBgYAogCi19KSgpOworICAgIFRoZSBzZW5kZXIg
aXMgdGhlIG9iamVjdCB0aGF0IGNoYW5nZWQuIFRoZSBrZXkgaXMgdGhlIHByb3BlcnR5IHRoYXQK
KyAgICBjaGFuZ2VzLiBUaGUgdmFsdWUgcHJvcGVydHkgaXMgY3VycmVudGx5IHJlc2VydmVkIGFu
ZCB1bnVzZWQuIFRoZSByZXYKKyAgICBpcyB0aGUgbGFzdCBwcm9wZXJ0eSByZXZpc2lvbiBvZiB0
aGUgb2JqZWN0IHdoZW4gaXQgY2hhbmdlZCwgd2hpY2ggeW91IGNhbgorICAgIHVzZSB0byBkZXRl
Y3QgaWYgdGhlIGtleSB2YWx1ZSBoYXMgcmVhbGx5IGNoYW5nZWQgb3Igbm90LgogCisgICAgSWYg
eW91IHBhc3MgYSBgY29udGV4dGAgcGFyYW1ldGVyLCB0aGUgY29udGV4dCB3aWxsIGJlIHBhc3Nl
ZCBiZWZvcmUgdGhlCisgICAgcmV2aXNpb24gbGlrZSBzbzoKIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBmb29EaWRDaGFuZ2U6IGZ1bmN0aW9uKHNlbmRlciwga2V5LCB2YWx1ZSwgY29udGV4dCwg
cmV2KSB7IH07CisgICAgYGBgCiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLworICAgIFVzdWFsbHkgeW91IHdpbGwgbm90IG5l
ZWQgdGhlIHZhbHVlLCBjb250ZXh0IG9yIHJldmlzaW9uIHBhcmFtZXRlcnMgYXQKKyAgICB0aGUg
ZW5kLiBJbiB0aGlzIGNhc2UsIGl0IGlzIGNvbW1vbiB0byB3cml0ZSBvYnNlcnZlciBtZXRob2Rz
IHRoYXQgdGFrZQorICAgIG9ubHkgYSBzZW5kZXIgYW5kIGtleSB2YWx1ZSBhcyBwYXJhbWV0ZXJz
IG9yLCBpZiB5b3UgYXJlbid0IGludGVyZXN0ZWQgaW4KKyAgICBhbnkgb2YgdGhlc2UgdmFsdWVz
LCB0byB3cml0ZSBhbiBvYnNlcnZlciB0aGF0IGhhcyBubyBwYXJhbWV0ZXJzIGF0IGFsbC4KIAot
dmFyIGdldCA9IEVtYmVyLmdldCwgaW5kZXhPZiA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmluZGV4
T2Y7CisgICAgQG1ldGhvZCBhZGRPYnNlcnZlcgorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhl
IGtleSB0byBvYnNlcnZlcgorICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBv
YmplY3QgdG8gaW52b2tlCisgICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUg
bWV0aG9kIHRvIGludm9rZS4KKyAgICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHNlbGYKKyAgKi8K
KyAgYWRkT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICBFbWJl
ci5hZGRPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdldCwgbWV0aG9kKTsKKyAgfSwKIAotLyoqCi0g
IEEgTmFtZXNwYWNlIGlzIGFuIG9iamVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFpbiBvdGhlciBv
YmplY3RzIG9yIG1ldGhvZHMKLSAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFtZXdvcmsu
IENyZWF0ZSBhIG5hbWVzcGFjZSBhbnl0aW1lIHlvdSB3YW50Ci0gIHRvIGRlZmluZSBvbmUgb2Yg
dGhlc2UgbmV3IGNvbnRhaW5lcnMuCisgIC8qKgorICAgIFJlbW92ZSBhbiBvYnNlcnZlciB5b3Ug
aGF2ZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gdGhpcyBvYmplY3QuIFBhc3MKKyAgICB0aGUg
c2FtZSBrZXksIHRhcmdldCwgYW5kIG1ldGhvZCB5b3UgcGFzc2VkIHRvIGBhZGRPYnNlcnZlcigp
YCBhbmQgeW91cgorICAgIHRhcmdldCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIG5vdGlmaWNhdGlv
bnMuCiAKLSAgIyBFeGFtcGxlIFVzYWdlCisgICAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgorICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgorICAgIEBwYXJhbSB7T2Jq
ZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCisgICAgQHBhcmFtIHtTdHJp
bmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICBAcmV0dXJuIHtF
bWJlci5PYnNlcnZhYmxlfSByZWNlaXZlcgorICAqLworICByZW1vdmVPYnNlcnZlcjogZnVuY3Rp
b24oa2V5LCB0YXJnZXQsIG1ldGhvZCkgeworICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMs
IGtleSwgdGFyZ2V0LCBtZXRob2QpOworICB9LAogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlGcmFt
ZXdvcmsgPSBFbWJlci5OYW1lc3BhY2UuY3JlYXRlKHsKLSAgICBWRVJTSU9OOiAnMS4wLjAnCi0g
IH0pOwotICBgYGAKLQotICBAY2xhc3MgTmFtZXNwYWNlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAg
QGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotdmFyIE5hbWVzcGFjZSA9IEVtYmVyLk5hbWVzcGFj
ZSA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBpc05hbWVzcGFjZTogdHJ1ZSwKKyAgLyoqCisg
ICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBjdXJyZW50bHkgaGFzIG9ic2VydmVycyBy
ZWdpc3RlcmVkIGZvciBhCisgICAgcGFydGljdWxhciBrZXkuIFlvdSBjYW4gdXNlIHRoaXMgbWV0
aG9kIHRvIHBvdGVudGlhbGx5IGRlZmVyIHBlcmZvcm1pbmcKKyAgICBhbiBleHBlbnNpdmUgYWN0
aW9uIHVudGlsIHNvbWVvbmUgYmVnaW5zIG9ic2VydmluZyBhIHBhcnRpY3VsYXIgcHJvcGVydHkK
KyAgICBvbiB0aGUgb2JqZWN0LgogCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLk5h
bWVzcGFjZS5OQU1FU1BBQ0VTLnB1c2godGhpcyk7Ci0gICAgRW1iZXIuTmFtZXNwYWNlLlBST0NF
U1NFRCA9IGZhbHNlOworICAgIEBtZXRob2QgaGFzT2JzZXJ2ZXJGb3IKKyAgICBAcGFyYW0ge1N0
cmluZ30ga2V5IEtleSB0byBjaGVjaworICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICovCisgIGhh
c09ic2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsKKyAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVu
ZXJzKHRoaXMsIGtleSsnOmNoYW5nZScpOwogICB9LAogCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOwotICAgIGlmIChuYW1lKSB7IHJl
dHVybiBuYW1lOyB9CisgIC8qKgorICAgIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0
eSwgb3IgYSBkZWZhdWx0IHZhbHVlIGluIHRoZSBjYXNlIHRoYXQgdGhlCisgICAgcHJvcGVydHkg
cmV0dXJucyBgdW5kZWZpbmVkYC4KIAotICAgIGZpbmROYW1lc3BhY2VzKCk7Ci0gICAgcmV0dXJu
IHRoaXNbRW1iZXIuR1VJRF9LRVkrJ19uYW1lJ107Ci0gIH0sCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHBlcnNvbi5nZXRXaXRoRGVmYXVsdCgnbGFzdE5hbWUnLCAnRG9lJyk7CisgICAgYGBgCiAK
LSAgbmFtZUNsYXNzZXM6IGZ1bmN0aW9uKCkgewotICAgIHByb2Nlc3NOYW1lc3BhY2UoW3RoaXMu
dG9TdHJpbmcoKV0sIHRoaXMsIHt9KTsKKyAgICBAbWV0aG9kIGdldFdpdGhEZWZhdWx0CisgICAg
QHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJp
ZXZlCisgICAgQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJu
IGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmRlZmluZWQKKyAgICBAcmV0dXJuIHtPYmplY3R9
IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB0aGUgZGVmYXVsdFZhbHVlLgorICAqLworICBnZXRXaXRo
RGVmYXVsdDogZnVuY3Rpb24oa2V5TmFtZSwgZGVmYXVsdFZhbHVlKSB7CisgICAgcmV0dXJuIEVt
YmVyLmdldFdpdGhEZWZhdWx0KHRoaXMsIGtleU5hbWUsIGRlZmF1bHRWYWx1ZSk7CiAgIH0sCiAK
LSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBFbWJlci5OYW1l
c3BhY2UuTkFNRVNQQUNFUzsKLSAgICBFbWJlci5sb29rdXBbdGhpcy50b1N0cmluZygpXSA9IHVu
ZGVmaW5lZDsKLSAgICBuYW1lc3BhY2VzLnNwbGljZShpbmRleE9mLmNhbGwobmFtZXNwYWNlcywg
dGhpcyksIDEpOwotICAgIHRoaXMuX3N1cGVyKCk7Ci0gIH0KLX0pOworICAvKioKKyAgICBTZXQg
dGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcGx1cyBzb21lIGFt
b3VudC4KIAotTmFtZXNwYWNlLnJlb3BlbkNsYXNzKHsKLSAgTkFNRVNQQUNFUzogW0VtYmVyXSwK
LSAgTkFNRVNQQUNFU19CWV9JRDoge30sCi0gIFBST0NFU1NFRDogZmFsc2UsCi0gIHByb2Nlc3NB
bGw6IHByb2Nlc3NBbGxOYW1lc3BhY2VzLAotICBieU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHsKLSAg
ICBpZiAoIUVtYmVyLkJPT1RFRCkgewotICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKLSAg
ICB9CisgICAgYGBgamF2YXNjcmlwdAorICAgIHBlcnNvbi5pbmNyZW1lbnRQcm9wZXJ0eSgnYWdl
Jyk7CisgICAgdGVhbS5pbmNyZW1lbnRQcm9wZXJ0eSgnc2NvcmUnLCAyKTsKKyAgICBgYGAKIAot
ICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lEW25hbWVdOwotICB9Ci19KTsKKyAgICBAbWV0aG9k
IGluY3JlbWVudFByb3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUg
b2YgdGhlIHByb3BlcnR5IHRvIGluY3JlbWVudAorICAgIEBwYXJhbSB7TnVtYmVyfSBpbmNyZW1l
bnQgVGhlIGFtb3VudCB0byBpbmNyZW1lbnQgYnkuIERlZmF1bHRzIHRvIDEKKyAgICBAcmV0dXJu
IHtOdW1iZXJ9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKKyAgKi8KKyAgaW5jcmVtZW50UHJvcGVy
dHk6IGZ1bmN0aW9uKGtleU5hbWUsIGluY3JlbWVudCkgeworICAgIGlmIChFbWJlci5pc05vbmUo
aW5jcmVtZW50KSkgeyBpbmNyZW1lbnQgPSAxOyB9CisgICAgRW1iZXIuYXNzZXJ0KCJNdXN0IHBh
c3MgYSBudW1lcmljIHZhbHVlIHRvIGluY3JlbWVudFByb3BlcnR5IiwgKCFpc05hTihwYXJzZUZs
b2F0KGluY3JlbWVudCkpICYmIGlzRmluaXRlKGluY3JlbWVudCkpKTsKKyAgICBzZXQodGhpcywg
a2V5TmFtZSwgKGdldCh0aGlzLCBrZXlOYW1lKSB8fCAwKSArIGluY3JlbWVudCk7CisgICAgcmV0
dXJuIGdldCh0aGlzLCBrZXlOYW1lKTsKKyAgfSwKIAotdmFyIE5BTUVTUEFDRVNfQllfSUQgPSBO
YW1lc3BhY2UuTkFNRVNQQUNFU19CWV9JRDsKKyAgLyoqCisgICAgU2V0IHRoZSB2YWx1ZSBvZiBh
IHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIHNvbWUgYW1vdW50LgogCi12YXIg
aGFzT3duUHJvcCA9ICh7fSkuaGFzT3duUHJvcGVydHksCi0gICAgZ3VpZEZvciA9IEVtYmVyLmd1
aWRGb3I7CisgICAgYGBgamF2YXNjcmlwdAorICAgIHBsYXllci5kZWNyZW1lbnRQcm9wZXJ0eSgn
bGl2ZXMnKTsKKyAgICBvcmMuZGVjcmVtZW50UHJvcGVydHkoJ2hlYWx0aCcsIDUpOworICAgIGBg
YAogCi1mdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCByb290LCBzZWVuKSB7Ci0gIHZh
ciBpZHggPSBwYXRocy5sZW5ndGg7CisgICAgQG1ldGhvZCBkZWNyZW1lbnRQcm9wZXJ0eQorICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWNy
ZW1lbnQKKyAgICBAcGFyYW0ge051bWJlcn0gZGVjcmVtZW50IFRoZSBhbW91bnQgdG8gZGVjcmVt
ZW50IGJ5LiBEZWZhdWx0cyB0byAxCisgICAgQHJldHVybiB7TnVtYmVyfSBUaGUgbmV3IHByb3Bl
cnR5IHZhbHVlCisgICovCisgIGRlY3JlbWVudFByb3BlcnR5OiBmdW5jdGlvbihrZXlOYW1lLCBk
ZWNyZW1lbnQpIHsKKyAgICBpZiAoRW1iZXIuaXNOb25lKGRlY3JlbWVudCkpIHsgZGVjcmVtZW50
ID0gMTsgfQorICAgIEVtYmVyLmFzc2VydCgiTXVzdCBwYXNzIGEgbnVtZXJpYyB2YWx1ZSB0byBk
ZWNyZW1lbnRQcm9wZXJ0eSIsICghaXNOYU4ocGFyc2VGbG9hdChkZWNyZW1lbnQpKSAmJiBpc0Zp
bml0ZShkZWNyZW1lbnQpKSk7CisgICAgc2V0KHRoaXMsIGtleU5hbWUsIChnZXQodGhpcywga2V5
TmFtZSkgfHwgMCkgLSBkZWNyZW1lbnQpOworICAgIHJldHVybiBnZXQodGhpcywga2V5TmFtZSk7
CisgIH0sCiAKLSAgTkFNRVNQQUNFU19CWV9JRFtwYXRocy5qb2luKCcuJyldID0gcm9vdDsKKyAg
LyoqCisgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gcHJvcGVydHkgdG8gdGhlIG9wcG9z
aXRlIG9mIGl0J3MKKyAgICBjdXJyZW50IHZhbHVlLgogCi0gIC8vIExvb3Agb3ZlciBhbGwgb2Yg
dGhlIGtleXMgaW4gdGhlIG5hbWVzcGFjZSwgbG9va2luZyBmb3IgY2xhc3NlcwotICBmb3IodmFy
IGtleSBpbiByb290KSB7Ci0gICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwocm9vdCwga2V5KSkgeyBj
b250aW51ZTsgfQotICAgIHZhciBvYmogPSByb290W2tleV07CisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHN0YXJzaGlwLnRvZ2dsZVByb3BlcnR5KCd3YXJwRHJpdmVFbmdhZ2VkJyk7CisgICAgYGBg
CiAKLSAgICAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgYEVtYmVyYCBuYW1lc3BhY2UsIGZv
ciBleGFtcGxlLCB0aGUKLSAgICAvLyBgcGF0aHNgIHdpbGwgc3RhcnQgd2l0aCBgWyJFbWJlciJd
YC4gRXZlcnkgaXRlcmF0aW9uIHRocm91Z2gKLSAgICAvLyB0aGUgbG9vcCB3aWxsIHVwZGF0ZSB0
aGUgKipzZWNvbmQqKiBlbGVtZW50IG9mIHRoaXMgbGlzdCB3aXRoCi0gICAgLy8gdGhlIGtleSwg
c28gcHJvY2Vzc2luZyBgRW1iZXIuVmlld2Agd2lsbCBtYWtlIHRoZSBBcnJheQotICAgIC8vIGBb
J0VtYmVyJywgJ1ZpZXcnXWAuCi0gICAgcGF0aHNbaWR4XSA9IGtleTsKKyAgICBAbWV0aG9kIHRv
Z2dsZVByb3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhl
IHByb3BlcnR5IHRvIHRvZ2dsZQorICAgIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBwcm9wZXJ0
eSB2YWx1ZQorICAqLworICB0b2dnbGVQcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSkgeworICAg
IHNldCh0aGlzLCBrZXlOYW1lLCAhZ2V0KHRoaXMsIGtleU5hbWUpKTsKKyAgICByZXR1cm4gZ2V0
KHRoaXMsIGtleU5hbWUpOworICB9LAogCi0gICAgLy8gSWYgd2UgaGF2ZSBmb3VuZCBhbiB1bnBy
b2Nlc3NlZCBjbGFzcwotICAgIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nID09PSBjbGFzc1RvU3Ry
aW5nKSB7Ci0gICAgICAvLyBSZXBsYWNlIHRoZSBjbGFzcycgYHRvU3RyaW5nYCB3aXRoIHRoZSBk
b3Qtc2VwYXJhdGVkIHBhdGgKLSAgICAgIC8vIGFuZCBzZXQgaXRzIGBOQU1FX0tFWWAKLSAgICAg
IG9iai50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhwYXRocy5qb2luKCcuJykpOwotICAgICAgb2Jq
W05BTUVfS0VZXSA9IHBhdGhzLmpvaW4oJy4nKTsKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgY2Fj
aGVkIHZhbHVlIG9mIGEgY29tcHV0ZWQgcHJvcGVydHksIGlmIGl0IGV4aXN0cy4KKyAgICBUaGlz
IGFsbG93cyB5b3UgdG8gaW5zcGVjdCB0aGUgdmFsdWUgb2YgYSBjb21wdXRlZCBwcm9wZXJ0eQor
ICAgIHdpdGhvdXQgYWNjaWRlbnRhbGx5IGludm9raW5nIGl0IGlmIGl0IGlzIGludGVuZGVkIHRv
IGJlCisgICAgZ2VuZXJhdGVkIGxhemlseS4KIAotICAgIC8vIFN1cHBvcnQgbmVzdGVkIG5hbWVz
cGFjZXMKLSAgICB9IGVsc2UgaWYgKG9iaiAmJiBvYmouaXNOYW1lc3BhY2UpIHsKLSAgICAgIC8v
IFNraXAgYWxpYXNlZCBuYW1lc3BhY2VzCi0gICAgICBpZiAoc2VlbltndWlkRm9yKG9iaildKSB7
IGNvbnRpbnVlOyB9Ci0gICAgICBzZWVuW2d1aWRGb3Iob2JqKV0gPSB0cnVlOworICAgIEBtZXRo
b2QgY2FjaGVGb3IKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZQorICAgIEByZXR1cm4ge09i
amVjdH0gVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHksIGlmIGFueQor
ICAqLworICBjYWNoZUZvcjogZnVuY3Rpb24oa2V5TmFtZSkgeworICAgIHJldHVybiBFbWJlci5j
YWNoZUZvcih0aGlzLCBrZXlOYW1lKTsKKyAgfSwKIAotICAgICAgLy8gUHJvY2VzcyB0aGUgY2hp
bGQgbmFtZXNwYWNlCi0gICAgICBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCBvYmosIHNlZW4pOwot
ICAgIH0KKyAgLy8gaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICBvYnNlcnZlcnNG
b3JLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICByZXR1cm4gRW1iZXIub2JzZXJ2ZXJzRm9y
KHRoaXMsIGtleU5hbWUpOwogICB9Cit9KTsKIAotICBwYXRocy5sZW5ndGggPSBpZHg7IC8vIGN1
dCBvdXQgbGFzdCBpdGVtCi19Cit9KSgpOwogCi1mdW5jdGlvbiBmaW5kTmFtZXNwYWNlcygpIHsK
LSAgdmFyIE5hbWVzcGFjZSA9IEVtYmVyLk5hbWVzcGFjZSwgbG9va3VwID0gRW1iZXIubG9va3Vw
LCBvYmosIGlzTmFtZXNwYWNlOwogCi0gIGlmIChOYW1lc3BhY2UuUFJPQ0VTU0VEKSB7IHJldHVy
bjsgfQogCi0gIGZvciAodmFyIHByb3AgaW4gbG9va3VwKSB7Ci0gICAgLy8gVGhlc2UgZG9uJ3Qg
cmFpc2UgZXhjZXB0aW9ucyBidXQgY2FuIGNhdXNlIHdhcm5pbmdzCi0gICAgaWYgKHByb3AgPT09
ICJwYXJlbnQiIHx8IHByb3AgPT09ICJ0b3AiIHx8IHByb3AgPT09ICJmcmFtZUVsZW1lbnQiKSB7
IGNvbnRpbnVlOyB9CisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCiAKLSAgICAvLyAgZ2V0KHdpbmRvdy5nbG9iYWxTdG9y
YWdlLCAnaXNOYW1lc3BhY2UnKSB3b3VsZCB0cnkgdG8gcmVhZCB0aGUgc3RvcmFnZSBmb3IgZG9t
YWluIGlzTmFtZXNwYWNlIGFuZCBjYXVzZSBleGNlcHRpb24gaW4gRmlyZWZveC4KLSAgICAvLyBn
bG9iYWxTdG9yYWdlIGlzIGEgc3RvcmFnZSBvYnNvbGV0ZWQgYnkgdGhlIFdoYXRXRyBzdG9yYWdl
IHNwZWNpZmljYXRpb24uIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00v
U3RvcmFnZSNnbG9iYWxTdG9yYWdlCi0gICAgaWYgKHByb3AgPT09ICJnbG9iYWxTdG9yYWdlIiAm
JiBsb29rdXAuU3RvcmFnZUxpc3QgJiYgbG9va3VwLmdsb2JhbFN0b3JhZ2UgaW5zdGFuY2VvZiBs
b29rdXAuU3RvcmFnZUxpc3QpIHsgY29udGludWU7IH0KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBz
b21lIHZlcnNpb25zIG9mIElFIGRvbid0IHN1cHBvcnQgd2luZG93Lmhhc093blByb3BlcnR5Ci0g
ICAgaWYgKGxvb2t1cC5oYXNPd25Qcm9wZXJ0eSAmJiAhbG9va3VwLmhhc093blByb3BlcnR5KHBy
b3ApKSB7IGNvbnRpbnVlOyB9CiAKLSAgICAvLyBBdCB0aW1lcyB3ZSBhcmUgbm90IGFsbG93ZWQg
dG8gYWNjZXNzIGNlcnRhaW4gcHJvcGVydGllcyBmb3Igc2VjdXJpdHkgcmVhc29ucy4KLSAgICAv
LyBUaGVyZSBhcmUgYWxzbyB0aW1lcyB3aGVyZSBldmVuIGlmIHdlIGNhbiBhY2Nlc3MgdGhlbSwg
d2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGVpciBwcm9wZXJ0aWVzLgotICAgIHRyeSB7
Ci0gICAgICBvYmogPSBFbWJlci5sb29rdXBbcHJvcF07Ci0gICAgICBpc05hbWVzcGFjZSA9IG9i
aiAmJiBvYmouaXNOYW1lc3BhY2U7Ci0gICAgfSBjYXRjaCAoZSkgewotICAgICAgY29udGludWU7
Ci0gICAgfQorLy8gTk9URTogdGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIGJlIGluY2x1ZGVkIGRp
cmVjdGx5LiBJbnN0ZWFkIHVzZSBgRW1iZXIuT2JqZWN0YC4KKy8vIFdlIG9ubHkgZGVmaW5lIHRo
aXMgc2VwYXJhdGVseSBzbyB0aGF0IGBFbWJlci5TZXRgIGNhbiBkZXBlbmQgb24gaXQuCiAKLSAg
ICBpZiAoaXNOYW1lc3BhY2UpIHsKLSAgICAgIEVtYmVyLmRlcHJlY2F0ZSgiTmFtZXNwYWNlcyBz
aG91bGQgbm90IGJlZ2luIHdpdGggbG93ZXJjYXNlLiIsIC9eW0EtWl0vLnRlc3QocHJvcCkpOwot
ICAgICAgb2JqW05BTUVfS0VZXSA9IHByb3A7Ci0gICAgfQotICB9Ci19CiAKLXZhciBOQU1FX0tF
WSA9IEVtYmVyLk5BTUVfS0VZID0gRW1iZXIuR1VJRF9LRVkgKyAnX25hbWUnOwordmFyIHNldCA9
IEVtYmVyLnNldCwgZ2V0ID0gRW1iZXIuZ2V0LAorICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRl
LAorICAgIG9fZGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwK
KyAgICBHVUlEX0tFWSA9IEVtYmVyLkdVSURfS0VZLAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlk
Rm9yLAorICAgIGdlbmVyYXRlR3VpZCA9IEVtYmVyLmdlbmVyYXRlR3VpZCwKKyAgICBtZXRhID0g
RW1iZXIubWV0YSwKKyAgICByZXdhdGNoID0gRW1iZXIucmV3YXRjaCwKKyAgICBmaW5pc2hDaGFp
bnMgPSBFbWJlci5maW5pc2hDaGFpbnMsCisgICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50
LAorICAgIGRlc3Ryb3kgPSBFbWJlci5kZXN0cm95LAorICAgIHNjaGVkdWxlID0gRW1iZXIucnVu
LnNjaGVkdWxlLAorICAgIE1peGluID0gRW1iZXIuTWl4aW4sCisgICAgYXBwbHlNaXhpbiA9IE1p
eGluLl9hcHBseSwKKyAgICBmaW5pc2hQYXJ0aWFsID0gTWl4aW4uZmluaXNoUGFydGlhbCwKKyAg
ICByZW9wZW4gPSBNaXhpbi5wcm90b3R5cGUucmVvcGVuLAorICAgIE1BTkRBVE9SWV9TRVRURVIg
PSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUiwKKyAgICBpbmRleE9mID0gRW1iZXIuRW51bWVy
YWJsZVV0aWxzLmluZGV4T2Y7CiAKLWZ1bmN0aW9uIHN1cGVyQ2xhc3NTdHJpbmcobWl4aW4pIHsK
LSAgdmFyIHN1cGVyY2xhc3MgPSBtaXhpbi5zdXBlcmNsYXNzOwotICBpZiAoc3VwZXJjbGFzcykg
ewotICAgIGlmIChzdXBlcmNsYXNzW05BTUVfS0VZXSkgeyByZXR1cm4gc3VwZXJjbGFzc1tOQU1F
X0tFWV07IH0KLSAgICBlbHNlIHsgcmV0dXJuIHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7
IH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLX0KK3ZhciB1bmRlZmluZWREZXNjcmlw
dG9yID0geworICBjb25maWd1cmFibGU6IHRydWUsCisgIHdyaXRhYmxlOiB0cnVlLAorICBlbnVt
ZXJhYmxlOiBmYWxzZSwKKyAgdmFsdWU6IHVuZGVmaW5lZAorfTsKIAotZnVuY3Rpb24gY2xhc3NU
b1N0cmluZygpIHsKLSAgaWYgKCFFbWJlci5CT09URUQgJiYgIXRoaXNbTkFNRV9LRVldKSB7Ci0g
ICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKLSAgfQorZnVuY3Rpb24gbWFrZUN0b3IoKSB7CiAK
LSAgdmFyIHJldDsKKyAgLy8gTm90ZTogYXZvaWQgYWNjZXNzaW5nIGFueSBwcm9wZXJ0aWVzIG9u
IHRoZSBvYmplY3Qgc2luY2UgaXQgbWFrZXMgdGhlCisgIC8vIG1ldGhvZCBhIGxvdCBmYXN0ZXIu
IFRoaXMgaXMgZ2x1ZSBjb2RlIHNvIHdlIHdhbnQgaXQgdG8gYmUgYXMgZmFzdCBhcworICAvLyBw
b3NzaWJsZS4KIAotICBpZiAodGhpc1tOQU1FX0tFWV0pIHsKLSAgICByZXQgPSB0aGlzW05BTUVf
S0VZXTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgc3RyID0gc3VwZXJDbGFzc1N0cmluZyh0aGlzKTsK
LSAgICBpZiAoc3RyKSB7Ci0gICAgICByZXQgPSAiKHN1YmNsYXNzIG9mICIgKyBzdHIgKyAiKSI7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldCA9ICIodW5rbm93biBtaXhpbikiOwotICAgIH0KLSAg
ICB0aGlzLnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7Ci0gIH0KKyAgdmFyIHdhc0FwcGxp
ZWQgPSBmYWxzZSwgaW5pdE1peGlucywgaW5pdFByb3BlcnRpZXM7CiAKLSAgcmV0dXJuIHJldDsK
LX0KKyAgdmFyIENsYXNzID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCF3YXNBcHBsaWVkKSB7Cisg
ICAgICBDbGFzcy5wcm90bygpOyAvLyBwcmVwYXJlIHByb3RvdHlwZS4uLgorICAgIH0KKyAgICBv
X2RlZmluZVByb3BlcnR5KHRoaXMsIEdVSURfS0VZLCB1bmRlZmluZWREZXNjcmlwdG9yKTsKKyAg
ICBvX2RlZmluZVByb3BlcnR5KHRoaXMsICdfc3VwZXInLCB1bmRlZmluZWREZXNjcmlwdG9yKTsK
KyAgICB2YXIgbSA9IG1ldGEodGhpcyksIHByb3RvID0gbS5wcm90bzsKKyAgICBtLnByb3RvID0g
dGhpczsKKyAgICBpZiAoaW5pdE1peGlucykgeworICAgICAgLy8gY2FwdHVyZSBsb2NhbGx5IHNv
IHdlIGNhbiBjbGVhciB0aGUgY2xvc2VkIG92ZXIgdmFyaWFibGUKKyAgICAgIHZhciBtaXhpbnMg
PSBpbml0TWl4aW5zOworICAgICAgaW5pdE1peGlucyA9IG51bGw7CisgICAgICB0aGlzLnJlb3Bl
bi5hcHBseSh0aGlzLCBtaXhpbnMpOworICAgIH0KKyAgICBpZiAoaW5pdFByb3BlcnRpZXMpIHsK
KyAgICAgIC8vIGNhcHR1cmUgbG9jYWxseSBzbyB3ZSBjYW4gY2xlYXIgdGhlIGNsb3NlZCBvdmVy
IHZhcmlhYmxlCisgICAgICB2YXIgcHJvcHMgPSBpbml0UHJvcGVydGllczsKKyAgICAgIGluaXRQ
cm9wZXJ0aWVzID0gbnVsbDsKIAotZnVuY3Rpb24gcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKSB7Ci0g
IHZhciB1bnByb2Nlc3NlZE5hbWVzcGFjZXMgPSAhTmFtZXNwYWNlLlBST0NFU1NFRCwKLSAgICAg
IHVucHJvY2Vzc2VkTWl4aW5zID0gRW1iZXIuYW55VW5wcm9jZXNzZWRNaXhpbnM7CisgICAgICB2
YXIgY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllczsK
IAotICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzKSB7Ci0gICAgZmluZE5hbWVzcGFjZXMoKTsK
LSAgICBOYW1lc3BhY2UuUFJPQ0VTU0VEID0gdHJ1ZTsKLSAgfQorICAgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgdmFyIHByb3BlcnRp
ZXMgPSBwcm9wc1tpXTsKIAotICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzIHx8IHVucHJvY2Vz
c2VkTWl4aW5zKSB7Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1lc3BhY2UuTkFNRVNQQUNFUywg
bmFtZXNwYWNlOwotICAgIGZvciAodmFyIGk9MCwgbD1uYW1lc3BhY2VzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbaV07Ci0gICAgICBwcm9jZXNzTmFt
ZXNwYWNlKFtuYW1lc3BhY2UudG9TdHJpbmcoKV0sIG5hbWVzcGFjZSwge30pOwotICAgIH0KKyAg
ICAgICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5PYmplY3QuY3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0
cyBtaXhpbmcgaW4gb3RoZXIgZGVmaW5pdGlvbnMsIHVzZSBjcmVhdGVXaXRoTWl4aW5zIGluc3Rl
YWQuIiwgIShwcm9wZXJ0aWVzIGluc3RhbmNlb2YgRW1iZXIuTWl4aW4pKTsKIAotICAgIEVtYmVy
LmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7Ci0gIH0KLX0KKyAgICAgICAgaWYgKHR5cGVv
ZiBwcm9wZXJ0aWVzICE9PSAnb2JqZWN0JyAmJiBwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHsK
KyAgICAgICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVtYmVyLk9iamVjdC5jcmVhdGUgb25s
eSBhY2NlcHRzIG9iamVjdHMuIik7CisgICAgICAgIH0KIAotZnVuY3Rpb24gbWFrZVRvU3RyaW5n
KHJldCkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiByZXQ7IH07Ci19CisgICAgICAg
IGlmICghcHJvcGVydGllcykgeyBjb250aW51ZTsgfQogCi1FbWJlci5NaXhpbi5wcm90b3R5cGUu
dG9TdHJpbmcgPSBjbGFzc1RvU3RyaW5nOworICAgICAgICB2YXIga2V5TmFtZXMgPSBFbWJlci5r
ZXlzKHByb3BlcnRpZXMpOwogCi19KSgpOworICAgICAgICBmb3IgKHZhciBqID0gMCwgbGwgPSBr
ZXlOYW1lcy5sZW5ndGg7IGogPCBsbDsgaisrKSB7CisgICAgICAgICAgdmFyIGtleU5hbWUgPSBr
ZXlOYW1lc1tqXTsKKyAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5
TmFtZSkpIHsgY29udGludWU7IH0KIAorICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BlcnRpZXNb
a2V5TmFtZV0sCisgICAgICAgICAgICAgIElTX0JJTkRJTkcgPSBFbWJlci5JU19CSU5ESU5HOwog
CisgICAgICAgICAgaWYgKElTX0JJTkRJTkcudGVzdChrZXlOYW1lKSkgeworICAgICAgICAgICAg
dmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsKKyAgICAgICAgICAgIGlmICghYmluZGluZ3MpIHsK
KyAgICAgICAgICAgICAgYmluZGluZ3MgPSBtLmJpbmRpbmdzID0ge307CisgICAgICAgICAgICB9
IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7CisgICAgICAgICAgICAg
IGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3MpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYmluZGluZ3Nba2V5TmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICB9
CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCi0qLworICAgICAgICAgIHZhciBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsKIAotLyoq
Ci0gIERlZmluZXMgYSBuYW1lc3BhY2UgdGhhdCB3aWxsIGNvbnRhaW4gYW4gZXhlY3V0YWJsZSBh
cHBsaWNhdGlvbi4gVGhpcyBpcwotICB2ZXJ5IHNpbWlsYXIgdG8gYSBub3JtYWwgbmFtZXNwYWNl
IGV4Y2VwdCB0aGF0IGl0IGlzIGV4cGVjdGVkIHRvIGluY2x1ZGUgYXQKLSAgbGVhc3QgYSAncmVh
ZHknIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBydW4gdG8gaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRp
b24uCisgICAgICAgICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5PYmplY3QuY3JlYXRlIG5vIGxvbmdl
ciBzdXBwb3J0cyBkZWZpbmluZyBjb21wdXRlZCBwcm9wZXJ0aWVzLiIsICEodmFsdWUgaW5zdGFu
Y2VvZiBFbWJlci5Db21wdXRlZFByb3BlcnR5KSk7CisgICAgICAgICAgRW1iZXIuYXNzZXJ0KCJF
bWJlci5PYmplY3QuY3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0cyBkZWZpbmluZyBtZXRob2RzIHRo
YXQgY2FsbCBfc3VwZXIuIiwgISh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUu
dG9TdHJpbmcoKS5pbmRleE9mKCcuX3N1cGVyJykgIT09IC0xKSk7CisgICAgICAgICAgRW1iZXIu
YXNzZXJ0KCJgYWN0aW9uc2AgbXVzdCBiZSBwcm92aWRlZCBhdCBleHRlbmQgdGltZSwgbm90IGF0
IGNyZWF0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgInRpbWUsIHdoZW4gRW1iZXIuQWN0
aW9uSGFuZGxlciBpcyB1c2VkIChpLmUuIHZpZXdzLCAiICsKKyAgICAgICAgICAgICAgICAgICAg
ICAgImNvbnRyb2xsZXJzICYgcm91dGVzKS4iLCAhKChrZXlOYW1lID09PSAnYWN0aW9ucycpICYm
IEVtYmVyLkFjdGlvbkhhbmRsZXIuZGV0ZWN0KHRoaXMpKSk7CiAKLSAgQ3VycmVudGx5IGBFbWJl
ci5BcHBsaWNhdGlvbmAgaXMgdmVyeSBzaW1pbGFyIHRvIGBFbWJlci5OYW1lc3BhY2UuYCAgSG93
ZXZlciwKLSAgdGhpcyBjbGFzcyBtYXkgYmUgYXVnbWVudGVkIGJ5IGFkZGl0aW9uYWwgZnJhbWV3
b3JrcyBzbyBpdCBpcyBpbXBvcnRhbnQgdG8KLSAgdXNlIHRoaXMgaW5zdGFuY2Ugd2hlbiBidWls
ZGluZyBuZXcgYXBwbGljYXRpb25zLgorICAgICAgICAgIGlmIChjb25jYXRlbmF0ZWRQcm9wZXJ0
aWVzICYmIGluZGV4T2YoY29uY2F0ZW5hdGVkUHJvcGVydGllcywga2V5TmFtZSkgPj0gMCkgewor
ICAgICAgICAgICAgdmFyIGJhc2VWYWx1ZSA9IHRoaXNba2V5TmFtZV07CiAKLSAgIyBFeGFtcGxl
IFVzYWdlCisgICAgICAgICAgICBpZiAoYmFzZVZhbHVlKSB7CisgICAgICAgICAgICAgIGlmICgn
ZnVuY3Rpb24nID09PSB0eXBlb2YgYmFzZVZhbHVlLmNvbmNhdCkgeworICAgICAgICAgICAgICAg
IHZhbHVlID0gYmFzZVZhbHVlLmNvbmNhdCh2YWx1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgdmFsdWUgPSBFbWJlci5tYWtlQXJyYXkoYmFzZVZhbHVlKS5jb25j
YXQodmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICB2YWx1ZSA9IEVtYmVyLm1ha2VBcnJheSh2YWx1ZSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAgPSBFbWJlci5BcHBsaWNhdGlv
bi5jcmVhdGUoewotICAgIFZFUlNJT046ICcxLjAuMCcsCi0gICAgc3RvcmU6IEVtYmVyLlN0b3Jl
LmNyZWF0ZSgpLmZyb20oRW1iZXIuZml4dHVyZXMpCi0gIH0pOworICAgICAgICAgIGlmIChkZXNj
KSB7CisgICAgICAgICAgICBkZXNjLnNldCh0aGlzLCBrZXlOYW1lLCB2YWx1ZSk7CisgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXRVbmtub3duUHJvcGVy
dHkgPT09ICdmdW5jdGlvbicgJiYgIShrZXlOYW1lIGluIHRoaXMpKSB7CisgICAgICAgICAgICAg
IHRoaXMuc2V0VW5rbm93blByb3BlcnR5KGtleU5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0g
ZWxzZSBpZiAoTUFOREFUT1JZX1NFVFRFUikgeworICAgICAgICAgICAgICBFbWJlci5kZWZpbmVQ
cm9wZXJ0eSh0aGlzLCBrZXlOYW1lLCBudWxsLCB2YWx1ZSk7IC8vIHNldHVwIG1hbmRhdG9yeSBz
ZXR0ZXIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRoaXNba2V5TmFtZV0g
PSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9CisgICAgZmluaXNoUGFydGlhbCh0aGlzLCBtKTsKKyAgICB0aGlzLmluaXQuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKKyAgICBtLnByb3RvID0gcHJvdG87CisgICAgZmluaXNoQ2hhaW5z
KHRoaXMpOworICAgIHNlbmRFdmVudCh0aGlzLCAiaW5pdCIpOworICB9OwogCi0gIE15QXBwLnJl
YWR5ID0gZnVuY3Rpb24oKSB7Ci0gICAgLy8uLmluaXQgY29kZSBnb2VzIGhlcmUuLi4KLSAgfQot
ICBgYGAKKyAgQ2xhc3MudG9TdHJpbmcgPSBNaXhpbi5wcm90b3R5cGUudG9TdHJpbmc7CisgIENs
YXNzLndpbGxSZW9wZW4gPSBmdW5jdGlvbigpIHsKKyAgICBpZiAod2FzQXBwbGllZCkgeworICAg
ICAgQ2xhc3MuUHJvdG90eXBlTWl4aW4gPSBNaXhpbi5jcmVhdGUoQ2xhc3MuUHJvdG90eXBlTWl4
aW4pOworICAgIH0KIAotICBAY2xhc3MgQXBwbGljYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKLSovCi1FbWJlci5BcHBsaWNhdGlvbiA9IEVtYmVy
Lk5hbWVzcGFjZS5leHRlbmQoKTsKKyAgICB3YXNBcHBsaWVkID0gZmFsc2U7CisgIH07CisgIENs
YXNzLl9pbml0TWl4aW5zID0gZnVuY3Rpb24oYXJncykgeyBpbml0TWl4aW5zID0gYXJnczsgfTsK
KyAgQ2xhc3MuX2luaXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oYXJncykgeyBpbml0UHJvcGVydGll
cyA9IGFyZ3M7IH07CiAKKyAgQ2xhc3MucHJvdG8gPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3Vw
ZXJjbGFzcyA9IENsYXNzLnN1cGVyY2xhc3M7CisgICAgaWYgKHN1cGVyY2xhc3MpIHsgc3VwZXJj
bGFzcy5wcm90bygpOyB9CiAKLX0pKCk7CisgICAgaWYgKCF3YXNBcHBsaWVkKSB7CisgICAgICB3
YXNBcHBsaWVkID0gdHJ1ZTsKKyAgICAgIENsYXNzLlByb3RvdHlwZU1peGluLmFwcGx5UGFydGlh
bChDbGFzcy5wcm90b3R5cGUpOworICAgICAgcmV3YXRjaChDbGFzcy5wcm90b3R5cGUpOworICAg
IH0KIAorICAgIHJldHVybiB0aGlzLnByb3RvdHlwZTsKKyAgfTsKIAorICByZXR1cm4gQ2xhc3M7
CisKK30KIAotKGZ1bmN0aW9uKCkgewogLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKKyAgQGNsYXNzIENvcmVPYmplY3QKKyAgQG5hbWVzcGFjZSBFbWJlcgogKi8K
K3ZhciBDb3JlT2JqZWN0ID0gbWFrZUN0b3IoKTsKK0NvcmVPYmplY3QudG9TdHJpbmcgPSBmdW5j
dGlvbigpIHsgcmV0dXJuICJFbWJlci5Db3JlT2JqZWN0IjsgfTsKIAorQ29yZU9iamVjdC5Qcm90
b3R5cGVNaXhpbiA9IE1peGluLmNyZWF0ZSh7CisgIHJlb3BlbjogZnVuY3Rpb24oKSB7CisgICAg
YXBwbHlNaXhpbih0aGlzLCBhcmd1bWVudHMsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9
LAogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisgIC8qKgorICAgIEFu
IG92ZXJyaWRhYmxlIG1ldGhvZCBjYWxsZWQgd2hlbiBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQu
IEJ5IGRlZmF1bHQsCisgICAgZG9lcyBub3RoaW5nIHVubGVzcyBpdCBpcyBvdmVycmlkZGVuIGR1
cmluZyBjbGFzcyBkZWZpbml0aW9uLgogCi0vKioKLSAgQW4gQXJyYXlQcm94eSB3cmFwcyBhbnkg
b3RoZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFuZC9vcgotICBgRW1i
ZXIuTXV0YWJsZUFycmF5LGAgZm9yd2FyZGluZyBhbGwgcmVxdWVzdHMuIFRoaXMgbWFrZXMgaXQg
dmVyeSB1c2VmdWwgZm9yCi0gIGEgbnVtYmVyIG9mIGJpbmRpbmcgdXNlIGNhc2VzIG9yIG90aGVy
IGNhc2VzIHdoZXJlIGJlaW5nIGFibGUgdG8gc3dhcAotICBvdXQgdGhlIHVuZGVybHlpbmcgYXJy
YXkgaXMgdXNlZnVsLgorICAgIEV4YW1wbGU6CiAKLSAgQSBzaW1wbGUgZXhhbXBsZSBvZiB1c2Fn
ZToKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRl
bmQoeworICAgICAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgICAgIGFsZXJ0KCdOYW1lIGlzICcg
KyB0aGlzLmdldCgnbmFtZScpKTsKKyAgICAgIH0KKyAgICB9KTsKIAotICBgYGBqYXZhc2NyaXB0
Ci0gIHZhciBwZXRzID0gWydkb2cnLCAnY2F0JywgJ2Zpc2gnXTsKLSAgdmFyIGFwID0gRW1iZXIu
QXJyYXlQcm94eS5jcmVhdGUoeyBjb250ZW50OiBFbWJlci5BKHBldHMpIH0pOworICAgIHZhciBz
dGV2ZSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKKyAgICAgIG5hbWU6ICJTdGV2ZSIKKyAgICB9KTsK
IAotICBhcC5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2Rv
ZycKLSAgYXAuc2V0KCdjb250ZW50JywgWydhbW9lYmEnLCAncGFyYW1lY2l1bSddKTsKLSAgYXAu
Z2V0KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdhbW9lYmEnCi0g
IGBgYAorICAgIC8vIGFsZXJ0cyAnTmFtZSBpcyBTdGV2ZScuCisgICAgYGBgCiAKLSAgVGhpcyBj
bGFzcyBjYW4gYWxzbyBiZSB1c2VmdWwgYXMgYSBsYXllciB0byB0cmFuc2Zvcm0gdGhlIGNvbnRl
bnRzIG9mCi0gIGFuIGFycmF5LCBhcyB0aGV5IGFyZSBhY2Nlc3NlZC4gVGhpcyBjYW4gYmUgZG9u
ZSBieSBvdmVycmlkaW5nCi0gIGBvYmplY3RBdENvbnRlbnRgOgorICAgIE5PVEU6IElmIHlvdSBk
byBvdmVycmlkZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVtYmVyLlZpZXdg
IG9yCisgICAgYEVtYmVyLkFycmF5Q29udHJvbGxlcmAsIGJlIHN1cmUgdG8gY2FsbCBgdGhpcy5f
c3VwZXIoKWAgaW4geW91cgorICAgIGBpbml0YCBkZWNsYXJhdGlvbiEgSWYgeW91IGRvbid0LCBF
bWJlciBtYXkgbm90IGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8KKyAgICBkbyBpbXBvcnRhbnQgc2V0
dXAgd29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCisgICAgYXBw
bGljYXRpb24uCiAKLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcGV0cyA9IFsnZG9nJywgJ2NhdCcs
ICdmaXNoJ107Ci0gIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsKLSAgICAgIGNv
bnRlbnQ6IEVtYmVyLkEocGV0cyksCi0gICAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlk
eCkgewotICAgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29udGVudCcpLm9iamVjdEF0KGlkeCku
dG9VcHBlckNhc2UoKTsKLSAgICAgIH0KLSAgfSk7CisgICAgQG1ldGhvZCBpbml0CisgICovCisg
IGluaXQ6IGZ1bmN0aW9uKCkge30sCiAKLSAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyAuICdE
T0cnCi0gIGBgYAorICAvKioKKyAgICBEZWZpbmVzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBi
ZSBjb25jYXRlbmF0ZWQgZnJvbSB0aGUgc3VwZXJjbGFzcworICAgIChpbnN0ZWFkIG9mIG92ZXJy
aWRkZW4pLgogCi0gIEBjbGFzcyBBcnJheVByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4
dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVBcnJheQotKi8KLUVtYmVy
LkFycmF5UHJveHkgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJheSwKLS8q
KiBAc2NvcGUgRW1iZXIuQXJyYXlQcm94eS5wcm90b3R5cGUgKi8geworICAgIEJ5IGRlZmF1bHQs
IHdoZW4geW91IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3BlcnR5IGRlZmluZWQgaW4KKyAg
ICB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIHRo
YXQgaXMgZGVmaW5lZAorICAgIGluIHRoZSBzdXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUg
c29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVmZXJhYmxlCisgICAgdG8gYnVpbGQgdXAgYSBwcm9w
ZXJ0eSdzIHZhbHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFzcycgcHJvcGVydHkKKyAgICB2
YWx1ZSB3aXRoIHRoZSBzdWJjbGFzcycgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ug
d2l0aGluIEVtYmVyCisgICAgaXMgdGhlIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIu
Vmlld2AuCiAKLSAgLyoqCi0gICAgVGhlIGNvbnRlbnQgYXJyYXkuIE11c3QgYmUgYW4gb2JqZWN0
IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFuZC9vcgotICAgIGBFbWJlci5NdXRhYmxl
QXJyYXkuYAorICAgIEhlcmUgaXMgc29tZSBzYW1wbGUgY29kZSBzaG93aW5nIHRoZSBkaWZmZXJl
bmNlIGJldHdlZW4gYSBjb25jYXRlbmF0ZWQKKyAgICBwcm9wZXJ0eSBhbmQgYSBub3JtYWwgb25l
OgogCi0gICAgQHByb3BlcnR5IGNvbnRlbnQKLSAgICBAdHlwZSBFbWJlci5BcnJheQotICAqLwot
ICBjb250ZW50OiBudWxsLAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQmFyVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydi
YXInXSwKKyAgICAgIGNsYXNzTmFtZXM6IFsnYmFyJ10KKyAgICB9KTsKIAotICAvKioKLSAgIFRo
ZSBhcnJheSB0aGF0IHRoZSBwcm94eSBwcmV0ZW5kcyB0byBiZS4gSW4gdGhlIGRlZmF1bHQgYEFy
cmF5UHJveHlgCi0gICBpbXBsZW1lbnRhdGlvbiwgdGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUg
c2FtZS4gU3ViY2xhc3NlcyBvZiBgQXJyYXlQcm94eWAKLSAgIGNhbiBvdmVycmlkZSB0aGlzIHBy
b3BlcnR5IHRvIHByb3ZpZGUgdGhpbmdzIGxpa2Ugc29ydGluZyBhbmQgZmlsdGVyaW5nLgorICAg
IEFwcC5Gb29CYXJWaWV3ID0gQXBwLkJhclZpZXcuZXh0ZW5kKHsKKyAgICAgIHNvbWVOb25Db25j
YXRlbmF0ZWRQcm9wZXJ0eTogWydmb28nXSwKKyAgICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCisg
ICAgfSk7CiAKLSAgIEBwcm9wZXJ0eSBhcnJhbmdlZENvbnRlbnQKLSAgKi8KLSAgYXJyYW5nZWRD
b250ZW50OiBFbWJlci5jb21wdXRlZC5hbGlhcygnY29udGVudCcpLAorICAgIHZhciBmb29CYXJW
aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKCk7CisgICAgZm9vQmFyVmlldy5nZXQoJ3NvbWVO
b25Db25jYXRlbmF0ZWRQcm9wZXJ0eScpOyAvLyBbJ2ZvbyddCisgICAgZm9vQmFyVmlldy5nZXQo
J2NsYXNzTmFtZXMnKTsgLy8gWydlbWJlci12aWV3JywgJ2JhcicsICdmb28nXQorICAgIGBgYAog
Ci0gIC8qKgotICAgIFNob3VsZCBhY3R1YWxseSByZXRyaWV2ZSB0aGUgb2JqZWN0IGF0IHRoZSBz
cGVjaWZpZWQgaW5kZXggZnJvbSB0aGUKLSAgICBjb250ZW50LiBZb3UgY2FuIG92ZXJyaWRlIHRo
aXMgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gdHJhbnNmb3JtIHRoZQotICAgIGNvbnRlbnQgaXRl
bSB0byBzb21ldGhpbmcgbmV3LgorICAgIFRoaXMgYmVoYXZpb3IgZXh0ZW5kcyB0byBvYmplY3Qg
Y3JlYXRpb24gYXMgd2VsbC4gQ29udGludWluZyB0aGUKKyAgICBhYm92ZSBleGFtcGxlOgogCi0g
ICAgVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjb250ZW50IGlzIG5vbi1gbnVs
bGAuCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3Jl
YXRlKHsKKyAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydiYXonXSwKKyAgICAg
IGNsYXNzTmFtZXM6IFsnYmF6J10KKyAgICB9KQorICAgIHZpZXcuZ2V0KCdzb21lTm9uQ29uY2F0
ZW5hdGVkUHJvcGVydHknKTsgLy8gWydiYXonXQorICAgIHZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7
IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJywgJ2JheiddCisgICAgYGBgCisgICAgQWRk
aW5nIGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgaXMgbm90IGFuIGFycmF5IHdpbGwganVzdCBhZGQg
aXQgaW4gdGhlIGFycmF5OgogCi0gICAgQG1ldGhvZCBvYmplY3RBdENvbnRlbnQKLSAgICBAcGFy
YW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byByZXRyaWV2ZS4KLSAgICBAcmV0dXJuIHtPYmpl
Y3R9IHRoZSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm9uZSBmb3VuZAotICAqLwotICBvYmplY3RB
dENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ2FycmFuZ2Vk
Q29udGVudCcpLm9iamVjdEF0KGlkeCk7Ci0gIH0sCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZh
ciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKHsKKyAgICAgIGNsYXNzTmFtZXM6ICdiYXon
CisgICAgfSkKKyAgICB2aWV3LmdldCgnY2xhc3NOYW1lcycpOyAvLyBbJ2VtYmVyLXZpZXcnLCAn
YmFyJywgJ2ZvbycsICdiYXonXQorICAgIGBgYAogCi0gIC8qKgotICAgIFNob3VsZCBhY3R1YWxs
eSByZXBsYWNlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBvbiB0aGUgY29udGVudCBhcnJheS4KLSAg
ICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gdHJhbnNmb3Jt
IHRoZSBjb250ZW50IGl0ZW0KLSAgICBpbnRvIHNvbWV0aGluZyBuZXcuCisgICAgVXNpbmcgdGhl
IGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2UgY2FuIHRlbGwgdG8gRW1iZXIg
dGhhdCBtaXgKKyAgICB0aGUgY29udGVudCBvZiB0aGUgcHJvcGVydGllcy4KIAotICAgIFRoaXMg
bWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgorICAg
IEluIGBFbWJlci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJpbmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJp
bmRpbmdzYCBwcm9wZXJ0aWVzCisgICAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlv
biB0byBgY2xhc3NOYW1lc2AuCiAKLSAgICBAbWV0aG9kIHJlcGxhY2VDb250ZW50Ci0gICAgQHBh
cmFtIHtOdW1iZXJ9IGlkeCBUaGUgc3RhcnRpbmcgaW5kZXgKLSAgICBAcGFyYW0ge051bWJlcn0g
YW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlIGZyb20gdGhlIGNvbnRlbnQuCi0gICAg
QHBhcmFtIHtBcnJheX0gb2JqZWN0cyBPcHRpb25hbCBhcnJheSBvZiBvYmplY3RzIHRvIGluc2Vy
dCBvciBudWxsIGlmIG5vCi0gICAgICBvYmplY3RzLgotICAgIEByZXR1cm4ge3ZvaWR9CisgICAg
VGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSBmb3IgeW91IHRvIHVzZSB0aHJvdWdob3V0IHRoZSBF
bWJlciBvYmplY3QgbW9kZWwsCisgICAgYWx0aG91Z2ggdHlwaWNhbCBhcHAgZGV2ZWxvcGVycyBh
cmUgbGlrZWx5IHRvIHVzZSBpdCBpbmZyZXF1ZW50bHkuIFNpbmNlCisgICAgaXQgY2hhbmdlcyBl
eHBlY3RhdGlvbnMgYWJvdXQgYmVoYXZpb3Igb2YgcHJvcGVydGllcywgeW91IHNob3VsZCBwcm9w
ZXJseQorICAgIGRvY3VtZW50IGl0cyB1c2FnZSBpbiBlYWNoIGluZGl2aWR1YWwgY29uY2F0ZW5h
dGVkIHByb3BlcnR5ICh0byBub3QKKyAgICBtaXNsZWFkIHlvdXIgdXNlcnMgdG8gdGhpbmsgdGhl
eSBjYW4gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGluIGEgc3ViY2xhc3MpLgorCisgICAgQHByb3Bl
cnR5IGNvbmNhdGVuYXRlZFByb3BlcnRpZXMKKyAgICBAdHlwZSBBcnJheQorICAgIEBkZWZhdWx0
IG51bGwKICAgKi8KLSAgcmVwbGFjZUNvbnRlbnQ6IGZ1bmN0aW9uKGlkeCwgYW10LCBvYmplY3Rz
KSB7Ci0gICAgZ2V0KHRoaXMsICdjb250ZW50JykucmVwbGFjZShpZHgsIGFtdCwgb2JqZWN0cyk7
Ci0gIH0sCisgIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IG51bGwsCiAKICAgLyoqCi0gICAgQHBy
aXZhdGUKKyAgICBEZXN0cm95ZWQgb2JqZWN0IHByb3BlcnR5IGZsYWcuCiAKLSAgICBJbnZva2Vk
IHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlLiBOb3RpZmllcyBv
YnNlcnZlcnMgdGhhdCB0aGUKLSAgICBlbnRpcmUgYXJyYXkgY29udGVudCB3aWxsIGNoYW5nZS4K
KyAgICBpZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgb2JzZXJ2ZXJzIGFuZCBiaW5kaW5n
cyB3ZXJlIGFscmVhZHkKKyAgICByZW1vdmVkIGJ5IHRoZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGUg
YGRlc3Ryb3koKWAgbWV0aG9kLgogCi0gICAgQG1ldGhvZCBfY29udGVudFdpbGxDaGFuZ2UKKyAg
ICBAcHJvcGVydHkgaXNEZXN0cm95ZWQKKyAgICBAZGVmYXVsdCBmYWxzZQogICAqLwotICBfY29u
dGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHRo
aXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9LCAnY29udGVudCcpLAorICBpc0Rlc3Ryb3llZDog
ZmFsc2UsCiAKLSAgX3RlYXJkb3duQ29udGVudDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRl
bnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKKyAgLyoqCisgICAgRGVzdHJ1Y3Rpb24gc2NoZWR1
bGVkIGZsYWcuIFRoZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgogCi0gICAg
aWYgKGNvbnRlbnQpIHsKLSAgICAgIGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7
Ci0gICAgICAgIHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAg
ZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9
LAorICAgIFRoZSBvYmplY3Qgc3RheXMgaW50YWN0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHJ1biBs
b29wIGF0IHdoaWNoIHBvaW50CisgICAgdGhlIGBpc0Rlc3Ryb3llZGAgZmxhZyBpcyBzZXQuCiAK
LSAgY29udGVudEFycmF5V2lsbENoYW5nZTogRW1iZXIuSywKLSAgY29udGVudEFycmF5RGlkQ2hh
bmdlOiBFbWJlci5LLAorICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3lpbmcKKyAgICBAZGVmYXVsdCBm
YWxzZQorICAqLworICBpc0Rlc3Ryb3lpbmc6IGZhbHNlLAogCiAgIC8qKgotICAgIEBwcml2YXRl
CisgICAgRGVzdHJveXMgYW4gb2JqZWN0IGJ5IHNldHRpbmcgdGhlIGBpc0Rlc3Ryb3llZGAgZmxh
ZyBhbmQgcmVtb3ZpbmcgaXRzCisgICAgbWV0YWRhdGEsIHdoaWNoIGVmZmVjdGl2ZWx5IGRlc3Ry
b3lzIG9ic2VydmVycyBhbmQgYmluZGluZ3MuCiAKLSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRl
bnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCi0gICAgZW50
aXJlIGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQuCisgICAgSWYgeW91IHRyeSB0byBzZXQgYSBw
cm9wZXJ0eSBvbiBhIGRlc3Ryb3llZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCisgICAg
cmFpc2VkLgogCi0gICAgQG1ldGhvZCBfY29udGVudERpZENoYW5nZQorICAgIE5vdGUgdGhhdCBk
ZXN0cnVjdGlvbiBpcyBzY2hlZHVsZWQgZm9yIHRoZSBlbmQgb2YgdGhlIHJ1biBsb29wIGFuZCBk
b2VzIG5vdAorICAgIGhhcHBlbiBpbW1lZGlhdGVseS4gIEl0IHdpbGwgc2V0IGFuIGlzRGVzdHJv
eWluZyBmbGFnIGltbWVkaWF0ZWx5LgorCisgICAgQG1ldGhvZCBkZXN0cm95CisgICAgQHJldHVy
biB7RW1iZXIuT2JqZWN0fSByZWNlaXZlcgogICAqLwotICBfY29udGVudERpZENoYW5nZTogRW1i
ZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2Nv
bnRlbnQnKTsKKyAgZGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuaXNEZXN0cm95
aW5nKSB7IHJldHVybjsgfQorICAgIHRoaXMuaXNEZXN0cm95aW5nID0gdHJ1ZTsKIAotICAgIEVt
YmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IEFycmF5UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIGNv
bnRlbnQgIT09IHRoaXMpOworICAgIHNjaGVkdWxlKCdhY3Rpb25zJywgdGhpcywgdGhpcy53aWxs
RGVzdHJveSk7CisgICAgc2NoZWR1bGUoJ2Rlc3Ryb3knLCB0aGlzLCB0aGlzLl9zY2hlZHVsZWRE
ZXN0cm95KTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKIAotICAgIHRoaXMuX3NldHVwQ29udGVu
dCgpOwotICB9LCAnY29udGVudCcpLAorICAvKioKKyAgICBPdmVycmlkZSB0byBpbXBsZW1lbnQg
dGVhcmRvd24uCiAKLSAgX3NldHVwQ29udGVudDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRl
bnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKKyAgICBAbWV0aG9kIHdpbGxEZXN0cm95CisgICAq
LworICB3aWxsRGVzdHJveTogRW1iZXIuSywKIAotICAgIGlmIChjb250ZW50KSB7Ci0gICAgICBj
b250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgewotICAgICAgICB3aWxsQ2hhbmdlOiAnY29u
dGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURp
ZENoYW5nZScKLSAgICAgIH0pOwotICAgIH0KKyAgLyoqCisgICAgSW52b2tlZCBieSB0aGUgcnVu
IGxvb3AgdG8gYWN0dWFsbHkgZGVzdHJveSB0aGUgb2JqZWN0LiBUaGlzIGlzCisgICAgc2NoZWR1
bGVkIGZvciBleGVjdXRpb24gYnkgdGhlIGBkZXN0cm95YCBtZXRob2QuCisKKyAgICBAcHJpdmF0
ZQorICAgIEBtZXRob2QgX3NjaGVkdWxlZERlc3Ryb3kKKyAgKi8KKyAgX3NjaGVkdWxlZERlc3Ry
b3k6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7IHJldHVybjsgfQor
ICAgIGRlc3Ryb3kodGhpcyk7CisgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CiAgIH0sCiAK
LSAgX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0
aW9uKCkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29u
dGVudCcpLAotICAgICAgICBsZW4gPSBhcnJhbmdlZENvbnRlbnQgPyBnZXQoYXJyYW5nZWRDb250
ZW50LCAnbGVuZ3RoJykgOiAwOworICBiaW5kOiBmdW5jdGlvbih0bywgZnJvbSkgeworICAgIGlm
ICghKGZyb20gaW5zdGFuY2VvZiBFbWJlci5CaW5kaW5nKSkgeyBmcm9tID0gRW1iZXIuQmluZGlu
Zy5mcm9tKGZyb20pOyB9CisgICAgZnJvbS50byh0bykuY29ubmVjdCh0aGlzKTsKKyAgICByZXR1
cm4gZnJvbTsKKyAgfSwKIAotICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdl
KHRoaXMsIDAsIGxlbiwgdW5kZWZpbmVkKTsKLSAgICB0aGlzLmFycmFuZ2VkQ29udGVudFdpbGxD
aGFuZ2UodGhpcyk7CisgIC8qKgorICAgIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24g
d2hpY2ggYXR0ZW1wdHMgdG8gcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uCisgICAgdGhhbiBKYXZh
c2NyaXB0J3MgYHRvU3RyaW5nYCB0eXBpY2FsbHkgZG9lcywgaW4gYSBnZW5lcmljIHdheSBmb3Ig
YWxsIEVtYmVyCisgICAgb2JqZWN0cy4KIAotICAgIHRoaXMuX3RlYXJkb3duQXJyYW5nZWRDb250
ZW50KGFycmFuZ2VkQ29udGVudCk7Ci0gIH0sICdhcnJhbmdlZENvbnRlbnQnKSwKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgQXBwLlBlcnNvbiA9IEVtLk9iamVjdC5leHRlbmQoKQorICAgIHBlcnNv
biA9IEFwcC5QZXJzb24uY3JlYXRlKCkKKyAgICBwZXJzb24udG9TdHJpbmcoKSAvLz0+ICI8QXBw
LlBlcnNvbjplbWJlcjEwMjQ+IgorICAgIGBgYAogCi0gIF9hcnJhbmdlZENvbnRlbnREaWRDaGFu
Z2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQg
PSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpLAotICAgICAgICBsZW4gPSBhcnJhbmdlZENv
bnRlbnQgPyBnZXQoYXJyYW5nZWRDb250ZW50LCAnbGVuZ3RoJykgOiAwOworICAgIElmIHRoZSBv
YmplY3QncyBjbGFzcyBpcyBub3QgZGVmaW5lZCBvbiBhbiBFbWJlciBuYW1lc3BhY2UsIGl0IHdp
bGwKKyAgICBpbmRpY2F0ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdpc3RlcmVkIHN1cGVy
Y2xhc3M6CiAKLSAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBBcnJheVByb3h5J3MgY29udGVu
dCB0byBpdHNlbGYiLCBhcnJhbmdlZENvbnRlbnQgIT09IHRoaXMpOworICAgYGBgamF2YXNjcmlw
dAorICAgIFN0dWRlbnQgPSBBcHAuUGVyc29uLmV4dGVuZCgpCisgICAgc3R1ZGVudCA9IFN0dWRl
bnQuY3JlYXRlKCkKKyAgICBzdHVkZW50LnRvU3RyaW5nKCkgLy89PiAiPChzdWJjbGFzcyBvZiBB
cHAuUGVyc29uKTplbWJlcjEwMjU+IgorICAgIGBgYAogCi0gICAgdGhpcy5fc2V0dXBBcnJhbmdl
ZENvbnRlbnQoKTsKKyAgICBJZiB0aGUgbWV0aG9kIGB0b1N0cmluZ0V4dGVuc2lvbmAgaXMgZGVm
aW5lZCwgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlCisgICAgaW5jbHVkZWQgaW4gdGhlIG91dHB1
dC4KIAotICAgIHRoaXMuYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRoaXMpOwotICAgIHRoaXMu
YXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2UodGhpcywgMCwgdW5kZWZpbmVkLCBsZW4pOwot
ICB9LCAnYXJyYW5nZWRDb250ZW50JyksCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5UZWFj
aGVyID0gQXBwLlBlcnNvbi5leHRlbmQoeworICAgICAgdG9TdHJpbmdFeHRlbnNpb246IGZ1bmN0
aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2Z1bGxOYW1lJyk7CisgICAgICB9Cisg
ICAgfSk7CisgICAgdGVhY2hlciA9IEFwcC5UZWFjaGVyLmNyZWF0ZSgpCisgICAgdGVhY2hlci50
b1N0cmluZygpOyAvLz0+ICI8QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxlPiIKKyAgICBg
YGAKIAotICBfc2V0dXBBcnJhbmdlZENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBhcnJh
bmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOworICAgIEBtZXRob2Qg
dG9TdHJpbmcKKyAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbgorICAq
LworICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CisgICAgdmFyIGhhc1RvU3RyaW5n
RXh0ZW5zaW9uID0gdHlwZW9mIHRoaXMudG9TdHJpbmdFeHRlbnNpb24gPT09ICdmdW5jdGlvbics
CisgICAgICAgIGV4dGVuc2lvbiA9IGhhc1RvU3RyaW5nRXh0ZW5zaW9uID8gIjoiICsgdGhpcy50
b1N0cmluZ0V4dGVuc2lvbigpIDogJyc7CisgICAgdmFyIHJldCA9ICc8Jyt0aGlzLmNvbnN0cnVj
dG9yLnRvU3RyaW5nKCkrJzonK2d1aWRGb3IodGhpcykrZXh0ZW5zaW9uKyc+JzsKKyAgICB0aGlz
LnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfSk7
CiAKLSAgICBpZiAoYXJyYW5nZWRDb250ZW50KSB7Ci0gICAgICBhcnJhbmdlZENvbnRlbnQuYWRk
QXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICAgIHdpbGxDaGFuZ2U6ICdhcnJhbmdlZENvbnRl
bnRBcnJheVdpbGxDaGFuZ2UnLAotICAgICAgICBkaWRDaGFuZ2U6ICdhcnJhbmdlZENvbnRlbnRB
cnJheURpZENoYW5nZScKLSAgICAgIH0pOwotICAgIH0KLSAgfSwKK0NvcmVPYmplY3QuUHJvdG90
eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmplY3Q7CiAKLSAgX3RlYXJkb3duQXJy
YW5nZWRDb250ZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0
KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKK2Z1bmN0aW9uIG1ha2VUb1N0cmluZyhyZXQpIHsK
KyAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmV0OyB9OworfQogCi0gICAgaWYgKGFycmFu
Z2VkQ29udGVudCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92ZUFycmF5T2JzZXJ2ZXIo
dGhpcywgewotICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hh
bmdlJywKLSAgICAgICAgZGlkQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2Un
Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0sCitpZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90
eXBlTWl4aW4pIHsKKyAgRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBlTWl4aW4oQ29yZU9i
amVjdC5Qcm90b3R5cGVNaXhpbik7Cit9CiAKLSAgYXJyYW5nZWRDb250ZW50V2lsbENoYW5nZTog
RW1iZXIuSywKLSAgYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOiBFbWJlci5LLAorQ29yZU9iamVj
dC5fX3N1cGVyX18gPSBudWxsOwogCi0gIG9iamVjdEF0OiBmdW5jdGlvbihpZHgpIHsKLSAgICBy
ZXR1cm4gZ2V0KHRoaXMsICdjb250ZW50JykgJiYgdGhpcy5vYmplY3RBdENvbnRlbnQoaWR4KTsK
LSAgfSwKK3ZhciBDbGFzc01peGluID0gTWl4aW4uY3JlYXRlKHsKIAotICBsZW5ndGg6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhp
cywgJ2FycmFuZ2VkQ29udGVudCcpOwotICAgIHJldHVybiBhcnJhbmdlZENvbnRlbnQgPyBnZXQo
YXJyYW5nZWRDb250ZW50LCAnbGVuZ3RoJykgOiAwOwotICAgIC8vIE5vIGRlcGVuZGVuY2llcyBz
aW5jZSBFbnVtZXJhYmxlIG5vdGlmaWVzIGxlbmd0aCBvZiBjaGFuZ2UKLSAgfSksCisgIENsYXNz
TWl4aW46IEVtYmVyLnJlcXVpcmVkKCksCiAKLSAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCBhbXQs
IG9iamVjdHMpIHsKLSAgICBFbWJlci5hc3NlcnQoJ1RoZSBjb250ZW50IHByb3BlcnR5IG9mICcr
IHRoaXMuY29uc3RydWN0b3IgKyAnIHNob3VsZCBiZSBzZXQgYmVmb3JlIG1vZGlmeWluZyBpdCcs
IHRoaXMuZ2V0KCdjb250ZW50JykpOwotICAgIGlmIChnZXQodGhpcywgJ2NvbnRlbnQnKSkgdGhp
cy5yZXBsYWNlQ29udGVudChpZHgsIGFtdCwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCisgIFByb3RvdHlwZU1peGluOiBFbWJlci5yZXF1aXJlZCgpLAogCi0gIGFycmFuZ2VkQ29u
dGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24oaXRlbSwgaWR4LCByZW1vdmVkQ250LCBhZGRl
ZENudCkgewotICAgIHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDbnQs
IGFkZGVkQ250KTsKLSAgfSwKKyAgaXNDbGFzczogdHJ1ZSwKIAotICBhcnJhbmdlZENvbnRlbnRB
cnJheURpZENoYW5nZTogZnVuY3Rpb24oaXRlbSwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkg
ewotICAgIHRoaXMuYXJyYXlDb250ZW50RGlkQ2hhbmdlKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRD
bnQpOwotICB9LAorICBpc01ldGhvZDogZmFsc2UsCiAKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0g
ICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9zZXR1cENvbnRlbnQoKTsKLSAgICB0aGlzLl9z
ZXR1cEFycmFuZ2VkQ29udGVudCgpOwotICB9LAorICAvKioKKyAgICBDcmVhdGVzIGEgbmV3IHN1
YmNsYXNzLgogCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl90ZWFyZG93
bkFycmFuZ2VkQ29udGVudCgpOwotICAgIHRoaXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9Ci19
KTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRl
bmQoeworICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgeworICAgICAgICBhbGVydCh0aGluZyk7
CisgICAgICAgfQorICAgIH0pOworICAgIGBgYAogCisgICAgVGhpcyBkZWZpbmVzIGEgbmV3IHN1
YmNsYXNzIG9mIEVtYmVyLk9iamVjdDogYEFwcC5QZXJzb25gLiBJdCBjb250YWlucyBvbmUgbWV0
aG9kOiBgc2F5KClgLgogCi19KSgpOworICAgIFlvdSBjYW4gYWxzbyBjcmVhdGUgYSBzdWJjbGFz
cyBmcm9tIGFueSBleGlzdGluZyBjbGFzcyBieSBjYWxsaW5nIGl0cyBgZXh0ZW5kKClgICBtZXRo
b2QuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzdWJjbGFzcyBvZiBF
bWJlcidzIGJ1aWx0LWluIGBFbWJlci5WaWV3YCBjbGFzczoKIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBBcHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRhZ05hbWU6
ICdsaScsCisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0FkbWluaXN0cmF0b3InXQorICAg
IH0pOworICAgIGBgYAogCisgICAgV2hlbiBkZWZpbmluZyBhIHN1YmNsYXNzLCB5b3UgY2FuIG92
ZXJyaWRlIG1ldGhvZHMgYnV0IHN0aWxsIGFjY2VzcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91
ciBwYXJlbnQgY2xhc3MgYnkgY2FsbGluZyB0aGUgc3BlY2lhbCBgX3N1cGVyKClgIG1ldGhvZDoK
IAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1
bnRpbWUKLSovCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKHsKKyAgICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKKyAgICAgICAgdmFyIG5h
bWUgPSB0aGlzLmdldCgnbmFtZScpOworICAgICAgICBhbGVydChuYW1lICsgJyBzYXlzOiAnICsg
dGhpbmcpOworICAgICAgfQorICAgIH0pOwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHNl
dCA9IEVtYmVyLnNldCwKLSAgICBmbXQgPSBFbWJlci5TdHJpbmcuZm10LAotICAgIGFkZEJlZm9y
ZU9ic2VydmVyID0gRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIsCi0gICAgYWRkT2JzZXJ2ZXIgPSBF
bWJlci5hZGRPYnNlcnZlciwKLSAgICByZW1vdmVCZWZvcmVPYnNlcnZlciA9IEVtYmVyLnJlbW92
ZUJlZm9yZU9ic2VydmVyLAotICAgIHJlbW92ZU9ic2VydmVyID0gRW1iZXIucmVtb3ZlT2JzZXJ2
ZXIsCi0gICAgcHJvcGVydHlXaWxsQ2hhbmdlID0gRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlLAot
ICAgIHByb3BlcnR5RGlkQ2hhbmdlID0gRW1iZXIucHJvcGVydHlEaWRDaGFuZ2U7CisgICAgQXBw
LlNvbGRpZXIgPSBBcHAuUGVyc29uLmV4dGVuZCh7CisgICAgICBzYXk6IGZ1bmN0aW9uKHRoaW5n
KSB7CisgICAgICAgIHRoaXMuX3N1cGVyKHRoaW5nICsgIiwgc2lyISIpOworICAgICAgfSwKKyAg
ICAgIG1hcmNoOiBmdW5jdGlvbihudW1iZXJPZkhvdXJzKSB7CisgICAgICAgIGFsZXJ0KHRoaXMu
Z2V0KCduYW1lJykgKyAnIG1hcmNoZXMgZm9yICcgKyBudW1iZXJPZkhvdXJzICsgJyBob3Vycy4n
KQorICAgICAgfQorICAgIH0pOwogCi1mdW5jdGlvbiBjb250ZW50UHJvcGVydHlXaWxsQ2hhbmdl
KGNvbnRlbnQsIGNvbnRlbnRLZXkpIHsKLSAgdmFyIGtleSA9IGNvbnRlbnRLZXkuc2xpY2UoOCk7
IC8vIHJlbW92ZSAiY29udGVudC4iCi0gIGlmIChrZXkgaW4gdGhpcykgeyByZXR1cm47IH0gIC8v
IGlmIHNoYWRvd2VkIGluIHByb3h5Ci0gIHByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXkpOwot
fQorICAgIHZhciB5ZWh1ZGEgPSBBcHAuU29sZGllci5jcmVhdGUoeworICAgICAgbmFtZTogIlll
aHVkYSBLYXR6IgorICAgIH0pOwogCi1mdW5jdGlvbiBjb250ZW50UHJvcGVydHlEaWRDaGFuZ2Uo
Y29udGVudCwgY29udGVudEtleSkgewotICB2YXIga2V5ID0gY29udGVudEtleS5zbGljZSg4KTsg
Ly8gcmVtb3ZlICJjb250ZW50LiIKLSAgaWYgKGtleSBpbiB0aGlzKSB7IHJldHVybjsgfSAvLyBp
ZiBzaGFkb3dlZCBpbiBwcm94eQotICBwcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOwotfQor
ICAgIHllaHVkYS5zYXkoIlllcyIpOyAgLy8gYWxlcnRzICJZZWh1ZGEgS2F0eiBzYXlzOiBZZXMs
IHNpciEiCisgICAgYGBgCiAKLS8qKgotICBgRW1iZXIuT2JqZWN0UHJveHlgIGZvcndhcmRzIGFs
bCBwcm9wZXJ0aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94eSBpdHNlbGYKLSAgdG8gYSBwcm94
aWVkIGBjb250ZW50YCBvYmplY3QuCisgICAgVGhlIGBjcmVhdGUoKWAgb24gbGluZSAjMTcgY3Jl
YXRlcyBhbiAqaW5zdGFuY2UqIG9mIHRoZSBgQXBwLlNvbGRpZXJgIGNsYXNzLiBUaGUgYGV4dGVu
ZCgpYCBvbiBsaW5lICM4IGNyZWF0ZXMgYSAqc3ViY2xhc3MqIG9mIGBBcHAuUGVyc29uYC4gQW55
IGluc3RhbmNlIG9mIHRoZSBgQXBwLlBlcnNvbmAgY2xhc3Mgd2lsbCAqbm90KiBoYXZlIHRoZSBg
bWFyY2goKWAgbWV0aG9kLgogCi0gIGBgYGphdmFzY3JpcHQKLSAgb2JqZWN0ID0gRW1iZXIuT2Jq
ZWN0LmNyZWF0ZSh7Ci0gICAgbmFtZTogJ0ZvbycKLSAgfSk7CisgICAgWW91IGNhbiBhbHNvIHBh
c3MgYEVtYmVyLk1peGluYCBjbGFzc2VzIHRvIGFkZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8g
dGhlIHN1YmNsYXNzLgogCi0gIHByb3h5ID0gRW1iZXIuT2JqZWN0UHJveHkuY3JlYXRlKHsKLSAg
ICBjb250ZW50OiBvYmplY3QKLSAgfSk7CisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5QZXJz
b24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsK
KyAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgc2F5czogJyArIHRoaW5nKTsKKyAg
ICAgIH0KKyAgICB9KTsKIAotICAvLyBBY2Nlc3MgYW5kIGNoYW5nZSBleGlzdGluZyBwcm9wZXJ0
aWVzCi0gIHByb3h5LmdldCgnbmFtZScpICAgICAgICAgIC8vICdGb28nCi0gIHByb3h5LnNldCgn
bmFtZScsICdCYXInKTsKLSAgb2JqZWN0LmdldCgnbmFtZScpICAgICAgICAgLy8gJ0JhcicKKyAg
ICBBcHAuU2luZ2luZ01peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgICAgIHNpbmc6IGZ1
bmN0aW9uKHRoaW5nKXsKKyAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgc2luZ3M6
IGxhIGxhIGxhICcgKyB0aGluZyk7CisgICAgICB9CisgICAgfSk7CiAKLSAgLy8gQ3JlYXRlIG5l
dyAnZGVzY3JpcHRpb24nIHByb3BlcnR5IG9uIGBvYmplY3RgCi0gIHByb3h5LnNldCgnZGVzY3Jp
cHRpb24nLCAnRm9vIGlzIGEgd2hpemJvbyBiYXonKTsKLSAgb2JqZWN0LmdldCgnZGVzY3JpcHRp
b24nKSAgLy8gJ0ZvbyBpcyBhIHdoaXpib28gYmF6JwotICBgYGAKKyAgICBBcHAuQnJvYWR3YXlT
dGFyID0gQXBwLlBlcnNvbi5leHRlbmQoQXBwLlNpbmdpbmdNaXhpbiwgeworICAgICAgZGFuY2U6
IGZ1bmN0aW9uKCkgeworICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBkYW5jZXM6
IHRhcCB0YXAgdGFwIHRhcCAnKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKIAotICBXaGls
ZSBgY29udGVudGAgaXMgdW5zZXQsIHNldHRpbmcgYSBwcm9wZXJ0eSB0byBiZSBkZWxlZ2F0ZWQg
d2lsbCB0aHJvdyBhbgotICBFcnJvci4KKyAgICBUaGUgYEFwcC5Ccm9hZHdheVN0YXJgIGNsYXNz
IGNvbnRhaW5zIHRocmVlIG1ldGhvZHM6IGBzYXkoKWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClg
LgogCi0gIGBgYGphdmFzY3JpcHQKLSAgcHJveHkgPSBFbWJlci5PYmplY3RQcm94eS5jcmVhdGUo
ewotICAgIGNvbnRlbnQ6IG51bGwsCi0gICAgZmxhZzogbnVsbAotICB9KTsKLSAgcHJveHkuc2V0
KCdmbGFnJywgdHJ1ZSk7Ci0gIHByb3h5LmdldCgnZmxhZycpOyAgICAgICAgIC8vIHRydWUKLSAg
cHJveHkuZ2V0KCdmb28nKTsgICAgICAgICAgLy8gdW5kZWZpbmVkCi0gIHByb3h5LnNldCgnZm9v
JywgJ2RhdGEnKTsgIC8vIHRocm93cyBFcnJvcgotICBgYGAKKyAgICBAbWV0aG9kIGV4dGVuZAor
ICAgIEBzdGF0aWMKIAotICBEZWxlZ2F0ZWQgcHJvcGVydGllcyBjYW4gYmUgYm91bmQgdG8gYW5k
IHdpbGwgY2hhbmdlIHdoZW4gY29udGVudCBpcyB1cGRhdGVkLgorICAgIEBwYXJhbSB7RW1iZXIu
TWl4aW59IFttaXhpbnNdKiBPbmUgb3IgbW9yZSBFbWJlci5NaXhpbiBjbGFzc2VzCisgICAgQHBh
cmFtIHtPYmplY3R9IFthcmd1bWVudHNdKiBPYmplY3QgY29udGFpbmluZyB2YWx1ZXMgdG8gdXNl
IHdpdGhpbiB0aGUgbmV3IGNsYXNzCisgICovCisgIGV4dGVuZDogZnVuY3Rpb24oKSB7CisgICAg
dmFyIENsYXNzID0gbWFrZUN0b3IoKSwgcHJvdG87CisgICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IE1p
eGluLmNyZWF0ZSh0aGlzLkNsYXNzTWl4aW4pOworICAgIENsYXNzLlByb3RvdHlwZU1peGluID0g
TWl4aW4uY3JlYXRlKHRoaXMuUHJvdG90eXBlTWl4aW4pOwogCi0gIENvbXB1dGVkIHByb3BlcnRp
ZXMgb24gdGhlIHByb3h5IGl0c2VsZiBjYW4gZGVwZW5kIG9uIGRlbGVnYXRlZCBwcm9wZXJ0aWVz
LgorICAgIENsYXNzLkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENsYXNzOworICAgIENs
YXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBDbGFzczsKIAotICBgYGBqYXZh
c2NyaXB0Ci0gIFByb3h5V2l0aENvbXB1dGVkUHJvcGVydHkgPSBFbWJlci5PYmplY3RQcm94eS5l
eHRlbmQoewotICAgIGZ1bGxOYW1lOiBmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgZmlyc3ROYW1l
ID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpLAotICAgICAgICAgIGxhc3ROYW1lID0gdGhpcy5nZXQo
J2xhc3ROYW1lJyk7Ci0gICAgICBpZiAoZmlyc3ROYW1lICYmIGxhc3ROYW1lKSB7Ci0gICAgICAg
IHJldHVybiBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTsKLSAgICAgIH0KLSAgICAgIHJldHVy
biBmaXJzdE5hbWUgfHwgbGFzdE5hbWU7Ci0gICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xh
c3ROYW1lJykKLSAgfSk7CisgICAgcmVvcGVuLmFwcGx5KENsYXNzLlByb3RvdHlwZU1peGluLCBh
cmd1bWVudHMpOwogCi0gIHByb3h5ID0gUHJveHlXaXRoQ29tcHV0ZWRQcm9wZXJ0eS5jcmVhdGUo
KTsKKyAgICBDbGFzcy5zdXBlcmNsYXNzID0gdGhpczsKKyAgICBDbGFzcy5fX3N1cGVyX18gID0g
dGhpcy5wcm90b3R5cGU7CiAKLSAgcHJveHkuZ2V0KCdmdWxsTmFtZScpOyAgLy8gdW5kZWZpbmVk
Ci0gIHByb3h5LnNldCgnY29udGVudCcsIHsKLSAgICBmaXJzdE5hbWU6ICdUb20nLCBsYXN0TmFt
ZTogJ0RhbGUnCi0gIH0pOyAvLyB0cmlnZ2VycyBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGZ1bGxOYW1l
IG9uIHByb3h5CisgICAgcHJvdG8gPSBDbGFzcy5wcm90b3R5cGUgPSBvX2NyZWF0ZSh0aGlzLnBy
b3RvdHlwZSk7CisgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDbGFzczsKKyAgICBnZW5lcmF0ZUd1
aWQocHJvdG8pOworICAgIG1ldGEocHJvdG8pLnByb3RvID0gcHJvdG87IC8vIHRoaXMgd2lsbCBk
aXNhYmxlIG9ic2VydmVycyBvbiBwcm90b3R5cGUKIAotICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7
ICAvLyAnVG9tIERhbGUnCi0gIGBgYAorICAgIENsYXNzLkNsYXNzTWl4aW4uYXBwbHkoQ2xhc3Mp
OworICAgIHJldHVybiBDbGFzczsKKyAgfSwKIAotICBAY2xhc3MgT2JqZWN0UHJveHkKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5PYmplY3RQ
cm94eSA9IEVtYmVyLk9iamVjdC5leHRlbmQoCi0vKiogQHNjb3BlIEVtYmVyLk9iamVjdFByb3h5
LnByb3RvdHlwZSAqLyB7CiAgIC8qKgotICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3
aWxsIGJlIGZvcndhcmRlZC4KKyAgICBFcXVpdmFsZW50IHRvIGRvaW5nIGBleHRlbmQoYXJndW1l
bnRzKS5jcmVhdGUoKWAuCisgICAgSWYgcG9zc2libGUgdXNlIHRoZSBub3JtYWwgYGNyZWF0ZWAg
bWV0aG9kIGluc3RlYWQuCiAKLSAgICBAcHJvcGVydHkgY29udGVudAotICAgIEB0eXBlIEVtYmVy
Lk9iamVjdAotICAgIEBkZWZhdWx0IG51bGwKKyAgICBAbWV0aG9kIGNyZWF0ZVdpdGhNaXhpbnMK
KyAgICBAc3RhdGljCisgICAgQHBhcmFtIFthcmd1bWVudHNdKgogICAqLwotICBjb250ZW50OiBu
dWxsLAotICBfY29udGVudERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0g
ICAgRW1iZXIuYXNzZXJ0KCJDYW4ndCBzZXQgT2JqZWN0UHJveHkncyBjb250ZW50IHRvIGl0c2Vs
ZiIsIHRoaXMuZ2V0KCdjb250ZW50JykgIT09IHRoaXMpOwotICB9LCAnY29udGVudCcpLAotCi0g
IGlzVHJ1dGh5OiBFbWJlci5jb21wdXRlZC5ib29sKCdjb250ZW50JyksCi0KLSAgX2RlYnVnQ29u
dGFpbmVyS2V5OiBudWxsLAotCi0gIHdpbGxXYXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7
Ci0gICAgdmFyIGNvbnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIGFkZEJlZm9yZU9i
c2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Up
OwotICAgIGFkZE9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0
eURpZENoYW5nZSk7Ci0gIH0sCi0KLSAgZGlkVW53YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5
KSB7Ci0gICAgdmFyIGNvbnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIHJlbW92ZUJl
Zm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxD
aGFuZ2UpOwotICAgIHJlbW92ZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRl
bnRQcm9wZXJ0eURpZENoYW5nZSk7Ci0gIH0sCi0KLSAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlv
biAoa2V5KSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLSAgICBp
ZiAoY29udGVudCkgewotICAgICAgcmV0dXJuIGdldChjb250ZW50LCBrZXkpOwotICAgIH0KKyAg
Y3JlYXRlV2l0aE1peGluczogZnVuY3Rpb24oKSB7CisgICAgdmFyIEMgPSB0aGlzOworICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdE1peGlucyhhcmd1bWVudHMpOyB9Cisg
ICAgcmV0dXJuIG5ldyBDKCk7CiAgIH0sCiAKLSAgc2V0VW5rbm93blByb3BlcnR5OiBmdW5jdGlv
biAoa2V5LCB2YWx1ZSkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7
Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiQ2Fubm90IGRlbGVnYXRlIHNldCgnJUAnLCAlQCkgdG8g
dGhlICdjb250ZW50JyBwcm9wZXJ0eSBvZiBvYmplY3QgcHJveHkgJUA6IGl0cyAnY29udGVudCcg
aXMgdW5kZWZpbmVkLiIsIFtrZXksIHZhbHVlLCB0aGlzXSksIGNvbnRlbnQpOwotICAgIHJldHVy
biBzZXQoY29udGVudCwga2V5LCB2YWx1ZSk7Ci0gIH0KLX0pOwotCi19KSgpOworICAvKioKKyAg
ICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MuIEFjY2VwdHMgZWl0aGVyIG5vIGFyZ3Vt
ZW50cywgb3IgYW4gb2JqZWN0CisgICAgY29udGFpbmluZyB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSB0
aGUgbmV3bHkgaW5zdGFudGlhdGVkIG9iamVjdCB3aXRoLgogCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIGhlbGxvV29ybGQ6
IGZ1bmN0aW9uKCkgeworICAgICAgICBhbGVydCgiSGksIG15IG5hbWUgaXMgIiArIHRoaXMuZ2V0
KCduYW1lJykpOworICAgICAgfQorICAgIH0pOwogCisgICAgdmFyIHRvbSA9IEFwcC5QZXJzb24u
Y3JlYXRlKHsKKyAgICAgIG5hbWU6ICdUb20gRGFsZScKKyAgICB9KTsKIAotKGZ1bmN0aW9uKCkg
ewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCisgICAg
dG9tLmhlbGxvV29ybGQoKTsgLy8gYWxlcnRzICJIaSwgbXkgbmFtZSBpcyBUb20gRGFsZSIuCisg
ICAgYGBgCiAKKyAgICBgY3JlYXRlYCB3aWxsIGNhbGwgdGhlIGBpbml0YCBmdW5jdGlvbiBpZiBk
ZWZpbmVkIGR1cmluZworICAgIGBFbWJlci5BbnlPYmplY3QuZXh0ZW5kYAogCi12YXIgc2V0ID0g
RW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQsIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOwotdmFy
IGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKKyAgICBJZiBubyBhcmd1
bWVudHMgYXJlIHBhc3NlZCB0byBgY3JlYXRlYCwgaXQgd2lsbCBub3Qgc2V0IHZhbHVlcyB0byB0
aGUgbmV3CisgICAgaW5zdGFuY2UgZHVyaW5nIGluaXRpYWxpemF0aW9uOgogCi12YXIgRWFjaEFy
cmF5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5BcnJheSwgeworICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgbm9OYW1lID0gQXBwLlBlcnNvbi5jcmVhdGUoKTsKKyAgICBub05hbWUuaGVs
bG9Xb3JsZCgpOyAvLyBhbGVydHMgdW5kZWZpbmVkCisgICAgYGBgCiAKLSAgaW5pdDogZnVuY3Rp
b24oY29udGVudCwga2V5TmFtZSwgb3duZXIpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRo
aXMuX2tleU5hbWUgPSBrZXlOYW1lOwotICAgIHRoaXMuX293bmVyICAgPSBvd25lcjsKLSAgICB0
aGlzLl9jb250ZW50ID0gY29udGVudDsKLSAgfSwKKyAgICBOT1RFOiBGb3IgcGVyZm9ybWFuY2Ug
cmVhc29ucywgeW91IGNhbm5vdCBkZWNsYXJlIG1ldGhvZHMgb3IgY29tcHV0ZWQKKyAgICBwcm9w
ZXJ0aWVzIGR1cmluZyBgY3JlYXRlYC4gWW91IHNob3VsZCBpbnN0ZWFkIGRlY2xhcmUgbWV0aG9k
cyBhbmQgY29tcHV0ZWQKKyAgICBwcm9wZXJ0aWVzIHdoZW4gdXNpbmcgYGV4dGVuZGAgb3IgdXNl
IHRoZSBgY3JlYXRlV2l0aE1peGluc2Agc2hvcnRoYW5kLgogCi0gIG9iamVjdEF0OiBmdW5jdGlv
bihpZHgpIHsKLSAgICB2YXIgaXRlbSA9IHRoaXMuX2NvbnRlbnQub2JqZWN0QXQoaWR4KTsKLSAg
ICByZXR1cm4gaXRlbSAmJiBnZXQoaXRlbSwgdGhpcy5fa2V5TmFtZSk7CisgICAgQG1ldGhvZCBj
cmVhdGUKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIFthcmd1bWVudHNdKgorICAqLworICBjcmVh
dGU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBDID0gdGhpczsKKyAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aD4wKSB7IHRoaXMuX2luaXRQcm9wZXJ0aWVzKGFyZ3VtZW50cyk7IH0KKyAgICByZXR1cm4g
bmV3IEMoKTsKICAgfSwKIAotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewot
ICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudDsKLSAgICByZXR1cm4gY29udGVudCA/IGdl
dChjb250ZW50LCAnbGVuZ3RoJykgOiAwOwotICB9KQorICAvKioKKyAgICBBdWdtZW50cyBhIGNv
bnN0cnVjdG9yJ3MgcHJvdG90eXBlIHdpdGggYWRkaXRpb25hbAorICAgIHByb3BlcnRpZXMgYW5k
IGZ1bmN0aW9uczoKIAotfSk7CisgICAgYGBgamF2YXNjcmlwdAorICAgIE15T2JqZWN0ID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBuYW1lOiAnYW4gb2JqZWN0JworICAgIH0pOwogCi12
YXIgSVNfT0JTRVJWRVIgPSAvXi4rOihiZWZvcmV8Y2hhbmdlKSQvOworICAgIG8gPSBNeU9iamVj
dC5jcmVhdGUoKTsKKyAgICBvLmdldCgnbmFtZScpOyAvLyAnYW4gb2JqZWN0JwogCi1mdW5jdGlv
biBhZGRPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgcHJveHksIGlkeCwg
bG9jKSB7Ci0gIHZhciBvYmplY3RzID0gcHJveHkuX29iamVjdHMsIGd1aWQ7Ci0gIGlmICghb2Jq
ZWN0cykgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzID0ge307CisgICAgTXlPYmplY3QucmVvcGVu
KHsKKyAgICAgIHNheTogZnVuY3Rpb24obXNnKXsKKyAgICAgICAgY29uc29sZS5sb2cobXNnKTsK
KyAgICAgIH0KKyAgICB9KQogCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsKLSAgICB2YXIgaXRlbSA9
IGNvbnRlbnQub2JqZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewotICAgICAgRW1iZXIuYWRk
QmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5V2lsbENoYW5n
ZScpOwotICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250
ZW50S2V5RGlkQ2hhbmdlJyk7CisgICAgbzIgPSBNeU9iamVjdC5jcmVhdGUoKTsKKyAgICBvMi5z
YXkoImhlbGxvIik7IC8vIGxvZ3MgImhlbGxvIgogCi0gICAgICAvLyBrZWVwIHRyYWNrIG9mIHRo
ZSBpbmRpY2llcyBlYWNoIGl0ZW0gd2FzIGZvdW5kIGF0IHNvIHdlIGNhbiBtYXAKLSAgICAgIC8v
IGl0IGJhY2sgd2hlbiB0aGUgb2JqIGNoYW5nZXMuCi0gICAgICBndWlkID0gZ3VpZEZvcihpdGVt
KTsKLSAgICAgIGlmICghb2JqZWN0c1tndWlkXSkgb2JqZWN0c1tndWlkXSA9IFtdOwotICAgICAg
b2JqZWN0c1tndWlkXS5wdXNoKGxvYyk7Ci0gICAgfQotICB9Ci19CisgICAgby5zYXkoImdvb2Ri
eWUiKTsgLy8gbG9ncyAiZ29vZGJ5ZSIKKyAgICBgYGAKIAotZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2
ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHByb3h5LCBpZHgsIGxvYykgewotICB2
YXIgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzOwotICBpZiAoIW9iamVjdHMpIG9iamVjdHMgPSBw
cm94eS5fb2JqZWN0cyA9IHt9OwotICB2YXIgaW5kaWNpZXMsIGd1aWQ7CisgICAgVG8gYWRkIGZ1
bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0b3IgaXRzZWxmLAorICAgIHNl
ZSBgcmVvcGVuQ2xhc3NgCiAKLSAgd2hpbGUoLS1sb2M+PWlkeCkgewotICAgIHZhciBpdGVtID0g
Y29udGVudC5vYmplY3RBdChsb2MpOwotICAgIGlmIChpdGVtKSB7Ci0gICAgICBFbWJlci5yZW1v
dmVCZWZvcmVPYnNlcnZlcihpdGVtLCBrZXlOYW1lLCBwcm94eSwgJ2NvbnRlbnRLZXlXaWxsQ2hh
bmdlJyk7Ci0gICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBrZXlOYW1lLCBwcm94eSwg
J2NvbnRlbnRLZXlEaWRDaGFuZ2UnKTsKKyAgICBAbWV0aG9kIHJlb3BlbgorICAqLworICByZW9w
ZW46IGZ1bmN0aW9uKCkgeworICAgIHRoaXMud2lsbFJlb3BlbigpOworICAgIHJlb3Blbi5hcHBs
eSh0aGlzLlByb3RvdHlwZU1peGluLCBhcmd1bWVudHMpOworICAgIHJldHVybiB0aGlzOworICB9
LAogCi0gICAgICBndWlkID0gZ3VpZEZvcihpdGVtKTsKLSAgICAgIGluZGljaWVzID0gb2JqZWN0
c1tndWlkXTsKLSAgICAgIGluZGljaWVzW2luZGljaWVzLmluZGV4T2YobG9jKV0gPSBudWxsOwot
ICAgIH0KLSAgfQotfQorICAvKioKKyAgICBBdWdtZW50cyBhIGNvbnN0cnVjdG9yJ3Mgb3duIHBy
b3BlcnRpZXMgYW5kIGZ1bmN0aW9uczoKIAotLyoqCi0gIFRoaXMgaXMgdGhlIG9iamVjdCBpbnN0
YW5jZSByZXR1cm5lZCB3aGVuIHlvdSBnZXQgdGhlIGBAZWFjaGAgcHJvcGVydHkgb24gYW4KLSAg
YXJyYXkuIEl0IHVzZXMgdGhlIHVua25vd25Qcm9wZXJ0eSBoYW5kbGVyIHRvIGF1dG9tYXRpY2Fs
bHkgY3JlYXRlCi0gIEVhY2hBcnJheSBpbnN0YW5jZXMgZm9yIHByb3BlcnR5IG5hbWVzLgorICAg
IGBgYGphdmFzY3JpcHQKKyAgICBNeU9iamVjdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAg
ICAgbmFtZTogJ2FuIG9iamVjdCcKKyAgICB9KTsKIAotICBAcHJpdmF0ZQotICBAY2xhc3MgRWFj
aFByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwot
RW1iZXIuRWFjaFByb3h5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgTXlPYmplY3QucmVv
cGVuQ2xhc3MoeworICAgICAgY2FuQnVpbGQ6IGZhbHNlCisgICAgfSk7CiAKLSAgaW5pdDogZnVu
Y3Rpb24oY29udGVudCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5fY29udGVudCA9
IGNvbnRlbnQ7Ci0gICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMpOworICAgIE15T2Jq
ZWN0LmNhbkJ1aWxkOyAvLyBmYWxzZQorICAgIG8gPSBNeU9iamVjdC5jcmVhdGUoKTsKKyAgICBg
YGAKIAotICAgIC8vIGluIGNhc2Ugc29tZW9uZSBpcyBhbHJlYWR5IG9ic2VydmluZyBzb21lIGtl
eXMgbWFrZSBzdXJlIHRoZXkgYXJlCi0gICAgLy8gYWRkZWQKLSAgICBmb3JFYWNoKEVtYmVyLndh
dGNoZWRFdmVudHModGhpcyksIGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgICAgdGhpcy5kaWRB
ZGRMaXN0ZW5lcihldmVudE5hbWUpOwotICAgIH0sIHRoaXMpOwotICB9LAorICAgIEluIG90aGVy
IHdvcmRzLCB0aGlzIGNyZWF0ZXMgc3RhdGljIHByb3BlcnRpZXMgYW5kIGZ1bmN0aW9ucyBmb3Ig
dGhlIGNsYXNzLiBUaGVzZSBhcmUgb25seSBhdmFpbGFibGUgb24gdGhlIGNsYXNzCisgICAgYW5k
IG5vdCBvbiBhbnkgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KIAotICAvKioKLSAgICBZb3UgY2Fu
IGRpcmVjdGx5IGFjY2VzcyBtYXBwZWQgcHJvcGVydGllcyBieSBzaW1wbHkgcmVxdWVzdGluZyB0
aGVtLgotICAgIFRoZSBgdW5rbm93blByb3BlcnR5YCBoYW5kbGVyIHdpbGwgZ2VuZXJhdGUgYW4g
RWFjaEFycmF5IG9mIGVhY2ggaXRlbS4KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBlcnNv
biA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgbmFtZSA6ICIiLAorICAgICAgc2F5SGVs
bG8gOiBmdW5jdGlvbigpeworICAgICAgICBhbGVydCgiSGVsbG8uIE15IG5hbWUgaXMgIiArIHRo
aXMuZ2V0KCduYW1lJykpOworICAgICAgfQorICAgIH0pOwogCi0gICAgQG1ldGhvZCB1bmtub3du
UHJvcGVydHkKLSAgICBAcGFyYW0ga2V5TmFtZSB7U3RyaW5nfQotICAgIEBwYXJhbSB2YWx1ZSB7
YW55dGhpbmd9Ci0gICovCi0gIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSwgdmFs
dWUpIHsKLSAgICB2YXIgcmV0OwotICAgIHJldCA9IG5ldyBFYWNoQXJyYXkodGhpcy5fY29udGVu
dCwga2V5TmFtZSwgdGhpcyk7Ci0gICAgRW1iZXIuZGVmaW5lUHJvcGVydHkodGhpcywga2V5TmFt
ZSwgbnVsbCwgcmV0KTsKLSAgICB0aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShrZXlOYW1l
KTsKLSAgICByZXR1cm4gcmV0OwotICB9LAorICAgIEFwcC5QZXJzb24ucmVvcGVuQ2xhc3Moewor
ICAgICAgc3BlY2llcyA6ICJIb21vIHNhcGllbnMiLAorICAgICAgY3JlYXRlUGVyc29uOiBmdW5j
dGlvbihuZXdQZXJzb25zTmFtZSl7CisgICAgICAgIHJldHVybiBBcHAuUGVyc29uLmNyZWF0ZSh7
CisgICAgICAgICAgbmFtZTpuZXdQZXJzb25zTmFtZQorICAgICAgICB9KTsKKyAgICAgIH0KKyAg
ICB9KTsKIAotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uCi0gIC8vIEFSUkFZIENIQU5HRVMKLSAgLy8gSW52b2tlcyB3aGVuZXZl
ciB0aGUgY29udGVudCBhcnJheSBpdHNlbGYgY2hhbmdlcy4KKyAgICB2YXIgdG9tID0gQXBwLlBl
cnNvbi5jcmVhdGUoeworICAgICAgbmFtZSA6ICJUb20gRGFsZSIKKyAgICB9KTsKKyAgICB2YXIg
eWVodWRhID0gQXBwLlBlcnNvbi5jcmVhdGVQZXJzb24oIlllaHVkYSBLYXR6Iik7CiAKLSAgYXJy
YXlXaWxsQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250
KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzLCBrZXksIGFycmF5LCBsaW07CisgICAgdG9t
LnNheUhlbGxvKCk7IC8vICJIZWxsby4gTXkgbmFtZSBpcyBUb20gRGFsZSIKKyAgICB5ZWh1ZGEu
c2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBLYXR6IgorICAgIGFsZXJ0
KEFwcC5QZXJzb24uc3BlY2llcyk7IC8vICJIb21vIHNhcGllbnMiCisgICAgYGBgCiAKLSAgICBs
aW0gPSByZW1vdmVkQ250PjAgPyBpZHgrcmVtb3ZlZENudCA6IC0xOwotICAgIEVtYmVyLmJlZ2lu
UHJvcGVydHlDaGFuZ2VzKHRoaXMpOworICAgIE5vdGUgdGhhdCBgc3BlY2llc2AgYW5kIGBjcmVh
dGVQZXJzb25gIGFyZSAqbm90KiB2YWxpZCBvbiB0aGUgYHRvbWAgYW5kIGB5ZWh1ZGFgCisgICAg
dmFyaWFibGVzLiBUaGV5IGFyZSBvbmx5IHZhbGlkIG9uIGBBcHAuUGVyc29uYC4KIAotICAgIGZv
cihrZXkgaW4ga2V5cykgewotICAgICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsg
Y29udGludWU7IH0KKyAgICBUbyBhZGQgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRvIGluc3Rh
bmNlcyBvZgorICAgIGEgY29uc3RydWN0b3IgYnkgZXh0ZW5kaW5nIHRoZSBjb25zdHJ1Y3Rvcidz
IHByb3RvdHlwZQorICAgIHNlZSBgcmVvcGVuYAogCi0gICAgICBpZiAobGltPjApIHJlbW92ZU9i
c2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsKKyAgICBA
bWV0aG9kIHJlb3BlbkNsYXNzCisgICovCisgIHJlb3BlbkNsYXNzOiBmdW5jdGlvbigpIHsKKyAg
ICByZW9wZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBhcmd1bWVudHMpOworICAgIGFwcGx5TWl4
aW4odGhpcywgYXJndW1lbnRzLCBmYWxzZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLSAg
ICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXkpOworICBkZXRlY3Q6IGZ1bmN0
aW9uKG9iaikgeworICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2Ygb2JqKSB7IHJldHVybiBm
YWxzZTsgfQorICAgIHdoaWxlKG9iaikgeworICAgICAgaWYgKG9iaj09PXRoaXMpIHsgcmV0dXJu
IHRydWU7IH0KKyAgICAgIG9iaiA9IG9iai5zdXBlcmNsYXNzOwogICAgIH0KKyAgICByZXR1cm4g
ZmFsc2U7CisgIH0sCiAKLSAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcy5fY29udGVu
dCwgJ0BlYWNoJyk7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOworICBkZXRl
Y3RJbnN0YW5jZTogZnVuY3Rpb24ob2JqKSB7CisgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHRo
aXM7CiAgIH0sCiAKLSAgYXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQsIGlkeCwgcmVt
b3ZlZENudCwgYWRkZWRDbnQpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMuX2tleXMsIGtleSwgYXJy
YXksIGxpbTsKKyAgLyoqCisgICAgSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGFubm90
YXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aCBhZGRpdGlvbmFsCisgICAgbWV0YWRhdGEgYWJv
dXQgaG93IHRoZXkgZnVuY3Rpb24gb3Igd2hhdCB2YWx1ZXMgdGhleSBvcGVyYXRlIG9uLiBGb3IK
KyAgICBleGFtcGxlLCBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIg
dmFyaWFibGVzIHRoYXQgYXJlIHRoZW4KKyAgICBubyBsb25nZXIgYXZhaWxhYmxlIGZvciBpbnRy
b3NwZWN0aW9uLgogCi0gICAgbGltID0gYWRkZWRDbnQ+MCA/IGlkeCthZGRlZENudCA6IC0xOwot
ICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOworICAgIFlvdSBjYW4gcGFzcyBh
IGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVydHkgbGlrZSB0aGlzOgog
Ci0gICAgZm9yKGtleSBpbiBrZXlzKSB7Ci0gICAgICBpZiAoIWtleXMuaGFzT3duUHJvcGVydHko
a2V5KSkgeyBjb250aW51ZTsgfQorICAgIGBgYGphdmFzY3JpcHQKKyAgICBwZXJzb246IGZ1bmN0
aW9uKCkgeworICAgICAgdmFyIHBlcnNvbklkID0gdGhpcy5nZXQoJ3BlcnNvbklkJyk7CisgICAg
ICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgICAgfS5wcm9w
ZXJ0eSgpLm1ldGEoeyB0eXBlOiBBcHAuUGVyc29uIH0pCisgICAgYGBgCiAKLSAgICAgIGlmIChs
aW0+MCkgYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleSwgdGhpcywgaWR4LCBs
aW0pOworICAgIE9uY2UgeW91J3ZlIGRvbmUgdGhpcywgeW91IGNhbiByZXRyaWV2ZSB0aGUgdmFs
dWVzIHNhdmVkIHRvIHRoZSBjb21wdXRlZAorICAgIHByb3BlcnR5IGZyb20geW91ciBjbGFzcyBs
aWtlIHRoaXM6CiAKLSAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleSk7Ci0g
ICAgfQorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeUNsYXNzLm1ldGFGb3JQcm9wZXJ0eSgncGVy
c29uJyk7CisgICAgYGBgCiAKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLl9jb250
ZW50LCAnQGVhY2gnKTsKLSAgICBFbWJlci5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyk7Ci0gIH0s
CisgICAgVGhpcyB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgaGFzaCB0aGF0IHdhcyBwYXNzZWQg
dG8gYG1ldGEoKWAuCiAKLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBMSVNURU4gRk9SIE5FVyBPQlNFUlZFUlMgQU5E
IE9USEVSIEVWRU5UIExJU1RFTkVSUwotICAvLyBTdGFydCBtb25pdG9yaW5nIGtleXMgYmFzZWQg
b24gd2hvIGlzIGxpc3RlbmluZy4uLgorICAgIEBtZXRob2QgbWV0YUZvclByb3BlcnR5CisgICAg
QHBhcmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lCisgICovCisgIG1ldGFGb3JQcm9wZXJ0
eTogZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIGRlc2MgPSBtZXRhKHRoaXMucHJvdG8oKSwgZmFs
c2UpLmRlc2NzW2tleV07CiAKLSAgZGlkQWRkTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSkg
ewotICAgIGlmIChJU19PQlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsKLSAgICAgIHRoaXMuYmVn
aW5PYnNlcnZpbmdDb250ZW50S2V5KGV2ZW50TmFtZS5zbGljZSgwLCAtNykpOwotICAgIH0KKyAg
ICBFbWJlci5hc3NlcnQoIm1ldGFGb3JQcm9wZXJ0eSgpIGNvdWxkIG5vdCBmaW5kIGEgY29tcHV0
ZWQgcHJvcGVydHkgd2l0aCBrZXkgJyIra2V5KyInLiIsICEhZGVzYyAmJiBkZXNjIGluc3RhbmNl
b2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSk7CisgICAgcmV0dXJuIGRlc2MuX21ldGEgfHwge307
CiAgIH0sCiAKLSAgZGlkUmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAg
IGlmIChJU19PQlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsKLSAgICAgIHRoaXMuc3RvcE9ic2Vy
dmluZ0NvbnRlbnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03KSk7Ci0gICAgfQotICB9LAorICAv
KioKKyAgICBJdGVyYXRlIG92ZXIgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSBmb3IgdGhlIGNsYXNz
LCBwYXNzaW5nIGl0cyBuYW1lCisgICAgYW5kIGFueSBhc3NvY2lhdGVkIG1ldGFkYXRhIChzZWUg
YG1ldGFGb3JQcm9wZXJ0eWApIHRvIHRoZSBjYWxsYmFjay4KIAotICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIENPTlRF
TlQgS0VZIE9CU0VSVklORwotICAvLyBBY3R1YWwgd2F0Y2gga2V5cyBvbiB0aGUgc291cmNlIGNv
bnRlbnQuCisgICAgQG1ldGhvZCBlYWNoQ29tcHV0ZWRQcm9wZXJ0eQorICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrCisgICAgQHBhcmFtIHtPYmplY3R9IGJpbmRpbmcKKyAgKi8KKyAgZWFj
aENvbXB1dGVkUHJvcGVydHk6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgdmFy
IHByb3RvID0gdGhpcy5wcm90bygpLAorICAgICAgICBkZXNjcyA9IG1ldGEocHJvdG8pLmRlc2Nz
LAorICAgICAgICBlbXB0eSA9IHt9LAorICAgICAgICBwcm9wZXJ0eTsKIAotICBiZWdpbk9ic2Vy
dmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMu
X2tleXM7Ci0gICAgaWYgKCFrZXlzKSBrZXlzID0gdGhpcy5fa2V5cyA9IHt9OwotICAgIGlmICgh
a2V5c1trZXlOYW1lXSkgewotICAgICAga2V5c1trZXlOYW1lXSA9IDE7Ci0gICAgICB2YXIgY29u
dGVudCA9IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVuID0gZ2V0KGNvbnRlbnQsICdsZW5n
dGgnKTsKLSAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCB0
aGlzLCAwLCBsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXlzW2tleU5hbWVdKys7Ci0gICAg
fQotICB9LAorICAgIGZvciAodmFyIG5hbWUgaW4gZGVzY3MpIHsKKyAgICAgIHByb3BlcnR5ID0g
ZGVzY3NbbmFtZV07CiAKLSAgc3RvcE9ic2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5h
bWUpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7Ci0gICAgaWYgKGtleXMgJiYgKGtleXNb
a2V5TmFtZV0+MCkgJiYgKC0ta2V5c1trZXlOYW1lXTw9MCkpIHsKLSAgICAgIHZhciBjb250ZW50
ID0gdGhpcy5fY29udGVudCwKLSAgICAgICAgICBsZW4gICAgID0gZ2V0KGNvbnRlbnQsICdsZW5n
dGgnKTsKLSAgICAgIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1l
LCB0aGlzLCAwLCBsZW4pOworICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRW1iZXIuQ29t
cHV0ZWRQcm9wZXJ0eSkgeworICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcgfHwgdGhpcywg
bmFtZSwgcHJvcGVydHkuX21ldGEgfHwgZW1wdHkpOworICAgICAgfQogICAgIH0KLSAgfSwKLQot
ICBjb250ZW50S2V5V2lsbENoYW5nZTogZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gICAgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIGNvbnRlbnRL
ZXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAgIEVtYmVyLnByb3BlcnR5
RGlkQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwogICB9CiAKIH0pOwogCitDbGFzc01peGluLm93bmVy
Q29uc3RydWN0b3IgPSBDb3JlT2JqZWN0OworCitpZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlQ2xh
c3NNaXhpbikgeworICBFbWJlci5jb25maWcub3ZlcnJpZGVDbGFzc01peGluKENsYXNzTWl4aW4p
OworfQorCitDb3JlT2JqZWN0LkNsYXNzTWl4aW4gPSBDbGFzc01peGluOworQ2xhc3NNaXhpbi5h
cHBseShDb3JlT2JqZWN0KTsKIAorRW1iZXIuQ29yZU9iamVjdCA9IENvcmVPYmplY3Q7CiAKIH0p
KCk7CiAKQEAgLTExNzU5LDMxNiArMTI5NTIsMzc4IEBAIEVtYmVyLkVhY2hQcm94eSA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoewogQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiAqLwogCisvKioKKyAg
YEVtYmVyLk9iamVjdGAgaXMgdGhlIG1haW4gYmFzZSBjbGFzcyBmb3IgYWxsIEVtYmVyIG9iamVj
dHMuIEl0IGlzIGEgc3ViY2xhc3MKKyAgb2YgYEVtYmVyLkNvcmVPYmplY3RgIHdpdGggdGhlIGBF
bWJlci5PYnNlcnZhYmxlYCBtaXhpbiBhcHBsaWVkLiBGb3IgZGV0YWlscywKKyAgc2VlIHRoZSBk
b2N1bWVudGF0aW9uIGZvciBlYWNoIG9mIHRoZXNlLgogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci0KLS8vIEFkZCBFbWJlci5BcnJheSB0byBBcnJheS5wcm90b3R5cGUu
IFJlbW92ZSBtZXRob2RzIHdpdGggbmF0aXZlCi0vLyBpbXBsZW1lbnRhdGlvbnMgYW5kIHN1cHBs
eSBzb21lIG1vcmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGdlbmVyaWMgbWV0aG9kcwotLy8gYmVj
YXVzZSB0aGV5IGFyZSBzbyBjb21tb24uCi12YXIgTmF0aXZlQXJyYXkgPSBFbWJlci5NaXhpbi5j
cmVhdGUoRW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNlcnZhYmxlLCBFbWJlci5Db3B5YWJs
ZSwgewotCi0gIC8vIGJlY2F1c2UgbGVuZ3RoIGlzIGEgYnVpbHQtaW4gcHJvcGVydHkgd2UgbmVl
ZCB0byBrbm93IHRvIGp1c3QgZ2V0IHRoZQotICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KLSAgZ2V0
OiBmdW5jdGlvbihrZXkpIHsKLSAgICBpZiAoa2V5PT09J2xlbmd0aCcpIHJldHVybiB0aGlzLmxl
bmd0aDsKLSAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGtleSkgcmV0dXJuIHRoaXNb
a2V5XTsKLSAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlcihrZXkpOwotICB9LAorICBAY2xhc3Mg
T2JqZWN0CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuQ29yZU9iamVjdAor
ICBAdXNlcyBFbWJlci5PYnNlcnZhYmxlCisqLworRW1iZXIuT2JqZWN0ID0gRW1iZXIuQ29yZU9i
amVjdC5leHRlbmQoRW1iZXIuT2JzZXJ2YWJsZSk7CitFbWJlci5PYmplY3QudG9TdHJpbmcgPSBm
dW5jdGlvbigpIHsgcmV0dXJuICJFbWJlci5PYmplY3QiOyB9OwogCi0gIG9iamVjdEF0OiBmdW5j
dGlvbihpZHgpIHsKLSAgICByZXR1cm4gdGhpc1tpZHhdOwotICB9LAorfSkoKTsKIAotICAvLyBw
cmltaXRpdmUgZm9yIGFycmF5IHN1cHBvcnQuCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKGlkeCwgYW10
LCBvYmplY3RzKSB7CiAKLSAgICBpZiAodGhpcy5pc0Zyb3plbikgdGhyb3cgRW1iZXIuRlJPWkVO
X0VSUk9SIDsKIAotICAgIC8vIGlmIHdlIHJlcGxhY2VkIGV4YWN0bHkgdGhlIHNhbWUgbnVtYmVy
IG9mIGl0ZW1zLCB0aGVuIHBhc3Mgb25seSB0aGUKLSAgICAvLyByZXBsYWNlZCByYW5nZS4gT3Ro
ZXJ3aXNlLCBwYXNzIHRoZSBmdWxsIHJlbWFpbmluZyBhcnJheSBsZW5ndGgKLSAgICAvLyBzaW5j
ZSBldmVyeXRoaW5nIGhhcyBzaGlmdGVkCi0gICAgdmFyIGxlbiA9IG9iamVjdHMgPyBnZXQob2Jq
ZWN0cywgJ2xlbmd0aCcpIDogMDsKLSAgICB0aGlzLmFycmF5Q29udGVudFdpbGxDaGFuZ2UoaWR4
LCBhbXQsIGxlbik7CisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1
bGUgZW1iZXItcnVudGltZQorKi8KIAotICAgIGlmICghb2JqZWN0cyB8fCBvYmplY3RzLmxlbmd0
aCA9PT0gMCkgewotICAgICAgdGhpcy5zcGxpY2UoaWR4LCBhbXQpIDsKLSAgICB9IGVsc2Ugewot
ICAgICAgdmFyIGFyZ3MgPSBbaWR4LCBhbXRdLmNvbmNhdChvYmplY3RzKSA7Ci0gICAgICB0aGlz
LnNwbGljZS5hcHBseSh0aGlzLGFyZ3MpIDsKLSAgICB9Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBp
bmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKIAotICAgIHRoaXMuYXJyYXlD
b250ZW50RGlkQ2hhbmdlKGlkeCwgYW10LCBsZW4pOwotICAgIHJldHVybiB0aGlzIDsKLSAgfSwK
Ky8qKgorICBBIE5hbWVzcGFjZSBpcyBhbiBvYmplY3QgdXN1YWxseSB1c2VkIHRvIGNvbnRhaW4g
b3RoZXIgb2JqZWN0cyBvciBtZXRob2RzCisgIHN1Y2ggYXMgYW4gYXBwbGljYXRpb24gb3IgZnJh
bWV3b3JrLiBDcmVhdGUgYSBuYW1lc3BhY2UgYW55dGltZSB5b3Ugd2FudAorICB0byBkZWZpbmUg
b25lIG9mIHRoZXNlIG5ldyBjb250YWluZXJzLgogCi0gIC8vIElmIHlvdSBhc2sgZm9yIGFuIHVu
a25vd24gcHJvcGVydHksIHRoZW4gdHJ5IHRvIGNvbGxlY3QgdGhlIHZhbHVlCi0gIC8vIGZyb20g
bWVtYmVyIGl0ZW1zLgotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
LSAgICB2YXIgcmV0Oy8vID0gdGhpcy5yZWR1Y2VkUHJvcGVydHkoa2V5LCB2YWx1ZSkgOwotICAg
IGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCkgJiYgcmV0ID09PSB1bmRlZmluZWQpIHsKLSAgICAg
IHJldCA9IHRoaXNba2V5XSA9IHZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKLSAgfSwK
KyAgIyBFeGFtcGxlIFVzYWdlCiAKLSAgLy8gSWYgYnJvd3NlciBkaWQgbm90IGltcGxlbWVudCBp
bmRleE9mIG5hdGl2ZWx5LCB0aGVuIG92ZXJyaWRlIHdpdGgKLSAgLy8gc3BlY2lhbGl6ZWQgdmVy
c2lvbgotICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4
LCBsZW4gPSB0aGlzLmxlbmd0aDsKKyAgYGBgamF2YXNjcmlwdAorICBNeUZyYW1ld29yayA9IEVt
YmVyLk5hbWVzcGFjZS5jcmVhdGUoeworICAgIFZFUlNJT046ICcxLjAuMCcKKyAgfSk7CisgIGBg
YAogCi0gICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgc3RhcnRBdCA9IDA7Ci0gICAgZWxz
ZSBzdGFydEF0ID0gKHN0YXJ0QXQgPCAwKSA/IE1hdGguY2VpbChzdGFydEF0KSA6IE1hdGguZmxv
b3Ioc3RhcnRBdCk7Ci0gICAgaWYgKHN0YXJ0QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKKyAgQGNs
YXNzIE5hbWVzcGFjZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk9iamVj
dAorKi8KK3ZhciBOYW1lc3BhY2UgPSBFbWJlci5OYW1lc3BhY2UgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKKyAgaXNOYW1lc3BhY2U6IHRydWUsCiAKLSAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4PGxl
bjtpZHgrKykgewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsK
LSAgICB9Ci0gICAgcmV0dXJuIC0xOworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5O
YW1lc3BhY2UuTkFNRVNQQUNFUy5wdXNoKHRoaXMpOworICAgIEVtYmVyLk5hbWVzcGFjZS5QUk9D
RVNTRUQgPSBmYWxzZTsKICAgfSwKIAotICBsYXN0SW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBz
dGFydEF0KSB7Ci0gICAgdmFyIGlkeCwgbGVuID0gdGhpcy5sZW5ndGg7CisgIHRvU3RyaW5nOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOworICAgIGlmIChu
YW1lKSB7IHJldHVybiBuYW1lOyB9CiAKLSAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkKSBz
dGFydEF0ID0gbGVuLTE7Ci0gICAgZWxzZSBzdGFydEF0ID0gKHN0YXJ0QXQgPCAwKSA/IE1hdGgu
Y2VpbChzdGFydEF0KSA6IE1hdGguZmxvb3Ioc3RhcnRBdCk7Ci0gICAgaWYgKHN0YXJ0QXQgPCAw
KSBzdGFydEF0ICs9IGxlbjsKKyAgICBmaW5kTmFtZXNwYWNlcygpOworICAgIHJldHVybiB0aGlz
W0VtYmVyLkdVSURfS0VZKydfbmFtZSddOworICB9LAogCi0gICAgZm9yKGlkeD1zdGFydEF0O2lk
eD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4
IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOworICBuYW1lQ2xhc3NlczogZnVuY3Rpb24oKSB7Cisg
ICAgcHJvY2Vzc05hbWVzcGFjZShbdGhpcy50b1N0cmluZygpXSwgdGhpcywge30pOwogICB9LAog
Ci0gIGNvcHk6IGZ1bmN0aW9uKGRlZXApIHsKLSAgICBpZiAoZGVlcCkgewotICAgICAgcmV0dXJu
IHRoaXMubWFwKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gRW1iZXIuY29weShpdGVtLCB0cnVlKTsg
fSk7CisgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIHZhciBuYW1lc3BhY2VzID0gRW1iZXIu
TmFtZXNwYWNlLk5BTUVTUEFDRVM7CisgICAgRW1iZXIubG9va3VwW3RoaXMudG9TdHJpbmcoKV0g
PSB1bmRlZmluZWQ7CisgICAgbmFtZXNwYWNlcy5zcGxpY2UoaW5kZXhPZi5jYWxsKG5hbWVzcGFj
ZXMsIHRoaXMpLCAxKTsKKyAgICB0aGlzLl9zdXBlcigpOworICB9Cit9KTsKKworTmFtZXNwYWNl
LnJlb3BlbkNsYXNzKHsKKyAgTkFNRVNQQUNFUzogW0VtYmVyXSwKKyAgTkFNRVNQQUNFU19CWV9J
RDoge30sCisgIFBST0NFU1NFRDogZmFsc2UsCisgIHByb2Nlc3NBbGw6IHByb2Nlc3NBbGxOYW1l
c3BhY2VzLAorICBieU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICBpZiAoIUVtYmVyLkJPT1RF
RCkgeworICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKICAgICB9CiAKLSAgICByZXR1cm4g
dGhpcy5zbGljZSgpOworICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lEW25hbWVdOwogICB9CiB9
KTsKIAotLy8gUmVtb3ZlIGFueSBtZXRob2RzIGltcGxlbWVudGVkIG5hdGl2ZWx5IHNvIHdlIGRv
bid0IG92ZXJyaWRlIHRoZW0KLXZhciBpZ25vcmUgPSBbJ2xlbmd0aCddOwotRW1iZXIuRW51bWVy
YWJsZVV0aWxzLmZvckVhY2goTmF0aXZlQXJyYXkua2V5cygpLCBmdW5jdGlvbihtZXRob2ROYW1l
KSB7Ci0gIGlmIChBcnJheS5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIGlnbm9yZS5wdXNoKG1ldGhv
ZE5hbWUpOwotfSk7Cit2YXIgTkFNRVNQQUNFU19CWV9JRCA9IE5hbWVzcGFjZS5OQU1FU1BBQ0VT
X0JZX0lEOwogCi1pZiAoaWdub3JlLmxlbmd0aD4wKSB7Ci0gIE5hdGl2ZUFycmF5ID0gTmF0aXZl
QXJyYXkud2l0aG91dC5hcHBseShOYXRpdmVBcnJheSwgaWdub3JlKTsKLX0KK3ZhciBoYXNPd25Q
cm9wID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKKyAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZvcjsK
IAotLyoqCi0gIFRoZSBOYXRpdmVBcnJheSBtaXhpbiBjb250YWlucyB0aGUgcHJvcGVydGllcyBu
ZWVkZWQgdG8gdG8gbWFrZSB0aGUgbmF0aXZlCi0gIEFycmF5IHN1cHBvcnQgRW1iZXIuTXV0YWJs
ZUFycmF5IGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBBUElzLiBVbmxlc3MgeW91Ci0gIGhhdmUg
YEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJh
eWAgc2V0IHRvCi0gIGZhbHNlLCB0aGlzIHdpbGwgYmUgYXBwbGllZCBhdXRvbWF0aWNhbGx5LiBP
dGhlcndpc2UgeW91IGNhbiBhcHBseSB0aGUgbWl4aW4KLSAgYXQgYW55dGltZSBieSBjYWxsaW5n
IGBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZWAuCitmdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNl
KHBhdGhzLCByb290LCBzZWVuKSB7CisgIHZhciBpZHggPSBwYXRocy5sZW5ndGg7CiAKLSAgQGNs
YXNzIE5hdGl2ZUFycmF5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuTWl4
aW4KLSAgQHVzZXMgRW1iZXIuTXV0YWJsZUFycmF5Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVFbnVt
ZXJhYmxlCi0gIEB1c2VzIEVtYmVyLkNvcHlhYmxlCi0gIEB1c2VzIEVtYmVyLkZyZWV6YWJsZQot
Ki8KLUVtYmVyLk5hdGl2ZUFycmF5ID0gTmF0aXZlQXJyYXk7CisgIE5BTUVTUEFDRVNfQllfSURb
cGF0aHMuam9pbignLicpXSA9IHJvb3Q7CiAKLS8qKgotICBDcmVhdGVzIGFuIGBFbWJlci5OYXRp
dmVBcnJheWAgZnJvbSBhbiBBcnJheSBsaWtlIG9iamVjdC4KLSAgRG9lcyBub3QgbW9kaWZ5IHRo
ZSBvcmlnaW5hbCBvYmplY3QuCisgIC8vIExvb3Agb3ZlciBhbGwgb2YgdGhlIGtleXMgaW4gdGhl
IG5hbWVzcGFjZSwgbG9va2luZyBmb3IgY2xhc3NlcworICBmb3IodmFyIGtleSBpbiByb290KSB7
CisgICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwocm9vdCwga2V5KSkgeyBjb250aW51ZTsgfQorICAg
IHZhciBvYmogPSByb290W2tleV07CiAKLSAgQG1ldGhvZCBBCi0gIEBmb3IgRW1iZXIKLSAgQHJl
dHVybiB7RW1iZXIuTmF0aXZlQXJyYXl9Ci0qLwotRW1iZXIuQSA9IGZ1bmN0aW9uKGFycil7Ci0g
IGlmIChhcnIgPT09IHVuZGVmaW5lZCkgeyBhcnIgPSBbXTsgfQotICByZXR1cm4gRW1iZXIuQXJy
YXkuZGV0ZWN0KGFycikgPyBhcnIgOiBFbWJlci5OYXRpdmVBcnJheS5hcHBseShhcnIpOwotfTsK
KyAgICAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgYEVtYmVyYCBuYW1lc3BhY2UsIGZvciBl
eGFtcGxlLCB0aGUKKyAgICAvLyBgcGF0aHNgIHdpbGwgc3RhcnQgd2l0aCBgWyJFbWJlciJdYC4g
RXZlcnkgaXRlcmF0aW9uIHRocm91Z2gKKyAgICAvLyB0aGUgbG9vcCB3aWxsIHVwZGF0ZSB0aGUg
KipzZWNvbmQqKiBlbGVtZW50IG9mIHRoaXMgbGlzdCB3aXRoCisgICAgLy8gdGhlIGtleSwgc28g
cHJvY2Vzc2luZyBgRW1iZXIuVmlld2Agd2lsbCBtYWtlIHRoZSBBcnJheQorICAgIC8vIGBbJ0Vt
YmVyJywgJ1ZpZXcnXWAuCisgICAgcGF0aHNbaWR4XSA9IGtleTsKIAotLyoqCi0gIEFjdGl2YXRl
cyB0aGUgbWl4aW4gb24gdGhlIEFycmF5LnByb3RvdHlwZSBpZiBub3QgYWxyZWFkeSBhcHBsaWVk
LiBDYWxsaW5nCi0gIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlIGlzIHNhZmUuCisgICAgLy8g
SWYgd2UgaGF2ZSBmb3VuZCBhbiB1bnByb2Nlc3NlZCBjbGFzcworICAgIGlmIChvYmogJiYgb2Jq
LnRvU3RyaW5nID09PSBjbGFzc1RvU3RyaW5nKSB7CisgICAgICAvLyBSZXBsYWNlIHRoZSBjbGFz
cycgYHRvU3RyaW5nYCB3aXRoIHRoZSBkb3Qtc2VwYXJhdGVkIHBhdGgKKyAgICAgIC8vIGFuZCBz
ZXQgaXRzIGBOQU1FX0tFWWAKKyAgICAgIG9iai50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhwYXRo
cy5qb2luKCcuJykpOworICAgICAgb2JqW05BTUVfS0VZXSA9IHBhdGhzLmpvaW4oJy4nKTsKIAot
ICBAbWV0aG9kIGFjdGl2YXRlCi0gIEBmb3IgRW1iZXIuTmF0aXZlQXJyYXkKLSAgQHN0YXRpYwot
ICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlID0gZnVuY3Rp
b24oKSB7Ci0gIE5hdGl2ZUFycmF5LmFwcGx5KEFycmF5LnByb3RvdHlwZSk7CisgICAgLy8gU3Vw
cG9ydCBuZXN0ZWQgbmFtZXNwYWNlcworICAgIH0gZWxzZSBpZiAob2JqICYmIG9iai5pc05hbWVz
cGFjZSkgeworICAgICAgLy8gU2tpcCBhbGlhc2VkIG5hbWVzcGFjZXMKKyAgICAgIGlmIChzZWVu
W2d1aWRGb3Iob2JqKV0pIHsgY29udGludWU7IH0KKyAgICAgIHNlZW5bZ3VpZEZvcihvYmopXSA9
IHRydWU7CiAKLSAgRW1iZXIuQSA9IGZ1bmN0aW9uKGFycikgeyByZXR1cm4gYXJyIHx8IFtdOyB9
OwotfTsKKyAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxkIG5hbWVzcGFjZQorICAgICAgcHJvY2Vz
c05hbWVzcGFjZShwYXRocywgb2JqLCBzZWVuKTsKKyAgICB9CisgIH0KIAotaWYgKEVtYmVyLkVY
VEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkFycmF5
KSB7Ci0gIEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlKCk7CisgIHBhdGhzLmxlbmd0aCA9IGlk
eDsgLy8gY3V0IG91dCBsYXN0IGl0ZW0KIH0KIAorZnVuY3Rpb24gZmluZE5hbWVzcGFjZXMoKSB7
CisgIHZhciBOYW1lc3BhY2UgPSBFbWJlci5OYW1lc3BhY2UsIGxvb2t1cCA9IEVtYmVyLmxvb2t1
cCwgb2JqLCBpc05hbWVzcGFjZTsKIAotfSkoKTsKLQorICBpZiAoTmFtZXNwYWNlLlBST0NFU1NF
RCkgeyByZXR1cm47IH0KIAorICBmb3IgKHZhciBwcm9wIGluIGxvb2t1cCkgeworICAgIC8vIFRo
ZXNlIGRvbid0IHJhaXNlIGV4Y2VwdGlvbnMgYnV0IGNhbiBjYXVzZSB3YXJuaW5ncworICAgIGlm
IChwcm9wID09PSAicGFyZW50IiB8fCBwcm9wID09PSAidG9wIiB8fCBwcm9wID09PSAiZnJhbWVF
bGVtZW50IiB8fCBwcm9wID09PSAid2Via2l0U3RvcmFnZUluZm8iKSB7IGNvbnRpbnVlOyB9CiAK
LShmdW5jdGlvbigpIHsKLXZhciBEZWZlcnJlZE1peGluID0gRW1iZXIuRGVmZXJyZWRNaXhpbiwg
Ly8gbWl4aW5zL2RlZmVycmVkCi0gICAgRW1iZXJPYmplY3QgPSBFbWJlci5PYmplY3QsICAgICAg
ICAgIC8vIHN5c3RlbS9vYmplY3QKLSAgICBnZXQgPSBFbWJlci5nZXQ7CisgICAgLy8gIGdldCh3
aW5kb3cuZ2xvYmFsU3RvcmFnZSwgJ2lzTmFtZXNwYWNlJykgd291bGQgdHJ5IHRvIHJlYWQgdGhl
IHN0b3JhZ2UgZm9yIGRvbWFpbiBpc05hbWVzcGFjZSBhbmQgY2F1c2UgZXhjZXB0aW9uIGluIEZp
cmVmb3guCisgICAgLy8gZ2xvYmFsU3RvcmFnZSBpcyBhIHN0b3JhZ2Ugb2Jzb2xldGVkIGJ5IHRo
ZSBXaGF0V0cgc3RvcmFnZSBzcGVjaWZpY2F0aW9uLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96
aWxsYS5vcmcvZW4vRE9NL1N0b3JhZ2UjZ2xvYmFsU3RvcmFnZQorICAgIGlmIChwcm9wID09PSAi
Z2xvYmFsU3RvcmFnZSIgJiYgbG9va3VwLlN0b3JhZ2VMaXN0ICYmIGxvb2t1cC5nbG9iYWxTdG9y
YWdlIGluc3RhbmNlb2YgbG9va3VwLlN0b3JhZ2VMaXN0KSB7IGNvbnRpbnVlOyB9CisgICAgLy8g
VW5mb3J0dW5hdGVseSwgc29tZSB2ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHdpbmRvdy5o
YXNPd25Qcm9wZXJ0eQorICAgIGlmIChsb29rdXAuaGFzT3duUHJvcGVydHkgJiYgIWxvb2t1cC5o
YXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZTsgfQogCi12YXIgRGVmZXJyZWQgPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKERlZmVycmVkTWl4aW4pOworICAgIC8vIEF0IHRpbWVzIHdlIGFyZSBu
b3QgYWxsb3dlZCB0byBhY2Nlc3MgY2VydGFpbiBwcm9wZXJ0aWVzIGZvciBzZWN1cml0eSByZWFz
b25zLgorICAgIC8vIFRoZXJlIGFyZSBhbHNvIHRpbWVzIHdoZXJlIGV2ZW4gaWYgd2UgY2FuIGFj
Y2VzcyB0aGVtLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZWlyIHByb3BlcnRpZXMu
CisgICAgdHJ5IHsKKyAgICAgIG9iaiA9IEVtYmVyLmxvb2t1cFtwcm9wXTsKKyAgICAgIGlzTmFt
ZXNwYWNlID0gb2JqICYmIG9iai5pc05hbWVzcGFjZTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAg
ICBjb250aW51ZTsKKyAgICB9CiAKLURlZmVycmVkLnJlb3BlbkNsYXNzKHsKLSAgcHJvbWlzZTog
ZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB2YXIgZGVmZXJyZWQgPSBEZWZlcnJl
ZC5jcmVhdGUoKTsKLSAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIGRlZmVycmVkKTsKLSAgICBy
ZXR1cm4gZ2V0KGRlZmVycmVkLCAncHJvbWlzZScpOworICAgIGlmIChpc05hbWVzcGFjZSkgewor
ICAgICAgRW1iZXIuZGVwcmVjYXRlKCJOYW1lc3BhY2VzIHNob3VsZCBub3QgYmVnaW4gd2l0aCBs
b3dlcmNhc2UuIiwgL15bQS1aXS8udGVzdChwcm9wKSk7CisgICAgICBvYmpbTkFNRV9LRVldID0g
cHJvcDsKKyAgICB9CiAgIH0KLX0pOwotCi1FbWJlci5EZWZlcnJlZCA9IERlZmVycmVkOwotCi19
KSgpOwotCi0KK30KIAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKLSovCit2YXIgTkFNRV9LRVkgPSBFbWJlci5OQU1FX0tFWSA9IEVt
YmVyLkdVSURfS0VZICsgJ19uYW1lJzsKIAotdmFyIGxvYWRIb29rcyA9IEVtYmVyLkVOVi5FTUJF
Ul9MT0FEX0hPT0tTIHx8IHt9OwotdmFyIGxvYWRlZCA9IHt9OworZnVuY3Rpb24gc3VwZXJDbGFz
c1N0cmluZyhtaXhpbikgeworICB2YXIgc3VwZXJjbGFzcyA9IG1peGluLnN1cGVyY2xhc3M7Cisg
IGlmIChzdXBlcmNsYXNzKSB7CisgICAgaWYgKHN1cGVyY2xhc3NbTkFNRV9LRVldKSB7IHJldHVy
biBzdXBlcmNsYXNzW05BTUVfS0VZXTsgfQorICAgIGVsc2UgeyByZXR1cm4gc3VwZXJDbGFzc1N0
cmluZyhzdXBlcmNsYXNzKTsgfQorICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorfQogCi0v
KioKLUBtZXRob2Qgb25Mb2FkCi1AZm9yIEVtYmVyCi1AcGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1l
IG9mIGhvb2sKLUBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIGJlIGNhbGxl
ZAotKi8KLUVtYmVyLm9uTG9hZCA9IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrKSB7Ci0gIHZhciBv
YmplY3Q7CitmdW5jdGlvbiBjbGFzc1RvU3RyaW5nKCkgeworICBpZiAoIUVtYmVyLkJPT1RFRCAm
JiAhdGhpc1tOQU1FX0tFWV0pIHsKKyAgICBwcm9jZXNzQWxsTmFtZXNwYWNlcygpOworICB9CiAK
LSAgbG9hZEhvb2tzW25hbWVdID0gbG9hZEhvb2tzW25hbWVdIHx8IEVtYmVyLkEoKTsKLSAgbG9h
ZEhvb2tzW25hbWVdLnB1c2hPYmplY3QoY2FsbGJhY2spOworICB2YXIgcmV0OwogCi0gIGlmIChv
YmplY3QgPSBsb2FkZWRbbmFtZV0pIHsKLSAgICBjYWxsYmFjayhvYmplY3QpOworICBpZiAodGhp
c1tOQU1FX0tFWV0pIHsKKyAgICByZXQgPSB0aGlzW05BTUVfS0VZXTsKKyAgfSBlbHNlIGlmICh0
aGlzLl90b1N0cmluZykgeworICAgIHJldCA9IHRoaXMuX3RvU3RyaW5nOyAKKyAgfSBlbHNlIHsK
KyAgICB2YXIgc3RyID0gc3VwZXJDbGFzc1N0cmluZyh0aGlzKTsKKyAgICBpZiAoc3RyKSB7Cisg
ICAgICByZXQgPSAiKHN1YmNsYXNzIG9mICIgKyBzdHIgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAg
ICAgIHJldCA9ICIodW5rbm93biBtaXhpbikiOworICAgIH0KKyAgICB0aGlzLnRvU3RyaW5nID0g
bWFrZVRvU3RyaW5nKHJldCk7CiAgIH0KLX07CiAKLS8qKgotQG1ldGhvZCBydW5Mb2FkSG9va3MK
LUBmb3IgRW1iZXIKLUBwYXJhbSBuYW1lIHtTdHJpbmd9IG5hbWUgb2YgaG9vawotQHBhcmFtIG9i
amVjdCB7T2JqZWN0fSBvYmplY3QgdG8gcGFzcyB0byBjYWxsYmFja3MKLSovCi1FbWJlci5ydW5M
b2FkSG9va3MgPSBmdW5jdGlvbihuYW1lLCBvYmplY3QpIHsKLSAgdmFyIGhvb2tzOworICByZXR1
cm4gcmV0OworfQogCi0gIGxvYWRlZFtuYW1lXSA9IG9iamVjdDsKK2Z1bmN0aW9uIHByb2Nlc3NB
bGxOYW1lc3BhY2VzKCkgeworICB2YXIgdW5wcm9jZXNzZWROYW1lc3BhY2VzID0gIU5hbWVzcGFj
ZS5QUk9DRVNTRUQsCisgICAgICB1bnByb2Nlc3NlZE1peGlucyA9IEVtYmVyLmFueVVucHJvY2Vz
c2VkTWl4aW5zOwogCi0gIGlmIChob29rcyA9IGxvYWRIb29rc1tuYW1lXSkgewotICAgIGxvYWRI
b29rc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgICBjYWxsYmFjayhv
YmplY3QpOwotICAgIH0pOworICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzKSB7CisgICAgZmlu
ZE5hbWVzcGFjZXMoKTsKKyAgICBOYW1lc3BhY2UuUFJPQ0VTU0VEID0gdHJ1ZTsKICAgfQotfTsK
IAotfSkoKTsKKyAgaWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcyB8fCB1bnByb2Nlc3NlZE1peGlu
cykgeworICAgIHZhciBuYW1lc3BhY2VzID0gTmFtZXNwYWNlLk5BTUVTUEFDRVMsIG5hbWVzcGFj
ZTsKKyAgICBmb3IgKHZhciBpPTAsIGw9bmFtZXNwYWNlcy5sZW5ndGg7IGk8bDsgaSsrKSB7Cisg
ICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzW2ldOworICAgICAgcHJvY2Vzc05hbWVzcGFjZShb
bmFtZXNwYWNlLnRvU3RyaW5nKCldLCBuYW1lc3BhY2UsIHt9KTsKKyAgICB9CiAKKyAgICBFbWJl
ci5hbnlVbnByb2Nlc3NlZE1peGlucyA9IGZhbHNlOworICB9Cit9CiAKK2Z1bmN0aW9uIG1ha2VU
b1N0cmluZyhyZXQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmV0OyB9OworfQog
Ci0oZnVuY3Rpb24oKSB7CitFbWJlci5NaXhpbi5wcm90b3R5cGUudG9TdHJpbmcgPSBjbGFzc1Rv
U3RyaW5nOwogCiB9KSgpOwogCiAKIAogKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdl
dDsKLQogLyoqCiBAbW9kdWxlIGVtYmVyCiBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKICovCiAK
K3ZhciBnZXQgPSBFbWJlci5nZXQsCisgICAgc2V0ID0gRW1iZXIuc2V0LAorICAgIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQsCisgICAgYWRkQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5hZGRCZWZvcmVP
YnNlcnZlciwKKyAgICBhZGRPYnNlcnZlciA9IEVtYmVyLmFkZE9ic2VydmVyLAorICAgIHJlbW92
ZUJlZm9yZU9ic2VydmVyID0gRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIsCisgICAgcmVtb3Zl
T2JzZXJ2ZXIgPSBFbWJlci5yZW1vdmVPYnNlcnZlciwKKyAgICBwcm9wZXJ0eVdpbGxDaGFuZ2Ug
PSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UsCisgICAgcHJvcGVydHlEaWRDaGFuZ2UgPSBFbWJl
ci5wcm9wZXJ0eURpZENoYW5nZSwKKyAgICBtZXRhID0gRW1iZXIubWV0YSwKKyAgICBkZWZpbmVQ
cm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3BlcnR5OworCitmdW5jdGlvbiBjb250ZW50UHJvcGVy
dHlXaWxsQ2hhbmdlKGNvbnRlbnQsIGNvbnRlbnRLZXkpIHsKKyAgdmFyIGtleSA9IGNvbnRlbnRL
ZXkuc2xpY2UoOCk7IC8vIHJlbW92ZSAiY29udGVudC4iCisgIGlmIChrZXkgaW4gdGhpcykgeyBy
ZXR1cm47IH0gIC8vIGlmIHNoYWRvd2VkIGluIHByb3h5CisgIHByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCBrZXkpOworfQorCitmdW5jdGlvbiBjb250ZW50UHJvcGVydHlEaWRDaGFuZ2UoY29udGVu
dCwgY29udGVudEtleSkgeworICB2YXIga2V5ID0gY29udGVudEtleS5zbGljZSg4KTsgLy8gcmVt
b3ZlICJjb250ZW50LiIKKyAgaWYgKGtleSBpbiB0aGlzKSB7IHJldHVybjsgfSAvLyBpZiBzaGFk
b3dlZCBpbiBwcm94eQorICBwcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOworfQorCiAvKioK
LSAgYEVtYmVyLkNvbnRyb2xsZXJNaXhpbmAgcHJvdmlkZXMgYSBzdGFuZGFyZCBpbnRlcmZhY2Ug
Zm9yIGFsbCBjbGFzc2VzIHRoYXQKLSAgY29tcG9zZSBFbWJlcidzIGNvbnRyb2xsZXIgbGF5ZXI6
IGBFbWJlci5Db250cm9sbGVyYCwKLSAgYEVtYmVyLkFycmF5Q29udHJvbGxlcmAsIGFuZCBgRW1i
ZXIuT2JqZWN0Q29udHJvbGxlcmAuCisgIGBFbWJlci5PYmplY3RQcm94eWAgZm9yd2FyZHMgYWxs
IHByb3BlcnRpZXMgbm90IGRlZmluZWQgYnkgdGhlIHByb3h5IGl0c2VsZgorICB0byBhIHByb3hp
ZWQgYGNvbnRlbnRgIG9iamVjdC4KIAotICBXaXRoaW4gYW4gYEVtYmVyLlJvdXRlcmAtbWFuYWdl
ZCBhcHBsaWNhdGlvbiBzaW5nbGUgc2hhcmVkIGluc3RhY2VzIG9mIGV2ZXJ5Ci0gIENvbnRyb2xs
ZXIgb2JqZWN0IGluIHlvdXIgYXBwbGljYXRpb24ncyBuYW1lc3BhY2Ugd2lsbCBiZSBhZGRlZCB0
byB0aGUKLSAgYXBwbGljYXRpb24ncyBgRW1iZXIuUm91dGVyYCBpbnN0YW5jZS4gU2VlIGBFbWJl
ci5BcHBsaWNhdGlvbiNpbml0aWFsaXplYAotICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4K
KyAgYGBgamF2YXNjcmlwdAorICBvYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICBu
YW1lOiAnRm9vJworICB9KTsKIAotICAjIyBWaWV3cworICBwcm94eSA9IEVtYmVyLk9iamVjdFBy
b3h5LmNyZWF0ZSh7CisgICAgY29udGVudDogb2JqZWN0CisgIH0pOwogCi0gIEJ5IGRlZmF1bHQg
YSBjb250cm9sbGVyIGluc3RhbmNlIHdpbGwgYmUgdGhlIHJlbmRlcmluZyBjb250ZXh0Ci0gIGZv
ciBpdHMgYXNzb2NpYXRlZCBgRW1iZXIuVmlldy5gIFRoaXMgY29ubmVjdGlvbiBpcyBtYWRlIGR1
cmluZyBjYWxscyB0bwotICBgRW1iZXIuQ29udHJvbGxlck1peGluI2Nvbm5lY3RPdXRsZXRgLgor
ICAvLyBBY2Nlc3MgYW5kIGNoYW5nZSBleGlzdGluZyBwcm9wZXJ0aWVzCisgIHByb3h5LmdldCgn
bmFtZScpICAgICAgICAgIC8vICdGb28nCisgIHByb3h5LnNldCgnbmFtZScsICdCYXInKTsKKyAg
b2JqZWN0LmdldCgnbmFtZScpICAgICAgICAgLy8gJ0JhcicKIAotICBXaXRoaW4gdGhlIHZpZXcn
cyB0ZW1wbGF0ZSwgdGhlIGBFbWJlci5WaWV3YCBpbnN0YW5jZSBjYW4gYmUgYWNjZXNzZWQKLSAg
dGhyb3VnaCB0aGUgY29udHJvbGxlciB3aXRoIGB7e3ZpZXd9fWAuCisgIC8vIENyZWF0ZSBuZXcg
J2Rlc2NyaXB0aW9uJyBwcm9wZXJ0eSBvbiBgb2JqZWN0YAorICBwcm94eS5zZXQoJ2Rlc2NyaXB0
aW9uJywgJ0ZvbyBpcyBhIHdoaXpib28gYmF6Jyk7CisgIG9iamVjdC5nZXQoJ2Rlc2NyaXB0aW9u
JykgIC8vICdGb28gaXMgYSB3aGl6Ym9vIGJheicKKyAgYGBgCiAKLSAgIyMgVGFyZ2V0IEZvcndh
cmRpbmcKKyAgV2hpbGUgYGNvbnRlbnRgIGlzIHVuc2V0LCBzZXR0aW5nIGEgcHJvcGVydHkgdG8g
YmUgZGVsZWdhdGVkIHdpbGwgdGhyb3cgYW4KKyAgRXJyb3IuCiAKLSAgQnkgZGVmYXVsdCBhIGNv
bnRyb2xsZXIgd2lsbCB0YXJnZXQgeW91ciBhcHBsaWNhdGlvbidzIGBFbWJlci5Sb3V0ZXJgCi0g
IGluc3RhbmNlLiBDYWxscyB0byBge3thY3Rpb259fWAgd2l0aGluIHRoZSB0ZW1wbGF0ZSBvZiBh
IGNvbnRyb2xsZXIncyB2aWV3Ci0gIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHJvdXRlci4gU2VlIGBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMuYWN0aW9uYCBmb3IKLSAgYWRkaXRpb25hbCBpbmZvcm1h
dGlvbi4KKyAgYGBgamF2YXNjcmlwdAorICBwcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0
ZSh7CisgICAgY29udGVudDogbnVsbCwKKyAgICBmbGFnOiBudWxsCisgIH0pOworICBwcm94eS5z
ZXQoJ2ZsYWcnLCB0cnVlKTsKKyAgcHJveHkuZ2V0KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQor
ICBwcm94eS5nZXQoJ2ZvbycpOyAgICAgICAgICAvLyB1bmRlZmluZWQKKyAgcHJveHkuc2V0KCdm
b28nLCAnZGF0YScpOyAgLy8gdGhyb3dzIEVycm9yCisgIGBgYAogCi0gIEBjbGFzcyBDb250cm9s
bGVyTWl4aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5NaXhpbgotKi8K
LUVtYmVyLkNvbnRyb2xsZXJNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIC8qIGR1Y2t0
eXBlIGFzIGEgY29udHJvbGxlciAqLwotICBpc0NvbnRyb2xsZXI6IHRydWUsCisgIERlbGVnYXRl
ZCBwcm9wZXJ0aWVzIGNhbiBiZSBib3VuZCB0byBhbmQgd2lsbCBjaGFuZ2Ugd2hlbiBjb250ZW50
IGlzIHVwZGF0ZWQuCiAKLSAgLyoqCi0gICAgVGhlIG9iamVjdCB0byB3aGljaCBldmVudHMgZnJv
bSB0aGUgdmlldyBzaG91bGQgYmUgc2VudC4KKyAgQ29tcHV0ZWQgcHJvcGVydGllcyBvbiB0aGUg
cHJveHkgaXRzZWxmIGNhbiBkZXBlbmQgb24gZGVsZWdhdGVkIHByb3BlcnRpZXMuCiAKLSAgICBG
b3IgZXhhbXBsZSwgd2hlbiBhIEhhbmRsZWJhcnMgdGVtcGxhdGUgdXNlcyB0aGUgYHt7YWN0aW9u
fX1gIGhlbHBlciwKLSAgICBpdCB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUgZXZlbnQgdG8gdGhl
IHZpZXcncyBjb250cm9sbGVyJ3MgYHRhcmdldGAuCisgIGBgYGphdmFzY3JpcHQKKyAgUHJveHlX
aXRoQ29tcHV0ZWRQcm9wZXJ0eSA9IEVtYmVyLk9iamVjdFByb3h5LmV4dGVuZCh7CisgICAgZnVs
bE5hbWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmly
c3ROYW1lJyksCisgICAgICAgICAgbGFzdE5hbWUgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAg
ICAgIGlmIChmaXJzdE5hbWUgJiYgbGFzdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0TmFt
ZSArICcgJyArIGxhc3ROYW1lOworICAgICAgfQorICAgICAgcmV0dXJuIGZpcnN0TmFtZSB8fCBs
YXN0TmFtZTsKKyAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQorICB9KTsK
IAotICAgIEJ5IGRlZmF1bHQsIGEgY29udHJvbGxlcidzIGB0YXJnZXRgIGlzIHNldCB0byB0aGUg
cm91dGVyIGFmdGVyIGl0IGlzCi0gICAgaW5zdGFudGlhdGVkIGJ5IGBFbWJlci5BcHBsaWNhdGlv
biNpbml0aWFsaXplYC4KKyAgcHJveHkgPSBQcm94eVdpdGhDb21wdXRlZFByb3BlcnR5LmNyZWF0
ZSgpOwogCi0gICAgQHByb3BlcnR5IHRhcmdldAorICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAv
LyB1bmRlZmluZWQKKyAgcHJveHkuc2V0KCdjb250ZW50JywgeworICAgIGZpcnN0TmFtZTogJ1Rv
bScsIGxhc3ROYW1lOiAnRGFsZScKKyAgfSk7IC8vIHRyaWdnZXJzIHByb3BlcnR5IGNoYW5nZSBm
b3IgZnVsbE5hbWUgb24gcHJveHkKKworICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyAnVG9t
IERhbGUnCisgIGBgYAorCisgIEBjbGFzcyBPYmplY3RQcm94eQorICBAbmFtZXNwYWNlIEVtYmVy
CisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorKi8KK0VtYmVyLk9iamVjdFByb3h5ID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7CisgIC8qKgorICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3
aWxsIGJlIGZvcndhcmRlZC4KKworICAgIEBwcm9wZXJ0eSBjb250ZW50CisgICAgQHR5cGUgRW1i
ZXIuT2JqZWN0CiAgICAgQGRlZmF1bHQgbnVsbAogICAqLwotICB0YXJnZXQ6IG51bGwsCisgIGNv
bnRlbnQ6IG51bGwsCisgIF9jb250ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGVu
dCcsIGZ1bmN0aW9uKCkgeworICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IE9iamVjdFByb3h5
J3MgY29udGVudCB0byBpdHNlbGYiLCB0aGlzLmdldCgnY29udGVudCcpICE9PSB0aGlzKTsKKyAg
fSksCiAKLSAgY29udGFpbmVyOiBudWxsLAorICBpc1RydXRoeTogRW1iZXIuY29tcHV0ZWQuYm9v
bCgnY29udGVudCcpLAogCi0gIHN0b3JlOiBudWxsLAorICBfZGVidWdDb250YWluZXJLZXk6IG51
bGwsCiAKLSAgbW9kZWw6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250ZW50JyksCisgIHdpbGxX
YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkgPSAnY29u
dGVudC4nICsga2V5OworICAgIGFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51
bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOworICAgIGFkZE9ic2VydmVyKHRoaXMsIGNv
bnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7CisgIH0sCiAKLSAgc2Vu
ZDogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChh
cmd1bWVudHMsIDEpLCB0YXJnZXQ7CisgIGRpZFVud2F0Y2hQcm9wZXJ0eTogZnVuY3Rpb24gKGtl
eSkgeworICAgIHZhciBjb250ZW50S2V5ID0gJ2NvbnRlbnQuJyArIGtleTsKKyAgICByZW1vdmVC
ZWZvcmVPYnNlcnZlcih0aGlzLCBjb250ZW50S2V5LCBudWxsLCBjb250ZW50UHJvcGVydHlXaWxs
Q2hhbmdlKTsKKyAgICByZW1vdmVPYnNlcnZlcih0aGlzLCBjb250ZW50S2V5LCBudWxsLCBjb250
ZW50UHJvcGVydHlEaWRDaGFuZ2UpOworICB9LAogCi0gICAgaWYgKHRoaXNbYWN0aW9uTmFtZV0p
IHsKLSAgICAgIEVtYmVyLmFzc2VydCgiVGhlIGNvbnRyb2xsZXIgIiArIHRoaXMgKyAiIGRvZXMg
bm90IGhhdmUgdGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSwgdHlwZW9mIHRoaXNbYWN0aW9uTmFt
ZV0gPT09ICdmdW5jdGlvbicpOwotICAgICAgdGhpc1thY3Rpb25OYW1lXS5hcHBseSh0aGlzLCBh
cmdzKTsKLSAgICB9IGVsc2UgaWYodGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSkgewotICAg
ICAgRW1iZXIuYXNzZXJ0KCJUaGUgdGFyZ2V0IGZvciBjb250cm9sbGVyICIgKyB0aGlzICsgIiAo
IiArIHRhcmdldCArICIpIGRpZCBub3QgZGVmaW5lIGEgYHNlbmRgIG1ldGhvZCIsIHR5cGVvZiB0
YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICB0YXJnZXQuc2VuZC5hcHBseSh0YXJn
ZXQsIGFyZ3VtZW50cyk7CisgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24gKGtleSkgeworICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7CisgICAgaWYgKGNvbnRlbnQpIHsK
KyAgICAgIHJldHVybiBnZXQoY29udGVudCwga2V5KTsKKyAgICB9CisgIH0sCisKKyAgc2V0VW5r
bm93blByb3BlcnR5OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgIHZhciBtID0gbWV0YSh0
aGlzKTsKKyAgICBpZiAobS5wcm90byA9PT0gdGhpcykgeworICAgICAgLy8gaWYgbWFya2VkIGFz
IHByb3RvdHlwZSB0aGVuIGp1c3QgZGVmaW5lUHJvcGVydHkKKyAgICAgIC8vIHJhdGhlciB0aGFu
IGRlbGVnYXRlCisgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIG51bGwsIHZhbHVlKTsK
KyAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CisKKyAgICB2YXIgY29udGVudCA9IGdldCh0aGlz
LCAnY29udGVudCcpOworICAgIEVtYmVyLmFzc2VydChmbXQoIkNhbm5vdCBkZWxlZ2F0ZSBzZXQo
JyVAJywgJUApIHRvIHRoZSAnY29udGVudCcgcHJvcGVydHkgb2Ygb2JqZWN0IHByb3h5ICVAOiBp
dHMgJ2NvbnRlbnQnIGlzIHVuZGVmaW5lZC4iLCBba2V5LCB2YWx1ZSwgdGhpc10pLCBjb250ZW50
KTsKKyAgICByZXR1cm4gc2V0KGNvbnRlbnQsIGtleSwgdmFsdWUpOwogICB9Ci19KTsKIAotLyoq
Ci0gIEBjbGFzcyBDb250cm9sbGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1i
ZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgotKi8KLUVtYmVyLkNvbnRy
b2xsZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkNvbnRyb2xsZXJNaXhpbik7Cit9KTsK
IAogfSkoKTsKIApAQCAtMTIwODAsMzg1NiArMTMzMzUsNDQxMSBAQCBFbWJlci5Db250cm9sbGVy
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4pOwogQHN1Ym1vZHVs
ZSBlbWJlci1ydW50aW1lCiAqLwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5z
ZXQsIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKLQotLyoqCi0gIGBF
bWJlci5Tb3J0YWJsZU1peGluYCBwcm92aWRlcyBhIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgYXJy
YXkgcHJveGllcwotICB0byBzcGVjaWZ5IGEgc29ydCBvcmRlciBhbmQgbWFpbnRhaW4gdGhpcyBz
b3J0aW5nIHdoZW4gb2JqZWN0cyBhcmUgYWRkZWQsCi0gIHJlbW92ZWQsIG9yIHVwZGF0ZWQgd2l0
aG91dCBjaGFuZ2luZyB0aGUgaW1wbGljaXQgb3JkZXIgb2YgdGhlaXIgdW5kZXJseWluZwotICBj
b250ZW50IGFycmF5OgorLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgorLy8gSEVMUEVSUworLy8KIAotICBgYGBqYXZhc2NyaXB0Ci0g
IHNvbmdzID0gWwotICAgIHt0cmFja051bWJlcjogNCwgdGl0bGU6ICdPYi1MYS1EaSwgT2ItTGEt
RGEnfSwKLSAgICB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUgVS5TLlMuUi4n
fSwKLSAgICB7dHJhY2tOdW1iZXI6IDMsIHRpdGxlOiAnR2xhc3MgT25pb24nfSwKLSAgXTsKK3Zh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBhX3NsaWNlID0gQXJyYXku
cHJvdG90eXBlLnNsaWNlOwordmFyIGFfaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5p
bmRleE9mOwogCi0gIHNvbmdzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVh
dGUoewotICAgIGNvbnRlbnQ6IHNvbmdzLAotICAgIHNvcnRQcm9wZXJ0aWVzOiBbJ3RyYWNrTnVt
YmVyJ10sCi0gICAgc29ydEFzY2VuZGluZzogdHJ1ZQotICB9KTsKK3ZhciBjb250ZXh0cyA9IFtd
OwogCi0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1i
ZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUgVS5TLlMuUi4nfQorZnVuY3Rpb24gcG9wQ3R4KCkg
eworICByZXR1cm4gY29udGV4dHMubGVuZ3RoPT09MCA/IHt9IDogY29udGV4dHMucG9wKCk7Cit9
CiAKLSAgc29uZ3NDb250cm9sbGVyLmFkZE9iamVjdCh7dHJhY2tOdW1iZXI6IDEsIHRpdGxlOiAn
RGVhciBQcnVkZW5jZSd9KTsKLSAgc29uZ3NDb250cm9sbGVyLmdldCgnZmlyc3RPYmplY3QnKTsg
IC8vIHt0cmFja051bWJlcjogMSwgdGl0bGU6ICdEZWFyIFBydWRlbmNlJ30KLSAgYGBgCitmdW5j
dGlvbiBwdXNoQ3R4KGN0eCkgeworICBjb250ZXh0cy5wdXNoKGN0eCk7CisgIHJldHVybiBudWxs
OworfQogCi0gIEBjbGFzcyBTb3J0YWJsZU1peGluCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4
dGVuZHMgRW1iZXIuTWl4aW4KLSAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSovCi1F
bWJlci5Tb3J0YWJsZU1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLk11dGFibGVFbnVt
ZXJhYmxlLCB7CitmdW5jdGlvbiBpdGVyKGtleSwgdmFsdWUpIHsKKyAgdmFyIHZhbHVlUHJvdmlk
ZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyOwogCi0gIC8qKgotICAgIFNwZWNpZmllcyB3aGlj
aCBwcm9wZXJ0aWVzIGRpY3RhdGUgdGhlIGFycmFuZ2VkQ29udGVudCdzIHNvcnQgb3JkZXIuCisg
IGZ1bmN0aW9uIGkoaXRlbSkgeworICAgIHZhciBjdXIgPSBnZXQoaXRlbSwga2V5KTsKKyAgICBy
ZXR1cm4gdmFsdWVQcm92aWRlZCA/IHZhbHVlPT09Y3VyIDogISFjdXI7CisgIH0KKyAgcmV0dXJu
IGkgOworfQogCi0gICAgQHByb3BlcnR5IHtBcnJheX0gc29ydFByb3BlcnRpZXMKLSAgKi8KLSAg
c29ydFByb3BlcnRpZXM6IG51bGwsCisvKioKKyAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBjb21t
b24gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGVudW1lcmFibGUgb2JqZWN0cworICBpbiBFbWJl
ci4gTW9zdCBvZiB0aGVzZSBtZXRob2RzIGZvbGxvdyB0aGUgc3RhbmRhcmQgQXJyYXkgaXRlcmF0
aW9uCisgIEFQSSBkZWZpbmVkIHVwIHRvIEphdmFTY3JpcHQgMS44IChleGNsdWRpbmcgbGFuZ3Vh
Z2Utc3BlY2lmaWMgZmVhdHVyZXMgdGhhdAorICBjYW5ub3QgYmUgZW11bGF0ZWQgaW4gb2xkZXIg
dmVyc2lvbnMgb2YgSmF2YVNjcmlwdCkuCiAKLSAgLyoqCi0gICAgU3BlY2lmaWVzIHRoZSBhcnJh
bmdlZENvbnRlbnQncyBzb3J0IGRpcmVjdGlvbgorICBUaGlzIG1peGluIGlzIGFwcGxpZWQgYXV0
b21hdGljYWxseSB0byB0aGUgQXJyYXkgY2xhc3Mgb24gcGFnZSBsb2FkLCBzbyB5b3UKKyAgY2Fu
IHVzZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiBzaW1wbGUgYXJyYXlzLiBJZiBBcnJheSBhbHJl
YWR5IGltcGxlbWVudHMKKyAgb25lIG9mIHRoZXNlIG1ldGhvZHMsIHRoZSBtaXhpbiB3aWxsIG5v
dCBvdmVycmlkZSB0aGVtLgogCi0gICAgQHByb3BlcnR5IHtCb29sZWFufSBzb3J0QXNjZW5kaW5n
Ci0gICovCi0gIHNvcnRBc2NlbmRpbmc6IHRydWUsCisgICMjIFdyaXRpbmcgWW91ciBPd24gRW51
bWVyYWJsZQogCi0gIG9yZGVyQnk6IGZ1bmN0aW9uKGl0ZW0xLCBpdGVtMikgewotICAgIHZhciBy
ZXN1bHQgPSAwLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3Bl
cnRpZXMnKSwKLSAgICAgICAgc29ydEFzY2VuZGluZyA9IGdldCh0aGlzLCAnc29ydEFzY2VuZGlu
ZycpOworICBUbyBtYWtlIHlvdXIgb3duIGN1c3RvbSBjbGFzcyBlbnVtZXJhYmxlLCB5b3UgbmVl
ZCB0d28gaXRlbXM6CiAKLSAgICBFbWJlci5hc3NlcnQoInlvdSBuZWVkIHRvIGRlZmluZSBgc29y
dFByb3BlcnRpZXNgIiwgISFzb3J0UHJvcGVydGllcyk7CisgIDEuIFlvdSBtdXN0IGhhdmUgYSBs
ZW5ndGggcHJvcGVydHkuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGNoYW5nZSB3aGVuZXZlcgorICAg
ICB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdlcy4g
SWYgeW91IHVzaW5nIHRoaXMKKyAgICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFzcywg
eW91IHNob3VsZCBiZSBzdXJlIHRvIGNoYW5nZSB0aGUgbGVuZ3RoCisgICAgIHByb3BlcnR5IHVz
aW5nIGBzZXQoKS5gCiAKLSAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9w
ZXJ0eU5hbWUpIHsKLSAgICAgIGlmIChyZXN1bHQgPT09IDApIHsKLSAgICAgICAgcmVzdWx0ID0g
RW1iZXIuY29tcGFyZShnZXQoaXRlbTEsIHByb3BlcnR5TmFtZSksIGdldChpdGVtMiwgcHJvcGVy
dHlOYW1lKSk7Ci0gICAgICAgIGlmICgocmVzdWx0ICE9PSAwKSAmJiAhc29ydEFzY2VuZGluZykg
ewotICAgICAgICAgIHJlc3VsdCA9ICgtMSkgKiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKKyAgMi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9j
dW1lbnRhdGlvbi4KIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCisgIE9uY2UgeW91IGhhdmUg
dGhlc2UgdHdvIG1ldGhvZHMgaW1wbGVtZW50LCBhcHBseSB0aGUgYEVtYmVyLkVudW1lcmFibGVg
IG1peGluCisgIHRvIHlvdXIgY2xhc3MgYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gZW51bWVyYXRl
IHRoZSBjb250ZW50cyBvZiB5b3VyIG9iamVjdAorICBsaWtlIGFueSBvdGhlciBjb2xsZWN0aW9u
LgogCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMs
ICdjb250ZW50JyksCi0gICAgICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJv
cGVydGllcycpOworICAjIyBVc2luZyBFbWJlciBFbnVtZXJhdGlvbiB3aXRoIE90aGVyIExpYnJh
cmllcwogCi0gICAgaWYgKGNvbnRlbnQgJiYgc29ydFByb3BlcnRpZXMpIHsKLSAgICAgIGZvckVh
Y2goY29udGVudCwgZnVuY3Rpb24oaXRlbSkgewotICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0
aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKLSAgICAgICAgICBFbWJlci5yZW1vdmVPYnNl
cnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURp
ZENoYW5nZScpOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAgIH0sIHRoaXMpOwotICAgIH0KKyAg
TWFueSBvdGhlciBsaWJyYXJpZXMgcHJvdmlkZSBzb21lIGtpbmQgb2YgaXRlcmF0b3Igb3IgZW51
bWVyYXRpb24gbGlrZQorICBmYWNpbGl0eS4gVGhpcyBpcyBvZnRlbiB3aGVyZSB0aGUgbW9zdCBj
b21tb24gQVBJIGNvbmZsaWN0cyBvY2N1ci4KKyAgRW1iZXIncyBBUEkgaXMgZGVzaWduZWQgdG8g
YmUgYXMgZnJpZW5kbHkgYXMgcG9zc2libGUgd2l0aCBvdGhlcgorICBsaWJyYXJpZXMgYnkgaW1w
bGVtZW50aW5nIG9ubHkgbWV0aG9kcyB0aGF0IG1vc3RseSBjb3JyZXNwb25kIHRvIHRoZQorICBK
YXZhU2NyaXB0IDEuOCBBUEkuCiAKLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoKTsKLSAgfSwKKyAg
QGNsYXNzIEVudW1lcmFibGUKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAc2luY2UgRW1iZXIgMC45
CisqLworRW1iZXIuRW51bWVyYWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAKLSAgaXNTb3J0
ZWQ6IEVtYmVyLmNvbXB1dGVkLmJvb2woJ3NvcnRQcm9wZXJ0aWVzJyksCisgIC8qKgorICAgIElt
cGxlbWVudCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xhc3MgZW51bWVyYWJsZS4KIAotICBh
cnJhbmdlZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkKCdjb250ZW50JywgJ3NvcnRQcm9wZXJ0aWVz
LkBlYWNoJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRo
aXMsICdjb250ZW50JyksCi0gICAgICAgIGlzU29ydGVkID0gZ2V0KHRoaXMsICdpc1NvcnRlZCcp
LAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMnKSwK
LSAgICAgICAgc2VsZiA9IHRoaXM7CisgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsIHJlcGVh
dGVkbHkgZHVyaW5nIGVudW1lcmF0aW9uLiBUaGUgaW5kZXggdmFsdWUKKyAgICB3aWxsIGFsd2F5
cyBiZWdpbiB3aXRoIDAgYW5kIGluY3JlbWVudCBtb25vdG9uaWNhbGx5LiBZb3UgZG9uJ3QgaGF2
ZSB0bworICAgIHJlbHkgb24gdGhlIGluZGV4IHZhbHVlIHRvIGRldGVybWluZSB3aGF0IG9iamVj
dCB0byByZXR1cm4sIGJ1dCB5b3Ugc2hvdWxkCisgICAgYWx3YXlzIGNoZWNrIHRoZSB2YWx1ZSBh
bmQgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIHdoZW4geW91IHNlZSB0aGUKKyAgICByZXF1ZXN0
ZWQgaW5kZXggaXMgMC4KIAotICAgIGlmIChjb250ZW50ICYmIGlzU29ydGVkKSB7Ci0gICAgICBj
b250ZW50ID0gY29udGVudC5zbGljZSgpOwotICAgICAgY29udGVudC5zb3J0KGZ1bmN0aW9uKGl0
ZW0xLCBpdGVtMikgewotICAgICAgICByZXR1cm4gc2VsZi5vcmRlckJ5KGl0ZW0xLCBpdGVtMik7
Ci0gICAgICB9KTsKLSAgICAgIGZvckVhY2goY29udGVudCwgZnVuY3Rpb24oaXRlbSkgewotICAg
ICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKLSAg
ICAgICAgICBFbWJlci5hZGRPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250
ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAg
IH0sIHRoaXMpOwotICAgICAgcmV0dXJuIEVtYmVyLkEoY29udGVudCk7Ci0gICAgfQorICAgIFRo
ZSBgcHJldmlvdXNPYmplY3RgIGlzIHRoZSBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB0
aGUgbGFzdCBjYWxsCisgICAgdG8gYG5leHRPYmplY3RgIGZvciB0aGUgY3VycmVudCBpdGVyYXRp
b24uIFRoaXMgaXMgYSB1c2VmdWwgd2F5IHRvCisgICAgbWFuYWdlIGl0ZXJhdGlvbiBpZiB5b3Ug
YXJlIHRyYWNpbmcgYSBsaW5rZWQgbGlzdCwgZm9yIGV4YW1wbGUuCiAKLSAgICByZXR1cm4gY29u
dGVudDsKLSAgfSksCisgICAgRmluYWxseSB0aGUgY29udGV4dCBwYXJhbWV0ZXIgd2lsbCBhbHdh
eXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKKyAgICBhICJzY3JhdGNocGFkIiB0byBt
YWludGFpbiBhbnkgb3RoZXIgc3RhdGUgeW91IG5lZWQgaW4gb3JkZXIgdG8gaXRlcmF0ZQorICAg
IHByb3Blcmx5LiBUaGUgY29udGV4dCBvYmplY3QgaXMgcmV1c2VkIGFuZCBpcyBub3QgcmVzZXQg
YmV0d2VlbgorICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJlIHlvdSBzZXR1cCB0aGUgY29udGV4
dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKKyAgICB0aGUgaW5kZXggcGFyYW1ldGVyIGlz
IDAuCiAKLSAgX2NvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcihmdW5jdGlv
bigpIHsKLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBz
b3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMnKTsKKyAgICBHZW5lcmFs
bHkgaXRlcmF0b3JzIHdpbGwgY29udGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhl
IGluZGV4CisgICAgcmVhY2hlcyB0aGUgeW91ciBjdXJyZW50IGxlbmd0aC0xLiBJZiB5b3UgcnVu
IG91dCBvZiBkYXRhIGJlZm9yZSB0aGlzCisgICAgdGltZSBmb3Igc29tZSByZWFzb24sIHlvdSBz
aG91bGQgc2ltcGx5IHJldHVybiB1bmRlZmluZWQuCiAKLSAgICBpZiAoY29udGVudCAmJiBzb3J0
UHJvcGVydGllcykgewotICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5jdGlvbihpdGVtKSB7Ci0g
ICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgewot
ICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywg
J2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAgICAgIH0sIHRoaXMpOwot
ICAgICAgfSwgdGhpcyk7Ci0gICAgfQorICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9m
IHRoaXMgbWV0aG9kIHNpbXBseSBsb29rcyB1cCB0aGUgaW5kZXguCisgICAgVGhpcyB3b3JrcyBn
cmVhdCBvbiBhbnkgQXJyYXktbGlrZSBvYmplY3RzLgogCi0gICAgdGhpcy5fc3VwZXIoKTsKLSAg
fSwgJ2NvbnRlbnQnKSwKKyAgICBAbWV0aG9kIG5leHRPYmplY3QKKyAgICBAcGFyYW0ge051bWJl
cn0gaW5kZXggdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGl0ZXJhdGlvbgorICAgIEBwYXJhbSB7
T2JqZWN0fSBwcmV2aW91c09iamVjdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2Fs
bCB0bworICAgICAgYG5leHRPYmplY3RgLgorICAgIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IGEg
Y29udGV4dCBvYmplY3QgeW91IGNhbiB1c2UgdG8gbWFpbnRhaW4gc3RhdGUuCisgICAgQHJldHVy
biB7T2JqZWN0fSB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0ZXJhdGlvbiBvciB1bmRlZmluZWQK
KyAgKi8KKyAgbmV4dE9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAogCi0gIHNvcnRB
c2NlbmRpbmdXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcihmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLl9sYXN0U29ydEFzY2VuZGluZyA9IGdldCh0aGlzLCAnc29ydEFzY2VuZGluZycpOwot
ICB9LCAnc29ydEFzY2VuZGluZycpLAorICAvKioKKyAgICBIZWxwZXIgbWV0aG9kIHJldHVybnMg
dGhlIGZpcnN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gVGhpcyBpcyB1c3VhbGx5CisgICAg
dXNlZCBieSBiaW5kaW5ncyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIGZyYW1ld29yayB0byBleHRy
YWN0IGEgc2luZ2xlCisgICAgb2JqZWN0IGlmIHRoZSBlbnVtZXJhYmxlIGNvbnRhaW5zIG9ubHkg
b25lIGl0ZW0uCiAKLSAgc29ydEFzY2VuZGluZ0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVu
Y3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnc29ydEFzY2VuZGluZycpICE9PSB0aGlzLl9s
YXN0U29ydEFzY2VuZGluZykgewotICAgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz
LCAnYXJyYW5nZWRDb250ZW50Jyk7Ci0gICAgICBhcnJhbmdlZENvbnRlbnQucmV2ZXJzZU9iamVj
dHMoKTsKLSAgICB9Ci0gIH0sICdzb3J0QXNjZW5kaW5nJyksCisgICAgSWYgeW91IG92ZXJyaWRl
IHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBpdCBzbyB0aGF0IGl0IHdpbGwKKyAg
ICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIElm
IHlvdXIgZW51bWVyYWJsZQorICAgIGNvbnRhaW5zIG9ubHkgb25lIG9iamVjdCwgdGhpcyBtZXRo
b2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhhdCBvYmplY3QuCisgICAgSWYgeW91ciBlbnVtZXJh
YmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB1bmRlZmluZWRgLgogCi0g
IGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGFycmF5LCBpZHgsIHJlbW92ZWRDb3Vu
dCwgYWRkZWRDb3VudCkgewotICAgIHZhciBpc1NvcnRlZCA9IGdldCh0aGlzLCAnaXNTb3J0ZWQn
KTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKKyAg
ICBhcnIuZ2V0KCdmaXJzdE9iamVjdCcpOyAgLy8gImEiCiAKLSAgICBpZiAoaXNTb3J0ZWQpIHsK
LSAgICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcp
OwotICAgICAgdmFyIHJlbW92ZWRPYmplY3RzID0gYXJyYXkuc2xpY2UoaWR4LCBpZHgrcmVtb3Zl
ZENvdW50KTsKLSAgICAgIHZhciBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3Bl
cnRpZXMnKTsKKyAgICB2YXIgYXJyID0gW107CisgICAgYXJyLmdldCgnZmlyc3RPYmplY3QnKTsg
IC8vIHVuZGVmaW5lZAorICAgIGBgYAogCi0gICAgICBmb3JFYWNoKHJlbW92ZWRPYmplY3RzLCBm
dW5jdGlvbihpdGVtKSB7Ci0gICAgICAgIGFycmFuZ2VkQ29udGVudC5yZW1vdmVPYmplY3QoaXRl
bSk7CisgICAgQHByb3BlcnR5IGZpcnN0T2JqZWN0CisgICAgQHJldHVybiB7T2JqZWN0fSB0aGUg
b2JqZWN0IG9yIHVuZGVmaW5lZAorICAqLworICBmaXJzdE9iamVjdDogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7CisgICAgaWYgKGdldCh0aGlzLCAnbGVuZ3RoJyk9PT0wKSByZXR1cm4gdW5k
ZWZpbmVkIDsKIAotICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0
UHJvcGVydHkpIHsKLSAgICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBzb3J0UHJv
cGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwotICAgICAg
ICB9LCB0aGlzKTsKLSAgICAgIH0sIHRoaXMpOwotICAgIH0KKyAgICAvLyBoYW5kbGUgZ2VuZXJp
YyBlbnVtZXJhYmxlcworICAgIHZhciBjb250ZXh0ID0gcG9wQ3R4KCksIHJldDsKKyAgICByZXQg
PSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwgY29udGV4dCk7CisgICAgcHVzaEN0eChjb250ZXh0
KTsKKyAgICByZXR1cm4gcmV0IDsKKyAgfSkucHJvcGVydHkoJ1tdJyksCiAKLSAgICByZXR1cm4g
dGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKLSAgfSwK
KyAgLyoqCisgICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBsYXN0IG9iamVjdCBmcm9tIGEg
Y29sbGVjdGlvbi4gSWYgeW91ciBlbnVtZXJhYmxlCisgICAgY29udGFpbnMgb25seSBvbmUgb2Jq
ZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0aGF0IG9iamVjdC4KKyAgICBJ
ZiB5b3VyIGVudW1lcmFibGUgaXMgZW1wdHksIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYHVu
ZGVmaW5lZGAuCiAKLSAgY29udGVudEFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihhcnJheSwgaWR4
LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpIHsKLSAgICB2YXIgaXNTb3J0ZWQgPSBnZXQodGhp
cywgJ2lzU29ydGVkJyksCi0gICAgICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0
UHJvcGVydGllcycpOworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgYXJyID0gWyJhIiwgImIi
LCAiYyJdOworICAgIGFyci5nZXQoJ2xhc3RPYmplY3QnKTsgIC8vICJjIgogCi0gICAgaWYgKGlz
U29ydGVkKSB7Ci0gICAgICB2YXIgYWRkZWRPYmplY3RzID0gYXJyYXkuc2xpY2UoaWR4LCBpZHgr
YWRkZWRDb3VudCk7Ci0gICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJh
bmdlZENvbnRlbnQnKTsKKyAgICB2YXIgYXJyID0gW107CisgICAgYXJyLmdldCgnbGFzdE9iamVj
dCcpOyAgLy8gdW5kZWZpbmVkCisgICAgYGBgCiAKLSAgICAgIGZvckVhY2goYWRkZWRPYmplY3Rz
LCBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsK
KyAgICBAcHJvcGVydHkgbGFzdE9iamVjdAorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIGxhc3Qg
b2JqZWN0IG9yIHVuZGVmaW5lZAorICAqLworICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKKyAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICBpZiAo
bGVuPT09MCkgcmV0dXJuIHVuZGVmaW5lZCA7CisgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKSwg
aWR4PTAsIGN1ciwgbGFzdCA9IG51bGw7CisgICAgZG8geworICAgICAgbGFzdCA9IGN1cjsKKyAg
ICAgIGN1ciA9IHRoaXMubmV4dE9iamVjdChpZHgrKywgbGFzdCwgY29udGV4dCk7CisgICAgfSB3
aGlsZSAoY3VyICE9PSB1bmRlZmluZWQpOworICAgIHB1c2hDdHgoY29udGV4dCk7CisgICAgcmV0
dXJuIGxhc3Q7CisgIH0pLnByb3BlcnR5KCdbXScpLAogCi0gICAgICAgIGZvckVhY2goc29ydFBy
b3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVyLmFkZE9i
c2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5
RGlkQ2hhbmdlJyk7Ci0gICAgICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQor
ICAvKioKKyAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIG9iamVjdCBjYW4gYmUgZm91
bmQgaW4gdGhlIHJlY2VpdmVyLiBUaGUKKyAgICBkZWZhdWx0IHZlcnNpb24gd2lsbCBpdGVyYXRl
IHRocm91Z2ggdGhlIGVudW1lcmFibGUgdW50aWwgdGhlIG9iamVjdAorICAgIGlzIGZvdW5kLiBZ
b3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB3aXRoIGEgbW9yZSBlZmZpY2llbnQgdmVyc2lv
bi4KIAotICAgIHJldHVybiB0aGlzLl9zdXBlcihhcnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFk
ZGVkQ291bnQpOwotICB9LAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgYXJyID0gWyJhIiwg
ImIiLCAiYyJdOworICAgIGFyci5jb250YWlucygiYSIpOyAvLyB0cnVlCisgICAgYXJyLmNvbnRh
aW5zKCJ6Iik7IC8vIGZhbHNlCisgICAgYGBgCiAKLSAgaW5zZXJ0SXRlbVNvcnRlZDogZnVuY3Rp
b24oaXRlbSkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2Vk
Q29udGVudCcpOwotICAgIHZhciBsZW5ndGggPSBnZXQoYXJyYW5nZWRDb250ZW50LCAnbGVuZ3Ro
Jyk7Ci0KLSAgICB2YXIgaWR4ID0gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIDAsIGxlbmd0aCk7
Ci0gICAgYXJyYW5nZWRDb250ZW50Lmluc2VydEF0KGlkeCwgaXRlbSk7CisgICAgQG1ldGhvZCBj
b250YWlucworICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9y
LgorICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBvYmplY3QgaXMgZm91bmQgaW4gZW51
bWVyYWJsZS4KKyAgKi8KKyAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVybiB0
aGlzLmZpbmQoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gaXRlbT09PW9iajsgfSkgIT09IHVuZGVm
aW5lZDsKICAgfSwKIAotICBjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rp
b24oaXRlbSkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2Vk
Q29udGVudCcpLAotICAgICAgICBvbGRJbmRleCA9IGFycmFuZ2VkQ29udGVudC5pbmRleE9mKGl0
ZW0pLAotICAgICAgICBsZWZ0SXRlbSA9IGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChvbGRJbmRl
eCAtIDEpLAotICAgICAgICByaWdodEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQob2xk
SW5kZXggKyAxKSwKLSAgICAgICAgbGVmdFJlc3VsdCA9IGxlZnRJdGVtICYmIHRoaXMub3JkZXJC
eShpdGVtLCBsZWZ0SXRlbSksCi0gICAgICAgIHJpZ2h0UmVzdWx0ID0gcmlnaHRJdGVtICYmIHRo
aXMub3JkZXJCeShpdGVtLCByaWdodEl0ZW0pOworICAvKioKKyAgICBJdGVyYXRlcyB0aHJvdWdo
IHRoZSBlbnVtZXJhYmxlLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24gb24gZWFjaAorICAg
IGl0ZW0uIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBgZm9yRWFjaCgpYCBtZXRob2Qg
ZGVmaW5lZCBpbgorICAgIEphdmFTY3JpcHQgMS42LgogCi0gICAgaWYgKGxlZnRSZXN1bHQgPCAw
IHx8IHJpZ2h0UmVzdWx0ID4gMCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92ZU9iamVj
dChpdGVtKTsKLSAgICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsKLSAgICB9Ci0gIH0s
CisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9s
bG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgogCi0g
IF9iaW5hcnlTZWFyY2g6IGZ1bmN0aW9uKGl0ZW0sIGxvdywgaGlnaCkgewotICAgIHZhciBtaWQs
IG1pZEl0ZW0sIHJlcywgYXJyYW5nZWRDb250ZW50OworICAgIGBgYGphdmFzY3JpcHQKKyAgICBm
dW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgYGBgCiAKLSAgICBpZiAobG93
ID09PSBoaWdoKSB7Ci0gICAgICByZXR1cm4gbG93OwotICAgIH0KKyAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgLSBgZW51bWVyYWJsZWAgaXMgdGhl
IGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KIAotICAgIGFycmFuZ2VkQ29udGVudCA9IGdldCh0
aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CisgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEg
Y2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVj
dCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdv
b2Qgd2F5CisgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUg
Y3VycmVudCBvYmplY3QuCiAKLSAgICBtaWQgPSBsb3cgKyBNYXRoLmZsb29yKChoaWdoIC0gbG93
KSAvIDIpOwotICAgIG1pZEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQobWlkKTsKKyAg
ICBAbWV0aG9kIGZvckVhY2gKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2Fs
bGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0
IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCisgICovCisgIGZv
ckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICBpZiAodHlwZW9mIGNhbGxi
YWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkgOworICAgIHZhciBsZW4g
PSBnZXQodGhpcywgJ2xlbmd0aCcpLCBsYXN0ID0gbnVsbCwgY29udGV4dCA9IHBvcEN0eCgpOwog
Ci0gICAgcmVzID0gdGhpcy5vcmRlckJ5KG1pZEl0ZW0sIGl0ZW0pOworICAgIGlmICh0YXJnZXQg
PT09IHVuZGVmaW5lZCkgdGFyZ2V0ID0gbnVsbDsKIAotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAg
ICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgICB9IGVs
c2UgaWYgKHJlcyA+IDApIHsKLSAgICAgIHJldHVybiB0aGlzLl9iaW5hcnlTZWFyY2goaXRlbSwg
bG93LCBtaWQpOworICAgIGZvcih2YXIgaWR4PTA7aWR4PGxlbjtpZHgrKykgeworICAgICAgdmFy
IG5leHQgPSB0aGlzLm5leHRPYmplY3QoaWR4LCBsYXN0LCBjb250ZXh0KSA7CisgICAgICBjYWxs
YmFjay5jYWxsKHRhcmdldCwgbmV4dCwgaWR4LCB0aGlzKTsKKyAgICAgIGxhc3QgPSBuZXh0IDsK
ICAgICB9CisgICAgbGFzdCA9IG51bGwgOworICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQp
OworICAgIHJldHVybiB0aGlzIDsKKyAgfSwKIAotICAgIHJldHVybiBtaWQ7Ci0gIH0KLX0pOwot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKLSovCisgIC8qKgorICAgIEFsaWFzIGZvciBgbWFwQnlgCiAKLXZh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNHbG9iYWxQYXRoID0gRW1iZXIu
aXNHbG9iYWxQYXRoLAotICAgIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFj
aCwgcmVwbGFjZSA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5yZXBsYWNlOworICAgIEBtZXRob2Qg
Z2V0RWFjaAorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAg
ICBAcmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4KKyAgKi8KKyAgZ2V0RWFjaDogZnVu
Y3Rpb24oa2V5KSB7CisgICAgcmV0dXJuIHRoaXMubWFwQnkoa2V5KTsKKyAgfSwKIAotLyoqCi0g
IGBFbWJlci5BcnJheUNvbnRyb2xsZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gcHVibGlz
aCBhIGNvbGxlY3Rpb24gb2YKLSAgb2JqZWN0cyBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IGJpbmQg
dG8gdGhlIGNvbGxlY3Rpb24gZnJvbSBhIEhhbmRsZWJhcnMKLSAgYCNlYWNoYCBoZWxwZXIsIGFu
IGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIG9yIG90aGVyIGNvbnRyb2xsZXJzLgorICAvKioKKyAg
ICBTZXRzIHRoZSB2YWx1ZSBvbiB0aGUgbmFtZWQgcHJvcGVydHkgZm9yIGVhY2ggbWVtYmVyLiBU
aGlzIGlzIG1vcmUKKyAgICBlZmZpY2llbnQgdGhhbiB1c2luZyBvdGhlciBtZXRob2RzIGRlZmlu
ZWQgb24gdGhpcyBoZWxwZXIuIElmIHRoZSBvYmplY3QKKyAgICBpbXBsZW1lbnRzIEVtYmVyLk9i
c2VydmFibGUsIHRoZSB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgdG8gYHNldCgpLGAgb3RoZXJ3aXNl
CisgICAgaXQgd2lsbCBiZSBzZXQgZGlyZWN0bHkuIGBudWxsYCBvYmplY3RzIGFyZSBza2lwcGVk
LgogCi0gIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYW4gYEFycmF5Q29udHJvbGxlcmAgaXMgdGhh
dCB5b3Ugb25seSBoYXZlIHRvIHNldCB1cAotICB5b3VyIHZpZXcgYmluZGluZ3Mgb25jZTsgdG8g
Y2hhbmdlIHdoYXQncyBkaXNwbGF5ZWQsIHNpbXBseSBzd2FwIG91dCB0aGUKLSAgYGNvbnRlbnRg
IHByb3BlcnR5IG9uIHRoZSBjb250cm9sbGVyLgorICAgIEBtZXRob2Qgc2V0RWFjaAorICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQKKyAgICBAcGFyYW0ge09iamVjdH0gdmFs
dWUgVGhlIG9iamVjdCB0byBzZXQKKyAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCisgICov
CisgIHNldEVhY2g6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5mb3JF
YWNoKGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgIHNldChpdGVtLCBrZXksIHZhbHVlKTsKKyAgICB9
KTsKKyAgfSwKIAotICBGb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3Ugd2FudGVkIHRvIGRpc3BsYXkg
YSBsaXN0IG9mIGl0ZW1zIGZldGNoZWQgdmlhIGFuIFhIUgotICByZXF1ZXN0LiBDcmVhdGUgYW4g
YEVtYmVyLkFycmF5Q29udHJvbGxlcmAgYW5kIHNldCBpdHMgYGNvbnRlbnRgIHByb3BlcnR5Ogor
ICAvKioKKyAgICBNYXBzIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHRvIGFu
b3RoZXIgdmFsdWUsIHJldHVybmluZworICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3Jy
ZXNwb25kcyB0byBgbWFwKClgIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCiAKLSAgYGBgamF2
YXNjcmlwdAotICBNeUFwcC5saXN0Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5j
cmVhdGUoKTsKKyAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZl
IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25h
bCk6CiAKLSAgJC5nZXQoJ3Blb3BsZS5qc29uJywgZnVuY3Rpb24oZGF0YSkgewotICAgIE15QXBw
Lmxpc3RDb250cm9sbGVyLnNldCgnY29udGVudCcsIGRhdGEpOwotICB9KTsKLSAgYGBgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKyAg
ICBgYGAKIAotICBUaGVuLCBjcmVhdGUgYSB2aWV3IHRoYXQgYmluZHMgdG8geW91ciBuZXcgY29u
dHJvbGxlcjoKKyAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRp
b24uCisgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24u
CisgICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KIAot
ICBgYGBoYW5kbGViYXJzCi0gIHt7I2VhY2ggTXlBcHAubGlzdENvbnRyb2xsZXJ9fQotICAgIHt7
Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19Ci0gIHt7L2VhY2h9fQotICBgYGAKKyAgICBJdCBzaG91
bGQgcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUuCiAKLSAgQWx0aG91Z2ggeW91IGFyZSBiaW5kaW5n
IHRvIHRoZSBjb250cm9sbGVyLCB0aGUgYmVoYXZpb3Igb2YgdGhpcyBjb250cm9sbGVyCi0gIGlz
IHRvIHBhc3MgdGhyb3VnaCBhbnkgbWV0aG9kcyBvciBwcm9wZXJ0aWVzIHRvIHRoZSB1bmRlcmx5
aW5nIGFycmF5LiBUaGlzCi0gIGNhcGFiaWxpdHkgY29tZXMgZnJvbSBgRW1iZXIuQXJyYXlQcm94
eWAsIHdoaWNoIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbS4KKyAgICBOb3RlIHRoYXQgaW4gYWRk
aXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0
CisgICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBU
aGlzIGlzIGEgZ29vZCB3YXkKKyAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNj
ZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KIAotICBTb21ldGltZXMgeW91IHdhbnQgdG8gZGlz
cGxheSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGhpbiB0aGUgYm9keSBvZiBhbgotICBgI2VhY2hg
IGhlbHBlciB0aGF0IGRlcGVuZCBvbiB0aGUgdW5kZXJseWluZyBpdGVtcyBpbiBgY29udGVudGAs
IGJ1dCBhcmUgbm90Ci0gIHByZXNlbnQgb24gdGhvc2UgaXRlbXMuICAgVG8gZG8gdGhpcywgc2V0
IGBpdGVtQ29udHJvbGxlcmAgdG8gdGhlIG5hbWUgb2YgYQotICBjb250cm9sbGVyIChwcm9iYWJs
eSBhbiBgT2JqZWN0Q29udHJvbGxlcmApIHRoYXQgd2lsbCB3cmFwIGVhY2ggaW5kaXZpZHVhbCBp
dGVtLgorICAgIEBtZXRob2QgbWFwCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhl
IGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRh
cmdldCBvYmplY3QgdG8gdXNlCisgICAgQHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXku
CisgICovCisgIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgeworICAgIHZhciByZXQg
PSBFbWJlci5BKCk7CisgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgeworICAg
ICAgcmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LGkpOworICAgIH0pOwor
ICAgIHJldHVybiByZXQgOworICB9LAogCi0gIEZvciBleGFtcGxlOgorICAvKioKKyAgICBTaW1p
bGFyIHRvIG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBv
ZiB0aGUgbmFtZWQKKyAgICBwcm9wZXJ0eSBvbiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9u
LgogCi0gIGBgYGhhbmRsZWJhcnMKLSAgICB7eyNlYWNoIHBvc3QgaW4gY29udHJvbGxlcn19Ci0g
ICAgICA8bGk+e3t0aXRsZX19ICh7e3RpdGxlTGVuZ3RofX0gY2hhcmFjdGVycyk8L2xpPgotICAg
IHt7L2VhY2h9fQotICBgYGAKKyAgICBAbWV0aG9kIG1hcEJ5CisgICAgQHBhcmFtIHtTdHJpbmd9
IGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVk
IGFycmF5LgorICAqLworICBtYXBCeTogZnVuY3Rpb24oa2V5KSB7CisgICAgcmV0dXJuIHRoaXMu
bWFwKGZ1bmN0aW9uKG5leHQpIHsKKyAgICAgIHJldHVybiBnZXQobmV4dCwga2V5KTsKKyAgICB9
KTsKKyAgfSwKIAotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Qb3N0c0NvbnRyb2xsZXIgPSBFbWJl
ci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBpdGVtQ29udHJvbGxlcjogJ3Bvc3QnCi0g
IH0pOworICAvKioKKyAgICBTaW1pbGFyIHRvIG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlv
biByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKKyAgICBwcm9wZXJ0eSBvbiBhbGwgaXRl
bXMgaW4gdGhlIGVudW1lcmF0aW9uLgogCi0gIEFwcC5Qb3N0Q29udHJvbGxlciA9IEVtYmVyLk9i
amVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAvLyB0aGUgYHRpdGxlYCBwcm9wZXJ0eSB3aWxs
IGJlIHByb3hpZWQgdG8gdGhlIHVuZGVybHlpbmcgcG9zdC4KKyAgICBAbWV0aG9kIG1hcFByb3Bl
cnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgIEBy
ZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFycmF5LgorICAgIEBkZXByZWNhdGVkIFVzZSBgbWFw
QnlgIGluc3RlYWQKKyAgKi8KIAotICAgIHRpdGxlTGVuZ3RoOiBmdW5jdGlvbigpIHsKLSAgICAg
IHJldHVybiB0aGlzLmdldCgndGl0bGUnKS5sZW5ndGg7Ci0gICAgfS5wcm9wZXJ0eSgndGl0bGUn
KQotICB9KTsKLSAgYGBgCisgIG1hcFByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnbWFwQnkn
KSwKIAotICBJbiBzb21lIGNhc2VzIGl0IGlzIGhlbHBmdWwgdG8gcmV0dXJuIGEgZGlmZmVyZW50
IGBpdGVtQ29udHJvbGxlcmAgZGVwZW5kaW5nCi0gIG9uIHRoZSBwYXJ0aWN1bGFyIGl0ZW0uICBT
dWJjbGFzc2VzIGNhbiBkbyB0aGlzIGJ5IG92ZXJyaWRpbmcKLSAgYGxvb2t1cEl0ZW1Db250cm9s
bGVyYC4KKyAgLyoqCisgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMg
aW4gdGhlIGVudW1lcmF0aW9uIHRoYXQgdGhlIHBhc3NlZAorICAgIGZ1bmN0aW9uIHJldHVybnMg
dHJ1ZSBmb3IuIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIGBmaWx0ZXIoKWAgZGVmaW5lZCBp
bgorICAgIEphdmFTY3JpcHQgMS42LgogCi0gIEZvciBleGFtcGxlOgorICAgIFRoZSBjYWxsYmFj
ayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUg
KGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKIAotICBgYGBqYXZhc2NyaXB0Ci0g
IEFwcC5NeUFycmF5Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewot
ICAgIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5jdGlvbiggb2JqZWN0ICkgewotICAgICAgaWYg
KG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcpKSB7Ci0gICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8v
IHVzZSBBcHAuU3BlY2lhbENvbnRyb2xsZXIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVy
biAicmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxhckNvbnRyb2xsZXIKLSAgICAgIH0KLSAgICB9
Ci0gIH0pOwotICBgYGAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24oaXRlbSwgaW5k
ZXgsIGVudW1lcmFibGUpOworICAgIGBgYAogCi0gIEBjbGFzcyBBcnJheUNvbnRyb2xsZXIKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5BcnJheVByb3h5Ci0gIEB1c2VzIEVt
YmVyLlNvcnRhYmxlTWl4aW4KLSAgQHVzZXMgRW1iZXIuQ29udHJvbGxlck1peGluCi0qLworICAg
IC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBp
bmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBlbnVt
ZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgogCi1FbWJlci5BcnJheUNv
bnRyb2xsZXIgPSBFbWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4s
Ci0gIEVtYmVyLlNvcnRhYmxlTWl4aW4sIHsKKyAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBgdHJ1
ZWAgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0cywgYGZhbHNlYAorICAgIG90aGVy
d2lzZS4KIAotICAvKioKLSAgICBUaGUgY29udHJvbGxlciB1c2VkIHRvIHdyYXAgaXRlbXMsIGlm
IGFueS4KKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKKyAgICB0byBnaXZl
IHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KIAot
ICAgIEBwcm9wZXJ0eSBpdGVtQ29udHJvbGxlcgotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZh
dWx0IG51bGwKKyAgICBAbWV0aG9kIGZpbHRlcgorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxi
YWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRd
IFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAgIEByZXR1cm4ge0FycmF5fSBBIGZpbHRlcmVk
IGFycmF5LgogICAqLwotICBpdGVtQ29udHJvbGxlcjogbnVsbCwKKyAgZmlsdGVyOiBmdW5jdGlv
bihjYWxsYmFjaywgdGFyZ2V0KSB7CisgICAgdmFyIHJldCA9IEVtYmVyLkEoKTsKKyAgICB0aGlz
LmZvckVhY2goZnVuY3Rpb24oeCwgaWR4LCBpKSB7CisgICAgICBpZiAoY2FsbGJhY2suY2FsbCh0
YXJnZXQsIHgsIGlkeCwgaSkpIHJldC5wdXNoKHgpOworICAgIH0pOworICAgIHJldHVybiByZXQg
OworICB9LAogCiAgIC8qKgotICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciB0
byB3cmFwIGl0ZW1zLCBvciBgbnVsbGAgaWYgaXRlbXMgc2hvdWxkCi0gICAgYmUgcmV0dXJuZWQg
ZGlyZWN0bHkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUK
LSAgICBgaXRlbUNvbnRyb2xsZXJgIHByb3BlcnR5LCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJp
ZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuCi0gICAgZGlmZmVyZW50IGNvbnRyb2xsZXJzIGZvciBk
aWZmZXJlbnQgb2JqZWN0cy4KLQotICAgIEZvciBleGFtcGxlOgorICAgIFJldHVybnMgYW4gYXJy
YXkgd2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB3aGVyZSB0aGUgcGFz
c2VkCisgICAgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IuIFRoaXMgbWV0aG9kIGlzIHRoZSBp
bnZlcnNlIG9mIGZpbHRlcigpLgorCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlk
ZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgcGFyYW1ldGVy
cyBhcmUgb3B0aW9uYWwpOgogCiAgICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5NeUFycmF5Q29u
dHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgICAgbG9va3VwSXRl
bUNvbnRyb2xsZXI6IGZ1bmN0aW9uKCBvYmplY3QgKSB7Ci0gICAgICAgIGlmIChvYmplY3QuZ2V0
KCdpc1NwZWNpYWwnKSkgewotICAgICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAu
U3BlY2lhbENvbnRyb2xsZXIKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gInJl
Z3VsYXIiOyAvLyB1c2UgQXBwLlJlZ3VsYXJDb250cm9sbGVyCi0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKKyAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CiAgICAgYGBg
CiAKLSAgICBAbWV0aG9kCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAq
LwotICBsb29rdXBJdGVtQ29udHJvbGxlcjogZnVuY3Rpb24ob2JqZWN0KSB7Ci0gICAgcmV0dXJu
IGdldCh0aGlzLCAnaXRlbUNvbnRyb2xsZXInKTsKLSAgfSwKLQotICBvYmplY3RBdENvbnRlbnQ6
IGZ1bmN0aW9uKGlkeCkgewotICAgIHZhciBsZW5ndGggPSBnZXQodGhpcywgJ2xlbmd0aCcpLAot
ICAgICAgICBvYmplY3QgPSBnZXQodGhpcywnYXJyYW5nZWRDb250ZW50Jykub2JqZWN0QXQoaWR4
KTsKKyAgICAtICppdGVtKiBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisg
ICAgLSAqaW5kZXgqIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24KKyAgICAt
ICplbnVtZXJhYmxlKiBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgogCi0gICAgaWYg
KGlkeCA+PSAwICYmIGlkeCA8IGxlbmd0aCkgewotICAgICAgdmFyIGNvbnRyb2xsZXJDbGFzcyA9
IHRoaXMubG9va3VwSXRlbUNvbnRyb2xsZXIob2JqZWN0KTsKLSAgICAgIGlmIChjb250cm9sbGVy
Q2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlckF0KGlkeCwgb2JqZWN0LCBj
b250cm9sbGVyQ2xhc3MpOwotICAgICAgfQotICAgIH0KKyAgICBJdCBzaG91bGQgcmV0dXJuIHRo
ZSBhIGZhbHNleSB2YWx1ZSB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLgogCi0g
ICAgLy8gV2hlbiBgY29udHJvbGxlckNsYXNzYCBpcyBmYWxzeSwgd2UgaGF2ZSBub3Qgb3B0ZWQg
aW4gdG8gdXNpbmcgaXRlbQotICAgIC8vIGNvbnRyb2xsZXJzLCBzbyByZXR1cm4gdGhlIG9iamVj
dCBkaXJlY3RseS4KKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91
IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRoYXQgd2lsbCBi
ZSBzZXQgYXMgInRoaXMiIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKKyAgICB0
byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVj
dC4KIAotICAgIC8vIFdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgd2Ugd2FudCB0byBy
ZXR1cm4gdGhlICJvdXQgb2YgcmFuZ2UiCi0gICAgLy8gdmFsdWUsIHdoYXRldmVyIHRoYXQgbWln
aHQgYmUuICBSYXRoZXIgdGhhbiBtYWtlIGFzc3VtcHRpb25zCi0gICAgLy8gKGUuZy4gZ3Vlc3Np
bmcgYG51bGxgIG9yIGB1bmRlZmluZWRgKSB3ZSBkZWZlciB0aGlzIHRvIGBhcnJhbmdlZENvbnRl
bnRgLgotICAgIHJldHVybiBvYmplY3Q7CisgICAgQG1ldGhvZCByZWplY3QKKyAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7
T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtB
cnJheX0gQSByZWplY3RlZCBhcnJheS4KKyAgICovCisgIHJlamVjdDogZnVuY3Rpb24oY2FsbGJh
Y2ssIHRhcmdldCkgeworICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKyAgICAg
IHJldHVybiAhKGNhbGxiYWNrLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKSk7CisgICAgfSk7CiAg
IH0sCiAKLSAgYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlz
Ll9zdXBlcigpOwotICAgIHRoaXMuX3Jlc2V0U3ViQ29udGFpbmVycygpOworICAvKioKKyAgICBS
ZXR1cm5zIGFuIGFycmF5IHdpdGgganVzdCB0aGUgaXRlbXMgd2l0aCB0aGUgbWF0Y2hlZCBwcm9w
ZXJ0eS4gWW91CisgICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGgg
dGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCisgICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9w
ZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCisKKyAgICBAbWV0aG9kIGZpbHRlckJ5Cisg
ICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBwYXJhbSB7
U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICBAcmV0
dXJuIHtBcnJheX0gZmlsdGVyZWQgYXJyYXkKKyAgKi8KKyAgZmlsdGVyQnk6IGZ1bmN0aW9uKGtl
eSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5maWx0ZXIoaXRlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpKTsKICAgfSwKIAotICBhcnJheUNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKGlkeCwg
cmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKLSAgICB2YXIgc3ViQ29udGFpbmVycyA9IGdldCh0aGlz
LCAnc3ViQ29udGFpbmVycycpLAotICAgICAgICBzdWJDb250YWluZXJzVG9SZW1vdmUgPSBzdWJD
b250YWluZXJzLnNsaWNlKGlkeCwgaWR4K3JlbW92ZWRDbnQpOworICAvKioKKyAgICBSZXR1cm5z
IGFuIGFycmF5IHdpdGgganVzdCB0aGUgaXRlbXMgd2l0aCB0aGUgbWF0Y2hlZCBwcm9wZXJ0eS4g
WW91CisgICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRh
cmdldCB2YWx1ZS4gT3RoZXJ3aXNlCisgICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0
aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCiAKLSAgICBmb3JFYWNoKHN1YkNvbnRhaW5lcnNUb1Jl
bW92ZSwgZnVuY3Rpb24oc3ViQ29udGFpbmVyKSB7Ci0gICAgICBpZiAoc3ViQ29udGFpbmVyKSB7
IHN1YkNvbnRhaW5lci5kZXN0cm95KCk7IH0KLSAgICB9KTsKKyAgICBAbWV0aG9kIGZpbHRlclBy
b3BlcnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAg
IEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4K
KyAgICBAcmV0dXJuIHtBcnJheX0gZmlsdGVyZWQgYXJyYXkKKyAgICBAZGVwcmVjYXRlZCBVc2Ug
YGZpbHRlckJ5YCBpbnN0ZWFkCisgICovCisgIGZpbHRlclByb3BlcnR5OiBFbWJlci5hbGlhc01l
dGhvZCgnZmlsdGVyQnknKSwKIAotICAgIHJlcGxhY2Uoc3ViQ29udGFpbmVycywgaWR4LCByZW1v
dmVkQ250LCBuZXcgQXJyYXkoYWRkZWRDbnQpKTsKKyAgLyoqCisgICAgUmV0dXJucyBhbiBhcnJh
eSB3aXRoIHRoZSBpdGVtcyB0aGF0IGRvIG5vdCBoYXZlIHRydXRoeSB2YWx1ZXMgZm9yCisgICAg
a2V5LiAgWW91IGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aXRoIHRoZSB0
YXJnZXQgdmFsdWUuICBPdGhlcndpc2UKKyAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5
IHRoYXQgZXZhbHVhdGVzIHRvIGZhbHNlLgogCi0gICAgLy8gVGhlIHNoYWRvdyBhcnJheSBvZiBz
dWJjb250YWluZXJzIG11c3QgYmUgdXBkYXRlZCBiZWZvcmUgd2UgdHJpZ2dlcgotICAgIC8vIG9i
c2VydmVycywgb3RoZXJ3aXNlIG9ic2VydmVycyB3aWxsIGdldCB0aGUgd3Jvbmcgc3ViY29udGFp
bmVyIHdoZW4KLSAgICAvLyBjYWxsaW5nIGBvYmplY3RBdGAKLSAgICB0aGlzLl9zdXBlcihpZHgs
IHJlbW92ZWRDbnQsIGFkZGVkQ250KTsKLSAgfSwKKyAgICBAbWV0aG9kIHJlamVjdEJ5CisgICAg
QHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBwYXJhbSB7U3Ry
aW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICBAcmV0dXJu
IHtBcnJheX0gcmVqZWN0ZWQgYXJyYXkKKyAgKi8KKyAgcmVqZWN0Qnk6IGZ1bmN0aW9uKGtleSwg
dmFsdWUpIHsKKyAgICB2YXIgZXhhY3RWYWx1ZSA9IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGdl
dChpdGVtLCBrZXkpID09PSB2YWx1ZTsgfSwKKyAgICAgICAgaGFzVmFsdWUgPSBmdW5jdGlvbihp
dGVtKSB7IHJldHVybiAhIWdldChpdGVtLCBrZXkpOyB9LAorICAgICAgICB1c2UgPSAoYXJndW1l
bnRzLmxlbmd0aCA9PT0gMiA/IGV4YWN0VmFsdWUgOiBoYXNWYWx1ZSk7CiAKLSAgaW5pdDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICBpZiAoIXRoaXMuZ2V0KCdjb250ZW50
JykpIHsgdGhpcy5zZXQoJ2NvbnRlbnQnLCBFbWJlci5BKCkpOyB9Ci0gICAgdGhpcy5fcmVzZXRT
dWJDb250YWluZXJzKCk7CisgICAgcmV0dXJuIHRoaXMucmVqZWN0KHVzZSk7CiAgIH0sCiAKLSAg
Y29udHJvbGxlckF0OiBmdW5jdGlvbihpZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNzKSB7Ci0g
ICAgdmFyIGNvbnRhaW5lciA9IGdldCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAgIHN1YkNv
bnRhaW5lcnMgPSBnZXQodGhpcywgJ3N1YkNvbnRhaW5lcnMnKSwKLSAgICAgICAgc3ViQ29udGFp
bmVyID0gc3ViQ29udGFpbmVyc1tpZHhdLAotICAgICAgICBjb250cm9sbGVyOworICAvKioKKyAg
ICBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGl0ZW1zIHRoYXQgZG8gbm90IGhhdmUgdHJ1dGh5
IHZhbHVlcyBmb3IKKyAgICBrZXkuICBZb3UgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFy
Z3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4gIE90aGVyd2lzZQorICAgIHRoaXMgd2lsbCBt
YXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gZmFsc2UuCiAKLSAgICBpZiAoIXN1
YkNvbnRhaW5lcikgewotICAgICAgc3ViQ29udGFpbmVyID0gc3ViQ29udGFpbmVyc1tpZHhdID0g
Y29udGFpbmVyLmNoaWxkKCk7Ci0gICAgfQorICAgIEBtZXRob2QgcmVqZWN0UHJvcGVydHkKKyAg
ICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgQHBhcmFtIHtT
dHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICAgIEByZXR1
cm4ge0FycmF5fSByZWplY3RlZCBhcnJheQorICAgIEBkZXByZWNhdGVkIFVzZSBgcmVqZWN0Qnlg
IGluc3RlYWQKKyAgKi8KKyAgcmVqZWN0UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZWpl
Y3RCeScpLAogCi0gICAgY29udHJvbGxlciA9IHN1YkNvbnRhaW5lci5sb29rdXAoImNvbnRyb2xs
ZXI6IiArIGNvbnRyb2xsZXJDbGFzcyk7Ci0gICAgaWYgKCFjb250cm9sbGVyKSB7Ci0gICAgICB0
aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIGl0ZW1Db250cm9sbGVyOiAiJyArIGNv
bnRyb2xsZXJDbGFzcyArICciJyk7Ci0gICAgfQorICAvKioKKyAgICBSZXR1cm5zIHRoZSBmaXJz
dCBpdGVtIGluIHRoZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZS4K
KyAgICBUaGlzIG1ldGhvZCB3b3JrcyBzaW1pbGFyIHRvIHRoZSBgZmlsdGVyKClgIG1ldGhvZCBk
ZWZpbmVkIGluIEphdmFTY3JpcHQgMS42CisgICAgZXhjZXB0IHRoYXQgaXQgd2lsbCBzdG9wIHdv
cmtpbmcgb24gdGhlIGFycmF5IG9uY2UgYSBtYXRjaCBpcyBmb3VuZC4KKworICAgIFRoZSBjYWxs
YmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1
cmUgKGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKIAotICAgIGNvbnRyb2xsZXIu
c2V0KCd0YXJnZXQnLCB0aGlzKTsKLSAgICBjb250cm9sbGVyLnNldCgnY29udGVudCcsIG9iamVj
dCk7CisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJh
YmxlKTsKKyAgICBgYGAKIAotICAgIHJldHVybiBjb250cm9sbGVyOwotICB9LAorICAgIC0gYGl0
ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBpbmRleGAg
aXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBlbnVtZXJhYmxl
YCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgogCi0gIHN1YkNvbnRhaW5lcnM6IG51
bGwsCisgICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0g
aW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKKyAgICBvdGhlcndpc2UuCiAKLSAgX3Jlc2V0U3ViQ29u
dGFpbmVyczogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN1YkNvbnRhaW5lcnMgPSBnZXQodGhpcywg
J3N1YkNvbnRhaW5lcnMnKTsKKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFj
aywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRoYXQg
d2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkK
KyAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50
IG9iamVjdC4KIAotICAgIGlmIChzdWJDb250YWluZXJzKSB7Ci0gICAgICBmb3JFYWNoKHN1YkNv
bnRhaW5lcnMsIGZ1bmN0aW9uKHN1YkNvbnRhaW5lcikgewotICAgICAgICBpZiAoc3ViQ29udGFp
bmVyKSB7IHN1YkNvbnRhaW5lci5kZXN0cm95KCk7IH0KLSAgICAgIH0pOworICAgIEBtZXRob2Qg
ZmluZAorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVj
dXRlCisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVz
ZQorICAgIEByZXR1cm4ge09iamVjdH0gRm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYC4KKyAgKi8K
KyAgZmluZDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgeworICAgIHZhciBsZW4gPSBnZXQo
dGhpcywgJ2xlbmd0aCcpIDsKKyAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHRhcmdldCA9
IG51bGw7CisKKyAgICB2YXIgbGFzdCA9IG51bGwsIG5leHQsIGZvdW5kID0gZmFsc2UsIHJldCA7
CisgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKKyAgICBmb3IodmFyIGlkeD0wO2lkeDxsZW4g
JiYgIWZvdW5kO2lkeCsrKSB7CisgICAgICBuZXh0ID0gdGhpcy5uZXh0T2JqZWN0KGlkeCwgbGFz
dCwgY29udGV4dCkgOworICAgICAgaWYgKGZvdW5kID0gY2FsbGJhY2suY2FsbCh0YXJnZXQsIG5l
eHQsIGlkeCwgdGhpcykpIHJldCA9IG5leHQgOworICAgICAgbGFzdCA9IG5leHQgOwogICAgIH0K
KyAgICBuZXh0ID0gbGFzdCA9IG51bGwgOworICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQp
OworICAgIHJldHVybiByZXQgOworICB9LAogCi0gICAgdGhpcy5zZXQoJ3N1YkNvbnRhaW5lcnMn
LCBFbWJlci5BKCkpOwotICB9Ci19KTsKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgZmlyc3QgaXRl
bSB3aXRoIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2YWx1ZS4gWW91CisgICAgY2Fu
IHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4g
T3RoZXJ3aXNlCisgICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRl
cyB0byBgdHJ1ZWAuCiAKLX0pKCk7CisgICAgVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRo
ZSBtb3JlIGdlbmVyaWMgYGZpbmQoKWAgbWV0aG9kLgogCisgICAgQG1ldGhvZCBmaW5kQnkKKyAg
ICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgQHBhcmFtIHtT
dHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICAgIEByZXR1
cm4ge09iamVjdH0gZm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYAorICAqLworICBmaW5kQnk6IGZ1
bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5maW5kKGl0ZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKSk7CisgIH0sCiAKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgZmlyc3QgaXRl
bSB3aXRoIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2YWx1ZS4gWW91CisgICAgY2Fu
IHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4g
T3RoZXJ3aXNlCisgICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRl
cyB0byBgdHJ1ZWAuCiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0qLworICAgIFRoaXMgbWV0aG9kIHdvcmtzIG11Y2ggbGlrZSB0
aGUgbW9yZSBnZW5lcmljIGBmaW5kKClgIG1ldGhvZC4KIAotLyoqCi0gIGBFbWJlci5PYmplY3RD
b250cm9sbGVyYCBpcyBwYXJ0IG9mIEVtYmVyJ3MgQ29udHJvbGxlciBsYXllci4gQSBzaW5nbGUg
c2hhcmVkCi0gIGluc3RhbmNlIG9mIGVhY2ggYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIHN1YmNs
YXNzIGluIHlvdXIgYXBwbGljYXRpb24ncwotICBuYW1lc3BhY2Ugd2lsbCBiZSBjcmVhdGVkIGF0
IGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uIGFuZCBiZSBzdG9yZWQgb24geW91cgotICBhcHBs
aWNhdGlvbidzIGBFbWJlci5Sb3V0ZXJgIGluc3RhbmNlLgorICAgIEBtZXRob2QgZmluZFByb3Bl
cnR5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBw
YXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAg
ICBAcmV0dXJuIHtPYmplY3R9IGZvdW5kIGl0ZW0gb3IgYHVuZGVmaW5lZGAKKyAgICBAZGVwcmVj
YXRlZCBVc2UgYGZpbmRCeWAgaW5zdGVhZAorICAqLworICBmaW5kUHJvcGVydHk6IEVtYmVyLmFs
aWFzTWV0aG9kKCdmaW5kQnknKSwKIAotICBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAgZGVyaXZl
cyBpdHMgZnVuY3Rpb25hbGl0eSBmcm9tIGl0cyBzdXBlcmNsYXNzCi0gIGBFbWJlci5PYmplY3RQ
cm94eWAgYW5kIHRoZSBgRW1iZXIuQ29udHJvbGxlck1peGluYCBtaXhpbi4KKyAgLyoqCisgICAg
UmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGV2
ZXJ5IGl0ZW0gaW4gdGhlCisgICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0
aGUgYGV2ZXJ5KClgIG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4KIAotICBAY2xhc3MgT2JqZWN0
Q29udHJvbGxlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdFBy
b3h5Ci0gIEB1c2VzIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgotKiovCi1FbWJlci5PYmplY3RDb250
cm9sbGVyID0gRW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKEVtYmVyLkNvbnRyb2xsZXJNaXhpbik7
CisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9s
bG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgogCi19
KSgpOworICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVy
YWJsZSk7CisgICAgYGBgCiAKKyAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRo
ZSBpdGVyYXRpb24uCisgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBp
dGVyYXRpb24uCisgICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0
c2VsZi4KIAorICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCBvciBgZmFsc2VgLgogCi0o
ZnVuY3Rpb24oKSB7CisgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlv
dSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgIG9iamVjdCB0aGF0IHdpbGwg
YmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CisgICAg
dG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmpl
Y3QuCiAKLX0pKCk7CisgICAgRXhhbXBsZSBVc2FnZToKIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBpZiAocGVvcGxlLmV2ZXJ5KGlzRW5naW5lZXIpKSB7IFBheWNoZWNrcy5hZGRCaWdCb251cygp
OyB9CisgICAgYGBgCiAKKyAgICBAbWV0aG9kIGV2ZXJ5CisgICAgQHBhcmFtIHtGdW5jdGlvbn0g
Y2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICBAcGFyYW0ge09iamVjdH0gW3Rh
cmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAg
Ki8KKyAgZXZlcnk6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICByZXR1cm4gIXRo
aXMuZmluZChmdW5jdGlvbih4LCBpZHgsIGkpIHsKKyAgICAgIHJldHVybiAhY2FsbGJhY2suY2Fs
bCh0YXJnZXQsIHgsIGlkeCwgaSk7CisgICAgfSk7CisgIH0sCiAKLShmdW5jdGlvbigpIHsKLS8q
KgotRW1iZXIgUnVudGltZQorICAvKioKKyAgICBAbWV0aG9kIGV2ZXJ5QnkKKyAgICBAcGFyYW0g
e1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgQHBhcmFtIHtTdHJpbmd9IFt2
YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICAgIEBkZXByZWNhdGVkIFVz
ZSBgaXNFdmVyeWAgaW5zdGVhZAorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICovCisgIGV2ZXJ5
Qnk6IEVtYmVyLmFsaWFzTWV0aG9kKCdpc0V2ZXJ5JyksCiAKLUBtb2R1bGUgZW1iZXIKLUBzdWJt
b2R1bGUgZW1iZXItcnVudGltZQotQHJlcXVpcmVzIGVtYmVyLW1ldGFsCi0qLworICAvKioKKyAg
ICBAbWV0aG9kIGV2ZXJ5UHJvcGVydHkKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9w
ZXJ0eSB0byB0ZXN0CisgICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUg
dG8gdGVzdCBhZ2FpbnN0LgorICAgIEBkZXByZWNhdGVkIFVzZSBgaXNFdmVyeWAgaW5zdGVhZAor
ICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICovCisgIGV2ZXJ5UHJvcGVydHk6IEVtYmVyLmFsaWFz
TWV0aG9kKCdpc0V2ZXJ5JyksCiAKLX0pKCk7CisgIC8qKgorICAgIFJldHVybnMgYHRydWVgIGlm
IHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gYHRydWVgIGZvciBhbGwgaXRlbXMgaW4K
KyAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIg
dGhhbiB1c2luZyBhIGNhbGxiYWNrLgogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCisgICAgQG1ldGhvZCBpc0V2ZXJ5CisgICAg
QHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAorICAgIEBwYXJhbSB7U3Ry
aW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICBAcmV0dXJu
IHtCb29sZWFufQorICAqLworICBpc0V2ZXJ5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAg
cmV0dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAgfSwKIAot
dmFyIGpRdWVyeSA9IEVtYmVyLmltcG9ydHMualF1ZXJ5OwotRW1iZXIuYXNzZXJ0KCJFbWJlciBW
aWV3cyByZXF1aXJlIGpRdWVyeSAxLjggb3IgMS45IiwgalF1ZXJ5ICYmIChqUXVlcnkoKS5qcXVl
cnkubWF0Y2goL14xXC4oOHw5KShcLlxkKyk/KHByZXxyY1xkPyk/LykgfHwgRW1iZXIuRU5WLkZP
UkNFX0pRVUVSWSkpOworICAvKioKKyAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1
bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCisgICAgZW51bWVyYXRpb24u
IFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEphdmFTY3JpcHQg
MS42LgogCi0vKioKLSAgQWxpYXMgZm9yIGpRdWVyeQorICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAg
IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKIAotICBAbWV0aG9kICQKLSAgQGZvciBFbWJlcgot
Ki8KLUVtYmVyLiQgPSBqUXVlcnk7Ci0KLX0pKCk7CisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1
bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKyAgICBgYGAKIAorICAgIC0gYGl0ZW1g
IGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBpbmRleGAgaXMg
dGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAtIGBlbnVtZXJhYmxlYCBp
cyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgogCisgICAgSXQgc2hvdWxkIHJldHVybiB0
aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKKyAg
ICBvdGhlcndpc2UuCiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci12aWV3cwotKi8KKyAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxs
YmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgb2JqZWN0IHRo
YXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3
YXkKKyAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJy
ZW50IG9iamVjdC4KIAotLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1
cnJlbnQtd29yay9tdWx0aXBhZ2UvZG5kLmh0bWwjZG5kZXZlbnRzCi12YXIgZHJhZ0V2ZW50cyA9
IEVtYmVyLlN0cmluZy53KCdkcmFnc3RhcnQgZHJhZyBkcmFnZW50ZXIgZHJhZ2xlYXZlIGRyYWdv
dmVyIGRyb3AgZHJhZ2VuZCcpOworICAgIFVzYWdlIEV4YW1wbGU6CiAKLS8vIENvcGllcyB0aGUg
YGRhdGFUcmFuc2ZlcmAgcHJvcGVydHkgZnJvbSBhIGJyb3dzZXIgZXZlbnQgb2JqZWN0IG9udG8g
dGhlCi0vLyBqUXVlcnkgZXZlbnQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50cwotRW1i
ZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2goZHJhZ0V2ZW50cywgZnVuY3Rpb24oZXZlbnROYW1l
KSB7Ci0gIEVtYmVyLiQuZXZlbnQuZml4SG9va3NbZXZlbnROYW1lXSA9IHsgcHJvcHM6IFsnZGF0
YVRyYW5zZmVyJ10gfTsKLX0pOworICAgIGBgYGphdmFzY3JpcHQKKyAgICBpZiAocGVvcGxlLmFu
eShpc01hbmFnZXIpKSB7IFBheWNoZWNrcy5hZGRCaWdnZXJCb251cygpOyB9CisgICAgYGBgCiAK
LX0pKCk7CisgICAgQG1ldGhvZCBhbnkKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBU
aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUg
dGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhl
IHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0ZW0KKyAgKi8KKyAgYW55
OiBmdW5jdGlvbihjYWxsYmFjaywgdGFyZ2V0KSB7CisgICAgdmFyIGZvdW5kID0gdGhpcy5maW5k
KGZ1bmN0aW9uKHgsIGlkeCwgaSkgeworICAgICAgcmV0dXJuICEhY2FsbGJhY2suY2FsbCh0YXJn
ZXQsIHgsIGlkeCwgaSk7CisgICAgfSk7CiAKKyAgICByZXR1cm4gdHlwZW9mIGZvdW5kICE9PSAn
dW5kZWZpbmVkJzsKKyAgfSwKIAorICAvKioKKyAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFz
c2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCisgICAgZW51bWVy
YXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEphdmFT
Y3JpcHQgMS42LgogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1
bGUgZW1iZXItdmlld3MKLSovCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBz
aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgcGFyYW1ldGVycyBh
cmUgb3B0aW9uYWwpOgogCi0vKioqIEJFR0lOIE1FVEFNT1JQSCBIRUxQRVJTICoqKi8KKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAg
IGBgYAogCi0vLyBJbnRlcm5ldCBFeHBsb3JlciBwcmlvciB0byA5IGRvZXMgbm90IGFsbG93IHNl
dHRpbmcgaW5uZXJIVE1MIGlmIHRoZSBmaXJzdCBlbGVtZW50Ci0vLyBpcyBhICJ6ZXJvLXNjb3Bl
IiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5nCi0v
LyB0aGUgZmlyc3Qgbm9kZSBhbiBpbnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBNb2Rlcm5p
enIsIHVzZSAmc2h5OwotdmFyIG5lZWRzU2h5ID0gKGZ1bmN0aW9uKCl7Ci0gIHZhciB0ZXN0RWwg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgdGVzdEVsLmlubmVySFRNTCA9ICI8
ZGl2PjwvZGl2PiI7Ci0gIHRlc3RFbC5maXJzdENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0Pjwv
c2NyaXB0PiI7Ci0gIHJldHVybiB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOwot
fSkoKTsKKyAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24u
CisgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisg
ICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KIAotLy8g
SUUgOCAoYW5kIGxpa2VseSBlYXJsaWVyKSBsaWtlcyB0byBtb3ZlIHdoaXRlc3BhY2UgcHJlY2Vl
ZGluZwotLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0
IHdlIGNhbgotLy8gYWNjaWRlbnRhbGx5IHJlbW92ZSB3aGl0ZXNwYWNlIHdoZW4gdXBkYXRpbmcg
YSBtb3JwaC4KLXZhciBtb3Zlc1doaXRlc3BhY2UgPSAoZnVuY3Rpb24oKSB7Ci0gIHZhciB0ZXN0
RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgdGVzdEVsLmlubmVySFRNTCA9
ICJUZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+PC9zY3JpcHQ+VmFsdWUi
OwotICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYm
Ci0gICAgICAgICAgdGVzdEVsLmNoaWxkTm9kZXNbMl0ubm9kZVZhbHVlID09PSAnIFZhbHVlJzsK
LX0pKCk7CisgICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0
ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKKyAgICBvdGhlcndpc2UuCiAKLS8vIFVzZSB0aGlz
IHRvIGZpbmQgY2hpbGRyZW4gYnkgSUQgaW5zdGVhZCBvZiB1c2luZyBqUXVlcnkKLXZhciBmaW5k
Q2hpbGRCeUlkID0gZnVuY3Rpb24oZWxlbWVudCwgaWQpIHsKLSAgaWYgKGVsZW1lbnQuZ2V0QXR0
cmlidXRlKCdpZCcpID09PSBpZCkgeyByZXR1cm4gZWxlbWVudDsgfQorICAgIE5vdGUgdGhhdCBp
biBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0
YXJnZXQKKyAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRl
eHQuIFRoaXMgaXMgYSBnb29kIHdheQorICAgIHRvIGdpdmUgeW91ciBpdGVyYXRvciBmdW5jdGlv
biBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LgogCi0gIHZhciBsZW4gPSBlbGVtZW50LmNo
aWxkTm9kZXMubGVuZ3RoLCBpZHgsIG5vZGUsIGZvdW5kOwotICBmb3IgKGlkeD0wOyBpZHg8bGVu
OyBpZHgrKykgewotICAgIG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaWR4XTsKLSAgICBmb3Vu
ZCA9IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgZmluZENoaWxkQnlJZChub2RlLCBpZCk7Ci0gICAg
aWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZDsgfQotICB9Ci19OworICAgIFVzYWdlIEV4YW1wbGU6
CiAKLXZhciBzZXRJbm5lckhUTUxXaXRob3V0Rml4ID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkg
ewotICBpZiAobmVlZHNTaHkpIHsKLSAgICBodG1sID0gJyZzaHk7JyArIGh0bWw7Ci0gIH0KKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgaWYgKHBlb3BsZS5zb21lKGlzTWFuYWdlcikpIHsgUGF5Y2hl
Y2tzLmFkZEJpZ2dlckJvbnVzKCk7IH0KKyAgICBgYGAKIAotICB2YXIgbWF0Y2hlcyA9IFtdOwot
ICBpZiAobW92ZXNXaGl0ZXNwYWNlKSB7Ci0gICAgLy8gUmlnaHQgbm93IHdlIG9ubHkgY2hlY2sg
Zm9yIHNjcmlwdCB0YWdzIHdpdGggaWRzIHdpdGggdGhlCi0gICAgLy8gZ29hbCBvZiB0YXJnZXRp
bmcgbW9ycGhzLgotICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyhccyspKDxzY3JpcHQgaWQ9Jyhb
XiddKyknKS9nLCBmdW5jdGlvbihtYXRjaCwgc3BhY2VzLCB0YWcsIGlkKSB7Ci0gICAgICBtYXRj
aGVzLnB1c2goW2lkLCBzcGFjZXNdKTsKLSAgICAgIHJldHVybiB0YWc7Ci0gICAgfSk7Ci0gIH0K
KyAgICBAbWV0aG9kIHNvbWUKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2Fs
bGJhY2sgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0
IG9iamVjdCB0byB1c2UKKyAgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhc3Nl
ZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0ZW0KKyAgICBAZGVwcmVjYXRlZCBV
c2UgYGFueWAgaW5zdGVhZAorICAqLworICBzb21lOiBFbWJlci5hbGlhc01ldGhvZCgnYW55Jyks
CiAKLSAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1sOworICAvKioKKyAgICBSZXR1cm5zIGB0cnVl
YCBpZiB0aGUgcGFzc2VkIHByb3BlcnR5IHJlc29sdmVzIHRvIGB0cnVlYCBmb3IgYW55IGl0ZW0g
aW4KKyAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0
ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgogCi0gIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdo
aXRlc3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cKLSAgaWYgKG1hdGNoZXMubGVuZ3RoID4g
MCkgewotICAgIHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0aCwgaWR4OwotICAgIGZvciAoaWR4PTA7
IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICB2YXIgc2NyaXB0ID0gZmluZENoaWxkQnlJZChlbGVt
ZW50LCBtYXRjaGVzW2lkeF1bMF0pLAotICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVU
ZXh0Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwotICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0
QmVmb3JlKG5vZGUsIHNjcmlwdCk7Ci0gICAgfQotICB9CisgICAgQG1ldGhvZCBpc0FueQorICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKKyAgICBAcGFyYW0ge1N0
cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCisgICAgQHJldHVy
biB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAg
Zm9yIGFueSBpdGVtCisgICovCisgIGlzQW55OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAg
cmV0dXJuIHRoaXMuYW55KGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CisgIH0sCiAKLSAg
aWYgKG5lZWRzU2h5KSB7Ci0gICAgdmFyIHNoeUVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7
Ci0gICAgd2hpbGUgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9k
ZU5hbWUpIHsKLSAgICAgIHNoeUVsZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAg
fQotICAgIGlmIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZh
bHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKLSAgICAgIHNoeUVsZW1lbnQubm9kZVZhbHVl
ID0gc2h5RWxlbWVudC5ub2RlVmFsdWUuc2xpY2UoMSk7Ci0gICAgfQotICB9Ci19OworICAvKioK
KyAgICBAbWV0aG9kIGFueUJ5CisgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkg
dG8gdGVzdAorICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRl
c3QgYWdhaW5zdC4KKyAgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBm
dW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0ZW0KKyAgICBAZGVwcmVjYXRlZCBVc2Ug
YGlzQW55YCBpbnN0ZWFkCisgICovCisgIGFueUJ5OiBFbWJlci5hbGlhc01ldGhvZCgnaXNBbnkn
KSwKIAotLyoqKiBFTkQgTUVUQU1PUlBIIEhFTFBFUlMgKi8KKyAgLyoqCisgICAgQG1ldGhvZCBz
b21lUHJvcGVydHkKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0
CisgICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2Fp
bnN0LgorICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9u
IHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQorICAgIEBkZXByZWNhdGVkIFVzZSBgaXNBbnlg
IGluc3RlYWQKKyAgKi8KKyAgc29tZVByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnaXNBbnkn
KSwKIAorICAvKioKKyAgICBUaGlzIHdpbGwgY29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVt
ZXJhdG9yIGludG8gYSBzaW5nbGUgdmFsdWUuIEl0CisgICAgaXMgYSB1c2VmdWwgd2F5IHRvIGNv
bGxlY3QgYSBzdW1tYXJ5IHZhbHVlIGZyb20gYW4gZW51bWVyYXRpb24uIFRoaXMKKyAgICBjb3Jy
ZXNwb25kcyB0byB0aGUgYHJlZHVjZSgpYCBtZXRob2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEu
OC4KIAotdmFyIGlubmVySFRNTFRhZ3MgPSB7fTsKLXZhciBjYW5TZXRJbm5lckhUTUwgPSBmdW5j
dGlvbih0YWdOYW1lKSB7Ci0gIGlmIChpbm5lckhUTUxUYWdzW3RhZ05hbWVdICE9PSB1bmRlZmlu
ZWQpIHsKLSAgICByZXR1cm4gaW5uZXJIVE1MVGFnc1t0YWdOYW1lXTsKLSAgfQorICAgIFRoZSBj
YWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWdu
YXR1cmUgKGFsbAorICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKIAotICB2YXIgY2FuU2V0
ID0gdHJ1ZTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24ocHJldmlvdXNWYWx1ZSwg
aXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgIGBgYAogCi0gIC8vIElFIDggYW5kIGVhcmxp
ZXIgZG9uJ3QgYWxsb3cgdXMgdG8gZG8gaW5uZXJIVE1MIG9uIHNlbGVjdAotICBpZiAodGFnTmFt
ZS50b0xvd2VyQ2FzZSgpID09PSAnc2VsZWN0JykgewotICAgIHZhciBlbCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpOwotICAgIHNldElubmVySFRNTFdpdGhvdXRGaXgoZWwsICc8
b3B0aW9uIHZhbHVlPSJ0ZXN0Ij5UZXN0PC9vcHRpb24+Jyk7Ci0gICAgY2FuU2V0ID0gZWwub3B0
aW9ucy5sZW5ndGggPT09IDE7Ci0gIH0KKyAgICAtIGBwcmV2aW91c1ZhbHVlYCBpcyB0aGUgdmFs
dWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0byB0aGUgaXRlcmF0b3IuCisgICAgLSBgaXRl
bWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgIC0gYGluZGV4YCBp
cyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgorICAgIC0gYGVudW1lcmFibGVg
IGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCiAKLSAgaW5uZXJIVE1MVGFnc1t0YWdO
YW1lXSA9IGNhblNldDsKKyAgICBSZXR1cm4gdGhlIG5ldyBjdW11bGF0aXZlIHZhbHVlLgogCi0g
IHJldHVybiBjYW5TZXQ7Ci19OworICAgIEluIGFkZGl0aW9uIHRvIHRoZSBjYWxsYmFjayB5b3Ug
Y2FuIGFsc28gcGFzcyBhbiBgaW5pdGlhbFZhbHVlYC4gQW4gZXJyb3IKKyAgICB3aWxsIGJlIHJh
aXNlZCBpZiB5b3UgZG8gbm90IHBhc3MgYW4gaW5pdGlhbCB2YWx1ZSBhbmQgdGhlIGVudW1lcmF0
b3IgaXMKKyAgICBlbXB0eS4KIAotdmFyIHNldElubmVySFRNTCA9IGZ1bmN0aW9uKGVsZW1lbnQs
IGh0bWwpIHsKLSAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7CisgICAgTm90ZSB0aGF0
IHVubGlrZSB0aGUgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgYWxsb3cgeW91
IHRvCisgICAgcGFzcyBhIHRhcmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9yIHRoZSBjYWxs
YmFjay4gSXQncyBwYXJ0IG9mIHRoZQorICAgIHNwZWMuIFNvcnJ5LgogCi0gIGlmIChjYW5TZXRJ
bm5lckhUTUwodGFnTmFtZSkpIHsKLSAgICBzZXRJbm5lckhUTUxXaXRob3V0Rml4KGVsZW1lbnQs
IGh0bWwpOwotICB9IGVsc2UgewotICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IGlubmVySFRN
TCBvbiAiK2VsZW1lbnQudGFnTmFtZSsiIGluIHRoaXMgYnJvd3NlciIsIGVsZW1lbnQub3V0ZXJI
VE1MKTsKKyAgICBAbWV0aG9kIHJlZHVjZQorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr
IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgQHBhcmFtIHtPYmplY3R9IGluaXRpYWxWYWx1
ZSBJbml0aWFsIHZhbHVlIGZvciB0aGUgcmVkdWNlCisgICAgQHBhcmFtIHtTdHJpbmd9IHJlZHVj
ZXJQcm9wZXJ0eSBpbnRlcm5hbCB1c2Ugb25seS4KKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBy
ZWR1Y2VkIHZhbHVlLgorICAqLworICByZWR1Y2U6IGZ1bmN0aW9uKGNhbGxiYWNrLCBpbml0aWFs
VmFsdWUsIHJlZHVjZXJQcm9wZXJ0eSkgeworICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJm
dW5jdGlvbiIpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyB9CiAKLSAgICB2YXIgc3RhcnRUYWcg
PSBlbGVtZW50Lm91dGVySFRNTC5tYXRjaChuZXcgUmVnRXhwKCI8Iit0YWdOYW1lKyIoW14+XSop
PiIsICdpJykpWzBdLAotICAgICAgICBlbmRUYWcgPSAnPC8nK3RhZ05hbWUrJz4nOworICAgIHZh
ciByZXQgPSBpbml0aWFsVmFsdWU7CiAKLSAgICB2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoJ2RpdicpOwotICAgIHNldElubmVySFRNTFdpdGhvdXRGaXgod3JhcHBlciwgc3Rh
cnRUYWcgKyBodG1sICsgZW5kVGFnKTsKLSAgICBlbGVtZW50ID0gd3JhcHBlci5maXJzdENoaWxk
OwotICAgIHdoaWxlIChlbGVtZW50LnRhZ05hbWUgIT09IHRhZ05hbWUpIHsKLSAgICAgIGVsZW1l
bnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotICAgIH0KLSAgfQorICAgIHRoaXMuZm9yRWFjaChm
dW5jdGlvbihpdGVtLCBpKSB7CisgICAgICByZXQgPSBjYWxsYmFjay5jYWxsKG51bGwsIHJldCwg
aXRlbSwgaSwgdGhpcywgcmVkdWNlclByb3BlcnR5KTsKKyAgICB9LCB0aGlzKTsKIAotICByZXR1
cm4gZWxlbWVudDsKLX07CisgICAgcmV0dXJuIHJldDsKKyAgfSwKIAotZnVuY3Rpb24gaXNTaW1w
bGVDbGljayhldmVudCkgewotICB2YXIgbW9kaWZpZXIgPSBldmVudC5zaGlmdEtleSB8fCBldmVu
dC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5LAotICAgICAgc2Vjb25k
YXJ5Q2xpY2sgPSBldmVudC53aGljaCA+IDE7IC8vIElFOSBtYXkgcmV0dXJuIHVuZGVmaW5lZAor
ICAvKioKKyAgICBJbnZva2VzIHRoZSBuYW1lZCBtZXRob2Qgb24gZXZlcnkgb2JqZWN0IGluIHRo
ZSByZWNlaXZlciB0aGF0CisgICAgaW1wbGVtZW50cyBpdC4gVGhpcyBtZXRob2QgY29ycmVzcG9u
ZHMgdG8gdGhlIGltcGxlbWVudGF0aW9uIGluCisgICAgUHJvdG90eXBlIDEuNi4KIAotICByZXR1
cm4gIW1vZGlmaWVyICYmICFzZWNvbmRhcnlDbGljazsKLX0KKyAgICBAbWV0aG9kIGludm9rZQor
ICAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAg
ICBAcGFyYW0ge09iamVjdC4uLn0gYXJncyBvcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBhcyB3
ZWxsLgorICAgIEByZXR1cm4ge0FycmF5fSByZXR1cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZv
a2UuCisgICovCisgIGludm9rZTogZnVuY3Rpb24obWV0aG9kTmFtZSkgeworICAgIHZhciBhcmdz
LCByZXQgPSBFbWJlci5BKCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg+MSkgYXJncyA9IGFf
c2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogCi1FbWJlci5WaWV3VXRpbHMgPSB7Ci0gIHNldElu
bmVySFRNTDogc2V0SW5uZXJIVE1MLAotICBpc1NpbXBsZUNsaWNrOiBpc1NpbXBsZUNsaWNrCi19
OworICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih4LCBpZHgpIHsKKyAgICAgIHZhciBtZXRob2Qg
PSB4ICYmIHhbbWV0aG9kTmFtZV07CisgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG1l
dGhvZCkgeworICAgICAgICByZXRbaWR4XSA9IGFyZ3MgPyBtZXRob2QuYXBwbHkoeCwgYXJncykg
OiBtZXRob2QuY2FsbCh4KTsKKyAgICAgIH0KKyAgICB9LCB0aGlzKTsKIAotfSkoKTsKKyAgICBy
ZXR1cm4gcmV0OworICB9LAogCisgIC8qKgorICAgIFNpbXBseSBjb252ZXJ0cyB0aGUgZW51bWVy
YWJsZSBpbnRvIGEgZ2VudWluZSBhcnJheS4gVGhlIG9yZGVyIGlzIG5vdAorICAgIGd1YXJhbnRl
ZWQuIENvcnJlc3BvbmRzIHRvIHRoZSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgUHJvdG90eXBlLgog
CisgICAgQG1ldGhvZCB0b0FycmF5CisgICAgQHJldHVybiB7QXJyYXl9IHRoZSBlbnVtZXJhYmxl
IGFzIGFuIGFycmF5LgorICAqLworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmV0
ID0gRW1iZXIuQSgpOworICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihvLCBpZHgpIHsgcmV0W2lk
eF0gPSBvOyB9KTsKKyAgICByZXR1cm4gcmV0IDsKKyAgfSwKIAotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLworICAvKioKKyAgICBS
ZXR1cm5zIGEgY29weSBvZiB0aGUgYXJyYXkgd2l0aCBhbGwgbnVsbCBhbmQgdW5kZWZpbmVkIGVs
ZW1lbnRzIHJlbW92ZWQuCiAKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsK
LXZhciBpbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgdmFyIGFyciA9IFsiYSIsIG51bGwsICJjIiwgdW5kZWZpbmVkXTsKKyAgICBh
cnIuY29tcGFjdCgpOyAgLy8gWyJhIiwgImMiXQorICAgIGBgYAogCisgICAgQG1ldGhvZCBjb21w
YWN0CisgICAgQHJldHVybiB7QXJyYXl9IHRoZSBhcnJheSB3aXRob3V0IG51bGwgYW5kIHVuZGVm
aW5lZCBlbGVtZW50cy4KKyAgKi8KKyAgY29tcGFjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZSAhPSBudWxsOyB9KTsK
KyAgfSwKIAorICAvKioKKyAgICBSZXR1cm5zIGEgbmV3IGVudW1lcmFibGUgdGhhdCBleGNsdWRl
cyB0aGUgcGFzc2VkIHZhbHVlLiBUaGUgZGVmYXVsdAorICAgIGltcGxlbWVudGF0aW9uIHJldHVy
bnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlwZSB1bmxlc3MKKyAgICB0
aGUgcmVjZWl2ZXIgZG9lcyBub3QgY29udGFpbiB0aGUgdmFsdWUuCiAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImEiLCAiYyJdOworICAgIGFyci53aXRob3V0
KCJhIik7ICAvLyBbImIiLCAiYyJdCisgICAgYGBgCiAKLQotdmFyIENsYXNzU2V0ID0gZnVuY3Rp
b24oKSB7Ci0gIHRoaXMuc2VlbiA9IHt9OwotICB0aGlzLmxpc3QgPSBbXTsKLX07Ci0KLUNsYXNz
U2V0LnByb3RvdHlwZSA9IHsKLSAgYWRkOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICBpZiAoc3Ry
aW5nIGluIHRoaXMuc2VlbikgeyByZXR1cm47IH0KLSAgICB0aGlzLnNlZW5bc3RyaW5nXSA9IHRy
dWU7Ci0KLSAgICB0aGlzLmxpc3QucHVzaChzdHJpbmcpOworICAgIEBtZXRob2Qgd2l0aG91dAor
ICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZQorICAgIEByZXR1cm4ge0VtYmVyLkVudW1lcmFibGV9
CisgICovCisgIHdpdGhvdXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKCF0aGlzLmNvbnRh
aW5zKHZhbHVlKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KKyAgICB2YXIgcmV0ID0g
RW1iZXIuQSgpOworICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrKSB7CisgICAgICBpZiAoayAh
PT0gdmFsdWUpIHJldFtyZXQubGVuZ3RoXSA9IGs7CisgICAgfSkgOworICAgIHJldHVybiByZXQg
OwogICB9LAogCi0gIHRvRE9NOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5saXN0Lmpv
aW4oIiAiKTsKLSAgfQotfTsKLQotLyoqCi0gIGBFbWJlci5SZW5kZXJCdWZmZXJgIGdhdGhlcnMg
aW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBhIHZpZXcgYW5kIGdlbmVyYXRlcyB0aGUKLSAgZmlu
YWwgcmVwcmVzZW50YXRpb24uIGBFbWJlci5SZW5kZXJCdWZmZXJgIHdpbGwgZ2VuZXJhdGUgSFRN
TCB3aGljaCBjYW4gYmUgcHVzaGVkCi0gIHRvIHRoZSBET00uCi0KLSAgQGNsYXNzIFJlbmRlckJ1
ZmZlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBjb25zdHJ1Y3RvcgotKi8KLUVtYmVyLlJlbmRl
ckJ1ZmZlciA9IGZ1bmN0aW9uKHRhZ05hbWUpIHsKLSAgcmV0dXJuIG5ldyBFbWJlci5fUmVuZGVy
QnVmZmVyKHRhZ05hbWUpOwotfTsKLQotRW1iZXIuX1JlbmRlckJ1ZmZlciA9IGZ1bmN0aW9uKHRh
Z05hbWUpIHsKLSAgdGhpcy50YWdOYW1lcyA9IFt0YWdOYW1lIHx8IG51bGxdOwotICB0aGlzLmJ1
ZmZlciA9IFtdOwotfTsKLQotRW1iZXIuX1JlbmRlckJ1ZmZlci5wcm90b3R5cGUgPQotLyoqIEBz
Y29wZSBFbWJlci5SZW5kZXJCdWZmZXIucHJvdG90eXBlICovIHsKLQotICAvLyBUaGUgcm9vdCB2
aWV3J3MgZWxlbWVudAotICBfZWxlbWVudDogbnVsbCwKLQogICAvKioKLSAgICBAcHJpdmF0ZQor
ICAgIFJldHVybnMgYSBuZXcgZW51bWVyYWJsZSB0aGF0IGNvbnRhaW5zIG9ubHkgdW5pcXVlIHZh
bHVlcy4gVGhlIGRlZmF1bHQKKyAgICBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJl
Z2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUuCiAKLSAgICBBbiBpbnRlcm5hbCBzZXQgdXNl
ZCB0byBkZS1kdXBlIGNsYXNzIG5hbWVzIHdoZW4gYGFkZENsYXNzKClgIGlzCi0gICAgdXNlZC4g
QWZ0ZXIgZWFjaCBjYWxsIHRvIGBhZGRDbGFzcygpYCwgdGhlIGBjbGFzc2VzYCBwcm9wZXJ0eQot
ICAgIHdpbGwgYmUgdXBkYXRlZC4KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsi
YSIsICJhIiwgImIiLCAiYiJdOworICAgIGFyci51bmlxKCk7ICAvLyBbImEiLCAiYiJdCisgICAg
YGBgCiAKLSAgICBAcHJvcGVydHkgZWxlbWVudENsYXNzZXMKLSAgICBAdHlwZSBBcnJheQotICAg
IEBkZWZhdWx0IFtdCisgICAgQG1ldGhvZCB1bmlxCisgICAgQHJldHVybiB7RW1iZXIuRW51bWVy
YWJsZX0KICAgKi8KLSAgZWxlbWVudENsYXNzZXM6IG51bGwsCisgIHVuaXE6IGZ1bmN0aW9uKCkg
eworICAgIHZhciByZXQgPSBFbWJlci5BKCk7CisgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGsp
IHsKKyAgICAgIGlmIChhX2luZGV4T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsKKyAgICB9KTsK
KyAgICByZXR1cm4gcmV0OworICB9LAogCiAgIC8qKgotICAgIEFycmF5IG9mIGNsYXNzIG5hbWVz
IHdoaWNoIHdpbGwgYmUgYXBwbGllZCBpbiB0aGUgY2xhc3MgYXR0cmlidXRlLgorICAgIFRoaXMg
cHJvcGVydHkgd2lsbCB0cmlnZ2VyIGFueXRpbWUgdGhlIGVudW1lcmFibGUncyBjb250ZW50IGNo
YW5nZXMuCisgICAgWW91IGNhbiBvYnNlcnZlIHRoaXMgcHJvcGVydHkgdG8gYmUgbm90aWZpZWQg
b2YgY2hhbmdlcyB0byB0aGUgZW51bWVyYWJsZXMKKyAgICBjb250ZW50LgogCi0gICAgWW91IGNh
biB1c2UgYHNldENsYXNzZXMoKWAgdG8gc2V0IHRoaXMgcHJvcGVydHkgZGlyZWN0bHkuIElmIHlv
dQotICAgIHVzZSBgYWRkQ2xhc3MoKWAsIGl0IHdpbGwgYmUgbWFpbnRhaW5lZCBmb3IgeW91Lgor
ICAgIEZvciBwbGFpbiBlbnVtZXJhYmxlcywgdGhpcyBwcm9wZXJ0eSBpcyByZWFkIG9ubHkuIGBF
bWJlci5BcnJheWAgb3ZlcnJpZGVzCisgICAgdGhpcyBtZXRob2QuCiAKLSAgICBAcHJvcGVydHkg
Y2xhc3NlcwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgW10KKyAgICBAcHJvcGVydHkg
W10KKyAgICBAdHlwZSBFbWJlci5BcnJheQorICAgIEByZXR1cm4gdGhpcwogICAqLwotICBjbGFz
c2VzOiBudWxsLAorICAnW10nOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0pLAogCi0gIC8qKgotICAgIFRoZSBpZCBpbiBvZiB0aGUg
ZWxlbWVudCwgdG8gYmUgYXBwbGllZCBpbiB0aGUgaWQgYXR0cmlidXRlLgorICAvLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8v
IEVOVU1FUkFCTEUgT0JTRVJWRVJTCisgIC8vCiAKLSAgICBZb3Ugc2hvdWxkIG5vdCBzZXQgdGhp
cyBwcm9wZXJ0eSB5b3Vyc2VsZiwgcmF0aGVyLCB5b3Ugc2hvdWxkIHVzZQotICAgIHRoZSBgaWQo
KWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgorICAvKioKKyAgICBSZWdpc3RlcnMg
YW4gZW51bWVyYWJsZSBvYnNlcnZlci4gTXVzdCBpbXBsZW1lbnQgYEVtYmVyLkVudW1lcmFibGVP
YnNlcnZlcmAKKyAgICBtaXhpbi4KIAotICAgIEBwcm9wZXJ0eSBlbGVtZW50SWQKLSAgICBAdHlw
ZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCisgICAgQG1ldGhvZCBhZGRFbnVtZXJhYmxlT2Jz
ZXJ2ZXIKKyAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0CisgICAgQHBhcmFtIHtIYXNofSBbb3B0
c10KKyAgICBAcmV0dXJuIHRoaXMKICAgKi8KLSAgZWxlbWVudElkOiBudWxsLAorICBhZGRFbnVt
ZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgeworICAgIHZhciB3aWxsQ2hh
bmdlID0gKG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnZW51bWVyYWJsZVdpbGxDaGFuZ2Un
LAorICAgICAgICBkaWRDaGFuZ2UgID0gKG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UpIHx8ICdlbnVt
ZXJhYmxlRGlkQ2hhbmdlJzsKIAotICAvKioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5hbWUg
b2YgdGhlIGF0dHJpYnV0ZSBhbmQgd2hvc2UgdmFsdWUgd2lsbCBiZQotICAgIGFwcGxpZWQgdG8g
dGhhdCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAg
ICBgZGF0YS12aWV3PSJGb28uYmFyImAgcHJvcGVydHkgdG8gYW4gZWxlbWVudCwgeW91IHdvdWxk
IHNldCB0aGUKLSAgICBlbGVtZW50QXR0cmlidXRlcyBoYXNoIHRvIGB7J2RhdGEtdmlldyc6J0Zv
by5iYXInfWAuCisgICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzRW51bWVyYWJs
ZU9ic2VydmVycycpOworICAgIGlmICghaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxD
aGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKyAgICBFbWJlci5hZGRMaXN0
ZW5lcih0aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAg
ICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdlJywgdGFyZ2V0LCBk
aWRDaGFuZ2UpOworICAgIGlmICghaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5n
ZSh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOworICAgIHJldHVybiB0aGlzOworICB9
LAogCi0gICAgWW91IHNob3VsZCBub3QgbWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxmLCByYXRo
ZXIsIHlvdSBzaG91bGQgdXNlCi0gICAgdGhlIGBhdHRyKClgIG1ldGhvZCBvZiBgRW1iZXIuUmVu
ZGVyQnVmZmVyYC4KKyAgLyoqCisgICAgUmVtb3ZlcyBhIHJlZ2lzdGVyZWQgZW51bWVyYWJsZSBv
YnNlcnZlci4KIAotICAgIEBwcm9wZXJ0eSBlbGVtZW50QXR0cmlidXRlcwotICAgIEB0eXBlIEhh
c2gKLSAgICBAZGVmYXVsdCB7fQorICAgIEBtZXRob2QgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVy
CisgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAorICAgIEBwYXJhbSB7SGFzaH0gW29wdHNdCisg
ICAgQHJldHVybiB0aGlzCiAgICovCi0gIGVsZW1lbnRBdHRyaWJ1dGVzOiBudWxsLAorICByZW1v
dmVFbnVtZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgeworICAgIHZhciB3
aWxsQ2hhbmdlID0gKG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnZW51bWVyYWJsZVdpbGxD
aGFuZ2UnLAorICAgICAgICBkaWRDaGFuZ2UgID0gKG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UpIHx8
ICdlbnVtZXJhYmxlRGlkQ2hhbmdlJzsKIAotICAvKioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhl
IG5hbWUgb2YgdGhlIHByb3BlcnRpZXMgYW5kIHdob3NlIHZhbHVlIHdpbGwgYmUKLSAgICBhcHBs
aWVkIHRvIHRoYXQgcHJvcGVydHkuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5
IGEKLSAgICBgY2hlY2tlZD10cnVlYCBwcm9wZXJ0eSB0byBhbiBlbGVtZW50LCB5b3Ugd291bGQg
c2V0IHRoZQotICAgIGVsZW1lbnRQcm9wZXJ0aWVzIGhhc2ggdG8gYHsnY2hlY2tlZCc6dHJ1ZX1g
LgorICAgIHZhciBoYXNPYnNlcnZlcnMgPSBnZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZl
cnMnKTsKKyAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhp
cywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKyAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0
aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAgICBFbWJl
ci5yZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdlJywgdGFyZ2V0LCBkaWRD
aGFuZ2UpOworICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRo
aXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAK
LSAgICBZb3Ugc2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91cnNlbGYsIHJhdGhlciwg
eW91IHNob3VsZCB1c2UKLSAgICB0aGUgYHByb3AoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJC
dWZmZXJgLgorICAvKioKKyAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJl
bnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKKyAgICBvbiB0aGUgYXJyYXkuCiAK
LSAgICBAcHJvcGVydHkgZWxlbWVudFByb3BlcnRpZXMKLSAgICBAdHlwZSBIYXNoCi0gICAgQGRl
ZmF1bHQge30KKyAgICBAcHJvcGVydHkgaGFzRW51bWVyYWJsZU9ic2VydmVycworICAgIEB0eXBl
IEJvb2xlYW4KICAgKi8KLSAgZWxlbWVudFByb3BlcnRpZXM6IG51bGwsCi0KLSAgLyoqCi0gICAg
VGhlIHRhZ25hbWUgb2YgdGhlIGVsZW1lbnQgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlJlbmRlckJ1
ZmZlcmAgcmVwcmVzZW50cy4KKyAgaGFzRW51bWVyYWJsZU9ic2VydmVyczogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGVu
dW1lcmFibGU6Y2hhbmdlJykgfHwgRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAZW51bWVyYWJs
ZTpiZWZvcmUnKTsKKyAgfSksCiAKLSAgICBVc3VhbGx5LCB0aGlzIGdldHMgc2V0IGFzIHRoZSBm
aXJzdCBwYXJhbWV0ZXIgdG8gYEVtYmVyLlJlbmRlckJ1ZmZlcmAuIEZvcgotICAgIGV4YW1wbGUs
IGlmIHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEgYHBgIHRhZywgdGhlbiB5b3Ugd291bGQgY2FsbAog
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlJlbmRlckJ1ZmZlcigncCcpCi0gICAgYGBg
CisgIC8qKgorICAgIEludm9rZSB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMg
b2YgeW91ciBlbnVtZXJhYmxlIHdpbGwKKyAgICBjaGFuZ2UuIFlvdSBjYW4gZWl0aGVyIG9taXQg
dGhlIHBhcmFtZXRlcnMgY29tcGxldGVseSBvciBwYXNzIHRoZSBvYmplY3RzCisgICAgdG8gYmUg
cmVtb3ZlZCBvciBhZGRlZCBpZiBhdmFpbGFibGUgb3IganVzdCBhIGNvdW50LgogCi0gICAgQHBy
b3BlcnR5IGVsZW1lbnRUYWcKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCisg
ICAgQG1ldGhvZCBlbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2UKKyAgICBAcGFyYW0ge0VtYmVy
LkVudW1lcmFibGV8TnVtYmVyfSByZW1vdmluZyBBbiBlbnVtZXJhYmxlIG9mIHRoZSBvYmplY3Rz
IHRvCisgICAgICBiZSByZW1vdmVkIG9yIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgcmVtb3Zl
ZC4KKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSBhZGRpbmcgQW4gZW51bWVy
YWJsZSBvZiB0aGUgb2JqZWN0cyB0byBiZQorICAgICAgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBp
dGVtcyB0byBiZSBhZGRlZC4KKyAgICBAY2hhaW5hYmxlCiAgICovCi0gIGVsZW1lbnRUYWc6IG51
bGwsCisgIGVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24ocmVtb3ZpbmcsIGFk
ZGluZykgewogCi0gIC8qKgotICAgIEEgaGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUgc3R5
bGUgYXR0cmlidXRlIGFuZCB3aG9zZSB2YWx1ZSB3aWxsCi0gICAgYmUgYXBwbGllZCB0byB0aGF0
IGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYXBwbHkgYQotICAgIGBi
YWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2Agc3R5bGUgdG8gYW4gZWxlbWVudCwgeW91IHdvdWxkIHNl
dCB0aGUKLSAgICBlbGVtZW50U3R5bGUgaGFzaCB0byBgeydiYWNrZ3JvdW5kLWNvbG9yJzonYmxh
Y2snfWAuCisgICAgdmFyIHJlbW92ZUNudCwgYWRkQ250LCBoYXNEZWx0YTsKIAotICAgIFlvdSBz
aG91bGQgbm90IG1haW50YWluIHRoaXMgaGFzaCB5b3Vyc2VsZiwgcmF0aGVyLCB5b3Ugc2hvdWxk
IHVzZQotICAgIHRoZSBgc3R5bGUoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgor
ICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHJlbW92aW5nKSByZW1vdmVDbnQgPSByZW1vdmlu
ZzsKKyAgICBlbHNlIGlmIChyZW1vdmluZykgcmVtb3ZlQ250ID0gZ2V0KHJlbW92aW5nLCAnbGVu
Z3RoJyk7CisgICAgZWxzZSByZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOwogCi0gICAgQHByb3Bl
cnR5IGVsZW1lbnRTdHlsZQotICAgIEB0eXBlIEhhc2gKLSAgICBAZGVmYXVsdCB7fQotICAqLwot
ICBlbGVtZW50U3R5bGU6IG51bGwsCisgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgYWRkaW5n
KSBhZGRDbnQgPSBhZGRpbmc7CisgICAgZWxzZSBpZiAoYWRkaW5nKSBhZGRDbnQgPSBnZXQoYWRk
aW5nLCdsZW5ndGgnKTsKKyAgICBlbHNlIGFkZENudCA9IGFkZGluZyA9IC0xOwogCi0gIC8qKgot
ICAgIE5lc3RlZCBgUmVuZGVyQnVmZmVyc2Agd2lsbCBzZXQgdGhpcyB0byB0aGVpciBwYXJlbnQg
YFJlbmRlckJ1ZmZlcmAKLSAgICBpbnN0YW5jZS4KKyAgICBoYXNEZWx0YSA9IGFkZENudDwwIHx8
IHJlbW92ZUNudDwwIHx8IGFkZENudC1yZW1vdmVDbnQhPT0wOwogCi0gICAgQHByb3BlcnR5IHBh
cmVudEJ1ZmZlcgotICAgIEB0eXBlIEVtYmVyLl9SZW5kZXJCdWZmZXIKLSAgKi8KLSAgcGFyZW50
QnVmZmVyOiBudWxsLAorICAgIGlmIChyZW1vdmluZyA9PT0gLTEpIHJlbW92aW5nID0gbnVsbDsK
KyAgICBpZiAoYWRkaW5nICAgPT09IC0xKSBhZGRpbmcgICA9IG51bGw7CiAKLSAgLyoqCi0gICAg
QWRkcyBhIHN0cmluZyBvZiBIVE1MIHRvIHRoZSBgUmVuZGVyQnVmZmVyYC4KKyAgICBFbWJlci5w
cm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ1tdJyk7CisgICAgaWYgKGhhc0RlbHRhKSBFbWJlci5w
cm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xlbmd0aCcpOworICAgIEVtYmVyLnNlbmRFdmVudCh0
aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJywgW3RoaXMsIHJlbW92aW5nLCBhZGRpbmddKTsKIAot
ICAgIEBtZXRob2QgcHVzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgSFRNTCB0byBwdXNo
IGludG8gdGhlIGJ1ZmZlcgotICAgIEBjaGFpbmFibGUKLSAgKi8KLSAgcHVzaDogZnVuY3Rpb24o
c3RyaW5nKSB7Ci0gICAgdGhpcy5idWZmZXIucHVzaChzdHJpbmcpOwogICAgIHJldHVybiB0aGlz
OwogICB9LAogCiAgIC8qKgotICAgIEFkZHMgYSBjbGFzcyB0byB0aGUgYnVmZmVyLCB3aGljaCB3
aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUuCisgICAgSW52b2tlIHRoaXMg
bWV0aG9kIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHlvdXIgZW51bWVyYWJsZSBoYXMgY2hhbmdlZC4K
KyAgICBUaGlzIHdpbGwgbm90aWZ5IGFueSBvYnNlcnZlcnMgd2F0Y2hpbmcgZm9yIGNvbnRlbnQg
Y2hhbmdlcy4gSWYgeW91ciBhcmUKKyAgICBpbXBsZW1lbnRpbmcgYW4gb3JkZXJlZCBlbnVtZXJh
YmxlIChzdWNoIGFzIGFuIGFycmF5KSwgYWxzbyBwYXNzIHRoZQorICAgIHN0YXJ0IGFuZCBlbmQg
dmFsdWVzIHdoZXJlIHRoZSBjb250ZW50IGNoYW5nZWQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0
bworICAgIG5vdGlmeSByYW5nZSBvYnNlcnZlcnMuCiAKLSAgICBAbWV0aG9kIGFkZENsYXNzCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGFkZCB0byB0aGUgYnVm
ZmVyCisgICAgQG1ldGhvZCBlbnVtZXJhYmxlQ29udGVudERpZENoYW5nZQorICAgIEBwYXJhbSB7
TnVtYmVyfSBbc3RhcnRdIG9wdGlvbmFsIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGNvbnRlbnQgY2hh
bmdlLgorICAgICAgRm9yIHVub3JkZXJlZCBlbnVtZXJhYmxlcywgeW91IHNob3VsZCBhbHdheXMg
cGFzcyAtMS4KKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSByZW1vdmluZyBB
biBlbnVtZXJhYmxlIG9mIHRoZSBvYmplY3RzIHRvCisgICAgICBiZSByZW1vdmVkIG9yIHRoZSBu
dW1iZXIgb2YgaXRlbXMgdG8gYmUgcmVtb3ZlZC4KKyAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFi
bGV8TnVtYmVyfSBhZGRpbmcgIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KKyAgICAg
IGJlIGFkZGVkIG9yIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgYWRkZWQuCiAgICAgQGNoYWlu
YWJsZQogICAqLwotICBhZGRDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKSB7Ci0gICAgLy8gbGF6
aWx5IGNyZWF0ZSBlbGVtZW50Q2xhc3NlcwotICAgIHZhciBlbGVtZW50Q2xhc3NlcyA9IHRoaXMu
ZWxlbWVudENsYXNzZXMgPSAodGhpcy5lbGVtZW50Q2xhc3NlcyB8fCBuZXcgQ2xhc3NTZXQoKSk7
Ci0gICAgdGhpcy5lbGVtZW50Q2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLSAgICB0aGlzLmNsYXNz
ZXMgPSB0aGlzLmVsZW1lbnRDbGFzc2VzLmxpc3Q7CisgIGVudW1lcmFibGVDb250ZW50RGlkQ2hh
bmdlOiBmdW5jdGlvbihyZW1vdmluZywgYWRkaW5nKSB7CisgICAgdmFyIHJlbW92ZUNudCwgYWRk
Q250LCBoYXNEZWx0YTsKIAotICAgIHJldHVybiB0aGlzOwotICB9LAorICAgIGlmICgnbnVtYmVy
JyA9PT0gdHlwZW9mIHJlbW92aW5nKSByZW1vdmVDbnQgPSByZW1vdmluZzsKKyAgICBlbHNlIGlm
IChyZW1vdmluZykgcmVtb3ZlQ250ID0gZ2V0KHJlbW92aW5nLCAnbGVuZ3RoJyk7CisgICAgZWxz
ZSByZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOwogCi0gIHNldENsYXNzZXM6IGZ1bmN0aW9uKGNs
YXNzTmFtZXMpIHsKLSAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc05hbWVzOwotICB9LAorICAgIGlm
ICgnbnVtYmVyJyA9PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRkaW5nOworICAgIGVsc2Ug
aWYgKGFkZGluZykgYWRkQ250ID0gZ2V0KGFkZGluZywgJ2xlbmd0aCcpOworICAgIGVsc2UgYWRk
Q250ID0gYWRkaW5nID0gLTE7CiAKLSAgLyoqCi0gICAgU2V0cyB0aGUgZWxlbWVudElEIHRvIGJl
IHVzZWQgZm9yIHRoZSBlbGVtZW50LgorICAgIGhhc0RlbHRhID0gYWRkQ250PDAgfHwgcmVtb3Zl
Q250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9PTA7CiAKLSAgICBAbWV0aG9kIGlkCi0gICAgQHBh
cmFtIHtTdHJpbmd9IGlkCi0gICAgQGNoYWluYWJsZQotICAqLwotICBpZDogZnVuY3Rpb24oaWQp
IHsKLSAgICB0aGlzLmVsZW1lbnRJZCA9IGlkOwotICAgIHJldHVybiB0aGlzOwotICB9LAorICAg
IGlmIChyZW1vdmluZyA9PT0gLTEpIHJlbW92aW5nID0gbnVsbDsKKyAgICBpZiAoYWRkaW5nICAg
PT09IC0xKSBhZGRpbmcgICA9IG51bGw7CiAKLSAgLy8gZHVjayB0eXBlIGF0dHJpYnV0ZSBmdW5j
dGlvbmFsaXR5IGxpa2UgalF1ZXJ5IHNvIGEgcmVuZGVyIGJ1ZmZlcgotICAvLyBjYW4gYmUgdXNl
ZCBsaWtlIGEgalF1ZXJ5IG9iamVjdCBpbiBhdHRyaWJ1dGUgYmluZGluZyBzY2VuYXJpb3MuCisg
ICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCBbdGhpcywgcmVt
b3ZpbmcsIGFkZGluZ10pOworICAgIGlmIChoYXNEZWx0YSkgRW1iZXIucHJvcGVydHlEaWRDaGFu
Z2UodGhpcywgJ2xlbmd0aCcpOworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdb
XScpOworCisgICAgcmV0dXJuIHRoaXMgOworICB9LAogCiAgIC8qKgotICAgIEFkZHMgYW4gYXR0
cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgQ29udmVy
dHMgdGhlIGVudW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQgc29ydHMgYnkgdGhlIGtleXMKKyAg
ICBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50LgogCi0gICAgQG1ldGhvZCBhdHRyCi0gICAgQHBh
cmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgIEBwYXJhbSB7
U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBhdHRyaWJ1dGUKLSAgICBAY2hh
aW5hYmxlCi0gICAgQHJldHVybiB7RW1iZXIuUmVuZGVyQnVmZmVyfFN0cmluZ30gdGhpcyBvciB0
aGUgY3VycmVudCBhdHRyaWJ1dGUgdmFsdWUKLSAgKi8KLSAgYXR0cjogZnVuY3Rpb24obmFtZSwg
dmFsdWUpIHsKLSAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSAo
dGhpcy5lbGVtZW50QXR0cmlidXRlcyB8fCB7fSk7CisgICAgWW91IG1heSBwcm92aWRlIG11bHRp
cGxlIGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHByb3BlcnRpZXMuCiAKLSAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewotICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNbbmFtZV07
Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTsKLSAgICB9Cisg
ICAgQG1ldGhvZCBzb3J0QnkKKyAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZShzKSB0
byBzb3J0IG9uCisgICAgQHJldHVybiB7QXJyYXl9IFRoZSBzb3J0ZWQgYXJyYXkuCisgICAgKi8K
KyAgc29ydEJ5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc29ydEtleXMgPSBhcmd1bWVudHM7Cisg
ICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLnNvcnQoZnVuY3Rpb24oYSwgYil7CisgICAgICBmb3Io
dmFyIGkgPSAwOyBpIDwgc29ydEtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGtleSA9
IHNvcnRLZXlzW2ldLAorICAgICAgICBwcm9wQSA9IGdldChhLCBrZXkpLAorICAgICAgICBwcm9w
QiA9IGdldChiLCBrZXkpOworICAgICAgICAvLyByZXR1cm4gMSBvciAtMSBlbHNlIGNvbnRpbnVl
IHRvIHRoZSBuZXh0IHNvcnRLZXkKKyAgICAgICAgdmFyIGNvbXBhcmVWYWx1ZSA9IEVtYmVyLmNv
bXBhcmUocHJvcEEsIHByb3BCKTsKKyAgICAgICAgaWYgKGNvbXBhcmVWYWx1ZSkgeyByZXR1cm4g
Y29tcGFyZVZhbHVlOyB9CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9KTsKKyAgfQor
fSk7CiAKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKK30pKCk7CiAKLSAgLyoqCi0gICAgUmVtb3Zl
IGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gcmVuZGVyLgogCi0g
ICAgQG1ldGhvZCByZW1vdmVBdHRyCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUg
b2YgdGhlIGF0dHJpYnV0ZQotICAgIEBjaGFpbmFibGUKLSAgKi8KLSAgcmVtb3ZlQXR0cjogZnVu
Y3Rpb24obmFtZSkgewotICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5lbGVtZW50QXR0cmlidXRl
czsKLSAgICBpZiAoYXR0cmlidXRlcykgeyBkZWxldGUgYXR0cmlidXRlc1tuYW1lXTsgfQogCi0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIK
K0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KIAotICAvKioKLSAgICBBZGRzIGFuIHByb3Bl
cnR5IHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCisvLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBIRUxQ
RVJTCisvLwogCi0gICAgQG1ldGhvZCBwcm9wCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhl
IG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB2YWx1
ZSB0byBhZGQgdG8gdGhlIHByb3BlcnR5Ci0gICAgQGNoYWluYWJsZQotICAgIEByZXR1cm4ge0Vt
YmVyLlJlbmRlckJ1ZmZlcnxTdHJpbmd9IHRoaXMgb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFs
dWUKLSAgKi8KLSAgcHJvcDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKLSAgICB2YXIgcHJvcGVy
dGllcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5lbGVtZW50UHJvcGVydGllcyB8
fCB7fSk7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGlzTm9uZSA9IEVt
YmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwgY2FjaGVGb3IgPSBF
bWJlci5jYWNoZUZvcjsKIAotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7Ci0gICAg
ICByZXR1cm4gcHJvcGVydGllc1tuYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAgcHJvcGVydGll
c1tuYW1lXSA9IHZhbHVlOwotICAgIH0KKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy8vIEFSUkFZCisvLworLyoqCisgIFRoaXMg
bW9kdWxlIGltcGxlbWVudHMgT2JzZXJ2ZXItZnJpZW5kbHkgQXJyYXktbGlrZSBiZWhhdmlvci4g
VGhpcyBtaXhpbiBpcworICBwaWNrZWQgdXAgYnkgdGhlIEFycmF5IGNsYXNzIGFzIHdlbGwgYXMg
b3RoZXIgY29udHJvbGxlcnMsIGV0Yy4gdGhhdCB3YW50IHRvCisgIGFwcGVhciB0byBiZSBhcnJh
eXMuCiAKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKKyAgVW5saWtlIGBFbWJlci5FbnVtZXJhYmxl
LGAgdGhpcyBtaXhpbiBkZWZpbmVzIG1ldGhvZHMgc3BlY2lmaWNhbGx5IGZvcgorICBjb2xsZWN0
aW9ucyB0aGF0IHByb3ZpZGUgaW5kZXgtb3JkZXJlZCBhY2Nlc3MgdG8gdGhlaXIgY29udGVudHMu
IFdoZW4geW91CisgIGFyZSBkZXNpZ25pbmcgY29kZSB0aGF0IG5lZWRzIHRvIGFjY2VwdCBhbnkg
a2luZCBvZiBBcnJheS1saWtlIG9iamVjdCwgeW91CisgIHNob3VsZCB1c2UgdGhlc2UgbWV0aG9k
cyBpbnN0ZWFkIG9mIEFycmF5IHByaW1pdGl2ZXMgYmVjYXVzZSB0aGVzZSB3aWxsCisgIHByb3Bl
cmx5IG5vdGlmeSBvYnNlcnZlcnMgb2YgY2hhbmdlcyB0byB0aGUgYXJyYXkuCisKKyAgQWx0aG91
Z2ggdGhlc2UgbWV0aG9kcyBhcmUgZWZmaWNpZW50LCB0aGV5IGRvIGFkZCBhIGxheWVyIG9mIGlu
ZGlyZWN0aW9uIHRvCisgIHlvdXIgYXBwbGljYXRpb24gc28gaXQgaXMgYSBnb29kIGlkZWEgdG8g
dXNlIHRoZW0gb25seSB3aGVuIHlvdSBuZWVkIHRoZQorICBmbGV4aWJpbGl0eSBvZiB1c2luZyBi
b3RoIHRydWUgSmF2YVNjcmlwdCBhcnJheXMgYW5kICJ2aXJ0dWFsIiBhcnJheXMgc3VjaAorICBh
cyBjb250cm9sbGVycyBhbmQgY29sbGVjdGlvbnMuCisKKyAgWW91IGNhbiB1c2UgdGhlIG1ldGhv
ZHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB0byBhY2Nlc3MgYW5kIG1vZGlmeSBhcnJheQorICBj
b250ZW50cyBpbiBhIEtWTy1mcmllbmRseSB3YXkuIFlvdSBjYW4gYWxzbyBiZSBub3RpZmllZCB3
aGVuZXZlciB0aGUKKyAgbWVtYmVyc2hpcCBvZiBhbiBhcnJheSBjaGFuZ2VzIGJ5IGNoYW5naW5n
IHRoZSBzeW50YXggb2YgdGhlIHByb3BlcnR5IHRvCisgIGAub2JzZXJ2ZXMoJypteVByb3BlcnR5
LltdJylgLgorCisgIFRvIHN1cHBvcnQgYEVtYmVyLkFycmF5YCBpbiB5b3VyIG93biBjbGFzcywg
eW91IG11c3Qgb3ZlcnJpZGUgdHdvCisgIHByaW1pdGl2ZXMgdG8gdXNlIGl0OiBgcmVwbGFjZSgp
YCBhbmQgYG9iamVjdEF0KClgLgorCisgIE5vdGUgdGhhdCB0aGUgRW1iZXIuQXJyYXkgbWl4aW4g
YWxzbyBpbmNvcnBvcmF0ZXMgdGhlIGBFbWJlci5FbnVtZXJhYmxlYAorICBtaXhpbi4gQWxsIGBF
bWJlci5BcnJheWAtbGlrZSBvYmplY3RzIGFyZSBhbHNvIGVudW1lcmFibGUuCisKKyAgQGNsYXNz
IEFycmF5CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQHVzZXMgRW1iZXIuRW51bWVyYWJsZQorICBA
c2luY2UgRW1iZXIgMC45LjAKKyovCitFbWJlci5BcnJheSA9IEVtYmVyLk1peGluLmNyZWF0ZShF
bWJlci5FbnVtZXJhYmxlLCB7CiAKICAgLyoqCi0gICAgUmVtb3ZlIGFuIHByb3BlcnR5IGZyb20g
dGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0byByZW5kZXIuCisgICAgWW91ciBhcnJheSBtdXN0IHN1
cHBvcnQgdGhlIGBsZW5ndGhgIHByb3BlcnR5LiBZb3VyIHJlcGxhY2UgbWV0aG9kcyBzaG91bGQK
KyAgICBzZXQgdGhpcyBwcm9wZXJ0eSB3aGVuZXZlciBpdCBjaGFuZ2VzLgogCi0gICAgQG1ldGhv
ZCByZW1vdmVQcm9wCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBy
b3BlcnR5Ci0gICAgQGNoYWluYWJsZQorICAgIEBwcm9wZXJ0eSB7TnVtYmVyfSBsZW5ndGgKICAg
Ki8KLSAgcmVtb3ZlUHJvcDogZnVuY3Rpb24obmFtZSkgewotICAgIHZhciBwcm9wZXJ0aWVzID0g
dGhpcy5lbGVtZW50UHJvcGVydGllczsKLSAgICBpZiAocHJvcGVydGllcykgeyBkZWxldGUgcHJv
cGVydGllc1tuYW1lXTsgfQorICBsZW5ndGg6IEVtYmVyLnJlcXVpcmVkKCksCiAKLSAgICByZXR1
cm4gdGhpczsKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBgaW5k
ZXhgLiBJZiB0aGUgZ2l2ZW4gYGluZGV4YCBpcyBuZWdhdGl2ZQorICAgIG9yIGlzIGdyZWF0ZXIg
b3IgZXF1YWwgdGhhbiB0aGUgYXJyYXkgbGVuZ3RoLCByZXR1cm5zIGB1bmRlZmluZWRgLgorCisg
ICAgVGhpcyBpcyBvbmUgb2YgdGhlIHByaW1pdGl2ZXMgeW91IG11c3QgaW1wbGVtZW50IHRvIHN1
cHBvcnQgYEVtYmVyLkFycmF5YC4KKyAgICBJZiB5b3VyIG9iamVjdCBzdXBwb3J0cyByZXRyaWV2
aW5nIHRoZSB2YWx1ZSBvZiBhbiBhcnJheSBpdGVtIHVzaW5nIGBnZXQoKWAKKyAgICAoaS5lLiBg
bXlBcnJheS5nZXQoMClgKSwgdGhlbiB5b3UgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMg
bWV0aG9kCisgICAgeW91cnNlbGYuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9
IFsnYScsICdiJywgJ2MnLCAnZCddOworICAgIGFyci5vYmplY3RBdCgwKTsgICAvLyAiYSIKKyAg
ICBhcnIub2JqZWN0QXQoMyk7ICAgLy8gImQiCisgICAgYXJyLm9iamVjdEF0KC0xKTsgIC8vIHVu
ZGVmaW5lZAorICAgIGFyci5vYmplY3RBdCg0KTsgICAvLyB1bmRlZmluZWQKKyAgICBhcnIub2Jq
ZWN0QXQoNSk7ICAgLy8gdW5kZWZpbmVkCisgICAgYGBgCisKKyAgICBAbWV0aG9kIG9iamVjdEF0
CisgICAgQHBhcmFtIHtOdW1iZXJ9IGlkeCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJu
LgorICAgIEByZXR1cm4geyp9IGl0ZW0gYXQgaW5kZXggb3IgdW5kZWZpbmVkCisgICovCisgIG9i
amVjdEF0OiBmdW5jdGlvbihpZHgpIHsKKyAgICBpZiAoKGlkeCA8IDApIHx8IChpZHg+PWdldCh0
aGlzLCAnbGVuZ3RoJykpKSByZXR1cm4gdW5kZWZpbmVkIDsKKyAgICByZXR1cm4gZ2V0KHRoaXMs
IGlkeCk7CiAgIH0sCiAKICAgLyoqCi0gICAgQWRkcyBhIHN0eWxlIHRvIHRoZSBzdHlsZSBhdHRy
aWJ1dGUgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KKyAgICBUaGlzIHJl
dHVybnMgdGhlIG9iamVjdHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzLCB1c2luZyBgb2JqZWN0
QXRgLgogCi0gICAgQG1ldGhvZCBzdHlsZQotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUg
b2YgdGhlIHN0eWxlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlCi0gICAgQGNoYWluYWJsZQot
ICAqLwotICBzdHlsZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKLSAgICB2YXIgc3R5bGUgPSB0
aGlzLmVsZW1lbnRTdHlsZSA9ICh0aGlzLmVsZW1lbnRTdHlsZSB8fCB7fSk7CisgICAgYGBgamF2
YXNjcmlwdAorICAgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107CisgICAgYXJyLm9i
amVjdHNBdChbMCwgMSwgMl0pOyAgLy8gWyJhIiwgImIiLCAiYyJdCisgICAgYXJyLm9iamVjdHNB
dChbMiwgMywgNF0pOyAgLy8gWyJjIiwgImQiLCB1bmRlZmluZWRdCisgICAgYGBgCiAKLSAgICB0
aGlzLmVsZW1lbnRTdHlsZVtuYW1lXSA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOworICAgIEBt
ZXRob2Qgb2JqZWN0c0F0CisgICAgQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBBbiBhcnJheSBvZiBp
bmRleGVzIG9mIGl0ZW1zIHRvIHJldHVybi4KKyAgICBAcmV0dXJuIHtBcnJheX0KKyAgICovCisg
IG9iamVjdHNBdDogZnVuY3Rpb24oaW5kZXhlcykgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAg
ICByZXR1cm4gbWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGlkeCkgeyByZXR1cm4gc2VsZi5vYmplY3RB
dChpZHgpOyB9KTsKICAgfSwKIAotICBiZWdpbjogZnVuY3Rpb24odGFnTmFtZSkgewotICAgIHRo
aXMudGFnTmFtZXMucHVzaCh0YWdOYW1lIHx8IG51bGwpOwotICAgIHJldHVybiB0aGlzOworICAv
LyBvdmVycmlkZXMgRW1iZXIuRW51bWVyYWJsZSB2ZXJzaW9uCisgIG5leHRPYmplY3Q6IGZ1bmN0
aW9uKGlkeCkgeworICAgIHJldHVybiB0aGlzLm9iamVjdEF0KGlkeCk7CiAgIH0sCiAKLSAgcHVz
aE9wZW5pbmdUYWc6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0YWdOYW1lID0gdGhpcy5jdXJyZW50
VGFnTmFtZSgpOwotICAgIGlmICghdGFnTmFtZSkgeyByZXR1cm47IH0KKyAgLyoqCisgICAgVGhp
cyBpcyB0aGUgaGFuZGxlciBmb3IgdGhlIHNwZWNpYWwgYXJyYXkgY29udGVudCBwcm9wZXJ0eS4g
SWYgeW91IGdldAorICAgIHRoaXMgcHJvcGVydHksIGl0IHdpbGwgcmV0dXJuIHRoaXMuIElmIHlv
dSBzZXQgdGhpcyBwcm9wZXJ0eSBpdCBhIG5ldworICAgIGFycmF5LCBpdCB3aWxsIHJlcGxhY2Ug
dGhlIGN1cnJlbnQgY29udGVudC4KIAotICAgIGlmICghdGhpcy5fZWxlbWVudCAmJiB0aGlzLmJ1
ZmZlci5sZW5ndGggPT09IDApIHsKLSAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLmdlbmVyYXRl
RWxlbWVudCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBUaGlzIHByb3BlcnR5IG92ZXJy
aWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxlYC4K
IAotICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKLSAgICAgICAgaWQgPSB0aGlzLmVsZW1l
bnRJZCwKLSAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKLSAgICAgICAgYXR0cnMgPSB0
aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAotICAgICAgICBwcm9wcyA9IHRoaXMuZWxlbWVudFByb3Bl
cnRpZXMsCi0gICAgICAgIHN0eWxlID0gdGhpcy5lbGVtZW50U3R5bGUsCi0gICAgICAgIGF0dHIs
IHByb3A7CisgICAgQHByb3BlcnR5IFtdCisgICAgQHJldHVybiB0aGlzCisgICovCisgICdbXSc6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgIT09
IHVuZGVmaW5lZCkgdGhpcy5yZXBsYWNlKDAsIGdldCh0aGlzLCAnbGVuZ3RoJyksIHZhbHVlKSA7
CisgICAgcmV0dXJuIHRoaXMgOworICB9KSwKIAotICAgIGJ1ZmZlci5wdXNoKCc8JyArIHRhZ05h
bWUpOworICBmaXJzdE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuIHRoaXMub2JqZWN0QXQoMCk7CisgIH0pLAogCi0gICAgaWYgKGlkKSB7Ci0gICAgICBidWZm
ZXIucHVzaCgnIGlkPSInICsgdGhpcy5fZXNjYXBlQXR0cmlidXRlKGlkKSArICciJyk7Ci0gICAg
ICB0aGlzLmVsZW1lbnRJZCA9IG51bGw7Ci0gICAgfQotICAgIGlmIChjbGFzc2VzKSB7Ci0gICAg
ICBidWZmZXIucHVzaCgnIGNsYXNzPSInICsgdGhpcy5fZXNjYXBlQXR0cmlidXRlKGNsYXNzZXMu
am9pbignICcpKSArICciJyk7Ci0gICAgICB0aGlzLmNsYXNzZXMgPSBudWxsOwotICAgIH0KKyAg
bGFzdE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMu
b2JqZWN0QXQoZ2V0KHRoaXMsICdsZW5ndGgnKS0xKTsKKyAgfSksCiAKLSAgICBpZiAoc3R5bGUp
IHsKLSAgICAgIGJ1ZmZlci5wdXNoKCcgc3R5bGU9IicpOworICAvLyBvcHRpbWl6ZWQgdmVyc2lv
biBmcm9tIEVudW1lcmFibGUKKyAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVy
biB0aGlzLmluZGV4T2Yob2JqKSA+PSAwOworICB9LAogCi0gICAgICBmb3IgKHByb3AgaW4gc3R5
bGUpIHsKLSAgICAgICAgaWYgKHN0eWxlLmhhc093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAg
ICAgYnVmZmVyLnB1c2gocHJvcCArICc6JyArIHRoaXMuX2VzY2FwZUF0dHJpYnV0ZShzdHlsZVtw
cm9wXSkgKyAnOycpOwotICAgICAgICB9Ci0gICAgICB9CisgIC8vIEFkZCBhbnkgZXh0cmEgbWV0
aG9kcyB0byBFbWJlci5BcnJheSB0aGF0IGFyZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWluIEFycmF5
LgorICAvKioKKyAgICBSZXR1cm5zIGEgbmV3IGFycmF5IHRoYXQgaXMgYSBzbGljZSBvZiB0aGUg
cmVjZWl2ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICB1c2VzIHRoZSBvYnNlcnZhYmxlIGFy
cmF5IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG9iamVjdHMgZm9yIHRoZSBuZXcKKyAgICBzbGlj
ZS4KIAotICAgICAgYnVmZmVyLnB1c2goJyInKTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFy
IGFyciA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXTsKKyAgICBhcnIuc2xpY2UoMCk7ICAgICAg
IC8vIFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXQorICAgIGFyci5zbGljZSgwLCAyKTsgICAgLy8g
WydyZWQnLCAnZ3JlZW4nXQorICAgIGFyci5zbGljZSgxLCAxMDApOyAgLy8gWydncmVlbicsICdi
bHVlJ10KKyAgICBgYGAKIAotICAgICAgdGhpcy5lbGVtZW50U3R5bGUgPSBudWxsOwotICAgIH0K
KyAgICBAbWV0aG9kIHNsaWNlCisgICAgQHBhcmFtIHtJbnRlZ2VyfSBiZWdpbkluZGV4IChPcHRp
b25hbCkgaW5kZXggdG8gYmVnaW4gc2xpY2luZyBmcm9tLgorICAgIEBwYXJhbSB7SW50ZWdlcn0g
ZW5kSW5kZXggKE9wdGlvbmFsKSBpbmRleCB0byBlbmQgdGhlIHNsaWNlIGF0LgorICAgIEByZXR1
cm4ge0FycmF5fSBOZXcgYXJyYXkgd2l0aCBzcGVjaWZpZWQgc2xpY2UKKyAgKi8KKyAgc2xpY2U6
IGZ1bmN0aW9uKGJlZ2luSW5kZXgsIGVuZEluZGV4KSB7CisgICAgdmFyIHJldCA9IEVtYmVyLkEo
KTsKKyAgICB2YXIgbGVuZ3RoID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7CisgICAgaWYgKGlzTm9u
ZShiZWdpbkluZGV4KSkgYmVnaW5JbmRleCA9IDAgOworICAgIGlmIChpc05vbmUoZW5kSW5kZXgp
IHx8IChlbmRJbmRleCA+IGxlbmd0aCkpIGVuZEluZGV4ID0gbGVuZ3RoIDsKIAotICAgIGlmIChh
dHRycykgewotICAgICAgZm9yIChhdHRyIGluIGF0dHJzKSB7Ci0gICAgICAgIGlmIChhdHRycy5o
YXNPd25Qcm9wZXJ0eShhdHRyKSkgewotICAgICAgICAgIGJ1ZmZlci5wdXNoKCcgJyArIGF0dHIg
KyAnPSInICsgdGhpcy5fZXNjYXBlQXR0cmlidXRlKGF0dHJzW2F0dHJdKSArICciJyk7Ci0gICAg
ICAgIH0KLSAgICAgIH0KKyAgICBpZiAoYmVnaW5JbmRleCA8IDApIGJlZ2luSW5kZXggPSBsZW5n
dGggKyBiZWdpbkluZGV4OworICAgIGlmIChlbmRJbmRleCA8IDApIGVuZEluZGV4ID0gbGVuZ3Ro
ICsgZW5kSW5kZXg7CiAKLSAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOworICAg
IHdoaWxlKGJlZ2luSW5kZXggPCBlbmRJbmRleCkgeworICAgICAgcmV0W3JldC5sZW5ndGhdID0g
dGhpcy5vYmplY3RBdChiZWdpbkluZGV4KyspIDsKICAgICB9CisgICAgcmV0dXJuIHJldCA7Cisg
IH0sCiAKLSAgICBpZiAocHJvcHMpIHsKLSAgICAgIGZvciAocHJvcCBpbiBwcm9wcykgewotICAg
ICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICB2YXIgdmFs
dWUgPSBwcm9wc1twcm9wXTsKLSAgICAgICAgICBpZiAodmFsdWUgfHwgdHlwZW9mKHZhbHVlKSA9
PT0gJ251bWJlcicpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgewotICAgICAg
ICAgICAgICBidWZmZXIucHVzaCgnICcgKyBwcm9wICsgJz0iJyArIHByb3AgKyAnIicpOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgYnVmZmVyLnB1c2goJyAnICsgcHJvcCAr
ICc9IicgKyB0aGlzLl9lc2NhcGVBdHRyaWJ1dGUocHJvcHNbcHJvcF0pICsgJyInKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgLyoqCisgICAgUmV0
dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCdzIGZpcnN0IG9jY3VycmVuY2UuCisg
ICAgSWYgbm8gYHN0YXJ0QXRgIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgc3RhcnRpbmcgbG9jYXRp
b24gdG8KKyAgICBzZWFyY2ggaXMgMC4gSWYgaXQncyBuZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNr
d2FyZCBmcm9tCisgICAgdGhlIGVuZCBvZiB0aGUgYXJyYXkuIFJldHVybnMgLTEgaWYgbm8gbWF0
Y2ggaXMgZm91bmQuCiAKLSAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBudWxsOwotICAg
IH0KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiLCAiZCIs
ICJhIl07CisgICAgYXJyLmluZGV4T2YoImEiKTsgICAgICAgLy8gIDAKKyAgICBhcnIuaW5kZXhP
ZigieiIpOyAgICAgICAvLyAtMQorICAgIGFyci5pbmRleE9mKCJhIiwgMik7ICAgIC8vICA0Cisg
ICAgYXJyLmluZGV4T2YoImEiLCAtMSk7ICAgLy8gIDQKKyAgICBhcnIuaW5kZXhPZigiYiIsIDMp
OyAgICAvLyAtMQorICAgIGFyci5pbmRleE9mKCJhIiwgMTAwKTsgIC8vIC0xCisgICAgYGBgCiAK
LSAgICBidWZmZXIucHVzaCgnPicpOwotICB9LAorICAgIEBtZXRob2QgaW5kZXhPZgorICAgIEBw
YXJhbSB7T2JqZWN0fSBvYmplY3QgdGhlIGl0ZW0gdG8gc2VhcmNoIGZvcgorICAgIEBwYXJhbSB7
TnVtYmVyfSBzdGFydEF0IG9wdGlvbmFsIHN0YXJ0aW5nIGxvY2F0aW9uIHRvIHNlYXJjaCwgZGVm
YXVsdCAwCisgICAgQHJldHVybiB7TnVtYmVyfSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAg
Ki8KKyAgaW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGlkeCwg
bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKIAotICBwdXNoQ2xvc2luZ1RhZzogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWVzLnBvcCgpOwotICAgIGlmICh0YWdO
YW1lKSB7IHRoaXMuYnVmZmVyLnB1c2goJzwvJyArIHRhZ05hbWUgKyAnPicpOyB9Ci0gIH0sCisg
ICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgc3RhcnRBdCA9IDA7CisgICAgaWYgKHN0YXJ0
QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKIAotICBjdXJyZW50VGFnTmFtZTogZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIHRoaXMudGFnTmFtZXNbdGhpcy50YWdOYW1lcy5sZW5ndGgtMV07CisgICAg
Zm9yKGlkeD1zdGFydEF0O2lkeDxsZW47aWR4KyspIHsKKyAgICAgIGlmICh0aGlzLm9iamVjdEF0
KGlkeCkgPT09IG9iamVjdCkgcmV0dXJuIGlkeCA7CisgICAgfQorICAgIHJldHVybiAtMTsKICAg
fSwKIAotICBnZW5lcmF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0YWdOYW1lID0g
dGhpcy50YWdOYW1lcy5wb3AoKSwgLy8gcG9wIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gY2xvc2UK
LSAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSksCi0gICAg
ICAgICRlbGVtZW50ID0gRW1iZXIuJChlbGVtZW50KSwKLSAgICAgICAgaWQgPSB0aGlzLmVsZW1l
bnRJZCwKLSAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKLSAgICAgICAgYXR0cnMgPSB0
aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAotICAgICAgICBwcm9wcyA9IHRoaXMuZWxlbWVudFByb3Bl
cnRpZXMsCi0gICAgICAgIHN0eWxlID0gdGhpcy5lbGVtZW50U3R5bGUsCi0gICAgICAgIHN0eWxl
QnVmZmVyID0gJycsIGF0dHIsIHByb3A7CisgIC8qKgorICAgIFJldHVybnMgdGhlIGluZGV4IG9m
IHRoZSBnaXZlbiBvYmplY3QncyBsYXN0IG9jY3VycmVuY2UuCisgICAgSWYgbm8gYHN0YXJ0QXRg
IGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgc2VhcmNoIHN0YXJ0cyBmcm9tCisgICAgdGhlIGxhc3Qg
cG9zaXRpb24uIElmIGl0J3MgbmVnYXRpdmUsIHdpbGwgY291bnQgYmFja3dhcmQKKyAgICBmcm9t
IHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgog
Ci0gICAgaWYgKGlkKSB7Ci0gICAgICAkZWxlbWVudC5hdHRyKCdpZCcsIGlkKTsKLSAgICAgIHRo
aXMuZWxlbWVudElkID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKGNsYXNzZXMpIHsKLSAgICAgICRl
bGVtZW50LmF0dHIoJ2NsYXNzJywgY2xhc3Nlcy5qb2luKCcgJykpOwotICAgICAgdGhpcy5jbGFz
c2VzID0gbnVsbDsKLSAgICB9CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBhcnIgPSBbImEi
LCAiYiIsICJjIiwgImQiLCAiYSJdOworICAgIGFyci5sYXN0SW5kZXhPZigiYSIpOyAgICAgICAv
LyAgNAorICAgIGFyci5sYXN0SW5kZXhPZigieiIpOyAgICAgICAvLyAtMQorICAgIGFyci5sYXN0
SW5kZXhPZigiYSIsIDIpOyAgICAvLyAgMAorICAgIGFyci5sYXN0SW5kZXhPZigiYSIsIC0xKTsg
ICAvLyAgNAorICAgIGFyci5sYXN0SW5kZXhPZigiYiIsIDMpOyAgICAvLyAgMQorICAgIGFyci5s
YXN0SW5kZXhPZigiYSIsIDEwMCk7ICAvLyAgNAorICAgIGBgYAogCi0gICAgaWYgKHN0eWxlKSB7
Ci0gICAgICBmb3IgKHByb3AgaW4gc3R5bGUpIHsKLSAgICAgICAgaWYgKHN0eWxlLmhhc093blBy
b3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgc3R5bGVCdWZmZXIgKz0gKHByb3AgKyAnOicgKyBz
dHlsZVtwcm9wXSArICc7Jyk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICBAbWV0aG9kIGxhc3RJ
bmRleE9mCisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0byBzZWFyY2ggZm9y
CisgICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24g
dG8gc2VhcmNoLCBkZWZhdWx0IDAKKyAgICBAcmV0dXJuIHtOdW1iZXJ9IGluZGV4IG9yIC0xIGlm
IG5vdCBmb3VuZAorICAqLworICBsYXN0SW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0
KSB7CisgICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKIAotICAgICAgJGVs
ZW1lbnQuYXR0cignc3R5bGUnLCBzdHlsZUJ1ZmZlcik7CisgICAgaWYgKHN0YXJ0QXQgPT09IHVu
ZGVmaW5lZCB8fCBzdGFydEF0ID49IGxlbikgc3RhcnRBdCA9IGxlbi0xOworICAgIGlmIChzdGFy
dEF0IDwgMCkgc3RhcnRBdCArPSBsZW47CiAKLSAgICAgIHRoaXMuZWxlbWVudFN0eWxlID0gbnVs
bDsKKyAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4Pj0wO2lkeC0tKSB7CisgICAgICBpZiAodGhpcy5v
YmplY3RBdChpZHgpID09PSBvYmplY3QpIHJldHVybiBpZHggOwogICAgIH0KKyAgICByZXR1cm4g
LTE7CisgIH0sCiAKLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAoYXR0ciBpbiBhdHRycykg
ewotICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoYXR0cikpIHsKLSAgICAgICAgICAk
ZWxlbWVudC5hdHRyKGF0dHIsIGF0dHJzW2F0dHJdKTsKLSAgICAgICAgfQotICAgICAgfQorICAv
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisgIC8vIEFSUkFZIE9CU0VSVkVSUworICAvLwogCi0gICAgICB0aGlzLmVsZW1lbnRBdHRy
aWJ1dGVzID0gbnVsbDsKLSAgICB9CisgIC8qKgorICAgIEFkZHMgYW4gYXJyYXkgb2JzZXJ2ZXIg
dG8gdGhlIHJlY2VpdmluZyBhcnJheS4gVGhlIGFycmF5IG9ic2VydmVyIG9iamVjdAorICAgIG5v
cm1hbGx5IG11c3QgaW1wbGVtZW50IHR3byBtZXRob2RzOgogCi0gICAgaWYgKHByb3BzKSB7Ci0g
ICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHsKLSAgICAgICAgaWYgKHByb3BzLmhhc093blByb3Bl
cnR5KHByb3ApKSB7Ci0gICAgICAgICAgJGVsZW1lbnQucHJvcChwcm9wLCBwcm9wc1twcm9wXSk7
Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAqIGBhcnJheVdpbGxDaGFuZ2Uob2JzZXJ2ZWRPYmos
IHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAg
ICAgIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgaXMgbW9kaWZpZWQuCisgICAgKiBgYXJy
YXlEaWRDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAt
IFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICAgIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBp
cyBtb2RpZmllZC4KIAotICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG51bGw7Ci0gICAg
fQorICAgIEJvdGggY2FsbGJhY2tzIHdpbGwgYmUgcGFzc2VkIHRoZSBvYnNlcnZlZCBvYmplY3Qs
IHN0YXJ0aW5nIGluZGV4IG9mIHRoZQorICAgIGNoYW5nZSBhcyB3ZWxsIGEgYSBjb3VudCBvZiB0
aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNlCisgICAgdGhlc2Ug
Y2FsbGJhY2tzIHRvIG9wdGlvbmFsbHkgaW5zcGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFu
Z2UsIGNsZWFyCisgICAgY2FjaGVzLCBvciBkbyBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNz
YXJ5LgogCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0sCisgICAgSW4gYWRkaXRpb24gdG8gcGFz
c2luZyBhIHRhcmdldCwgeW91IGNhbiBhbHNvIGluY2x1ZGUgYW4gb3B0aW9ucyBoYXNoCisgICAg
d2hpY2ggeW91IGNhbiB1c2UgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdpbGwg
YmUgaW52b2tlZCBvbiB0aGUKKyAgICB0YXJnZXQuCiAKLSAgLyoqCi0gICAgQG1ldGhvZCBlbGVt
ZW50Ci0gICAgQHJldHVybiB7RE9NRWxlbWVudH0gVGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0
byB0aGUgZ2VuZXJhdGVkIEhUTUwKLSAgICAgIG9mIHRoaXMgYnVmZmVyCisgICAgQG1ldGhvZCBh
ZGRBcnJheU9ic2VydmVyCisgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgb2JzZXJ2ZXIg
b2JqZWN0LgorICAgIEBwYXJhbSB7SGFzaH0gb3B0cyBPcHRpb25hbCBoYXNoIG9mIGNvbmZpZ3Vy
YXRpb24gb3B0aW9ucyBpbmNsdWRpbmcKKyAgICAgIGB3aWxsQ2hhbmdlYCBhbmQgYGRpZENoYW5n
ZWAgb3B0aW9uLgorICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgogICAqLwotICBl
bGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaHRtbCA9IHRoaXMuaW5uZXJTdHJpbmcoKTsK
LQotICAgIGlmIChodG1sKSB7Ci0gICAgICB0aGlzLl9lbGVtZW50ID0gRW1iZXIuVmlld1V0aWxz
LnNldElubmVySFRNTCh0aGlzLl9lbGVtZW50LCBodG1sKTsKLSAgICB9CisgIGFkZEFycmF5T2Jz
ZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgeworICAgIHZhciB3aWxsQ2hhbmdlID0gKG9w
dHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnYXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgICAgZGlk
Q2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnYXJyYXlEaWRDaGFuZ2UnOwog
Ci0gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7CisgICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0
aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKKyAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIu
cHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOworICAgIEVtYmVy
LmFkZExpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsK
KyAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlk
Q2hhbmdlKTsKKyAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo
dGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7CisgICAgcmV0dXJuIHRoaXM7CiAgIH0sCiAKICAg
LyoqCi0gICAgR2VuZXJhdGVzIHRoZSBIVE1MIGNvbnRlbnQgZm9yIHRoaXMgYnVmZmVyLgorICAg
IFJlbW92ZXMgYW4gYXJyYXkgb2JzZXJ2ZXIgZnJvbSB0aGUgb2JqZWN0IGlmIHRoZSBvYnNlcnZl
ciBpcyBjdXJyZW50CisgICAgcmVnaXN0ZXJlZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBs
ZSB0aW1lcyB3aXRoIHRoZSBzYW1lIG9iamVjdCB3aWxsCisgICAgaGF2ZSBubyBlZmZlY3QuCiAK
LSAgICBAbWV0aG9kIHN0cmluZwotICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBI
VE1MCisgICAgQG1ldGhvZCByZW1vdmVBcnJheU9ic2VydmVyCisgICAgQHBhcmFtIHtPYmplY3R9
IHRhcmdldCBUaGUgb2JqZWN0IG9ic2VydmluZyB0aGUgYXJyYXkuCisgICAgQHBhcmFtIHtIYXNo
fSBvcHRzIE9wdGlvbmFsIGhhc2ggb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZwor
ICAgICAgYHdpbGxDaGFuZ2VgIGFuZCBgZGlkQ2hhbmdlYCBvcHRpb24uCisgICAgQHJldHVybiB7
RW1iZXIuQXJyYXl9IHJlY2VpdmVyCiAgICovCi0gIHN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAg
aWYgKHRoaXMuX2VsZW1lbnQpIHsKLSAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQoKS5vdXRlckhU
TUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0aGlzLmlubmVyU3RyaW5nKCk7Ci0gICAg
fQotICB9LAorICByZW1vdmVBcnJheU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsK
KyAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2FycmF5
V2lsbENoYW5nZScsCisgICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5n
ZSkgfHwgJ2FycmF5RGlkQ2hhbmdlJzsKIAotICBpbm5lclN0cmluZzogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIHRoaXMuYnVmZmVyLmpvaW4oJycpOworICAgIHZhciBoYXNPYnNlcnZlcnMgPSBn
ZXQodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7CisgICAgaWYgKGhhc09ic2VydmVycykgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOworICAgIEVt
YmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hh
bmdlKTsKKyAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRh
cmdldCwgZGlkQ2hhbmdlKTsKKyAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURp
ZENoYW5nZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKKyAgICByZXR1cm4gdGhpczsKICAg
fSwKIAotICBfZXNjYXBlQXR0cmlidXRlOiBmdW5jdGlvbih2YWx1ZSkgewotICAgIC8vIFN0b2xl
biBzaGFtZWxlc3NseSBmcm9tIEhhbmRsZWJhcnMKKyAgLyoqCisgICAgQmVjb21lcyB0cnVlIHdo
ZW5ldmVyIHRoZSBhcnJheSBjdXJyZW50bHkgaGFzIG9ic2VydmVycyB3YXRjaGluZyBjaGFuZ2Vz
CisgICAgb24gdGhlIGFycmF5LgogCi0gICAgdmFyIGVzY2FwZSA9IHsKLSAgICAgICI8IjogIiZs
dDsiLAotICAgICAgIj4iOiAiJmd0OyIsCi0gICAgICAnIic6ICImcXVvdDsiLAotICAgICAgIici
OiAiJiN4Mjc7IiwKLSAgICAgICJgIjogIiYjeDYwOyIKLSAgICB9OworICAgIEBwcm9wZXJ0eSBC
b29sZWFuCisgICovCisgIGhhc0FycmF5T2JzZXJ2ZXJzOiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6Y2hhbmdl
JykgfHwgRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6YmVmb3JlJyk7CisgIH0pLAog
Ci0gICAgdmFyIGJhZENoYXJzID0gLyYoPyFcdys7KXxbPD4iJ2BdL2c7Ci0gICAgdmFyIHBvc3Np
YmxlID0gL1smPD4iJ2BdLzsKKyAgLyoqCisgICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4g
b2JqZWN0IHRoYXQgc3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCisgICAgbWV0aG9k
IGp1c3QgYmVmb3JlIHRoZSBhcnJheSBjb250ZW50IGNoYW5nZXMgdG8gbm90aWZ5IGFueSBvYnNl
cnZlcnMgYW5kCisgICAgaW52YWxpZGF0ZSBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzLiBQYXNzIHRo
ZSBzdGFydGluZyBpbmRleCBvZiB0aGUgY2hhbmdlCisgICAgYXMgd2VsbCBhcyBhIGRlbHRhIG9m
IHRoZSBhbW91bnRzIHRvIGNoYW5nZS4KIAotICAgIHZhciBlc2NhcGVDaGFyID0gZnVuY3Rpb24o
Y2hyKSB7Ci0gICAgICByZXR1cm4gZXNjYXBlW2Nocl0gfHwgIiZhbXA7IjsKLSAgICB9OworICAg
IEBtZXRob2QgYXJyYXlDb250ZW50V2lsbENoYW5nZQorICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFy
dElkeCBUaGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIGFycmF5IHRoYXQgd2lsbCBjaGFuZ2UuCisg
ICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZUFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2ls
bCBiZSByZW1vdmVkLiBJZiB5b3UKKyAgICAgIHBhc3MgYG51bGxgIGFzc3VtZXMgMAorICAgIEBw
YXJhbSB7TnVtYmVyfSBhZGRBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgYWRk
ZWQuIElmIHlvdQorICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwLgorICAgIEByZXR1cm4ge0Vt
YmVyLkFycmF5fSByZWNlaXZlcgorICAqLworICBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5j
dGlvbihzdGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXQpIHsKIAotICAgIHZhciBzdHJpbmcgPSB2
YWx1ZS50b1N0cmluZygpOworICAgIC8vIGlmIG5vIGFyZ3MgYXJlIHBhc3NlZCBhc3N1bWUgZXZl
cnl0aGluZyBjaGFuZ2VzCisgICAgaWYgKHN0YXJ0SWR4PT09dW5kZWZpbmVkKSB7CisgICAgICBz
dGFydElkeCA9IDA7CisgICAgICByZW1vdmVBbXQgPSBhZGRBbXQgPSAtMTsKKyAgICB9IGVsc2Ug
eworICAgICAgaWYgKHJlbW92ZUFtdCA9PT0gdW5kZWZpbmVkKSByZW1vdmVBbXQ9LTE7CisgICAg
ICBpZiAoYWRkQW10ICAgID09PSB1bmRlZmluZWQpIGFkZEFtdD0tMTsKKyAgICB9CiAKLSAgICBp
ZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH0KLSAgICByZXR1cm4g
c3RyaW5nLnJlcGxhY2UoYmFkQ2hhcnMsIGVzY2FwZUNoYXIpOwotICB9CisgICAgLy8gTWFrZSBz
dXJlIHRoZSBAZWFjaCBwcm94eSBpcyBzZXQgdXAgaWYgYW55b25lIGlzIG9ic2VydmluZyBAZWFj
aAorICAgIGlmIChFbWJlci5pc1dhdGNoaW5nKHRoaXMsICdAZWFjaCcpKSB7IGdldCh0aGlzLCAn
QGVhY2gnKTsgfQogCi19OworICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmJlZm9y
ZScsIFt0aGlzLCBzdGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXRdKTsKIAotfSkoKTsKKyAgICB2
YXIgcmVtb3ZpbmcsIGxpbTsKKyAgICBpZiAoc3RhcnRJZHg+PTAgJiYgcmVtb3ZlQW10Pj0wICYm
IGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpKSB7CisgICAgICByZW1vdmluZyA9
IFtdOworICAgICAgbGltID0gc3RhcnRJZHgrcmVtb3ZlQW10OworICAgICAgZm9yKHZhciBpZHg9
c3RhcnRJZHg7aWR4PGxpbTtpZHgrKykgcmVtb3ZpbmcucHVzaCh0aGlzLm9iamVjdEF0KGlkeCkp
OworICAgIH0gZWxzZSB7CisgICAgICByZW1vdmluZyA9IHJlbW92ZUFtdDsKKyAgICB9CiAKKyAg
ICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShyZW1vdmluZywgYWRkQW10KTsKIAor
ICAgIHJldHVybiB0aGlzOworICB9LAogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCisgIC8qKgorICAgIElmIHlvdSBhcmUgaW1w
bGVtZW50aW5nIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGBFbWJlci5BcnJheWAsIGNhbGwgdGhp
cworICAgIG1ldGhvZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBjb250ZW50IGNoYW5nZXMgdG8gbm90
aWZ5IGFueSBvYnNlcnZlcnMgYW5kCisgICAgaW52YWxpZGF0ZSBhbnkgcmVsYXRlZCBwcm9wZXJ0
aWVzLiBQYXNzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgY2hhbmdlCisgICAgYXMgd2VsbCBh
cyBhIGRlbHRhIG9mIHRoZSBhbW91bnRzIHRvIGNoYW5nZS4KIAotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0LCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OworICAgIEBtZXRob2Qg
YXJyYXlDb250ZW50RGlkQ2hhbmdlCisgICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4IFRoZSBz
dGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdGhhdCBkaWQgY2hhbmdlLgorICAgIEBwYXJhbSB7
TnVtYmVyfSByZW1vdmVBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZC4g
SWYgeW91CisgICAgICBwYXNzIGBudWxsYCBhc3N1bWVzIDAKKyAgICBAcGFyYW0ge051bWJlcn0g
YWRkQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLiBJZiB5b3UKKyAgICAg
IHBhc3MgYG51bGxgIGFzc3VtZXMgMC4KKyAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2
ZXIKKyAgKi8KKyAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihzdGFydElkeCwgcmVt
b3ZlQW10LCBhZGRBbXQpIHsKIAotLyoqCi0gIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGhhbmRs
ZXMgZGVsZWdhdGluZyBicm93c2VyIGV2ZW50cyB0byB0aGVpcgotICBjb3JyZXNwb25kaW5nIGBF
bWJlci5WaWV3cy5gIEZvciBleGFtcGxlLCB3aGVuIHlvdSBjbGljayBvbiBhIHZpZXcsCi0gIGBF
bWJlci5FdmVudERpc3BhdGNoZXJgIGVuc3VyZXMgdGhhdCB0aGF0IHZpZXcncyBgbW91c2VEb3du
YCBtZXRob2QgZ2V0cwotICBjYWxsZWQuCisgICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFz
c3VtZSBldmVyeXRoaW5nIGNoYW5nZXMKKyAgICBpZiAoc3RhcnRJZHg9PT11bmRlZmluZWQpIHsK
KyAgICAgIHN0YXJ0SWR4ID0gMDsKKyAgICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOworICAg
IH0gZWxzZSB7CisgICAgICBpZiAocmVtb3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFtdD0t
MTsKKyAgICAgIGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5lZCkgYWRkQW10PS0xOworICAgIH0K
IAotICBAY2xhc3MgRXZlbnREaXNwYXRjaGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZh
dGUKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotRW1iZXIuRXZlbnREaXNwYXRjaGVyID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCgKLS8qKiBAc2NvcGUgRW1iZXIuRXZlbnREaXNwYXRjaGVyLnBy
b3RvdHlwZSAqL3sKKyAgICB2YXIgYWRkaW5nLCBsaW07CisgICAgaWYgKHN0YXJ0SWR4Pj0wICYm
IGFkZEFtdD49MCAmJiBnZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKSkgeworICAg
ICAgYWRkaW5nID0gW107CisgICAgICBsaW0gPSBzdGFydElkeCthZGRBbXQ7CisgICAgICBmb3Io
dmFyIGlkeD1zdGFydElkeDtpZHg8bGltO2lkeCsrKSBhZGRpbmcucHVzaCh0aGlzLm9iamVjdEF0
KGlkeCkpOworICAgIH0gZWxzZSB7CisgICAgICBhZGRpbmcgPSBhZGRBbXQ7CisgICAgfQogCi0g
IC8qKgotICAgIEBwcml2YXRlCisgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShy
ZW1vdmVBbXQsIGFkZGluZyk7CisgICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsICdAYXJyYXk6Y2hh
bmdlJywgW3RoaXMsIHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdF0pOwogCi0gICAgVGhlIHJv
b3QgRE9NIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNob3VsZCBiZSBhdHRhY2hl
ZC4gRXZlbnQKLSAgICBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQg
dW5sZXNzIHRoaXMgaXMgb3ZlcnJpZGRlbi4KLQotICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBE
T01FbGVtZW50IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgorICAgIHZhciBsZW5ndGggICAgICA9IGdl
dCh0aGlzLCAnbGVuZ3RoJyksCisgICAgICAgIGNhY2hlZEZpcnN0ID0gY2FjaGVGb3IodGhpcywg
J2ZpcnN0T2JqZWN0JyksCisgICAgICAgIGNhY2hlZExhc3QgID0gY2FjaGVGb3IodGhpcywgJ2xh
c3RPYmplY3QnKTsKKyAgICBpZiAodGhpcy5vYmplY3RBdCgwKSAhPT0gY2FjaGVkRmlyc3QpIHsK
KyAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKKyAg
ICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOworICAgIH0K
KyAgICBpZiAodGhpcy5vYmplY3RBdChsZW5ndGgtMSkgIT09IGNhY2hlZExhc3QpIHsKKyAgICAg
IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOworICAgICAgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKKyAgICB9CiAKLSAgICBU
aGUgZGVmYXVsdCBib2R5IGlzIGEgc3RyaW5nIHNpbmNlIHRoaXMgbWF5IGJlIGV2YWx1YXRlZCBi
ZWZvcmUgZG9jdW1lbnQuYm9keQotICAgIGV4aXN0cyBpbiB0aGUgRE9NLgorICAgIHJldHVybiB0
aGlzOworICB9LAogCi0gICAgQHByb3BlcnR5IHJvb3RFbGVtZW50Ci0gICAgQHR5cGUgRE9NRWxl
bWVudAotICAgIEBkZWZhdWx0ICdib2R5JwotICAqLwotICByb290RWxlbWVudDogJ2JvZHknLAor
ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uCisgIC8vIEVOVU1FUkFURUQgUFJPUEVSVElFUworICAvLwogCiAgIC8qKgotICAgIEBw
cml2YXRlCi0KLSAgICBTZXRzIHVwIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RhbmRhcmQgYnJvd3Nl
ciBldmVudHMuCisgICAgUmV0dXJucyBhIHNwZWNpYWwgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQg
dG8gb2JzZXJ2ZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMKKyAgICBvbiB0aGUgYXJyYXkuIEp1c3Qg
Z2V0IGFuIGVxdWl2YWxlbnQgcHJvcGVydHkgb24gdGhpcyBvYmplY3QgYW5kIGl0IHdpbGwKKyAg
ICByZXR1cm4gYW4gZW51bWVyYWJsZSB0aGF0IG1hcHMgYXV0b21hdGljYWxseSB0byB0aGUgbmFt
ZWQga2V5IG9uIHRoZQorICAgIG1lbWJlciBvYmplY3RzLgogCi0gICAgVGhpcyB3aWxsIGJlIGNh
bGxlZCBhZnRlciB0aGUgYnJvd3NlciBzZW5kcyBhIGBET01Db250ZW50UmVhZHlgIGV2ZW50LiBC
eQotICAgIGRlZmF1bHQsIGl0IHdpbGwgc2V0IHVwIGFsbCBvZiB0aGUgbGlzdGVuZXJzIG9uIHRo
ZSBkb2N1bWVudCBib2R5LiBJZiB5b3UKLSAgICB3b3VsZCBsaWtlIHRvIHJlZ2lzdGVyIHRoZSBs
aXN0ZW5lcnMgb24gYSBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoZSBldmVudAotICAgIGRpc3Bh
dGNoZXIncyBgcm9vdGAgcHJvcGVydHkuCisgICAgSWYgeW91IG1lcmVseSB3YW50IHRvIHdhdGNo
IGZvciBhbnkgaXRlbXMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCB0byB0aGUgYXJyYXksCisgICAg
dXNlIHRoZSBgW11gIHByb3BlcnR5IGluc3RlYWQgb2YgYEBlYWNoYC4KIAotICAgIEBtZXRob2Qg
c2V0dXAKLSAgICBAcGFyYW0gYWRkZWRFdmVudHMge0hhc2h9CisgICAgQHByb3BlcnR5IEBlYWNo
CiAgICovCi0gIHNldHVwOiBmdW5jdGlvbihhZGRlZEV2ZW50cykgewotICAgIHZhciBldmVudCwg
ZXZlbnRzID0gewotICAgICAgdG91Y2hzdGFydCAgOiAndG91Y2hTdGFydCcsCi0gICAgICB0b3Vj
aG1vdmUgICA6ICd0b3VjaE1vdmUnLAotICAgICAgdG91Y2hlbmQgICAgOiAndG91Y2hFbmQnLAot
ICAgICAgdG91Y2hjYW5jZWwgOiAndG91Y2hDYW5jZWwnLAotICAgICAga2V5ZG93biAgICAgOiAn
a2V5RG93bicsCi0gICAgICBrZXl1cCAgICAgICA6ICdrZXlVcCcsCi0gICAgICBrZXlwcmVzcyAg
ICA6ICdrZXlQcmVzcycsCi0gICAgICBtb3VzZWRvd24gICA6ICdtb3VzZURvd24nLAotICAgICAg
bW91c2V1cCAgICAgOiAnbW91c2VVcCcsCi0gICAgICBjb250ZXh0bWVudSA6ICdjb250ZXh0TWVu
dScsCi0gICAgICBjbGljayAgICAgICA6ICdjbGljaycsCi0gICAgICBkYmxjbGljayAgICA6ICdk
b3VibGVDbGljaycsCi0gICAgICBtb3VzZW1vdmUgICA6ICdtb3VzZU1vdmUnLAotICAgICAgZm9j
dXNpbiAgICAgOiAnZm9jdXNJbicsCi0gICAgICBmb2N1c291dCAgICA6ICdmb2N1c091dCcsCi0g
ICAgICBtb3VzZWVudGVyICA6ICdtb3VzZUVudGVyJywKLSAgICAgIG1vdXNlbGVhdmUgIDogJ21v
dXNlTGVhdmUnLAotICAgICAgc3VibWl0ICAgICAgOiAnc3VibWl0JywKLSAgICAgIGlucHV0ICAg
ICAgIDogJ2lucHV0JywKLSAgICAgIGNoYW5nZSAgICAgIDogJ2NoYW5nZScsCi0gICAgICBkcmFn
c3RhcnQgICA6ICdkcmFnU3RhcnQnLAotICAgICAgZHJhZyAgICAgICAgOiAnZHJhZycsCi0gICAg
ICBkcmFnZW50ZXIgICA6ICdkcmFnRW50ZXInLAotICAgICAgZHJhZ2xlYXZlICAgOiAnZHJhZ0xl
YXZlJywKLSAgICAgIGRyYWdvdmVyICAgIDogJ2RyYWdPdmVyJywKLSAgICAgIGRyb3AgICAgICAg
IDogJ2Ryb3AnLAotICAgICAgZHJhZ2VuZCAgICAgOiAnZHJhZ0VuZCcKLSAgICB9OworICAnQGVh
Y2gnOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMuX19lYWNoKSB0
aGlzLl9fZWFjaCA9IG5ldyBFbWJlci5FYWNoUHJveHkodGhpcyk7CisgICAgcmV0dXJuIHRoaXMu
X19lYWNoOworICB9KQogCi0gICAgRW1iZXIuJC5leHRlbmQoZXZlbnRzLCBhZGRlZEV2ZW50cyB8
fCB7fSk7Cit9KSA7CiAKLSAgICB2YXIgcm9vdEVsZW1lbnQgPSBFbWJlci4kKGdldCh0aGlzLCAn
cm9vdEVsZW1lbnQnKSk7Cit9KSgpOwogCi0gICAgRW1iZXIuYXNzZXJ0KGZtdCgnWW91IGNhbm5v
dCB1c2UgdGhlIHNhbWUgcm9vdCBlbGVtZW50ICglQCkgbXVsdGlwbGUgdGltZXMgaW4gYW4gRW1i
ZXIuQXBwbGljYXRpb24nLCBbcm9vdEVsZW1lbnQuc2VsZWN0b3IgfHwgcm9vdEVsZW1lbnRbMF0u
dGFnTmFtZV0pLCAhcm9vdEVsZW1lbnQuaXMoJy5lbWJlci1hcHBsaWNhdGlvbicpKTsKLSAgICBF
bWJlci5hc3NlcnQoJ1lvdSBjYW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2lu
ZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlzIGEgZGVzY2VuZGVudCBvZiBhbiBleGlzdGluZyBFbWJl
ci5BcHBsaWNhdGlvbicsICFyb290RWxlbWVudC5jbG9zZXN0KCcuZW1iZXItYXBwbGljYXRpb24n
KS5sZW5ndGgpOwotICAgIEVtYmVyLmFzc2VydCgnWW91IGNhbm5vdCBtYWtlIGEgbmV3IEVtYmVy
LkFwcGxpY2F0aW9uIHVzaW5nIGEgcm9vdCBlbGVtZW50IHRoYXQgaXMgYW4gYW5jZXN0b3Igb2Yg
YW4gZXhpc3RpbmcgRW1iZXIuQXBwbGljYXRpb24nLCAhcm9vdEVsZW1lbnQuZmluZCgnLmVtYmVy
LWFwcGxpY2F0aW9uJykubGVuZ3RoKTsKIAotICAgIHJvb3RFbGVtZW50LmFkZENsYXNzKCdlbWJl
ci1hcHBsaWNhdGlvbicpOwogCi0gICAgRW1iZXIuYXNzZXJ0KCdVbmFibGUgdG8gYWRkICJlbWJl
ci1hcHBsaWNhdGlvbiIgY2xhc3MgdG8gcm9vdEVsZW1lbnQuIE1ha2Ugc3VyZSB5b3Ugc2V0IHJv
b3RFbGVtZW50IHRvIHRoZSBib2R5IG9yIGFuIGVsZW1lbnQgaW4gdGhlIGJvZHkuJywgcm9vdEVs
ZW1lbnQuaXMoJy5lbWJlci1hcHBsaWNhdGlvbicpKTsKKyhmdW5jdGlvbigpIHsKK3ZhciBlX2dl
dCA9IEVtYmVyLmdldCwKKyAgICBzZXQgPSBFbWJlci5zZXQsCisgICAgZ3VpZEZvciA9IEVtYmVy
Lmd1aWRGb3IsCisgICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCisgICAgcHJvcGVydHlXaWxsQ2hh
bmdlID0gRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlLAorICAgIHByb3BlcnR5RGlkQ2hhbmdlID0g
RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UsCisgICAgYWRkQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5h
ZGRCZWZvcmVPYnNlcnZlciwKKyAgICByZW1vdmVCZWZvcmVPYnNlcnZlciA9IEVtYmVyLnJlbW92
ZUJlZm9yZU9ic2VydmVyLAorICAgIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCisg
ICAgcmVtb3ZlT2JzZXJ2ZXIgPSBFbWJlci5yZW1vdmVPYnNlcnZlciwKKyAgICBDb21wdXRlZFBy
b3BlcnR5ID0gRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSwKKyAgICBhX3NsaWNlID0gW10uc2xpY2Us
CisgICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCisgICAgZm9yRWFjaCA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5mb3JFYWNoLAorICAgIC8vIEhlcmUgd2UgZXhwbGljaXRseSBkb24ndCBhbGxv
dyBgQGVhY2guZm9vYDsgaXQgd291bGQgcmVxdWlyZSBzb21lIHNwZWNpYWwKKyAgICAvLyB0ZXN0
aW5nLCBidXQgdGhlcmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgaXQgc2hvdWxkIGJlIGRp
c2FsbG93ZWQuCisgICAgZWFjaFByb3BlcnR5UGF0dGVybiA9IC9eKC4qKVwuQGVhY2hcLiguKikv
LAorICAgIGRvdWJsZUVhY2hQcm9wZXJ0eVBhdHRlcm4gPSAvKC4qXC5AZWFjaCl7Mix9LywKKyAg
ICBhcnJheUJyYWNrZXRQYXR0ZXJuID0gL1wuXFtcXSQvOwogCi0gICAgZm9yIChldmVudCBpbiBl
dmVudHMpIHsKLSAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkoZXZlbnQpKSB7Ci0gICAg
ICAgIHRoaXMuc2V0dXBIYW5kbGVyKHJvb3RFbGVtZW50LCBldmVudCwgZXZlbnRzW2V2ZW50XSk7
Ci0gICAgICB9Ci0gICAgfQotICB9LAogCi0gIC8qKgotICAgIEBwcml2YXRlCitmdW5jdGlvbiBn
ZXQob2JqLCBrZXkpIHsKKyAgaWYgKGtleSA9PT0gJ0B0aGlzJykgeworICAgIHJldHVybiBvYmo7
CisgIH0KIAotICAgIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciBvbiB0aGUgZG9jdW1lbnQu
IElmIHRoZSBnaXZlbiBldmVudCBpcwotICAgIHRyaWdnZXJlZCwgdGhlIHByb3ZpZGVkIGV2ZW50
IGhhbmRsZXIgd2lsbCBiZSB0cmlnZ2VyZWQgb24gdGhlIHRhcmdldCB2aWV3LgorICByZXR1cm4g
ZV9nZXQob2JqLCBrZXkpOworfQogCi0gICAgSWYgdGhlIHRhcmdldCB2aWV3IGRvZXMgbm90IGlt
cGxlbWVudCB0aGUgZXZlbnQgaGFuZGxlciwgb3IgaWYgdGhlIGhhbmRsZXIKLSAgICByZXR1cm5z
IGBmYWxzZWAsIHRoZSBwYXJlbnQgdmlldyB3aWxsIGJlIGNhbGxlZC4gVGhlIGV2ZW50IHdpbGwg
Y29udGludWUgdG8KLSAgICBidWJibGUgdG8gZWFjaCBzdWNjZXNzaXZlIHBhcmVudCB2aWV3IHVu
dGlsIGl0IHJlYWNoZXMgdGhlIHRvcC4KKy8qCisgIFRyYWNrcyBjaGFuZ2VzIHRvIGRlcGVuZGVu
dCBhcnJheXMsIGFzIHdlbGwgYXMgdG8gcHJvcGVydGllcyBvZiBpdGVtcyBpbgorICBkZXBlbmRl
bnQgYXJyYXlzLgogCi0gICAgRm9yIGV4YW1wbGUsIHRvIGhhdmUgdGhlIGBtb3VzZURvd25gIG1l
dGhvZCBjYWxsZWQgb24gdGhlIHRhcmdldCB2aWV3IHdoZW4KLSAgICBhIGBtb3VzZWRvd25gIGV2
ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dzZXIsIGRvIHRoZSBmb2xsb3dpbmc6CisgIEBj
bGFzcyBEZXBlbmRlbnRBcnJheXNPYnNlcnZlcgorKi8KK2Z1bmN0aW9uIERlcGVuZGVudEFycmF5
c09ic2VydmVyKGNhbGxiYWNrcywgY3AsIGluc3RhbmNlTWV0YSwgY29udGV4dCwgcHJvcGVydHlO
YW1lLCBzdWdhck1ldGEpIHsKKyAgLy8gdXNlciBzcGVjaWZpZWQgY2FsbGJhY2tzIGZvciBgYWRk
ZWRJdGVtYCBhbmQgYHJlbW92ZWRJdGVtYAorICB0aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrczsK
IAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzZXR1cEhhbmRsZXIoJ21vdXNlZG93bicsICdtb3Vz
ZURvd24nKTsKLSAgICBgYGAKKyAgLy8gdGhlIGNvbXB1dGVkIHByb3BlcnR5OiByZW1lbWJlciB0
aGVzZSBhcmUgc2hhcmVkIGFjcm9zcyBpbnN0YW5jZXMKKyAgdGhpcy5jcCA9IGNwOwogCi0gICAg
QG1ldGhvZCBzZXR1cEhhbmRsZXIKLSAgICBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbGVtZW50Ci0g
ICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50IHRoZSBicm93c2VyLW9yaWdpbmF0ZWQgZXZlbnQgdG8g
bGlzdGVuIHRvCi0gICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUg
bWV0aG9kIHRvIGNhbGwgb24gdGhlIHZpZXcKLSAgKi8KLSAgc2V0dXBIYW5kbGVyOiBmdW5jdGlv
bihyb290RWxlbWVudCwgZXZlbnQsIGV2ZW50TmFtZSkgewotICAgIHZhciBzZWxmID0gdGhpczsK
KyAgLy8gdGhlIFJlZHVjZUNvbXB1dGVkUHJvcGVydHlJbnN0YW5jZU1ldGEgdGhpcyBEZXBlbmRl
bnRBcnJheXNPYnNlcnZlciBpcworICAvLyBhc3NvY2lhdGVkIHdpdGgKKyAgdGhpcy5pbnN0YW5j
ZU1ldGEgPSBpbnN0YW5jZU1ldGE7CiAKLSAgICByb290RWxlbWVudC5kZWxlZ2F0ZSgnLmVtYmVy
LXZpZXcnLCBldmVudCArICcuZW1iZXInLCBmdW5jdGlvbihldnQsIHRyaWdnZXJpbmdNYW5hZ2Vy
KSB7Ci0gICAgICByZXR1cm4gRW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uKCkgewotICAgICAg
ICB2YXIgdmlldyA9IEVtYmVyLlZpZXcudmlld3NbdGhpcy5pZF0sCi0gICAgICAgICAgICByZXN1
bHQgPSB0cnVlLCBtYW5hZ2VyID0gbnVsbDsKKyAgLy8gQSBtYXAgb2YgYXJyYXkgZ3VpZHMgdG8g
ZGVwZW5kZW50S2V5cywgZm9yIHRoZSBnaXZlbiBjb250ZXh0LiAgV2UgdHJhY2sKKyAgLy8gdGhp
cyBiZWNhdXNlIHdlIHdhbnQgdG8gc2V0IHVwIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBwb3RlbnRp
YWxseSBiZWZvcmUgdGhlCisgIC8vIGRlcGVuZGVudCBhcnJheSBldmVuIGV4aXN0cywgYnV0IHdo
ZW4gdGhlIGFycmF5IG9ic2VydmVyIGZpcmVzLCB3ZSBsYWNrCisgIC8vIGVub3VnaCBjb250ZXh0
IHRvIGtub3cgd2hhdCB0byB1cGRhdGU6IHdlIGNhbiByZWNvdmVyIHRoYXQgY29udGV4dCBieQor
ICAvLyBnZXR0aW5nIHRoZSBkZXBlbmRlbnRLZXkuCisgIHRoaXMuZGVwZW5kZW50S2V5c0J5R3Vp
ZCA9IHt9OwogCi0gICAgICAgIG1hbmFnZXIgPSBzZWxmLl9maW5kTmVhcmVzdEV2ZW50TWFuYWdl
cih2aWV3LGV2ZW50TmFtZSk7CisgIC8vIGEgbWFwIG9mIGRlcGVuZGVudCBhcnJheSBndWlkcyAt
PiBFbWJlci5UcmFja2VkQXJyYXkgaW5zdGFuY2VzLiAgV2UgdXNlCisgIC8vIHRoaXMgdG8gbGF6
aWx5IHJlY29tcHV0ZSBpbmRleGVzIGZvciBpdGVtIHByb3BlcnR5IG9ic2VydmVycy4KKyAgdGhp
cy50cmFja2VkQXJyYXlzQnlHdWlkID0ge307CiAKLSAgICAgICAgaWYgKG1hbmFnZXIgJiYgbWFu
YWdlciAhPT0gdHJpZ2dlcmluZ01hbmFnZXIpIHsKLSAgICAgICAgICByZXN1bHQgPSBzZWxmLl9k
aXNwYXRjaEV2ZW50KG1hbmFnZXIsIGV2dCwgZXZlbnROYW1lLCB2aWV3KTsKLSAgICAgICAgfSBl
bHNlIGlmICh2aWV3KSB7Ci0gICAgICAgICAgcmVzdWx0ID0gc2VsZi5fYnViYmxlRXZlbnQodmll
dyxldnQsZXZlbnROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBldnQuc3RvcFBy
b3BhZ2F0aW9uKCk7Ci0gICAgICAgIH0KKyAgLy8gV2Ugc3VzcGVuZCBvYnNlcnZlcnMgdG8gaWdu
b3JlIHJlcGxhY2VtZW50cyBmcm9tIGByZXNldGAgd2hlbiB0b3RhbGx5CisgIC8vIHJlY29tcHV0
aW5nLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcHJvcGVybHkgc3VzcGVuZCB0aGUgb2JzZXJ2
ZXJzCisgIC8vIGJlY2F1c2Ugd2Ugb25seSBoYXZlIHRoZSBrZXk7IGluc3RlYWQgd2UgbWFrZSB0
aGUgb2JzZXJ2ZXJzIG5vLW9wcworICB0aGlzLnN1c3BlbmRlZCA9IGZhbHNlOwogCi0gICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9KTsKKyAgLy8gVGhpcyBpcyB1
c2VkIHRvIGNvYWxlc2NlIGl0ZW0gY2hhbmdlcyBmcm9tIHByb3BlcnR5IG9ic2VydmVycy4KKyAg
dGhpcy5jaGFuZ2VkSXRlbXMgPSB7fTsKK30KIAotICAgIHJvb3RFbGVtZW50LmRlbGVnYXRlKCdb
ZGF0YS1lbWJlci1hY3Rpb25dJywgZXZlbnQgKyAnLmVtYmVyJywgZnVuY3Rpb24oZXZ0KSB7Ci0g
ICAgICByZXR1cm4gRW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIg
YWN0aW9uSWQgPSBFbWJlci4kKGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWVtYmVyLWFj
dGlvbicpLAotICAgICAgICAgICAgYWN0aW9uICAgPSBFbWJlci5IYW5kbGViYXJzLkFjdGlvbkhl
bHBlci5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07CitmdW5jdGlvbiBJdGVtUHJvcGVydHlP
YnNlcnZlckNvbnRleHQgKGRlcGVuZGVudEFycmF5LCBpbmRleCwgdHJhY2tlZEFycmF5KSB7Cisg
IEVtYmVyLmFzc2VydCgiSW50ZXJuYWwgZXJyb3I6IHRyYWNrZWRBcnJheSBpcyBudWxsIG9yIHVu
ZGVmaW5lZCIsIHRyYWNrZWRBcnJheSk7CiAKLSAgICAgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBm
b3IgYWN0aW9uIGhlcmUgc2luY2UgaW4gc29tZSBjYXNlcywgalF1ZXJ5IHdpbGwgdHJpZ2dlcgot
ICAgICAgICAvLyBhbiBldmVudCBvbiBgcmVtb3ZlQ2hpbGRgIChpLmUuIGZvY3Vzb3V0KSBhZnRl
ciB3ZSd2ZSBhbHJlYWR5IHRvcm4gZG93biB0aGUKLSAgICAgICAgLy8gYWN0aW9uIGhhbmRsZXJz
IGZvciB0aGUgdmlldy4KLSAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rpb24uZXZlbnROYW1lID09
PSBldmVudE5hbWUpIHsKLSAgICAgICAgICByZXR1cm4gYWN0aW9uLmhhbmRsZXIoZXZ0KTsKLSAg
ICAgICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSk7CisgIHRoaXMuZGVwZW5kZW50QXJyYXkg
PSBkZXBlbmRlbnRBcnJheTsKKyAgdGhpcy5pbmRleCA9IGluZGV4OworICB0aGlzLml0ZW0gPSBk
ZXBlbmRlbnRBcnJheS5vYmplY3RBdChpbmRleCk7CisgIHRoaXMudHJhY2tlZEFycmF5ID0gdHJh
Y2tlZEFycmF5OworICB0aGlzLmJlZm9yZU9ic2VydmVyID0gbnVsbDsKKyAgdGhpcy5vYnNlcnZl
ciA9IG51bGw7CisKKyAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKK30KKworRGVwZW5kZW50QXJy
YXlzT2JzZXJ2ZXIucHJvdG90eXBlID0geworICBzZXRWYWx1ZTogZnVuY3Rpb24gKG5ld1ZhbHVl
KSB7CisgICAgdGhpcy5pbnN0YW5jZU1ldGEuc2V0VmFsdWUobmV3VmFsdWUsIHRydWUpOworICB9
LAorICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0aGlzLmluc3RhbmNlTWV0
YS5nZXRWYWx1ZSgpOwogICB9LAogCi0gIF9maW5kTmVhcmVzdEV2ZW50TWFuYWdlcjogZnVuY3Rp
b24odmlldywgZXZlbnROYW1lKSB7Ci0gICAgdmFyIG1hbmFnZXIgPSBudWxsOworICBzZXR1cE9i
c2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpIHsKKyAgICBF
bWJlci5hc3NlcnQoImRlcGVuZGVudCBhcnJheSBtdXN0IGJlIGFuIGBFbWJlci5BcnJheWAiLCBF
bWJlci5BcnJheS5kZXRlY3QoZGVwZW5kZW50QXJyYXkpKTsKIAotICAgIHdoaWxlICh2aWV3KSB7
Ci0gICAgICBtYW5hZ2VyID0gZ2V0KHZpZXcsICdldmVudE1hbmFnZXInKTsKLSAgICAgIGlmICht
YW5hZ2VyICYmIG1hbmFnZXJbZXZlbnROYW1lXSkgeyBicmVhazsgfQorICAgIHRoaXMuZGVwZW5k
ZW50S2V5c0J5R3VpZFtndWlkRm9yKGRlcGVuZGVudEFycmF5KV0gPSBkZXBlbmRlbnRLZXk7CiAK
LSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICB9CisgICAgZGVwZW5k
ZW50QXJyYXkuYWRkQXJyYXlPYnNlcnZlcih0aGlzLCB7CisgICAgICB3aWxsQ2hhbmdlOiAnZGVw
ZW5kZW50QXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgIGRpZENoYW5nZTogJ2RlcGVuZGVudEFycmF5
RGlkQ2hhbmdlJworICAgIH0pOwogCi0gICAgcmV0dXJuIG1hbmFnZXI7CisgICAgaWYgKHRoaXMu
Y3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSkgeworICAgICAgdGhpcy5zZXR1cFBy
b3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgdGhpcy5jcC5faXRlbVByb3BlcnR5S2V5c1tk
ZXBlbmRlbnRLZXldKTsKKyAgICB9CiAgIH0sCiAKLSAgX2Rpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9u
KG9iamVjdCwgZXZ0LCBldmVudE5hbWUsIHZpZXcpIHsKLSAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsK
KyAgdGVhcmRvd25PYnNlcnZlcnM6IGZ1bmN0aW9uIChkZXBlbmRlbnRBcnJheSwgZGVwZW5kZW50
S2V5KSB7CisgICAgdmFyIGl0ZW1Qcm9wZXJ0eUtleXMgPSB0aGlzLmNwLl9pdGVtUHJvcGVydHlL
ZXlzW2RlcGVuZGVudEtleV0gfHwgW107CiAKLSAgICB2YXIgaGFuZGxlciA9IG9iamVjdFtldmVu
dE5hbWVdOwotICAgIGlmIChFbWJlci50eXBlT2YoaGFuZGxlcikgPT09ICdmdW5jdGlvbicpIHsK
LSAgICAgIHJlc3VsdCA9IGhhbmRsZXIuY2FsbChvYmplY3QsIGV2dCwgdmlldyk7Ci0gICAgICAv
LyBEbyBub3QgcHJldmVudERlZmF1bHQgaW4gZXZlbnRNYW5hZ2Vycy4KLSAgICAgIGV2dC5zdG9w
UHJvcGFnYXRpb24oKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXN1bHQgPSB0aGlzLl9i
dWJibGVFdmVudCh2aWV3LCBldnQsIGV2ZW50TmFtZSk7Ci0gICAgfQorICAgIGRlbGV0ZSB0aGlz
LmRlcGVuZGVudEtleXNCeUd1aWRbZ3VpZEZvcihkZXBlbmRlbnRBcnJheSldOwogCi0gICAgcmV0
dXJuIHJlc3VsdDsKLSAgfSwKKyAgICB0aGlzLnRlYXJkb3duUHJvcGVydHlPYnNlcnZlcnMoZGVw
ZW5kZW50S2V5LCBpdGVtUHJvcGVydHlLZXlzKTsKIAotICBfYnViYmxlRXZlbnQ6IGZ1bmN0aW9u
KHZpZXcsIGV2dCwgZXZlbnROYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLnJ1bihmdW5jdGlvbigp
IHsKLSAgICAgIHJldHVybiB2aWV3LmhhbmRsZUV2ZW50KGV2ZW50TmFtZSwgZXZ0KTsKKyAgICBk
ZXBlbmRlbnRBcnJheS5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKKyAgICAgIHdpbGxDaGFu
Z2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgZGlkQ2hhbmdlOiAnZGVwZW5k
ZW50QXJyYXlEaWRDaGFuZ2UnCiAgICAgfSk7CiAgIH0sCiAKLSAgZGVzdHJveTogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0KHRoaXMsICdyb290RWxlbWVudCcpOwotICAg
IEVtYmVyLiQocm9vdEVsZW1lbnQpLnVuZGVsZWdhdGUoJy5lbWJlcicpLnJlbW92ZUNsYXNzKCdl
bWJlci1hcHBsaWNhdGlvbicpOwotICAgIHJldHVybiB0aGlzLl9zdXBlcigpOwotICB9Ci19KTsK
KyAgc3VzcGVuZEFycmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGJpbmRpbmcpIHsK
KyAgICB2YXIgb2xkU3VzcGVuZGVkID0gdGhpcy5zdXNwZW5kZWQ7CisgICAgdGhpcy5zdXNwZW5k
ZWQgPSB0cnVlOworICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyk7CisgICAgdGhpcy5zdXNwZW5k
ZWQgPSBvbGRTdXNwZW5kZWQ7CisgIH0sCiAKLX0pKCk7CisgIHNldHVwUHJvcGVydHlPYnNlcnZl
cnM6IGZ1bmN0aW9uIChkZXBlbmRlbnRLZXksIGl0ZW1Qcm9wZXJ0eUtleXMpIHsKKyAgICB2YXIg
ZGVwZW5kZW50QXJyYXkgPSBnZXQodGhpcy5pbnN0YW5jZU1ldGEuY29udGV4dCwgZGVwZW5kZW50
S2V5KSwKKyAgICAgICAgbGVuZ3RoID0gZ2V0KGRlcGVuZGVudEFycmF5LCAnbGVuZ3RoJyksCisg
ICAgICAgIG9ic2VydmVyQ29udGV4dHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKIAorICAgIHRoaXMu
cmVzZXRUcmFuc2Zvcm1hdGlvbnMoZGVwZW5kZW50S2V5LCBvYnNlcnZlckNvbnRleHRzKTsKIAor
ICAgIGZvckVhY2goZGVwZW5kZW50QXJyYXksIGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgeworICAg
ICAgdmFyIG9ic2VydmVyQ29udGV4dCA9IHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlckNvbnRl
eHQoZGVwZW5kZW50QXJyYXksIGluZGV4LCB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5k
ZW50S2V5XSk7CisgICAgICBvYnNlcnZlckNvbnRleHRzW2luZGV4XSA9IG9ic2VydmVyQ29udGV4
dDsKIAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVy
LXZpZXdzCi0qLworICAgICAgZm9yRWFjaChpdGVtUHJvcGVydHlLZXlzLCBmdW5jdGlvbiAocHJv
cGVydHlLZXkpIHsKKyAgICAgICAgYWRkQmVmb3JlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXks
IHRoaXMsIG9ic2VydmVyQ29udGV4dC5iZWZvcmVPYnNlcnZlcik7CisgICAgICAgIGFkZE9ic2Vy
dmVyKGl0ZW0sIHByb3BlcnR5S2V5LCB0aGlzLCBvYnNlcnZlckNvbnRleHQub2JzZXJ2ZXIpOwor
ICAgICAgfSwgdGhpcyk7CisgICAgfSwgdGhpcyk7CisgIH0sCiAKLS8vIEFkZCBhIG5ldyBuYW1l
ZCBxdWV1ZSBmb3IgcmVuZGVyaW5nIHZpZXdzIHRoYXQgaGFwcGVucwotLy8gYWZ0ZXIgYmluZGlu
Z3MgaGF2ZSBzeW5jZWQsIGFuZCBhIHF1ZXVlIGZvciBzY2hlZHVsaW5nIGFjdGlvbnMKLS8vIHRo
YXQgdGhhdCBzaG91bGQgb2NjdXIgYWZ0ZXIgdmlldyByZW5kZXJpbmcuCi12YXIgcXVldWVzID0g
RW1iZXIucnVuLnF1ZXVlczsKLXF1ZXVlcy5zcGxpY2UoRW1iZXIuJC5pbkFycmF5KCdhY3Rpb25z
JywgcXVldWVzKSsxLCAwLCAncmVuZGVyJywgJ2FmdGVyUmVuZGVyJyk7CisgIHRlYXJkb3duUHJv
cGVydHlPYnNlcnZlcnM6IGZ1bmN0aW9uIChkZXBlbmRlbnRLZXksIGl0ZW1Qcm9wZXJ0eUtleXMp
IHsKKyAgICB2YXIgZGVwZW5kZW50QXJyYXlPYnNlcnZlciA9IHRoaXMsCisgICAgICAgIHRyYWNr
ZWRBcnJheSA9IHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldLAorICAgICAg
ICBiZWZvcmVPYnNlcnZlciwKKyAgICAgICAgb2JzZXJ2ZXIsCisgICAgICAgIGl0ZW07CiAKLX0p
KCk7CisgICAgaWYgKCF0cmFja2VkQXJyYXkpIHsgcmV0dXJuOyB9CiAKKyAgICB0cmFja2VkQXJy
YXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7
CisgICAgICBpZiAob3BlcmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFKSB7IHJl
dHVybjsgfQogCisgICAgICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1bmN0aW9uIChvYnNl
cnZlckNvbnRleHQpIHsKKyAgICAgICAgb2JzZXJ2ZXJDb250ZXh0LmRlc3Ryb3llZCA9IHRydWU7
CisgICAgICAgIGJlZm9yZU9ic2VydmVyID0gb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVy
OworICAgICAgICBvYnNlcnZlciA9IG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcjsKKyAgICAgICAg
aXRlbSA9IG9ic2VydmVyQ29udGV4dC5pdGVtOwogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCisgICAgICAgIGZvckVhY2goaXRl
bVByb3BlcnR5S2V5cywgZnVuY3Rpb24gKHByb3BlcnR5S2V5KSB7CisgICAgICAgICAgcmVtb3Zl
QmVmb3JlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIs
IGJlZm9yZU9ic2VydmVyKTsKKyAgICAgICAgICByZW1vdmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0
eUtleSwgZGVwZW5kZW50QXJyYXlPYnNlcnZlciwgb2JzZXJ2ZXIpOworICAgICAgICB9KTsKKyAg
ICAgIH0pOworICAgIH0pOworICB9LAogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJl
ci5zZXQ7CisgIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXJDb250ZXh0OiBmdW5jdGlvbiAoZGVwZW5k
ZW50QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsKKyAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0
ID0gbmV3IEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29udGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgs
IHRyYWNrZWRBcnJheSk7CiAKLS8vIE9yaWdpbmFsIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBkb2N1
bWVudGF0aW9uIGluIHJ1bnRpbWUvbGliL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIuanMKLS8vIE5P
VEU6IEl0IG1heSBiZSBwb3NzaWJsZSB3aXRoIFlVSURvYyB0byBjb21iaW5lIGRvY3MgaW4gdHdv
IGxvY2F0aW9ucworICAgIHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlcihvYnNlcnZlckNvbnRl
eHQpOwogCi0vKioKLUFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgdGhlIENvbnRyb2xsZXJNaXhpbgor
ICAgIHJldHVybiBvYnNlcnZlckNvbnRleHQ7CisgIH0sCiAKLUBjbGFzcyBDb250cm9sbGVyTWl4
aW4KLUBuYW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5Db250cm9sbGVyTWl4aW4ucmVvcGVuKHsK
LSAgdGFyZ2V0OiBudWxsLAotICBuYW1lc3BhY2U6IG51bGwsCi0gIHZpZXc6IG51bGwsCi0gIGNv
bnRhaW5lcjogbnVsbCwKLSAgX2NoaWxkQ29udGFpbmVyczogbnVsbCwKKyAgY3JlYXRlUHJvcGVy
dHlPYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dCkgeworICAgIHZhciBkZXBlbmRl
bnRBcnJheU9ic2VydmVyID0gdGhpczsKIAotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlz
Ll9zdXBlcigpOwotICAgIHNldCh0aGlzLCAnX2NoaWxkQ29udGFpbmVycycsIHt9KTsKKyAgICBv
YnNlcnZlckNvbnRleHQuYmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7
CisgICAgICByZXR1cm4gZGVwZW5kZW50QXJyYXlPYnNlcnZlci5pdGVtUHJvcGVydHlXaWxsQ2hh
bmdlKG9iaiwga2V5TmFtZSwgb2JzZXJ2ZXJDb250ZXh0LmRlcGVuZGVudEFycmF5LCBvYnNlcnZl
ckNvbnRleHQpOworICAgIH07CisgICAgb2JzZXJ2ZXJDb250ZXh0Lm9ic2VydmVyID0gZnVuY3Rp
b24gKG9iaiwga2V5TmFtZSkgeworICAgICAgcmV0dXJuIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIu
aXRlbVByb3BlcnR5RGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgb2JzZXJ2ZXJDb250ZXh0LmRlcGVu
ZGVudEFycmF5LCBvYnNlcnZlckNvbnRleHQpOworICAgIH07CiAgIH0sCiAKLSAgX21vZGVsRGlk
Q2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVycyA9
IGdldCh0aGlzLCAnX2NoaWxkQ29udGFpbmVycycpLAotICAgICAgICBjb250YWluZXI7CisgIHJl
c2V0VHJhbnNmb3JtYXRpb25zOiBmdW5jdGlvbiAoZGVwZW5kZW50S2V5LCBvYnNlcnZlckNvbnRl
eHRzKSB7CisgICAgdGhpcy50cmFja2VkQXJyYXlzQnlHdWlkW2RlcGVuZGVudEtleV0gPSBuZXcg
RW1iZXIuVHJhY2tlZEFycmF5KG9ic2VydmVyQ29udGV4dHMpOworICB9LAogCi0gICAgZm9yICh2
YXIgcHJvcCBpbiBjb250YWluZXJzKSB7Ci0gICAgICBpZiAoIWNvbnRhaW5lcnMuaGFzT3duUHJv
cGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAgICAgIGNvbnRhaW5lcnNbcHJvcF0uZGVzdHJv
eSgpOworICB0cmFja0FkZDogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaW5kZXgsIG5ld0l0ZW1z
KSB7CisgICAgdmFyIHRyYWNrZWRBcnJheSA9IHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBl
bmRlbnRLZXldOworICAgIGlmICh0cmFja2VkQXJyYXkpIHsKKyAgICAgIHRyYWNrZWRBcnJheS5h
ZGRJdGVtcyhpbmRleCwgbmV3SXRlbXMpOwogICAgIH0KKyAgfSwKIAotICAgIHNldCh0aGlzLCAn
X2NoaWxkQ29udGFpbmVycycsIHt9KTsKLSAgfSwgJ21vZGVsJykKLX0pOworICB0cmFja1JlbW92
ZTogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaW5kZXgsIHJlbW92ZWRDb3VudCkgeworICAgIHZh
ciB0cmFja2VkQXJyYXkgPSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5XTsK
IAotfSkoKTsKKyAgICBpZiAodHJhY2tlZEFycmF5KSB7CisgICAgICByZXR1cm4gdHJhY2tlZEFy
cmF5LnJlbW92ZUl0ZW1zKGluZGV4LCByZW1vdmVkQ291bnQpOworICAgIH0KIAorICAgIHJldHVy
biBbXTsKKyAgfSwKIAorICB1cGRhdGVJbmRleGVzOiBmdW5jdGlvbiAodHJhY2tlZEFycmF5LCBh
cnJheSkgeworICAgIHZhciBsZW5ndGggPSBnZXQoYXJyYXksICdsZW5ndGgnKTsKKyAgICAvLyBP
UFRJTUlaRTogd2UgY291bGQgc3RvcCB1cGRhdGluZyBvbmNlIHdlIGhpdCB0aGUgb2JqZWN0IHdo
b3NlIG9ic2VydmVyCisgICAgLy8gZmlyZWQ7IGllIHBhcnRpYWxseSBhcHBseSB0aGUgdHJhbnNm
b3JtYXRpb25zCisgICAgdHJhY2tlZEFycmF5LmFwcGx5KGZ1bmN0aW9uIChvYnNlcnZlckNvbnRl
eHRzLCBvZmZzZXQsIG9wZXJhdGlvbikgeworICAgICAgLy8gd2UgZG9uJ3QgZXZlbiBoYXZlIG9i
c2VydmVyIGNvbnRleHRzIGZvciByZW1vdmVkIGl0ZW1zLCBldmVuIGlmIHdlIGRpZCwKKyAgICAg
IC8vIHRoZXkgbm8gbG9uZ2VyIGhhdmUgYW55IGluZGV4IGluIHRoZSBhcnJheQorICAgICAgaWYg
KG9wZXJhdGlvbiA9PT0gRW1iZXIuVHJhY2tlZEFycmF5LkRFTEVURSkgeyByZXR1cm47IH0KKyAg
ICAgIGlmIChvcGVyYXRpb24gPT09IEVtYmVyLlRyYWNrZWRBcnJheS5SRVRBSU4gJiYgb2JzZXJ2
ZXJDb250ZXh0cy5sZW5ndGggPT09IGxlbmd0aCAmJiBvZmZzZXQgPT09IDApIHsKKyAgICAgICAg
Ly8gSWYgd2UgdXBkYXRlIG1hbnkgaXRlbXMgd2UgZG9uJ3Qgd2FudCB0byB3YWxrIHRoZSBhcnJh
eSBlYWNoIHRpbWU6IHdlCisgICAgICAgIC8vIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4
ZXMgYXQgbW9zdCBvbmNlIHBlciBydW4gbG9vcC4KKyAgICAgICAgcmV0dXJuOworICAgICAgfQog
Ci0oZnVuY3Rpb24oKSB7CisgICAgICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1bmN0aW9u
IChjb250ZXh0LCBpbmRleCkgeworICAgICAgICBjb250ZXh0LmluZGV4ID0gaW5kZXggKyBvZmZz
ZXQ7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfSwKIAotfSkoKTsKKyAgZGVwZW5kZW50QXJyYXlX
aWxsQ2hhbmdlOiBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXksIGluZGV4LCByZW1vdmVkQ291bnQs
IGFkZGVkQ291bnQpIHsKKyAgICBpZiAodGhpcy5zdXNwZW5kZWQpIHsgcmV0dXJuOyB9CiAKKyAg
ICB2YXIgcmVtb3ZlZEl0ZW0gPSB0aGlzLmNhbGxiYWNrcy5yZW1vdmVkSXRlbSwKKyAgICAgICAg
Y2hhbmdlTWV0YSwKKyAgICAgICAgZ3VpZCA9IGd1aWRGb3IoZGVwZW5kZW50QXJyYXkpLAorICAg
ICAgICBkZXBlbmRlbnRLZXkgPSB0aGlzLmRlcGVuZGVudEtleXNCeUd1aWRbZ3VpZF0sCisgICAg
ICAgIGl0ZW1Qcm9wZXJ0eUtleXMgPSB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVu
dEtleV0gfHwgW10sCisgICAgICAgIGxlbmd0aCA9IGdldChkZXBlbmRlbnRBcnJheSwgJ2xlbmd0
aCcpLAorICAgICAgICBub3JtYWxpemVkSW5kZXggPSBub3JtYWxpemVJbmRleChpbmRleCwgbGVu
Z3RoLCAwKSwKKyAgICAgICAgbm9ybWFsaXplZFJlbW92ZUNvdW50ID0gbm9ybWFsaXplUmVtb3Zl
Q291bnQobm9ybWFsaXplZEluZGV4LCBsZW5ndGgsIHJlbW92ZWRDb3VudCksCisgICAgICAgIGl0
ZW0sCisgICAgICAgIGl0ZW1JbmRleCwKKyAgICAgICAgc2xpY2VJbmRleCwKKyAgICAgICAgb2Jz
ZXJ2ZXJDb250ZXh0czsKIAorICAgIG9ic2VydmVyQ29udGV4dHMgPSB0aGlzLnRyYWNrUmVtb3Zl
KGRlcGVuZGVudEtleSwgbm9ybWFsaXplZEluZGV4LCBub3JtYWxpemVkUmVtb3ZlQ291bnQpOwog
Ci0oZnVuY3Rpb24oKSB7Ci12YXIgc3RhdGVzID0ge307CisgICAgZnVuY3Rpb24gcmVtb3ZlT2Jz
ZXJ2ZXJzKHByb3BlcnR5S2V5KSB7CisgICAgICBvYnNlcnZlckNvbnRleHRzW3NsaWNlSW5kZXhd
LmRlc3Ryb3llZCA9IHRydWU7CisgICAgICByZW1vdmVCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9w
ZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0c1tzbGljZUluZGV4XS5iZWZvcmVPYnNlcnZl
cik7CisgICAgICByZW1vdmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2
ZXJDb250ZXh0c1tzbGljZUluZGV4XS5vYnNlcnZlcik7CisgICAgfQogCi0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCisgICAgZm9yIChzbGljZUluZGV4ID0g
bm9ybWFsaXplZFJlbW92ZUNvdW50IC0gMTsgc2xpY2VJbmRleCA+PSAwOyAtLXNsaWNlSW5kZXgp
IHsKKyAgICAgIGl0ZW1JbmRleCA9IG5vcm1hbGl6ZWRJbmRleCArIHNsaWNlSW5kZXg7CisgICAg
ICBpZiAoaXRlbUluZGV4ID49IGxlbmd0aCkgeyBicmVhazsgfQogCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQsIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsIHJl
bW92ZU9ic2VydmVyID0gRW1iZXIucmVtb3ZlT2JzZXJ2ZXI7Ci12YXIgbWV0YSA9IEVtYmVyLm1l
dGEsIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwotdmFy
IGFfc2xpY2UgPSBbXS5zbGljZTsKLXZhciBhX2ZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRp
bHMuZm9yRWFjaDsKLXZhciBhX2FkZE9iamVjdCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5hZGRP
YmplY3Q7CisgICAgICBpdGVtID0gZGVwZW5kZW50QXJyYXkub2JqZWN0QXQoaXRlbUluZGV4KTsK
IAotdmFyIGNoaWxkVmlld3NQcm9wZXJ0eSA9IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewot
ICB2YXIgY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3MsIHJldCA9IEVtYmVyLkEoKSwgdmll
dyA9IHRoaXM7CisgICAgICBmb3JFYWNoKGl0ZW1Qcm9wZXJ0eUtleXMsIHJlbW92ZU9ic2VydmVy
cywgdGhpcyk7CiAKLSAgYV9mb3JFYWNoKGNoaWxkVmlld3MsIGZ1bmN0aW9uKHZpZXcpIHsKLSAg
ICBpZiAodmlldy5pc1ZpcnR1YWwpIHsKLSAgICAgIHJldC5wdXNoT2JqZWN0cyhnZXQodmlldywg
J2NoaWxkVmlld3MnKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldC5wdXNoKHZpZXcpOworICAg
ICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGl0
ZW1JbmRleCwgdGhpcy5pbnN0YW5jZU1ldGEucHJvcGVydHlOYW1lLCB0aGlzLmNwKTsKKyAgICAg
IHRoaXMuc2V0VmFsdWUoIHJlbW92ZWRJdGVtLmNhbGwoCisgICAgICAgIHRoaXMuaW5zdGFuY2VN
ZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0
YW5jZU1ldGEuc3VnYXJNZXRhKSk7CiAgICAgfQotICB9KTsKKyAgfSwKIAotICByZXQucmVwbGFj
ZSA9IGZ1bmN0aW9uIChpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cykgewotICAgIGlmICh2
aWV3IGluc3RhbmNlb2YgRW1iZXIuQ29udGFpbmVyVmlldykgewotICAgICAgRW1iZXIuZGVwcmVj
YXRlKCJNYW5pcHVsYXRpbmcgYSBFbWJlci5Db250YWluZXJWaWV3IHRocm91Z2ggaXRzIGNoaWxk
Vmlld3MgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgQ29udGFpbmVyVmll
dyBpbnN0YW5jZSBpdHNlbGYgYXMgYW4gRW1iZXIuTXV0YWJsZUFycmF5LiIpOwotICAgICAgcmV0
dXJuIHZpZXcucmVwbGFjZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cyk7Ci0gICAgfQot
ICAgIHRocm93IG5ldyBFcnJvcigiY2hpbGRWaWV3cyBpcyBpbW11dGFibGUiKTsKLSAgfTsKKyAg
ZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uIChkZXBlbmRlbnRBcnJheSwgaW5kZXgs
IHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCkgeworICAgIGlmICh0aGlzLnN1c3BlbmRlZCkgeyBy
ZXR1cm47IH0KIAotICByZXR1cm4gcmV0OwotfSk7CisgICAgdmFyIGFkZGVkSXRlbSA9IHRoaXMu
Y2FsbGJhY2tzLmFkZGVkSXRlbSwKKyAgICAgICAgZ3VpZCA9IGd1aWRGb3IoZGVwZW5kZW50QXJy
YXkpLAorICAgICAgICBkZXBlbmRlbnRLZXkgPSB0aGlzLmRlcGVuZGVudEtleXNCeUd1aWRbZ3Vp
ZF0sCisgICAgICAgIG9ic2VydmVyQ29udGV4dHMgPSBuZXcgQXJyYXkoYWRkZWRDb3VudCksCisg
ICAgICAgIGl0ZW1Qcm9wZXJ0eUtleXMgPSB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVu
ZGVudEtleV0sCisgICAgICAgIGxlbmd0aCA9IGdldChkZXBlbmRlbnRBcnJheSwgJ2xlbmd0aCcp
LAorICAgICAgICBub3JtYWxpemVkSW5kZXggPSBub3JtYWxpemVJbmRleChpbmRleCwgbGVuZ3Ro
LCBhZGRlZENvdW50KSwKKyAgICAgICAgY2hhbmdlTWV0YSwKKyAgICAgICAgb2JzZXJ2ZXJDb250
ZXh0OwogCi1FbWJlci53YXJuKCJUaGUgVklFV19QUkVTRVJWRVNfQ09OVEVYVCBmbGFnIGhhcyBi
ZWVuIHJlbW92ZWQgYW5kIHRoZSBmdW5jdGlvbmFsaXR5IGNhbiBubyBsb25nZXIgYmUgZGlzYWJs
ZWQuIiwgRW1iZXIuRU5WLlZJRVdfUFJFU0VSVkVTX0NPTlRFWFQgIT09IGZhbHNlKTsKKyAgICBm
b3JFYWNoKGRlcGVuZGVudEFycmF5LnNsaWNlKG5vcm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZElu
ZGV4ICsgYWRkZWRDb3VudCksIGZ1bmN0aW9uIChpdGVtLCBzbGljZUluZGV4KSB7CisgICAgICBp
ZiAoaXRlbVByb3BlcnR5S2V5cykgeworICAgICAgICBvYnNlcnZlckNvbnRleHQgPQorICAgICAg
ICAgIG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0gPQorICAgICAgICAgIHRoaXMuY3JlYXRl
UHJvcGVydHlPYnNlcnZlckNvbnRleHQoZGVwZW5kZW50QXJyYXksIG5vcm1hbGl6ZWRJbmRleCAr
IHNsaWNlSW5kZXgsIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsKKyAg
ICAgICAgZm9yRWFjaChpdGVtUHJvcGVydHlLZXlzLCBmdW5jdGlvbiAocHJvcGVydHlLZXkpIHsK
KyAgICAgICAgICBhZGRCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2Jz
ZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyKTsKKyAgICAgICAgICBhZGRPYnNlcnZlcihpdGVt
LCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0Lm9ic2VydmVyKTsKKyAgICAgICAg
fSwgdGhpcyk7CisgICAgICB9CiAKLS8qKgotICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVtcGxh
dGVzLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0ZWQKLSAgYnkgdGhlIGJ1aWxk
IHRvb2xzIHNvIHRoYXQgeW91IGNhbiBzdG9yZSB5b3VyIEhhbmRsZWJhcnMgdGVtcGxhdGVzIGlu
Ci0gIHNlcGFyYXRlIGZpbGVzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIEphdmFTY3JpcHQgYXQgYnVp
bGR0aW1lLgorICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJy
YXksIGl0ZW0sIG5vcm1hbGl6ZWRJbmRleCArIHNsaWNlSW5kZXgsIHRoaXMuaW5zdGFuY2VNZXRh
LnByb3BlcnR5TmFtZSwgdGhpcy5jcCk7CisgICAgICB0aGlzLnNldFZhbHVlKCBhZGRlZEl0ZW0u
Y2FsbCgKKyAgICAgICAgdGhpcy5pbnN0YW5jZU1ldGEuY29udGV4dCwgdGhpcy5nZXRWYWx1ZSgp
LCBpdGVtLCBjaGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0YS5zdWdhck1ldGEpKTsKKyAgICB9
LCB0aGlzKTsKIAotICBAcHJvcGVydHkgVEVNUExBVEVTCi0gIEBmb3IgRW1iZXIKLSAgQHR5cGUg
SGFzaAotKi8KLUVtYmVyLlRFTVBMQVRFUyA9IHt9OworICAgIHRoaXMudHJhY2tBZGQoZGVwZW5k
ZW50S2V5LCBub3JtYWxpemVkSW5kZXgsIG9ic2VydmVyQ29udGV4dHMpOworICB9LAogCi1FbWJl
ci5Db3JlVmlldyA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgewotICBpc1Zp
ZXc6IHRydWUsCisgIGl0ZW1Qcm9wZXJ0eVdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChvYmosIGtleU5h
bWUsIGFycmF5LCBvYnNlcnZlckNvbnRleHQpIHsKKyAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2Jq
KTsKIAotICBzdGF0ZXM6IHN0YXRlcywKKyAgICBpZiAoIXRoaXMuY2hhbmdlZEl0ZW1zW2d1aWRd
KSB7CisgICAgICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXSA9IHsKKyAgICAgICAgYXJyYXk6ICAg
ICAgICAgICAgYXJyYXksCisgICAgICAgIG9ic2VydmVyQ29udGV4dDogIG9ic2VydmVyQ29udGV4
dCwKKyAgICAgICAgb2JqOiAgICAgICAgICAgICAgb2JqLAorICAgICAgICBwcmV2aW91c1ZhbHVl
czogICB7fQorICAgICAgfTsKKyAgICB9CiAKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fc3VwZXIoKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSB2aWV3IGZvciBldmVudCBoYW5kbGlu
Zy4gVGhpcyBoYXNoIGlzIHVzZWQgYnkKLSAgICAvLyBFbWJlci5FdmVudERpc3BhdGNoZXIgdG8g
ZGlzcGF0Y2ggaW5jb21pbmcgZXZlbnRzLgotICAgIGlmICghdGhpcy5pc1ZpcnR1YWwpIHsKLSAg
ICAgIEVtYmVyLmFzc2VydCgiQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGEgdmlldyB3aXRoIGFuIGlk
IGFscmVhZHkgaW4gdXNlOiAiK3RoaXMuZWxlbWVudElkLCAhRW1iZXIuVmlldy52aWV3c1t0aGlz
LmVsZW1lbnRJZF0pOwotICAgICAgRW1iZXIuVmlldy52aWV3c1t0aGlzLmVsZW1lbnRJZF0gPSB0
aGlzOwotICAgIH0KLQotICAgIHRoaXMuYWRkQmVmb3JlT2JzZXJ2ZXIoJ2VsZW1lbnRJZCcsIGZ1
bmN0aW9uKCkgewotICAgICAgdGhyb3cgbmV3IEVycm9yKCJDaGFuZ2luZyBhIHZpZXcncyBlbGVt
ZW50SWQgYWZ0ZXIgY3JlYXRpb24gaXMgbm90IGFsbG93ZWQiKTsKLSAgICB9KTsKKyAgICB0aGlz
LmNoYW5nZWRJdGVtc1tndWlkXS5wcmV2aW91c1ZhbHVlc1trZXlOYW1lXSA9IGdldChvYmosIGtl
eU5hbWUpOworICB9LAogCi0gICAgdGhpcy50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOworICBp
dGVtUHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSwgYXJyYXksIG9ic2Vy
dmVyQ29udGV4dCkgeworICAgIHRoaXMuZmx1c2hDaGFuZ2VzKCk7CiAgIH0sCiAKLSAgLyoqCi0g
ICAgSWYgdGhlIHZpZXcgaXMgY3VycmVudGx5IGluc2VydGVkIGludG8gdGhlIERPTSBvZiBhIHBh
cmVudCB2aWV3LCB0aGlzCi0gICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUgcGFyZW50IG9m
IHRoZSB2aWV3LgorICBmbHVzaENoYW5nZXM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBjaGFuZ2Vk
SXRlbXMgPSB0aGlzLmNoYW5nZWRJdGVtcywga2V5LCBjLCBjaGFuZ2VNZXRhOwogCi0gICAgQHBy
b3BlcnR5IHBhcmVudFZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgbnVs
bAotICAqLwotICBwYXJlbnRWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2
YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50VmlldzsKKyAgICBmb3IgKGtleSBpbiBjaGFuZ2VkSXRl
bXMpIHsKKyAgICAgIGMgPSBjaGFuZ2VkSXRlbXNba2V5XTsKKyAgICAgIGlmIChjLm9ic2VydmVy
Q29udGV4dC5kZXN0cm95ZWQpIHsgY29udGludWU7IH0KIAotICAgIGlmIChwYXJlbnQgJiYgcGFy
ZW50LmlzVmlydHVhbCkgewotICAgICAgcmV0dXJuIGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgICB0aGlzLnVwZGF0ZUlu
ZGV4ZXMoYy5vYnNlcnZlckNvbnRleHQudHJhY2tlZEFycmF5LCBjLm9ic2VydmVyQ29udGV4dC5k
ZXBlbmRlbnRBcnJheSk7CisKKyAgICAgIGNoYW5nZU1ldGEgPSBjcmVhdGVDaGFuZ2VNZXRhKGMu
YXJyYXksIGMub2JqLCBjLm9ic2VydmVyQ29udGV4dC5pbmRleCwgdGhpcy5pbnN0YW5jZU1ldGEu
cHJvcGVydHlOYW1lLCB0aGlzLmNwLCBjLnByZXZpb3VzVmFsdWVzKTsKKyAgICAgIHRoaXMuc2V0
VmFsdWUoCisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnJlbW92ZWRJdGVtLmNhbGwodGhpcy5pbnN0
YW5jZU1ldGEuY29udGV4dCwgdGhpcy5nZXRWYWx1ZSgpLCBjLm9iaiwgY2hhbmdlTWV0YSwgdGhp
cy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRhKSk7CisgICAgICB0aGlzLnNldFZhbHVlKAorICAgICAg
ICB0aGlzLmNhbGxiYWNrcy5hZGRlZEl0ZW0uY2FsbCh0aGlzLmluc3RhbmNlTWV0YS5jb250ZXh0
LCB0aGlzLmdldFZhbHVlKCksIGMub2JqLCBjaGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0YS5z
dWdhck1ldGEpKTsKICAgICB9Ci0gIH0pLnByb3BlcnR5KCdfcGFyZW50VmlldycpLAorICAgIHRo
aXMuY2hhbmdlZEl0ZW1zID0ge307CisgIH0KK307CiAKLSAgc3RhdGU6IG51bGwsCitmdW5jdGlv
biBub3JtYWxpemVJbmRleChpbmRleCwgbGVuZ3RoLCBuZXdJdGVtc09mZnNldCkgeworICBpZiAo
aW5kZXggPCAwKSB7CisgICAgcmV0dXJuIE1hdGgubWF4KDAsIGxlbmd0aCArIGluZGV4KTsKKyAg
fSBlbHNlIGlmIChpbmRleCA8IGxlbmd0aCkgeworICAgIHJldHVybiBpbmRleDsKKyAgfSBlbHNl
IC8qIGluZGV4ID4gbGVuZ3RoICovIHsKKyAgICByZXR1cm4gTWF0aC5taW4obGVuZ3RoIC0gbmV3
SXRlbXNPZmZzZXQsIGluZGV4KTsKKyAgfQorfQogCi0gIF9wYXJlbnRWaWV3OiBudWxsLAorZnVu
Y3Rpb24gbm9ybWFsaXplUmVtb3ZlQ291bnQoaW5kZXgsIGxlbmd0aCwgcmVtb3ZlZENvdW50KSB7
CisgIHJldHVybiBNYXRoLm1pbihyZW1vdmVkQ291bnQsIGxlbmd0aCAtIGluZGV4KTsKK30KIAot
ICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgdmlldywgbm90IGluY2x1ZGluZyB2aXJ0dWFsIHZpZXdz
Ci0gIGNvbmNyZXRlVmlldzogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0
aGlzLmlzVmlydHVhbCkgeyByZXR1cm4gdGhpczsgfQotICAgIGVsc2UgeyByZXR1cm4gZ2V0KHRo
aXMsICdwYXJlbnRWaWV3Jyk7IH0KLSAgfSkucHJvcGVydHkoJ3BhcmVudFZpZXcnKS52b2xhdGls
ZSgpLAorZnVuY3Rpb24gY3JlYXRlQ2hhbmdlTWV0YShkZXBlbmRlbnRBcnJheSwgaXRlbSwgaW5k
ZXgsIHByb3BlcnR5TmFtZSwgcHJvcGVydHksIHByZXZpb3VzVmFsdWVzKSB7CisgIHZhciBtZXRh
ID0geworICAgIGFycmF5Q2hhbmdlZDogZGVwZW5kZW50QXJyYXksCisgICAgaW5kZXg6IGluZGV4
LAorICAgIGl0ZW06IGl0ZW0sCisgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsCisgICAg
cHJvcGVydHk6IHByb3BlcnR5CisgIH07CiAKLSAgaW5zdHJ1bWVudE5hbWU6ICdjb3JlX3ZpZXcn
LAorICBpZiAocHJldmlvdXNWYWx1ZXMpIHsKKyAgICAvLyBwcmV2aW91cyB2YWx1ZXMgb25seSBh
dmFpbGFibGUgZm9yIGl0ZW0gcHJvcGVydHkgY2hhbmdlcworICAgIG1ldGEucHJldmlvdXNWYWx1
ZXMgPSBwcmV2aW91c1ZhbHVlczsKKyAgfQogCi0gIGluc3RydW1lbnREZXRhaWxzOiBmdW5jdGlv
bihoYXNoKSB7Ci0gICAgaGFzaC5vYmplY3QgPSB0aGlzLnRvU3RyaW5nKCk7Ci0gIH0sCisgIHJl
dHVybiBtZXRhOworfQogCi0gIC8qKgotICAgIEBwcml2YXRlCitmdW5jdGlvbiBhZGRJdGVtcyAo
ZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSkgeworICBm
b3JFYWNoKGRlcGVuZGVudEFycmF5LCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKKyAgICBtZXRh
LnNldFZhbHVlKCBjYWxsYmFja3MuYWRkZWRJdGVtLmNhbGwoCisgICAgICB0aGlzLCBtZXRhLmdl
dFZhbHVlKCksIGl0ZW0sIGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGlu
ZGV4LCBwcm9wZXJ0eU5hbWUsIGNwKSwgbWV0YS5zdWdhck1ldGEpKTsKKyAgfSwgdGhpcyk7Cit9
CiAKLSAgICBJbnZva2VkIGJ5IHRoZSB2aWV3IHN5c3RlbSB3aGVuIHRoaXMgdmlldyBuZWVkcyB0
byBwcm9kdWNlIGFuIEhUTUwKLSAgICByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCBj
cmVhdGUgYSBuZXcgcmVuZGVyIGJ1ZmZlciwgaWYgbmVlZGVkLAotICAgIHRoZW4gYXBwbHkgYW55
IGRlZmF1bHQgYXR0cmlidXRlcywgc3VjaCBhcyBjbGFzcyBuYW1lcyBhbmQgdmlzaWJpbGl0eS4K
LSAgICBGaW5hbGx5LCB0aGUgYHJlbmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCwgd2hpY2ggaXMg
cmVzcG9uc2libGUgZm9yCi0gICAgZG9pbmcgdGhlIGJ1bGsgb2YgdGhlIHJlbmRlcmluZy4KK2Z1
bmN0aW9uIHJlc2V0KGNwLCBwcm9wZXJ0eU5hbWUpIHsKKyAgdmFyIGNhbGxiYWNrcyA9IGNwLl9j
YWxsYmFja3MoKSwKKyAgICAgIG1ldGE7CiAKLSAgICBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIG92
ZXJyaWRlIHRoaXMgbWV0aG9kOyBpbnN0ZWFkLCBpbXBsZW1lbnQgdGhlCi0gICAgYHRlbXBsYXRl
YCBwcm9wZXJ0eSwgb3IgaWYgeW91IG5lZWQgbW9yZSBjb250cm9sLCBvdmVycmlkZSB0aGUgYHJl
bmRlcmAKLSAgICBtZXRob2QuCisgIGlmIChjcC5faGFzSW5zdGFuY2VNZXRhKHRoaXMsIHByb3Bl
cnR5TmFtZSkpIHsKKyAgICBtZXRhID0gY3AuX2luc3RhbmNlTWV0YSh0aGlzLCBwcm9wZXJ0eU5h
bWUpOworICAgIG1ldGEuc2V0VmFsdWUoY3AucmVzZXRWYWx1ZShtZXRhLmdldFZhbHVlKCkpKTsK
KyAgfSBlbHNlIHsKKyAgICBtZXRhID0gY3AuX2luc3RhbmNlTWV0YSh0aGlzLCBwcm9wZXJ0eU5h
bWUpOworICB9CiAKLSAgICBAbWV0aG9kIHJlbmRlclRvQnVmZmVyCi0gICAgQHBhcmFtIHtFbWJl
ci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlciB0aGUgcmVuZGVyIGJ1ZmZlci4gSWYgbm8gYnVmZmVyIGlz
Ci0gICAgICBwYXNzZWQsIGEgZGVmYXVsdCBidWZmZXIsIHVzaW5nIHRoZSBjdXJyZW50IHZpZXcn
cyBgdGFnTmFtZWAsIHdpbGwKLSAgICAgIGJlIHVzZWQuCi0gICovCi0gIHJlbmRlclRvQnVmZmVy
OiBmdW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgewotICAgIHZhciBuYW1l
ID0gJ3JlbmRlci4nICsgdGhpcy5pbnN0cnVtZW50TmFtZSwKLSAgICAgICAgZGV0YWlscyA9IHt9
OworICBpZiAoY3Aub3B0aW9ucy5pbml0aWFsaXplKSB7CisgICAgY3Aub3B0aW9ucy5pbml0aWFs
aXplLmNhbGwodGhpcywgbWV0YS5nZXRWYWx1ZSgpLCB7IHByb3BlcnR5OiBjcCwgcHJvcGVydHlO
YW1lOiBwcm9wZXJ0eU5hbWUgfSwgbWV0YS5zdWdhck1ldGEpOworICB9Cit9CiAKLSAgICB0aGlz
Lmluc3RydW1lbnREZXRhaWxzKGRldGFpbHMpOworZnVuY3Rpb24gcGFydGlhbGx5UmVjb21wdXRl
Rm9yKG9iaiwgZGVwZW5kZW50S2V5KSB7CisgIGlmIChhcnJheUJyYWNrZXRQYXR0ZXJuLnRlc3Qo
ZGVwZW5kZW50S2V5KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQogCi0gICAgcmV0dXJuIEVt
YmVyLmluc3RydW1lbnQobmFtZSwgZGV0YWlscywgZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4g
dGhpcy5fcmVuZGVyVG9CdWZmZXIocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pOwotICAg
IH0sIHRoaXMpOworICB2YXIgdmFsdWUgPSBnZXQob2JqLCBkZXBlbmRlbnRLZXkpOworICByZXR1
cm4gRW1iZXIuQXJyYXkuZGV0ZWN0KHZhbHVlKTsKK30KKworZnVuY3Rpb24gUmVkdWNlQ29tcHV0
ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBwcm9wZXJ0eU5hbWUsIGluaXRpYWxWYWx1
ZSkgeworICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB0aGlzLnByb3BlcnR5TmFtZSA9IHBy
b3BlcnR5TmFtZTsKKyAgdGhpcy5jYWNoZSA9IG1ldGFGb3IoY29udGV4dCkuY2FjaGU7CisKKyAg
dGhpcy5kZXBlbmRlbnRBcnJheXMgPSB7fTsKKyAgdGhpcy5zdWdhck1ldGEgPSB7fTsKKworICB0
aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKK30KKworUmVkdWNlQ29tcHV0ZWRQcm9w
ZXJ0eUluc3RhbmNlTWV0YS5wcm90b3R5cGUgPSB7CisgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7
CisgICAgaWYgKHRoaXMucHJvcGVydHlOYW1lIGluIHRoaXMuY2FjaGUpIHsKKyAgICAgIHJldHVy
biB0aGlzLmNhY2hlW3RoaXMucHJvcGVydHlOYW1lXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0
dXJuIHRoaXMuaW5pdGlhbFZhbHVlOworICAgIH0KICAgfSwKIAotICBfcmVuZGVyVG9CdWZmZXI6
IGZ1bmN0aW9uKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKSB7Ci0gICAgRW1iZXIucnVu
LnN5bmMoKTsKKyAgc2V0VmFsdWU6IGZ1bmN0aW9uKG5ld1ZhbHVlLCB0cmlnZ2VyT2JzZXJ2ZXJz
KSB7CisgICAgLy8gVGhpcyBsZXRzIHN1Z2FycyBmb3JjZSBhIHJlY29tcHV0YXRpb24sIGhhbmR5
IGZvciB2ZXJ5IHNpbXBsZQorICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBlZyBtYXguCisgICAg
aWYgKG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHZhciBmaXJlT2JzZXJ2ZXJzID0g
dHJpZ2dlck9ic2VydmVycyAmJiAobmV3VmFsdWUgIT09IHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0
eU5hbWVdKTsKIAotICAgIC8vIElmIHRoaXMgaXMgdGhlIHRvcC1tb3N0IHZpZXcsIHN0YXJ0IGEg
bmV3IGJ1ZmZlci4gT3RoZXJ3aXNlLAotICAgIC8vIGNyZWF0ZSBhIG5ldyBidWZmZXIgcmVsYXRp
dmUgdG8gdGhlIG9yaWdpbmFsIHVzaW5nIHRoZQotICAgIC8vIHByb3ZpZGVkIGJ1ZmZlciBvcGVy
YXRpb24gKGZvciBleGFtcGxlLCBgaW5zZXJ0QWZ0ZXJgIHdpbGwKLSAgICAvLyBpbnNlcnQgYSBu
ZXcgYnVmZmVyIGFmdGVyIHRoZSAicGFyZW50IGJ1ZmZlciIpLgotICAgIHZhciB0YWdOYW1lID0g
dGhpcy50YWdOYW1lOworICAgICAgaWYgKGZpcmVPYnNlcnZlcnMpIHsKKyAgICAgICAgcHJvcGVy
dHlXaWxsQ2hhbmdlKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wZXJ0eU5hbWUpOworICAgICAgfQog
Ci0gICAgaWYgKHRhZ05hbWUgPT09IG51bGwgfHwgdGFnTmFtZSA9PT0gdW5kZWZpbmVkKSB7Ci0g
ICAgICB0YWdOYW1lID0gJ2Rpdic7CisgICAgICB0aGlzLmNhY2hlW3RoaXMucHJvcGVydHlOYW1l
XSA9IG5ld1ZhbHVlOworCisgICAgICBpZiAoZmlyZU9ic2VydmVycykgeworICAgICAgICBwcm9w
ZXJ0eURpZENoYW5nZSh0aGlzLmNvbnRleHQsIHRoaXMucHJvcGVydHlOYW1lKTsKKyAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVd
OwogICAgIH0KKyAgfQorfTsKIAotICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciA9IHBhcmVu
dEJ1ZmZlciAmJiBwYXJlbnRCdWZmZXIuYmVnaW4odGFnTmFtZSkgfHwgRW1iZXIuUmVuZGVyQnVm
ZmVyKHRhZ05hbWUpOwotICAgIHRoaXMudHJhbnNpdGlvblRvKCdpbkJ1ZmZlcicsIGZhbHNlKTsK
Ky8qKgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIGRlcGVuZGVudCBrZXlzIGFyZSBhcnJh
eXMgYW5kIHdoaWNoIGlzIHVwZGF0ZWQgd2l0aAorICAib25lIGF0IGEgdGltZSIgc2VtYW50aWNz
LgogCi0gICAgdGhpcy5iZWZvcmVSZW5kZXIoYnVmZmVyKTsKLSAgICB0aGlzLnJlbmRlcihidWZm
ZXIpOwotICAgIHRoaXMuYWZ0ZXJSZW5kZXIoYnVmZmVyKTsKKyAgQGNsYXNzIFJlZHVjZUNvbXB1
dGVkUHJvcGVydHkKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5Db21wdXRl
ZFByb3BlcnR5CisgIEBjb25zdHJ1Y3RvcgorKi8KK2Z1bmN0aW9uIFJlZHVjZUNvbXB1dGVkUHJv
cGVydHkob3B0aW9ucykgeworICB2YXIgY3AgPSB0aGlzOwogCi0gICAgcmV0dXJuIGJ1ZmZlcjsK
LSAgfSwKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgdGhpcy5faW5zdGFuY2VNZXRhcyA9
IHt9OworCisgIHRoaXMuX2RlcGVuZGVudEtleXMgPSBudWxsOworICAvLyBBIG1hcCBvZiBkZXBl
bmRlbnRLZXkgLT4gW2l0ZW1Qcm9wZXJ0eSwgLi4uXSB0aGF0IHRyYWNrcyB3aGF0IHByb3BlcnRp
ZXMgb2YKKyAgLy8gaXRlbXMgaW4gdGhlIGFycmF5IHdlIG11c3QgdHJhY2sgdG8gdXBkYXRlIHRo
aXMgcHJvcGVydHkuCisgIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXMgPSB7fTsKKyAgdGhpcy5fcHJl
dmlvdXNJdGVtUHJvcGVydHlLZXlzID0ge307CisKKyAgdGhpcy5yZWFkT25seSgpOworICB0aGlz
LmNhY2hlYWJsZSgpOworCisgIHRoaXMucmVjb21wdXRlT25jZSA9IGZ1bmN0aW9uKHByb3BlcnR5
TmFtZSkgeworICAgIC8vIFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaXMgY29hbGVzY2UgYnkg
PGNwLCBwcm9wZXJ0eU5hbWU+LgorICAgIC8vIFdlIG5lZWQgYSBmb3JtIG9mIGBzY2hlZHVsZU9u
Y2VgIHRoYXQgYWNjZXB0cyBhbiBhcmJpdHJhcnkgdG9rZW4gdG8KKyAgICAvLyBjb2FsZXNjZSBi
eSwgaW4gYWRkaXRpb24gdG8gdGhlIHRhcmdldCBhbmQgbWV0aG9kLgorICAgIEVtYmVyLnJ1bi5v
bmNlKHRoaXMsIHJlY29tcHV0ZSwgcHJvcGVydHlOYW1lKTsKKyAgfTsKKyAgdmFyIHJlY29tcHV0
ZSA9IGZ1bmN0aW9uKHByb3BlcnR5TmFtZSkgeworICAgIHZhciBkZXBlbmRlbnRLZXlzID0gY3Au
X2RlcGVuZGVudEtleXMsCisgICAgICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHBy
b3BlcnR5TmFtZSksCisgICAgICAgIGNhbGxiYWNrcyA9IGNwLl9jYWxsYmFja3MoKTsKKworICAg
IHJlc2V0LmNhbGwodGhpcywgY3AsIHByb3BlcnR5TmFtZSk7CisKKyAgICBtZXRhLmRlcGVuZGVu
dEFycmF5c09ic2VydmVyLnN1c3BlbmRBcnJheU9ic2VydmVycyhmdW5jdGlvbiAoKSB7CisgICAg
ICBmb3JFYWNoKGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Cisg
ICAgICAgIGlmICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsg
cmV0dXJuOyB9CisKKyAgICAgICAgdmFyIGRlcGVuZGVudEFycmF5ID0gZ2V0KHRoaXMsIGRlcGVu
ZGVudEtleSksCisgICAgICAgICAgICBwcmV2aW91c0RlcGVuZGVudEFycmF5ID0gbWV0YS5kZXBl
bmRlbnRBcnJheXNbZGVwZW5kZW50S2V5XTsKKworICAgICAgICBpZiAoZGVwZW5kZW50QXJyYXkg
PT09IHByZXZpb3VzRGVwZW5kZW50QXJyYXkpIHsKKyAgICAgICAgICAvLyBUaGUgYXJyYXkgbWF5
IGJlIHRoZSBzYW1lLCBidXQgb3VyIGl0ZW0gcHJvcGVydHkga2V5cyBtYXkgaGF2ZQorICAgICAg
ICAgIC8vIGNoYW5nZWQsIHNvIHdlIHNldCB0aGVtIHVwIGFnYWluLiAgV2UgY2FuJ3QgZWFzaWx5
IHRlbGwgaWYgdGhleSd2ZQorICAgICAgICAgIC8vIGNoYW5nZWQ6IHRoZSBhcnJheSBtYXkgYmUg
dGhlIHNhbWUgb2JqZWN0LCBidXQgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgICAvLyBjb250ZW50
cy4KKyAgICAgICAgICBpZiAoY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRL
ZXldKSB7CisgICAgICAgICAgICBkZWxldGUgY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tk
ZXBlbmRlbnRLZXldOworICAgICAgICAgICAgbWV0YS5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5z
ZXR1cFByb3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgY3AuX2l0ZW1Qcm9wZXJ0eUtleXNb
ZGVwZW5kZW50S2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IG1ldGEuZGVwZW5kZW50QXJyYXlzW2RlcGVuZGVudEtleV0gPSBkZXBlbmRlbnRBcnJheTsKIAot
ICAvKioKLSAgICBAcHJpdmF0ZQorICAgICAgICAgIGlmIChwcmV2aW91c0RlcGVuZGVudEFycmF5
KSB7CisgICAgICAgICAgICBtZXRhLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnRlYXJkb3duT2Jz
ZXJ2ZXJzKHByZXZpb3VzRGVwZW5kZW50QXJyYXksIGRlcGVuZGVudEtleSk7CisgICAgICAgICAg
fQogCi0gICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gYEVtYmVyLkV2
ZW50ZWRgIHRvCi0gICAgYWxzbyBjYWxsIG1ldGhvZHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAg
ICAgICAgICBpZiAoZGVwZW5kZW50QXJyYXkpIHsKKyAgICAgICAgICAgIG1ldGEuZGVwZW5kZW50
QXJyYXlzT2JzZXJ2ZXIuc2V0dXBPYnNlcnZlcnMoZGVwZW5kZW50QXJyYXksIGRlcGVuZGVudEtl
eSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LCB0aGlzKTsKKyAgICB9LCB0aGlz
KTsKIAotICAgIEBtZXRob2QgdHJpZ2dlcgotICAgIEBwYXJhbSBuYW1lIHtTdHJpbmd9Ci0gICov
Ci0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOwotICAgIHZhciBtZXRob2QgPSB0aGlzW25hbWVdOwotICAgIGlmIChtZXRo
b2QpIHsKLSAgICAgIHZhciBhcmdzID0gW10sIGksIGw7Ci0gICAgICBmb3IgKGkgPSAxLCBsID0g
YXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgICBhcmdzLnB1c2goYXJndW1l
bnRzW2ldKTsKKyAgICBmb3JFYWNoKGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbihkZXBlbmRl
bnRLZXkpIHsKKyAgICAgIGlmICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVu
dEtleSkpIHsgcmV0dXJuOyB9CisKKyAgICAgIHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlz
LCBkZXBlbmRlbnRLZXkpOworICAgICAgaWYgKGRlcGVuZGVudEFycmF5KSB7CisgICAgICAgIGFk
ZEl0ZW1zLmNhbGwodGhpcywgZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5
TmFtZSwgbWV0YSk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFy
Z3MpOwotICAgIH0KLSAgfSwKKyAgICB9LCB0aGlzKTsKKyAgfTsKIAotICBoYXM6IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIudHlwZU9mKHRoaXNbbmFtZV0pID09PSAnZnVuY3Rp
b24nIHx8IHRoaXMuX3N1cGVyKG5hbWUpOwotICB9LAorICB0aGlzLmZ1bmMgPSBmdW5jdGlvbiAo
cHJvcGVydHlOYW1lKSB7CisgICAgRW1iZXIuYXNzZXJ0KCJDb21wdXRlZCByZWR1Y2UgdmFsdWVz
IHJlcXVpcmUgYXQgbGVhc3Qgb25lIGRlcGVuZGVudCBrZXkiLCBjcC5fZGVwZW5kZW50S2V5cyk7
CiAKLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXJlbnQgPSB0aGlzLl9w
YXJlbnRWaWV3OworICAgIHJlY29tcHV0ZS5jYWxsKHRoaXMsIHByb3BlcnR5TmFtZSk7CiAKLSAg
ICAvLyBkZXN0cm95IHRoZSBlbGVtZW50IC0tIHRoaXMgd2lsbCBhdm9pZCBlYWNoIGNoaWxkIHZp
ZXcgZGVzdHJveWluZwotICAgIC8vIHRoZSBlbGVtZW50IG92ZXIgYW5kIG92ZXIgYWdhaW4uLi4K
LSAgICBpZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0cm95RWxlbWVudCgpOyB9
CisgICAgcmV0dXJuIGNwLl9pbnN0YW5jZU1ldGEodGhpcywgcHJvcGVydHlOYW1lKS5nZXRWYWx1
ZSgpOworICB9OworfQogCi0gICAgLy8gcmVtb3ZlIGZyb20gcGFyZW50IGlmIGZvdW5kLiBEb24n
dCBjYWxsIHJlbW92ZUZyb21QYXJlbnQsCi0gICAgLy8gYXMgcmVtb3ZlRnJvbVBhcmVudCB3aWxs
IHRyeSB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbQotICAgIC8vIHRoZSBET00gYWdhaW4uCi0g
ICAgaWYgKHBhcmVudCkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7IH0KK0VtYmVyLlJlZHVj
ZUNvbXB1dGVkUHJvcGVydHkgPSBSZWR1Y2VDb21wdXRlZFByb3BlcnR5OworUmVkdWNlQ29tcHV0
ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBvX2NyZWF0ZShDb21wdXRlZFByb3BlcnR5LnByb3RvdHlw
ZSk7CiAKLSAgICB0aGlzLnRyYW5zaXRpb25UbygnZGVzdHJveWVkJyk7CitmdW5jdGlvbiBkZWZh
dWx0Q2FsbGJhY2soY29tcHV0ZWRWYWx1ZSkgeworICByZXR1cm4gY29tcHV0ZWRWYWx1ZTsKK30K
IAotICAgIC8vIG5leHQgcmVtb3ZlIHZpZXcgZnJvbSBnbG9iYWwgaGFzaAotICAgIGlmICghdGhp
cy5pc1ZpcnR1YWwpIGRlbGV0ZSBFbWJlci5WaWV3LnZpZXdzW3RoaXMuZWxlbWVudElkXTsKLSAg
fSwKK1JlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9jYWxsYmFja3MgPSBmdW5jdGlv
biAoKSB7CisgIGlmICghdGhpcy5jYWxsYmFja3MpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRoaXMu
b3B0aW9uczsKKyAgICB0aGlzLmNhbGxiYWNrcyA9IHsKKyAgICAgIHJlbW92ZWRJdGVtOiBvcHRp
b25zLnJlbW92ZWRJdGVtIHx8IGRlZmF1bHRDYWxsYmFjaywKKyAgICAgIGFkZGVkSXRlbTogb3B0
aW9ucy5hZGRlZEl0ZW0gfHwgZGVmYXVsdENhbGxiYWNrCisgICAgfTsKKyAgfQorICByZXR1cm4g
dGhpcy5jYWxsYmFja3M7Cit9OwogCi0gIGNsZWFyUmVuZGVyZWRDaGlsZHJlbjogRW1iZXIuSywK
LSAgdHJpZ2dlclJlY3Vyc2l2ZWx5OiBFbWJlci5LLAotICBpbnZva2VSZWN1cnNpdmVseTogRW1i
ZXIuSywKLSAgdHJhbnNpdGlvblRvOiBFbWJlci5LLAotICBkZXN0cm95RWxlbWVudDogRW1iZXIu
SwotfSk7CitSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5faGFzSW5zdGFuY2VNZXRh
ID0gZnVuY3Rpb24gKGNvbnRleHQsIHByb3BlcnR5TmFtZSkgeworICB2YXIgZ3VpZCA9IGd1aWRG
b3IoY29udGV4dCksCisgICAgICBrZXkgPSBndWlkICsgJzonICsgcHJvcGVydHlOYW1lOwogCi0v
KioKLSAgYEVtYmVyLlZpZXdgIGlzIHRoZSBjbGFzcyBpbiBFbWJlciByZXNwb25zaWJsZSBmb3Ig
ZW5jYXBzdWxhdGluZyB0ZW1wbGF0ZXMgb2YKLSAgSFRNTCBjb250ZW50LCBjb21iaW5pbmcgdGVt
cGxhdGVzIHdpdGggZGF0YSB0byByZW5kZXIgYXMgc2VjdGlvbnMgb2YgYSBwYWdlJ3MKLSAgRE9N
LCBhbmQgcmVnaXN0ZXJpbmcgYW5kIHJlc3BvbmRpbmcgdG8gdXNlci1pbml0aWF0ZWQgZXZlbnRz
LgorICByZXR1cm4gISF0aGlzLl9pbnN0YW5jZU1ldGFzW2tleV07Cit9OwogCi0gICMjIEhUTUwg
VGFnCitSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5faW5zdGFuY2VNZXRhID0gZnVu
Y3Rpb24gKGNvbnRleHQsIHByb3BlcnR5TmFtZSkgeworICB2YXIgZ3VpZCA9IGd1aWRGb3IoY29u
dGV4dCksCisgICAgICBrZXkgPSBndWlkICsgJzonICsgcHJvcGVydHlOYW1lLAorICAgICAgbWV0
YSA9IHRoaXMuX2luc3RhbmNlTWV0YXNba2V5XTsKIAotICBUaGUgZGVmYXVsdCBIVE1MIHRhZyBu
YW1lIHVzZWQgZm9yIGEgdmlldydzIERPTSByZXByZXNlbnRhdGlvbiBpcyBgZGl2YC4gVGhpcwot
ICBjYW4gYmUgY3VzdG9taXplZCBieSBzZXR0aW5nIHRoZSBgdGFnTmFtZWAgcHJvcGVydHkuIFRo
ZSBmb2xsb3dpbmcgdmlldwotY2xhc3M6CisgIGlmICghbWV0YSkgeworICAgIG1ldGEgPSB0aGlz
Ll9pbnN0YW5jZU1ldGFzW2tleV0gPSBuZXcgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNl
TWV0YShjb250ZXh0LCBwcm9wZXJ0eU5hbWUsIHRoaXMuaW5pdGlhbFZhbHVlKCkpOworICAgIG1l
dGEuZGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIgPSBuZXcgRGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIo
dGhpcy5fY2FsbGJhY2tzKCksIHRoaXMsIG1ldGEsIGNvbnRleHQsIHByb3BlcnR5TmFtZSwgbWV0
YS5zdWdhck1ldGEpOworICB9CiAKLSAgYGBgamF2YXNjcmlwdAotICBQYXJhZ3JhcGhWaWV3ID0g
RW1iZXIuVmlldy5leHRlbmQoewotICAgIHRhZ05hbWU6ICdlbScKLSAgfSk7Ci0gIGBgYAorICBy
ZXR1cm4gbWV0YTsKK307CiAKLSAgV291bGQgcmVzdWx0IGluIGluc3RhbmNlcyB3aXRoIHRoZSBm
b2xsb3dpbmcgSFRNTDoKK1JlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLmluaXRpYWxW
YWx1ZSA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaW5pdGlhbFZh
bHVlID09PSAnZnVuY3Rpb24nKSB7CisgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbml0aWFsVmFs
dWUoKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluaXRpYWxWYWx1
ZTsKKyAgfQorfTsKIAotICBgYGBodG1sCi0gIDxlbSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXIt
dmlldyI+PC9lbT4KLSAgYGBgCitSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5yZXNl
dFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7CisgIHJldHVybiB0aGlzLmluaXRpYWxWYWx1ZSgp
OworfTsKIAotICAjIyBIVE1MIGBjbGFzc2AgQXR0cmlidXRlCitSZWR1Y2VDb21wdXRlZFByb3Bl
cnR5LnByb3RvdHlwZS5pdGVtUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXlL
ZXksIGl0ZW1Qcm9wZXJ0eUtleSkgeworICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVu
dEFycmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldIHx8
IFtdOworICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XS5wdXNoKGl0
ZW1Qcm9wZXJ0eUtleSk7Cit9OwogCi0gIFRoZSBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIG9mIGEg
dmlldydzIHRhZyBjYW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhCi0gIGBjbGFzc05hbWVzYCBwcm9w
ZXJ0eSB0aGF0IGlzIHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzOgorUmVkdWNlQ29tcHV0ZWRQ
cm9wZXJ0eS5wcm90b3R5cGUuY2xlYXJJdGVtUHJvcGVydHlLZXlzID0gZnVuY3Rpb24gKGRlcGVu
ZGVudEFycmF5S2V5KSB7CisgIGlmICh0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFy
cmF5S2V5XSkgeworICAgIHRoaXMuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRB
cnJheUtleV0gPSB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XTsKKyAg
ICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XSA9IFtdOworICB9Cit9
OwogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAg
IGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAnbXktb3RoZXItY2xhc3MnXQorUmVkdWNlQ29tcHV0
ZWRQcm9wZXJ0eS5wcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbiAoKSB7CisgIHZhciBjcCA9
IHRoaXMsCisgICAgICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyksCisgICAgICBwcm9w
ZXJ0eUFyZ3MgPSBuZXcgRW1iZXIuU2V0KCksCisgICAgICBtYXRjaCwKKyAgICAgIGRlcGVuZGVu
dEFycmF5S2V5LAorICAgICAgaXRlbVByb3BlcnR5S2V5OworCisgIGZvckVhY2goYV9zbGljZS5j
YWxsKGFyZ3VtZW50cyksIGZ1bmN0aW9uIChkZXBlbmRlbnRLZXkpIHsKKyAgICBpZiAoZG91Ymxl
RWFjaFByb3BlcnR5UGF0dGVybi50ZXN0KGRlcGVuZGVudEtleSkpIHsKKyAgICAgIHRocm93IG5l
dyBFbWJlci5FcnJvcigiTmVzdGVkIEBlYWNoIHByb3BlcnRpZXMgbm90IHN1cHBvcnRlZDogIiAr
IGRlcGVuZGVudEtleSk7CisgICAgfSBlbHNlIGlmIChtYXRjaCA9IGVhY2hQcm9wZXJ0eVBhdHRl
cm4uZXhlYyhkZXBlbmRlbnRLZXkpKSB7CisgICAgICBkZXBlbmRlbnRBcnJheUtleSA9IG1hdGNo
WzFdOworCisgICAgICAKKyAgICAgICAgaXRlbVByb3BlcnR5S2V5ID0gbWF0Y2hbMl07CisgICAg
ICAgIGNwLml0ZW1Qcm9wZXJ0eUtleShkZXBlbmRlbnRBcnJheUtleSwgaXRlbVByb3BlcnR5S2V5
KTsKKyAgICAgIAorICAgICAgcHJvcGVydHlBcmdzLmFkZChkZXBlbmRlbnRBcnJheUtleSk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHByb3BlcnR5QXJncy5hZGQoZGVwZW5kZW50S2V5KTsKKyAgICB9
CiAgIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFu
IEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEi
IGNsYXNzPSJlbWJlci12aWV3IG15LWNsYXNzIG15LW90aGVyLWNsYXNzIj48L2Rpdj4KLSAgYGBg
CisgIHJldHVybiBDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5wcm9wZXJ0eS5hcHBseSh0aGlz
LCBwcm9wZXJ0eUFyZ3MudG9BcnJheSgpKTsKIAotICBgY2xhc3NgIGF0dHJpYnV0ZSB2YWx1ZXMg
Y2FuIGFsc28gYmUgc2V0IGJ5IHByb3ZpZGluZyBhIGBjbGFzc05hbWVCaW5kaW5nc2AKLSAgcHJv
cGVydHkgc2V0IHRvIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMgZm9yIHRoZSB2aWV3LiBU
aGUgcmV0dXJuIHZhbHVlCi0gIG9mIHRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBhZGRlZCBhcyBw
YXJ0IG9mIHRoZSB2YWx1ZSBmb3IgdGhlIHZpZXcncyBgY2xhc3NgCi0gIGF0dHJpYnV0ZS4gVGhl
c2UgcHJvcGVydGllcyBjYW4gYmUgY29tcHV0ZWQgcHJvcGVydGllczoKK307CiAKLSAgYGBgamF2
YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1lQmlu
ZGluZ3M6IFsncHJvcGVydHlBJywgJ3Byb3BlcnR5QiddLAotICAgIHByb3BlcnR5QTogJ2Zyb20t
YScsCi0gICAgcHJvcGVydHlCOiBmdW5jdGlvbigpewotICAgICAgaWYoc29tZUxvZ2ljKXsgcmV0
dXJuICdmcm9tLWInOyB9Ci0gICAgfS5wcm9wZXJ0eSgpCi0gIH0pOwotICBgYGAKKy8qKgorICBD
cmVhdGVzIGEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggb3BlcmF0ZXMgb24gZGVwZW5kZW50IGFy
cmF5cyBhbmQKKyAgaXMgdXBkYXRlZCB3aXRoICJvbmUgYXQgYSB0aW1lIiBzZW1hbnRpY3MuIFdo
ZW4gaXRlbXMgYXJlIGFkZGVkIG9yCisgIHJlbW92ZWQgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5
KHMpIGEgcmVkdWNlIGNvbXB1dGVkIG9ubHkgb3BlcmF0ZXMKKyAgb24gdGhlIGNoYW5nZSBpbnN0
ZWFkIG9mIHJlLWV2YWx1YXRpbmcgdGhlIGVudGlyZSBhcnJheS4KIAotICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIElmIHRo
ZXJlIGFyZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50cyB0aGUgZmlyc3QgYXJndW1lbnRzIGFyZQor
ICBjb25zaWRlcmVkIHRvIGJlIGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlzLiBUaGUgbGFzdCBhcmd1
bWVudCBpcworICByZXF1aXJlZCB0byBiZSBhbiBvcHRpb25zIG9iamVjdC4gVGhlIG9wdGlvbnMg
b2JqZWN0IGNhbiBoYXZlIHRoZQorICBmb2xsb3dpbmcgZm91ciBwcm9wZXJ0aWVzOgogCi0gIGBg
YGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBmcm9tLWEgZnJvbS1i
Ij48L2Rpdj4KLSAgYGBgCisgIGBpbml0aWFsVmFsdWVgIC0gQSB2YWx1ZSBvciBmdW5jdGlvbiB0
aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5pdGlhbAorICB2YWx1ZSBmb3IgdGhlIGNvbXB1dGVk
LiBJZiB0aGlzIHByb3BlcnR5IGlzIGEgZnVuY3Rpb24gdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisg
IHRoZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIGluaXRpYWwgdmFsdWUuIFRoaXMgcHJv
cGVydHkgaXMgcmVxdWlyZWQuCiAKLSAgSWYgdGhlIHZhbHVlIG9mIGEgY2xhc3MgbmFtZSBiaW5k
aW5nIHJldHVybnMgYSBib29sZWFuIHRoZSBwcm9wZXJ0eSBuYW1lCi0gIGl0c2VsZiB3aWxsIGJl
IHVzZWQgYXMgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIFRoZSBjbGFz
cyBuYW1lCi0gIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgIG9yIGB1
bmRlZmluZWRgLgorICBgaW5pdGlhbGl6ZWAgLSBBbiBvcHRpb25hbCBpbml0aWFsaXplIGZ1bmN0
aW9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHVzZWQKKyAgdG8gc2V0IHVwIHN0YXRlIG9uIHRo
ZSBpbnN0YW5jZU1ldGEgb2JqZWN0LgogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1i
ZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2hvdmVyZWQnXSwKLSAg
ICBob3ZlcmVkOiB0cnVlCi0gIH0pOwotICBgYGAKKyAgYHJlbW92ZWRJdGVtYCAtIEEgZnVuY3Rp
b24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZAorICBmcm9t
IHRoZSBhcnJheS4KIAotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhU
TUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIGBhZGRlZEl0ZW1gIC0gQSBmdW5jdGlvbiB0aGF0IGlz
IGNhbGxlZCBlYWNoIHRpbWUgYW4gZWxlbWVudCBpcyBhZGRlZCB0bworICB0aGUgYXJyYXkuCiAK
LSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGhvdmVyZWQi
PjwvZGl2PgotICBgYGAKIAotICBXaGVuIHVzaW5nIGJvb2xlYW4gY2xhc3MgbmFtZSBiaW5kaW5n
cyB5b3UgY2FuIHN1cHBseSBhIHN0cmluZyB2YWx1ZSBvdGhlcgotICB0aGFuIHRoZSBwcm9wZXJ0
eSBuYW1lIGZvciB1c2UgYXMgdGhlIGBjbGFzc2AgSFRNTCBhdHRyaWJ1dGUgYnkgYXBwZW5kaW5n
IHRoZQotICBwcmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIgY2hhcmFjdGVyIHdoZW4gZGVmaW5p
bmcgdGhlIGJpbmRpbmc6CisgIFRoZSBgaW5pdGlhbGl6ZWAgZnVuY3Rpb24gaGFzIHRoZSBmb2xs
b3dpbmcgc2lnbmF0dXJlOgogCiAgIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmll
dy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2F3ZXNvbWU6c28tdmVyeS1jb29s
J10sCi0gICAgYXdlc29tZTogdHJ1ZQotICB9KTsKKyAgIGZ1bmN0aW9uIChpbml0aWFsVmFsdWUs
IGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKICAgYGBgCiAKLSAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICBgaW5pdGlhbFZh
bHVlYCAtIFRoZSB2YWx1ZSBvZiB0aGUgYGluaXRpYWxWYWx1ZWAgcHJvcGVydHkgZnJvbSB0aGUK
KyAgb3B0aW9ucyBvYmplY3QuCiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNz
PSJlbWJlci12aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+Ci0gIGBgYAorICBgY2hhbmdlTWV0YWAg
LSBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAg
Y29tcHV0ZWQuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKworICAgICAt
IGBwcm9wZXJ0eWAgdGhlIGNvbXB1dGVkIHByb3BlcnR5CisgICAgIC0gYHByb3BlcnR5TmFtZWAg
dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3QKKworICBgaW5zdGFuY2VNZXRh
YCAtIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIG1ldGEKKyAgaW5mb3JtYXRp
b24gbmVlZGVkIGZvciBjYWxjdWxhdGluZyB5b3VyIGNvbXB1dGVkLiBGb3IgZXhhbXBsZSBhCisg
IHVuaXF1ZSBjb21wdXRlZCBtaWdodCB1c2UgdGhpcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHRp
bWVzIGEgZ2l2ZW4KKyAgZWxlbWVudCBpcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW50IGFycmF5Lgog
Ci0gIEJvb2xlYW4gdmFsdWUgY2xhc3MgbmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBuYW1l
cyBhcmUgaW4gYQotICBjYW1lbENhc2Utc3R5bGUgZm9ybWF0IHdpbGwgYmUgY29udmVydGVkIHRv
IGEgZGFzaGVyaXplZCBmb3JtYXQ6CisKKyAgVGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRlZEl0
ZW1gIGZ1bmN0aW9ucyBib3RoIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CiAKICAgYGBg
amF2YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1l
QmluZGluZ3M6IFsnaXNVcmdlbnQnXSwKLSAgICBpc1VyZ2VudDogdHJ1ZQotICB9KTsKKyAgZnVu
Y3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkK
ICAgYGBgCiAKLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJl
cHJlc2VudGF0aW9uIG9mOgorICBgYWNjdW11bGF0ZWRWYWx1ZWAgLSBUaGUgdmFsdWUgcmV0dXJu
ZWQgZnJvbSB0aGUgbGFzdCB0aW1lCisgIGByZW1vdmVkSXRlbWAgb3IgYGFkZGVkSXRlbWAgd2Fz
IGNhbGxlZCBvciBgaW5pdGlhbFZhbHVlYC4KIAotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVy
MSIgY2xhc3M9ImVtYmVyLXZpZXcgaXMtdXJnZW50Ij48L2Rpdj4KLSAgYGBgCisgIGBpdGVtYCAt
IHRoZSBlbGVtZW50IGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkKIAotICBDbGFzcyBu
YW1lIGJpbmRpbmdzIGNhbiBhbHNvIHJlZmVyIHRvIG9iamVjdCB2YWx1ZXMgdGhhdCBhcmUgZm91
bmQgYnkKLSAgdHJhdmVyc2luZyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHZpZXcgaXRzZWxmOgor
ICBgY2hhbmdlTWV0YWAgLSBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlv
biBhYm91dCB0aGUKKyAgY2hhbmdlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRp
ZXM6CiAKLSAgYGBgamF2YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0g
ICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnbWVzc2FnZXMuZW1wdHknXQotICAgIG1lc3NhZ2VzOiBF
bWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICAgIGVtcHR5OiB0cnVlCi0gICAgfSkKLSAgfSk7Ci0g
IGBgYAorICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQgcHJvcGVydHkKKyAgICAtIGBwcm9w
ZXJ0eU5hbWVgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0CisgICAgLSBg
aW5kZXhgIHRoZSBpbmRleCBvZiB0aGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCisgICAgLSBgaXRl
bWAgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbTogdGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFz
CisgICAgICB0aGUgc2Vjb25kIGFyZworICAgIC0gYGFycmF5Q2hhbmdlZGAgdGhlIGFycmF5IHRo
YXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuIENhbiBiZQorICAgICAgdXNlZnVsIHdoZW4gZGVwZW5k
aW5nIG9uIG11bHRpcGxlIGFycmF5cy4KIAotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNl
cyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIEZvciBwcm9wZXJ0eSBjaGFuZ2Vz
IHRyaWdnZXJlZCBvbiBhbiBpdGVtIHByb3BlcnR5IGNoYW5nZSAod2hlbgorICBkZXBLZXkgaXMg
c29tZXRoaW5nIGxpa2UgYHNvbWVBcnJheS5AZWFjaC5zb21lUHJvcGVydHlgKSwKKyAgYGNoYW5n
ZU1ldGFgIHdpbGwgYWxzbyBjb250YWluIHRoZSBmb2xsb3dpbmcgcHJvcGVydHk6CiAKLSAgYGBg
aHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGVtcHR5Ij48L2Rpdj4K
LSAgYGBgCisgICAgLSBgcHJldmlvdXNWYWx1ZXNgIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0
aGUgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgb24KKyAgICB0aGUgaXRlbSwgYW5kIHdob3NlIHZh
bHVlcyBhcmUgdGhlIGl0ZW0ncyBwcmV2aW91cyB2YWx1ZXMuCiAKLSAgSWYgeW91IHdhbnQgdG8g
YWRkIGEgY2xhc3MgbmFtZSBmb3IgYSBwcm9wZXJ0eSB3aGljaCBldmFsdWF0ZXMgdG8gdHJ1ZSBh
bmQKLSAgYW5kIGEgZGlmZmVyZW50IGNsYXNzIG5hbWUgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNl
LCB5b3UgY2FuIHBhc3MgYSBiaW5kaW5nCi0gIGxpa2UgdGhpczoKKyAgYHByZXZpb3VzVmFsdWVz
YCBpcyBpbXBvcnRhbnQgRW1iZXIgY29hbGVzY2VzIGl0ZW0gcHJvcGVydHkgY2hhbmdlcyB2aWEK
KyAgRW1iZXIucnVuLm9uY2UuIFRoaXMgbWVhbnMgdGhhdCBieSB0aGUgdGltZSByZW1vdmVkSXRl
bSBnZXRzIGNhbGxlZCwgaXRlbSBoYXMKKyAgdGhlIG5ldyB2YWx1ZXMsIGJ1dCB5b3UgbWF5IG5l
ZWQgdGhlIHByZXZpb3VzIHZhbHVlIChlZyBmb3Igc29ydGluZyAmCisgIGZpbHRlcmluZykuCiAK
LSAgYGBgamF2YXNjcmlwdAotICAvLyBBcHBsaWVzICdlbmFibGVkJyBjbGFzcyB3aGVuIGlzRW5h
YmxlZCBpcyB0cnVlIGFuZCAnZGlzYWJsZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCi0gIEVt
YmVyLlZpZXcuY3JlYXRlKHsKLSAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0VuYWJsZWQ6ZW5h
YmxlZDpkaXNhYmxlZCddCi0gICAgaXNFbmFibGVkOiB0cnVlCi0gIH0pOwotICBgYGAKKyAgYGlu
c3RhbmNlTWV0YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCisg
IGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4gRm9yIGV4
YW1wbGUgYQorICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51
bWJlciBvZiB0aW1lcyBhIGdpdmVuCisgIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRlcGVuZGVu
dCBhcnJheS4KIAotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwg
cmVwcmVzZW50YXRpb24gb2Y6CisgIFRoZSBgcmVtb3ZlZEl0ZW1gIGFuZCBgYWRkZWRJdGVtYCBm
dW5jdGlvbnMgc2hvdWxkIHJldHVybiB0aGUgYWNjdW11bGF0ZWQKKyAgdmFsdWUuIEl0IGlzIGFj
Y2VwdGFibGUgdG8gbm90IHJldHVybiBhbnl0aGluZyAoaWUgcmV0dXJuIHVuZGVmaW5lZCkKKyAg
dG8gaW52YWxpZGF0ZSB0aGUgY29tcHV0YXRpb24uIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdCBhIGdv
b2QgaWRlYSBmb3IKKyAgYXJyYXlDb21wdXRlZCBidXQgaXQncyB1c2VkIGluIGVnIG1heCBhbmQg
bWluLgogCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBl
bmFibGVkIj48L2Rpdj4KLSAgYGBgCisgIE5vdGUgdGhhdCBvYnNlcnZlcnMgd2lsbCBiZSBmaXJl
ZCBpZiBlaXRoZXIgb2YgdGhlc2UgZnVuY3Rpb25zIHJldHVybiBhIHZhbHVlCisgIHRoYXQgZGlm
ZmVycyBmcm9tIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4gIFdoZW4gcmV0dXJuaW5nIGFuIG9iamVj
dCB0aGF0CisgIG11dGF0ZXMgaW4gcmVzcG9uc2UgdG8gYXJyYXkgY2hhbmdlcywgZm9yIGV4YW1w
bGUgYW4gYXJyYXkgdGhhdCBtYXBzCisgIGV2ZXJ5dGhpbmcgZnJvbSBzb21lIG90aGVyIGFycmF5
IChzZWUgYEVtYmVyLmNvbXB1dGVkLm1hcGApLCBpdCBpcyB1c3VhbGx5CisgIGltcG9ydGFudCB0
aGF0IHRoZSAqc2FtZSogYXJyYXkgYmUgcmV0dXJuZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHRy
aWdnZXJpbmcgb2JzZXJ2ZXJzLgogCi0gIFdoZW4gaXNFbmFibGVkIGlzIGBmYWxzZWAsIHRoZSBy
ZXN1bHRpbmcgSFRNTCByZXByZW5zZW50YXRpb24gbG9va3MgbGlrZQotICB0aGlzOgorICBFeGFt
cGxlCiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGRp
c2FibGVkIj48L2Rpdj4KLSAgYGBgCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuY29tcHV0ZWQu
bWF4ID0gZnVuY3Rpb24gKGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiBFbWJlci5yZWR1Y2VD
b21wdXRlZC5jYWxsKG51bGwsIGRlcGVuZGVudEtleSwgeworICAgICAgaW5pdGlhbFZhbHVlOiAt
SW5maW5pdHksCiAKLSAgVGhpcyBzeW50YXggb2ZmZXJzIHRoZSBjb252ZW5pZW5jZSB0byBhZGQg
YSBjbGFzcyBpZiBhIHByb3BlcnR5IGlzIGBmYWxzZWA6CisgICAgICBhZGRlZEl0ZW06IGZ1bmN0
aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsK
KyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0pOworICAgICAg
fSwKIAotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEFwcGxpZXMgbm8gY2xhc3Mgd2hlbiBpc0VuYWJs
ZWQgaXMgdHJ1ZSBhbmQgY2xhc3MgJ2Rpc2FibGVkJyB3aGVuIGlzRW5hYmxlZCBpcyBmYWxzZQot
ICBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNFbmFibGVk
OjpkaXNhYmxlZCddCi0gICAgaXNFbmFibGVkOiB0cnVlCi0gIH0pOworICAgICAgcmVtb3ZlZEl0
ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5j
ZU1ldGEpIHsKKyAgICAgICAgaWYgKGl0ZW0gPCBhY2N1bXVsYXRlZFZhbHVlKSB7CisgICAgICAg
ICAgcmV0dXJuIGFjY3VtdWxhdGVkVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsK
KyAgfTsKICAgYGBgCiAKLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBI
VE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICBEZXBlbmRlbnQga2V5cyBtYXkgcmVmZXIgdG8gYEB0
aGlzYCB0byBvYnNlcnZlIGNoYW5nZXMgdG8gdGhlIG9iamVjdCBpdHNlbGYsCisgIHdoaWNoIG11
c3QgYmUgYXJyYXktbGlrZSwgcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LiAg
VGhpcyBpcworICBtb3N0bHkgdXNlZnVsIGZvciBhcnJheSBwcm94aWVzLCB0byBlbnN1cmUgb2Jq
ZWN0cyBhcmUgcmV0cmlldmVkIHZpYQorICBgb2JqZWN0QXRDb250ZW50YC4gIFRoaXMgaXMgaG93
IHlvdSBjb3VsZCBzb3J0IGl0ZW1zIGJ5IHByb3BlcnRpZXMgZGVmaW5lZCBvbiBhbiBpdGVtIGNv
bnRyb2xsZXIuCiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12
aWV3Ij48L2Rpdj4KLSAgYGBgCisgIEV4YW1wbGUKIAotICBXaGVuIHRoZSBgaXNFbmFibGVkYCBw
cm9wZXJ0eSBvbiB0aGUgdmlldyBpcyBzZXQgdG8gYGZhbHNlYCwgaXQgd2lsbCByZXN1bHQKLSAg
aW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICBgYGBq
YXZhc2NyaXB0CisgIEFwcC5QZW9wbGVDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVy
LmV4dGVuZCh7CisgICAgaXRlbUNvbnRyb2xsZXI6ICdwZXJzb24nLAorCisgICAgc29ydGVkUGVv
cGxlOiBFbWJlci5jb21wdXRlZC5zb3J0KCdAdGhpcy5AZWFjaC5yZXZlcnNlZE5hbWUnLCBmdW5j
dGlvbihwZXJzb25BLCBwZXJzb25CKSB7CisgICAgICAvLyBgcmV2ZXJzZWROYW1lYCBpc24ndCBk
ZWZpbmVkIG9uIFBlcnNvbiwgYnV0IHdlIGhhdmUgYWNjZXNzIHRvIGl0IHZpYQorICAgICAgLy8g
dGhlIGl0ZW0gY29udHJvbGxlciBBcHAuUGVyc29uQ29udHJvbGxlci4gIElmIHdlJ2QgdXNlZAor
ICAgICAgLy8gYGNvbnRlbnQuQGVhY2gucmV2ZXJzZWROYW1lYCBhYm92ZSwgd2Ugd291bGQgYmUg
Z2V0dGluZyB0aGUgb2JqZWN0cworICAgICAgLy8gZGlyZWN0bHkgYW5kIG5vdCBoYXZlIGFjY2Vz
cyB0byBgcmV2ZXJzZWROYW1lYC4KKyAgICAgIC8vCisgICAgICB2YXIgcmV2ZXJzZWROYW1lQSA9
IGdldChwZXJzb25BLCAncmV2ZXJzZWROYW1lJyksCisgICAgICAgICAgcmV2ZXJzZWROYW1lQiA9
IGdldChwZXJzb25CLCAncmV2ZXJzZWROYW1lJyk7CiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJl
bWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGRpc2FibGVkIj48L2Rpdj4KKyAgICAgIHJldHVybiBF
bWJlci5jb21wYXJlKHJldmVyc2VkTmFtZUEsIHJldmVyc2VkTmFtZUIpOworICAgIH0pCisgIH0p
OworCisgIEFwcC5QZXJzb25Db250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRl
bmQoeworICAgIHJldmVyc2VkTmFtZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHJldmVy
c2UoZ2V0KHRoaXMsICduYW1lJykpOworICAgIH0ucHJvcGVydHkoJ25hbWUnKQorICB9KQogICBg
YGAKIAotICBVcGRhdGVzIHRvIHRoZSB0aGUgdmFsdWUgb2YgYSBjbGFzcyBuYW1lIGJpbmRpbmcg
d2lsbCByZXN1bHQgaW4gYXV0b21hdGljCi0gIHVwZGF0ZSBvZiB0aGUgIEhUTUwgYGNsYXNzYCBh
dHRyaWJ1dGUgaW4gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MCi0gIHJlcHJlc2VudGF0aW9uLiBJ
ZiB0aGUgdmFsdWUgYmVjb21lcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgIHRoZSBjbGFzcyBuYW1l
Ci0gIHdpbGwgYmUgcmVtb3ZlZC4KKyAgRGVwZW5kZW50IGtleXMgd2hvc2UgdmFsdWVzIGFyZSBu
b3QgYXJyYXlzIGFyZSB0cmVhdGVkIGFzIHJlZ3VsYXIKKyAgZGVwZW5kZW5jaWVzOiB3aGVuIHRo
ZXkgY2hhbmdlLCB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgY29tcGxldGVseQorICByZWNhbGN1
bGF0ZWQuICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhhdmUgZGVwZW5kZW50IGFycmF5cyB3
aXRoIHNpbWlsYXIKKyAgc2VtYW50aWNzLiAgRGVwZW5kZW50IGtleXMgd2hpY2ggZW5kIGluIGAu
W11gIGRvIG5vdCB1c2UgIm9uZSBhdCBhIHRpbWUiCisgIHNlbWFudGljcy4gIFdoZW4gYW4gaXRl
bSBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gc3VjaCBhIGRlcGVuZGVuY3ksIHRoZQorICBjb21w
dXRlZCBwcm9wZXJ0eSBpcyBjb21wbGV0ZWx5IHJlY29tcHV0ZWQuCiAKLSAgQm90aCBgY2xhc3NO
YW1lc2AgYW5kIGBjbGFzc05hbWVCaW5kaW5nc2AgYXJlIGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVz
LiBTZWUKLSAgYEVtYmVyLk9iamVjdGAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlv
biBhYm91dCBjb25jYXRlbmF0ZWQKLSAgcHJvcGVydGllcy4KKyAgRXhhbXBsZQogCi0gICMjIEhU
TUwgQXR0cmlidXRlcworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgIC8vIFdoZW4gYHN0cmluZ2AgaXMgY2hhbmdlZCwgYGNvbXB1dGVkYCBpcyBjb21wbGV0ZWx5
IHJlY29tcHV0ZWQuCisgICAgc3RyaW5nOiAnYSBzdHJpbmcnLAogCi0gIFRoZSBIVE1MIGF0dHJp
YnV0ZSBzZWN0aW9uIG9mIGEgdmlldydzIHRhZyBjYW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhbgot
ICBgYXR0cmlidXRlQmluZGluZ3NgIHByb3BlcnR5IHNldCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0
eSBuYW1lcyBvbiB0aGUgdmlldy4KLSAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0
aWVzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHZpZXcncwotICBIVE1MIGFzc29j
aWF0ZWQgYXR0cmlidXRlOgorICAgIC8vIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCB0byBgYXJyYXlg
LCBgYWRkZWRJdGVtYCBpcyBjYWxsZWQuCisgICAgYXJyYXk6IFtdLAogCi0gIGBgYGphdmFzY3Jp
cHQKLSAgQW5jaG9yVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0YWdOYW1lOiAnYScs
Ci0gICAgYXR0cmlidXRlQmluZGluZ3M6IFsnaHJlZiddLAotICAgIGhyZWY6ICdodHRwOi8vZ29v
Z2xlLmNvbScKKyAgICAvLyBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYGFub3RoZXJBcnJheWAs
IGBjb21wdXRlZGAgaXMgY29tcGxldGVseQorICAgIC8vIHJlY29tcHV0ZWQuCisgICAgYW5vdGhl
ckFycmF5OiBbXSwKKworICAgIGNvbXB1dGVkOiBFbWJlci5yZWR1Y2VDb21wdXRlZCgnc3RyaW5n
JywgJ2FycmF5JywgJ2Fub3RoZXJBcnJheS5bXScsIHsKKyAgICAgIGFkZGVkSXRlbTogYWRkZWRJ
dGVtQ2FsbGJhY2ssCisgICAgICByZW1vdmVkSXRlbTogcmVtb3ZlZEl0ZW1DYWxsYmFjaworICAg
IH0pCiAgIH0pOwogICBgYGAKIAotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIEBtZXRob2QgcmVkdWNlQ29tcHV0ZWQKKyAg
QGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gW2RlcGVuZGVudEtleXMqXQorICBAcGFyYW0g
e09iamVjdH0gb3B0aW9ucworICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fQorKi8K
K0VtYmVyLnJlZHVjZUNvbXB1dGVkID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgdmFyIGFyZ3M7
CiAKLSAgYGBgaHRtbAotICA8YSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0i
aHR0cDovL2dvb2dsZS5jb20iPjwvYT4KLSAgYGBgCisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4g
MSkgeworICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7CisgICAgb3B0
aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIC0xKVswXTsKKyAgfQogCi0gIElmIHRoZSBy
ZXR1cm4gdmFsdWUgb2YgYW4gYGF0dHJpYnV0ZUJpbmRpbmdzYCBtb25pdG9yZWQgcHJvcGVydHkg
aXMgYSBib29sZWFuCi0gIHRoZSBwcm9wZXJ0eSB3aWxsIGZvbGxvdyBIVE1MJ3MgcGF0dGVybiBv
ZiByZXBlYXRpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYXMKLSAgaXRzIHZhbHVlOgorICBpZiAo
dHlwZW9mIG9wdGlvbnMgIT09ICJvYmplY3QiKSB7CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y
KCJSZWR1Y2UgQ29tcHV0ZWQgUHJvcGVydHkgZGVjbGFyZWQgd2l0aG91dCBhbiBvcHRpb25zIGhh
c2giKTsKKyAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlUZXh0SW5wdXQgPSBFbWJlci5WaWV3
LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2lucHV0JywKLSAgICBhdHRyaWJ1dGVCaW5kaW5nczog
WydkaXNhYmxlZCddLAotICAgIGRpc2FibGVkOiB0cnVlCi0gIH0pOwotICBgYGAKKyAgaWYgKCEo
J2luaXRpYWxWYWx1ZScgaW4gb3B0aW9ucykpIHsKKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3Io
IlJlZHVjZSBDb21wdXRlZCBQcm9wZXJ0eSBkZWNsYXJlZCB3aXRob3V0IGFuIGluaXRpYWwgdmFs
dWUiKTsKKyAgfQogCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRN
TCByZXByZXNlbnRhdGlvbiBvZjoKKyAgdmFyIGNwID0gbmV3IFJlZHVjZUNvbXB1dGVkUHJvcGVy
dHkob3B0aW9ucyk7CiAKLSAgYGBgaHRtbAotICA8aW5wdXQgaWQ9ImVtYmVyMSIgY2xhc3M9ImVt
YmVyLXZpZXciIGRpc2FibGVkPSJkaXNhYmxlZCIgLz4KLSAgYGBgCisgIGlmIChhcmdzKSB7Cisg
ICAgY3AucHJvcGVydHkuYXBwbHkoY3AsIGFyZ3MpOworICB9CiAKLSAgYGF0dHJpYnV0ZUJpbmRp
bmdzYCBjYW4gcmVmZXIgdG8gY29tcHV0ZWQgcHJvcGVydGllczoKKyAgcmV0dXJuIGNwOworfTsK
IAotICBgYGBqYXZhc2NyaXB0Ci0gIE15VGV4dElucHV0ID0gRW1iZXIuVmlldy5leHRlbmQoewot
ICAgIHRhZ05hbWU6ICdpbnB1dCcsCi0gICAgYXR0cmlidXRlQmluZGluZ3M6IFsnZGlzYWJsZWQn
XSwKLSAgICBkaXNhYmxlZDogZnVuY3Rpb24oKXsKLSAgICAgIGlmIChzb21lTG9naWMpIHsKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7
Cit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIFJlZHVjZUNvbXB1dGVkUHJvcGVydHkg
PSBFbWJlci5SZWR1Y2VDb21wdXRlZFByb3BlcnR5LAorICAgIGFfc2xpY2UgPSBbXS5zbGljZSwK
KyAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKKyAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVy
YWJsZVV0aWxzLmZvckVhY2g7CisKK2Z1bmN0aW9uIEFycmF5Q29tcHV0ZWRQcm9wZXJ0eSgpIHsK
KyAgdmFyIGNwID0gdGhpczsKKworICBSZWR1Y2VDb21wdXRlZFByb3BlcnR5LmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7CisKKyAgdGhpcy5mdW5jID0gKGZ1bmN0aW9uKHJlZHVjZUZ1bmMpIHsKKyAg
ICByZXR1cm4gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkgeworICAgICAgaWYgKCFjcC5faGFzSW5z
dGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgLy8gV2hlbiB3ZSByZWNv
bXB1dGUgYW4gYXJyYXkgY29tcHV0ZWQgcHJvcGVydHksIHdlIG5lZWQgYWxyZWFkeQorICAgICAg
ICAvLyByZXRyaWV2ZWQgYXJyYXlzIHRvIGJlIHVwZGF0ZWQ7IHdlIGNhbid0IHNpbXBseSBlbXB0
eSB0aGUgY2FjaGUgYW5kCisgICAgICAgIC8vIGhvcGUgdGhlIGFycmF5IGlzIHJlLXJldHJpZXZl
ZC4KKyAgICAgICAgZm9yRWFjaChjcC5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24oZGVwZW5kZW50
S2V5KSB7CisgICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgZGVwZW5kZW50S2V5LCBm
dW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNwLnJlY29tcHV0ZU9uY2UuY2FsbCh0aGlzLCBwcm9w
ZXJ0eU5hbWUpOworICAgICAgICAgIH0pOworICAgICAgICB9LCB0aGlzKTsKICAgICAgIH0KLSAg
ICB9LnByb3BlcnR5KCkKLSAgfSk7Ci0gIGBgYAogCi0gIFVwZGF0ZXMgdG8gdGhlIHRoZSBwcm9w
ZXJ0eSBvZiBhbiBhdHRyaWJ1dGUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBhdXRvbWF0aWMKLSAg
dXBkYXRlIG9mIHRoZSAgSFRNTCBhdHRyaWJ1dGUgaW4gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1M
IHJlcHJlc2VudGF0aW9uLgorICAgICAgcmV0dXJuIHJlZHVjZUZ1bmMuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICB9OworICB9KSh0aGlzLmZ1bmMpOwogCi0gIGBhdHRyaWJ1dGVCaW5kaW5n
c2AgaXMgYSBjb25jYXRlbmF0ZWQgcHJvcGVydHkuIFNlZSBgRW1iZXIuT2JqZWN0YAotICBkb2N1
bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0
aWVzLgorICByZXR1cm4gdGhpczsKK30KK0VtYmVyLkFycmF5Q29tcHV0ZWRQcm9wZXJ0eSA9IEFy
cmF5Q29tcHV0ZWRQcm9wZXJ0eTsKK0FycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBv
X2NyZWF0ZShSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZSk7CitBcnJheUNvbXB1dGVk
UHJvcGVydHkucHJvdG90eXBlLmluaXRpYWxWYWx1ZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJu
IEVtYmVyLkEoKTsKK307CitBcnJheUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnJlc2V0VmFs
dWUgPSBmdW5jdGlvbiAoYXJyYXkpIHsKKyAgYXJyYXkuY2xlYXIoKTsKKyAgcmV0dXJuIGFycmF5
OworfTsKIAotICAjIyBUZW1wbGF0ZXMKKy8vIFRoaXMgaXMgYSBzdG9wZ2FwIHRvIGtlZXAgdGhl
IHJlZmVyZW5jZSBjb3VudHMgY29ycmVjdCB3aXRoIGxhenkgQ1BzLgorQXJyYXlDb21wdXRlZFBy
b3BlcnR5LnByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7Cisg
IHJldHVybjsKK307CiAKLSAgVGhlIEhUTUwgY29udGVudHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQg
cmVwcmVzZW50YXRpb24gYXJlIGRldGVybWluZWQgYnkgaXRzCi0gIHRlbXBsYXRlLiBUZW1wbGF0
ZXMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dAot
ICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5z
ZXJ0ZWQgd2l0aGluIHRoZQotICB2aWV3J3MgdGFnLiBNb3N0IHR5cGljYWxseSBpbiBFbWJlciB0
aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBjb21waWxlZAotICBgRW1iZXIuSGFuZGxlYmFyc2AgdGVt
cGxhdGUuCisvKioKKyAgQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG9wZXJhdGVz
IG9uIGRlcGVuZGVudCBhcnJheXMgYW5kCisgIGlzIHVwZGF0ZWQgd2l0aCAib25lIGF0IGEgdGlt
ZSIgc2VtYW50aWNzLiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCBvcgorICByZW1vdmVkIGZyb20gdGhl
IGRlcGVuZGVudCBhcnJheShzKSBhbiBhcnJheSBjb21wdXRlZCBvbmx5IG9wZXJhdGVzCisgIG9u
IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nIHRoZSBlbnRpcmUgYXJyYXkuIFRo
aXMgc2hvdWxkCisgIHJldHVybiBhbiBhcnJheSwgaWYgeW91J2QgbGlrZSB0byB1c2UgIm9uZSBh
dCBhIHRpbWUiIHNlbWFudGljcyBhbmQKKyAgY29tcHV0ZSBzb21lIHZhbHVlIG90aGVyIHRoZW4g
YW4gYXJyYXkgbG9vayBhdAorICBgRW1iZXIucmVkdWNlQ29tcHV0ZWRgLgogCi0gIGBgYGphdmFz
Y3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVy
LkhhbmRsZWJhcnMuY29tcGlsZSgnSSBhbSB0aGUgdGVtcGxhdGUnKQotICB9KTsKLSAgYGBgCisg
IElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50cyB0aGUgZmlyc3QgYXJndW1lbnRz
IGFyZQorICBjb25zaWRlcmVkIHRvIGJlIGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlzLiBUaGUgbGFz
dCBhcmd1bWVudCBpcworICByZXF1aXJlZCB0byBiZSBhbiBvcHRpb25zIG9iamVjdC4gVGhlIG9w
dGlvbnMgb2JqZWN0IGNhbiBoYXZlIHRoZQorICBmb2xsb3dpbmcgdGhyZWUgcHJvcGVydGllcy4K
IAotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50
YXRpb24gb2Y6CisgIGBpbml0aWFsaXplYCAtIEFuIG9wdGlvbmFsIGluaXRpYWxpemUgZnVuY3Rp
b24uIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAorICB0byBzZXQgdXAgc3RhdGUgb24gdGhl
IGluc3RhbmNlTWV0YSBvYmplY3QuCiAKLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNs
YXNzPSJlbWJlci12aWV3Ij5JIGFtIHRoZSB0ZW1wbGF0ZTwvZGl2PgotICBgYGAKKyAgYHJlbW92
ZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQg
aXMKKyAgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS4KIAotICBXaXRoaW4gYW4gRW1iZXIgYXBwbGlj
YXRpb24gaXMgbW9yZSBjb21tb24gdG8gZGVmaW5lIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgYXMK
LSAgcGFydCBvZiBhIHBhZ2U6CisgIGBhZGRlZEl0ZW1gIC0gQSBmdW5jdGlvbiB0aGF0IGlzIGNh
bGxlZCBlYWNoIHRpbWUgYW4gZWxlbWVudCBpcworICBhZGRlZCB0byB0aGUgYXJyYXkuCiAKLSAg
YGBgaHRtbAotICA8c2NyaXB0IHR5cGU9J3RleHQveC1oYW5kbGViYXJzJyBkYXRhLXRlbXBsYXRl
LW5hbWU9J3NvbWUtdGVtcGxhdGUnPgotICAgIEhlbGxvCi0gIDwvc2NyaXB0PgotICBgYGAKIAot
ICBBbmQgYXNzb2NpYXRlIGl0IGJ5IG5hbWUgdXNpbmcgYSB2aWV3J3MgYHRlbXBsYXRlTmFtZWAg
cHJvcGVydHk6CisgIFRoZSBgaW5pdGlhbGl6ZWAgZnVuY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcg
c2lnbmF0dXJlOgogCiAgIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVu
ZCh7Ci0gICAgdGVtcGxhdGVOYW1lOiAnc29tZS10ZW1wbGF0ZScKLSAgfSk7CisgICBmdW5jdGlv
biAoYXJyYXksIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKICAgYGBgCiAKLSAgVXNpbmcgYSB2
YWx1ZSBmb3IgYHRlbXBsYXRlTmFtZWAgdGhhdCBkb2VzIG5vdCBoYXZlIGEgSGFuZGxlYmFycyB0
ZW1wbGF0ZQotICB3aXRoIGEgbWF0Y2hpbmcgYGRhdGEtdGVtcGxhdGUtbmFtZWAgYXR0cmlidXRl
IHdpbGwgdGhyb3cgYW4gZXJyb3IuCisgIGBhcnJheWAgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0
aGUgYXJyYXlDb21wdXRlZCwgYW4gZW1wdHkgYXJyYXkuCiAKLSAgQXNzaWduaW5nIGEgdmFsdWUg
dG8gYm90aCBgdGVtcGxhdGVgIGFuZCBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0aWVzIHdpbGwgdGhy
b3cKLSAgYW4gZXJyb3IuCisgIGBjaGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250YWlu
cyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICBjb21wdXRlZC4gSXQgY29udGFpbnMgdGhl
IGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogCi0gIEZvciB2aWV3cyBjbGFzc2VzIHRoYXQgbWF5IGhh
dmUgYSB0ZW1wbGF0ZSBsYXRlciBkZWZpbmVkIChlLmcuIGFzIHRoZSBibG9jawotICBwb3J0aW9u
IG9mIGEgYHt7dmlld319YCBIYW5kbGViYXJzIGhlbHBlciBjYWxsIGluIGFub3RoZXIgdGVtcGxh
dGUgb3IgaW4KLSAgYSBzdWJjbGFzcyksIHlvdSBjYW4gcHJvdmlkZSBhIGBkZWZhdWx0VGVtcGxh
dGVgIHByb3BlcnR5IHNldCB0byBjb21waWxlZAotICB0ZW1wbGF0ZSBmdW5jdGlvbi4gSWYgYSB0
ZW1wbGF0ZSBpcyBub3QgbGF0ZXIgcHJvdmlkZWQgZm9yIHRoZSB2aWV3IGluc3RhbmNlCi0gIHRo
ZSBgZGVmYXVsdFRlbXBsYXRlYCB2YWx1ZSB3aWxsIGJlIHVzZWQ6CisgICAgIC0gYHByb3BlcnR5
YCB0aGUgY29tcHV0ZWQgcHJvcGVydHkKKyAgICAgLSBgcHJvcGVydHlOYW1lYCB0aGUgbmFtZSBv
ZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdAogCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IYW5kbGVi
YXJzLmNvbXBpbGUoJ0kgd2FzIHRoZSBkZWZhdWx0JyksCi0gICAgdGVtcGxhdGU6IG51bGwsCi0g
ICAgdGVtcGxhdGVOYW1lOiBudWxsCi0gIH0pOwotICBgYGAKKyAgYGluc3RhbmNlTWV0YWAgLSBB
biBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCisgIGluZm9ybWF0aW9uIG5l
ZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQorICB1bmlx
dWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0aW1lcyBh
IGdpdmVuCisgIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4KIAotICBX
aWxsIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgog
Ci0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMg
dGhlIGRlZmF1bHQ8L2Rpdj4KKyAgVGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRlZEl0ZW1gIGZ1
bmN0aW9ucyBib3RoIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisKKyAgYGBgamF2YXNj
cmlwdAorICBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5z
dGFuY2VNZXRhKQogICBgYGAKIAotICBJZiBhIGB0ZW1wbGF0ZWAgb3IgYHRlbXBsYXRlTmFtZWAg
aXMgcHJvdmlkZWQgaXQgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlcgotICBgZGVmYXVsdFRlbXBs
YXRlYDoKKyAgYGFjY3VtdWxhdGVkVmFsdWVgIC0gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhl
IGxhc3QgdGltZQorICBgcmVtb3ZlZEl0ZW1gIG9yIGBhZGRlZEl0ZW1gIHdhcyBjYWxsZWQgb3Ig
YW4gZW1wdHkgYXJyYXkuCiAKLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgn
SSB3YXMgdGhlIGRlZmF1bHQnKQotICB9KTsKKyAgYGl0ZW1gIC0gdGhlIGVsZW1lbnQgYWRkZWQg
b3IgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheQogCi0gIGFWaWV3ID0gQVZpZXcuY3JlYXRlKHsKLSAg
ICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdJIHdhcyB0aGUgdGVtcGxhdGUs
IG5vdCBkZWZhdWx0JykKLSAgfSk7Ci0gIGBgYAorICBgY2hhbmdlTWV0YWAgLSBBbiBvYmplY3Qg
d2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgY2hhbmdlLiBJdCBj
b250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAKLSAgV2lsbCByZXN1bHQgaW4gdGhl
IGZvbGxvd2luZyBIVE1MIHJlcHJlc2VudGF0aW9uIHdoZW4gcmVuZGVyZWQ6CisgICAgLSBgcHJv
cGVydHlgIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQorICAgIC0gYHByb3BlcnR5TmFtZWAgdGhlIG5h
bWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3QKKyAgICAtIGBpbmRleGAgdGhlIGluZGV4
IG9mIHRoZSBhZGRlZCBvciByZW1vdmVkIGl0ZW0KKyAgICAtIGBpdGVtYCB0aGUgYWRkZWQgb3Ig
cmVtb3ZlZCBpdGVtOiB0aGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKKyAgICAgIHRoZSBzZWNv
bmQgYXJnCisgICAgLSBgYXJyYXlDaGFuZ2VkYCB0aGUgYXJyYXkgdGhhdCB0cmlnZ2VyZWQgdGhl
IGNoYW5nZS4gQ2FuIGJlCisgICAgICB1c2VmdWwgd2hlbiBkZXBlbmRpbmcgb24gbXVsdGlwbGUg
YXJyYXlzLgogCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll
dyI+SSB3YXMgdGhlIHRlbXBsYXRlLCBub3QgZGVmYXVsdDwvZGl2PgotICBgYGAKKyAgRm9yIHBy
b3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVkIG9uIGFuIGl0ZW0gcHJvcGVydHkgY2hhbmdlICh3aGVu
CisgIGRlcEtleSBpcyBzb21ldGhpbmcgbGlrZSBgc29tZUFycmF5LkBlYWNoLnNvbWVQcm9wZXJ0
eWApLAorICBgY2hhbmdlTWV0YWAgd2lsbCBhbHNvIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9w
ZXJ0eToKIAotICAjIyBWaWV3IENvbnRleHQKKyAgICAtIGBwcmV2aW91c1ZhbHVlc2AgYW4gb2Jq
ZWN0IHdob3NlIGtleXMgYXJlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlZCBvbgorICAgIHRo
ZSBpdGVtLCBhbmQgd2hvc2UgdmFsdWVzIGFyZSB0aGUgaXRlbSdzIHByZXZpb3VzIHZhbHVlcy4K
IAotICBUaGUgZGVmYXVsdCBjb250ZXh0IG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBpcyB0aGUg
dmlldydzIGNvbnRyb2xsZXI6CisgIGBwcmV2aW91c1ZhbHVlc2AgaXMgaW1wb3J0YW50IEVtYmVy
IGNvYWxlc2NlcyBpdGVtIHByb3BlcnR5IGNoYW5nZXMgdmlhCisgIEVtYmVyLnJ1bi5vbmNlLiBU
aGlzIG1lYW5zIHRoYXQgYnkgdGhlIHRpbWUgcmVtb3ZlZEl0ZW0gZ2V0cyBjYWxsZWQsIGl0ZW0g
aGFzCisgIHRoZSBuZXcgdmFsdWVzLCBidXQgeW91IG1heSBuZWVkIHRoZSBwcmV2aW91cyB2YWx1
ZSAoZWcgZm9yIHNvcnRpbmcgJgorICBmaWx0ZXJpbmcpLgogCi0gIGBgYGphdmFzY3JpcHQKLSAg
QVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgnSGVsbG8ge3tleGNpdGVkR3JlZXRpbmd9fScpCi0gIH0pOworICBgaW5zdGFu
Y2VNZXRhYCAtIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIG1ldGEKKyAgaW5m
b3JtYXRpb24gbmVlZGVkIGZvciBjYWxjdWxhdGluZyB5b3VyIGNvbXB1dGVkLiBGb3IgZXhhbXBs
ZSBhCisgIHVuaXF1ZSBjb21wdXRlZCBtaWdodCB1c2UgdGhpcyB0byBzdG9yZSB0aGUgbnVtYmVy
IG9mIHRpbWVzIGEgZ2l2ZW4KKyAgZWxlbWVudCBpcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW50IGFy
cmF5LgogCi0gIGFDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgZmlyc3RO
YW1lOiAnQmFycnknLAotICAgIGV4Y2l0ZWRHcmVldGluZzogZnVuY3Rpb24oKXsKLSAgICAgIHJl
dHVybiB0aGlzLmdldCgiY29udGVudC5maXJzdE5hbWUiKSArICIhISEiCi0gICAgfS5wcm9wZXJ0
eSgpCi0gIH0pOworICBUaGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rpb25z
IHNob3VsZCByZXR1cm4gdGhlIGFjY3VtdWxhdGVkCisgIHZhbHVlLiBJdCBpcyBhY2NlcHRhYmxl
IHRvIG5vdCByZXR1cm4gYW55dGhpbmcgKGllIHJldHVybiB1bmRlZmluZWQpCisgIHRvIGludmFs
aWRhdGUgdGhlIGNvbXB1dGF0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgYSBnb29kIGlkZWEg
Zm9yCisgIGFycmF5Q29tcHV0ZWQgYnV0IGl0J3MgdXNlZCBpbiBlZyBtYXggYW5kIG1pbi4KIAot
ICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7Ci0gICAgY29udHJvbGxlcjogYUNvbnRyb2xsZXIsCi0g
IH0pOwotICBgYGAKKyAgRXhhbXBsZQogCi0gIFdpbGwgcmVzdWx0IGluIGFuIEhUTUwgcmVwcmVz
ZW50YXRpb24gb2Y6CisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuY29tcHV0ZWQubWFwID0gZnVu
Y3Rpb24oZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgeworICAgIHZhciBvcHRpb25zID0geworICAg
ICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VN
ZXRhKSB7CisgICAgICAgIHZhciBtYXBwZWQgPSBjYWxsYmFjayhpdGVtKTsKKyAgICAgICAgYXJy
YXkuaW5zZXJ0QXQoY2hhbmdlTWV0YS5pbmRleCwgbWFwcGVkKTsKKyAgICAgICAgcmV0dXJuIGFy
cmF5OworICAgICAgfSwKKyAgICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwg
Y2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICAgIGFycmF5LnJlbW92ZUF0KGNoYW5n
ZU1ldGEuaW5kZXgsIDEpOworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICB9CisgICAgfTsK
IAotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkhlbGxv
IEJhcnJ5ISEhPC9kaXY+CisgICAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50
S2V5LCBvcHRpb25zKTsKKyAgfTsKICAgYGBgCiAKLSAgQSBjb250ZXh0IGNhbiBhbHNvIGJlIGV4
cGxpY2l0bHkgc3VwcGxpZWQgdGhyb3VnaCB0aGUgdmlldydzIGBjb250ZXh0YAotICBwcm9wZXJ0
eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5vciBgY29udHJvbGxlcmAgcHJv
cGVydGllcywgdGhlCi0gIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQgd2lsbCBiZSB1c2VkLgorICBA
bWV0aG9kIGFycmF5Q29tcHV0ZWQKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gW2Rl
cGVuZGVudEtleXMqXQorICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fQorKi8KK0VtYmVyLmFycmF5Q29tcHV0ZWQgPSBmdW5jdGlvbiAo
b3B0aW9ucykgeworICB2YXIgYXJnczsKIAotICAjIyBMYXlvdXRzCisgIGlmIChhcmd1bWVudHMu
bGVuZ3RoID4gMSkgeworICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7
CisgICAgb3B0aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIC0xKVswXTsKKyAgfQogCi0g
IFZpZXdzIGNhbiBoYXZlIGEgc2Vjb25kYXJ5IHRlbXBsYXRlIHRoYXQgd3JhcHMgdGhlaXIgbWFp
biB0ZW1wbGF0ZS4gTGlrZQotICBwcmltYXJ5IHRlbXBsYXRlcywgbGF5b3V0cyBjYW4gYmUgYW55
IGZ1bmN0aW9uIHRoYXQgIGFjY2VwdHMgYW4gb3B0aW9uYWwKLSAgY29udGV4dCBwYXJhbWV0ZXIg
YW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW5zaWRl
Ci0gIHZpZXcncyB0YWcuIFZpZXdzIHdob3NlIEhUTUwgZWxlbWVudCBpcyBzZWxmIGNsb3Npbmcg
KGUuZy4gYDxpbnB1dCAvPmApCi0gIGNhbm5vdCBoYXZlIGEgbGF5b3V0IGFuZCB0aGlzIHByb3Bl
cnR5IHdpbGwgYmUgaWdub3JlZC4KKyAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAib2JqZWN0Iikg
eworICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiQXJyYXkgQ29tcHV0ZWQgUHJvcGVydHkgZGVj
bGFyZWQgd2l0aG91dCBhbiBvcHRpb25zIGhhc2giKTsKKyAgfQogCi0gIE1vc3QgdHlwaWNhbGx5
IGluIEVtYmVyIGEgbGF5b3V0IHdpbGwgYmUgYSBjb21waWxlZCBgRW1iZXIuSGFuZGxlYmFyc2AK
LSAgdGVtcGxhdGUuCisgIHZhciBjcCA9IG5ldyBBcnJheUNvbXB1dGVkUHJvcGVydHkob3B0aW9u
cyk7CiAKLSAgQSB2aWV3J3MgbGF5b3V0IGNhbiBiZSBzZXQgZGlyZWN0bHkgd2l0aCB0aGUgYGxh
eW91dGAgcHJvcGVydHkgb3IgcmVmZXJlbmNlCi0gIGFuIGV4aXN0aW5nIEhhbmRsZWJhcnMgdGVt
cGxhdGUgYnkgbmFtZSB3aXRoIHRoZSBgbGF5b3V0TmFtZWAgcHJvcGVydHkuCisgIGlmIChhcmdz
KSB7CisgICAgY3AucHJvcGVydHkuYXBwbHkoY3AsIGFyZ3MpOworICB9CiAKLSAgQSB0ZW1wbGF0
ZSB1c2VkIGFzIGEgbGF5b3V0IG11c3QgY29udGFpbiBhIHNpbmdsZSB1c2Ugb2YgdGhlIEhhbmRs
ZWJhcnMKLSAgYHt7eWllbGR9fWAgaGVscGVyLiBUaGUgSFRNTCBjb250ZW50cyBvZiBhIHZpZXcn
cyByZW5kZXJlZCBgdGVtcGxhdGVgIHdpbGwgYmUKLSAgaW5zZXJ0ZWQgYXQgdGhpcyBsb2NhdGlv
bjoKKyAgcmV0dXJuIGNwOworfTsKIAotICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3V2l0aExheW91
dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBsYXlvdXQ6IEVtYmVyLkhhbmRsZWJhcnMuY29t
cGlsZSgiPGRpdiBjbGFzcz0nbXktZGVjb3JhdGl2ZS1jbGFzcyc+e3t5aWVsZH19PC9kaXY+IikK
LSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJJIGdvdCB3cmFwcGVkIiks
Ci0gIH0pOwotICBgYGAKK30pKCk7CiAKLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMg
d2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgogCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0i
ZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBjbGFzcz0ibXktZGVjb3JhdGl2
ZS1jbGFzcyI+Ci0gICAgICBJIGdvdCB3cmFwcGVkCi0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBg
YGAKLQotICBTZWUgYEhhbmRsZWJhcnMuaGVscGVycy55aWVsZGAgZm9yIG1vcmUgaW5mb3JtYXRp
b24uCi0KLSAgIyMgUmVzcG9uZGluZyB0byBCcm93c2VyIEV2ZW50cwogCi0gIFZpZXdzIGNhbiBy
ZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBpbiBvbmUgb2YgdGhyZWUgd2F5czogbWV0
aG9kCi0gIGltcGxlbWVudGF0aW9uLCB0aHJvdWdoIGFuIGV2ZW50IG1hbmFnZXIsIGFuZCB0aHJv
dWdoIGB7e2FjdGlvbn19YCBoZWxwZXIgdXNlCi0gIGluIHRoZWlyIHRlbXBsYXRlIG9yIGxheW91
dC4KKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisqLwogCi0gICMjIyBNZXRob2QgSW1wbGVtZW50YXRpb24KK3ZhciBnZXQgPSBFbWJl
ci5nZXQsCisgICAgc2V0ID0gRW1iZXIuc2V0LAorICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9y
LAorICAgIG1lcmdlID0gRW1iZXIubWVyZ2UsCisgICAgYV9zbGljZSA9IFtdLnNsaWNlLAorICAg
IGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKKyAgICBtYXAgPSBFbWJl
ci5FbnVtZXJhYmxlVXRpbHMubWFwLAorICAgIFNlYXJjaFByb3h5OwogCi0gIFZpZXdzIGNhbiBy
ZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBieSBpbXBsZW1lbnRpbmcgYSBtZXRob2Qg
dGhhdAotICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3
aWxsIGJlIHBhc3NlZCBhcyB0aGUKLSAgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuCisvKioKKyAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1heGltdW0gdmFsdWUgaW4g
dGhlCisgIGRlcGVuZGVudCBhcnJheS4gVGhpcyB3aWxsIHJldHVybiBgLUluZmluaXR5YCB3aGVu
IHRoZSBkZXBlbmRlbnQKKyAgYXJyYXkgaXMgZW1wdHkuCiAKICAgYGBgamF2YXNjcmlwdAotICBB
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpewot
ICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNlJ3MKLSAgICAgIC8v
IHJlbmRlcmVkIGVsZW1lbnQgaXMgY2xpY2tlZAotICAgIH0KKyAgQXBwLlBlcnNvbiA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoeworICAgIGNoaWxkQWdlczogRW1iZXIuY29tcHV0ZWQubWFwQnkoJ2No
aWxkcmVuJywgJ2FnZScpLAorICAgIG1heENoaWxkQWdlOiBFbWJlci5jb21wdXRlZC5tYXgoJ2No
aWxkQWdlcycpCisgIH0pOworCisgIHZhciBsb3JkQnlyb24gPSBBcHAuUGVyc29uLmNyZWF0ZSh7
Y2hpbGRyZW46IFtdfSk7CisgIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIC1JbmZp
bml0eQorICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3QoeworICAgIG5hbWU6
ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFnZTogNwogICB9KTsKKyAgbG9yZEJ5cm9uLmdldCgnbWF4
Q2hpbGRBZ2UnKTsgLy8gNworICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3Rz
KFt7CisgICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgIGFnZTogNQorICB9LCB7CisgICAg
bmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgIGFnZTogOAorICB9XSk7CisgIGxv
cmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIDgKICAgYGBgCiAKLSAgIyMjIEV2ZW50IE1h
bmFnZXJzCisgIEBtZXRob2QgY29tcHV0ZWQubWF4CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtT
dHJpbmd9IGRlcGVuZGVudEtleQorICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBj
b21wdXRlcyB0aGUgbGFyZ2VzdCB2YWx1ZSBpbiB0aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyov
CitFbWJlci5jb21wdXRlZC5tYXggPSBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7CisgIHJldHVy
biBFbWJlci5yZWR1Y2VDb21wdXRlZC5jYWxsKG51bGwsIGRlcGVuZGVudEtleSwgeworICAgIGlu
aXRpYWxWYWx1ZTogLUluZmluaXR5LAogCi0gIFZpZXdzIGNhbiBkZWZpbmUgYW4gb2JqZWN0IGFz
IHRoZWlyIGBldmVudE1hbmFnZXJgIHByb3BlcnR5LiBUaGlzIG9iamVjdCBjYW4KLSAgdGhlbiBp
bXBsZW1lbnQgbWV0aG9kcyB0aGF0IG1hdGNoIHRoZSBkZXNpcmVkIGV2ZW50IG5hbWVzLiBNYXRj
aGluZyBldmVudHMKLSAgdGhhdCBvY2N1ciBvbiB0aGUgdmlldydzIHJlbmRlcmVkIEhUTUwgb3Ig
dGhlIHJlbmRlcmVkIEhUTUwgb2YgYW55IG9mIGl0cyBET00KLSAgZGVzY2VuZGFudHMgd2lsbCB0
cmlnZ2VyIHRoaXMgbWV0aG9kLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJlIHBhc3Nl
ZAotICBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1ldGhvZCBhbmQgYW4gIGBFbWJlci5W
aWV3YCBvYmplY3QgYXMgdGhlCi0gIHNlY29uZC4gVGhlIGBFbWJlci5WaWV3YCB3aWxsIGJlIHRo
ZSB2aWV3IHdob3NlIHJlbmRlcmVkIEhUTUwgd2FzIGludGVyYWN0ZWQKLSAgd2l0aC4gVGhpcyBt
YXkgYmUgdGhlIHZpZXcgd2l0aCB0aGUgYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgb3Igb25lIG9m
IGl0cwotICBkZXNjZW5kZW50IHZpZXdzLgorICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFjY3Vt
dWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgcmV0
dXJuIE1hdGgubWF4KGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0pOworICAgIH0sCiAKLSAgYGBgamF2
YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBldmVudE1hbmFnZXI6
IEVtYmVyLk9iamVjdC5jcmVhdGUoewotICAgICAgZG91YmxlQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50
LCB2aWV3KXsKLSAgICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNl
J3MKLSAgICAgICAgLy8gcmVuZGVyZWQgZWxlbWVudCBvciBhbnkgcmVuZGVyaW5nCi0gICAgICAg
IC8vIG9mIHRoaXMgdmlld3MncyBkZXNjZW5kZW50Ci0gICAgICAgIC8vIGVsZW1lbnRzIGlzIGNs
aWNrZWQKKyAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0s
IGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgaWYgKGl0ZW0gPCBhY2N1bXVsYXRl
ZFZhbHVlKSB7CisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZFZhbHVlOwogICAgICAgfQotICAg
IH0pCisgICAgfQogICB9KTsKLSAgYGBgCit9OwogCi0gIEFuIGV2ZW50IGRlZmluZWQgZm9yIGFu
IGV2ZW50IG1hbmFnZXIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZW50cyBvZiB0aGUKLSAgc2Ft
ZSBuYW1lIGhhbmRsZWQgdGhyb3VnaCBtZXRob2RzIG9uIHRoZSB2aWV3LgorLyoqCisgIEEgY29t
cHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZQor
ICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2lsbCByZXR1cm4gYEluZmluaXR5YCB3aGVuIHRoZSBk
ZXBlbmRlbnQKKyAgYXJyYXkgaXMgZW1wdHkuCiAKICAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCl7Ci0g
ICAgICAvLyB3aWxsIG5ldmVyIHRyaWdnZXIuCisgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKKyAgICBjaGlsZEFnZXM6IEVtYmVyLmNvbXB1dGVkLm1hcEJ5KCdjaGlsZHJlbics
ICdhZ2UnKSwKKyAgICBtaW5DaGlsZEFnZTogRW1iZXIuY29tcHV0ZWQubWluKCdjaGlsZEFnZXMn
KQorICB9KTsKKworICB2YXIgbG9yZEJ5cm9uID0gQXBwLlBlcnNvbi5jcmVhdGUoe2NoaWxkcmVu
OiBbXX0pOworICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScpOyAvLyBJbmZpbml0eQorICBs
b3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3QoeworICAgIG5hbWU6ICdBdWd1c3Rh
IEFkYSBCeXJvbicsIGFnZTogNworICB9KTsKKyAgbG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRBZ2Un
KTsgLy8gNworICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7CisgICAg
bmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgIGFnZTogNQorICB9LCB7CisgICAgbmFtZTogJ0Vs
aXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgIGFnZTogOAorICB9XSk7CisgIGxvcmRCeXJvbi5n
ZXQoJ21pbkNoaWxkQWdlJyk7IC8vIDUKKyAgYGBgCisKKyAgQG1ldGhvZCBjb21wdXRlZC5taW4K
KyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiB0
aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyovCitFbWJlci5jb21wdXRlZC5taW4gPSBmdW5jdGlv
biAoZGVwZW5kZW50S2V5KSB7CisgIHJldHVybiBFbWJlci5yZWR1Y2VDb21wdXRlZC5jYWxsKG51
bGwsIGRlcGVuZGVudEtleSwgeworICAgIGluaXRpYWxWYWx1ZTogSW5maW5pdHksCisKKyAgICBh
ZGRlZEl0ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBp
bnN0YW5jZU1ldGEpIHsKKyAgICAgIHJldHVybiBNYXRoLm1pbihhY2N1bXVsYXRlZFZhbHVlLCBp
dGVtKTsKICAgICB9LAotICAgIGV2ZW50TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0g
ICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCwgdmlldyl7Ci0gICAgICAgIC8vIHRha2Vz
IHByZXNlZGVuY2Ugb3ZlciBBVmlldyNtb3VzZUVudGVyCisKKyAgICByZW1vdmVkSXRlbTogZnVu
Y3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkg
eworICAgICAgaWYgKGl0ZW0gPiBhY2N1bXVsYXRlZFZhbHVlKSB7CisgICAgICAgIHJldHVybiBh
Y2N1bXVsYXRlZFZhbHVlOwogICAgICAgfQotICAgIH0pCisgICAgfQogICB9KTsKK307CisKKy8q
KgorICBSZXR1cm5zIGFuIGFycmF5IG1hcHBlZCB2aWEgdGhlIGNhbGxiYWNrCisKKyAgVGhlIGNh
bGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h
dHVyZS4KKyAgYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKwor
ICBgYGBqYXZhc2NyaXB0CisgIGZ1bmN0aW9uKGl0ZW0pOwogICBgYGAKIAotICBTaW1pbGFybHkg
YSB2aWV3J3MgZXZlbnQgbWFuYWdlciB3aWxsIHRha2UgcHJlY2VkZW5jZSBmb3IgZXZlbnRzIG9m
IGFueSB2aWV3cwotICByZW5kZXJlZCBhcyBhIGRlc2NlbmRlbnQuIEEgbWV0aG9kIG5hbWUgdGhh
dCBtYXRjaGVzIGFuIGV2ZW50IG5hbWUgd2lsbCBub3QKLSAgYmUgY2FsbGVkIGlmIHRoZSB2aWV3
IGluc3RhbmNlIHdhcyByZW5kZXJlZCBpbnNpZGUgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YK
LSAgYSB2aWV3IHRoYXQgaGFzIGFuIGBldmVudE1hbmFnZXJgIHByb3BlcnR5IGRlZmluZWQgdGhh
dCBoYW5kbGVzIGV2ZW50cyBvZiB0aGUKLSAgbmFtZS4gRXZlbnRzIG5vdCBoYW5kbGVkIGJ5IHRo
ZSBldmVudCBtYW5hZ2VyIHdpbGwgc3RpbGwgdHJpZ2dlciBtZXRob2QgY2FsbHMKLSAgb24gdGhl
IGRlc2NlbmRlbnQuCisgIEV4YW1wbGUKIAogICBgYGBqYXZhc2NyaXB0Ci0gIE91dGVyVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJvdXRlciB7eyN2aWV3IElubmVyVmlld319aW5uZXJ7ey92aWV3fX0gb3V0ZXIiKSwKLSAg
ICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoewotICAgICAgbW91c2VFbnRlcjog
ZnVuY3Rpb24oZXZlbnQsIHZpZXcpewotICAgICAgICAvLyB2aWV3IG1pZ2h0IGJlIGluc3RhbmNl
IG9mIGVpdGhlcgotICAgICAgICAvLyBPdXRzaWRlVmlldyBvciBJbm5lclZpZXcgZGVwZW5kaW5n
IG9uCi0gICAgICAgIC8vIHdoZXJlIG9uIHRoZSBwYWdlIHRoZSB1c2VyIGludGVyYWN0aW9uIG9j
Y3VyZWQKLSAgICAgIH0KKyAgQXBwLkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAg
ICBleGNpdGluZ0Nob3JlczogRW1iZXIuY29tcHV0ZWQubWFwKCdjaG9yZXMnLCBmdW5jdGlvbihj
aG9yZSkgeworICAgICAgcmV0dXJuIGNob3JlLnRvVXBwZXJDYXNlKCkgKyAnISc7CiAgICAgfSkK
ICAgfSk7CiAKLSAgSW5uZXJWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsaWNrOiBm
dW5jdGlvbihldmVudCl7Ci0gICAgICAvLyB3aWxsIGJlIGNhbGxlZCBpZiByZW5kZXJlZCBpbnNp
ZGUKLSAgICAgIC8vIGFuIE91dGVyVmlldyBiZWNhdXNlIE91dGVyVmlldydzCi0gICAgICAvLyBl
dmVudE1hbmFnZXIgZG9lc24ndCBoYW5kbGUgY2xpY2sgZXZlbnRzCi0gICAgfSwKLSAgICBtb3Vz
ZUVudGVyOiBmdW5jdGlvbihldmVudCl7Ci0gICAgICAvLyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBp
ZiByZW5kZXJlZCBpbnNpZGUKLSAgICAgIC8vIGFuIE91dGVyVmlldy4KLSAgICB9CisgIHZhciBo
YW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHsKKyAgICBjaG9yZXM6IFsnY2xlYW4nLCAnd3Jp
dGUgbW9yZSB1bml0IHRlc3RzJ10KICAgfSk7CisgIGhhbXN0ZXIuZ2V0KCdleGNpdGluZ0Nob3Jl
cycpOyAvLyBbJ0NMRUFOIScsICdXUklURSBNT1JFIFVOSVQgVEVTVFMhJ10KICAgYGBgCiAKLSAg
IyMjIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1gIEhlbHBlcgotCi0gIFNlZSBgSGFuZGxlYmFycy5o
ZWxwZXJzLmFjdGlvbmAuCisgIEBtZXRob2QgY29tcHV0ZWQubWFwCisgIEBmb3IgRW1iZXIKKyAg
QHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFj
aworICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBwZWQgdmlh
IHRoZSBjYWxsYmFjaworKi8KK0VtYmVyLmNvbXB1dGVkLm1hcCA9IGZ1bmN0aW9uKGRlcGVuZGVu
dEtleSwgY2FsbGJhY2spIHsKKyAgdmFyIG9wdGlvbnMgPSB7CisgICAgYWRkZWRJdGVtOiBmdW5j
dGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICB2YXIg
bWFwcGVkID0gY2FsbGJhY2suY2FsbCh0aGlzLCBpdGVtKTsKKyAgICAgIGFycmF5Lmluc2VydEF0
KGNoYW5nZU1ldGEuaW5kZXgsIG1hcHBlZCk7CisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSwK
KyAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3Rh
bmNlTWV0YSkgeworICAgICAgYXJyYXkucmVtb3ZlQXQoY2hhbmdlTWV0YS5pbmRleCwgMSk7Cisg
ICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorICB9OwogCi0gICMjIyBFdmVudCBOYW1lcworICBy
ZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZChkZXBlbmRlbnRLZXksIG9wdGlvbnMpOworfTsKIAot
ICBQb3NzaWJsZSBldmVudHMgbmFtZXMgZm9yIGFueSBvZiB0aGUgcmVzcG9uZGluZyBhcHByb2Fj
aGVzIGRlc2NyaWJlZCBhYm92ZQotICBhcmU6CisvKioKKyAgUmV0dXJucyBhbiBhcnJheSBtYXBw
ZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCiAKLSAgVG91Y2ggZXZlbnRzOgorICBgYGBqYXZhc2Ny
aXB0CisgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICBjaGlsZEFnZXM6
IEVtYmVyLmNvbXB1dGVkLm1hcEJ5KCdjaGlsZHJlbicsICdhZ2UnKQorICB9KTsKIAotICAqIGB0
b3VjaFN0YXJ0YAotICAqIGB0b3VjaE1vdmVgCi0gICogYHRvdWNoRW5kYAotICAqIGB0b3VjaENh
bmNlbGAKKyAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjogW119
KTsKKyAgbG9yZEJ5cm9uLmdldCgnY2hpbGRBZ2VzJyk7IC8vIFtdCisgIGxvcmRCeXJvbi5nZXQo
J2NoaWxkcmVuJykucHVzaE9iamVjdCh7bmFtZTogJ0F1Z3VzdGEgQWRhIEJ5cm9uJywgYWdlOiA3
fSk7CisgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbN10KKyAgbG9yZEJ5cm9uLmdl
dCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbeworICAgIG5hbWU6ICdBbGxlZ3JhIEJ5cm9uJywK
KyAgICBhZ2U6IDUKKyAgfSwgeworICAgIG5hbWU6ICdFbGl6YWJldGggTWVkb3JhIExlaWdoJywK
KyAgICBhZ2U6IDgKKyAgfV0pOworICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsgLy8gWzcs
IDUsIDhdCisgIGBgYAogCi0gIEtleWJvYXJkIGV2ZW50cworICBAbWV0aG9kIGNvbXB1dGVkLm1h
cEJ5CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICBAcGFy
YW0ge1N0cmluZ30gcHJvcGVydHlLZXkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0
eX0gYW4gYXJyYXkgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5CisqLworRW1iZXIuY29tcHV0
ZWQubWFwQnkgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHByb3BlcnR5S2V5KSB7CisgIHZhciBj
YWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGdldChpdGVtLCBwcm9wZXJ0eUtleSk7
IH07CisgIHJldHVybiBFbWJlci5jb21wdXRlZC5tYXAoZGVwZW5kZW50S2V5ICsgJy5AZWFjaC4n
ICsgcHJvcGVydHlLZXksIGNhbGxiYWNrKTsKK307CiAKLSAgKiBga2V5RG93bmAKLSAgKiBga2V5
VXBgCi0gICogYGtleVByZXNzYAorLyoqCisgIEBtZXRob2QgY29tcHV0ZWQubWFwUHJvcGVydHkK
KyAgQGZvciBFbWJlcgorICBAZGVwcmVjYXRlZCBVc2UgYEVtYmVyLmNvbXB1dGVkLm1hcEJ5YCBp
bnN0ZWFkCisgIEBwYXJhbSBkZXBlbmRlbnRLZXkKKyAgQHBhcmFtIHByb3BlcnR5S2V5CisqLwor
RW1iZXIuY29tcHV0ZWQubWFwUHJvcGVydHkgPSBFbWJlci5jb21wdXRlZC5tYXBCeTsKIAotICBN
b3VzZSBldmVudHMKKy8qKgorICBGaWx0ZXJzIHRoZSBhcnJheSBieSB0aGUgY2FsbGJhY2suCiAK
LSAgKiBgbW91c2VEb3duYAotICAqIGBtb3VzZVVwYAotICAqIGBjb250ZXh0TWVudWAKLSAgKiBg
Y2xpY2tgCi0gICogYGRvdWJsZUNsaWNrYAotICAqIGBtb3VzZU1vdmVgCi0gICogYGZvY3VzSW5g
Ci0gICogYGZvY3VzT3V0YAotICAqIGBtb3VzZUVudGVyYAotICAqIGBtb3VzZUxlYXZlYAorICBU
aGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcg
c2lnbmF0dXJlLgorICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9u
LgogCi0gIEZvcm0gZXZlbnRzOiAKKyAgYGBgamF2YXNjcmlwdAorICBmdW5jdGlvbihpdGVtKTsK
KyAgYGBgCiAKLSAgKiBgc3VibWl0YAotICAqIGBjaGFuZ2VgCi0gICogYGZvY3VzSW5gCi0gICog
YGZvY3VzT3V0YAotICAqIGBpbnB1dGAKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuSGFtc3RlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIHJlbWFpbmluZ0Nob3JlczogRW1iZXIuY29tcHV0
ZWQuZmlsdGVyKCdjaG9yZXMnLCBmdW5jdGlvbihjaG9yZSkgeworICAgICAgcmV0dXJuICFjaG9y
ZS5kb25lOworICAgIH0pCisgIH0pOwogCi0gIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOiAK
KyAgdmFyIGhhbXN0ZXIgPSBBcHAuSGFtc3Rlci5jcmVhdGUoe2Nob3JlczogWworICAgIHtuYW1l
OiAnY29vaycsIGRvbmU6IHRydWV9LAorICAgIHtuYW1lOiAnY2xlYW4nLCBkb25lOiB0cnVlfSwK
KyAgICB7bmFtZTogJ3dyaXRlIG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6IGZhbHNlfQorICBdfSk7
CisgIGhhbXN0ZXIuZ2V0KCdyZW1haW5pbmdDaG9yZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9y
ZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2V9XQorICBgYGAKIAotICAqIGBkcmFnU3RhcnRgCi0g
ICogYGRyYWdgCi0gICogYGRyYWdFbnRlcmAKLSAgKiBgZHJhZ0xlYXZlYAotICAqIGBkcm9wYAot
ICAqIGBkcmFnRW5kYAorICBAbWV0aG9kIGNvbXB1dGVkLmZpbHRlcgorICBAZm9yIEVtYmVyCisg
IEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJh
Y2sKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gdGhlIGZpbHRlcmVkIGFycmF5
CisqLworRW1iZXIuY29tcHV0ZWQuZmlsdGVyID0gZnVuY3Rpb24oZGVwZW5kZW50S2V5LCBjYWxs
YmFjaykgeworICB2YXIgb3B0aW9ucyA9IHsKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAoYXJy
YXksIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgaW5zdGFuY2VNZXRhLmZpbHRl
cmVkQXJyYXlJbmRleGVzID0gbmV3IEVtYmVyLlN1YkFycmF5KCk7CisgICAgfSwKIAotICAjIyBI
YW5kbGViYXJzIGB7e3ZpZXd9fWAgSGVscGVyCisgICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJh
eSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICB2YXIgbWF0Y2ggPSAh
IWNhbGxiYWNrLmNhbGwodGhpcywgaXRlbSksCisgICAgICAgICAgZmlsdGVySW5kZXggPSBpbnN0
YW5jZU1ldGEuZmlsdGVyZWRBcnJheUluZGV4ZXMuYWRkSXRlbShjaGFuZ2VNZXRhLmluZGV4LCBt
YXRjaCk7CiAKLSAgT3RoZXIgYEVtYmVyLlZpZXdgIGluc3RhbmNlcyBjYW4gYmUgaW5jbHVkZWQg
YXMgcGFydCBvZiBhIHZpZXcncyB0ZW1wbGF0ZSBieQotICB1c2luZyB0aGUgYHt7dmlld319YCBI
YW5kbGViYXJzIGhlbHBlci4gU2VlIGBIYW5kbGViYXJzLmhlbHBlcnMudmlld2AgZm9yCi0gIGFk
ZGl0aW9uYWwgaW5mb3JtYXRpb24uCisgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgYXJyYXku
aW5zZXJ0QXQoZmlsdGVySW5kZXgsIGl0ZW0pOworICAgICAgfQogCi0gIEBjbGFzcyBWaWV3Ci0g
IEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVy
LkV2ZW50ZWQKLSovCi1FbWJlci5WaWV3ID0gRW1iZXIuQ29yZVZpZXcuZXh0ZW5kKAotLyoqIEBz
Y29wZSBFbWJlci5WaWV3LnByb3RvdHlwZSAqLyB7CisgICAgICByZXR1cm4gYXJyYXk7CisgICAg
fSwKIAotICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBbJ2NsYXNzTmFtZXMnLCAnY2xhc3NOYW1l
QmluZGluZ3MnLCAnYXR0cmlidXRlQmluZGluZ3MnXSwKKyAgICByZW1vdmVkSXRlbTogZnVuY3Rp
b24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgdmFyIGZp
bHRlckluZGV4ID0gaW5zdGFuY2VNZXRhLmZpbHRlcmVkQXJyYXlJbmRleGVzLnJlbW92ZUl0ZW0o
Y2hhbmdlTWV0YS5pbmRleCk7CiAKLSAgLyoqCi0gICAgQHByb3BlcnR5IGlzVmlldwotICAgIEB0
eXBlIEJvb2xlYW4KLSAgICBAZGVmYXVsdCB0cnVlCi0gICAgQGZpbmFsCi0gICovCi0gIGlzVmll
dzogdHJ1ZSwKKyAgICAgIGlmIChmaWx0ZXJJbmRleCA+IC0xKSB7CisgICAgICAgIGFycmF5LnJl
bW92ZUF0KGZpbHRlckluZGV4KTsKKyAgICAgIH0KIAotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIFRFTVBMQVRFIFNV
UFBPUlQKLSAgLy8KKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisgIH07CiAKLSAgLyoqCi0g
ICAgVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIGxvb2t1cCBpZiBubyB0ZW1wbGF0ZSBpcyBw
cm92aWRlZC4KKyAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50S2V5LCBvcHRp
b25zKTsKK307CiAKLSAgICBgRW1iZXIuVmlld2Agd2lsbCBsb29rIGZvciBhIHRlbXBsYXRlIHdp
dGggdGhpcyBuYW1lIGluIHRoaXMgdmlldydzCi0gICAgYHRlbXBsYXRlc2Agb2JqZWN0LiBCeSBk
ZWZhdWx0LCB0aGlzIHdpbGwgYmUgYSBnbG9iYWwgb2JqZWN0Ci0gICAgc2hhcmVkIGluIGBFbWJl
ci5URU1QTEFURVNgLgorLyoqCisgIEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBwcm9wZXJ0eSBh
bmQgdmFsdWUKIAotICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZU5hbWUKLSAgICBAdHlwZSBTdHJpbmcK
LSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHRlbXBsYXRlTmFtZTogbnVsbCwKKyAgYGBgamF2
YXNjcmlwdAorICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgIHJlbWFp
bmluZ0Nob3JlczogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ2Nob3JlcycsICdkb25lJywgZmFs
c2UpCisgIH0pOwogCi0gIC8qKgotICAgIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgdG8gbG9va3Vw
IGlmIG5vIGxheW91dCBpcyBwcm92aWRlZC4KKyAgdmFyIGhhbXN0ZXIgPSBBcHAuSGFtc3Rlci5j
cmVhdGUoe2Nob3JlczogWworICAgIHtuYW1lOiAnY29vaycsIGRvbmU6IHRydWV9LAorICAgIHtu
YW1lOiAnY2xlYW4nLCBkb25lOiB0cnVlfSwKKyAgICB7bmFtZTogJ3dyaXRlIG1vcmUgdW5pdCB0
ZXN0cycsIGRvbmU6IGZhbHNlfQorICBdfSk7CisgIGhhbXN0ZXIuZ2V0KCdyZW1haW5pbmdDaG9y
ZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2V9XQor
ICBgYGAKIAotICAgIGBFbWJlci5WaWV3YCB3aWxsIGxvb2sgZm9yIGEgdGVtcGxhdGUgd2l0aCB0
aGlzIG5hbWUgaW4gdGhpcyB2aWV3J3MKLSAgICBgdGVtcGxhdGVzYCBvYmplY3QuIEJ5IGRlZmF1
bHQsIHRoaXMgd2lsbCBiZSBhIGdsb2JhbCBvYmplY3QKLSAgICBzaGFyZWQgaW4gYEVtYmVyLlRF
TVBMQVRFU2AuCisgIEBtZXRob2QgY29tcHV0ZWQuZmlsdGVyQnkKKyAgQGZvciBFbWJlcgorICBA
cGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtl
eQorICBAcGFyYW0ge1N0cmluZ30gdmFsdWUKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9w
ZXJ0eX0gdGhlIGZpbHRlcmVkIGFycmF5CisqLworRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkgPSBm
dW5jdGlvbihkZXBlbmRlbnRLZXksIHByb3BlcnR5S2V5LCB2YWx1ZSkgeworICB2YXIgY2FsbGJh
Y2s7CiAKLSAgICBAcHJvcGVydHkgbGF5b3V0TmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBk
ZWZhdWx0IG51bGwKLSAgKi8KLSAgbGF5b3V0TmFtZTogbnVsbCwKKyAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggPT09IDIpIHsKKyAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgIHJl
dHVybiBnZXQoaXRlbSwgcHJvcGVydHlLZXkpOworICAgIH07CisgIH0gZWxzZSB7CisgICAgY2Fs
bGJhY2sgPSBmdW5jdGlvbihpdGVtKSB7CisgICAgICByZXR1cm4gZ2V0KGl0ZW0sIHByb3BlcnR5
S2V5KSA9PT0gdmFsdWU7CisgICAgfTsKKyAgfQogCi0gIC8qKgotICAgIFRoZSBoYXNoIGluIHdo
aWNoIHRvIGxvb2sgZm9yIGB0ZW1wbGF0ZU5hbWVgLgorICByZXR1cm4gRW1iZXIuY29tcHV0ZWQu
ZmlsdGVyKGRlcGVuZGVudEtleSArICcuQGVhY2guJyArIHByb3BlcnR5S2V5LCBjYWxsYmFjayk7
Cit9OwogCi0gICAgQHByb3BlcnR5IHRlbXBsYXRlcwotICAgIEB0eXBlIEVtYmVyLk9iamVjdAot
ICAgIEBkZWZhdWx0IEVtYmVyLlRFTVBMQVRFUwotICAqLwotICB0ZW1wbGF0ZXM6IEVtYmVyLlRF
TVBMQVRFUywKKy8qKgorICBAbWV0aG9kIGNvbXB1dGVkLmZpbHRlclByb3BlcnR5CisgIEBmb3Ig
RW1iZXIKKyAgQHBhcmFtIGRlcGVuZGVudEtleQorICBAcGFyYW0gcHJvcGVydHlLZXkKKyAgQHBh
cmFtIHZhbHVlCisgIEBkZXByZWNhdGVkIFVzZSBgRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnlgIGlu
c3RlYWQKKyovCitFbWJlci5jb21wdXRlZC5maWx0ZXJQcm9wZXJ0eSA9IEVtYmVyLmNvbXB1dGVk
LmZpbHRlckJ5OwogCi0gIC8qKgotICAgIFRoZSB0ZW1wbGF0ZSB1c2VkIHRvIHJlbmRlciB0aGUg
dmlldy4gVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0Ci0gICAgYWNjZXB0cyBhbiBvcHRp
b25hbCBjb250ZXh0IHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIHN0cmluZyBvZiBIVE1MIHRoYXQK
LSAgICB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERPTSByZWxhdGl2ZSB0byBpdHMgcGFyZW50
IHZpZXcuCisvKioKKyAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFy
cmF5IHdpdGggYWxsIHRoZSB1bmlxdWUKKyAgZWxlbWVudHMgZnJvbSBvbmUgb3IgbW9yZSBkZXBl
bmRlbnQgYXJyYXlzLgogCi0gICAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBzZXQgdGhlIGB0ZW1w
bGF0ZU5hbWVgIHByb3BlcnR5IGluc3RlYWQgb2Ygc2V0dGluZwotICAgIHRoZSB0ZW1wbGF0ZSB5
b3Vyc2VsZi4KKyAgRXhhbXBsZQogCi0gICAgQHByb3BlcnR5IHRlbXBsYXRlCi0gICAgQHR5cGUg
RnVuY3Rpb24KLSAgKi8KLSAgdGVtcGxhdGU6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwg
dmFsdWUpIHsKLSAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdmFsdWU7IH0K
KyAgYGBgamF2YXNjcmlwdAorICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgIHVuaXF1ZUZydWl0czogRW1iZXIuY29tcHV0ZWQudW5pcSgnZnJ1aXRzJykKKyAgfSk7CiAK
LSAgICB2YXIgdGVtcGxhdGVOYW1lID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwKLSAgICAg
ICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0ZW1wbGF0
ZScpOworICB2YXIgaGFtc3RlciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7ZnJ1aXRzOiBbCisgICAg
J2JhbmFuYScsCisgICAgJ2dyYXBlJywKKyAgICAna2FsZScsCisgICAgJ2JhbmFuYScKKyAgXX0p
OworICBoYW1zdGVyLmdldCgndW5pcXVlRnJ1aXRzJyk7IC8vIFsnYmFuYW5hJywgJ2dyYXBlJywg
J2thbGUnXQorICBgYGAKIAotICAgIEVtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCB0aGUgdGVt
cGxhdGVOYW1lICIgKyB0ZW1wbGF0ZU5hbWUgKyAiIGZvciAiICsgdGhpcyArICIsIGJ1dCBpdCBk
aWQgbm90IGV4aXN0LiIsICF0ZW1wbGF0ZU5hbWUgfHwgdGVtcGxhdGUpOworICBAbWV0aG9kIGNv
bXB1dGVkLnVuaXEKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlLZXkq
CisgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IGFycmF5
IHdpdGggYWxsIHRoZQorICB1bmlxdWUgZWxlbWVudHMgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5
CisqLworRW1iZXIuY29tcHV0ZWQudW5pcSA9IGZ1bmN0aW9uKCkgeworICB2YXIgYXJncyA9IGFf
c2xpY2UuY2FsbChhcmd1bWVudHMpOworICBhcmdzLnB1c2goeworICAgIGluaXRpYWxpemU6IGZ1
bmN0aW9uKGFycmF5LCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKKyAgICAgIGluc3RhbmNl
TWV0YS5pdGVtQ291bnRzID0ge307CisgICAgfSwKIAotICAgIHJldHVybiB0ZW1wbGF0ZSB8fCBn
ZXQodGhpcywgJ2RlZmF1bHRUZW1wbGF0ZScpOwotICB9KS5wcm9wZXJ0eSgndGVtcGxhdGVOYW1l
JyksCisgICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5z
dGFuY2VNZXRhKSB7CisgICAgICB2YXIgZ3VpZCA9IGd1aWRGb3IoaXRlbSk7CiAKLSAgY29udGFp
bmVyOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50VmlldyA9IGdl
dCh0aGlzLCAnX3BhcmVudFZpZXcnKTsKKyAgICAgIGlmICghaW5zdGFuY2VNZXRhLml0ZW1Db3Vu
dHNbZ3VpZF0pIHsKKyAgICAgICAgaW5zdGFuY2VNZXRhLml0ZW1Db3VudHNbZ3VpZF0gPSAxOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytpbnN0YW5jZU1ldGEuaXRlbUNvdW50c1tndWlkXTsK
KyAgICAgIH0KKyAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKKyAgICAgIHJldHVybiBhcnJh
eTsKKyAgICB9LAorICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgXywgaW5z
dGFuY2VNZXRhKSB7CisgICAgICB2YXIgZ3VpZCA9IGd1aWRGb3IoaXRlbSksCisgICAgICAgICAg
aXRlbUNvdW50cyA9IGluc3RhbmNlTWV0YS5pdGVtQ291bnRzOwogCi0gICAgaWYgKHBhcmVudFZp
ZXcpIHsgcmV0dXJuIGdldChwYXJlbnRWaWV3LCAnY29udGFpbmVyJyk7IH0KKyAgICAgIGlmICgt
LWl0ZW1Db3VudHNbZ3VpZF0gPT09IDApIHsKKyAgICAgICAgYXJyYXkucmVtb3ZlT2JqZWN0KGl0
ZW0pOworICAgICAgfQorICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKyAgfSk7CisgIHJldHVy
biBFbWJlci5hcnJheUNvbXB1dGVkLmFwcGx5KG51bGwsIGFyZ3MpOworfTsKIAotICAgIHJldHVy
biBFbWJlci5Db250YWluZXIgJiYgRW1iZXIuQ29udGFpbmVyLmRlZmF1bHRDb250YWluZXI7Ci0g
IH0pLAorLyoqCisgIEFsaWFzIGZvciBbRW1iZXIuY29tcHV0ZWQudW5pcV0oL2FwaS8jbWV0aG9k
X2NvbXB1dGVkX3VuaXEpLgogCi0gIC8qKgotICAgIFRoZSBjb250cm9sbGVyIG1hbmFnaW5nIHRo
aXMgdmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgYmUKLSAgICBtYWRlIGF2
YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSB0ZW1wbGF0ZS4KKyAgQG1ldGhvZCBjb21wdXRlZC51bmlv
bgorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtleSoKKyAgQHJldHVy
biB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwg
dGhlCisgIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKKyovCitFbWJl
ci5jb21wdXRlZC51bmlvbiA9IEVtYmVyLmNvbXB1dGVkLnVuaXE7CiAKLSAgICBAcHJvcGVydHkg
Y29udHJvbGxlcgotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBjb250cm9sbGVyOiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgcGFyZW50VmlldyA9IGdldCh0aGlzLCAn
X3BhcmVudFZpZXcnKTsKLSAgICByZXR1cm4gcGFyZW50VmlldyA/IGdldChwYXJlbnRWaWV3LCAn
Y29udHJvbGxlcicpIDogbnVsbDsKLSAgfSkucHJvcGVydHkoJ19wYXJlbnRWaWV3JyksCisvKioK
KyAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggYWxs
IHRoZSBkdXBsaWNhdGVkCisgIGVsZW1lbnRzIGZyb20gdHdvIG9yIG1vcmUgZGVwZW5kZW55IGFy
cmF5cy4KIAotICAvKioKLSAgICBBIHZpZXcgbWF5IGNvbnRhaW4gYSBsYXlvdXQuIEEgbGF5b3V0
IGlzIGEgcmVndWxhciB0ZW1wbGF0ZSBidXQKLSAgICBzdXBlcnNlZGVzIHRoZSBgdGVtcGxhdGVg
IHByb3BlcnR5IGR1cmluZyByZW5kZXJpbmcuIEl0IGlzIHRoZQotICAgIHJlc3BvbnNpYmlsaXR5
IG9mIHRoZSBsYXlvdXQgdGVtcGxhdGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBw
cm9wZXJ0eSBmcm9tIHRoZSB2aWV3IChvciBhbHRlcm5hdGl2ZWx5LCBjYWxsIGBIYW5kbGViYXJz
LmhlbHBlcnMueWllbGRgLAotICAgIGB7e3lpZWxkfX1gKSB0byByZW5kZXIgaXQgaW4gdGhlIGNv
cnJlY3QgbG9jYXRpb24uCisgIEV4YW1wbGUKIAotICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZp
ZXcgdGhhdCBoYXMgYSBzaGFyZWQgd3JhcHBlciwgYnV0IHdoaWNoIGRlbGVnYXRlcwotICAgIHRo
ZSByZW5kZXJpbmcgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSB3cmFwcGVyIHRvIHRoZSBgdGVtcGxh
dGVgIHByb3BlcnR5Ci0gICAgb24gYSBzdWJjbGFzcy4KKyAgYGBgamF2YXNjcmlwdAorICB2YXIg
b2JqID0gRW1iZXIuT2JqZWN0LmNyZWF0ZVdpdGhNaXhpbnMoeworICAgIGFkYUZyaWVuZHM6IFsn
Q2hhcmxlcyBCYWJiYWdlJywgJ0pvaG4gSG9iaG91c2UnLCAnV2lsbGlhbSBLaW5nJywgJ01hcnkg
U29tZXJ2aWxsZSddLAorICAgIGNoYXJsZXNGcmllbmRzOiBbJ1dpbGxpYW0gS2luZycsICdNYXJ5
IFNvbWVydmlsbGUnLCAnQWRhIExvdmVsYWNlJywgJ0dlb3JnZSBQZWFjb2NrJ10sCisgICAgZnJp
ZW5kc0luQ29tbW9uOiBFbWJlci5jb21wdXRlZC5pbnRlcnNlY3QoJ2FkYUZyaWVuZHMnLCAnY2hh
cmxlc0ZyaWVuZHMnKQorICB9KTsKIAotICAgIEBwcm9wZXJ0eSBsYXlvdXQKLSAgICBAdHlwZSBG
dW5jdGlvbgotICAqLwotICBsYXlvdXQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgewot
ICAgIHZhciBsYXlvdXROYW1lID0gZ2V0KHRoaXMsICdsYXlvdXROYW1lJyksCi0gICAgICAgIGxh
eW91dCA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKGxheW91dE5hbWUsICdsYXlvdXQnKTsKKyAgb2Jq
LmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsnV2lsbGlhbSBLaW5nJywgJ01hcnkgU29tZXJ2
aWxsZSddCisgIGBgYAogCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIHRoZSBsYXlv
dXROYW1lICIgKyBsYXlvdXROYW1lICsgIiBmb3IgIiArIHRoaXMgKyAiLCBidXQgaXQgZGlkIG5v
dCBleGlzdC4iLCAhbGF5b3V0TmFtZSB8fCBsYXlvdXQpOworICBAbWV0aG9kIGNvbXB1dGVkLmlu
dGVyc2VjdAorICBAZm9yIEVtYmVyCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtleSoKKyAg
QHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0
aCBhbGwgdGhlCisgIGR1cGxpY2F0ZWQgZWxlbWVudHMgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5
cworKi8KK0VtYmVyLmNvbXB1dGVkLmludGVyc2VjdCA9IGZ1bmN0aW9uICgpIHsKKyAgdmFyIGdl
dERlcGVuZGVudEtleUd1aWRzID0gZnVuY3Rpb24gKGNoYW5nZU1ldGEpIHsKKyAgICByZXR1cm4g
bWFwKGNoYW5nZU1ldGEucHJvcGVydHkuX2RlcGVuZGVudEtleXMsIGZ1bmN0aW9uIChkZXBlbmRl
bnRLZXkpIHsKKyAgICAgIHJldHVybiBndWlkRm9yKGRlcGVuZGVudEtleSk7CisgICAgfSk7Cisg
IH07CiAKLSAgICByZXR1cm4gbGF5b3V0IHx8IGdldCh0aGlzLCAnZGVmYXVsdExheW91dCcpOwot
ICB9KS5wcm9wZXJ0eSgnbGF5b3V0TmFtZScpLAorICB2YXIgYXJncyA9IGFfc2xpY2UuY2FsbChh
cmd1bWVudHMpOworICBhcmdzLnB1c2goeworICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChhcnJh
eSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICBpbnN0YW5jZU1ldGEuaXRlbUNv
dW50cyA9IHt9OworICAgIH0sCiAKLSAgdGVtcGxhdGVGb3JOYW1lOiBmdW5jdGlvbihuYW1lLCB0
eXBlKSB7Ci0gICAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQorICAgIGFkZGVkSXRlbTogZnVuY3Rp
b24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgdmFyIGl0
ZW1HdWlkID0gZ3VpZEZvcihpdGVtKSwKKyAgICAgICAgICBkZXBlbmRlbnRHdWlkcyA9IGdldERl
cGVuZGVudEtleUd1aWRzKGNoYW5nZU1ldGEpLAorICAgICAgICAgIGRlcGVuZGVudEd1aWQgPSBn
dWlkRm9yKGNoYW5nZU1ldGEuYXJyYXlDaGFuZ2VkKSwKKyAgICAgICAgICBudW1iZXJPZkRlcGVu
ZGVudEFycmF5cyA9IGNoYW5nZU1ldGEucHJvcGVydHkuX2RlcGVuZGVudEtleXMubGVuZ3RoLAor
ICAgICAgICAgIGl0ZW1Db3VudHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNvdW50czsKIAotICAgIEVt
YmVyLmFzc2VydCgidGVtcGxhdGVOYW1lcyBhcmUgbm90IGFsbG93ZWQgdG8gY29udGFpbiBwZXJp
b2RzOiAiK25hbWUsIG5hbWUuaW5kZXhPZignLicpID09PSAtMSk7CisgICAgICBpZiAoIWl0ZW1D
b3VudHNbaXRlbUd1aWRdKSB7IGl0ZW1Db3VudHNbaXRlbUd1aWRdID0ge307IH0KKyAgICAgIGlm
IChpdGVtQ291bnRzW2l0ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9PT0gdW5kZWZpbmVkKSB7IGl0
ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID0gMDsgfQogCi0gICAgdmFyIGNvbnRh
aW5lciA9IGdldCh0aGlzLCAnY29udGFpbmVyJyk7CisgICAgICBpZiAoKytpdGVtQ291bnRzW2l0
ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9PT0gMSAmJgorICAgICAgICAgIG51bWJlck9mRGVwZW5k
ZW50QXJyYXlzID09PSBFbWJlci5rZXlzKGl0ZW1Db3VudHNbaXRlbUd1aWRdKS5sZW5ndGgpIHsK
IAotICAgIGlmIChjb250YWluZXIpIHsKLSAgICAgIHJldHVybiBjb250YWluZXIubG9va3VwKCd0
ZW1wbGF0ZTonICsgbmFtZSk7CisgICAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKKyAgICAg
IH0KKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9LAorICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlv
bihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICB2YXIgaXRl
bUd1aWQgPSBndWlkRm9yKGl0ZW0pLAorICAgICAgICAgIGRlcGVuZGVudEd1aWRzID0gZ2V0RGVw
ZW5kZW50S2V5R3VpZHMoY2hhbmdlTWV0YSksCisgICAgICAgICAgZGVwZW5kZW50R3VpZCA9IGd1
aWRGb3IoY2hhbmdlTWV0YS5hcnJheUNoYW5nZWQpLAorICAgICAgICAgIG51bWJlck9mRGVwZW5k
ZW50QXJyYXlzID0gY2hhbmdlTWV0YS5wcm9wZXJ0eS5fZGVwZW5kZW50S2V5cy5sZW5ndGgsCisg
ICAgICAgICAgbnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luLAorICAgICAgICAgIGl0ZW1Db3Vu
dHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNvdW50czsKKworICAgICAgaWYgKGl0ZW1Db3VudHNbaXRl
bUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3Vp
ZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9CisgICAgICBpZiAoLS1pdGVtQ291bnRzW2l0ZW1HdWlk
XVtkZXBlbmRlbnRHdWlkXSA9PT0gMCkgeworICAgICAgICBkZWxldGUgaXRlbUNvdW50c1tpdGVt
R3VpZF1bZGVwZW5kZW50R3VpZF07CisgICAgICAgIG51bWJlck9mQXJyYXlzSXRlbUFwcGVhcnNJ
biA9IEVtYmVyLmtleXMoaXRlbUNvdW50c1tpdGVtR3VpZF0pLmxlbmd0aDsKKworICAgICAgICBp
ZiAobnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luID09PSAwKSB7CisgICAgICAgICAgZGVsZXRl
IGl0ZW1Db3VudHNbaXRlbUd1aWRdOworICAgICAgICB9CisgICAgICAgIGFycmF5LnJlbW92ZU9i
amVjdChpdGVtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhcnJheTsKICAgICB9Ci0gIH0sCisg
IH0pOworICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBhcmdzKTsKK307
CiAKLSAgLyoqCi0gICAgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNj
ZXNzIHByb3BlcnRpZXMuCisvKioKKyAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5z
IGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQorICBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGRl
cGVuZGVudCBhcnJheSB0aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZAorICBkZXBlbmRlbnQgYXJy
YXkuCiAKLSAgICBUaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgZnVu
Y3Rpb24gZWFjaCB0aW1lIHRoZSByZW5kZXIKLSAgICBtZXRob2QgaXMgY2FsbGVkLCBidXQgaXQg
aXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKLSAgICB0byBk
byB3aXRoIGl0LgorICBFeGFtcGxlCiAKLSAgICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgYmUgdGhl
IHZpZXcncyBjb250cm9sbGVyLgorICBgYGBqYXZhc2NyaXB0CisgIEFwcC5IYW1zdGVyID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgbGlrZXM6IFsnYmFuYW5hJywgJ2dyYXBlJywgJ2thbGUn
XSwKKyAgICB3YW50czogRW1iZXIuY29tcHV0ZWQuc2V0RGlmZignbGlrZXMnLCAnZnJ1aXRzJykK
KyAgfSk7CiAKLSAgICBAcHJvcGVydHkgY29udGV4dAotICAgIEB0eXBlIE9iamVjdAotICAqLwot
ICBjb250ZXh0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCB2
YWx1ZSk7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBn
ZXQodGhpcywgJ19jb250ZXh0Jyk7CisgIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRl
KHtmcnVpdHM6IFsKKyAgICAnZ3JhcGUnLAorICAgICdrYWxlJywKKyAgXX0pOworICBoYW1zdGVy
LmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEnXQorICBgYGAKKworICBAbWV0aG9kIGNvbXB1dGVk
LnNldERpZmYKKyAgQGZvciBFbWJlcgorICBAcGFyYW0ge1N0cmluZ30gc2V0QVByb3BlcnR5Cisg
IEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVydHkKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlCisgIGl0ZW1zIGZyb20g
dGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZAorICBk
ZXBlbmRlbnQgYXJyYXkKKyovCitFbWJlci5jb21wdXRlZC5zZXREaWZmID0gZnVuY3Rpb24gKHNl
dEFQcm9wZXJ0eSwgc2V0QlByb3BlcnR5KSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAy
KSB7CisgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkg
dHdvIGRlcGVuZGVudCBhcnJheXMuIik7CisgIH0KKyAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0
ZWQuY2FsbChudWxsLCBzZXRBUHJvcGVydHksIHNldEJQcm9wZXJ0eSwgeworICAgIGFkZGVkSXRl
bTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKKyAg
ICAgIHZhciBzZXRBID0gZ2V0KHRoaXMsIHNldEFQcm9wZXJ0eSksCisgICAgICAgICAgc2V0QiA9
IGdldCh0aGlzLCBzZXRCUHJvcGVydHkpOworCisgICAgICBpZiAoY2hhbmdlTWV0YS5hcnJheUNo
YW5nZWQgPT09IHNldEEpIHsKKyAgICAgICAgaWYgKCFzZXRCLmNvbnRhaW5zKGl0ZW0pKSB7Cisg
ICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KGl0ZW0pOworICAgICAgICB9CisgICAgICB9IGVsc2Ug
eworICAgICAgICBhcnJheS5yZW1vdmVPYmplY3QoaXRlbSk7CisgICAgICB9CisgICAgICByZXR1
cm4gYXJyYXk7CisgICAgfSwKKworICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0
ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgeworICAgICAgdmFyIHNldEEgPSBnZXQodGhp
cywgc2V0QVByb3BlcnR5KSwKKyAgICAgICAgICBzZXRCID0gZ2V0KHRoaXMsIHNldEJQcm9wZXJ0
eSk7CisKKyAgICAgIGlmIChjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCA9PT0gc2V0QikgeworICAg
ICAgICBpZiAoc2V0QS5jb250YWlucyhpdGVtKSkgeworICAgICAgICAgIGFycmF5LmFkZE9iamVj
dChpdGVtKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJyYXkucmVtb3Zl
T2JqZWN0KGl0ZW0pOworICAgICAgfQorICAgICAgcmV0dXJuIGFycmF5OwogICAgIH0KLSAgfSku
dm9sYXRpbGUoKSwKKyAgfSk7Cit9OwogCi0gIC8qKgotICAgIEBwcml2YXRlCitmdW5jdGlvbiBi
aW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIGxvdywgaGlnaCkgeworICB2YXIgbWlkLCBtaWRJdGVt
LCByZXMsIGd1aWRNaWQsIGd1aWRJdGVtOwogCi0gICAgUHJpdmF0ZSBjb3B5IG9mIHRoZSB2aWV3
J3MgdGVtcGxhdGUgY29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRpcmVjdGx5Ci0gICAgYnkgSGFu
ZGxlYmFycyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG9ic2VydmVyIHRoYXQgY2F1c2VzIHRoZSB2
aWV3Ci0gICAgdG8gYmUgcmUtcmVuZGVyZWQuCisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkg
eyBoaWdoID0gZ2V0KGFycmF5LCAnbGVuZ3RoJyk7IH0KKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PCAzKSB7IGxvdyA9IDA7IH0KIAotICAgIFRoZSBjb250ZXh0IG9mIGEgdmlldyBpcyBsb29rZWQg
dXAgYXMgZm9sbG93czoKKyAgaWYgKGxvdyA9PT0gaGlnaCkgeworICAgIHJldHVybiBsb3c7Cisg
IH0KIAotICAgIDEuIFN1cHBsaWVkIGNvbnRleHQgKHVzdWFsbHkgYnkgSGFuZGxlYmFycykKLSAg
ICAyLiBTcGVjaWZpZWQgY29udHJvbGxlcgotICAgIDMuIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQg
KGZvciBhIGNoaWxkIG9mIGEgQ29udGFpbmVyVmlldykKKyAgbWlkID0gbG93ICsgTWF0aC5mbG9v
cigoaGlnaCAtIGxvdykgLyAyKTsKKyAgbWlkSXRlbSA9IGFycmF5Lm9iamVjdEF0KG1pZCk7CiAK
LSAgICBUaGUgY29kZSBpbiBIYW5kbGViYXJzIHRoYXQgb3ZlcnJpZGVzIHRoZSBgX2NvbnRleHRg
IHByb3BlcnR5IGZpcnN0Ci0gICAgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHRoZSB2aWV3IGhhcyBh
IHNwZWNpZmllZCBjb250cm9sbGVyLiBUaGlzIGlzCi0gICAgc29tZXRoaW5nIG9mIGEgaGFjayBh
bmQgc2hvdWxkIGJlIHJldmlzaXRlZC4KKyAgZ3VpZE1pZCA9IF9ndWlkRm9yKG1pZEl0ZW0pOwor
ICBndWlkSXRlbSA9IF9ndWlkRm9yKGl0ZW0pOwogCi0gICAgQHByb3BlcnR5IF9jb250ZXh0Ci0g
ICovCi0gIF9jb250ZXh0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIg
cGFyZW50VmlldywgY29udHJvbGxlcjsKKyAgaWYgKGd1aWRNaWQgPT09IGd1aWRJdGVtKSB7Cisg
ICAgcmV0dXJuIG1pZDsKKyAgfQogCi0gICAgaWYgKGNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2Nv
bnRyb2xsZXInKSkgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQorICByZXMgPSB0
aGlzLm9yZGVyKG1pZEl0ZW0sIGl0ZW0pOworICBpZiAocmVzID09PSAwKSB7CisgICAgcmVzID0g
Z3VpZE1pZCA8IGd1aWRJdGVtID8gLTEgOiAxOworICB9CiAKLSAgICBwYXJlbnRWaWV3ID0gdGhp
cy5fcGFyZW50VmlldzsKLSAgICBpZiAocGFyZW50VmlldykgewotICAgICAgcmV0dXJuIGdldChw
YXJlbnRWaWV3LCAnX2NvbnRleHQnKTsKKworICBpZiAocmVzIDwgMCkgeworICAgIHJldHVybiB0
aGlzLmJpbmFyeVNlYXJjaChhcnJheSwgaXRlbSwgbWlkKzEsIGhpZ2gpOworICB9IGVsc2UgaWYg
KHJlcyA+IDApIHsKKyAgICByZXR1cm4gdGhpcy5iaW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIGxv
dywgbWlkKTsKKyAgfQorCisgIHJldHVybiBtaWQ7CisKKyAgZnVuY3Rpb24gX2d1aWRGb3IoaXRl
bSkgeworICAgIGlmIChTZWFyY2hQcm94eS5kZXRlY3RJbnN0YW5jZShpdGVtKSkgeworICAgICAg
cmV0dXJuIGd1aWRGb3IoZ2V0KGl0ZW0sICdjb250ZW50JykpOwogICAgIH0KKyAgICByZXR1cm4g
Z3VpZEZvcihpdGVtKTsKKyAgfQorfQogCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0pLAogCi0gIC8q
KgotICAgIEBwcml2YXRlCitTZWFyY2hQcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmV4dGVuZCgp
OwogCi0gICAgSWYgYSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGVtcGxhdGUgcmVuZGVyaW5nIGNoYW5n
ZXMsIHRoZSB2aWV3IHNob3VsZCBiZQotICAgIHJlLXJlbmRlcmVkIHRvIHJlZmxlY3QgdGhlIG5l
dyB2YWx1ZS4KKy8qKgorICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcg
YXJyYXkgd2l0aCBhbGwgdGhlCisgIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVwZW5kZW50
IGFycmF5IHNvcnRlZCBiYXNlZCBvbiBhIHByb3BlcnR5CisgIG9yIHNvcnQgZnVuY3Rpb24uCiAK
LSAgICBAbWV0aG9kIF9kaXNwbGF5UHJvcGVydHlEaWRDaGFuZ2UKLSAgKi8KLSAgX2NvbnRleHRE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVyZW5kZXIo
KTsKLSAgfSwgJ2NvbnRleHQnKSwKKyAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBz
aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKIAotICAvKioKLSAgICBJZiBgZmFs
c2VgLCB0aGUgdmlldyB3aWxsIGFwcGVhciBoaWRkZW4gaW4gRE9NLgorICBgYGBqYXZhc2NyaXB0
CisgIGZ1bmN0aW9uKGl0ZW1BLCBpdGVtQik7CisgIGBgYAogCi0gICAgQHByb3BlcnR5IGlzVmlz
aWJsZQotICAgIEB0eXBlIEJvb2xlYW4KLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGlzVmlz
aWJsZTogdHJ1ZSwKKyAgLSBgaXRlbUFgIHRoZSBmaXJzdCBpdGVtIHRvIGNvbXBhcmUuCisgIC0g
YGl0ZW1CYCB0aGUgc2Vjb25kIGl0ZW0gdG8gY29tcGFyZS4KIAotICAvKioKLSAgICBAcHJpdmF0
ZQorICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYC0xYCB3aGVuIGBpdGVtQWAgc2hvdWxk
IGNvbWUgYmVmb3JlCisgIGBpdGVtQmAuIEl0IHNob3VsZCByZXR1cm4gYDFgIHdoZW4gYGl0ZW1B
YCBzaG91bGQgY29tZSBhZnRlcgorICBgaXRlbUJgLiBJZiB0aGUgYGl0ZW1BYCBhbmQgYGl0ZW1C
YCBhcmUgZXF1YWwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGAwYC4KIAotICAgIEFycmF5
IG9mIGNoaWxkIHZpZXdzLiBZb3Ugc2hvdWxkIG5ldmVyIGVkaXQgdGhpcyBhcnJheSBkaXJlY3Rs
eS4KLSAgICBJbnN0ZWFkLCB1c2UgYGFwcGVuZENoaWxkYCBhbmQgYHJlbW92ZUZyb21QYXJlbnRg
LgorICBFeGFtcGxlCiAKLSAgICBAcHJvcGVydHkgY2hpbGRWaWV3cwotICAgIEB0eXBlIEFycmF5
Ci0gICAgQGRlZmF1bHQgW10KLSAgKi8KLSAgY2hpbGRWaWV3czogY2hpbGRWaWV3c1Byb3BlcnR5
LAorICBgYGBqYXZhc2NyaXB0CisgIHZhciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQo
eworICAgIHRvZG9zU29ydGluZzogWyduYW1lJ10sCisgICAgc29ydGVkVG9kb3M6IEVtYmVyLmNv
bXB1dGVkLnNvcnQoJ3RvZG9zJywgJ3RvZG9zU29ydGluZycpLAorICAgIHByaW9yaXR5VG9kb3M6
IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9zJywgZnVuY3Rpb24oYSwgYil7CisgICAgICBpZiAo
YS5wcmlvcml0eSA+IGIucHJpb3JpdHkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9IGVs
c2UgaWYgKGEucHJpb3JpdHkgPCBiLnByaW9yaXR5KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0pLAorICB9KTsKKyAgdmFyIHRvZG9MaXN0ID0g
VG9Eb0xpc3QuY3JlYXRlKHt0b2RvczogWworICAgIHtuYW1lOiAnVW5pdCBUZXN0JywgcHJpb3Jp
dHk6IDJ9LAorICAgIHtuYW1lOiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5OiAzfSwKKyAgICB7
bmFtZTogJ1JlbGVhc2UnLCBwcmlvcml0eTogMX0KKyAgXX0pOworCisgIHRvZG9MaXN0LmdldCgn
c29ydGVkVG9kb3MnKTsgLy8gW3tuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3JpdHk6M30sIHtu
YW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MX0sIHtuYW1lOidVbml0IFRlc3QnLCBwcmlvcml0eToy
fV0KKyAgdG9kb0xpc3QuZ2V0KCdwcmlvcml0eVRvZG9zJyk7IC8vIFt7bmFtZTonUmVsZWFzZScs
IHByaW9yaXR5OjF9LCB7bmFtZTonVW5pdCBUZXN0JywgcHJpb3JpdHk6Mn0sIHtuYW1lOidEb2N1
bWVudGF0aW9uJywgcHJpb3JpdHk6M31dCisgIGBgYAogCi0gIF9jaGlsZFZpZXdzOiBbXSwKKyAg
QG1ldGhvZCBjb21wdXRlZC5zb3J0CisgIEBmb3IgRW1iZXIKKyAgQHBhcmFtIHtTdHJpbmd9IGRl
cGVuZGVudEtleQorICBAcGFyYW0ge1N0cmluZyBvciBGdW5jdGlvbn0gc29ydERlZmluaXRpb24g
YSBkZXBlbmRlbnQga2V5IHRvIGFuCisgIGFycmF5IG9mIHNvcnQgcHJvcGVydGllcyBvciBhIGZ1
bmN0aW9uIHRvIHVzZSB3aGVuIHNvcnRpbmcKKyAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9w
ZXJ0eX0gY29tcHV0ZXMgYSBuZXcgc29ydGVkIGFycmF5IGJhc2VkCisgIG9uIHRoZSBzb3J0IHBy
b3BlcnR5IGFycmF5IG9yIGNhbGxiYWNrIGZ1bmN0aW9uCisqLworRW1iZXIuY29tcHV0ZWQuc29y
dCA9IGZ1bmN0aW9uIChpdGVtc0tleSwgc29ydERlZmluaXRpb24pIHsKKyAgRW1iZXIuYXNzZXJ0
KCJFbWJlci5jb21wdXRlZC5zb3J0IHJlcXVpcmVzIHR3byBhcmd1bWVudHM6IGFuIGFycmF5IGtl
eSB0byBzb3J0IGFuZCBlaXRoZXIgYSBzb3J0IHByb3BlcnRpZXMga2V5IG9yIHNvcnQgZnVuY3Rp
b24iLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKIAotICAvLyBXaGVuIGl0J3MgYSB2aXJ0dWFs
IHZpZXcsIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB0aGVpcgotICAvLyBjaGls
ZFZpZXdzIHdpbGwgY2hhbmdlLgotICBfY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IEVtYmVyLmJlZm9y
ZU9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzVmlydHVhbCkgewotICAgICAg
dmFyIHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKLSAgICAgIGlmIChwYXJl
bnRWaWV3KSB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3
cycpOyB9Ci0gICAgfQotICB9LCAnY2hpbGRWaWV3cycpLAorICB2YXIgaW5pdEZuLCBzb3J0UHJv
cGVydGllc0tleTsKIAotICAvLyBXaGVuIGl0J3MgYSB2aXJ0dWFsIHZpZXcsIHdlIG5lZWQgdG8g
bm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB0aGVpcgotICAvLyBjaGlsZFZpZXdzIGRpZCBjaGFuZ2Uu
Ci0gIF9jaGlsZFZpZXdzRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKLSAg
ICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMs
ICdwYXJlbnRWaWV3Jyk7Ci0gICAgICBpZiAocGFyZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eURp
ZENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3cycpOyB9Ci0gICAgfQotICB9LCAnY2hpbGRW
aWV3cycpLAorICBpZiAodHlwZW9mIHNvcnREZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7Cisg
ICAgaW5pdEZuID0gZnVuY3Rpb24gKGFycmF5LCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsK
KyAgICAgIGluc3RhbmNlTWV0YS5vcmRlciA9IHNvcnREZWZpbml0aW9uOworICAgICAgaW5zdGFu
Y2VNZXRhLmJpbmFyeVNlYXJjaCA9IGJpbmFyeVNlYXJjaDsKKyAgICB9OworICB9IGVsc2Ugewor
ICAgIHNvcnRQcm9wZXJ0aWVzS2V5ID0gc29ydERlZmluaXRpb247CisgICAgaW5pdEZuID0gZnVu
Y3Rpb24gKGFycmF5LCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKKyAgICAgIGZ1bmN0aW9u
IHNldHVwU29ydFByb3BlcnRpZXMoKSB7CisgICAgICAgIHZhciBzb3J0UHJvcGVydHlEZWZpbml0
aW9ucyA9IGdldCh0aGlzLCBzb3J0UHJvcGVydGllc0tleSksCisgICAgICAgICAgICBzb3J0UHJv
cGVydHksCisgICAgICAgICAgICBzb3J0UHJvcGVydGllcyA9IGluc3RhbmNlTWV0YS5zb3J0UHJv
cGVydGllcyA9IFtdLAorICAgICAgICAgICAgc29ydFByb3BlcnR5QXNjZW5kaW5nID0gaW5zdGFu
Y2VNZXRhLnNvcnRQcm9wZXJ0eUFzY2VuZGluZyA9IHt9LAorICAgICAgICAgICAgaWR4LAorICAg
ICAgICAgICAgYXNjOworCisgICAgICAgIEVtYmVyLmFzc2VydCgiQ2Fubm90IHNvcnQ6ICciICsg
c29ydFByb3BlcnRpZXNLZXkgKyAiJyBpcyBub3QgYW4gYXJyYXkuIiwgRW1iZXIuaXNBcnJheShz
b3J0UHJvcGVydHlEZWZpbml0aW9ucykpOworCisgICAgICAgIGNoYW5nZU1ldGEucHJvcGVydHku
Y2xlYXJJdGVtUHJvcGVydHlLZXlzKGl0ZW1zS2V5KTsKKworICAgICAgICBmb3JFYWNoKHNvcnRQ
cm9wZXJ0eURlZmluaXRpb25zLCBmdW5jdGlvbiAoc29ydFByb3BlcnR5RGVmaW5pdGlvbikgewor
ICAgICAgICAgIGlmICgoaWR4ID0gc29ydFByb3BlcnR5RGVmaW5pdGlvbi5pbmRleE9mKCc6Jykp
ICE9PSAtMSkgeworICAgICAgICAgICAgc29ydFByb3BlcnR5ID0gc29ydFByb3BlcnR5RGVmaW5p
dGlvbi5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgICAgIGFzYyA9IHNvcnRQcm9wZXJ0eURl
ZmluaXRpb24uc3Vic3RyaW5nKGlkeCsxKS50b0xvd2VyQ2FzZSgpICE9PSAnZGVzYyc7CisgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvcnRQcm9wZXJ0eSA9IHNvcnRQcm9wZXJ0eURl
ZmluaXRpb247CisgICAgICAgICAgICBhc2MgPSB0cnVlOworICAgICAgICAgIH0KIAotICAvKioK
LSAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiB0
aGUgcHJvdmlkZWQKLSAgICBjbGFzcy4KKyAgICAgICAgICBzb3J0UHJvcGVydGllcy5wdXNoKHNv
cnRQcm9wZXJ0eSk7CisgICAgICAgICAgc29ydFByb3BlcnR5QXNjZW5kaW5nW3NvcnRQcm9wZXJ0
eV0gPSBhc2M7CisgICAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5pdGVtUHJvcGVydHlLZXko
aXRlbXNLZXksIHNvcnRQcm9wZXJ0eSk7CisgICAgICAgIH0pOwogCi0gICAgQHByb3BlcnR5IG5l
YXJlc3RJbnN0YW5jZU9mCi0gICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgU3ViY2xhc3Mgb2YgRW1i
ZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpCi0gICAgQHJldHVybiBFbWJlci5WaWV3Ci0g
ICAgQGRlcHJlY2F0ZWQKLSAgKi8KLSAgbmVhcmVzdEluc3RhbmNlT2Y6IGZ1bmN0aW9uKGtsYXNz
KSB7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCJuZWFyZXN0SW5zdGFuY2VPZiBpcyBkZXByZWNhdGVk
IGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMuIFVzZSBuZWFyZXN0T2ZU
eXBlLiIpOwotICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisgICAgICAg
IHNvcnRQcm9wZXJ0eURlZmluaXRpb25zLmFkZE9ic2VydmVyKCdAZWFjaCcsIHRoaXMsIHVwZGF0
ZVNvcnRQcm9wZXJ0aWVzT25jZSk7CisgICAgICB9CiAKLSAgICB3aGlsZSAodmlldykgewotICAg
ICAgaWYodmlldyBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2aWV3OyB9Ci0gICAgICB2aWV3
ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAorICAgICAgZnVuY3Rpb24g
dXBkYXRlU29ydFByb3BlcnRpZXNPbmNlKCkgeworICAgICAgICBFbWJlci5ydW4ub25jZSh0aGlz
LCB1cGRhdGVTb3J0UHJvcGVydGllcywgY2hhbmdlTWV0YS5wcm9wZXJ0eU5hbWUpOworICAgICAg
fQogCi0gIC8qKgotICAgIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGlzIGFuIGlu
c3RhbmNlIG9mIHRoZSBwcm92aWRlZAotICAgIGNsYXNzIG9yIG1peGluLgorICAgICAgZnVuY3Rp
b24gdXBkYXRlU29ydFByb3BlcnRpZXMocHJvcGVydHlOYW1lKSB7CisgICAgICAgIHNldHVwU29y
dFByb3BlcnRpZXMuY2FsbCh0aGlzKTsKKyAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5yZWNv
bXB1dGVPbmNlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKKyAgICAgIH0KIAotICAgIEBwcm9w
ZXJ0eSBuZWFyZXN0T2ZUeXBlCi0gICAgQHBhcmFtIHtDbGFzcyxNaXhpbn0ga2xhc3MgU3ViY2xh
c3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpLAotICAgICAgICAgICBvciBh
biBpbnN0YW5jZSBvZiBFbWJlci5NaXhpbi4KLSAgICBAcmV0dXJuIEVtYmVyLlZpZXcKLSAgKi8K
LSAgbmVhcmVzdE9mVHlwZTogZnVuY3Rpb24oa2xhc3MpIHsKLSAgICB2YXIgdmlldyA9IGdldCh0
aGlzLCAncGFyZW50VmlldycpLAotICAgICAgICBpc09mVHlwZSA9IGtsYXNzIGluc3RhbmNlb2Yg
RW1iZXIuTWl4aW4gPwotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZpZXcpIHsgcmV0dXJu
IGtsYXNzLmRldGVjdCh2aWV3KTsgfSA6Ci0gICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odmll
dykgeyByZXR1cm4ga2xhc3MuZGV0ZWN0KHZpZXcuY29uc3RydWN0b3IpOyB9OworICAgICAgRW1i
ZXIuYWRkT2JzZXJ2ZXIodGhpcywgc29ydFByb3BlcnRpZXNLZXksIHVwZGF0ZVNvcnRQcm9wZXJ0
aWVzT25jZSk7CiAKLSAgICB3aGlsZSAodmlldykgewotICAgICAgaWYoIGlzT2ZUeXBlKHZpZXcp
ICkgeyByZXR1cm4gdmlldzsgfQotICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50Vmlldycp
OwotICAgIH0KLSAgfSwKKyAgICAgIHNldHVwU29ydFByb3BlcnRpZXMuY2FsbCh0aGlzKTsKIAot
ICAvKioKLSAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBoYXMgYSBnaXZlbiBw
cm9wZXJ0eS4KIAotICAgIEBwcm9wZXJ0eSBuZWFyZXN0V2l0aFByb3BlcnR5Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IHByb3BlcnR5IEEgcHJvcGVydHkgbmFtZQotICAgIEByZXR1cm4gRW1iZXIuVmll
dwotICAqLwotICBuZWFyZXN0V2l0aFByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0eSkgewotICAg
IHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisgICAgICBpbnN0YW5jZU1ldGEu
b3JkZXIgPSBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7CisgICAgICAgIHZhciBzb3J0UHJvcGVy
dHksIHJlc3VsdCwgYXNjOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc29ydFBy
b3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICBzb3J0UHJvcGVydHkgPSB0aGlzLnNv
cnRQcm9wZXJ0aWVzW2ldOworICAgICAgICAgIHJlc3VsdCA9IEVtYmVyLmNvbXBhcmUoZ2V0KGl0
ZW1BLCBzb3J0UHJvcGVydHkpLCBnZXQoaXRlbUIsIHNvcnRQcm9wZXJ0eSkpOwogCi0gICAgd2hp
bGUgKHZpZXcpIHsKLSAgICAgIGlmIChwcm9wZXJ0eSBpbiB2aWV3KSB7IHJldHVybiB2aWV3OyB9
Ci0gICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAorICAg
ICAgICAgIGlmIChyZXN1bHQgIT09IDApIHsKKyAgICAgICAgICAgIGFzYyA9IHRoaXMuc29ydFBy
b3BlcnR5QXNjZW5kaW5nW3NvcnRQcm9wZXJ0eV07CisgICAgICAgICAgICByZXR1cm4gYXNjID8g
cmVzdWx0IDogKC0xICogcmVzdWx0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotICAvKioK
LSAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3Igd2hvc2UgcGFyZW50IGlzIGFuIGluc3Rh
bmNlIG9mCi0gICAgYGtsYXNzYC4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9OwogCi0gICAg
QHByb3BlcnR5IG5lYXJlc3RDaGlsZE9mCi0gICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgU3ViY2xh
c3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpCi0gICAgQHJldHVybiBFbWJl
ci5WaWV3Ci0gICovCi0gIG5lYXJlc3RDaGlsZE9mOiBmdW5jdGlvbihrbGFzcykgewotICAgIHZh
ciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisgICAgICBpbnN0YW5jZU1ldGEuYmlu
YXJ5U2VhcmNoID0gYmluYXJ5U2VhcmNoOworICAgIH07CisgIH0KIAotICAgIHdoaWxlICh2aWV3
KSB7Ci0gICAgICBpZihnZXQodmlldywgJ3BhcmVudFZpZXcnKSBpbnN0YW5jZW9mIGtsYXNzKSB7
IHJldHVybiB2aWV3OyB9Ci0gICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0g
ICAgfQotICB9LAorICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5jYWxsKG51bGwsIGl0ZW1z
S2V5LCB7CisgICAgaW5pdGlhbGl6ZTogaW5pdEZuLAogCi0gIC8qKgotICAgIEBwcml2YXRlCisg
ICAgYWRkZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNl
TWV0YSkgeworICAgICAgdmFyIGluZGV4ID0gaW5zdGFuY2VNZXRhLmJpbmFyeVNlYXJjaChhcnJh
eSwgaXRlbSk7CisgICAgICBhcnJheS5pbnNlcnRBdChpbmRleCwgaXRlbSk7CisgICAgICByZXR1
cm4gYXJyYXk7CisgICAgfSwKIAotICAgIFdoZW4gdGhlIHBhcmVudCB2aWV3IGNoYW5nZXMsIHJl
Y3Vyc2l2ZWx5IGludmFsaWRhdGUgYGNvbnRyb2xsZXJgCisgICAgcmVtb3ZlZEl0ZW06IGZ1bmN0
aW9uIChhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CisgICAgICB2YXIg
cHJveHlQcm9wZXJ0aWVzLCBpbmRleCwgc2VhcmNoSXRlbTsKIAotICAgIEBtZXRob2QgX3BhcmVu
dFZpZXdEaWRDaGFuZ2UKLSAgKi8KLSAgX3BhcmVudFZpZXdEaWRDaGFuZ2U6IEVtYmVyLm9ic2Vy
dmVyKGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0K
KyAgICAgIGlmIChjaGFuZ2VNZXRhLnByZXZpb3VzVmFsdWVzKSB7CisgICAgICAgIHByb3h5UHJv
cGVydGllcyA9IG1lcmdlKHsgY29udGVudDogaXRlbSB9LCBjaGFuZ2VNZXRhLnByZXZpb3VzVmFs
dWVzKTsKIAotICAgIGlmIChnZXQodGhpcywgJ3BhcmVudFZpZXcuY29udHJvbGxlcicpICYmICFn
ZXQodGhpcywgJ2NvbnRyb2xsZXInKSkgewotICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5n
ZSgnY29udHJvbGxlcicpOworICAgICAgICBzZWFyY2hJdGVtID0gU2VhcmNoUHJveHkuY3JlYXRl
KHByb3h5UHJvcGVydGllcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWFyY2hJdGVtID0g
aXRlbTsKKyAgICAgIH0KKworICAgICAgaW5kZXggPSBpbnN0YW5jZU1ldGEuYmluYXJ5U2VhcmNo
KGFycmF5LCBzZWFyY2hJdGVtKTsKKyAgICAgIGFycmF5LnJlbW92ZUF0KGluZGV4KTsKKyAgICAg
IHJldHVybiBhcnJheTsKICAgICB9Ci0gIH0sICdfcGFyZW50VmlldycpLAorICB9KTsKK307CiAK
LSAgX2NvbnRyb2xsZXJEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAg
IGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KK30pKCk7CiAKLSAgICB0aGlzLnJl
cmVuZGVyKCk7CiAKLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgewot
ICAgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnY29udHJvbGxlcicpOwotICAgIH0pOwotICB9
LCAnY29udHJvbGxlcicpLAogCi0gIGNsb25lS2V5d29yZHM6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciB0ZW1wbGF0ZURhdGEgPSBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOworKGZ1bmN0aW9uKCkg
eworRW1iZXIuUlNWUCA9IHJlcXVpcmVNb2R1bGUoJ3JzdnAnKTsKIAotICAgIHZhciBrZXl3b3Jk
cyA9IHRlbXBsYXRlRGF0YSA/IEVtYmVyLmNvcHkodGVtcGxhdGVEYXRhLmtleXdvcmRzKSA6IHt9
OwotICAgIHNldChrZXl3b3JkcywgJ3ZpZXcnLCBnZXQodGhpcywgJ2NvbmNyZXRlVmlldycpKTsK
LSAgICBzZXQoa2V5d29yZHMsICdfdmlldycsIHRoaXMpOwotICAgIHNldChrZXl3b3JkcywgJ2Nv
bnRyb2xsZXInLCBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSk7Ci0KLSAgICByZXR1cm4ga2V5d29y
ZHM7Ci0gIH0sCitFbWJlci5SU1ZQLm9uZXJyb3JEZWZhdWx0ID0gZnVuY3Rpb24oZXJyb3IpIHsK
KyAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICBpZiAoRW1iZXIudGVzdGluZykg
eworICAgICAgaWYgKEVtYmVyLlRlc3QgJiYgRW1iZXIuVGVzdC5hZGFwdGVyKSB7CisgICAgICAg
IEVtYmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb24oZXJyb3IpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhyb3cgZXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEVtYmVyLkxv
Z2dlci5lcnJvcihlcnJvci5zdGFjayk7CisgICAgICBFbWJlci5hc3NlcnQoZXJyb3IsIGZhbHNl
KTsKKyAgICB9CisgIH0KK307CiAKLSAgLyoqCi0gICAgQ2FsbGVkIG9uIHlvdXIgdmlldyB3aGVu
IGl0IHNob3VsZCBwdXNoIHN0cmluZ3Mgb2YgSFRNTCBpbnRvIGEKLSAgICBgRW1iZXIuUmVuZGVy
QnVmZmVyYC4gTW9zdCB1c2VycyB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGB0ZW1wbGF0ZWAK
LSAgICBvciBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2Qu
CitFbWJlci5SU1ZQLm9uKCdlcnJvcicsIEVtYmVyLlJTVlAub25lcnJvckRlZmF1bHQpOwogCi0g
ICAgQnkgZGVmYXVsdCwgYEVtYmVyLlZpZXdgIHdpbGwgbG9vayBmb3IgYSBmdW5jdGlvbiBpbiB0
aGUgYHRlbXBsYXRlYAotICAgIHByb3BlcnR5IGFuZCBpbnZva2UgaXQgd2l0aCB0aGUgdmFsdWUg
b2YgYGNvbnRleHRgLiBUaGUgdmFsdWUgb2YKLSAgICBgY29udGV4dGAgd2lsbCBiZSB0aGUgdmll
dydzIGNvbnRyb2xsZXIgdW5sZXNzIHlvdSBvdmVycmlkZSBpdC4KK30pKCk7CiAKLSAgICBAbWV0
aG9kIHJlbmRlcgotICAgIEBwYXJhbSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgVGhlIHJl
bmRlciBidWZmZXIKLSAgKi8KLSAgcmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICAvLyBJ
ZiB0aGlzIHZpZXcgaGFzIGEgbGF5b3V0LCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhl
Ci0gICAgLy8gdGhlIGxheW91dCB0byByZW5kZXIgdGhlIHZpZXcncyB0ZW1wbGF0ZS4gT3RoZXJ3
aXNlLCByZW5kZXIgdGhlIHRlbXBsYXRlCi0gICAgLy8gZGlyZWN0bHkuCi0gICAgdmFyIHRlbXBs
YXRlID0gZ2V0KHRoaXMsICdsYXlvdXQnKSB8fCBnZXQodGhpcywgJ3RlbXBsYXRlJyk7CiAKLSAg
ICBpZiAodGVtcGxhdGUpIHsKLSAgICAgIHZhciBjb250ZXh0ID0gZ2V0KHRoaXMsICdjb250ZXh0
Jyk7Ci0gICAgICB2YXIga2V5d29yZHMgPSB0aGlzLmNsb25lS2V5d29yZHMoKTsKLSAgICAgIHZh
ciBvdXRwdXQ7CiAKLSAgICAgIHZhciBkYXRhID0gewotICAgICAgICB2aWV3OiB0aGlzLAotICAg
ICAgICBidWZmZXI6IGJ1ZmZlciwKLSAgICAgICAgaXNSZW5kZXJEYXRhOiB0cnVlLAotICAgICAg
ICBrZXl3b3Jkczoga2V5d29yZHMsCi0gICAgICAgIGluc2lkZUdyb3VwOiBnZXQodGhpcywgJ3Rl
bXBsYXRlRGF0YS5pbnNpZGVHcm91cCcpCi0gICAgICB9OworKGZ1bmN0aW9uKCkgeworLyoqCitA
bW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCiAKLSAgICAgIC8vIElu
dm9rZSB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGV4dCwgd2hp
Y2gKLSAgICAgIC8vIGlzIHRoZSB2aWV3J3MgY29udHJvbGxlciBieSBkZWZhdWx0LiBBIGhhc2gg
b2YgZGF0YSBpcyBhbHNvIHBhc3NlZCB0aGF0IHByb3ZpZGVzCi0gICAgICAvLyB0aGUgdGVtcGxh
dGUgd2l0aCBhY2Nlc3MgdG8gdGhlIHZpZXcgYW5kIHJlbmRlciBidWZmZXIuCit2YXIgYV9zbGlj
ZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKIAotICAgICAgRW1iZXIuYXNzZXJ0KCd0ZW1wbGF0
ZSBtdXN0IGJlIGEgZnVuY3Rpb24uIERpZCB5b3UgbWVhbiB0byBjYWxsIEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgiLi4uIikgb3Igc3BlY2lmeSB0ZW1wbGF0ZU5hbWUgaW5zdGVhZD8nLCB0eXBl
b2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpOwotICAgICAgLy8gVGhlIHRlbXBsYXRlIHNob3Vs
ZCB3cml0ZSBkaXJlY3RseSB0byB0aGUgcmVuZGVyIGJ1ZmZlciBpbnN0ZWFkCi0gICAgICAvLyBv
ZiByZXR1cm5pbmcgYSBzdHJpbmcuCi0gICAgICBvdXRwdXQgPSB0ZW1wbGF0ZShjb250ZXh0LCB7
IGRhdGE6IGRhdGEgfSk7CiAKLSAgICAgIC8vIElmIHRoZSB0ZW1wbGF0ZSByZXR1cm5lZCBhIHN0
cmluZyBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gdGhlIGJ1ZmZlciwKLSAgICAgIC8vIHB1c2ggdGhl
IHN0cmluZyBvbnRvIHRoZSBidWZmZXIuCi0gICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmluZWQp
IHsgYnVmZmVyLnB1c2gob3V0cHV0KTsgfQotICAgIH0KLSAgfSwKK2lmIChFbWJlci5FWFRFTkRf
UFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbikg
ewogCiAgIC8qKgotICAgIFJlbmRlcnMgdGhlIHZpZXcgYWdhaW4uIFRoaXMgd2lsbCB3b3JrIHJl
Z2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLSAgICB2aWV3IGlzIGFscmVhZHkgaW4gdGhlIERPTSBv
ciBub3QuIElmIHRoZSB2aWV3IGlzIGluIHRoZSBET00sIHRoZQotICAgIHJlbmRlcmluZyBwcm9j
ZXNzIHdpbGwgYmUgZGVmZXJyZWQgdG8gZ2l2ZSBiaW5kaW5ncyBhIGNoYW5jZQotICAgIHRvIHN5
bmNocm9uaXplLgorICAgIFRoZSBgcHJvcGVydHlgIGV4dGVuc2lvbiBvZiBKYXZhc2NyaXB0J3Mg
RnVuY3Rpb24gcHJvdG90eXBlIGlzIGF2YWlsYWJsZQorICAgIHdoZW4gYEVtYmVyLkVYVEVORF9Q
Uk9UT1RZUEVTYCBvciBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb25gIGlzCisgICAg
YHRydWVgLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KIAotICAgIElmIGNoaWxkcmVuIHdlcmUgYWRk
ZWQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2VzcyB1c2luZyBgYXBwZW5kQ2hpbGRgLAotICAg
IGByZXJlbmRlcmAgd2lsbCByZW1vdmUgdGhlbSwgYmVjYXVzZSB0aGV5IHdpbGwgYmUgYWRkZWQg
YWdhaW4KLSAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJlbmRlcmAuCisgICAgQ29tcHV0ZWQg
cHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJlYXQgYSBmdW5jdGlvbiBsaWtlIGEgcHJvcGVydHk6
CiAKLSAgICBJbiBnZW5lcmFsLCBpZiB0aGUgZGlzcGxheSBvZiB5b3VyIHZpZXcgY2hhbmdlcywg
eW91IHNob3VsZCBtb2RpZnkKLSAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5zdGVhZCBv
ZiBtYW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgotICAgIGJlIHNsb3cuCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIE15QXBwLlByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5leHRl
bmQoeworICAgICAgZmlyc3ROYW1lOiAnJywKKyAgICAgIGxhc3ROYW1lOiAgJycsCiAKLSAgICBA
bWV0aG9kIHJlcmVuZGVyCi0gICovCi0gIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gdGhpcy5jdXJyZW50U3RhdGUucmVyZW5kZXIodGhpcyk7Ci0gIH0sCisgICAgICBmdWxsTmFt
ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAn
ICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKIAotICBjbGVhclJlbmRlcmVkQ2hpbGRyZW46IGZ1
bmN0aW9uKCkgewotICAgIHZhciBsZW5ndGhCZWZvcmUgPSB0aGlzLmxlbmd0aEJlZm9yZVJlbmRl
ciwKLSAgICAgICAgbGVuZ3RoQWZ0ZXIgID0gdGhpcy5sZW5ndGhBZnRlclJlbmRlcjsKKyAgICAg
ICAgLy8gQ2FsbCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVuY3Rpb24gYXMgYSBwcm9wZXJ0eQor
ICAgICAgfS5wcm9wZXJ0eSgpCisgICAgfSk7CiAKLSAgICAvLyBJZiB0aGVyZSB3ZXJlIGNoaWxk
IHZpZXdzIGNyZWF0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gcmVuZGVyKCksCi0gICAgLy8g
cmVtb3ZlIHRoZW0gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgcmUtY3Jl
YXRlZCB3aGVuCi0gICAgLy8gd2UgcmUtcmVuZGVyLgorICAgIHZhciBwcmVzaWRlbnQgPSBNeUFw
cC5QcmVzaWRlbnQuY3JlYXRlKHsKKyAgICAgIGZpcnN0TmFtZTogIkJhcmFjayIsCisgICAgICBs
YXN0TmFtZTogIk9iYW1hIgorICAgIH0pOwogCi0gICAgLy8gVklFVy1UT0RPOiBVbml0IHRlc3Qg
dGhpcyBwYXRoLgotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKLSAgICBm
b3IgKHZhciBpPWxlbmd0aEFmdGVyLTE7IGk+PWxlbmd0aEJlZm9yZTsgaS0tKSB7Ci0gICAgICBp
ZiAoY2hpbGRWaWV3c1tpXSkgeyBjaGlsZFZpZXdzW2ldLmRlc3Ryb3koKTsgfQotICAgIH0KLSAg
fSwKKyAgICBwcmVzaWRlbnQuZ2V0KCdmdWxsTmFtZScpOyAgICAvLyAiQmFyYWNrIE9iYW1hIgor
ICAgIGBgYAogCi0gIC8qKgotICAgIEBwcml2YXRlCisgICAgVHJlYXRpbmcgYSBmdW5jdGlvbiBs
aWtlIGEgcHJvcGVydHkgaXMgdXNlZnVsIGJlY2F1c2UgdGhleSBjYW4gd29yayB3aXRoCisgICAg
YmluZGluZ3MsIGp1c3QgbGlrZSBhbnkgb3RoZXIgcHJvcGVydHkuCiAKLSAgICBJdGVyYXRlcyBv
dmVyIHRoZSB2aWV3J3MgYGNsYXNzTmFtZUJpbmRpbmdzYCBhcnJheSwgaW5zZXJ0cyB0aGUgdmFs
dWUKLSAgICBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGludG8gdGhlIGBjbGFzc05hbWVzYCBh
cnJheSwgdGhlbiBjcmVhdGVzIGFuCi0gICAgb2JzZXJ2ZXIgdG8gdXBkYXRlIHRoZSB2aWV3J3Mg
ZWxlbWVudCBpZiB0aGUgYm91bmQgcHJvcGVydHkgZXZlciBjaGFuZ2VzCi0gICAgaW4gdGhlIGZ1
dHVyZS4KKyAgICBNYW55IGNvbXB1dGVkIHByb3BlcnRpZXMgaGF2ZSBkZXBlbmRlbmNpZXMgb24g
b3RoZXIgcHJvcGVydGllcy4gRm9yCisgICAgZXhhbXBsZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUs
IHRoZSBgZnVsbE5hbWVgIHByb3BlcnR5IGRlcGVuZHMgb24KKyAgICBgZmlyc3ROYW1lYCBhbmQg
YGxhc3ROYW1lYCB0byBkZXRlcm1pbmUgaXRzIHZhbHVlLiBZb3UgY2FuIHRlbGwgRW1iZXIKKyAg
ICBhYm91dCB0aGVzZSBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzOgogCi0gICAgQG1ldGhvZCBfYXBw
bHlDbGFzc05hbWVCaW5kaW5ncwotICAqLwotICBfYXBwbHlDbGFzc05hbWVCaW5kaW5nczogZnVu
Y3Rpb24oY2xhc3NCaW5kaW5ncykgewotICAgIHZhciBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05h
bWVzLAotICAgIGVsZW0sIG5ld0NsYXNzLCBkYXNoZXJpemVkQ2xhc3M7CisgICAgYGBgamF2YXNj
cmlwdAorICAgIE15QXBwLlByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
Zmlyc3ROYW1lOiAnJywKKyAgICAgIGxhc3ROYW1lOiAgJycsCiAKLSAgICAvLyBMb29wIHRocm91
Z2ggYWxsIG9mIHRoZSBjb25maWd1cmVkIGJpbmRpbmdzLiBUaGVzZSB3aWxsIGJlIGVpdGhlcgot
ICAgIC8vIHByb3BlcnR5IG5hbWVzICgnaXNVcmdlbnQnKSBvciBwcm9wZXJ0eSBwYXRocyByZWxh
dGl2ZSB0byB0aGUgdmlldwotICAgIC8vICgnY29udGVudC5pc1VyZ2VudCcpCi0gICAgYV9mb3JF
YWNoKGNsYXNzQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKKyAgICAgIGZ1bGxOYW1lOiBm
dW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSArICcgJyAr
IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwogCi0gICAgICAvLyBWYXJpYWJsZSBpbiB3aGljaCB0aGUg
b2xkIGNsYXNzIHZhbHVlIGlzIHNhdmVkLiBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24KLSAgICAgIC8v
IGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFibGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmluZyB0byBy
ZW1vdmUgd2hlbgotICAgICAgLy8gdGhlIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgICB2YXIgb2xk
Q2xhc3M7Ci0gICAgICAvLyBFeHRyYWN0IGp1c3QgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSBiaW5k
aW5ncyBsaWtlICdmb286YmFyJwotICAgICAgdmFyIHBhcnNlZFBhdGggPSBFbWJlci5WaWV3Ll9w
YXJzZVByb3BlcnR5UGF0aChiaW5kaW5nKTsKKyAgICAgICAgLy8gVGVsbCBFbWJlci5qcyB0aGF0
IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5hbWUKKyAgICAgICAgLy8g
YW5kIGxhc3ROYW1lCisgICAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQor
ICAgIH0pOworICAgIGBgYAogCi0gICAgICAvLyBTZXQgdXAgYW4gb2JzZXJ2ZXIgb24gdGhlIGNv
bnRleHQuIElmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0b2dnbGUgdGhlCi0gICAgICAvLyBjbGFz
cyBuYW1lLgotICAgICAgdmFyIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIEdl
dCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgICAgbmV3Q2xhc3MgPSB0
aGlzLl9jbGFzc1N0cmluZ0ZvclByb3BlcnR5KGJpbmRpbmcpOwotICAgICAgICBlbGVtID0gdGhp
cy4kKCk7CisgICAgTWFrZSBzdXJlIHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2llcyBzbyBFbWJl
ciBrbm93cyB3aGVuIHRvIHVwZGF0ZQorICAgIGJpbmRpbmdzIHRoYXQgY29ubmVjdCB0byBhIGNv
bXB1dGVkIHByb3BlcnR5LiBDaGFuZ2luZyBhIGRlcGVuZGVuY3kKKyAgICB3aWxsIG5vdCBpbW1l
ZGlhdGVseSB0cmlnZ2VyIGFuIHVwZGF0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHksIGJ1dAor
ICAgIHdpbGwgaW5zdGVhZCBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1cGRhdGVkIHdo
ZW4gdGhlIG5leHQgYGdldGAKKyAgICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5LgogCi0gICAg
ICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQs
IHJlbW92ZSBpdC4KLSAgICAgICAgaWYgKG9sZENsYXNzKSB7Ci0gICAgICAgICAgZWxlbS5yZW1v
dmVDbGFzcyhvbGRDbGFzcyk7Ci0gICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBjbGFzc05h
bWVzIHNvIHRoYXQgaWYgdGhlIHZpZXcgZ2V0cyByZXJlbmRlcmVkLAotICAgICAgICAgIC8vIHRo
ZSBjbGFzcyBkb2Vzbid0IGdldCBhZGRlZCBiYWNrIHRvIHRoZSBET00uCi0gICAgICAgICAgY2xh
c3NOYW1lcy5yZW1vdmVPYmplY3Qob2xkQ2xhc3MpOwotICAgICAgICB9CisgICAgU2VlIFtFbWJl
ci5Db21wdXRlZFByb3BlcnR5XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eS5o
dG1sKSwgW0VtYmVyLmNvbXB1dGVkXSgvYXBpLyNtZXRob2RfY29tcHV0ZWQpLgogCi0gICAgICAg
IC8vIElmIG5lY2Vzc2FyeSwgYWRkIGEgbmV3IGNsYXNzLiBNYWtlIHN1cmUgd2Uga2VlcCB0cmFj
ayBvZiBpdCBzbwotICAgICAgICAvLyBpdCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgot
ICAgICAgICBpZiAobmV3Q2xhc3MpIHsKLSAgICAgICAgICBlbGVtLmFkZENsYXNzKG5ld0NsYXNz
KTsKLSAgICAgICAgICBvbGRDbGFzcyA9IG5ld0NsYXNzOwotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgIG9sZENsYXNzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfTsKKyAgICBAbWV0aG9k
IHByb3BlcnR5CisgICAgQGZvciBGdW5jdGlvbgorICAqLworICBGdW5jdGlvbi5wcm90b3R5cGUu
cHJvcGVydHkgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmV0ID0gRW1iZXIuY29tcHV0ZWQodGhp
cyk7CisgICAgLy8gQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUucHJvcGVydHkgZXhwYW5kcyBw
cm9wZXJ0aWVzOyBubyBuZWVkIGZvciB1cyB0bworICAgIC8vIGRvIHNvIGhlcmUuCisgICAgcmV0
dXJuIHJldC5wcm9wZXJ0eS5hcHBseShyZXQsIGFyZ3VtZW50cyk7CisgIH07CiAKLSAgICAgIC8v
IEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHByb3BlcnR5IGF0IGl0cyBjdXJyZW50IHZhbHVl
Ci0gICAgICBkYXNoZXJpemVkQ2xhc3MgPSB0aGlzLl9jbGFzc1N0cmluZ0ZvclByb3BlcnR5KGJp
bmRpbmcpOworICAvKioKKyAgICBUaGUgYG9ic2VydmVzYCBleHRlbnNpb24gb2YgSmF2YXNjcmlw
dCdzIEZ1bmN0aW9uIHByb3RvdHlwZSBpcyBhdmFpbGFibGUKKyAgICB3aGVuIGBFbWJlci5FWFRF
TkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcwor
ICAgIHRydWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgogCi0gICAgICBpZiAoZGFzaGVyaXplZENs
YXNzKSB7Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGl0IGdldHMgaW50byB0aGUgY2xhc3NOYW1l
cyBhcnJheQotICAgICAgICAvLyBzbyBpdCBpcyBkaXNwbGF5ZWQgd2hlbiB3ZSByZW5kZXIuCi0g
ICAgICAgIGFfYWRkT2JqZWN0KGNsYXNzTmFtZXMsIGRhc2hlcml6ZWRDbGFzcyk7CisgICAgWW91
IGNhbiBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2Vy
dmVzYAorICAgIGNhbGwgdG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4g
Y2xhc3NlcyB0aGF0IHlvdSB3cml0ZS4KKyAgICBGb3IgZXhhbXBsZToKIAotICAgICAgICAvLyBT
YXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBuYW1lIHNvIHdlIGNhbiByZW1vdmUgaXQKLSAg
ICAgICAgLy8gaWYgdGhlIG9ic2VydmVyIGZpcmVzLiBSZW1lbWJlciB0aGF0IHRoaXMgdmFyaWFi
bGUgaGFzCi0gICAgICAgIC8vIGJlZW4gY2xvc2VkIG92ZXIgYnkgdGhlIG9ic2VydmVyLgotICAg
ICAgICBvbGRDbGFzcyA9IGRhc2hlcml6ZWRDbGFzczsKLSAgICAgIH0KKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICB2YWx1ZU9ic2VydmVyOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJ2YWx1ZSIgcHJvcGVy
dHkgY2hhbmdlcworICAgICAgfS5vYnNlcnZlcygndmFsdWUnKQorICAgIH0pOworICAgIGBgYAog
Ci0gICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywgcGFyc2VkUGF0aC5wYXRoLCBvYnNl
cnZlcik7Ci0gICAgICAvLyBSZW1vdmUgY2xhc3NOYW1lIHNvIHdoZW4gdGhlIHZpZXcgaXMgcmVy
ZW5kZXJlZCwKLSAgICAgIC8vIHRoZSBjbGFzc05hbWUgaXMgYWRkZWQgYmFzZWQgb24gYmluZGlu
ZyByZWV2YWx1YXRpb24KLSAgICAgIHRoaXMub25lKCd3aWxsQ2xlYXJSZW5kZXInLCBmdW5jdGlv
bigpIHsKLSAgICAgICAgaWYgKG9sZENsYXNzKSB7Ci0gICAgICAgICAgY2xhc3NOYW1lcy5yZW1v
dmVPYmplY3Qob2xkQ2xhc3MpOwotICAgICAgICAgIG9sZENsYXNzID0gbnVsbDsKLSAgICAgICAg
fQotICAgICAgfSk7CisgICAgSW4gdGhlIGZ1dHVyZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFz
eW5jaHJvbm91cy4gSWYgeW91IHdhbnQgdG8gZW5zdXJlCisgICAgc3luY2hyb25vdXMgYmVoYXZp
b3IsIHVzZSBgb2JzZXJ2ZXNJbW1lZGlhdGVseWAuCiAKLSAgICB9LCB0aGlzKTsKLSAgfSwKKyAg
ICBTZWUgYEVtYmVyLm9ic2VydmVyYC4KIAotICAvKioKLSAgICBAcHJpdmF0ZQorICAgIEBtZXRo
b2Qgb2JzZXJ2ZXMKKyAgICBAZm9yIEZ1bmN0aW9uCisgICovCisgIEZ1bmN0aW9uLnByb3RvdHlw
ZS5vYnNlcnZlcyA9IGZ1bmN0aW9uKCkgeworICAgIAorICAgICAgdGhpcy5fX2VtYmVyX29ic2Vy
dmVzX18gPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAKIAotICAgIEl0ZXJhdGVzIHRo
cm91Z2ggdGhlIHZpZXcncyBhdHRyaWJ1dGUgYmluZGluZ3MsIHNldHMgdXAgb2JzZXJ2ZXJzIGZv
ciBlYWNoLAotICAgIHRoZW4gYXBwbGllcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXR0cmli
dXRlcyB0byB0aGUgcGFzc2VkIHJlbmRlciBidWZmZXIuCisgICAgcmV0dXJuIHRoaXM7CisgIH07
CiAKLSAgICBAbWV0aG9kIF9hcHBseUF0dHJpYnV0ZUJpbmRpbmdzCi0gICAgQHBhcmFtIHtFbWJl
ci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlcgotICAqLwotICBfYXBwbHlBdHRyaWJ1dGVCaW5kaW5nczog
ZnVuY3Rpb24oYnVmZmVyLCBhdHRyaWJ1dGVCaW5kaW5ncykgewotICAgIHZhciBhdHRyaWJ1dGVW
YWx1ZSwgZWxlbSwgdHlwZTsKKyAgLyoqCisgICAgVGhlIGBvYnNlcnZlc0ltbWVkaWF0ZWx5YCBl
eHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1bmN0aW9uIHByb3RvdHlwZSBpcworICAgIGF2YWls
YWJsZSB3aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IKKyAgICBgRW1iZXIuRVhURU5E
X1BST1RPVFlQRVMuRnVuY3Rpb25gIGlzIHRydWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgogCi0g
ICAgYV9mb3JFYWNoKGF0dHJpYnV0ZUJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7Ci0gICAg
ICB2YXIgc3BsaXQgPSBiaW5kaW5nLnNwbGl0KCc6JyksCi0gICAgICAgICAgcHJvcGVydHkgPSBz
cGxpdFswXSwKLSAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gc3BsaXRbMV0gfHwgcHJvcGVydHk7
CisgICAgWW91IGNhbiBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0
aGUgYG9ic2VydmVzSW1tZWRpYXRlbHlgCisgICAgY2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0
aG9kIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgorICAgIEZvciBleGFt
cGxlOgogCi0gICAgICAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgdG8gYWRkL3JlbW92ZS9jaGFuZ2Ug
dGhlIGF0dHJpYnV0ZSBpZiB0aGUKLSAgICAgIC8vIEphdmFTY3JpcHQgcHJvcGVydHkgY2hhbmdl
cy4KLSAgICAgIHZhciBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgICBlbGVtID0gdGhp
cy4kKCk7Ci0gICAgICAgIGlmICghZWxlbSkgeyByZXR1cm47IH0KKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgLy8gRXhlY3V0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICJ2YWx1ZSIg
cHJvcGVydHkgY2hhbmdlcworICAgICAgfS5vYnNlcnZlc0ltbWVkaWF0ZWx5KCd2YWx1ZScpCisg
ICAgfSk7CisgICAgYGBgCiAKLSAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBnZXQodGhpcywgcHJv
cGVydHkpOworICAgIEluIHRoZSBmdXR1cmUsIGBvYnNlcnZlc2AgbWF5IGJlY29tZSBhc3luY2hy
b25vdXMuIEluIHRoaXMgZXZlbnQsCisgICAgYG9ic2VydmVzSW1tZWRpYXRlbHlgIHdpbGwgbWFp
bnRhaW4gdGhlIHN5bmNocm9ub3VzIGJlaGF2aW9yLgogCi0gICAgICAgIEVtYmVyLlZpZXcuYXBw
bHlBdHRyaWJ1dGVCaW5kaW5ncyhlbGVtLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7
Ci0gICAgICB9OworICAgIFNlZSBgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXJgLgogCi0gICAgICB0
aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywgcHJvcGVydHksIG9ic2VydmVyKTsKKyAgICBAbWV0
aG9kIG9ic2VydmVzSW1tZWRpYXRlbHkKKyAgICBAZm9yIEZ1bmN0aW9uCisgICovCisgIEZ1bmN0
aW9uLnByb3RvdHlwZS5vYnNlcnZlc0ltbWVkaWF0ZWx5ID0gZnVuY3Rpb24oKSB7CisgICAgZm9y
ICh2YXIgaT0wLCBsPWFyZ3VtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICB2YXIgYXJn
ID0gYXJndW1lbnRzW2ldOworICAgICAgRW1iZXIuYXNzZXJ0KCJJbW1lZGlhdGUgb2JzZXJ2ZXJz
IG11c3Qgb2JzZXJ2ZSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG9ubHksIG5vdCBwcm9wZXJ0aWVzIG9u
IG90aGVyIG9iamVjdHMuIiwgYXJnLmluZGV4T2YoJy4nKSA9PT0gLTEpOworICAgIH0KIAotICAg
ICAgLy8gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHZhbHVlIGFuZCBhZGQgaXQgdG8gdGhlIHJlbmRl
ciBidWZmZXIKLSAgICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAgICAgIGF0dHJpYnV0ZVZhbHVlID0g
Z2V0KHRoaXMsIHByb3BlcnR5KTsKLSAgICAgIEVtYmVyLlZpZXcuYXBwbHlBdHRyaWJ1dGVCaW5k
aW5ncyhidWZmZXIsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9LCB0aGlz
KTsKLSAgfSwKKyAgICAvLyBvYnNlcnZlcyBoYW5kbGVzIHByb3BlcnR5IGV4cGFuc2lvbgorICAg
IHJldHVybiB0aGlzLm9ic2VydmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH07CiAKICAg
LyoqCi0gICAgQHByaXZhdGUKKyAgICBUaGUgYG9ic2VydmVzQmVmb3JlYCBleHRlbnNpb24gb2Yg
SmF2YXNjcmlwdCdzIEZ1bmN0aW9uIHByb3RvdHlwZSBpcworICAgIGF2YWlsYWJsZSB3aGVuIGBF
bWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IKKyAgICBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMu
RnVuY3Rpb25gIGlzIHRydWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgogCi0gICAgR2l2ZW4gYSBw
cm9wZXJ0eSBuYW1lLCByZXR1cm5zIGEgZGFzaGVyaXplZCB2ZXJzaW9uIG9mIHRoYXQKLSAgICBw
cm9wZXJ0eSBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBldmFsdWF0ZXMgdG8gYSBub24tZmFsc3kgdmFs
dWUuCisgICAgWW91IGNhbiBnZXQgbm90aWZpZWQgd2hlbiBhIHByb3BlcnR5IGNoYW5nZSBpcyBh
Ym91dCB0byBoYXBwZW4gYnkKKyAgICBieSBhZGRpbmcgdGhlIGBvYnNlcnZlc0JlZm9yZWAgY2Fs
bCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kCisgICAgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMg
dGhhdCB5b3Ugd3JpdGUuIEZvciBleGFtcGxlOgogCi0gICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2
aWV3IGhhcyBwcm9wZXJ0eSBgaXNVcmdlbnRgIHRoYXQgZXZhbHVhdGVzIHRvIHRydWUsCi0gICAg
cGFzc2luZyBgaXNVcmdlbnRgIHRvIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGAiaXMtdXJnZW50
ImAuCi0KLSAgICBAbWV0aG9kIF9jbGFzc1N0cmluZ0ZvclByb3BlcnR5Ci0gICAgQHBhcmFtIHBy
b3BlcnR5Ci0gICovCi0gIF9jbGFzc1N0cmluZ0ZvclByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0
eSkgewotICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgo
cHJvcGVydHkpOwotICAgIHZhciBwYXRoID0gcGFyc2VkUGF0aC5wYXRoOworICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1
bmN0aW9uKCkgeworICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9w
ZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UKKyAgICAgIH0ub2JzZXJ2ZXNCZWZvcmUoJ3ZhbHVlJykK
KyAgICB9KTsKKyAgICBgYGAKIAotICAgIHZhciB2YWwgPSBnZXQodGhpcywgcGF0aCk7Ci0gICAg
aWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAg
ICAgdmFsID0gZ2V0KEVtYmVyLmxvb2t1cCwgcGF0aCk7Ci0gICAgfQorICAgIFNlZSBgRW1iZXIu
YmVmb3JlT2JzZXJ2ZXJgLgogCi0gICAgcmV0dXJuIEVtYmVyLlZpZXcuX2NsYXNzU3RyaW5nRm9y
VmFsdWUocGF0aCwgdmFsLCBwYXJzZWRQYXRoLmNsYXNzTmFtZSwgcGFyc2VkUGF0aC5mYWxzeUNs
YXNzTmFtZSk7Ci0gIH0sCisgICAgQG1ldGhvZCBvYnNlcnZlc0JlZm9yZQorICAgIEBmb3IgRnVu
Y3Rpb24KKyAgKi8KKyAgRnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzQmVmb3JlID0gZnVuY3Rp
b24oKSB7CisgICAgCisgICAgICB0aGlzLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyA9IGFfc2xp
Y2UuY2FsbChhcmd1bWVudHMpOworICAgIAogCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gRUxFTUVOVCBTVVBQT1JU
Ci0gIC8vCisgICAgcmV0dXJuIHRoaXM7CisgIH07CiAKICAgLyoqCi0gICAgUmV0dXJucyB0aGUg
Y3VycmVudCBET00gZWxlbWVudCBmb3IgdGhlIHZpZXcuCisgICAgVGhlIGBvbmAgZXh0ZW5zaW9u
IG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCisgICAgd2hl
biBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5G
dW5jdGlvbmAgaXMKKyAgICB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KIAotICAgIEBwcm9w
ZXJ0eSBlbGVtZW50Ci0gICAgQHR5cGUgRE9NRWxlbWVudAotICAqLwotICBlbGVtZW50OiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRl
ZmluZWQpIHsKLSAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5zZXRFbGVtZW50KHRoaXMs
IHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmdl
dEVsZW1lbnQodGhpcyk7Ci0gICAgfQotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKKyAg
ICBZb3UgY2FuIGxpc3RlbiBmb3IgZXZlbnRzIHNpbXBseSBieSBhZGRpbmcgdGhlIGBvbmAgY2Fs
bCB0byB0aGUgZW5kIG9mCisgICAgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMg
b3IgbWl4aW5zIHRoYXQgeW91IHdyaXRlLiBGb3IgZXhhbXBsZToKIAotICAvKioKLSAgICBSZXR1
cm5zIGEgalF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3MgZWxlbWVudC4gSWYgeW91IHBhc3Mg
aW4gYSBzZWxlY3RvcgotICAgIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBqUXVl
cnkgb2JqZWN0LCB1c2luZyB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgYXMgaXRzIGJ1ZmZlci4K
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuTWl4aW4uY3JlYXRlKHsKKyAgICAgIGRvU29t
ZXRoaW5nV2l0aEVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBFeGVjdXRlcyB3aGVu
ZXZlciB0aGUgImRpZEluc2VydEVsZW1lbnQiIGV2ZW50IGZpcmVzCisgICAgICB9Lm9uKCdkaWRJ
bnNlcnRFbGVtZW50JykKKyAgICB9KTsKKyAgICBgYGAKIAotICAgIEZvciBleGFtcGxlLCBjYWxs
aW5nIGB2aWV3LiQoJ2xpJylgIHdpbGwgcmV0dXJuIGEgalF1ZXJ5IG9iamVjdCBjb250YWluaW5n
Ci0gICAgYWxsIG9mIHRoZSBgbGlgIGVsZW1lbnRzIGluc2lkZSB0aGUgRE9NIGVsZW1lbnQgb2Yg
dGhpcyB2aWV3LgorICAgIFNlZSBgRW1iZXIub25gLgogCi0gICAgQHByb3BlcnR5ICQKLSAgICBA
cGFyYW0ge1N0cmluZ30gW3NlbGVjdG9yXSBhIGpRdWVyeS1jb21wYXRpYmxlIHNlbGVjdG9yIHN0
cmluZwotICAgIEByZXR1cm4ge2pRdWVyeX0gdGhlIENvcmVRdWVyeSBvYmplY3QgZm9yIHRoZSBE
T00gbm9kZQorICAgIEBtZXRob2Qgb24KKyAgICBAZm9yIEZ1bmN0aW9uCiAgICovCi0gICQ6IGZ1
bmN0aW9uKHNlbCkgewotICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS4kKHRoaXMsIHNlbCk7
Ci0gIH0sCi0KLSAgbXV0YXRlQ2hpbGRWaWV3czogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICB2
YXIgY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3MsCi0gICAgICAgIGlkeCA9IGNoaWxkVmll
d3MubGVuZ3RoLAotICAgICAgICB2aWV3OworICBGdW5jdGlvbi5wcm90b3R5cGUub24gPSBmdW5j
dGlvbigpIHsKKyAgICB2YXIgZXZlbnRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAg
dGhpcy5fX2VtYmVyX2xpc3RlbnNfXyA9IGV2ZW50czsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsK
K30KIAotICAgIHdoaWxlKC0taWR4ID49IDApIHsKLSAgICAgIHZpZXcgPSBjaGlsZFZpZXdzW2lk
eF07Ci0gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIHZpZXcsIGlkeCk7Ci0gICAgfQogCi0gICAg
cmV0dXJuIHRoaXM7Ci0gIH0sCit9KSgpOwogCi0gIGZvckVhY2hDaGlsZFZpZXc6IGZ1bmN0aW9u
KGNhbGxiYWNrKSB7Ci0gICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOwogCi0g
ICAgaWYgKCFjaGlsZFZpZXdzKSB7IHJldHVybiB0aGlzOyB9CiAKLSAgICB2YXIgbGVuID0gY2hp
bGRWaWV3cy5sZW5ndGgsCi0gICAgICAgIHZpZXcsIGlkeDsKKyhmdW5jdGlvbigpIHsKIAotICAg
IGZvcihpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgICB2aWV3ID0gY2hpbGRWaWV3
c1tpZHhdOwotICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCB2aWV3KTsKLSAgICB9Cit9KSgpOwog
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCiAKLSAgLyoqCi0gICAgQXBwZW5kcyB0aGUgdmlldydz
IGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgZWxlbWVudC4KIAotICAgIElmIHRoZSB2
aWV3IGRvZXMgbm90IGhhdmUgYW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsIGBjcmVhdGVFbGVt
ZW50KClgCi0gICAgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseS4KKyhmdW5jdGlvbigpIHsK
Ky8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLwogCi0gICAg
Tm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVu
ZGVkOyB0aGUgRE9NCi0gICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2
ZW4gZWxlbWVudCB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlzaGVkIHN5bmNocm9u
aXppbmcuCiAKLSAgICBUaGlzIGlzIG5vdCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHlvdSB3
aWxsIG5lZWQgdG8gY2FsbCBkaXJlY3RseSB3aGVuCi0gICAgYnVpbGRpbmcgeW91ciBhcHBsaWNh
dGlvbi4gWW91IG1pZ2h0IGNvbnNpZGVyIHVzaW5nIGBFbWJlci5Db250YWluZXJWaWV3YAotICAg
IGluc3RlYWQuIElmIHlvdSBkbyBuZWVkIHRvIHVzZSBgYXBwZW5kVG9gLCBiZSBzdXJlIHRoYXQg
dGhlIHRhcmdldCBlbGVtZW50Ci0gICAgeW91IGFyZSBwcm92aWRpbmcgaXMgYXNzb2NpYXRlZCB3
aXRoIGFuIGBFbWJlci5BcHBsaWNhdGlvbmAgYW5kIGRvZXMgbm90Ci0gICAgaGF2ZSBhbiBhbmNl
c3RvciBlbGVtZW50IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVtYmVyIHZpZXcuCisvKioK
KyAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvbXBhcmluZyBvYmplY3Rz
LiBBZGQgdGhpcyBtaXhpbiB0bworICBhbnkgY2xhc3MgeW91IGNyZWF0ZSB0aGF0IGNhbiBjb21w
YXJlIGl0cyBpbnN0YW5jZXMuCiAKLSAgICBAbWV0aG9kIGFwcGVuZFRvCi0gICAgQHBhcmFtIHtT
dHJpbmd8RE9NRWxlbWVudHxqUXVlcnl9IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5n
LCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAg
Ki8KLSAgYXBwZW5kVG86IGZ1bmN0aW9uKHRhcmdldCkgewotICAgIC8vIFNjaGVkdWxlIHRoZSBE
T00gZWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4KLSAgICAv
LyBlbGVtZW50IGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkLgotICAgIHRoaXMuX2lu
c2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNh
bm5vdCBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgRW1iZXIuVmlldy4gQ29uc2lkZXIgdXNpbmcgRW1i
ZXIuQ29udGFpbmVyVmlldyBpbnN0ZWFkLiIsICFFbWJlci4kKHRhcmdldCkuaXMoJy5lbWJlci12
aWV3JykgJiYgIUVtYmVyLiQodGFyZ2V0KS5wYXJlbnRzKCkuaXMoJy5lbWJlci12aWV3JykpOwot
ICAgICAgdGhpcy4kKCkuYXBwZW5kVG8odGFyZ2V0KTsKLSAgICB9KTsKKyAgWW91IHNob3VsZCBp
bXBsZW1lbnQgdGhlIGBjb21wYXJlKClgIG1ldGhvZC4KIAotICAgIHJldHVybiB0aGlzOwotICB9
LAorICBAY2xhc3MgQ29tcGFyYWJsZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzaW5jZSBFbWJl
ciAwLjkKKyovCitFbWJlci5Db21wYXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKIAogICAv
KioKLSAgICBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVt
ZW50IHdpdGggdGhpcyB2aWV3J3MKLSAgICBlbGVtZW50LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBo
YXZlIGFuIEhUTUwgcmVwcmVzZW50YXRpb24geWV0LAotICAgIGBjcmVhdGVFbGVtZW50KClgIHdp
bGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCi0KLSAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2Qg
anVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00KLSAgICBlbGVt
ZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVudGlsIGFsbCBi
aW5kaW5ncyBoYXZlCi0gICAgZmluaXNoZWQgc3luY2hyb25pemluZworICAgIE92ZXJyaWRlIHRv
IHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9mIHRoZSB0d28gcGFyYW1ldGVy
cy4gVGhlCisgICAgY29tcGFyZSBtZXRob2Qgc2hvdWxkIHJldHVybjoKIAotICAgIEBtZXRob2Qg
cmVwbGFjZUluCi0gICAgQHBhcmFtIHtTdHJpbmd8RE9NRWxlbWVudHxqUXVlcnl9IEEgc2VsZWN0
b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7
RW1iZXIuVmlld30gcmVjZWl2ZWQKLSAgKi8KLSAgcmVwbGFjZUluOiBmdW5jdGlvbih0YXJnZXQp
IHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVwbGFjZSBhbiBleGlzdGluZyBFbWJl
ci5WaWV3LiBDb25zaWRlciB1c2luZyBFbWJlci5Db250YWluZXJWaWV3IGluc3RlYWQuIiwgIUVt
YmVyLiQodGFyZ2V0KS5pcygnLmVtYmVyLXZpZXcnKSAmJiAhRW1iZXIuJCh0YXJnZXQpLnBhcmVu
dHMoKS5pcygnLmVtYmVyLXZpZXcnKSk7CisgICAgLSBgLTFgIGlmIGBhIDwgYmAKKyAgICAtIGAw
YCBpZiBgYSA9PSBiYAorICAgIC0gYDFgIGlmIGBhID4gYmAKIAotICAgIHRoaXMuX2luc2VydEVs
ZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVyLiQodGFyZ2V0KS5lbXB0eSgpOwot
ICAgICAgdGhpcy4kKCkuYXBwZW5kVG8odGFyZ2V0KTsKLSAgICB9KTsKKyAgICBEZWZhdWx0IGlt
cGxlbWVudGF0aW9uIHJhaXNlcyBhbiBleGNlcHRpb24uCiAKLSAgICByZXR1cm4gdGhpczsKLSAg
fSwKKyAgICBAbWV0aG9kIGNvbXBhcmUKKyAgICBAcGFyYW0gYSB7T2JqZWN0fSB0aGUgZmlyc3Qg
b2JqZWN0IHRvIGNvbXBhcmUKKyAgICBAcGFyYW0gYiB7T2JqZWN0fSB0aGUgc2Vjb25kIG9iamVj
dCB0byBjb21wYXJlCisgICAgQHJldHVybiB7SW50ZWdlcn0gdGhlIHJlc3VsdCBvZiB0aGUgY29t
cGFyaXNvbgorICAqLworICBjb21wYXJlOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbikKIAotICAv
KioKLSAgICBAcHJpdmF0ZQorfSk7CiAKLSAgICBTY2hlZHVsZXMgYSBET00gb3BlcmF0aW9uIHRv
IG9jY3VyIGR1cmluZyB0aGUgbmV4dCByZW5kZXIgcGhhc2UuIFRoaXMKLSAgICBlbnN1cmVzIHRo
YXQgYWxsIGJpbmRpbmdzIGhhdmUgZmluaXNoZWQgc3luY2hyb25pemluZyBiZWZvcmUgdGhlIHZp
ZXcgaXMKLSAgICByZW5kZXJlZC4KIAotICAgIFRvIHVzZSwgcGFzcyBhIGZ1bmN0aW9uIHRoYXQg
cGVyZm9ybXMgYSBET00gb3BlcmF0aW9uLgorfSkoKTsKIAotICAgIEJlZm9yZSB5b3VyIGZ1bmN0
aW9uIGlzIGNhbGxlZCwgdGhpcyB2aWV3IGFuZCBhbGwgY2hpbGQgdmlld3Mgd2lsbCByZWNlaXZl
Ci0gICAgdGhlIGB3aWxsSW5zZXJ0RWxlbWVudGAgZXZlbnQuIEFmdGVyIHlvdXIgZnVuY3Rpb24g
aXMgaW52b2tlZCwgdGhpcyB2aWV3Ci0gICAgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3Mgd2ls
bCByZWNlaXZlIHRoZSBgZGlkSW5zZXJ0RWxlbWVudGAgZXZlbnQuCiAKLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmlldy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9uKCkgewotICAgICAgdGhp
cy5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICB0aGlzLiQoKS5hcHBlbmRUbygnYm9keScpOwotICAg
IH0pOwotICAgIGBgYAogCi0gICAgQG1ldGhvZCBfaW5zZXJ0RWxlbWVudExhdGVyCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gZm4gdGhlIGZ1bmN0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgZWxlbWVudCBp
bnRvIHRoZSBET00KLSAgKi8KLSAgX2luc2VydEVsZW1lbnRMYXRlcjogZnVuY3Rpb24oZm4pIHsK
LSAgICB0aGlzLl9zY2hlZHVsZWRJbnNlcnQgPSBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5k
ZXInLCB0aGlzLCAnX2luc2VydEVsZW1lbnQnLCBmbik7Ci0gIH0sCisoZnVuY3Rpb24oKSB7Cisv
KioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KIAotICBfaW5z
ZXJ0RWxlbWVudDogZnVuY3Rpb24gKGZuKSB7Ci0gICAgdGhpcy5fc2NoZWR1bGVkSW5zZXJ0ID0g
bnVsbDsKLSAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnNlcnRFbGVtZW50KHRoaXMsIGZuKTsKLSAg
fSwKIAotICAvKioKLSAgICBBcHBlbmRzIHRoZSB2aWV3J3MgZWxlbWVudCB0byB0aGUgZG9jdW1l
bnQgYm9keS4gSWYgdGhlIHZpZXcgZG9lcwotICAgIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVzZW50
YXRpb24geWV0LCBgY3JlYXRlRWxlbWVudCgpYCB3aWxsIGJlIGNhbGxlZAotICAgIGF1dG9tYXRp
Y2FsbHkuCiAKLSAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhlIHZp
ZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00KLSAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVu
ZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCi0gICAgZmlu
aXNoZWQgc3luY2hyb25pemluZy4KK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKIAotICAgIEBtZXRob2QgYXBwZW5kCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2
ZXIKLSAgKi8KLSAgYXBwZW5kOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5hcHBlbmRU
byhkb2N1bWVudC5ib2R5KTsKLSAgfSwKKy8qKgorICBJbXBsZW1lbnRzIHNvbWUgc3RhbmRhcmQg
bWV0aG9kcyBmb3IgY29weWluZyBhbiBvYmplY3QuIEFkZCB0aGlzIG1peGluIHRvCisgIGFueSBv
YmplY3QgeW91IGNyZWF0ZSB0aGF0IGNhbiBjcmVhdGUgYSBjb3B5IG9mIGl0c2VsZi4gVGhpcyBt
aXhpbiBpcworICBhZGRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBidWlsdC1pbiBhcnJheS4KIAot
ICAvKioKLSAgICBSZW1vdmVzIHRoZSB2aWV3J3MgZWxlbWVudCBmcm9tIHRoZSBlbGVtZW50IHRv
IHdoaWNoIGl0IGlzIGF0dGFjaGVkLgorICBZb3Ugc2hvdWxkIGdlbmVyYWxseSBpbXBsZW1lbnQg
dGhlIGBjb3B5KClgIG1ldGhvZCB0byByZXR1cm4gYSBjb3B5IG9mIHRoZQorICByZWNlaXZlci4K
IAotICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIK
LSAgKi8KLSAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKLSAgICAvLyBXaGF0IHdlIHNob3VsZCByZWFs
bHkgZG8gaGVyZSBpcyB3YWl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHJ1biBsb29wCi0gICAgLy8g
dG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlLWFwcGVuZGVkIHRvIGEgZGlm
ZmVyZW50Ci0gICAgLy8gZWxlbWVudC4KLSAgICAvLyBJbiB0aGUgaW50ZXJpbSwgd2Ugd2lsbCBq
dXN0IHJlLXJlbmRlciBpZiB0aGF0IGhhcHBlbnMuIEl0IGlzIG1vcmUKLSAgICAvLyBpbXBvcnRh
bnQgdGhhbiBlbGVtZW50cyBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgaWYgKCF0aGlzLnJl
bW92ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQoKTsgfQotICAgIHRoaXMuaW52b2tl
UmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgaWYgKHZpZXcuY2xlYXJSZW5kZXJl
ZENoaWxkcmVuKSB7IHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7IH0KLSAgICB9KTsKLSAg
fSwKKyAgTm90ZSB0aGF0IGBmcm96ZW5Db3B5KClgIHdpbGwgb25seSB3b3JrIGlmIHlvdSBhbHNv
IGltcGxlbWVudAorICBgRW1iZXIuRnJlZXphYmxlYC4KIAotICBlbGVtZW50SWQ6IG51bGwsCisg
IEBjbGFzcyBDb3B5YWJsZQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzaW5jZSBFbWJlciAwLjkK
KyovCitFbWJlci5Db3B5YWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAKICAgLyoqCi0gICAg
QXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LiBU
aGUgZGVmYXVsdAotICAgIGltcGxlbWVudGF0aW9uIGxvb2tzIGZvciBhbiBlbGVtZW50IHdpdGgg
YW4gSUQgb2YgYGVsZW1lbnRJZGAgKG9yIHRoZQotICAgIHZpZXcncyBndWlkIGlmIGBlbGVtZW50
SWRgIGlzIG51bGwpLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgcHJvdmlk
ZSB5b3VyIG93biBmb3JtIG9mIGxvb2t1cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRp
c2NvdmVyIHlvdXIKLSAgICBlbGVtZW50IHVzaW5nIGEgQ1NTIGNsYXNzIG5hbWUgaW5zdGVhZCBv
ZiBhbiBJRC4KKyAgICBPdmVycmlkZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNlaXZlci4g
RGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByYWlzZXMKKyAgICBhbiBleGNlcHRpb24uCiAKLSAgICBA
bWV0aG9kIGZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50Ci0gICAgQHBhcmFtIHtET01FbGVtZW50
fSBwYXJlbnRFbGVtZW50IFRoZSBwYXJlbnQncyBET00gZWxlbWVudAotICAgIEByZXR1cm4ge0RP
TUVsZW1lbnR9IFRoZSBkaXNjb3ZlcmVkIGVsZW1lbnQKKyAgICBAbWV0aG9kIGNvcHkKKyAgICBA
cGFyYW0ge0Jvb2xlYW59IGRlZXAgaWYgYHRydWVgLCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0
IHNob3VsZCBiZSBtYWRlCisgICAgQHJldHVybiB7T2JqZWN0fSBjb3B5IG9mIHJlY2VpdmVyCiAg
ICovCi0gIGZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50OiBmdW5jdGlvbihwYXJlbnRFbGVtKSB7
Ci0gICAgdmFyIGlkID0gIiMiICsgdGhpcy5lbGVtZW50SWQ7Ci0gICAgcmV0dXJuIEVtYmVyLiQo
aWQpWzBdIHx8IEVtYmVyLiQoaWQsIHBhcmVudEVsZW0pWzBdOwotICB9LAorICBjb3B5OiBFbWJl
ci5yZXF1aXJlZChGdW5jdGlvbiksCiAKICAgLyoqCi0gICAgQ3JlYXRlcyBhIERPTSByZXByZXNl
bnRhdGlvbiBvZiB0aGUgdmlldyBhbmQgYWxsIG9mIGl0cwotICAgIGNoaWxkIHZpZXdzIGJ5IHJl
Y3Vyc2l2ZWx5IGNhbGxpbmcgdGhlIGByZW5kZXIoKWAgbWV0aG9kLgorICAgIElmIHRoZSBvYmpl
Y3QgaW1wbGVtZW50cyBgRW1iZXIuRnJlZXphYmxlYCwgdGhlbiB0aGlzIHdpbGwgcmV0dXJuIGEg
bmV3CisgICAgY29weSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBmcm96ZW4gYW5kIHRoZSByZWNlaXZl
ciBpZiB0aGUgb2JqZWN0IGlzIGZyb3plbi4KIAotICAgIEFmdGVyIHRoZSBlbGVtZW50IGhhcyBi
ZWVuIGNyZWF0ZWQsIGBkaWRJbnNlcnRFbGVtZW50YCB3aWxsCi0gICAgYmUgY2FsbGVkIG9uIHRo
aXMgdmlldyBhbmQgYWxsIG9mIGl0cyBjaGlsZCB2aWV3cy4KKyAgICBSYWlzZXMgYW4gZXhjZXB0
aW9uIGlmIHlvdSB0cnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBhIG9iamVjdCB0aGF0IGRvZXMK
KyAgICBub3Qgc3VwcG9ydCBmcmVlemluZy4KIAotICAgIEBtZXRob2QgY3JlYXRlRWxlbWVudAot
ICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIGNyZWF0ZUVsZW1lbnQ6
IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2VsZW1lbnQnKSkgeyByZXR1cm4gdGhp
czsgfQotCi0gICAgdmFyIGJ1ZmZlciA9IHRoaXMucmVuZGVyVG9CdWZmZXIoKTsKLSAgICBzZXQo
dGhpcywgJ2VsZW1lbnQnLCBidWZmZXIuZWxlbWVudCgpKTsKKyAgICBZb3Ugc2hvdWxkIHVzZSB0
aGlzIG1ldGhvZCB3aGVuZXZlciB5b3Ugd2FudCBhIGNvcHkgb2YgYSBmcmVlemFibGUgb2JqZWN0
CisgICAgc2luY2UgYSBmcmVlemFibGUgb2JqZWN0IGNhbiBzaW1wbHkgcmV0dXJuIGl0c2VsZiB3
aXRob3V0IGFjdHVhbGx5CisgICAgY29uc3VtaW5nIG1vcmUgbWVtb3J5LgogCi0gICAgcmV0dXJu
IHRoaXM7Ci0gIH0sCisgICAgQG1ldGhvZCBmcm96ZW5Db3B5CisgICAgQHJldHVybiB7T2JqZWN0
fSBjb3B5IG9mIHJlY2VpdmVyIG9yIHJlY2VpdmVyCisgICovCisgIGZyb3plbkNvcHk6IGZ1bmN0
aW9uKCkgeworICAgIGlmIChFbWJlci5GcmVlemFibGUgJiYgRW1iZXIuRnJlZXphYmxlLmRldGVj
dCh0aGlzKSkgeworICAgICAgcmV0dXJuIGdldCh0aGlzLCAnaXNGcm96ZW4nKSA/IHRoaXMgOiB0
aGlzLmNvcHkoKS5mcmVlemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVtYmVy
LkVycm9yKEVtYmVyLlN0cmluZy5mbXQoIiVAIGRvZXMgbm90IHN1cHBvcnQgZnJlZXppbmciLCBb
dGhpc10pKTsKKyAgICB9CisgIH0KK30pOwogCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIGEgdmll
dyBpcyBnb2luZyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSBET00uCit9KSgpOwogCi0g
ICAgQGV2ZW50IHdpbGxJbnNlcnRFbGVtZW50Ci0gICovCi0gIHdpbGxJbnNlcnRFbGVtZW50OiBF
bWJlci5LLAogCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRoZSB2aWV3
IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTS4KLSAgICBPdmVycmlkZSB0aGlzIGZ1bmN0
aW9uIHRvIGRvIGFueSBzZXQgdXAgdGhhdCByZXF1aXJlcyBhbiBlbGVtZW50IGluIHRoZQotICAg
IGRvY3VtZW50IGJvZHkuCiAKLSAgICBAZXZlbnQgZGlkSW5zZXJ0RWxlbWVudAotICAqLwotICBk
aWRJbnNlcnRFbGVtZW50OiBFbWJlci5LLAorKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVt
YmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCiAKLSAgLyoqCi0gICAgQ2FsbGVkIHdo
ZW4gdGhlIHZpZXcgaXMgYWJvdXQgdG8gcmVyZW5kZXIsIGJ1dCBiZWZvcmUgYW55dGhpbmcgaGFz
Ci0gICAgYmVlbiB0b3JuIGRvd24uIFRoaXMgaXMgYSBnb29kIG9wcG9ydHVuaXR5IHRvIHRlYXIg
ZG93biBhbnkgbWFudWFsCi0gICAgb2JzZXJ2ZXJzIHlvdSBoYXZlIGluc3RhbGxlZCBiYXNlZCBv
biB0aGUgRE9NIHN0YXRlCiAKLSAgICBAZXZlbnQgd2lsbENsZWFyUmVuZGVyCi0gICovCi0gIHdp
bGxDbGVhclJlbmRlcjogRW1iZXIuSywKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKIAotICAvKioKLSAgICBAcHJpdmF0ZQorLyoqCisgIFRoZSBgRW1iZXIuRnJlZXphYmxl
YCBtaXhpbiBpbXBsZW1lbnRzIHNvbWUgYmFzaWMgbWV0aG9kcyBmb3IgbWFya2luZyBhbgorICBv
YmplY3QgYXMgZnJvemVuLiBPbmNlIGFuIG9iamVjdCBpcyBmcm96ZW4gaXQgc2hvdWxkIGJlIHJl
YWQgb25seS4gTm8gY2hhbmdlcworICBtYXkgYmUgbWFkZSB0aGUgaW50ZXJuYWwgc3RhdGUgb2Yg
dGhlIG9iamVjdC4KIAotICAgIFJ1biB0aGlzIGNhbGxiYWNrIG9uIHRoZSBjdXJyZW50IHZpZXcg
YW5kIHJlY3Vyc2l2ZWx5IG9uIGNoaWxkIHZpZXdzLgorICAjIyBFbmZvcmNlbWVudAogCi0gICAg
QG1ldGhvZCBpbnZva2VSZWN1cnNpdmVseQotICAgIEBwYXJhbSBmbiB7RnVuY3Rpb259Ci0gICov
Ci0gIGludm9rZVJlY3Vyc2l2ZWx5OiBmdW5jdGlvbihmbikgewotICAgIHZhciBjaGlsZFZpZXdz
ID0gW3RoaXNdLCBjdXJyZW50Vmlld3MsIHZpZXc7CisgIFRvIGZ1bGx5IHN1cHBvcnQgZnJlZXpp
bmcgaW4geW91ciBzdWJjbGFzcywgeW91IG11c3QgaW5jbHVkZSB0aGlzIG1peGluIGFuZAorICBv
dmVycmlkZSBhbnkgbWV0aG9kIHRoYXQgbWlnaHQgYWx0ZXIgYW55IHByb3BlcnR5IG9uIHRoZSBv
YmplY3QgdG8gaW5zdGVhZAorICByYWlzZSBhbiBleGNlcHRpb24uIFlvdSBjYW4gY2hlY2sgdGhl
IHN0YXRlIG9mIGFuIG9iamVjdCBieSBjaGVja2luZyB0aGUKKyAgYGlzRnJvemVuYCBwcm9wZXJ0
eS4KIAotICAgIHdoaWxlIChjaGlsZFZpZXdzLmxlbmd0aCkgewotICAgICAgY3VycmVudFZpZXdz
ID0gY2hpbGRWaWV3cy5zbGljZSgpOwotICAgICAgY2hpbGRWaWV3cyA9IFtdOworICBBbHRob3Vn
aCBmdXR1cmUgdmVyc2lvbnMgb2YgSmF2YVNjcmlwdCBtYXkgc3VwcG9ydCBsYW5ndWFnZS1sZXZl
bCBmcmVlemluZworICBvYmplY3Qgb2JqZWN0cywgdGhhdCBpcyBub3QgdGhlIGNhc2UgdG9kYXku
IEV2ZW4gaWYgYW4gb2JqZWN0IGlzIGZyZWV6YWJsZSwKKyAgaXQgaXMgc3RpbGwgdGVjaG5pY2Fs
bHkgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBvYmplY3QsIGV2ZW4gdGhvdWdoIGl0IGNvdWxkCisg
IGJyZWFrIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdGhhdCBkbyBub3QgZXhwZWN0
IGEgZnJvemVuIG9iamVjdCB0bworICBjaGFuZ2UuIEl0IGlzLCB0aGVyZWZvcmUsIHZlcnkgaW1w
b3J0YW50IHRoYXQgeW91IGFsd2F5cyByZXNwZWN0IHRoZQorICBgaXNGcm96ZW5gIHByb3BlcnR5
IG9uIGFsbCBmcmVlemFibGUgb2JqZWN0cy4KIAotICAgICAgZm9yICh2YXIgaT0wLCBsPWN1cnJl
bnRWaWV3cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHZpZXcgPSBjdXJyZW50Vmlld3Nb
aV07Ci0gICAgICAgIGZuLmNhbGwodmlldywgdmlldyk7Ci0gICAgICAgIGlmICh2aWV3Ll9jaGls
ZFZpZXdzKSB7Ci0gICAgICAgICAgY2hpbGRWaWV3cy5wdXNoLmFwcGx5KGNoaWxkVmlld3MsIHZp
ZXcuX2NoaWxkVmlld3MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9LAorICAjIyBF
eGFtcGxlIFVzYWdlCiAKLSAgdHJpZ2dlclJlY3Vyc2l2ZWx5OiBmdW5jdGlvbihldmVudE5hbWUp
IHsKLSAgICB2YXIgY2hpbGRWaWV3cyA9IFt0aGlzXSwgY3VycmVudFZpZXdzLCB2aWV3OworICBU
aGUgZXhhbXBsZSBiZWxvdyBzaG93cyBhIHNpbXBsZSBvYmplY3QgdGhhdCBpbXBsZW1lbnQgdGhl
IGBFbWJlci5GcmVlemFibGVgCisgIHByb3RvY29sLgogCi0gICAgd2hpbGUgKGNoaWxkVmlld3Mu
bGVuZ3RoKSB7Ci0gICAgICBjdXJyZW50Vmlld3MgPSBjaGlsZFZpZXdzLnNsaWNlKCk7Ci0gICAg
ICBjaGlsZFZpZXdzID0gW107CisgIGBgYGphdmFzY3JpcHQKKyAgQ29udGFjdCA9IEVtYmVyLk9i
amVjdC5leHRlbmQoRW1iZXIuRnJlZXphYmxlLCB7CisgICAgZmlyc3ROYW1lOiBudWxsLAorICAg
IGxhc3ROYW1lOiBudWxsLAogCi0gICAgICBmb3IgKHZhciBpPTAsIGw9Y3VycmVudFZpZXdzLmxl
bmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmlldyA9IGN1cnJlbnRWaWV3c1tpXTsKLSAgICAg
ICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAgICAg
ICBpZiAodmlldy5fY2hpbGRWaWV3cykgewotICAgICAgICAgIGNoaWxkVmlld3MucHVzaC5hcHBs
eShjaGlsZFZpZXdzLCB2aWV3Ll9jaGlsZFZpZXdzKTsKLSAgICAgICAgfQotICAgICAgfQorICAg
IC8vIHN3YXBzIHRoZSBuYW1lcworICAgIHN3YXBOYW1lczogZnVuY3Rpb24oKSB7CisgICAgICBp
ZiAodGhpcy5nZXQoJ2lzRnJvemVuJykpIHRocm93IEVtYmVyLkZST1pFTl9FUlJPUjsKKyAgICAg
IHZhciB0bXAgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7CisgICAgICB0aGlzLnNldCgnZmlyc3RO
YW1lJywgdGhpcy5nZXQoJ2xhc3ROYW1lJykpOworICAgICAgdGhpcy5zZXQoJ2xhc3ROYW1lJywg
dG1wKTsKKyAgICAgIHJldHVybiB0aGlzOwogICAgIH0KLSAgfSwKIAotICAvKioKLSAgICBEZXN0
cm95cyBhbnkgZXhpc3RpbmcgZWxlbWVudCBhbG9uZyB3aXRoIHRoZSBlbGVtZW50IGZvciBhbnkg
Y2hpbGQgdmlld3MKLSAgICBhcyB3ZWxsLiBJZiB0aGUgdmlldyBkb2VzIG5vdCBjdXJyZW50bHkg
aGF2ZSBhIGVsZW1lbnQsIHRoZW4gdGhpcyBtZXRob2QKLSAgICB3aWxsIGRvIG5vdGhpbmcuCisg
IH0pOwogCi0gICAgSWYgeW91IGltcGxlbWVudCBgd2lsbERlc3Ryb3lFbGVtZW50KClgIG9uIHlv
dXIgdmlldywgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCi0gICAgYmUgaW52b2tlZCBvbiB5b3VyIHZp
ZXcgYmVmb3JlIHlvdXIgZWxlbWVudCBpcyBkZXN0cm95ZWQgdG8gZ2l2ZSB5b3UgYQotICAgIGNo
YW5jZSB0byBjbGVhbiB1cCBhbnkgZXZlbnQgaGFuZGxlcnMsIGV0Yy4KKyAgYyA9IENvbnRhY3Qu
Y3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIsIGxhc3ROYW1lOiAiRG9lIiB9KTsKKyAgYy5zd2Fw
TmFtZXMoKTsgIC8vIHJldHVybnMgYworICBjLmZyZWV6ZSgpOworICBjLnN3YXBOYW1lcygpOyAg
Ly8gRVhDRVBUSU9OCisgIGBgYAogCi0gICAgSWYgeW91IHdyaXRlIGEgYHdpbGxEZXN0cm95RWxl
bWVudCgpYCBoYW5kbGVyLCB5b3UgY2FuIGFzc3VtZSB0aGF0IHlvdXIKLSAgICBgZGlkSW5zZXJ0
RWxlbWVudCgpYCBoYW5kbGVyIHdhcyBjYWxsZWQgZWFybGllciBmb3IgdGhlIHNhbWUgZWxlbWVu
dC4KKyAgIyMgQ29weWluZwogCi0gICAgTm9ybWFsbHkgeW91IHdpbGwgbm90IGNhbGwgb3Igb3Zl
cnJpZGUgdGhpcyBtZXRob2QgeW91cnNlbGYsIGJ1dCB5b3UgbWF5Ci0gICAgd2FudCB0byBpbXBs
ZW1lbnQgdGhlIGFib3ZlIGNhbGxiYWNrcyB3aGVuIGl0IGlzIHJ1bi4KKyAgVXN1YWxseSB0aGUg
YEVtYmVyLkZyZWV6YWJsZWAgcHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQgaW4gY29vcGVyYXRpb24g
d2l0aCB0aGUKKyAgYEVtYmVyLkNvcHlhYmxlYCBwcm90b2NvbCwgd2hpY2ggZGVmaW5lcyBhIGBm
cm96ZW5Db3B5KClgIG1ldGhvZCB0aGF0IHdpbGwKKyAgcmV0dXJuIGEgZnJvemVuIG9iamVjdCwg
aWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIGFzIHdlbGwuCiAKLSAgICBAbWV0
aG9kIGRlc3Ryb3lFbGVtZW50Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAg
Ki8KLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmN1cnJl
bnRTdGF0ZS5kZXN0cm95RWxlbWVudCh0aGlzKTsKLSAgfSwKKyAgQGNsYXNzIEZyZWV6YWJsZQor
ICBAbmFtZXNwYWNlIEVtYmVyCisgIEBzaW5jZSBFbWJlciAwLjkKKyovCitFbWJlci5GcmVlemFi
bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewogCiAgIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBl
bGVtZW50IG9mIHRoZSB2aWV3IGlzIGdvaW5nIHRvIGJlIGRlc3Ryb3llZC4gT3ZlcnJpZGUKLSAg
ICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0ZWFyZG93biB0aGF0IHJlcXVpcmVzIGFuIGVsZW1l
bnQsIGxpa2UgcmVtb3ZpbmcKLSAgICBldmVudCBsaXN0ZW5lcnMuCisgICAgU2V0IHRvIGB0cnVl
YCB3aGVuIHRoZSBvYmplY3QgaXMgZnJvemVuLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBkZXRlY3QK
KyAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZyb3plbiBvciBub3QuCiAKLSAgICBAZXZlbnQg
d2lsbERlc3Ryb3lFbGVtZW50CisgICAgQHByb3BlcnR5IGlzRnJvemVuCisgICAgQHR5cGUgQm9v
bGVhbgogICAqLwotICB3aWxsRGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKCkge30sCisgIGlzRnJv
emVuOiBmYWxzZSwKIAogICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgVHJpZ2dlcnMgdGhlIGB3
aWxsRGVzdHJveUVsZW1lbnRgIGV2ZW50ICh3aGljaCBpbnZva2VzIHRoZQotICAgIGB3aWxsRGVz
dHJveUVsZW1lbnQoKWAgbWV0aG9kIGlmIGl0IGV4aXN0cykgb24gdGhpcyB2aWV3IGFuZCBhbGwg
Y2hpbGQKLSAgICB2aWV3cy4KLQotICAgIEJlZm9yZSB0cmlnZ2VyaW5nIGB3aWxsRGVzdHJveUVs
ZW1lbnRgLCBpdCBmaXJzdCB0cmlnZ2VycyB0aGUKLSAgICBgd2lsbENsZWFyUmVuZGVyYCBldmVu
dCByZWN1cnNpdmVseS4KKyAgICBGcmVlemVzIHRoZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2Qg
aGFzIGJlZW4gY2FsbGVkIHRoZSBvYmplY3Qgc2hvdWxkCisgICAgbm8gbG9uZ2VyIGFsbG93IGFu
eSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZC4KIAotICAgIEBtZXRob2QgX25vdGlmeVdpbGxEZXN0
cm95RWxlbWVudAorICAgIEBtZXRob2QgZnJlZXplCisgICAgQHJldHVybiB7T2JqZWN0fSByZWNl
aXZlcgogICAqLwotICBfbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbENsZWFyUmVuZGVyJyk7Ci0gICAgdGhpcy50
cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxEZXN0cm95RWxlbWVudCcpOwotICB9LAotCi0gIF9lbGVt
ZW50V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgIEVtYmVyLnByb3BlcnR5
V2lsbENoYW5nZSh2aWV3LCAnZWxlbWVudCcpOwotICAgIH0pOwotICB9LCAnZWxlbWVudCcpLAor
ICBmcmVlemU6IGZ1bmN0aW9uKCkgeworICAgIGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHJl
dHVybiB0aGlzOworICAgIHNldCh0aGlzLCAnaXNGcm96ZW4nLCB0cnVlKTsKKyAgICByZXR1cm4g
dGhpczsKKyAgfQogCi0gIC8qKgotICAgIEBwcml2YXRlCit9KTsKIAotICAgIElmIHRoaXMgdmll
dydzIGVsZW1lbnQgY2hhbmdlcywgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgb2Yg
b3VyCi0gICAgY2hpbGQgdmlld3Mgc28gdGhhdCB3ZSBkbyBub3QgcmV0YWluIHJlZmVyZW5jZXMg
dG8gRE9NIGVsZW1lbnRzIHRoYXQgYXJlCi0gICAgbm8gbG9uZ2VyIG5lZWRlZC4KK0VtYmVyLkZS
T1pFTl9FUlJPUiA9ICJGcm96ZW4gb2JqZWN0IGNhbm5vdCBiZSBtb2RpZmllZC4iOwogCi0gICAg
QG1ldGhvZCBfZWxlbWVudERpZENoYW5nZQotICAqLwotICBfZWxlbWVudERpZENoYW5nZTogRW1i
ZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0
aW9uKHZpZXcpIHsKLSAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHZpZXcsICdlbGVtZW50
Jyk7Ci0gICAgfSk7Ci0gIH0sICdlbGVtZW50JyksCit9KSgpOwogCi0gIC8qKgotICAgIENhbGxl
ZCB3aGVuIHRoZSBwYXJlbnRWaWV3IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgogCi0gICAgQGV2ZW50
IHBhcmVudFZpZXdEaWRDaGFuZ2UKLSAgKi8KLSAgcGFyZW50Vmlld0RpZENoYW5nZTogRW1iZXIu
SywKIAotICBpbnN0cnVtZW50TmFtZTogJ3ZpZXcnLAorKGZ1bmN0aW9uKCkgeworLyoqCitAbW9k
dWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCiAKLSAgaW5zdHJ1bWVudERl
dGFpbHM6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICBoYXNoLnRlbXBsYXRlID0gZ2V0KHRoaXMsICd0
ZW1wbGF0ZU5hbWUnKTsKLSAgICB0aGlzLl9zdXBlcihoYXNoKTsKLSAgfSwKK3ZhciBmb3JFYWNo
ID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7CiAKLSAgX3JlbmRlclRvQnVmZmVyOiBm
dW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgewotICAgIHRoaXMubGVuZ3Ro
QmVmb3JlUmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgdmFyIGJ1ZmZlciA9
IHRoaXMuX3N1cGVyKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKTsKLSAgICB0aGlzLmxl
bmd0aEFmdGVyUmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7CisvKioKKyAgVGhpcyBt
aXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWluZyBnZW5lcmljIGVudW1lcmFibGVzLiBU
aGVzZSBtZXRob2RzCisgIGNhbiBiZSBhcHBsaWVkIHRvIGFuIG9iamVjdCByZWdhcmRsZXNzIG9m
IHdoZXRoZXIgaXQgaXMgb3JkZXJlZCBvcgorICB1bm9yZGVyZWQuCiAKLSAgICByZXR1cm4gYnVm
ZmVyOwotICB9LAorICBOb3RlIHRoYXQgYW4gRW51bWVyYWJsZSBjYW4gY2hhbmdlIGV2ZW4gaWYg
aXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCisgIEZvciBleGFtcGxlLCBhIE1hcHBl
ZEVudW1lcmFibGUgY2Fubm90IGJlIGRpcmVjdGx5IG1vZGlmaWVkIGJ1dCBpZiBpdHMKKyAgdW5k
ZXJseWluZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCiAKLSAgcmVu
ZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24gKCkgewotICAgIHJldHVybiB0aGlzLmN1cnJl
bnRTdGF0ZS5yZW5kZXJUb0J1ZmZlcklmTmVlZGVkKHRoaXMsIHRoaXMpOwotICB9LAorICAjIyBB
ZGRpbmcgT2JqZWN0cwogCi0gIGJlZm9yZVJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAg
dGhpcy5hcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcihidWZmZXIpOwotICAgIGJ1ZmZlci5wdXNoT3Bl
bmluZ1RhZygpOwotICB9LAorICBUbyBhZGQgYW4gb2JqZWN0IHRvIGFuIGVudW1lcmFibGUsIHVz
ZSB0aGUgYGFkZE9iamVjdCgpYCBtZXRob2QuIFRoaXMKKyAgbWV0aG9kIHdpbGwgb25seSBhZGQg
dGhlIG9iamVjdCB0byB0aGUgZW51bWVyYWJsZSBpZiB0aGUgb2JqZWN0IGlzIG5vdAorICBhbHJl
YWR5IHByZXNlbnQgYW5kIGlzIG9mIGEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGVudW1lcmFibGUu
CiAKLSAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgewotICAgIGJ1ZmZlci5wdXNoQ2xv
c2luZ1RhZygpOwotICB9LAorICBgYGBqYXZhc2NyaXB0CisgIHNldC5hZGRPYmplY3QoY29udGFj
dCk7CisgIGBgYAogCi0gIGFwcGx5QXR0cmlidXRlc1RvQnVmZmVyOiBmdW5jdGlvbihidWZmZXIp
IHsKLSAgICAvLyBDcmVhdGVzIG9ic2VydmVycyBmb3IgYWxsIHJlZ2lzdGVyZWQgY2xhc3MgbmFt
ZSBhbmQgYXR0cmlidXRlIGJpbmRpbmdzLAotICAgIC8vIHRoZW4gYWRkcyB0aGVtIHRvIHRoZSBl
bGVtZW50LgotICAgIHZhciBjbGFzc05hbWVCaW5kaW5ncyA9IGdldCh0aGlzLCAnY2xhc3NOYW1l
QmluZGluZ3MnKTsKLSAgICBpZiAoY2xhc3NOYW1lQmluZGluZ3MubGVuZ3RoKSB7Ci0gICAgICB0
aGlzLl9hcHBseUNsYXNzTmFtZUJpbmRpbmdzKGNsYXNzTmFtZUJpbmRpbmdzKTsKLSAgICB9Cisg
ICMjIFJlbW92aW5nIE9iamVjdHMKIAotICAgIC8vIFBhc3MgdGhlIHJlbmRlciBidWZmZXIgc28g
dGhlIG1ldGhvZCBjYW4gYXBwbHkgYXR0cmlidXRlcyBkaXJlY3RseS4KLSAgICAvLyBUaGlzIGlz
bid0IG5lZWRlZCBmb3IgY2xhc3MgbmFtZSBiaW5kaW5ncyBiZWNhdXNlIHRoZXkgdXNlIHRoZQot
ICAgIC8vIGV4aXN0aW5nIGNsYXNzTmFtZXMgaW5mcmFzdHJ1Y3R1cmUuCi0gICAgdmFyIGF0dHJp
YnV0ZUJpbmRpbmdzID0gZ2V0KHRoaXMsICdhdHRyaWJ1dGVCaW5kaW5ncycpOwotICAgIGlmIChh
dHRyaWJ1dGVCaW5kaW5ncy5sZW5ndGgpIHsKLSAgICAgIHRoaXMuX2FwcGx5QXR0cmlidXRlQmlu
ZGluZ3MoYnVmZmVyLCBhdHRyaWJ1dGVCaW5kaW5ncyk7Ci0gICAgfQorICBUbyByZW1vdmUgYW4g
b2JqZWN0IGZyb20gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0KClgIG1ldGhv
ZC4gVGhpcworICB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBvYmplY3QgaWYgaXQgaXMgcHJlc2VudCBp
biB0aGUgZW51bWVyYWJsZSwgb3RoZXJ3aXNlCisgIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3Qu
CiAKLSAgICBidWZmZXIuc2V0Q2xhc3Nlcyh0aGlzLmNsYXNzTmFtZXMpOwotICAgIGJ1ZmZlci5p
ZCh0aGlzLmVsZW1lbnRJZCk7CisgIGBgYGphdmFzY3JpcHQKKyAgc2V0LnJlbW92ZU9iamVjdChj
b250YWN0KTsKKyAgYGBgCiAKLSAgICB2YXIgcm9sZSA9IGdldCh0aGlzLCAnYXJpYVJvbGUnKTsK
LSAgICBpZiAocm9sZSkgewotICAgICAgYnVmZmVyLmF0dHIoJ3JvbGUnLCByb2xlKTsKLSAgICB9
CisgICMjIEltcGxlbWVudGluZyBJbiBZb3VyIE93biBDb2RlCiAKLSAgICBpZiAoZ2V0KHRoaXMs
ICdpc1Zpc2libGUnKSA9PT0gZmFsc2UpIHsKLSAgICAgIGJ1ZmZlci5zdHlsZSgnZGlzcGxheScs
ICdub25lJyk7Ci0gICAgfQotICB9LAorICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhbiBvYmpl
Y3QgYW5kIHdhbnQgdG8gc3VwcG9ydCB0aGlzIEFQSSwganVzdCBpbmNsdWRlCisgIHRoaXMgbWl4
aW4gaW4geW91ciBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2RzLiBJbiB5
b3VyIHVuaXQKKyAgdGVzdHMsIGJlIHN1cmUgdG8gYXBwbHkgdGhlIEVtYmVyLk11dGFibGVFbnVt
ZXJhYmxlVGVzdHMgdG8geW91ciBvYmplY3QuCiAKLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBTVEFOREFSRCBSRU5E
RVIgUFJPUEVSVElFUwotICAvLworICBAY2xhc3MgTXV0YWJsZUVudW1lcmFibGUKKyAgQG5hbWVz
cGFjZSBFbWJlcgorICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCisqLworRW1iZXIuTXV0YWJsZUVu
dW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwgewogCiAgIC8q
KgotICAgIFRhZyBuYW1lIGZvciB0aGUgdmlldydzIG91dGVyIGVsZW1lbnQuIFRoZSB0YWcgbmFt
ZSBpcyBvbmx5IHVzZWQgd2hlbiBhbgotICAgIGVsZW1lbnQgaXMgZmlyc3QgY3JlYXRlZC4gSWYg
eW91IGNoYW5nZSB0aGUgYHRhZ05hbWVgIGZvciBhbiBlbGVtZW50LCB5b3UKLSAgICBtdXN0IGRl
c3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSB2aWV3IGVsZW1lbnQuCisgICAgX19SZXF1aXJlZC5fXyBZ
b3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBwbHkgdGhpcyBtaXhpbi4KIAotICAg
IEJ5IGRlZmF1bHQsIHRoZSByZW5kZXIgYnVmZmVyIHdpbGwgdXNlIGEgYDxkaXY+YCB0YWcgZm9y
IHZpZXdzLgorICAgIEF0dGVtcHRzIHRvIGFkZCB0aGUgcGFzc2VkIG9iamVjdCB0byB0aGUgcmVj
ZWl2ZXIgaWYgdGhlIG9iamVjdCBpcyBub3QKKyAgICBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGNv
bGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QKKyAgICBoYXMg
bm8gZWZmZWN0LgogCi0gICAgQHByb3BlcnR5IHRhZ05hbWUKLSAgICBAdHlwZSBTdHJpbmcKLSAg
ICBAZGVmYXVsdCBudWxsCisgICAgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgb2YgYSB0eXBlIG5v
dCBzdXBwb3J0ZWQgYnkgdGhlIHJlY2VpdmVyLAorICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxk
IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKworICAgIEBtZXRob2QgYWRkT2JqZWN0CisgICAgQHBhcmFt
IHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgZW51bWVyYWJsZS4KKyAg
ICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgb2JqZWN0CiAgICovCisgIGFkZE9iamVjdDog
RW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAogCi0gIC8vIFdlIGxlYXZlIHRoaXMgbnVsbCBieSBk
ZWZhdWx0IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAgLy8gdGhlIGRl
ZmF1bHQgY2FzZSBhbmQgYSB1c2VyLXNwZWNpZmllZCB0YWcuCi0gIHRhZ05hbWU6IG51bGwsCisg
IC8qKgorICAgIEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxlIHRvIHRo
ZSByZWNlaXZlci4KKworICAgIEBtZXRob2QgYWRkT2JqZWN0cworICAgIEBwYXJhbSB7RW1iZXIu
RW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQuCisgICAgQHJldHVybiB7T2Jq
ZWN0fSByZWNlaXZlcgorICAqLworICBhZGRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Cisg
ICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXModGhpcyk7CisgICAgZm9yRWFjaChvYmplY3Rz
LCBmdW5jdGlvbihvYmopIHsgdGhpcy5hZGRPYmplY3Qob2JqKTsgfSwgdGhpcyk7CisgICAgRW1i
ZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOworICAgIHJldHVybiB0aGlzOworICB9LAogCiAg
IC8qKgotICAgIFRoZSBXQUktQVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5
IHRoaXMgdmlldy4gRm9yIGV4YW1wbGUsIGEKLSAgICBidXR0b24gbWF5IGhhdmUgYSByb2xlIG9m
IHR5cGUgJ2J1dHRvbicsIG9yIGEgcGFuZSBtYXkgaGF2ZSBhIHJvbGUgb2YKLSAgICB0eXBlICdh
bGVydGRpYWxvZycuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBhc3Npc3RpdmUgc29mdHdhcmUg
dG8gaGVscAotICAgIHZpc3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUgcmljaCB3ZWIg
YXBwbGljYXRpb25zLgorICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMg
bWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCiAKLSAgICBUaGUgZnVsbCBsaXN0IG9mIHZhbGlk
IFdBSS1BUklBIHJvbGVzIGlzIGF2YWlsYWJsZSBhdDoKLSAgICBodHRwOi8vd3d3LnczLm9yZy9U
Ui93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRlZ29yaXphdGlvbgorICAgIEF0dGVtcHRzIHRvIHJl
bW92ZSB0aGUgcGFzc2VkIG9iamVjdCBmcm9tIHRoZSByZWNlaXZlciBjb2xsZWN0aW9uIGlmIHRo
ZQorICAgIG9iamVjdCBpcyBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJZiB0aGUgb2JqZWN0
IGlzIG5vdCBwcmVzZW50LAorICAgIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCiAKLSAgICBA
cHJvcGVydHkgYXJpYVJvbGUKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCisg
ICAgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgb2YgYSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhl
IHJlY2VpdmVyLAorICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlv
bi4KKworICAgIEBtZXRob2QgcmVtb3ZlT2JqZWN0CisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVj
dCBUaGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnVtZXJhYmxlLgorICAgIEByZXR1cm4g
e09iamVjdH0gdGhlIHBhc3NlZCBvYmplY3QKICAgKi8KLSAgYXJpYVJvbGU6IG51bGwsCisgIHJl
bW92ZU9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAorCiAKICAgLyoqCi0gICAgU3Rh
bmRhcmQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5IHRvIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVu
dC4gVGhpcwotICAgIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkgaW5oZXJpdHMgYW55IGNsYXNzIG5h
bWVzIGRlZmluZWQgYnkgdGhlIHZpZXcncwotICAgIHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgorICAg
IFJlbW92ZXMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxlIGZyb20gdGhlIHJl
Y2VpdmVyLgogCi0gICAgQHByb3BlcnR5IGNsYXNzTmFtZXMKLSAgICBAdHlwZSBBcnJheQotICAg
IEBkZWZhdWx0IFsnZW1iZXItdmlldyddCisgICAgQG1ldGhvZCByZW1vdmVPYmplY3RzCisgICAg
QHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHJlbW92ZQor
ICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2ZXIKICAgKi8KLSAgY2xhc3NOYW1lczogWydlbWJl
ci12aWV3J10sCisgIHJlbW92ZU9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKKyAgICBFbWJl
ci5iZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgICBmb3JFYWNoKG9iamVjdHMsIGZ1bmN0
aW9uKG9iaikgeyB0aGlzLnJlbW92ZU9iamVjdChvYmopOyB9LCB0aGlzKTsKKyAgICBFbWJlci5l
bmRQcm9wZXJ0eUNoYW5nZXModGhpcyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KIAotICAvKioK
LSAgICBBIGxpc3Qgb2YgcHJvcGVydGllcyBvZiB0aGUgdmlldyB0byBhcHBseSBhcyBjbGFzcyBu
YW1lcy4gSWYgdGhlIHByb3BlcnR5Ci0gICAgaXMgYSBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSBv
ZiB0aGF0IHN0cmluZyB3aWxsIGJlIGFwcGxpZWQgYXMgYSBjbGFzcwotICAgIG5hbWUuCit9KTsK
IAotICAgIGBgYGphdmFzY3JpcHQKLSAgICAvLyBBcHBsaWVzIHRoZSAnaGlnaCcgY2xhc3MgdG8g
dGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIGNsYXNzTmFt
ZUJpbmRpbmdzOiBbJ3ByaW9yaXR5J10KLSAgICAgIHByaW9yaXR5OiAnaGlnaCcKLSAgICB9KTsK
LSAgICBgYGAKK30pKCk7CiAKLSAgICBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGEg
Qm9vbGVhbiwgdGhlIG5hbWUgb2YgdGhhdCBwcm9wZXJ0eSBpcwotICAgIGFkZGVkIGFzIGEgZGFz
aGVyaXplZCBjbGFzcyBuYW1lLgogCi0gICAgYGBgamF2YXNjcmlwdAotICAgIC8vIEFwcGxpZXMg
dGhlICdpcy11cmdlbnQnIGNsYXNzIHRvIHRoZSB2aWV3IGVsZW1lbnQKLSAgICBFbWJlci5WaWV3
LmNyZWF0ZSh7Ci0gICAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc1VyZ2VudCddCi0gICAgICBp
c1VyZ2VudDogdHJ1ZQotICAgIH0pOwotICAgIGBgYAogCi0gICAgSWYgeW91IHdvdWxkIHByZWZl
ciB0byB1c2UgYSBjdXN0b20gdmFsdWUgaW5zdGVhZCBvZiB0aGUgZGFzaGVyaXplZAotICAgIHBy
b3BlcnR5IG5hbWUsIHlvdSBjYW4gcGFzcyBhIGJpbmRpbmcgbGlrZSB0aGlzOgorKGZ1bmN0aW9u
KCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyovCisv
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisvLyBDT05TVEFOVFMKKy8vCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8gQXBwbGll
cyB0aGUgJ3VyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcu
Y3JlYXRlKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50OnVyZ2VudCddCi0g
ICAgICBpc1VyZ2VudDogdHJ1ZQotICAgIH0pOwotICAgIGBgYAordmFyIE9VVF9PRl9SQU5HRV9F
WENFUFRJT04gPSAiSW5kZXggb3V0IG9mIHJhbmdlIiA7Cit2YXIgRU1QVFkgPSBbXTsKIAotICAg
IFRoaXMgbGlzdCBvZiBwcm9wZXJ0aWVzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSB2aWV3J3Mgc3Vw
ZXJjbGFzc2VzIGFzIHdlbGwuCisvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisvLyBIRUxQRVJTCisvLwogCi0gICAgQHByb3BlcnR5
IGNsYXNzTmFtZUJpbmRpbmdzCi0gICAgQHR5cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBbXQotICAq
LwotICBjbGFzc05hbWVCaW5kaW5nczogW10sCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBF
bWJlci5zZXQ7CisKKy8qKgorICBUaGlzIG1peGluIGRlZmluZXMgdGhlIEFQSSBmb3IgbW9kaWZ5
aW5nIGFycmF5LWxpa2Ugb2JqZWN0cy4gVGhlc2UgbWV0aG9kcworICBjYW4gYmUgYXBwbGllZCBv
bmx5IHRvIGEgY29sbGVjdGlvbiB0aGF0IGtlZXBzIGl0cyBpdGVtcyBpbiBhbiBvcmRlcmVkIHNl
dC4KKworICBOb3RlIHRoYXQgYW4gQXJyYXkgY2FuIGNoYW5nZSBldmVuIGlmIGl0IGRvZXMgbm90
IGltcGxlbWVudCB0aGlzIG1peGluLgorICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IGltcGxlbWVu
dCBhIFNwYXJzZUFycmF5IHRoYXQgY2Fubm90IGJlIGRpcmVjdGx5CisgIG1vZGlmaWVkLCBidXQg
aWYgaXRzIHVuZGVybHlpbmcgZW51bWVyYWJsZSBjaGFuZ2VzLCBpdCB3aWxsIGNoYW5nZSBhbHNv
LgorCisgIEBjbGFzcyBNdXRhYmxlQXJyYXkKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAdXNlcyBF
bWJlci5BcnJheQorICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQorKi8KK0VtYmVyLk11
dGFibGVBcnJheSA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5BcnJheSwgRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGUsIHsKIAogICAvKioKLSAgICBBIGxpc3Qgb2YgcHJvcGVydGllcyBvZiB0aGUg
dmlldyB0byBhcHBseSBhcyBhdHRyaWJ1dGVzLiBJZiB0aGUgcHJvcGVydHkgaXMKLSAgICBhIHN0
cmluZyB2YWx1ZSwgdGhlIHZhbHVlIG9mIHRoYXQgc3RyaW5nIHdpbGwgYmUgYXBwbGllZCBhcyB0
aGUgYXR0cmlidXRlLgorICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMg
bWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8g
QXBwbGllcyB0aGUgdHlwZSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQKLSAgICAvLyB3aXRoIHRo
ZSB2YWx1ZSAiYnV0dG9uIiwgbGlrZSA8ZGl2IHR5cGU9ImJ1dHRvbiI+Ci0gICAgRW1iZXIuVmll
dy5jcmVhdGUoewotICAgICAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZSddLAotICAgICAgdHlw
ZTogJ2J1dHRvbicKLSAgICB9KTsKLSAgICBgYGAKKyAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJp
bWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgorICAg
IFlvdSBzaG91bGQgcmVwbGFjZSBhbXQgb2JqZWN0cyBzdGFydGVkIGF0IGlkeCB3aXRoIHRoZSBv
YmplY3RzIGluIHRoZQorICAgIHBhc3NlZCBhcnJheS4gWW91IHNob3VsZCBhbHNvIGNhbGwgYHRo
aXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAKIAotICAgIElmIHRoZSB2YWx1ZSBvZiB0
aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCi0g
ICAgYWRkZWQgYXMgYW4gYXR0cmlidXRlLgorICAgIEBtZXRob2QgcmVwbGFjZQorICAgIEBwYXJh
bSB7TnVtYmVyfSBpZHggU3RhcnRpbmcgaW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElm
CisgICAgICBpZHggPj0gbGVuZ3RoLCB0aGVuIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBhcnJh
eS4KKyAgICBAcGFyYW0ge051bWJlcn0gYW10IE51bWJlciBvZiBlbGVtZW50cyB0aGF0IHNob3Vs
ZCBiZSByZW1vdmVkIGZyb20KKyAgICAgIHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCouCisg
ICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgb2JqZWN0
cyB0aGF0IHNob3VsZCBiZQorICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoK
KyAgKi8KKyAgcmVwbGFjZTogRW1iZXIucmVxdWlyZWQoKSwKKworICAvKioKKyAgICBSZW1vdmUg
YWxsIGVsZW1lbnRzIGZyb20gc2VsZi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91CisgICAgd2FudCB0
byByZXVzZSBhbiBleGlzdGluZyBhcnJheSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBpdC4K
IAogICAgIGBgYGphdmFzY3JpcHQKLSAgICAvLyBSZW5kZXJzIHNvbWV0aGluZyBsaWtlIDxkaXYg
ZW5hYmxlZD0iZW5hYmxlZCI+Ci0gICAgRW1iZXIuVmlldy5jcmVhdGUoewotICAgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnZW5hYmxlZCddLAotICAgICAgZW5hYmxlZDogdHJ1ZQotICAgIH0pOwor
ICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIl07CisgICAgY29sb3IubGVu
Z3RoKCk7ICAgLy8gIDMKKyAgICBjb2xvcnMuY2xlYXIoKTsgICAvLyAgW10KKyAgICBjb2xvcnMu
bGVuZ3RoKCk7ICAvLyAgMAogICAgIGBgYAogCi0gICAgQHByb3BlcnR5IGF0dHJpYnV0ZUJpbmRp
bmdzCisgICAgQG1ldGhvZCBjbGVhcgorICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSBBbiBlbXB0
eSBBcnJheS4KICAgKi8KLSAgYXR0cmlidXRlQmluZGluZ3M6IFtdLAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gQ09S
RSBESVNQTEFZIE1FVEhPRFMKLSAgLy8KKyAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIg
bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICBpZiAobGVuID09PSAwKSByZXR1cm4gdGhp
czsKKyAgICB0aGlzLnJlcGxhY2UoMCwgbGVuLCBFTVBUWSk7CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0sCiAKICAgLyoqCi0gICAgQHByaXZhdGUKKyAgICBUaGlzIHdpbGwgdXNlIHRoZSBwcmltaXRp
dmUgYHJlcGxhY2UoKWAgbWV0aG9kIHRvIGluc2VydCBhbiBvYmplY3QgYXQgdGhlCisgICAgc3Bl
Y2lmaWVkIGluZGV4LgogCi0gICAgU2V0dXAgYSB2aWV3LCBidXQgZG8gbm90IGZpbmlzaCB3YWtp
bmcgaXQgdXAuCi0gICAgLSBjb25maWd1cmUgYGNoaWxkVmlld3NgCi0gICAgLSByZWdpc3RlciB0
aGUgdmlldyB3aXRoIHRoZSBnbG9iYWwgdmlld3MgaGFzaCwgd2hpY2ggaXMgdXNlZCBmb3IgZXZl
bnQKLSAgICAgIGRpc3BhdGNoCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBb
InJlZCIsICJncmVlbiIsICJibHVlIl07CisgICAgY29sb3JzLmluc2VydEF0KDIsICJ5ZWxsb3ci
KTsgIC8vIFsicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIl0KKyAgICBjb2xvcnMuaW5z
ZXJ0QXQoNSwgIm9yYW5nZSIpOyAgLy8gRXJyb3I6IEluZGV4IG91dCBvZiByYW5nZQorICAgIGBg
YAogCi0gICAgQG1ldGhvZCBpbml0CisgICAgQG1ldGhvZCBpbnNlcnRBdAorICAgIEBwYXJhbSB7
TnVtYmVyfSBpZHggaW5kZXggb2YgaW5zZXJ0IHRoZSBvYmplY3QgYXQuCisgICAgQHBhcmFtIHtP
YmplY3R9IG9iamVjdCBvYmplY3QgdG8gaW5zZXJ0CisgICAgQHJldHVybiB0aGlzCiAgICovCi0g
IGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZWxlbWVudElkID0gdGhpcy5lbGVtZW50SWQg
fHwgZ3VpZEZvcih0aGlzKTsKKyAgaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7Cisg
ICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnbGVuZ3RoJykpIHRocm93IG5ldyBFbWJlci5FcnJvcihP
VVRfT0ZfUkFOR0VfRVhDRVBUSU9OKSA7CisgICAgdGhpcy5yZXBsYWNlKGlkeCwgMCwgW29iamVj
dF0pIDsKKyAgICByZXR1cm4gdGhpcyA7CisgIH0sCiAKLSAgICB0aGlzLl9zdXBlcigpOworICAv
KioKKyAgICBSZW1vdmUgYW4gb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdXNpbmcgdGhl
IGByZXBsYWNlKClgIHByaW1pdGl2ZQorICAgIG1ldGhvZC4gWW91IGNhbiBwYXNzIGVpdGhlciBh
IHNpbmdsZSBpbmRleCwgb3IgYSBzdGFydCBhbmQgYSBsZW5ndGguCiAKLSAgICAvLyBzZXR1cCBj
aGlsZCB2aWV3cy4gYmUgc3VyZSB0byBjbG9uZSB0aGUgY2hpbGQgdmlld3MgYXJyYXkgZmlyc3QK
LSAgICB0aGlzLl9jaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cy5zbGljZSgpOworICAgIElm
IHlvdSBwYXNzIGEgc3RhcnQgYW5kIGxlbmd0aCB0aGF0IGlzIGJleW9uZCB0aGUKKyAgICBsZW5n
dGggdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBgT1VUX09GX1JBTkdFX0VYQ0VQVElPTmAuCiAK
LSAgICBFbWJlci5hc3NlcnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZvciAnY2xhc3NOYW1l
QmluZGluZ3MnIiwgRW1iZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lQmluZGluZ3MpID09PSAnYXJy
YXknKTsKLSAgICB0aGlzLmNsYXNzTmFtZUJpbmRpbmdzID0gRW1iZXIuQSh0aGlzLmNsYXNzTmFt
ZUJpbmRpbmdzLnNsaWNlKCkpOworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3JzID0g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ciLCAib3JhbmdlIl07CisgICAgY29sb3Jz
LnJlbW92ZUF0KDApOyAgICAgLy8gWyJncmVlbiIsICJibHVlIiwgInllbGxvdyIsICJvcmFuZ2Ui
XQorICAgIGNvbG9ycy5yZW1vdmVBdCgyLCAyKTsgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJdCisgICAg
Y29sb3JzLnJlbW92ZUF0KDQsIDIpOyAgLy8gRXJyb3I6IEluZGV4IG91dCBvZiByYW5nZQorICAg
IGBgYAogCi0gICAgRW1iZXIuYXNzZXJ0KCJPbmx5IGFycmF5cyBhcmUgYWxsb3dlZCBmb3IgJ2Ns
YXNzTmFtZXMnIiwgRW1iZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lcykgPT09ICdhcnJheScpOwot
ICAgIHRoaXMuY2xhc3NOYW1lcyA9IEVtYmVyLkEodGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOwor
ICAgIEBtZXRob2QgcmVtb3ZlQXQKKyAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgaW5kZXgsIHN0
YXJ0IG9mIHJhbmdlCisgICAgQHBhcmFtIHtOdW1iZXJ9IGxlbiBsZW5ndGggb2YgcGFzc2luZyBy
YW5nZQorICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2ZXIKKyAgKi8KKyAgcmVtb3ZlQXQ6IGZ1
bmN0aW9uKHN0YXJ0LCBsZW4pIHsKKyAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkg
ewogCi0gICAgdmFyIHZpZXdDb250cm9sbGVyID0gZ2V0KHRoaXMsICd2aWV3Q29udHJvbGxlcicp
OwotICAgIGlmICh2aWV3Q29udHJvbGxlcikgewotICAgICAgdmlld0NvbnRyb2xsZXIgPSBnZXQo
dmlld0NvbnRyb2xsZXIpOwotICAgICAgaWYgKHZpZXdDb250cm9sbGVyKSB7Ci0gICAgICAgIHNl
dCh2aWV3Q29udHJvbGxlciwgJ3ZpZXcnLCB0aGlzKTsKKyAgICAgIGlmICgoc3RhcnQgPCAwKSB8
fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVt
YmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwogICAgICAgfQorCisgICAgICAvLyBm
YXN0IGNhc2UKKyAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgbGVuID0gMTsKKyAgICAgIHRo
aXMucmVwbGFjZShzdGFydCwgbGVuLCBFTVBUWSk7CiAgICAgfQotICB9LAogCi0gIGFwcGVuZENo
aWxkOiBmdW5jdGlvbih2aWV3LCBvcHRpb25zKSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0
YXRlLmFwcGVuZENoaWxkKHRoaXMsIHZpZXcsIG9wdGlvbnMpOworICAgIHJldHVybiB0aGlzIDsK
ICAgfSwKIAogICAvKioKLSAgICBSZW1vdmVzIHRoZSBjaGlsZCB2aWV3IGZyb20gdGhlIHBhcmVu
dCB2aWV3LgotCi0gICAgQG1ldGhvZCByZW1vdmVDaGlsZAotICAgIEBwYXJhbSB7RW1iZXIuVmll
d30gdmlldwotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJlbW92
ZUNoaWxkOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgLy8gSWYgd2UncmUgZGVzdHJveWluZywgdGhl
IGVudGlyZSBzdWJ0cmVlIHdpbGwgYmUKLSAgICAvLyBmcmVlZCwgYW5kIHRoZSBET00gd2lsbCBi
ZSBoYW5kbGVkIHNlcGFyYXRlbHksCi0gICAgLy8gc28gbm8gbmVlZCB0byBtZXNzIHdpdGggY2hp
bGRWaWV3cy4KLSAgICBpZiAodGhpcy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICAv
LyB1cGRhdGUgcGFyZW50IG5vZGUKLSAgICBzZXQodmlldywgJ19wYXJlbnRWaWV3JywgbnVsbCk7
Ci0KLSAgICAvLyByZW1vdmUgdmlldyBmcm9tIGNoaWxkVmlld3MgYXJyYXkuCi0gICAgdmFyIGNo
aWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOwotCi0gICAgRW1iZXIuRW51bWVyYWJsZVV0aWxz
LnJlbW92ZU9iamVjdChjaGlsZFZpZXdzLCB2aWV3KTsKKyAgICBQdXNoIHRoZSBvYmplY3Qgb250
byB0aGUgZW5kIG9mIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGBwdXNoKClgIGJ1dCBpdAor
ICAgIGlzIEtWTy1jb21wbGlhbnQuCiAKLSAgICB0aGlzLnByb3BlcnR5RGlkQ2hhbmdlKCdjaGls
ZFZpZXdzJyk7IC8vIEhVSD8hIHdoYXQgaGFwcGVuZWQgdG8gd2lsbCBjaGFuZ2U/CisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiJdOworICAgIGNvbG9y
cy5wdXNoT2JqZWN0KCJibGFjayIpOyAgICAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmxhY2siXQor
ICAgIGNvbG9ycy5wdXNoT2JqZWN0KFsieWVsbG93Il0pOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCBb
InllbGxvdyJdXQorICAgIGBgYAogCi0gICAgcmV0dXJuIHRoaXM7CisgICAgQG1ldGhvZCBwdXNo
T2JqZWN0CisgICAgQHBhcmFtIHsqfSBvYmogb2JqZWN0IHRvIHB1c2gKKyAgICBAcmV0dXJuIFRo
ZSBzYW1lIG9iaiBwYXNzZWQgYXMgcGFyYW0KKyAgKi8KKyAgcHVzaE9iamVjdDogZnVuY3Rpb24o
b2JqKSB7CisgICAgdGhpcy5pbnNlcnRBdChnZXQodGhpcywgJ2xlbmd0aCcpLCBvYmopIDsKKyAg
ICByZXR1cm4gb2JqOwogICB9LAogCiAgIC8qKgotICAgIFJlbW92ZXMgYWxsIGNoaWxkcmVuIGZy
b20gdGhlIGBwYXJlbnRWaWV3YC4KKyAgICBBZGQgdGhlIG9iamVjdHMgaW4gdGhlIHBhc3NlZCBu
dW1lcmFibGUgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIERlZmVycworICAgIG5vdGlmeWluZyBv
YnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRkZWQuCiAKLSAg
ICBAbWV0aG9kIHJlbW92ZUFsbENoaWxkcmVuCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVj
ZWl2ZXIKLSAgKi8KLSAgcmVtb3ZlQWxsQ2hpbGRyZW46IGZ1bmN0aW9uKCkgewotICAgIHJldHVy
biB0aGlzLm11dGF0ZUNoaWxkVmlld3MoZnVuY3Rpb24odmlldykgewotICAgICAgdGhpcy5yZW1v
dmVDaGlsZCh2aWV3KTsKLSAgICB9KTsKLSAgfSwKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFy
IGNvbG9ycyA9IFsicmVkIl07CisgICAgY29sb3JzLnB1c2hPYmplY3RzKFsieWVsbG93IiwgIm9y
YW5nZSJdKTsgIC8vIFsicmVkIiwgInllbGxvdyIsICJvcmFuZ2UiXQorICAgIGBgYAogCi0gIGRl
c3Ryb3lBbGxDaGlsZHJlbjogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMubXV0YXRlQ2hp
bGRWaWV3cyhmdW5jdGlvbih2aWV3KSB7Ci0gICAgICB2aWV3LmRlc3Ryb3koKTsKLSAgICB9KTsK
KyAgICBAbWV0aG9kIHB1c2hPYmplY3RzCisgICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBv
YmplY3RzIHRoZSBvYmplY3RzIHRvIGFkZAorICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNl
aXZlcgorICAqLworICBwdXNoT2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykgeworICAgIGlmICgh
KEVtYmVyLkVudW1lcmFibGUuZGV0ZWN0KG9iamVjdHMpIHx8IEVtYmVyLmlzQXJyYXkob2JqZWN0
cykpKSB7CisgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJNdXN0IHBhc3MgRW1iZXIuRW51bWVy
YWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkjcHVzaE9iamVjdHMiKTsKKyAgICB9CisgICAgdGhp
cy5yZXBsYWNlKGdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOworICAgIHJldHVybiB0
aGlzOwogICB9LAogCiAgIC8qKgotICAgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVu
dFZpZXdgLCBpZiBvbmUgaXMgZm91bmQuIE90aGVyd2lzZQotICAgIGRvZXMgbm90aGluZy4KKyAg
ICBQb3Agb2JqZWN0IGZyb20gYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxlZnQuIFdvcmtzIGp1
c3QgbGlrZSBgcG9wKClgIGJ1dAorICAgIGl0IGlzIEtWTy1jb21wbGlhbnQuCiAKLSAgICBAbWV0
aG9kIHJlbW92ZUZyb21QYXJlbnQKLSAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgot
ICAqLwotICByZW1vdmVGcm9tUGFyZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50ID0g
dGhpcy5fcGFyZW50VmlldzsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IFsi
cmVkIiwgImdyZWVuIiwgImJsdWUiXTsKKyAgICBjb2xvcnMucG9wT2JqZWN0KCk7ICAgLy8gImJs
dWUiCisgICAgY29uc29sZS5sb2coY29sb3JzKTsgIC8vIFsicmVkIiwgImdyZWVuIl0KKyAgICBg
YGAKIAotICAgIC8vIFJlbW92ZSBET00gZWxlbWVudCBmcm9tIHBhcmVudAotICAgIHRoaXMucmVt
b3ZlKCk7CisgICAgQG1ldGhvZCBwb3BPYmplY3QKKyAgICBAcmV0dXJuIG9iamVjdAorICAqLwor
ICBwb3BPYmplY3Q6IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0
aCcpIDsKKyAgICBpZiAobGVuID09PSAwKSByZXR1cm4gbnVsbCA7CiAKLSAgICBpZiAocGFyZW50
KSB7IHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsgfQotICAgIHJldHVybiB0aGlzOworICAgIHZh
ciByZXQgPSB0aGlzLm9iamVjdEF0KGxlbi0xKSA7CisgICAgdGhpcy5yZW1vdmVBdChsZW4tMSwg
MSkgOworICAgIHJldHVybiByZXQgOwogICB9LAogCiAgIC8qKgotICAgIFlvdSBtdXN0IGNhbGwg
YGRlc3Ryb3lgIG9uIGEgdmlldyB0byBkZXN0cm95IHRoZSB2aWV3IChhbmQgYWxsIG9mIGl0cwot
ICAgIGNoaWxkIHZpZXdzKS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgdmlldyBmcm9tIGFueSBwYXJl
bnQgbm9kZSwgdGhlbiBtYWtlCi0gICAgc3VyZSB0aGF0IHRoZSBET00gZWxlbWVudCBtYW5hZ2Vk
IGJ5IHRoZSB2aWV3IGNhbiBiZSByZWxlYXNlZCBieSB0aGUKLSAgICBtZW1vcnkgbWFuYWdlci4K
KyAgICBTaGlmdCBhbiBvYmplY3QgZnJvbSBzdGFydCBvZiBhcnJheSBvciBuaWwgaWYgbm9uZSBh
cmUgbGVmdC4gV29ya3MganVzdAorICAgIGxpa2UgYHNoaWZ0KClgIGJ1dCBpdCBpcyBLVk8tY29t
cGxpYW50LgogCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAqLwotICB3aWxsRGVzdHJveTog
ZnVuY3Rpb24oKSB7Ci0gICAgLy8gY2FsbGluZyB0aGlzLl9zdXBlcigpIHdpbGwgbnVrZSBjb21w
dXRlZCBwcm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMsCi0gICAgLy8gc28gY29sbGVjdCBhbnkgaW5m
b3JtYXRpb24gd2UgbmVlZCBiZWZvcmUgY2FsbGluZyBzdXBlci4KLSAgICB2YXIgY2hpbGRWaWV3
cyA9IHRoaXMuX2NoaWxkVmlld3MsCi0gICAgICAgIHBhcmVudCA9IHRoaXMuX3BhcmVudFZpZXcs
Ci0gICAgICAgIGNoaWxkTGVuLCBpOworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3Jz
ID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdOworICAgIGNvbG9ycy5zaGlmdE9iamVjdCgpOyAg
Ly8gInJlZCIKKyAgICBjb25zb2xlLmxvZyhjb2xvcnMpOyAgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJd
CisgICAgYGBgCiAKLSAgICAvLyBkZXN0cm95IHRoZSBlbGVtZW50IC0tIHRoaXMgd2lsbCBhdm9p
ZCBlYWNoIGNoaWxkIHZpZXcgZGVzdHJveWluZwotICAgIC8vIHRoZSBlbGVtZW50IG92ZXIgYW5k
IG92ZXIgYWdhaW4uLi4KLSAgICBpZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0
cm95RWxlbWVudCgpOyB9CisgICAgQG1ldGhvZCBzaGlmdE9iamVjdAorICAgIEByZXR1cm4gb2Jq
ZWN0CisgICovCisgIHNoaWZ0T2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoZ2V0KHRoaXMs
ICdsZW5ndGgnKSA9PT0gMCkgcmV0dXJuIG51bGwgOworICAgIHZhciByZXQgPSB0aGlzLm9iamVj
dEF0KDApIDsKKyAgICB0aGlzLnJlbW92ZUF0KDApIDsKKyAgICByZXR1cm4gcmV0IDsKKyAgfSwK
IAotICAgIGNoaWxkTGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgZm9yIChpPWNoaWxkTGVu
LTE7IGk+PTA7IGktLSkgewotICAgICAgY2hpbGRWaWV3c1tpXS5yZW1vdmVkRnJvbURPTSA9IHRy
dWU7Ci0gICAgfQorICAvKioKKyAgICBVbnNoaWZ0IGFuIG9iamVjdCB0byBzdGFydCBvZiBhcnJh
eS4gV29ya3MganVzdCBsaWtlIGB1bnNoaWZ0KClgIGJ1dCBpdCBpcworICAgIEtWTy1jb21wbGlh
bnQuCiAKLSAgICAvLyByZW1vdmUgZnJvbSBub24tdmlydHVhbCBwYXJlbnQgdmlldyBpZiB2aWV3
TmFtZSB3YXMgc3BlY2lmaWVkCi0gICAgaWYgKHRoaXMudmlld05hbWUpIHsKLSAgICAgIHZhciBu
b25WaXJ0dWFsUGFyZW50VmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwotICAgICAgaWYg
KG5vblZpcnR1YWxQYXJlbnRWaWV3KSB7Ci0gICAgICAgIHNldChub25WaXJ0dWFsUGFyZW50Vmll
dywgdGhpcy52aWV3TmFtZSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgfQorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgY29sb3JzID0gWyJyZWQiXTsKKyAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgi
eWVsbG93Iik7ICAgIC8vIFsieWVsbG93IiwgInJlZCJdCisgICAgY29sb3JzLnVuc2hpZnRPYmpl
Y3QoWyJibGFjayJdKTsgICAvLyBbWyJibGFjayJdLCAieWVsbG93IiwgInJlZCJdCisgICAgYGBg
CiAKLSAgICAvLyByZW1vdmUgZnJvbSBwYXJlbnQgaWYgZm91bmQuIERvbid0IGNhbGwgcmVtb3Zl
RnJvbVBhcmVudCwKLSAgICAvLyBhcyByZW1vdmVGcm9tUGFyZW50IHdpbGwgdHJ5IHRvIHJlbW92
ZSB0aGUgZWxlbWVudCBmcm9tCi0gICAgLy8gdGhlIERPTSBhZ2Fpbi4KLSAgICBpZiAocGFyZW50
KSB7IHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsgfQorICAgIEBtZXRob2QgdW5zaGlmdE9iamVj
dAorICAgIEBwYXJhbSB7Kn0gb2JqIG9iamVjdCB0byB1bnNoaWZ0CisgICAgQHJldHVybiBUaGUg
c2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCisgICovCisgIHVuc2hpZnRPYmplY3Q6IGZ1bmN0aW9u
KG9iaikgeworICAgIHRoaXMuaW5zZXJ0QXQoMCwgb2JqKSA7CisgICAgcmV0dXJuIG9iaiA7Cisg
IH0sCiAKLSAgICB0aGlzLnRyYW5zaXRpb25UbygnZGVzdHJveWVkJyk7CisgIC8qKgorICAgIEFk
ZHMgdGhlIG5hbWVkIG9iamVjdHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIERlZmVy
cyBub3RpZnlpbmcKKyAgICBvYnNlcnZlcnMgdW50aWwgYWxsIG9iamVjdHMgaGF2ZSBiZWVuIGFk
ZGVkLgogCi0gICAgY2hpbGRMZW4gPSBjaGlsZFZpZXdzLmxlbmd0aDsKLSAgICBmb3IgKGk9Y2hp
bGRMZW4tMTsgaT49MDsgaS0tKSB7Ci0gICAgICBjaGlsZFZpZXdzW2ldLmRlc3Ryb3koKTsKLSAg
ICB9CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBbInJlZCJdOworICAgIGNv
bG9ycy51bnNoaWZ0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8vIFsiYmxhY2siLCAi
d2hpdGUiLCAicmVkIl0KKyAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoInllbGxvdyIpOyAvLyBU
eXBlIEVycm9yOiAndW5kZWZpbmVkJyBpcyBub3QgYSBmdW5jdGlvbgorICAgIGBgYAogCi0gICAg
Ly8gbmV4dCByZW1vdmUgdmlldyBmcm9tIGdsb2JhbCBoYXNoCi0gICAgaWYgKCF0aGlzLmlzVmly
dHVhbCkgZGVsZXRlIEVtYmVyLlZpZXcudmlld3NbZ2V0KHRoaXMsICdlbGVtZW50SWQnKV07Cisg
ICAgQG1ldGhvZCB1bnNoaWZ0T2JqZWN0cworICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0g
b2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVj
ZWl2ZXIKKyAgKi8KKyAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKKyAgICB0
aGlzLnJlcGxhY2UoMCwgMCwgb2JqZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7CiAgIH0sCiAKICAg
LyoqCi0gICAgSW5zdGFudGlhdGVzIGEgdmlldyB0byBiZSBhZGRlZCB0byB0aGUgY2hpbGRWaWV3
cyBhcnJheSBkdXJpbmcgdmlldwotICAgIGluaXRpYWxpemF0aW9uLiBZb3UgZ2VuZXJhbGx5IHdp
bGwgbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgdW5sZXNzCi0gICAgeW91IGFyZSBvdmVy
cmlkaW5nIGBjcmVhdGVDaGlsZFZpZXdzKClgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbAot
ICAgIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBjb3JyZWN0IHNldHRpbmdzIG9uIHRoZSBu
ZXcgdmlldyBpbnN0YW5jZSB0bwotICAgIGFjdCBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQuCisg
ICAgUmV2ZXJzZSBvYmplY3RzIGluIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGByZXZlcnNl
KClgIGJ1dCBpdCBpcworICAgIEtWTy1jb21wbGlhbnQuCiAKLSAgICBAbWV0aG9kIGNyZWF0ZUNo
aWxkVmlldwotICAgIEBwYXJhbSB7Q2xhc3N9IHZpZXdDbGFzcwotICAgIEBwYXJhbSB7SGFzaH0g
W2F0dHJzXSBBdHRyaWJ1dGVzIHRvIGFkZAotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IG5ldyBp
bnN0YW5jZQotICAqLwotICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7
Ci0gICAgaWYgKHZpZXcuaXNWaWV3ICYmIHZpZXcuX3BhcmVudFZpZXcgPT09IHRoaXMpIHsgcmV0
dXJuIHZpZXc7IH0KKyAgICBAbWV0aG9kIHJldmVyc2VPYmplY3RzCisgICAgQHJldHVybiB7RW1i
ZXIuQXJyYXl9IHJlY2VpdmVyCisgICAqLworICByZXZlcnNlT2JqZWN0czogZnVuY3Rpb24oKSB7
CisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgaWYgKGxlbiA9PT0gMCkg
cmV0dXJuIHRoaXM7CisgICAgdmFyIG9iamVjdHMgPSB0aGlzLnRvQXJyYXkoKS5yZXZlcnNlKCk7
CisgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0sCiAKLSAgICBpZiAoRW1iZXIuQ29yZVZpZXcuZGV0ZWN0KHZpZXcpKSB7Ci0gICAgICBhdHRy
cyA9IGF0dHJzIHx8IHt9OwotICAgICAgYXR0cnMuX3BhcmVudFZpZXcgPSB0aGlzOwotICAgICAg
YXR0cnMudGVtcGxhdGVEYXRhID0gYXR0cnMudGVtcGxhdGVEYXRhIHx8IGdldCh0aGlzLCAndGVt
cGxhdGVEYXRhJyk7CisgIC8qKgorICAgIFJlcGxhY2UgYWxsIHRoZSB0aGUgcmVjZWl2ZXIncyBj
b250ZW50IHdpdGggY29udGVudCBvZiB0aGUgYXJndW1lbnQuCisgICAgSWYgYXJndW1lbnQgaXMg
YW4gZW1wdHkgYXJyYXkgcmVjZWl2ZXIgd2lsbCBiZSBjbGVhcmVkLgogCi0gICAgICB2aWV3ID0g
dmlldy5jcmVhdGUoYXR0cnMpOworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3JzID0g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdOworICAgIGNvbG9ycy5zZXRPYmplY3RzKFsiYmxhY2si
LCAid2hpdGUiXSk7ICAvLyBbImJsYWNrIiwgIndoaXRlIl0KKyAgICBjb2xvcnMuc2V0T2JqZWN0
cyhbXSk7ICAgICAgICAgICAgICAgICAgLy8gW10KKyAgICBgYGAKIAotICAgICAgLy8gZG9uJ3Qg
c2V0IHRoZSBwcm9wZXJ0eSBvbiBhIHZpcnR1YWwgdmlldywgYXMgdGhleSBhcmUgaW52aXNpYmxl
IHRvCi0gICAgICAvLyBjb25zdW1lcnMgb2YgdGhlIHZpZXcgQVBJCi0gICAgICBpZiAodmlldy52
aWV3TmFtZSkgeyBzZXQoZ2V0KHRoaXMsICdjb25jcmV0ZVZpZXcnKSwgdmlldy52aWV3TmFtZSwg
dmlldyk7IH0KLSAgICB9IGVsc2UgewotICAgICAgRW1iZXIuYXNzZXJ0KCdZb3UgbXVzdCBwYXNz
IGluc3RhbmNlIG9yIHN1YmNsYXNzIG9mIFZpZXcnLCB2aWV3LmlzVmlldyk7CisgICAgQG1ldGhv
ZCBzZXRPYmplY3RzCisgICAgQHBhcmFtIHtFbWJlci5BcnJheX0gb2JqZWN0cyBhcnJheSB3aG9z
ZSBjb250ZW50IHdpbGwgYmUgdXNlZCBmb3IgcmVwbGFjaW5nCisgICAgICAgIHRoZSBjb250ZW50
IG9mIHRoZSByZWNlaXZlcgorICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlciB3aXRo
IHRoZSBuZXcgY29udGVudAorICAgKi8KKyAgc2V0T2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykg
eworICAgIGlmIChvYmplY3RzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuY2xlYXIoKTsKIAot
ICAgICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgIHZpZXcuc2V0UHJvcGVydGllcyhhdHRycyk7Ci0g
ICAgICB9CisgICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgdGhpcy5yZXBs
YWNlKDAsIGxlbiwgb2JqZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLSAgICAgIGlm
ICghZ2V0KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkgewotICAgICAgICBzZXQodmlldywgJ3RlbXBs
YXRlRGF0YScsIGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJykpOwotICAgICAgfQorICAvLyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisg
IC8vIElNUExFTUVOVCBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQorICAvLwogCi0gICAgICBzZXQo
dmlldywgJ19wYXJlbnRWaWV3JywgdGhpcyk7CisgIHJlbW92ZU9iamVjdDogZnVuY3Rpb24ob2Jq
KSB7CisgICAgdmFyIGxvYyA9IGdldCh0aGlzLCAnbGVuZ3RoJykgfHwgMDsKKyAgICB3aGlsZSgt
LWxvYyA+PSAwKSB7CisgICAgICB2YXIgY3VyT2JqZWN0ID0gdGhpcy5vYmplY3RBdChsb2MpIDsK
KyAgICAgIGlmIChjdXJPYmplY3QgPT09IG9iaikgdGhpcy5yZW1vdmVBdChsb2MpIDsKICAgICB9
Ci0KLSAgICByZXR1cm4gdmlldzsKKyAgICByZXR1cm4gdGhpcyA7CiAgIH0sCiAKLSAgYmVjYW1l
VmlzaWJsZTogRW1iZXIuSywKLSAgYmVjYW1lSGlkZGVuOiBFbWJlci5LLAorICBhZGRPYmplY3Q6
IGZ1bmN0aW9uKG9iaikgeworICAgIGlmICghdGhpcy5jb250YWlucyhvYmopKSB0aGlzLnB1c2hP
YmplY3Qob2JqKTsKKyAgICByZXR1cm4gdGhpcyA7CisgIH0KIAotICAvKioKLSAgICBAcHJpdmF0
ZQorfSk7CiAKLSAgICBXaGVuIHRoZSB2aWV3J3MgYGlzVmlzaWJsZWAgcHJvcGVydHkgY2hhbmdl
cywgdG9nZ2xlIHRoZSB2aXNpYmlsaXR5Ci0gICAgZWxlbWVudCBvZiB0aGUgYWN0dWFsIERPTSBl
bGVtZW50LgorfSkoKTsKIAotICAgIEBtZXRob2QgX2lzVmlzaWJsZURpZENoYW5nZQotICAqLwot
ICBfaXNWaXNpYmxlRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKLSAgICB2
YXIgJGVsID0gdGhpcy4kKCk7Ci0gICAgaWYgKCEkZWwpIHsgcmV0dXJuOyB9CiAKLSAgICB2YXIg
aXNWaXNpYmxlID0gZ2V0KHRoaXMsICdpc1Zpc2libGUnKTsKIAotICAgICRlbC50b2dnbGUoaXNW
aXNpYmxlKTsKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCisqLwogCi0gICAgaWYgKHRoaXMuX2lzQW5jZXN0b3JIaWRkZW4oKSkgeyBy
ZXR1cm47IH0KK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKIAotICAgIGlm
IChpc1Zpc2libGUpIHsKLSAgICAgIHRoaXMuX25vdGlmeUJlY2FtZVZpc2libGUoKTsKLSAgICB9
IGVsc2UgewotICAgICAgdGhpcy5fbm90aWZ5QmVjYW1lSGlkZGVuKCk7Ci0gICAgfQotICB9LCAn
aXNWaXNpYmxlJyksCisvKioKK2BFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGlu
IHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xhc3MKK3RvIGFkZCBhIGB0cmlnZ2VyQWN0aW9u
YCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mgc2ltaWxhciB0byB0aGUgSGFuZGxlYmFycworYHt7YWN0
aW9ufX1gIGhlbHBlci4gSW4gbm9ybWFsIEVtYmVyIHVzYWdlLCB0aGUgYHt7YWN0aW9ufX1gIGhl
bHBlciBpcwordXN1YWxseSB0aGUgYmVzdCBjaG9pY2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRl
biB1c2VmdWwgd2hlbiB5b3UgYXJlCitkb2luZyBtb3JlIGNvbXBsZXggZXZlbnQgaGFuZGxpbmcg
aW4gVmlldyBvYmplY3RzLgogCi0gIF9ub3RpZnlCZWNhbWVWaXNpYmxlOiBmdW5jdGlvbigpIHsK
LSAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZVZpc2libGUnKTsKK1NlZSBhbHNvIGBFbWJlci5WaWV3
VGFyZ2V0QWN0aW9uU3VwcG9ydGAsIHdoaWNoIGhhcwordmlldy1hd2FyZSBkZWZhdWx0cyBmb3Ig
dGFyZ2V0IGFuZCBhY3Rpb25Db250ZXh0LgogCi0gICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1
bmN0aW9uKHZpZXcpIHsKLSAgICAgIHZhciBpc1Zpc2libGUgPSBnZXQodmlldywgJ2lzVmlzaWJs
ZScpOworQGNsYXNzIFRhcmdldEFjdGlvblN1cHBvcnQKK0BuYW1lc3BhY2UgRW1iZXIKK0BleHRl
bmRzIEVtYmVyLk1peGluCisqLworRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IEVtYmVyLk1p
eGluLmNyZWF0ZSh7CisgIHRhcmdldDogbnVsbCwKKyAgYWN0aW9uOiBudWxsLAorICBhY3Rpb25D
b250ZXh0OiBudWxsLAogCi0gICAgICBpZiAoaXNWaXNpYmxlIHx8IGlzVmlzaWJsZSA9PT0gbnVs
bCkgewotICAgICAgICB2aWV3Ll9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0gIH0sCisgIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0Jyk7CiAKLSAgX25vdGlmeUJlY2FtZUhp
ZGRlbjogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVIaWRkZW4nKTsKLSAg
ICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAgdmFyIGlzVmlz
aWJsZSA9IGdldCh2aWV3LCAnaXNWaXNpYmxlJyk7CisgICAgaWYgKEVtYmVyLnR5cGVPZih0YXJn
ZXQpID09PSAic3RyaW5nIikgeworICAgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIHRhcmdldCk7
CisgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IGdldChFbWJlci5sb29r
dXAsIHRhcmdldCk7IH0KKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIHRhcmdldDsKKyAgICB9CisgIH0pLnByb3BlcnR5KCd0YXJnZXQnKSwKIAotICAgICAg
aWYgKGlzVmlzaWJsZSB8fCBpc1Zpc2libGUgPT09IG51bGwpIHsKLSAgICAgICAgdmlldy5fbm90
aWZ5QmVjYW1lSGlkZGVuKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCisgIGFjdGlvbkNvbnRl
eHRPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBhY3Rpb25Db250
ZXh0ID0gZ2V0KHRoaXMsICdhY3Rpb25Db250ZXh0Jyk7CiAKLSAgX2lzQW5jZXN0b3JIaWRkZW46
IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXJlbnQgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsK
KyAgICBpZiAoRW1iZXIudHlwZU9mKGFjdGlvbkNvbnRleHQpID09PSAic3RyaW5nIikgeworICAg
ICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIGFjdGlvbkNvbnRleHQpOworICAgICAgaWYgKHZhbHVl
ID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBnZXQoRW1iZXIubG9va3VwLCBhY3Rpb25Db250ZXh0
KTsgfQorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYWN0
aW9uQ29udGV4dDsKKyAgICB9CisgIH0pLnByb3BlcnR5KCdhY3Rpb25Db250ZXh0JyksCiAKLSAg
ICB3aGlsZSAocGFyZW50KSB7Ci0gICAgICBpZiAoZ2V0KHBhcmVudCwgJ2lzVmlzaWJsZScpID09
PSBmYWxzZSkgeyByZXR1cm4gdHJ1ZTsgfQorICAvKioKKyAgU2VuZCBhbiAiYWN0aW9uIiB3aXRo
IGFuICJhY3Rpb25Db250ZXh0IiB0byBhICJ0YXJnZXQiLiBUaGUgYWN0aW9uLCBhY3Rpb25Db250
ZXh0CisgIGFuZCB0YXJnZXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSBwcm9wZXJ0aWVzIG9mIHRo
ZSBvYmplY3QuIEZvciBleGFtcGxlOgogCi0gICAgICBwYXJlbnQgPSBnZXQocGFyZW50LCAncGFy
ZW50VmlldycpOworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVy
LlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICB0YXJnZXQ6IEVt
YmVyLmNvbXB1dGVkLmFsaWFzKCdjb250cm9sbGVyJyksCisgICAgYWN0aW9uOiAnc2F2ZScsCisg
ICAgYWN0aW9uQ29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRleHQnKSwKKyAgICBj
bGljazogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsgLy8gU2VuZHMg
dGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIKICAgICB9
CisgIH0pOworICBgYGAKIAotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKKyAgVGhlIGB0YXJnZXRg
LCBgYWN0aW9uYCwgYW5kIGBhY3Rpb25Db250ZXh0YCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJvcGVy
dGllcyBvZgorICBhbiBvcHRpb25hbCBvYmplY3QgYXJndW1lbnQgdG8gYHRyaWdnZXJBY3Rpb25g
IGFzIHdlbGwuCiAKLSAgY2xlYXJCdWZmZXI6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuaW52b2tl
UmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgdmlldy5idWZmZXIgPSBudWxsOwot
ICAgIH0pOwotICB9LAorICBgYGBqYXZhc2NyaXB0CisgIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICBjbGljazog
ZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oeworICAgICAgICBhY3Rpb246
ICdzYXZlJywKKyAgICAgICAgdGFyZ2V0OiB0aGlzLmdldCgnY29udHJvbGxlcicpLAorICAgICAg
ICBhY3Rpb25Db250ZXh0OiB0aGlzLmdldCgnY29udGV4dCcpLAorICAgICAgfSk7IC8vIFNlbmRz
IHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAg
ICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCisgICAgfQorICB9KTsKKyAgYGBgCiAK
LSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihzdGF0ZSwgY2hpbGRyZW4pIHsKLSAgICB0aGlzLmN1
cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGVzW3N0YXRlXTsKLSAgICB0aGlzLnN0YXRlID0gc3RhdGU7
CisgIFRoZSBgYWN0aW9uQ29udGV4dGAgZGVmYXVsdHMgdG8gdGhlIG9iamVjdCB5b3UgbWl4aW5n
IGBUYXJnZXRBY3Rpb25TdXBwb3J0YCBpbnRvLgorICBCdXQgYHRhcmdldGAgYW5kIGBhY3Rpb25g
IG11c3QgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBwcm9wZXJ0aWVzIG9yIHdpdGggdGhlIGFyZ3Vt
ZW50CisgIHRvIGB0cmlnZ2VyQWN0aW9uYCwgb3IgYSBjb21iaW5hdGlvbjoKIAotICAgIGlmIChj
aGlsZHJlbiAhPT0gZmFsc2UpIHsKLSAgICAgIHRoaXMuZm9yRWFjaENoaWxkVmlldyhmdW5jdGlv
bih2aWV3KSB7Ci0gICAgICAgIHZpZXcudHJhbnNpdGlvblRvKHN0YXRlKTsKLSAgICAgIH0pOwor
ICBgYGBqYXZhc2NyaXB0CisgIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICB0YXJnZXQ6IEVtYmVyLmNvbXB1dGVk
LmFsaWFzKCdjb250cm9sbGVyJyksCisgICAgY2xpY2s6IGZ1bmN0aW9uKCkgeworICAgICAgdGhp
cy50cmlnZ2VyQWN0aW9uKHsKKyAgICAgICAgYWN0aW9uOiAnc2F2ZScKKyAgICAgIH0pOyAvLyBT
ZW5kcyB0aGUgYHNhdmVgIGFjdGlvbiwgYWxvbmcgd2l0aCBhIHJlZmVyZW5jZSB0byBgdGhpc2As
CisgICAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgogICAgIH0KLSAgfSwKKyAg
fSk7CisgIGBgYAogCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gRVZFTlQgSEFORExJTkcKLSAgLy8KKyAgQG1ldGhvZCB0
cmlnZ2VyQWN0aW9uCisgIEBwYXJhbSBvcHRzIHtIYXNofSAob3B0aW9uYWwsIHdpdGggdGhlIG9w
dGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQgYW5kL29yIGFjdGlvbkNvbnRleHQpCisgIEByZXR1
cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFjdGlvbiB3YXMgc2VudCBzdWNjZXNzZnVsbHkgYW5k
IGRpZCBub3QgcmV0dXJuIGZhbHNlCisgICovCisgIHRyaWdnZXJBY3Rpb246IGZ1bmN0aW9uKG9w
dHMpIHsKKyAgICBvcHRzID0gb3B0cyB8fCB7fTsKKyAgICB2YXIgYWN0aW9uID0gb3B0cy5hY3Rp
b24gfHwgZ2V0KHRoaXMsICdhY3Rpb24nKSwKKyAgICAgICAgdGFyZ2V0ID0gb3B0cy50YXJnZXQg
fHwgZ2V0KHRoaXMsICd0YXJnZXRPYmplY3QnKSwKKyAgICAgICAgYWN0aW9uQ29udGV4dCA9IG9w
dHMuYWN0aW9uQ29udGV4dDsKIAotICAvKioKLSAgICBAcHJpdmF0ZQorICAgIGZ1bmN0aW9uIGFy
Z3Mob3B0aW9ucywgYWN0aW9uTmFtZSkgeworICAgICAgdmFyIHJldCA9IFtdOworICAgICAgaWYg
KGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KIAotICAgIEhhbmRsZSBldmVu
dHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYAorICAgICAgcmV0dXJuIHJldC5jb25jYXQo
b3B0aW9ucyk7CisgICAgfQogCi0gICAgQG1ldGhvZCBoYW5kbGVFdmVudAotICAgIEBwYXJhbSBl
dmVudE5hbWUge1N0cmluZ30KLSAgICBAcGFyYW0gZXZ0IHtFdmVudH0KLSAgKi8KLSAgaGFuZGxl
RXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZXZ0KSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVu
dFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMsIGV2ZW50TmFtZSwgZXZ0KTsKLSAgfSwKKyAgICBpZiAo
dHlwZW9mIGFjdGlvbkNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICBhY3Rpb25Db250
ZXh0ID0gZ2V0KHRoaXMsICdhY3Rpb25Db250ZXh0T2JqZWN0JykgfHwgdGhpczsKKyAgICB9CiAK
LSAgcmVnaXN0ZXJPYnNlcnZlcjogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdGFyZ2V0LCBvYnNlcnZl
cikgewotICAgIEVtYmVyLmFkZE9ic2VydmVyKHJvb3QsIHBhdGgsIHRhcmdldCwgb2JzZXJ2ZXIp
OworICAgIGlmICh0YXJnZXQgJiYgYWN0aW9uKSB7CisgICAgICB2YXIgcmV0OwogCi0gICAgdGhp
cy5vbmUoJ3dpbGxDbGVhclJlbmRlcicsIGZ1bmN0aW9uKCkgewotICAgICAgRW1iZXIucmVtb3Zl
T2JzZXJ2ZXIocm9vdCwgcGF0aCwgdGFyZ2V0LCBvYnNlcnZlcik7Ci0gICAgfSk7Ci0gIH0KKyAg
ICAgIGlmICh0YXJnZXQuc2VuZCkgeworICAgICAgICByZXQgPSB0YXJnZXQuc2VuZC5hcHBseSh0
YXJnZXQsIGFyZ3MoYWN0aW9uQ29udGV4dCwgYWN0aW9uKSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBFbWJlci5hc3NlcnQoIlRoZSBhY3Rpb24gJyIgKyBhY3Rpb24gKyAiJyBkaWQgbm90IGV4
aXN0IG9uICIgKyB0YXJnZXQsIHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9PT0gJ2Z1bmN0aW9uJyk7
CisgICAgICAgIHJldCA9IHRhcmdldFthY3Rpb25dLmFwcGx5KHRhcmdldCwgYXJncyhhY3Rpb25D
b250ZXh0KSk7CisgICAgICB9CisKKyAgICAgIGlmIChyZXQgIT09IGZhbHNlKSByZXQgPSB0cnVl
OwogCisgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICB9CiB9KTsKIAotLyoKLSAgRGVzY3JpYmUgaG93IHRoZSBzcGVjaWZpZWQgYWN0
aW9ucyBzaG91bGQgYmVoYXZlIGluIHRoZSB2YXJpb3VzCi0gIHN0YXRlcyB0aGF0IGEgdmlldyBj
YW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKK30pKCk7CiAKLSAgKiBwcmVSZW5kZXI6IHdo
ZW4gYSB2aWV3IGlzIGZpcnN0IGluc3RhbnRpYXRlZCwgYW5kIGFmdGVyIGl0cwotICAgIGVsZW1l
bnQgd2FzIGRlc3Ryb3llZCwgaXQgaXMgaW4gdGhlIHByZVJlbmRlciBzdGF0ZQotICAqIGluQnVm
ZmVyOiBvbmNlIGEgdmlldyBoYXMgYmVlbiByZW5kZXJlZCwgYnV0IGJlZm9yZSBpdCBoYXMKLSAg
ICBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSwgaXQgaXMgaW4gdGhlIGluQnVmZmVyIHN0YXRl
Ci0gICogaW5ET006IG9uY2UgYSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSBp
dCBpcyBpbgotICAgIHRoZSBpbkRPTSBzdGF0ZS4gQSB2aWV3IHNwZW5kcyB0aGUgdmFzdCBtYWpv
cml0eSBvZiBpdHMKLSAgICBleGlzdGVuY2UgaW4gdGhpcyBzdGF0ZS4KLSAgKiBkZXN0cm95ZWQ6
IG9uY2UgYSB2aWV3IGhhcyBiZWVuIGRlc3Ryb3llZCAodXNpbmcgdGhlIGRlc3Ryb3kKLSAgICBt
ZXRob2QpLCBpdCBpcyBpbiB0aGlzIHN0YXRlLiBObyBmdXJ0aGVyIGFjdGlvbnMgY2FuIGJlIGlu
dm9rZWQKLSAgICBvbiBhIGRlc3Ryb3llZCB2aWV3LgorCisKKyhmdW5jdGlvbigpIHsKKy8qKgor
QG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiAqLwogCi0gIC8vIGluIHRo
ZSBkZXN0cm95ZWQgc3RhdGUsIGV2ZXJ5dGhpbmcgaXMgaWxsZWdhbAorLyoqCisgIFRoaXMgbWl4
aW4gYWxsb3dzIGZvciBFbWJlciBvYmplY3RzIHRvIHN1YnNjcmliZSB0byBhbmQgZW1pdCBldmVu
dHMuCiAKLSAgLy8gYmVmb3JlIHJlbmRlcmluZyBoYXMgYmVndW4sIGFsbCBsZWdhbCBtYW5pcHVs
YXRpb25zIGFyZSBub29wcy4KKyAgYGBgamF2YXNjcmlwdAorICBBcHAuUGVyc29uID0gRW1iZXIu
T2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVkLCB7CisgICAgZ3JlZXQ6IGZ1bmN0aW9uKCkgewor
ICAgICAgLy8gLi4uCisgICAgICB0aGlzLnRyaWdnZXIoJ2dyZWV0Jyk7CisgICAgfQorICB9KTsK
IAotICAvLyBpbnNpZGUgdGhlIGJ1ZmZlciwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgZG9uZSBv
biB0aGUgYnVmZmVyCisgIHZhciBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpOwogCi0gIC8v
IG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBsZWdhbCBtYW5p
cHVsYXRpb25zCi0gIC8vIGFyZSBkb25lIG9uIHRoZSBET00gZWxlbWVudC4KKyAgcGVyc29uLm9u
KCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCdPdXIgcGVyc29uIGhhcyBn
cmVldGVkJyk7CisgIH0pOwogCi12YXIgRE9NTWFuYWdlciA9IHsKLSAgcHJlcGVuZDogZnVuY3Rp
b24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLnByZXBlbmQoaHRtbCk7Ci0gIH0sCisgIHBl
cnNvbi5ncmVldCgpOwogCi0gIGFmdGVyOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7Ci0gICAgdmll
dy4kKCkuYWZ0ZXIoaHRtbCk7Ci0gIH0sCisgIC8vIG91dHB1dHM6ICdPdXIgcGVyc29uIGhhcyBn
cmVldGVkJworICBgYGAKIAotICBodG1sOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7Ci0gICAgdmll
dy4kKCkuaHRtbChodG1sKTsKLSAgfSwKKyAgWW91IGNhbiBhbHNvIGNoYWluIG11bHRpcGxlIGV2
ZW50IHN1YnNjcmlwdGlvbnM6CiAKLSAgcmVwbGFjZTogZnVuY3Rpb24odmlldykgewotICAgIHZh
ciBlbGVtZW50ID0gZ2V0KHZpZXcsICdlbGVtZW50Jyk7CisgIGBgYGphdmFzY3JpcHQKKyAgcGVy
c29uLm9uKCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCdPdXIgcGVyc29u
IGhhcyBncmVldGVkJyk7CisgIH0pLm9uZSgnZ3JlZXQnLCBmdW5jdGlvbigpIHsKKyAgICBjb25z
b2xlLmxvZygnT2ZmZXIgb25lLXRpbWUgc3BlY2lhbCcpOworICB9KS5vZmYoJ2V2ZW50JywgdGhp
cywgZm9yZ2V0VGhpcyk7CisgIGBgYAogCi0gICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7
CisgIEBjbGFzcyBFdmVudGVkCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAqLworRW1iZXIuRXZlbnRl
ZCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAKLSAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0ZXIo
ZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJlci4kKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGdldCh2aWV3
LCAnZWxlbWVudCcpKTsKLSAgICB9KTsKLSAgfSwKKyAgLyoqCisgICBTdWJzY3JpYmVzIHRvIGEg
bmFtZWQgZXZlbnQgd2l0aCBnaXZlbiBmdW5jdGlvbi4KIAotICByZW1vdmU6IGZ1bmN0aW9uKHZp
ZXcpIHsKLSAgICB2aWV3LiQoKS5yZW1vdmUoKTsKKyAgIGBgYGphdmFzY3JpcHQKKyAgIHBlcnNv
bi5vbignZGlkTG9hZCcsIGZ1bmN0aW9uKCkgeworICAgICAvLyBmaXJlZCBvbmNlIHRoZSBwZXJz
b24gaGFzIGxvYWRlZAorICAgfSk7CisgICBgYGAKKworICAgQW4gb3B0aW9uYWwgdGFyZ2V0IGNh
biBiZSBwYXNzZWQgaW4gYXMgdGhlIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwKKyAgIGJlIHNldCBh
cyB0aGUgInRoaXMiIGZvciB0aGUgY2FsbGJhY2suIFRoaXMgaXMgYSBnb29kIHdheSB0byBnaXZl
IHlvdXIKKyAgIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgb2JqZWN0IHRyaWdnZXJpbmcgdGhlIGV2
ZW50LiBXaGVuIHRoZSB0YXJnZXQKKyAgIHBhcmFtZXRlciBpcyB1c2VkIHRoZSBjYWxsYmFjayBi
ZWNvbWVzIHRoZSB0aGlyZCBhcmd1bWVudC4KKworICAgQG1ldGhvZCBvbgorICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CisgICBAcGFyYW0ge09iamVjdH0gW3Rh
cmdldF0gVGhlICJ0aGlzIiBiaW5kaW5nIGZvciB0aGUgY2FsbGJhY2sKKyAgIEBwYXJhbSB7RnVu
Y3Rpb259IG1ldGhvZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgQHJldHVybiB0aGlzCisg
ICovCisgIG9uOiBmdW5jdGlvbihuYW1lLCB0YXJnZXQsIG1ldGhvZCkgeworICAgIEVtYmVyLmFk
ZExpc3RlbmVyKHRoaXMsIG5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICByZXR1cm4gdGhpczsK
ICAgfSwKIAotICBlbXB0eTogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcuJCgpLmVtcHR5KCk7
Ci0gIH0KLX07CisgIC8qKgorICAgIFN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBhIG5hbWVkIGV2
ZW50IGFuZCB0aGVuIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbgorICAgIGFmdGVyIHRoZSBmaXJz
dCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIEl0IGlzIGdvb2QgdG8gdXNlIGBgb25lYGAg
d2hlbgorICAgIHlvdSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IHRpbWUgYW4gZXZlbnQgaGFz
IHRha2VuIHBsYWNlLgogCi1FbWJlci5WaWV3LnJlb3Blbih7Ci0gIGRvbU1hbmFnZXI6IERPTU1h
bmFnZXIKLX0pOworICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gb3B0aW9uYWwgMm5kIGFyZ3Vt
ZW50IHRoYXQgd2lsbCBiZWNvbWUgdGhlICJ0aGlzIgorICAgIHZhbHVlIGZvciB0aGUgY2FsbGJh
Y2suIElmIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIHRoZW4gdGhlIDNyZCBhcmd1bWVudAorICAg
IGJlY29tZXMgdGhlIGZ1bmN0aW9uLgogCi1FbWJlci5WaWV3LnJlb3BlbkNsYXNzKHsKKyAgICBA
bWV0aG9kIG9uZQorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVu
dAorICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgInRoaXMiIGJpbmRpbmcgZm9yIHRo
ZSBjYWxsYmFjaworICAgIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgIEByZXR1cm4gdGhpcworICAqLworICBvbmU6IGZ1bmN0aW9uKG5hbWUsIHRh
cmdldCwgbWV0aG9kKSB7CisgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgIG1ldGhvZCA9IHRhcmdl
dDsKKyAgICAgIHRhcmdldCA9IG51bGw7CisgICAgfQorCisgICAgRW1iZXIuYWRkTGlzdGVuZXIo
dGhpcywgbmFtZSwgdGFyZ2V0LCBtZXRob2QsIHRydWUpOworICAgIHJldHVybiB0aGlzOworICB9
LAogCiAgIC8qKgotICAgIEBwcml2YXRlCisgICAgVHJpZ2dlcnMgYSBuYW1lZCBldmVudCBmb3Ig
dGhlIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgd2lsbCBiZSBwYXNzZWQg
YXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gdGhl
CisgICAgZXZlbnQuCiAKLSAgICBQYXJzZSBhIHBhdGggYW5kIHJldHVybiBhbiBvYmplY3Qgd2hp
Y2ggaG9sZHMgdGhlIHBhcnNlZCBwcm9wZXJ0aWVzLgorICAgIGBgYGphdmFzY3JpcHQKKyAgICBw
ZXJzb24ub24oJ2RpZEVhdCcsIGZ1bmN0aW9uKGZvb2QpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdw
ZXJzb24gYXRlIHNvbWUgJyArIGZvb2QpOworICAgIH0pOwogCi0gICAgRm9yIGV4YW1wbGUgYSBw
YXRoIGxpa2UgImNvbnRlbnQuaXNFbmFibGVkOmVuYWJsZWQ6ZGlzYWJsZWQiIHdpbCByZXR1cm4g
dGhlCi0gICAgZm9sbG93aW5nIG9iamVjdDoKKyAgICBwZXJzb24udHJpZ2dlcignZGlkRWF0Jywg
J2Jyb2Njb2xpJyk7CiAKLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAgICAgcGF0aDogImNv
bnRlbnQuaXNFbmFibGVkIiwKLSAgICAgIGNsYXNzTmFtZTogImVuYWJsZWQiLAotICAgICAgZmFs
c3lDbGFzc05hbWU6ICJkaXNhYmxlZCIsCi0gICAgICBjbGFzc05hbWVzOiAiOmVuYWJsZWQ6ZGlz
YWJsZWQiCi0gICAgfQorICAgIC8vIG91dHB1dHM6IHBlcnNvbiBhdGUgc29tZSBicm9jY29saQog
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBfcGFyc2VQcm9wZXJ0eVBhdGgKLSAgICBAc3RhdGljCisg
ICAgQG1ldGhvZCB0cmlnZ2VyCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2Yg
dGhlIGV2ZW50CisgICAgQHBhcmFtIHtPYmplY3QuLi59IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRz
IHRvIHBhc3Mgb24KICAgKi8KLSAgX3BhcnNlUHJvcGVydHlQYXRoOiBmdW5jdGlvbihwYXRoKSB7
Ci0gICAgdmFyIHNwbGl0ID0gcGF0aC5zcGxpdCgnOicpLAotICAgICAgICBwcm9wZXJ0eVBhdGgg
PSBzcGxpdFswXSwKLSAgICAgICAgY2xhc3NOYW1lcyA9ICIiLAotICAgICAgICBjbGFzc05hbWUs
Ci0gICAgICAgIGZhbHN5Q2xhc3NOYW1lOwotCi0gICAgLy8gY2hlY2sgaWYgdGhlIHByb3BlcnR5
IGlzIGRlZmluZWQgYXMgcHJvcDpjbGFzcyBvciBwcm9wOnRydWVDbGFzczpmYWxzZUNsYXNzCi0g
ICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHsKLSAgICAgIGNsYXNzTmFtZSA9IHNwbGl0WzFdOwot
ICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMykgeyBmYWxzeUNsYXNzTmFtZSA9IHNwbGl0WzJd
OyB9Ci0KLSAgICAgIGNsYXNzTmFtZXMgPSAnOicgKyBjbGFzc05hbWU7Ci0gICAgICBpZiAoZmFs
c3lDbGFzc05hbWUpIHsgY2xhc3NOYW1lcyArPSAiOiIgKyBmYWxzeUNsYXNzTmFtZTsgfQorICB0
cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGFyZ3MgPSBbXSwgaSwgbDsKKyAgICBm
b3IgKGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgYXJn
cy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICAgfQorICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCBu
YW1lLCBhcmdzKTsKKyAgfSwKIAotICAgIHJldHVybiB7Ci0gICAgICBwYXRoOiBwcm9wZXJ0eVBh
dGgsCi0gICAgICBjbGFzc05hbWVzOiBjbGFzc05hbWVzLAotICAgICAgY2xhc3NOYW1lOiAoY2xh
c3NOYW1lID09PSAnJykgPyB1bmRlZmluZWQgOiBjbGFzc05hbWUsCi0gICAgICBmYWxzeUNsYXNz
TmFtZTogZmFsc3lDbGFzc05hbWUKLSAgICB9OworICAvKioKKyAgICBDYW5jZWxzIHN1YnNjcmlw
dGlvbiBmb3IgZ2l2ZW4gbmFtZSwgdGFyZ2V0LCBhbmQgbWV0aG9kLgorCisgICAgQG1ldGhvZCBv
ZmYKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQKKyAgICBA
cGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHN1YnNjcmlwdGlvbgorICAg
IEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUgZnVuY3Rpb24gb2YgdGhlIHN1YnNjcmlwdGlv
bgorICAgIEByZXR1cm4gdGhpcworICAqLworICBvZmY6IGZ1bmN0aW9uKG5hbWUsIHRhcmdldCwg
bWV0aG9kKSB7CisgICAgRW1iZXIucmVtb3ZlTGlzdGVuZXIodGhpcywgbmFtZSwgdGFyZ2V0LCBt
ZXRob2QpOworICAgIHJldHVybiB0aGlzOwogICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRlCisg
ICAgQ2hlY2tzIHRvIHNlZSBpZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRpb25zIGZvciBuYW1l
ZCBldmVudC4KIAotICAgIEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZSwgYmFz
ZWQgb24gdGhlIHBhdGgsIG9wdGlvbmFsCi0gICAgYGNsYXNzTmFtZWAgYW5kIG9wdGlvbmFsIGBm
YWxzeUNsYXNzTmFtZWAuCisgICAgQG1ldGhvZCBoYXMKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQKKyAgICBAcmV0dXJuIHtCb29sZWFufSBkb2VzIHRoZSBv
YmplY3QgaGF2ZSBhIHN1YnNjcmlwdGlvbiBmb3IgZXZlbnQKKyAgICovCisgIGhhczogZnVuY3Rp
b24obmFtZSkgeworICAgIHJldHVybiBFbWJlci5oYXNMaXN0ZW5lcnModGhpcywgbmFtZSk7Cisg
IH0KK30pOwogCi0gICAgLSBpZiBhIGBjbGFzc05hbWVgIG9yIGBmYWxzeUNsYXNzTmFtZWAgaGFz
IGJlZW4gc3BlY2lmaWVkOgotICAgICAgLSBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBgY2xh
c3NOYW1lYCBoYXMgYmVlbiBzcGVjaWZpZWQsIAotICAgICAgICBgY2xhc3NOYW1lYCBpcyByZXR1
cm5lZAotICAgICAgLSBpZiB0aGUgdmFsdWUgaXMgZmFsc3kgYW5kIGBmYWxzeUNsYXNzTmFtZWAg
aGFzIGJlZW4gc3BlY2lmaWVkLCAKLSAgICAgICAgYGZhbHN5Q2xhc3NOYW1lYCBpcyByZXR1cm5l
ZAotICAgICAgLSBvdGhlcndpc2UgYG51bGxgIGlzIHJldHVybmVkCi0gICAgLSBpZiB0aGUgdmFs
dWUgaXMgYHRydWVgLCB0aGUgZGFzaGVyaXplZCBsYXN0IHBhcnQgb2YgdGhlIHN1cHBsaWVkIHBh
dGggCi0gICAgICBpcyByZXR1cm5lZAotICAgIC0gaWYgdGhlIHZhbHVlIGlzIG5vdCBgZmFsc2Vg
LCBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIHRoZSBgdmFsdWVgIAotICAgICAgaXMgcmV0dXJuZWQK
LSAgICAtIGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVzIGFwcGx5LCBgbnVsbGAgaXMgcmV0dXJu
ZWQKK30pKCk7CiAKLSAgICBAbWV0aG9kIF9jbGFzc1N0cmluZ0ZvclZhbHVlCi0gICAgQHBhcmFt
IHBhdGgKLSAgICBAcGFyYW0gdmFsCi0gICAgQHBhcmFtIGNsYXNzTmFtZQotICAgIEBwYXJhbSBm
YWxzeUNsYXNzTmFtZQotICAgIEBzdGF0aWMKLSAgKi8KLSAgX2NsYXNzU3RyaW5nRm9yVmFsdWU6
IGZ1bmN0aW9uKHBhdGgsIHZhbCwgY2xhc3NOYW1lLCBmYWxzeUNsYXNzTmFtZSkgewotICAgIC8v
IFdoZW4gdXNpbmcgdGhlIGNvbG9uIHN5bnRheCwgZXZhbHVhdGUgdGhlIHRydXRoaW5lc3Mgb3Ig
ZmFsc2luZXNzCi0gICAgLy8gb2YgdGhlIHZhbHVlIHRvIGRldGVybWluZSB3aGljaCBjbGFzc05h
bWUgdG8gcmV0dXJuCi0gICAgaWYgKGNsYXNzTmFtZSB8fCBmYWxzeUNsYXNzTmFtZSkgewotICAg
ICAgaWYgKGNsYXNzTmFtZSAmJiAhIXZhbCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwog
Ci0gICAgICB9IGVsc2UgaWYgKGZhbHN5Q2xhc3NOYW1lICYmICF2YWwpIHsKLSAgICAgICAgcmV0
dXJuIGZhbHN5Q2xhc3NOYW1lOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVs
bDsKLSAgICAgIH0KLQotICAgIC8vIElmIHZhbHVlIGlzIGEgQm9vbGVhbiBhbmQgdHJ1ZSwgcmV0
dXJuIHRoZSBkYXNoZXJpemVkIHByb3BlcnR5Ci0gICAgLy8gbmFtZS4KLSAgICB9IGVsc2UgaWYg
KHZhbCA9PT0gdHJ1ZSkgewotICAgICAgLy8gTm9ybWFsaXplIHByb3BlcnR5IHBhdGggdG8gYmUg
c3VpdGFibGUgZm9yIHVzZQotICAgICAgLy8gYXMgYSBjbGFzcyBuYW1lLiBGb3IgZXhhcGxlLCBj
b250ZW50LmZvby5iYXJCYXoKLSAgICAgIC8vIGJlY29tZXMgYmFyLWJhei4KLSAgICAgIHZhciBw
YXJ0cyA9IHBhdGguc3BsaXQoJy4nKTsKLSAgICAgIHJldHVybiBFbWJlci5TdHJpbmcuZGFzaGVy
aXplKHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7CiAKLSAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90
IGZhbHNlLCB1bmRlZmluZWQsIG9yIG51bGwsIHJldHVybiB0aGUgY3VycmVudAotICAgIC8vIHZh
bHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICB9IGVsc2UgaWYgKHZhbCAhPT0gZmFsc2UgJiYgdmFs
ICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gdmFsOworKGZ1
bmN0aW9uKCkgewordmFyIFJTVlAgPSByZXF1aXJlTW9kdWxlKCJyc3ZwIik7CiAKLSAgICAvLyBO
b3RoaW5nIHRvIGRpc3BsYXkuIFJldHVybiBudWxsIHNvIHRoYXQgdGhlIG9sZCBjbGFzcyBpcyBy
ZW1vdmVkCi0gICAgLy8gYnV0IG5vIG5ldyBjbGFzcyBpcyBhZGRlZC4KLSAgICB9IGVsc2Ugewot
ICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9CitSU1ZQLmNvbmZpZ3VyZSgnYXN5bmMnLCBm
dW5jdGlvbihjYWxsYmFjaywgcHJvbWlzZSkgeworICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlv
bnMnLCBwcm9taXNlLCBjYWxsYmFjaywgcHJvbWlzZSk7CiB9KTsKIAotLyoqCi0gIEdsb2JhbCB2
aWV3cyBoYXNoCi0KLSAgQHByb3BlcnR5IHZpZXdzCi0gIEBzdGF0aWMKLSAgQHR5cGUgSGFzaAot
Ki8KLUVtYmVyLlZpZXcudmlld3MgPSB7fTsKLQotLy8gSWYgc29tZW9uZSBvdmVycmlkZXMgdGhl
IGNoaWxkIHZpZXdzIGNvbXB1dGVkIHByb3BlcnR5IHdoZW4KLS8vIGRlZmluaW5nIHRoZWlyIGNs
YXNzLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gcHJvY2VzcyB0aGUgdXNlcidzCi0vLyBzdXBwbGll
ZCBjaGlsZFZpZXdzIGFuZCB0aGVuIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbXB1dGVkIHByb3Bl
cnR5Ci0vLyBhdCB2aWV3IGluaXRpYWxpemF0aW9uIHRpbWUuIFRoaXMgaGFwcGVucyBpbiBFbWJl
ci5Db250YWluZXJWaWV3J3MgaW5pdAotLy8gbWV0aG9kLgotRW1iZXIuVmlldy5jaGlsZFZpZXdz
UHJvcGVydHkgPSBjaGlsZFZpZXdzUHJvcGVydHk7Ci0KLUVtYmVyLlZpZXcuYXBwbHlBdHRyaWJ1
dGVCaW5kaW5ncyA9IGZ1bmN0aW9uKGVsZW0sIG5hbWUsIHZhbHVlKSB7Ci0gIHZhciB0eXBlID0g
RW1iZXIudHlwZU9mKHZhbHVlKTsKLQotICAvLyBpZiB0aGlzIGNoYW5nZXMsIGFsc28gY2hhbmdl
IHRoZSBsb2dpYyBpbiBlbWJlci1oYW5kbGViYXJzL2xpYi9oZWxwZXJzL2JpbmRpbmcuanMKLSAg
aWYgKG5hbWUgIT09ICd2YWx1ZScgJiYgKHR5cGUgPT09ICdzdHJpbmcnIHx8ICh0eXBlID09PSAn
bnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpKSkpIHsKLSAgICBpZiAodmFsdWUgIT09IGVsZW0uYXR0
cihuYW1lKSkgewotICAgICAgZWxlbS5hdHRyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0gIH0gZWxz
ZSBpZiAobmFtZSA9PT0gJ3ZhbHVlJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHsKLSAgICBpZiAo
dmFsdWUgIT09IGVsZW0ucHJvcChuYW1lKSkgewotICAgICAgLy8gdmFsdWUgYW5kIGJvb2xlYW5z
IHNob3VsZCBhbHdheXMgYmUgcHJvcGVydGllcwotICAgICAgZWxlbS5wcm9wKG5hbWUsIHZhbHVl
KTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIXZhbHVlKSB7Ci0gICAgZWxlbS5yZW1vdmVBdHRyKG5h
bWUpOwotICB9CitSU1ZQLlByb21pc2UucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbihjYWxsYmFj
aywgbGFiZWwpeworICBFbWJlci5kZXByZWNhdGUoJ1JTVlAuUHJvbWlzZS5mYWlsIGhhcyBiZWVu
IHJlbmFtZWQgYXMgUlNWUC5Qcm9taXNlLmNhdGNoJyk7CisgIHJldHVybiB0aGlzWydjYXRjaCdd
KGNhbGxiYWNrLCBsYWJlbCk7CiB9OwogCi1FbWJlci5WaWV3LnN0YXRlcyA9IHN0YXRlczsKKy8q
KgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLwogCi19KSgpOwor
dmFyIGdldCA9IEVtYmVyLmdldDsKIAorLyoqCisgIEBjbGFzcyBEZWZlcnJlZAorICBAbmFtZXNw
YWNlIEVtYmVyCisgKi8KK0VtYmVyLkRlZmVycmVkTWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUo
eworICAvKioKKyAgICBBZGQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVk
IG9iamVjdCBpcyByZXNvbHZlZCBvciByZWplY3RlZC4KIAorICAgIEBtZXRob2QgdGhlbgorICAg
IEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxs
ZWQgd2hlbiBkb25lCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ICBhIGNhbGxiYWNrIGZ1
bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZhaWxlZAorICAqLworICB0aGVuOiBmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QsIGxhYmVsKSB7CisgICAgdmFyIGRlZmVycmVkLCBwcm9taXNlLCBlbnRp
dHk7CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci12aWV3cwotKi8KKyAgICBlbnRpdHkgPSB0aGlzOworICAgIGRlZmVycmVkID0gZ2V0KHRoaXMs
ICdfZGVmZXJyZWQnKTsKKyAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTsKIAotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworICAgIGZ1bmN0aW9uIGZ1bGZpbGxtZW50
SGFuZGxlcihmdWxmaWxsbWVudCkgeworICAgICAgaWYgKGZ1bGZpbGxtZW50ID09PSBwcm9taXNl
KSB7CisgICAgICAgIHJldHVybiByZXNvbHZlKGVudGl0eSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICByZXR1cm4gcmVzb2x2ZShmdWxmaWxsbWVudCk7CisgICAgICB9CisgICAgfQogCi1FbWJl
ci5WaWV3LnN0YXRlcy5fZGVmYXVsdCA9IHsKLSAgLy8gYXBwZW5kQ2hpbGQgaXMgb25seSBsZWdh
bCB3aGlsZSByZW5kZXJpbmcgdGhlIGJ1ZmZlci4KLSAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKCkg
ewotICAgIHRocm93ICJZb3UgY2FuJ3QgdXNlIGFwcGVuZENoaWxkIG91dHNpZGUgb2YgdGhlIHJl
bmRlcmluZyBwcm9jZXNzIjsKKyAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUgJiYgZnVs
ZmlsbG1lbnRIYW5kbGVyLCByZWplY3QsIGxhYmVsKTsKICAgfSwKIAotICAkOiBmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9LAorICAvKioKKyAgICBSZXNvbHZlIGEgRGVm
ZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBgZG9uZUNhbGxiYWNrc2Agd2l0aCB0aGUgZ2l2ZW4g
YXJncy4KIAotICBnZXRFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAg
fSwKKyAgICBAbWV0aG9kIHJlc29sdmUKKyAgKi8KKyAgcmVzb2x2ZTogZnVuY3Rpb24odmFsdWUp
IHsKKyAgICB2YXIgZGVmZXJyZWQsIHByb21pc2U7CiAKLSAgLy8gSGFuZGxlIGV2ZW50cyBmcm9t
IGBFbWJlci5FdmVudERpc3BhdGNoZXJgCi0gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbigpIHsKLSAg
ICByZXR1cm4gdHJ1ZTsgLy8gY29udGludWUgZXZlbnQgcHJvcGFnYXRpb24KLSAgfSwKKyAgICBk
ZWZlcnJlZCA9IGdldCh0aGlzLCAnX2RlZmVycmVkJyk7CisgICAgcHJvbWlzZSA9IGRlZmVycmVk
LnByb21pc2U7CiAKLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBzZXQo
dmlldywgJ2VsZW1lbnQnLCBudWxsKTsKLSAgICBpZiAodmlldy5fc2NoZWR1bGVkSW5zZXJ0KSB7
Ci0gICAgICBFbWJlci5ydW4uY2FuY2VsKHZpZXcuX3NjaGVkdWxlZEluc2VydCk7Ci0gICAgICB2
aWV3Ll9zY2hlZHVsZWRJbnNlcnQgPSBudWxsOworICAgIGlmICh2YWx1ZSA9PT0gdGhpcykgewor
ICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9taXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVm
ZXJyZWQucmVzb2x2ZSh2YWx1ZSk7CiAgICAgfQotICAgIHJldHVybiB2aWV3OwogICB9LAogCi0g
IHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gZmFsc2U7
CisgIC8qKgorICAgIFJlamVjdCBhIERlZmVycmVkIG9iamVjdCBhbmQgY2FsbCBhbnkgYGZhaWxD
YWxsYmFja3NgIHdpdGggdGhlIGdpdmVuIGFyZ3MuCisKKyAgICBAbWV0aG9kIHJlamVjdAorICAq
LworICByZWplY3Q6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgZ2V0KHRoaXMsICdfZGVmZXJyZWQn
KS5yZWplY3QodmFsdWUpOwogICB9LAogCi0gIHJlcmVuZGVyOiBFbWJlci5LCi19OworICBfZGVm
ZXJyZWQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBSU1ZQLmRlZmVy
KCdFbWJlcjogRGVmZXJyZWRNaXhpbiAtICcgKyB0aGlzKTsKKyAgfSkKK30pOworCiAKIH0pKCk7
CiAKQEAgLTE1OTM4LDIxMyArMTc3NDgsMTk1IEBAIEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0
ID0gewogKGZ1bmN0aW9uKCkgewogLyoqCiBAbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVy
LXZpZXdzCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKICovCiAKLXZhciBwcmVSZW5kZXIgPSBF
bWJlci5WaWV3LnN0YXRlcy5wcmVSZW5kZXIgPSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0
ZXMuX2RlZmF1bHQpOwordmFyIGdldCA9IEVtYmVyLmdldCwgdHlwZU9mID0gRW1iZXIudHlwZU9m
OwogCi1FbWJlci5tZXJnZShwcmVSZW5kZXIsIHsKLSAgLy8gYSB2aWV3IGxlYXZlcyB0aGUgcHJl
UmVuZGVyIHN0YXRlIG9uY2UgaXRzIGVsZW1lbnQgaGFzIGJlZW4KLSAgLy8gY3JlYXRlZCAoY3Jl
YXRlRWxlbWVudCkuCi0gIGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIGZuKSB7Ci0gICAg
dmlldy5jcmVhdGVFbGVtZW50KCk7Ci0gICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJ
bnNlcnRFbGVtZW50Jyk7Ci0gICAgLy8gYWZ0ZXIgY3JlYXRlRWxlbWVudCwgdGhlIHZpZXcgd2ls
bCBiZSBpbiB0aGUgaGFzRWxlbWVudCBzdGF0ZS4KLSAgICBmbi5jYWxsKHZpZXcpOwotICAgIHZp
ZXcudHJhbnNpdGlvblRvKCdpbkRPTScpOwotICAgIHZpZXcudHJpZ2dlclJlY3Vyc2l2ZWx5KCdk
aWRJbnNlcnRFbGVtZW50Jyk7Ci0gIH0sCisvKioKKyAgVGhlIGBFbWJlci5BY3Rpb25IYW5kbGVy
YCBtaXhpbiBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIG1vdmluZyBhbiBgYWN0aW9uc2AKKyAgcHJv
cGVydHkgdG8gYW4gYF9hY3Rpb25zYCBwcm9wZXJ0eSBhdCBleHRlbmQgdGltZSwgYW5kIGFkZGlu
ZyBgX2FjdGlvbnNgCisgIHRvIHRoZSBvYmplY3QncyBtZXJnZWRQcm9wZXJ0aWVzIGxpc3QuCiAK
LSAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24odmlldykgewotICAgIHJldHVybiB2
aWV3LnJlbmRlclRvQnVmZmVyKCk7Ci0gIH0sCisgIGBFbWJlci5BY3Rpb25IYW5kbGVyYCBpcyB1
c2VkIGludGVybmFsbHkgYnkgRW1iZXIgaW4gIGBFbWJlci5WaWV3YCwKKyAgYEVtYmVyLkNvbnRy
b2xsZXJgLCBhbmQgYEVtYmVyLlJvdXRlYC4KIAotICBlbXB0eTogRW1iZXIuSywKKyAgQGNsYXNz
IEFjdGlvbkhhbmRsZXIKKyAgQG5hbWVzcGFjZSBFbWJlcgorKi8KK0VtYmVyLkFjdGlvbkhhbmRs
ZXIgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICBtZXJnZWRQcm9wZXJ0aWVzOiBbJ19hY3Rpb25z
J10sCiAKLSAgc2V0RWxlbWVudDogZnVuY3Rpb24odmlldywgdmFsdWUpIHsKLSAgICBpZiAodmFs
dWUgIT09IG51bGwpIHsKLSAgICAgIHZpZXcudHJhbnNpdGlvblRvKCdoYXNFbGVtZW50Jyk7Ci0g
ICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotfSk7CisgIC8qKgorICAgIFRoZSBjb2xsZWN0
aW9uIG9mIGZ1bmN0aW9ucywga2V5ZWQgYnkgbmFtZSwgYXZhaWxhYmxlIG9uIHRoaXMKKyAgICBg
QWN0aW9uSGFuZGxlcmAgYXMgYWN0aW9uIHRhcmdldHMuCiAKLX0pKCk7CisgICAgVGhlc2UgZnVu
Y3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRy
aWdnZXJlZAorICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidz
IGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KIAorICAgIEFjdGlvbnMgY2FuIGFsc28gYmUg
aW52b2tlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24KKyAgICB2aWEgYEFj
dGlvbkhhbmRsZXIjc2VuZGAuCiAKKyAgICBUaGUgYGFjdGlvbnNgIGhhc2ggd2lsbCBpbmhlcml0
IGFjdGlvbiBoYW5kbGVycyBmcm9tCisgICAgdGhlIGBhY3Rpb25zYCBoYXNoIGRlZmluZWQgb24g
ZXh0ZW5kZWQgcGFyZW50IGNsYXNzZXMKKyAgICBvciBtaXhpbnMgcmF0aGVyIHRoYW4ganVzdCBy
ZXBsYWNlIHRoZSBlbnRpcmUgaGFzaCwgZS5nLjoKIAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLworICAgIGBgYGpzCisgICAgQXBw
LkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgYWN0aW9uczog
eworICAgICAgICBkaXNwbGF5QmFubmVyOiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAvLyAu
Li4KKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQsIG1ldGEgPSBFbWJlci5tZXRhOworICAgIEFwcC5XZWxjb21lUm91dGUg
PSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNhbkRpc3BsYXlCYW5uZXIsIHsKKyAgICAgIGFjdGlv
bnM6IHsKKyAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAvLyAuLi4K
KyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwogCi12YXIgaW5CdWZmZXIgPSBFbWJlci5WaWV3
LnN0YXRlcy5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVs
dCk7CisgICAgLy8gYFdlbGNvbWVSb3V0ZWAsIHdoZW4gYWN0aXZlLCB3aWxsIGJlIGFibGUgdG8g
cmVzcG9uZAorICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2UgdGhlIGFjdGlvbnMgaGFzaCBp
cyBtZXJnZWQgcmF0aGVyCisgICAgLy8gdGhlbiByZXBsYWNlZCB3aGVuIGV4dGVuZGluZyBtaXhp
bnMgLyBwYXJlbnQgY2xhc3Nlcy4KKyAgICB0aGlzLnNlbmQoJ2Rpc3BsYXlCYW5uZXInKTsKKyAg
ICB0aGlzLnNlbmQoJ3BsYXlNdXNpYycpOworICAgIGBgYAogCi1FbWJlci5tZXJnZShpbkJ1ZmZl
ciwgewotICAkOiBmdW5jdGlvbih2aWV3LCBzZWwpIHsKLSAgICAvLyBpZiB3ZSBkb24ndCBoYXZl
IGFuIGVsZW1lbnQgeWV0LCBzb21lb25lIGNhbGxpbmcgdGhpcy4kKCkgaXMKLSAgICAvLyB0cnlp
bmcgdG8gdXBkYXRlIGFuIGVsZW1lbnQgdGhhdCBpc24ndCBpbiB0aGUgRE9NLiBJbnN0ZWFkLAot
ICAgIC8vIHJlcmVuZGVyIHRoZSB2aWV3IHRvIGFsbG93IHRoZSByZW5kZXIgbWV0aG9kIHRvIHJl
ZmxlY3QgdGhlCi0gICAgLy8gY2hhbmdlcy4KLSAgICB2aWV3LnJlcmVuZGVyKCk7Ci0gICAgcmV0
dXJuIEVtYmVyLiQoKTsKLSAgfSwKKyAgICBXaXRoaW4gYSBDb250cm9sbGVyLCBSb3V0ZSwgVmll
dyBvciBDb21wb25lbnQncyBhY3Rpb24gaGFuZGxlciwKKyAgICB0aGUgdmFsdWUgb2YgdGhlIGB0
aGlzYCBjb250ZXh0IGlzIHRoZSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvcgorICAgIENvbXBv
bmVudCBvYmplY3Q6CiAKLSAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVyZWQgaW4gYSBidWZmZXIs
IHJlcmVuZGVyaW5nIGl0IHNpbXBseQotICAvLyByZXBsYWNlcyB0aGUgZXhpc3RpbmcgYnVmZmVy
IHdpdGggYSBuZXcgb25lCi0gIHJlcmVuZGVyOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCBjYXVzZWQgYSB2aWV3IHRvIHJlLXJl
bmRlciBhZnRlciBpdCByZW5kZXJlZCBidXQgYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRo
ZSBET00uIik7Ci0gIH0sCisgICAgYGBganMKKyAgICBBcHAuU29uZ1JvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgbXlBY3Rpb246IGZ1bmN0aW9u
KCkgeworICAgICAgICAgIHRoaXMuY29udHJvbGxlckZvcigic29uZyIpOworICAgICAgICAgIHRo
aXMudHJhbnNpdGlvblRvKCJvdGhlci5yb3V0ZSIpOworICAgICAgICAgIC4uLgorICAgICAgICB9
CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCiAKLSAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVy
ZWQgaW4gYSBidWZmZXIsIGFwcGVuZGluZyBhIGNoaWxkCi0gIC8vIHZpZXcgd2lsbCByZW5kZXIg
dGhhdCB2aWV3IGFuZCBhcHBlbmQgdGhlIHJlc3VsdGluZwotICAvLyBidWZmZXIgaW50byBpdHMg
YnVmZmVyLgotICBhcHBlbmRDaGlsZDogZnVuY3Rpb24odmlldywgY2hpbGRWaWV3LCBvcHRpb25z
KSB7Ci0gICAgdmFyIGJ1ZmZlciA9IHZpZXcuYnVmZmVyOworICAgIEl0IGlzIGFsc28gcG9zc2li
bGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KKyAgICBhY3Rpb24gaGFu
ZGxlciBpZiBpdCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBwYXJlbnQKKyAgICBj
bGFzcyBvciBtaXhpbjoKIAotICAgIGNoaWxkVmlldyA9IHZpZXcuY3JlYXRlQ2hpbGRWaWV3KGNo
aWxkVmlldywgb3B0aW9ucyk7Ci0gICAgdmlldy5fY2hpbGRWaWV3cy5wdXNoKGNoaWxkVmlldyk7
CisgICAgVGFrZSBmb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHJvdXRlczoKIAotICAgIGNoaWxk
Vmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOworICAgIGBgYGpzCisgICAgQXBwLkRlYnVnUm91
dGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgYWN0aW9uczogeworICAgICAgICBkZWJ1
Z1JvdXRlSW5mb3JtYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGNvbnNvbGUuZGVidWco
InRyb2xvbG8iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwogCi0gICAgdmlldy5wcm9w
ZXJ0eURpZENoYW5nZSgnY2hpbGRWaWV3cycpOworICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUg
PSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVnUm91dGUsIHsKKyAgICAgIGFjdGlvbnM6IHsK
KyAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAv
LyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVi
dWdSb3V0ZQorICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAKLSAgICByZXR1cm4gY2hpbGRWaWV3
OwotICB9LAorICAgICAgICAgIC8vIHNob3cgYWRkaXRpb25hbCBhbm5veWFuY2UKKyAgICAgICAg
ICB3aW5kb3cuYWxlcnQoLi4uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBg
YAogCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVyLCBkZXN0cm95aW5n
IHRoZQotICAvLyBlbGVtZW50IHdpbGwgc2ltcGx5IGRlc3Ryb3kgdGhlIGJ1ZmZlciBhbmQgcHV0
IHRoZQotICAvLyBzdGF0ZSBiYWNrIGludG8gdGhlIHByZVJlbmRlciBzdGF0ZS4KLSAgZGVzdHJv
eUVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LmNsZWFyQnVmZmVyKCk7Ci0gICAg
dmlldy5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50KCk7Ci0gICAgdmlldy50cmFuc2l0aW9uVG8o
J3ByZVJlbmRlcicpOworICAgICMjIEJ1YmJsaW5nCiAKLSAgICByZXR1cm4gdmlldzsKLSAgfSwK
KyAgICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5k
bGVyIGRlZmluZWQKKyAgICBvbiB0aGUgYGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8gY29u
dGludWUgYnViYmxpbmcgdGhlIGFjdGlvbiwKKyAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVgIGZy
b20gdGhlIGhhbmRsZXI6CiAKLSAgZW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmFzc2Vy
dCgiRW1wdHlpbmcgYSB2aWV3IGluIHRoZSBpbkJ1ZmZlciBzdGF0ZSBpcyBub3QgYWxsb3dlZCBh
bmQgc2hvdWxkIG5vdCBoYXBwZW4gdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuIE1vc3QgbGlr
ZWx5IHRoZXJlIGlzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIFRoaXMgbWF5IGJlIGR1ZSB0
byBleGNlc3NpdmUgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIik7Ci0gIH0sCisgICAg
YGBganMKKyAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucmVzb3Vy
Y2UoImFsYnVtIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucm91dGUoInNvbmciKTsKKyAg
ICAgIH0pOworICAgIH0pOwogCi0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uICh2
aWV3KSB7Ci0gICAgcmV0dXJuIHZpZXcuYnVmZmVyOwotICB9LAorICAgIEFwcC5BbGJ1bVJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgc3RhcnRQ
bGF5aW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwogCi0gIC8v
IEl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJlbmRlcmVkIHZpZXcgdG8gYmUgc2NoZWR1
bGVkIGZvcgotICAvLyBpbnNlcnRpb24uCi0gIGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewot
ICAgIHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBi
ZWVuIHJlbmRlcmVkIjsKLSAgfSwKKyAgICBBcHAuQWxidW1Tb25nUm91dGUgPSBFbWJlci5Sb3V0
ZS5leHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICBzdGFydFBsYXlpbmc6IGZ1bmN0
aW9uKCkgeworICAgICAgICAgIC8vIC4uLgogCi0gIHNldEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcs
IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlID09PSBudWxsKSB7Ci0gICAgICB2aWV3LnRyYW5zaXRp
b25UbygncHJlUmVuZGVyJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZpZXcuY2xlYXJCdWZmZXIo
KTsKLSAgICAgIHZpZXcudHJhbnNpdGlvblRvKCdoYXNFbGVtZW50Jyk7Ci0gICAgfQorICAgICAg
ICAgIGlmIChhY3Rpb25TaG91bGRBbHNvQmVUcmlnZ2VyZWRPblBhcmVudFJvdXRlKSB7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKIAotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotfSk7CisgICAgQHByb3Bl
cnR5IGFjdGlvbnMKKyAgICBAdHlwZSBIYXNoCisgICAgQGRlZmF1bHQgbnVsbAorICAqLwogCisg
IC8qKgorICAgIE1vdmVzIGBhY3Rpb25zYCB0byBgX2FjdGlvbnNgIGF0IGV4dGVuZCB0aW1lLiBO
b3RlIHRoYXQgdGhpcyBjdXJyZW50bHkKKyAgICBtb2RpZmllcyB0aGUgbWl4aW4gdGhlbXNlbHZl
cywgd2hpY2ggaXMgdGVjaG5pY2FsbHkgZHViaW91cyBidXQKKyAgICBpcyBwcmFjdGljYWxseSBv
ZiBsaXR0bGUgY29uc2VxdWVuY2UuIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgogCi19
KSgpOworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCB3aWxsTWVyZ2VNaXhpbgorICAqLworICB3
aWxsTWVyZ2VNaXhpbjogZnVuY3Rpb24ocHJvcHMpIHsKKyAgICB2YXIgaGFzaE5hbWU7CiAKKyAg
ICBpZiAoIXByb3BzLl9hY3Rpb25zKSB7CisgICAgICBpZiAodHlwZU9mKHByb3BzLmFjdGlvbnMp
ID09PSAnb2JqZWN0JykgeworICAgICAgICBoYXNoTmFtZSA9ICdhY3Rpb25zJzsKKyAgICAgIH0g
ZWxzZSBpZiAodHlwZU9mKHByb3BzLmV2ZW50cykgPT09ICdvYmplY3QnKSB7CisgICAgICAgIEVt
YmVyLmRlcHJlY2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGNvbnRhaW5lZCBpbiBhbiBgZXZlbnRzYCBv
YmplY3QgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcHV0dGluZyB0aGVtIGluIGFuIGBhY3Rp
b25zYCBvYmplY3QnLCBmYWxzZSk7CisgICAgICAgIGhhc2hOYW1lID0gJ2V2ZW50cyc7CisgICAg
ICB9CiAKKyAgICAgIGlmIChoYXNoTmFtZSkgeworICAgICAgICBwcm9wcy5fYWN0aW9ucyA9IEVt
YmVyLm1lcmdlKHByb3BzLl9hY3Rpb25zIHx8IHt9LCBwcm9wc1toYXNoTmFtZV0pOworICAgICAg
fQogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgbWV0YSA9
IEVtYmVyLm1ldGE7Ci0KLXZhciBoYXNFbGVtZW50ID0gRW1iZXIuVmlldy5zdGF0ZXMuaGFzRWxl
bWVudCA9IEVtYmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7Ci0KLUVtYmVy
Lm1lcmdlKGhhc0VsZW1lbnQsIHsKLSAgJDogZnVuY3Rpb24odmlldywgc2VsKSB7Ci0gICAgdmFy
IGVsZW0gPSBnZXQodmlldywgJ2VsZW1lbnQnKTsKLSAgICByZXR1cm4gc2VsID8gRW1iZXIuJChz
ZWwsIGVsZW0pIDogRW1iZXIuJChlbGVtKTsKLSAgfSwKLQotICBnZXRFbGVtZW50OiBmdW5jdGlv
bih2aWV3KSB7Ci0gICAgdmFyIHBhcmVudCA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOwotICAg
IGlmIChwYXJlbnQpIHsgcGFyZW50ID0gZ2V0KHBhcmVudCwgJ2VsZW1lbnQnKTsgfQotICAgIGlm
IChwYXJlbnQpIHsgcmV0dXJuIHZpZXcuZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQocGFyZW50
KTsgfQotICAgIHJldHVybiBFbWJlci4kKCIjIiArIGdldCh2aWV3LCAnZWxlbWVudElkJykpWzBd
OwotICB9LAotCi0gIHNldEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIHZhbHVlKSB7Ci0gICAgaWYg
KHZhbHVlID09PSBudWxsKSB7Ci0gICAgICB2aWV3LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJZb3UgY2Fubm90IHNldCBhbiBlbGVtZW50IHRv
IGEgbm9uLW51bGwgdmFsdWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGluIHRoZSBET00u
IjsKKyAgICAgIGRlbGV0ZSBwcm9wc1toYXNoTmFtZV07CiAgICAgfQotCi0gICAgcmV0dXJuIHZh
bHVlOwotICB9LAotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0
aGUgRE9NLCByZXJlbmRlcmluZyBpcwotICAvLyBkZWZlcnJlZCB0byBhbGxvdyBiaW5kaW5ncyB0
byBzeW5jaHJvbml6ZS4KLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LnRy
aWdnZXJSZWN1cnNpdmVseSgnd2lsbENsZWFyUmVuZGVyJyk7Ci0KLSAgICB2aWV3LmNsZWFyUmVu
ZGVyZWRDaGlsZHJlbigpOwotCi0gICAgdmlldy5kb21NYW5hZ2VyLnJlcGxhY2Uodmlldyk7Ci0g
ICAgcmV0dXJuIHZpZXc7CiAgIH0sCiAKLSAgLy8gb25jZSB0aGUgdmlldyBpcyBhbHJlYWR5IGlu
IHRoZSBET00sIGRlc3Ryb3lpbmcgaXQgcmVtb3ZlcyBpdAotICAvLyBmcm9tIHRoZSBET00sIG51
a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8gdGhlCi0gIC8vIHByZVJlbmRl
ciBzdGF0ZSBpZiBpbkRPTS4KLQotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmlldykgewot
ICAgIHZpZXcuX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudCgpOwotICAgIHZpZXcuZG9tTWFuYWdl
ci5yZW1vdmUodmlldyk7Ci0gICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7Ci0gICAgaWYg
KHZpZXcuX3NjaGVkdWxlZEluc2VydCkgewotICAgICAgRW1iZXIucnVuLmNhbmNlbCh2aWV3Ll9z
Y2hlZHVsZWRJbnNlcnQpOwotICAgICAgdmlldy5fc2NoZWR1bGVkSW5zZXJ0ID0gbnVsbDsKLSAg
ICB9Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCisgIHNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5hbWUp
IHsKKyAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdGFyZ2V0Owog
Ci0gIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmFyIF9jaGlsZFZpZXdzID0gdmlldy5f
Y2hpbGRWaWV3cywgbGVuLCBpZHg7Ci0gICAgaWYgKF9jaGlsZFZpZXdzKSB7Ci0gICAgICBsZW4g
PSBfY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4
KyspIHsKLSAgICAgICAgX2NoaWxkVmlld3NbaWR4XS5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50
KCk7CisgICAgaWYgKHRoaXMuX2FjdGlvbnMgJiYgdGhpcy5fYWN0aW9uc1thY3Rpb25OYW1lXSkg
eworICAgICAgaWYgKHRoaXMuX2FjdGlvbnNbYWN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJncykg
PT09IHRydWUpIHsKKyAgICAgICAgLy8gaGFuZGxlciByZXR1cm5lZCB0cnVlLCBzbyB0aGlzIGFj
dGlvbiB3aWxsIGJ1YmJsZQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAg
fQorICAgIH0gZWxzZSBpZiAodGhpcy5kZXByZWNhdGVkU2VuZCAmJiB0aGlzLmRlcHJlY2F0ZWRT
ZW5kSGFuZGxlcyAmJiB0aGlzLmRlcHJlY2F0ZWRTZW5kSGFuZGxlcyhhY3Rpb25OYW1lKSkgewor
ICAgICAgaWYgKHRoaXMuZGVwcmVjYXRlZFNlbmQuYXBwbHkodGhpcywgW10uc2xpY2UuY2FsbChh
cmd1bWVudHMpKSA9PT0gdHJ1ZSkgeworICAgICAgICAvLyBoYW5kbGVyIHJldHVybiB0cnVlLCBz
byB0aGlzIGFjdGlvbiB3aWxsIGJ1YmJsZQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJu
OwogICAgICAgfQogICAgIH0KLSAgICB2aWV3LmRvbU1hbmFnZXIuZW1wdHkodmlldyk7Ci0gIH0s
CiAKLSAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCi0gIGhh
bmRsZUV2ZW50OiBmdW5jdGlvbih2aWV3LCBldmVudE5hbWUsIGV2dCkgewotICAgIGlmICh2aWV3
LmhhcyhldmVudE5hbWUpKSB7Ci0gICAgICAvLyBIYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIHJl
LWRpc3BhdGNoIGV2ZW50cywgc28gd2UgZG9uJ3QKLSAgICAgIC8vIHByZXZlbnREZWZhdWx0IG9y
IHN0b3BQcm9wYWdhdGlvbi4KLSAgICAgIHJldHVybiB2aWV3LnRyaWdnZXIoZXZlbnROYW1lLCBl
dnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsgLy8gY29udGludWUgZXZlbnQg
cHJvcGFnYXRpb24KKyAgICBpZiAodGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSkgeworICAg
ICAgRW1iZXIuYXNzZXJ0KCJUaGUgYHRhcmdldGAgZm9yICIgKyB0aGlzICsgIiAoIiArIHRhcmdl
dCArICIpIGRvZXMgbm90IGhhdmUgYSBgc2VuZGAgbWV0aG9kIiwgdHlwZW9mIHRhcmdldC5zZW5k
ID09PSAnZnVuY3Rpb24nKTsKKyAgICAgIHRhcmdldC5zZW5kLmFwcGx5KHRhcmdldCwgYXJndW1l
bnRzKTsKICAgICB9CiAgIH0KLX0pOwotCi12YXIgaW5ET00gPSBFbWJlci5WaWV3LnN0YXRlcy5p
bkRPTSA9IEVtYmVyLmNyZWF0ZShoYXNFbGVtZW50KTsKIAotRW1iZXIubWVyZ2UoaW5ET00sIHsK
LSAgaW5zZXJ0RWxlbWVudDogZnVuY3Rpb24odmlldywgZm4pIHsKLSAgICB0aHJvdyAiWW91IGNh
bid0IGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlIERPTSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4g
aW5zZXJ0ZWQiOwotICB9CiB9KTsKIAogfSkoKTsKQEAgLTE2MTUyLDI0MTAgKzE3OTQ0LDEyMDM2
IEBAIEVtYmVyLm1lcmdlKGluRE9NLCB7CiAKIAogKGZ1bmN0aW9uKCkgewordmFyIHNldCA9IEVt
YmVyLnNldCwgZ2V0ID0gRW1iZXIuZ2V0LAorICAgIHJlc29sdmUgPSBFbWJlci5SU1ZQLnJlc29s
dmUsCisgICAgcmV0aHJvdyA9IEVtYmVyLlJTVlAucmV0aHJvdywKKyAgICBub3QgPSBFbWJlci5j
b21wdXRlZC5ub3QsCisgICAgb3IgPSBFbWJlci5jb21wdXRlZC5vcjsKKwogLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLworICBAbW9kdWxlIGVtYmVyCisgIEBz
dWJtb2R1bGUgZW1iZXItcnVudGltZQorICovCiAKLXZhciBkZXN0cm95ZWRFcnJvciA9ICJZb3Ug
Y2FuJ3QgY2FsbCAlQCBvbiBhIGRlc3Ryb3llZCB2aWV3IiwgZm10ID0gRW1iZXIuU3RyaW5nLmZt
dDsKK2Z1bmN0aW9uIG9ic2VydmVQcm9taXNlKHByb3h5LCBwcm9taXNlKSB7CisgIHByb21pc2Uu
dGhlbihmdW5jdGlvbih2YWx1ZSkgeworICAgIHNldChwcm94eSwgJ2lzRnVsZmlsbGVkJywgdHJ1
ZSk7CisgICAgc2V0KHByb3h5LCAnY29udGVudCcsIHZhbHVlKTsKKyAgfSwgZnVuY3Rpb24ocmVh
c29uKSB7CisgICAgc2V0KHByb3h5LCAnaXNSZWplY3RlZCcsIHRydWUpOworICAgIHNldChwcm94
eSwgJ3JlYXNvbicsIHJlYXNvbik7CisgICAgLy8gZG9uJ3QgcmUtdGhyb3csIGFzIHdlIGFyZSBt
ZXJlbHkgb2JzZXJ2aW5nCisgIH0sICJFbWJlcjogUHJvbWlzZVByb3h5Iik7Cit9CiAKLXZhciBk
ZXN0cm95ZWQgPSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95ZWQgPSBFbWJlci5jcmVhdGUoRW1i
ZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOworLyoqCisgIEEgbG93IGxldmVsIG1peGluIG1ha2lu
ZyBPYmplY3RQcm94eSwgT2JqZWN0Q29udHJvbGxlciBvciBBcnJheUNvbnRyb2xsZXIncyBwcm9t
aXNlIGF3YXJlLgogCi1FbWJlci5tZXJnZShkZXN0cm95ZWQsIHsKLSAgYXBwZW5kQ2hpbGQ6IGZ1
bmN0aW9uKCkgewotICAgIHRocm93IGZtdChkZXN0cm95ZWRFcnJvciwgWydhcHBlbmRDaGlsZCdd
KTsKLSAgfSwKLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKCkgewotICAgIHRocm93IGZtdChkZXN0cm95
ZWRFcnJvciwgWydyZXJlbmRlciddKTsKLSAgfSwKLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9u
KCkgewotICAgIHRocm93IGZtdChkZXN0cm95ZWRFcnJvciwgWydkZXN0cm95RWxlbWVudCddKTsK
LSAgfSwKLSAgZW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIHRocm93IGZtdChkZXN0cm95ZWRFcnJv
ciwgWydlbXB0eSddKTsKLSAgfSwKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgT2JqZWN0UHJvbWlz
ZUNvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RDb250cm9sbGVyLmV4dGVuZChFbWJlci5Qcm9taXNl
UHJveHlNaXhpbik7CiAKLSAgc2V0RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10
KGRlc3Ryb3llZEVycm9yLCBbInNldCgnZWxlbWVudCcsIC4uLikiXSk7Ci0gIH0sCisgIHZhciBj
b250cm9sbGVyID0gT2JqZWN0UHJvbWlzZUNvbnRyb2xsZXIuY3JlYXRlKHsKKyAgICBwcm9taXNl
OiAkLmdldEpTT04oJy9zb21lL3JlbW90ZS9kYXRhLmpzb24nKQorICB9KTsKIAotICByZW5kZXJU
b0J1ZmZlcklmTmVlZGVkOiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJveWVkRXJy
b3IsIFsicmVuZGVyVG9CdWZmZXJJZk5lZWRlZCJdKTsKLSAgfSwKKyAgY29udHJvbGxlci50aGVu
KGZ1bmN0aW9uKGpzb24peworICAgICAvLyB0aGUganNvbgorICB9LCBmdW5jdGlvbihyZWFzb24p
IHsKKyAgICAgLy8gdGhlIHJlYXNvbiB3aHkgeW91IGhhdmUgbm8ganNvbgorICB9KTsKKyAgYGBg
CiAKLSAgLy8gU2luY2UgZWxlbWVudCBpbnNlcnRpb24gaXMgc2NoZWR1bGVkLCBkb24ndCBkbyBh
bnl0aGluZyBpZgotICAvLyB0aGUgdmlldyBoYXMgYmVlbiBkZXN0cm95ZWQgYmV0d2VlbiBzY2hl
ZHVsaW5nIGFuZCBleGVjdXRpb24KLSAgaW5zZXJ0RWxlbWVudDogRW1iZXIuSwotfSk7CisgIHRo
ZSBjb250cm9sbGVyIGhhcyBiaW5kYWJsZSBhdHRyaWJ1dGVzIHdoaWNoCisgIHRyYWNrIHRoZSBw
cm9taXNlcyBsaWZlIGN5Y2xlCiAKKyAgYGBgamF2YXNjcmlwdAorICBjb250cm9sbGVyLmdldCgn
aXNQZW5kaW5nJykgICAvLz0+IHRydWUKKyAgY29udHJvbGxlci5nZXQoJ2lzU2V0dGxlZCcpICAv
Lz0+IGZhbHNlCisgIGNvbnRyb2xsZXIuZ2V0KCdpc1JlamVjdGVkJykgIC8vPT4gZmFsc2UKKyAg
Y29udHJvbGxlci5nZXQoJ2lzRnVsZmlsbGVkJykgLy89PiBmYWxzZQorICBgYGAKIAotfSkoKTsK
KyAgV2hlbiB0aGUgdGhlICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBm
dWxmaWxsZWQKKyAgd2l0aCBqc29uLCB0aGUgbGlmZSBjeWNsZSBhdHRyaWJ1dGVzIHdpbGwgdXBk
YXRlIGFjY29yZGluZ2x5LgogCisgIGBgYGphdmFzY3JpcHQKKyAgY29udHJvbGxlci5nZXQoJ2lz
UGVuZGluZycpICAgLy89PiBmYWxzZQorICBjb250cm9sbGVyLmdldCgnaXNTZXR0bGVkJykgICAv
Lz0+IHRydWUKKyAgY29udHJvbGxlci5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQorICBj
b250cm9sbGVyLmdldCgnaXNGdWxmaWxsZWQnKSAvLz0+IHRydWUKKyAgYGBgCiAKKyAgQXMgdGhl
IGNvbnRyb2xsZXIgaXMgYW4gT2JqZWN0Q29udHJvbGxlciwgYW5kIHRoZSBqc29uIG5vdyBpdHMg
Y29udGVudCwKKyAgYWxsIHRoZSBqc29uIHByb3BlcnRpZXMgd2lsbCBiZSBhdmFpbGFibGUgZGly
ZWN0bHkgZnJvbSB0aGUgY29udHJvbGxlci4KIAotKGZ1bmN0aW9uKCkgewotRW1iZXIuVmlldy5j
bG9uZVN0YXRlcyA9IGZ1bmN0aW9uKGZyb20pIHsKLSAgdmFyIGludG8gPSB7fTsKKyAgYGBgamF2
YXNjcmlwdAorICAvLyBBc3N1bWluZyB0aGUgZm9sbG93aW5nIGpzb246CisgIHsKKyAgICBmaXJz
dE5hbWU6ICdTdGVmYW4nLAorICAgIGxhc3ROYW1lOiAnUGVubmVyJworICB9CiAKLSAgaW50by5f
ZGVmYXVsdCA9IHt9OwotICBpbnRvLnByZVJlbmRlciA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZh
dWx0KTsKLSAgaW50by5kZXN0cm95ZWQgPSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7Ci0g
IGludG8uaW5CdWZmZXIgPSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7Ci0gIGludG8uaGFz
RWxlbWVudCA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsKLSAgaW50by5pbkRPTSA9IEVt
YmVyLmNyZWF0ZShpbnRvLmhhc0VsZW1lbnQpOworICAvLyBib3RoIHByb3BlcnRpZXMgd2lsbCBh
Y2Nlc3NpYmxlIG9uIHRoZSBjb250cm9sbGVyCisgIGNvbnRyb2xsZXIuZ2V0KCdmaXJzdE5hbWUn
KSAvLz0+ICdTdGVmYW4nCisgIGNvbnRyb2xsZXIuZ2V0KCdsYXN0TmFtZScpICAvLz0+ICdQZW5u
ZXInCisgIGBgYAogCi0gIHZhciB2aWV3U3RhdGU7CisgIElmIHRoZSBjb250cm9sbGVyIGlzIGJh
Y2tpbmcgYSB0ZW1wbGF0ZSwgdGhlIGF0dHJpYnV0ZXMgYXJlCisgIGJpbmRhYmxlIGZyb20gd2l0
aGluIHRoYXQgdGVtcGxhdGUKIAotICBmb3IgKHZhciBzdGF0ZU5hbWUgaW4gZnJvbSkgewotICAg
IGlmICghZnJvbS5oYXNPd25Qcm9wZXJ0eShzdGF0ZU5hbWUpKSB7IGNvbnRpbnVlOyB9Ci0gICAg
RW1iZXIubWVyZ2UoaW50b1tzdGF0ZU5hbWVdLCBmcm9tW3N0YXRlTmFtZV0pOwotICB9CisgIGBg
YGhhbmRsZWJhcnMKKyAge3sjaWYgaXNQZW5kaW5nfX0KKyAgICBsb2FkaW5nLi4uCisgIHt7ZWxz
ZX19CisgICAgZmlyc3ROYW1lOiB7e2ZpcnN0TmFtZX19CisgICAgbGFzdE5hbWU6IHt7bGFzdE5h
bWV9fQorICB7ey9pZn19CisgIGBgYAorICBAY2xhc3MgRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4K
KyovCitFbWJlci5Qcm9taXNlUHJveHlNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgIC8q
KgorICAgIElmIHRoZSBwcm94aWVkIHByb21pc2UgaXMgcmVqZWN0ZWQgdGhpcyB3aWxsIGNvbnRh
aW4gdGhlIHJlYXNvbgorICAgIHByb3ZpZGVkLgogCi0gIHJldHVybiBpbnRvOwotfTsKKyAgICBA
cHJvcGVydHkgcmVhc29uCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICByZWFzb246ICAgIG51
bGwsCiAKLX0pKCk7CisgIC8qKgorICAgIE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0
dGxlZCB0aGlzIHdpbGwgYmVjb21lIGBmYWxzZWAuCiAKKyAgICBAcHJvcGVydHkgaXNQZW5kaW5n
CisgICAgQGRlZmF1bHQgdHJ1ZQorICAqLworICBpc1BlbmRpbmc6ICBub3QoJ2lzU2V0dGxlZCcp
LnJlYWRPbmx5KCksCiAKKyAgLyoqCisgICAgT25jZSB0aGUgcHJveGllZCBwcm9taXNlIGhhcyBz
ZXR0bGVkIHRoaXMgd2lsbCBiZWNvbWUgYHRydWVgLgogCi0oZnVuY3Rpb24oKSB7Ci12YXIgc3Rh
dGVzID0gRW1iZXIuVmlldy5jbG9uZVN0YXRlcyhFbWJlci5WaWV3LnN0YXRlcyk7CisgICAgQHBy
b3BlcnR5IGlzU2V0dGxlZAorICAgIEBkZWZhdWx0IGZhbHNlCisgICovCisgIGlzU2V0dGxlZDog
IG9yKCdpc1JlamVjdGVkJywgJ2lzRnVsZmlsbGVkJykucmVhZE9ubHkoKSwKIAotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLworICAvKioKKyAgICBXaWxsIGJl
Y29tZSBgdHJ1ZWAgaWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyByZWplY3RlZC4KIAotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBtZXRhID0gRW1iZXIubWV0YTsKLXZhciBm
b3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7CisgICAgQHByb3BlcnR5IGlz
UmVqZWN0ZWQKKyAgICBAZGVmYXVsdCBmYWxzZQorICAqLworICBpc1JlamVjdGVkOiAgZmFsc2Us
CiAKLS8qKgotICBBIGBDb250YWluZXJWaWV3YCBpcyBhbiBgRW1iZXIuVmlld2Agc3ViY2xhc3Mg
dGhhdCBpbXBsZW1lbnRzIGBFbWJlci5NdXRhYmxlQXJyYXlgCi0gIGFsbG93aW5nIHByb2dyYW1h
dGljIG1hbmFnZW1lbnQgb2YgaXRzIGNoaWxkIHZpZXdzLgorICAvKioKKyAgICBXaWxsIGJlY29t
ZSBgdHJ1ZWAgaWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyBmdWxmaWxsZWQuCiAKLSAgIyMgU2V0
dGluZyBJbml0aWFsIENoaWxkIFZpZXdzCisgICAgQHByb3BlcnR5IGlzRnVsbGZpbGxlZAorICAg
IEBkZWZhdWx0IGZhbHNlCisgICovCisgIGlzRnVsZmlsbGVkOiBmYWxzZSwKIAotICBUaGUgaW5p
dGlhbCBhcnJheSBvZiBjaGlsZCB2aWV3cyBjYW4gYmUgc2V0IGluIG9uZSBvZiB0d28gd2F5cy4g
WW91IGNhbgotICBwcm92aWRlIGEgYGNoaWxkVmlld3NgIHByb3BlcnR5IGF0IGNyZWF0aW9uIHRp
bWUgdGhhdCBjb250YWlucyBpbnN0YW5jZSBvZgotICBgRW1iZXIuVmlld2A6CisgIC8qKgorICAg
IFRoZSBwcm9taXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVlIGlzIGJlaW5nIHByb3hpZWQgYnkg
dGhpcyBvYmplY3QuCiAKLSAgYGBgamF2YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1iZXIuQ29u
dGFpbmVyVmlldy5jcmVhdGUoewotICAgIGNoaWxkVmlld3M6IFtFbWJlci5WaWV3LmNyZWF0ZSgp
LCBFbWJlci5WaWV3LmNyZWF0ZSgpXQotICB9KTsKLSAgYGBgCisgICAgVGhpcyBwcm9wZXJ0eSBt
dXN0IGJlIHNwZWNpZmllZCB1cG9uIGNyZWF0aW9uLCBhbmQgc2hvdWxkIG5vdCBiZQorICAgIGNo
YW5nZWQgb25jZSBjcmVhdGVkLgogCi0gIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgbGlzdCBvZiBw
cm9wZXJ0eSBuYW1lcyB3aG9zZSB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZgotICBgRW1iZXIuVmll
d2A6CisgICAgRXhhbXBsZToKIAotICBgYGBqYXZhc2NyaXB0Ci0gIGFDb250YWluZXIgPSBFbWJl
ci5Db250YWluZXJWaWV3LmNyZWF0ZSh7Ci0gICAgY2hpbGRWaWV3czogWydhVmlldycsICdiVmll
dycsICdjVmlldyddLAotICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpLAotICAgIGJWaWV3
OiBFbWJlci5WaWV3LmNyZWF0ZSgpLAotICAgIGNWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCi0g
IH0pOwotICBgYGAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuT2JqZWN0Q29udHJvbGxl
ci5leHRlbmQoRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4pLmNyZWF0ZSh7CisgICAgICBwcm9taXNl
OiA8dGhlbmFibGU+CisgICAgfSk7CisgICAgYGBgCiAKLSAgVGhlIHR3byBzdHJhdGVnaWVzIGNh
biBiZSBjb21iaW5lZDoKKyAgICBAcHJvcGVydHkgcHJvbWlzZQorICAqLworICBwcm9taXNlOiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHByb21pc2UpIHsKKyAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMikgeworICAgICAgcHJvbWlzZSA9IHJlc29sdmUocHJvbWlzZSk7CisgICAg
ICBvYnNlcnZlUHJvbWlzZSh0aGlzLCBwcm9taXNlKTsKKyAgICAgIHJldHVybiBwcm9taXNlLnRo
ZW4oKTsgLy8gZm9yayB0aGUgcHJvbWlzZS4KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKCJQcm9taXNlUHJveHkncyBwcm9taXNlIG11c3QgYmUgc2V0Iik7CisgICAg
fQorICB9KSwKIAotICBgYGBqYXZhc2NyaXB0Ci0gIGFDb250YWluZXIgPSBFbWJlci5Db250YWlu
ZXJWaWV3LmNyZWF0ZSh7Ci0gICAgY2hpbGRWaWV3czogWydhVmlldycsIEVtYmVyLlZpZXcuY3Jl
YXRlKCldLAotICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCi0gIH0pOwotICBgYGAKKyAg
LyoqCisgICAgQW4gYWxpYXMgdG8gdGhlIHByb3hpZWQgcHJvbWlzZSdzIGB0aGVuYC4KIAotICBF
YWNoIGNoaWxkIHZpZXcncyByZW5kZXJpbmcgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250
YWluZXIncyByZW5kZXJlZAotICBIVE1MIGluIHRoZSBzYW1lIG9yZGVyIGFzIGl0cyBwb3NpdGlv
biBpbiB0aGUgYGNoaWxkVmlld3NgIHByb3BlcnR5LgorICAgIFNlZSBSU1ZQLlByb21pc2UudGhl
bi4KIAotICAjIyBBZGRpbmcgYW5kIFJlbW92aW5nIENoaWxkIFZpZXdzCisgICAgQG1ldGhvZCB0
aGVuCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtSU1ZQLlBy
b21pc2V9CisgICovCisgIHRoZW46IHByb21pc2VBbGlhcygndGhlbicpLAogCi0gIFRoZSBjb250
YWluZXIgdmlldyBpbXBsZW1lbnRzIGBFbWJlci5NdXRhYmxlQXJyYXlgIGFsbG93aW5nIHByb2dy
YW1hdGljIG1hbmFnZW1lbnQgb2YgaXRzIGNoaWxkIHZpZXdzLgorICAvKioKKyAgICBBbiBhbGlh
cyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KIAotICBUbyByZW1vdmUgYSB2aWV3
LCBwYXNzIHRoYXQgdmlldyBpbnRvIGEgYHJlbW92ZU9iamVjdGAgY2FsbCBvbiB0aGUgY29udGFp
bmVyIHZpZXcuCisgICAgU2VlIFJTVlAuUHJvbWlzZS5jYXRjaC4KIAotICBHaXZlbiBhbiBlbXB0
eSBgPGJvZHk+YCB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICBAbWV0aG9kIGNhdGNoCisgICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9CisgICov
CisgICdjYXRjaCc6IHByb21pc2VBbGlhcygnY2F0Y2gnKSwKIAotICBgYGBqYXZhc2NyaXB0Ci0g
IGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NOYW1l
czogWyd0aGUtY29udGFpbmVyJ10sCi0gICAgY2hpbGRWaWV3czogWydhVmlldycsICdiVmlldydd
LAotICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIu
SGFuZGxlYmFycy5jb21waWxlKCJBIikKLSAgICB9KSwKLSAgICBiVmlldzogRW1iZXIuVmlldy5j
cmVhdGUoewotICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQiIpCi0g
ICAgfSkKLSAgfSk7CisgIC8qKgorICAgIEFuIGFsaWFzIHRvIHRoZSBwcm94aWVkIHByb21pc2Un
cyBgZmluYWxseWAuCiAKLSAgYUNvbnRhaW5lci5hcHBlbmRUbygnYm9keScpOwotICBgYGAKKyAg
ICBTZWUgUlNWUC5Qcm9taXNlLmZpbmFsbHkuCiAKLSAgUmVzdWx0cyBpbiB0aGUgSFRNTAorICAg
IEBtZXRob2QgZmluYWxseQorICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgQHJl
dHVybiB7UlNWUC5Qcm9taXNlfQorICAqLworICAnZmluYWxseSc6IHByb21pc2VBbGlhcygnZmlu
YWxseScpCiAKLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IHRoZS1jb250YWlu
ZXIiPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkE8L2Rpdj4KLSAgICA8ZGl2IGNsYXNz
PSJlbWJlci12aWV3Ij5CPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKK30pOwogCi0gIFJlbW92aW5n
IGEgdmlldworZnVuY3Rpb24gcHJvbWlzZUFsaWFzKG5hbWUpIHsKKyAgcmV0dXJuIGZ1bmN0aW9u
ICgpIHsKKyAgICB2YXIgcHJvbWlzZSA9IGdldCh0aGlzLCAncHJvbWlzZScpOworICAgIHJldHVy
biBwcm9taXNlW25hbWVdLmFwcGx5KHByb21pc2UsIGFyZ3VtZW50cyk7CisgIH07Cit9CiAKLSAg
YGBgamF2YXNjcmlwdAotICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFW
aWV3LCBhQ29udGFpbmVyLmJWaWV3XQotICBhQ29udGFpbmVyLnJlbW92ZU9iamVjdChhQ29udGFp
bmVyLmdldCgnYlZpZXcnKSk7Ci0gIGFDb250YWluZXIudG9BcnJheSgpOyAgLy8gW2FDb250YWlu
ZXIuYVZpZXddCi0gIGBgYAorfSkoKTsKIAotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5n
IEhUTUwKIAotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5l
ciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgotICA8L2Rpdj4KLSAgYGBg
CiAKLSAgU2ltaWxhcmx5LCBhZGRpbmcgYSBjaGlsZCB2aWV3IGlzIGFjY29tcGxpc2hlZCBieSBh
ZGRpbmcgYEVtYmVyLlZpZXdgIGluc3RhbmNlcyB0byB0aGUKLSAgY29udGFpbmVyIHZpZXcuCiso
ZnVuY3Rpb24oKSB7CiAKLSAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgdGhlIGZvbGxvd2luZyBj
b2RlCit9KSgpOwogCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRh
aW5lclZpZXcuY3JlYXRlKHsKLSAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWluZXInXSwKLSAg
ICBjaGlsZFZpZXdzOiBbJ2FWaWV3JywgJ2JWaWV3J10sCi0gICAgYVZpZXc6IEVtYmVyLlZpZXcu
Y3JlYXRlKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkEiKQot
ICAgIH0pLAotICAgIGJWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0ZW1wbGF0ZTog
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJCIikKLSAgICB9KQotICB9KTsKLQotICBhQ29udGFp
bmVyLmFwcGVuZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIEhUTUwKLQot
ICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAg
PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkI8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEFkZGluZyBhIHZpZXcKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIEFub3RoZXJWaWV3Q2xhc3MgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQW5vdGhlciB2aWV3IikKLSAgfSk7
Ci0KLSAgYUNvbnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRh
aW5lci5iVmlld10KLSAgYUNvbnRhaW5lci5wdXNoT2JqZWN0KEFub3RoZXJWaWV3Q2xhc3MuY3Jl
YXRlKCkpOwotICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgLy8gW2FDb250YWluZXIuYVZpZXcsIGFD
b250YWluZXIuYlZpZXcsIDxBbm90aGVyVmlld0NsYXNzIGluc3RhbmNlPl0KLSAgYGBgCi0KLSAg
V2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MCi0KLSAgYGBgaHRtbAotICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3IHRoZS1jb250YWluZXIiPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkE8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5CPC9kaXY+Ci0gICAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyI+QW5vdGhlciB2aWV3PC9kaXY+Ci0gIDwvZGl2PgotICBgYGAK
IAotICAjIyBUZW1wbGF0ZXMgYW5kIExheW91dAotCi0gIEEgYHRlbXBsYXRlYCwgYHRlbXBsYXRl
TmFtZWAsIGBkZWZhdWx0VGVtcGxhdGVgLCBgbGF5b3V0YCwgYGxheW91dE5hbWVgIG9yCi0gIGBk
ZWZhdWx0TGF5b3V0YCBwcm9wZXJ0eSBvbiBhIGNvbnRhaW5lciB2aWV3IHdpbGwgbm90IHJlc3Vs
dCBpbiB0aGUgdGVtcGxhdGUKLSAgb3IgbGF5b3V0IGJlaW5nIHJlbmRlcmVkLiBUaGUgSFRNTCBj
b250ZW50cyBvZiBhIGBFbWJlci5Db250YWluZXJWaWV3YCdzIERPTQotICByZXByZXNlbnRhdGlv
biB3aWxsIG9ubHkgYmUgdGhlIHJlbmRlcmVkIEhUTUwgb2YgaXRzIGNoaWxkIHZpZXdzLgogCi0g
ICMjIEJpbmRpbmcgYSBWaWV3IHRvIERpc3BsYXkKKyhmdW5jdGlvbigpIHsKK3ZhciBnZXQgPSBF
bWJlci5nZXQsCisgICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAor
ICAgIFJFVEFJTiA9ICdyJywKKyAgICBJTlNFUlQgPSAnaScsCisgICAgREVMRVRFID0gJ2QnOwog
Ci0gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGRpc3BsYXkgYSBzaW5nbGUgdmlldyBpbiB5b3VyIENv
bnRhaW5lclZpZXcsIHlvdSBjYW4gc2V0Ci0gIGl0cyBgY3VycmVudFZpZXdgIHByb3BlcnR5LiBX
aGVuIHRoZSBgY3VycmVudFZpZXdgIHByb3BlcnR5IGlzIHNldCB0byBhIHZpZXcKLSAgaW5zdGFu
Y2UsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIENvbnRhaW5lclZpZXcuIElmIHRoZSBgY3VycmVu
dFZpZXdgIHByb3BlcnR5Ci0gIGlzIGxhdGVyIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgdmlldywg
dGhlIG5ldyB2aWV3IHdpbGwgcmVwbGFjZSB0aGUgb2xkIHZpZXcuCi0gIElmIGBjdXJyZW50Vmll
d2AgaXMgc2V0IHRvIGBudWxsYCwgdGhlIGxhc3QgYGN1cnJlbnRWaWV3YCB3aWxsIGJlIHJlbW92
ZWQuCisvKioKKyAgQW4gYEVtYmVyLlRyYWNrZWRBcnJheWAgdHJhY2tzIGFycmF5IG9wZXJhdGlv
bnMuICBJdCdzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCisgIGxhemlseSBjb21wdXRlIHRoZSBp
bmRleGVzIG9mIGl0ZW1zIGluIGFuIGFycmF5IGFmdGVyIHRoZXkndmUgYmVlbiBzaGlmdGVkIGJ5
CisgIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4KIAotICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgdXNl
ZnVsIGZvciBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBiaW5kIHRoZSBkaXNwbGF5IG9mCi0gIGEg
Q29udGFpbmVyVmlldyB0byBhIGNvbnRyb2xsZXIgb3Igc3RhdGUgbWFuYWdlci4gRm9yIGV4YW1w
bGUsIHlvdSBjYW4gYmluZAotICB0aGUgYGN1cnJlbnRWaWV3YCBvZiBhIGNvbnRhaW5lciB0byBh
IGNvbnRyb2xsZXIgbGlrZSB0aGlzOgorICBAY2xhc3MgVHJhY2tlZEFycmF5CisgIEBuYW1lc3Bh
Y2UgRW1iZXIKKyAgQHBhcmFtIHthcnJheX0gW2l0ZW1zPVtdXSBUaGUgYXJyYXkgdG8gYmUgdHJh
Y2tlZC4gIFRoaXMgaXMgdXNlZCBqdXN0IHRvIGdldAorICB0aGUgaW5pdGlhbCBpdGVtcyBmb3Ig
dGhlIHN0YXJ0aW5nIHN0YXRlIG9mIHJldGFpbjpuLgorKi8KK0VtYmVyLlRyYWNrZWRBcnJheSA9
IGZ1bmN0aW9uIChpdGVtcykgeworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHsgaXRlbXMg
PSBbXTsgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLmFwcENvbnRyb2xsZXIgPSBFbWJlci5P
YmplY3QuY3JlYXRlKHsKLSAgICB2aWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0ZW1w
bGF0ZU5hbWU6ICdwZXJzb25fdGVtcGxhdGUnCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAorICB2YXIg
bGVuZ3RoID0gZ2V0KGl0ZW1zLCAnbGVuZ3RoJyk7CiAKLSAgYGBgaGFuZGxlYmFycwotICB7e3Zp
ZXcgRW1iZXIuQ29udGFpbmVyVmlldyBjdXJyZW50Vmlld0JpbmRpbmc9IkFwcC5hcHBDb250cm9s
bGVyLnZpZXcifX0KLSAgYGBgCisgIGlmIChsZW5ndGgpIHsKKyAgICB0aGlzLl9vcGVyYXRpb25z
ID0gW25ldyBBcnJheU9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCwgaXRlbXMpXTsKKyAgfSBlbHNl
IHsKKyAgICB0aGlzLl9vcGVyYXRpb25zID0gW107CisgIH0KK307CiAKLSAgQGNsYXNzIENvbnRh
aW5lclZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwot
RW1iZXIuQ29udGFpbmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJh
eSwgewotICBzdGF0ZXM6IHN0YXRlcywKK0VtYmVyLlRyYWNrZWRBcnJheS5SRVRBSU4gPSBSRVRB
SU47CitFbWJlci5UcmFja2VkQXJyYXkuSU5TRVJUID0gSU5TRVJUOworRW1iZXIuVHJhY2tlZEFy
cmF5LkRFTEVURSA9IERFTEVURTsKIAotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9z
dXBlcigpOworRW1iZXIuVHJhY2tlZEFycmF5LnByb3RvdHlwZSA9IHsKIAotICAgIHZhciBjaGls
ZFZpZXdzID0gZ2V0KHRoaXMsICdjaGlsZFZpZXdzJyk7CisgIC8qKgorICAgIFRyYWNrIHRoYXQg
YG5ld0l0ZW1zYCB3ZXJlIGFkZGVkIHRvIHRoZSB0cmFja2VkIGFycmF5IGF0IGBpbmRleGAuCiAK
LSAgICAvLyByZWRlZmluZSB2aWV3J3MgY2hpbGRWaWV3cyBwcm9wZXJ0eSB0aGF0IHdhcyBvYmxp
dGVyYXRlZAotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICdjaGlsZFZpZXdzJywgRW1i
ZXIuVmlldy5jaGlsZFZpZXdzUHJvcGVydHkpOworICAgIEBtZXRob2QgYWRkSXRlbXMKKyAgICBA
cGFyYW0gaW5kZXgKKyAgICBAcGFyYW0gbmV3SXRlbXMKKyAgKi8KKyAgYWRkSXRlbXM6IGZ1bmN0
aW9uIChpbmRleCwgbmV3SXRlbXMpIHsKKyAgICB2YXIgY291bnQgPSBnZXQobmV3SXRlbXMsICds
ZW5ndGgnKTsKKyAgICBpZiAoY291bnQgPCAxKSB7IHJldHVybjsgfQogCi0gICAgdmFyIF9jaGls
ZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKKyAgICB2YXIgbWF0Y2ggPSB0aGlzLl9maW5kQXJy
YXlPcGVyYXRpb24oaW5kZXgpLAorICAgICAgICBhcnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJh
dGlvbiwKKyAgICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1hdGNoLmluZGV4LAorICAgICAg
ICBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5nZVN0YXJ0LAorICAgICAgICBj
b21wb3NlSW5kZXgsCisgICAgICAgIHNwbGl0SW5kZXgsCisgICAgICAgIHNwbGl0SXRlbXMsCisg
ICAgICAgIHNwbGl0QXJyYXlPcGVyYXRpb24sCisgICAgICAgIG5ld0FycmF5T3BlcmF0aW9uOwog
Ci0gICAgZm9yRWFjaChjaGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3TmFtZSwgaWR4KSB7Ci0gICAg
ICB2YXIgdmlldzsKKyAgICBuZXdBcnJheU9wZXJhdGlvbiA9IG5ldyBBcnJheU9wZXJhdGlvbihJ
TlNFUlQsIGNvdW50LCBuZXdJdGVtcyk7CiAKLSAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9m
IHZpZXdOYW1lKSB7Ci0gICAgICAgIHZpZXcgPSBnZXQodGhpcywgdmlld05hbWUpOwotICAgICAg
ICB2aWV3ID0gdGhpcy5jcmVhdGVDaGlsZFZpZXcodmlldyk7Ci0gICAgICAgIHNldCh0aGlzLCB2
aWV3TmFtZSwgdmlldyk7CisgICAgaWYgKGFycmF5T3BlcmF0aW9uKSB7CisgICAgICBpZiAoIW1h
dGNoLnNwbGl0KSB7CisgICAgICAgIC8vIGluc2VydCBsZWZ0IG9mIGFycmF5T3BlcmF0aW9uCisg
ICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5l
d0FycmF5T3BlcmF0aW9uKTsKKyAgICAgICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVyYXRpb25J
bmRleDsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmll
dyh2aWV3TmFtZSk7CisgICAgICAgIHRoaXMuX3NwbGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGlu
ZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7CisgICAg
ICAgIGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXggKyAxOwogICAgICAgfQotCi0g
ICAgICBfY2hpbGRWaWV3c1tpZHhdID0gdmlldzsKLSAgICB9LCB0aGlzKTsKLQotICAgIHZhciBj
dXJyZW50VmlldyA9IGdldCh0aGlzLCAnY3VycmVudFZpZXcnKTsKLSAgICBpZiAoY3VycmVudFZp
ZXcpIHsKLSAgICAgIF9jaGlsZFZpZXdzLnB1c2godGhpcy5jcmVhdGVDaGlsZFZpZXcoY3VycmVu
dFZpZXcpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW5zZXJ0IGF0IGVuZAorICAgICAgdGhp
cy5fb3BlcmF0aW9ucy5wdXNoKG5ld0FycmF5T3BlcmF0aW9uKTsKKyAgICAgIGNvbXBvc2VJbmRl
eCA9IGFycmF5T3BlcmF0aW9uSW5kZXg7CiAgICAgfQorCisgICAgdGhpcy5fY29tcG9zZUluc2Vy
dChjb21wb3NlSW5kZXgpOwogICB9LAogCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKGlkeCwgcmVtb3Zl
ZENvdW50LCBhZGRlZFZpZXdzKSB7Ci0gICAgdmFyIGFkZGVkQ291bnQgPSBhZGRlZFZpZXdzID8g
Z2V0KGFkZGVkVmlld3MsICdsZW5ndGgnKSA6IDA7CisgIC8qKgorICAgIFRyYWNrIHRoYXQgYGNv
dW50YCBpdGVtcyB3ZXJlIHJlbW92ZWQgYXQgYGluZGV4YC4KIAotICAgIHRoaXMuYXJyYXlDb250
ZW50V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Ci0gICAgdGhpcy5j
aGlsZFZpZXdzV2lsbENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3VudCk7
CisgICAgQG1ldGhvZCByZW1vdmVJdGVtcworICAgIEBwYXJhbSBpbmRleAorICAgIEBwYXJhbSBj
b3VudAorICAqLworICByZW1vdmVJdGVtczogZnVuY3Rpb24gKGluZGV4LCBjb3VudCkgeworICAg
IGlmIChjb3VudCA8IDEpIHsgcmV0dXJuOyB9CiAKLSAgICBpZiAoYWRkZWRDb3VudCA9PT0gMCkg
ewotICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2UoaWR4LCByZW1vdmVkQ291bnQpIDsKKyAg
ICB2YXIgbWF0Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRpb24oaW5kZXgpLAorICAgICAgICBh
cnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKKyAgICAgICAgYXJyYXlPcGVyYXRpb25J
bmRleCA9IG1hdGNoLmluZGV4LAorICAgICAgICBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSBt
YXRjaC5yYW5nZVN0YXJ0LAorICAgICAgICBuZXdBcnJheU9wZXJhdGlvbiwKKyAgICAgICAgY29t
cG9zZUluZGV4OworCisgICAgbmV3QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24o
REVMRVRFLCBjb3VudCk7CisgICAgaWYgKCFtYXRjaC5zcGxpdCkgeworICAgICAgLy8gaW5zZXJ0
IGxlZnQgb2YgYXJyYXlPcGVyYXRpb24KKyAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGFy
cmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0aW9uKTsKKyAgICAgIGNvbXBvc2VJ
bmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgIHZhciBhcmdz
ID0gW2lkeCwgcmVtb3ZlZENvdW50XS5jb25jYXQoYWRkZWRWaWV3cyk7Ci0gICAgICB0aGlzLl9j
aGlsZFZpZXdzLnNwbGljZS5hcHBseSh0aGlzLl9jaGlsZFZpZXdzLCBhcmdzKTsKKyAgICAgIHRo
aXMuX3NwbGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5n
ZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7CisgICAgICBjb21wb3NlSW5kZXggPSBhcnJheU9w
ZXJhdGlvbkluZGV4ICsgMTsKICAgICB9CiAKLSAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5n
ZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Ci0gICAgdGhpcy5jaGlsZFZpZXdzRGlk
Q2hhbmdlKHRoaXMuX2NoaWxkVmlld3MsIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsK
LQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIG9iamVjdEF0OiBmdW5jdGlvbihpZHgpIHsK
LSAgICByZXR1cm4gdGhpcy5fY2hpbGRWaWV3c1tpZHhdOworICAgIHJldHVybiB0aGlzLl9jb21w
b3NlRGVsZXRlKGNvbXBvc2VJbmRleCk7CiAgIH0sCiAKLSAgbGVuZ3RoOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbiAoKSB7Ci0gICAgcmV0dXJuIHRoaXMuX2NoaWxkVmlld3MubGVuZ3RoOwotICB9
KSwKLQogICAvKioKLSAgICBAcHJpdmF0ZQorICAgIEFwcGx5IGFsbCBvcGVyYXRpb25zLCByZWR1
Y2luZyB0aGVtIHRvIHJldGFpbjpuLCBmb3IgYG5gLCB0aGUgbnVtYmVyIG9mCisgICAgaXRlbXMg
aW4gdGhlIGFycmF5LgogCi0gICAgSW5zdHJ1Y3RzIGVhY2ggY2hpbGQgdmlldyB0byByZW5kZXIg
dG8gdGhlIHBhc3NlZCByZW5kZXIgYnVmZmVyLgorICAgIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxs
ZWQgZm9yIGVhY2ggb3BlcmF0aW9uIGFuZCB3aWxsIGJlIHBhc3NlZCB0aGUgZm9sbG93aW5nIGFy
Z3VtZW50czoKIAotICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFtIHtFbWJlci5SZW5kZXJC
dWZmZXJ9IGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHJlbmRlciB0bworICAgICoge2FycmF5fSBpdGVt
cyBUaGUgaXRlbXMgZm9yIHRoZSBnaXZlbiBvcGVyYXRpb24KKyAgICAqIHtudW1iZXJ9IG9mZnNl
dCBUaGUgY29tcHV0ZWQgb2Zmc2V0IG9mIHRoZSBpdGVtcywgaWUgdGhlIGluZGV4IGluIHRoZQor
ICAgIGFycmF5IG9mIHRoZSBmaXJzdCBpdGVtIGZvciB0aGlzIG9wZXJhdGlvbi4KKyAgICAqIHtz
dHJpbmd9IG9wZXJhdGlvbiBUaGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uLiAgT25lIG9mCisgICAg
YEVtYmVyLlRyYWNrZWRBcnJheS57UkVUQUlOLCBERUxFVEUsIElOU0VSVH1gCisKKyAgICBAbWV0
aG9kIGFwcGx5CisgICAgQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sKICAgKi8KLSAgcmVuZGVy
OiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24o
dmlldykgewotICAgICAgdmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOworICBhcHBseTogZnVu
Y3Rpb24gKGNhbGxiYWNrKSB7CisgICAgdmFyIGl0ZW1zID0gW10sCisgICAgICAgIG9mZnNldCA9
IDA7CisKKyAgICBmb3JFYWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0aW9uIChhcnJheU9wZXJh
dGlvbikgeworICAgICAgY2FsbGJhY2soYXJyYXlPcGVyYXRpb24uaXRlbXMsIG9mZnNldCwgYXJy
YXlPcGVyYXRpb24udHlwZSk7CisKKyAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50eXBlICE9PSBE
RUxFVEUpIHsKKyAgICAgICAgb2Zmc2V0ICs9IGFycmF5T3BlcmF0aW9uLmNvdW50OworICAgICAg
ICBpdGVtcyA9IGl0ZW1zLmNvbmNhdChhcnJheU9wZXJhdGlvbi5pdGVtcyk7CisgICAgICB9CiAg
ICAgfSk7Ci0gIH0sCiAKLSAgaW5zdHJ1bWVudE5hbWU6ICdyZW5kZXIuY29udGFpbmVyJywKKyAg
ICB0aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJheU9wZXJhdGlvbihSRVRBSU4sIGl0ZW1zLmxl
bmd0aCwgaXRlbXMpXTsKKyAgfSwKIAogICAvKioKKyAgICBSZXR1cm4gYW4gYEFycmF5T3BlcmF0
aW9uTWF0Y2hgIGZvciB0aGUgb3BlcmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIGl0ZW0gYXQgYGlu
ZGV4YC4KKworICAgIEBtZXRob2QgX2ZpbmRBcnJheU9wZXJhdGlvbgorCisgICAgQHBhcmFtIHtu
dW1iZXJ9IGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aG9zZSBvcGVyYXRpb24gaW5mb3Jt
YXRpb24KKyAgICBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgQHByaXZhdGUKKyAgKi8KKyAgX2Zp
bmRBcnJheU9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4KSB7CisgICAgdmFyIGFycmF5T3BlcmF0
aW9uSW5kZXgsCisgICAgICAgIGxlbiwKKyAgICAgICAgc3BsaXQgPSBmYWxzZSwKKyAgICAgICAg
YXJyYXlPcGVyYXRpb24sCisgICAgICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCwKKyAgICAg
ICAgYXJyYXlPcGVyYXRpb25SYW5nZUVuZDsKIAotICAgIFdoZW4gYSBjaGlsZCB2aWV3IGlzIHJl
bW92ZWQsIGRlc3Ryb3kgaXRzIGVsZW1lbnQgc28gdGhhdAotICAgIGl0IGlzIHJlbW92ZWQgZnJv
bSB0aGUgRE9NLgorICAgIC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzZWFyY2ggdGhlc2UgZmFzdGVy
IGlmIHdlIGtlcHQgYSBiYWxhbmNlZCB0cmVlLgorICAgIC8vIGZpbmQgbGVmdG1vc3QgYXJyYXlP
cGVyYXRpb24gdG8gdGhlIHJpZ2h0IG9mIGBpbmRleGAKKyAgICBmb3IgKGFycmF5T3BlcmF0aW9u
SW5kZXggPSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0aGlzLl9vcGVyYXRp
b25zLmxlbmd0aDsgYXJyYXlPcGVyYXRpb25JbmRleCA8IGxlbjsgKythcnJheU9wZXJhdGlvbklu
ZGV4KSB7CisgICAgICBhcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbYXJyYXlPcGVy
YXRpb25JbmRleF07CiAKLSAgICBUaGUgYXJyYXkgb2JzZXJ2ZXIgdGhhdCB0cmlnZ2VycyB0aGlz
IGFjdGlvbiBpcyBzZXQgdXAgaW4gdGhlCi0gICAgYHJlbmRlclRvQnVmZmVyYCBtZXRob2QuCisg
ICAgICBpZiAoYXJyYXlPcGVyYXRpb24udHlwZSA9PT0gREVMRVRFKSB7IGNvbnRpbnVlOyB9CiAK
LSAgICBAbWV0aG9kIGNoaWxkVmlld3NXaWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtFbWJlci5BcnJh
eX0gdmlld3MgdGhlIGNoaWxkIHZpZXdzIGFycmF5IGJlZm9yZSBtdXRhdGlvbgotICAgIEBwYXJh
bSB7TnVtYmVyfSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG11dGF0aW9uCi0gICAg
QHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgdGhlIG51bWJlciBvZiBjaGlsZCB2aWV3cyByZW1vdmVk
Ci0gICoqLwotICBjaGlsZFZpZXdzV2lsbENoYW5nZTogZnVuY3Rpb24odmlld3MsIHN0YXJ0LCBy
ZW1vdmVkKSB7Ci0gICAgdGhpcy5wcm9wZXJ0eVdpbGxDaGFuZ2UoJ2NoaWxkVmlld3MnKTsKKyAg
ICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQgPSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgKyBh
cnJheU9wZXJhdGlvbi5jb3VudCAtIDE7CiAKLSAgICBpZiAocmVtb3ZlZCA+IDApIHsKLSAgICAg
IHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5zbGljZShzdGFydCwgc3RhcnQrcmVtb3ZlZCk7Ci0g
ICAgICAvLyB0cmFuc2l0aW9uIHRvIHByZVJlbmRlciBiZWZvcmUgY2xlYXJpbmcgcGFyZW50Vmll
dwotICAgICAgdGhpcy5jdXJyZW50U3RhdGUuY2hpbGRWaWV3c1dpbGxDaGFuZ2UodGhpcywgdmll
d3MsIHN0YXJ0LCByZW1vdmVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNoYW5nZWRW
aWV3cywgbnVsbCwgbnVsbCk7CisgICAgICBpZiAoaW5kZXggPT09IGFycmF5T3BlcmF0aW9uUmFu
Z2VTdGFydCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiBhcnJh
eU9wZXJhdGlvblJhbmdlU3RhcnQgJiYgaW5kZXggPD0gYXJyYXlPcGVyYXRpb25SYW5nZUVuZCkg
eworICAgICAgICBzcGxpdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0ID0gYXJyYXlPcGVyYXRpb25SYW5nZUVu
ZCArIDE7CisgICAgICB9CiAgICAgfQotICB9LAogCi0gIHJlbW92ZUNoaWxkOiBmdW5jdGlvbihj
aGlsZCkgewotICAgIHRoaXMucmVtb3ZlT2JqZWN0KGNoaWxkKTsKLSAgICByZXR1cm4gdGhpczsK
KyAgICByZXR1cm4gbmV3IEFycmF5T3BlcmF0aW9uTWF0Y2goYXJyYXlPcGVyYXRpb24sIGFycmF5
T3BlcmF0aW9uSW5kZXgsIHNwbGl0LCBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQpOwogICB9LAog
Ci0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBXaGVuIGEgY2hpbGQgdmlldyBpcyBhZGRlZCwg
bWFrZSBzdXJlIHRoZSBET00gZ2V0cyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgIF9zcGxpdDog
ZnVuY3Rpb24gKGFycmF5T3BlcmF0aW9uSW5kZXgsIHNwbGl0SW5kZXgsIG5ld0FycmF5T3BlcmF0
aW9uKSB7CisgICAgdmFyIGFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1thcnJheU9w
ZXJhdGlvbkluZGV4XSwKKyAgICAgICAgc3BsaXRJdGVtcyA9IGFycmF5T3BlcmF0aW9uLml0ZW1z
LnNsaWNlKHNwbGl0SW5kZXgpLAorICAgICAgICBzcGxpdEFycmF5T3BlcmF0aW9uID0gbmV3IEFy
cmF5T3BlcmF0aW9uKGFycmF5T3BlcmF0aW9uLnR5cGUsIHNwbGl0SXRlbXMubGVuZ3RoLCBzcGxp
dEl0ZW1zKTsKIAotICAgIElmIHRoZSB2aWV3IGhhcyBhbHJlYWR5IHJlbmRlcmVkIGFuIGVsZW1l
bnQsIHdlIHRlbGwgdGhlIGNoaWxkIHZpZXcgdG8KLSAgICBjcmVhdGUgYW4gZWxlbWVudCBhbmQg
aW5zZXJ0IGl0IGludG8gdGhlIERPTS4gSWYgdGhlIGVuY2xvc2luZyBjb250YWluZXIKLSAgICB2
aWV3IGhhcyBhbHJlYWR5IHdyaXR0ZW4gdG8gYSBidWZmZXIsIGJ1dCBub3QgeWV0IGNvbnZlcnRl
ZCB0aGF0IGJ1ZmZlcgotICAgIGludG8gYW4gZWxlbWVudCwgd2UgaW5zZXJ0IHRoZSBzdHJpbmcg
cmVwcmVzZW50YXRpb24gb2YgdGhlIGNoaWxkIGludG8gdGhlCi0gICAgYXBwcm9wcmlhdGUgcGxh
Y2UgaW4gdGhlIGJ1ZmZlci4KKyAgICAvLyB0cnVuY2F0ZSBMSFMKKyAgICBhcnJheU9wZXJhdGlv
bi5jb3VudCA9IHNwbGl0SW5kZXg7CisgICAgYXJyYXlPcGVyYXRpb24uaXRlbXMgPSBhcnJheU9w
ZXJhdGlvbi5pdGVtcy5zbGljZSgwLCBzcGxpdEluZGV4KTsKIAotICAgIEBtZXRob2QgY2hpbGRW
aWV3c0RpZENoYW5nZQotICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBhcnJheSBv
ZiBjaGlsZCB2aWV3cyBhZnRlIHRoZSBtdXRhdGlvbiBoYXMgb2NjdXJyZWQKLSAgICBAcGFyYW0g
e051bWJlcn0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAgIEBw
YXJhbSB7TnVtYmVyfSByZW1vdmVkIHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAot
ICAgIEBwYXJhbSB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNoaWxkIHZpZXdzIGFkZGVkCi0gICov
Ci0gIGNoaWxkVmlld3NEaWRDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCwg
YWRkZWQpIHsKLSAgICBpZiAoYWRkZWQgPiAwKSB7Ci0gICAgICB2YXIgY2hhbmdlZFZpZXdzID0g
dmlld3Muc2xpY2Uoc3RhcnQsIHN0YXJ0K2FkZGVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZp
ZXdzKGNoYW5nZWRWaWV3cywgdGhpcywgZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKSk7Ci0gICAg
ICB0aGlzLmN1cnJlbnRTdGF0ZS5jaGlsZFZpZXdzRGlkQ2hhbmdlKHRoaXMsIHZpZXdzLCBzdGFy
dCwgYWRkZWQpOwotICAgIH0KLSAgICB0aGlzLnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdz
Jyk7CisgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoYXJyYXlPcGVyYXRpb25JbmRleCArIDEs
IDAsIG5ld0FycmF5T3BlcmF0aW9uLCBzcGxpdEFycmF5T3BlcmF0aW9uKTsKICAgfSwKIAotICBp
bml0aWFsaXplVmlld3M6IGZ1bmN0aW9uKHZpZXdzLCBwYXJlbnRWaWV3LCB0ZW1wbGF0ZURhdGEp
IHsKLSAgICBmb3JFYWNoKHZpZXdzLCBmdW5jdGlvbih2aWV3KSB7Ci0gICAgICBzZXQodmlldywg
J19wYXJlbnRWaWV3JywgcGFyZW50Vmlldyk7CisgIC8vIHNlZSBTdWJBcnJheSBmb3IgYSBiZXR0
ZXIgaW1wbGVtZW50YXRpb24uCisgIF9jb21wb3NlSW5zZXJ0OiBmdW5jdGlvbiAoaW5kZXgpIHsK
KyAgICB2YXIgbmV3QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4XSwKKyAg
ICAgICAgbGVmdEFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleC0xXSwgLy8g
bWF5IGJlIHVuZGVmaW5lZAorICAgICAgICByaWdodEFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3Bl
cmF0aW9uc1tpbmRleCsxXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAorICAgICAgICBsZWZ0T3AgPSBs
ZWZ0QXJyYXlPcGVyYXRpb24gJiYgbGVmdEFycmF5T3BlcmF0aW9uLnR5cGUsCisgICAgICAgIHJp
Z2h0T3AgPSByaWdodEFycmF5T3BlcmF0aW9uICYmIHJpZ2h0QXJyYXlPcGVyYXRpb24udHlwZTsK
IAotICAgICAgaWYgKCFnZXQodmlldywgJ3RlbXBsYXRlRGF0YScpKSB7Ci0gICAgICAgIHNldCh2
aWV3LCAndGVtcGxhdGVEYXRhJywgdGVtcGxhdGVEYXRhKTsKKyAgICBpZiAobGVmdE9wID09PSBJ
TlNFUlQpIHsKKyAgICAgICAgLy8gbWVyZ2UgbGVmdAorICAgICAgICBsZWZ0QXJyYXlPcGVyYXRp
b24uY291bnQgKz0gbmV3QXJyYXlPcGVyYXRpb24uY291bnQ7CisgICAgICAgIGxlZnRBcnJheU9w
ZXJhdGlvbi5pdGVtcyA9IGxlZnRBcnJheU9wZXJhdGlvbi5pdGVtcy5jb25jYXQobmV3QXJyYXlP
cGVyYXRpb24uaXRlbXMpOworCisgICAgICBpZiAocmlnaHRPcCA9PT0gSU5TRVJUKSB7CisgICAg
ICAgIC8vIGFsc28gbWVyZ2UgcmlnaHQgKHdlIGhhdmUgc3BsaXQgYW4gaW5zZXJ0IHdpdGggYW4g
aW5zZXJ0KQorICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24uY291bnQgKz0gcmlnaHRBcnJheU9w
ZXJhdGlvbi5jb3VudDsKKyAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zID0gbGVmdEFy
cmF5T3BlcmF0aW9uLml0ZW1zLmNvbmNhdChyaWdodEFycmF5T3BlcmF0aW9uLml0ZW1zKTsKKyAg
ICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIDIpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgLy8gb25seSBtZXJnZSBsZWZ0CisgICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3Bs
aWNlKGluZGV4LCAxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJpZ2h0T3AgPT09IElOU0VS
VCkgeworICAgICAgLy8gbWVyZ2UgcmlnaHQKKyAgICAgIG5ld0FycmF5T3BlcmF0aW9uLmNvdW50
ICs9IHJpZ2h0QXJyYXlPcGVyYXRpb24uY291bnQ7CisgICAgICBuZXdBcnJheU9wZXJhdGlvbi5p
dGVtcyA9IG5ld0FycmF5T3BlcmF0aW9uLml0ZW1zLmNvbmNhdChyaWdodEFycmF5T3BlcmF0aW9u
Lml0ZW1zKTsKKyAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGluZGV4ICsgMSwgMSk7Cisg
ICAgfQorICB9LAorCisgIF9jb21wb3NlRGVsZXRlOiBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICB2
YXIgYXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4XSwKKyAgICAgICAgZGVs
ZXRlc1RvR28gPSBhcnJheU9wZXJhdGlvbi5jb3VudCwKKyAgICAgICAgbGVmdEFycmF5T3BlcmF0
aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleC0xXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAorICAg
ICAgICBsZWZ0T3AgPSBsZWZ0QXJyYXlPcGVyYXRpb24gJiYgbGVmdEFycmF5T3BlcmF0aW9uLnR5
cGUsCisgICAgICAgIG5leHRBcnJheU9wZXJhdGlvbiwKKyAgICAgICAgbmV4dE9wLAorICAgICAg
ICBuZXh0Q291bnQsCisgICAgICAgIHJlbW92ZU5ld0FuZE5leHRPcCA9IGZhbHNlLAorICAgICAg
ICByZW1vdmVkSXRlbXMgPSBbXTsKKworICAgIGlmIChsZWZ0T3AgPT09IERFTEVURSkgeworICAg
ICAgYXJyYXlPcGVyYXRpb24gPSBsZWZ0QXJyYXlPcGVyYXRpb247CisgICAgICBpbmRleCAtPSAx
OworICAgIH0KKworICAgIGZvciAodmFyIGkgPSBpbmRleCArIDE7IGRlbGV0ZXNUb0dvID4gMDsg
KytpKSB7CisgICAgICBuZXh0QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2ldOwor
ICAgICAgbmV4dE9wID0gbmV4dEFycmF5T3BlcmF0aW9uLnR5cGU7CisgICAgICBuZXh0Q291bnQg
PSBuZXh0QXJyYXlPcGVyYXRpb24uY291bnQ7CisKKyAgICAgIGlmIChuZXh0T3AgPT09IERFTEVU
RSkgeworICAgICAgICBhcnJheU9wZXJhdGlvbi5jb3VudCArPSBuZXh0Q291bnQ7CisgICAgICAg
IGNvbnRpbnVlOwogICAgICAgfQotICAgIH0pOwotICB9LAogCi0gIGN1cnJlbnRWaWV3OiBudWxs
LAorICAgICAgaWYgKG5leHRDb3VudCA+IGRlbGV0ZXNUb0dvKSB7CisgICAgICAgIC8vIGQ6MiB7
cixpfTo1ICB3ZSByZWR1Y2UgdGhlIHJldGFpbiBvciBpbnNlcnQsIGJ1dCBpdCBzdGF5cworICAg
ICAgICByZW1vdmVkSXRlbXMgPSByZW1vdmVkSXRlbXMuY29uY2F0KG5leHRBcnJheU9wZXJhdGlv
bi5pdGVtcy5zcGxpY2UoMCwgZGVsZXRlc1RvR28pKTsKKyAgICAgICAgbmV4dEFycmF5T3BlcmF0
aW9uLmNvdW50IC09IGRlbGV0ZXNUb0dvOwogCi0gIF9jdXJyZW50Vmlld1dpbGxDaGFuZ2U6IEVt
YmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXJyZW50VmlldyA9IGdl
dCh0aGlzLCAnY3VycmVudFZpZXcnKTsKLSAgICBpZiAoY3VycmVudFZpZXcpIHsKLSAgICAgIGN1
cnJlbnRWaWV3LmRlc3Ryb3koKTsKLSAgICB9Ci0gIH0sICdjdXJyZW50VmlldycpLAorICAgICAg
ICAvLyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSB0cnVuY2F0ZSB0aGUgbGFzdCBhcnJheU9wZXJhdGlv
biwgd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICAvLyByZW1vdmUgaXQ7IGFsc28gdGhlIGRlbGV0
ZXNUb0dvIHJlZHVjdGlvbiBpcyBub3QgdGhlIGVudGlyZXR5IG9mCisgICAgICAgIC8vIG5leHRD
b3VudAorICAgICAgICBpIC09IDE7CisgICAgICAgIG5leHRDb3VudCA9IGRlbGV0ZXNUb0dvOwog
Ci0gIF9jdXJyZW50Vmlld0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOwotICAgIGlmIChj
dXJyZW50VmlldykgewotICAgICAgdGhpcy5wdXNoT2JqZWN0KGN1cnJlbnRWaWV3KTsKKyAgICAg
ICAgZGVsZXRlc1RvR28gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5leHRDb3Vu
dCA9PT0gZGVsZXRlc1RvR28pIHsKKyAgICAgICAgICAvLyBIYW5kbGUgZWRnZSBjYXNlIG9mIGQ6
MiBpOjIgaW4gd2hpY2ggY2FzZSBib3RoIG9wZXJhdGlvbnMgZ28gYXdheQorICAgICAgICAgIC8v
IGR1cmluZyBjb21wb3NpdGlvbi4KKyAgICAgICAgICByZW1vdmVOZXdBbmROZXh0T3AgPSB0cnVl
OworICAgICAgICB9CisgICAgICAgIHJlbW92ZWRJdGVtcyA9IHJlbW92ZWRJdGVtcy5jb25jYXQo
bmV4dEFycmF5T3BlcmF0aW9uLml0ZW1zKTsKKyAgICAgICAgZGVsZXRlc1RvR28gLT0gbmV4dENv
dW50OworICAgICAgfQorCisgICAgICBpZiAobmV4dE9wID09PSBJTlNFUlQpIHsKKyAgICAgICAg
Ly8gZDoyIGk6MyB3aWxsIHJlc3VsdCBpbiBkZWxldGUgZ29pbmcgYXdheQorICAgICAgICBhcnJh
eU9wZXJhdGlvbi5jb3VudCAtPSBuZXh0Q291bnQ7CisgICAgICB9CiAgICAgfQotICB9LCAnY3Vy
cmVudFZpZXcnKSwKIAotICBfZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTTogZnVuY3Rpb24gKCkgewot
ICAgIHRoaXMuY3VycmVudFN0YXRlLmVuc3VyZUNoaWxkcmVuQXJlSW5ET00odGhpcyk7Ci0gIH0K
LX0pOworICAgIGlmIChhcnJheU9wZXJhdGlvbi5jb3VudCA+IDApIHsKKyAgICAgIC8vIGNvbXBv
c2Ugb3VyIG5ldyBkZWxldGUgd2l0aCBwb3NzaWJseSBzZXZlcmFsIG9wZXJhdGlvbnMgdG8gdGhl
IHJpZ2h0IG9mCisgICAgICAvLyBkaXNwYXJhdGUgdHlwZXMKKyAgICAgIHRoaXMuX29wZXJhdGlv
bnMuc3BsaWNlKGluZGV4KzEsIGktMS1pbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRo
ZSBkZWxldGUgb3BlcmF0aW9uIGNhbiBnbyBhd2F5OyBpdCBoYXMgbWVyZWx5IHJlZHVjZWQgc29t
ZSBvdGhlcgorICAgICAgLy8gb3BlcmF0aW9uLCBhcyBpbiBkOjMgaTo0OyBpdCBtYXkgYWxzbyBo
YXZlIGVsaW1pbmF0ZWQgdGhhdCBvcGVyYXRpb24sCisgICAgICAvLyBhcyBpbiBkOjMgaTozLgor
ICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIHJlbW92ZU5ld0FuZE5leHRPcCA/
IDIgOiAxKTsKKyAgICB9CiAKLUVtYmVyLm1lcmdlKHN0YXRlcy5fZGVmYXVsdCwgewotICBjaGls
ZFZpZXdzV2lsbENoYW5nZTogRW1iZXIuSywKLSAgY2hpbGRWaWV3c0RpZENoYW5nZTogRW1iZXIu
SywKLSAgZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTTogRW1iZXIuSwotfSk7CisgICAgcmV0dXJuIHJl
bW92ZWRJdGVtczsKKyAgfSwKIAotRW1iZXIubWVyZ2Uoc3RhdGVzLmluQnVmZmVyLCB7Ci0gIGNo
aWxkVmlld3NEaWRDaGFuZ2U6IGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXdzLCBzdGFydCwgYWRk
ZWQpIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGNoaWxkIHZpZXdz
IHdoaWxlIGluIHRoZSBpbkJ1ZmZlciBzdGF0ZScpOworICB0b1N0cmluZzogZnVuY3Rpb24gKCkg
eworICAgIHZhciBzdHIgPSAiIjsKKyAgICBmb3JFYWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0
aW9uIChvcGVyYXRpb24pIHsKKyAgICAgIHN0ciArPSAiICIgKyBvcGVyYXRpb24udHlwZSArICI6
IiArIG9wZXJhdGlvbi5jb3VudDsKKyAgICB9KTsKKyAgICByZXR1cm4gc3RyLnN1YnN0cmluZygx
KTsKICAgfQotfSk7Cit9OwogCi1FbWJlci5tZXJnZShzdGF0ZXMuaGFzRWxlbWVudCwgewotICBj
aGlsZFZpZXdzV2lsbENoYW5nZTogZnVuY3Rpb24odmlldywgdmlld3MsIHN0YXJ0LCByZW1vdmVk
KSB7Ci0gICAgZm9yICh2YXIgaT1zdGFydDsgaTxzdGFydCtyZW1vdmVkOyBpKyspIHsKLSAgICAg
IHZpZXdzW2ldLnJlbW92ZSgpOwotICAgIH0KLSAgfSwKKy8qKgorICBJbnRlcm5hbCBkYXRhIHN0
cnVjdHVyZSB0byByZXByZXNlbnQgYW4gYXJyYXkgb3BlcmF0aW9uLgogCi0gIGNoaWxkVmlld3NE
aWRDaGFuZ2U6IGZ1bmN0aW9uKHZpZXcsIHZpZXdzLCBzdGFydCwgYWRkZWQpIHsKLSAgICBFbWJl
ci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB2aWV3LCAnX2Vuc3VyZUNoaWxkcmVuQXJlSW5E
T00nKTsKLSAgfSwKKyAgQG1ldGhvZCBBcnJheU9wZXJhdGlvbgorICBAcHJpdmF0ZQorICBAcGFy
YW0ge3N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uLiAgT25lIG9mCisgIGBF
bWJlci5UcmFja2VkQXJyYXkue1JFVEFJTiwgSU5TRVJULCBERUxFVEV9YAorICBAcGFyYW0ge251
bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIG9wZXJhdGlvbi4KKyAgQHBh
cmFtIHthcnJheX0gaXRlbXMgVGhlIGl0ZW1zIG9mIHRoZSBvcGVyYXRpb24sIGlmIGluY2x1ZGVk
LiAgUkVUQUlOIGFuZAorICBJTlNFUlQgaW5jbHVkZSB0aGVpciBpdGVtcywgREVMRVRFIGRvZXMg
bm90LgorKi8KK2Z1bmN0aW9uIEFycmF5T3BlcmF0aW9uIChvcGVyYXRpb24sIGNvdW50LCBpdGVt
cykgeworICB0aGlzLnR5cGUgPSBvcGVyYXRpb247IC8vIFJFVEFJTiB8IElOU0VSVCB8IERFTEVU
RQorICB0aGlzLmNvdW50ID0gY291bnQ7CisgIHRoaXMuaXRlbXMgPSBpdGVtczsKK30KIAotICBl
bnN1cmVDaGlsZHJlbkFyZUluRE9NOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmFyIGNoaWxkVmll
d3MgPSB2aWV3Ll9jaGlsZFZpZXdzLCBpLCBsZW4sIGNoaWxkVmlldywgcHJldmlvdXMsIGJ1ZmZl
cjsKLSAgICBmb3IgKGkgPSAwLCBsZW4gPSBjaGlsZFZpZXdzLmxlbmd0aDsgaSA8IGxlbjsgaSsr
KSB7Ci0gICAgICBjaGlsZFZpZXcgPSBjaGlsZFZpZXdzW2ldOwotICAgICAgYnVmZmVyID0gY2hp
bGRWaWV3LnJlbmRlclRvQnVmZmVySWZOZWVkZWQoKTsKLSAgICAgIGlmIChidWZmZXIpIHsKLSAg
ICAgICAgY2hpbGRWaWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbEluc2VydEVsZW1lbnQnKTsK
LSAgICAgICAgaWYgKHByZXZpb3VzKSB7Ci0gICAgICAgICAgcHJldmlvdXMuZG9tTWFuYWdlci5h
ZnRlcihwcmV2aW91cywgYnVmZmVyLnN0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICB2aWV3LmRvbU1hbmFnZXIucHJlcGVuZCh2aWV3LCBidWZmZXIuc3RyaW5nKCkpOwotICAg
ICAgICB9Ci0gICAgICAgIGNoaWxkVmlldy50cmFuc2l0aW9uVG8oJ2luRE9NJyk7Ci0gICAgICAg
IGNoaWxkVmlldy5wcm9wZXJ0eURpZENoYW5nZSgnZWxlbWVudCcpOwotICAgICAgICBjaGlsZFZp
ZXcudHJpZ2dlclJlY3Vyc2l2ZWx5KCdkaWRJbnNlcnRFbGVtZW50Jyk7Ci0gICAgICB9Ci0gICAg
ICBwcmV2aW91cyA9IGNoaWxkVmlldzsKLSAgICB9Ci0gIH0KLX0pOworLyoqCisgIEludGVybmFs
IGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiB3aGVuIGxvb2tpbmcg
dXAgb3BlcmF0aW9ucworICBieSBpdGVtIGluZGV4LgorCisgIEBtZXRob2QgQXJyYXlPcGVyYXRp
b25NYXRjaAorICBAcHJpdmF0ZQorICBAcGFyYW0ge0FycmF5T3BlcmF0aW9ufSBvcGVyYXRpb24K
KyAgQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiBgb3BlcmF0aW9uYCBpbiB0aGUg
YXJyYXkgb2Ygb3BlcmF0aW9ucy4KKyAgQHBhcmFtIHtib29sZWFufSBzcGxpdCBXaGV0aGVyIG9y
IG5vdCB0aGUgaXRlbSBpbmRleCBzZWFyY2hlZCBmb3Igd291bGQKKyAgcmVxdWlyZSBhIHNwbGl0
IGZvciBhIG5ldyBvcGVyYXRpb24gdHlwZS4KKyAgQHBhcmFtIHtudW1iZXJ9IHJhbmdlU3RhcnQg
VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBvcGVyYXRpb24sCisgIHdpdGggcmVz
cGVjdCB0byB0aGUgdHJhY2tlZCBhcnJheS4gIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBpdGVtIGNh
biBiZSBjb21wdXRlZAorICBmcm9tIGByYW5nZVN0YXJ0YCBhbmQgYG9wZXJhdGlvbi5jb3VudGAu
CisqLworZnVuY3Rpb24gQXJyYXlPcGVyYXRpb25NYXRjaChvcGVyYXRpb24sIGluZGV4LCBzcGxp
dCwgcmFuZ2VTdGFydCkgeworICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgdGhpcy5p
bmRleCA9IGluZGV4OworICB0aGlzLnNwbGl0ID0gc3BsaXQ7CisgIHRoaXMucmFuZ2VTdGFydCA9
IHJhbmdlU3RhcnQ7Cit9CiAKIH0pKCk7CiAKIAogCiAoZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LAorICAgIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKKyAgICBSRVRB
SU4gPSAncicsCisgICAgRklMVEVSID0gJ2YnOwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7CitmdW5jdGlvbiBPcGVyYXRpb24g
KHR5cGUsIGNvdW50KSB7CisgIHRoaXMudHlwZSA9IHR5cGU7CisgIHRoaXMuY291bnQgPSBjb3Vu
dDsKK30KIAogLyoqCi0gIGBFbWJlci5Db2xsZWN0aW9uVmlld2AgaXMgYW4gYEVtYmVyLlZpZXdg
IGRlc2NlbmRlbnQgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nCi0gIGEgY29sbGVjdGlvbiAoYW4g
YXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QpIGJ5IG1haW50YWluZyBhIGNoaWxkIHZpZXcgb2Jq
ZWN0Ci0gIGFuZCBhc3NvY2lhdGVkIERPTSByZXByZXNlbnRhdGlvbiBmb3IgZWFjaCBpdGVtIGlu
IHRoZSBhcnJheSBhbmQgZW5zdXJpbmcKLSAgdGhhdCBjaGlsZCB2aWV3cyBhbmQgdGhlaXIgYXNz
b2NpYXRlZCByZW5kZXJlZCBIVE1MIGFyZSB1cGRhdGVkIHdoZW4gaXRlbXMgaW4KLSAgdGhlIGFy
cmF5IGFyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCisgIEFuIGBFbWJlci5TdWJBcnJh
eWAgdHJhY2tzIGFuIGFycmF5IGluIGEgd2F5IHNpbWlsYXIgdG8sIGJ1dCBtb3JlIHNwZWNpYWxp
emVkCisgIHRoYW4sIGBFbWJlci5UcmFja2VkQXJyYXlgLiAgSXQgaXMgdXNlZnVsIGZvciBrZWVw
aW5nIHRyYWNrIG9mIHRoZSBpbmRleGVzIG9mCisgIGl0ZW1zIHdpdGhpbiBhIGZpbHRlcmVkIGFy
cmF5LgogCi0gICMjIFNldHRpbmcgY29udGVudAorICBAY2xhc3MgU3ViQXJyYXkKKyAgQG5hbWVz
cGFjZSBFbWJlcgorKi8KK0VtYmVyLlN1YkFycmF5ID0gZnVuY3Rpb24gKGxlbmd0aCkgeworICBp
ZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHsgbGVuZ3RoID0gMDsgfQogCi0gIFRoZSBtYW5hZ2Vk
IGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBpcyByZWZlcmVuY2VkIGFzIHRoZSBgRW1iZXIuQ29sbGVj
dGlvblZpZXdgCi0gIGluc3RhbmNlJ3MgYGNvbnRlbnRgIHByb3BlcnR5LgorICBpZiAobGVuZ3Ro
ID4gMCkgeworICAgIHRoaXMuX29wZXJhdGlvbnMgPSBbbmV3IE9wZXJhdGlvbihSRVRBSU4sIGxl
bmd0aCldOworICB9IGVsc2UgeworICAgIHRoaXMuX29wZXJhdGlvbnMgPSBbXTsKKyAgfQorfTsK
IAotICBgYGBqYXZhc2NyaXB0Ci0gIHNvbWVJdGVtc1ZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmll
dy5jcmVhdGUoewotICAgIGNvbnRlbnQ6IFsnQScsICdCJywnQyddCi0gIH0pCi0gIGBgYAorRW1i
ZXIuU3ViQXJyYXkucHJvdG90eXBlID0geworICAvKioKKyAgICBUcmFjayB0aGF0IGFuIGl0ZW0g
d2FzIGFkZGVkIHRvIHRoZSB0cmFja2VkIGFycmF5LgogCi0gIFRoZSB2aWV3IGZvciBlYWNoIGl0
ZW0gaW4gdGhlIGNvbGxlY3Rpb24gd2lsbCBoYXZlIGl0cyBgY29udGVudGAgcHJvcGVydHkgc2V0
Ci0gIHRvIHRoZSBpdGVtLgorICAgIEBtZXRob2QgYWRkSXRlbQogCi0gICMjIFNwZWNpZnlpbmcg
aXRlbVZpZXdDbGFzcworICAgIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhl
IGl0ZW0gaW4gdGhlIHRyYWNrZWQgYXJyYXkuCisgICAgQHBhcmFtIHtib29sZWFufSBtYXRjaCBg
dHJ1ZWAgaWZmIHRoZSBpdGVtIGlzIGluY2x1ZGVkIGluIHRoZSBzdWJhcnJheS4KIAotICBCeSBk
ZWZhdWx0IHRoZSB2aWV3IGNsYXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG1hbmFnZWQgY29sbGVj
dGlvbiB3aWxsIGJlIGFuCi0gIGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YC4gWW91IGNhbiBzdXBw
bHkgYSBkaWZmZXJlbnQgY2xhc3MgYnkgc2V0dGluZyB0aGUKLSAgYENvbGxlY3Rpb25WaWV3YCdz
IGBpdGVtVmlld0NsYXNzYCBwcm9wZXJ0eS4KKyAgICBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRl
eCBvZiB0aGUgaXRlbSBpbiB0aGUgc3ViYXJyYXkuCisgICovCisgIGFkZEl0ZW06IGZ1bmN0aW9u
KGluZGV4LCBtYXRjaCkgeworICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAorICAgICAgICBpdGVt
VHlwZSA9IG1hdGNoID8gUkVUQUlOIDogRklMVEVSLAorICAgICAgICBzZWxmID0gdGhpczsKIAot
ICBHaXZlbiBhbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgIHRo
aXMuX2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9uKG9wZXJhdGlvbiwgb3BlcmF0aW9uSW5k
ZXgsIHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBzZWVuSW5TdWJBcnJheSkgeworICAgICAgdmFyIG5l
d09wZXJhdGlvbiwgc3BsaXRPcGVyYXRpb247CiAKLSAgYGBgamF2YXNjcmlwdCAKLSAgc29tZUl0
ZW1zVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NOYW1lczog
WydhLWNvbGxlY3Rpb24nXSwKLSAgICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAgIGl0ZW1W
aWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoInRoZSBsZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAgIH0pCi0g
IH0pOworICAgICAgaWYgKGl0ZW1UeXBlID09PSBvcGVyYXRpb24udHlwZSkgeworICAgICAgICAr
K29wZXJhdGlvbi5jb3VudDsKKyAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHJhbmdlU3RhcnQp
IHsKKyAgICAgICAgLy8gaW5zZXJ0IHRvIHRoZSBsZWZ0IG9mIGBvcGVyYXRpb25gCisgICAgICAg
IHNlbGYuX29wZXJhdGlvbnMuc3BsaWNlKG9wZXJhdGlvbkluZGV4LCAwLCBuZXcgT3BlcmF0aW9u
KGl0ZW1UeXBlLCAxKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXdPcGVyYXRpb24gPSBu
ZXcgT3BlcmF0aW9uKGl0ZW1UeXBlLCAxKTsKKyAgICAgICAgc3BsaXRPcGVyYXRpb24gPSBuZXcg
T3BlcmF0aW9uKG9wZXJhdGlvbi50eXBlLCByYW5nZUVuZCAtIGluZGV4ICsgMSk7CisgICAgICAg
IG9wZXJhdGlvbi5jb3VudCA9IGluZGV4IC0gcmFuZ2VTdGFydDsKIAotICBzb21lSXRlbXNWaWV3
LmFwcGVuZFRvKCdib2R5Jyk7Ci0gIGBgYAorICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGlj
ZShvcGVyYXRpb25JbmRleCArIDEsIDAsIG5ld09wZXJhdGlvbiwgc3BsaXRPcGVyYXRpb24pOwor
ICAgICAgfQogCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmUK
KyAgICAgIGlmIChtYXRjaCkgeworICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09IFJFVEFJ
TikgeworICAgICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXkgKyAoaW5kZXggLSBy
YW5nZVN0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm5WYWx1ZSA9IHNl
ZW5JblN1YkFycmF5OworICAgICAgICB9CisgICAgICB9CiAKLSAgYGBgaHRtbAotICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3IGEtY29sbGVjdGlvbiI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmll
dyI+dGhlIGxldHRlcjogQTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBs
ZXR0ZXI6IEI8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBD
PC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKKyAgICAgIHNlbGYuX2NvbXBvc2VBdChvcGVyYXRpb25J
bmRleCk7CisgICAgfSwgZnVuY3Rpb24oc2VlbkluU3ViQXJyYXkpIHsKKyAgICAgIHNlbGYuX29w
ZXJhdGlvbnMucHVzaChuZXcgT3BlcmF0aW9uKGl0ZW1UeXBlLCAxKSk7CiAKLSAgIyMgQXV0b21h
dGljIG1hdGNoaW5nIG9mIHBhcmVudC9jaGlsZCB0YWdOYW1lcworICAgICAgaWYgKG1hdGNoKSB7
CisgICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7CisgICAgICB9CiAKLSAgU2V0
dGluZyB0aGUgYHRhZ05hbWVgIHByb3BlcnR5IG9mIGEgYENvbGxlY3Rpb25WaWV3YCB0byBhbnkg
b2YKLSAgInVsIiwgIm9sIiwgInRhYmxlIiwgInRoZWFkIiwgInRib2R5IiwgInRmb290IiwgInRy
Iiwgb3IgInNlbGVjdCIgd2lsbCByZXN1bHQKLSAgaW4gdGhlIGl0ZW0gdmlld3MgcmVjZWl2aW5n
IGFuIGFwcHJvcHJpYXRlbHkgbWF0Y2hlZCBgdGFnTmFtZWAgcHJvcGVydHkuCisgICAgICBzZWxm
Ll9jb21wb3NlQXQoc2VsZi5fb3BlcmF0aW9ucy5sZW5ndGgtMSk7CisgICAgfSk7CiAKLSAgR2l2
ZW4gYW4gZW1wdHkgYDxib2R5PmAgYW5kIHRoZSBmb2xsb3dpbmcgY29kZToKKyAgICByZXR1cm4g
cmV0dXJuVmFsdWU7CisgIH0sCiAKLSAgYGBgamF2YXNjcmlwdAotICBhblVuZG9yZGVyZWRMaXN0
VmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgdGFnTmFtZTogJ3VsJywK
LSAgICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZp
ZXcuZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRo
ZSBsZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAgIH0pCi0gIH0pOworICAvKioKKyAgICBU
cmFjayB0aGF0IGFuIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2tlZCBhcnJheS4KIAot
ICBhblVuZG9yZGVyZWRMaXN0Vmlldy5hcHBlbmRUbygnYm9keScpOwotICBgYGAKKyAgICBAbWV0
aG9kIHJlbW92ZUl0ZW0KIAotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3Ry
dWN0dXJlCisgICAgQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBp
biB0aGUgdHJhY2tlZCBhcnJheS4KIAotICBgYGBodG1sCi0gIDx1bCBjbGFzcz0iZW1iZXItdmll
dyBhLWNvbGxlY3Rpb24iPgotICAgIDxsaSBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjog
QTwvbGk+Ci0gICAgPGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBCPC9saT4KLSAg
ICA8bGkgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEM8L2xpPgotICA8L3VsPgotICBg
YGAKKyAgICBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgc3Vi
YXJyYXksIG9yIGAtMWAgaWYgdGhlIGl0ZW0KKyAgICB3YXMgbm90IGluIHRoZSBzdWJhcnJheS4K
KyAgKi8KKyAgcmVtb3ZlSXRlbTogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICB2YXIgcmV0dXJuVmFs
dWUgPSAtMSwKKyAgICAgICAgc2VsZiA9IHRoaXM7CiAKLSAgQWRkaXRpb25hbCBgdGFnTmFtZWAg
cGFpcnMgY2FuIGJlIHByb3ZpZGVkIGJ5IGFkZGluZyB0bwotICBgRW1iZXIuQ29sbGVjdGlvblZp
ZXcuQ09OVEFJTkVSX01BUCBgCisgICAgdGhpcy5fZmluZE9wZXJhdGlvbihpbmRleCwgZnVuY3Rp
b24gKG9wZXJhdGlvbiwgb3BlcmF0aW9uSW5kZXgsIHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBzZWVu
SW5TdWJBcnJheSkgeworICAgICAgaWYgKG9wZXJhdGlvbi50eXBlID09PSBSRVRBSU4pIHsKKyAg
ICAgICAgcmV0dXJuVmFsdWUgPSBzZWVuSW5TdWJBcnJheSArIChpbmRleCAtIHJhbmdlU3RhcnQp
OworICAgICAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuQ29sbGVjdGlvblZpZXcuQ09O
VEFJTkVSX01BUFsnYXJ0aWNsZSddID0gJ3NlY3Rpb24nCi0gIGBgYAorICAgICAgaWYgKG9wZXJh
dGlvbi5jb3VudCA+IDEpIHsKKyAgICAgICAgLS1vcGVyYXRpb24uY291bnQ7CisgICAgICB9IGVs
c2UgeworICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGljZShvcGVyYXRpb25JbmRleCwgMSk7
CisgICAgICAgIHNlbGYuX2NvbXBvc2VBdChvcGVyYXRpb25JbmRleCk7CisgICAgICB9CisgICAg
fSwgZnVuY3Rpb24oKSB7CisgICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNhbid0IHJlbW92
ZSBhbiBpdGVtIHRoYXQgaGFzIG5ldmVyIGJlZW4gYWRkZWQuIik7CisgICAgfSk7CiAKLSAgIyMg
UHJvZ3JhbWF0aWMgY3JlYXRpb24gb2YgY2hpbGQgdmlld3MKKyAgICByZXR1cm4gcmV0dXJuVmFs
dWU7CisgIH0sCiAKLSAgRm9yIGNhc2VzIHdoZXJlIGFkZGl0aW9uYWwgY3VzdG9taXphdGlvbiBi
ZXlvbmQgdGhlIHVzZSBvZiBhIHNpbmdsZQotICBgaXRlbVZpZXdDbGFzc2Agb3IgYHRhZ05hbWVg
IG1hdGNoaW5nIGlzIHJlcXVpcmVkIENvbGxlY3Rpb25WaWV3J3MKLSAgYGNyZWF0ZUNoaWxkVmll
d2AgbWV0aG9kIGNhbiBiZSBvdmVyaWRkZW46CiAKLSAgYGBgamF2YXNjcmlwdAotICBDdXN0b21D
b2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7Ci0gICAgY3JlYXRl
Q2hpbGRWaWV3OiBmdW5jdGlvbih2aWV3Q2xhc3MsIGF0dHJzKSB7Ci0gICAgICBpZiAoYXR0cnMu
Y29udGVudC5raW5kID09ICdhbGJ1bScpIHsKLSAgICAgICAgdmlld0NsYXNzID0gQXBwLkFsYnVt
VmlldzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpZXdDbGFzcyA9IEFwcC5Tb25nVmlldzsK
KyAgX2ZpbmRPcGVyYXRpb246IGZ1bmN0aW9uIChpbmRleCwgZm91bmRDYWxsYmFjaywgbm90Rm91
bmRDYWxsYmFjaykgeworICAgIHZhciBvcGVyYXRpb25JbmRleCwKKyAgICAgICAgbGVuLAorICAg
ICAgICBvcGVyYXRpb24sCisgICAgICAgIHJhbmdlU3RhcnQsCisgICAgICAgIHJhbmdlRW5kLAor
ICAgICAgICBzZWVuSW5TdWJBcnJheSA9IDA7CisKKyAgICAvLyBPUFRJTUlaRTogY2hhbmdlIHRv
IGJhbGFuY2VkIHRyZWUKKyAgICAvLyBmaW5kIGxlZnRtb3N0IG9wZXJhdGlvbiB0byB0aGUgcmln
aHQgb2YgYGluZGV4YAorICAgIGZvciAob3BlcmF0aW9uSW5kZXggPSByYW5nZVN0YXJ0ID0gMCwg
bGVuID0gdGhpcy5fb3BlcmF0aW9ucy5sZW5ndGg7IG9wZXJhdGlvbkluZGV4IDwgbGVuOyByYW5n
ZVN0YXJ0ID0gcmFuZ2VFbmQgKyAxLCArK29wZXJhdGlvbkluZGV4KSB7CisgICAgICBvcGVyYXRp
b24gPSB0aGlzLl9vcGVyYXRpb25zW29wZXJhdGlvbkluZGV4XTsKKyAgICAgIHJhbmdlRW5kID0g
cmFuZ2VTdGFydCArIG9wZXJhdGlvbi5jb3VudCAtIDE7CisKKyAgICAgIGlmIChpbmRleCA+PSBy
YW5nZVN0YXJ0ICYmIGluZGV4IDw9IHJhbmdlRW5kKSB7CisgICAgICAgIGZvdW5kQ2FsbGJhY2so
b3BlcmF0aW9uLCBvcGVyYXRpb25JbmRleCwgcmFuZ2VTdGFydCwgcmFuZ2VFbmQsIHNlZW5JblN1
YkFycmF5KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24udHlw
ZSA9PT0gUkVUQUlOKSB7CisgICAgICAgIHNlZW5JblN1YkFycmF5ICs9IG9wZXJhdGlvbi5jb3Vu
dDsKICAgICAgIH0KLSAgICAgIHRoaXMuX3N1cGVyKHZpZXdDbGFzcywgYXR0cnMpOwogICAgIH0K
LSAgfSk7Ci0gIGBgYAogCi0gICMjIEVtcHR5IFZpZXcKKyAgICBub3RGb3VuZENhbGxiYWNrKHNl
ZW5JblN1YkFycmF5KTsKKyAgfSwKIAotICBZb3UgY2FuIHByb3ZpZGUgYW4gYEVtYmVyLlZpZXdg
IHN1YmNsYXNzIHRvIHRoZSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgCi0gIGluc3RhbmNlIGFzIGl0
cyBgZW1wdHlWaWV3YCBwcm9wZXJ0eS4gSWYgdGhlIGBjb250ZW50YCBwcm9wZXJ0eSBvZiBhCi0g
IGBDb2xsZWN0aW9uVmlld2AgaXMgc2V0IHRvIGBudWxsYCBvciBhbiBlbXB0eSBhcnJheSwgYW4g
aW5zdGFuY2Ugb2YgdGhpcyB2aWV3Ci0gIHdpbGwgYmUgdGhlIGBDb2xsZWN0aW9uVmlld2BzIG9u
bHkgY2hpbGQuCisgIF9jb21wb3NlQXQ6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgdmFyIG9wID0g
dGhpcy5fb3BlcmF0aW9uc1tpbmRleF0sCisgICAgICAgIG90aGVyT3A7CiAKLSAgYGBgamF2YXNj
cmlwdAotICBhTGlzdFdpdGhOb3RoaW5nID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsK
LSAgICBjbGFzc05hbWVzOiBbJ25vdGhpbmcnXQotICAgIGNvbnRlbnQ6IG51bGwsCi0gICAgZW1w
dHlWaWV3OiBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxl
YmFycy5jb21waWxlKCJUaGUgY29sbGVjdGlvbiBpcyBlbXB0eSIpCi0gICAgfSkKLSAgfSk7Cisg
ICAgaWYgKCFvcCkgeworICAgICAgLy8gQ29tcG9zaW5nIG91dCBvZiBib3VuZHMgaXMgYSBuby1v
cCwgYXMgd2hlbiByZW1vdmluZyB0aGUgbGFzdCBvcGVyYXRpb24KKyAgICAgIC8vIGluIHRoZSBs
aXN0LgorICAgICAgcmV0dXJuOworICAgIH0KIAotICBhTGlzdFdpdGhOb3RoaW5nLmFwcGVuZFRv
KCdib2R5Jyk7Ci0gIGBgYAorICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgIG90aGVyT3AgPSB0
aGlzLl9vcGVyYXRpb25zW2luZGV4LTFdOworICAgICAgaWYgKG90aGVyT3AudHlwZSA9PT0gb3Au
dHlwZSkgeworICAgICAgICBvcC5jb3VudCArPSBvdGhlck9wLmNvdW50OworICAgICAgICB0aGlz
Ll9vcGVyYXRpb25zLnNwbGljZShpbmRleC0xLCAxKTsKKyAgICAgICAgLS1pbmRleDsKKyAgICAg
IH0KKyAgICB9CiAKLSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVy
ZQorICAgIGlmIChpbmRleCA8IHRoaXMuX29wZXJhdGlvbnMubGVuZ3RoLTEpIHsKKyAgICAgIG90
aGVyT3AgPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4KzFdOworICAgICAgaWYgKG90aGVyT3AudHlw
ZSA9PT0gb3AudHlwZSkgeworICAgICAgICBvcC5jb3VudCArPSBvdGhlck9wLmNvdW50OworICAg
ICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRleCsxLCAxKTsKKyAgICAgIH0KKyAgICB9
CisgIH0sCiAKLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IG5vdGhpbmciPgot
ICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgICAgVGhlIGNvbGxlY3Rpb24gaXMgZW1w
dHkKLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAorICB0b1N0cmluZzogZnVuY3Rpb24gKCkg
eworICAgIHZhciBzdHIgPSAiIjsKKyAgICBmb3JFYWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0
aW9uIChvcGVyYXRpb24pIHsKKyAgICAgIHN0ciArPSAiICIgKyBvcGVyYXRpb24udHlwZSArICI6
IiArIG9wZXJhdGlvbi5jb3VudDsKKyAgICB9KTsKKyAgICByZXR1cm4gc3RyLnN1YnN0cmluZygx
KTsKKyAgfQorfTsKIAotICAjIyBBZGRpbmcgYW5kIFJlbW92aW5nIGl0ZW1zCit9KSgpOwogCi0g
IFRoZSBgY2hpbGRWaWV3c2AgcHJvcGVydHkgb2YgYSBgQ29sbGVjdGlvblZpZXdgIHNob3VsZCBu
b3QgYmUgZGlyZWN0bHkKLSAgbWFuaXB1bGF0ZWQuIEluc3RlYWQsIGFkZCwgcmVtb3ZlLCByZXBs
YWNlIGl0ZW1zIGZyb20gaXRzIGBjb250ZW50YCBwcm9wZXJ0eS4KLSAgVGhpcyB3aWxsIHRyaWdn
ZXIgYXBwcm9wcmlhdGUgY2hhbmdlcyB0byBpdHMgcmVuZGVyZWQgSFRNTC4KIAotICAjIyBVc2Ug
aW4gdGVtcGxhdGVzIHZpYSB0aGUgYHt7Y29sbGVjdGlvbn19YCBgRW1iZXIuSGFuZGxlYmFyc2Ag
aGVscGVyCiAKLSAgYEVtYmVyLkhhbmRsZWJhcnNgIHByb3ZpZGVzIGEgaGVscGVyIHNwZWNpZmlj
YWxseSBmb3IgYWRkaW5nCi0gIGBDb2xsZWN0aW9uVmlld2BzIHRvIHRlbXBsYXRlcy4gU2VlIGBF
bWJlci5IYW5kbGViYXJzLmNvbGxlY3Rpb25gIGZvciBtb3JlCi0gIGRldGFpbHMKKyhmdW5jdGlv
bigpIHsKK0VtYmVyLkNvbnRhaW5lciA9IHJlcXVpcmVNb2R1bGUoJ2NvbnRhaW5lcicpOworRW1i
ZXIuQ29udGFpbmVyLnNldCA9IEVtYmVyLnNldDsKKworfSkoKTsKKwogCi0gIEBjbGFzcyBDb2xs
ZWN0aW9uVmlldworCisoZnVuY3Rpb24oKSB7CitFbWJlci5BcHBsaWNhdGlvbiA9IEVtYmVyLk5h
bWVzcGFjZS5leHRlbmQoKTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1v
ZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCit2YXIgT1VUX09GX1JB
TkdFX0VYQ0VQVElPTiA9ICJJbmRleCBvdXQgb2YgcmFuZ2UiOwordmFyIEVNUFRZID0gW107CisK
K3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKworLyoqCisgIEFuIEFycmF5
UHJveHkgd3JhcHMgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5
YCBhbmQvb3IKKyAgYEVtYmVyLk11dGFibGVBcnJheSxgIGZvcndhcmRpbmcgYWxsIHJlcXVlc3Rz
LiBUaGlzIG1ha2VzIGl0IHZlcnkgdXNlZnVsIGZvcgorICBhIG51bWJlciBvZiBiaW5kaW5nIHVz
ZSBjYXNlcyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKKyAgb3V0IHRo
ZSB1bmRlcmx5aW5nIGFycmF5IGlzIHVzZWZ1bC4KKworICBBIHNpbXBsZSBleGFtcGxlIG9mIHVz
YWdlOgorCisgIGBgYGphdmFzY3JpcHQKKyAgdmFyIHBldHMgPSBbJ2RvZycsICdjYXQnLCAnZmlz
aCddOworICB2YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7IGNvbnRlbnQ6IEVtYmVy
LkEocGV0cykgfSk7CisKKyAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vICdkb2cnCisgIGFwLnNldCgnY29udGVudCcsIFsnYW1vZWJhJywgJ3BhcmFtZWNp
dW0nXSk7CisgIGFwLmdldCgnZmlyc3RPYmplY3QnKTsgICAgICAgICAgICAgICAgICAgICAgICAv
LyAnYW1vZWJhJworICBgYGAKKworICBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWZ1bCBhcyBh
IGxheWVyIHRvIHRyYW5zZm9ybSB0aGUgY29udGVudHMgb2YKKyAgYW4gYXJyYXksIGFzIHRoZXkg
YXJlIGFjY2Vzc2VkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IG92ZXJyaWRpbmcKKyAgYG9iamVjdEF0
Q29udGVudGA6CisKKyAgYGBgamF2YXNjcmlwdAorICB2YXIgcGV0cyA9IFsnZG9nJywgJ2NhdCcs
ICdmaXNoJ107CisgIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsKKyAgICAgIGNv
bnRlbnQ6IEVtYmVyLkEocGV0cyksCisgICAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlk
eCkgeworICAgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29udGVudCcpLm9iamVjdEF0KGlkeCku
dG9VcHBlckNhc2UoKTsKKyAgICAgIH0KKyAgfSk7CisKKyAgYXAuZ2V0KCdmaXJzdE9iamVjdCcp
OyAvLyAuICdET0cnCisgIGBgYAorCisgIEBjbGFzcyBBcnJheVByb3h5CiAgIEBuYW1lc3BhY2Ug
RW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuQ29udGFpbmVyVmlldwotICBAc2luY2UgRW1iZXIgMC45
CisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICBAdXNlcyBFbWJlci5NdXRhYmxlQXJyYXkKICov
Ci1FbWJlci5Db2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbnRhaW5lclZpZXcuZXh0ZW5kKAotLyoq
IEBzY29wZSBFbWJlci5Db2xsZWN0aW9uVmlldy5wcm90b3R5cGUgKi8geworRW1iZXIuQXJyYXlQ
cm94eSA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuTXV0YWJsZUFycmF5LCB7CiAKICAgLyoq
Ci0gICAgQSBsaXN0IG9mIGl0ZW1zIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgYEVtYmVyLkNvbGxl
Y3Rpb25WaWV3YC4KKyAgICBUaGUgY29udGVudCBhcnJheS4gTXVzdCBiZSBhbiBvYmplY3QgdGhh
dCBpbXBsZW1lbnRzIGBFbWJlci5BcnJheWAgYW5kL29yCisgICAgYEVtYmVyLk11dGFibGVBcnJh
eS5gCiAKICAgICBAcHJvcGVydHkgY29udGVudAogICAgIEB0eXBlIEVtYmVyLkFycmF5Ci0gICAg
QGRlZmF1bHQgbnVsbAogICAqLwogICBjb250ZW50OiBudWxsLAogCiAgIC8qKgotICAgIEBwcml2
YXRlCi0KLSAgICBUaGlzIHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0IHdoYXQga2luZCBvZiBlbXB0
eSB2aWV3IGNsYXNzIHRoaXMKLSAgICBjb2xsZWN0aW9uIHdvdWxkIGxpa2UgaWYgaXQgaXMgYmVp
bmcgaW5zdGFudGlhdGVkIGZyb20gYW5vdGhlcgotICAgIHN5c3RlbSAobGlrZSBIYW5kbGViYXJz
KQorICAgVGhlIGFycmF5IHRoYXQgdGhlIHByb3h5IHByZXRlbmRzIHRvIGJlLiBJbiB0aGUgZGVm
YXVsdCBgQXJyYXlQcm94eWAKKyAgIGltcGxlbWVudGF0aW9uLCB0aGlzIGFuZCBgY29udGVudGAg
YXJlIHRoZSBzYW1lLiBTdWJjbGFzc2VzIG9mIGBBcnJheVByb3h5YAorICAgY2FuIG92ZXJyaWRl
IHRoaXMgcHJvcGVydHkgdG8gcHJvdmlkZSB0aGluZ3MgbGlrZSBzb3J0aW5nIGFuZCBmaWx0ZXJp
bmcuCiAKLSAgICBAcHJvcGVydHkgZW1wdHlWaWV3Q2xhc3MKKyAgIEBwcm9wZXJ0eSBhcnJhbmdl
ZENvbnRlbnQKICAgKi8KLSAgZW1wdHlWaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCisgIGFycmFuZ2Vk
Q29udGVudDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKSwKIAogICAvKioKLSAgICBB
biBvcHRpb25hbCB2aWV3IHRvIGRpc3BsYXkgaWYgY29udGVudCBpcyBzZXQgdG8gYW4gZW1wdHkg
YXJyYXkuCisgICAgU2hvdWxkIGFjdHVhbGx5IHJldHJpZXZlIHRoZSBvYmplY3QgYXQgdGhlIHNw
ZWNpZmllZCBpbmRleCBmcm9tIHRoZQorICAgIGNvbnRlbnQuIFlvdSBjYW4gb3ZlcnJpZGUgdGhp
cyBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB0cmFuc2Zvcm0gdGhlCisgICAgY29udGVudCBpdGVt
IHRvIHNvbWV0aGluZyBuZXcuCiAKLSAgICBAcHJvcGVydHkgZW1wdHlWaWV3Ci0gICAgQHR5cGUg
RW1iZXIuVmlldwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgZW1wdHlWaWV3OiBudWxsLAor
ICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51
bGxgLgogCi0gIC8qKgotICAgIEBwcm9wZXJ0eSBpdGVtVmlld0NsYXNzCi0gICAgQHR5cGUgRW1i
ZXIuVmlldwotICAgIEBkZWZhdWx0IEVtYmVyLlZpZXcKKyAgICBAbWV0aG9kIG9iamVjdEF0Q29u
dGVudAorICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGluZGV4IHRvIHJldHJpZXZlLgorICAg
IEByZXR1cm4ge09iamVjdH0gdGhlIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kCiAg
ICovCi0gIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIHJldCA9IHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5fY29udGVudERpZENoYW5n
ZSgpOwotICAgIHJldHVybiByZXQ7CisgIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7
CisgICAgcmV0dXJuIGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jykub2JqZWN0QXQoaWR4KTsK
ICAgfSwKIAotICBfY29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0
aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gdGhpcy5nZXQoJ2NvbnRlbnQnKTsKLQotICAgIGlm
IChjb250ZW50KSB7IGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzKTsgfQotICAgIHZh
ciBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5h
cnJheVdpbGxDaGFuZ2UoY29udGVudCwgMCwgbGVuKTsKLSAgfSwgJ2NvbnRlbnQnKSwKLQogICAv
KioKLSAgICBAcHJpdmF0ZQorICAgIFNob3VsZCBhY3R1YWxseSByZXBsYWNlIHRoZSBzcGVjaWZp
ZWQgb2JqZWN0cyBvbiB0aGUgY29udGVudCBhcnJheS4KKyAgICBZb3UgY2FuIG92ZXJyaWRlIHRo
aXMgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gdHJhbnNmb3JtIHRoZSBjb250ZW50IGl0ZW0KKyAg
ICBpbnRvIHNvbWV0aGluZyBuZXcuCiAKLSAgICBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUg
Y29udGVudCBoYXMgY2hhbmdlZCwgYW5kIGlmIHNvLAotICAgIHVwZGF0ZSB0aGUgY2hpbGRyZW4g
ZGlyZWN0bHkuIFRoaXMgaXMgYWx3YXlzIHNjaGVkdWxlZAotICAgIGFzeW5jaHJvbm91c2x5LCB0
byBhbGxvdyB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkIGJlZm9yZQotICAgIGJpbmRpbmdzIGhh
dmUgc3luY2hyb25pemVkIGFuZCB2aWNlIHZlcnNhLgorICAgIFRoaXMgbWV0aG9kIHdpbGwgb25s
eSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgogCi0gICAgQG1ldGhvZCBfY29u
dGVudERpZENoYW5nZQorICAgIEBtZXRob2QgcmVwbGFjZUNvbnRlbnQKKyAgICBAcGFyYW0ge051
bWJlcn0gaWR4IFRoZSBzdGFydGluZyBpbmRleAorICAgIEBwYXJhbSB7TnVtYmVyfSBhbXQgVGhl
IG51bWJlciBvZiBpdGVtcyB0byByZW1vdmUgZnJvbSB0aGUgY29udGVudC4KKyAgICBAcGFyYW0g
e0FycmF5fSBvYmplY3RzIE9wdGlvbmFsIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0IG9yIG51
bGwgaWYgbm8KKyAgICAgIG9iamVjdHMuCisgICAgQHJldHVybiB7dm9pZH0KKyAgKi8KKyAgcmVw
bGFjZUNvbnRlbnQ6IGZ1bmN0aW9uKGlkeCwgYW10LCBvYmplY3RzKSB7CisgICAgZ2V0KHRoaXMs
ICdjb250ZW50JykucmVwbGFjZShpZHgsIGFtdCwgb2JqZWN0cyk7CisgIH0sCisKKyAgLyoqCisg
ICAgSW52b2tlZCB3aGVuIHRoZSBjb250ZW50IHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZS4g
Tm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCisgICAgZW50aXJlIGFycmF5IGNvbnRlbnQgd2ls
bCBjaGFuZ2UuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgX2NvbnRlbnRXaWxsQ2hhbmdl
CiAgICovCi0gIF9jb250ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsK
KyAgX2NvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY29udGVudCcsIGZ1
bmN0aW9uKCkgeworICAgIHRoaXMuX3RlYXJkb3duQ29udGVudCgpOworICB9KSwKKworICBfdGVh
cmRvd25Db250ZW50OiBmdW5jdGlvbigpIHsKICAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAn
Y29udGVudCcpOwogCiAgICAgaWYgKGNvbnRlbnQpIHsKLSAgICAgIEVtYmVyLmFzc2VydChmbXQo
ImFuIEVtYmVyLkNvbGxlY3Rpb25WaWV3J3MgY29udGVudCBtdXN0IGltcGxlbWVudCBFbWJlci5B
cnJheS4gWW91IHBhc3NlZCAlQCIsIFtjb250ZW50XSksIEVtYmVyLkFycmF5LmRldGVjdChjb250
ZW50KSk7Ci0gICAgICBjb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhpcyk7CisgICAgICBjb250
ZW50LnJlbW92ZUFycmF5T2JzZXJ2ZXIodGhpcywgeworICAgICAgICB3aWxsQ2hhbmdlOiAnY29u
dGVudEFycmF5V2lsbENoYW5nZScsCisgICAgICAgIGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURp
ZENoYW5nZScKKyAgICAgIH0pOwogICAgIH0KKyAgfSwKIAotICAgIHZhciBsZW4gPSBjb250ZW50
ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJheURpZENoYW5nZShj
b250ZW50LCAwLCBudWxsLCBsZW4pOwotICB9LCAnY29udGVudCcpLAorICBjb250ZW50QXJyYXlX
aWxsQ2hhbmdlOiBFbWJlci5LLAorICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IEVtYmVyLkssCiAK
LSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAvKioKKyAgICBJbnZva2VkIHdoZW4gdGhl
IGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCisg
ICAgZW50aXJlIGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQuCisKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgX2NvbnRlbnREaWRDaGFuZ2UKKyAgKi8KKyAgX2NvbnRlbnREaWRDaGFuZ2U6IEVt
YmVyLm9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7CiAgICAgdmFyIGNvbnRlbnQgPSBn
ZXQodGhpcywgJ2NvbnRlbnQnKTsKLSAgICBpZiAoY29udGVudCkgeyBjb250ZW50LnJlbW92ZUFy
cmF5T2JzZXJ2ZXIodGhpcyk7IH0KIAotICAgIHRoaXMuX3N1cGVyKCk7CisgICAgRW1iZXIuYXNz
ZXJ0KCJDYW4ndCBzZXQgQXJyYXlQcm94eSdzIGNvbnRlbnQgdG8gaXRzZWxmIiwgY29udGVudCAh
PT0gdGhpcyk7CiAKLSAgICBpZiAodGhpcy5fY3JlYXRlZEVtcHR5VmlldykgewotICAgICAgdGhp
cy5fY3JlYXRlZEVtcHR5Vmlldy5kZXN0cm95KCk7CisgICAgdGhpcy5fc2V0dXBDb250ZW50KCk7
CisgIH0pLAorCisgIF9zZXR1cENvbnRlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50
ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7CisKKyAgICBpZiAoY29udGVudCkgeworICAgICAgY29u
dGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKKyAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRl
bnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRD
aGFuZ2UnCisgICAgICB9KTsKICAgICB9CiAgIH0sCiAKLSAgYXJyYXlXaWxsQ2hhbmdlOiBmdW5j
dGlvbihjb250ZW50LCBzdGFydCwgcmVtb3ZlZENvdW50KSB7Ci0gICAgLy8gSWYgdGhlIGNvbnRl
bnRzIHdlcmUgZW1wdHkgYmVmb3JlIGFuZCB0aGlzIHRlbXBsYXRlIGNvbGxlY3Rpb24gaGFzIGFu
Ci0gICAgLy8gZW1wdHkgdmlldyByZW1vdmUgaXQgbm93LgotICAgIHZhciBlbXB0eVZpZXcgPSBn
ZXQodGhpcywgJ2VtcHR5VmlldycpOwotICAgIGlmIChlbXB0eVZpZXcgJiYgZW1wdHlWaWV3IGlu
c3RhbmNlb2YgRW1iZXIuVmlldykgewotICAgICAgZW1wdHlWaWV3LnJlbW92ZUZyb21QYXJlbnQo
KTsKLSAgICB9CisgIF9hcnJhbmdlZENvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNl
cnZlcignYXJyYW5nZWRDb250ZW50JywgZnVuY3Rpb24oKSB7CisgICAgdmFyIGFycmFuZ2VkQ29u
dGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JyksCisgICAgICAgIGxlbiA9IGFycmFu
Z2VkQ29udGVudCA/IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6IDA7CiAKLSAgICAv
LyBMb29wIHRocm91Z2ggY2hpbGQgdmlld3MgdGhhdCBjb3JyZXNwb25kIHdpdGggdGhlIHJlbW92
ZWQgaXRlbXMuCi0gICAgLy8gTm90ZSB0aGF0IHdlIGxvb3AgZnJvbSB0aGUgZW5kIG9mIHRoZSBh
cnJheSB0byB0aGUgYmVnaW5uaW5nIGJlY2F1c2UKLSAgICAvLyB3ZSBhcmUgbXV0YXRpbmcgaXQg
YXMgd2UgZ28uCi0gICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLCBjaGlsZFZp
ZXcsIGlkeCwgbGVuOworICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlKHRo
aXMsIDAsIGxlbiwgdW5kZWZpbmVkKTsKKyAgICB0aGlzLmFycmFuZ2VkQ29udGVudFdpbGxDaGFu
Z2UodGhpcyk7CiAKLSAgICBsZW4gPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKKyAgICB0aGlz
Ll90ZWFyZG93bkFycmFuZ2VkQ29udGVudChhcnJhbmdlZENvbnRlbnQpOworICB9KSwKIAotICAg
IHZhciByZW1vdmluZ0FsbCA9IHJlbW92ZWRDb3VudCA9PT0gbGVuOworICBfYXJyYW5nZWRDb250
ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignYXJyYW5nZWRDb250ZW50JywgZnVuY3Rpb24o
KSB7CisgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50
JyksCisgICAgICAgIGxlbiA9IGFycmFuZ2VkQ29udGVudCA/IGdldChhcnJhbmdlZENvbnRlbnQs
ICdsZW5ndGgnKSA6IDA7CiAKLSAgICBpZiAocmVtb3ZpbmdBbGwpIHsKLSAgICAgIHRoaXMuY3Vy
cmVudFN0YXRlLmVtcHR5KHRoaXMpOworICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IEFycmF5
UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIGFycmFuZ2VkQ29udGVudCAhPT0gdGhpcyk7CisK
KyAgICB0aGlzLl9zZXR1cEFycmFuZ2VkQ29udGVudCgpOworCisgICAgdGhpcy5hcnJhbmdlZENv
bnRlbnREaWRDaGFuZ2UodGhpcyk7CisgICAgdGhpcy5hcnJhbmdlZENvbnRlbnRBcnJheURpZENo
YW5nZSh0aGlzLCAwLCB1bmRlZmluZWQsIGxlbik7CisgIH0pLAorCisgIF9zZXR1cEFycmFuZ2Vk
Q29udGVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz
LCAnYXJyYW5nZWRDb250ZW50Jyk7CisKKyAgICBpZiAoYXJyYW5nZWRDb250ZW50KSB7CisgICAg
ICBhcnJhbmdlZENvbnRlbnQuYWRkQXJyYXlPYnNlcnZlcih0aGlzLCB7CisgICAgICAgIHdpbGxD
aGFuZ2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgICBkaWRDaGFu
Z2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheURpZENoYW5nZScKKyAgICAgIH0pOwogICAgIH0KKyAg
fSwKIAotICAgIGZvciAoaWR4ID0gc3RhcnQgKyByZW1vdmVkQ291bnQgLSAxOyBpZHggPj0gc3Rh
cnQ7IGlkeC0tKSB7Ci0gICAgICBjaGlsZFZpZXcgPSBjaGlsZFZpZXdzW2lkeF07Ci0gICAgICBp
ZiAocmVtb3ZpbmdBbGwpIHsgY2hpbGRWaWV3LnJlbW92ZWRGcm9tRE9NID0gdHJ1ZTsgfQotICAg
ICAgY2hpbGRWaWV3LmRlc3Ryb3koKTsKKyAgX3RlYXJkb3duQXJyYW5nZWRDb250ZW50OiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENv
bnRlbnQnKTsKKworICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKKyAgICAgIGFycmFuZ2VkQ29u
dGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKKyAgICAgICAgd2lsbENoYW5nZTogJ2Fy
cmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZScsCisgICAgICAgIGRpZENoYW5nZTogJ2FycmFu
Z2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAgfSk7CiAgICAgfQogICB9LAogCi0gIC8q
KgotICAgIENhbGxlZCB3aGVuIGEgbXV0YXRpb24gdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBh
cnJheSBvY2N1cnMuCisgIGFycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLkssCisgIGFy
cmFuZ2VkQ29udGVudERpZENoYW5nZTogRW1iZXIuSywKIAotICAgIFRoaXMgbWV0aG9kIHdpbGwg
cmVwbGF5IHRoYXQgbXV0YXRpb24gYWdhaW5zdCB0aGUgdmlld3MgdGhhdCBjb21wb3NlIHRoZQot
ICAgIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIGVuc3VyaW5nIHRoYXQgdGhlIHZpZXcgcmVmbGVj
dHMgdGhlIG1vZGVsLgorICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7CisgICAgcmV0dXJuIGdl
dCh0aGlzLCAnY29udGVudCcpICYmIHRoaXMub2JqZWN0QXRDb250ZW50KGlkeCk7CisgIH0sCiAK
LSAgICBUaGlzIGFycmF5IG9ic2VydmVyIGlzIGFkZGVkIGluIGBjb250ZW50RGlkQ2hhbmdlYC4K
KyAgbGVuZ3RoOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJyYW5nZWRD
b250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICByZXR1cm4gYXJyYW5n
ZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKKyAgICAvLyBO
byBkZXBlbmRlbmNpZXMgc2luY2UgRW51bWVyYWJsZSBub3RpZmllcyBsZW5ndGggb2YgY2hhbmdl
CisgIH0pLAogCi0gICAgQG1ldGhvZCBhcnJheURpZENoYW5nZQotICAgIEBwYXJhbSB7QXJyYXl9
IGFkZGVkT2JqZWN0cyB0aGUgb2JqZWN0cyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGNvbnRlbnQK
LSAgICBAcGFyYW0ge0FycmF5fSByZW1vdmVkT2JqZWN0cyB0aGUgb2JqZWN0cyB0aGF0IHdlcmUg
cmVtb3ZlZCBmcm9tIHRoZSBjb250ZW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZUluZGV4
IHRoZSBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlcyBvY2N1cnJlZAotICAqLwotICBhcnJheURp
ZENoYW5nZTogZnVuY3Rpb24oY29udGVudCwgc3RhcnQsIHJlbW92ZWQsIGFkZGVkKSB7Ci0gICAg
dmFyIGl0ZW1WaWV3Q2xhc3MgPSBnZXQodGhpcywgJ2l0ZW1WaWV3Q2xhc3MnKSwKLSAgICAgICAg
YWRkZWRWaWV3cyA9IFtdLCB2aWV3LCBpdGVtLCBpZHgsIGxlbiwgaXRlbVRhZ05hbWU7CisgIF9y
ZXBsYWNlOiBmdW5jdGlvbihpZHgsIGFtdCwgb2JqZWN0cykgeworICAgIHZhciBjb250ZW50ID0g
Z2V0KHRoaXMsICdjb250ZW50Jyk7CisgICAgRW1iZXIuYXNzZXJ0KCdUaGUgY29udGVudCBwcm9w
ZXJ0eSBvZiAnKyB0aGlzLmNvbnN0cnVjdG9yICsgJyBzaG91bGQgYmUgc2V0IGJlZm9yZSBtb2Rp
ZnlpbmcgaXQnLCBjb250ZW50KTsKKyAgICBpZiAoY29udGVudCkgdGhpcy5yZXBsYWNlQ29udGVu
dChpZHgsIGFtdCwgb2JqZWN0cyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLSAgICBpZiAo
J3N0cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0NsYXNzKSB7Ci0gICAgICBpdGVtVmlld0NsYXNz
ID0gZ2V0KGl0ZW1WaWV3Q2xhc3MpOworICByZXBsYWNlOiBmdW5jdGlvbigpIHsKKyAgICBpZiAo
Z2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSA9PT0gZ2V0KHRoaXMsICdjb250ZW50JykpIHsK
KyAgICAgIHRoaXMuX3JlcGxhY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9IGVsc2Ug
eworICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJVc2luZyByZXBsYWNlIG9uIGFuIGFycmFu
Z2VkIEFycmF5UHJveHkgaXMgbm90IGFsbG93ZWQuIik7CiAgICAgfQorICB9LAogCi0gICAgRW1i
ZXIuYXNzZXJ0KGZtdCgiaXRlbVZpZXdDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRW1iZXIu
Vmlldywgbm90ICVAIiwgW2l0ZW1WaWV3Q2xhc3NdKSwgRW1iZXIuVmlldy5kZXRlY3QoaXRlbVZp
ZXdDbGFzcykpOworICBfaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7CisgICAgaWYg
KGlkeCA+IGdldCh0aGlzLCAnY29udGVudC5sZW5ndGgnKSkgdGhyb3cgbmV3IEVtYmVyLkVycm9y
KE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOworICAgIHRoaXMuX3JlcGxhY2UoaWR4LCAwLCBbb2Jq
ZWN0XSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCiAKLSAgICBsZW4gPSBjb250ZW50ID8gZ2V0
KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgaWYgKGxlbikgewotICAgICAgZm9yIChpZHgg
PSBzdGFydDsgaWR4IDwgc3RhcnQrYWRkZWQ7IGlkeCsrKSB7Ci0gICAgICAgIGl0ZW0gPSBjb250
ZW50Lm9iamVjdEF0KGlkeCk7CisgIGluc2VydEF0OiBmdW5jdGlvbihpZHgsIG9iamVjdCkgewor
ICAgIGlmIChnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpID09PSBnZXQodGhpcywgJ2NvbnRl
bnQnKSkgeworICAgICAgcmV0dXJuIHRoaXMuX2luc2VydEF0KGlkeCwgb2JqZWN0KTsKKyAgICB9
IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJVc2luZyBpbnNlcnRBdCBvbiBh
biBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLiIpOworICAgIH0KKyAgfSwKIAot
ICAgICAgICB2aWV3ID0gdGhpcy5jcmVhdGVDaGlsZFZpZXcoaXRlbVZpZXdDbGFzcywgewotICAg
ICAgICAgIGNvbnRlbnQ6IGl0ZW0sCi0gICAgICAgICAgY29udGVudEluZGV4OiBpZHgKLSAgICAg
ICAgfSk7CisgIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFydCwgbGVuKSB7CisgICAgaWYgKCdudW1i
ZXInID09PSB0eXBlb2Ygc3RhcnQpIHsKKyAgICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdj
b250ZW50JyksCisgICAgICAgICAgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdl
ZENvbnRlbnQnKSwKKyAgICAgICAgICBpbmRpY2VzID0gW10sIGk7CiAKLSAgICAgICAgYWRkZWRW
aWV3cy5wdXNoKHZpZXcpOworICAgICAgaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+PSBnZXQo
dGhpcywgJ2xlbmd0aCcpKSkgeworICAgICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoT1VUX09G
X1JBTkdFX0VYQ0VQVElPTik7CiAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhciBlbXB0
eVZpZXcgPSBnZXQodGhpcywgJ2VtcHR5VmlldycpOwotICAgICAgaWYgKCFlbXB0eVZpZXcpIHsg
cmV0dXJuOyB9CiAKLSAgICAgIHZhciBpc0NsYXNzID0gRW1iZXIuQ29yZVZpZXcuZGV0ZWN0KGVt
cHR5Vmlldyk7CisgICAgICBpZiAobGVuID09PSB1bmRlZmluZWQpIGxlbiA9IDE7CiAKLSAgICAg
IGVtcHR5VmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGVtcHR5Vmlldyk7Ci0gICAgICBhZGRl
ZFZpZXdzLnB1c2goZW1wdHlWaWV3KTsKLSAgICAgIHNldCh0aGlzLCAnZW1wdHlWaWV3JywgZW1w
dHlWaWV3KTsKKyAgICAgIC8vIEdldCBhIGxpc3Qgb2YgaW5kaWNlcyBpbiBvcmlnaW5hbCBjb250
ZW50IHRvIHJlbW92ZQorICAgICAgZm9yIChpPXN0YXJ0OyBpPHN0YXJ0K2xlbjsgaSsrKSB7Cisg
ICAgICAgIC8vIFVzZSBhcnJhbmdlZENvbnRlbnQgaGVyZSBzbyB3ZSBhdm9pZCBjb25mdXNpb24g
d2l0aCBvYmplY3RzIHRyYW5zZm9ybWVkIGJ5IG9iamVjdEF0Q29udGVudAorICAgICAgICBpbmRp
Y2VzLnB1c2goY29udGVudC5pbmRleE9mKGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChpKSkpOwor
ICAgICAgfQorCisgICAgICAvLyBSZXBsYWNlIGluIHJldmVyc2Ugb3JkZXIgc2luY2UgaW5kaWNl
cyB3aWxsIGNoYW5nZQorICAgICAgaW5kaWNlcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4g
YiAtIGE7IH0pOwogCi0gICAgICBpZiAoaXNDbGFzcykgeyB0aGlzLl9jcmVhdGVkRW1wdHlWaWV3
ID0gZW1wdHlWaWV3OyB9CisgICAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOworICAg
ICAgZm9yIChpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlzLl9yZXBs
YWNlKGluZGljZXNbaV0sIDEsIEVNUFRZKTsKKyAgICAgIH0KKyAgICAgIEVtYmVyLmVuZFByb3Bl
cnR5Q2hhbmdlcygpOwogICAgIH0KLSAgICB0aGlzLnJlcGxhY2Uoc3RhcnQsIDAsIGFkZGVkVmll
d3MpOworCisgICAgcmV0dXJuIHRoaXMgOwogICB9LAogCi0gIGNyZWF0ZUNoaWxkVmlldzogZnVu
Y3Rpb24odmlldywgYXR0cnMpIHsKLSAgICB2aWV3ID0gdGhpcy5fc3VwZXIodmlldywgYXR0cnMp
OworICBwdXNoT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKKyAgICB0aGlzLl9pbnNlcnRBdChnZXQo
dGhpcywgJ2NvbnRlbnQubGVuZ3RoJyksIG9iaikgOworICAgIHJldHVybiBvYmogOworICB9LAog
Ci0gICAgdmFyIGl0ZW1UYWdOYW1lID0gZ2V0KHZpZXcsICd0YWdOYW1lJyk7Ci0gICAgdmFyIHRh
Z05hbWUgPSAoaXRlbVRhZ05hbWUgPT09IG51bGwgfHwgaXRlbVRhZ05hbWUgPT09IHVuZGVmaW5l
ZCkgPyBFbWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQW2dldCh0aGlzLCAndGFnTmFt
ZScpXSA6IGl0ZW1UYWdOYW1lOworICBwdXNoT2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykgewor
ICAgIGlmICghKEVtYmVyLkVudW1lcmFibGUuZGV0ZWN0KG9iamVjdHMpIHx8IEVtYmVyLmlzQXJy
YXkob2JqZWN0cykpKSB7CisgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJNdXN0IHBhc3MgRW1i
ZXIuRW51bWVyYWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkjcHVzaE9iamVjdHMiKTsKKyAgICB9
CisgICAgdGhpcy5fcmVwbGFjZShnZXQodGhpcywgJ2xlbmd0aCcpLCAwLCBvYmplY3RzKTsKKyAg
ICByZXR1cm4gdGhpczsKKyAgfSwKIAotICAgIHNldCh2aWV3LCAndGFnTmFtZScsIHRhZ05hbWUp
OworICBzZXRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CisgICAgaWYgKG9iamVjdHMubGVu
Z3RoID09PSAwKSByZXR1cm4gdGhpcy5jbGVhcigpOwogCi0gICAgcmV0dXJuIHZpZXc7Ci0gIH0K
LX0pOworICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOworICAgIHRoaXMuX3JlcGxh
Y2UoMCwgbGVuLCBvYmplY3RzKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKIAotLyoqCi0gIEEg
bWFwIG9mIHBhcmVudCB0YWdzIHRvIHRoZWlyIGRlZmF1bHQgY2hpbGQgdGFncy4gWW91IGNhbiBh
ZGQKLSAgYWRkaXRpb25hbCBwYXJlbnQgdGFncyBpZiB5b3Ugd2FudCBjb2xsZWN0aW9uIHZpZXdz
IHRoYXQgdXNlCi0gIGEgcGFydGljdWxhciBwYXJlbnQgdGFnIHRvIGRlZmF1bHQgdG8gYSBjaGls
ZCB0YWcuCisgIHVuc2hpZnRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgeworICAgIHRoaXMuX2luc2Vy
dEF0KDAsIG9iaikgOworICAgIHJldHVybiBvYmogOworICB9LAogCi0gIEBwcm9wZXJ0eSBDT05U
QUlORVJfTUFQCi0gIEB0eXBlIEhhc2gKLSAgQHN0YXRpYwotICBAZmluYWwKLSovCi1FbWJlci5D
b2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQID0gewotICB1bDogJ2xpJywKLSAgb2w6ICdsaScs
Ci0gIHRhYmxlOiAndHInLAotICB0aGVhZDogJ3RyJywKLSAgdGJvZHk6ICd0cicsCi0gIHRmb290
OiAndHInLAotICB0cjogJ3RkJywKLSAgc2VsZWN0OiAnb3B0aW9uJwotfTsKKyAgdW5zaGlmdE9i
amVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKKyAgICB0aGlzLl9yZXBsYWNlKDAsIDAsIG9iamVj
dHMpOworICAgIHJldHVybiB0aGlzOworICB9LAogCi19KSgpOworICBzbGljZTogZnVuY3Rpb24o
KSB7CisgICAgdmFyIGFyciA9IHRoaXMudG9BcnJheSgpOworICAgIHJldHVybiBhcnIuc2xpY2Uu
YXBwbHkoYXJyLCBhcmd1bWVudHMpOworICB9LAorCisgIGFycmFuZ2VkQ29udGVudEFycmF5V2ls
bENoYW5nZTogZnVuY3Rpb24oaXRlbSwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkgeworICAg
IHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KTsK
KyAgfSwKIAorICBhcnJhbmdlZENvbnRlbnRBcnJheURpZENoYW5nZTogZnVuY3Rpb24oaXRlbSwg
aWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkgeworICAgIHRoaXMuYXJyYXlDb250ZW50RGlkQ2hh
bmdlKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpOworICB9LAogCisgIGluaXQ6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fc2V0dXBDb250ZW50KCk7CisgICAg
dGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKKyAgfSwKIAotKGZ1bmN0aW9uKCkgeworICB3
aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fdGVhcmRvd25BcnJhbmdlZENvbnRl
bnQoKTsKKyAgICB0aGlzLl90ZWFyZG93bkNvbnRlbnQoKTsKKyAgfQorfSk7CiAKIH0pKCk7CiAK
IAogCiAoZnVuY3Rpb24oKSB7Ci0vKmdsb2JhbHMgalF1ZXJ5Ki8KIC8qKgotRW1iZXIgVmlld3MK
LQogQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotQHJlcXVpcmVzIGVtYmVy
LXJ1bnRpbWUKLUBtYWluIGVtYmVyLXZpZXdzCitAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKICov
CiAKLX0pKCk7CiAKLShmdW5jdGlvbigpIHsKLWRlZmluZSgibWV0YW1vcnBoIiwKLSAgW10sCi0g
IGZ1bmN0aW9uKCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvLyA9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotICAgIC8vIFByb2plY3Q6ICAgbWV0YW1vcnBoCi0gICAgLy8gQ29weXJpZ2h0OiDCqTIwMTEg
TXkgQ29tcGFueSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgLy8gPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KK3ZhciBzZXQgPSBFbWJlci5zZXQsIGdldCA9IEVtYmVyLmdldCwgZ3VpZEZvciA9IEVt
YmVyLmd1aWRGb3I7Cit2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNo
LAorICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwogCi0gICAgdmFy
IEsgPSBmdW5jdGlvbigpe30sCi0gICAgICAgIGd1aWQgPSAwLAotICAgICAgICBkb2N1bWVudCA9
IHdpbmRvdy5kb2N1bWVudCwKK3ZhciBFYWNoQXJyYXkgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVt
YmVyLkFycmF5LCB7CiAKLSAgICAgICAgLy8gRmVhdHVyZS1kZXRlY3QgdGhlIFczQyByYW5nZSBB
UEksIHRoZSBleHRlbmRlZCBjaGVjayBpcyBmb3IgSUU5IHdoaWNoIG9ubHkgcGFydGlhbGx5IHN1
cHBvcnRzIHJhbmdlcwotICAgICAgICBzdXBwb3J0c1JhbmdlID0gKCdjcmVhdGVSYW5nZScgaW4g
ZG9jdW1lbnQpICYmICh0eXBlb2YgUmFuZ2UgIT09ICd1bmRlZmluZWQnKSAmJiBSYW5nZS5wcm90
b3R5cGUuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50LAorICBpbml0OiBmdW5jdGlvbihjb250ZW50
LCBrZXlOYW1lLCBvd25lcikgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fa2V5TmFt
ZSA9IGtleU5hbWU7CisgICAgdGhpcy5fb3duZXIgICA9IG93bmVyOworICAgIHRoaXMuX2NvbnRl
bnQgPSBjb250ZW50OworICB9LAogCi0gICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIHByaW9y
IHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1l
bnQKLSAgICAgICAgLy8gaXMgYSAiemVyby1zY29wZSIgZWxlbWVudC4gVGhpcyBwcm9ibGVtIGNh
biBiZSB3b3JrZWQgYXJvdW5kIGJ5IG1ha2luZwotICAgICAgICAvLyB0aGUgZmlyc3Qgbm9kZSBh
biBpbnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBNb2Rlcm5penIsIHVzZSAmc2h5OwotICAg
ICAgICBuZWVkc1NoeSA9IChmdW5jdGlvbigpewotICAgICAgICAgIHZhciB0ZXN0RWwgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgICAgICAgICB0ZXN0RWwuaW5uZXJIVE1MID0g
IjxkaXY+PC9kaXY+IjsKLSAgICAgICAgICB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPSAi
PHNjcmlwdD48L3NjcmlwdD4iOwotICAgICAgICAgIHJldHVybiB0ZXN0RWwuZmlyc3RDaGlsZC5p
bm5lckhUTUwgPT09ICcnOwotICAgICAgICB9KSgpLAorICBvYmplY3RBdDogZnVuY3Rpb24oaWR4
KSB7CisgICAgdmFyIGl0ZW0gPSB0aGlzLl9jb250ZW50Lm9iamVjdEF0KGlkeCk7CisgICAgcmV0
dXJuIGl0ZW0gJiYgZ2V0KGl0ZW0sIHRoaXMuX2tleU5hbWUpOworICB9LAogCisgIGxlbmd0aDog
RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9jb250
ZW50OworICAgIHJldHVybiBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Cisg
IH0pCiAKLSAgICAgICAgLy8gSUUgOCAoYW5kIGxpa2VseSBlYXJsaWVyKSBsaWtlcyB0byBtb3Zl
IHdoaXRlc3BhY2UgcHJlY2VlZGluZwotICAgICAgICAvLyBhIHNjcmlwdCB0YWcgdG8gYXBwZWFy
IGFmdGVyIGl0LiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuCi0gICAgICAgIC8vIGFjY2lkZW50YWxs
eSByZW1vdmUgd2hpdGVzcGFjZSB3aGVuIHVwZGF0aW5nIGEgbW9ycGguCi0gICAgICAgIG1vdmVz
V2hpdGVzcGFjZSA9IChmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgdGVzdEVsID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gICAgICAgICAgdGVzdEVsLmlubmVySFRNTCA9ICJU
ZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+PC9zY3JpcHQ+VmFsdWUiOwot
ICAgICAgICAgIHJldHVybiB0ZXN0RWwuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgPT09ICdUZXN0
OicgJiYKLSAgICAgICAgICAgICAgICAgIHRlc3RFbC5jaGlsZE5vZGVzWzJdLm5vZGVWYWx1ZSA9
PT0gJyBWYWx1ZSc7Ci0gICAgICAgIH0pKCk7Cit9KTsKIAotICAgIC8vIENvbnN0cnVjdG9yIHRo
YXQgc3VwcG9ydHMgZWl0aGVyIE1ldGFtb3JwaCgnZm9vJykgb3IgbmV3Ci0gICAgLy8gTWV0YW1v
cnBoKCdmb28nKTsKLSAgICAvLwotICAgIC8vIFRha2VzIGEgc3RyaW5nIG9mIEhUTUwgYXMgdGhl
IGFyZ3VtZW50LgordmFyIElTX09CU0VSVkVSID0gL14uKzooYmVmb3JlfGNoYW5nZSkkLzsKIAot
ICAgIHZhciBNZXRhbW9ycGggPSBmdW5jdGlvbihodG1sKSB7Ci0gICAgICB2YXIgc2VsZjsKK2Z1
bmN0aW9uIGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwg
aWR4LCBsb2MpIHsKKyAgdmFyIG9iamVjdHMgPSBwcm94eS5fb2JqZWN0cywgZ3VpZDsKKyAgaWYg
KCFvYmplY3RzKSBvYmplY3RzID0gcHJveHkuX29iamVjdHMgPSB7fTsKIAotICAgICAgaWYgKHRo
aXMgaW5zdGFuY2VvZiBNZXRhbW9ycGgpIHsKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICBzZWxmID0gbmV3IEsoKTsKLSAgICAgIH0KKyAgd2hpbGUoLS1sb2M+
PWlkeCkgeworICAgIHZhciBpdGVtID0gY29udGVudC5vYmplY3RBdChsb2MpOworICAgIGlmIChp
dGVtKSB7CisgICAgICBFbWJlci5hc3NlcnQoJ1doZW4gdXNpbmcgQGVhY2ggdG8gb2JzZXJ2ZSB0
aGUgYXJyYXkgJyArIGNvbnRlbnQgKyAnLCB0aGUgYXJyYXkgbXVzdCByZXR1cm4gYW4gb2JqZWN0
JywgRW1iZXIudHlwZU9mKGl0ZW0pID09PSAnaW5zdGFuY2UnIHx8IEVtYmVyLnR5cGVPZihpdGVt
KSA9PT0gJ29iamVjdCcpOworICAgICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5
TmFtZSwgcHJveHksICdjb250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgRW1iZXIuYWRkT2Jz
ZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5RGlkQ2hhbmdlJyk7CiAKLSAg
ICAgIHNlbGYuaW5uZXJIVE1MID0gaHRtbDsKLSAgICAgIHZhciBteUd1aWQgPSAnbWV0YW1vcnBo
LScrKGd1aWQrKyk7Ci0gICAgICBzZWxmLnN0YXJ0ID0gbXlHdWlkICsgJy1zdGFydCc7Ci0gICAg
ICBzZWxmLmVuZCA9IG15R3VpZCArICctZW5kJzsKKyAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhl
IGluZGV4IGVhY2ggaXRlbSB3YXMgZm91bmQgYXQgc28gd2UgY2FuIG1hcAorICAgICAgLy8gaXQg
YmFjayB3aGVuIHRoZSBvYmogY2hhbmdlcy4KKyAgICAgIGd1aWQgPSBndWlkRm9yKGl0ZW0pOwor
ICAgICAgaWYgKCFvYmplY3RzW2d1aWRdKSBvYmplY3RzW2d1aWRdID0gW107CisgICAgICBvYmpl
Y3RzW2d1aWRdLnB1c2gobG9jKTsKKyAgICB9CisgIH0KK30KIAotICAgICAgcmV0dXJuIHNlbGY7
Ci0gICAgfTsKK2Z1bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBr
ZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKKyAgdmFyIG9iamVjdHMgPSBwcm94eS5fb2JqZWN0
czsKKyAgaWYgKCFvYmplY3RzKSBvYmplY3RzID0gcHJveHkuX29iamVjdHMgPSB7fTsKKyAgdmFy
IGluZGljaWVzLCBndWlkOwogCi0gICAgSy5wcm90b3R5cGUgPSBNZXRhbW9ycGgucHJvdG90eXBl
OworICB3aGlsZSgtLWxvYz49aWR4KSB7CisgICAgdmFyIGl0ZW0gPSBjb250ZW50Lm9iamVjdEF0
KGxvYyk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgIEVtYmVyLnJlbW92ZUJlZm9yZU9ic2VydmVy
KGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleVdpbGxDaGFuZ2UnKTsKKyAgICAgIEVt
YmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENo
YW5nZScpOwogCi0gICAgdmFyIHJhbmdlRm9yLCBodG1sRnVuYywgcmVtb3ZlRnVuYywgb3V0ZXJI
VE1MRnVuYywgYXBwZW5kVG9GdW5jLCBhZnRlckZ1bmMsIHByZXBlbmRGdW5jLCBzdGFydFRhZ0Z1
bmMsIGVuZFRhZ0Z1bmM7CisgICAgICBndWlkID0gZ3VpZEZvcihpdGVtKTsKKyAgICAgIGluZGlj
aWVzID0gb2JqZWN0c1tndWlkXTsKKyAgICAgIGluZGljaWVzW2luZGV4T2YuY2FsbChpbmRpY2ll
cywgbG9jKV0gPSBudWxsOworICAgIH0KKyAgfQorfQogCi0gICAgb3V0ZXJIVE1MRnVuYyA9IGZ1
bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUYWcoKSArIHRoaXMuaW5uZXJIVE1M
ICsgdGhpcy5lbmRUYWcoKTsKLSAgICB9OworLyoqCisgIFRoaXMgaXMgdGhlIG9iamVjdCBpbnN0
YW5jZSByZXR1cm5lZCB3aGVuIHlvdSBnZXQgdGhlIGBAZWFjaGAgcHJvcGVydHkgb24gYW4KKyAg
YXJyYXkuIEl0IHVzZXMgdGhlIHVua25vd25Qcm9wZXJ0eSBoYW5kbGVyIHRvIGF1dG9tYXRpY2Fs
bHkgY3JlYXRlCisgIEVhY2hBcnJheSBpbnN0YW5jZXMgZm9yIHByb3BlcnR5IG5hbWVzLgogCi0g
ICAgc3RhcnRUYWdGdW5jID0gZnVuY3Rpb24oKSB7Ci0gICAgICAvKgotICAgICAgICogV2UgcmVw
bGFjZSBjaGV2cm9uIGJ5IGl0cyBoZXggY29kZSBpbiBvcmRlciB0byBwcmV2ZW50IGVzY2FwaW5n
IHByb2JsZW1zLgotICAgICAgICogQ2hlY2sgdGhpcyB0aHJlYWQgZm9yIG1vcmUgZXhwbGFpbmF0
aW9uOgotICAgICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MjMxMDQ4
L3doeS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1nZW5lcmF0aW5nLWh0bWwtZnJvbS1qYXZhc2Ny
aXB0Ci0gICAgICAgKi8KLSAgICAgIHJldHVybiAiPHNjcmlwdCBpZD0nIiArIHRoaXMuc3RhcnQg
KyAiJyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKKyAg
QHByaXZhdGUKKyAgQGNsYXNzIEVhY2hQcm94eQorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRl
bmRzIEVtYmVyLk9iamVjdAorKi8KK0VtYmVyLkVhY2hQcm94eSA9IEVtYmVyLk9iamVjdC5leHRl
bmQoewogCi0gICAgZW5kVGFnRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgLyoKLSAgICAgICAq
IFdlIHJlcGxhY2UgY2hldnJvbiBieSBpdHMgaGV4IGNvZGUgaW4gb3JkZXIgdG8gcHJldmVudCBl
c2NhcGluZyBwcm9ibGVtcy4KLSAgICAgICAqIENoZWNrIHRoaXMgdGhyZWFkIGZvciBtb3JlIGV4
cGxhaW5hdGlvbjoKLSAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMv
ODIzMTA0OC93aHktdXNlLXgzYy1pbnN0ZWFkLW9mLXdoZW4tZ2VuZXJhdGluZy1odG1sLWZyb20t
amF2YXNjcmlwdAotICAgICAgICovCi0gICAgICByZXR1cm4gIjxzY3JpcHQgaWQ9JyIgKyB0aGlz
LmVuZCArICInIHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+XHgzQy9zY3JpcHQ+IjsKLSAgICB9
OworICBpbml0OiBmdW5jdGlvbihjb250ZW50KSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAgICB0
aGlzLl9jb250ZW50ID0gY29udGVudDsKKyAgICBjb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhp
cyk7CiAKLSAgICAvLyBJZiB3ZSBoYXZlIHRoZSBXM0MgcmFuZ2UgQVBJLCB0aGlzIHByb2Nlc3Mg
aXMgcmVsYXRpdmVseSBzdHJhaWdodCBmb3J3YXJkLgotICAgIGlmIChzdXBwb3J0c1JhbmdlKSB7
CisgICAgLy8gaW4gY2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2JzZXJ2aW5nIHNvbWUga2V5cyBt
YWtlIHN1cmUgdGhleSBhcmUKKyAgICAvLyBhZGRlZAorICAgIGZvckVhY2goRW1iZXIud2F0Y2hl
ZEV2ZW50cyh0aGlzKSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgICB0aGlzLmRpZEFkZExp
c3RlbmVyKGV2ZW50TmFtZSk7CisgICAgfSwgdGhpcyk7CisgIH0sCiAKLSAgICAgIC8vIEdldCBh
IHJhbmdlIGZvciB0aGUgY3VycmVudCBtb3JwaC4gT3B0aW9uYWxseSBpbmNsdWRlIHRoZSBzdGFy
dGluZyBhbmQKLSAgICAgIC8vIGVuZGluZyBwbGFjZWhvbGRlcnMuCi0gICAgICByYW5nZUZvciA9
IGZ1bmN0aW9uKG1vcnBoLCBvdXRlclRvbykgewotICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVu
dC5jcmVhdGVSYW5nZSgpOwotICAgICAgICB2YXIgYmVmb3JlID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQobW9ycGguc3RhcnQpOwotICAgICAgICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZChtb3JwaC5lbmQpOworICAvKioKKyAgICBZb3UgY2FuIGRpcmVjdGx5IGFjY2VzcyBt
YXBwZWQgcHJvcGVydGllcyBieSBzaW1wbHkgcmVxdWVzdGluZyB0aGVtLgorICAgIFRoZSBgdW5r
bm93blByb3BlcnR5YCBoYW5kbGVyIHdpbGwgZ2VuZXJhdGUgYW4gRWFjaEFycmF5IG9mIGVhY2gg
aXRlbS4KIAotICAgICAgICBpZiAob3V0ZXJUb28pIHsKLSAgICAgICAgICByYW5nZS5zZXRTdGFy
dEJlZm9yZShiZWZvcmUpOwotICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGFmdGVyKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGJlZm9yZSk7Ci0g
ICAgICAgICAgcmFuZ2Uuc2V0RW5kQmVmb3JlKGFmdGVyKTsKLSAgICAgICAgfQorICAgIEBtZXRo
b2QgdW5rbm93blByb3BlcnR5CisgICAgQHBhcmFtIGtleU5hbWUge1N0cmluZ30KKyAgICBAcGFy
YW0gdmFsdWUgeyp9CisgICovCisgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSwg
dmFsdWUpIHsKKyAgICB2YXIgcmV0OworICAgIHJldCA9IG5ldyBFYWNoQXJyYXkodGhpcy5fY29u
dGVudCwga2V5TmFtZSwgdGhpcyk7CisgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkodGhpcywga2V5
TmFtZSwgbnVsbCwgcmV0KTsKKyAgICB0aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShrZXlO
YW1lKTsKKyAgICByZXR1cm4gcmV0OworICB9LAogCi0gICAgICAgIHJldHVybiByYW5nZTsKLSAg
ICAgIH07CisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KKyAgLy8gQVJSQVkgQ0hBTkdFUworICAvLyBJbnZva2VzIHdoZW5ldmVy
IHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiBjaGFuZ2VzLgogCi0gICAgICBodG1sRnVuYyA9IGZ1
bmN0aW9uKGh0bWwsIG91dGVyVG9vKSB7Ci0gICAgICAgIC8vIGdldCBhIHJhbmdlIGZvciB0aGUg
Y3VycmVudCBtZXRhbW9ycGggb2JqZWN0Ci0gICAgICAgIHZhciByYW5nZSA9IHJhbmdlRm9yKHRo
aXMsIG91dGVyVG9vKTsKKyAgYXJyYXlXaWxsQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgs
IHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7CisgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzLCBrZXks
IGxpbTsKIAotICAgICAgICAvLyBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSwgd2hp
Y2ggd2lsbCBiZSB0aGUKLSAgICAgICAgLy8gbm9kZXMgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5k
IGVuZGluZyBwbGFjZWhvbGRlci4KLSAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKKyAg
ICBsaW0gPSByZW1vdmVkQ250PjAgPyBpZHgrcmVtb3ZlZENudCA6IC0xOworICAgIEVtYmVyLmJl
Z2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwogCi0gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBkb2N1
bWVudCBmcmFnbWVudCBmb3IgdGhlIEhUTUwKLSAgICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2Uu
Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOworICAgIGZvcihrZXkgaW4ga2V5cykgewor
ICAgICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KIAotICAg
ICAgICAvLyBpbnNlcnQgdGhlIGZyYWdtZW50IGludG8gdGhlIHJhbmdlCi0gICAgICAgIHJhbmdl
Lmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAgICAgfTsKKyAgICAgIGlmIChsaW0+MCkgeyByZW1v
dmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5LCB0aGlzLCBpZHgsIGxpbSk7IH0K
IAotICAgICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgICAvLyBnZXQgYSByYW5n
ZSBmb3IgdGhlIGN1cnJlbnQgbWV0YW1vcnBoIG9iamVjdCBpbmNsdWRpbmcKLSAgICAgICAgLy8g
dGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcGxhY2Vob2xkZXJzLgotICAgICAgICB2YXIgcmFuZ2Ug
PSByYW5nZUZvcih0aGlzLCB0cnVlKTsKKyAgICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCBrZXkpOworICAgIH0KIAotICAgICAgICAvLyBkZWxldGUgdGhlIGVudGlyZSByYW5nZS4K
LSAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLSAgICAgIH07CisgICAgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMuX2NvbnRlbnQsICdAZWFjaCcpOworICAgIEVtYmVyLmVuZFBy
b3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgfSwKIAotICAgICAgYXBwZW5kVG9GdW5jID0gZnVuY3Rp
b24obm9kZSkgewotICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwot
ICAgICAgICByYW5nZS5zZXRTdGFydChub2RlKTsKLSAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFs
c2UpOwotICAgICAgICB2YXIgZnJhZyA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0
aGlzLm91dGVySFRNTCgpKTsKLSAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChmcmFnKTsKLSAgICAg
IH07CisgIGFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgsIHJlbW92ZWRDbnQs
IGFkZGVkQ250KSB7CisgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzLCBsaW07CiAKLSAgICAgIGFm
dGVyRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKLSAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQu
Y3JlYXRlUmFuZ2UoKTsKLSAgICAgICAgdmFyIGFmdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQodGhpcy5lbmQpOworICAgIGxpbSA9IGFkZGVkQ250PjAgPyBpZHgrYWRkZWRDbnQgOiAtMTsK
KyAgICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgeworICAgICAgZm9yKHZhciBr
ZXkgaW4ga2V5cykgeworICAgICAgICBpZiAoIWtleXMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBj
b250aW51ZTsgfQogCi0gICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoYWZ0ZXIpOwotICAgICAg
ICByYW5nZS5zZXRFbmRBZnRlcihhZnRlcik7CisgICAgICAgIGlmIChsaW0+MCkgeyBhZGRPYnNl
cnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5LCB0aGlzLCBpZHgsIGxpbSk7IH0KIAotICAg
ICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7
Ci0gICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAgICAgfTsKKyAgICAgICAg
RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywga2V5KTsKKyAgICAgIH0KIAotICAgICAgcHJl
cGVuZEZ1bmMgPSBmdW5jdGlvbihodG1sKSB7Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50
LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHZhciBzdGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKHRoaXMuc3RhcnQpOworICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcy5fY29u
dGVudCwgJ0BlYWNoJyk7CisgICAgfSwgdGhpcyk7CisgIH0sCiAKLSAgICAgICAgcmFuZ2Uuc2V0
U3RhcnRBZnRlcihzdGFydCk7Ci0gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHN0YXJ0KTsKKyAg
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgorICAvLyBMSVNURU4gRk9SIE5FVyBPQlNFUlZFUlMgQU5EIE9USEVSIEVWRU5UIExJU1RF
TkVSUworICAvLyBTdGFydCBtb25pdG9yaW5nIGtleXMgYmFzZWQgb24gd2hvIGlzIGxpc3Rlbmlu
Zy4uLgogCi0gICAgICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFn
bWVudChodG1sKTsKLSAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7Ci0gICAgICB9
OworICBkaWRBZGRMaXN0ZW5lcjogZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgaWYgKElTX09C
U0VSVkVSLnRlc3QoZXZlbnROYW1lKSkgeworICAgICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRl
bnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03KSk7CisgICAgfQorICB9LAogCi0gICAgfSBlbHNl
IHsKLSAgICAgIC8qKgotICAgICAgICogVGhpcyBjb2RlIGlzIG1vc3RseSB0YWtlbiBmcm9tIGpR
dWVyeSwgd2l0aCBvbmUgZXhjZXB0aW9uLiBJbiBqUXVlcnkncyBjYXNlLCB3ZQotICAgICAgICog
aGF2ZSBzb21lIEhUTUwgYW5kIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gY29udmVydCBp
dCBpbnRvIHNvbWUgbm9kZXMuCi0gICAgICAgKgotICAgICAgICogSW4gdGhpcyBjYXNlLCBqUXVl
cnkgbmVlZHMgdG8gc2NhbiB0aGUgSFRNTCBsb29raW5nIGZvciBhbiBvcGVuaW5nIHRhZyBhbmQg
dXNlCi0gICAgICAgKiB0aGF0IGFzIHRoZSBrZXkgZm9yIHRoZSB3cmFwIG1hcC4gSW4gb3VyIGNh
c2UsIHdlIGtub3cgdGhlIHBhcmVudCBub2RlLCBhbmQKLSAgICAgICAqIGNhbiB1c2UgaXRzIHR5
cGUgYXMgdGhlIGtleSBmb3IgdGhlIHdyYXAgbWFwLgotICAgICAgICoqLwotICAgICAgdmFyIHdy
YXBNYXAgPSB7Ci0gICAgICAgIHNlbGVjdDogWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlw
bGUnPiIsICI8L3NlbGVjdD4iIF0sCi0gICAgICAgIGZpZWxkc2V0OiBbIDEsICI8ZmllbGRzZXQ+
IiwgIjwvZmllbGRzZXQ+IiBdLAotICAgICAgICB0YWJsZTogWyAxLCAiPHRhYmxlPiIsICI8L3Rh
YmxlPiIgXSwKLSAgICAgICAgdGJvZHk6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+
PC90YWJsZT4iIF0sCi0gICAgICAgIHRyOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90
cj48L3Rib2R5PjwvdGFibGU+IiBdLAotICAgICAgICBjb2xncm91cDogWyAyLCAiPHRhYmxlPjx0
Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSwKLSAgICAg
ICAgbWFwOiBbIDEsICI8bWFwPiIsICI8L21hcD4iIF0sCi0gICAgICAgIF9kZWZhdWx0OiBbIDAs
ICIiLCAiIiBdCi0gICAgICB9OworICBkaWRSZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24oZXZlbnRO
YW1lKSB7CisgICAgaWYgKElTX09CU0VSVkVSLnRlc3QoZXZlbnROYW1lKSkgeworICAgICAgdGhp
cy5zdG9wT2JzZXJ2aW5nQ29udGVudEtleShldmVudE5hbWUuc2xpY2UoMCwgLTcpKTsKKyAgICB9
CisgIH0sCiAKLSAgICAgIHZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rpb24oZWxlbWVudCwgaWQp
IHsKLSAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBpZCkgeyByZXR1
cm4gZWxlbWVudDsgfQorICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIENPTlRFTlQgS0VZIE9CU0VSVklORworICAvLyBB
Y3R1YWwgd2F0Y2gga2V5cyBvbiB0aGUgc291cmNlIGNvbnRlbnQuCiAKLSAgICAgICAgdmFyIGxl
biA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgsIGlkeCwgbm9kZSwgZm91bmQ7Ci0gICAgICAg
IGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICAgICAgbm9kZSA9IGVsZW1lbnQu
Y2hpbGROb2Rlc1tpZHhdOwotICAgICAgICAgIGZvdW5kID0gbm9kZS5ub2RlVHlwZSA9PT0gMSAm
JiBmaW5kQ2hpbGRCeUlkKG5vZGUsIGlkKTsKLSAgICAgICAgICBpZiAoZm91bmQpIHsgcmV0dXJu
IGZvdW5kOyB9Ci0gICAgICAgIH0KLSAgICAgIH07CisgIGJlZ2luT2JzZXJ2aW5nQ29udGVudEtl
eTogZnVuY3Rpb24oa2V5TmFtZSkgeworICAgIHZhciBrZXlzID0gdGhpcy5fa2V5czsKKyAgICBp
ZiAoIWtleXMpIGtleXMgPSB0aGlzLl9rZXlzID0ge307CisgICAgaWYgKCFrZXlzW2tleU5hbWVd
KSB7CisgICAgICBrZXlzW2tleU5hbWVdID0gMTsKKyAgICAgIHZhciBjb250ZW50ID0gdGhpcy5f
Y29udGVudCwKKyAgICAgICAgICBsZW4gPSBnZXQoY29udGVudCwgJ2xlbmd0aCcpOworICAgICAg
YWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHRoaXMsIDAsIGxlbik7
CisgICAgfSBlbHNlIHsKKyAgICAgIGtleXNba2V5TmFtZV0rKzsKKyAgICB9CisgIH0sCiAKLSAg
ICAgIHZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7Ci0gICAgICAg
IHZhciBtYXRjaGVzID0gW107Ci0gICAgICAgIGlmIChtb3Zlc1doaXRlc3BhY2UpIHsKLSAgICAg
ICAgICAvLyBSaWdodCBub3cgd2Ugb25seSBjaGVjayBmb3Igc2NyaXB0IHRhZ3Mgd2l0aCBpZHMg
d2l0aCB0aGUKLSAgICAgICAgICAvLyBnb2FsIG9mIHRhcmdldGluZyBtb3JwaHMuCi0gICAgICAg
ICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvKFxzKykoPHNjcmlwdCBpZD0nKFteJ10rKScpL2csIGZ1
bmN0aW9uKG1hdGNoLCBzcGFjZXMsIHRhZywgaWQpIHsKLSAgICAgICAgICAgIG1hdGNoZXMucHVz
aChbaWQsIHNwYWNlc10pOwotICAgICAgICAgICAgcmV0dXJuIHRhZzsKLSAgICAgICAgICB9KTsK
LSAgICAgICAgfQotCi0gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKKyAgc3RvcE9i
c2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKKyAgICB2YXIga2V5cyA9IHRo
aXMuX2tleXM7CisgICAgaWYgKGtleXMgJiYgKGtleXNba2V5TmFtZV0+MCkgJiYgKC0ta2V5c1tr
ZXlOYW1lXTw9MCkpIHsKKyAgICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudCwKKyAgICAg
ICAgICBsZW4gICAgID0gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKTsKKyAgICAgIHJlbW92ZU9ic2Vy
dmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCB0aGlzLCAwLCBsZW4pOworICAgIH0K
KyAgfSwKIAotICAgICAgICAvLyBJZiB3ZSBoYXZlIHRvIGRvIGFueSB3aGl0ZXNwYWNlIGFkanVz
dG1lbnRzIGRvIHRoZW0gbm93Ci0gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKLSAg
ICAgICAgICB2YXIgbGVuID0gbWF0Y2hlcy5sZW5ndGgsIGlkeDsKLSAgICAgICAgICBmb3IgKGlk
eD0wOyBpZHg8bGVuOyBpZHgrKykgewotICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGZpbmRDaGls
ZEJ5SWQoZWxlbWVudCwgbWF0Y2hlc1tpZHhdWzBdKSwKLSAgICAgICAgICAgICAgICBub2RlID0g
ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWF0Y2hlc1tpZHhdWzFdKTsKLSAgICAgICAgICAgIHNj
cmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBzY3JpcHQpOwotICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgfTsKKyAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKG9i
aiwga2V5TmFtZSkgeworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXlOYW1l
KTsKKyAgfSwKIAotICAgICAgLyoqCi0gICAgICAgKiBHaXZlbiBhIHBhcmVudCBub2RlIGFuZCBz
b21lIEhUTUwsIGdlbmVyYXRlIGEgc2V0IG9mIG5vZGVzLiBSZXR1cm4gdGhlIGZpcnN0Ci0gICAg
ICAgKiBub2RlLCB3aGljaCB3aWxsIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRoZSByZXN0IHVzaW5n
IG5leHRTaWJsaW5nLgotICAgICAgICoKLSAgICAgICAqIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNh
dXNlIGlubmVySFRNTCBpbiBJRSBkb2VzIG5vdCByZWFsbHkgcGFyc2UgdGhlIG5vZGVzLgotICAg
ICAgICoqLwotICAgICAgdmFyIGZpcnN0Tm9kZUZvciA9IGZ1bmN0aW9uKHBhcmVudE5vZGUsIGh0
bWwpIHsKLSAgICAgICAgdmFyIGFyciA9IHdyYXBNYXBbcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93
ZXJDYXNlKCldIHx8IHdyYXBNYXAuX2RlZmF1bHQ7Ci0gICAgICAgIHZhciBkZXB0aCA9IGFyclsw
XSwgc3RhcnQgPSBhcnJbMV0sIGVuZCA9IGFyclsyXTsKKyAgY29udGVudEtleURpZENoYW5nZTog
ZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7CisgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhp
cywga2V5TmFtZSk7CisgIH0KIAotICAgICAgICBpZiAobmVlZHNTaHkpIHsgaHRtbCA9ICcmc2h5
OycraHRtbDsgfQorfSk7CiAKLSAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCdkaXYnKTsKIAotICAgICAgICBzZXRJbm5lckhUTUwoZWxlbWVudCwgc3RhcnQgKyBo
dG1sICsgZW5kKTsKIAotICAgICAgICBmb3IgKHZhciBpPTA7IGk8PWRlcHRoOyBpKyspIHsKLSAg
ICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5maXJzdENoaWxkOwotICAgICAgICB9Cit9KSgpOwog
Ci0gICAgICAgIC8vIExvb2sgZm9yICZzaHk7IHRvIHJlbW92ZSBpdC4KLSAgICAgICAgaWYgKG5l
ZWRzU2h5KSB7Ci0gICAgICAgICAgdmFyIHNoeUVsZW1lbnQgPSBlbGVtZW50OwogCi0gICAgICAg
ICAgLy8gU29tZXRpbWVzIHdlIGdldCBuYW1lbGVzcyBlbGVtZW50cyB3aXRoIHRoZSBzaHkgaW5z
aWRlCi0gICAgICAgICAgd2hpbGUgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVs
ZW1lbnQubm9kZU5hbWUpIHsKLSAgICAgICAgICAgIHNoeUVsZW1lbnQgPSBzaHlFbGVtZW50LmZp
cnN0Q2hpbGQ7Ci0gICAgICAgICAgfQogCi0gICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBpdCdz
IHRoZSBhY3R1YWwgdW5pY29kZSBjaGFyYWN0ZXIuCi0gICAgICAgICAgaWYgKHNoeUVsZW1lbnQu
bm9kZVR5cGUgPT09IDMgJiYgc2h5RWxlbWVudC5ub2RlVmFsdWUuY2hhckF0KDApID09PSAiXHUw
MEFEIikgewotICAgICAgICAgICAgc2h5RWxlbWVudC5ub2RlVmFsdWUgPSBzaHlFbGVtZW50Lm5v
ZGVWYWx1ZS5zbGljZSgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KKyhmdW5jdGlvbigpIHsK
Ky8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLwogCi0gICAg
ICAgIHJldHVybiBlbGVtZW50OwotICAgICAgfTsKIAotICAgICAgLyoqCi0gICAgICAgKiBJbiBz
b21lIGNhc2VzLCBJbnRlcm5ldCBFeHBsb3JlciBjYW4gY3JlYXRlIGFuIGFub255bW91cyBub2Rl
IGluCi0gICAgICAgKiB0aGUgaGllcmFyY2h5IHdpdGggbm8gdGFnTmFtZS4gWW91IGNhbiBjcmVh
dGUgdGhpcyBzY2VuYXJpbyB2aWE6Ci0gICAgICAgKgotICAgICAgICogICAgIGRpdiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgICogICAgIGRpdi5pbm5lckhUTUwgPSAi
PHRhYmxlPiZzaHk8c2NyaXB0Pjwvc2NyaXB0Pjx0cj48dGQ+aGk8L3RkPjwvdHI+PC90YWJsZT4i
OwotICAgICAgICogICAgIGRpdi5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGFnTmFtZSAvLz0+ICIi
Ci0gICAgICAgKgotICAgICAgICogSWYgb3VyIHNjcmlwdCBtYXJrZXJzIGFyZSBpbnNpZGUgc3Vj
aCBhIG5vZGUsIHdlIG5lZWQgdG8gZmluZCB0aGF0Ci0gICAgICAgKiBub2RlIGFuZCB1c2UgKml0
KiBhcyB0aGUgbWFya2VyLgotICAgICAgICoqLwotICAgICAgdmFyIHJlYWxOb2RlID0gZnVuY3Rp
b24oc3RhcnQpIHsKLSAgICAgICAgd2hpbGUgKHN0YXJ0LnBhcmVudE5vZGUudGFnTmFtZSA9PT0g
IiIpIHsKLSAgICAgICAgICBzdGFydCA9IHN0YXJ0LnBhcmVudE5vZGU7Ci0gICAgICAgIH0KK3Zh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgcmVwbGFjZSA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5fcmVwbGFjZTsKIAotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgICB9Owor
Ly8gQWRkIEVtYmVyLkFycmF5IHRvIEFycmF5LnByb3RvdHlwZS4gUmVtb3ZlIG1ldGhvZHMgd2l0
aCBuYXRpdmUKKy8vIGltcGxlbWVudGF0aW9ucyBhbmQgc3VwcGx5IHNvbWUgbW9yZSBvcHRpbWl6
ZWQgdmVyc2lvbnMgb2YgZ2VuZXJpYyBtZXRob2RzCisvLyBiZWNhdXNlIHRoZXkgYXJlIHNvIGNv
bW1vbi4KK3ZhciBOYXRpdmVBcnJheSA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5NdXRhYmxl
QXJyYXksIEVtYmVyLk9ic2VydmFibGUsIEVtYmVyLkNvcHlhYmxlLCB7CiAKLSAgICAgIC8qKgot
ICAgICAgICogV2hlbiBhdXRvbWF0aWNhbGx5IGFkZGluZyBhIHRib2R5LCBJbnRlcm5ldCBFeHBs
b3JlciBpbnNlcnRzIHRoZQotICAgICAgICogdGJvZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBm
aXJzdCA8dHI+LiBPdGhlciBicm93c2VycyBjcmVhdGUgaXQKLSAgICAgICAqIGJlZm9yZSB0aGUg
Zmlyc3Qgbm9kZSwgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKgotICAgICAgICogVGhpcyBtZWFu
cyB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICoKLSAgICAgICAqICAgICBkaXYgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBkaXYuaW5uZXJIVE1M
ID0gIjx0YWJsZT48c2NyaXB0IGlkPSdmaXJzdCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90
cj48c2NyaXB0IGlkPSdsYXN0Jz48L3NjcmlwdD48L3RhYmxlPgotICAgICAgICoKLSAgICAgICAq
IEdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIERPTSBpbiBJRToKLSAgICAgICAqCi0gICAgICAgKiAg
ICAgKyBkaXYKLSAgICAgICAqICAgICAgICsgdGFibGUKLSAgICAgICAqICAgICAgICAgLSBzY3Jp
cHQgaWQ9J2ZpcnN0JwotICAgICAgICogICAgICAgICArIHRib2R5Ci0gICAgICAgKiAgICAgICAg
ICAgKyB0cgotICAgICAgICogICAgICAgICAgICAgKyB0ZAotICAgICAgICogICAgICAgICAgICAg
ICAtICJoaSIKLSAgICAgICAqICAgICAgICAgICAtIHNjcmlwdCBpZD0nbGFzdCcKLSAgICAgICAq
Ci0gICAgICAgKiBXaGljaCBtZWFucyB0aGF0IHRoZSB0d28gc2NyaXB0IHRhZ3MsIGV2ZW4gdGhv
dWdoIHRoZXkgd2VyZQotICAgICAgICogaW5zZXJ0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhl
IGhpZXJhcmNoeSBpbiB0aGUgb3JpZ2luYWwKLSAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRpZmZl
cmVudCBwYXJlbnRzLgotICAgICAgICoKLSAgICAgICAqIFRoaXMgY29kZSByZXBhcmVudHMgdGhl
IGZpcnN0IHNjcmlwdCB0YWcgYnkgbWFraW5nIGl0IHRoZSB0Ym9keSdzCi0gICAgICAgKiBmaXJz
dCBjaGlsZC4KLSAgICAgICAqKi8KLSAgICAgIHZhciBmaXhQYXJlbnRhZ2UgPSBmdW5jdGlvbihz
dGFydCwgZW5kKSB7Ci0gICAgICAgIGlmIChzdGFydC5wYXJlbnROb2RlICE9PSBlbmQucGFyZW50
Tm9kZSkgewotICAgICAgICAgIGVuZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdGFydCwgZW5k
LnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH07CisgIC8vIGJlY2F1
c2UgbGVuZ3RoIGlzIGEgYnVpbHQtaW4gcHJvcGVydHkgd2UgbmVlZCB0byBrbm93IHRvIGp1c3Qg
Z2V0IHRoZQorICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KKyAgZ2V0OiBmdW5jdGlvbihrZXkpIHsK
KyAgICBpZiAoa2V5PT09J2xlbmd0aCcpIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgICBlbHNlIGlm
ICgnbnVtYmVyJyA9PT0gdHlwZW9mIGtleSkgcmV0dXJuIHRoaXNba2V5XTsKKyAgICBlbHNlIHJl
dHVybiB0aGlzLl9zdXBlcihrZXkpOworICB9LAogCi0gICAgICBodG1sRnVuYyA9IGZ1bmN0aW9u
KGh0bWwsIG91dGVyVG9vKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgcmVhbCBzdGFydGluZyBub2Rl
LiBzZWUgcmVhbE5vZGUgZm9yIGRldGFpbHMuCi0gICAgICAgIHZhciBzdGFydCA9IHJlYWxOb2Rl
KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpKTsKLSAgICAgICAgdmFyIGVuZCA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKLSAgICAgICAgdmFyIHBhcmVudE5v
ZGUgPSBlbmQucGFyZW50Tm9kZTsKLSAgICAgICAgdmFyIG5vZGUsIG5leHRTaWJsaW5nLCBsYXN0
OworICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7CisgICAgcmV0dXJuIHRoaXNbaWR4XTsKKyAg
fSwKIAotICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBub2RlcyBz
aGFyZSB0aGUgc2FtZQotICAgICAgICAvLyBwYXJlbnQuIElmIG5vdCwgZml4IGl0LgotICAgICAg
ICBmaXhQYXJlbnRhZ2Uoc3RhcnQsIGVuZCk7CisgIC8vIHByaW1pdGl2ZSBmb3IgYXJyYXkgc3Vw
cG9ydC4KKyAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKIAotICAgICAg
ICAvLyByZW1vdmUgYWxsIG9mIHRoZSBub2RlcyBhZnRlciB0aGUgc3RhcnRpbmcgcGxhY2Vob2xk
ZXIgYW5kCi0gICAgICAgIC8vIGJlZm9yZSB0aGUgZW5kaW5nIHBsYWNlaG9sZGVyLgotICAgICAg
ICBub2RlID0gc3RhcnQubmV4dFNpYmxpbmc7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAg
ICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwotICAgICAgICAgIGxhc3QgPSBu
b2RlID09PSBlbmQ7CisgICAgaWYgKHRoaXMuaXNGcm96ZW4pIHRocm93IEVtYmVyLkZST1pFTl9F
UlJPUjsKIAotICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSwgYW5kIHdlIHdh
bnQgdG8gcmVtb3ZlIGl0IGFzIHdlbGwsCi0gICAgICAgICAgLy8gc2V0IHRoZSBgZW5kYCBub2Rl
IHRvIHRoZSBuZXh0IHNpYmxpbmcuIFRoaXMgaXMgYmVjYXVzZQotICAgICAgICAgIC8vIGZvciB0
aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24sIHdlIGluc2VydCB0aGUgbmV3IG5vZGVzCi0gICAgICAg
ICAgLy8gYmVmb3JlIHRoZSBlbmQgKG5vdGUgdGhhdCBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbCkg
aXMKLSAgICAgICAgICAvLyB0aGUgc2FtZSBhcyBhcHBlbmRDaGlsZChub2RlKSkuCi0gICAgICAg
ICAgLy8KLSAgICAgICAgICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byByZW1vdmUgaXQsIGp1c3Qg
YnJlYWsuCi0gICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgIGlmIChvdXRlclRvbykg
eyBlbmQgPSBub2RlLm5leHRTaWJsaW5nOyB9IGVsc2UgeyBicmVhazsgfQotICAgICAgICAgIH0K
KyAgICAvLyBpZiB3ZSByZXBsYWNlZCBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywg
dGhlbiBwYXNzIG9ubHkgdGhlCisgICAgLy8gcmVwbGFjZWQgcmFuZ2UuIE90aGVyd2lzZSwgcGFz
cyB0aGUgZnVsbCByZW1haW5pbmcgYXJyYXkgbGVuZ3RoCisgICAgLy8gc2luY2UgZXZlcnl0aGlu
ZyBoYXMgc2hpZnRlZAorICAgIHZhciBsZW4gPSBvYmplY3RzID8gZ2V0KG9iamVjdHMsICdsZW5n
dGgnKSA6IDA7CisgICAgdGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdlKGlkeCwgYW10LCBsZW4p
OwogCi0gICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOworICAgIGlm
IChsZW4gPT09IDApIHsKKyAgICAgIHRoaXMuc3BsaWNlKGlkeCwgYW10KTsKKyAgICB9IGVsc2Ug
eworICAgICAgcmVwbGFjZSh0aGlzLCBpZHgsIGFtdCwgb2JqZWN0cyk7CisgICAgfQogCi0gICAg
ICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCBub2RlIGFuZCB3ZSBkaWRuJ3QgYnJlYWsgYmVm
b3JlCi0gICAgICAgICAgLy8gKGJlY2F1c2Ugd2Ugd2FudGVkIHRvIHJlbW92ZSB0aGUgb3V0ZXIg
bm9kZXMpLCBicmVhawotICAgICAgICAgIC8vIG5vdy4KLSAgICAgICAgICBpZiAobGFzdCkgeyBi
cmVhazsgfQorICAgIHRoaXMuYXJyYXlDb250ZW50RGlkQ2hhbmdlKGlkeCwgYW10LCBsZW4pOwor
ICAgIHJldHVybiB0aGlzOworICB9LAogCi0gICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOwot
ICAgICAgICB9CisgIC8vIElmIHlvdSBhc2sgZm9yIGFuIHVua25vd24gcHJvcGVydHksIHRoZW4g
dHJ5IHRvIGNvbGxlY3QgdGhlIHZhbHVlCisgIC8vIGZyb20gbWVtYmVyIGl0ZW1zLgorICB1bmtu
b3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICB2YXIgcmV0Oy8vID0gdGhp
cy5yZWR1Y2VkUHJvcGVydHkoa2V5LCB2YWx1ZSkgOworICAgIGlmICgodmFsdWUgIT09IHVuZGVm
aW5lZCkgJiYgcmV0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldCA9IHRoaXNba2V5XSA9IHZh
bHVlOworICAgIH0KKyAgICByZXR1cm4gcmV0IDsKKyAgfSwKIAotICAgICAgICAvLyBnZXQgdGhl
IGZpcnN0IG5vZGUgZm9yIHRoZSBIVE1MIHN0cmluZywgZXZlbiBpbiBjYXNlcyBsaWtlCi0gICAg
ICAgIC8vIHRhYmxlcyBhbmQgbGlzdHMgd2hlcmUgYSBzaW1wbGUgaW5uZXJIVE1MIG9uIGEgZGl2
IHdvdWxkCi0gICAgICAgIC8vIHN3YWxsb3cgc29tZSBvZiB0aGUgY29udGVudC4KLSAgICAgICAg
bm9kZSA9IGZpcnN0Tm9kZUZvcihzdGFydC5wYXJlbnROb2RlLCBodG1sKTsKKyAgLy8gSWYgYnJv
d3NlciBkaWQgbm90IGltcGxlbWVudCBpbmRleE9mIG5hdGl2ZWx5LCB0aGVuIG92ZXJyaWRlIHdp
dGgKKyAgLy8gc3BlY2lhbGl6ZWQgdmVyc2lvbgorICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3Qs
IHN0YXJ0QXQpIHsKKyAgICB2YXIgaWR4LCBsZW4gPSB0aGlzLmxlbmd0aDsKIAotICAgICAgICAv
LyBjb3B5IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVu
ZGluZwotICAgICAgICAvLyBwbGFjZWhvbGRlci4KLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAg
ICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAgcGFyZW50
Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZW5kKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNpYmxp
bmc7Ci0gICAgICAgIH0KLSAgICAgIH07CisgICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkg
c3RhcnRBdCA9IDA7CisgICAgZWxzZSBzdGFydEF0ID0gKHN0YXJ0QXQgPCAwKSA/IE1hdGguY2Vp
bChzdGFydEF0KSA6IE1hdGguZmxvb3Ioc3RhcnRBdCk7CisgICAgaWYgKHN0YXJ0QXQgPCAwKSBz
dGFydEF0ICs9IGxlbjsKIAotICAgICAgLy8gcmVtb3ZlIHRoZSBub2RlcyBpbiB0aGUgRE9NIHJl
cHJlc2VudGluZyB0aGlzIG1ldGFtb3JwaC4KLSAgICAgIC8vCi0gICAgICAvLyB0aGlzIGluY2x1
ZGVzIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9sZGVycy4KLSAgICAgIHJlbW92ZUZ1
bmMgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUoZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCkpOwotICAgICAgICB2YXIgZW5kID0gZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOworICAgIGZvcihpZHg9c3RhcnRBdDtpZHg8bGVuO2lk
eCsrKSB7CisgICAgICBpZiAodGhpc1tpZHhdID09PSBvYmplY3QpIHJldHVybiBpZHggOworICAg
IH0KKyAgICByZXR1cm4gLTE7CisgIH0sCiAKLSAgICAgICAgdGhpcy5odG1sKCcnKTsKLSAgICAg
ICAgc3RhcnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdGFydCk7Ci0gICAgICAgIGVuZC5wYXJl
bnROb2RlLnJlbW92ZUNoaWxkKGVuZCk7Ci0gICAgICB9OworICBsYXN0SW5kZXhPZjogZnVuY3Rp
b24ob2JqZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGlkeCwgbGVuID0gdGhpcy5sZW5ndGg7CiAK
LSAgICAgIGFwcGVuZFRvRnVuYyA9IGZ1bmN0aW9uKHBhcmVudE5vZGUpIHsKLSAgICAgICAgdmFy
IG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwgdGhpcy5vdXRlckhUTUwoKSk7Ci0gICAg
ICAgIHZhciBuZXh0U2libGluZzsKKyAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkKSBzdGFy
dEF0ID0gbGVuLTE7CisgICAgZWxzZSBzdGFydEF0ID0gKHN0YXJ0QXQgPCAwKSA/IE1hdGguY2Vp
bChzdGFydEF0KSA6IE1hdGguZmxvb3Ioc3RhcnRBdCk7CisgICAgaWYgKHN0YXJ0QXQgPCAwKSBz
dGFydEF0ICs9IGxlbjsKIAotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgIG5leHRT
aWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKLSAgICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENo
aWxkKG5vZGUpOwotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAgfQotICAg
ICAgfTsKKyAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4Pj0wO2lkeC0tKSB7CisgICAgICBpZiAodGhp
c1tpZHhdID09PSBvYmplY3QpIHJldHVybiBpZHggOworICAgIH0KKyAgICByZXR1cm4gLTE7Cisg
IH0sCiAKLSAgICAgIGFmdGVyRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKLSAgICAgICAgLy8gZ2V0
IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KLSAgICAg
ICAgdmFyIGVuZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKLSAgICAgICAg
dmFyIGluc2VydEJlZm9yZSA9IGVuZC5uZXh0U2libGluZzsKLSAgICAgICAgdmFyIHBhcmVudE5v
ZGUgPSBlbmQucGFyZW50Tm9kZTsKLSAgICAgICAgdmFyIG5leHRTaWJsaW5nOwotICAgICAgICB2
YXIgbm9kZTsKKyAgY29weTogZnVuY3Rpb24oZGVlcCkgeworICAgIGlmIChkZWVwKSB7CisgICAg
ICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gRW1iZXIuY29weShpdGVt
LCB0cnVlKTsgfSk7CisgICAgfQogCi0gICAgICAgIC8vIGdldCB0aGUgZmlyc3Qgbm9kZSBmb3Ig
dGhlIEhUTUwgc3RyaW5nLCBldmVuIGluIGNhc2VzIGxpa2UKLSAgICAgICAgLy8gdGFibGVzIGFu
ZCBsaXN0cyB3aGVyZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYgd291bGQKLSAgICAgICAg
Ly8gc3dhbGxvdyBzb21lIG9mIHRoZSBjb250ZW50LgotICAgICAgICBub2RlID0gZmlyc3ROb2Rl
Rm9yKHBhcmVudE5vZGUsIGh0bWwpOworICAgIHJldHVybiB0aGlzLnNsaWNlKCk7CisgIH0KK30p
OwogCi0gICAgICAgIC8vIGNvcHkgdGhlIG5vZGVzIGZvciB0aGUgSFRNTCBiZXR3ZWVuIHRoZSBz
dGFydGluZyBhbmQgZW5kaW5nCi0gICAgICAgIC8vIHBsYWNlaG9sZGVyLgotICAgICAgICB3aGls
ZSAobm9kZSkgewotICAgICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKLSAg
ICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNlcnRCZWZvcmUpOwotICAg
ICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAgfQotICAgICAgfTsKKy8vIFJlbW92
ZSBhbnkgbWV0aG9kcyBpbXBsZW1lbnRlZCBuYXRpdmVseSBzbyB3ZSBkb24ndCBvdmVycmlkZSB0
aGVtCit2YXIgaWdub3JlID0gWydsZW5ndGgnXTsKK0VtYmVyLkVudW1lcmFibGVVdGlscy5mb3JF
YWNoKE5hdGl2ZUFycmF5LmtleXMoKSwgZnVuY3Rpb24obWV0aG9kTmFtZSkgeworICBpZiAoQXJy
YXkucHJvdG90eXBlW21ldGhvZE5hbWVdKSBpZ25vcmUucHVzaChtZXRob2ROYW1lKTsKK30pOwog
Ci0gICAgICBwcmVwZW5kRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKLSAgICAgICAgdmFyIHN0YXJ0
ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCk7Ci0gICAgICAgIHZhciBwYXJl
bnROb2RlID0gc3RhcnQucGFyZW50Tm9kZTsKLSAgICAgICAgdmFyIG5leHRTaWJsaW5nOwotICAg
ICAgICB2YXIgbm9kZTsKK2lmIChpZ25vcmUubGVuZ3RoPjApIHsKKyAgTmF0aXZlQXJyYXkgPSBO
YXRpdmVBcnJheS53aXRob3V0LmFwcGx5KE5hdGl2ZUFycmF5LCBpZ25vcmUpOworfQogCi0gICAg
ICAgIG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwgaHRtbCk7Ci0gICAgICAgIHZhciBp
bnNlcnRCZWZvcmUgPSBzdGFydC5uZXh0U2libGluZzsKKy8qKgorICBUaGUgTmF0aXZlQXJyYXkg
bWl4aW4gY29udGFpbnMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIHRvIHRvIG1ha2UgdGhlIG5hdGl2
ZQorICBBcnJheSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJheSBhbmQgYWxsIG9mIGl0cyBkZXBl
bmRlbnQgQVBJcy4gVW5sZXNzIHlvdQorICBoYXZlIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Ag
b3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkFycmF5YCBzZXQgdG8KKyAgZmFsc2UsIHRoaXMg
d2lsbCBiZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIE90aGVyd2lzZSB5b3UgY2FuIGFwcGx5IHRo
ZSBtaXhpbgorICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2
YXRlYC4KIAotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgIG5leHRTaWJsaW5nID0g
bm9kZS5uZXh0U2libGluZzsKLSAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2Rl
LCBpbnNlcnRCZWZvcmUpOwotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAg
fQotICAgICAgfTsKKyAgQGNsYXNzIE5hdGl2ZUFycmF5CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
QHVzZXMgRW1iZXIuTXV0YWJsZUFycmF5CisgIEB1c2VzIEVtYmVyLk9ic2VydmFibGUKKyAgQHVz
ZXMgRW1iZXIuQ29weWFibGUKKyovCitFbWJlci5OYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5Owor
CisvKioKKyAgQ3JlYXRlcyBhbiBgRW1iZXIuTmF0aXZlQXJyYXlgIGZyb20gYW4gQXJyYXkgbGlr
ZSBvYmplY3QuCisgIERvZXMgbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgb2JqZWN0LiBFbWJlci5B
IGlzIG5vdCBuZWVkZWQgaWYKKyAgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBpcyBgdHJ1ZWAg
KHRoZSBkZWZhdWx0IHZhbHVlKS4gSG93ZXZlciwKKyAgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5
b3UgdXNlIEVtYmVyLkEgd2hlbiBjcmVhdGluZyBhZGRvbnMgZm9yCisgIGVtYmVyIG9yIHdoZW4g
eW91IGNhbiBub3QgZ3VhcmFudGVlIHRoYXQgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYAorICB3
aWxsIGJlIGB0cnVlYC4KKworICBFeGFtcGxlCisKKyAgYGBganMKKyAgdmFyIFBhZ2luYXRpb24g
PSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRlbmQoeworICAgIHRhZ05hbWU6ICd1bCcsCisgICAg
Y2xhc3NOYW1lczogWydwYWdpbmF0aW9uJ10sCisgICAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAg
ICB0aGlzLl9zdXBlcigpOworICAgICAgaWYgKCF0aGlzLmdldCgnY29udGVudCcpKSB7CisgICAg
ICAgIHRoaXMuc2V0KCdjb250ZW50JywgRW1iZXIuQShbXSkpOworICAgICAgfQorICAgIH0KKyAg
fSk7CisgIGBgYAorCisgIEBtZXRob2QgQQorICBAZm9yIEVtYmVyCisgIEByZXR1cm4ge0VtYmVy
Lk5hdGl2ZUFycmF5fQorKi8KK0VtYmVyLkEgPSBmdW5jdGlvbihhcnIpIHsKKyAgaWYgKGFyciA9
PT0gdW5kZWZpbmVkKSB7IGFyciA9IFtdOyB9CisgIHJldHVybiBFbWJlci5BcnJheS5kZXRlY3Qo
YXJyKSA/IGFyciA6IEVtYmVyLk5hdGl2ZUFycmF5LmFwcGx5KGFycik7Cit9OworCisvKioKKyAg
QWN0aXZhdGVzIHRoZSBtaXhpbiBvbiB0aGUgQXJyYXkucHJvdG90eXBlIGlmIG5vdCBhbHJlYWR5
IGFwcGxpZWQuIENhbGxpbmcKKyAgdGhpcyBtZXRob2QgbW9yZSB0aGFuIG9uY2UgaXMgc2FmZS4g
VGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIGVtYmVyIGlzIGxvYWRlZAorICB1bmxlc3MgeW91IGhh
dmUgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvciBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMu
QXJyYXlgCisgIHNldCB0byBgZmFsc2VgLgorCisgIEV4YW1wbGUKKworICBgYGBqcworICBpZiAo
RW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RPVFlQ
RVMuQXJyYXkpIHsKKyAgICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSgpOworICB9CisgIGBg
YAorCisgIEBtZXRob2QgYWN0aXZhdGUKKyAgQGZvciBFbWJlci5OYXRpdmVBcnJheQorICBAc3Rh
dGljCisgIEByZXR1cm4ge3ZvaWR9CisqLworRW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGUgPSBm
dW5jdGlvbigpIHsKKyAgTmF0aXZlQXJyYXkuYXBwbHkoQXJyYXkucHJvdG90eXBlKTsKKworICBF
bWJlci5BID0gZnVuY3Rpb24oYXJyKSB7IHJldHVybiBhcnIgfHwgW107IH07Cit9OworCitpZiAo
RW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RPVFlQ
RVMuQXJyYXkpIHsKKyAgRW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGUoKTsKK30KKworCit9KSgp
OworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwg
Z3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsIGlzTm9uZSA9IEVtYmVyLmlzTm9uZSwgZm10ID0gRW1i
ZXIuU3RyaW5nLmZtdDsKKworLyoqCisgIEFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIG9iamVj
dHMuCisKKyAgQSBTZXQgd29ya3MgYSBiaXQgbGlrZSBhbiBhcnJheSBleGNlcHQgdGhhdCBpdHMg
aXRlbXMgYXJlIG5vdCBvcmRlcmVkLiBZb3UKKyAgY2FuIGNyZWF0ZSBhIHNldCB0byBlZmZpY2ll
bnRseSB0ZXN0IGZvciBtZW1iZXJzaGlwIGZvciBhbiBvYmplY3QuIFlvdSBjYW4KKyAgYWxzbyBp
dGVyYXRlIHRocm91Z2ggYSBzZXQganVzdCBsaWtlIGFuIGFycmF5LCBldmVuIGFjY2Vzc2luZyBv
YmplY3RzIGJ5CisgIGluZGV4LCBob3dldmVyIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBhcyB0byB0
aGVpciBvcmRlci4KKworICBBbGwgU2V0cyBhcmUgb2JzZXJ2YWJsZSB2aWEgdGhlIEVudW1lcmFi
bGUgT2JzZXJ2ZXIgQVBJIC0gd2hpY2ggd29ya3MKKyAgb24gYW55IGVudW1lcmFibGUgb2JqZWN0
IGluY2x1ZGluZyBib3RoIFNldHMgYW5kIEFycmF5cy4KKworICAjIyBDcmVhdGluZyBhIFNldAor
CisgIFlvdSBjYW4gY3JlYXRlIGEgc2V0IGxpa2UgeW91IHdvdWxkIG1vc3Qgb2JqZWN0cyB1c2lu
ZworICBgbmV3IEVtYmVyLlNldCgpYC4gTW9zdCBuZXcgc2V0cyB5b3UgY3JlYXRlIHdpbGwgYmUg
ZW1wdHksIGJ1dCB5b3UgY2FuCisgIGFsc28gaW5pdGlhbGl6ZSB0aGUgc2V0IHdpdGggc29tZSBj
b250ZW50IGJ5IHBhc3NpbmcgYW4gYXJyYXkgb3Igb3RoZXIKKyAgZW51bWVyYWJsZSBvZiBvYmpl
Y3RzIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKworICBGaW5hbGx5LCB5b3UgY2FuIHBhc3MgaW4gYW4g
ZXhpc3Rpbmcgc2V0IGFuZCB0aGUgc2V0IHdpbGwgYmUgY29waWVkLiBZb3UKKyAgY2FuIGFsc28g
Y3JlYXRlIGEgY29weSBvZiBhIHNldCBieSBjYWxsaW5nIGBFbWJlci5TZXQjY29weSgpYC4KKwor
ICBgYGBqYXZhc2NyaXB0CisgIC8vIGNyZWF0ZXMgYSBuZXcgZW1wdHkgc2V0CisgIHZhciBmb3Vu
ZE5hbWVzID0gbmV3IEVtYmVyLlNldCgpOworCisgIC8vIGNyZWF0ZXMgYSBzZXQgd2l0aCBmb3Vy
IG5hbWVzIGluIGl0LgorICB2YXIgbmFtZXMgPSBuZXcgRW1iZXIuU2V0KFsiQ2hhcmxlcyIsICJU
b20iLCAiSnVhbiIsICJBbGV4Il0pOyAvLyA6UAorCisgIC8vIGNyZWF0ZXMgYSBjb3B5IG9mIHRo
ZSBuYW1lcyBzZXQuCisgIHZhciBuYW1lc0NvcHkgPSBuZXcgRW1iZXIuU2V0KG5hbWVzKTsKKwor
ICAvLyBzYW1lIGFzIGFib3ZlLgorICB2YXIgYW5vdGhlck5hbWVzQ29weSA9IG5hbWVzLmNvcHko
KTsKKyAgYGBgCisKKyAgIyMgQWRkaW5nL1JlbW92aW5nIE9iamVjdHMKKworICBZb3UgZ2VuZXJh
bGx5IGFkZCBvciByZW1vdmUgb2JqZWN0cyBmcm9tIGEgc2V0IHVzaW5nIGBhZGQoKWAgb3IKKyAg
YHJlbW92ZSgpYC4gWW91IGNhbiBhZGQgYW55IHR5cGUgb2Ygb2JqZWN0IGluY2x1ZGluZyBwcmlt
aXRpdmVzIHN1Y2ggYXMKKyAgbnVtYmVycywgc3RyaW5ncywgYW5kIGJvb2xlYW5zLgorCisgIFVu
bGlrZSBhcnJheXMsIG9iamVjdHMgY2FuIG9ubHkgZXhpc3Qgb25lIHRpbWUgaW4gYSBzZXQuIElm
IHlvdSBjYWxsIGBhZGQoKWAKKyAgb24gYSBzZXQgd2l0aCB0aGUgc2FtZSBvYmplY3QgbXVsdGlw
bGUgdGltZXMsIHRoZSBvYmplY3Qgd2lsbCBvbmx5IGJlIGFkZGVkCisgIG9uY2UuIExpa2V3aXNl
LCBjYWxsaW5nIGByZW1vdmUoKWAgd2l0aCB0aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMg
d2lsbAorICByZW1vdmUgdGhlIG9iamVjdCB0aGUgZmlyc3QgdGltZSBhbmQgaGF2ZSBubyBlZmZl
Y3Qgb24gZnV0dXJlIGNhbGxzIHVudGlsCisgIHlvdSBhZGQgdGhlIG9iamVjdCB0byB0aGUgc2V0
IGFnYWluLgorCisgIE5PVEU6IFlvdSBjYW5ub3QgYWRkL3JlbW92ZSBgbnVsbGAgb3IgYHVuZGVm
aW5lZGAgdG8gYSBzZXQuIEFueSBhdHRlbXB0IHRvIGRvCisgIHNvIHdpbGwgYmUgaWdub3JlZC4K
KworICBJbiBhZGRpdGlvbiB0byBhZGQvcmVtb3ZlIHlvdSBjYW4gYWxzbyBjYWxsIGBwdXNoKClg
L2Bwb3AoKWAuIFB1c2ggYmVoYXZlcworICBqdXN0IGxpa2UgYGFkZCgpYCBidXQgYHBvcCgpYCwg
dW5saWtlIGByZW1vdmUoKWAgd2lsbCBwaWNrIGFuIGFyYml0cmFyeQorICBvYmplY3QsIHJlbW92
ZSBpdCBhbmQgcmV0dXJuIGl0LiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gdXNlIGEgc2V0IGFzIGEg
am9iCisgIHF1ZXVlIHdoZW4geW91IGRvbid0IGNhcmUgd2hpY2ggb3JkZXIgdGhlIGpvYnMgYXJl
IGV4ZWN1dGVkIGluLgorCisgICMjIFRlc3RpbmcgZm9yIGFuIE9iamVjdAorCisgIFRvIHRlc3Qg
Zm9yIGFuIG9iamVjdCdzIHByZXNlbmNlIGluIGEgc2V0IHlvdSBzaW1wbHkgY2FsbAorICBgRW1i
ZXIuU2V0I2NvbnRhaW5zKClgLgorCisgICMjIE9ic2VydmluZyBjaGFuZ2VzCisKKyAgV2hlbiB1
c2luZyBgRW1iZXIuU2V0YCwgeW91IGNhbiBvYnNlcnZlIHRoZSBgIltdImAgcHJvcGVydHkgdG8g
YmUKKyAgYWxlcnRlZCB3aGVuZXZlciB0aGUgY29udGVudCBjaGFuZ2VzLiBZb3UgY2FuIGFsc28g
YWRkIGFuIGVudW1lcmFibGUKKyAgb2JzZXJ2ZXIgdG8gdGhlIHNldCB0byBiZSBub3RpZmllZCBv
ZiBzcGVjaWZpYyBvYmplY3RzIHRoYXQgYXJlIGFkZGVkIGFuZAorICByZW1vdmVkIGZyb20gdGhl
IHNldC4gU2VlIFtFbWJlci5FbnVtZXJhYmxlXSgvYXBpL2NsYXNzZXMvRW1iZXIuRW51bWVyYWJs
ZS5odG1sKQorICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBlbnVtZXJhYmxlcy4KKworICBUaGlz
IGlzIG9mdGVuIHVuaGVscGZ1bC4gSWYgeW91IGFyZSBmaWx0ZXJpbmcgc2V0cyBvZiBvYmplY3Rz
LCBmb3IgaW5zdGFuY2UsCisgIGl0IGlzIHZlcnkgaW5lZmZpY2llbnQgdG8gcmUtZmlsdGVyIGFs
bCBvZiB0aGUgaXRlbXMgZWFjaCB0aW1lIHRoZSBzZXQKKyAgY2hhbmdlcy4gSXQgd291bGQgYmUg
YmV0dGVyIGlmIHlvdSBjb3VsZCBqdXN0IGFkanVzdCB0aGUgZmlsdGVyZWQgc2V0IGJhc2VkCisg
IG9uIHdoYXQgd2FzIGNoYW5nZWQgb24gdGhlIG9yaWdpbmFsIHNldC4gVGhlIHNhbWUgaXNzdWUg
YXBwbGllcyB0byBtZXJnaW5nCisgIHNldHMsIGFzIHdlbGwuCisKKyAgIyMgT3RoZXIgTWV0aG9k
cworCisgIGBFbWJlci5TZXRgIHByaW1hcnkgaW1wbGVtZW50cyBvdGhlciBtaXhpbiBBUElzLiBG
b3IgYSBjb21wbGV0ZSByZWZlcmVuY2UKKyAgb24gdGhlIG1ldGhvZHMgeW91IHdpbGwgdXNlIHdp
dGggYEVtYmVyLlNldGAsIHBsZWFzZSBjb25zdWx0IHRoZXNlIG1peGlucy4KKyAgVGhlIG1vc3Qg
dXNlZnVsIG9uZXMgd2lsbCBiZSBgRW1iZXIuRW51bWVyYWJsZWAgYW5kCisgIGBFbWJlci5NdXRh
YmxlRW51bWVyYWJsZWAgd2hpY2ggaW1wbGVtZW50IG1vc3Qgb2YgdGhlIGNvbW1vbiBpdGVyYXRv
cgorICBtZXRob2RzIHlvdSBhcmUgdXNlZCB0byBvbiBBcnJheS4KKworICBOb3RlIHRoYXQgeW91
IGNhbiBhbHNvIHVzZSB0aGUgYEVtYmVyLkNvcHlhYmxlYCBhbmQgYEVtYmVyLkZyZWV6YWJsZWAK
KyAgQVBJcyBvbiBgRW1iZXIuU2V0YCBhcyB3ZWxsLiBPbmNlIGEgc2V0IGlzIGZyb3plbiBpdCBj
YW4gbm8gbG9uZ2VyIGJlCisgIG1vZGlmaWVkLiBUaGUgYmVuZWZpdCBvZiB0aGlzIGlzIHRoYXQg
d2hlbiB5b3UgY2FsbCBgZnJvemVuQ29weSgpYCBvbiBpdCwKKyAgRW1iZXIgd2lsbCBhdm9pZCBt
YWtpbmcgY29waWVzIG9mIHRoZSBzZXQuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZQorICBjb2Rl
IHRoYXQgY2FuIGtub3cgd2l0aCBjZXJ0YWludHkgd2hlbiB0aGUgdW5kZXJseWluZyBzZXQgZGF0
YSB3aWxsIG9yCisgIHdpbGwgbm90IGJlIG1vZGlmaWVkLgorCisgIEBjbGFzcyBTZXQKKyAgQG5h
bWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5Db3JlT2JqZWN0CisgIEB1c2VzIEVtYmVy
Lk11dGFibGVFbnVtZXJhYmxlCisgIEB1c2VzIEVtYmVyLkNvcHlhYmxlCisgIEB1c2VzIEVtYmVy
LkZyZWV6YWJsZQorICBAc2luY2UgRW1iZXIgMC45CisqLworRW1iZXIuU2V0ID0gRW1iZXIuQ29y
ZU9iamVjdC5leHRlbmQoRW1iZXIuTXV0YWJsZUVudW1lcmFibGUsIEVtYmVyLkNvcHlhYmxlLCBF
bWJlci5GcmVlemFibGUsCisgIHsKKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIElNUExFTUVOVCBFTlVNRVJBQkxF
IEFQSVMKKyAgLy8KKworICAvKioKKyAgICBUaGlzIHByb3BlcnR5IHdpbGwgY2hhbmdlIGFzIHRo
ZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2V0IGNoYW5nZXMuCisKKyAgICBAcHJvcGVydHkg
bGVuZ3RoCisgICAgQHR5cGUgbnVtYmVyCisgICAgQGRlZmF1bHQgMAorICAqLworICBsZW5ndGg6
IDAsCisKKyAgLyoqCisgICAgQ2xlYXJzIHRoZSBzZXQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3
YW50IHRvIHJldXNlIGFuIGV4aXN0aW5nIHNldAorICAgIHdpdGhvdXQgaGF2aW5nIHRvIHJlY3Jl
YXRlIGl0LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIu
U2V0KFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSk7CisgICAgY29sb3JzLmxlbmd0aDsgIC8vIDMK
KyAgICBjb2xvcnMuY2xlYXIoKTsKKyAgICBjb2xvcnMubGVuZ3RoOyAgLy8gMAorICAgIGBgYAor
CisgICAgQG1ldGhvZCBjbGVhcgorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gQW4gZW1wdHkgU2V0
CisgICovCisgIGNsZWFyOiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5pc0Zyb3plbikgeyB0
aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsgfQorCisgICAgdmFyIGxl
biA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gdGhp
czsgfQorCisgICAgdmFyIGd1aWQ7CisKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENo
YW5nZShsZW4sIDApOworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RP
YmplY3QnKTsKKyAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3Qn
KTsKKworICAgIGZvciAodmFyIGk9MDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBndWlkID0gZ3Vp
ZEZvcih0aGlzW2ldKTsKKyAgICAgIGRlbGV0ZSB0aGlzW2d1aWRdOworICAgICAgZGVsZXRlIHRo
aXNbaV07CiAgICAgfQogCi0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24o
aHRtbCkgewotICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKLSAgICAgIGlmIChodG1sID09PSB1
bmRlZmluZWQpIHsgcmV0dXJuIHRoaXMuaW5uZXJIVE1MOyB9CisgICAgc2V0KHRoaXMsICdsZW5n
dGgnLCAwKTsKKworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVj
dCcpOworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Cisg
ICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShsZW4sIDApOworCisgICAgcmV0dXJu
IHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgb2Jq
ZWN0IGlzIGFsc28gYW4gZW51bWVyYWJsZSB0aGF0IGNvbnRhaW5zIHRoZQorICAgIHNhbWUgb2Jq
ZWN0cyBhcyB0aGUgcmVjZWl2ZXIuCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9y
cyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSwKKyAgICAgICAgc2FtZV9jb2xvcnMgPSBuZXcg
RW1iZXIuU2V0KGNvbG9ycyk7CisKKyAgICBzYW1lX2NvbG9ycy5pc0VxdWFsKGNvbG9ycyk7ICAg
ICAgICAgICAgICAgLy8gdHJ1ZQorICAgIHNhbWVfY29sb3JzLmlzRXF1YWwoWyJwdXJwbGUiLCAi
YnJvd24iXSk7ICAvLyBmYWxzZQorICAgIGBgYAorCisgICAgQG1ldGhvZCBpc0VxdWFsCisgICAg
QHBhcmFtIHtFbWJlci5TZXR9IG9iaiB0aGUgb3RoZXIgb2JqZWN0LgorICAgIEByZXR1cm4ge0Jv
b2xlYW59CisgICovCisgIGlzRXF1YWw6IGZ1bmN0aW9uKG9iaikgeworICAgIC8vIGZhaWwgZmFz
dAorICAgIGlmICghRW1iZXIuRW51bWVyYWJsZS5kZXRlY3Qob2JqKSkgcmV0dXJuIGZhbHNlOwor
CisgICAgdmFyIGxvYyA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgaWYgKGdldChvYmosICds
ZW5ndGgnKSAhPT0gbG9jKSByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSgtLWxvYyA+PSAwKSB7
CisgICAgICBpZiAoIW9iai5jb250YWlucyh0aGlzW2xvY10pKSByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgcmV0dXJuIHRydWU7CisgIH0sCisKKyAgLyoqCisgICAgQWRkcyBhbiBvYmplY3Qg
dG8gdGhlIHNldC4gT25seSBub24tYG51bGxgIG9iamVjdHMgY2FuIGJlIGFkZGVkIHRvIGEgc2V0
CisgICAgYW5kIHRob3NlIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UuIElmIHRoZSBvYmplY3QgaXMg
YWxyZWFkeSBpbiB0aGUgc2V0IG9yCisgICAgdGhlIHBhc3NlZCB2YWx1ZSBpcyBudWxsIHRoaXMg
bWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisKKyAgICBUaGlzIGlzIGFuIGFsaWFzIGZvciBg
RW1iZXIuTXV0YWJsZUVudW1lcmFibGUuYWRkT2JqZWN0KClgLgorCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KCk7CisgICAgY29sb3JzLmFkZCgiYmx1
ZSIpOyAgICAgLy8gWyJibHVlIl0KKyAgICBjb2xvcnMuYWRkKCJibHVlIik7ICAgICAvLyBbImJs
dWUiXQorICAgIGNvbG9ycy5hZGQoInJlZCIpOyAgICAgIC8vIFsiYmx1ZSIsICJyZWQiXQorICAg
IGNvbG9ycy5hZGQobnVsbCk7ICAgICAgIC8vIFsiYmx1ZSIsICJyZWQiXQorICAgIGNvbG9ycy5h
ZGQodW5kZWZpbmVkKTsgIC8vIFsiYmx1ZSIsICJyZWQiXQorICAgIGBgYAorCisgICAgQG1ldGhv
ZCBhZGQKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gYWRkLgorICAgIEBy
ZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCisgICovCisgIGFkZDogRW1iZXIuYWxp
YXNNZXRob2QoJ2FkZE9iamVjdCcpLAorCisgIC8qKgorICAgIFJlbW92ZXMgdGhlIG9iamVjdCBm
cm9tIHRoZSBzZXQgaWYgaXQgaXMgZm91bmQuIElmIHlvdSBwYXNzIGEgYG51bGxgIHZhbHVlCisg
ICAgb3IgYW4gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBub3QgaW4gdGhlIHNldCwgdGhpcyBtZXRo
b2Qgd2lsbCBoYXZlIG5vCisgICAgZWZmZWN0LiBUaGlzIGlzIGFuIGFsaWFzIGZvciBgRW1iZXIu
TXV0YWJsZUVudW1lcmFibGUucmVtb3ZlT2JqZWN0KClgLgorCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSk7
CisgICAgY29sb3JzLnJlbW92ZSgicmVkIik7ICAgICAvLyBbImJsdWUiLCAiZ3JlZW4iXQorICAg
IGNvbG9ycy5yZW1vdmUoInB1cnBsZSIpOyAgLy8gWyJibHVlIiwgImdyZWVuIl0KKyAgICBjb2xv
cnMucmVtb3ZlKG51bGwpOyAgICAgIC8vIFsiYmx1ZSIsICJncmVlbiJdCisgICAgYGBgCisKKyAg
ICBAbWV0aG9kIHJlbW92ZQorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBy
ZW1vdmUKKyAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgorICAqLworICBy
ZW1vdmU6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZW1vdmVPYmplY3QnKSwKKworICAvKioKKyAgICBS
ZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgc2V0IGFuZCByZXR1cm5zIGl0LCBvciBg
bnVsbGAgaWYgaXQncyBlbXB0eS4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgY29sb3Jz
ID0gbmV3IEVtYmVyLlNldChbImdyZWVuIiwgImJsdWUiXSk7CisgICAgY29sb3JzLnBvcCgpOyAg
Ly8gImJsdWUiCisgICAgY29sb3JzLnBvcCgpOyAgLy8gImdyZWVuIgorICAgIGNvbG9ycy5wb3Ao
KTsgIC8vIG51bGwKKyAgICBgYGAKKworICAgIEBtZXRob2QgcG9wCisgICAgQHJldHVybiB7T2Jq
ZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3QgZnJvbSB0aGUgc2V0IG9yIG51bGwuCisgICovCisgIHBv
cDogZnVuY3Rpb24oKSB7CisgICAgaWYgKGdldCh0aGlzLCAnaXNGcm96ZW4nKSkgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7CisgICAgdmFyIG9iaiA9IHRoaXMubGVu
Z3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGgtMV0gOiBudWxsOworICAgIHRoaXMucmVtb3ZlKG9i
aik7CisgICAgcmV0dXJuIG9iajsKKyAgfSwKKworICAvKioKKyAgICBJbnNlcnRzIHRoZSBnaXZl
biBvYmplY3Qgb24gdG8gdGhlIGVuZCBvZiB0aGUgc2V0LiBJdCByZXR1cm5zCisgICAgdGhlIHNl
dCBpdHNlbGYuCisKKyAgICBUaGlzIGlzIGFuIGFsaWFzIGZvciBgRW1iZXIuTXV0YWJsZUVudW1l
cmFibGUuYWRkT2JqZWN0KClgLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMg
PSBuZXcgRW1iZXIuU2V0KCk7CisgICAgY29sb3JzLnB1c2goInJlZCIpOyAgIC8vIFsicmVkIl0K
KyAgICBjb2xvcnMucHVzaCgiZ3JlZW4iKTsgLy8gWyJyZWQiLCAiZ3JlZW4iXQorICAgIGNvbG9y
cy5wdXNoKCJibHVlIik7ICAvLyBbInJlZCIsICJncmVlbiIsICJibHVlIl0KKyAgICBgYGAKKwor
ICAgIEBtZXRob2QgcHVzaAorICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYu
CisgICovCisgIHB1c2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmplY3QnKSwKKworICAvKioK
KyAgICBSZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgc2V0IGFuZCByZXR1cm5zIGl0
LCBvciBgbnVsbGAgaWYgaXQncyBlbXB0eS4KKworICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBF
bWJlci5TZXQucG9wKClgLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBu
ZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsKKyAgICBjb2xvcnMuc2hpZnQoKTsgIC8v
ICJibHVlIgorICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gImdyZWVuIgorICAgIGNvbG9ycy5zaGlm
dCgpOyAgLy8gbnVsbAorICAgIGBgYAorCisgICAgQG1ldGhvZCBzaGlmdAorICAgIEByZXR1cm4g
e09iamVjdH0gVGhlIHJlbW92ZWQgb2JqZWN0IGZyb20gdGhlIHNldCBvciBudWxsLgorICAqLwor
ICBzaGlmdDogRW1iZXIuYWxpYXNNZXRob2QoJ3BvcCcpLAorCisgIC8qKgorICAgIEluc2VydHMg
dGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQuIEl0IHJldHVybnMKKyAg
ICB0aGUgc2V0IGl0c2VsZi4KKworICAgIFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLlNldC5w
dXNoKClgCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5T
ZXQoKTsKKyAgICBjb2xvcnMudW5zaGlmdCgicmVkIik7ICAgIC8vIFsicmVkIl0KKyAgICBjb2xv
cnMudW5zaGlmdCgiZ3JlZW4iKTsgIC8vIFsicmVkIiwgImdyZWVuIl0KKyAgICBjb2xvcnMudW5z
aGlmdCgiYmx1ZSIpOyAgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUiXQorICAgIGBgYAorCisg
ICAgQG1ldGhvZCB1bnNoaWZ0CisgICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2Vs
Zi4KKyAgKi8KKyAgdW5zaGlmdDogRW1iZXIuYWxpYXNNZXRob2QoJ3B1c2gnKSwKKworICAvKioK
KyAgICBBZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSB0byB0aGUgc2V0
LgorCisgICAgVGhpcyBpcyBhbiBhbGlhcyBvZiBgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUuYWRk
T2JqZWN0cygpYAorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBjb2xvcnMgPSBuZXcgRW1i
ZXIuU2V0KCk7CisgICAgY29sb3JzLmFkZEVhY2goWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsg
IC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUiXQorICAgIGBgYAorCisgICAgQG1ldGhvZCBhZGRF
YWNoCisgICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmplY3RzIHRv
IGFkZC4KKyAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgorICAqLworICBh
ZGRFYWNoOiBFbWJlci5hbGlhc01ldGhvZCgnYWRkT2JqZWN0cycpLAorCisgIC8qKgorICAgIFJl
bW92ZXMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxlIHRvIHRoZSBzZXQuCisK
KyAgICBUaGlzIGlzIGFuIGFsaWFzIG9mIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5yZW1vdmVP
YmplY3RzKClgCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJl
ci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKKyAgICBjb2xvcnMucmVtb3ZlRWFjaChb
InJlZCIsICJibHVlIl0pOyAgLy8gIFsiZ3JlZW4iXQorICAgIGBgYAorCisgICAgQG1ldGhvZCBy
ZW1vdmVFYWNoCisgICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmpl
Y3RzIHRvIHJlbW92ZS4KKyAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgor
ICAqLworICByZW1vdmVFYWNoOiBFbWJlci5hbGlhc01ldGhvZCgncmVtb3ZlT2JqZWN0cycpLAor
CisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KKyAgLy8gUFJJVkFURSBFTlVNRVJBQkxFIFNVUFBPUlQKKyAgLy8KKworICBpbml0
OiBmdW5jdGlvbihpdGVtcykgeworICAgIHRoaXMuX3N1cGVyKCk7CisgICAgaWYgKGl0ZW1zKSB0
aGlzLmFkZE9iamVjdHMoaXRlbXMpOworICB9LAorCisgIC8vIGltcGxlbWVudCBFbWJlci5FbnVt
ZXJhYmxlCisgIG5leHRPYmplY3Q6IGZ1bmN0aW9uKGlkeCkgeworICAgIHJldHVybiB0aGlzW2lk
eF07CisgIH0sCisKKyAgLy8gbW9yZSBvcHRpbWl6ZWQgdmVyc2lvbgorICBmaXJzdE9iamVjdDog
RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gMCA/
IHRoaXNbMF0gOiB1bmRlZmluZWQ7CisgIH0pLAorCisgIC8vIG1vcmUgb3B0aW1pemVkIHZlcnNp
b24KKyAgbGFzdE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMubGVuZ3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGgtMV0gOiB1bmRlZmluZWQ7CisgIH0p
LAorCisgIC8vIGltcGxlbWVudHMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKKyAgYWRkT2JqZWN0
OiBmdW5jdGlvbihvYmopIHsKKyAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3plbicpKSB0aHJvdyBu
ZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKKyAgICBpZiAoaXNOb25lKG9iaikp
IHJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCisKKyAgICB2YXIgZ3VpZCA9IGd1aWRGb3Io
b2JqKSwKKyAgICAgICAgaWR4ICA9IHRoaXNbZ3VpZF0sCisgICAgICAgIGxlbiAgPSBnZXQodGhp
cywgJ2xlbmd0aCcpLAorICAgICAgICBhZGRlZCA7CisKKyAgICBpZiAoaWR4Pj0wICYmIGlkeDxs
ZW4gJiYgKHRoaXNbaWR4XSA9PT0gb2JqKSkgcmV0dXJuIHRoaXM7IC8vIGFkZGVkCisKKyAgICBh
ZGRlZCA9IFtvYmpdOworCisgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2UobnVs
bCwgYWRkZWQpOworICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVj
dCcpOworCisgICAgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICB0aGlzW2d1aWRdID0g
bGVuOworICAgIHRoaXNbbGVuXSA9IG9iajsKKyAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGxlbisx
KTsKKworICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Cisg
ICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShudWxsLCBhZGRlZCk7CisKKyAgICBy
ZXR1cm4gdGhpczsKKyAgfSwKKworICAvLyBpbXBsZW1lbnRzIEVtYmVyLk11dGFibGVFbnVtZXJh
YmxlCisgIHJlbW92ZU9iamVjdDogZnVuY3Rpb24ob2JqKSB7CisgICAgaWYgKGdldCh0aGlzLCAn
aXNGcm96ZW4nKSkgdGhyb3cgbmV3IEVtYmVyLkVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7Cisg
ICAgaWYgKGlzTm9uZShvYmopKSByZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbworCisgICAg
dmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCisgICAgICAgIGlkeCAgPSB0aGlzW2d1aWRdLAorICAg
ICAgICBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpLAorICAgICAgICBpc0ZpcnN0ID0gaWR4ID09
PSAwLAorICAgICAgICBpc0xhc3QgPSBpZHggPT09IGxlbi0xLAorICAgICAgICBsYXN0LCByZW1v
dmVkOworCisKKyAgICBpZiAoaWR4Pj0wICYmIGlkeDxsZW4gJiYgKHRoaXNbaWR4XSA9PT0gb2Jq
KSkgeworICAgICAgcmVtb3ZlZCA9IFtvYmpdOworCisgICAgICB0aGlzLmVudW1lcmFibGVDb250
ZW50V2lsbENoYW5nZShyZW1vdmVkLCBudWxsKTsKKyAgICAgIGlmIChpc0ZpcnN0KSB7IEVtYmVy
LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsgfQorICAgICAgaWYgKGlz
TGFzdCkgIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7IH0K
KworICAgICAgLy8gc3dhcCBpdGVtcyAtIGJhc2ljYWxseSBtb3ZlIHRoZSBpdGVtIHRvIHRoZSBl
bmQgc28gaXQgY2FuIGJlIHJlbW92ZWQKKyAgICAgIGlmIChpZHggPCBsZW4tMSkgeworICAgICAg
ICBsYXN0ID0gdGhpc1tsZW4tMV07CisgICAgICAgIHRoaXNbaWR4XSA9IGxhc3Q7CisgICAgICAg
IHRoaXNbZ3VpZEZvcihsYXN0KV0gPSBpZHg7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSB0aGlz
W2d1aWRdOworICAgICAgZGVsZXRlIHRoaXNbbGVuLTFdOworICAgICAgc2V0KHRoaXMsICdsZW5n
dGgnLCBsZW4tMSk7CisKKyAgICAgIGlmIChpc0ZpcnN0KSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hh
bmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOyB9CisgICAgICBpZiAoaXNMYXN0KSAgeyBFbWJlci5w
cm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOyB9CisgICAgICB0aGlzLmVudW1l
cmFibGVDb250ZW50RGlkQ2hhbmdlKHJlbW92ZWQsIG51bGwpOworICAgIH0KKworICAgIHJldHVy
biB0aGlzOworICB9LAorCisgIC8vIG9wdGltaXplZCB2ZXJzaW9uCisgIGNvbnRhaW5zOiBmdW5j
dGlvbihvYmopIHsKKyAgICByZXR1cm4gdGhpc1tndWlkRm9yKG9iaildPj0wOworICB9LAorCisg
IGNvcHk6IGZ1bmN0aW9uKCkgeworICAgIHZhciBDID0gdGhpcy5jb25zdHJ1Y3RvciwgcmV0ID0g
bmV3IEMoKSwgbG9jID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICBzZXQocmV0LCAnbGVuZ3Ro
JywgbG9jKTsKKyAgICB3aGlsZSgtLWxvYz49MCkgeworICAgICAgcmV0W2xvY10gPSB0aGlzW2xv
Y107CisgICAgICByZXRbZ3VpZEZvcih0aGlzW2xvY10pXSA9IGxvYzsKKyAgICB9CisgICAgcmV0
dXJuIHJldDsKKyAgfSwKKworICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlbiA9
IHRoaXMubGVuZ3RoLCBpZHgsIGFycmF5ID0gW107CisgICAgZm9yKGlkeCA9IDA7IGlkeCA8IGxl
bjsgaWR4KyspIHsKKyAgICAgIGFycmF5W2lkeF0gPSB0aGlzW2lkeF07CisgICAgfQorICAgIHJl
dHVybiBmbXQoIkVtYmVyLlNldDwlQD4iLCBbYXJyYXkuam9pbignLCcpXSk7CisgIH0KKworfSk7
CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7Cit2YXIgRGVmZXJyZWRNaXhpbiA9IEVtYmVy
LkRlZmVycmVkTWl4aW4sIC8vIG1peGlucy9kZWZlcnJlZAorICAgIGdldCA9IEVtYmVyLmdldDsK
KwordmFyIERlZmVycmVkID0gRW1iZXIuT2JqZWN0LmV4dGVuZChEZWZlcnJlZE1peGluKTsKKwor
RGVmZXJyZWQucmVvcGVuQ2xhc3MoeworICBwcm9taXNlOiBmdW5jdGlvbihjYWxsYmFjaywgYmlu
ZGluZykgeworICAgIHZhciBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpOworICAgIGNhbGxi
YWNrLmNhbGwoYmluZGluZywgZGVmZXJyZWQpOworICAgIHJldHVybiBkZWZlcnJlZDsKKyAgfQor
fSk7CisKK0VtYmVyLkRlZmVycmVkID0gRGVmZXJyZWQ7CisKK30pKCk7CisKKworCisoZnVuY3Rp
b24oKSB7Cit2YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7CisKKy8q
KgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorKi8KKwordmFy
IGxvYWRIb29rcyA9IEVtYmVyLkVOVi5FTUJFUl9MT0FEX0hPT0tTIHx8IHt9OwordmFyIGxvYWRl
ZCA9IHt9OworCisvKioKKyAgRGV0ZWN0cyB3aGVuIGEgc3BlY2lmaWMgcGFja2FnZSBvZiBFbWJl
ciAoZS5nLiAnRW1iZXIuSGFuZGxlYmFycycpCisgIGhhcyBmdWxseSBsb2FkZWQgYW5kIGlzIGF2
YWlsYWJsZSBmb3IgZXh0ZW5zaW9uLgorCisgIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIHdpbGwg
YmUgY2FsbGVkIHdpdGggdGhlIGBuYW1lYCBwYXNzZWQKKyAgcmVzb2x2ZWQgZnJvbSBhIHN0cmlu
ZyBpbnRvIHRoZSBvYmplY3Q6CisKKyAgYGBgIGphdmFzY3JpcHQKKyAgRW1iZXIub25Mb2FkKCdF
bWJlci5IYW5kbGViYXJzJyBmdW5jdGlvbihoYmFycyl7CisgICAgaGJhcnMucmVnaXN0ZXJIZWxw
ZXIoLi4uKTsKKyAgfSk7CisgIGBgYAorCisgIEBtZXRob2Qgb25Mb2FkCisgIEBmb3IgRW1iZXIK
KyAgQHBhcmFtIG5hbWUge1N0cmluZ30gbmFtZSBvZiBob29rCisgIEBwYXJhbSBjYWxsYmFjayB7
RnVuY3Rpb259IGNhbGxiYWNrIHRvIGJlIGNhbGxlZAorKi8KK0VtYmVyLm9uTG9hZCA9IGZ1bmN0
aW9uKG5hbWUsIGNhbGxiYWNrKSB7CisgIHZhciBvYmplY3Q7CisKKyAgbG9hZEhvb2tzW25hbWVd
ID0gbG9hZEhvb2tzW25hbWVdIHx8IEVtYmVyLkEoKTsKKyAgbG9hZEhvb2tzW25hbWVdLnB1c2hP
YmplY3QoY2FsbGJhY2spOworCisgIGlmIChvYmplY3QgPSBsb2FkZWRbbmFtZV0pIHsKKyAgICBj
YWxsYmFjayhvYmplY3QpOworICB9Cit9OworCisvKioKKyAgQ2FsbGVkIHdoZW4gYW4gRW1iZXIu
anMgcGFja2FnZSAoZS5nIEVtYmVyLkhhbmRsZWJhcnMpIGhhcyBmaW5pc2hlZAorICBsb2FkaW5n
LiBUcmlnZ2VycyBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXZlbnQuCisKKyAg
QG1ldGhvZCBydW5Mb2FkSG9va3MKKyAgQGZvciBFbWJlcgorICBAcGFyYW0gbmFtZSB7U3RyaW5n
fSBuYW1lIG9mIGhvb2sKKyAgQHBhcmFtIG9iamVjdCB7T2JqZWN0fSBvYmplY3QgdG8gcGFzcyB0
byBjYWxsYmFja3MKKyovCitFbWJlci5ydW5Mb2FkSG9va3MgPSBmdW5jdGlvbihuYW1lLCBvYmpl
Y3QpIHsKKyAgbG9hZGVkW25hbWVdID0gb2JqZWN0OworCisgIGlmIChsb2FkSG9va3NbbmFtZV0p
IHsKKyAgICBmb3JFYWNoLmNhbGwobG9hZEhvb2tzW25hbWVdLCBmdW5jdGlvbihjYWxsYmFjaykg
eworICAgICAgY2FsbGJhY2sob2JqZWN0KTsKKyAgICB9KTsKKyAgfQorfTsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK3ZhciBnZXQg
PSBFbWJlci5nZXQ7CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50
aW1lCisqLworCisvKioKKyAgYEVtYmVyLkNvbnRyb2xsZXJNaXhpbmAgcHJvdmlkZXMgYSBzdGFu
ZGFyZCBpbnRlcmZhY2UgZm9yIGFsbCBjbGFzc2VzIHRoYXQKKyAgY29tcG9zZSBFbWJlcidzIGNv
bnRyb2xsZXIgbGF5ZXI6IGBFbWJlci5Db250cm9sbGVyYCwKKyAgYEVtYmVyLkFycmF5Q29udHJv
bGxlcmAsIGFuZCBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAuCisKKyAgQGNsYXNzIENvbnRyb2xs
ZXJNaXhpbgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEB1c2VzIEVtYmVyLkFjdGlvbkhhbmRsZXIK
KyovCitFbWJlci5Db250cm9sbGVyTWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuQWN0
aW9uSGFuZGxlciwgeworICAvKiBkdWNrdHlwZSBhcyBhIGNvbnRyb2xsZXIgKi8KKyAgaXNDb250
cm9sbGVyOiB0cnVlLAorCisgIC8qKgorICAgIFRoZSBvYmplY3QgdG8gd2hpY2ggYWN0aW9ucyBm
cm9tIHRoZSB2aWV3IHNob3VsZCBiZSBzZW50LgorCisgICAgRm9yIGV4YW1wbGUsIHdoZW4gYSBI
YW5kbGViYXJzIHRlbXBsYXRlIHVzZXMgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsCisgICAgaXQg
d2lsbCBhdHRlbXB0IHRvIHNlbmQgdGhlIGFjdGlvbiB0byB0aGUgdmlldydzIGNvbnRyb2xsZXIn
cyBgdGFyZ2V0YC4KKworICAgIEJ5IGRlZmF1bHQsIGEgY29udHJvbGxlcidzIGB0YXJnZXRgIGlz
IHNldCB0byB0aGUgcm91dGVyIGFmdGVyIGl0IGlzCisgICAgaW5zdGFudGlhdGVkIGJ5IGBFbWJl
ci5BcHBsaWNhdGlvbiNpbml0aWFsaXplYC4KKworICAgIEBwcm9wZXJ0eSB0YXJnZXQKKyAgICBA
ZGVmYXVsdCBudWxsCisgICovCisgIHRhcmdldDogbnVsbCwKKworICBjb250YWluZXI6IG51bGws
CisKKyAgcGFyZW50Q29udHJvbGxlcjogbnVsbCwKKworICBzdG9yZTogbnVsbCwKKworICBtb2Rl
bDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKSwKKworICBkZXByZWNhdGVkU2VuZEhh
bmRsZXM6IGZ1bmN0aW9uKGFjdGlvbk5hbWUpIHsKKyAgICByZXR1cm4gISF0aGlzW2FjdGlvbk5h
bWVdOworICB9LAorCisgIGRlcHJlY2F0ZWRTZW5kOiBmdW5jdGlvbihhY3Rpb25OYW1lKSB7Cisg
ICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisgICAgRW1iZXIuYXNz
ZXJ0KCcnICsgdGhpcyArICIgaGFzIHRoZSBhY3Rpb24gIiArIGFjdGlvbk5hbWUgKyAiIGJ1dCBp
dCBpcyBub3QgYSBmdW5jdGlvbiIsIHR5cGVvZiB0aGlzW2FjdGlvbk5hbWVdID09PSAnZnVuY3Rp
b24nKTsKKyAgICBFbWJlci5kZXByZWNhdGUoJ0FjdGlvbiBoYW5kbGVycyBpbXBsZW1lbnRlZCBk
aXJlY3RseSBvbiBjb250cm9sbGVycyBhcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhY3Rpb24g
aGFuZGxlcnMgb24gYW4gYGFjdGlvbnNgIG9iamVjdCAoJyArIGFjdGlvbk5hbWUgKyAnIG9uICcg
KyB0aGlzICsgJyknLCBmYWxzZSk7CisgICAgdGhpc1thY3Rpb25OYW1lXS5hcHBseSh0aGlzLCBh
cmdzKTsKKyAgICByZXR1cm47CisgIH0KK30pOworCisvKioKKyAgQGNsYXNzIENvbnRyb2xsZXIK
KyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyAgQHVzZXMgRW1i
ZXIuQ29udHJvbGxlck1peGluCisqLworRW1iZXIuQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoRW1iZXIuQ29udHJvbGxlck1peGluKTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigp
IHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCit2
YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZvckVhY2ggPSBFbWJlci5FbnVt
ZXJhYmxlVXRpbHMuZm9yRWFjaDsKKworLyoqCisgIGBFbWJlci5Tb3J0YWJsZU1peGluYCBwcm92
aWRlcyBhIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgYXJyYXkgcHJveGllcworICB0byBzcGVjaWZ5
IGEgc29ydCBvcmRlciBhbmQgbWFpbnRhaW4gdGhpcyBzb3J0aW5nIHdoZW4gb2JqZWN0cyBhcmUg
YWRkZWQsCisgIHJlbW92ZWQsIG9yIHVwZGF0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgaW1wbGlj
aXQgb3JkZXIgb2YgdGhlaXIgdW5kZXJseWluZworICBjb250ZW50IGFycmF5OgorCisgIGBgYGph
dmFzY3JpcHQKKyAgc29uZ3MgPSBbCisgICAge3RyYWNrTnVtYmVyOiA0LCB0aXRsZTogJ09iLUxh
LURpLCBPYi1MYS1EYSd9LAorICAgIHt0cmFja051bWJlcjogMiwgdGl0bGU6ICdCYWNrIGluIHRo
ZSBVLlMuUy5SLid9LAorICAgIHt0cmFja051bWJlcjogMywgdGl0bGU6ICdHbGFzcyBPbmlvbid9
LAorICBdOworCisgIHNvbmdzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVh
dGUoeworICAgIGNvbnRlbnQ6IHNvbmdzLAorICAgIHNvcnRQcm9wZXJ0aWVzOiBbJ3RyYWNrTnVt
YmVyJ10sCisgICAgc29ydEFzY2VuZGluZzogdHJ1ZQorICB9KTsKKworICBzb25nc0NvbnRyb2xs
ZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAgLy8ge3RyYWNrTnVtYmVyOiAyLCB0aXRsZTogJ0JhY2sg
aW4gdGhlIFUuUy5TLlIuJ30KKworICBzb25nc0NvbnRyb2xsZXIuYWRkT2JqZWN0KHt0cmFja051
bWJlcjogMSwgdGl0bGU6ICdEZWFyIFBydWRlbmNlJ30pOworICBzb25nc0NvbnRyb2xsZXIuZ2V0
KCdmaXJzdE9iamVjdCcpOyAgLy8ge3RyYWNrTnVtYmVyOiAxLCB0aXRsZTogJ0RlYXIgUHJ1ZGVu
Y2UnfQorICBgYGAKKworICBJZiB5b3UgYWRkIG9yIHJlbW92ZSB0aGUgcHJvcGVydGllcyB0byBz
b3J0IGJ5IG9yIGNoYW5nZSB0aGUgc29ydCBkaXJlY3Rpb24gdGhlIGNvbnRlbnQKKyAgc29ydCBv
cmRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4KKworICBgYGBqYXZhc2NyaXB0Cisg
IHNvbmdzQ29udHJvbGxlci5zZXQoJ3NvcnRQcm9wZXJ0aWVzJywgWyd0aXRsZSddKTsKKyAgc29u
Z3NDb250cm9sbGVyLmdldCgnZmlyc3RPYmplY3QnKTsgLy8ge3RyYWNrTnVtYmVyOiAyLCB0aXRs
ZTogJ0JhY2sgaW4gdGhlIFUuUy5TLlIuJ30KKworICBzb25nc0NvbnRyb2xsZXIudG9nZ2xlUHJv
cGVydHkoJ3NvcnRBc2NlbmRpbmcnKTsKKyAgc29uZ3NDb250cm9sbGVyLmdldCgnZmlyc3RPYmpl
Y3QnKTsgLy8ge3RyYWNrTnVtYmVyOiA0LCB0aXRsZTogJ09iLUxhLURpLCBPYi1MYS1EYSd9Cisg
IGBgYAorCisgIFNvcnRhYmxlTWl4aW4gd29ya3MgYnkgc29ydGluZyB0aGUgYXJyYW5nZWRDb250
ZW50IGFycmF5LCB3aGljaCBpcyB0aGUgYXJyYXkgdGhhdAorICBhcnJheVByb3h5IGRpc3BsYXlz
LiBEdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgdW5kZXJseWluZyAnY29udGVudCcgYXJyYXkgaXMg
bm90IGNoYW5nZWQsIHRoYXQKKyAgYXJyYXkgd2lsbCBub3QgZGlzcGxheSB0aGUgc29ydGVkIGxp
c3Q6CisKKyAgIGBgYGphdmFzY3JpcHQKKyAgc29uZ3NDb250cm9sbGVyLmdldCgnY29udGVudCcp
LmdldCgnZmlyc3RPYmplY3QnKTsgLy8gUmV0dXJucyB0aGUgdW5zb3J0ZWQgb3JpZ2luYWwgY29u
dGVudAorICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyBSZXR1cm5zIHRo
ZSBzb3J0ZWQgY29udGVudC4KKyAgYGBgIAorICAKKyAgQWx0aG91Z2ggdGhlIHNvcnRlZCBjb250
ZW50IGNhbiBhbHNvIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGFycmFuZ2VkQ29udGVudCBwcm9w
ZXJ0eSwKKyAgaXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgdGhlIHByb3hpZWQgY2xhc3MgYW5kIG5v
dCB0aGUgYXJyYW5nZWRDb250ZW50IGFycmF5IGRpcmVjdGx5LgorCisgIEBjbGFzcyBTb3J0YWJs
ZU1peGluCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFi
bGUKKyovCitFbWJlci5Tb3J0YWJsZU1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLk11
dGFibGVFbnVtZXJhYmxlLCB7CisKKyAgLyoqCisgICAgU3BlY2lmaWVzIHdoaWNoIHByb3BlcnRp
ZXMgZGljdGF0ZSB0aGUgYXJyYW5nZWRDb250ZW50J3Mgc29ydCBvcmRlci4KKworICAgIFdoZW4g
c3BlY2lmeWluZyBtdWx0aXBsZSBwcm9wZXJ0aWVzIHRoZSBzb3J0aW5nIHdpbGwgdXNlIHByb3Bl
cnRpZXMKKyAgICBmcm9tIHRoZSBgc29ydFByb3BlcnRpZXNgIGFycmF5IHByaW9yaXRpemVkIGZy
b20gZmlyc3QgdG8gbGFzdC4KKworICAgIEBwcm9wZXJ0eSB7QXJyYXl9IHNvcnRQcm9wZXJ0aWVz
CisgICovCisgIHNvcnRQcm9wZXJ0aWVzOiBudWxsLAorCisgIC8qKgorICAgIFNwZWNpZmllcyB0
aGUgYXJyYW5nZWRDb250ZW50J3Mgc29ydCBkaXJlY3Rpb24KKworICAgIEBwcm9wZXJ0eSB7Qm9v
bGVhbn0gc29ydEFzY2VuZGluZworICAqLworICBzb3J0QXNjZW5kaW5nOiB0cnVlLAorCisgIC8q
KgorICAgIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgdHdvIHZhbHVlcy4gWW91IGNhbiBv
dmVycmlkZSB0aGlzIGlmIHlvdQorICAgIHdhbnQgdG8gZG8gY3VzdG9tIGNvbXBhcmlzb25zLiBG
dW5jdGlvbnMgbXVzdCBiZSBvZiB0aGUgdHlwZSBleHBlY3RlZCBieQorICAgIEFycmF5I3NvcnQs
IGkuZS4KKyAgICAgIHJldHVybiAwIGlmIHRoZSB0d28gcGFyYW1ldGVycyBhcmUgZXF1YWwsCisg
ICAgICByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHNt
YWxsZXIgdGhhbiB0aGUgc2Vjb25kIG9yCisgICAgICByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBv
dGhlcndpc2U6CisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24oeCx5KSB7IC8vIFRo
ZXNlIGFyZSBhc3N1bWVkIHRvIGJlIGludGVnZXJzCisgICAgICBpZiAoeCA9PT0geSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4geCA8IHkgPyAtMSA6IDE7CisgICAgfQorICAgIGBg
YAorCisgICAgQHByb3BlcnR5IHNvcnRGdW5jdGlvbgorICAgIEB0eXBlIHtGdW5jdGlvbn0KKyAg
ICBAZGVmYXVsdCBFbWJlci5jb21wYXJlCisgICovCisgIHNvcnRGdW5jdGlvbjogRW1iZXIuY29t
cGFyZSwKKworICBvcmRlckJ5OiBmdW5jdGlvbihpdGVtMSwgaXRlbTIpIHsKKyAgICB2YXIgcmVz
dWx0ID0gMCwKKyAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0
aWVzJyksCisgICAgICAgIHNvcnRBc2NlbmRpbmcgPSBnZXQodGhpcywgJ3NvcnRBc2NlbmRpbmcn
KSwKKyAgICAgICAgc29ydEZ1bmN0aW9uID0gZ2V0KHRoaXMsICdzb3J0RnVuY3Rpb24nKTsKKwor
ICAgIEVtYmVyLmFzc2VydCgieW91IG5lZWQgdG8gZGVmaW5lIGBzb3J0UHJvcGVydGllc2AiLCAh
IXNvcnRQcm9wZXJ0aWVzKTsKKworICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9u
KHByb3BlcnR5TmFtZSkgeworICAgICAgaWYgKHJlc3VsdCA9PT0gMCkgeworICAgICAgICByZXN1
bHQgPSBzb3J0RnVuY3Rpb24oZ2V0KGl0ZW0xLCBwcm9wZXJ0eU5hbWUpLCBnZXQoaXRlbTIsIHBy
b3BlcnR5TmFtZSkpOworICAgICAgICBpZiAoKHJlc3VsdCAhPT0gMCkgJiYgIXNvcnRBc2NlbmRp
bmcpIHsKKyAgICAgICAgICByZXN1bHQgPSAoLTEpICogcmVzdWx0OworICAgICAgICB9CisgICAg
ICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGRlc3Ryb3k6IGZ1
bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCisgICAg
ICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGllcycpOworCisgICAg
aWYgKGNvbnRlbnQgJiYgc29ydFByb3BlcnRpZXMpIHsKKyAgICAgIGZvckVhY2goY29udGVudCwg
ZnVuY3Rpb24oaXRlbSkgeworICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlv
bihzb3J0UHJvcGVydHkpIHsKKyAgICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBz
b3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwor
ICAgICAgICB9LCB0aGlzKTsKKyAgICAgIH0sIHRoaXMpOworICAgIH0KKworICAgIHJldHVybiB0
aGlzLl9zdXBlcigpOworICB9LAorCisgIGlzU29ydGVkOiBFbWJlci5jb21wdXRlZC5ib29sKCdz
b3J0UHJvcGVydGllcycpLAorCisgIC8qKgorICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBhcnJh
bmdlZENvbnRlbnQgZnJvbSBhcnJheVByb3h5IGluIG9yZGVyIHRvIHNvcnQgYnkgc29ydEZ1bmN0
aW9uLgorICAgIEFsc28gc2V0cyB1cCBvYnNlcnZlcnMgZm9yIGVhY2ggc29ydFByb3BlcnR5IG9u
IGVhY2ggaXRlbSBpbiB0aGUgY29udGVudCBBcnJheS4KKyAgICAKKyAgICBAcHJvcGVydHkgYXJy
YW5nZWRDb250ZW50CisgICovCisKKyAgYXJyYW5nZWRDb250ZW50OiBFbWJlci5jb21wdXRlZCgn
Y29udGVudCcsICdzb3J0UHJvcGVydGllcy5AZWFjaCcsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
KyAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAorICAgICAgICBpc1NvcnRl
ZCA9IGdldCh0aGlzLCAnaXNTb3J0ZWQnKSwKKyAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQo
dGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyksCisgICAgICAgIHNlbGYgPSB0aGlzOworCisgICAgaWYg
KGNvbnRlbnQgJiYgaXNTb3J0ZWQpIHsKKyAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKCk7
CisgICAgICBjb250ZW50LnNvcnQoZnVuY3Rpb24oaXRlbTEsIGl0ZW0yKSB7CisgICAgICAgIHJl
dHVybiBzZWxmLm9yZGVyQnkoaXRlbTEsIGl0ZW0yKTsKKyAgICAgIH0pOworICAgICAgZm9yRWFj
aChjb250ZW50LCBmdW5jdGlvbihpdGVtKSB7CisgICAgICAgIGZvckVhY2goc29ydFByb3BlcnRp
ZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgeworICAgICAgICAgIEVtYmVyLmFkZE9ic2VydmVy
KGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hh
bmdlJyk7CisgICAgICAgIH0sIHRoaXMpOworICAgICAgfSwgdGhpcyk7CisgICAgICByZXR1cm4g
RW1iZXIuQShjb250ZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udGVudDsKKyAgfSksCisK
KyAgX2NvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY29udGVudCcsIGZ1
bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCisgICAg
ICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGllcycpOworCisgICAg
aWYgKGNvbnRlbnQgJiYgc29ydFByb3BlcnRpZXMpIHsKKyAgICAgIGZvckVhY2goY29udGVudCwg
ZnVuY3Rpb24oaXRlbSkgeworICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlv
bihzb3J0UHJvcGVydHkpIHsKKyAgICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBz
b3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwor
ICAgICAgICB9LCB0aGlzKTsKKyAgICAgIH0sIHRoaXMpOworICAgIH0KKworICAgIHRoaXMuX3N1
cGVyKCk7CisgIH0pLAorCisgIHNvcnRBc2NlbmRpbmdXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVP
YnNlcnZlcignc29ydEFzY2VuZGluZycsIGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX2xhc3RTb3J0
QXNjZW5kaW5nID0gZ2V0KHRoaXMsICdzb3J0QXNjZW5kaW5nJyk7CisgIH0pLAorCisgIHNvcnRB
c2NlbmRpbmdEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdzb3J0QXNjZW5kaW5nJywgZnVuY3Rp
b24oKSB7CisgICAgaWYgKGdldCh0aGlzLCAnc29ydEFzY2VuZGluZycpICE9PSB0aGlzLl9sYXN0
U29ydEFzY2VuZGluZykgeworICAgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAn
YXJyYW5nZWRDb250ZW50Jyk7CisgICAgICBhcnJhbmdlZENvbnRlbnQucmV2ZXJzZU9iamVjdHMo
KTsKKyAgICB9CisgIH0pLAorCisgIGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGFy
cmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCkgeworICAgIHZhciBpc1NvcnRlZCA9
IGdldCh0aGlzLCAnaXNTb3J0ZWQnKTsKKworICAgIGlmIChpc1NvcnRlZCkgeworICAgICAgdmFy
IGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CisgICAgICB2
YXIgcmVtb3ZlZE9iamVjdHMgPSBhcnJheS5zbGljZShpZHgsIGlkeCtyZW1vdmVkQ291bnQpOwor
ICAgICAgdmFyIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJvcGVydGllcycpOwor
CisgICAgICBmb3JFYWNoKHJlbW92ZWRPYmplY3RzLCBmdW5jdGlvbihpdGVtKSB7CisgICAgICAg
IGFycmFuZ2VkQ29udGVudC5yZW1vdmVPYmplY3QoaXRlbSk7CisKKyAgICAgICAgZm9yRWFjaChz
b3J0UHJvcGVydGllcywgZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7CisgICAgICAgICAgRW1iZXIu
cmVtb3ZlT2JzZXJ2ZXIoaXRlbSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1Tb3J0
UHJvcGVydHlEaWRDaGFuZ2UnKTsKKyAgICAgICAgfSwgdGhpcyk7CisgICAgICB9LCB0aGlzKTsK
KyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50
LCBhZGRlZENvdW50KTsKKyAgfSwKKworICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9u
KGFycmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCkgeworICAgIHZhciBpc1NvcnRl
ZCA9IGdldCh0aGlzLCAnaXNTb3J0ZWQnKSwKKyAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQo
dGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7CisKKyAgICBpZiAoaXNTb3J0ZWQpIHsKKyAgICAgIHZh
ciBhZGRlZE9iamVjdHMgPSBhcnJheS5zbGljZShpZHgsIGlkeCthZGRlZENvdW50KTsKKworICAg
ICAgZm9yRWFjaChhZGRlZE9iamVjdHMsIGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgICAgdGhpcy5p
bnNlcnRJdGVtU29ydGVkKGl0ZW0pOworCisgICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMs
IGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgeworICAgICAgICAgIEVtYmVyLmFkZE9ic2VydmVyKGl0
ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdl
Jyk7CisgICAgICAgIH0sIHRoaXMpOworICAgICAgfSwgdGhpcyk7CisgICAgfQorCisgICAgcmV0
dXJuIHRoaXMuX3N1cGVyKGFycmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Cisg
IH0sCisKKyAgaW5zZXJ0SXRlbVNvcnRlZDogZnVuY3Rpb24oaXRlbSkgeworICAgIHZhciBhcnJh
bmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOworICAgIHZhciBsZW5n
dGggPSBnZXQoYXJyYW5nZWRDb250ZW50LCAnbGVuZ3RoJyk7CisKKyAgICB2YXIgaWR4ID0gdGhp
cy5fYmluYXJ5U2VhcmNoKGl0ZW0sIDAsIGxlbmd0aCk7CisgICAgYXJyYW5nZWRDb250ZW50Lmlu
c2VydEF0KGlkeCwgaXRlbSk7CisgIH0sCisKKyAgY29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRD
aGFuZ2U6IGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRo
aXMsICdhcnJhbmdlZENvbnRlbnQnKSwKKyAgICAgICAgb2xkSW5kZXggPSBhcnJhbmdlZENvbnRl
bnQuaW5kZXhPZihpdGVtKSwKKyAgICAgICAgbGVmdEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2Jq
ZWN0QXQob2xkSW5kZXggLSAxKSwKKyAgICAgICAgcmlnaHRJdGVtID0gYXJyYW5nZWRDb250ZW50
Lm9iamVjdEF0KG9sZEluZGV4ICsgMSksCisgICAgICAgIGxlZnRSZXN1bHQgPSBsZWZ0SXRlbSAm
JiB0aGlzLm9yZGVyQnkoaXRlbSwgbGVmdEl0ZW0pLAorICAgICAgICByaWdodFJlc3VsdCA9IHJp
Z2h0SXRlbSAmJiB0aGlzLm9yZGVyQnkoaXRlbSwgcmlnaHRJdGVtKTsKKworICAgIGlmIChsZWZ0
UmVzdWx0IDwgMCB8fCByaWdodFJlc3VsdCA+IDApIHsKKyAgICAgIGFycmFuZ2VkQ29udGVudC5y
ZW1vdmVPYmplY3QoaXRlbSk7CisgICAgICB0aGlzLmluc2VydEl0ZW1Tb3J0ZWQoaXRlbSk7Cisg
ICAgfQorICB9LAorCisgIF9iaW5hcnlTZWFyY2g6IGZ1bmN0aW9uKGl0ZW0sIGxvdywgaGlnaCkg
eworICAgIHZhciBtaWQsIG1pZEl0ZW0sIHJlcywgYXJyYW5nZWRDb250ZW50OworCisgICAgaWYg
KGxvdyA9PT0gaGlnaCkgeworICAgICAgcmV0dXJuIGxvdzsKKyAgICB9CisKKyAgICBhcnJhbmdl
ZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOworCisgICAgbWlkID0gbG93
ICsgTWF0aC5mbG9vcigoaGlnaCAtIGxvdykgLyAyKTsKKyAgICBtaWRJdGVtID0gYXJyYW5nZWRD
b250ZW50Lm9iamVjdEF0KG1pZCk7CisKKyAgICByZXMgPSB0aGlzLm9yZGVyQnkobWlkSXRlbSwg
aXRlbSk7CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgcmV0dXJuIHRoaXMuX2JpbmFyeVNl
YXJjaChpdGVtLCBtaWQrMSwgaGlnaCk7CisgICAgfSBlbHNlIGlmIChyZXMgPiAwKSB7CisgICAg
ICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIGxvdywgbWlkKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gbWlkOworICB9Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8q
KgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisqLworCit2YXIgZ2V0
ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMuZm9yRWFjaCwKKyAgICByZXBsYWNlID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxh
Y2U7CisKKy8qKgorICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCBwcm92aWRlcyBhIHdheSBmb3Ig
eW91IHRvIHB1Ymxpc2ggYSBjb2xsZWN0aW9uIG9mCisgIG9iamVjdHMgc28gdGhhdCB5b3UgY2Fu
IGVhc2lseSBiaW5kIHRvIHRoZSBjb2xsZWN0aW9uIGZyb20gYSBIYW5kbGViYXJzCisgIGAjZWFj
aGAgaGVscGVyLCBhbiBgRW1iZXIuQ29sbGVjdGlvblZpZXdgLCBvciBvdGhlciBjb250cm9sbGVy
cy4KKworICBUaGUgYWR2YW50YWdlIG9mIHVzaW5nIGFuIGBBcnJheUNvbnRyb2xsZXJgIGlzIHRo
YXQgeW91IG9ubHkgaGF2ZSB0byBzZXQgdXAKKyAgeW91ciB2aWV3IGJpbmRpbmdzIG9uY2U7IHRv
IGNoYW5nZSB3aGF0J3MgZGlzcGxheWVkLCBzaW1wbHkgc3dhcCBvdXQgdGhlCisgIGBjb250ZW50
YCBwcm9wZXJ0eSBvbiB0aGUgY29udHJvbGxlci4KKworICBGb3IgZXhhbXBsZSwgaW1hZ2luZSB5
b3Ugd2FudGVkIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGl0ZW1zIGZldGNoZWQgdmlhIGFuIFhIUgor
ICByZXF1ZXN0LiBDcmVhdGUgYW4gYEVtYmVyLkFycmF5Q29udHJvbGxlcmAgYW5kIHNldCBpdHMg
YGNvbnRlbnRgIHByb3BlcnR5OgorCisgIGBgYGphdmFzY3JpcHQKKyAgTXlBcHAubGlzdENvbnRy
b2xsZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuY3JlYXRlKCk7CisKKyAgJC5nZXQoJ3Blb3Bs
ZS5qc29uJywgZnVuY3Rpb24oZGF0YSkgeworICAgIE15QXBwLmxpc3RDb250cm9sbGVyLnNldCgn
Y29udGVudCcsIGRhdGEpOworICB9KTsKKyAgYGBgCisKKyAgVGhlbiwgY3JlYXRlIGEgdmlldyB0
aGF0IGJpbmRzIHRvIHlvdXIgbmV3IGNvbnRyb2xsZXI6CisKKyAgYGBgaGFuZGxlYmFycworICB7
eyNlYWNoIE15QXBwLmxpc3RDb250cm9sbGVyfX0KKyAgICB7e2ZpcnN0TmFtZX19IHt7bGFzdE5h
bWV9fQorICB7ey9lYWNofX0KKyAgYGBgCisKKyAgQWx0aG91Z2ggeW91IGFyZSBiaW5kaW5nIHRv
IHRoZSBjb250cm9sbGVyLCB0aGUgYmVoYXZpb3Igb2YgdGhpcyBjb250cm9sbGVyCisgIGlzIHRv
IHBhc3MgdGhyb3VnaCBhbnkgbWV0aG9kcyBvciBwcm9wZXJ0aWVzIHRvIHRoZSB1bmRlcmx5aW5n
IGFycmF5LiBUaGlzCisgIGNhcGFiaWxpdHkgY29tZXMgZnJvbSBgRW1iZXIuQXJyYXlQcm94eWAs
IHdoaWNoIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbS4KKworICBTb21ldGltZXMgeW91IHdhbnQg
dG8gZGlzcGxheSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGhpbiB0aGUgYm9keSBvZiBhbgorICBg
I2VhY2hgIGhlbHBlciB0aGF0IGRlcGVuZCBvbiB0aGUgdW5kZXJseWluZyBpdGVtcyBpbiBgY29u
dGVudGAsIGJ1dCBhcmUgbm90CisgIHByZXNlbnQgb24gdGhvc2UgaXRlbXMuICAgVG8gZG8gdGhp
cywgc2V0IGBpdGVtQ29udHJvbGxlcmAgdG8gdGhlIG5hbWUgb2YgYQorICBjb250cm9sbGVyIChw
cm9iYWJseSBhbiBgT2JqZWN0Q29udHJvbGxlcmApIHRoYXQgd2lsbCB3cmFwIGVhY2ggaW5kaXZp
ZHVhbCBpdGVtLgorCisgIEZvciBleGFtcGxlOgorCisgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNl
YWNoIHBvc3QgaW4gY29udHJvbGxlcn19CisgICAgICA8bGk+e3t0aXRsZX19ICh7e3RpdGxlTGVu
Z3RofX0gY2hhcmFjdGVycyk8L2xpPgorICAgIHt7L2VhY2h9fQorICBgYGAKKworICBgYGBqYXZh
c2NyaXB0CisgIEFwcC5Qb3N0c0NvbnRyb2xsZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0
ZW5kKHsKKyAgICBpdGVtQ29udHJvbGxlcjogJ3Bvc3QnCisgIH0pOworCisgIEFwcC5Qb3N0Q29u
dHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAvLyB0aGUgYHRp
dGxlYCBwcm9wZXJ0eSB3aWxsIGJlIHByb3hpZWQgdG8gdGhlIHVuZGVybHlpbmcgcG9zdC4KKwor
ICAgIHRpdGxlTGVuZ3RoOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldCgndGl0
bGUnKS5sZW5ndGg7CisgICAgfS5wcm9wZXJ0eSgndGl0bGUnKQorICB9KTsKKyAgYGBgCisKKyAg
SW4gc29tZSBjYXNlcyBpdCBpcyBoZWxwZnVsIHRvIHJldHVybiBhIGRpZmZlcmVudCBgaXRlbUNv
bnRyb2xsZXJgIGRlcGVuZGluZworICBvbiB0aGUgcGFydGljdWxhciBpdGVtLiAgU3ViY2xhc3Nl
cyBjYW4gZG8gdGhpcyBieSBvdmVycmlkaW5nCisgIGBsb29rdXBJdGVtQ29udHJvbGxlcmAuCisK
KyAgRm9yIGV4YW1wbGU6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuTXlBcnJheUNvbnRyb2xs
ZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICBsb29rdXBJdGVtQ29udHJv
bGxlcjogZnVuY3Rpb24oIG9iamVjdCApIHsKKyAgICAgIGlmIChvYmplY3QuZ2V0KCdpc1NwZWNp
YWwnKSkgeworICAgICAgICByZXR1cm4gInNwZWNpYWwiOyAvLyB1c2UgQXBwLlNwZWNpYWxDb250
cm9sbGVyCisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gInJlZ3VsYXIiOyAvLyB1c2Ug
QXBwLlJlZ3VsYXJDb250cm9sbGVyCisgICAgICB9CisgICAgfQorICB9KTsKKyAgYGBgCisKKyAg
VGhlIGl0ZW1Db250cm9sbGVyIGluc3RhbmNlcyB3aWxsIGhhdmUgYSBgcGFyZW50Q29udHJvbGxl
cmAgcHJvcGVydHkgc2V0IHRvCisgIGVpdGhlciB0aGUgdGhlIGBwYXJlbnRDb250cm9sbGVyYCBw
cm9wZXJ0eSBvZiB0aGUgYEFycmF5Q29udHJvbGxlcmAKKyAgb3IgdG8gdGhlIGBBcnJheUNvbnRy
b2xsZXJgIGluc3RhbmNlIGl0c2VsZi4KKworICBAY2xhc3MgQXJyYXlDb250cm9sbGVyCisgIEBu
YW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuQXJyYXlQcm94eQorICBAdXNlcyBFbWJl
ci5Tb3J0YWJsZU1peGluCisgIEB1c2VzIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgorKi8KKworRW1i
ZXIuQXJyYXlDb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5leHRlbmQoRW1iZXIuQ29udHJv
bGxlck1peGluLAorICBFbWJlci5Tb3J0YWJsZU1peGluLCB7CisKKyAgLyoqCisgICAgVGhlIGNv
bnRyb2xsZXIgdXNlZCB0byB3cmFwIGl0ZW1zLCBpZiBhbnkuCisKKyAgICBAcHJvcGVydHkgaXRl
bUNvbnRyb2xsZXIKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCBudWxsCisgICovCisg
IGl0ZW1Db250cm9sbGVyOiBudWxsLAorCisgIC8qKgorICAgIFJldHVybiB0aGUgbmFtZSBvZiB0
aGUgY29udHJvbGxlciB0byB3cmFwIGl0ZW1zLCBvciBgbnVsbGAgaWYgaXRlbXMgc2hvdWxkCisg
ICAgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1w
bHkgcmV0dXJucyB0aGUKKyAgICBgaXRlbUNvbnRyb2xsZXJgIHByb3BlcnR5LCBidXQgc3ViY2xh
c3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuCisgICAgZGlmZmVyZW50IGNv
bnRyb2xsZXJzIGZvciBkaWZmZXJlbnQgb2JqZWN0cy4KKworICAgIEZvciBleGFtcGxlOgorCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5NeUFycmF5Q29udHJvbGxlciA9IEVtYmVyLkFycmF5
Q29udHJvbGxlci5leHRlbmQoeworICAgICAgbG9va3VwSXRlbUNvbnRyb2xsZXI6IGZ1bmN0aW9u
KCBvYmplY3QgKSB7CisgICAgICAgIGlmIChvYmplY3QuZ2V0KCdpc1NwZWNpYWwnKSkgeworICAg
ICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xsZXIKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gInJlZ3VsYXIiOyAvLyB1c2UgQXBwLlJl
Z3VsYXJDb250cm9sbGVyCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKwor
ICAgIEBtZXRob2QgbG9va3VwSXRlbUNvbnRyb2xsZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0CisgICAgQHJldHVybiB7U3RyaW5nfQorICAqLworICBsb29rdXBJdGVtQ29udHJvbGxlcjog
ZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIGdldCh0aGlzLCAnaXRlbUNvbnRyb2xsZXIn
KTsKKyAgfSwKKworICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgeworICAgIHZhciBs
ZW5ndGggPSBnZXQodGhpcywgJ2xlbmd0aCcpLAorICAgICAgICBhcnJhbmdlZENvbnRlbnQgPSBn
ZXQodGhpcywnYXJyYW5nZWRDb250ZW50JyksCisgICAgICAgIG9iamVjdCA9IGFycmFuZ2VkQ29u
dGVudCAmJiBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQoaWR4KTsKKworICAgIGlmIChpZHggPj0g
MCAmJiBpZHggPCBsZW5ndGgpIHsKKyAgICAgIHZhciBjb250cm9sbGVyQ2xhc3MgPSB0aGlzLmxv
b2t1cEl0ZW1Db250cm9sbGVyKG9iamVjdCk7CisgICAgICBpZiAoY29udHJvbGxlckNsYXNzKSB7
CisgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJBdChpZHgsIG9iamVjdCwgY29udHJvbGxl
ckNsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXaGVuIGBjb250cm9sbGVyQ2xhc3Ng
IGlzIGZhbHN5LCB3ZSBoYXZlIG5vdCBvcHRlZCBpbiB0byB1c2luZyBpdGVtCisgICAgLy8gY29u
dHJvbGxlcnMsIHNvIHJldHVybiB0aGUgb2JqZWN0IGRpcmVjdGx5LgorCisgICAgLy8gV2hlbiB0
aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCB3ZSB3YW50IHRvIHJldHVybiB0aGUgIm91dCBvZiBy
YW5nZSIKKyAgICAvLyB2YWx1ZSwgd2hhdGV2ZXIgdGhhdCBtaWdodCBiZS4gIFJhdGhlciB0aGFu
IG1ha2UgYXNzdW1wdGlvbnMKKyAgICAvLyAoZS5nLiBndWVzc2luZyBgbnVsbGAgb3IgYHVuZGVm
aW5lZGApIHdlIGRlZmVyIHRoaXMgdG8gYGFycmFuZ2VkQ29udGVudGAuCisgICAgcmV0dXJuIG9i
amVjdDsKKyAgfSwKKworICBhcnJhbmdlZENvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewor
ICAgIHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fcmVzZXRTdWJDb250cm9sbGVycygpOworICB9
LAorCisgIGFycmF5Q29udGVudERpZENoYW5nZTogZnVuY3Rpb24oaWR4LCByZW1vdmVkQ250LCBh
ZGRlZENudCkgeworICAgIHZhciBzdWJDb250cm9sbGVycyA9IGdldCh0aGlzLCAnX3N1YkNvbnRy
b2xsZXJzJyksCisgICAgICAgIHN1YkNvbnRyb2xsZXJzVG9SZW1vdmUgPSBzdWJDb250cm9sbGVy
cy5zbGljZShpZHgsIGlkeCtyZW1vdmVkQ250KTsKKworICAgIGZvckVhY2goc3ViQ29udHJvbGxl
cnNUb1JlbW92ZSwgZnVuY3Rpb24oc3ViQ29udHJvbGxlcikgeworICAgICAgaWYgKHN1YkNvbnRy
b2xsZXIpIHsgc3ViQ29udHJvbGxlci5kZXN0cm95KCk7IH0KKyAgICB9KTsKKworICAgIHJlcGxh
Y2Uoc3ViQ29udHJvbGxlcnMsIGlkeCwgcmVtb3ZlZENudCwgbmV3IEFycmF5KGFkZGVkQ250KSk7
CisKKyAgICAvLyBUaGUgc2hhZG93IGFycmF5IG9mIHN1YmNvbnRyb2xsZXJzIG11c3QgYmUgdXBk
YXRlZCBiZWZvcmUgd2UgdHJpZ2dlcgorICAgIC8vIG9ic2VydmVycywgb3RoZXJ3aXNlIG9ic2Vy
dmVycyB3aWxsIGdldCB0aGUgd3Jvbmcgc3ViY29udGFpbmVyIHdoZW4KKyAgICAvLyBjYWxsaW5n
IGBvYmplY3RBdGAKKyAgICB0aGlzLl9zdXBlcihpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KTsK
KyAgfSwKKworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworCisgICAg
dGhpcy5zZXQoJ19zdWJDb250cm9sbGVycycsIEVtYmVyLkEoKSk7CisgIH0sCisKKyAgY29udGVu
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBFbWJlci5BKCk7Cisg
IH0pLAorCisgIGNvbnRyb2xsZXJBdDogZnVuY3Rpb24oaWR4LCBvYmplY3QsIGNvbnRyb2xsZXJD
bGFzcykgeworICAgIHZhciBjb250YWluZXIgPSBnZXQodGhpcywgJ2NvbnRhaW5lcicpLAorICAg
ICAgICBzdWJDb250cm9sbGVycyA9IGdldCh0aGlzLCAnX3N1YkNvbnRyb2xsZXJzJyksCisgICAg
ICAgIHN1YkNvbnRyb2xsZXIgPSBzdWJDb250cm9sbGVyc1tpZHhdLAorICAgICAgICBmYWN0b3J5
LCBmdWxsTmFtZTsKKworICAgIGlmIChzdWJDb250cm9sbGVyKSB7IHJldHVybiBzdWJDb250cm9s
bGVyOyB9CisKKyAgICBmdWxsTmFtZSA9ICJjb250cm9sbGVyOiIgKyBjb250cm9sbGVyQ2xhc3M7
CisKKyAgICBpZiAoIWNvbnRhaW5lci5oYXMoZnVsbE5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcg
RW1iZXIuRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIGl0ZW1Db250cm9sbGVyOiAiJyArIGNvbnRy
b2xsZXJDbGFzcyArICciJyk7CisgICAgfQorCisgICAgc3ViQ29udHJvbGxlciA9IGNvbnRhaW5l
ci5sb29rdXBGYWN0b3J5KGZ1bGxOYW1lKS5jcmVhdGUoeworICAgICAgdGFyZ2V0OiB0aGlzLAor
ICAgICAgcGFyZW50Q29udHJvbGxlcjogZ2V0KHRoaXMsICdwYXJlbnRDb250cm9sbGVyJykgfHwg
dGhpcywKKyAgICAgIGNvbnRlbnQ6IG9iamVjdAorICAgIH0pOworCisgICAgc3ViQ29udHJvbGxl
cnNbaWR4XSA9IHN1YkNvbnRyb2xsZXI7CisKKyAgICByZXR1cm4gc3ViQ29udHJvbGxlcjsKKyAg
fSwKKworICBfc3ViQ29udHJvbGxlcnM6IG51bGwsCisKKyAgX3Jlc2V0U3ViQ29udHJvbGxlcnM6
IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdWJDb250cm9sbGVycyA9IGdldCh0aGlzLCAnX3N1YkNv
bnRyb2xsZXJzJyk7CisgICAgaWYgKHN1YkNvbnRyb2xsZXJzKSB7CisgICAgICBmb3JFYWNoKHN1
YkNvbnRyb2xsZXJzLCBmdW5jdGlvbihzdWJDb250cm9sbGVyKSB7CisgICAgICAgIGlmIChzdWJD
b250cm9sbGVyKSB7IHN1YkNvbnRyb2xsZXIuZGVzdHJveSgpOyB9CisgICAgICB9KTsKKyAgICB9
CisKKyAgICB0aGlzLnNldCgnX3N1YkNvbnRyb2xsZXJzJywgRW1iZXIuQSgpKTsKKyAgfQorfSk7
CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJt
b2R1bGUgZW1iZXItcnVudGltZQorKi8KKworLyoqCisgIGBFbWJlci5PYmplY3RDb250cm9sbGVy
YCBpcyBwYXJ0IG9mIEVtYmVyJ3MgQ29udHJvbGxlciBsYXllci4gSXQgaXMgaW50ZW5kZWQKKyAg
dG8gd3JhcCBhIHNpbmdsZSBvYmplY3QsIHByb3h5aW5nIHVuaGFuZGxlZCBhdHRlbXB0cyB0byBg
Z2V0YCBhbmQgYHNldGAgdG8gdGhlIHVuZGVybHlpbmcKKyAgY29udGVudCBvYmplY3QsIGFuZCB0
byBmb3J3YXJkIHVuaGFuZGxlZCBhY3Rpb24gYXR0ZW1wdHMgdG8gaXRzIGB0YXJnZXRgLgorCisg
IGBFbWJlci5PYmplY3RDb250cm9sbGVyYCBkZXJpdmVzIHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9t
IGl0cyBzdXBlcmNsYXNzCisgIGBFbWJlci5PYmplY3RQcm94eWAgYW5kIHRoZSBgRW1iZXIuQ29u
dHJvbGxlck1peGluYCBtaXhpbi4KKworICBAY2xhc3MgT2JqZWN0Q29udHJvbGxlcgorICBAbmFt
ZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdFByb3h5CisgIEB1c2VzIEVtYmVy
LkNvbnRyb2xsZXJNaXhpbgorKiovCitFbWJlci5PYmplY3RDb250cm9sbGVyID0gRW1iZXIuT2Jq
ZWN0UHJveHkuZXh0ZW5kKEVtYmVyLkNvbnRyb2xsZXJNaXhpbik7CisKK30pKCk7CisKKworCiso
ZnVuY3Rpb24oKSB7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0VtYmVyIFJ1
bnRpbWUKKworQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCitAcmVxdWly
ZXMgZW1iZXItbWV0YWwKKyovCisKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVs
ZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8KKwordmFyIGpRdWVyeSA9IHRoaXMu
alF1ZXJ5IHx8IChFbWJlci5pbXBvcnRzICYmIEVtYmVyLmltcG9ydHMualF1ZXJ5KTsKK2lmICgh
alF1ZXJ5ICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7CisgIGpRdWVyeSA9IHJl
cXVpcmUoJ2pxdWVyeScpOworfQorCitFbWJlci5hc3NlcnQoIkVtYmVyIFZpZXdzIHJlcXVpcmUg
alF1ZXJ5IDEuNywgMS44LCAxLjksIDEuMTAsIG9yIDIuMCIsIGpRdWVyeSAmJiAoalF1ZXJ5KCku
anF1ZXJ5Lm1hdGNoKC9eKCgxXC4oN3w4fDl8MTApKXwyLjApKFwuXGQrKT8ocHJlfHJjXGQ/KT8v
KSB8fCBFbWJlci5FTlYuRk9SQ0VfSlFVRVJZKSk7CisKKy8qKgorICBBbGlhcyBmb3IgalF1ZXJ5
CisKKyAgQG1ldGhvZCAkCisgIEBmb3IgRW1iZXIKKyovCitFbWJlci4kID0galF1ZXJ5OworCit9
KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxl
IGVtYmVyLXZpZXdzCisqLworaWYgKEVtYmVyLiQpIHsKKyAgLy8gaHR0cDovL3d3dy53aGF0d2cu
b3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvZG5kLmh0bWwjZG5kZXZl
bnRzCisgIHZhciBkcmFnRXZlbnRzID0gRW1iZXIuU3RyaW5nLncoJ2RyYWdzdGFydCBkcmFnIGRy
YWdlbnRlciBkcmFnbGVhdmUgZHJhZ292ZXIgZHJvcCBkcmFnZW5kJyk7CisKKyAgLy8gQ29waWVz
IHRoZSBgZGF0YVRyYW5zZmVyYCBwcm9wZXJ0eSBmcm9tIGEgYnJvd3NlciBldmVudCBvYmplY3Qg
b250byB0aGUKKyAgLy8galF1ZXJ5IGV2ZW50IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBldmVu
dHMKKyAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2goZHJhZ0V2ZW50cywgZnVuY3Rpb24o
ZXZlbnROYW1lKSB7CisgICAgRW1iZXIuJC5ldmVudC5maXhIb29rc1tldmVudE5hbWVdID0geyBw
cm9wczogWydkYXRhVHJhbnNmZXInXSB9OworICB9KTsKK30KKworfSkoKTsKKworCisKKyhmdW5j
dGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8K
KworLyogQkVHSU4gTUVUQU1PUlBIIEhFTFBFUlMgKi8KKworLy8gSW50ZXJuZXQgRXhwbG9yZXIg
cHJpb3IgdG8gOSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmlyc3Qg
ZWxlbWVudAorLy8gaXMgYSAiemVyby1zY29wZSIgZWxlbWVudC4gVGhpcyBwcm9ibGVtIGNhbiBi
ZSB3b3JrZWQgYXJvdW5kIGJ5IG1ha2luZworLy8gdGhlIGZpcnN0IG5vZGUgYW4gaW52aXNpYmxl
IHRleHQgbm9kZS4gV2UsIGxpa2UgTW9kZXJuaXpyLCB1c2UgJnNoeTsKKwordmFyIG5lZWRzU2h5
ID0gdGhpcy5kb2N1bWVudCAmJiAoZnVuY3Rpb24oKSB7CisgIHZhciB0ZXN0RWwgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgdGVzdEVsLmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2
PiI7CisgIHRlc3RFbC5maXJzdENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0Pjwvc2NyaXB0PiI7
CisgIHJldHVybiB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOworfSkoKTsKKwor
Ly8gSUUgOCAoYW5kIGxpa2VseSBlYXJsaWVyKSBsaWtlcyB0byBtb3ZlIHdoaXRlc3BhY2UgcHJl
Y2VlZGluZworLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0
aGF0IHdlIGNhbgorLy8gYWNjaWRlbnRhbGx5IHJlbW92ZSB3aGl0ZXNwYWNlIHdoZW4gdXBkYXRp
bmcgYSBtb3JwaC4KK3ZhciBtb3Zlc1doaXRlc3BhY2UgPSB0aGlzLmRvY3VtZW50ICYmIChmdW5j
dGlvbigpIHsKKyAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwor
ICB0ZXN0RWwuaW5uZXJIVE1MID0gIlRlc3Q6IDxzY3JpcHQgdHlwZT0ndGV4dC94LXBsYWNlaG9s
ZGVyJz48L3NjcmlwdD5WYWx1ZSI7CisgIHJldHVybiB0ZXN0RWwuY2hpbGROb2Rlc1swXS5ub2Rl
VmFsdWUgPT09ICdUZXN0OicgJiYKKyAgICAgICAgICB0ZXN0RWwuY2hpbGROb2Rlc1syXS5ub2Rl
VmFsdWUgPT09ICcgVmFsdWUnOworfSkoKTsKKworLy8gVXNlIHRoaXMgdG8gZmluZCBjaGlsZHJl
biBieSBJRCBpbnN0ZWFkIG9mIHVzaW5nIGpRdWVyeQordmFyIGZpbmRDaGlsZEJ5SWQgPSBmdW5j
dGlvbihlbGVtZW50LCBpZCkgeworICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJykgPT09
IGlkKSB7IHJldHVybiBlbGVtZW50OyB9CisKKyAgdmFyIGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rl
cy5sZW5ndGgsIGlkeCwgbm9kZSwgZm91bmQ7CisgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsr
KSB7CisgICAgbm9kZSA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpZHhdOworICAgIGZvdW5kID0gbm9k
ZS5ub2RlVHlwZSA9PT0gMSAmJiBmaW5kQ2hpbGRCeUlkKG5vZGUsIGlkKTsKKyAgICBpZiAoZm91
bmQpIHsgcmV0dXJuIGZvdW5kOyB9CisgIH0KK307CisKK3ZhciBzZXRJbm5lckhUTUxXaXRob3V0
Rml4ID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgeworICBpZiAobmVlZHNTaHkpIHsKKyAgICBo
dG1sID0gJyZzaHk7JyArIGh0bWw7CisgIH0KKworICB2YXIgbWF0Y2hlcyA9IFtdOworICBpZiAo
bW92ZXNXaGl0ZXNwYWNlKSB7CisgICAgLy8gUmlnaHQgbm93IHdlIG9ubHkgY2hlY2sgZm9yIHNj
cmlwdCB0YWdzIHdpdGggaWRzIHdpdGggdGhlCisgICAgLy8gZ29hbCBvZiB0YXJnZXRpbmcgbW9y
cGhzLgorICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyhccyspKDxzY3JpcHQgaWQ9JyhbXiddKykn
KS9nLCBmdW5jdGlvbihtYXRjaCwgc3BhY2VzLCB0YWcsIGlkKSB7CisgICAgICBtYXRjaGVzLnB1
c2goW2lkLCBzcGFjZXNdKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfSk7CisgIH0KKworICBl
bGVtZW50LmlubmVySFRNTCA9IGh0bWw7CisKKyAgLy8gSWYgd2UgaGF2ZSB0byBkbyBhbnkgd2hp
dGVzcGFjZSBhZGp1c3RtZW50cyBkbyB0aGVtIG5vdworICBpZiAobWF0Y2hlcy5sZW5ndGggPiAw
KSB7CisgICAgdmFyIGxlbiA9IG1hdGNoZXMubGVuZ3RoLCBpZHg7CisgICAgZm9yIChpZHg9MDsg
aWR4PGxlbjsgaWR4KyspIHsKKyAgICAgIHZhciBzY3JpcHQgPSBmaW5kQ2hpbGRCeUlkKGVsZW1l
bnQsIG1hdGNoZXNbaWR4XVswXSksCisgICAgICAgICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRl
eHROb2RlKG1hdGNoZXNbaWR4XVsxXSk7CisgICAgICBzY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRC
ZWZvcmUobm9kZSwgc2NyaXB0KTsKKyAgICB9CisgIH0KKworICBpZiAobmVlZHNTaHkpIHsKKyAg
ICB2YXIgc2h5RWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZDsKKyAgICB3aGlsZSAoc2h5RWxl
bWVudC5ub2RlVHlwZSA9PT0gMSAmJiAhc2h5RWxlbWVudC5ub2RlTmFtZSkgeworICAgICAgc2h5
RWxlbWVudCA9IHNoeUVsZW1lbnQuZmlyc3RDaGlsZDsKKyAgICB9CisgICAgaWYgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDMgJiYgc2h5RWxlbWVudC5ub2RlVmFsdWUuY2hhckF0KDApID09PSAi
XHUwMEFEIikgeworICAgICAgc2h5RWxlbWVudC5ub2RlVmFsdWUgPSBzaHlFbGVtZW50Lm5vZGVW
YWx1ZS5zbGljZSgxKTsKKyAgICB9CisgIH0KK307CisKKy8qIEVORCBNRVRBTU9SUEggSEVMUEVS
UyAqLworCisKK3ZhciBpbm5lckhUTUxUYWdzID0ge307Cit2YXIgY2FuU2V0SW5uZXJIVE1MID0g
ZnVuY3Rpb24odGFnTmFtZSkgeworICBpZiAoaW5uZXJIVE1MVGFnc1t0YWdOYW1lXSAhPT0gdW5k
ZWZpbmVkKSB7CisgICAgcmV0dXJuIGlubmVySFRNTFRhZ3NbdGFnTmFtZV07CisgIH0KKworICB2
YXIgY2FuU2V0ID0gdHJ1ZTsKKworICAvLyBJRSA4IGFuZCBlYXJsaWVyIGRvbid0IGFsbG93IHVz
IHRvIGRvIGlubmVySFRNTCBvbiBzZWxlY3QKKyAgaWYgKHRhZ05hbWUudG9Mb3dlckNhc2UoKSA9
PT0gJ3NlbGVjdCcpIHsKKyAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxl
Y3QnKTsKKyAgICBzZXRJbm5lckhUTUxXaXRob3V0Rml4KGVsLCAnPG9wdGlvbiB2YWx1ZT0idGVz
dCI+VGVzdDwvb3B0aW9uPicpOworICAgIGNhblNldCA9IGVsLm9wdGlvbnMubGVuZ3RoID09PSAx
OworICB9CisKKyAgaW5uZXJIVE1MVGFnc1t0YWdOYW1lXSA9IGNhblNldDsKKworICByZXR1cm4g
Y2FuU2V0OworfTsKKwordmFyIHNldElubmVySFRNTCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwp
IHsKKyAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7CisKKyAgaWYgKGNhblNldElubmVy
SFRNTCh0YWdOYW1lKSkgeworICAgIHNldElubmVySFRNTFdpdGhvdXRGaXgoZWxlbWVudCwgaHRt
bCk7CisgIH0gZWxzZSB7CisgICAgLy8gRmlyZWZveCB2ZXJzaW9ucyA8IDExIGRvIG5vdCBoYXZl
IHN1cHBvcnQgZm9yIGVsZW1lbnQub3V0ZXJIVE1MLgorICAgIHZhciBvdXRlckhUTUwgPSBlbGVt
ZW50Lm91dGVySFRNTCB8fCBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGVs
ZW1lbnQpOworICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IGlubmVySFRNTCBvbiAiK2VsZW1l
bnQudGFnTmFtZSsiIGluIHRoaXMgYnJvd3NlciIsIG91dGVySFRNTCk7CisKKyAgICB2YXIgc3Rh
cnRUYWcgPSBvdXRlckhUTUwubWF0Y2gobmV3IFJlZ0V4cCgiPCIrdGFnTmFtZSsiKFtePl0qKT4i
LCAnaScpKVswXSwKKyAgICAgICAgZW5kVGFnID0gJzwvJyt0YWdOYW1lKyc+JzsKKworICAgIHZh
ciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgc2V0SW5uZXJI
VE1MV2l0aG91dEZpeCh3cmFwcGVyLCBzdGFydFRhZyArIGh0bWwgKyBlbmRUYWcpOworICAgIGVs
ZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKGVsZW1lbnQudGFnTmFtZSAh
PT0gdGFnTmFtZSkgeworICAgICAgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7CisgICAg
fQorICB9CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9OworCitmdW5jdGlvbiBpc1NpbXBsZUNsaWNr
KGV2ZW50KSB7CisgIHZhciBtb2RpZmllciA9IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFL
ZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXksCisgICAgICBzZWNvbmRhcnlDbGlj
ayA9IGV2ZW50LndoaWNoID4gMTsgLy8gSUU5IG1heSByZXR1cm4gdW5kZWZpbmVkCisKKyAgcmV0
dXJuICFtb2RpZmllciAmJiAhc2Vjb25kYXJ5Q2xpY2s7Cit9CisKK0VtYmVyLlZpZXdVdGlscyA9
IHsKKyAgc2V0SW5uZXJIVE1MOiBzZXRJbm5lckhUTUwsCisgIGlzU2ltcGxlQ2xpY2s6IGlzU2lt
cGxlQ2xpY2sKK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUg
ZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldDsKKwordmFyIENsYXNzU2V0ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMu
c2VlbiA9IHt9OworICB0aGlzLmxpc3QgPSBbXTsKK307CisKK0NsYXNzU2V0LnByb3RvdHlwZSA9
IHsKKyAgYWRkOiBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICBpZiAoc3RyaW5nIGluIHRoaXMuc2Vl
bikgeyByZXR1cm47IH0KKyAgICB0aGlzLnNlZW5bc3RyaW5nXSA9IHRydWU7CisKKyAgICB0aGlz
Lmxpc3QucHVzaChzdHJpbmcpOworICB9LAorCisgIHRvRE9NOiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gdGhpcy5saXN0LmpvaW4oIiAiKTsKKyAgfQorfTsKKwordmFyIEJBRF9UQUdfTkFNRV9U
RVNUX1JFR0VYUCA9IC9bXmEtekEtWjAtOVwtXS87Cit2YXIgQkFEX1RBR19OQU1FX1JFUExBQ0Vf
UkVHRVhQID0gL1teYS16QS1aMC05XC1dL2c7CisKK2Z1bmN0aW9uIHN0cmlwVGFnTmFtZSh0YWdO
YW1lKSB7CisgIGlmICghdGFnTmFtZSkgeworICAgIHJldHVybiB0YWdOYW1lOworICB9CisKKyAg
aWYgKCFCQURfVEFHX05BTUVfVEVTVF9SRUdFWFAudGVzdCh0YWdOYW1lKSkgeworICAgIHJldHVy
biB0YWdOYW1lOworICB9CisKKyAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZShCQURfVEFHX05BTUVf
UkVQTEFDRV9SRUdFWFAsICcnKTsKK30KKwordmFyIEJBRF9DSEFSU19SRUdFWFAgPSAvJig/IVx3
KzspfFs8PiInYF0vZzsKK3ZhciBQT1NTSUJMRV9DSEFSU19SRUdFWFAgPSAvWyY8PiInYF0vOwor
CitmdW5jdGlvbiBlc2NhcGVBdHRyaWJ1dGUodmFsdWUpIHsKKyAgLy8gU3RvbGVuIHNoYW1lbGVz
c2x5IGZyb20gSGFuZGxlYmFycworCisgIHZhciBlc2NhcGUgPSB7CisgICAgIjwiOiAiJmx0OyIs
CisgICAgIj4iOiAiJmd0OyIsCisgICAgJyInOiAiJnF1b3Q7IiwKKyAgICAiJyI6ICImI3gyNzsi
LAorICAgICJgIjogIiYjeDYwOyIKKyAgfTsKKworICB2YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9u
KGNocikgeworICAgIHJldHVybiBlc2NhcGVbY2hyXSB8fCAiJmFtcDsiOworICB9OworCisgIHZh
ciBzdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpOworCisgIGlmKCFQT1NTSUJMRV9DSEFSU19SRUdF
WFAudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH0KKyAgcmV0dXJuIHN0cmluZy5yZXBs
YWNlKEJBRF9DSEFSU19SRUdFWFAsIGVzY2FwZUNoYXIpOworfQorCisvLyBJRSA2LzcgaGF2ZSBi
dWdzIGFyb25kIHNldHRpbmcgbmFtZXMgb24gaW5wdXRzIGR1cmluZyBjcmVhdGlvbi4KKy8vIEZy
b20gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL21zNTM2Mzg5KHY9
dnMuODUpLmFzcHg6CisvLyAiVG8gaW5jbHVkZSB0aGUgTkFNRSBhdHRyaWJ1dGUgYXQgcnVuIHRp
bWUgb24gb2JqZWN0cyBjcmVhdGVkIHdpdGggdGhlIGNyZWF0ZUVsZW1lbnQgbWV0aG9kLCB1c2Ug
dGhlIGVUYWcuIgordmFyIGNhblNldE5hbWVPbklucHV0cyA9IChmdW5jdGlvbigpIHsKKyAgdmFy
IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLAorICAgICAgZWwgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworCisgIGVsLnNldEF0dHJpYnV0ZSgnbmFtZScsICdm
b28nKTsKKyAgZGl2LmFwcGVuZENoaWxkKGVsKTsKKworICByZXR1cm4gISFkaXYuaW5uZXJIVE1M
Lm1hdGNoKCdmb28nKTsKK30pKCk7CisKKy8qKgorICBgRW1iZXIuUmVuZGVyQnVmZmVyYCBnYXRo
ZXJzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgYSB2aWV3IGFuZCBnZW5lcmF0ZXMgdGhlCisg
IGZpbmFsIHJlcHJlc2VudGF0aW9uLiBgRW1iZXIuUmVuZGVyQnVmZmVyYCB3aWxsIGdlbmVyYXRl
IEhUTUwgd2hpY2ggY2FuIGJlIHB1c2hlZAorICB0byB0aGUgRE9NLgorCisgICBgYGBqYXZhc2Ny
aXB0CisgICB2YXIgYnVmZmVyID0gRW1iZXIuUmVuZGVyQnVmZmVyKCdkaXYnKTsKKyAgYGBgCisK
KyAgQGNsYXNzIFJlbmRlckJ1ZmZlcgorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBjb25zdHJ1Y3Rv
cgorICBAcGFyYW0ge1N0cmluZ30gdGFnTmFtZSB0YWcgbmFtZSAoc3VjaCBhcyAnZGl2JyBvciAn
cCcpIHVzZWQgZm9yIHRoZSBidWZmZXIKKyovCitFbWJlci5SZW5kZXJCdWZmZXIgPSBmdW5jdGlv
bih0YWdOYW1lKSB7CisgIHJldHVybiBuZXcgRW1iZXIuX1JlbmRlckJ1ZmZlcih0YWdOYW1lKTsK
K307CisKK0VtYmVyLl9SZW5kZXJCdWZmZXIgPSBmdW5jdGlvbih0YWdOYW1lKSB7CisgIHRoaXMu
dGFnTmFtZXMgPSBbdGFnTmFtZSB8fCBudWxsXTsKKyAgdGhpcy5idWZmZXIgPSAiIjsKK307CisK
K0VtYmVyLl9SZW5kZXJCdWZmZXIucHJvdG90eXBlID0geworCisgIC8vIFRoZSByb290IHZpZXcn
cyBlbGVtZW50CisgIF9lbGVtZW50OiBudWxsLAorCisgIF9oYXNFbGVtZW50OiB0cnVlLAorCisg
IC8qKgorICAgIEFuIGludGVybmFsIHNldCB1c2VkIHRvIGRlLWR1cGUgY2xhc3MgbmFtZXMgd2hl
biBgYWRkQ2xhc3MoKWAgaXMKKyAgICB1c2VkLiBBZnRlciBlYWNoIGNhbGwgdG8gYGFkZENsYXNz
KClgLCB0aGUgYGNsYXNzZXNgIHByb3BlcnR5CisgICAgd2lsbCBiZSB1cGRhdGVkLgorCisgICAg
QHByaXZhdGUKKyAgICBAcHJvcGVydHkgZWxlbWVudENsYXNzZXMKKyAgICBAdHlwZSBBcnJheQor
ICAgIEBkZWZhdWx0IFtdCisgICovCisgIGVsZW1lbnRDbGFzc2VzOiBudWxsLAorCisgIC8qKgor
ICAgIEFycmF5IG9mIGNsYXNzIG5hbWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBpbiB0aGUgY2xh
c3MgYXR0cmlidXRlLgorCisgICAgWW91IGNhbiB1c2UgYHNldENsYXNzZXMoKWAgdG8gc2V0IHRo
aXMgcHJvcGVydHkgZGlyZWN0bHkuIElmIHlvdQorICAgIHVzZSBgYWRkQ2xhc3MoKWAsIGl0IHdp
bGwgYmUgbWFpbnRhaW5lZCBmb3IgeW91LgorCisgICAgQHByb3BlcnR5IGNsYXNzZXMKKyAgICBA
dHlwZSBBcnJheQorICAgIEBkZWZhdWx0IFtdCisgICovCisgIGNsYXNzZXM6IG51bGwsCisKKyAg
LyoqCisgICAgVGhlIGlkIGluIG9mIHRoZSBlbGVtZW50LCB0byBiZSBhcHBsaWVkIGluIHRoZSBp
ZCBhdHRyaWJ1dGUuCisKKyAgICBZb3Ugc2hvdWxkIG5vdCBzZXQgdGhpcyBwcm9wZXJ0eSB5b3Vy
c2VsZiwgcmF0aGVyLCB5b3Ugc2hvdWxkIHVzZQorICAgIHRoZSBgaWQoKWAgbWV0aG9kIG9mIGBF
bWJlci5SZW5kZXJCdWZmZXJgLgorCisgICAgQHByb3BlcnR5IGVsZW1lbnRJZAorICAgIEB0eXBl
IFN0cmluZworICAgIEBkZWZhdWx0IG51bGwKKyAgKi8KKyAgZWxlbWVudElkOiBudWxsLAorCisg
IC8qKgorICAgIEEgaGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFuZCB3
aG9zZSB2YWx1ZSB3aWxsIGJlCisgICAgYXBwbGllZCB0byB0aGF0IGF0dHJpYnV0ZS4gRm9yIGV4
YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYXBwbHkgYQorICAgIGBkYXRhLXZpZXc9IkZvby5iYXIi
YCBwcm9wZXJ0eSB0byBhbiBlbGVtZW50LCB5b3Ugd291bGQgc2V0IHRoZQorICAgIGVsZW1lbnRB
dHRyaWJ1dGVzIGhhc2ggdG8gYHsnZGF0YS12aWV3JzonRm9vLmJhcid9YC4KKworICAgIFlvdSBz
aG91bGQgbm90IG1haW50YWluIHRoaXMgaGFzaCB5b3Vyc2VsZiwgcmF0aGVyLCB5b3Ugc2hvdWxk
IHVzZQorICAgIHRoZSBgYXR0cigpYCBtZXRob2Qgb2YgYEVtYmVyLlJlbmRlckJ1ZmZlcmAuCisK
KyAgICBAcHJvcGVydHkgZWxlbWVudEF0dHJpYnV0ZXMKKyAgICBAdHlwZSBIYXNoCisgICAgQGRl
ZmF1bHQge30KKyAgKi8KKyAgZWxlbWVudEF0dHJpYnV0ZXM6IG51bGwsCisKKyAgLyoqCisgICAg
QSBoYXNoIGtleWVkIG9uIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB3aG9zZSB2YWx1
ZSB3aWxsIGJlCisgICAgYXBwbGllZCB0byB0aGF0IHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgaWYg
eW91IHdhbnRlZCB0byBhcHBseSBhCisgICAgYGNoZWNrZWQ9dHJ1ZWAgcHJvcGVydHkgdG8gYW4g
ZWxlbWVudCwgeW91IHdvdWxkIHNldCB0aGUKKyAgICBlbGVtZW50UHJvcGVydGllcyBoYXNoIHRv
IGB7J2NoZWNrZWQnOnRydWV9YC4KKworICAgIFlvdSBzaG91bGQgbm90IG1haW50YWluIHRoaXMg
aGFzaCB5b3Vyc2VsZiwgcmF0aGVyLCB5b3Ugc2hvdWxkIHVzZQorICAgIHRoZSBgcHJvcCgpYCBt
ZXRob2Qgb2YgYEVtYmVyLlJlbmRlckJ1ZmZlcmAuCisKKyAgICBAcHJvcGVydHkgZWxlbWVudFBy
b3BlcnRpZXMKKyAgICBAdHlwZSBIYXNoCisgICAgQGRlZmF1bHQge30KKyAgKi8KKyAgZWxlbWVu
dFByb3BlcnRpZXM6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIHRhZ25hbWUgb2YgdGhlIGVsZW1l
bnQgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlJlbmRlckJ1ZmZlcmAgcmVwcmVzZW50cy4KKworICAg
IFVzdWFsbHksIHRoaXMgZ2V0cyBzZXQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBgRW1iZXIu
UmVuZGVyQnVmZmVyYC4gRm9yCisgICAgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBjcmVhdGUg
YSBgcGAgdGFnLCB0aGVuIHlvdSB3b3VsZCBjYWxsCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
RW1iZXIuUmVuZGVyQnVmZmVyKCdwJykKKyAgICBgYGAKKworICAgIEBwcm9wZXJ0eSBlbGVtZW50
VGFnCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBlbGVtZW50
VGFnOiBudWxsLAorCisgIC8qKgorICAgIEEgaGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUg
c3R5bGUgYXR0cmlidXRlIGFuZCB3aG9zZSB2YWx1ZSB3aWxsCisgICAgYmUgYXBwbGllZCB0byB0
aGF0IGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYXBwbHkgYQorICAg
IGBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2Agc3R5bGUgdG8gYW4gZWxlbWVudCwgeW91IHdvdWxk
IHNldCB0aGUKKyAgICBlbGVtZW50U3R5bGUgaGFzaCB0byBgeydiYWNrZ3JvdW5kLWNvbG9yJzon
YmxhY2snfWAuCisKKyAgICBZb3Ugc2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91cnNl
bGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKKyAgICB0aGUgYHN0eWxlKClgIG1ldGhvZCBvZiBg
RW1iZXIuUmVuZGVyQnVmZmVyYC4KKworICAgIEBwcm9wZXJ0eSBlbGVtZW50U3R5bGUKKyAgICBA
dHlwZSBIYXNoCisgICAgQGRlZmF1bHQge30KKyAgKi8KKyAgZWxlbWVudFN0eWxlOiBudWxsLAor
CisgIC8qKgorICAgIE5lc3RlZCBgUmVuZGVyQnVmZmVyc2Agd2lsbCBzZXQgdGhpcyB0byB0aGVp
ciBwYXJlbnQgYFJlbmRlckJ1ZmZlcmAKKyAgICBpbnN0YW5jZS4KKworICAgIEBwcm9wZXJ0eSBw
YXJlbnRCdWZmZXIKKyAgICBAdHlwZSBFbWJlci5fUmVuZGVyQnVmZmVyCisgICovCisgIHBhcmVu
dEJ1ZmZlcjogbnVsbCwKKworICAvKioKKyAgICBBZGRzIGEgc3RyaW5nIG9mIEhUTUwgdG8gdGhl
IGBSZW5kZXJCdWZmZXJgLgorCisgICAgQG1ldGhvZCBwdXNoCisgICAgQHBhcmFtIHtTdHJpbmd9
IHN0cmluZyBIVE1MIHRvIHB1c2ggaW50byB0aGUgYnVmZmVyCisgICAgQGNoYWluYWJsZQorICAq
LworICBwdXNoOiBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICB0aGlzLmJ1ZmZlciArPSBzdHJpbmc7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgQWRkcyBhIGNsYXNzIHRvIHRo
ZSBidWZmZXIsIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGNsYXNzIGF0dHJpYnV0ZS4K
KworICAgIEBtZXRob2QgYWRkQ2xhc3MKKyAgICBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lIENs
YXNzIG5hbWUgdG8gYWRkIHRvIHRoZSBidWZmZXIKKyAgICBAY2hhaW5hYmxlCisgICovCisgIGFk
ZENsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpIHsKKyAgICAvLyBsYXppbHkgY3JlYXRlIGVsZW1l
bnRDbGFzc2VzCisgICAgdGhpcy5lbGVtZW50Q2xhc3NlcyA9ICh0aGlzLmVsZW1lbnRDbGFzc2Vz
IHx8IG5ldyBDbGFzc1NldCgpKTsKKyAgICB0aGlzLmVsZW1lbnRDbGFzc2VzLmFkZChjbGFzc05h
bWUpOworICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuZWxlbWVudENsYXNzZXMubGlzdDsKKworICAg
IHJldHVybiB0aGlzOworICB9LAorCisgIHNldENsYXNzZXM6IGZ1bmN0aW9uKGNsYXNzTmFtZXMp
IHsKKyAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc05hbWVzOworICB9LAorCisgIC8qKgorICAgIFNl
dHMgdGhlIGVsZW1lbnRJRCB0byBiZSB1c2VkIGZvciB0aGUgZWxlbWVudC4KKworICAgIEBtZXRo
b2QgaWQKKyAgICBAcGFyYW0ge1N0cmluZ30gaWQKKyAgICBAY2hhaW5hYmxlCisgICovCisgIGlk
OiBmdW5jdGlvbihpZCkgeworICAgIHRoaXMuZWxlbWVudElkID0gaWQ7CisgICAgcmV0dXJuIHRo
aXM7CisgIH0sCisKKyAgLy8gZHVjayB0eXBlIGF0dHJpYnV0ZSBmdW5jdGlvbmFsaXR5IGxpa2Ug
alF1ZXJ5IHNvIGEgcmVuZGVyIGJ1ZmZlcgorICAvLyBjYW4gYmUgdXNlZCBsaWtlIGEgalF1ZXJ5
IG9iamVjdCBpbiBhdHRyaWJ1dGUgYmluZGluZyBzY2VuYXJpb3MuCisKKyAgLyoqCisgICAgQWRk
cyBhbiBhdHRyaWJ1dGUgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KKwor
ICAgIEBtZXRob2QgYXR0cgorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRo
ZSBhdHRyaWJ1dGUKKyAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0
byB0aGUgYXR0cmlidXRlCisgICAgQGNoYWluYWJsZQorICAgIEByZXR1cm4ge0VtYmVyLlJlbmRl
ckJ1ZmZlcnxTdHJpbmd9IHRoaXMgb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlCisgICov
CisgIGF0dHI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CisgICAgdmFyIGF0dHJpYnV0ZXMgPSB0
aGlzLmVsZW1lbnRBdHRyaWJ1dGVzID0gKHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgfHwge30pOwor
CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKKyAgICAgIHJldHVybiBhdHRyaWJ1
dGVzW25hbWVdOworICAgIH0gZWxzZSB7CisgICAgICBhdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7
CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgUmVtb3ZlIGFu
IGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gcmVuZGVyLgorCisgICAg
QG1ldGhvZCByZW1vdmVBdHRyCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2Yg
dGhlIGF0dHJpYnV0ZQorICAgIEBjaGFpbmFibGUKKyAgKi8KKyAgcmVtb3ZlQXR0cjogZnVuY3Rp
b24obmFtZSkgeworICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlczsK
KyAgICBpZiAoYXR0cmlidXRlcykgeyBkZWxldGUgYXR0cmlidXRlc1tuYW1lXTsgfQorCisgICAg
cmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgQWRkcyBhbiBwcm9wZXJ0eSB3aGljaCB3
aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBlbGVtZW50LgorCisgICAgQG1ldGhvZCBwcm9wCisgICAg
QHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgQHBhcmFt
IHtTdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHByb3BlcnR5CisgICAgQGNo
YWluYWJsZQorICAgIEByZXR1cm4ge0VtYmVyLlJlbmRlckJ1ZmZlcnxTdHJpbmd9IHRoaXMgb3Ig
dGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUKKyAgKi8KKyAgcHJvcDogZnVuY3Rpb24obmFtZSwg
dmFsdWUpIHsKKyAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSAo
dGhpcy5lbGVtZW50UHJvcGVydGllcyB8fCB7fSk7CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0
aCA9PT0gMSkgeworICAgICAgcmV0dXJuIHByb3BlcnRpZXNbbmFtZV07CisgICAgfSBlbHNlIHsK
KyAgICAgIHByb3BlcnRpZXNbbmFtZV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhp
czsKKyAgfSwKKworICAvKioKKyAgICBSZW1vdmUgYW4gcHJvcGVydHkgZnJvbSB0aGUgbGlzdCBv
ZiBwcm9wZXJ0aWVzIHRvIHJlbmRlci4KKworICAgIEBtZXRob2QgcmVtb3ZlUHJvcAorICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgIEBjaGFpbmFi
bGUKKyAgKi8KKyAgcmVtb3ZlUHJvcDogZnVuY3Rpb24obmFtZSkgeworICAgIHZhciBwcm9wZXJ0
aWVzID0gdGhpcy5lbGVtZW50UHJvcGVydGllczsKKyAgICBpZiAocHJvcGVydGllcykgeyBkZWxl
dGUgcHJvcGVydGllc1tuYW1lXTsgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoq
CisgICAgQWRkcyBhIHN0eWxlIHRvIHRoZSBzdHlsZSBhdHRyaWJ1dGUgd2hpY2ggd2lsbCBiZSBy
ZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KKworICAgIEBtZXRob2Qgc3R5bGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBzdHlsZQorICAgIEBwYXJhbSB7U3RyaW5nfSB2YWx1
ZQorICAgIEBjaGFpbmFibGUKKyAgKi8KKyAgc3R5bGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7
CisgICAgdGhpcy5lbGVtZW50U3R5bGUgPSAodGhpcy5lbGVtZW50U3R5bGUgfHwge30pOworCisg
ICAgdGhpcy5lbGVtZW50U3R5bGVbbmFtZV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gdGhpczsKKyAg
fSwKKworICBiZWdpbjogZnVuY3Rpb24odGFnTmFtZSkgeworICAgIHRoaXMudGFnTmFtZXMucHVz
aCh0YWdOYW1lIHx8IG51bGwpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIHB1c2hPcGVu
aW5nVGFnOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGFnTmFtZSA9IHRoaXMuY3VycmVudFRhZ05h
bWUoKTsKKyAgICBpZiAoIXRhZ05hbWUpIHsgcmV0dXJuOyB9CisKKyAgICBpZiAodGhpcy5faGFz
RWxlbWVudCAmJiAhdGhpcy5fZWxlbWVudCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHsK
KyAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLmdlbmVyYXRlRWxlbWVudCgpOworICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKKyAgICAgICAgaWQg
PSB0aGlzLmVsZW1lbnRJZCwKKyAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKKyAgICAg
ICAgYXR0cnMgPSB0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAorICAgICAgICBwcm9wcyA9IHRoaXMu
ZWxlbWVudFByb3BlcnRpZXMsCisgICAgICAgIHN0eWxlID0gdGhpcy5lbGVtZW50U3R5bGUsCisg
ICAgICAgIGF0dHIsIHByb3A7CisKKyAgICBidWZmZXIgKz0gJzwnICsgc3RyaXBUYWdOYW1lKHRh
Z05hbWUpOworCisgICAgaWYgKGlkKSB7CisgICAgICBidWZmZXIgKz0gJyBpZD0iJyArIGVzY2Fw
ZUF0dHJpYnV0ZShpZCkgKyAnIic7CisgICAgICB0aGlzLmVsZW1lbnRJZCA9IG51bGw7CisgICAg
fQorICAgIGlmIChjbGFzc2VzKSB7CisgICAgICBidWZmZXIgKz0gJyBjbGFzcz0iJyArIGVzY2Fw
ZUF0dHJpYnV0ZShjbGFzc2VzLmpvaW4oJyAnKSkgKyAnIic7CisgICAgICB0aGlzLmNsYXNzZXMg
PSBudWxsOworICAgIH0KKworICAgIGlmIChzdHlsZSkgeworICAgICAgYnVmZmVyICs9ICcgc3R5
bGU9Iic7CisKKyAgICAgIGZvciAocHJvcCBpbiBzdHlsZSkgeworICAgICAgICBpZiAoc3R5bGUu
aGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgICAgICBidWZmZXIgKz0gcHJvcCArICc6JyAr
IGVzY2FwZUF0dHJpYnV0ZShzdHlsZVtwcm9wXSkgKyAnOyc7CisgICAgICAgIH0KKyAgICAgIH0K
KworICAgICAgYnVmZmVyICs9ICciJzsKKworICAgICAgdGhpcy5lbGVtZW50U3R5bGUgPSBudWxs
OworICAgIH0KKworICAgIGlmIChhdHRycykgeworICAgICAgZm9yIChhdHRyIGluIGF0dHJzKSB7
CisgICAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkgeworICAgICAgICAgIGJ1
ZmZlciArPSAnICcgKyBhdHRyICsgJz0iJyArIGVzY2FwZUF0dHJpYnV0ZShhdHRyc1thdHRyXSkg
KyAnIic7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5lbGVtZW50QXR0cmlidXRl
cyA9IG51bGw7CisgICAgfQorCisgICAgaWYgKHByb3BzKSB7CisgICAgICBmb3IgKHByb3AgaW4g
cHJvcHMpIHsKKyAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAg
ICAgICAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcF07CisgICAgICAgICAgaWYgKHZhbHVlIHx8IHR5
cGVvZih2YWx1ZSkgPT09ICdudW1iZXInKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRy
dWUpIHsKKyAgICAgICAgICAgICAgYnVmZmVyICs9ICcgJyArIHByb3AgKyAnPSInICsgcHJvcCAr
ICciJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJ1ZmZlciArPSAnICcg
KyBwcm9wICsgJz0iJyArIGVzY2FwZUF0dHJpYnV0ZShwcm9wc1twcm9wXSkgKyAnIic7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoaXMu
ZWxlbWVudFByb3BlcnRpZXMgPSBudWxsOworICAgIH0KKworICAgIGJ1ZmZlciArPSAnPic7Cisg
ICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgIH0sCisKKyAgcHVzaENsb3NpbmdUYWc6IGZ1bmN0
aW9uKCkgeworICAgIHZhciB0YWdOYW1lID0gdGhpcy50YWdOYW1lcy5wb3AoKTsKKyAgICBpZiAo
dGFnTmFtZSkgeyB0aGlzLmJ1ZmZlciArPSAnPC8nICsgc3RyaXBUYWdOYW1lKHRhZ05hbWUpICsg
Jz4nOyB9CisgIH0sCisKKyAgY3VycmVudFRhZ05hbWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLnRhZ05hbWVzW3RoaXMudGFnTmFtZXMubGVuZ3RoLTFdOworICB9LAorCisgIGdlbmVy
YXRlRWxlbWVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWVz
LnBvcCgpLCAvLyBwb3Agc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBjbG9zZQorICAgICAgICBpZCA9
IHRoaXMuZWxlbWVudElkLAorICAgICAgICBjbGFzc2VzID0gdGhpcy5jbGFzc2VzLAorICAgICAg
ICBhdHRycyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMsCisgICAgICAgIHByb3BzID0gdGhpcy5l
bGVtZW50UHJvcGVydGllcywKKyAgICAgICAgc3R5bGUgPSB0aGlzLmVsZW1lbnRTdHlsZSwKKyAg
ICAgICAgc3R5bGVCdWZmZXIgPSAnJywgYXR0ciwgcHJvcCwgdGFnU3RyaW5nOworCisgICAgaWYg
KGF0dHJzICYmIGF0dHJzLm5hbWUgJiYgIWNhblNldE5hbWVPbklucHV0cykgeworICAgICAgLy8g
SUUgYWxsb3dzIHBhc3NpbmcgYSB0YWcgdG8gY3JlYXRlRWxlbWVudC4gU2VlIG5vdGUgb24gYGNh
blNldE5hbWVPbklucHV0c2AgYWJvdmUgYXMgd2VsbC4KKyAgICAgIHRhZ1N0cmluZyA9ICc8Jytz
dHJpcFRhZ05hbWUodGFnTmFtZSkrJyBuYW1lPSInK2VzY2FwZUF0dHJpYnV0ZShhdHRycy5uYW1l
KSsnIj4nOworICAgIH0gZWxzZSB7CisgICAgICB0YWdTdHJpbmcgPSB0YWdOYW1lOworICAgIH0K
KworICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdTdHJpbmcpLAor
ICAgICAgICAkZWxlbWVudCA9IEVtYmVyLiQoZWxlbWVudCk7CisKKyAgICBpZiAoaWQpIHsKKyAg
ICAgICRlbGVtZW50LmF0dHIoJ2lkJywgaWQpOworICAgICAgdGhpcy5lbGVtZW50SWQgPSBudWxs
OworICAgIH0KKyAgICBpZiAoY2xhc3NlcykgeworICAgICAgJGVsZW1lbnQuYXR0cignY2xhc3Mn
LCBjbGFzc2VzLmpvaW4oJyAnKSk7CisgICAgICB0aGlzLmNsYXNzZXMgPSBudWxsOworICAgIH0K
KworICAgIGlmIChzdHlsZSkgeworICAgICAgZm9yIChwcm9wIGluIHN0eWxlKSB7CisgICAgICAg
IGlmIChzdHlsZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICAgIHN0eWxlQnVmZmVy
ICs9IChwcm9wICsgJzonICsgc3R5bGVbcHJvcF0gKyAnOycpOworICAgICAgICB9CisgICAgICB9
CisKKyAgICAgICRlbGVtZW50LmF0dHIoJ3N0eWxlJywgc3R5bGVCdWZmZXIpOworCisgICAgICB0
aGlzLmVsZW1lbnRTdHlsZSA9IG51bGw7CisgICAgfQorCisgICAgaWYgKGF0dHJzKSB7CisgICAg
ICBmb3IgKGF0dHIgaW4gYXR0cnMpIHsKKyAgICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5
KGF0dHIpKSB7CisgICAgICAgICAgJGVsZW1lbnQuYXR0cihhdHRyLCBhdHRyc1thdHRyXSk7Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhpcy5lbGVtZW50QXR0cmlidXRlcyA9IG51bGw7
CisgICAgfQorCisgICAgaWYgKHByb3BzKSB7CisgICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHsK
KyAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICAgICAgJGVs
ZW1lbnQucHJvcChwcm9wLCBwcm9wc1twcm9wXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAg
ICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG51bGw7CisgICAgfQorCisgICAgcmV0dXJuIGVs
ZW1lbnQ7CisgIH0sCisKKyAgLyoqCisgICAgQG1ldGhvZCBlbGVtZW50CisgICAgQHJldHVybiB7
RE9NRWxlbWVudH0gVGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIEhU
TUwKKyAgICAgIG9mIHRoaXMgYnVmZmVyCisgICovCisgIGVsZW1lbnQ6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciBodG1sID0gdGhpcy5pbm5lclN0cmluZygpOworCisgICAgaWYgKGh0bWwpIHsKKyAg
ICAgIHRoaXMuX2VsZW1lbnQgPSBFbWJlci5WaWV3VXRpbHMuc2V0SW5uZXJIVE1MKHRoaXMuX2Vs
ZW1lbnQsIGh0bWwpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9lbGVtZW50OworICB9LAor
CisgIC8qKgorICAgIEdlbmVyYXRlcyB0aGUgSFRNTCBjb250ZW50IGZvciB0aGlzIGJ1ZmZlci4K
KworICAgIEBtZXRob2Qgc3RyaW5nCisgICAgQHJldHVybiB7U3RyaW5nfSBUaGUgZ2VuZXJhdGVk
IEhUTUwKKyAgKi8KKyAgc3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5faGFzRWxl
bWVudCAmJiB0aGlzLl9lbGVtZW50KSB7CisgICAgICAvLyBGaXJlZm94IHZlcnNpb25zIDwgMTEg
ZG8gbm90IGhhdmUgc3VwcG9ydCBmb3IgZWxlbWVudC5vdXRlckhUTUwuCisgICAgICB2YXIgdGhp
c0VsZW1lbnQgPSB0aGlzLmVsZW1lbnQoKSwgb3V0ZXJIVE1MID0gdGhpc0VsZW1lbnQub3V0ZXJI
VE1MOworICAgICAgaWYgKHR5cGVvZiBvdXRlckhUTUwgPT09ICd1bmRlZmluZWQnKSB7CisgICAg
ICAgIHJldHVybiBFbWJlci4kKCc8ZGl2Lz4nKS5hcHBlbmQodGhpc0VsZW1lbnQpLmh0bWwoKTsK
KyAgICAgIH0KKyAgICAgIHJldHVybiBvdXRlckhUTUw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJl
dHVybiB0aGlzLmlubmVyU3RyaW5nKCk7CisgICAgfQorICB9LAorCisgIGlubmVyU3RyaW5nOiBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5idWZmZXI7CisgIH0KK307CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0g
RW1iZXIuU3RyaW5nLmZtdDsKKworLyoqCisgIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGhhbmRs
ZXMgZGVsZWdhdGluZyBicm93c2VyIGV2ZW50cyB0byB0aGVpcgorICBjb3JyZXNwb25kaW5nIGBF
bWJlci5WaWV3cy5gIEZvciBleGFtcGxlLCB3aGVuIHlvdSBjbGljayBvbiBhIHZpZXcsCisgIGBF
bWJlci5FdmVudERpc3BhdGNoZXJgIGVuc3VyZXMgdGhhdCB0aGF0IHZpZXcncyBgbW91c2VEb3du
YCBtZXRob2QgZ2V0cworICBjYWxsZWQuCisKKyAgQGNsYXNzIEV2ZW50RGlzcGF0Y2hlcgorICBA
bmFtZXNwYWNlIEVtYmVyCisgIEBwcml2YXRlCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorKi8K
K0VtYmVyLkV2ZW50RGlzcGF0Y2hlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworCisgIC8qKgor
ICAgIFRoZSBzZXQgb2YgZXZlbnRzIG5hbWVzIChhbmQgYXNzb2NpYXRlZCBoYW5kbGVyIGZ1bmN0
aW9uIG5hbWVzKSB0byBiZSBzZXR1cAorICAgIGFuZCBkaXNwYXRjaGVkIGJ5IHRoZSBgRXZlbnRE
aXNwYXRjaGVyYC4gQ3VzdG9tIGV2ZW50cyBjYW4gYWRkZWQgdG8gdGhpcyBsaXN0IGF0IHNldHVw
CisgICAgdGltZSwgZ2VuZXJhbGx5IHZpYSB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uLmN1c3RvbUV2
ZW50c2AgaGFzaC4gT25seSBvdmVycmlkZSB0aGlzCisgICAgZGVmYXVsdCBzZXQgdG8gcHJldmVu
dCB0aGUgRXZlbnREaXNwYXRjaGVyIGZyb20gbGlzdGVuaW5nIG9uIHNvbWUgZXZlbnRzIGFsbCB0
b2dldGhlci4KKworICAgIFRoaXMgc2V0IHdpbGwgYmUgbW9kaWZpZWQgYnkgYHNldHVwYCB0byBh
bHNvIGluY2x1ZGUgYW55IGV2ZW50cyBhZGRlZCBhdCB0aGF0IHRpbWUuCisKKyAgICBAcHJvcGVy
dHkgZXZlbnRzCisgICAgQHR5cGUgT2JqZWN0CisgICovCisgIGV2ZW50czogeworICAgIHRvdWNo
c3RhcnQgIDogJ3RvdWNoU3RhcnQnLAorICAgIHRvdWNobW92ZSAgIDogJ3RvdWNoTW92ZScsCisg
ICAgdG91Y2hlbmQgICAgOiAndG91Y2hFbmQnLAorICAgIHRvdWNoY2FuY2VsIDogJ3RvdWNoQ2Fu
Y2VsJywKKyAgICBrZXlkb3duICAgICA6ICdrZXlEb3duJywKKyAgICBrZXl1cCAgICAgICA6ICdr
ZXlVcCcsCisgICAga2V5cHJlc3MgICAgOiAna2V5UHJlc3MnLAorICAgIG1vdXNlZG93biAgIDog
J21vdXNlRG93bicsCisgICAgbW91c2V1cCAgICAgOiAnbW91c2VVcCcsCisgICAgY29udGV4dG1l
bnUgOiAnY29udGV4dE1lbnUnLAorICAgIGNsaWNrICAgICAgIDogJ2NsaWNrJywKKyAgICBkYmxj
bGljayAgICA6ICdkb3VibGVDbGljaycsCisgICAgbW91c2Vtb3ZlICAgOiAnbW91c2VNb3ZlJywK
KyAgICBmb2N1c2luICAgICA6ICdmb2N1c0luJywKKyAgICBmb2N1c291dCAgICA6ICdmb2N1c091
dCcsCisgICAgbW91c2VlbnRlciAgOiAnbW91c2VFbnRlcicsCisgICAgbW91c2VsZWF2ZSAgOiAn
bW91c2VMZWF2ZScsCisgICAgc3VibWl0ICAgICAgOiAnc3VibWl0JywKKyAgICBpbnB1dCAgICAg
ICA6ICdpbnB1dCcsCisgICAgY2hhbmdlICAgICAgOiAnY2hhbmdlJywKKyAgICBkcmFnc3RhcnQg
ICA6ICdkcmFnU3RhcnQnLAorICAgIGRyYWcgICAgICAgIDogJ2RyYWcnLAorICAgIGRyYWdlbnRl
ciAgIDogJ2RyYWdFbnRlcicsCisgICAgZHJhZ2xlYXZlICAgOiAnZHJhZ0xlYXZlJywKKyAgICBk
cmFnb3ZlciAgICA6ICdkcmFnT3ZlcicsCisgICAgZHJvcCAgICAgICAgOiAnZHJvcCcsCisgICAg
ZHJhZ2VuZCAgICAgOiAnZHJhZ0VuZCcKKyAgfSwKKworICAvKioKKyAgICBUaGUgcm9vdCBET00g
ZWxlbWVudCB0byB3aGljaCBldmVudCBsaXN0ZW5lcnMgc2hvdWxkIGJlIGF0dGFjaGVkLiBFdmVu
dAorICAgIGxpc3RlbmVycyB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudCB1bmxlc3Mg
dGhpcyBpcyBvdmVycmlkZGVuLgorCisgICAgQ2FuIGJlIHNwZWNpZmllZCBhcyBhIERPTUVsZW1l
bnQgb3IgYSBzZWxlY3RvciBzdHJpbmcuCisKKyAgICBUaGUgZGVmYXVsdCBib2R5IGlzIGEgc3Ry
aW5nIHNpbmNlIHRoaXMgbWF5IGJlIGV2YWx1YXRlZCBiZWZvcmUgZG9jdW1lbnQuYm9keQorICAg
IGV4aXN0cyBpbiB0aGUgRE9NLgorCisgICAgQHByaXZhdGUKKyAgICBAcHJvcGVydHkgcm9vdEVs
ZW1lbnQKKyAgICBAdHlwZSBET01FbGVtZW50CisgICAgQGRlZmF1bHQgJ2JvZHknCisgICovCisg
IHJvb3RFbGVtZW50OiAnYm9keScsCisKKyAgLyoqCisgICAgU2V0cyB1cCBldmVudCBsaXN0ZW5l
cnMgZm9yIHN0YW5kYXJkIGJyb3dzZXIgZXZlbnRzLgorCisgICAgVGhpcyB3aWxsIGJlIGNhbGxl
ZCBhZnRlciB0aGUgYnJvd3NlciBzZW5kcyBhIGBET01Db250ZW50UmVhZHlgIGV2ZW50LiBCeQor
ICAgIGRlZmF1bHQsIGl0IHdpbGwgc2V0IHVwIGFsbCBvZiB0aGUgbGlzdGVuZXJzIG9uIHRoZSBk
b2N1bWVudCBib2R5LiBJZiB5b3UKKyAgICB3b3VsZCBsaWtlIHRvIHJlZ2lzdGVyIHRoZSBsaXN0
ZW5lcnMgb24gYSBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoZSBldmVudAorICAgIGRpc3BhdGNo
ZXIncyBgcm9vdGAgcHJvcGVydHkuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2Qgc2V0dXAK
KyAgICBAcGFyYW0gYWRkZWRFdmVudHMge0hhc2h9CisgICovCisgIHNldHVwOiBmdW5jdGlvbihh
ZGRlZEV2ZW50cywgcm9vdEVsZW1lbnQpIHsKKyAgICB2YXIgZXZlbnQsIGV2ZW50cyA9IGdldCh0
aGlzLCAnZXZlbnRzJyk7CisKKyAgICBFbWJlci4kLmV4dGVuZChldmVudHMsIGFkZGVkRXZlbnRz
IHx8IHt9KTsKKworCisgICAgaWYgKCFFbWJlci5pc05vbmUocm9vdEVsZW1lbnQpKSB7CisgICAg
ICBzZXQodGhpcywgJ3Jvb3RFbGVtZW50Jywgcm9vdEVsZW1lbnQpOworICAgIH0KKworICAgIHJv
b3RFbGVtZW50ID0gRW1iZXIuJChnZXQodGhpcywgJ3Jvb3RFbGVtZW50JykpOworCisgICAgRW1i
ZXIuYXNzZXJ0KGZtdCgnWW91IGNhbm5vdCB1c2UgdGhlIHNhbWUgcm9vdCBlbGVtZW50ICglQCkg
bXVsdGlwbGUgdGltZXMgaW4gYW4gRW1iZXIuQXBwbGljYXRpb24nLCBbcm9vdEVsZW1lbnQuc2Vs
ZWN0b3IgfHwgcm9vdEVsZW1lbnRbMF0udGFnTmFtZV0pLCAhcm9vdEVsZW1lbnQuaXMoJy5lbWJl
ci1hcHBsaWNhdGlvbicpKTsKKyAgICBFbWJlci5hc3NlcnQoJ1lvdSBjYW5ub3QgbWFrZSBhIG5l
dyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlzIGEgZGVzY2Vu
ZGVudCBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxlbWVudC5jbG9z
ZXN0KCcuZW1iZXItYXBwbGljYXRpb24nKS5sZW5ndGgpOworICAgIEVtYmVyLmFzc2VydCgnWW91
IGNhbm5vdCBtYWtlIGEgbmV3IEVtYmVyLkFwcGxpY2F0aW9uIHVzaW5nIGEgcm9vdCBlbGVtZW50
IHRoYXQgaXMgYW4gYW5jZXN0b3Igb2YgYW4gZXhpc3RpbmcgRW1iZXIuQXBwbGljYXRpb24nLCAh
cm9vdEVsZW1lbnQuZmluZCgnLmVtYmVyLWFwcGxpY2F0aW9uJykubGVuZ3RoKTsKKworICAgIHJv
b3RFbGVtZW50LmFkZENsYXNzKCdlbWJlci1hcHBsaWNhdGlvbicpOworCisgICAgRW1iZXIuYXNz
ZXJ0KCdVbmFibGUgdG8gYWRkICJlbWJlci1hcHBsaWNhdGlvbiIgY2xhc3MgdG8gcm9vdEVsZW1l
bnQuIE1ha2Ugc3VyZSB5b3Ugc2V0IHJvb3RFbGVtZW50IHRvIHRoZSBib2R5IG9yIGFuIGVsZW1l
bnQgaW4gdGhlIGJvZHkuJywgcm9vdEVsZW1lbnQuaXMoJy5lbWJlci1hcHBsaWNhdGlvbicpKTsK
KworICAgIGZvciAoZXZlbnQgaW4gZXZlbnRzKSB7CisgICAgICBpZiAoZXZlbnRzLmhhc093blBy
b3BlcnR5KGV2ZW50KSkgeworICAgICAgICB0aGlzLnNldHVwSGFuZGxlcihyb290RWxlbWVudCwg
ZXZlbnQsIGV2ZW50c1tldmVudF0pOworICAgICAgfQorICAgIH0KKyAgfSwKKworICAvKioKKyAg
ICBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGRvY3VtZW50LiBJZiB0aGUgZ2l2
ZW4gZXZlbnQgaXMKKyAgICB0cmlnZ2VyZWQsIHRoZSBwcm92aWRlZCBldmVudCBoYW5kbGVyIHdp
bGwgYmUgdHJpZ2dlcmVkIG9uIHRoZSB0YXJnZXQgdmlldy4KKworICAgIElmIHRoZSB0YXJnZXQg
dmlldyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGV2ZW50IGhhbmRsZXIsIG9yIGlmIHRoZSBoYW5k
bGVyCisgICAgcmV0dXJucyBgZmFsc2VgLCB0aGUgcGFyZW50IHZpZXcgd2lsbCBiZSBjYWxsZWQu
IFRoZSBldmVudCB3aWxsIGNvbnRpbnVlIHRvCisgICAgYnViYmxlIHRvIGVhY2ggc3VjY2Vzc2l2
ZSBwYXJlbnQgdmlldyB1bnRpbCBpdCByZWFjaGVzIHRoZSB0b3AuCisKKyAgICBGb3IgZXhhbXBs
ZSwgdG8gaGF2ZSB0aGUgYG1vdXNlRG93bmAgbWV0aG9kIGNhbGxlZCBvbiB0aGUgdGFyZ2V0IHZp
ZXcgd2hlbgorICAgIGEgYG1vdXNlZG93bmAgZXZlbnQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYnJv
d3NlciwgZG8gdGhlIGZvbGxvd2luZzoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBzZXR1cEhh
bmRsZXIoJ21vdXNlZG93bicsICdtb3VzZURvd24nKTsKKyAgICBgYGAKKworICAgIEBwcml2YXRl
CisgICAgQG1ldGhvZCBzZXR1cEhhbmRsZXIKKyAgICBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbGVt
ZW50CisgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50IHRoZSBicm93c2VyLW9yaWdpbmF0ZWQgZXZl
bnQgdG8gbGlzdGVuIHRvCisgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBv
ZiB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHZpZXcKKyAgKi8KKyAgc2V0dXBIYW5kbGVyOiBm
dW5jdGlvbihyb290RWxlbWVudCwgZXZlbnQsIGV2ZW50TmFtZSkgeworICAgIHZhciBzZWxmID0g
dGhpczsKKworICAgIHJvb3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJlcicsICcuZW1iZXItdmll
dycsIGZ1bmN0aW9uKGV2dCwgdHJpZ2dlcmluZ01hbmFnZXIpIHsKKyAgICAgIHJldHVybiBFbWJl
ci5oYW5kbGVFcnJvcnMoZnVuY3Rpb24gaGFuZGxlVmlld0V2ZW50KCkgeworICAgICAgICB2YXIg
dmlldyA9IEVtYmVyLlZpZXcudmlld3NbdGhpcy5pZF0sCisgICAgICAgICAgICByZXN1bHQgPSB0
cnVlLCBtYW5hZ2VyID0gbnVsbDsKKworICAgICAgICBtYW5hZ2VyID0gc2VsZi5fZmluZE5lYXJl
c3RFdmVudE1hbmFnZXIodmlldyxldmVudE5hbWUpOworCisgICAgICAgIGlmIChtYW5hZ2VyICYm
IG1hbmFnZXIgIT09IHRyaWdnZXJpbmdNYW5hZ2VyKSB7CisgICAgICAgICAgcmVzdWx0ID0gc2Vs
Zi5fZGlzcGF0Y2hFdmVudChtYW5hZ2VyLCBldnQsIGV2ZW50TmFtZSwgdmlldyk7CisgICAgICAg
IH0gZWxzZSBpZiAodmlldykgeworICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2J1YmJsZUV2ZW50
KHZpZXcsZXZ0LGV2ZW50TmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXZ0LnN0
b3BQcm9wYWdhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICAgIH0sIHRoaXMpOworICAgIH0pOworCisgICAgcm9vdEVsZW1lbnQub24oZXZlbnQgKyAnLmVt
YmVyJywgJ1tkYXRhLWVtYmVyLWFjdGlvbl0nLCBmdW5jdGlvbihldnQpIHsKKyAgICAgIHJldHVy
biBFbWJlci5oYW5kbGVFcnJvcnMoZnVuY3Rpb24gaGFuZGxlQWN0aW9uRXZlbnQoKSB7CisgICAg
ICAgIHZhciBhY3Rpb25JZCA9IEVtYmVyLiQoZXZ0LmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEt
ZW1iZXItYWN0aW9uJyksCisgICAgICAgICAgICBhY3Rpb24gICA9IEVtYmVyLkhhbmRsZWJhcnMu
QWN0aW9uSGVscGVyLnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklkXTsKKworICAgICAgICAvLyBX
ZSBoYXZlIHRvIGNoZWNrIGZvciBhY3Rpb24gaGVyZSBzaW5jZSBpbiBzb21lIGNhc2VzLCBqUXVl
cnkgd2lsbCB0cmlnZ2VyCisgICAgICAgIC8vIGFuIGV2ZW50IG9uIGByZW1vdmVDaGlsZGAgKGku
ZS4gZm9jdXNvdXQpIGFmdGVyIHdlJ3ZlIGFscmVhZHkgdG9ybiBkb3duIHRoZQorICAgICAgICAv
LyBhY3Rpb24gaGFuZGxlcnMgZm9yIHRoZSB2aWV3LgorICAgICAgICBpZiAoYWN0aW9uICYmIGFj
dGlvbi5ldmVudE5hbWUgPT09IGV2ZW50TmFtZSkgeworICAgICAgICAgIHJldHVybiBhY3Rpb24u
aGFuZGxlcihldnQpOworICAgICAgICB9CisgICAgICB9LCB0aGlzKTsKKyAgICB9KTsKKyAgfSwK
KworICBfZmluZE5lYXJlc3RFdmVudE1hbmFnZXI6IGZ1bmN0aW9uKHZpZXcsIGV2ZW50TmFtZSkg
eworICAgIHZhciBtYW5hZ2VyID0gbnVsbDsKKworICAgIHdoaWxlICh2aWV3KSB7CisgICAgICBt
YW5hZ2VyID0gZ2V0KHZpZXcsICdldmVudE1hbmFnZXInKTsKKyAgICAgIGlmIChtYW5hZ2VyICYm
IG1hbmFnZXJbZXZlbnROYW1lXSkgeyBicmVhazsgfQorCisgICAgICB2aWV3ID0gZ2V0KHZpZXcs
ICdwYXJlbnRWaWV3Jyk7CisgICAgfQorCisgICAgcmV0dXJuIG1hbmFnZXI7CisgIH0sCisKKyAg
X2Rpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uKG9iamVjdCwgZXZ0LCBldmVudE5hbWUsIHZpZXcpIHsK
KyAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKworICAgIHZhciBoYW5kbGVyID0gb2JqZWN0W2V2ZW50
TmFtZV07CisgICAgaWYgKEVtYmVyLnR5cGVPZihoYW5kbGVyKSA9PT0gJ2Z1bmN0aW9uJykgewor
ICAgICAgcmVzdWx0ID0gRW1iZXIucnVuKGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gaGFu
ZGxlci5jYWxsKG9iamVjdCwgZXZ0LCB2aWV3KTsKKyAgICAgIH0pOworICAgICAgLy8gRG8gbm90
IHByZXZlbnREZWZhdWx0IGluIGV2ZW50TWFuYWdlcnMuCisgICAgICBldnQuc3RvcFByb3BhZ2F0
aW9uKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzdWx0ID0gdGhpcy5fYnViYmxlRXZl
bnQodmlldywgZXZ0LCBldmVudE5hbWUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cisg
IH0sCisKKyAgX2J1YmJsZUV2ZW50OiBmdW5jdGlvbih2aWV3LCBldnQsIGV2ZW50TmFtZSkgewor
ICAgIHJldHVybiBFbWJlci5ydW4oZnVuY3Rpb24gYnViYmxlRXZlbnQoKSB7CisgICAgICByZXR1
cm4gdmlldy5oYW5kbGVFdmVudChldmVudE5hbWUsIGV2dCk7CisgICAgfSk7CisgIH0sCisKKyAg
ZGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0KHRoaXMsICdy
b290RWxlbWVudCcpOworICAgIEVtYmVyLiQocm9vdEVsZW1lbnQpLm9mZignLmVtYmVyJywgJyoq
JykucmVtb3ZlQ2xhc3MoJ2VtYmVyLWFwcGxpY2F0aW9uJyk7CisgICAgcmV0dXJuIHRoaXMuX3N1
cGVyKCk7CisgIH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9k
dWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCisvLyBBZGQgYSBuZXcgbmFt
ZWQgcXVldWUgZm9yIHJlbmRlcmluZyB2aWV3cyB0aGF0IGhhcHBlbnMKKy8vIGFmdGVyIGJpbmRp
bmdzIGhhdmUgc3luY2VkLCBhbmQgYSBxdWV1ZSBmb3Igc2NoZWR1bGluZyBhY3Rpb25zCisvLyB0
aGF0IHRoYXQgc2hvdWxkIG9jY3VyIGFmdGVyIHZpZXcgcmVuZGVyaW5nLgordmFyIHF1ZXVlcyA9
IEVtYmVyLnJ1bi5xdWV1ZXMsCisgICAgaW5kZXhPZiA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmlu
ZGV4T2Y7CitxdWV1ZXMuc3BsaWNlKGluZGV4T2YuY2FsbChxdWV1ZXMsICdhY3Rpb25zJykrMSwg
MCwgJ3JlbmRlcicsICdhZnRlclJlbmRlcicpOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkg
eworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCit2YXIg
Z2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKKy8vIE9yaWdpbmFsIGNsYXNzIGRl
Y2xhcmF0aW9uIGFuZCBkb2N1bWVudGF0aW9uIGluIHJ1bnRpbWUvbGliL2NvbnRyb2xsZXJzL2Nv
bnRyb2xsZXIuanMKKy8vIE5PVEU6IEl0IG1heSBiZSBwb3NzaWJsZSB3aXRoIFlVSURvYyB0byBj
b21iaW5lIGRvY3MgaW4gdHdvIGxvY2F0aW9ucworCisvKioKK0FkZGl0aW9uYWwgbWV0aG9kcyBm
b3IgdGhlIENvbnRyb2xsZXJNaXhpbgorCitAY2xhc3MgQ29udHJvbGxlck1peGluCitAbmFtZXNw
YWNlIEVtYmVyCisqLworRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CisgIHRhcmdldDog
bnVsbCwKKyAgbmFtZXNwYWNlOiBudWxsLAorICB2aWV3OiBudWxsLAorICBjb250YWluZXI6IG51
bGwsCisgIF9jaGlsZENvbnRhaW5lcnM6IG51bGwsCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy5fc3VwZXIoKTsKKyAgICBzZXQodGhpcywgJ19jaGlsZENvbnRhaW5lcnMnLCB7fSk7
CisgIH0sCisKKyAgX21vZGVsRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignbW9kZWwnLCBmdW5j
dGlvbigpIHsKKyAgICB2YXIgY29udGFpbmVycyA9IGdldCh0aGlzLCAnX2NoaWxkQ29udGFpbmVy
cycpOworCisgICAgZm9yICh2YXIgcHJvcCBpbiBjb250YWluZXJzKSB7CisgICAgICBpZiAoIWNv
bnRhaW5lcnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KKyAgICAgIGNvbnRh
aW5lcnNbcHJvcF0uZGVzdHJveSgpOworICAgIH0KKworICAgIHNldCh0aGlzLCAnX2NoaWxkQ29u
dGFpbmVycycsIHt9KTsKKyAgfSkKK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewor
Cit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgewordmFyIHN0YXRlcyA9IHt9OworCisvKioKK0Bt
b2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBndWlkRm9yID0gRW1iZXIuZ3VpZEZvcjsKK3Zh
ciBhX2ZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKK3ZhciBhX2FkZE9i
amVjdCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5hZGRPYmplY3Q7Cit2YXIgbWV0YSA9IEVtYmVy
Lm1ldGE7CisKK3ZhciBjaGlsZFZpZXdzUHJvcGVydHkgPSBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKKyAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLCByZXQgPSBFbWJlci5B
KCksIHZpZXcgPSB0aGlzOworCisgIGFfZm9yRWFjaChjaGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3
KSB7CisgICAgdmFyIGN1cnJlbnRDaGlsZFZpZXdzOworICAgIGlmICh2aWV3LmlzVmlydHVhbCkg
eworICAgICAgaWYgKGN1cnJlbnRDaGlsZFZpZXdzID0gZ2V0KHZpZXcsICdjaGlsZFZpZXdzJykp
IHsKKyAgICAgICAgcmV0LnB1c2hPYmplY3RzKGN1cnJlbnRDaGlsZFZpZXdzKTsKKyAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgcmV0LnB1c2godmlldyk7CisgICAgfQorICB9KTsKKworICBy
ZXQucmVwbGFjZSA9IGZ1bmN0aW9uIChpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cykgewor
ICAgIGlmICh2aWV3IGluc3RhbmNlb2YgRW1iZXIuQ29udGFpbmVyVmlldykgeworICAgICAgRW1i
ZXIuZGVwcmVjYXRlKCJNYW5pcHVsYXRpbmcgYW4gRW1iZXIuQ29udGFpbmVyVmlldyB0aHJvdWdo
IGl0cyBjaGlsZFZpZXdzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIENv
bnRhaW5lclZpZXcgaW5zdGFuY2UgaXRzZWxmIGFzIGFuIEVtYmVyLk11dGFibGVBcnJheS4iKTsK
KyAgICAgIHJldHVybiB2aWV3LnJlcGxhY2UoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkVmlld3Mp
OworICAgIH0KKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoImNoaWxkVmlld3MgaXMgaW1tdXRh
YmxlIik7CisgIH07CisKKyAgcmV0dXJuIHJldDsKK30pOworCitFbWJlci53YXJuKCJUaGUgVklF
V19QUkVTRVJWRVNfQ09OVEVYVCBmbGFnIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHRoZSBmdW5jdGlv
bmFsaXR5IGNhbiBubyBsb25nZXIgYmUgZGlzYWJsZWQuIiwgRW1iZXIuRU5WLlZJRVdfUFJFU0VS
VkVTX0NPTlRFWFQgIT09IGZhbHNlKTsKKworLyoqCisgIEdsb2JhbCBoYXNoIG9mIHNoYXJlZCB0
ZW1wbGF0ZXMuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBvcHVsYXRlZAorICBieSB0aGUg
YnVpbGQgdG9vbHMgc28gdGhhdCB5b3UgY2FuIHN0b3JlIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0
ZXMgaW4KKyAgc2VwYXJhdGUgZmlsZXMgdGhhdCBnZXQgbG9hZGVkIGludG8gSmF2YVNjcmlwdCBh
dCBidWlsZHRpbWUuCisKKyAgQHByb3BlcnR5IFRFTVBMQVRFUworICBAZm9yIEVtYmVyCisgIEB0
eXBlIEhhc2gKKyovCitFbWJlci5URU1QTEFURVMgPSB7fTsKKworLyoqCisgIGBFbWJlci5Db3Jl
Vmlld2AgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBleGlzdHMgdG8gZ2l2ZSB2aWV3LWxpa2Ug
YmVoYXZpb3IKKyAgdG8gYm90aCBFbWJlcidzIG1haW4gdmlldyBjbGFzcyBgRW1iZXIuVmlld2Ag
YW5kIG90aGVyIGNsYXNzZXMgbGlrZQorICBgRW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXdgIHRo
YXQgZG9uJ3QgbmVlZCB0aGUgZnVsbHkgZnVuY3Rpb25hbHRpeSBvZgorICBgRW1iZXIuVmlld2Au
CisKKyAgVW5sZXNzIHlvdSBoYXZlIHNwZWNpZmljIG5lZWRzIGZvciBgQ29yZVZpZXdgLCB5b3Ug
d2lsbCB1c2UgYEVtYmVyLlZpZXdgCisgIGluIHlvdXIgYXBwbGljYXRpb25zLgorCisgIEBjbGFz
cyBDb3JlVmlldworICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLk9iamVjdAor
ICBAdXNlcyBFbWJlci5FdmVudGVkCisgIEB1c2VzIEVtYmVyLkFjdGlvbkhhbmRsZXIKKyovCisK
K0VtYmVyLkNvcmVWaWV3ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVkLCBFbWJl
ci5BY3Rpb25IYW5kbGVyLCB7CisgIGlzVmlldzogdHJ1ZSwKKworICBzdGF0ZXM6IHN0YXRlcywK
KworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMudHJh
bnNpdGlvblRvKCdwcmVSZW5kZXInKTsKKyAgfSwKKworICAvKioKKyAgICBJZiB0aGUgdmlldyBp
cyBjdXJyZW50bHkgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIG9mIGEgcGFyZW50IHZpZXcsIHRoaXMK
KyAgICBwcm9wZXJ0eSB3aWxsIHBvaW50IHRvIHRoZSBwYXJlbnQgb2YgdGhlIHZpZXcuCisKKyAg
ICBAcHJvcGVydHkgcGFyZW50VmlldworICAgIEB0eXBlIEVtYmVyLlZpZXcKKyAgICBAZGVmYXVs
dCBudWxsCisgICovCisgIHBhcmVudFZpZXc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewor
ICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3OworCisgICAgaWYgKHBhcmVudCAmJiBw
YXJlbnQuaXNWaXJ0dWFsKSB7CisgICAgICByZXR1cm4gZ2V0KHBhcmVudCwgJ3BhcmVudFZpZXcn
KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisgIH0pLnByb3Bl
cnR5KCdfcGFyZW50VmlldycpLAorCisgIHN0YXRlOiBudWxsLAorCisgIF9wYXJlbnRWaWV3OiBu
dWxsLAorCisgIC8vIHJldHVybiB0aGUgY3VycmVudCB2aWV3LCBub3QgaW5jbHVkaW5nIHZpcnR1
YWwgdmlld3MKKyAgY29uY3JldGVWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAg
ICBpZiAoIXRoaXMuaXNWaXJ0dWFsKSB7IHJldHVybiB0aGlzOyB9CisgICAgZWxzZSB7IHJldHVy
biBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsgfQorICB9KS5wcm9wZXJ0eSgncGFyZW50Vmlldycp
LAorCisgIGluc3RydW1lbnROYW1lOiAnY29yZV92aWV3JywKKworICBpbnN0cnVtZW50RGV0YWls
czogZnVuY3Rpb24oaGFzaCkgeworICAgIGhhc2gub2JqZWN0ID0gdGhpcy50b1N0cmluZygpOwor
ICB9LAorCisgIC8qKgorICAgIEludm9rZWQgYnkgdGhlIHZpZXcgc3lzdGVtIHdoZW4gdGhpcyB2
aWV3IG5lZWRzIHRvIHByb2R1Y2UgYW4gSFRNTAorICAgIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1l
dGhvZCB3aWxsIGNyZWF0ZSBhIG5ldyByZW5kZXIgYnVmZmVyLCBpZiBuZWVkZWQsCisgICAgdGhl
biBhcHBseSBhbnkgZGVmYXVsdCBhdHRyaWJ1dGVzLCBzdWNoIGFzIGNsYXNzIG5hbWVzIGFuZCB2
aXNpYmlsaXR5LgorICAgIEZpbmFsbHksIHRoZSBgcmVuZGVyKClgIG1ldGhvZCBpcyBpbnZva2Vk
LCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IKKyAgICBkb2luZyB0aGUgYnVsayBvZiB0aGUgcmVu
ZGVyaW5nLgorCisgICAgWW91IHNob3VsZCBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhv
ZDsgaW5zdGVhZCwgaW1wbGVtZW50IHRoZQorICAgIGB0ZW1wbGF0ZWAgcHJvcGVydHksIG9yIGlm
IHlvdSBuZWVkIG1vcmUgY29udHJvbCwgb3ZlcnJpZGUgdGhlIGByZW5kZXJgCisgICAgbWV0aG9k
LgorCisgICAgQG1ldGhvZCByZW5kZXJUb0J1ZmZlcgorICAgIEBwYXJhbSB7RW1iZXIuUmVuZGVy
QnVmZmVyfSBidWZmZXIgdGhlIHJlbmRlciBidWZmZXIuIElmIG5vIGJ1ZmZlciBpcworICAgICAg
cGFzc2VkLCBhIGRlZmF1bHQgYnVmZmVyLCB1c2luZyB0aGUgY3VycmVudCB2aWV3J3MgYHRhZ05h
bWVgLCB3aWxsCisgICAgICBiZSB1c2VkLgorICAgIEBwcml2YXRlCisgICovCisgIHJlbmRlclRv
QnVmZmVyOiBmdW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgeworICAgIHZh
ciBuYW1lID0gJ3JlbmRlci4nICsgdGhpcy5pbnN0cnVtZW50TmFtZSwKKyAgICAgICAgZGV0YWls
cyA9IHt9OworCisgICAgdGhpcy5pbnN0cnVtZW50RGV0YWlscyhkZXRhaWxzKTsKKworICAgIHJl
dHVybiBFbWJlci5pbnN0cnVtZW50KG5hbWUsIGRldGFpbHMsIGZ1bmN0aW9uIGluc3RydW1lbnRS
ZW5kZXJUb0J1ZmZlcigpIHsKKyAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUb0J1ZmZlcihwYXJl
bnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbik7CisgICAgfSwgdGhpcyk7CisgIH0sCisKKyAgX3Jl
bmRlclRvQnVmZmVyOiBmdW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgewor
ICAgIC8vIElmIHRoaXMgaXMgdGhlIHRvcC1tb3N0IHZpZXcsIHN0YXJ0IGEgbmV3IGJ1ZmZlci4g
T3RoZXJ3aXNlLAorICAgIC8vIGNyZWF0ZSBhIG5ldyBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIG9y
aWdpbmFsIHVzaW5nIHRoZQorICAgIC8vIHByb3ZpZGVkIGJ1ZmZlciBvcGVyYXRpb24gKGZvciBl
eGFtcGxlLCBgaW5zZXJ0QWZ0ZXJgIHdpbGwKKyAgICAvLyBpbnNlcnQgYSBuZXcgYnVmZmVyIGFm
dGVyIHRoZSAicGFyZW50IGJ1ZmZlciIpLgorICAgIHZhciB0YWdOYW1lID0gdGhpcy50YWdOYW1l
OworCisgICAgaWYgKHRhZ05hbWUgPT09IG51bGwgfHwgdGFnTmFtZSA9PT0gdW5kZWZpbmVkKSB7
CisgICAgICB0YWdOYW1lID0gJ2Rpdic7CisgICAgfQorCisgICAgdmFyIGJ1ZmZlciA9IHRoaXMu
YnVmZmVyID0gcGFyZW50QnVmZmVyICYmIHBhcmVudEJ1ZmZlci5iZWdpbih0YWdOYW1lKSB8fCBF
bWJlci5SZW5kZXJCdWZmZXIodGFnTmFtZSk7CisgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2luQnVm
ZmVyJywgZmFsc2UpOworCisgICAgdGhpcy5iZWZvcmVSZW5kZXIoYnVmZmVyKTsKKyAgICB0aGlz
LnJlbmRlcihidWZmZXIpOworICAgIHRoaXMuYWZ0ZXJSZW5kZXIoYnVmZmVyKTsKKworICAgIHJl
dHVybiBidWZmZXI7CisgIH0sCisKKyAgLyoqCisgICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZl
bnQgZmlyaW5nIGZyb20gYEVtYmVyLkV2ZW50ZWRgIHRvCisgICAgYWxzbyBjYWxsIG1ldGhvZHMg
d2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworICAgIEBtZXRob2QgdHJpZ2dlcgorICAgIEBwYXJhbSBu
YW1lIHtTdHJpbmd9CisgICAgQHByaXZhdGUKKyAgKi8KKyAgdHJpZ2dlcjogZnVuY3Rpb24obmFt
ZSkgeworICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgdmFyIG1l
dGhvZCA9IHRoaXNbbmFtZV07CisgICAgaWYgKG1ldGhvZCkgeworICAgICAgdmFyIGFyZ3MgPSBb
XSwgaSwgbDsKKyAgICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsg
aSsrKSB7CisgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworICAgICAgfQorICAgICAg
cmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9CisgIH0sCisKKyAgZGVwcmVj
YXRlZFNlbmRIYW5kbGVzOiBmdW5jdGlvbihhY3Rpb25OYW1lKSB7CisgICAgcmV0dXJuICEhdGhp
c1thY3Rpb25OYW1lXTsKKyAgfSwKKworICBkZXByZWNhdGVkU2VuZDogZnVuY3Rpb24oYWN0aW9u
TmFtZSkgeworICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAg
IEVtYmVyLmFzc2VydCgnJyArIHRoaXMgKyAiIGhhcyB0aGUgYWN0aW9uICIgKyBhY3Rpb25OYW1l
ICsgIiBidXQgaXQgaXMgbm90IGEgZnVuY3Rpb24iLCB0eXBlb2YgdGhpc1thY3Rpb25OYW1lXSA9
PT0gJ2Z1bmN0aW9uJyk7CisgICAgRW1iZXIuZGVwcmVjYXRlKCdBY3Rpb24gaGFuZGxlcnMgaW1w
bGVtZW50ZWQgZGlyZWN0bHkgb24gdmlld3MgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYWN0
aW9uIGhhbmRsZXJzIG9uIGFuIGBhY3Rpb25zYCBvYmplY3QgKCcgKyBhY3Rpb25OYW1lICsgJyBv
biAnICsgdGhpcyArICcpJywgZmFsc2UpOworICAgIHRoaXNbYWN0aW9uTmFtZV0uYXBwbHkodGhp
cywgYXJncyk7CisgICAgcmV0dXJuOworICB9LAorCisgIGhhczogZnVuY3Rpb24obmFtZSkgewor
ICAgIHJldHVybiBFbWJlci50eXBlT2YodGhpc1tuYW1lXSkgPT09ICdmdW5jdGlvbicgfHwgdGhp
cy5fc3VwZXIobmFtZSk7CisgIH0sCisKKyAgZGVzdHJveTogZnVuY3Rpb24oKSB7CisgICAgdmFy
IHBhcmVudCA9IHRoaXMuX3BhcmVudFZpZXc7CisKKyAgICBpZiAoIXRoaXMuX3N1cGVyKCkpIHsg
cmV0dXJuOyB9CisKKyAgICAvLyBkZXN0cm95IHRoZSBlbGVtZW50IC0tIHRoaXMgd2lsbCBhdm9p
ZCBlYWNoIGNoaWxkIHZpZXcgZGVzdHJveWluZworICAgIC8vIHRoZSBlbGVtZW50IG92ZXIgYW5k
IG92ZXIgYWdhaW4uLi4KKyAgICBpZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0
cm95RWxlbWVudCgpOyB9CisKKyAgICAvLyByZW1vdmUgZnJvbSBwYXJlbnQgaWYgZm91bmQuIERv
bid0IGNhbGwgcmVtb3ZlRnJvbVBhcmVudCwKKyAgICAvLyBhcyByZW1vdmVGcm9tUGFyZW50IHdp
bGwgdHJ5IHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tCisgICAgLy8gdGhlIERPTSBhZ2Fpbi4K
KyAgICBpZiAocGFyZW50KSB7IHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsgfQorCisgICAgdGhp
cy50cmFuc2l0aW9uVG8oJ2Rlc3Ryb3lpbmcnLCBmYWxzZSk7CisKKyAgICByZXR1cm4gdGhpczsK
KyAgfSwKKworICBjbGVhclJlbmRlcmVkQ2hpbGRyZW46IEVtYmVyLkssCisgIHRyaWdnZXJSZWN1
cnNpdmVseTogRW1iZXIuSywKKyAgaW52b2tlUmVjdXJzaXZlbHk6IEVtYmVyLkssCisgIHRyYW5z
aXRpb25UbzogRW1iZXIuSywKKyAgZGVzdHJveUVsZW1lbnQ6IEVtYmVyLksKK30pOworCit2YXIg
Vmlld0NvbGxlY3Rpb24gPSBFbWJlci5fVmlld0NvbGxlY3Rpb24gPSBmdW5jdGlvbihpbml0aWFs
Vmlld3MpIHsKKyAgdmFyIHZpZXdzID0gdGhpcy52aWV3cyA9IGluaXRpYWxWaWV3cyB8fCBbXTsK
KyAgdGhpcy5sZW5ndGggPSB2aWV3cy5sZW5ndGg7Cit9OworCitWaWV3Q29sbGVjdGlvbi5wcm90
b3R5cGUgPSB7CisgIGxlbmd0aDogMCwKKworICB0cmlnZ2VyOiBmdW5jdGlvbihldmVudE5hbWUp
IHsKKyAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzLCB2aWV3OworICAgIGZvciAodmFyIGkgPSAw
LCBsID0gdmlld3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2aWV3ID0gdmlld3NbaV07
CisgICAgICBpZiAodmlldy50cmlnZ2VyKSB7IHZpZXcudHJpZ2dlcihldmVudE5hbWUpOyB9Cisg
ICAgfQorICB9LAorCisgIHRyaWdnZXJSZWN1cnNpdmVseTogZnVuY3Rpb24oZXZlbnROYW1lKSB7
CisgICAgdmFyIHZpZXdzID0gdGhpcy52aWV3czsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHZp
ZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmlld3NbaV0udHJpZ2dlclJlY3Vyc2l2
ZWx5KGV2ZW50TmFtZSk7CisgICAgfQorICB9LAorCisgIGludm9rZVJlY3Vyc2l2ZWx5OiBmdW5j
dGlvbihmbikgeworICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3MsIHZpZXc7CisKKyAgICBmb3Ig
KHZhciBpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmlldyA9
IHZpZXdzW2ldOworICAgICAgZm4odmlldyk7CisgICAgfQorICB9LAorCisgIHRyYW5zaXRpb25U
bzogZnVuY3Rpb24oc3RhdGUsIGNoaWxkcmVuKSB7CisgICAgdmFyIHZpZXdzID0gdGhpcy52aWV3
czsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgdmlld3NbaV0udHJhbnNpdGlvblRvKHN0YXRlLCBjaGlsZHJlbik7CisgICAgfQorICB9
LAorCisgIHB1c2g6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMubGVuZ3RoICs9IGFyZ3VtZW50cy5s
ZW5ndGg7CisgICAgdmFyIHZpZXdzID0gdGhpcy52aWV3czsKKyAgICByZXR1cm4gdmlld3MucHVz
aC5hcHBseSh2aWV3cywgYXJndW1lbnRzKTsKKyAgfSwKKworICBvYmplY3RBdDogZnVuY3Rpb24o
aWR4KSB7CisgICAgcmV0dXJuIHRoaXMudmlld3NbaWR4XTsKKyAgfSwKKworICBmb3JFYWNoOiBm
dW5jdGlvbihjYWxsYmFjaykgeworICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7CisgICAgcmV0
dXJuIGFfZm9yRWFjaCh2aWV3cywgY2FsbGJhY2spOworICB9LAorCisgIGNsZWFyOiBmdW5jdGlv
bigpIHsKKyAgICB0aGlzLmxlbmd0aCA9IDA7CisgICAgdGhpcy52aWV3cy5sZW5ndGggPSAwOwor
ICB9Cit9OworCit2YXIgRU1QVFlfQVJSQVkgPSBbXTsKKworLyoqCisgIGBFbWJlci5WaWV3YCBp
cyB0aGUgY2xhc3MgaW4gRW1iZXIgcmVzcG9uc2libGUgZm9yIGVuY2Fwc3VsYXRpbmcgdGVtcGxh
dGVzIG9mCisgIEhUTUwgY29udGVudCwgY29tYmluaW5nIHRlbXBsYXRlcyB3aXRoIGRhdGEgdG8g
cmVuZGVyIGFzIHNlY3Rpb25zIG9mIGEgcGFnZSdzCisgIERPTSwgYW5kIHJlZ2lzdGVyaW5nIGFu
ZCByZXNwb25kaW5nIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cy4KKworICAjIyBIVE1MIFRhZwor
CisgIFRoZSBkZWZhdWx0IEhUTUwgdGFnIG5hbWUgdXNlZCBmb3IgYSB2aWV3J3MgRE9NIHJlcHJl
c2VudGF0aW9uIGlzIGBkaXZgLiBUaGlzCisgIGNhbiBiZSBjdXN0b21pemVkIGJ5IHNldHRpbmcg
dGhlIGB0YWdOYW1lYCBwcm9wZXJ0eS4gVGhlIGZvbGxvd2luZyB2aWV3CisgIGNsYXNzOgorCisg
IGBgYGphdmFzY3JpcHQKKyAgUGFyYWdyYXBoVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAg
ICB0YWdOYW1lOiAnZW0nCisgIH0pOworICBgYGAKKworICBXb3VsZCByZXN1bHQgaW4gaW5zdGFu
Y2VzIHdpdGggdGhlIGZvbGxvd2luZyBIVE1MOgorCisgIGBgYGh0bWwKKyAgPGVtIGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3Ij48L2VtPgorICBgYGAKKworICAjIyBIVE1MIGBjbGFzc2Ag
QXR0cmlidXRlCisKKyAgVGhlIEhUTUwgYGNsYXNzYCBhdHRyaWJ1dGUgb2YgYSB2aWV3J3MgdGFn
IGNhbiBiZSBzZXQgYnkgcHJvdmlkaW5nIGEKKyAgYGNsYXNzTmFtZXNgIHByb3BlcnR5IHRoYXQg
aXMgc2V0IHRvIGFuIGFycmF5IG9mIHN0cmluZ3M6CisKKyAgYGBgamF2YXNjcmlwdAorICBNeVZp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgY2xhc3NOYW1lczogWydteS1jbGFzcycsICdt
eS1vdGhlci1jbGFzcyddCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB2aWV3IGlu
c3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8
ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IG15LWNsYXNzIG15LW90aGVyLWNsYXNz
Ij48L2Rpdj4KKyAgYGBgCisKKyAgYGNsYXNzYCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBhbHNvIGJl
IHNldCBieSBwcm92aWRpbmcgYSBgY2xhc3NOYW1lQmluZGluZ3NgCisgIHByb3BlcnR5IHNldCB0
byBhbiBhcnJheSBvZiBwcm9wZXJ0aWVzIG5hbWVzIGZvciB0aGUgdmlldy4gVGhlIHJldHVybiB2
YWx1ZQorICBvZiB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgYWRkZWQgYXMgcGFydCBvZiB0aGUg
dmFsdWUgZm9yIHRoZSB2aWV3J3MgYGNsYXNzYAorICBhdHRyaWJ1dGUuIFRoZXNlIHByb3BlcnRp
ZXMgY2FuIGJlIGNvbXB1dGVkIHByb3BlcnRpZXM6CisKKyAgYGBgamF2YXNjcmlwdAorICBNeVZp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsncHJvcGVy
dHlBJywgJ3Byb3BlcnR5QiddLAorICAgIHByb3BlcnR5QTogJ2Zyb20tYScsCisgICAgcHJvcGVy
dHlCOiBmdW5jdGlvbigpIHsKKyAgICAgIGlmIChzb21lTG9naWMpIHsgcmV0dXJuICdmcm9tLWIn
OyB9CisgICAgfS5wcm9wZXJ0eSgpCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB2
aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRt
bAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGZyb20tYSBmcm9tLWIiPjwv
ZGl2PgorICBgYGAKKworICBJZiB0aGUgdmFsdWUgb2YgYSBjbGFzcyBuYW1lIGJpbmRpbmcgcmV0
dXJucyBhIGJvb2xlYW4gdGhlIHByb3BlcnR5IG5hbWUKKyAgaXRzZWxmIHdpbGwgYmUgdXNlZCBh
cyB0aGUgY2xhc3MgbmFtZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gVGhlIGNsYXNzIG5hbWUK
KyAgd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlIHZhbHVlIGlzIGBmYWxzZWAgb3IgYHVuZGVmaW5l
ZGAuCisKKyAgYGBgamF2YXNjcmlwdAorICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Cisg
ICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaG92ZXJlZCddLAorICAgIGhvdmVyZWQ6IHRydWUKKyAg
fSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRN
TCByZXByZXNlbnRhdGlvbiBvZjoKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xh
c3M9ImVtYmVyLXZpZXcgaG92ZXJlZCI+PC9kaXY+CisgIGBgYAorCisgIFdoZW4gdXNpbmcgYm9v
bGVhbiBjbGFzcyBuYW1lIGJpbmRpbmdzIHlvdSBjYW4gc3VwcGx5IGEgc3RyaW5nIHZhbHVlIG90
aGVyCisgIHRoYW4gdGhlIHByb3BlcnR5IG5hbWUgZm9yIHVzZSBhcyB0aGUgYGNsYXNzYCBIVE1M
IGF0dHJpYnV0ZSBieSBhcHBlbmRpbmcgdGhlCisgIHByZWZlcnJlZCB2YWx1ZSBhZnRlciBhICI6
IiBjaGFyYWN0ZXIgd2hlbiBkZWZpbmluZyB0aGUgYmluZGluZzoKKworICBgYGBqYXZhc2NyaXB0
CisgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBjbGFzc05hbWVCaW5kaW5nczog
Wydhd2Vzb21lOnNvLXZlcnktY29vbCddLAorICAgIGF3ZXNvbWU6IHRydWUKKyAgfSk7CisgIGBg
YAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNl
bnRhdGlvbiBvZjoKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXcgc28tdmVyeS1jb29sIj48L2Rpdj4KKyAgYGBgCisKKyAgQm9vbGVhbiB2YWx1ZSBjbGFz
cyBuYW1lIGJpbmRpbmdzIHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSBpbiBhCisgIGNhbWVsQ2Fz
ZS1zdHlsZSBmb3JtYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXNoZXJpemVkIGZvcm1hdDoK
KworICBgYGBqYXZhc2NyaXB0CisgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBj
bGFzc05hbWVCaW5kaW5nczogWydpc1VyZ2VudCddLAorICAgIGlzVXJnZW50OiB0cnVlCisgIH0p
OworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwg
cmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNz
PSJlbWJlci12aWV3IGlzLXVyZ2VudCI+PC9kaXY+CisgIGBgYAorCisgIENsYXNzIG5hbWUgYmlu
ZGluZ3MgY2FuIGFsc28gcmVmZXIgdG8gb2JqZWN0IHZhbHVlcyB0aGF0IGFyZSBmb3VuZCBieQor
ICB0cmF2ZXJzaW5nIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgdmlldyBpdHNlbGY6CisKKyAgYGBg
amF2YXNjcmlwdAorICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgY2xhc3NOYW1l
QmluZGluZ3M6IFsnbWVzc2FnZXMuZW1wdHknXQorICAgIG1lc3NhZ2VzOiBFbWJlci5PYmplY3Qu
Y3JlYXRlKHsKKyAgICAgIGVtcHR5OiB0cnVlCisgICAgfSkKKyAgfSk7CisgIGBgYAorCisgIFdp
bGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBv
ZjoKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZW1w
dHkiPjwvZGl2PgorICBgYGAKKworICBJZiB5b3Ugd2FudCB0byBhZGQgYSBjbGFzcyBuYW1lIGZv
ciBhIHByb3BlcnR5IHdoaWNoIGV2YWx1YXRlcyB0byB0cnVlIGFuZAorICBhbmQgYSBkaWZmZXJl
bnQgY2xhc3MgbmFtZSBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHlvdSBjYW4gcGFzcyBhIGJp
bmRpbmcKKyAgbGlrZSB0aGlzOgorCisgIGBgYGphdmFzY3JpcHQKKyAgLy8gQXBwbGllcyAnZW5h
YmxlZCcgY2xhc3Mgd2hlbiBpc0VuYWJsZWQgaXMgdHJ1ZSBhbmQgJ2Rpc2FibGVkJyB3aGVuIGlz
RW5hYmxlZCBpcyBmYWxzZQorICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgY2xhc3NOYW1lQmlu
ZGluZ3M6IFsnaXNFbmFibGVkOmVuYWJsZWQ6ZGlzYWJsZWQnXQorICAgIGlzRW5hYmxlZDogdHJ1
ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwKKyAgPGRpdiBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyBlbmFibGVkIj48L2Rpdj4KKyAgYGBgCisKKyAgV2hlbiBpc0Vu
YWJsZWQgaXMgYGZhbHNlYCwgdGhlIHJlc3VsdGluZyBIVE1MIHJlcHJlbnNlbnRhdGlvbiBsb29r
cyBsaWtlCisgIHRoaXM6CisKKyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJl
bWJlci12aWV3IGRpc2FibGVkIj48L2Rpdj4KKyAgYGBgCisKKyAgVGhpcyBzeW50YXggb2ZmZXJz
IHRoZSBjb252ZW5pZW5jZSB0byBhZGQgYSBjbGFzcyBpZiBhIHByb3BlcnR5IGlzIGBmYWxzZWA6
CisKKyAgYGBgamF2YXNjcmlwdAorICAvLyBBcHBsaWVzIG5vIGNsYXNzIHdoZW4gaXNFbmFibGVk
IGlzIHRydWUgYW5kIGNsYXNzICdkaXNhYmxlZCcgd2hlbiBpc0VuYWJsZWQgaXMgZmFsc2UKKyAg
RW1iZXIuVmlldy5leHRlbmQoeworICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzRW5hYmxlZDo6
ZGlzYWJsZWQnXQorICAgIGlzRW5hYmxlZDogdHJ1ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCBy
ZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgor
CisgIGBgYGh0bWwKKyAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+PC9kaXY+
CisgIGBgYAorCisgIFdoZW4gdGhlIGBpc0VuYWJsZWRgIHByb3BlcnR5IG9uIHRoZSB2aWV3IGlz
IHNldCB0byBgZmFsc2VgLCBpdCB3aWxsIHJlc3VsdAorICBpbiB2aWV3IGluc3RhbmNlcyB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3IGRpc2FibGVkIj48L2Rpdj4KKyAgYGBgCisKKyAgVXBkYXRl
cyB0byB0aGUgdGhlIHZhbHVlIG9mIGEgY2xhc3MgbmFtZSBiaW5kaW5nIHdpbGwgcmVzdWx0IGlu
IGF1dG9tYXRpYworICB1cGRhdGUgb2YgdGhlICBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIGluIHRo
ZSB2aWV3J3MgcmVuZGVyZWQgSFRNTAorICByZXByZXNlbnRhdGlvbi4gSWYgdGhlIHZhbHVlIGJl
Y29tZXMgYGZhbHNlYCBvciBgdW5kZWZpbmVkYCB0aGUgY2xhc3MgbmFtZQorICB3aWxsIGJlIHJl
bW92ZWQuCisKKyAgQm90aCBgY2xhc3NOYW1lc2AgYW5kIGBjbGFzc05hbWVCaW5kaW5nc2AgYXJl
IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzLiBTZWUKKyAgW0VtYmVyLk9iamVjdF0oL2FwaS9jbGFz
c2VzL0VtYmVyLk9iamVjdC5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlCisgIGluZm9ybWF0
aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzLgorCisgICMjIEhUTUwgQXR0cmlidXRl
cworCisgIFRoZSBIVE1MIGF0dHJpYnV0ZSBzZWN0aW9uIG9mIGEgdmlldydzIHRhZyBjYW4gYmUg
c2V0IGJ5IHByb3ZpZGluZyBhbgorICBgYXR0cmlidXRlQmluZGluZ3NgIHByb3BlcnR5IHNldCB0
byBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvbiB0aGUgdmlldy4KKyAgVGhlIHJldHVybiB2
YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhl
IHZpZXcncworICBIVE1MIGFzc29jaWF0ZWQgYXR0cmlidXRlOgorCisgIGBgYGphdmFzY3JpcHQK
KyAgQW5jaG9yVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0YWdOYW1lOiAnYScsCisg
ICAgYXR0cmlidXRlQmluZGluZ3M6IFsnaHJlZiddLAorICAgIGhyZWY6ICdodHRwOi8vZ29vZ2xl
LmNvbScKKyAgfSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdp
dGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKworICBgYGBodG1sCisgIDxhIGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3IiBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbSI+PC9hPgorICBg
YGAKKworICBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9u
aXRvcmVkIHByb3BlcnR5IGlzIGEgYm9vbGVhbgorICB0aGUgcHJvcGVydHkgd2lsbCBmb2xsb3cg
SFRNTCdzIHBhdHRlcm4gb2YgcmVwZWF0aW5nIHRoZSBhdHRyaWJ1dGUncyBuYW1lIGFzCisgIGl0
cyB2YWx1ZToKKworICBgYGBqYXZhc2NyaXB0CisgIE15VGV4dElucHV0ID0gRW1iZXIuVmlldy5l
eHRlbmQoeworICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsn
ZGlzYWJsZWQnXSwKKyAgICBkaXNhYmxlZDogdHJ1ZQorICB9KTsKKyAgYGBgCisKKyAgV2lsbCBy
ZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgor
CisgIGBgYGh0bWwKKyAgPGlucHV0IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IiBkaXNh
YmxlZD0iZGlzYWJsZWQiIC8+CisgIGBgYAorCisgIGBhdHRyaWJ1dGVCaW5kaW5nc2AgY2FuIHJl
ZmVyIHRvIGNvbXB1dGVkIHByb3BlcnRpZXM6CisKKyAgYGBgamF2YXNjcmlwdAorICBNeVRleHRJ
bnB1dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0YWdOYW1lOiAnaW5wdXQnLAorICAgIGF0
dHJpYnV0ZUJpbmRpbmdzOiBbJ2Rpc2FibGVkJ10sCisgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkg
eworICAgICAgaWYgKHNvbWVMb2dpYykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9LnByb3BlcnR5KCkK
KyAgfSk7CisgIGBgYAorCisgIFVwZGF0ZXMgdG8gdGhlIHRoZSBwcm9wZXJ0eSBvZiBhbiBhdHRy
aWJ1dGUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBhdXRvbWF0aWMKKyAgdXBkYXRlIG9mIHRoZSAg
SFRNTCBhdHRyaWJ1dGUgaW4gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MIHJlcHJlc2VudGF0aW9u
LgorCisgIGBhdHRyaWJ1dGVCaW5kaW5nc2AgaXMgYSBjb25jYXRlbmF0ZWQgcHJvcGVydHkuIFNl
ZSBbRW1iZXIuT2JqZWN0XSgvYXBpL2NsYXNzZXMvRW1iZXIuT2JqZWN0Lmh0bWwpCisgIGRvY3Vt
ZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uY2F0ZW5hdGVkIHByb3BlcnRp
ZXMuCisKKyAgIyMgVGVtcGxhdGVzCisKKyAgVGhlIEhUTUwgY29udGVudHMgb2YgYSB2aWV3J3Mg
cmVuZGVyZWQgcmVwcmVzZW50YXRpb24gYXJlIGRldGVybWluZWQgYnkgaXRzCisgIHRlbXBsYXRl
LiBUZW1wbGF0ZXMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gb3B0aW9uYWwg
Y29udGV4dAorICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0IHdp
bGwgYmUgaW5zZXJ0ZWQgd2l0aGluIHRoZQorICB2aWV3J3MgdGFnLiBNb3N0IHR5cGljYWxseSBp
biBFbWJlciB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBjb21waWxlZAorICBgRW1iZXIuSGFuZGxl
YmFyc2AgdGVtcGxhdGUuCisKKyAgYGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKKyAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdJIGFtIHRo
ZSB0ZW1wbGF0ZScpCisgIH0pOworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3Rh
bmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8ZGl2
IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIGFtIHRoZSB0ZW1wbGF0ZTwvZGl2Pgor
ICBgYGAKKworICBXaXRoaW4gYW4gRW1iZXIgYXBwbGljYXRpb24gaXMgbW9yZSBjb21tb24gdG8g
ZGVmaW5lIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgYXMKKyAgcGFydCBvZiBhIHBhZ2U6CisKKyAg
YGBgaHRtbAorICA8c2NyaXB0IHR5cGU9J3RleHQveC1oYW5kbGViYXJzJyBkYXRhLXRlbXBsYXRl
LW5hbWU9J3NvbWUtdGVtcGxhdGUnPgorICAgIEhlbGxvCisgIDwvc2NyaXB0PgorICBgYGAKKwor
ICBBbmQgYXNzb2NpYXRlIGl0IGJ5IG5hbWUgdXNpbmcgYSB2aWV3J3MgYHRlbXBsYXRlTmFtZWAg
cHJvcGVydHk6CisKKyAgYGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKKyAgICB0ZW1wbGF0ZU5hbWU6ICdzb21lLXRlbXBsYXRlJworICB9KTsKKyAgYGBgCisKKyAg
SWYgeW91IGhhdmUgbmVzdGVkIHJlc291cmNlcywgeW91ciBIYW5kbGViYXJzIHRlbXBsYXRlIHdp
bGwgbG9vayBsaWtlIHRoaXM6CisKKyAgYGBgaHRtbAorICA8c2NyaXB0IHR5cGU9J3RleHQveC1o
YW5kbGViYXJzJyBkYXRhLXRlbXBsYXRlLW5hbWU9J3Bvc3RzL25ldyc+CisgICAgPGgxPk5ldyBQ
b3N0PC9oMT4KKyAgPC9zY3JpcHQ+CisgIGBgYAorCisgIEFuZCBgdGVtcGxhdGVOYW1lYCBwcm9w
ZXJ0eToKKworICBgYGBqYXZhc2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewor
ICAgIHRlbXBsYXRlTmFtZTogJ3Bvc3RzL25ldycKKyAgfSk7CisgIGBgYAorCisgIFVzaW5nIGEg
dmFsdWUgZm9yIGB0ZW1wbGF0ZU5hbWVgIHRoYXQgZG9lcyBub3QgaGF2ZSBhIEhhbmRsZWJhcnMg
dGVtcGxhdGUKKyAgd2l0aCBhIG1hdGNoaW5nIGBkYXRhLXRlbXBsYXRlLW5hbWVgIGF0dHJpYnV0
ZSB3aWxsIHRocm93IGFuIGVycm9yLgorCisgIEZvciB2aWV3cyBjbGFzc2VzIHRoYXQgbWF5IGhh
dmUgYSB0ZW1wbGF0ZSBsYXRlciBkZWZpbmVkIChlLmcuIGFzIHRoZSBibG9jaworICBwb3J0aW9u
IG9mIGEgYHt7dmlld319YCBIYW5kbGViYXJzIGhlbHBlciBjYWxsIGluIGFub3RoZXIgdGVtcGxh
dGUgb3IgaW4KKyAgYSBzdWJjbGFzcyksIHlvdSBjYW4gcHJvdmlkZSBhIGBkZWZhdWx0VGVtcGxh
dGVgIHByb3BlcnR5IHNldCB0byBjb21waWxlZAorICB0ZW1wbGF0ZSBmdW5jdGlvbi4gSWYgYSB0
ZW1wbGF0ZSBpcyBub3QgbGF0ZXIgcHJvdmlkZWQgZm9yIHRoZSB2aWV3IGluc3RhbmNlCisgIHRo
ZSBgZGVmYXVsdFRlbXBsYXRlYCB2YWx1ZSB3aWxsIGJlIHVzZWQ6CisKKyAgYGBgamF2YXNjcmlw
dAorICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBkZWZhdWx0VGVtcGxhdGU6IEVt
YmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhlIGRlZmF1bHQnKSwKKyAgICB0ZW1wbGF0
ZTogbnVsbCwKKyAgICB0ZW1wbGF0ZU5hbWU6IG51bGwKKyAgfSk7CisgIGBgYAorCisgIFdpbGwg
cmVzdWx0IGluIGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAg
YGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIHdhcyB0aGUg
ZGVmYXVsdDwvZGl2PgorICBgYGAKKworICBJZiBhIGB0ZW1wbGF0ZWAgb3IgYHRlbXBsYXRlTmFt
ZWAgaXMgcHJvdmlkZWQgaXQgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlcgorICBgZGVmYXVsdFRl
bXBsYXRlYDoKKworICBgYGBqYXZhc2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo
eworICAgIGRlZmF1bHRUZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdJIHdhcyB0
aGUgZGVmYXVsdCcpCisgIH0pOworCisgIGFWaWV3ID0gQVZpZXcuY3JlYXRlKHsKKyAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdJIHdhcyB0aGUgdGVtcGxhdGUsIG5vdCBk
ZWZhdWx0JykKKyAgfSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcg
SFRNTCByZXByZXNlbnRhdGlvbiB3aGVuIHJlbmRlcmVkOgorCisgIGBgYGh0bWwKKyAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIHRlbXBsYXRlLCBub3QgZGVm
YXVsdDwvZGl2PgorICBgYGAKKworICAjIyBWaWV3IENvbnRleHQKKworICBUaGUgZGVmYXVsdCBj
b250ZXh0IG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBpcyB0aGUgdmlldydzIGNvbnRyb2xsZXI6
CisKKyAgYGBgamF2YXNjcmlwdAorICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICB0
ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdIZWxsbyB7e2V4Y2l0ZWRHcmVldGlu
Z319JykKKyAgfSk7CisKKyAgYUNvbnRyb2xsZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAg
ICBmaXJzdE5hbWU6ICdCYXJyeScsCisgICAgZXhjaXRlZEdyZWV0aW5nOiBmdW5jdGlvbigpIHsK
KyAgICAgIHJldHVybiB0aGlzLmdldCgiY29udGVudC5maXJzdE5hbWUiKSArICIhISEiCisgICAg
fS5wcm9wZXJ0eSgpCisgIH0pOworCisgIGFWaWV3ID0gQVZpZXcuY3JlYXRlKHsKKyAgICBjb250
cm9sbGVyOiBhQ29udHJvbGxlciwKKyAgfSk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIGFu
IEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisKKyAgYGBgaHRtbAorICA8ZGl2IGlkPSJlbWJlcjEi
IGNsYXNzPSJlbWJlci12aWV3Ij5IZWxsbyBCYXJyeSEhITwvZGl2PgorICBgYGAKKworICBBIGNv
bnRleHQgY2FuIGFsc28gYmUgZXhwbGljaXRseSBzdXBwbGllZCB0aHJvdWdoIHRoZSB2aWV3J3Mg
YGNvbnRleHRgCisgIHByb3BlcnR5LiBJZiB0aGUgdmlldyBoYXMgbmVpdGhlciBgY29udGV4dGAg
bm9yIGBjb250cm9sbGVyYCBwcm9wZXJ0aWVzLCB0aGUKKyAgYHBhcmVudFZpZXdgJ3MgY29udGV4
dCB3aWxsIGJlIHVzZWQuCisKKyAgIyMgTGF5b3V0cworCisgIFZpZXdzIGNhbiBoYXZlIGEgc2Vj
b25kYXJ5IHRlbXBsYXRlIHRoYXQgd3JhcHMgdGhlaXIgbWFpbiB0ZW1wbGF0ZS4gTGlrZQorICBw
cmltYXJ5IHRlbXBsYXRlcywgbGF5b3V0cyBjYW4gYmUgYW55IGZ1bmN0aW9uIHRoYXQgIGFjY2Vw
dHMgYW4gb3B0aW9uYWwKKyAgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcg
b2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW5zaWRlCisgIHZpZXcncyB0YWcuIFZpZXdz
IHdob3NlIEhUTUwgZWxlbWVudCBpcyBzZWxmIGNsb3NpbmcgKGUuZy4gYDxpbnB1dCAvPmApCisg
IGNhbm5vdCBoYXZlIGEgbGF5b3V0IGFuZCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4K
KworICBNb3N0IHR5cGljYWxseSBpbiBFbWJlciBhIGxheW91dCB3aWxsIGJlIGEgY29tcGlsZWQg
YEVtYmVyLkhhbmRsZWJhcnNgCisgIHRlbXBsYXRlLgorCisgIEEgdmlldydzIGxheW91dCBjYW4g
YmUgc2V0IGRpcmVjdGx5IHdpdGggdGhlIGBsYXlvdXRgIHByb3BlcnR5IG9yIHJlZmVyZW5jZQor
ICBhbiBleGlzdGluZyBIYW5kbGViYXJzIHRlbXBsYXRlIGJ5IG5hbWUgd2l0aCB0aGUgYGxheW91
dE5hbWVgIHByb3BlcnR5LgorCisgIEEgdGVtcGxhdGUgdXNlZCBhcyBhIGxheW91dCBtdXN0IGNv
bnRhaW4gYSBzaW5nbGUgdXNlIG9mIHRoZSBIYW5kbGViYXJzCisgIGB7e3lpZWxkfX1gIGhlbHBl
ci4gVGhlIEhUTUwgY29udGVudHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQgYHRlbXBsYXRlYCB3aWxs
IGJlCisgIGluc2VydGVkIGF0IHRoaXMgbG9jYXRpb246CisKKyAgYGBgamF2YXNjcmlwdAorICBB
Vmlld1dpdGhMYXlvdXQgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgbGF5b3V0OiBFbWJlci5I
YW5kbGViYXJzLmNvbXBpbGUoIjxkaXYgY2xhc3M9J215LWRlY29yYXRpdmUtY2xhc3MnPnt7eWll
bGR9fTwvZGl2PiIpCisgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiSSBn
b3Qgd3JhcHBlZCIpLAorICB9KTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0
YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorCisgIGBgYGh0bWwKKyAgPGRp
diBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgPGRpdiBjbGFzcz0ibXktZGVj
b3JhdGl2ZS1jbGFzcyI+CisgICAgICBJIGdvdCB3cmFwcGVkCisgICAgPC9kaXY+CisgIDwvZGl2
PgorICBgYGAKKworICBTZWUgW0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy55aWVsZF0oL2FwaS9j
bGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF95aWVsZCkKKyAgZm9y
IG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIyMgUmVzcG9uZGluZyB0byBCcm93c2VyIEV2ZW50cwor
CisgIFZpZXdzIGNhbiByZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBpbiBvbmUgb2Yg
dGhyZWUgd2F5czogbWV0aG9kCisgIGltcGxlbWVudGF0aW9uLCB0aHJvdWdoIGFuIGV2ZW50IG1h
bmFnZXIsIGFuZCB0aHJvdWdoIGB7e2FjdGlvbn19YCBoZWxwZXIgdXNlCisgIGluIHRoZWlyIHRl
bXBsYXRlIG9yIGxheW91dC4KKworICAjIyMgTWV0aG9kIEltcGxlbWVudGF0aW9uCisKKyAgVmll
d3MgY2FuIHJlc3BvbmQgdG8gdXNlci1pbml0aWF0ZWQgZXZlbnRzIGJ5IGltcGxlbWVudGluZyBh
IG1ldGhvZCB0aGF0CisgIG1hdGNoZXMgdGhlIGV2ZW50IG5hbWUuIEEgYGpRdWVyeS5FdmVudGAg
b2JqZWN0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZQorICBhcmd1bWVudCB0byB0aGlzIG1ldGhvZC4K
KworICBgYGBqYXZhc2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIGNs
aWNrOiBmdW5jdGlvbihldmVudCkgeworICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVu
IGFuIGluc3RhbmNlJ3MKKyAgICAgIC8vIHJlbmRlcmVkIGVsZW1lbnQgaXMgY2xpY2tlZAorICAg
IH0KKyAgfSk7CisgIGBgYAorCisgICMjIyBFdmVudCBNYW5hZ2VycworCisgIFZpZXdzIGNhbiBk
ZWZpbmUgYW4gb2JqZWN0IGFzIHRoZWlyIGBldmVudE1hbmFnZXJgIHByb3BlcnR5LiBUaGlzIG9i
amVjdCBjYW4KKyAgdGhlbiBpbXBsZW1lbnQgbWV0aG9kcyB0aGF0IG1hdGNoIHRoZSBkZXNpcmVk
IGV2ZW50IG5hbWVzLiBNYXRjaGluZyBldmVudHMKKyAgdGhhdCBvY2N1ciBvbiB0aGUgdmlldydz
IHJlbmRlcmVkIEhUTUwgb3IgdGhlIHJlbmRlcmVkIEhUTUwgb2YgYW55IG9mIGl0cyBET00KKyAg
ZGVzY2VuZGFudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbWV0aG9kLiBBIGBqUXVlcnkuRXZlbnRgIG9i
amVjdCB3aWxsIGJlIHBhc3NlZAorICBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIG1ldGhv
ZCBhbmQgYW4gIGBFbWJlci5WaWV3YCBvYmplY3QgYXMgdGhlCisgIHNlY29uZC4gVGhlIGBFbWJl
ci5WaWV3YCB3aWxsIGJlIHRoZSB2aWV3IHdob3NlIHJlbmRlcmVkIEhUTUwgd2FzIGludGVyYWN0
ZWQKKyAgd2l0aC4gVGhpcyBtYXkgYmUgdGhlIHZpZXcgd2l0aCB0aGUgYGV2ZW50TWFuYWdlcmAg
cHJvcGVydHkgb3Igb25lIG9mIGl0cworICBkZXNjZW5kZW50IHZpZXdzLgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgZXZlbnRNYW5hZ2VyOiBF
bWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIGRvdWJsZUNsaWNrOiBmdW5jdGlvbihldmVudCwg
dmlldykgeworICAgICAgICAvLyB3aWxsIGJlIGNhbGxlZCB3aGVuIHdoZW4gYW4gaW5zdGFuY2Un
cworICAgICAgICAvLyByZW5kZXJlZCBlbGVtZW50IG9yIGFueSByZW5kZXJpbmcKKyAgICAgICAg
Ly8gb2YgdGhpcyB2aWV3cydzIGRlc2NlbmRlbnQKKyAgICAgICAgLy8gZWxlbWVudHMgaXMgY2xp
Y2tlZAorICAgICAgfQorICAgIH0pCisgIH0pOworICBgYGAKKworICBBbiBldmVudCBkZWZpbmVk
IGZvciBhbiBldmVudCBtYW5hZ2VyIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBldmVudHMgb2YgdGhl
CisgIHNhbWUgbmFtZSBoYW5kbGVkIHRocm91Z2ggbWV0aG9kcyBvbiB0aGUgdmlldy4KKworICBg
YGBqYXZhc2NyaXB0CisgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIG1vdXNlRW50
ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAvLyB3aWxsIG5ldmVyIHRyaWdnZXIuCisgICAg
fSwKKyAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgICAgbW91c2VF
bnRlcjogZnVuY3Rpb24oZXZlbnQsIHZpZXcpIHsKKyAgICAgICAgLy8gdGFrZXMgcHJlY2VkZW5j
ZSBvdmVyIEFWaWV3I21vdXNlRW50ZXIKKyAgICAgIH0KKyAgICB9KQorICB9KTsKKyAgYGBgCisK
KyAgU2ltaWxhcmx5IGEgdmlldydzIGV2ZW50IG1hbmFnZXIgd2lsbCB0YWtlIHByZWNlZGVuY2Ug
Zm9yIGV2ZW50cyBvZiBhbnkgdmlld3MKKyAgcmVuZGVyZWQgYXMgYSBkZXNjZW5kZW50LiBBIG1l
dGhvZCBuYW1lIHRoYXQgbWF0Y2hlcyBhbiBldmVudCBuYW1lIHdpbGwgbm90CisgIGJlIGNhbGxl
ZCBpZiB0aGUgdmlldyBpbnN0YW5jZSB3YXMgcmVuZGVyZWQgaW5zaWRlIHRoZSBIVE1MIHJlcHJl
c2VudGF0aW9uIG9mCisgIGEgdmlldyB0aGF0IGhhcyBhbiBgZXZlbnRNYW5hZ2VyYCBwcm9wZXJ0
eSBkZWZpbmVkIHRoYXQgaGFuZGxlcyBldmVudHMgb2YgdGhlCisgIG5hbWUuIEV2ZW50cyBub3Qg
aGFuZGxlZCBieSB0aGUgZXZlbnQgbWFuYWdlciB3aWxsIHN0aWxsIHRyaWdnZXIgbWV0aG9kIGNh
bGxzCisgIG9uIHRoZSBkZXNjZW5kZW50LgorCisgIGBgYGphdmFzY3JpcHQKKyAgT3V0ZXJWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNv
bXBpbGUoIm91dGVyIHt7I3ZpZXcgSW5uZXJWaWV3fX1pbm5lcnt7L3ZpZXd9fSBvdXRlciIpLAor
ICAgIGV2ZW50TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgICBtb3VzZUVudGVy
OiBmdW5jdGlvbihldmVudCwgdmlldykgeworICAgICAgICAvLyB2aWV3IG1pZ2h0IGJlIGluc3Rh
bmNlIG9mIGVpdGhlcgorICAgICAgICAvLyBPdXRlclZpZXcgb3IgSW5uZXJWaWV3IGRlcGVuZGlu
ZyBvbgorICAgICAgICAvLyB3aGVyZSBvbiB0aGUgcGFnZSB0aGUgdXNlciBpbnRlcmFjdGlvbiBv
Y2N1cmVkCisgICAgICB9CisgICAgfSkKKyAgfSk7CisKKyAgSW5uZXJWaWV3ID0gRW1iZXIuVmll
dy5leHRlbmQoeworICAgIGNsaWNrOiBmdW5jdGlvbihldmVudCkgeworICAgICAgLy8gd2lsbCBi
ZSBjYWxsZWQgaWYgcmVuZGVyZWQgaW5zaWRlCisgICAgICAvLyBhbiBPdXRlclZpZXcgYmVjYXVz
ZSBPdXRlclZpZXcncworICAgICAgLy8gZXZlbnRNYW5hZ2VyIGRvZXNuJ3QgaGFuZGxlIGNsaWNr
IGV2ZW50cworICAgIH0sCisgICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAg
IC8vIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQorICAgICAgLy8gYW4g
T3V0ZXJWaWV3LgorICAgIH0KKyAgfSk7CisgIGBgYAorCisgICMjIyBIYW5kbGViYXJzIGB7e2Fj
dGlvbn19YCBIZWxwZXIKKworICBTZWUgW0hhbmRsZWJhcnMuaGVscGVycy5hY3Rpb25dKC9hcGkv
Y2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfYWN0aW9uKS4KKwor
ICAjIyMgRXZlbnQgTmFtZXMKKworICBBbGwgb2YgdGhlIGV2ZW50IGhhbmRsaW5nIGFwcHJvYWNo
ZXMgZGVzY3JpYmVkIGFib3ZlIHJlc3BvbmQgdG8gdGhlIHNhbWUgc2V0CisgIG9mIGV2ZW50cy4g
VGhlIG5hbWVzIG9mIHRoZSBidWlsdC1pbiBldmVudHMgYXJlIGxpc3RlZCBiZWxvdy4gKFRoZSBo
YXNoIG9mCisgIGJ1aWx0LWluIGV2ZW50cyBleGlzdHMgaW4gYEVtYmVyLkV2ZW50RGlzcGF0Y2hl
cmAuKSBBZGRpdGlvbmFsLCBjdXN0b20gZXZlbnRzCisgIGNhbiBiZSByZWdpc3RlcmVkIGJ5IHVz
aW5nIGBFbWJlci5BcHBsaWNhdGlvbi5jdXN0b21FdmVudHNgLgorCisgIFRvdWNoIGV2ZW50czoK
KworICAqIGB0b3VjaFN0YXJ0YAorICAqIGB0b3VjaE1vdmVgCisgICogYHRvdWNoRW5kYAorICAq
IGB0b3VjaENhbmNlbGAKKworICBLZXlib2FyZCBldmVudHMKKworICAqIGBrZXlEb3duYAorICAq
IGBrZXlVcGAKKyAgKiBga2V5UHJlc3NgCisKKyAgTW91c2UgZXZlbnRzCisKKyAgKiBgbW91c2VE
b3duYAorICAqIGBtb3VzZVVwYAorICAqIGBjb250ZXh0TWVudWAKKyAgKiBgY2xpY2tgCisgICog
YGRvdWJsZUNsaWNrYAorICAqIGBtb3VzZU1vdmVgCisgICogYGZvY3VzSW5gCisgICogYGZvY3Vz
T3V0YAorICAqIGBtb3VzZUVudGVyYAorICAqIGBtb3VzZUxlYXZlYAorCisgIEZvcm0gZXZlbnRz
OgorCisgICogYHN1Ym1pdGAKKyAgKiBgY2hhbmdlYAorICAqIGBmb2N1c0luYAorICAqIGBmb2N1
c091dGAKKyAgKiBgaW5wdXRgCisKKyAgSFRNTDUgZHJhZyBhbmQgZHJvcCBldmVudHM6CisKKyAg
KiBgZHJhZ1N0YXJ0YAorICAqIGBkcmFnYAorICAqIGBkcmFnRW50ZXJgCisgICogYGRyYWdMZWF2
ZWAKKyAgKiBgZHJvcGAKKyAgKiBgZHJhZ0VuZGAKKworICAjIyBIYW5kbGViYXJzIGB7e3ZpZXd9
fWAgSGVscGVyCisKKyAgT3RoZXIgYEVtYmVyLlZpZXdgIGluc3RhbmNlcyBjYW4gYmUgaW5jbHVk
ZWQgYXMgcGFydCBvZiBhIHZpZXcncyB0ZW1wbGF0ZSBieQorICB1c2luZyB0aGUgYHt7dmlld319
YCBIYW5kbGViYXJzIGhlbHBlci4gU2VlIFtFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlld10o
L2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF92aWV3KQor
ICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworICBAY2xhc3MgVmlldworICBAbmFtZXNw
YWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLkNvcmVWaWV3CisqLworRW1iZXIuVmlldyA9IEVt
YmVyLkNvcmVWaWV3LmV4dGVuZCh7CisKKyAgY29uY2F0ZW5hdGVkUHJvcGVydGllczogWydjbGFz
c05hbWVzJywgJ2NsYXNzTmFtZUJpbmRpbmdzJywgJ2F0dHJpYnV0ZUJpbmRpbmdzJ10sCisKKyAg
LyoqCisgICAgQHByb3BlcnR5IGlzVmlldworICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVs
dCB0cnVlCisgICAgQHN0YXRpYworICAqLworICBpc1ZpZXc6IHRydWUsCisKKyAgLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAv
LyBURU1QTEFURSBTVVBQT1JUCisgIC8vCisKKyAgLyoqCisgICAgVGhlIG5hbWUgb2YgdGhlIHRl
bXBsYXRlIHRvIGxvb2t1cCBpZiBubyB0ZW1wbGF0ZSBpcyBwcm92aWRlZC4KKworICAgIEJ5IGRl
ZmF1bHQgYEVtYmVyLlZpZXdgIHdpbGwgbG9va3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUg
aW4KKyAgICBgRW1iZXIuVEVNUExBVEVTYCAoYSBzaGFyZWQgZ2xvYmFsIG9iamVjdCkuCisKKyAg
ICBAcHJvcGVydHkgdGVtcGxhdGVOYW1lCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQg
bnVsbAorICAqLworICB0ZW1wbGF0ZU5hbWU6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIG5hbWUg
b2YgdGhlIGxheW91dCB0byBsb29rdXAgaWYgbm8gbGF5b3V0IGlzIHByb3ZpZGVkLgorCisgICAg
QnkgZGVmYXVsdCBgRW1iZXIuVmlld2Agd2lsbCBsb29rdXAgYSB0ZW1wbGF0ZSB3aXRoIHRoaXMg
bmFtZSBpbgorICAgIGBFbWJlci5URU1QTEFURVNgIChhIHNoYXJlZCBnbG9iYWwgb2JqZWN0KS4K
KworICAgIEBwcm9wZXJ0eSBsYXlvdXROYW1lCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1
bHQgbnVsbAorICAqLworICBsYXlvdXROYW1lOiBudWxsLAorCisgIC8qKgorICAgIFRoZSB0ZW1w
bGF0ZSB1c2VkIHRvIHJlbmRlciB0aGUgdmlldy4gVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0
aGF0CisgICAgYWNjZXB0cyBhbiBvcHRpb25hbCBjb250ZXh0IHBhcmFtZXRlciBhbmQgcmV0dXJu
cyBhIHN0cmluZyBvZiBIVE1MIHRoYXQKKyAgICB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERP
TSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHZpZXcuCisKKyAgICBJbiBnZW5lcmFsLCB5b3Ugc2hv
dWxkIHNldCB0aGUgYHRlbXBsYXRlTmFtZWAgcHJvcGVydHkgaW5zdGVhZCBvZiBzZXR0aW5nCisg
ICAgdGhlIHRlbXBsYXRlIHlvdXJzZWxmLgorCisgICAgQHByb3BlcnR5IHRlbXBsYXRlCisgICAg
QHR5cGUgRnVuY3Rpb24KKyAgKi8KKyAgdGVtcGxhdGU6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KGtleSwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdmFs
dWU7IH0KKworICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBnZXQodGhpcywgJ3RlbXBsYXRlTmFtZScp
LAorICAgICAgICB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKHRlbXBsYXRlTmFtZSwg
J3RlbXBsYXRlJyk7CisKKyAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgdGhlIHRlbXBs
YXRlTmFtZSAiICsgdGVtcGxhdGVOYW1lICsgIiBmb3IgIiArIHRoaXMgKyAiLCBidXQgaXQgZGlk
IG5vdCBleGlzdC4iLCAhdGVtcGxhdGVOYW1lIHx8IHRlbXBsYXRlKTsKKworICAgIHJldHVybiB0
ZW1wbGF0ZSB8fCBnZXQodGhpcywgJ2RlZmF1bHRUZW1wbGF0ZScpOworICB9KS5wcm9wZXJ0eSgn
dGVtcGxhdGVOYW1lJyksCisKKyAgLyoqCisgICAgVGhlIGNvbnRyb2xsZXIgbWFuYWdpbmcgdGhp
cyB2aWV3LiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCwgaXQgd2lsbCBiZQorICAgIG1hZGUgYXZh
aWxhYmxlIGZvciB1c2UgYnkgdGhlIHRlbXBsYXRlLgorCisgICAgQHByb3BlcnR5IGNvbnRyb2xs
ZXIKKyAgICBAdHlwZSBPYmplY3QKKyAgKi8KKyAgY29udHJvbGxlcjogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ19wYXJlbnRW
aWV3Jyk7CisgICAgcmV0dXJuIHBhcmVudFZpZXcgPyBnZXQocGFyZW50VmlldywgJ2NvbnRyb2xs
ZXInKSA6IG51bGw7CisgIH0pLnByb3BlcnR5KCdfcGFyZW50VmlldycpLAorCisgIC8qKgorICAg
IEEgdmlldyBtYXkgY29udGFpbiBhIGxheW91dC4gQSBsYXlvdXQgaXMgYSByZWd1bGFyIHRlbXBs
YXRlIGJ1dAorICAgIHN1cGVyc2VkZXMgdGhlIGB0ZW1wbGF0ZWAgcHJvcGVydHkgZHVyaW5nIHJl
bmRlcmluZy4gSXQgaXMgdGhlCisgICAgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGxheW91dCB0ZW1w
bGF0ZSB0byByZXRyaWV2ZSB0aGUgYHRlbXBsYXRlYAorICAgIHByb3BlcnR5IGZyb20gdGhlIHZp
ZXcgKG9yIGFsdGVybmF0aXZlbHksIGNhbGwgYEhhbmRsZWJhcnMuaGVscGVycy55aWVsZGAsCisg
ICAgYHt7eWllbGR9fWApIHRvIHJlbmRlciBpdCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4KKwor
ICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZpZXcgdGhhdCBoYXMgYSBzaGFyZWQgd3JhcHBlciwg
YnV0IHdoaWNoIGRlbGVnYXRlcworICAgIHRoZSByZW5kZXJpbmcgb2YgdGhlIGNvbnRlbnRzIG9m
IHRoZSB3cmFwcGVyIHRvIHRoZSBgdGVtcGxhdGVgIHByb3BlcnR5CisgICAgb24gYSBzdWJjbGFz
cy4KKworICAgIEBwcm9wZXJ0eSBsYXlvdXQKKyAgICBAdHlwZSBGdW5jdGlvbgorICAqLworICBs
YXlvdXQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgeworICAgIHZhciBsYXlvdXROYW1l
ID0gZ2V0KHRoaXMsICdsYXlvdXROYW1lJyksCisgICAgICAgIGxheW91dCA9IHRoaXMudGVtcGxh
dGVGb3JOYW1lKGxheW91dE5hbWUsICdsYXlvdXQnKTsKKworICAgIEVtYmVyLmFzc2VydCgiWW91
IHNwZWNpZmllZCB0aGUgbGF5b3V0TmFtZSAiICsgbGF5b3V0TmFtZSArICIgZm9yICIgKyB0aGlz
ICsgIiwgYnV0IGl0IGRpZCBub3QgZXhpc3QuIiwgIWxheW91dE5hbWUgfHwgbGF5b3V0KTsKKwor
ICAgIHJldHVybiBsYXlvdXQgfHwgZ2V0KHRoaXMsICdkZWZhdWx0TGF5b3V0Jyk7CisgIH0pLnBy
b3BlcnR5KCdsYXlvdXROYW1lJyksCisKKyAgX3lpZWxkOiBmdW5jdGlvbihjb250ZXh0LCBvcHRp
b25zKSB7CisgICAgdmFyIHRlbXBsYXRlID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZScpOworICAgIGlm
ICh0ZW1wbGF0ZSkgeyB0ZW1wbGF0ZShjb250ZXh0LCBvcHRpb25zKTsgfQorICB9LAorCisgIHRl
bXBsYXRlRm9yTmFtZTogZnVuY3Rpb24obmFtZSwgdHlwZSkgeworICAgIGlmICghbmFtZSkgeyBy
ZXR1cm47IH0KKyAgICBFbWJlci5hc3NlcnQoInRlbXBsYXRlTmFtZXMgYXJlIG5vdCBhbGxvd2Vk
IHRvIGNvbnRhaW4gcGVyaW9kczogIituYW1lLCBuYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpOwor
CisgICAgLy8gdGhlIGRlZmF1bHRDb250YWluZXIgaXMgZGVwcmVjYXRlZAorICAgIHZhciBjb250
YWluZXIgPSB0aGlzLmNvbnRhaW5lciB8fCAoRW1iZXIuQ29udGFpbmVyICYmIEVtYmVyLkNvbnRh
aW5lci5kZWZhdWx0Q29udGFpbmVyKTsKKyAgICByZXR1cm4gY29udGFpbmVyICYmIGNvbnRhaW5l
ci5sb29rdXAoJ3RlbXBsYXRlOicgKyBuYW1lKTsKKyAgfSwKKworICAvKioKKyAgICBUaGUgb2Jq
ZWN0IGZyb20gd2hpY2ggdGVtcGxhdGVzIHNob3VsZCBhY2Nlc3MgcHJvcGVydGllcy4KKworICAg
IFRoaXMgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBlYWNo
IHRpbWUgdGhlIHJlbmRlcgorICAgIG1ldGhvZCBpcyBjYWxsZWQsIGJ1dCBpdCBpcyB1cCB0byB0
aGUgaW5kaXZpZHVhbCBmdW5jdGlvbiB0byBkZWNpZGUgd2hhdAorICAgIHRvIGRvIHdpdGggaXQu
CisKKyAgICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgYmUgdGhlIHZpZXcncyBjb250cm9sbGVyLgor
CisgICAgQHByb3BlcnR5IGNvbnRleHQKKyAgICBAdHlwZSBPYmplY3QKKyAgKi8KKyAgY29udGV4
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoID09PSAyKSB7CisgICAgICBzZXQodGhpcywgJ19jb250ZXh0JywgdmFsdWUpOwor
ICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZ2V0KHRoaXMs
ICdfY29udGV4dCcpOworICAgIH0KKyAgfSkudm9sYXRpbGUoKSwKKworICAvKioKKyAgICBQcml2
YXRlIGNvcHkgb2YgdGhlIHZpZXcncyB0ZW1wbGF0ZSBjb250ZXh0LiBUaGlzIGNhbiBiZSBzZXQg
ZGlyZWN0bHkKKyAgICBieSBIYW5kbGViYXJzIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgb2JzZXJ2
ZXIgdGhhdCBjYXVzZXMgdGhlIHZpZXcKKyAgICB0byBiZSByZS1yZW5kZXJlZC4KKworICAgIFRo
ZSBjb250ZXh0IG9mIGEgdmlldyBpcyBsb29rZWQgdXAgYXMgZm9sbG93czoKKworICAgIDEuIFN1
cHBsaWVkIGNvbnRleHQgKHVzdWFsbHkgYnkgSGFuZGxlYmFycykKKyAgICAyLiBTcGVjaWZpZWQg
Y29udHJvbGxlcgorICAgIDMuIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQgKGZvciBhIGNoaWxkIG9m
IGEgQ29udGFpbmVyVmlldykKKworICAgIFRoZSBjb2RlIGluIEhhbmRsZWJhcnMgdGhhdCBvdmVy
cmlkZXMgdGhlIGBfY29udGV4dGAgcHJvcGVydHkgZmlyc3QKKyAgICBjaGVja3MgdG8gc2VlIHdo
ZXRoZXIgdGhlIHZpZXcgaGFzIGEgc3BlY2lmaWVkIGNvbnRyb2xsZXIuIFRoaXMgaXMKKyAgICBz
b21ldGhpbmcgb2YgYSBoYWNrIGFuZCBzaG91bGQgYmUgcmV2aXNpdGVkLgorCisgICAgQHByb3Bl
cnR5IF9jb250ZXh0CisgICAgQHByaXZhdGUKKyAgKi8KKyAgX2NvbnRleHQ6IEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKGtleSkgeworICAgIHZhciBwYXJlbnRWaWV3LCBjb250cm9sbGVyOworCisg
ICAgaWYgKGNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSkgeworICAgICAgcmV0
dXJuIGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcGFyZW50VmlldyA9IHRoaXMuX3BhcmVudFZp
ZXc7CisgICAgaWYgKHBhcmVudFZpZXcpIHsKKyAgICAgIHJldHVybiBnZXQocGFyZW50Vmlldywg
J19jb250ZXh0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0pLAorCisgIC8qKgor
ICAgIElmIGEgdmFsdWUgdGhhdCBhZmZlY3RzIHRlbXBsYXRlIHJlbmRlcmluZyBjaGFuZ2VzLCB0
aGUgdmlldyBzaG91bGQgYmUKKyAgICByZS1yZW5kZXJlZCB0byByZWZsZWN0IHRoZSBuZXcgdmFs
dWUuCisKKyAgICBAbWV0aG9kIF9jb250ZXh0RGlkQ2hhbmdlCisgICAgQHByaXZhdGUKKyAgKi8K
KyAgX2NvbnRleHREaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdjb250ZXh0JywgZnVuY3Rpb24o
KSB7CisgICAgdGhpcy5yZXJlbmRlcigpOworICB9KSwKKworICAvKioKKyAgICBJZiBgZmFsc2Vg
LCB0aGUgdmlldyB3aWxsIGFwcGVhciBoaWRkZW4gaW4gRE9NLgorCisgICAgQHByb3BlcnR5IGlz
VmlzaWJsZQorICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCBudWxsCisgICovCisgIGlz
VmlzaWJsZTogdHJ1ZSwKKworICAvKioKKyAgICBBcnJheSBvZiBjaGlsZCB2aWV3cy4gWW91IHNo
b3VsZCBuZXZlciBlZGl0IHRoaXMgYXJyYXkgZGlyZWN0bHkuCisgICAgSW5zdGVhZCwgdXNlIGBh
cHBlbmRDaGlsZGAgYW5kIGByZW1vdmVGcm9tUGFyZW50YC4KKworICAgIEBwcm9wZXJ0eSBjaGls
ZFZpZXdzCisgICAgQHR5cGUgQXJyYXkKKyAgICBAZGVmYXVsdCBbXQorICAgIEBwcml2YXRlCisg
ICovCisgIGNoaWxkVmlld3M6IGNoaWxkVmlld3NQcm9wZXJ0eSwKKworICBfY2hpbGRWaWV3czog
RU1QVFlfQVJSQVksCisKKyAgLy8gV2hlbiBpdCdzIGEgdmlydHVhbCB2aWV3LCB3ZSBuZWVkIHRv
IG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlaXIKKyAgLy8gY2hpbGRWaWV3cyB3aWxsIGNoYW5n
ZS4KKyAgX2NoaWxkVmlld3NXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY2hpbGRW
aWV3cycsIGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLmlzVmlydHVhbCkgeworICAgICAgdmFy
IHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIGlmIChwYXJlbnRW
aWV3KSB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3cycp
OyB9CisgICAgfQorICB9KSwKKworICAvLyBXaGVuIGl0J3MgYSB2aXJ0dWFsIHZpZXcsIHdlIG5l
ZWQgdG8gbm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB0aGVpcgorICAvLyBjaGlsZFZpZXdzIGRpZCBj
aGFuZ2UuCisgIF9jaGlsZFZpZXdzRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY2hpbGRWaWV3
cycsIGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLmlzVmlydHVhbCkgeworICAgICAgdmFyIHBh
cmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIGlmIChwYXJlbnRWaWV3
KSB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHBhcmVudFZpZXcsICdjaGlsZFZpZXdzJyk7IH0K
KyAgICB9CisgIH0pLAorCisgIC8qKgorICAgIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB0
aGF0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZAorICAgIGNsYXNzLgorCisgICAgQHBy
b3BlcnR5IG5lYXJlc3RJbnN0YW5jZU9mCisgICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgU3ViY2xh
c3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpCisgICAgQHJldHVybiBFbWJl
ci5WaWV3CisgICAgQGRlcHJlY2F0ZWQKKyAgKi8KKyAgbmVhcmVzdEluc3RhbmNlT2Y6IGZ1bmN0
aW9uKGtsYXNzKSB7CisgICAgRW1iZXIuZGVwcmVjYXRlKCJuZWFyZXN0SW5zdGFuY2VPZiBpcyBk
ZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMuIFVzZSBu
ZWFyZXN0T2ZUeXBlLiIpOworICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7
CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBrbGFzcykg
eyByZXR1cm4gdmlldzsgfQorICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOwor
ICAgIH0KKyAgfSwKKworICAvKioKKyAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhh
dCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQKKyAgICBjbGFzcyBvciBtaXhpbi4KKwor
ICAgIEBwcm9wZXJ0eSBuZWFyZXN0T2ZUeXBlCisgICAgQHBhcmFtIHtDbGFzcyxNaXhpbn0ga2xh
c3MgU3ViY2xhc3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpLAorICAgICAg
ICAgICBvciBhbiBpbnN0YW5jZSBvZiBFbWJlci5NaXhpbi4KKyAgICBAcmV0dXJuIEVtYmVyLlZp
ZXcKKyAgKi8KKyAgbmVhcmVzdE9mVHlwZTogZnVuY3Rpb24oa2xhc3MpIHsKKyAgICB2YXIgdmll
dyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpLAorICAgICAgICBpc09mVHlwZSA9IGtsYXNzIGlu
c3RhbmNlb2YgRW1iZXIuTWl4aW4gPworICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZpZXcp
IHsgcmV0dXJuIGtsYXNzLmRldGVjdCh2aWV3KTsgfSA6CisgICAgICAgICAgICAgICAgICAgZnVu
Y3Rpb24odmlldykgeyByZXR1cm4ga2xhc3MuZGV0ZWN0KHZpZXcuY29uc3RydWN0b3IpOyB9Owor
CisgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgIGlmIChpc09mVHlwZSh2aWV3KSkgeyByZXR1cm4g
dmlldzsgfQorICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOworICAgIH0KKyAg
fSwKKworICAvKioKKyAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBoYXMgYSBn
aXZlbiBwcm9wZXJ0eS4KKworICAgIEBmdW5jdGlvbiBuZWFyZXN0V2l0aFByb3BlcnR5CisgICAg
QHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IEEgcHJvcGVydHkgbmFtZQorICAgIEByZXR1cm4gRW1i
ZXIuVmlldworICAqLworICBuZWFyZXN0V2l0aFByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0eSkg
eworICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CisKKyAgICB3aGlsZSAo
dmlldykgeworICAgICAgaWYgKHByb3BlcnR5IGluIHZpZXcpIHsgcmV0dXJuIHZpZXc7IH0KKyAg
ICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICB9CisgIH0sCisKKyAgLyoq
CisgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHdob3NlIHBhcmVudCBpcyBhbiBpbnN0
YW5jZSBvZgorICAgIGBrbGFzc2AuCisKKyAgICBAbWV0aG9kIG5lYXJlc3RDaGlsZE9mCisgICAg
QHBhcmFtIHtDbGFzc30ga2xhc3MgU3ViY2xhc3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmll
dyBpdHNlbGYpCisgICAgQHJldHVybiBFbWJlci5WaWV3CisgICovCisgIG5lYXJlc3RDaGlsZE9m
OiBmdW5jdGlvbihrbGFzcykgeworICAgIHZhciB2aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3
Jyk7CisKKyAgICB3aGlsZSAodmlldykgeworICAgICAgaWYgKGdldCh2aWV3LCAncGFyZW50Vmll
dycpIGluc3RhbmNlb2Yga2xhc3MpIHsgcmV0dXJuIHZpZXc7IH0KKyAgICAgIHZpZXcgPSBnZXQo
dmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICB9CisgIH0sCisKKyAgLyoqCisgICAgV2hlbiB0aGUg
cGFyZW50IHZpZXcgY2hhbmdlcywgcmVjdXJzaXZlbHkgaW52YWxpZGF0ZSBgY29udHJvbGxlcmAK
KworICAgIEBtZXRob2QgX3BhcmVudFZpZXdEaWRDaGFuZ2UKKyAgICBAcHJpdmF0ZQorICAqLwor
ICBfcGFyZW50Vmlld0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ19wYXJlbnRWaWV3JywgZnVu
Y3Rpb24oKSB7CisgICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQorCisgICAg
dGhpcy50cmlnZ2VyKCdwYXJlbnRWaWV3RGlkQ2hhbmdlJyk7CisKKyAgICBpZiAoZ2V0KHRoaXMs
ICdwYXJlbnRWaWV3LmNvbnRyb2xsZXInKSAmJiAhZ2V0KHRoaXMsICdjb250cm9sbGVyJykpIHsK
KyAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2NvbnRyb2xsZXInKTsKKyAgICB9Cisg
IH0pLAorCisgIF9jb250cm9sbGVyRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udHJvbGxl
cicsIGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0K
KworICAgIHRoaXMucmVyZW5kZXIoKTsKKworICAgIHRoaXMuZm9yRWFjaENoaWxkVmlldyhmdW5j
dGlvbih2aWV3KSB7CisgICAgICB2aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdjb250cm9sbGVyJyk7
CisgICAgfSk7CisgIH0pLAorCisgIGNsb25lS2V5d29yZHM6IGZ1bmN0aW9uKCkgeworICAgIHZh
ciB0ZW1wbGF0ZURhdGEgPSBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOworCisgICAgdmFyIGtl
eXdvcmRzID0gdGVtcGxhdGVEYXRhID8gRW1iZXIuY29weSh0ZW1wbGF0ZURhdGEua2V5d29yZHMp
IDoge307CisgICAgc2V0KGtleXdvcmRzLCAndmlldycsIGdldCh0aGlzLCAnY29uY3JldGVWaWV3
JykpOworICAgIHNldChrZXl3b3JkcywgJ192aWV3JywgdGhpcyk7CisgICAgc2V0KGtleXdvcmRz
LCAnY29udHJvbGxlcicsIGdldCh0aGlzLCAnY29udHJvbGxlcicpKTsKKworICAgIHJldHVybiBr
ZXl3b3JkczsKKyAgfSwKKworICAvKioKKyAgICBDYWxsZWQgb24geW91ciB2aWV3IHdoZW4gaXQg
c2hvdWxkIHB1c2ggc3RyaW5ncyBvZiBIVE1MIGludG8gYQorICAgIGBFbWJlci5SZW5kZXJCdWZm
ZXJgLiBNb3N0IHVzZXJzIHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGUgYHRlbXBsYXRlYAorICAg
IG9yIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnRpZXMgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC4KKwor
ICAgIEJ5IGRlZmF1bHQsIGBFbWJlci5WaWV3YCB3aWxsIGxvb2sgZm9yIGEgZnVuY3Rpb24gaW4g
dGhlIGB0ZW1wbGF0ZWAKKyAgICBwcm9wZXJ0eSBhbmQgaW52b2tlIGl0IHdpdGggdGhlIHZhbHVl
IG9mIGBjb250ZXh0YC4gVGhlIHZhbHVlIG9mCisgICAgYGNvbnRleHRgIHdpbGwgYmUgdGhlIHZp
ZXcncyBjb250cm9sbGVyIHVubGVzcyB5b3Ugb3ZlcnJpZGUgaXQuCisKKyAgICBAbWV0aG9kIHJl
bmRlcgorICAgIEBwYXJhbSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgVGhlIHJlbmRlciBi
dWZmZXIKKyAgKi8KKyAgcmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAgICAvLyBJZiB0aGlz
IHZpZXcgaGFzIGEgbGF5b3V0LCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisgICAg
Ly8gdGhlIGxheW91dCB0byByZW5kZXIgdGhlIHZpZXcncyB0ZW1wbGF0ZS4gT3RoZXJ3aXNlLCBy
ZW5kZXIgdGhlIHRlbXBsYXRlCisgICAgLy8gZGlyZWN0bHkuCisgICAgdmFyIHRlbXBsYXRlID0g
Z2V0KHRoaXMsICdsYXlvdXQnKSB8fCBnZXQodGhpcywgJ3RlbXBsYXRlJyk7CisKKyAgICBpZiAo
dGVtcGxhdGUpIHsKKyAgICAgIHZhciBjb250ZXh0ID0gZ2V0KHRoaXMsICdjb250ZXh0Jyk7Cisg
ICAgICB2YXIga2V5d29yZHMgPSB0aGlzLmNsb25lS2V5d29yZHMoKTsKKyAgICAgIHZhciBvdXRw
dXQ7CisKKyAgICAgIHZhciBkYXRhID0geworICAgICAgICB2aWV3OiB0aGlzLAorICAgICAgICBi
dWZmZXI6IGJ1ZmZlciwKKyAgICAgICAgaXNSZW5kZXJEYXRhOiB0cnVlLAorICAgICAgICBrZXl3
b3Jkczoga2V5d29yZHMsCisgICAgICAgIGluc2lkZUdyb3VwOiBnZXQodGhpcywgJ3RlbXBsYXRl
RGF0YS5pbnNpZGVHcm91cCcpCisgICAgICB9OworCisgICAgICAvLyBJbnZva2UgdGhlIHRlbXBs
YXRlIHdpdGggdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGNvbnRleHQsIHdoaWNoCisgICAgICAvLyBp
cyB0aGUgdmlldydzIGNvbnRyb2xsZXIgYnkgZGVmYXVsdC4gQSBoYXNoIG9mIGRhdGEgaXMgYWxz
byBwYXNzZWQgdGhhdCBwcm92aWRlcworICAgICAgLy8gdGhlIHRlbXBsYXRlIHdpdGggYWNjZXNz
IHRvIHRoZSB2aWV3IGFuZCByZW5kZXIgYnVmZmVyLgorCisgICAgICBFbWJlci5hc3NlcnQoJ3Rl
bXBsYXRlIG11c3QgYmUgYSBmdW5jdGlvbi4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgRW1iZXIuSGFu
ZGxlYmFycy5jb21waWxlKCIuLi4iKSBvciBzcGVjaWZ5IHRlbXBsYXRlTmFtZSBpbnN0ZWFkPycs
IHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ2Z1bmN0aW9uJyk7CisgICAgICAvLyBUaGUgdGVtcGxhdGUg
c2hvdWxkIHdyaXRlIGRpcmVjdGx5IHRvIHRoZSByZW5kZXIgYnVmZmVyIGluc3RlYWQKKyAgICAg
IC8vIG9mIHJldHVybmluZyBhIHN0cmluZy4KKyAgICAgIG91dHB1dCA9IHRlbXBsYXRlKGNvbnRl
eHQsIHsgZGF0YTogZGF0YSB9KTsKKworICAgICAgLy8gSWYgdGhlIHRlbXBsYXRlIHJldHVybmVk
IGEgc3RyaW5nIGluc3RlYWQgb2Ygd3JpdGluZyB0byB0aGUgYnVmZmVyLAorICAgICAgLy8gcHVz
aCB0aGUgc3RyaW5nIG9udG8gdGhlIGJ1ZmZlci4KKyAgICAgIGlmIChvdXRwdXQgIT09IHVuZGVm
aW5lZCkgeyBidWZmZXIucHVzaChvdXRwdXQpOyB9CisgICAgfQorICB9LAorCisgIC8qKgorICAg
IFJlbmRlcnMgdGhlIHZpZXcgYWdhaW4uIFRoaXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2Ygd2hl
dGhlciB0aGUKKyAgICB2aWV3IGlzIGFscmVhZHkgaW4gdGhlIERPTSBvciBub3QuIElmIHRoZSB2
aWV3IGlzIGluIHRoZSBET00sIHRoZQorICAgIHJlbmRlcmluZyBwcm9jZXNzIHdpbGwgYmUgZGVm
ZXJyZWQgdG8gZ2l2ZSBiaW5kaW5ncyBhIGNoYW5jZQorICAgIHRvIHN5bmNocm9uaXplLgorCisg
ICAgSWYgY2hpbGRyZW4gd2VyZSBhZGRlZCBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzIHVz
aW5nIGBhcHBlbmRDaGlsZGAsCisgICAgYHJlcmVuZGVyYCB3aWxsIHJlbW92ZSB0aGVtLCBiZWNh
dXNlIHRoZXkgd2lsbCBiZSBhZGRlZCBhZ2FpbgorICAgIGlmIG5lZWRlZCBieSB0aGUgbmV4dCBg
cmVuZGVyYC4KKworICAgIEluIGdlbmVyYWwsIGlmIHRoZSBkaXNwbGF5IG9mIHlvdXIgdmlldyBj
aGFuZ2VzLCB5b3Ugc2hvdWxkIG1vZGlmeQorICAgIHRoZSBET00gZWxlbWVudCBkaXJlY3RseSBp
bnN0ZWFkIG9mIG1hbnVhbGx5IGNhbGxpbmcgYHJlcmVuZGVyYCwgd2hpY2ggY2FuCisgICAgYmUg
c2xvdy4KKworICAgIEBtZXRob2QgcmVyZW5kZXIKKyAgKi8KKyAgcmVyZW5kZXI6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5yZXJlbmRlcih0aGlzKTsKKyAgfSwK
KworICBjbGVhclJlbmRlcmVkQ2hpbGRyZW46IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZW5ndGhC
ZWZvcmUgPSB0aGlzLmxlbmd0aEJlZm9yZVJlbmRlciwKKyAgICAgICAgbGVuZ3RoQWZ0ZXIgID0g
dGhpcy5sZW5ndGhBZnRlclJlbmRlcjsKKworICAgIC8vIElmIHRoZXJlIHdlcmUgY2hpbGQgdmll
d3MgY3JlYXRlZCBkdXJpbmcgdGhlIGxhc3QgY2FsbCB0byByZW5kZXIoKSwKKyAgICAvLyByZW1v
dmUgdGhlbSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXkgd2lsbCBiZSByZS1jcmVhdGVk
IHdoZW4KKyAgICAvLyB3ZSByZS1yZW5kZXIuCisKKyAgICAvLyBWSUVXLVRPRE86IFVuaXQgdGVz
dCB0aGlzIHBhdGguCisgICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOworICAg
IGZvciAodmFyIGk9bGVuZ3RoQWZ0ZXItMTsgaT49bGVuZ3RoQmVmb3JlOyBpLS0pIHsKKyAgICAg
IGlmIChjaGlsZFZpZXdzW2ldKSB7IGNoaWxkVmlld3NbaV0uZGVzdHJveSgpOyB9CisgICAgfQor
ICB9LAorCisgIC8qKgorICAgIEl0ZXJhdGVzIG92ZXIgdGhlIHZpZXcncyBgY2xhc3NOYW1lQmlu
ZGluZ3NgIGFycmF5LCBpbnNlcnRzIHRoZSB2YWx1ZQorICAgIG9mIHRoZSBzcGVjaWZpZWQgcHJv
cGVydHkgaW50byB0aGUgYGNsYXNzTmFtZXNgIGFycmF5LCB0aGVuIGNyZWF0ZXMgYW4KKyAgICBv
YnNlcnZlciB0byB1cGRhdGUgdGhlIHZpZXcncyBlbGVtZW50IGlmIHRoZSBib3VuZCBwcm9wZXJ0
eSBldmVyIGNoYW5nZXMKKyAgICBpbiB0aGUgZnV0dXJlLgorCisgICAgQG1ldGhvZCBfYXBwbHlD
bGFzc05hbWVCaW5kaW5ncworICAgIEBwcml2YXRlCisgICovCisgIF9hcHBseUNsYXNzTmFtZUJp
bmRpbmdzOiBmdW5jdGlvbihjbGFzc0JpbmRpbmdzKSB7CisgICAgdmFyIGNsYXNzTmFtZXMgPSB0
aGlzLmNsYXNzTmFtZXMsCisgICAgZWxlbSwgbmV3Q2xhc3MsIGRhc2hlcml6ZWRDbGFzczsKKwor
ICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGNvbmZpZ3VyZWQgYmluZGluZ3MuIFRoZXNl
IHdpbGwgYmUgZWl0aGVyCisgICAgLy8gcHJvcGVydHkgbmFtZXMgKCdpc1VyZ2VudCcpIG9yIHBy
b3BlcnR5IHBhdGhzIHJlbGF0aXZlIHRvIHRoZSB2aWV3CisgICAgLy8gKCdjb250ZW50LmlzVXJn
ZW50JykKKyAgICBhX2ZvckVhY2goY2xhc3NCaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewor
CisgICAgICAvLyBWYXJpYWJsZSBpbiB3aGljaCB0aGUgb2xkIGNsYXNzIHZhbHVlIGlzIHNhdmVk
LiBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24KKyAgICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFi
bGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmluZyB0byByZW1vdmUgd2hlbgorICAgICAgLy8gdGhl
IHByb3BlcnR5IGNoYW5nZXMuCisgICAgICB2YXIgb2xkQ2xhc3M7CisgICAgICAvLyBFeHRyYWN0
IGp1c3QgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSBiaW5kaW5ncyBsaWtlICdmb286YmFyJworICAg
ICAgdmFyIHBhcnNlZFBhdGggPSBFbWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0aChiaW5kaW5n
KTsKKworICAgICAgLy8gU2V0IHVwIGFuIG9ic2VydmVyIG9uIHRoZSBjb250ZXh0LiBJZiB0aGUg
cHJvcGVydHkgY2hhbmdlcywgdG9nZ2xlIHRoZQorICAgICAgLy8gY2xhc3MgbmFtZS4KKyAgICAg
IHZhciBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQg
dmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICAgIG5ld0NsYXNzID0gdGhpcy5fY2xhc3NTdHJp
bmdGb3JQcm9wZXJ0eShiaW5kaW5nKTsKKyAgICAgICAgZWxlbSA9IHRoaXMuJCgpOworCisgICAg
ICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQs
IHJlbW92ZSBpdC4KKyAgICAgICAgaWYgKG9sZENsYXNzKSB7CisgICAgICAgICAgZWxlbS5yZW1v
dmVDbGFzcyhvbGRDbGFzcyk7CisgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBjbGFzc05h
bWVzIHNvIHRoYXQgaWYgdGhlIHZpZXcgZ2V0cyByZXJlbmRlcmVkLAorICAgICAgICAgIC8vIHRo
ZSBjbGFzcyBkb2Vzbid0IGdldCBhZGRlZCBiYWNrIHRvIHRoZSBET00uCisgICAgICAgICAgY2xh
c3NOYW1lcy5yZW1vdmVPYmplY3Qob2xkQ2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
SWYgbmVjZXNzYXJ5LCBhZGQgYSBuZXcgY2xhc3MuIE1ha2Ugc3VyZSB3ZSBrZWVwIHRyYWNrIG9m
IGl0IHNvCisgICAgICAgIC8vIGl0IGNhbiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgICAg
ICAgIGlmIChuZXdDbGFzcykgeworICAgICAgICAgIGVsZW0uYWRkQ2xhc3MobmV3Q2xhc3MpOwor
ICAgICAgICAgIG9sZENsYXNzID0gbmV3Q2xhc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgb2xkQ2xhc3MgPSBudWxsOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAvLyBHZXQg
dGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBwcm9wZXJ0eSBhdCBpdHMgY3VycmVudCB2YWx1ZQorICAg
ICAgZGFzaGVyaXplZENsYXNzID0gdGhpcy5fY2xhc3NTdHJpbmdGb3JQcm9wZXJ0eShiaW5kaW5n
KTsKKworICAgICAgaWYgKGRhc2hlcml6ZWRDbGFzcykgeworICAgICAgICAvLyBFbnN1cmUgdGhh
dCBpdCBnZXRzIGludG8gdGhlIGNsYXNzTmFtZXMgYXJyYXkKKyAgICAgICAgLy8gc28gaXQgaXMg
ZGlzcGxheWVkIHdoZW4gd2UgcmVuZGVyLgorICAgICAgICBhX2FkZE9iamVjdChjbGFzc05hbWVz
LCBkYXNoZXJpemVkQ2xhc3MpOworCisgICAgICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhl
IGNsYXNzIG5hbWUgc28gd2UgY2FuIHJlbW92ZSBpdAorICAgICAgICAvLyBpZiB0aGUgb2JzZXJ2
ZXIgZmlyZXMuIFJlbWVtYmVyIHRoYXQgdGhpcyB2YXJpYWJsZSBoYXMKKyAgICAgICAgLy8gYmVl
biBjbG9zZWQgb3ZlciBieSB0aGUgb2JzZXJ2ZXIuCisgICAgICAgIG9sZENsYXNzID0gZGFzaGVy
aXplZENsYXNzOworICAgICAgfQorCisgICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywg
cGFyc2VkUGF0aC5wYXRoLCBvYnNlcnZlcik7CisgICAgICAvLyBSZW1vdmUgY2xhc3NOYW1lIHNv
IHdoZW4gdGhlIHZpZXcgaXMgcmVyZW5kZXJlZCwKKyAgICAgIC8vIHRoZSBjbGFzc05hbWUgaXMg
YWRkZWQgYmFzZWQgb24gYmluZGluZyByZWV2YWx1YXRpb24KKyAgICAgIHRoaXMub25lKCd3aWxs
Q2xlYXJSZW5kZXInLCBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKG9sZENsYXNzKSB7CisgICAg
ICAgICAgY2xhc3NOYW1lcy5yZW1vdmVPYmplY3Qob2xkQ2xhc3MpOworICAgICAgICAgIG9sZENs
YXNzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICB9LCB0aGlzKTsKKyAgfSwK
KworICAvKioKKyAgICBJdGVyYXRlcyB0aHJvdWdoIHRoZSB2aWV3J3MgYXR0cmlidXRlIGJpbmRp
bmdzLCBzZXRzIHVwIG9ic2VydmVycyBmb3IgZWFjaCwKKyAgICB0aGVuIGFwcGxpZXMgdGhlIGN1
cnJlbnQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIHBhc3NlZCByZW5kZXIgYnVmZmVy
LgorCisgICAgQG1ldGhvZCBfYXBwbHlBdHRyaWJ1dGVCaW5kaW5ncworICAgIEBwYXJhbSB7RW1i
ZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIKKyAgICBAcHJpdmF0ZQorICAqLworICBfYXBwbHlBdHRy
aWJ1dGVCaW5kaW5nczogZnVuY3Rpb24oYnVmZmVyLCBhdHRyaWJ1dGVCaW5kaW5ncykgeworICAg
IHZhciBhdHRyaWJ1dGVWYWx1ZSwgZWxlbTsKKworICAgIGFfZm9yRWFjaChhdHRyaWJ1dGVCaW5k
aW5ncywgZnVuY3Rpb24oYmluZGluZykgeworICAgICAgdmFyIHNwbGl0ID0gYmluZGluZy5zcGxp
dCgnOicpLAorICAgICAgICAgIHByb3BlcnR5ID0gc3BsaXRbMF0sCisgICAgICAgICAgYXR0cmli
dXRlTmFtZSA9IHNwbGl0WzFdIHx8IHByb3BlcnR5OworCisgICAgICAvLyBDcmVhdGUgYW4gb2Jz
ZXJ2ZXIgdG8gYWRkL3JlbW92ZS9jaGFuZ2UgdGhlIGF0dHJpYnV0ZSBpZiB0aGUKKyAgICAgIC8v
IEphdmFTY3JpcHQgcHJvcGVydHkgY2hhbmdlcy4KKyAgICAgIHZhciBvYnNlcnZlciA9IGZ1bmN0
aW9uKCkgeworICAgICAgICBlbGVtID0gdGhpcy4kKCk7CisKKyAgICAgICAgYXR0cmlidXRlVmFs
dWUgPSBnZXQodGhpcywgcHJvcGVydHkpOworCisgICAgICAgIEVtYmVyLlZpZXcuYXBwbHlBdHRy
aWJ1dGVCaW5kaW5ncyhlbGVtLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7CisgICAg
ICB9OworCisgICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywgcHJvcGVydHksIG9ic2Vy
dmVyKTsKKworICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHZhbHVlIGFuZCBhZGQgaXQg
dG8gdGhlIHJlbmRlciBidWZmZXIKKyAgICAgIC8vIGlmIG5lY2Vzc2FyeS4KKyAgICAgIGF0dHJp
YnV0ZVZhbHVlID0gZ2V0KHRoaXMsIHByb3BlcnR5KTsKKyAgICAgIEVtYmVyLlZpZXcuYXBwbHlB
dHRyaWJ1dGVCaW5kaW5ncyhidWZmZXIsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsK
KyAgICB9LCB0aGlzKTsKKyAgfSwKKworICAvKioKKyAgICBHaXZlbiBhIHByb3BlcnR5IG5hbWUs
IHJldHVybnMgYSBkYXNoZXJpemVkIHZlcnNpb24gb2YgdGhhdAorICAgIHByb3BlcnR5IG5hbWUg
aWYgdGhlIHByb3BlcnR5IGV2YWx1YXRlcyB0byBhIG5vbi1mYWxzeSB2YWx1ZS4KKworICAgIEZv
ciBleGFtcGxlLCBpZiB0aGUgdmlldyBoYXMgcHJvcGVydHkgYGlzVXJnZW50YCB0aGF0IGV2YWx1
YXRlcyB0byB0cnVlLAorICAgIHBhc3NpbmcgYGlzVXJnZW50YCB0byB0aGlzIG1ldGhvZCB3aWxs
IHJldHVybiBgImlzLXVyZ2VudCJgLgorCisgICAgQG1ldGhvZCBfY2xhc3NTdHJpbmdGb3JQcm9w
ZXJ0eQorICAgIEBwYXJhbSBwcm9wZXJ0eQorICAgIEBwcml2YXRlCisgICovCisgIF9jbGFzc1N0
cmluZ0ZvclByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0eSkgeworICAgIHZhciBwYXJzZWRQYXRo
ID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgocHJvcGVydHkpOworICAgIHZhciBwYXRo
ID0gcGFyc2VkUGF0aC5wYXRoOworCisgICAgdmFyIHZhbCA9IGdldCh0aGlzLCBwYXRoKTsKKyAg
ICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7Cisg
ICAgICB2YWwgPSBnZXQoRW1iZXIubG9va3VwLCBwYXRoKTsKKyAgICB9CisKKyAgICByZXR1cm4g
RW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXRoLCB2YWwsIHBhcnNlZFBhdGguY2xh
c3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKKyAgfSwKKworICAvLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8v
IEVMRU1FTlQgU1VQUE9SVAorICAvLworCisgIC8qKgorICAgIFJldHVybnMgdGhlIGN1cnJlbnQg
RE9NIGVsZW1lbnQgZm9yIHRoZSB2aWV3LgorCisgICAgQHByb3BlcnR5IGVsZW1lbnQKKyAgICBA
dHlwZSBET01FbGVtZW50CisgICovCisgIGVsZW1lbnQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KGtleSwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgcmV0
dXJuIHRoaXMuY3VycmVudFN0YXRlLnNldEVsZW1lbnQodGhpcywgdmFsdWUpOworICAgIH0gZWxz
ZSB7CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuZ2V0RWxlbWVudCh0aGlzKTsKKyAg
ICB9CisgIH0pLnByb3BlcnR5KCdfcGFyZW50VmlldycpLAorCisgIC8qKgorICAgIFJldHVybnMg
YSBqUXVlcnkgb2JqZWN0IGZvciB0aGlzIHZpZXcncyBlbGVtZW50LiBJZiB5b3UgcGFzcyBpbiBh
IHNlbGVjdG9yCisgICAgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIGpRdWVyeSBv
YmplY3QsIHVzaW5nIHRoZSBjdXJyZW50IGVsZW1lbnQKKyAgICBhcyBpdHMgYnVmZmVyLgorCisg
ICAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgYHZpZXcuJCgnbGknKWAgd2lsbCByZXR1cm4gYSBqUXVl
cnkgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICBhbGwgb2YgdGhlIGBsaWAgZWxlbWVudHMgaW5zaWRl
IHRoZSBET00gZWxlbWVudCBvZiB0aGlzIHZpZXcuCisKKyAgICBAbWV0aG9kICQKKyAgICBAcGFy
YW0ge1N0cmluZ30gW3NlbGVjdG9yXSBhIGpRdWVyeS1jb21wYXRpYmxlIHNlbGVjdG9yIHN0cmlu
ZworICAgIEByZXR1cm4ge2pRdWVyeX0gdGhlIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBET00gbm9k
ZQorICAqLworICAkOiBmdW5jdGlvbihzZWwpIHsKKyAgICByZXR1cm4gdGhpcy5jdXJyZW50U3Rh
dGUuJCh0aGlzLCBzZWwpOworICB9LAorCisgIG11dGF0ZUNoaWxkVmlld3M6IGZ1bmN0aW9uKGNh
bGxiYWNrKSB7CisgICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLAorICAgICAg
ICBpZHggPSBjaGlsZFZpZXdzLmxlbmd0aCwKKyAgICAgICAgdmlldzsKKworICAgIHdoaWxlKC0t
aWR4ID49IDApIHsKKyAgICAgIHZpZXcgPSBjaGlsZFZpZXdzW2lkeF07CisgICAgICBjYWxsYmFj
ayh0aGlzLCB2aWV3LCBpZHgpOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9LAorCisg
IGZvckVhY2hDaGlsZFZpZXc6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgdmFyIGNoaWxkVmll
d3MgPSB0aGlzLl9jaGlsZFZpZXdzOworCisgICAgaWYgKCFjaGlsZFZpZXdzKSB7IHJldHVybiB0
aGlzOyB9CisKKyAgICB2YXIgbGVuID0gY2hpbGRWaWV3cy5sZW5ndGgsCisgICAgICAgIHZpZXcs
IGlkeDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgeworICAgICAgdmll
dyA9IGNoaWxkVmlld3NbaWR4XTsKKyAgICAgIGNhbGxiYWNrKHZpZXcpOworICAgIH0KKworICAg
IHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVt
ZW50IHRvIHRoZSBzcGVjaWZpZWQgcGFyZW50IGVsZW1lbnQuCisKKyAgICBJZiB0aGUgdmlldyBk
b2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVzZW50YXRpb24geWV0LCBgY3JlYXRlRWxlbWVudCgp
YAorICAgIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCisKKyAgICBOb3RlIHRoYXQgdGhp
cyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00K
KyAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVu
dGlsIGFsbCBiaW5kaW5ncyBoYXZlCisgICAgZmluaXNoZWQgc3luY2hyb25pemluZy4KKworICAg
IFRoaXMgaXMgbm90IHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgeW91IHdpbGwgbmVlZCB0byBj
YWxsIGRpcmVjdGx5IHdoZW4KKyAgICBidWlsZGluZyB5b3VyIGFwcGxpY2F0aW9uLiBZb3UgbWln
aHQgY29uc2lkZXIgdXNpbmcgYEVtYmVyLkNvbnRhaW5lclZpZXdgCisgICAgaW5zdGVhZC4gSWYg
eW91IGRvIG5lZWQgdG8gdXNlIGBhcHBlbmRUb2AsIGJlIHN1cmUgdGhhdCB0aGUgdGFyZ2V0IGVs
ZW1lbnQKKyAgICB5b3UgYXJlIHByb3ZpZGluZyBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYEVtYmVy
LkFwcGxpY2F0aW9uYCBhbmQgZG9lcyBub3QKKyAgICBoYXZlIGFuIGFuY2VzdG9yIGVsZW1lbnQg
dGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gRW1iZXIgdmlldy4KKworICAgIEBtZXRob2QgYXBw
ZW5kVG8KKyAgICBAcGFyYW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0gQSBzZWxlY3Rvciwg
ZWxlbWVudCwgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3QKKyAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSByZWNlaXZlcgorICAqLworICBhcHBlbmRUbzogZnVuY3Rpb24odGFyZ2V0KSB7Cisg
ICAgLy8gU2NoZWR1bGUgdGhlIERPTSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQgYW5kIGFwcGVuZGVk
IHRvIHRoZSBnaXZlbgorICAgIC8vIGVsZW1lbnQgYWZ0ZXIgYmluZGluZ3MgaGF2ZSBzeW5jaHJv
bml6ZWQuCisgICAgdGhpcy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9uKCkgeworICAgICAg
RW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gYXBwZW5kIHRvICgiICsgdGFyZ2V0ICsgIikgYnV0
IHRoYXQgaXNuJ3QgaW4gdGhlIERPTSIsIEVtYmVyLiQodGFyZ2V0KS5sZW5ndGggPiAwKTsKKyAg
ICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgRW1iZXIu
Vmlldy4gQ29uc2lkZXIgdXNpbmcgRW1iZXIuQ29udGFpbmVyVmlldyBpbnN0ZWFkLiIsICFFbWJl
ci4kKHRhcmdldCkuaXMoJy5lbWJlci12aWV3JykgJiYgIUVtYmVyLiQodGFyZ2V0KS5wYXJlbnRz
KCkuaXMoJy5lbWJlci12aWV3JykpOworICAgICAgdGhpcy4kKCkuYXBwZW5kVG8odGFyZ2V0KTsK
KyAgICB9KTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFJlcGxhY2Vz
IHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50IGVsZW1lbnQgd2l0aCB0aGlzIHZp
ZXcncworICAgIGVsZW1lbnQuIElmIHRoZSB2aWV3IGRvZXMgbm90IGhhdmUgYW4gSFRNTCByZXBy
ZXNlbnRhdGlvbiB5ZXQsCisgICAgYGNyZWF0ZUVsZW1lbnQoKWAgd2lsbCBiZSBjYWxsZWQgYXV0
b21hdGljYWxseS4KKworICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBqdXN0IHNjaGVkdWxlcyB0
aGUgdmlldyB0byBiZSBhcHBlbmRlZDsgdGhlIERPTQorICAgIGVsZW1lbnQgd2lsbCBub3QgYmUg
YXBwZW5kZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdW50aWwgYWxsIGJpbmRpbmdzIGhhdmUKKyAg
ICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nCisKKyAgICBAbWV0aG9kIHJlcGxhY2VJbgorICAgIEBw
YXJhbSB7U3RyaW5nfERPTUVsZW1lbnR8alF1ZXJ5fSB0YXJnZXQgQSBzZWxlY3RvciwgZWxlbWVu
dCwgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3QKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3
fSByZWNlaXZlZAorICAqLworICByZXBsYWNlSW46IGZ1bmN0aW9uKHRhcmdldCkgeworICAgIEVt
YmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHJlcGxhY2UgaW4gKCIgKyB0YXJnZXQgKyAiKSBidXQg
dGhhdCBpc24ndCBpbiB0aGUgRE9NIiwgRW1iZXIuJCh0YXJnZXQpLmxlbmd0aCA+IDApOworICAg
IEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCByZXBsYWNlIGFuIGV4aXN0aW5nIEVtYmVyLlZpZXcu
IENvbnNpZGVyIHVzaW5nIEVtYmVyLkNvbnRhaW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIuJCh0
YXJnZXQpLmlzKCcuZW1iZXItdmlldycpICYmICFFbWJlci4kKHRhcmdldCkucGFyZW50cygpLmlz
KCcuZW1iZXItdmlldycpKTsKKworICAgIHRoaXMuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlv
bigpIHsKKyAgICAgIEVtYmVyLiQodGFyZ2V0KS5lbXB0eSgpOworICAgICAgdGhpcy4kKCkuYXBw
ZW5kVG8odGFyZ2V0KTsKKyAgICB9KTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8q
KgorICAgIFNjaGVkdWxlcyBhIERPTSBvcGVyYXRpb24gdG8gb2NjdXIgZHVyaW5nIHRoZSBuZXh0
IHJlbmRlciBwaGFzZS4gVGhpcworICAgIGVuc3VyZXMgdGhhdCBhbGwgYmluZGluZ3MgaGF2ZSBm
aW5pc2hlZCBzeW5jaHJvbml6aW5nIGJlZm9yZSB0aGUgdmlldyBpcworICAgIHJlbmRlcmVkLgor
CisgICAgVG8gdXNlLCBwYXNzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIERPTSBvcGVyYXRp
b24uCisKKyAgICBCZWZvcmUgeW91ciBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoaXMgdmlldyBhbmQg
YWxsIGNoaWxkIHZpZXdzIHdpbGwgcmVjZWl2ZQorICAgIHRoZSBgd2lsbEluc2VydEVsZW1lbnRg
IGV2ZW50LiBBZnRlciB5b3VyIGZ1bmN0aW9uIGlzIGludm9rZWQsIHRoaXMgdmlldworICAgIGFu
ZCBhbGwgb2YgaXRzIGNoaWxkIHZpZXdzIHdpbGwgcmVjZWl2ZSB0aGUgYGRpZEluc2VydEVsZW1l
bnRgIGV2ZW50LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZpZXcuX2luc2VydEVsZW1lbnRM
YXRlcihmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuY3JlYXRlRWxlbWVudCgpOworICAgICAgdGhp
cy4kKCkuYXBwZW5kVG8oJ2JvZHknKTsKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2Qg
X2luc2VydEVsZW1lbnRMYXRlcgorICAgIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlv
biB0aGF0IGluc2VydHMgdGhlIGVsZW1lbnQgaW50byB0aGUgRE9NCisgICAgQHByaXZhdGUKKyAg
Ki8KKyAgX2luc2VydEVsZW1lbnRMYXRlcjogZnVuY3Rpb24oZm4pIHsKKyAgICB0aGlzLl9zY2hl
ZHVsZWRJbnNlcnQgPSBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCAnX2lu
c2VydEVsZW1lbnQnLCBmbik7CisgIH0sCisKKyAgX2luc2VydEVsZW1lbnQ6IGZ1bmN0aW9uIChm
bikgeworICAgIHRoaXMuX3NjaGVkdWxlZEluc2VydCA9IG51bGw7CisgICAgdGhpcy5jdXJyZW50
U3RhdGUuaW5zZXJ0RWxlbWVudCh0aGlzLCBmbik7CisgIH0sCisKKyAgLyoqCisgICAgQXBwZW5k
cyB0aGUgdmlldydzIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50IGJvZHkuIElmIHRoZSB2aWV3IGRv
ZXMKKyAgICBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIHlldCwgYGNyZWF0ZUVsZW1l
bnQoKWAgd2lsbCBiZSBjYWxsZWQKKyAgICBhdXRvbWF0aWNhbGx5LgorCisgICAgSWYgeW91ciBh
cHBsaWNhdGlvbiB1c2VzIHRoZSBgcm9vdEVsZW1lbnRgIHByb3BlcnR5LCB5b3UgbXVzdCBhcHBl
bmQKKyAgICB0aGUgdmlldyB3aXRoaW4gdGhhdCBlbGVtZW50LiBSZW5kZXJpbmcgdmlld3Mgb3V0
c2lkZSBvZiB0aGUgYHJvb3RFbGVtZW50YAorICAgIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICBO
b3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5k
ZWQ7IHRoZSBET00KKyAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1
bWVudCBib2R5IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCisgICAgZmluaXNoZWQgc3luY2hyb25p
emluZy4KKworICAgIEBtZXRob2QgYXBwZW5kCisgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVj
ZWl2ZXIKKyAgKi8KKyAgYXBwZW5kOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5hcHBl
bmRUbyhkb2N1bWVudC5ib2R5KTsKKyAgfSwKKworICAvKioKKyAgICBSZW1vdmVzIHRoZSB2aWV3
J3MgZWxlbWVudCBmcm9tIHRoZSBlbGVtZW50IHRvIHdoaWNoIGl0IGlzIGF0dGFjaGVkLgorCisg
ICAgQG1ldGhvZCByZW1vdmUKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAq
LworICByZW1vdmU6IGZ1bmN0aW9uKCkgeworICAgIC8vIFdoYXQgd2Ugc2hvdWxkIHJlYWxseSBk
byBoZXJlIGlzIHdhaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AKKyAgICAvLyB0byBk
ZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmUtYXBwZW5kZWQgdG8gYSBkaWZmZXJl
bnQKKyAgICAvLyBlbGVtZW50LgorICAgIC8vIEluIHRoZSBpbnRlcmltLCB3ZSB3aWxsIGp1c3Qg
cmUtcmVuZGVyIGlmIHRoYXQgaGFwcGVucy4gSXQgaXMgbW9yZQorICAgIC8vIGltcG9ydGFudCB0
aGFuIGVsZW1lbnRzIGdldCBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICBpZiAoIXRoaXMucmVtb3Zl
ZEZyb21ET00pIHsgdGhpcy5kZXN0cm95RWxlbWVudCgpOyB9CisgICAgdGhpcy5pbnZva2VSZWN1
cnNpdmVseShmdW5jdGlvbih2aWV3KSB7CisgICAgICBpZiAodmlldy5jbGVhclJlbmRlcmVkQ2hp
bGRyZW4pIHsgdmlldy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsgfQorICAgIH0pOworICB9LAor
CisgIGVsZW1lbnRJZDogbnVsbCwKKworICAvKioKKyAgICBBdHRlbXB0cyB0byBkaXNjb3ZlciB0
aGUgZWxlbWVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuIFRoZSBkZWZhdWx0CisgICAgaW1wbGVt
ZW50YXRpb24gbG9va3MgZm9yIGFuIGVsZW1lbnQgd2l0aCBhbiBJRCBvZiBgZWxlbWVudElkYCAo
b3IgdGhlCisgICAgdmlldydzIGd1aWQgaWYgYGVsZW1lbnRJZGAgaXMgbnVsbCkuIFlvdSBjYW4g
b3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KKyAgICBwcm92aWRlIHlvdXIgb3duIGZvcm0gb2YgbG9v
a3VwLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZGlzY292ZXIgeW91cgorICAgIGVsZW1l
bnQgdXNpbmcgYSBDU1MgY2xhc3MgbmFtZSBpbnN0ZWFkIG9mIGFuIElELgorCisgICAgQG1ldGhv
ZCBmaW5kRWxlbWVudEluUGFyZW50RWxlbWVudAorICAgIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFy
ZW50RWxlbWVudCBUaGUgcGFyZW50J3MgRE9NIGVsZW1lbnQKKyAgICBAcmV0dXJuIHtET01FbGVt
ZW50fSBUaGUgZGlzY292ZXJlZCBlbGVtZW50CisgICovCisgIGZpbmRFbGVtZW50SW5QYXJlbnRF
bGVtZW50OiBmdW5jdGlvbihwYXJlbnRFbGVtKSB7CisgICAgdmFyIGlkID0gIiMiICsgdGhpcy5l
bGVtZW50SWQ7CisgICAgcmV0dXJuIEVtYmVyLiQoaWQpWzBdIHx8IEVtYmVyLiQoaWQsIHBhcmVu
dEVsZW0pWzBdOworICB9LAorCisgIC8qKgorICAgIENyZWF0ZXMgYSBET00gcmVwcmVzZW50YXRp
b24gb2YgdGhlIHZpZXcgYW5kIGFsbCBvZiBpdHMKKyAgICBjaGlsZCB2aWV3cyBieSByZWN1cnNp
dmVseSBjYWxsaW5nIHRoZSBgcmVuZGVyKClgIG1ldGhvZC4KKworICAgIEFmdGVyIHRoZSBlbGVt
ZW50IGhhcyBiZWVuIGNyZWF0ZWQsIGBkaWRJbnNlcnRFbGVtZW50YCB3aWxsCisgICAgYmUgY2Fs
bGVkIG9uIHRoaXMgdmlldyBhbmQgYWxsIG9mIGl0cyBjaGlsZCB2aWV3cy4KKworICAgIEBtZXRo
b2QgY3JlYXRlRWxlbWVudAorICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCisgICov
CisgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgIGlmIChnZXQodGhpcywgJ2VsZW1l
bnQnKSkgeyByZXR1cm4gdGhpczsgfQorCisgICAgdmFyIGJ1ZmZlciA9IHRoaXMucmVuZGVyVG9C
dWZmZXIoKTsKKyAgICBzZXQodGhpcywgJ2VsZW1lbnQnLCBidWZmZXIuZWxlbWVudCgpKTsKKwor
ICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIENhbGxlZCB3aGVuIGEgdmlldyBp
cyBnb2luZyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSBET00uCisKKyAgICBAZXZlbnQg
d2lsbEluc2VydEVsZW1lbnQKKyAgKi8KKyAgd2lsbEluc2VydEVsZW1lbnQ6IEVtYmVyLkssCisK
KyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgb2YgdGhlIHZpZXcgaGFzIGJlZW4g
aW5zZXJ0ZWQgaW50byB0aGUgRE9NCisgICAgb3IgYWZ0ZXIgdGhlIHZpZXcgd2FzIHJlLXJlbmRl
cmVkLiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueQorICAgIHNldCB1cCB0aGF0IHJl
cXVpcmVzIGFuIGVsZW1lbnQgaW4gdGhlIGRvY3VtZW50IGJvZHkuCisKKyAgICBAZXZlbnQgZGlk
SW5zZXJ0RWxlbWVudAorICAqLworICBkaWRJbnNlcnRFbGVtZW50OiBFbWJlci5LLAorCisgIC8q
KgorICAgIENhbGxlZCB3aGVuIHRoZSB2aWV3IGlzIGFib3V0IHRvIHJlcmVuZGVyLCBidXQgYmVm
b3JlIGFueXRoaW5nIGhhcworICAgIGJlZW4gdG9ybiBkb3duLiBUaGlzIGlzIGEgZ29vZCBvcHBv
cnR1bml0eSB0byB0ZWFyIGRvd24gYW55IG1hbnVhbAorICAgIG9ic2VydmVycyB5b3UgaGF2ZSBp
bnN0YWxsZWQgYmFzZWQgb24gdGhlIERPTSBzdGF0ZQorCisgICAgQGV2ZW50IHdpbGxDbGVhclJl
bmRlcgorICAqLworICB3aWxsQ2xlYXJSZW5kZXI6IEVtYmVyLkssCisKKyAgLyoqCisgICAgUnVu
IHRoaXMgY2FsbGJhY2sgb24gdGhlIGN1cnJlbnQgdmlldyAodW5sZXNzIGluY2x1ZGVTZWxmIGlz
IGZhbHNlKSBhbmQgcmVjdXJzaXZlbHkgb24gY2hpbGQgdmlld3MuCisKKyAgICBAbWV0aG9kIGlu
dm9rZVJlY3Vyc2l2ZWx5CisgICAgQHBhcmFtIGZuIHtGdW5jdGlvbn0KKyAgICBAcGFyYW0gaW5j
bHVkZVNlbGYge0Jvb2xlYW59IEluY2x1ZGVzIGl0c2VsZiBpZiB0cnVlLgorICAgIEBwcml2YXRl
CisgICovCisgIGludm9rZVJlY3Vyc2l2ZWx5OiBmdW5jdGlvbihmbiwgaW5jbHVkZVNlbGYpIHsK
KyAgICB2YXIgY2hpbGRWaWV3cyA9IChpbmNsdWRlU2VsZiA9PT0gZmFsc2UpID8gdGhpcy5fY2hp
bGRWaWV3cyA6IFt0aGlzXTsKKyAgICB2YXIgY3VycmVudFZpZXdzLCB2aWV3LCBjdXJyZW50Q2hp
bGRWaWV3czsKKworICAgIHdoaWxlIChjaGlsZFZpZXdzLmxlbmd0aCkgeworICAgICAgY3VycmVu
dFZpZXdzID0gY2hpbGRWaWV3cy5zbGljZSgpOworICAgICAgY2hpbGRWaWV3cyA9IFtdOworCisg
ICAgICBmb3IgKHZhciBpPTAsIGw9Y3VycmVudFZpZXdzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAg
ICAgICAgdmlldyA9IGN1cnJlbnRWaWV3c1tpXTsKKyAgICAgICAgY3VycmVudENoaWxkVmlld3Mg
PSB2aWV3Ll9jaGlsZFZpZXdzID8gdmlldy5fY2hpbGRWaWV3cy5zbGljZSgwKSA6IG51bGw7Cisg
ICAgICAgIGZuKHZpZXcpOworICAgICAgICBpZiAoY3VycmVudENoaWxkVmlld3MpIHsKKyAgICAg
ICAgICBjaGlsZFZpZXdzLnB1c2guYXBwbHkoY2hpbGRWaWV3cywgY3VycmVudENoaWxkVmlld3Mp
OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIHRyaWdnZXJSZWN1cnNpdmVs
eTogZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgdmFyIGNoaWxkVmlld3MgPSBbdGhpc10sIGN1
cnJlbnRWaWV3cywgdmlldywgY3VycmVudENoaWxkVmlld3M7CisKKyAgICB3aGlsZSAoY2hpbGRW
aWV3cy5sZW5ndGgpIHsKKyAgICAgIGN1cnJlbnRWaWV3cyA9IGNoaWxkVmlld3Muc2xpY2UoKTsK
KyAgICAgIGNoaWxkVmlld3MgPSBbXTsKKworICAgICAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRW
aWV3cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHZpZXcgPSBjdXJyZW50Vmlld3NbaV07
CisgICAgICAgIGN1cnJlbnRDaGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cyA/IHZpZXcuX2No
aWxkVmlld3Muc2xpY2UoMCkgOiBudWxsOworICAgICAgICBpZiAodmlldy50cmlnZ2VyKSB7IHZp
ZXcudHJpZ2dlcihldmVudE5hbWUpOyB9CisgICAgICAgIGlmIChjdXJyZW50Q2hpbGRWaWV3cykg
eworICAgICAgICAgIGNoaWxkVmlld3MucHVzaC5hcHBseShjaGlsZFZpZXdzLCBjdXJyZW50Q2hp
bGRWaWV3cyk7CisgICAgICAgIH0KKworICAgICAgfQorICAgIH0KKyAgfSwKKworICB2aWV3SGll
cmFyY2h5Q29sbGVjdGlvbjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGN1cnJlbnRWaWV3LCB2aWV3
Q29sbGVjdGlvbiA9IG5ldyBWaWV3Q29sbGVjdGlvbihbdGhpc10pOworCisgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCB2aWV3Q29sbGVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgY3VycmVudFZp
ZXcgPSB2aWV3Q29sbGVjdGlvbi5vYmplY3RBdChpKTsKKyAgICAgIGlmIChjdXJyZW50Vmlldy5f
Y2hpbGRWaWV3cykgeworICAgICAgICB2aWV3Q29sbGVjdGlvbi5wdXNoLmFwcGx5KHZpZXdDb2xs
ZWN0aW9uLCBjdXJyZW50Vmlldy5fY2hpbGRWaWV3cyk7CisgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIHZpZXdDb2xsZWN0aW9uOworICB9LAorCisgIC8qKgorICAgIERlc3Ryb3lzIGFueSBl
eGlzdGluZyBlbGVtZW50IGFsb25nIHdpdGggdGhlIGVsZW1lbnQgZm9yIGFueSBjaGlsZCB2aWV3
cworICAgIGFzIHdlbGwuIElmIHRoZSB2aWV3IGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGEgZWxl
bWVudCwgdGhlbiB0aGlzIG1ldGhvZAorICAgIHdpbGwgZG8gbm90aGluZy4KKworICAgIElmIHlv
dSBpbXBsZW1lbnQgYHdpbGxEZXN0cm95RWxlbWVudCgpYCBvbiB5b3VyIHZpZXcsIHRoZW4gdGhp
cyBtZXRob2Qgd2lsbAorICAgIGJlIGludm9rZWQgb24geW91ciB2aWV3IGJlZm9yZSB5b3VyIGVs
ZW1lbnQgaXMgZGVzdHJveWVkIHRvIGdpdmUgeW91IGEKKyAgICBjaGFuY2UgdG8gY2xlYW4gdXAg
YW55IGV2ZW50IGhhbmRsZXJzLCBldGMuCisKKyAgICBJZiB5b3Ugd3JpdGUgYSBgd2lsbERlc3Ry
b3lFbGVtZW50KClgIGhhbmRsZXIsIHlvdSBjYW4gYXNzdW1lIHRoYXQgeW91cgorICAgIGBkaWRJ
bnNlcnRFbGVtZW50KClgIGhhbmRsZXIgd2FzIGNhbGxlZCBlYXJsaWVyIGZvciB0aGUgc2FtZSBl
bGVtZW50LgorCisgICAgWW91IHNob3VsZCBub3QgY2FsbCBvciBvdmVycmlkZSB0aGlzIG1ldGhv
ZCB5b3Vyc2VsZiwgYnV0IHlvdSBtYXkKKyAgICB3YW50IHRvIGltcGxlbWVudCB0aGUgYWJvdmUg
Y2FsbGJhY2tzLgorCisgICAgQG1ldGhvZCBkZXN0cm95RWxlbWVudAorICAgIEByZXR1cm4ge0Vt
YmVyLlZpZXd9IHJlY2VpdmVyCisgICovCisgIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuZGVzdHJveUVsZW1lbnQodGhpcyk7CisgIH0s
CisKKyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgb2YgdGhlIHZpZXcgaXMgZ29p
bmcgdG8gYmUgZGVzdHJveWVkLiBPdmVycmlkZQorICAgIHRoaXMgZnVuY3Rpb24gdG8gZG8gYW55
IHRlYXJkb3duIHRoYXQgcmVxdWlyZXMgYW4gZWxlbWVudCwgbGlrZSByZW1vdmluZworICAgIGV2
ZW50IGxpc3RlbmVycy4KKworICAgIEBldmVudCB3aWxsRGVzdHJveUVsZW1lbnQKKyAgKi8KKyAg
d2lsbERlc3Ryb3lFbGVtZW50OiBFbWJlci5LLAorCisgIC8qKgorICAgIFRyaWdnZXJzIHRoZSBg
d2lsbERlc3Ryb3lFbGVtZW50YCBldmVudCAod2hpY2ggaW52b2tlcyB0aGUKKyAgICBgd2lsbERl
c3Ryb3lFbGVtZW50KClgIG1ldGhvZCBpZiBpdCBleGlzdHMpIG9uIHRoaXMgdmlldyBhbmQgYWxs
IGNoaWxkCisgICAgdmlld3MuCisKKyAgICBCZWZvcmUgdHJpZ2dlcmluZyBgd2lsbERlc3Ryb3lF
bGVtZW50YCwgaXQgZmlyc3QgdHJpZ2dlcnMgdGhlCisgICAgYHdpbGxDbGVhclJlbmRlcmAgZXZl
bnQgcmVjdXJzaXZlbHkuCisKKyAgICBAbWV0aG9kIF9ub3RpZnlXaWxsRGVzdHJveUVsZW1lbnQK
KyAgICBAcHJpdmF0ZQorICAqLworICBfbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50OiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgdmlld0NvbGxlY3Rpb24gPSB0aGlzLnZpZXdIaWVyYXJjaHlDb2xsZWN0
aW9uKCk7CisgICAgdmlld0NvbGxlY3Rpb24udHJpZ2dlcignd2lsbENsZWFyUmVuZGVyJyk7Cisg
ICAgdmlld0NvbGxlY3Rpb24udHJpZ2dlcignd2lsbERlc3Ryb3lFbGVtZW50Jyk7CisgICAgcmV0
dXJuIHZpZXdDb2xsZWN0aW9uOworICB9LAorCisgIC8qKgorICAgIElmIHRoaXMgdmlldydzIGVs
ZW1lbnQgY2hhbmdlcywgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgb2Ygb3VyCisg
ICAgY2hpbGQgdmlld3Mgc28gdGhhdCB3ZSBkbyBub3QgcmV0YWluIHJlZmVyZW5jZXMgdG8gRE9N
IGVsZW1lbnRzIHRoYXQgYXJlCisgICAgbm8gbG9uZ2VyIG5lZWRlZC4KKworICAgIEBtZXRob2Qg
X2VsZW1lbnREaWRDaGFuZ2UKKyAgICBAcHJpdmF0ZQorICAqLworICBfZWxlbWVudERpZENoYW5n
ZTogRW1iZXIub2JzZXJ2ZXIoJ2VsZW1lbnQnLCBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmZvckVh
Y2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgeworICAgICAgZGVsZXRlIG1ldGEodmlldykuY2Fj
aGUuZWxlbWVudDsKKyAgICB9KTsKKyAgfSksCisKKyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gdGhl
IHBhcmVudFZpZXcgcHJvcGVydHkgaGFzIGNoYW5nZWQuCisKKyAgICBAZXZlbnQgcGFyZW50Vmll
d0RpZENoYW5nZQorICAqLworICBwYXJlbnRWaWV3RGlkQ2hhbmdlOiBFbWJlci5LLAorCisgIGlu
c3RydW1lbnROYW1lOiAndmlldycsCisKKyAgaW5zdHJ1bWVudERldGFpbHM6IGZ1bmN0aW9uKGhh
c2gpIHsKKyAgICBoYXNoLnRlbXBsYXRlID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKTsKKyAg
ICB0aGlzLl9zdXBlcihoYXNoKTsKKyAgfSwKKworICBfcmVuZGVyVG9CdWZmZXI6IGZ1bmN0aW9u
KHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKSB7CisgICAgdGhpcy5sZW5ndGhCZWZvcmVS
ZW5kZXIgPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKKyAgICB2YXIgYnVmZmVyID0gdGhpcy5f
c3VwZXIocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pOworICAgIHRoaXMubGVuZ3RoQWZ0
ZXJSZW5kZXIgPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKKworICAgIHJldHVybiBidWZmZXI7
CisgIH0sCisKKyAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24gKGJ1ZmZlcikgewor
ICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5yZW5kZXJUb0J1ZmZlcklmTmVlZGVkKHRoaXMs
IGJ1ZmZlcik7CisgIH0sCisKKyAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAg
ICB0aGlzLmFwcGx5QXR0cmlidXRlc1RvQnVmZmVyKGJ1ZmZlcik7CisgICAgYnVmZmVyLnB1c2hP
cGVuaW5nVGFnKCk7CisgIH0sCisKKyAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgewor
ICAgIGJ1ZmZlci5wdXNoQ2xvc2luZ1RhZygpOworICB9LAorCisgIGFwcGx5QXR0cmlidXRlc1Rv
QnVmZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKKyAgICAvLyBDcmVhdGVzIG9ic2VydmVycyBmb3Ig
YWxsIHJlZ2lzdGVyZWQgY2xhc3MgbmFtZSBhbmQgYXR0cmlidXRlIGJpbmRpbmdzLAorICAgIC8v
IHRoZW4gYWRkcyB0aGVtIHRvIHRoZSBlbGVtZW50LgorICAgIHZhciBjbGFzc05hbWVCaW5kaW5n
cyA9IGdldCh0aGlzLCAnY2xhc3NOYW1lQmluZGluZ3MnKTsKKyAgICBpZiAoY2xhc3NOYW1lQmlu
ZGluZ3MubGVuZ3RoKSB7CisgICAgICB0aGlzLl9hcHBseUNsYXNzTmFtZUJpbmRpbmdzKGNsYXNz
TmFtZUJpbmRpbmdzKTsKKyAgICB9CisKKyAgICAvLyBQYXNzIHRoZSByZW5kZXIgYnVmZmVyIHNv
IHRoZSBtZXRob2QgY2FuIGFwcGx5IGF0dHJpYnV0ZXMgZGlyZWN0bHkuCisgICAgLy8gVGhpcyBp
c24ndCBuZWVkZWQgZm9yIGNsYXNzIG5hbWUgYmluZGluZ3MgYmVjYXVzZSB0aGV5IHVzZSB0aGUK
KyAgICAvLyBleGlzdGluZyBjbGFzc05hbWVzIGluZnJhc3RydWN0dXJlLgorICAgIHZhciBhdHRy
aWJ1dGVCaW5kaW5ncyA9IGdldCh0aGlzLCAnYXR0cmlidXRlQmluZGluZ3MnKTsKKyAgICBpZiAo
YXR0cmlidXRlQmluZGluZ3MubGVuZ3RoKSB7CisgICAgICB0aGlzLl9hcHBseUF0dHJpYnV0ZUJp
bmRpbmdzKGJ1ZmZlciwgYXR0cmlidXRlQmluZGluZ3MpOworICAgIH0KKworICAgIGJ1ZmZlci5z
ZXRDbGFzc2VzKHRoaXMuY2xhc3NOYW1lcyk7CisgICAgYnVmZmVyLmlkKHRoaXMuZWxlbWVudElk
KTsKKworICAgIHZhciByb2xlID0gZ2V0KHRoaXMsICdhcmlhUm9sZScpOworICAgIGlmIChyb2xl
KSB7CisgICAgICBidWZmZXIuYXR0cigncm9sZScsIHJvbGUpOworICAgIH0KKworICAgIGlmIChn
ZXQodGhpcywgJ2lzVmlzaWJsZScpID09PSBmYWxzZSkgeworICAgICAgYnVmZmVyLnN0eWxlKCdk
aXNwbGF5JywgJ25vbmUnKTsKKyAgICB9CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBTVEFOREFSRCBS
RU5ERVIgUFJPUEVSVElFUworICAvLworCisgIC8qKgorICAgIFRhZyBuYW1lIGZvciB0aGUgdmll
dydzIG91dGVyIGVsZW1lbnQuIFRoZSB0YWcgbmFtZSBpcyBvbmx5IHVzZWQgd2hlbiBhbgorICAg
IGVsZW1lbnQgaXMgZmlyc3QgY3JlYXRlZC4gSWYgeW91IGNoYW5nZSB0aGUgYHRhZ05hbWVgIGZv
ciBhbiBlbGVtZW50LCB5b3UKKyAgICBtdXN0IGRlc3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSB2aWV3
IGVsZW1lbnQuCisKKyAgICBCeSBkZWZhdWx0LCB0aGUgcmVuZGVyIGJ1ZmZlciB3aWxsIHVzZSBh
IGA8ZGl2PmAgdGFnIGZvciB2aWV3cy4KKworICAgIEBwcm9wZXJ0eSB0YWdOYW1lCisgICAgQHR5
cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworCisgIC8vIFdlIGxlYXZlIHRoaXMg
bnVsbCBieSBkZWZhdWx0IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAg
Ly8gdGhlIGRlZmF1bHQgY2FzZSBhbmQgYSB1c2VyLXNwZWNpZmllZCB0YWcuCisgIHRhZ05hbWU6
IG51bGwsCisKKyAgLyoqCisgICAgVGhlIFdBSS1BUklBIHJvbGUgb2YgdGhlIGNvbnRyb2wgcmVw
cmVzZW50ZWQgYnkgdGhpcyB2aWV3LiBGb3IgZXhhbXBsZSwgYQorICAgIGJ1dHRvbiBtYXkgaGF2
ZSBhIHJvbGUgb2YgdHlwZSAnYnV0dG9uJywgb3IgYSBwYW5lIG1heSBoYXZlIGEgcm9sZSBvZgor
ICAgIHR5cGUgJ2FsZXJ0ZGlhbG9nJy4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGFzc2lzdGl2
ZSBzb2Z0d2FyZSB0byBoZWxwCisgICAgdmlzdWFsbHkgY2hhbGxlbmdlZCB1c2VycyBuYXZpZ2F0
ZSByaWNoIHdlYiBhcHBsaWNhdGlvbnMuCisKKyAgICBUaGUgZnVsbCBsaXN0IG9mIHZhbGlkIFdB
SS1BUklBIHJvbGVzIGlzIGF2YWlsYWJsZSBhdDoKKyAgICBbaHR0cDovL3d3dy53My5vcmcvVFIv
d2FpLWFyaWEvcm9sZXMjcm9sZXNfY2F0ZWdvcml6YXRpb25dKGh0dHA6Ly93d3cudzMub3JnL1RS
L3dhaS1hcmlhL3JvbGVzI3JvbGVzX2NhdGVnb3JpemF0aW9uKQorCisgICAgQHByb3BlcnR5IGFy
aWFSb2xlCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBhcmlh
Um9sZTogbnVsbCwKKworICAvKioKKyAgICBTdGFuZGFyZCBDU1MgY2xhc3MgbmFtZXMgdG8gYXBw
bHkgdG8gdGhlIHZpZXcncyBvdXRlciBlbGVtZW50LiBUaGlzCisgICAgcHJvcGVydHkgYXV0b21h
dGljYWxseSBpbmhlcml0cyBhbnkgY2xhc3MgbmFtZXMgZGVmaW5lZCBieSB0aGUgdmlldydzCisg
ICAgc3VwZXJjbGFzc2VzIGFzIHdlbGwuCisKKyAgICBAcHJvcGVydHkgY2xhc3NOYW1lcworICAg
IEB0eXBlIEFycmF5CisgICAgQGRlZmF1bHQgWydlbWJlci12aWV3J10KKyAgKi8KKyAgY2xhc3NO
YW1lczogWydlbWJlci12aWV3J10sCisKKyAgLyoqCisgICAgQSBsaXN0IG9mIHByb3BlcnRpZXMg
b2YgdGhlIHZpZXcgdG8gYXBwbHkgYXMgY2xhc3MgbmFtZXMuIElmIHRoZSBwcm9wZXJ0eQorICAg
IGlzIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhhdCBzdHJpbmcgd2lsbCBiZSBhcHBs
aWVkIGFzIGEgY2xhc3MKKyAgICBuYW1lLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIEFw
cGxpZXMgdGhlICdoaWdoJyBjbGFzcyB0byB0aGUgdmlldyBlbGVtZW50CisgICAgRW1iZXIuVmll
dy5leHRlbmQoeworICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsncHJpb3JpdHknXQorICAgICAg
cHJpb3JpdHk6ICdoaWdoJworICAgIH0pOworICAgIGBgYAorCisgICAgSWYgdGhlIHZhbHVlIG9m
IHRoZSBwcm9wZXJ0eSBpcyBhIEJvb2xlYW4sIHRoZSBuYW1lIG9mIHRoYXQgcHJvcGVydHkgaXMK
KyAgICBhZGRlZCBhcyBhIGRhc2hlcml6ZWQgY2xhc3MgbmFtZS4KKworICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAvLyBBcHBsaWVzIHRoZSAnaXMtdXJnZW50JyBjbGFzcyB0byB0aGUgdmlldyBlbGVt
ZW50CisgICAgRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
aXNVcmdlbnQnXQorICAgICAgaXNVcmdlbnQ6IHRydWUKKyAgICB9KTsKKyAgICBgYGAKKworICAg
IElmIHlvdSB3b3VsZCBwcmVmZXIgdG8gdXNlIGEgY3VzdG9tIHZhbHVlIGluc3RlYWQgb2YgdGhl
IGRhc2hlcml6ZWQKKyAgICBwcm9wZXJ0eSBuYW1lLCB5b3UgY2FuIHBhc3MgYSBiaW5kaW5nIGxp
a2UgdGhpczoKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICAvLyBBcHBsaWVzIHRoZSAndXJnZW50
JyBjbGFzcyB0byB0aGUgdmlldyBlbGVtZW50CisgICAgRW1iZXIuVmlldy5leHRlbmQoeworICAg
ICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNVcmdlbnQ6dXJnZW50J10KKyAgICAgIGlzVXJnZW50
OiB0cnVlCisgICAgfSk7CisgICAgYGBgCisKKyAgICBUaGlzIGxpc3Qgb2YgcHJvcGVydGllcyBp
cyBpbmhlcml0ZWQgZnJvbSB0aGUgdmlldydzIHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgorCisgICAg
QHByb3BlcnR5IGNsYXNzTmFtZUJpbmRpbmdzCisgICAgQHR5cGUgQXJyYXkKKyAgICBAZGVmYXVs
dCBbXQorICAqLworICBjbGFzc05hbWVCaW5kaW5nczogRU1QVFlfQVJSQVksCisKKyAgLyoqCisg
ICAgQSBsaXN0IG9mIHByb3BlcnRpZXMgb2YgdGhlIHZpZXcgdG8gYXBwbHkgYXMgYXR0cmlidXRl
cy4gSWYgdGhlIHByb3BlcnR5IGlzCisgICAgYSBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSBvZiB0
aGF0IHN0cmluZyB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIGF0dHJpYnV0ZS4KKworICAgIGBgYGph
dmFzY3JpcHQKKyAgICAvLyBBcHBsaWVzIHRoZSB0eXBlIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVu
dAorICAgIC8vIHdpdGggdGhlIHZhbHVlICJidXR0b24iLCBsaWtlIDxkaXYgdHlwZT0iYnV0dG9u
Ij4KKyAgICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWyd0
eXBlJ10sCisgICAgICB0eXBlOiAnYnV0dG9uJworICAgIH0pOworICAgIGBgYAorCisgICAgSWYg
dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhIEJvb2xlYW4sIHRoZSBuYW1lIG9mIHRoYXQg
cHJvcGVydHkgaXMKKyAgICBhZGRlZCBhcyBhbiBhdHRyaWJ1dGUuCisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gUmVuZGVycyBzb21ldGhpbmcgbGlrZSA8ZGl2IGVuYWJsZWQ9ImVuYWJsZWQi
PgorICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2Vu
YWJsZWQnXSwKKyAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICB9KTsKKyAgICBgYGAKKworICAgIEBw
cm9wZXJ0eSBhdHRyaWJ1dGVCaW5kaW5ncworICAqLworICBhdHRyaWJ1dGVCaW5kaW5nczogRU1Q
VFlfQVJSQVksCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgorICAvLyBDT1JFIERJU1BMQVkgTUVUSE9EUworICAvLworCisgIC8q
KgorICAgIFNldHVwIGEgdmlldywgYnV0IGRvIG5vdCBmaW5pc2ggd2FraW5nIGl0IHVwLgorCisg
ICAgKiBjb25maWd1cmUgYGNoaWxkVmlld3NgCisgICAgKiByZWdpc3RlciB0aGUgdmlldyB3aXRo
IHRoZSBnbG9iYWwgdmlld3MgaGFzaCwgd2hpY2ggaXMgdXNlZCBmb3IgZXZlbnQKKyAgICAgIGRp
c3BhdGNoCisKKyAgICBAbWV0aG9kIGluaXQKKyAgICBAcHJpdmF0ZQorICAqLworICBpbml0OiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLmVsZW1lbnRJZCA9IHRoaXMuZWxlbWVudElkIHx8IGd1aWRG
b3IodGhpcyk7CisKKyAgICB0aGlzLl9zdXBlcigpOworCisgICAgLy8gc2V0dXAgY2hpbGQgdmll
d3MuIGJlIHN1cmUgdG8gY2xvbmUgdGhlIGNoaWxkIHZpZXdzIGFycmF5IGZpcnN0CisgICAgdGhp
cy5fY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsKKworICAgIEVtYmVyLmFz
c2VydCgiT25seSBhcnJheXMgYXJlIGFsbG93ZWQgZm9yICdjbGFzc05hbWVCaW5kaW5ncyciLCBF
bWJlci50eXBlT2YodGhpcy5jbGFzc05hbWVCaW5kaW5ncykgPT09ICdhcnJheScpOworICAgIHRo
aXMuY2xhc3NOYW1lQmluZGluZ3MgPSBFbWJlci5BKHRoaXMuY2xhc3NOYW1lQmluZGluZ3Muc2xp
Y2UoKSk7CisKKyAgICBFbWJlci5hc3NlcnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZvciAn
Y2xhc3NOYW1lcyciLCBFbWJlci50eXBlT2YodGhpcy5jbGFzc05hbWVzKSA9PT0gJ2FycmF5Jyk7
CisgICAgdGhpcy5jbGFzc05hbWVzID0gRW1iZXIuQSh0aGlzLmNsYXNzTmFtZXMuc2xpY2UoKSk7
CisgIH0sCisKKyAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKHZpZXcsIG9wdGlvbnMpIHsKKyAgICBy
ZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuYXBwZW5kQ2hpbGQodGhpcywgdmlldywgb3B0aW9ucyk7
CisgIH0sCisKKyAgLyoqCisgICAgUmVtb3ZlcyB0aGUgY2hpbGQgdmlldyBmcm9tIHRoZSBwYXJl
bnQgdmlldy4KKworICAgIEBtZXRob2QgcmVtb3ZlQ2hpbGQKKyAgICBAcGFyYW0ge0VtYmVyLlZp
ZXd9IHZpZXcKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAqLworICByZW1v
dmVDaGlsZDogZnVuY3Rpb24odmlldykgeworICAgIC8vIElmIHdlJ3JlIGRlc3Ryb3lpbmcsIHRo
ZSBlbnRpcmUgc3VidHJlZSB3aWxsIGJlCisgICAgLy8gZnJlZWQsIGFuZCB0aGUgRE9NIHdpbGwg
YmUgaGFuZGxlZCBzZXBhcmF0ZWx5LAorICAgIC8vIHNvIG5vIG5lZWQgdG8gbWVzcyB3aXRoIGNo
aWxkVmlld3MuCisgICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQorCisgICAg
Ly8gdXBkYXRlIHBhcmVudCBub2RlCisgICAgc2V0KHZpZXcsICdfcGFyZW50VmlldycsIG51bGwp
OworCisgICAgLy8gcmVtb3ZlIHZpZXcgZnJvbSBjaGlsZFZpZXdzIGFycmF5LgorICAgIHZhciBj
aGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKKworICAgIEVtYmVyLkVudW1lcmFibGVVdGls
cy5yZW1vdmVPYmplY3QoY2hpbGRWaWV3cywgdmlldyk7CisKKyAgICB0aGlzLnByb3BlcnR5RGlk
Q2hhbmdlKCdjaGlsZFZpZXdzJyk7IC8vIEhVSD8hIHdoYXQgaGFwcGVuZWQgdG8gd2lsbCBjaGFu
Z2U/CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBSZW1vdmVzIGFsbCBj
aGlsZHJlbiBmcm9tIHRoZSBgcGFyZW50Vmlld2AuCisKKyAgICBAbWV0aG9kIHJlbW92ZUFsbENo
aWxkcmVuCisgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAgKi8KKyAgcmVtb3Zl
QWxsQ2hpbGRyZW46IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm11dGF0ZUNoaWxkVmll
d3MoZnVuY3Rpb24ocGFyZW50VmlldywgdmlldykgeworICAgICAgcGFyZW50Vmlldy5yZW1vdmVD
aGlsZCh2aWV3KTsKKyAgICB9KTsKKyAgfSwKKworICBkZXN0cm95QWxsQ2hpbGRyZW46IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLm11dGF0ZUNoaWxkVmlld3MoZnVuY3Rpb24ocGFyZW50
VmlldywgdmlldykgeworICAgICAgdmlldy5kZXN0cm95KCk7CisgICAgfSk7CisgIH0sCisKKyAg
LyoqCisgICAgUmVtb3ZlcyB0aGUgdmlldyBmcm9tIGl0cyBgcGFyZW50Vmlld2AsIGlmIG9uZSBp
cyBmb3VuZC4gT3RoZXJ3aXNlCisgICAgZG9lcyBub3RoaW5nLgorCisgICAgQG1ldGhvZCByZW1v
dmVGcm9tUGFyZW50CisgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAgKi8KKyAg
cmVtb3ZlRnJvbVBhcmVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhcmVudCA9IHRoaXMuX3Bh
cmVudFZpZXc7CisKKyAgICAvLyBSZW1vdmUgRE9NIGVsZW1lbnQgZnJvbSBwYXJlbnQKKyAgICB0
aGlzLnJlbW92ZSgpOworCisgICAgaWYgKHBhcmVudCkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQodGhp
cyk7IH0KKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAvKioKKyAgICBZb3UgbXVzdCBjYWxs
IGBkZXN0cm95YCBvbiBhIHZpZXcgdG8gZGVzdHJveSB0aGUgdmlldyAoYW5kIGFsbCBvZiBpdHMK
KyAgICBjaGlsZCB2aWV3cykuIFRoaXMgd2lsbCByZW1vdmUgdGhlIHZpZXcgZnJvbSBhbnkgcGFy
ZW50IG5vZGUsIHRoZW4gbWFrZQorICAgIHN1cmUgdGhhdCB0aGUgRE9NIGVsZW1lbnQgbWFuYWdl
ZCBieSB0aGUgdmlldyBjYW4gYmUgcmVsZWFzZWQgYnkgdGhlCisgICAgbWVtb3J5IG1hbmFnZXIu
CisKKyAgICBAbWV0aG9kIGRlc3Ryb3kKKyAgKi8KKyAgZGVzdHJveTogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLAorICAgICAgICAvLyBnZXQgcGFy
ZW50VmlldyBiZWZvcmUgY2FsbGluZyBzdXBlciBiZWNhdXNlIGl0J2xsIGJlIGRlc3Ryb3llZAor
ICAgICAgICBub25WaXJ0dWFsUGFyZW50VmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpLAor
ICAgICAgICB2aWV3TmFtZSA9IHRoaXMudmlld05hbWUsCisgICAgICAgIGNoaWxkTGVuLCBpOwor
CisgICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJldHVybjsgfQorCisgICAgY2hpbGRMZW4gPSBj
aGlsZFZpZXdzLmxlbmd0aDsKKyAgICBmb3IgKGk9Y2hpbGRMZW4tMTsgaT49MDsgaS0tKSB7Cisg
ICAgICBjaGlsZFZpZXdzW2ldLnJlbW92ZWRGcm9tRE9NID0gdHJ1ZTsKKyAgICB9CisKKyAgICAv
LyByZW1vdmUgZnJvbSBub24tdmlydHVhbCBwYXJlbnQgdmlldyBpZiB2aWV3TmFtZSB3YXMgc3Bl
Y2lmaWVkCisgICAgaWYgKHZpZXdOYW1lICYmIG5vblZpcnR1YWxQYXJlbnRWaWV3KSB7CisgICAg
ICBub25WaXJ0dWFsUGFyZW50Vmlldy5zZXQodmlld05hbWUsIG51bGwpOworICAgIH0KKworICAg
IGNoaWxkTGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7CisgICAgZm9yIChpPWNoaWxkTGVuLTE7IGk+
PTA7IGktLSkgeworICAgICAgY2hpbGRWaWV3c1tpXS5kZXN0cm95KCk7CisgICAgfQorCisgICAg
cmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAgSW5zdGFudGlhdGVzIGEgdmlldyB0byBi
ZSBhZGRlZCB0byB0aGUgY2hpbGRWaWV3cyBhcnJheSBkdXJpbmcgdmlldworICAgIGluaXRpYWxp
emF0aW9uLiBZb3UgZ2VuZXJhbGx5IHdpbGwgbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkg
dW5sZXNzCisgICAgeW91IGFyZSBvdmVycmlkaW5nIGBjcmVhdGVDaGlsZFZpZXdzKClgLiBOb3Rl
IHRoYXQgdGhpcyBtZXRob2Qgd2lsbAorICAgIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBj
b3JyZWN0IHNldHRpbmdzIG9uIHRoZSBuZXcgdmlldyBpbnN0YW5jZSB0bworICAgIGFjdCBhcyBh
IGNoaWxkIG9mIHRoZSBwYXJlbnQuCisKKyAgICBAbWV0aG9kIGNyZWF0ZUNoaWxkVmlldworICAg
IEBwYXJhbSB7Q2xhc3N8U3RyaW5nfSB2aWV3Q2xhc3MKKyAgICBAcGFyYW0ge0hhc2h9IFthdHRy
c10gQXR0cmlidXRlcyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSBuZXcgaW5zdGFu
Y2UKKyAgKi8KKyAgY3JlYXRlQ2hpbGRWaWV3OiBmdW5jdGlvbih2aWV3LCBhdHRycykgeworICAg
IGlmICghdmlldykgeworICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiY3JlYXRlQ2hpbGRWaWV3
cyBmaXJzdCBhcmd1bWVudCBtdXN0IGV4aXN0Iik7CisgICAgfQorCisgICAgaWYgKHZpZXcuaXNW
aWV3ICYmIHZpZXcuX3BhcmVudFZpZXcgPT09IHRoaXMgJiYgdmlldy5jb250YWluZXIgPT09IHRo
aXMuY29udGFpbmVyKSB7CisgICAgICByZXR1cm4gdmlldzsKKyAgICB9CisKKyAgICBhdHRycyA9
IGF0dHJzIHx8IHt9OworICAgIGF0dHJzLl9wYXJlbnRWaWV3ID0gdGhpczsKKworICAgIGlmIChF
bWJlci5Db3JlVmlldy5kZXRlY3QodmlldykpIHsKKyAgICAgIGF0dHJzLnRlbXBsYXRlRGF0YSA9
IGF0dHJzLnRlbXBsYXRlRGF0YSB8fCBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOworCisgICAg
ICBhdHRycy5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgIHZpZXcgPSB2aWV3LmNy
ZWF0ZShhdHRycyk7CisKKyAgICAgIC8vIGRvbid0IHNldCB0aGUgcHJvcGVydHkgb24gYSB2aXJ0
dWFsIHZpZXcsIGFzIHRoZXkgYXJlIGludmlzaWJsZSB0bworICAgICAgLy8gY29uc3VtZXJzIG9m
IHRoZSB2aWV3IEFQSQorICAgICAgaWYgKHZpZXcudmlld05hbWUpIHsKKyAgICAgICAgc2V0KGdl
dCh0aGlzLCAnY29uY3JldGVWaWV3JyksIHZpZXcudmlld05hbWUsIHZpZXcpOworICAgICAgfQor
ICAgIH0gZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiB2aWV3KSB7CisgICAgICB2YXIgZnVs
bE5hbWUgPSAndmlldzonICsgdmlldzsKKyAgICAgIHZhciBWaWV3ID0gdGhpcy5jb250YWluZXIu
bG9va3VwRmFjdG9yeShmdWxsTmFtZSk7CisKKyAgICAgIEVtYmVyLmFzc2VydCgiQ291bGQgbm90
IGZpbmQgdmlldzogJyIgKyBmdWxsTmFtZSArICInIiwgISFWaWV3KTsKKworICAgICAgYXR0cnMu
dGVtcGxhdGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKKyAgICAgIHZpZXcgPSBW
aWV3LmNyZWF0ZShhdHRycyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVtYmVyLmFzc2VydCgnWW91
IG11c3QgcGFzcyBpbnN0YW5jZSBvciBzdWJjbGFzcyBvZiBWaWV3Jywgdmlldy5pc1ZpZXcpOwor
ICAgICAgYXR0cnMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7CisKKyAgICAgIGlmICghZ2V0
KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkgeworICAgICAgICBhdHRycy50ZW1wbGF0ZURhdGEgPSBn
ZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOworICAgICAgfQorCisgICAgICBFbWJlci5zZXRQcm9w
ZXJ0aWVzKHZpZXcsIGF0dHJzKTsKKworICAgIH0KKworICAgIHJldHVybiB2aWV3OworICB9LAor
CisgIGJlY2FtZVZpc2libGU6IEVtYmVyLkssCisgIGJlY2FtZUhpZGRlbjogRW1iZXIuSywKKwor
ICAvKioKKyAgICBXaGVuIHRoZSB2aWV3J3MgYGlzVmlzaWJsZWAgcHJvcGVydHkgY2hhbmdlcywg
dG9nZ2xlIHRoZSB2aXNpYmlsaXR5CisgICAgZWxlbWVudCBvZiB0aGUgYWN0dWFsIERPTSBlbGVt
ZW50LgorCisgICAgQG1ldGhvZCBfaXNWaXNpYmxlRGlkQ2hhbmdlCisgICAgQHByaXZhdGUKKyAg
Ki8KKyAgX2lzVmlzaWJsZURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2lzVmlzaWJsZScsIGZ1
bmN0aW9uKCkgeworICAgIHZhciAkZWwgPSB0aGlzLiQoKTsKKyAgICBpZiAoISRlbCkgeyByZXR1
cm47IH0KKworICAgIHZhciBpc1Zpc2libGUgPSBnZXQodGhpcywgJ2lzVmlzaWJsZScpOworCisg
ICAgJGVsLnRvZ2dsZShpc1Zpc2libGUpOworCisgICAgaWYgKHRoaXMuX2lzQW5jZXN0b3JIaWRk
ZW4oKSkgeyByZXR1cm47IH0KKworICAgIGlmIChpc1Zpc2libGUpIHsKKyAgICAgIHRoaXMuX25v
dGlmeUJlY2FtZVZpc2libGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fbm90aWZ5QmVj
YW1lSGlkZGVuKCk7CisgICAgfQorICB9KSwKKworICBfbm90aWZ5QmVjYW1lVmlzaWJsZTogZnVu
Y3Rpb24oKSB7CisgICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVWaXNpYmxlJyk7CisKKyAgICB0aGlz
LmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgeworICAgICAgdmFyIGlzVmlzaWJsZSA9
IGdldCh2aWV3LCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIGlmIChpc1Zpc2libGUgfHwgaXNWaXNp
YmxlID09PSBudWxsKSB7CisgICAgICAgIHZpZXcuX25vdGlmeUJlY2FtZVZpc2libGUoKTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBfbm90aWZ5QmVjYW1lSGlkZGVuOiBmdW5jdGlvbigp
IHsKKyAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUhpZGRlbicpOworICAgIHRoaXMuZm9yRWFjaENo
aWxkVmlldyhmdW5jdGlvbih2aWV3KSB7CisgICAgICB2YXIgaXNWaXNpYmxlID0gZ2V0KHZpZXcs
ICdpc1Zpc2libGUnKTsKKworICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpc1Zpc2libGUgPT09IG51
bGwpIHsKKyAgICAgICAgdmlldy5fbm90aWZ5QmVjYW1lSGlkZGVuKCk7CisgICAgICB9CisgICAg
fSk7CisgIH0sCisKKyAgX2lzQW5jZXN0b3JIaWRkZW46IGZ1bmN0aW9uKCkgeworICAgIHZhciBw
YXJlbnQgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKworICAgIHdoaWxlIChwYXJlbnQpIHsK
KyAgICAgIGlmIChnZXQocGFyZW50LCAnaXNWaXNpYmxlJykgPT09IGZhbHNlKSB7IHJldHVybiB0
cnVlOyB9CisKKyAgICAgIHBhcmVudCA9IGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7CisgICAg
fQorCisgICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIGNsZWFyQnVmZmVyOiBmdW5jdGlvbigp
IHsKKyAgICB0aGlzLmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcpIHsKKyAgICAgIHZp
ZXcuYnVmZmVyID0gbnVsbDsKKyAgICB9KTsKKyAgfSwKKworICB0cmFuc2l0aW9uVG86IGZ1bmN0
aW9uKHN0YXRlLCBjaGlsZHJlbikgeworICAgIHZhciBwcmlvclN0YXRlID0gdGhpcy5jdXJyZW50
U3RhdGUsCisgICAgICAgIGN1cnJlbnRTdGF0ZSA9IHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5z
dGF0ZXNbc3RhdGVdOworICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKworICAgIGlmIChwcmlvclN0
YXRlICYmIHByaW9yU3RhdGUuZXhpdCkgeyBwcmlvclN0YXRlLmV4aXQodGhpcyk7IH0KKyAgICBp
ZiAoY3VycmVudFN0YXRlLmVudGVyKSB7IGN1cnJlbnRTdGF0ZS5lbnRlcih0aGlzKTsgfQorICAg
IGlmIChzdGF0ZSA9PT0gJ2luRE9NJykgeyBkZWxldGUgRW1iZXIubWV0YSh0aGlzKS5jYWNoZS5l
bGVtZW50OyB9CisKKyAgICBpZiAoY2hpbGRyZW4gIT09IGZhbHNlKSB7CisgICAgICB0aGlzLmZv
ckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgeworICAgICAgICB2aWV3LnRyYW5zaXRpb25U
byhzdGF0ZSk7CisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBFVkVOVCBIQU5E
TElORworICAvLworCisgIC8qKgorICAgIEhhbmRsZSBldmVudHMgZnJvbSBgRW1iZXIuRXZlbnRE
aXNwYXRjaGVyYAorCisgICAgQG1ldGhvZCBoYW5kbGVFdmVudAorICAgIEBwYXJhbSBldmVudE5h
bWUge1N0cmluZ30KKyAgICBAcGFyYW0gZXZ0IHtFdmVudH0KKyAgICBAcHJpdmF0ZQorICAqLwor
ICBoYW5kbGVFdmVudDogZnVuY3Rpb24oZXZlbnROYW1lLCBldnQpIHsKKyAgICByZXR1cm4gdGhp
cy5jdXJyZW50U3RhdGUuaGFuZGxlRXZlbnQodGhpcywgZXZlbnROYW1lLCBldnQpOworICB9LAor
CisgIHJlZ2lzdGVyT2JzZXJ2ZXI6IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIHRhcmdldCwgb2JzZXJ2
ZXIpIHsKKyAgICBpZiAoIW9ic2VydmVyICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQp
IHsKKyAgICAgIG9ic2VydmVyID0gdGFyZ2V0OworICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICB9
CisKKyAgICBpZiAoIXJvb3QgfHwgdHlwZW9mIHJvb3QgIT09ICdvYmplY3QnKSB7CisgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgdmFyIHZpZXcgPSB0aGlzLAorICAgICAgICBzdGF0ZUNoZWNr
ZWRPYnNlcnZlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZpZXcuY3VycmVudFN0YXRlLmlu
dm9rZU9ic2VydmVyKHRoaXMsIG9ic2VydmVyKTsKKyAgICAgICAgfSwKKyAgICAgICAgc2NoZWR1
bGVkT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICBFbWJlci5ydW4uc2NoZWR1bGVP
bmNlKCdyZW5kZXInLCB0aGlzLCBzdGF0ZUNoZWNrZWRPYnNlcnZlcik7CisgICAgICAgIH07CisK
KyAgICBFbWJlci5hZGRPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2Vy
dmVyKTsKKworICAgIHRoaXMub25lKCd3aWxsQ2xlYXJSZW5kZXInLCBmdW5jdGlvbigpIHsKKyAg
ICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHJvb3QsIHBhdGgsIHRhcmdldCwgc2NoZWR1bGVkT2Jz
ZXJ2ZXIpOworICAgIH0pOworICB9CisKK30pOworCisvKgorICBEZXNjcmliZSBob3cgdGhlIHNw
ZWNpZmllZCBhY3Rpb25zIHNob3VsZCBiZWhhdmUgaW4gdGhlIHZhcmlvdXMKKyAgc3RhdGVzIHRo
YXQgYSB2aWV3IGNhbiBleGlzdCBpbi4gUG9zc2libGUgc3RhdGVzOgorCisgICogcHJlUmVuZGVy
OiB3aGVuIGEgdmlldyBpcyBmaXJzdCBpbnN0YW50aWF0ZWQsIGFuZCBhZnRlciBpdHMKKyAgICBl
bGVtZW50IHdhcyBkZXN0cm95ZWQsIGl0IGlzIGluIHRoZSBwcmVSZW5kZXIgc3RhdGUKKyAgKiBp
bkJ1ZmZlcjogb25jZSBhIHZpZXcgaGFzIGJlZW4gcmVuZGVyZWQsIGJ1dCBiZWZvcmUgaXQgaGFz
CisgICAgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBET00sIGl0IGlzIGluIHRoZSBpbkJ1ZmZlciBz
dGF0ZQorICAqIGluRE9NOiBvbmNlIGEgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBE
T00gaXQgaXMgaW4KKyAgICB0aGUgaW5ET00gc3RhdGUuIEEgdmlldyBzcGVuZHMgdGhlIHZhc3Qg
bWFqb3JpdHkgb2YgaXRzCisgICAgZXhpc3RlbmNlIGluIHRoaXMgc3RhdGUuCisgICogZGVzdHJv
eWVkOiBvbmNlIGEgdmlldyBoYXMgYmVlbiBkZXN0cm95ZWQgKHVzaW5nIHRoZSBkZXN0cm95Cisg
ICAgbWV0aG9kKSwgaXQgaXMgaW4gdGhpcyBzdGF0ZS4gTm8gZnVydGhlciBhY3Rpb25zIGNhbiBi
ZSBpbnZva2VkCisgICAgb24gYSBkZXN0cm95ZWQgdmlldy4KKyovCisKKyAgLy8gaW4gdGhlIGRl
c3Ryb3llZCBzdGF0ZSwgZXZlcnl0aGluZyBpcyBpbGxlZ2FsCisKKyAgLy8gYmVmb3JlIHJlbmRl
cmluZyBoYXMgYmVndW4sIGFsbCBsZWdhbCBtYW5pcHVsYXRpb25zIGFyZSBub29wcy4KKworICAv
LyBpbnNpZGUgdGhlIGJ1ZmZlciwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgZG9uZSBvbiB0aGUg
YnVmZmVyCisKKyAgLy8gb25jZSB0aGUgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBE
T00sIGxlZ2FsIG1hbmlwdWxhdGlvbnMKKyAgLy8gYXJlIGRvbmUgb24gdGhlIERPTSBlbGVtZW50
LgorCitmdW5jdGlvbiBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpIHsKKyAgRW1iZXIucnVuLm9u
Y2UoRW1iZXIuVmlldywgJ25vdGlmeU11dGF0aW9uTGlzdGVuZXJzJyk7Cit9CisKK3ZhciBET01N
YW5hZ2VyID0geworICBwcmVwZW5kOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7CisgICAgdmlldy4k
KCkucHJlcGVuZChodG1sKTsKKyAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOworICB9LAor
CisgIGFmdGVyOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7CisgICAgdmlldy4kKCkuYWZ0ZXIoaHRt
bCk7CisgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKKyAgfSwKKworICBodG1sOiBmdW5j
dGlvbih2aWV3LCBodG1sKSB7CisgICAgdmlldy4kKCkuaHRtbChodG1sKTsKKyAgICBub3RpZnlN
dXRhdGlvbkxpc3RlbmVycygpOworICB9LAorCisgIHJlcGxhY2U6IGZ1bmN0aW9uKHZpZXcpIHsK
KyAgICB2YXIgZWxlbWVudCA9IGdldCh2aWV3LCAnZWxlbWVudCcpOworCisgICAgc2V0KHZpZXcs
ICdlbGVtZW50JywgbnVsbCk7CisKKyAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rp
b24oKSB7CisgICAgICBFbWJlci4kKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGdldCh2aWV3LCAnZWxl
bWVudCcpKTsKKyAgICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7CisgICAgfSk7CisgIH0s
CisKKyAgcmVtb3ZlOiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmlldy4kKCkucmVtb3ZlKCk7Cisg
ICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKKyAgfSwKKworICBlbXB0eTogZnVuY3Rpb24o
dmlldykgeworICAgIHZpZXcuJCgpLmVtcHR5KCk7CisgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5l
cnMoKTsKKyAgfQorfTsKKworRW1iZXIuVmlldy5yZW9wZW4oeworICBkb21NYW5hZ2VyOiBET01N
YW5hZ2VyCit9KTsKKworRW1iZXIuVmlldy5yZW9wZW5DbGFzcyh7CisKKyAgLyoqCisgICAgUGFy
c2UgYSBwYXRoIGFuZCByZXR1cm4gYW4gb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBwYXJzZWQgcHJv
cGVydGllcy4KKworICAgIEZvciBleGFtcGxlIGEgcGF0aCBsaWtlICJjb250ZW50LmlzRW5hYmxl
ZDplbmFibGVkOmRpc2FibGVkIiB3aWxsIHJldHVybiB0aGUKKyAgICBmb2xsb3dpbmcgb2JqZWN0
OgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIHsKKyAgICAgIHBhdGg6ICJjb250ZW50LmlzRW5h
YmxlZCIsCisgICAgICBjbGFzc05hbWU6ICJlbmFibGVkIiwKKyAgICAgIGZhbHN5Q2xhc3NOYW1l
OiAiZGlzYWJsZWQiLAorICAgICAgY2xhc3NOYW1lczogIjplbmFibGVkOmRpc2FibGVkIgorICAg
IH0KKyAgICBgYGAKKworICAgIEBtZXRob2QgX3BhcnNlUHJvcGVydHlQYXRoCisgICAgQHN0YXRp
YworICAgIEBwcml2YXRlCisgICovCisgIF9wYXJzZVByb3BlcnR5UGF0aDogZnVuY3Rpb24ocGF0
aCkgeworICAgIHZhciBzcGxpdCA9IHBhdGguc3BsaXQoJzonKSwKKyAgICAgICAgcHJvcGVydHlQ
YXRoID0gc3BsaXRbMF0sCisgICAgICAgIGNsYXNzTmFtZXMgPSAiIiwKKyAgICAgICAgY2xhc3NO
YW1lLAorICAgICAgICBmYWxzeUNsYXNzTmFtZTsKKworICAgIC8vIGNoZWNrIGlmIHRoZSBwcm9w
ZXJ0eSBpcyBkZWZpbmVkIGFzIHByb3A6Y2xhc3Mgb3IgcHJvcDp0cnVlQ2xhc3M6ZmFsc2VDbGFz
cworICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7CisgICAgICBjbGFzc05hbWUgPSBzcGxpdFsx
XTsKKyAgICAgIGlmIChzcGxpdC5sZW5ndGggPT09IDMpIHsgZmFsc3lDbGFzc05hbWUgPSBzcGxp
dFsyXTsgfQorCisgICAgICBjbGFzc05hbWVzID0gJzonICsgY2xhc3NOYW1lOworICAgICAgaWYg
KGZhbHN5Q2xhc3NOYW1lKSB7IGNsYXNzTmFtZXMgKz0gIjoiICsgZmFsc3lDbGFzc05hbWU7IH0K
KyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgcGF0aDogcHJvcGVydHlQYXRoLAorICAgICAg
Y2xhc3NOYW1lczogY2xhc3NOYW1lcywKKyAgICAgIGNsYXNzTmFtZTogKGNsYXNzTmFtZSA9PT0g
JycpID8gdW5kZWZpbmVkIDogY2xhc3NOYW1lLAorICAgICAgZmFsc3lDbGFzc05hbWU6IGZhbHN5
Q2xhc3NOYW1lCisgICAgfTsKKyAgfSwKKworICAvKioKKyAgICBHZXQgdGhlIGNsYXNzIG5hbWUg
Zm9yIGEgZ2l2ZW4gdmFsdWUsIGJhc2VkIG9uIHRoZSBwYXRoLCBvcHRpb25hbAorICAgIGBjbGFz
c05hbWVgIGFuZCBvcHRpb25hbCBgZmFsc3lDbGFzc05hbWVgLgorCisgICAgLSBpZiBhIGBjbGFz
c05hbWVgIG9yIGBmYWxzeUNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkOgorICAgICAgLSBp
ZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBgY2xhc3NOYW1lYCBoYXMgYmVlbiBzcGVjaWZpZWQs
CisgICAgICAgIGBjbGFzc05hbWVgIGlzIHJldHVybmVkCisgICAgICAtIGlmIHRoZSB2YWx1ZSBp
cyBmYWxzeSBhbmQgYGZhbHN5Q2xhc3NOYW1lYCBoYXMgYmVlbiBzcGVjaWZpZWQsCisgICAgICAg
IGBmYWxzeUNsYXNzTmFtZWAgaXMgcmV0dXJuZWQKKyAgICAgIC0gb3RoZXJ3aXNlIGBudWxsYCBp
cyByZXR1cm5lZAorICAgIC0gaWYgdGhlIHZhbHVlIGlzIGB0cnVlYCwgdGhlIGRhc2hlcml6ZWQg
bGFzdCBwYXJ0IG9mIHRoZSBzdXBwbGllZCBwYXRoCisgICAgICBpcyByZXR1cm5lZAorICAgIC0g
aWYgdGhlIHZhbHVlIGlzIG5vdCBgZmFsc2VgLCBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIHRoZSBg
dmFsdWVgCisgICAgICBpcyByZXR1cm5lZAorICAgIC0gaWYgbm9uZSBvZiB0aGUgYWJvdmUgcnVs
ZXMgYXBwbHksIGBudWxsYCBpcyByZXR1cm5lZAorCisgICAgQG1ldGhvZCBfY2xhc3NTdHJpbmdG
b3JWYWx1ZQorICAgIEBwYXJhbSBwYXRoCisgICAgQHBhcmFtIHZhbAorICAgIEBwYXJhbSBjbGFz
c05hbWUKKyAgICBAcGFyYW0gZmFsc3lDbGFzc05hbWUKKyAgICBAc3RhdGljCisgICAgQHByaXZh
dGUKKyAgKi8KKyAgX2NsYXNzU3RyaW5nRm9yVmFsdWU6IGZ1bmN0aW9uKHBhdGgsIHZhbCwgY2xh
c3NOYW1lLCBmYWxzeUNsYXNzTmFtZSkgeworICAgIC8vIFdoZW4gdXNpbmcgdGhlIGNvbG9uIHN5
bnRheCwgZXZhbHVhdGUgdGhlIHRydXRoaW5lc3Mgb3IgZmFsc2luZXNzCisgICAgLy8gb2YgdGhl
IHZhbHVlIHRvIGRldGVybWluZSB3aGljaCBjbGFzc05hbWUgdG8gcmV0dXJuCisgICAgaWYgKGNs
YXNzTmFtZSB8fCBmYWxzeUNsYXNzTmFtZSkgeworICAgICAgaWYgKGNsYXNzTmFtZSAmJiAhIXZh
bCkgeworICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworCisgICAgICB9IGVsc2UgaWYgKGZhbHN5
Q2xhc3NOYW1lICYmICF2YWwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHN5Q2xhc3NOYW1lOworCisg
ICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgIC8vIElm
IHZhbHVlIGlzIGEgQm9vbGVhbiBhbmQgdHJ1ZSwgcmV0dXJuIHRoZSBkYXNoZXJpemVkIHByb3Bl
cnR5CisgICAgLy8gbmFtZS4KKyAgICB9IGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgeworICAgICAg
Ly8gTm9ybWFsaXplIHByb3BlcnR5IHBhdGggdG8gYmUgc3VpdGFibGUgZm9yIHVzZQorICAgICAg
Ly8gYXMgYSBjbGFzcyBuYW1lLiBGb3IgZXhhcGxlLCBjb250ZW50LmZvby5iYXJCYXoKKyAgICAg
IC8vIGJlY29tZXMgYmFyLWJhei4KKyAgICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTsK
KyAgICAgIHJldHVybiBFbWJlci5TdHJpbmcuZGFzaGVyaXplKHBhcnRzW3BhcnRzLmxlbmd0aC0x
XSk7CisKKyAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGZhbHNlLCB1bmRlZmluZWQsIG9yIG51
bGwsIHJldHVybiB0aGUgY3VycmVudAorICAgIC8vIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAg
ICB9IGVsc2UgaWYgKHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9IG51bGwpIHsKKyAgICAgIHJldHVy
biB2YWw7CisKKyAgICAvLyBOb3RoaW5nIHRvIGRpc3BsYXkuIFJldHVybiBudWxsIHNvIHRoYXQg
dGhlIG9sZCBjbGFzcyBpcyByZW1vdmVkCisgICAgLy8gYnV0IG5vIG5ldyBjbGFzcyBpcyBhZGRl
ZC4KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9Cit9KTsKKwor
dmFyIG11dGF0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVkKS5jcmVhdGUo
KTsKKworRW1iZXIuVmlldy5hZGRNdXRhdGlvbkxpc3RlbmVyID0gZnVuY3Rpb24oY2FsbGJhY2sp
IHsKKyAgbXV0YXRpb24ub24oJ2NoYW5nZScsIGNhbGxiYWNrKTsKK307CisKK0VtYmVyLlZpZXcu
cmVtb3ZlTXV0YXRpb25MaXN0ZW5lciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgIG11dGF0aW9u
Lm9mZignY2hhbmdlJywgY2FsbGJhY2spOworfTsKKworRW1iZXIuVmlldy5ub3RpZnlNdXRhdGlv
bkxpc3RlbmVycyA9IGZ1bmN0aW9uKCkgeworICBtdXRhdGlvbi50cmlnZ2VyKCdjaGFuZ2UnKTsK
K307CisKKy8qKgorICBHbG9iYWwgdmlld3MgaGFzaAorCisgIEBwcm9wZXJ0eSB2aWV3cworICBA
c3RhdGljCisgIEB0eXBlIEhhc2gKKyovCitFbWJlci5WaWV3LnZpZXdzID0ge307CisKKy8vIElm
IHNvbWVvbmUgb3ZlcnJpZGVzIHRoZSBjaGlsZCB2aWV3cyBjb21wdXRlZCBwcm9wZXJ0eSB3aGVu
CisvLyBkZWZpbmluZyB0aGVpciBjbGFzcywgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHByb2Nlc3Mg
dGhlIHVzZXIncworLy8gc3VwcGxpZWQgY2hpbGRWaWV3cyBhbmQgdGhlbiByZXN0b3JlIHRoZSBv
cmlnaW5hbCBjb21wdXRlZCBwcm9wZXJ0eQorLy8gYXQgdmlldyBpbml0aWFsaXphdGlvbiB0aW1l
LiBUaGlzIGhhcHBlbnMgaW4gRW1iZXIuQ29udGFpbmVyVmlldydzIGluaXQKKy8vIG1ldGhvZC4K
K0VtYmVyLlZpZXcuY2hpbGRWaWV3c1Byb3BlcnR5ID0gY2hpbGRWaWV3c1Byb3BlcnR5OworCitF
bWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MgPSBmdW5jdGlvbihlbGVtLCBuYW1lLCB2
YWx1ZSkgeworICB2YXIgdHlwZSA9IEVtYmVyLnR5cGVPZih2YWx1ZSk7CisKKyAgLy8gaWYgdGhp
cyBjaGFuZ2VzLCBhbHNvIGNoYW5nZSB0aGUgbG9naWMgaW4gZW1iZXItaGFuZGxlYmFycy9saWIv
aGVscGVycy9iaW5kaW5nLmpzCisgIGlmIChuYW1lICE9PSAndmFsdWUnICYmICh0eXBlID09PSAn
c3RyaW5nJyB8fCAodHlwZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkpKSB7CisgICAg
aWYgKHZhbHVlICE9PSBlbGVtLmF0dHIobmFtZSkpIHsKKyAgICAgIGVsZW0uYXR0cihuYW1lLCB2
YWx1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKG5hbWUgPT09ICd2YWx1ZScgfHwgdHlwZSA9PT0g
J2Jvb2xlYW4nKSB7CisgICAgLy8gV2UgY2FuJ3Qgc2V0IHByb3BlcnRpZXMgdG8gdW5kZWZpbmVk
IG9yIG51bGwKKyAgICBpZiAoRW1iZXIuaXNOb25lKHZhbHVlKSkgeyB2YWx1ZSA9ICcnOyB9CisK
KyAgICBpZiAoIXZhbHVlKSB7CisgICAgICBlbGVtLnJlbW92ZUF0dHIobmFtZSk7CisgICAgfQor
CisgICAgaWYgKHZhbHVlICE9PSBlbGVtLnByb3AobmFtZSkpIHsKKyAgICAgIC8vIHZhbHVlIGFu
ZCBib29sZWFucyBzaG91bGQgYWx3YXlzIGJlIHByb3BlcnRpZXMKKyAgICAgIGVsZW0ucHJvcChu
YW1lLCB2YWx1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKCF2YWx1ZSkgeworICAgIGVsZW0ucmVt
b3ZlQXR0cihuYW1lKTsKKyAgfQorfTsKKworRW1iZXIuVmlldy5zdGF0ZXMgPSBzdGF0ZXM7CisK
K30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1
bGUgZW1iZXItdmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKKworRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQgPSB7CisgIC8vIGFwcGVuZENoaWxkIGlz
IG9ubHkgbGVnYWwgd2hpbGUgcmVuZGVyaW5nIHRoZSBidWZmZXIuCisgIGFwcGVuZENoaWxkOiBm
dW5jdGlvbigpIHsKKyAgICB0aHJvdyAiWW91IGNhbid0IHVzZSBhcHBlbmRDaGlsZCBvdXRzaWRl
IG9mIHRoZSByZW5kZXJpbmcgcHJvY2VzcyI7CisgIH0sCisKKyAgJDogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgfSwKKworICBnZXRFbGVtZW50OiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gbnVsbDsKKyAgfSwKKworICAvLyBIYW5kbGUgZXZlbnRzIGZyb20gYEVtYmVy
LkV2ZW50RGlzcGF0Y2hlcmAKKyAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0cnVlOyAvLyBjb250aW51ZSBldmVudCBwcm9wYWdhdGlvbgorICB9LAorCisgIGRlc3Ryb3lF
bGVtZW50OiBmdW5jdGlvbih2aWV3KSB7CisgICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7
CisgICAgaWYgKHZpZXcuX3NjaGVkdWxlZEluc2VydCkgeworICAgICAgRW1iZXIucnVuLmNhbmNl
bCh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpOworICAgICAgdmlldy5fc2NoZWR1bGVkSW5zZXJ0ID0g
bnVsbDsKKyAgICB9CisgICAgcmV0dXJuIHZpZXc7CisgIH0sCisKKyAgcmVuZGVyVG9CdWZmZXJJ
Zk5lZWRlZDogZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICByZXJl
bmRlcjogRW1iZXIuSywKKyAgaW52b2tlT2JzZXJ2ZXI6IEVtYmVyLksKK307CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyovCisKK3ZhciBwcmVSZW5kZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5wcmVSZW5kZXIg
PSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOworCitFbWJlci5tZXJn
ZShwcmVSZW5kZXIsIHsKKyAgLy8gYSB2aWV3IGxlYXZlcyB0aGUgcHJlUmVuZGVyIHN0YXRlIG9u
Y2UgaXRzIGVsZW1lbnQgaGFzIGJlZW4KKyAgLy8gY3JlYXRlZCAoY3JlYXRlRWxlbWVudCkuCisg
IGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIGZuKSB7CisgICAgdmlldy5jcmVhdGVFbGVt
ZW50KCk7CisgICAgdmFyIHZpZXdDb2xsZWN0aW9uID0gdmlldy52aWV3SGllcmFyY2h5Q29sbGVj
dGlvbigpOworCisgICAgdmlld0NvbGxlY3Rpb24udHJpZ2dlcignd2lsbEluc2VydEVsZW1lbnQn
KTsKKworICAgIGZuLmNhbGwodmlldyk7CisKKyAgICAvLyBXZSB0cmFuc2l0aW9uIHRvIGBpbkRP
TWAgaWYgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBET00KKyAgICB2YXIgZWxlbWVudCA9IHZp
ZXcuZ2V0KCdlbGVtZW50Jyk7CisgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5v
ZGUpIHsKKyAgICAgIGlmIChlbGVtZW50ID09PSBkb2N1bWVudCkgeworICAgICAgICB2aWV3Q29s
bGVjdGlvbi50cmFuc2l0aW9uVG8oJ2luRE9NJywgZmFsc2UpOworICAgICAgICB2aWV3Q29sbGVj
dGlvbi50cmlnZ2VyKCdkaWRJbnNlcnRFbGVtZW50Jyk7CisgICAgICB9CisgICAgfQorCisgIH0s
CisKKyAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24odmlldywgYnVmZmVyKSB7Cisg
ICAgdmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOworICAgIHJldHVybiB0cnVlOworICB9LAor
CisgIGVtcHR5OiBFbWJlci5LLAorCisgIHNldEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIHZhbHVl
KSB7CisgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CisgICAgICB2aWV3LnRyYW5zaXRpb25Ubygn
aGFzRWxlbWVudCcpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0KK30pOworCit9KSgp
OworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVt
YmVyLXZpZXdzCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisK
K3ZhciBpbkJ1ZmZlciA9IEVtYmVyLlZpZXcuc3RhdGVzLmluQnVmZmVyID0gRW1iZXIuY3JlYXRl
KEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKKworRW1iZXIubWVyZ2UoaW5CdWZmZXIsIHsK
KyAgJDogZnVuY3Rpb24odmlldywgc2VsKSB7CisgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBl
bGVtZW50IHlldCwgc29tZW9uZSBjYWxsaW5nIHRoaXMuJCgpIGlzCisgICAgLy8gdHJ5aW5nIHRv
IHVwZGF0ZSBhbiBlbGVtZW50IHRoYXQgaXNuJ3QgaW4gdGhlIERPTS4gSW5zdGVhZCwKKyAgICAv
LyByZXJlbmRlciB0aGUgdmlldyB0byBhbGxvdyB0aGUgcmVuZGVyIG1ldGhvZCB0byByZWZsZWN0
IHRoZQorICAgIC8vIGNoYW5nZXMuCisgICAgdmlldy5yZXJlbmRlcigpOworICAgIHJldHVybiBF
bWJlci4kKCk7CisgIH0sCisKKyAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVyZWQgaW4gYSBidWZm
ZXIsIHJlcmVuZGVyaW5nIGl0IHNpbXBseQorICAvLyByZXBsYWNlcyB0aGUgZXhpc3RpbmcgYnVm
ZmVyIHdpdGggYSBuZXcgb25lCisgIHJlcmVuZGVyOiBmdW5jdGlvbih2aWV3KSB7CisgICAgdGhy
b3cgbmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCBjYXVzZWQgYSB2aWV3IHRvIHJl
LXJlbmRlciBhZnRlciBpdCByZW5kZXJlZCBidXQgYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRv
IHRoZSBET00uIik7CisgIH0sCisKKyAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVyZWQgaW4gYSBi
dWZmZXIsIGFwcGVuZGluZyBhIGNoaWxkCisgIC8vIHZpZXcgd2lsbCByZW5kZXIgdGhhdCB2aWV3
IGFuZCBhcHBlbmQgdGhlIHJlc3VsdGluZworICAvLyBidWZmZXIgaW50byBpdHMgYnVmZmVyLgor
ICBhcHBlbmRDaGlsZDogZnVuY3Rpb24odmlldywgY2hpbGRWaWV3LCBvcHRpb25zKSB7CisgICAg
dmFyIGJ1ZmZlciA9IHZpZXcuYnVmZmVyLCBfY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3M7
CisKKyAgICBjaGlsZFZpZXcgPSB2aWV3LmNyZWF0ZUNoaWxkVmlldyhjaGlsZFZpZXcsIG9wdGlv
bnMpOworICAgIGlmICghX2NoaWxkVmlld3MubGVuZ3RoKSB7IF9jaGlsZFZpZXdzID0gdmlldy5f
Y2hpbGRWaWV3cyA9IF9jaGlsZFZpZXdzLnNsaWNlKCk7IH0KKyAgICBfY2hpbGRWaWV3cy5wdXNo
KGNoaWxkVmlldyk7CisKKyAgICBjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXIoYnVmZmVyKTsKKwor
ICAgIHZpZXcucHJvcGVydHlEaWRDaGFuZ2UoJ2NoaWxkVmlld3MnKTsKKworICAgIHJldHVybiBj
aGlsZFZpZXc7CisgIH0sCisKKyAgLy8gd2hlbiBhIHZpZXcgaXMgcmVuZGVyZWQgaW4gYSBidWZm
ZXIsIGRlc3Ryb3lpbmcgdGhlCisgIC8vIGVsZW1lbnQgd2lsbCBzaW1wbHkgZGVzdHJveSB0aGUg
YnVmZmVyIGFuZCBwdXQgdGhlCisgIC8vIHN0YXRlIGJhY2sgaW50byB0aGUgcHJlUmVuZGVyIHN0
YXRlLgorICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmlldykgeworICAgIHZpZXcuY2xlYXJC
dWZmZXIoKTsKKyAgICB2YXIgdmlld0NvbGxlY3Rpb24gPSB2aWV3Ll9ub3RpZnlXaWxsRGVzdHJv
eUVsZW1lbnQoKTsKKyAgICB2aWV3Q29sbGVjdGlvbi50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcics
IGZhbHNlKTsKKworICAgIHJldHVybiB2aWV3OworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbigp
IHsKKyAgICBFbWJlci5hc3NlcnQoIkVtcHR5aW5nIGEgdmlldyBpbiB0aGUgaW5CdWZmZXIgc3Rh
dGUgaXMgbm90IGFsbG93ZWQgYW5kICIgKworICAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCBo
YXBwZW4gdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuIE1vc3QgbGlrZWx5ICIgKworICAgICAg
ICAgICAgICAgICAidGhlcmUgaXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gVGhpcyBtYXkg
YmUgZHVlIHRvICIgKworICAgICAgICAgICAgICAgICAiZXhjZXNzaXZlIHByb3BlcnR5IGNoYW5n
ZSBub3RpZmljYXRpb25zLiIpOworICB9LAorCisgIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1
bmN0aW9uICh2aWV3LCBidWZmZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgLy8g
SXQgc2hvdWxkIGJlIGltcG9zc2libGUgZm9yIGEgcmVuZGVyZWQgdmlldyB0byBiZSBzY2hlZHVs
ZWQgZm9yCisgIC8vIGluc2VydGlvbi4KKyAgaW5zZXJ0RWxlbWVudDogZnVuY3Rpb24oKSB7Cisg
ICAgdGhyb3cgIllvdSBjYW4ndCBpbnNlcnQgYW4gZWxlbWVudCB0aGF0IGhhcyBhbHJlYWR5IGJl
ZW4gcmVuZGVyZWQiOworICB9LAorCisgIHNldEVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIHZhbHVl
KSB7CisgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CisgICAgICB2aWV3LnRyYW5zaXRpb25Ubygn
cHJlUmVuZGVyJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZpZXcuY2xlYXJCdWZmZXIoKTsKKyAg
ICAgIHZpZXcudHJhbnNpdGlvblRvKCdoYXNFbGVtZW50Jyk7CisgICAgfQorCisgICAgcmV0dXJu
IHZhbHVlOworICB9LAorCisgIGludm9rZU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9ic2Vy
dmVyKSB7CisgICAgb2JzZXJ2ZXIuY2FsbCh0YXJnZXQpOworICB9Cit9KTsKKworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVy
LXZpZXdzCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisKK3Zh
ciBoYXNFbGVtZW50ID0gRW1iZXIuVmlldy5zdGF0ZXMuaGFzRWxlbWVudCA9IEVtYmVyLmNyZWF0
ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7CisKK0VtYmVyLm1lcmdlKGhhc0VsZW1lbnQs
IHsKKyAgJDogZnVuY3Rpb24odmlldywgc2VsKSB7CisgICAgdmFyIGVsZW0gPSBnZXQodmlldywg
J2VsZW1lbnQnKTsKKyAgICByZXR1cm4gc2VsID8gRW1iZXIuJChzZWwsIGVsZW0pIDogRW1iZXIu
JChlbGVtKTsKKyAgfSwKKworICBnZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmFy
IHBhcmVudCA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOworICAgIGlmIChwYXJlbnQpIHsgcGFy
ZW50ID0gZ2V0KHBhcmVudCwgJ2VsZW1lbnQnKTsgfQorICAgIGlmIChwYXJlbnQpIHsgcmV0dXJu
IHZpZXcuZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQocGFyZW50KTsgfQorICAgIHJldHVybiBF
bWJlci4kKCIjIiArIGdldCh2aWV3LCAnZWxlbWVudElkJykpWzBdOworICB9LAorCisgIHNldEVs
ZW1lbnQ6IGZ1bmN0aW9uKHZpZXcsIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09PSBudWxsKSB7
CisgICAgICB2aWV3LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7CisgICAgfSBlbHNlIHsKKyAg
ICAgIHRocm93ICJZb3UgY2Fubm90IHNldCBhbiBlbGVtZW50IHRvIGEgbm9uLW51bGwgdmFsdWUg
d2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGluIHRoZSBET00uIjsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdmFsdWU7CisgIH0sCisKKyAgLy8gb25jZSB0aGUgdmlldyBoYXMgYmVlbiBpbnNlcnRl
ZCBpbnRvIHRoZSBET00sIHJlcmVuZGVyaW5nIGlzCisgIC8vIGRlZmVycmVkIHRvIGFsbG93IGJp
bmRpbmdzIHRvIHN5bmNocm9uaXplLgorICByZXJlbmRlcjogZnVuY3Rpb24odmlldykgeworICAg
IHZpZXcudHJpZ2dlclJlY3Vyc2l2ZWx5KCd3aWxsQ2xlYXJSZW5kZXInKTsKKworICAgIHZpZXcu
Y2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7CisKKyAgICB2aWV3LmRvbU1hbmFnZXIucmVwbGFjZSh2
aWV3KTsKKyAgICByZXR1cm4gdmlldzsKKyAgfSwKKworICAvLyBvbmNlIHRoZSB2aWV3IGlzIGFs
cmVhZHkgaW4gdGhlIERPTSwgZGVzdHJveWluZyBpdCByZW1vdmVzIGl0CisgIC8vIGZyb20gdGhl
IERPTSwgbnVrZXMgaXRzIGVsZW1lbnQsIGFuZCBwdXRzIGl0IGJhY2sgaW50byB0aGUKKyAgLy8g
cHJlUmVuZGVyIHN0YXRlIGlmIGluRE9NLgorCisgIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbih2
aWV3KSB7CisgICAgdmlldy5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50KCk7CisgICAgdmlldy5k
b21NYW5hZ2VyLnJlbW92ZSh2aWV3KTsKKyAgICBzZXQodmlldywgJ2VsZW1lbnQnLCBudWxsKTsK
KyAgICBpZiAodmlldy5fc2NoZWR1bGVkSW5zZXJ0KSB7CisgICAgICBFbWJlci5ydW4uY2FuY2Vs
KHZpZXcuX3NjaGVkdWxlZEluc2VydCk7CisgICAgICB2aWV3Ll9zY2hlZHVsZWRJbnNlcnQgPSBu
dWxsOworICAgIH0KKyAgICByZXR1cm4gdmlldzsKKyAgfSwKKworICBlbXB0eTogZnVuY3Rpb24o
dmlldykgeworICAgIHZhciBfY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MsIGxlbiwgaWR4
OworICAgIGlmIChfY2hpbGRWaWV3cykgeworICAgICAgbGVuID0gX2NoaWxkVmlld3MubGVuZ3Ro
OworICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgIF9jaGls
ZFZpZXdzW2lkeF0uX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudCgpOworICAgICAgfQorICAgIH0K
KyAgICB2aWV3LmRvbU1hbmFnZXIuZW1wdHkodmlldyk7CisgIH0sCisKKyAgLy8gSGFuZGxlIGV2
ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgIGhhbmRsZUV2ZW50OiBmdW5jdGlv
bih2aWV3LCBldmVudE5hbWUsIGV2dCkgeworICAgIGlmICh2aWV3LmhhcyhldmVudE5hbWUpKSB7
CisgICAgICAvLyBIYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIHJlLWRpc3BhdGNoIGV2ZW50cywg
c28gd2UgZG9uJ3QKKyAgICAgIC8vIHByZXZlbnREZWZhdWx0IG9yIHN0b3BQcm9wYWdhdGlvbi4K
KyAgICAgIHJldHVybiB2aWV3LnRyaWdnZXIoZXZlbnROYW1lLCBldnQpOworICAgIH0gZWxzZSB7
CisgICAgICByZXR1cm4gdHJ1ZTsgLy8gY29udGludWUgZXZlbnQgcHJvcGFnYXRpb24KKyAgICB9
CisgIH0sCisKKyAgaW52b2tlT2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb2JzZXJ2ZXIpIHsK
KyAgICBvYnNlcnZlci5jYWxsKHRhcmdldCk7CisgIH0KK30pOworCit2YXIgaW5ET00gPSBFbWJl
ci5WaWV3LnN0YXRlcy5pbkRPTSA9IEVtYmVyLmNyZWF0ZShoYXNFbGVtZW50KTsKKworRW1iZXIu
bWVyZ2UoaW5ET00sIHsKKyAgZW50ZXI6IGZ1bmN0aW9uKHZpZXcpIHsKKyAgICAvLyBSZWdpc3Rl
ciB0aGUgdmlldyBmb3IgZXZlbnQgaGFuZGxpbmcuIFRoaXMgaGFzaCBpcyB1c2VkIGJ5CisgICAg
Ly8gRW1iZXIuRXZlbnREaXNwYXRjaGVyIHRvIGRpc3BhdGNoIGluY29taW5nIGV2ZW50cy4KKyAg
ICBpZiAoIXZpZXcuaXNWaXJ0dWFsKSB7CisgICAgICBFbWJlci5hc3NlcnQoIkF0dGVtcHRlZCB0
byByZWdpc3RlciBhIHZpZXcgd2l0aCBhbiBpZCBhbHJlYWR5IGluIHVzZTogIit2aWV3LmVsZW1l
bnRJZCwgIUVtYmVyLlZpZXcudmlld3Nbdmlldy5lbGVtZW50SWRdKTsKKyAgICAgIEVtYmVyLlZp
ZXcudmlld3Nbdmlldy5lbGVtZW50SWRdID0gdmlldzsKKyAgICB9CisKKyAgICB2aWV3LmFkZEJl
Zm9yZU9ic2VydmVyKCdlbGVtZW50SWQnLCBmdW5jdGlvbigpIHsKKyAgICAgIHRocm93IG5ldyBF
bWJlci5FcnJvcigiQ2hhbmdpbmcgYSB2aWV3J3MgZWxlbWVudElkIGFmdGVyIGNyZWF0aW9uIGlz
IG5vdCBhbGxvd2VkIik7CisgICAgfSk7CisgIH0sCisKKyAgZXhpdDogZnVuY3Rpb24odmlldykg
eworICAgIGlmICghdGhpcy5pc1ZpcnR1YWwpIGRlbGV0ZSBFbWJlci5WaWV3LnZpZXdzW3ZpZXcu
ZWxlbWVudElkXTsKKyAgfSwKKworICBpbnNlcnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBmbikg
eworICAgIHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NIHRo
YXQgaGFzIGFscmVhZHkgYmVlbiBpbnNlcnRlZCI7CisgIH0KK30pOworCit9KSgpOworCisKKwor
KGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdz
CisqLworCit2YXIgZGVzdHJveWluZ0Vycm9yID0gIllvdSBjYW4ndCBjYWxsICVAIG9uIGEgdmll
dyBiZWluZyBkZXN0cm95ZWQiLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OworCit2YXIgZGVzdHJv
eWluZyA9IEVtYmVyLlZpZXcuc3RhdGVzLmRlc3Ryb3lpbmcgPSBFbWJlci5jcmVhdGUoRW1iZXIu
Vmlldy5zdGF0ZXMuX2RlZmF1bHQpOworCitFbWJlci5tZXJnZShkZXN0cm95aW5nLCB7CisgIGFw
cGVuZENoaWxkOiBmdW5jdGlvbigpIHsKKyAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBb
J2FwcGVuZENoaWxkJ10pOworICB9LAorICByZXJlbmRlcjogZnVuY3Rpb24oKSB7CisgICAgdGhy
b3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWydyZXJlbmRlciddKTsKKyAgfSwKKyAgZGVzdHJveUVs
ZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgIHRocm93IGZtdChkZXN0cm95aW5nRXJyb3IsIFsnZGVz
dHJveUVsZW1lbnQnXSk7CisgIH0sCisgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAgICB0aHJvdyBm
bXQoZGVzdHJveWluZ0Vycm9yLCBbJ2VtcHR5J10pOworICB9LAorCisgIHNldEVsZW1lbnQ6IGZ1
bmN0aW9uKCkgeworICAgIHRocm93IGZtdChkZXN0cm95aW5nRXJyb3IsIFsic2V0KCdlbGVtZW50
JywgLi4uKSJdKTsKKyAgfSwKKworICByZW5kZXJUb0J1ZmZlcklmTmVlZGVkOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgLy8gU2luY2UgZWxlbWVudCBpbnNlcnRp
b24gaXMgc2NoZWR1bGVkLCBkb24ndCBkbyBhbnl0aGluZyBpZgorICAvLyB0aGUgdmlldyBoYXMg
YmVlbiBkZXN0cm95ZWQgYmV0d2VlbiBzY2hlZHVsaW5nIGFuZCBleGVjdXRpb24KKyAgaW5zZXJ0
RWxlbWVudDogRW1iZXIuSworfSk7CisKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK0Vt
YmVyLlZpZXcuY2xvbmVTdGF0ZXMgPSBmdW5jdGlvbihmcm9tKSB7CisgIHZhciBpbnRvID0ge307
CisKKyAgaW50by5fZGVmYXVsdCA9IHt9OworICBpbnRvLnByZVJlbmRlciA9IEVtYmVyLmNyZWF0
ZShpbnRvLl9kZWZhdWx0KTsKKyAgaW50by5kZXN0cm95aW5nID0gRW1iZXIuY3JlYXRlKGludG8u
X2RlZmF1bHQpOworICBpbnRvLmluQnVmZmVyID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQp
OworICBpbnRvLmhhc0VsZW1lbnQgPSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7CisgIGlu
dG8uaW5ET00gPSBFbWJlci5jcmVhdGUoaW50by5oYXNFbGVtZW50KTsKKworICBmb3IgKHZhciBz
dGF0ZU5hbWUgaW4gZnJvbSkgeworICAgIGlmICghZnJvbS5oYXNPd25Qcm9wZXJ0eShzdGF0ZU5h
bWUpKSB7IGNvbnRpbnVlOyB9CisgICAgRW1iZXIubWVyZ2UoaW50b1tzdGF0ZU5hbWVdLCBmcm9t
W3N0YXRlTmFtZV0pOworICB9CisKKyAgcmV0dXJuIGludG87Cit9OworCit9KSgpOworCisKKwor
KGZ1bmN0aW9uKCkgewordmFyIHN0YXRlcyA9IEVtYmVyLlZpZXcuY2xvbmVTdGF0ZXMoRW1iZXIu
Vmlldy5zdGF0ZXMpOworCisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmll
d3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBmb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Cit2YXIgVmlld0NvbGxlY3Rpb24g
PSBFbWJlci5fVmlld0NvbGxlY3Rpb247CisKKy8qKgorICBBIGBDb250YWluZXJWaWV3YCBpcyBh
biBgRW1iZXIuVmlld2Agc3ViY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGBFbWJlci5NdXRhYmxlQXJy
YXlgCisgIGFsbG93aW5nIHByb2dyYW1tYXRpYyBtYW5hZ2VtZW50IG9mIGl0cyBjaGlsZCB2aWV3
cy4KKworICAjIyBTZXR0aW5nIEluaXRpYWwgQ2hpbGQgVmlld3MKKworICBUaGUgaW5pdGlhbCBh
cnJheSBvZiBjaGlsZCB2aWV3cyBjYW4gYmUgc2V0IGluIG9uZSBvZiB0d28gd2F5cy4gWW91IGNh
bgorICBwcm92aWRlIGEgYGNoaWxkVmlld3NgIHByb3BlcnR5IGF0IGNyZWF0aW9uIHRpbWUgdGhh
dCBjb250YWlucyBpbnN0YW5jZSBvZgorICBgRW1iZXIuVmlld2A6CisKKyAgYGBgamF2YXNjcmlw
dAorICBhQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoeworICAgIGNoaWxk
Vmlld3M6IFtFbWJlci5WaWV3LmNyZWF0ZSgpLCBFbWJlci5WaWV3LmNyZWF0ZSgpXQorICB9KTsK
KyAgYGBgCisKKyAgWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBsaXN0IG9mIHByb3BlcnR5IG5hbWVz
IHdob3NlIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mCisgIGBFbWJlci5WaWV3YDoKKworICBgYGBq
YXZhc2NyaXB0CisgIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7Cisg
ICAgY2hpbGRWaWV3czogWydhVmlldycsICdiVmlldycsICdjVmlldyddLAorICAgIGFWaWV3OiBF
bWJlci5WaWV3LmNyZWF0ZSgpLAorICAgIGJWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpLAorICAg
IGNWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCisgIH0pOworICBgYGAKKworICBUaGUgdHdvIHN0
cmF0ZWdpZXMgY2FuIGJlIGNvbWJpbmVkOgorCisgIGBgYGphdmFzY3JpcHQKKyAgYUNvbnRhaW5l
ciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKKyAgICBjaGlsZFZpZXdzOiBbJ2FWaWV3
JywgRW1iZXIuVmlldy5jcmVhdGUoKV0sCisgICAgYVZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKCkK
KyAgfSk7CisgIGBgYAorCisgIEVhY2ggY2hpbGQgdmlldydzIHJlbmRlcmluZyB3aWxsIGJlIGlu
c2VydGVkIGludG8gdGhlIGNvbnRhaW5lcidzIHJlbmRlcmVkCisgIEhUTUwgaW4gdGhlIHNhbWUg
b3JkZXIgYXMgaXRzIHBvc2l0aW9uIGluIHRoZSBgY2hpbGRWaWV3c2AgcHJvcGVydHkuCisKKyAg
IyMgQWRkaW5nIGFuZCBSZW1vdmluZyBDaGlsZCBWaWV3cworCisgIFRoZSBjb250YWluZXIgdmll
dyBpbXBsZW1lbnRzIGBFbWJlci5NdXRhYmxlQXJyYXlgIGFsbG93aW5nIHByb2dyYW1tYXRpYyBt
YW5hZ2VtZW50IG9mIGl0cyBjaGlsZCB2aWV3cy4KKworICBUbyByZW1vdmUgYSB2aWV3LCBwYXNz
IHRoYXQgdmlldyBpbnRvIGEgYHJlbW92ZU9iamVjdGAgY2FsbCBvbiB0aGUgY29udGFpbmVyIHZp
ZXcuCisKKyAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgdGhlIGZvbGxvd2luZyBjb2RlCisKKyAg
YGBgamF2YXNjcmlwdAorICBhQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUo
eworICAgIGNsYXNzTmFtZXM6IFsndGhlLWNvbnRhaW5lciddLAorICAgIGNoaWxkVmlld3M6IFsn
YVZpZXcnLCAnYlZpZXcnXSwKKyAgICBhVmlldzogRW1iZXIuVmlldy5jcmVhdGUoeworICAgICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQSIpCisgICAgfSksCisgICAgYlZp
ZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKKyAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJz
LmNvbXBpbGUoIkIiKQorICAgIH0pCisgIH0pOworCisgIGFDb250YWluZXIuYXBwZW5kVG8oJ2Jv
ZHknKTsKKyAgYGBgCisKKyAgUmVzdWx0cyBpbiB0aGUgSFRNTAorCisgIGBgYGh0bWwKKyAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJl
ci12aWV3Ij5BPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QjwvZGl2PgorICA8
L2Rpdj4KKyAgYGBgCisKKyAgUmVtb3ZpbmcgYSB2aWV3CisKKyAgYGBgamF2YXNjcmlwdAorICBh
Q29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3LCBhQ29udGFpbmVyLmJW
aWV3XQorICBhQ29udGFpbmVyLnJlbW92ZU9iamVjdChhQ29udGFpbmVyLmdldCgnYlZpZXcnKSk7
CisgIGFDb250YWluZXIudG9BcnJheSgpOyAgLy8gW2FDb250YWluZXIuYVZpZXddCisgIGBgYAor
CisgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTAorCisgIGBgYGh0bWwKKyAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJl
ci12aWV3Ij5BPC9kaXY+CisgIDwvZGl2PgorICBgYGAKKworICBTaW1pbGFybHksIGFkZGluZyBh
IGNoaWxkIHZpZXcgaXMgYWNjb21wbGlzaGVkIGJ5IGFkZGluZyBgRW1iZXIuVmlld2AgaW5zdGFu
Y2VzIHRvIHRoZQorICBjb250YWluZXIgdmlldy4KKworICBHaXZlbiBhbiBlbXB0eSBgPGJvZHk+
YCB0aGUgZm9sbG93aW5nIGNvZGUKKworICBgYGBqYXZhc2NyaXB0CisgIGFDb250YWluZXIgPSBF
bWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7CisgICAgY2xhc3NOYW1lczogWyd0aGUtY29udGFp
bmVyJ10sCisgICAgY2hpbGRWaWV3czogWydhVmlldycsICdiVmlldyddLAorICAgIGFWaWV3OiBF
bWJlci5WaWV3LmNyZWF0ZSh7CisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJBIikKKyAgICB9KSwKKyAgICBiVmlldzogRW1iZXIuVmlldy5jcmVhdGUoeworICAgICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQiIpCisgICAgfSkKKyAgfSk7CisK
KyAgYUNvbnRhaW5lci5hcHBlbmRUbygnYm9keScpOworICBgYGAKKworICBSZXN1bHRzIGluIHRo
ZSBIVE1MCisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IHRoZS1jb250YWlu
ZXIiPgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkE8L2Rpdj4KKyAgICA8ZGl2IGNsYXNz
PSJlbWJlci12aWV3Ij5CPC9kaXY+CisgIDwvZGl2PgorICBgYGAKKworICBBZGRpbmcgYSB2aWV3
CisKKyAgYGBgamF2YXNjcmlwdAorICBBbm90aGVyVmlld0NsYXNzID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkFub3RoZXIgdmll
dyIpCisgIH0pOworCisgIGFDb250YWluZXIudG9BcnJheSgpOyAgLy8gW2FDb250YWluZXIuYVZp
ZXcsIGFDb250YWluZXIuYlZpZXddCisgIGFDb250YWluZXIucHVzaE9iamVjdChBbm90aGVyVmll
d0NsYXNzLmNyZWF0ZSgpKTsKKyAgYUNvbnRhaW5lci50b0FycmF5KCk7IC8vIFthQ29udGFpbmVy
LmFWaWV3LCBhQ29udGFpbmVyLmJWaWV3LCA8QW5vdGhlclZpZXdDbGFzcyBpbnN0YW5jZT5dCisg
IGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTAorCisgIGBgYGh0bWwK
KyAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNz
PSJlbWJlci12aWV3Ij5BPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QjwvZGl2
PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkFub3RoZXIgdmlldzwvZGl2PgorICA8L2Rp
dj4KKyAgYGBgCisKKyAgIyMgVGVtcGxhdGVzIGFuZCBMYXlvdXQKKworICBBIGB0ZW1wbGF0ZWAs
IGB0ZW1wbGF0ZU5hbWVgLCBgZGVmYXVsdFRlbXBsYXRlYCwgYGxheW91dGAsIGBsYXlvdXROYW1l
YCBvcgorICBgZGVmYXVsdExheW91dGAgcHJvcGVydHkgb24gYSBjb250YWluZXIgdmlldyB3aWxs
IG5vdCByZXN1bHQgaW4gdGhlIHRlbXBsYXRlCisgIG9yIGxheW91dCBiZWluZyByZW5kZXJlZC4g
VGhlIEhUTUwgY29udGVudHMgb2YgYSBgRW1iZXIuQ29udGFpbmVyVmlld2AncyBET00KKyAgcmVw
cmVzZW50YXRpb24gd2lsbCBvbmx5IGJlIHRoZSByZW5kZXJlZCBIVE1MIG9mIGl0cyBjaGlsZCB2
aWV3cy4KKworICBAY2xhc3MgQ29udGFpbmVyVmlldworICBAbmFtZXNwYWNlIEVtYmVyCisgIEBl
eHRlbmRzIEVtYmVyLlZpZXcKKyovCitFbWJlci5Db250YWluZXJWaWV3ID0gRW1iZXIuVmlldy5l
eHRlbmQoRW1iZXIuTXV0YWJsZUFycmF5LCB7CisgIHN0YXRlczogc3RhdGVzLAorCisgIGluaXQ6
IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3N1cGVyKCk7CisKKyAgICB2YXIgY2hpbGRWaWV3cyA9
IGdldCh0aGlzLCAnY2hpbGRWaWV3cycpOworCisgICAgLy8gcmVkZWZpbmUgdmlldydzIGNoaWxk
Vmlld3MgcHJvcGVydHkgdGhhdCB3YXMgb2JsaXRlcmF0ZWQKKyAgICBFbWJlci5kZWZpbmVQcm9w
ZXJ0eSh0aGlzLCAnY2hpbGRWaWV3cycsIEVtYmVyLlZpZXcuY2hpbGRWaWV3c1Byb3BlcnR5KTsK
KworICAgIHZhciBfY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3M7CisKKyAgICBmb3JFYWNo
KGNoaWxkVmlld3MsIGZ1bmN0aW9uKHZpZXdOYW1lLCBpZHgpIHsKKyAgICAgIHZhciB2aWV3Owor
CisgICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiB2aWV3TmFtZSkgeworICAgICAgICB2aWV3
ID0gZ2V0KHRoaXMsIHZpZXdOYW1lKTsKKyAgICAgICAgdmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRW
aWV3KHZpZXcpOworICAgICAgICBzZXQodGhpcywgdmlld05hbWUsIHZpZXcpOworICAgICAgfSBl
bHNlIHsKKyAgICAgICAgdmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRWaWV3KHZpZXdOYW1lKTsKKyAg
ICAgIH0KKworICAgICAgX2NoaWxkVmlld3NbaWR4XSA9IHZpZXc7CisgICAgfSwgdGhpcyk7CisK
KyAgICB2YXIgY3VycmVudFZpZXcgPSBnZXQodGhpcywgJ2N1cnJlbnRWaWV3Jyk7CisgICAgaWYg
KGN1cnJlbnRWaWV3KSB7CisgICAgICBpZiAoIV9jaGlsZFZpZXdzLmxlbmd0aCkgeyBfY2hpbGRW
aWV3cyA9IHRoaXMuX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLnNsaWNlKCk7IH0KKyAg
ICAgIF9jaGlsZFZpZXdzLnB1c2godGhpcy5jcmVhdGVDaGlsZFZpZXcoY3VycmVudFZpZXcpKTsK
KyAgICB9CisgIH0sCisKKyAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCByZW1vdmVkQ291bnQsIGFk
ZGVkVmlld3MpIHsKKyAgICB2YXIgYWRkZWRDb3VudCA9IGFkZGVkVmlld3MgPyBnZXQoYWRkZWRW
aWV3cywgJ2xlbmd0aCcpIDogMDsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgY2FuJ3QgYWRkIGEgY2hpbGQgdG8gYSBjb250YWluZXIgdGhhdCBpcyBhbHJlYWR5
IGEgY2hpbGQgb2YgYW5vdGhlciB2aWV3IiwgRW1iZXIuQShhZGRlZFZpZXdzKS5ldmVyeShmdW5j
dGlvbihpdGVtKSB7IHJldHVybiAhZ2V0KGl0ZW0sICdfcGFyZW50VmlldycpIHx8IGdldChpdGVt
LCAnX3BhcmVudFZpZXcnKSA9PT0gc2VsZjsgfSkpOworCisgICAgdGhpcy5hcnJheUNvbnRlbnRX
aWxsQ2hhbmdlKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKKyAgICB0aGlzLmNoaWxk
Vmlld3NXaWxsQ2hhbmdlKHRoaXMuX2NoaWxkVmlld3MsIGlkeCwgcmVtb3ZlZENvdW50KTsKKwor
ICAgIGlmIChhZGRlZENvdW50ID09PSAwKSB7CisgICAgICB0aGlzLl9jaGlsZFZpZXdzLnNwbGlj
ZShpZHgsIHJlbW92ZWRDb3VudCkgOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgYXJncyA9IFtp
ZHgsIHJlbW92ZWRDb3VudF0uY29uY2F0KGFkZGVkVmlld3MpOworICAgICAgaWYgKGFkZGVkVmll
d3MubGVuZ3RoICYmICF0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aCkgeyB0aGlzLl9jaGlsZFZpZXdz
ID0gdGhpcy5fY2hpbGRWaWV3cy5zbGljZSgpOyB9CisgICAgICB0aGlzLl9jaGlsZFZpZXdzLnNw
bGljZS5hcHBseSh0aGlzLl9jaGlsZFZpZXdzLCBhcmdzKTsKKyAgICB9CisKKyAgICB0aGlzLmFy
cmF5Q29udGVudERpZENoYW5nZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7CisgICAg
dGhpcy5jaGlsZFZpZXdzRGlkQ2hhbmdlKHRoaXMuX2NoaWxkVmlld3MsIGlkeCwgcmVtb3ZlZENv
dW50LCBhZGRlZENvdW50KTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIG9iamVjdEF0
OiBmdW5jdGlvbihpZHgpIHsKKyAgICByZXR1cm4gdGhpcy5fY2hpbGRWaWV3c1tpZHhdOworICB9
LAorCisgIGxlbmd0aDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB0
aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKKyAgfSkudm9sYXRpbGUoKSwKKworICAvKioKKyAgICBJ
bnN0cnVjdHMgZWFjaCBjaGlsZCB2aWV3IHRvIHJlbmRlciB0byB0aGUgcGFzc2VkIHJlbmRlciBi
dWZmZXIuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgcmVuZGVyCisgICAgQHBhcmFtIHtF
bWJlci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHJlbmRlciB0bworICAqLwor
ICByZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgeworICAgIHRoaXMuZm9yRWFjaENoaWxkVmlldyhm
dW5jdGlvbih2aWV3KSB7CisgICAgICB2aWV3LnJlbmRlclRvQnVmZmVyKGJ1ZmZlcik7CisgICAg
fSk7CisgIH0sCisKKyAgaW5zdHJ1bWVudE5hbWU6ICdjb250YWluZXInLAorCisgIC8qKgorICAg
IFdoZW4gYSBjaGlsZCB2aWV3IGlzIHJlbW92ZWQsIGRlc3Ryb3kgaXRzIGVsZW1lbnQgc28gdGhh
dAorICAgIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLgorCisgICAgVGhlIGFycmF5IG9ic2Vy
dmVyIHRoYXQgdHJpZ2dlcnMgdGhpcyBhY3Rpb24gaXMgc2V0IHVwIGluIHRoZQorICAgIGByZW5k
ZXJUb0J1ZmZlcmAgbWV0aG9kLgorCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGNoaWxkVmll
d3NXaWxsQ2hhbmdlCisgICAgQHBhcmFtIHtFbWJlci5BcnJheX0gdmlld3MgdGhlIGNoaWxkIHZp
ZXdzIGFycmF5IGJlZm9yZSBtdXRhdGlvbgorICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCB0aGUg
c3RhcnQgcG9zaXRpb24gb2YgdGhlIG11dGF0aW9uCisgICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92
ZWQgdGhlIG51bWJlciBvZiBjaGlsZCB2aWV3cyByZW1vdmVkCisgICoqLworICBjaGlsZFZpZXdz
V2lsbENoYW5nZTogZnVuY3Rpb24odmlld3MsIHN0YXJ0LCByZW1vdmVkKSB7CisgICAgdGhpcy5w
cm9wZXJ0eVdpbGxDaGFuZ2UoJ2NoaWxkVmlld3MnKTsKKworICAgIGlmIChyZW1vdmVkID4gMCkg
eworICAgICAgdmFyIGNoYW5nZWRWaWV3cyA9IHZpZXdzLnNsaWNlKHN0YXJ0LCBzdGFydCtyZW1v
dmVkKTsKKyAgICAgIC8vIHRyYW5zaXRpb24gdG8gcHJlUmVuZGVyIGJlZm9yZSBjbGVhcmluZyBw
YXJlbnRWaWV3CisgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5jaGlsZFZpZXdzV2lsbENoYW5nZSh0
aGlzLCB2aWV3cywgc3RhcnQsIHJlbW92ZWQpOworICAgICAgdGhpcy5pbml0aWFsaXplVmlld3Mo
Y2hhbmdlZFZpZXdzLCBudWxsLCBudWxsKTsKKyAgICB9CisgIH0sCisKKyAgcmVtb3ZlQ2hpbGQ6
IGZ1bmN0aW9uKGNoaWxkKSB7CisgICAgdGhpcy5yZW1vdmVPYmplY3QoY2hpbGQpOworICAgIHJl
dHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgIFdoZW4gYSBjaGlsZCB2aWV3IGlzIGFkZGVk
LCBtYWtlIHN1cmUgdGhlIERPTSBnZXRzIHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KKworICAgIElm
IHRoZSB2aWV3IGhhcyBhbHJlYWR5IHJlbmRlcmVkIGFuIGVsZW1lbnQsIHdlIHRlbGwgdGhlIGNo
aWxkIHZpZXcgdG8KKyAgICBjcmVhdGUgYW4gZWxlbWVudCBhbmQgaW5zZXJ0IGl0IGludG8gdGhl
IERPTS4gSWYgdGhlIGVuY2xvc2luZyBjb250YWluZXIKKyAgICB2aWV3IGhhcyBhbHJlYWR5IHdy
aXR0ZW4gdG8gYSBidWZmZXIsIGJ1dCBub3QgeWV0IGNvbnZlcnRlZCB0aGF0IGJ1ZmZlcgorICAg
IGludG8gYW4gZWxlbWVudCwgd2UgaW5zZXJ0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yg
dGhlIGNoaWxkIGludG8gdGhlCisgICAgYXBwcm9wcmlhdGUgcGxhY2UgaW4gdGhlIGJ1ZmZlci4K
KworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBjaGlsZFZpZXdzRGlkQ2hhbmdlCisgICAgQHBh
cmFtIHtFbWJlci5BcnJheX0gdmlld3MgdGhlIGFycmF5IG9mIGNoaWxkIHZpZXdzIGFmdGUgdGhl
IG11dGF0aW9uIGhhcyBvY2N1cnJlZAorICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCB0aGUgc3Rh
cnQgcG9zaXRpb24gb2YgdGhlIG11dGF0aW9uCisgICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQg
dGhlIG51bWJlciBvZiBjaGlsZCB2aWV3cyByZW1vdmVkCisgICAgQHBhcmFtIHtOdW1iZXJ9IHRo
ZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgYWRkZWQKKyAgKi8KKyAgY2hpbGRWaWV3c0RpZENoYW5n
ZTogZnVuY3Rpb24odmlld3MsIHN0YXJ0LCByZW1vdmVkLCBhZGRlZCkgeworICAgIGlmIChhZGRl
ZCA+IDApIHsKKyAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5zbGljZShzdGFydCwgc3Rh
cnQrYWRkZWQpOworICAgICAgdGhpcy5pbml0aWFsaXplVmlld3MoY2hhbmdlZFZpZXdzLCB0aGlz
LCBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpKTsKKyAgICAgIHRoaXMuY3VycmVudFN0YXRlLmNo
aWxkVmlld3NEaWRDaGFuZ2UodGhpcywgdmlld3MsIHN0YXJ0LCBhZGRlZCk7CisgICAgfQorICAg
IHRoaXMucHJvcGVydHlEaWRDaGFuZ2UoJ2NoaWxkVmlld3MnKTsKKyAgfSwKKworICBpbml0aWFs
aXplVmlld3M6IGZ1bmN0aW9uKHZpZXdzLCBwYXJlbnRWaWV3LCB0ZW1wbGF0ZURhdGEpIHsKKyAg
ICBmb3JFYWNoKHZpZXdzLCBmdW5jdGlvbih2aWV3KSB7CisgICAgICBzZXQodmlldywgJ19wYXJl
bnRWaWV3JywgcGFyZW50Vmlldyk7CisKKyAgICAgIGlmICghdmlldy5jb250YWluZXIgJiYgcGFy
ZW50VmlldykgeworICAgICAgICBzZXQodmlldywgJ2NvbnRhaW5lcicsIHBhcmVudFZpZXcuY29u
dGFpbmVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFnZXQodmlldywgJ3RlbXBsYXRlRGF0YScp
KSB7CisgICAgICAgIHNldCh2aWV3LCAndGVtcGxhdGVEYXRhJywgdGVtcGxhdGVEYXRhKTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBjdXJyZW50VmlldzogbnVsbCwKKworICBfY3VycmVu
dFZpZXdXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY3VycmVudFZpZXcnLCBmdW5j
dGlvbigpIHsKKyAgICB2YXIgY3VycmVudFZpZXcgPSBnZXQodGhpcywgJ2N1cnJlbnRWaWV3Jyk7
CisgICAgaWYgKGN1cnJlbnRWaWV3KSB7CisgICAgICBjdXJyZW50Vmlldy5kZXN0cm95KCk7Cisg
ICAgfQorICB9KSwKKworICBfY3VycmVudFZpZXdEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdj
dXJyZW50VmlldycsIGZ1bmN0aW9uKCkgeworICAgIHZhciBjdXJyZW50VmlldyA9IGdldCh0aGlz
LCAnY3VycmVudFZpZXcnKTsKKyAgICBpZiAoY3VycmVudFZpZXcpIHsKKyAgICAgIEVtYmVyLmFz
c2VydCgiWW91IHRyaWVkIHRvIHNldCBhIGN1cnJlbnQgdmlldyB0aGF0IGFscmVhZHkgaGFzIGEg
cGFyZW50LiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgbXVsdGlwbGUgb3V0bGV0cyBpbiB0aGUg
c2FtZSB2aWV3LiIsICFnZXQoY3VycmVudFZpZXcsICdfcGFyZW50VmlldycpKTsKKyAgICAgIHRo
aXMucHVzaE9iamVjdChjdXJyZW50Vmlldyk7CisgICAgfQorICB9KSwKKworICBfZW5zdXJlQ2hp
bGRyZW5BcmVJbkRPTTogZnVuY3Rpb24gKCkgeworICAgIHRoaXMuY3VycmVudFN0YXRlLmVuc3Vy
ZUNoaWxkcmVuQXJlSW5ET00odGhpcyk7CisgIH0KK30pOworCitFbWJlci5tZXJnZShzdGF0ZXMu
X2RlZmF1bHQsIHsKKyAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IEVtYmVyLkssCisgIGNoaWxkVmll
d3NEaWRDaGFuZ2U6IEVtYmVyLkssCisgIGVuc3VyZUNoaWxkcmVuQXJlSW5ET006IEVtYmVyLksK
K30pOworCitFbWJlci5tZXJnZShzdGF0ZXMuaW5CdWZmZXIsIHsKKyAgY2hpbGRWaWV3c0RpZENo
YW5nZTogZnVuY3Rpb24ocGFyZW50Vmlldywgdmlld3MsIHN0YXJ0LCBhZGRlZCkgeworICAgIHRo
cm93IG5ldyBFbWJlci5FcnJvcignWW91IGNhbm5vdCBtb2RpZnkgY2hpbGQgdmlld3Mgd2hpbGUg
aW4gdGhlIGluQnVmZmVyIHN0YXRlJyk7CisgIH0KK30pOworCitFbWJlci5tZXJnZShzdGF0ZXMu
aGFzRWxlbWVudCwgeworICBjaGlsZFZpZXdzV2lsbENoYW5nZTogZnVuY3Rpb24odmlldywgdmll
d3MsIHN0YXJ0LCByZW1vdmVkKSB7CisgICAgZm9yICh2YXIgaT1zdGFydDsgaTxzdGFydCtyZW1v
dmVkOyBpKyspIHsKKyAgICAgIHZpZXdzW2ldLnJlbW92ZSgpOworICAgIH0KKyAgfSwKKworICBj
aGlsZFZpZXdzRGlkQ2hhbmdlOiBmdW5jdGlvbih2aWV3LCB2aWV3cywgc3RhcnQsIGFkZGVkKSB7
CisgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdmlldywgJ19lbnN1cmVDaGls
ZHJlbkFyZUluRE9NJyk7CisgIH0sCisKKyAgZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTTogZnVuY3Rp
b24odmlldykgeworICAgIHZhciBjaGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cywgaSwgbGVu
LCBjaGlsZFZpZXcsIHByZXZpb3VzLCBidWZmZXIsIHZpZXdDb2xsZWN0aW9uID0gbmV3IFZpZXdD
b2xsZWN0aW9uKCk7CisKKyAgICBmb3IgKGkgPSAwLCBsZW4gPSBjaGlsZFZpZXdzLmxlbmd0aDsg
aSA8IGxlbjsgaSsrKSB7CisgICAgICBjaGlsZFZpZXcgPSBjaGlsZFZpZXdzW2ldOworCisgICAg
ICBpZiAoIWJ1ZmZlcikgeyBidWZmZXIgPSBFbWJlci5SZW5kZXJCdWZmZXIoKTsgYnVmZmVyLl9o
YXNFbGVtZW50ID0gZmFsc2U7IH0KKworICAgICAgaWYgKGNoaWxkVmlldy5yZW5kZXJUb0J1ZmZl
cklmTmVlZGVkKGJ1ZmZlcikpIHsKKyAgICAgICAgdmlld0NvbGxlY3Rpb24ucHVzaChjaGlsZFZp
ZXcpOworICAgICAgfSBlbHNlIGlmICh2aWV3Q29sbGVjdGlvbi5sZW5ndGgpIHsKKyAgICAgICAg
aW5zZXJ0Vmlld0NvbGxlY3Rpb24odmlldywgdmlld0NvbGxlY3Rpb24sIHByZXZpb3VzLCBidWZm
ZXIpOworICAgICAgICBidWZmZXIgPSBudWxsOworICAgICAgICBwcmV2aW91cyA9IGNoaWxkVmll
dzsKKyAgICAgICAgdmlld0NvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHByZXZpb3VzID0gY2hpbGRWaWV3OworICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWV3
Q29sbGVjdGlvbi5sZW5ndGgpIHsKKyAgICAgIGluc2VydFZpZXdDb2xsZWN0aW9uKHZpZXcsIHZp
ZXdDb2xsZWN0aW9uLCBwcmV2aW91cywgYnVmZmVyKTsKKyAgICB9CisgIH0KK30pOworCitmdW5j
dGlvbiBpbnNlcnRWaWV3Q29sbGVjdGlvbih2aWV3LCB2aWV3Q29sbGVjdGlvbiwgcHJldmlvdXMs
IGJ1ZmZlcikgeworICB2aWV3Q29sbGVjdGlvbi50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNl
cnRFbGVtZW50Jyk7CisKKyAgaWYgKHByZXZpb3VzKSB7CisgICAgcHJldmlvdXMuZG9tTWFuYWdl
ci5hZnRlcihwcmV2aW91cywgYnVmZmVyLnN0cmluZygpKTsKKyAgfSBlbHNlIHsKKyAgICB2aWV3
LmRvbU1hbmFnZXIucHJlcGVuZCh2aWV3LCBidWZmZXIuc3RyaW5nKCkpOworICB9CisKKyAgdmll
d0NvbGxlY3Rpb24uZm9yRWFjaChmdW5jdGlvbih2KSB7CisgICAgdi50cmFuc2l0aW9uVG8oJ2lu
RE9NJyk7CisgICAgdi5wcm9wZXJ0eURpZENoYW5nZSgnZWxlbWVudCcpOworICAgIHYudHJpZ2dl
clJlY3Vyc2l2ZWx5KCdkaWRJbnNlcnRFbGVtZW50Jyk7CisgIH0pOworfQorCisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0g
RW1iZXIuU3RyaW5nLmZtdDsKKworLyoqCisgIGBFbWJlci5Db2xsZWN0aW9uVmlld2AgaXMgYW4g
YEVtYmVyLlZpZXdgIGRlc2NlbmRlbnQgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nCisgIGEgY29s
bGVjdGlvbiAoYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QpIGJ5IG1haW50YWluaW5nIGEg
Y2hpbGQgdmlldyBvYmplY3QKKyAgYW5kIGFzc29jaWF0ZWQgRE9NIHJlcHJlc2VudGF0aW9uIGZv
ciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5IGFuZCBlbnN1cmluZworICB0aGF0IGNoaWxkIHZpZXdz
IGFuZCB0aGVpciBhc3NvY2lhdGVkIHJlbmRlcmVkIEhUTUwgYXJlIHVwZGF0ZWQgd2hlbiBpdGVt
cyBpbgorICB0aGUgYXJyYXkgYXJlIGFkZGVkLCByZW1vdmVkLCBvciByZXBsYWNlZC4KKworICAj
IyBTZXR0aW5nIGNvbnRlbnQKKworICBUaGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMg
aXMgcmVmZXJlbmNlZCBhcyB0aGUgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YAorICBpbnN0YW5jZSdz
IGBjb250ZW50YCBwcm9wZXJ0eS4KKworICBgYGBqYXZhc2NyaXB0CisgIHNvbWVJdGVtc1ZpZXcg
PSBFbWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUoeworICAgIGNvbnRlbnQ6IFsnQScsICdCJywn
QyddCisgIH0pCisgIGBgYAorCisgIFRoZSB2aWV3IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxl
Y3Rpb24gd2lsbCBoYXZlIGl0cyBgY29udGVudGAgcHJvcGVydHkgc2V0CisgIHRvIHRoZSBpdGVt
LgorCisgICMjIFNwZWNpZnlpbmcgaXRlbVZpZXdDbGFzcworCisgIEJ5IGRlZmF1bHQgdGhlIHZp
ZXcgY2xhc3MgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbWFuYWdlZCBjb2xsZWN0aW9uIHdpbGwgYmUg
YW4KKyAgaW5zdGFuY2Ugb2YgYEVtYmVyLlZpZXdgLiBZb3UgY2FuIHN1cHBseSBhIGRpZmZlcmVu
dCBjbGFzcyBieSBzZXR0aW5nIHRoZQorICBgQ29sbGVjdGlvblZpZXdgJ3MgYGl0ZW1WaWV3Q2xh
c3NgIHByb3BlcnR5LgorCisgIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIGFuZCB0aGUgZm9sbG93
aW5nIGNvZGU6CisKKyAgYGBgamF2YXNjcmlwdAorICBzb21lSXRlbXNWaWV3ID0gRW1iZXIuQ29s
bGVjdGlvblZpZXcuY3JlYXRlKHsKKyAgICBjbGFzc05hbWVzOiBbJ2EtY29sbGVjdGlvbiddLAor
ICAgIGNvbnRlbnQ6IFsnQScsJ0InLCdDJ10sCisgICAgaXRlbVZpZXdDbGFzczogRW1iZXIuVmll
dy5leHRlbmQoeworICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgidGhl
IGxldHRlcjoge3t2aWV3LmNvbnRlbnR9fSIpCisgICAgfSkKKyAgfSk7CisKKyAgc29tZUl0ZW1z
Vmlldy5hcHBlbmRUbygnYm9keScpOworICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9s
bG93aW5nIEhUTUwgc3RydWN0dXJlCisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJlbWJlci12
aWV3IGEtY29sbGVjdGlvbiI+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRl
cjogQTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEI8L2Rp
dj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBDPC9kaXY+CisgIDwv
ZGl2PgorICBgYGAKKworICAjIyBBdXRvbWF0aWMgbWF0Y2hpbmcgb2YgcGFyZW50L2NoaWxkIHRh
Z05hbWVzCisKKyAgU2V0dGluZyB0aGUgYHRhZ05hbWVgIHByb3BlcnR5IG9mIGEgYENvbGxlY3Rp
b25WaWV3YCB0byBhbnkgb2YKKyAgInVsIiwgIm9sIiwgInRhYmxlIiwgInRoZWFkIiwgInRib2R5
IiwgInRmb290IiwgInRyIiwgb3IgInNlbGVjdCIgd2lsbCByZXN1bHQKKyAgaW4gdGhlIGl0ZW0g
dmlld3MgcmVjZWl2aW5nIGFuIGFwcHJvcHJpYXRlbHkgbWF0Y2hlZCBgdGFnTmFtZWAgcHJvcGVy
dHkuCisKKyAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgYW5kIHRoZSBmb2xsb3dpbmcgY29kZToK
KworICBgYGBqYXZhc2NyaXB0CisgIGFuVW5kb3JkZXJlZExpc3RWaWV3ID0gRW1iZXIuQ29sbGVj
dGlvblZpZXcuY3JlYXRlKHsKKyAgICB0YWdOYW1lOiAndWwnLAorICAgIGNvbnRlbnQ6IFsnQScs
J0InLCdDJ10sCisgICAgaXRlbVZpZXdDbGFzczogRW1iZXIuVmlldy5leHRlbmQoeworICAgICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgidGhlIGxldHRlcjoge3t2aWV3LmNv
bnRlbnR9fSIpCisgICAgfSkKKyAgfSk7CisKKyAgYW5VbmRvcmRlcmVkTGlzdFZpZXcuYXBwZW5k
VG8oJ2JvZHknKTsKKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1M
IHN0cnVjdHVyZQorCisgIGBgYGh0bWwKKyAgPHVsIGNsYXNzPSJlbWJlci12aWV3IGEtY29sbGVj
dGlvbiI+CisgICAgPGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBBPC9saT4KKyAg
ICA8bGkgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEI8L2xpPgorICAgIDxsaSBjbGFz
cz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQzwvbGk+CisgIDwvdWw+CisgIGBgYAorCisgIEFk
ZGl0aW9uYWwgYHRhZ05hbWVgIHBhaXJzIGNhbiBiZSBwcm92aWRlZCBieSBhZGRpbmcgdG8KKyAg
YEVtYmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVAgYAorCisgIGBgYGphdmFzY3JpcHQK
KyAgRW1iZXIuQ29sbGVjdGlvblZpZXcuQ09OVEFJTkVSX01BUFsnYXJ0aWNsZSddID0gJ3NlY3Rp
b24nCisgIGBgYAorCisgICMjIFByb2dyYW1tYXRpYyBjcmVhdGlvbiBvZiBjaGlsZCB2aWV3cwor
CisgIEZvciBjYXNlcyB3aGVyZSBhZGRpdGlvbmFsIGN1c3RvbWl6YXRpb24gYmV5b25kIHRoZSB1
c2Ugb2YgYSBzaW5nbGUKKyAgYGl0ZW1WaWV3Q2xhc3NgIG9yIGB0YWdOYW1lYCBtYXRjaGluZyBp
cyByZXF1aXJlZCBDb2xsZWN0aW9uVmlldydzCisgIGBjcmVhdGVDaGlsZFZpZXdgIG1ldGhvZCBj
YW4gYmUgb3ZlcmlkZGVuOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQ3VzdG9tQ29sbGVjdGlvblZp
ZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRlbmQoeworICAgIGNyZWF0ZUNoaWxkVmlldzog
ZnVuY3Rpb24odmlld0NsYXNzLCBhdHRycykgeworICAgICAgaWYgKGF0dHJzLmNvbnRlbnQua2lu
ZCA9PSAnYWxidW0nKSB7CisgICAgICAgIHZpZXdDbGFzcyA9IEFwcC5BbGJ1bVZpZXc7CisgICAg
ICB9IGVsc2UgeworICAgICAgICB2aWV3Q2xhc3MgPSBBcHAuU29uZ1ZpZXc7CisgICAgICB9Cisg
ICAgICByZXR1cm4gdGhpcy5fc3VwZXIodmlld0NsYXNzLCBhdHRycyk7CisgICAgfQorICB9KTsK
KyAgYGBgCisKKyAgIyMgRW1wdHkgVmlldworCisgIFlvdSBjYW4gcHJvdmlkZSBhbiBgRW1iZXIu
Vmlld2Agc3ViY2xhc3MgdG8gdGhlIGBFbWJlci5Db2xsZWN0aW9uVmlld2AKKyAgaW5zdGFuY2Ug
YXMgaXRzIGBlbXB0eVZpZXdgIHByb3BlcnR5LiBJZiB0aGUgYGNvbnRlbnRgIHByb3BlcnR5IG9m
IGEKKyAgYENvbGxlY3Rpb25WaWV3YCBpcyBzZXQgdG8gYG51bGxgIG9yIGFuIGVtcHR5IGFycmF5
LCBhbiBpbnN0YW5jZSBvZiB0aGlzIHZpZXcKKyAgd2lsbCBiZSB0aGUgYENvbGxlY3Rpb25WaWV3
YHMgb25seSBjaGlsZC4KKworICBgYGBqYXZhc2NyaXB0CisgIGFMaXN0V2l0aE5vdGhpbmcgPSBF
bWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUoeworICAgIGNsYXNzTmFtZXM6IFsnbm90aGluZydd
CisgICAgY29udGVudDogbnVsbCwKKyAgICBlbXB0eVZpZXc6IEVtYmVyLlZpZXcuZXh0ZW5kKHsK
KyAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIlRoZSBjb2xsZWN0aW9u
IGlzIGVtcHR5IikKKyAgICB9KQorICB9KTsKKworICBhTGlzdFdpdGhOb3RoaW5nLmFwcGVuZFRv
KCdib2R5Jyk7CisgIGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmUKKworICBgYGBodG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgbm90aGluZyI+
CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgICBUaGUgY29sbGVjdGlvbiBpcyBl
bXB0eQorICAgIDwvZGl2PgorICA8L2Rpdj4KKyAgYGBgCisKKyAgIyMgQWRkaW5nIGFuZCBSZW1v
dmluZyBpdGVtcworCisgIFRoZSBgY2hpbGRWaWV3c2AgcHJvcGVydHkgb2YgYSBgQ29sbGVjdGlv
blZpZXdgIHNob3VsZCBub3QgYmUgZGlyZWN0bHkKKyAgbWFuaXB1bGF0ZWQuIEluc3RlYWQsIGFk
ZCwgcmVtb3ZlLCByZXBsYWNlIGl0ZW1zIGZyb20gaXRzIGBjb250ZW50YCBwcm9wZXJ0eS4KKyAg
VGhpcyB3aWxsIHRyaWdnZXIgYXBwcm9wcmlhdGUgY2hhbmdlcyB0byBpdHMgcmVuZGVyZWQgSFRN
TC4KKworCisgIEBjbGFzcyBDb2xsZWN0aW9uVmlldworICBAbmFtZXNwYWNlIEVtYmVyCisgIEBl
eHRlbmRzIEVtYmVyLkNvbnRhaW5lclZpZXcKKyAgQHNpbmNlIEVtYmVyIDAuOQorKi8KK0VtYmVy
LkNvbGxlY3Rpb25WaWV3ID0gRW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQoeworCisgIC8qKgor
ICAgIEEgbGlzdCBvZiBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgYnkgdGhlIGBFbWJlci5Db2xsZWN0
aW9uVmlld2AuCisKKyAgICBAcHJvcGVydHkgY29udGVudAorICAgIEB0eXBlIEVtYmVyLkFycmF5
CisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBjb250ZW50OiBudWxsLAorCisgIC8qKgorICAg
IFRoaXMgcHJvdmlkZXMgbWV0YWRhdGEgYWJvdXQgd2hhdCBraW5kIG9mIGVtcHR5IHZpZXcgY2xh
c3MgdGhpcworICAgIGNvbGxlY3Rpb24gd291bGQgbGlrZSBpZiBpdCBpcyBiZWluZyBpbnN0YW50
aWF0ZWQgZnJvbSBhbm90aGVyCisgICAgc3lzdGVtIChsaWtlIEhhbmRsZWJhcnMpCisKKyAgICBA
cHJpdmF0ZQorICAgIEBwcm9wZXJ0eSBlbXB0eVZpZXdDbGFzcworICAqLworICBlbXB0eVZpZXdD
bGFzczogRW1iZXIuVmlldywKKworICAvKioKKyAgICBBbiBvcHRpb25hbCB2aWV3IHRvIGRpc3Bs
YXkgaWYgY29udGVudCBpcyBzZXQgdG8gYW4gZW1wdHkgYXJyYXkuCisKKyAgICBAcHJvcGVydHkg
ZW1wdHlWaWV3CisgICAgQHR5cGUgRW1iZXIuVmlldworICAgIEBkZWZhdWx0IG51bGwKKyAgKi8K
KyAgZW1wdHlWaWV3OiBudWxsLAorCisgIC8qKgorICAgIEBwcm9wZXJ0eSBpdGVtVmlld0NsYXNz
CisgICAgQHR5cGUgRW1iZXIuVmlldworICAgIEBkZWZhdWx0IEVtYmVyLlZpZXcKKyAgKi8KKyAg
aXRlbVZpZXdDbGFzczogRW1iZXIuVmlldywKKworICAvKioKKyAgICBTZXR1cCBhIENvbGxlY3Rp
b25WaWV3CisKKyAgICBAbWV0aG9kIGluaXQKKyAgKi8KKyAgaW5pdDogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIHJldCA9IHRoaXMuX3N1cGVyKCk7CisgICAgdGhpcy5fY29udGVudERpZENoYW5nZSgp
OworICAgIHJldHVybiByZXQ7CisgIH0sCisKKyAgLyoqCisgICAgSW52b2tlZCB3aGVuIHRoZSBj
b250ZW50IHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZS4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRo
YXQgdGhlCisgICAgZW50aXJlIGFycmF5IGNvbnRlbnQgd2lsbCBjaGFuZ2UuCisKKyAgICBAcHJp
dmF0ZQorICAgIEBtZXRob2QgX2NvbnRlbnRXaWxsQ2hhbmdlCisgICovCisgIF9jb250ZW50V2ls
bENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgY29udGVudCA9IHRoaXMuZ2V0KCdjb250ZW50Jyk7CisKKyAgICBpZiAoY29udGVudCkg
eyBjb250ZW50LnJlbW92ZUFycmF5T2JzZXJ2ZXIodGhpcyk7IH0KKyAgICB2YXIgbGVuID0gY29u
dGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAwOworICAgIHRoaXMuYXJyYXlXaWxsQ2hh
bmdlKGNvbnRlbnQsIDAsIGxlbik7CisgIH0pLAorCisgIC8qKgorICAgIENoZWNrIHRvIG1ha2Ug
c3VyZSB0aGF0IHRoZSBjb250ZW50IGhhcyBjaGFuZ2VkLCBhbmQgaWYgc28sCisgICAgdXBkYXRl
IHRoZSBjaGlsZHJlbiBkaXJlY3RseS4gVGhpcyBpcyBhbHdheXMgc2NoZWR1bGVkCisgICAgYXN5
bmNocm9ub3VzbHksIHRvIGFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQgYmVmb3JlCisg
ICAgYmluZGluZ3MgaGF2ZSBzeW5jaHJvbml6ZWQgYW5kIHZpY2UgdmVyc2EuCisKKyAgICBAcHJp
dmF0ZQorICAgIEBtZXRob2QgX2NvbnRlbnREaWRDaGFuZ2UKKyAgKi8KKyAgX2NvbnRlbnREaWRD
aGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7CisgICAgdmFyIGNv
bnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKKworICAgIGlmIChjb250ZW50KSB7CisgICAg
ICB0aGlzLl9hc3NlcnRBcnJheUxpa2UoY29udGVudCk7CisgICAgICBjb250ZW50LmFkZEFycmF5
T2JzZXJ2ZXIodGhpcyk7CisgICAgfQorCisgICAgdmFyIGxlbiA9IGNvbnRlbnQgPyBnZXQoY29u
dGVudCwgJ2xlbmd0aCcpIDogMDsKKyAgICB0aGlzLmFycmF5RGlkQ2hhbmdlKGNvbnRlbnQsIDAs
IG51bGwsIGxlbik7CisgIH0pLAorCisgIC8qKgorICAgIEVuc3VyZSB0aGF0IHRoZSBjb250ZW50
IGltcGxlbWVudHMgRW1iZXIuQXJyYXkKKworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfYXNz
ZXJ0QXJyYXlMaWtlCisgICovCisgIF9hc3NlcnRBcnJheUxpa2U6IGZ1bmN0aW9uKGNvbnRlbnQp
IHsKKyAgICBFbWJlci5hc3NlcnQoZm10KCJhbiBFbWJlci5Db2xsZWN0aW9uVmlldydzIGNvbnRl
bnQgbXVzdCBpbXBsZW1lbnQgRW1iZXIuQXJyYXkuIFlvdSBwYXNzZWQgJUAiLCBbY29udGVudF0p
LCBFbWJlci5BcnJheS5kZXRlY3QoY29udGVudCkpOworICB9LAorCisgIC8qKgorICAgIFJlbW92
ZXMgdGhlIGNvbnRlbnQgYW5kIGNvbnRlbnQgb2JzZXJ2ZXJzLgorCisgICAgQG1ldGhvZCBkZXN0
cm95CisgICovCisgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy5fc3VwZXIo
KSkgeyByZXR1cm47IH0KKworICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7
CisgICAgaWYgKGNvbnRlbnQpIHsgY29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMpOyB9
CisKKyAgICBpZiAodGhpcy5fY3JlYXRlZEVtcHR5VmlldykgeworICAgICAgdGhpcy5fY3JlYXRl
ZEVtcHR5Vmlldy5kZXN0cm95KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisK
KyAgLyoqCisgICAgQ2FsbGVkIHdoZW4gYSBtdXRhdGlvbiB0byB0aGUgdW5kZXJseWluZyBjb250
ZW50IGFycmF5IHdpbGwgb2NjdXIuCisKKyAgICBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSBhbnkg
dmlld3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSB1bmRlcmx5aW5nCisgICAgY29udGVudCBh
cnJheS4KKworICAgIEludm9rZXMgd2hlbmV2ZXIgdGhlIGNvbnRlbnQgYXJyYXkgaXRzZWxmIHdp
bGwgY2hhbmdlLgorCisgICAgQG1ldGhvZCBhcnJheVdpbGxDaGFuZ2UKKyAgICBAcGFyYW0ge0Fy
cmF5fSBjb250ZW50IHRoZSBtYW5hZ2VkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cworICAgIEBwYXJh
bSB7TnVtYmVyfSBzdGFydCB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGNoYW5nZXMgd2lsbCBvY2N1
cnIKKyAgICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlZCBudW1iZXIgb2Ygb2JqZWN0IHRvIGJlIHJl
bW92ZWQgZnJvbSBjb250ZW50CisgICovCisgIGFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24oY29u
dGVudCwgc3RhcnQsIHJlbW92ZWRDb3VudCkgeworICAgIC8vIElmIHRoZSBjb250ZW50cyB3ZXJl
IGVtcHR5IGJlZm9yZSBhbmQgdGhpcyB0ZW1wbGF0ZSBjb2xsZWN0aW9uIGhhcyBhbgorICAgIC8v
IGVtcHR5IHZpZXcgcmVtb3ZlIGl0IG5vdy4KKyAgICB2YXIgZW1wdHlWaWV3ID0gZ2V0KHRoaXMs
ICdlbXB0eVZpZXcnKTsKKyAgICBpZiAoZW1wdHlWaWV3ICYmIGVtcHR5VmlldyBpbnN0YW5jZW9m
IEVtYmVyLlZpZXcpIHsKKyAgICAgIGVtcHR5Vmlldy5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAg
fQorCisgICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkIHZpZXdzIHRoYXQgY29ycmVzcG9uZCB3aXRo
IHRoZSByZW1vdmVkIGl0ZW1zLgorICAgIC8vIE5vdGUgdGhhdCB3ZSBsb29wIGZyb20gdGhlIGVu
ZCBvZiB0aGUgYXJyYXkgdG8gdGhlIGJlZ2lubmluZyBiZWNhdXNlCisgICAgLy8gd2UgYXJlIG11
dGF0aW5nIGl0IGFzIHdlIGdvLgorICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3
cywgY2hpbGRWaWV3LCBpZHgsIGxlbjsKKworICAgIGxlbiA9IHRoaXMuX2NoaWxkVmlld3MubGVu
Z3RoOworCisgICAgdmFyIHJlbW92aW5nQWxsID0gcmVtb3ZlZENvdW50ID09PSBsZW47CisKKyAg
ICBpZiAocmVtb3ZpbmdBbGwpIHsKKyAgICAgIHRoaXMuY3VycmVudFN0YXRlLmVtcHR5KHRoaXMp
OworICAgICAgdGhpcy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7CisgICAgICAg
IHZpZXcucmVtb3ZlZEZyb21ET00gPSB0cnVlOworICAgICAgfSwgZmFsc2UpOworICAgIH0KKwor
ICAgIGZvciAoaWR4ID0gc3RhcnQgKyByZW1vdmVkQ291bnQgLSAxOyBpZHggPj0gc3RhcnQ7IGlk
eC0tKSB7CisgICAgICBjaGlsZFZpZXcgPSBjaGlsZFZpZXdzW2lkeF07CisgICAgICBjaGlsZFZp
ZXcuZGVzdHJveSgpOworICAgIH0KKyAgfSwKKworICAvKioKKyAgICBDYWxsZWQgd2hlbiBhIG11
dGF0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgYXJyYXkgb2NjdXJzLgorCisgICAgVGhp
cyBtZXRob2Qgd2lsbCByZXBsYXkgdGhhdCBtdXRhdGlvbiBhZ2FpbnN0IHRoZSB2aWV3cyB0aGF0
IGNvbXBvc2UgdGhlCisgICAgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YCwgZW5zdXJpbmcgdGhhdCB0
aGUgdmlldyByZWZsZWN0cyB0aGUgbW9kZWwuCisKKyAgICBUaGlzIGFycmF5IG9ic2VydmVyIGlz
IGFkZGVkIGluIGBjb250ZW50RGlkQ2hhbmdlYC4KKworICAgIEBtZXRob2QgYXJyYXlEaWRDaGFu
Z2UKKyAgICBAcGFyYW0ge0FycmF5fSBjb250ZW50IHRoZSBtYW5hZ2VkIGNvbGxlY3Rpb24gb2Yg
b2JqZWN0cworICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCB0aGUgaW5kZXggYXQgd2hpY2ggdGhl
IGNoYW5nZXMgb2NjdXJyZWQKKyAgICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlZCBudW1iZXIgb2Yg
b2JqZWN0IHJlbW92ZWQgZnJvbSBjb250ZW50CisgICAgQHBhcmFtIHtOdW1iZXJ9IGFkZGVkIG51
bWJlciBvZiBvYmplY3QgYWRkZWQgdG8gY29udGVudAorICAqLworICBhcnJheURpZENoYW5nZTog
ZnVuY3Rpb24oY29udGVudCwgc3RhcnQsIHJlbW92ZWQsIGFkZGVkKSB7CisgICAgdmFyIGFkZGVk
Vmlld3MgPSBbXSwgdmlldywgaXRlbSwgaWR4LCBsZW4sIGl0ZW1WaWV3Q2xhc3MsCisgICAgICBl
bXB0eVZpZXc7CisKKyAgICBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6
IDA7CisKKyAgICBpZiAobGVuKSB7CisgICAgICBpdGVtVmlld0NsYXNzID0gZ2V0KHRoaXMsICdp
dGVtVmlld0NsYXNzJyk7CisKKyAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGl0ZW1WaWV3
Q2xhc3MpIHsKKyAgICAgICAgaXRlbVZpZXdDbGFzcyA9IGdldChpdGVtVmlld0NsYXNzKSB8fCBp
dGVtVmlld0NsYXNzOworICAgICAgfQorCisgICAgICBFbWJlci5hc3NlcnQoZm10KCJpdGVtVmll
d0NsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBFbWJlci5WaWV3LCBub3QgJUAiLCBbaXRlbVZp
ZXdDbGFzc10pLCAnc3RyaW5nJyA9PT0gdHlwZW9mIGl0ZW1WaWV3Q2xhc3MgfHwgRW1iZXIuVmll
dy5kZXRlY3QoaXRlbVZpZXdDbGFzcykpOworCisgICAgICBmb3IgKGlkeCA9IHN0YXJ0OyBpZHgg
PCBzdGFydCthZGRlZDsgaWR4KyspIHsKKyAgICAgICAgaXRlbSA9IGNvbnRlbnQub2JqZWN0QXQo
aWR4KTsKKworICAgICAgICB2aWV3ID0gdGhpcy5jcmVhdGVDaGlsZFZpZXcoaXRlbVZpZXdDbGFz
cywgeworICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sCisgICAgICAgICAgY29udGVudEluZGV4OiBp
ZHgKKyAgICAgICAgfSk7CisKKyAgICAgICAgYWRkZWRWaWV3cy5wdXNoKHZpZXcpOworICAgICAg
fQorICAgIH0gZWxzZSB7CisgICAgICBlbXB0eVZpZXcgPSBnZXQodGhpcywgJ2VtcHR5Vmlldycp
OworCisgICAgICBpZiAoIWVtcHR5VmlldykgeyByZXR1cm47IH0KKworICAgICAgaWYgKCdzdHJp
bmcnID09PSB0eXBlb2YgZW1wdHlWaWV3KSB7CisgICAgICAgIGVtcHR5VmlldyA9IGdldChlbXB0
eVZpZXcpIHx8IGVtcHR5VmlldzsKKyAgICAgIH0KKworICAgICAgZW1wdHlWaWV3ID0gdGhpcy5j
cmVhdGVDaGlsZFZpZXcoZW1wdHlWaWV3KTsKKyAgICAgIGFkZGVkVmlld3MucHVzaChlbXB0eVZp
ZXcpOworICAgICAgc2V0KHRoaXMsICdlbXB0eVZpZXcnLCBlbXB0eVZpZXcpOworCisgICAgICBp
ZiAoRW1iZXIuQ29yZVZpZXcuZGV0ZWN0KGVtcHR5VmlldykpIHsKKyAgICAgICAgdGhpcy5fY3Jl
YXRlZEVtcHR5VmlldyA9IGVtcHR5VmlldzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLnJl
cGxhY2Uoc3RhcnQsIDAsIGFkZGVkVmlld3MpOworICB9LAorCisgIC8qKgorICAgIEluc3RhbnRp
YXRlcyBhIHZpZXcgdG8gYmUgYWRkZWQgdG8gdGhlIGNoaWxkVmlld3MgYXJyYXkgZHVyaW5nIHZp
ZXcKKyAgICBpbml0aWFsaXphdGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBjYWxsIHRoaXMg
bWV0aG9kIGRpcmVjdGx5IHVubGVzcworICAgIHlvdSBhcmUgb3ZlcnJpZGluZyBgY3JlYXRlQ2hp
bGRWaWV3cygpYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKKyAgICBhdXRvbWF0aWNhbGx5
IGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBzZXR0aW5ncyBvbiB0aGUgbmV3IHZpZXcgaW5zdGFuY2Ug
dG8KKyAgICBhY3QgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50LgorCisgICAgVGhlIHRhZyBuYW1l
IGZvciB0aGUgdmlldyB3aWxsIGJlIHNldCB0byB0aGUgdGFnTmFtZSBvZiB0aGUgdmlld0NsYXNz
CisgICAgcGFzc2VkIGluLgorCisgICAgQG1ldGhvZCBjcmVhdGVDaGlsZFZpZXcKKyAgICBAcGFy
YW0ge0NsYXNzfSB2aWV3Q2xhc3MKKyAgICBAcGFyYW0ge0hhc2h9IFthdHRyc10gQXR0cmlidXRl
cyB0byBhZGQKKyAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSBuZXcgaW5zdGFuY2UKKyAgKi8KKyAg
Y3JlYXRlQ2hpbGRWaWV3OiBmdW5jdGlvbih2aWV3LCBhdHRycykgeworICAgIHZpZXcgPSB0aGlz
Ll9zdXBlcih2aWV3LCBhdHRycyk7CisKKyAgICB2YXIgaXRlbVRhZ05hbWUgPSBnZXQodmlldywg
J3RhZ05hbWUnKTsKKworICAgIGlmIChpdGVtVGFnTmFtZSA9PT0gbnVsbCB8fCBpdGVtVGFnTmFt
ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBpdGVtVGFnTmFtZSA9IEVtYmVyLkNvbGxlY3Rpb25W
aWV3LkNPTlRBSU5FUl9NQVBbZ2V0KHRoaXMsICd0YWdOYW1lJyldOworICAgICAgc2V0KHZpZXcs
ICd0YWdOYW1lJywgaXRlbVRhZ05hbWUpOworICAgIH0KKworICAgIHJldHVybiB2aWV3OworICB9
Cit9KTsKKworLyoqCisgIEEgbWFwIG9mIHBhcmVudCB0YWdzIHRvIHRoZWlyIGRlZmF1bHQgY2hp
bGQgdGFncy4gWW91IGNhbiBhZGQKKyAgYWRkaXRpb25hbCBwYXJlbnQgdGFncyBpZiB5b3Ugd2Fu
dCBjb2xsZWN0aW9uIHZpZXdzIHRoYXQgdXNlCisgIGEgcGFydGljdWxhciBwYXJlbnQgdGFnIHRv
IGRlZmF1bHQgdG8gYSBjaGlsZCB0YWcuCisKKyAgQHByb3BlcnR5IENPTlRBSU5FUl9NQVAKKyAg
QHR5cGUgSGFzaAorICBAc3RhdGljCisgIEBmaW5hbAorKi8KK0VtYmVyLkNvbGxlY3Rpb25WaWV3
LkNPTlRBSU5FUl9NQVAgPSB7CisgIHVsOiAnbGknLAorICBvbDogJ2xpJywKKyAgdGFibGU6ICd0
cicsCisgIHRoZWFkOiAndHInLAorICB0Ym9keTogJ3RyJywKKyAgdGZvb3Q6ICd0cicsCisgIHRy
OiAndGQnLAorICBzZWxlY3Q6ICdvcHRpb24nCit9OworCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgewordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBpc05vbmUgPSBFbWJl
ci5pc05vbmUsCisgICAgYV9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKKworCisvKioK
K0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItdmlld3MKKyovCisKKy8qKgorICBBbiBg
RW1iZXIuQ29tcG9uZW50YCBpcyBhIHZpZXcgdGhhdCBpcyBjb21wbGV0ZWx5CisgIGlzb2xhdGVk
LiBQcm9wZXJ0eSBhY2Nlc3MgaW4gaXRzIHRlbXBsYXRlcyBnbworICB0byB0aGUgdmlldyBvYmpl
Y3QgYW5kIGFjdGlvbnMgYXJlIHRhcmdldGVkIGF0CisgIHRoZSB2aWV3IG9iamVjdC4gVGhlcmUg
aXMgbm8gYWNjZXNzIHRvIHRoZQorICBzdXJyb3VuZGluZyBjb250ZXh0IG9yIG91dGVyIGNvbnRy
b2xsZXI7IGFsbAorICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIG11c3QgYmUgcGFzc2VkIGluLgor
CisgIFRoZSBlYXNpZXN0IHdheSB0byBjcmVhdGUgYW4gYEVtYmVyLkNvbXBvbmVudGAgaXMgdmlh
CisgIGEgdGVtcGxhdGUuIElmIHlvdSBuYW1lIGEgdGVtcGxhdGUKKyAgYGNvbXBvbmVudHMvbXkt
Zm9vYCwgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UKKyAgYHt7bXktZm9vfX1gIGluIG90aGVyIHRl
bXBsYXRlcywgd2hpY2ggd2lsbCBtYWtlCisgIGFuIGluc3RhbmNlIG9mIHRoZSBpc29sYXRlZCBj
b21wb25lbnQuCisKKyAgYGBgaHRtbAorICB7e2FwcC1wcm9maWxlIHBlcnNvbj1jdXJyZW50VXNl
cn19CisgIGBgYAorCisgIGBgYGh0bWwKKyAgPCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4K
KyAgPGgxPnt7cGVyc29uLnRpdGxlfX08L2gxPgorICA8aW1nIHt7YmluZC1hdHRyIHNyYz1wZXJz
b24uYXZhdGFyfX0+CisgIDxwIGNsYXNzPSdzaWduYXR1cmUnPnt7cGVyc29uLnNpZ25hdHVyZX19
PC9wPgorICBgYGAKKworICBZb3UgY2FuIHVzZSBgeWllbGRgIGluc2lkZSBhIHRlbXBsYXRlIHRv
CisgIGluY2x1ZGUgdGhlICoqY29udGVudHMqKiBvZiBhbnkgYmxvY2sgYXR0YWNoZWQgdG8KKyAg
dGhlIGNvbXBvbmVudC4gVGhlIGJsb2NrIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlCisgIGNvbnRl
eHQgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQgb3Igb3V0ZXIgY29udHJvbGxlcjoKKworICBg
YGBoYW5kbGViYXJzCisgIHt7I2FwcC1wcm9maWxlIHBlcnNvbj1jdXJyZW50VXNlcn19CisgICAg
PHA+QWRtaW4gbW9kZTwvcD4KKyAgICB7eyEgRXhlY3V0ZWQgaW4gdGhlIGNvbnRyb2xsZXJzIGNv
bnRleHQuIH19CisgIHt7L2FwcC1wcm9maWxlfX0KKyAgYGBgCisKKyAgYGBgaGFuZGxlYmFycwor
ICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRlIC0tPgorICA8aDE+e3twZXJzb24udGl0bGV9fTwv
aDE+CisgIHt7ISBFeGVjdXRlZCBpbiB0aGUgY29tcG9uZW50cyBjb250ZXh0LiB9fQorICB7e3lp
ZWxkfX0ge3shIGJsb2NrIGNvbnRlbnRzIH19CisgIGBgYAorCisgIElmIHlvdSB3YW50IHRvIGN1
c3RvbWl6ZSB0aGUgY29tcG9uZW50LCBpbiBvcmRlciB0bworICBoYW5kbGUgZXZlbnRzIG9yIGFj
dGlvbnMsIHlvdSBpbXBsZW1lbnQgYSBzdWJjbGFzcworICBvZiBgRW1iZXIuQ29tcG9uZW50YCBu
YW1lZCBhZnRlciB0aGUgbmFtZSBvZiB0aGUKKyAgY29tcG9uZW50LiBOb3RlIHRoYXQgYENvbXBv
bmVudGAgbmVlZHMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIG5hbWUgb2YKKyAgeW91ciBzdWJjbGFz
cyBsaWtlIGBBcHBQcm9maWxlQ29tcG9uZW50YC4KKworICBGb3IgZXhhbXBsZSwgeW91IGNvdWxk
IGltcGxlbWVudCB0aGUgYWN0aW9uCisgIGBoZWxsb2AgZm9yIHRoZSBgYXBwLXByb2ZpbGVgIGNv
bXBvbmVudDoKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5BcHBQcm9maWxlQ29tcG9uZW50ID0g
RW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgYWN0aW9uczogeworICAgICAgaGVsbG86IGZ1
bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgY29uc29sZS5sb2coIkhlbGxvIiwgbmFtZSk7CisgICAg
ICB9CisgICAgfQorICB9KTsKKyAgYGBgCisKKyAgQW5kIHRoZW4gdXNlIGl0IGluIHRoZSBjb21w
b25lbnQncyB0ZW1wbGF0ZToKKworICBgYGBodG1sCisgIDwhLS0gYXBwLXByb2ZpbGUgdGVtcGxh
dGUgLS0+CisKKyAgPGgxPnt7cGVyc29uLnRpdGxlfX08L2gxPgorICB7e3lpZWxkfX0gPCEtLSBi
bG9jayBjb250ZW50cyAtLT4KKworICA8YnV0dG9uIHt7YWN0aW9uICdoZWxsbycgcGVyc29uLm5h
bWV9fT4KKyAgICBTYXkgSGVsbG8gdG8ge3twZXJzb24ubmFtZX19CisgIDwvYnV0dG9uPgorICBg
YGAKKworICBDb21wb25lbnRzIG11c3QgaGF2ZSBhIGAtYCBpbiB0aGVpciBuYW1lIHRvIGF2b2lk
CisgIGNvbmZsaWN0cyB3aXRoIGJ1aWx0LWluIGNvbnRyb2xzIHRoYXQgd3JhcCBIVE1MCisgIGVs
ZW1lbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc2FtZQorICByZXF1aXJlbWVudCBp
biB3ZWIgY29tcG9uZW50cy4KKworICBAY2xhc3MgQ29tcG9uZW50CisgIEBuYW1lc3BhY2UgRW1i
ZXIKKyAgQGV4dGVuZHMgRW1iZXIuVmlldworKi8KK0VtYmVyLkNvbXBvbmVudCA9IEVtYmVyLlZp
ZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgaW5pdDogZnVuY3Rpb24o
KSB7CisgICAgdGhpcy5fc3VwZXIoKTsKKyAgICBzZXQodGhpcywgJ2NvbnRleHQnLCB0aGlzKTsK
KyAgICBzZXQodGhpcywgJ2NvbnRyb2xsZXInLCB0aGlzKTsKKyAgfSwKKworICBkZWZhdWx0TGF5
b3V0OiBmdW5jdGlvbihvcHRpb25zKXsKKyAgICBvcHRpb25zLmRhdGEgPSB7dmlldzogb3B0aW9u
cy5fY29udGV4dH07CisgICAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzWyd5aWVsZCddLmFwcGx5
KHRoaXMsIFtvcHRpb25zXSk7CisgIH0sCisKKyAgLy8gZHVyaW5nIHJlbmRlciwgaXNvbGF0ZSBr
ZXl3b3JkcworICBjbG9uZUtleXdvcmRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4geworICAg
ICAgdmlldzogdGhpcywKKyAgICAgIGNvbnRyb2xsZXI6IHRoaXMKKyAgICB9OworICB9LAorCisg
IF95aWVsZDogZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgeworICAgIHZhciB2aWV3ID0gb3B0
aW9ucy5kYXRhLnZpZXcsCisgICAgICAgIHBhcmVudFZpZXcgPSB0aGlzLl9wYXJlbnRWaWV3LAor
ICAgICAgICB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGUnKTsKKworICAgIGlmICh0ZW1w
bGF0ZSkgeworICAgICAgRW1iZXIuYXNzZXJ0KCJBIENvbXBvbmVudCBtdXN0IGhhdmUgYSBwYXJl
bnQgdmlldyBpbiBvcmRlciB0byB5aWVsZC4iLCBwYXJlbnRWaWV3KTsKKworICAgICAgdmlldy5h
cHBlbmRDaGlsZChFbWJlci5WaWV3LCB7CisgICAgICAgIGlzVmlydHVhbDogdHJ1ZSwKKyAgICAg
ICAgdGFnTmFtZTogJycsCisgICAgICAgIF9jb250ZXh0VmlldzogcGFyZW50VmlldywKKyAgICAg
ICAgdGVtcGxhdGU6IHRlbXBsYXRlLAorICAgICAgICBjb250ZXh0OiBnZXQocGFyZW50Vmlldywg
J2NvbnRleHQnKSwKKyAgICAgICAgY29udHJvbGxlcjogZ2V0KHBhcmVudFZpZXcsICdjb250cm9s
bGVyJyksCisgICAgICAgIHRlbXBsYXRlRGF0YTogeyBrZXl3b3JkczogcGFyZW50Vmlldy5jbG9u
ZUtleXdvcmRzKCkgfQorICAgICAgfSk7CisgICAgfQorICB9LAorCisgIC8qKgorICAgIElmIHRo
ZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGluc2VydGVkIGludG8gdGhlIERPTSBvZiBhIHBhcmVu
dCB2aWV3LCB0aGlzCisgICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUgY29udHJvbGxlciBv
ZiB0aGUgcGFyZW50IHZpZXcuCisKKyAgICBAcHJvcGVydHkgdGFyZ2V0T2JqZWN0CisgICAgQHR5
cGUgRW1iZXIuQ29udHJvbGxlcgorICAgIEBkZWZhdWx0IG51bGwKKyAgKi8KKyAgdGFyZ2V0T2Jq
ZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKKyAgICB2YXIgcGFyZW50VmlldyA9
IGdldCh0aGlzLCAnX3BhcmVudFZpZXcnKTsKKyAgICByZXR1cm4gcGFyZW50VmlldyA/IGdldChw
YXJlbnRWaWV3LCAnY29udHJvbGxlcicpIDogbnVsbDsKKyAgfSkucHJvcGVydHkoJ19wYXJlbnRW
aWV3JyksCisKKyAgLyoqCisgICAgVHJpZ2dlcnMgYSBuYW1lZCBhY3Rpb24gb24gdGhlIGNvbnRy
b2xsZXIgY29udGV4dCB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVzZWQgaWYKKyAgICB0aGlzIGNv
bnRyb2xsZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbnMgb2YgdGhlIGFjdGlvbi4K
KworICAgIEZvciBleGFtcGxlIGEgY29tcG9uZW50IGZvciBwbGF5aW5nIG9yIHBhdXNpbmcgbXVz
aWMgbWF5IHRyYW5zbGF0ZSBjbGljayBldmVudHMKKyAgICBpbnRvIGFjdGlvbiBub3RpZmljYXRp
b25zIG9mICJwbGF5IiBvciAic3RvcCIgZGVwZW5kaW5nIG9uIHNvbWUgaW50ZXJuYWwgc3RhdGUK
KyAgICBvZiB0aGUgY29tcG9uZW50OgorCisKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBs
YXlCdXR0b25Db21wb25lbnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICAgIGNsaWNr
OiBmdW5jdGlvbigpeworICAgICAgICBpZiAodGhpcy5nZXQoJ2lzUGxheWluZycpKSB7CisgICAg
ICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKCdwbGF5Jyk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKCdzdG9wJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKKworICAgIFdoZW4gdXNlZCBpbnNpZGUgYSB0ZW1wbGF0ZSB0aGVzZSBj
b21wb25lbnQgYWN0aW9ucyBhcmUgY29uZmlndXJlZCB0bworICAgIHRyaWdnZXIgYWN0aW9ucyBp
biB0aGUgb3V0ZXIgYXBwbGljYXRpb24gY29udGV4dDoKKworICAgIGBgYGhhbmRsZWJhcnMKKyAg
ICB7eyEgYXBwbGljYXRpb24uaGJzIH19CisgICAge3twbGF5LWJ1dHRvbiBwbGF5PSJtdXNpY1N0
YXJ0ZWQiIHN0b3A9Im11c2ljU3RvcHBlZCJ9fQorICAgIGBgYAorCisgICAgV2hlbiB0aGUgY29t
cG9uZW50IHJlY2VpdmVzIGEgYnJvd3NlciBgY2xpY2tgIGV2ZW50IGl0IHRyYW5zbGF0ZSB0aGlz
CisgICAgaW50ZXJhY3Rpb24gaW50byBhcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKCJw
bGF5IiBvciAic3RvcCIpIGFuZAorICAgIHRyaWdnZXJzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIG5h
bWUgb24gdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSB0ZW1wbGF0ZQorICAgIHdoZXJlIHRoZSBjb21w
b25lbnQgaXMgdXNlZDogCisKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgYWN0aW9uczog
eworICAgICAgICBtdXNpY1N0YXJ0ZWQ6IGZ1bmN0aW9uKCl7CisgICAgICAgICAgLy8gY2FsbGVk
IHdoZW4gdGhlIHBsYXkgYnV0dG9uIGlzIGNsaWNrZWQKKyAgICAgICAgICAvLyBhbmQgdGhlIG11
c2ljIHN0YXJ0ZWQgcGxheWluZworICAgICAgICB9LAorICAgICAgICBtdXNpY1N0b3BwZWQ6IGZ1
bmN0aW9uKCl7CisgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHBsYXkgYnV0dG9uIGlzIGNs
aWNrZWQKKyAgICAgICAgICAvLyBhbmQgdGhlIG11c2ljIHN0b3BwZWQgcGxheWluZworICAgICAg
ICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisKKyAgICBJZiBubyBhY3Rpb24gbmFtZSBp
cyBwYXNzZWQgdG8gYHNlbmRBY3Rpb25gIGEgZGVmYXVsdCBuYW1lIG9mICJhY3Rpb24iCisgICAg
aXMgYXNzdW1lZC4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuTmV4dEJ1dHRvbkNvbXBv
bmVudCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoeworICAgICAgY2xpY2s6IGZ1bmN0aW9uKCl7
CisgICAgICAgIHRoaXMuc2VuZEFjdGlvbigpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAor
CisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBhcHBsaWNhdGlvbi5oYnMgfX0KKyAgICB7e25l
eHQtYnV0dG9uIGFjdGlvbj0icGxheU5leHRTb25nSW5BbGJ1bSJ9fQorICAgIGBgYAorCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250
cm9sbGVyLmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHBsYXlOZXh0U29uZ0lu
QWxidW06IGZ1bmN0aW9uKCl7CisgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKKworICAgIEBtZXRob2Qgc2VuZEFjdGlvbgorICAgIEBwYXJhbSBbYWN0
aW9uXSB7U3RyaW5nfSB0aGUgYWN0aW9uIHRvIHRyaWdnZXIKKyAgICBAcGFyYW0gW2NvbnRleHRd
IHsqfSBhIGNvbnRleHQgdG8gc2VuZCB3aXRoIHRoZSBhY3Rpb24KKyAgKi8KKyAgc2VuZEFjdGlv
bjogZnVuY3Rpb24oYWN0aW9uKSB7CisgICAgdmFyIGFjdGlvbk5hbWUsCisgICAgICAgIGNvbnRl
eHRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CisKKyAgICAvLyBTZW5kIHRoZSBkZWZh
dWx0IGFjdGlvbgorICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCkgeworICAgICAgYWN0aW9u
TmFtZSA9IGdldCh0aGlzLCAnYWN0aW9uJyk7CisgICAgICBFbWJlci5hc3NlcnQoIlRoZSBkZWZh
dWx0IGFjdGlvbiB3YXMgdHJpZ2dlcmVkIG9uIHRoZSBjb21wb25lbnQgIiArIHRoaXMudG9TdHJp
bmcoKSArCisgICAgICAgICAgICAgICAgICAgIiwgYnV0IHRoZSBhY3Rpb24gbmFtZSAoIiArIGFj
dGlvbk5hbWUgKyAiKSB3YXMgbm90IGEgc3RyaW5nLiIsCisgICAgICAgICAgICAgICAgICAgaXNO
b25lKGFjdGlvbk5hbWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAnc3RyaW5nJyk7CisgICAg
fSBlbHNlIHsKKyAgICAgIGFjdGlvbk5hbWUgPSBnZXQodGhpcywgYWN0aW9uKTsKKyAgICAgIEVt
YmVyLmFzc2VydCgiVGhlICIgKyBhY3Rpb24gKyAiIGFjdGlvbiB3YXMgdHJpZ2dlcmVkIG9uIHRo
ZSBjb21wb25lbnQgIiArCisgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZygpICsgIiwg
YnV0IHRoZSBhY3Rpb24gbmFtZSAoIiArIGFjdGlvbk5hbWUgKworICAgICAgICAgICAgICAgICAg
ICIpIHdhcyBub3QgYSBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAgICBpc05vbmUoYWN0aW9u
TmFtZSkgfHwgdHlwZW9mIGFjdGlvbk5hbWUgPT09ICdzdHJpbmcnKTsKKyAgICB9CisKKyAgICAv
LyBJZiBubyBhY3Rpb24gbmFtZSBmb3IgdGhhdCBhY3Rpb24gY291bGQgYmUgZm91bmQsIGp1c3Qg
YWJvcnQuCisgICAgaWYgKGFjdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47IH0KKwor
ICAgIHRoaXMudHJpZ2dlckFjdGlvbih7CisgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCisgICAg
ICBhY3Rpb25Db250ZXh0OiBjb250ZXh0cworICAgIH0pOworICB9Cit9KTsKKworfSkoKTsKKwor
CisKKyhmdW5jdGlvbigpIHsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorYEVt
YmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGluIHRoYXQgY2FuIGJlIGluY2x1
ZGVkIGluIGEKK3ZpZXcgY2xhc3MgdG8gYWRkIGEgYHRyaWdnZXJBY3Rpb25gIG1ldGhvZCB3aXRo
IHNlbWFudGljcyBzaW1pbGFyIHRvCit0aGUgSGFuZGxlYmFycyBge3thY3Rpb259fWAgaGVscGVy
LiBJdCBwcm92aWRlcyBpbnRlbGxpZ2VudCBkZWZhdWx0cworZm9yIHRoZSBhY3Rpb24ncyB0YXJn
ZXQ6IHRoZSB2aWV3J3MgY29udHJvbGxlcjsgYW5kIHRoZSBjb250ZXh0IHRoYXQgaXMKK3NlbnQg
d2l0aCB0aGUgYWN0aW9uOiB0aGUgdmlldydzIGNvbnRleHQuCisKK05vdGU6IEluIG5vcm1hbCBF
bWJlciB1c2FnZSwgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgaXMgdXN1YWxseSB0aGUgYmVzdAor
Y2hvaWNlLiBUaGlzIG1peGluIGlzIG1vc3Qgb2Z0ZW4gdXNlZnVsIHdoZW4geW91IGFyZSBkb2lu
ZyBtb3JlIGNvbXBsZXgKK2V2ZW50IGhhbmRsaW5nIGluIGN1c3RvbSBWaWV3IHN1YmNsYXNzZXMu
CisKK0ZvciBleGFtcGxlOgorCitgYGBqYXZhc2NyaXB0CitBcHAuU2F2ZUJ1dHRvblZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgeworICBhY3Rp
b246ICdzYXZlJywKKyAgY2xpY2s6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMudHJpZ2dlckFjdGlv
bigpOyAvLyBTZW5kcyB0aGUgYHNhdmVgIGFjdGlvbiwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBj
b250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRy
b2xsZXIKKyAgfQorfSk7CitgYGAKKworVGhlIGBhY3Rpb25gIGNhbiBiZSBwcm92aWRlZCBhcyBw
cm9wZXJ0aWVzIG9mIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1bWVudAordG8gYHRyaWdnZXJBY3Rp
b25gIGFzIHdlbGwuCisKK2BgYGphdmFzY3JpcHQKK0FwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVy
LlZpZXcuZXh0ZW5kKEVtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0LCB7CisgIGNsaWNrOiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLnRyaWdnZXJBY3Rpb24oeworICAgICAgYWN0aW9uOiAnc2F2
ZScKKyAgICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1
cnJlbnQgY29udGV4dAorICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCisgIH0K
K30pOworYGBgCisKK0BjbGFzcyBWaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydAorQG5hbWVzcGFjZSBF
bWJlcgorQGV4dGVuZHMgRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydAorKi8KK0VtYmVyLlZpZXdU
YXJnZXRBY3Rpb25TdXBwb3J0ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLlRhcmdldEFjdGlv
blN1cHBvcnQsIHsKKyAgLyoqCisgIEBwcm9wZXJ0eSB0YXJnZXQKKyAgKi8KKyAgdGFyZ2V0OiBF
bWJlci5jb21wdXRlZC5hbGlhcygnY29udHJvbGxlcicpLAorICAvKioKKyAgQHByb3BlcnR5IGFj
dGlvbkNvbnRleHQKKyAgKi8KKyAgYWN0aW9uQ29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMo
J2NvbnRleHQnKQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisKK30pKCk7CisK
KworCisoZnVuY3Rpb24oKSB7CisvKioKK0VtYmVyIFZpZXdzCisKK0Btb2R1bGUgZW1iZXIKK0Bz
dWJtb2R1bGUgZW1iZXItdmlld3MKK0ByZXF1aXJlcyBlbWJlci1ydW50aW1lCitAbWFpbiBlbWJl
ci12aWV3cworKi8KKworfSkoKTsKKworKGZ1bmN0aW9uKCkgeworZGVmaW5lKCJtZXRhbW9ycGgi
LAorICBbXSwKKyAgZnVuY3Rpb24oKSB7CisgICAgInVzZSBzdHJpY3QiOworICAgIC8vID09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CisgICAgLy8gUHJvamVjdDogICBtZXRhbW9ycGgKKyAgICAvLyBDb3B5cmln
aHQ6IMKpMjAxNCBUaWxkZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIC8vID09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CisKKyAgICB2YXIgSyA9IGZ1bmN0aW9uKCkge30sCisgICAgICAgIGd1aWQg
PSAwLAorICAgICAgICBkaXNhYmxlUmFuZ2UgPSAoZnVuY3Rpb24oKXsKKyAgICAgICAgICBpZiAo
J3VuZGVmaW5lZCcgIT09IHR5cGVvZiBNZXRhbW9ycGhFTlYpIHsKKyAgICAgICAgICAgIHJldHVy
biBNZXRhbW9ycGhFTlYuRElTQUJMRV9SQU5HRV9BUEk7CisgICAgICAgICAgfSBlbHNlIGlmICgn
dW5kZWZpbmVkJyAhPT0gRU5WKSB7CisgICAgICAgICAgICByZXR1cm4gRU5WLkRJU0FCTEVfUkFO
R0VfQVBJOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgfQorICAgICAgICB9KSgpLAorCisgICAgICAgIC8vIEZlYXR1cmUtZGV0ZWN0IHRo
ZSBXM0MgcmFuZ2UgQVBJLCB0aGUgZXh0ZW5kZWQgY2hlY2sgaXMgZm9yIElFOSB3aGljaCBvbmx5
IHBhcnRpYWxseSBzdXBwb3J0cyByYW5nZXMKKyAgICAgICAgc3VwcG9ydHNSYW5nZSA9ICghZGlz
YWJsZVJhbmdlKSAmJiBkb2N1bWVudCAmJiAoJ2NyZWF0ZVJhbmdlJyBpbiBkb2N1bWVudCkgJiYg
KHR5cGVvZiBSYW5nZSAhPT0gJ3VuZGVmaW5lZCcpICYmIFJhbmdlLnByb3RvdHlwZS5jcmVhdGVD
b250ZXh0dWFsRnJhZ21lbnQsCisKKyAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgcHJpb3Ig
dG8gOSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmlyc3QgZWxlbWVu
dAorICAgICAgICAvLyBpcyBhICJ6ZXJvLXNjb3BlIiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2Fu
IGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5nCisgICAgICAgIC8vIHRoZSBmaXJzdCBub2RlIGFu
IGludmlzaWJsZSB0ZXh0IG5vZGUuIFdlLCBsaWtlIE1vZGVybml6ciwgdXNlICZzaHk7CisgICAg
ICAgIG5lZWRzU2h5ID0gZG9jdW1lbnQgJiYgKGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciB0
ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKyAgICAgICAgICB0ZXN0RWwu
aW5uZXJIVE1MID0gIjxkaXY+PC9kaXY+IjsKKyAgICAgICAgICB0ZXN0RWwuZmlyc3RDaGlsZC5p
bm5lckhUTUwgPSAiPHNjcmlwdD48L3NjcmlwdD4iOworICAgICAgICAgIHJldHVybiB0ZXN0RWwu
Zmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOworICAgICAgICB9KSgpLAorCisKKyAgICAgICAg
Ly8gSUUgOCAoYW5kIGxpa2VseSBlYXJsaWVyKSBsaWtlcyB0byBtb3ZlIHdoaXRlc3BhY2UgcHJl
Y2VlZGluZworICAgICAgICAvLyBhIHNjcmlwdCB0YWcgdG8gYXBwZWFyIGFmdGVyIGl0LiBUaGlz
IG1lYW5zIHRoYXQgd2UgY2FuCisgICAgICAgIC8vIGFjY2lkZW50YWxseSByZW1vdmUgd2hpdGVz
cGFjZSB3aGVuIHVwZGF0aW5nIGEgbW9ycGguCisgICAgICAgIG1vdmVzV2hpdGVzcGFjZSA9IGRv
Y3VtZW50ICYmIChmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgICAgdGVzdEVsLmlubmVySFRNTCA9ICJUZXN0
OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+PC9zY3JpcHQ+VmFsdWUiOworICAg
ICAgICAgIHJldHVybiB0ZXN0RWwuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgPT09ICdUZXN0Oicg
JiYKKyAgICAgICAgICAgICAgICAgIHRlc3RFbC5jaGlsZE5vZGVzWzJdLm5vZGVWYWx1ZSA9PT0g
JyBWYWx1ZSc7CisgICAgICAgIH0pKCk7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0aGF0IHN1cHBv
cnRzIGVpdGhlciBNZXRhbW9ycGgoJ2ZvbycpIG9yIG5ldworICAgIC8vIE1ldGFtb3JwaCgnZm9v
Jyk7CisgICAgLy8KKyAgICAvLyBUYWtlcyBhIHN0cmluZyBvZiBIVE1MIGFzIHRoZSBhcmd1bWVu
dC4KKworICAgIHZhciBNZXRhbW9ycGggPSBmdW5jdGlvbihodG1sKSB7CisgICAgICB2YXIgc2Vs
ZjsKKworICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNZXRhbW9ycGgpIHsKKyAgICAgICAgc2Vs
ZiA9IHRoaXM7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmID0gbmV3IEsoKTsKKyAgICAg
IH0KKworICAgICAgc2VsZi5pbm5lckhUTUwgPSBodG1sOworICAgICAgdmFyIG15R3VpZCA9ICdt
ZXRhbW9ycGgtJysoZ3VpZCsrKTsKKyAgICAgIHNlbGYuc3RhcnQgPSBteUd1aWQgKyAnLXN0YXJ0
JzsKKyAgICAgIHNlbGYuZW5kID0gbXlHdWlkICsgJy1lbmQnOworCisgICAgICByZXR1cm4gc2Vs
ZjsKKyAgICB9OworCisgICAgSy5wcm90b3R5cGUgPSBNZXRhbW9ycGgucHJvdG90eXBlOworCisg
ICAgdmFyIHJhbmdlRm9yLCBodG1sRnVuYywgcmVtb3ZlRnVuYywgb3V0ZXJIVE1MRnVuYywgYXBw
ZW5kVG9GdW5jLCBhZnRlckZ1bmMsIHByZXBlbmRGdW5jLCBzdGFydFRhZ0Z1bmMsIGVuZFRhZ0Z1
bmM7CisKKyAgICBvdXRlckhUTUxGdW5jID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhp
cy5zdGFydFRhZygpICsgdGhpcy5pbm5lckhUTUwgKyB0aGlzLmVuZFRhZygpOworICAgIH07CisK
KyAgICBzdGFydFRhZ0Z1bmMgPSBmdW5jdGlvbigpIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBy
ZXBsYWNlIGNoZXZyb24gYnkgaXRzIGhleCBjb2RlIGluIG9yZGVyIHRvIHByZXZlbnQgZXNjYXBp
bmcgcHJvYmxlbXMuCisgICAgICAgKiBDaGVjayB0aGlzIHRocmVhZCBmb3IgbW9yZSBleHBsYWlu
YXRpb246CisgICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzgyMzEw
NDgvd2h5LXVzZS14M2MtaW5zdGVhZC1vZi13aGVuLWdlbmVyYXRpbmctaHRtbC1mcm9tLWphdmFz
Y3JpcHQKKyAgICAgICAqLworICAgICAgcmV0dXJuICI8c2NyaXB0IGlkPSciICsgdGhpcy5zdGFy
dCArICInIHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+XHgzQy9zY3JpcHQ+IjsKKyAgICB9Owor
CisgICAgZW5kVGFnRnVuYyA9IGZ1bmN0aW9uKCkgeworICAgICAgLyoKKyAgICAgICAqIFdlIHJl
cGxhY2UgY2hldnJvbiBieSBpdHMgaGV4IGNvZGUgaW4gb3JkZXIgdG8gcHJldmVudCBlc2NhcGlu
ZyBwcm9ibGVtcy4KKyAgICAgICAqIENoZWNrIHRoaXMgdGhyZWFkIGZvciBtb3JlIGV4cGxhaW5h
dGlvbjoKKyAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODIzMTA0
OC93aHktdXNlLXgzYy1pbnN0ZWFkLW9mLXdoZW4tZ2VuZXJhdGluZy1odG1sLWZyb20tamF2YXNj
cmlwdAorICAgICAgICovCisgICAgICByZXR1cm4gIjxzY3JpcHQgaWQ9JyIgKyB0aGlzLmVuZCAr
ICInIHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+XHgzQy9zY3JpcHQ+IjsKKyAgICB9OworCisg
ICAgLy8gSWYgd2UgaGF2ZSB0aGUgVzNDIHJhbmdlIEFQSSwgdGhpcyBwcm9jZXNzIGlzIHJlbGF0
aXZlbHkgc3RyYWlnaHQgZm9yd2FyZC4KKyAgICBpZiAoc3VwcG9ydHNSYW5nZSkgeworCisgICAg
ICAvLyBHZXQgYSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgbW9ycGguIE9wdGlvbmFsbHkgaW5jbHVk
ZSB0aGUgc3RhcnRpbmcgYW5kCisgICAgICAvLyBlbmRpbmcgcGxhY2Vob2xkZXJzLgorICAgICAg
cmFuZ2VGb3IgPSBmdW5jdGlvbihtb3JwaCwgb3V0ZXJUb28pIHsKKyAgICAgICAgdmFyIHJhbmdl
ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgdmFyIGJlZm9yZSA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKG1vcnBoLnN0YXJ0KTsKKyAgICAgICAgdmFyIGFmdGVyID0gZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQobW9ycGguZW5kKTsKKworICAgICAgICBpZiAob3V0ZXJUb28pIHsK
KyAgICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShiZWZvcmUpOworICAgICAgICAgIHJhbmdl
LnNldEVuZEFmdGVyKGFmdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByYW5nZS5z
ZXRTdGFydEFmdGVyKGJlZm9yZSk7CisgICAgICAgICAgcmFuZ2Uuc2V0RW5kQmVmb3JlKGFmdGVy
KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICAgIH07CisKKyAgICAg
IGh0bWxGdW5jID0gZnVuY3Rpb24oaHRtbCwgb3V0ZXJUb28pIHsKKyAgICAgICAgLy8gZ2V0IGEg
cmFuZ2UgZm9yIHRoZSBjdXJyZW50IG1ldGFtb3JwaCBvYmplY3QKKyAgICAgICAgdmFyIHJhbmdl
ID0gcmFuZ2VGb3IodGhpcywgb3V0ZXJUb28pOworCisgICAgICAgIC8vIGRlbGV0ZSB0aGUgY29u
dGVudHMgb2YgdGhlIHJhbmdlLCB3aGljaCB3aWxsIGJlIHRoZQorICAgICAgICAvLyBub2RlcyBi
ZXR3ZWVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9sZGVyLgorICAgICAgICByYW5n
ZS5kZWxldGVDb250ZW50cygpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBm
cmFnbWVudCBmb3IgdGhlIEhUTUwKKyAgICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRl
Q29udGV4dHVhbEZyYWdtZW50KGh0bWwpOworCisgICAgICAgIC8vIGluc2VydCB0aGUgZnJhZ21l
bnQgaW50byB0aGUgcmFuZ2UKKyAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7Cisg
ICAgICB9OworCisgICAgICAvKioKKyAgICAgICogQHB1YmxpYworICAgICAgKgorICAgICAgKiBS
ZW1vdmUgdGhpcyBvYmplY3QgKGluY2x1ZGluZyBzdGFydGluZyBhbmQgZW5kaW5nCisgICAgICAq
IHBsYWNlaG9sZGVycykuCisgICAgICAqCisgICAgICAqIEBtZXRob2QgcmVtb3ZlCisgICAgICAq
LworICAgICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBnZXQgYSByYW5n
ZSBmb3IgdGhlIGN1cnJlbnQgbWV0YW1vcnBoIG9iamVjdCBpbmNsdWRpbmcKKyAgICAgICAgLy8g
dGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcGxhY2Vob2xkZXJzLgorICAgICAgICB2YXIgcmFuZ2Ug
PSByYW5nZUZvcih0aGlzLCB0cnVlKTsKKworICAgICAgICAvLyBkZWxldGUgdGhlIGVudGlyZSBy
YW5nZS4KKyAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKKyAgICAgIH07CisKKyAgICAg
IGFwcGVuZFRvRnVuYyA9IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgICAgdmFyIHJhbmdlID0gZG9j
dW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSk7CisgICAg
ICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKKyAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jcmVh
dGVDb250ZXh0dWFsRnJhZ21lbnQodGhpcy5vdXRlckhUTUwoKSk7CisgICAgICAgIG5vZGUuYXBw
ZW5kQ2hpbGQoZnJhZyk7CisgICAgICB9OworCisgICAgICBhZnRlckZ1bmMgPSBmdW5jdGlvbiho
dG1sKSB7CisgICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAg
ICAgIHZhciBhZnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKKworICAg
ICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGFmdGVyKTsKKyAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0
ZXIoYWZ0ZXIpOworCisgICAgICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1
YWxGcmFnbWVudChodG1sKTsKKyAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7Cisg
ICAgICB9OworCisgICAgICBwcmVwZW5kRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKKyAgICAgICAg
dmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgdmFyIHN0YXJ0ID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCk7CisKKyAgICAgICAgcmFuZ2Uuc2V0
U3RhcnRBZnRlcihzdGFydCk7CisgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHN0YXJ0KTsKKwor
ICAgICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRt
bCk7CisgICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOworICAgICAgfTsKKworICAg
IH0gZWxzZSB7CisgICAgICAvKgorICAgICAgICogVGhpcyBjb2RlIGlzIG1vc3RseSB0YWtlbiBm
cm9tIGpRdWVyeSwgd2l0aCBvbmUgZXhjZXB0aW9uLiBJbiBqUXVlcnkncyBjYXNlLCB3ZQorICAg
ICAgICogaGF2ZSBzb21lIEhUTUwgYW5kIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gY29u
dmVydCBpdCBpbnRvIHNvbWUgbm9kZXMuCisgICAgICAgKgorICAgICAgICogSW4gdGhpcyBjYXNl
LCBqUXVlcnkgbmVlZHMgdG8gc2NhbiB0aGUgSFRNTCBsb29raW5nIGZvciBhbiBvcGVuaW5nIHRh
ZyBhbmQgdXNlCisgICAgICAgKiB0aGF0IGFzIHRoZSBrZXkgZm9yIHRoZSB3cmFwIG1hcC4gSW4g
b3VyIGNhc2UsIHdlIGtub3cgdGhlIHBhcmVudCBub2RlLCBhbmQKKyAgICAgICAqIGNhbiB1c2Ug
aXRzIHR5cGUgYXMgdGhlIGtleSBmb3IgdGhlIHdyYXAgbWFwLgorICAgICAgICoqLworICAgICAg
dmFyIHdyYXBNYXAgPSB7CisgICAgICAgIHNlbGVjdDogWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0n
bXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0sCisgICAgICAgIGZpZWxkc2V0OiBbIDEsICI8Zmll
bGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdLAorICAgICAgICB0YWJsZTogWyAxLCAiPHRhYmxlPiIs
ICI8L3RhYmxlPiIgXSwKKyAgICAgICAgdGJvZHk6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwv
dGJvZHk+PC90YWJsZT4iIF0sCisgICAgICAgIHRyOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4i
LCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAorICAgICAgICBjb2xncm91cDogWyAyLCAiPHRh
YmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSwK
KyAgICAgICAgbWFwOiBbIDEsICI8bWFwPiIsICI8L21hcD4iIF0sCisgICAgICAgIF9kZWZhdWx0
OiBbIDAsICIiLCAiIiBdCisgICAgICB9OworCisgICAgICB2YXIgZmluZENoaWxkQnlJZCA9IGZ1
bmN0aW9uKGVsZW1lbnQsIGlkKSB7CisgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgn
aWQnKSA9PT0gaWQpIHsgcmV0dXJuIGVsZW1lbnQ7IH0KKworICAgICAgICB2YXIgbGVuID0gZWxl
bWVudC5jaGlsZE5vZGVzLmxlbmd0aCwgaWR4LCBub2RlLCBmb3VuZDsKKyAgICAgICAgZm9yIChp
ZHg9MDsgaWR4PGxlbjsgaWR4KyspIHsKKyAgICAgICAgICBub2RlID0gZWxlbWVudC5jaGlsZE5v
ZGVzW2lkeF07CisgICAgICAgICAgZm91bmQgPSBub2RlLm5vZGVUeXBlID09PSAxICYmIGZpbmRD
aGlsZEJ5SWQobm9kZSwgaWQpOworICAgICAgICAgIGlmIChmb3VuZCkgeyByZXR1cm4gZm91bmQ7
IH0KKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdmFyIHNldElubmVySFRNTCA9IGZ1bmN0
aW9uKGVsZW1lbnQsIGh0bWwpIHsKKyAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKKyAgICAgICAg
aWYgKG1vdmVzV2hpdGVzcGFjZSkgeworICAgICAgICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IGNo
ZWNrIGZvciBzY3JpcHQgdGFncyB3aXRoIGlkcyB3aXRoIHRoZQorICAgICAgICAgIC8vIGdvYWwg
b2YgdGFyZ2V0aW5nIG1vcnBocy4KKyAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oXHMr
KSg8c2NyaXB0IGlkPScoW14nXSspJykvZywgZnVuY3Rpb24obWF0Y2gsIHNwYWNlcywgdGFnLCBp
ZCkgeworICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKFtpZCwgc3BhY2VzXSk7CisgICAgICAgICAg
ICByZXR1cm4gdGFnOworICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgZWxlbWVu
dC5pbm5lckhUTUwgPSBodG1sOworCisgICAgICAgIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdo
aXRlc3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cKKyAgICAgICAgaWYgKG1hdGNoZXMubGVu
Z3RoID4gMCkgeworICAgICAgICAgIHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0aCwgaWR4OworICAg
ICAgICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7CisgICAgICAgICAgICB2YXIgc2Ny
aXB0ID0gZmluZENoaWxkQnlJZChlbGVtZW50LCBtYXRjaGVzW2lkeF1bMF0pLAorICAgICAgICAg
ICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwor
ICAgICAgICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHNjcmlwdCk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworCisgICAgICAvKgorICAgICAgICog
R2l2ZW4gYSBwYXJlbnQgbm9kZSBhbmQgc29tZSBIVE1MLCBnZW5lcmF0ZSBhIHNldCBvZiBub2Rl
cy4gUmV0dXJuIHRoZSBmaXJzdAorICAgICAgICogbm9kZSwgd2hpY2ggd2lsbCBhbGxvdyB1cyB0
byB0cmF2ZXJzZSB0aGUgcmVzdCB1c2luZyBuZXh0U2libGluZy4KKyAgICAgICAqCisgICAgICAg
KiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBpbm5lckhUTUwgaW4gSUUgZG9lcyBub3QgcmVh
bGx5IHBhcnNlIHRoZSBub2Rlcy4KKyAgICAgICAqLworICAgICAgdmFyIGZpcnN0Tm9kZUZvciA9
IGZ1bmN0aW9uKHBhcmVudE5vZGUsIGh0bWwpIHsKKyAgICAgICAgdmFyIGFyciA9IHdyYXBNYXBb
cGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCldIHx8IHdyYXBNYXAuX2RlZmF1bHQ7Cisg
ICAgICAgIHZhciBkZXB0aCA9IGFyclswXSwgc3RhcnQgPSBhcnJbMV0sIGVuZCA9IGFyclsyXTsK
KworICAgICAgICBpZiAobmVlZHNTaHkpIHsgaHRtbCA9ICcmc2h5OycraHRtbDsgfQorCisgICAg
ICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisKKyAgICAg
ICAgc2V0SW5uZXJIVE1MKGVsZW1lbnQsIHN0YXJ0ICsgaHRtbCArIGVuZCk7CisKKyAgICAgICAg
Zm9yICh2YXIgaT0wOyBpPD1kZXB0aDsgaSsrKSB7CisgICAgICAgICAgZWxlbWVudCA9IGVsZW1l
bnQuZmlyc3RDaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgZm9yICZzaHk7IHRv
IHJlbW92ZSBpdC4KKyAgICAgICAgaWYgKG5lZWRzU2h5KSB7CisgICAgICAgICAgdmFyIHNoeUVs
ZW1lbnQgPSBlbGVtZW50OworCisgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGdldCBuYW1lbGVz
cyBlbGVtZW50cyB3aXRoIHRoZSBzaHkgaW5zaWRlCisgICAgICAgICAgd2hpbGUgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKKyAgICAgICAgICAg
IHNoeUVsZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgICAgICAgfQorCisgICAg
ICAgICAgLy8gQXQgdGhpcyBwb2ludCBpdCdzIHRoZSBhY3R1YWwgdW5pY29kZSBjaGFyYWN0ZXIu
CisgICAgICAgICAgaWYgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09IDMgJiYgc2h5RWxlbWVudC5u
b2RlVmFsdWUuY2hhckF0KDApID09PSAiXHUwMEFEIikgeworICAgICAgICAgICAgc2h5RWxlbWVu
dC5ub2RlVmFsdWUgPSBzaHlFbGVtZW50Lm5vZGVWYWx1ZS5zbGljZSgxKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgIH07CisKKyAgICAg
IC8qCisgICAgICAgKiBJbiBzb21lIGNhc2VzLCBJbnRlcm5ldCBFeHBsb3JlciBjYW4gY3JlYXRl
IGFuIGFub255bW91cyBub2RlIGluCisgICAgICAgKiB0aGUgaGllcmFyY2h5IHdpdGggbm8gdGFn
TmFtZS4gWW91IGNhbiBjcmVhdGUgdGhpcyBzY2VuYXJpbyB2aWE6CisgICAgICAgKgorICAgICAg
ICogICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICogICAg
IGRpdi5pbm5lckhUTUwgPSAiPHRhYmxlPiZzaHk8c2NyaXB0Pjwvc2NyaXB0Pjx0cj48dGQ+aGk8
L3RkPjwvdHI+PC90YWJsZT4iOworICAgICAgICogICAgIGRpdi5maXJzdENoaWxkLmZpcnN0Q2hp
bGQudGFnTmFtZSAvLz0+ICIiCisgICAgICAgKgorICAgICAgICogSWYgb3VyIHNjcmlwdCBtYXJr
ZXJzIGFyZSBpbnNpZGUgc3VjaCBhIG5vZGUsIHdlIG5lZWQgdG8gZmluZCB0aGF0CisgICAgICAg
KiBub2RlIGFuZCB1c2UgKml0KiBhcyB0aGUgbWFya2VyLgorICAgICAgICovCisgICAgICB2YXIg
cmVhbE5vZGUgPSBmdW5jdGlvbihzdGFydCkgeworICAgICAgICB3aGlsZSAoc3RhcnQucGFyZW50
Tm9kZS50YWdOYW1lID09PSAiIikgeworICAgICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Tm9k
ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGFydDsKKyAgICAgIH07CisKKyAgICAg
IC8qCisgICAgICAgKiBXaGVuIGF1dG9tYXRpY2FsbHkgYWRkaW5nIGEgdGJvZHksIEludGVybmV0
IEV4cGxvcmVyIGluc2VydHMgdGhlCisgICAgICAgKiB0Ym9keSBpbW1lZGlhdGVseSBiZWZvcmUg
dGhlIGZpcnN0IDx0cj4uIE90aGVyIGJyb3dzZXJzIGNyZWF0ZSBpdAorICAgICAgICogYmVmb3Jl
IHRoZSBmaXJzdCBub2RlLCBubyBtYXR0ZXIgd2hhdC4KKyAgICAgICAqCisgICAgICAgKiBUaGlz
IG1lYW5zIHRoZSB0aGUgZm9sbG93aW5nIGNvZGU6CisgICAgICAgKgorICAgICAgICogICAgIGRp
diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICogICAgIGRpdi5pbm5l
ckhUTUwgPSAiPHRhYmxlPjxzY3JpcHQgaWQ9J2ZpcnN0Jz48L3NjcmlwdD48dHI+PHRkPmhpPC90
ZD48L3RyPjxzY3JpcHQgaWQ9J2xhc3QnPjwvc2NyaXB0PjwvdGFibGU+CisgICAgICAgKgorICAg
ICAgICogR2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgRE9NIGluIElFOgorICAgICAgICoKKyAgICAg
ICAqICAgICArIGRpdgorICAgICAgICogICAgICAgKyB0YWJsZQorICAgICAgICogICAgICAgICAt
IHNjcmlwdCBpZD0nZmlyc3QnCisgICAgICAgKiAgICAgICAgICsgdGJvZHkKKyAgICAgICAqICAg
ICAgICAgICArIHRyCisgICAgICAgKiAgICAgICAgICAgICArIHRkCisgICAgICAgKiAgICAgICAg
ICAgICAgIC0gImhpIgorICAgICAgICogICAgICAgICAgIC0gc2NyaXB0IGlkPSdsYXN0JworICAg
ICAgICoKKyAgICAgICAqIFdoaWNoIG1lYW5zIHRoYXQgdGhlIHR3byBzY3JpcHQgdGFncywgZXZl
biB0aG91Z2ggdGhleSB3ZXJlCisgICAgICAgKiBpbnNlcnRlZCBhdCB0aGUgc2FtZSBwb2ludCBp
biB0aGUgaGllcmFyY2h5IGluIHRoZSBvcmlnaW5hbAorICAgICAgICogSFRNTCwgbm93IGhhdmUg
ZGlmZmVyZW50IHBhcmVudHMuCisgICAgICAgKgorICAgICAgICogVGhpcyBjb2RlIHJlcGFyZW50
cyB0aGUgZmlyc3Qgc2NyaXB0IHRhZyBieSBtYWtpbmcgaXQgdGhlIHRib2R5J3MKKyAgICAgICAq
IGZpcnN0IGNoaWxkLgorICAgICAgICoKKyAgICAgICAqLworICAgICAgdmFyIGZpeFBhcmVudGFn
ZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKKyAgICAgICAgaWYgKHN0YXJ0LnBhcmVudE5vZGUg
IT09IGVuZC5wYXJlbnROb2RlKSB7CisgICAgICAgICAgZW5kLnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKHN0YXJ0LCBlbmQucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKKyAgICAgICAgfQorICAgICAg
fTsKKworICAgICAgaHRtbEZ1bmMgPSBmdW5jdGlvbihodG1sLCBvdXRlclRvbykgeworICAgICAg
ICAvLyBnZXQgdGhlIHJlYWwgc3RhcnRpbmcgbm9kZS4gc2VlIHJlYWxOb2RlIGZvciBkZXRhaWxz
LgorICAgICAgICB2YXIgc3RhcnQgPSByZWFsTm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0
aGlzLnN0YXJ0KSk7CisgICAgICAgIHZhciBlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0
aGlzLmVuZCk7CisgICAgICAgIHZhciBwYXJlbnROb2RlID0gZW5kLnBhcmVudE5vZGU7CisgICAg
ICAgIHZhciBub2RlLCBuZXh0U2libGluZywgbGFzdDsKKworICAgICAgICAvLyBtYWtlIHN1cmUg
dGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBub2RlcyBzaGFyZSB0aGUgc2FtZQorICAgICAgICAvLyBw
YXJlbnQuIElmIG5vdCwgZml4IGl0LgorICAgICAgICBmaXhQYXJlbnRhZ2Uoc3RhcnQsIGVuZCk7
CisKKyAgICAgICAgLy8gcmVtb3ZlIGFsbCBvZiB0aGUgbm9kZXMgYWZ0ZXIgdGhlIHN0YXJ0aW5n
IHBsYWNlaG9sZGVyIGFuZAorICAgICAgICAvLyBiZWZvcmUgdGhlIGVuZGluZyBwbGFjZWhvbGRl
ci4KKyAgICAgICAgbm9kZSA9IHN0YXJ0Lm5leHRTaWJsaW5nOworICAgICAgICB3aGlsZSAobm9k
ZSkgeworICAgICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgICAg
ICBsYXN0ID0gbm9kZSA9PT0gZW5kOworCisgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgbGFz
dCBub2RlLCBhbmQgd2Ugd2FudCB0byByZW1vdmUgaXQgYXMgd2VsbCwKKyAgICAgICAgICAvLyBz
ZXQgdGhlIGBlbmRgIG5vZGUgdG8gdGhlIG5leHQgc2libGluZy4gVGhpcyBpcyBiZWNhdXNlCisg
ICAgICAgICAgLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiwgd2UgaW5zZXJ0IHRoZSBu
ZXcgbm9kZXMKKyAgICAgICAgICAvLyBiZWZvcmUgdGhlIGVuZCAobm90ZSB0aGF0IGluc2VydEJl
Zm9yZShub2RlLCBudWxsKSBpcworICAgICAgICAgIC8vIHRoZSBzYW1lIGFzIGFwcGVuZENoaWxk
KG5vZGUpKS4KKyAgICAgICAgICAvLworICAgICAgICAgIC8vIGlmIHdlIGRvIG5vdCB3YW50IHRv
IHJlbW92ZSBpdCwganVzdCBicmVhay4KKyAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAg
ICAgaWYgKG91dGVyVG9vKSB7IGVuZCA9IG5vZGUubmV4dFNpYmxpbmc7IH0gZWxzZSB7IGJyZWFr
OyB9CisgICAgICAgICAgfQorCisgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxk
KG5vZGUpOworCisgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCBub2RlIGFuZCB3ZSBk
aWRuJ3QgYnJlYWsgYmVmb3JlCisgICAgICAgICAgLy8gKGJlY2F1c2Ugd2Ugd2FudGVkIHRvIHJl
bW92ZSB0aGUgb3V0ZXIgbm9kZXMpLCBicmVhaworICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAg
ICBpZiAobGFzdCkgeyBicmVhazsgfQorCisgICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBub2RlIGZvciB0aGUgSFRNTCBz
dHJpbmcsIGV2ZW4gaW4gY2FzZXMgbGlrZQorICAgICAgICAvLyB0YWJsZXMgYW5kIGxpc3RzIHdo
ZXJlIGEgc2ltcGxlIGlubmVySFRNTCBvbiBhIGRpdiB3b3VsZAorICAgICAgICAvLyBzd2FsbG93
IHNvbWUgb2YgdGhlIGNvbnRlbnQuCisgICAgICAgIG5vZGUgPSBmaXJzdE5vZGVGb3Ioc3RhcnQu
cGFyZW50Tm9kZSwgaHRtbCk7CisKKyAgICAgICAgaWYgKG91dGVyVG9vKSB7CisgICAgICAgICAg
c3RhcnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdGFydCk7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBjb3B5IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5k
IGVuZGluZworICAgICAgICAvLyBwbGFjZWhvbGRlci4KKyAgICAgICAgd2hpbGUgKG5vZGUpIHsK
KyAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgICAgICAgcGFy
ZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZW5kKTsKKyAgICAgICAgICBub2RlID0gbmV4dFNp
Ymxpbmc7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIC8vIHJlbW92ZSB0aGUgbm9kZXMg
aW4gdGhlIERPTSByZXByZXNlbnRpbmcgdGhpcyBtZXRhbW9ycGguCisgICAgICAvLworICAgICAg
Ly8gdGhpcyBpbmNsdWRlcyB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwbGFjZWhvbGRlcnMuCisg
ICAgICByZW1vdmVGdW5jID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBzdGFydCA9IHJlYWxO
b2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpKTsKKyAgICAgICAgdmFyIGVu
ZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKKworICAgICAgICB0aGlzLmh0
bWwoJycpOworICAgICAgICBzdGFydC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0YXJ0KTsKKyAg
ICAgICAgZW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZW5kKTsKKyAgICAgIH07CisKKyAgICAg
IGFwcGVuZFRvRnVuYyA9IGZ1bmN0aW9uKHBhcmVudE5vZGUpIHsKKyAgICAgICAgdmFyIG5vZGUg
PSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwgdGhpcy5vdXRlckhUTUwoKSk7CisgICAgICAgIHZh
ciBuZXh0U2libGluZzsKKworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgIG5leHRT
aWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENo
aWxkKG5vZGUpOworICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKKyAgICAgICAgfQorICAg
ICAgfTsKKworICAgICAgYWZ0ZXJGdW5jID0gZnVuY3Rpb24oaHRtbCkgeworICAgICAgICAvLyBn
ZXQgdGhlIHJlYWwgc3RhcnRpbmcgbm9kZS4gc2VlIHJlYWxOb2RlIGZvciBkZXRhaWxzLgorICAg
ICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOworICAgICAg
ICB2YXIgaW5zZXJ0QmVmb3JlID0gZW5kLm5leHRTaWJsaW5nOworICAgICAgICB2YXIgcGFyZW50
Tm9kZSA9IGVuZC5wYXJlbnROb2RlOworICAgICAgICB2YXIgbmV4dFNpYmxpbmc7CisgICAgICAg
IHZhciBub2RlOworCisgICAgICAgIC8vIGdldCB0aGUgZmlyc3Qgbm9kZSBmb3IgdGhlIEhUTUwg
c3RyaW5nLCBldmVuIGluIGNhc2VzIGxpa2UKKyAgICAgICAgLy8gdGFibGVzIGFuZCBsaXN0cyB3
aGVyZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYgd291bGQKKyAgICAgICAgLy8gc3dhbGxv
dyBzb21lIG9mIHRoZSBjb250ZW50LgorICAgICAgICBub2RlID0gZmlyc3ROb2RlRm9yKHBhcmVu
dE5vZGUsIGh0bWwpOworCisgICAgICAgIC8vIGNvcHkgdGhlIG5vZGVzIGZvciB0aGUgSFRNTCBi
ZXR3ZWVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nCisgICAgICAgIC8vIHBsYWNlaG9sZGVyLgor
ICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5uZXh0
U2libGluZzsKKyAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNlcnRC
ZWZvcmUpOworICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKKyAgICAgICAgfQorICAgICAg
fTsKKworICAgICAgcHJlcGVuZEZ1bmMgPSBmdW5jdGlvbihodG1sKSB7CisgICAgICAgIHZhciBz
dGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOworICAgICAgICB2YXIg
cGFyZW50Tm9kZSA9IHN0YXJ0LnBhcmVudE5vZGU7CisgICAgICAgIHZhciBuZXh0U2libGluZzsK
KyAgICAgICAgdmFyIG5vZGU7CisKKyAgICAgICAgbm9kZSA9IGZpcnN0Tm9kZUZvcihwYXJlbnRO
b2RlLCBodG1sKTsKKyAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IHN0YXJ0Lm5leHRTaWJsaW5n
OworCisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2Rl
Lm5leHRTaWJsaW5nOworICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGlu
c2VydEJlZm9yZSk7CisgICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOworICAgICAgICB9Cisg
ICAgICB9OworICAgIH0KKworICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9u
KGh0bWwpIHsKKyAgICAgIHRoaXMuY2hlY2tSZW1vdmVkKCk7CisgICAgICBpZiAoaHRtbCA9PT0g
dW5kZWZpbmVkKSB7IHJldHVybiB0aGlzLmlubmVySFRNTDsgfQorCisgICAgICBodG1sRnVuYy5j
YWxsKHRoaXMsIGh0bWwpOworCisgICAgICB0aGlzLmlubmVySFRNTCA9IGh0bWw7CisgICAgfTsK
KworICAgIE1ldGFtb3JwaC5wcm90b3R5cGUucmVwbGFjZVdpdGggPSBmdW5jdGlvbihodG1sKSB7
CisgICAgICB0aGlzLmNoZWNrUmVtb3ZlZCgpOworICAgICAgaHRtbEZ1bmMuY2FsbCh0aGlzLCBo
dG1sLCB0cnVlKTsKKyAgICB9OworCisgICAgTWV0YW1vcnBoLnByb3RvdHlwZS5yZW1vdmUgPSBy
ZW1vdmVGdW5jOworICAgIE1ldGFtb3JwaC5wcm90b3R5cGUub3V0ZXJIVE1MID0gb3V0ZXJIVE1M
RnVuYzsKKyAgICBNZXRhbW9ycGgucHJvdG90eXBlLmFwcGVuZFRvID0gYXBwZW5kVG9GdW5jOwor
ICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuYWZ0ZXIgPSBhZnRlckZ1bmM7CisgICAgTWV0YW1vcnBo
LnByb3RvdHlwZS5wcmVwZW5kID0gcHJlcGVuZEZ1bmM7CisgICAgTWV0YW1vcnBoLnByb3RvdHlw
ZS5zdGFydFRhZyA9IHN0YXJ0VGFnRnVuYzsKKyAgICBNZXRhbW9ycGgucHJvdG90eXBlLmVuZFRh
ZyA9IGVuZFRhZ0Z1bmM7CisKKyAgICBNZXRhbW9ycGgucHJvdG90eXBlLmlzUmVtb3ZlZCA9IGZ1
bmN0aW9uKCkgeworICAgICAgdmFyIGJlZm9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRo
aXMuc3RhcnQpOworICAgICAgdmFyIGFmdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp
cy5lbmQpOworCisgICAgICByZXR1cm4gIWJlZm9yZSB8fCAhYWZ0ZXI7CisgICAgfTsKKworICAg
IE1ldGFtb3JwaC5wcm90b3R5cGUuY2hlY2tSZW1vdmVkID0gZnVuY3Rpb24oKSB7CisgICAgICBp
ZiAodGhpcy5pc1JlbW92ZWQoKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBw
ZXJmb3JtIG9wZXJhdGlvbnMgb24gYSBNZXRhbW9ycGggdGhhdCBpcyBub3QgaW4gdGhlIERPTS4i
KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIE1ldGFtb3JwaDsKKyAgfSk7CisKK30p
KCk7CisKKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJl
ci1oYW5kbGViYXJzLWNvbXBpbGVyCisqLworCisvLyBFbGltaW5hdGUgZGVwZW5kZW5jeSBvbiBh
bnkgRW1iZXIgdG8gc2ltcGxpZnkgcHJlY29tcGlsYXRpb24gd29ya2Zsb3cKK3ZhciBvYmplY3RD
cmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uKHBhcmVudCkgeworICBmdW5jdGlvbiBG
KCkge30KKyAgRi5wcm90b3R5cGUgPSBwYXJlbnQ7CisgIHJldHVybiBuZXcgRigpOworfTsKKwor
dmFyIEhhbmRsZWJhcnMgPSAoRW1iZXIuaW1wb3J0cyAmJiBFbWJlci5pbXBvcnRzLkhhbmRsZWJh
cnMpIHx8ICh0aGlzICYmIHRoaXMuSGFuZGxlYmFycyk7CitpZiAoIUhhbmRsZWJhcnMgJiYgdHlw
ZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHsKKyAgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hh
bmRsZWJhcnMnKTsKK30KKworRW1iZXIuYXNzZXJ0KCJFbWJlciBIYW5kbGViYXJzIHJlcXVpcmVz
IEhhbmRsZWJhcnMgdmVyc2lvbiAxLjAgb3IgMS4xLiBJbmNsdWRlICIgKworICAgICAgICAgICAg
ICJhIFNDUklQVCB0YWcgaW4gdGhlIEhUTUwgSEVBRCBsaW5raW5nIHRvIHRoZSBIYW5kbGViYXJz
IGZpbGUgIiArCisgICAgICAgICAgICAgImJlZm9yZSB5b3UgbGluayB0byBFbWJlci4iLCBIYW5k
bGViYXJzKTsKKworRW1iZXIuYXNzZXJ0KCJFbWJlciBIYW5kbGViYXJzIHJlcXVpcmVzIEhhbmRs
ZWJhcnMgdmVyc2lvbiAxLjAgb3IgMS4xLCAiICsKKyAgICAgICAgICAgICAiQ09NUElMRVJfUkVW
SVNJT04gZXhwZWN0ZWQ6IDQsIGdvdDogIiArICBIYW5kbGViYXJzLkNPTVBJTEVSX1JFVklTSU9O
ICsKKyAgICAgICAgICAgICAiIC0gUGxlYXNlIG5vdGU6IEJ1aWxkcyBvZiBtYXN0ZXIgbWF5IGhh
dmUgb3RoZXIgQ09NUElMRVJfUkVWSVNJT04gdmFsdWVzLiIsCisgICAgICAgICAgICAgSGFuZGxl
YmFycy5DT01QSUxFUl9SRVZJU0lPTiA9PT0gNCk7CisKKy8qKgorICBQcmVwYXJlcyB0aGUgSGFu
ZGxlYmFycyB0ZW1wbGF0aW5nIGxpYnJhcnkgZm9yIHVzZSBpbnNpZGUgRW1iZXIncyB2aWV3Cisg
IHN5c3RlbS4KKworICBUaGUgYEVtYmVyLkhhbmRsZWJhcnNgIG9iamVjdCBpcyB0aGUgc3RhbmRh
cmQgSGFuZGxlYmFycyBsaWJyYXJ5LCBleHRlbmRlZCB0bworICB1c2UgRW1iZXIncyBgZ2V0KClg
IG1ldGhvZCBpbnN0ZWFkIG9mIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIGFsbG93cwor
ICBjb21wdXRlZCBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlcy4KKworICBU
byBjcmVhdGUgYW4gYEVtYmVyLkhhbmRsZWJhcnNgIHRlbXBsYXRlLCBjYWxsIGBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoKWAuCisgIFRoaXMgd2lsbCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNh
biBiZSB1c2VkIGJ5IGBFbWJlci5WaWV3YCBmb3IgcmVuZGVyaW5nLgorCisgIEBjbGFzcyBIYW5k
bGViYXJzCisgIEBuYW1lc3BhY2UgRW1iZXIKKyovCitFbWJlci5IYW5kbGViYXJzID0gb2JqZWN0
Q3JlYXRlKEhhbmRsZWJhcnMpOworCisvKioKKyAgUmVnaXN0ZXIgYSBib3VuZCBoZWxwZXIgb3Ig
Y3VzdG9tIHZpZXcgaGVscGVyLgorCisgICMjIFNpbXBsZSBib3VuZCBoZWxwZXIgZXhhbXBsZQor
CisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXIoJ2NhcGl0YWxpemUn
LCBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOworICB9
KTsKKyAgYGBgCisKKyAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUg
b2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6CisKKyAgYGBgaGFuZGxlYmFycworICB7e2NhcGl0YWxp
emUgbmFtZX19CisgIGBgYAorCisgIEluIHRoaXMgY2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3Bl
cnR5IG9mIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQgY2hhbmdlcywKKyAgdGhlIHJlbmRlcmVkIHZh
bHVlIG9mIHRoZSBoZWxwZXIgd2lsbCB1cGRhdGUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKwor
ICBGb3IgbW9yZSBleGFtcGxlcyBvZiBib3VuZCBoZWxwZXJzLCBzZWUgZG9jdW1lbnRhdGlvbiBm
b3IKKyAgYEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlcmAuCisKKyAgIyMgQ3Vz
dG9tIHZpZXcgaGVscGVyIGV4YW1wbGUKKworICBBc3N1bWluZyBhIHZpZXcgc3ViY2xhc3MgbmFt
ZWQgYEFwcC5DYWxlbmRhclZpZXdgIHdlcmUgZGVmaW5lZCwgYSBoZWxwZXIKKyAgZm9yIHJlbmRl
cmluZyBpbnN0YW5jZXMgb2YgdGhpcyB2aWV3IGNvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgZm9sbG93
czoKKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyKCdjYWxlbmRh
cicsIEFwcC5DYWxlbmRhclZpZXcpOgorICBgYGAKKworICBUaGUgYWJvdmUgYm91bmQgaGVscGVy
IGNhbiBiZSB1c2VkIGluc2lkZSBvZiB0ZW1wbGF0ZXMgYXMgZm9sbG93czoKKworICBgYGBoYW5k
bGViYXJzCisgIHt7Y2FsZW5kYXJ9fQorICBgYGAKKworICBXaGljaCBpcyBmdW5jdGlvbmFsbHkg
ZXF1aXZhbGVudCB0bzoKKworICBgYGBoYW5kbGViYXJzCisgIHt7dmlldyBBcHAuQ2FsZW5kYXJW
aWV3fX0KKyAgYGBgCisKKyAgT3B0aW9ucyBpbiB0aGUgaGVscGVyIHdpbGwgYmUgcGFzc2VkIHRv
IHRoZSB2aWV3IGluIGV4YWN0bHkgdGhlIHNhbWUKKyAgbWFubmVyIGFzIHdpdGggdGhlIGB2aWV3
YCBoZWxwZXIuCisKKyAgQG1ldGhvZCBoZWxwZXIKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzCisg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lCisgIEBwYXJhbSB7RnVuY3Rpb258RW1iZXIuVmlld30gZnVu
Y3Rpb24gb3IgdmlldyBjbGFzcyBjb25zdHJ1Y3RvcgorICBAcGFyYW0ge1N0cmluZ30gZGVwZW5k
ZW50S2V5cyoKKyovCitFbWJlci5IYW5kbGViYXJzLmhlbHBlciA9IGZ1bmN0aW9uKG5hbWUsIHZh
bHVlKSB7CisgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHJlZ2lzdGVyIGEgY29tcG9uZW50
IG5hbWVkICciICsgbmFtZSArICInLCBidXQgY29tcG9uZW50IG5hbWVzIG11c3QgaW5jbHVkZSBh
ICctJyIsICFFbWJlci5Db21wb25lbnQuZGV0ZWN0KHZhbHVlKSB8fCBuYW1lLm1hdGNoKC8tLykp
OworCisgIGlmIChFbWJlci5WaWV3LmRldGVjdCh2YWx1ZSkpIHsKKyAgICBFbWJlci5IYW5kbGVi
YXJzLnJlZ2lzdGVySGVscGVyKG5hbWUsIEVtYmVyLkhhbmRsZWJhcnMubWFrZVZpZXdIZWxwZXIo
dmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRI
ZWxwZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKKyAgfQorfTsKKworLyoqCisgIFJldHVybnMg
YSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZSBwcm92aWRlZCBWaWV3Q2xhc3MuCisK
KyAgVXNlZCBpbnRlcm5hbGx5IGJ5IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyIGFuZCBvdGhlciBt
ZXRob2RzCisgIGludm9sdmluZyBoZWxwZXIvY29tcG9uZW50IHJlZ2lzdHJhdGlvbi4KKworICBA
cHJpdmF0ZQorICBAbWV0aG9kIGhlbHBlcgorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKKyAgQHBh
cmFtIHtGdW5jdGlvbn0gVmlld0NsYXNzIHZpZXcgY2xhc3MgY29uc3RydWN0b3IKKyovCitFbWJl
ci5IYW5kbGViYXJzLm1ha2VWaWV3SGVscGVyID0gZnVuY3Rpb24oVmlld0NsYXNzKSB7CisgIHJl
dHVybiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkg
cGFzcyBhdHRyaWJ1dGVzIChzdWNoIGFzIG5hbWU9dmFsdWUpIG5vdCBiYXJlIHZhbHVlcyB0byBh
IGhlbHBlciBmb3IgYSBWaWV3IGZvdW5kIGluICciICsgVmlld0NsYXNzLnRvU3RyaW5nKCkgKyAi
JyIsIGFyZ3VtZW50cy5sZW5ndGggPCAyKTsKKyAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBWaWV3Q2xhc3MsIG9wdGlvbnMpOworICB9OworfTsKKwor
LyoqCitAY2xhc3MgaGVscGVycworQG5hbWVzcGFjZSBFbWJlci5IYW5kbGViYXJzCisqLworRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzID0gb2JqZWN0Q3JlYXRlKEhhbmRsZWJhcnMuaGVscGVycyk7
CisKKy8qKgorICBPdmVycmlkZSB0aGUgdGhlIG9wY29kZSBjb21waWxlciBhbmQgSmF2YVNjcmlw
dCBjb21waWxlciBmb3IgSGFuZGxlYmFycy4KKworICBAY2xhc3MgQ29tcGlsZXIKKyAgQG5hbWVz
cGFjZSBFbWJlci5IYW5kbGViYXJzCisgIEBwcml2YXRlCisgIEBjb25zdHJ1Y3RvcgorKi8KK0Vt
YmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OworCisvLyBIYW5kbGViYXJz
LkNvbXBpbGVyIGRvZXNuJ3QgZXhpc3QgaW4gcnVudGltZS1vbmx5CitpZiAoSGFuZGxlYmFycy5D
b21waWxlcikgeworICBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyLnByb3RvdHlwZSA9IG9iamVj
dENyZWF0ZShIYW5kbGViYXJzLkNvbXBpbGVyLnByb3RvdHlwZSk7Cit9CisKK0VtYmVyLkhhbmRs
ZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVyID0gRW1iZXIuSGFuZGxlYmFycy5Db21w
aWxlcjsKKworLyoqCisgIEBjbGFzcyBKYXZhU2NyaXB0Q29tcGlsZXIKKyAgQG5hbWVzcGFjZSBF
bWJlci5IYW5kbGViYXJzCisgIEBwcml2YXRlCisgIEBjb25zdHJ1Y3RvcgorKi8KK0VtYmVyLkhh
bmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKKworLy8gSGFuZGxl
YmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgZG9lc24ndCBleGlzdCBpbiBydW50aW1lLW9ubHkKK2lm
IChIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcikgeworICBFbWJlci5IYW5kbGViYXJzLkph
dmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUgPSBvYmplY3RDcmVhdGUoSGFuZGxlYmFycy5KYXZh
U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlKTsKKyAgRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0
Q29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVyID0gRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0
Q29tcGlsZXI7Cit9CisKKworRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJv
dG90eXBlLm5hbWVzcGFjZSA9ICJFbWJlci5IYW5kbGViYXJzIjsKKworRW1iZXIuSGFuZGxlYmFy
cy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlLmluaXRpYWxpemVCdWZmZXIgPSBmdW5jdGlv
bigpIHsKKyAgcmV0dXJuICInJyI7Cit9OworCisvKioKKyAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQg
YnVmZmVyIGZvciBFbWJlciBIYW5kbGViYXJzLiBCeSBkZWZhdWx0LCBIYW5kbGViYXJzCisgIGNy
ZWF0ZXMgYW4gZW1wdHkgU3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbnZvY2F0aW9u
IGFuZCBhcHBlbmRzIHRvCisgIGl0LiBFbWJlcidzIEhhbmRsZWJhcnMgb3ZlcnJpZGVzIHRoaXMg
dG8gYXBwZW5kIHRvIGEgc2luZ2xlIHNoYXJlZCBidWZmZXIuCisKKyAgQHByaXZhdGUKKyAgQG1l
dGhvZCBhcHBlbmRUb0J1ZmZlcgorICBAcGFyYW0gc3RyaW5nIHtTdHJpbmd9CisqLworRW1iZXIu
SGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlLmFwcGVuZFRvQnVmZmVyID0g
ZnVuY3Rpb24oc3RyaW5nKSB7CisgIHJldHVybiAiZGF0YS5idWZmZXIucHVzaCgiK3N0cmluZysi
KTsiOworfTsKKworLy8gSGFja3MgYWhlYWQ6CisvLyBIYW5kbGViYXJzIHByZXNlbnRseSBoYXMg
YSBidWcgd2hlcmUgdGhlIGBibG9ja0hlbHBlck1pc3NpbmdgIGhvb2sKKy8vIGRvZXNuJ3QgZ2V0
IHBhc3NlZCB0aGUgbmFtZSBvZiB0aGUgbWlzc2luZyBoZWxwZXIgbmFtZSwgYnV0IHJhdGhlcgor
Ly8gZ2V0cyBwYXNzZWQgdGhlIHZhbHVlIG9mIHRoYXQgbWlzc2luZyBoZWxwZXIgZXZhbHVhdGVk
IG9uIHRoZSBjdXJyZW50CisvLyBjb250ZXh0LCB3aGljaCBpcyBtb3N0IGxpa2VseSBgdW5kZWZp
bmVkYCBhbmQgdG90YWxseSB1c2VsZXNzLgorLy8KKy8vIFNvIHdlIGFsdGVyIHRoZSBjb21waWxl
ZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0byBwYXNzIHRoZSBuYW1lIG9mIHRoZSBoZWxwZXIKKy8vIGlu
c3RlYWQsIGFzIGV4cGVjdGVkLgorLy8KKy8vIFRoaXMgY2FuIGdvIGF3YXkgb25jZSB0aGUgZm9s
bG93aW5nIGlzIGNsb3NlZDoKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS93eWNhdHMvaGFuZGxlYmFy
cy5qcy9pc3N1ZXMvNjM0CisKK3ZhciBET1RfTE9PS1VQX1JFR0VYID0gL2hlbHBlcnNcLiguKj8p
XCkvLAorICAgIEJSQUNLRVRfU1RSSU5HX0xPT0tVUF9SRUdFWCA9IC9oZWxwZXJzXFsnKC4qPykn
LywKKyAgICBJTlZPQ0FUSU9OX1NQTElUVElOR19SRUdFWCA9IC8oLipibG9ja0hlbHBlck1pc3Np
bmdcLmNhbGxcKC4qKShzdGFja1swLTldKykoLC4qKS87CisKK0VtYmVyLkhhbmRsZWJhcnMuSmF2
YVNjcmlwdENvbXBpbGVyLnN0cmluZ2lmeUxhc3RCbG9ja0hlbHBlck1pc3NpbmdJbnZvY2F0aW9u
ID0gZnVuY3Rpb24oc291cmNlKSB7CisgIHZhciBoZWxwZXJJbnZvY2F0aW9uID0gc291cmNlW3Nv
dXJjZS5sZW5ndGggLSAxXSwKKyAgICAgIGhlbHBlck5hbWUgPSAoRE9UX0xPT0tVUF9SRUdFWC5l
eGVjKGhlbHBlckludm9jYXRpb24pIHx8IEJSQUNLRVRfU1RSSU5HX0xPT0tVUF9SRUdFWC5leGVj
KGhlbHBlckludm9jYXRpb24pKVsxXSwKKyAgICAgIG1hdGNoZXMgPSBJTlZPQ0FUSU9OX1NQTElU
VElOR19SRUdFWC5leGVjKGhlbHBlckludm9jYXRpb24pOworCisgIHNvdXJjZVtzb3VyY2UubGVu
Z3RoIC0gMV0gPSBtYXRjaGVzWzFdICsgIiciICsgaGVscGVyTmFtZSArICInIiArIG1hdGNoZXNb
M107Cit9Cit2YXIgc3RyaW5naWZ5QmxvY2tIZWxwZXJNaXNzaW5nID0gRW1iZXIuSGFuZGxlYmFy
cy5KYXZhU2NyaXB0Q29tcGlsZXIuc3RyaW5naWZ5TGFzdEJsb2NrSGVscGVyTWlzc2luZ0ludm9j
YXRpb247CisKK3ZhciBvcmlnaW5hbEJsb2NrVmFsdWUgPSBFbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlci5wcm90b3R5cGUuYmxvY2tWYWx1ZTsKK0VtYmVyLkhhbmRsZWJhcnMuSmF2
YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5ibG9ja1ZhbHVlID0gZnVuY3Rpb24oKSB7CisgIG9y
aWdpbmFsQmxvY2tWYWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICBzdHJpbmdpZnlCbG9j
a0hlbHBlck1pc3NpbmcodGhpcy5zb3VyY2UpOworfTsKKwordmFyIG9yaWdpbmFsQW1iaWd1b3Vz
QmxvY2tWYWx1ZSA9IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlw
ZS5hbWJpZ3VvdXNCbG9ja1ZhbHVlOworRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGls
ZXIucHJvdG90eXBlLmFtYmlndW91c0Jsb2NrVmFsdWUgPSBmdW5jdGlvbigpIHsKKyAgb3JpZ2lu
YWxBbWJpZ3VvdXNCbG9ja1ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIHN0cmluZ2lm
eUJsb2NrSGVscGVyTWlzc2luZyh0aGlzLnNvdXJjZSk7Cit9OworCit2YXIgcHJlZml4ID0gImVt
YmVyIiArICgrbmV3IERhdGUoKSksIGluY3IgPSAxOworCisvKioKKyAgUmV3cml0ZSBzaW1wbGUg
bXVzdGFjaGVzIGZyb20gYHt7Zm9vfX1gIHRvIGB7e2JpbmQgImZvbyJ9fWAuIFRoaXMgbWVhbnMg
dGhhdAorICBhbGwgc2ltcGxlIG11c3RhY2hlcyBpbiBFbWJlcidzIEhhbmRsZWJhcnMgd2lsbCBh
bHNvIHNldCB1cCBhbiBvYnNlcnZlciB0bworICBrZWVwIHRoZSBET00gdXAgdG8gZGF0ZSB3aGVu
IHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGNoYW5nZXMuCisKKyAgQHByaXZhdGUKKyAgQG1ldGhv
ZCBtdXN0YWNoZQorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIKKyAgQHBhcmFtIG11
c3RhY2hlCisqLworRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUubXVzdGFjaGUg
PSBmdW5jdGlvbihtdXN0YWNoZSkgeworICBpZiAobXVzdGFjaGUuaXNIZWxwZXIgJiYgbXVzdGFj
aGUuaWQuc3RyaW5nID09PSAnY29udHJvbCcpIHsKKyAgICBtdXN0YWNoZS5oYXNoID0gbXVzdGFj
aGUuaGFzaCB8fCBuZXcgSGFuZGxlYmFycy5BU1QuSGFzaE5vZGUoW10pOworICAgIG11c3RhY2hl
Lmhhc2gucGFpcnMucHVzaChbImNvbnRyb2xJRCIsIG5ldyBIYW5kbGViYXJzLkFTVC5TdHJpbmdO
b2RlKHByZWZpeCArIGluY3IrKyldKTsKKyAgfSBlbHNlIGlmIChtdXN0YWNoZS5wYXJhbXMubGVu
Z3RoIHx8IG11c3RhY2hlLmhhc2gpIHsKKyAgICAvLyBubyBjaGFuZ2VzIHJlcXVpcmVkCisgIH0g
ZWxzZSB7CisgICAgdmFyIGlkID0gbmV3IEhhbmRsZWJhcnMuQVNULklkTm9kZShbeyBwYXJ0OiAn
X3RyaWFnZU11c3RhY2hlJyB9XSk7CisKKyAgICAvLyBVcGRhdGUgdGhlIG11c3RhY2hlIG5vZGUg
dG8gaW5jbHVkZSBhIGhhc2ggdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcmlnaW5hbCBu
b2RlCisgICAgLy8gd2FzIGVzY2FwZWQuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBwcm9wZXJseSBl
c2NhcGUgdmFsdWVzIHdoZW4gdGhlIHVuZGVybHlpbmcgdmFsdWUKKyAgICAvLyBjaGFuZ2VzIGFu
ZCB3ZSBuZWVkIHRvIHJlLXJlbmRlciB0aGUgdmFsdWUuCisgICAgaWYgKCFtdXN0YWNoZS5lc2Nh
cGVkKSB7CisgICAgICBtdXN0YWNoZS5oYXNoID0gbXVzdGFjaGUuaGFzaCB8fCBuZXcgSGFuZGxl
YmFycy5BU1QuSGFzaE5vZGUoW10pOworICAgICAgbXVzdGFjaGUuaGFzaC5wYWlycy5wdXNoKFsi
dW5lc2NhcGVkIiwgbmV3IEhhbmRsZWJhcnMuQVNULlN0cmluZ05vZGUoInRydWUiKV0pOworICAg
IH0KKyAgICBtdXN0YWNoZSA9IG5ldyBIYW5kbGViYXJzLkFTVC5NdXN0YWNoZU5vZGUoW2lkXS5j
b25jYXQoW211c3RhY2hlLmlkXSksIG11c3RhY2hlLmhhc2gsICFtdXN0YWNoZS5lc2NhcGVkKTsK
KyAgfQorCisgIHJldHVybiBIYW5kbGViYXJzLkNvbXBpbGVyLnByb3RvdHlwZS5tdXN0YWNoZS5j
YWxsKHRoaXMsIG11c3RhY2hlKTsKK307CisKKy8qKgorICBVc2VkIGZvciBwcmVjb21waWxhdGlv
biBvZiBFbWJlciBIYW5kbGViYXJzIHRlbXBsYXRlcy4gVGhpcyB3aWxsIG5vdCBiZSB1c2VkCisg
IGR1cmluZyBub3JtYWwgYXBwIGV4ZWN1dGlvbi4KKworICBAbWV0aG9kIHByZWNvbXBpbGUKKyAg
QGZvciBFbWJlci5IYW5kbGViYXJzCisgIEBzdGF0aWMKKyAgQHBhcmFtIHtTdHJpbmd9IHN0cmlu
ZyBUaGUgdGVtcGxhdGUgdG8gcHJlY29tcGlsZQorKi8KK0VtYmVyLkhhbmRsZWJhcnMucHJlY29t
cGlsZSA9IGZ1bmN0aW9uKHN0cmluZykgeworICB2YXIgYXN0ID0gSGFuZGxlYmFycy5wYXJzZShz
dHJpbmcpOworCisgIHZhciBvcHRpb25zID0geworICAgIGtub3duSGVscGVyczogeworICAgICAg
YWN0aW9uOiB0cnVlLAorICAgICAgdW5ib3VuZDogdHJ1ZSwKKyAgICAgICdiaW5kLWF0dHInOiB0
cnVlLAorICAgICAgdGVtcGxhdGU6IHRydWUsCisgICAgICB2aWV3OiB0cnVlLAorICAgICAgX3Ry
aWFnZU11c3RhY2hlOiB0cnVlCisgICAgfSwKKyAgICBkYXRhOiB0cnVlLAorICAgIHN0cmluZ1Bh
cmFtczogdHJ1ZQorICB9OworCisgIHZhciBlbnZpcm9ubWVudCA9IG5ldyBFbWJlci5IYW5kbGVi
YXJzLkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOworICByZXR1cm4gbmV3IEVtYmVy
LkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0
aW9ucywgdW5kZWZpbmVkLCB0cnVlKTsKK307CisKKy8vIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBm
b3IgSGFuZGxlYmFycyBydW50aW1lLW9ubHkKK2lmIChIYW5kbGViYXJzLmNvbXBpbGUpIHsKKyAg
LyoqCisgICAgVGhlIGVudHJ5IHBvaW50IGZvciBFbWJlciBIYW5kbGViYXJzLiBUaGlzIHJlcGxh
Y2VzIHRoZSBkZWZhdWx0CisgICAgYEhhbmRsZWJhcnMuY29tcGlsZWAgYW5kIHR1cm5zIG9uIHRl
bXBsYXRlLWxvY2FsIGRhdGEgYW5kIFN0cmluZworICAgIHBhcmFtZXRlcnMuCisKKyAgICBAbWV0
aG9kIGNvbXBpbGUKKyAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKKyAgICBAc3RhdGljCisgICAg
QHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgdGVtcGxhdGUgdG8gY29tcGlsZQorICAgIEByZXR1
cm4ge0Z1bmN0aW9ufQorICAqLworICBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUgPSBmdW5jdGlv
bihzdHJpbmcpIHsKKyAgICB2YXIgYXN0ID0gSGFuZGxlYmFycy5wYXJzZShzdHJpbmcpOworICAg
IHZhciBvcHRpb25zID0geyBkYXRhOiB0cnVlLCBzdHJpbmdQYXJhbXM6IHRydWUgfTsKKyAgICB2
YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIuSGFuZGxlYmFycy5Db21waWxlcigpLmNvbXBpbGUo
YXN0LCBvcHRpb25zKTsKKyAgICB2YXIgdGVtcGxhdGVTcGVjID0gbmV3IEVtYmVyLkhhbmRsZWJh
cnMuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5k
ZWZpbmVkLCB0cnVlKTsKKworICAgIHZhciB0ZW1wbGF0ZSA9IEVtYmVyLkhhbmRsZWJhcnMudGVt
cGxhdGUodGVtcGxhdGVTcGVjKTsKKyAgICB0ZW1wbGF0ZS5pc01ldGhvZCA9IGZhbHNlOyAvL01h
a2Ugc3VyZSB3ZSBkb24ndCB3cmFwIHRlbXBsYXRlcyB3aXRoIC5fc3VwZXIKKworICAgIHJldHVy
biB0ZW1wbGF0ZTsKKyAgfTsKK30KKworCit9KSgpOworCisoZnVuY3Rpb24oKSB7Cit2YXIgc2xp
Y2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCisgICAgb3JpZ2luYWxUZW1wbGF0ZSA9IEVtYmVy
LkhhbmRsZWJhcnMudGVtcGxhdGU7CisKKy8qKgorICBJZiBhIHBhdGggc3RhcnRzIHdpdGggYSBy
ZXNlcnZlZCBrZXl3b3JkLCByZXR1cm5zIHRoZSByb290CisgIHRoYXQgc2hvdWxkIGJlIHVzZWQu
CisKKyAgQHByaXZhdGUKKyAgQG1ldGhvZCBub3JtYWxpemVQYXRoCisgIEBmb3IgRW1iZXIKKyAg
QHBhcmFtIHJvb3Qge09iamVjdH0KKyAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgQHBhcmFtIGRh
dGEge0hhc2h9CisqLwordmFyIG5vcm1hbGl6ZVBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1h
bGl6ZVBhdGggPSBmdW5jdGlvbihyb290LCBwYXRoLCBkYXRhKSB7CisgIHZhciBrZXl3b3JkcyA9
IChkYXRhICYmIGRhdGEua2V5d29yZHMpIHx8IHt9LAorICAgICAga2V5d29yZCwgaXNLZXl3b3Jk
OworCisgIC8vIEdldCB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aC4gRm9yIGV4YW1wbGUs
IGlmIHRoZQorICAvLyBwYXRoIGlzICJmb28uYmFyLmJheiIsIHJldHVybnMgImZvbyIuCisgIGtl
eXdvcmQgPSBwYXRoLnNwbGl0KCcuJywgMSlbMF07CisKKyAgLy8gVGVzdCB0byBzZWUgaWYgdGhl
IGZpcnN0IHBhdGggaXMgYSBrZXl3b3JkIHRoYXQgaGFzIGJlZW4KKyAgLy8gcGFzc2VkIGFsb25n
IGluIHRoZSB2aWV3J3MgZGF0YSBoYXNoLiBJZiBzbywgd2Ugd2lsbCB0cmVhdAorICAvLyB0aGF0
IG9iamVjdCBhcyB0aGUgbmV3IHJvb3QuCisgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShr
ZXl3b3JkKSkgeworICAgIC8vIExvb2sgdXAgdGhlIHZhbHVlIGluIHRoZSB0ZW1wbGF0ZSdzIGRh
dGEgaGFzaC4KKyAgICByb290ID0ga2V5d29yZHNba2V5d29yZF07CisgICAgaXNLZXl3b3JkID0g
dHJ1ZTsKKworICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgZW50aXJlIHBhdGggaXMgdGhl
IHJlc2VydmVkCisgICAgLy8gd29yZC4gSW4gdGhhdCBjYXNlLCByZXR1cm4gdGhlIG9iamVjdCBp
dHNlbGYuCisgICAgaWYgKHBhdGggPT09IGtleXdvcmQpIHsKKyAgICAgIHBhdGggPSAnJzsKKyAg
ICB9IGVsc2UgeworICAgICAgLy8gU3RyaXAgdGhlIGtleXdvcmQgZnJvbSB0aGUgcGF0aCBhbmQg
bG9vayB1cAorICAgICAgLy8gdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBuZXdseSBmb3VuZCByb290
LgorICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKGtleXdvcmQubGVuZ3RoKzEpOworICAgIH0KKyAg
fQorCisgIHJldHVybiB7IHJvb3Q6IHJvb3QsIHBhdGg6IHBhdGgsIGlzS2V5d29yZDogaXNLZXl3
b3JkIH07Cit9OworCisKKy8qKgorICBMb29rdXAgYm90aCBvbiByb290IGFuZCBvbiB3aW5kb3cu
IElmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoCisgIGEga2V5d29yZCwgdGhlIGNvcnJlc3BvbmRpbmcg
b2JqZWN0IHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZQorICB0ZW1wbGF0ZSdzIGRhdGEgaGFzaCBh
bmQgdXNlZCB0byByZXNvbHZlIHRoZSBwYXRoLgorCisgIEBtZXRob2QgZ2V0CisgIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycworICBAcGFyYW0ge09iamVjdH0gcm9vdCBUaGUgb2JqZWN0IHRvIGxvb2sg
dXAgdGhlIHByb3BlcnR5IG9uCisgIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGJl
IGxvb2tlZHVwCisgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSB0ZW1wbGF0ZSdzIG9wdGlv
biBoYXNoCisqLwordmFyIGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldCA9IGZ1
bmN0aW9uKHJvb3QsIHBhdGgsIG9wdGlvbnMpIHsKKyAgdmFyIGRhdGEgPSBvcHRpb25zICYmIG9w
dGlvbnMuZGF0YSwKKyAgICAgIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChyb290LCBw
YXRoLCBkYXRhKSwKKyAgICAgIHZhbHVlOworCisgIAorICAgIHJvb3QgPSBub3JtYWxpemVkUGF0
aC5yb290OworICAgIHBhdGggPSBub3JtYWxpemVkUGF0aC5wYXRoOworCisgICAgdmFsdWUgPSBF
bWJlci5nZXQocm9vdCwgcGF0aCk7CisKKyAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBy
b290ICE9PSBFbWJlci5sb29rdXAgJiYgRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7CisgICAg
ICB2YWx1ZSA9IEVtYmVyLmdldChFbWJlci5sb29rdXAsIHBhdGgpOworICAgIH0KKyAgCisKKyAg
cmV0dXJuIHZhbHVlOworfTsKKworRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlUGFyYW1zID0gZnVu
Y3Rpb24oY29udGV4dCwgcGFyYW1zLCBvcHRpb25zKSB7CisgIHZhciByZXNvbHZlZFBhcmFtcyA9
IFtdLCB0eXBlcyA9IG9wdGlvbnMudHlwZXMsIHBhcmFtLCB0eXBlOworCisgIGZvciAodmFyIGk9
MCwgbD1wYXJhbXMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIHBhcmFtID0gcGFyYW1zW2ldOwor
ICAgIHR5cGUgPSB0eXBlc1tpXTsKKworICAgIGlmICh0eXBlID09PSAnSUQnKSB7CisgICAgICBy
ZXNvbHZlZFBhcmFtcy5wdXNoKGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcGFyYW0sIG9wdGlvbnMp
KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzb2x2ZWRQYXJhbXMucHVzaChwYXJhbSk7CisgICAg
fQorICB9CisKKyAgcmV0dXJuIHJlc29sdmVkUGFyYW1zOworfTsKKworRW1iZXIuSGFuZGxlYmFy
cy5yZXNvbHZlSGFzaCA9IGZ1bmN0aW9uKGNvbnRleHQsIGhhc2gsIG9wdGlvbnMpIHsKKyAgdmFy
IHJlc29sdmVkSGFzaCA9IHt9LCB0eXBlcyA9IG9wdGlvbnMuaGFzaFR5cGVzLCB0eXBlOworCisg
IGZvciAodmFyIGtleSBpbiBoYXNoKSB7CisgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KGtl
eSkpIHsgY29udGludWU7IH0KKworICAgIHR5cGUgPSB0eXBlc1trZXldOworCisgICAgaWYgKHR5
cGUgPT09ICdJRCcpIHsKKyAgICAgIHJlc29sdmVkSGFzaFtrZXldID0gaGFuZGxlYmFyc0dldChj
b250ZXh0LCBoYXNoW2tleV0sIG9wdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICByZXNvbHZl
ZEhhc2hba2V5XSA9IGhhc2hba2V5XTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzb2x2ZWRI
YXNoOworfTsKKworLyoqCisgIFJlZ2lzdGVycyBhIGhlbHBlciBpbiBIYW5kbGViYXJzIHRoYXQg
d2lsbCBiZSBjYWxsZWQgaWYgbm8gcHJvcGVydHkgd2l0aCB0aGUKKyAgZ2l2ZW4gbmFtZSBjYW4g
YmUgZm91bmQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QsIGFuZCBubyBoZWxwZXIgd2l0
aAorICB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZC4KKworICBUaGlzIHRocm93cyBhbiBleGNlcHRp
b24gd2l0aCBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIHNvIHRoZSB1c2VyIGNhbgorICB0
cmFjayBkb3duIHdoZXJlIHRoZSBwcm9ibGVtIGlzIGhhcHBlbmluZy4KKworICBAcHJpdmF0ZQor
ICBAbWV0aG9kIGhlbHBlck1pc3NpbmcKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMK
KyAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKKyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisqLworRW1i
ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKHBh
dGgpIHsKKyAgdmFyIGVycm9yLCB2aWV3ID0gIiI7CisKKyAgdmFyIG9wdGlvbnMgPSBhcmd1bWVu
dHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdOworCisgIHZhciBoZWxwZXIgPSBFbWJlci5IYW5kbGVi
YXJzLnJlc29sdmVIZWxwZXIob3B0aW9ucy5kYXRhLnZpZXcuY29udGFpbmVyLCBwYXRoKTsKKwor
ICBpZiAoaGVscGVyKSB7CisgICAgcmV0dXJuIGhlbHBlci5hcHBseSh0aGlzLCBzbGljZS5jYWxs
KGFyZ3VtZW50cywgMSkpOworICB9CisKKyAgZXJyb3IgPSAiJUAgSGFuZGxlYmFycyBlcnJvcjog
Q291bGQgbm90IGZpbmQgcHJvcGVydHkgJyVAJyBvbiBvYmplY3QgJUAuIjsKKyAgaWYgKG9wdGlv
bnMuZGF0YSkgeworICAgIHZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKKyAgfQorICB0aHJvdyBu
ZXcgRW1iZXIuRXJyb3IoRW1iZXIuU3RyaW5nLmZtdChlcnJvciwgW3ZpZXcsIHBhdGgsIHRoaXNd
KSk7Cit9KTsKKworLyoqCisgIFJlZ2lzdGVycyBhIGhlbHBlciBpbiBIYW5kbGViYXJzIHRoYXQg
d2lsbCBiZSBjYWxsZWQgaWYgbm8gcHJvcGVydHkgd2l0aCB0aGUKKyAgZ2l2ZW4gbmFtZSBjYW4g
YmUgZm91bmQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QsIGFuZCBubyBoZWxwZXIgd2l0
aAorICB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZC4KKworICBUaGlzIHRocm93cyBhbiBleGNlcHRp
b24gd2l0aCBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIHNvIHRoZSB1c2VyIGNhbgorICB0
cmFjayBkb3duIHdoZXJlIHRoZSBwcm9ibGVtIGlzIGhhcHBlbmluZy4KKworICBAcHJpdmF0ZQor
ICBAbWV0aG9kIGhlbHBlck1pc3NpbmcKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMK
KyAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKKyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisqLworRW1i
ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmxvY2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rp
b24ocGF0aCkgeworCisgIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgg
LSAxXTsKKworICBFbWJlci5hc3NlcnQoImBibG9ja0hlbHBlck1pc3NpbmdgIHdhcyBpbnZva2Vk
IHdpdGhvdXQgYSBoZWxwZXIgbmFtZSwgd2hpY2ggIiArCisgICAgICAgICAgICAgICAiaXMgbW9z
dCBsaWtlbHkgZHVlIHRvIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgdmVyc2lvbiBvZiAiICsKKyAg
ICAgICAgICAgICAgICJFbWJlci5qcyB5b3UncmUgcnVubmluZyBub3cgYW5kIHRoZSBvbmUgdXNl
ZCB0byBwcmVjb21waWxlIHlvdXIgIiArCisgICAgICAgICAgICAgICAidGVtcGxhdGVzLiBQbGVh
c2UgbWFrZSBzdXJlIHRoZSB2ZXJzaW9uIG9mICIgKworICAgICAgICAgICAgICAgImBlbWJlci1o
YW5kbGViYXJzLWNvbXBpbGVyYCB5b3UncmUgdXNpbmcgaXMgdXAgdG8gZGF0ZS4iLCBwYXRoKTsK
KworICB2YXIgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKG9wdGlvbnMu
ZGF0YS52aWV3LmNvbnRhaW5lciwgcGF0aCk7CisKKyAgaWYgKGhlbHBlcikgeworICAgIHJldHVy
biBoZWxwZXIuYXBwbHkodGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKKyAgfSBlbHNl
IHsKKyAgICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLmhlbHBlck1pc3NpbmcuY2FsbCh0aGlz
LCBwYXRoKTsKKyAgfQorCisgIHJldHVybiBIYW5kbGViYXJzLmhlbHBlcnMuYmxvY2tIZWxwZXJN
aXNzaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9KTsKKworLyoqCisgIFJlZ2lzdGVyIGEg
Ym91bmQgaGFuZGxlYmFycyBoZWxwZXIuIEJvdW5kIGhlbHBlcnMgYmVoYXZlIHNpbWlsYXJseSB0
byByZWd1bGFyCisgIGhhbmRsZWJhcnMgaGVscGVycywgd2l0aCB0aGUgYWRkZWQgYWJpbGl0eSB0
byByZS1yZW5kZXIgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhCisgIGNoYW5nZXMuCisKKyAgIyMg
U2ltcGxlIGV4YW1wbGUKKworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLkhhbmRsZWJhcnMucmVn
aXN0ZXJCb3VuZEhlbHBlcignY2FwaXRhbGl6ZScsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0
dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7CisgIH0pOworICBgYGAKKworICBUaGUgYWJvdmUgYm91
bmQgaGVscGVyIGNhbiBiZSB1c2VkIGluc2lkZSBvZiB0ZW1wbGF0ZXMgYXMgZm9sbG93czoKKwor
ICBgYGBoYW5kbGViYXJzCisgIHt7Y2FwaXRhbGl6ZSBuYW1lfX0KKyAgYGBgCisKKyAgSW4gdGhp
cyBjYXNlLCB3aGVuIHRoZSBgbmFtZWAgcHJvcGVydHkgb2YgdGhlIHRlbXBsYXRlJ3MgY29udGV4
dCBjaGFuZ2VzLAorICB0aGUgcmVuZGVyZWQgdmFsdWUgb2YgdGhlIGhlbHBlciB3aWxsIHVwZGF0
ZSB0byByZWZsZWN0IHRoaXMgY2hhbmdlLgorCisgICMjIEV4YW1wbGUgd2l0aCBvcHRpb25zCisK
KyAgTGlrZSBub3JtYWwgaGFuZGxlYmFycyBoZWxwZXJzLCBib3VuZCBoZWxwZXJzIGhhdmUgYWNj
ZXNzIHRvIHRoZSBvcHRpb25zCisgIHBhc3NlZCBpbnRvIHRoZSBoZWxwZXIgY2FsbC4KKworICBg
YGBqYXZhc2NyaXB0CisgIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlcigncmVw
ZWF0JywgZnVuY3Rpb24odmFsdWUsIG9wdGlvbnMpIHsKKyAgICB2YXIgY291bnQgPSBvcHRpb25z
Lmhhc2guY291bnQ7CisgICAgdmFyIGEgPSBbXTsKKyAgICB3aGlsZShhLmxlbmd0aCA8IGNvdW50
KSB7CisgICAgICAgIGEucHVzaCh2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBhLmpvaW4oJycp
OworICB9KTsKKyAgYGBgCisKKyAgVGhpcyBoZWxwZXIgY291bGQgYmUgdXNlZCBpbiBhIHRlbXBs
YXRlIGFzIGZvbGxvd3M6CisKKyAgYGBgaGFuZGxlYmFycworICB7e3JlcGVhdCB0ZXh0IGNvdW50
PTN9fQorICBgYGAKKworICAjIyBFeGFtcGxlIHdpdGggYm91bmQgb3B0aW9ucworCisgIEJvdW5k
IGhhc2ggb3B0aW9ucyBhcmUgYWxzbyBzdXBwb3J0ZWQuIEV4YW1wbGU6CisKKyAgYGBgaGFuZGxl
YmFycworICB7e3JlcGVhdCB0ZXh0IGNvdW50QmluZGluZz0ibnVtUmVwZWF0cyJ9fQorICBgYGAK
KworICBJbiB0aGlzIGV4YW1wbGUsIGNvdW50IHdpbGwgYmUgYm91bmQgdG8gdGhlIHZhbHVlIG9m
CisgIHRoZSBgbnVtUmVwZWF0c2AgcHJvcGVydHkgb24gdGhlIGNvbnRleHQuIElmIHRoYXQgcHJv
cGVydHkKKyAgY2hhbmdlcywgdGhlIGhlbHBlciB3aWxsIGJlIHJlLXJlbmRlcmVkLgorCisgICMj
IEV4YW1wbGUgd2l0aCBleHRyYSBkZXBlbmRlbmNpZXMKKworICBUaGUgYEVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJCb3VuZEhlbHBlcmAgbWV0aG9kIHRha2VzIGEgdmFyaWFibGUgbGVuZ3RoCisg
IHRoaXJkIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgZXh0cmEgZGVwZW5kZW5jaWVzIG9uIHRo
ZSBwYXNzZWQgaW4gdmFsdWUuCisgIFRoaXMgYWxsb3dzIHRoZSBoYW5kbGViYXJzIGhlbHBlciB0
byB1cGRhdGUgd2hlbiB0aGVzZSBkZXBlbmRlbmNpZXMgY2hhbmdlLgorCisgIGBgYGphdmFzY3Jp
cHQKKyAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5kSGVscGVyKCdjYXBpdGFsaXplTmFt
ZScsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlLmdldCgnbmFtZScpLnRvVXBw
ZXJDYXNlKCk7CisgIH0sICduYW1lJyk7CisgIGBgYAorCisgICMjIEV4YW1wbGUgd2l0aCBtdWx0
aXBsZSBib3VuZCBwcm9wZXJ0aWVzCisKKyAgYEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3Vu
ZEhlbHBlcmAgc3VwcG9ydHMgYmluZGluZyB0bworICBtdWx0aXBsZSBwcm9wZXJ0aWVzLCBlLmcu
OgorCisgIGBgYGphdmFzY3JpcHQKKyAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5kSGVs
cGVyKCdjb25jYXRlbmF0ZScsIGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZXMgPSBBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKTsKKyAgICByZXR1cm4gdmFsdWVz
LmpvaW4oJ3x8Jyk7CisgIH0pOworICBgYGAKKworICBXaGljaCBhbGxvd3MgZm9yIHRlbXBsYXRl
IHN5bnRheCBzdWNoIGFzIGB7e2NvbmNhdGVuYXRlIHByb3AxIHByb3AyfX1gIG9yCisgIGB7e2Nv
bmNhdGVuYXRlIHByb3AxIHByb3AyIHByb3AzfX1gLiBJZiBhbnkgb2YgdGhlIHByb3BlcnRpZXMg
Y2hhbmdlLAorICB0aGUgaGVscHIgd2lsbCByZS1yZW5kZXIuICBOb3RlIHRoYXQgZGVwZW5kZW5j
eSBrZXlzIGNhbm5vdCBiZQorICB1c2luZyBpbiBjb25qdW5jdGlvbiB3aXRoIG11bHRpLXByb3Bl
cnR5IGhlbHBlcnMsIHNpbmNlIGl0IGlzIGFtYmlndW91cworICB3aGljaCBwcm9wZXJ0eSB0aGUg
ZGVwZW5kZW50IGtleXMgd291bGQgYmVsb25nIHRvLgorCisgICMjIFVzZSB3aXRoIHVuYm91bmQg
aGVscGVyCisKKyAgVGhlIGB7e3VuYm91bmR9fWAgaGVscGVyIGNhbiBiZSB1c2VkIHdpdGggYm91
bmQgaGVscGVyIGludm9jYXRpb25zCisgIHRvIHJlbmRlciB0aGVtIGluIHRoZWlyIHVuYm91bmQg
Zm9ybSwgZS5nLgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3t1bmJvdW5kIGNhcGl0YWxpemUgbmFt
ZX19CisgIGBgYAorCisgIEluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIG5hbWUgcHJvcGVydHkgY2hh
bmdlcywgdGhlIGhlbHBlcgorICB3aWxsIG5vdCByZS1yZW5kZXIuCisKKyAgIyMgVXNlIHdpdGgg
YmxvY2tzIG5vdCBzdXBwb3J0ZWQKKworICBCb3VuZCBoZWxwZXJzIGRvIG5vdCBzdXBwb3J0IHVz
ZSB3aXRoIEhhbmRsZWJhcnMgYmxvY2tzIG9yCisgIHRoZSBhZGRpdGlvbiBvZiBjaGlsZCB2aWV3
cyBvZiBhbnkga2luZC4KKworICBAbWV0aG9kIHJlZ2lzdGVyQm91bmRIZWxwZXIKKyAgQGZvciBF
bWJlci5IYW5kbGViYXJzCisgIEBwYXJhbSB7U3RyaW5nfSBuYW1lCisgIEBwYXJhbSB7RnVuY3Rp
b259IGZ1bmN0aW9uCisgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXlzKgorKi8KK0VtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlciA9IGZ1bmN0aW9uKG5hbWUsIGZuKSB7Cisg
IHZhciBib3VuZEhlbHBlckFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksCisgICAgICBi
b3VuZEZuID0gRW1iZXIuSGFuZGxlYmFycy5tYWtlQm91bmRIZWxwZXIuYXBwbHkodGhpcywgYm91
bmRIZWxwZXJBcmdzKTsKKyAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcihuYW1lLCBi
b3VuZEZuKTsKK307CisKKy8qKgorICBBIChtb3N0bHkpIHByaXZhdGUgaGVscGVyIGZ1bmN0aW9u
IHRvIGByZWdpc3RlckJvdW5kSGVscGVyYC4gVGFrZXMgdGhlCisgIHByb3ZpZGVkIEhhbmRsZWJh
cnMgaGVscGVyIGZ1bmN0aW9uIGZuIGFuZCByZXR1cm5zIGl0IGluIHdyYXBwZWQKKyAgYm91bmQg
aGVscGVyIGZvcm0uCisKKyAgVGhlIG1haW4gdXNlIGNhc2UgZm9yIHVzaW5nIHRoaXMgb3V0c2lk
ZSBvZiBgcmVnaXN0ZXJCb3VuZEhlbHBlcmAKKyAgaXMgZm9yIHJlZ2lzdGVyaW5nIGhlbHBlcnMg
b24gdGhlIGNvbnRhaW5lcjoKKworICBgYGBqcworICB2YXIgYm91bmRIZWxwZXJGbiA9IEVtYmVy
LkhhbmRsZWJhcnMubWFrZUJvdW5kSGVscGVyKGZ1bmN0aW9uKHdvcmQpIHsKKyAgICByZXR1cm4g
d29yZC50b1VwcGVyQ2FzZSgpOworICB9KTsKKworICBjb250YWluZXIucmVnaXN0ZXIoJ2hlbHBl
cjpteS1ib3VuZC1oZWxwZXInLCBib3VuZEhlbHBlckZuKTsKKyAgYGBgCisKKyAgSW4gdGhlIGFi
b3ZlIGV4YW1wbGUsIGlmIHRoZSBoZWxwZXIgZnVuY3Rpb24gaGFkbid0IGJlZW4gd3JhcHBlZCBp
bgorICBgbWFrZUJvdW5kSGVscGVyYCwgdGhlIHJlZ2lzdGVyZWQgaGVscGVyIHdvdWxkIGJlIHVu
Ym91bmQuCisKKyAgQHByaXZhdGUKKyAgQG1ldGhvZCBtYWtlQm91bmRIZWxwZXIKKyAgQGZvciBF
bWJlci5IYW5kbGViYXJzCisgIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uCisgIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXlzKgorKi8KK0VtYmVyLkhhbmRsZWJhcnMubWFrZUJvdW5kSGVs
cGVyID0gZnVuY3Rpb24oZm4pIHsKKyAgdmFyIGRlcGVuZGVudEtleXMgPSBzbGljZS5jYWxsKGFy
Z3VtZW50cywgMSk7CisKKyAgZnVuY3Rpb24gaGVscGVyKCkgeworICAgIHZhciBwcm9wZXJ0aWVz
ID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSwKKyAgICAgIG51bVByb3BlcnRpZXMgPSBw
cm9wZXJ0aWVzLmxlbmd0aCwKKyAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxl
bmd0aCAtIDFdLAorICAgICAgbm9ybWFsaXplZFByb3BlcnRpZXMgPSBbXSwKKyAgICAgIGRhdGEg
PSBvcHRpb25zLmRhdGEsCisgICAgICB0eXBlcyA9IGRhdGEuaXNVbmJvdW5kID8gc2xpY2UuY2Fs
bChvcHRpb25zLnR5cGVzLCAxKSA6IG9wdGlvbnMudHlwZXMsCisgICAgICBoYXNoID0gb3B0aW9u
cy5oYXNoLAorICAgICAgdmlldyA9IGRhdGEudmlldywKKyAgICAgIGNvbnRleHRzID0gb3B0aW9u
cy5jb250ZXh0cywKKyAgICAgIGN1cnJlbnRDb250ZXh0ID0gKGNvbnRleHRzICYmIGNvbnRleHRz
Lmxlbmd0aCkgPyBjb250ZXh0c1swXSA6IHRoaXMsCisgICAgICBwcmVmaXhQYXRoRm9yRGVwZW5k
ZW50S2V5cyA9ICcnLAorICAgICAgbG9jLCBsZW4sIGhhc2hPcHRpb24sCisgICAgICBib3VuZE9w
dGlvbiwgcHJvcGVydHksCisgICAgICBub3JtYWxpemVkVmFsdWUgPSBFbWJlci5fU2ltcGxlSGFu
ZGxlYmFyc1ZpZXcucHJvdG90eXBlLm5vcm1hbGl6ZWRWYWx1ZTsKKworICAgIEVtYmVyLmFzc2Vy
dCgicmVnaXN0ZXJCb3VuZEhlbHBlci1nZW5lcmF0ZWQgaGVscGVycyBkbyBub3Qgc3VwcG9ydCB1
c2Ugd2l0aCBIYW5kbGViYXJzIGJsb2Nrcy4iLCAhb3B0aW9ucy5mbik7CisKKyAgICAvLyBEZXRl
Y3QgYm91bmQgb3B0aW9ucyAoZS5nLiBjb3VudEJpbmRpbmc9Im90aGVyQ291bnQiKQorICAgIHZh
ciBib3VuZE9wdGlvbnMgPSBoYXNoLmJvdW5kT3B0aW9ucyA9IHt9OworICAgIGZvciAoaGFzaE9w
dGlvbiBpbiBoYXNoKSB7CisgICAgICBpZiAoRW1iZXIuSVNfQklORElORy50ZXN0KGhhc2hPcHRp
b24pKSB7CisgICAgICAgIC8vIExvcCBvZmYgJ0JpbmRpbmcnIHN1ZmZpeC4KKyAgICAgICAgYm91
bmRPcHRpb25zW2hhc2hPcHRpb24uc2xpY2UoMCwgLTcpXSA9IGhhc2hbaGFzaE9wdGlvbl07Cisg
ICAgICB9CisgICAgfQorCisgICAgLy8gRXhwb3NlIHByb3BlcnR5IG5hbWVzIG9uIGRhdGEucHJv
cGVydGllcyBvYmplY3QuCisgICAgdmFyIHdhdGNoZWRQcm9wZXJ0aWVzID0gW107CisgICAgZGF0
YS5wcm9wZXJ0aWVzID0gW107CisgICAgZm9yIChsb2MgPSAwOyBsb2MgPCBudW1Qcm9wZXJ0aWVz
OyArK2xvYykgeworICAgICAgZGF0YS5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydGllc1tsb2NdKTsK
KyAgICAgIGlmICh0eXBlc1tsb2NdID09PSAnSUQnKSB7CisgICAgICAgIHZhciBub3JtYWxpemVk
UHJvcCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudENvbnRleHQsIHByb3BlcnRpZXNbbG9jXSwgZGF0
YSk7CisgICAgICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLnB1c2gobm9ybWFsaXplZFByb3ApOwor
ICAgICAgICB3YXRjaGVkUHJvcGVydGllcy5wdXNoKG5vcm1hbGl6ZWRQcm9wKTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIGlmKGRhdGEuaXNVbmJvdW5kKSB7CisgICAgICAgICAgbm9ybWFsaXpl
ZFByb3BlcnRpZXMucHVzaCh7cGF0aDogcHJvcGVydGllc1tsb2NdfSk7CisgICAgICAgIH1lbHNl
IHsKKyAgICAgICAgICBub3JtYWxpemVkUHJvcGVydGllcy5wdXNoKG51bGwpOworICAgICAgICB9
CisgICAgICB9CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiBoZWxwZXIgaW52b2Nh
dGlvbiBpcyBwcmVjZWRlZCBieSBgdW5ib3VuZGAsIGUuZy4KKyAgICAvLyB7e3VuYm91bmQgbXlI
ZWxwZXIgZm9vfX0KKyAgICBpZiAoZGF0YS5pc1VuYm91bmQpIHsKKyAgICAgIHJldHVybiBldmFs
dWF0ZVVuYm91bmRIZWxwZXIodGhpcywgZm4sIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLCBvcHRpb25z
KTsKKyAgICB9CisKKyAgICB2YXIgYmluZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJh
cnNWaWV3KG51bGwsIG51bGwsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25zLmRhdGEp
OworCisgICAgLy8gT3ZlcnJpZGUgU2ltcGxlSGFuZGxlYmFyc1ZpZXcncyBtZXRob2QgZm9yIGdl
bmVyYXRpbmcgdGhlIHZpZXcncyBjb250ZW50LgorICAgIGJpbmRWaWV3Lm5vcm1hbGl6ZWRWYWx1
ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGFyZ3MgPSBbXSwgYm91bmRPcHRpb247CisKKyAg
ICAgIC8vIENvcHkgb3ZlciBib3VuZCBoYXNoIG9wdGlvbnMuCisgICAgICBmb3IgKGJvdW5kT3B0
aW9uIGluIGJvdW5kT3B0aW9ucykgeworICAgICAgICBpZiAoIWJvdW5kT3B0aW9ucy5oYXNPd25Q
cm9wZXJ0eShib3VuZE9wdGlvbikpIHsgY29udGludWU7IH0KKyAgICAgICAgcHJvcGVydHkgPSBu
b3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRPcHRpb25dLCBk
YXRhKTsKKyAgICAgICAgYmluZFZpZXcucGF0aCA9IHByb3BlcnR5LnBhdGg7CisgICAgICAgIGJp
bmRWaWV3LnBhdGhSb290ID0gcHJvcGVydHkucm9vdDsKKyAgICAgICAgaGFzaFtib3VuZE9wdGlv
bl0gPSBub3JtYWxpemVkVmFsdWUuY2FsbChiaW5kVmlldyk7CisgICAgICB9CisKKyAgICAgIGZv
ciAobG9jID0gMDsgbG9jIDwgbnVtUHJvcGVydGllczsgKytsb2MpIHsKKyAgICAgICAgcHJvcGVy
dHkgPSBub3JtYWxpemVkUHJvcGVydGllc1tsb2NdOworICAgICAgICBpZiAocHJvcGVydHkpIHsK
KyAgICAgICAgICBiaW5kVmlldy5wYXRoID0gcHJvcGVydHkucGF0aDsKKyAgICAgICAgICBiaW5k
Vmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7CisgICAgICAgICAgYXJncy5wdXNoKG5vcm1h
bGl6ZWRWYWx1ZS5jYWxsKGJpbmRWaWV3KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
YXJncy5wdXNoKHByb3BlcnRpZXNbbG9jXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFy
Z3MucHVzaChvcHRpb25zKTsKKworICAgICAgLy8gUnVuIHRoZSBzdXBwbGllZCBoZWxwZXIgZnVu
Y3Rpb24uCisgICAgICByZXR1cm4gZm4uYXBwbHkoY3VycmVudENvbnRleHQsIGFyZ3MpOworICAg
IH07CisKKyAgICB2aWV3LmFwcGVuZENoaWxkKGJpbmRWaWV3KTsKKworICAgIC8vIEFzc2VtYmxl
IGxpc3Qgb2Ygd2F0Y2hlZCBwcm9wZXJ0aWVzIHRoYXQnbGwgcmUtcmVuZGVyIHRoaXMgaGVscGVy
LgorICAgIGZvciAoYm91bmRPcHRpb24gaW4gYm91bmRPcHRpb25zKSB7CisgICAgICBpZiAoYm91
bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5kT3B0aW9uKSkgeworICAgICAgICB3YXRjaGVk
UHJvcGVydGllcy5wdXNoKG5vcm1hbGl6ZVBhdGgoY3VycmVudENvbnRleHQsIGJvdW5kT3B0aW9u
c1tib3VuZE9wdGlvbl0sIGRhdGEpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPYnNlcnZl
IGVhY2ggcHJvcGVydHkuCisgICAgZm9yIChsb2MgPSAwLCBsZW4gPSB3YXRjaGVkUHJvcGVydGll
cy5sZW5ndGg7IGxvYyA8IGxlbjsgKytsb2MpIHsKKyAgICAgIHByb3BlcnR5ID0gd2F0Y2hlZFBy
b3BlcnRpZXNbbG9jXTsKKyAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihwcm9wZXJ0eS5yb290
LCBwcm9wZXJ0eS5wYXRoLCBiaW5kVmlldywgYmluZFZpZXcucmVyZW5kZXIpOworICAgIH0KKwor
ICAgIGlmICh0eXBlc1swXSAhPT0gJ0lEJyB8fCBub3JtYWxpemVkUHJvcGVydGllcy5sZW5ndGgg
PT09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBZGQgZGVwZW5kZW50IGtl
eSBvYnNlcnZlcnMgdG8gdGhlIGZpcnN0IHBhcmFtCisgICAgdmFyIG5vcm1hbGl6ZWQgPSBub3Jt
YWxpemVkUHJvcGVydGllc1swXSwKKyAgICAgICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3Qs
CisgICAgICAgIHBhdGggPSBub3JtYWxpemVkLnBhdGg7CisKKyAgICBpZighRW1iZXIuaXNFbXB0
eShwYXRoKSkgeworICAgICAgcHJlZml4UGF0aEZvckRlcGVuZGVudEtleXMgPSBwYXRoICsgJy4n
OworICAgIH0KKyAgICBmb3IgKHZhciBpPTAsIGw9ZGVwZW5kZW50S2V5cy5sZW5ndGg7IGk8bDsg
aSsrKSB7CisgICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocGF0aFJvb3QsIHByZWZpeFBhdGhG
b3JEZXBlbmRlbnRLZXlzICsgZGVwZW5kZW50S2V5c1tpXSwgYmluZFZpZXcsIGJpbmRWaWV3LnJl
cmVuZGVyKTsKKyAgICB9CisgIH0KKworICBoZWxwZXIuX3Jhd0Z1bmN0aW9uID0gZm47CisgIHJl
dHVybiBoZWxwZXI7Cit9OworCisvKioKKyAgUmVuZGVycyB0aGUgdW5ib3VuZCBmb3JtIG9mIGFu
IG90aGVyd2lzZSBib3VuZCBoZWxwZXIgZnVuY3Rpb24uCisKKyAgQHByaXZhdGUKKyAgQG1ldGhv
ZCBldmFsdWF0ZVVuYm91bmRIZWxwZXIKKyAgQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAgQHBhcmFt
IHtPYmplY3R9IGNvbnRleHQKKyAgQHBhcmFtIHtBcnJheX0gbm9ybWFsaXplZFByb3BlcnRpZXMK
KyAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMKKyovCitmdW5jdGlvbiBldmFsdWF0ZVVuYm91bmRI
ZWxwZXIoY29udGV4dCwgZm4sIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLCBvcHRpb25zKSB7CisgIHZh
ciBhcmdzID0gW10sCisgICBoYXNoID0gb3B0aW9ucy5oYXNoLAorICAgYm91bmRPcHRpb25zID0g
aGFzaC5ib3VuZE9wdGlvbnMsCisgICB0eXBlcyA9IHNsaWNlLmNhbGwob3B0aW9ucy50eXBlcywg
MSksCisgICBsb2MsCisgICBsZW4sCisgICBwcm9wZXJ0eSwKKyAgIHByb3BlcnR5VHlwZSwKKyAg
IGJvdW5kT3B0aW9uOworCisgIGZvciAoYm91bmRPcHRpb24gaW4gYm91bmRPcHRpb25zKSB7Cisg
ICAgaWYgKCFib3VuZE9wdGlvbnMuaGFzT3duUHJvcGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRp
bnVlOyB9CisgICAgaGFzaFtib3VuZE9wdGlvbl0gPSBFbWJlci5IYW5kbGViYXJzLmdldChjb250
ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRPcHRpb25dLCBvcHRpb25zKTsKKyAgfQorCisgIGZvcihs
b2MgPSAwLCBsZW4gPSBub3JtYWxpemVkUHJvcGVydGllcy5sZW5ndGg7IGxvYyA8IGxlbjsgKyts
b2MpIHsKKyAgICBwcm9wZXJ0eSA9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzW2xvY107CisgICAgcHJv
cGVydHlUeXBlID0gdHlwZXNbbG9jXTsKKyAgICBpZihwcm9wZXJ0eVR5cGUgPT09ICJJRCIpIHsK
KyAgICAgIGFyZ3MucHVzaChFbWJlci5IYW5kbGViYXJzLmdldChwcm9wZXJ0eS5yb290LCBwcm9w
ZXJ0eS5wYXRoLCBvcHRpb25zKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MucHVzaChwcm9w
ZXJ0eS5wYXRoKTsKKyAgICB9CisgIH0KKyAgYXJncy5wdXNoKG9wdGlvbnMpOworICByZXR1cm4g
Zm4uYXBwbHkoY29udGV4dCwgYXJncyk7Cit9CisKKy8qKgorICBPdmVycmlkZXMgSGFuZGxlYmFy
cy50ZW1wbGF0ZSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaAorICB1c2VyLWNyZWF0ZWQsIHRv
cC1sZXZlbCB0ZW1wbGF0ZXMgZnJvbSBpbm5lciBjb250ZXh0cy4KKworICBAcHJpdmF0ZQorICBA
bWV0aG9kIHRlbXBsYXRlCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycworICBAcGFyYW0ge1N0cmlu
Z30gc3BlYworKi8KK0VtYmVyLkhhbmRsZWJhcnMudGVtcGxhdGUgPSBmdW5jdGlvbihzcGVjKSB7
CisgIHZhciB0ID0gb3JpZ2luYWxUZW1wbGF0ZShzcGVjKTsKKyAgdC5pc1RvcCA9IHRydWU7Cisg
IHJldHVybiB0OworfTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKy8qKgorICBNYXJr
IGEgc3RyaW5nIGFzIHNhZmUgZm9yIHVuZXNjYXBlZCBvdXRwdXQgd2l0aCBIYW5kbGViYXJzLiBJ
ZiB5b3UKKyAgcmV0dXJuIEhUTUwgZnJvbSBhIEhhbmRsZWJhcnMgaGVscGVyLCB1c2UgdGhpcyBm
dW5jdGlvbiB0bworICBlbnN1cmUgSGFuZGxlYmFycyBkb2VzIG5vdCBlc2NhcGUgdGhlIEhUTUwu
CisKKyAgYGBgamF2YXNjcmlwdAorICBFbWJlci5TdHJpbmcuaHRtbFNhZmUoJzxkaXY+c29tZVN0
cmluZzwvZGl2PicpCisgIGBgYAorCisgIEBtZXRob2QgaHRtbFNhZmUKKyAgQGZvciBFbWJlci5T
dHJpbmcKKyAgQHN0YXRpYworICBAcmV0dXJuIHtIYW5kbGViYXJzLlNhZmVTdHJpbmd9IGEgc3Ry
aW5nIHRoYXQgd2lsbCBub3QgYmUgaHRtbCBlc2NhcGVkIGJ5IEhhbmRsZWJhcnMKKyovCitFbWJl
ci5TdHJpbmcuaHRtbFNhZmUgPSBmdW5jdGlvbihzdHIpIHsKKyAgcmV0dXJuIG5ldyBIYW5kbGVi
YXJzLlNhZmVTdHJpbmcoc3RyKTsKK307CisKK3ZhciBodG1sU2FmZSA9IEVtYmVyLlN0cmluZy5o
dG1sU2FmZTsKKworaWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVy
LkVYVEVORF9QUk9UT1RZUEVTLlN0cmluZykgeworCisgIC8qKgorICAgIE1hcmsgYSBzdHJpbmcg
YXMgYmVpbmcgc2FmZSBmb3IgdW5lc2NhcGVkIG91dHB1dCB3aXRoIEhhbmRsZWJhcnMuCisKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgJzxkaXY+c29tZVN0cmluZzwvZGl2PicuaHRtbFNhZmUoKQor
ICAgIGBgYAorCisgICAgU2VlIFtFbWJlci5TdHJpbmcuaHRtbFNhZmVdKC9hcGkvY2xhc3Nlcy9F
bWJlci5TdHJpbmcuaHRtbCNtZXRob2RfaHRtbFNhZmUpLgorCisgICAgQG1ldGhvZCBodG1sU2Fm
ZQorICAgIEBmb3IgU3RyaW5nCisgICAgQHJldHVybiB7SGFuZGxlYmFycy5TYWZlU3RyaW5nfSBh
IHN0cmluZyB0aGF0IHdpbGwgbm90IGJlIGh0bWwgZXNjYXBlZCBieSBIYW5kbGViYXJzCisgICov
CisgIFN0cmluZy5wcm90b3R5cGUuaHRtbFNhZmUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
aHRtbFNhZmUodGhpcyk7CisgIH07Cit9CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CitF
bWJlci5IYW5kbGViYXJzLnJlc29sdmVQYXRocyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgdmFy
IHJldCA9IFtdLAorICAgICAgY29udGV4dHMgPSBvcHRpb25zLmNvbnRleHRzLAorICAgICAgcm9v
dHMgPSBvcHRpb25zLnJvb3RzLAorICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YTsKKworICBmb3Ig
KHZhciBpPTAsIGw9Y29udGV4dHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgIHJldC5wdXNoKCBF
bWJlci5IYW5kbGViYXJzLmdldChyb290c1tpXSwgY29udGV4dHNbaV0sIHsgZGF0YTogZGF0YSB9
KSApOworICB9CisKKyAgcmV0dXJuIHJldDsKK307CisKK30pKCk7CisKKworCisoZnVuY3Rpb24o
KSB7CisvKmpzaGludCBuZXdjYXA6ZmFsc2UqLworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9k
dWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKK3ZhciBzZXQgPSBFbWJlci5zZXQsIGdldCA9IEVt
YmVyLmdldDsKK3ZhciBNZXRhbW9ycGggPSByZXF1aXJlTW9kdWxlKCdtZXRhbW9ycGgnKTsKKwor
ZnVuY3Rpb24gbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKSB7CisgIEVtYmVyLnJ1bi5vbmNlKEVt
YmVyLlZpZXcsICdub3RpZnlNdXRhdGlvbkxpc3RlbmVycycpOworfQorCisvLyBET01NYW5hZ2Vy
IHNob3VsZCBqdXN0IGFic3RyYWN0IGRvbSBtYW5pcHVsYXRpb24gYmV0d2VlbiBqcXVlcnkgYW5k
IG1ldGFtb3JwaAordmFyIERPTU1hbmFnZXIgPSB7CisgIHJlbW92ZTogZnVuY3Rpb24odmlldykg
eworICAgIHZpZXcubW9ycGgucmVtb3ZlKCk7CisgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMo
KTsKKyAgfSwKKworICBwcmVwZW5kOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7CisgICAgdmlldy5t
b3JwaC5wcmVwZW5kKGh0bWwpOworICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7CisgIH0s
CisKKyAgYWZ0ZXI6IGZ1bmN0aW9uKHZpZXcsIGh0bWwpIHsKKyAgICB2aWV3Lm1vcnBoLmFmdGVy
KGh0bWwpOworICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7CisgIH0sCisKKyAgaHRtbDog
ZnVuY3Rpb24odmlldywgaHRtbCkgeworICAgIHZpZXcubW9ycGguaHRtbChodG1sKTsKKyAgICBu
b3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOworICB9LAorCisgIC8vIFRoaXMgaXMgbWVzc2VkIHVw
LgorICByZXBsYWNlOiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmFyIG1vcnBoID0gdmlldy5tb3Jw
aDsKKworICAgIHZpZXcudHJhbnNpdGlvblRvKCdwcmVSZW5kZXInKTsKKworICAgIEVtYmVyLnJ1
bi5zY2hlZHVsZSgncmVuZGVyJywgdGhpcywgZnVuY3Rpb24gcmVuZGVyTWV0YW1vcnBoVmlldygp
IHsKKyAgICAgIGlmICh2aWV3LmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KKworICAgICAgdmll
dy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsKKyAgICAgIHZhciBidWZmZXIgPSB2aWV3LnJlbmRl
clRvQnVmZmVyKCk7CisKKyAgICAgIHZpZXcuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24odmll
dykgeworICAgICAgICB2aWV3LnByb3BlcnR5V2lsbENoYW5nZSgnZWxlbWVudCcpOworICAgICAg
fSk7CisgICAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbEluc2VydEVsZW1lbnQnKTsK
KworICAgICAgbW9ycGgucmVwbGFjZVdpdGgoYnVmZmVyLnN0cmluZygpKTsKKyAgICAgIHZpZXcu
dHJhbnNpdGlvblRvKCdpbkRPTScpOworCisgICAgICB2aWV3Lmludm9rZVJlY3Vyc2l2ZWx5KGZ1
bmN0aW9uKHZpZXcpIHsKKyAgICAgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnZWxlbWVudCcp
OworICAgICAgfSk7CisgICAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnZGlkSW5zZXJ0RWxl
bWVudCcpOworCisgICAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOworICAgIH0pOworICB9
LAorCisgIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7CisgICAgdmlldy5tb3JwaC5odG1sKCIiKTsK
KyAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOworICB9Cit9OworCisvLyBUaGUgYG1vcnBo
YCBhbmQgYG91dGVySFRNTGAgcHJvcGVydGllcyBhcmUgaW50ZXJuYWwgb25seQorLy8gYW5kIG5v
dCBvYnNlcnZhYmxlLgorCisvKioKKyAgQGNsYXNzIF9NZXRhbW9ycGgKKyAgQG5hbWVzcGFjZSBF
bWJlcgorICBAcHJpdmF0ZQorKi8KK0VtYmVyLl9NZXRhbW9ycGggPSBFbWJlci5NaXhpbi5jcmVh
dGUoeworICBpc1ZpcnR1YWw6IHRydWUsCisgIHRhZ05hbWU6ICcnLAorCisgIGluc3RydW1lbnRO
YW1lOiAnbWV0YW1vcnBoJywKKworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBl
cigpOworICAgIHRoaXMubW9ycGggPSBNZXRhbW9ycGgoKTsKKyAgICBFbWJlci5kZXByZWNhdGUo
J1N1cHBseWluZyBhIHRhZ05hbWUgdG8gTWV0YW1vcnBoIHZpZXdzIGlzIHVucmVsaWFibGUgYW5k
IGlzIGRlcHJlY2F0ZWQuIFlvdSBtYXkgYmUgc2V0dGluZyB0aGUgdGFnTmFtZSBvbiBhIEhhbmRs
ZWJhcnMgaGVscGVyIHRoYXQgY3JlYXRlcyBhIE1ldGFtb3JwaC4nLCAhdGhpcy50YWdOYW1lKTsK
KyAgfSwKKworICBiZWZvcmVSZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgeworICAgIGJ1ZmZlci5w
dXNoKHRoaXMubW9ycGguc3RhcnRUYWcoKSk7CisgICAgYnVmZmVyLnB1c2hPcGVuaW5nVGFnKCk7
CisgIH0sCisKKyAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgeworICAgIGJ1ZmZlci5w
dXNoQ2xvc2luZ1RhZygpOworICAgIGJ1ZmZlci5wdXNoKHRoaXMubW9ycGguZW5kVGFnKCkpOwor
ICB9LAorCisgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBidWZmZXIgPSB0
aGlzLnJlbmRlclRvQnVmZmVyKCk7CisgICAgdGhpcy5vdXRlckhUTUwgPSBidWZmZXIuc3RyaW5n
KCk7CisgICAgdGhpcy5jbGVhckJ1ZmZlcigpOworICB9LAorCisgIGRvbU1hbmFnZXI6IERPTU1h
bmFnZXIKK30pOworCisvKioKKyAgQGNsYXNzIF9NZXRhbW9ycGhWaWV3CisgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuVmlldworICBAdXNlcyBFbWJlci5fTWV0YW1vcnBoCisg
IEBwcml2YXRlCisqLworRW1iZXIuX01ldGFtb3JwaFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChF
bWJlci5fTWV0YW1vcnBoKTsKKworLyoqCisgIEBjbGFzcyBfU2ltcGxlTWV0YW1vcnBoVmlldwor
ICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLkNvcmVWaWV3CisgIEB1c2VzIEVt
YmVyLl9NZXRhbW9ycGgKKyAgQHByaXZhdGUKKyovCitFbWJlci5fU2ltcGxlTWV0YW1vcnBoVmll
dyA9IEVtYmVyLkNvcmVWaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoKTsKKworCit9KSgpOwor
CisKKworKGZ1bmN0aW9uKCkgeworLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KKy8qanNoaW50IG5l
d2NhcDpmYWxzZSovCisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxl
YmFycworKi8KKwordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBoYW5kbGVi
YXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQ7Cit2YXIgTWV0YW1vcnBoID0gcmVxdWlyZU1v
ZHVsZSgnbWV0YW1vcnBoJyk7CitmdW5jdGlvbiBTaW1wbGVIYW5kbGViYXJzVmlldyhwYXRoLCBw
YXRoUm9vdCwgaXNFc2NhcGVkLCB0ZW1wbGF0ZURhdGEpIHsKKyAgdGhpcy5wYXRoID0gcGF0aDsK
KyAgdGhpcy5wYXRoUm9vdCA9IHBhdGhSb290OworICB0aGlzLmlzRXNjYXBlZCA9IGlzRXNjYXBl
ZDsKKyAgdGhpcy50ZW1wbGF0ZURhdGEgPSB0ZW1wbGF0ZURhdGE7CisKKyAgdGhpcy5tb3JwaCA9
IE1ldGFtb3JwaCgpOworICB0aGlzLnN0YXRlID0gJ3ByZVJlbmRlcic7CisgIHRoaXMudXBkYXRl
SWQgPSBudWxsOworICB0aGlzLl9wYXJlbnRWaWV3ID0gbnVsbDsKKyAgdGhpcy5idWZmZXIgPSBu
dWxsOworfQorCitFbWJlci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXcgPSBTaW1wbGVIYW5kbGViYXJz
VmlldzsKKworU2ltcGxlSGFuZGxlYmFyc1ZpZXcucHJvdG90eXBlID0geworICBpc1ZpcnR1YWw6
IHRydWUsCisgIGlzVmlldzogdHJ1ZSwKKworICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAg
aWYgKHRoaXMudXBkYXRlSWQpIHsKKyAgICAgIEVtYmVyLnJ1bi5jYW5jZWwodGhpcy51cGRhdGVJ
ZCk7CisgICAgICB0aGlzLnVwZGF0ZUlkID0gbnVsbDsKKyAgICB9CisgICAgaWYgKHRoaXMuX3Bh
cmVudFZpZXcpIHsKKyAgICAgIHRoaXMuX3BhcmVudFZpZXcucmVtb3ZlQ2hpbGQodGhpcyk7Cisg
ICAgfQorICAgIHRoaXMubW9ycGggPSBudWxsOworICAgIHRoaXMuc3RhdGUgPSAnZGVzdHJveWVk
JzsKKyAgfSwKKworICBwcm9wZXJ0eVdpbGxDaGFuZ2U6IEVtYmVyLkssCisKKyAgcHJvcGVydHlE
aWRDaGFuZ2U6IEVtYmVyLkssCisKKyAgbm9ybWFsaXplZFZhbHVlOiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgcGF0aCA9IHRoaXMucGF0aCwKKyAgICAgICAgcGF0aFJvb3QgPSB0aGlzLnBhdGhSb290
LAorICAgICAgICByZXN1bHQsIHRlbXBsYXRlRGF0YTsKKworICAgIC8vIFVzZSB0aGUgcGF0aFJv
b3QgYXMgdGhlIHJlc3VsdCBpZiBubyBwYXRoIGlzIHByb3ZpZGVkLiBUaGlzCisgICAgLy8gaGFw
cGVucyBpZiB0aGUgcGF0aCBpcyBgdGhpc2AsIHdoaWNoIGdldHMgbm9ybWFsaXplZCBpbnRvCisg
ICAgLy8gYSBgcGF0aFJvb3RgIG9mIHRoZSBjdXJyZW50IEhhbmRsZWJhcnMgY29udGV4dCBhbmQg
YSBwYXRoCisgICAgLy8gb2YgYCcnYC4KKyAgICBpZiAocGF0aCA9PT0gJycpIHsKKyAgICAgIHJl
c3VsdCA9IHBhdGhSb290OworICAgIH0gZWxzZSB7CisgICAgICB0ZW1wbGF0ZURhdGEgPSB0aGlz
LnRlbXBsYXRlRGF0YTsKKyAgICAgIHJlc3VsdCA9IGhhbmRsZWJhcnNHZXQocGF0aFJvb3QsIHBh
dGgsIHsgZGF0YTogdGVtcGxhdGVEYXRhIH0pOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7
CisgIH0sCisKKyAgcmVuZGVyVG9CdWZmZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgeworICAgIHZhciBz
dHJpbmcgPSAnJzsKKworICAgIHN0cmluZyArPSB0aGlzLm1vcnBoLnN0YXJ0VGFnKCk7CisgICAg
c3RyaW5nICs9IHRoaXMucmVuZGVyKCk7CisgICAgc3RyaW5nICs9IHRoaXMubW9ycGguZW5kVGFn
KCk7CisKKyAgICBidWZmZXIucHVzaChzdHJpbmcpOworICB9LAorCisgIHJlbmRlcjogZnVuY3Rp
b24oKSB7CisgICAgLy8gSWYgbm90IGludm9rZWQgdmlhIGEgdHJpcGxlLW11c3RhY2hlICh7e3tm
b299fX0pLCBlc2NhcGUKKyAgICAvLyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUuCisgICAg
dmFyIGVzY2FwZSA9IHRoaXMuaXNFc2NhcGVkOworICAgIHZhciByZXN1bHQgPSB0aGlzLm5vcm1h
bGl6ZWRWYWx1ZSgpOworCisgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVu
ZGVmaW5lZCkgeworICAgICAgcmVzdWx0ID0gIiI7CisgICAgfSBlbHNlIGlmICghKHJlc3VsdCBp
bnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZykpIHsKKyAgICAgIHJlc3VsdCA9IFN0cmlu
ZyhyZXN1bHQpOworICAgIH0KKworICAgIGlmIChlc2NhcGUpIHsgcmVzdWx0ID0gSGFuZGxlYmFy
cy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHJlc3VsdCk7IH0KKyAgICByZXR1cm4gcmVzdWx0Owor
ICB9LAorCisgIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsKKyAgICBzd2l0Y2godGhpcy5zdGF0ZSkg
eworICAgICAgY2FzZSAncHJlUmVuZGVyJzoKKyAgICAgIGNhc2UgJ2Rlc3Ryb3llZCc6CisgICAg
ICAgIGJyZWFrOworICAgICAgY2FzZSAnaW5CdWZmZXInOgorICAgICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoIlNvbWV0aGluZyB5b3UgZGlkIHRyaWVkIHRvIHJlcGxhY2UgYW4ge3tleHByZXNz
aW9ufX0gYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBET00uIik7CisgICAgICBjYXNl
ICdoYXNFbGVtZW50JzoKKyAgICAgIGNhc2UgJ2luRE9NJzoKKyAgICAgICAgdGhpcy51cGRhdGVJ
ZCA9IEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRoaXMsICd1cGRhdGUnKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgdXBkYXRl
OiBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy51cGRhdGVJZCA9IG51bGw7CisgICAgdGhpcy5tb3Jw
aC5odG1sKHRoaXMucmVuZGVyKCkpOworICB9LAorCisgIHRyYW5zaXRpb25UbzogZnVuY3Rpb24o
c3RhdGUpIHsKKyAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgIH0KK307CisKK3ZhciBzdGF0ZXMg
PSBFbWJlci5WaWV3LmNsb25lU3RhdGVzKEVtYmVyLlZpZXcuc3RhdGVzKSwgbWVyZ2UgPSBFbWJl
ci5tZXJnZTsKKworbWVyZ2Uoc3RhdGVzLl9kZWZhdWx0LCB7CisgIHJlcmVuZGVySWZOZWVkZWQ6
IEVtYmVyLksKK30pOworCittZXJnZShzdGF0ZXMuaW5ET00sIHsKKyAgcmVyZW5kZXJJZk5lZWRl
ZDogZnVuY3Rpb24odmlldykgeworICAgIGlmICh2aWV3Lm5vcm1hbGl6ZWRWYWx1ZSgpICE9PSB2
aWV3Ll9sYXN0Tm9ybWFsaXplZFZhbHVlKSB7CisgICAgICB2aWV3LnJlcmVuZGVyKCk7CisgICAg
fQorICB9Cit9KTsKKworLyoqCisgIGBFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlld2AgaXMgYSBw
cml2YXRlIHZpZXcgY3JlYXRlZCBieSB0aGUgSGFuZGxlYmFycworICBge3tiaW5kfX1gIGhlbHBl
cnMgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYm91bmQgcHJvcGVydGllcy4KKworICBF
dmVyeSB0aW1lIGEgcHJvcGVydHkgaXMgYm91bmQgdXNpbmcgYSBge3ttdXN0YWNoZX19YCwgYW4g
YW5vbnltb3VzIHN1YmNsYXNzCisgIG9mIGBFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlld2AgaXMg
Y3JlYXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdWItdGVtcGxhdGUKKyAgYW5kIGNvbnRleHQg
c2V0IHVwLiBXaGVuIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGNoYW5nZXMsIGp1c3QgdGhlIHRl
bXBsYXRlCisgIGZvciB0aGlzIHZpZXcgd2lsbCByZS1yZW5kZXIuCisKKyAgQGNsYXNzIF9IYW5k
bGViYXJzQm91bmRWaWV3CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuX01l
dGFtb3JwaFZpZXcKKyAgQHByaXZhdGUKKyovCitFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlldyA9
IEVtYmVyLl9NZXRhbW9ycGhWaWV3LmV4dGVuZCh7CisgIGluc3RydW1lbnROYW1lOiAnYm91bmRI
YW5kbGViYXJzJywKKyAgc3RhdGVzOiBzdGF0ZXMsCisKKyAgLyoqCisgICAgVGhlIGZ1bmN0aW9u
IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBgZGlzcGxheVRlbXBsYXRlYCBvcgorICAgIGBpbnZl
cnNlVGVtcGxhdGVgIHNob3VsZCBiZSByZW5kZXJlZC4gVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlv
biB0aGF0IHRha2VzCisgICAgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIEJvb2xlYW4uCisKKyAgICBA
cHJvcGVydHkgc2hvdWxkRGlzcGxheUZ1bmMKKyAgICBAdHlwZSBGdW5jdGlvbgorICAgIEBkZWZh
dWx0IG51bGwKKyAgKi8KKyAgc2hvdWxkRGlzcGxheUZ1bmM6IG51bGwsCisKKyAgLyoqCisgICAg
V2hldGhlciB0aGUgdGVtcGxhdGUgcmVuZGVyZWQgYnkgdGhpcyB2aWV3IGdldHMgcGFzc2VkIHRo
ZSBjb250ZXh0IG9iamVjdAorICAgIG9mIGl0cyBwYXJlbnQgdGVtcGxhdGUsIG9yIGdldHMgcGFz
c2VkIHRoZSB2YWx1ZSBvZiByZXRyaWV2aW5nIGBwYXRoYAorICAgIGZyb20gdGhlIGBwYXRoUm9v
dGAuCisKKyAgICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB0cnVlIHdoZW4gdXNpbmcgdGhlIGB7eyNp
Zn19YCBoZWxwZXIsIGJlY2F1c2UgdGhlCisgICAgdGVtcGxhdGUgaW5zaWRlIHRoZSBoZWxwZXIg
c2hvdWxkIGxvb2sgdXAgcHJvcGVydGllcyByZWxhdGl2ZSB0byB0aGUgc2FtZQorICAgIG9iamVj
dCBhcyBvdXRzaWRlIHRoZSBibG9jay4gVGhpcyB3b3VsZCBiZSBgZmFsc2VgIHdoZW4gdXNlZCB3
aXRoIGB7eyN3aXRoCisgICAgZm9vfX1gIGJlY2F1c2UgdGhlIHRlbXBsYXRlIHNob3VsZCByZWNl
aXZlIHRoZSBvYmplY3QgZm91bmQgYnkgZXZhbHVhdGluZworICAgIGBmb29gLgorCisgICAgQHBy
b3BlcnR5IHByZXNlcnZlQ29udGV4dAorICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCBm
YWxzZQorICAqLworICBwcmVzZXJ2ZUNvbnRleHQ6IGZhbHNlLAorCisgIC8qKgorICAgIElmIGBw
cmVzZXJ2ZUNvbnRleHRgIGlzIHRydWUsIHRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IHdpbGwgYmUg
dXNlZAorICAgIHRvIHJlbmRlciB0aGUgdGVtcGxhdGUuCisKKyAgICBAcHJvcGVydHkgcHJldmlv
dXNDb250ZXh0CisgICAgQHR5cGUgT2JqZWN0CisgICovCisgIHByZXZpb3VzQ29udGV4dDogbnVs
bCwKKworICAvKioKKyAgICBUaGUgdGVtcGxhdGUgdG8gcmVuZGVyIHdoZW4gYHNob3VsZERpc3Bs
YXlGdW5jYCBldmFsdWF0ZXMgdG8gYHRydWVgLgorCisgICAgQHByb3BlcnR5IGRpc3BsYXlUZW1w
bGF0ZQorICAgIEB0eXBlIEZ1bmN0aW9uCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBkaXNw
bGF5VGVtcGxhdGU6IG51bGwsCisKKyAgLyoqCisgICAgVGhlIHRlbXBsYXRlIHRvIHJlbmRlciB3
aGVuIGBzaG91bGREaXNwbGF5RnVuY2AgZXZhbHVhdGVzIHRvIGBmYWxzZWAuCisKKyAgICBAcHJv
cGVydHkgaW52ZXJzZVRlbXBsYXRlCisgICAgQHR5cGUgRnVuY3Rpb24KKyAgICBAZGVmYXVsdCBu
dWxsCisgICovCisgIGludmVyc2VUZW1wbGF0ZTogbnVsbCwKKworCisgIC8qKgorICAgIFRoZSBw
YXRoIHRvIGxvb2sgdXAgb24gYHBhdGhSb290YCB0aGF0IGlzIHBhc3NlZCB0bworICAgIGBzaG91
bGREaXNwbGF5RnVuY2AgdG8gZGV0ZXJtaW5lIHdoaWNoIHRlbXBsYXRlIHRvIHJlbmRlci4KKwor
ICAgIEluIGFkZGl0aW9uLCBpZiBgcHJlc2VydmVDb250ZXh0YCBpcyBgZmFsc2UsYCB0aGUgb2Jq
ZWN0IGF0IHRoaXMgcGF0aCB3aWxsCisgICAgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZSB3aGVu
IHJlbmRlcmluZy4KKworICAgIEBwcm9wZXJ0eSBwYXRoCisgICAgQHR5cGUgU3RyaW5nCisgICAg
QGRlZmF1bHQgbnVsbAorICAqLworICBwYXRoOiBudWxsLAorCisgIC8qKgorICAgIFRoZSBvYmpl
Y3QgZnJvbSB3aGljaCB0aGUgYHBhdGhgIHdpbGwgYmUgbG9va2VkIHVwLiBTb21ldGltZXMgdGhp
cyBpcyB0aGUKKyAgICBzYW1lIGFzIHRoZSBgcHJldmlvdXNDb250ZXh0YCwgYnV0IGluIGNhc2Vz
IHdoZXJlIHRoaXMgdmlldyBoYXMgYmVlbgorICAgIGdlbmVyYXRlZCBmb3IgcGF0aHMgdGhhdCBz
dGFydCB3aXRoIGEga2V5d29yZCBzdWNoIGFzIGB2aWV3YCBvcgorICAgIGBjb250cm9sbGVyYCwg
dGhlIHBhdGggcm9vdCB3aWxsIGJlIHRoYXQgcmVzb2x2ZWQgb2JqZWN0LgorCisgICAgQHByb3Bl
cnR5IHBhdGhSb290CisgICAgQHR5cGUgT2JqZWN0CisgICovCisgIHBhdGhSb290OiBudWxsLAor
CisgIG5vcm1hbGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhdGggPSBnZXQodGhp
cywgJ3BhdGgnKSwKKyAgICAgICAgcGF0aFJvb3QgID0gZ2V0KHRoaXMsICdwYXRoUm9vdCcpLAor
ICAgICAgICB2YWx1ZU5vcm1hbGl6ZXIgPSBnZXQodGhpcywgJ3ZhbHVlTm9ybWFsaXplckZ1bmMn
KSwKKyAgICAgICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7CisKKyAgICAvLyBVc2UgdGhlIHBhdGhS
b290IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcworICAgIC8vIGhh
cHBlbnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgaW50bwor
ICAgIC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRleHQgYW5k
IGEgcGF0aAorICAgIC8vIG9mIGAnJ2AuCisgICAgaWYgKHBhdGggPT09ICcnKSB7CisgICAgICBy
ZXN1bHQgPSBwYXRoUm9vdDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcGxhdGVEYXRhID0gZ2V0
KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKKyAgICAgIHJlc3VsdCA9IGhhbmRsZWJhcnNHZXQocGF0
aFJvb3QsIHBhdGgsIHsgZGF0YTogdGVtcGxhdGVEYXRhIH0pOworICAgIH0KKworICAgIHJldHVy
biB2YWx1ZU5vcm1hbGl6ZXIgPyB2YWx1ZU5vcm1hbGl6ZXIocmVzdWx0KSA6IHJlc3VsdDsKKyAg
fSwKKworICByZXJlbmRlcklmTmVlZGVkOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmN1cnJlbnRT
dGF0ZS5yZXJlbmRlcklmTmVlZGVkKHRoaXMpOworICB9LAorCisgIC8qKgorICAgIERldGVybWlu
ZXMgd2hpY2ggdGVtcGxhdGUgdG8gaW52b2tlLCBzZXRzIHVwIHRoZSBjb3JyZWN0IHN0YXRlIGJh
c2VkIG9uCisgICAgdGhhdCBsb2dpYywgdGhlbiBpbnZva2VzIHRoZSBkZWZhdWx0IGBFbWJlci5W
aWV3YCBgcmVuZGVyYCBpbXBsZW1lbnRhdGlvbi4KKworICAgIFRoaXMgbWV0aG9kIHdpbGwgZmly
c3QgbG9vayB1cCB0aGUgYHBhdGhgIGtleSBvbiBgcGF0aFJvb3RgLAorICAgIHRoZW4gcGFzcyB0
aGF0IHZhbHVlIHRvIHRoZSBgc2hvdWxkRGlzcGxheUZ1bmNgIGZ1bmN0aW9uLiBJZiB0aGF0IHJl
dHVybnMKKyAgICBgdHJ1ZSxgIHRoZSBgZGlzcGxheVRlbXBsYXRlYCBmdW5jdGlvbiB3aWxsIGJl
IHJlbmRlcmVkIHRvIERPTS4gT3RoZXJ3aXNlLAorICAgIGBpbnZlcnNlVGVtcGxhdGVgLCBpZiBz
cGVjaWZpZWQsIHdpbGwgYmUgcmVuZGVyZWQuCisKKyAgICBGb3IgZXhhbXBsZSwgaWYgdGhpcyBg
RW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIHJlcHJlc2VudGVkIHRoZSBge3sjd2l0aAorICAg
IGZvb319YCBoZWxwZXIsIGl0IHdvdWxkIGxvb2sgdXAgdGhlIGBmb29gIHByb3BlcnR5IG9mIGl0
cyBjb250ZXh0LCBhbmQKKyAgICBgc2hvdWxkRGlzcGxheUZ1bmNgIHdvdWxkIGFsd2F5cyByZXR1
cm4gdHJ1ZS4gVGhlIG9iamVjdCBmb3VuZCBieSBsb29raW5nCisgICAgdXAgYGZvb2Agd291bGQg
YmUgcGFzc2VkIHRvIGBkaXNwbGF5VGVtcGxhdGVgLgorCisgICAgQG1ldGhvZCByZW5kZXIKKyAg
ICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyCisgICovCisgIHJlbmRlcjogZnVu
Y3Rpb24oYnVmZmVyKSB7CisgICAgLy8gSWYgbm90IGludm9rZWQgdmlhIGEgdHJpcGxlLW11c3Rh
Y2hlICh7e3tmb299fX0pLCBlc2NhcGUKKyAgICAvLyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxh
dGUuCisgICAgdmFyIGVzY2FwZSA9IGdldCh0aGlzLCAnaXNFc2NhcGVkJyk7CisKKyAgICB2YXIg
c2hvdWxkRGlzcGxheSA9IGdldCh0aGlzLCAnc2hvdWxkRGlzcGxheUZ1bmMnKSwKKyAgICAgICAg
cHJlc2VydmVDb250ZXh0ID0gZ2V0KHRoaXMsICdwcmVzZXJ2ZUNvbnRleHQnKSwKKyAgICAgICAg
Y29udGV4dCA9IGdldCh0aGlzLCAncHJldmlvdXNDb250ZXh0Jyk7CisKKyAgICB2YXIgaW52ZXJz
ZVRlbXBsYXRlID0gZ2V0KHRoaXMsICdpbnZlcnNlVGVtcGxhdGUnKSwKKyAgICAgICAgZGlzcGxh
eVRlbXBsYXRlID0gZ2V0KHRoaXMsICdkaXNwbGF5VGVtcGxhdGUnKTsKKworICAgIHZhciByZXN1
bHQgPSB0aGlzLm5vcm1hbGl6ZWRWYWx1ZSgpOworICAgIHRoaXMuX2xhc3ROb3JtYWxpemVkVmFs
dWUgPSByZXN1bHQ7CisKKyAgICAvLyBGaXJzdCwgdGVzdCB0aGUgY29uZGl0aW9uYWwgdG8gc2Vl
IGlmIHdlIHNob3VsZAorICAgIC8vIHJlbmRlciB0aGUgdGVtcGxhdGUgb3Igbm90LgorICAgIGlm
IChzaG91bGREaXNwbGF5KHJlc3VsdCkpIHsKKyAgICAgIHNldCh0aGlzLCAndGVtcGxhdGUnLCBk
aXNwbGF5VGVtcGxhdGUpOworCisgICAgICAvLyBJZiB3ZSBhcmUgcHJlc2VydmluZyB0aGUgY29u
dGV4dCAoZm9yIGV4YW1wbGUsIGlmIHRoaXMKKyAgICAgIC8vIGlzIGFuICNpZiBibG9jaywgY2Fs
bCB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc2FtZSBvYmplY3QuCisgICAgICBpZiAocHJlc2VydmVD
b250ZXh0KSB7CisgICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCBjb250ZXh0KTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIGRldGVybWluZSBpZiB0aGlzIGlzIGEgYmxv
Y2sgYmluZCBvciBub3QuCisgICAgICAvLyBJZiBzbywgcGFzcyB0aGUgc3BlY2lmaWVkIG9iamVj
dCB0byB0aGUgdGVtcGxhdGUKKyAgICAgICAgaWYgKGRpc3BsYXlUZW1wbGF0ZSkgeworICAgICAg
ICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAvLyBUaGlzIGlzIG5vdCBhIGJpbmQgYmxvY2ssIGp1c3QgcHVzaCB0aGUgcmVzdWx0IG9m
IHRoZQorICAgICAgICAvLyBleHByZXNzaW9uIHRvIHRoZSByZW5kZXIgY29udGV4dCBhbmQgcmV0
dXJuLgorICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmlu
ZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICIiOworICAgICAgICAgIH0gZWxzZSBpZiAoIShy
ZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcpKSB7CisgICAgICAgICAgICBy
ZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXNj
YXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQp
OyB9CisgICAgICAgICAgYnVmZmVyLnB1c2gocmVzdWx0KTsKKyAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGludmVyc2VUZW1wbGF0ZSkgeworICAg
ICAgc2V0KHRoaXMsICd0ZW1wbGF0ZScsIGludmVyc2VUZW1wbGF0ZSk7CisKKyAgICAgIGlmIChw
cmVzZXJ2ZUNvbnRleHQpIHsKKyAgICAgICAgc2V0KHRoaXMsICdfY29udGV4dCcsIGNvbnRleHQp
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0KHRoaXMsICdfY29udGV4dCcsIHJlc3VsdCk7
CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNldCh0aGlzLCAndGVtcGxhdGUnLCBmdW5j
dGlvbigpIHsgcmV0dXJuICcnOyB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fc3VwZXIo
YnVmZmVyKTsKKyAgfQorfSk7CisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKioKK0Bt
b2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwordmFy
IGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldCwgbm9ybWFsaXplUGF0aCA9IEVt
YmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aDsKK3ZhciBmb3JFYWNoID0gRW1iZXIuQXJyYXlQ
b2x5ZmlsbHMuZm9yRWFjaDsKK3ZhciBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZTsKKwordmFyIEVt
YmVySGFuZGxlYmFycyA9IEVtYmVyLkhhbmRsZWJhcnMsIGhlbHBlcnMgPSBFbWJlckhhbmRsZWJh
cnMuaGVscGVyczsKKworZnVuY3Rpb24gZXhpc3RzKHZhbHVlKSB7CisgIHJldHVybiAhRW1iZXIu
aXNOb25lKHZhbHVlKTsKK30KKworZnVuY3Rpb24gc2FuaXRpemVkSGFuZGxlYmFyc0dldChjdXJy
ZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpIHsKKyAgdmFyIHJlc3VsdCA9IGhhbmRsZWJh
cnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKTsKKyAgaWYgKHJlc3VsdCA9
PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkgeworICAgIHJlc3VsdCA9ICIiOworICB9
IGVsc2UgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgSGFuZGxlYmFycy5TYWZlU3RyaW5nKSkgewor
ICAgIHJlc3VsdCA9IFN0cmluZyhyZXN1bHQpOworICB9CisgIGlmICghb3B0aW9ucy5oYXNoLnVu
ZXNjYXBlZCl7CisgICAgcmVzdWx0ID0gSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9u
KHJlc3VsdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBCaW5kcyBhIHByb3Bl
cnR5IGludG8gdGhlIERPTS4gVGhpcyB3aWxsIGNyZWF0ZSBhIGhvb2sgaW4gRE9NIHRoYXQgdGhl
CisvLyBLVk8gc3lzdGVtIHdpbGwgbG9vayBmb3IgYW5kIHVwZGF0ZSBpZiB0aGUgcHJvcGVydHkg
Y2hhbmdlcy4KK2Z1bmN0aW9uIGJpbmQocHJvcGVydHksIG9wdGlvbnMsIHByZXNlcnZlQ29udGV4
dCwgc2hvdWxkRGlzcGxheSwgdmFsdWVOb3JtYWxpemVyLCBjaGlsZFByb3BlcnRpZXMpIHsKKyAg
dmFyIGRhdGEgPSBvcHRpb25zLmRhdGEsCisgICAgICBmbiA9IG9wdGlvbnMuZm4sCisgICAgICBp
bnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAorICAgICAgdmlldyA9IGRhdGEudmlldywKKyAgICAg
IGN1cnJlbnRDb250ZXh0ID0gdGhpcywKKyAgICAgIG5vcm1hbGl6ZWQsIG9ic2VydmVyLCBpOwor
CisgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwg
ZGF0YSk7CisKKyAgLy8gU2V0IHVwIG9ic2VydmVycyBmb3Igb2JzZXJ2YWJsZSBvYmplY3RzCisg
IGlmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHRoaXMpIHsKKyAgICBpZiAoZGF0YS5pbnNpZGVHcm91
cCkgeworICAgICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgRW1iZXIucnVuLm9u
Y2UodmlldywgJ3JlcmVuZGVyJyk7CisgICAgICB9OworCisgICAgICB2YXIgdGVtcGxhdGUsIGNv
bnRleHQsIHJlc3VsdCA9IGhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBv
cHRpb25zKTsKKworICAgICAgcmVzdWx0ID0gdmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3JtYWxp
emVyKHJlc3VsdCkgOiByZXN1bHQ7CisKKyAgICAgIGNvbnRleHQgPSBwcmVzZXJ2ZUNvbnRleHQg
PyBjdXJyZW50Q29udGV4dCA6IHJlc3VsdDsKKyAgICAgIGlmIChzaG91bGREaXNwbGF5KHJlc3Vs
dCkpIHsKKyAgICAgICAgdGVtcGxhdGUgPSBmbjsKKyAgICAgIH0gZWxzZSBpZiAoaW52ZXJzZSkg
eworICAgICAgICB0ZW1wbGF0ZSA9IGludmVyc2U7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRl
KGNvbnRleHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0pOworICAgIH0gZWxzZSB7CisgICAgICAv
LyBDcmVhdGUgdGhlIHZpZXcgdGhhdCB3aWxsIHdyYXAgdGhlIG91dHB1dCBvZiB0aGlzIHRlbXBs
YXRlL3Byb3BlcnR5CisgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBuZWFyZXN0IHZpZXcncyBj
aGlsZFZpZXdzIGFycmF5LgorICAgICAgLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEVtYmVy
Ll9IYW5kbGViYXJzQm91bmRWaWV3IGZvciBtb3JlLgorICAgICAgdmFyIGJpbmRWaWV3ID0gdmll
dy5jcmVhdGVDaGlsZFZpZXcoRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcsIHsKKyAgICAgICAg
cHJlc2VydmVDb250ZXh0OiBwcmVzZXJ2ZUNvbnRleHQsCisgICAgICAgIHNob3VsZERpc3BsYXlG
dW5jOiBzaG91bGREaXNwbGF5LAorICAgICAgICB2YWx1ZU5vcm1hbGl6ZXJGdW5jOiB2YWx1ZU5v
cm1hbGl6ZXIsCisgICAgICAgIGRpc3BsYXlUZW1wbGF0ZTogZm4sCisgICAgICAgIGludmVyc2VU
ZW1wbGF0ZTogaW52ZXJzZSwKKyAgICAgICAgcGF0aDogcHJvcGVydHksCisgICAgICAgIHBhdGhS
b290OiBjdXJyZW50Q29udGV4dCwKKyAgICAgICAgcHJldmlvdXNDb250ZXh0OiBjdXJyZW50Q29u
dGV4dCwKKyAgICAgICAgaXNFc2NhcGVkOiAhb3B0aW9ucy5oYXNoLnVuZXNjYXBlZCwKKyAgICAg
ICAgdGVtcGxhdGVEYXRhOiBvcHRpb25zLmRhdGEKKyAgICAgIH0pOworCisgICAgICB2aWV3LmFw
cGVuZENoaWxkKGJpbmRWaWV3KTsKKworICAgICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKKyAg
ICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgYmluZFZpZXcsICdyZXJlbmRl
cklmTmVlZGVkJyk7CisgICAgICB9OworICAgIH0KKworICAgIC8vIE9ic2VydmVzIHRoZSBnaXZl
biBwcm9wZXJ0eSBvbiB0aGUgY29udGV4dCBhbmQKKyAgICAvLyB0ZWxscyB0aGUgRW1iZXIuX0hh
bmRsZWJhcnNCb3VuZFZpZXcgdG8gcmUtcmVuZGVyLiBJZiBwcm9wZXJ0eQorICAgIC8vIGlzIGFu
IGVtcHR5IHN0cmluZywgd2UgYXJlIHByaW50aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAv
LyBvYmplY3QgKHt7dGhpc319KSBzbyB1cGRhdGluZyBpdCBpcyBub3Qgb3VyIHJlc3BvbnNpYmls
aXR5LgorICAgIGlmIChub3JtYWxpemVkLnBhdGggIT09ICcnKSB7CisgICAgICB2aWV3LnJlZ2lz
dGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVkLnBhdGgsIG9ic2VydmVyKTsK
KyAgICAgIGlmIChjaGlsZFByb3BlcnRpZXMpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Y2hpbGRQ
cm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVy
KG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoKycuJytjaGlsZFByb3BlcnRpZXNbaV0s
IG9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAv
LyBUaGUgb2JqZWN0IGlzIG5vdCBvYnNlcnZhYmxlLCBzbyBqdXN0IHJlbmRlciBpdCBvdXQgYW5k
CisgICAgLy8gYmUgZG9uZSB3aXRoIGl0LgorICAgIGRhdGEuYnVmZmVyLnB1c2goaGFuZGxlYmFy
c0dldChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpKTsKKyAgfQorfQorCitFbWJl
ckhhbmRsZWJhcnMuYmluZCA9IGJpbmQ7CisKK2Z1bmN0aW9uIHNpbXBsZUJpbmQoY3VycmVudENv
bnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSB7CisgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhLAor
ICAgICAgdmlldyA9IGRhdGEudmlldywKKyAgICAgIG5vcm1hbGl6ZWQsIG9ic2VydmVyLCBwYXRo
Um9vdCwgb3V0cHV0OworCisgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRDb250
ZXh0LCBwcm9wZXJ0eSwgZGF0YSk7CisgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290OworCisg
IC8vIFNldCB1cCBvYnNlcnZlcnMgZm9yIG9ic2VydmFibGUgb2JqZWN0cworICBpZiAocGF0aFJv
b3QgJiYgKCdvYmplY3QnID09PSB0eXBlb2YgcGF0aFJvb3QpKSB7CisgICAgaWYgKGRhdGEuaW5z
aWRlR3JvdXApIHsKKyAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIEVtYmVy
LnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRlcicpOworICAgICAgfTsKKworICAgICAgb3V0cHV0ID0g
c2FuaXRpemVkSGFuZGxlYmFyc0dldChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMp
OworCisgICAgICBkYXRhLmJ1ZmZlci5wdXNoKG91dHB1dCk7CisgICAgfSBlbHNlIHsKKyAgICAg
IHZhciBiaW5kVmlldyA9IG5ldyBFbWJlci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXcoCisgICAgICAg
IHByb3BlcnR5LCBjdXJyZW50Q29udGV4dCwgIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQsIG9wdGlv
bnMuZGF0YQorICAgICAgKTsKKworICAgICAgYmluZFZpZXcuX3BhcmVudFZpZXcgPSB2aWV3Owor
ICAgICAgdmlldy5hcHBlbmRDaGlsZChiaW5kVmlldyk7CisKKyAgICAgIG9ic2VydmVyID0gZnVu
Y3Rpb24oKSB7CisgICAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIGJpbmRW
aWV3LCAncmVyZW5kZXInKTsKKyAgICAgIH07CisgICAgfQorCisgICAgLy8gT2JzZXJ2ZXMgdGhl
IGdpdmVuIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IGFuZAorICAgIC8vIHRlbGxzIHRoZSBFbWJl
ci5fSGFuZGxlYmFyc0JvdW5kVmlldyB0byByZS1yZW5kZXIuIElmIHByb3BlcnR5CisgICAgLy8g
aXMgYW4gZW1wdHkgc3RyaW5nLCB3ZSBhcmUgcHJpbnRpbmcgdGhlIGN1cnJlbnQgY29udGV4dAor
ICAgIC8vIG9iamVjdCAoe3t0aGlzfX0pIHNvIHVwZGF0aW5nIGl0IGlzIG5vdCBvdXIgcmVzcG9u
c2liaWxpdHkuCisgICAgaWYgKG5vcm1hbGl6ZWQucGF0aCAhPT0gJycpIHsKKyAgICAgIHZpZXcu
cmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCwgb2JzZXJ2
ZXIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgb2JqZWN0IGlzIG5vdCBvYnNlcnZh
YmxlLCBzbyBqdXN0IHJlbmRlciBpdCBvdXQgYW5kCisgICAgLy8gYmUgZG9uZSB3aXRoIGl0Lgor
ICAgIG91dHB1dCA9IHNhbml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3Bl
cnR5LCBvcHRpb25zKTsKKworICAgIGRhdGEuYnVmZmVyLnB1c2gob3V0cHV0KTsKKyAgfQorfQor
CisvKioKKyAgJ190cmlhZ2VNdXN0YWNoZScgaXMgdXNlZCBpbnRlcm5hbGx5IHNlbGVjdCBiZXR3
ZWVuIGEgYmluZGluZywgaGVscGVyLCBvciBjb21wb25lbnQgZm9yCisgIHRoZSBnaXZlbiBjb250
ZXh0LiBVbnRpbCB0aGlzIHBvaW50LCBpdCB3b3VsZCBiZSBoYXJkIHRvIGRldGVybWluZSBpZiB0
aGUKKyAgbXVzdGFjaGUgaXMgYSBwcm9wZXJ0eSByZWZlcmVuY2Ugb3IgYSByZWd1bGFyIGhlbHBl
ciByZWZlcmVuY2UuIFRoaXMgdHJpYWdlCisgIGhlbHBlciByZXNvbHZlcyB0aGF0LgorCisgIFRo
aXMgd291bGQgbm90IGJlIHR5cGljYWxseSBpbnZva2VkIGJ5IGRpcmVjdGx5LgorCisgIEBwcml2
YXRlCisgIEBtZXRob2QgX3RyaWFnZU11c3RhY2hlCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eS9oZWxwZXJJRCB0byB0
cmlhZ2UKKyAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgaGFzaCBvZiB0ZW1wbGF0ZS9yZW5kZXJp
bmcgb3B0aW9ucworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisqLworRW1iZXJIYW5k
bGViYXJzLnJlZ2lzdGVySGVscGVyKCdfdHJpYWdlTXVzdGFjaGUnLCBmdW5jdGlvbihwcm9wZXJ0
eSwgb3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRoYW4g
b25lIGFyZ3VtZW50IHRvIHRoZSBfdHJpYWdlTXVzdGFjaGUgaGVscGVyIiwgYXJndW1lbnRzLmxl
bmd0aCA8PSAyKTsKKworICBpZiAoaGVscGVyc1twcm9wZXJ0eV0pIHsKKyAgICByZXR1cm4gaGVs
cGVyc1twcm9wZXJ0eV0uY2FsbCh0aGlzLCBvcHRpb25zKTsKKyAgfQorCisgIHZhciBoZWxwZXIg
PSBFbWJlci5IYW5kbGViYXJzLnJlc29sdmVIZWxwZXIob3B0aW9ucy5kYXRhLnZpZXcuY29udGFp
bmVyLCBwcm9wZXJ0eSk7CisgIGlmIChoZWxwZXIpIHsKKyAgICByZXR1cm4gaGVscGVyLmNhbGwo
dGhpcywgb3B0aW9ucyk7CisgIH0KKworICByZXR1cm4gaGVscGVycy5iaW5kLmNhbGwodGhpcywg
cHJvcGVydHksIG9wdGlvbnMpOworfSk7CisKK0VtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhlbHBl
ciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgbmFtZSkgeworCisgIGlmICghY29udGFpbmVyIHx8IG5h
bWUuaW5kZXhPZignLScpID09PSAtMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBoZWxw
ZXIgPSBjb250YWluZXIubG9va3VwKCdoZWxwZXI6JyArIG5hbWUpOworICBpZiAoIWhlbHBlcikg
eworICAgIHZhciBjb21wb25lbnRMb29rdXAgPSBjb250YWluZXIubG9va3VwKCdjb21wb25lbnQt
bG9va3VwOm1haW4nKTsKKyAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kICdjb21wb25l
bnQtbG9va3VwOm1haW4nIG9uIHRoZSBwcm92aWRlZCBjb250YWluZXIsIHdoaWNoIGlzIG5lY2Vz
c2FyeSBmb3IgcGVyZm9ybWluZyBjb21wb25lbnQgbG9va3VwcyIsIGNvbXBvbmVudExvb2t1cCk7
CisKKyAgICB2YXIgQ29tcG9uZW50ID0gY29tcG9uZW50TG9va3VwLmxvb2t1cEZhY3RvcnkobmFt
ZSwgY29udGFpbmVyKTsKKyAgICBpZiAoQ29tcG9uZW50KSB7CisgICAgICBoZWxwZXIgPSBFbWJl
ckhhbmRsZWJhcnMubWFrZVZpZXdIZWxwZXIoQ29tcG9uZW50KTsKKyAgICAgIGNvbnRhaW5lci5y
ZWdpc3RlcignaGVscGVyOicgKyBuYW1lLCBoZWxwZXIpOworICAgIH0KKyAgfQorICByZXR1cm4g
aGVscGVyOworfTsKKworLyoqCisgIGBiaW5kYCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGEgdmFs
dWUsIHRoZW4gdXBkYXRlIHRoYXQgdmFsdWUgaWYgaXQKKyAgY2hhbmdlcy4gRm9yIGV4YW1wbGUs
IGlmIHlvdSB3YW50ZWQgdG8gcHJpbnQgdGhlIGB0aXRsZWAgcHJvcGVydHkgb2YKKyAgYGNvbnRl
bnRgOgorCisgIGBgYGhhbmRsZWJhcnMKKyAge3tiaW5kICJjb250ZW50LnRpdGxlIn19CisgIGBg
YAorCisgIFRoaXMgd2lsbCByZXR1cm4gdGhlIGB0aXRsZWAgcHJvcGVydHkgYXMgYSBzdHJpbmcs
IHRoZW4gY3JlYXRlIGEgbmV3IG9ic2VydmVyCisgIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gSWYg
aXQgY2hhbmdlcywgaXQgd2lsbCB1cGRhdGUgdGhlIHZhbHVlIGluIERPTS4gTm90ZQorICB0aGF0
IGlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgSUU3IGFuZCBJRTggeW91IG11c3QgbW9kaWZ5IHRoZSBt
b2RlbCBvYmplY3RzCisgIHByb3BlcnRpZXMgdXNpbmcgYEVtYmVyLmdldCgpYCBhbmQgYEVtYmVy
LnNldCgpYCBmb3IgdGhpcyB0byB3b3JrIGFzIGl0CisgIHJlbGllcyBvbiBFbWJlcidzIEtWTyBz
eXN0ZW0uIEZvciBhbGwgb3RoZXIgYnJvd3NlcnMgdGhpcyB3aWxsIGJlIGhhbmRsZWQgZm9yCisg
IHlvdSBhdXRvbWF0aWNhbGx5LgorCisgIEBwcml2YXRlCisgIEBtZXRob2QgYmluZAorICBAZm9y
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJv
cGVydHkgdG8gYmluZAorICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3ZpZGUg
Zm9yIHJlbmRlcmluZworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisqLworRW1iZXJI
YW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdiaW5kJywgZnVuY3Rpb24gYmluZEhlbHBlcihwcm9w
ZXJ0eSwgb3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRo
YW4gb25lIGFyZ3VtZW50IHRvIHRoZSBiaW5kIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPD0g
Mik7CisKKyAgdmFyIGNvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0cyAmJiBvcHRpb25zLmNvbnRl
eHRzLmxlbmd0aCkgPyBvcHRpb25zLmNvbnRleHRzWzBdIDogdGhpczsKKworICBpZiAoIW9wdGlv
bnMuZm4pIHsKKyAgICByZXR1cm4gc2ltcGxlQmluZChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9u
cyk7CisgIH0KKworICByZXR1cm4gYmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBvcHRpb25z
LCBmYWxzZSwgZXhpc3RzKTsKK30pOworCisvKioKKyAgVXNlIHRoZSBgYm91bmRJZmAgaGVscGVy
IHRvIGNyZWF0ZSBhIGNvbmRpdGlvbmFsIHRoYXQgcmUtZXZhbHVhdGVzCisgIHdoZW5ldmVyIHRo
ZSB0cnV0aGluZXNzIG9mIHRoZSBib3VuZCB2YWx1ZSBjaGFuZ2VzLgorCisgIGBgYGhhbmRsZWJh
cnMKKyAge3sjYm91bmRJZiAiY29udGVudC5zaG91bGREaXNwbGF5VGl0bGUifX0KKyAgICB7e2Nv
bnRlbnQudGl0bGV9fQorICB7ey9ib3VuZElmfX0KKyAgYGBgCisKKyAgQHByaXZhdGUKKyAgQG1l
dGhvZCBib3VuZElmCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7
U3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBiaW5kCisgIEBwYXJhbSB7RnVuY3Rpb259IGZu
IENvbnRleHQgdG8gcHJvdmlkZSBmb3IgcmVuZGVyaW5nCisgIEByZXR1cm4ge1N0cmluZ30gSFRN
TCBzdHJpbmcKKyovCitFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2JvdW5kSWYnLCBm
dW5jdGlvbiBib3VuZElmSGVscGVyKHByb3BlcnR5LCBmbikgeworICB2YXIgY29udGV4dCA9IChm
bi5jb250ZXh0cyAmJiBmbi5jb250ZXh0cy5sZW5ndGgpID8gZm4uY29udGV4dHNbMF0gOiB0aGlz
OworICB2YXIgZnVuYyA9IGZ1bmN0aW9uKHJlc3VsdCkgeworICAgIHZhciB0cnV0aHkgPSByZXN1
bHQgJiYgZ2V0KHJlc3VsdCwgJ2lzVHJ1dGh5Jyk7CisgICAgaWYgKHR5cGVvZiB0cnV0aHkgPT09
ICdib29sZWFuJykgeyByZXR1cm4gdHJ1dGh5OyB9CisKKyAgICBpZiAoRW1iZXIuaXNBcnJheShy
ZXN1bHQpKSB7CisgICAgICByZXR1cm4gZ2V0KHJlc3VsdCwgJ2xlbmd0aCcpICE9PSAwOworICAg
IH0gZWxzZSB7CisgICAgICByZXR1cm4gISFyZXN1bHQ7CisgICAgfQorICB9OworCisgIHJldHVy
biBiaW5kLmNhbGwoY29udGV4dCwgcHJvcGVydHksIGZuLCB0cnVlLCBmdW5jLCBmdW5jLCBbJ2lz
VHJ1dGh5JywgJ2xlbmd0aCddKTsKK30pOworCisvKioKKyAgVXNlIHRoZSBge3t3aXRofX1gIGhl
bHBlciB3aGVuIHlvdSB3YW50IHRvIHNjb3BlIGNvbnRleHQuIFRha2UgdGhlIGZvbGxvd2luZyBj
b2RlIGFzIGFuIGV4YW1wbGU6CisKKyAgYGBgaGFuZGxlYmFycworICA8aDU+e3t1c2VyLm5hbWV9
fTwvaDU+CisKKyAgPGRpdiBjbGFzcz0icm9sZSI+CisgICAgPGg2Pnt7dXNlci5yb2xlLmxhYmVs
fX08L2g2PgorICAgIDxzcGFuIGNsYXNzPSJyb2xlLWlkIj57e3VzZXIucm9sZS5pZH19PC9zcGFu
PgorCisgICAgPHAgY2xhc3M9InJvbGUtZGVzYyI+e3t1c2VyLnJvbGUuZGVzY3JpcHRpb259fTwv
cD4KKyAgPC9kaXY+CisgIGBgYAorCisgIGB7e3dpdGh9fWAgY2FuIGJlIG91ciBiZXN0IGZyaWVu
ZCBpbiB0aGVzZSBjYXNlcywgCisgIGluc3RlYWQgb2Ygd3JpdGluZyBgdXNlci5yb2xlLipgIG92
ZXIgYW5kIG92ZXIsIHdlIHVzZSBge3sjd2l0aCB1c2VyLnJvbGV9fWAuCisgIE5vdyB0aGUgY29u
dGV4dCB3aXRoaW4gdGhlIGB7eyN3aXRofX0gLi4ge3svd2l0aH19YCBibG9jayBpcyBgdXNlci5y
b2xlYCBzbyB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgYGBgaGFuZGxlYmFycworICA8
aDU+e3t1c2VyLm5hbWV9fTwvaDU+CisKKyAgPGRpdiBjbGFzcz0icm9sZSI+CisgICAge3sjd2l0
aCB1c2VyLnJvbGV9fQorICAgICAgPGg2Pnt7bGFiZWx9fTwvaDY+CisgICAgICA8c3BhbiBjbGFz
cz0icm9sZS1pZCI+e3tpZH19PC9zcGFuPgorCisgICAgICA8cCBjbGFzcz0icm9sZS1kZXNjIj57
e2Rlc2NyaXB0aW9ufX08L3A+CisgICAge3svd2l0aH19CisgIDwvZGl2PgorICBgYGAKKworICAj
IyMgYGFzYCBvcGVyYXRvcgorCisgIFRoaXMgb3BlcmF0b3IgYWxpYXNlcyB0aGUgc2NvcGUgdG8g
YSBuZXcgbmFtZS4gSXQncyBoZWxwZnVsIGZvciBzZW1hbnRpYyBjbGFyaXR5IGFuZCB0byByZXRh
aW4gCisgIGRlZmF1bHQgc2NvcGUgb3IgdG8gcmVmZXJlbmNlIGZyb20gYW5vdGhlciBge3t3aXRo
fX1gIGJsb2NrLgorCisgIGBgYGhhbmRsZWJhcnMKKyAgLy8gcG9zdHMgbWlnaHQgbm90IGJlCisg
IHt7I3dpdGggdXNlci5wb3N0cyBhcyBibG9nUG9zdHN9fQorICAgIDxkaXYgY2xhc3M9Im5vdGlj
ZSI+CisgICAgICBUaGVyZSBhcmUge3tibG9nUG9zdHMubGVuZ3RofX0gYmxvZyBwb3N0cyB3cml0
dGVuIGJ5IHt7dXNlci5uYW1lfX0uCisgICAgPC9kaXY+CisKKyAgICB7eyNlYWNoIHBvc3QgaW4g
YmxvZ1Bvc3RzfX0KKyAgICAgIDxsaT57e3Bvc3QudGl0bGV9fTwvbGk+CisgICAge3svZWFjaH19
CisgIHt7L3dpdGh9fQorICBgYGAKKworICBXaXRob3V0IHRoZSBgYXNgIG9wZXJhdG9yLCBpdCB3
b3VsZCBiZSBpbXBvc3NpYmxlIHRvIHJlZmVyZW5jZSBgdXNlci5uYW1lYCBpbiB0aGUgZXhhbXBs
ZSBhYm92ZS4KKworICBAbWV0aG9kIHdpdGgKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBl
cnMKKyAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAorICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMK
KyAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZworKi8KK0VtYmVySGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uIHdpdGhIZWxwZXIoY29udGV4dCwgb3B0aW9ucykg
eworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkgeworICAgIHZhciBrZXl3b3JkTmFtZSwg
cGF0aCwgcm9vdFBhdGgsIG5vcm1hbGl6ZWQsIGNvbnRleHRQYXRoOworCisgICAgRW1iZXIuYXNz
ZXJ0KCJJZiB5b3UgcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSB3aXRoIGhlbHBl
ciwgaXQgbXVzdCBiZSBpbiB0aGUgZm9ybSAjd2l0aCBmb28gYXMgYmFyIiwgYXJndW1lbnRzWzFd
ID09PSAiYXMiKTsKKyAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOworICAgIGtleXdvcmROYW1l
ID0gYXJndW1lbnRzWzJdOworICAgIHBhdGggPSBhcmd1bWVudHNbMF07CisKKyAgICBFbWJlci5h
c3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0aGUgd2l0aCBoZWxwZXIiLCBvcHRpb25z
LmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CisKKyAgICB2YXIgbG9j
YWxpemVkT3B0aW9ucyA9IG9fY3JlYXRlKG9wdGlvbnMpOworICAgIGxvY2FsaXplZE9wdGlvbnMu
ZGF0YSA9IG9fY3JlYXRlKG9wdGlvbnMuZGF0YSk7CisgICAgbG9jYWxpemVkT3B0aW9ucy5kYXRh
LmtleXdvcmRzID0gb19jcmVhdGUob3B0aW9ucy5kYXRhLmtleXdvcmRzIHx8IHt9KTsKKworICAg
IGlmIChFbWJlci5pc0dsb2JhbFBhdGgocGF0aCkpIHsKKyAgICAgIGNvbnRleHRQYXRoID0gcGF0
aDsKKyAgICB9IGVsc2UgeworICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgodGhpcywg
cGF0aCwgb3B0aW9ucy5kYXRhKTsKKyAgICAgIHBhdGggPSBub3JtYWxpemVkLnBhdGg7CisgICAg
ICByb290UGF0aCA9IG5vcm1hbGl6ZWQucm9vdDsKKworICAgICAgLy8gVGhpcyBpcyBhIHdvcmth
cm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgeW91IGNhbm5vdCBiaW5kIHNlcGFyYXRlIG9iamVjdHMK
KyAgICAgIC8vIHRvZ2V0aGVyLiBXaGVuIHdlIGltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHks
IHdlIHNob3VsZCB1c2UgaXQgaGVyZS4KKyAgICAgIHZhciBjb250ZXh0S2V5ID0gRW1iZXIuJC5l
eHBhbmRvICsgRW1iZXIuZ3VpZEZvcihyb290UGF0aCk7CisgICAgICBsb2NhbGl6ZWRPcHRpb25z
LmRhdGEua2V5d29yZHNbY29udGV4dEtleV0gPSByb290UGF0aDsKKyAgICAgIC8vIGlmIHRoZSBw
YXRoIGlzICcnICgidGhpcyIpLCBqdXN0IGJpbmQgZGlyZWN0bHkgdG8gdGhlIGN1cnJlbnQgY29u
dGV4dAorICAgICAgY29udGV4dFBhdGggPSBwYXRoID8gY29udGV4dEtleSArICcuJyArIHBhdGgg
OiBjb250ZXh0S2V5OworICAgIH0KKworICAgIEVtYmVyLmJpbmQobG9jYWxpemVkT3B0aW9ucy5k
YXRhLmtleXdvcmRzLCBrZXl3b3JkTmFtZSwgY29udGV4dFBhdGgpOworCisgICAgcmV0dXJuIGJp
bmQuY2FsbCh0aGlzLCBwYXRoLCBsb2NhbGl6ZWRPcHRpb25zLCB0cnVlLCBleGlzdHMpOworICB9
IGVsc2UgeworICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBleGFjdGx5IG9uZSBhcmd1
bWVudCB0byB0aGUgd2l0aCBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKKyAgICBF
bWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0aGUgd2l0aCBoZWxwZXIiLCBv
cHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CisgICAgcmV0
dXJuIGhlbHBlcnMuYmluZC5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0sIGNvbnRleHQsIG9wdGlv
bnMpOworICB9Cit9KTsKKworCisvKioKKyAgU2VlIFtib3VuZElmXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2JvdW5kSWYpCisKKyAgQG1ldGhvZCBp
ZgorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFyYW0ge0Z1bmN0aW9ufSBj
b250ZXh0CisgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwg
c3RyaW5nCisqLworRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9u
IGlmSGVscGVyKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBw
YXNzIGV4YWN0bHkgb25lIGFyZ3VtZW50IHRvIHRoZSBpZiBoZWxwZXIiLCBhcmd1bWVudHMubGVu
Z3RoID09PSAyKTsKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhl
IGlmIGhlbHBlciIsIG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gSGFuZGxlYmFycy5WTS5u
b29wKTsKKworICByZXR1cm4gaGVscGVycy5ib3VuZElmLmNhbGwob3B0aW9ucy5jb250ZXh0c1sw
XSwgY29udGV4dCwgb3B0aW9ucyk7Cit9KTsKKworLyoqCisgIEBtZXRob2QgdW5sZXNzCisgIEBm
b3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7RnVuY3Rpb259IGNvbnRleHQK
KyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcK
KyovCitFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uIHVu
bGVzc0hlbHBlcihjb250ZXh0LCBvcHRpb25zKSB7CisgIEVtYmVyLmFzc2VydCgiWW91IG11c3Qg
cGFzcyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUgdW5sZXNzIGhlbHBlciIsIGFyZ3VtZW50
cy5sZW5ndGggPT09IDIpOworICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0
byB0aGUgdW5sZXNzIGhlbHBlciIsIG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gSGFuZGxl
YmFycy5WTS5ub29wKTsKKworICB2YXIgZm4gPSBvcHRpb25zLmZuLCBpbnZlcnNlID0gb3B0aW9u
cy5pbnZlcnNlOworCisgIG9wdGlvbnMuZm4gPSBpbnZlcnNlOworICBvcHRpb25zLmludmVyc2Ug
PSBmbjsKKworICByZXR1cm4gaGVscGVycy5ib3VuZElmLmNhbGwob3B0aW9ucy5jb250ZXh0c1sw
XSwgY29udGV4dCwgb3B0aW9ucyk7Cit9KTsKKworLyoqCisgIGBiaW5kLWF0dHJgIGFsbG93cyB5
b3UgdG8gY3JlYXRlIGEgYmluZGluZyBiZXR3ZWVuIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMgYW5k
CisgIEVtYmVyIG9iamVjdHMuIEZvciBleGFtcGxlOgorCisgIGBgYGhhbmRsZWJhcnMKKyAgPGlt
ZyB7e2JpbmQtYXR0ciBzcmM9ImltYWdlVXJsIiBhbHQ9ImltYWdlVGl0bGUifX0+CisgIGBgYAor
CisgIFRoZSBhYm92ZSBoYW5kbGViYXJzIHRlbXBsYXRlIHdpbGwgZmlsbCB0aGUgYDxpbWc+YCdz
IGBzcmNgIGF0dHJpYnV0ZSB3aWxsCisgIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgcmVmZXJl
bmNlZCB3aXRoIGAiaW1hZ2VVcmwiYCBhbmQgaXRzIGBhbHRgCisgIGF0dHJpYnV0ZSB3aXRoIHRo
ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgcmVmZXJlbmNlZCB3aXRoIGAiaW1hZ2VUaXRsZSJgLgor
CisgIElmIHRoZSByZW5kZXJpbmcgY29udGV4dCBvZiB0aGlzIHRlbXBsYXRlIGlzIHRoZSBmb2xs
b3dpbmcgb2JqZWN0OgorCisgIGBgYGphdmFzY3JpcHQKKyAgeworICAgIGltYWdlVXJsOiAnaHR0
cDovL2xvbGNhdHMuaW5mby9oYXotYS1mdW5ueScsCisgICAgaW1hZ2VUaXRsZTogJ0EgaHVtb3Jv
dXMgaW1hZ2Ugb2YgYSBjYXQnCisgIH0KKyAgYGBgCisKKyAgVGhlIHJlc3VsdGluZyBIVE1MIG91
dHB1dCB3aWxsIGJlOgorCisgIGBgYGh0bWwKKyAgPGltZyBzcmM9Imh0dHA6Ly9sb2xjYXRzLmlu
Zm8vaGF6LWEtZnVubnkiIGFsdD0iQSBodW1vcm91cyBpbWFnZSBvZiBhIGNhdCI+CisgIGBgYAor
CisgIGBiaW5kLWF0dHJgIGNhbm5vdCByZWRlY2xhcmUgZXhpc3RpbmcgRE9NIGVsZW1lbnQgYXR0
cmlidXRlcy4gVGhlIHVzZSBvZiBgc3JjYAorICBpbiB0aGUgZm9sbG93aW5nIGBiaW5kLWF0dHJg
IGV4YW1wbGUgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgaGFyZCBjb2RlZCB2YWx1ZQorICBvZiBg
c3JjPSIvZmFpbHdoYWxlLmdpZiJgIHdpbGwgdGFrZSBwcmVjZWRlbmNlOgorCisgIGBgYGhhbmRs
ZWJhcnMKKyAgPGltZyBzcmM9Ii9mYWlsd2hhbGUuZ2lmIiB7e2JpbmQtYXR0ciBzcmM9ImltYWdl
VXJsIiBhbHQ9ImltYWdlVGl0bGUifX0+CisgIGBgYAorCisgICMjIyBgYmluZC1hdHRyYCBhbmQg
dGhlIGBjbGFzc2AgYXR0cmlidXRlCisKKyAgYGJpbmQtYXR0cmAgc3VwcG9ydHMgYSBzcGVjaWFs
IHN5bnRheCBmb3IgaGFuZGxpbmcgYSBudW1iZXIgb2YgY2FzZXMgdW5pcXVlCisgIHRvIHRoZSBg
Y2xhc3NgIERPTSBlbGVtZW50IGF0dHJpYnV0ZS4gVGhlIGBjbGFzc2AgYXR0cmlidXRlIGNvbWJp
bmVzCisgIG11bHRpcGxlIGRpc2NyZXRlIHZhbHVlcyBpbnRvIGEgc2luZ2xlIGF0dHJpYnV0ZSBh
cyBhIHNwYWNlLWRlbGltaXRlZAorICBsaXN0IG9mIHN0cmluZ3MuIEVhY2ggc3RyaW5nIGNhbiBi
ZToKKworICAqIGEgc3RyaW5nIHJldHVybiB2YWx1ZSBvZiBhbiBvYmplY3QncyBwcm9wZXJ0eS4K
KyAgKiBhIGJvb2xlYW4gcmV0dXJuIHZhbHVlIG9mIGFuIG9iamVjdCdzIHByb3BlcnR5CisgICog
YSBoYXJkLWNvZGVkIHZhbHVlCisKKyAgQSBzdHJpbmcgcmV0dXJuIHZhbHVlIHdvcmtzIGlkZW50
aWNhbGx5IHRvIG90aGVyIHVzZXMgb2YgYGJpbmQtYXR0cmAuIFRoZQorICByZXR1cm4gdmFsdWUg
b2YgdGhlIHByb3BlcnR5IHdpbGwgYmVjb21lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBG
b3IKKyAgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB2aWV3IGFuZCB0ZW1wbGF0ZToKKworICBgYGBq
YXZhc2NyaXB0CisgICAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBzb21lUHJv
cGVydHk6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gImFWYWx1ZSI7CisgICAgICB9LnBy
b3BlcnR5KCkKKyAgICB9KQorICBgYGAKKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3tiaW5k
LWF0dHIgY2xhc3M9InZpZXcuc29tZVByb3BlcnR5fX0+CisgIGBgYAorCisgIFJlc3VsdCBpbiB0
aGUgZm9sbG93aW5nIHJlbmRlcmVkIG91dHB1dDoKKworICBgYGBodG1sCisgIDxpbWcgY2xhc3M9
ImFWYWx1ZSI+CisgIGBgYAorCisgIEEgYm9vbGVhbiByZXR1cm4gdmFsdWUgd2lsbCBpbnNlcnQg
YSBzcGVjaWZpZWQgY2xhc3MgbmFtZSBpZiB0aGUgcHJvcGVydHkKKyAgcmV0dXJucyBgdHJ1ZWAg
YW5kIHJlbW92ZSB0aGUgY2xhc3MgbmFtZSBpZiB0aGUgcHJvcGVydHkgcmV0dXJucyBgZmFsc2Vg
LgorCisgIEEgY2xhc3MgbmFtZSBpcyBwcm92aWRlZCB2aWEgdGhlIHN5bnRheAorICBgc29tZVBy
b3BlcnR5TmFtZTpjbGFzcy1uYW1lLWlmLXRydWVgLgorCisgIGBgYGphdmFzY3JpcHQKKyAgQVZp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgc29tZUJvb2w6IHRydWUKKyAgfSkKKyAgYGBg
CisKKyAgYGBgaGFuZGxlYmFycworICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSJ2aWV3LnNvbWVC
b29sOmNsYXNzLW5hbWUtaWYtdHJ1ZSJ9fT4KKyAgYGBgCisKKyAgUmVzdWx0IGluIHRoZSBmb2xs
b3dpbmcgcmVuZGVyZWQgb3V0cHV0OgorCisgIGBgYGh0bWwKKyAgPGltZyBjbGFzcz0iY2xhc3Mt
bmFtZS1pZi10cnVlIj4KKyAgYGBgCisKKyAgQW4gYWRkaXRpb25hbCBzZWN0aW9uIG9mIHRoZSBi
aW5kaW5nIGNhbiBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0bworICByZXBsYWNlIHRoZSBleGlz
dGluZyBjbGFzcyBpbnN0ZWFkIG9mIHJlbW92aW5nIGl0IHdoZW4gdGhlIGJvb2xlYW4KKyAgdmFs
dWUgY2hhbmdlczoKKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3tiaW5kLWF0dHIgY2xhc3M9
InZpZXcuc29tZUJvb2w6Y2xhc3MtbmFtZS1pZi10cnVlOmNsYXNzLW5hbWUtaWYtZmFsc2UifX0+
CisgIGBgYAorCisgIEEgaGFyZC1jb2RlZCB2YWx1ZSBjYW4gYmUgdXNlZCBieSBwcmVwZW5kaW5n
IGA6YCB0byB0aGUgZGVzaXJlZAorICBjbGFzcyBuYW1lOiBgOmNsYXNzLW5hbWUtdG8tYWx3YXlz
LWFwcGx5YC4KKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3tiaW5kLWF0dHIgY2xhc3M9Ijpj
bGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseSJ9fT4KKyAgYGBgCisKKyAgUmVzdWx0cyBpbiB0aGUg
Zm9sbG93aW5nIHJlbmRlcmVkIG91dHB1dDoKKworICBgYGBodG1sCisgIDxpbWcgY2xhc3M9ImNs
YXNzLW5hbWUtdG8tYWx3YXlzLWFwcGx5Ij4KKyAgYGBgCisKKyAgQWxsIHRocmVlIHN0cmF0ZWdp
ZXMgLSBzdHJpbmcgcmV0dXJuIHZhbHVlLCBib29sZWFuIHJldHVybiB2YWx1ZSwgYW5kCisgIGhh
cmQtY29kZWQgdmFsdWUg4oCTIGNhbiBiZSBjb21iaW5lZCBpbiBhIHNpbmdsZSBkZWNsYXJhdGlv
bjoKKworICBgYGBoYW5kbGViYXJzCisgIDxpbWcge3tiaW5kLWF0dHIgY2xhc3M9IjpjbGFzcy1u
YW1lLXRvLWFsd2F5cy1hcHBseSB2aWV3LnNvbWVCb29sOmNsYXNzLW5hbWUtaWYtdHJ1ZSB2aWV3
LnNvbWVQcm9wZXJ0eSJ9fT4KKyAgYGBgCisKKyAgQG1ldGhvZCBiaW5kLWF0dHIKKyAgQGZvciBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgIEByZXR1
cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKKyovCitFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxw
ZXIoJ2JpbmQtYXR0cicsIGZ1bmN0aW9uIGJpbmRBdHRySGVscGVyKG9wdGlvbnMpIHsKKworICB2
YXIgYXR0cnMgPSBvcHRpb25zLmhhc2g7CisKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBzcGVj
aWZ5IGF0IGxlYXN0IG9uZSBoYXNoIGFyZ3VtZW50IHRvIGJpbmQtYXR0ciIsICEhRW1iZXIua2V5
cyhhdHRycykubGVuZ3RoKTsKKworICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OworICB2
YXIgcmV0ID0gW107CisgIHZhciBjdHggPSB0aGlzOworCisgIC8vIEdlbmVyYXRlIGEgdW5pcXVl
IGlkIGZvciB0aGlzIGVsZW1lbnQuIFRoaXMgd2lsbCBiZSBhZGRlZCBhcyBhCisgIC8vIGRhdGEg
YXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHNvIGl0IGNhbiBiZSBsb29rZWQgdXAgd2hlbgorICAv
LyB0aGUgYm91bmQgcHJvcGVydHkgY2hhbmdlcy4KKyAgdmFyIGRhdGFJZCA9ICsrRW1iZXIudXVp
ZDsKKworICAvLyBIYW5kbGUgY2xhc3NlcyBkaWZmZXJlbnRseSwgYXMgd2UgY2FuIGJpbmQgbXVs
dGlwbGUgY2xhc3NlcworICB2YXIgY2xhc3NCaW5kaW5ncyA9IGF0dHJzWydjbGFzcyddOworICBp
ZiAoY2xhc3NCaW5kaW5ncyAhPSBudWxsKSB7CisgICAgdmFyIGNsYXNzUmVzdWx0cyA9IEVtYmVy
SGFuZGxlYmFycy5iaW5kQ2xhc3Nlcyh0aGlzLCBjbGFzc0JpbmRpbmdzLCB2aWV3LCBkYXRhSWQs
IG9wdGlvbnMpOworCisgICAgcmV0LnB1c2goJ2NsYXNzPSInICsgSGFuZGxlYmFycy5VdGlscy5l
c2NhcGVFeHByZXNzaW9uKGNsYXNzUmVzdWx0cy5qb2luKCcgJykpICsgJyInKTsKKyAgICBkZWxl
dGUgYXR0cnNbJ2NsYXNzJ107CisgIH0KKworICB2YXIgYXR0cktleXMgPSBFbWJlci5rZXlzKGF0
dHJzKTsKKworICAvLyBGb3IgZWFjaCBhdHRyaWJ1dGUgcGFzc2VkLCBjcmVhdGUgYW4gb2JzZXJ2
ZXIgYW5kIGVtaXQgdGhlCisgIC8vIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGFu
IGF0dHJpYnV0ZS4KKyAgZm9yRWFjaC5jYWxsKGF0dHJLZXlzLCBmdW5jdGlvbihhdHRyKSB7Cisg
ICAgdmFyIHBhdGggPSBhdHRyc1thdHRyXSwKKyAgICAgICAgbm9ybWFsaXplZDsKKworICAgIEVt
YmVyLmFzc2VydChmbXQoIllvdSBtdXN0IHByb3ZpZGUgYW4gZXhwcmVzc2lvbiBhcyB0aGUgdmFs
dWUgb2YgYm91bmQgYXR0cmlidXRlLiBZb3Ugc3BlY2lmaWVkOiAlQD0lQCIsIFthdHRyLCBwYXRo
XSksIHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJyk7CisKKyAgICBub3JtYWxpemVkID0gbm9ybWFs
aXplUGF0aChjdHgsIHBhdGgsIG9wdGlvbnMuZGF0YSk7CisKKyAgICB2YXIgdmFsdWUgPSAocGF0
aCA9PT0gJ3RoaXMnKSA/IG5vcm1hbGl6ZWQucm9vdCA6IGhhbmRsZWJhcnNHZXQoY3R4LCBwYXRo
LCBvcHRpb25zKSwKKyAgICAgICAgdHlwZSA9IEVtYmVyLnR5cGVPZih2YWx1ZSk7CisKKyAgICBF
bWJlci5hc3NlcnQoZm10KCJBdHRyaWJ1dGVzIG11c3QgYmUgbnVtYmVycywgc3RyaW5ncyBvciBi
b29sZWFucywgbm90ICVAIiwgW3ZhbHVlXSksIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1
bmRlZmluZWQgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlw
ZSA9PT0gJ2Jvb2xlYW4nKTsKKworICAgIHZhciBvYnNlcnZlciwgaW52b2tlcjsKKworICAgIG9i
c2VydmVyID0gZnVuY3Rpb24gb2JzZXJ2ZXIoKSB7CisgICAgICB2YXIgcmVzdWx0ID0gaGFuZGxl
YmFyc0dldChjdHgsIHBhdGgsIG9wdGlvbnMpOworCisgICAgICBFbWJlci5hc3NlcnQoZm10KCJB
dHRyaWJ1dGVzIG11c3QgYmUgbnVtYmVycywgc3RyaW5ncyBvciBib29sZWFucywgbm90ICVAIiwg
W3Jlc3VsdF0pLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQg
PT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyB8fAorICAgICAgICAg
ICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJlc3VsdCA9
PT0gJ2Jvb2xlYW4nKTsKKworICAgICAgdmFyIGVsZW0gPSB2aWV3LiQoIltkYXRhLWJpbmRhdHRy
LSIgKyBkYXRhSWQgKyAiPSciICsgZGF0YUlkICsgIiddIik7CisKKyAgICAgIC8vIElmIHdlIGFy
ZW4ndCBhYmxlIHRvIGZpbmQgdGhlIGVsZW1lbnQsIGl0IG1lYW5zIHRoZSBlbGVtZW50CisgICAg
ICAvLyB0byB3aGljaCB3ZSB3ZXJlIGJvdW5kIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmll
dy4KKyAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgY2FuIGFzc3VtZSB0aGUgdGVtcGxhdGUgaGFz
IGJlZW4gcmUtcmVuZGVyZWQKKyAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBv
YnNlcnZlci4KKyAgICAgIGlmICghZWxlbSB8fCBlbGVtLmxlbmd0aCA9PT0gMCkgeworICAgICAg
ICBFbWJlci5yZW1vdmVPYnNlcnZlcihub3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCwg
aW52b2tlcik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgRW1iZXIuVmlldy5h
cHBseUF0dHJpYnV0ZUJpbmRpbmdzKGVsZW0sIGF0dHIsIHJlc3VsdCk7CisgICAgfTsKKworICAg
IC8vIEFkZCBhbiBvYnNlcnZlciB0byB0aGUgdmlldyBmb3Igd2hlbiB0aGUgcHJvcGVydHkgY2hh
bmdlcy4KKyAgICAvLyBXaGVuIHRoZSBvYnNlcnZlciBmaXJlcywgZmluZCB0aGUgZWxlbWVudCB1
c2luZyB0aGUKKyAgICAvLyB1bmlxdWUgZGF0YSBpZCBhbmQgdXBkYXRlIHRoZSBhdHRyaWJ1dGUg
dG8gdGhlIG5ldyB2YWx1ZS4KKyAgICAvLyBOb3RlOiBkb24ndCBhZGQgb2JzZXJ2ZXIgd2hlbiBw
YXRoIGlzICd0aGlzJyBvciBwYXRoCisgICAgLy8gaXMgd2hvbGUga2V5d29yZCBlLmcuIHt7I2Vh
Y2ggeCBpbiBsaXN0fX0gLi4uIHt7YmluZC1hdHRyIGF0dHI9IngifX0KKyAgICBpZiAocGF0aCAh
PT0gJ3RoaXMnICYmICEobm9ybWFsaXplZC5pc0tleXdvcmQgJiYgbm9ybWFsaXplZC5wYXRoID09
PSAnJyApKSB7CisgICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBu
b3JtYWxpemVkLnBhdGgsIG9ic2VydmVyKTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGlzIGNoYW5n
ZXMsIGFsc28gY2hhbmdlIHRoZSBsb2dpYyBpbiBlbWJlci12aWV3cy9saWIvdmlld3Mvdmlldy5q
cworICAgIGlmICgodHlwZSA9PT0gJ3N0cmluZycgfHwgKHR5cGUgPT09ICdudW1iZXInICYmICFp
c05hTih2YWx1ZSkpKSkgeworICAgICAgcmV0LnB1c2goYXR0ciArICc9IicgKyBIYW5kbGViYXJz
LlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odmFsdWUpICsgJyInKTsKKyAgICB9IGVsc2UgaWYgKHZh
bHVlICYmIHR5cGUgPT09ICdib29sZWFuJykgeworICAgICAgLy8gVGhlIGRldmVsb3BlciBjb250
cm9scyB0aGUgYXR0ciBuYW1lLCBzbyBpdCBzaG91bGQgYWx3YXlzIGJlIHNhZmUKKyAgICAgIHJl
dC5wdXNoKGF0dHIgKyAnPSInICsgYXR0ciArICciJyk7CisgICAgfQorICB9LCB0aGlzKTsKKwor
ICAvLyBBZGQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyCisgIC8vIE5PVEU6IFdlIHVzZSBhbGwgbG93
ZXItY2FzZSBzaW5jZSBGaXJlZm94IGhhcyBwcm9ibGVtcyB3aXRoIG1peGVkIGNhc2UgaW4gU1ZH
CisgIHJldC5wdXNoKCdkYXRhLWJpbmRhdHRyLScgKyBkYXRhSWQgKyAnPSInICsgZGF0YUlkICsg
JyInKTsKKyAgcmV0dXJuIG5ldyBFbWJlckhhbmRsZWJhcnMuU2FmZVN0cmluZyhyZXQuam9pbign
ICcpKTsKK30pOworCisvKioKKyAgU2VlIGBiaW5kLWF0dHJgCisKKyAgQG1ldGhvZCBiaW5kQXR0
cgorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAZGVwcmVjYXRlZAorICBAcGFy
YW0ge0Z1bmN0aW9ufSBjb250ZXh0CisgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICBAcmV0dXJu
IHtTdHJpbmd9IEhUTUwgc3RyaW5nCisqLworRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdiaW5kQXR0cicsIGZ1bmN0aW9uIGJpbmRBdHRySGVscGVyKCkgeworICBFbWJlci53YXJuKCJU
aGUgJ2JpbmRBdHRyJyB2aWV3IGhlbHBlciBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mICdiaW5k
LWF0dHInIik7CisgIHJldHVybiBFbWJlckhhbmRsZWJhcnMuaGVscGVyc1snYmluZC1hdHRyJ10u
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30pOworCisvKioKKyAgSGVscGVyIHRoYXQsIGdpdmVu
IGEgc3BhY2Utc2VwYXJhdGVkIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBhbmQgYSBjb250ZXh0
LAorICByZXR1cm5zIGFuIGFycmF5IG9mIGNsYXNzIG5hbWVzLiBDYWxsaW5nIHRoaXMgbWV0aG9k
IGFsc28gaGFzIHRoZSBzaWRlCisgIGVmZmVjdCBvZiBzZXR0aW5nIHVwIG9ic2VydmVycyBhdCB0
aG9zZSBwcm9wZXJ0eSBwYXRocywgc3VjaCB0aGF0IGlmIHRoZXkKKyAgY2hhbmdlLCB0aGUgY29y
cmVjdCBjbGFzcyBuYW1lIHdpbGwgYmUgcmVhcHBsaWVkIHRvIHRoZSBET00gZWxlbWVudC4KKwor
ICBGb3IgZXhhbXBsZSwgaWYgeW91IHBhc3MgdGhlIHN0cmluZyAiZm9vQmFyIiwgaXQgd2lsbCBm
aXJzdCBsb29rIHVwIHRoZQorICAiZm9vQmFyIiB2YWx1ZSBvZiB0aGUgY29udGV4dC4gSWYgdGhh
dCB2YWx1ZSBpcyB0cnVlLCBpdCB3aWxsIGFkZCB0aGUKKyAgImZvby1iYXIiIGNsYXNzIHRvIHRo
ZSBjdXJyZW50IGVsZW1lbnQgKGkuZS4sIHRoZSBkYXNoZXJpemVkIGZvcm0gb2YKKyAgImZvb0Jh
ciIpLiBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYWRkIHRoYXQgc3RyaW5nIGFz
IHRoZSBjbGFzcy4KKyAgT3RoZXJ3aXNlLCBpdCB3aWxsIG5vdCBhZGQgYW55IG5ldyBjbGFzcyBu
YW1lLgorCisgIEBwcml2YXRlCisgIEBtZXRob2QgYmluZENsYXNzZXMKKyAgQGZvciBFbWJlci5I
YW5kbGViYXJzCisgIEBwYXJhbSB7RW1iZXIuT2JqZWN0fSBjb250ZXh0IFRoZSBjb250ZXh0IGZy
b20gd2hpY2ggdG8gbG9va3VwIHByb3BlcnRpZXMKKyAgQHBhcmFtIHtTdHJpbmd9IGNsYXNzQmlu
ZGluZ3MgQSBzdHJpbmcsIHNwYWNlLXNlcGFyYXRlZCwgb2YgY2xhc3MgYmluZGluZ3MKKyAgICB0
byB1c2UKKyAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3IFRoZSB2aWV3IGluIHdoaWNoIG9ic2Vy
dmVycyBzaG91bGQgbG9vayBmb3IgdGhlCisgICAgZWxlbWVudCB0byB1cGRhdGUKKyAgQHBhcmFt
IHtTcnRpbmd9IGJpbmRBdHRySWQgT3B0aW9uYWwgYmluZEF0dHIgaWQgdXNlZCB0byBsb29rdXAg
ZWxlbWVudHMKKyAgQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGNsYXNzIG5hbWVzIHRvIGFk
ZAorKi8KK0VtYmVySGFuZGxlYmFycy5iaW5kQ2xhc3NlcyA9IGZ1bmN0aW9uKGNvbnRleHQsIGNs
YXNzQmluZGluZ3MsIHZpZXcsIGJpbmRBdHRySWQsIG9wdGlvbnMpIHsKKyAgdmFyIHJldCA9IFtd
LCBuZXdDbGFzcywgdmFsdWUsIGVsZW07CisKKyAgLy8gSGVscGVyIG1ldGhvZCB0byByZXRyaWV2
ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgY29udGV4dCBhbmQKKyAgLy8gZGV0ZXJtaW5lIHdoaWNo
IGNsYXNzIHN0cmluZyB0byByZXR1cm4sIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMKKyAgLy8gYSBC
b29sZWFuIG9yIG5vdC4KKyAgdmFyIGNsYXNzU3RyaW5nRm9yUGF0aCA9IGZ1bmN0aW9uKHJvb3Qs
IHBhcnNlZFBhdGgsIG9wdGlvbnMpIHsKKyAgICB2YXIgdmFsLAorICAgICAgICBwYXRoID0gcGFy
c2VkUGF0aC5wYXRoOworCisgICAgaWYgKHBhdGggPT09ICd0aGlzJykgeworICAgICAgdmFsID0g
cm9vdDsKKyAgICB9IGVsc2UgaWYgKHBhdGggPT09ICcnKSB7CisgICAgICB2YWwgPSB0cnVlOwor
ICAgIH0gZWxzZSB7CisgICAgICB2YWwgPSBoYW5kbGViYXJzR2V0KHJvb3QsIHBhdGgsIG9wdGlv
bnMpOworICAgIH0KKworICAgIHJldHVybiBFbWJlci5WaWV3Ll9jbGFzc1N0cmluZ0ZvclZhbHVl
KHBhdGgsIHZhbCwgcGFyc2VkUGF0aC5jbGFzc05hbWUsIHBhcnNlZFBhdGguZmFsc3lDbGFzc05h
bWUpOworICB9OworCisgIC8vIEZvciBlYWNoIHByb3BlcnR5IHBhc3NlZCwgbG9vcCB0aHJvdWdo
IGFuZCBzZXR1cAorICAvLyBhbiBvYnNlcnZlci4KKyAgZm9yRWFjaC5jYWxsKGNsYXNzQmluZGlu
Z3Muc3BsaXQoJyAnKSwgZnVuY3Rpb24oYmluZGluZykgeworCisgICAgLy8gVmFyaWFibGUgaW4g
d2hpY2ggdGhlIG9sZCBjbGFzcyB2YWx1ZSBpcyBzYXZlZC4gVGhlIG9ic2VydmVyIGZ1bmN0aW9u
CisgICAgLy8gY2xvc2VzIG92ZXIgdGhpcyB2YXJpYWJsZSwgc28gaXQga25vd3Mgd2hpY2ggc3Ry
aW5nIHRvIHJlbW92ZSB3aGVuCisgICAgLy8gdGhlIHByb3BlcnR5IGNoYW5nZXMuCisgICAgdmFy
IG9sZENsYXNzOworCisgICAgdmFyIG9ic2VydmVyLCBpbnZva2VyOworCisgICAgdmFyIHBhcnNl
ZFBhdGggPSBFbWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0aChiaW5kaW5nKSwKKyAgICAgICAg
cGF0aCA9IHBhcnNlZFBhdGgucGF0aCwKKyAgICAgICAgcGF0aFJvb3QgPSBjb250ZXh0LAorICAg
ICAgICBub3JtYWxpemVkOworCisgICAgaWYgKHBhdGggIT09ICcnICYmIHBhdGggIT09ICd0aGlz
JykgeworICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgoY29udGV4dCwgcGF0aCwgb3B0
aW9ucy5kYXRhKTsKKworICAgICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3Q7CisgICAgICBw
YXRoID0gbm9ybWFsaXplZC5wYXRoOworICAgIH0KKworICAgIC8vIFNldCB1cCBhbiBvYnNlcnZl
ciBvbiB0aGUgY29udGV4dC4gSWYgdGhlIHByb3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUKKyAg
ICAvLyBjbGFzcyBuYW1lLgorICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7CisgICAgICAvLyBH
ZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICBuZXdDbGFzcyA9IGNs
YXNzU3RyaW5nRm9yUGF0aChjb250ZXh0LCBwYXJzZWRQYXRoLCBvcHRpb25zKTsKKyAgICAgIGVs
ZW0gPSBiaW5kQXR0cklkID8gdmlldy4kKCJbZGF0YS1iaW5kYXR0ci0iICsgYmluZEF0dHJJZCAr
ICI9JyIgKyBiaW5kQXR0cklkICsgIiddIikgOiB2aWV3LiQoKTsKKworICAgICAgLy8gSWYgd2Ug
Y2FuJ3QgZmluZCB0aGUgZWxlbWVudCBhbnltb3JlLCBhIHBhcmVudCB0ZW1wbGF0ZSBoYXMgYmVl
bgorICAgICAgLy8gcmUtcmVuZGVyZWQgYW5kIHdlJ3ZlIGJlZW4gbnVrZWQuIFJlbW92ZSB0aGUg
b2JzZXJ2ZXIuCisgICAgICBpZiAoIWVsZW0gfHwgZWxlbS5sZW5ndGggPT09IDApIHsKKyAgICAg
ICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIocGF0aFJvb3QsIHBhdGgsIGludm9rZXIpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgLy8gSWYgd2UgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBjbGFzcyB0
byB0aGUgZWxlbWVudCwgcmVtb3ZlIGl0LgorICAgICAgICBpZiAob2xkQ2xhc3MpIHsKKyAgICAg
ICAgICBlbGVtLnJlbW92ZUNsYXNzKG9sZENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IElmIG5lY2Vzc2FyeSwgYWRkIGEgbmV3IGNsYXNzLiBNYWtlIHN1cmUgd2Uga2VlcCB0cmFjayBv
ZiBpdCBzbworICAgICAgICAvLyBpdCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICAg
ICAgICBpZiAobmV3Q2xhc3MpIHsKKyAgICAgICAgICBlbGVtLmFkZENsYXNzKG5ld0NsYXNzKTsK
KyAgICAgICAgICBvbGRDbGFzcyA9IG5ld0NsYXNzOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIG9sZENsYXNzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBp
ZiAocGF0aCAhPT0gJycgJiYgcGF0aCAhPT0gJ3RoaXMnKSB7CisgICAgICB2aWV3LnJlZ2lzdGVy
T2JzZXJ2ZXIocGF0aFJvb3QsIHBhdGgsIG9ic2VydmVyKTsKKyAgICB9CisKKyAgICAvLyBXZSd2
ZSBhbHJlYWR5IHNldHVwIHRoZSBvYnNlcnZlcjsgbm93IHdlIGp1c3QgbmVlZCB0byBmaWd1cmUg
b3V0IHRoZQorICAgIC8vIGNvcnJlY3QgYmVoYXZpb3IgcmlnaHQgbm93IG9uIHRoZSBmaXJzdCBw
YXNzIHRocm91Z2guCisgICAgdmFsdWUgPSBjbGFzc1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFy
c2VkUGF0aCwgb3B0aW9ucyk7CisKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIHJldC5wdXNoKHZh
bHVlKTsKKworICAgICAgLy8gTWFrZSBzdXJlIHdlIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgc28g
dGhhdCBpdCBjYW4gYmUgcmVtb3ZlZCBpZiB0aGUKKyAgICAgIC8vIG9ic2VydmVyIGZpcmVzLgor
ICAgICAgb2xkQ2xhc3MgPSB2YWx1ZTsKKyAgICB9CisgIH0pOworCisgIHJldHVybiByZXQ7Cit9
OworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvKmdsb2JhbHMgSGFuZGxlYmFycyAq
LworCisvLyBUT0RPOiBEb24ndCByZXF1aXJlIHRoZSBlbnRpcmUgbW9kdWxlCisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KKwordmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwordmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVyLkhh
bmRsZWJhcnM7Cit2YXIgTE9XRVJDQVNFX0FfWiA9IC9eW2Etel0vOwordmFyIFZJRVdfUFJFRklY
ID0gL152aWV3XC4vOworCitmdW5jdGlvbiBtYWtlQmluZGluZ3ModGhpc0NvbnRleHQsIG9wdGlv
bnMpIHsKKyAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsCisgICAgICBoYXNoVHlwZSA9IG9wdGlv
bnMuaGFzaFR5cGVzOworCisgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgIGlmIChoYXNo
VHlwZVtwcm9wXSA9PT0gJ0lEJykgeworCisgICAgICB2YXIgdmFsdWUgPSBoYXNoW3Byb3BdOwor
CisgICAgICBpZiAoRW1iZXIuSVNfQklORElORy50ZXN0KHByb3ApKSB7CisgICAgICAgIEVtYmVy
Lndhcm4oIllvdSdyZSBhdHRlbXB0aW5nIHRvIHJlbmRlciBhIHZpZXcgYnkgcGFzc2luZyAiICsg
cHJvcCArICI9IiArIHZhbHVlICsgIiB0byBhIHZpZXcgaGVscGVyLCBidXQgdGhpcyBzeW50YXgg
aXMgYW1iaWd1b3VzLiBZb3Ugc2hvdWxkIGVpdGhlciBzdXJyb3VuZCAiICsgdmFsdWUgKyAiIGlu
IHF1b3RlcyBvciByZW1vdmUgYEJpbmRpbmdgIGZyb20gIiArIHByb3AgKyAiLiIpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgaGFzaFtwcm9wICsgJ0JpbmRpbmcnXSA9IHZhbHVlOworICAgICAg
ICBoYXNoVHlwZVtwcm9wICsgJ0JpbmRpbmcnXSA9ICdTVFJJTkcnOworICAgICAgICBkZWxldGUg
aGFzaFtwcm9wXTsKKyAgICAgICAgZGVsZXRlIGhhc2hUeXBlW3Byb3BdOworICAgICAgfQorICAg
IH0KKyAgfQorCisgIGlmIChoYXNoLmhhc093blByb3BlcnR5KCdpZEJpbmRpbmcnKSkgeworICAg
IC8vIGlkIGNhbid0IGJlIGJvdW5kLCBzbyBqdXN0IHBlcmZvcm0gb25lLXRpbWUgbG9va3VwLgor
ICAgIGhhc2guaWQgPSBFbWJlckhhbmRsZWJhcnMuZ2V0KHRoaXNDb250ZXh0LCBoYXNoLmlkQmlu
ZGluZywgb3B0aW9ucyk7CisgICAgaGFzaFR5cGUuaWQgPSAnU1RSSU5HJzsKKyAgICBkZWxldGUg
aGFzaC5pZEJpbmRpbmc7CisgICAgZGVsZXRlIGhhc2hUeXBlLmlkQmluZGluZzsKKyAgfQorfQor
CitFbWJlckhhbmRsZWJhcnMuVmlld0hlbHBlciA9IEVtYmVyLk9iamVjdC5jcmVhdGUoeworCisg
IHByb3BlcnRpZXNGcm9tSFRNTE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICB2YXIg
aGFzaCA9IG9wdGlvbnMuaGFzaCwgZGF0YSA9IG9wdGlvbnMuZGF0YTsKKyAgICB2YXIgZXh0ZW5z
aW9ucyA9IHt9LAorICAgICAgICBjbGFzc2VzID0gaGFzaFsnY2xhc3MnXSwKKyAgICAgICAgZHVw
ID0gZmFsc2U7CisKKyAgICBpZiAoaGFzaC5pZCkgeworICAgICAgZXh0ZW5zaW9ucy5lbGVtZW50
SWQgPSBoYXNoLmlkOworICAgICAgZHVwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaGFzaC50
YWcpIHsKKyAgICAgIGV4dGVuc2lvbnMudGFnTmFtZSA9IGhhc2gudGFnOworICAgICAgZHVwID0g
dHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NlcykgeworICAgICAgY2xhc3NlcyA9IGNsYXNz
ZXMuc3BsaXQoJyAnKTsKKyAgICAgIGV4dGVuc2lvbnMuY2xhc3NOYW1lcyA9IGNsYXNzZXM7Cisg
ICAgICBkdXAgPSB0cnVlOworICAgIH0KKworICAgIGlmIChoYXNoLmNsYXNzQmluZGluZykgewor
ICAgICAgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGhhc2guY2xhc3NCaW5kaW5nLnNw
bGl0KCcgJyk7CisgICAgICBkdXAgPSB0cnVlOworICAgIH0KKworICAgIGlmIChoYXNoLmNsYXNz
TmFtZUJpbmRpbmdzKSB7CisgICAgICBpZiAoZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9
PT0gdW5kZWZpbmVkKSBleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzID0gW107CisgICAgICBl
eHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzID0gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5n
cy5jb25jYXQoaGFzaC5jbGFzc05hbWVCaW5kaW5ncy5zcGxpdCgnICcpKTsKKyAgICAgIGR1cCA9
IHRydWU7CisgICAgfQorCisgICAgaWYgKGhhc2guYXR0cmlidXRlQmluZGluZ3MpIHsKKyAgICAg
IEVtYmVyLmFzc2VydCgiU2V0dGluZyAnYXR0cmlidXRlQmluZGluZ3MnIHZpYSBIYW5kbGViYXJz
IGlzIG5vdCBhbGxvd2VkLiBQbGVhc2Ugc3ViY2xhc3MgRW1iZXIuVmlldyBhbmQgc2V0IGl0IHRo
ZXJlIGluc3RlYWQuIik7CisgICAgICBleHRlbnNpb25zLmF0dHJpYnV0ZUJpbmRpbmdzID0gbnVs
bDsKKyAgICAgIGR1cCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGR1cCkgeworICAgICAgaGFz
aCA9IEVtYmVyLiQuZXh0ZW5kKHt9LCBoYXNoKTsKKyAgICAgIGRlbGV0ZSBoYXNoLmlkOworICAg
ICAgZGVsZXRlIGhhc2gudGFnOworICAgICAgZGVsZXRlIGhhc2hbJ2NsYXNzJ107CisgICAgICBk
ZWxldGUgaGFzaC5jbGFzc0JpbmRpbmc7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBwcm9wZXIg
Y29udGV4dCBmb3IgYWxsIGJpbmRpbmdzIHBhc3NlZCB0byB0aGUgaGVscGVyLiBUaGlzIGFwcGxp
ZXMgdG8gcmVndWxhciBhdHRyaWJ1dGUgYmluZGluZ3MKKyAgICAvLyBhcyB3ZWxsIGFzIGNsYXNz
IG5hbWUgYmluZGluZ3MuIElmIHRoZSBiaW5kaW5ncyBhcmUgbG9jYWwsIG1ha2UgdGhlbSByZWxh
dGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0CisgICAgLy8gaW5zdGVhZCBvZiB0aGUgdmlldy4K
KyAgICB2YXIgcGF0aDsKKworICAgIC8vIEV2YWx1YXRlIHRoZSBjb250ZXh0IG9mIHJlZ3VsYXIg
YXR0cmlidXRlIGJpbmRpbmdzOgorICAgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgICAg
aWYgKCFoYXNoLmhhc093blByb3BlcnR5KHByb3ApKSB7IGNvbnRpbnVlOyB9CisKKyAgICAgIC8v
IFRlc3QgaWYgdGhlIHByb3BlcnR5IGVuZHMgaW4gIkJpbmRpbmciCisgICAgICBpZiAoRW1iZXIu
SVNfQklORElORy50ZXN0KHByb3ApICYmIHR5cGVvZiBoYXNoW3Byb3BdID09PSAnc3RyaW5nJykg
eworICAgICAgICBwYXRoID0gdGhpcy5jb250ZXh0dWFsaXplQmluZGluZ1BhdGgoaGFzaFtwcm9w
XSwgZGF0YSk7CisgICAgICAgIGlmIChwYXRoKSB7IGhhc2hbcHJvcF0gPSBwYXRoOyB9CisgICAg
ICB9CisgICAgfQorCisgICAgLy8gRXZhbHVhdGUgdGhlIGNvbnRleHQgb2YgY2xhc3MgbmFtZSBi
aW5kaW5nczoKKyAgICBpZiAoZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncykgeworICAgICAg
Zm9yICh2YXIgYiBpbiBleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzKSB7CisgICAgICAgIHZh
ciBmdWxsID0gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXTsKKyAgICAgICAgaWYgKHR5
cGVvZiBmdWxsID09PSAnc3RyaW5nJykgeworICAgICAgICAgIC8vIENvbnRleHR1YWxpemUgdGhl
IHBhdGggb2YgY2xhc3NOYW1lQmluZGluZyBzbyB0aGlzOgorICAgICAgICAgIC8vCisgICAgICAg
ICAgLy8gICAgIGNsYXNzTmFtZUJpbmRpbmc9ImlzR3JlZW46Z3JlZW4iCisgICAgICAgICAgLy8K
KyAgICAgICAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gdGhpczoKKyAgICAgICAgICAvLworICAgICAg
ICAgIC8vICAgICBjbGFzc05hbWVCaW5kaW5nPSJfcGFyZW50Vmlldy5jb250ZXh0LmlzR3JlZW46
Z3JlZW4iCisgICAgICAgICAgdmFyIHBhcnNlZFBhdGggPSBFbWJlci5WaWV3Ll9wYXJzZVByb3Bl
cnR5UGF0aChmdWxsKTsKKyAgICAgICAgICBwYXRoID0gdGhpcy5jb250ZXh0dWFsaXplQmluZGlu
Z1BhdGgocGFyc2VkUGF0aC5wYXRoLCBkYXRhKTsKKyAgICAgICAgICBpZiAocGF0aCkgeyBleHRl
bnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzW2JdID0gcGF0aCArIHBhcnNlZFBhdGguY2xhc3NOYW1l
czsgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVtYmVyLiQuZXh0
ZW5kKGhhc2gsIGV4dGVuc2lvbnMpOworICB9LAorCisgIC8vIFRyYW5zZm9ybSBiaW5kaW5ncyBm
cm9tIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYSBjb250ZXh0IHRoYXQgY2FuIGJlIGV2YWx1YXRl
ZCB3aXRoaW4gdGhlIHZpZXcuCisgIC8vIFJldHVybnMgbnVsbCBpZiB0aGUgcGF0aCBzaG91bGRu
J3QgYmUgY2hhbmdlZC4KKyAgLy8KKyAgLy8gVE9ETzogY29uc2lkZXIgdGhlIGFkZGl0aW9uIG9m
IGEgcHJlZml4IHRoYXQgd291bGQgYWxsb3cgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGBwYXRoYC4K
KyAgY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoOiBmdW5jdGlvbihwYXRoLCBkYXRhKSB7CisgICAg
dmFyIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgobnVsbCwgcGF0
aCwgZGF0YSk7CisgICAgaWYgKG5vcm1hbGl6ZWQuaXNLZXl3b3JkKSB7CisgICAgICByZXR1cm4g
J3RlbXBsYXRlRGF0YS5rZXl3b3Jkcy4nICsgcGF0aDsKKyAgICB9IGVsc2UgaWYgKEVtYmVyLmlz
R2xvYmFsUGF0aChwYXRoKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIGlmIChw
YXRoID09PSAndGhpcycgfHwgcGF0aCA9PT0gJycpIHsKKyAgICAgIHJldHVybiAnX3BhcmVudFZp
ZXcuY29udGV4dCc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAnX3BhcmVudFZpZXcuY29u
dGV4dC4nICsgcGF0aDsKKyAgICB9CisgIH0sCisKKyAgaGVscGVyOiBmdW5jdGlvbih0aGlzQ29u
dGV4dCwgcGF0aCwgb3B0aW9ucykgeworICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhLAorICAg
ICAgICBmbiA9IG9wdGlvbnMuZm4sCisgICAgICAgIG5ld1ZpZXc7CisKKyAgICBtYWtlQmluZGlu
Z3ModGhpc0NvbnRleHQsIG9wdGlvbnMpOworCisgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Yg
cGF0aCkgeworCisgICAgICAvLyBUT0RPOiB0aGlzIGlzIGEgbGFtZSBjb25kaXRpb25hbCwgdGhp
cyBzaG91bGQgbGlrZWx5IGNoYW5nZQorICAgICAgLy8gYnV0IHNvbWV0aGluZyBhbG9uZyB0aGVz
ZSBsaW5lcyB3aWxsIGxpa2VseSBuZWVkIHRvIGJlIGFkZGVkCisgICAgICAvLyBhcyBkZXByZWNh
dGlvbiB3YXJuaW5ncworICAgICAgLy8KKyAgICAgIGlmIChvcHRpb25zLnR5cGVzWzBdID09PSAn
U1RSSU5HJyAmJiBMT1dFUkNBU0VfQV9aLnRlc3QocGF0aCkgJiYgIVZJRVdfUFJFRklYLnRlc3Qo
cGF0aCkpIHsKKyAgICAgICAgRW1iZXIuYXNzZXJ0KCJWaWV3IHJlcXVpcmVzIGEgY29udGFpbmVy
IiwgISFkYXRhLnZpZXcuY29udGFpbmVyKTsKKyAgICAgICAgbmV3VmlldyA9IGRhdGEudmlldy5j
b250YWluZXIubG9va3VwRmFjdG9yeSgndmlldzonICsgcGF0aCk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBuZXdWaWV3ID0gRW1iZXJIYW5kbGViYXJzLmdldCh0aGlzQ29udGV4dCwgcGF0aCwg
b3B0aW9ucyk7CisgICAgICB9CisKKyAgICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQg
dmlldyBhdCBwYXRoICciICsgcGF0aCArICInIiwgISFuZXdWaWV3KTsKKyAgICB9IGVsc2Ugewor
ICAgICAgbmV3VmlldyA9IHBhdGg7CisgICAgfQorCisgICAgRW1iZXIuYXNzZXJ0KEVtYmVyLlN0
cmluZy5mbXQoJ1lvdSBtdXN0IHBhc3MgYSB2aWV3IHRvIHRoZSAjdmlldyBoZWxwZXIsIG5vdCAl
QCAoJUApJywgW3BhdGgsIG5ld1ZpZXddKSwgRW1iZXIuVmlldy5kZXRlY3QobmV3VmlldykgfHwg
RW1iZXIuVmlldy5kZXRlY3RJbnN0YW5jZShuZXdWaWV3KSk7CisKKyAgICB2YXIgdmlld09wdGlv
bnMgPSB0aGlzLnByb3BlcnRpZXNGcm9tSFRNTE9wdGlvbnMob3B0aW9ucywgdGhpc0NvbnRleHQp
OworICAgIHZhciBjdXJyZW50VmlldyA9IGRhdGEudmlldzsKKyAgICB2aWV3T3B0aW9ucy50ZW1w
bGF0ZURhdGEgPSBkYXRhOworICAgIHZhciBuZXdWaWV3UHJvdG8gPSBuZXdWaWV3LnByb3RvID8g
bmV3Vmlldy5wcm90bygpIDogbmV3VmlldzsKKworICAgIGlmIChmbikgeworICAgICAgRW1iZXIu
YXNzZXJ0KCJZb3UgY2Fubm90IHByb3ZpZGUgYSB0ZW1wbGF0ZSBibG9jayBpZiB5b3UgYWxzbyBz
cGVjaWZpZWQgYSB0ZW1wbGF0ZU5hbWUiLCAhZ2V0KHZpZXdPcHRpb25zLCAndGVtcGxhdGVOYW1l
JykgJiYgIWdldChuZXdWaWV3UHJvdG8sICd0ZW1wbGF0ZU5hbWUnKSk7CisgICAgICB2aWV3T3B0
aW9ucy50ZW1wbGF0ZSA9IGZuOworICAgIH0KKworICAgIC8vIFdlIG9ubHkgd2FudCB0byBvdmVy
cmlkZSB0aGUgYF9jb250ZXh0YCBjb21wdXRlZCBwcm9wZXJ0eSBpZiB0aGVyZSBpcworICAgIC8v
IG5vIHNwZWNpZmllZCBjb250cm9sbGVyLiBTZWUgVmlldyNfY29udGV4dCBmb3IgbW9yZSBpbmZv
cm1hdGlvbi4KKyAgICBpZiAoIW5ld1ZpZXdQcm90by5jb250cm9sbGVyICYmICFuZXdWaWV3UHJv
dG8uY29udHJvbGxlckJpbmRpbmcgJiYgIXZpZXdPcHRpb25zLmNvbnRyb2xsZXIgJiYgIXZpZXdP
cHRpb25zLmNvbnRyb2xsZXJCaW5kaW5nKSB7CisgICAgICB2aWV3T3B0aW9ucy5fY29udGV4dCA9
IHRoaXNDb250ZXh0OworICAgIH0KKworICAgIGN1cnJlbnRWaWV3LmFwcGVuZENoaWxkKG5ld1Zp
ZXcsIHZpZXdPcHRpb25zKTsKKyAgfQorfSk7CisKKy8qKgorICBge3t2aWV3fX1gIGluc2VydHMg
YSBuZXcgaW5zdGFuY2Ugb2YgYEVtYmVyLlZpZXdgIGludG8gYSB0ZW1wbGF0ZSBwYXNzaW5nIGl0
cworICBvcHRpb25zIHRvIHRoZSBgRW1iZXIuVmlld2AncyBgY3JlYXRlYCBtZXRob2QgYW5kIHVz
aW5nIHRoZSBzdXBwbGllZCBibG9jayBhcworICB0aGUgdmlldydzIG93biB0ZW1wbGF0ZS4KKwor
ICBBbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKworICBgYGBo
YW5kbGViYXJzCisgIEEgc3BhbjoKKyAge3sjdmlldyB0YWdOYW1lPSJzcGFuIn19CisgICAgaGVs
bG8uCisgIHt7L3ZpZXd9fQorICBgYGAKKworICBXaWxsIHJlc3VsdCBpbiBIVE1MIHN0cnVjdHVy
ZToKKworICBgYGBodG1sCisgIDxib2R5PgorICAgIDwhLS0gTm90ZTogdGhlIGhhbmRsZWJhcnMg
dGVtcGxhdGUgc2NyaXB0CisgICAgICAgICBhbHNvIHJlc3VsdHMgaW4gYSByZW5kZXJlZCBFbWJl
ci5WaWV3CisgICAgICAgICB3aGljaCBpcyB0aGUgb3V0ZXIgPGRpdj4gaGVyZSAtLT4KKworICAg
IDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgQSBzcGFuOgorICAgICAgPHNwYW4gaWQ9
ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgICBIZWxsby4KKyAgICAgIDwvc3Bh
bj4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorICBgYGAKKworICAjIyMgYHBhcmVudFZpZXdgIHNl
dHRpbmcKKworICBUaGUgYHBhcmVudFZpZXdgIHByb3BlcnR5IG9mIHRoZSBuZXcgYEVtYmVyLlZp
ZXdgIGluc3RhbmNlIGNyZWF0ZWQgdGhyb3VnaAorICBge3t2aWV3fX1gIHdpbGwgYmUgc2V0IHRv
IHRoZSBgRW1iZXIuVmlld2AgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHdoZXJlCisgIGB7e3Zp
ZXd9fWAgd2FzIGNhbGxlZC4KKworICBgYGBqYXZhc2NyaXB0CisgIGFWaWV3ID0gRW1iZXIuVmll
dy5jcmVhdGUoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInt7I3Zp
ZXd9fSBteSBwYXJlbnQ6IHt7cGFyZW50Vmlldy5lbGVtZW50SWR9fSB7ey92aWV3fX0iKQorICB9
KTsKKworICBhVmlldy5hcHBlbmRUbygnYm9keScpOworICBgYGAKKworICBXaWxsIHJlc3VsdCBp
biBIVE1MIHN0cnVjdHVyZToKKworICBgYGBodG1sCisgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9
ImVtYmVyLXZpZXciPgorICAgIDxkaXYgaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXciPgor
ICAgICAgbXkgcGFyZW50OiBlbWJlcjEKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisg
ICMjIyBTZXR0aW5nIENTUyBpZCBhbmQgY2xhc3MgYXR0cmlidXRlcworCisgIFRoZSBIVE1MIGBp
ZGAgYXR0cmlidXRlIGNhbiBiZSBzZXQgb24gdGhlIGB7e3ZpZXd9fWAncyByZXN1bHRpbmcgZWxl
bWVudCB3aXRoCisgIHRoZSBgaWRgIG9wdGlvbi4gVGhpcyBvcHRpb24gd2lsbCBfbm90XyBiZSBw
YXNzZWQgdG8gYEVtYmVyLlZpZXcuY3JlYXRlYC4KKworICBgYGBoYW5kbGViYXJzCisgIHt7I3Zp
ZXcgdGFnTmFtZT0ic3BhbiIgaWQ9ImEtY3VzdG9tLWlkIn19CisgICAgaGVsbG8uCisgIHt7L3Zp
ZXd9fQorICBgYGAKKworICBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmU6
CisKKyAgYGBgaHRtbAorICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8c3BhbiBpZD0i
YS1jdXN0b20taWQiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICAgIGhlbGxvLgorICAgIDwvc3Bh
bj4KKyAgPC9kaXY+CisgIGBgYAorCisgIFRoZSBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIGNhbiBi
ZSBzZXQgb24gdGhlIGB7e3ZpZXd9fWAncyByZXN1bHRpbmcgZWxlbWVudAorICB3aXRoIHRoZSBg
Y2xhc3NgIG9yIGBjbGFzc05hbWVCaW5kaW5nc2Agb3B0aW9ucy4gVGhlIGBjbGFzc2Agb3B0aW9u
IHdpbGwKKyAgZGlyZWN0bHkgc2V0IHRoZSBDU1MgYGNsYXNzYCBhdHRyaWJ1dGUgYW5kIHdpbGwg
bm90IGJlIHBhc3NlZCB0bworICBgRW1iZXIuVmlldy5jcmVhdGVgLiBgY2xhc3NOYW1lQmluZGlu
Z3NgIHdpbGwgYmUgcGFzc2VkIHRvIGBjcmVhdGVgIGFuZCB1c2UKKyAgYEVtYmVyLlZpZXdgJ3Mg
Y2xhc3MgbmFtZSBiaW5kaW5nIGZ1bmN0aW9uYWxpdHk6CisKKyAgYGBgaGFuZGxlYmFycworICB7
eyN2aWV3IHRhZ05hbWU9InNwYW4iIGNsYXNzPSJhLWN1c3RvbS1jbGFzcyJ9fQorICAgIGhlbGxv
LgorICB7ey92aWV3fX0KKyAgYGBgCisKKyAgUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIEhUTUwg
c3RydWN0dXJlOgorCisgIGBgYGh0bWwKKyAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAg
PHNwYW4gaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcgYS1jdXN0b20tY2xhc3MiPgorICAg
ICAgaGVsbG8uCisgICAgPC9zcGFuPgorICA8L2Rpdj4KKyAgYGBgCisKKyAgIyMjIFN1cHBseWlu
ZyBhIGRpZmZlcmVudCB2aWV3IGNsYXNzCisKKyAgYHt7dmlld319YCBjYW4gdGFrZSBhbiBvcHRp
b25hbCBmaXJzdCBhcmd1bWVudCBiZWZvcmUgaXRzIHN1cHBsaWVkIG9wdGlvbnMgdG8KKyAgc3Bl
Y2lmeSBhIHBhdGggdG8gYSBjdXN0b20gdmlldyBjbGFzcy4KKworICBgYGBoYW5kbGViYXJzCisg
IHt7I3ZpZXcgIk15QXBwLkN1c3RvbVZpZXcifX0KKyAgICBoZWxsby4KKyAge3svdmlld319Cisg
IGBgYAorCisgIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYWxzbyBiZSBhIHJlbGF0aXZlIHBhdGgg
YWNjZXNzaWJsZSBmcm9tIHRoZSBjdXJyZW50CisgIGNvbnRleHQuCisKKyAgYGBgamF2YXNjcmlw
dAorICBNeUFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7fSk7CisgIE15QXBwLk91dGVy
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICBpbm5lclZpZXdDbGFzczogRW1iZXIuVmll
dy5leHRlbmQoeworICAgICAgY2xhc3NOYW1lczogWydhLWN1c3RvbS12aWV3LWNsYXNzLWFzLXBy
b3BlcnR5J10KKyAgICB9KSwKKyAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxl
KCd7eyN2aWV3ICJ2aWV3LmlubmVyVmlld0NsYXNzIn19IGhpIHt7L3ZpZXd9fScpCisgIH0pOwor
CisgIE15QXBwLk91dGVyVmlldy5jcmVhdGUoKS5hcHBlbmRUbygnYm9keScpOworICBgYGAKKwor
ICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6CisKKyAgYGBgaHRtbAorICA8ZGl2
IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8ZGl2IGlkPSJlbWJlcjIiIGNs
YXNzPSJlbWJlci12aWV3IGEtY3VzdG9tLXZpZXctY2xhc3MtYXMtcHJvcGVydHkiPgorICAgICAg
aGkKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisgICMjIyBCbG9ja2xlc3MgdXNlCisK
KyAgSWYgeW91IHN1cHBseSBhIGN1c3RvbSBgRW1iZXIuVmlld2Agc3ViY2xhc3MgdGhhdCBzcGVj
aWZpZXMgaXRzIG93biB0ZW1wbGF0ZQorICBvciBwcm92aWRlIGEgYHRlbXBsYXRlTmFtZWAgb3B0
aW9uIHRvIGB7e3ZpZXd9fWAgaXQgY2FuIGJlIHVzZWQgd2l0aG91dAorICBzdXBwbHlpbmcgYSBi
bG9jay4gQXR0ZW1wdHMgdG8gdXNlIGJvdGggYSBgdGVtcGxhdGVOYW1lYCBvcHRpb24gYW5kIHN1
cHBseSBhCisgIGJsb2NrIHdpbGwgdGhyb3cgYW4gZXJyb3IuCisKKyAgYGBgaGFuZGxlYmFycwor
ICB7e3ZpZXcgIk15QXBwLlZpZXdXaXRoQVRlbXBsYXRlRGVmaW5lZCJ9fQorICBgYGAKKworICAj
IyMgYHZpZXdOYW1lYCBwcm9wZXJ0eQorCisgIFlvdSBjYW4gc3VwcGx5IGEgYHZpZXdOYW1lYCBv
cHRpb24gdG8gYHt7dmlld319YC4gVGhlIGBFbWJlci5WaWV3YCBpbnN0YW5jZQorICB3aWxsIGJl
IHJlZmVyZW5jZWQgYXMgYSBwcm9wZXJ0eSBvZiBpdHMgcGFyZW50IHZpZXcgYnkgdGhpcyBuYW1l
LgorCisgIGBgYGphdmFzY3JpcHQKKyAgYVZpZXcgPSBFbWJlci5WaWV3LmNyZWF0ZSh7CisgICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgne3sjdmlldyB2aWV3TmFtZT0iYUNo
aWxkQnlOYW1lIn19IGhpIHt7L3ZpZXd9fScpCisgIH0pOworCisgIGFWaWV3LmFwcGVuZFRvKCdi
b2R5Jyk7CisgIGFWaWV3LmdldCgnYUNoaWxkQnlOYW1lJykgLy8gdGhlIGluc3RhbmNlIG9mIEVt
YmVyLlZpZXcgY3JlYXRlZCBieSB7e3ZpZXd9fSBoZWxwZXIKKyAgYGBgCisKKyAgQG1ldGhvZCB2
aWV3CisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5nfSBw
YXRoCisgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3Ry
aW5nCisqLworRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd2aWV3JywgZnVuY3Rpb24g
dmlld0hlbHBlcihwYXRoLCBvcHRpb25zKSB7CisgIEVtYmVyLmFzc2VydCgiVGhlIHZpZXcgaGVs
cGVyIG9ubHkgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQiLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIp
OworCisgIC8vIElmIG5vIHBhdGggaXMgcHJvdmlkZWQsIHRyZWF0IHBhdGggcGFyYW0gYXMgb3B0
aW9ucy4KKyAgaWYgKHBhdGggJiYgcGF0aC5kYXRhICYmIHBhdGguZGF0YS5pc1JlbmRlckRhdGEp
IHsKKyAgICBvcHRpb25zID0gcGF0aDsKKyAgICBwYXRoID0gIkVtYmVyLlZpZXciOworICB9CisK
KyAgcmV0dXJuIEVtYmVySGFuZGxlYmFycy5WaWV3SGVscGVyLmhlbHBlcih0aGlzLCBwYXRoLCBv
cHRpb25zKTsKK30pOworCisKK30pKCk7CisKKworCisoZnVuY3Rpb24oKSB7CisvLyBUT0RPOiBE
b24ndCByZXF1aXJlIGFsbCBvZiB0aGlzIG1vZHVsZQorLyoqCitAbW9kdWxlIGVtYmVyCitAc3Vi
bW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCisKK3ZhciBnZXQgPSBFbWJlci5nZXQsIGhhbmRs
ZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsK
KworLyoqCisgIGB7e2NvbGxlY3Rpb259fWAgaXMgYSBgRW1iZXIuSGFuZGxlYmFyc2AgaGVscGVy
IGZvciBhZGRpbmcgaW5zdGFuY2VzIG9mCisgIGBFbWJlci5Db2xsZWN0aW9uVmlld2AgdG8gYSB0
ZW1wbGF0ZS4gU2VlIFtFbWJlci5Db2xsZWN0aW9uVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLkNv
bGxlY3Rpb25WaWV3Lmh0bWwpCisgICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBob3cg
YSBgQ29sbGVjdGlvblZpZXdgIGZ1bmN0aW9ucy4KKworICBge3tjb2xsZWN0aW9ufX1gJ3MgcHJp
bWFyeSB1c2UgaXMgYXMgYSBibG9jayBoZWxwZXIgd2l0aCBhIGBjb250ZW50QmluZGluZ2AKKyAg
b3B0aW9uIHBvaW50aW5nIHRvd2FyZHMgYW4gYEVtYmVyLkFycmF5YC1jb21wYXRpYmxlIG9iamVj
dC4gQW4gYEVtYmVyLlZpZXdgCisgIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBp
dGVtIGluIGl0cyBgY29udGVudGAgcHJvcGVydHkuIEVhY2ggdmlldworICB3aWxsIGhhdmUgaXRz
IG93biBgY29udGVudGAgcHJvcGVydHkgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGluIHRo
ZQorICBjb2xsZWN0aW9uLgorCisgIFRoZSBwcm92aWRlZCBibG9jayB3aWxsIGJlIGFwcGxpZWQg
YXMgdGhlIHRlbXBsYXRlIGZvciBlYWNoIGl0ZW0ncyB2aWV3LgorCisgIEdpdmVuIGFuIGVtcHR5
IGA8Ym9keT5gIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6CisKKyAgYGBgaGFuZGxlYmFycworICB7
eyNjb2xsZWN0aW9uIGNvbnRlbnRCaW5kaW5nPSJBcHAuaXRlbXMifX0KKyAgICBIaSB7e3ZpZXcu
Y29udGVudC5uYW1lfX0KKyAge3svY29sbGVjdGlvbn19CisgIGBgYAorCisgIEFuZCB0aGUgZm9s
bG93aW5nIGFwcGxpY2F0aW9uIGNvZGUKKworICBgYGBqYXZhc2NyaXB0CisgIEFwcCA9IEVtYmVy
LkFwcGxpY2F0aW9uLmNyZWF0ZSgpCisgIEFwcC5pdGVtcyA9IFsKKyAgICBFbWJlci5PYmplY3Qu
Y3JlYXRlKHtuYW1lOiAnRGF2ZSd9KSwKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAn
TWFyeSd9KSwKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQorICBdCisg
IGBgYAorCisgIFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBiZWxvdworCisgIGBg
YGh0bWwKKyAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+SGkgRGF2ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkhpIE1hcnk8
L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBTYXJhPC9kaXY+CisgIDwvZGl2
PgorICBgYGAKKworICAjIyMgQmxvY2tsZXNzIFVzZQorCisgIElmIHlvdSBwcm92aWRlIGFuIGBp
dGVtVmlld0NsYXNzYCBvcHRpb24gdGhhdCBoYXMgaXRzIG93biBgdGVtcGxhdGVgIHlvdSBjYW4K
KyAgb21pdCB0aGUgYmxvY2suCisKKyAgVGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKworICBgYGBo
YW5kbGViYXJzCisgIHt7Y29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIiBpdGVt
Vmlld0NsYXNzPSJBcHAuQW5JdGVtVmlldyJ9fQorICBgYGAKKworICBBbmQgYXBwbGljYXRpb24g
Y29kZQorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRl
KCk7CisgIEFwcC5pdGVtcyA9IFsKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnRGF2
ZSd9KSwKKyAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwKKyAgICBFbWJl
ci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQorICBdOworCisgIEFwcC5Bbkl0ZW1WaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNv
bXBpbGUoIkdyZWV0aW5ncyB7e3ZpZXcuY29udGVudC5uYW1lfX0iKQorICB9KTsKKyAgYGBgCisK
KyAgV2lsbCByZXN1bHQgaW4gdGhlIEhUTUwgc3RydWN0dXJlIGJlbG93CisKKyAgYGBgaHRtbAor
ICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5H
cmVldGluZ3MgRGF2ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5n
cyBNYXJ5PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIFNhcmE8
L2Rpdj4KKyAgPC9kaXY+CisgIGBgYAorCisgICMjIyBTcGVjaWZ5aW5nIGEgQ29sbGVjdGlvblZp
ZXcgc3ViY2xhc3MKKworICBCeSBkZWZhdWx0IHRoZSBge3tjb2xsZWN0aW9ufX1gIGhlbHBlciB3
aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZgorICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgLiBZb3Ug
Y2FuIHN1cHBseSBhIGBFbWJlci5Db2xsZWN0aW9uVmlld2Agc3ViY2xhc3MgdG8KKyAgdGhlIGhl
bHBlciBieSBwYXNzaW5nIGl0IGFzIHRoZSBmaXJzdCBhcmd1bWVudDoKKworICBgYGBoYW5kbGVi
YXJzCisgIHt7I2NvbGxlY3Rpb24gQXBwLk15Q3VzdG9tQ29sbGVjdGlvbkNsYXNzIGNvbnRlbnRC
aW5kaW5nPSJBcHAuaXRlbXMifX0KKyAgICBIaSB7e3ZpZXcuY29udGVudC5uYW1lfX0KKyAge3sv
Y29sbGVjdGlvbn19CisgIGBgYAorCisgICMjIyBGb3J3YXJkZWQgYGl0ZW0uKmAtbmFtZWQgT3B0
aW9ucworCisgIEFzIHdpdGggdGhlIGB7e3ZpZXd9fWAsIGhlbHBlciBvcHRpb25zIHBhc3NlZCB0
byB0aGUgYHt7Y29sbGVjdGlvbn19YCB3aWxsIGJlCisgIHNldCBvbiB0aGUgcmVzdWx0aW5nIGBF
bWJlci5Db2xsZWN0aW9uVmlld2AgYXMgcHJvcGVydGllcy4gQWRkaXRpb25hbGx5LAorICBvcHRp
b25zIHByZWZpeGVkIHdpdGggYGl0ZW1gIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgdmlld3MgcmVu
ZGVyZWQgZm9yIGVhY2gKKyAgaXRlbSAobm90ZSB0aGUgY2FtZWxjYXNpbmcpOgorCisgIGBgYGhh
bmRsZWJhcnMKKyAge3sjY29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIgorICAg
ICAgICAgICAgICAgIGl0ZW1UYWdOYW1lPSJwIgorICAgICAgICAgICAgICAgIGl0ZW1DbGFzc05h
bWVzPSJncmVldGluZyJ9fQorICAgIEhvd2R5IHt7dmlldy5jb250ZW50Lm5hbWV9fQorICB7ey9j
b2xsZWN0aW9ufX0KKyAgYGBgCisKKyAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1M
IHN0cnVjdHVyZToKKworICBgYGBodG1sCisgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAg
IDxwIGNsYXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBEYXZlPC9wPgorICAgIDxwIGNs
YXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBNYXJ5PC9wPgorICAgIDxwIGNsYXNzPSJl
bWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBTYXJhPC9wPgorICA8L2Rpdj4KKyAgYGBgCisKKyAg
QG1ldGhvZCBjb2xsZWN0aW9uCisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBw
YXJhbSB7U3RyaW5nfSBwYXRoCisgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICBAcmV0dXJuIHtT
dHJpbmd9IEhUTUwgc3RyaW5nCisgIEBkZXByZWNhdGVkIFVzZSBge3tlYWNofX1gIGhlbHBlciBp
bnN0ZWFkLgorKi8KK0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2NvbGxlY3Rpb24n
LCBmdW5jdGlvbiBjb2xsZWN0aW9uSGVscGVyKHBhdGgsIG9wdGlvbnMpIHsKKyAgRW1iZXIuZGVw
cmVjYXRlKCJVc2luZyB0aGUge3tjb2xsZWN0aW9ufX0gaGVscGVyIHdpdGhvdXQgc3BlY2lmeWlu
ZyBhIGNsYXNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgdGhlIHt7ZWFjaH19IGhlbHBlciBub3cg
c3VwcG9ydHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4iLCBwYXRoICE9PSAnY29sbGVjdGlvbicp
OworCisgIC8vIElmIG5vIHBhdGggaXMgcHJvdmlkZWQsIHRyZWF0IHBhdGggcGFyYW0gYXMgb3B0
aW9ucy4KKyAgaWYgKHBhdGggJiYgcGF0aC5kYXRhICYmIHBhdGguZGF0YS5pc1JlbmRlckRhdGEp
IHsKKyAgICBvcHRpb25zID0gcGF0aDsKKyAgICBwYXRoID0gdW5kZWZpbmVkOworICAgIEVtYmVy
LmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gdGhlIGNv
bGxlY3Rpb24gaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSk7CisgIH0gZWxzZSB7Cisg
ICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0
byB0aGUgY29sbGVjdGlvbiBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKKyAgfQog
Ci0gICAgICBodG1sRnVuYy5jYWxsKHRoaXMsIGh0bWwpOworICB2YXIgZm4gPSBvcHRpb25zLmZu
OworICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTsKKyAgdmFyIGludmVyc2UgPSBvcHRpb25zLmlu
dmVyc2U7CisgIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CiAKLSAgICAgIHRoaXMuaW5u
ZXJIVE1MID0gaHRtbDsKLSAgICB9OworICAvLyBJZiBwYXNzZWQgYSBwYXRoIHN0cmluZywgY29u
dmVydCB0aGF0IGludG8gYW4gb2JqZWN0LgorICAvLyBPdGhlcndpc2UsIGp1c3QgZGVmYXVsdCB0
byB0aGUgc3RhbmRhcmQgY2xhc3MuCisgIHZhciBjb2xsZWN0aW9uQ2xhc3M7CisgIGNvbGxlY3Rp
b25DbGFzcyA9IHBhdGggPyBoYW5kbGViYXJzR2V0KHRoaXMsIHBhdGgsIG9wdGlvbnMpIDogRW1i
ZXIuQ29sbGVjdGlvblZpZXc7CisgIEVtYmVyLmFzc2VydChmbXQoIiVAICNjb2xsZWN0aW9uOiBD
b3VsZCBub3QgZmluZCBjb2xsZWN0aW9uIGNsYXNzICVAIiwgW2RhdGEudmlldywgcGF0aF0pLCAh
IWNvbGxlY3Rpb25DbGFzcyk7CiAKLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLnJlcGxhY2VXaXRo
ID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKLSAgICAgIGh0
bWxGdW5jLmNhbGwodGhpcywgaHRtbCwgdHJ1ZSk7Ci0gICAgfTsKKyAgdmFyIGhhc2ggPSBvcHRp
b25zLmhhc2gsIGl0ZW1IYXNoID0ge30sIG1hdGNoOwogCi0gICAgTWV0YW1vcnBoLnByb3RvdHlw
ZS5yZW1vdmUgPSByZW1vdmVGdW5jOwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUub3V0ZXJIVE1M
ID0gb3V0ZXJIVE1MRnVuYzsKLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmFwcGVuZFRvID0gYXBw
ZW5kVG9GdW5jOwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuYWZ0ZXIgPSBhZnRlckZ1bmM7Ci0g
ICAgTWV0YW1vcnBoLnByb3RvdHlwZS5wcmVwZW5kID0gcHJlcGVuZEZ1bmM7Ci0gICAgTWV0YW1v
cnBoLnByb3RvdHlwZS5zdGFydFRhZyA9IHN0YXJ0VGFnRnVuYzsKLSAgICBNZXRhbW9ycGgucHJv
dG90eXBlLmVuZFRhZyA9IGVuZFRhZ0Z1bmM7CisgIC8vIEV4dHJhY3QgaXRlbSB2aWV3IGNsYXNz
IGlmIHByb3ZpZGVkIGVsc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgY2xhc3MKKyAgdmFyIGNv
bGxlY3Rpb25Qcm90b3R5cGUgPSBjb2xsZWN0aW9uQ2xhc3MucHJvdG8oKSwKKyAgICAgIGl0ZW1W
aWV3Q2xhc3M7CisKKyAgaWYgKGhhc2guaXRlbVZpZXcpIHsKKyAgICB2YXIgY29udHJvbGxlciA9
IGRhdGEua2V5d29yZHMuY29udHJvbGxlcjsKKyAgICBFbWJlci5hc3NlcnQoJ1lvdSBzcGVjaWZp
ZWQgYW4gaXRlbVZpZXcsIGJ1dCB0aGUgY3VycmVudCBjb250ZXh0IGhhcyBubyAnICsKKyAgICAg
ICAgICAgICAgICAgJ2NvbnRhaW5lciB0byBsb29rIHRoZSBpdGVtVmlldyB1cCBpbi4gVGhpcyBw
cm9iYWJseSBtZWFucyAnICsKKyAgICAgICAgICAgICAgICAgJ3RoYXQgeW91IGNyZWF0ZWQgYSB2
aWV3IG1hbnVhbGx5LCBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlICcgKworICAgICAgICAgICAgICAg
ICAnY29udGFpbmVyLiBJbnN0ZWFkLCB1c2UgY29udGFpbmVyLmxvb2t1cCgidmlldzp2aWV3TmFt
ZSIpLCAnICsKKyAgICAgICAgICAgICAgICAgJ3doaWNoIHdpbGwgcHJvcGVybHkgaW5zdGFudGlh
dGUgeW91ciB2aWV3LicsCisgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgJiYgY29udHJvbGxl
ci5jb250YWluZXIpOworICAgIHZhciBjb250YWluZXIgPSBjb250cm9sbGVyLmNvbnRhaW5lcjsK
KyAgICBpdGVtVmlld0NsYXNzID0gY29udGFpbmVyLnJlc29sdmUoJ3ZpZXc6JyArIGhhc2guaXRl
bVZpZXcpOworICAgIEVtYmVyLmFzc2VydCgnWW91IHNwZWNpZmllZCB0aGUgaXRlbVZpZXcgJyAr
IGhhc2guaXRlbVZpZXcgKyAiLCBidXQgaXQgd2FzICIgKworICAgICAgICAgICAgICAgICAibm90
IGZvdW5kIGF0ICIgKyBjb250YWluZXIuZGVzY3JpYmUoInZpZXc6IiArIGhhc2guaXRlbVZpZXcp
ICsKKyAgICAgICAgICAgICAgICAgIiAoYW5kIGl0IHdhcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUg
Y29udGFpbmVyKSIsICEhaXRlbVZpZXdDbGFzcyk7CisgIH0gZWxzZSBpZiAoaGFzaC5pdGVtVmll
d0NsYXNzKSB7CisgICAgaXRlbVZpZXdDbGFzcyA9IGhhbmRsZWJhcnNHZXQoY29sbGVjdGlvblBy
b3RvdHlwZSwgaGFzaC5pdGVtVmlld0NsYXNzLCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBp
dGVtVmlld0NsYXNzID0gY29sbGVjdGlvblByb3RvdHlwZS5pdGVtVmlld0NsYXNzOworICB9CiAK
LSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmlzUmVtb3ZlZCA9IGZ1bmN0aW9uKCkgewotICAgICAg
dmFyIGJlZm9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwotICAgICAg
dmFyIGFmdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOworICBFbWJlci5h
c3NlcnQoZm10KCIlQCAjY29sbGVjdGlvbjogQ291bGQgbm90IGZpbmQgaXRlbVZpZXdDbGFzcyAl
QCIsIFtkYXRhLnZpZXcsIGl0ZW1WaWV3Q2xhc3NdKSwgISFpdGVtVmlld0NsYXNzKTsKIAotICAg
ICAgcmV0dXJuICFiZWZvcmUgfHwgIWFmdGVyOwotICAgIH07CisgIGRlbGV0ZSBoYXNoLml0ZW1W
aWV3Q2xhc3M7CisgIGRlbGV0ZSBoYXNoLml0ZW1WaWV3OwogCi0gICAgTWV0YW1vcnBoLnByb3Rv
dHlwZS5jaGVja1JlbW92ZWQgPSBmdW5jdGlvbigpIHsKLSAgICAgIGlmICh0aGlzLmlzUmVtb3Zl
ZCgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9u
cyBvbiBhIE1ldGFtb3JwaCB0aGF0IGlzIG5vdCBpbiB0aGUgRE9NLiIpOworICAvLyBHbyB0aHJv
dWdoIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB7e2NvbGxlY3Rpb259fSBoZWxwZXIgYW5kIGV4dHJh
Y3Qgb3B0aW9ucworICAvLyB0aGF0IGNvbmZpZ3VyZSBpdGVtIHZpZXdzIGluc3RlYWQgb2YgdGhl
IGNvbGxlY3Rpb24gaXRzZWxmLgorICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKKyAgICBpZiAo
aGFzaC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgbWF0Y2ggPSBwcm9wLm1hdGNoKC9e
aXRlbSguKSguKikkLyk7CisKKyAgICAgIGlmIChtYXRjaCAmJiBwcm9wICE9PSAnaXRlbUNvbnRy
b2xsZXInKSB7CisgICAgICAgIC8vIENvbnZlcnQgaXRlbVNob3VsZEZvbyAtPiBzaG91bGRGb28K
KyAgICAgICAgaXRlbUhhc2hbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSArIG1hdGNoWzJdXSA9IGhh
c2hbcHJvcF07CisgICAgICAgIC8vIERlbGV0ZSBmcm9tIGhhc2ggYXMgdGhpcyB3aWxsIGVuZCB1
cCBnZXR0aW5nIHBhc3NlZCB0byB0aGUKKyAgICAgICAgLy8ge3t2aWV3fX0gaGVscGVyIG1ldGhv
ZC4KKyAgICAgICAgZGVsZXRlIGhhc2hbcHJvcF07CiAgICAgICB9Ci0gICAgfTsKKyAgICB9Cisg
IH0KIAotICAgIHJldHVybiBNZXRhbW9ycGg7Ci0gIH0pOworICBpZiAoZm4pIHsKKyAgICBpdGVt
SGFzaC50ZW1wbGF0ZSA9IGZuOworICAgIGRlbGV0ZSBvcHRpb25zLmZuOworICB9CiAKLX0pKCk7
CisgIHZhciBlbXB0eVZpZXdDbGFzczsKKyAgaWYgKGludmVyc2UgJiYgaW52ZXJzZSAhPT0gRW1i
ZXIuSGFuZGxlYmFycy5WTS5ub29wKSB7CisgICAgZW1wdHlWaWV3Q2xhc3MgPSBnZXQoY29sbGVj
dGlvblByb3RvdHlwZSwgJ2VtcHR5Vmlld0NsYXNzJyk7CisgICAgZW1wdHlWaWV3Q2xhc3MgPSBl
bXB0eVZpZXdDbGFzcy5leHRlbmQoeworICAgICAgICAgIHRlbXBsYXRlOiBpbnZlcnNlLAorICAg
ICAgICAgIHRhZ05hbWU6IGl0ZW1IYXNoLnRhZ05hbWUKKyAgICB9KTsKKyAgfSBlbHNlIGlmICho
YXNoLmVtcHR5Vmlld0NsYXNzKSB7CisgICAgZW1wdHlWaWV3Q2xhc3MgPSBoYW5kbGViYXJzR2V0
KHRoaXMsIGhhc2guZW1wdHlWaWV3Q2xhc3MsIG9wdGlvbnMpOworICB9CisgIGlmIChlbXB0eVZp
ZXdDbGFzcykgeyBoYXNoLmVtcHR5VmlldyA9IGVtcHR5Vmlld0NsYXNzOyB9CiAKLShmdW5jdGlv
bigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0q
LworICBpZiAoIWhhc2gua2V5d29yZCkgeworICAgIGl0ZW1IYXNoLl9jb250ZXh0ID0gRW1iZXIu
Y29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKTsKKyAgfQogCi0vLyBFbGltaW5hdGUgZGVwZW5kZW5j
eSBvbiBhbnkgRW1iZXIgdG8gc2ltcGxpZnkgcHJlY29tcGlsYXRpb24gd29ya2Zsb3cKLXZhciBv
YmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uKHBhcmVudCkgewotICBmdW5j
dGlvbiBGKCkge30KLSAgRi5wcm90b3R5cGUgPSBwYXJlbnQ7Ci0gIHJldHVybiBuZXcgRigpOwot
fTsKKyAgdmFyIHZpZXdPcHRpb25zID0gRW1iZXIuSGFuZGxlYmFycy5WaWV3SGVscGVyLnByb3Bl
cnRpZXNGcm9tSFRNTE9wdGlvbnMoeyBkYXRhOiBkYXRhLCBoYXNoOiBpdGVtSGFzaCB9LCB0aGlz
KTsKKyAgaGFzaC5pdGVtVmlld0NsYXNzID0gaXRlbVZpZXdDbGFzcy5leHRlbmQodmlld09wdGlv
bnMpOwogCi12YXIgSGFuZGxlYmFycyA9IHRoaXMuSGFuZGxlYmFycyB8fCBFbWJlci5pbXBvcnRz
LkhhbmRsZWJhcnM7Ci1FbWJlci5hc3NlcnQoIkVtYmVyIEhhbmRsZWJhcnMgcmVxdWlyZXMgSGFu
ZGxlYmFycyAxLjAuMC1yYy4zIG9yIGdyZWF0ZXIiLCBIYW5kbGViYXJzICYmIEhhbmRsZWJhcnMu
VkVSU0lPTi5tYXRjaCgvXjFcLjBcLlswLTldKFwucmNcLlsyMzQ1Njc4OV0rKT8vKSk7CisgIHJl
dHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIGNvbGxlY3Rpb25D
bGFzcywgb3B0aW9ucyk7Cit9KTsKIAotLyoqCi0gIFByZXBhcmVzIHRoZSBIYW5kbGViYXJzIHRl
bXBsYXRpbmcgbGlicmFyeSBmb3IgdXNlIGluc2lkZSBFbWJlcidzIHZpZXcKLSAgc3lzdGVtLgog
Ci0gIFRoZSBgRW1iZXIuSGFuZGxlYmFyc2Agb2JqZWN0IGlzIHRoZSBzdGFuZGFyZCBIYW5kbGVi
YXJzIGxpYnJhcnksIGV4dGVuZGVkIHRvCi0gIHVzZSBFbWJlcidzIGBnZXQoKWAgbWV0aG9kIGlu
c3RlYWQgb2YgZGlyZWN0IHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggYWxsb3dzCi0gIGNvbXB1dGVk
IHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzLgorfSkoKTsKIAotICBUbyBj
cmVhdGUgYW4gYEVtYmVyLkhhbmRsZWJhcnNgIHRlbXBsYXRlLCBjYWxsIGBFbWJlci5IYW5kbGVi
YXJzLmNvbXBpbGUoKWAuCi0gIFRoaXMgd2lsbCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBi
ZSB1c2VkIGJ5IGBFbWJlci5WaWV3YCBmb3IgcmVuZGVyaW5nLgogCi0gIEBjbGFzcyBIYW5kbGVi
YXJzCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5IYW5kbGViYXJzID0gb2JqZWN0Q3Jl
YXRlKEhhbmRsZWJhcnMpOwogCisoZnVuY3Rpb24oKSB7CisvKmdsb2JhbHMgSGFuZGxlYmFycyAq
LwogLyoqCi1AY2xhc3MgaGVscGVycwotQG5hbWVzcGFjZSBFbWJlci5IYW5kbGViYXJzCitAbW9k
dWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKICovCi1FbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMgPSBvYmplY3RDcmVhdGUoSGFuZGxlYmFycy5oZWxwZXJzKTsKKwordmFyIGhh
bmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldDsKIAogLyoqCi0gIE92ZXJyaWRlIHRo
ZSB0aGUgb3Bjb2RlIGNvbXBpbGVyIGFuZCBKYXZhU2NyaXB0IGNvbXBpbGVyIGZvciBIYW5kbGVi
YXJzLgorICBgdW5ib3VuZGAgYWxsb3dzIHlvdSB0byBvdXRwdXQgYSBwcm9wZXJ0eSB3aXRob3V0
IGJpbmRpbmcuICpJbXBvcnRhbnQ6KiBUaGUKKyAgb3V0cHV0IHdpbGwgbm90IGJlIHVwZGF0ZWQg
aWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFVzZSB3aXRoIGNhdXRpb24uCiAKLSAgQGNsYXNzIENv
bXBpbGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBAY29u
c3RydWN0b3IKLSovCi1FbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsK
KyAgYGBgaGFuZGxlYmFycworICA8ZGl2Pnt7dW5ib3VuZCBzb21lUHJvcGVydHlUaGF0RG9lc250
Q2hhbmdlfX08L2Rpdj4KKyAgYGBgCiAKLS8vIEhhbmRsZWJhcnMuQ29tcGlsZXIgZG9lc24ndCBl
eGlzdCBpbiBydW50aW1lLW9ubHkKLWlmIChIYW5kbGViYXJzLkNvbXBpbGVyKSB7Ci0gIEVtYmVy
LkhhbmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlID0gb2JqZWN0Q3JlYXRlKEhhbmRsZWJhcnMu
Q29tcGlsZXIucHJvdG90eXBlKTsKLX0KKyAgYHVuYm91bmRgIGNhbiBhbHNvIGJlIHVzZWQgaW4g
Y29uanVuY3Rpb24gd2l0aCBhIGJvdW5kIGhlbHBlciB0bworICByZW5kZXIgaXQgaW4gaXRzIHVu
Ym91bmQgZm9ybToKIAotRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUuY29tcGls
ZXIgPSBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyOworICBgYGBoYW5kbGViYXJzCisgIDxkaXY+
e3t1bmJvdW5kIGhlbHBlck5hbWUgc29tZVByb3BlcnR5VGhhdERvZXNudENoYW5nZX19PC9kaXY+
CisgIGBgYAogCi0vKioKLSAgQGNsYXNzIEphdmFTY3JpcHRDb21waWxlcgotICBAbmFtZXNwYWNl
IEVtYmVyLkhhbmRsZWJhcnMKLSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCisgIEBtZXRob2Qg
dW5ib3VuZAorICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFyYW0ge1N0cmlu
Z30gcHJvcGVydHkKKyAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwogKi8KLUVtYmVyLkhh
bmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKK0VtYmVyLkhhbmRs
ZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3VuYm91bmQnLCBmdW5jdGlvbiB1bmJvdW5kSGVscGVyKHBy
b3BlcnR5LCBmbikgeworICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3Ro
IC0gMV0sIGhlbHBlciwgY29udGV4dCwgb3V0OwogCi0vLyBIYW5kbGViYXJzLkphdmFTY3JpcHRD
b21waWxlciBkb2Vzbid0IGV4aXN0IGluIHJ1bnRpbWUtb25seQotaWYgKEhhbmRsZWJhcnMuSmF2
YVNjcmlwdENvbXBpbGVyKSB7Ci0gIEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVy
LnByb3RvdHlwZSA9IG9iamVjdENyZWF0ZShIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5w
cm90b3R5cGUpOwotICBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5
cGUuY29tcGlsZXIgPSBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcjsKLX0KKyAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAgLy8gVW5ib3VuZCBoZWxwZXIgY2FsbC4K
KyAgICBvcHRpb25zLmRhdGEuaXNVbmJvdW5kID0gdHJ1ZTsKKyAgICBoZWxwZXIgPSBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnNbYXJndW1lbnRzWzBdXSB8fCBFbWJlci5IYW5kbGViYXJzLmhlbHBl
cnMuaGVscGVyTWlzc2luZzsKKyAgICBvdXQgPSBoZWxwZXIuYXBwbHkodGhpcywgQXJyYXkucHJv
dG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgICAgZGVsZXRlIG9wdGlvbnMuZGF0
YS5pc1VuYm91bmQ7CisgICAgcmV0dXJuIG91dDsKKyAgfQogCisgIGNvbnRleHQgPSAoZm4uY29u
dGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBdIDogdGhpczsKKyAg
cmV0dXJuIGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcHJvcGVydHksIGZuKTsKK30pOwogCi1FbWJl
ci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUubmFtZXNwYWNlID0gIkVt
YmVyLkhhbmRsZWJhcnMiOworfSkoKTsKIAogCi1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRD
b21waWxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZUJ1ZmZlciA9IGZ1bmN0aW9uKCkgewotICByZXR1
cm4gIicnIjsKLX07CiAKKyhmdW5jdGlvbigpIHsKKy8qanNoaW50IGRlYnVnOnRydWUqLwogLyoq
Ci0gIEBwcml2YXRlCi0KLSAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVmZmVyIGZvciBFbWJlciBI
YW5kbGViYXJzLiBCeSBkZWZhdWx0LCBIYW5kbGViYXJzCi0gIGNyZWF0ZXMgYW4gZW1wdHkgU3Ry
aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbnZvY2F0aW9uIGFuZCBhcHBlbmRzIHRvCi0g
IGl0LiBFbWJlcidzIEhhbmRsZWJhcnMgb3ZlcnJpZGVzIHRoaXMgdG8gYXBwZW5kIHRvIGEgc2lu
Z2xlIHNoYXJlZCBidWZmZXIuCi0KLSAgQG1ldGhvZCBhcHBlbmRUb0J1ZmZlcgotICBAcGFyYW0g
c3RyaW5nIHtTdHJpbmd9CitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJh
cnMKICovCi1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuYXBw
ZW5kVG9CdWZmZXIgPSBmdW5jdGlvbihzdHJpbmcpIHsKLSAgcmV0dXJuICJkYXRhLmJ1ZmZlci5w
dXNoKCIrc3RyaW5nKyIpOyI7Ci19OwogCi12YXIgcHJlZml4ID0gImVtYmVyIiArICgrbmV3IERh
dGUoKSksIGluY3IgPSAxOwordmFyIGdldCA9IEVtYmVyLmdldCwgaGFuZGxlYmFyc0dldCA9IEVt
YmVyLkhhbmRsZWJhcnMuZ2V0LCBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3Jt
YWxpemVQYXRoOwogCiAvKioKLSAgQHByaXZhdGUKKyAgYGxvZ2AgYWxsb3dzIHlvdSB0byBvdXRw
dXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nCisgIGNv
bnRleHQuCiAKLSAgUmV3cml0ZSBzaW1wbGUgbXVzdGFjaGVzIGZyb20gYHt7Zm9vfX1gIHRvIGB7
e2JpbmQgImZvbyJ9fWAuIFRoaXMgbWVhbnMgdGhhdAotICBhbGwgc2ltcGxlIG11c3RhY2hlcyBp
biBFbWJlcidzIEhhbmRsZWJhcnMgd2lsbCBhbHNvIHNldCB1cCBhbiBvYnNlcnZlciB0bwotICBr
ZWVwIHRoZSBET00gdXAgdG8gZGF0ZSB3aGVuIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGNoYW5n
ZXMuCisgIGBgYGhhbmRsZWJhcnMKKyAge3tsb2cgbXlWYXJpYWJsZX19CisgIGBgYAogCi0gIEBt
ZXRob2QgbXVzdGFjaGUKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyCi0gIEBwYXJh
bSBtdXN0YWNoZQorICBAbWV0aG9kIGxvZworICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVy
cworICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKICovCi1FbWJlci5IYW5kbGViYXJzLkNvbXBp
bGVyLnByb3RvdHlwZS5tdXN0YWNoZSA9IGZ1bmN0aW9uKG11c3RhY2hlKSB7Ci0gIGlmIChtdXN0
YWNoZS5pc0hlbHBlciAmJiBtdXN0YWNoZS5pZC5zdHJpbmcgPT09ICdjb250cm9sJykgewotICAg
IG11c3RhY2hlLmhhc2ggPSBtdXN0YWNoZS5oYXNoIHx8IG5ldyBIYW5kbGViYXJzLkFTVC5IYXNo
Tm9kZShbXSk7Ci0gICAgbXVzdGFjaGUuaGFzaC5wYWlycy5wdXNoKFsiY29udHJvbElEIiwgbmV3
IEhhbmRsZWJhcnMuQVNULlN0cmluZ05vZGUocHJlZml4ICsgaW5jcisrKV0pOwotICB9IGVsc2Ug
aWYgKG11c3RhY2hlLnBhcmFtcy5sZW5ndGggfHwgbXVzdGFjaGUuaGFzaCkgewotICAgIC8vIG5v
IGNoYW5nZXMgcmVxdWlyZWQKLSAgfSBlbHNlIHsKLSAgICB2YXIgaWQgPSBuZXcgSGFuZGxlYmFy
cy5BU1QuSWROb2RlKFsnX3RyaWFnZU11c3RhY2hlJ10pOwotCi0gICAgLy8gVXBkYXRlIHRoZSBt
dXN0YWNoZSBub2RlIHRvIGluY2x1ZGUgYSBoYXNoIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0
aGUgb3JpZ2luYWwgbm9kZQotICAgIC8vIHdhcyBlc2NhcGVkLiBUaGlzIHdpbGwgYWxsb3cgdXMg
dG8gcHJvcGVybHkgZXNjYXBlIHZhbHVlcyB3aGVuIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0gICAg
Ly8gY2hhbmdlcyBhbmQgd2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIHZhbHVlLgotICAgIGlmKCFt
dXN0YWNoZS5lc2NhcGVkKSB7Ci0gICAgICBtdXN0YWNoZS5oYXNoID0gbXVzdGFjaGUuaGFzaCB8
fCBuZXcgSGFuZGxlYmFycy5BU1QuSGFzaE5vZGUoW10pOwotICAgICAgbXVzdGFjaGUuaGFzaC5w
YWlycy5wdXNoKFsidW5lc2NhcGVkIiwgbmV3IEhhbmRsZWJhcnMuQVNULlN0cmluZ05vZGUoInRy
dWUiKV0pOwotICAgIH0KLSAgICBtdXN0YWNoZSA9IG5ldyBIYW5kbGViYXJzLkFTVC5NdXN0YWNo
ZU5vZGUoW2lkXS5jb25jYXQoW211c3RhY2hlLmlkXSksIG11c3RhY2hlLmhhc2gsICFtdXN0YWNo
ZS5lc2NhcGVkKTsKLSAgfQotCi0gIHJldHVybiBIYW5kbGViYXJzLkNvbXBpbGVyLnByb3RvdHlw
ZS5tdXN0YWNoZS5jYWxsKHRoaXMsIG11c3RhY2hlKTsKLX07CitFbWJlci5IYW5kbGViYXJzLnJl
Z2lzdGVySGVscGVyKCdsb2cnLCBmdW5jdGlvbiBsb2dIZWxwZXIocHJvcGVydHksIG9wdGlvbnMp
IHsKKyAgdmFyIGNvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0cyAmJiBvcHRpb25zLmNvbnRleHRz
Lmxlbmd0aCkgPyBvcHRpb25zLmNvbnRleHRzWzBdIDogdGhpcywKKyAgICAgIG5vcm1hbGl6ZWQg
PSBub3JtYWxpemVQYXRoKGNvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zLmRhdGEpLAorICAgICAg
cGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3QsCisgICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRo
LAorICAgICAgdmFsdWUgPSAocGF0aCA9PT0gJ3RoaXMnKSA/IHBhdGhSb290IDogaGFuZGxlYmFy
c0dldChwYXRoUm9vdCwgcGF0aCwgb3B0aW9ucyk7CisgIEVtYmVyLkxvZ2dlci5sb2codmFsdWUp
OworfSk7CiAKIC8qKgotICBVc2VkIGZvciBwcmVjb21waWxhdGlvbiBvZiBFbWJlciBIYW5kbGVi
YXJzIHRlbXBsYXRlcy4gVGhpcyB3aWxsIG5vdCBiZSB1c2VkCi0gIGR1cmluZyBub3JtYWwgYXBw
IGV4ZWN1dGlvbi4KKyAgRXhlY3V0ZSB0aGUgYGRlYnVnZ2VyYCBzdGF0ZW1lbnQgaW4gdGhlIGN1
cnJlbnQgY29udGV4dC4KIAotICBAbWV0aG9kIHByZWNvbXBpbGUKLSAgQGZvciBFbWJlci5IYW5k
bGViYXJzCi0gIEBzdGF0aWMKLSAgQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgdGVtcGxhdGUg
dG8gcHJlY29tcGlsZQotKi8KLUVtYmVyLkhhbmRsZWJhcnMucHJlY29tcGlsZSA9IGZ1bmN0aW9u
KHN0cmluZykgewotICB2YXIgYXN0ID0gSGFuZGxlYmFycy5wYXJzZShzdHJpbmcpOworICBgYGBo
YW5kbGViYXJzCisgIHt7ZGVidWdnZXJ9fQorICBgYGAKIAotICB2YXIgb3B0aW9ucyA9IHsKLSAg
ICBrbm93bkhlbHBlcnM6IHsKLSAgICAgIGFjdGlvbjogdHJ1ZSwKLSAgICAgIHVuYm91bmQ6IHRy
dWUsCi0gICAgICBiaW5kQXR0cjogdHJ1ZSwKLSAgICAgIHRlbXBsYXRlOiB0cnVlLAotICAgICAg
dmlldzogdHJ1ZSwKLSAgICAgIF90cmlhZ2VNdXN0YWNoZTogdHJ1ZQotICAgIH0sCi0gICAgZGF0
YTogdHJ1ZSwKLSAgICBzdHJpbmdQYXJhbXM6IHRydWUKLSAgfTsKKyAgQmVmb3JlIGludm9raW5n
IHRoZSBgZGVidWdnZXJgIHN0YXRlbWVudCwgdGhlcmUKKyAgYXJlIGEgZmV3IGhlbHBmdWwgdmFy
aWFibGVzIGRlZmluZWQgaW4gdGhlCisgIGJvZHkgb2YgdGhpcyBoZWxwZXIgdGhhdCB5b3UgY2Fu
IGluc3BlY3Qgd2hpbGUKKyAgZGVidWdnaW5nIHRoYXQgZGVzY3JpYmUgaG93IGFuZCB3aGVyZSB0
aGlzCisgIGhlbHBlciB3YXMgaW52b2tlZDoKKworICAtIHRlbXBsYXRlQ29udGV4dDogdGhpcyBp
cyBtb3N0IGxpa2VseSBhIGNvbnRyb2xsZXIKKyAgICBmcm9tIHdoaWNoIHRoaXMgdGVtcGxhdGUg
bG9va3MgdXAgLyBkaXNwbGF5cyBwcm9wZXJ0aWVzCisgIC0gdHlwZU9mVGVtcGxhdGVDb250ZXh0
OiBhIHN0cmluZyBkZXNjcmlwdGlvbiBvZgorICAgIHdoYXQgdGhlIHRlbXBsYXRlQ29udGV4dCBp
cworCisgIEZvciBleGFtcGxlLCBpZiB5b3UncmUgd29uZGVyaW5nIHdoeSBhIHZhbHVlIGB7e2Zv
b319YAorICBpc24ndCByZW5kZXJpbmcgYXMgZXhwZWN0ZWQgd2l0aGluIGEgdGVtcGxhdGUsIHlv
dQorICBjb3VsZCBwbGFjZSBhIGB7e2RlYnVnZ2VyfX1gIHN0YXRlbWVudCwgYW5kIHdoZW4KKyAg
dGhlIGBkZWJ1Z2dlcjtgIGJyZWFrcG9pbnQgaXMgaGl0LCB5b3UgY2FuIGluc3BlY3QKKyAgYHRl
bXBsYXRlQ29udGV4dGAsIGRldGVybWluZSBpZiBpdCdzIHRoZSBvYmplY3QgeW91CisgIGV4cGVj
dCwgYW5kL29yIGV2YWx1YXRlIGV4cHJlc3Npb25zIGluIHRoZSBjb25zb2xlCisgIHRvIHBlcmZv
cm0gcHJvcGVydHkgbG9va3VwcyBvbiB0aGUgYHRlbXBsYXRlQ29udGV4dGA6CiAKLSAgdmFyIGVu
dmlyb25tZW50ID0gbmV3IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwg
b3B0aW9ucyk7Ci0gIHJldHVybiBuZXcgRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGls
ZXIoKS5jb21waWxlKGVudmlyb25tZW50LCBvcHRpb25zLCB1bmRlZmluZWQsIHRydWUpOwotfTsK
KyAgYGBgCisgICAgPiB0ZW1wbGF0ZUNvbnRleHQuZ2V0KCdmb28nKSAvLyAtPiAiPHZhbHVlIG9m
IHt7Zm9vfX0+IgorICBgYGAKKworICBAbWV0aG9kIGRlYnVnZ2VyCisgIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQorKi8KK0VtYmVyLkhh
bmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2RlYnVnZ2VyJywgZnVuY3Rpb24gZGVidWdnZXJIZWxw
ZXIob3B0aW9ucykgewogCi0vLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgZm9yIEhhbmRsZWJhcnMg
cnVudGltZS1vbmx5Ci1pZiAoSGFuZGxlYmFycy5jb21waWxlKSB7Ci0gIC8qKgotICAgIFRoZSBl
bnRyeSBwb2ludCBmb3IgRW1iZXIgSGFuZGxlYmFycy4gVGhpcyByZXBsYWNlcyB0aGUgZGVmYXVs
dAotICAgIGBIYW5kbGViYXJzLmNvbXBpbGVgIGFuZCB0dXJucyBvbiB0ZW1wbGF0ZS1sb2NhbCBk
YXRhIGFuZCBTdHJpbmcKLSAgICBwYXJhbWV0ZXJzLgorICAvLyBUaGVzZSBhcmUgaGVscGZ1bCB2
YWx1ZXMgeW91IGNhbiBpbnNwZWN0IHdoaWxlIGRlYnVnZ2luZy4KKyAgdmFyIHRlbXBsYXRlQ29u
dGV4dCA9IHRoaXM7CisgIHZhciB0eXBlT2ZUZW1wbGF0ZUNvbnRleHQgPSBFbWJlci5pbnNwZWN0
KHRlbXBsYXRlQ29udGV4dCk7CiAKLSAgICBAbWV0aG9kIGNvbXBpbGUKLSAgICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUg
dGVtcGxhdGUgdG8gY29tcGlsZQotICAgIEByZXR1cm4ge0Z1bmN0aW9ufQotICAqLwotICBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICB2YXIgYXN0ID0g
SGFuZGxlYmFycy5wYXJzZShzdHJpbmcpOwotICAgIHZhciBvcHRpb25zID0geyBkYXRhOiB0cnVl
LCBzdHJpbmdQYXJhbXM6IHRydWUgfTsKLSAgICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIu
SGFuZGxlYmFycy5Db21waWxlcigpLmNvbXBpbGUoYXN0LCBvcHRpb25zKTsKLSAgICB2YXIgdGVt
cGxhdGVTcGVjID0gbmV3IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29t
cGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTsKKyAgZGVidWdnZXI7
Cit9KTsKIAotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKHRlbXBsYXRlU3Bl
Yyk7Ci0gIH07Ci19CiAKIAogfSkoKTsKIAotKGZ1bmN0aW9uKCkgewotdmFyIHNsaWNlID0gQXJy
YXkucHJvdG90eXBlLnNsaWNlOwogCisKKyhmdW5jdGlvbigpIHsKIC8qKgotICBAcHJpdmF0ZQor
QG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCisqLwogCi0gIElmIGEg
cGF0aCBzdGFydHMgd2l0aCBhIHJlc2VydmVkIGtleXdvcmQsIHJldHVybnMgdGhlIHJvb3QKLSAg
dGhhdCBzaG91bGQgYmUgdXNlZC4KK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKIAotICBAbWV0aG9kIG5vcm1hbGl6ZVBhdGgKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gcm9v
dCB7T2JqZWN0fQotICBAcGFyYW0gcGF0aCB7U3RyaW5nfQotICBAcGFyYW0gZGF0YSB7SGFzaH0K
LSovCi12YXIgbm9ybWFsaXplUGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aCA9
IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIGRhdGEpIHsKLSAgdmFyIGtleXdvcmRzID0gKGRhdGEgJiYg
ZGF0YS5rZXl3b3JkcykgfHwge30sCi0gICAgICBrZXl3b3JkLCBpc0tleXdvcmQ7CitFbWJlci5I
YW5kbGViYXJzLkVhY2hWaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKEVtYmVyLl9N
ZXRhbW9ycGgsIHsKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGl0ZW1Db250cm9sbGVy
ID0gZ2V0KHRoaXMsICdpdGVtQ29udHJvbGxlcicpOworICAgIHZhciBiaW5kaW5nOwogCi0gIC8v
IEdldCB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIHRoZQot
ICAvLyBwYXRoIGlzICJmb28uYmFyLmJheiIsIHJldHVybnMgImZvbyIuCi0gIGtleXdvcmQgPSBw
YXRoLnNwbGl0KCcuJywgMSlbMF07CisgICAgaWYgKGl0ZW1Db250cm9sbGVyKSB7CisgICAgICB2
YXIgY29udHJvbGxlciA9IGdldCh0aGlzLCAnY29udHJvbGxlci5jb250YWluZXInKS5sb29rdXBG
YWN0b3J5KCdjb250cm9sbGVyOmFycmF5JykuY3JlYXRlKHsKKyAgICAgICAgcGFyZW50Q29udHJv
bGxlcjogZ2V0KHRoaXMsICdjb250cm9sbGVyJyksCisgICAgICAgIGl0ZW1Db250cm9sbGVyOiBp
dGVtQ29udHJvbGxlciwKKyAgICAgICAgdGFyZ2V0OiBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSwK
KyAgICAgICAgX2VhY2hWaWV3OiB0aGlzCisgICAgICB9KTsKIAotICAvLyBUZXN0IHRvIHNlZSBp
ZiB0aGUgZmlyc3QgcGF0aCBpcyBhIGtleXdvcmQgdGhhdCBoYXMgYmVlbgotICAvLyBwYXNzZWQg
YWxvbmcgaW4gdGhlIHZpZXcncyBkYXRhIGhhc2guIElmIHNvLCB3ZSB3aWxsIHRyZWF0Ci0gIC8v
IHRoYXQgb2JqZWN0IGFzIHRoZSBuZXcgcm9vdC4KLSAgaWYgKGtleXdvcmRzLmhhc093blByb3Bl
cnR5KGtleXdvcmQpKSB7Ci0gICAgLy8gTG9vayB1cCB0aGUgdmFsdWUgaW4gdGhlIHRlbXBsYXRl
J3MgZGF0YSBoYXNoLgotICAgIHJvb3QgPSBrZXl3b3Jkc1trZXl3b3JkXTsKLSAgICBpc0tleXdv
cmQgPSB0cnVlOworICAgICAgdGhpcy5kaXNhYmxlQ29udGVudE9ic2VydmVycyhmdW5jdGlvbigp
IHsKKyAgICAgICAgc2V0KHRoaXMsICdjb250ZW50JywgY29udHJvbGxlcik7CisgICAgICAgIGJp
bmRpbmcgPSBuZXcgRW1iZXIuQmluZGluZygnY29udGVudCcsICdfZWFjaFZpZXcuZGF0YVNvdXJj
ZScpLm9uZVdheSgpOworICAgICAgICBiaW5kaW5nLmNvbm5lY3QoY29udHJvbGxlcik7CisgICAg
ICB9KTsKIAotICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgZW50aXJlIHBhdGggaXMgdGhl
IHJlc2VydmVkCi0gICAgLy8gd29yZC4gSW4gdGhhdCBjYXNlLCByZXR1cm4gdGhlIG9iamVjdCBp
dHNlbGYuCi0gICAgaWYgKHBhdGggPT09IGtleXdvcmQpIHsKLSAgICAgIHBhdGggPSAnJzsKKyAg
ICAgIHNldCh0aGlzLCAnX2FycmF5Q29udHJvbGxlcicsIGNvbnRyb2xsZXIpOwogICAgIH0gZWxz
ZSB7Ci0gICAgICAvLyBTdHJpcCB0aGUga2V5d29yZCBmcm9tIHRoZSBwYXRoIGFuZCBsb29rIHVw
Ci0gICAgICAvLyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIG5ld2x5IGZvdW5kIHJvb3QuCi0gICAg
ICBwYXRoID0gcGF0aC5zdWJzdHIoa2V5d29yZC5sZW5ndGgrMSk7CisgICAgICB0aGlzLmRpc2Fi
bGVDb250ZW50T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgeworICAgICAgICBiaW5kaW5nID0gbmV3IEVt
YmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnZGF0YVNvdXJjZScpLm9uZVdheSgpOworICAgICAgICBi
aW5kaW5nLmNvbm5lY3QodGhpcyk7CisgICAgICB9KTsKICAgICB9Ci0gIH0KIAotICByZXR1cm4g
eyByb290OiByb290LCBwYXRoOiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29yZCB9OwotfTsKKyAg
ICByZXR1cm4gdGhpcy5fc3VwZXIoKTsKKyAgfSwKIAorICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5j
dGlvbihjb250ZW50KSB7CisgICAgRW1iZXIuYXNzZXJ0KCJUaGUgdmFsdWUgdGhhdCAjZWFjaCBs
b29wcyBvdmVyIG11c3QgYmUgYW4gQXJyYXkuIFlvdSBwYXNzZWQgIiArIGNvbnRlbnQuY29uc3Ry
dWN0b3IgKyAiLCBidXQgaXQgc2hvdWxkIGhhdmUgYmVlbiBhbiBBcnJheUNvbnRyb2xsZXIiLCAh
RW1iZXIuQ29udHJvbGxlck1peGluLmRldGVjdChjb250ZW50KSB8fCAoY29udGVudCAmJiBjb250
ZW50LmlzR2VuZXJhdGVkKSB8fCBjb250ZW50IGluc3RhbmNlb2YgRW1iZXIuQXJyYXlDb250cm9s
bGVyKTsKKyAgICBFbWJlci5hc3NlcnQoIlRoZSB2YWx1ZSB0aGF0ICNlYWNoIGxvb3BzIG92ZXIg
bXVzdCBiZSBhbiBBcnJheS4gWW91IHBhc3NlZCAiICsgKChFbWJlci5Db250cm9sbGVyTWl4aW4u
ZGV0ZWN0KGNvbnRlbnQpICYmIGNvbnRlbnQuZ2V0KCdtb2RlbCcpICE9PSB1bmRlZmluZWQpID8g
KCIiICsgY29udGVudC5nZXQoJ21vZGVsJykgKyAiICh3cmFwcGVkIGluICIgKyBjb250ZW50ICsg
IikiKSA6ICgiIiArIGNvbnRlbnQpKSwgRW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsKKyAg
fSwKIAotLyoqCi0gIExvb2t1cCBib3RoIG9uIHJvb3QgYW5kIG9uIHdpbmRvdy4gSWYgdGhlIHBh
dGggc3RhcnRzIHdpdGgKLSAgYSBrZXl3b3JkLCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Qgd2ls
bCBiZSBsb29rZWQgdXAgaW4gdGhlCi0gIHRlbXBsYXRlJ3MgZGF0YSBoYXNoIGFuZCB1c2VkIHRv
IHJlc29sdmUgdGhlIHBhdGguCisgIGRpc2FibGVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbihj
YWxsYmFjaykgeworICAgIEVtYmVyLnJlbW92ZUJlZm9yZU9ic2VydmVyKHRoaXMsICdjb250ZW50
JywgbnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScpOworICAgIEVtYmVyLnJlbW92ZU9ic2VydmVy
KHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50RGlkQ2hhbmdlJyk7CiAKLSAgQG1ldGhv
ZCBnZXQKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gIEBwYXJhbSB7T2JqZWN0fSByb290IFRo
ZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgcHJvcGVydHkgb24KLSAgQHBhcmFtIHtTdHJpbmd9IHBh
dGggVGhlIHBhdGggdG8gYmUgbG9va2VkdXAKLSAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhl
IHRlbXBsYXRlJ3Mgb3B0aW9uIGhhc2gKLSovCi12YXIgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhh
bmRsZWJhcnMuZ2V0ID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwgb3B0aW9ucykgewotICB2YXIgZGF0
YSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kYXRhLAotICAgICAgbm9ybWFsaXplZFBhdGggPSBub3Jt
YWxpemVQYXRoKHJvb3QsIHBhdGgsIGRhdGEpLAotICAgICAgdmFsdWU7CisgICAgY2FsbGJhY2su
Y2FsbCh0aGlzKTsKIAotICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGF0aCBiZWdpbnMgd2l0aCBh
IGtleXdvcmQsIGNoYW5nZSB0aGUKLSAgLy8gcm9vdCB0byB0aGUgdmFsdWUgcmVwcmVzZW50ZWQg
YnkgdGhhdCBrZXl3b3JkLCBhbmQgZW5zdXJlCi0gIC8vIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRv
IGl0LgotICByb290ID0gbm9ybWFsaXplZFBhdGgucm9vdDsKLSAgcGF0aCA9IG5vcm1hbGl6ZWRQ
YXRoLnBhdGg7CisgICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcywgJ2NvbnRlbnQnLCBu
dWxsLCAnX2NvbnRlbnRXaWxsQ2hhbmdlJyk7CisgICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywg
J2NvbnRlbnQnLCBudWxsLCAnX2NvbnRlbnREaWRDaGFuZ2UnKTsKKyAgfSwKIAotICB2YWx1ZSA9
IEVtYmVyLmdldChyb290LCBwYXRoKTsKKyAgaXRlbVZpZXdDbGFzczogRW1iZXIuX01ldGFtb3Jw
aFZpZXcsCisgIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmlldywKIAotICAvLyBJ
ZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLCBsb29rIGl0IHVwIG9uIEVt
YmVyLmxvb2t1cCwKLSAgLy8gd2hpY2ggZGVmYXVsdHMgdG8gdGhlIGB3aW5kb3dgIG9iamVjdCBp
biBicm93c2Vycy4KLSAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcm9vdCAhPT0gRW1iZXIu
bG9va3VwICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAgIHZhbHVlID0gRW1iZXIu
Z2V0KEVtYmVyLmxvb2t1cCwgcGF0aCk7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfTsKLUVtYmVy
LkhhbmRsZWJhcnMuZ2V0UGF0aCA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoJ2BFbWJlci5IYW5kbGVi
YXJzLmdldFBhdGhgIGhhcyBiZWVuIGNoYW5nZWQgdG8gYEVtYmVyLkhhbmRsZWJhcnMuZ2V0YCBm
b3IgY29uc2lzdGVuY3kuJywgRW1iZXIuSGFuZGxlYmFycy5nZXQpOworICBjcmVhdGVDaGlsZFZp
ZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7CisgICAgdmlldyA9IHRoaXMuX3N1cGVyKHZpZXcs
IGF0dHJzKTsKIAotRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlUGFyYW1zID0gZnVuY3Rpb24oY29u
dGV4dCwgcGFyYW1zLCBvcHRpb25zKSB7Ci0gIHZhciByZXNvbHZlZFBhcmFtcyA9IFtdLCB0eXBl
cyA9IG9wdGlvbnMudHlwZXMsIHBhcmFtLCB0eXBlOworICAgIC8vIEF0IHRoZSBtb21lbnQsIGlm
IGEgY29udGFpbmVyIHZpZXcgc3ViY2xhc3Mgd2FudHMKKyAgICAvLyB0byBpbnNlcnQga2V5d29y
ZHMsIGl0IGlzIHJlc3BvbnNpYmxlIGZvciBjbG9uaW5nCisgICAgLy8gdGhlIGtleXdvcmRzIGhh
c2guIFRoaXMgd2lsbCBiZSBmaXhlZCBtb21lbnRhcmlseS4KKyAgICB2YXIga2V5d29yZCA9IGdl
dCh0aGlzLCAna2V5d29yZCcpOworICAgIHZhciBjb250ZW50ID0gZ2V0KHZpZXcsICdjb250ZW50
Jyk7CiAKLSAgZm9yICh2YXIgaT0wLCBsPXBhcmFtcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
cGFyYW0gPSBwYXJhbXNbaV07Ci0gICAgdHlwZSA9IHR5cGVzW2ldOworICAgIGlmIChrZXl3b3Jk
KSB7CisgICAgICB2YXIgZGF0YSA9IGdldCh2aWV3LCAndGVtcGxhdGVEYXRhJyk7CiAKLSAgICBp
ZiAodHlwZSA9PT0gJ0lEJykgewotICAgICAgcmVzb2x2ZWRQYXJhbXMucHVzaChoYW5kbGViYXJz
R2V0KGNvbnRleHQsIHBhcmFtLCBvcHRpb25zKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc29s
dmVkUGFyYW1zLnB1c2gocGFyYW0pOworICAgICAgZGF0YSA9IEVtYmVyLmNvcHkoZGF0YSk7Cisg
ICAgICBkYXRhLmtleXdvcmRzID0gdmlldy5jbG9uZUtleXdvcmRzKCk7CisgICAgICBzZXQodmll
dywgJ3RlbXBsYXRlRGF0YScsIGRhdGEpOworCisgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGRv
IG5vdCBiaW5kLCBiZWNhdXNlIHRoZSBgY29udGVudGAgb2YKKyAgICAgIC8vIGEgI2VhY2ggaXRl
bSBjYW5ub3QgY2hhbmdlLgorICAgICAgZGF0YS5rZXl3b3Jkc1trZXl3b3JkXSA9IGNvbnRlbnQ7
CiAgICAgfQotICB9CiAKLSAgcmV0dXJuIHJlc29sdmVkUGFyYW1zOwotfTsKKyAgICAvLyBJZiB7
eyNlYWNofX0gaXMgbG9vcGluZyBvdmVyIGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzLAorICAgIC8v
IHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVpciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCisg
ICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNvbnRlbnQsICdpc0NvbnRyb2xsZXInKSkgeworICAgICAg
c2V0KHZpZXcsICdjb250cm9sbGVyJywgY29udGVudCk7CisgICAgfQogCi1FbWJlci5IYW5kbGVi
YXJzLnJlc29sdmVIYXNoID0gZnVuY3Rpb24oY29udGV4dCwgaGFzaCwgb3B0aW9ucykgewotICB2
YXIgcmVzb2x2ZWRIYXNoID0ge30sIHR5cGVzID0gb3B0aW9ucy5oYXNoVHlwZXMsIHR5cGU7Cisg
ICAgcmV0dXJuIHZpZXc7CisgIH0sCiAKLSAgZm9yICh2YXIga2V5IGluIGhhc2gpIHsKLSAgICBp
ZiAoIWhhc2guaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQorICBkZXN0cm95OiBm
dW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMuX3N1cGVyKCkpIHsgcmV0dXJuOyB9CiAKLSAgICB0
eXBlID0gdHlwZXNba2V5XTsKKyAgICB2YXIgYXJyYXlDb250cm9sbGVyID0gZ2V0KHRoaXMsICdf
YXJyYXlDb250cm9sbGVyJyk7CiAKLSAgICBpZiAodHlwZSA9PT0gJ0lEJykgewotICAgICAgcmVz
b2x2ZWRIYXNoW2tleV0gPSBoYW5kbGViYXJzR2V0KGNvbnRleHQsIGhhc2hba2V5XSwgb3B0aW9u
cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc29sdmVkSGFzaFtrZXldID0gaGFzaFtrZXldOwor
ICAgIGlmIChhcnJheUNvbnRyb2xsZXIpIHsKKyAgICAgIGFycmF5Q29udHJvbGxlci5kZXN0cm95
KCk7CiAgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CiAgIH0KK30pOwogCi0gIHJldHVybiByZXNv
bHZlZEhhc2g7Cit2YXIgR3JvdXBlZEVhY2ggPSBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNo
ID0gZnVuY3Rpb24oY29udGV4dCwgcGF0aCwgb3B0aW9ucykgeworICB2YXIgc2VsZiA9IHRoaXMs
CisgICAgICBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKGNvbnRl
eHQsIHBhdGgsIG9wdGlvbnMuZGF0YSk7CisKKyAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAg
dGhpcy5wYXRoID0gcGF0aDsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgdGhpcy50ZW1w
bGF0ZSA9IG9wdGlvbnMuZm47CisgIHRoaXMuY29udGFpbmluZ1ZpZXcgPSBvcHRpb25zLmRhdGEu
dmlldzsKKyAgdGhpcy5ub3JtYWxpemVkUm9vdCA9IG5vcm1hbGl6ZWQucm9vdDsKKyAgdGhpcy5u
b3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWQucGF0aDsKKyAgdGhpcy5jb250ZW50ID0gdGhpcy5s
b29rdXBDb250ZW50KCk7CisKKyAgdGhpcy5hZGRDb250ZW50T2JzZXJ2ZXJzKCk7CisgIHRoaXMu
YWRkQXJyYXlPYnNlcnZlcnMoKTsKKworICB0aGlzLmNvbnRhaW5pbmdWaWV3Lm9uKCd3aWxsQ2xl
YXJSZW5kZXInLCBmdW5jdGlvbigpIHsKKyAgICBzZWxmLmRlc3Ryb3koKTsKKyAgfSk7CiB9Owog
Ci0vKioKLSAgQHByaXZhdGUKK0dyb3VwZWRFYWNoLnByb3RvdHlwZSA9IHsKKyAgY29udGVudFdp
bGxDaGFuZ2U6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKTsK
KyAgfSwKIAotICBSZWdpc3RlcnMgYSBoZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdpbGwgYmUg
Y2FsbGVkIGlmIG5vIHByb3BlcnR5IHdpdGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJlIGZvdW5k
IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgKLSAgdGhh
dCBuYW1lIGlzIHJlZ2lzdGVyZWQuCisgIGNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewor
ICAgIHRoaXMuY29udGVudCA9IHRoaXMubG9va3VwQ29udGVudCgpOworICAgIHRoaXMuYWRkQXJy
YXlPYnNlcnZlcnMoKTsKKyAgICB0aGlzLnJlcmVuZGVyQ29udGFpbmluZ1ZpZXcoKTsKKyAgfSwK
IAotICBUaGlzIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUgaGVscGZ1bCBlcnJvciBt
ZXNzYWdlIHNvIHRoZSB1c2VyIGNhbgotICB0cmFjayBkb3duIHdoZXJlIHRoZSBwcm9ibGVtIGlz
IGhhcHBlbmluZy4KKyAgY29udGVudEFycmF5V2lsbENoYW5nZTogRW1iZXIuSywKIAotICBAbWV0
aG9kIGhlbHBlck1pc3NpbmcKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBh
cmFtIHtTdHJpbmd9IHBhdGgKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0qLwotRW1iZXIuSGFu
ZGxlYmFycy5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKHBhdGgsIG9w
dGlvbnMpIHsKLSAgdmFyIGVycm9yLCB2aWV3ID0gIiI7CisgIGNvbnRlbnRBcnJheURpZENoYW5n
ZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5yZXJlbmRlckNvbnRhaW5pbmdWaWV3KCk7CisgIH0s
CiAKLSAgZXJyb3IgPSAiJUAgSGFuZGxlYmFycyBlcnJvcjogQ291bGQgbm90IGZpbmQgcHJvcGVy
dHkgJyVAJyBvbiBvYmplY3QgJUAuIjsKLSAgaWYgKG9wdGlvbnMuZGF0YSl7Ci0gICAgdmlldyA9
IG9wdGlvbnMuZGF0YS52aWV3OworICBsb29rdXBDb250ZW50OiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXQodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3Jt
YWxpemVkUGF0aCwgdGhpcy5vcHRpb25zKTsKKyAgfSwKKworICBhZGRBcnJheU9ic2VydmVyczog
ZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9CisKKyAgICB0
aGlzLmNvbnRlbnQuYWRkQXJyYXlPYnNlcnZlcih0aGlzLCB7CisgICAgICB3aWxsQ2hhbmdlOiAn
Y29udGVudEFycmF5V2lsbENoYW5nZScsCisgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlE
aWRDaGFuZ2UnCisgICAgfSk7CisgIH0sCisKKyAgcmVtb3ZlQXJyYXlPYnNlcnZlcnM6IGZ1bmN0
aW9uKCkgeworICAgIGlmICghdGhpcy5jb250ZW50KSB7IHJldHVybjsgfQorCisgICAgdGhpcy5j
b250ZW50LnJlbW92ZUFycmF5T2JzZXJ2ZXIodGhpcywgeworICAgICAgd2lsbENoYW5nZTogJ2Nv
bnRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlk
Q2hhbmdlJworICAgIH0pOworICB9LAorCisgIGFkZENvbnRlbnRPYnNlcnZlcnM6IGZ1bmN0aW9u
KCkgeworICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMubm9ybWFsaXplZFJvb3QsIHRo
aXMubm9ybWFsaXplZFBhdGgsIHRoaXMsIHRoaXMuY29udGVudFdpbGxDaGFuZ2UpOworICAgIEVt
YmVyLmFkZE9ic2VydmVyKHRoaXMubm9ybWFsaXplZFJvb3QsIHRoaXMubm9ybWFsaXplZFBhdGgs
IHRoaXMsIHRoaXMuY29udGVudERpZENoYW5nZSk7CisgIH0sCisKKyAgcmVtb3ZlQ29udGVudE9i
c2VydmVyczogZnVuY3Rpb24oKSB7CisgICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIodGhp
cy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcy5jb250ZW50V2lsbENo
YW5nZSk7CisgICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhp
cy5ub3JtYWxpemVkUGF0aCwgdGhpcy5jb250ZW50RGlkQ2hhbmdlKTsKKyAgfSwKKworICByZW5k
ZXI6IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy5jb250ZW50KSB7IHJldHVybjsgfQorCisg
ICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQsCisgICAgICAgIGNvbnRlbnRMZW5ndGggPSBn
ZXQoY29udGVudCwgJ2xlbmd0aCcpLAorICAgICAgICBkYXRhID0gdGhpcy5vcHRpb25zLmRhdGEs
CisgICAgICAgIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTsKKworICAgIGRhdGEuaW5zaWRlRWFj
aCA9IHRydWU7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50TGVuZ3RoOyBpKyspIHsK
KyAgICAgIHRlbXBsYXRlKGNvbnRlbnQub2JqZWN0QXQoaSksIHsgZGF0YTogZGF0YSB9KTsKKyAg
ICB9CisgIH0sCisKKyAgcmVyZW5kZXJDb250YWluaW5nVmlldzogZnVuY3Rpb24oKSB7CisgICAg
dmFyIHNlbGYgPSB0aGlzOworICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRo
aXMsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gSXQncyBwb3NzaWJsZSBpdCdzIGJlZW4gZGVzdHJv
eWVkIGFmdGVyIHdlIGVucXVldWVkIGEgcmUtcmVuZGVyIGNhbGwuCisgICAgICBpZiAoIXNlbGYu
ZGVzdHJveWVkKSB7CisgICAgICAgIHNlbGYuY29udGFpbmluZ1ZpZXcucmVyZW5kZXIoKTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBkZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICB0aGlz
LnJlbW92ZUNvbnRlbnRPYnNlcnZlcnMoKTsKKyAgICBpZiAodGhpcy5jb250ZW50KSB7CisgICAg
ICB0aGlzLnJlbW92ZUFycmF5T2JzZXJ2ZXJzKCk7CisgICAgfQorICAgIHRoaXMuZGVzdHJveWVk
ID0gdHJ1ZTsKICAgfQotICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuU3RyaW5nLmZtdChl
cnJvciwgW3ZpZXcsIHBhdGgsIHRoaXNdKSk7Ci19KTsKK307CiAKIC8qKgotICBSZWdpc3RlciBh
IGJvdW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBoZWxwZXJzIGJlaGF2ZSBzaW1pbGFybHkg
dG8gcmVndWxhcgotICBoYW5kbGViYXJzIGhlbHBlcnMsIHdpdGggdGhlIGFkZGVkIGFiaWxpdHkg
dG8gcmUtcmVuZGVyIHdoZW4gdGhlIHVuZGVybHlpbmcgZGF0YQotICBjaGFuZ2VzLgotCi0gICMj
IFNpbXBsZSBleGFtcGxlCisgIFRoZSBge3sjZWFjaH19YCBoZWxwZXIgbG9vcHMgb3ZlciBlbGVt
ZW50cyBpbiBhIGNvbGxlY3Rpb24sIHJlbmRlcmluZyBpdHMKKyAgYmxvY2sgb25jZSBmb3IgZWFj
aCBpdGVtLiBJdCBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGJhc2UgSGFuZGxlYmFycyBge3sjZWFj
aH19YAorICBoZWxwZXI6CiAKICAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLnJl
Z2lzdGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemUnLCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJl
dHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotICB9KTsKKyAgRGV2ZWxvcGVycyA9IFt7bmFtZTog
J1llaHVkYSd9LHtuYW1lOiAnVG9tJ30sIHtuYW1lOiAnUGF1bCd9XTsKICAgYGBgCiAKLSAgVGhl
IGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVzIGFzIGZv
bGxvd3M6Ci0KICAgYGBgaGFuZGxlYmFycwotICB7e2NhcGl0YWxpemUgbmFtZX19CisgIHt7I2Vh
Y2ggRGV2ZWxvcGVyc319CisgICAge3tuYW1lfX0KKyAge3svZWFjaH19CiAgIGBgYAogCi0gIElu
IHRoaXMgY2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHRoZSB0ZW1wbGF0ZSdzIGNv
bnRleHQgY2hhbmdlcywKLSAgdGhlIHJlbmRlcmVkIHZhbHVlIG9mIHRoZSBoZWxwZXIgd2lsbCB1
cGRhdGUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgYHt7ZWFjaH19YCBzdXBwb3J0cyBhbiBh
bHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVtZW50IG5hbWluZzoKIAotICAjIyBFeGFtcGxlIHdp
dGggb3B0aW9ucworICBgYGBoYW5kbGViYXJzCisgIHt7I2VhY2ggcGVyc29uIGluIERldmVsb3Bl
cnN9fQorICAgIHt7cGVyc29uLm5hbWV9fQorICB7ey9lYWNofX0KKyAgYGBgCiAKLSAgTGlrZSBu
b3JtYWwgaGFuZGxlYmFycyBoZWxwZXJzLCBib3VuZCBoZWxwZXJzIGhhdmUgYWNjZXNzIHRvIHRo
ZSBvcHRpb25zCi0gIHBhc3NlZCBpbnRvIHRoZSBoZWxwZXIgY2FsbC4KKyAgV2hlbiBsb29waW5n
IG92ZXIgb2JqZWN0cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMsIGB7e3RoaXN9fWAgY2Fu
IGJlIHVzZWQKKyAgdG8gcmVuZGVyIHRoZSBvYmplY3Q6CiAKICAgYGBgamF2YXNjcmlwdAotICBF
bWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ3JlcGVhdCcsIGZ1bmN0aW9uKHZh
bHVlLCBvcHRpb25zKSB7Ci0gICAgdmFyIGNvdW50ID0gb3B0aW9ucy5oYXNoLmNvdW50OwotICAg
IHZhciBhID0gW107Ci0gICAgd2hpbGUoYS5sZW5ndGggPCBjb3VudCl7Ci0gICAgICAgIGEucHVz
aCh2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBhLmpvaW4oJycpOwotICB9KTsKKyAgRGV2ZWxv
cGVyTmFtZXMgPSBbJ1llaHVkYScsICdUb20nLCAnUGF1bCddCiAgIGBgYAogCi0gIFRoaXMgaGVs
cGVyIGNvdWxkIGJlIHVzZWQgaW4gYSB0ZW1wbGF0ZSBhcyBmb2xsb3dzOgotCiAgIGBgYGhhbmRs
ZWJhcnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudD0zfX0KKyAge3sjZWFjaCBEZXZlbG9wZXJOYW1l
c319CisgICAge3t0aGlzfX0KKyAge3svZWFjaH19CiAgIGBgYAorICAjIyMge3tlbHNlfX0gY29u
ZGl0aW9uCisgIGB7eyNlYWNofX1gIGNhbiBoYXZlIGEgbWF0Y2hpbmcgYHt7ZWxzZX19YC4gVGhl
IGNvbnRlbnRzIG9mIHRoaXMgYmxvY2sgd2lsbCByZW5kZXIKKyAgaWYgdGhlIGNvbGxlY3Rpb24g
aXMgZW1wdHkuCiAKLSAgIyMgRXhhbXBsZSB3aXRoIGJvdW5kIG9wdGlvbnMKKyAgYGBgCisgIHt7
I2VhY2ggcGVyc29uIGluIERldmVsb3BlcnN9fQorICAgIHt7cGVyc29uLm5hbWV9fQorICB7e2Vs
c2V9fQorICAgIDxwPlNvcnJ5LCBub2JvZHkgaXMgYXZhaWxhYmxlIGZvciB0aGlzIHRhc2suPC9w
PgorICB7ey9lYWNofX0KKyAgYGBgCisgICMjIyBTcGVjaWZ5aW5nIGEgVmlldyBjbGFzcyBmb3Ig
aXRlbXMKKyAgSWYgeW91IHByb3ZpZGUgYW4gYGl0ZW1WaWV3Q2xhc3NgIG9wdGlvbiB0aGF0IHJl
ZmVyZW5jZXMgYSB2aWV3IGNsYXNzCisgIHdpdGggaXRzIG93biBgdGVtcGxhdGVgIHlvdSBjYW4g
b21pdCB0aGUgYmxvY2suCiAKLSAgQm91bmQgaGFzaCBvcHRpb25zIGFyZSBhbHNvIHN1cHBvcnRl
ZC4gRXhhbXBsZTogCisgIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6CiAKICAgYGBgaGFuZGxlYmFy
cwotICB7e3JlcGVhdCB0ZXh0IGNvdW50QmluZGluZz0ibnVtUmVwZWF0cyJ9fQorICB7eyN2aWV3
IEFwcC5NeVZpZXcgfX0KKyAgICB7e2VhY2ggdmlldy5pdGVtcyBpdGVtVmlld0NsYXNzPSJBcHAu
QW5JdGVtVmlldyJ9fQorICB7ey92aWV3fX0KICAgYGBgCiAKLSAgSW4gdGhpcyBleGFtcGxlLCBj
b3VudCB3aWxsIGJlIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZgotICB0aGUgYG51bVJlcGVhdHNgIHBy
b3BlcnR5IG9uIHRoZSBjb250ZXh0LiBJZiB0aGF0IHByb3BlcnR5Ci0gIGNoYW5nZXMsIHRoZSBo
ZWxwZXIgd2lsbCBiZSByZS1yZW5kZXJlZC4KKyAgQW5kIGFwcGxpY2F0aW9uIGNvZGUKIAotICAj
IyBFeGFtcGxlIHdpdGggZXh0cmEgZGVwZW5kZW5jaWVzCisgIGBgYGphdmFzY3JpcHQKKyAgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICBNeVZpZXc6IEVtYmVyLlZpZXcuZXh0
ZW5kKHsKKyAgICAgIGl0ZW1zOiBbCisgICAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6
ICdEYXZlJ30pLAorICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwK
KyAgICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKKyAgICAgIF0KKyAg
ICB9KQorICB9KTsKIAotICBUaGUgYEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBl
cmAgbWV0aG9kIHRha2VzIGEgdmFyaWFibGUgbGVuZ3RoCi0gIHRoaXJkIHBhcmFtZXRlciB3aGlj
aCBpbmRpY2F0ZXMgZXh0cmEgZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXNzZWQgaW4gdmFsdWUuCi0g
IFRoaXMgYWxsb3dzIHRoZSBoYW5kbGViYXJzIGhlbHBlciB0byB1cGRhdGUgd2hlbiB0aGVzZSBk
ZXBlbmRlbmNpZXMgY2hhbmdlLgorICBBcHAuQW5JdGVtVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKKyAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJHcmVldGluZ3Mge3tu
YW1lfX0iKQorICB9KTsKKyAgYGBgCiAKLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGVi
YXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemVOYW1lJywgZnVuY3Rpb24odmFsdWUp
IHsKLSAgICByZXR1cm4gdmFsdWUuZ2V0KCduYW1lJykudG9VcHBlckNhc2UoKTsKLSAgfSwgJ25h
bWUnKTsKKyAgV2lsbCByZXN1bHQgaW4gdGhlIEhUTUwgc3RydWN0dXJlIGJlbG93CisKKyAgYGBg
aHRtbAorICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICA8ZGl2IGNsYXNzPSJlbWJlci12
aWV3Ij5HcmVldGluZ3MgRGF2ZTwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdy
ZWV0aW5ncyBNYXJ5PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdz
IFNhcmE8L2Rpdj4KKyAgPC9kaXY+CiAgIGBgYAogCi0gICMjIEV4YW1wbGUgd2l0aCBtdWx0aXBs
ZSBib3VuZCBwcm9wZXJ0aWVzCisgIElmIGFuIGBpdGVtVmlld0NsYXNzYCBpcyBkZWZpbmVkIG9u
IHRoZSBoZWxwZXIsIGFuZCB0aGVyZWZvcmUgdGhlIGhlbHBlciBpcyBub3QKKyAgYmVpbmcgdXNl
ZCBhcyBhIGJsb2NrLCBhbiBgZW1wdHlWaWV3Q2xhc3NgIGNhbiBhbHNvIGJlIHByb3ZpZGVkIG9w
dGlvbmFsbHkuCisgIFRoZSBgZW1wdHlWaWV3Q2xhc3NgIHdpbGwgbWF0Y2ggdGhlIGJlaGF2aW9y
IG9mIHRoZSBge3tlbHNlfX1gIGNvbmRpdGlvbgorICBkZXNjcmliZWQgYWJvdmUuIFRoYXQgaXMs
IHRoZSBgZW1wdHlWaWV3Q2xhc3NgIHdpbGwgcmVuZGVyIGlmIHRoZSBjb2xsZWN0aW9uCisgIGlz
IGVtcHR5LgogCi0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIHN1cHBv
cnRzIGJpbmRpbmcgdG8KLSAgbXVsdGlwbGUgcHJvcGVydGllcywgZS5nLjoKKyAgIyMjIFJlcHJl
c2VudGluZyBlYWNoIGl0ZW0gd2l0aCBhIENvbnRyb2xsZXIuCisgIEJ5IGRlZmF1bHQgdGhlIGNv
bnRyb2xsZXIgbG9va3VwIHdpdGhpbiBhbiBge3sjZWFjaH19YCBibG9jayB3aWxsIGJlCisgIHRo
ZSBjb250cm9sbGVyIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZSB0aGUgYHt7I2VhY2h9fWAgd2FzIHVz
ZWQuIElmIGVhY2gKKyAgaXRlbSBuZWVkcyB0byBiZSBwcmVzZW50ZWQgYnkgYSBjdXN0b20gY29u
dHJvbGxlciB5b3UgY2FuIHByb3ZpZGUgYQorICBgaXRlbUNvbnRyb2xsZXJgIG9wdGlvbiB3aGlj
aCByZWZlcmVuY2VzIGEgY29udHJvbGxlciBieSBsb29rdXAgbmFtZS4KKyAgRWFjaCBpdGVtIGlu
IHRoZSBsb29wIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xs
ZXIKKyAgYW5kIHRoZSBpdGVtIGl0c2VsZiB3aWxsIGJlIHNldCB0byB0aGUgYGNvbnRlbnRgIHBy
b3BlcnR5IG9mIHRoYXQgY29udHJvbGxlci4KKworICBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3
aGVyZSBwcm9wZXJ0aWVzIG9mIG1vZGVsIG9iamVjdHMgbmVlZCB0cmFuc2Zvcm1hdGlvbgorICBv
ciBzeW50aGVzaXMgZm9yIGRpc3BsYXk6CiAKICAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5k
bGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ2NvbmNhdGVuYXRlJywgZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07Ci0gICAgcmV0
dXJuIHZhbHVlcy5qb2luKCd8fCcpOwotICB9KTsKKyAgQXBwLkRldmVsb3BlckNvbnRyb2xsZXIg
PSBFbWJlci5PYmplY3RDb250cm9sbGVyLmV4dGVuZCh7CisgICAgaXNBdmFpbGFibGVGb3JIaXJl
OiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAhdGhpcy5nZXQoJ2NvbnRlbnQuaXNFbXBsb3ll
ZCcpICYmIHRoaXMuZ2V0KCdjb250ZW50LmlzU2Vla2luZ1dvcmsnKTsKKyAgICB9LnByb3BlcnR5
KCdpc0VtcGxveWVkJywgJ2lzU2Vla2luZ1dvcmsnKQorICB9KQogICBgYGAKIAotICBXaGljaCBh
bGxvd3MgZm9yIHRlbXBsYXRlIHN5bnRheCBzdWNoIGFzIHt7Y29uY2F0ZW5hdGUgcHJvcDEgcHJv
cDJ9fSBvcgotICB7e2NvbmNhdGVuYXRlIHByb3AxIHByb3AyIHByb3AzfX0uIElmIGFueSBvZiB0
aGUgcHJvcGVydGllcyBjaGFuZ2UsCi0gIHRoZSBoZWxwciB3aWxsIHJlLXJlbmRlci4gIE5vdGUg
dGhhdCBkZXBlbmRlbmN5IGtleXMgY2Fubm90IGJlCi0gIHVzaW5nIGluIGNvbmp1bmN0aW9uIHdp
dGggbXVsdGktcHJvcGVydHkgaGVscGVycywgc2luY2UgaXQgaXMgYW1iaWd1b3VzCi0gIHdoaWNo
IHByb3BlcnR5IHRoZSBkZXBlbmRlbnQga2V5cyB3b3VsZCBiZWxvbmcgdG8uIAotICAKLSAgIyMg
VXNlIHdpdGggdW5ib3VuZCBoZWxwZXIKKyAgYGBgaGFuZGxlYmFycworICB7eyNlYWNoIHBlcnNv
biBpbiBkZXZlbG9wZXJzIGl0ZW1Db250cm9sbGVyPSJkZXZlbG9wZXIifX0KKyAgICB7e3BlcnNv
bi5uYW1lfX0ge3sjaWYgcGVyc29uLmlzQXZhaWxhYmxlRm9ySGlyZX19SGlyZSBtZSF7ey9pZn19
CisgIHt7L2VhY2h9fQorICBgYGAKIAotICBUaGUge3t1bmJvdW5kfX0gaGVscGVyIGNhbiBiZSB1
c2VkIHdpdGggYm91bmQgaGVscGVyIGludm9jYXRpb25zIAotICB0byByZW5kZXIgdGhlbSBpbiB0
aGVpciB1bmJvdW5kIGZvcm0sIGUuZy4KKyAgRWFjaCBpdGVtQ29udHJvbGxlciB3aWxsIHJlY2Vp
dmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciBhcworICBhIGBwYXJlbnRD
b250cm9sbGVyYCBwcm9wZXJ0eS4KKworICAjIyMgKEV4cGVyaW1lbnRhbCkgR3JvdXBlZCBFYWNo
CisKKyAgV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGV4cGVyaW1lbnRhbCBbZ3Jv
dXAgaGVscGVyXShodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9ncm91cC1oZWxwZXIpLAorICB5
b3UgY2FuIGluZm9ybSBIYW5kbGViYXJzIHRvIHJlLXJlbmRlciBhbiBlbnRpcmUgZ3JvdXAgb2Yg
aXRlbXMgaW5zdGVhZCBvZgorICByZS1yZW5kZXJpbmcgdGhlbSBvbmUgYXQgYSB0aW1lIChpbiB0
aGUgZXZlbnQgdGhhdCB0aGV5IGFyZSBjaGFuZ2VkIGVuIG1hc3NlCisgIG9yIGFuIGl0ZW0gaXMg
YWRkZWQvcmVtb3ZlZCkuCiAKICAgYGBgaGFuZGxlYmFycwotICB7e3VuYm91bmQgY2FwaXRhbGl6
ZSBuYW1lfX0gCisgIHt7I2dyb3VwfX0KKyAgICB7eyNlYWNoIHBlb3BsZX19CisgICAgICB7e2Zp
cnN0TmFtZX19IHt7bGFzdE5hbWV9fQorICAgIHt7L2VhY2h9fQorICB7ey9ncm91cH19CiAgIGBg
YAogCi0gIEluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIG5hbWUgcHJvcGVydHkgY2hhbmdlcywgdGhl
IGhlbHBlcgotICB3aWxsIG5vdCByZS1yZW5kZXIuCisgIFRoaXMgY2FuIGJlIGZhc3RlciB0aGFu
IHRoZSBub3JtYWwgd2F5IHRoYXQgSGFuZGxlYmFycyByZS1yZW5kZXJzIGl0ZW1zCisgIGluIHNv
bWUgY2FzZXMuCiAKKyAgSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBoYXZlIGEgZ3JvdXAgd2l0aCBt
b3JlIHRoYW4gb25lIGAjZWFjaGAsIHlvdSBjYW4gbWFrZQorICBvbmUgb2YgdGhlIGNvbGxlY3Rp
b25zIGJlIHVwZGF0ZWQgaW4gbm9ybWFsIChub24tZ3JvdXBlZCkgZmFzaGlvbiBieSBzZXR0aW5n
CisgIHRoZSBvcHRpb24gYGdyb3VwZWRSb3dzPXRydWVgIChjb3VudGVyLWludHVpdGl2ZSwgSSBr
bm93KS4KIAotICBAbWV0aG9kIHJlZ2lzdGVyQm91bmRIZWxwZXIKLSAgQGZvciBFbWJlci5IYW5k
bGViYXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBuYW1lCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0
aW9uCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXlzKgotKi8KLUVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJCb3VuZEhlbHBlciA9IGZ1bmN0aW9uKG5hbWUsIGZuKSB7Ci0gIHZhciBkZXBl
bmRlbnRLZXlzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICBGb3IgZXhhbXBsZSwKIAot
ICBmdW5jdGlvbiBoZWxwZXIoKSB7Ci0gICAgdmFyIHByb3BlcnRpZXMgPSBzbGljZS5jYWxsKGFy
Z3VtZW50cywgMCwgLTEpLAotICAgICAgbnVtUHJvcGVydGllcyA9IHByb3BlcnRpZXMubGVuZ3Ro
LAotICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0sCi0gICAg
ICBub3JtYWxpemVkUHJvcGVydGllcyA9IFtdLAotICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YSwK
LSAgICAgIGhhc2ggPSBvcHRpb25zLmhhc2gsCi0gICAgICB2aWV3ID0gZGF0YS52aWV3LAotICAg
ICAgY3VycmVudENvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0cyAmJiBvcHRpb25zLmNvbnRleHRz
WzBdKSB8fCB0aGlzLAotICAgICAgbm9ybWFsaXplZCwKLSAgICAgIHBhdGhSb290LCBwYXRoLCAK
LSAgICAgIGxvYywgaGFzaE9wdGlvbjsKKyAgYGBgaGFuZGxlYmFycworICB7e2RlYWxlcnNoaXBO
YW1lfX0KIAotICAgIC8vIERldGVjdCBib3VuZCBvcHRpb25zIChlLmcuIGNvdW50QmluZGluZz0i
b3RoZXJDb3VudCIpCi0gICAgaGFzaC5ib3VuZE9wdGlvbnMgPSB7fTsKLSAgICBmb3IgKGhhc2hP
cHRpb24gaW4gaGFzaCkgewotICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KGhhc2hPcHRp
b24pKSB7IGNvbnRpbnVlOyB9CisgIHt7I2dyb3VwfX0KKyAgICB7eyNlYWNoIGRlYWxlcnN9fQor
ICAgICAge3tmaXJzdE5hbWV9fSB7e2xhc3ROYW1lfX0KKyAgICB7ey9lYWNofX0KIAotICAgICAg
aWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChoYXNoT3B0aW9uKSAmJiB0eXBlb2YgaGFzaFtoYXNo
T3B0aW9uXSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgLy8gTG9wIG9mZiAnQmluZGluZycgc3Vm
Zml4LgotICAgICAgICBoYXNoLmJvdW5kT3B0aW9uc1toYXNoT3B0aW9uLnNsaWNlKDAsIC03KV0g
PSBoYXNoW2hhc2hPcHRpb25dOwotICAgICAgfQotICAgIH0KKyAgICB7eyNlYWNoIGNhciBpbiBj
YXJzIGdyb3VwZWRSb3dzPXRydWV9fQorICAgICAge3tjYXIubWFrZX19IHt7Y2FyLm1vZGVsfX0g
e3tjYXIuY29sb3J9fQorICAgIHt7L2VhY2h9fQorICB7ey9ncm91cH19CisgIGBgYAorICBBbnkg
Y2hhbmdlIHRvIGBkZWFsZXJzaGlwTmFtZWAgb3IgdGhlIGBkZWFsZXJzYCBjb2xsZWN0aW9uIHdp
bGwgY2F1c2UgdGhlCisgIGVudGlyZSBncm91cCB0byBiZSByZS1yZW5kZXJlZC4gSG93ZXZlciwg
Y2hhbmdlcyB0byB0aGUgYGNhcnNgIGNvbGxlY3Rpb24KKyAgd2lsbCBiZSByZS1yZW5kZXJlZCBp
bmRpdmlkdWFsbHkgKGFzIG5vcm1hbCkuCiAKLSAgICAvLyBFeHBvc2UgcHJvcGVydHkgbmFtZXMg
b24gZGF0YS5wcm9wZXJ0aWVzIG9iamVjdC4KLSAgICBkYXRhLnByb3BlcnRpZXMgPSBbXTsKLSAg
ICBmb3IgKGxvYyA9IDA7IGxvYyA8IG51bVByb3BlcnRpZXM7ICsrbG9jKSB7Ci0gICAgICBkYXRh
LnByb3BlcnRpZXMucHVzaChwcm9wZXJ0aWVzW2xvY10pOwotICAgICAgbm9ybWFsaXplZFByb3Bl
cnRpZXMucHVzaChub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0aWVzW2xvY10s
IGRhdGEpKTsKLSAgICB9CisgIE5vdGUgdGhhdCBgZ3JvdXBgIGJlaGF2aW9yIGlzIGFsc28gZGlz
YWJsZWQgYnkgc3BlY2lmeWluZyBhbiBgaXRlbVZpZXdDbGFzc2AuCiAKLSAgICBpZiAoZGF0YS5p
c1VuYm91bmQpIHsKLSAgICAgIHJldHVybiBldmFsdWF0ZVVuYm91bmRIZWxwZXIodGhpcywgZm4s
IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLCBvcHRpb25zKTsKLSAgICB9CisgIEBtZXRob2QgZWFjaAor
ICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycworICBAcGFyYW0gW25hbWVdIHtTdHJpbmd9
IG5hbWUgZm9yIGl0ZW0gKHVzZWQgd2l0aCBgaW5gKQorICBAcGFyYW0gW3BhdGhdIHtTdHJpbmd9
IHBhdGgKKyAgQHBhcmFtIFtvcHRpb25zXSB7T2JqZWN0fSBIYW5kbGViYXJzIGtleS92YWx1ZSBw
YWlycyBvZiBvcHRpb25zCisgIEBwYXJhbSBbb3B0aW9ucy5pdGVtVmlld0NsYXNzXSB7U3RyaW5n
fSBhIHBhdGggdG8gYSB2aWV3IGNsYXNzIHVzZWQgZm9yIGVhY2ggaXRlbQorICBAcGFyYW0gW29w
dGlvbnMuaXRlbUNvbnRyb2xsZXJdIHtTdHJpbmd9IG5hbWUgb2YgYSBjb250cm9sbGVyIHRvIGJl
IGNyZWF0ZWQgZm9yIGVhY2ggaXRlbQorICBAcGFyYW0gW29wdGlvbnMuZ3JvdXBlZFJvd3NdIHti
b29sZWFufSBlbmFibGUgbm9ybWFsIGl0ZW0tYnktaXRlbSByZW5kZXJpbmcgd2hlbiBpbnNpZGUg
YSBgI2dyb3VwYCBoZWxwZXIKKyovCitFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdl
YWNoJywgZnVuY3Rpb24gZWFjaEhlbHBlcihwYXRoLCBvcHRpb25zKSB7CisgIGlmIChhcmd1bWVu
dHMubGVuZ3RoID09PSA0KSB7CisgICAgRW1iZXIuYXNzZXJ0KCJJZiB5b3UgcGFzcyBtb3JlIHRo
YW4gb25lIGFyZ3VtZW50IHRvIHRoZSBlYWNoIGhlbHBlciwgaXQgbXVzdCBiZSBpbiB0aGUgZm9y
bSAjZWFjaCBmb28gaW4gYmFyIiwgYXJndW1lbnRzWzFdID09PSAiaW4iKTsKIAotICAgIGlmIChk
ZXBlbmRlbnRLZXlzLmxlbmd0aCA9PT0gMCkgewotICAgICAgcmV0dXJuIGV2YWx1YXRlTXVsdGlQ
cm9wZXJ0eUJvdW5kSGVscGVyKGN1cnJlbnRDb250ZXh0LCBmbiwgbm9ybWFsaXplZFByb3BlcnRp
ZXMsIG9wdGlvbnMpOwotICAgIH0KKyAgICB2YXIga2V5d29yZE5hbWUgPSBhcmd1bWVudHNbMF07
CiAKLSAgICBFbWJlci5hc3NlcnQoIkRlcGVuZGVudCBrZXlzIGNhbiBvbmx5IGJlIHVzZWQgd2l0
aCBzaW5nbGUtcHJvcGVydHkgaGVscGVycy4iLCBwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSk7Cisg
ICAgb3B0aW9ucyA9IGFyZ3VtZW50c1szXTsKKyAgICBwYXRoID0gYXJndW1lbnRzWzJdOworICAg
IGlmIChwYXRoID09PSAnJykgeyBwYXRoID0gInRoaXMiOyB9CiAKLSAgICBub3JtYWxpemVkID0g
bm9ybWFsaXplZFByb3BlcnRpZXNbMF07CisgICAgb3B0aW9ucy5oYXNoLmtleXdvcmQgPSBrZXl3
b3JkTmFtZTsKKyAgfQogCi0gICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJvb3Q7Ci0gICAgcGF0
aCA9IG5vcm1hbGl6ZWQucGF0aDsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKKyAg
ICBvcHRpb25zID0gcGF0aDsKKyAgICBwYXRoID0gJ3RoaXMnOworICB9CiAKLSAgICB2YXIgYmlu
ZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3KAotICAgICAgcGF0aCwgcGF0
aFJvb3QsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25zLmRhdGEKLSAgICApOworICBv
cHRpb25zLmhhc2guZGF0YVNvdXJjZUJpbmRpbmcgPSBwYXRoOworICAvLyBTZXQgdXAgZW1wdHlW
aWV3IGFzIGEgbWV0YW1vcnBoIHdpdGggbm8gdGFnCisgIC8vb3B0aW9ucy5oYXNoLmVtcHR5Vmll
d0NsYXNzID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7CiAKLSAgICBiaW5kVmlldy5ub3JtYWxpemVk
VmFsdWUgPSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciB2YWx1ZSA9IEVtYmVyLl9TaW1wbGVIYW5k
bGViYXJzVmlldy5wcm90b3R5cGUubm9ybWFsaXplZFZhbHVlLmNhbGwoYmluZFZpZXcpOwotICAg
ICAgcmV0dXJuIGZuLmNhbGwodmlldywgdmFsdWUsIG9wdGlvbnMpOwotICAgIH07CisgIGlmIChv
cHRpb25zLmRhdGEuaW5zaWRlR3JvdXAgJiYgIW9wdGlvbnMuaGFzaC5ncm91cGVkUm93cyAmJiAh
b3B0aW9ucy5oYXNoLml0ZW1WaWV3Q2xhc3MpIHsKKyAgICBuZXcgRW1iZXIuSGFuZGxlYmFycy5H
cm91cGVkRWFjaCh0aGlzLCBwYXRoLCBvcHRpb25zKS5yZW5kZXIoKTsKKyAgfSBlbHNlIHsKKyAg
ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmNvbGxlY3Rpb24uY2FsbCh0aGlzLCAn
RW1iZXIuSGFuZGxlYmFycy5FYWNoVmlldycsIG9wdGlvbnMpOworICB9Cit9KTsKIAotICAgIHZp
ZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOworfSkoKTsKIAotICAgIHZpZXcucmVnaXN0ZXJPYnNl
cnZlcihwYXRoUm9vdCwgcGF0aCwgYmluZFZpZXcsIHJlcmVuZGVyQm91bmRIZWxwZXJWaWV3KTsK
IAotICAgIGZvciAodmFyIGk9MCwgbD1kZXBlbmRlbnRLZXlzLmxlbmd0aDsgaTxsOyBpKyspIHsK
LSAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihwYXRoUm9vdCwgcGF0aCArICcuJyArIGRlcGVu
ZGVudEtleXNbaV0sIGJpbmRWaWV3LCByZXJlbmRlckJvdW5kSGVscGVyVmlldyk7Ci0gICAgfQot
ICB9CiAKLSAgaGVscGVyLl9yYXdGdW5jdGlvbiA9IGZuOwotICBFbWJlci5IYW5kbGViYXJzLnJl
Z2lzdGVySGVscGVyKG5hbWUsIGhlbHBlcik7Ci19OworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9k
dWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCiAKIC8qKgotICBAcHJp
dmF0ZQorICBgdGVtcGxhdGVgIGFsbG93cyB5b3UgdG8gcmVuZGVyIGEgdGVtcGxhdGUgZnJvbSBp
bnNpZGUgYW5vdGhlciB0ZW1wbGF0ZS4KKyAgVGhpcyBhbGxvd3MgeW91IHRvIHJlLXVzZSB0aGUg
c2FtZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBwbGFjZXMuIEZvciBleGFtcGxlOgogCi0gIFJlbmRl
cnMgdGhlIHVuYm91bmQgZm9ybSBvZiBhbiBvdGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9u
LgorICBgYGBodG1sCisgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVt
cGxhdGUtbmFtZT0ibG9nZ2VkX2luX3VzZXIiPgorICAgIHt7I3dpdGggbG9nZ2VkSW5Vc2VyfX0K
KyAgICAgIExhc3QgTG9naW46IHt7bGFzdExvZ2lufX0KKyAgICAgIFVzZXIgSW5mbzoge3t0ZW1w
bGF0ZSAidXNlcl9pbmZvIn19CisgICAge3svd2l0aH19CisgIDwvc2NyaXB0PgorICBgYGAKIAot
ICBAcGFyYW0ge0Z1bmN0aW9ufSBmbgotICBAcGFyYW0ge09iamVjdH0gY29udGV4dAotICBAcGFy
YW0ge0FycmF5fSBub3JtYWxpemVkUHJvcGVydGllcwotICBAcGFyYW0ge1N0cmluZ30gb3B0aW9u
cwotKi8KLWZ1bmN0aW9uIGV2YWx1YXRlTXVsdGlQcm9wZXJ0eUJvdW5kSGVscGVyKGNvbnRleHQs
IGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucykgewotICB2YXIgbnVtUHJvcGVydGll
cyA9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLmxlbmd0aCwKLSAgICAgIHNlbGYgPSB0aGlzLAotICAg
ICAgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBo
YXNoID0gb3B0aW9ucy5oYXNoLAotICAgICAgYm91bmRPcHRpb25zID0gaGFzaC5ib3VuZE9wdGlv
bnMsCi0gICAgICB3YXRjaGVkUHJvcGVydGllcywKLSAgICAgIGJvdW5kT3B0aW9uLCBiaW5kVmll
dywgbG9jLCBwcm9wZXJ0eSwgbGVuOworICBgYGBodG1sCisgIDxzY3JpcHQgdHlwZT0idGV4dC94
LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxhdGUtbmFtZT0idXNlcl9pbmZvIj4KKyAgICBOYW1lOiA8
ZW0+e3tuYW1lfX08L2VtPgorICAgIEthcm1hOiA8ZW0+e3trYXJtYX19PC9lbT4KKyAgPC9zY3Jp
cHQ+CisgIGBgYAorCisgIGBgYGhhbmRsZWJhcnMKKyAge3sjaWYgaXNVc2VyfX0KKyAgICB7e3Rl
bXBsYXRlICJ1c2VyX2luZm8ifX0KKyAge3tlbHNlfX0KKyAgICB7e3RlbXBsYXRlICJ1bmxvZ2dl
ZF91c2VyX2luZm8ifX0KKyAge3svaWZ9fQorICBgYGAKIAotICBiaW5kVmlldyA9IG5ldyBFbWJl
ci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXcobnVsbCwgbnVsbCwgIWhhc2gudW5lc2NhcGVkLCBkYXRh
KTsKLSAgYmluZFZpZXcubm9ybWFsaXplZFZhbHVlID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFy
Z3MgPSBbXSwgdmFsdWUsIGJvdW5kT3B0aW9uOworICBUaGlzIGhlbHBlciBsb29rcyBmb3IgdGVt
cGxhdGVzIGluIHRoZSBnbG9iYWwgYEVtYmVyLlRFTVBMQVRFU2AgaGFzaC4gSWYgeW91CisgIGFk
ZCBgPHNjcmlwdD5gIHRhZ3MgdG8geW91ciBwYWdlIHdpdGggdGhlIGBkYXRhLXRlbXBsYXRlLW5h
bWVgIGF0dHJpYnV0ZSBzZXQsCisgIHRoZXkgd2lsbCBiZSBjb21waWxlZCBhbmQgcGxhY2VkIGlu
IHRoaXMgaGFzaCBhdXRvbWF0aWNhbGx5LgogCi0gICAgLy8gQ29weSBvdmVyIGJvdW5kIG9wdGlv
bnMuCi0gICAgZm9yIChib3VuZE9wdGlvbiBpbiBib3VuZE9wdGlvbnMpIHsKLSAgICAgIGlmICgh
Ym91bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5kT3B0aW9uKSkgeyBjb250aW51ZTsgfQot
ICAgICAgcHJvcGVydHkgPSBub3JtYWxpemVQYXRoKGNvbnRleHQsIGJvdW5kT3B0aW9uc1tib3Vu
ZE9wdGlvbl0sIGRhdGEpOwotICAgICAgYmluZFZpZXcucGF0aCA9IHByb3BlcnR5LnBhdGg7Ci0g
ICAgICBiaW5kVmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7Ci0gICAgICBoYXNoW2JvdW5k
T3B0aW9uXSA9IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJzVmlldy5wcm90b3R5cGUubm9ybWFsaXpl
ZFZhbHVlLmNhbGwoYmluZFZpZXcpOwotICAgIH0KKyAgWW91IGNhbiBhbHNvIG1hbnVhbGx5IHJl
Z2lzdGVyIHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0byB0aGUgaGFzaDoKIAotICAgIGZvciAo
bG9jID0gMDsgbG9jIDwgbnVtUHJvcGVydGllczsgKytsb2MpIHsKLSAgICAgIHByb3BlcnR5ID0g
bm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsKLSAgICAgIGJpbmRWaWV3LnBhdGggPSBwcm9wZXJ0
eS5wYXRoOwotICAgICAgYmluZFZpZXcucGF0aFJvb3QgPSBwcm9wZXJ0eS5yb290OwotICAgICAg
YXJncy5wdXNoKEVtYmVyLl9TaW1wbGVIYW5kbGViYXJzVmlldy5wcm90b3R5cGUubm9ybWFsaXpl
ZFZhbHVlLmNhbGwoYmluZFZpZXcpKTsKLSAgICB9Ci0gICAgYXJncy5wdXNoKG9wdGlvbnMpOwot
ICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKLSAgfTsKKyAgYGBgamF2YXNjcmlw
dAorICBFbWJlci5URU1QTEFURVNbIm15X2Nvb2xfdGVtcGxhdGUiXSA9IEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgnPGI+e3t1c2VyfX08L2I+Jyk7CisgIGBgYAorCisgIEBkZXByZWNhdGVkCisg
IEBtZXRob2QgdGVtcGxhdGUKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBh
cmFtIHtTdHJpbmd9IHRlbXBsYXRlTmFtZSB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyCisqLwogCi0g
IHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOworRW1iZXIuSGFuZGxlYmFycy5yZWdpc3Rlckhl
bHBlcigndGVtcGxhdGUnLCBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7CisgIEVtYmVyLmRlcHJl
Y2F0ZSgiVGhlIGB0ZW1wbGF0ZWAgaGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Ig
b2YgdGhlIGBwYXJ0aWFsYCBoZWxwZXIuIFBsZWFzZSB1c2UgYHBhcnRpYWxgIGluc3RlYWQsIHdo
aWNoIHdpbGwgd29yayB0aGUgc2FtZSB3YXkuIik7CisgIHJldHVybiBFbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMucGFydGlhbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSk7CiAKLSAgLy8gQXNz
ZW1ibGUgbGlhc3Qgb2Ygd2F0Y2hlZCBwcm9wZXJ0aWVzIHRoYXQnbGwgcmUtcmVuZGVyIHRoaXMg
aGVscGVyLgotICB3YXRjaGVkUHJvcGVydGllcyA9IFtdOwotICBmb3IgKGJvdW5kT3B0aW9uIGlu
IGJvdW5kT3B0aW9ucykgewotICAgIGlmIChib3VuZE9wdGlvbnMuaGFzT3duUHJvcGVydHkoYm91
bmRPcHRpb24pKSB7IAotICAgICAgd2F0Y2hlZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVQYXRo
KGNvbnRleHQsIGJvdW5kT3B0aW9uc1tib3VuZE9wdGlvbl0sIGRhdGEpKTsKLSAgICB9Ci0gIH0K
LSAgd2F0Y2hlZFByb3BlcnRpZXMgPSB3YXRjaGVkUHJvcGVydGllcy5jb25jYXQobm9ybWFsaXpl
ZFByb3BlcnRpZXMpOworfSkoKTsKIAotICAvLyBPYnNlcnZlIGVhY2ggcHJvcGVydHkuCi0gIGZv
ciAobG9jID0gMCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsr
bG9jKSB7Ci0gICAgcHJvcGVydHkgPSB3YXRjaGVkUHJvcGVydGllc1tsb2NdOwotICAgIHZpZXcu
cmVnaXN0ZXJPYnNlcnZlcihwcm9wZXJ0eS5yb290LCBwcm9wZXJ0eS5wYXRoLCBiaW5kVmlldywg
cmVyZW5kZXJCb3VuZEhlbHBlclZpZXcpOwotICB9CiAKLX0KIAorKGZ1bmN0aW9uKCkgewogLyoq
Ci0gIEBwcml2YXRlCi0KLSAgQW4gb2JzZXJ2ZXIgZnVuY3Rpb24gdXNlZCB3aXRoIGJvdW5kIGhl
bHBlcnMgd2hpY2gKLSAgd2lsbCBzY2hlZHVsZSBhIHJlLXJlbmRlciBvZiB0aGUgX1NpbXBsZUhh
bmRsZWJhcnNWaWV3Ci0gIGNvbm5lY3RlZCB3aXRoIHRoZSBoZWxwZXIuCitAbW9kdWxlIGVtYmVy
CitAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKICovCi1mdW5jdGlvbiByZXJlbmRlckJvdW5k
SGVscGVyVmlldygpIHsKLSAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywg
J3JlcmVuZGVyJyk7Ci19CiAKIC8qKgotICBAcHJpdmF0ZQotCi0gIFJlbmRlcnMgdGhlIHVuYm91
bmQgZm9ybSBvZiBhbiBvdGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9uLgorICBUaGUgYHBh
cnRpYWxgIGhlbHBlciByZW5kZXJzIGFub3RoZXIgdGVtcGxhdGUgd2l0aG91dAorICBjaGFuZ2lu
ZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKIAotICBAcGFyYW0ge0Z1bmN0aW9ufSBmbgotICBAcGFy
YW0ge09iamVjdH0gY29udGV4dAotICBAcGFyYW0ge0FycmF5fSBub3JtYWxpemVkUHJvcGVydGll
cwotICBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucwotKi8KLWZ1bmN0aW9uIGV2YWx1YXRlVW5ib3Vu
ZEhlbHBlcihjb250ZXh0LCBmbiwgbm9ybWFsaXplZFByb3BlcnRpZXMsIG9wdGlvbnMpIHsKLSAg
dmFyIGFyZ3MgPSBbXSwgaGFzaCA9IG9wdGlvbnMuaGFzaCwgYm91bmRPcHRpb25zID0gaGFzaC5i
b3VuZE9wdGlvbnMsIGxvYywgbGVuLCBwcm9wZXJ0eSwgYm91bmRPcHRpb247CisgIGBgYGhhbmRs
ZWJhcnMKKyAge3tmb299fQorICB7e3BhcnRpYWwgIm5hdiJ9fQorICBgYGAKIAotICBmb3IgKGJv
dW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAgIGlmICghYm91bmRPcHRpb25zLmhhc093
blByb3BlcnR5KGJvdW5kT3B0aW9uKSkgeyBjb250aW51ZTsgfQotICAgIGhhc2hbYm91bmRPcHRp
b25dID0gRW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0
aW9uXSwgb3B0aW9ucyk7Ci0gIH0KKyAgVGhlIGFib3ZlIGV4YW1wbGUgdGVtcGxhdGUgd2lsbCBy
ZW5kZXIgYSB0ZW1wbGF0ZSBuYW1lZAorICAiX25hdiIsIHdoaWNoIGhhcyB0aGUgc2FtZSBjb250
ZXh0IGFzIHRoZSBwYXJlbnQgdGVtcGxhdGUKKyAgaXQncyByZW5kZXJlZCBpbnRvLCBzbyBpZiB0
aGUgIl9uYXYiIHRlbXBsYXRlIGFsc28gcmVmZXJlbmNlZAorICBge3tmb299fWAsIGl0IHdvdWxk
IHByaW50IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBge3tmb299fWAKKyAgaW4gdGhlIGFib3ZlIGV4
YW1wbGUuCiAKLSAgZm9yKGxvYyA9IDAsIGxlbiA9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLmxlbmd0
aDsgbG9jIDwgbGVuOyArK2xvYykgewotICAgIHByb3BlcnR5ID0gbm9ybWFsaXplZFByb3BlcnRp
ZXNbbG9jXTsKLSAgICBhcmdzLnB1c2goRW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwgcHJv
cGVydHkucGF0aCwgb3B0aW9ucykpOwotICB9Ci0gIGFyZ3MucHVzaChvcHRpb25zKTsKLSAgcmV0
dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwotfQorICBJZiBhICJfbmF2IiB0ZW1wbGF0ZSBp
c24ndCBmb3VuZCwgdGhlIGBwYXJ0aWFsYCBoZWxwZXIgd2lsbAorICBmYWxsIGJhY2sgdG8gYSB0
ZW1wbGF0ZSBuYW1lZCAibmF2Ii4KIAotLyoqCi0gIEBwcml2YXRlCisgICMjIEJvdW5kIHRlbXBs
YXRlIG5hbWVzCiAKLSAgT3ZlcnJpZGVzIEhhbmRsZWJhcnMudGVtcGxhdGUgc28gdGhhdCB3ZSBj
YW4gZGlzdGluZ3Vpc2gKLSAgdXNlci1jcmVhdGVkLCB0b3AtbGV2ZWwgdGVtcGxhdGVzIGZyb20g
aW5uZXIgY29udGV4dHMuCisgIFRoZSBwYXJhbWV0ZXIgc3VwcGxpZWQgdG8gYHBhcnRpYWxgIGNh
biBhbHNvIGJlIGEgcGF0aAorICB0byBhIHByb3BlcnR5IGNvbnRhaW5pbmcgYSB0ZW1wbGF0ZSBu
YW1lLCBlLmcuOgogCi0gIEBtZXRob2QgdGVtcGxhdGUKLSAgQGZvciBFbWJlci5IYW5kbGViYXJz
Ci0gIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSBzcGVjCi0qLwotRW1iZXIuSGFuZGxlYmFycy50
ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpewotICB2YXIgdCA9IEhhbmRsZWJhcnMudGVtcGxhdGUo
c3BlYyk7Ci0gIHQuaXNUb3AgPSB0cnVlOwotICByZXR1cm4gdDsKLX07CisgIGBgYGhhbmRsZWJh
cnMKKyAge3twYXJ0aWFsIHNvbWVUZW1wbGF0ZU5hbWV9fQorICBgYGAKIAorICBUaGUgYWJvdmUg
ZXhhbXBsZSB3aWxsIGxvb2sgdXAgdGhlIHZhbHVlIG9mIGBzb21lVGVtcGxhdGVOYW1lYAorICBv
biB0aGUgdGVtcGxhdGUgY29udGV4dCAoZS5nLiBhIGNvbnRyb2xsZXIpIGFuZCB1c2UgdGhhdAor
ICB2YWx1ZSBhcyB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyLiBJZiB0aGUgcmVz
b2x2ZWQKKyAgdmFsdWUgaXMgZmFsc3ksIG5vdGhpbmcgd2lsbCBiZSByZW5kZXJlZC4gSWYgYHNv
bWVUZW1wbGF0ZU5hbWVgCisgIGNoYW5nZXMsIHRoZSBwYXJ0aWFsIHdpbGwgYmUgcmUtcmVuZGVy
ZWQgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZQorICBuYW1lLgogCi19KSgpOworICAjIyBTZXR0aW5n
IHRoZSBwYXJ0aWFsJ3MgY29udGV4dCB3aXRoIGB3aXRoYAogCisgIFRoZSBgcGFydGlhbGAgaGVs
cGVyIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB3aXRoYAorICBoZWxwZXIg
dG8gc2V0IGEgY29udGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgcGFydGlhbDoKIAorICBg
YGBoYW5kbGViYXJzCisgIHt7I3dpdGggY3VycmVudFVzZXJ9fQorICAgIHt7cGFydGlhbCAidXNl
cl9pbmZvIn19CisgIHt7L3dpdGh9fQorICBgYGAKIAotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBt
ZXRob2QgaHRtbFNhZmUKLSAgQGZvciBFbWJlci5TdHJpbmcKLSAgQHN0YXRpYworICBAbWV0aG9k
IHBhcnRpYWwKKyAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtTdHJp
bmd9IHBhcnRpYWxOYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgbWludXMg
dGhlIGxlYWRpbmcgdW5kZXJzY29yZQogKi8KLUVtYmVyLlN0cmluZy5odG1sU2FmZSA9IGZ1bmN0
aW9uKHN0cikgewotICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhzdHIpOwotfTsK
IAotdmFyIGh0bWxTYWZlID0gRW1iZXIuU3RyaW5nLmh0bWxTYWZlOworRW1iZXIuSGFuZGxlYmFy
cy5yZWdpc3RlckhlbHBlcigncGFydGlhbCcsIGZ1bmN0aW9uIHBhcnRpYWxIZWxwZXIobmFtZSwg
b3B0aW9ucykgewogCi1pZiAoRW1iZXIuRVhURU5EX1BST1RPVFlQRVMgPT09IHRydWUgfHwgRW1i
ZXIuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nKSB7CisgIHZhciBjb250ZXh0ID0gKG9wdGlvbnMu
Y29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1sw
XSA6IHRoaXM7CiAKLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL2h0
bWxTYWZlIn19e3svY3Jvc3NMaW5rfX0KKyAgaWYgKG9wdGlvbnMudHlwZXNbMF0gPT09ICJJRCIp
IHsKKyAgICAvLyBIZWxwZXIgd2FzIHBhc3NlZCBhIHByb3BlcnR5IHBhdGg7IHdlIG5lZWQgdG8K
KyAgICAvLyBjcmVhdGUgYSBiaW5kaW5nIHRoYXQgd2lsbCByZS1yZW5kZXIgd2hlbmV2ZXIKKyAg
ICAvLyB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCisgICAgb3B0aW9ucy5mbiA9IGZ1bmN0aW9uKGNv
bnRleHQsIGZuT3B0aW9ucykgeworICAgICAgdmFyIHBhcnRpYWxOYW1lID0gRW1iZXIuSGFuZGxl
YmFycy5nZXQoY29udGV4dCwgbmFtZSwgZm5PcHRpb25zKTsKKyAgICAgIHJlbmRlclBhcnRpYWwo
Y29udGV4dCwgcGFydGlhbE5hbWUsIGZuT3B0aW9ucyk7CisgICAgfTsKIAotICAgIEBtZXRob2Qg
aHRtbFNhZmUKLSAgICBAZm9yIFN0cmluZwotICAqLwotICBTdHJpbmcucHJvdG90eXBlLmh0bWxT
YWZlID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGh0bWxTYWZlKHRoaXMpOwotICB9OworICAg
IHJldHVybiBFbWJlci5IYW5kbGViYXJzLmJpbmQuY2FsbChjb250ZXh0LCBuYW1lLCBvcHRpb25z
LCB0cnVlLCBleGlzdHMpOworICB9IGVsc2UgeworICAgIC8vIFJlbmRlciB0aGUgcGFydGlhbCBy
aWdodCBpbnRvIHBhcmVudCB0ZW1wbGF0ZS4KKyAgICByZW5kZXJQYXJ0aWFsKGNvbnRleHQsIG5h
bWUsIG9wdGlvbnMpOworICB9Cit9KTsKKworZnVuY3Rpb24gZXhpc3RzKHZhbHVlKSB7CisgIHJl
dHVybiAhRW1iZXIuaXNOb25lKHZhbHVlKTsKIH0KIAotfSkoKTsKK2Z1bmN0aW9uIHJlbmRlclBh
cnRpYWwoY29udGV4dCwgbmFtZSwgb3B0aW9ucykgeworICB2YXIgbmFtZVBhcnRzID0gbmFtZS5z
cGxpdCgiLyIpLAorICAgICAgbGFzdFBhcnQgPSBuYW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0aCAt
IDFdOwogCisgIG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV0gPSAiXyIgKyBsYXN0UGFy
dDsKIAorICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3LAorICAgICAgdW5kZXJzY29yZWRO
YW1lID0gbmFtZVBhcnRzLmpvaW4oIi8iKSwKKyAgICAgIHRlbXBsYXRlID0gdmlldy50ZW1wbGF0
ZUZvck5hbWUodW5kZXJzY29yZWROYW1lKSwKKyAgICAgIGRlcHJlY2F0ZWRUZW1wbGF0ZSA9ICF0
ZW1wbGF0ZSAmJiB2aWV3LnRlbXBsYXRlRm9yTmFtZShuYW1lKTsKIAotKGZ1bmN0aW9uKCkgewot
RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlUGF0aHMgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHZh
ciByZXQgPSBbXSwKLSAgICAgIGNvbnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKLSAgICAgIHJv
b3RzID0gb3B0aW9ucy5yb290cywKLSAgICAgIGRhdGEgPSBvcHRpb25zLmRhdGE7CisgIEVtYmVy
LmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgJyIrbmFtZSsiJy4iLCB0
ZW1wbGF0ZSB8fCBkZXByZWNhdGVkVGVtcGxhdGUpOwogCi0gIGZvciAodmFyIGk9MCwgbD1jb250
ZXh0cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgcmV0LnB1c2goIEVtYmVyLkhhbmRsZWJhcnMu
Z2V0KHJvb3RzW2ldLCBjb250ZXh0c1tpXSwgeyBkYXRhOiBkYXRhIH0pICk7Ci0gIH0KKyAgdGVt
cGxhdGUgPSB0ZW1wbGF0ZSB8fCBkZXByZWNhdGVkVGVtcGxhdGU7CiAKLSAgcmV0dXJuIHJldDsK
LX07CisgIHRlbXBsYXRlKGNvbnRleHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0pOworfQogCiB9
KSgpOwogCiAKIAogKGZ1bmN0aW9uKCkgewotLypqc2hpbnQgbmV3Y2FwOmZhbHNlKi8KIC8qKgog
QG1vZHVsZSBlbWJlcgogQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCiAqLwogCi12YXIgc2V0
ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7Ci12YXIgTWV0YW1vcnBoID0gcmVxdWlyZU1v
ZHVsZSgnbWV0YW1vcnBoJyk7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
CiAKLS8vIERPTU1hbmFnZXIgc2hvdWxkIGp1c3QgYWJzdHJhY3QgZG9tIG1hbmlwdWxhdGlvbiBi
ZXR3ZWVuIGpxdWVyeSBhbmQgbWV0YW1vcnBoCi12YXIgRE9NTWFuYWdlciA9IHsKLSAgcmVtb3Zl
OiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmlldy5tb3JwaC5yZW1vdmUoKTsKLSAgfSwKKy8qKgor
ICBge3t5aWVsZH19YCBkZW5vdGVzIGFuIGFyZWEgb2YgYSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUg
cmVuZGVyZWQgaW5zaWRlCisgIG9mIGFub3RoZXIgdGVtcGxhdGUuIEl0IGhhcyB0d28gbWFpbiB1
c2VzOgogCi0gIHByZXBlbmQ6IGZ1bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3Lm1vcnBo
LnByZXBlbmQoaHRtbCk7Ci0gIH0sCisgICMjIyBVc2Ugd2l0aCBgbGF5b3V0YAorICBXaGVuIHVz
ZWQgaW4gYSBIYW5kbGViYXJzIHRlbXBsYXRlIHRoYXQgaXMgYXNzaWduZWQgdG8gYW4gYEVtYmVy
LlZpZXdgCisgIGluc3RhbmNlJ3MgYGxheW91dGAgcHJvcGVydHkgRW1iZXIgd2lsbCByZW5kZXIg
dGhlIGxheW91dCB0ZW1wbGF0ZSBmaXJzdCwKKyAgaW5zZXJ0aW5nIHRoZSB2aWV3J3Mgb3duIHJl
bmRlcmVkIG91dHB1dCBhdCB0aGUgYHt7eWllbGR9fWAgbG9jYXRpb24uCiAKLSAgYWZ0ZXI6IGZ1
bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3Lm1vcnBoLmFmdGVyKGh0bWwpOwotICB9LAor
ICBBbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbiBjb2RlOgog
Ci0gIGh0bWw6IGZ1bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3Lm1vcnBoLmh0bWwoaHRt
bCk7Ci0gIH0sCisgIGBgYGphdmFzY3JpcHQKKyAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
CisgICAgY2xhc3NOYW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKKyAgICBsYXlvdXQ6IEVt
YmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPGRpdiBjbGFzcz0id3JhcHBlciI+e3t5aWVsZH19PC9k
aXY+JyksCisgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPHNwYW4+SSBh
bSB3cmFwcGVkPC9zcGFuPicpCisgIH0pOwogCi0gIC8vIFRoaXMgaXMgbWVzc2VkIHVwLgotICBy
ZXBsYWNlOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmFyIG1vcnBoID0gdmlldy5tb3JwaDsKKyAg
YVZpZXcgPSBBVmlldy5jcmVhdGUoKTsKKyAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKKyAgYGBg
CiAKLSAgICB2aWV3LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7CisgIFdpbGwgcmVzdWx0IGlu
IHRoZSBmb2xsb3dpbmcgSFRNTCBvdXRwdXQ6CiAKLSAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ3Jl
bmRlcicsIHRoaXMsIGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHZpZXcuaXNEZXN0cm95aW5nKSB7
IHJldHVybjsgfQorICBgYGBodG1sCisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9J2VtYmVyLXZp
ZXcgYS12aWV3LXdpdGgtbGF5b3V0Jz4KKyAgICAgIDxkaXYgY2xhc3M9IndyYXBwZXIiPgorICAg
ICAgICA8c3Bhbj5JIGFtIHdyYXBwZWQ8L3NwYW4+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4K
KyAgPC9ib2R5PgorICBgYGAKIAotICAgICAgdmlldy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsK
LSAgICAgIHZhciBidWZmZXIgPSB2aWV3LnJlbmRlclRvQnVmZmVyKCk7CisgIFRoZSBgeWllbGRg
IGhlbHBlciBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgdGVtcGxhdGUgYXNzaWduZWQgdG8g
YW4KKyAgYEVtYmVyLlZpZXdgJ3MgYGxheW91dGAgcHJvcGVydHkgYW5kIHdpbGwgdGhyb3cgYW4g
ZXJyb3IgaWYgYXR0ZW1wdGVkLgogCi0gICAgICB2aWV3Lmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0
aW9uKHZpZXcpIHsKLSAgICAgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnZWxlbWVudCcpOwot
ICAgICAgfSk7CisgIGBgYGphdmFzY3JpcHQKKyAgQlZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
CisgICAgY2xhc3NOYW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKKyAgICB0ZW1wbGF0ZTog
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCd7e3lpZWxkfX0nKQorICB9KTsKIAotICAgICAgdmll
dy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Ci0gICAgICBtb3JwaC5y
ZXBsYWNlV2l0aChidWZmZXIuc3RyaW5nKCkpOwotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ2lu
RE9NJyk7Ci0gICAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnZGlkSW5zZXJ0RWxlbWVudCcp
OwotICAgIH0pOwotICB9LAorICBiVmlldyA9IEJWaWV3LmNyZWF0ZSgpOworICBiVmlldy5hcHBl
bmRUbygnYm9keScpOwogCi0gIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmlldy5tb3Jw
aC5odG1sKCIiKTsKLSAgfQotfTsKKyAgLy8gdGhyb3dzCisgIC8vIFVuY2F1Z2h0IEVycm9yOiBh
c3NlcnRpb24gZmFpbGVkOgorICAvLyBZb3UgY2FsbGVkIHlpZWxkIGluIGEgdGVtcGxhdGUgdGhh
dCB3YXMgbm90IGEgbGF5b3V0CisgIGBgYAogCi0vLyBUaGUgYG1vcnBoYCBhbmQgYG91dGVySFRN
TGAgcHJvcGVydGllcyBhcmUgaW50ZXJuYWwgb25seQotLy8gYW5kIG5vdCBvYnNlcnZhYmxlLgor
ICAjIyMgVXNlIHdpdGggRW1iZXIuQ29tcG9uZW50CisgIFdoZW4gZGVzaWduaW5nIGNvbXBvbmVu
dHMgYHt7eWllbGR9fWAgaXMgdXNlZCB0byBkZW5vdGUgd2hlcmUsIGluc2lkZSB0aGUgY29tcG9u
ZW50J3MKKyAgdGVtcGxhdGUsIGFuIG9wdGlvbmFsIGJsb2NrIHBhc3NlZCB0byB0aGUgY29tcG9u
ZW50IHNob3VsZCByZW5kZXI6CiAKLS8qKgotICBAY2xhc3MgX01ldGFtb3JwaAotICBAbmFtZXNw
YWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1peGluCi0gIEBwcml2YXRlCi0qLwotRW1iZXIu
X01ldGFtb3JwaCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIGlzVmlydHVhbDogdHJ1ZSwKLSAg
dGFnTmFtZTogJycsCisgIGBgYGhhbmRsZWJhcnMKKyAgPCEtLSBhcHBsaWNhdGlvbi5oYnMgLS0+
CisgIHt7I2xhYmVsZWQtdGV4dGZpZWxkIHZhbHVlPXNvbWVQcm9wZXJ0eX19CisgICAgRmlyc3Qg
bmFtZToKKyAge3svbGFiZWxlZC10ZXh0ZmllbGR9fQorICBgYGAKIAotICBpbnN0cnVtZW50TmFt
ZTogJ3JlbmRlci5tZXRhbW9ycGgnLAorICBgYGBoYW5kbGViYXJzCisgIDwhLS0gY29tcG9uZW50
cy9sYWJlbGVkLXRleHRmaWVsZC5oYnMgLS0+CisgIDxsYWJlbD4KKyAgICB7e3lpZWxkfX0ge3tp
bnB1dCB2YWx1ZT12YWx1ZX19CisgIDwvbGFiZWw+CisgIGBgYAogCi0gIGluaXQ6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5tb3JwaCA9IE1ldGFtb3JwaCgpOwot
ICB9LAorICBSZXN1bHQ6CiAKLSAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAg
ICBidWZmZXIucHVzaCh0aGlzLm1vcnBoLnN0YXJ0VGFnKCkpOwotICAgIGJ1ZmZlci5wdXNoT3Bl
bmluZ1RhZygpOwotICB9LAorICBgYGBodG1sCisgIDxsYWJlbD4KKyAgICBGaXJzdCBuYW1lOiA8
aW5wdXQgdHlwZT0idGV4dCIgLz4KKyAgPGxhYmVsPgorICBgYGAKIAotICBhZnRlclJlbmRlcjog
ZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgYnVmZmVyLnB1c2hDbG9zaW5nVGFnKCk7Ci0gICAgYnVm
ZmVyLnB1c2godGhpcy5tb3JwaC5lbmRUYWcoKSk7Ci0gIH0sCisgIEBtZXRob2QgeWllbGQKKyAg
QGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisg
IEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKKyovCitFbWJlci5IYW5kbGViYXJzLnJlZ2lz
dGVySGVscGVyKCd5aWVsZCcsIGZ1bmN0aW9uIHlpZWxkSGVscGVyKG9wdGlvbnMpIHsKKyAgdmFy
IHZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKIAotICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgYnVmZmVyID0gdGhpcy5yZW5kZXJUb0J1ZmZlcigpOwotICAgIHRoaXMub3V0
ZXJIVE1MID0gYnVmZmVyLnN0cmluZygpOwotICAgIHRoaXMuY2xlYXJCdWZmZXIoKTsKLSAgfSwK
KyAgd2hpbGUgKHZpZXcgJiYgIWdldCh2aWV3LCAnbGF5b3V0JykpIHsKKyAgICBpZiAodmlldy5f
Y29udGV4dFZpZXcpIHsKKyAgICAgIHZpZXcgPSB2aWV3Ll9jb250ZXh0VmlldzsKKyAgICB9IGVs
c2UgeworICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOworICAgIH0KKyAgfQog
Ci0gIGRvbU1hbmFnZXI6IERPTU1hbmFnZXIKKyAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FsbGVkIHlp
ZWxkIGluIGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGEgbGF5b3V0IiwgISF2aWV3KTsKKworICB2
aWV3Ll95aWVsZCh0aGlzLCBvcHRpb25zKTsKIH0pOwogCit9KSgpOworCisKKworKGZ1bmN0aW9u
KCkgewogLyoqCi0gIEBjbGFzcyBfTWV0YW1vcnBoVmlldwotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuX01ldGFtb3JwaAotICBAcHJpdmF0
ZQorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCiAqLwotRW1iZXIu
X01ldGFtb3JwaFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoKTsKIAog
LyoqCi0gIEBjbGFzcyBfU2ltcGxlTWV0YW1vcnBoVmlldwotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuX01ldGFtb3JwaAotICBAcHJpdmF0
ZQorICBgbG9jYCBsb29rcyB1cCB0aGUgc3RyaW5nIGluIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBo
YXNoLgorICBUaGlzIGlzIGEgY29udmVuaWVudCB3YXkgdG8gbG9jYWxpemUgdGV4dC4gRm9yIGV4
YW1wbGU6CisKKyAgYGBgaHRtbAorICA8c2NyaXB0IHR5cGU9InRleHQveC1oYW5kbGViYXJzIiBk
YXRhLXRlbXBsYXRlLW5hbWU9ImhvbWUiPgorICAgIHt7bG9jICJ3ZWxjb21lIn19CisgIDwvc2Ny
aXB0PgorICBgYGAKKworICBUYWtlIG5vdGUgdGhhdCBgIndlbGNvbWUiYCBpcyBhIHN0cmluZyBh
bmQgbm90IGFuIG9iamVjdAorICByZWZlcmVuY2UuCisKKyAgQG1ldGhvZCBsb2MKKyAgQGZvciBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMKKyAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5n
IHRvIGZvcm1hdAogKi8KLUVtYmVyLl9TaW1wbGVNZXRhbW9ycGhWaWV3ID0gRW1iZXIuQ29yZVZp
ZXcuZXh0ZW5kKEVtYmVyLl9NZXRhbW9ycGgpOwogCitFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVy
SGVscGVyKCdsb2MnLCBmdW5jdGlvbiBsb2NIZWxwZXIoc3RyKSB7CisgIHJldHVybiBFbWJlci5T
dHJpbmcubG9jKHN0cik7Cit9KTsKKworfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKKworfSko
KTsKKworCisKKyhmdW5jdGlvbigpIHsKIAogfSkoKTsKIAogCiAKIChmdW5jdGlvbigpIHsKLS8q
Z2xvYmFscyBIYW5kbGViYXJzICovCi0vKmpzaGludCBuZXdjYXA6ZmFsc2UqLwogLyoqCiBAbW9k
dWxlIGVtYmVyCiBAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKICovCiAKLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJh
cnMuZ2V0OwotdmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVNb2R1bGUoJ21ldGFtb3JwaCcpOwotZnVu
Y3Rpb24gU2ltcGxlSGFuZGxlYmFyc1ZpZXcocGF0aCwgcGF0aFJvb3QsIGlzRXNjYXBlZCwgdGVt
cGxhdGVEYXRhKSB7Ci0gIHRoaXMucGF0aCA9IHBhdGg7Ci0gIHRoaXMucGF0aFJvb3QgPSBwYXRo
Um9vdDsKLSAgdGhpcy5pc0VzY2FwZWQgPSBpc0VzY2FwZWQ7Ci0gIHRoaXMudGVtcGxhdGVEYXRh
ID0gdGVtcGxhdGVEYXRhOwotCi0gIHRoaXMubW9ycGggPSBNZXRhbW9ycGgoKTsKLSAgdGhpcy5z
dGF0ZSA9ICdwcmVSZW5kZXInOwotICB0aGlzLnVwZGF0ZUlkID0gbnVsbDsKLX0KLQotRW1iZXIu
X1NpbXBsZUhhbmRsZWJhcnNWaWV3ID0gU2ltcGxlSGFuZGxlYmFyc1ZpZXc7Ci0KLVNpbXBsZUhh
bmRsZWJhcnNWaWV3LnByb3RvdHlwZSA9IHsKLSAgaXNWaXJ0dWFsOiB0cnVlLAotICBpc1ZpZXc6
IHRydWUsCi0KLSAgZGVzdHJveTogZnVuY3Rpb24gKCkgewotICAgIGlmICh0aGlzLnVwZGF0ZUlk
KSB7Ci0gICAgICBFbWJlci5ydW4uY2FuY2VsKHRoaXMudXBkYXRlSWQpOwotICAgICAgdGhpcy51
cGRhdGVJZCA9IG51bGw7Ci0gICAgfQotICAgIHRoaXMubW9ycGggPSBudWxsOwotICB9LAotCi0g
IHByb3BlcnR5RGlkQ2hhbmdlOiBFbWJlci5LLAordmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0g
RW1iZXIuZ2V0OwogCi0gIG5vcm1hbGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHBh
dGggPSB0aGlzLnBhdGgsCi0gICAgICAgIHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwKLSAgICAg
ICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7CisvKioKKyAgVGhlIGludGVybmFsIGNsYXNzIHVzZWQg
dG8gY3JlYXRlIHRleHQgaW5wdXRzIHdoZW4gdGhlIGB7e2lucHV0fX1gCisgIGhlbHBlciBpcyB1
c2VkIHdpdGggYHR5cGVgIG9mIGBjaGVja2JveGAuCiAKLSAgICAvLyBVc2UgdGhlIHBhdGhSb290
IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcwotICAgIC8vIGhhcHBl
bnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgaW50bwotICAg
IC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRleHQgYW5kIGEg
cGF0aAotICAgIC8vIG9mIGAnJ2AuCi0gICAgaWYgKHBhdGggPT09ICcnKSB7Ci0gICAgICByZXN1
bHQgPSBwYXRoUm9vdDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcGxhdGVEYXRhID0gdGhpcy50
ZW1wbGF0ZURhdGE7Ci0gICAgICByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRo
LCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAgICB9CisgIFNlZSBbaGFuZGxlYmFycy5oZWxw
ZXJzLmlucHV0XSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0
aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRldGFpbHMuCiAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9
LAorICAjIyBEaXJlY3QgbWFuaXB1bGF0aW9uIG9mIGBjaGVja2VkYAogCi0gIHJlbmRlclRvQnVm
ZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB2YXIgc3RyaW5nID0gJyc7CisgIFRoZSBgY2hl
Y2tlZGAgYXR0cmlidXRlIG9mIGFuIGBFbWJlci5DaGVja2JveGAgb2JqZWN0IHNob3VsZCBhbHdh
eXMgYmUgc2V0CisgIHRocm91Z2ggdGhlIEVtYmVyIG9iamVjdCBvciBieSBpbnRlcmFjdGluZyB3
aXRoIGl0cyByZW5kZXJlZCBlbGVtZW50CisgIHJlcHJlc2VudGF0aW9uIHZpYSB0aGUgbW91c2Us
IGtleWJvYXJkLCBvciB0b3VjaC4gVXBkYXRpbmcgdGhlIHZhbHVlIG9mIHRoZQorICBjaGVja2Jv
eCB2aWEgalF1ZXJ5IHdpbGwgcmVzdWx0IGluIHRoZSBjaGVja2VkIHZhbHVlIG9mIHRoZSBvYmpl
Y3QgYW5kIGl0cworICBlbGVtZW50IGxvc2luZyBzeW5jaHJvbml6YXRpb24uCiAKLSAgICBzdHJp
bmcgKz0gdGhpcy5tb3JwaC5zdGFydFRhZygpOwotICAgIHN0cmluZyArPSB0aGlzLnJlbmRlcigp
OwotICAgIHN0cmluZyArPSB0aGlzLm1vcnBoLmVuZFRhZygpOworICAjIyBMYXlvdXQgYW5kIExh
eW91dE5hbWUgcHJvcGVydGllcwogCi0gICAgYnVmZmVyLnB1c2goc3RyaW5nKTsKLSAgfSwKKyAg
QmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBh
bmQgYGxheW91dE5hbWVgCisgIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgYXBwbGllZC4gU2VlIFtF
bWJlci5WaWV3XSgvYXBpL2NsYXNzZXMvRW1iZXIuVmlldy5odG1sKSdzCisgIGxheW91dCBzZWN0
aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi0gIHJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAg
Ly8gSWYgbm90IGludm9rZWQgdmlhIGEgdHJpcGxlLW11c3RhY2hlICh7e3tmb299fX0pLCBlc2Nh
cGUKLSAgICAvLyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUuCi0gICAgdmFyIGVzY2FwZSA9
IHRoaXMuaXNFc2NhcGVkOwotICAgIHZhciByZXN1bHQgPSB0aGlzLm5vcm1hbGl6ZWRWYWx1ZSgp
OworICBAY2xhc3MgQ2hlY2tib3gKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJl
ci5WaWV3CisqLworRW1iZXIuQ2hlY2tib3ggPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgIGNsYXNz
TmFtZXM6IFsnZW1iZXItY2hlY2tib3gnXSwKIAotICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwg
cmVzdWx0ID09PSB1bmRlZmluZWQpIHsKLSAgICAgIHJlc3VsdCA9ICIiOwotICAgIH0gZWxzZSBp
ZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcpKSB7Ci0gICAgICBy
ZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAgICB9CisgIHRhZ05hbWU6ICdpbnB1dCcsCiAKLSAg
ICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lv
bihyZXN1bHQpOyB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKKyAgYXR0cmlidXRlQmluZGlu
Z3M6IFsndHlwZScsICdjaGVja2VkJywgJ2luZGV0ZXJtaW5hdGUnLCAnZGlzYWJsZWQnLCAndGFi
aW5kZXgnLCAnbmFtZSddLAogCi0gIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsKLSAgICBzd2l0Y2go
dGhpcy5zdGF0ZSkgewotICAgICAgY2FzZSAncHJlUmVuZGVyJzoKLSAgICAgIGNhc2UgJ2Rlc3Ry
b3llZCc6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnaW5CdWZmZXInOgotICAgICAgICB0
aHJvdyBuZXcgRW1iZXIuRXJyb3IoIlNvbWV0aGluZyB5b3UgZGlkIHRyaWVkIHRvIHJlcGxhY2Ug
YW4ge3tleHByZXNzaW9ufX0gYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBET00uIik7
Ci0gICAgICBjYXNlICdoYXNFbGVtZW50JzoKLSAgICAgIGNhc2UgJ2luRE9NJzoKLSAgICAgICAg
dGhpcy51cGRhdGVJZCA9IEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRoaXMsICd1
cGRhdGUnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICB0eXBlOiAiY2hlY2tib3giLAorICBj
aGVja2VkOiBmYWxzZSwKKyAgZGlzYWJsZWQ6IGZhbHNlLAorICBpbmRldGVybWluYXRlOiBmYWxz
ZSwKIAotICAgIHJldHVybiB0aGlzOworICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9z
dXBlcigpOworICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX3VwZGF0ZUVsZW1lbnRW
YWx1ZSk7CiAgIH0sCiAKLSAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7Ci0gICAgdGhpcy51cGRhdGVJ
ZCA9IG51bGw7Ci0gICAgdGhpcy5tb3JwaC5odG1sKHRoaXMucmVuZGVyKCkpOworICBkaWRJbnNl
cnRFbGVtZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMuZ2V0
KCdlbGVtZW50JykuaW5kZXRlcm1pbmF0ZSA9ICEhdGhpcy5nZXQoJ2luZGV0ZXJtaW5hdGUnKTsK
ICAgfSwKIAotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0YXRlKSB7Ci0gICAgdGhpcy5zdGF0
ZSA9IHN0YXRlOworICBfdXBkYXRlRWxlbWVudFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICBzZXQo
dGhpcywgJ2NoZWNrZWQnLCB0aGlzLiQoKS5wcm9wKCdjaGVja2VkJykpOwogICB9Ci19OworfSk7
CiAKLXZhciBzdGF0ZXMgPSBFbWJlci5WaWV3LmNsb25lU3RhdGVzKEVtYmVyLlZpZXcuc3RhdGVz
KSwgbWVyZ2UgPSBFbWJlci5tZXJnZTsKK30pKCk7CiAKLW1lcmdlKHN0YXRlcy5fZGVmYXVsdCwg
ewotICByZXJlbmRlcklmTmVlZGVkOiBFbWJlci5LCi19KTsKIAotbWVyZ2Uoc3RhdGVzLmluRE9N
LCB7Ci0gIHJlcmVuZGVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBpZiAoZ2V0KHZp
ZXcsICdub3JtYWxpemVkVmFsdWUnKSAhPT0gdmlldy5fbGFzdE5vcm1hbGl6ZWRWYWx1ZSkgewot
ICAgICAgdmlldy5yZXJlbmRlcigpOwotICAgIH0KLSAgfQotfSk7CiAKKyhmdW5jdGlvbigpIHsK
IC8qKgotICBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJpdmF0ZSB2aWV3IGNy
ZWF0ZWQgYnkgdGhlIEhhbmRsZWJhcnMKLSAgYHt7YmluZH19YCBoZWxwZXJzIHRoYXQgaXMgdXNl
ZCB0byBrZWVwIHRyYWNrIG9mIGJvdW5kIHByb3BlcnRpZXMuCitAbW9kdWxlIGVtYmVyCitAc3Vi
bW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKyovCiAKLSAgRXZlcnkgdGltZSBhIHByb3BlcnR5IGlz
IGJvdW5kIHVzaW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFub255bW91cyBzdWJjbGFzcwotICBv
ZiBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9w
cmlhdGUgc3ViLXRlbXBsYXRlCi0gIGFuZCBjb250ZXh0IHNldCB1cC4gV2hlbiB0aGUgYXNzb2Np
YXRlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBqdXN0IHRoZSB0ZW1wbGF0ZQotICBmb3IgdGhpcyB2aWV3
IHdpbGwgcmUtcmVuZGVyLgordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0Owog
Ci0gIEBjbGFzcyBfSGFuZGxlYmFyc0JvdW5kVmlldworLyoqCisgIFNoYXJlZCBtaXhpbiB1c2Vk
IGJ5IGBFbWJlci5UZXh0RmllbGRgIGFuZCBgRW1iZXIuVGV4dEFyZWFgLgorCisgIEBjbGFzcyBU
ZXh0U3VwcG9ydAogICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLl9NZXRhbW9y
cGhWaWV3CiAgIEBwcml2YXRlCiAqLwotRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgPSBFbWJl
ci5fTWV0YW1vcnBoVmlldy5leHRlbmQoewotICBpbnN0cnVtZW50TmFtZTogJ3JlbmRlci5ib3Vu
ZEhhbmRsZWJhcnMnLAotICBzdGF0ZXM6IHN0YXRlcywKK0VtYmVyLlRleHRTdXBwb3J0ID0gRW1i
ZXIuTWl4aW4uY3JlYXRlKHsKKyAgdmFsdWU6ICIiLAorCisgIGF0dHJpYnV0ZUJpbmRpbmdzOiBb
J3BsYWNlaG9sZGVyJywgJ2Rpc2FibGVkJywgJ21heGxlbmd0aCcsICd0YWJpbmRleCcsICdyZWFk
b25seSddLAorICBwbGFjZWhvbGRlcjogbnVsbCwKKyAgZGlzYWJsZWQ6IGZhbHNlLAorICBtYXhs
ZW5ndGg6IG51bGwsCisKKyAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5fc3VwZXIoKTsK
KyAgICB0aGlzLm9uKCJmb2N1c091dCIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5n
ZSk7CisgICAgdGhpcy5vbigiY2hhbmdlIiwgdGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hh
bmdlKTsKKyAgICB0aGlzLm9uKCJwYXN0ZSIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENo
YW5nZSk7CisgICAgdGhpcy5vbigiY3V0IiwgdGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hh
bmdlKTsKKyAgICB0aGlzLm9uKCJpbnB1dCIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENo
YW5nZSk7CisgICAgdGhpcy5vbigia2V5VXAiLCB0aGlzLCB0aGlzLmludGVycHJldEtleUV2ZW50
cyk7CisgIH0sCiAKICAgLyoqCi0gICAgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlm
IHRoZSBgZGlzcGxheVRlbXBsYXRlYCBvcgotICAgIGBpbnZlcnNlVGVtcGxhdGVgIHNob3VsZCBi
ZSByZW5kZXJlZC4gVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzCi0gICAgYSB2
YWx1ZSBhbmQgcmV0dXJucyBhIEJvb2xlYW4uCisgICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdo
ZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleS4KIAotICAgIEBwcm9wZXJ0eSBzaG91
bGREaXNwbGF5RnVuYwotICAgIEB0eXBlIEZ1bmN0aW9uCisgICAgVGhpcyBpcyBzaW1pbGFyIHRv
IHRoZSBge3thY3Rpb259fWAgaGVscGVyLCBidXQgaXMgZmlyZWQgd2hlbgorICAgIHRoZSB1c2Vy
IHByZXNzZXMgdGhlIHJldHVybiBrZXkgd2hlbiBlZGl0aW5nIGEgdGV4dCBmaWVsZCwgYW5kIHNl
bmRzCisgICAgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhcyB0aGUgY29udGV4dC4KKworICAgIEBw
cm9wZXJ0eSBhY3Rpb24KKyAgICBAdHlwZSBTdHJpbmcKICAgICBAZGVmYXVsdCBudWxsCiAgICov
Ci0gIHNob3VsZERpc3BsYXlGdW5jOiBudWxsLAorICBhY3Rpb246IG51bGwsCiAKICAgLyoqCi0g
ICAgV2hldGhlciB0aGUgdGVtcGxhdGUgcmVuZGVyZWQgYnkgdGhpcyB2aWV3IGdldHMgcGFzc2Vk
IHRoZSBjb250ZXh0IG9iamVjdAotICAgIG9mIGl0cyBwYXJlbnQgdGVtcGxhdGUsIG9yIGdldHMg
cGFzc2VkIHRoZSB2YWx1ZSBvZiByZXRyaWV2aW5nIGBwYXRoYAotICAgIGZyb20gdGhlIGBwYXRo
Um9vdGAuCisgICAgVGhlIGV2ZW50IHRoYXQgc2hvdWxkIHNlbmQgdGhlIGFjdGlvbi4KIAotICAg
IEZvciBleGFtcGxlLCB0aGlzIGlzIHRydWUgd2hlbiB1c2luZyB0aGUgYHt7I2lmfX1gIGhlbHBl
ciwgYmVjYXVzZSB0aGUKLSAgICB0ZW1wbGF0ZSBpbnNpZGUgdGhlIGhlbHBlciBzaG91bGQgbG9v
ayB1cCBwcm9wZXJ0aWVzIHJlbGF0aXZlIHRvIHRoZSBzYW1lCi0gICAgb2JqZWN0IGFzIG91dHNp
ZGUgdGhlIGJsb2NrLiBUaGlzIHdvdWxkIGJlIGBmYWxzZWAgd2hlbiB1c2VkIHdpdGggYHt7I3dp
dGgKLSAgICBmb299fWAgYmVjYXVzZSB0aGUgdGVtcGxhdGUgc2hvdWxkIHJlY2VpdmUgdGhlIG9i
amVjdCBmb3VuZCBieSBldmFsdWF0aW5nCi0gICAgYGZvb2AuCisgICAgT3B0aW9ucyBhcmU6CiAK
LSAgICBAcHJvcGVydHkgcHJlc2VydmVDb250ZXh0CisgICAgKiBgZW50ZXJgOiB0aGUgdXNlciBw
cmVzc2VkIGVudGVyCisgICAgKiBga2V5UHJlc3NgOiB0aGUgdXNlciBwcmVzc2VkIGEga2V5CisK
KyAgICBAcHJvcGVydHkgb25FdmVudAorICAgIEB0eXBlIFN0cmluZworICAgIEBkZWZhdWx0IGVu
dGVyCisgICovCisgIG9uRXZlbnQ6ICdlbnRlcicsCisKKyAgLyoqCisgICAgV2hldGhlciB0aGV5
IGBrZXlVcGAgZXZlbnQgdGhhdCB0cmlnZ2VycyBhbiBgYWN0aW9uYCB0byBiZSBzZW50IGNvbnRp
bnVlcworICAgIHByb3BhZ2F0aW5nIHRvIG90aGVyIHZpZXdzLgorCisgICAgQnkgZGVmYXVsdCwg
d2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5IG9uIHRoZWlyIGtleWJvYXJkIGFu
ZAorICAgIHRoZSB0ZXh0IGZpZWxkIGhhcyBhbiBgYWN0aW9uYCBzZXQsIHRoZSBhY3Rpb24gd2ls
bCBiZSBzZW50IHRvIHRoZSB2aWV3J3MKKyAgICBjb250cm9sbGVyIGFuZCB0aGUga2V5IGV2ZW50
IHdpbGwgc3RvcCBwcm9wYWdhdGluZy4KKworICAgIElmIHlvdSB3b3VsZCBsaWtlIHBhcmVudCB2
aWV3cyB0byByZWNlaXZlIHRoZSBga2V5VXBgIGV2ZW50IGV2ZW4gYWZ0ZXIgYW4KKyAgICBhY3Rp
b24gaGFzIGJlZW4gZGlzcGF0Y2hlZCwgc2V0IGBidWJibGVzYCB0byB0cnVlLgorCisgICAgQHBy
b3BlcnR5IGJ1YmJsZXMKICAgICBAdHlwZSBCb29sZWFuCiAgICAgQGRlZmF1bHQgZmFsc2UKICAg
Ki8KLSAgcHJlc2VydmVDb250ZXh0OiBmYWxzZSwKKyAgYnViYmxlczogZmFsc2UsCisKKyAgaW50
ZXJwcmV0S2V5RXZlbnRzOiBmdW5jdGlvbihldmVudCkgeworICAgIHZhciBtYXAgPSBFbWJlci5U
ZXh0U3VwcG9ydC5LRVlfRVZFTlRTOworICAgIHZhciBtZXRob2QgPSBtYXBbZXZlbnQua2V5Q29k
ZV07CisKKyAgICB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UoKTsKKyAgICBpZiAobWV0aG9k
KSB7IHJldHVybiB0aGlzW21ldGhvZF0oZXZlbnQpOyB9CisgIH0sCisKKyAgX2VsZW1lbnRWYWx1
ZURpZENoYW5nZTogZnVuY3Rpb24oKSB7CisgICAgc2V0KHRoaXMsICd2YWx1ZScsIHRoaXMuJCgp
LnZhbCgpKTsKKyAgfSwKIAogICAvKioKLSAgICBJZiBgcHJlc2VydmVDb250ZXh0YCBpcyB0cnVl
LCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICB0byByZW5kZXIgdGhl
IHRlbXBsYXRlLgorICAgIFRoZSBhY3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIGluc2Vy
dHMgYSBuZXcgbGluZS4KIAotICAgIEBwcm9wZXJ0eSBwcmV2aW91c0NvbnRleHQKLSAgICBAdHlw
ZSBPYmplY3QKKyAgICBDYWxsZWQgYnkgdGhlIGBFbWJlci5UZXh0U3VwcG9ydGAgbWl4aW4gb24g
a2V5VXAgaWYga2V5Y29kZSBtYXRjaGVzIDEzLgorICAgIFVzZXMgc2VuZEFjdGlvbiB0byBzZW5k
IHRoZSBgZW50ZXJgIGFjdGlvbiB0byB0aGUgY29udHJvbGxlci4KKworICAgIEBtZXRob2QgaW5z
ZXJ0TmV3bGluZQorICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAgICovCi0gIHByZXZpb3VzQ29u
dGV4dDogbnVsbCwKKyAgaW5zZXJ0TmV3bGluZTogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICBzZW5k
QWN0aW9uKCdlbnRlcicsIHRoaXMsIGV2ZW50KTsKKyAgICBzZW5kQWN0aW9uKCdpbnNlcnQtbmV3
bGluZScsIHRoaXMsIGV2ZW50KTsKKyAgfSwKIAogICAvKioKLSAgICBUaGUgdGVtcGxhdGUgdG8g
cmVuZGVyIHdoZW4gYHNob3VsZERpc3BsYXlGdW5jYCBldmFsdWF0ZXMgdG8gYHRydWVgLgorICAg
IENhbGxlZCB3aGVuIHRoZSB1c2VyIGhpdHMgZXNjYXBlLgogCi0gICAgQHByb3BlcnR5IGRpc3Bs
YXlUZW1wbGF0ZQotICAgIEB0eXBlIEZ1bmN0aW9uCi0gICAgQGRlZmF1bHQgbnVsbAorICAgIENh
bGxlZCBieSB0aGUgYEVtYmVyLlRleHRTdXBwb3J0YCBtaXhpbiBvbiBrZXlVcCBpZiBrZXljb2Rl
IG1hdGNoZXMgMjcuCisgICAgVXNlcyBzZW5kQWN0aW9uIHRvIHNlbmQgdGhlIGBlc2NhcGUtcHJl
c3NgIGFjdGlvbiB0byB0aGUgY29udHJvbGxlci4KKworICAgIEBtZXRob2QgY2FuY2VsCisgICAg
QHBhcmFtIHtFdmVudH0gZXZlbnQKICAgKi8KLSAgZGlzcGxheVRlbXBsYXRlOiBudWxsLAorICBj
YW5jZWw6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgc2VuZEFjdGlvbignZXNjYXBlLXByZXNzJywg
dGhpcywgZXZlbnQpOworICB9LAogCiAgIC8qKgotICAgIFRoZSB0ZW1wbGF0ZSB0byByZW5kZXIg
d2hlbiBgc2hvdWxkRGlzcGxheUZ1bmNgIGV2YWx1YXRlcyB0byBgZmFsc2VgLgorICAgIENhbGxl
ZCB3aGVuIHRoZSB0ZXh0IGFyZWEgaXMgZm9jdXNlZC4KIAotICAgIEBwcm9wZXJ0eSBpbnZlcnNl
VGVtcGxhdGUKLSAgICBAdHlwZSBGdW5jdGlvbgotICAgIEBkZWZhdWx0IG51bGwKKyAgICBAbWV0
aG9kIGZvY3VzSW4KKyAgICBAcGFyYW0ge0V2ZW50fSBldmVudAogICAqLwotICBpbnZlcnNlVGVt
cGxhdGU6IG51bGwsCisgIGZvY3VzSW46IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgc2VuZEFjdGlv
bignZm9jdXMtaW4nLCB0aGlzLCBldmVudCk7CisgIH0sCisKKyAgLyoqCisgICAgQ2FsbGVkIHdo
ZW4gdGhlIHRleHQgYXJlYSBpcyBibHVycmVkLgorCisgICAgQG1ldGhvZCBmb2N1c091dAorICAg
IEBwYXJhbSB7RXZlbnR9IGV2ZW50CisgICovCisgIGZvY3VzT3V0OiBmdW5jdGlvbihldmVudCkg
eworICAgIHNlbmRBY3Rpb24oJ2ZvY3VzLW91dCcsIHRoaXMsIGV2ZW50KTsKKyAgfSwKKworICAv
KioKKyAgICBUaGUgYWN0aW9uIHRvIGJlIHNlbnQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEga2V5
LiBFbmFibGVkIGJ5IHNldHRpbmcKKyAgICB0aGUgYG9uRXZlbnRgIHByb3BlcnR5IHRvIGBrZXlQ
cmVzc2AuCisKKyAgICBVc2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGtleVByZXNzYCBhY3Rp
b24gdG8gdGhlIGNvbnRyb2xsZXIuCisKKyAgICBAbWV0aG9kIGtleVByZXNzCisgICAgQHBhcmFt
IHtFdmVudH0gZXZlbnQKKyAgKi8KKyAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAg
c2VuZEFjdGlvbigna2V5LXByZXNzJywgdGhpcywgZXZlbnQpOworICB9CisKK30pOworCitFbWJl
ci5UZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0geworICAxMzogJ2luc2VydE5ld2xpbmUnLAorICAy
NzogJ2NhbmNlbCcKK307CisKKy8vIEluIHByaW5jaXBsZSwgdGhpcyBzaG91bGRuJ3QgYmUgbmVj
ZXNzYXJ5LCBidXQgdGhlIGxlZ2FjeQorLy8gc2VjdGlvbkFjdGlvbiBzZW1hbnRpY3MgZm9yIFRl
eHRGaWVsZCBhcmUgZGlmZmVyZW50IGZyb20KKy8vIHRoZSBjb21wb25lbnQgc2VtYW50aWNzIHNv
IHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlbS4KK2Z1bmN0aW9uIHNlbmRBY3Rpb24oZXZlbnRO
YW1lLCB2aWV3LCBldmVudCkgeworICB2YXIgYWN0aW9uID0gZ2V0KHZpZXcsIGV2ZW50TmFtZSks
CisgICAgICBvbiA9IGdldCh2aWV3LCAnb25FdmVudCcpLAorICAgICAgdmFsdWUgPSBnZXQodmll
dywgJ3ZhbHVlJyk7CisKKyAgLy8gYmFjay1jb21wYXQgc3VwcG9ydCBmb3Iga2V5UHJlc3MgYXMg
YW4gZXZlbnQgbmFtZSBldmVuIHRob3VnaAorICAvLyBpdCdzIGFsc28gYSBtZXRob2QgbmFtZSB0
aGF0IGNvbnN1bWVzIHRoZSBldmVudCAoYW5kIHRoZXJlZm9yZQorICAvLyBpbmNvbXBhdGlibGUg
d2l0aCBzZW5kQWN0aW9uIHNlbWFudGljcykuCisgIGlmIChvbiA9PT0gZXZlbnROYW1lIHx8IChv
biA9PT0gJ2tleVByZXNzJyAmJiBldmVudE5hbWUgPT09ICdrZXktcHJlc3MnKSkgeworICAgIHZp
ZXcuc2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOworICB9CisKKyAgdmlldy5zZW5kQWN0aW9u
KGV2ZW50TmFtZSwgdmFsdWUpOworCisgIGlmIChhY3Rpb24gfHwgb24gPT09IGV2ZW50TmFtZSkg
eworICAgIGlmKCFnZXQodmlldywgJ2J1YmJsZXMnKSkgeworICAgICAgZXZlbnQuc3RvcFByb3Bh
Z2F0aW9uKCk7CisgICAgfQorICB9Cit9CiAKK30pKCk7CiAKLSAgLyoqCi0gICAgVGhlIHBhdGgg
dG8gbG9vayB1cCBvbiBgcGF0aFJvb3RgIHRoYXQgaXMgcGFzc2VkIHRvCi0gICAgYHNob3VsZERp
c3BsYXlGdW5jYCB0byBkZXRlcm1pbmUgd2hpY2ggdGVtcGxhdGUgdG8gcmVuZGVyLgogCi0gICAg
SW4gYWRkaXRpb24sIGlmIGBwcmVzZXJ2ZUNvbnRleHRgIGlzIGBmYWxzZSxgIHRoZSBvYmplY3Qg
YXQgdGhpcyBwYXRoIHdpbGwKLSAgICBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlIHdoZW4gcmVu
ZGVyaW5nLgogCi0gICAgQHByb3BlcnR5IHBhdGgKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVm
YXVsdCBudWxsCi0gICovCi0gIHBhdGg6IG51bGwsCisoZnVuY3Rpb24oKSB7CisvKioKK0Btb2R1
bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworKi8KIAotICAvKioKLSAgICBU
aGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGBwYXRoYCB3aWxsIGJlIGxvb2tlZCB1cC4gU29tZXRp
bWVzIHRoaXMgaXMgdGhlCi0gICAgc2FtZSBhcyB0aGUgYHByZXZpb3VzQ29udGV4dGAsIGJ1dCBp
biBjYXNlcyB3aGVyZSB0aGlzIHZpZXcgaGFzIGJlZW4KLSAgICBnZW5lcmF0ZWQgZm9yIHBhdGhz
IHRoYXQgc3RhcnQgd2l0aCBhIGtleXdvcmQgc3VjaCBhcyBgdmlld2Agb3IKLSAgICBgY29udHJv
bGxlcmAsIHRoZSBwYXRoIHJvb3Qgd2lsbCBiZSB0aGF0IHJlc29sdmVkIG9iamVjdC4KK3ZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKIAotICAgIEBwcm9wZXJ0eSBwYXRoUm9v
dAotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBwYXRoUm9vdDogbnVsbCwKKy8qKgogCi0gIG5v
cm1hbGl6ZWRWYWx1ZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHBhdGgg
PSBnZXQodGhpcywgJ3BhdGgnKSwKLSAgICAgICAgcGF0aFJvb3QgID0gZ2V0KHRoaXMsICdwYXRo
Um9vdCcpLAotICAgICAgICB2YWx1ZU5vcm1hbGl6ZXIgPSBnZXQodGhpcywgJ3ZhbHVlTm9ybWFs
aXplckZ1bmMnKSwKLSAgICAgICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7CisgIFRoZSBpbnRlcm5h
bCBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB0ZXh0IGlucHV0cyB3aGVuIHRoZSBge3tpbnB1dH19YAor
ICBoZWxwZXIgaXMgdXNlZCB3aXRoIGB0eXBlYCBvZiBgdGV4dGAuCiAKLSAgICAvLyBVc2UgdGhl
IHBhdGhSb290IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcwotICAg
IC8vIGhhcHBlbnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQg
aW50bwotICAgIC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRl
eHQgYW5kIGEgcGF0aAotICAgIC8vIG9mIGAnJ2AuCi0gICAgaWYgKHBhdGggPT09ICcnKSB7Ci0g
ICAgICByZXN1bHQgPSBwYXRoUm9vdDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcGxhdGVEYXRh
ID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLSAgICAgIHJlc3VsdCA9IGhhbmRsZWJhcnNH
ZXQocGF0aFJvb3QsIHBhdGgsIHsgZGF0YTogdGVtcGxhdGVEYXRhIH0pOwotICAgIH0KKyAgU2Vl
IFtIYW5kbGViYXJzLmhlbHBlcnMuaW5wdXRdKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMuaHRtbCNtZXRob2RfaW5wdXQpICBmb3IgdXNhZ2UgZGV0YWlscy4KIAotICAgIHJl
dHVybiB2YWx1ZU5vcm1hbGl6ZXIgPyB2YWx1ZU5vcm1hbGl6ZXIocmVzdWx0KSA6IHJlc3VsdDsK
LSAgfSkucHJvcGVydHkoJ3BhdGgnLCAncGF0aFJvb3QnLCAndmFsdWVOb3JtYWxpemVyRnVuYycp
LnZvbGF0aWxlKCksCisgICMjIExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCiAKLSAg
cmVyZW5kZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jdXJyZW50U3RhdGUucmVy
ZW5kZXJJZk5lZWRlZCh0aGlzKTsKLSAgfSwKKyAgQmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVu
dHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBhbmQgYGxheW91dE5hbWVgCisgIHByb3BlcnRp
ZXMgd2lsbCBub3QgYmUgYXBwbGllZC4gU2VlIFtFbWJlci5WaWV3XSgvYXBpL2NsYXNzZXMvRW1i
ZXIuVmlldy5odG1sKSdzCisgIGxheW91dCBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgog
Ci0gIC8qKgotICAgIERldGVybWluZXMgd2hpY2ggdGVtcGxhdGUgdG8gaW52b2tlLCBzZXRzIHVw
IHRoZSBjb3JyZWN0IHN0YXRlIGJhc2VkIG9uCi0gICAgdGhhdCBsb2dpYywgdGhlbiBpbnZva2Vz
IHRoZSBkZWZhdWx0IGBFbWJlci5WaWV3YCBgcmVuZGVyYCBpbXBsZW1lbnRhdGlvbi4KKyAgQGNs
YXNzIFRleHRGaWVsZAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLkNvbXBv
bmVudAorICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAorKi8KK0VtYmVyLlRleHRGaWVsZCA9IEVt
YmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIuVGV4dFN1cHBvcnQsIHsKIAotICAgIFRoaXMgbWV0
aG9kIHdpbGwgZmlyc3QgbG9vayB1cCB0aGUgYHBhdGhgIGtleSBvbiBgcGF0aFJvb3RgLAotICAg
IHRoZW4gcGFzcyB0aGF0IHZhbHVlIHRvIHRoZSBgc2hvdWxkRGlzcGxheUZ1bmNgIGZ1bmN0aW9u
LiBJZiB0aGF0IHJldHVybnMKLSAgICBgdHJ1ZSxgIHRoZSBgZGlzcGxheVRlbXBsYXRlYCBmdW5j
dGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRvIERPTS4gT3RoZXJ3aXNlLAotICAgIGBpbnZlcnNlVGVt
cGxhdGVgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgcmVuZGVyZWQuCisgIGNsYXNzTmFtZXM6IFsn
ZW1iZXItdGV4dC1maWVsZCddLAorICB0YWdOYW1lOiAiaW5wdXQiLAorICBhdHRyaWJ1dGVCaW5k
aW5nczogWyd0eXBlJywgJ3ZhbHVlJywgJ3NpemUnLCAncGF0dGVybicsICduYW1lJ10sCiAKLSAg
ICBGb3IgZXhhbXBsZSwgaWYgdGhpcyBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIHJlcHJl
c2VudGVkIHRoZSBge3sjd2l0aAotICAgIGZvb319YCBoZWxwZXIsIGl0IHdvdWxkIGxvb2sgdXAg
dGhlIGBmb29gIHByb3BlcnR5IG9mIGl0cyBjb250ZXh0LCBhbmQKLSAgICBgc2hvdWxkRGlzcGxh
eUZ1bmNgIHdvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZS4gVGhlIG9iamVjdCBmb3VuZCBieSBsb29r
aW5nCi0gICAgdXAgYGZvb2Agd291bGQgYmUgcGFzc2VkIHRvIGBkaXNwbGF5VGVtcGxhdGVgLgor
ICAvKioKKyAgICBUaGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuIEFz
IHRoZSB1c2VyIGlucHV0cyB0ZXh0LCB0aGlzCisgICAgcHJvcGVydHkgaXMgdXBkYXRlZCBsaXZl
LgogCi0gICAgQG1ldGhvZCByZW5kZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0g
YnVmZmVyCisgICAgQHByb3BlcnR5IHZhbHVlCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1
bHQgIiIKICAgKi8KLSAgcmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICAvLyBJZiBub3Qg
aW52b2tlZCB2aWEgYSB0cmlwbGUtbXVzdGFjaGUgKHt7e2Zvb319fSksIGVzY2FwZQotICAgIC8v
IHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZS4KLSAgICB2YXIgZXNjYXBlID0gZ2V0KHRoaXMs
ICdpc0VzY2FwZWQnKTsKLQotICAgIHZhciBzaG91bGREaXNwbGF5ID0gZ2V0KHRoaXMsICdzaG91
bGREaXNwbGF5RnVuYycpLAotICAgICAgICBwcmVzZXJ2ZUNvbnRleHQgPSBnZXQodGhpcywgJ3By
ZXNlcnZlQ29udGV4dCcpLAotICAgICAgICBjb250ZXh0ID0gZ2V0KHRoaXMsICdwcmV2aW91c0Nv
bnRleHQnKTsKLQotICAgIHZhciBpbnZlcnNlVGVtcGxhdGUgPSBnZXQodGhpcywgJ2ludmVyc2VU
ZW1wbGF0ZScpLAotICAgICAgICBkaXNwbGF5VGVtcGxhdGUgPSBnZXQodGhpcywgJ2Rpc3BsYXlU
ZW1wbGF0ZScpOworICB2YWx1ZTogIiIsCiAKLSAgICB2YXIgcmVzdWx0ID0gZ2V0KHRoaXMsICdu
b3JtYWxpemVkVmFsdWUnKTsKLSAgICB0aGlzLl9sYXN0Tm9ybWFsaXplZFZhbHVlID0gcmVzdWx0
OworICAvKioKKyAgICBUaGUgYHR5cGVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4K
IAotICAgIC8vIEZpcnN0LCB0ZXN0IHRoZSBjb25kaXRpb25hbCB0byBzZWUgaWYgd2Ugc2hvdWxk
Ci0gICAgLy8gcmVuZGVyIHRoZSB0ZW1wbGF0ZSBvciBub3QuCi0gICAgaWYgKHNob3VsZERpc3Bs
YXkocmVzdWx0KSkgewotICAgICAgc2V0KHRoaXMsICd0ZW1wbGF0ZScsIGRpc3BsYXlUZW1wbGF0
ZSk7CisgICAgQHByb3BlcnR5IHR5cGUKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCAi
dGV4dCIKKyAgKi8KKyAgdHlwZTogInRleHQiLAogCi0gICAgICAvLyBJZiB3ZSBhcmUgcHJlc2Vy
dmluZyB0aGUgY29udGV4dCAoZm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgICAgIC8vIGlzIGFuICNp
ZiBibG9jaywgY2FsbCB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc2FtZSBvYmplY3QuCi0gICAgICBp
ZiAocHJlc2VydmVDb250ZXh0KSB7Ci0gICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCBjb250
ZXh0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAvLyBPdGhlcndpc2UsIGRldGVybWluZSBpZiB0
aGlzIGlzIGEgYmxvY2sgYmluZCBvciBub3QuCi0gICAgICAvLyBJZiBzbywgcGFzcyB0aGUgc3Bl
Y2lmaWVkIG9iamVjdCB0byB0aGUgdGVtcGxhdGUKLSAgICAgICAgaWYgKGRpc3BsYXlUZW1wbGF0
ZSkgewotICAgICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJpbmQgYmxvY2ssIGp1c3QgcHVzaCB0
aGUgcmVzdWx0IG9mIHRoZQotICAgICAgICAvLyBleHByZXNzaW9uIHRvIHRoZSByZW5kZXIgY29u
dGV4dCBhbmQgcmV0dXJuLgotICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0
ID09PSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9ICIiOwotICAgICAgICAgIH0g
ZWxzZSBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcpKSB7Ci0g
ICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAgICAgICAgICB9CisgIC8qKgor
ICAgIFRoZSBgc2l6ZWAgb2YgdGhlIHRleHQgZmllbGQgaW4gY2hhcmFjdGVycy4KIAotICAgICAg
ICAgIGlmIChlc2NhcGUpIHsgcmVzdWx0ID0gSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNz
aW9uKHJlc3VsdCk7IH0KLSAgICAgICAgICBidWZmZXIucHVzaChyZXN1bHQpOwotICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaW52ZXJzZVRlbXBs
YXRlKSB7Ci0gICAgICBzZXQodGhpcywgJ3RlbXBsYXRlJywgaW52ZXJzZVRlbXBsYXRlKTsKKyAg
ICBAcHJvcGVydHkgc2l6ZQorICAgIEB0eXBlIFN0cmluZworICAgIEBkZWZhdWx0IG51bGwKKyAg
Ki8KKyAgc2l6ZTogbnVsbCwKIAotICAgICAgaWYgKHByZXNlcnZlQ29udGV4dCkgewotICAgICAg
ICBzZXQodGhpcywgJ19jb250ZXh0JywgY29udGV4dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAg
ICBzZXQodGhpcywgJ19jb250ZXh0JywgcmVzdWx0KTsKLSAgICAgIH0KLSAgICB9IGVsc2Ugewot
ICAgICAgc2V0KHRoaXMsICd0ZW1wbGF0ZScsIGZ1bmN0aW9uKCkgeyByZXR1cm4gJyc7IH0pOwot
ICAgIH0KKyAgLyoqCisgICAgVGhlIGBwYXR0ZXJuYCB0aGUgcGF0dGVybiBhdHRyaWJ1dGUgb2Yg
aW5wdXQgZWxlbWVudC4KIAotICAgIHJldHVybiB0aGlzLl9zdXBlcihidWZmZXIpOwotICB9Cisg
ICAgQHByb3BlcnR5IHBhdHRlcm4KKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCBudWxs
CisgICovCisgIHBhdHRlcm46IG51bGwKIH0pOwogCiB9KSgpOwpAQCAtMTg1NjMsOTc3ICsyOTk4
MSwxMjExIEBAIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3ID0gRW1iZXIuX01ldGFtb3JwaFZp
ZXcuZXh0ZW5kKHsKIAogCiAoZnVuY3Rpb24oKSB7Ci0vKioKKy8qCiBAbW9kdWxlIGVtYmVyCiBA
c3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKICovCiAKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKLXZhciBoYW5kbGViYXJzR2V0
ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQsIG5vcm1hbGl6ZVBhdGggPSBFbWJlci5IYW5kbGViYXJz
Lm5vcm1hbGl6ZVBhdGg7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVh
Y2g7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CiAKLXZhciBFbWJlckhh
bmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJzLCBoZWxwZXJzID0gRW1iZXJIYW5kbGViYXJzLmhl
bHBlcnM7CisvKgorICBAY2xhc3MgQnV0dG9uCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVu
ZHMgRW1iZXIuVmlldworICBAdXNlcyBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0CisgIEBkZXBy
ZWNhdGVkCisqLworRW1iZXIuQnV0dG9uID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0
QWN0aW9uU3VwcG9ydCwgeworICBjbGFzc05hbWVzOiBbJ2VtYmVyLWJ1dHRvbiddLAorICBjbGFz
c05hbWVCaW5kaW5nczogWydpc0FjdGl2ZSddLAogCi0vLyBCaW5kcyBhIHByb3BlcnR5IGludG8g
dGhlIERPTS4gVGhpcyB3aWxsIGNyZWF0ZSBhIGhvb2sgaW4gRE9NIHRoYXQgdGhlCi0vLyBLVk8g
c3lzdGVtIHdpbGwgbG9vayBmb3IgYW5kIHVwZGF0ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlcy4K
LWZ1bmN0aW9uIGJpbmQocHJvcGVydHksIG9wdGlvbnMsIHByZXNlcnZlQ29udGV4dCwgc2hvdWxk
RGlzcGxheSwgdmFsdWVOb3JtYWxpemVyLCBjaGlsZFByb3BlcnRpZXMpIHsKLSAgdmFyIGRhdGEg
PSBvcHRpb25zLmRhdGEsCi0gICAgICBmbiA9IG9wdGlvbnMuZm4sCi0gICAgICBpbnZlcnNlID0g
b3B0aW9ucy5pbnZlcnNlLAotICAgICAgdmlldyA9IGRhdGEudmlldywKLSAgICAgIGN1cnJlbnRD
b250ZXh0ID0gdGhpcywKLSAgICAgIG5vcm1hbGl6ZWQsIG9ic2VydmVyLCBpOworICB0YWdOYW1l
OiAnYnV0dG9uJywKIAotICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4
dCwgcHJvcGVydHksIGRhdGEpOworICBwcm9wYWdhdGVFdmVudHM6IGZhbHNlLAogCi0gIC8vIFNl
dCB1cCBvYnNlcnZlcnMgZm9yIG9ic2VydmFibGUgb2JqZWN0cwotICBpZiAoJ29iamVjdCcgPT09
IHR5cGVvZiB0aGlzKSB7Ci0gICAgaWYgKGRhdGEuaW5zaWRlR3JvdXApIHsKLSAgICAgIG9ic2Vy
dmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRl
cicpOwotICAgICAgfTsKKyAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZScsICdkaXNhYmxlZCcs
ICdocmVmJywgJ3RhYmluZGV4J10sCiAKLSAgICAgIHZhciB0ZW1wbGF0ZSwgY29udGV4dCwgcmVz
dWx0ID0gaGFuZGxlYmFyc0dldChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpOwor
ICAvKgorICAgIEBwcml2YXRlCiAKLSAgICAgIHJlc3VsdCA9IHZhbHVlTm9ybWFsaXplcihyZXN1
bHQpOworICAgIE92ZXJyaWRlcyBgVGFyZ2V0QWN0aW9uU3VwcG9ydGAncyBgdGFyZ2V0T2JqZWN0
YCBjb21wdXRlZAorICAgIHByb3BlcnR5IHRvIHVzZSBIYW5kbGViYXJzLXNwZWNpZmljIHBhdGgg
cmVzb2x1dGlvbi4KIAotICAgICAgY29udGV4dCA9IHByZXNlcnZlQ29udGV4dCA/IGN1cnJlbnRD
b250ZXh0IDogcmVzdWx0OwotICAgICAgaWYgKHNob3VsZERpc3BsYXkocmVzdWx0KSkgewotICAg
ICAgICB0ZW1wbGF0ZSA9IGZuOwotICAgICAgfSBlbHNlIGlmIChpbnZlcnNlKSB7Ci0gICAgICAg
IHRlbXBsYXRlID0gaW52ZXJzZTsKLSAgICAgIH0KKyAgICBAcHJvcGVydHkgdGFyZ2V0T2JqZWN0
CisgICovCisgIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAg
dmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JyksCisgICAgICAgIHJvb3QgPSBnZXQodGhp
cywgJ2NvbnRleHQnKSwKKyAgICAgICAgZGF0YSA9IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7
CiAKLSAgICAgIHRlbXBsYXRlKGNvbnRleHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0pOwotICAg
IH0gZWxzZSB7Ci0gICAgICAvLyBDcmVhdGUgdGhlIHZpZXcgdGhhdCB3aWxsIHdyYXAgdGhlIG91
dHB1dCBvZiB0aGlzIHRlbXBsYXRlL3Byb3BlcnR5Ci0gICAgICAvLyBhbmQgYWRkIGl0IHRvIHRo
ZSBuZWFyZXN0IHZpZXcncyBjaGlsZFZpZXdzIGFycmF5LgotICAgICAgLy8gU2VlIHRoZSBkb2N1
bWVudGF0aW9uIG9mIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3IGZvciBtb3JlLgotICAgICAg
dmFyIGJpbmRWaWV3ID0gdmlldy5jcmVhdGVDaGlsZFZpZXcoRW1iZXIuX0hhbmRsZWJhcnNCb3Vu
ZFZpZXcsIHsKLSAgICAgICAgcHJlc2VydmVDb250ZXh0OiBwcmVzZXJ2ZUNvbnRleHQsCi0gICAg
ICAgIHNob3VsZERpc3BsYXlGdW5jOiBzaG91bGREaXNwbGF5LAotICAgICAgICB2YWx1ZU5vcm1h
bGl6ZXJGdW5jOiB2YWx1ZU5vcm1hbGl6ZXIsCi0gICAgICAgIGRpc3BsYXlUZW1wbGF0ZTogZm4s
Ci0gICAgICAgIGludmVyc2VUZW1wbGF0ZTogaW52ZXJzZSwKLSAgICAgICAgcGF0aDogcHJvcGVy
dHksCi0gICAgICAgIHBhdGhSb290OiBjdXJyZW50Q29udGV4dCwKLSAgICAgICAgcHJldmlvdXND
b250ZXh0OiBjdXJyZW50Q29udGV4dCwKLSAgICAgICAgaXNFc2NhcGVkOiAhb3B0aW9ucy5oYXNo
LnVuZXNjYXBlZCwKLSAgICAgICAgdGVtcGxhdGVEYXRhOiBvcHRpb25zLmRhdGEKLSAgICAgIH0p
OworICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJykgeyByZXR1cm4gdGFyZ2V0OyB9
CiAKLSAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOworICAgIHJldHVybiBFbWJlci5I
YW5kbGViYXJzLmdldChyb290LCB0YXJnZXQsIHsgZGF0YTogZGF0YSB9KTsKKyAgfSkucHJvcGVy
dHkoJ3RhcmdldCcpLAogCi0gICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgICBF
bWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCBiaW5kVmlldywgJ3JlcmVuZGVySWZOZWVk
ZWQnKTsKLSAgICAgIH07Ci0gICAgfQorICAvLyBEZWZhdWx0cyB0byAnYnV0dG9uJyBpZiB0YWdO
YW1lIGlzICdpbnB1dCcgb3IgJ2J1dHRvbicKKyAgdHlwZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rp
b24oa2V5KSB7CisgICAgdmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWU7CisgICAgaWYgKHRhZ05h
bWUgPT09ICdpbnB1dCcgfHwgdGFnTmFtZSA9PT0gJ2J1dHRvbicpIHsgcmV0dXJuICdidXR0b24n
OyB9CisgIH0pLAogCi0gICAgLy8gT2JzZXJ2ZXMgdGhlIGdpdmVuIHByb3BlcnR5IG9uIHRoZSBj
b250ZXh0IGFuZAotICAgIC8vIHRlbGxzIHRoZSBFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlldyB0
byByZS1yZW5kZXIuIElmIHByb3BlcnR5Ci0gICAgLy8gaXMgYW4gZW1wdHkgc3RyaW5nLCB3ZSBh
cmUgcHJpbnRpbmcgdGhlIGN1cnJlbnQgY29udGV4dAotICAgIC8vIG9iamVjdCAoe3t0aGlzfX0p
IHNvIHVwZGF0aW5nIGl0IGlzIG5vdCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgaWYgKG5vcm1h
bGl6ZWQucGF0aCAhPT0gJycpIHsKLSAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxp
emVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCwgb2JzZXJ2ZXIpOwotICAgICAgaWYgKGNoaWxkUHJv
cGVydGllcykgewotICAgICAgICBmb3IgKGk9MDsgaTxjaGlsZFByb3BlcnRpZXMubGVuZ3RoOyBp
KyspIHsKLSAgICAgICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBu
b3JtYWxpemVkLnBhdGgrJy4nK2NoaWxkUHJvcGVydGllc1tpXSwgb2JzZXJ2ZXIpOwotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFRoZSBvYmplY3QgaXMgbm90
IG9ic2VydmFibGUsIHNvIGp1c3QgcmVuZGVyIGl0IG91dCBhbmQKLSAgICAvLyBiZSBkb25lIHdp
dGggaXQuCi0gICAgZGF0YS5idWZmZXIucHVzaChoYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0
LCBwcm9wZXJ0eSwgb3B0aW9ucykpOwotICB9Ci19CisgIGRpc2FibGVkOiBmYWxzZSwKIAotZnVu
Y3Rpb24gc2ltcGxlQmluZChwcm9wZXJ0eSwgb3B0aW9ucykgewotICB2YXIgZGF0YSA9IG9wdGlv
bnMuZGF0YSwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBjdXJyZW50Q29udGV4dCA9
IHRoaXMsCi0gICAgICBub3JtYWxpemVkLCBvYnNlcnZlcjsKKyAgLy8gQWxsb3cgJ2EnIHRhZ3Mg
dG8gYWN0IGxpa2UgYnV0dG9ucworICBocmVmOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gdGhpcy50YWdOYW1lID09PSAnYScgPyAnIycgOiBudWxsOworICB9KSwKKwor
ICBtb3VzZURvd246IGZ1bmN0aW9uKCkgeworICAgIGlmICghZ2V0KHRoaXMsICdkaXNhYmxlZCcp
KSB7CisgICAgICBzZXQodGhpcywgJ2lzQWN0aXZlJywgdHJ1ZSk7CisgICAgICB0aGlzLl9tb3Vz
ZURvd24gPSB0cnVlOworICAgICAgdGhpcy5fbW91c2VFbnRlcmVkID0gdHJ1ZTsKKyAgICB9Cisg
ICAgcmV0dXJuIGdldCh0aGlzLCAncHJvcGFnYXRlRXZlbnRzJyk7CisgIH0sCiAKLSAgbm9ybWFs
aXplZCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBkYXRhKTsKKyAg
bW91c2VMZWF2ZTogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX21vdXNlRG93bikgeworICAg
ICAgc2V0KHRoaXMsICdpc0FjdGl2ZScsIGZhbHNlKTsKKyAgICAgIHRoaXMuX21vdXNlRW50ZXJl
ZCA9IGZhbHNlOworICAgIH0KKyAgfSwKIAotICAvLyBTZXQgdXAgb2JzZXJ2ZXJzIGZvciBvYnNl
cnZhYmxlIG9iamVjdHMKLSAgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgdGhpcykgewotICAgIGlm
IChkYXRhLmluc2lkZUdyb3VwKSB7Ci0gICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAg
ICAgICBFbWJlci5ydW4ub25jZSh2aWV3LCAncmVyZW5kZXInKTsKLSAgICAgIH07CisgIG1vdXNl
RW50ZXI6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLl9tb3VzZURvd24pIHsKKyAgICAgIHNl
dCh0aGlzLCAnaXNBY3RpdmUnLCB0cnVlKTsKKyAgICAgIHRoaXMuX21vdXNlRW50ZXJlZCA9IHRy
dWU7CisgICAgfQorICB9LAogCi0gICAgICB2YXIgcmVzdWx0ID0gaGFuZGxlYmFyc0dldChjdXJy
ZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpOwotICAgICAgaWYgKHJlc3VsdCA9PT0gbnVs
bCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkgeyByZXN1bHQgPSAiIjsgfQotICAgICAgZGF0YS5i
dWZmZXIucHVzaChyZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXIgYmluZFZpZXcgPSBu
ZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3KAotICAgICAgICBwcm9wZXJ0eSwgY3VycmVu
dENvbnRleHQsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25zLmRhdGEKLSAgICAgICk7
CisgIG1vdXNlVXA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgaWYgKGdldCh0aGlzLCAnaXNBY3Rp
dmUnKSkgeworICAgICAgLy8gQWN0dWFsbHkgaW52b2tlIHRoZSBidXR0b24ncyB0YXJnZXQgYW5k
IGFjdGlvbi4KKyAgICAgIC8vIFRoaXMgbWV0aG9kIGNvbWVzIGZyb20gdGhlIEVtYmVyLlRhcmdl
dEFjdGlvblN1cHBvcnQgbWl4aW4uCisgICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsKKyAgICAg
IHNldCh0aGlzLCAnaXNBY3RpdmUnLCBmYWxzZSk7CisgICAgfQogCi0gICAgICBiaW5kVmlldy5f
cGFyZW50VmlldyA9IHZpZXc7Ci0gICAgICB2aWV3LmFwcGVuZENoaWxkKGJpbmRWaWV3KTsKKyAg
ICB0aGlzLl9tb3VzZURvd24gPSBmYWxzZTsKKyAgICB0aGlzLl9tb3VzZUVudGVyZWQgPSBmYWxz
ZTsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9wYWdhdGVFdmVudHMnKTsKKyAgfSwKIAotICAg
ICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25j
ZSgncmVuZGVyJywgYmluZFZpZXcsICdyZXJlbmRlcicpOwotICAgICAgfTsKKyAga2V5RG93bjog
ZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAvLyBIYW5kbGUgc3BhY2Ugb3IgZW50ZXIKKyAgICBpZiAo
ZXZlbnQua2V5Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzIpIHsKKyAgICAgIHRo
aXMubW91c2VEb3duKCk7CiAgICAgfQorICB9LAogCi0gICAgLy8gT2JzZXJ2ZXMgdGhlIGdpdmVu
IHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IGFuZAotICAgIC8vIHRlbGxzIHRoZSBFbWJlci5fSGFu
ZGxlYmFyc0JvdW5kVmlldyB0byByZS1yZW5kZXIuIElmIHByb3BlcnR5Ci0gICAgLy8gaXMgYW4g
ZW1wdHkgc3RyaW5nLCB3ZSBhcmUgcHJpbnRpbmcgdGhlIGN1cnJlbnQgY29udGV4dAotICAgIC8v
IG9iamVjdCAoe3t0aGlzfX0pIHNvIHVwZGF0aW5nIGl0IGlzIG5vdCBvdXIgcmVzcG9uc2liaWxp
dHkuCi0gICAgaWYgKG5vcm1hbGl6ZWQucGF0aCAhPT0gJycpIHsKLSAgICAgIHZpZXcucmVnaXN0
ZXJPYnNlcnZlcihub3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCwgb2JzZXJ2ZXIpOwor
ICBrZXlVcDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAvLyBIYW5kbGUgc3BhY2Ugb3IgZW50ZXIK
KyAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzIpIHsK
KyAgICAgIHRoaXMubW91c2VVcCgpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBUaGUgb2Jq
ZWN0IGlzIG5vdCBvYnNlcnZhYmxlLCBzbyBqdXN0IHJlbmRlciBpdCBvdXQgYW5kCi0gICAgLy8g
YmUgZG9uZSB3aXRoIGl0LgotICAgIGRhdGEuYnVmZmVyLnB1c2goaGFuZGxlYmFyc0dldChjdXJy
ZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpKTsKLSAgfQotfQorICB9LAogCi0vKioKLSAg
QHByaXZhdGUKKyAgLy8gVE9ETzogSGFuZGxlIHByb3BlciB0b3VjaCBiZWhhdmlvci4gSW5jbHVk
aW5nIHNob3VsZCBtYWtlIGluYWN0aXZlIHdoZW4KKyAgLy8gZmluZ2VyIG1vdmVzIG1vcmUgdGhh
biAyMHggb3V0c2lkZSBvZiB0aGUgZWRnZSBvZiB0aGUgYnV0dG9uICh2cyBtb3VzZQorICAvLyB3
aGljaCBnb2VzIGluYWN0aXZlIGFzIHNvb24gYXMgbW91c2UgZ29lcyBvdXQgb2YgZWRnZXMuKQog
Ci0gICdfdHJpYWdlTXVzdGFjaGUnIGlzIHVzZWQgaW50ZXJuYWxseSBzZWxlY3QgYmV0d2VlbiBh
IGJpbmRpbmcgYW5kIGhlbHBlciBmb3IKLSAgdGhlIGdpdmVuIGNvbnRleHQuIFVudGlsIHRoaXMg
cG9pbnQsIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGV0ZXJtaW5lIGlmIHRoZQotICBtdXN0YWNoZSBp
cyBhIHByb3BlcnR5IHJlZmVyZW5jZSBvciBhIHJlZ3VsYXIgaGVscGVyIHJlZmVyZW5jZS4gVGhp
cyB0cmlhZ2UKLSAgaGVscGVyIHJlc29sdmVzIHRoYXQuCisgIHRvdWNoU3RhcnQ6IGZ1bmN0aW9u
KHRvdWNoKSB7CisgICAgcmV0dXJuIHRoaXMubW91c2VEb3duKHRvdWNoKTsKKyAgfSwKIAotICBU
aGlzIHdvdWxkIG5vdCBiZSB0eXBpY2FsbHkgaW52b2tlZCBieSBkaXJlY3RseS4KKyAgdG91Y2hF
bmQ6IGZ1bmN0aW9uKHRvdWNoKSB7CisgICAgcmV0dXJuIHRoaXMubW91c2VVcCh0b3VjaCk7Cisg
IH0sCiAKLSAgQG1ldGhvZCBfdHJpYWdlTXVzdGFjaGUKLSAgQGZvciBFbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5L2hlbHBlcklEIHRv
IHRyaWFnZQotICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3ZpZGUgZm9yIHJl
bmRlcmluZwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5kbGVi
YXJzLnJlZ2lzdGVySGVscGVyKCdfdHJpYWdlTXVzdGFjaGUnLCBmdW5jdGlvbihwcm9wZXJ0eSwg
Zm4pIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1
bWVudCB0byB0aGUgX3RyaWFnZU11c3RhY2hlIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPD0g
Mik7Ci0gIGlmIChoZWxwZXJzW3Byb3BlcnR5XSkgewotICAgIHJldHVybiBoZWxwZXJzW3Byb3Bl
cnR5XS5jYWxsKHRoaXMsIGZuKTsKLSAgfQotICBlbHNlIHsKLSAgICByZXR1cm4gaGVscGVycy5i
aW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgIEVt
YmVyLmRlcHJlY2F0ZSgiRW1iZXIuQnV0dG9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVt
b3ZlZCBmcm9tIGZ1dHVyZSByZWxlYXNlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIGB7e2FjdGlvbn19
YCBoZWxwZXIuIik7CisgICAgdGhpcy5fc3VwZXIoKTsKICAgfQogfSk7CiAKK30pKCk7CisKKwor
CisoZnVuY3Rpb24oKSB7CiAvKioKLSAgQHByaXZhdGUKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1
bGUgZW1iZXItaGFuZGxlYmFycworKi8KIAotICBgYmluZGAgY2FuIGJlIHVzZWQgdG8gZGlzcGxh
eSBhIHZhbHVlLCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0Ci0gIGNoYW5nZXMuIEZvciBl
eGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHByaW50IHRoZSBgdGl0bGVgIHByb3BlcnR5IG9mCi0g
IGBjb250ZW50YDoKK3ZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKIAotICBg
YGBoYW5kbGViYXJzCi0gIHt7YmluZCAiY29udGVudC50aXRsZSJ9fQotICBgYGAKKy8qKgorICBU
aGUgaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dGFyZWEgZWxlbWVudCB3aGVuIHRo
ZSBge3t0ZXh0YXJlYX19YAorICBoZWxwZXIgaXMgdXNlZC4KIAotICBUaGlzIHdpbGwgcmV0dXJu
IHRoZSBgdGl0bGVgIHByb3BlcnR5IGFzIGEgc3RyaW5nLCB0aGVuIGNyZWF0ZSBhIG5ldyBvYnNl
cnZlcgotICBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIGl0IGNoYW5nZXMsIGl0IHdpbGwgdXBk
YXRlIHRoZSB2YWx1ZSBpbiBET00uIE5vdGUKLSAgdGhhdCBpZiB5b3UgbmVlZCB0byBzdXBwb3J0
IElFNyBhbmQgSUU4IHlvdSBtdXN0IG1vZGlmeSB0aGUgbW9kZWwgb2JqZWN0cwotICBwcm9wZXJ0
aWVzIHVzaW5nIGBFbWJlci5nZXQoKWAgYW5kIGBFbWJlci5zZXQoKWAgZm9yIHRoaXMgdG8gd29y
ayBhcyBpdAotICByZWxpZXMgb24gRW1iZXIncyBLVk8gc3lzdGVtLiBGb3IgYWxsIG90aGVyIGJy
b3dzZXJzIHRoaXMgd2lsbCBiZSBoYW5kbGVkIGZvcgotICB5b3UgYXV0b21hdGljYWxseS4KKyAg
U2VlIFtoYW5kbGViYXJzLmhlbHBlcnMudGV4dGFyZWFdKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5k
bGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfdGV4dGFyZWEpICBmb3IgdXNhZ2UgZGV0YWlscy4K
IAotICBAbWV0aG9kIGJpbmQKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBh
cmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGJpbmQKLSAgQHBhcmFtIHtGdW5jdGlv
bn0gZm4gQ29udGV4dCB0byBwcm92aWRlIGZvciByZW5kZXJpbmcKLSAgQHJldHVybiB7U3RyaW5n
fSBIVE1MIHN0cmluZworICAjIyBMYXlvdXQgYW5kIExheW91dE5hbWUgcHJvcGVydGllcworCisg
IEJlY2F1c2UgSFRNTCBgdGV4dGFyZWFgIGVsZW1lbnRzIGRvIG5vdCBjb250YWluIGlubmVyIEhU
TUwgdGhlIGBsYXlvdXRgIGFuZAorICBgbGF5b3V0TmFtZWAgcHJvcGVydGllcyB3aWxsIG5vdCBi
ZSBhcHBsaWVkLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwp
J3MKKyAgbGF5b3V0IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgQGNsYXNzIFRl
eHRBcmVhCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMgRW1iZXIuQ29tcG9uZW50Cisg
IEB1c2VzIEVtYmVyLlRleHRTdXBwb3J0CiAqLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVs
cGVyKCdiaW5kJywgZnVuY3Rpb24ocHJvcGVydHksIG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0
KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgYmluZCBoZWxw
ZXIiLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIpOworRW1iZXIuVGV4dEFyZWEgPSBFbWJlci5Db21w
b25lbnQuZXh0ZW5kKEVtYmVyLlRleHRTdXBwb3J0LCB7CisgIGNsYXNzTmFtZXM6IFsnZW1iZXIt
dGV4dC1hcmVhJ10sCiAKLSAgdmFyIGNvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0cyAmJiBvcHRp
b25zLmNvbnRleHRzWzBdKSB8fCB0aGlzOworICB0YWdOYW1lOiAidGV4dGFyZWEiLAorICBhdHRy
aWJ1dGVCaW5kaW5nczogWydyb3dzJywgJ2NvbHMnLCAnbmFtZSddLAorICByb3dzOiBudWxsLAor
ICBjb2xzOiBudWxsLAogCi0gIGlmICghb3B0aW9ucy5mbikgewotICAgIHJldHVybiBzaW1wbGVC
aW5kLmNhbGwoY29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpOworICBfdXBkYXRlRWxlbWVudFZh
bHVlOiBFbWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbigpIHsKKyAgICAvLyBXZSBkbyB0
aGlzIGNoZWNrIHNvIGN1cnNvciBwb3NpdGlvbiBkb2Vzbid0IGdldCBhZmZlY3RlZCBpbiBJRQor
ICAgIHZhciB2YWx1ZSA9IGdldCh0aGlzLCAndmFsdWUnKSwKKyAgICAgICAgJGVsID0gdGhpcy4k
KCk7CisgICAgaWYgKCRlbCAmJiB2YWx1ZSAhPT0gJGVsLnZhbCgpKSB7CisgICAgICAkZWwudmFs
KHZhbHVlKTsKKyAgICB9CisgIH0pLAorCisgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMu
X3N1cGVyKCk7CisgICAgdGhpcy5vbigiZGlkSW5zZXJ0RWxlbWVudCIsIHRoaXMsIHRoaXMuX3Vw
ZGF0ZUVsZW1lbnRWYWx1ZSk7CiAgIH0KIAotICByZXR1cm4gYmluZC5jYWxsKGNvbnRleHQsIHBy
b3BlcnR5LCBvcHRpb25zLCBmYWxzZSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgcmV0dXJuICFF
bWJlci5pc05vbmUocmVzdWx0KTsKLSAgfSk7CiB9KTsKIAotLyoqCi0gIEBwcml2YXRlCit9KSgp
OwogCi0gIFVzZSB0aGUgYGJvdW5kSWZgIGhlbHBlciB0byBjcmVhdGUgYSBjb25kaXRpb25hbCB0
aGF0IHJlLWV2YWx1YXRlcwotICB3aGVuZXZlciB0aGUgdHJ1dGhpbmVzcyBvZiB0aGUgYm91bmQg
dmFsdWUgY2hhbmdlcy4KIAotICBgYGBoYW5kbGViYXJzCi0gIHt7I2JvdW5kSWYgImNvbnRlbnQu
c2hvdWxkRGlzcGxheVRpdGxlIn19Ci0gICAge3tjb250ZW50LnRpdGxlfX0KLSAge3svYm91bmRJ
Zn19Ci0gIGBgYAogCi0gIEBtZXRob2QgYm91bmRJZgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMu
aGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gYmluZAotICBA
cGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmluZwotICBA
cmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisoZnVuY3Rpb24oKSB7CisvKmpzaGludCBlcWVx
ZXE6ZmFsc2UgKi8KKworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLWhhbmRs
ZWJhcnMKICovCi1FbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2JvdW5kSWYnLCBmdW5j
dGlvbihwcm9wZXJ0eSwgZm4pIHsKLSAgdmFyIGNvbnRleHQgPSAoZm4uY29udGV4dHMgJiYgZm4u
Y29udGV4dHNbMF0pIHx8IHRoaXM7Ci0gIHZhciBmdW5jID0gZnVuY3Rpb24ocmVzdWx0KSB7Ci0g
ICAgdmFyIHRydXRoeSA9IHJlc3VsdCAmJiBnZXQocmVzdWx0LCAnaXNUcnV0aHknKTsKLSAgICBp
ZiAodHlwZW9mIHRydXRoeSA9PT0gJ2Jvb2xlYW4nKSB7IHJldHVybiB0cnV0aHk7IH0KIAotICAg
IGlmIChFbWJlci5pc0FycmF5KHJlc3VsdCkpIHsKLSAgICAgIHJldHVybiBnZXQocmVzdWx0LCAn
bGVuZ3RoJykgIT09IDA7Cit2YXIgc2V0ID0gRW1iZXIuc2V0LAorICAgIGdldCA9IEVtYmVyLmdl
dCwKKyAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2YsCisgICAgaW5k
ZXhlc09mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4ZXNPZiwKKyAgICBmb3JFYWNoID0g
RW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCisgICAgcmVwbGFjZSA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5yZXBsYWNlLAorICAgIGlzQXJyYXkgPSBFbWJlci5pc0FycmF5LAorICAgIHBy
ZWNvbXBpbGVUZW1wbGF0ZSA9IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZTsKKworRW1iZXIuU2Vs
ZWN0T3B0aW9uID0gRW1iZXIuVmlldy5leHRlbmQoeworICB0YWdOYW1lOiAnb3B0aW9uJywKKyAg
YXR0cmlidXRlQmluZGluZ3M6IFsndmFsdWUnLCAnc2VsZWN0ZWQnXSwKKworICBkZWZhdWx0VGVt
cGxhdGU6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICBvcHRpb25zID0geyBkYXRh
OiBvcHRpb25zLmRhdGEsIGhhc2g6IHt9IH07CisgICAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
LmJpbmQuY2FsbChjb250ZXh0LCAidmlldy5sYWJlbCIsIG9wdGlvbnMpOworICB9LAorCisgIGlu
aXQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMubGFiZWxQYXRoRGlkQ2hhbmdlKCk7CisgICAgdGhp
cy52YWx1ZVBhdGhEaWRDaGFuZ2UoKTsKKworICAgIHRoaXMuX3N1cGVyKCk7CisgIH0sCisKKyAg
c2VsZWN0ZWQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBjb250ZW50ID0g
Z2V0KHRoaXMsICdjb250ZW50JyksCisgICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAncGFy
ZW50Vmlldy5zZWxlY3Rpb24nKTsKKyAgICBpZiAoZ2V0KHRoaXMsICdwYXJlbnRWaWV3Lm11bHRp
cGxlJykpIHsKKyAgICAgIHJldHVybiBzZWxlY3Rpb24gJiYgaW5kZXhPZihzZWxlY3Rpb24sIGNv
bnRlbnQudmFsdWVPZigpKSA+IC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gISFyZXN1
bHQ7CisgICAgICAvLyBQcmltaXRpdmVzIGdldCBwYXNzZWQgdGhyb3VnaCBiaW5kaW5ncyBhcyBv
YmplY3RzLi4uIHNpbmNlCisgICAgICAvLyBgbmV3IE51bWJlcig0KSAhPT0gNGAsIHdlIHVzZSBg
PT1gIGJlbG93CisgICAgICByZXR1cm4gY29udGVudCA9PSBzZWxlY3Rpb247CiAgICAgfQotICB9
OworICB9KS5wcm9wZXJ0eSgnY29udGVudCcsICdwYXJlbnRWaWV3LnNlbGVjdGlvbicpLAogCi0g
IHJldHVybiBiaW5kLmNhbGwoY29udGV4dCwgcHJvcGVydHksIGZuLCB0cnVlLCBmdW5jLCBmdW5j
LCBbJ2lzVHJ1dGh5JywgJ2xlbmd0aCddKTsKKyAgbGFiZWxQYXRoRGlkQ2hhbmdlOiBFbWJlci5v
YnNlcnZlcigncGFyZW50Vmlldy5vcHRpb25MYWJlbFBhdGgnLCBmdW5jdGlvbigpIHsKKyAgICB2
YXIgbGFiZWxQYXRoID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcpOwor
CisgICAgaWYgKCFsYWJlbFBhdGgpIHsgcmV0dXJuOyB9CisKKyAgICBFbWJlci5kZWZpbmVQcm9w
ZXJ0eSh0aGlzLCAnbGFiZWwnLCBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICAgIHJl
dHVybiBnZXQodGhpcywgbGFiZWxQYXRoKTsKKyAgICB9KS5wcm9wZXJ0eShsYWJlbFBhdGgpKTsK
KyAgfSksCisKKyAgdmFsdWVQYXRoRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcigncGFyZW50Vmll
dy5vcHRpb25WYWx1ZVBhdGgnLCBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmFsdWVQYXRoID0gZ2V0
KHRoaXMsICdwYXJlbnRWaWV3Lm9wdGlvblZhbHVlUGF0aCcpOworCisgICAgaWYgKCF2YWx1ZVBh
dGgpIHsgcmV0dXJuOyB9CisKKyAgICBFbWJlci5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsdWUn
LCBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBnZXQodGhpcywgdmFs
dWVQYXRoKTsKKyAgICB9KS5wcm9wZXJ0eSh2YWx1ZVBhdGgpKTsKKyAgfSkKK30pOworCitFbWJl
ci5TZWxlY3RPcHRncm91cCA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7CisgIHRhZ05h
bWU6ICdvcHRncm91cCcsCisgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2xhYmVsJ10sCisKKyAgc2Vs
ZWN0aW9uQmluZGluZzogJ3BhcmVudFZpZXcuc2VsZWN0aW9uJywKKyAgbXVsdGlwbGVCaW5kaW5n
OiAncGFyZW50Vmlldy5tdWx0aXBsZScsCisgIG9wdGlvbkxhYmVsUGF0aEJpbmRpbmc6ICdwYXJl
bnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcsCisgIG9wdGlvblZhbHVlUGF0aEJpbmRpbmc6ICdwYXJl
bnRWaWV3Lm9wdGlvblZhbHVlUGF0aCcsCisKKyAgaXRlbVZpZXdDbGFzc0JpbmRpbmc6ICdwYXJl
bnRWaWV3Lm9wdGlvblZpZXcnCiB9KTsKIAogLyoqCi0gIEBtZXRob2Qgd2l0aAotICBAZm9yIEVt
YmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBjb250ZXh0Ci0gIEBw
YXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwot
RW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwg
b3B0aW9ucykgewotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkgewotICAgIHZhciBrZXl3
b3JkTmFtZSwgcGF0aCwgcm9vdFBhdGgsIG5vcm1hbGl6ZWQ7CisgIFRoZSBgRW1iZXIuU2VsZWN0
YCB2aWV3IGNsYXNzIHJlbmRlcnMgYQorICBbc2VsZWN0XShodHRwczovL2RldmVsb3Blci5tb3pp
bGxhLm9yZy9lbi9IVE1ML0VsZW1lbnQvc2VsZWN0KSBIVE1MIGVsZW1lbnQsCisgIGFsbG93aW5n
IHRoZSB1c2VyIHRvIGNob29zZSBmcm9tIGEgbGlzdCBvZiBvcHRpb25zLgogCi0gICAgRW1iZXIu
YXNzZXJ0KCJJZiB5b3UgcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSB3aXRoIGhl
bHBlciwgaXQgbXVzdCBiZSBpbiB0aGUgZm9ybSAjd2l0aCBmb28gYXMgYmFyIiwgYXJndW1lbnRz
WzFdID09PSAiYXMiKTsKLSAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOwotICAgIGtleXdvcmRO
YW1lID0gYXJndW1lbnRzWzJdOwotICAgIHBhdGggPSBhcmd1bWVudHNbMF07CisgIFRoZSB0ZXh0
IGFuZCBgdmFsdWVgIHByb3BlcnR5IG9mIGVhY2ggYDxvcHRpb24+YCBlbGVtZW50IHdpdGhpbiB0
aGUKKyAgYDxzZWxlY3Q+YCBlbGVtZW50IGFyZSBwb3B1bGF0ZWQgZnJvbSB0aGUgb2JqZWN0cyBp
biB0aGUgYEVsZW1lbnQuU2VsZWN0YCdzCisgIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHVuZGVy
bHlpbmcgZGF0YSBvYmplY3Qgb2YgdGhlIHNlbGVjdGVkIGA8b3B0aW9uPmAgaXMKKyAgc3RvcmVk
IGluIHRoZSBgRWxlbWVudC5TZWxlY3RgJ3MgYHZhbHVlYCBwcm9wZXJ0eS4KIAotICAgIEVtYmVy
LmFzc2VydCgiWW91IG11c3QgcGFzcyBhIGJsb2NrIHRvIHRoZSB3aXRoIGhlbHBlciIsIG9wdGlv
bnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gSGFuZGxlYmFycy5WTS5ub29wKTsKKyAgIyMgVGhlIENv
bnRlbnQgUHJvcGVydHkgKGFycmF5IG9mIHN0cmluZ3MpCiAKLSAgICBpZiAoRW1iZXIuaXNHbG9i
YWxQYXRoKHBhdGgpKSB7Ci0gICAgICBFbWJlci5iaW5kKG9wdGlvbnMuZGF0YS5rZXl3b3Jkcywg
a2V5d29yZE5hbWUsIHBhdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBub3JtYWxpemVkID0gbm9y
bWFsaXplUGF0aCh0aGlzLCBwYXRoLCBvcHRpb25zLmRhdGEpOwotICAgICAgcGF0aCA9IG5vcm1h
bGl6ZWQucGF0aDsKLSAgICAgIHJvb3RQYXRoID0gbm9ybWFsaXplZC5yb290OworICBUaGUgc2lt
cGxlc3QgdmVyc2lvbiBvZiBhbiBgRW1iZXIuU2VsZWN0YCB0YWtlcyBhbiBhcnJheSBvZiBzdHJp
bmdzIGFzIGl0cworICBgY29udGVudGAgcHJvcGVydHkuIFRoZSBzdHJpbmcgd2lsbCBiZSB1c2Vk
IGFzIGJvdGggdGhlIGB2YWx1ZWAgcHJvcGVydHkgYW5kCisgIHRoZSBpbm5lciB0ZXh0IG9mIGVh
Y2ggYDxvcHRpb24+YCBlbGVtZW50IGluc2lkZSB0aGUgcmVuZGVyZWQgYDxzZWxlY3Q+YC4KIAot
ICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgeW91IGNhbm5v
dCBiaW5kIHNlcGFyYXRlIG9iamVjdHMKLSAgICAgIC8vIHRvZ2V0aGVyLiBXaGVuIHdlIGltcGxl
bWVudCB0aGF0IGZ1bmN0aW9uYWxpdHksIHdlIHNob3VsZCB1c2UgaXQgaGVyZS4KLSAgICAgIHZh
ciBjb250ZXh0S2V5ID0gRW1iZXIuJC5leHBhbmRvICsgRW1iZXIuZ3VpZEZvcihyb290UGF0aCk7
Ci0gICAgICBvcHRpb25zLmRhdGEua2V5d29yZHNbY29udGV4dEtleV0gPSByb290UGF0aDsKKyAg
RXhhbXBsZToKIAotICAgICAgLy8gaWYgdGhlIHBhdGggaXMgJycgKCJ0aGlzIiksIGp1c3QgYmlu
ZCBkaXJlY3RseSB0byB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgICB2YXIgY29udGV4dFBhdGgg
PSBwYXRoID8gY29udGV4dEtleSArICcuJyArIHBhdGggOiBjb250ZXh0S2V5OwotICAgICAgRW1i
ZXIuYmluZChvcHRpb25zLmRhdGEua2V5d29yZHMsIGtleXdvcmROYW1lLCBjb250ZXh0UGF0aCk7
Ci0gICAgfQorICBgYGBqYXZhc2NyaXB0CisgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBF
bWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgbmFtZXM6IFsiWWVodWRhIiwgIlRvbSJdCisg
IH0pOworICBgYGAKIAotICAgIHJldHVybiBiaW5kLmNhbGwodGhpcywgcGF0aCwgb3B0aW9ucywg
dHJ1ZSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICByZXR1cm4gIUVtYmVyLmlzTm9uZShyZXN1
bHQpOwotICAgIH0pOwotICB9IGVsc2UgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFz
cyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUgd2l0aCBoZWxwZXIiLCBhcmd1bWVudHMubGVu
Z3RoID09PSAyKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0
aGUgd2l0aCBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMu
Vk0ubm9vcCk7Ci0gICAgcmV0dXJuIGhlbHBlcnMuYmluZC5jYWxsKG9wdGlvbnMuY29udGV4dHNb
MF0sIGNvbnRleHQsIG9wdGlvbnMpOwotICB9Ci19KTsKKyAgYGBgaGFuZGxlYmFycworICB7e3Zp
ZXcgRW1iZXIuU2VsZWN0IGNvbnRlbnQ9bmFtZXN9fQorICBgYGAKIAorICBXb3VsZCByZXN1bHQg
aW4gdGhlIGZvbGxvd2luZyBIVE1MOgogCi0vKioKLSAgU2VlIGBib3VuZElmYAorICBgYGBodG1s
CisgIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+CisgICAgPG9wdGlvbiB2YWx1ZT0iWWVo
dWRhIj5ZZWh1ZGE8L29wdGlvbj4KKyAgICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0aW9u
PgorICA8L3NlbGVjdD4KKyAgYGBgCiAKLSAgQG1ldGhvZCBpZgotICBAZm9yIEVtYmVyLkhhbmRs
ZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBjb250ZXh0Ci0gIEBwYXJhbSB7SGFz
aH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5k
bGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsK
LSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGV4YWN0bHkgb25lIGFyZ3VtZW50IHRvIHRo
ZSBpZiBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKLSAgRW1iZXIuYXNzZXJ0KCJZ
b3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIGlmIGhlbHBlciIsIG9wdGlvbnMuZm4gJiYgb3B0
aW9ucy5mbiAhPT0gSGFuZGxlYmFycy5WTS5ub29wKTsKKyAgWW91IGNhbiBjb250cm9sIHdoaWNo
IGA8b3B0aW9uPmAgaXMgc2VsZWN0ZWQgdGhyb3VnaCB0aGUgYEVtYmVyLlNlbGVjdGAncworICBg
dmFsdWVgIHByb3BlcnR5OgogCi0gIHJldHVybiBoZWxwZXJzLmJvdW5kSWYuY2FsbChvcHRpb25z
LmNvbnRleHRzWzBdLCBjb250ZXh0LCBvcHRpb25zKTsKLX0pOworICBgYGBqYXZhc2NyaXB0Cisg
IEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7Cisg
ICAgc2VsZWN0ZWROYW1lOiAnVG9tJywKKyAgICBuYW1lczogWyJZZWh1ZGEiLCAiVG9tIl0KKyAg
fSk7CisgIGBgYAogCi0vKioKLSAgQG1ldGhvZCB1bmxlc3MKLSAgQGZvciBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAotICBAcGFyYW0ge0hhc2h9
IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxl
YmFycy5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykg
ewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1lbnQgdG8g
dGhlIHVubGVzcyBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKLSAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBvcHRpb25z
LmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CisgIGBgYGhhbmRsZWJh
cnMKKyAge3t2aWV3IEVtYmVyLlNlbGVjdAorICAgICAgICAgY29udGVudD1uYW1lcworICAgICAg
ICAgdmFsdWU9c2VsZWN0ZWROYW1lCisgIH19CisgIGBgYAogCi0gIHZhciBmbiA9IG9wdGlvbnMu
Zm4sIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7CisgIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9s
bG93aW5nIEhUTUwgd2l0aCB0aGUgYDxvcHRpb24+YCBmb3IgJ1RvbScgc2VsZWN0ZWQ6CiAKLSAg
b3B0aW9ucy5mbiA9IGludmVyc2U7Ci0gIG9wdGlvbnMuaW52ZXJzZSA9IGZuOworICBgYGBodG1s
CisgIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+CisgICAgPG9wdGlvbiB2YWx1ZT0iWWVo
dWRhIj5ZZWh1ZGE8L29wdGlvbj4KKyAgICA8b3B0aW9uIHZhbHVlPSJUb20iIHNlbGVjdGVkPSJz
ZWxlY3RlZCI+VG9tPC9vcHRpb24+CisgIDwvc2VsZWN0PgorICBgYGAKIAotICByZXR1cm4gaGVs
cGVycy5ib3VuZElmLmNhbGwob3B0aW9ucy5jb250ZXh0c1swXSwgY29udGV4dCwgb3B0aW9ucyk7
Ci19KTsKKyAgQSB1c2VyIGludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGA8c2VsZWN0PmAg
dG8gY2hvb3NlICJZZWh1ZGEiIHdvdWxkCisgIHVwZGF0ZSB0aGUgdmFsdWUgb2YgYHNlbGVjdGVk
TmFtZWAgdG8gIlllaHVkYSIuCiAKLS8qKgotICBgYmluZEF0dHJgIGFsbG93cyB5b3UgdG8gY3Jl
YXRlIGEgYmluZGluZyBiZXR3ZWVuIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMgYW5kCi0gIEVtYmVy
IG9iamVjdHMuIEZvciBleGFtcGxlOgorICAjIyBUaGUgQ29udGVudCBQcm9wZXJ0eSAoYXJyYXkg
b2YgT2JqZWN0cykKIAotICBgYGBoYW5kbGViYXJzCi0gIDxpbWcge3tiaW5kQXR0ciBzcmM9Imlt
YWdlVXJsIiBhbHQ9ImltYWdlVGl0bGUifX0+Ci0gIGBgYAorICBBbiBgRW1iZXIuU2VsZWN0YCBj
YW4gYWxzbyB0YWtlIGFuIGFycmF5IG9mIEphdmFTY3JpcHQgb3IgRW1iZXIgb2JqZWN0cyBhcwor
ICBpdHMgYGNvbnRlbnRgIHByb3BlcnR5LgogCi0gIFRoZSBhYm92ZSBoYW5kbGViYXJzIHRlbXBs
YXRlIHdpbGwgZmlsbCB0aGUgYDxpbWc+YCdzIGBzcmNgIGF0dHJpYnV0ZSB3aWxsCi0gIHRoZSB2
YWx1ZSBvZiB0aGUgcHJvcGVydHkgcmVmZXJlbmNlZCB3aXRoIGAiaW1hZ2VVcmwiYCBhbmQgaXRz
IGBhbHRgCi0gIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgcmVmZXJl
bmNlZCB3aXRoIGAiaW1hZ2VUaXRsZSJgLgorICBXaGVuIHVzaW5nIG9iamVjdHMgeW91IG5lZWQg
dG8gdGVsbCB0aGUgYEVtYmVyLlNlbGVjdGAgd2hpY2ggcHJvcGVydHkgc2hvdWxkCisgIGJlIGFj
Y2Vzc2VkIG9uIGVhY2ggb2JqZWN0IHRvIHN1cHBseSB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2Yg
dGhlIGA8b3B0aW9uPmAKKyAgYW5kIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIHRvIHN1
cHBseSB0aGUgZWxlbWVudCB0ZXh0LgogCi0gIElmIHRoZSByZW5kZXJpbmcgY29udGV4dCBvZiB0
aGlzIHRlbXBsYXRlIGlzIHRoZSBmb2xsb3dpbmcgb2JqZWN0OgorICBUaGUgYG9wdGlvblZhbHVl
UGF0aGAgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCBvbiBlYWNoIG9iamVjdCB0
bworICB0aGUgZGVzaXJlZCBwcm9wZXJ0eSBmb3IgdGhlIGB2YWx1ZWAgYXR0cmlidXRlLiBUaGUg
YG9wdGlvbkxhYmVsUGF0aGAKKyAgc3BlY2lmaWVzIHRoZSBwYXRoIG9uIGVhY2ggb2JqZWN0IHRv
IHRoZSBkZXNpcmVkIHByb3BlcnR5IGZvciB0aGUKKyAgZWxlbWVudCdzIHRleHQuIEJvdGggcGF0
aHMgbXVzdCByZWZlcmVuY2UgZWFjaCBvYmplY3QgaXRzZWxmIGFzIGBjb250ZW50YDoKIAogICBg
YGBqYXZhc2NyaXB0Ci0gIHsKLSAgICBpbWFnZVVybDogJ2h0dHA6Ly9sb2xjYXRzLmluZm8vaGF6
LWEtZnVubnknLAotICAgIGltYWdlVGl0bGU6ICdBIGh1bW9yb3VzIGltYWdlIG9mIGEgY2F0Jwot
ICB9CisgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVu
ZCh7CisgICAgcHJvZ3JhbW1lcnM6IFsKKyAgICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDog
MX0sCisgICAgICB7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9CisgICAgXQorICB9KTsKICAg
YGBgCiAKLSAgVGhlIHJlc3VsdGluZyBIVE1MIG91dHB1dCB3aWxsIGJlOgorICBgYGBoYW5kbGVi
YXJzCisgIHt7dmlldyBFbWJlci5TZWxlY3QKKyAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMK
KyAgICAgICAgIG9wdGlvblZhbHVlUGF0aD0iY29udGVudC5pZCIKKyAgICAgICAgIG9wdGlvbkxh
YmVsUGF0aD0iY29udGVudC5maXJzdE5hbWUifX0KKyAgYGBgCisKKyAgV291bGQgcmVzdWx0IGlu
IHRoZSBmb2xsb3dpbmcgSFRNTDoKIAogICBgYGBodG1sCi0gIDxpbWcgc3JjPSJodHRwOi8vbG9s
Y2F0cy5pbmZvL2hhei1hLWZ1bm55IiBhbHQ9IkEgaHVtb3JvdXMgaW1hZ2Ugb2YgYSBjYXQiPgor
ICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAgIDxvcHRpb24gdmFsdWU9IjEiPlll
aHVkYTwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwvb3B0aW9uPgorICA8L3Nl
bGVjdD4KICAgYGBgCiAKLSAgYGJpbmRBdHRyYCBjYW5ub3QgcmVkZWNsYXJlIGV4aXN0aW5nIERP
TSBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB1c2Ugb2YgYHNyY2AKLSAgaW4gdGhlIGZvbGxvd2lu
ZyBgYmluZEF0dHJgIGV4YW1wbGUgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgaGFyZCBjb2RlZCB2
YWx1ZQotICBvZiBgc3JjPSIvZmFpbHdoYWxlLmdpZiJgIHdpbGwgdGFrZSBwcmVjZWRlbmNlOgor
ICBUaGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIGA8b3B0aW9uPmAgd2l0aGlu
IGFuIGBFbWJlci5TZWxlY3RgCisgIGNhbiBiZSBib3VuZCB0byBhIHByb3BlcnR5IG9uIGFub3Ro
ZXIgb2JqZWN0OgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxl
ciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICBwcm9ncmFtbWVyczogWworICAgICAg
e2ZpcnN0TmFtZTogIlllaHVkYSIsIGlkOiAxfSwKKyAgICAgIHtmaXJzdE5hbWU6ICJUb20iLCAg
ICBpZDogMn0KKyAgICBdLAorICAgIGN1cnJlbnRQcm9ncmFtbWVyOiB7CisgICAgICBpZDogMgor
ICAgIH0KKyAgfSk7CisgIGBgYAogCiAgIGBgYGhhbmRsZWJhcnMKLSAgPGltZyBzcmM9Ii9mYWls
d2hhbGUuZ2lmIiB7e2JpbmRBdHRyIHNyYz0iaW1hZ2VVcmwiIGFsdD0iaW1hZ2VUaXRsZSJ9fT4K
KyAge3t2aWV3IEVtYmVyLlNlbGVjdAorICAgICAgICAgY29udGVudD1wcm9ncmFtbWVycworICAg
ICAgICAgb3B0aW9uVmFsdWVQYXRoPSJjb250ZW50LmlkIgorICAgICAgICAgb3B0aW9uTGFiZWxQ
YXRoPSJjb250ZW50LmZpcnN0TmFtZSIKKyAgICAgICAgIHZhbHVlPWN1cnJlbnRQcm9ncmFtbWVy
LmlkfX0KICAgYGBgCiAKLSAgIyMjIGBiaW5kQXR0cmAgYW5kIHRoZSBgY2xhc3NgIGF0dHJpYnV0
ZQorICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHdpdGggYSBzZWxlY3RlZCBv
cHRpb246CiAKLSAgYGJpbmRBdHRyYCBzdXBwb3J0cyBhIHNwZWNpYWwgc3ludGF4IGZvciBoYW5k
bGluZyBhIG51bWJlciBvZiBjYXNlcyB1bmlxdWUKLSAgdG8gdGhlIGBjbGFzc2AgRE9NIGVsZW1l
bnQgYXR0cmlidXRlLiBUaGUgYGNsYXNzYCBhdHRyaWJ1dGUgY29tYmluZXMKLSAgbXVsdGlwbGUg
ZGlzY3JlZXQgdmFsdWVzIGludG8gYSBzaW5nbGUgYXR0cmlidXRlIGFzIGEgc3BhY2UtZGVsaW1p
dGVkCi0gIGxpc3Qgb2Ygc3RyaW5ncy4gRWFjaCBzdHJpbmcgY2FuIGJlOgorICBgYGBodG1sCisg
IDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+CisgICAgPG9wdGlvbiB2YWx1ZT0iMSI+WWVo
dWRhPC9vcHRpb24+CisgICAgPG9wdGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5U
b208L29wdGlvbj4KKyAgPC9zZWxlY3Q+CisgIGBgYAogCi0gICogYSBzdHJpbmcgcmV0dXJuIHZh
bHVlIG9mIGFuIG9iamVjdCdzIHByb3BlcnR5LgotICAqIGEgYm9vbGVhbiByZXR1cm4gdmFsdWUg
b2YgYW4gb2JqZWN0J3MgcHJvcGVydHkKLSAgKiBhIGhhcmQtY29kZWQgdmFsdWUKKyAgSW50ZXJh
Y3Rpbmcgd2l0aCB0aGUgcmVuZGVyZWQgZWxlbWVudCBieSBzZWxlY3RpbmcgdGhlIGZpcnN0IG9w
dGlvbgorICAoJ1llaHVkYScpIHdpbGwgdXBkYXRlIHRoZSBgaWRgIG9mIGBjdXJyZW50UHJvZ3Jh
bW1lcmAKKyAgdG8gbWF0Y2ggdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2YgdGhlIG5ld2x5IHNlbGVj
dGVkIGA8b3B0aW9uPmAuCiAKLSAgQSBzdHJpbmcgcmV0dXJuIHZhbHVlIHdvcmtzIGlkZW50aWNh
bGx5IHRvIG90aGVyIHVzZXMgb2YgYGJpbmRBdHRyYC4gVGhlCi0gIHJldHVybiB2YWx1ZSBvZiB0
aGUgcHJvcGVydHkgd2lsbCBiZWNvbWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIEZvcgot
ICBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHZpZXcgYW5kIHRlbXBsYXRlOgorICBBbHRlcm5hdGl2
ZWx5LCB5b3UgY2FuIGNvbnRyb2wgc2VsZWN0aW9uIHRocm91Z2ggdGhlIHVuZGVybHlpbmcgb2Jq
ZWN0cworICB1c2VkIHRvIHJlbmRlciBlYWNoIG9iamVjdCBieSBiaW5kaW5nIHRoZSBgc2VsZWN0
aW9uYCBvcHRpb24uIFdoZW4gdGhlIHNlbGVjdGVkCisgIGA8b3B0aW9uPmAgaXMgY2hhbmdlZCwg
dGhlIHByb3BlcnR5IHBhdGggcHJvdmlkZWQgdG8gYHNlbGVjdGlvbmAKKyAgd2lsbCBiZSB1cGRh
dGVkIHRvIG1hdGNoIHRoZSBjb250ZW50IG9iamVjdCBvZiB0aGUgcmVuZGVyZWQgYDxvcHRpb24+
YAorICBlbGVtZW50OgogCiAgIGBgYGphdmFzY3JpcHQKLSAgICBBVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIHNvbWVQcm9wZXJ0eTogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJu
ICJhVmFsdWUiOwotICAgICAgfS5wcm9wZXJ0eSgpCi0gICAgfSkKKyAgQXBwLkFwcGxpY2F0aW9u
Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICBzZWxlY3RlZFBlcnNv
bjogbnVsbCwKKyAgICBwcm9ncmFtbWVyczogWworICAgICAge2ZpcnN0TmFtZTogIlllaHVkYSIs
IGlkOiAxfSwKKyAgICAgIHtmaXJzdE5hbWU6ICJUb20iLCAgICBpZDogMn0KKyAgICBdCisgIH0p
OwogICBgYGAKIAogICBgYGBoYW5kbGViYXJzCi0gIDxpbWcge3tiaW5kQXR0ciBjbGFzcz0idmll
dy5zb21lUHJvcGVydHl9fT4KKyAge3t2aWV3IEVtYmVyLlNlbGVjdAorICAgICAgICAgY29udGVu
dD1wcm9ncmFtbWVycworICAgICAgICAgb3B0aW9uVmFsdWVQYXRoPSJjb250ZW50LmlkIgorICAg
ICAgICAgb3B0aW9uTGFiZWxQYXRoPSJjb250ZW50LmZpcnN0TmFtZSIKKyAgICAgICAgIHNlbGVj
dGlvbj1zZWxlY3RlZFBlcnNvbn19CiAgIGBgYAogCi0gIFJlc3VsdCBpbiB0aGUgZm9sbG93aW5n
IHJlbmRlcmVkIG91dHB1dDoKKyAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCB3
aXRoIGEgc2VsZWN0ZWQgb3B0aW9uOgogCi0gIGBgYGh0bWwgCi0gIDxpbWcgY2xhc3M9ImFWYWx1
ZSI+CisgIGBgYGh0bWwKKyAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KKyAgICA8b3B0
aW9uIHZhbHVlPSIxIj5ZZWh1ZGE8L29wdGlvbj4KKyAgICA8b3B0aW9uIHZhbHVlPSIyIiBzZWxl
Y3RlZD0ic2VsZWN0ZWQiPlRvbTwvb3B0aW9uPgorICA8L3NlbGVjdD4KICAgYGBgCiAKLSAgQSBi
b29sZWFuIHJldHVybiB2YWx1ZSB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBjbGFzcyBuYW1lIGlm
IHRoZSBwcm9wZXJ0eQotICByZXR1cm5zIGB0cnVlYCBhbmQgcmVtb3ZlIHRoZSBjbGFzcyBuYW1l
IGlmIHRoZSBwcm9wZXJ0eSByZXR1cm5zIGBmYWxzZWAuCisgIEludGVyYWN0aW5nIHdpdGggdGhl
IHJlbmRlcmVkIGVsZW1lbnQgYnkgc2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KKyAgKCdZZWh1
ZGEnKSB3aWxsIHVwZGF0ZSB0aGUgYHNlbGVjdGVkUGVyc29uYCB0byBtYXRjaCB0aGUgb2JqZWN0
IG9mCisgIHRoZSBuZXdseSBzZWxlY3RlZCBgPG9wdGlvbj5gLiBJbiB0aGlzIGNhc2UgaXQgaXMg
dGhlIGZpcnN0IG9iamVjdAorICBpbiB0aGUgYHByb2dyYW1tZXJzYAogCi0gIEEgY2xhc3MgbmFt
ZSBpcyBwcm92aWRlZCB2aWEgdGhlIHN5bnRheCAKLSAgYHNvbWVQcm9wZXJ0eU5hbWU6Y2xhc3Mt
bmFtZS1pZi10cnVlYC4KKyAgIyMgU3VwcGx5aW5nIGEgUHJvbXB0CisKKyAgQSBgbnVsbGAgdmFs
dWUgZm9yIHRoZSBgRW1iZXIuU2VsZWN0YCdzIGB2YWx1ZWAgb3IgYHNlbGVjdGlvbmAgcHJvcGVy
dHkKKyAgcmVzdWx0cyBpbiB0aGVyZSBiZWluZyBubyBgPG9wdGlvbj5gIHdpdGggYSBgc2VsZWN0
ZWRgIGF0dHJpYnV0ZToKIAogICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3ID0gRW1iZXIuVmlldy5l
eHRlbmQoewotICAgIHNvbWVCb29sOiB0cnVlCi0gIH0pCisgIEFwcC5BcHBsaWNhdGlvbkNvbnRy
b2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgc2VsZWN0ZWRQcm9ncmFtbWVy
OiBudWxsLAorICAgIHByb2dyYW1tZXJzOiBbCisgICAgICAiWWVodWRhIiwKKyAgICAgICJUb20i
CisgICAgXQorICB9KTsKICAgYGBgCiAKLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZEF0
dHIgY2xhc3M9InZpZXcuc29tZUJvb2w6Y2xhc3MtbmFtZS1pZi10cnVlIn19PgorICBgYGAgaGFu
ZGxlYmFycworICB7e3ZpZXcgRW1iZXIuU2VsZWN0CisgICAgICAgICBjb250ZW50PXByb2dyYW1t
ZXJzCisgICAgICAgICB2YWx1ZT1zZWxlY3RlZFByb2dyYW1tZXIKKyAgfX0KICAgYGBgCiAKLSAg
UmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQgb3V0cHV0OgorICBXb3VsZCByZXN1bHQg
aW4gdGhlIGZvbGxvd2luZyBIVE1MOgogCiAgIGBgYGh0bWwKLSAgPGltZyBjbGFzcz0iY2xhc3Mt
bmFtZS1pZi10cnVlIj4KKyAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KKyAgICA8b3B0
aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IlRv
bSI+VG9tPC9vcHRpb24+CisgIDwvc2VsZWN0PgogICBgYGAKIAotICBBbiBhZGRpdGlvbmFsIHNl
Y3Rpb24gb2YgdGhlIGJpbmRpbmcgY2FuIGJlIHByb3ZpZGVkIGlmIHlvdSB3YW50IHRvCi0gIHJl
cGxhY2UgdGhlIGV4aXN0aW5nIGNsYXNzIGluc3RlYWQgb2YgcmVtb3ZpbmcgaXQgd2hlbiB0aGUg
Ym9vbGVhbgotICB2YWx1ZSBjaGFuZ2VzOgorICBBbHRob3VnaCBgc2VsZWN0ZWRQcm9ncmFtbWVy
YCBpcyBgbnVsbGAgYW5kIG5vIGA8b3B0aW9uPmAKKyAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1
dGUgdGhlIHJlbmRlcmVkIEhUTUwgd2lsbCBkaXNwbGF5IHRoZQorICBmaXJzdCBpdGVtIGFzIHRo
b3VnaCBpdCB3ZXJlIHNlbGVjdGVkLiBZb3UgY2FuIHN1cHBseSBhIHN0cmluZworICB2YWx1ZSBm
b3IgdGhlIGBFbWJlci5TZWxlY3RgIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rp
b24KKyAgd2l0aCB0aGUgYHByb21wdGAgb3B0aW9uOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBw
LkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICBz
ZWxlY3RlZFByb2dyYW1tZXI6IG51bGwsCisgICAgcHJvZ3JhbW1lcnM6IFsKKyAgICAgICJZZWh1
ZGEiLAorICAgICAgIlRvbSIKKyAgICBdCisgIH0pOworICBgYGAKIAogICBgYGBoYW5kbGViYXJz
Ci0gIDxpbWcge3tiaW5kQXR0ciBjbGFzcz0idmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRy
dWU6Y2xhc3MtbmFtZS1pZi1mYWxzZSJ9fT4KKyAge3t2aWV3IEVtYmVyLlNlbGVjdAorICAgICAg
ICAgY29udGVudD1wcm9ncmFtbWVycworICAgICAgICAgdmFsdWU9c2VsZWN0ZWRQcm9ncmFtbWVy
CisgICAgICAgICBwcm9tcHQ9IlBsZWFzZSBzZWxlY3QgYSBuYW1lIgorICB9fQogICBgYGAKIAot
ICBBIGhhcmQtY29kZWQgdmFsdWUgY2FuIGJlIHVzZWQgYnkgcHJlcGVuZGluZyBgOmAgdG8gdGhl
IGRlc2lyZWQKLSAgY2xhc3MgbmFtZTogYDpjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseWAuCisg
IFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6CiAKLSAgYGBgaGFuZGxlYmFycwot
ICA8aW1nIHt7YmluZEF0dHIgY2xhc3M9IjpjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseSJ9fT4K
KyAgYGBgaHRtbAorICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgorICAgIDxvcHRpb24+
UGxlYXNlIHNlbGVjdCBhIG5hbWU8L29wdGlvbj4KKyAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEi
PlllaHVkYTwvb3B0aW9uPgorICAgIDxvcHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Cisg
IDwvc2VsZWN0PgogICBgYGAKIAotICBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQg
b3V0cHV0OgorICBAY2xhc3MgU2VsZWN0CisgIEBuYW1lc3BhY2UgRW1iZXIKKyAgQGV4dGVuZHMg
RW1iZXIuVmlldworKi8KK0VtYmVyLlNlbGVjdCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgdGFn
TmFtZTogJ3NlbGVjdCcsCisgIGNsYXNzTmFtZXM6IFsnZW1iZXItc2VsZWN0J10sCisgIGRlZmF1
bHRUZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0ZShmdW5jdGlvbiBhbm9ueW1vdXMo
SGFuZGxlYmFycyxkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7Cit0aGlzLmNvbXBpbGVy
SW5mbyA9IFs0LCc+PSAxLjAuMCddOworaGVscGVycyA9IHRoaXMubWVyZ2UoaGVscGVycywgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzKTsgZGF0YSA9IGRhdGEgfHwge307CisgIHZhciBidWZmZXIg
PSAnJywgc3RhY2sxLCBoYXNoVHlwZXMsIGhhc2hDb250ZXh0cywgZXNjYXBlRXhwcmVzc2lvbj10
aGlzLmVzY2FwZUV4cHJlc3Npb24sIHNlbGY9dGhpczsKKworZnVuY3Rpb24gcHJvZ3JhbTEoZGVw
dGgwLGRhdGEpIHsKKyAgCisgIHZhciBidWZmZXIgPSAnJywgc3RhY2sxLCBoYXNoVHlwZXMsIGhh
c2hDb250ZXh0czsKKyAgZGF0YS5idWZmZXIucHVzaCgiPG9wdGlvbiB2YWx1ZT1cIlwiPiIpOwor
ICBoYXNoVHlwZXMgPSB7fTsKKyAgaGFzaENvbnRleHRzID0ge307CisgIHN0YWNrMSA9IGhlbHBl
cnMuX3RyaWFnZU11c3RhY2hlLmNhbGwoZGVwdGgwLCAidmlldy5wcm9tcHQiLCB7aGFzaDp7fSxj
b250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxo
YXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOworICBpZihzdGFjazEgfHwgc3RhY2sxID09
PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQorICBkYXRhLmJ1ZmZlci5wdXNoKCI8
L29wdGlvbj4iKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCitmdW5jdGlvbiBwcm9ncmFtMyhk
ZXB0aDAsZGF0YSkgeworICAKKyAgdmFyIHN0YWNrMSwgaGFzaFR5cGVzLCBoYXNoQ29udGV4dHM7
CisgIGhhc2hUeXBlcyA9IHt9OworICBoYXNoQ29udGV4dHMgPSB7fTsKKyAgc3RhY2sxID0gaGVs
cGVycy5lYWNoLmNhbGwoZGVwdGgwLCAidmlldy5ncm91cGVkQ29udGVudCIsIHtoYXNoOnt9LGlu
dmVyc2U6c2VsZi5ub29wLGZuOnNlbGYucHJvZ3JhbSg0LCBwcm9ncmFtNCwgZGF0YSksY29udGV4
dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFzaFR5
cGVzOmhhc2hUeXBlcyxkYXRhOmRhdGF9KTsKKyAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0gMCkg
eyBkYXRhLmJ1ZmZlci5wdXNoKHN0YWNrMSk7IH0KKyAgZWxzZSB7IGRhdGEuYnVmZmVyLnB1c2go
JycpOyB9CisgIH0KK2Z1bmN0aW9uIHByb2dyYW00KGRlcHRoMCxkYXRhKSB7CisgIAorICB2YXIg
aGFzaENvbnRleHRzLCBoYXNoVHlwZXM7CisgIGhhc2hDb250ZXh0cyA9IHsnY29udGVudCc6IGRl
cHRoMCwnbGFiZWwnOiBkZXB0aDB9OworICBoYXNoVHlwZXMgPSB7J2NvbnRlbnQnOiAiSUQiLCds
YWJlbCc6ICJJRCJ9OworICBkYXRhLmJ1ZmZlci5wdXNoKGVzY2FwZUV4cHJlc3Npb24oaGVscGVy
cy52aWV3LmNhbGwoZGVwdGgwLCAidmlldy5ncm91cFZpZXciLCB7aGFzaDp7CisgICAgJ2NvbnRl
bnQnOiAoImNvbnRlbnQiKSwKKyAgICAnbGFiZWwnOiAoImxhYmVsIikKKyAgfSxjb250ZXh0czpb
ZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlwZXM6
aGFzaFR5cGVzLGRhdGE6ZGF0YX0pKSk7CisgIH0KKworZnVuY3Rpb24gcHJvZ3JhbTYoZGVwdGgw
LGRhdGEpIHsKKyAgCisgIHZhciBzdGFjazEsIGhhc2hUeXBlcywgaGFzaENvbnRleHRzOworICBo
YXNoVHlwZXMgPSB7fTsKKyAgaGFzaENvbnRleHRzID0ge307CisgIHN0YWNrMSA9IGhlbHBlcnMu
ZWFjaC5jYWxsKGRlcHRoMCwgInZpZXcuY29udGVudCIsIHtoYXNoOnt9LGludmVyc2U6c2VsZi5u
b29wLGZuOnNlbGYucHJvZ3JhbSg3LCBwcm9ncmFtNywgZGF0YSksY29udGV4dHM6W2RlcHRoMF0s
dHlwZXM6WyJJRCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFzaFR5cGVzOmhhc2hUeXBl
cyxkYXRhOmRhdGF9KTsKKyAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0gMCkgeyBkYXRhLmJ1ZmZl
ci5wdXNoKHN0YWNrMSk7IH0KKyAgZWxzZSB7IGRhdGEuYnVmZmVyLnB1c2goJycpOyB9CisgIH0K
K2Z1bmN0aW9uIHByb2dyYW03KGRlcHRoMCxkYXRhKSB7CisgIAorICB2YXIgaGFzaENvbnRleHRz
LCBoYXNoVHlwZXM7CisgIGhhc2hDb250ZXh0cyA9IHsnY29udGVudCc6IGRlcHRoMH07CisgIGhh
c2hUeXBlcyA9IHsnY29udGVudCc6ICJJRCJ9OworICBkYXRhLmJ1ZmZlci5wdXNoKGVzY2FwZUV4
cHJlc3Npb24oaGVscGVycy52aWV3LmNhbGwoZGVwdGgwLCAidmlldy5vcHRpb25WaWV3Iiwge2hh
c2g6eworICAgICdjb250ZW50JzogKCIiKQorICB9LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsi
SUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpk
YXRhfSkpKTsKKyAgfQorCisgIGhhc2hUeXBlcyA9IHt9OworICBoYXNoQ29udGV4dHMgPSB7fTsK
KyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgInZpZXcucHJvbXB0Iiwge2hh
c2g6e30saW52ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFtKDEsIHByb2dyYW0xLCBkYXRh
KSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0
cyxoYXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOworICBpZihzdGFjazEgfHwgc3RhY2sx
ID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQorICBoYXNoVHlwZXMgPSB7fTsK
KyAgaGFzaENvbnRleHRzID0ge307CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0
aDAsICJ2aWV3Lm9wdGlvbkdyb3VwUGF0aCIsIHtoYXNoOnt9LGludmVyc2U6c2VsZi5wcm9ncmFt
KDYsIHByb2dyYW02LCBkYXRhKSxmbjpzZWxmLnByb2dyYW0oMywgcHJvZ3JhbTMsIGRhdGEpLGNv
bnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhh
c2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7CisgIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09
IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9CisgIHJldHVybiBidWZmZXI7CisgIAor
fSksCisgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ211bHRpcGxlJywgJ2Rpc2FibGVkJywgJ3RhYmlu
ZGV4JywgJ25hbWUnXSwKKworICAvKioKKyAgICBUaGUgYG11bHRpcGxlYCBhdHRyaWJ1dGUgb2Yg
dGhlIHNlbGVjdCBlbGVtZW50LiBJbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZQorICAgIG9wdGlv
bnMgY2FuIGJlIHNlbGVjdGVkLgorCisgICAgQHByb3BlcnR5IG11bHRpcGxlCisgICAgQHR5cGUg
Qm9vbGVhbgorICAgIEBkZWZhdWx0IGZhbHNlCisgICovCisgIG11bHRpcGxlOiBmYWxzZSwKKwor
ICAvKioKKyAgICBUaGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdCBlbGVtZW50
LiBJbmRpY2F0ZXMgd2hldGhlcgorICAgIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGZyb20gaW50
ZXJhY3Rpb25zLgorCisgICAgQHByb3BlcnR5IGRpc2FibGVkCisgICAgQHR5cGUgQm9vbGVhbgor
ICAgIEBkZWZhdWx0IGZhbHNlCisgICovCisgIGRpc2FibGVkOiBmYWxzZSwKKworICAvKioKKyAg
ICBUaGUgbGlzdCBvZiBvcHRpb25zLgogCi0gIGBgYGh0bWwKLSAgPGltZyBjbGFzcz0iOmNsYXNz
LW5hbWUtdG8tYWx3YXlzLWFwcGx5Ij4KLSAgYGBgCisgICAgSWYgYG9wdGlvbkxhYmVsUGF0aGAg
YW5kIGBvcHRpb25WYWx1ZVBhdGhgIGFyZSBub3Qgb3ZlcnJpZGRlbiwgdGhpcyBzaG91bGQKKyAg
ICBiZSBhIGxpc3Qgb2Ygc3RyaW5ncywgd2hpY2ggd2lsbCBzZXJ2ZSBzaW11bHRhbmVvdXNseSBh
cyBsYWJlbHMgYW5kIHZhbHVlcy4KIAotICBBbGwgdGhyZWUgc3RyYXRlZ2llcyAtIHN0cmluZyBy
ZXR1cm4gdmFsdWUsIGJvb2xlYW4gcmV0dXJuIHZhbHVlLCBhbmQKLSAgaGFyZC1jb2RlZCB2YWx1
ZSDigJMgY2FuIGJlIGNvbWJpbmVkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uOgorICAgIE90aGVy
d2lzZSwgdGhpcyBzaG91bGQgYmUgYSBsaXN0IG9mIG9iamVjdHMuIEZvciBpbnN0YW5jZToKIAot
ICBgYGBoYW5kbGViYXJzCi0gIDxpbWcge3tiaW5kQXR0ciBjbGFzcz0iOmNsYXNzLW5hbWUtdG8t
YWx3YXlzLWFwcGx5IHZpZXcuc29tZUJvb2w6Y2xhc3MtbmFtZS1pZi10cnVlIHZpZXcuc29tZVBy
b3BlcnR5In19PgotICBgYGAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuU2VsZWN0LmNy
ZWF0ZSh7CisgICAgICBjb250ZW50OiBFbWJlci5BKFsKKyAgICAgICAgICB7IGlkOiAxLCBmaXJz
dE5hbWU6ICdZZWh1ZGEnIH0sCisgICAgICAgICAgeyBpZDogMiwgZmlyc3ROYW1lOiAnVG9tJyB9
CisgICAgICAgIF0pLAorICAgICAgb3B0aW9uTGFiZWxQYXRoOiAnY29udGVudC5maXJzdE5hbWUn
LAorICAgICAgb3B0aW9uVmFsdWVQYXRoOiAnY29udGVudC5pZCcKKyAgICB9KTsKKyAgICBgYGAK
IAotICBAbWV0aG9kIGJpbmRBdHRyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0g
IEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0q
LwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdiaW5kQXR0cicsIGZ1bmN0aW9uKG9w
dGlvbnMpIHsKKyAgICBAcHJvcGVydHkgY29udGVudAorICAgIEB0eXBlIEFycmF5CisgICAgQGRl
ZmF1bHQgbnVsbAorICAqLworICBjb250ZW50OiBudWxsLAogCi0gIHZhciBhdHRycyA9IG9wdGlv
bnMuaGFzaDsKKyAgLyoqCisgICAgV2hlbiBgbXVsdGlwbGVgIGlzIGBmYWxzZWAsIHRoZSBlbGVt
ZW50IG9mIGBjb250ZW50YCB0aGF0IGlzIGN1cnJlbnRseQorICAgIHNlbGVjdGVkLCBpZiBhbnku
CiAKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBoYXNoIGFy
Z3VtZW50IHRvIGJpbmRBdHRyIiwgISFFbWJlci5rZXlzKGF0dHJzKS5sZW5ndGgpOworICAgIFdo
ZW4gYG11bHRpcGxlYCBpcyBgdHJ1ZWAsIGFuIGFycmF5IG9mIHN1Y2ggZWxlbWVudHMuCiAKLSAg
dmFyIHZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgdmFyIHJldCA9IFtdOwotICB2YXIgY3R4
ID0gdGhpczsKKyAgICBAcHJvcGVydHkgc2VsZWN0aW9uCisgICAgQHR5cGUgT2JqZWN0IG9yIEFy
cmF5CisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBzZWxlY3Rpb246IG51bGwsCiAKLSAgLy8g
R2VuZXJhdGUgYSB1bmlxdWUgaWQgZm9yIHRoaXMgZWxlbWVudC4gVGhpcyB3aWxsIGJlIGFkZGVk
IGFzIGEKLSAgLy8gZGF0YSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQgc28gaXQgY2FuIGJlIGxv
b2tlZCB1cCB3aGVuCi0gIC8vIHRoZSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2VzLgotICB2YXIgZGF0
YUlkID0gKytFbWJlci51dWlkOworICAvKioKKyAgICBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUg
KHdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2VgKSwgdmFsdWUgY2FuIGJlIHVzZWQgdG8KKyAgICBn
ZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgdmFsdWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkg
aXQncyB2YWx1ZS4KIAotICAvLyBIYW5kbGUgY2xhc3NlcyBkaWZmZXJlbnRseSwgYXMgd2UgY2Fu
IGJpbmQgbXVsdGlwbGUgY2xhc3NlcwotICB2YXIgY2xhc3NCaW5kaW5ncyA9IGF0dHJzWydjbGFz
cyddOwotICBpZiAoY2xhc3NCaW5kaW5ncyAhPT0gbnVsbCAmJiBjbGFzc0JpbmRpbmdzICE9PSB1
bmRlZmluZWQpIHsKLSAgICB2YXIgY2xhc3NSZXN1bHRzID0gRW1iZXJIYW5kbGViYXJzLmJpbmRD
bGFzc2VzKHRoaXMsIGNsYXNzQmluZGluZ3MsIHZpZXcsIGRhdGFJZCwgb3B0aW9ucyk7CisgICAg
SXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUu
CiAKLSAgICByZXQucHVzaCgnY2xhc3M9IicgKyBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJl
c3Npb24oY2xhc3NSZXN1bHRzLmpvaW4oJyAnKSkgKyAnIicpOwotICAgIGRlbGV0ZSBhdHRyc1sn
Y2xhc3MnXTsKLSAgfQorICAgIEBwcm9wZXJ0eSB2YWx1ZQorICAgIEB0eXBlIFN0cmluZworICAg
IEBkZWZhdWx0IG51bGwKKyAgKi8KKyAgdmFsdWU6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtl
eSwgdmFsdWUpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeyByZXR1cm4gdmFs
dWU7IH0KKyAgICB2YXIgdmFsdWVQYXRoID0gZ2V0KHRoaXMsICdvcHRpb25WYWx1ZVBhdGgnKS5y
ZXBsYWNlKC9eY29udGVudFwuPy8sICcnKTsKKyAgICByZXR1cm4gdmFsdWVQYXRoID8gZ2V0KHRo
aXMsICdzZWxlY3Rpb24uJyArIHZhbHVlUGF0aCkgOiBnZXQodGhpcywgJ3NlbGVjdGlvbicpOwor
ICB9KS5wcm9wZXJ0eSgnc2VsZWN0aW9uJyksCiAKLSAgdmFyIGF0dHJLZXlzID0gRW1iZXIua2V5
cyhhdHRycyk7CisgIC8qKgorICAgIElmIGdpdmVuLCBhIHRvcC1tb3N0IGR1bW15IG9wdGlvbiB3
aWxsIGJlIHJlbmRlcmVkIHRvIHNlcnZlIGFzIGEgdXNlcgorICAgIHByb21wdC4KIAotICAvLyBG
b3IgZWFjaCBhdHRyaWJ1dGUgcGFzc2VkLCBjcmVhdGUgYW4gb2JzZXJ2ZXIgYW5kIGVtaXQgdGhl
Ci0gIC8vIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGFuIGF0dHJpYnV0ZS4KLSAg
Zm9yRWFjaC5jYWxsKGF0dHJLZXlzLCBmdW5jdGlvbihhdHRyKSB7Ci0gICAgdmFyIHBhdGggPSBh
dHRyc1thdHRyXSwKLSAgICAgICAgbm9ybWFsaXplZDsKKyAgICBAcHJvcGVydHkgcHJvbXB0Cisg
ICAgQHR5cGUgU3RyaW5nCisgICAgQGRlZmF1bHQgbnVsbAorICAqLworICBwcm9tcHQ6IG51bGws
CiAKLSAgICBFbWJlci5hc3NlcnQoZm10KCJZb3UgbXVzdCBwcm92aWRlIGEgU3RyaW5nIGZvciBh
IGJvdW5kIGF0dHJpYnV0ZSwgbm90ICVAIiwgW3BhdGhdKSwgdHlwZW9mIHBhdGggPT09ICdzdHJp
bmcnKTsKKyAgLyoqCisgICAgVGhlIHBhdGggb2YgdGhlIG9wdGlvbiBsYWJlbHMuIFNlZSBbY29u
dGVudF0oL2FwaS9jbGFzc2VzL0VtYmVyLlNlbGVjdC5odG1sI3Byb3BlcnR5X2NvbnRlbnQpLgog
Ci0gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgoY3R4LCBwYXRoLCBvcHRpb25zLmRhdGEp
OworICAgIEBwcm9wZXJ0eSBvcHRpb25MYWJlbFBhdGgKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBA
ZGVmYXVsdCAnY29udGVudCcKKyAgKi8KKyAgb3B0aW9uTGFiZWxQYXRoOiAnY29udGVudCcsCiAK
LSAgICB2YXIgdmFsdWUgPSAocGF0aCA9PT0gJ3RoaXMnKSA/IG5vcm1hbGl6ZWQucm9vdCA6IGhh
bmRsZWJhcnNHZXQoY3R4LCBwYXRoLCBvcHRpb25zKSwKLSAgICAgICAgdHlwZSA9IEVtYmVyLnR5
cGVPZih2YWx1ZSk7CisgIC8qKgorICAgIFRoZSBwYXRoIG9mIHRoZSBvcHRpb24gdmFsdWVzLiBT
ZWUgW2NvbnRlbnRdKC9hcGkvY2xhc3Nlcy9FbWJlci5TZWxlY3QuaHRtbCNwcm9wZXJ0eV9jb250
ZW50KS4KIAotICAgIEVtYmVyLmFzc2VydChmbXQoIkF0dHJpYnV0ZXMgbXVzdCBiZSBudW1iZXJz
LCBzdHJpbmdzIG9yIGJvb2xlYW5zLCBub3QgJUAiLCBbdmFsdWVdKSwgdmFsdWUgPT09IG51bGwg
fHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAn
c3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicpOworICAgIEBwcm9wZXJ0eSBvcHRpb25WYWx1
ZVBhdGgKKyAgICBAdHlwZSBTdHJpbmcKKyAgICBAZGVmYXVsdCAnY29udGVudCcKKyAgKi8KKyAg
b3B0aW9uVmFsdWVQYXRoOiAnY29udGVudCcsCiAKLSAgICB2YXIgb2JzZXJ2ZXIsIGludm9rZXI7
CisgIC8qKgorICAgIFRoZSBwYXRoIG9mIHRoZSBvcHRpb24gZ3JvdXAuCisgICAgV2hlbiB0aGlz
IHByb3BlcnR5IGlzIHVzZWQsIGBjb250ZW50YCBzaG91bGQgYmUgc29ydGVkIGJ5IGBvcHRpb25H
cm91cFBhdGhgLgogCi0gICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbiBvYnNlcnZlcigpIHsKLSAgICAg
IHZhciByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwgb3B0aW9ucyk7CisgICAgQHBy
b3BlcnR5IG9wdGlvbkdyb3VwUGF0aAorICAgIEB0eXBlIFN0cmluZworICAgIEBkZWZhdWx0IG51
bGwKKyAgKi8KKyAgb3B0aW9uR3JvdXBQYXRoOiBudWxsLAogCi0gICAgICBFbWJlci5hc3NlcnQo
Zm10KCJBdHRyaWJ1dGVzIG11c3QgYmUgbnVtYmVycywgc3RyaW5ncyBvciBib29sZWFucywgbm90
ICVAIiwgW3Jlc3VsdF0pLCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQg
fHwgdHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmlu
ZycgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKTsKKyAgLyoqCisgICAgVGhlIHZpZXcg
Y2xhc3MgZm9yIG9wdGdyb3VwLgogCi0gICAgICB2YXIgZWxlbSA9IHZpZXcuJCgiW2RhdGEtYmlu
ZGF0dHItIiArIGRhdGFJZCArICI9JyIgKyBkYXRhSWQgKyAiJ10iKTsKKyAgICBAcHJvcGVydHkg
Z3JvdXBWaWV3CisgICAgQHR5cGUgRW1iZXIuVmlldworICAgIEBkZWZhdWx0IEVtYmVyLlNlbGVj
dE9wdGdyb3VwCisgICovCisgIGdyb3VwVmlldzogRW1iZXIuU2VsZWN0T3B0Z3JvdXAsCiAKLSAg
ICAgIC8vIElmIHdlIGFyZW4ndCBhYmxlIHRvIGZpbmQgdGhlIGVsZW1lbnQsIGl0IG1lYW5zIHRo
ZSBlbGVtZW50Ci0gICAgICAvLyB0byB3aGljaCB3ZSB3ZXJlIGJvdW5kIGhhcyBiZWVuIHJlbW92
ZWQgZnJvbSB0aGUgdmlldy4KLSAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgY2FuIGFzc3VtZSB0
aGUgdGVtcGxhdGUgaGFzIGJlZW4gcmUtcmVuZGVyZWQKLSAgICAgIC8vIGFuZCB3ZSBuZWVkIHRv
IGNsZWFuIHVwIHRoZSBvYnNlcnZlci4KLSAgICAgIGlmICghZWxlbSB8fCBlbGVtLmxlbmd0aCA9
PT0gMCkgewotICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihub3JtYWxpemVkLnJvb3QsIG5v
cm1hbGl6ZWQucGF0aCwgaW52b2tlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgZ3Jv
dXBlZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgeworICAgIHZhciBncm91cFBh
dGggPSBnZXQodGhpcywgJ29wdGlvbkdyb3VwUGF0aCcpOworICAgIHZhciBncm91cGVkQ29udGVu
dCA9IEVtYmVyLkEoKTsKKyAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpIHx8
IFtdOwogCi0gICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoZWxlbSwgYXR0
ciwgcmVzdWx0KTsKLSAgICB9OworICAgIGZvckVhY2goY29udGVudCwgZnVuY3Rpb24oaXRlbSkg
eworICAgICAgdmFyIGxhYmVsID0gZ2V0KGl0ZW0sIGdyb3VwUGF0aCk7CiAKLSAgICBpbnZva2Vy
ID0gZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCBv
YnNlcnZlcik7Ci0gICAgfTsKKyAgICAgIGlmIChnZXQoZ3JvdXBlZENvbnRlbnQsICdsYXN0T2Jq
ZWN0LmxhYmVsJykgIT09IGxhYmVsKSB7CisgICAgICAgIGdyb3VwZWRDb250ZW50LnB1c2hPYmpl
Y3QoeworICAgICAgICAgIGxhYmVsOiBsYWJlbCwKKyAgICAgICAgICBjb250ZW50OiBFbWJlci5B
KCkKKyAgICAgICAgfSk7CisgICAgICB9CiAKLSAgICAvLyBBZGQgYW4gb2JzZXJ2ZXIgdG8gdGhl
IHZpZXcgZm9yIHdoZW4gdGhlIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgLy8gV2hlbiB0aGUgb2Jz
ZXJ2ZXIgZmlyZXMsIGZpbmQgdGhlIGVsZW1lbnQgdXNpbmcgdGhlCi0gICAgLy8gdW5pcXVlIGRh
dGEgaWQgYW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRvIHRoZSBuZXcgdmFsdWUuCi0gICAgaWYg
KHBhdGggIT09ICd0aGlzJykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6
ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBpbnZva2VyKTsKLSAgICB9CisgICAgICBnZXQoZ3Jv
dXBlZENvbnRlbnQsICdsYXN0T2JqZWN0LmNvbnRlbnQnKS5wdXNoKGl0ZW0pOworICAgIH0pOwog
Ci0gICAgLy8gaWYgdGhpcyBjaGFuZ2VzLCBhbHNvIGNoYW5nZSB0aGUgbG9naWMgaW4gZW1iZXIt
dmlld3MvbGliL3ZpZXdzL3ZpZXcuanMKLSAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8ICh0
eXBlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpKSkpIHsKLSAgICAgIHJldC5wdXNoKGF0
dHIgKyAnPSInICsgSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHZhbHVlKSArICci
Jyk7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHsKLSAgICAg
IC8vIFRoZSBkZXZlbG9wZXIgY29udHJvbHMgdGhlIGF0dHIgbmFtZSwgc28gaXQgc2hvdWxkIGFs
d2F5cyBiZSBzYWZlCi0gICAgICByZXQucHVzaChhdHRyICsgJz0iJyArIGF0dHIgKyAnIicpOwot
ICAgIH0KLSAgfSwgdGhpcyk7CisgICAgcmV0dXJuIGdyb3VwZWRDb250ZW50OworICB9KS5wcm9w
ZXJ0eSgnb3B0aW9uR3JvdXBQYXRoJywgJ2NvbnRlbnQuQGVhY2gnKSwKIAotICAvLyBBZGQgdGhl
IHVuaXF1ZSBpZGVudGlmaWVyCi0gIC8vIE5PVEU6IFdlIHVzZSBhbGwgbG93ZXItY2FzZSBzaW5j
ZSBGaXJlZm94IGhhcyBwcm9ibGVtcyB3aXRoIG1peGVkIGNhc2UgaW4gU1ZHCi0gIHJldC5wdXNo
KCdkYXRhLWJpbmRhdHRyLScgKyBkYXRhSWQgKyAnPSInICsgZGF0YUlkICsgJyInKTsKLSAgcmV0
dXJuIG5ldyBFbWJlckhhbmRsZWJhcnMuU2FmZVN0cmluZyhyZXQuam9pbignICcpKTsKLX0pOwor
ICAvKioKKyAgICBUaGUgdmlldyBjbGFzcyBmb3Igb3B0aW9uLgogCi0vKioKLSAgQHByaXZhdGUK
KyAgICBAcHJvcGVydHkgb3B0aW9uVmlldworICAgIEB0eXBlIEVtYmVyLlZpZXcKKyAgICBAZGVm
YXVsdCBFbWJlci5TZWxlY3RPcHRpb24KKyAgKi8KKyAgb3B0aW9uVmlldzogRW1iZXIuU2VsZWN0
T3B0aW9uLAogCi0gIEhlbHBlciB0aGF0LCBnaXZlbiBhIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcg
b2YgcHJvcGVydHkgcGF0aHMgYW5kIGEgY29udGV4dCwKLSAgcmV0dXJucyBhbiBhcnJheSBvZiBj
bGFzcyBuYW1lcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHNvIGhhcyB0aGUgc2lkZQotICBlZmZl
Y3Qgb2Ygc2V0dGluZyB1cCBvYnNlcnZlcnMgYXQgdGhvc2UgcHJvcGVydHkgcGF0aHMsIHN1Y2gg
dGhhdCBpZiB0aGV5Ci0gIGNoYW5nZSwgdGhlIGNvcnJlY3QgY2xhc3MgbmFtZSB3aWxsIGJlIHJl
YXBwbGllZCB0byB0aGUgRE9NIGVsZW1lbnQuCisgIF9jaGFuZ2U6IGZ1bmN0aW9uKCkgeworICAg
IGlmIChnZXQodGhpcywgJ211bHRpcGxlJykpIHsKKyAgICAgIHRoaXMuX2NoYW5nZU11bHRpcGxl
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2NoYW5nZVNpbmdsZSgpOworICAgIH0KKyAg
fSwKIAotICBGb3IgZXhhbXBsZSwgaWYgeW91IHBhc3MgdGhlIHN0cmluZyAiZm9vQmFyIiwgaXQg
d2lsbCBmaXJzdCBsb29rIHVwIHRoZQotICAiZm9vQmFyIiB2YWx1ZSBvZiB0aGUgY29udGV4dC4g
SWYgdGhhdCB2YWx1ZSBpcyB0cnVlLCBpdCB3aWxsIGFkZCB0aGUKLSAgImZvby1iYXIiIGNsYXNz
IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgKGkuZS4sIHRoZSBkYXNoZXJpemVkIGZvcm0gb2YKLSAg
ImZvb0JhciIpLiBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYWRkIHRoYXQgc3Ry
aW5nIGFzIHRoZSBjbGFzcy4KLSAgT3RoZXJ3aXNlLCBpdCB3aWxsIG5vdCBhZGQgYW55IG5ldyBj
bGFzcyBuYW1lLgorICBzZWxlY3Rpb25EaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdzZWxlY3Rp
b24uQGVhY2gnLCBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VsZWN0aW9uID0gZ2V0KHRoaXMsICdz
ZWxlY3Rpb24nKTsKKyAgICBpZiAoZ2V0KHRoaXMsICdtdWx0aXBsZScpKSB7CisgICAgICBpZiAo
IWlzQXJyYXkoc2VsZWN0aW9uKSkgeworICAgICAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIEVt
YmVyLkEoW3NlbGVjdGlvbl0pKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhp
cy5fc2VsZWN0aW9uRGlkQ2hhbmdlTXVsdGlwbGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhp
cy5fc2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlKCk7CisgICAgfQorICB9KSwKIAotICBAbWV0aG9k
IGJpbmRDbGFzc2VzCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge0VtYmVyLk9i
amVjdH0gY29udGV4dCBUaGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGxvb2t1cCBwcm9wZXJ0aWVz
Ci0gIEBwYXJhbSB7U3RyaW5nfSBjbGFzc0JpbmRpbmdzIEEgc3RyaW5nLCBzcGFjZS1zZXBhcmF0
ZWQsIG9mIGNsYXNzIGJpbmRpbmdzIAotICAgIHRvIHVzZQotICBAcGFyYW0ge0VtYmVyLlZpZXd9
IHZpZXcgVGhlIHZpZXcgaW4gd2hpY2ggb2JzZXJ2ZXJzIHNob3VsZCBsb29rIGZvciB0aGUgCi0g
ICAgZWxlbWVudCB0byB1cGRhdGUKLSAgQHBhcmFtIHtTcnRpbmd9IGJpbmRBdHRySWQgT3B0aW9u
YWwgYmluZEF0dHIgaWQgdXNlZCB0byBsb29rdXAgZWxlbWVudHMKLSAgQHJldHVybiB7QXJyYXl9
IEFuIGFycmF5IG9mIGNsYXNzIG5hbWVzIHRvIGFkZAotKi8KLUVtYmVySGFuZGxlYmFycy5iaW5k
Q2xhc3NlcyA9IGZ1bmN0aW9uKGNvbnRleHQsIGNsYXNzQmluZGluZ3MsIHZpZXcsIGJpbmRBdHRy
SWQsIG9wdGlvbnMpIHsKLSAgdmFyIHJldCA9IFtdLCBuZXdDbGFzcywgdmFsdWUsIGVsZW07Cisg
IHZhbHVlRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAorICAgICAgICB2YWx1ZSA9IGdl
dCh0aGlzLCAndmFsdWUnKSwKKyAgICAgICAgdmFsdWVQYXRoID0gZ2V0KHRoaXMsICdvcHRpb25W
YWx1ZVBhdGgnKS5yZXBsYWNlKC9eY29udGVudFwuPy8sICcnKSwKKyAgICAgICAgc2VsZWN0ZWRW
YWx1ZSA9ICh2YWx1ZVBhdGggPyBnZXQodGhpcywgJ3NlbGVjdGlvbi4nICsgdmFsdWVQYXRoKSA6
IGdldCh0aGlzLCAnc2VsZWN0aW9uJykpLAorICAgICAgICBzZWxlY3Rpb247CiAKLSAgLy8gSGVs
cGVyIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgY29udGV4dCBhbmQK
LSAgLy8gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHN0cmluZyB0byByZXR1cm4sIGJhc2VkIG9uIHdo
ZXRoZXIgaXQgaXMKLSAgLy8gYSBCb29sZWFuIG9yIG5vdC4KLSAgdmFyIGNsYXNzU3RyaW5nRm9y
UGF0aCA9IGZ1bmN0aW9uKHJvb3QsIHBhcnNlZFBhdGgsIG9wdGlvbnMpIHsKLSAgICB2YXIgdmFs
LAotICAgICAgICBwYXRoID0gcGFyc2VkUGF0aC5wYXRoOworICAgIGlmICh2YWx1ZSAhPT0gc2Vs
ZWN0ZWRWYWx1ZSkgeworICAgICAgc2VsZWN0aW9uID0gY29udGVudCA/IGNvbnRlbnQuZmluZChm
dW5jdGlvbihvYmopIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID09PSAodmFsdWVQYXRoID8gZ2V0
KG9iaiwgdmFsdWVQYXRoKSA6IG9iaik7CisgICAgICB9KSA6IG51bGw7CiAKLSAgICBpZiAocGF0
aCA9PT0gJ3RoaXMnKSB7Ci0gICAgICB2YWwgPSByb290OwotICAgIH0gZWxzZSBpZiAocGF0aCA9
PT0gJycpIHsKLSAgICAgIHZhbCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhbCA9IGhh
bmRsZWJhcnNHZXQocm9vdCwgcGF0aCwgb3B0aW9ucyk7CisgICAgICB0aGlzLnNldCgnc2VsZWN0
aW9uJywgc2VsZWN0aW9uKTsKICAgICB9CisgIH0pLAogCi0gICAgcmV0dXJuIEVtYmVyLlZpZXcu
X2NsYXNzU3RyaW5nRm9yVmFsdWUocGF0aCwgdmFsLCBwYXJzZWRQYXRoLmNsYXNzTmFtZSwgcGFy
c2VkUGF0aC5mYWxzeUNsYXNzTmFtZSk7Ci0gIH07CiAKLSAgLy8gRm9yIGVhY2ggcHJvcGVydHkg
cGFzc2VkLCBsb29wIHRocm91Z2ggYW5kIHNldHVwCi0gIC8vIGFuIG9ic2VydmVyLgotICBmb3JF
YWNoLmNhbGwoY2xhc3NCaW5kaW5ncy5zcGxpdCgnICcpLCBmdW5jdGlvbihiaW5kaW5nKSB7Cisg
IF90cmlnZ2VyQ2hhbmdlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VsZWN0aW9uID0gZ2V0KHRo
aXMsICdzZWxlY3Rpb24nKTsKKyAgICB2YXIgdmFsdWUgPSBnZXQodGhpcywgJ3ZhbHVlJyk7CiAK
LSAgICAvLyBWYXJpYWJsZSBpbiB3aGljaCB0aGUgb2xkIGNsYXNzIHZhbHVlIGlzIHNhdmVkLiBU
aGUgb2JzZXJ2ZXIgZnVuY3Rpb24KLSAgICAvLyBjbG9zZXMgb3ZlciB0aGlzIHZhcmlhYmxlLCBz
byBpdCBrbm93cyB3aGljaCBzdHJpbmcgdG8gcmVtb3ZlIHdoZW4KLSAgICAvLyB0aGUgcHJvcGVy
dHkgY2hhbmdlcy4KLSAgICB2YXIgb2xkQ2xhc3M7CisgICAgaWYgKCFFbWJlci5pc05vbmUoc2Vs
ZWN0aW9uKSkgeyB0aGlzLnNlbGVjdGlvbkRpZENoYW5nZSgpOyB9CisgICAgaWYgKCFFbWJlci5p
c05vbmUodmFsdWUpKSB7IHRoaXMudmFsdWVEaWRDaGFuZ2UoKTsgfQogCi0gICAgdmFyIG9ic2Vy
dmVyLCBpbnZva2VyOworICAgIHRoaXMuX2NoYW5nZSgpOworICB9LAogCi0gICAgdmFyIHBhcnNl
ZFBhdGggPSBFbWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0aChiaW5kaW5nKSwKLSAgICAgICAg
cGF0aCA9IHBhcnNlZFBhdGgucGF0aCwKLSAgICAgICAgcGF0aFJvb3QgPSBjb250ZXh0LAotICAg
ICAgICBub3JtYWxpemVkOworICBfY2hhbmdlU2luZ2xlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
c2VsZWN0ZWRJbmRleCA9IHRoaXMuJCgpWzBdLnNlbGVjdGVkSW5kZXgsCisgICAgICAgIGNvbnRl
bnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKKyAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdw
cm9tcHQnKTsKIAotICAgIGlmIChwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAndGhpcycpIHsKLSAg
ICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRleHQsIHBhdGgsIG9wdGlvbnMuZGF0
YSk7CisgICAgaWYgKCFjb250ZW50IHx8ICFnZXQoY29udGVudCwgJ2xlbmd0aCcpKSB7IHJldHVy
bjsgfQorICAgIGlmIChwcm9tcHQgJiYgc2VsZWN0ZWRJbmRleCA9PT0gMCkgeyBzZXQodGhpcywg
J3NlbGVjdGlvbicsIG51bGwpOyByZXR1cm47IH0KIAotICAgICAgcGF0aFJvb3QgPSBub3JtYWxp
emVkLnJvb3Q7Ci0gICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoOwotICAgIH0KKyAgICBpZiAo
cHJvbXB0KSB7IHNlbGVjdGVkSW5kZXggLT0gMTsgfQorICAgIHNldCh0aGlzLCAnc2VsZWN0aW9u
JywgY29udGVudC5vYmplY3RBdChzZWxlY3RlZEluZGV4KSk7CisgIH0sCiAKLSAgICAvLyBTZXQg
dXAgYW4gb2JzZXJ2ZXIgb24gdGhlIGNvbnRleHQuIElmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0
b2dnbGUgdGhlCi0gICAgLy8gY2xhc3MgbmFtZS4KLSAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkg
ewotICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAg
bmV3Q2xhc3MgPSBjbGFzc1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFyc2VkUGF0aCwgb3B0aW9u
cyk7Ci0gICAgICBlbGVtID0gYmluZEF0dHJJZCA/IHZpZXcuJCgiW2RhdGEtYmluZGF0dHItIiAr
IGJpbmRBdHRySWQgKyAiPSciICsgYmluZEF0dHJJZCArICInXSIpIDogdmlldy4kKCk7CiAKLSAg
ICAgIC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwgYSBwYXJlbnQgdGVt
cGxhdGUgaGFzIGJlZW4KLSAgICAgIC8vIHJlLXJlbmRlcmVkIGFuZCB3ZSd2ZSBiZWVuIG51a2Vk
LiBSZW1vdmUgdGhlIG9ic2VydmVyLgotICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3RoID09
PSAwKSB7Ci0gICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBpbnZv
a2VyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFk
ZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KLSAgICAgICAgaWYgKG9sZENs
YXNzKSB7Ci0gICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7Ci0gICAgICAgIH0K
KyAgX2NoYW5nZU11bHRpcGxlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRoaXMu
JCgnb3B0aW9uOnNlbGVjdGVkJyksCisgICAgICAgIHByb21wdCA9IGdldCh0aGlzLCAncHJvbXB0
JyksCisgICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAorICAgICAgICBjb250ZW50ID0g
Z2V0KHRoaXMsICdjb250ZW50JyksCisgICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2Vs
ZWN0aW9uJyk7CiAKLSAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBhZGQgYSBuZXcgY2xhc3MuIE1h
a2Ugc3VyZSB3ZSBrZWVwIHRyYWNrIG9mIGl0IHNvCi0gICAgICAgIC8vIGl0IGNhbiBiZSByZW1v
dmVkIGluIHRoZSBmdXR1cmUuCi0gICAgICAgIGlmIChuZXdDbGFzcykgewotICAgICAgICAgIGVs
ZW0uYWRkQ2xhc3MobmV3Q2xhc3MpOwotICAgICAgICAgIG9sZENsYXNzID0gbmV3Q2xhc3M7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb2xkQ2xhc3MgPSBudWxsOwotICAgICAgICB9Cisg
ICAgaWYgKCFjb250ZW50KSB7IHJldHVybjsgfQorICAgIGlmIChvcHRpb25zKSB7CisgICAgICB2
YXIgc2VsZWN0ZWRJbmRleGVzID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHJl
dHVybiB0aGlzLmluZGV4IC0gb2Zmc2V0OworICAgICAgfSkudG9BcnJheSgpOworICAgICAgdmFy
IG5ld1NlbGVjdGlvbiA9IGNvbnRlbnQub2JqZWN0c0F0KHNlbGVjdGVkSW5kZXhlcyk7CisKKyAg
ICAgIGlmIChpc0FycmF5KHNlbGVjdGlvbikpIHsKKyAgICAgICAgcmVwbGFjZShzZWxlY3Rpb24s
IDAsIGdldChzZWxlY3Rpb24sICdsZW5ndGgnKSwgbmV3U2VsZWN0aW9uKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHNldCh0aGlzLCAnc2VsZWN0aW9uJywgbmV3U2VsZWN0aW9uKTsKICAgICAg
IH0KLSAgICB9OworICAgIH0KKyAgfSwKIAotICAgIGludm9rZXIgPSBmdW5jdGlvbigpIHsKLSAg
ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIG9ic2VydmVyKTsKLSAgICB9Owor
ICBfc2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZWwgPSB0
aGlzLmdldCgnZWxlbWVudCcpOworICAgIGlmICghZWwpIHsgcmV0dXJuOyB9CiAKLSAgICBpZiAo
cGF0aCAhPT0gJycgJiYgcGF0aCAhPT0gJ3RoaXMnKSB7Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2Jz
ZXJ2ZXIocGF0aFJvb3QsIHBhdGgsIGludm9rZXIpOwotICAgIH0KKyAgICB2YXIgY29udGVudCA9
IGdldCh0aGlzLCAnY29udGVudCcpLAorICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3Nl
bGVjdGlvbicpLAorICAgICAgICBzZWxlY3Rpb25JbmRleCA9IGNvbnRlbnQgPyBpbmRleE9mKGNv
bnRlbnQsIHNlbGVjdGlvbikgOiAtMSwKKyAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdwcm9t
cHQnKTsKIAotICAgIC8vIFdlJ3ZlIGFscmVhZHkgc2V0dXAgdGhlIG9ic2VydmVyOyBub3cgd2Ug
anVzdCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlCi0gICAgLy8gY29ycmVjdCBiZWhhdmlvciByaWdo
dCBub3cgb24gdGhlIGZpcnN0IHBhc3MgdGhyb3VnaC4KLSAgICB2YWx1ZSA9IGNsYXNzU3RyaW5n
Rm9yUGF0aChjb250ZXh0LCBwYXJzZWRQYXRoLCBvcHRpb25zKTsKKyAgICBpZiAocHJvbXB0KSB7
IHNlbGVjdGlvbkluZGV4ICs9IDE7IH0KKyAgICBpZiAoZWwpIHsgZWwuc2VsZWN0ZWRJbmRleCA9
IHNlbGVjdGlvbkluZGV4OyB9CisgIH0sCiAKLSAgICBpZiAodmFsdWUpIHsKLSAgICAgIHJldC5w
dXNoKHZhbHVlKTsKKyAgX3NlbGVjdGlvbkRpZENoYW5nZU11bHRpcGxlOiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAorICAgICAgICBzZWxlY3Rp
b24gPSBnZXQodGhpcywgJ3NlbGVjdGlvbicpLAorICAgICAgICBzZWxlY3RlZEluZGV4ZXMgPSBj
b250ZW50ID8gaW5kZXhlc09mKGNvbnRlbnQsIHNlbGVjdGlvbikgOiBbLTFdLAorICAgICAgICBw
cm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpLAorICAgICAgICBvZmZzZXQgPSBwcm9tcHQgPyAx
IDogMCwKKyAgICAgICAgb3B0aW9ucyA9IHRoaXMuJCgnb3B0aW9uJyksCisgICAgICAgIGFkanVz
dGVkOwogCi0gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBzbyB0
aGF0IGl0IGNhbiBiZSByZW1vdmVkIGlmIHRoZQotICAgICAgLy8gb2JzZXJ2ZXIgZmlyZXMuCi0g
ICAgICBvbGRDbGFzcyA9IHZhbHVlOworICAgIGlmIChvcHRpb25zKSB7CisgICAgICBvcHRpb25z
LmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIGFkanVzdGVkID0gdGhpcy5pbmRleCA+IC0xID8g
dGhpcy5pbmRleCAtIG9mZnNldCA6IC0xOworICAgICAgICB0aGlzLnNlbGVjdGVkID0gaW5kZXhP
ZihzZWxlY3RlZEluZGV4ZXMsIGFkanVzdGVkKSA+IC0xOworICAgICAgfSk7CiAgICAgfQotICB9
KTsKLQotICByZXR1cm4gcmV0OwotfTsKKyAgfSwKIAorICBpbml0OiBmdW5jdGlvbigpIHsKKyAg
ICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0aGlzLCB0
aGlzLl90cmlnZ2VyQ2hhbmdlKTsKKyAgICB0aGlzLm9uKCJjaGFuZ2UiLCB0aGlzLCB0aGlzLl9j
aGFuZ2UpOworICB9Cit9KTsKIAogfSkoKTsKIAogCiAKIChmdW5jdGlvbigpIHsKLS8qZ2xvYmFs
cyBIYW5kbGViYXJzICovCi0KLS8vIFRPRE86IERvbid0IHJlcXVpcmUgdGhlIGVudGlyZSBtb2R1
bGUKIC8qKgogQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCitAc3Vi
bW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMtY29tcGlsZXIKICovCiAKLXZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBQQVJFTlRfVklFV19QQVRIID0gL15wYXJlbnRWaWV3
XC4vOwotdmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVyLkhhbmRsZWJhcnM7CisvKioKIAotRW1i
ZXJIYW5kbGViYXJzLlZpZXdIZWxwZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgVGhlIGB7
e2lucHV0fX1gIGhlbHBlciBpbnNlcnRzIGFuIEhUTUwgYDxpbnB1dD5gIHRhZyBpbnRvIHRoZSB0
ZW1wbGF0ZSwKKyAgd2l0aCBhIGB0eXBlYCB2YWx1ZSBvZiBlaXRoZXIgYHRleHRgIG9yIGBjaGVj
a2JveGAuIElmIG5vIGB0eXBlYCBpcyBwcm92aWRlZCwKKyAgYHRleHRgIHdpbGwgYmUgdGhlIGRl
ZmF1bHQgdmFsdWUgYXBwbGllZC4gVGhlIGF0dHJpYnV0ZXMgb2YgYHt7aW5wdXR9fWAKKyAgbWF0
Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRhZyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIGZv
ciB0aGVzZSB0d28gdHlwZXMuCiAKLSAgcHJvcGVydGllc0Zyb21IVE1MT3B0aW9uczogZnVuY3Rp
b24ob3B0aW9ucywgdGhpc0NvbnRleHQpIHsKLSAgICB2YXIgaGFzaCA9IG9wdGlvbnMuaGFzaCwg
ZGF0YSA9IG9wdGlvbnMuZGF0YTsKLSAgICB2YXIgZXh0ZW5zaW9ucyA9IHt9LAotICAgICAgICBj
bGFzc2VzID0gaGFzaFsnY2xhc3MnXSwKLSAgICAgICAgZHVwID0gZmFsc2U7CisgICMjIFVzZSBh
cyB0ZXh0IGZpZWxkCisgIEFuIGB7e2lucHV0fX1gIHdpdGggbm8gYHR5cGVgIG9yIGEgYHR5cGVg
IG9mIGB0ZXh0YCB3aWxsIHJlbmRlciBhbiBIVE1MIHRleHQgaW5wdXQuCisgIFRoZSBmb2xsb3dp
bmcgSFRNTCBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgdmlhIHRoZSBoZWxwZXI6CiAKLSAgICBpZiAo
aGFzaC5pZCkgewotICAgICAgZXh0ZW5zaW9ucy5lbGVtZW50SWQgPSBoYXNoLmlkOwotICAgICAg
ZHVwID0gdHJ1ZTsKLSAgICB9CisqIGB2YWx1ZWAKKyogYHNpemVgCisqIGBuYW1lYAorKiBgcGF0
dGVybmAKKyogYHBsYWNlaG9sZGVyYAorKiBgZGlzYWJsZWRgCisqIGBtYXhsZW5ndGhgCisqIGB0
YWJpbmRleGAKIAotICAgIGlmIChjbGFzc2VzKSB7Ci0gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5z
cGxpdCgnICcpOwotICAgICAgZXh0ZW5zaW9ucy5jbGFzc05hbWVzID0gY2xhc3NlczsKLSAgICAg
IGR1cCA9IHRydWU7Ci0gICAgfQogCi0gICAgaWYgKGhhc2guY2xhc3NCaW5kaW5nKSB7Ci0gICAg
ICBleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzID0gaGFzaC5jbGFzc0JpbmRpbmcuc3BsaXQo
JyAnKTsKLSAgICAgIGR1cCA9IHRydWU7Ci0gICAgfQorICBXaGVuIHNldCB0byBhIHF1b3RlZCBz
dHJpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIEhUTUwK
KyAgZWxlbWVudC4gV2hlbiBsZWZ0IHVucXVvdGVkLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBib3Vu
ZCB0byBhIHByb3BlcnR5IG9uIHRoZQorICB0ZW1wbGF0ZSdzIGN1cnJlbnQgcmVuZGVyaW5nIGNv
bnRleHQgKG1vc3QgdHlwaWNhbGx5IGEgY29udHJvbGxlciBpbnN0YW5jZSkuCiAKLSAgICBpZiAo
aGFzaC5jbGFzc05hbWVCaW5kaW5ncykgewotICAgICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1l
QmluZGluZ3MgPT09IHVuZGVmaW5lZCkgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IFtd
OwotICAgICAgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGV4dGVuc2lvbnMuY2xhc3NO
YW1lQmluZGluZ3MuY29uY2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKSk7Ci0g
ICAgICBkdXAgPSB0cnVlOwotICAgIH0KKyAgIyMgVW5ib3VuZDoKIAotICAgIGlmIChoYXNoLmF0
dHJpYnV0ZUJpbmRpbmdzKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIlNldHRpbmcgJ2F0dHJpYnV0
ZUJpbmRpbmdzJyB2aWEgSGFuZGxlYmFycyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHN1YmNsYXNz
IEVtYmVyLlZpZXcgYW5kIHNldCBpdCB0aGVyZSBpbnN0ZWFkLiIpOwotICAgICAgZXh0ZW5zaW9u
cy5hdHRyaWJ1dGVCaW5kaW5ncyA9IG51bGw7Ci0gICAgICBkdXAgPSB0cnVlOwotICAgIH0KKyAg
YGBgaGFuZGxlYmFycworICB7e2lucHV0IHZhbHVlPSJodHRwOi8vd3d3LmZhY2Vib29rLmNvbSJ9
fQorICBgYGAKIAotICAgIGlmIChkdXApIHsKLSAgICAgIGhhc2ggPSBFbWJlci4kLmV4dGVuZCh7
fSwgaGFzaCk7Ci0gICAgICBkZWxldGUgaGFzaC5pZDsKLSAgICAgIGRlbGV0ZSBoYXNoWydjbGFz
cyddOwotICAgICAgZGVsZXRlIGhhc2guY2xhc3NCaW5kaW5nOwotICAgIH0KIAotICAgIC8vIFNl
dCB0aGUgcHJvcGVyIGNvbnRleHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQgdG8gdGhlIGhlbHBl
ci4gVGhpcyBhcHBsaWVzIHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzCi0gICAgLy8gYXMg
d2VsbCBhcyBjbGFzcyBuYW1lIGJpbmRpbmdzLiBJZiB0aGUgYmluZGluZ3MgYXJlIGxvY2FsLCBt
YWtlIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dAotICAgIC8vIGluc3RlYWQg
b2YgdGhlIHZpZXcuCi0gICAgdmFyIHBhdGg7CisgIGBgYGh0bWwKKyAgPGlucHV0IHR5cGU9InRl
eHQiIHZhbHVlPSJodHRwOi8vd3d3LmZhY2Vib29rLmNvbSIvPgorICBgYGAKIAotICAgIC8vIEV2
YWx1YXRlIHRoZSBjb250ZXh0IG9mIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzOgotICAgIGZv
ciAodmFyIHByb3AgaW4gaGFzaCkgewotICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHBy
b3ApKSB7IGNvbnRpbnVlOyB9CisgICMjIEJvdW5kOgogCi0gICAgICAvLyBUZXN0IGlmIHRoZSBw
cm9wZXJ0eSBlbmRzIGluICJCaW5kaW5nIgotICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVz
dChwcm9wKSAmJiB0eXBlb2YgaGFzaFtwcm9wXSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgcGF0
aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKGhhc2hbcHJvcF0sIGRhdGEpOwotICAg
ICAgICBpZiAocGF0aCkgeyBoYXNoW3Byb3BdID0gcGF0aDsgfQotICAgICAgfQotICAgIH0KKyAg
YGBgamF2YXNjcmlwdAorICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoeworICAgIGZpcnN0TmFtZTogIlN0YW5sZXkiLAorICAgIGVudHJ5Tm90QWxs
b3dlZDogdHJ1ZQorICB9KTsKKyAgYGBgCiAKLSAgICAvLyBFdmFsdWF0ZSB0aGUgY29udGV4dCBv
ZiBjbGFzcyBuYW1lIGJpbmRpbmdzOgotICAgIGlmIChleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRp
bmdzKSB7Ci0gICAgICBmb3IgKHZhciBiIGluIGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3Mp
IHsKLSAgICAgICAgdmFyIGZ1bGwgPSBleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzW2JdOwot
ICAgICAgICBpZiAodHlwZW9mIGZ1bGwgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgLy8gQ29u
dGV4dHVhbGl6ZSB0aGUgcGF0aCBvZiBjbGFzc05hbWVCaW5kaW5nIHNvIHRoaXM6Ci0gICAgICAg
ICAgLy8KLSAgICAgICAgICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0iaXNHcmVlbjpncmVlbiIK
LSAgICAgICAgICAvLwotICAgICAgICAgIC8vIGlzIGNvbnZlcnRlZCB0byB0aGlzOgotICAgICAg
ICAgIC8vCi0gICAgICAgICAgLy8gICAgIGNsYXNzTmFtZUJpbmRpbmc9Il9wYXJlbnRWaWV3LmNv
bnRleHQuaXNHcmVlbjpncmVlbiIKLSAgICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IEVtYmVyLlZp
ZXcuX3BhcnNlUHJvcGVydHlQYXRoKGZ1bGwpOwotICAgICAgICAgIHBhdGggPSB0aGlzLmNvbnRl
eHR1YWxpemVCaW5kaW5nUGF0aChwYXJzZWRQYXRoLnBhdGgsIGRhdGEpOwotICAgICAgICAgIGlm
IChwYXRoKSB7IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3NbYl0gPSBwYXRoICsgcGFyc2Vk
UGF0aC5jbGFzc05hbWVzOyB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9CiAKLSAgICByZXR1
cm4gRW1iZXIuJC5leHRlbmQoaGFzaCwgZXh0ZW5zaW9ucyk7Ci0gIH0sCisgIGBgYGhhbmRsZWJh
cnMKKyAge3tpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT1maXJzdE5hbWUgZGlzYWJsZWQ9ZW50cnlO
b3RBbGxvd2VkIHNpemU9IjUwIn19CisgIGBgYAogCi0gIC8vIFRyYW5zZm9ybSBiaW5kaW5ncyBm
cm9tIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYSBjb250ZXh0IHRoYXQgY2FuIGJlIGV2YWx1YXRl
ZCB3aXRoaW4gdGhlIHZpZXcuCi0gIC8vIFJldHVybnMgbnVsbCBpZiB0aGUgcGF0aCBzaG91bGRu
J3QgYmUgY2hhbmdlZC4KLSAgLy8KLSAgLy8gVE9ETzogY29uc2lkZXIgdGhlIGFkZGl0aW9uIG9m
IGEgcHJlZml4IHRoYXQgd291bGQgYWxsb3cgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGBwYXRoYC4K
LSAgY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoOiBmdW5jdGlvbihwYXRoLCBkYXRhKSB7Ci0gICAg
dmFyIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgobnVsbCwgcGF0
aCwgZGF0YSk7Ci0gICAgaWYgKG5vcm1hbGl6ZWQuaXNLZXl3b3JkKSB7Ci0gICAgICByZXR1cm4g
J3RlbXBsYXRlRGF0YS5rZXl3b3Jkcy4nICsgcGF0aDsKLSAgICB9IGVsc2UgaWYgKEVtYmVyLmlz
R2xvYmFsUGF0aChwYXRoKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBlbHNlIGlmIChw
YXRoID09PSAndGhpcycpIHsKLSAgICAgIHJldHVybiAnX3BhcmVudFZpZXcuY29udGV4dCc7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAnX3BhcmVudFZpZXcuY29udGV4dC4nICsgcGF0aDsK
LSAgICB9Ci0gIH0sCiAKLSAgaGVscGVyOiBmdW5jdGlvbih0aGlzQ29udGV4dCwgcGF0aCwgb3B0
aW9ucykgewotICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLAotICAgICAgICBkYXRh
ID0gb3B0aW9ucy5kYXRhLAotICAgICAgICB2aWV3ID0gZGF0YS52aWV3LAotICAgICAgICBmbiA9
IG9wdGlvbnMuZm4sCi0gICAgICAgIGhhc2ggPSBvcHRpb25zLmhhc2gsCi0gICAgICAgIG5ld1Zp
ZXc7CisgIGBgYGh0bWwKKyAgPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSJTdGFubGV5IiBkaXNh
YmxlZD0iZGlzYWJsZWQiIHNpemU9IjUwIi8+CisgIGBgYAogCi0gICAgaWYgKCdzdHJpbmcnID09
PSB0eXBlb2YgcGF0aCkgewotICAgICAgbmV3VmlldyA9IEVtYmVySGFuZGxlYmFycy5nZXQodGhp
c0NvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwotICAgICAgRW1iZXIuYXNzZXJ0KCJVbmFibGUgdG8g
ZmluZCB2aWV3IGF0IHBhdGggJyIgKyBwYXRoICsgIiciLCAhIW5ld1ZpZXcpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICBuZXdWaWV3ID0gcGF0aDsKLSAgICB9CisgICMjIEV4dGVuc2lvbgogCi0gICAg
RW1iZXIuYXNzZXJ0KEVtYmVyLlN0cmluZy5mbXQoJ1lvdSBtdXN0IHBhc3MgYSB2aWV3IHRvIHRo
ZSAjdmlldyBoZWxwZXIsIG5vdCAlQCAoJUApJywgW3BhdGgsIG5ld1ZpZXddKSwgRW1iZXIuVmll
dy5kZXRlY3QobmV3VmlldykgfHwgRW1iZXIuVmlldy5kZXRlY3RJbnN0YW5jZShuZXdWaWV3KSk7
CisgIEludGVybmFsbHksIGB7e2lucHV0IHR5cGU9InRleHQifX1gIGNyZWF0ZXMgYW4gaW5zdGFu
Y2Ugb2YgYEVtYmVyLlRleHRGaWVsZGAsIHBhc3NpbmcKKyAgYXJndW1lbnRzIGZyb20gdGhlIGhl
bHBlciB0byBgRW1iZXIuVGV4dEZpZWxkYCdzIGBjcmVhdGVgIG1ldGhvZC4gWW91IGNhbiBleHRl
bmQgdGhlCisgIGNhcGFibGlsdGllcyBvZiB0ZXh0IGlucHV0cyBpbiB5b3VyIGFwcGxpY2F0aW9u
cyBieSByZW9wZW5pbmcgdGhpcyBjbGFzcy4gRm9yIGV4YW1wbGUsCisgIGlmIHlvdSBhcmUgZGVw
bG95aW5nIHRvIGJyb3dzZXJzIHdoZXJlIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBpcyB1c2Vk
LCB5b3UKKyAgY2FuIGFkZCB0aGlzIHRvIHRoZSBgVGV4dEZpZWxkYCdzIGBhdHRyaWJ1dGVCaW5k
aW5nc2AgcHJvcGVydHk6CiAKLSAgICB2YXIgdmlld09wdGlvbnMgPSB0aGlzLnByb3BlcnRpZXNG
cm9tSFRNTE9wdGlvbnMob3B0aW9ucywgdGhpc0NvbnRleHQpOwotICAgIHZhciBjdXJyZW50Vmll
dyA9IGRhdGEudmlldzsKLSAgICB2aWV3T3B0aW9ucy50ZW1wbGF0ZURhdGEgPSBvcHRpb25zLmRh
dGE7Ci0gICAgdmFyIG5ld1ZpZXdQcm90byA9IG5ld1ZpZXcucHJvdG8gPyBuZXdWaWV3LnByb3Rv
KCkgOiBuZXdWaWV3OwogCi0gICAgaWYgKGZuKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBj
YW5ub3QgcHJvdmlkZSBhIHRlbXBsYXRlIGJsb2NrIGlmIHlvdSBhbHNvIHNwZWNpZmllZCBhIHRl
bXBsYXRlTmFtZSIsICFnZXQodmlld09wdGlvbnMsICd0ZW1wbGF0ZU5hbWUnKSAmJiAhZ2V0KG5l
d1ZpZXdQcm90bywgJ3RlbXBsYXRlTmFtZScpKTsKLSAgICAgIHZpZXdPcHRpb25zLnRlbXBsYXRl
ID0gZm47Ci0gICAgfQorICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLlRleHRGaWVsZC5yZW9wZW4o
eworICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3JlcXVpcmVkJ10KKyAgfSk7CisgIGBgYAogCi0g
ICAgLy8gV2Ugb25seSB3YW50IHRvIG92ZXJyaWRlIHRoZSBgX2NvbnRleHRgIGNvbXB1dGVkIHBy
b3BlcnR5IGlmIHRoZXJlIGlzCi0gICAgLy8gbm8gc3BlY2lmaWVkIGNvbnRyb2xsZXIuIFNlZSBW
aWV3I19jb250ZXh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIGlmICghbmV3Vmlld1Byb3Rv
LmNvbnRyb2xsZXIgJiYgIW5ld1ZpZXdQcm90by5jb250cm9sbGVyQmluZGluZyAmJiAhdmlld09w
dGlvbnMuY29udHJvbGxlciAmJiAhdmlld09wdGlvbnMuY29udHJvbGxlckJpbmRpbmcpIHsKLSAg
ICAgIHZpZXdPcHRpb25zLl9jb250ZXh0ID0gdGhpc0NvbnRleHQ7Ci0gICAgfQorICBLZWVwIGlu
IG1pbmQgd2hlbiB3cml0aW5nIGBFbWJlci5UZXh0RmllbGRgIHN1YmNsYXNzZXMgdGhhdCBgRW1i
ZXIuVGV4dEZpZWxkYAorICBpdHNlbGYgZXh0ZW5kcyBgRW1iZXIuQ29tcG9uZW50YCwgbWVhbmlu
ZyB0aGF0IGl0IGRvZXMgTk9UIGluaGVyaXQKKyAgdGhlIGBjb250cm9sbGVyYCBvZiB0aGUgcGFy
ZW50IHZpZXcuCiAKLSAgICBjdXJyZW50Vmlldy5hcHBlbmRDaGlsZChuZXdWaWV3LCB2aWV3T3B0
aW9ucyk7Ci0gIH0KLX0pOworICBTZWUgbW9yZSBhYm91dCBbRW1iZXIgY29tcG9uZW50c10oYXBp
L2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpCiAKLS8qKgotICBge3t2aWV3fX1gIGluc2Vy
dHMgYSBuZXcgaW5zdGFuY2Ugb2YgYEVtYmVyLlZpZXdgIGludG8gYSB0ZW1wbGF0ZSBwYXNzaW5n
IGl0cwotICBvcHRpb25zIHRvIHRoZSBgRW1iZXIuVmlld2AncyBgY3JlYXRlYCBtZXRob2QgYW5k
IHVzaW5nIHRoZSBzdXBwbGllZCBibG9jayBhcwotICB0aGUgdmlldydzIG93biB0ZW1wbGF0ZS4K
IAotICBBbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKyAgIyMg
VXNlIGFzIGNoZWNrYm94CisKKyAgQW4gYHt7aW5wdXR9fWAgd2l0aCBhIGB0eXBlYCBvZiBgY2hl
Y2tib3hgIHdpbGwgcmVuZGVyIGFuIEhUTUwgY2hlY2tib3ggaW5wdXQuCisgIFRoZSBmb2xsb3dp
bmcgSFRNTCBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgdmlhIHRoZSBoZWxwZXI6CisKKyogYGNoZWNr
ZWRgCisqIGBkaXNhYmxlZGAKKyogYHRhYmluZGV4YAorKiBgaW5kZXRlcm1pbmF0ZWAKKyogYG5h
bWVgCisKKworICBXaGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcsIHRoZXNlIHZhbHVlcyB3aWxs
IGJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIEhUTUwKKyAgZWxlbWVudC4gV2hlbiBsZWZ0IHVu
cXVvdGVkLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBib3VuZCB0byBhIHByb3BlcnR5IG9uIHRoZQor
ICB0ZW1wbGF0ZSdzIGN1cnJlbnQgcmVuZGVyaW5nIGNvbnRleHQgKG1vc3QgdHlwaWNhbGx5IGEg
Y29udHJvbGxlciBpbnN0YW5jZSkuCisKKyAgIyMgVW5ib3VuZDoKIAogICBgYGBoYW5kbGViYXJz
Ci0gIEEgc3BhbjoKLSAge3sjdmlldyB0YWdOYW1lPSJzcGFuIn19Ci0gICAgaGVsbG8uCi0gIHt7
L3ZpZXd9fQorICB7e2lucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJpc0FkbWluIn19CiAgIGBg
YAogCi0gIFdpbGwgcmVzdWx0IGluIEhUTUwgc3RydWN0dXJlOgotCiAgIGBgYGh0bWwKLSAgPGJv
ZHk+Ci0gICAgPCEtLSBOb3RlOiB0aGUgaGFuZGxlYmFycyB0ZW1wbGF0ZSBzY3JpcHQKLSAgICAg
ICAgIGFsc28gcmVzdWx0cyBpbiBhIHJlbmRlcmVkIEVtYmVyLlZpZXcKLSAgICAgICAgIHdoaWNo
IGlzIHRoZSBvdXRlciA8ZGl2PiBoZXJlIC0tPgorICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5h
bWU9ImlzQWRtaW4iIC8+CisgIGBgYAogCi0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0g
ICAgICBBIHNwYW46Ci0gICAgICA8c3BhbiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+
Ci0gICAgICAgIEhlbGxvLgotICAgICAgPC9zcGFuPgotICAgIDwvZGl2PgotICA8L2JvZHk+Cisg
ICMjIEJvdW5kOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxl
ciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICBpc0FkbWluOiB0cnVlCisgIH0pOwog
ICBgYGAKIAotICAjIyMgYHBhcmVudFZpZXdgIHNldHRpbmcKIAotICBUaGUgYHBhcmVudFZpZXdg
IHByb3BlcnR5IG9mIHRoZSBuZXcgYEVtYmVyLlZpZXdgIGluc3RhbmNlIGNyZWF0ZWQgdGhyb3Vn
aAotICBge3t2aWV3fX1gIHdpbGwgYmUgc2V0IHRvIHRoZSBgRW1iZXIuVmlld2AgaW5zdGFuY2Ug
b2YgdGhlIHRlbXBsYXRlIHdoZXJlCi0gIGB7e3ZpZXd9fWAgd2FzIGNhbGxlZC4KKyAgYGBgaGFu
ZGxlYmFycworICB7e2lucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPWlzQWRtaW4gfX0KKyAg
YGBgCisKKworICBgYGBodG1sCisgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iY2hl
Y2tlZCIgLz4KKyAgYGBgCisKKyAgIyMgRXh0ZW5zaW9uCisKKyAgSW50ZXJuYWxseSwgYHt7aW5w
dXQgdHlwZT0iY2hlY2tib3gifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkNoZWNr
Ym94YCwgcGFzc2luZworICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5DaGVj
a2JveGAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4gZXh0ZW5kIHRoZQorICBjYXBhYmxpbHRp
ZXMgb2YgY2hlY2tib3ggaW5wdXRzIGluIHlvdXIgYXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0
aGlzIGNsYXNzLiBGb3IgZXhhbXBsZSwKKyAgaWYgeW91IHdhbnRlZCB0byBhZGQgYSBjc3MgY2xh
c3MgdG8gYWxsIGNoZWNrYm94ZXMgaW4geW91ciBhcHBsaWNhdGlvbjoKKwogCiAgIGBgYGphdmFz
Y3JpcHQKLSAgYVZpZXcgPSBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgdGVtcGxhdGU6IEVtYmVy
LkhhbmRsZWJhcnMuY29tcGlsZSgie3sjdmlld319IG15IHBhcmVudDoge3twYXJlbnRWaWV3LmVs
ZW1lbnRJZH19IHt7L3ZpZXd9fSIpCisgIEVtYmVyLkNoZWNrYm94LnJlb3Blbih7CisgICAgY2xh
c3NOYW1lczogWydteS1hcHAtY2hlY2tib3gnXQogICB9KTsKKyAgYGBgCisKKworICBAbWV0aG9k
IGlucHV0CisgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCisgIEBwYXJhbSB7SGFzaH0g
b3B0aW9ucworKi8KK0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lucHV0JywgZnVu
Y3Rpb24ob3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoJ1lvdSBjYW4gb25seSBwYXNzIGF0dHJp
YnV0ZXMgdG8gdGhlIGBpbnB1dGAgaGVscGVyLCBub3QgYXJndW1lbnRzJywgYXJndW1lbnRzLmxl
bmd0aCA8IDIpOworCisgIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLAorICAgICAgdHlwZXMgPSBv
cHRpb25zLmhhc2hUeXBlcywKKyAgICAgIGlucHV0VHlwZSA9IGhhc2gudHlwZSwKKyAgICAgIG9u
RXZlbnQgPSBoYXNoLm9uOworCisgIGRlbGV0ZSBoYXNoLnR5cGU7CisgIGRlbGV0ZSBoYXNoLm9u
OworCisgIGlmIChpbnB1dFR5cGUgPT09ICdjaGVja2JveCcpIHsKKyAgICByZXR1cm4gRW1iZXIu
SGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBFbWJlci5DaGVja2JveCwgb3B0aW9u
cyk7CisgIH0gZWxzZSB7CisgICAgaWYgKGlucHV0VHlwZSkgeyBoYXNoLnR5cGUgPSBpbnB1dFR5
cGU7IH0KKyAgICBoYXNoLm9uRXZlbnQgPSBvbkV2ZW50IHx8ICdlbnRlcic7CisgICAgcmV0dXJu
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywgRW1iZXIuVGV4dEZpZWxk
LCBvcHRpb25zKTsKKyAgfQorfSk7CisKKy8qKgorICBge3t0ZXh0YXJlYX19YCBpbnNlcnRzIGEg
bmV3IGluc3RhbmNlIG9mIGA8dGV4dGFyZWE+YCB0YWcgaW50byB0aGUgdGVtcGxhdGUuCisgIFRo
ZSBhdHRyaWJ1dGVzIG9mIGB7e3RleHRhcmVhfX1gIG1hdGNoIHRob3NlIG9mIHRoZSBuYXRpdmUg
SFRNTCB0YWdzIGFzCisgIGNsb3NlbHkgYXMgcG9zc2libGUuCisKKyAgVGhlIGZvbGxvd2luZyBI
VE1MIGF0dHJpYnV0ZXMgY2FuIGJlIHNldDoKKworICAgICogYHZhbHVlYAorICAgICogYG5hbWVg
CisgICAgKiBgcm93c2AKKyAgICAqIGBjb2xzYAorICAgICogYHBsYWNlaG9sZGVyYAorICAgICog
YGRpc2FibGVkYAorICAgICogYG1heGxlbmd0aGAKKyAgICAqIGB0YWJpbmRleGAKIAotICBhVmll
dy5hcHBlbmRUbygnYm9keScpOworICBXaGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcsIHRoZXNl
IHZhbHVlIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAorICBlbGVtZW50LiBX
aGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGJvdW5kIHRvIGEgcHJvcGVy
dHkgb24gdGhlCisgIHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCAobW9zdCB0
eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4KKworICBVbmJvdW5kOgorCisgIGBgYGhh
bmRsZWJhcnMKKyAge3t0ZXh0YXJlYSB2YWx1ZT0iTG90cyBvZiBzdGF0aWMgdGV4dCB0aGF0IElT
TidUIGJvdW5kIn19CiAgIGBgYAogCi0gIFdpbGwgcmVzdWx0IGluIEhUTUwgc3RydWN0dXJlOgor
ICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgogCiAgIGBgYGh0bWwKLSAgPGRp
diBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBpZD0iZW1iZXIyIiBj
bGFzcz0iZW1iZXItdmlldyI+Ci0gICAgICBteSBwYXJlbnQ6IGVtYmVyMQotICAgIDwvZGl2Pgot
ICA8L2Rpdj4KKyAgPHRleHRhcmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgorICAgIExvdHMg
b2Ygc3RhdGljIHRleHQgdGhhdCBJU04nVCBib3VuZAorICA8L3RleHRhcmVhPgogICBgYGAKIAot
ICAjIyMgU2V0dGluZyBDU1MgaWQgYW5kIGNsYXNzIGF0dHJpYnV0ZXMKKyAgQm91bmQ6CiAKLSAg
VGhlIEhUTUwgYGlkYCBhdHRyaWJ1dGUgY2FuIGJlIHNldCBvbiB0aGUgYHt7dmlld319YCdzIHJl
c3VsdGluZyBlbGVtZW50IHdpdGgKLSAgdGhlIGBpZGAgb3B0aW9uLiBUaGlzIG9wdGlvbiB3aWxs
IF9ub3RfIGJlIHBhc3NlZCB0byBgRW1iZXIuVmlldy5jcmVhdGVgLgorICBJbiB0aGUgZm9sbG93
aW5nIGV4YW1wbGUsIHRoZSBgd3JpdHRlbldvcmRzYCBwcm9wZXJ0eSBvbiBgQXBwLkFwcGxpY2F0
aW9uQ29udHJvbGxlcmAKKyAgd2lsbCBiZSB1cGRhdGVkIGxpdmUgYXMgdGhlIHVzZXIgdHlwZXMg
J0xvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kJyBpbnRvCisgIHRoZSB0ZXh0IGFyZWEgb2YgdGhl
aXIgYnJvd3NlcidzIHdpbmRvdy4KKworICBgYGBqYXZhc2NyaXB0CisgIEFwcC5BcHBsaWNhdGlv
bkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgd3JpdHRlbldvcmRz
OiAiTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQiCisgIH0pOworICBgYGAKIAogICBgYGBoYW5k
bGViYXJzCi0gIHt7I3ZpZXcgdGFnTmFtZT0ic3BhbiIgaWQ9ImEtY3VzdG9tLWlkIn19Ci0gICAg
aGVsbG8uCi0gIHt7L3ZpZXd9fQorICB7e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jkc319CiAg
IGBgYAogCi0gIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToKKyAgIFdv
dWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6CiAKICAgYGBgaHRtbAotICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3Ij4KLSAgICA8c3BhbiBpZD0iYS1jdXN0b20taWQiIGNsYXNzPSJlbWJl
ci12aWV3Ij4KLSAgICAgIGhlbGxvLgotICAgIDwvc3Bhbj4KLSAgPC9kaXY+CisgIDx0ZXh0YXJl
YSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KKyAgICBMb3RzIG9mIHRleHQgdGhhdCBJUyBib3Vu
ZAorICA8L3RleHRhcmVhPgogICBgYGAKIAotICBUaGUgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBj
YW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQKLSAgd2l0aCB0
aGUgYGNsYXNzYCBvciBgY2xhc3NOYW1lQmluZGluZ3NgIG9wdGlvbnMuIFRoZSBgY2xhc3NgIG9w
dGlvbiB3aWxsCi0gIGRpcmVjdGx5IHNldCB0aGUgQ1NTIGBjbGFzc2AgYXR0cmlidXRlIGFuZCB3
aWxsIG5vdCBiZSBwYXNzZWQgdG8KLSAgYEVtYmVyLlZpZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJp
bmRpbmdzYCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRlYCBhbmQgdXNlCi0gIGBFbWJlci5WaWV3
YCdzIGNsYXNzIG5hbWUgYmluZGluZyBmdW5jdGlvbmFsaXR5OgorICBJZiB5b3Ugd2FudGVkIGEg
b25lIHdheSBiaW5kaW5nIGJldHdlZW4gdGhlIHRleHQgYXJlYSBhbmQgYSBkaXYgdGFnCisgIHNv
bWV3aGVyZSBlbHNlIG9uIHlvdXIgc2NyZWVuLCB5b3UgY291bGQgdXNlIGBFbWJlci5jb21wdXRl
ZC5vbmVXYXlgOgogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjdmlldyB0YWdOYW1lPSJzcGFuIiBj
bGFzcz0iYS1jdXN0b20tY2xhc3MifX0KLSAgICBoZWxsby4KLSAge3svdmlld319CisgIGBgYGph
dmFzY3JpcHQKKyAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKKyAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCIs
CisgICAgb3V0cHV0V3JpdHRlbldvcmRzOiBFbWJlci5jb21wdXRlZC5vbmVXYXkoIndyaXR0ZW5X
b3JkcyIpCisgIH0pOwogICBgYGAKIAotICBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmU6CisgIGBgYGhhbmRsZWJhcnMKKyAge3t0ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29y
ZHN9fQogCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPHNwYW4g
aWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcgYS1jdXN0b20tY2xhc3MiPgotICAgICAgaGVs
bG8uCi0gICAgPC9zcGFuPgorICA8ZGl2PgorICAgIHt7b3V0cHV0V3JpdHRlbldvcmRzfX0KICAg
PC9kaXY+CiAgIGBgYAogCi0gICMjIyBTdXBwbHlpbmcgYSBkaWZmZXJlbnQgdmlldyBjbGFzcwor
ICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgogCi0gIGB7e3ZpZXd9fWAgY2Fu
IHRha2UgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBzdXBwbGllZCBvcHRp
b25zIHRvCi0gIHNwZWNpZnkgYSBwYXRoIHRvIGEgY3VzdG9tIHZpZXcgY2xhc3MuCisgIGBgYGh0
bWwKKyAgPHRleHRhcmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgorICAgIExvdHMgb2YgdGV4
dCB0aGF0IElTIGJvdW5kCisgIDwvdGV4dGFyZWE+CiAKLSAgYGBgaGFuZGxlYmFycwotICB7eyN2
aWV3ICJNeUFwcC5DdXN0b21WaWV3In19Ci0gICAgaGVsbG8uCi0gIHt7L3ZpZXd9fQorICA8LS0g
dGhlIGZvbGxvd2luZyBkaXYgd2lsbCBiZSB1cGRhdGVkIGluIHJlYWwgdGltZSBhcyB5b3UgdHlw
ZSAtLT4KKworICA8ZGl2PgorICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCisgIDwvZGl2
PgogICBgYGAKIAotICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBw
YXRoLiBFbWJlciB3aWxsIHNlYXJjaCBmb3IgdGhlCi0gIHZpZXcgY2xhc3Mgc3RhcnRpbmcgYXQg
dGhlIGBFbWJlci5WaWV3YCBvZiB0aGUgdGVtcGxhdGUgd2hlcmUgYHt7dmlld319YCB3YXMKLSAg
dXNlZCBhcyB0aGUgcm9vdCBvYmplY3Q6CisgIEZpbmFsbHksIHRoaXMgZXhhbXBsZSByZWFsbHkg
c2hvd3MgdGhlIHBvd2VyIGFuZCBlYXNlIG9mIEVtYmVyIHdoZW4gdHdvCisgIHByb3BlcnRpZXMg
YXJlIGJvdW5kIHRvIGVhY2hvdGhlciB2aWEgYEVtYmVyLmNvbXB1dGVkLmFsaWFzYC4gVHlwZSBp
bnRvCisgIGVpdGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5J2xsIGJvdGggc3RheSBpbiBzeW5j
LiBOb3RlIHRoYXQKKyAgYEVtYmVyLmNvbXB1dGVkLmFsaWFzYCBjb3N0cyBtb3JlIGluIHRlcm1z
IG9mIHBlcmZvcm1hbmNlLCBzbyBvbmx5IHVzZSBpdCB3aGVuCisgIHlvdXIgcmVhbGx5IGJpbmRp
bmcgaW4gYm90aCBkaXJlY3Rpb25zOgogCiAgIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAgPSBFbWJl
ci5BcHBsaWNhdGlvbi5jcmVhdGUoe30pOwotICBNeUFwcC5PdXRlclZpZXcgPSBFbWJlci5WaWV3
LmV4dGVuZCh7Ci0gICAgaW5uZXJWaWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAg
IGNsYXNzTmFtZXM6IFsnYS1jdXN0b20tdmlldy1jbGFzcy1hcy1wcm9wZXJ0eSddCi0gICAgfSks
Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgne3sjdmlldyAiaW5uZXJW
aWV3Q2xhc3MifX0gaGkge3svdmlld319JykKKyAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9
IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRl
eHQgdGhhdCBJUyBib3VuZCIsCisgICAgdHdvV2F5V3JpdHRlbldvcmRzOiBFbWJlci5jb21wdXRl
ZC5hbGlhcygid3JpdHRlbldvcmRzIikKICAgfSk7Ci0KLSAgTXlBcHAuT3V0ZXJWaWV3LmNyZWF0
ZSgpLmFwcGVuZFRvKCdib2R5Jyk7CiAgIGBgYAogCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xs
b3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXciPgotICAgIDxkaXYgaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcgYS1jdXN0b20t
dmlldy1jbGFzcy1hcy1wcm9wZXJ0eSI+Ci0gICAgICBoaQotICAgIDwvZGl2PgotICA8L2Rpdj4K
KyAgYGBgaGFuZGxlYmFycworICB7e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jkc319CisgIHt7
dGV4dGFyZWEgdmFsdWU9dHdvV2F5V3JpdHRlbldvcmRzfX0KICAgYGBgCiAKLSAgIyMjIEJsb2Nr
bGVzcyB1c2UKKyAgYGBgaHRtbAorICA8dGV4dGFyZWEgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXRleHQtYXJlYSI+CisgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQKKyAgPC90ZXh0YXJl
YT4KIAotICBJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tIGBFbWJlci5WaWV3YCBzdWJjbGFzcyB0aGF0
IHNwZWNpZmllcyBpdHMgb3duIHRlbXBsYXRlCi0gIG9yIHByb3ZpZGUgYSBgdGVtcGxhdGVOYW1l
YCBvcHRpb24gdG8gYHt7dmlld319YCBpdCBjYW4gYmUgdXNlZCB3aXRob3V0Ci0gIHN1cHBseWlu
ZyBhIGJsb2NrLiBBdHRlbXB0cyB0byB1c2UgYm90aCBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlvbiBh
bmQgc3VwcGx5IGEKLSAgYmxvY2sgd2lsbCB0aHJvdyBhbiBlcnJvci4KKyAgPC0tIGJvdGggdXBk
YXRlZCBpbiByZWFsIHRpbWUgLS0+CiAKLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgIk15QXBw
LlZpZXdXaXRoQVRlbXBsYXRlRGVmaW5lZCJ9fQorICA8dGV4dGFyZWEgaWQ9ImVtYmVyMiIgY2xh
c3M9ImVtYmVyLXRleHQtYXJlYSI+CisgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQKKyAg
PC90ZXh0YXJlYT4KICAgYGBgCiAKLSAgIyMjIGB2aWV3TmFtZWAgcHJvcGVydHkKKyAgIyMgRXh0
ZW5zaW9uCiAKLSAgWW91IGNhbiBzdXBwbHkgYSBgdmlld05hbWVgIG9wdGlvbiB0byBge3t2aWV3
fX1gLiBUaGUgYEVtYmVyLlZpZXdgIGluc3RhbmNlCi0gIHdpbGwgYmUgcmVmZXJlbmNlZCBhcyBh
IHByb3BlcnR5IG9mIGl0cyBwYXJlbnQgdmlldyBieSB0aGlzIG5hbWUuCisgIEludGVybmFsbHks
IGB7e3RleHRhcmVhfX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRleHRBcmVhYCwg
cGFzc2luZworICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5UZXh0QXJlYWAn
cyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KKyAgZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2Yg
dGV4dCBhcmVhcyBpbiB5b3VyIGFwcGxpY2F0aW9uIGJ5IHJlb3BlbmluZyB0aGlzCisgIGNsYXNz
LiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBkZXBsb3lpbmcgdG8gYnJvd3NlcnMgd2hlcmUgdGhl
IGByZXF1aXJlZGAKKyAgYXR0cmlidXRlIGlzIHVzZWQsIHlvdSBjYW4gZ2xvYmFsbHkgYWRkIHN1
cHBvcnQgZm9yIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZQorICBvbiBhbGwgYHt7dGV4dGFyZWF9
fWBzJyBpbiB5b3VyIGFwcCBieSByZW9wZW5pbmcgYEVtYmVyLlRleHRBcmVhYCBvcgorICBgRW1i
ZXIuVGV4dFN1cHBvcnRgIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1dGVCaW5kaW5nc2Ag
Y29uY2F0ZW5hdGVkCisgIHByb3BlcnR5OgogCiAgIGBgYGphdmFzY3JpcHQKLSAgYVZpZXcgPSBF
bWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGls
ZSgne3sjdmlldyB2aWV3TmFtZT0iYUNoaWxkQnlOYW1lIn19IGhpIHt7L3ZpZXd9fScpCisgIEVt
YmVyLlRleHRBcmVhLnJlb3Blbih7CisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsncmVxdWlyZWQn
XQogICB9KTsKLQotICBhVmlldy5hcHBlbmRUbygnYm9keScpOwotICBhVmlldy5nZXQoJ2FDaGls
ZEJ5TmFtZScpIC8vIHRoZSBpbnN0YW5jZSBvZiBFbWJlci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3
fX0gaGVscGVyCiAgIGBgYAogCi0gIEBtZXRob2QgdmlldworICBLZWVwIGluIG1pbmQgd2hlbiB3
cml0aW5nIGBFbWJlci5UZXh0QXJlYWAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0QXJlYWAK
KyAgaXRzZWxmIGV4dGVuZHMgYEVtYmVyLkNvbXBvbmVudGAsIG1lYW5pbmcgdGhhdCBpdCBkb2Vz
IE5PVCBpbmhlcml0CisgIHRoZSBgY29udHJvbGxlcmAgb2YgdGhlIHBhcmVudCB2aWV3LgorCisg
IFNlZSBtb3JlIGFib3V0IFtFbWJlciBjb21wb25lbnRzXShhcGkvY2xhc3Nlcy9FbWJlci5Db21w
b25lbnQuaHRtbCkKKworICBAbWV0aG9kIHRleHRhcmVhCiAgIEBmb3IgRW1iZXIuSGFuZGxlYmFy
cy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCiAgIEBwYXJhbSB7SGFzaH0gb3B0aW9u
cwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCiAqLwotRW1iZXJIYW5kbGViYXJzLnJl
Z2lzdGVySGVscGVyKCd2aWV3JywgZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgewotICBFbWJlci5h
c3NlcnQoIlRoZSB2aWV3IGhlbHBlciBvbmx5IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IiwgYXJn
dW1lbnRzLmxlbmd0aCA8PSAyKTsKK0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3Rl
eHRhcmVhJywgZnVuY3Rpb24ob3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoJ1lvdSBjYW4gb25s
eSBwYXNzIGF0dHJpYnV0ZXMgdG8gdGhlIGB0ZXh0YXJlYWAgaGVscGVyLCBub3QgYXJndW1lbnRz
JywgYXJndW1lbnRzLmxlbmd0aCA8IDIpOwogCi0gIC8vIElmIG5vIHBhdGggaXMgcHJvdmlkZWQs
IHRyZWF0IHBhdGggcGFyYW0gYXMgb3B0aW9ucy4KLSAgaWYgKHBhdGggJiYgcGF0aC5kYXRhICYm
IHBhdGguZGF0YS5pc1JlbmRlckRhdGEpIHsKLSAgICBvcHRpb25zID0gcGF0aDsKLSAgICBwYXRo
ID0gIkVtYmVyLlZpZXciOwotICB9CisgIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLAorICAgICAg
dHlwZXMgPSBvcHRpb25zLmhhc2hUeXBlczsKIAotICByZXR1cm4gRW1iZXJIYW5kbGViYXJzLlZp
ZXdIZWxwZXIuaGVscGVyKHRoaXMsIHBhdGgsIG9wdGlvbnMpOworICByZXR1cm4gRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBFbWJlci5UZXh0QXJlYSwgb3B0aW9ucyk7
CiB9KTsKIAorfSkoKTsKKworCisKKyhmdW5jdGlvbigpIHsKK0VtYmVyLkNvbXBvbmVudExvb2t1
cCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICBsb29rdXBGYWN0b3J5OiBmdW5jdGlvbihuYW1l
LCBjb250YWluZXIpIHsKKworICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCB0aGlzLmNvbnRh
aW5lcjsKKworICAgIHZhciBmdWxsTmFtZSA9ICdjb21wb25lbnQ6JyArIG5hbWUsCisgICAgICAg
IHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6Y29tcG9uZW50cy8nICsgbmFtZSwKKyAgICAg
ICAgdGVtcGxhdGVSZWdpc3RlcmVkID0gY29udGFpbmVyICYmIGNvbnRhaW5lci5oYXModGVtcGxh
dGVGdWxsTmFtZSk7CisKKyAgICBpZiAodGVtcGxhdGVSZWdpc3RlcmVkKSB7CisgICAgICBjb250
YWluZXIuaW5qZWN0aW9uKGZ1bGxOYW1lLCAnbGF5b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7Cisg
ICAgfQorCisgICAgdmFyIENvbXBvbmVudCA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KGZ1bGxO
YW1lKTsKKworICAgIC8vIE9ubHkgdHJlYXQgYXMgYSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBj
b21wb25lbnQKKyAgICAvLyBvciBhIHRlbXBsYXRlIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisgICAg
aWYgKHRlbXBsYXRlUmVnaXN0ZXJlZCB8fCBDb21wb25lbnQpIHsKKyAgICAgIGlmICghQ29tcG9u
ZW50KSB7CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihmdWxsTmFtZSwgRW1iZXIuQ29tcG9u
ZW50KTsKKyAgICAgICAgQ29tcG9uZW50ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5h
bWUpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbXBvbmVudDsKKyAgICB9CisgIH0KK30pOwog
CiB9KSgpOwogCkBAIC0xOTU0MSwxOTE0ICszMTE5MywyMzQxIEBAIEVtYmVySGFuZGxlYmFycy5y
ZWdpc3RlckhlbHBlcigndmlldycsIGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKIAogKGZ1bmN0
aW9uKCkgewogLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KLQotLy8gVE9ETzogRG9uJ3QgcmVxdWly
ZSBhbGwgb2YgdGhpcyBtb2R1bGUKIC8qKgogQG1vZHVsZSBlbWJlcgogQHN1Ym1vZHVsZSBlbWJl
ci1oYW5kbGViYXJzCiAqLwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBoYW5kbGViYXJzR2V0ID0g
RW1iZXIuSGFuZGxlYmFycy5nZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7CisvKioKKyAgRmlu
ZCB0ZW1wbGF0ZXMgc3RvcmVkIGluIHRoZSBoZWFkIHRhZyBhcyBzY3JpcHQgdGFncyBhbmQgbWFr
ZSB0aGVtIGF2YWlsYWJsZQorICB0byBgRW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9iYWwgYEVt
YmVyLlRFTVBMQVRFU2Agb2JqZWN0LiBUaGlzIHdpbGwgYmUgcnVuCisgIGFzIGFzIGpRdWVyeSBE
T00tcmVhZHkgY2FsbGJhY2suCisKKyAgU2NyaXB0IHRhZ3Mgd2l0aCBgdGV4dC94LWhhbmRsZWJh
cnNgIHdpbGwgYmUgY29tcGlsZWQKKyAgd2l0aCBFbWJlcidzIEhhbmRsZWJhcnMgYW5kIGFyZSBz
dWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydzIHRlbXBsYXRlLgorICBUaG9zZSB3aXRoIHR5cGUg
YHRleHQveC1yYXctaGFuZGxlYmFyc2Agd2lsbCBiZSBjb21waWxlZCB3aXRoIHJlZ3VsYXIKKyAg
SGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4gdmlld3MnIGNvbXB1dGVkIHBy
b3BlcnRpZXMuCisKKyAgQHByaXZhdGUKKyAgQG1ldGhvZCBib290c3RyYXAKKyAgQGZvciBFbWJl
ci5IYW5kbGViYXJzCisgIEBzdGF0aWMKKyAgQHBhcmFtIGN0eAorKi8KK0VtYmVyLkhhbmRsZWJh
cnMuYm9vdHN0cmFwID0gZnVuY3Rpb24oY3R4KSB7CisgIHZhciBzZWxlY3RvcnMgPSAnc2NyaXB0
W3R5cGU9InRleHQveC1oYW5kbGViYXJzIl0sIHNjcmlwdFt0eXBlPSJ0ZXh0L3gtcmF3LWhhbmRs
ZWJhcnMiXSc7CisKKyAgRW1iZXIuJChzZWxlY3RvcnMsIGN0eCkKKyAgICAuZWFjaChmdW5jdGlv
bigpIHsKKyAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcKKyAgICB2YXIg
c2NyaXB0ID0gRW1iZXIuJCh0aGlzKTsKKworICAgIHZhciBjb21waWxlID0gKHNjcmlwdC5hdHRy
KCd0eXBlJykgPT09ICd0ZXh0L3gtcmF3LWhhbmRsZWJhcnMnKSA/CisgICAgICAgICAgICAgICAg
ICBFbWJlci4kLnByb3h5KEhhbmRsZWJhcnMuY29tcGlsZSwgSGFuZGxlYmFycykgOgorICAgICAg
ICAgICAgICAgICAgRW1iZXIuJC5wcm94eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUsIEVtYmVy
LkhhbmRsZWJhcnMpLAorICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQsIHVzZWQg
YnkgRW1iZXIuVmlldydzIHRlbXBsYXRlTmFtZSBwcm9wZXJ0eS4KKyAgICAgIC8vIEZpcnN0IGxv
b2sgZm9yIGRhdGEtdGVtcGxhdGUtbmFtZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNrIHRvIGl0
cworICAgICAgLy8gaWQgaWYgbm8gbmFtZSBpcyBmb3VuZC4KKyAgICAgIHRlbXBsYXRlTmFtZSA9
IHNjcmlwdC5hdHRyKCdkYXRhLXRlbXBsYXRlLW5hbWUnKSB8fCBzY3JpcHQuYXR0cignaWQnKSB8
fCAnYXBwbGljYXRpb24nLAorICAgICAgdGVtcGxhdGUgPSBjb21waWxlKHNjcmlwdC5odG1sKCkp
OworCisgICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgb2Ygc2FtZSBuYW1lIGFscmVhZHkgZXhpc3Rz
CisgICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdICE9PSB1bmRlZmluZWQpIHsK
KyAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcignVGVtcGxhdGUgbmFtZWQgIicgKyB0ZW1wbGF0
ZU5hbWUgICsgJyIgYWxyZWFkeSBleGlzdHMuJyk7CisgICAgfQorCisgICAgLy8gRm9yIHRlbXBs
YXRlcyB3aGljaCBoYXZlIGEgbmFtZSwgd2Ugc2F2ZSB0aGVtIGFuZCB0aGVuIHJlbW92ZSB0aGVt
IGZyb20gdGhlIERPTQorICAgIEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdID0gdGVtcGxh
dGU7CisKKyAgICAvLyBSZW1vdmUgc2NyaXB0IHRhZyBmcm9tIERPTQorICAgIHNjcmlwdC5yZW1v
dmUoKTsKKyAgfSk7Cit9OworCitmdW5jdGlvbiBib290c3RyYXAoKSB7CisgIEVtYmVyLkhhbmRs
ZWJhcnMuYm9vdHN0cmFwKCBFbWJlci4kKGRvY3VtZW50KSApOworfQorCitmdW5jdGlvbiByZWdp
c3RlckNvbXBvbmVudExvb2t1cChjb250YWluZXIpIHsKKyAgY29udGFpbmVyLnJlZ2lzdGVyKCdj
b21wb25lbnQtbG9va3VwOm1haW4nLCBFbWJlci5Db21wb25lbnRMb29rdXApOworfQorCisvKgor
ICBXZSB0aWUgdGhpcyB0byBhcHBsaWNhdGlvbi5sb2FkIHRvIGVuc3VyZSB0aGF0IHdlJ3ZlIGF0
IGxlYXN0CisgIGF0dGVtcHRlZCB0byBib290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGFw
cGxpY2F0aW9uIGlzIGxvYWRlZC4KKworICBXZSBhbHNvIHRpZSB0aGlzIHRvIGRvY3VtZW50IHJl
YWR5IHNpbmNlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhbGwKKyAgdGhlIGlubGluZSB0ZW1wbGF0
ZXMgYXJlIHByZXNlbnQgYXQgdGhpcyBwb2ludC4KKworICBUaGVyZSdzIG5vIGhhcm0gdG8gcnVu
bmluZyB0aGlzIHR3aWNlLCBzaW5jZSB3ZSByZW1vdmUgdGhlIHRlbXBsYXRlcworICBmcm9tIHRo
ZSBET00gYWZ0ZXIgcHJvY2Vzc2luZy4KKyovCiAKK0VtYmVyLm9uTG9hZCgnRW1iZXIuQXBwbGlj
YXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgeworICBBcHBsaWNhdGlvbi5pbml0aWFsaXpl
cih7CisgICAgbmFtZTogJ2RvbVRlbXBsYXRlcycsCisgICAgaW5pdGlhbGl6ZTogYm9vdHN0cmFw
CisgIH0pOworCisgIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICBuYW1lOiAncmVnaXN0
ZXJDb21wb25lbnRMb29rdXAnLAorICAgIGFmdGVyOiAnZG9tVGVtcGxhdGVzJywKKyAgICBpbml0
aWFsaXplOiByZWdpc3RlckNvbXBvbmVudExvb2t1cAorICB9KTsKK30pOworCit9KSgpOworCisK
KworKGZ1bmN0aW9uKCkgewogLyoqCi0gIGB7e2NvbGxlY3Rpb259fWAgaXMgYSBgRW1iZXIuSGFu
ZGxlYmFyc2AgaGVscGVyIGZvciBhZGRpbmcgaW5zdGFuY2VzIG9mCi0gIGBFbWJlci5Db2xsZWN0
aW9uVmlld2AgdG8gYSB0ZW1wbGF0ZS4gU2VlIGBFbWJlci5Db2xsZWN0aW9uVmlld2AgZm9yCi0g
IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEgYENvbGxlY3Rpb25WaWV3YCBmdW5jdGlv
bnMuCitFbWJlciBIYW5kbGViYXJzCiAKLSAgYHt7Y29sbGVjdGlvbn19YCdzIHByaW1hcnkgdXNl
IGlzIGFzIGEgYmxvY2sgaGVscGVyIHdpdGggYSBgY29udGVudEJpbmRpbmdgCi0gIG9wdGlvbiBw
b2ludGluZyB0b3dhcmRzIGFuIGBFbWJlci5BcnJheWAtY29tcGF0aWJsZSBvYmplY3QuIEFuIGBF
bWJlci5WaWV3YAotICBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaXRlbSBpbiBp
dHMgYGNvbnRlbnRgIHByb3BlcnR5LiBFYWNoIHZpZXcKLSAgd2lsbCBoYXZlIGl0cyBvd24gYGNv
bnRlbnRgIHByb3BlcnR5IHNldCB0byB0aGUgYXBwcm9wcmlhdGUgaXRlbSBpbiB0aGUKLSAgY29s
bGVjdGlvbi4KK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworQHJl
cXVpcmVzIGVtYmVyLXZpZXdzCisqLwogCi0gIFRoZSBwcm92aWRlZCBibG9jayB3aWxsIGJlIGFw
cGxpZWQgYXMgdGhlIHRlbXBsYXRlIGZvciBlYWNoIGl0ZW0ncyB2aWV3LgorRW1iZXIucnVuTG9h
ZEhvb2tzKCdFbWJlci5IYW5kbGViYXJzJywgRW1iZXIuSGFuZGxlYmFycyk7CiAKLSAgR2l2ZW4g
YW4gZW1wdHkgYDxib2R5PmAgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKK30pKCk7CiAKLSAgYGBg
aGFuZGxlYmFycwotICB7eyNjb2xsZWN0aW9uIGNvbnRlbnRCaW5kaW5nPSJBcHAuaXRlbXMifX0K
LSAgICBIaSB7e3ZpZXcuY29udGVudC5uYW1lfX0KLSAge3svY29sbGVjdGlvbn19Ci0gIGBgYAor
KGZ1bmN0aW9uKCkgeworZGVmaW5lKCJyb3V0ZS1yZWNvZ25pemVyIiwKKyAgW10sCisgIGZ1bmN0
aW9uKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKyAgICB2YXIgc3BlY2lhbHMgPSBbCisgICAgICAn
LycsICcuJywgJyonLCAnKycsICc/JywgJ3wnLAorICAgICAgJygnLCAnKScsICdbJywgJ10nLCAn
eycsICd9JywgJ1xcJworICAgIF07CiAKLSAgQW5kIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24g
Y29kZQorICAgIHZhciBlc2NhcGVSZWdleCA9IG5ldyBSZWdFeHAoJyhcXCcgKyBzcGVjaWFscy5q
b2luKCd8XFwnKSArICcpJywgJ2cnKTsKIAotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcCA9IEVtYmVy
LkFwcGxpY2F0aW9uLmNyZWF0ZSgpCi0gIEFwcC5pdGVtcyA9IFsKLSAgICBFbWJlci5PYmplY3Qu
Y3JlYXRlKHtuYW1lOiAnRGF2ZSd9KSwKLSAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAn
TWFyeSd9KSwKLSAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQotICBdCi0g
IGBgYAorICAgIC8vIEEgU2VnbWVudCByZXByZXNlbnRzIGEgc2VnbWVudCBpbiB0aGUgb3JpZ2lu
YWwgcm91dGUgZGVzY3JpcHRpb24uCisgICAgLy8gRWFjaCBTZWdtZW50IHR5cGUgcHJvdmlkZXMg
YW4gYGVhY2hDaGFyYCBhbmQgYHJlZ2V4YCBtZXRob2QuCisgICAgLy8KKyAgICAvLyBUaGUgYGVh
Y2hDaGFyYCBtZXRob2QgaW52b2tlcyB0aGUgY2FsbGJhY2sgd2l0aCBvbmUgb3IgbW9yZSBjaGFy
YWN0ZXIKKyAgICAvLyBzcGVjaWZpY2F0aW9ucy4gQSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBj
b25zdW1lcyBvbmUgb3IgbW9yZSBpbnB1dAorICAgIC8vIGNoYXJhY3RlcnMuCisgICAgLy8KKyAg
ICAvLyBUaGUgYHJlZ2V4YCBtZXRob2QgcmV0dXJucyBhIHJlZ2V4IGZyYWdtZW50IGZvciB0aGUg
c2VnbWVudC4gSWYgdGhlCisgICAgLy8gc2VnbWVudCBpcyBhIGR5bmFtaWMgb2Ygc3RhciBzZWdt
ZW50LCB0aGUgcmVnZXggZnJhZ21lbnQgYWxzbyBpbmNsdWRlcworICAgIC8vIGEgY2FwdHVyZS4K
KyAgICAvLworICAgIC8vIEEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY29udGFpbnM6CisgICAg
Ly8KKyAgICAvLyAqIGB2YWxpZENoYXJzYDogYSBTdHJpbmcgd2l0aCBhIGxpc3Qgb2YgYWxsIHZh
bGlkIGNoYXJhY3RlcnMsIG9yCisgICAgLy8gKiBgaW52YWxpZENoYXJzYDogYSBTdHJpbmcgd2l0
aCBhIGxpc3Qgb2YgYWxsIGludmFsaWQgY2hhcmFjdGVycworICAgIC8vICogYHJlcGVhdGA6IHRy
dWUgaWYgdGhlIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNhbiByZXBlYXQKIAotICBXaWxsIHJl
c3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKKyAgICBmdW5jdGlvbiBTdGF0aWNTZWdt
ZW50KHN0cmluZykgeyB0aGlzLnN0cmluZyA9IHN0cmluZzsgfQorICAgIFN0YXRpY1NlZ21lbnQu
cHJvdG90eXBlID0geworICAgICAgZWFjaENoYXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAg
ICAgIHZhciBzdHJpbmcgPSB0aGlzLnN0cmluZywgY2hhcjsKIAotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkhpIERhdmU8
L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBNYXJ5PC9kaXY+Ci0gICAgPGRp
diBjbGFzcz0iZW1iZXItdmlldyI+SGkgU2FyYTwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCisgICAg
ICAgIGZvciAodmFyIGk9MCwgbD1zdHJpbmcubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICAg
IGNoYXIgPSBzdHJpbmcuY2hhckF0KGkpOworICAgICAgICAgIGNhbGxiYWNrKHsgdmFsaWRDaGFy
czogY2hhciB9KTsKKyAgICAgICAgfQorICAgICAgfSwKIAotICAjIyMgQmxvY2tsZXNzIFVzZQor
ICAgICAgcmVnZXg6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcucmVw
bGFjZShlc2NhcGVSZWdleCwgJ1xcJDEnKTsKKyAgICAgIH0sCiAKLSAgSWYgeW91IHByb3ZpZGUg
YW4gYGl0ZW1WaWV3Q2xhc3NgIG9wdGlvbiB0aGF0IGhhcyBpdHMgb3duIGB0ZW1wbGF0ZWAgeW91
IGNhbgotICBvbWl0IHRoZSBibG9jay4KKyAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOworICAgICAgfQorICAgIH07CiAKLSAgVGhlIGZvbGxv
d2luZyB0ZW1wbGF0ZToKKyAgICBmdW5jdGlvbiBEeW5hbWljU2VnbWVudChuYW1lKSB7IHRoaXMu
bmFtZSA9IG5hbWU7IH0KKyAgICBEeW5hbWljU2VnbWVudC5wcm90b3R5cGUgPSB7CisgICAgICBl
YWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soeyBpbnZhbGlk
Q2hhcnM6ICIvIiwgcmVwZWF0OiB0cnVlIH0pOworICAgICAgfSwKIAotICBgYGBoYW5kbGViYXJz
Ci0gIHt7Y29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIiBpdGVtVmlld0NsYXNz
PSJBcHAuQW5JdGVtVmlldyJ9fQotICBgYGAKKyAgICAgIHJlZ2V4OiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgcmV0dXJuICIoW14vXSspIjsKKyAgICAgIH0sCiAKLSAgQW5kIGFwcGxpY2F0aW9uIGNv
ZGUKKyAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHBh
cmFtc1t0aGlzLm5hbWVdOworICAgICAgfQorICAgIH07CiAKLSAgYGBgamF2YXNjcmlwdAotICBB
cHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAgQXBwLml0ZW1zID0gWwotICAgIEVt
YmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdEYXZlJ30pLAotICAgIEVtYmVyLk9iamVjdC5jcmVh
dGUoe25hbWU6ICdNYXJ5J30pLAotICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdTYXJh
J30pCi0gIF07CisgICAgZnVuY3Rpb24gU3RhclNlZ21lbnQobmFtZSkgeyB0aGlzLm5hbWUgPSBu
YW1lOyB9CisgICAgU3RhclNlZ21lbnQucHJvdG90eXBlID0geworICAgICAgZWFjaENoYXI6IGZ1
bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxiYWNrKHsgaW52YWxpZENoYXJzOiAiIiwg
cmVwZWF0OiB0cnVlIH0pOworICAgICAgfSwKIAotICBBcHAuQW5JdGVtVmlldyA9IEVtYmVyLlZp
ZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJHcmVl
dGluZ3Mge3t2aWV3LmNvbnRlbnQubmFtZX19IikKLSAgfSk7Ci0gIGBgYAorICAgICAgcmVnZXg6
IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIiguKykiOworICAgICAgfSwKIAotICBXaWxs
IHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKKyAgICAgIGdlbmVyYXRlOiBmdW5j
dGlvbihwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOworICAgICAg
fQorICAgIH07CiAKLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICA8
ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgRGF2ZTwvZGl2PgotICAgIDxkaXYgY2xh
c3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBNYXJ5PC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1i
ZXItdmlldyI+R3JlZXRpbmdzIFNhcmE8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAorICAgIGZ1bmN0
aW9uIEVwc2lsb25TZWdtZW50KCkge30KKyAgICBFcHNpbG9uU2VnbWVudC5wcm90b3R5cGUgPSB7
CisgICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oKSB7fSwKKyAgICAgIHJlZ2V4OiBmdW5jdGlvbigp
IHsgcmV0dXJuICIiOyB9LAorICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIiI7
IH0KKyAgICB9OwogCi0gICMjIyBTcGVjaWZ5aW5nIGEgQ29sbGVjdGlvblZpZXcgc3ViY2xhc3MK
KyAgICBmdW5jdGlvbiBwYXJzZShyb3V0ZSwgbmFtZXMsIHR5cGVzKSB7CisgICAgICAvLyBub3Jt
YWxpemUgcm91dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSAiLyIuIFJlY29nbml0aW9uIHdpbGwK
KyAgICAgIC8vIGFsc28gbm9ybWFsaXplLgorICAgICAgaWYgKHJvdXRlLmNoYXJBdCgwKSA9PT0g
Ii8iKSB7IHJvdXRlID0gcm91dGUuc3Vic3RyKDEpOyB9CiAKLSAgQnkgZGVmYXVsdCB0aGUgYHt7
Y29sbGVjdGlvbn19YCBoZWxwZXIgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgYEVtYmVy
LkNvbGxlY3Rpb25WaWV3YC4gWW91IGNhbiBzdXBwbHkgYSBgRW1iZXIuQ29sbGVjdGlvblZpZXdg
IHN1YmNsYXNzIHRvCi0gIHRoZSBoZWxwZXIgYnkgcGFzc2luZyBpdCBhcyB0aGUgZmlyc3QgYXJn
dW1lbnQ6CisgICAgICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zcGxpdCgiLyIpLCByZXN1bHRzID0g
W107CiAKLSAgYGBgaGFuZGxlYmFycwotICB7eyNjb2xsZWN0aW9uIEFwcC5NeUN1c3RvbUNvbGxl
Y3Rpb25DbGFzcyBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNv
bnRlbnQubmFtZX19Ci0gIHt7L2NvbGxlY3Rpb259fQotICBgYGAKKyAgICAgIGZvciAodmFyIGk9
MCwgbD1zZWdtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHZhciBzZWdtZW50ID0g
c2VnbWVudHNbaV0sIG1hdGNoOwogCi0gICMjIyBGb3J3YXJkZWQgYGl0ZW0uKmAtbmFtZWQgT3B0
aW9ucworICAgICAgICBpZiAobWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC9eOihbXlwvXSspJC8pKSB7
CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBEeW5hbWljU2VnbWVudChtYXRjaFsxXSkpOwor
ICAgICAgICAgIG5hbWVzLnB1c2gobWF0Y2hbMV0pOworICAgICAgICAgIHR5cGVzLmR5bmFtaWNz
Kys7CisgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC9eXCooW15cL10r
KSQvKSkgeworICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgU3RhclNlZ21lbnQobWF0Y2hbMV0p
KTsKKyAgICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFdKTsKKyAgICAgICAgICB0eXBlcy5zdGFy
cysrOworICAgICAgICB9IGVsc2UgaWYoc2VnbWVudCA9PT0gIiIpIHsKKyAgICAgICAgICByZXN1
bHRzLnB1c2gobmV3IEVwc2lsb25TZWdtZW50KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIHJlc3VsdHMucHVzaChuZXcgU3RhdGljU2VnbWVudChzZWdtZW50KSk7CisgICAgICAgICAg
dHlwZXMuc3RhdGljcysrOworICAgICAgICB9CisgICAgICB9CiAKLSAgQXMgd2l0aCB0aGUgYHt7
dmlld319YCwgaGVscGVyIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBge3tjb2xsZWN0aW9ufX1gIHdp
bGwgYmUKLSAgc2V0IG9uIHRoZSByZXN1bHRpbmcgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YCBhcyBw
cm9wZXJ0aWVzLiBBZGRpdGlvbmFsbHksCi0gIG9wdGlvbnMgcHJlZml4ZWQgd2l0aCBgaXRlbWAg
d2lsbCBiZSBhcHBsaWVkIHRvIHRoZSB2aWV3cyByZW5kZXJlZCBmb3IgZWFjaAotICBpdGVtIChu
b3RlIHRoZSBjYW1lbGNhc2luZyk6CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CiAKLSAg
YGBgaGFuZGxlYmFycwotICB7eyNjb2xsZWN0aW9uIGNvbnRlbnRCaW5kaW5nPSJBcHAuaXRlbXMi
Ci0gICAgICAgICAgICAgICAgaXRlbVRhZ05hbWU9InAiCi0gICAgICAgICAgICAgICAgaXRlbUNs
YXNzTmFtZXM9ImdyZWV0aW5nIn19Ci0gICAgSG93ZHkge3t2aWV3LmNvbnRlbnQubmFtZX19Ci0g
IHt7L2NvbGxlY3Rpb259fQotICBgYGAKKyAgICAvLyBBIFN0YXRlIGhhcyBhIGNoYXJhY3RlciBz
cGVjaWZpY2F0aW9uIGFuZCAoYGNoYXJTcGVjYCkgYW5kIGEgbGlzdCBvZiBwb3NzaWJsZQorICAg
IC8vIHN1YnNlcXVlbnQgc3RhdGVzIChgbmV4dFN0YXRlc2ApLgorICAgIC8vCisgICAgLy8gSWYg
YSBTdGF0ZSBpcyBhbiBhY2NlcHRpbmcgc3RhdGUsIGl0IHdpbGwgYWxzbyBoYXZlIHNldmVyYWwg
YWRkaXRpb25hbAorICAgIC8vIHByb3BlcnRpZXM6CisgICAgLy8KKyAgICAvLyAqIGByZWdleGA6
IEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCB0byBleHRyYWN0IHBhcmFtZXRlcnMg
ZnJvbSBwYXRocworICAgIC8vICAgdGhhdCByZWFjaGVkIHRoaXMgYWNjZXB0aW5nIHN0YXRlLgor
ICAgIC8vICogYGhhbmRsZXJzYDogSW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnZlcnQgdGhlIGxp
c3Qgb2YgY2FwdHVyZXMgaW50byBjYWxscworICAgIC8vICAgdG8gcmVnaXN0ZXJlZCBoYW5kbGVy
cyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vICogYHR5cGVzYDogSG93IG1h
bnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVudHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0
bworICAgIC8vICAgZGVjaWRlIHdoaWNoIHJvdXRlIHRvIHVzZSBpZiBtdWx0aXBsZSByZWdpc3Rl
cmVkIHJvdXRlcyBtYXRjaCBhIHBhdGguCisgICAgLy8KKyAgICAvLyBDdXJyZW50bHksIFN0YXRl
IGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBuZXh0U3RhdGVzYCBhbmQK
KyAgICAvLyBjb21wYXJpbmcgYSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhZ2FpbnN0IGEgY2hh
cmFjdGVyLiBBIG1vcmUgZWZmaWNpZW50CisgICAgLy8gaW1wbGVtZW50YXRpb24gd291bGQgdXNl
IGEgaGFzaCBvZiBrZXlzIHBvaW50aW5nIGF0IG9uZSBvciBtb3JlIG5leHQgc3RhdGVzLgogCi0g
IFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmU6CisgICAgZnVuY3Rp
b24gU3RhdGUoY2hhclNwZWMpIHsKKyAgICAgIHRoaXMuY2hhclNwZWMgPSBjaGFyU3BlYzsKKyAg
ICAgIHRoaXMubmV4dFN0YXRlcyA9IFtdOworICAgIH0KIAotICBgYGBodG1sCi0gIDxkaXYgY2xh
c3M9ImVtYmVyLXZpZXciPgotICAgIDxwIGNsYXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dk
eSBEYXZlPC9wPgotICAgIDxwIGNsYXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBNYXJ5
PC9wPgotICAgIDxwIGNsYXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBTYXJhPC9wPgot
ICA8L2Rpdj4KLSAgYGBgCisgICAgU3RhdGUucHJvdG90eXBlID0geworICAgICAgZ2V0OiBmdW5j
dGlvbihjaGFyU3BlYykgeworICAgICAgICB2YXIgbmV4dFN0YXRlcyA9IHRoaXMubmV4dFN0YXRl
czsKIAotICBAbWV0aG9kIGNvbGxlY3Rpb24KLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBl
cnMKLSAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0gIEBy
ZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKLSAgQGRlcHJlY2F0ZWQgVXNlIGB7e2VhY2h9fWAg
aGVscGVyIGluc3RlYWQuCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignY29s
bGVjdGlvbicsIGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKLSAgRW1iZXIuZGVwcmVjYXRlKCJV
c2luZyB0aGUge3tjb2xsZWN0aW9ufX0gaGVscGVyIHdpdGhvdXQgc3BlY2lmeWluZyBhIGNsYXNz
IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgdGhlIHt7ZWFjaH19IGhlbHBlciBub3cgc3VwcG9ydHMg
dGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4iLCBwYXRoICE9PSAnY29sbGVjdGlvbicpOworICAgICAg
ICBmb3IgKHZhciBpPTAsIGw9bmV4dFN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAg
ICAgdmFyIGNoaWxkID0gbmV4dFN0YXRlc1tpXTsKIAotICAvLyBJZiBubyBwYXRoIGlzIHByb3Zp
ZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0
YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAg
cGF0aCA9IHVuZGVmaW5lZDsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3Jl
IHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSBjb2xsZWN0aW9uIGhlbHBlciIsIGFyZ3VtZW50cy5s
ZW5ndGggPT09IDEpOwotICB9IGVsc2UgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBw
YXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gIH0KKyAgICAgICAgICB2YXIgaXNFcXVhbCA9IGNoaWxk
LmNoYXJTcGVjLnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLnZhbGlkQ2hhcnM7CisgICAgICAgICAg
aXNFcXVhbCA9IGlzRXF1YWwgJiYgY2hpbGQuY2hhclNwZWMuaW52YWxpZENoYXJzID09PSBjaGFy
U3BlYy5pbnZhbGlkQ2hhcnM7CiAKLSAgdmFyIGZuID0gb3B0aW9ucy5mbjsKLSAgdmFyIGRhdGEg
PSBvcHRpb25zLmRhdGE7Ci0gIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlOwotICB2YXIg
dmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OworICAgICAgICAgIGlmIChpc0VxdWFsKSB7IHJldHVy
biBjaGlsZDsgfQorICAgICAgICB9CisgICAgICB9LAogCi0gIC8vIElmIHBhc3NlZCBhIHBhdGgg
c3RyaW5nLCBjb252ZXJ0IHRoYXQgaW50byBhbiBvYmplY3QuCi0gIC8vIE90aGVyd2lzZSwganVz
dCBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBjbGFzcy4KLSAgdmFyIGNvbGxlY3Rpb25DbGFzczsK
LSAgY29sbGVjdGlvbkNsYXNzID0gcGF0aCA/IGhhbmRsZWJhcnNHZXQodGhpcywgcGF0aCwgb3B0
aW9ucykgOiBFbWJlci5Db2xsZWN0aW9uVmlldzsKLSAgRW1iZXIuYXNzZXJ0KGZtdCgiJUAgI2Nv
bGxlY3Rpb246IENvdWxkIG5vdCBmaW5kIGNvbGxlY3Rpb24gY2xhc3MgJUAiLCBbZGF0YS52aWV3
LCBwYXRoXSksICEhY29sbGVjdGlvbkNsYXNzKTsKKyAgICAgIHB1dDogZnVuY3Rpb24oY2hhclNw
ZWMpIHsKKyAgICAgICAgdmFyIHN0YXRlOwogCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLCBp
dGVtSGFzaCA9IHt9LCBtYXRjaDsKKyAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBzcGVjaWZp
Y2F0aW9uIGFscmVhZHkgZXhpc3RzIGluIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAg
Ly8gc3RhdGUsIGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCisgICAgICAgIGlmIChzdGF0ZSA9IHRo
aXMuZ2V0KGNoYXJTcGVjKSkgeyByZXR1cm4gc3RhdGU7IH0KIAotICAvLyBFeHRyYWN0IGl0ZW0g
dmlldyBjbGFzcyBpZiBwcm92aWRlZCBlbHNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNz
Ci0gIHZhciBpdGVtVmlld0NsYXNzLCBpdGVtVmlld1BhdGggPSBoYXNoLml0ZW1WaWV3Q2xhc3M7
Ci0gIHZhciBjb2xsZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlvbkNsYXNzLnByb3RvKCk7Ci0g
IGRlbGV0ZSBoYXNoLml0ZW1WaWV3Q2xhc3M7Ci0gIGl0ZW1WaWV3Q2xhc3MgPSBpdGVtVmlld1Bh
dGggPyBoYW5kbGViYXJzR2V0KGNvbGxlY3Rpb25Qcm90b3R5cGUsIGl0ZW1WaWV3UGF0aCwgb3B0
aW9ucykgOiBjb2xsZWN0aW9uUHJvdG90eXBlLml0ZW1WaWV3Q2xhc3M7Ci0gIEVtYmVyLmFzc2Vy
dChmbXQoIiVAICNjb2xsZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVtVmlld0NsYXNzICVAIiwg
W2RhdGEudmlldywgaXRlbVZpZXdQYXRoXSksICEhaXRlbVZpZXdDbGFzcyk7CisgICAgICAgIC8v
IE1ha2UgYSBuZXcgc3RhdGUgZm9yIHRoZSBjaGFyYWN0ZXIgc3BlYworICAgICAgICBzdGF0ZSA9
IG5ldyBTdGF0ZShjaGFyU3BlYyk7CiAKLSAgLy8gR28gdGhyb3VnaCBvcHRpb25zIHBhc3NlZCB0
byB0aGUge3tjb2xsZWN0aW9ufX0gaGVscGVyIGFuZCBleHRyYWN0IG9wdGlvbnMKLSAgLy8gdGhh
dCBjb25maWd1cmUgaXRlbSB2aWV3cyBpbnN0ZWFkIG9mIHRoZSBjb2xsZWN0aW9uIGl0c2VsZi4K
LSAgZm9yICh2YXIgcHJvcCBpbiBoYXNoKSB7Ci0gICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHko
cHJvcCkpIHsKLSAgICAgIG1hdGNoID0gcHJvcC5tYXRjaCgvXml0ZW0oLikoLiopJC8pOworICAg
ICAgICAvLyBJbnNlcnQgdGhlIG5ldyBzdGF0ZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IHN0
YXRlCisgICAgICAgIHRoaXMubmV4dFN0YXRlcy5wdXNoKHN0YXRlKTsKIAotICAgICAgaWYobWF0
Y2ggJiYgcHJvcCAhPT0gJ2l0ZW1Db250cm9sbGVyJykgewotICAgICAgICAvLyBDb252ZXJ0IGl0
ZW1TaG91bGRGb28gLT4gc2hvdWxkRm9vCi0gICAgICAgIGl0ZW1IYXNoW21hdGNoWzFdLnRvTG93
ZXJDYXNlKCkgKyBtYXRjaFsyXV0gPSBoYXNoW3Byb3BdOwotICAgICAgICAvLyBEZWxldGUgZnJv
bSBoYXNoIGFzIHRoaXMgd2lsbCBlbmQgdXAgZ2V0dGluZyBwYXNzZWQgdG8gdGhlCi0gICAgICAg
IC8vIHt7dmlld319IGhlbHBlciBtZXRob2QuCi0gICAgICAgIGRlbGV0ZSBoYXNoW3Byb3BdOwot
ICAgICAgfQotICAgIH0KLSAgfQorICAgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciBzcGVjaWZp
Y2F0aW9uIHJlcGVhdHMsIGluc2VydCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hpbGQKKyAgICAgICAg
Ly8gb2YgaXRzZWxmLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCB0cmlnZ2VyIGFuIGluZmluaXRl
IGxvb3AgYmVjYXVzZSBlYWNoCisgICAgICAgIC8vIHRyYW5zaXRpb24gZHVyaW5nIHJlY29nbml0
aW9uIGNvbnN1bWVzIGEgY2hhcmFjdGVyLgorICAgICAgICBpZiAoY2hhclNwZWMucmVwZWF0KSB7
CisgICAgICAgICAgc3RhdGUubmV4dFN0YXRlcy5wdXNoKHN0YXRlKTsKKyAgICAgICAgfQogCi0g
IHZhciB0YWdOYW1lID0gaGFzaC50YWdOYW1lIHx8IGNvbGxlY3Rpb25Qcm90b3R5cGUudGFnTmFt
ZTsKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgc3RhdGUKKyAgICAgICAgcmV0dXJuIHN0YXRl
OworICAgICAgfSwKIAotICBpZiAoZm4pIHsKLSAgICBpdGVtSGFzaC50ZW1wbGF0ZSA9IGZuOwot
ICAgIGRlbGV0ZSBvcHRpb25zLmZuOwotICB9CisgICAgICAvLyBGaW5kIGEgbGlzdCBvZiBjaGls
ZCBzdGF0ZXMgbWF0Y2hpbmcgdGhlIG5leHQgY2hhcmFjdGVyCisgICAgICBtYXRjaDogZnVuY3Rp
b24oY2hhcikgeworICAgICAgICAvLyBERUJVRyAiUHJvY2Vzc2luZyBgIiArIGNoYXIgKyAiYDoi
CisgICAgICAgIHZhciBuZXh0U3RhdGVzID0gdGhpcy5uZXh0U3RhdGVzLAorICAgICAgICAgICAg
Y2hpbGQsIGNoYXJTcGVjLCBjaGFyczsKIAotICB2YXIgZW1wdHlWaWV3Q2xhc3M7Ci0gIGlmIChp
bnZlcnNlICYmIGludmVyc2UgIT09IEhhbmRsZWJhcnMuVk0ubm9vcCkgewotICAgIGVtcHR5Vmll
d0NsYXNzID0gZ2V0KGNvbGxlY3Rpb25Qcm90b3R5cGUsICdlbXB0eVZpZXdDbGFzcycpOwotICAg
IGVtcHR5Vmlld0NsYXNzID0gZW1wdHlWaWV3Q2xhc3MuZXh0ZW5kKHsKLSAgICAgICAgICB0ZW1w
bGF0ZTogaW52ZXJzZSwKLSAgICAgICAgICB0YWdOYW1lOiBpdGVtSGFzaC50YWdOYW1lCi0gICAg
fSk7Ci0gIH0gZWxzZSBpZiAoaGFzaC5lbXB0eVZpZXdDbGFzcykgewotICAgIGVtcHR5Vmlld0Ns
YXNzID0gaGFuZGxlYmFyc0dldCh0aGlzLCBoYXNoLmVtcHR5Vmlld0NsYXNzLCBvcHRpb25zKTsK
LSAgfQotICBpZiAoZW1wdHlWaWV3Q2xhc3MpIHsgaGFzaC5lbXB0eVZpZXcgPSBlbXB0eVZpZXdD
bGFzczsgfQorICAgICAgICAvLyBERUJVRyAiICAiICsgZGVidWdTdGF0ZSh0aGlzKQorICAgICAg
ICB2YXIgcmV0dXJuZWQgPSBbXTsKIAotICBpZighaGFzaC5rZXl3b3JkKXsKLSAgICBpdGVtSGFz
aC5fY29udGV4dCA9IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250ZW50Jyk7Ci0gIH0KKyAgICAg
ICAgZm9yICh2YXIgaT0wLCBsPW5leHRTdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAg
ICAgIGNoaWxkID0gbmV4dFN0YXRlc1tpXTsKIAotICB2YXIgdmlld1N0cmluZyA9IHZpZXcudG9T
dHJpbmcoKTsKKyAgICAgICAgICBjaGFyU3BlYyA9IGNoaWxkLmNoYXJTcGVjOwogCi0gIHZhciB2
aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRsZWJhcnMuVmlld0hlbHBlci5wcm9wZXJ0aWVzRnJvbUhU
TUxPcHRpb25zKHsgZGF0YTogZGF0YSwgaGFzaDogaXRlbUhhc2ggfSwgdGhpcyk7Ci0gIGhhc2gu
aXRlbVZpZXdDbGFzcyA9IGl0ZW1WaWV3Q2xhc3MuZXh0ZW5kKHZpZXdPcHRpb25zKTsKKyAgICAg
ICAgICBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMpICE9PSAndW5kZWZp
bmVkJykgeworICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2hhcikgIT09IC0xKSB7IHJl
dHVybmVkLnB1c2goY2hpbGQpOyB9CisgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGNoYXJz
ID0gY2hhclNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAg
IGlmIChjaGFycy5pbmRleE9mKGNoYXIpID09PSAtMSkgeyByZXR1cm5lZC5wdXNoKGNoaWxkKTsg
fQorICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhl
bHBlcnMudmlldy5jYWxsKHRoaXMsIGNvbGxlY3Rpb25DbGFzcywgb3B0aW9ucyk7Ci19KTsKKyAg
ICAgICAgcmV0dXJuIHJldHVybmVkOworICAgICAgfQogCisgICAgICAvKiogSUYgREVCVUcKKyAg
ICAgICwgZGVidWc6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgY2hhclNwZWMgPSB0aGlzLmNo
YXJTcGVjLAorICAgICAgICAgICAgZGVidWcgPSAiWyIsCisgICAgICAgICAgICBjaGFycyA9IGNo
YXJTcGVjLnZhbGlkQ2hhcnMgfHwgY2hhclNwZWMuaW52YWxpZENoYXJzOwogCi19KSgpOworICAg
ICAgICBpZiAoY2hhclNwZWMuaW52YWxpZENoYXJzKSB7IGRlYnVnICs9ICJeIjsgfQorICAgICAg
ICBkZWJ1ZyArPSBjaGFyczsKKyAgICAgICAgZGVidWcgKz0gIl0iOwogCisgICAgICAgIGlmIChj
aGFyU3BlYy5yZXBlYXQpIHsgZGVidWcgKz0gIisiOyB9CiAKKyAgICAgICAgcmV0dXJuIGRlYnVn
OworICAgICAgfQorICAgICAgRU5EIElGICoqLworICAgIH07CiAKLShmdW5jdGlvbigpIHsKLS8q
Z2xvYmFscyBIYW5kbGViYXJzICovCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItaGFuZGxlYmFycwotKi8KKyAgICAvKiogSUYgREVCVUcKKyAgICBmdW5jdGlvbiBkZWJ1Zyhs
b2cpIHsKKyAgICAgIGNvbnNvbGUubG9nKGxvZyk7CisgICAgfQogCi12YXIgaGFuZGxlYmFyc0dl
dCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0OworICAgIGZ1bmN0aW9uIGRlYnVnU3RhdGUoc3RhdGUp
IHsKKyAgICAgIHJldHVybiBzdGF0ZS5uZXh0U3RhdGVzLm1hcChmdW5jdGlvbihuKSB7CisgICAg
ICAgIGlmIChuLm5leHRTdGF0ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiAiKCAiICsgbi5kZWJ1
ZygpICsgIiBbYWNjZXB0aW5nXSApIjsgfQorICAgICAgICByZXR1cm4gIiggIiArIG4uZGVidWco
KSArICIgPHRoZW4+ICIgKyBuLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMu
ZGVidWcoKSB9KS5qb2luKCIgb3IgIikgKyAiICkiOworICAgICAgfSkuam9pbigiLCAiKQorICAg
IH0KKyAgICBFTkQgSUYgKiovCiAKLS8qKgotICBgdW5ib3VuZGAgYWxsb3dzIHlvdSB0byBvdXRw
dXQgYSBwcm9wZXJ0eSB3aXRob3V0IGJpbmRpbmcuICpJbXBvcnRhbnQ6KiBUaGUKLSAgb3V0cHV0
IHdpbGwgbm90IGJlIHVwZGF0ZWQgaWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFVzZSB3aXRoIGNh
dXRpb24uCisgICAgLy8gVGhpcyBpcyBhIHNvbWV3aGF0IG5haXZlIHN0cmF0ZWd5LCBidXQgc2hv
dWxkIHdvcmsgaW4gYSBsb3Qgb2YgY2FzZXMKKyAgICAvLyBBIGJldHRlciBzdHJhdGVneSB3b3Vs
ZCBwcm9wZXJseSByZXNvbHZlIC9wb3N0cy86aWQvbmV3IGFuZCAvcG9zdHMvZWRpdC86aWQKKyAg
ICBmdW5jdGlvbiBzb3J0U29sdXRpb25zKHN0YXRlcykgeworICAgICAgcmV0dXJuIHN0YXRlcy5z
b3J0KGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgICAgaWYgKGEudHlwZXMuc3RhcnMgIT09IGIudHlw
ZXMuc3RhcnMpIHsgcmV0dXJuIGEudHlwZXMuc3RhcnMgLSBiLnR5cGVzLnN0YXJzOyB9CisgICAg
ICAgIGlmIChhLnR5cGVzLmR5bmFtaWNzICE9PSBiLnR5cGVzLmR5bmFtaWNzKSB7IHJldHVybiBh
LnR5cGVzLmR5bmFtaWNzIC0gYi50eXBlcy5keW5hbWljczsgfQorICAgICAgICBpZiAoYS50eXBl
cy5zdGF0aWNzICE9PSBiLnR5cGVzLnN0YXRpY3MpIHsgcmV0dXJuIGIudHlwZXMuc3RhdGljcyAt
IGEudHlwZXMuc3RhdGljczsgfQogCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGRpdj57e3VuYm91bmQg
c29tZVByb3BlcnR5VGhhdERvZXNudENoYW5nZX19PC9kaXY+Ci0gIGBgYAorICAgICAgICByZXR1
cm4gMDsKKyAgICAgIH0pOworICAgIH0KIAotICBgdW5ib3VuZGAgY2FuIGFsc28gYmUgdXNlZCBp
biBjb25qdW5jdGlvbiB3aXRoIGEgYm91bmQgaGVscGVyIHRvCi0gIHJlbmRlciBpdCBpbiBpdHMg
dW5ib3VuZCBmb3JtOgorICAgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3RhdGVzLCBjaGFyKSB7
CisgICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOwogCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGRpdj57
e3VuYm91bmQgaGVscGVyTmFtZSBzb21lUHJvcGVydHlUaGF0RG9lc250Q2hhbmdlfX08L2Rpdj4K
LSAgYGBgCisgICAgICBmb3IgKHZhciBpPTAsIGw9c3RhdGVzLmxlbmd0aDsgaTxsOyBpKyspIHsK
KyAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOwogCi0gIEBtZXRob2QgdW5ib3VuZAotICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkK
LSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVn
aXN0ZXJIZWxwZXIoJ3VuYm91bmQnLCBmdW5jdGlvbihwcm9wZXJ0eSwgZm4pIHsKLSAgdmFyIG9w
dGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLCBoZWxwZXIsIGNvbnRleHQs
IG91dDsKKyAgICAgICAgbmV4dFN0YXRlcyA9IG5leHRTdGF0ZXMuY29uY2F0KHN0YXRlLm1hdGNo
KGNoYXIpKTsKKyAgICAgIH0KIAotICBpZihhcmd1bWVudHMubGVuZ3RoID4gMikgewotICAgIC8v
IFVuYm91bmQgaGVscGVyIGNhbGwuCi0gICAgb3B0aW9ucy5kYXRhLmlzVW5ib3VuZCA9IHRydWU7
Ci0gICAgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzW2FyZ3VtZW50c1swXV0gfHwg
RW1iZXIuSGFuZGxlYmFycy5oZWxwZXJNaXNzaW5nOwotICAgIG91dCA9IGhlbHBlci5hcHBseSh0
aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgCi0gICAgZGVs
ZXRlIG9wdGlvbnMuZGF0YS5pc1VuYm91bmQ7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQorICAgICAg
cmV0dXJuIG5leHRTdGF0ZXM7CisgICAgfQogCi0gIGNvbnRleHQgPSAoZm4uY29udGV4dHMgJiYg
Zm4uY29udGV4dHNbMF0pIHx8IHRoaXM7Ci0gIHJldHVybiBoYW5kbGViYXJzR2V0KGNvbnRleHQs
IHByb3BlcnR5LCBmbik7Ci19KTsKKyAgICBmdW5jdGlvbiBmaW5kSGFuZGxlcihzdGF0ZSwgcGF0
aCwgcXVlcnlQYXJhbXMpIHsKKyAgICAgIHZhciBoYW5kbGVycyA9IHN0YXRlLmhhbmRsZXJzLCBy
ZWdleCA9IHN0YXRlLnJlZ2V4OworICAgICAgdmFyIGNhcHR1cmVzID0gcGF0aC5tYXRjaChyZWdl
eCksIGN1cnJlbnRDYXB0dXJlID0gMTsKKyAgICAgIHZhciByZXN1bHQgPSBbXTsKIAotfSkoKTsK
KyAgICAgIGZvciAodmFyIGk9MCwgbD1oYW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAg
ICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbaV0sIG5hbWVzID0gaGFuZGxlci5uYW1lcywgcGFy
YW1zID0ge30sCisgICAgICAgICAgd2F0Y2hlZFF1ZXJ5UGFyYW1zID0gaGFuZGxlci5xdWVyeVBh
cmFtcyB8fCBbXSwKKyAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtcyA9IHt9LAorICAgICAgICAg
IGosIG07CiAKKyAgICAgICAgZm9yIChqPTAsIG09bmFtZXMubGVuZ3RoOyBqPG07IGorKykgewor
ICAgICAgICAgIHBhcmFtc1tuYW1lc1tqXV0gPSBjYXB0dXJlc1tjdXJyZW50Q2FwdHVyZSsrXTsK
KyAgICAgICAgfQorICAgICAgICBmb3IgKGo9MCwgbT13YXRjaGVkUXVlcnlQYXJhbXMubGVuZ3Ro
OyBqIDwgbTsgaisrKSB7CisgICAgICAgICAgdmFyIGtleSA9IHdhdGNoZWRRdWVyeVBhcmFtc1tq
XTsKKyAgICAgICAgICBpZihxdWVyeVBhcmFtc1trZXldKXsKKyAgICAgICAgICAgIGFjdGl2ZVF1
ZXJ5UGFyYW1zW2tleV0gPSBxdWVyeVBhcmFtc1trZXldOworICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICB2YXIgY3VycmVudFJlc3VsdCA9IHsgaGFuZGxlcjogaGFuZGxlci5oYW5kbGVy
LCBwYXJhbXM6IHBhcmFtcywgaXNEeW5hbWljOiAhIW5hbWVzLmxlbmd0aCB9OworICAgICAgICBp
Zih3YXRjaGVkUXVlcnlQYXJhbXMgJiYgd2F0Y2hlZFF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHsK
KyAgICAgICAgICBjdXJyZW50UmVzdWx0LnF1ZXJ5UGFyYW1zID0gYWN0aXZlUXVlcnlQYXJhbXM7
CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudFJlc3VsdCk7CisgICAgICB9
CiAKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0oZnVuY3Rpb24oKSB7Ci0vKmpzaGlu
dCBkZWJ1Zzp0cnVlKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5k
bGViYXJzCi0qLworICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50
KSB7CisgICAgICBzZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIpIHsKKyAgICAgICAgdmFy
IHN0YXRlOwogCi12YXIgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0LCBub3Jt
YWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoOworICAgICAgICBjdXJy
ZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0KGNoYXIpOworICAgICAgfSk7CiAKLS8qKgotICBg
bG9nYCBhbGxvd3MgeW91IHRvIG91dHB1dCB0aGUgdmFsdWUgb2YgYSB2YWx1ZSBpbiB0aGUgY3Vy
cmVudCByZW5kZXJpbmcKLSAgY29udGV4dC4KKyAgICAgIHJldHVybiBjdXJyZW50U3RhdGU7Cisg
ICAgfQogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tsb2cgbXlWYXJpYWJsZX19Ci0gIGBgYAorICAg
IC8vIFRoZSBtYWluIGludGVyZmFjZQogCi0gIEBtZXRob2QgbG9nCi0gIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQotKi8KLUVtYmVyLkhh
bmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKHByb3BlcnR5LCBvcHRpb25z
KSB7Ci0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0
c1swXSkgfHwgdGhpcywKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRleHQs
IHByb3BlcnR5LCBvcHRpb25zLmRhdGEpLAotICAgICAgcGF0aFJvb3QgPSBub3JtYWxpemVkLnJv
b3QsCi0gICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoLAotICAgICAgdmFsdWUgPSAocGF0aCA9
PT0gJ3RoaXMnKSA/IHBhdGhSb290IDogaGFuZGxlYmFyc0dldChwYXRoUm9vdCwgcGF0aCwgb3B0
aW9ucyk7Ci0gIEVtYmVyLkxvZ2dlci5sb2codmFsdWUpOwotfSk7CisgICAgdmFyIFJvdXRlUmVj
b2duaXplciA9IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5yb290U3RhdGUgPSBuZXcgU3RhdGUo
KTsKKyAgICAgIHRoaXMubmFtZXMgPSB7fTsKKyAgICB9OwogCi0vKioKLSAgRXhlY3V0ZSB0aGUg
YGRlYnVnZ2VyYCBzdGF0ZW1lbnQgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KIAotICBgYGBoYW5k
bGViYXJzCi0gIHt7ZGVidWdnZXJ9fQotICBgYGAKKyAgICBSb3V0ZVJlY29nbml6ZXIucHJvdG90
eXBlID0geworICAgICAgYWRkOiBmdW5jdGlvbihyb3V0ZXMsIG9wdGlvbnMpIHsKKyAgICAgICAg
dmFyIGN1cnJlbnRTdGF0ZSA9IHRoaXMucm9vdFN0YXRlLCByZWdleCA9ICJeIiwKKyAgICAgICAg
ICAgIHR5cGVzID0geyBzdGF0aWNzOiAwLCBkeW5hbWljczogMCwgc3RhcnM6IDAgfSwKKyAgICAg
ICAgICAgIGhhbmRsZXJzID0gW10sIGFsbFNlZ21lbnRzID0gW10sIG5hbWU7CiAKLSAgQG1ldGhv
ZCBkZWJ1Z2dlcgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0
cmluZ30gcHJvcGVydHkKLSovCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdkZWJ1
Z2dlcicsIGZ1bmN0aW9uKCkgewotICBkZWJ1Z2dlcjsKLX0pOworICAgICAgICB2YXIgaXNFbXB0
eSA9IHRydWU7CiAKLX0pKCk7CisgICAgICAgIGZvciAodmFyIGk9MCwgbD1yb3V0ZXMubGVuZ3Ro
OyBpPGw7IGkrKykgeworICAgICAgICAgIHZhciByb3V0ZSA9IHJvdXRlc1tpXSwgbmFtZXMgPSBb
XTsKIAorICAgICAgICAgIHZhciBzZWdtZW50cyA9IHBhcnNlKHJvdXRlLnBhdGgsIG5hbWVzLCB0
eXBlcyk7CiAKKyAgICAgICAgICBhbGxTZWdtZW50cyA9IGFsbFNlZ21lbnRzLmNvbmNhdChzZWdt
ZW50cyk7CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1oYW5kbGViYXJzCi0qLworICAgICAgICAgIGZvciAodmFyIGo9MCwgbT1zZWdtZW50cy5s
ZW5ndGg7IGo8bTsgaisrKSB7CisgICAgICAgICAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2pd
OwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisgICAgICAgICAgICBp
ZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVwc2lsb25TZWdtZW50KSB7IGNvbnRpbnVlOyB9CiAKLUVt
YmVyLkhhbmRsZWJhcnMuRWFjaFZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRlbmQoRW1i
ZXIuX01ldGFtb3JwaCwgewotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaXRlbUNvbnRy
b2xsZXIgPSBnZXQodGhpcywgJ2l0ZW1Db250cm9sbGVyJyk7Ci0gICAgdmFyIGJpbmRpbmc7Cisg
ICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAKLSAgICBpZiAoaXRlbUNvbnRyb2xsZXIpIHsK
LSAgICAgIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSgpOwot
ICAgICAgc2V0KGNvbnRyb2xsZXIsICdpdGVtQ29udHJvbGxlcicsIGl0ZW1Db250cm9sbGVyKTsK
LSAgICAgIHNldChjb250cm9sbGVyLCAnY29udGFpbmVyJywgZ2V0KHRoaXMsICdjb250cm9sbGVy
LmNvbnRhaW5lcicpKTsKLSAgICAgIHNldChjb250cm9sbGVyLCAnX2VhY2hWaWV3JywgdGhpcyk7
Ci0gICAgICBzZXQoY29udHJvbGxlciwgJ3RhcmdldCcsIGdldCh0aGlzLCAnY29udHJvbGxlcicp
KTsKKyAgICAgICAgICAgIC8vIEFkZCBhICIvIiBmb3IgdGhlIG5ldyBzZWdtZW50CisgICAgICAg
ICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0KHsgdmFsaWRDaGFyczogIi8iIH0p
OworICAgICAgICAgICAgcmVnZXggKz0gIi8iOwogCi0gICAgICB0aGlzLmRpc2FibGVDb250ZW50
T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewotICAgICAgICBzZXQodGhpcywgJ2NvbnRlbnQnLCBjb250
cm9sbGVyKTsKLSAgICAgICAgYmluZGluZyA9IG5ldyBFbWJlci5CaW5kaW5nKCdjb250ZW50Jywg
J19lYWNoVmlldy5kYXRhU291cmNlJykub25lV2F5KCk7Ci0gICAgICAgIGJpbmRpbmcuY29ubmVj
dChjb250cm9sbGVyKTsKLSAgICAgIH0pOworICAgICAgICAgICAgLy8gQWRkIGEgcmVwcmVzZW50
YXRpb24gb2YgdGhlIHNlZ21lbnQgdG8gdGhlIE5GQSBhbmQgcmVnZXgKKyAgICAgICAgICAgIGN1
cnJlbnRTdGF0ZSA9IGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KTsKKyAgICAgICAg
ICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKKyAgICAgICAgICB9CiAKLSAgICAgIHNldCh0
aGlzLCAnX2FycmF5Q29udHJvbGxlcicsIGNvbnRyb2xsZXIpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICB0aGlzLmRpc2FibGVDb250ZW50T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewotICAgICAgICBiaW5k
aW5nID0gbmV3IEVtYmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnZGF0YVNvdXJjZScpLm9uZVdheSgp
OwotICAgICAgICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7Ci0gICAgICB9KTsKLSAgICB9CisgICAg
ICAgICAgdmFyIGhhbmRsZXIgPSB7IGhhbmRsZXI6IHJvdXRlLmhhbmRsZXIsIG5hbWVzOiBuYW1l
cyB9OworICAgICAgICAgIGlmKHJvdXRlLnF1ZXJ5UGFyYW1zKSB7CisgICAgICAgICAgICBoYW5k
bGVyLnF1ZXJ5UGFyYW1zID0gcm91dGUucXVlcnlQYXJhbXM7CisgICAgICAgICAgfQorICAgICAg
ICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcik7CisgICAgICAgIH0KIAotICAgIHJldHVybiB0aGlz
Ll9zdXBlcigpOwotICB9LAorICAgICAgICBpZiAoaXNFbXB0eSkgeworICAgICAgICAgIGN1cnJl
bnRTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5wdXQoeyB2YWxpZENoYXJzOiAiLyIgfSk7CisgICAgICAg
ICAgcmVnZXggKz0gIi8iOworICAgICAgICB9CiAKLSAgZGlzYWJsZUNvbnRlbnRPYnNlcnZlcnM6
IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIodGhp
cywgJ2NvbnRlbnQnLCBudWxsLCAnX2NvbnRlbnRXaWxsQ2hhbmdlJyk7Ci0gICAgRW1iZXIucmVt
b3ZlT2JzZXJ2ZXIodGhpcywgJ2NvbnRlbnQnLCBudWxsLCAnX2NvbnRlbnREaWRDaGFuZ2UnKTsK
KyAgICAgICAgY3VycmVudFN0YXRlLmhhbmRsZXJzID0gaGFuZGxlcnM7CisgICAgICAgIGN1cnJl
bnRTdGF0ZS5yZWdleCA9IG5ldyBSZWdFeHAocmVnZXggKyAiJCIpOworICAgICAgICBjdXJyZW50
U3RhdGUudHlwZXMgPSB0eXBlczsKIAotICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMpOworICAgICAg
ICBpZiAobmFtZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hcykgeworICAgICAgICAgIHRoaXMubmFt
ZXNbbmFtZV0gPSB7CisgICAgICAgICAgICBzZWdtZW50czogYWxsU2VnbWVudHMsCisgICAgICAg
ICAgICBoYW5kbGVyczogaGFuZGxlcnMKKyAgICAgICAgICB9OworICAgICAgICB9CisgICAgICB9
LAogCi0gICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcywgJ2NvbnRlbnQnLCBudWxsLCAn
X2NvbnRlbnRXaWxsQ2hhbmdlJyk7Ci0gICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgJ2NvbnRl
bnQnLCBudWxsLCAnX2NvbnRlbnREaWRDaGFuZ2UnKTsKLSAgfSwKKyAgICAgIGhhbmRsZXJzRm9y
OiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0s
IHJlc3VsdCA9IFtdOworICAgICAgICBpZiAoIXJvdXRlKSB7IHRocm93IG5ldyBFcnJvcigiVGhl
cmUgaXMgbm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOyB9CiAKLSAgaXRlbVZpZXdDbGFzczogRW1i
ZXIuX01ldGFtb3JwaFZpZXcsCi0gIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmll
dywKKyAgICAgICAgZm9yICh2YXIgaT0wLCBsPXJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaTxsOyBp
KyspIHsKKyAgICAgICAgICByZXN1bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7CisgICAgICAg
IH0KIAotICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7Ci0gICAgdmll
dyA9IHRoaXMuX3N1cGVyKHZpZXcsIGF0dHJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICAgIH0sCiAKLSAgICAvLyBBdCB0aGUgbW9tZW50LCBpZiBhIGNvbnRhaW5lciB2aWV3IHN1YmNs
YXNzIHdhbnRzCi0gICAgLy8gdG8gaW5zZXJ0IGtleXdvcmRzLCBpdCBpcyByZXNwb25zaWJsZSBm
b3IgY2xvbmluZwotICAgIC8vIHRoZSBrZXl3b3JkcyBoYXNoLiBUaGlzIHdpbGwgYmUgZml4ZWQg
bW9tZW50YXJpbHkuCi0gICAgdmFyIGtleXdvcmQgPSBnZXQodGhpcywgJ2tleXdvcmQnKTsKLSAg
ICB2YXIgY29udGVudCA9IGdldCh2aWV3LCAnY29udGVudCcpOworICAgICAgaGFzUm91dGU6IGZ1
bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKKyAgICAg
IH0sCiAKLSAgICBpZiAoa2V5d29yZCkgewotICAgICAgdmFyIGRhdGEgPSBnZXQodmlldywgJ3Rl
bXBsYXRlRGF0YScpOworICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5hbWUsIHBhcmFtcykgewor
ICAgICAgICB2YXIgcm91dGUgPSB0aGlzLm5hbWVzW25hbWVdLCBvdXRwdXQgPSAiIjsKKyAgICAg
ICAgaWYgKCFyb3V0ZSkgeyB0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGlzIG5vIHJvdXRlIG5hbWVk
ICIgKyBuYW1lKTsgfQogCi0gICAgICBkYXRhID0gRW1iZXIuY29weShkYXRhKTsKLSAgICAgIGRh
dGEua2V5d29yZHMgPSB2aWV3LmNsb25lS2V5d29yZHMoKTsKLSAgICAgIHNldCh2aWV3LCAndGVt
cGxhdGVEYXRhJywgZGF0YSk7CisgICAgICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNlZ21lbnRz
OwogCi0gICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGRvIG5vdCBiaW5kLCBiZWNhdXNlIHRoZSBg
Y29udGVudGAgb2YKLSAgICAgIC8vIGEgI2VhY2ggaXRlbSBjYW5ub3QgY2hhbmdlLgotICAgICAg
ZGF0YS5rZXl3b3Jkc1trZXl3b3JkXSA9IGNvbnRlbnQ7Ci0gICAgfQorICAgICAgICBmb3IgKHZh
ciBpPTAsIGw9c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICAgIHZhciBzZWdt
ZW50ID0gc2VnbWVudHNbaV07CiAKLSAgICAvLyBJZiB7eyNlYWNofX0gaXMgbG9vcGluZyBvdmVy
IGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzLAotICAgIC8vIHBvaW50IGVhY2ggY2hpbGQgdmlldyBh
dCB0aGVpciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCi0gICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNv
bnRlbnQsICdpc0NvbnRyb2xsZXInKSkgewotICAgICAgc2V0KHZpZXcsICdjb250cm9sbGVyJywg
Y29udGVudCk7Ci0gICAgfQorICAgICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgRXBzaWxv
blNlZ21lbnQpIHsgY29udGludWU7IH0KIAotICAgIHJldHVybiB2aWV3OwotICB9LAorICAgICAg
ICAgIG91dHB1dCArPSAiLyI7CisgICAgICAgICAgb3V0cHV0ICs9IHNlZ21lbnQuZ2VuZXJhdGUo
cGFyYW1zKTsKKyAgICAgICAgfQogCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB2
YXIgYXJyYXlDb250cm9sbGVyID0gZ2V0KHRoaXMsICdfYXJyYXlDb250cm9sbGVyJyk7CisgICAg
ICAgIGlmIChvdXRwdXQuY2hhckF0KDApICE9PSAnLycpIHsgb3V0cHV0ID0gJy8nICsgb3V0cHV0
OyB9CiAKLSAgICBpZiAoYXJyYXlDb250cm9sbGVyKSB7Ci0gICAgICBhcnJheUNvbnRyb2xsZXIu
ZGVzdHJveSgpOwotICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMucXVlcnlQYXJh
bXMpIHsKKyAgICAgICAgICBvdXRwdXQgKz0gdGhpcy5nZW5lcmF0ZVF1ZXJ5U3RyaW5nKHBhcmFt
cy5xdWVyeVBhcmFtcywgcm91dGUuaGFuZGxlcnMpOworICAgICAgICB9CiAKLSAgICByZXR1cm4g
dGhpcy5fc3VwZXIoKTsKLSAgfQotfSk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICB9
LAogCi12YXIgR3JvdXBlZEVhY2ggPSBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoID0gZnVu
Y3Rpb24oY29udGV4dCwgcGF0aCwgb3B0aW9ucykgewotICB2YXIgc2VsZiA9IHRoaXMsCi0gICAg
ICBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKGNvbnRleHQsIHBh
dGgsIG9wdGlvbnMuZGF0YSk7CisgICAgICBnZW5lcmF0ZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbihw
YXJhbXMsIGhhbmRsZXJzKSB7CisgICAgICAgIHZhciBwYWlycyA9IFtdLCBhbGxvd2VkUGFyYW1z
ID0gW107CisgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICB2YXIgY3VycmVudFBhcmFtTGlzdCA9IGhhbmRsZXJzW2ldLnF1ZXJ5UGFyYW1z
OworICAgICAgICAgIGlmKGN1cnJlbnRQYXJhbUxpc3QpIHsKKyAgICAgICAgICAgIGFsbG93ZWRQ
YXJhbXMucHVzaC5hcHBseShhbGxvd2VkUGFyYW1zLCBjdXJyZW50UGFyYW1MaXN0KTsKKyAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yKHZhciBrZXkgaW4gcGFyYW1zKSB7CisgICAg
ICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICBpZihh
bGxvd2VkUGFyYW1zLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsKKyAgICAgICAgICAgICAgdGhyb3cg
J1F1ZXJ5IHBhcmFtICInICsga2V5ICsgJyIgaXMgbm90IHNwZWNpZmllZCBhcyBhIHZhbGlkIHBh
cmFtIGZvciB0aGlzIHJvdXRlJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB2YWx1
ZSA9IHBhcmFtc1trZXldOworICAgICAgICAgICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25l
bnQoa2V5KTsKKyAgICAgICAgICAgIGlmKHZhbHVlICE9PSB0cnVlKSB7CisgICAgICAgICAgICAg
IHBhaXIgKz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHBhaXJzLnB1c2gocGFpcik7CisgICAgICAgICAgfQorICAgICAgICB9CiAK
LSAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgdGhpcy5wYXRoID0gcGF0aDsKLSAgdGhpcy5v
cHRpb25zID0gb3B0aW9uczsKLSAgdGhpcy50ZW1wbGF0ZSA9IG9wdGlvbnMuZm47Ci0gIHRoaXMu
Y29udGFpbmluZ1ZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgdGhpcy5ub3JtYWxpemVkUm9v
dCA9IG5vcm1hbGl6ZWQucm9vdDsKLSAgdGhpcy5ub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWQu
cGF0aDsKLSAgdGhpcy5jb250ZW50ID0gdGhpcy5sb29rdXBDb250ZW50KCk7CisgICAgICAgIGlm
IChwYWlycy5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9CiAKLSAgdGhpcy5hZGRDb250ZW50
T2JzZXJ2ZXJzKCk7Ci0gIHRoaXMuYWRkQXJyYXlPYnNlcnZlcnMoKTsKKyAgICAgICAgcmV0dXJu
ICI/IiArIHBhaXJzLmpvaW4oIiYiKTsKKyAgICAgIH0sCiAKLSAgdGhpcy5jb250YWluaW5nVmll
dy5vbignd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5kZXN0cm95KCk7
Ci0gIH0pOwotfTsKKyAgICAgIHBhcnNlUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKHF1ZXJ5U3RyaW5n
KSB7CisgICAgICAgIHZhciBwYWlycyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCImIiksIHF1ZXJ5UGFy
YW1zID0ge307CisgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICB2YXIgcGFpciAgICAgID0gcGFpcnNbaV0uc3BsaXQoJz0nKSwKKyAgICAgICAg
ICAgICAga2V5ICAgICAgID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pLAorICAgICAgICAg
ICAgICB2YWx1ZSAgICAgPSBwYWlyWzFdID8gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMV0pIDog
dHJ1ZTsKKyAgICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gdmFsdWU7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zOworICAgICAgfSwKIAotR3JvdXBlZEVhY2gucHJvdG90
eXBlID0gewotICBjb250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yZW1v
dmVBcnJheU9ic2VydmVycygpOwotICB9LAorICAgICAgcmVjb2duaXplOiBmdW5jdGlvbihwYXRo
KSB7CisgICAgICAgIHZhciBzdGF0ZXMgPSBbIHRoaXMucm9vdFN0YXRlIF0sCisgICAgICAgICAg
ICBwYXRoTGVuLCBpLCBsLCBxdWVyeVN0YXJ0LCBxdWVyeVBhcmFtcyA9IHt9OworCisgICAgICAg
IHF1ZXJ5U3RhcnQgPSBwYXRoLmluZGV4T2YoJz8nKTsKKyAgICAgICAgaWYgKHF1ZXJ5U3RhcnQg
IT09IC0xKSB7CisgICAgICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gcGF0aC5zdWJzdHIocXVlcnlT
dGFydCArIDEsIHBhdGgubGVuZ3RoKTsKKyAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMCwg
cXVlcnlTdGFydCk7CisgICAgICAgICAgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlUXVlcnlTdHJp
bmcocXVlcnlTdHJpbmcpOworICAgICAgICB9CiAKLSAgY29udGVudERpZENoYW5nZTogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5jb250ZW50ID0gdGhpcy5sb29rdXBDb250ZW50KCk7Ci0gICAgdGhp
cy5hZGRBcnJheU9ic2VydmVycygpOwotICAgIHRoaXMucmVyZW5kZXJDb250YWluaW5nVmlldygp
OwotICB9LAorICAgICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCiAKLSAgY29udGVudEFycmF5V2ls
bENoYW5nZTogRW1iZXIuSywKKyAgICAgICAgaWYgKHBhdGguY2hhckF0KDApICE9PSAiLyIpIHsg
cGF0aCA9ICIvIiArIHBhdGg7IH0KIAotICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMucmVyZW5kZXJDb250YWluaW5nVmlldygpOwotICB9LAorICAgICAgICBw
YXRoTGVuID0gcGF0aC5sZW5ndGg7CisgICAgICAgIGlmIChwYXRoTGVuID4gMSAmJiBwYXRoLmNo
YXJBdChwYXRoTGVuIC0gMSkgPT09ICIvIikgeworICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0
cigwLCBwYXRoTGVuIC0gMSk7CisgICAgICAgIH0KIAotICBsb29rdXBDb250ZW50OiBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXQodGhpcy5ub3JtYWxpemVkUm9v
dCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcy5vcHRpb25zKTsKLSAgfSwKKyAgICAgICAgZm9y
IChpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgICAgc3RhdGVzID0gcmVj
b2duaXplQ2hhcihzdGF0ZXMsIHBhdGguY2hhckF0KGkpKTsKKyAgICAgICAgICBpZiAoIXN0YXRl
cy5sZW5ndGgpIHsgYnJlYWs7IH0KKyAgICAgICAgfQogCi0gIGFkZEFycmF5T2JzZXJ2ZXJzOiBm
dW5jdGlvbigpIHsKLSAgICB0aGlzLmNvbnRlbnQuYWRkQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0g
ICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICBkaWRDaGFu
Z2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0gIH0sCisgICAgICAgIC8vIEVO
RCBERUJVRyBHUk9VUAogCi0gIHJlbW92ZUFycmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLmNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICB3aWxsQ2hh
bmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICBkaWRDaGFuZ2U6ICdjb250ZW50
QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0gIH0sCisgICAgICAgIHZhciBzb2x1dGlvbnMgPSBb
XTsKKyAgICAgICAgZm9yIChpPTAsIGw9c3RhdGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAg
ICAgICBpZiAoc3RhdGVzW2ldLmhhbmRsZXJzKSB7IHNvbHV0aW9ucy5wdXNoKHN0YXRlc1tpXSk7
IH0KKyAgICAgICAgfQogCi0gIGFkZENvbnRlbnRPYnNlcnZlcnM6IGZ1bmN0aW9uKCkgewotICAg
IEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMubm9ybWFsaXplZFJvb3QsIHRoaXMubm9ybWFs
aXplZFBhdGgsIHRoaXMsIHRoaXMuY29udGVudFdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLmFkZE9i
c2VydmVyKHRoaXMubm9ybWFsaXplZFJvb3QsIHRoaXMubm9ybWFsaXplZFBhdGgsIHRoaXMsIHRo
aXMuY29udGVudERpZENoYW5nZSk7Ci0gIH0sCisgICAgICAgIHN0YXRlcyA9IHNvcnRTb2x1dGlv
bnMoc29sdXRpb25zKTsKIAotICByZW1vdmVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsK
LSAgICBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlz
Lm5vcm1hbGl6ZWRQYXRoLCB0aGlzLmNvbnRlbnRXaWxsQ2hhbmdlKTsKLSAgICBFbWJlci5yZW1v
dmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlz
LmNvbnRlbnREaWRDaGFuZ2UpOwotICB9LAorICAgICAgICB2YXIgc3RhdGUgPSBzb2x1dGlvbnNb
MF07CiAKLSAgcmVuZGVyOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9IHRoaXMuY29u
dGVudCwKLSAgICAgICAgY29udGVudExlbmd0aCA9IGdldChjb250ZW50LCAnbGVuZ3RoJyksCi0g
ICAgICAgIGRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YSwKLSAgICAgICAgdGVtcGxhdGUgPSB0aGlz
LnRlbXBsYXRlOworICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKKyAgICAg
ICAgICByZXR1cm4gZmluZEhhbmRsZXIoc3RhdGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKTsKKyAgICAg
ICAgfQorICAgICAgfQorICAgIH07CiAKLSAgICBkYXRhLmluc2lkZUVhY2ggPSB0cnVlOwotICAg
IGZvciAodmFyIGkgPSAwOyBpIDwgY29udGVudExlbmd0aDsgaSsrKSB7Ci0gICAgICB0ZW1wbGF0
ZShjb250ZW50Lm9iamVjdEF0KGkpLCB7IGRhdGE6IGRhdGEgfSk7CisgICAgZnVuY3Rpb24gVGFy
Z2V0KHBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKSB7CisgICAgICB0aGlzLnBhdGggPSBwYXRoOwor
ICAgICAgdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKKyAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxl
Z2F0ZTsKICAgICB9Ci0gIH0sCi0KLSAgcmVyZW5kZXJDb250YWluaW5nVmlldzogZnVuY3Rpb24o
KSB7Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcy5jb250YWluaW5n
VmlldywgJ3JlcmVuZGVyJyk7Ci0gIH0sCiAKLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5yZW1vdmVDb250ZW50T2JzZXJ2ZXJzKCk7Ci0gICAgdGhpcy5yZW1vdmVBcnJheU9ic2Vy
dmVycygpOwotICB9Ci19OworICAgIFRhcmdldC5wcm90b3R5cGUgPSB7CisgICAgICB0bzogZnVu
Y3Rpb24odGFyZ2V0LCBjYWxsYmFjaykgeworICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aGlzLmRl
bGVnYXRlOwogCi0vKioKLSAgVGhlIGB7eyNlYWNofX1gIGhlbHBlciBsb29wcyBvdmVyIGVsZW1l
bnRzIGluIGEgY29sbGVjdGlvbiwgcmVuZGVyaW5nIGl0cwotICBibG9jayBvbmNlIGZvciBlYWNo
IGl0ZW0uIEl0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBIYW5kbGViYXJzIGB7eyNlYWNo
fX1gCi0gIGhlbHBlcjoKKyAgICAgICAgaWYgKGRlbGVnYXRlICYmIGRlbGVnYXRlLndpbGxBZGRS
b3V0ZSkgeworICAgICAgICAgIHRhcmdldCA9IGRlbGVnYXRlLndpbGxBZGRSb3V0ZSh0aGlzLm1h
dGNoZXIudGFyZ2V0LCB0YXJnZXQpOworICAgICAgICB9CiAKLSAgYGBgamF2YXNjcmlwdAotICBE
ZXZlbG9wZXJzID0gW3tuYW1lOiAnWWVodWRhJ30se25hbWU6ICdUb20nfSwge25hbWU6ICdQYXVs
J31dOwotICBgYGAKKyAgICAgICAgdGhpcy5tYXRjaGVyLmFkZCh0aGlzLnBhdGgsIHRhcmdldCk7
CiAKLSAgYGBgaGFuZGxlYmFycwotICB7eyNlYWNoIERldmVsb3BlcnN9fQotICAgIHt7bmFtZX19
Ci0gIHt7L2VhY2h9fQotICBgYGAKKyAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAg
aWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IGhh
dmUgYW4gYXJndW1lbnQgaW4gdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgdG9gIik7IH0KKyAgICAg
ICAgICB0aGlzLm1hdGNoZXIuYWRkQ2hpbGQodGhpcy5wYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCB0
aGlzLmRlbGVnYXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0s
CiAKLSAgYHt7ZWFjaH19YCBzdXBwb3J0cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVt
ZW50IG5hbWluZzoKKyAgICAgIHdpdGhRdWVyeVBhcmFtczogZnVuY3Rpb24oKSB7CisgICAgICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7IHRocm93IG5ldyBFcnJvcigieW91IG11c3Qg
cHJvdmlkZSBhcmd1bWVudHMgdG8gdGhlIHdpdGhRdWVyeVBhcmFtcyBtZXRob2QiKTsgfQorICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAg
ICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSAic3RyaW5nIikgeworICAgICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCd5b3Ugc2hvdWxkIGNhbGwgd2l0aFF1ZXJ5UGFyYW1zIHdpdGggYSBs
aXN0IG9mIHN0cmluZ3MsIGUuZy4gd2l0aFF1ZXJ5UGFyYW1zKCJmb28iLCAiYmFyIiknKTsKKyAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gW10uc2xpY2Uu
Y2FsbChhcmd1bWVudHMpOworICAgICAgICB0aGlzLm1hdGNoZXIuYWRkUXVlcnlQYXJhbXModGhp
cy5wYXRoLCBxdWVyeVBhcmFtcyk7CisgICAgICB9CisgICAgfTsKIAotICBgYGBoYW5kbGViYXJz
Ci0gIHt7I2VhY2ggcGVyc29uIGluIERldmVsb3BlcnN9fQotICAgIHt7cGVyc29uLm5hbWV9fQot
ICB7ey9lYWNofX0KLSAgYGBgCisgICAgZnVuY3Rpb24gTWF0Y2hlcih0YXJnZXQpIHsKKyAgICAg
IHRoaXMucm91dGVzID0ge307CisgICAgICB0aGlzLmNoaWxkcmVuID0ge307CisgICAgICB0aGlz
LnF1ZXJ5UGFyYW1zID0ge307CisgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgICB9CiAK
LSAgV2hlbiBsb29waW5nIG92ZXIgb2JqZWN0cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMs
IGB7e3RoaXN9fWAgY2FuIGJlIHVzZWQKLSAgdG8gcmVuZGVyIHRoZSBvYmplY3Q6CisgICAgTWF0
Y2hlci5wcm90b3R5cGUgPSB7CisgICAgICBhZGQ6IGZ1bmN0aW9uKHBhdGgsIGhhbmRsZXIpIHsK
KyAgICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOworICAgICAgfSwKIAotICBgYGBq
YXZhc2NyaXB0Ci0gIERldmVsb3Blck5hbWVzID0gWydZZWh1ZGEnLCAnVG9tJywgJ1BhdWwnXQot
ICBgYGAKKyAgICAgIGFkZFF1ZXJ5UGFyYW1zOiBmdW5jdGlvbihwYXRoLCBwYXJhbXMpIHsKKyAg
ICAgICAgdGhpcy5xdWVyeVBhcmFtc1twYXRoXSA9IHBhcmFtczsKKyAgICAgIH0sCiAKLSAgYGBg
aGFuZGxlYmFycwotICB7eyNlYWNoIERldmVsb3Blck5hbWVzfX0KLSAgICB7e3RoaXN9fQotICB7
ey9lYWNofX0KLSAgYGBgCi0gICMjIyB7e2Vsc2V9fSBjb25kaXRpb24KLSAgYHt7I2VhY2h9fWAg
Y2FuIGhhdmUgYSBtYXRjaGluZyBge3tlbHNlfX1gLiBUaGUgY29udGVudHMgb2YgdGhpcyBibG9j
ayB3aWxsIHJlbmRlcgotICBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4KKyAgICAgIGFkZENo
aWxkOiBmdW5jdGlvbihwYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCBkZWxlZ2F0ZSkgeworICAgICAg
ICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7CisgICAgICAgIHRoaXMuY2hpbGRy
ZW5bcGF0aF0gPSBtYXRjaGVyOwogCi0gIGBgYAotICB7eyNlYWNoIHBlcnNvbiBpbiBEZXZlbG9w
ZXJzfX0KLSAgICB7e3BlcnNvbi5uYW1lfX0KLSAge3tlbHNlfX0KLSAgICA8cD5Tb3JyeSwgbm9i
b2R5IGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0YXNrLjwvcD4KLSAge3svZWFjaH19Ci0gIGBgYAot
ICAjIyMgU3BlY2lmeWluZyBhIFZpZXcgY2xhc3MgZm9yIGl0ZW1zCi0gIElmIHlvdSBwcm92aWRl
IGFuIGBpdGVtVmlld0NsYXNzYCBvcHRpb24gdGhhdCByZWZlcmVuY2VzIGEgdmlldyBjbGFzcwot
ICB3aXRoIGl0cyBvd24gYHRlbXBsYXRlYCB5b3UgY2FuIG9taXQgdGhlIGJsb2NrLgorICAgICAg
ICB2YXIgbWF0Y2ggPSBnZW5lcmF0ZU1hdGNoKHBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKTsKIAot
ICBUaGUgZm9sbG93aW5nIHRlbXBsYXRlOgorICAgICAgICBpZiAoZGVsZWdhdGUgJiYgZGVsZWdh
dGUuY29udGV4dEVudGVyZWQpIHsKKyAgICAgICAgICBkZWxlZ2F0ZS5jb250ZXh0RW50ZXJlZCh0
YXJnZXQsIG1hdGNoKTsKKyAgICAgICAgfQogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjdmlldyBB
cHAuTXlWaWV3IH19Ci0gICAge3tlYWNoIHZpZXcuaXRlbXMgaXRlbVZpZXdDbGFzcz0iQXBwLkFu
SXRlbVZpZXcifX0gCi0gIHt7L3ZpZXd9fQotICBgYGAKKyAgICAgICAgY2FsbGJhY2sobWF0Y2gp
OworICAgICAgfQorICAgIH07CiAKLSAgQW5kIGFwcGxpY2F0aW9uIGNvZGUKKyAgICBmdW5jdGlv
biBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKKyAgICAg
IHJldHVybiBmdW5jdGlvbihwYXRoLCBuZXN0ZWRDYWxsYmFjaykgeworICAgICAgICB2YXIgZnVs
bFBhdGggPSBzdGFydGluZ1BhdGggKyBwYXRoOwogCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwID0g
RW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBNeVZpZXc6IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKLSAgICAgIGl0ZW1zOiBbCi0gICAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdE
YXZlJ30pLAotICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnTWFyeSd9KSwKLSAg
ICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKLSAgICAgIF0KLSAgICB9
KQotICB9KTsKKyAgICAgICAgaWYgKG5lc3RlZENhbGxiYWNrKSB7CisgICAgICAgICAgbmVzdGVk
Q2FsbGJhY2soZ2VuZXJhdGVNYXRjaChmdWxsUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldChzdGFydGluZ1BhdGgg
KyBwYXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQog
Ci0gIEFwcC5Bbkl0ZW1WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHRlbXBsYXRlOiBF
bWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkdyZWV0aW5ncyB7e25hbWV9fSIpCi0gIH0pOwotICBg
YGAKKyAgICBmdW5jdGlvbiBhZGRSb3V0ZShyb3V0ZUFycmF5LCBwYXRoLCBoYW5kbGVyLCBxdWVy
eVBhcmFtcykgeworICAgICAgdmFyIGxlbiA9IDA7CisgICAgICBmb3IgKHZhciBpPTAsIGw9cm91
dGVBcnJheS5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIGxlbiArPSByb3V0ZUFycmF5W2ld
LnBhdGgubGVuZ3RoOworICAgICAgfQogCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVj
dHVyZSBiZWxvdworICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKGxlbik7CisgICAgICB2YXIgcm91
dGUgPSB7IHBhdGg6IHBhdGgsIGhhbmRsZXI6IGhhbmRsZXIgfTsKKyAgICAgIGlmKHF1ZXJ5UGFy
YW1zKSB7IHJvdXRlLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7IH0KKyAgICAgIHJvdXRlQXJy
YXkucHVzaChyb3V0ZSk7CisgICAgfQogCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIERhdmU8L2Rpdj4K
LSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgTWFyeTwvZGl2PgotICAgIDxk
aXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBTYXJhPC9kaXY+Ci0gIDwvZGl2PgotICBg
YGAKLSAgCi0gICMjIyBSZXByZXNlbnRpbmcgZWFjaCBpdGVtIHdpdGggYSBDb250cm9sbGVyLgot
ICBCeSBkZWZhdWx0IHRoZSBjb250cm9sbGVyIGxvb2t1cCB3aXRoaW4gYW4gYHt7I2VhY2h9fWAg
YmxvY2sgd2lsbCBiZQotICB0aGUgY29udHJvbGxlciBvZiB0aGUgdGVtcGxhdGUgd2hlcmUgdGhl
IGB7eyNlYWNofX1gIHdhcyB1c2VkLiBJZiBlYWNoCi0gIGl0ZW0gbmVlZHMgdG8gYmUgcHJlc2Vu
dGVkIGJ5IGEgY3VzdG9tIGNvbnRyb2xsZXIgeW91IGNhbiBwcm92aWRlIGEKLSAgYGl0ZW1Db250
cm9sbGVyYCBvcHRpb24gd2hpY2ggcmVmZXJlbmNlcyBhIGNvbnRyb2xsZXIgYnkgbG9va3VwIG5h
bWUuCi0gIEVhY2ggaXRlbSBpbiB0aGUgbG9vcCB3aWxsIGJlIHdyYXBwZWQgaW4gYW4gaW5zdGFu
Y2Ugb2YgdGhpcyBjb250cm9sbGVyCi0gIGFuZCB0aGUgaXRlbSBpdHNlbGYgd2lsbCBiZSBzZXQg
dG8gdGhlIGBjb250ZW50YCBwcm9wZXJ0eSBvZiB0aGF0IGNvbnRyb2xsZXIuCi0gIAotICBUaGlz
IGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBwcm9wZXJ0aWVzIG9mIG1vZGVsIG9iamVjdHMgbmVl
ZCB0cmFuc2Zvcm1hdGlvbgotICBvciBzeW50aGVzaXMgZm9yIGRpc3BsYXk6Ci0gIAotICBgYGBq
YXZhc2NyaXB0Ci0gIEFwcC5EZXZlbG9wZXJDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJv
bGxlci5leHRlbmQoewotICAgIGlzQXZhaWxhYmxlRm9ySGlyZTogZnVuY3Rpb24oKXsKLSAgICAg
IHJldHVybiAhdGhpcy5nZXQoJ2NvbnRlbnQuaXNFbXBsb3llZCcpICYmIHRoaXMuZ2V0KCdjb250
ZW50LmlzU2Vla2luZ1dvcmsnKTsKLSAgICB9LnByb3BlcnR5KCdpc0VtcGxveWVkJywgJ2lzU2Vl
a2luZ1dvcmsnKQotICB9KQotICBgYGAKLSAgCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBw
ZXJzb24gaW4gRGV2ZWxvcGVycyBpdGVtQ29udHJvbGxlcj0iZGV2ZWxvcGVyIn19Ci0gICAge3tw
ZXJzb24ubmFtZX19IHt7I2lmIHBlcnNvbi5pc0F2YWlsYWJsZUZvckhpcmV9fUhpcmUgbWUhe3sv
aWZ9fQotICB7ey9lYWNofX0KLSAgYGBgCi0gIAotICBAbWV0aG9kIGVhY2gKLSAgQGZvciBFbWJl
ci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIFtuYW1lXSB7U3RyaW5nfSBuYW1lIGZvciBp
dGVtICh1c2VkIHdpdGggYGluYCkKLSAgQHBhcmFtIHBhdGgge1N0cmluZ30gcGF0aAotICBAcGFy
YW0gW29wdGlvbnNdIHtPYmplY3R9IEhhbmRsZWJhcnMga2V5L3ZhbHVlIHBhaXJzIG9mIG9wdGlv
bnMKLSAgQHBhcmFtIFtvcHRpb25zLml0ZW1WaWV3Q2xhc3NdIHtTdHJpbmd9IGEgcGF0aCB0byBh
IHZpZXcgY2xhc3MgdXNlZCBmb3IgZWFjaCBpdGVtCi0gIEBwYXJhbSBbb3B0aW9ucy5pdGVtQ29u
dHJvbGxlcl0ge1N0cmluZ30gbmFtZSBvZiBhIGNvbnRyb2xsZXIgdG8gYmUgY3JlYXRlZCBmb3Ig
ZWFjaCBpdGVtCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1
bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsK
LSAgICBFbWJlci5hc3NlcnQoIklmIHlvdSBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8g
dGhlIGVhY2ggaGVscGVyLCBpdCBtdXN0IGJlIGluIHRoZSBmb3JtICNlYWNoIGZvbyBpbiBiYXIi
LCBhcmd1bWVudHNbMV0gPT09ICJpbiIpOworICAgIGZ1bmN0aW9uIGVhY2hSb3V0ZShiYXNlUm91
dGUsIG1hdGNoZXIsIGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgICB2YXIgcm91dGVzID0gbWF0
Y2hlci5yb3V0ZXM7CisgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBtYXRjaGVyLnF1ZXJ5UGFyYW1z
OwogCi0gICAgdmFyIGtleXdvcmROYW1lID0gYXJndW1lbnRzWzBdOworICAgICAgZm9yICh2YXIg
cGF0aCBpbiByb3V0ZXMpIHsKKyAgICAgICAgaWYgKHJvdXRlcy5oYXNPd25Qcm9wZXJ0eShwYXRo
KSkgeworICAgICAgICAgIHZhciByb3V0ZUFycmF5ID0gYmFzZVJvdXRlLnNsaWNlKCk7CisgICAg
ICAgICAgYWRkUm91dGUocm91dGVBcnJheSwgcGF0aCwgcm91dGVzW3BhdGhdLCBxdWVyeVBhcmFt
c1twYXRoXSk7CiAKLSAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOwotICAgIHBhdGggPSBhcmd1
bWVudHNbMl07Ci0gICAgaWYgKHBhdGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0KKyAgICAg
ICAgICBpZiAobWF0Y2hlci5jaGlsZHJlbltwYXRoXSkgeworICAgICAgICAgICAgZWFjaFJvdXRl
KHJvdXRlQXJyYXksIG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0sIGNhbGxiYWNrLCBiaW5kaW5nKTsK
KyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBy
b3V0ZUFycmF5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKLSAg
ICBvcHRpb25zLmhhc2gua2V5d29yZCA9IGtleXdvcmROYW1lOwotICB9CisgICAgUm91dGVSZWNv
Z25pemVyLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaywgYWRkUm91dGVDYWxsYmFj
aykgeworICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgTWF0Y2hlcigpOwogCi0gIG9wdGlvbnMuaGFz
aC5kYXRhU291cmNlQmluZGluZyA9IHBhdGg7Ci0gIC8vIFNldCB1cCBlbXB0eVZpZXcgYXMgYSBt
ZXRhbW9ycGggd2l0aCBubyB0YWcKLSAgLy9vcHRpb25zLmhhc2guZW1wdHlWaWV3Q2xhc3MgPSBF
bWJlci5fTWV0YW1vcnBoVmlldzsKKyAgICAgIGNhbGxiYWNrKGdlbmVyYXRlTWF0Y2goIiIsIG1h
dGNoZXIsIHRoaXMuZGVsZWdhdGUpKTsKIAotICBpZiAob3B0aW9ucy5kYXRhLmluc2lkZUdyb3Vw
ICYmICFvcHRpb25zLmhhc2guZ3JvdXBlZFJvd3MgJiYgIW9wdGlvbnMuaGFzaC5pdGVtVmlld0Ns
YXNzKSB7Ci0gICAgbmV3IEVtYmVyLkhhbmRsZWJhcnMuR3JvdXBlZEVhY2godGhpcywgcGF0aCwg
b3B0aW9ucykucmVuZGVyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJh
cnMuaGVscGVycy5jb2xsZWN0aW9uLmNhbGwodGhpcywgJ0VtYmVyLkhhbmRsZWJhcnMuRWFjaFZp
ZXcnLCBvcHRpb25zKTsKLSAgfQotfSk7CisgICAgICBlYWNoUm91dGUoW10sIG1hdGNoZXIsIGZ1
bmN0aW9uKHJvdXRlKSB7CisgICAgICAgIGlmIChhZGRSb3V0ZUNhbGxiYWNrKSB7IGFkZFJvdXRl
Q2FsbGJhY2sodGhpcywgcm91dGUpOyB9CisgICAgICAgIGVsc2UgeyB0aGlzLmFkZChyb3V0ZSk7
IH0KKyAgICAgIH0sIHRoaXMpOworICAgIH07CisgICAgcmV0dXJuIFJvdXRlUmVjb2duaXplcjsK
KyAgfSk7CiAKIH0pKCk7CiAKIAogCiAoZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIK
LUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KK2RlZmluZSgicm91dGVyIiwKKyAgWyJy
b3V0ZS1yZWNvZ25pemVyIiwicnN2cCIsImV4cG9ydHMiXSwKKyAgZnVuY3Rpb24oX19kZXBlbmRl
bmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZXhwb3J0c19fKSB7CisgICAgInVzZSBzdHJpY3Qi
OworICAgIC8qKgorICAgICAgQHByaXZhdGUKIAotLyoqCi0gIGB0ZW1wbGF0ZWAgYWxsb3dzIHlv
dSB0byByZW5kZXIgYSB0ZW1wbGF0ZSBmcm9tIGluc2lkZSBhbm90aGVyIHRlbXBsYXRlLgotICBU
aGlzIGFsbG93cyB5b3UgdG8gcmUtdXNlIHRoZSBzYW1lIHRlbXBsYXRlIGluIG11bHRpcGxlIHBs
YWNlcy4gRm9yIGV4YW1wbGU6CisgICAgICBUaGlzIGZpbGUgcmVmZXJlbmNlcyBzZXZlcmFsIGlu
dGVybmFsIHN0cnVjdHVyZXM6CiAKLSAgYGBgaHRtbAotICA8c2NyaXB0IHR5cGU9InRleHQveC1o
YW5kbGViYXJzIiBkYXRhLXRlbXBsYXRlLW5hbWU9ImxvZ2dlZF9pbl91c2VyIj4KLSAgICB7eyN3
aXRoIGxvZ2dlZEluVXNlcn19Ci0gICAgICBMYXN0IExvZ2luOiB7e2xhc3RMb2dpbn19Ci0gICAg
ICBVc2VyIEluZm86IHt7dGVtcGxhdGUgInVzZXJfaW5mbyJ9fQotICAgIHt7L3dpdGh9fQotICA8
L3NjcmlwdD4KLSAgYGBgCisgICAgICAjIyBgUmVjb2duaXplZEhhbmRsZXJgCiAKLSAgYGBgaHRt
bAotICA8c2NyaXB0IHR5cGU9InRleHQveC1oYW5kbGViYXJzIiBkYXRhLXRlbXBsYXRlLW5hbWU9
InVzZXJfaW5mbyI+Ci0gICAgTmFtZTogPGVtPnt7bmFtZX19PC9lbT4KLSAgICBLYXJtYTogPGVt
Pnt7a2FybWF9fTwvZW0+Ci0gIDwvc2NyaXB0PgotICBgYGAKKyAgICAgICogYHtTdHJpbmd9IGhh
bmRsZXJgOiBBIGhhbmRsZXIgbmFtZQorICAgICAgKiBge09iamVjdH0gcGFyYW1zYDogQSBoYXNo
IG9mIHJlY29nbml6ZWQgcGFyYW1ldGVycwogCi0gIFRoaXMgaGVscGVyIGxvb2tzIGZvciB0ZW1w
bGF0ZXMgaW4gdGhlIGdsb2JhbCBgRW1iZXIuVEVNUExBVEVTYCBoYXNoLiBJZiB5b3UKLSAgYWRk
IGA8c2NyaXB0PmAgdGFncyB0byB5b3VyIHBhZ2Ugd2l0aCB0aGUgYGRhdGEtdGVtcGxhdGUtbmFt
ZWAgYXR0cmlidXRlIHNldCwKLSAgdGhleSB3aWxsIGJlIGNvbXBpbGVkIGFuZCBwbGFjZWQgaW4g
dGhpcyBoYXNoIGF1dG9tYXRpY2FsbHkuCisgICAgICAjIyBgSGFuZGxlckluZm9gCiAKLSAgWW91
IGNhbiBhbHNvIG1hbnVhbGx5IHJlZ2lzdGVyIHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0byB0
aGUgaGFzaDoKKyAgICAgICogYHtCb29sZWFufSBpc0R5bmFtaWNgOiB3aGV0aGVyIGEgaGFuZGxl
ciBoYXMgYW55IGR5bmFtaWMgc2VnbWVudHMKKyAgICAgICogYHtTdHJpbmd9IG5hbWVgOiB0aGUg
bmFtZSBvZiBhIGhhbmRsZXIKKyAgICAgICogYHtPYmplY3R9IGhhbmRsZXJgOiBhIGhhbmRsZXIg
b2JqZWN0CisgICAgICAqIGB7T2JqZWN0fSBjb250ZXh0YDogdGhlIGFjdGl2ZSBjb250ZXh0IGZv
ciB0aGUgaGFuZGxlcgorICAgICovCiAKLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5URU1QTEFU
RVNbIm15X2Nvb2xfdGVtcGxhdGUiXSA9IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPGI+e3t1
c2VyfX08L2I+Jyk7Ci0gIGBgYAorICAgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBfX2RlcGVuZGVu
Y3kxX187CisgICAgdmFyIFJTVlAgPSBfX2RlcGVuZGVuY3kyX187CiAKLSAgQG1ldGhvZCB0ZW1w
bGF0ZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30g
dGVtcGxhdGVOYW1lIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSovCisgICAgdmFyIHNsaWNlID0g
QXJyYXkucHJvdG90eXBlLnNsaWNlOwogCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCd0ZW1wbGF0ZScsIGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsKLSAgdmFyIHRlbXBsYXRlID0g
RW1iZXIuVEVNUExBVEVTW25hbWVdOwogCi0gIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQg
dGVtcGxhdGUgd2l0aCBuYW1lICciK25hbWUrIicuIiwgISF0ZW1wbGF0ZSk7CiAKLSAgRW1iZXIu
VEVNUExBVEVTW25hbWVdKHRoaXMsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0pOwotfSk7CisgICAg
LyoqCisgICAgICBAcHJpdmF0ZQogCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdw
YXJ0aWFsJywgZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewotICB2YXIgbmFtZVBhcnRzID0gbmFt
ZS5zcGxpdCgiLyIpLAotICAgICAgbGFzdFBhcnQgPSBuYW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0
aCAtIDFdOworICAgICAgQSBUcmFuc2l0aW9uIGlzIGEgdGhlbm5hYmxlIChhIHByb21pc2UtbGlr
ZSBvYmplY3QpIHRoYXQgcmVwcmVzZW50cworICAgICAgYW4gYXR0ZW1wdCB0byB0cmFuc2l0aW9u
IHRvIGFub3RoZXIgcm91dGUuIEl0IGNhbiBiZSBhYm9ydGVkLCBlaXRoZXIKKyAgICAgIGV4cGxp
Y2l0bHkgdmlhIGBhYm9ydGAgb3IgYnkgYXR0ZW1wdGluZyBhbm90aGVyIHRyYW5zaXRpb24gd2hp
bGUgYQorICAgICAgcHJldmlvdXMgb25lIGlzIHN0aWxsIHVuZGVyd2F5LiBBbiBhYm9ydGVkIHRy
YW5zaXRpb24gY2FuIGFsc28KKyAgICAgIGJlIGByZXRyeSgpYGQgbGF0ZXIuCisgICAgICovCisK
KyAgICBmdW5jdGlvbiBUcmFuc2l0aW9uKHJvdXRlciwgcHJvbWlzZSkgeworICAgICAgdGhpcy5y
b3V0ZXIgPSByb3V0ZXI7CisgICAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlOworICAgICAgdGhp
cy5kYXRhID0ge307CisgICAgICB0aGlzLnJlc29sdmVkTW9kZWxzID0ge307CisgICAgICB0aGlz
LnByb3ZpZGVkTW9kZWxzID0ge307CisgICAgICB0aGlzLnByb3ZpZGVkTW9kZWxzQXJyYXkgPSBb
XTsKKyAgICAgIHRoaXMuc2VxdWVuY2UgPSArK1RyYW5zaXRpb24uY3VycmVudFNlcXVlbmNlOwor
ICAgICAgdGhpcy5wYXJhbXMgPSB7fTsKKyAgICB9CisKKyAgICBUcmFuc2l0aW9uLmN1cnJlbnRT
ZXF1ZW5jZSA9IDA7CisKKyAgICBUcmFuc2l0aW9uLnByb3RvdHlwZSA9IHsKKyAgICAgIHRhcmdl
dE5hbWU6IG51bGwsCisgICAgICB1cmxNZXRob2Q6ICd1cGRhdGUnLAorICAgICAgcHJvdmlkZWRN
b2RlbHM6IG51bGwsCisgICAgICByZXNvbHZlZE1vZGVsczogbnVsbCwKKyAgICAgIHBhcmFtczog
bnVsbCwKKyAgICAgIHBpdm90SGFuZGxlcjogbnVsbCwKKyAgICAgIHJlc29sdmVJbmRleDogMCwK
KyAgICAgIGhhbmRsZXJJbmZvczogbnVsbCwKKworICAgICAgaXNBY3RpdmU6IHRydWUsCiAKLSAg
bmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXSA9ICJfIiArIGxhc3RQYXJ0OworICAgICAg
LyoqCisgICAgICAgIFRoZSBUcmFuc2l0aW9uJ3MgaW50ZXJuYWwgcHJvbWlzZS4gQ2FsbGluZyBg
LnRoZW5gIG9uIHRoaXMgcHJvcGVydHkKKyAgICAgICAgaXMgdGhhdCBzYW1lIGFzIGNhbGxpbmcg
YC50aGVuYCBvbiB0aGUgVHJhbnNpdGlvbiBvYmplY3QgaXRzZWxmLCBidXQKKyAgICAgICAgdGhp
cyBwcm9wZXJ0eSBpcyBleHBvc2VkIGZvciB3aGVuIHlvdSB3YW50IHRvIHBhc3MgYXJvdW5kIGEK
KyAgICAgICAgVHJhbnNpdGlvbidzIHByb21pc2UsIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24gb2Jq
ZWN0IGl0c2VsZiwgc2luY2UKKyAgICAgICAgVHJhbnNpdGlvbiBvYmplY3QgY2FuIGJlIGV4dGVy
bmFsbHkgYGFib3J0YGVkLCB3aGlsZSB0aGUgcHJvbWlzZQorICAgICAgICBjYW5ub3QuCisgICAg
ICAgKi8KKyAgICAgIHByb21pc2U6IG51bGwsCiAKLSAgdmFyIHVuZGVyc2NvcmVkTmFtZSA9IG5h
bWVQYXJ0cy5qb2luKCIvIik7CisgICAgICAvKioKKyAgICAgICAgQ3VzdG9tIHN0YXRlIGNhbiBi
ZSBzdG9yZWQgb24gYSBUcmFuc2l0aW9uJ3MgYGRhdGFgIG9iamVjdC4KKyAgICAgICAgVGhpcyBj
YW4gYmUgdXNlZnVsIGZvciBkZWNvcmF0aW5nIGEgVHJhbnNpdGlvbiB3aXRoaW4gYW4gZWFybGll
cgorICAgICAgICBob29rIGFuZCBzaGFyZWQgd2l0aCBhIGxhdGVyIGhvb2suIFByb3BlcnRpZXMg
c2V0IG9uIGBkYXRhYCB3aWxsCisgICAgICAgIGJlIGNvcGllZCB0byBuZXcgdHJhbnNpdGlvbnMg
Z2VuZXJhdGVkIGJ5IGNhbGxpbmcgYHJldHJ5YCBvbiB0aGlzCisgICAgICAgIHRyYW5zaXRpb24u
CisgICAgICAgKi8KKyAgICAgIGRhdGE6IG51bGwsCiAKLSAgdmFyIHRlbXBsYXRlID0gRW1iZXIu
VEVNUExBVEVTW3VuZGVyc2NvcmVkTmFtZV0sCi0gICAgICBkZXByZWNhdGVkVGVtcGxhdGUgPSBF
bWJlci5URU1QTEFURVNbbmFtZV07CisgICAgICAvKioKKyAgICAgICAgQSBzdGFuZGFyZCBwcm9t
aXNlIGhvb2sgdGhhdCByZXNvbHZlcyBpZiB0aGUgdHJhbnNpdGlvbgorICAgICAgICBzdWNjZWVk
cyBhbmQgcmVqZWN0cyBpZiBpdCBmYWlscy9yZWRpcmVjdHMvYWJvcnRzLgogCi0gIEVtYmVyLmRl
cHJlY2F0ZSgiWW91IHRyaWVkIHRvIHJlbmRlciB0aGUgcGFydGlhbCAiICsgbmFtZSArICIsIHdo
aWNoIHNob3VsZCBiZSBhdCAnIiArIHVuZGVyc2NvcmVkTmFtZSArICInLCBidXQgRW1iZXIgZm91
bmQgJyIgKyBuYW1lICsgIicuIFBsZWFzZSB1c2UgYSBsZWFkaW5nIHVuZGVyc2NvcmUgaW4geW91
ciBwYXJ0aWFscyIsIHRlbXBsYXRlKTsKLSAgRW1iZXIuYXNzZXJ0KCJVbmFibGUgdG8gZmluZCBw
YXJ0aWFsIHdpdGggbmFtZSAnIituYW1lKyInLiIsIHRlbXBsYXRlIHx8IGRlcHJlY2F0ZWRUZW1w
bGF0ZSk7CisgICAgICAgIEZvcndhcmRzIHRvIHRoZSBpbnRlcm5hbCBgcHJvbWlzZWAgcHJvcGVy
dHkgd2hpY2ggeW91IGNhbgorICAgICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2Fu
dCB0byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKKyAgICAgICAgYnV0IG5vdCB0aGUgVHJhbnNp
dGlvbiBpdHNlbGYuCiAKLSAgdGVtcGxhdGUgPSB0ZW1wbGF0ZSB8fCBkZXByZWNhdGVkVGVtcGxh
dGU7CisgICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IHN1Y2Nlc3MKKyAgICAgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZmFpbHVyZQorICAgICAgICovCisgICAgICB0aGVuOiBmdW5jdGlvbihzdWNjZXNz
LCBmYWlsdXJlKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb21pc2UudGhlbihzdWNjZXNzLCBm
YWlsdXJlKTsKKyAgICAgIH0sCiAKLSAgdGVtcGxhdGUodGhpcywgeyBkYXRhOiBvcHRpb25zLmRh
dGEgfSk7Ci19KTsKKyAgICAgIC8qKgorICAgICAgICBBYm9ydHMgdGhlIFRyYW5zaXRpb24uIE5v
dGUgeW91IGNhbiBhbHNvIGltcGxpY2l0bHkgYWJvcnQgYSB0cmFuc2l0aW9uCisgICAgICAgIGJ5
IGluaXRpYXRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxlIGEgcHJldmlvdXMgb25lIGlzIHVu
ZGVyd2F5LgorICAgICAgICovCisgICAgICBhYm9ydDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlm
ICh0aGlzLmlzQWJvcnRlZCkgeyByZXR1cm4gdGhpczsgfQorICAgICAgICBsb2codGhpcy5yb3V0
ZXIsIHRoaXMuc2VxdWVuY2UsIHRoaXMudGFyZ2V0TmFtZSArICI6IHRyYW5zaXRpb24gd2FzIGFi
b3J0ZWQiKTsKKyAgICAgICAgdGhpcy5pc0Fib3J0ZWQgPSB0cnVlOworICAgICAgICB0aGlzLmlz
QWN0aXZlID0gZmFsc2U7CisgICAgICAgIHRoaXMucm91dGVyLmFjdGl2ZVRyYW5zaXRpb24gPSBu
dWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0sCiAKLX0pKCk7CisgICAgICAvKioK
KyAgICAgICAgUmV0cmllcyBhIHByZXZpb3VzbHktYWJvcnRlZCB0cmFuc2l0aW9uIChtYWtpbmcg
c3VyZSB0byBhYm9ydCB0aGUKKyAgICAgICAgdHJhbnNpdGlvbiBpZiBpdCdzIHN0aWxsIGFjdGl2
ZSkuIFJldHVybnMgYSBuZXcgdHJhbnNpdGlvbiB0aGF0CisgICAgICAgIHJlcHJlc2VudHMgdGhl
IG5ldyBhdHRlbXB0IHRvIHRyYW5zaXRpb24uCisgICAgICAgKi8KKyAgICAgIHJldHJ5OiBmdW5j
dGlvbigpIHsKKyAgICAgICAgdGhpcy5hYm9ydCgpOworICAgICAgICB2YXIgcmVjb2dIYW5kbGVy
cyA9IHRoaXMucm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGhpcy50YXJnZXROYW1lKSwK
KyAgICAgICAgICAgIGhhbmRsZXJJbmZvcyAgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVy
eVBhcmFtcyh0aGlzLnJvdXRlciwgcmVjb2dIYW5kbGVycywgdGhpcy5xdWVyeVBhcmFtcyksCisg
ICAgICAgICAgICBuZXdUcmFuc2l0aW9uID0gcGVyZm9ybVRyYW5zaXRpb24odGhpcy5yb3V0ZXIs
IGhhbmRsZXJJbmZvcywgdGhpcy5wcm92aWRlZE1vZGVsc0FycmF5LCB0aGlzLnBhcmFtcywgdGhp
cy5xdWVyeVBhcmFtcywgdGhpcy5kYXRhKTsKIAorICAgICAgICByZXR1cm4gbmV3VHJhbnNpdGlv
bjsKKyAgICAgIH0sCiAKKyAgICAgIC8qKgorICAgICAgICBTZXRzIHRoZSBVUkwtY2hhbmdpbmcg
bWV0aG9kIHRvIGJlIGVtcGxveWVkIGF0IHRoZSBlbmQgb2YgYQorICAgICAgICBzdWNjZXNzZnVs
IHRyYW5zaXRpb24uIEJ5IGRlZmF1bHQsIGEgbmV3IFRyYW5zaXRpb24gd2lsbCBqdXN0CisgICAg
ICAgIHVzZSBgdXBkYXRlVVJMYCwgYnV0IHBhc3NpbmcgJ3JlcGxhY2UnIHRvIHRoaXMgbWV0aG9k
IHdpbGwKKyAgICAgICAgY2F1c2UgdGhlIFVSTCB0byB1cGRhdGUgdXNpbmcgJ3JlcGxhY2VXaXRo
JyBpbnN0ZWFkLiBPbWl0dGluZworICAgICAgICBhIHBhcmFtZXRlciB3aWxsIGRpc2FibGUgdGhl
IFVSTCBjaGFuZ2UsIGFsbG93aW5nIGZvciB0cmFuc2l0aW9ucworICAgICAgICB0aGF0IGRvbid0
IHVwZGF0ZSB0aGUgVVJMIGF0IGNvbXBsZXRpb24gKHRoaXMgaXMgYWxzbyB1c2VkIGZvcgorICAg
ICAgICBoYW5kbGVVUkwsIHNpbmNlIHRoZSBVUkwgaGFzIGFscmVhZHkgY2hhbmdlZCBiZWZvcmUg
dGhlCisgICAgICAgIHRyYW5zaXRpb24gdG9vayBwbGFjZSkuCisKKyAgICAgICAgQHBhcmFtIHtT
dHJpbmd9IG1ldGhvZCB0aGUgdHlwZSBvZiBVUkwtY2hhbmdpbmcgbWV0aG9kIHRvIHVzZQorICAg
ICAgICAgIGF0IHRoZSBlbmQgb2YgYSB0cmFuc2l0aW9uLiBBY2NlcHRlZCB2YWx1ZXMgYXJlICdy
ZXBsYWNlJywKKyAgICAgICAgICBmYWxzeSB2YWx1ZXMsIG9yIGFueSBvdGhlciBub24tZmFsc3kg
dmFsdWUgKHdoaWNoIGlzCisgICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgYW4gdXBkYXRlVVJMIHRy
YW5zaXRpb24pLgorCisgICAgICAgIEByZXR1cm4ge1RyYW5zaXRpb259IHRoaXMgdHJhbnNpdGlv
bgorICAgICAgICovCisgICAgICBtZXRob2Q6IGZ1bmN0aW9uKG1ldGhvZCkgeworICAgICAgICB0
aGlzLnVybE1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9LAog
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFu
ZGxlYmFycwotKi8KKyAgICAgIC8qKgorICAgICAgICBGaXJlcyBhbiBldmVudCBvbiB0aGUgY3Vy
cmVudCBsaXN0IG9mIHJlc29sdmVkL3Jlc29sdmluZworICAgICAgICBoYW5kbGVycyB3aXRoaW4g
dGhpcyB0cmFuc2l0aW9uLiBVc2VmdWwgZm9yIGZpcmluZyBldmVudHMKKyAgICAgICAgb24gcm91
dGUgaGllcmFyY2hpZXMgdGhhdCBoYXZlbid0IGZ1bGx5IGJlZW4gZW50ZXJlZCB5ZXQuCiAKLXZh
ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKKyAgICAgICAgQHBhcmFtIHtCb29s
ZWFufSBpZ25vcmVGYWlsdXJlIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBmaXJlCisgICAgICAg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBmaXJlCisgICAg
ICAgKi8KKyAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKGlnbm9yZUZhaWx1cmUpIHsKKyAgICAgICAg
dmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0eXBlb2YgaWdu
b3JlRmFpbHVyZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgICAgYXJncy5zaGlmdCgpOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRocm93IGVycm9ycyBvbiB1bmhhbmRsZWQgdHJp
Z2dlciBldmVudHMgYnkgZGVmYXVsdAorICAgICAgICAgIGlnbm9yZUZhaWx1cmUgPSBmYWxzZTsK
KyAgICAgICAgfQorICAgICAgICB0cmlnZ2VyKHRoaXMucm91dGVyLCB0aGlzLmhhbmRsZXJJbmZv
cy5zbGljZSgwLCB0aGlzLnJlc29sdmVJbmRleCArIDEpLCBpZ25vcmVGYWlsdXJlLCBhcmdzKTsK
KyAgICAgIH0sCiAKLS8qKgotICBXaGVuIHVzZWQgaW4gYSBIYW5kbGViYXJzIHRlbXBsYXRlIHRo
YXQgaXMgYXNzaWduZWQgdG8gYW4gYEVtYmVyLlZpZXdgCi0gIGluc3RhbmNlJ3MgYGxheW91dGAg
cHJvcGVydHkgRW1iZXIgd2lsbCByZW5kZXIgdGhlIGxheW91dCB0ZW1wbGF0ZSBmaXJzdCwKLSAg
aW5zZXJ0aW5nIHRoZSB2aWV3J3Mgb3duIHJlbmRlcmVkIG91dHB1dCBhdCB0aGUgYHt7eWllbGR9
fWAgbG9jYXRpb24uCisgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVy
biAiVHJhbnNpdGlvbiAoc2VxdWVuY2UgIiArIHRoaXMuc2VxdWVuY2UgKyAiKSI7CisgICAgICB9
CisgICAgfTsKIAotICBBbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBhcHBsaWNh
dGlvbiBjb2RlOgorICAgIGZ1bmN0aW9uIFJvdXRlcigpIHsKKyAgICAgIHRoaXMucmVjb2duaXpl
ciA9IG5ldyBSb3V0ZVJlY29nbml6ZXIoKTsKKyAgICB9CiAKLSAgYGBgamF2YXNjcmlwdAotICBB
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFzc05hbWVzOiBbJ2Etdmlldy13aXRo
LWxheW91dCddLAotICAgIGxheW91dDogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8ZGl2IGNs
YXNzPSJ3cmFwcGVyIj57e3lpZWxkfX08L2Rpdj4nKSwKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFu
ZGxlYmFycy5jb21waWxlKCc8c3Bhbj5JIGFtIHdyYXBwZWQ8L3NwYW4+JykKLSAgfSk7CisgICAg
Ly8gVE9ETzogc2VwYXJhdGUgaW50byBtb2R1bGU/CisgICAgUm91dGVyLlRyYW5zaXRpb24gPSBU
cmFuc2l0aW9uOwogCi0gIGFWaWV3ID0gQVZpZXcuY3JlYXRlKCk7Ci0gIGFWaWV3LmFwcGVuZFRv
KCdib2R5Jyk7Ci0gIGBgYAorICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBSb3V0ZXI7CiAK
LSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIG91dHB1dDoKIAotICBgYGBodG1s
Ci0gIDxib2R5PgotICAgIDxkaXYgY2xhc3M9J2VtYmVyLXZpZXcgYS12aWV3LXdpdGgtbGF5b3V0
Jz4KLSAgICAgIDxkaXYgY2xhc3M9IndyYXBwZXIiPgotICAgICAgICA8c3Bhbj5JIGFtIHdyYXBw
ZWQ8L3NwYW4+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9ib2R5PgotICBgYGAKKyAg
ICAvKioKKyAgICAgIFByb21pc2UgcmVqZWN0IHJlYXNvbnMgcGFzc2VkIHRvIHByb21pc2UgcmVq
ZWN0aW9uCisgICAgICBoYW5kbGVycyBmb3IgZmFpbGVkIHRyYW5zaXRpb25zLgorICAgICAqLwor
ICAgIFJvdXRlci5VbnJlY29nbml6ZWRVUkxFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAg
ICAgIHRoaXMubWVzc2FnZSA9IChtZXNzYWdlIHx8ICJVbnJlY29nbml6ZWRVUkxFcnJvciIpOwor
ICAgICAgdGhpcy5uYW1lID0gIlVucmVjb2duaXplZFVSTEVycm9yIjsKKyAgICB9OwogCi0gIFRo
ZSBgeWllbGRgIGhlbHBlciBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgdGVtcGxhdGUgYXNz
aWduZWQgdG8gYW4KLSAgYEVtYmVyLlZpZXdgJ3MgYGxheW91dGAgcHJvcGVydHkgYW5kIHdpbGwg
dGhyb3cgYW4gZXJyb3IgaWYgYXR0ZW1wdGVkLgorICAgIFJvdXRlci5UcmFuc2l0aW9uQWJvcnRl
ZCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNzYWdlIHx8
ICJUcmFuc2l0aW9uQWJvcnRlZCIpOworICAgICAgdGhpcy5uYW1lID0gIlRyYW5zaXRpb25BYm9y
dGVkIjsKKyAgICB9OwogCi0gIGBgYGphdmFzY3JpcHQKLSAgQlZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7Ci0gICAgY2xhc3NOYW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKLSAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCd7e3lpZWxkfX0nKQotICB9KTsKKyAgICBm
dW5jdGlvbiBlcnJvclRyYW5zaXRpb24ocm91dGVyLCByZWFzb24pIHsKKyAgICAgIHJldHVybiBu
ZXcgVHJhbnNpdGlvbihyb3V0ZXIsIFJTVlAucmVqZWN0KHJlYXNvbikpOworICAgIH0KIAotICBi
VmlldyA9IEJWaWV3LmNyZWF0ZSgpOwotICBiVmlldy5hcHBlbmRUbygnYm9keScpOwogCi0gIC8v
IHRocm93cwotICAvLyBVbmNhdWdodCBFcnJvcjogYXNzZXJ0aW9uIGZhaWxlZDogWW91IGNhbGxl
ZCB5aWVsZCBpbiBhIHRlbXBsYXRlIHRoYXQgd2FzIG5vdCBhIGxheW91dAotICBgYGAKKyAgICBS
b3V0ZXIucHJvdG90eXBlID0geworICAgICAgLyoqCisgICAgICAgIFRoZSBtYWluIGVudHJ5IHBv
aW50IGludG8gdGhlIHJvdXRlci4gVGhlIEFQSSBpcyBlc3NlbnRpYWxseQorICAgICAgICB0aGUg
c2FtZSBhcyB0aGUgYG1hcGAgbWV0aG9kIGluIGByb3V0ZS1yZWNvZ25pemVyYC4KIAotICBAbWV0
aG9kIHlpZWxkCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7SGFz
aH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXIuSGFu
ZGxlYmFycy5yZWdpc3RlckhlbHBlcigneWllbGQnLCBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHZh
ciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXcsIHRlbXBsYXRlOworICAgICAgICBUaGlzIG1ldGhv
ZCBleHRyYWN0cyB0aGUgU3RyaW5nIGhhbmRsZXIgYXQgdGhlIGxhc3QgYC50bygpYAorICAgICAg
ICBjYWxsIGFuZCB1c2VzIGl0IGFzIHRoZSBuYW1lIG9mIHRoZSB3aG9sZSByb3V0ZS4KIAotICB3
aGlsZSAodmlldyAmJiAhZ2V0KHZpZXcsICdsYXlvdXQnKSkgewotICAgIHZpZXcgPSBnZXQodmll
dywgJ3BhcmVudFZpZXcnKTsKLSAgfQorICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFj
aworICAgICAgKi8KKyAgICAgIG1hcDogZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgICAgICAgdGhp
cy5yZWNvZ25pemVyLmRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZTsKIAotICBFbWJlci5hc3NlcnQo
IllvdSBjYWxsZWQgeWllbGQgaW4gYSB0ZW1wbGF0ZSB0aGF0IHdhcyBub3QgYSBsYXlvdXQiLCAh
IXZpZXcpOworICAgICAgICB0aGlzLnJlY29nbml6ZXIubWFwKGNhbGxiYWNrLCBmdW5jdGlvbihy
ZWNvZ25pemVyLCByb3V0ZSkgeworICAgICAgICAgIHZhciBsYXN0SGFuZGxlciA9IHJvdXRlW3Jv
dXRlLmxlbmd0aCAtIDFdLmhhbmRsZXI7CisgICAgICAgICAgdmFyIGFyZ3MgPSBbcm91dGUsIHsg
YXM6IGxhc3RIYW5kbGVyIH1dOworICAgICAgICAgIHJlY29nbml6ZXIuYWRkLmFwcGx5KHJlY29n
bml6ZXIsIGFyZ3MpOworICAgICAgICB9KTsKKyAgICAgIH0sCiAKLSAgdGVtcGxhdGUgPSBnZXQo
dmlldywgJ3RlbXBsYXRlJyk7CisgICAgICBoYXNSb3V0ZTogZnVuY3Rpb24ocm91dGUpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMucmVjb2duaXplci5oYXNSb3V0ZShyb3V0ZSk7CisgICAgICB9LAog
Ci0gIGlmICh0ZW1wbGF0ZSkgeyB0ZW1wbGF0ZSh0aGlzLCBvcHRpb25zKTsgfQotfSk7CisgICAg
ICAvKioKKyAgICAgICAgQ2xlYXJzIHRoZSBjdXJyZW50IGFuZCB0YXJnZXQgcm91dGUgaGFuZGxl
cnMgYW5kIHRyaWdnZXJzIGV4aXQKKyAgICAgICAgb24gZWFjaCBvZiB0aGVtIHN0YXJ0aW5nIGF0
IHRoZSBsZWFmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2gKKyAgICAgICAgaXRzIGFuY2VzdG9y
cy4KKyAgICAgICovCisgICAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIGVhY2hIYW5k
bGVyKHRoaXMuY3VycmVudEhhbmRsZXJJbmZvcyB8fCBbXSwgZnVuY3Rpb24oaGFuZGxlckluZm8p
IHsKKyAgICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAgICAg
ICAgaWYgKGhhbmRsZXIuZXhpdCkgeworICAgICAgICAgICAgaGFuZGxlci5leGl0KCk7CisgICAg
ICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5jdXJyZW50SGFuZGxlckluZm9zID0g
bnVsbDsKKyAgICAgICAgdGhpcy50YXJnZXRIYW5kbGVySW5mb3MgPSBudWxsOworICAgICAgfSwK
IAotfSkoKTsKKyAgICAgIGFjdGl2ZVRyYW5zaXRpb246IG51bGwsCisKKyAgICAgIC8qKgorICAg
ICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAgICAgIFRoZSBlbnRy
eSBwb2ludCBmb3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1YWxseQorICAgICAg
ICB2aWEgdGhlIGJhY2sgYW5kIGZvcndhcmQgYnV0dG9uKS4KIAorICAgICAgICBSZXR1cm5zIGFu
IEFycmF5IG9mIGhhbmRsZXJzIGFuZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkCisgICAgICAg
IHdpdGggdGhvc2UgcGFyYW1ldGVycy4KIAorICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJsIGEg
VVJMIHRvIHByb2Nlc3MKIAotKGZ1bmN0aW9uKCkgeworICAgICAgICBAcmV0dXJuIHtBcnJheX0g
YW4gQXJyYXkgb2YgYFtoYW5kbGVyLCBwYXJhbWV0ZXJdYCB0dXBsZXMKKyAgICAgICovCisgICAg
ICBoYW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgeworICAgICAgICAvLyBQZXJmb3JtIGEgVVJMLWJh
c2VkIHRyYW5zaXRpb24sIGJ1dCBkb24ndCBjaGFuZ2UKKyAgICAgICAgLy8gdGhlIFVSTCBhZnRl
cndhcmQsIHNpbmNlIGl0IGFscmVhZHkgaGFwcGVuZWQuCisgICAgICAgIHZhciBhcmdzID0gc2xp
Y2UuY2FsbChhcmd1bWVudHMpOworICAgICAgICBpZiAodXJsLmNoYXJBdCgwKSAhPT0gJy8nKSB7
IGFyZ3NbMF0gPSAnLycgKyB1cmw7IH0KKyAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlz
LCBhcmdzKS5tZXRob2QobnVsbCk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAgSG9v
ayBwb2ludCBmb3IgdXBkYXRpbmcgdGhlIFVSTC4KKworICAgICAgICBAcGFyYW0ge1N0cmluZ30g
dXJsIGEgVVJMIHRvIHVwZGF0ZSB0bworICAgICAgKi8KKyAgICAgIHVwZGF0ZVVSTDogZnVuY3Rp
b24oKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1l
bnRlZCIpOworICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgIEhvb2sgcG9pbnQgZm9yIHJl
cGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKKworICAgICAg
ICBCeSBkZWZhdWx0IHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAorCisgICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8gdXBkYXRlIHRvCisgICAgICAqLworICAg
ICAgcmVwbGFjZVVSTDogZnVuY3Rpb24odXJsKSB7CisgICAgICAgIHRoaXMudXBkYXRlVVJMKHVy
bCk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAgVHJhbnNpdGlvbiBpbnRvIHRoZSBz
cGVjaWZpZWQgbmFtZWQgcm91dGUuCisKKyAgICAgICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRo
ZSBleGl0IGNhbGxiYWNrIG9uIGFueSBoYW5kbGVycworICAgICAgICB0aGF0IGFyZSBubyBsb25n
ZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHRhcmdldCByb3V0ZS4KKworICAgICAgICBAcGFyYW0ge1N0
cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICAgICovCisgICAgICB0cmFuc2l0
aW9uVG86IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlz
LCBhcmd1bWVudHMpOworICAgICAgfSwKKworICAgICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRv
OiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMs
IHRydWUpOworICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgIElkZW50aWNhbCB0byBgdHJh
bnNpdGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAor
ICAgICAgICBpZiBwb3NzaWJsZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBw
cmltYXJpbHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3RhdGVgLgorCisgICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgICAgKi8KKyAgICAgIHJlcGxh
Y2VXaXRoOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHJldHVybiBkb1RyYW5zaXRpb24odGhp
cywgYXJndW1lbnRzKS5tZXRob2QoJ3JlcGxhY2UnKTsKKyAgICAgIH0sCisKKyAgICAgIC8qKgor
ICAgICAgICBAcHJpdmF0ZQorCisgICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBu
YW1lIGFuZCBhIGxpc3Qgb2YgY29udGV4dHMgYW5kIHJldHVybnMKKyAgICAgICAgYSBzZXJpYWxp
emVkIHBhcmFtZXRlciBoYXNoIHN1aXRhYmxlIHRvIHBhc3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJh
dGUoKWAuCiAKLX0pKCk7CisgICAgICAgIEBwYXJhbSB7U3RyaW5nfSBoYW5kbGVyTmFtZQorICAg
ICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IGNvbnRleHRzCisgICAgICAgIEByZXR1cm4ge09i
amVjdH0gYSBzZXJpYWxpemVkIHBhcmFtZXRlciBoYXNoCisgICAgICAqLwogCisgICAgICBwYXJh
bXNGb3JIYW5kbGVyOiBmdW5jdGlvbihoYW5kbGVyTmFtZSwgY29udGV4dHMpIHsKKyAgICAgICAg
dmFyIHBhcnRpdGlvbmVkQXJncyA9IGV4dHJhY3RRdWVyeVBhcmFtcyhzbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSkpOworICAgICAgICByZXR1cm4gcGFyYW1zRm9ySGFuZGxlcih0aGlzLCBoYW5kbGVy
TmFtZSwgcGFydGl0aW9uZWRBcmdzWzBdLCBwYXJ0aXRpb25lZEFyZ3NbMV0pOworICAgICAgfSwK
IAorICAgICAgLyoqCisgICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1lIGFu
ZCByZXR1cm5zIGEgbGlzdCBvZiBxdWVyeSBwYXJhbXMKKyAgICAgICAgdGhhdCBhcmUgdmFsaWQg
dG8gcGFzcyB0byB0aGUgaGFuZGxlciBvciBpdHMgcGFyZW50cwogCi0oZnVuY3Rpb24oKSB7Cisg
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBoYW5kbGVyTmFtZQorICAgICAgICBAcmV0dXJuIHtBcnJh
eVtTdHJpbmddfSBhIGxpc3Qgb2YgcXVlcnkgcGFyYW1ldGVycworICAgICAgKi8KKyAgICAgIHF1
ZXJ5UGFyYW1zRm9ySGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXJOYW1lKSB7CisgICAgICAgIHJl
dHVybiBxdWVyeVBhcmFtc0ZvckhhbmRsZXIodGhpcywgaGFuZGxlck5hbWUpOworICAgICAgfSwK
IAotfSkoKTsKKyAgICAgIC8qKgorICAgICAgICBUYWtlIGEgbmFtZWQgcm91dGUgYW5kIGNvbnRl
eHQgb2JqZWN0cyBhbmQgZ2VuZXJhdGUgYQorICAgICAgICBVUkwuCiAKKyAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIHRvIGdlbmVyYXRlCisgICAgICAg
ICAgYSBVUkwgZm9yCisgICAgICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBvYmplY3RzIGEgbGlzdCBv
ZiBvYmplY3RzIHRvIHNlcmlhbGl6ZQogCisgICAgICAgIEByZXR1cm4ge1N0cmluZ30gYSBVUkwK
KyAgICAgICovCisgICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oaGFuZGxlck5hbWUpIHsKKyAgICAg
ICAgdmFyIHBhcnRpdGlvbmVkQXJncyA9IGV4dHJhY3RRdWVyeVBhcmFtcyhzbGljZS5jYWxsKGFy
Z3VtZW50cywgMSkpLAorICAgICAgICAgIHN1cHBsaWVkUGFyYW1zID0gcGFydGl0aW9uZWRBcmdz
WzBdLAorICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gcGFydGl0aW9uZWRBcmdzWzFdOwogCi0oZnVu
Y3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFy
cwotKi8KKyAgICAgICAgdmFyIHBhcmFtcyA9IHBhcmFtc0ZvckhhbmRsZXIodGhpcywgaGFuZGxl
ck5hbWUsIHN1cHBsaWVkUGFyYW1zLCBxdWVyeVBhcmFtcyksCisgICAgICAgICAgdmFsaWRRdWVy
eVBhcmFtcyA9IHF1ZXJ5UGFyYW1zRm9ySGFuZGxlcih0aGlzLCBoYW5kbGVyTmFtZSk7CiAKLXZh
ciBzZXQgPSBFbWJlci5zZXQsIGdldCA9IEVtYmVyLmdldDsKKyAgICAgICAgdmFyIG1pc3NpbmdQ
YXJhbXMgPSBbXTsKIAotLyoqCi0gIFRoZSBgRW1iZXIuQ2hlY2tib3hgIHZpZXcgY2xhc3MgcmVu
ZGVycyBhIGNoZWNrYm94Ci0gIFtpbnB1dF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcv
ZW4vSFRNTC9FbGVtZW50L0lucHV0KSBlbGVtZW50LiBJdAotICBhbGxvd3MgZm9yIGJpbmRpbmcg
YW4gRW1iZXIgcHJvcGVydHkgKGBjaGVja2VkYCkgdG8gdGhlIHN0YXR1cyBvZiB0aGUKLSAgY2hl
Y2tib3guCisgICAgICAgIGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgeworICAgICAgICAg
IGlmIChxdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF+dmFsaWRRdWVyeVBhcmFt
cy5pbmRleE9mKGtleSkpIHsKKyAgICAgICAgICAgIG1pc3NpbmdQYXJhbXMucHVzaChrZXkpOwor
ICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gIEV4YW1wbGU6CisgICAgICAgIGlmIChtaXNzaW5n
UGFyYW1zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICB2YXIgZXJyID0gJ1lvdSBzdXBwbGllZCB0
aGUgcGFyYW1zICc7CisgICAgICAgICAgZXJyICs9IG1pc3NpbmdQYXJhbXMubWFwKGZ1bmN0aW9u
KHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gJyInICsgcGFyYW0gKyAiPSIgKyBxdWVyeVBh
cmFtc1twYXJhbV0gKyAnIic7CisgICAgICAgICAgfSkuam9pbignIGFuZCAnKTsKIAotICBgYGBo
YW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5DaGVja2JveCBjaGVja2VkQmluZGluZz0icmVjZWl2
ZUVtYWlsIn19Ci0gIGBgYAorICAgICAgICAgIGVyciArPSAnIHdoaWNoIGFyZSBub3QgdmFsaWQg
Zm9yIHRoZSAiJyArIGhhbmRsZXJOYW1lICsgJyIgaGFuZGxlciBvciBpdHMgcGFyZW50cyc7CiAK
LSAgWW91IGNhbiBhZGQgYSBgbGFiZWxgIHRhZyB5b3Vyc2VsZiBpbiB0aGUgdGVtcGxhdGUgd2hl
cmUgdGhlIGBFbWJlci5DaGVja2JveGAKLSAgaXMgYmVpbmcgdXNlZC4KKyAgICAgICAgICB0aHJv
dyBuZXcgRXJyb3IoZXJyKTsKKyAgICAgICAgfQogCi0gIGBgYGh0bWwKLSAgPGxhYmVsPgotICAg
IHt7dmlldyBFbWJlci5DaGVja2JveCBjbGFzc05hbWVzPSJhcHBsaWNhdG9uLXNwZWNpZmljLWNo
ZWNrYm94In19Ci0gICAgU29tZSBUaXRsZQotICA8L2xhYmVsPgotICBgYGAKKyAgICAgICAgcmV0
dXJuIHRoaXMucmVjb2duaXplci5nZW5lcmF0ZShoYW5kbGVyTmFtZSwgcGFyYW1zKTsKKyAgICAg
IH0sCiAKLSAgVGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUgb2YgYW4gYEVtYmVyLkNoZWNrYm94YCBv
YmplY3Qgc2hvdWxkIGFsd2F5cyBiZSBzZXQKLSAgdGhyb3VnaCB0aGUgRW1iZXIgb2JqZWN0IG9y
IGJ5IGludGVyYWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKLSAgcmVwcmVzZW50YXRp
b24gdmlhIHRoZSBtb3VzZSwga2V5Ym9hcmQsIG9yIHRvdWNoLiBVcGRhdGluZyB0aGUgdmFsdWUg
b2YgdGhlCi0gIGNoZWNrYm94IHZpYSBqUXVlcnkgd2lsbCByZXN1bHQgaW4gdGhlIGNoZWNrZWQg
dmFsdWUgb2YgdGhlIG9iamVjdCBhbmQgaXRzCi0gIGVsZW1lbnQgbG9zaW5nIHN5bmNocm9uaXph
dGlvbi4KKyAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbihoYW5kbGVyTmFtZSkgeworICAgICAgICB2
YXIgcGFydGl0aW9uZWRBcmdzICAgPSBleHRyYWN0UXVlcnlQYXJhbXMoc2xpY2UuY2FsbChhcmd1
bWVudHMsIDEpKSwKKyAgICAgICAgICAgIGNvbnRleHRzICAgICAgICAgID0gcGFydGl0aW9uZWRB
cmdzWzBdLAorICAgICAgICAgICAgcXVlcnlQYXJhbXMgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3Nb
MV0sCisgICAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtcyAgPSB7fSwKKyAgICAgICAgICAgIGVm
ZmVjdGl2ZVF1ZXJ5UGFyYW1zID0ge307CiAKLSAgIyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHBy
b3BlcnRpZXMKKyAgICAgICAgdmFyIHRhcmdldEhhbmRsZXJJbmZvcyA9IHRoaXMudGFyZ2V0SGFu
ZGxlckluZm9zLAorICAgICAgICAgICAgZm91bmQgPSBmYWxzZSwgbmFtZXMsIG9iamVjdCwgaGFu
ZGxlckluZm8sIGhhbmRsZXJPYmo7CiAKLSAgQmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMg
YXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBhbmQgYGxheW91dE5hbWVgCi0gIHByb3BlcnRpZXMg
d2lsbCBub3QgYmUgYXBwbGllZC4gU2VlIGBFbWJlci5WaWV3YCdzIGxheW91dCBzZWN0aW9uIGZv
ciBtb3JlCi0gIGluZm9ybWF0aW9uLgorICAgICAgICBpZiAoIXRhcmdldEhhbmRsZXJJbmZvcykg
eyByZXR1cm4gZmFsc2U7IH0KIAotICBAY2xhc3MgQ2hlY2tib3gKLSAgQG5hbWVzcGFjZSBFbWJl
cgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ2hlY2tib3ggPSBFbWJlci5WaWV3
LmV4dGVuZCh7Ci0gIGNsYXNzTmFtZXM6IFsnZW1iZXItY2hlY2tib3gnXSwKKyAgICAgICAgdmFy
IHJlY29nSGFuZGxlcnMgPSB0aGlzLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGFyZ2V0SGFuZGxl
ckluZm9zW3RhcmdldEhhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lKTsKKyAgICAgICAgZm9y
ICh2YXIgaT10YXJnZXRIYW5kbGVySW5mb3MubGVuZ3RoLTE7IGk+PTA7IGktLSkgeworICAgICAg
ICAgIGhhbmRsZXJJbmZvID0gdGFyZ2V0SGFuZGxlckluZm9zW2ldOworICAgICAgICAgIGlmICho
YW5kbGVySW5mby5uYW1lID09PSBoYW5kbGVyTmFtZSkgeyBmb3VuZCA9IHRydWU7IH0KIAotICB0
YWdOYW1lOiAnaW5wdXQnLAorICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgdmFy
IHJlY29nSGFuZGxlciA9IHJlY29nSGFuZGxlcnNbaV07CiAKLSAgYXR0cmlidXRlQmluZGluZ3M6
IFsndHlwZScsICdjaGVja2VkJywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4J10sCisgICAgICAgICAg
ICBtZXJnZShhY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOworICAg
ICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zICE9PSBmYWxzZSkgeworICAgICAgICAgICAgICBtZXJn
ZShlZmZlY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOworICAgICAg
ICAgICAgICBtZXJnZVNvbWVLZXlzKGVmZmVjdGl2ZVF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcywg
cmVjb2dIYW5kbGVyLnF1ZXJ5UGFyYW1zKTsKKyAgICAgICAgICAgIH0KIAotICB0eXBlOiAiY2hl
Y2tib3giLAotICBjaGVja2VkOiBmYWxzZSwKLSAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICAg
ICAgaWYgKGhhbmRsZXJJbmZvLmlzRHluYW1pYyAmJiBjb250ZXh0cy5sZW5ndGggPiAwKSB7Cisg
ICAgICAgICAgICAgIG9iamVjdCA9IGNvbnRleHRzLnBvcCgpOwogCi0gIGluaXQ6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5vbigiY2hhbmdlIiwgdGhpcywgdGhp
cy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKLSAgfSwKKyAgICAgICAgICAgICAgaWYgKGlzUGFyYW0o
b2JqZWN0KSkgeworICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcmVjb2dIYW5kbGVyLm5hbWVz
WzBdOworICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50UGFyYW1zIHx8ICIiICsgb2Jq
ZWN0ICE9PSB0aGlzLmN1cnJlbnRQYXJhbXNbbmFtZV0pIHsgcmV0dXJuIGZhbHNlOyB9CisgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckluZm8uY29udGV4dCAhPT0gb2JqZWN0KSB7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgX3VwZGF0ZUVsZW1lbnRWYWx1ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgc2V0KHRoaXMsICdjaGVja2VkJywgdGhpcy4kKCkucHJvcCgnY2hlY2tl
ZCcpKTsKLSAgfQotfSk7CiAKLX0pKCk7CisgICAgICAgIHJldHVybiBjb250ZXh0cy5sZW5ndGgg
PT09IDAgJiYgZm91bmQgJiYgcXVlcnlQYXJhbXNFcXVhbChhY3RpdmVRdWVyeVBhcmFtcywgZWZm
ZWN0aXZlUXVlcnlQYXJhbXMpOworICAgICAgfSwKIAorICAgICAgdHJpZ2dlcjogZnVuY3Rpb24o
bmFtZSkgeworICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAg
ICAgdHJpZ2dlcih0aGlzLCB0aGlzLmN1cnJlbnRIYW5kbGVySW5mb3MsIGZhbHNlLCBhcmdzKTsK
KyAgICAgIH0sCiAKKyAgICAgIC8qKgorICAgICAgICBIb29rIHBvaW50IGZvciBsb2dnaW5nIHRy
YW5zaXRpb24gc3RhdHVzIHVwZGF0ZXMuCiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBl
bWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLworICAgICAgICBAcGFyYW0ge1N0
cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cuCisgICAgICAqLworICAgICAgbG9nOiBu
dWxsCisgICAgfTsKIAotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OworICAg
IC8qKgorICAgICAgQHByaXZhdGUKIAotLyoqCi0gIFNoYXJlZCBtaXhpbiB1c2VkIGJ5IGBFbWJl
ci5UZXh0RmllbGRgIGFuZCBgRW1iZXIuVGV4dEFyZWFgLgorICAgICAgVXNlZCBpbnRlcm5hbGx5
IGZvciBib3RoIFVSTCBhbmQgbmFtZWQgdHJhbnNpdGlvbiB0byBkZXRlcm1pbmUKKyAgICAgIGEg
c2hhcmVkIHBpdm90IHBhcmVudCByb3V0ZSBhbmQgb3RoZXIgZGF0YSBuZWNlc3NhcnkgdG8gcGVy
Zm9ybQorICAgICAgYSB0cmFuc2l0aW9uLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldE1hdGNo
UG9pbnQocm91dGVyLCBoYW5kbGVycywgb2JqZWN0cywgaW5wdXRQYXJhbXMsIHF1ZXJ5UGFyYW1z
KSB7CisKKyAgICAgIHZhciBtYXRjaFBvaW50ID0gaGFuZGxlcnMubGVuZ3RoLAorICAgICAgICAg
IHByb3ZpZGVkTW9kZWxzID0ge30sIGksCisgICAgICAgICAgY3VycmVudEhhbmRsZXJJbmZvcyA9
IHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zIHx8IFtdLAorICAgICAgICAgIHBhcmFtcyA9IHt9
LAorICAgICAgICAgIG9sZFBhcmFtcyA9IHJvdXRlci5jdXJyZW50UGFyYW1zIHx8IHt9LAorICAg
ICAgICAgIGFjdGl2ZVRyYW5zaXRpb24gPSByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiwKKyAgICAg
ICAgICBoYW5kbGVyUGFyYW1zID0ge30sCisgICAgICAgICAgb2JqOworCisgICAgICBvYmplY3Rz
ID0gc2xpY2UuY2FsbChvYmplY3RzKTsKKyAgICAgIG1lcmdlKHBhcmFtcywgaW5wdXRQYXJhbXMp
OworCisgICAgICBmb3IgKGkgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewor
ICAgICAgICB2YXIgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldLAorICAgICAgICAgICAgaGFuZGxl
ck5hbWUgPSBoYW5kbGVyT2JqLmhhbmRsZXIsCisgICAgICAgICAgICBvbGRIYW5kbGVySW5mbyA9
IGN1cnJlbnRIYW5kbGVySW5mb3NbaV0sCisgICAgICAgICAgICBoYXNDaGFuZ2VkID0gZmFsc2U7
CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgaGFuZGxlciBuYW1lcyBoYXZlIGNoYW5nZWQuCisgICAg
ICAgIGlmICghb2xkSGFuZGxlckluZm8gfHwgb2xkSGFuZGxlckluZm8ubmFtZSAhPT0gaGFuZGxl
ck9iai5oYW5kbGVyKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9CisKKyAgICAgICAgaWYgKGhhbmRs
ZXJPYmouaXNEeW5hbWljKSB7CisgICAgICAgICAgLy8gVVJMIHRyYW5zaXRpb24uCisKKyAgICAg
ICAgICBpZiAob2JqID0gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwg
YWN0aXZlVHJhbnNpdGlvbiwgdHJ1ZSwgcGFyYW1zKSkgeworICAgICAgICAgICAgaGFzQ2hhbmdl
ZCA9IHRydWU7CisgICAgICAgICAgICBwcm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0gPSBvYmo7
CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5h
bWVdID0ge307CisgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGhhbmRsZXJPYmoucGFyYW1z
KSB7CisgICAgICAgICAgICAgIGlmICghaGFuZGxlck9iai5wYXJhbXMuaGFzT3duUHJvcGVydHko
cHJvcCkpIHsgY29udGludWU7IH0KKyAgICAgICAgICAgICAgdmFyIG5ld1BhcmFtID0gaGFuZGxl
ck9iai5wYXJhbXNbcHJvcF07CisgICAgICAgICAgICAgIGlmIChvbGRQYXJhbXNbcHJvcF0gIT09
IG5ld1BhcmFtKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9CisgICAgICAgICAgICAgIGhhbmRsZXJQ
YXJhbXNbaGFuZGxlck5hbWVdW3Byb3BdID0gcGFyYW1zW3Byb3BdID0gbmV3UGFyYW07CisgICAg
ICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJPYmouaGFz
T3duUHJvcGVydHkoJ25hbWVzJykpIHsKKyAgICAgICAgICAvLyBOYW1lZCB0cmFuc2l0aW9uLgog
Ci0gIEBjbGFzcyBUZXh0U3VwcG9ydAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVt
YmVyLk1peGluCi0gIEBwcml2YXRlCi0qLwotRW1iZXIuVGV4dFN1cHBvcnQgPSBFbWJlci5NaXhp
bi5jcmVhdGUoewotICB2YWx1ZTogIiIsCisgICAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoKSB7
IGhhc0NoYW5nZWQgPSB0cnVlOyB9CiAKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsncGxhY2Vob2xk
ZXInLCAnZGlzYWJsZWQnLCAnbWF4bGVuZ3RoJywgJ3RhYmluZGV4J10sCi0gIHBsYWNlaG9sZGVy
OiBudWxsLAotICBkaXNhYmxlZDogZmFsc2UsCi0gIG1heGxlbmd0aDogbnVsbCwKKyAgICAgICAg
ICBpZiAob2JqID0gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0
aXZlVHJhbnNpdGlvbiwgaGFuZGxlck9iai5uYW1lc1swXSwgcGFyYW1zKSkgeworICAgICAgICAg
ICAgcHJvdmlkZWRNb2RlbHNbaGFuZGxlck5hbWVdID0gb2JqOworICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICB2YXIgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOworICAgICAgICAgICAg
aGFuZGxlclBhcmFtc1toYW5kbGVyTmFtZV0gPSB7fTsKKyAgICAgICAgICAgIGZvciAodmFyIGog
PSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGogPCBsZW47ICsraikgeworICAgICAgICAgICAgICB2
YXIgbmFtZSA9IG5hbWVzW2pdOworICAgICAgICAgICAgICBoYW5kbGVyUGFyYW1zW2hhbmRsZXJO
YW1lXVtuYW1lXSA9IHBhcmFtc1tuYW1lXSA9IHBhcmFtc1tuYW1lXSB8fCBvbGRQYXJhbXNbbmFt
ZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgaW5zZXJ0TmV3
bGluZTogRW1iZXIuSywKLSAgY2FuY2VsOiBFbWJlci5LLAorICAgICAgICAvLyBJZiB0aGVyZSBp
cyBhbiBvbGQgaGFuZGxlciwgc2VlIGlmIHF1ZXJ5IHBhcmFtcyBhcmUgdGhlIHNhbWUuIElmIHRo
ZXJlIGlzbid0IGFuIG9sZCBoYW5kbGVyLAorICAgICAgICAvLyBoYXNDaGFuZ2VkIHdpbGwgYWxy
ZWFkeSBiZSB0cnVlIGhlcmUKKyAgICAgICAgaWYob2xkSGFuZGxlckluZm8gJiYgIXF1ZXJ5UGFy
YW1zRXF1YWwob2xkSGFuZGxlckluZm8ucXVlcnlQYXJhbXMsIGhhbmRsZXJPYmoucXVlcnlQYXJh
bXMpKSB7CisgICAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQogCi0gIGlu
aXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5vbigiZm9jdXNP
dXQiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImNo
YW5nZSIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigi
cGFzdGUiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24o
ImN1dCIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigi
aW5wdXQiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24o
ImtleVVwIiwgdGhpcywgdGhpcy5pbnRlcnByZXRLZXlFdmVudHMpOwotICB9LAorICAgICAgICBp
ZiAoaGFzQ2hhbmdlZCkgeyBtYXRjaFBvaW50ID0gaTsgfQorICAgICAgfQogCi0gIGludGVycHJl
dEtleUV2ZW50czogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuVGV4dFN1
cHBvcnQuS0VZX0VWRU5UUzsKLSAgICB2YXIgbWV0aG9kID0gbWFwW2V2ZW50LmtleUNvZGVdOwor
ICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID4gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3Io
Ik1vcmUgY29udGV4dCBvYmplY3RzIHdlcmUgcGFzc2VkIHRoYW4gdGhlcmUgYXJlIGR5bmFtaWMg
c2VnbWVudHMgZm9yIHRoZSByb3V0ZTogIiArIGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFd
LmhhbmRsZXIpOworICAgICAgfQogCi0gICAgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKCk7
Ci0gICAgaWYgKG1ldGhvZCkgeyByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50KTsgfQotICB9LAor
ICAgICAgdmFyIHBpdm90SGFuZGxlckluZm8gPSBjdXJyZW50SGFuZGxlckluZm9zW21hdGNoUG9p
bnQgLSAxXSwKKyAgICAgICAgICBwaXZvdEhhbmRsZXIgPSBwaXZvdEhhbmRsZXJJbmZvICYmIHBp
dm90SGFuZGxlckluZm8uaGFuZGxlcjsKIAotICBfZWxlbWVudFZhbHVlRGlkQ2hhbmdlOiBmdW5j
dGlvbigpIHsKLSAgICBzZXQodGhpcywgJ3ZhbHVlJywgdGhpcy4kKCkudmFsKCkpOwotICB9Cisg
ICAgICByZXR1cm4geyBtYXRjaFBvaW50OiBtYXRjaFBvaW50LCBwcm92aWRlZE1vZGVsczogcHJv
dmlkZWRNb2RlbHMsIHBhcmFtczogcGFyYW1zLCBoYW5kbGVyUGFyYW1zOiBoYW5kbGVyUGFyYW1z
LCBwaXZvdEhhbmRsZXI6IHBpdm90SGFuZGxlciB9OworICAgIH0KIAotfSk7CisgICAgZnVuY3Rp
b24gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNp
dGlvbiwgcGFyYW1OYW1lLCBwYXJhbXMpIHsKIAotRW1iZXIuVGV4dFN1cHBvcnQuS0VZX0VWRU5U
UyA9IHsKLSAgMTM6ICdpbnNlcnROZXdsaW5lJywKLSAgMjc6ICdjYW5jZWwnCi19OworICAgICAg
aWYgKG9iamVjdHMubGVuZ3RoICYmIHBhcmFtTmFtZSkgewogCi19KSgpOworICAgICAgICB2YXIg
b2JqZWN0ID0gb2JqZWN0cy5wb3AoKTsKIAorICAgICAgICAvLyBJZiBwcm92aWRlZCBvYmplY3Qg
aXMgc3RyaW5nIG9yIG51bWJlciwgdHJlYXQgYXMgcGFyYW0uCisgICAgICAgIGlmIChpc1BhcmFt
KG9iamVjdCkpIHsKKyAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IG9iamVjdC50b1N0cmlu
ZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAg
IH0KKyAgICAgIH0gZWxzZSBpZiAoYWN0aXZlVHJhbnNpdGlvbikgeworICAgICAgICAvLyBVc2Ug
bW9kZWwgZnJvbSBwcmV2aW91cyB0cmFuc2l0aW9uIGF0dGVtcHQsIHByZWZlcmFibHkgdGhlIHJl
c29sdmVkIG9uZS4KKyAgICAgICAgcmV0dXJuIGFjdGl2ZVRyYW5zaXRpb24ucmVzb2x2ZWRNb2Rl
bHNbaGFuZGxlck5hbWVdIHx8CisgICAgICAgICAgICAgICAocGFyYW1OYW1lICYmIGFjdGl2ZVRy
YW5zaXRpb24ucHJvdmlkZWRNb2RlbHNbaGFuZGxlck5hbWVdKTsKKyAgICAgIH0KKyAgICB9CiAK
KyAgICBmdW5jdGlvbiBpc1BhcmFtKG9iamVjdCkgeworICAgICAgcmV0dXJuICh0eXBlb2Ygb2Jq
ZWN0ID09PSAic3RyaW5nIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIG9i
amVjdCA9PT0gIm51bWJlciIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKTsKKyAgICB9CiAK
LShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5k
bGViYXJzCi0qLwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CiAKLS8q
KgotICBUaGUgYEVtYmVyLlRleHRGaWVsZGAgdmlldyBjbGFzcyByZW5kZXJzIGEgdGV4dAotICBb
aW5wdXRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxlbWVudC9JbnB1
dCkgZWxlbWVudC4gSXQKLSAgYWxsb3dzIGZvciBiaW5kaW5nIEVtYmVyIHByb3BlcnRpZXMgdG8g
dGhlIHRleHQgZmllbGQgY29udGVudHMgKGB2YWx1ZWApLAotICBsaXZlLXVwZGF0aW5nIGFzIHRo
ZSB1c2VyIGlucHV0cyB0ZXh0LgorICAgIC8qKgorICAgICAgQHByaXZhdGUKIAotICBFeGFtcGxl
OgorICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBoYW5kbGVyIG5hbWUgYW5kIHJldHVybnMgYSBs
aXN0IG9mIHF1ZXJ5IHBhcmFtcworICAgICAgdGhhdCBhcmUgdmFsaWQgdG8gcGFzcyB0byB0aGUg
aGFuZGxlciBvciBpdHMgcGFyZW50cwogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t2aWV3IEVtYmVy
LlRleHRGaWVsZCB2YWx1ZUJpbmRpbmc9ImZpcnN0TmFtZSJ9fQotICBgYGAKKyAgICAgIEBwYXJh
bSB7Um91dGVyfSByb3V0ZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBoYW5kbGVyTmFtZQorICAg
ICAgQHJldHVybiB7QXJyYXlbU3RyaW5nXX0gYSBsaXN0IG9mIHF1ZXJ5IHBhcmFtZXRlcnMKKyAg
ICAqLworICAgIGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zRm9ySGFuZGxlcihyb3V0ZXIsIGhhbmRsZXJO
YW1lKSB7CisgICAgICB2YXIgaGFuZGxlcnMgPSByb3V0ZXIucmVjb2duaXplci5oYW5kbGVyc0Zv
cihoYW5kbGVyTmFtZSksCisgICAgICAgIHF1ZXJ5UGFyYW1zID0gW107CiAKLSAgIyMgTGF5b3V0
IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFu
ZGxlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcXVlcnlQYXJhbXMucHVzaC5hcHBseShxdWVy
eVBhcmFtcywgaGFuZGxlcnNbaV0ucXVlcnlQYXJhbXMgfHwgW10pOworICAgICAgfQogCi0gIEJl
Y2F1c2UgSFRNTCBgaW5wdXRgIGVsZW1lbnRzIGFyZSBzZWxmIGNsb3NpbmcgYGxheW91dGAgYW5k
IGBsYXlvdXROYW1lYAotICBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBgRW1i
ZXIuVmlld2AncyBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZQotICBpbmZvcm1hdGlvbi4KKyAgICAg
IHJldHVybiBxdWVyeVBhcmFtczsKKyAgICB9CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQogCi0g
ICMjIEhUTUwgQXR0cmlidXRlcworICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBoYW5kbGVyIG5h
bWUgYW5kIGEgbGlzdCBvZiBjb250ZXh0cyBhbmQgcmV0dXJucworICAgICAgYSBzZXJpYWxpemVk
IHBhcmFtZXRlciBoYXNoIHN1aXRhYmxlIHRvIHBhc3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJhdGUo
KWAuCiAKLSAgQnkgZGVmYXVsdCBgRW1iZXIuVGV4dEZpZWxkYCBwcm92aWRlcyBzdXBwb3J0IGZv
ciBgdHlwZWAsIGB2YWx1ZWAsIGBzaXplYCwKLSAgYHBsYWNlaG9sZGVyYCwgYGRpc2FibGVkYCwg
YG1heGxlbmd0aGAgYW5kIGB0YWJpbmRleGAgYXR0cmlidXRlcyBvbiBhCi0gIHRlc3QgZmllbGQu
IElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgbW9yZSBhdHRyaWJ1dGVzIGhhdmUgYSBsb29rIGF0IHRo
ZQotICBgYXR0cmlidXRlQmluZGluZ3NgIHByb3BlcnR5IGluIGBFbWJlci5WaWV3YCdzIEhUTUwg
QXR0cmlidXRlcyBzZWN0aW9uLgorICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgorICAgICAg
QHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCisgICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19
IG9iamVjdHMKKyAgICAgIEByZXR1cm4ge09iamVjdH0gYSBzZXJpYWxpemVkIHBhcmFtZXRlciBo
YXNoCisgICAgKi8KKyAgICBmdW5jdGlvbiBwYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxl
ck5hbWUsIG9iamVjdHMsIHF1ZXJ5UGFyYW1zKSB7CisKKyAgICAgIHZhciBoYW5kbGVycyA9IHJv
dXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKKyAgICAgICAgICBwYXJh
bXMgPSB7fSwKKyAgICAgICAgICBoYW5kbGVySW5mb3MgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dp
dGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBhcmFtcyksCisgICAgICAgICAg
bWF0Y2hQb2ludCA9IGdldE1hdGNoUG9pbnQocm91dGVyLCBoYW5kbGVySW5mb3MsIG9iamVjdHMp
Lm1hdGNoUG9pbnQsCisgICAgICAgICAgbWVyZ2VkUXVlcnlQYXJhbXMgPSB7fSwKKyAgICAgICAg
ICBvYmplY3QsIGhhbmRsZXJPYmosIGhhbmRsZXIsIG5hbWVzLCBpOworCisgICAgICBwYXJhbXMu
cXVlcnlQYXJhbXMgPSB7fTsKKworICAgICAgZm9yIChpPTA7IGk8aGFuZGxlcnMubGVuZ3RoOyBp
KyspIHsKKyAgICAgICAgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldOworICAgICAgICBoYW5kbGVy
ID0gcm91dGVyLmdldEhhbmRsZXIoaGFuZGxlck9iai5oYW5kbGVyKTsKKyAgICAgICAgbmFtZXMg
PSBoYW5kbGVyT2JqLm5hbWVzOworCisgICAgICAgIC8vIElmIGl0J3MgYSBkeW5hbWljIHNlZ21l
bnQKKyAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCkgeworICAgICAgICAgIC8vIElmIHdlIGhhdmUg
b2JqZWN0cywgdXNlIHRoZW0KKyAgICAgICAgICBpZiAoaSA+PSBtYXRjaFBvaW50KSB7CisgICAg
ICAgICAgICBvYmplY3QgPSBvYmplY3RzLnNoaWZ0KCk7CisgICAgICAgICAgLy8gT3RoZXJ3aXNl
IHVzZSBleGlzdGluZyBjb250ZXh0CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9i
amVjdCA9IGhhbmRsZXIuY29udGV4dDsKKyAgICAgICAgICB9CiAKLSAgVG8gZ2xvYmFsbHkgYWRk
IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB5b3UgY2FuIHJlb3BlbgotICBgRW1i
ZXIuVGV4dEZpZWxkYCBvciBgRW1iZXIuVGV4dFN1cHBvcnRgLgorICAgICAgICAgIC8vIFNlcmlh
bGl6ZSB0byBnZW5lcmF0ZSBwYXJhbXMKKyAgICAgICAgICBtZXJnZShwYXJhbXMsIHNlcmlhbGl6
ZShoYW5kbGVyLCBvYmplY3QsIG5hbWVzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5
UGFyYW1zICE9PSBmYWxzZSkgeworICAgICAgICAgIG1lcmdlU29tZUtleXMocGFyYW1zLnF1ZXJ5
UGFyYW1zLCByb3V0ZXIuY3VycmVudFF1ZXJ5UGFyYW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1z
KTsKKyAgICAgICAgICBtZXJnZVNvbWVLZXlzKHBhcmFtcy5xdWVyeVBhcmFtcywgcXVlcnlQYXJh
bXMsIGhhbmRsZXJPYmoucXVlcnlQYXJhbXMpOworICAgICAgICB9CisgICAgICB9CiAKLSAgYGBg
amF2YXNjcmlwdAotICBFbWJlci5UZXh0U3VwcG9ydC5yZW9wZW4oewotICAgIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbInJlcXVpcmVkIl0KLSAgfSkKLSAgYGBgCisgICAgICBpZiAocXVlcnlQYXJhbXNF
cXVhbChwYXJhbXMucXVlcnlQYXJhbXMsIHt9KSkgeyBkZWxldGUgcGFyYW1zLnF1ZXJ5UGFyYW1z
OyB9CisgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KIAotICBAY2xhc3MgVGV4dEZpZWxkCi0g
IEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuVmlldwotICBAdXNlcyBFbWJlci5U
ZXh0U3VwcG9ydAotKi8KLUVtYmVyLlRleHRGaWVsZCA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVy
LlRleHRTdXBwb3J0LAotICAvKiogQHNjb3BlIEVtYmVyLlRleHRGaWVsZC5wcm90b3R5cGUgKi8g
eworICAgIGZ1bmN0aW9uIG1lcmdlKGhhc2gsIG90aGVyKSB7CisgICAgICBmb3IgKHZhciBwcm9w
IGluIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBo
YXNoW3Byb3BdID0gb3RoZXJbcHJvcF07IH0KKyAgICAgIH0KKyAgICB9CiAKLSAgY2xhc3NOYW1l
czogWydlbWJlci10ZXh0LWZpZWxkJ10sCi0gIHRhZ05hbWU6ICJpbnB1dCIsCi0gIGF0dHJpYnV0
ZUJpbmRpbmdzOiBbJ3R5cGUnLCAndmFsdWUnLCAnc2l6ZScsICdwYXR0ZXJuJ10sCisgICAgZnVu
Y3Rpb24gbWVyZ2VTb21lS2V5cyhoYXNoLCBvdGhlciwga2V5cykgeworICAgICAgaWYgKCFvdGhl
ciB8fCAha2V5cykgeyByZXR1cm47IH0KKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBrZXlzLmxl
bmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldLCB2YWx1ZTsKKyAgICAgICAg
aWYob3RoZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICAgIHZhbHVlID0gb3RoZXJb
a2V5XTsKKyAgICAgICAgICBpZih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwg
dHlwZW9mIHZhbHVlID09PSAidW5kZWZpbmVkIikgeworICAgICAgICAgICAgZGVsZXRlIGhhc2hb
a2V5XTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFzaFtrZXldID0gb3RoZXJb
a2V5XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKLSAgLyoqCi0g
ICAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBpbnB1dCBlbGVtZW50LiBBcyB0aGUgdXNl
ciBpbnB1dHMgdGV4dCwgdGhpcwotICAgIHByb3BlcnR5IGlzIHVwZGF0ZWQgbGl2ZS4KKyAgICAv
KioKKyAgICAgIEBwcml2YXRlCisgICAgKi8KIAotICAgIEBwcm9wZXJ0eSB2YWx1ZQotICAgIEB0
eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICIiCi0gICovCi0gIHZhbHVlOiAiIiwKKyAgICBmdW5j
dGlvbiBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJz
LCBxdWVyeVBhcmFtcykgeworICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IFtdOwogCi0gIC8qKgot
ICAgIFRoZSBgdHlwZWAgYXR0cmlidXRlIG9mIHRoZSBpbnB1dCBlbGVtZW50LgorICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgaGFu
ZGxlciA9IGhhbmRsZXJzW2ldLAorICAgICAgICAgIGhhbmRsZXJJbmZvID0geyBoYW5kbGVyOiBo
YW5kbGVyLmhhbmRsZXIsIG5hbWVzOiBoYW5kbGVyLm5hbWVzLCBjb250ZXh0OiBoYW5kbGVyLmNv
bnRleHQsIGlzRHluYW1pYzogaGFuZGxlci5pc0R5bmFtaWMgfSwKKyAgICAgICAgICBhY3RpdmVR
dWVyeVBhcmFtcyA9IHt9OwogCi0gICAgQHByb3BlcnR5IHR5cGUKLSAgICBAdHlwZSBTdHJpbmcK
LSAgICBAZGVmYXVsdCAidGV4dCIKLSAgKi8KLSAgdHlwZTogInRleHQiLAorICAgICAgICBpZiAo
cXVlcnlQYXJhbXMgIT09IGZhbHNlKSB7CisgICAgICAgICAgbWVyZ2VTb21lS2V5cyhhY3RpdmVR
dWVyeVBhcmFtcywgcm91dGVyLmN1cnJlbnRRdWVyeVBhcmFtcywgaGFuZGxlci5xdWVyeVBhcmFt
cyk7CisgICAgICAgICAgbWVyZ2VTb21lS2V5cyhhY3RpdmVRdWVyeVBhcmFtcywgcXVlcnlQYXJh
bXMsIGhhbmRsZXIucXVlcnlQYXJhbXMpOworICAgICAgICB9CiAKLSAgLyoqCi0gICAgVGhlIGBz
aXplYCBvZiB0aGUgdGV4dCBmaWVsZCBpbiBjaGFyYWN0ZXJzLgorICAgICAgICBpZiAoaGFuZGxl
ci5xdWVyeVBhcmFtcyAmJiBoYW5kbGVyLnF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHsKKyAgICAg
ICAgICBoYW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOworICAgICAg
ICB9CiAKLSAgICBAcHJvcGVydHkgc2l6ZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0
IG51bGwKLSAgKi8KLSAgc2l6ZTogbnVsbCwKKyAgICAgICAgaGFuZGxlckluZm9zLnB1c2goaGFu
ZGxlckluZm8pOworICAgICAgfQogCi0gIC8qKgotICAgIFRoZSBgcGF0dGVybmAgdGhlIHBhdHRl
cm4gYXR0cmlidXRlIG9mIGlucHV0IGVsZW1lbnQuCisgICAgICByZXR1cm4gaGFuZGxlckluZm9z
OworICAgIH0KIAotICAgIEBwcm9wZXJ0eSBwYXR0ZXJuCi0gICAgQHR5cGUgU3RyaW5nCi0gICAg
QGRlZmF1bHQgbnVsbAotICAqLwotICBwYXR0ZXJuOiBudWxsLAorICAgIC8qKgorICAgICAgQHBy
aXZhdGUKKyAgICAqLworICAgIGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5UGFyYW1UcmFuc2l0aW9uKHJv
dXRlciwgcXVlcnlQYXJhbXMsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAgICB2YXIgY3VycmVudEhh
bmRsZXJzID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsCisgICAgICAgICAgY3VycmVudEhh
bmRsZXIgPSBjdXJyZW50SGFuZGxlcnNbY3VycmVudEhhbmRsZXJzLmxlbmd0aCAtIDFdLAorICAg
ICAgICAgIG5hbWUgPSBjdXJyZW50SGFuZGxlci5uYW1lOwogCi0gIC8qKgotICAgIFRoZSBhY3Rp
b24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHJldHVybiBrZXkuCisgICAg
ICBsb2cocm91dGVyLCAiQXR0ZW1wdGluZyBxdWVyeSBwYXJhbSB0cmFuc2l0aW9uIik7CiAKLSAg
ICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBmaXJl
ZCB3aGVuCi0gICAgdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSB3aGVuIGVkaXRpbmcg
YSB0ZXh0IGZpZWxkLCBhbmQgc2VuZHMKLSAgICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGFzIHRo
ZSBjb250ZXh0LgorICAgICAgcmV0dXJuIGNyZWF0ZU5hbWVkVHJhbnNpdGlvbihyb3V0ZXIsIFtu
YW1lLCBxdWVyeVBhcmFtc10sIGlzSW50ZXJtZWRpYXRlKTsKKyAgICB9CiAKLSAgIEBwcm9wZXJ0
eSBhY3Rpb24KLSAgIEB0eXBlIFN0cmluZwotICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBhY3Rp
b246IG51bGwsCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZnVuY3Rpb24g
Y3JlYXRlTmFtZWRUcmFuc2l0aW9uKHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlhdGUpIHsKKyAg
ICAgIHZhciBwYXJ0aXRpb25lZEFyZ3MgICAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKGFyZ3MpLAor
ICAgICAgICBwdXJlQXJncyAgICAgICAgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3NbMF0sCisgICAg
ICAgIHF1ZXJ5UGFyYW1zICAgICAgICAgICA9IHBhcnRpdGlvbmVkQXJnc1sxXSwKKyAgICAgICAg
aGFuZGxlcnMgICAgICAgICAgICAgID0gcm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IocHVy
ZUFyZ3NbMF0pLAorICAgICAgICBoYW5kbGVySW5mb3MgICAgICAgICAgPSBnZW5lcmF0ZUhhbmRs
ZXJJbmZvc1dpdGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBhcmFtcyk7CiAK
LSAgLyoqCi0gICAgV2hldGhlciB0aGV5IGBrZXlVcGAgZXZlbnQgdGhhdCB0cmlnZ2VycyBhbiBg
YWN0aW9uYCB0byBiZSBzZW50IGNvbnRpbnVlcwotICAgIHByb3BhZ2F0aW5nIHRvIG90aGVyIHZp
ZXdzLgogCi0gICAgQnkgZGVmYXVsdCwgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4g
a2V5IG9uIHRoZWlyIGtleWJvYXJkIGFuZAotICAgIHRoZSB0ZXh0IGZpZWxkIGhhcyBhbiBgYWN0
aW9uYCBzZXQsIHRoZSBhY3Rpb24gd2lsbCBiZSBzZW50IHRvIHRoZSB2aWV3J3MKLSAgICBjb250
cm9sbGVyIGFuZCB0aGUga2V5IGV2ZW50IHdpbGwgc3RvcCBwcm9wYWdhdGluZy4KKyAgICAgIGxv
Zyhyb3V0ZXIsICJBdHRlbXB0aW5nIHRyYW5zaXRpb24gdG8gIiArIHB1cmVBcmdzWzBdKTsKIAot
ICAgIElmIHlvdSB3b3VsZCBsaWtlIHBhcmVudCB2aWV3cyB0byByZWNlaXZlIHRoZSBga2V5VXBg
IGV2ZW50IGV2ZW4gYWZ0ZXIgYW4KLSAgICBhY3Rpb24gaGFzIGJlZW4gZGlzcGF0Y2hlZCwgc2V0
IGBidWJibGVzYCB0byB0cnVlLgorICAgICAgcmV0dXJuIHBlcmZvcm1UcmFuc2l0aW9uKHJvdXRl
ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW5mb3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UuY2FsbChwdXJlQXJncywgMSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyLmN1cnJlbnRQYXJhbXMsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ludGVybWVk
aWF0ZSk7CisgICAgfQogCi0gICAgQHByb3BlcnR5IGJ1YmJsZXMKLSAgICBAdHlwZSBCb29sZWFu
Ci0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgYnViYmxlczogZmFsc2UsCisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZnVuY3Rpb24gY3JlYXRlVVJMVHJhbnNpdGlvbihy
b3V0ZXIsIHVybCwgaXNJbnRlcm1lZGlhdGUpIHsKKyAgICAgIHZhciByZXN1bHRzID0gcm91dGVy
LnJlY29nbml6ZXIucmVjb2duaXplKHVybCksCisgICAgICAgICAgY3VycmVudEhhbmRsZXJJbmZv
cyA9IHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zLAorICAgICAgICAgIHF1ZXJ5UGFyYW1zID0g
e30sCisgICAgICAgICAgaSwgbGVuOwogCi0gIGluc2VydE5ld2xpbmU6IGZ1bmN0aW9uKGV2ZW50
KSB7Ci0gICAgdmFyIGNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSwKLSAgICAg
ICAgYWN0aW9uID0gZ2V0KHRoaXMsICdhY3Rpb24nKTsKKyAgICAgIGxvZyhyb3V0ZXIsICJBdHRl
bXB0aW5nIFVSTCB0cmFuc2l0aW9uIHRvICIgKyB1cmwpOwogCi0gICAgaWYgKGFjdGlvbikgewot
ICAgICAgY29udHJvbGxlci5zZW5kKGFjdGlvbiwgZ2V0KHRoaXMsICd2YWx1ZScpLCB0aGlzKTsK
KyAgICAgIGlmIChyZXN1bHRzKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHJvdXRlIGlz
IGFjdHVhbGx5IGFjY2Vzc2libGUgYnkgVVJMLgorICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBy
ZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAKLSAgICAgIGlmICghZ2V0KHRoaXMsICdi
dWJibGVzJykpIHsKLSAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgICAgICAg
aWYgKHJvdXRlci5nZXRIYW5kbGVyKHJlc3VsdHNbaV0uaGFuZGxlcikuaW5hY2Nlc3NpYmxlQnlV
UkwpIHsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBudWxsOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICB9Ci19KTsKLQotfSkoKTsK
LQogCisgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yVHJhbnNpdGlv
bihyb3V0ZXIsIG5ldyBSb3V0ZXIuVW5yZWNvZ25pemVkVVJMRXJyb3IodXJsKSk7CisgICAgICB9
CiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1o
YW5kbGViYXJzCi0qLworICAgICAgZm9yKGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsgaSA8
IGxlbjsgaSsrKSB7CisgICAgICAgIG1lcmdlKHF1ZXJ5UGFyYW1zLCByZXN1bHRzW2ldLnF1ZXJ5
UGFyYW1zKTsKKyAgICAgIH0KIAotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OworICAgICAgcmV0dXJuIHBlcmZvcm1UcmFuc2l0aW9uKHJvdXRlciwgcmVzdWx0cywgW10sIHt9
LCBxdWVyeVBhcmFtcywgbnVsbCwgaXNJbnRlcm1lZGlhdGUpOworICAgIH0KIAotLyoqCi0gIEBj
bGFzcyBCdXR0b24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0g
IEB1c2VzIEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQKLSAgQGRlcHJlY2F0ZWQKLSovCi1FbWJl
ci5CdXR0b24gPSBFbWJlci5WaWV3LmV4dGVuZChFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7
Ci0gIGNsYXNzTmFtZXM6IFsnZW1iZXItYnV0dG9uJ10sCi0gIGNsYXNzTmFtZUJpbmRpbmdzOiBb
J2lzQWN0aXZlJ10sCiAKLSAgdGFnTmFtZTogJ2J1dHRvbicsCisgICAgLyoqCisgICAgICBAcHJp
dmF0ZQogCi0gIHByb3BhZ2F0ZUV2ZW50czogZmFsc2UsCisgICAgICBUYWtlcyBhbiBBcnJheSBv
ZiBgSGFuZGxlckluZm9gcywgZmlndXJlcyBvdXQgd2hpY2ggb25lcyBhcmUKKyAgICAgIGV4aXRp
bmcsIGVudGVyaW5nLCBvciBjaGFuZ2luZyBjb250ZXh0cywgYW5kIGNhbGxzIHRoZQorICAgICAg
cHJvcGVyIGhhbmRsZXIgaG9va3MuCiAKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZScsICdk
aXNhYmxlZCcsICdocmVmJywgJ3RhYmluZGV4J10sCisgICAgICBGb3IgZXhhbXBsZSwgY29uc2lk
ZXIgdGhlIGZvbGxvd2luZyB0cmVlIG9mIGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgaXMKKyAgICAg
IGZvbGxvd2VkIGJ5IHRoZSBVUkwgc2VnbWVudCBpdCBoYW5kbGVzLgogCi0gIC8qKgotICAgIEBw
cml2YXRlCisgICAgICBgYGAKKyAgICAgIHx+aW5kZXggKCIvIikKKyAgICAgIHwgfH5wb3N0cyAo
Ii9wb3N0cyIpCisgICAgICB8IHwgfC1zaG93UG9zdCAoIi86aWQiKQorICAgICAgfCB8IHwtbmV3
UG9zdCAoIi9uZXciKQorICAgICAgfCB8IHwtZWRpdFBvc3QgKCIvZWRpdCIpCisgICAgICB8IHx+
YWJvdXQgKCIvYWJvdXQvOmlkIikKKyAgICAgIGBgYAogCi0gICAgT3ZlcnJpZGVzIGBUYXJnZXRB
Y3Rpb25TdXBwb3J0YCdzIGB0YXJnZXRPYmplY3RgIGNvbXB1dGVkCi0gICAgcHJvcGVydHkgdG8g
dXNlIEhhbmRsZWJhcnMtc3BlY2lmaWMgcGF0aCByZXNvbHV0aW9uLgorICAgICAgQ29uc2lkZXIg
dGhlIGZvbGxvd2luZyB0cmFuc2l0aW9uczoKIAotICAgIEBwcm9wZXJ0eSB0YXJnZXRPYmplY3QK
LSAgKi8KLSAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2
YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAgICAgICAgcm9vdCA9IGdldCh0aGlz
LCAnY29udGV4dCcpLAotICAgICAgICBkYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsK
KyAgICAgIDEuIEEgVVJMIHRyYW5zaXRpb24gdG8gYC9wb3N0cy8xYC4KKyAgICAgICAgIDEuIFRy
aWdnZXJzIHRoZSBgKm1vZGVsYCBjYWxsYmFja3Mgb24gdGhlCisgICAgICAgICAgICBgaW5kZXhg
LCBgcG9zdHNgLCBhbmQgYHNob3dQb3N0YCBoYW5kbGVycworICAgICAgICAgMi4gVHJpZ2dlcnMg
dGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gdGhlIHNhbWUKKyAgICAgICAgIDMuIFRyaWdnZXJzIHRo
ZSBgc2V0dXBgIGNhbGxiYWNrIG9uIHRoZSBzYW1lCisgICAgICAyLiBBIGRpcmVjdCB0cmFuc2l0
aW9uIHRvIGBuZXdQb3N0YAorICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBleGl0YCBjYWxsYmFj
ayBvbiBgc2hvd1Bvc3RgCisgICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFj
ayBvbiBgbmV3UG9zdGAKKyAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNr
IG9uIGBuZXdQb3N0YAorICAgICAgMy4gQSBkaXJlY3QgdHJhbnNpdGlvbiB0byBgYWJvdXRgIHdp
dGggYSBzcGVjaWZpZWQKKyAgICAgICAgIGNvbnRleHQgb2JqZWN0CisgICAgICAgICAxLiBUcmln
Z2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAgICAgICAgICAgYW5kIGBw
b3N0c2AKKyAgICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgc2VyaWFsaXplYCBjYWxsYmFjayBvbiBg
YWJvdXRgCisgICAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgYWJv
dXRgCisgICAgICAgICA0LiBUcmlnZ2VycyB0aGUgYHNldHVwYCBjYWxsYmFjayBvbiBgYWJvdXRg
CiAKLSAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuIHRhcmdldDsg
fQorICAgICAgQHBhcmFtIHtUcmFuc2l0aW9ufSB0cmFuc2l0aW9uCisgICAgICBAcGFyYW0ge0Fy
cmF5W0hhbmRsZXJJbmZvXX0gaGFuZGxlckluZm9zCisgICAgKi8KKyAgICBmdW5jdGlvbiBzZXR1
cENvbnRleHRzKHRyYW5zaXRpb24sIGhhbmRsZXJJbmZvcykgeworICAgICAgdmFyIHJvdXRlciA9
IHRyYW5zaXRpb24ucm91dGVyLAorICAgICAgICAgIHBhcnRpdGlvbiA9IHBhcnRpdGlvbkhhbmRs
ZXJzKHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zIHx8IFtdLCBoYW5kbGVySW5mb3MpOwogCi0g
ICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHJvb3QsIHRhcmdldCwgeyBkYXRhOiBkYXRh
IH0pOwotICB9KS5wcm9wZXJ0eSgndGFyZ2V0JyksCisgICAgICByb3V0ZXIudGFyZ2V0SGFuZGxl
ckluZm9zID0gaGFuZGxlckluZm9zOwogCi0gIC8vIERlZmF1bHRzIHRvICdidXR0b24nIGlmIHRh
Z05hbWUgaXMgJ2lucHV0JyBvciAnYnV0dG9uJwotICB0eXBlOiBFbWJlci5jb21wdXRlZChmdW5j
dGlvbihrZXkpIHsKLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZTsKLSAgICBpZiAodGFn
TmFtZSA9PT0gJ2lucHV0JyB8fCB0YWdOYW1lID09PSAnYnV0dG9uJykgeyByZXR1cm4gJ2J1dHRv
bic7IH0KLSAgfSksCisgICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZXhpdGVkLCBmdW5jdGlv
bihoYW5kbGVySW5mbykgeworICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRs
ZXI7CisgICAgICAgIGRlbGV0ZSBoYW5kbGVyLmNvbnRleHQ7CisgICAgICAgIGlmIChoYW5kbGVy
LmV4aXQpIHsgaGFuZGxlci5leGl0KCk7IH0KKyAgICAgIH0pOwogCi0gIGRpc2FibGVkOiBmYWxz
ZSwKKyAgICAgIHZhciBjdXJyZW50SGFuZGxlckluZm9zID0gcGFydGl0aW9uLnVuY2hhbmdlZC5z
bGljZSgpOworICAgICAgcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MgPSBjdXJyZW50SGFuZGxl
ckluZm9zOwogCi0gIC8vIEFsbG93ICdhJyB0YWdzIHRvIGFjdCBsaWtlIGJ1dHRvbnMKLSAgaHJl
ZjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMudGFnTmFtZSA9
PT0gJ2EnID8gJyMnIDogbnVsbDsKLSAgfSksCisgICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24u
dXBkYXRlZENvbnRleHQsIGZ1bmN0aW9uKGhhbmRsZXJJbmZvKSB7CisgICAgICAgIGhhbmRsZXJF
bnRlcmVkT3JVcGRhdGVkKHRyYW5zaXRpb24sIGN1cnJlbnRIYW5kbGVySW5mb3MsIGhhbmRsZXJJ
bmZvLCBmYWxzZSk7CisgICAgICB9KTsKIAotICBtb3VzZURvd246IGZ1bmN0aW9uKCkgewotICAg
IGlmICghZ2V0KHRoaXMsICdkaXNhYmxlZCcpKSB7Ci0gICAgICBzZXQodGhpcywgJ2lzQWN0aXZl
JywgdHJ1ZSk7Ci0gICAgICB0aGlzLl9tb3VzZURvd24gPSB0cnVlOwotICAgICAgdGhpcy5fbW91
c2VFbnRlcmVkID0gdHJ1ZTsKKyAgICAgIGVhY2hIYW5kbGVyKHBhcnRpdGlvbi5lbnRlcmVkLCBm
dW5jdGlvbihoYW5kbGVySW5mbykgeworICAgICAgICBoYW5kbGVyRW50ZXJlZE9yVXBkYXRlZCh0
cmFuc2l0aW9uLCBjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVySW5mbywgdHJ1ZSk7CisgICAg
ICB9KTsKICAgICB9Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvcGFnYXRlRXZlbnRzJyk7Ci0g
IH0sCiAKLSAgbW91c2VMZWF2ZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX21vdXNlRG93
bikgewotICAgICAgc2V0KHRoaXMsICdpc0FjdGl2ZScsIGZhbHNlKTsKLSAgICAgIHRoaXMuX21v
dXNlRW50ZXJlZCA9IGZhbHNlOwotICAgIH0KLSAgfSwKKyAgICAvKioKKyAgICAgIEBwcml2YXRl
CiAKLSAgbW91c2VFbnRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX21vdXNlRG93bikg
ewotICAgICAgc2V0KHRoaXMsICdpc0FjdGl2ZScsIHRydWUpOwotICAgICAgdGhpcy5fbW91c2VF
bnRlcmVkID0gdHJ1ZTsKLSAgICB9Ci0gIH0sCisgICAgICBIZWxwZXIgbWV0aG9kIHVzZWQgYnkg
c2V0dXBDb250ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVkaXJlY3RzCisgICAgICB0aGF0IG1h
eSBoYXBwZW4gaW4gZW50ZXIvc2V0dXAuCisgICAgKi8KKyAgICBmdW5jdGlvbiBoYW5kbGVyRW50
ZXJlZE9yVXBkYXRlZCh0cmFuc2l0aW9uLCBjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVySW5m
bywgZW50ZXIpIHsKKyAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlciwKKyAg
ICAgICAgICBjb250ZXh0ID0gaGFuZGxlckluZm8uY29udGV4dDsKIAotICBtb3VzZVVwOiBmdW5j
dGlvbihldmVudCkgewotICAgIGlmIChnZXQodGhpcywgJ2lzQWN0aXZlJykpIHsKLSAgICAgIC8v
IEFjdHVhbGx5IGludm9rZSB0aGUgYnV0dG9uJ3MgdGFyZ2V0IGFuZCBhY3Rpb24uCi0gICAgICAv
LyBUaGlzIG1ldGhvZCBjb21lcyBmcm9tIHRoZSBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0IG1p
eGluLgotICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKCk7Ci0gICAgICBzZXQodGhpcywgJ2lzQWN0
aXZlJywgZmFsc2UpOwotICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChlbnRlciAmJiBo
YW5kbGVyLmVudGVyKSB7IGhhbmRsZXIuZW50ZXIoKTsgfQorICAgICAgICBjaGVja0Fib3J0KHRy
YW5zaXRpb24pOwogCi0gICAgdGhpcy5fbW91c2VEb3duID0gZmFsc2U7Ci0gICAgdGhpcy5fbW91
c2VFbnRlcmVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvcGFnYXRlRXZlbnRz
Jyk7Ci0gIH0sCisgICAgICAgIHNldENvbnRleHQoaGFuZGxlciwgY29udGV4dCk7CisgICAgICAg
IHNldFF1ZXJ5UGFyYW1zKGhhbmRsZXIsIGhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zKTsKKworICAg
ICAgICBpZiAoaGFuZGxlci5zZXR1cCkgeyBoYW5kbGVyLnNldHVwKGNvbnRleHQsIGhhbmRsZXJJ
bmZvLnF1ZXJ5UGFyYW1zKTsgfQorICAgICAgICBjaGVja0Fib3J0KHRyYW5zaXRpb24pOworICAg
ICAgfSBjYXRjaChlKSB7CisgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBSb3V0ZXIuVHJhbnNp
dGlvbkFib3J0ZWQpKSB7CisgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgYGVycm9yYCBldmVudCBz
dGFydGluZyBmcm9tIHRoaXMgZmFpbGVkIGhhbmRsZXIuCisgICAgICAgICAgdHJhbnNpdGlvbi50
cmlnZ2VyKHRydWUsICdlcnJvcicsIGUsIHRyYW5zaXRpb24sIGhhbmRsZXIpOworICAgICAgICB9
CiAKLSAga2V5RG93bjogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAvLyBIYW5kbGUgc3BhY2Ugb3Ig
ZW50ZXIKLSAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0g
MzIpIHsKLSAgICAgIHRoaXMubW91c2VEb3duKCk7Ci0gICAgfQotICB9LAorICAgICAgICAvLyBQ
cm9wYWdhdGUgdGhlIGVycm9yIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gcHJvbWlzZSB3aWxsIHJl
amVjdC4KKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0KIAotICBrZXlVcDogZnVuY3Rpb24oZXZl
bnQpIHsKLSAgICAvLyBIYW5kbGUgc3BhY2Ugb3IgZW50ZXIKLSAgICBpZiAoZXZlbnQua2V5Q29k
ZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzIpIHsKLSAgICAgIHRoaXMubW91c2VVcCgp
OworICAgICAgY3VycmVudEhhbmRsZXJJbmZvcy5wdXNoKGhhbmRsZXJJbmZvKTsKICAgICB9Ci0g
IH0sCi0KLSAgLy8gVE9ETzogSGFuZGxlIHByb3BlciB0b3VjaCBiZWhhdmlvci4gSW5jbHVkaW5n
IHNob3VsZCBtYWtlIGluYWN0aXZlIHdoZW4KLSAgLy8gZmluZ2VyIG1vdmVzIG1vcmUgdGhhbiAy
MHggb3V0c2lkZSBvZiB0aGUgZWRnZSBvZiB0aGUgYnV0dG9uICh2cyBtb3VzZQotICAvLyB3aGlj
aCBnb2VzIGluYWN0aXZlIGFzIHNvb24gYXMgbW91c2UgZ29lcyBvdXQgb2YgZWRnZXMuKQogCi0g
IHRvdWNoU3RhcnQ6IGZ1bmN0aW9uKHRvdWNoKSB7Ci0gICAgcmV0dXJuIHRoaXMubW91c2VEb3du
KHRvdWNoKTsKLSAgfSwKIAotICB0b3VjaEVuZDogZnVuY3Rpb24odG91Y2gpIHsKLSAgICByZXR1
cm4gdGhpcy5tb3VzZVVwKHRvdWNoKTsKLSAgfSwKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCiAK
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5CdXR0b24g
aXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBD
b25zaWRlciB1c2luZyB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlci4iKTsKLSAgICB0aGlzLl9zdXBl
cigpOwotICB9Ci19KTsKKyAgICAgIEl0ZXJhdGVzIG92ZXIgYW4gYXJyYXkgb2YgYEhhbmRsZXJJ
bmZvYHMsIHBhc3NpbmcgdGhlIGhhbmRsZXIKKyAgICAgIGFuZCBjb250ZXh0IGludG8gdGhlIGNh
bGxiYWNrLgogCi19KSgpOworICAgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IGhhbmRs
ZXJJbmZvcworICAgICAgQHBhcmFtIHtGdW5jdGlvbihPYmplY3QsIE9iamVjdCl9IGNhbGxiYWNr
CisgICAgKi8KKyAgICBmdW5jdGlvbiBlYWNoSGFuZGxlcihoYW5kbGVySW5mb3MsIGNhbGxiYWNr
KSB7CisgICAgICBmb3IgKHZhciBpPTAsIGw9aGFuZGxlckluZm9zLmxlbmd0aDsgaTxsOyBpKysp
IHsKKyAgICAgICAgY2FsbGJhY2soaGFuZGxlckluZm9zW2ldKTsKKyAgICAgIH0KKyAgICB9CiAK
KyAgICAvKioKKyAgICAgIEBwcml2YXRlCiAKKyAgICAgIGRldGVybWluZXMgaWYgdHdvIHF1ZXJ5
cGFyYW0gb2JqZWN0cyBhcmUgdGhlIHNhbWUgb3Igbm90CisgICAgKiovCisgICAgZnVuY3Rpb24g
cXVlcnlQYXJhbXNFcXVhbChhLCBiKSB7CisgICAgICBhID0gYSB8fCB7fTsKKyAgICAgIGIgPSBi
IHx8IHt9OworICAgICAgdmFyIGNoZWNrZWRLZXlzID0gW10sIGtleTsKKyAgICAgIGZvcihrZXkg
aW4gYSkgeworICAgICAgICBpZiAoIWEuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsg
fQorICAgICAgICBpZihiW2tleV0gIT09IGFba2V5XSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAg
ICAgY2hlY2tlZEtleXMucHVzaChrZXkpOworICAgICAgfQorICAgICAgZm9yKGtleSBpbiBiKSB7
CisgICAgICAgIGlmICghYi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9CisgICAg
ICAgIGlmICh+Y2hlY2tlZEtleXMuaW5kZXhPZihrZXkpKSB7IGNvbnRpbnVlOyB9CisgICAgICAg
IC8vIGIgaGFzIGEga2V5IG5vdCBpbiBhCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0K
KyAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCisgICAgLyoqCisgICAgICBA
cHJpdmF0ZQogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CisgICAgICBU
aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRyYW5zaXRpb25pbmcgZnJvbSBvbmUgVVJMIHRv
CisgICAgICBhbm90aGVyIHRvIGRldGVybWluZSB3aGljaCBoYW5kbGVycyBhcmUgbm8gbG9uZ2Vy
IGFjdGl2ZSwKKyAgICAgIHdoaWNoIGhhbmRsZXJzIGFyZSBuZXdseSBhY3RpdmUsIGFuZCB3aGlj
aCBoYW5kbGVycyByZW1haW4KKyAgICAgIGFjdGl2ZSBidXQgaGF2ZSB0aGVpciBjb250ZXh0IGNo
YW5nZWQuCiAKLS8qKgotICBUaGUgYEVtYmVyLlRleHRBcmVhYCB2aWV3IGNsYXNzIHJlbmRlcnMg
YQotICBbdGV4dGFyZWFdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxl
bWVudC90ZXh0YXJlYSkgZWxlbWVudC4KLSAgSXQgYWxsb3dzIGZvciBiaW5kaW5nIEVtYmVyIHBy
b3BlcnRpZXMgdG8gdGhlIHRleHQgYXJlYSBjb250ZW50cyAoYHZhbHVlYCksCi0gIGxpdmUtdXBk
YXRpbmcgYXMgdGhlIHVzZXIgaW5wdXRzIHRleHQuCisgICAgICBUYWtlIGEgbGlzdCBvZiBvbGQg
aGFuZGxlcnMgYW5kIG5ldyBoYW5kbGVycyBhbmQgcGFydGl0aW9uCisgICAgICB0aGVtIGludG8g
Zm91ciBidWNrZXRzOgogCi0gICMjIExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCisg
ICAgICAqIHVuY2hhbmdlZDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiBib3RoIHRoZSBvbGQg
YW5kCisgICAgICAgIG5ldyBVUkwsIGFuZCBpdHMgY29udGV4dCByZW1haW5zIHRoZSBzYW1lCisg
ICAgICAqIHVwZGF0ZWQgY29udGV4dDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiBib3RoIHRo
ZQorICAgICAgICBvbGQgYW5kIG5ldyBVUkwsIGJ1dCBpdHMgY29udGV4dCBjaGFuZ2VkLiBUaGUg
aGFuZGxlcidzCisgICAgICAgIGBzZXR1cGAgbWV0aG9kLCBpZiBhbnksIHdpbGwgYmUgY2FsbGVk
IHdpdGggdGhlIG5ldworICAgICAgICBjb250ZXh0LgorICAgICAgKiBleGl0ZWQ6IHRoZSBoYW5k
bGVyIHdhcyBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dCBpcworICAgICAgICBubyBsb25nZXIg
YWN0aXZlLgorICAgICAgKiBlbnRlcmVkOiB0aGUgaGFuZGxlciB3YXMgbm90IGFjdGl2ZSBpbiB0
aGUgb2xkIFVSTCwgYnV0CisgICAgICAgIGlzIG5vdyBhY3RpdmUuCiAKLSAgQmVjYXVzZSBIVE1M
IGB0ZXh0YXJlYWAgZWxlbWVudHMgZG8gbm90IGNvbnRhaW4gaW5uZXIgSFRNTCB0aGUgYGxheW91
dGAgYW5kCi0gIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNl
ZSBgRW1iZXIuVmlld2AncyBsYXlvdXQKLSAgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4K
KyAgICAgIFRoZSBQYXJ0aXRpb25lZEhhbmRsZXJzIHN0cnVjdHVyZSBoYXMgZm91ciBmaWVsZHM6
CiAKLSAgIyMgSFRNTCBBdHRyaWJ1dGVzCisgICAgICAqIGB1cGRhdGVkQ29udGV4dGA6IGEgbGlz
dCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdAorICAgICAgICByZXByZXNlbnQgaGFuZGxl
cnMgdGhhdCByZW1haW4gYWN0aXZlIGJ1dCBoYXZlIGEgY2hhbmdlZAorICAgICAgICBjb250ZXh0
CisgICAgICAqIGBlbnRlcmVkYDogYSBsaXN0IG9mIGBIYW5kbGVySW5mb2Agb2JqZWN0cyB0aGF0
IHJlcHJlc2VudAorICAgICAgICBoYW5kbGVycyB0aGF0IGFyZSBuZXdseSBhY3RpdmUKKyAgICAg
ICogYGV4aXRlZGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCBhcmUgbm8K
KyAgICAgICAgbG9uZ2VyIGFjdGl2ZS4KKyAgICAgICogYHVuY2hhbmdlZGA6IGEgbGlzdCBvZiBg
SGFuZGVySW5mb2Agb2JqZWN0cyB0aGF0IHJlbWFpbiBhY3RpdmUuCiAKLSAgQnkgZGVmYXVsdCBg
RW1iZXIuVGV4dEFyZWFgIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGByb3dzYCwgYGNvbHNgLAotICBg
cGxhY2Vob2xkZXJgLCBgZGlzYWJsZWRgLCBgbWF4bGVuZ3RoYCBhbmQgYHRhYmluZGV4YCBhdHRy
aWJ1dGVzIG9uIGEKLSAgdGV4dGFyZWEuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgIG1vcmUgYXR0
cmlidXRlcyBoYXZlIGEgbG9vayBhdCB0aGUKLSAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0
eSBpbiBgRW1iZXIuVmlld2AncyBIVE1MIEF0dHJpYnV0ZXMgc2VjdGlvbi4KKyAgICAgIEBwYXJh
bSB7QXJyYXlbSGFuZGxlckluZm9dfSBvbGRIYW5kbGVycyBhIGxpc3Qgb2YgdGhlIGhhbmRsZXIK
KyAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91cyBVUkwgKG9yIGBbXWAgaWYgdGhp
cyBpcyB0aGUKKyAgICAgICAgZmlyc3QgaGFuZGxlZCB0cmFuc2l0aW9uKQorICAgICAgQHBhcmFt
IHtBcnJheVtIYW5kbGVySW5mb119IG5ld0hhbmRsZXJzIGEgbGlzdCBvZiB0aGUgaGFuZGxlcgor
ICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBVUkwKIAotICBUbyBnbG9iYWxseSBhZGQg
c3VwcG9ydCBmb3IgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHlvdSBjYW4gcmVvcGVuCi0gIGBFbWJl
ci5UZXh0QXJlYWAgb3IgYEVtYmVyLlRleHRTdXBwb3J0YC4KKyAgICAgIEByZXR1cm4ge1BhcnRp
dGlvbn0KKyAgICAqLworICAgIGZ1bmN0aW9uIHBhcnRpdGlvbkhhbmRsZXJzKG9sZEhhbmRsZXJz
LCBuZXdIYW5kbGVycykgeworICAgICAgdmFyIGhhbmRsZXJzID0geworICAgICAgICAgICAgdXBk
YXRlZENvbnRleHQ6IFtdLAorICAgICAgICAgICAgZXhpdGVkOiBbXSwKKyAgICAgICAgICAgIGVu
dGVyZWQ6IFtdLAorICAgICAgICAgICAgdW5jaGFuZ2VkOiBbXQorICAgICAgICAgIH07CiAKLSAg
YGBgamF2YXNjcmlwdAotICBFbWJlci5UZXh0U3VwcG9ydC5yZW9wZW4oewotICAgIGF0dHJpYnV0
ZUJpbmRpbmdzOiBbInJlcXVpcmVkIl0KLSAgfSkKLSAgYGBgCisgICAgICB2YXIgaGFuZGxlckNo
YW5nZWQsIGNvbnRleHRDaGFuZ2VkLCBxdWVyeVBhcmFtc0NoYW5nZWQsIGksIGw7CiAKLSAgQGNs
YXNzIFRleHRBcmVhCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuVmlldwot
ICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAotKi8KLUVtYmVyLlRleHRBcmVhID0gRW1iZXIuVmll
dy5leHRlbmQoRW1iZXIuVGV4dFN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczogWydlbWJlci10ZXh0
LWFyZWEnXSwKKyAgICAgIGZvciAoaT0wLCBsPW5ld0hhbmRsZXJzLmxlbmd0aDsgaTxsOyBpKysp
IHsKKyAgICAgICAgdmFyIG9sZEhhbmRsZXIgPSBvbGRIYW5kbGVyc1tpXSwgbmV3SGFuZGxlciA9
IG5ld0hhbmRsZXJzW2ldOwogCi0gIHRhZ05hbWU6ICJ0ZXh0YXJlYSIsCi0gIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ3Jvd3MnLCAnY29scyddLAotICByb3dzOiBudWxsLAotICBjb2xzOiBudWxsLAor
ICAgICAgICBpZiAoIW9sZEhhbmRsZXIgfHwgb2xkSGFuZGxlci5oYW5kbGVyICE9PSBuZXdIYW5k
bGVyLmhhbmRsZXIpIHsKKyAgICAgICAgICBoYW5kbGVyQ2hhbmdlZCA9IHRydWU7CisgICAgICAg
IH0gZWxzZSBpZiAoIXF1ZXJ5UGFyYW1zRXF1YWwob2xkSGFuZGxlci5xdWVyeVBhcmFtcywgbmV3
SGFuZGxlci5xdWVyeVBhcmFtcykpIHsKKyAgICAgICAgICBxdWVyeVBhcmFtc0NoYW5nZWQgPSB0
cnVlOworICAgICAgICB9CiAKLSAgX3VwZGF0ZUVsZW1lbnRWYWx1ZTogRW1iZXIub2JzZXJ2ZXIo
ZnVuY3Rpb24oKSB7Ci0gICAgLy8gV2UgZG8gdGhpcyBjaGVjayBzbyBjdXJzb3IgcG9zaXRpb24g
ZG9lc24ndCBnZXQgYWZmZWN0ZWQgaW4gSUUKLSAgICB2YXIgdmFsdWUgPSBnZXQodGhpcywgJ3Zh
bHVlJyksCi0gICAgICAgICRlbCA9IHRoaXMuJCgpOwotICAgIGlmICgkZWwgJiYgdmFsdWUgIT09
ICRlbC52YWwoKSkgewotICAgICAgJGVsLnZhbCh2YWx1ZSk7Ci0gICAgfQotICB9LCAndmFsdWUn
KSwKKyAgICAgICAgaWYgKGhhbmRsZXJDaGFuZ2VkKSB7CisgICAgICAgICAgaGFuZGxlcnMuZW50
ZXJlZC5wdXNoKG5ld0hhbmRsZXIpOworICAgICAgICAgIGlmIChvbGRIYW5kbGVyKSB7IGhhbmRs
ZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhhbmRsZXIpOyB9CisgICAgICAgIH0gZWxzZSBpZiAoY29u
dGV4dENoYW5nZWQgfHwgb2xkSGFuZGxlci5jb250ZXh0ICE9PSBuZXdIYW5kbGVyLmNvbnRleHQg
fHwgcXVlcnlQYXJhbXNDaGFuZ2VkKSB7CisgICAgICAgICAgY29udGV4dENoYW5nZWQgPSB0cnVl
OworICAgICAgICAgIGhhbmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2gobmV3SGFuZGxlcik7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGFuZGxlcnMudW5jaGFuZ2VkLnB1c2gob2xkSGFu
ZGxlcik7CisgICAgICAgIH0KKyAgICAgIH0KIAotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0
aGlzLl9zdXBlcigpOwotICAgIHRoaXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0aGlzLCB0aGlz
Ll91cGRhdGVFbGVtZW50VmFsdWUpOwotICB9CisgICAgICBmb3IgKGk9bmV3SGFuZGxlcnMubGVu
Z3RoLCBsPW9sZEhhbmRsZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgaGFuZGxlcnMu
ZXhpdGVkLnVuc2hpZnQob2xkSGFuZGxlcnNbaV0pOworICAgICAgfQogCi19KTsKKyAgICAgIHJl
dHVybiBoYW5kbGVyczsKKyAgICB9CiAKLX0pKCk7CisgICAgZnVuY3Rpb24gdHJpZ2dlcihyb3V0
ZXIsIGhhbmRsZXJJbmZvcywgaWdub3JlRmFpbHVyZSwgYXJncykgeworICAgICAgaWYgKHJvdXRl
ci50cmlnZ2VyRXZlbnQpIHsKKyAgICAgICAgcm91dGVyLnRyaWdnZXJFdmVudChoYW5kbGVySW5m
b3MsIGlnbm9yZUZhaWx1cmUsIGFyZ3MpOworICAgICAgICByZXR1cm47CisgICAgICB9CiAKKyAg
ICAgIHZhciBuYW1lID0gYXJncy5zaGlmdCgpOwogCisgICAgICBpZiAoIWhhbmRsZXJJbmZvcykg
eworICAgICAgICBpZiAoaWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KKyAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJDb3VsZCBub3QgdHJpZ2dlciBldmVudCAnIiArIG5hbWUgKyAiJy4gVGhlcmUg
YXJlIG5vIGFjdGl2ZSBoYW5kbGVycyIpOworICAgICAgfQogCi0oZnVuY3Rpb24oKSB7Ci0vKmpz
aGludCBlcWVxZXE6ZmFsc2UgKi8KKyAgICAgIHZhciBldmVudFdhc0hhbmRsZWQgPSBmYWxzZTsK
IAotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCisg
ICAgICBmb3IgKHZhciBpPWhhbmRsZXJJbmZvcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CisgICAg
ICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKKyAgICAgICAgICAgIGhhbmRs
ZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwogCi12YXIgc2V0ID0gRW1iZXIuc2V0LAotICAgIGdl
dCA9IEVtYmVyLmdldCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4
T2YsCi0gICAgaW5kZXhlc09mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4ZXNPZiwKLSAg
ICByZXBsYWNlID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2UsCi0gICAgaXNBcnJheSA9
IEVtYmVyLmlzQXJyYXksCi0gICAgcHJlY29tcGlsZVRlbXBsYXRlID0gRW1iZXIuSGFuZGxlYmFy
cy5jb21waWxlOworICAgICAgICBpZiAoaGFuZGxlci5ldmVudHMgJiYgaGFuZGxlci5ldmVudHNb
bmFtZV0pIHsKKyAgICAgICAgICBpZiAoaGFuZGxlci5ldmVudHNbbmFtZV0uYXBwbHkoaGFuZGxl
ciwgYXJncykgPT09IHRydWUpIHsKKyAgICAgICAgICAgIGV2ZW50V2FzSGFuZGxlZCA9IHRydWU7
CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KIAotLyoqCi0gIFRoZSBgRW1iZXIuU2VsZWN0YCB2aWV3IGNsYXNz
IHJlbmRlcnMgYQotICBbc2VsZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9I
VE1ML0VsZW1lbnQvc2VsZWN0KSBIVE1MIGVsZW1lbnQsCi0gIGFsbG93aW5nIHRoZSB1c2VyIHRv
IGNob29zZSBmcm9tIGEgbGlzdCBvZiBvcHRpb25zLgorICAgICAgaWYgKCFldmVudFdhc0hhbmRs
ZWQgJiYgIWlnbm9yZUZhaWx1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3RoaW5n
IGhhbmRsZWQgdGhlIGV2ZW50ICciICsgbmFtZSArICInLiIpOworICAgICAgfQorICAgIH0KIAot
ICBUaGUgdGV4dCBhbmQgYHZhbHVlYCBwcm9wZXJ0eSBvZiBlYWNoIGA8b3B0aW9uPmAgZWxlbWVu
dCB3aXRoaW4gdGhlCi0gIGA8c2VsZWN0PmAgZWxlbWVudCBhcmUgcG9wdWxhdGVkIGZyb20gdGhl
IG9iamVjdHMgaW4gdGhlIGBFbGVtZW50LlNlbGVjdGAncwotICBgY29udGVudGAgcHJvcGVydHku
IFRoZSB1bmRlcmx5aW5nIGRhdGEgb2JqZWN0IG9mIHRoZSBzZWxlY3RlZCBgPG9wdGlvbj5gIGlz
Ci0gIHN0b3JlZCBpbiB0aGUgYEVsZW1lbnQuU2VsZWN0YCdzIGB2YWx1ZWAgcHJvcGVydHkuCisg
ICAgZnVuY3Rpb24gc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KSB7CisgICAgICBoYW5kbGVy
LmNvbnRleHQgPSBjb250ZXh0OworICAgICAgaWYgKGhhbmRsZXIuY29udGV4dERpZENoYW5nZSkg
eyBoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2UoKTsgfQorICAgIH0KIAotICAjIyMgYGNvbnRlbnRg
IGFzIGFuIGFycmF5IG9mIFN0cmluZ3MKKyAgICBmdW5jdGlvbiBzZXRRdWVyeVBhcmFtcyhoYW5k
bGVyLCBxdWVyeVBhcmFtcykgeworICAgICAgaGFuZGxlci5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFy
YW1zOworICAgICAgaWYgKGhhbmRsZXIucXVlcnlQYXJhbXNEaWRDaGFuZ2UpIHsgaGFuZGxlci5x
dWVyeVBhcmFtc0RpZENoYW5nZSgpOyB9CisgICAgfQogCi0gIFRoZSBzaW1wbGVzdCB2ZXJzaW9u
IG9mIGFuIGBFbWJlci5TZWxlY3RgIHRha2VzIGFuIGFycmF5IG9mIHN0cmluZ3MgYXMgaXRzCi0g
IGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYm90aCB0aGUg
YHZhbHVlYCBwcm9wZXJ0eSBhbmQKLSAgdGhlIGlubmVyIHRleHQgb2YgZWFjaCBgPG9wdGlvbj5g
IGVsZW1lbnQgaW5zaWRlIHRoZSByZW5kZXJlZCBgPHNlbGVjdD5gLgogCi0gIEV4YW1wbGU6Cisg
ICAgLyoqCisgICAgICBAcHJpdmF0ZQogCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLm5hbWVzID0g
WyJZZWh1ZGEiLCAiVG9tIl07Ci0gIGBgYAorICAgICAgRXh0cmFjdHMgcXVlcnkgcGFyYW1zIGZy
b20gdGhlIGVuZCBvZiBhbiBhcnJheQorICAgICoqLwogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t2
aWV3IEVtYmVyLlNlbGVjdCBjb250ZW50QmluZGluZz0iQXBwLm5hbWVzIn19Ci0gIGBgYAorICAg
IGZ1bmN0aW9uIGV4dHJhY3RRdWVyeVBhcmFtcyhhcnJheSkgeworICAgICAgdmFyIGxlbiA9IChh
cnJheSAmJiBhcnJheS5sZW5ndGgpLCBoZWFkLCBxdWVyeVBhcmFtczsKIAotICBXb3VsZCByZXN1
bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgorICAgICAgaWYobGVuICYmIGxlbiA+IDAgJiYgYXJy
YXlbbGVuIC0gMV0gJiYgYXJyYXlbbGVuIC0gMV0uaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFyYW1z
JykpIHsKKyAgICAgICAgcXVlcnlQYXJhbXMgPSBhcnJheVtsZW4gLSAxXS5xdWVyeVBhcmFtczsK
KyAgICAgICAgaGVhZCA9IHNsaWNlLmNhbGwoYXJyYXksIDAsIGxlbiAtIDEpOworICAgICAgICBy
ZXR1cm4gW2hlYWQsIHF1ZXJ5UGFyYW1zXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVy
biBbYXJyYXksIG51bGxdOworICAgICAgfQorICAgIH0KIAotICBgYGBodG1sCi0gIDxzZWxlY3Qg
Y2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iWWVodWRhIj5ZZWh1ZGE8
L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0aW9uPgotICA8L3NlbGVj
dD4KLSAgYGBgCisgICAgZnVuY3Rpb24gcGVyZm9ybUludGVybWVkaWF0ZVRyYW5zaXRpb24ocm91
dGVyLCByZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVzdWx0cykgewogCi0gIFlvdSBjYW4gY29u
dHJvbCB3aGljaCBgPG9wdGlvbj5gIGlzIHNlbGVjdGVkIHRocm91Z2ggdGhlIGBFbWJlci5TZWxl
Y3RgJ3MKLSAgYHZhbHVlYCBwcm9wZXJ0eSBkaXJlY3RseSBvciBhcyBhIGJpbmRpbmc6CisgICAg
ICB2YXIgaGFuZGxlckluZm9zID0gZ2VuZXJhdGVIYW5kbGVySW5mb3Mocm91dGVyLCByZWNvZ0hh
bmRsZXJzKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlckluZm9zLmxlbmd0aDsg
KytpKSB7CisgICAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKKyAgICAg
ICAgaGFuZGxlckluZm8uY29udGV4dCA9IG1hdGNoUG9pbnRSZXN1bHRzLnByb3ZpZGVkTW9kZWxz
W2hhbmRsZXJJbmZvLm5hbWVdOworICAgICAgfQogCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLm5h
bWVzID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgc2VsZWN0ZWQ6ICdUb20nLAotICAgIGNv
bnRlbnQ6IFsiWWVodWRhIiwgIlRvbSJdCi0gIH0pOwotICBgYGAKKyAgICAgIHZhciBzdHViYmVk
VHJhbnNpdGlvbiA9IHsKKyAgICAgICAgcm91dGVyOiByb3V0ZXIsCisgICAgICAgIGlzQWJvcnRl
ZDogZmFsc2UKKyAgICAgIH07CiAKLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2Vs
ZWN0Ci0gICAgICAgICBjb250ZW50QmluZGluZz0iQXBwLm5hbWVzLmNvbnRlbnQiCi0gICAgICAg
ICB2YWx1ZUJpbmRpbmc9IkFwcC5uYW1lcy5zZWxlY3RlZCIKLSAgfX0KLSAgYGBgCisgICAgICBz
ZXR1cENvbnRleHRzKHN0dWJiZWRUcmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpOworICAgIH0KIAot
ICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHdpdGggdGhlIGA8b3B0aW9uPmAg
Zm9yICdUb20nIHNlbGVjdGVkOgorICAgIC8qKgorICAgICAgQHByaXZhdGUKIAotICBgYGBodG1s
Ci0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iWWVo
dWRhIj5ZZWh1ZGE8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJUb20iIHNlbGVjdGVkPSJz
ZWxlY3RlZCI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKKyAgICAgIENyZWF0ZXMs
IGJlZ2lucywgYW5kIHJldHVybnMgYSBUcmFuc2l0aW9uLgorICAgICAqLworICAgIGZ1bmN0aW9u
IHBlcmZvcm1UcmFuc2l0aW9uKHJvdXRlciwgcmVjb2dIYW5kbGVycywgcHJvdmlkZWRNb2RlbHNB
cnJheSwgcGFyYW1zLCBxdWVyeVBhcmFtcywgZGF0YSwgaXNJbnRlcm1lZGlhdGUpIHsKIAotICBB
IHVzZXIgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcmVuZGVyZWQgYDxzZWxlY3Q+YCB0byBjaG9vc2Ug
IlllaHVkYSIgd291bGQKLSAgdXBkYXRlIHRoZSB2YWx1ZSBvZiBgQXBwLm5hbWVzLnNlbGVjdGVk
YCB0byAiWWVodWRhIi4KKyAgICAgIHZhciBtYXRjaFBvaW50UmVzdWx0cyA9IGdldE1hdGNoUG9p
bnQocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBwcm92aWRlZE1vZGVsc0FycmF5LCBwYXJhbXMsIHF1
ZXJ5UGFyYW1zKSwKKyAgICAgICAgICB0YXJnZXROYW1lID0gcmVjb2dIYW5kbGVyc1tyZWNvZ0hh
bmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXIsCisgICAgICAgICAgd2FzVHJhbnNpdGlvbmluZyA9
IGZhbHNlLAorICAgICAgICAgIGN1cnJlbnRIYW5kbGVySW5mb3MgPSByb3V0ZXIuY3VycmVudEhh
bmRsZXJJbmZvczsKIAotICAjIyMgYGNvbnRlbnRgIGFzIGFuIEFycmF5IG9mIE9iamVjdHMKKyAg
ICAgIGlmIChpc0ludGVybWVkaWF0ZSkgeworICAgICAgICByZXR1cm4gcGVyZm9ybUludGVybWVk
aWF0ZVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVzdWx0cyk7
CisgICAgICB9CiAKLSAgQW4gYEVtYmVyLlNlbGVjdGAgY2FuIGFsc28gdGFrZSBhbiBhcnJheSBv
ZiBKYXZhU2NyaXB0IG9yIEVtYmVyIG9iamVjdHMgYXMKLSAgaXRzIGBjb250ZW50YCBwcm9wZXJ0
eS4KKyAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHRyYW5zaXRpb24gdW5kZXJ3
YXkuCisgICAgICBpZiAocm91dGVyLmFjdGl2ZVRyYW5zaXRpb24pIHsKKyAgICAgICAgaWYgKHRy
YW5zaXRpb25zSWRlbnRpY2FsKHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uLCB0YXJnZXROYW1lLCBw
cm92aWRlZE1vZGVsc0FycmF5LCBxdWVyeVBhcmFtcykpIHsKKyAgICAgICAgICByZXR1cm4gcm91
dGVyLmFjdGl2ZVRyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcm91dGVyLmFjdGl2ZVRy
YW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAgd2FzVHJhbnNpdGlvbmluZyA9IHRydWU7CisgICAg
ICB9CiAKLSAgV2hlbiB1c2luZyBvYmplY3RzIHlvdSBuZWVkIHRvIHRlbGwgdGhlIGBFbWJlci5T
ZWxlY3RgIHdoaWNoIHByb3BlcnR5IHNob3VsZAotICBiZSBhY2Nlc3NlZCBvbiBlYWNoIG9iamVj
dCB0byBzdXBwbHkgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBgPG9wdGlvbj5gCi0gIGFu
ZCB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkgdGhlIGVsZW1lbnQgdGV4
dC4KKyAgICAgIHZhciBkZWZlcnJlZCA9IFJTVlAuZGVmZXIoKSwKKyAgICAgICAgICB0cmFuc2l0
aW9uID0gbmV3IFRyYW5zaXRpb24ocm91dGVyLCBkZWZlcnJlZC5wcm9taXNlKTsKKworICAgICAg
dHJhbnNpdGlvbi50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKKyAgICAgIHRyYW5zaXRpb24ucHJv
dmlkZWRNb2RlbHMgPSBtYXRjaFBvaW50UmVzdWx0cy5wcm92aWRlZE1vZGVsczsKKyAgICAgIHRy
YW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheSA9IHByb3ZpZGVkTW9kZWxzQXJyYXk7CisgICAg
ICB0cmFuc2l0aW9uLnBhcmFtcyA9IG1hdGNoUG9pbnRSZXN1bHRzLnBhcmFtczsKKyAgICAgIHRy
YW5zaXRpb24uZGF0YSA9IGRhdGEgfHwge307CisgICAgICB0cmFuc2l0aW9uLnF1ZXJ5UGFyYW1z
ID0gcXVlcnlQYXJhbXM7CisgICAgICB0cmFuc2l0aW9uLnBpdm90SGFuZGxlciA9IG1hdGNoUG9p
bnRSZXN1bHRzLnBpdm90SGFuZGxlcjsKKyAgICAgIHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uID0g
dHJhbnNpdGlvbjsKKworICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IGdlbmVyYXRlSGFuZGxlcklu
Zm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycyk7CisgICAgICB0cmFuc2l0aW9uLmhhbmRsZXJJbmZv
cyA9IGhhbmRsZXJJbmZvczsKKworICAgICAgLy8gRmlyZSAnd2lsbFRyYW5zaXRpb24nIGV2ZW50
IG9uIGN1cnJlbnQgaGFuZGxlcnMsIGJ1dCBkb24ndCBmaXJlIGl0CisgICAgICAvLyBpZiBhIHRy
YW5zaXRpb24gd2FzIGFscmVhZHkgdW5kZXJ3YXkuCisgICAgICBpZiAoIXdhc1RyYW5zaXRpb25p
bmcpIHsKKyAgICAgICAgdHJpZ2dlcihyb3V0ZXIsIGN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUs
IFsnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0aW9uXSk7CisgICAgICB9CiAKLSAgVGhlIGBvcHRp
b25WYWx1ZVBhdGhgIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggb24gZWFjaCBv
YmplY3QgdG8KLSAgdGhlIGRlc2lyZWQgcHJvcGVydHkgZm9yIHRoZSBgdmFsdWVgIGF0dHJpYnV0
ZS4gVGhlIGBvcHRpb25MYWJlbFBhdGhgCi0gIHNwZWNpZmllcyB0aGUgcGF0aCBvbiBlYWNoIG9i
amVjdCB0byB0aGUgZGVzaXJlZCBwcm9wZXJ0eSBmb3IgdGhlCi0gIGVsZW1lbnQncyB0ZXh0LiBC
b3RoIHBhdGhzIG11c3QgcmVmZXJlbmNlIGVhY2ggb2JqZWN0IGl0c2VsZiBhcyBgY29udGVudGA6
CisgICAgICBsb2cocm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiQmVnaW5uaW5nIHZhbGlk
YXRpb24gZm9yIHRyYW5zaXRpb24gdG8gIiArIHRyYW5zaXRpb24udGFyZ2V0TmFtZSk7CisgICAg
ICB2YWxpZGF0ZUVudHJ5KHRyYW5zaXRpb24sIG1hdGNoUG9pbnRSZXN1bHRzLm1hdGNoUG9pbnQs
IG1hdGNoUG9pbnRSZXN1bHRzLmhhbmRsZXJQYXJhbXMpCisgICAgICAgICAgICAgICAgICAgLnRo
ZW4odHJhbnNpdGlvblN1Y2Nlc3MsIHRyYW5zaXRpb25GYWlsdXJlKTsKIAotICBgYGBqYXZhc2Ny
aXB0Ci0gIEFwcC5wcm9ncmFtbWVycyA9IFsKLSAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtmaXJz
dE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0pLAotICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe2ZpcnN0
TmFtZTogIlRvbSIsICAgIGlkOiAyfSkKLSAgXTsKLSAgYGBgCisgICAgICByZXR1cm4gdHJhbnNp
dGlvbjsKIAotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAg
IGNvbnRlbnRCaW5kaW5nPSJBcHAucHJvZ3JhbW1lcnMiCi0gICAgICAgICBvcHRpb25WYWx1ZVBh
dGg9ImNvbnRlbnQuaWQiCi0gICAgICAgICBvcHRpb25MYWJlbFBhdGg9ImNvbnRlbnQuZmlyc3RO
YW1lIn19Ci0gIGBgYAorICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvblN1Y2Nlc3MoKSB7CisgICAg
ICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7CiAKLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xs
b3dpbmcgSFRNTDoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaW5hbGl6ZVRyYW5zaXRpb24o
dHJhbnNpdGlvbiwgaGFuZGxlckluZm9zKTsKIAotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9
ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT5QbGVhc2UgU2VsZWN0PC9vcHRpb24+
Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1
ZT0iMiI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKKyAgICAgICAgICAvLyBjdXJy
ZW50SGFuZGxlckluZm9zIHdhcyB1cGRhdGVkIGluIGZpbmFsaXplVHJhbnNpdGlvbgorICAgICAg
ICAgIHRyaWdnZXIocm91dGVyLCByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcywgdHJ1ZSwgWydk
aWRUcmFuc2l0aW9uJ10pOwogCi0gIFRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0
ZWQgYDxvcHRpb24+YCB3aXRoaW4gYW4gYEVtYmVyLlNlbGVjdGAKLSAgY2FuIGJlIGJvdW5kIHRv
IGEgcHJvcGVydHkgb24gYW5vdGhlciBvYmplY3QgYnkgcHJvdmlkaW5nIGEKLSAgYHZhbHVlQmlu
ZGluZ2Agb3B0aW9uOgorICAgICAgICAgIGlmIChyb3V0ZXIuZGlkVHJhbnNpdGlvbikgeworICAg
ICAgICAgICAgcm91dGVyLmRpZFRyYW5zaXRpb24oaGFuZGxlckluZm9zKTsKKyAgICAgICAgICB9
CiAKLSAgYGBgamF2YXNjcmlwdAotICBBcHAucHJvZ3JhbW1lcnMgPSBbCi0gICAgRW1iZXIuT2Jq
ZWN0LmNyZWF0ZSh7Zmlyc3ROYW1lOiAiWWVodWRhIiwgaWQ6IDF9KSwKLSAgICBFbWJlci5PYmpl
Y3QuY3JlYXRlKHtmaXJzdE5hbWU6ICJUb20iLCAgICBpZDogMn0pCi0gIF07CisgICAgICAgICAg
bG9nKHJvdXRlciwgdHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlRSQU5TSVRJT04gQ09NUExFVEUuIik7
CiAKLSAgQXBwLmN1cnJlbnRQcm9ncmFtbWVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAg
aWQ6IDIKLSAgfSk7Ci0gIGBgYAorICAgICAgICAgIC8vIFJlc29sdmUgd2l0aCB0aGUgZmluYWwg
aGFuZGxlci4KKyAgICAgICAgICB0cmFuc2l0aW9uLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICAg
ICAgZGVmZXJyZWQucmVzb2x2ZShoYW5kbGVySW5mb3NbaGFuZGxlckluZm9zLmxlbmd0aCAtIDFd
LmhhbmRsZXIpOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICBkZWZlcnJlZC5yZWpl
Y3QoZSk7CisgICAgICAgIH0KIAotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxl
Y3QKLSAgICAgICAgIGNvbnRlbnRCaW5kaW5nPSJBcHAucHJvZ3JhbW1lcnMiCi0gICAgICAgICBv
cHRpb25WYWx1ZVBhdGg9ImNvbnRlbnQuaWQiCi0gICAgICAgICBvcHRpb25MYWJlbFBhdGg9ImNv
bnRlbnQuZmlyc3ROYW1lIgotICAgICAgICAgdmFsdWVCaW5kaW5nPSJBcHAuY3VycmVudFByb2dy
YW1tZXIuaWQifX0KLSAgYGBgCisgICAgICAgIC8vIERvbid0IG51bGxpZnkgaWYgYW5vdGhlciB0
cmFuc2l0aW9uIGlzIHVuZGVyd2F5IChtZWFuaW5nCisgICAgICAgIC8vIHRoZXJlIHdhcyBhIHRy
YW5zaXRpb24gaW5pdGlhdGVkIHdpdGggZW50ZXIvc2V0dXApLgorICAgICAgICBpZiAoIXRyYW5z
aXRpb24uaXNBYm9ydGVkKSB7CisgICAgICAgICAgcm91dGVyLmFjdGl2ZVRyYW5zaXRpb24gPSBu
dWxsOworICAgICAgICB9CisgICAgICB9CiAKLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dp
bmcgSFRNTCB3aXRoIGEgc2VsZWN0ZWQgb3B0aW9uOgorICAgICAgZnVuY3Rpb24gdHJhbnNpdGlv
bkZhaWx1cmUocmVhc29uKSB7CisgICAgICAgIGRlZmVycmVkLnJlamVjdChyZWFzb24pOworICAg
ICAgfQorICAgIH0KIAotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+
Ci0gICAgPG9wdGlvbiB2YWx1ZT5QbGVhc2UgU2VsZWN0PC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2
YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9
InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAorICAgIC8qKgorICAg
ICAgQHByaXZhdGUKIAotICBJbnRlcmFjdGluZyB3aXRoIHRoZSByZW5kZXJlZCBlbGVtZW50IGJ5
IHNlbGVjdGluZyB0aGUgZmlyc3Qgb3B0aW9uCi0gICgnWWVodWRhJykgd2lsbCB1cGRhdGUgdGhl
IGBpZGAgdmFsdWUgb2YgYEFwcC5jdXJyZW50UHJvZ3JhbW1lcmAKLSAgdG8gbWF0Y2ggdGhlIGB2
YWx1ZWAgcHJvcGVydHkgb2YgdGhlIG5ld2x5IHNlbGVjdGVkIGA8b3B0aW9uPmAuCisgICAgICBB
Y2NlcHRzIGhhbmRsZXJzIGluIFJlY29nbml6ZXIgZm9ybWF0LCBlaXRoZXIgcmV0dXJuZWQgZnJv
bQorICAgICAgcmVjb2duaXplKCkgb3IgaGFuZGxlcnNGb3IoKSwgYW5kIHJldHVybnMgdW5pZmll
ZAorICAgICAgYEhhbmRsZXJJbmZvYHMuCisgICAgICovCisgICAgZnVuY3Rpb24gZ2VuZXJhdGVI
YW5kbGVySW5mb3Mocm91dGVyLCByZWNvZ0hhbmRsZXJzKSB7CisgICAgICB2YXIgaGFuZGxlcklu
Zm9zID0gW107CisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmVjb2dIYW5kbGVycy5sZW5n
dGg7IGkgPCBsZW47ICsraSkgeworICAgICAgICB2YXIgaGFuZGxlck9iaiA9IHJlY29nSGFuZGxl
cnNbaV0sCisgICAgICAgICAgICBpc0R5bmFtaWMgPSBoYW5kbGVyT2JqLmlzRHluYW1pYyB8fCAo
aGFuZGxlck9iai5uYW1lcyAmJiBoYW5kbGVyT2JqLm5hbWVzLmxlbmd0aCk7CisKKyAgICAgICAg
dmFyIGhhbmRsZXJJbmZvID0geworICAgICAgICAgIGlzRHluYW1pYzogISFpc0R5bmFtaWMsCisg
ICAgICAgICAgbmFtZTogaGFuZGxlck9iai5oYW5kbGVyLAorICAgICAgICAgIGhhbmRsZXI6IHJv
dXRlci5nZXRIYW5kbGVyKGhhbmRsZXJPYmouaGFuZGxlcikKKyAgICAgICAgfTsKKyAgICAgICAg
aWYoaGFuZGxlck9iai5xdWVyeVBhcmFtcykgeworICAgICAgICAgIGhhbmRsZXJJbmZvLnF1ZXJ5
UGFyYW1zID0gaGFuZGxlck9iai5xdWVyeVBhcmFtczsKKyAgICAgICAgfQorICAgICAgICBoYW5k
bGVySW5mb3MucHVzaChoYW5kbGVySW5mbyk7CisgICAgICB9CisgICAgICByZXR1cm4gaGFuZGxl
ckluZm9zOworICAgIH0KIAotICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNvbnRyb2wgc2VsZWN0
aW9uIHRocm91Z2ggdGhlIHVuZGVybHlpbmcgb2JqZWN0cwotICB1c2VkIHRvIHJlbmRlciBlYWNo
IG9iamVjdCBwcm92aWRpbmcgYSBgc2VsZWN0aW9uQmluZGluZ2AuIFdoZW4gdGhlIHNlbGVjdGVk
Ci0gIGA8b3B0aW9uPmAgaXMgY2hhbmdlZCwgdGhlIHByb3BlcnR5IHBhdGggcHJvdmlkZWQgdG8g
YHNlbGVjdGlvbkJpbmRpbmdgCi0gIHdpbGwgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29udGVu
dCBvYmplY3Qgb2YgdGhlIHJlbmRlcmVkIGA8b3B0aW9uPmAKLSAgZWxlbWVudDoKKyAgICAvKioK
KyAgICAgIEBwcml2YXRlCisgICAgICovCisgICAgZnVuY3Rpb24gdHJhbnNpdGlvbnNJZGVudGlj
YWwob2xkVHJhbnNpdGlvbiwgdGFyZ2V0TmFtZSwgcHJvdmlkZWRNb2RlbHNBcnJheSwgcXVlcnlQ
YXJhbXMpIHsKIAotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5jb250cm9sbGVyID0gRW1iZXIuT2Jq
ZWN0LmNyZWF0ZSh7Ci0gICAgc2VsZWN0ZWRQZXJzb246IG51bGwsCi0gICAgY29udGVudDogWwot
ICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Zmlyc3ROYW1lOiAiWWVodWRhIiwgaWQ6IDF9KSwK
LSAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe2ZpcnN0TmFtZTogIlRvbSIsICAgIGlkOiAyfSkK
LSAgICBdCi0gIH0pOwotICBgYGAKKyAgICAgIGlmIChvbGRUcmFuc2l0aW9uLnRhcmdldE5hbWUg
IT09IHRhcmdldE5hbWUpIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgYGBgaGFuZGxlYmFycwotICB7
e3ZpZXcgRW1iZXIuU2VsZWN0Ci0gICAgICAgICBjb250ZW50QmluZGluZz0iQXBwLmNvbnRyb2xs
ZXIuY29udGVudCIKLSAgICAgICAgIG9wdGlvblZhbHVlUGF0aD0iY29udGVudC5pZCIKLSAgICAg
ICAgIG9wdGlvbkxhYmVsUGF0aD0iY29udGVudC5maXJzdE5hbWUiCi0gICAgICAgICBzZWxlY3Rp
b25CaW5kaW5nPSJBcHAuY29udHJvbGxlci5zZWxlY3RlZFBlcnNvbiJ9fQotICBgYGAKKyAgICAg
IHZhciBvbGRNb2RlbHMgPSBvbGRUcmFuc2l0aW9uLnByb3ZpZGVkTW9kZWxzQXJyYXk7CisgICAg
ICBpZiAob2xkTW9kZWxzLmxlbmd0aCAhPT0gcHJvdmlkZWRNb2RlbHNBcnJheS5sZW5ndGgpIHsg
cmV0dXJuIGZhbHNlOyB9CiAKLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCB3
aXRoIGEgc2VsZWN0ZWQgb3B0aW9uOgorICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9sZE1v
ZGVscy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpZiAob2xkTW9kZWxzW2ldICE9
PSBwcm92aWRlZE1vZGVsc0FycmF5W2ldKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgfQogCi0g
IGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZh
bHVlPlBsZWFzZSBTZWxlY3Q8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSIxIj5ZZWh1ZGE8
L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSIyIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPlRvbTwv
b3B0aW9uPgotICA8L3NlbGVjdD4KLSAgYGBgCisgICAgICBpZighcXVlcnlQYXJhbXNFcXVhbChv
bGRUcmFuc2l0aW9uLnF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgfQogCi0gIEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1l
bnQgYnkgc2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxsIHVwZGF0
ZSB0aGUgYHNlbGVjdGVkUGVyc29uYCB2YWx1ZSBvZiBgQXBwLmNvbnRyb2xsZXJgCi0gIHRvIG1h
dGNoIHRoZSBjb250ZW50IG9iamVjdCBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgYDxvcHRpb24+YC4g
SW4gdGhpcwotICBjYXNlIGl0IGlzIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGBBcHAuY29udGVu
dC5jb250ZW50YAorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0gICMjIyBTdXBwbHlpbmcg
YSBQcm9tcHQKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCiAKLSAgQSBgbnVsbGAgdmFsdWUgZm9y
IHRoZSBgRW1iZXIuU2VsZWN0YCdzIGB2YWx1ZWAgb3IgYHNlbGVjdGlvbmAgcHJvcGVydHkKLSAg
cmVzdWx0cyBpbiB0aGVyZSBiZWluZyBubyBgPG9wdGlvbj5gIHdpdGggYSBgc2VsZWN0ZWRgIGF0
dHJpYnV0ZToKKyAgICAgIFVwZGF0ZXMgdGhlIFVSTCAoaWYgbmVjZXNzYXJ5KSBhbmQgY2FsbHMg
YHNldHVwQ29udGV4dHNgCisgICAgICB0byB1cGRhdGUgdGhlIHJvdXRlcidzIGFycmF5IG9mIGBj
dXJyZW50SGFuZGxlckluZm9zYC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBmaW5hbGl6ZVRyYW5z
aXRpb24odHJhbnNpdGlvbiwgaGFuZGxlckluZm9zKSB7CisKKyAgICAgIGxvZyh0cmFuc2l0aW9u
LnJvdXRlciwgdHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlZhbGlkYXRpb24gc3VjY2VlZGVkLCBmaW5h
bGl6aW5nIHRyYW5zaXRpb247Iik7CisKKyAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJv
dXRlciwKKyAgICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNlLAorICAgICAgICAgIGhh
bmRsZXJOYW1lID0gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lLAor
ICAgICAgICAgIHVybE1ldGhvZCA9IHRyYW5zaXRpb24udXJsTWV0aG9kLAorICAgICAgICAgIGk7
CisKKyAgICAgIC8vIENvbGxlY3QgcGFyYW1zIGZvciBVUkwuCisgICAgICB2YXIgb2JqZWN0cyA9
IFtdLCBwcm92aWRlZE1vZGVscyA9IHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheS5zbGlj
ZSgpOworICAgICAgZm9yIChpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGk+PTA7IC0taSkg
eworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV07CisgICAgICAgIGlm
IChoYW5kbGVySW5mby5pc0R5bmFtaWMpIHsKKyAgICAgICAgICB2YXIgcHJvdmlkZWRNb2RlbCA9
IHByb3ZpZGVkTW9kZWxzLnBvcCgpOworICAgICAgICAgIG9iamVjdHMudW5zaGlmdChpc1BhcmFt
KHByb3ZpZGVkTW9kZWwpID8gcHJvdmlkZWRNb2RlbC50b1N0cmluZygpIDogaGFuZGxlckluZm8u
Y29udGV4dCk7CisgICAgICAgIH0KIAotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5jb250cm9sbGVy
ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgc2VsZWN0ZWQ6IG51bGwsCi0gICAgY29udGVu
dDogWwotICAgICAgIlllaHVkYSIsCi0gICAgICAiVG9tIgotICAgIF0KLSAgfSk7Ci0gIGBgYAor
ICAgICAgICBpZiAoaGFuZGxlckluZm8uaGFuZGxlci5pbmFjY2Vzc2libGVCeVVSTCkgeworICAg
ICAgICAgIHVybE1ldGhvZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KIAotICBgYGAgaGFu
ZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2VsZWN0Ci0gICAgICAgICBjb250ZW50QmluZGluZz0i
QXBwLmNvbnRyb2xsZXIuY29udGVudCIKLSAgICAgICAgIHZhbHVlQmluZGluZz0iQXBwLmNvbnRy
b2xsZXIuc2VsZWN0ZWQiCi0gIH19Ci0gIGBgYAorICAgICAgdmFyIG5ld1F1ZXJ5UGFyYW1zID0g
e307CisgICAgICBmb3IgKGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaT49MDsgLS1pKSB7
CisgICAgICAgIG1lcmdlKG5ld1F1ZXJ5UGFyYW1zLCBoYW5kbGVySW5mb3NbaV0ucXVlcnlQYXJh
bXMpOworICAgICAgfQorICAgICAgcm91dGVyLmN1cnJlbnRRdWVyeVBhcmFtcyA9IG5ld1F1ZXJ5
UGFyYW1zOwogCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6CiAKLSAgYGBg
aHRtbAotICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgotICAgIDxvcHRpb24gdmFsdWU9
IlllaHVkYSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iVG9tIj5Ub208L29w
dGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAorICAgICAgdmFyIHBhcmFtcyA9IHBhcmFtc0Zvckhh
bmRsZXIocm91dGVyLCBoYW5kbGVyTmFtZSwgb2JqZWN0cywgdHJhbnNpdGlvbi5xdWVyeVBhcmFt
cyk7CiAKLSAgQWx0aG91Z2ggYEFwcC5jb250cm9sbGVyLnNlbGVjdGVkYCBpcyBgbnVsbGAgYW5k
IG5vIGA8b3B0aW9uPmAKLSAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgdGhlIHJlbmRlcmVk
IEhUTUwgd2lsbCBkaXNwbGF5IHRoZQotICBmaXJzdCBpdGVtIGFzIHRob3VnaCBpdCB3ZXJlIHNl
bGVjdGVkLiBZb3UgY2FuIHN1cHBseSBhIHN0cmluZwotICB2YWx1ZSBmb3IgdGhlIGBFbWJlci5T
ZWxlY3RgIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rpb24KLSAgd2l0aCB0aGUg
YHByb21wdGAgb3B0aW9uOgorICAgICAgcm91dGVyLmN1cnJlbnRQYXJhbXMgPSBwYXJhbXM7CiAK
LSAgYGBgamF2YXNjcmlwdAotICBBcHAuY29udHJvbGxlciA9IEVtYmVyLk9iamVjdC5jcmVhdGUo
ewotICAgIHNlbGVjdGVkOiBudWxsLAotICAgIGNvbnRlbnQ6IFsKLSAgICAgICJZZWh1ZGEiLAot
ICAgICAgIlRvbSIKLSAgICBdCi0gIH0pOwotICBgYGAKKyAgICAgIGlmICh1cmxNZXRob2QpIHsK
KyAgICAgICAgdmFyIHVybCA9IHJvdXRlci5yZWNvZ25pemVyLmdlbmVyYXRlKGhhbmRsZXJOYW1l
LCBwYXJhbXMpOwogCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t2aWV3IEVtYmVyLlNlbGVjdAotICAg
ICAgICAgY29udGVudEJpbmRpbmc9IkFwcC5jb250cm9sbGVyLmNvbnRlbnQiCi0gICAgICAgICB2
YWx1ZUJpbmRpbmc9IkFwcC5jb250cm9sbGVyLnNlbGVjdGVkIgotICAgICAgICAgcHJvbXB0PSJQ
bGVhc2Ugc2VsZWN0IGEgbmFtZSIKLSAgfX0KLSAgYGBgCisgICAgICAgIGlmICh1cmxNZXRob2Qg
PT09ICdyZXBsYWNlJykgeworICAgICAgICAgIHJvdXRlci5yZXBsYWNlVVJMKHVybCk7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSBpcyBqdXN0
IGEgVVJMIHVwZGF0ZSBmb3Igbm93LgorICAgICAgICAgIHJvdXRlci51cGRhdGVVUkwodXJsKTsK
KyAgICAgICAgfQorICAgICAgfQogCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhU
TUw6CisgICAgICBzZXR1cENvbnRleHRzKHRyYW5zaXRpb24sIGhhbmRsZXJJbmZvcyk7CisgICAg
fQogCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KLSAgICA8b3B0
aW9uPlBsZWFzZSBzZWxlY3QgYSBuYW1lPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iWWVo
dWRhIj5ZZWh1ZGE8L29wdGlvbj4KLSAgICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0aW9u
PgotICA8L3NlbGVjdD4KLSAgYGBgCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQogCi0gIEBjbGFz
cyBTZWxlY3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwot
RW1iZXIuU2VsZWN0ID0gRW1iZXIuVmlldy5leHRlbmQoCi0gIC8qKiBAc2NvcGUgRW1iZXIuU2Vs
ZWN0LnByb3RvdHlwZSAqLyB7CisgICAgICBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIHRvIGNvbnN0
cnVjdCB0aGUgY2hhaW4gb2YgcHJvbWlzZXMgdXNlZAorICAgICAgdG8gdmFsaWRhdGUgYSB0cmFu
c2l0aW9uLiBXcmFwcyBjYWxscyB0byBgYmVmb3JlTW9kZWxgLCBgbW9kZWxgLAorICAgICAgYW5k
IGBhZnRlck1vZGVsYCBpbiBwcm9taXNlcywgYW5kIGNoZWNrcyBmb3IgcmVkaXJlY3RzL2Fib3J0
cworICAgICAgYmV0d2VlbiBlYWNoLgorICAgICAqLworICAgIGZ1bmN0aW9uIHZhbGlkYXRlRW50
cnkodHJhbnNpdGlvbiwgbWF0Y2hQb2ludCwgaGFuZGxlclBhcmFtcykgewogCi0gIHRhZ05hbWU6
ICdzZWxlY3QnLAotICBjbGFzc05hbWVzOiBbJ2VtYmVyLXNlbGVjdCddLAotICBkZWZhdWx0VGVt
cGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMudGVtcGxhdGUoZnVuY3Rpb24gYW5vbnltb3VzKEhhbmRs
ZWJhcnMsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgewotdGhpcy5jb21waWxlckluZm8g
PSBbMiwnPj0gMS4wLjAtcmMuMyddOwotaGVscGVycyA9IGhlbHBlcnMgfHwgRW1iZXIuSGFuZGxl
YmFycy5oZWxwZXJzOyBkYXRhID0gZGF0YSB8fCB7fTsKLSAgdmFyIGJ1ZmZlciA9ICcnLCBzdGFj
azEsIGhhc2hUeXBlcywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIHNl
bGY9dGhpczsKKyAgICAgIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9uLmhhbmRsZXJJbmZv
cywKKyAgICAgICAgICBpbmRleCA9IHRyYW5zaXRpb24ucmVzb2x2ZUluZGV4OwogCi1mdW5jdGlv
biBwcm9ncmFtMShkZXB0aDAsZGF0YSkgewotICAKLSAgdmFyIGJ1ZmZlciA9ICcnLCBoYXNoVHlw
ZXM7Ci0gIGRhdGEuYnVmZmVyLnB1c2goIjxvcHRpb24gdmFsdWU9XCJcIj4iKTsKLSAgaGFzaFR5
cGVzID0ge307Ci0gIGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhwcmVzc2lvbihoZWxwZXJzLl90
cmlhZ2VNdXN0YWNoZS5jYWxsKGRlcHRoMCwgInZpZXcucHJvbXB0Iiwge2hhc2g6e30sY29udGV4
dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSkp
KTsKLSAgZGF0YS5idWZmZXIucHVzaCgiPC9vcHRpb24+Iik7Ci0gIHJldHVybiBidWZmZXI7Ci0g
IH0KKyAgICAgIGlmIChpbmRleCA9PT0gaGFuZGxlckluZm9zLmxlbmd0aCkgeworICAgICAgICAv
LyBObyBtb3JlIGNvbnRleHRzIHRvIHJlc29sdmUuCisgICAgICAgIHJldHVybiBSU1ZQLnJlc29s
dmUodHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVscyk7CisgICAgICB9CiAKLWZ1bmN0aW9uIHByb2dy
YW0zKGRlcHRoMCxkYXRhKSB7Ci0gIAotICB2YXIgaGFzaFR5cGVzOwotICBoYXNoVHlwZXMgPSB7
J2NvbnRlbnRCaW5kaW5nJzogIlNUUklORyJ9OwotICBkYXRhLmJ1ZmZlci5wdXNoKGVzY2FwZUV4
cHJlc3Npb24oaGVscGVycy52aWV3LmNhbGwoZGVwdGgwLCAiRW1iZXIuU2VsZWN0T3B0aW9uIiwg
e2hhc2g6ewotICAgICdjb250ZW50QmluZGluZyc6ICgidGhpcyIpCi0gIH0sY29udGV4dHM6W2Rl
cHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSkpKTsKLSAg
fQorICAgICAgdmFyIHJvdXRlciA9IHRyYW5zaXRpb24ucm91dGVyLAorICAgICAgICAgIGhhbmRs
ZXJJbmZvID0gaGFuZGxlckluZm9zW2luZGV4XSwKKyAgICAgICAgICBoYW5kbGVyID0gaGFuZGxl
ckluZm8uaGFuZGxlciwKKyAgICAgICAgICBoYW5kbGVyTmFtZSA9IGhhbmRsZXJJbmZvLm5hbWUs
CisgICAgICAgICAgc2VxID0gdHJhbnNpdGlvbi5zZXF1ZW5jZTsKKworICAgICAgaWYgKGluZGV4
IDwgbWF0Y2hQb2ludCkgeworICAgICAgICBsb2cocm91dGVyLCBzZXEsIGhhbmRsZXJOYW1lICsg
IjogdXNpbmcgY29udGV4dCBmcm9tIGFscmVhZHktYWN0aXZlIGhhbmRsZXIiKTsKKworICAgICAg
ICAvLyBXZSdyZSBiZWZvcmUgdGhlIG1hdGNoIHBvaW50LCBzbyBkb24ndCBydW4gYW55IGhvb2tz
LAorICAgICAgICAvLyBqdXN0IHVzZSB0aGUgYWxyZWFkeSByZXNvbHZlZCBjb250ZXh0IGZyb20g
dGhlIGhhbmRsZXIuCisgICAgICAgIHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbaGFuZGxlcklu
Zm8ubmFtZV0gPQorICAgICAgICAgIHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNbaGFuZGxlcklu
Zm8ubmFtZV0gfHwKKyAgICAgICAgICBoYW5kbGVySW5mby5oYW5kbGVyLmNvbnRleHQ7CisgICAg
ICAgIHJldHVybiBwcm9jZWVkKCk7CisgICAgICB9CiAKLSAgaGFzaFR5cGVzID0ge307Ci0gIHN0
YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsICJ2aWV3LnByb21wdCIsIHtoYXNoOnt9
LGludmVyc2U6c2VsZi5ub29wLGZuOnNlbGYucHJvZ3JhbSgxLCBwcm9ncmFtMSwgZGF0YSksY29u
dGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRh
fSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFj
azEpOyB9Ci0gIGhhc2hUeXBlcyA9IHt9OwotICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChk
ZXB0aDAsICJ2aWV3LmNvbnRlbnQiLCB7aGFzaDp7fSxpbnZlcnNlOnNlbGYubm9vcCxmbjpzZWxm
LnByb2dyYW0oMywgcHJvZ3JhbTMsIGRhdGEpLGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQi
XSxoYXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwgc3RhY2sx
ID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQotICByZXR1cm4gYnVmZmVyOwot
ICAKLX0pLAotICBhdHRyaWJ1dGVCaW5kaW5nczogWydtdWx0aXBsZScsICdkaXNhYmxlZCcsICd0
YWJpbmRleCddLAorICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICd3aWxsUmVzb2x2ZU1v
ZGVsJywgdHJhbnNpdGlvbiwgaGFuZGxlcik7CisKKyAgICAgIHJldHVybiBSU1ZQLnJlc29sdmUo
KS50aGVuKGhhbmRsZUFib3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmVm
b3JlTW9kZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihoYW5kbGVBYm9ydCkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1vZGVsKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAudGhlbihhZnRlck1vZGVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oaGFu
ZGxlQWJvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCBoYW5kbGVF
cnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHByb2NlZWQpOworCisgICAg
ICBmdW5jdGlvbiBoYW5kbGVBYm9ydChyZXN1bHQpIHsKKyAgICAgICAgaWYgKHRyYW5zaXRpb24u
aXNBYm9ydGVkKSB7CisgICAgICAgICAgbG9nKHRyYW5zaXRpb24ucm91dGVyLCB0cmFuc2l0aW9u
LnNlcXVlbmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7CisgICAgICAgICAgcmV0dXJuIFJTVlAucmVq
ZWN0KG5ldyBSb3V0ZXIuVHJhbnNpdGlvbkFib3J0ZWQoKSk7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgICAgfQogCi0gIC8qKgotICAgIFRoZSBgbXVsdGlwbGVgIGF0
dHJpYnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQuIEluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxl
Ci0gICAgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuCisgICAgICBmdW5jdGlvbiBoYW5kbGVFcnJv
cihyZWFzb24pIHsKKyAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFJvdXRlci5UcmFuc2l0
aW9uQWJvcnRlZCB8fCB0cmFuc2l0aW9uLmlzQWJvcnRlZCkgeworICAgICAgICAgIC8vIGlmIHRo
ZSB0cmFuc2l0aW9uIHdhcyBhYm9ydGVkIGFuZCAqbm8gYWRkaXRpb25hbCogZXJyb3Igd2FzIHRo
cm93biwKKyAgICAgICAgICAvLyByZWplY3Qgd2l0aCB0aGUgUm91dGVyLlRyYW5zaXRpb25BYm9y
dGVkIGluc3RhbmNlCisgICAgICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KHJlYXNvbik7CisgICAg
ICAgIH0KIAotICAgIEBwcm9wZXJ0eSBtdWx0aXBsZQotICAgIEB0eXBlIEJvb2xlYW4KLSAgICBA
ZGVmYXVsdCBmYWxzZQotICAqLwotICBtdWx0aXBsZTogZmFsc2UsCisgICAgICAgIC8vIG90aGVy
d2lzZSwgd2UncmUgaGVyZSBiZWNhdXNlIG9mIGEgZGlmZmVyZW50IGVycm9yCisgICAgICAgIHRy
YW5zaXRpb24uYWJvcnQoKTsKIAotICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGxvZyhyb3V0
ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiBoYW5kbGluZyBlcnJvcjogIiArIHJlYXNvbik7CiAK
LSAgLyoqCi0gICAgVGhlIGxpc3Qgb2Ygb3B0aW9ucy4KKyAgICAgICAgLy8gQW4gZXJyb3Igd2Fz
IHRocm93biAvIHByb21pc2UgcmVqZWN0ZWQsIHNvIGZpcmUgYW4KKyAgICAgICAgLy8gYGVycm9y
YCBldmVudCBmcm9tIHRoaXMgaGFuZGxlciBpbmZvIHVwIHRvIHJvb3QuCisgICAgICAgIHRyYW5z
aXRpb24udHJpZ2dlcih0cnVlLCAnZXJyb3InLCByZWFzb24sIHRyYW5zaXRpb24sIGhhbmRsZXJJ
bmZvLmhhbmRsZXIpOwogCi0gICAgSWYgYG9wdGlvbkxhYmVsUGF0aGAgYW5kIGBvcHRpb25WYWx1
ZVBhdGhgIGFyZSBub3Qgb3ZlcnJpZGRlbiwgdGhpcyBzaG91bGQKLSAgICBiZSBhIGxpc3Qgb2Yg
c3RyaW5ncywgd2hpY2ggd2lsbCBzZXJ2ZSBzaW11bHRhbmVvdXNseSBhcyBsYWJlbHMgYW5kIHZh
bHVlcy4KKyAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBvcmlnaW5hbCBlcnJvci4KKyAgICAgICAg
cmV0dXJuIFJTVlAucmVqZWN0KHJlYXNvbik7CisgICAgICB9CiAKLSAgICBPdGhlcndpc2UsIHRo
aXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBvYmplY3RzLiBGb3IgaW5zdGFuY2U6CisgICAgICBmdW5j
dGlvbiBiZWZvcmVNb2RlbCgpIHsKIAotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5TZWxl
Y3QuY3JlYXRlKHsKLSAgICAgIGNvbnRlbnQ6IEVtYmVyLkEoWwotICAgICAgICAgIHsgaWQ6IDEs
IGZpcnN0TmFtZTogJ1llaHVkYScgfSwKLSAgICAgICAgICB7IGlkOiAyLCBmaXJzdE5hbWU6ICdU
b20nIH0KLSAgICAgICAgXSksCi0gICAgICBvcHRpb25MYWJlbFBhdGg6ICdjb250ZW50LmZpcnN0
TmFtZScsCi0gICAgICBvcHRpb25WYWx1ZVBhdGg6ICdjb250ZW50LmlkJwotICAgIH0pOwotICAg
IGBgYAorICAgICAgICBsb2cocm91dGVyLCBzZXEsIGhhbmRsZXJOYW1lICsgIjogY2FsbGluZyBi
ZWZvcmVNb2RlbCBob29rIik7CiAKLSAgICBAcHJvcGVydHkgY29udGVudAotICAgIEB0eXBlIEFy
cmF5Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBudWxsLAorICAgICAgICB2
YXIgYXJnczsKIAotICAvKioKLSAgICBXaGVuIGBtdWx0aXBsZWAgaXMgYGZhbHNlYCwgdGhlIGVs
ZW1lbnQgb2YgYGNvbnRlbnRgIHRoYXQgaXMgY3VycmVudGx5Ci0gICAgc2VsZWN0ZWQsIGlmIGFu
eS4KKyAgICAgICAgaWYgKGhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zKSB7CisgICAgICAgICAgYXJn
cyA9IFtoYW5kbGVySW5mby5xdWVyeVBhcmFtcywgdHJhbnNpdGlvbl07CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgYXJncyA9IFt0cmFuc2l0aW9uXTsKKyAgICAgICAgfQogCi0gICAgV2hl
biBgbXVsdGlwbGVgIGlzIGB0cnVlYCwgYW4gYXJyYXkgb2Ygc3VjaCBlbGVtZW50cy4KKyAgICAg
ICAgdmFyIHAgPSBoYW5kbGVyLmJlZm9yZU1vZGVsICYmIGhhbmRsZXIuYmVmb3JlTW9kZWwuYXBw
bHkoaGFuZGxlciwgYXJncyk7CisgICAgICAgIHJldHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRp
b24pID8gbnVsbCA6IHA7CisgICAgICB9CiAKLSAgICBAcHJvcGVydHkgc2VsZWN0aW9uCi0gICAg
QHR5cGUgT2JqZWN0IG9yIEFycmF5Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBzZWxlY3Rp
b246IG51bGwsCisgICAgICBmdW5jdGlvbiBtb2RlbCgpIHsKKyAgICAgICAgbG9nKHJvdXRlciwg
c2VxLCBoYW5kbGVyTmFtZSArICI6IHJlc29sdmluZyBtb2RlbCIpOworICAgICAgICB2YXIgcCA9
IGdldE1vZGVsKGhhbmRsZXJJbmZvLCB0cmFuc2l0aW9uLCBoYW5kbGVyUGFyYW1zW2hhbmRsZXJO
YW1lXSwgaW5kZXggPj0gbWF0Y2hQb2ludCk7CisgICAgICAgIHJldHVybiAocCBpbnN0YW5jZW9m
IFRyYW5zaXRpb24pID8gbnVsbCA6IHA7CisgICAgICB9CiAKLSAgLyoqCi0gICAgSW4gc2luZ2xl
IHNlbGVjdGlvbiBtb2RlICh3aGVuIGBtdWx0aXBsZWAgaXMgYGZhbHNlYCksIHZhbHVlIGNhbiBi
ZSB1c2VkIHRvCi0gICAgZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHZhbHVlIG9yIHNldCB0
aGUgc2VsZWN0aW9uIGJ5IGl0J3MgdmFsdWUuCisgICAgICBmdW5jdGlvbiBhZnRlck1vZGVsKGNv
bnRleHQpIHsKIAotICAgIEl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG11bHRpcGxl
IHNlbGVjdGlvbiBtb2RlLgorICAgICAgICBsb2cocm91dGVyLCBzZXEsIGhhbmRsZXJOYW1lICsg
IjogY2FsbGluZyBhZnRlck1vZGVsIGhvb2siKTsKIAotICAgIEBwcm9wZXJ0eSB2YWx1ZQotICAg
IEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgdmFsdWU6IEVtYmVyLmNv
bXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9
PT0gMikgeyByZXR1cm4gdmFsdWU7IH0KLSAgICB2YXIgdmFsdWVQYXRoID0gZ2V0KHRoaXMsICdv
cHRpb25WYWx1ZVBhdGgnKS5yZXBsYWNlKC9eY29udGVudFwuPy8sICcnKTsKLSAgICByZXR1cm4g
dmFsdWVQYXRoID8gZ2V0KHRoaXMsICdzZWxlY3Rpb24uJyArIHZhbHVlUGF0aCkgOiBnZXQodGhp
cywgJ3NlbGVjdGlvbicpOwotICB9KS5wcm9wZXJ0eSgnc2VsZWN0aW9uJyksCisgICAgICAgIC8v
IFBhc3MgdGhlIGNvbnRleHQgYW5kIHJlc29sdmVkIHBhcmVudCBjb250ZXh0cyB0byBhZnRlck1v
ZGVsLCBidXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gd2FudCB0byB1c2UgdGhlIHZhbHVlIHJldHVy
bmVkIGZyb20gYGFmdGVyTW9kZWxgIGluIGFueSB3YXksIGJ1dCByYXRoZXIKKyAgICAgICAgLy8g
YWx3YXlzIHJlc29sdmUgd2l0aCB0aGUgb3JpZ2luYWwgYGNvbnRleHRgIG9iamVjdC4KIAotICAv
KioKLSAgICBJZiBnaXZlbiwgYSB0b3AtbW9zdCBkdW1teSBvcHRpb24gd2lsbCBiZSByZW5kZXJl
ZCB0byBzZXJ2ZSBhcyBhIHVzZXIKLSAgICBwcm9tcHQuCisgICAgICAgIHRyYW5zaXRpb24ucmVz
b2x2ZWRNb2RlbHNbaGFuZGxlckluZm8ubmFtZV0gPSBjb250ZXh0OwogCi0gICAgQHByb3BlcnR5
IHByb21wdAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgcHJv
bXB0OiBudWxsLAorICAgICAgICB2YXIgYXJnczsKIAotICAvKioKLSAgICBUaGUgcGF0aCBvZiB0
aGUgb3B0aW9uIGxhYmVscy4gU2VlIGBjb250ZW50YC4KKyAgICAgICAgaWYgKGhhbmRsZXJJbmZv
LnF1ZXJ5UGFyYW1zKSB7CisgICAgICAgICAgYXJncyA9IFtjb250ZXh0LCBoYW5kbGVySW5mby5x
dWVyeVBhcmFtcywgdHJhbnNpdGlvbl07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJn
cyA9IFtjb250ZXh0LCB0cmFuc2l0aW9uXTsKKyAgICAgICAgfQogCi0gICAgQHByb3BlcnR5IG9w
dGlvbkxhYmVsUGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICdjb250ZW50Jwot
ICAqLwotICBvcHRpb25MYWJlbFBhdGg6ICdjb250ZW50JywKKyAgICAgICAgdmFyIHAgPSBoYW5k
bGVyLmFmdGVyTW9kZWwgJiYgaGFuZGxlci5hZnRlck1vZGVsLmFwcGx5KGhhbmRsZXIsIGFyZ3Mp
OworICAgICAgICByZXR1cm4gKHAgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSA/IG51bGwgOiBwOwor
ICAgICAgfQogCi0gIC8qKgotICAgIFRoZSBwYXRoIG9mIHRoZSBvcHRpb24gdmFsdWVzLiBTZWUg
YGNvbnRlbnRgLgorICAgICAgZnVuY3Rpb24gcHJvY2VlZCgpIHsKKyAgICAgICAgbG9nKHJvdXRl
ciwgc2VxLCBoYW5kbGVyTmFtZSArICI6IHZhbGlkYXRpb24gc3VjY2VlZGVkLCBwcm9jZWVkaW5n
Iik7CiAKLSAgICBAcHJvcGVydHkgb3B0aW9uVmFsdWVQYXRoCi0gICAgQHR5cGUgU3RyaW5nCi0g
ICAgQGRlZmF1bHQgJ2NvbnRlbnQnCi0gICovCi0gIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQn
LAorICAgICAgICBoYW5kbGVySW5mby5jb250ZXh0ID0gdHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVs
c1toYW5kbGVySW5mby5uYW1lXTsKKyAgICAgICAgdHJhbnNpdGlvbi5yZXNvbHZlSW5kZXgrKzsK
KyAgICAgICAgcmV0dXJuIHZhbGlkYXRlRW50cnkodHJhbnNpdGlvbiwgbWF0Y2hQb2ludCwgaGFu
ZGxlclBhcmFtcyk7CisgICAgICB9CisgICAgfQogCi0gIF9jaGFuZ2U6IGZ1bmN0aW9uKCkgewot
ICAgIGlmIChnZXQodGhpcywgJ211bHRpcGxlJykpIHsKLSAgICAgIHRoaXMuX2NoYW5nZU11bHRp
cGxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX2NoYW5nZVNpbmdsZSgpOworICAgIC8q
KgorICAgICAgQHByaXZhdGUKKworICAgICAgVGhyb3dzIGEgVHJhbnNpdGlvbkFib3J0ZWQgaWYg
dGhlIHByb3ZpZGVkIHRyYW5zaXRpb24gaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgKi8KKyAgICBm
dW5jdGlvbiBjaGVja0Fib3J0KHRyYW5zaXRpb24pIHsKKyAgICAgIGlmICh0cmFuc2l0aW9uLmlz
QWJvcnRlZCkgeworICAgICAgICBsb2codHJhbnNpdGlvbi5yb3V0ZXIsIHRyYW5zaXRpb24uc2Vx
dWVuY2UsICJkZXRlY3RlZCBhYm9ydC4iKTsKKyAgICAgICAgdGhyb3cgbmV3IFJvdXRlci5UcmFu
c2l0aW9uQWJvcnRlZCgpOworICAgICAgfQogICAgIH0KLSAgfSwKIAotICBzZWxlY3Rpb25EaWRD
aGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWxlY3Rpb24gPSBn
ZXQodGhpcywgJ3NlbGVjdGlvbicpOwotICAgIGlmIChnZXQodGhpcywgJ211bHRpcGxlJykpIHsK
LSAgICAgIGlmICghaXNBcnJheShzZWxlY3Rpb24pKSB7Ci0gICAgICAgIHNldCh0aGlzLCAnc2Vs
ZWN0aW9uJywgRW1iZXIuQShbc2VsZWN0aW9uXSkpOwotICAgICAgICByZXR1cm47CisgICAgLyoq
CisgICAgICBAcHJpdmF0ZQorCisgICAgICBFbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGZvciB3aGV0
aGVyIHRvIGNhbGwgYG1vZGVsYCBvbiBhIHJvdXRlLAorICAgICAgb3IgdXNlIG9uZSBvZiB0aGUg
bW9kZWxzIHByb3ZpZGVkIHRvIGB0cmFuc2l0aW9uVG9gLgorICAgICAqLworICAgIGZ1bmN0aW9u
IGdldE1vZGVsKGhhbmRsZXJJbmZvLCB0cmFuc2l0aW9uLCBoYW5kbGVyUGFyYW1zLCBuZWVkc1Vw
ZGF0ZSkgeworICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyLAorICAgICAg
ICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm8ubmFtZSwgYXJnczsKKworICAgICAgaWYgKCFu
ZWVkc1VwZGF0ZSAmJiBoYW5kbGVyLmhhc093blByb3BlcnR5KCdjb250ZXh0JykpIHsKKyAgICAg
ICAgcmV0dXJuIGhhbmRsZXIuY29udGV4dDsKICAgICAgIH0KLSAgICAgIHRoaXMuX3NlbGVjdGlv
bkRpZENoYW5nZU11bHRpcGxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX3NlbGVjdGlv
bkRpZENoYW5nZVNpbmdsZSgpOworCisgICAgICBpZiAodHJhbnNpdGlvbi5wcm92aWRlZE1vZGVs
cy5oYXNPd25Qcm9wZXJ0eShoYW5kbGVyTmFtZSkpIHsKKyAgICAgICAgdmFyIHByb3ZpZGVkTW9k
ZWwgPSB0cmFuc2l0aW9uLnByb3ZpZGVkTW9kZWxzW2hhbmRsZXJOYW1lXTsKKyAgICAgICAgcmV0
dXJuIHR5cGVvZiBwcm92aWRlZE1vZGVsID09PSAnZnVuY3Rpb24nID8gcHJvdmlkZWRNb2RlbCgp
IDogcHJvdmlkZWRNb2RlbDsKKyAgICAgIH0KKworICAgICAgaWYgKGhhbmRsZXJJbmZvLnF1ZXJ5
UGFyYW1zKSB7CisgICAgICAgIGFyZ3MgPSBbaGFuZGxlclBhcmFtcyB8fCB7fSwgaGFuZGxlcklu
Zm8ucXVlcnlQYXJhbXMsIHRyYW5zaXRpb25dOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJn
cyA9IFtoYW5kbGVyUGFyYW1zIHx8IHt9LCB0cmFuc2l0aW9uLCBoYW5kbGVySW5mby5xdWVyeVBh
cmFtc107CisgICAgICB9CisKKyAgICAgIHJldHVybiBoYW5kbGVyLm1vZGVsICYmIGhhbmRsZXIu
bW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7CiAgICAgfQotICB9LCAnc2VsZWN0aW9uLkBlYWNo
JyksCiAKLSAgdmFsdWVEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHZhbHVlID0gZ2V0
KHRoaXMsICd2YWx1ZScpLAotICAgICAgICB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZh
bHVlUGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/LywgJycpLAotICAgICAgICBzZWxlY3RlZFZh
bHVlID0gKHZhbHVlUGF0aCA/IGdldCh0aGlzLCAnc2VsZWN0aW9uLicgKyB2YWx1ZVBhdGgpIDog
Z2V0KHRoaXMsICdzZWxlY3Rpb24nKSksCi0gICAgICAgIHNlbGVjdGlvbjsKKyAgICAvKioKKyAg
ICAgIEBwcml2YXRlCisgICAgICovCisgICAgZnVuY3Rpb24gbG9nKHJvdXRlciwgc2VxdWVuY2Us
IG1zZykgewogCi0gICAgaWYgKHZhbHVlICE9PSBzZWxlY3RlZFZhbHVlKSB7Ci0gICAgICBzZWxl
Y3Rpb24gPSBjb250ZW50LmZpbmQoZnVuY3Rpb24ob2JqKSB7Ci0gICAgICAgIHJldHVybiB2YWx1
ZSA9PT0gKHZhbHVlUGF0aCA/IGdldChvYmosIHZhbHVlUGF0aCkgOiBvYmopOwotICAgICAgfSk7
CisgICAgICBpZiAoIXJvdXRlci5sb2cpIHsgcmV0dXJuOyB9CiAKLSAgICAgIHRoaXMuc2V0KCdz
ZWxlY3Rpb24nLCBzZWxlY3Rpb24pOworICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMp
IHsKKyAgICAgICAgcm91dGVyLmxvZygiVHJhbnNpdGlvbiAjIiArIHNlcXVlbmNlICsgIjogIiAr
IG1zZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtc2cgPSBzZXF1ZW5jZTsKKyAgICAgICAg
cm91dGVyLmxvZyhtc2cpOworICAgICAgfQogICAgIH0KLSAgfSwgJ3ZhbHVlJyksCiAKKyAgICAv
KioKKyAgICAgIEBwcml2YXRlCiAKLSAgX3RyaWdnZXJDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAg
IHZhciBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3NlbGVjdGlvbicpOwotICAgIHZhciB2YWx1ZSA9
IGdldCh0aGlzLCAndmFsdWUnKTsKKyAgICAgIEJlZ2lucyBhbmQgcmV0dXJucyBhIFRyYW5zaXRp
b24gYmFzZWQgb24gdGhlIHByb3ZpZGVkCisgICAgICBhcmd1bWVudHMuIEFjY2VwdHMgYXJndW1l
bnRzIGluIHRoZSBmb3JtIG9mIGJvdGggVVJMCisgICAgICB0cmFuc2l0aW9ucyBhbmQgbmFtZWQg
dHJhbnNpdGlvbnMuCiAKLSAgICBpZiAoc2VsZWN0aW9uKSB7IHRoaXMuc2VsZWN0aW9uRGlkQ2hh
bmdlKCk7IH0KLSAgICBpZiAodmFsdWUpIHsgdGhpcy52YWx1ZURpZENoYW5nZSgpOyB9CisgICAg
ICBAcGFyYW0ge1JvdXRlcn0gcm91dGVyCisgICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IGFy
Z3MgYXJndW1lbnRzIHBhc3NlZCB0byB0cmFuc2l0aW9uVG8sCisgICAgICAgIHJlcGxhY2VXaXRo
LCBvciBoYW5kbGVVUkwKKyAgICAqLworICAgIGZ1bmN0aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIs
IGFyZ3MsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAgICAvLyBOb3JtYWxpemUgYmxhbmsgdHJhbnNp
dGlvbnMgdG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCisgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0g
fHwgJy8nOworCisgICAgICBpZihhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLmhhc093blBy
b3BlcnR5KCdxdWVyeVBhcmFtcycpKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVRdWVyeVBhcmFt
VHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3NbMF0sIGlzSW50ZXJtZWRpYXRlKTsKKyAgICAgIH0gZWxz
ZSBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgeworICAgICAgICByZXR1cm4gY3JlYXRlVVJM
VHJhbnNpdGlvbihyb3V0ZXIsIG5hbWUsIGlzSW50ZXJtZWRpYXRlKTsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIHJldHVybiBjcmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBzbGljZS5jYWxs
KGFyZ3MpLCBpc0ludGVybWVkaWF0ZSk7CisgICAgICB9CisgICAgfQogCi0gICAgdGhpcy5fY2hh
bmdlKCk7Ci0gIH0sCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQogCi0gIF9jaGFuZ2VTaW5nbGU6
IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWxlY3RlZEluZGV4ID0gdGhpcy4kKClbMF0uc2VsZWN0
ZWRJbmRleCwKLSAgICAgICAgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAg
ICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpOworICAgICAgU2VyaWFsaXplcyBhIGhhbmRs
ZXIgdXNpbmcgaXRzIGN1c3RvbSBgc2VyaWFsaXplYCBtZXRob2Qgb3IKKyAgICAgIGJ5IGEgZGVm
YXVsdCB0aGF0IGxvb2tzIHVwIHRoZSBleHBlY3RlZCBwcm9wZXJ0eSBuYW1lIGZyb20KKyAgICAg
IHRoZSBkeW5hbWljIHNlZ21lbnQuCiAKLSAgICBpZiAoIWdldChjb250ZW50LCAnbGVuZ3RoJykp
IHsgcmV0dXJuOyB9Ci0gICAgaWYgKHByb21wdCAmJiBzZWxlY3RlZEluZGV4ID09PSAwKSB7IHNl
dCh0aGlzLCAnc2VsZWN0aW9uJywgbnVsbCk7IHJldHVybjsgfQorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IGhhbmRsZXIgYSByb3V0ZXIgaGFuZGxlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IG1vZGVs
IHRoZSBtb2RlbCB0byBiZSBzZXJpYWxpemVkIGZvciB0aGlzIGhhbmRsZXIKKyAgICAgIEBwYXJh
bSB7QXJyYXlbT2JqZWN0XX0gbmFtZXMgdGhlIG5hbWVzIGFycmF5IGF0dGFjaGVkIHRvIGFuCisg
ICAgICAgIGhhbmRsZXIgb2JqZWN0IHJldHVybmVkIGZyb20gcm91dGVyLnJlY29nbml6ZXIuaGFu
ZGxlcnNGb3IoKQorICAgICovCisgICAgZnVuY3Rpb24gc2VyaWFsaXplKGhhbmRsZXIsIG1vZGVs
LCBuYW1lcykgewogCi0gICAgaWYgKHByb21wdCkgeyBzZWxlY3RlZEluZGV4IC09IDE7IH0KLSAg
ICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIGNvbnRlbnQub2JqZWN0QXQoc2VsZWN0ZWRJbmRleCkp
OwotICB9LAorICAgICAgdmFyIG9iamVjdCA9IHt9OworICAgICAgaWYgKGlzUGFyYW0obW9kZWwp
KSB7CisgICAgICAgIG9iamVjdFtuYW1lc1swXV0gPSBtb2RlbDsKKyAgICAgICAgcmV0dXJuIG9i
amVjdDsKKyAgICAgIH0KIAorICAgICAgLy8gVXNlIGN1c3RvbSBzZXJpYWxpemUgaWYgaXQgZXhp
c3RzLgorICAgICAgaWYgKGhhbmRsZXIuc2VyaWFsaXplKSB7CisgICAgICAgIHJldHVybiBoYW5k
bGVyLnNlcmlhbGl6ZShtb2RlbCwgbmFtZXMpOworICAgICAgfQogCi0gIF9jaGFuZ2VNdWx0aXBs
ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9wdGlvbnMgPSB0aGlzLiQoJ29wdGlvbjpzZWxlY3Rl
ZCcpLAotICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpLAotICAgICAgICBvZmZz
ZXQgPSBwcm9tcHQgPyAxIDogMCwKLSAgICAgICAgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVu
dCcpLAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3NlbGVjdGlvbicpOworICAgICAg
aWYgKG5hbWVzLmxlbmd0aCAhPT0gMSkgeyByZXR1cm47IH0KIAotICAgIGlmICghY29udGVudCl7
IHJldHVybjsgfQotICAgIGlmIChvcHRpb25zKSB7Ci0gICAgICB2YXIgc2VsZWN0ZWRJbmRleGVz
ID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBv
ZmZzZXQ7Ci0gICAgICB9KS50b0FycmF5KCk7Ci0gICAgICB2YXIgbmV3U2VsZWN0aW9uID0gY29u
dGVudC5vYmplY3RzQXQoc2VsZWN0ZWRJbmRleGVzKTsKKyAgICAgIHZhciBuYW1lID0gbmFtZXNb
MF07CiAKLSAgICAgIGlmIChpc0FycmF5KHNlbGVjdGlvbikpIHsKLSAgICAgICAgcmVwbGFjZShz
ZWxlY3Rpb24sIDAsIGdldChzZWxlY3Rpb24sICdsZW5ndGgnKSwgbmV3U2VsZWN0aW9uKTsKKyAg
ICAgIGlmICgvX2lkJC8udGVzdChuYW1lKSkgeworICAgICAgICBvYmplY3RbbmFtZV0gPSBtb2Rl
bC5pZDsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldCh0aGlzLCAnc2VsZWN0aW9uJywgbmV3
U2VsZWN0aW9uKTsKKyAgICAgICAgb2JqZWN0W25hbWVdID0gbW9kZWw7CiAgICAgICB9CisgICAg
ICByZXR1cm4gb2JqZWN0OwogICAgIH0KLSAgfSwKKyAgfSk7CiAKLSAgX3NlbGVjdGlvbkRpZENo
YW5nZVNpbmdsZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsZW1lbnQn
KTsKLSAgICBpZiAoIWVsKSB7IHJldHVybjsgfQorfSkoKTsKIAotICAgIHZhciBjb250ZW50ID0g
Z2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2Vs
ZWN0aW9uJyksCi0gICAgICAgIHNlbGVjdGlvbkluZGV4ID0gY29udGVudCA/IGluZGV4T2YoY29u
dGVudCwgc2VsZWN0aW9uKSA6IC0xLAotICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21w
dCcpOwogCi0gICAgaWYgKHByb21wdCkgeyBzZWxlY3Rpb25JbmRleCArPSAxOyB9Ci0gICAgaWYg
KGVsKSB7IGVsLnNlbGVjdGVkSW5kZXggPSBzZWxlY3Rpb25JbmRleDsgfQotICB9LAogCi0gIF9z
ZWxlY3Rpb25EaWRDaGFuZ2VNdWx0aXBsZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQg
PSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc2VsZWN0aW9uID0gZ2V0KHRoaXMsICdz
ZWxlY3Rpb24nKSwKLSAgICAgICAgc2VsZWN0ZWRJbmRleGVzID0gY29udGVudCA/IGluZGV4ZXNP
Zihjb250ZW50LCBzZWxlY3Rpb24pIDogWy0xXSwKLSAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMs
ICdwcm9tcHQnKSwKLSAgICAgICAgb2Zmc2V0ID0gcHJvbXB0ID8gMSA6IDAsCi0gICAgICAgIG9w
dGlvbnMgPSB0aGlzLiQoJ29wdGlvbicpLAotICAgICAgICBhZGp1c3RlZDsKKyhmdW5jdGlvbigp
IHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisqLwogCi0g
ICAgaWYgKG9wdGlvbnMpIHsKLSAgICAgIG9wdGlvbnMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAg
ICAgYWRqdXN0ZWQgPSB0aGlzLmluZGV4ID4gLTEgPyB0aGlzLmluZGV4IC0gb2Zmc2V0IDogLTE7
Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpbmRleE9mKHNlbGVjdGVkSW5kZXhlcywgYWRqdXN0
ZWQpID4gLTE7Ci0gICAgICB9KTsKK2Z1bmN0aW9uIERTTChuYW1lKSB7CisgIHRoaXMucGFyZW50
ID0gbmFtZTsKKyAgdGhpcy5tYXRjaGVzID0gW107Cit9CisKK0RTTC5wcm90b3R5cGUgPSB7Cisg
IHJlc291cmNlOiBmdW5jdGlvbihuYW1lLCBvcHRpb25zLCBjYWxsYmFjaykgeworICAgIGlmIChh
cmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7
CisgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7CisgICAgICBvcHRpb25zID0ge307CiAgICAgfQot
ICB9LAogCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhp
cy5vbigiZGlkSW5zZXJ0RWxlbWVudCIsIHRoaXMsIHRoaXMuX3RyaWdnZXJDaGFuZ2UpOwotICAg
IHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX2NoYW5nZSk7Ci0gIH0KLX0pOworICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICBvcHRpb25zID0ge307CisgICAgfQog
Ci1FbWJlci5TZWxlY3RPcHRpb24gPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gIHRhZ05hbWU6ICdv
cHRpb24nLAotICBhdHRyaWJ1dGVCaW5kaW5nczogWyd2YWx1ZScsICdzZWxlY3RlZCddLAorICAg
IGlmICh0eXBlb2Ygb3B0aW9ucy5wYXRoICE9PSAnc3RyaW5nJykgeworICAgICAgb3B0aW9ucy5w
YXRoID0gIi8iICsgbmFtZTsKKyAgICB9CiAKLSAgZGVmYXVsdFRlbXBsYXRlOiBmdW5jdGlvbihj
b250ZXh0LCBvcHRpb25zKSB7Ci0gICAgb3B0aW9ucyA9IHsgZGF0YTogb3B0aW9ucy5kYXRhLCBo
YXNoOiB7fSB9OwotICAgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5iaW5kLmNhbGwoY29udGV4
dCwgInZpZXcubGFiZWwiLCBvcHRpb25zKTsKLSAgfSwKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAg
ICAgIHZhciBkc2wgPSBuZXcgRFNMKG5hbWUpOworICAgICAgcm91dGUoZHNsLCAnbG9hZGluZycp
OworICAgICAgcm91dGUoZHNsLCAnZXJyb3InLCB7IHBhdGg6ICIvX3VudXNlZF9kdW1teV9lcnJv
cl9wYXRoX3JvdXRlXyIgKyBuYW1lICsgIi86ZXJyb3IiIH0pOworICAgICAgY2FsbGJhY2suY2Fs
bChkc2wpOworICAgICAgdGhpcy5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgZHNsLmdlbmVyYXRl
KCksIG9wdGlvbnMucXVlcnlQYXJhbXMpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnB1c2go
b3B0aW9ucy5wYXRoLCBuYW1lLCBudWxsLCBvcHRpb25zLnF1ZXJ5UGFyYW1zKTsKKyAgICB9CiAK
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sYWJlbFBhdGhEaWRDaGFuZ2UoKTsKLSAg
ICB0aGlzLnZhbHVlUGF0aERpZENoYW5nZSgpOwogCi0gICAgdGhpcy5fc3VwZXIoKTsKKyAgICAg
IH0sCisKKyAgcHVzaDogZnVuY3Rpb24odXJsLCBuYW1lLCBjYWxsYmFjaywgcXVlcnlQYXJhbXMp
IHsKKyAgICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CisgICAgaWYgKHVybCA9PT0gIiIg
fHwgdXJsID09PSAiLyIgfHwgcGFydHNbcGFydHMubGVuZ3RoLTFdID09PSAiaW5kZXgiKSB7IHRo
aXMuZXhwbGljaXRJbmRleCA9IHRydWU7IH0KKworICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmws
IG5hbWUsIGNhbGxiYWNrLCBxdWVyeVBhcmFtc10pOwogICB9LAogCi0gIHNlbGVjdGVkOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29u
dGVudCcpLAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3BhcmVudFZpZXcuc2VsZWN0
aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlzLCAncGFyZW50Vmlldy5tdWx0aXBsZScpKSB7Ci0gICAg
ICByZXR1cm4gc2VsZWN0aW9uICYmIGluZGV4T2Yoc2VsZWN0aW9uLCBjb250ZW50LnZhbHVlT2Yo
KSkgPiAtMTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gUHJpbWl0aXZlcyBnZXQgcGFzc2VkIHRo
cm91Z2ggYmluZGluZ3MgYXMgb2JqZWN0cy4uLiBzaW5jZQotICAgICAgLy8gYG5ldyBOdW1iZXIo
NCkgIT09IDRgLCB3ZSB1c2UgYD09YCBiZWxvdwotICAgICAgcmV0dXJuIGNvbnRlbnQgPT0gc2Vs
ZWN0aW9uOwotICAgIH0KLSAgfSkucHJvcGVydHkoJ2NvbnRlbnQnLCAncGFyZW50Vmlldy5zZWxl
Y3Rpb24nKS52b2xhdGlsZSgpLAorICByb3V0ZTogZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewor
ICAgIHJvdXRlKHRoaXMsIG5hbWUsIG9wdGlvbnMpOworICAgICAgfSwKIAotICBsYWJlbFBhdGhE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHZhciBsYWJlbFBhdGgg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0aW9uTGFiZWxQYXRoJyk7CisgIGdlbmVyYXRlOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgZHNsTWF0Y2hlcyA9IHRoaXMubWF0Y2hlczsKIAotICAgIGlm
ICghbGFiZWxQYXRoKSB7IHJldHVybjsgfQorICAgIGlmICghdGhpcy5leHBsaWNpdEluZGV4KSB7
CisgICAgICB0aGlzLnJvdXRlKCJpbmRleCIsIHsgcGF0aDogIi8iIH0pOworICAgIH0KIAotICAg
IEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICdsYWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCBsYWJlbFBhdGgpOwotICAgIH0pLnByb3Bl
cnR5KGxhYmVsUGF0aCkpOwotICB9LCAncGFyZW50Vmlldy5vcHRpb25MYWJlbFBhdGgnKSwKKyAg
ICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIGZvciAodmFyIGk9MCwgbD1kc2xNYXRj
aGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICAgICAgdmFyIGRzbE1hdGNoID0gZHNsTWF0Y2hl
c1tpXTsKKyAgICAgICAgdmFyIG1hdGNoT2JqID0gbWF0Y2goZHNsTWF0Y2hbMF0pLnRvKGRzbE1h
dGNoWzFdLCBkc2xNYXRjaFsyXSk7CisgICAgICAgICAgICAgIH0KKyAgICB9OworICB9Cit9Owog
Ci0gIHZhbHVlUGF0aERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHZhbHVlUGF0aCA9IGdldCh0aGlzLCAncGFyZW50Vmlldy5vcHRpb25WYWx1ZVBhdGgnKTsK
K2Z1bmN0aW9uIHJvdXRlKGRzbCwgbmFtZSwgb3B0aW9ucykgeworICBFbWJlci5hc3NlcnQoIllv
dSBtdXN0IHVzZSBgdGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5cGVvZiBvcHRpb25zICE9PSAn
ZnVuY3Rpb24nKTsKIAotICAgIGlmICghdmFsdWVQYXRoKSB7IHJldHVybjsgfQorICBvcHRpb25z
ID0gb3B0aW9ucyB8fCB7fTsKIAotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1
ZScsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCB2
YWx1ZVBhdGgpOwotICAgIH0pLnByb3BlcnR5KHZhbHVlUGF0aCkpOwotICB9LCAncGFyZW50Vmll
dy5vcHRpb25WYWx1ZVBhdGgnKQotfSk7CisgIGlmICh0eXBlb2Ygb3B0aW9ucy5wYXRoICE9PSAn
c3RyaW5nJykgeworICAgIG9wdGlvbnMucGF0aCA9ICIvIiArIG5hbWU7CisgIH0KIAotfSkoKTsK
KyAgaWYgKGRzbC5wYXJlbnQgJiYgZHNsLnBhcmVudCAhPT0gJ2FwcGxpY2F0aW9uJykgeworICAg
IG5hbWUgPSBkc2wucGFyZW50ICsgIi4iICsgbmFtZTsKKyAgfQogCisgIGRzbC5wdXNoKG9wdGlv
bnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9ucy5xdWVyeVBhcmFtcyk7Cit9CiAKK0RTTC5tYXAg
PSBmdW5jdGlvbihjYWxsYmFjaykgeworICB2YXIgZHNsID0gbmV3IERTTCgpOworICBjYWxsYmFj
ay5jYWxsKGRzbCk7CisgIHJldHVybiBkc2w7Cit9OwogCi0oZnVuY3Rpb24oKSB7CitFbWJlci5S
b3V0ZXJEU0wgPSBEU0w7CiAKIH0pKCk7CiAKIAogCiAoZnVuY3Rpb24oKSB7Ci0vKmdsb2JhbHMg
SGFuZGxlYmFycyAqLwordmFyIGdldCA9IEVtYmVyLmdldDsKKwogLyoqCiBAbW9kdWxlIGVtYmVy
Ci1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZwog
Ki8KIAogLyoqCisKKyAgRmluZHMgYSBjb250cm9sbGVyIGluc3RhbmNlLgorCisgIEBmb3IgRW1i
ZXIKKyAgQG1ldGhvZCBjb250cm9sbGVyRm9yCiAgIEBwcml2YXRlCisqLworRW1iZXIuY29udHJv
bGxlckZvciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlv
bnMpIHsKKyAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xs
ZXJOYW1lLCBsb29rdXBPcHRpb25zKTsKK307CiAKLSAgRmluZCB0ZW1wbGF0ZXMgc3RvcmVkIGlu
IHRoZSBoZWFkIHRhZyBhcyBzY3JpcHQgdGFncyBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQotICB0
byBgRW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9iYWwgYEVtYmVyLlRFTVBMQVRFU2Agb2JqZWN0
LiBUaGlzIHdpbGwgYmUgcnVuCi0gIGFzIGFzIGpRdWVyeSBET00tcmVhZHkgY2FsbGJhY2suCisv
KioKKyAgR2VuZXJhdGVzIGEgY29udHJvbGxlciBmYWN0b3J5CiAKLSAgU2NyaXB0IHRhZ3Mgd2l0
aCBgdGV4dC94LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKLSAgd2l0aCBFbWJlcidzIEhh
bmRsZWJhcnMgYW5kIGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydzIHRlbXBsYXRlLgot
ICBUaG9zZSB3aXRoIHR5cGUgYHRleHQveC1yYXctaGFuZGxlYmFyc2Agd2lsbCBiZSBjb21waWxl
ZCB3aXRoIHJlZ3VsYXIKLSAgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4g
dmlld3MnIGNvbXB1dGVkIHByb3BlcnRpZXMuCisgIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQg
Y29udHJvbGxlciBmYWN0b3J5IGlzIGRlcml2ZWQKKyAgZnJvbSB0aGUgY29udGV4dC4gSWYgdGhl
IGNvbnRleHQgaXMgYW4gYXJyYXkgYW4gYXJyYXkgY29udHJvbGxlcgorICBpcyBnZW5lcmF0ZWQs
IGlmIGFuIG9iamVjdCwgYW4gb2JqZWN0IGNvbnRyb2xsZXIgb3RoZXJ3aXNlLCBhIGJhc2ljCisg
IGNvbnRyb2xsZXIgaXMgZ2VuZXJhdGVkLgogCi0gIEBtZXRob2QgYm9vdHN0cmFwCi0gIEBmb3Ig
RW1iZXIuSGFuZGxlYmFycwotICBAc3RhdGljCi0gIEBwYXJhbSBjdHgKLSovCi1FbWJlci5IYW5k
bGViYXJzLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKGN0eCkgewotICB2YXIgc2VsZWN0b3JzID0gJ3Nj
cmlwdFt0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyJdLCBzY3JpcHRbdHlwZT0idGV4dC94LXJhdy1o
YW5kbGViYXJzIl0nOworICBZb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIGdlbmVyYXRlZCBjb250cm9s
bGVycyBieSBkZWZpbmluZworICBgQXBwLk9iamVjdENvbnRyb2xsZXJgIG9yIGBBcHAuQXJyYXlD
b250cm9sbGVyYC4KIAotICBFbWJlci4kKHNlbGVjdG9ycywgY3R4KQotICAgIC5lYWNoKGZ1bmN0
aW9uKCkgewotICAgIC8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgc2NyaXB0IHRhZwotICAgIHZh
ciBzY3JpcHQgPSBFbWJlci4kKHRoaXMpLAotICAgICAgICB0eXBlICAgPSBzY3JpcHQuYXR0cign
dHlwZScpOworICBAZm9yIEVtYmVyCisgIEBtZXRob2QgZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9y
eQorICBAcHJpdmF0ZQorKi8KK0VtYmVyLmdlbmVyYXRlQ29udHJvbGxlckZhY3RvcnkgPSBmdW5j
dGlvbihjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KSB7CisgIHZhciBGYWN0b3J5
LCBmdWxsTmFtZSwgaW5zdGFuY2UsIG5hbWUsIGZhY3RvcnlOYW1lLCBjb250cm9sbGVyVHlwZTsK
IAotICAgIHZhciBjb21waWxlID0gKHNjcmlwdC5hdHRyKCd0eXBlJykgPT09ICd0ZXh0L3gtcmF3
LWhhbmRsZWJhcnMnKSA/Ci0gICAgICAgICAgICAgICAgICBFbWJlci4kLnByb3h5KEhhbmRsZWJh
cnMuY29tcGlsZSwgSGFuZGxlYmFycykgOgotICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94
eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUsIEVtYmVyLkhhbmRsZWJhcnMpLAotICAgICAgLy8g
R2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQsIHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBsYXRl
TmFtZSBwcm9wZXJ0eS4KLSAgICAgIC8vIEZpcnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUtbmFt
ZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNrIHRvIGl0cwotICAgICAgLy8gaWQgaWYgbm8gbmFt
ZSBpcyBmb3VuZC4KLSAgICAgIHRlbXBsYXRlTmFtZSA9IHNjcmlwdC5hdHRyKCdkYXRhLXRlbXBs
YXRlLW5hbWUnKSB8fCBzY3JpcHQuYXR0cignaWQnKSB8fCAnYXBwbGljYXRpb24nLAotICAgICAg
dGVtcGxhdGUgPSBjb21waWxlKHNjcmlwdC5odG1sKCkpOworICBpZiAoY29udGV4dCAmJiBFbWJl
ci5pc0FycmF5KGNvbnRleHQpKSB7CisgICAgY29udHJvbGxlclR5cGUgPSAnYXJyYXknOworICB9
IGVsc2UgaWYgKGNvbnRleHQpIHsKKyAgICBjb250cm9sbGVyVHlwZSA9ICdvYmplY3QnOworICB9
IGVsc2UgeworICAgIGNvbnRyb2xsZXJUeXBlID0gJ2Jhc2ljJzsKKyAgfQogCi0gICAgLy8gRm9y
IHRlbXBsYXRlcyB3aGljaCBoYXZlIGEgbmFtZSwgd2Ugc2F2ZSB0aGVtIGFuZCB0aGVuIHJlbW92
ZSB0aGVtIGZyb20gdGhlIERPTQotICAgIEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdID0g
dGVtcGxhdGU7CisgIGZhY3RvcnlOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJUeXBl
OwogCi0gICAgLy8gUmVtb3ZlIHNjcmlwdCB0YWcgZnJvbSBET00KLSAgICBzY3JpcHQucmVtb3Zl
KCk7CisgIEZhY3RvcnkgPSBjb250YWluZXIubG9va3VwRmFjdG9yeShmYWN0b3J5TmFtZSkuZXh0
ZW5kKHsKKyAgICBpc0dlbmVyYXRlZDogdHJ1ZSwKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7
CisgICAgICByZXR1cm4gIihnZW5lcmF0ZWQgIiArIGNvbnRyb2xsZXJOYW1lICsgIiBjb250cm9s
bGVyKSI7CisgICAgfQogICB9KTsKLX07CiAKLWZ1bmN0aW9uIGJvb3RzdHJhcCgpIHsKLSAgRW1i
ZXIuSGFuZGxlYmFycy5ib290c3RyYXAoIEVtYmVyLiQoZG9jdW1lbnQpICk7Ci19CisgIGZ1bGxO
YW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOwogCi0vKgotICBXZSB0aWUgdGhp
cyB0byBhcHBsaWNhdGlvbi5sb2FkIHRvIGVuc3VyZSB0aGF0IHdlJ3ZlIGF0IGxlYXN0Ci0gIGF0
dGVtcHRlZCB0byBib290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlz
IGxvYWRlZC4KKyAgY29udGFpbmVyLnJlZ2lzdGVyKGZ1bGxOYW1lLCAgRmFjdG9yeSk7CiAKLSAg
V2UgYWxzbyB0aWUgdGhpcyB0byBkb2N1bWVudCByZWFkeSBzaW5jZSB3ZSdyZSBndWFyYW50ZWVk
IHRoYXQgYWxsCi0gIHRoZSBpbmxpbmUgdGVtcGxhdGVzIGFyZSBwcmVzZW50IGF0IHRoaXMgcG9p
bnQuCisgIHJldHVybiBGYWN0b3J5OworfTsKIAotICBUaGVyZSdzIG5vIGhhcm0gdG8gcnVubmlu
ZyB0aGlzIHR3aWNlLCBzaW5jZSB3ZSByZW1vdmUgdGhlIHRlbXBsYXRlcwotICBmcm9tIHRoZSBE
T00gYWZ0ZXIgcHJvY2Vzc2luZy4KKy8qKgorICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRlcyBh
IGNvbnRyb2xsZXIuCisKKyAgVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZh
Y3RvcnkgaXMgZGVyaXZlZAorICBmcm9tIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBh
biBhcnJheSBhbiBhcnJheSBjb250cm9sbGVyCisgIGlzIGdlbmVyYXRlZCwgaWYgYW4gb2JqZWN0
LCBhbiBvYmplY3QgY29udHJvbGxlciBvdGhlcndpc2UsIGEgYmFzaWMKKyAgY29udHJvbGxlciBp
cyBnZW5lcmF0ZWQuCisKKyAgQGZvciBFbWJlcgorICBAbWV0aG9kIGdlbmVyYXRlQ29udHJvbGxl
cgorICBAcHJpdmF0ZQogKi8KK0VtYmVyLmdlbmVyYXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNv
bnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpIHsKKyAgRW1iZXIuZ2VuZXJhdGVDb250
cm9sbGVyRmFjdG9yeShjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KTsKKyAgdmFy
IGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOworICB2YXIgaW5zdGFu
Y2UgPSBjb250YWluZXIubG9va3VwKGZ1bGxOYW1lKTsKKworICBpZiAoZ2V0KGluc3RhbmNlLCAn
bmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7CisgICAgRW1iZXIuTG9nZ2VyLmlu
Zm8oImdlbmVyYXRlZCAtPiAiICsgZnVsbE5hbWUsIHsgZnVsbE5hbWU6IGZ1bGxOYW1lIH0pOwor
ICB9CiAKLUVtYmVyLm9uTG9hZCgnYXBwbGljYXRpb24nLCBib290c3RyYXApOworICByZXR1cm4g
aW5zdGFuY2U7Cit9OwogCiB9KSgpOwogCkBAIC0yMTQ1NiwyMTk5ICszMzUzNSwyNjQ4IEBAIEVt
YmVyLm9uTG9hZCgnYXBwbGljYXRpb24nLCBib290c3RyYXApOwogCiAoZnVuY3Rpb24oKSB7CiAv
KioKLUVtYmVyIEhhbmRsZWJhcnMKLQogQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1o
YW5kbGViYXJzCi1AcmVxdWlyZXMgZW1iZXItdmlld3MKK0BzdWJtb2R1bGUgZW1iZXItcm91dGlu
ZwogKi8KIAotRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJlci5IYW5kbGViYXJzJywgRW1iZXIuSGFu
ZGxlYmFycyk7Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLWRlZmluZSgicm91dGUtcmVjb2du
aXplciIsCi0gIFtdLAotICBmdW5jdGlvbigpIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFy
IHNwZWNpYWxzID0gWwotICAgICAgJy8nLCAnLicsICcqJywgJysnLCAnPycsICd8JywKLSAgICAg
ICcoJywgJyknLCAnWycsICddJywgJ3snLCAnfScsICdcXCcKLSAgICBdOwotCi0gICAgdmFyIGVz
Y2FwZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcJyArIHNwZWNpYWxzLmpvaW4oJ3xcXCcpICsgJykn
LCAnZycpOwotCi0gICAgLy8gQSBTZWdtZW50IHJlcHJlc2VudHMgYSBzZWdtZW50IGluIHRoZSBv
cmlnaW5hbCByb3V0ZSBkZXNjcmlwdGlvbi4KLSAgICAvLyBFYWNoIFNlZ21lbnQgdHlwZSBwcm92
aWRlcyBhbiBgZWFjaENoYXJgIGFuZCBgcmVnZXhgIG1ldGhvZC4KLSAgICAvLwotICAgIC8vIFRo
ZSBgZWFjaENoYXJgIG1ldGhvZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIG9uZSBvciBtb3Jl
IGNoYXJhY3RlcgotICAgIC8vIHNwZWNpZmljYXRpb25zLiBBIGNoYXJhY3RlciBzcGVjaWZpY2F0
aW9uIGNvbnN1bWVzIG9uZSBvciBtb3JlIGlucHV0Ci0gICAgLy8gY2hhcmFjdGVycy4KLSAgICAv
LwotICAgIC8vIFRoZSBgcmVnZXhgIG1ldGhvZCByZXR1cm5zIGEgcmVnZXggZnJhZ21lbnQgZm9y
IHRoZSBzZWdtZW50LiBJZiB0aGUKLSAgICAvLyBzZWdtZW50IGlzIGEgZHluYW1pYyBvZiBzdGFy
IHNlZ21lbnQsIHRoZSByZWdleCBmcmFnbWVudCBhbHNvIGluY2x1ZGVzCi0gICAgLy8gYSBjYXB0
dXJlLgotICAgIC8vCi0gICAgLy8gQSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBjb250YWluczoK
LSAgICAvLwotICAgIC8vICogYHZhbGlkQ2hhcnNgOiBhIFN0cmluZyB3aXRoIGEgbGlzdCBvZiBh
bGwgdmFsaWQgY2hhcmFjdGVycywgb3IKLSAgICAvLyAqIGBpbnZhbGlkQ2hhcnNgOiBhIFN0cmlu
ZyB3aXRoIGEgbGlzdCBvZiBhbGwgaW52YWxpZCBjaGFyYWN0ZXJzCi0gICAgLy8gKiBgcmVwZWF0
YDogdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY2FuIHJlcGVhdAotCi0gICAg
ZnVuY3Rpb24gU3RhdGljU2VnbWVudChzdHJpbmcpIHsgdGhpcy5zdHJpbmcgPSBzdHJpbmc7IH0K
LSAgICBTdGF0aWNTZWdtZW50LnByb3RvdHlwZSA9IHsKLSAgICAgIGVhY2hDaGFyOiBmdW5jdGlv
bihjYWxsYmFjaykgewotICAgICAgICB2YXIgc3RyaW5nID0gdGhpcy5zdHJpbmcsIGNoYXI7Ci0K
LSAgICAgICAgZm9yICh2YXIgaT0wLCBsPXN0cmluZy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
ICAgICAgY2hhciA9IHN0cmluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgY2FsbGJhY2soeyB2YWxp
ZENoYXJzOiBjaGFyIH0pOwotICAgICAgICB9Ci0gICAgICB9LAordmFyIFJvdXRlciA9IHJlcXVp
cmVNb2R1bGUoInJvdXRlciIpWydkZWZhdWx0J107Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQ7Cit2YXIgZGVmaW5lUHJvcGVydHkgPSBFbWJlci5kZWZpbmVQcm9wZXJ0eTsK
K3ZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKIAotICAgICAgcmVnZXg6IGZ1bmN0
aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcucmVwbGFjZShlc2NhcGVSZWdleCwg
J1xcJDEnKTsKLSAgICAgIH0sCit2YXIgRGVmYXVsdFZpZXcgPSBFbWJlci5fTWV0YW1vcnBoVmll
dzsKKy8qKgorICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0aGUgYXBwbGljYXRp
b24gc3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCisgIHRoZSBbcm91dGluZyBndWlkZV0oaHR0cDov
L2VtYmVyanMuY29tL2d1aWRlcy9yb3V0aW5nLykgZm9yIGRvY3VtZW50YXRpb24uCiAKLSAgICAg
IGdlbmVyYXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOwotICAg
ICAgfQotICAgIH07CisgIEBjbGFzcyBSb3V0ZXIKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKKyovCitFbWJlci5Sb3V0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KEVtYmVyLkV2ZW50ZWQsIHsKKyAgLyoqCisgICAgVGhlIGBsb2NhdGlvbmAgcHJvcGVydHkgZGV0
ZXJtaW5lcyB0aGUgdHlwZSBvZiBVUkwncyB0aGF0IHlvdXIKKyAgICBhcHBsaWNhdGlvbiB3aWxs
IHVzZS4KIAotICAgIGZ1bmN0aW9uIER5bmFtaWNTZWdtZW50KG5hbWUpIHsgdGhpcy5uYW1lID0g
bmFtZTsgfQotICAgIER5bmFtaWNTZWdtZW50LnByb3RvdHlwZSA9IHsKLSAgICAgIGVhY2hDaGFy
OiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjayh7IGludmFsaWRDaGFyczog
Ii8iLCByZXBlYXQ6IHRydWUgfSk7Ci0gICAgICB9LAorICAgIFRoZSBmb2xsb3dpbmcgbG9jYXRp
b24gdHlwZXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGU6CiAKLSAgICAgIHJlZ2V4OiBmdW5jdGlv
bigpIHsKLSAgICAgICAgcmV0dXJuICIoW14vXSspIjsKLSAgICAgIH0sCisgICAgKiBgaGFzaGAK
KyAgICAqIGBoaXN0b3J5YAorICAgICogYG5vbmVgCiAKLSAgICAgIGdlbmVyYXRlOiBmdW5jdGlv
bihwYXJhbXMpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOwotICAgICAgfQot
ICAgIH07CisgICAgQHByb3BlcnR5IGxvY2F0aW9uCisgICAgQGRlZmF1bHQgJ2hhc2gnCisgICAg
QHNlZSB7RW1iZXIuTG9jYXRpb259CisgICovCisgIGxvY2F0aW9uOiAnaGFzaCcsCiAKLSAgICBm
dW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH0KLSAgICBTdGFy
U2VnbWVudC5wcm90b3R5cGUgPSB7Ci0gICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJhY2sp
IHsKLSAgICAgICAgY2FsbGJhY2soeyBpbnZhbGlkQ2hhcnM6ICIiLCByZXBlYXQ6IHRydWUgfSk7
Ci0gICAgICB9LAorICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJvdXRlciA9IHRoaXMu
Y29uc3RydWN0b3Iucm91dGVyIHx8IHRoaXMuY29uc3RydWN0b3IubWFwKEVtYmVyLkspOworICAg
IHRoaXMuX2FjdGl2ZVZpZXdzID0ge307CisgICAgdGhpcy5fc2V0dXBMb2NhdGlvbigpOwogCi0g
ICAgICByZWdleDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiAiKC4rKSI7Ci0gICAgICB9
LAorICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZS5MT0dfVFJBTlNJVElPTlNfSU5URVJOQUwn
KSkgeworICAgICAgdGhpcy5yb3V0ZXIubG9nID0gRW1iZXIuTG9nZ2VyLmRlYnVnOworICAgIH0K
KyAgfSwKIAotICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHBhcmFtcykgewotICAgICAgICByZXR1
cm4gcGFyYW1zW3RoaXMubmFtZV07Ci0gICAgICB9Ci0gICAgfTsKKyAgLyoqCisgICAgUmVwcmVz
ZW50cyB0aGUgY3VycmVudCBVUkwuCiAKLSAgICBmdW5jdGlvbiBFcHNpbG9uU2VnbWVudCgpIHt9
Ci0gICAgRXBzaWxvblNlZ21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFjaENoYXI6IGZ1bmN0
aW9uKCkge30sCi0gICAgICByZWdleDogZnVuY3Rpb24oKSB7IHJldHVybiAiIjsgfSwKLSAgICAg
IGdlbmVyYXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuICIiOyB9Ci0gICAgfTsKKyAgICBAbWV0aG9k
IHVybAorICAgIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBjdXJyZW50IFVSTC4KKyAgKi8KKyAgdXJs
OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZ2V0KHRoaXMsICdsb2Nh
dGlvbicpLmdldFVSTCgpOworICB9KSwKIAotICAgIGZ1bmN0aW9uIHBhcnNlKHJvdXRlLCBuYW1l
cywgdHlwZXMpIHsKLSAgICAgIC8vIG5vcm1hbGl6ZSByb3V0ZSBhcyBub3Qgc3RhcnRpbmcgd2l0
aCBhICIvIi4gUmVjb2duaXRpb24gd2lsbAotICAgICAgLy8gYWxzbyBub3JtYWxpemUuCi0gICAg
ICBpZiAocm91dGUuY2hhckF0KDApID09PSAiLyIpIHsgcm91dGUgPSByb3V0ZS5zdWJzdHIoMSk7
IH0KKyAgLyoqCisgICAgSW5pdGlhbGl6ZXMgdGhlIGN1cnJlbnQgcm91dGVyIGluc3RhbmNlIGFu
ZCBzZXRzIHVwIHRoZSBjaGFuZ2UgaGFuZGxpbmcKKyAgICBldmVudCBsaXN0ZW5lcnMgdXNlZCBi
eSB0aGUgaW5zdGFuY2VzIGBsb2NhdGlvbmAgaW1wbGVtZW50YXRpb24uCiAKLSAgICAgIHZhciBz
ZWdtZW50cyA9IHJvdXRlLnNwbGl0KCIvIiksIHJlc3VsdHMgPSBbXTsKKyAgICBAbWV0aG9kIHN0
YXJ0Um91dGluZworICAgIEBwcml2YXRlCisgICovCisgIHN0YXJ0Um91dGluZzogZnVuY3Rpb24o
KSB7CisgICAgdGhpcy5yb3V0ZXIgPSB0aGlzLnJvdXRlciB8fCB0aGlzLmNvbnN0cnVjdG9yLm1h
cChFbWJlci5LKTsKIAotICAgICAgZm9yICh2YXIgaT0wLCBsPXNlZ21lbnRzLmxlbmd0aDsgaTxs
OyBpKyspIHsKLSAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXSwgbWF0Y2g7CisgICAg
dmFyIHJvdXRlciA9IHRoaXMucm91dGVyLAorICAgICAgICBsb2NhdGlvbiA9IGdldCh0aGlzLCAn
bG9jYXRpb24nKSwKKyAgICAgICAgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsCisgICAgICAg
IHNlbGYgPSB0aGlzOwogCi0gICAgICAgIGlmIChtYXRjaCA9IHNlZ21lbnQubWF0Y2goL146KFte
XC9dKykkLykpIHsKLSAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IER5bmFtaWNTZWdtZW50KG1h
dGNoWzFdKSk7Ci0gICAgICAgICAgbmFtZXMucHVzaChtYXRjaFsxXSk7Ci0gICAgICAgICAgdHlw
ZXMuZHluYW1pY3MrKzsKLSAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IHNlZ21lbnQubWF0Y2go
L15cKihbXlwvXSspJC8pKSB7Ci0gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGFyU2VnbWVu
dChtYXRjaFsxXSkpOwotICAgICAgICAgIG5hbWVzLnB1c2gobWF0Y2hbMV0pOwotICAgICAgICAg
IHR5cGVzLnN0YXJzKys7Ci0gICAgICAgIH0gZWxzZSBpZihzZWdtZW50ID09PSAiIikgewotICAg
ICAgICAgIHJlc3VsdHMucHVzaChuZXcgRXBzaWxvblNlZ21lbnQoKSk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGF0aWNTZWdtZW50KHNlZ21lbnQpKTsK
LSAgICAgICAgICB0eXBlcy5zdGF0aWNzKys7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICB0aGlz
Ll9zZXR1cFJvdXRlcihyb3V0ZXIsIGxvY2F0aW9uKTsKIAotICAgICAgcmV0dXJuIHJlc3VsdHM7
Ci0gICAgfQorICAgIGNvbnRhaW5lci5yZWdpc3RlcigndmlldzpkZWZhdWx0JywgRGVmYXVsdFZp
ZXcpOworICAgIGNvbnRhaW5lci5yZWdpc3Rlcigndmlldzp0b3BsZXZlbCcsIEVtYmVyLlZpZXcu
ZXh0ZW5kKCkpOwogCi0gICAgLy8gQSBTdGF0ZSBoYXMgYSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlv
biBhbmQgKGBjaGFyU3BlY2ApIGFuZCBhIGxpc3Qgb2YgcG9zc2libGUKLSAgICAvLyBzdWJzZXF1
ZW50IHN0YXRlcyAoYG5leHRTdGF0ZXNgKS4KLSAgICAvLwotICAgIC8vIElmIGEgU3RhdGUgaXMg
YW4gYWNjZXB0aW5nIHN0YXRlLCBpdCB3aWxsIGFsc28gaGF2ZSBzZXZlcmFsIGFkZGl0aW9uYWwK
LSAgICAvLyBwcm9wZXJ0aWVzOgotICAgIC8vCi0gICAgLy8gKiBgcmVnZXhgOiBBIHJlZ3VsYXIg
ZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gZXh0cmFjdCBwYXJhbWV0ZXJzIGZyb20gcGF0aHMK
LSAgICAvLyAgIHRoYXQgcmVhY2hlZCB0aGlzIGFjY2VwdGluZyBzdGF0ZS4KLSAgICAvLyAqIGBo
YW5kbGVyc2A6IEluZm9ybWF0aW9uIG9uIGhvdyB0byBjb252ZXJ0IHRoZSBsaXN0IG9mIGNhcHR1
cmVzIGludG8gY2FsbHMKLSAgICAvLyAgIHRvIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2l0aCB0aGUg
c3BlY2lmaWVkIHBhcmFtZXRlcnMKLSAgICAvLyAqIGB0eXBlc2A6IEhvdyBtYW55IHN0YXRpYywg
ZHluYW1pYyBvciBzdGFyIHNlZ21lbnRzIGluIHRoaXMgcm91dGUuIFVzZWQgdG8KLSAgICAvLyAg
IGRlY2lkZSB3aGljaCByb3V0ZSB0byB1c2UgaWYgbXVsdGlwbGUgcmVnaXN0ZXJlZCByb3V0ZXMg
bWF0Y2ggYSBwYXRoLgotICAgIC8vCi0gICAgLy8gQ3VycmVudGx5LCBTdGF0ZSBpcyBpbXBsZW1l
bnRlZCBuYWl2ZWx5IGJ5IGxvb3Bpbmcgb3ZlciBgbmV4dFN0YXRlc2AgYW5kCi0gICAgLy8gY29t
cGFyaW5nIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYWdhaW5zdCBhIGNoYXJhY3Rlci4gQSBt
b3JlIGVmZmljaWVudAotICAgIC8vIGltcGxlbWVudGF0aW9uIHdvdWxkIHVzZSBhIGhhc2ggb2Yg
a2V5cyBwb2ludGluZyBhdCBvbmUgb3IgbW9yZSBuZXh0IHN0YXRlcy4KKyAgICBsb2NhdGlvbi5v
blVwZGF0ZVVSTChmdW5jdGlvbih1cmwpIHsKKyAgICAgIHNlbGYuaGFuZGxlVVJMKHVybCk7Cisg
ICAgfSk7CiAKLSAgICBmdW5jdGlvbiBTdGF0ZShjaGFyU3BlYykgewotICAgICAgdGhpcy5jaGFy
U3BlYyA9IGNoYXJTcGVjOwotICAgICAgdGhpcy5uZXh0U3RhdGVzID0gW107CisgICAgdGhpcy5o
YW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkpOworICB9LAorCisgIC8qKgorICAgIEhhbmRsZXMg
dXBkYXRpbmcgdGhlIHBhdGhzIGFuZCBub3RpZnlpbmcgYW55IGxpc3RlbmVycyBvZiB0aGUgVVJM
CisgICAgY2hhbmdlLgorCisgICAgVHJpZ2dlcnMgdGhlIHJvdXRlciBsZXZlbCBgZGlkVHJhbnNp
dGlvbmAgaG9vay4KKworICAgIEBtZXRob2QgZGlkVHJhbnNpdGlvbgorICAgIEBwcml2YXRlCisg
ICovCisgIGRpZFRyYW5zaXRpb246IGZ1bmN0aW9uKGluZm9zKSB7CisgICAgdXBkYXRlUGF0aHMo
dGhpcyk7CisKKyAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKKworICAgIHRoaXMubm90
aWZ5UHJvcGVydHlDaGFuZ2UoJ3VybCcpOworCisgICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1bmxv
b3Agc28gdXJsIHdpbGwgYmUgYWNjdXJhdGUuIFNlZW1zCisgICAgLy8gbGVzcyBzdXJwcmlzaW5n
IHRoYW4gZGlkVHJhbnNpdGlvbiBiZWluZyBvdXQgb2Ygc3luYy4KKyAgICBFbWJlci5ydW4ub25j
ZSh0aGlzLCB0aGlzLnRyaWdnZXIsICdkaWRUcmFuc2l0aW9uJyk7CisKKyAgICBpZiAoZ2V0KHRo
aXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJVElPTlMpIHsKKyAgICAgIEVtYmVyLkxvZ2dlci5s
b2coIlRyYW5zaXRpb25lZCBpbnRvICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3Mp
ICsgIiciKTsKICAgICB9CisgIH0sCiAKLSAgICBTdGF0ZS5wcm90b3R5cGUgPSB7Ci0gICAgICBn
ZXQ6IGZ1bmN0aW9uKGNoYXJTcGVjKSB7Ci0gICAgICAgIHZhciBuZXh0U3RhdGVzID0gdGhpcy5u
ZXh0U3RhdGVzOworICBoYW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgeworICAgIHJldHVybiB0aGlz
Ll9kb1RyYW5zaXRpb24oJ2hhbmRsZVVSTCcsIFt1cmxdKTsKKyAgfSwKIAotICAgICAgICBmb3Ig
KHZhciBpPTAsIGw9bmV4dFN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAgdmFy
IGNoaWxkID0gbmV4dFN0YXRlc1tpXTsKKyAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbigpIHsKKyAg
ICByZXR1cm4gdGhpcy5fZG9UcmFuc2l0aW9uKCd0cmFuc2l0aW9uVG8nLCBhcmd1bWVudHMpOwor
ICB9LAogCi0gICAgICAgICAgdmFyIGlzRXF1YWwgPSBjaGlsZC5jaGFyU3BlYy52YWxpZENoYXJz
ID09PSBjaGFyU3BlYy52YWxpZENoYXJzOwotICAgICAgICAgIGlzRXF1YWwgPSBpc0VxdWFsICYm
IGNoaWxkLmNoYXJTcGVjLmludmFsaWRDaGFycyA9PT0gY2hhclNwZWMuaW52YWxpZENoYXJzOwor
ICBpbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG86IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucm91dGVy
LmludGVybWVkaWF0ZVRyYW5zaXRpb25Uby5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1lbnRzKTsK
IAotICAgICAgICAgIGlmIChpc0VxdWFsKSB7IHJldHVybiBjaGlsZDsgfQotICAgICAgICB9Ci0g
ICAgICB9LAorICAgIHVwZGF0ZVBhdGhzKHRoaXMpOwogCi0gICAgICBwdXQ6IGZ1bmN0aW9uKGNo
YXJTcGVjKSB7Ci0gICAgICAgIHZhciBzdGF0ZTsKKyAgICB2YXIgaW5mb3MgPSB0aGlzLnJvdXRl
ci5jdXJyZW50SGFuZGxlckluZm9zOworICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZScpLkxP
R19UUkFOU0lUSU9OUykgeworICAgICAgRW1iZXIuTG9nZ2VyLmxvZygiSW50ZXJtZWRpYXRlLXRy
YW5zaXRpb25lZCBpbnRvICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgIici
KTsKKyAgICB9CisgIH0sCiAKLSAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBzcGVjaWZpY2F0
aW9uIGFscmVhZHkgZXhpc3RzIGluIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8g
c3RhdGUsIGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCi0gICAgICAgIGlmIChzdGF0ZSA9IHRoaXMu
Z2V0KGNoYXJTcGVjKSkgeyByZXR1cm4gc3RhdGU7IH0KKyAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLl9kb1RyYW5zaXRpb24oJ3JlcGxhY2VXaXRoJywgYXJndW1l
bnRzKTsKKyAgfSwKIAotICAgICAgICAvLyBNYWtlIGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFj
dGVyIHNwZWMKLSAgICAgICAgc3RhdGUgPSBuZXcgU3RhdGUoY2hhclNwZWMpOworICBnZW5lcmF0
ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHVybCA9IHRoaXMucm91dGVyLmdlbmVyYXRlLmFwcGx5
KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOworICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmZvcm1h
dFVSTCh1cmwpOworICB9LAogCi0gICAgICAgIC8vIEluc2VydCB0aGUgbmV3IHN0YXRlIGFzIGEg
Y2hpbGQgb2YgdGhlIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgdGhpcy5uZXh0U3RhdGVzLnB1c2go
c3RhdGUpOworICAvKioKKyAgICBEZXRlcm1pbmVzIGlmIHRoZSBzdXBwbGllZCByb3V0ZSBpcyBj
dXJyZW50bHkgYWN0aXZlLgogCi0gICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNwZWNpZmlj
YXRpb24gcmVwZWF0cywgaW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZAotICAgICAgICAv
LyBvZiBpdHNlbGYuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHRyaWdnZXIgYW4gaW5maW5pdGUg
bG9vcCBiZWNhdXNlIGVhY2gKLSAgICAgICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVjb2duaXRp
b24gY29uc3VtZXMgYSBjaGFyYWN0ZXIuCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsK
LSAgICAgICAgICBzdGF0ZS5uZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotICAgICAgICB9CisgICAg
QG1ldGhvZCBpc0FjdGl2ZQorICAgIEBwYXJhbSByb3V0ZU5hbWUKKyAgICBAcmV0dXJucyB7Qm9v
bGVhbn0KKyAgICBAcHJpdmF0ZQorICAqLworICBpc0FjdGl2ZTogZnVuY3Rpb24ocm91dGVOYW1l
KSB7CisgICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOworICAgIHJldHVybiByb3V0ZXIuaXNB
Y3RpdmUuYXBwbHkocm91dGVyLCBhcmd1bWVudHMpOworICB9LAogCi0gICAgICAgIC8vIFJldHVy
biB0aGUgbmV3IHN0YXRlCi0gICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICAgIH0sCisgIHNlbmQ6
IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQpIHsKKyAgICB0aGlzLnJvdXRlci50cmlnZ2VyLmFwcGx5
KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOworICB9LAogCi0gICAgICAvLyBGaW5kIGEgbGlzdCBv
ZiBjaGlsZCBzdGF0ZXMgbWF0Y2hpbmcgdGhlIG5leHQgY2hhcmFjdGVyCi0gICAgICBtYXRjaDog
ZnVuY3Rpb24oY2hhcikgewotICAgICAgICAvLyBERUJVRyAiUHJvY2Vzc2luZyBgIiArIGNoYXIg
KyAiYDoiCi0gICAgICAgIHZhciBuZXh0U3RhdGVzID0gdGhpcy5uZXh0U3RhdGVzLAotICAgICAg
ICAgICAgY2hpbGQsIGNoYXJTcGVjLCBjaGFyczsKKyAgLyoqCisgICAgRG9lcyB0aGlzIHJvdXRl
ciBpbnN0YW5jZSBoYXZlIHRoZSBnaXZlbiByb3V0ZS4KIAotICAgICAgICAvLyBERUJVRyAiICAi
ICsgZGVidWdTdGF0ZSh0aGlzKQotICAgICAgICB2YXIgcmV0dXJuZWQgPSBbXTsKKyAgICBAbWV0
aG9kIGhhc1JvdXRlCisgICAgQHJldHVybnMge0Jvb2xlYW59CisgICAgQHByaXZhdGUKKyAgKi8K
KyAgaGFzUm91dGU6IGZ1bmN0aW9uKHJvdXRlKSB7CisgICAgcmV0dXJuIHRoaXMucm91dGVyLmhh
c1JvdXRlKHJvdXRlKTsKKyAgfSwKIAotICAgICAgICBmb3IgKHZhciBpPTAsIGw9bmV4dFN0YXRl
cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAgY2hpbGQgPSBuZXh0U3RhdGVzW2ldOwor
ICAvKioKKyAgICBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSByb3V0ZXIgYnkgY2xlYXJpbmcgdGhl
IGN1cnJlbnQgcm91dGUKKyAgICBoYW5kbGVycyBhbmQgZGVhY3RpdmF0aW5nIHRoZW0uCiAKLSAg
ICAgICAgICBjaGFyU3BlYyA9IGNoaWxkLmNoYXJTcGVjOworICAgIEBwcml2YXRlCisgICAgQG1l
dGhvZCByZXNldAorICAgKi8KKyAgcmVzZXQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucm91dGVy
LnJlc2V0KCk7CisgIH0sCiAKLSAgICAgICAgICBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVj
LnZhbGlkQ2hhcnMpICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgaWYgKGNoYXJzLmlu
ZGV4T2YoY2hhcikgIT09IC0xKSB7IHJldHVybmVkLnB1c2goY2hpbGQpOyB9Ci0gICAgICAgICAg
fSBlbHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hhclNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3Vu
ZGVmaW5lZCcpIHsKLSAgICAgICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoYXIpID09PSAtMSkg
eyByZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQotICAgICAgICAgIH0KLSAgICAgICAgfQorICB3aWxs
RGVzdHJveTogZnVuY3Rpb24oKXsKKyAgICB2YXIgbG9jYXRpb24gPSBnZXQodGhpcywgJ2xvY2F0
aW9uJyk7CisgICAgbG9jYXRpb24uZGVzdHJveSgpOwogCi0gICAgICAgIHJldHVybiByZXR1cm5l
ZDsKLSAgICAgIH0KKyAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9
LAogCi0gICAgICAvKiogSUYgREVCVUcKLSAgICAgICwgZGVidWc6IGZ1bmN0aW9uKCkgewotICAg
ICAgICB2YXIgY2hhclNwZWMgPSB0aGlzLmNoYXJTcGVjLAotICAgICAgICAgICAgZGVidWcgPSAi
WyIsCi0gICAgICAgICAgICBjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMgfHwgY2hhclNwZWMu
aW52YWxpZENoYXJzOworICBfbG9va3VwQWN0aXZlVmlldzogZnVuY3Rpb24odGVtcGxhdGVOYW1l
KSB7CisgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZVZpZXdzW3RlbXBsYXRlTmFtZV07Cisg
ICAgcmV0dXJuIGFjdGl2ZSAmJiBhY3RpdmVbMF07CisgIH0sCiAKLSAgICAgICAgaWYgKGNoYXJT
cGVjLmludmFsaWRDaGFycykgeyBkZWJ1ZyArPSAiXiI7IH0KLSAgICAgICAgZGVidWcgKz0gY2hh
cnM7Ci0gICAgICAgIGRlYnVnICs9ICJdIjsKKyAgX2Nvbm5lY3RBY3RpdmVWaWV3OiBmdW5jdGlv
bih0ZW1wbGF0ZU5hbWUsIHZpZXcpIHsKKyAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLl9hY3RpdmVW
aWV3c1t0ZW1wbGF0ZU5hbWVdOwogCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsgZGVi
dWcgKz0gIisiOyB9CisgICAgaWYgKGV4aXN0aW5nKSB7CisgICAgICBleGlzdGluZ1swXS5vZmYo
J3dpbGxEZXN0cm95RWxlbWVudCcsIHRoaXMsIGV4aXN0aW5nWzFdKTsKKyAgICB9CiAKLSAgICAg
ICAgcmV0dXJuIGRlYnVnOwotICAgICAgfQotICAgICAgRU5EIElGICoqLworICAgIHZhciBkaXNj
b25uZWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICBkZWxldGUgdGhpcy5fYWN0aXZlVmlld3NbdGVt
cGxhdGVOYW1lXTsKICAgICB9OwogCi0gICAgLyoqIElGIERFQlVHCi0gICAgZnVuY3Rpb24gZGVi
dWcobG9nKSB7Ci0gICAgICBjb25zb2xlLmxvZyhsb2cpOworICAgIHRoaXMuX2FjdGl2ZVZpZXdz
W3RlbXBsYXRlTmFtZV0gPSBbdmlldywgZGlzY29ubmVjdF07CisgICAgdmlldy5vbmUoJ3dpbGxE
ZXN0cm95RWxlbWVudCcsIHRoaXMsIGRpc2Nvbm5lY3QpOworICB9LAorCisgIF9zZXR1cExvY2F0
aW9uOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbG9jYXRpb24gPSBnZXQodGhpcywgJ2xvY2F0aW9u
JyksCisgICAgICAgIHJvb3RVUkwgPSBnZXQodGhpcywgJ3Jvb3RVUkwnKSwKKyAgICAgICAgb3B0
aW9ucyA9IHt9OworCisgICAgaWYgKHR5cGVvZiByb290VVJMID09PSAnc3RyaW5nJykgeworICAg
ICAgb3B0aW9ucy5yb290VVJMID0gcm9vdFVSTDsKICAgICB9CiAKLSAgICBmdW5jdGlvbiBkZWJ1
Z1N0YXRlKHN0YXRlKSB7Ci0gICAgICByZXR1cm4gc3RhdGUubmV4dFN0YXRlcy5tYXAoZnVuY3Rp
b24obikgewotICAgICAgICBpZiAobi5uZXh0U3RhdGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4g
IiggIiArIG4uZGVidWcoKSArICIgW2FjY2VwdGluZ10gKSI7IH0KLSAgICAgICAgcmV0dXJuICIo
ICIgKyBuLmRlYnVnKCkgKyAiIDx0aGVuPiAiICsgbi5uZXh0U3RhdGVzLm1hcChmdW5jdGlvbihz
KSB7IHJldHVybiBzLmRlYnVnKCkgfSkuam9pbigiIG9yICIpICsgIiApIjsKLSAgICAgIH0pLmpv
aW4oIiwgIikKKyAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBsb2NhdGlvbikgeworICAgICAg
b3B0aW9ucy5pbXBsZW1lbnRhdGlvbiA9IGxvY2F0aW9uOworICAgICAgbG9jYXRpb24gPSBzZXQo
dGhpcywgJ2xvY2F0aW9uJywgRW1iZXIuTG9jYXRpb24uY3JlYXRlKG9wdGlvbnMpKTsKICAgICB9
Ci0gICAgRU5EIElGICoqLwogCi0gICAgLy8gVGhpcyBpcyBhIHNvbWV3aGF0IG5haXZlIHN0cmF0
ZWd5LCBidXQgc2hvdWxkIHdvcmsgaW4gYSBsb3Qgb2YgY2FzZXMKLSAgICAvLyBBIGJldHRlciBz
dHJhdGVneSB3b3VsZCBwcm9wZXJseSByZXNvbHZlIC9wb3N0cy86aWQvbmV3IGFuZCAvcG9zdHMv
ZWRpdC86aWQKLSAgICBmdW5jdGlvbiBzb3J0U29sdXRpb25zKHN0YXRlcykgewotICAgICAgcmV0
dXJuIHN0YXRlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKLSAgICAgICAgaWYgKGEudHlwZXMuc3Rh
cnMgIT09IGIudHlwZXMuc3RhcnMpIHsgcmV0dXJuIGEudHlwZXMuc3RhcnMgLSBiLnR5cGVzLnN0
YXJzOyB9Ci0gICAgICAgIGlmIChhLnR5cGVzLmR5bmFtaWNzICE9PSBiLnR5cGVzLmR5bmFtaWNz
KSB7IHJldHVybiBhLnR5cGVzLmR5bmFtaWNzIC0gYi50eXBlcy5keW5hbWljczsgfQotICAgICAg
ICBpZiAoYS50eXBlcy5zdGF0aWNzICE9PSBiLnR5cGVzLnN0YXRpY3MpIHsgcmV0dXJuIGEudHlw
ZXMuc3RhdGljcyAtIGIudHlwZXMuc3RhdGljczsgfQorICAgIC8vIGVuc3VyZSB0aGF0IGluaXRT
dGF0ZSBpcyBjYWxsZWQgQUZURVIgdGhlIHJvb3RVUkwgaXMgc2V0IG9uCisgICAgLy8gdGhlIGxv
Y2F0aW9uIGluc3RhbmNlCisgICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5pbml0U3RhdGUgPT09ICdm
dW5jdGlvbicpIHsgbG9jYXRpb24uaW5pdFN0YXRlKCk7IH0KKyAgfSwKIAotICAgICAgICByZXR1
cm4gMDsKLSAgICAgIH0pOwotICAgIH0KKyAgX2dldEhhbmRsZXJGdW5jdGlvbjogZnVuY3Rpb24o
KSB7CisgICAgdmFyIHNlZW4gPSB7fSwgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsCisgICAg
ICAgIERlZmF1bHRSb3V0ZSA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KCdyb3V0ZTpiYXNpYycp
LAorICAgICAgICBzZWxmID0gdGhpczsKIAotICAgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3Rh
dGVzLCBjaGFyKSB7Ci0gICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOworICAgIHJldHVybiBmdW5j
dGlvbihuYW1lKSB7CisgICAgICB2YXIgcm91dGVOYW1lID0gJ3JvdXRlOicgKyBuYW1lLAorICAg
ICAgICAgIGhhbmRsZXIgPSBjb250YWluZXIubG9va3VwKHJvdXRlTmFtZSk7CiAKLSAgICAgIGZv
ciAodmFyIGk9MCwgbD1zdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgc3Rh
dGUgPSBzdGF0ZXNbaV07CisgICAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1cm4gaGFuZGxlcjsg
fQogCi0gICAgICAgIG5leHRTdGF0ZXMgPSBuZXh0U3RhdGVzLmNvbmNhdChzdGF0ZS5tYXRjaChj
aGFyKSk7CisgICAgICBzZWVuW25hbWVdID0gdHJ1ZTsKKworICAgICAgaWYgKCFoYW5kbGVyKSB7
CisgICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihyb3V0ZU5hbWUsIERlZmF1bHRSb3V0ZS5leHRl
bmQoKSk7CisgICAgICAgIGhhbmRsZXIgPSBjb250YWluZXIubG9va3VwKHJvdXRlTmFtZSk7CisK
KyAgICAgICAgaWYgKGdldChzZWxmLCAnbmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicp
KSB7CisgICAgICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oImdlbmVyYXRlZCAtPiAiICsgcm91dGVO
YW1lLCB7IGZ1bGxOYW1lOiByb3V0ZU5hbWUgfSk7CisgICAgICAgIH0KICAgICAgIH0KIAotICAg
ICAgcmV0dXJuIG5leHRTdGF0ZXM7CisgICAgICBoYW5kbGVyLnJvdXRlTmFtZSA9IG5hbWU7Cisg
ICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9OworICB9LAorCisgIF9zZXR1cFJvdXRlcjogZnVu
Y3Rpb24ocm91dGVyLCBsb2NhdGlvbikgeworICAgIHZhciBsYXN0VVJMLCBlbWJlclJvdXRlciA9
IHRoaXM7CisKKyAgICByb3V0ZXIuZ2V0SGFuZGxlciA9IHRoaXMuX2dldEhhbmRsZXJGdW5jdGlv
bigpOworCisgICAgdmFyIGRvVXBkYXRlVVJMID0gZnVuY3Rpb24oKSB7CisgICAgICBsb2NhdGlv
bi5zZXRVUkwobGFzdFVSTCk7CisgICAgfTsKKworICAgIHJvdXRlci51cGRhdGVVUkwgPSBmdW5j
dGlvbihwYXRoKSB7CisgICAgICBsYXN0VVJMID0gcGF0aDsKKyAgICAgIEVtYmVyLnJ1bi5vbmNl
KGRvVXBkYXRlVVJMKTsKKyAgICB9OworCisgICAgaWYgKGxvY2F0aW9uLnJlcGxhY2VVUkwpIHsK
KyAgICAgIHZhciBkb1JlcGxhY2VVUkwgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgbG9jYXRpb24u
cmVwbGFjZVVSTChsYXN0VVJMKTsKKyAgICAgIH07CisKKyAgICAgIHJvdXRlci5yZXBsYWNlVVJM
ID0gZnVuY3Rpb24ocGF0aCkgeworICAgICAgICBsYXN0VVJMID0gcGF0aDsKKyAgICAgICAgRW1i
ZXIucnVuLm9uY2UoZG9SZXBsYWNlVVJMKTsKKyAgICAgIH07CiAgICAgfQogCi0gICAgZnVuY3Rp
b24gZmluZEhhbmRsZXIoc3RhdGUsIHBhdGgpIHsKLSAgICAgIHZhciBoYW5kbGVycyA9IHN0YXRl
LmhhbmRsZXJzLCByZWdleCA9IHN0YXRlLnJlZ2V4OwotICAgICAgdmFyIGNhcHR1cmVzID0gcGF0
aC5tYXRjaChyZWdleCksIGN1cnJlbnRDYXB0dXJlID0gMTsKLSAgICAgIHZhciByZXN1bHQgPSBb
XTsKKyAgICByb3V0ZXIuZGlkVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKGluZm9zKSB7CisgICAgICBl
bWJlclJvdXRlci5kaWRUcmFuc2l0aW9uKGluZm9zKTsKKyAgICB9OworICB9LAogCi0gICAgICBm
b3IgKHZhciBpPTAsIGw9aGFuZGxlcnMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIg
aGFuZGxlciA9IGhhbmRsZXJzW2ldLCBuYW1lcyA9IGhhbmRsZXIubmFtZXMsIHBhcmFtcyA9IHt9
OworICBfZG9UcmFuc2l0aW9uOiBmdW5jdGlvbihtZXRob2QsIGFyZ3MpIHsKKyAgICAvLyBOb3Jt
YWxpemUgYmxhbmsgcm91dGUgdG8gcm9vdCBVUkwuCisgICAgYXJncyA9IHNsaWNlLmNhbGwoYXJn
cyk7CisgICAgYXJnc1swXSA9IGFyZ3NbMF0gfHwgJy8nOwogCi0gICAgICAgIGZvciAodmFyIGo9
MCwgbT1uYW1lcy5sZW5ndGg7IGo8bTsgaisrKSB7Ci0gICAgICAgICAgcGFyYW1zW25hbWVzW2pd
XSA9IGNhcHR1cmVzW2N1cnJlbnRDYXB0dXJlKytdOwotICAgICAgICB9CisgICAgdmFyIHBhc3Nl
ZE5hbWUgPSBhcmdzWzBdLCBuYW1lLCBzZWxmID0gdGhpcywKKyAgICAgIGlzUXVlcnlQYXJhbXNP
bmx5ID0gZmFsc2U7CiAKLSAgICAgICAgcmVzdWx0LnB1c2goeyBoYW5kbGVyOiBoYW5kbGVyLmhh
bmRsZXIsIHBhcmFtczogcGFyYW1zLCBpc0R5bmFtaWM6ICEhbmFtZXMubGVuZ3RoIH0pOworICAg
IAorICAgIGlmICghaXNRdWVyeVBhcmFtc09ubHkgJiYgcGFzc2VkTmFtZS5jaGFyQXQoMCkgPT09
ICcvJykgeworICAgICAgbmFtZSA9IHBhc3NlZE5hbWU7CisgICAgfSBlbHNlIGlmICghaXNRdWVy
eVBhcmFtc09ubHkpIHsKKyAgICAgIGlmICghdGhpcy5yb3V0ZXIuaGFzUm91dGUocGFzc2VkTmFt
ZSkpIHsKKyAgICAgICAgbmFtZSA9IGFyZ3NbMF0gPSBwYXNzZWROYW1lICsgJy5pbmRleCc7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gcGFzc2VkTmFtZTsKICAgICAgIH0KIAotICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIEVtYmVyLmFzc2VydCgiVGhlIHJvdXRlICIgKyBwYXNz
ZWROYW1lICsgIiB3YXMgbm90IGZvdW5kIiwgdGhpcy5yb3V0ZXIuaGFzUm91dGUobmFtZSkpOwog
ICAgIH0KIAotICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KSB7
Ci0gICAgICBzZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIpIHsKLSAgICAgICAgdmFyIHN0
YXRlOworICAgIHZhciB0cmFuc2l0aW9uUHJvbWlzZSA9IHRoaXMucm91dGVyW21ldGhvZF0uYXBw
bHkodGhpcy5yb3V0ZXIsIGFyZ3MpOwogCi0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRT
dGF0ZS5wdXQoY2hhcik7Ci0gICAgICB9KTsKKyAgICB0cmFuc2l0aW9uUHJvbWlzZS50aGVuKG51
bGwsIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gIlVucmVjb2du
aXplZFVSTEVycm9yIikgeworICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSBVUkwgJyIgKyBlcnJv
ci5tZXNzYWdlICsgIicgZGlkIG5vdCBtYXRjaCBhbnkgcm91dGVzIGluIHlvdXIgYXBwbGljYXRp
b24iKTsKKyAgICAgIH0KKyAgICB9LCAnRW1iZXI6IENoZWNrIGZvciBSb3V0ZXIgdW5yZWNvZ25p
emVkIFVSTCBlcnJvcicpOwogCi0gICAgICByZXR1cm4gY3VycmVudFN0YXRlOwotICAgIH0KKyAg
ICAvLyBXZSB3YW50IHRvIHJldHVybiB0aGUgY29uZmlndXJhYmxlIHByb21pc2Ugb2JqZWN0Cisg
ICAgLy8gc28gdGhhdCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gY2FuIHVzZSBgLm1ldGhvZCgp
YCBvbiBpdCwKKyAgICAvLyB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBleGlzdCBmb3Igbm9ybWFs
IFJTVlAgcHJvbWlzZXMuCisgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9taXNlOworICB9LAogCi0g
ICAgLy8gVGhlIG1haW4gaW50ZXJmYWNlCisgIF9zY2hlZHVsZUxvYWRpbmdFdmVudDogZnVuY3Rp
b24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKKyAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZl
bnQoKTsKKyAgICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9IEVtYmVyLnJ1bi5zY2hlZHVsZU9u
Y2UoJ3JvdXRlclRyYW5zaXRpb25zJywgdGhpcywgJ19maXJlTG9hZGluZ0V2ZW50JywgdHJhbnNp
dGlvbiwgb3JpZ2luUm91dGUpOworICB9LAogCi0gICAgdmFyIFJvdXRlUmVjb2duaXplciA9IGZ1
bmN0aW9uKCkgewotICAgICAgdGhpcy5yb290U3RhdGUgPSBuZXcgU3RhdGUoKTsKLSAgICAgIHRo
aXMubmFtZXMgPSB7fTsKLSAgICB9OworICBfZmlyZUxvYWRpbmdFdmVudDogZnVuY3Rpb24odHJh
bnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKKyAgICBpZiAoIXRoaXMucm91dGVyLmFjdGl2ZVRyYW5z
aXRpb24pIHsKKyAgICAgIC8vIERvbid0IGZpcmUgYW4gZXZlbnQgaWYgd2UndmUgc2luY2UgbW92
ZWQgb24gZnJvbQorICAgICAgLy8gdGhlIHRyYW5zaXRpb24gdGhhdCBwdXQgdXMgaW4gYSBsb2Fk
aW5nIHN0YXRlLgorICAgICAgcmV0dXJuOworICAgIH0KIAorICAgIHRyYW5zaXRpb24udHJpZ2dl
cih0cnVlLCAnbG9hZGluZycsIHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKTsKKyAgfSwKIAotICAg
IFJvdXRlUmVjb2duaXplci5wcm90b3R5cGUgPSB7Ci0gICAgICBhZGQ6IGZ1bmN0aW9uKHJvdXRl
cywgb3B0aW9ucykgewotICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gdGhpcy5yb290U3RhdGUs
IHJlZ2V4ID0gIl4iLAotICAgICAgICAgICAgdHlwZXMgPSB7IHN0YXRpY3M6IDAsIGR5bmFtaWNz
OiAwLCBzdGFyczogMCB9LAotICAgICAgICAgICAgaGFuZGxlcnMgPSBbXSwgYWxsU2VnbWVudHMg
PSBbXSwgbmFtZTsKKyAgX2NhbmNlbExvYWRpbmdFdmVudDogZnVuY3Rpb24gKCkgeworICAgIGlm
ICh0aGlzLl9sb2FkaW5nU3RhdGVUaW1lcikgeworICAgICAgRW1iZXIucnVuLmNhbmNlbCh0aGlz
Ll9sb2FkaW5nU3RhdGVUaW1lcik7CisgICAgfQorICAgIHRoaXMuX2xvYWRpbmdTdGF0ZVRpbWVy
ID0gbnVsbDsKKyAgfQorfSk7CiAKLSAgICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlOworLyoqCisg
IEhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIHJvb3Qtd2FyZCwgc3RhcnRpbmcKKyAgZnJv
bSAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBwcm92aWRlZCBgb3JpZ2luUm91dGVgLgogCi0gICAg
ICAgIGZvciAodmFyIGk9MCwgbD1yb3V0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAg
IHZhciByb3V0ZSA9IHJvdXRlc1tpXSwgbmFtZXMgPSBbXTsKKyAgUmV0dXJucyB0cnVlIGlmIHRo
ZSBsYXN0IGNhbGxiYWNrIGZpcmVkIHJlcXVlc3RlZAorICB0byBidWJibGUgdXB3YXJkLgogCi0g
ICAgICAgICAgdmFyIHNlZ21lbnRzID0gcGFyc2Uocm91dGUucGF0aCwgbmFtZXMsIHR5cGVzKTsK
KyAgQHByaXZhdGUKKyAqLworZnVuY3Rpb24gZm9yRWFjaFJvdXRlQWJvdmUob3JpZ2luUm91dGUs
IHRyYW5zaXRpb24sIGNhbGxiYWNrKSB7CisgIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9u
LmhhbmRsZXJJbmZvcywKKyAgICAgIG9yaWdpblJvdXRlRm91bmQgPSBmYWxzZTsKIAotICAgICAg
ICAgIGFsbFNlZ21lbnRzID0gYWxsU2VnbWVudHMuY29uY2F0KHNlZ21lbnRzKTsKKyAgZm9yICh2
YXIgaSA9IGhhbmRsZXJJbmZvcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgIHZhciBo
YW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKKyAgICAgICAgcm91dGUgPSBoYW5kbGVySW5m
by5oYW5kbGVyOwogCi0gICAgICAgICAgZm9yICh2YXIgaj0wLCBtPXNlZ21lbnRzLmxlbmd0aDsg
ajxtOyBqKyspIHsKLSAgICAgICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07CisgICAg
aWYgKCFvcmlnaW5Sb3V0ZUZvdW5kKSB7CisgICAgICBpZiAob3JpZ2luUm91dGUgPT09IHJvdXRl
KSB7CisgICAgICAgIG9yaWdpblJvdXRlRm91bmQgPSB0cnVlOworICAgICAgfQorICAgICAgY29u
dGludWU7CisgICAgfQogCi0gICAgICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVwc2ls
b25TZWdtZW50KSB7IGNvbnRpbnVlOyB9CisgICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBoYW5kbGVy
SW5mb3NbaSArIDFdLmhhbmRsZXIpICE9PSB0cnVlKSB7CisgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQogCi0gICAgICAgICAgICBpc0VtcHR5ID0gZmFs
c2U7CisvLyBUaGVzZSBnZXQgaW52b2tlZCB3aGVuIGFuIGFjdGlvbiBidWJibGVzIGFib3ZlIEFw
cGxpY2F0aW9uUm91dGUKKy8vIGFuZCBhcmUgbm90IG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlLgor
dmFyIGRlZmF1bHRBY3Rpb25IYW5kbGVycyA9IHsKIAotICAgICAgICAgICAgLy8gQWRkIGEgIi8i
IGZvciB0aGUgbmV3IHNlZ21lbnQKLSAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRT
dGF0ZS5wdXQoeyB2YWxpZENoYXJzOiAiLyIgfSk7Ci0gICAgICAgICAgICByZWdleCArPSAiLyI7
CisgIHdpbGxSZXNvbHZlTW9kZWw6IGZ1bmN0aW9uKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7
CisgICAgb3JpZ2luUm91dGUucm91dGVyLl9zY2hlZHVsZUxvYWRpbmdFdmVudCh0cmFuc2l0aW9u
LCBvcmlnaW5Sb3V0ZSk7CisgIH0sCiAKLSAgICAgICAgICAgIC8vIEFkZCBhIHJlcHJlc2VudGF0
aW9uIG9mIHRoZSBzZWdtZW50IHRvIHRoZSBORkEgYW5kIHJlZ2V4Ci0gICAgICAgICAgICBjdXJy
ZW50U3RhdGUgPSBhZGRTZWdtZW50KGN1cnJlbnRTdGF0ZSwgc2VnbWVudCk7Ci0gICAgICAgICAg
ICByZWdleCArPSBzZWdtZW50LnJlZ2V4KCk7Ci0gICAgICAgICAgfQorICBlcnJvcjogZnVuY3Rp
b24oZXJyb3IsIHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7CisgICAgLy8gQXR0ZW1wdCB0byBm
aW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHN1YnN0YXRlIHRvIGVudGVyLgorICAgIHZhciByb3V0
ZXIgPSBvcmlnaW5Sb3V0ZS5yb3V0ZXI7CiAKLSAgICAgICAgICBoYW5kbGVycy5wdXNoKHsgaGFu
ZGxlcjogcm91dGUuaGFuZGxlciwgbmFtZXM6IG5hbWVzIH0pOwotICAgICAgICB9CisgICAgdmFy
IHRyeVRvcExldmVsID0gZm9yRWFjaFJvdXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRpb24s
IGZ1bmN0aW9uKHJvdXRlLCBjaGlsZFJvdXRlKSB7CisgICAgICB2YXIgY2hpbGRFcnJvclJvdXRl
TmFtZSA9IGZpbmRDaGlsZFJvdXRlTmFtZShyb3V0ZSwgY2hpbGRSb3V0ZSwgJ2Vycm9yJyk7Cisg
ICAgICBpZiAoY2hpbGRFcnJvclJvdXRlTmFtZSkgeworICAgICAgICByb3V0ZXIuaW50ZXJtZWRp
YXRlVHJhbnNpdGlvblRvKGNoaWxkRXJyb3JSb3V0ZU5hbWUsIGVycm9yKTsKKyAgICAgICAgcmV0
dXJuOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CiAKLSAgICAgICAgaWYg
KGlzRW1wdHkpIHsKLSAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0KHsg
dmFsaWRDaGFyczogIi8iIH0pOwotICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKLSAgICAgICAgfQor
ICAgIGlmICh0cnlUb3BMZXZlbCkgeworICAgICAgLy8gQ2hlY2sgZm9yIHRvcC1sZXZlbCBlcnJv
ciBzdGF0ZSB0byBlbnRlci4KKyAgICAgIGlmIChyb3V0ZUhhc0JlZW5EZWZpbmVkKG9yaWdpblJv
dXRlLnJvdXRlciwgJ2FwcGxpY2F0aW9uX2Vycm9yJykpIHsKKyAgICAgICAgcm91dGVyLmludGVy
bWVkaWF0ZVRyYW5zaXRpb25UbygnYXBwbGljYXRpb25fZXJyb3InLCBlcnJvcik7CisgICAgICAg
IHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gRG9uJ3QgZmlyZSBhbiBh
c3NlcnRpb24gaWYgd2UgZm91bmQgYW4gZXJyb3Igc3Vic3RhdGUuCisgICAgICByZXR1cm47Cisg
ICAgfQogCi0gICAgICAgIGN1cnJlbnRTdGF0ZS5oYW5kbGVycyA9IGhhbmRsZXJzOwotICAgICAg
ICBjdXJyZW50U3RhdGUucmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4ICsgIiQiKTsKLSAgICAgICAg
Y3VycmVudFN0YXRlLnR5cGVzID0gdHlwZXM7CisgICAgRW1iZXIuTG9nZ2VyLmVycm9yKCdFcnJv
ciB3aGlsZSBsb2FkaW5nIHJvdXRlOiAnICsgZXJyb3Iuc3RhY2spOworICB9LAogCi0gICAgICAg
IGlmIChuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLmFzKSB7Ci0gICAgICAgICAgdGhpcy5uYW1l
c1tuYW1lXSA9IHsKLSAgICAgICAgICAgIHNlZ21lbnRzOiBhbGxTZWdtZW50cywKLSAgICAgICAg
ICAgIGhhbmRsZXJzOiBoYW5kbGVycwotICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgIH0s
CisgIGxvYWRpbmc6IGZ1bmN0aW9uKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7CisgICAgLy8g
QXR0ZW1wdCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGxvYWRpbmcgc3Vic3RhdGUgdG8gZW50ZXIu
CisgICAgdmFyIHJvdXRlciA9IG9yaWdpblJvdXRlLnJvdXRlcjsKIAotICAgICAgaGFuZGxlcnNG
b3I6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5uYW1lc1tuYW1l
XSwgcmVzdWx0ID0gW107Ci0gICAgICAgIGlmICghcm91dGUpIHsgdGhyb3cgbmV3IEVycm9yKCJU
aGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiICsgbmFtZSk7IH0KKyAgICB2YXIgdHJ5VG9wTGV2ZWwg
PSBmb3JFYWNoUm91dGVBYm92ZShvcmlnaW5Sb3V0ZSwgdHJhbnNpdGlvbiwgZnVuY3Rpb24ocm91
dGUsIGNoaWxkUm91dGUpIHsKKyAgICAgIHZhciBjaGlsZExvYWRpbmdSb3V0ZU5hbWUgPSBmaW5k
Q2hpbGRSb3V0ZU5hbWUocm91dGUsIGNoaWxkUm91dGUsICdsb2FkaW5nJyk7CiAKLSAgICAgICAg
Zm9yICh2YXIgaT0wLCBsPXJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgICByZXN1bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgIGlm
IChjaGlsZExvYWRpbmdSb3V0ZU5hbWUpIHsKKyAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRy
YW5zaXRpb25UbyhjaGlsZExvYWRpbmdSb3V0ZU5hbWUpOworICAgICAgICByZXR1cm47CisgICAg
ICB9CiAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0sCisgICAgICAvLyBEb24ndCBi
dWJibGUgYWJvdmUgcGl2b3Qgcm91dGUuCisgICAgICBpZiAodHJhbnNpdGlvbi5waXZvdEhhbmRs
ZXIgIT09IHJvdXRlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0pOwog
Ci0gICAgICBoYXNSb3V0ZTogZnVuY3Rpb24obmFtZSkgewotICAgICAgICByZXR1cm4gISF0aGlz
Lm5hbWVzW25hbWVdOwotICAgICAgfSwKKyAgICBpZiAodHJ5VG9wTGV2ZWwpIHsKKyAgICAgIC8v
IENoZWNrIGZvciB0b3AtbGV2ZWwgbG9hZGluZyBzdGF0ZSB0byBlbnRlci4KKyAgICAgIGlmIChy
b3V0ZUhhc0JlZW5EZWZpbmVkKG9yaWdpblJvdXRlLnJvdXRlciwgJ2FwcGxpY2F0aW9uX2xvYWRp
bmcnKSkgeworICAgICAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCdhcHBsaWNh
dGlvbl9sb2FkaW5nJyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KK307
CiAKLSAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMpIHsKLSAgICAgICAgdmFy
IHJvdXRlID0gdGhpcy5uYW1lc1tuYW1lXSwgb3V0cHV0ID0gIiI7Ci0gICAgICAgIGlmICghcm91
dGUpIHsgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiICsgbmFtZSk7
IH0KK2Z1bmN0aW9uIGZpbmRDaGlsZFJvdXRlTmFtZShwYXJlbnRSb3V0ZSwgb3JpZ2luYXRpbmdD
aGlsZFJvdXRlLCBuYW1lKSB7CisgIHZhciByb3V0ZXIgPSBwYXJlbnRSb3V0ZS5yb3V0ZXIsCisg
ICAgICBjaGlsZE5hbWUsCisgICAgICB0YXJnZXRDaGlsZFJvdXRlTmFtZSA9IG9yaWdpbmF0aW5n
Q2hpbGRSb3V0ZS5yb3V0ZU5hbWUuc3BsaXQoJy4nKS5wb3AoKSwKKyAgICAgIG5hbWVzcGFjZSA9
IHBhcmVudFJvdXRlLnJvdXRlTmFtZSA9PT0gJ2FwcGxpY2F0aW9uJyA/ICcnIDogcGFyZW50Um91
dGUucm91dGVOYW1lICsgJy4nOwogCi0gICAgICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNlZ21l
bnRzOworICAKKyAgLy8gU2Vjb25kLCB0cnkgZ2VuZXJhbCBsb2FkaW5nIHN0YXRlLCBlLmcuICds
b2FkaW5nJworICBjaGlsZE5hbWUgPSBuYW1lc3BhY2UgKyBuYW1lOworICBpZiAocm91dGVIYXNC
ZWVuRGVmaW5lZChyb3V0ZXIsIGNoaWxkTmFtZSkpIHsKKyAgICByZXR1cm4gY2hpbGROYW1lOwor
ICB9Cit9CiAKLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPXNlZ21lbnRzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICAgICAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2ldOworZnVuY3Rpb24gcm91
dGVIYXNCZWVuRGVmaW5lZChyb3V0ZXIsIG5hbWUpIHsKKyAgdmFyIGNvbnRhaW5lciA9IHJvdXRl
ci5jb250YWluZXI7CisgIHJldHVybiByb3V0ZXIuaGFzUm91dGUobmFtZSkgJiYKKyAgICAgICAg
IChjb250YWluZXIuaGFzKCd0ZW1wbGF0ZTonICsgbmFtZSkgfHwgY29udGFpbmVyLmhhcygncm91
dGU6JyArIG5hbWUpKTsKK30KIAotICAgICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgRXBz
aWxvblNlZ21lbnQpIHsgY29udGludWU7IH0KK2Z1bmN0aW9uIHRyaWdnZXJFdmVudChoYW5kbGVy
SW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFyZ3MpIHsKKyAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7
CiAKLSAgICAgICAgICBvdXRwdXQgKz0gIi8iOwotICAgICAgICAgIG91dHB1dCArPSBzZWdtZW50
LmdlbmVyYXRlKHBhcmFtcyk7Ci0gICAgICAgIH0KKyAgaWYgKCFoYW5kbGVySW5mb3MpIHsKKyAg
ICBpZiAoaWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KKyAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoIkNhbid0IHRyaWdnZXIgYWN0aW9uICciICsgbmFtZSArICInIGJlY2F1c2UgeW91ciBhcHAg
aGFzbid0IGZpbmlzaGVkIHRyYW5zaXRpb25pbmcgaW50byBpdHMgZmlyc3Qgcm91dGUuIFRvIHRy
aWdnZXIgYW4gYWN0aW9uIG9uIGRlc3RpbmF0aW9uIHJvdXRlcyBkdXJpbmcgYSB0cmFuc2l0aW9u
LCB5b3UgY2FuIGNhbGwgYC5zZW5kKClgIG9uIHRoZSBgVHJhbnNpdGlvbmAgb2JqZWN0IHBhc3Nl
ZCB0byB0aGUgYG1vZGVsL2JlZm9yZU1vZGVsL2FmdGVyTW9kZWxgIGhvb2tzLiIpOworICB9CiAK
LSAgICAgICAgaWYgKG91dHB1dC5jaGFyQXQoMCkgIT09ICcvJykgeyBvdXRwdXQgPSAnLycgKyBv
dXRwdXQ7IH0KKyAgdmFyIGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwogCi0gICAgICAgIHJldHVy
biBvdXRwdXQ7Ci0gICAgICB9LAorICBmb3IgKHZhciBpID0gaGFuZGxlckluZm9zLmxlbmd0aCAt
IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgdmFyIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ld
LAorICAgICAgICBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlcjsKIAotICAgICAgcmVjb2du
aXplOiBmdW5jdGlvbihwYXRoKSB7Ci0gICAgICAgIHZhciBzdGF0ZXMgPSBbIHRoaXMucm9vdFN0
YXRlIF0sIGksIGw7CisgICAgaWYgKGhhbmRsZXIuX2FjdGlvbnMgJiYgaGFuZGxlci5fYWN0aW9u
c1tuYW1lXSkgeworICAgICAgaWYgKGhhbmRsZXIuX2FjdGlvbnNbbmFtZV0uYXBwbHkoaGFuZGxl
ciwgYXJncykgPT09IHRydWUpIHsKKyAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0gdHJ1ZTsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAg
ICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCisgIGlmIChkZWZhdWx0QWN0aW9uSGFuZGxlcnNbbmFt
ZV0pIHsKKyAgICBkZWZhdWx0QWN0aW9uSGFuZGxlcnNbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7
CisgICAgcmV0dXJuOworICB9CiAKLSAgICAgICAgdmFyIHBhdGhMZW4gPSBwYXRoLmxlbmd0aDsK
KyAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYgIWlnbm9yZUZhaWx1cmUpIHsKKyAgICB0aHJvdyBu
ZXcgRW1iZXIuRXJyb3IoIk5vdGhpbmcgaGFuZGxlZCB0aGUgYWN0aW9uICciICsgbmFtZSArICIn
LiBJZiB5b3UgZGlkIGhhbmRsZSB0aGUgYWN0aW9uLCB0aGlzIGVycm9yIGNhbiBiZSBjYXVzZWQg
YnkgcmV0dXJuaW5nIHRydWUgZnJvbSBhbiBhY3Rpb24gaGFuZGxlciBpbiBhIGNvbnRyb2xsZXIs
IGNhdXNpbmcgdGhlIGFjdGlvbiB0byBidWJibGUuIik7CisgIH0KK30KIAotICAgICAgICBpZiAo
cGF0aC5jaGFyQXQoMCkgIT09ICIvIikgeyBwYXRoID0gIi8iICsgcGF0aDsgfQorZnVuY3Rpb24g
dXBkYXRlUGF0aHMocm91dGVyKSB7CisgIHZhciBhcHBDb250cm9sbGVyID0gcm91dGVyLmNvbnRh
aW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6YXBwbGljYXRpb24nKTsKIAotICAgICAgICBpZiAocGF0
aExlbiA+IDEgJiYgcGF0aC5jaGFyQXQocGF0aExlbiAtIDEpID09PSAiLyIpIHsKLSAgICAgICAg
ICBwYXRoID0gcGF0aC5zdWJzdHIoMCwgcGF0aExlbiAtIDEpOwotICAgICAgICB9CisgIGlmICgh
YXBwQ29udHJvbGxlcikgeworICAgIC8vIGFwcENvbnRyb2xsZXIgbWlnaHQgbm90IGV4aXN0IHdo
ZW4gdG9wLWxldmVsIGxvYWRpbmcvZXJyb3IKKyAgICAvLyBzdWJzdGF0ZXMgaGF2ZSBiZWVuIGVu
dGVyZWQgc2luY2UgQXBwbGljYXRpb25Sb3V0ZSBoYXNuJ3QKKyAgICAvLyBhY3R1YWxseSBiZWVu
IGVudGVyZWQgYXQgdGhhdCBwb2ludC4KKyAgICByZXR1cm47CisgIH0KIAotICAgICAgICBmb3Ig
KGk9MCwgbD1wYXRoLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBzdGF0ZXMgPSByZWNv
Z25pemVDaGFyKHN0YXRlcywgcGF0aC5jaGFyQXQoaSkpOwotICAgICAgICAgIGlmICghc3RhdGVz
Lmxlbmd0aCkgeyBicmVhazsgfQotICAgICAgICB9CisgIHZhciBpbmZvcyA9IHJvdXRlci5yb3V0
ZXIuY3VycmVudEhhbmRsZXJJbmZvcywKKyAgICAgIHBhdGggPSBFbWJlci5Sb3V0ZXIuX3JvdXRl
UGF0aChpbmZvcyk7CiAKLSAgICAgICAgLy8gRU5EIERFQlVHIEdST1VQCisgIGlmICghKCdjdXJy
ZW50UGF0aCcgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICBkZWZpbmVQcm9wZXJ0eShhcHBDb250
cm9sbGVyLCAnY3VycmVudFBhdGgnKTsKKyAgfQogCi0gICAgICAgIHZhciBzb2x1dGlvbnMgPSBb
XTsKLSAgICAgICAgZm9yIChpPTAsIGw9c3RhdGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgICBpZiAoc3RhdGVzW2ldLmhhbmRsZXJzKSB7IHNvbHV0aW9ucy5wdXNoKHN0YXRlc1tpXSk7
IH0KLSAgICAgICAgfQorICBzZXQoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7
CiAKLSAgICAgICAgc3RhdGVzID0gc29ydFNvbHV0aW9ucyhzb2x1dGlvbnMpOworICBpZiAoISgn
Y3VycmVudFJvdXRlTmFtZScgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICBkZWZpbmVQcm9wZXJ0
eShhcHBDb250cm9sbGVyLCAnY3VycmVudFJvdXRlTmFtZScpOworICB9CiAKLSAgICAgICAgdmFy
IHN0YXRlID0gc29sdXRpb25zWzBdOworICBzZXQoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0
ZU5hbWUnLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAxXS5uYW1lKTsKK30KIAotICAgICAgICBpZiAo
c3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKLSAgICAgICAgICByZXR1cm4gZmluZEhhbmRsZXIo
c3RhdGUsIHBhdGgpOworRW1iZXIuUm91dGVyLnJlb3BlbkNsYXNzKHsKKyAgcm91dGVyOiBudWxs
LAorICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgdmFyIHJvdXRlciA9IHRoaXMucm91
dGVyOworICAgIGlmICghcm91dGVyKSB7CisgICAgICByb3V0ZXIgPSBuZXcgUm91dGVyKCk7Cisg
ICAgICByb3V0ZXIuY2FsbGJhY2tzID0gW107CisgICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0g
dHJpZ2dlckV2ZW50OworICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7IHJvdXRlcjogcm91dGVyIH0p
OworICAgIH0KKworICAgIHZhciBkc2wgPSBFbWJlci5Sb3V0ZXJEU0wubWFwKGZ1bmN0aW9uKCkg
eworICAgICAgdGhpcy5yZXNvdXJjZSgnYXBwbGljYXRpb24nLCB7IHBhdGg6ICIvIiB9LCBmdW5j
dGlvbigpIHsKKyAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcm91dGVyLmNhbGxiYWNrcy5sZW5n
dGg7IGkrKykgeworICAgICAgICAgIHJvdXRlci5jYWxsYmFja3NbaV0uY2FsbCh0aGlzKTsKICAg
ICAgICAgfQotICAgICAgfQotICAgIH07CisgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcyk7Cisg
ICAgICB9KTsKKyAgICB9KTsKIAotICAgIGZ1bmN0aW9uIFRhcmdldChwYXRoLCBtYXRjaGVyLCBk
ZWxlZ2F0ZSkgewotICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgIHRoaXMubWF0Y2hlciA9
IG1hdGNoZXI7Ci0gICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0gICAgfQorICAgIHJv
dXRlci5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7CisgICAgcm91dGVyLm1hcChkc2wuZ2VuZXJh
dGUoKSk7CisgICAgcmV0dXJuIHJvdXRlcjsKKyAgfSwKIAotICAgIFRhcmdldC5wcm90b3R5cGUg
PSB7Ci0gICAgICB0bzogZnVuY3Rpb24odGFyZ2V0LCBjYWxsYmFjaykgewotICAgICAgICB2YXIg
ZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOworICBfcm91dGVQYXRoOiBmdW5jdGlvbihoYW5kbGVy
SW5mb3MpIHsKKyAgICB2YXIgcGF0aCA9IFtdOwogCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAmJiBk
ZWxlZ2F0ZS53aWxsQWRkUm91dGUpIHsKLSAgICAgICAgICB0YXJnZXQgPSBkZWxlZ2F0ZS53aWxs
QWRkUm91dGUodGhpcy5tYXRjaGVyLnRhcmdldCwgdGFyZ2V0KTsKKyAgICAvLyBXZSBoYXZlIHRv
IGhhbmRsZSBjb2FsZXNjaW5nIHJlc291cmNlIG5hbWVzIHRoYXQKKyAgICAvLyBhcmUgcHJlZml4
ZWQgd2l0aCB0aGVpciBwYXJlbnQncyBuYW1lcywgZS5nLgorICAgIC8vIFsnZm9vJywgJ2Zvby5i
YXIuYmF6J10gPT4gJ2Zvby5iYXIuYmF6Jywgbm90ICdmb28uZm9vLmJhci5iYXonCisKKyAgICBm
dW5jdGlvbiBpbnRlcnNlY3Rpb25NYXRjaGVzKGExLCBhMikgeworICAgICAgZm9yICh2YXIgaSA9
IDAsIGxlbiA9IGExLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIGlmIChhMVtpXSAh
PT0gYTJbaV0pIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgIH0K
KyAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotICAgICAgICB0aGlzLm1hdGNoZXIuYWRkKHRo
aXMucGF0aCwgdGFyZ2V0KTsKKyAgICBmb3IgKHZhciBpPTEsIGw9aGFuZGxlckluZm9zLmxlbmd0
aDsgaTxsOyBpKyspIHsKKyAgICAgIHZhciBuYW1lID0gaGFuZGxlckluZm9zW2ldLm5hbWUsCisg
ICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgiLiIpLAorICAgICAgICAgIG9sZE5hbWVQ
YXJ0cyA9IHNsaWNlLmNhbGwocGF0aCk7CiAKLSAgICAgICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAg
ICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoIllvdSBt
dXN0IGhhdmUgYW4gYXJndW1lbnQgaW4gdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgdG9gIik7IH0K
LSAgICAgICAgICB0aGlzLm1hdGNoZXIuYWRkQ2hpbGQodGhpcy5wYXRoLCB0YXJnZXQsIGNhbGxi
YWNrLCB0aGlzLmRlbGVnYXRlKTsKKyAgICAgIHdoaWxlIChvbGROYW1lUGFydHMubGVuZ3RoKSB7
CisgICAgICAgIGlmIChpbnRlcnNlY3Rpb25NYXRjaGVzKG9sZE5hbWVQYXJ0cywgbmFtZVBhcnRz
KSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIG9sZE5hbWVQYXJ0cy5z
aGlmdCgpOwogICAgICAgfQotICAgIH07CiAKLSAgICBmdW5jdGlvbiBNYXRjaGVyKHRhcmdldCkg
ewotICAgICAgdGhpcy5yb3V0ZXMgPSB7fTsKLSAgICAgIHRoaXMuY2hpbGRyZW4gPSB7fTsKLSAg
ICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgcGF0aC5wdXNoLmFwcGx5KHBhdGgsIG5h
bWVQYXJ0cy5zbGljZShvbGROYW1lUGFydHMubGVuZ3RoKSk7CiAgICAgfQogCi0gICAgTWF0Y2hl
ci5wcm90b3R5cGUgPSB7Ci0gICAgICBhZGQ6IGZ1bmN0aW9uKHBhdGgsIGhhbmRsZXIpIHsKLSAg
ICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOwotICAgICAgfSwKKyAgICByZXR1cm4g
cGF0aC5qb2luKCIuIik7CisgIH0KK30pOwogCi0gICAgICBhZGRDaGlsZDogZnVuY3Rpb24ocGF0
aCwgdGFyZ2V0LCBjYWxsYmFjaywgZGVsZWdhdGUpIHsKLSAgICAgICAgdmFyIG1hdGNoZXIgPSBu
ZXcgTWF0Y2hlcih0YXJnZXQpOwotICAgICAgICB0aGlzLmNoaWxkcmVuW3BhdGhdID0gbWF0Y2hl
cjsKK1JvdXRlci5UcmFuc2l0aW9uLnByb3RvdHlwZS5zZW5kID0gUm91dGVyLlRyYW5zaXRpb24u
cHJvdG90eXBlLnRyaWdnZXI7CiAKLSAgICAgICAgdmFyIG1hdGNoID0gZ2VuZXJhdGVNYXRjaChw
YXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSk7CiAKLSAgICAgICAgaWYgKGRlbGVnYXRlICYmIGRlbGVn
YXRlLmNvbnRleHRFbnRlcmVkKSB7Ci0gICAgICAgICAgZGVsZWdhdGUuY29udGV4dEVudGVyZWQo
dGFyZ2V0LCBtYXRjaCk7Ci0gICAgICAgIH0KIAotICAgICAgICBjYWxsYmFjayhtYXRjaCk7Ci0g
ICAgICB9Ci0gICAgfTsKK30pKCk7CiAKLSAgICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0
aW5nUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbihwYXRo
LCBuZXN0ZWRDYWxsYmFjaykgewotICAgICAgICB2YXIgZnVsbFBhdGggPSBzdGFydGluZ1BhdGgg
KyBwYXRoOwogCi0gICAgICAgIGlmIChuZXN0ZWRDYWxsYmFjaykgewotICAgICAgICAgIG5lc3Rl
ZENhbGxiYWNrKGdlbmVyYXRlTWF0Y2goZnVsbFBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKSk7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQoc3RhcnRpbmdQYXRo
ICsgcGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0K
IAotICAgIGZ1bmN0aW9uIGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIGhhbmRsZXIpIHsKLSAg
ICAgIHZhciBsZW4gPSAwOwotICAgICAgZm9yICh2YXIgaT0wLCBsPXJvdXRlQXJyYXkubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgICAgICBsZW4gKz0gcm91dGVBcnJheVtpXS5wYXRoLmxlbmd0aDsK
LSAgICAgIH0KKyhmdW5jdGlvbigpIHsKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBl
bWJlci1yb3V0aW5nCisqLwogCi0gICAgICBwYXRoID0gcGF0aC5zdWJzdHIobGVuKTsKLSAgICAg
IHJvdXRlQXJyYXkucHVzaCh7IHBhdGg6IHBhdGgsIGhhbmRsZXI6IGhhbmRsZXIgfSk7Ci0gICAg
fQordmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAorICAgIGdldFByb3BlcnRp
ZXMgPSBFbWJlci5nZXRQcm9wZXJ0aWVzLAorICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNs
YXNzaWZ5LAorICAgIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCisgICAgYV9mb3JFYWNoID0gRW1i
ZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCisgICAgYV9yZXBsYWNlID0gRW1iZXIuRW51bWVy
YWJsZVV0aWxzLnJlcGxhY2U7CiAKLSAgICBmdW5jdGlvbiBlYWNoUm91dGUoYmFzZVJvdXRlLCBt
YXRjaGVyLCBjYWxsYmFjaywgYmluZGluZykgewotICAgICAgdmFyIHJvdXRlcyA9IG1hdGNoZXIu
cm91dGVzOwogCi0gICAgICBmb3IgKHZhciBwYXRoIGluIHJvdXRlcykgewotICAgICAgICBpZiAo
cm91dGVzLmhhc093blByb3BlcnR5KHBhdGgpKSB7Ci0gICAgICAgICAgdmFyIHJvdXRlQXJyYXkg
PSBiYXNlUm91dGUuc2xpY2UoKTsKLSAgICAgICAgICBhZGRSb3V0ZShyb3V0ZUFycmF5LCBwYXRo
LCByb3V0ZXNbcGF0aF0pOworLyoqCisgIFRoZSBgRW1iZXIuUm91dGVgIGNsYXNzIGlzIHVzZWQg
dG8gZGVmaW5lIGluZGl2aWR1YWwgcm91dGVzLiBSZWZlciB0bworICB0aGUgW3JvdXRpbmcgZ3Vp
ZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZvciBkb2N1bWVudGF0aW9u
LgogCi0gICAgICAgICAgaWYgKG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0pIHsKLSAgICAgICAgICAg
IGVhY2hSb3V0ZShyb3V0ZUFycmF5LCBtYXRjaGVyLmNoaWxkcmVuW3BhdGhdLCBjYWxsYmFjaywg
YmluZGluZyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwo
YmluZGluZywgcm91dGVBcnJheSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfQorICBAY2xhc3MgUm91dGUKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJl
ci5PYmplY3QKKyAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgorKi8KK0VtYmVyLlJvdXRlID0g
RW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5BY3Rpb25IYW5kbGVyLCB7CiAKLSAgICBSb3V0ZVJl
Y29nbml6ZXIucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBhZGRSb3V0ZUNhbGxi
YWNrKSB7Ci0gICAgICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKCk7CisgIC8qKgorICAgIEBw
cml2YXRlCiAKLSAgICAgIGNhbGxiYWNrKGdlbmVyYXRlTWF0Y2goIiIsIG1hdGNoZXIsIHRoaXMu
ZGVsZWdhdGUpKTsKKyAgICBAbWV0aG9kIGV4aXQKKyAgKi8KKyAgZXhpdDogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy5kZWFjdGl2YXRlKCk7CisgICAgdGhpcy50ZWFyZG93blZpZXdzKCk7CisgIH0s
CiAKLSAgICAgIGVhY2hSb3V0ZShbXSwgbWF0Y2hlciwgZnVuY3Rpb24ocm91dGUpIHsKLSAgICAg
ICAgaWYgKGFkZFJvdXRlQ2FsbGJhY2spIHsgYWRkUm91dGVDYWxsYmFjayh0aGlzLCByb3V0ZSk7
IH0KLSAgICAgICAgZWxzZSB7IHRoaXMuYWRkKHJvdXRlKTsgfQotICAgICAgfSwgdGhpcyk7Ci0g
ICAgfTsKLSAgICByZXR1cm4gUm91dGVSZWNvZ25pemVyOwotICB9KTsKKyAgLyoqCisgICAgQHBy
aXZhdGUKIAotfSkoKTsKKyAgICBAbWV0aG9kIGVudGVyCisgICovCisgIGVudGVyOiBmdW5jdGlv
bigpIHsKKyAgICB0aGlzLmFjdGl2YXRlKCk7CisgIH0sCiAKKyAgLyoqCisgICAgVGhlIGNvbGxl
Y3Rpb24gb2YgZnVuY3Rpb25zLCBrZXllZCBieSBuYW1lLCBhdmFpbGFibGUgb24gdGhpcyByb3V0
ZSBhcworICAgIGFjdGlvbiB0YXJnZXRzLgogCisgICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUg
aW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRyaWdnZXJlZAorICAgIGZy
b20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUg
aXMgdGhpcyByb3V0ZS4KIAotKGZ1bmN0aW9uKCkgewotZGVmaW5lKCJyb3V0ZXIiLAotICBbInJv
dXRlLXJlY29nbml6ZXIiXSwKLSAgZnVuY3Rpb24oUm91dGVSZWNvZ25pemVyKSB7Ci0gICAgInVz
ZSBzdHJpY3QiOwotICAgIC8qKgotICAgICAgQHByaXZhdGUKKyAgICBBY3Rpb25zIGNhbiBhbHNv
IGJlIGludm9rZWQgZnJvbSBvdGhlciBwYXJ0cyBvZiB5b3VyIGFwcGxpY2F0aW9uIHZpYSBgUm91
dGUjc2VuZGAKKyAgICBvciBgQ29udHJvbGxlciNzZW5kYC4KIAotICAgICAgVGhpcyBmaWxlIHJl
ZmVyZW5jZXMgc2V2ZXJhbCBpbnRlcm5hbCBzdHJ1Y3R1cmVzOgorICAgIFRoZSBgYWN0aW9uc2Ag
aGFzaCB3aWxsIGluaGVyaXQgYWN0aW9uIGhhbmRsZXJzIGZyb20KKyAgICB0aGUgYGFjdGlvbnNg
IGhhc2ggZGVmaW5lZCBvbiBleHRlbmRlZCBSb3V0ZSBwYXJlbnQgY2xhc3NlcworICAgIG9yIG1p
eGlucyByYXRoZXIgdGhhbiBqdXN0IHJlcGxhY2UgdGhlIGVudGlyZSBoYXNoLCBlLmcuOgogCi0g
ICAgICAjIyBgUmVjb2duaXplZEhhbmRsZXJgCisgICAgYGBganMKKyAgICBBcHAuQ2FuRGlzcGxh
eUJhbm5lciA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgICAgICBhY3Rpb25zOiB7CisgICAgICAg
IGRpc3BsYXlCYW5uZXI6IGZ1bmN0aW9uKG1zZykgeworICAgICAgICAgIC8vIC4uLgorICAgICAg
ICB9CisgICAgICB9CisgICAgfSk7CiAKLSAgICAgICogYHtTdHJpbmd9IGhhbmRsZXJgOiBBIGhh
bmRsZXIgbmFtZQotICAgICAgKiBge09iamVjdH0gcGFyYW1zYDogQSBoYXNoIG9mIHJlY29nbml6
ZWQgcGFyYW1ldGVycworICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
QXBwLkNhbkRpc3BsYXlCYW5uZXIsIHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgcGxheU11
c2ljOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAvLyAuLi4KKyAgICAgICAgfQorICAgICAgfQor
ICAgIH0pOwogCi0gICAgICAjIyBgVW5yZXNvbHZlZEhhbmRsZXJJbmZvYAorICAgIC8vIGBXZWxj
b21lUm91dGVgLCB3aGVuIGFjdGl2ZSwgd2lsbCBiZSBhYmxlIHRvIHJlc3BvbmQKKyAgICAvLyB0
byBib3RoIGFjdGlvbnMsIHNpbmNlIHRoZSBhY3Rpb25zIGhhc2ggaXMgbWVyZ2VkIHJhdGhlcgor
ICAgIC8vIHRoZW4gcmVwbGFjZWQgd2hlbiBleHRlbmRpbmcgbWl4aW5zIC8gcGFyZW50IGNsYXNz
ZXMuCisgICAgdGhpcy5zZW5kKCdkaXNwbGF5QmFubmVyJyk7CisgICAgdGhpcy5zZW5kKCdwbGF5
TXVzaWMnKTsKKyAgICBgYGAKIAotICAgICAgKiBge0Jvb2xlYW59IGlzRHluYW1pY2A6IHdoZXRo
ZXIgYSBoYW5kbGVyIGhhcyBhbnkgZHluYW1pYyBzZWdtZW50cwotICAgICAgKiBge1N0cmluZ30g
bmFtZWA6IHRoZSBuYW1lIG9mIGEgaGFuZGxlcgotICAgICAgKiBge09iamVjdH0gY29udGV4dGA6
IHRoZSBhY3RpdmUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXIKKyAgICBXaXRoaW4gYSByb3V0ZSdz
IGFjdGlvbiBoYW5kbGVyLCB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0CisgICAgaXMg
dGhlIFJvdXRlIG9iamVjdDoKIAotICAgICAgIyMgYEhhbmRsZXJJbmZvYAorICAgIGBgYGpzCisg
ICAgQXBwLlNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7
CisgICAgICAgIG15QWN0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aGlzLmNvbnRyb2xs
ZXJGb3IoInNvbmciKTsKKyAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubygib3RoZXIucm91dGUi
KTsKKyAgICAgICAgICAuLi4KKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAog
Ci0gICAgICAqIGB7Qm9vbGVhbn0gaXNEeW5hbWljYDogd2hldGhlciBhIGhhbmRsZXIgaGFzIGFu
eSBkeW5hbWljIHNlZ21lbnRzCi0gICAgICAqIGB7U3RyaW5nfSBuYW1lYDogdGhlIG9yaWdpbmFs
IHVucmVzb2x2ZWQgaGFuZGxlciBuYW1lCi0gICAgICAqIGB7T2JqZWN0fSBoYW5kbGVyYDogYSBo
YW5kbGVyIG9iamVjdAotICAgICAgKiBge09iamVjdH0gY29udGV4dGA6IHRoZSBhY3RpdmUgY29u
dGV4dCBmb3IgdGhlIGhhbmRsZXIKLSAgICAqLworICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8g
Y2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KKyAgICBhY3Rpb24gaGFuZGxlciBp
ZiBpdCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBwYXJlbnQKKyAgICBjbGFzcyBv
ciBtaXhpbjoKIAorICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyByb3V0ZXM6CiAK
LSAgICBmdW5jdGlvbiBSb3V0ZXIoKSB7Ci0gICAgICB0aGlzLnJlY29nbml6ZXIgPSBuZXcgUm91
dGVSZWNvZ25pemVyKCk7Ci0gICAgfQorICAgIGBgYGpzCisgICAgQXBwLkRlYnVnUm91dGUgPSBF
bWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgYWN0aW9uczogeworICAgICAgICBkZWJ1Z1JvdXRl
SW5mb3JtYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGNvbnNvbGUuZGVidWcoInRyb2xv
bG8iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwogCisgICAgQXBwLkFubm95aW5nRGVi
dWdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZChBcHAuRGVidWdSb3V0ZSwgeworICAgICAgYWN0
aW9uczogeworICAgICAgICBkZWJ1Z1JvdXRlSW5mb3JtYXRpb246IGZ1bmN0aW9uKCkgeworICAg
ICAgICAgIC8vIGFsc28gY2FsbCB0aGUgZGVidWdSb3V0ZUluZm9ybWF0aW9uIG9mIG1peGVkIGlu
IEFwcC5EZWJ1Z1JvdXRlCisgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKIAotICAgIFJvdXRlci5w
cm90b3R5cGUgPSB7Ci0gICAgICAvKioKLSAgICAgICAgVGhlIG1haW4gZW50cnkgcG9pbnQgaW50
byB0aGUgcm91dGVyLiBUaGUgQVBJIGlzIGVzc2VudGlhbGx5Ci0gICAgICAgIHRoZSBzYW1lIGFz
IHRoZSBgbWFwYCBtZXRob2QgaW4gYHJvdXRlLXJlY29nbml6ZXJgLgorICAgICAgICAgIC8vIHNo
b3cgYWRkaXRpb25hbCBhbm5veWFuY2UKKyAgICAgICAgICB3aW5kb3cuYWxlcnQoLi4uKTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAgIyMgQnViYmxpbmcKKwor
ICAgIEJ5IGRlZmF1bHQsIGFuIGFjdGlvbiB3aWxsIHN0b3AgYnViYmxpbmcgb25jZSBhIGhhbmRs
ZXIgZGVmaW5lZAorICAgIG9uIHRoZSBgYWN0aW9uc2AgaGFzaCBoYW5kbGVzIGl0LiBUbyBjb250
aW51ZSBidWJibGluZyB0aGUgYWN0aW9uLAorICAgIHlvdSBtdXN0IHJldHVybiBgdHJ1ZWAgZnJv
bSB0aGUgaGFuZGxlcjoKKworICAgIGBgYGpzCisgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24o
KSB7CisgICAgICB0aGlzLnJlc291cmNlKCJhbGJ1bSIsIGZ1bmN0aW9uKCkgeworICAgICAgICB0
aGlzLnJvdXRlKCJzb25nIik7CisgICAgICB9KTsKKyAgICB9KTsKIAotICAgICAgICBUaGlzIG1l
dGhvZCBleHRyYWN0cyB0aGUgU3RyaW5nIGhhbmRsZXIgYXQgdGhlIGxhc3QgYC50bygpYAotICAg
ICAgICBjYWxsIGFuZCB1c2VzIGl0IGFzIHRoZSBuYW1lIG9mIHRoZSB3aG9sZSByb3V0ZS4KKyAg
ICBBcHAuQWxidW1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7
CisgICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9KTsKIAotICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICAgICAgKi8K
LSAgICAgIG1hcDogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICAgICAgdGhpcy5yZWNvZ25pemVy
LmRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZTsKKyAgICBBcHAuQWxidW1Tb25nUm91dGUgPSBFbWJl
ci5Sb3V0ZS5leHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICBzdGFydFBsYXlpbmc6
IGZ1bmN0aW9uKCkgeworICAgICAgICAgIC8vIC4uLgogCi0gICAgICAgIHRoaXMucmVjb2duaXpl
ci5tYXAoY2FsbGJhY2ssIGZ1bmN0aW9uKHJlY29nbml6ZXIsIHJvdXRlKSB7Ci0gICAgICAgICAg
dmFyIGxhc3RIYW5kbGVyID0gcm91dGVbcm91dGUubGVuZ3RoIC0gMV0uaGFuZGxlcjsKLSAgICAg
ICAgICB2YXIgYXJncyA9IFtyb3V0ZSwgeyBhczogbGFzdEhhbmRsZXIgfV07Ci0gICAgICAgICAg
cmVjb2duaXplci5hZGQuYXBwbHkocmVjb2duaXplciwgYXJncyk7Ci0gICAgICAgIH0pOwotICAg
ICAgfSwKKyAgICAgICAgICBpZiAoYWN0aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRS
b3V0ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCiAKLSAgICAgIGhhc1JvdXRlOiBmdW5jdGlvbihy
b3V0ZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWNvZ25pemVyLmhhc1JvdXRlKHJvdXRlKTsK
LSAgICAgIH0sCisgICAgIyMgQnVpbHQtaW4gYWN0aW9ucwogCi0gICAgICAvKioKLSAgICAgICAg
VGhlIGVudHJ5IHBvaW50IGZvciBoYW5kbGluZyBhIGNoYW5nZSB0byB0aGUgVVJMICh1c3VhbGx5
Ci0gICAgICAgIHZpYSB0aGUgYmFjayBhbmQgZm9yd2FyZCBidXR0b24pLgorICAgIFRoZXJlIGFy
ZSBhIGZldyBidWlsdC1pbiBhY3Rpb25zIHBlcnRhaW5pbmcgdG8gdHJhbnNpdGlvbnMgdGhhdCB5
b3UKKyAgICBjYW4gdXNlIHRvIGN1c3RvbWl6ZSB0cmFuc2l0aW9uIGJlaGF2aW9yOiBgd2lsbFRy
YW5zaXRpb25gIGFuZAorICAgIGBlcnJvcmAuCiAKLSAgICAgICAgUmV0dXJucyBhbiBBcnJheSBv
ZiBoYW5kbGVycyBhbmQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZAotICAgICAgICB3aXRoIHRo
b3NlIHBhcmFtZXRlcnMuCisgICAgIyMjIGB3aWxsVHJhbnNpdGlvbmAKIAotICAgICAgICBAcGFy
YW0ge1N0cmluZ30gdXJsIGEgVVJMIHRvIHByb2Nlc3MKKyAgICBUaGUgYHdpbGxUcmFuc2l0aW9u
YCBhY3Rpb24gaXMgZmlyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkKKyAgICBhdHRlbXB0ZWQg
dHJhbnNpdGlvbiB3aXRoIGEgYFRyYW5zaXRpb25gIG9iamVjdCBhcyB0aGUgc29sZQorICAgIGFy
Z3VtZW50LiBUaGlzIGFjdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWJvcnRpbmcsIHJlZGlyZWN0aW5n
LAorICAgIG9yIGRlY29yYXRpbmcgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgY3VycmVudGx5IGFj
dGl2ZSByb3V0ZXMuCiAKLSAgICAgICAgQHJldHVybiB7QXJyYXl9IGFuIEFycmF5IG9mIGBbaGFu
ZGxlciwgcGFyYW1ldGVyXWAgdHVwbGVzCi0gICAgICAqLwotICAgICAgaGFuZGxlVVJMOiBmdW5j
dGlvbih1cmwpIHsKLSAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnJlY29nbml6ZXIucmVjb2du
aXplKHVybCksCi0gICAgICAgICAgICBvYmplY3RzID0gW107CisgICAgQSBnb29kIGV4YW1wbGUg
aXMgcHJldmVudGluZyBuYXZpZ2F0aW9uIHdoZW4gYSBmb3JtIGlzCisgICAgaGFsZi1maWxsZWQg
b3V0OgogCi0gICAgICAgIGlmICghcmVzdWx0cykgewotICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiTm8gcm91dGUgbWF0Y2hlZCB0aGUgVVJMICciICsgdXJsICsgIiciKTsKKyAgICBgYGBqcwor
ICAgIEFwcC5Db250YWN0Rm9ybVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFj
dGlvbnM6IHsKKyAgICAgICAgd2lsbFRyYW5zaXRpb246IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsK
KyAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLmdldCgndXNlckhhc0VudGVyZWREYXRhJykp
IHsKKyAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwbGF5TmF2aWdhdGlvbkNvbmZpcm0o
KTsKKyAgICAgICAgICAgIHRyYW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAgICB9CiAgICAgICAg
IH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKIAotICAgICAgICBjb2xsZWN0T2JqZWN0cyh0
aGlzLCByZXN1bHRzLCAwLCBbXSk7Ci0gICAgICB9LAorICAgIFlvdSBjYW4gYWxzbyByZWRpcmVj
dCBlbHNld2hlcmUgYnkgY2FsbGluZworICAgIGB0aGlzLnRyYW5zaXRpb25UbygnZWxzZXdoZXJl
JylgIGZyb20gd2l0aGluIGB3aWxsVHJhbnNpdGlvbmAuCisgICAgTm90ZSB0aGF0IGB3aWxsVHJh
bnNpdGlvbmAgd2lsbCBub3QgYmUgZmlyZWQgZm9yIHRoZQorICAgIHJlZGlyZWN0aW5nIGB0cmFu
c2l0aW9uVG9gLCBzaW5jZSBgd2lsbFRyYW5zaXRpb25gIGRvZXNuJ3QKKyAgICBmaXJlIHdoZW4g
dGhlcmUgaXMgYWxyZWFkeSBhIHRyYW5zaXRpb24gdW5kZXJ3YXkuIElmIHlvdSB3YW50CisgICAg
c3Vic2VxdWVudCBgd2lsbFRyYW5zaXRpb25gIGFjdGlvbnMgdG8gZmlyZSBmb3IgdGhlIHJlZGly
ZWN0aW5nCisgICAgdHJhbnNpdGlvbiwgeW91IG11c3QgZmlyc3QgZXhwbGljaXRseSBjYWxsCisg
ICAgYHRyYW5zaXRpb24uYWJvcnQoKWAuCiAKLSAgICAgIC8qKgotICAgICAgICBIb29rIHBvaW50
IGZvciB1cGRhdGluZyB0aGUgVVJMLgorICAgICMjIyBgZXJyb3JgCiAKLSAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IHVybCBhIFVSTCB0byB1cGRhdGUgdG8KLSAgICAgICovCi0gICAgICB1cGRhdGVV
Ukw6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aHJvdyAidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1l
bnRlZCI7CisgICAgV2hlbiBhdHRlbXB0aW5nIHRvIHRyYW5zaXRpb24gaW50byBhIHJvdXRlLCBh
bnkgb2YgdGhlIGhvb2tzCisgICAgbWF5IHJldHVybiBhIHByb21pc2UgdGhhdCByZWplY3RzLCBh
dCB3aGljaCBwb2ludCBhbiBgZXJyb3JgCisgICAgYWN0aW9uIHdpbGwgYmUgZmlyZWQgb24gdGhl
IHBhcnRpYWxseS1lbnRlcmVkIHJvdXRlcywgYWxsb3dpbmcKKyAgICBmb3IgcGVyLXJvdXRlIGVy
cm9yIGhhbmRsaW5nIGxvZ2ljLCBvciBzaGFyZWQgZXJyb3IgaGFuZGxpbmcKKyAgICBsb2dpYyBk
ZWZpbmVkIG9uIGEgcGFyZW50IHJvdXRlLgorCisgICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGFu
IGVycm9yIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQKKyAgICBmb3IgcmVqZWN0ZWQgcHJv
bWlzZXMgZnJvbSB0aGUgdmFyaW91cyBob29rcyBvbiB0aGUgcm91dGUsCisgICAgYXMgd2VsbCBh
cyBhbnkgdW5oYW5kbGVkIGVycm9ycyBmcm9tIGNoaWxkIHJvdXRlczoKKworICAgIGBgYGpzCisg
ICAgQXBwLkFkbWluUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgYmVmb3JlTW9k
ZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZWplY3QoImJhZCB0
aGluZ3MhIik7CiAgICAgICB9LAogCi0gICAgICAvKioKLSAgICAgICAgSG9vayBwb2ludCBmb3Ig
cmVwbGFjaW5nIHRoZSBjdXJyZW50IFVSTCwgaS5lLiB3aXRoIHJlcGxhY2VTdGF0ZQorICAgICAg
YWN0aW9uczogeworICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IsIHRyYW5zaXRpb24pIHsK
KyAgICAgICAgICAvLyBBc3N1bWluZyB3ZSBnb3QgaGVyZSBkdWUgdG8gdGhlIGVycm9yIGluIGBi
ZWZvcmVNb2RlbGAsCisgICAgICAgICAgLy8gd2UgY2FuIGV4cGVjdCB0aGF0IGVycm9yID09PSAi
YmFkIHRoaW5ncyEiLAorICAgICAgICAgIC8vIGJ1dCBhIHByb21pc2UgbW9kZWwgcmVqZWN0aW5n
IHdvdWxkIGFsc28KKyAgICAgICAgICAvLyBjYWxsIHRoaXMgaG9vaywgYXMgd291bGQgYW55IGVy
cm9ycyBlbmNvdW50ZXJlZAorICAgICAgICAgIC8vIGluIGBhZnRlck1vZGVsYC4KIAotICAgICAg
ICBCeSBkZWZhdWx0IHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAorICAgICAg
ICAgIC8vIFRoZSBgZXJyb3JgIGhvb2sgaXMgYWxzbyBwcm92aWRlZCB0aGUgZmFpbGVkCisgICAg
ICAgICAgLy8gYHRyYW5zaXRpb25gLCB3aGljaCBjYW4gYmUgc3RvcmVkIGFuZCBsYXRlcgorICAg
ICAgICAgIC8vIGAucmV0cnkoKWBkIGlmIGRlc2lyZWQuCiAKLSAgICAgICAgQHBhcmFtIHtTdHJp
bmd9IHVybCBhIFVSTCB0byB1cGRhdGUgdG8KLSAgICAgICovCi0gICAgICByZXBsYWNlVVJMOiBm
dW5jdGlvbih1cmwpIHsKLSAgICAgICAgdGhpcy51cGRhdGVVUkwodXJsKTsKLSAgICAgIH0sCisg
ICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2xvZ2luJyk7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9KTsKKyAgICBgYGAKIAotICAgICAgLyoqCi0gICAgICAgIFRyYW5zaXRpb24gaW50byB0
aGUgc3BlY2lmaWVkIG5hbWVkIHJvdXRlLgorICAgIGBlcnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJs
ZSB1cCBhbGwgdGhlIHdheSB0byBgQXBwbGljYXRpb25Sb3V0ZWAKKyAgICB3aWxsIGZpcmUgYSBk
ZWZhdWx0IGVycm9yIGhhbmRsZXIgdGhhdCBsb2dzIHRoZSBlcnJvci4gWW91IGNhbgorICAgIHNw
ZWNpZnkgeW91ciBvd24gZ2xvYmFsIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBieSBvdmVycmlkaW5n
IHRoZQorICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBwbGljYXRpb25Sb3V0ZWA6CiAKLSAgICAg
ICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBleGl0IGNhbGxiYWNrIG9uIGFueSBoYW5kbGVy
cwotICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHRhcmdldCBy
b3V0ZS4KKyAgICBgYGBqcworICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIuUm91dGUu
ZXh0ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9y
LCB0cmFuc2l0aW9uKSB7CisgICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCdiYW5uZXInKS5k
aXNwbGF5RXJyb3IoZXJyb3IubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsK
KyAgICBgYGAKIAotICAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUg
cm91dGUKLSAgICAgICovCi0gICAgICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKG5hbWUpIHsKLSAg
ICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEp
OwotICAgICAgICBkb1RyYW5zaXRpb24odGhpcywgbmFtZSwgdGhpcy51cGRhdGVVUkwsIGFyZ3Mp
OwotICAgICAgfSwKKyAgICBAcHJvcGVydHkgYWN0aW9ucworICAgIEB0eXBlIEhhc2gKKyAgICBA
ZGVmYXVsdCBudWxsCisgICovCisgIF9hY3Rpb25zOiB7CisgICAgZmluYWxpemVRdWVyeVBhcmFt
Q2hhbmdlOiBmdW5jdGlvbihwYXJhbXMsIGZpbmFsUGFyYW1zKSB7CisgICAgICAgICAgfQorICB9
LAogCi0gICAgICAvKioKLSAgICAgICAgSWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9gIGV4Y2Vw
dCB0aGF0IHRoZSBjdXJyZW50IFVSTCB3aWxsIGJlIHJlcGxhY2VkCi0gICAgICAgIGlmIHBvc3Np
YmxlLgorICAvKioKKyAgICBAZGVwcmVjYXRlZAogCi0gICAgICAgIFRoaXMgbWV0aG9kIGlzIGlu
dGVuZGVkIHByaW1hcmlseSBmb3IgdXNlIHdpdGggYHJlcGxhY2VTdGF0ZWAuCisgICAgUGxlYXNl
IHVzZSBgYWN0aW9uc2AgaW5zdGVhZC4KKyAgICBAbWV0aG9kIGV2ZW50cworICAqLworICBldmVu
dHM6IG51bGwsCiAKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhl
IHJvdXRlCi0gICAgICAqLwotICAgICAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKG5hbWUpIHsKLSAg
ICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEp
OwotICAgICAgICBkb1RyYW5zaXRpb24odGhpcywgbmFtZSwgdGhpcy5yZXBsYWNlVVJMLCBhcmdz
KTsKLSAgICAgIH0sCisgIG1lcmdlZFByb3BlcnRpZXM6IFsnZXZlbnRzJ10sCiAKLSAgICAgIC8q
KgotICAgICAgICBAcHJpdmF0ZQorICAvKioKKyAgICBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgd2hl
biB0aGUgcm91dGVyIGNvbXBsZXRlbHkgZXhpdHMgdGhpcyByb3V0ZS4gSXQgaXMKKyAgICBub3Qg
ZXhlY3V0ZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgogCi0gICAgICAg
IFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1lIGFuZCBhIGxpc3Qgb2YgY29udGV4dHMg
YW5kIHJldHVybnMKLSAgICAgICAgYSBzZXJpYWxpemVkIHBhcmFtZXRlciBoYXNoIHN1aXRhYmxl
IHRvIHBhc3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJhdGUoKWAuCisgICAgQG1ldGhvZCBkZWFjdGl2
YXRlCisgICovCisgIGRlYWN0aXZhdGU6IEVtYmVyLkssCiAKLSAgICAgICAgQHBhcmFtIHtTdHJp
bmd9IGhhbmRsZXJOYW1lCi0gICAgICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gY29udGV4dHMK
LSAgICAgICAgQHJldHVybiB7T2JqZWN0fSBhIHNlcmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2gKLSAg
ICAgICovCi0gICAgICBwYXJhbXNGb3JIYW5kbGVyOiBmdW5jdGlvbihoYW5kbGVyTmFtZSwgY2Fs
bGJhY2spIHsKLSAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3BhcmFtc0ZvckhhbmRsZXIoaGFu
ZGxlck5hbWUsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgICAgIHJldHVybiBv
dXRwdXQucGFyYW1zOwotICAgICAgfSwKKyAgLyoqCisgICAgVGhpcyBob29rIGlzIGV4ZWN1dGVk
IHdoZW4gdGhlIHJvdXRlciBlbnRlcnMgdGhlIHJvdXRlLiBJdCBpcyBub3QgZXhlY3V0ZWQKKyAg
ICB3aGVuIHRoZSBtb2RlbCBmb3IgdGhlIHJvdXRlIGNoYW5nZXMuCiAKLSAgICAgIC8qKgotICAg
ICAgICBUYWtlIGEgbmFtZWQgcm91dGUgYW5kIGNvbnRleHQgb2JqZWN0cyBhbmQgZ2VuZXJhdGUg
YQotICAgICAgICBVUkwuCisgICAgQG1ldGhvZCBhY3RpdmF0ZQorICAqLworICBhY3RpdmF0ZTog
RW1iZXIuSywKIAotICAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUg
cm91dGUgdG8gZ2VuZXJhdGUKLSAgICAgICAgICBhIFVSTCBmb3IKLSAgICAgICAgQHBhcmFtIHsu
Li5PYmplY3R9IG9iamVjdHMgYSBsaXN0IG9mIG9iamVjdHMgdG8gc2VyaWFsaXplCisgIC8qKgor
ICAgIFRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBPcHRpb25hbGx5IHN1cHBseSBtb2Rl
bChzKSBmb3IgdGhlCisgICAgcm91dGUgaW4gcXVlc3Rpb24uIElmIG11bHRpcGxlIG1vZGVscyBh
cmUgc3VwcGxpZWQgdGhleSB3aWxsIGJlIGFwcGxpZWQKKyAgICBsYXN0IHRvIGZpcnN0IHJlY3Vy
c2l2ZWx5IHVwIHRoZSByZXNvdXJjZSB0cmVlIChzZWUgTXVsdGlwbGUgTW9kZWxzIEV4YW1wbGUK
KyAgICBiZWxvdykuIFRoZSBtb2RlbChzKSB3aWxsIGJlIHNlcmlhbGl6ZWQgaW50byB0aGUgVVJM
IHVzaW5nIHRoZSBhcHByb3ByaWF0ZQorICAgIHJvdXRlJ3MgYHNlcmlhbGl6ZWAgaG9vay4gU2Vl
IGFsc28gJ3JlcGxhY2VXaXRoJy4KIAotICAgICAgICBAcmV0dXJuIHtTdHJpbmd9IGEgVVJMCi0g
ICAgICAqLwotICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lKSB7Ci0gICAgICAg
IHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtc0ZvckhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVjb2duaXplci5nZW5lcmF0ZShoYW5kbGVyTmFtZSwg
cGFyYW1zKTsKLSAgICAgIH0sCisgICAgU2ltcGxlIFRyYW5zaXRpb24gRXhhbXBsZQogCi0gICAg
ICAvKioKLSAgICAgICAgQHByaXZhdGUKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJvdXRl
ci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOworICAgICAgdGhp
cy5yb3V0ZSgic2VjcmV0Iik7CisgICAgICB0aGlzLnJvdXRlKCJmb3VyT2hGb3VyIiwgeyBwYXRo
OiAiKjoifSk7CisgICAgfSk7CiAKLSAgICAgICAgVXNlZCBpbnRlcm5hbGx5IGJ5IGBnZW5lcmF0
ZWAgYW5kIGB0cmFuc2l0aW9uVG9gLgotICAgICAgKi8KLSAgICAgIF9wYXJhbXNGb3JIYW5kbGVy
OiBmdW5jdGlvbihoYW5kbGVyTmFtZSwgb2JqZWN0cywgZG9VcGRhdGUpIHsKLSAgICAgICAgdmFy
IGhhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKLSAg
ICAgICAgICAgIHBhcmFtcyA9IHt9LAotICAgICAgICAgICAgdG9TZXR1cCA9IFtdLAotICAgICAg
ICAgICAgc3RhcnRJZHggPSBoYW5kbGVycy5sZW5ndGgsCi0gICAgICAgICAgICBvYmplY3RzVG9N
YXRjaCA9IG9iamVjdHMubGVuZ3RoLAotICAgICAgICAgICAgb2JqZWN0LCBvYmplY3RDaGFuZ2Vk
LCBoYW5kbGVyT2JqLCBoYW5kbGVyLCBuYW1lcywgaSwgbGVuOwotCi0gICAgICAgIC8vIEZpbmQg
b3V0IHdoaWNoIGhhbmRsZXIgdG8gc3RhcnQgbWF0Y2hpbmcgYXQKLSAgICAgICAgZm9yIChpPWhh
bmRsZXJzLmxlbmd0aC0xOyBpPj0wICYmIG9iamVjdHNUb01hdGNoPjA7IGktLSkgewotICAgICAg
ICAgIGlmIChoYW5kbGVyc1tpXS5uYW1lcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIG9iamVjdHNU
b01hdGNoLS07Ci0gICAgICAgICAgICBzdGFydElkeCA9IGk7CisgICAgQXBwLkluZGV4Um91dGUg
PSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICBtb3ZlVG9T
ZWNyZXQ6IGZ1bmN0aW9uKGNvbnRleHQpeworICAgICAgICAgIGlmIChhdXRob3JpemVkKCkpewor
ICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ3NlY3JldCcsIGNvbnRleHQpOwogICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdmb3VyT2hGb3VyJyk7CiAgICAg
ICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKIAotICAgICAgICBpZiAob2JqZWN0c1Rv
TWF0Y2ggPiAwKSB7Ci0gICAgICAgICAgdGhyb3cgIk1vcmUgb2JqZWN0cyB3ZXJlIHBhc3NlZCB0
aGFuIGR5bmFtaWMgc2VnbWVudHMiOwotICAgICAgICB9CisgICBUcmFuc2l0aW9uIHRvIGEgbmVz
dGVkIHJvdXRlCiAKLSAgICAgICAgLy8gQ29ubmVjdCB0aGUgb2JqZWN0cyB0byB0aGUgcm91dGVz
Ci0gICAgICAgIGZvciAoaT0wLCBsZW49aGFuZGxlcnMubGVuZ3RoOyBpPGxlbjsgaSsrKSB7Ci0g
ICAgICAgICAgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldOwotICAgICAgICAgIGhhbmRsZXIgPSB0
aGlzLmdldEhhbmRsZXIoaGFuZGxlck9iai5oYW5kbGVyKTsKLSAgICAgICAgICBuYW1lcyA9IGhh
bmRsZXJPYmoubmFtZXM7Ci0gICAgICAgICAgb2JqZWN0Q2hhbmdlZCA9IGZhbHNlOwotCi0gICAg
ICAgICAgLy8gSWYgaXQncyBhIGR5bmFtaWMgc2VnbWVudAotICAgICAgICAgIGlmIChuYW1lcy5s
ZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgb2JqZWN0cywgdXNlIHRoZW0KLSAg
ICAgICAgICAgIGlmIChpID49IHN0YXJ0SWR4KSB7Ci0gICAgICAgICAgICAgIG9iamVjdCA9IG9i
amVjdHMuc2hpZnQoKTsKLSAgICAgICAgICAgICAgb2JqZWN0Q2hhbmdlZCA9IHRydWU7Ci0gICAg
ICAgICAgICAvLyBPdGhlcndpc2UgdXNlIGV4aXN0aW5nIGNvbnRleHQKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgIG9iamVjdCA9IGhhbmRsZXIuY29udGV4dDsKLSAgICAgICAg
ICAgIH0KKyAgIGBgYGphdmFzY3JpcHQKKyAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewor
ICAgICB0aGlzLnJlc291cmNlKCdhcnRpY2xlcycsIHsgcGF0aDogJy9hcnRpY2xlcycgfSwgZnVu
Y3Rpb24oKSB7CisgICAgICAgdGhpcy5yb3V0ZSgnbmV3Jyk7CisgICAgIH0pOworICAgfSk7CiAK
LSAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0byBnZW5lcmF0ZSBwYXJhbXMKLSAgICAgICAgICAg
IGlmIChoYW5kbGVyLnNlcmlhbGl6ZSkgewotICAgICAgICAgICAgICBtZXJnZShwYXJhbXMsIGhh
bmRsZXIuc2VyaWFsaXplKG9iamVjdCwgbmFtZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAvLyBJZiBpdCdzIG5vdCBhIGR5bmFtaWMgc2VnbWVudCBhbmQgd2UncmUgdXBkYXRpbmcKLSAg
ICAgICAgICB9IGVsc2UgaWYgKGRvVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBw
YXNzZWQgdGhlIG1hdGNoIHBvaW50IHdlIG5lZWQgdG8gZGVzZXJpYWxpemUgYWdhaW4KLSAgICAg
ICAgICAgIC8vIG9yIGlmIHdlIG5ldmVyIGhhZCBhIGNvbnRleHQKLSAgICAgICAgICAgIGlmIChp
ID4gc3RhcnRJZHggfHwgIWhhbmRsZXIuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSkgewotICAg
ICAgICAgICAgICBpZiAoaGFuZGxlci5kZXNlcmlhbGl6ZSkgewotICAgICAgICAgICAgICAgIG9i
amVjdCA9IGhhbmRsZXIuZGVzZXJpYWxpemUoe30pOwotICAgICAgICAgICAgICAgIG9iamVjdENo
YW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPdGhlcndpc2Ug
dXNlIGV4aXN0aW5nIGNvbnRleHQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
IG9iamVjdCA9IGhhbmRsZXIuY29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Cisg
ICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgIGFjdGlvbnM6IHsK
KyAgICAgICB0cmFuc2l0aW9uVG9OZXdBcnRpY2xlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgIHRo
aXMudHJhbnNpdGlvblRvKCdhcnRpY2xlcy5uZXcnKTsKKyAgICAgICB9CisgICAgIH0KKyAgIH0p
OworICAgYGBgCiAKLSAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSB1cGRhdGUgdGhlIGNv
bnRleHQgaGVyZSBzbyBpdCdzIGF2YWlsYWJsZSB0bwotICAgICAgICAgIC8vIHN1YnNlcXVlbnQg
ZGVzZXJpYWxpemUgY2FsbHMKLSAgICAgICAgICBpZiAoZG9VcGRhdGUgJiYgb2JqZWN0Q2hhbmdl
ZCkgewotICAgICAgICAgICAgLy8gVE9ETzogSXQncyBhIGJpdCBhd2t3YXJkIHRvIHNldCB0aGUg
Y29udGV4dCB0d2ljZSwgc2VlIGlmIHdlIGNhbiBEUlkgdGhpbmdzIHVwCi0gICAgICAgICAgICBz
ZXRDb250ZXh0KGhhbmRsZXIsIG9iamVjdCk7Ci0gICAgICAgICAgfQorICAgIE11bHRpcGxlIE1v
ZGVscyBFeGFtcGxlCiAKLSAgICAgICAgICB0b1NldHVwLnB1c2goewotICAgICAgICAgICAgaXNE
eW5hbWljOiAhIWhhbmRsZXJPYmoubmFtZXMubGVuZ3RoLAotICAgICAgICAgICAgaGFuZGxlcjog
aGFuZGxlck9iai5oYW5kbGVyLAotICAgICAgICAgICAgbmFtZTogaGFuZGxlck9iai5uYW1lLAot
ICAgICAgICAgICAgY29udGV4dDogb2JqZWN0Ci0gICAgICAgICAgfSk7CisgICAgYGBgamF2YXNj
cmlwdAorICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5yb3V0ZSgi
aW5kZXgiKTsKKyAgICAgIHRoaXMucmVzb3VyY2UoJ2JyZWFrZmFzdCcsIHtwYXRoOic6YnJlYWtm
YXN0SWQnfSwgZnVuY3Rpb24oKXsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSgnY2VyZWFsJywge3Bh
dGg6ICc6Y2VyZWFsSWQnfSk7CisgICAgICB9KTsKKyAgICB9KTsKKworICAgIEFwcC5JbmRleFJv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgbW92
ZVRvQ2hvY29sYXRlQ2VyZWFsOiBmdW5jdGlvbigpeworICAgICAgICAgIHZhciBjZXJlYWwgPSB7
IGNlcmVhbElkOiAiQ2hvY29sYXRlWXVtbWluZXNzIn0sCisgICAgICAgICAgICAgIGJyZWFrZmFz
dCA9IHticmVha2Zhc3RJZDogIkNlcmVhbEFuZE1pbGsifTsKKworICAgICAgICAgIHRoaXMudHJh
bnNpdGlvblRvKCdjZXJlYWwnLCBicmVha2Zhc3QsIGNlcmVhbCk7CiAgICAgICAgIH0KKyAgICAg
IH0KKyAgICB9KTsKIAotICAgICAgICByZXR1cm4geyBwYXJhbXM6IHBhcmFtcywgdG9TZXR1cDog
dG9TZXR1cCB9OwotICAgICAgfSwKKyAgICBAbWV0aG9kIHRyYW5zaXRpb25UbworICAgIEBwYXJh
bSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgIEBwYXJhbSB7Li4uT2Jq
ZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlvbmluZwor
ICAgIHRvIHRoZSByb3V0ZS4KKyAgKi8KKyAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihuYW1lLCBj
b250ZXh0KSB7CisgICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOworICAgIHJldHVybiByb3V0
ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJndW1lbnRzKTsKKyAgfSwKIAotICAgICAg
aXNBY3RpdmU6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lKSB7Ci0gICAgICAgIHZhciBjb250ZXh0cyA9
IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgLyoqCisgICAgUGVyZm9ybSBhIHN5bmNo
cm9ub3VzIHRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdpdGggb3V0IGF0dGVtcHRpbmcK
KyAgICB0byByZXNvbHZlIHByb21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1
cnJlbnRseSBhY3RpdmUKKyAgICBhc3luY2hyb25vdXMgdHJhbnNpdGlvbnMgKGkuZS4gcmVndWxh
ciB0cmFuc2l0aW9ucyBjYXVzZWQgYnkKKyAgICBgdHJhbnNpdGlvblRvYCBvciBVUkwgY2hhbmdl
cykuCiAKLSAgICAgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5mb3MgPSB0aGlzLmN1cnJlbnRIYW5k
bGVySW5mb3MsCi0gICAgICAgICAgICBmb3VuZCA9IGZhbHNlLCBuYW1lcywgb2JqZWN0LCBoYW5k
bGVySW5mbywgaGFuZGxlck9iajsKKyAgICBUaGlzIG1ldGhvZCBpcyBoYW5keSBmb3IgcGVyZm9y
bWluZyBpbnRlcm1lZGlhdGUgdHJhbnNpdGlvbnMgb24gdGhlCisgICAgd2F5IHRvIGEgZmluYWwg
ZGVzdGluYXRpb24gcm91dGUsIGFuZCBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSB0aGUKKyAgICBk
ZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRs
ZXJzLgogCi0gICAgICAgIGZvciAodmFyIGk9Y3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGgtMTsg
aT49MDsgaS0tKSB7Ci0gICAgICAgICAgaGFuZGxlckluZm8gPSBjdXJyZW50SGFuZGxlckluZm9z
W2ldOwotICAgICAgICAgIGlmIChoYW5kbGVySW5mby5uYW1lID09PSBoYW5kbGVyTmFtZSkgeyBm
b3VuZCA9IHRydWU7IH0KKyAgICBAbWV0aG9kIGludGVybWVkaWF0ZVRyYW5zaXRpb25UbworICAg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgIEBwYXJhbSB7
Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlv
bmluZworICAgIHRvIHRoZSByb3V0ZS4KKyAgICovCisgIGludGVybWVkaWF0ZVRyYW5zaXRpb25U
bzogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOworICAgIHJvdXRl
ci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8uYXBwbHkocm91dGVyLCBhcmd1bWVudHMpOworICB9
LAogCi0gICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dHMubGVu
Z3RoID09PSAwKSB7IGJyZWFrOyB9CisgIC8qKgorICAgIFRyYW5zaXRpb24gaW50byBhbm90aGVy
IHJvdXRlIHdoaWxlIHJlcGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGlmIHBvc3NpYmxlLgorICAg
IFRoaXMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGhpc3RvcnkgZW50cnkgaW5zdGVhZCBvZiBh
ZGRpbmcgYSBuZXcgb25lLgorICAgIEJlc2lkZSB0aGF0LCBpdCBpcyBpZGVudGljYWwgdG8gYHRy
YW5zaXRpb25Ub2AgaW4gYWxsIG90aGVyIHJlc3BlY3RzLiBTZWUKKyAgICAndHJhbnNpdGlvblRv
JyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgbXVsdGlwbGUgbW9kZWxzLgog
Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckluZm8uaXNEeW5hbWljKSB7Ci0gICAgICAgICAgICAg
IG9iamVjdCA9IGNvbnRleHRzLnBvcCgpOwotICAgICAgICAgICAgICBpZiAoaGFuZGxlckluZm8u
Y29udGV4dCAhPT0gb2JqZWN0KSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgfQotICAg
ICAgICAgIH0KLSAgICAgICAgfQorICAgIEV4YW1wbGUKIAotICAgICAgICByZXR1cm4gY29udGV4
dHMubGVuZ3RoID09PSAwICYmIGZvdW5kOwotICAgICAgfSwKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJvdXRlKCJpbmRleCIp
OworICAgICAgdGhpcy5yb3V0ZSgic2VjcmV0Iik7CisgICAgfSk7CiAKLSAgICAgIHRyaWdnZXI6
IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cyk7Ci0gICAgICAgIHRyaWdnZXIodGhpcywgYXJncyk7CisgICAgQXBwLlNlY3JldFJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKCkgewor
ICAgICAgICBpZiAoIWF1dGhvcml6ZWQoKSl7CisgICAgICAgICAgdGhpcy5yZXBsYWNlV2l0aCgn
aW5kZXgnKTsKKyAgICAgICAgfQogICAgICAgfQotICAgIH07CisgICAgfSk7CisgICAgYGBgCiAK
LSAgICBmdW5jdGlvbiBtZXJnZShoYXNoLCBvdGhlcikgewotICAgICAgZm9yICh2YXIgcHJvcCBp
biBvdGhlcikgewotICAgICAgICBpZiAob3RoZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgaGFz
aFtwcm9wXSA9IG90aGVyW3Byb3BdOyB9Ci0gICAgICB9Ci0gICAgfQorICAgIEBtZXRob2QgcmVw
bGFjZVdpdGgKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUK
KyAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdo
aWxlIHRyYW5zaXRpb25pbmcKKyAgICB0byB0aGUgcm91dGUuCisgICovCisgIHJlcGxhY2VXaXRo
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgcmV0dXJu
IHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7CisgIH0sCiAKLSAg
ICBmdW5jdGlvbiBpc0N1cnJlbnQoY3VycmVudEhhbmRsZXJJbmZvcywgaGFuZGxlck5hbWUpIHsK
LSAgICAgIHJldHVybiBjdXJyZW50SGFuZGxlckluZm9zW2N1cnJlbnRIYW5kbGVySW5mb3MubGVu
Z3RoIC0gMV0ubmFtZSA9PT0gaGFuZGxlck5hbWU7Ci0gICAgfQorICAvKioKKyAgICBTZW5kcyBh
biBhY3Rpb24gdG8gdGhlIHJvdXRlciwgd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdCB0byB0aGUgY3Vy
cmVudGx5CisgICAgYWN0aXZlIHJvdXRlIGhpZXJhcmNoeSBwZXIgdGhlIGJ1YmJsaW5nIHJ1bGVz
IGV4cGxhaW5lZCB1bmRlciBgYWN0aW9uc2AuCiAKLSAgICAvKioKLSAgICAgIEBwcml2YXRlCisg
ICAgRXhhbXBsZQogCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGUgZmlyc3QgdGlt
ZSB0aGUgYGNvbGxlY3RPYmplY3RzYAotICAgICAgZnVuY3Rpb24gZW5jb3VudGVycyBhIHByb21p
c2Ugd2hpbGUgY29udmVydGluZyBVUkwgcGFyYW1ldGVycwotICAgICAgaW50byBvYmplY3RzLgor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAg
IHRoaXMucm91dGUoImluZGV4Iik7CisgICAgfSk7CiAKLSAgICAgIEl0IHRyaWdnZXJzIHRoZSBg
ZW50ZXJgIGFuZCBgc2V0dXBgIG1ldGhvZHMgb24gdGhlIGBsb2FkaW5nYAotICAgICAgaGFuZGxl
ci4KKyAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAg
ICBhY3Rpb25zOiB7CisgICAgICAgIHRyYWNrOiBmdW5jdGlvbihhcmcpIHsKKyAgICAgICAgICBj
b25zb2xlLmxvZyhhcmcsICd3YXMgY2xpY2tlZCcpOworICAgICAgICB9CisgICAgICB9CisgICAg
fSk7CiAKLSAgICAgIEBwYXJhbSB7Um91dGVyfSByb3V0ZXIKLSAgICAqLwotICAgIGZ1bmN0aW9u
IGxvYWRpbmcocm91dGVyKSB7Ci0gICAgICBpZiAoIXJvdXRlci5pc0xvYWRpbmcpIHsKLSAgICAg
ICAgcm91dGVyLmlzTG9hZGluZyA9IHRydWU7Ci0gICAgICAgIHZhciBoYW5kbGVyID0gcm91dGVy
LmdldEhhbmRsZXIoJ2xvYWRpbmcnKTsKLQotICAgICAgICBpZiAoaGFuZGxlcikgewotICAgICAg
ICAgIGlmIChoYW5kbGVyLmVudGVyKSB7IGhhbmRsZXIuZW50ZXIoKTsgfQotICAgICAgICAgIGlm
IChoYW5kbGVyLnNldHVwKSB7IGhhbmRsZXIuc2V0dXAoKTsgfQorICAgIEFwcC5JbmRleFJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgdHJhY2tJ
ZkRlYnVnOiBmdW5jdGlvbihhcmcpIHsKKyAgICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAg
ICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAg
ICAgfQorICAgIH0pOworICAgIGBgYAorCisgICAgQG1ldGhvZCBzZW5kCisgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byB0cmlnZ2VyCisgICAgQHBhcmFt
IHsuLi4qfSBhcmdzCisgICovCisgIHNlbmQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlz
LnJvdXRlci5zZW5kLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOworICB9LAorCisgIC8q
KgorICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRlci5qcworCisgICAg
QHByaXZhdGUKKyAgICBAbWV0aG9kIHNldHVwCisgICovCisgIHNldHVwOiBmdW5jdGlvbihjb250
ZXh0LCBxdWVyeVBhcmFtcykgeworICAgIHZhciBjb250cm9sbGVyTmFtZSA9IHRoaXMuY29udHJv
bGxlck5hbWUgfHwgdGhpcy5yb3V0ZU5hbWUsCisgICAgICAgIGNvbnRyb2xsZXIgPSB0aGlzLmNv
bnRyb2xsZXJGb3IoY29udHJvbGxlck5hbWUsIHRydWUpOworICAgIGlmICghY29udHJvbGxlcikg
eworICAgICAgY29udHJvbGxlciA9ICB0aGlzLmdlbmVyYXRlQ29udHJvbGxlcihjb250cm9sbGVy
TmFtZSwgY29udGV4dCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQorICAgIC8v
IEFzc2lnbiB0aGUgcm91dGUncyBjb250cm9sbGVyIHNvIHRoYXQgaXQgY2FuIG1vcmUgZWFzaWx5
IGJlCisgICAgLy8gcmVmZXJlbmNlZCBpbiBhY3Rpb24gaGFuZGxlcnMKKyAgICB0aGlzLmNvbnRy
b2xsZXIgPSBjb250cm9sbGVyOwogCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBh
IHByb21pc2Ugd2FzIHByZXZpb3VzbHkKLSAgICAgIGVuY291bnRlcmVkIG9uY2UgYWxsIHByb21p
c2VzIGFyZSByZXNvbHZlZC4KKyAgICB2YXIgYXJncyA9IFtjb250cm9sbGVyLCBjb250ZXh0XTsK
IAotICAgICAgSXQgdHJpZ2dlcnMgdGhlIGBleGl0YCBtZXRob2Qgb24gdGhlIGBsb2FkaW5nYCBo
YW5kbGVyLgorICAgIAorICAgIGlmICh0aGlzLnNldHVwQ29udHJvbGxlcnMpIHsKKyAgICAgIEVt
YmVyLmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUuc2V0dXBDb250cm9sbGVycyBpcyBkZXByZWNhdGVk
LiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnNldHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBtb2Rl
bCkgaW5zdGVhZC4iKTsKKyAgICAgIHRoaXMuc2V0dXBDb250cm9sbGVycyhjb250cm9sbGVyLCBj
b250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5zZXR1cENvbnRyb2xsZXIuYXBwbHko
dGhpcywgYXJncyk7CisgICAgfQogCi0gICAgICBAcGFyYW0ge1JvdXRlcn0gcm91dGVyCi0gICAg
Ki8KLSAgICBmdW5jdGlvbiBsb2FkZWQocm91dGVyKSB7Ci0gICAgICByb3V0ZXIuaXNMb2FkaW5n
ID0gZmFsc2U7Ci0gICAgICB2YXIgaGFuZGxlciA9IHJvdXRlci5nZXRIYW5kbGVyKCdsb2FkaW5n
Jyk7Ci0gICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyLmV4aXQpIHsgaGFuZGxlci5leGl0KCk7
IH0KKyAgICBpZiAodGhpcy5yZW5kZXJUZW1wbGF0ZXMpIHsKKyAgICAgIEVtYmVyLmRlcHJlY2F0
ZSgiRW1iZXIuUm91dGUucmVuZGVyVGVtcGxhdGVzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ug
RW1iZXIuUm91dGUucmVuZGVyVGVtcGxhdGUoY29udHJvbGxlciwgbW9kZWwpIGluc3RlYWQuIik7
CisgICAgICB0aGlzLnJlbmRlclRlbXBsYXRlcyhjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAg
ICAgdGhpcy5yZW5kZXJUZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICB9CisgIH0sCiAK
LSAgICAvKioKLSAgICAgIEBwcml2YXRlCisgIC8qKgorICAgIEEgaG9vayB5b3UgY2FuIGltcGxl
bWVudCB0byBvcHRpb25hbGx5IHJlZGlyZWN0IHRvIGFub3RoZXIgcm91dGUuCiAKLSAgICAgIFRo
aXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGFueSBlbmNvdW50ZXJlZCBwcm9taXNlCi0gICAgICBp
cyByZWplY3RlZC4KKyAgICBJZiB5b3UgY2FsbCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20gaW5z
aWRlIG9mIHRoaXMgaG9vaywgdGhpcyByb3V0ZQorICAgIHdpbGwgbm90IGJlIGVudGVyZWQgaW4g
ZmF2b3Igb2YgdGhlIG90aGVyIGhvb2suCiAKLSAgICAgIEl0IHRyaWdnZXJzIHRoZSBgZXhpdGAg
bWV0aG9kIG9uIHRoZSBgbG9hZGluZ2AgaGFuZGxlciwKLSAgICAgIHRoZSBgZW50ZXJgIG1ldGhv
ZCBvbiB0aGUgYGZhaWx1cmVgIGhhbmRsZXIsIGFuZCB0aGUKLSAgICAgIGBzZXR1cGAgbWV0aG9k
IG9uIHRoZSBgZmFpbHVyZWAgaGFuZGxlciB3aXRoIHRoZQotICAgICAgYGVycm9yYC4KKyAgICBO
b3RlIHRoYXQgdGhpcyBob29rIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlv
biBvZgorICAgIGBhZnRlck1vZGVsYCwgc28gaWYgeW91IG92ZXJyaWRlIGBhZnRlck1vZGVsYCwg
eW91IG11c3QgZWl0aGVyCisgICAgZXhwbGljaXRseSBjYWxsIGByZWRpcmVjdGAgb3IganVzdCBw
dXQgeW91ciByZWRpcmVjdGluZworICAgIGB0aGlzLnRyYW5zaXRpb25UbygpYCBjYWxsIHdpdGhp
biBgYWZ0ZXJNb2RlbGAuCiAKLSAgICAgIEBwYXJhbSB7Um91dGVyfSByb3V0ZXIKLSAgICAgIEBw
YXJhbSB7T2JqZWN0fSBlcnJvciB0aGUgcmVhc29uIGZvciB0aGUgcHJvbWlzZQotICAgICAgICBy
ZWplY3Rpb24sIHRvIHBhc3MgaW50byB0aGUgZmFpbHVyZSBoYW5kbGVyJ3MKLSAgICAgICAgYHNl
dHVwYCBtZXRob2QuCi0gICAgKi8KLSAgICBmdW5jdGlvbiBmYWlsdXJlKHJvdXRlciwgZXJyb3Ip
IHsKLSAgICAgIGxvYWRlZChyb3V0ZXIpOwotICAgICAgdmFyIGhhbmRsZXIgPSByb3V0ZXIuZ2V0
SGFuZGxlcignZmFpbHVyZScpOwotICAgICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlci5zZXR1cCkg
eyBoYW5kbGVyLnNldHVwKGVycm9yKTsgfQotICAgIH0KKyAgICBAbWV0aG9kIHJlZGlyZWN0Cisg
ICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZQorICAqLwor
ICByZWRpcmVjdDogRW1iZXIuSywKIAotICAgIC8qKgotICAgICAgQHByaXZhdGUKLSAgICAqLwot
ICAgIGZ1bmN0aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIsIG5hbWUsIG1ldGhvZCwgYXJncykgewot
ICAgICAgdmFyIG91dHB1dCA9IHJvdXRlci5fcGFyYW1zRm9ySGFuZGxlcihuYW1lLCBhcmdzLCB0
cnVlKTsKLSAgICAgIHZhciBwYXJhbXMgPSBvdXRwdXQucGFyYW1zLCB0b1NldHVwID0gb3V0cHV0
LnRvU2V0dXA7CisgIC8qKgorICAgIFRoaXMgaG9vayBpcyB0aGUgZmlyc3Qgb2YgdGhlIHJvdXRl
IGVudHJ5IHZhbGlkYXRpb24gaG9va3MKKyAgICBjYWxsZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1h
ZGUgdG8gdHJhbnNpdGlvbiBpbnRvIGEgcm91dGUKKyAgICBvciBvbmUgb2YgaXRzIGNoaWxkcmVu
LiBJdCBpcyBjYWxsZWQgYmVmb3JlIGBtb2RlbGAgYW5kCisgICAgYGFmdGVyTW9kZWxgLCBhbmQg
aXMgYXBwcm9wcmlhdGUgZm9yIGNhc2VzIHdoZW46CiAKLSAgICAgIHZhciB1cmwgPSByb3V0ZXIu
cmVjb2duaXplci5nZW5lcmF0ZShuYW1lLCBwYXJhbXMpOwotICAgICAgbWV0aG9kLmNhbGwocm91
dGVyLCB1cmwpOworICAgIDEpIEEgZGVjaXNpb24gY2FuIGJlIG1hZGUgdG8gcmVkaXJlY3QgZWxz
ZXdoZXJlIHdpdGhvdXQKKyAgICAgICBuZWVkaW5nIHRvIHJlc29sdmUgdGhlIG1vZGVsIGZpcnN0
LgorICAgIDIpIEFueSBhc3luYyBvcGVyYXRpb25zIG5lZWQgdG8gb2NjdXIgZmlyc3QgYmVmb3Jl
IHRoZQorICAgICAgIG1vZGVsIGlzIGF0dGVtcHRlZCB0byBiZSByZXNvbHZlZC4KIAotICAgICAg
c2V0dXBDb250ZXh0cyhyb3V0ZXIsIHRvU2V0dXApOwotICAgIH0KKyAgICBUaGlzIGhvb2sgaXMg
cHJvdmlkZWQgdGhlIGN1cnJlbnQgYHRyYW5zaXRpb25gIGF0dGVtcHQKKyAgICBhcyBhIHBhcmFt
ZXRlciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYC5hYm9ydCgpYCB0aGUgdHJhbnNpdGlvbiwKKyAg
ICBzYXZlIGl0IGZvciBhIGxhdGVyIGAucmV0cnkoKWAsIG9yIHJldHJpZXZlIHZhbHVlcyBzZXQK
KyAgICBvbiBpdCBmcm9tIGEgcHJldmlvdXMgaG9vay4gWW91IGNhbiBhbHNvIGp1c3QgY2FsbAor
ICAgIGB0aGlzLnRyYW5zaXRpb25Ub2AgdG8gYW5vdGhlciByb3V0ZSB0byBpbXBsaWNpdGx5Cisg
ICAgYWJvcnQgdGhlIGB0cmFuc2l0aW9uYC4KIAotICAgIC8qKgotICAgICAgQHByaXZhdGUKKyAg
ICBZb3UgY2FuIHJldHVybiBhIHByb21pc2UgZnJvbSB0aGlzIGhvb2sgdG8gcGF1c2UgdGhlCisg
ICAgdHJhbnNpdGlvbiB1bnRpbCB0aGUgcHJvbWlzZSByZXNvbHZlcyAob3IgcmVqZWN0cykuIFRo
aXMgY291bGQKKyAgICBiZSB1c2VmdWwsIGZvciBpbnN0YW5jZSwgZm9yIHJldHJpZXZpbmcgYXN5
bmMgY29kZSBmcm9tCisgICAgdGhlIHNlcnZlciB0aGF0IGlzIHJlcXVpcmVkIHRvIGVudGVyIGEg
cm91dGUuCiAKLSAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgVVJMIGNoYW5n
ZSBoYXMgYmVlbiBoYW5kbGVkCi0gICAgICBieSBgcm91dGVyLmhhbmRsZVVSTGAuCisgICAgYGBg
anMKKyAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIGJlZm9y
ZU1vZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7CisgICAgICAgIGlmICghQXBwLlBvc3QpIHsK
KyAgICAgICAgICByZXR1cm4gRW1iZXIuJC5nZXRTY3JpcHQoJy9tb2RlbHMvcG9zdC5qcycpOwor
ICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCiAKLSAgICAgIFRha2VzIGFuIEFy
cmF5IG9mIGBSZWNvZ25pemVkSGFuZGxlcmBzLCBhbmQgY29udmVydHMgdGhlIHJhdwotICAgICAg
cGFyYW1zIGhhc2hlcyBpbnRvIGRlc2VyaWFsaXplZCBvYmplY3RzIGJ5IGNhbGxpbmcgZGVzZXJp
YWxpemUKLSAgICAgIG9uIHRoZSBoYW5kbGVycy4gVGhpcyBwcm9jZXNzIGJ1aWxkcyB1cCBhbiBB
cnJheSBvZgotICAgICAgYEhhbmRsZXJJbmZvYHMuIEl0IHRoZW4gY2FsbHMgYHNldHVwQ29udGV4
dHNgIHdpdGggdGhlIEFycmF5LgorICAgIElmIGBBcHAuUG9zdGAgZG9lc24ndCBleGlzdCBpbiB0
aGUgYWJvdmUgZXhhbXBsZSwKKyAgICBgYmVmb3JlTW9kZWxgIHdpbGwgdXNlIGpRdWVyeSdzIGBn
ZXRTY3JpcHRgLCB3aGljaAorICAgIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0
ZXIgdGhlIHNlcnZlciBoYXMKKyAgICBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGFuZCBleGVjdXRl
ZCB0aGUgY29kZSBmcm9tIHRoZQorICAgIHNlcnZlci4gTm90ZSB0aGF0IGlmIGFuIGVycm9yIHdl
cmUgdG8gb2NjdXIsIGl0IHdvdWxkCisgICAgYmUgcGFzc2VkIHRvIHRoZSBgZXJyb3JgIGhvb2sg
b24gYEVtYmVyLlJvdXRlYCwgYnV0CisgICAgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhbmRsZSBl
cnJvcnMgc3BlY2lmaWMgdG8KKyAgICBgYmVmb3JlTW9kZWxgIHJpZ2h0IGZyb20gd2l0aGluIHRo
ZSBob29rICh0byBkaXN0aW5ndWlzaAorICAgIGZyb20gdGhlIHNoYXJlZCBlcnJvciBoYW5kbGlu
ZyBiZWhhdmlvciBvZiB0aGUgYGVycm9yYAorICAgIGhvb2spOgogCi0gICAgICBJZiB0aGUgYGRl
c2VyaWFsaXplYCBtZXRob2Qgb24gYSBoYW5kbGVyIHJldHVybnMgYSBwcm9taXNlCi0gICAgICAo
aS5lLiBoYXMgYSBtZXRob2QgY2FsbGVkIGB0aGVuYCksIHRoaXMgZnVuY3Rpb24gd2lsbCBwYXVz
ZQotICAgICAgYnVpbGRpbmcgdXAgdGhlIGBIYW5kbGVySW5mb2AgQXJyYXkgdW50aWwgdGhlIHBy
b21pc2UgaXMKLSAgICAgIHJlc29sdmVkLiBJdCB3aWxsIHVzZSB0aGUgcmVzb2x2ZWQgdmFsdWUg
YXMgdGhlIGNvbnRleHQgb2YKLSAgICAgIGBIYW5kbGVySW5mb2AuCi0gICAgKi8KLSAgICBmdW5j
dGlvbiBjb2xsZWN0T2JqZWN0cyhyb3V0ZXIsIHJlc3VsdHMsIGluZGV4LCBvYmplY3RzKSB7Ci0g
ICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IGluZGV4KSB7Ci0gICAgICAgIGxvYWRlZChyb3V0
ZXIpOwotICAgICAgICBzZXR1cENvbnRleHRzKHJvdXRlciwgb2JqZWN0cyk7Ci0gICAgICAgIHJl
dHVybjsKKyAgICBgYGBqcworICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
eworICAgICAgYmVmb3JlTW9kZWw6IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsKKyAgICAgICAgaWYg
KCFBcHAuUG9zdCkgeworICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgICByZXR1
cm4gRW1iZXIuJC5nZXRTY3JpcHQoJ3Bvc3QuanMnKS50aGVuKG51bGwsIGZ1bmN0aW9uKGUpIHsK
KyAgICAgICAgICAgIHNlbGYudHJhbnNpdGlvblRvKCdoZWxwJyk7CisKKyAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCB0aGUgYWJvdmUgdHJhbnNpdGlvblRvIHdpbGwgaW1wbGljaXRseQorICAgICAg
ICAgICAgLy8gaGFsdCB0aGUgdHJhbnNpdGlvbi4gSWYgeW91IHdlcmUgdG8gcmV0dXJuCisgICAg
ICAgICAgICAvLyBub3RoaW5nIGZyb20gdGhpcyBwcm9taXNlIHJlamVjdCBoYW5kbGVyLAorICAg
ICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHByb21pc2Ugc2VtYW50aWNzLCB0aGF0IHdvdWxkCisg
ICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSByZWplY3QgaW50byBhIHJlc29sdmUgYW5kIHRoZQor
ICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiB3b3VsZCBjb250aW51ZS4gVG8gcHJvcGFnYXRlIHRo
ZQorICAgICAgICAgICAgLy8gZXJyb3Igc28gdGhhdCBpdCdkIGJlIGhhbmRsZWQgYnkgdGhlIGBl
cnJvcmAKKyAgICAgICAgICAgIC8vIGhvb2ssIHlvdSB3b3VsZCBoYXZlIHRvIGVpdGhlcgorICAg
ICAgICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVqZWN0KGUpOworICAgICAgICAgICAgLy8gb3IK
KyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KICAgICAgIH0K
KyAgICB9KTsKKyAgICBgYGAKIAotICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaW5kZXhdOwot
ICAgICAgdmFyIGhhbmRsZXIgPSByb3V0ZXIuZ2V0SGFuZGxlcihyZXN1bHQuaGFuZGxlcik7Ci0g
ICAgICB2YXIgb2JqZWN0ID0gaGFuZGxlci5kZXNlcmlhbGl6ZSAmJiBoYW5kbGVyLmRlc2VyaWFs
aXplKHJlc3VsdC5wYXJhbXMpOwotCi0gICAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3Qu
dGhlbiA9PT0gJ2Z1bmN0aW9uJykgewotICAgICAgICBsb2FkaW5nKHJvdXRlcik7CisgICAgQG1l
dGhvZCBiZWZvcmVNb2RlbAorICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgorICAg
IEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUgYWN0aXZlIHF1ZXJ5IHBhcmFtcyBmb3Ig
dGhpcyByb3V0ZQorICAgIEByZXR1cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBm
cm9tIHRoaXMgaG9vayBpcworICAgICAgYSBwcm9taXNlLCB0aGUgdHJhbnNpdGlvbiB3aWxsIHBh
dXNlIHVudGlsIHRoZSB0cmFuc2l0aW9uCisgICAgICByZXNvbHZlcy4gT3RoZXJ3aXNlLCBub24t
cHJvbWlzZSByZXR1cm4gdmFsdWVzIGFyZSBub3QKKyAgICAgIHV0aWxpemVkIGluIGFueSB3YXku
CisgICovCisgIGJlZm9yZU1vZGVsOiBFbWJlci5LLAogCi0gICAgICAgIC8vIFRoZSBjaGFpbmVk
IGB0aGVuYCBtZWFucyB0aGF0IHdlIGNhbiBhbHNvIGNhdGNoIGVycm9ycyB0aGF0IGhhcHBlbiBp
biBgcHJvY2VlZGAKLSAgICAgICAgb2JqZWN0LnRoZW4ocHJvY2VlZCkudGhlbihudWxsLCBmdW5j
dGlvbihlcnJvcikgewotICAgICAgICAgIGZhaWx1cmUocm91dGVyLCBlcnJvcik7Ci0gICAgICAg
IH0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJvY2VlZChvYmplY3QpOwotICAgICAgfQor
ICAvKioKKyAgICBUaGlzIGhvb2sgaXMgY2FsbGVkIGFmdGVyIHRoaXMgcm91dGUncyBtb2RlbCBo
YXMgcmVzb2x2ZWQuCisgICAgSXQgZm9sbG93cyBpZGVudGljYWwgYXN5bmMvcHJvbWlzZSBzZW1h
bnRpY3MgdG8gYGJlZm9yZU1vZGVsYAorICAgIGJ1dCBpcyBwcm92aWRlZCB0aGUgcm91dGUncyBy
ZXNvbHZlZCBtb2RlbCBpbiBhZGRpdGlvbiB0bworICAgIHRoZSBgdHJhbnNpdGlvbmAsIGFuZCBp
cyB0aGVyZWZvcmUgc3VpdGVkIHRvIHBlcmZvcm1pbmcKKyAgICBsb2dpYyB0aGF0IGNhbiBvbmx5
IHRha2UgcGxhY2UgYWZ0ZXIgdGhlIG1vZGVsIGhhcyBhbHJlYWR5CisgICAgcmVzb2x2ZWQuCiAK
LSAgICAgIGZ1bmN0aW9uIHByb2NlZWQodmFsdWUpIHsKLSAgICAgICAgaWYgKGhhbmRsZXIuY29u
dGV4dCAhPT0gb2JqZWN0KSB7Ci0gICAgICAgICAgc2V0Q29udGV4dChoYW5kbGVyLCBvYmplY3Qp
OworICAgIGBgYGpzCisgICAgQXBwLlBvc3RzUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewor
ICAgICAgYWZ0ZXJNb2RlbDogZnVuY3Rpb24ocG9zdHMsIHRyYW5zaXRpb24pIHsKKyAgICAgICAg
aWYgKHBvc3RzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdw
b3N0LnNob3cnLCBwb3N0c1swXSk7CiAgICAgICAgIH0KLQotICAgICAgICB2YXIgdXBkYXRlZE9i
amVjdHMgPSBvYmplY3RzLmNvbmNhdChbewotICAgICAgICAgIGNvbnRleHQ6IHZhbHVlLAotICAg
ICAgICAgIGhhbmRsZXI6IHJlc3VsdC5oYW5kbGVyLAotICAgICAgICAgIGlzRHluYW1pYzogcmVz
dWx0LmlzRHluYW1pYwotICAgICAgICB9XSk7Ci0gICAgICAgIGNvbGxlY3RPYmplY3RzKHJvdXRl
ciwgcmVzdWx0cywgaW5kZXggKyAxLCB1cGRhdGVkT2JqZWN0cyk7CiAgICAgICB9Ci0gICAgfQor
ICAgIH0pOworICAgIGBgYAogCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQorICAgIFJlZmVyIHRv
IGRvY3VtZW50YXRpb24gZm9yIGBiZWZvcmVNb2RlbGAgZm9yIGEgZGVzY3JpcHRpb24KKyAgICBv
ZiB0cmFuc2l0aW9uLXBhdXNpbmcgc2VtYW50aWNzIHdoZW4gYSBwcm9taXNlIGlzIHJldHVybmVk
CisgICAgZnJvbSB0aGlzIGhvb2suCisKKyAgICBAbWV0aG9kIGFmdGVyTW9kZWwKKyAgICBAcGFy
YW0ge09iamVjdH0gcmVzb2x2ZWRNb2RlbCB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgbW9kZWxg
LAorICAgICAgb3IgaXRzIHJlc29sdmVkIHZhbHVlIGlmIGl0IHdhcyBhIHByb21pc2UKKyAgICBA
cGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICBAcGFyYW0ge09iamVjdH0gcXVlcnlQ
YXJhbXMgdGhlIGFjdGl2ZSBxdWVyeSBwYXJhbXMgZm9yIHRoaXMgaGFuZGxlcgorICAgIEByZXR1
cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgaG9vayBpcworICAg
ICAgYSBwcm9taXNlLCB0aGUgdHJhbnNpdGlvbiB3aWxsIHBhdXNlIHVudGlsIHRoZSB0cmFuc2l0
aW9uCisgICAgICByZXNvbHZlcy4gT3RoZXJ3aXNlLCBub24tcHJvbWlzZSByZXR1cm4gdmFsdWVz
IGFyZSBub3QKKyAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCisgICAqLworICBhZnRlck1vZGVs
OiBmdW5jdGlvbihyZXNvbHZlZE1vZGVsLCB0cmFuc2l0aW9uLCBxdWVyeVBhcmFtcykgeworICAg
IHRoaXMucmVkaXJlY3QocmVzb2x2ZWRNb2RlbCwgdHJhbnNpdGlvbik7CisgIH0sCiAKLSAgICAg
IFRha2VzIGFuIEFycmF5IG9mIGBVbnJlc29sdmVkSGFuZGxlckluZm9gcywgcmVzb2x2ZXMgdGhl
IGhhbmRsZXIgbmFtZXMKLSAgICAgIGludG8gaGFuZGxlcnMsIGFuZCB0aGVuIGZpZ3VyZXMgb3V0
IHdoYXQgdG8gZG8gd2l0aCBlYWNoIG9mIHRoZSBoYW5kbGVycy4KIAotICAgICAgRm9yIGV4YW1w
bGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJlZSBvZiBoYW5kbGVycy4gRWFjaCBoYW5kbGVy
IGlzCi0gICAgICBmb2xsb3dlZCBieSB0aGUgVVJMIHNlZ21lbnQgaXQgaGFuZGxlcy4KKyAgLyoq
CisgICAgQ2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgY2hhbmdlZCBieSByb3V0ZXIuanMuCiAK
LSAgICAgIGBgYAotICAgICAgfH5pbmRleCAoIi8iKQotICAgICAgfCB8fnBvc3RzICgiL3Bvc3Rz
IikKLSAgICAgIHwgfCB8LXNob3dQb3N0ICgiLzppZCIpCi0gICAgICB8IHwgfC1uZXdQb3N0ICgi
L25ldyIpCi0gICAgICB8IHwgfC1lZGl0UG9zdCAoIi9lZGl0IikKLSAgICAgIHwgfH5hYm91dCAo
Ii9hYm91dC86aWQiKQotICAgICAgYGBgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGNvbnRl
eHREaWRDaGFuZ2UKKyAgKi8KKyAgY29udGV4dERpZENoYW5nZTogZnVuY3Rpb24oKSB7CisgICAg
dGhpcy5jdXJyZW50TW9kZWwgPSB0aGlzLmNvbnRleHQ7CisgIH0sCiAKLSAgICAgIENvbnNpZGVy
IHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6CisgIC8qKgorICAgIEEgaG9vayB5b3UgY2FuIGlt
cGxlbWVudCB0byBjb252ZXJ0IHRoZSBVUkwgaW50byB0aGUgbW9kZWwgZm9yCisgICAgdGhpcyBy
b3V0ZS4KIAotICAgICAgMS4gQSBVUkwgdHJhbnNpdGlvbiB0byBgL3Bvc3RzLzFgLgotICAgICAg
ICAgMS4gVHJpZ2dlcnMgdGhlIGBkZXNlcmlhbGl6ZWAgY2FsbGJhY2sgb24gdGhlCi0gICAgICAg
ICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQgYHNob3dQb3N0YCBoYW5kbGVycwotICAgICAgICAg
Mi4gVHJpZ2dlcnMgdGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gdGhlIHNhbWUKLSAgICAgICAgIDMu
IFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIHRoZSBzYW1lCi0gICAgICAyLiBBIGRp
cmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAotICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBl
eGl0YCBjYWxsYmFjayBvbiBgc2hvd1Bvc3RgCi0gICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVu
dGVyYCBjYWxsYmFjayBvbiBgbmV3UG9zdGAKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0
dXBgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAotICAgICAgMy4gQSBkaXJlY3QgdHJhbnNpdGlvbiB0
byBgYWJvdXRgIHdpdGggYSBzcGVjaWZpZWQKLSAgICAgICAgIGNvbnRleHQgb2JqZWN0Ci0gICAg
ICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAotICAgICAg
ICAgICAgYW5kIGBwb3N0c2AKLSAgICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgc2VyaWFsaXplYCBj
YWxsYmFjayBvbiBgYWJvdXRgCi0gICAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxs
YmFjayBvbiBgYWJvdXRgCi0gICAgICAgICA0LiBUcmlnZ2VycyB0aGUgYHNldHVwYCBjYWxsYmFj
ayBvbiBgYWJvdXRgCisgICAgYGBganMKKyAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsK
KyAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsK
KyAgICB9KTsKKyAgICBgYGAKIAotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAg
QHBhcmFtIHtBcnJheVtVbnJlc29sdmVkSGFuZGxlckluZm9dfSBoYW5kbGVySW5mb3MKLSAgICAq
LwotICAgIGZ1bmN0aW9uIHNldHVwQ29udGV4dHMocm91dGVyLCBoYW5kbGVySW5mb3MpIHsKLSAg
ICAgIHJlc29sdmVIYW5kbGVycyhyb3V0ZXIsIGhhbmRsZXJJbmZvcyk7CisgICAgVGhlIG1vZGVs
IGZvciB0aGUgYHBvc3RgIHJvdXRlIGlzIGBBcHAuUG9zdC5maW5kKHBhcmFtcy5wb3N0X2lkKWAu
CiAKLSAgICAgIHZhciBwYXJ0aXRpb24gPQotICAgICAgICBwYXJ0aXRpb25IYW5kbGVycyhyb3V0
ZXIuY3VycmVudEhhbmRsZXJJbmZvcyB8fCBbXSwgaGFuZGxlckluZm9zKTsKKyAgICBCeSBkZWZh
dWx0LCBpZiB5b3VyIHJvdXRlIGhhcyBhIGR5bmFtaWMgc2VnbWVudCBlbmRpbmcgaW4gYF9pZGA6
CiAKLSAgICAgIHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zID0gaGFuZGxlckluZm9zOworICAg
ICogVGhlIG1vZGVsIGNsYXNzIGlzIGRldGVybWluZWQgZnJvbSB0aGUgc2VnbWVudCAoYHBvc3Rf
aWRgJ3MKKyAgICAgIGNsYXNzIGlzIGBBcHAuUG9zdGApCisgICAgKiBUaGUgZmluZCBtZXRob2Qg
aXMgY2FsbGVkIG9uIHRoZSBtb2RlbCBjbGFzcyB3aXRoIHRoZSB2YWx1ZSBvZgorICAgICAgdGhl
IGR5bmFtaWMgc2VnbWVudC4KIAotICAgICAgZWFjaEhhbmRsZXIocGFydGl0aW9uLmV4aXRlZCwg
ZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkgewotICAgICAgICBkZWxldGUgaGFuZGxlci5jb250
ZXh0OwotICAgICAgICBpZiAoaGFuZGxlci5leGl0KSB7IGhhbmRsZXIuZXhpdCgpOyB9Ci0gICAg
ICB9KTsKKyAgICBOb3RlIHRoYXQgZm9yIHJvdXRlcyB3aXRoIGR5bmFtaWMgc2VnbWVudHMsIHRo
aXMgaG9vayBpcyBvbmx5CisgICAgZXhlY3V0ZWQgd2hlbiBlbnRlcmVkIHZpYSB0aGUgVVJMLiBJ
ZiB0aGUgcm91dGUgaXMgZW50ZXJlZAorICAgIHRocm91Z2ggYSB0cmFuc2l0aW9uIChlLmcuIHdo
ZW4gdXNpbmcgdGhlIGBsaW5rLXRvYCBIYW5kbGViYXJzCisgICAgaGVscGVyKSwgdGhlbiBhIG1v
ZGVsIGNvbnRleHQgaXMgYWxyZWFkeSBwcm92aWRlZCBhbmQgdGhpcyBob29rCisgICAgaXMgbm90
IGNhbGxlZC4gUm91dGVzIHdpdGhvdXQgZHluYW1pYyBzZWdtZW50cyB3aWxsIGFsd2F5cworICAg
IGV4ZWN1dGUgdGhlIG1vZGVsIGhvb2suCiAKLSAgICAgIGVhY2hIYW5kbGVyKHBhcnRpdGlvbi51
cGRhdGVkQ29udGV4dCwgZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkgewotICAgICAgICBzZXRD
b250ZXh0KGhhbmRsZXIsIGNvbnRleHQpOwotICAgICAgICBpZiAoaGFuZGxlci5zZXR1cCkgeyBo
YW5kbGVyLnNldHVwKGNvbnRleHQpOyB9Ci0gICAgICB9KTsKKyAgICBUaGlzIGhvb2sgZm9sbG93
cyB0aGUgYXN5bmNocm9ub3VzL3Byb21pc2Ugc2VtYW50aWNzCisgICAgZGVzY3JpYmVkIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGZvciBgYmVmb3JlTW9kZWxgLiBJbiBwYXJ0aWN1bGFyLAorICAgIGlm
IGEgcHJvbWlzZSByZXR1cm5lZCBmcm9tIGBtb2RlbGAgZmFpbHMsIHRoZSBlcnJvciB3aWxsIGJl
CisgICAgaGFuZGxlZCBieSB0aGUgYGVycm9yYCBob29rIG9uIGBFbWJlci5Sb3V0ZWAuCiAKLSAg
ICAgIHZhciBhYm9ydGVkID0gZmFsc2U7Ci0gICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZW50
ZXJlZCwgZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkgewotICAgICAgICBpZiAoYWJvcnRlZCkg
eyByZXR1cm47IH0KLSAgICAgICAgaWYgKGhhbmRsZXIuZW50ZXIpIHsgaGFuZGxlci5lbnRlcigp
OyB9Ci0gICAgICAgIHNldENvbnRleHQoaGFuZGxlciwgY29udGV4dCk7Ci0gICAgICAgIGlmICho
YW5kbGVyLnNldHVwKSB7Ci0gICAgICAgICAgaWYgKGZhbHNlID09PSBoYW5kbGVyLnNldHVwKGNv
bnRleHQpKSB7Ci0gICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgIH0pOworICAgIEV4YW1wbGUKIAotICAgICAgaWYgKHJvdXRlci5kaWRUcmFu
c2l0aW9uKSB7Ci0gICAgICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uKGhhbmRsZXJJbmZvcyk7Cisg
ICAgYGBganMKKyAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAg
IG1vZGVsOiBmdW5jdGlvbihwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIEFwcC5Qb3N0LmZpbmQo
cGFyYW1zLnBvc3RfaWQpOwogICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZh
dGUKLQotICAgICAgSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBgSGFuZGxlckluZm9gcywgcGFz
c2luZyB0aGUgaGFuZGxlcgotICAgICAgYW5kIGNvbnRleHQgaW50byB0aGUgY2FsbGJhY2suCisg
ICAgfSk7CisgICAgYGBgCiAKLSAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBoYW5k
bGVySW5mb3MKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb24oT2JqZWN0LCBPYmplY3QpfSBjYWxsYmFj
awotICAgICovCi0gICAgZnVuY3Rpb24gZWFjaEhhbmRsZXIoaGFuZGxlckluZm9zLCBjYWxsYmFj
aykgewotICAgICAgZm9yICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsr
KSB7Ci0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAg
ICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyLAotICAgICAgICAgICAgY29udGV4dCA9
IGhhbmRsZXJJbmZvLmNvbnRleHQ7CisgICAgQG1ldGhvZCBtb2RlbAorICAgIEBwYXJhbSB7T2Jq
ZWN0fSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIFVSTAorICAgIEBw
YXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgorICAgIEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBh
cmFtcyB0aGUgcXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCisgICAgQHJldHVybiB7T2JqZWN0
fFByb21pc2V9IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4gSWYKKyAgICAgIGEgcHJvbWlzZSBp
cyByZXR1cm5lZCwgdGhlIHRyYW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAorICAgICAgdGhlIHBy
b21pc2UgcmVzb2x2ZXMsIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgb2YgdGhlIHByb21pc2UKKyAg
ICAgIHdpbGwgYmUgdXNlZCBhcyB0aGUgbW9kZWwgZm9yIHRoaXMgcm91dGUuCisgICovCisgIG1v
ZGVsOiBmdW5jdGlvbihwYXJhbXMsIHRyYW5zaXRpb24pIHsKKyAgICB2YXIgbWF0Y2gsIG5hbWUs
IHNhd1BhcmFtcywgdmFsdWU7CiAKLSAgICAgICAgY2FsbGJhY2soaGFuZGxlciwgY29udGV4dCk7
CisgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbXMpIHsKKyAgICAgIGlmIChtYXRjaCA9IHByb3Au
bWF0Y2goL14oLiopX2lkJC8pKSB7CisgICAgICAgIG5hbWUgPSBtYXRjaFsxXTsKKyAgICAgICAg
dmFsdWUgPSBwYXJhbXNbcHJvcF07CiAgICAgICB9CisgICAgICBzYXdQYXJhbXMgPSB0cnVlOwog
ICAgIH0KIAotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgVXBkYXRlcyB0aGUgYGhh
bmRsZXJgIGZpZWxkIGluIGVhY2ggZWxlbWVudCBpbiBhbiBBcnJheSBvZgotICAgICAgYFVucmVz
b2x2ZWRIYW5kbGVySW5mb2BzIGZyb20gYSBoYW5kbGVyIG5hbWUgdG8gYSByZXNvbHZlZCBoYW5k
bGVyLgotCi0gICAgICBXaGVuIGRvbmUsIHRoZSBBcnJheSB3aWxsIGNvbnRhaW4gYEhhbmRsZXJJ
bmZvYCBzdHJ1Y3R1cmVzLgorICAgIGlmICghbmFtZSAmJiBzYXdQYXJhbXMpIHsgcmV0dXJuIHBh
cmFtczsgfQorICAgIGVsc2UgaWYgKCFuYW1lKSB7IHJldHVybjsgfQogCi0gICAgICBAcGFyYW0g
e1JvdXRlcn0gcm91dGVyCi0gICAgICBAcGFyYW0ge0FycmF5W1VucmVzb2x2ZWRIYW5kbGVySW5m
b119IGhhbmRsZXJJbmZvcwotICAgICovCi0gICAgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXJzKHJv
dXRlciwgaGFuZGxlckluZm9zKSB7Ci0gICAgICB2YXIgaGFuZGxlckluZm87CisgICAgcmV0dXJu
IHRoaXMuZmluZE1vZGVsKG5hbWUsIHZhbHVlKTsKKyAgfSwKIAotICAgICAgZm9yICh2YXIgaT0w
LCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGhhbmRsZXJJbmZv
ID0gaGFuZGxlckluZm9zW2ldOworICAvKioKIAotICAgICAgICBoYW5kbGVySW5mby5uYW1lID0g
aGFuZGxlckluZm8uaGFuZGxlcjsKLSAgICAgICAgaGFuZGxlckluZm8uaGFuZGxlciA9IHJvdXRl
ci5nZXRIYW5kbGVyKGhhbmRsZXJJbmZvLmhhbmRsZXIpOwotICAgICAgfQotICAgIH0KKyAgICBA
bWV0aG9kIGZpbmRNb2RlbAorICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtb2RlbCB0eXBl
CisgICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gZmluZAorICAq
LworICBmaW5kTW9kZWw6IGZ1bmN0aW9uKCl7CisgICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdz
dG9yZScpOworICAgIHJldHVybiBzdG9yZS5maW5kLmFwcGx5KHN0b3JlLCBhcmd1bWVudHMpOwor
ICB9LAogCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQorICAvKioKKyAgICBTdG9yZSBwcm9wZXJ0
eSBwcm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVyc2lzdGVuY2UgbGlicmFyaWVzIHRvIGluamVj
dCB0aGVtc2VsdmVzLgogCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRyYW5z
aXRpb25pbmcgZnJvbSBvbmUgVVJMIHRvCi0gICAgICBhbm90aGVyIHRvIGRldGVybWluZSB3aGlj
aCBoYW5kbGVycyBhcmUgbm90IGxvbmdlciBhY3RpdmUsCi0gICAgICB3aGljaCBoYW5kbGVycyBh
cmUgbmV3bHkgYWN0aXZlLCBhbmQgd2hpY2ggaGFuZGxlcnMgcmVtYWluCi0gICAgICBhY3RpdmUg
YnV0IGhhdmUgdGhlaXIgY29udGV4dCBjaGFuZ2VkLgorICAgIEJ5IGRlZmF1bHQsIHRoaXMgc3Rv
cmUgcHJvcGVydHkgcHJvdmlkZXMgdGhlIGV4YWN0IHNhbWUgZnVuY3Rpb25hbGl0eSBwcmV2aW91
c2x5CisgICAgaW4gdGhlIG1vZGVsIGhvb2suCiAKLSAgICAgIFRha2UgYSBsaXN0IG9mIG9sZCBo
YW5kbGVycyBhbmQgbmV3IGhhbmRsZXJzIGFuZCBwYXJ0aXRpb24KLSAgICAgIHRoZW0gaW50byBm
b3VyIGJ1Y2tldHM6CisgICAgQ3VycmVudGx5LCB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlIGlzOgog
Ci0gICAgICAqIHVuY2hhbmdlZDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiBib3RoIHRoZSBv
bGQgYW5kCi0gICAgICAgIG5ldyBVUkwsIGFuZCBpdHMgY29udGV4dCByZW1haW5zIHRoZSBzYW1l
Ci0gICAgICAqIHVwZGF0ZWQgY29udGV4dDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiBib3Ro
IHRoZQotICAgICAgICBvbGQgYW5kIG5ldyBVUkwsIGJ1dCBpdHMgY29udGV4dCBjaGFuZ2VkLiBU
aGUgaGFuZGxlcidzCi0gICAgICAgIGBzZXR1cGAgbWV0aG9kLCBpZiBhbnksIHdpbGwgYmUgY2Fs
bGVkIHdpdGggdGhlIG5ldwotICAgICAgICBjb250ZXh0LgotICAgICAgKiBleGl0ZWQ6IHRoZSBo
YW5kbGVyIHdhcyBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dCBpcwotICAgICAgICBubyBsb25n
ZXIgYWN0aXZlLgotICAgICAgKiBlbnRlcmVkOiB0aGUgaGFuZGxlciB3YXMgbm90IGFjdGl2ZSBp
biB0aGUgb2xkIFVSTCwgYnV0Ci0gICAgICAgIGlzIG5vdyBhY3RpdmUuCisgICAgYHN0b3JlLmZp
bmQobW9kZWxOYW1lLCBmaW5kQXJndW1lbnRzKWAKIAotICAgICAgVGhlIFBhcnRpdGlvbmVkSGFu
ZGxlcnMgc3RydWN0dXJlIGhhcyB0aHJlZSBmaWVsZHM6CisgICAgQG1ldGhvZCBzdG9yZQorICAg
IEBwYXJhbSB7T2JqZWN0fSBzdG9yZQorICAqLworICBzdG9yZTogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oKXsKKyAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7CisgICAgdmFyIHJv
dXRlTmFtZSA9IHRoaXMucm91dGVOYW1lOworICAgIHZhciBuYW1lc3BhY2UgPSBnZXQodGhpcywg
J3JvdXRlci5uYW1lc3BhY2UnKTsKIAotICAgICAgKiBgdXBkYXRlZENvbnRleHRgOiBhIGxpc3Qg
b2YgYEhhbmRsZXJJbmZvYCBvYmplY3RzIHRoYXQKLSAgICAgICAgcmVwcmVzZW50IGhhbmRsZXJz
IHRoYXQgcmVtYWluIGFjdGl2ZSBidXQgaGF2ZSBhIGNoYW5nZWQKLSAgICAgICAgY29udGV4dAot
ICAgICAgKiBgZW50ZXJlZGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCBy
ZXByZXNlbnQKLSAgICAgICAgaGFuZGxlcnMgdGhhdCBhcmUgbmV3bHkgYWN0aXZlCi0gICAgICAq
IGBleGl0ZWRgOiBhIGxpc3Qgb2YgYEhhbmRsZXJJbmZvYCBvYmplY3RzIHRoYXQgYXJlIG5vCi0g
ICAgICAgIGxvbmdlciBhY3RpdmUuCisgICAgcmV0dXJuIHsKKyAgICAgIGZpbmQ6IGZ1bmN0aW9u
KG5hbWUsIHZhbHVlKSB7CisgICAgICAgIHZhciBtb2RlbENsYXNzID0gY29udGFpbmVyLmxvb2t1
cEZhY3RvcnkoJ21vZGVsOicgKyBuYW1lKTsKIAotICAgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVy
SW5mb119IG9sZEhhbmRsZXJzIGEgbGlzdCBvZiB0aGUgaGFuZGxlcgotICAgICAgICBpbmZvcm1h
dGlvbiBmb3IgdGhlIHByZXZpb3VzIFVSTCAob3IgYFtdYCBpZiB0aGlzIGlzIHRoZQotICAgICAg
ICBmaXJzdCBoYW5kbGVkIHRyYW5zaXRpb24pCi0gICAgICBAcGFyYW0ge0FycmF5W0hhbmRsZXJJ
bmZvXX0gbmV3SGFuZGxlcnMgYSBsaXN0IG9mIHRoZSBoYW5kbGVyCi0gICAgICAgIGluZm9ybWF0
aW9uIGZvciB0aGUgbmV3IFVSTAorICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB1c2VkIHRoZSBk
eW5hbWljIHNlZ21lbnQgIiArIG5hbWUgKyAiX2lkIGluIHlvdXIgcm91dGUgIiArCisgICAgICAg
ICAgICAgICAgICAgICByb3V0ZU5hbWUgKyAiLCBidXQgIiArIG5hbWVzcGFjZSArICIuIiArIGNs
YXNzaWZ5KG5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICIgZGlkIG5vdCBleGlzdCBhbmQg
eW91IGRpZCBub3Qgb3ZlcnJpZGUgeW91ciByb3V0ZSdzIGBtb2RlbGAgIiArCisgICAgICAgICAg
ICAgICAgICAgICAiaG9vay4iLCBtb2RlbENsYXNzKTsKIAotICAgICAgQHJldHVybiB7UGFydGl0
aW9ufQotICAgICovCi0gICAgZnVuY3Rpb24gcGFydGl0aW9uSGFuZGxlcnMob2xkSGFuZGxlcnMs
IG5ld0hhbmRsZXJzKSB7Ci0gICAgICB2YXIgaGFuZGxlcnMgPSB7Ci0gICAgICAgICAgICB1cGRh
dGVkQ29udGV4dDogW10sCi0gICAgICAgICAgICBleGl0ZWQ6IFtdLAotICAgICAgICAgICAgZW50
ZXJlZDogW10KLSAgICAgICAgICB9OworICAgICAgICByZXR1cm4gbW9kZWxDbGFzcy5maW5kKHZh
bHVlKTsKKyAgICAgIH0KKyAgICB9OworICB9KSwKIAotICAgICAgdmFyIGhhbmRsZXJDaGFuZ2Vk
LCBjb250ZXh0Q2hhbmdlZCwgaSwgbDsKKyAgLyoqCisgICAgQSBob29rIHlvdSBjYW4gaW1wbGVt
ZW50IHRvIGNvbnZlcnQgdGhlIHJvdXRlJ3MgbW9kZWwgaW50byBwYXJhbWV0ZXJzCisgICAgZm9y
IHRoZSBVUkwuCiAKLSAgICAgIGZvciAoaT0wLCBsPW5ld0hhbmRsZXJzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICAgICAgdmFyIG9sZEhhbmRsZXIgPSBvbGRIYW5kbGVyc1tpXSwgbmV3SGFuZGxl
ciA9IG5ld0hhbmRsZXJzW2ldOworICAgIGBgYGpzCisgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rp
b24oKSB7CisgICAgICB0aGlzLnJlc291cmNlKCdwb3N0Jywge3BhdGg6ICcvcG9zdHMvOnBvc3Rf
aWQnfSk7CisgICAgfSk7CiAKLSAgICAgICAgaWYgKCFvbGRIYW5kbGVyIHx8IG9sZEhhbmRsZXIu
aGFuZGxlciAhPT0gbmV3SGFuZGxlci5oYW5kbGVyKSB7Ci0gICAgICAgICAgaGFuZGxlckNoYW5n
ZWQgPSB0cnVlOwotICAgICAgICB9CisgICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4
dGVuZCh7CisgICAgICBtb2RlbDogZnVuY3Rpb24ocGFyYW1zKSB7CisgICAgICAgIC8vIHRoZSBz
ZXJ2ZXIgcmV0dXJucyBgeyBpZDogMTIgfWAKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5nZXRKU09O
KCIvcG9zdHMvIiArIHBhcmFtcy5wb3N0X2lkKTsKKyAgICAgIH0sCiAKLSAgICAgICAgaWYgKGhh
bmRsZXJDaGFuZ2VkKSB7Ci0gICAgICAgICAgaGFuZGxlcnMuZW50ZXJlZC5wdXNoKG5ld0hhbmRs
ZXIpOwotICAgICAgICAgIGlmIChvbGRIYW5kbGVyKSB7IGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0
KG9sZEhhbmRsZXIpOyB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dENoYW5nZWQgfHwgb2xk
SGFuZGxlci5jb250ZXh0ICE9PSBuZXdIYW5kbGVyLmNvbnRleHQpIHsKLSAgICAgICAgICBjb250
ZXh0Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgaGFuZGxlcnMudXBkYXRlZENvbnRleHQucHVz
aChuZXdIYW5kbGVyKTsKLSAgICAgICAgfQorICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2Rl
bCkgeworICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSB0aGUgVVJMIGAvcG9zdHMvMTJgCisgICAg
ICAgIHJldHVybiB7IHBvc3RfaWQ6IG1vZGVsLmlkIH07CiAgICAgICB9CisgICAgfSk7CisgICAg
YGBgCiAKLSAgICAgIGZvciAoaT1uZXdIYW5kbGVycy5sZW5ndGgsIGw9b2xkSGFuZGxlcnMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgICAgICBoYW5kbGVycy5leGl0ZWQudW5zaGlmdChvbGRIYW5k
bGVyc1tpXSk7Ci0gICAgICB9CisgICAgVGhlIGRlZmF1bHQgYHNlcmlhbGl6ZWAgbWV0aG9kIHdp
bGwgaW5zZXJ0IHRoZSBtb2RlbCdzIGBpZGAgaW50byB0aGUKKyAgICByb3V0ZSdzIGR5bmFtaWMg
c2VnbWVudCAoaW4gdGhpcyBjYXNlLCBgOnBvc3RfaWRgKSBpZiB0aGUgc2VnbWVudCBjb250YWlu
cyAnX2lkJy4KKyAgICBJZiB0aGUgcm91dGUgaGFzIG11bHRpcGxlIGR5bmFtaWMgc2VnbWVudHMg
b3IgZG9lcyBub3QgY29udGFpbiAnX2lkJywgYHNlcmlhbGl6ZWAKKyAgICB3aWxsIHJldHVybiBg
RW1iZXIuZ2V0UHJvcGVydGllcyhtb2RlbCwgcGFyYW1zKWAKIAotICAgICAgcmV0dXJuIGhhbmRs
ZXJzOwotICAgIH0KKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBgdHJhbnNpdGlvblRv
YCBpcyBjYWxsZWQgd2l0aCBhIGNvbnRleHQKKyAgICBpbiBvcmRlciB0byBwb3B1bGF0ZSB0aGUg
VVJMLgogCi0gICAgZnVuY3Rpb24gdHJpZ2dlcihyb3V0ZXIsIGFyZ3MpIHsKLSAgICAgIHZhciBj
dXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3M7CisgICAgQG1l
dGhvZCBzZXJpYWxpemUKKyAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwgdGhlIHJvdXRlJ3MgbW9k
ZWwKKyAgICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgYW4gQXJyYXkgb2YgcGFyYW1ldGVyIG5hbWVz
IGZvciB0aGUgY3VycmVudAorICAgICAgcm91dGUgKGluIHRoZSBleGFtcGxlLCBgWydwb3N0X2lk
J11gLgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIHNlcmlhbGl6ZWQgcGFyYW1ldGVycworICAq
LworICBzZXJpYWxpemU6IGZ1bmN0aW9uKG1vZGVsLCBwYXJhbXMpIHsKKyAgICBpZiAocGFyYW1z
Lmxlbmd0aCA8IDEpIHsgcmV0dXJuOyB9CisgICAgaWYgKCFtb2RlbCkgeyByZXR1cm47IH0KIAot
ICAgICAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7CisgICAgdmFyIG5hbWUgPSBwYXJhbXNbMF0s
IG9iamVjdCA9IHt9OwogCi0gICAgICBpZiAoIWN1cnJlbnRIYW5kbGVySW5mb3MpIHsKLSAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgdHJpZ2dlciBldmVudCAnIiArIG5hbWUgKyAi
Jy4gVGhlcmUgYXJlIG5vIGFjdGl2ZSBoYW5kbGVycyIpOwotICAgICAgfQorICAgIGlmICgvX2lk
JC8udGVzdChuYW1lKSAmJiBwYXJhbXMubGVuZ3RoID09PSAxKSB7CisgICAgICBvYmplY3RbbmFt
ZV0gPSBnZXQobW9kZWwsICJpZCIpOworICAgIH0gZWxzZSB7CisgICAgICBvYmplY3QgPSBnZXRQ
cm9wZXJ0aWVzKG1vZGVsLCBwYXJhbXMpOworICAgIH0KIAotICAgICAgZm9yICh2YXIgaT1jdXJy
ZW50SGFuZGxlckluZm9zLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAgdmFyIGhhbmRs
ZXJJbmZvID0gY3VycmVudEhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAgICAgIGhhbmRsZXIgPSBo
YW5kbGVySW5mby5oYW5kbGVyOworICAgIHJldHVybiBvYmplY3Q7CisgIH0sCiAKLSAgICAgICAg
aWYgKGhhbmRsZXIuZXZlbnRzICYmIGhhbmRsZXIuZXZlbnRzW25hbWVdKSB7Ci0gICAgICAgICAg
aGFuZGxlci5ldmVudHNbbmFtZV0uYXBwbHkoaGFuZGxlciwgYXJncyk7Ci0gICAgICAgICAgcmV0
dXJuOwotICAgICAgICB9Ci0gICAgICB9CisgIC8qKgorICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0
byBzZXR1cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUuCiAKLSAgICAgIHRo
cm93IG5ldyBFcnJvcigiTm90aGluZyBoYW5kbGVkIHRoZSBldmVudCAnIiArIG5hbWUgKyAiJy4i
KTsKLSAgICB9CisgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGNvbnRyb2xsZXIg
Zm9yIHRoZSBjdXJyZW50IHJvdXRlIGFuZCB0aGUKKyAgICBtb2RlbCBzdXBwbGllZCBieSB0aGUg
YG1vZGVsYCBob29rLgogCi0gICAgZnVuY3Rpb24gc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0
KSB7Ci0gICAgICBoYW5kbGVyLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgaWYgKGhhbmRsZXIu
Y29udGV4dERpZENoYW5nZSkgeyBoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2UoKTsgfQotICAgIH0K
LSAgICByZXR1cm4gUm91dGVyOwotICB9KTsKKyAgICBCeSBkZWZhdWx0LCB0aGUgYHNldHVwQ29u
dHJvbGxlcmAgaG9vayBzZXRzIHRoZSBgY29udGVudGAgcHJvcGVydHkgb2YKKyAgICB0aGUgY29u
dHJvbGxlciB0byB0aGUgYG1vZGVsYC4KIAotfSkoKTsKKyAgICBUaGlzIG1lYW5zIHRoYXQgeW91
ciB0ZW1wbGF0ZSB3aWxsIGdldCBhIHByb3h5IGZvciB0aGUgbW9kZWwgYXMgaXRzCisgICAgY29u
dGV4dCwgYW5kIHlvdSBjYW4gYWN0IGFzIHRob3VnaCB0aGUgbW9kZWwgaXRzZWxmIHdhcyB0aGUg
Y29udGV4dC4KIAorICAgIFRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdpbGwgYmUgb25lIHJlc29s
dmVkIGJhc2VkIG9uIHRoZSBuYW1lCisgICAgb2YgdGhpcyByb3V0ZS4KIAorICAgIElmIG5vIGV4
cGxpY2l0IGNvbnRyb2xsZXIgaXMgZGVmaW5lZCwgRW1iZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNy
ZWF0ZQorICAgIGFuIGFwcHJvcHJpYXRlIGNvbnRyb2xsZXIgZm9yIHRoZSBtb2RlbC4KIAotKGZ1
bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcK
LSovCisgICAgKiBpZiB0aGUgbW9kZWwgaXMgYW4gYEVtYmVyLkFycmF5YCAoaW5jbHVkaW5nIHJl
Y29yZCBhcnJheXMgZnJvbSBFbWJlcgorICAgICAgRGF0YSksIHRoZSBjb250cm9sbGVyIGlzIGFu
IGBFbWJlci5BcnJheUNvbnRyb2xsZXJgLgorICAgICogb3RoZXJ3aXNlLCB0aGUgY29udHJvbGxl
ciBpcyBhbiBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAuCiAKLWZ1bmN0aW9uIERTTChuYW1lKSB7
Ci0gIHRoaXMucGFyZW50ID0gbmFtZTsKLSAgdGhpcy5tYXRjaGVzID0gW107Ci19CisgICAgQXMg
YW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIHJvdXRlcjoKIAotRFNMLnByb3RvdHlwZSA9IHsKLSAg
cmVzb3VyY2U6IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7Ci0gICAgaWYgKGFy
Z3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHsK
LSAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsKLSAgICAgIG9wdGlvbnMgPSB7fTsKLSAgICB9Cisg
ICAgYGBganMKKyAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucmVz
b3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKKyAgICB9KTsKKyAgICBg
YGAKIAotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICBvcHRpb25zID0g
e307Ci0gICAgfQorICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCBhIGNvbnRyb2xsZXIgbmFtZWQg
YEFwcC5Qb3N0Q29udHJvbGxlcmAgd291bGQKKyAgICBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQu
IElmIGl0IGlzIG5vdCBkZWZpbmVkLCBhbiBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAKKyAgICBp
bnN0YW5jZSB3b3VsZCBiZSB1c2VkLgorCisgICAgRXhhbXBsZQogCi0gICAgaWYgKHR5cGVvZiBv
cHRpb25zLnBhdGggIT09ICdzdHJpbmcnKSB7Ci0gICAgICBvcHRpb25zLnBhdGggPSAiLyIgKyBu
YW1lOwotICAgIH0KKyAgICBgYGBqcworICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5l
eHRlbmQoeworICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2Rl
bCkgeworICAgICAgICBjb250cm9sbGVyLnNldCgnbW9kZWwnLCBtb2RlbCk7CisgICAgICB9Cisg
ICAgfSk7CisgICAgYGBgCiAKLSAgICBpZiAoY2FsbGJhY2spIHsKLSAgICAgIHZhciBkc2wgPSBu
ZXcgRFNMKG5hbWUpOwotICAgICAgY2FsbGJhY2suY2FsbChkc2wpOwotICAgICAgdGhpcy5wdXNo
KG9wdGlvbnMucGF0aCwgbmFtZSwgZHNsLmdlbmVyYXRlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICB0aGlzLnB1c2gob3B0aW9ucy5wYXRoLCBuYW1lKTsKKyAgICBAbWV0aG9kIHNldHVwQ29udHJv
bGxlcgorICAgIEBwYXJhbSB7Q29udHJvbGxlcn0gY29udHJvbGxlciBpbnN0YW5jZQorICAgIEBw
YXJhbSB7T2JqZWN0fSBtb2RlbAorICAqLworICBzZXR1cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNv
bnRyb2xsZXIsIGNvbnRleHQpIHsKKyAgICBpZiAoY29udHJvbGxlciAmJiAoY29udGV4dCAhPT0g
dW5kZWZpbmVkKSkgeworICAgICAgc2V0KGNvbnRyb2xsZXIsICdtb2RlbCcsIGNvbnRleHQpOwog
ICAgIH0KICAgfSwKIAotICBwdXNoOiBmdW5jdGlvbih1cmwsIG5hbWUsIGNhbGxiYWNrKSB7Ci0g
ICAgaWYgKHVybCA9PT0gIiIgfHwgdXJsID09PSAiLyIpIHsgdGhpcy5leHBsaWNpdEluZGV4ID0g
dHJ1ZTsgfQotCi0gICAgdGhpcy5tYXRjaGVzLnB1c2goW3VybCwgbmFtZSwgY2FsbGJhY2tdKTsK
LSAgfSwKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFy
IHJvdXRlIG9yIG5hbWUuCiAKLSAgcm91dGU6IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsKLSAg
ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBgdGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5
cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nKTsKKyAgICBUaGUgY29udHJvbGxlciBpbnN0YW5j
ZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQsIGVpdGhlciB0aHJvdWdoIGVudGVyaW5n
IHRoZQorICAgIGFzc29jaWF0ZWQgcm91dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJvbGxlcmAu
CiAKLSAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgICBgYGBqcworICAgIEFwcC5Qb3N0
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5j
dGlvbihjb250cm9sbGVyLCBwb3N0KSB7CisgICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIs
IHBvc3QpOworICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ3Bvc3RzJykuc2V0KCdjdXJyZW50
UG9zdCcsIHBvc3QpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAogCi0gICAgaWYgKHR5cGVv
ZiBvcHRpb25zLnBhdGggIT09ICdzdHJpbmcnKSB7Ci0gICAgICBvcHRpb25zLnBhdGggPSAiLyIg
KyBuYW1lOwotICAgIH0KKyAgICBAbWV0aG9kIGNvbnRyb2xsZXJGb3IKKyAgICBAcGFyYW0ge1N0
cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgb3IgY29udHJvbGxlcgorICAgIEByZXR1
cm4ge0VtYmVyLkNvbnRyb2xsZXJ9CisgICovCisgIGNvbnRyb2xsZXJGb3I6IGZ1bmN0aW9uKG5h
bWUsIF9za2lwQXNzZXJ0KSB7CisgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLAor
ICAgICAgICByb3V0ZSA9IGNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicrbmFtZSksCisgICAgICAg
IGNvbnRyb2xsZXI7CiAKLSAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQgIT09ICdh
cHBsaWNhdGlvbicpIHsKLSAgICAgIG5hbWUgPSB0aGlzLnBhcmVudCArICIuIiArIG5hbWU7Cisg
ICAgaWYgKHJvdXRlICYmIHJvdXRlLmNvbnRyb2xsZXJOYW1lKSB7CisgICAgICBuYW1lID0gcm91
dGUuY29udHJvbGxlck5hbWU7CiAgICAgfQogCi0gICAgdGhpcy5wdXNoKG9wdGlvbnMucGF0aCwg
bmFtZSk7Ci0gIH0sCisgICAgY29udHJvbGxlciA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xs
ZXI6JyArIG5hbWUpOwogCi0gIGdlbmVyYXRlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgZHNsTWF0
Y2hlcyA9IHRoaXMubWF0Y2hlczsKKyAgICAvLyBOT1RFOiBXZSdyZSBzcGVjaWZpY2FsbHkgY2hl
Y2tpbmcgdGhhdCBza2lwQXNzZXJ0IGlzIHRydWUsIGJlY2F1c2UgYWNjb3JkaW5nCisgICAgLy8g
ICB0byB0aGUgb2xkIEFQSSB0aGUgc2Vjb25kIHBhcmFtZXRlciB3YXMgbW9kZWwuIFdlIGRvIG5v
dCB3YW50IHBlb3BsZSB3aG8KKyAgICAvLyAgIHBhc3NlZCBhIG1vZGVsIHRvIHNraXAgdGhlIGFz
c2VydGlvbi4KKyAgICBFbWJlci5hc3NlcnQoIlRoZSBjb250cm9sbGVyIG5hbWVkICciK25hbWUr
IicgY291bGQgbm90IGJlIGZvdW5kLiBNYWtlIHN1cmUgIiArCisgICAgICAgICAgICAgICAgICJ0
aGF0IHRoaXMgcm91dGUgZXhpc3RzIGFuZCBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWQgYXQgbGVh
c3QgIiArCisgICAgICAgICAgICAgICAgICJvbmNlLiBJZiB5b3UgYXJlIGFjY2Vzc2luZyBhIGNv
bnRyb2xsZXIgbm90IGFzc29jaWF0ZWQgd2l0aCBhICIgKworICAgICAgICAgICAgICAgICAicm91
dGUsIG1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBjbGFzcyBpcyBleHBsaWNpdGx5IGRlZmluZWQu
IiwKKyAgICAgICAgICAgICAgICAgY29udHJvbGxlciB8fCBfc2tpcEFzc2VydCA9PT0gdHJ1ZSk7
CiAKLSAgICBpZiAoIXRoaXMuZXhwbGljaXRJbmRleCkgewotICAgICAgdGhpcy5yb3V0ZSgiaW5k
ZXgiLCB7IHBhdGg6ICIvIiB9KTsKLSAgICB9CisgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgIH0s
CiAKLSAgICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsKLSAgICAgIGZvciAodmFyIGk9MCwgbD1k
c2xNYXRjaGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIGRzbE1hdGNoID0gZHNs
TWF0Y2hlc1tpXTsKLSAgICAgICAgbWF0Y2goZHNsTWF0Y2hbMF0pLnRvKGRzbE1hdGNoWzFdLCBk
c2xNYXRjaFsyXSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotfTsKKyAgLyoqCisgICAgR2VuZXJh
dGVzIGEgY29udHJvbGxlciBmb3IgYSByb3V0ZS4KIAotRFNMLm1hcCA9IGZ1bmN0aW9uKGNhbGxi
YWNrKSB7Ci0gIHZhciBkc2wgPSBuZXcgRFNMKCk7Ci0gIGNhbGxiYWNrLmNhbGwoZHNsKTsKLSAg
cmV0dXJuIGRzbDsKLX07CisgICAgSWYgdGhlIG9wdGlvbmFsIG1vZGVsIGlzIHBhc3NlZCB0aGVu
IHRoZSBjb250cm9sbGVyIHR5cGUgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAorICAgIGUu
Zy4sIGFuIEFycmF5Q29udHJvbGxlciBmb3IgYXJyYXlzLgogCi1FbWJlci5Sb3V0ZXJEU0wgPSBE
U0w7CisgICAgRXhhbXBsZQogCi19KSgpOworICAgIGBgYGpzCisgICAgQXBwLlBvc3RSb3V0ZSA9
IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICBzZXR1cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNv
bnRyb2xsZXIsIHBvc3QpIHsKKyAgICAgICAgdGhpcy5fc3VwZXIoY29udHJvbGxlciwgcG9zdCk7
CisgICAgICAgIHRoaXMuZ2VuZXJhdGVDb250cm9sbGVyKCdwb3N0cycsIHBvc3QpOworICAgICAg
fQorICAgIH0pOworICAgIGBgYAogCisgICAgQG1ldGhvZCBnZW5lcmF0ZUNvbnRyb2xsZXIKKyAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlcgorICAgIEBw
YXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgbW9kZWwgdG8gaW5mZXIgdGhlIHR5cGUgb2YgdGhlIGNv
bnRyb2xsZXIgKG9wdGlvbmFsKQorICAqLworICBnZW5lcmF0ZUNvbnRyb2xsZXI6IGZ1bmN0aW9u
KG5hbWUsIG1vZGVsKSB7CisgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwogCisg
ICAgbW9kZWwgPSBtb2RlbCB8fCB0aGlzLm1vZGVsRm9yKG5hbWUpOwogCi0oZnVuY3Rpb24oKSB7
Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotKi8KKyAgICBy
ZXR1cm4gRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyKGNvbnRhaW5lciwgbmFtZSwgbW9kZWwpOwor
ICB9LAogCi1FbWJlci5jb250cm9sbGVyRm9yID0gZnVuY3Rpb24oY29udGFpbmVyLCBjb250cm9s
bGVyTmFtZSwgY29udGV4dCkgewotICByZXR1cm4gY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxl
cjonICsgY29udHJvbGxlck5hbWUpIHx8Ci0gICAgICAgICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xs
ZXIoY29udGFpbmVyLCBjb250cm9sbGVyTmFtZSwgY29udGV4dCk7Ci19OworICAvKioKKyAgICBS
ZXR1cm5zIHRoZSBtb2RlbCBvZiBhIHBhcmVudCAob3IgYW55IGFuY2VzdG9yKSByb3V0ZQorICAg
IGluIGEgcm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEgdHJhbnNpdGlvbiwgYWxsIHJvdXRlcwor
ICAgIG11c3QgcmVzb2x2ZSBhIG1vZGVsIG9iamVjdCwgYW5kIGlmIGEgcm91dGUKKyAgICBuZWVk
cyBhY2Nlc3MgdG8gYSBwYXJlbnQgcm91dGUncyBtb2RlbCBpbiBvcmRlciB0bworICAgIHJlc29s
dmUgYSBtb2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9kZWwgZnJvbSBhIHBhcmVudCksCisgICAg
aXQgY2FuIGNhbGwgYHRoaXMubW9kZWxGb3IodGhlTmFtZU9mUGFyZW50Um91dGUpYCB0bworICAg
IHJldHJpZXZlIGl0LgogCi1FbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbihjb250
YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KSB7Ci0gIHZhciBjb250cm9sbGVyOworICAg
IEV4YW1wbGUKIAotICBpZiAoY29udGV4dCAmJiBFbWJlci5pc0FycmF5KGNvbnRleHQpKSB7Ci0g
ICAgY29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgICAgY29u
dGVudDogY29udGV4dAorICAgIGBgYGpzCisgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7
CisgICAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7IHBhdGg6ICcvcG9zdC86cG9zdF9pZCcg
fSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlKCdjb21tZW50cycpOwor
ICAgICAgICB9KTsKICAgICB9KTsKLSAgfSBlbHNlIGlmIChjb250ZXh0KSB7Ci0gICAgY29udHJv
bGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAgIGNvbnRlbnQ6IGNv
bnRleHQKKworICAgIEFwcC5Db21tZW50c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAg
ICAgICAgYWZ0ZXJNb2RlbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnNldCgncG9z
dCcsIHRoaXMubW9kZWxGb3IoJ3Bvc3QnKSk7CisgICAgICAgIH0KICAgICB9KTsKLSAgfSBlbHNl
IHsKLSAgICBjb250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoKTsKLSAgfQorICAg
IGBgYAogCi0gIGNvbnRyb2xsZXIudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
IihnZW5lcmF0ZWQgIiArIGNvbnRyb2xsZXJOYW1lICsgIiBjb250cm9sbGVyKSI7Ci0gIH07Cisg
ICAgQG1ldGhvZCBtb2RlbEZvcgorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9m
IHRoZSByb3V0ZQorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVsIG9iamVjdAorICAqLwor
ICBtb2RlbEZvcjogZnVuY3Rpb24obmFtZSkgewogCi0gIGNvbnRhaW5lci5yZWdpc3RlcignY29u
dHJvbGxlcicsIGNvbnRyb2xsZXJOYW1lLCBjb250cm9sbGVyKTsKLSAgcmV0dXJuIGNvbnRhaW5l
ci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lKTsKLX07CisgICAgdmFyIHJv
dXRlID0gdGhpcy5jb250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSksCisgICAgICAgIHRy
YW5zaXRpb24gPSB0aGlzLnJvdXRlci5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbjsKIAotfSkoKTsK
KyAgICAvLyBJZiB3ZSBhcmUgbWlkLXRyYW5zaXRpb24sIHdlIHdhbnQgdG8gdHJ5IGFuZCBsb29r
IHVwCisgICAgLy8gcmVzb2x2ZWQgcGFyZW50IGNvbnRleHRzIG9uIHRoZSBjdXJyZW50IHRyYW5z
aXRpb25FdmVudC4KKyAgICBpZiAodHJhbnNpdGlvbikgeworICAgICAgdmFyIG1vZGVsTG9va3Vw
TmFtZSA9IChyb3V0ZSAmJiByb3V0ZS5yb3V0ZU5hbWUpIHx8IG5hbWU7CisgICAgICBpZiAodHJh
bnNpdGlvbi5yZXNvbHZlZE1vZGVscy5oYXNPd25Qcm9wZXJ0eShtb2RlbExvb2t1cE5hbWUpKSB7
CisgICAgICAgIHJldHVybiB0cmFuc2l0aW9uLnJlc29sdmVkTW9kZWxzW21vZGVsTG9va3VwTmFt
ZV07CisgICAgICB9CisgICAgfQogCisgICAgcmV0dXJuIHJvdXRlICYmIHJvdXRlLmN1cnJlbnRN
b2RlbDsKKyAgfSwKIAorICAvKioKKyAgICBBIGhvb2sgeW91IGNhbiB1c2UgdG8gcmVuZGVyIHRo
ZSB0ZW1wbGF0ZSBmb3IgdGhlIGN1cnJlbnQgcm91dGUuCiAKLShmdW5jdGlvbigpIHsKLS8qKgot
QG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLworICAgIFRoaXMgbWV0
aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb250cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZSBh
bmQgdGhlCisgICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9vay4gQnkgZGVmYXVs
dCwgaXQgcmVuZGVycyB0aGUgcm91dGUncworICAgIHRlbXBsYXRlLCBjb25maWd1cmVkIHdpdGgg
dGhlIGNvbnRyb2xsZXIgZm9yIHRoZSByb3V0ZS4KIAotdmFyIFJvdXRlciA9IHJlcXVpcmVNb2R1
bGUoInJvdXRlciIpOwotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBjbGFz
c2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lmeTsKKyAgICBUaGlzIG1ldGhvZCBjYW4gYmUgb3Zl
cnJpZGRlbiB0byBzZXQgdXAgYW5kIHJlbmRlciBhZGRpdGlvbmFsIG9yCisgICAgYWx0ZXJuYXRp
dmUgdGVtcGxhdGVzLgogCi12YXIgRGVmYXVsdFZpZXcgPSBFbWJlci5fTWV0YW1vcnBoVmlldzsK
LWZ1bmN0aW9uIHNldHVwTG9jYXRpb24ocm91dGVyKSB7Ci0gIHZhciBsb2NhdGlvbiA9IGdldChy
b3V0ZXIsICdsb2NhdGlvbicpLAotICAgICAgcm9vdFVSTCA9IGdldChyb3V0ZXIsICdyb290VVJM
Jyk7CisgICAgYGBganMKKyAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7
CisgICAgICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24oY29udHJvbGxlciwgbW9kZWwpIHsKKyAg
ICAgICAgdmFyIGZhdkNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXJGb3IoJ2Zhdm9yaXRlUG9z
dCcpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgYGZhdm9yaXRlUG9zdGAgdGVtcGxhdGUgaW50
bworICAgICAgICAvLyB0aGUgb3V0bGV0IGBwb3N0c2AsIGFuZCBkaXNwbGF5IHRoZSBgZmF2b3Jp
dGVQb3N0YAorICAgICAgICAvLyBjb250cm9sbGVyLgorICAgICAgICB0aGlzLnJlbmRlcignZmF2
b3JpdGVQb3N0JywgeworICAgICAgICAgIG91dGxldDogJ3Bvc3RzJywKKyAgICAgICAgICBjb250
cm9sbGVyOiBmYXZDb250cm9sbGVyCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0pOworICAg
IGBgYAogCi0gIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGxvY2F0aW9uKSB7Ci0gICAgbG9jYXRp
b24gPSBzZXQocm91dGVyLCAnbG9jYXRpb24nLCBFbWJlci5Mb2NhdGlvbi5jcmVhdGUoewotICAg
ICAgaW1wbGVtZW50YXRpb246IGxvY2F0aW9uCi0gICAgfSkpOworICAgIEBtZXRob2QgcmVuZGVy
VGVtcGxhdGUKKyAgICBAcGFyYW0ge09iamVjdH0gY29udHJvbGxlciB0aGUgcm91dGUncyBjb250
cm9sbGVyCisgICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCisgICov
CisgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgeworICAgIHRo
aXMucmVuZGVyKCk7CisgIH0sCiAKLSAgICBpZiAodHlwZW9mIHJvb3RVUkwgPT09ICdzdHJpbmcn
KSB7Ci0gICAgICBzZXQobG9jYXRpb24sICdyb290VVJMJywgcm9vdFVSTCk7Ci0gICAgfQotICB9
Ci19CisgIC8qKgorICAgIFJlbmRlcnMgYSB0ZW1wbGF0ZSBpbnRvIGFuIG91dGxldC4KIAotLyoq
Ci0gIFRoZSBgRW1iZXIuUm91dGVyYCBjbGFzcyBtYW5hZ2VzIHRoZSBhcHBsaWNhdGlvbiBzdGF0
ZSBhbmQgVVJMcy4gUmVmZXIgdG8KLSAgdGhlIFtyb3V0aW5nIGd1aWRlXShodHRwOi8vZW1iZXJq
cy5jb20vZ3VpZGVzL3JvdXRpbmcvKSBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgICBUaGlzIG1ldGhv
ZCBoYXMgYSBudW1iZXIgb2YgZGVmYXVsdHMsIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZQorICAg
IHJvdXRlIHNwZWNpZmllZCBpbiB0aGUgcm91dGVyLgogCi0gIEBjbGFzcyBSb3V0ZXIKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5Sb3V0ZXIg
PSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgbG9jYXRpb246ICdoYXNoJywKKyAgICBGb3IgZXhh
bXBsZToKIAotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnJvdXRlciA9IHRoaXMuY29u
c3RydWN0b3Iucm91dGVyOwotICAgIHRoaXMuX2FjdGl2ZVZpZXdzID0ge307Ci0gICAgc2V0dXBM
b2NhdGlvbih0aGlzKTsKLSAgfSwKKyAgICBgYGBqcworICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0
aW9uKCkgeworICAgICAgdGhpcy5yb3V0ZSgnaW5kZXgnKTsKKyAgICAgIHRoaXMucmVzb3VyY2Uo
J3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKKyAgICB9KTsKIAotICB1cmw6IEVt
YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0aW9u
JykuZ2V0VVJMKCk7Ci0gIH0pLAorICAgIEFwcC5Qb3N0Um91dGUgPSBBcHAuUm91dGUuZXh0ZW5k
KHsKKyAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yZW5k
ZXIoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKIAotICBzdGFydFJvdXRpbmc6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMucm91dGVyID0gdGhpcy5yb3V0ZXIgfHwgdGhpcy5jb25zdHJ1Y3Rv
ci5tYXAoRW1iZXIuSyk7CisgICAgVGhlIG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBhcyBkZWZp
bmVkIGJ5IHRoZSByb3V0ZXIsIGlzIGBwb3N0YC4KIAotICAgIHZhciByb3V0ZXIgPSB0aGlzLnJv
dXRlciwKLSAgICAgICAgbG9jYXRpb24gPSBnZXQodGhpcywgJ2xvY2F0aW9uJyksCi0gICAgICAg
IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLAotICAgICAgICBzZWxmID0gdGhpczsKKyAgICBC
eSBkZWZhdWx0LCByZW5kZXIgd2lsbDoKIAotICAgIHNldHVwUm91dGVyKHRoaXMsIHJvdXRlciwg
bG9jYXRpb24pOworICAgICogcmVuZGVyIHRoZSBgcG9zdGAgdGVtcGxhdGUKKyAgICAqIHdpdGgg
dGhlIGBwb3N0YCB2aWV3IChgUG9zdFZpZXdgKSBmb3IgZXZlbnQgaGFuZGxpbmcsIGlmIG9uZSBl
eGlzdHMKKyAgICAqIGFuZCB0aGUgYHBvc3RgIGNvbnRyb2xsZXIgKGBQb3N0Q29udHJvbGxlcmAp
LCBpZiBvbmUgZXhpc3RzCisgICAgKiBpbnRvIHRoZSBgbWFpbmAgb3V0bGV0IG9mIHRoZSBgYXBw
bGljYXRpb25gIHRlbXBsYXRlCiAKLSAgICBjb250YWluZXIucmVnaXN0ZXIoJ3ZpZXcnLCAnZGVm
YXVsdCcsIERlZmF1bHRWaWV3KTsKLSAgICBjb250YWluZXIucmVnaXN0ZXIoJ3ZpZXcnLCAndG9w
bGV2ZWwnLCBFbWJlci5WaWV3LmV4dGVuZCgpKTsKKyAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMg
YmVoYXZpb3I6CiAKLSAgICBsb2NhdGlvbi5vblVwZGF0ZVVSTChmdW5jdGlvbih1cmwpIHsKLSAg
ICAgIHNlbGYuaGFuZGxlVVJMKHVybCk7CisgICAgYGBganMKKyAgICBBcHAuUG9zdFJvdXRlID0g
QXBwLlJvdXRlLmV4dGVuZCh7CisgICAgICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHRoaXMucmVuZGVyKCdteVBvc3QnLCB7ICAgLy8gdGhlIHRlbXBsYXRlIHRvIHJlbmRl
cgorICAgICAgICAgIGludG86ICdpbmRleCcsICAgICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSB0byBy
ZW5kZXIgaW50bworICAgICAgICAgIG91dGxldDogJ2RldGFpbCcsICAgICAgIC8vIHRoZSBuYW1l
IG9mIHRoZSBvdXRsZXQgaW4gdGhhdCB0ZW1wbGF0ZQorICAgICAgICAgIGNvbnRyb2xsZXI6ICdi
bG9nUG9zdCcgIC8vIHRoZSBjb250cm9sbGVyIHRvIHVzZSBmb3IgdGhlIHRlbXBsYXRlCisgICAg
ICAgIH0pOworICAgICAgfQogICAgIH0pOworICAgIGBgYAogCi0gICAgdGhpcy5oYW5kbGVVUkwo
bG9jYXRpb24uZ2V0VVJMKCkpOwotICB9LAorICAgIFJlbWVtYmVyIHRoYXQgdGhlIGNvbnRyb2xs
ZXIncyBgY29udGVudGAgd2lsbCBiZSB0aGUgcm91dGUncyBtb2RlbC4gSW4KKyAgICB0aGlzIGNh
c2UsIHRoZSBkZWZhdWx0IG1vZGVsIHdpbGwgYmUgYEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3Rf
aWQpYC4KIAotICBkaWRUcmFuc2l0aW9uOiBmdW5jdGlvbihpbmZvcykgewotICAgIC8vIERvbid0
IGRvIGFueSBmdXJ0aGVyIGFjdGlvbiBoZXJlIGlmIHdlIHJlZGlyZWN0ZWQKLSAgICBmb3IgKHZh
ciBpPTAsIGw9aW5mb3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgaWYgKGluZm9zW2ldLmhh
bmRsZXIucmVkaXJlY3RlZCkgeyByZXR1cm47IH0KKyAgICBAbWV0aG9kIHJlbmRlcgorICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKKyAg
ICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucworICAqLworICByZW5kZXI6IGZ1
bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsKKyAgICBFbWJlci5hc3NlcnQoIlRoZSBuYW1lIGluIHRo
ZSBnaXZlbiBhcmd1bWVudHMgaXMgdW5kZWZpbmVkIiwgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyAh
RW1iZXIuaXNOb25lKGFyZ3VtZW50c1swXSkgOiB0cnVlKTsKKworICAgIHZhciBuYW1lUGFzc2Vk
ID0gISFuYW1lOworCisgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyAmJiAhb3B0aW9u
cykgeworICAgICAgb3B0aW9ucyA9IG5hbWU7CisgICAgICBuYW1lID0gdGhpcy5yb3V0ZU5hbWU7
CiAgICAgfQogCi0gICAgdmFyIGFwcENvbnRyb2xsZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAo
J2NvbnRyb2xsZXI6YXBwbGljYXRpb24nKSwKLSAgICAgICAgcGF0aCA9IHJvdXRlUGF0aChpbmZv
cyk7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAKLSAgICBzZXQoYXBwQ29udHJvbGxl
ciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7Ci0gICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgn
dXJsJyk7CisgICAgdmFyIHRlbXBsYXRlTmFtZTsKIAotICAgIGlmIChnZXQodGhpcywgJ25hbWVz
cGFjZScpLkxPR19UUkFOU0lUSU9OUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmxvZygiVHJhbnNp
dGlvbmVkIGludG8gJyIgKyBwYXRoICsgIiciKTsKKyAgICBpZiAobmFtZSkgeworICAgICAgbmFt
ZSA9IG5hbWUucmVwbGFjZSgvXC8vZywgJy4nKTsKKyAgICAgIHRlbXBsYXRlTmFtZSA9IG5hbWU7
CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKKyAgICAgIHRlbXBs
YXRlTmFtZSA9IHRoaXMudGVtcGxhdGVOYW1lIHx8IG5hbWU7CiAgICAgfQotICB9LAogCi0gIGhh
bmRsZVVSTDogZnVuY3Rpb24odXJsKSB7Ci0gICAgdGhpcy5yb3V0ZXIuaGFuZGxlVVJMKHVybCk7
Ci0gICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgndXJsJyk7Ci0gIH0sCisgICAgdmFyIHZp
ZXdOYW1lID0gb3B0aW9ucy52aWV3IHx8IHRoaXMudmlld05hbWUgfHwgbmFtZTsKIAotICB0cmFu
c2l0aW9uVG86IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwo
YXJndW1lbnRzKTsKLSAgICBkb1RyYW5zaXRpb24odGhpcywgJ3RyYW5zaXRpb25UbycsIGFyZ3Mp
OwotICB9LAorICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKKyAgICAgICAgdmll
dyA9IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyArIHZpZXdOYW1lKSwKKyAgICAgICAgdGVtcGxh
dGUgPSB2aWV3ID8gdmlldy5nZXQoJ3RlbXBsYXRlJykgOiBudWxsOwogCi0gIHJlcGxhY2VXaXRo
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsK
LSAgICBkb1RyYW5zaXRpb24odGhpcywgJ3JlcGxhY2VXaXRoJywgYXJncyk7Ci0gIH0sCisgICAg
aWYgKCF0ZW1wbGF0ZSkgeworICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9va3VwKCd0ZW1w
bGF0ZTonICsgdGVtcGxhdGVOYW1lKTsKKyAgICB9CiAKLSAgZ2VuZXJhdGU6IGZ1bmN0aW9uKCkg
ewotICAgIHZhciB1cmwgPSB0aGlzLnJvdXRlci5nZW5lcmF0ZS5hcHBseSh0aGlzLnJvdXRlciwg
YXJndW1lbnRzKTsKLSAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5mb3JtYXRVUkwodXJsKTsKLSAg
fSwKKyAgICBpZiAoIXZpZXcgJiYgIXRlbXBsYXRlKSB7CisgICAgICBFbWJlci5hc3NlcnQoIkNv
dWxkIG5vdCBmaW5kIFwiIiArIG5hbWUgKyAiXCIgdGVtcGxhdGUgb3Igdmlldy4iLCAhbmFtZVBh
c3NlZCk7CisgICAgICBpZiAoZ2V0KHRoaXMucm91dGVyLCAnbmFtZXNwYWNlLkxPR19WSUVXX0xP
T0tVUFMnKSkgeworICAgICAgICBFbWJlci5Mb2dnZXIuaW5mbygiQ291bGQgbm90IGZpbmQgXCIi
ICsgbmFtZSArICJcIiB0ZW1wbGF0ZSBvciB2aWV3LiBOb3RoaW5nIHdpbGwgYmUgcmVuZGVyZWQi
LCB7IGZ1bGxOYW1lOiAndGVtcGxhdGU6JyArIG5hbWUgfSk7CisgICAgICB9CisgICAgICByZXR1
cm47CisgICAgfQogCi0gIGlzQWN0aXZlOiBmdW5jdGlvbihyb3V0ZU5hbWUpIHsKLSAgICB2YXIg
cm91dGVyID0gdGhpcy5yb3V0ZXI7Ci0gICAgcmV0dXJuIHJvdXRlci5pc0FjdGl2ZS5hcHBseShy
b3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCisgICAgb3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnMo
dGhpcywgbmFtZSwgdGVtcGxhdGUsIG9wdGlvbnMpOworICAgIHZpZXcgPSBzZXR1cFZpZXcodmll
dywgY29udGFpbmVyLCBvcHRpb25zKTsKIAotICBzZW5kOiBmdW5jdGlvbihuYW1lLCBjb250ZXh0
KSB7Ci0gICAgdGhpcy5yb3V0ZXIudHJpZ2dlci5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1lbnRz
KTsKLSAgfSwKKyAgICBpZiAob3B0aW9ucy5vdXRsZXQgPT09ICdtYWluJykgeyB0aGlzLmxhc3RS
ZW5kZXJlZFRlbXBsYXRlID0gbmFtZTsgfQogCi0gIGhhc1JvdXRlOiBmdW5jdGlvbihyb3V0ZSkg
ewotICAgIHJldHVybiB0aGlzLnJvdXRlci5oYXNSb3V0ZShyb3V0ZSk7CisgICAgYXBwZW5kVmll
dyh0aGlzLCB2aWV3LCBvcHRpb25zKTsKICAgfSwKIAotICBfbG9va3VwQWN0aXZlVmlldzogZnVu
Y3Rpb24odGVtcGxhdGVOYW1lKSB7Ci0gICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZVZpZXdz
W3RlbXBsYXRlTmFtZV07Ci0gICAgcmV0dXJuIGFjdGl2ZSAmJiBhY3RpdmVbMF07Ci0gIH0sCisg
IC8qKgorICAgIERpc2Nvbm5lY3RzIGEgdmlldyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGludG8g
YW4gb3V0bGV0LgogCi0gIF9jb25uZWN0QWN0aXZlVmlldzogZnVuY3Rpb24odGVtcGxhdGVOYW1l
LCB2aWV3KSB7Ci0gICAgdmFyIGV4aXN0aW5nID0gdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxhdGVO
YW1lXTsKKyAgICBZb3UgbWF5IHBhc3MgYW55IG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIG9wdGlv
bnMgdG8gYGRpc2Nvbm5lY3RPdXRsZXRgOgogCi0gICAgaWYgKGV4aXN0aW5nKSB7Ci0gICAgICBl
eGlzdGluZ1swXS5vZmYoJ3dpbGxEZXN0cm95RWxlbWVudCcsIHRoaXMsIGV4aXN0aW5nWzFdKTsK
LSAgICB9CisgICAgKiBgb3V0bGV0YDogdGhlIG5hbWUgb2YgdGhlIG91dGxldCB0byBjbGVhciAo
ZGVmYXVsdDogJ21haW4nKQorICAgICogYHBhcmVudFZpZXdgOiB0aGUgbmFtZSBvZiB0aGUgdmll
dyBjb250YWluaW5nIHRoZSBvdXRsZXQgdG8gY2xlYXIKKyAgICAgICAoZGVmYXVsdDogdGhlIHZp
ZXcgcmVuZGVyZWQgYnkgdGhlIHBhcmVudCByb3V0ZSkKIAotICAgIHZhciBkaXNjb25uZWN0ID0g
ZnVuY3Rpb24oKSB7Ci0gICAgICBkZWxldGUgdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxhdGVOYW1l
XTsKLSAgICB9OworICAgIEV4YW1wbGU6CiAKLSAgICB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0
ZU5hbWVdID0gW3ZpZXcsIGRpc2Nvbm5lY3RdOwotICAgIHZpZXcub25lKCd3aWxsRGVzdHJveUVs
ZW1lbnQnLCB0aGlzLCBkaXNjb25uZWN0KTsKLSAgfQotfSk7CisgICAgYGBganMKKyAgICBBcHAu
QXBwbGljYXRpb25Sb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoeworICAgICAgYWN0aW9uczogewor
ICAgICAgICBzaG93TW9kYWw6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgIHRoaXMucmVuZGVy
KGV2dC5tb2RhbE5hbWUsIHsKKyAgICAgICAgICAgIG91dGxldDogJ21vZGFsJywKKyAgICAgICAg
ICAgIGludG86ICdhcHBsaWNhdGlvbicKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAg
ICAgaGlkZU1vZGFsOiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RP
dXRsZXQoeworICAgICAgICAgICAgb3V0bGV0OiAnbW9kYWwnLAorICAgICAgICAgICAgcGFyZW50
VmlldzogJ2FwcGxpY2F0aW9uJworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9Cisg
ICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGRpc2Nvbm5lY3RPdXRsZXQKKyAgICBAcGFy
YW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucworICAqLworICBkaXNjb25uZWN0T3V0bGV0
OiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgICAg
b3B0aW9ucy5wYXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRWaWV3ID8gb3B0aW9ucy5wYXJlbnRW
aWV3LnJlcGxhY2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1wbGF0ZSh0aGlzKTsKKyAgICBvcHRp
b25zLm91dGxldCA9IG9wdGlvbnMub3V0bGV0IHx8ICdtYWluJzsKIAotRW1iZXIuUm91dGVyLnJl
b3BlbkNsYXNzKHsKLSAgZGVmYXVsdEZhaWx1cmVIYW5kbGVyOiB7Ci0gICAgc2V0dXA6IGZ1bmN0
aW9uKGVycm9yKSB7Ci0gICAgICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIGxvYWRp
bmcgcm91dGU6JywgZXJyb3IpOworICAgIHZhciBwYXJlbnRWaWV3ID0gdGhpcy5yb3V0ZXIuX2xv
b2t1cEFjdGl2ZVZpZXcob3B0aW9ucy5wYXJlbnRWaWV3KTsKKyAgICBwYXJlbnRWaWV3LmRpc2Nv
bm5lY3RPdXRsZXQob3B0aW9ucy5vdXRsZXQpOworICB9LAogCi0gICAgICAvLyBVc2luZyBzZXRU
aW1lb3V0IGFsbG93cyB1cyB0byBlc2NhcGUgZnJvbSB0aGUgUHJvbWlzZSdzIHRyeS9jYXRjaCBi
bG9jawotICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZXJyb3I7IH0pOwotICAg
IH0KLSAgfQotfSk7CisgIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnRlYXJk
b3duVmlld3MoKTsKKyAgfSwKIAotZnVuY3Rpb24gZ2V0SGFuZGxlckZ1bmN0aW9uKHJvdXRlcikg
ewotICB2YXIgc2VlbiA9IHt9LCBjb250YWluZXIgPSByb3V0ZXIuY29udGFpbmVyOworICAvKioK
KyAgICBAcHJpdmF0ZQogCi0gIHJldHVybiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgdmFyIGhhbmRs
ZXIgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSk7Ci0gICAgaWYgKHNlZW5bbmFt
ZV0pIHsgcmV0dXJuIGhhbmRsZXI7IH0KKyAgICBAbWV0aG9kIHRlYXJkb3duVmlld3MKKyAgKi8K
KyAgdGVhcmRvd25WaWV3czogZnVuY3Rpb24oKSB7CisgICAgLy8gVGVhciBkb3duIHRoZSB0b3Ag
bGV2ZWwgdmlldworICAgIGlmICh0aGlzLnRlYXJkb3duVG9wTGV2ZWxWaWV3KSB7IHRoaXMudGVh
cmRvd25Ub3BMZXZlbFZpZXcoKTsgfQogCi0gICAgc2VlbltuYW1lXSA9IHRydWU7CisgICAgLy8g
VGVhciBkb3duIGFueSBvdXRsZXRzIHJlbmRlcmVkIHdpdGggJ2ludG8nCisgICAgdmFyIHRlYXJk
b3duT3V0bGV0Vmlld3MgPSB0aGlzLnRlYXJkb3duT3V0bGV0Vmlld3MgfHwgW107CisgICAgYV9m
b3JFYWNoKHRlYXJkb3duT3V0bGV0Vmlld3MsIGZ1bmN0aW9uKHRlYXJkb3duT3V0bGV0Vmlldykg
eworICAgICAgdGVhcmRvd25PdXRsZXRWaWV3KCk7CisgICAgfSk7CiAKLSAgICBpZiAoIWhhbmRs
ZXIpIHsKLSAgICAgIGlmIChuYW1lID09PSAnbG9hZGluZycpIHsgcmV0dXJuIHt9OyB9Ci0gICAg
ICBpZiAobmFtZSA9PT0gJ2ZhaWx1cmUnKSB7IHJldHVybiByb3V0ZXIuY29uc3RydWN0b3IuZGVm
YXVsdEZhaWx1cmVIYW5kbGVyOyB9CisgICAgZGVsZXRlIHRoaXMudGVhcmRvd25Ub3BMZXZlbFZp
ZXc7CisgICAgZGVsZXRlIHRoaXMudGVhcmRvd25PdXRsZXRWaWV3czsKKyAgICBkZWxldGUgdGhp
cy5sYXN0UmVuZGVyZWRUZW1wbGF0ZTsKKyAgfQorfSk7CiAKLSAgICAgIGNvbnRhaW5lci5yZWdp
c3Rlcigncm91dGUnLCBuYW1lLCBFbWJlci5Sb3V0ZS5leHRlbmQoKSk7Ci0gICAgICBoYW5kbGVy
ID0gY29udGFpbmVyLmxvb2t1cCgncm91dGU6JyArIG5hbWUpOwotICAgIH0KK2Z1bmN0aW9uIHBh
cmVudFJvdXRlKHJvdXRlKSB7CisgIHZhciBoYW5kbGVySW5mb3MgPSByb3V0ZS5yb3V0ZXIucm91
dGVyLnRhcmdldEhhbmRsZXJJbmZvczsKIAotICAgIGhhbmRsZXIucm91dGVOYW1lID0gbmFtZTsK
LSAgICByZXR1cm4gaGFuZGxlcjsKLSAgfTsKLX0KKyAgaWYgKCFoYW5kbGVySW5mb3MpIHsgcmV0
dXJuOyB9CiAKLWZ1bmN0aW9uIGhhbmRsZXJJc0FjdGl2ZShyb3V0ZXIsIGhhbmRsZXJOYW1lKSB7
Ci0gIHZhciBoYW5kbGVyID0gcm91dGVyLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBoYW5k
bGVyTmFtZSksCi0gICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLnJvdXRlci5jdXJy
ZW50SGFuZGxlckluZm9zLAotICAgICAgaGFuZGxlckluZm87CisgIHZhciBwYXJlbnQsIGN1cnJl
bnQ7CiAKLSAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRIYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgIGhhbmRsZXJJbmZvID0gY3VycmVudEhhbmRsZXJJbmZvc1tpXTsKLSAgICBp
ZiAoaGFuZGxlckluZm8uaGFuZGxlciA9PT0gaGFuZGxlcikgeyByZXR1cm4gdHJ1ZTsgfQorICBm
b3IgKHZhciBpPTAsIGw9aGFuZGxlckluZm9zLmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBjdXJy
ZW50ID0gaGFuZGxlckluZm9zW2ldLmhhbmRsZXI7CisgICAgaWYgKGN1cnJlbnQgPT09IHJvdXRl
KSB7IHJldHVybiBwYXJlbnQ7IH0KKyAgICBwYXJlbnQgPSBjdXJyZW50OwogICB9Ci0KLSAgcmV0
dXJuIGZhbHNlOwogfQogCi1mdW5jdGlvbiByb3V0ZVBhdGgoaGFuZGxlckluZm9zKSB7Ci0gIHZh
ciBwYXRoID0gW107CitmdW5jdGlvbiBwYXJlbnRUZW1wbGF0ZShyb3V0ZSkgeworICB2YXIgcGFy
ZW50ID0gcGFyZW50Um91dGUocm91dGUpLCB0ZW1wbGF0ZTsKIAotICBmb3IgKHZhciBpPTEsIGw9
aGFuZGxlckluZm9zLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICB2YXIgbmFtZSA9IGhhbmRsZXJJ
bmZvc1tpXS5uYW1lLAotICAgICAgICBuYW1lUGFydHMgPSBuYW1lLnNwbGl0KCIuIik7CisgIGlm
ICghcGFyZW50KSB7IHJldHVybjsgfQogCi0gICAgcGF0aC5wdXNoKG5hbWVQYXJ0c1tuYW1lUGFy
dHMubGVuZ3RoIC0gMV0pOworICBpZiAodGVtcGxhdGUgPSBwYXJlbnQubGFzdFJlbmRlcmVkVGVt
cGxhdGUpIHsKKyAgICByZXR1cm4gdGVtcGxhdGU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBh
cmVudFRlbXBsYXRlKHBhcmVudCk7CiAgIH0KLQotICByZXR1cm4gcGF0aC5qb2luKCIuIik7CiB9
CiAKLWZ1bmN0aW9uIHNldHVwUm91dGVyKGVtYmVyUm91dGVyLCByb3V0ZXIsIGxvY2F0aW9uKSB7
Ci0gIHZhciBsYXN0VVJMOwotCi0gIHJvdXRlci5nZXRIYW5kbGVyID0gZ2V0SGFuZGxlckZ1bmN0
aW9uKGVtYmVyUm91dGVyKTsKLQotICB2YXIgZG9VcGRhdGVVUkwgPSBmdW5jdGlvbigpIHsKLSAg
ICBsb2NhdGlvbi5zZXRVUkwobGFzdFVSTCk7Ci0gIH07CitmdW5jdGlvbiBub3JtYWxpemVPcHRp
b25zKHJvdXRlLCBuYW1lLCB0ZW1wbGF0ZSwgb3B0aW9ucykgeworICBvcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKKyAgb3B0aW9ucy5pbnRvID0gb3B0aW9ucy5pbnRvID8gb3B0aW9ucy5pbnRvLnJl
cGxhY2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1wbGF0ZShyb3V0ZSk7CisgIG9wdGlvbnMub3V0
bGV0ID0gb3B0aW9ucy5vdXRsZXQgfHwgJ21haW4nOworICBvcHRpb25zLm5hbWUgPSBuYW1lOwor
ICBvcHRpb25zLnRlbXBsYXRlID0gdGVtcGxhdGU7CisgIG9wdGlvbnMuTE9HX1ZJRVdfTE9PS1VQ
UyA9IGdldChyb3V0ZS5yb3V0ZXIsICduYW1lc3BhY2UuTE9HX1ZJRVdfTE9PS1VQUycpOwogCi0g
IHJvdXRlci51cGRhdGVVUkwgPSBmdW5jdGlvbihwYXRoKSB7Ci0gICAgbGFzdFVSTCA9IHBhdGg7
Ci0gICAgRW1iZXIucnVuLm9uY2UoZG9VcGRhdGVVUkwpOwotICB9OworICBFbWJlci5hc3NlcnQo
IkFuIG91dGxldCAoIitvcHRpb25zLm91dGxldCsiKSB3YXMgc3BlY2lmaWVkIGJ1dCB3YXMgbm90
IGZvdW5kLiIsIG9wdGlvbnMub3V0bGV0ID09PSAnbWFpbicgfHwgb3B0aW9ucy5pbnRvKTsKIAot
ICBpZiAobG9jYXRpb24ucmVwbGFjZVVSTCkgewotICAgIHZhciBkb1JlcGxhY2VVUkwgPSBmdW5j
dGlvbigpIHsKLSAgICAgIGxvY2F0aW9uLnJlcGxhY2VVUkwobGFzdFVSTCk7Ci0gICAgfTsKKyAg
dmFyIGNvbnRyb2xsZXIgPSBvcHRpb25zLmNvbnRyb2xsZXIsIG5hbWVkQ29udHJvbGxlcjsKIAot
ICAgIHJvdXRlci5yZXBsYWNlVVJMID0gZnVuY3Rpb24ocGF0aCkgewotICAgICAgbGFzdFVSTCA9
IHBhdGg7Ci0gICAgICBFbWJlci5ydW4ub25jZShkb1JlcGxhY2VVUkwpOwotICAgIH07CisgIGlm
IChvcHRpb25zLmNvbnRyb2xsZXIpIHsKKyAgICBjb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9s
bGVyOworICB9IGVsc2UgaWYgKG5hbWVkQ29udHJvbGxlciA9IHJvdXRlLmNvbnRhaW5lci5sb29r
dXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpKSB7CisgICAgY29udHJvbGxlciA9IG5hbWVkQ29udHJv
bGxlcjsKKyAgfSBlbHNlIHsKKyAgICBjb250cm9sbGVyID0gcm91dGUuY29udHJvbGxlck5hbWUg
fHwgcm91dGUucm91dGVOYW1lOwogICB9CiAKLSAgcm91dGVyLmRpZFRyYW5zaXRpb24gPSBmdW5j
dGlvbihpbmZvcykgewotICAgIGVtYmVyUm91dGVyLmRpZFRyYW5zaXRpb24oaW5mb3MpOwotICB9
OwotfQotCi1mdW5jdGlvbiBkb1RyYW5zaXRpb24ocm91dGVyLCBtZXRob2QsIGFyZ3MpIHsKLSAg
dmFyIHBhc3NlZE5hbWUgPSBhcmdzWzBdLCBuYW1lOwotCi0gIGlmICghcm91dGVyLnJvdXRlci5o
YXNSb3V0ZShhcmdzWzBdKSkgewotICAgIG5hbWUgPSBhcmdzWzBdID0gcGFzc2VkTmFtZSArICcu
aW5kZXgnOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBwYXNzZWROYW1lOworICBpZiAodHlwZW9m
IGNvbnRyb2xsZXIgPT09ICdzdHJpbmcnKSB7CisgICAgY29udHJvbGxlciA9IHJvdXRlLmNvbnRh
aW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXIpOwogICB9CiAKLSAgRW1iZXIu
YXNzZXJ0KCJUaGUgcm91dGUgIiArIHBhc3NlZE5hbWUgKyAiIHdhcyBub3QgZm91bmQiLCByb3V0
ZXIucm91dGVyLmhhc1JvdXRlKG5hbWUpKTsKKyAgb3B0aW9ucy5jb250cm9sbGVyID0gY29udHJv
bGxlcjsKIAotICByb3V0ZXIucm91dGVyW21ldGhvZF0uYXBwbHkocm91dGVyLnJvdXRlciwgYXJn
cyk7Ci0gIHJvdXRlci5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgndXJsJyk7CisgIHJldHVybiBvcHRp
b25zOwogfQogCi1FbWJlci5Sb3V0ZXIucmVvcGVuQ2xhc3MoewotICBtYXA6IGZ1bmN0aW9uKGNh
bGxiYWNrKSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyID0gbmV3IFJvdXRlcigpOwot
Ci0gICAgdmFyIGRzbCA9IEVtYmVyLlJvdXRlckRTTC5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0
aGlzLnJlc291cmNlKCdhcHBsaWNhdGlvbicsIHsgcGF0aDogIi8iIH0sIGZ1bmN0aW9uKCkgewot
ICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBy
b3V0ZXIubWFwKGRzbC5nZW5lcmF0ZSgpKTsKLSAgICByZXR1cm4gcm91dGVyOworZnVuY3Rpb24g
c2V0dXBWaWV3KHZpZXcsIGNvbnRhaW5lciwgb3B0aW9ucykgeworICBpZiAodmlldykgeworICAg
IGlmIChvcHRpb25zLkxPR19WSUVXX0xPT0tVUFMpIHsKKyAgICAgIEVtYmVyLkxvZ2dlci5pbmZv
KCJSZW5kZXJpbmcgIiArIG9wdGlvbnMubmFtZSArICIgd2l0aCAiICsgdmlldywgeyBmdWxsTmFt
ZTogJ3ZpZXc6JyArIG9wdGlvbnMubmFtZSB9KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdmFy
IGRlZmF1bHRWaWV3ID0gb3B0aW9ucy5pbnRvID8gJ3ZpZXc6ZGVmYXVsdCcgOiAndmlldzp0b3Bs
ZXZlbCc7CisgICAgdmlldyA9IGNvbnRhaW5lci5sb29rdXAoZGVmYXVsdFZpZXcpOworICAgIGlm
IChvcHRpb25zLkxPR19WSUVXX0xPT0tVUFMpIHsKKyAgICAgIEVtYmVyLkxvZ2dlci5pbmZvKCJS
ZW5kZXJpbmcgIiArIG9wdGlvbnMubmFtZSArICIgd2l0aCBkZWZhdWx0IHZpZXcgIiArIHZpZXcs
IHsgZnVsbE5hbWU6ICd2aWV3OicgKyBvcHRpb25zLm5hbWUgfSk7CisgICAgfQogICB9Ci19KTsK
LQotfSkoKTsKLQotCiAKLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJl
ci5zZXQsCi0gICAgY2xhc3NpZnkgPSBFbWJlci5TdHJpbmcuY2xhc3NpZnksCi0gICAgZGVjYW1l
bGl6ZSA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplOwotCi0vKioKLSAgVGhlIGBFbWJlci5Sb3V0
ZWAgY2xhc3MgaXMgdXNlZCB0byBkZWZpbmUgaW5kaXZpZHVhbCByb3V0ZXMuIFJlZmVyIHRvCi0g
IHRoZSBbcm91dGluZyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy9yb3V0aW5nLykg
Zm9yIGRvY3VtZW50YXRpb24uCisgIGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0ZU5hbWUnKSkgewor
ICAgIHNldCh2aWV3LCAndGVtcGxhdGUnLCBvcHRpb25zLnRlbXBsYXRlKTsKIAotICBAY2xhc3Mg
Um91dGUKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1F
bWJlci5Sb3V0ZSA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAvKioKLSAgICBAcHJpdmF0ZQor
ICAgIHNldCh2aWV3LCAnX2RlYnVnVGVtcGxhdGVOYW1lJywgb3B0aW9ucy5uYW1lKTsKKyAgfQog
Ci0gICAgQG1ldGhvZCBleGl0Ci0gICovCi0gIGV4aXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMu
ZGVhY3RpdmF0ZSgpOwotICAgIHRlYXJkb3duVmlldyh0aGlzKTsKLSAgfSwKKyAgc2V0KHZpZXcs
ICdyZW5kZXJlZE5hbWUnLCBvcHRpb25zLm5hbWUpOworICBzZXQodmlldywgJ2NvbnRyb2xsZXIn
LCBvcHRpb25zLmNvbnRyb2xsZXIpOwogCi0gIC8qKgotICAgIEBwcml2YXRlCisgIHJldHVybiB2
aWV3OworfQogCi0gICAgQG1ldGhvZCBlbnRlcgotICAqLwotICBlbnRlcjogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5hY3RpdmF0ZSgpOwotICB9LAorZnVuY3Rpb24gYXBwZW5kVmlldyhyb3V0ZSwg
dmlldywgb3B0aW9ucykgeworICBpZiAob3B0aW9ucy5pbnRvKSB7CisgICAgdmFyIHBhcmVudFZp
ZXcgPSByb3V0ZS5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcob3B0aW9ucy5pbnRvKTsKKyAgICB2
YXIgdGVhcmRvd25PdXRsZXRWaWV3ID0gZ2VuZXJhdGVPdXRsZXRUZWFyZG93bihwYXJlbnRWaWV3
LCBvcHRpb25zLm91dGxldCk7CisgICAgaWYgKCFyb3V0ZS50ZWFyZG93bk91dGxldFZpZXdzKSB7
IHJvdXRlLnRlYXJkb3duT3V0bGV0Vmlld3MgPSBbXTsgfQorICAgIGFfcmVwbGFjZShyb3V0ZS50
ZWFyZG93bk91dGxldFZpZXdzLCAwLCAwLCBbdGVhcmRvd25PdXRsZXRWaWV3XSk7CisgICAgcGFy
ZW50Vmlldy5jb25uZWN0T3V0bGV0KG9wdGlvbnMub3V0bGV0LCB2aWV3KTsKKyAgfSBlbHNlIHsK
KyAgICB2YXIgcm9vdEVsZW1lbnQgPSBnZXQocm91dGUsICdyb3V0ZXIubmFtZXNwYWNlLnJvb3RF
bGVtZW50Jyk7CisgICAgLy8gdGVhciBkb3duIHZpZXcgaWYgb25lIGlzIGFscmVhZHkgcmVuZGVy
ZWQKKyAgICBpZiAocm91dGUudGVhcmRvd25Ub3BMZXZlbFZpZXcpIHsKKyAgICAgIHJvdXRlLnRl
YXJkb3duVG9wTGV2ZWxWaWV3KCk7CisgICAgfQorICAgIHJvdXRlLnJvdXRlci5fY29ubmVjdEFj
dGl2ZVZpZXcob3B0aW9ucy5uYW1lLCB2aWV3KTsKKyAgICByb3V0ZS50ZWFyZG93blRvcExldmVs
VmlldyA9IGdlbmVyYXRlVG9wTGV2ZWxUZWFyZG93bih2aWV3KTsKKyAgICB2aWV3LmFwcGVuZFRv
KHJvb3RFbGVtZW50KTsKKyAgfQorfQogCi0gIC8qKgotICAgIFRoZSBjb2xsZWN0aW9uIG9mIGZ1
bmN0aW9ucyBrZXllZCBieSBuYW1lIGF2YWlsYWJsZSBvbiB0aGlzIHJvdXRlIGFzCi0gICAgYWN0
aW9uIHRhcmdldHMuCitmdW5jdGlvbiBnZW5lcmF0ZVRvcExldmVsVGVhcmRvd24odmlldykgewor
ICByZXR1cm4gZnVuY3Rpb24oKSB7IHZpZXcuZGVzdHJveSgpOyB9OworfQogCi0gICAgVGhlc2Ug
ZnVuY3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlz
IHRyaWdnZXJlZAotICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlv
bidzIGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KK2Z1bmN0aW9uIGdlbmVyYXRlT3V0bGV0
VGVhcmRvd24ocGFyZW50Vmlldywgb3V0bGV0KSB7CisgIHJldHVybiBmdW5jdGlvbigpIHsgcGFy
ZW50Vmlldy5kaXNjb25uZWN0T3V0bGV0KG91dGxldCk7IH07Cit9CiAKLSAgICBFdmVudHMgY2Fu
IGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdmlh
IGBSb3V0ZSNzZW5kYC4KK30pKCk7CiAKLSAgICBUaGUgY29udGV4dCBvZiBldmVudCB3aWxsIGJl
IHRoZSB0aGlzIHJvdXRlLgogCi0gICAgQHNlZSB7RW1iZXIuUm91dGUjc2VuZH0KLSAgICBAc2Vl
IHtIYW5kbGViYXJzLmhlbHBlcnMuYWN0aW9ufQogCi0gICAgQHByb3BlcnR5IGV2ZW50cwotICAg
IEB0eXBlIEhhc2gKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGV2ZW50czogbnVsbCwKKyhm
dW5jdGlvbigpIHsKIAotICAvKioKLSAgICBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQgd2hlbiB0aGUg
cm91dGVyIGNvbXBsZXRlbHkgZXhpdHMgdGhpcyByb3V0ZS4gSXQgaXMKLSAgICBub3QgZXhlY3V0
ZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgorfSkoKTsKIAotICAgIEBt
ZXRob2QgZGVhY3RpdmF0ZQotICAqLwotICBkZWFjdGl2YXRlOiBFbWJlci5LLAogCi0gIC8qKgot
ICAgIFRoaXMgaG9vayBpcyBleGVjdXRlZCB3aGVuIHRoZSByb3V0ZXIgZW50ZXJzIHRoZSByb3V0
ZSBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgSXQgaXMgbm90IGV4ZWN1dGVkIHdoZW4gdGhlIG1v
ZGVsIGZvciB0aGUgcm91dGUgY2hhbmdlcy4KIAotICAgIEBtZXRob2QgYWN0aXZhdGUKLSAgKi8K
LSAgYWN0aXZhdGU6IEVtYmVyLkssCisoZnVuY3Rpb24oKSB7CitFbWJlci5vbkxvYWQoJ0VtYmVy
LkhhbmRsZWJhcnMnLCBmdW5jdGlvbigpIHsKKyAgdmFyIGhhbmRsZWJhcnNSZXNvbHZlID0gRW1i
ZXIuSGFuZGxlYmFycy5yZXNvbHZlUGFyYW1zLAorICAgICAgbWFwID0gRW1iZXIuQXJyYXlQb2x5
ZmlsbHMubWFwLAorICAgICAgZ2V0ID0gRW1iZXIuZ2V0LAorICAgICAgaGFuZGxlYmFyc0dldCA9
IEVtYmVyLkhhbmRsZWJhcnMuZ2V0OwogCi0gIC8qKgotICAgIFRyYW5zaXRpb24gaW50byBhbm90
aGVyIHJvdXRlLiBPcHRpb25hbGx5IHN1cHBseSBhIG1vZGVsIGZvciB0aGUKLSAgICByb3V0ZSBp
biBxdWVzdGlvbi4gVGhlIG1vZGVsIHdpbGwgYmUgc2VyaWFsaXplZCBpbnRvIHRoZSBVUkwKLSAg
ICB1c2luZyB0aGUgYHNlcmlhbGl6ZWAgaG9vay4KKyAgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtcyhj
b250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gbWFwLmNhbGwocmVzb2x2ZVBh
dGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucyksIGZ1bmN0aW9uKHBhdGgsIGkpIHsKKyAgICAg
IGlmIChudWxsID09PSBwYXRoKSB7CisgICAgICAgIC8vIFBhcmFtIHdhcyBzdHJpbmcvbnVtYmVy
LCBub3QgYSBwYXRoLCBzbyBqdXN0IHJldHVybiByYXcgc3RyaW5nL251bWJlci4KKyAgICAgICAg
cmV0dXJuIHBhcmFtc1tpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBoYW5kbGVi
YXJzR2V0KGNvbnRleHQsIHBhdGgsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0pOworICB9CiAK
LSAgICBAbWV0aG9kIHRyYW5zaXRpb25UbwotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBu
YW1lIG9mIHRoZSByb3V0ZQotICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlCi0gICov
Ci0gIHRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX2NoZWNraW5nUmVk
aXJlY3QpIHsgdGhpcy5yZWRpcmVjdGVkID0gdHJ1ZTsgfQotICAgIHJldHVybiB0aGlzLnJvdXRl
ci50cmFuc2l0aW9uVG8uYXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCisgIGZ1
bmN0aW9uIHJlc29sdmVQYXRocyhjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKKyAgICB2YXIg
cmVzb2x2ZWQgPSBoYW5kbGViYXJzUmVzb2x2ZShjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpLAor
ICAgICAgICB0eXBlcyA9IG9wdGlvbnMudHlwZXM7CiAKLSAgLyoqCi0gICAgVHJhbnNpdGlvbiBp
bnRvIGFub3RoZXIgcm91dGUgd2hpbGUgcmVwbGFjaW5nIHRoZSBjdXJyZW50IFVSTCBpZgotICAg
IHBvc3NpYmxlLiBJZGVudGljYWwgdG8gYHRyYW5zaXRpb25Ub2AgaW4gYWxsIG90aGVyIHJlc3Bl
Y3RzLgorICAgIHJldHVybiBtYXAuY2FsbChyZXNvbHZlZCwgZnVuY3Rpb24ob2JqZWN0LCBpKSB7
CisgICAgICBpZiAodHlwZXNbaV0gPT09ICdJRCcpIHsKKyAgICAgICAgcmV0dXJuIHVud3JhcChv
YmplY3QsIHBhcmFtc1tpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgIH0KKyAgICB9KTsKIAotICAgIEBtZXRob2QgcmVwbGFjZVdpdGgKLSAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVj
dH0gbW9kZWxzIHRoZQotICAqLwotICByZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7Ci0gICAgaWYg
KHRoaXMuX2NoZWNraW5nUmVkaXJlY3QpIHsgdGhpcy5yZWRpcmVjdGVkID0gdHJ1ZTsgfQotICAg
IHJldHVybiB0aGlzLnJvdXRlci5yZXBsYWNlV2l0aC5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1l
bnRzKTsKLSAgfSwKKyAgICBmdW5jdGlvbiB1bndyYXAob2JqZWN0LCBwYXRoKSB7CisgICAgICBp
ZiAocGF0aCA9PT0gJ2NvbnRyb2xsZXInKSB7IHJldHVybiBwYXRoOyB9CiAKLSAgc2VuZDogZnVu
Y3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMucm91dGVyLnNlbmQuYXBwbHkodGhpcy5yb3V0ZXIs
IGFyZ3VtZW50cyk7Ci0gIH0sCisgICAgICBpZiAoRW1iZXIuQ29udHJvbGxlck1peGluLmRldGVj
dChvYmplY3QpKSB7CisgICAgICAgIHJldHVybiB1bndyYXAoZ2V0KG9iamVjdCwgJ21vZGVsJyks
IHBhdGggPyBwYXRoICsgJy5tb2RlbCcgOiAnbW9kZWwnKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJldHVybiBwYXRoOworICAgICAgfQorICAgIH0KKyAgfQogCi0gIC8qKgotICAgIEBwcml2
YXRlCisgIEVtYmVyLlJvdXRlci5yZXNvbHZlUGFyYW1zID0gcmVzb2x2ZVBhcmFtczsKKyAgRW1i
ZXIuUm91dGVyLnJlc29sdmVQYXRocyA9IHJlc29sdmVQYXRoczsKK30pOwogCi0gICAgVGhpcyBo
b29rIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igcm91dGVyLmpzCit9KSgpOwogCi0gICAgQG1ldGhv
ZCBzZXR1cAotICAqLwotICBzZXR1cDogZnVuY3Rpb24oY29udGV4dCkgewotICAgIHRoaXMucmVk
aXJlY3RlZCA9IGZhbHNlOwotICAgIHRoaXMuX2NoZWNraW5nUmVkaXJlY3QgPSB0cnVlOwogCi0g
ICAgdGhpcy5yZWRpcmVjdChjb250ZXh0KTsKIAotICAgIHRoaXMuX2NoZWNraW5nUmVkaXJlY3Qg
PSBmYWxzZTsKLSAgICBpZiAodGhpcy5yZWRpcmVjdGVkKSB7IHJldHVybiBmYWxzZTsgfQorKGZ1
bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcK
KyovCiAKLSAgICB2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlckZvcih0aGlzLnJvdXRl
TmFtZSwgY29udGV4dCk7Cit2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZt
dCA9IEVtYmVyLlN0cmluZy5mbXQ7CitFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBm
dW5jdGlvbihIYW5kbGViYXJzKSB7CiAKLSAgICBpZiAoY29udHJvbGxlcikgewotICAgICAgdGhp
cy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgICAgIHNldChjb250cm9sbGVyLCAnbW9kZWwn
LCBjb250ZXh0KTsKLSAgICB9CisgIHZhciByZXNvbHZlUGFyYW1zID0gRW1iZXIuUm91dGVyLnJl
c29sdmVQYXJhbXMsCisgICAgICByZXNvbHZlUGF0aHMgID0gRW1iZXIuUm91dGVyLnJlc29sdmVQ
YXRocywKKyAgICAgIGlzU2ltcGxlQ2xpY2sgPSBFbWJlci5WaWV3VXRpbHMuaXNTaW1wbGVDbGlj
azsKIAotICAgIGlmICh0aGlzLnNldHVwQ29udHJvbGxlcnMpIHsKLSAgICAgIEVtYmVyLmRlcHJl
Y2F0ZSgiRW1iZXIuUm91dGUuc2V0dXBDb250cm9sbGVycyBpcyBkZXByZWNhdGVkLiBQbGVhc2Ug
dXNlIEVtYmVyLlJvdXRlLnNldHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBtb2RlbCkgaW5zdGVh
ZC4iKTsKLSAgICAgIHRoaXMuc2V0dXBDb250cm9sbGVycyhjb250cm9sbGVyLCBjb250ZXh0KTsK
LSAgICB9IGVsc2UgewotICAgICAgdGhpcy5zZXR1cENvbnRyb2xsZXIoY29udHJvbGxlciwgY29u
dGV4dCk7CisgIGZ1bmN0aW9uIGZ1bGxSb3V0ZU5hbWUocm91dGVyLCBuYW1lKSB7CisgICAgdmFy
IG5hbWVXaXRoSW5kZXg7CisgICAgaWYgKCFyb3V0ZXIuaGFzUm91dGUobmFtZSkpIHsKKyAgICAg
IG5hbWVXaXRoSW5kZXggPSBuYW1lICsgJy5pbmRleCc7CisgICAgICBFbWJlci5hc3NlcnQoZm10
KCJUaGUgYXR0ZW1wdCB0byBsaW5rLXRvIHJvdXRlICclQCcgZmFpbGVkIChhbHNvIHRyaWVkICcl
QCcpLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByb3V0ZXIgZGlkIG5vdCBmaW5k
ICclQCcgaW4gaXRzIHBvc3NpYmxlIHJvdXRlczogJyVAJyIsCisgICAgICAgICAgICAgICAgICAg
ICAgIFtuYW1lLCBuYW1lV2l0aEluZGV4LCBuYW1lLCBFbWJlci5rZXlzKHJvdXRlci5yb3V0ZXIu
cmVjb2duaXplci5uYW1lcykuam9pbigiJywgJyIpXSksCisgICAgICAgICAgICAgICAgICAgICAg
IHJvdXRlci5oYXNSb3V0ZShuYW1lV2l0aEluZGV4KSk7CisgICAgICBuYW1lID0gbmFtZVdpdGhJ
bmRleDsKICAgICB9CiAKLSAgICBpZiAodGhpcy5yZW5kZXJUZW1wbGF0ZXMpIHsKLSAgICAgIEVt
YmVyLmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUucmVuZGVyVGVtcGxhdGVzIGlzIGRlcHJlY2F0ZWQu
IFBsZWFzZSB1c2UgRW1iZXIuUm91dGUucmVuZGVyVGVtcGxhdGUoY29udHJvbGxlciwgbW9kZWwp
IGluc3RlYWQuIik7Ci0gICAgICB0aGlzLnJlbmRlclRlbXBsYXRlcyhjb250ZXh0KTsKLSAgICB9
IGVsc2UgewotICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0ZShjb250cm9sbGVyLCBjb250ZXh0KTsK
LSAgICB9Ci0gIH0sCisgICAgcmV0dXJuIG5hbWU7CisgIH0KIAotICAvKioKLSAgICBBIGhvb2sg
eW91IGNhbiBpbXBsZW1lbnQgdG8gb3B0aW9uYWxseSByZWRpcmVjdCB0byBhbm90aGVyIHJvdXRl
LgorICBmdW5jdGlvbiBnZXRSZXNvbHZlZFBhdGhzKG9wdGlvbnMpIHsKIAotICAgIElmIHlvdSBj
YWxsIGB0aGlzLnRyYW5zaXRpb25Ub2AgZnJvbSBpbnNpZGUgb2YgdGhpcyBob29rLCB0aGlzIHJv
dXRlCi0gICAgd2lsbCBub3QgYmUgZW50ZXJlZCBpbiBmYXZvciBvZiB0aGUgb3RoZXIgaG9vay4K
KyAgICB2YXIgdHlwZXMgPSBvcHRpb25zLm9wdGlvbnMudHlwZXMsCisgICAgICAgIGRhdGEgPSBv
cHRpb25zLm9wdGlvbnMuZGF0YTsKIAotICAgIEBtZXRob2QgcmVkaXJlY3QKLSAgICBAcGFyYW0g
e09iamVjdH0gbW9kZWwgdGhlIG1vZGVsIGZvciB0aGlzIHJvdXRlCi0gICovCi0gIHJlZGlyZWN0
OiBFbWJlci5LLAorICAgIHJldHVybiByZXNvbHZlUGF0aHMob3B0aW9ucy5jb250ZXh0LCBvcHRp
b25zLnBhcmFtcywgeyB0eXBlczogdHlwZXMsIGRhdGE6IGRhdGEgfSk7CisgIH0KIAogICAvKioK
LSAgICBAcHJpdmF0ZQorICAgIGBFbWJlci5MaW5rVmlld2AgcmVuZGVycyBhbiBlbGVtZW50IHdo
b3NlIGBjbGlja2AgZXZlbnQgdHJpZ2dlcnMgYQorICAgIHRyYW5zaXRpb24gb2YgdGhlIGFwcGxp
Y2F0aW9uJ3MgaW5zdGFuY2Ugb2YgYEVtYmVyLlJvdXRlcmAgdG8KKyAgICBhIHN1cHBsaWVkIHJv
dXRlIGJ5IG5hbWUuCiAKLSAgICBUaGUgaG9vayBjYWxsZWQgYnkgYHJvdXRlci5qc2AgdG8gY29u
dmVydCBwYXJhbWV0ZXJzIGludG8gdGhlIGNvbnRleHQKLSAgICBmb3IgdGhpcyBoYW5kbGVyLiBU
aGUgcHVibGljIEVtYmVyIGhvb2sgaXMgYG1vZGVsYC4KKyAgICBJbnN0YW5jZXMgb2YgYExpbmtW
aWV3YCB3aWxsIG1vc3QgbGlrZWx5IGJlIGNyZWF0ZWQgdGhyb3VnaAorICAgIHRoZSBgbGluay10
b2AgSGFuZGxlYmFycyBoZWxwZXIsIGJ1dCBwcm9wZXJ0aWVzIG9mIHRoaXMgY2xhc3MKKyAgICBj
YW4gYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemUgYXBwbGljYXRpb24td2lkZSBiZWhhdmlvci4K
IAotICAgIEBtZXRob2QgZGVzZXJpYWxpemUKLSAgKi8KLSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9u
KHBhcmFtcykgewotICAgIHZhciBtb2RlbCA9IHRoaXMubW9kZWwocGFyYW1zKTsKLSAgICByZXR1
cm4gdGhpcy5jdXJyZW50TW9kZWwgPSBtb2RlbDsKLSAgfSwKKyAgICBAY2xhc3MgTGlua1ZpZXcK
KyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuVmlldworICAgIEBzZWUg
e0hhbmRsZWJhcnMuaGVscGVycy5saW5rLXRvfQorICAqKi8KKyAgdmFyIExpbmtWaWV3ID0gRW1i
ZXIuTGlua1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgdGFnTmFtZTogJ2EnLAorICAg
IGN1cnJlbnRXaGVuOiBudWxsLAogCi0gIC8qKgotICAgIEBwcml2YXRlCisgICAgLyoqCisgICAg
ICBTZXRzIHRoZSBgdGl0bGVgIGF0dHJpYnV0ZSBvZiB0aGUgYExpbmtWaWV3YCdzIEhUTUwgZWxl
bWVudC4KIAotICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNoYW5nZWQgYnkgcm91dGVy
LmpzLgotICAqLwotICBjb250ZXh0RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmN1
cnJlbnRNb2RlbCA9IHRoaXMuY29udGV4dDsKLSAgfSwKKyAgICAgIEBwcm9wZXJ0eSB0aXRsZQor
ICAgICAgQGRlZmF1bHQgbnVsbAorICAgICoqLworICAgIHRpdGxlOiBudWxsLAogCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBjb252ZXJ0IHRoZSBVUkwgaW50byB0aGUg
bW9kZWwgZm9yCi0gICAgdGhpcyByb3V0ZS4KKyAgICAvKioKKyAgICAgIFNldHMgdGhlIGByZWxg
IGF0dHJpYnV0ZSBvZiB0aGUgYExpbmtWaWV3YCdzIEhUTUwgZWxlbWVudC4KIAotICAgIGBgYGpz
Ci0gICAgQXBwLlJvdXRlLm1hcChmdW5jdGlvbihtYXRjaCkgewotICAgICAgbWF0Y2goIi9wb3N0
cy86cG9zdF9pZCIpLnRvKCJwb3N0Iik7Ci0gICAgfSk7Ci0gICAgYGBgCisgICAgICBAcHJvcGVy
dHkgcmVsCisgICAgICBAZGVmYXVsdCBudWxsCisgICAgKiovCisgICAgcmVsOiBudWxsLAogCi0g
ICAgVGhlIG1vZGVsIGZvciB0aGUgYHBvc3RgIHJvdXRlIGlzIGBBcHAuUG9zdC5maW5kKHBhcmFt
cy5wb3N0X2lkKWAuCisgICAgLyoqCisgICAgICBUaGUgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIGBM
aW5rVmlld2AncyBlbGVtZW50IHdoZW4gaXRzIGBhY3RpdmVgCisgICAgICBwcm9wZXJ0eSBpcyBg
dHJ1ZWAuCiAKLSAgICBCeSBkZWZhdWx0LCBpZiB5b3VyIHJvdXRlIGhhcyBhIGR5bmFtaWMgc2Vn
bWVudCBlbmRpbmcgaW4gYF9pZGA6CisgICAgICBAcHJvcGVydHkgYWN0aXZlQ2xhc3MKKyAgICAg
IEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgYWN0aXZlCisgICAgKiovCisgICAgYWN0aXZl
Q2xhc3M6ICdhY3RpdmUnLAogCi0gICAgKiBUaGUgbW9kZWwgY2xhc3MgaXMgZGV0ZXJtaW5lZCBm
cm9tIHRoZSBzZWdtZW50IChgcG9zdF9pZGAncwotICAgICAgY2xhc3MgaXMgYEFwcC5Qb3N0YCkK
LSAgICAqIFRoZSBmaW5kIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVsIGNsYXNzIHdpdGgg
dGhlIHZhbHVlIG9mCi0gICAgICB0aGUgZHluYW1pYyBzZWdtZW50LgorICAgIC8qKgorICAgICAg
VGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVuIGl0cyBg
bG9hZGluZ2AKKyAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KIAotICAgIEBtZXRob2QgbW9kZWwK
LSAgICBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHRoZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9t
IHRoZSBVUkwKLSAgKi8KLSAgbW9kZWw6IGZ1bmN0aW9uKHBhcmFtcykgewotICAgIHZhciBtYXRj
aCwgbmFtZSwgc2F3UGFyYW1zLCB2YWx1ZTsKKyAgICAgIEBwcm9wZXJ0eSBsb2FkaW5nQ2xhc3MK
KyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgbG9hZGluZworICAgICoqLworICAg
IGxvYWRpbmdDbGFzczogJ2xvYWRpbmcnLAogCi0gICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbXMp
IHsKLSAgICAgIGlmIChtYXRjaCA9IHByb3AubWF0Y2goL14oLiopX2lkJC8pKSB7Ci0gICAgICAg
IG5hbWUgPSBtYXRjaFsxXTsKLSAgICAgICAgdmFsdWUgPSBwYXJhbXNbcHJvcF07Ci0gICAgICB9
Ci0gICAgICBzYXdQYXJhbXMgPSB0cnVlOwotICAgIH0KKyAgICAvKioKKyAgICAgIFRoZSBDU1Mg
Y2xhc3MgdG8gYXBwbHkgdG8gYSBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVuIGl0cyBgZGlzYWJs
ZWRgCisgICAgICBwcm9wZXJ0eSBpcyBgdHJ1ZWAuCiAKLSAgICBpZiAoIW5hbWUgJiYgc2F3UGFy
YW1zKSB7IHJldHVybiBwYXJhbXM7IH0KLSAgICBlbHNlIGlmICghbmFtZSkgeyByZXR1cm47IH0K
KyAgICAgIEBwcm9wZXJ0eSBkaXNhYmxlZENsYXNzCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAg
IEBkZWZhdWx0IGRpc2FibGVkCisgICAgKiovCisgICAgZGlzYWJsZWRDbGFzczogJ2Rpc2FibGVk
JywKKyAgICBfaXNEaXNhYmxlZDogZmFsc2UsCiAKLSAgICB2YXIgY2xhc3NOYW1lID0gY2xhc3Np
ZnkobmFtZSksCi0gICAgICAgIG5hbWVzcGFjZSA9IHRoaXMucm91dGVyLm5hbWVzcGFjZSwKLSAg
ICAgICAgbW9kZWxDbGFzcyA9IG5hbWVzcGFjZVtjbGFzc05hbWVdOworICAgIC8qKgorICAgICAg
RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBgTGlua1ZpZXdgIHdpbGwgdHJpZ2dlciByb3V0aW5nIHZp
YQorICAgICAgdGhlIGByZXBsYWNlV2l0aGAgcm91dGluZyBzdHJhdGVneS4KIAotICAgIEVtYmVy
LmFzc2VydCgiWW91IHVzZWQgdGhlIGR5bmFtaWMgc2VnbWVudCAiICsgbmFtZSArICJfaWQgaW4g
eW91ciByb3V0ZXIsIGJ1dCAiICsgbmFtZXNwYWNlICsgIi4iICsgY2xhc3NOYW1lICsgIiBkaWQg
bm90IGV4aXN0IGFuZCB5b3UgZGlkIG5vdCBvdmVycmlkZSB5b3VyIHN0YXRlJ3MgYG1vZGVsYCBo
b29rLiIsIG1vZGVsQ2xhc3MpOwotICAgIHJldHVybiBtb2RlbENsYXNzLmZpbmQodmFsdWUpOwot
ICB9LAorICAgICAgQHByb3BlcnR5IHJlcGxhY2UKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAgICAg
IEBkZWZhdWx0IGZhbHNlCisgICAgKiovCisgICAgcmVwbGFjZTogZmFsc2UsCiAKLSAgLyoqCi0g
ICAgQSBob29rIHlvdSBjYW4gaW1wbGVtZW50IHRvIGNvbnZlcnQgdGhlIHJvdXRlJ3MgbW9kZWwg
aW50byBwYXJhbWV0ZXJzCi0gICAgZm9yIHRoZSBVUkwuCisgICAgLyoqCisgICAgICBCeSBkZWZh
dWx0IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciB3aWxsIGJpbmQgdG8gdGhlIGBocmVmYCBhbmQK
KyAgICAgIGB0aXRsZWAgYXR0cmlidXRlcy4gSXQncyBkaXNjb3VyYWdlIHRoYXQgeW91IG92ZXJy
aWRlIHRoZXNlIGRlZmF1bHRzLAorICAgICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0aGUg
YXJyYXkgaWYgbmVlZGVkLgogCi0gICAgYGBganMKLSAgICBBcHAuUm91dGUubWFwKGZ1bmN0aW9u
KG1hdGNoKSB7Ci0gICAgICBtYXRjaCgiL3Bvc3RzLzpwb3N0X2lkIikudG8oInBvc3QiKTsKLSAg
ICB9KTsKKyAgICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVCaW5kaW5ncworICAgICAgQHR5cGUgQXJy
YXkgfCBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IFsnaHJlZicsICd0aXRsZScsICdyZWwnXQorICAg
ICAqKi8KKyAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydocmVmJywgJ3RpdGxlJywgJ3JlbCddLAog
Ci0gICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBtb2RlbDog
ZnVuY3Rpb24ocGFyYW1zKSB7Ci0gICAgICAgIC8vIHRoZSBzZXJ2ZXIgcmV0dXJucyBgeyBpZDog
MTIgfWAKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5nZXRKU09OKCIvcG9zdHMvIiArIHBhcmFtcy5w
b3N0X2lkKTsKLSAgICAgIH0sCisgICAgLyoqCisgICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5r
LXRvfX1gIGhlbHBlciB3aWxsIGJpbmQgdG8gdGhlIGBhY3RpdmVgLCBgbG9hZGluZ2AsIGFuZAor
ICAgICAgYGRpc2FibGVkYCBjbGFzc2VzLiBJdCBpcyBkaXNjb3VyYWdlZCB0byBvdmVycmlkZSB0
aGVzZSBkaXJlY3RseS4KIAotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2RlbCkgewotICAg
ICAgICAvLyB0aGlzIHdpbGwgbWFrZSB0aGUgVVJMIGAvcG9zdHMvMTJgCi0gICAgICAgIHJldHVy
biB7IHBvc3RfaWQ6IG1vZGVsLmlkIH07Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCisgICAg
ICBAcHJvcGVydHkgY2xhc3NOYW1lQmluZGluZ3MKKyAgICAgIEB0eXBlIEFycmF5CisgICAgICBA
ZGVmYXVsdCBbJ2FjdGl2ZScsICdsb2FkaW5nJywgJ2Rpc2FibGVkJ10KKyAgICAgKiovCisgICAg
Y2xhc3NOYW1lQmluZGluZ3M6IFsnYWN0aXZlJywgJ2xvYWRpbmcnLCAnZGlzYWJsZWQnXSwKIAot
ICAgIFRoZSBkZWZhdWx0IGBzZXJpYWxpemVgIG1ldGhvZCBpbnNlcnRzIHRoZSBtb2RlbCdzIGBp
ZGAgaW50byB0aGUKLSAgICByb3V0ZSdzIGR5bmFtaWMgc2VnbWVudCAoaW4gdGhpcyBjYXNlLCBg
OnBvc3RfaWRgKS4KKyAgICAvKioKKyAgICAgIEJ5IGRlZmF1bHQgdGhlIGB7e2xpbmstdG99fWAg
aGVscGVyIHJlc3BvbmRzIHRvIHRoZSBgY2xpY2tgIGV2ZW50LiBZb3UKKyAgICAgIGNhbiBvdmVy
cmlkZSB0aGlzIGdsb2JhbGx5IGJ5IHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byB5b3VyIGN1c3Rv
bQorICAgICAgZXZlbnQgbmFtZS4KIAotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGB0
cmFuc2l0aW9uVG9gIGlzIGNhbGxlZCB3aXRoIGEgY29udGV4dAotICAgIGluIG9yZGVyIHRvIHBv
cHVsYXRlIHRoZSBVUkwuCisgICAgICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgb24gbW9i
aWxlIHdoZW4gb25lIHdhbnRzIHRvIGF2b2lkIHRoZSAzMDBtcworICAgICAgY2xpY2sgZGVsYXkg
dXNpbmcgc29tZSBzb3J0IG9mIGN1c3RvbSBgdGFwYCBldmVudC4KIAotICAgIEBtZXRob2Qgc2Vy
aWFsaXplCi0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCi0gICAg
QHBhcmFtIHtBcnJheX0gcGFyYW1zIGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhl
IGN1cnJlbnQKLSAgICAgIHJvdXRlIChpbiB0aGUgZXhhbXBsZSwgYFsncG9zdF9pZCddYC4KLSAg
ICBAcmV0dXJuIHtPYmplY3R9IHRoZSBzZXJpYWxpemVkIHBhcmFtZXRlcnMKLSAgKi8KLSAgc2Vy
aWFsaXplOiBmdW5jdGlvbihtb2RlbCwgcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmFtcy5sZW5ndGgg
IT09IDEpIHsgcmV0dXJuOyB9CisgICAgICBAcHJvcGVydHkgZXZlbnROYW1lCisgICAgICBAdHlw
ZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IGNsaWNrCisgICAgKi8KKyAgICBldmVudE5hbWU6ICdj
bGljaycsCiAKLSAgICB2YXIgbmFtZSA9IHBhcmFtc1swXSwgb2JqZWN0ID0ge307CisgICAgLy8g
dGhpcyBpcyBkb2MnZWQgaGVyZSBzbyBpdCBzaG93cyB1cCBpbiB0aGUgZXZlbnRzCisgICAgLy8g
c2VjdGlvbiBvZiB0aGUgQVBJIGRvY3VtZW50YXRpb24sIHdoaWNoIGlzIHdoZXJlCisgICAgLy8g
cGVvcGxlIHdpbGwgbGlrZWx5IGdvIGxvb2tpbmcgZm9yIGl0LgorICAgIC8qKgorICAgICAgVHJp
Z2dlcnMgdGhlIGBMaW5rVmlld2AncyByb3V0aW5nIGJlaGF2aW9yLiBJZgorICAgICAgYGV2ZW50
TmFtZWAgaXMgY2hhbmdlZCB0byBhIHZhbHVlIG90aGVyIHRoYW4gYGNsaWNrYAorICAgICAgdGhl
IHJvdXRpbmcgYmVoYXZpb3Igd2lsbCB0cmlnZ2VyIG9uIHRoYXQgY3VzdG9tIGV2ZW50CisgICAg
ICBpbnN0ZWFkLgogCi0gICAgaWYgKC9faWQkLy50ZXN0KG5hbWUpKSB7Ci0gICAgICBvYmplY3Rb
bmFtZV0gPSBnZXQobW9kZWwsICdpZCcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvYmplY3RbbmFt
ZV0gPSBtb2RlbDsKLSAgICB9CisgICAgICBAZXZlbnQgY2xpY2sKKyAgICAqKi8KIAotICAgIHJl
dHVybiBvYmplY3Q7Ci0gIH0sCisgICAgLyoqCisgICAgICBBbiBvdmVycmlkYWJsZSBtZXRob2Qg
Y2FsbGVkIHdoZW4gTGlua1ZpZXcgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLgogCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBzZXR1cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1
cnJlbnQgcm91dGUuCisgICAgICBFeGFtcGxlOgogCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVk
IHdpdGggdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBjdXJyZW50IHJvdXRlIGFuZCB0aGUKLSAgICBt
b2RlbCBzdXBwbGllZCBieSB0aGUgYG1vZGVsYCBob29rLgorICAgICAgYGBgamF2YXNjcmlwdAor
ICAgICAgQXBwLk15TGlua1ZpZXcgPSBFbWJlci5MaW5rVmlldy5leHRlbmQoeworICAgICAgICBp
bml0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aGlzLl9zdXBlcigpOworICAgICAgICAgIEVt
YmVyLkxvZ2dlci5sb2coJ0V2ZW50IGlzICcgKyB0aGlzLmdldCgnZXZlbnROYW1lJykpOworICAg
ICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAogCi0gICAgYGBganMKLSAgICBBcHAuUm91dGUu
bWFwKGZ1bmN0aW9uKG1hdGNoKSB7Ci0gICAgICBtYXRjaCgiL3Bvc3RzLzpwb3N0X2lkIikudG8o
InBvc3QiKTsKLSAgICB9KTsKLSAgICBgYGAKKyAgICAgIE5PVEU6IElmIHlvdSBkbyBvdmVycmlk
ZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVtYmVyLlZpZXdgIG9yCisgICAg
ICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwgYmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlcigp
YCBpbiB5b3VyCisgICAgICBgaW5pdGAgZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIg
bWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvCisgICAgICBkbyBpbXBvcnRhbnQgc2V0dXAg
d29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCisgICAgICBhcHBs
aWNhdGlvbi4KIAotICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCB0aGUgY29udHJvbGxlciBpcyBg
QXBwLlBvc3RDb250cm9sbGVyYC4KKyAgICAgIEBtZXRob2QgaW5pdAorICAgICovCisgICAgaW5p
dDogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp
OwogCi0gICAgQnkgZGVmYXVsdCwgdGhlIGBzZXR1cENvbnRyb2xsZXJgIGhvb2sgc2V0cyB0aGUg
YGNvbnRlbnRgIHByb3BlcnR5IG9mCi0gICAgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGBtb2RlbGAu
CisgICAgICAvLyBNYXAgZGVzaXJlZCBldmVudCBuYW1lIHRvIGludm9rZSBmdW5jdGlvbgorICAg
ICAgdmFyIGV2ZW50TmFtZSA9IGdldCh0aGlzLCAnZXZlbnROYW1lJyksIGk7CisgICAgICB0aGlz
Lm9uKGV2ZW50TmFtZSwgdGhpcywgdGhpcy5faW52b2tlKTsKIAotICAgIElmIG5vIGV4cGxpY2l0
IGNvbnRyb2xsZXIgaXMgZGVmaW5lZCwgdGhlIHJvdXRlIHdpbGwgYXV0b21hdGljYWxseSBjcmVh
dGUKLSAgICBhbiBhcHByb3ByaWF0ZSBjb250cm9sbGVyIGZvciB0aGUgbW9kZWw6CisgICAgICAg
ICAgfSwKIAotICAgICogaWYgdGhlIG1vZGVsIGlzIGFuIGBFbWJlci5BcnJheWAgKGluY2x1ZGlu
ZyByZWNvcmQgYXJyYXlzIGZyb20gRW1iZXIKLSAgICAgIERhdGEpLCB0aGUgY29udHJvbGxlciBp
cyBhbiBgRW1iZXIuQXJyYXlDb250cm9sbGVyYC4KLSAgICAqIG90aGVyd2lzZSwgdGhlIGNvbnRy
b2xsZXIgaXMgYW4gYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgLgorICAgIC8qKgorICAgICAgVGhp
cyBtZXRob2QgaXMgaW52b2tlZCBieSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmluZyBgaW5pdGAg
dGhhdCBmaXJlCisgICAgICB3aGVuZXZlciB0aGUgcGFyYW1zIGNoYW5nZQogCi0gICAgVGhpcyBt
ZWFucyB0aGF0IHlvdXIgdGVtcGxhdGUgd2lsbCBnZXQgYSBwcm94eSBmb3IgdGhlIG1vZGVsIGFz
IGl0cwotICAgIGNvbnRleHQsIGFuZCB5b3UgY2FuIGFjdCBhcyB0aG91Z2ggdGhlIG1vZGVsIGl0
c2VsZiB3YXMgdGhlIGNvbnRleHQuCisgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBfcGFy
YW1zQ2hhbmdlZAorICAgICAqLworICAgIF9wYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbigpIHsKKyAg
ICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3Jlc29sdmVkUGFyYW1zJyk7CisgICAgfSwK
IAotICAgIEBtZXRob2Qgc2V0dXBDb250cm9sbGVyCi0gICovCi0gIHNldHVwQ29udHJvbGxlcjog
RW1iZXIuSywKKyAgICAvKioKKyAgICAgVGhpcyBpcyBjYWxsZWQgdG8gc2V0dXAgb2JzZXJ2ZXJz
IHRoYXQgd2lsbCB0cmlnZ2VyIGEgcmVyZW5kZXIuCisKKyAgICAgQHByaXZhdGUKKyAgICAgQG1l
dGhvZCBfc2V0dXBQYXRoT2JzZXJ2ZXJzCisgICAgKiovCisgICAgX3NldHVwUGF0aE9ic2VydmVy
czogZnVuY3Rpb24oKXsKKyAgICAgIHZhciBoZWxwZXJQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0
ZXJzLAorICAgICAgICAgIGxpbmtUZXh0UGF0aCAgICAgPSBoZWxwZXJQYXJhbWV0ZXJzLm9wdGlv
bnMubGlua1RleHRQYXRoLAorICAgICAgICAgIHBhdGhzID0gZ2V0UmVzb2x2ZWRQYXRocyhoZWxw
ZXJQYXJhbWV0ZXJzKSwKKyAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsCisgICAgICAg
ICAgcGF0aCwgaSwgbm9ybWFsaXplZFBhdGg7CisKKyAgICAgIGlmIChsaW5rVGV4dFBhdGgpIHsK
KyAgICAgICAgbm9ybWFsaXplZFBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgo
aGVscGVyUGFyYW1ldGVycy5jb250ZXh0LCBsaW5rVGV4dFBhdGgsIGhlbHBlclBhcmFtZXRlcnMu
b3B0aW9ucy5kYXRhKTsKKyAgICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6ZWRQ
YXRoLnJvb3QsIG5vcm1hbGl6ZWRQYXRoLnBhdGgsIHRoaXMsIHRoaXMucmVyZW5kZXIpOworICAg
ICAgfQogCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxh
ciByb3V0ZS4KKyAgICAgIGZvcihpPTA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBwYXRo
ID0gcGF0aHNbaV07CisgICAgICAgIGlmIChudWxsID09PSBwYXRoKSB7CisgICAgICAgICAgLy8g
QSBsaXRlcmFsIHZhbHVlIHdhcyBwcm92aWRlZCwgbm90IGEgcGF0aCwgc28gbm90aGluZyB0byBv
YnNlcnZlLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICBgYGBqcwotICAg
IEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgc2V0dXBDb250cm9s
bGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7Ci0gICAgICAgIHRoaXMuX3N1cGVyKGNv
bnRyb2xsZXIsIHBvc3QpOwotICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ3Bvc3RzJykuc2V0
KCdjdXJyZW50UG9zdCcsIHBvc3QpOworICAgICAgICBub3JtYWxpemVkUGF0aCA9IEVtYmVyLkhh
bmRsZWJhcnMubm9ybWFsaXplUGF0aChoZWxwZXJQYXJhbWV0ZXJzLmNvbnRleHQsIHBhdGgsIGhl
bHBlclBhcmFtZXRlcnMub3B0aW9ucy5kYXRhKTsKKyAgICAgICAgdGhpcy5yZWdpc3Rlck9ic2Vy
dmVyKG5vcm1hbGl6ZWRQYXRoLnJvb3QsIG5vcm1hbGl6ZWRQYXRoLnBhdGgsIHRoaXMsIHRoaXMu
X3BhcmFtc0NoYW5nZWQpOwogICAgICAgfQotICAgIH0pOwotICAgIGBgYAorICAgIH0sCiAKLSAg
ICBCeSBkZWZhdWx0LCB0aGUgY29udHJvbGxlciBmb3IgYHBvc3RgIGlzIHRoZSBzaGFyZWQgaW5z
dGFuY2Ugb2YKLSAgICBgQXBwLlBvc3RDb250cm9sbGVyYC4KKyAgICBhZnRlclJlbmRlcjogZnVu
Y3Rpb24oKXsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAg
ICB0aGlzLl9zZXR1cFBhdGhPYnNlcnZlcnMoKTsKKyAgICB9LAogCi0gICAgQG1ldGhvZCBjb250
cm9sbGVyRm9yCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRl
Ci0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhl
IHJvdXRlIChvcHRpb25hbCkKLSAgICBAcmV0dXJuIHtFbWJlci5Db250cm9sbGVyfQotICAqLwot
ICBjb250cm9sbGVyRm9yOiBmdW5jdGlvbihuYW1lLCBtb2RlbCkgewotICAgIHZhciBjb250YWlu
ZXIgPSB0aGlzLnJvdXRlci5jb250YWluZXIsCi0gICAgICAgIGNvbnRyb2xsZXIgPSBjb250YWlu
ZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBuYW1lKTsKKyAgICAvKioKKyAgICAgIFRoaXMgbWV0
aG9kIGlzIGludm9rZWQgYnkgb2JzZXJ2ZXJzIGluc3RhbGxlZCBkdXJpbmcgYGluaXRgIHRoYXQg
ZmlyZQorICAgICAgd2hlbmV2ZXIgdGhlIHF1ZXJ5IHBhcmFtcyBjaGFuZ2UKKyAgICAgIEBwcml2
YXRlCisgICAgICovCisgICAgX3F1ZXJ5UGFyYW1zQ2hhbmdlZDogZnVuY3Rpb24gKG9iamVjdCwg
cGF0aCkgeworICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgncXVlcnlQYXJhbXMnKTsK
KyAgICB9LAogCi0gICAgaWYgKCFjb250cm9sbGVyKSB7Ci0gICAgICBtb2RlbCA9IG1vZGVsIHx8
IHRoaXMubW9kZWxGb3IobmFtZSk7CiAKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IGFyZSB0cnlp
bmcgdG8gbG9vayB1cCBhIGNvbnRyb2xsZXIgdGhhdCB5b3UgZGlkIG5vdCBkZWZpbmUsIGFuZCBm
b3Igd2hpY2ggRW1iZXIgZG9lcyBub3Qga25vdyB0aGUgbW9kZWwuXG5cblRoaXMgaXMgbm90IGEg
Y29udHJvbGxlciBmb3IgYSByb3V0ZSwgc28geW91IG11c3QgZXhwbGljaXRseSBkZWZpbmUgdGhl
IGNvbnRyb2xsZXIgKCIrdGhpcy5yb3V0ZXIubmFtZXNwYWNlLnRvU3RyaW5nKCkgKyAiLiIgKyBF
bWJlci5TdHJpbmcuY2FwaXRhbGl6ZShFbWJlci5TdHJpbmcuY2FtZWxpemUobmFtZSkpKyJDb250
cm9sbGVyKSBvciBwYXNzIGEgbW9kZWwgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGNvbnRy
b2xsZXJGb3JgLCBzbyB0aGF0IEVtYmVyIGtub3dzIHdoaWNoIHR5cGUgb2YgY29udHJvbGxlciB0
byBjcmVhdGUgZm9yIHlvdS4iLCBtb2RlbCB8fCB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRl
OicgKyBuYW1lKSk7CisgICAgLyoqCisgICAgICBFdmVuIHRob3VnaCB0aGlzIGlzbid0IGEgdmly
dHVhbCB2aWV3LCB3ZSB3YW50IHRvIHRyZWF0IGl0IGFzIGlmIGl0IGlzCisgICAgICBzbyB0aGF0
IHlvdSBjYW4gYWNjZXNzIHRoZSBwYXJlbnQgd2l0aCB7e3ZpZXcucHJvcH19CiAKLSAgICAgIGNv
bnRyb2xsZXIgPSBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIoY29udGFpbmVyLCBuYW1lLCBtb2Rl
bCk7Ci0gICAgfQorICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgY29uY3JldGVWaWV3Cisg
ICAgKiovCisgICAgY29uY3JldGVWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKKyAgICB9KS5wcm9wZXJ0eSgncGFy
ZW50VmlldycpLAogCi0gICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gIH0sCisgICAgLyoqCiAKLSAg
LyoqCi0gICAgUmV0dXJucyB0aGUgY3VycmVudCBtb2RlbCBmb3IgYSBnaXZlbiByb3V0ZS4KKyAg
ICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJpbmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rVmll
d2AncyBgZGlzYWJsZWRDbGFzc2AKKyAgICAgIENTUyBgY2xhc3NgIHRvIHRoZSBlbGVtZW50IHdo
ZW4gdGhlIGxpbmsgaXMgZGlzYWJsZWQuCiAKLSAgICBUaGlzIGlzIHRoZSBvYmplY3QgcmV0dXJu
ZWQgYnkgdGhlIGBtb2RlbGAgaG9vayBvZiB0aGUgcm91dGUKLSAgICBpbiBxdWVzdGlvbi4KKyAg
ICAgIFdoZW4gYHRydWVgIGludGVyYWN0aW9ucyB3aXRoIHRoZSBlbGVtZW50IHdpbGwgbm90IHRy
aWdnZXIgcm91dGUgY2hhbmdlcy4KKyAgICAgIEBwcm9wZXJ0eSBkaXNhYmxlZAorICAgICovCisg
ICAgZGlzYWJsZWQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld0Rpc2Fi
bGVkKGtleSwgdmFsdWUpIHsKKyAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7IHRoaXMu
c2V0KCdfaXNEaXNhYmxlZCcsIHZhbHVlKTsgfQogCi0gICAgQG1ldGhvZCBtb2RlbEZvcgotICAg
IEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQotICAgIEByZXR1cm4g
e09iamVjdH0gdGhlIG1vZGVsIG9iamVjdAotICAqLwotICBtb2RlbEZvcjogZnVuY3Rpb24obmFt
ZSkgewotICAgIHZhciByb3V0ZSA9IHRoaXMuY29udGFpbmVyLmxvb2t1cCgncm91dGU6JyArIG5h
bWUpOwotICAgIHJldHVybiByb3V0ZSAmJiByb3V0ZS5jdXJyZW50TW9kZWw7Ci0gIH0sCisgICAg
ICByZXR1cm4gdmFsdWUgPyBnZXQodGhpcywgJ2Rpc2FibGVkQ2xhc3MnKSA6IGZhbHNlOworICAg
IH0pLAogCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byByZW5kZXIgdGhlIHRlbXBs
YXRlIGZvciB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAvKioKKyAgICAgIEFjY2Vzc2VkIGFzIGEg
Y2xhc3NuYW1lIGJpbmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rVmlld2AncyBgYWN0aXZlQ2xhc3Ng
CisgICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVuIHRoZSBsaW5rIGlzIGFjdGl2
ZS4KKworICAgICAgQSBgTGlua1ZpZXdgIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4gaXRzIGBj
dXJyZW50V2hlbmAgcHJvcGVydHkgaXMgYHRydWVgCisgICAgICBvciB0aGUgYXBwbGljYXRpb24n
cyBjdXJyZW50IHJvdXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtWaWV3YCB3b3VsZCB0cmlnZ2Vy
CisgICAgICB0cmFuc2l0aW9ucyBpbnRvLgorCisgICAgICBAcHJvcGVydHkgYWN0aXZlCisgICAg
KiovCisgICAgYWN0aXZlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiBjb21wdXRlTGlua1ZpZXdB
Y3RpdmUoKSB7CisgICAgICBpZiAoZ2V0KHRoaXMsICdsb2FkaW5nJykpIHsgcmV0dXJuIGZhbHNl
OyB9CisKKyAgICAgIHZhciByb3V0ZXIgPSBnZXQodGhpcywgJ3JvdXRlcicpLAorICAgICAgICAg
IHJvdXRlQXJncyA9IGdldCh0aGlzLCAncm91dGVBcmdzJyksCisgICAgICAgICAgY29udGV4dHMg
PSByb3V0ZUFyZ3Muc2xpY2UoMSksCisgICAgICAgICAgcmVzb2x2ZWRQYXJhbXMgPSBnZXQodGhp
cywgJ3Jlc29sdmVkUGFyYW1zJyksCisgICAgICAgICAgY3VycmVudFdoZW4gPSB0aGlzLmN1cnJl
bnRXaGVuIHx8IHJlc29sdmVkUGFyYW1zWzBdLAorICAgICAgICAgIGN1cnJlbnRXaXRoSW5kZXgg
PSBjdXJyZW50V2hlbiArICcuaW5kZXgnLAorICAgICAgICAgIGlzQWN0aXZlID0gcm91dGVyLmlz
QWN0aXZlLmFwcGx5KHJvdXRlciwgW2N1cnJlbnRXaGVuXS5jb25jYXQoY29udGV4dHMpKSB8fAor
ICAgICAgICAgICAgICAgICAgICAgcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwgW2N1cnJl
bnRXaXRoSW5kZXhdLmNvbmNhdChjb250ZXh0cykpOwogCi0gICAgVGhpcyBtZXRob2QgaXMgY2Fs
bGVkIHdpdGggdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBjdXJyZW50IHJvdXRlIGFuZCB0aGUKLSAg
ICBtb2RlbCBzdXBwbGllZCBieSB0aGUgYG1vZGVsYCBob29rLiBCeSBkZWZhdWx0LCBpdCByZW5k
ZXJzIHRoZSByb3V0ZSdzCi0gICAgdGVtcGxhdGUsIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY29udHJv
bGxlciBmb3IgdGhlIHJvdXRlLgorICAgICAgaWYgKGlzQWN0aXZlKSB7IHJldHVybiBnZXQodGhp
cywgJ2FjdGl2ZUNsYXNzJyk7IH0KKyAgICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJhbXMnLCAn
cm91dGVBcmdzJywgJ3JvdXRlci51cmwnKSwKIAotICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVy
cmlkZGVuIHRvIHNldCB1cCBhbmQgcmVuZGVyIGFkZGl0aW9uYWwgb3IKLSAgICBhbHRlcm5hdGl2
ZSB0ZW1wbGF0ZXMuCisgICAgLyoqCisgICAgICBBY2Nlc3NlZCBhcyBhIGNsYXNzbmFtZSBiaW5k
aW5nIHRvIGFwcGx5IHRoZSBgTGlua1ZpZXdgJ3MgYGxvYWRpbmdDbGFzc2AKKyAgICAgIENTUyBg
Y2xhc3NgIHRvIHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgbG9hZGluZy4KIAotICAgIEBt
ZXRob2QgcmVuZGVyVGVtcGxhdGUKLSAgICBAcGFyYW0ge09iamVjdH0gY29udHJvbGxlciB0aGUg
cm91dGUncyBjb250cm9sbGVyCi0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdz
IG1vZGVsCi0gICovCi0gIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2Rl
bCkgewotICAgIHRoaXMucmVuZGVyKCk7Ci0gIH0sCisgICAgICBBIGBMaW5rVmlld2AgaXMgY29u
c2lkZXJlZCBsb2FkaW5nIHdoZW4gaXQgaGFzIGF0IGxlYXN0IG9uZQorICAgICAgcGFyYW1ldGVy
IHdob3NlIHZhbHVlIGlzIGN1cnJlbnRseSBudWxsIG9yIHVuZGVmaW5lZC4gRHVyaW5nCisgICAg
ICB0aGlzIHRpbWUsIGNsaWNraW5nIHRoZSBsaW5rIHdpbGwgcGVyZm9ybSBubyB0cmFuc2l0aW9u
IGFuZAorICAgICAgZW1pdCBhIHdhcm5pbmcgdGhhdCB0aGUgbGluayBpcyBzdGlsbCBpbiBhIGxv
YWRpbmcgc3RhdGUuCiAKLSAgLyoqCi0gICAgUmVuZGVycyBhIHRlbXBsYXRlIGludG8gYW4gb3V0
bGV0LgorICAgICAgQHByb3BlcnR5IGxvYWRpbmcKKyAgICAqKi8KKyAgICBsb2FkaW5nOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbiBjb21wdXRlTGlua1ZpZXdMb2FkaW5nKCkgeworICAgICAgaWYg
KCFnZXQodGhpcywgJ3JvdXRlQXJncycpKSB7IHJldHVybiBnZXQodGhpcywgJ2xvYWRpbmdDbGFz
cycpOyB9CisgICAgfSkucHJvcGVydHkoJ3JvdXRlQXJncycpLAogCi0gICAgVGhpcyBtZXRob2Qg
aGFzIGEgbnVtYmVyIG9mIGRlZmF1bHRzLCBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUKLSAgICBy
b3V0ZSBzcGVjaWZpZWQgaW4gdGhlIHJvdXRlci4KKyAgICAvKioKKyAgICAgIFJldHVybnMgdGhl
IGFwcGxpY2F0aW9uJ3MgbWFpbiByb3V0ZXIgZnJvbSB0aGUgY29udGFpbmVyLgogCi0gICAgRm9y
IGV4YW1wbGU6CisgICAgICBAcHJpdmF0ZQorICAgICAgQHByb3BlcnR5IHJvdXRlcgorICAgICoq
LworICAgIHJvdXRlcjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4g
Z2V0KHRoaXMsICdjb250cm9sbGVyJykuY29udGFpbmVyLmxvb2t1cCgncm91dGVyOm1haW4nKTsK
KyAgICB9KSwKIAotICAgIGBgYGpzCi0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24obWF0Y2gp
IHsKLSAgICAgIG1hdGNoKCIvIikudG8oImluZGV4Iik7Ci0gICAgICBtYXRjaCgiL3Bvc3RzLzpw
b3N0X2lkIikudG8oInBvc3QiKTsKLSAgICB9KTsKKyAgICAvKioKKyAgICAgIEV2ZW50IGhhbmRs
ZXIgdGhhdCBpbnZva2VzIHRoZSBsaW5rLCBhY3RpdmF0aW5nIHRoZSBhc3NvY2lhdGVkIHJvdXRl
LgogCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVuZGVy
VGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlbmRlcigpOworICAgICAgQHBy
aXZhdGUKKyAgICAgIEBtZXRob2QgX2ludm9rZQorICAgICAgQHBhcmFtIHtFdmVudH0gZXZlbnQK
KyAgICAqLworICAgIF9pbnZva2U6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBpZiAoIWlzU2lt
cGxlQ2xpY2soZXZlbnQpKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgIGlmICh0aGlzLnByZXZl
bnREZWZhdWx0ICE9PSBmYWxzZSkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9CisgICAgICBp
ZiAodGhpcy5idWJibGVzID09PSBmYWxzZSkgeyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfQor
CisgICAgICBpZiAoZ2V0KHRoaXMsICdfaXNEaXNhYmxlZCcpKSB7IHJldHVybiBmYWxzZTsgfQor
CisgICAgICBpZiAoZ2V0KHRoaXMsICdsb2FkaW5nJykpIHsKKyAgICAgICAgRW1iZXIuTG9nZ2Vy
Lndhcm4oIlRoaXMgbGluay10byBpcyBpbiBhbiBpbmFjdGl2ZSBsb2FkaW5nIHN0YXRlIGJlY2F1
c2UgYXQgbGVhc3Qgb25lIG9mIGl0cyBwYXJhbWV0ZXJzIHByZXNlbnRseSBoYXMgYSBudWxsL3Vu
ZGVmaW5lZCB2YWx1ZSwgb3IgdGhlIHByb3ZpZGVkIHJvdXRlIG5hbWUgaXMgaW52YWxpZC4iKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgIH0pOwotICAgIGBgYAogCi0gICAg
VGhlIG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBhcyBkZWZpbmVkIGJ5IHRoZSByb3V0ZXIsIGlz
IGBwb3N0YC4KKyAgICAgIHZhciByb3V0ZXIgPSBnZXQodGhpcywgJ3JvdXRlcicpLAorICAgICAg
ICAgIHJvdXRlQXJncyA9IGdldCh0aGlzLCAncm91dGVBcmdzJyk7CiAKLSAgICBCeSBkZWZhdWx0
LCByZW5kZXIgd2lsbDoKKyAgICAgIGlmIChnZXQodGhpcywgJ3JlcGxhY2UnKSkgeworICAgICAg
ICByb3V0ZXIucmVwbGFjZVdpdGguYXBwbHkocm91dGVyLCByb3V0ZUFyZ3MpOworICAgICAgfSBl
bHNlIHsKKyAgICAgICAgcm91dGVyLnRyYW5zaXRpb25Uby5hcHBseShyb3V0ZXIsIHJvdXRlQXJn
cyk7CisgICAgICB9CisgICAgfSwKIAotICAgICogcmVuZGVyIHRoZSBgcG9zdGAgdGVtcGxhdGUK
LSAgICAqIHdpdGggdGhlIGBwb3N0YCB2aWV3IChgUG9zdFZpZXdgKSBmb3IgZXZlbnQgaGFuZGxp
bmcsIGlmIG9uZSBleGlzdHMKLSAgICAqIGFuZCB0aGUgYHBvc3RgIGNvbnRyb2xsZXIgKGBQb3N0
Q29udHJvbGxlcmApLCBpZiBvbmUgZXhpc3RzCi0gICAgKiBpbnRvIHRoZSBgbWFpbmAgb3V0bGV0
IG9mIHRoZSBgYXBwbGljYXRpb25gIHRlbXBsYXRlCisgICAgLyoqCisgICAgICBDb21wdXRlZCBw
cm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHJlc29sdmVkIHBhcmFtZXRlcnMuCiAKLSAgICBZb3Ug
Y2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3I6CisgICAgICBAcHJpdmF0ZQorICAgICAgQHByb3Bl
cnR5CisgICAgICBAcmV0dXJuIHtBcnJheX0KKyAgICAgKi8KKyAgICByZXNvbHZlZFBhcmFtczog
RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgICB2YXIgcGFyYW1ldGVycyA9IHRoaXMu
cGFyYW1ldGVycywKKyAgICAgICAgICBvcHRpb25zID0gcGFyYW1ldGVycy5vcHRpb25zLAorICAg
ICAgICAgIHR5cGVzID0gb3B0aW9ucy50eXBlcywKKyAgICAgICAgICBkYXRhID0gb3B0aW9ucy5k
YXRhOworCisgICAgICAKKyAgICAgIC8vIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGlmIHF1ZXJ5
IHBhcmFtcyBub3QgZW5hYmxlZAorICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbXMocGFyYW1ldGVy
cy5jb250ZXh0LCBwYXJhbWV0ZXJzLnBhcmFtcywgeyB0eXBlczogdHlwZXMsIGRhdGE6IGRhdGEg
fSk7CisgICAgfSkucHJvcGVydHkoKSwKIAotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RSb3V0ZSA9
IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewot
ICAgICAgICB0aGlzLnJlbmRlcignbXlQb3N0JywgeyAgIC8vIHRoZSB0ZW1wbGF0ZSB0byByZW5k
ZXIKLSAgICAgICAgICBpbnRvOiAnaW5kZXgnLCAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgdG8g
cmVuZGVyIGludG8KLSAgICAgICAgICBvdXRsZXQ6ICdkZXRhaWwnLCAgICAgICAvLyB0aGUgbmFt
ZSBvZiB0aGUgb3V0bGV0IGluIHRoYXQgdGVtcGxhdGUKLSAgICAgICAgICBjb250cm9sbGVyOiAn
YmxvZ1Bvc3QnICAvLyB0aGUgY29udHJvbGxlciB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0ZQotICAg
ICAgICB9KTsKKyAgICAvKioKKyAgICAgIENvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0
aGUgY3VycmVudCByb3V0ZSBuYW1lIGFuZAorICAgICAgYW55IGR5bmFtaWMgc2VnbWVudHMuCisK
KyAgICAgIEBwcml2YXRlCisgICAgICBAcHJvcGVydHkKKyAgICAgIEByZXR1cm4ge0FycmF5fSBB
biBhcnJheSB3aXRoIHRoZSByb3V0ZSBuYW1lIGFuZCBhbnkgZHluYW1pYyBzZWdtZW50cworICAg
ICAqLworICAgIHJvdXRlQXJnczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gY29tcHV0ZUxpbmtW
aWV3Um91dGVBcmdzKCkgeworICAgICAgdmFyIHJlc29sdmVkUGFyYW1zID0gZ2V0KHRoaXMsICdy
ZXNvbHZlZFBhcmFtcycpLnNsaWNlKDApLAorICAgICAgICAgIHJvdXRlciA9IGdldCh0aGlzLCAn
cm91dGVyJyksCisgICAgICAgICAgbmFtZWRSb3V0ZSA9IHJlc29sdmVkUGFyYW1zWzBdOworCisg
ICAgICBpZiAoIW5hbWVkUm91dGUpIHsgcmV0dXJuOyB9CisKKyAgICAgIG5hbWVkUm91dGUgPSBm
dWxsUm91dGVOYW1lKHJvdXRlciwgbmFtZWRSb3V0ZSk7CisgICAgICByZXNvbHZlZFBhcmFtc1sw
XSA9IG5hbWVkUm91dGU7CisKKyAgICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSByZXNvbHZlZFBh
cmFtcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgICB2YXIgcGFyYW0gPSByZXNvbHZl
ZFBhcmFtc1tpXTsKKyAgICAgICAgaWYgKHBhcmFtID09PSBudWxsIHx8IHR5cGVvZiBwYXJhbSA9
PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAvLyBJZiBjb250ZXh0cyBhcmVuJ3QgcHJlc2Vu
dCwgY29uc2lkZXIgdGhlIGxpbmtWaWV3IHVubG9hZGVkLgorICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQogICAgICAgfQotICAgIH0pOwotICAgIGBgYAogCi0gICAgUmVtZW1iZXIgdGhhdCB0
aGUgY29udHJvbGxlcidzIGBjb250ZW50YCB3aWxsIGJlIHRoZSByb3V0ZSdzIG1vZGVsLiBJbgot
ICAgIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgbW9kZWwgd2lsbCBiZSBgQXBwLlBvc3QuZmluZChw
YXJhbXMucG9zdF9pZClgLgorICAgICAgCisgICAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbXM7Cisg
ICAgfSkucHJvcGVydHkoJ3Jlc29sdmVkUGFyYW1zJywgJ3F1ZXJ5UGFyYW1zJywgJ3JvdXRlci51
cmwnKSwKIAotICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhl
IG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIHJlbmRlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRp
b25zIHRoZSBvcHRpb25zCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24obmFtZSwgb3B0aW9ucykg
ewotICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcgJiYgIW9wdGlvbnMpIHsKLSAgICAg
IG9wdGlvbnMgPSBuYW1lOwotICAgICAgbmFtZSA9IHRoaXMucm91dGVOYW1lOwotICAgIH0KIAot
ICAgIG5hbWUgPSBuYW1lID8gbmFtZS5yZXBsYWNlKC9cLy9nLCAnLicpIDogdGhpcy5yb3V0ZU5h
bWU7CisgICAgX3BvdGVudGlhbFF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAo
KSB7CisgICAgICB2YXIgbmFtZWRSb3V0ZSA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJhbXMnKVsw
XTsKKyAgICAgIGlmICghbmFtZWRSb3V0ZSkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgdmFyIHJv
dXRlciAgICAgICAgICA9IGdldCh0aGlzLCAncm91dGVyJyk7CiAKLSAgICB2YXIgY29udGFpbmVy
ID0gdGhpcy5jb250YWluZXIsCi0gICAgICAgIHZpZXcgPSBjb250YWluZXIubG9va3VwKCd2aWV3
OicgKyBuYW1lKSwKLSAgICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9va3VwKCd0ZW1wbGF0
ZTonICsgbmFtZSk7CisgICAgICBuYW1lZFJvdXRlID0gZnVsbFJvdXRlTmFtZShyb3V0ZXIsIG5h
bWVkUm91dGUpOwogCi0gICAgaWYgKCF2aWV3ICYmICF0ZW1wbGF0ZSkgeyByZXR1cm47IH0KKyAg
ICAgIHJldHVybiByb3V0ZXIucm91dGVyLnF1ZXJ5UGFyYW1zRm9ySGFuZGxlcihuYW1lZFJvdXRl
KTsKKyAgICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJhbXMnKSwKIAotICAgIG9wdGlvbnMgPSBu
b3JtYWxpemVPcHRpb25zKHRoaXMsIG5hbWUsIHRlbXBsYXRlLCBvcHRpb25zKTsKLSAgICB2aWV3
ID0gc2V0dXBWaWV3KHZpZXcsIGNvbnRhaW5lciwgb3B0aW9ucyk7CisgICAgcXVlcnlQYXJhbXM6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBzZWxmICAgICAgICAgICAg
ICA9IHRoaXMsCisgICAgICAgIHF1ZXJ5UGFyYW1zICAgICAgICAgPSBudWxsLAorICAgICAgICBh
bGxvd2VkUXVlcnlQYXJhbXMgID0gZ2V0KHRoaXMsICdfcG90ZW50aWFsUXVlcnlQYXJhbXMnKTsK
IAotICAgIGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21haW4nKSB7IHRoaXMubGFzdFJlbmRlcmVk
VGVtcGxhdGUgPSBuYW1lOyB9CisgICAgICBpZiAoIWFsbG93ZWRRdWVyeVBhcmFtcykgeyByZXR1
cm4gbnVsbDsgfQorICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBh
cmFtKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGdldChzZWxmLCBwYXJhbSk7CisgICAgICAgIGlm
ICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgcXVlcnlQYXJhbXMg
PSBxdWVyeVBhcmFtcyB8fCB7fTsKKyAgICAgICAgICBxdWVyeVBhcmFtc1twYXJhbV0gPSB2YWx1
ZTsKKyAgICAgICAgfQorICAgICAgfSk7CiAKLSAgICBhcHBlbmRWaWV3KHRoaXMsIHZpZXcsIG9w
dGlvbnMpOwotICB9LAogCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0ZWFyZG93
blZpZXcodGhpcyk7Ci0gIH0KLX0pOworICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zOworICAgIH0p
LnByb3BlcnR5KCdfcG90ZW50aWFsUXVlcnlQYXJhbXMuW10nKSwKIAotZnVuY3Rpb24gcGFyZW50
Um91dGUocm91dGUpIHsKLSAgdmFyIGhhbmRsZXJJbmZvcyA9IHJvdXRlLnJvdXRlci5yb3V0ZXIu
Y3VycmVudEhhbmRsZXJJbmZvczsKKyAgICAvKioKKyAgICAgIFNldHMgdGhlIGVsZW1lbnQncyBg
aHJlZmAgYXR0cmlidXRlIHRvIHRoZSB1cmwgZm9yCisgICAgICB0aGUgYExpbmtWaWV3YCdzIHRh
cmdldGVkIHJvdXRlLgogCi0gIHZhciBwYXJlbnQsIGN1cnJlbnQ7CisgICAgICBJZiB0aGUgYExp
bmtWaWV3YCdzIGB0YWdOYW1lYCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3RoZXIKKyAgICAgIHRo
YW4gYGFgLCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4KIAotICBmb3IgKHZhciBpPTAs
IGw9aGFuZGxlckluZm9zLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBjdXJyZW50ID0gaGFuZGxl
ckluZm9zW2ldLmhhbmRsZXI7Ci0gICAgaWYgKGN1cnJlbnQgPT09IHJvdXRlKSB7IHJldHVybiBw
YXJlbnQ7IH0KLSAgICBwYXJlbnQgPSBjdXJyZW50OwotICB9Ci19CisgICAgICBAcHJvcGVydHkg
aHJlZgorICAgICoqLworICAgIGhyZWY6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVM
aW5rVmlld0hyZWYoKSB7CisgICAgICBpZiAoZ2V0KHRoaXMsICd0YWdOYW1lJykgIT09ICdhJykg
eyByZXR1cm47IH0KIAotZnVuY3Rpb24gcGFyZW50VGVtcGxhdGUocm91dGUsIGlzUmVjdXJzaXZl
KSB7Ci0gIHZhciBwYXJlbnQgPSBwYXJlbnRSb3V0ZShyb3V0ZSksIHRlbXBsYXRlOworICAgICAg
dmFyIHJvdXRlciA9IGdldCh0aGlzLCAncm91dGVyJyksCisgICAgICAgICAgcm91dGVBcmdzID0g
Z2V0KHRoaXMsICdyb3V0ZUFyZ3MnKTsKIAotICBpZiAoIXBhcmVudCkgeyByZXR1cm47IH0KKyAg
ICAgIHJldHVybiByb3V0ZUFyZ3MgPyByb3V0ZXIuZ2VuZXJhdGUuYXBwbHkocm91dGVyLCByb3V0
ZUFyZ3MpIDogZ2V0KHRoaXMsICdsb2FkaW5nSHJlZicpOworICAgIH0pLnByb3BlcnR5KCdyb3V0
ZUFyZ3MnKSwKIAotICBFbWJlci53YXJuKCJUaGUgaW1tZWRpYXRlIHBhcmVudCByb3V0ZSBkaWQg
bm90IHJlbmRlciBpbnRvIHRoZSBtYWluIG91dGxldCBhbmQgdGhlIGRlZmF1bHQgJ2ludG8nIG9w
dGlvbiBtYXkgbm90IGJlIGV4cGVjdGVkIiwgIWlzUmVjdXJzaXZlKTsKKyAgICAvKioKKyAgICAg
IFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8gdXNlIHdoaWxlIGEgbGluay10byBpcyBsb2FkaW5n
LgorICAgICAgT25seSBhcHBsaWVzIHdoZW4gdGFnTmFtZSBpcyAnYScKIAotICBpZiAodGVtcGxh
dGUgPSBwYXJlbnQubGFzdFJlbmRlcmVkVGVtcGxhdGUpIHsKLSAgICByZXR1cm4gdGVtcGxhdGU7
Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBhcmVudFRlbXBsYXRlKHBhcmVudCwgdHJ1ZSk7Ci0g
IH0KLX0KKyAgICAgIEBwcm9wZXJ0eSBsb2FkaW5nSHJlZgorICAgICAgQHR5cGUgU3RyaW5nCisg
ICAgICBAZGVmYXVsdCAjCisgICAgKi8KKyAgICBsb2FkaW5nSHJlZjogJyMnCisgIH0pOwogCi1m
dW5jdGlvbiBub3JtYWxpemVPcHRpb25zKHJvdXRlLCBuYW1lLCB0ZW1wbGF0ZSwgb3B0aW9ucykg
ewotICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgb3B0aW9ucy5pbnRvID0gb3B0aW9ucy5p
bnRvID8gb3B0aW9ucy5pbnRvLnJlcGxhY2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1wbGF0ZShy
b3V0ZSk7Ci0gIG9wdGlvbnMub3V0bGV0ID0gb3B0aW9ucy5vdXRsZXQgfHwgJ21haW4nOwotICBv
cHRpb25zLm5hbWUgPSBuYW1lOwotICBvcHRpb25zLnRlbXBsYXRlID0gdGVtcGxhdGU7CisgIExp
bmtWaWV3LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiTGlua1ZpZXciOyB9OwogCi0g
IEVtYmVyLmFzc2VydCgiQW4gb3V0bGV0ICgiK29wdGlvbnMub3V0bGV0KyIpIHdhcyBzcGVjaWZp
ZWQgYnV0IHRoaXMgdmlldyB3aWxsIHJlbmRlciBhdCB0aGUgcm9vdCBsZXZlbC4iLCBvcHRpb25z
Lm91dGxldCA9PT0gJ21haW4nIHx8IG9wdGlvbnMuaW50byk7CisgIC8qKgorICAgIFRoZSBge3ts
aW5rLXRvfX1gIGhlbHBlciByZW5kZXJzIGEgbGluayB0byB0aGUgc3VwcGxpZWQKKyAgICBgcm91
dGVOYW1lYCBwYXNzaW5nIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgbW9kZWwgdG8gdGhlCisgICAg
cm91dGUgYXMgaXRzIGBtb2RlbGAgY29udGV4dCBvZiB0aGUgcm91dGUuIFRoZSBibG9jaworICAg
IGZvciBge3tsaW5rLXRvfX1gIGJlY29tZXMgdGhlIGlubmVySFRNTCBvZiB0aGUgcmVuZGVyZWQK
KyAgICBlbGVtZW50OgogCi0gIHZhciBjb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9sbGVyLCBu
YW1lZENvbnRyb2xsZXI7CisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3Rv
R2FsbGVyeSd9fQorICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKKyAgICB7ey9saW5rLXRvfX0K
KyAgICBgYGAKIAotICBpZiAob3B0aW9ucy5jb250cm9sbGVyKSB7Ci0gICAgY29udHJvbGxlciA9
IG9wdGlvbnMuY29udHJvbGxlcjsKLSAgfSBlbHNlIGlmIChuYW1lZENvbnRyb2xsZXIgPSByb3V0
ZS5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBuYW1lKSkgewotICAgIGNvbnRyb2xs
ZXIgPSBuYW1lZENvbnRyb2xsZXI7Ci0gIH0gZWxzZSB7Ci0gICAgY29udHJvbGxlciA9IHJvdXRl
LnJvdXRlTmFtZTsKLSAgfQorICAgIGBgYGh0bWwKKyAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90
b3MiPgorICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKKyAgICA8L2E+CisgICAgYGBgCiAKLSAg
aWYgKHR5cGVvZiBjb250cm9sbGVyID09PSAnc3RyaW5nJykgewotICAgIGNvbnRyb2xsZXIgPSBy
b3V0ZS5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBjb250cm9sbGVyKTsKLSAgfQor
ICAgICMjIyBTdXBwbHlpbmcgYSB0YWdOYW1lCisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1g
IHJlbmRlcnMgYW4gYDxhPmAgZWxlbWVudC4gVGhpcyBjYW4KKyAgICBiZSBvdmVycmlkZGVuIGZv
ciBhIHNpbmdsZSB1c2Ugb2YgYHt7bGluay10b319YCBieSBzdXBwbHlpbmcKKyAgICBhIGB0YWdO
YW1lYCBvcHRpb246CiAKLSAgb3B0aW9ucy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICBg
YGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyB0YWdOYW1lPSJsaSJ9
fQorICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKKyAgICB7ey9saW5rLXRvfX0KKyAgICBgYGAK
IAotICByZXR1cm4gb3B0aW9uczsKLX0KKyAgICBgYGBodG1sCisgICAgPGxpPgorICAgICAgR3Jl
YXQgSGFtc3RlciBQaG90b3MKKyAgICA8L2xpPgorICAgIGBgYAorCisgICAgVG8gb3ZlcnJpZGUg
dGhpcyBvcHRpb24gZm9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBzZWUKKyAgICAiT3ZlcnJp
ZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRzIi4KIAotZnVuY3Rpb24gc2V0dXBWaWV3KHZp
ZXcsIGNvbnRhaW5lciwgb3B0aW9ucykgewotICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25zLmlu
dG8gPyAndmlldzpkZWZhdWx0JyA6ICd2aWV3OnRvcGxldmVsJzsKKyAgICAjIyMgRGlzYWJsaW5n
IHRoZSBgbGluay10b2AgaGVscGVyCisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIGlzIGVu
YWJsZWQuCisgICAgYW55IHBhc3NlZCB2YWx1ZSB0byBgZGlzYWJsZWRgIGhlbHBlciBwcm9wZXJ0
eSB3aWxsIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBoZWxwZXIuCiAKLSAgdmlldyA9IHZpZXcgfHwg
Y29udGFpbmVyLmxvb2t1cChkZWZhdWx0Vmlldyk7CisgICAgc3RhdGljIHVzZTogdGhlIGBkaXNh
YmxlZGAgb3B0aW9uOgogCi0gIGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0ZU5hbWUnKSkgewotICAg
IHNldCh2aWV3LCAndGVtcGxhdGUnLCBvcHRpb25zLnRlbXBsYXRlKTsKKyAgICBgYGBoYW5kbGVi
YXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBkaXNhYmxlZD10cnVlfX0KKyAgICAg
IEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAge3svbGluay10b319CisgICAgYGBgCiAKLSAgICBz
ZXQodmlldywgJ19kZWJ1Z1RlbXBsYXRlTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0gIH0KKyAgICBk
eW5hbWljIHVzZTogdGhlIGBkaXNhYmxlZFdoZW5gIG9wdGlvbjoKIAotICBzZXQodmlldywgJ3Jl
bmRlcmVkTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0gIHNldCh2aWV3LCAnY29udHJvbGxlcicsIG9w
dGlvbnMuY29udHJvbGxlcik7CisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bo
b3RvR2FsbGVyeScgZGlzYWJsZWRXaGVuPWNvbnRyb2xsZXIuc29tZVByb3BlcnR5fX0KKyAgICAg
IEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAge3svbGluay10b319CisgICAgYGBgCiAKLSAgcmV0
dXJuIHZpZXc7Ci19CisgICAgYW55IHBhc3NlZCB2YWx1ZSB0byBgZGlzYWJsZWRgIHdpbGwgZGlz
YWJsZSBpdCBleGNlcHQgYHVuZGVmaW5lZGAuCisgICAgdG8gZW5zdXJlIHRoYXQgb25seSBgdHJ1
ZWAgZGlzYWJsZSB0aGUgYGxpbmstdG9gIGhlbHBlciB5b3UgY2FuCisgICAgb3ZlcnJpZGUgdGhl
IGdsb2JhbCBiZWhhdmlvdXIgb2YgYEVtYmVyLkxpbmtWaWV3YC4KIAotZnVuY3Rpb24gYXBwZW5k
Vmlldyhyb3V0ZSwgdmlldywgb3B0aW9ucykgewotICBpZiAob3B0aW9ucy5pbnRvKSB7Ci0gICAg
dmFyIHBhcmVudFZpZXcgPSByb3V0ZS5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcob3B0aW9ucy5p
bnRvKTsKLSAgICByb3V0ZS50ZWFyZG93blZpZXcgPSB0ZWFyZG93bk91dGxldChwYXJlbnRWaWV3
LCBvcHRpb25zLm91dGxldCk7Ci0gICAgcGFyZW50Vmlldy5jb25uZWN0T3V0bGV0KG9wdGlvbnMu
b3V0bGV0LCB2aWV3KTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgcm9vdEVsZW1lbnQgPSBnZXQocm91
dGUsICdyb3V0ZXIubmFtZXNwYWNlLnJvb3RFbGVtZW50Jyk7Ci0gICAgcm91dGUucm91dGVyLl9j
b25uZWN0QWN0aXZlVmlldyhvcHRpb25zLm5hbWUsIHZpZXcpOwotICAgIHJvdXRlLnRlYXJkb3du
VmlldyA9IHRlYXJkb3duVG9wTGV2ZWwodmlldyk7Ci0gICAgdmlldy5hcHBlbmRUbyhyb290RWxl
bWVudCk7Ci0gIH0KLX0KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuTGlua1ZpZXcucmVv
cGVuKHsKKyAgICAgIGRpc2FibGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVl
KSB7CisgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdGhpcy5z
ZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUgPT09IHRydWUpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IGdldCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7
CisgICAgICB9KQorICAgIH0pOworICAgIGBgYAogCi1mdW5jdGlvbiB0ZWFyZG93blRvcExldmVs
KHZpZXcpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyB2aWV3LmRlc3Ryb3koKTsgfTsKLX0KKyAg
ICBzZWUgIk92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0cyIgZm9yIG1vcmUuCiAK
LWZ1bmN0aW9uIHRlYXJkb3duT3V0bGV0KHBhcmVudFZpZXcsIG91dGxldCkgewotICByZXR1cm4g
ZnVuY3Rpb24oKSB7IHBhcmVudFZpZXcuZGlzY29ubmVjdE91dGxldChvdXRsZXQpOyB9OwotfQor
ICAgICMjIyBIYW5kbGluZyBgaHJlZmAKKyAgICBge3tsaW5rLXRvfX1gIHdpbGwgdXNlIHlvdXIg
YXBwbGljYXRpb24ncyBSb3V0ZXIgdG8KKyAgICBmaWxsIHRoZSBlbGVtZW50J3MgYGhyZWZgIHBy
b3BlcnR5IHdpdGggYSB1cmwgdGhhdAorICAgIG1hdGNoZXMgdGhlIHBhdGggdG8gdGhlIHN1cHBs
aWVkIGByb3V0ZU5hbWVgIGZvciB5b3VyCisgICAgcm91dGVycydzIGNvbmZpZ3VyZWQgYExvY2F0
aW9uYCBzY2hlbWUsIHdoaWNoIGRlZmF1bHRzCisgICAgdG8gRW1iZXIuSGFzaExvY2F0aW9uLgog
Ci1mdW5jdGlvbiB0ZWFyZG93blZpZXcocm91dGUpIHsKLSAgaWYgKHJvdXRlLnRlYXJkb3duVmll
dykgeyByb3V0ZS50ZWFyZG93blZpZXcoKTsgfQorICAgICMjIyBIYW5kbGluZyBjdXJyZW50IHJv
dXRlCisgICAgYHt7bGluay10b319YCB3aWxsIGFwcGx5IGEgQ1NTIGNsYXNzIG5hbWUgb2YgJ2Fj
dGl2ZScKKyAgICB3aGVuIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgbWF0Y2hlcwor
ICAgIHRoZSBzdXBwbGllZCByb3V0ZU5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRp
b24ncworICAgIGN1cnJlbnQgcm91dGUgaXMgJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIHRoZSBmb2xs
b3dpbmcKKyAgICB1c2Ugb2YgYHt7bGluay10b319YDoKIAotICBkZWxldGUgcm91dGUudGVhcmRv
d25WaWV3OwotICBkZWxldGUgcm91dGUubGFzdFJlbmRlcmVkVGVtcGxhdGU7Ci19CisgICAgYGBg
aGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnfX0KKyAgICAg
IEdyZWF0IEhhbXN0ZXIgUGhvdG9zIGZyb20gdGhlIGxhc3Qgd2VlaworICAgIHt7L2xpbmstdG99
fQorICAgIGBgYAogCi19KSgpOworICAgIHdpbGwgcmVzdWx0IGluCiAKKyAgICBgYGBodG1sCisg
ICAgPGEgaHJlZj0iL2hhbXN0ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImFjdGl2ZSI+Cisg
ICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcworICAgIDwvYT4KKyAgICBgYGAKIAorICAgIFRoZSBD
U1MgY2xhc3MgbmFtZSB1c2VkIGZvciBhY3RpdmUgY2xhc3NlcyBjYW4gYmUgY3VzdG9taXplZAor
ICAgIGZvciBhIHNpbmdsZSB1c2Ugb2YgYHt7bGluay10b319YCBieSBwYXNzaW5nIGFuIGBhY3Rp
dmVDbGFzc2AKKyAgICBvcHRpb246CiAKLShmdW5jdGlvbigpIHsKKyAgICBgYGBoYW5kbGViYXJz
CisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LnJlY2VudCcgYWN0aXZlQ2xhc3M9ImN1cnJl
bnQtdXJsIn19CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcyBmcm9tIHRoZSBsYXN0IHdlZWsK
KyAgICB7ey9saW5rLXRvfX0KKyAgICBgYGAKIAotfSkoKTsKKyAgICBgYGBodG1sCisgICAgPGEg
aHJlZj0iL2hhbXN0ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KKyAg
ICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAgPC9hPgorICAgIGBgYAogCisgICAgVG8gb3Zl
cnJpZGUgdGhpcyBvcHRpb24gZm9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBzZWUKKyAgICAi
T3ZlcnJpZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRzIi4KIAorICAgICMjIyBTdXBwbHlp
bmcgYSBtb2RlbAorICAgIEFuIG9wdGlvbmFsIG1vZGVsIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGZv
ciByb3V0ZXMgd2hvc2UKKyAgICBwYXRocyBjb250YWluIGR5bmFtaWMgc2VnbWVudHMuIFRoaXMg
YXJndW1lbnQgd2lsbCBiZWNvbWUKKyAgICB0aGUgbW9kZWwgY29udGV4dCBvZiB0aGUgbGlua2Vk
IHJvdXRlOgogCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcm91dGluZwotKi8KKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJvdXRlci5tYXAo
ZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJlc291cmNlKCJwaG90b0dhbGxlcnkiLCB7cGF0aDog
ImhhbXN0ZXItcGhvdG9zLzpwaG90b19pZCJ9KTsKKyAgICB9KTsKKyAgICBgYGAKIAotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5k
bGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgeworICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQaG90b319CisgICAgICB7e2FQaG90by50aXRsZX19
CisgICAge3svbGluay10b319CisgICAgYGBgCiAKLSAgdmFyIHJlc29sdmVQYXJhbXMgPSBFbWJl
ci5IYW5kbGViYXJzLnJlc29sdmVQYXJhbXMsCi0gICAgICBpc1NpbXBsZUNsaWNrID0gRW1iZXIu
Vmlld1V0aWxzLmlzU2ltcGxlQ2xpY2s7CisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1z
dGVyLXBob3Rvcy80MiI+CisgICAgICBUb21zdGVyCisgICAgPC9hPgorICAgIGBgYAogCi0gIGZ1
bmN0aW9uIGZ1bGxSb3V0ZU5hbWUocm91dGVyLCBuYW1lKSB7Ci0gICAgaWYgKCFyb3V0ZXIuaGFz
Um91dGUobmFtZSkpIHsKLSAgICAgIG5hbWUgPSBuYW1lICsgJy5pbmRleCc7Ci0gICAgfQorICAg
ICMjIyBTdXBwbHlpbmcgbXVsdGlwbGUgbW9kZWxzCisgICAgRm9yIGRlZXAtbGlua2luZyB0byBy
b3V0ZSBwYXRocyB0aGF0IGNvbnRhaW4gbXVsdGlwbGUKKyAgICBkeW5hbWljIHNlZ21lbnRzLCBt
dWx0aXBsZSBtb2RlbCBhcmd1bWVudHMgY2FuIGJlIHVzZWQuCisgICAgQXMgdGhlIHJvdXRlciB0
cmFuc2l0aW9ucyB0aHJvdWdoIHRoZSByb3V0ZSBwYXRoLCBlYWNoCisgICAgc3VwcGxpZWQgbW9k
ZWwgYXJndW1lbnQgd2lsbCBiZWNvbWUgdGhlIGNvbnRleHQgZm9yIHRoZQorICAgIHJvdXRlIHdp
dGggdGhlIGR5bmFtaWMgc2VnbWVudHM6CiAKLSAgICByZXR1cm4gbmFtZTsKLSAgfQorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMu
cmVzb3VyY2UoInBob3RvR2FsbGVyeSIsIHtwYXRoOiAiaGFtc3Rlci1waG90b3MvOnBob3RvX2lk
In0sIGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCJjb21tZW50Iiwge3BhdGg6ICJj
b21tZW50cy86Y29tbWVudF9pZCJ9KTsKKyAgICAgIH0pOworICAgIH0pOworICAgIGBgYAorICAg
IFRoaXMgYXJndW1lbnQgd2lsbCBiZWNvbWUgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtl
ZCByb3V0ZToKIAotICBmdW5jdGlvbiByZXNvbHZlZFBhdGhzKG9wdGlvbnMpIHsKLSAgICB2YXIg
dHlwZXMgPSBvcHRpb25zLm9wdGlvbnMudHlwZXMuc2xpY2UoMSksCi0gICAgICAgIGRhdGEgPSBv
cHRpb25zLm9wdGlvbnMuZGF0YTsKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAn
cGhvdG9HYWxsZXJ5LmNvbW1lbnQnIGFQaG90byBjb21tZW50fX0KKyAgICAgIHt7Y29tbWVudC5i
b2R5fX0KKyAgICB7ey9saW5rLXRvfX0KKyAgICBgYGAKIAotICAgIHJldHVybiByZXNvbHZlUGFy
YW1zKG9wdGlvbnMuY29udGV4dCwgb3B0aW9ucy5wYXJhbXMsIHsgdHlwZXM6IHR5cGVzLCBkYXRh
OiBkYXRhIH0pOwotICB9CisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rv
cy80Mi9jb21tZW50LzcxOCI+CisgICAgICBBKysrIHdvdWxkIHNudWdnbGUgYWdhaW4uCisgICAg
PC9hPgorICAgIGBgYAogCi0gIGZ1bmN0aW9uIGFyZ3MobGlua1ZpZXcsIHJvdXRlciwgcm91dGUp
IHsKLSAgICB2YXIgcGFzc2VkUm91dGVOYW1lID0gcm91dGUgfHwgbGlua1ZpZXcubmFtZWRSb3V0
ZSwgcm91dGVOYW1lOworICAgICMjIyBTdXBwbHlpbmcgYW4gZXhwbGljaXQgZHluYW1pYyBzZWdt
ZW50IHZhbHVlCisgICAgSWYgeW91IGRvbid0IGhhdmUgYSBtb2RlbCBvYmplY3QgYXZhaWxhYmxl
IHRvIHBhc3MgdG8gYHt7bGluay10b319YCwKKyAgICBhbiBvcHRpb25hbCBzdHJpbmcgb3IgaW50
ZWdlciBhcmd1bWVudCBjYW4gYmUgcGFzc2VkIGZvciByb3V0ZXMgd2hvc2UKKyAgICBwYXRocyBj
b250YWluIGR5bmFtaWMgc2VnbWVudHMuIFRoaXMgYXJndW1lbnQgd2lsbCBiZWNvbWUgdGhlIHZh
bHVlCisgICAgb2YgdGhlIGR5bmFtaWMgc2VnbWVudDoKIAotICAgIHJvdXRlTmFtZSA9IGZ1bGxS
b3V0ZU5hbWUocm91dGVyLCBwYXNzZWRSb3V0ZU5hbWUpOworICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucmVzb3VyY2UoInBob3Rv
R2FsbGVyeSIsIHtwYXRoOiAiaGFtc3Rlci1waG90b3MvOnBob3RvX2lkIn0pOworICAgIH0pOwor
ICAgIGBgYAogCi0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgcm91dGUgIiArIHBhc3NlZFJvdXRlTmFt
ZSArICIgd2FzIG5vdCBmb3VuZCIsIHJvdXRlci5oYXNSb3V0ZShyb3V0ZU5hbWUpKTsKKyAgICBg
YGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBhUGhvdG9JZH19Cisg
ICAgICB7e2FQaG90by50aXRsZX19CisgICAge3svbGluay10b319CisgICAgYGBgCiAKLSAgICB2
YXIgcmV0ID0gWyByb3V0ZU5hbWUgXTsKLSAgICByZXR1cm4gcmV0LmNvbmNhdChyZXNvbHZlZFBh
dGhzKGxpbmtWaWV3LnBhcmFtZXRlcnMpKTsKLSAgfQorICAgIGBgYGh0bWwKKyAgICA8YSBocmVm
PSIvaGFtc3Rlci1waG90b3MvNDIiPgorICAgICAgVG9tc3RlcgorICAgIDwvYT4KKyAgICBgYGAK
IAotICB2YXIgTGlua1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2En
LAotICAgIG5hbWVkUm91dGU6IG51bGwsCi0gICAgY3VycmVudFdoZW46IG51bGwsCi0gICAgdGl0
bGU6IG51bGwsCi0gICAgYWN0aXZlQ2xhc3M6ICdhY3RpdmUnLAotICAgIHJlcGxhY2U6IGZhbHNl
LAotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2hyZWYnLCAndGl0bGUnXSwKLSAgICBjbGFzc05h
bWVCaW5kaW5nczogJ2FjdGl2ZScsCisgICAgV2hlbiB0cmFuc2l0aW9uaW5nIGludG8gdGhlIGxp
bmtlZCByb3V0ZSwgdGhlIGBtb2RlbGAgaG9vayB3aWxsCisgICAgYmUgdHJpZ2dlcmVkIHdpdGgg
cGFyYW1ldGVycyBpbmNsdWRpbmcgdGhpcyBwYXNzZWQgaWRlbnRpZmllci4KIAotICAgIC8vIEV2
ZW4gdGhvdWdoIHRoaXMgaXNuJ3QgYSB2aXJ0dWFsIHZpZXcsIHdlIHdhbnQgdG8gdHJlYXQgaXQg
YXMgaWYgaXQgaXMKLSAgICAvLyBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSBwYXJlbnQgd2l0
aCB7e3ZpZXcucHJvcH19Ci0gICAgY29uY3JldGVWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKLSAgICAgIHJldHVybiBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsKLSAgICB9KS5wcm9w
ZXJ0eSgncGFyZW50VmlldycpLnZvbGF0aWxlKCksCisgICAgIyMjIEFsbG93aW5nIERlZmF1bHQg
QWN0aW9uCiAKLSAgICBhY3RpdmU6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAg
dmFyIHJvdXRlciA9IHRoaXMuZ2V0KCdyb3V0ZXInKSwKLSAgICAgICAgICBwYXJhbXMgPSByZXNv
bHZlZFBhdGhzKHRoaXMucGFyYW1ldGVycyksCi0gICAgICAgICAgY3VycmVudFdpdGhJbmRleCA9
IHRoaXMuY3VycmVudFdoZW4gKyAnLmluZGV4JywKLSAgICAgICAgICBpc0FjdGl2ZSA9IHJvdXRl
ci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIFt0aGlzLmN1cnJlbnRXaGVuXS5jb25jYXQocGFyYW1z
KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIs
IFtjdXJyZW50V2l0aEluZGV4XS5jb25jYXQocGFyYW1zKSk7CisgICBCeSBkZWZhdWx0IHRoZSBg
e3tsaW5rLXRvfX1gIGhlbHBlciBwcmV2ZW50cyB0aGUgZGVmYXVsdCBicm93c2VyIGFjdGlvbgor
ICAgYnkgY2FsbGluZyBgcHJldmVudERlZmF1bHQoKWAgYXMgdGhpcyBzb3J0IG9mIGFjdGlvbiBi
dWJibGluZyBpcyBub3JtYWxseQorICAgaGFuZGxlZCBpbnRlcm5hbGx5IGFuZCB3ZSBkbyBub3Qg
d2FudCB0byB0YWtlIHRoZSBicm93c2VyIHRvIGEgbmV3IFVSTCAoZm9yCisgICBleGFtcGxlKS4K
IAotICAgICAgaWYgKGlzQWN0aXZlKSB7IHJldHVybiBnZXQodGhpcywgJ2FjdGl2ZUNsYXNzJyk7
IH0KLSAgICB9KS5wcm9wZXJ0eSgnbmFtZWRSb3V0ZScsICdyb3V0ZXIudXJsJyksCisgICBJZiB5
b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHNwZWNpZnkgYHByZXZlbnREZWZhdWx0
PWZhbHNlYCBpbgorICAgeW91ciB0ZW1wbGF0ZToKIAotICAgIHJvdXRlcjogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbnRyb2xsZXInKS5jb250
YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotICAgIH0pLAorICAgIGBgYGhhbmRsZWJhcnMK
KyAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQaG90b0lkIHByZXZlbnREZWZhdWx0PWZh
bHNlfX0KKyAgICAgIHt7YVBob3RvSWQudGl0bGV9fQorICAgIHt7L2xpbmstdG99fQorICAgIGBg
YAogCi0gICAgY2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICBpZiAoIWlzU2ltcGxlQ2xp
Y2soZXZlbnQpKSB7IHJldHVybiB0cnVlOyB9CisgICAgIyMjIE92ZXJyaWRpbmcgYXR0cmlidXRl
cworICAgIFlvdSBjYW4gb3ZlcnJpZGUgYW55IGdpdmVuIHByb3BlcnR5IG9mIHRoZSBFbWJlci5M
aW5rVmlldworICAgIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBl
ciBieSBwYXNzaW5nCisgICAga2V5L3ZhbHVlIHBhaXJzLCBsaWtlIHNvOgogCi0gICAgICBldmVu
dC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgaWYgKHRoaXMuYnViYmxlcyA9PT0gZmFsc2UpIHsg
ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0KKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjbGlu
ay10byAgYVBob3RvIHRhZ05hbWU9J2xpJyB0aXRsZT0nRm9sbG93aW5nIHRoaXMgbGluayB3aWxs
IGNoYW5nZSB5b3VyIGxpZmUnIGNsYXNzTmFtZXM9J3BpYyBzd2VldCd9fQorICAgICAgVWgtbWF6
aW5nIQorICAgIHt7L2xpbmstdG99fQorICAgIGBgYAogCi0gICAgICB2YXIgcm91dGVyID0gdGhp
cy5nZXQoJ3JvdXRlcicpOworICAgIFNlZSBbRW1iZXIuTGlua1ZpZXddKC9hcGkvY2xhc3Nlcy9F
bWJlci5MaW5rVmlldy5odG1sKSBmb3IgYQorICAgIGNvbXBsZXRlIGxpc3Qgb2Ygb3ZlcnJpZGVh
YmxlIHByb3BlcnRpZXMuIEJlIHN1cmUgdG8gYWxzbworICAgIGNoZWNrIG91dCBpbmhlcml0ZWQg
cHJvcGVydGllcyBvZiBgTGlua1ZpZXdgLgogCi0gICAgICBpZiAodGhpcy5nZXQoJ3JlcGxhY2Un
KSkgewotICAgICAgICByb3V0ZXIucmVwbGFjZVdpdGguYXBwbHkocm91dGVyLCBhcmdzKHRoaXMs
IHJvdXRlcikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcm91dGVyLnRyYW5zaXRpb25Uby5h
cHBseShyb3V0ZXIsIGFyZ3ModGhpcywgcm91dGVyKSk7Ci0gICAgICB9Ci0gICAgfSwKKyAgICAj
IyMgT3ZlcnJpZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRzCisgICAgYGB7e2xpbmstdG99
fWBgIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTGlua1ZpZXcKKyAgICBmb3IgcmVuZGVy
aW5nLiBUbyBvdmVycmlkZSBvcHRpb25zIGZvciB5b3VyIGVudGlyZQorICAgIGFwcGxpY2F0aW9u
LCByZW9wZW4gRW1iZXIuTGlua1ZpZXcgYW5kIHN1cHBseSB0aGUKKyAgICBkZXNpcmVkIHZhbHVl
czoKIAotICAgIGhyZWY6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHJv
dXRlciA9IHRoaXMuZ2V0KCdyb3V0ZXInKTsKLSAgICAgIHJldHVybiByb3V0ZXIuZ2VuZXJhdGUu
YXBwbHkocm91dGVyLCBhcmdzKHRoaXMsIHJvdXRlcikpOworICAgIGBgYCBqYXZhc2NyaXB0Cisg
ICAgRW1iZXIuTGlua1ZpZXcucmVvcGVuKHsKKyAgICAgIGFjdGl2ZUNsYXNzOiAiaXMtYWN0aXZl
IiwKKyAgICAgIHRhZ05hbWU6ICdsaScKICAgICB9KQotICB9KTsKKyAgICBgYGAKIAotICBMaW5r
Vmlldy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gIkxpbmtWaWV3IjsgfTsKKyAgICBJ
dCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGV2ZW50IGluCisgICAg
dGhpcyBtYW5uZXI6CiAKLSAgLyoqCi0gICAgQG1ldGhvZCBsaW5rVG8KKyAgICBgYGAgamF2YXNj
cmlwdAorICAgIEVtYmVyLkxpbmtWaWV3LnJlb3Blbih7CisgICAgICBldmVudE5hbWU6ICdjdXN0
b21FdmVudE5hbWUnCisgICAgfSk7CisgICAgYGBgCisKKyAgICBAbWV0aG9kIGxpbmstdG8KICAg
ICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogICAgIEBwYXJhbSB7U3RyaW5nfSByb3V0
ZU5hbWUKICAgICBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdKgorICAgIEBwYXJhbSBbb3B0aW9u
c10ge09iamVjdH0gSGFuZGxlYmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0aW9ucywgeW91IGNh
biBvdmVycmlkZSBhbnkgcHJvcGVydHkgb2YgRW1iZXIuTGlua1ZpZXcKICAgICBAcmV0dXJuIHtT
dHJpbmd9IEhUTUwgc3RyaW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxw
ZXIoJ2xpbmtUbycsIGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgb3B0aW9ucyA9IFtdLnNsaWNl
LmNhbGwoYXJndW1lbnRzLCAtMSlbMF07Ci0gICAgdmFyIHBhcmFtcyA9IFtdLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxLCAtMSk7Ci0KLSAgICB2YXIgaGFzaCA9IG9wdGlvbnMuaGFzaDsKLQotICAg
IGhhc2gubmFtZWRSb3V0ZSA9IG5hbWU7Ci0gICAgaGFzaC5jdXJyZW50V2hlbiA9IGhhc2guY3Vy
cmVudFdoZW4gfHwgbmFtZTsKKyAgICBAc2VlIHtFbWJlci5MaW5rVmlld30KKyAgKi8KKyAgRW1i
ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbGluay10bycsIGZ1bmN0aW9uIGxpbmtUb0hl
bHBlcihuYW1lKSB7CisgICAgdmFyIG9wdGlvbnMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywg
LTEpWzBdLAorICAgICAgICBwYXJhbXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEp
LAorICAgICAgICBoYXNoID0gb3B0aW9ucy5oYXNoOworCisgICAgaGFzaC5kaXNhYmxlZEJpbmRp
bmcgPSBoYXNoLmRpc2FibGVkV2hlbjsKKworICAgIGlmICghb3B0aW9ucy5mbikgeworICAgICAg
dmFyIGxpbmtUaXRsZSA9IHBhcmFtcy5zaGlmdCgpOworICAgICAgdmFyIGxpbmtUeXBlID0gb3B0
aW9ucy50eXBlcy5zaGlmdCgpOworICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOworICAgICAgaWYg
KGxpbmtUeXBlID09PSAnSUQnKSB7CisgICAgICAgIG9wdGlvbnMubGlua1RleHRQYXRoID0gbGlu
a1RpdGxlOworICAgICAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgcmV0
dXJuIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KGNvbnRleHQsIGxpbmtUaXRsZSwgb3B0aW9ucyk7Cisg
ICAgICAgIH07CisgICAgICB9IGVsc2UgeworICAgICAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24o
KSB7CisgICAgICAgICAgcmV0dXJuIGxpbmtUaXRsZTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAg
ICB9CiAKICAgICBoYXNoLnBhcmFtZXRlcnMgPSB7CiAgICAgICBjb250ZXh0OiB0aGlzLApAQCAt
MjM2NTksOSArMzYxODcsMjQgQEAgRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywgZnVu
Y3Rpb24oSGFuZGxlYmFycykgewogICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMu
dmlldy5jYWxsKHRoaXMsIExpbmtWaWV3LCBvcHRpb25zKTsKICAgfSk7CiAKKyAgLyoqCisgICAg
U2VlIFtsaW5rLXRvXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwj
bWV0aG9kX2xpbmstdG8pCisKKyAgICBAbWV0aG9kIGxpbmtUbworICAgIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gcm91
dGVOYW1lCisgICAgQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoKKyAgICBAcmV0dXJuIHtTdHJp
bmd9IEhUTUwgc3RyaW5nCisgICovCisgIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIo
J2xpbmtUbycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcigpIHsKKyAgICBFbWJlci53YXJuKCJUaGUg
J2xpbmtUbycgdmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnbGluay10byci
KTsKKyAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzWydsaW5rLXRvJ10uYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKKyAgfSk7CiB9KTsKIAogCisKIH0pKCk7CiAKIApAQCAtMjM2NzYs
NjYgKzM2MjE5LDEwOSBAQCB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CiBF
bWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7CiAg
IC8qKgogICBAbW9kdWxlIGVtYmVyCi0gIEBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycworICBA
c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKICAgKi8KIAogICBIYW5kbGViYXJzLk91dGxldFZpZXcg
PSBFbWJlci5Db250YWluZXJWaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoKTsKIAogICAvKioK
LSAgICBUaGUgYG91dGxldGAgaGVscGVyIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGF0IHRoZSBj
dXJyZW50Ci0gICAgdmlldydzIGNvbnRyb2xsZXIgd2lsbCBmaWxsIGluIHRoZSB2aWV3IGZvciBh
IGdpdmVuIGFyZWEuCisgICAgVGhlIGBvdXRsZXRgIGhlbHBlciBpcyBhIHBsYWNlaG9sZGVyIHRo
YXQgdGhlIHJvdXRlciB3aWxsIGZpbGwgaW4gd2l0aAorICAgIHRoZSBhcHByb3ByaWF0ZSB0ZW1w
bGF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24uCiAKICAg
ICBgYGAgaGFuZGxlYmFycwogICAgIHt7b3V0bGV0fX0KICAgICBgYGAKIAotICAgIEJ5IGRlZmF1
bHQsIHdoZW4gdGhlIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIncyBgdmlld2AgcHJvcGVydHkgY2hh
bmdlcywgdGhlCi0gICAgb3V0bGV0IHdpbGwgcmVwbGFjZSBpdHMgY3VycmVudCB2aWV3IHdpdGgg
dGhlIG5ldyB2aWV3LiBZb3UgY2FuIHNldCB0aGUKLSAgICBgdmlld2AgcHJvcGVydHkgZGlyZWN0
bHksIGJ1dCBpdCdzIG5vcm1hbGx5IGJlc3QgdG8gdXNlIGBjb25uZWN0T3V0bGV0YC4KKyAgICBC
eSBkZWZhdWx0LCBhIHRlbXBsYXRlIGJhc2VkIG9uIEVtYmVyJ3MgbmFtaW5nIGNvbnZlbnRpb25z
IHdpbGwgYmUgcmVuZGVyZWQKKyAgICBpbnRvIHRoZSBgb3V0bGV0YCAoZS5nLiBgQXBwLlBvc3Rz
Um91dGVgIHdpbGwgcmVuZGVyIHRoZSBgcG9zdHNgIHRlbXBsYXRlKS4KKworICAgIFlvdSBjYW4g
cmVuZGVyIGEgZGlmZmVyZW50IHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBgcmVuZGVyKClgIG1ldGhv
ZCBpbiB0aGUKKyAgICByb3V0ZSdzIGByZW5kZXJUZW1wbGF0ZWAgaG9vay4gVGhlIGZvbGxvd2lu
ZyB3aWxsIHJlbmRlciB0aGUgYGZhdm9yaXRlUG9zdGAKKyAgICB0ZW1wbGF0ZSBpbnRvIHRoZSBg
b3V0bGV0YC4KIAogICAgIGBgYCBqYXZhc2NyaXB0Ci0gICAgIyBJbnN0YW50aWF0ZSBBcHAuUG9z
dHNWaWV3IGFuZCBhc3NpZ24gdG8gYHZpZXdgLCBzbyBhcyB0byByZW5kZXIgaW50byBvdXRsZXQu
Ci0gICAgY29udHJvbGxlci5jb25uZWN0T3V0bGV0KCdwb3N0cycpOworICAgIEFwcC5Qb3N0c1Jv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcpOworICAgICAgfQorICAg
IH0pOwogICAgIGBgYAogCi0gICAgWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5h
bWUgb3RoZXIgdGhhbiBgdmlld2A6CisgICAgWW91IGNhbiBjcmVhdGUgY3VzdG9tIG5hbWVkIG91
dGxldHMgZm9yIG1vcmUgY29udHJvbC4KIAogICAgIGBgYCBoYW5kbGViYXJzCi0gICAge3tvdXRs
ZXQgbWFzdGVyVmlld319Ci0gICAge3tvdXRsZXQgZGV0YWlsVmlld319CisgICAge3tvdXRsZXQg
J2Zhdm9yaXRlUG9zdCd9fQorICAgIHt7b3V0bGV0ICdwb3N0cyd9fQorICAgIGBgYAorCisgICAg
VGhlbiB5b3UgY2FuIGRlZmluZSB3aGF0IHRlbXBsYXRlIGlzIHJlbmRlcmVkIGludG8gZWFjaCBv
dXRsZXQgaW4geW91cgorICAgIHJvdXRlLgorCisKKyAgICBgYGAgamF2YXNjcmlwdAorICAgIEFw
cC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgIHJlbmRlclRlbXBsYXRl
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcsIHsgb3V0
bGV0OiAnZmF2b3JpdGVQb3N0JyB9KTsKKyAgICAgICAgdGhpcy5yZW5kZXIoJ3Bvc3RzJywgeyBv
dXRsZXQ6ICdwb3N0cycgfSk7CisgICAgICB9CisgICAgfSk7CiAgICAgYGBgCiAKLSAgICBUaGVu
LCB5b3UgY2FuIGNvbnRyb2wgc2V2ZXJhbCBvdXRsZXRzIGZyb20gYSBzaW5nbGUgY29udHJvbGxl
ci4KKyAgICBZb3UgY2FuIHNwZWNpZnkgdGhlIHZpZXcgdGhhdCB0aGUgb3V0bGV0IHVzZXMgdG8g
Y29udGFpbiBhbmQgbWFuYWdlIHRoZQorICAgIHRlbXBsYXRlcyByZW5kZXJlZCBpbnRvIGl0Lgor
CisgICAgYGBgIGhhbmRsZWJhcnMKKyAgICB7e291dGxldCB2aWV3PSdzZWN0aW9uQ29udGFpbmVy
J319CisgICAgYGBgCiAKICAgICBgYGAgamF2YXNjcmlwdAotICAgICMgSW5zdGFudGlhdGUgQXBw
LlBvc3RzVmlldyBhbmQgYXNzaWduIHRvIGNvbnRyb2xsZXIubWFzdGVyVmlldy4KLSAgICBjb250
cm9sbGVyLmNvbm5lY3RPdXRsZXQoJ21hc3RlclZpZXcnLCAncG9zdHMnKTsKLSAgICAjIEFsc28s
IGluc3RhbnRpYXRlIEFwcC5Qb3N0SW5mb1ZpZXcgYW5kIGFzc2lnbiB0byBjb250cm9sbGVyLmRl
dGFpbFZpZXcuCi0gICAgY29udHJvbGxlci5jb25uZWN0T3V0bGV0KCdkZXRhaWxWaWV3JywgJ3Bv
c3RJbmZvJyk7CisgICAgQXBwLlNlY3Rpb25Db250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3
LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAnc2VjdGlvbicsCisgICAgICBjbGFzc05hbWVzOiBb
J3NwZWNpYWwnXQorICAgIH0pOwogICAgIGBgYAogCiAgICAgQG1ldGhvZCBvdXRsZXQKICAgICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0
eSB0aGUgcHJvcGVydHkgb24gdGhlIGNvbnRyb2xsZXIKICAgICAgIHRoYXQgaG9sZHMgdGhlIHZp
ZXcgZm9yIHRoaXMgb3V0bGV0CisgICAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwogICAq
LwotICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdvdXRsZXQnLCBmdW5jdGlvbihwcm9wZXJ0
eSwgb3B0aW9ucykgewotICAgIHZhciBvdXRsZXRTb3VyY2U7CisgIEhhbmRsZWJhcnMucmVnaXN0
ZXJIZWxwZXIoJ291dGxldCcsIGZ1bmN0aW9uIG91dGxldEhlbHBlcihwcm9wZXJ0eSwgb3B0aW9u
cykgeworICAgCisgICAgdmFyIG91dGxldFNvdXJjZSwKKyAgICAgICAgY29udGFpbmVyLAorICAg
ICAgICB2aWV3TmFtZSwKKyAgICAgICAgdmlld0NsYXNzLAorICAgICAgICB2aWV3RnVsbE5hbWU7
CiAKICAgICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuZGF0YSAmJiBwcm9wZXJ0eS5kYXRhLmlz
UmVuZGVyRGF0YSkgewogICAgICAgb3B0aW9ucyA9IHByb3BlcnR5OwogICAgICAgcHJvcGVydHkg
PSAnbWFpbic7CiAgICAgfQogCisgICAgY29udGFpbmVyID0gb3B0aW9ucy5kYXRhLnZpZXcuY29u
dGFpbmVyOworCiAgICAgb3V0bGV0U291cmNlID0gb3B0aW9ucy5kYXRhLnZpZXc7Ci0gICAgd2hp
bGUgKCEob3V0bGV0U291cmNlLmdldCgndGVtcGxhdGUuaXNUb3AnKSkpeworICAgIHdoaWxlICgh
b3V0bGV0U291cmNlLmdldCgndGVtcGxhdGUuaXNUb3AnKSkgewogICAgICAgb3V0bGV0U291cmNl
ID0gb3V0bGV0U291cmNlLmdldCgnX3BhcmVudFZpZXcnKTsKICAgICB9CiAKKyAgICAvLyBwcm92
aWRlIGNvbnRyb2xsZXIgb3ZlcnJpZGUKKyAgICB2aWV3TmFtZSA9IG9wdGlvbnMuaGFzaC52aWV3
OworCisgICAgaWYgKHZpZXdOYW1lKSB7CisgICAgICB2aWV3RnVsbE5hbWUgPSAndmlldzonICsg
dmlld05hbWU7CisgICAgICBFbWJlci5hc3NlcnQoIlVzaW5nIGEgcXVvdGVsZXNzIHZpZXcgcGFy
YW1ldGVyIHdpdGgge3tvdXRsZXR9fSBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXBkYXRlIHRv
IHF1b3RlZCB1c2FnZSAne3tvdXRsZXQgXCIiICsgdmlld05hbWUgKyAiXCJ9fS4iLCBvcHRpb25z
Lmhhc2hUeXBlcy52aWV3ICE9PSAnSUQnKTsKKyAgICAgIEVtYmVyLmFzc2VydCgiVGhlIHZpZXcg
bmFtZSB5b3Ugc3VwcGxpZWQgJyIgKyB2aWV3TmFtZSArICInIGRpZCBub3QgcmVzb2x2ZSB0byBh
IHZpZXcuIiwgY29udGFpbmVyLmhhcyh2aWV3RnVsbE5hbWUpKTsKKyAgICB9CisKKyAgICB2aWV3
Q2xhc3MgPSB2aWV3TmFtZSA/IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KHZpZXdGdWxsTmFtZSkg
OiBvcHRpb25zLmhhc2gudmlld0NsYXNzIHx8IEhhbmRsZWJhcnMuT3V0bGV0VmlldzsKKwogICAg
IG9wdGlvbnMuZGF0YS52aWV3LnNldCgnb3V0bGV0U291cmNlJywgb3V0bGV0U291cmNlKTsKICAg
ICBvcHRpb25zLmhhc2guY3VycmVudFZpZXdCaW5kaW5nID0gJ192aWV3Lm91dGxldFNvdXJjZS5f
b3V0bGV0cy4nICsgcHJvcGVydHk7CiAKLSAgICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLnZp
ZXcuY2FsbCh0aGlzLCBIYW5kbGViYXJzLk91dGxldFZpZXcsIG9wdGlvbnMpOworICAgIHJldHVy
biBIYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIHZpZXdDbGFzcywgb3B0aW9ucyk7
CiAgIH0pOwogfSk7CiAKQEAgLTIzNzUzLDUxICszNjMzOSwxMzIgQEAgdmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0OwogRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywg
ZnVuY3Rpb24oSGFuZGxlYmFycykgewogCiAgIC8qKgotICAgIFJlbmRlcnMgdGhlIG5hbWVkIHRl
bXBsYXRlIGluIHRoZSBjdXJyZW50IGNvbnRleHQgdXNpbmcgdGhlIHNpbmdsZXRvbgotICAgIGlu
c3RhbmNlIG9mIHRoZSBzYW1lLW5hbWVkIGNvbnRyb2xsZXIuCisgICAgQ2FsbGluZyBgYHt7cmVu
ZGVyfX1gYCBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIHdpbGwgaW5zZXJ0IGFub3RoZXIKKyAgICB0
ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIG5hbWUuIFRoZSBpbnNlcnRlZCB0ZW1w
bGF0ZSB3aWxsCisgICAgYWNjZXNzIGl0cyBwcm9wZXJ0aWVzIG9uIGl0cyBvd24gY29udHJvbGxl
ciAocmF0aGVyIHRoYW4gdGhlIGNvbnRyb2xsZXIKKyAgICBvZiB0aGUgcGFyZW50IHRlbXBsYXRl
KS4KIAotICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB1c2Vz
IHRoZSB2aWV3IGNsYXNzLgorICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUg
ZXhpc3RzLCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4KIAotICAgIElmIGEgYG1v
ZGVsYCBpcyBzcGVjaWZpZWQsIGl0IGJlY29tZXMgdGhlIG1vZGVsIGZvciB0aGF0IGNvbnRyb2xs
ZXIuCisgICAgTm90ZTogQSBnaXZlbiBjb250cm9sbGVyIG1heSBvbmx5IGJlIHVzZWQgKm9uY2Uq
IGluIHlvdXIgYXBwIGluIHRoaXMgbWFubmVyLgorICAgIEEgc2luZ2xldG9uIGluc3RhbmNlIG9m
IHRoZSBjb250cm9sbGVyIHdpbGwgYmUgY3JlYXRlZCBmb3IgeW91LgogCi0gICAgVGhlIGRlZmF1
bHQgdGFyZ2V0IGZvciBge3thY3Rpb259fWBzIGluIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZSBpcyB0
aGUKLSAgICBuYW1lZCBjb250cm9sbGVyLgorICAgIEV4YW1wbGU6CiAKLSAgICBAbWV0aG9kIGFj
dGlvbgorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBF
bWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICB3aG86ICJ3b3JsZCIKKyAgICB9KTsKKyAg
ICBgYGAKKworICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8IS0tIG5hdmlnYXRpb24uaGJzIC0tPgor
ICAgIEhlbGxvLCB7e3dob319LgorICAgIGBgYAorCisgICAgYGBgaGFuZGVsYmFycworICAgIDwh
LS0gYXBwbGljYXRpb24uaGJzIC0tPgorICAgIDxoMT5NeSBncmVhdCBhcHA8L2gxPgorICAgIHt7
cmVuZGVyIG5hdmlnYXRpb259fQorICAgIGBgYAorCisgICAgYGBgaHRtbAorICAgIDxoMT5NeSBn
cmVhdCBhcHA8L2gxPgorICAgIDxkaXYgY2xhc3M9J2VtYmVyLXZpZXcnPgorICAgICAgSGVsbG8s
IHdvcmxkLgorICAgIDwvZGl2PgorICAgIGBgYAorCisgICAgT3B0aW9uYWxseSB5b3UgbWF5IHBy
b3ZpZGUgYSBzZWNvbmQgYXJndW1lbnQ6IGEgcHJvcGVydHkgcGF0aAorICAgIHRoYXQgd2lsbCBi
ZSBib3VuZCB0byB0aGUgYG1vZGVsYCBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbGxlci4KKworICAg
IElmIGEgYG1vZGVsYCBwcm9wZXJ0eSBwYXRoIGlzIHNwZWNpZmllZCwgdGhlbiBhIG5ldyBpbnN0
YW5jZSBvZiB0aGUKKyAgICBjb250cm9sbGVyIHdpbGwgYmUgY3JlYXRlZCBhbmQgYHt7cmVuZGVy
fX1gIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzCisgICAgd2l0aCB0aGUgc2FtZSBuYW1lLgor
CisgICBGb3IgZXhhbXBsZSBpZiB5b3UgaGFkIHRoaXMgYGF1dGhvcmAgdGVtcGxhdGUuCisKKyAg
IGBgYGhhbmRsZWJhcnMKKzxkaXYgY2xhc3M9ImF1dGhvciI+CisgIFdyaXR0ZW4gYnkge3tmaXJz
dE5hbWV9fSB7e2xhc3ROYW1lfX0uCisgIFRvdGFsIFBvc3RzOiB7e3Bvc3RDb3VudH19Cis8L2Rp
dj4KKyAgYGBgCisKKyAgWW91IGNvdWxkIHJlbmRlciBpdCBpbnNpZGUgdGhlIGBwb3N0YCB0ZW1w
bGF0ZSB1c2luZyB0aGUgYHJlbmRlcmAgaGVscGVyLgorCisgIGBgYGhhbmRsZWJhcnMKKzxkaXYg
Y2xhc3M9InBvc3QiPgorICA8aDE+e3t0aXRsZX19PC9oMT4KKyAgPGRpdj57e2JvZHl9fTwvZGl2
PgorICB7e3JlbmRlciAiYXV0aG9yIiBhdXRob3J9fQorPC9kaXY+CisgICBgYGAKKworICAgIEBt
ZXRob2QgcmVuZGVyCiAgICAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgICBAcGFy
YW0ge1N0cmluZ30gYWN0aW9uTmFtZQotICAgIEBwYXJhbSB7T2JqZWN0P30gbW9kZWwKKyAgICBA
cGFyYW0ge1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7T2JqZWN0P30gY29udGV4dFN0cmluZwog
ICAgIEBwYXJhbSB7SGFzaH0gb3B0aW9ucworICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJp
bmcKICAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigncmVuZGVyJywgZnVu
Y3Rpb24obmFtZSwgY29udGV4dFN0cmluZywgb3B0aW9ucykgewotICAgIEVtYmVyLmFzc2VydCgi
WW91IG11c3QgcGFzcyBhIHRlbXBsYXRlIHRvIHJlbmRlciIsIGFyZ3VtZW50cy5sZW5ndGggPj0g
Mik7Ci0gICAgdmFyIGNvbnRhaW5lciwgcm91dGVyLCBjb250cm9sbGVyLCB2aWV3LCBjb250ZXh0
OworICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdyZW5kZXInLCBmdW5jdGlvbiBy
ZW5kZXJIZWxwZXIobmFtZSwgY29udGV4dFN0cmluZywgb3B0aW9ucykgeworICAgIHZhciBsZW5n
dGggPSBhcmd1bWVudHMubGVuZ3RoOworICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBh
IHRlbXBsYXRlIHRvIHJlbmRlciIsIGxlbmd0aCA+PSAyKTsKKyAgICB2YXIgY29udGV4dFByb3Zp
ZGVkID0gbGVuZ3RoID09PSAzLAorICAgICAgICBjb250YWluZXIsIHJvdXRlciwgY29udHJvbGxl
ciwgdmlldywgY29udGV4dCwgbG9va3VwT3B0aW9uczsKIAotICAgIGlmIChhcmd1bWVudHMubGVu
Z3RoID09PSAyKSB7CisgICAgY29udGFpbmVyID0gKG9wdGlvbnMgfHwgY29udGV4dFN0cmluZyku
ZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyLmNvbnRhaW5lcjsKKyAgICByb3V0ZXIgPSBjb250YWlu
ZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpOworCisgICAgaWYgKGxlbmd0aCA9PT0gMikgeworICAg
ICAgLy8gdXNlIHRoZSBzaW5nbGV0b24gY29udHJvbGxlcgogICAgICAgb3B0aW9ucyA9IGNvbnRl
eHRTdHJpbmc7CiAgICAgICBjb250ZXh0U3RyaW5nID0gdW5kZWZpbmVkOwotICAgIH0KLQotICAg
IGlmICh0eXBlb2YgY29udGV4dFN0cmluZyA9PT0gJ3N0cmluZycpIHsKKyAgICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbiBvbmx5IHVzZSB0aGUge3tyZW5kZXJ9fSBoZWxwZXIgb25jZSB3aXRob3V0
IGEgbW9kZWwgb2JqZWN0IGFzIGl0cyBzZWNvbmQgYXJndW1lbnQsIGFzIGluIHt7cmVuZGVyIFwi
cG9zdFwiIHBvc3R9fS4iLCAhcm91dGVyIHx8ICFyb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcobmFt
ZSkpOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAzKSB7CisgICAgICAvLyBjcmVhdGUgYSBu
ZXcgY29udHJvbGxlcgogICAgICAgY29udGV4dCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KG9wdGlv
bnMuY29udGV4dHNbMV0sIGNvbnRleHRTdHJpbmcsIG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICB0aHJvdyBFbWJlci5FcnJvcigiWW91IG11c3QgcGFzcyBhIHRlbXBsYXRlTmFtZSB0byBy
ZW5kZXIiKTsKICAgICB9CiAKKyAgICAvLyAjIGxlZ2FjeSBuYW1lc3BhY2UKICAgICBuYW1lID0g
bmFtZS5yZXBsYWNlKC9cLy9nLCAnLicpOwotICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuZGF0YS5r
ZXl3b3Jkcy5jb250cm9sbGVyLmNvbnRhaW5lcjsKLSAgICByb3V0ZXIgPSBjb250YWluZXIubG9v
a3VwKCdyb3V0ZXI6bWFpbicpOworICAgIC8vIFwgbGVnYWN5IHNsYXNoIGFzIG5hbWVzcGFjZSBz
dXBwb3J0CiAKLSAgICBFbWJlci5hc3NlcnQoIlRoaXMgdmlldyBpcyBhbHJlYWR5IHJlbmRlcmVk
IiwgIXJvdXRlciB8fCAhcm91dGVyLl9sb29rdXBBY3RpdmVWaWV3KG5hbWUpKTsKIAogICAgIHZp
ZXcgPSBjb250YWluZXIubG9va3VwKCd2aWV3OicgKyBuYW1lKSB8fCBjb250YWluZXIubG9va3Vw
KCd2aWV3OmRlZmF1bHQnKTsKIAotICAgIGlmIChjb250cm9sbGVyID0gb3B0aW9ucy5oYXNoLmNv
bnRyb2xsZXIpIHsKLSAgICAgIGNvbnRyb2xsZXIgPSBjb250YWluZXIubG9va3VwKCdjb250cm9s
bGVyOicgKyBjb250cm9sbGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgY29udHJvbGxlciA9IEVt
YmVyLmNvbnRyb2xsZXJGb3IoY29udGFpbmVyLCBuYW1lLCBjb250ZXh0KTsKKyAgICAvLyBwcm92
aWRlIGNvbnRyb2xsZXIgb3ZlcnJpZGUKKyAgICB2YXIgY29udHJvbGxlck5hbWUgPSBvcHRpb25z
Lmhhc2guY29udHJvbGxlciB8fCBuYW1lOworICAgIHZhciBjb250cm9sbGVyRnVsbE5hbWUgPSAn
Y29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWU7CisKKyAgICBpZiAob3B0aW9ucy5oYXNoLmNv
bnRyb2xsZXIpIHsKKyAgICAgIEVtYmVyLmFzc2VydCgiVGhlIGNvbnRyb2xsZXIgbmFtZSB5b3Ug
c3VwcGxpZWQgJyIgKyBjb250cm9sbGVyTmFtZSArICInIGRpZCBub3QgcmVzb2x2ZSB0byBhIGNv
bnRyb2xsZXIuIiwgY29udGFpbmVyLmhhcyhjb250cm9sbGVyRnVsbE5hbWUpKTsKICAgICB9CiAK
LSAgICBpZiAoY29udHJvbGxlciAmJiBjb250ZXh0KSB7Ci0gICAgICBjb250cm9sbGVyLnNldCgn
bW9kZWwnLCBjb250ZXh0KTsKKyAgICB2YXIgcGFyZW50Q29udHJvbGxlciA9IG9wdGlvbnMuZGF0
YS5rZXl3b3Jkcy5jb250cm9sbGVyOworCisgICAgLy8gY2hvb3NlIG5hbWUKKyAgICBpZiAobGVu
Z3RoID4gMikgeworICAgICAgdmFyIGZhY3RvcnkgPSBjb250YWluZXIubG9va3VwRmFjdG9yeShj
b250cm9sbGVyRnVsbE5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgIEVtYmVyLmdlbmVyYXRl
Q29udHJvbGxlckZhY3RvcnkoY29udGFpbmVyLCBjb250cm9sbGVyTmFtZSwgY29udGV4dCk7CisK
KyAgICAgIGNvbnRyb2xsZXIgPSBmYWN0b3J5LmNyZWF0ZSh7CisgICAgICAgIG1vZGVsOiBjb250
ZXh0LAorICAgICAgICBwYXJlbnRDb250cm9sbGVyOiBwYXJlbnRDb250cm9sbGVyLAorICAgICAg
ICB0YXJnZXQ6IHBhcmVudENvbnRyb2xsZXIKKyAgICAgIH0pOworCisgICAgfSBlbHNlIHsKKyAg
ICAgIGNvbnRyb2xsZXIgPSBjb250YWluZXIubG9va3VwKGNvbnRyb2xsZXJGdWxsTmFtZSkgfHwK
KyAgICAgICAgICAgICAgICAgICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIoY29udGFpbmVyLCBj
b250cm9sbGVyTmFtZSk7CisKKyAgICAgIGNvbnRyb2xsZXIuc2V0UHJvcGVydGllcyh7CisgICAg
ICAgIHRhcmdldDogcGFyZW50Q29udHJvbGxlciwKKyAgICAgICAgcGFyZW50Q29udHJvbGxlcjog
cGFyZW50Q29udHJvbGxlcgorICAgICAgfSk7CiAgICAgfQogCiAgICAgdmFyIHJvb3QgPSBvcHRp
b25zLmNvbnRleHRzWzFdOwpAQCAtMjM4MDgsMTkgKzM2NDc1LDIwIEBAIEVtYmVyLm9uTG9hZCgn
RW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKICAgICAgIH0pOwogICAg
IH0KIAotICAgIGNvbnRyb2xsZXIuc2V0KCd0YXJnZXQnLCBvcHRpb25zLmRhdGEua2V5d29yZHMu
Y29udHJvbGxlcik7Ci0KICAgICBvcHRpb25zLmhhc2gudmlld05hbWUgPSBFbWJlci5TdHJpbmcu
Y2FtZWxpemUobmFtZSk7Ci0gICAgb3B0aW9ucy5oYXNoLnRlbXBsYXRlID0gY29udGFpbmVyLmxv
b2t1cCgndGVtcGxhdGU6JyArIG5hbWUpOworCisgICAgdmFyIHRlbXBsYXRlTmFtZSA9ICd0ZW1w
bGF0ZTonICsgbmFtZTsKKyAgICBFbWJlci5hc3NlcnQoIllvdSB1c2VkIGB7e3JlbmRlciAnIiAr
IG5hbWUgKyAiJ319YCwgYnV0ICciICsgbmFtZSArICInIGNhbiBub3QgYmUgZm91bmQgYXMgZWl0
aGVyIGEgdGVtcGxhdGUgb3IgYSB2aWV3LiIsIGNvbnRhaW5lci5oYXMoInZpZXc6IiArIG5hbWUp
IHx8IGNvbnRhaW5lci5oYXModGVtcGxhdGVOYW1lKSk7CisgICAgb3B0aW9ucy5oYXNoLnRlbXBs
YXRlID0gY29udGFpbmVyLmxvb2t1cCh0ZW1wbGF0ZU5hbWUpOworCiAgICAgb3B0aW9ucy5oYXNo
LmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwogCi0gICAgaWYgKHJvdXRlcikgeworICAgIGlmIChy
b3V0ZXIgJiYgIWNvbnRleHQpIHsKICAgICAgIHJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcobmFt
ZSwgdmlldyk7CiAgICAgfQogCiAgICAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs
bCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKICAgfSk7Ci0KIH0pOwogCiB9KSgpOwpAQCAtMjM4MzQs
MTIgKzM2NTAyLDEzIEBAIEVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9u
KEhhbmRsZWJhcnMpIHsKICovCiBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5j
dGlvbihIYW5kbGViYXJzKSB7CiAKLSAgdmFyIHJlc29sdmVQYXJhbXMgPSBFbWJlci5IYW5kbGVi
YXJzLnJlc29sdmVQYXJhbXMsCisgIHZhciByZXNvbHZlUGFyYW1zID0gRW1iZXIuUm91dGVyLnJl
c29sdmVQYXJhbXMsCiAgICAgICBpc1NpbXBsZUNsaWNrID0gRW1iZXIuVmlld1V0aWxzLmlzU2lt
cGxlQ2xpY2s7CiAKICAgdmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVyLkhhbmRsZWJhcnMsCiAg
ICAgICBoYW5kbGViYXJzR2V0ID0gRW1iZXJIYW5kbGViYXJzLmdldCwKICAgICAgIFNhZmVTdHJp
bmcgPSBFbWJlckhhbmRsZWJhcnMuU2FmZVN0cmluZywKKyAgICAgIGZvckVhY2ggPSBFbWJlci5B
cnJheVBvbHlmaWxscy5mb3JFYWNoLAogICAgICAgZ2V0ID0gRW1iZXIuZ2V0LAogICAgICAgYV9z
bGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKIApAQCAtMjM4NTcsMjIgKzM2NTI2LDUxIEBA
IEVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsK
ICAgICByZWdpc3RlcmVkQWN0aW9uczoge30KICAgfTsKIAotICBBY3Rpb25IZWxwZXIucmVnaXN0
ZXJBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25OYW1lLCBvcHRpb25zKSB7CisgIHZhciBrZXlzID0g
WyJhbHQiLCAic2hpZnQiLCAibWV0YSIsICJjdHJsIl07CisKKyAgdmFyIFBPSU5URVJfRVZFTlRf
VFlQRV9SRUdFWCA9IC9eY2xpY2t8bW91c2V8dG91Y2gvOworCisgIHZhciBpc0FsbG93ZWRFdmVu
dCA9IGZ1bmN0aW9uKGV2ZW50LCBhbGxvd2VkS2V5cykgeworICAgIGlmICh0eXBlb2YgYWxsb3dl
ZEtleXMgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBpZiAoUE9JTlRFUl9FVkVOVF9UWVBFX1JF
R0VYLnRlc3QoZXZlbnQudHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGlzU2ltcGxlQ2xpY2soZXZl
bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWxsb3dlZEtleXMgPSAnJzsKKyAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAoYWxsb3dlZEtleXMuaW5kZXhPZigiYW55IikgPj0gMCkgeworICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmFyIGFsbG93ZWQgPSB0cnVlOworCisgICAg
Zm9yRWFjaC5jYWxsKGtleXMsIGZ1bmN0aW9uKGtleSkgeworICAgICAgaWYgKGV2ZW50W2tleSAr
ICJLZXkiXSAmJiBhbGxvd2VkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7CisgICAgICAgIGFs
bG93ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBhbGxvd2VkOwor
ICB9OworCisgIEFjdGlvbkhlbHBlci5yZWdpc3RlckFjdGlvbiA9IGZ1bmN0aW9uKGFjdGlvbk5h
bWUsIG9wdGlvbnMsIGFsbG93ZWRLZXlzKSB7CiAgICAgdmFyIGFjdGlvbklkID0gKCsrRW1iZXIu
dXVpZCkudG9TdHJpbmcoKTsKIAogICAgIEFjdGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1th
Y3Rpb25JZF0gPSB7CiAgICAgICBldmVudE5hbWU6IG9wdGlvbnMuZXZlbnROYW1lLAotICAgICAg
aGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgICAgaWYgKCFpc1NpbXBsZUNsaWNrKGV2
ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwor
ICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlUmVnaXN0ZXJlZEFjdGlvbihldmVudCkgewor
ICAgICAgICBpZiAoIWlzQWxsb3dlZEV2ZW50KGV2ZW50LCBhbGxvd2VkS2V5cykpIHsgcmV0dXJu
IHRydWU7IH0KKworICAgICAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAhPT0gZmFsc2Up
IHsKKyAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9CiAKICAgICAg
ICAgaWYgKG9wdGlvbnMuYnViYmxlcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICBldmVudC5zdG9w
UHJvcGFnYXRpb24oKTsKICAgICAgICAgfQogCi0gICAgICAgIHZhciB2aWV3ID0gb3B0aW9ucy52
aWV3LAotICAgICAgICAgICAgY29udGV4dHMgPSBvcHRpb25zLmNvbnRleHRzLAotICAgICAgICAg
ICAgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQ7CisgICAgICAgIHZhciB0YXJnZXQgPSBvcHRpb25z
LnRhcmdldDsKIAogICAgICAgICBpZiAodGFyZ2V0LnRhcmdldCkgewogICAgICAgICAgIHRhcmdl
dCA9IGhhbmRsZWJhcnNHZXQodGFyZ2V0LnJvb3QsIHRhcmdldC50YXJnZXQsIHRhcmdldC5vcHRp
b25zKTsKQEAgLTIzODgwLDcgKzM2NTc4LDcgQEAgRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGVi
YXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgewogICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5y
b290OwogICAgICAgICB9CiAKLSAgICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgeworICAgICAg
ICBFbWJlci5ydW4oZnVuY3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigpIHsKICAgICAgICAgICBp
ZiAodGFyZ2V0LnNlbmQpIHsKICAgICAgICAgICAgIHRhcmdldC5zZW5kLmFwcGx5KHRhcmdldCwg
YXJncyhvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbk5hbWUpKTsKICAgICAgICAgICB9IGVsc2Ug
ewpAQCAtMjM5MDAsNDIgKzM2NTk4LDM1IEBAIEVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFy
cycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKIAogICAvKioKICAgICBUaGUgYHt7YWN0aW9ufX1g
IGhlbHBlciByZWdpc3RlcnMgYW4gSFRNTCBlbGVtZW50IHdpdGhpbiBhIHRlbXBsYXRlIGZvciBE
T00KLSAgICBldmVudCBoYW5kbGluZyBhbmQgZm9yd2FyZHMgdGhhdCBpbnRlcmFjdGlvbiB0byB0
aGUgdmlldydzIGNvbnRyb2xsZXIKKyAgICBldmVudCBoYW5kbGluZyBhbmQgZm9yd2FyZHMgdGhh
dCBpbnRlcmFjdGlvbiB0byB0aGUgdGVtcGxhdGVzJ3MgY29udHJvbGxlcgogICAgIG9yIHN1cHBs
aWVkIGB0YXJnZXRgIG9wdGlvbiAoc2VlICdTcGVjaWZ5aW5nIGEgVGFyZ2V0JykuCiAKLSAgICBJ
ZiB0aGUgdmlldydzIGNvbnRyb2xsZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBldmVudCwgdGhl
IGV2ZW50IGlzIHNlbnQKKyAgICBJZiB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBpbXBsZW1lbnQg
dGhlIGV2ZW50LCB0aGUgZXZlbnQgaXMgc2VudAogICAgIHRvIHRoZSBjdXJyZW50IHJvdXRlLCBh
bmQgaXQgYnViYmxlcyB1cCB0aGUgcm91dGUgaGllcmFyY2h5IGZyb20gdGhlcmUuCiAKICAgICBV
c2VyIGludGVyYWN0aW9uIHdpdGggdGhhdCBlbGVtZW50IHdpbGwgaW52b2tlIHRoZSBzdXBwbGll
ZCBhY3Rpb24gbmFtZSBvbgogICAgIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQuCiAKLSAgICBHaXZl
biB0aGUgZm9sbG93aW5nIEhhbmRsZWJhcnMgdGVtcGxhdGUgb24gdGhlIHBhZ2UKKyAgICBHaXZl
biB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIEhhbmRsZWJhcnMgdGVtcGxhdGUgb24gdGhlIHBh
Z2UKIAogICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8c2NyaXB0IHR5cGU9InRleHQveC1oYW5kbGVi
YXJzIiBkYXRhLXRlbXBsYXRlLW5hbWU9J2EtdGVtcGxhdGUnPgotICAgICAgPGRpdiB7e2FjdGlv
biBhbkFjdGlvbk5hbWV9fT4KLSAgICAgICAgY2xpY2sgbWUKLSAgICAgIDwvZGl2PgotICAgIDwv
c2NyaXB0PgorICAgIDxkaXYge3thY3Rpb24gJ2FuQWN0aW9uTmFtZSd9fT4KKyAgICAgIGNsaWNr
IG1lCisgICAgPC9kaXY+CiAgICAgYGBgCiAKICAgICBBbmQgYXBwbGljYXRpb24gY29kZQogCiAg
ICAgYGBgamF2YXNjcmlwdAotICAgIEFDb250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRl
bmQoewotICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlvbigpIHt9Ci0gICAgfSk7Ci0KLSAgICBB
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNvbnRyb2xsZXI6IEFDb250cm9sbGVy
LmNyZWF0ZSgpLAotICAgICAgdGVtcGxhdGVOYW1lOiAnYS10ZW1wbGF0ZScKKyAgICBBcHAuQXBw
bGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgYWN0
aW9uczogeworICAgICAgICBhbkFjdGlvbk5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICB9Cisg
ICAgICB9CiAgICAgfSk7Ci0KLSAgICBhVmlldyA9IEFWaWV3LmNyZWF0ZSgpOwotICAgIGFWaWV3
LmFwcGVuZFRvKCdib2R5Jyk7CiAgICAgYGBgCiAKLSAgICBXaWxsIHJlc3VsdHMgaW4gdGhlIGZv
bGxvd2luZyByZW5kZXJlZCBIVE1MCisgICAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBy
ZW5kZXJlZCBIVE1MCiAKICAgICBgYGBodG1sCiAgICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+
CkBAIC0yMzk0NSw4ICszNjYzNiw4IEBAIEVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycs
IGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKICAgICA8L2Rpdj4KICAgICBgYGAKIAotICAgIENsaWNr
aW5nICJjbGljayBtZSIgd2lsbCB0cmlnZ2VyIHRoZSBgYW5BY3Rpb25OYW1lYCBtZXRob2Qgb2Yg
dGhlCi0gICAgYEFDb250cm9sbGVyYC4gSW4gdGhpcyBjYXNlLCBubyBhZGRpdGlvbmFsIHBhcmFt
ZXRlcnMgd2lsbCBiZSBwYXNzZWQuCisgICAgQ2xpY2tpbmcgImNsaWNrIG1lIiB3aWxsIHRyaWdn
ZXIgdGhlIGBhbkFjdGlvbk5hbWVgIGFjdGlvbiBvZiB0aGUKKyAgICBgQXBwLkFwcGxpY2F0aW9u
Q29udHJvbGxlcmAuIEluIHRoaXMgY2FzZSwgbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHdpbGwg
YmUgcGFzc2VkLgogCiAgICAgSWYgeW91IHByb3ZpZGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRv
IHRoZSBoZWxwZXI6CiAKQEAgLTIzOTYxLDE2ICszNjY1MiwyNCBAQCBFbWJlci5vbkxvYWQoJ0Vt
YmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7CiAKICAgICBFdmVudHMgdHJp
Z2dlcmVkIHRocm91Z2ggdGhlIGFjdGlvbiBoZWxwZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGhhdmUK
ICAgICBgLnByZXZlbnREZWZhdWx0KClgIGNhbGxlZCBvbiB0aGVtLiBZb3UgZG8gbm90IG5lZWQg
dG8gZG8gc28gaW4geW91ciBldmVudAotICAgIGhhbmRsZXJzLgorICAgIGhhbmRsZXJzLiBJZiB5
b3UgbmVlZCB0byBhbGxvdyBldmVudCBwcm9wYWdhdGlvbiAodG8gaGFuZGxlIGZpbGUgaW5wdXRz
IGZvcgorICAgIGV4YW1wbGUpIHlvdSBjYW4gc3VwcGx5IHRoZSBgcHJldmVudERlZmF1bHQ9ZmFs
c2VgIG9wdGlvbiB0byB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlcjoKKworICAgIGBgYGhhbmRsZWJh
cnMKKyAgICA8ZGl2IHt7YWN0aW9uICJzYXlIZWxsbyIgcHJldmVudERlZmF1bHQ9ZmFsc2V9fT4K
KyAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiAvPgorICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94
IiAvPgorICAgIDwvZGl2PgorICAgIGBgYAogCi0gICAgVG8gYWxzbyBkaXNhYmxlIGJ1YmJsaW5n
LCBwYXNzIGBidWJibGVzPWZhbHNlYCB0byB0aGUgaGVscGVyOgorICAgIFRvIGRpc2FibGUgYnVi
YmxpbmcsIHBhc3MgYGJ1YmJsZXM9ZmFsc2VgIHRvIHRoZSBoZWxwZXI6CiAKICAgICBgYGBoYW5k
bGViYXJzCiAgICAgPGJ1dHRvbiB7e2FjdGlvbiAnZWRpdCcgcG9zdCBidWJibGVzPWZhbHNlfX0+
RWRpdDwvYnV0dG9uPgogICAgIGBgYAogCiAgICAgSWYgeW91IG5lZWQgdGhlIGRlZmF1bHQgaGFu
ZGxlciB0byB0cmlnZ2VyIHlvdSBzaG91bGQgZWl0aGVyIHJlZ2lzdGVyIHlvdXIKLSAgICBvd24g
ZXZlbnQgaGFuZGxlciwgb3IgdXNlIGV2ZW50IG1ldGhvZHMgb24geW91ciB2aWV3IGNsYXNzLiBT
ZWUgYEVtYmVyLlZpZXdgCisgICAgb3duIGV2ZW50IGhhbmRsZXIsIG9yIHVzZSBldmVudCBtZXRo
b2RzIG9uIHlvdXIgdmlldyBjbGFzcy4gU2VlIFtFbWJlci5WaWV3XSgvYXBpL2NsYXNzZXMvRW1i
ZXIuVmlldy5odG1sKQogICAgICdSZXNwb25kaW5nIHRvIEJyb3dzZXIgRXZlbnRzJyBmb3IgbW9y
ZSBpbmZvcm1hdGlvbi4KIAogICAgICMjIyBTcGVjaWZ5aW5nIERPTSBldmVudCB0eXBlCkBAIC0y
Mzk3OSwxMSArMzY2NzgsOSBAQCBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5j
dGlvbihIYW5kbGViYXJzKSB7CiAgICAgc3VwcGx5IGFuIGBvbmAgb3B0aW9uIHRvIHRoZSBoZWxw
ZXIgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBET00gZXZlbnQgbmFtZToKIAogICAgIGBgYGhhbmRs
ZWJhcnMKLSAgICA8c2NyaXB0IHR5cGU9InRleHQveC1oYW5kbGViYXJzIiBkYXRhLXRlbXBsYXRl
LW5hbWU9J2EtdGVtcGxhdGUnPgotICAgICAgPGRpdiB7e2FjdGlvbiBhbkFjdGlvbk5hbWUgb249
ImRvdWJsZUNsaWNrIn19PgotICAgICAgICBjbGljayBtZQotICAgICAgPC9kaXY+Ci0gICAgPC9z
Y3JpcHQ+CisgICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rpb25OYW1lIiBvbj0iZG91YmxlQ2xpY2si
fX0+CisgICAgICBjbGljayBtZQorICAgIDwvZGl2PgogICAgIGBgYAogCiAgICAgU2VlIGBFbWJl
ci5WaWV3YCAnUmVzcG9uZGluZyB0byBCcm93c2VyIEV2ZW50cycgZm9yIGEgbGlzdCBvZgpAQCAt
MjM5OTUsNiArMzY2OTIsMjcgQEAgRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywgZnVu
Y3Rpb24oSGFuZGxlYmFycykgewogICAgIGlzIGNyZWF0ZWQuIEhhdmluZyBhbiBpbnN0YW5jZSBv
ZiBgRW1iZXIuQXBwbGljYXRpb25gIHdpbGwgc2F0aXNmeSB0aGlzCiAgICAgcmVxdWlyZW1lbnQu
CiAKKyAgICAjIyMgU3BlY2lmeWluZyB3aGl0ZWxpc3RlZCBtb2RpZmllciBrZXlzCisKKyAgICBC
eSBkZWZhdWx0IHRoZSBge3thY3Rpb259fWAgaGVscGVyIHdpbGwgaWdub3JlIGNsaWNrIGV2ZW50
IHdpdGggcHJlc3NlZCBtb2RpZmllcgorICAgIGtleXMuIFlvdSBjYW4gc3VwcGx5IGFuIGBhbGxv
d2VkS2V5c2Agb3B0aW9uIHRvIHNwZWNpZnkgd2hpY2gga2V5cyBzaG91bGQgbm90IGJlIGlnbm9y
ZWQuCisKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rpb25OYW1l
IiBhbGxvd2VkS2V5cz0iYWx0In19PgorICAgICAgY2xpY2sgbWUKKyAgICA8L2Rpdj4KKyAgICBg
YGAKKworICAgIFRoaXMgd2F5IHRoZSBge3thY3Rpb259fWAgd2lsbCBmaXJlIHdoZW4gY2xpY2tp
bmcgd2l0aCB0aGUgYWx0IGtleSBwcmVzc2VkIGRvd24uCisKKyAgICBBbHRlcm5hdGl2ZWx5LCBz
dXBwbHkgImFueSIgdG8gdGhlIGBhbGxvd2VkS2V5c2Agb3B0aW9uIHRvIGFjY2VwdCBhbnkgY29t
YmluYXRpb24gb2YgbW9kaWZpZXIga2V5cy4KKworICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2
IHt7YWN0aW9uICJhbkFjdGlvbk5hbWUiIGFsbG93ZWRLZXlzPSJhbnkifX0+CisgICAgICBjbGlj
ayBtZSB3aXRoIGFueSBrZXkgcHJlc3NlZAorICAgIDwvZGl2PgorICAgIGBgYAorCiAgICAgIyMj
IFNwZWNpZnlpbmcgYSBUYXJnZXQKIAogICAgIFRoZXJlIGFyZSBzZXZlcmFsIHBvc3NpYmxlIHRh
cmdldCBvYmplY3RzIGZvciBge3thY3Rpb259fWAgaGVscGVyczoKQEAgLTI0MDA1LDQ2ICszNjcy
MywyNCBAQCBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGVi
YXJzKSB7CiAKICAgICBBbHRlcm5hdGl2ZWx5LCBhIGB0YXJnZXRgIG9wdGlvbiBjYW4gYmUgcHJv
dmlkZWQgdG8gdGhlIGhlbHBlciB0byBjaGFuZ2UKICAgICB3aGljaCBvYmplY3Qgd2lsbCByZWNl
aXZlIHRoZSBtZXRob2QgY2FsbC4gVGhpcyBvcHRpb24gbXVzdCBiZSBhIHBhdGgKLSAgICBwYXRo
IHRvIGFuIG9iamVjdCwgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBjb250ZXh0OgotCi0gICAg
YGBgaGFuZGxlYmFycwotICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEt
dGVtcGxhdGUtbmFtZT0nYS10ZW1wbGF0ZSc+Ci0gICAgICA8ZGl2IHt7YWN0aW9uIGFuQWN0aW9u
TmFtZSB0YXJnZXQ9Ik15QXBwbGljYXRpb24uc29tZU9iamVjdCJ9fT4KLSAgICAgICAgY2xpY2sg
bWUKLSAgICAgIDwvZGl2PgotICAgIDwvc2NyaXB0PgotICAgIGBgYAotCi0gICAgQ2xpY2tpbmcg
ImNsaWNrIG1lIiBpbiB0aGUgcmVuZGVyZWQgSFRNTCBvZiB0aGUgYWJvdmUgdGVtcGxhdGUgd2ls
bCB0cmlnZ2VyCi0gICAgdGhlICBgYW5BY3Rpb25OYW1lYCBtZXRob2Qgb2YgdGhlIG9iamVjdCBh
dCBgTXlBcHBsaWNhdGlvbi5zb21lT2JqZWN0YC4KLQotICAgIElmIGFuIGFjdGlvbidzIHRhcmdl
dCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBtZXRob2QgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZAot
ICAgIGFjdGlvbiBuYW1lIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLgorICAgIHRvIGFuIG9iamVj
dCwgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBjb250ZXh0OgogCiAgICAgYGBgaGFuZGxlYmFy
cwotICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxhdGUtbmFt
ZT0nYS10ZW1wbGF0ZSc+Ci0gICAgICA8ZGl2IHt7YWN0aW9uIGFNZXRob2ROYW1lVGhhdElzTWlz
c2luZ319PgotICAgICAgICBjbGljayBtZQotICAgICAgPC9kaXY+Ci0gICAgPC9zY3JpcHQ+Cisg
ICAge3shIHRoZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSB9fQorICAgIDxkaXYge3thY3Rpb24gImFu
QWN0aW9uTmFtZSIgdGFyZ2V0PXZpZXd9fT4KKyAgICAgIGNsaWNrIG1lCisgICAgPC9kaXY+CiAg
ICAgYGBgCiAKLSAgICBXaXRoIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY29kZQotCiAgICAg
YGBgamF2YXNjcmlwdAotICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgdGVt
cGxhdGVOYW1lOyAnYS10ZW1wbGF0ZScsCi0gICAgICAvLyBub3RlOiBubyBtZXRob2QgJ2FNZXRo
b2ROYW1lVGhhdElzTWlzc2luZycKLSAgICAgIGFuQWN0aW9uTmFtZTogZnVuY3Rpb24oZXZlbnQp
IHt9CisgICAgQXBwLkFwcGxpY2F0aW9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAg
IGFjdGlvbnM6IHsKKyAgICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlvbigpe30KKyAgICAgIH0K
ICAgICB9KTsKIAotICAgIGFWaWV3ID0gQVZpZXcuY3JlYXRlKCk7Ci0gICAgYVZpZXcuYXBwZW5k
VG8oJ2JvZHknKTsKICAgICBgYGAKIAotICAgIFdpbGwgdGhyb3cgYFVuY2F1Z2h0IFR5cGVFcnJv
cjogQ2Fubm90IGNhbGwgbWV0aG9kICdjYWxsJyBvZiB1bmRlZmluZWRgIHdoZW4KLSAgICAiY2xp
Y2sgbWUiIGlzIGNsaWNrZWQuCi0KICAgICAjIyMgQWRkaXRpb25hbCBQYXJhbWV0ZXJzCiAKICAg
ICBZb3UgbWF5IHNwZWNpZnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBge3thY3Rpb259
fWAgaGVscGVyLiBUaGVzZQpAQCAtMjQwNTIsMTcgKzM2NzQ4LDE1IEBAIEVtYmVyLm9uTG9hZCgn
RW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKICAgICBpbXBsZW1lbnRp
bmcgdGhlIGFjdGlvbi4KIAogICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8c2NyaXB0IHR5cGU9InRl
eHQveC1oYW5kbGViYXJzIiBkYXRhLXRlbXBsYXRlLW5hbWU9J2EtdGVtcGxhdGUnPgotICAgICAg
e3sjZWFjaCBwZXJzb24gaW4gcGVvcGxlfX0KLSAgICAgICAgPGRpdiB7e2FjdGlvbiBlZGl0IHBl
cnNvbn19PgotICAgICAgICAgIGNsaWNrIG1lCi0gICAgICAgIDwvZGl2PgotICAgICAge3svZWFj
aH19Ci0gICAgPC9zY3JpcHQ+CisgICAge3sjZWFjaCBwZXJzb24gaW4gcGVvcGxlfX0KKyAgICAg
IDxkaXYge3thY3Rpb24gImVkaXQiIHBlcnNvbn19PgorICAgICAgICBjbGljayBtZQorICAgICAg
PC9kaXY+CisgICAge3svZWFjaH19CiAgICAgYGBgCiAKLSAgICBDbGlja2luZyAiY2xpY2sgbWUi
IHdpbGwgdHJpZ2dlciB0aGUgYGVkaXRgIG1ldGhvZCBvbiB0aGUgY3VycmVudCB2aWV3J3MKLSAg
ICBjb250cm9sbGVyIHdpdGggdGhlIGN1cnJlbnQgcGVyc29uIGFzIGEgcGFyYW1ldGVyLgorICAg
IENsaWNraW5nICJjbGljayBtZSIgd2lsbCB0cmlnZ2VyIHRoZSBgZWRpdGAgbWV0aG9kIG9uIHRo
ZSBjdXJyZW50IGNvbnRyb2xsZXIKKyAgICB3aXRoIHRoZSB2YWx1ZSBvZiBgcGVyc29uYCBhcyBh
IHBhcmFtZXRlci4KIAogICAgIEBtZXRob2QgYWN0aW9uCiAgICAgQGZvciBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMKQEAgLTI0MDcwLDEzICszNjc2NCwxMiBAQCBFbWJlci5vbkxvYWQoJ0VtYmVy
LkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7CiAgICAgQHBhcmFtIHtPYmplY3R9
IFtjb250ZXh0XSoKICAgICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKICAgKi8KLSAgRW1iZXJIYW5k
bGViYXJzLnJlZ2lzdGVySGVscGVyKCdhY3Rpb24nLCBmdW5jdGlvbihhY3Rpb25OYW1lKSB7Cisg
IEVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYWN0aW9uJywgZnVuY3Rpb24gYWN0aW9u
SGVscGVyKGFjdGlvbk5hbWUpIHsKICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVu
dHMubGVuZ3RoIC0gMV0sCiAgICAgICAgIGNvbnRleHRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50
cywgMSwgLTEpOwogCiAgICAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsCi0gICAgICAgIHZpZXcg
PSBvcHRpb25zLmRhdGEudmlldywKLSAgICAgICAgY29udHJvbGxlciwgbGluazsKKyAgICAgICAg
Y29udHJvbGxlcjsKIAogICAgIC8vIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhbG9uZyB0byByZWdp
c3RlckFjdGlvbgogICAgIHZhciBhY3Rpb24gPSB7CkBAIC0yNDA4OSw3ICszNjc4Miw3IEBAIEVt
YmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKICAg
ICAgIHBhcmFtczogY29udGV4dHMKICAgICB9OwogCi0gICAgYWN0aW9uLnZpZXcgPSB2aWV3ID0g
Z2V0KHZpZXcsICdjb25jcmV0ZVZpZXcnKTsKKyAgICBhY3Rpb24udmlldyA9IG9wdGlvbnMuZGF0
YS52aWV3OwogCiAgICAgdmFyIHJvb3QsIHRhcmdldDsKIApAQCAtMjQxMDIsOCArMzY3OTUsOSBA
QCBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7
CiAKICAgICBhY3Rpb24udGFyZ2V0ID0geyByb290OiByb290LCB0YXJnZXQ6IHRhcmdldCwgb3B0
aW9uczogb3B0aW9ucyB9OwogICAgIGFjdGlvbi5idWJibGVzID0gaGFzaC5idWJibGVzOworICAg
IGFjdGlvbi5wcmV2ZW50RGVmYXVsdCA9IGhhc2gucHJldmVudERlZmF1bHQ7CiAKLSAgICB2YXIg
YWN0aW9uSWQgPSBBY3Rpb25IZWxwZXIucmVnaXN0ZXJBY3Rpb24oYWN0aW9uTmFtZSwgYWN0aW9u
KTsKKyAgICB2YXIgYWN0aW9uSWQgPSBBY3Rpb25IZWxwZXIucmVnaXN0ZXJBY3Rpb24oYWN0aW9u
TmFtZSwgYWN0aW9uLCBoYXNoLmFsbG93ZWRLZXlzKTsKICAgICByZXR1cm4gbmV3IFNhZmVTdHJp
bmcoJ2RhdGEtZW1iZXItYWN0aW9uPSInICsgYWN0aW9uSWQgKyAnIicpOwogICB9KTsKIApAQCAt
MjQxMTQsMTAwICszNjgwOCw1NiBAQCBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBm
dW5jdGlvbihIYW5kbGViYXJzKSB7CiAKIAogKGZ1bmN0aW9uKCkgeworCit9KSgpOworCisKKwor
KGZ1bmN0aW9uKCkgewogLyoqCiBAbW9kdWxlIGVtYmVyCiBAc3VibW9kdWxlIGVtYmVyLXJvdXRp
bmcKICovCiAKLWlmIChFbWJlci5FTlYuRVhQRVJJTUVOVEFMX0NPTlRST0xfSEVMUEVSKSB7Ci0g
IHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKK3ZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKIAorRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CiAg
IC8qKgotICAgIFRoZSBjb250cm9sIGhlbHBlciBpcyBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1l
bnQgYW5kIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLgotICAgIFRvIGVuYWJsZSBpdCwgc2V0
IGBFTlYuRVhQRVJJTUVOVEFMX0NPTlRST0xfSEVMUEVSID0gdHJ1ZWAgYmVmb3JlIHJlcXVpcmlu
ZyBFbWJlci4KLQotICAgIEBtZXRob2QgY29udHJvbAotICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFy
cy5oZWxwZXJzCi0gICAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKLSAgICBAcGFyYW0ge1N0cmluZ30g
bW9kZWxQYXRoCi0gICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0gICAgQHJldHVybiB7U3RyaW5n
fSBIVE1MIHN0cmluZwotICAqLwotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdj
b250cm9sJywgZnVuY3Rpb24ocGF0aCwgbW9kZWxQYXRoLCBvcHRpb25zKSB7Ci0gICAgaWYgKGFy
Z3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgIG9wdGlvbnMgPSBtb2RlbFBhdGg7Ci0gICAg
ICBtb2RlbFBhdGggPSB1bmRlZmluZWQ7Ci0gICAgfQotCi0gICAgdmFyIG1vZGVsOwotCi0gICAg
aWYgKG1vZGVsUGF0aCkgewotICAgICAgbW9kZWwgPSBFbWJlci5IYW5kbGViYXJzLmdldCh0aGlz
LCBtb2RlbFBhdGgsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHZhciBjb250cm9sbGVyID0gb3B0
aW9ucy5kYXRhLmtleXdvcmRzLmNvbnRyb2xsZXIsCi0gICAgICAgIHZpZXcgPSBvcHRpb25zLmRh
dGEua2V5d29yZHMudmlldywKLSAgICAgICAgY2hpbGRyZW4gPSBnZXQoY29udHJvbGxlciwgJ19j
aGlsZENvbnRhaW5lcnMnKSwKLSAgICAgICAgY29udHJvbElEID0gb3B0aW9ucy5oYXNoLmNvbnRy
b2xJRCwKLSAgICAgICAgY29udGFpbmVyLCBzdWJDb250YWluZXI7Ci0KLSAgICBpZiAoY2hpbGRy
ZW4uaGFzT3duUHJvcGVydHkoY29udHJvbElEKSkgewotICAgICAgc3ViQ29udGFpbmVyID0gY2hp
bGRyZW5bY29udHJvbElEXTsKLSAgICB9IGVsc2UgewotICAgICAgY29udGFpbmVyID0gZ2V0KGNv
bnRyb2xsZXIsICdjb250YWluZXInKSwKLSAgICAgIHN1YkNvbnRhaW5lciA9IGNvbnRhaW5lci5j
aGlsZCgpOwotICAgICAgY2hpbGRyZW5bY29udHJvbElEXSA9IHN1YkNvbnRhaW5lcjsKLSAgICB9
Ci0KLSAgICB2YXIgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL1wvL2csICcuJyk7Cisg
ICAgVHJhbnNpdGlvbiB0aGUgYXBwbGljYXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBUaGUgcm91
dGUgbWF5CisgICAgYmUgZWl0aGVyIGEgc2luZ2xlIHJvdXRlIG9yIHJvdXRlIHBhdGg6CiAKLSAg
ICB2YXIgY2hpbGRWaWV3ID0gc3ViQ29udGFpbmVyLmxvb2t1cCgndmlldzonICsgbm9ybWFsaXpl
ZFBhdGgpIHx8IHN1YkNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6ZGVmYXVsdCcpLAotICAgICAgICBj
aGlsZENvbnRyb2xsZXIgPSBzdWJDb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBub3Jt
YWxpemVkUGF0aCksCi0gICAgICAgIGNoaWxkVGVtcGxhdGUgPSBzdWJDb250YWluZXIubG9va3Vw
KCd0ZW1wbGF0ZTonICsgcGF0aCk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5k
IGNvbnRyb2xsZXIgZm9yIHBhdGg6ICIgKyBub3JtYWxpemVkUGF0aCwgY2hpbGRDb250cm9sbGVy
KTsKLSAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIHZpZXcgZm9yIHBhdGg6ICIgKyBu
b3JtYWxpemVkUGF0aCwgY2hpbGRWaWV3KTsKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgYUNvbnRy
b2xsZXIudHJhbnNpdGlvblRvUm91dGUoJ2Jsb2dQb3N0cycpOworICAgIGFDb250cm9sbGVyLnRy
YW5zaXRpb25Ub1JvdXRlKCdibG9nUG9zdHMucmVjZW50RW50cmllcycpOworICAgIGBgYAogCi0g
ICAgc2V0KGNoaWxkQ29udHJvbGxlciwgJ3RhcmdldCcsIGNvbnRyb2xsZXIpOwotICAgIHNldChj
aGlsZENvbnRyb2xsZXIsICdtb2RlbCcsIG1vZGVsKTsKKyAgICBPcHRpb25hbGx5IHN1cHBseSBh
IG1vZGVsIGZvciB0aGUgcm91dGUgaW4gcXVlc3Rpb24uIFRoZSBtb2RlbAorICAgIHdpbGwgYmUg
c2VyaWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhlIGBzZXJpYWxpemVgIGhvb2sgb2YKKyAg
ICB0aGUgcm91dGU6CiAKLSAgICBvcHRpb25zLmhhc2gudGVtcGxhdGUgPSBjaGlsZFRlbXBsYXRl
OwotICAgIG9wdGlvbnMuaGFzaC5jb250cm9sbGVyID0gY2hpbGRDb250cm9sbGVyOworICAgIGBg
YGphdmFzY3JpcHQKKyAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3Qn
LCBhUG9zdCk7CisgICAgYGBgCiAKLSAgICBmdW5jdGlvbiBvYnNlcnZlcigpIHsKLSAgICAgIHZh
ciBtb2RlbCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHRoaXMsIG1vZGVsUGF0aCwgb3B0aW9ucyk7
Ci0gICAgICBzZXQoY2hpbGRDb250cm9sbGVyLCAnbW9kZWwnLCBtb2RlbCk7Ci0gICAgICBjaGls
ZFZpZXcucmVyZW5kZXIoKTsKLSAgICB9CisgICAgTXVsdGlwbGUgbW9kZWxzIHdpbGwgYmUgYXBw
bGllZCBsYXN0IHRvIGZpcnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQorICAgIHJlc291cmNlIHRyZWUu
CiAKLSAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlzLCBtb2RlbFBhdGgsIG9ic2VydmVyKTsKLSAg
ICBjaGlsZFZpZXcub25lKCd3aWxsRGVzdHJveUVsZW1lbnQnLCB0aGlzLCBmdW5jdGlvbigpIHsK
LSAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMsIG1vZGVsUGF0aCwgb2JzZXJ2ZXIpOwor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICB0aGlzLnJlc291cmNlKCdibG9nUG9zdCcsIHtwYXRoOic6
YmxvZ1Bvc3RJZCd9LCBmdW5jdGlvbigpeworICAgICAgdGhpcy5yZXNvdXJjZSgnYmxvZ0NvbW1l
bnQnLCB7cGF0aDogJzpibG9nQ29tbWVudElkJ30pOwogICAgIH0pOwogCi0gICAgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBjaGlsZFZpZXcsIG9wdGlvbnMpOwotICB9
KTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0q
LworICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nQ29tbWVudCcsIGFQb3N0
LCBhQ29tbWVudCk7CisgICAgYGBgCiAKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKKyAgICBTZWUgYWxzbyAncmVwbGFjZVJvdXRlJy4KIAotRW1iZXIuQ29udHJvbGxlck1p
eGluLnJlb3Blbih7CisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJv
dXRlCisgICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgdG8gYmUgdXNl
ZCB3aGlsZSB0cmFuc2l0aW9uaW5nCisgICAgdG8gdGhlIHJvdXRlLgorICAgIEBmb3IgRW1iZXIu
Q29udHJvbGxlck1peGluCisgICAgQG1ldGhvZCB0cmFuc2l0aW9uVG9Sb3V0ZQorICAqLwogICB0
cmFuc2l0aW9uVG9Sb3V0ZTogZnVuY3Rpb24oKSB7CiAgICAgLy8gdGFyZ2V0IG1heSBiZSBlaXRo
ZXIgYW5vdGhlciBjb250cm9sbGVyIG9yIGEgcm91dGVyCiAgICAgdmFyIHRhcmdldCA9IGdldCh0
aGlzLCAndGFyZ2V0JyksCkBAIC0yNDIxNSwxMSArMzY4NjUsNTEgQEAgRW1iZXIuQ29udHJvbGxl
ck1peGluLnJlb3Blbih7CiAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50
cyk7CiAgIH0sCiAKKyAgLyoqCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAZm9yIEVtYmVyLkNvbnRy
b2xsZXJNaXhpbgorICAgIEBtZXRob2QgdHJhbnNpdGlvblRvCisgICovCiAgIHRyYW5zaXRpb25U
bzogZnVuY3Rpb24oKSB7CiAgICAgRW1iZXIuZGVwcmVjYXRlKCJ0cmFuc2l0aW9uVG8gaXMgZGVw
cmVjYXRlZC4gUGxlYXNlIHVzZSB0cmFuc2l0aW9uVG9Sb3V0ZS4iKTsKICAgICByZXR1cm4gdGhp
cy50cmFuc2l0aW9uVG9Sb3V0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICB9LAogCisgIC8q
KgorICAgIFRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdoaWxlIHJlcGxhY2luZyB0aGUg
Y3VycmVudCBVUkwsIGlmIHBvc3NpYmxlLgorICAgIFRoaXMgd2lsbCByZXBsYWNlIHRoZSBjdXJy
ZW50IGhpc3RvcnkgZW50cnkgaW5zdGVhZCBvZiBhZGRpbmcgYSBuZXcgb25lLiAKKyAgICBCZXNp
ZGUgdGhhdCwgaXQgaXMgaWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9Sb3V0ZWAgaW4gYWxsIG90
aGVyIHJlc3BlY3RzLgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIGFDb250cm9sbGVyLnJlcGxh
Y2VSb3V0ZSgnYmxvZ1Bvc3RzJyk7CisgICAgYUNvbnRyb2xsZXIucmVwbGFjZVJvdXRlKCdibG9n
UG9zdHMucmVjZW50RW50cmllcycpOworICAgIGBgYAorCisgICAgT3B0aW9uYWxseSBzdXBwbHkg
YSBtb2RlbCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBUaGUgbW9kZWwKKyAgICB3aWxsIGJl
IHNlcmlhbGl6ZWQgaW50byB0aGUgVVJMIHVzaW5nIHRoZSBgc2VyaWFsaXplYCBob29rIG9mCisg
ICAgdGhlIHJvdXRlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIGFDb250cm9sbGVyLnJlcGxh
Y2VSb3V0ZSgnYmxvZ1Bvc3QnLCBhUG9zdCk7CisgICAgYGBgCisKKyAgICBNdWx0aXBsZSBtb2Rl
bHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkgdXAgdGhlCisgICAg
cmVzb3VyY2UgdHJlZS4KKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB0aGlzLnJlc291cmNlKCdi
bG9nUG9zdCcsIHtwYXRoOic6YmxvZ1Bvc3RJZCd9LCBmdW5jdGlvbigpeworICAgICAgdGhpcy5y
ZXNvdXJjZSgnYmxvZ0NvbW1lbnQnLCB7cGF0aDogJzpibG9nQ29tbWVudElkJ30pOworICAgIH0p
OworCisgICAgYUNvbnRyb2xsZXIucmVwbGFjZVJvdXRlKCdibG9nQ29tbWVudCcsIGFQb3N0LCBh
Q29tbWVudCk7CisgICAgYGBgCisKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBv
ZiB0aGUgcm91dGUKKyAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0
byBiZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKKyAgICB0byB0aGUgcm91dGUuCisgICAgQGZv
ciBFbWJlci5Db250cm9sbGVyTWl4aW4KKyAgICBAbWV0aG9kIHJlcGxhY2VSb3V0ZQorICAqLwog
ICByZXBsYWNlUm91dGU6IGZ1bmN0aW9uKCkgewogICAgIC8vIHRhcmdldCBtYXkgYmUgZWl0aGVy
IGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgogICAgIHZhciB0YXJnZXQgPSBnZXQodGhp
cywgJ3RhcmdldCcpLApAQCAtMjQyMjcsNiArMzY5MTcsMTEgQEAgRW1iZXIuQ29udHJvbGxlck1p
eGluLnJlb3Blbih7CiAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7
CiAgIH0sCiAKKyAgLyoqCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAZm9yIEVtYmVyLkNvbnRyb2xs
ZXJNaXhpbgorICAgIEBtZXRob2QgcmVwbGFjZVdpdGgKKyAgKi8KICAgcmVwbGFjZVdpdGg6IGZ1
bmN0aW9uKCkgewogICAgIEVtYmVyLmRlcHJlY2F0ZSgicmVwbGFjZVdpdGggaXMgZGVwcmVjYXRl
ZC4gUGxlYXNlIHVzZSByZXBsYWNlUm91dGUuIik7CiAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVJv
dXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CkBAIC0yNDI0NiwxMiArMzY5NDEsNTYgQEAgRW1i
ZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CiB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBF
bWJlci5zZXQ7CiAKIEVtYmVyLlZpZXcucmVvcGVuKHsKKworICAvKioKKyAgICBTZXRzIHRoZSBw
cml2YXRlIGBfb3V0bGV0c2Agb2JqZWN0IG9uIHRoZSB2aWV3LgorCisgICAgQG1ldGhvZCBpbml0
CisgICAqLwogICBpbml0OiBmdW5jdGlvbigpIHsKICAgICBzZXQodGhpcywgJ19vdXRsZXRzJywg
e30pOwogICAgIHRoaXMuX3N1cGVyKCk7CiAgIH0sCiAKKyAgLyoqCisgICAgTWFudWFsbHkgZmls
bCBhbnkgb2YgYSB2aWV3J3MgYHt7b3V0bGV0fX1gIGFyZWFzIHdpdGggdGhlCisgICAgc3VwcGxp
ZWQgdmlldy4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgTXlW
aWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgnQ2hpbGQgdmlldzoge3tvdXRsZXQgIm1haW4ifX0gJykKKyAgICB9KTsKKyAg
ICB2YXIgbXlWaWV3ID0gTXlWaWV3LmNyZWF0ZSgpOworICAgIG15Vmlldy5hcHBlbmRUbygnYm9k
eScpOworICAgIC8vIFRoZSBodG1sIGZvciBteVZpZXcgbm93IGxvb2tzIGxpa2U6CisgICAgLy8g
PGRpdiBpZD0iZW1iZXIyMjgiIGNsYXNzPSJlbWJlci12aWV3Ij5DaGlsZCB2aWV3OiA8L2Rpdj4K
KworICAgIHZhciBGb29WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGVtcGxhdGU6
IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPGgxPkZvbzwvaDE+ICcpCisgICAgfSk7CisgICAg
dmFyIGZvb1ZpZXcgPSBGb29WaWV3LmNyZWF0ZSgpOworICAgIG15Vmlldy5jb25uZWN0T3V0bGV0
KCdtYWluJywgZm9vVmlldyk7CisgICAgLy8gVGhlIGh0bWwgZm9yIG15VmlldyBub3cgbG9va3Mg
bGlrZToKKyAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVyLXZpZXciPkNoaWxk
IHZpZXc6CisgICAgLy8gICA8ZGl2IGlkPSJlbWJlcjIzNCIgY2xhc3M9ImVtYmVyLXZpZXciPjxo
MT5Gb288L2gxPiA8L2Rpdj4KKyAgICAvLyA8L2Rpdj4KKyAgICBgYGAKKyAgICBAbWV0aG9kIGNv
bm5lY3RPdXRsZXQKKyAgICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUgQSB1bmlxdWUgbmFt
ZSBmb3IgdGhlIG91dGxldAorICAgIEBwYXJhbSAge09iamVjdH0gdmlldyAgICAgICBBbiBFbWJl
ci5WaWV3CisgICAqLwogICBjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihvdXRsZXROYW1lLCB2aWV3
KSB7CisgICAgaWYgKHRoaXMuX3BlbmRpbmdEaXNjb25uZWN0aW9ucykgeworICAgICAgZGVsZXRl
IHRoaXMuX3BlbmRpbmdEaXNjb25uZWN0aW9uc1tvdXRsZXROYW1lXTsKKyAgICB9CisKKyAgICBp
ZiAodGhpcy5faGFzRXF1aXZhbGVudFZpZXcob3V0bGV0TmFtZSwgdmlldykpIHsKKyAgICAgIHZp
ZXcuZGVzdHJveSgpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHZhciBvdXRsZXRzID0g
Z2V0KHRoaXMsICdfb3V0bGV0cycpLAogICAgICAgICBjb250YWluZXIgPSBnZXQodGhpcywgJ2Nv
bnRhaW5lcicpLAogICAgICAgICByb3V0ZXIgPSBjb250YWluZXIgJiYgY29udGFpbmVyLmxvb2t1
cCgncm91dGVyOm1haW4nKSwKQEAgLTI0MjY0LDEwICszNzAwMyw4MCBAQCBFbWJlci5WaWV3LnJl
b3Blbih7CiAgICAgfQogICB9LAogCisgIC8qKgorICAgIERldGVybWluZXMgaWYgdGhlIHZpZXcg
aGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGJ5IGNoZWNraW5nIGlmCisgICAgdGhlIHZpZXcgaGFz
IHRoZSBzYW1lIGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZSwgYW5kIGNvbnRleHQgYXMgdGhlCisgICAg
dmlldyBpbiB0aGUgYF9vdXRsZXRzYCBvYmplY3QuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRo
b2QgX2hhc0VxdWl2YWxlbnRWaWV3CisgICAgQHBhcmFtICB7U3RyaW5nfSBvdXRsZXROYW1lIFRo
ZSBuYW1lIG9mIHRoZSBvdXRsZXQgd2UgYXJlIGNoZWNraW5nCisgICAgQHBhcmFtICB7T2JqZWN0
fSB2aWV3ICAgICAgIEFuIEVtYmVyLlZpZXcKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgKi8K
KyAgX2hhc0VxdWl2YWxlbnRWaWV3OiBmdW5jdGlvbihvdXRsZXROYW1lLCB2aWV3KSB7CisgICAg
dmFyIGV4aXN0aW5nVmlldyA9IGdldCh0aGlzLCAnX291dGxldHMuJytvdXRsZXROYW1lKTsKKyAg
ICByZXR1cm4gZXhpc3RpbmdWaWV3ICYmCisgICAgICBleGlzdGluZ1ZpZXcuY29uc3RydWN0b3Ig
PT09IHZpZXcuY29uc3RydWN0b3IgJiYKKyAgICAgIGV4aXN0aW5nVmlldy5nZXQoJ3RlbXBsYXRl
JykgPT09IHZpZXcuZ2V0KCd0ZW1wbGF0ZScpICYmCisgICAgICBleGlzdGluZ1ZpZXcuZ2V0KCdj
b250ZXh0JykgPT09IHZpZXcuZ2V0KCdjb250ZXh0Jyk7CisgIH0sCisKKyAgLyoqCisgICAgUmVt
b3ZlcyBhbiBvdXRsZXQgZnJvbSB0aGUgdmlldy4KKworICAgIEV4YW1wbGUKKworICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGVt
cGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnQ2hpbGQgdmlldzoge3tvdXRsZXQgIm1h
aW4ifX0gJykKKyAgICB9KTsKKyAgICB2YXIgbXlWaWV3ID0gTXlWaWV3LmNyZWF0ZSgpOworICAg
IG15Vmlldy5hcHBlbmRUbygnYm9keScpOworICAgIC8vIG15VmlldydzIGh0bWw6CisgICAgLy8g
PGRpdiBpZD0iZW1iZXIyMjgiIGNsYXNzPSJlbWJlci12aWV3Ij5DaGlsZCB2aWV3OiA8L2Rpdj4K
KworICAgIHZhciBGb29WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGVtcGxhdGU6
IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPGgxPkZvbzwvaDE+ICcpCisgICAgfSk7CisgICAg
dmFyIGZvb1ZpZXcgPSBGb29WaWV3LmNyZWF0ZSgpOworICAgIG15Vmlldy5jb25uZWN0T3V0bGV0
KCdtYWluJywgZm9vVmlldyk7CisgICAgLy8gbXlWaWV3J3MgaHRtbDoKKyAgICAvLyA8ZGl2IGlk
PSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVyLXZpZXciPkNoaWxkIHZpZXc6CisgICAgLy8gICA8ZGl2
IGlkPSJlbWJlcjIzNCIgY2xhc3M9ImVtYmVyLXZpZXciPjxoMT5Gb288L2gxPiA8L2Rpdj4KKyAg
ICAvLyA8L2Rpdj4KKworICAgIG15Vmlldy5kaXNjb25uZWN0T3V0bGV0KCdtYWluJyk7CisgICAg
Ly8gbXlWaWV3J3MgaHRtbDoKKyAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVy
LXZpZXciPkNoaWxkIHZpZXc6IDwvZGl2PgorICAgIGBgYAorCisgICAgQG1ldGhvZCBkaXNjb25u
ZWN0T3V0bGV0CisgICAgQHBhcmFtICB7U3RyaW5nfSBvdXRsZXROYW1lIFRoZSBuYW1lIG9mIHRo
ZSBvdXRsZXQgdG8gYmUgcmVtb3ZlZAorICAgKi8KICAgZGlzY29ubmVjdE91dGxldDogZnVuY3Rp
b24ob3V0bGV0TmFtZSkgeworICAgIGlmICghdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7
CisgICAgICB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMgPSB7fTsKKyAgICB9CisgICAgdGhp
cy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zW291dGxldE5hbWVdID0gdHJ1ZTsKKyAgICBFbWJlci5y
dW4ub25jZSh0aGlzLCAnX2ZpbmlzaERpc2Nvbm5lY3Rpb25zJyk7CisgIH0sCisKKyAgLyoqCisg
ICAgR2V0cyBhbiBvdXRsZXQgdGhhdCBpcyBwZW5kaW5nIGRpc2Nvbm5lY3Rpb24gYW5kIHRoZW4K
KyAgICBudWxsaWZ5cyB0aGUgb2JqZWN0IG9uIHRoZSBgX291dGxldGAgb2JqZWN0LgorCisgICAg
QHByaXZhdGUKKyAgICBAbWV0aG9kIF9maW5pc2hEaXNjb25uZWN0aW9ucworICAgKi8KKyAgX2Zp
bmlzaERpc2Nvbm5lY3Rpb25zOiBmdW5jdGlvbigpIHsKICAgICB2YXIgb3V0bGV0cyA9IGdldCh0
aGlzLCAnX291dGxldHMnKTsKKyAgICB2YXIgcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zID0gdGhpcy5f
cGVuZGluZ0Rpc2Nvbm5lY3Rpb25zOworICAgIHRoaXMuX3BlbmRpbmdEaXNjb25uZWN0aW9ucyA9
IG51bGw7CiAKLSAgICBzZXQob3V0bGV0cywgb3V0bGV0TmFtZSwgbnVsbCk7CisgICAgZm9yICh2
YXIgb3V0bGV0TmFtZSBpbiBwZW5kaW5nRGlzY29ubmVjdGlvbnMpIHsKKyAgICAgIHNldChvdXRs
ZXRzLCBvdXRsZXROYW1lLCBudWxsKTsKKyAgICB9CiAgIH0KIH0pOwogCkBAIC0yNDI3Niw2ICsz
NzA4NSwxOSBAQCBFbWJlci5WaWV3LnJlb3Blbih7CiAKIAogKGZ1bmN0aW9uKCkgeworLyoqCitA
bW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisqLworCisvLyBBZGQgYSBuZXcg
bmFtZWQgcXVldWUgYWZ0ZXIgdGhlICdhY3Rpb25zJyBxdWV1ZSAod2hlcmUgUlNWUCBwcm9taXNl
cworLy8gcmVzb2x2ZSksIHdoaWNoIGlzIHVzZWQgaW4gcm91dGVyIHRyYW5zaXRpb25zIHRvIHBy
ZXZlbnQgdW5uZWNlc3NhcnkKKy8vIGxvYWRpbmcgc3RhdGUgZW50cnkgaWYgYWxsIGNvbnRleHQg
cHJvbWlzZXMgcmVzb2x2ZSBvbiB0aGUgCisvLyAnYWN0aW9ucycgcXVldWUgZmlyc3QuCisKK3Zh
ciBxdWV1ZXMgPSBFbWJlci5ydW4ucXVldWVzLAorICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBv
bHlmaWxscy5pbmRleE9mOworcXVldWVzLnNwbGljZShpbmRleE9mLmNhbGwocXVldWVzLCAnYWN0
aW9ucycpICsgMSwgMCwgJ3JvdXRlclRyYW5zaXRpb25zJyk7CiAKIH0pKCk7CiAKQEAgLTI0Mjg5
LDM0ICszNzExMSwxMDIgQEAgRW1iZXIuVmlldy5yZW9wZW4oewogCiB2YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQ7CiAKLS8qCi0gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBg
bG9jYXRpb25gIEFQSSB1c2VkIGJ5IEVtYmVyJ3Mgcm91dGVyLgorLyoqCisgIEVtYmVyLkxvY2F0
aW9uIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YK
KyAgdGhlIGBsb2NhdGlvbmAgQVBJLgogCi0gIFRoYXQgQVBJIGlzOgorICAjIyBJbXBsZW1lbnRh
dGlvbnMKIAotICBnZXRVUkw6IHJldHVybnMgdGhlIGN1cnJlbnQgVVJMCi0gIHNldFVSTChwYXRo
KTogc2V0cyB0aGUgY3VycmVudCBVUkwKLSAgcmVwbGFjZVVSTChwYXRoKTogcmVwbGFjZSB0aGUg
Y3VycmVudCBVUkwgKG9wdGlvbmFsKQotICBvblVwZGF0ZVVSTChjYWxsYmFjayk6IHRyaWdnZXJz
IHRoZSBjYWxsYmFjayB3aGVuIHRoZSBVUkwgY2hhbmdlcwotICBmb3JtYXRVUkwodXJsKTogZm9y
bWF0cyBgdXJsYCB0byBiZSBwbGFjZWQgaW50byBgaHJlZmAgYXR0cmlidXRlCisgIFlvdSBjYW4g
cGFzcyBhbiBpbXBsZW1lbnRhdGlvbiBuYW1lIChgaGFzaGAsIGBoaXN0b3J5YCwgYG5vbmVgKSB0
byBmb3JjZSBhCisgIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBpbiB5b3Vy
IGFwcGxpY2F0aW9uLgogCi0gIENhbGxpbmcgc2V0VVJMIG9yIHJlcGxhY2VVUkwgd2lsbCBub3Qg
dHJpZ2dlciBvblVwZGF0ZVVSTCBjYWxsYmFja3MuCisgICMjIyBIYXNoTG9jYXRpb24KIAotICBU
T0RPOiBUaGlzIHNob3VsZCBwZXJoYXBzIGJlIG1vdmVkIHNvIHRoYXQgaXQncyB2aXNpYmxlIGlu
IHRoZSBkb2Mgb3V0cHV0LgotKi8KKyAgVXNpbmcgYEhhc2hMb2NhdGlvbmAgcmVzdWx0cyBpbiBV
UkxzIHdpdGggYSBgI2AgKGhhc2ggc2lnbikgc2VwYXJhdGluZyB0aGUKKyAgc2VydmVyIHNpZGUg
VVJMIHBvcnRpb24gb2YgdGhlIFVSTCBmcm9tIHRoZSBwb3J0aW9uIHRoYXQgaXMgdXNlZCBieSBF
bWJlci4KKyAgVGhpcyByZWxpZXMgdXBvbiB0aGUgYGhhc2hjaGFuZ2VgIGV2ZW50IGV4aXN0aW5n
IGluIHRoZSBicm93c2VyLgogCi0vKioKLSAgRW1iZXIuTG9jYXRpb24gcmV0dXJucyBhbiBpbnN0
YW5jZSBvZiB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZgotICB0aGUgYGxvY2F0aW9uYCBB
UEkuCisgIEV4YW1wbGU6CisKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICB0aGlzLnJlc291cmNlKCdwb3N0cycsIGZ1bmN0aW9uKCkgeworICAgICAg
dGhpcy5yb3V0ZSgnbmV3Jyk7CisgICAgfSk7CisgIH0pOworCisgIEFwcC5Sb3V0ZXIucmVvcGVu
KHsKKyAgICBsb2NhdGlvbjogJ2hhc2gnCisgIH0pOworICBgYGAKKworICBUaGlzIHdpbGwgcmVz
dWx0IGluIGEgcG9zdHMubmV3IHVybCBvZiBgLyMvcG9zdHMvbmV3YC4KKworICAjIyMgSGlzdG9y
eUxvY2F0aW9uCisKKyAgVXNpbmcgYEhpc3RvcnlMb2NhdGlvbmAgcmVzdWx0cyBpbiBVUkxzIHRo
YXQgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYQorICBzdGFuZGFyZCBVUkwuIFRoaXMgcmVs
aWVzIHVwb24gdGhlIGJyb3dzZXIncyBgaGlzdG9yeWAgQVBJLgorCisgIEV4YW1wbGU6CisKKyAg
YGBgamF2YXNjcmlwdAorICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICB0aGlzLnJl
c291cmNlKCdwb3N0cycsIGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5yb3V0ZSgnbmV3Jyk7Cisg
ICAgfSk7CisgIH0pOworCisgIEFwcC5Sb3V0ZXIucmVvcGVuKHsKKyAgICBsb2NhdGlvbjogJ2hp
c3RvcnknCisgIH0pOworICBgYGAKKworICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgcG9zdHMubmV3
IHVybCBvZiBgL3Bvc3RzL25ld2AuCisKKyAgIyMjIE5vbmVMb2NhdGlvbgogCi0gIFlvdSBjYW4g
cGFzcyBpdCBhIGBpbXBsZW1lbnRhdGlvbmAgKCdoYXNoJywgJ2hpc3RvcnknLCAnbm9uZScpIHRv
IGZvcmNlIGEKLSAgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4KKyAgVXNpbmcgYE5vbmVMb2Nh
dGlvbmAgY2F1c2VzIEVtYmVyIHRvIG5vdCBzdG9yZSB0aGUgYXBwbGljYXRpb25zIFVSTCBzdGF0
ZQorICBpbiB0aGUgYWN0dWFsIFVSTC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBmb3IgdGVzdGlu
ZyBwdXJwb3NlcywgYW5kIGlzIG9uZQorICBvZiB0aGUgY2hhbmdlcyBtYWRlIHdoZW4gY2FsbGlu
ZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KKworICAjIyBMb2NhdGlvbiBBUEkKKworICBFYWNo
IGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhv
ZHM6CisKKyAgKiBpbXBsZW1lbnRhdGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgdXNlZCB0
byByZWZlcmVuY2UgdGhlIGltcGxlbWVudGF0aW9uLgorICAqIGdldFVSTDogcmV0dXJucyB0aGUg
Y3VycmVudCBVUkwuCisgICogc2V0VVJMKHBhdGgpOiBzZXRzIHRoZSBjdXJyZW50IFVSTC4KKyAg
KiByZXBsYWNlVVJMKHBhdGgpOiByZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0aW9uYWwpLgor
ICAqIG9uVXBkYXRlVVJMKGNhbGxiYWNrKTogdHJpZ2dlcnMgdGhlIGNhbGxiYWNrIHdoZW4gdGhl
IFVSTCBjaGFuZ2VzLgorICAqIGZvcm1hdFVSTCh1cmwpOiBmb3JtYXRzIGB1cmxgIHRvIGJlIHBs
YWNlZCBpbnRvIGBocmVmYCBhdHRyaWJ1dGUuCisKKyAgQ2FsbGluZyBzZXRVUkwgb3IgcmVwbGFj
ZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4KIAogICBAY2xhc3Mg
TG9jYXRpb24KICAgQG5hbWVzcGFjZSBFbWJlcgogICBAc3RhdGljCiAqLwogRW1iZXIuTG9jYXRp
b24gPSB7CisgIC8qKgorICAgVGhpcyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHRo
ZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbgorICAgaW1wbGVtZW50YXRpb24gYXMg
ZGVzaXJlZC4KKworICAgRm9yIGV4YW1wbGU6CisKKyAgIGBgYGphdmFzY3JpcHQKKyAgIC8vIEdp
dmVuIGEgbG9jYXRpb24gcmVnaXN0ZXJlZCBhcyBmb2xsb3dzOgorICAgY29udGFpbmVyLnJlZ2lz
dGVyKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnLCBIaXN0b3J5VGVzdExvY2F0aW9uKTsKKworICAg
Ly8gWW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB2aWE6CisgICBjb250YWluZXIubG9v
a3VwKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnKTsKKyAgIGBgYAorCisgICAgQG1ldGhvZCBjcmVh
dGUKKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgIEByZXR1cm4ge09iamVjdH0gYW4g
aW5zdGFuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAgQVBJCisgICAg
QGRlcHJlY2F0ZWQgVXNlIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbiBpbXBs
ZW1lbnRhdGlvbiB0aGF0IHlvdQorICAgIG5lZWQuCisgICovCiAgIGNyZWF0ZTogZnVuY3Rpb24o
b3B0aW9ucykgewogICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5p
bXBsZW1lbnRhdGlvbjsKICAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9uLmNyZWF0ZTog
eW91IG11c3Qgc3BlY2lmeSBhICdpbXBsZW1lbnRhdGlvbicgb3B0aW9uIiwgISFpbXBsZW1lbnRh
dGlvbik7CkBAIC0yNDMyNyw2ICszNzIxNywyOCBAQCBFbWJlci5Mb2NhdGlvbiA9IHsKICAgICBy
ZXR1cm4gaW1wbGVtZW50YXRpb25DbGFzcy5jcmVhdGUuYXBwbHkoaW1wbGVtZW50YXRpb25DbGFz
cywgYXJndW1lbnRzKTsKICAgfSwKIAorICAvKioKKyAgIFRoaXMgaXMgZGVwcmVjYXRlZCBpbiBm
YXZvciBvZiB1c2luZyB0aGUgY29udGFpbmVyIHRvIHJlZ2lzdGVyIHRoZQorICAgbG9jYXRpb24g
aW1wbGVtZW50YXRpb24gYXMgZGVzaXJlZC4KKworICAgRXhhbXBsZToKKworICAgYGBgamF2YXNj
cmlwdAorICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgIG5hbWU6ICJoaXN0b3J5LXRl
c3QtbG9jYXRpb24iLAorCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBs
aWNhdGlvbikgeworICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3Rvcnkt
dGVzdCcsIEhpc3RvcnlUZXN0TG9jYXRpb24pOworICAgIH0KKyAgIH0pOworICAgYGBgCisKKyAg
IEBtZXRob2QgcmVnaXN0ZXJJbXBsZW1lbnRhdGlvbgorICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUK
KyAgIEBwYXJhbSB7T2JqZWN0fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGxvY2F0aW9uYCBBUEkK
KyAgIEBkZXByZWNhdGVkIFJlZ2lzdGVyIHlvdXIgY3VzdG9tIGxvY2F0aW9uIGltcGxlbWVudGF0
aW9uIHdpdGggdGhlCisgICBjb250YWluZXIgZGlyZWN0bHkuCisgICovCiAgIHJlZ2lzdGVySW1w
bGVtZW50YXRpb246IGZ1bmN0aW9uKG5hbWUsIGltcGxlbWVudGF0aW9uKSB7CiAgICAgdGhpcy5p
bXBsZW1lbnRhdGlvbnNbbmFtZV0gPSBpbXBsZW1lbnRhdGlvbjsKICAgfSwKQEAgLTI0MzU5LDIz
ICszNzI3MSw2NiBAQCB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CiBFbWJl
ci5Ob25lTG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgcGF0aDogJycsCiAKKyAg
LyoqCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoLgorCisgICAgQHByaXZhdGUKKyAgICBA
bWV0aG9kIGdldFVSTAorICAgIEByZXR1cm4ge1N0cmluZ30gcGF0aAorICAqLwogICBnZXRVUkw6
IGZ1bmN0aW9uKCkgewogICAgIHJldHVybiBnZXQodGhpcywgJ3BhdGgnKTsKICAgfSwKIAorICAv
KioKKyAgICBTZXQgdGhlIHBhdGggYW5kIHJlbWVtYmVycyB3aGF0IHdhcyBzZXQuIFVzaW5nIHRo
aXMgbWV0aG9kCisgICAgdG8gY2hhbmdlIHRoZSBwYXRoIHdpbGwgbm90IGludm9rZSB0aGUgYHVw
ZGF0ZVVSTGAgY2FsbGJhY2suCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2Qgc2V0VVJMCisg
ICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgKi8KICAgc2V0VVJMOiBmdW5jdGlvbihwYXRoKSB7
CiAgICAgc2V0KHRoaXMsICdwYXRoJywgcGF0aCk7CiAgIH0sCiAKKyAgLyoqCisgICAgUmVnaXN0
ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHBhdGggY2hhbmdlcy4gVGhlc2UK
KyAgICBjYWxsYmFja3Mgd2lsbCBleGVjdXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgYmFj
ayBvciBmb3J3YXJkCisgICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBzZXRVUkxgIGlzIGludm9r
ZWQuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2Qgb25VcGRhdGVVUkwKKyAgICBAcGFyYW0g
Y2FsbGJhY2sge0Z1bmN0aW9ufQorICAqLwogICBvblVwZGF0ZVVSTDogZnVuY3Rpb24oY2FsbGJh
Y2spIHsKICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgIH0sCiAKKyAgLyoq
CisgICAgU2V0cyB0aGUgcGF0aCBhbmQgY2FsbHMgdGhlIGB1cGRhdGVVUkxgIGNhbGxiYWNrLgor
CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGhhbmRsZVVSTAorICAgIEBwYXJhbSBjYWxsYmFj
ayB7RnVuY3Rpb259CisgICovCiAgIGhhbmRsZVVSTDogZnVuY3Rpb24odXJsKSB7CiAgICAgc2V0
KHRoaXMsICdwYXRoJywgdXJsKTsKICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHVybCk7CiAgIH0s
CiAKKyAgLyoqCisgICAgR2l2ZW4gYSBVUkwsIGZvcm1hdHMgaXQgdG8gYmUgcGxhY2VkIGludG8g
dGhlIHBhZ2UgYXMgcGFydAorICAgIG9mIGFuIGVsZW1lbnQncyBgaHJlZmAgYXR0cmlidXRlLgor
CisgICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2luZyB0aGUge3thY3Rpb259
fSBoZWxwZXIKKyAgICB0byBnZW5lcmF0ZSBhIFVSTCBiYXNlZCBvbiBhbiBldmVudC4KKworICAg
IEBwcml2YXRlCisgICAgQG1ldGhvZCBmb3JtYXRVUkwKKyAgICBAcGFyYW0gdXJsIHtTdHJpbmd9
CisgICAgQHJldHVybiB7U3RyaW5nfSB1cmwKKyAgKi8KICAgZm9ybWF0VVJMOiBmdW5jdGlvbih1
cmwpIHsKICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBvdmVybHkgbWVhbmluZ2Z1bCwg
YnV0IHdlIGRvIG5vdCB3YW50IHRvIHRocm93CiAgICAgLy8gZXJyb3JzIHdoZW4gdGVzdCBjb2Rl
IHJlbmRlcnMgdGVtcGxhdGVzIGNvbnRhaW5pbmcge3thY3Rpb24gaHJlZj10cnVlfX0KQEAgLTI0
Mzk5LDggKzM3MzU0LDggQEAgRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJbXBsZW1lbnRhdGlvbign
bm9uZScsIEVtYmVyLk5vbmVMb2NhdGlvbik7CiB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBF
bWJlci5zZXQ7CiAKIC8qKgotICBFbWJlci5IYXNoTG9jYXRpb24gaW1wbGVtZW50cyB0aGUgbG9j
YXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MKLSAgaGFzaC4gQXQgcHJlc2VudCwgaXQgcmVs
aWVzIG9uIGEgaGFzaGNoYW5nZSBldmVudCBleGlzdGluZyBpbiB0aGUKKyAgYEVtYmVyLkhhc2hM
b2NhdGlvbmAgaW1wbGVtZW50cyB0aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MK
KyAgaGFzaC4gQXQgcHJlc2VudCwgaXQgcmVsaWVzIG9uIGEgYGhhc2hjaGFuZ2VgIGV2ZW50IGV4
aXN0aW5nIGluIHRoZQogICBicm93c2VyLgogCiAgIEBjbGFzcyBIYXNoTG9jYXRpb24KQEAgLTI0
NDE0LDIzICszNzM2OSwyMiBAQCBFbWJlci5IYXNoTG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKICAgfSwKIAogICAvKioKLSAgICBAcHJpdmF0ZQotCiAgICAgUmV0dXJucyB0aGUgY3Vy
cmVudCBgbG9jYXRpb24uaGFzaGAsIG1pbnVzIHRoZSAnIycgYXQgdGhlIGZyb250LgogCisgICAg
QHByaXZhdGUKICAgICBAbWV0aG9kIGdldFVSTAogICAqLwogICBnZXRVUkw6IGZ1bmN0aW9uKCkg
eworICAgICAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpdGhvdXQgZmVhdHVyZSBmbGFn
IGVuYWJsZWQKICAgICByZXR1cm4gZ2V0KHRoaXMsICdsb2NhdGlvbicpLmhhc2guc3Vic3RyKDEp
OwogICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRlCi0KICAgICBTZXQgdGhlIGBsb2NhdGlvbi5o
YXNoYCBhbmQgcmVtZW1iZXJzIHdoYXQgd2FzIHNldC4gVGhpcyBwcmV2ZW50cwogICAgIGBvblVw
ZGF0ZVVSTGAgY2FsbGJhY2tzIGZyb20gdHJpZ2dlcmluZyB3aGVuIHRoZSBoYXNoIHdhcyBzZXQg
YnkKICAgICBgSGFzaExvY2F0aW9uYC4KIAorICAgIEBwcml2YXRlCiAgICAgQG1ldGhvZCBzZXRV
UkwKICAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQogICAqLwpAQCAtMjQ0NDAsMTIgKzM3Mzk0LDIz
IEBAIEVtYmVyLkhhc2hMb2NhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICB9LAogCiAg
IC8qKgorICAgIFVzZXMgbG9jYXRpb24ucmVwbGFjZSB0byB1cGRhdGUgdGhlIHVybCB3aXRob3V0
IGEgcGFnZSByZWxvYWQKKyAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlvbi4KKwogICAgIEBwcml2
YXRlCisgICAgQG1ldGhvZCByZXBsYWNlVVJMCisgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAg
Ki8KKyAgcmVwbGFjZVVSTDogZnVuY3Rpb24ocGF0aCkgeworICAgIGdldCh0aGlzLCAnbG9jYXRp
b24nKS5yZXBsYWNlKCcjJyArIHBhdGgpOworICB9LAogCisgIC8qKgogICAgIFJlZ2lzdGVyIGEg
Y2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBoYXNoIGNoYW5nZXMuIFRoZXNlCiAgICAg
Y2FsbGJhY2tzIHdpbGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGJhY2sgb3Ig
Zm9yd2FyZAogICAgIGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJMYCBpcyBpbnZva2VkLgog
CisgICAgQHByaXZhdGUKICAgICBAbWV0aG9kIG9uVXBkYXRlVVJMCiAgICAgQHBhcmFtIGNhbGxi
YWNrIHtGdW5jdGlvbn0KICAgKi8KQEAgLTI0NDUzLDI3ICszNzQxOCwyNiBAQCBFbWJlci5IYXNo
TG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgICB2YXIgc2VsZiA9IHRoaXM7CiAg
ICAgdmFyIGd1aWQgPSBFbWJlci5ndWlkRm9yKHRoaXMpOwogCi0gICAgRW1iZXIuJCh3aW5kb3cp
LmJpbmQoJ2hhc2hjaGFuZ2UuZW1iZXItbG9jYXRpb24tJytndWlkLCBmdW5jdGlvbigpIHsKKyAg
ICBFbWJlci4kKHdpbmRvdykub24oJ2hhc2hjaGFuZ2UuZW1iZXItbG9jYXRpb24tJytndWlkLCBm
dW5jdGlvbigpIHsKICAgICAgIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIHBh
dGggPSBsb2NhdGlvbi5oYXNoLnN1YnN0cigxKTsKICAgICAgICAgaWYgKGdldChzZWxmLCAnbGFz
dFNldFVSTCcpID09PSBwYXRoKSB7IHJldHVybjsgfQogCiAgICAgICAgIHNldChzZWxmLCAnbGFz
dFNldFVSTCcsIG51bGwpOwogCi0gICAgICAgIGNhbGxiYWNrKGxvY2F0aW9uLmhhc2guc3Vic3Ry
KDEpKTsKKyAgICAgICAgY2FsbGJhY2socGF0aCk7CiAgICAgICB9KTsKICAgICB9KTsKICAgfSwK
IAogICAvKioKLSAgICBAcHJpdmF0ZQotCiAgICAgR2l2ZW4gYSBVUkwsIGZvcm1hdHMgaXQgdG8g
YmUgcGxhY2VkIGludG8gdGhlIHBhZ2UgYXMgcGFydAogICAgIG9mIGFuIGVsZW1lbnQncyBgaHJl
ZmAgYXR0cmlidXRlLgogCiAgICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2lu
ZyB0aGUge3thY3Rpb259fSBoZWxwZXIKICAgICB0byBnZW5lcmF0ZSBhIFVSTCBiYXNlZCBvbiBh
biBldmVudC4KIAorICAgIEBwcml2YXRlCiAgICAgQG1ldGhvZCBmb3JtYXRVUkwKICAgICBAcGFy
YW0gdXJsIHtTdHJpbmd9CiAgICovCkBAIC0yNDQ4MSwxMCArMzc0NDUsMTYgQEAgRW1iZXIuSGFz
aExvY2F0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAgcmV0dXJuICcjJyt1cmw7CiAg
IH0sCiAKKyAgLyoqCisgICAgQ2xlYW5zIHVwIHRoZSBIYXNoTG9jYXRpb24gZXZlbnQgbGlzdGVu
ZXIuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2Qgd2lsbERlc3Ryb3kKKyAgKi8KICAgd2ls
bERlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlz
KTsKIAotICAgIEVtYmVyLiQod2luZG93KS51bmJpbmQoJ2hhc2hjaGFuZ2UuZW1iZXItbG9jYXRp
b24tJytndWlkKTsKKyAgICBFbWJlci4kKHdpbmRvdykub2ZmKCdoYXNoY2hhbmdlLmVtYmVyLWxv
Y2F0aW9uLScrZ3VpZCk7CiAgIH0KIH0pOwogCkBAIC0yNDUwMSw3ICszNzQ3MSw4IEBAIEVtYmVy
LkxvY2F0aW9uLnJlZ2lzdGVySW1wbGVtZW50YXRpb24oJ2hhc2gnLCBFbWJlci5IYXNoTG9jYXRp
b24pOwogKi8KIAogdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIHBv
cHN0YXRlUmVhZHkgPSBmYWxzZTsKK3ZhciBwb3BzdGF0ZUZpcmVkID0gZmFsc2U7Cit2YXIgc3Vw
cG9ydHNIaXN0b3J5U3RhdGUgPSB3aW5kb3cuaGlzdG9yeSAmJiAnc3RhdGUnIGluIHdpbmRvdy5o
aXN0b3J5OwogCiAvKioKICAgRW1iZXIuSGlzdG9yeUxvY2F0aW9uIGltcGxlbWVudHMgdGhlIGxv
Y2F0aW9uIEFQSSB1c2luZyB0aGUgYnJvd3NlcidzCkBAIC0yNDUxNSwxOSArMzc0ODYsMTcgQEAg
RW1iZXIuSGlzdG9yeUxvY2F0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAKICAgaW5pdDog
ZnVuY3Rpb24oKSB7CiAgICAgc2V0KHRoaXMsICdsb2NhdGlvbicsIGdldCh0aGlzLCAnbG9jYXRp
b24nKSB8fCB3aW5kb3cubG9jYXRpb24pOwotICAgIHRoaXMuaW5pdFN0YXRlKCk7CiAgIH0sCiAK
ICAgLyoqCi0gICAgQHByaXZhdGUKLQogICAgIFVzZWQgdG8gc2V0IHN0YXRlIG9uIGZpcnN0IGNh
bGwgdG8gc2V0VVJMCiAKKyAgICBAcHJpdmF0ZQogICAgIEBtZXRob2QgaW5pdFN0YXRlCiAgICov
CiAgIGluaXRTdGF0ZTogZnVuY3Rpb24oKSB7CisgICAgc2V0KHRoaXMsICdoaXN0b3J5JywgZ2V0
KHRoaXMsICdoaXN0b3J5JykgfHwgd2luZG93Lmhpc3RvcnkpOwogICAgIHRoaXMucmVwbGFjZVN0
YXRlKHRoaXMuZm9ybWF0VVJMKHRoaXMuZ2V0VVJMKCkpKTsKLSAgICBzZXQodGhpcywgJ2hpc3Rv
cnknLCB3aW5kb3cuaGlzdG9yeSk7CiAgIH0sCiAKICAgLyoqCkBAIC0yNDUzOSw5OCArMzc1MDgs
MTE3IEBAIEVtYmVyLkhpc3RvcnlMb2NhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICBy
b290VVJMOiAnLycsCiAKICAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFJldHVybnMgdGhlIGN1
cnJlbnQgYGxvY2F0aW9uLnBhdGhuYW1lYCB3aXRob3V0IHJvb3RVUkwKKyAgICBSZXR1cm5zIHRo
ZSBjdXJyZW50IGBsb2NhdGlvbi5wYXRobmFtZWAgd2l0aG91dCBgcm9vdFVSTGAuCiAKKyAgICBA
cHJpdmF0ZQogICAgIEBtZXRob2QgZ2V0VVJMCisgICAgQHJldHVybiB1cmwge1N0cmluZ30KICAg
Ki8KICAgZ2V0VVJMOiBmdW5jdGlvbigpIHsKICAgICB2YXIgcm9vdFVSTCA9IGdldCh0aGlzLCAn
cm9vdFVSTCcpLAotICAgICAgICB1cmwgPSBnZXQodGhpcywgJ2xvY2F0aW9uJykucGF0aG5hbWU7
CisgICAgICAgIGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAorICAgICAgICBwYXRo
ID0gbG9jYXRpb24ucGF0aG5hbWU7CiAKICAgICByb290VVJMID0gcm9vdFVSTC5yZXBsYWNlKC9c
LyQvLCAnJyk7Ci0gICAgdXJsID0gdXJsLnJlcGxhY2Uocm9vdFVSTCwgJycpOworICAgIHZhciB1
cmwgPSBwYXRoLnJlcGxhY2Uocm9vdFVSTCwgJycpOwogCisgICAgCiAgICAgcmV0dXJuIHVybDsK
ICAgfSwKIAogICAvKioKLSAgICBAcHJpdmF0ZQotCiAgICAgVXNlcyBgaGlzdG9yeS5wdXNoU3Rh
dGVgIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZC4KIAorICAgIEBwcml2
YXRlCiAgICAgQG1ldGhvZCBzZXRVUkwKICAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQogICAqLwog
ICBzZXRVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKKyAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRl
KCk7CiAgICAgcGF0aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwogCi0gICAgaWYgKHRoaXMuZ2V0
U3RhdGUoKSAmJiB0aGlzLmdldFN0YXRlKCkucGF0aCAhPT0gcGF0aCkgewotICAgICAgcG9wc3Rh
dGVSZWFkeSA9IHRydWU7CisgICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGggIT09IHBhdGgpIHsK
ICAgICAgIHRoaXMucHVzaFN0YXRlKHBhdGgpOwogICAgIH0KICAgfSwKIAogICAvKioKLSAgICBA
cHJpdmF0ZQotCiAgICAgVXNlcyBgaGlzdG9yeS5yZXBsYWNlU3RhdGVgIHRvIHVwZGF0ZSB0aGUg
dXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZAogICAgIG9yIGhpc3RvcnkgbW9kaWZpY2F0aW9uLgog
CisgICAgQHByaXZhdGUKICAgICBAbWV0aG9kIHJlcGxhY2VVUkwKICAgICBAcGFyYW0gcGF0aCB7
U3RyaW5nfQogICAqLwogICByZXBsYWNlVVJMOiBmdW5jdGlvbihwYXRoKSB7CisgICAgdmFyIHN0
YXRlID0gdGhpcy5nZXRTdGF0ZSgpOwogICAgIHBhdGggPSB0aGlzLmZvcm1hdFVSTChwYXRoKTsK
IAotICAgIGlmICh0aGlzLmdldFN0YXRlKCkgJiYgdGhpcy5nZXRTdGF0ZSgpLnBhdGggIT09IHBh
dGgpIHsKLSAgICAgIHBvcHN0YXRlUmVhZHkgPSB0cnVlOworICAgIGlmIChzdGF0ZSAmJiBzdGF0
ZS5wYXRoICE9PSBwYXRoKSB7CiAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZShwYXRoKTsKICAgICB9
CiAgIH0sCiAKICAgLyoqCi0gICBAcHJpdmF0ZQotCiAgICBHZXQgdGhlIGN1cnJlbnQgYGhpc3Rv
cnkuc3RhdGVgCisgICBQb2x5ZmlsbCBjaGVja3MgZm9yIG5hdGl2ZSBicm93c2VyIHN1cHBvcnQg
YW5kIGZhbGxzIGJhY2sgdG8gcmV0cmlldmluZworICAgZnJvbSBhIHByaXZhdGUgX2hpc3RvcnlT
dGF0ZSB2YXJpYWJsZQogCisgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBnZXRTdGF0ZQorICAgQHJl
dHVybiBzdGF0ZSB7T2JqZWN0fQogICAqLwogICBnZXRTdGF0ZTogZnVuY3Rpb24oKSB7Ci0gICAg
cmV0dXJuIGdldCh0aGlzLCAnaGlzdG9yeScpLnN0YXRlOworICAgIHJldHVybiBzdXBwb3J0c0hp
c3RvcnlTdGF0ZSA/IGdldCh0aGlzLCAnaGlzdG9yeScpLnN0YXRlIDogdGhpcy5faGlzdG9yeVN0
YXRlOwogICB9LAogCiAgIC8qKgotICAgQHByaXZhdGUKLQotICAgUHVzaGVzIGEgbmV3IHN0YXRl
CisgICBQdXNoZXMgYSBuZXcgc3RhdGUuCiAKKyAgIEBwcml2YXRlCiAgICBAbWV0aG9kIHB1c2hT
dGF0ZQogICAgQHBhcmFtIHBhdGgge1N0cmluZ30KICAgKi8KICAgcHVzaFN0YXRlOiBmdW5jdGlv
bihwYXRoKSB7Ci0gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcGF0aDogcGF0aCB9LCBu
dWxsLCBwYXRoKTsKKyAgICB2YXIgc3RhdGUgPSB7IHBhdGg6IHBhdGggfTsKKworICAgIGdldCh0
aGlzLCAnaGlzdG9yeScpLnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgcGF0aCk7CisKKyAgICAvLyBz
dG9yZSBzdGF0ZSBpZiBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBgaGlzdG9yeS5zdGF0ZWAKKyAg
ICBpZiAoIXN1cHBvcnRzSGlzdG9yeVN0YXRlKSB7CisgICAgICB0aGlzLl9oaXN0b3J5U3RhdGUg
PSBzdGF0ZTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGZvciB3ZWJraXQgd29ya2Fyb3VuZAorICAg
IHRoaXMuX3ByZXZpb3VzVVJMID0gdGhpcy5nZXRVUkwoKTsKICAgfSwKIAogICAvKioKLSAgIEBw
cml2YXRlCi0KLSAgIFJlcGxhY2VzIHRoZSBjdXJyZW50IHN0YXRlCisgICBSZXBsYWNlcyB0aGUg
Y3VycmVudCBzdGF0ZS4KIAorICAgQHByaXZhdGUKICAgIEBtZXRob2QgcmVwbGFjZVN0YXRlCiAg
ICBAcGFyYW0gcGF0aCB7U3RyaW5nfQogICAqLwogICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKHBh
dGgpIHsKLSAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBwYXRoOiBwYXRoIH0sIG51
bGwsIHBhdGgpOworICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OworCisgICAgZ2V0KHRo
aXMsICdoaXN0b3J5JykucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCBwYXRoKTsKKworICAgIC8v
IHN0b3JlIHN0YXRlIGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGBoaXN0b3J5LnN0YXRlYAor
ICAgIGlmICghc3VwcG9ydHNIaXN0b3J5U3RhdGUpIHsKKyAgICAgIHRoaXMuX2hpc3RvcnlTdGF0
ZSA9IHN0YXRlOworICAgIH0KKworICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCisg
ICAgdGhpcy5fcHJldmlvdXNVUkwgPSB0aGlzLmdldFVSTCgpOwogICB9LAogCiAgIC8qKgotICAg
IEBwcml2YXRlCi0KICAgICBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbmV2
ZXIgdGhlIGJyb3dzZXIKICAgICBoaXN0b3J5IGNoYW5nZXMsIGluY2x1ZGluZyB1c2luZyBmb3J3
YXJkIGFuZCBiYWNrIGJ1dHRvbnMuCiAKKyAgICBAcHJpdmF0ZQogICAgIEBtZXRob2Qgb25VcGRh
dGVVUkwKICAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQogICAqLwpAQCAtMjQ2MzgsMjEg
KzM3NjI2LDIzIEBAIEVtYmVyLkhpc3RvcnlMb2NhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewogICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKSwKICAgICAgICAgc2VsZiA9IHRo
aXM7CiAKLSAgICBFbWJlci4kKHdpbmRvdykuYmluZCgncG9wc3RhdGUuZW1iZXItbG9jYXRpb24t
JytndWlkLCBmdW5jdGlvbihlKSB7Ci0gICAgICBpZighcG9wc3RhdGVSZWFkeSkgewotICAgICAg
ICByZXR1cm47CisgICAgRW1iZXIuJCh3aW5kb3cpLm9uKCdwb3BzdGF0ZS5lbWJlci1sb2NhdGlv
bi0nK2d1aWQsIGZ1bmN0aW9uKGUpIHsKKyAgICAgIC8vIElnbm9yZSBpbml0aWFsIHBhZ2UgbG9h
ZCBwb3BzdGF0ZSBldmVudCBpbiBDaHJvbWUKKyAgICAgIGlmICghcG9wc3RhdGVGaXJlZCkgewor
ICAgICAgICBwb3BzdGF0ZUZpcmVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlbGYuZ2V0VVJMKCkg
PT09IHNlbGYuX3ByZXZpb3VzVVJMKSB7IHJldHVybjsgfQogICAgICAgfQogICAgICAgY2FsbGJh
Y2soc2VsZi5nZXRVUkwoKSk7CiAgICAgfSk7CiAgIH0sCiAKICAgLyoqCi0gICAgQHByaXZhdGUK
LQogICAgIFVzZWQgd2hlbiB1c2luZyBge3thY3Rpb259fWAgaGVscGVyLiAgVGhlIHVybCBpcyBh
bHdheXMgYXBwZW5kZWQgdG8gdGhlIHJvb3RVUkwuCiAKKyAgICBAcHJpdmF0ZQogICAgIEBtZXRo
b2QgZm9ybWF0VVJMCiAgICAgQHBhcmFtIHVybCB7U3RyaW5nfQorICAgIEByZXR1cm4gZm9ybWF0
dGVkIHVybCB7U3RyaW5nfQogICAqLwogICBmb3JtYXRVUkw6IGZ1bmN0aW9uKHVybCkgewogICAg
IHZhciByb290VVJMID0gZ2V0KHRoaXMsICdyb290VVJMJyk7CkBAIC0yNDY2NCwxMCArMzc2NTQs
MTYgQEAgRW1iZXIuSGlzdG9yeUxvY2F0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAg
cmV0dXJuIHJvb3RVUkwgKyB1cmw7CiAgIH0sCiAKKyAgLyoqCisgICAgQ2xlYW5zIHVwIHRoZSBI
aXN0b3J5TG9jYXRpb24gZXZlbnQgbGlzdGVuZXIuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRo
b2Qgd2lsbERlc3Ryb3kKKyAgKi8KICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgIHZh
ciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKTsKIAotICAgIEVtYmVyLiQod2luZG93KS51bmJp
bmQoJ3BvcHN0YXRlLmVtYmVyLWxvY2F0aW9uLScrZ3VpZCk7CisgICAgRW1iZXIuJCh3aW5kb3cp
Lm9mZigncG9wc3RhdGUuZW1iZXItbG9jYXRpb24tJytndWlkKTsKICAgfQogfSk7CiAKQEAgLTI0
Njg5LDcgKzM3Njg1LDYgQEAgRW1iZXIgUm91dGluZwogCiBAbW9kdWxlIGVtYmVyCiBAc3VibW9k
dWxlIGVtYmVyLXJvdXRpbmcKLUByZXF1aXJlcyBlbWJlci1zdGF0ZXMKIEByZXF1aXJlcyBlbWJl
ci12aWV3cwogKi8KIApAQCAtMjQ3NTIsNyArMzc3NDcsNyBAQCBEQUcucHJvdG90eXBlLmFkZEVk
Z2UgPSBmdW5jdGlvbihmcm9tTmFtZSwgdG9OYW1lKSB7CiAgIH0KICAgZnVuY3Rpb24gY2hlY2tD
eWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKICAgICBpZiAodmVydGV4Lm5hbWUgPT09IHRvTmFtZSkgewot
ICAgICAgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSBkZXRlY3RlZDogIiArIHRvTmFtZSArICIgPC0g
IiArIHBhdGguam9pbigiIDwtICIpKTsKKyAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiY3lj
bGUgZGV0ZWN0ZWQ6ICIgKyB0b05hbWUgKyAiIDwtICIgKyBwYXRoLmpvaW4oIiA8LSAiKSk7CiAg
ICAgfQogICB9CiAgIHZpc2l0KGZyb20sIGNoZWNrQ3ljbGUpOwpAQCAtMjQ4MTAsMTEgKzM3ODA1
LDM0MSBAQCBFbWJlci5EQUcgPSBEQUc7CiBAc3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCiAq
LwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCit2YXIgZ2V0ID0gRW1i
ZXIuZ2V0LAogICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNsYXNzaWZ5LAorICAgIGNhcGl0
YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwKICAgICBkZWNhbWVsaXplID0gRW1iZXIu
U3RyaW5nLmRlY2FtZWxpemU7CiAKIC8qKgorICBUaGUgRGVmYXVsdFJlc29sdmVyIGRlZmluZXMg
dGhlIGRlZmF1bHQgbG9va3VwIHJ1bGVzIHRvIHJlc29sdmUKKyAgY29udGFpbmVyIGxvb2t1cHMg
YmVmb3JlIGNvbnN1bHRpbmcgdGhlIGNvbnRhaW5lciBmb3IgcmVnaXN0ZXJlZAorICBpdGVtczoK
KworKiB0ZW1wbGF0ZXMgYXJlIGxvb2tlZCB1cCBvbiBgRW1iZXIuVEVNUExBVEVTYAorKiBvdGhl
ciBuYW1lcyBhcmUgbG9va2VkIHVwIG9uIHRoZSBhcHBsaWNhdGlvbiBhZnRlciBjb252ZXJ0aW5n
CisgIHRoZSBuYW1lLiBGb3IgZXhhbXBsZSwgYGNvbnRyb2xsZXI6cG9zdGAgbG9va3MgdXAKKyAg
YEFwcC5Qb3N0Q29udHJvbGxlcmAgYnkgZGVmYXVsdC4KKyogdGhlcmUgYXJlIHNvbWUgbnVhbmNl
cyAoc2VlIGV4YW1wbGVzIGJlbG93KQorCisgICMjIyBIb3cgUmVzb2x2aW5nIFdvcmtzCisKKyAg
VGhlIGNvbnRhaW5lciBjYWxscyB0aGlzIG9iamVjdCdzIGByZXNvbHZlYCBtZXRob2Qgd2l0aCB0
aGUKKyAgYGZ1bGxOYW1lYCBhcmd1bWVudC4KKworICBJdCBmaXJzdCBwYXJzZXMgdGhlIGZ1bGxO
YW1lIGludG8gYW4gb2JqZWN0IHVzaW5nIGBwYXJzZU5hbWVgLgorCisgIFRoZW4gaXQgY2hlY2tz
IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSB0eXBlLXNwZWNpZmljIGluc3RhbmNlCisgIG1ldGhvZCBv
ZiB0aGUgZm9ybSBgcmVzb2x2ZVtUeXBlXWAgYW5kIGNhbGxzIGl0IGlmIGl0IGV4aXN0cy4KKyAg
Rm9yIGV4YW1wbGUgaWYgaXQgd2FzIHJlc29sdmluZyAndGVtcGxhdGU6cG9zdCcsIGl0IHdvdWxk
IGNhbGwKKyAgdGhlIGByZXNvbHZlVGVtcGxhdGVgIG1ldGhvZC4KKworICBJdHMgbGFzdCByZXNv
cnQgaXMgdG8gY2FsbCB0aGUgYHJlc29sdmVPdGhlcmAgbWV0aG9kLgorCisgIFRoZSBtZXRob2Rz
IG9mIHRoaXMgb2JqZWN0IGFyZSBkZXNpZ25lZCB0byBiZSBlYXN5IHRvIG92ZXJyaWRlCisgIGlu
IGEgc3ViY2xhc3MuIEZvciBleGFtcGxlLCB5b3UgY291bGQgZW5oYW5jZSBob3cgYSB0ZW1wbGF0
ZQorICBpcyByZXNvbHZlZCBsaWtlIHNvOgorCisgIGBgYGphdmFzY3JpcHQKKyAgQXBwID0gRW1i
ZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICBSZXNvbHZlcjogRW1iZXIuRGVmYXVsdFJlc29s
dmVyLmV4dGVuZCh7CisgICAgICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uKHBhcnNlZE5hbWUp
IHsKKyAgICAgICAgdmFyIHJlc29sdmVkVGVtcGxhdGUgPSB0aGlzLl9zdXBlcihwYXJzZWROYW1l
KTsKKyAgICAgICAgaWYgKHJlc29sdmVkVGVtcGxhdGUpIHsgcmV0dXJuIHJlc29sdmVkVGVtcGxh
dGU7IH0KKyAgICAgICAgcmV0dXJuIEVtYmVyLlRFTVBMQVRFU1snbm90X2ZvdW5kJ107CisgICAg
ICB9CisgICAgfSkKKyAgfSk7CisgIGBgYAorCisgIFNvbWUgZXhhbXBsZXMgb2YgaG93IG5hbWVz
IGFyZSByZXNvbHZlZDoKKworICBgYGAKKyAgJ3RlbXBsYXRlOnBvc3QnIC8vPT4gRW1iZXIuVEVN
UExBVEVTWydwb3N0J10KKyAgJ3RlbXBsYXRlOnBvc3RzL2J5bGluZScgLy89PiBFbWJlci5URU1Q
TEFURVNbJ3Bvc3RzL2J5bGluZSddCisgICd0ZW1wbGF0ZTpwb3N0cy5ieWxpbmUnIC8vPT4gRW1i
ZXIuVEVNUExBVEVTWydwb3N0cy9ieWxpbmUnXQorICAndGVtcGxhdGU6YmxvZ1Bvc3QnIC8vPT4g
RW1iZXIuVEVNUExBVEVTWydibG9nUG9zdCddCisgICAgICAgICAgICAgICAgICAgICAgLy8gICBP
UgorICAgICAgICAgICAgICAgICAgICAgIC8vICAgRW1iZXIuVEVNUExBVEVTWydibG9nX3Bvc3Qn
XQorICAnY29udHJvbGxlcjpwb3N0JyAvLz0+IEFwcC5Qb3N0Q29udHJvbGxlcgorICAnY29udHJv
bGxlcjpwb3N0cy5pbmRleCcgLy89PiBBcHAuUG9zdHNJbmRleENvbnRyb2xsZXIKKyAgJ2NvbnRy
b2xsZXI6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdENvbnRyb2xsZXIKKyAgJ2NvbnRyb2xsZXI6
YmFzaWMnIC8vPT4gRW1iZXIuQ29udHJvbGxlcgorICAncm91dGU6cG9zdCcgLy89PiBBcHAuUG9z
dFJvdXRlCisgICdyb3V0ZTpwb3N0cy5pbmRleCcgLy89PiBBcHAuUG9zdHNJbmRleFJvdXRlCisg
ICdyb3V0ZTpibG9nL3Bvc3QnIC8vPT4gQmxvZy5Qb3N0Um91dGUKKyAgJ3JvdXRlOmJhc2ljJyAv
Lz0+IEVtYmVyLlJvdXRlCisgICd2aWV3OnBvc3QnIC8vPT4gQXBwLlBvc3RWaWV3CisgICd2aWV3
OnBvc3RzLmluZGV4JyAvLz0+IEFwcC5Qb3N0c0luZGV4VmlldworICAndmlldzpibG9nL3Bvc3Qn
IC8vPT4gQmxvZy5Qb3N0VmlldworICAndmlldzpiYXNpYycgLy89PiBFbWJlci5WaWV3CisgICdm
b286cG9zdCcgLy89PiBBcHAuUG9zdEZvbworICAnbW9kZWw6cG9zdCcgLy89PiBBcHAuUG9zdAor
ICBgYGAKKworICBAY2xhc3MgRGVmYXVsdFJlc29sdmVyCisgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
QGV4dGVuZHMgRW1iZXIuT2JqZWN0CisqLworRW1iZXIuRGVmYXVsdFJlc29sdmVyID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7CisgIC8qKgorICAgIFRoaXMgd2lsbCBiZSBzZXQgdG8gdGhlIEFwcGxp
Y2F0aW9uIGluc3RhbmNlIHdoZW4gaXQgaXMKKyAgICBjcmVhdGVkLgorCisgICAgQHByb3BlcnR5
IG5hbWVzcGFjZQorICAqLworICBuYW1lc3BhY2U6IG51bGwsCisKKyAgbm9ybWFsaXplOiBmdW5j
dGlvbihmdWxsTmFtZSkgeworICAgIHZhciBzcGxpdCA9IGZ1bGxOYW1lLnNwbGl0KCc6JywgMiks
CisgICAgICAgIHR5cGUgPSBzcGxpdFswXSwKKyAgICAgICAgbmFtZSA9IHNwbGl0WzFdOworCisg
ICAgRW1iZXIuYXNzZXJ0KCJUcmllZCB0byBub3JtYWxpemUgYSBjb250YWluZXIgbmFtZSB3aXRo
b3V0IGEgY29sb24gKDopIGluICIgKworICAgICAgICAgICAgICAgICAiaXQuIFlvdSBwcm9iYWJs
eSB0cmllZCB0byBsb29rdXAgYSBuYW1lIHRoYXQgZGlkIG5vdCBjb250YWluICIgKworICAgICAg
ICAgICAgICAgICAiYSB0eXBlLCBhIGNvbG9uLCBhbmQgYSBuYW1lLiBBIHByb3BlciBsb29rdXAg
bmFtZSB3b3VsZCBiZSAiICsKKyAgICAgICAgICAgICAgICAgImB2aWV3OnBvc3RgLiIsIHNwbGl0
Lmxlbmd0aCA9PT0gMik7CisKKyAgICBpZiAodHlwZSAhPT0gJ3RlbXBsYXRlJykgeworICAgICAg
dmFyIHJlc3VsdCA9IG5hbWU7CisKKyAgICAgIGlmIChyZXN1bHQuaW5kZXhPZignLicpID4gLTEp
IHsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1wuKC4pL2csIGZ1bmN0aW9uKG0p
IHsgcmV0dXJuIG0uY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7IH0pOworICAgICAgfQorCisgICAg
ICBpZiAobmFtZS5pbmRleE9mKCdfJykgPiAtMSkgeworICAgICAgICByZXN1bHQgPSByZXN1bHQu
cmVwbGFjZSgvXyguKS9nLCBmdW5jdGlvbihtKSB7IHJldHVybiBtLmNoYXJBdCgxKS50b1VwcGVy
Q2FzZSgpOyB9KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHR5cGUgKyAnOicgKyByZXN1bHQ7
CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICB9CisgIH0sCisKKwor
ICAvKioKKyAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdmlhIHRoZSBjb250YWluZXIncyByZXNv
bHZlciBtZXRob2QuCisgICAgSXQgcGFyc2VzIHRoZSBwcm92aWRlZCBgZnVsbE5hbWVgIGFuZCB0
aGVuIGxvb2tzIHVwIGFuZAorICAgIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIG9y
IGNsYXNzLgorCisgICAgQG1ldGhvZCByZXNvbHZlCisgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxO
YW1lIHRoZSBsb29rdXAgc3RyaW5nCisgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcmVzb2x2ZWQg
ZmFjdG9yeQorICAqLworICByZXNvbHZlOiBmdW5jdGlvbihmdWxsTmFtZSkgeworICAgIHZhciBw
YXJzZWROYW1lID0gdGhpcy5wYXJzZU5hbWUoZnVsbE5hbWUpLAorICAgICAgICB0eXBlU3BlY2lm
aWNSZXNvbHZlTWV0aG9kID0gdGhpc1twYXJzZWROYW1lLnJlc29sdmVNZXRob2ROYW1lXTsKKwor
ICAgIGlmICghcGFyc2VkTmFtZS5uYW1lIHx8ICFwYXJzZWROYW1lLnR5cGUpIHsKKyAgICAgIHRo
cm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZnVsbE5hbWU6IGAiICsgZnVsbE5hbWUgKyAiYCwg
bXVzdCBiZSBvZiB0aGUgZm9ybSBgdHlwZTpuYW1lYCAiKTsKKyAgICB9CisKKyAgICBpZiAodHlw
ZVNwZWNpZmljUmVzb2x2ZU1ldGhvZCkgeworICAgICAgdmFyIHJlc29sdmVkID0gdHlwZVNwZWNp
ZmljUmVzb2x2ZU1ldGhvZC5jYWxsKHRoaXMsIHBhcnNlZE5hbWUpOworICAgICAgaWYgKHJlc29s
dmVkKSB7IHJldHVybiByZXNvbHZlZDsgfQorICAgIH0KKyAgICByZXR1cm4gdGhpcy5yZXNvbHZl
T3RoZXIocGFyc2VkTmFtZSk7CisgIH0sCisgIC8qKgorICAgIENvbnZlcnQgdGhlIHN0cmluZyBu
YW1lIG9mIHRoZSBmb3JtICJ0eXBlOm5hbWUiIHRvCisgICAgYSBKYXZhc2NyaXB0IG9iamVjdCB3
aXRoIHRoZSBwYXJzZWQgYXNwZWN0cyBvZiB0aGUgbmFtZQorICAgIGJyb2tlbiBvdXQuCisKKyAg
ICBAcHJvdGVjdGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lIHRoZSBsb29rdXAgc3Ry
aW5nCisgICAgQG1ldGhvZCBwYXJzZU5hbWUKKyAgKi8KKyAgcGFyc2VOYW1lOiBmdW5jdGlvbihm
dWxsTmFtZSkgeworICAgIHZhciBuYW1lUGFydHMgPSBmdWxsTmFtZS5zcGxpdCgiOiIpLAorICAg
ICAgICB0eXBlID0gbmFtZVBhcnRzWzBdLCBmdWxsTmFtZVdpdGhvdXRUeXBlID0gbmFtZVBhcnRz
WzFdLAorICAgICAgICBuYW1lID0gZnVsbE5hbWVXaXRob3V0VHlwZSwKKyAgICAgICAgbmFtZXNw
YWNlID0gZ2V0KHRoaXMsICduYW1lc3BhY2UnKSwKKyAgICAgICAgcm9vdCA9IG5hbWVzcGFjZTsK
KworICAgIGlmICh0eXBlICE9PSAndGVtcGxhdGUnICYmIG5hbWUuaW5kZXhPZignLycpICE9PSAt
MSkgeworICAgICAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLycpOworICAgICAgbmFtZSA9IHBh
cnRzW3BhcnRzLmxlbmd0aCAtIDFdOworICAgICAgdmFyIG5hbWVzcGFjZU5hbWUgPSBjYXBpdGFs
aXplKHBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJykpOworICAgICAgcm9vdCA9IEVtYmVyLk5h
bWVzcGFjZS5ieU5hbWUobmFtZXNwYWNlTmFtZSk7CisKKyAgICAgIEVtYmVyLmFzc2VydCgnWW91
IGFyZSBsb29raW5nIGZvciBhICcgKyBuYW1lICsgJyAnICsgdHlwZSArICcgaW4gdGhlICcgKyBu
YW1lc3BhY2VOYW1lICsgJyBuYW1lc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlIGNvdWxkIG5vdCBi
ZSBmb3VuZCcsIHJvb3QpOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBmdWxsTmFtZTog
ZnVsbE5hbWUsCisgICAgICB0eXBlOiB0eXBlLAorICAgICAgZnVsbE5hbWVXaXRob3V0VHlwZTog
ZnVsbE5hbWVXaXRob3V0VHlwZSwKKyAgICAgIG5hbWU6IG5hbWUsCisgICAgICByb290OiByb290
LAorICAgICAgcmVzb2x2ZU1ldGhvZE5hbWU6ICJyZXNvbHZlIiArIGNsYXNzaWZ5KHR5cGUpCisg
ICAgfTsKKyAgfSwKKyAgLyoqCisgICAgTG9vayB1cCB0aGUgdGVtcGxhdGUgaW4gRW1iZXIuVEVN
UExBVEVTCisKKyAgICBAcHJvdGVjdGVkCisgICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUg
YSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAgICAgZnVsbE5hbWUgbG9va3Vw
IHN0cmluZworICAgIEBtZXRob2QgcmVzb2x2ZVRlbXBsYXRlCisgICovCisgIHJlc29sdmVUZW1w
bGF0ZTogZnVuY3Rpb24ocGFyc2VkTmFtZSkgeworICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBwYXJz
ZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5cGUucmVwbGFjZSgvXC4vZywgJy8nKTsKKworICAgIGlm
IChFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXSkgeworICAgICAgcmV0dXJuIEVtYmVyLlRF
TVBMQVRFU1t0ZW1wbGF0ZU5hbWVdOworICAgIH0KKworICAgIHRlbXBsYXRlTmFtZSA9IGRlY2Ft
ZWxpemUodGVtcGxhdGVOYW1lKTsKKyAgICBpZiAoRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFt
ZV0pIHsKKyAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXTsKKyAgICB9
CisgIH0sCisgIC8qKgorICAgIEdpdmVuIGEgcGFyc2VOYW1lIG9iamVjdCAob3V0cHV0IGZyb20g
YHBhcnNlTmFtZWApLCBhcHBseQorICAgIHRoZSBjb252ZW50aW9ucyBleHBlY3RlZCBieSBgRW1i
ZXIuUm91dGVyYAorCisgICAgQHByb3RlY3RlZAorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWRO
YW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKKyAgICAgIGZ1bGxOYW1lIGxv
b2t1cCBzdHJpbmcKKyAgICBAbWV0aG9kIHVzZVJvdXRlck5hbWluZworICAqLworICB1c2VSb3V0
ZXJOYW1pbmc6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKKyAgICBwYXJzZWROYW1lLm5hbWUgPSBw
YXJzZWROYW1lLm5hbWUucmVwbGFjZSgvXC4vZywgJ18nKTsKKyAgICBpZiAocGFyc2VkTmFtZS5u
YW1lID09PSAnYmFzaWMnKSB7CisgICAgICBwYXJzZWROYW1lLm5hbWUgPSAnJzsKKyAgICB9Cisg
IH0sCisgIC8qKgorICAgIExvb2t1cCB0aGUgY29udHJvbGxlciB1c2luZyBgcmVzb2x2ZU90aGVy
YAorCisgICAgQHByb3RlY3RlZAorICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFy
c2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKKyAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJp
bmcKKyAgICBAbWV0aG9kIHJlc29sdmVDb250cm9sbGVyCisgICovCisgIHJlc29sdmVDb250cm9s
bGVyOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7CisgICAgdGhpcy51c2VSb3V0ZXJOYW1pbmcocGFy
c2VkTmFtZSk7CisgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOworICB9
LAorICAvKioKKyAgICBMb29rdXAgdGhlIHJvdXRlIHVzaW5nIGByZXNvbHZlT3RoZXJgCisKKyAg
ICBAcHJvdGVjdGVkCisgICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUg
b2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAg
IEBtZXRob2QgcmVzb2x2ZVJvdXRlCisgICovCisgIHJlc29sdmVSb3V0ZTogZnVuY3Rpb24ocGFy
c2VkTmFtZSkgeworICAgIHRoaXMudXNlUm91dGVyTmFtaW5nKHBhcnNlZE5hbWUpOworICAgIHJl
dHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJzZWROYW1lKTsKKyAgfSwKKyAgLyoqCisgICAgTG9v
a3VwIHRoZSB2aWV3IHVzaW5nIGByZXNvbHZlT3RoZXJgCisKKyAgICBAcHJvdGVjdGVkCisgICAg
QHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBh
cnNlZAorICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAgIEBtZXRob2QgcmVzb2x2ZVZp
ZXcKKyAgKi8KKyAgcmVzb2x2ZVZpZXc6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKKyAgICB0aGlz
LnVzZVJvdXRlck5hbWluZyhwYXJzZWROYW1lKTsKKyAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3Ro
ZXIocGFyc2VkTmFtZSk7CisgIH0sCisKKyAgcmVzb2x2ZUhlbHBlcjogZnVuY3Rpb24ocGFyc2Vk
TmFtZSkgeworICAgIHJldHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJzZWROYW1lKSB8fCBFbWJl
ci5IYW5kbGViYXJzLmhlbHBlcnNbcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlXTsKKyAg
fSwKKworICAvKioKKyAgICBMb29rdXAgdGhlIG1vZGVsIG9uIHRoZSBBcHBsaWNhdGlvbiBuYW1l
c3BhY2UKKworICAgIEBwcm90ZWN0ZWQKKyAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBh
IHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICBmdWxsTmFtZSBsb29rdXAg
c3RyaW5nCisgICAgQG1ldGhvZCByZXNvbHZlTW9kZWwKKyAgKi8KKyAgcmVzb2x2ZU1vZGVsOiBm
dW5jdGlvbihwYXJzZWROYW1lKSB7CisgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzaWZ5KHBhcnNl
ZE5hbWUubmFtZSksCisgICAgICAgIGZhY3RvcnkgPSBnZXQocGFyc2VkTmFtZS5yb290LCBjbGFz
c05hbWUpOworCisgICAgIGlmIChmYWN0b3J5KSB7IHJldHVybiBmYWN0b3J5OyB9CisgIH0sCisg
IC8qKgorICAgIExvb2sgdXAgdGhlIHNwZWNpZmllZCBvYmplY3QgKGZyb20gcGFyc2VkTmFtZSkg
b24gdGhlIGFwcHJvcHJpYXRlCisgICAgbmFtZXNwYWNlICh1c3VhbGx5IG9uIHRoZSBBcHBsaWNh
dGlvbikKKworICAgIEBwcm90ZWN0ZWQKKyAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBh
IHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICBmdWxsTmFtZSBsb29rdXAg
c3RyaW5nCisgICAgQG1ldGhvZCByZXNvbHZlT3RoZXIKKyAgKi8KKyAgcmVzb2x2ZU90aGVyOiBm
dW5jdGlvbihwYXJzZWROYW1lKSB7CisgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzaWZ5KHBhcnNl
ZE5hbWUubmFtZSkgKyBjbGFzc2lmeShwYXJzZWROYW1lLnR5cGUpLAorICAgICAgICBmYWN0b3J5
ID0gZ2V0KHBhcnNlZE5hbWUucm9vdCwgY2xhc3NOYW1lKTsKKyAgICBpZiAoZmFjdG9yeSkgeyBy
ZXR1cm4gZmFjdG9yeTsgfQorICB9LAorCisgIC8qKgorICAgIFJldHVybnMgYSBodW1hbi1yZWFk
YWJsZSBkZXNjcmlwdGlvbiBmb3IgYSBmdWxsTmFtZS4gVXNlZCBieSB0aGUKKyAgICBBcHBsaWNh
dGlvbiBuYW1lc3BhY2UgaW4gYXNzZXJ0aW9ucyB0byBkZXNjcmliZSB0aGUKKyAgICBwcmVjaXNl
IG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgRW1iZXIgaXMgbG9va2luZyBmb3IsIHJhdGhlciB0aGFu
CisgICAgY29udGFpbmVyIGtleXMuCisKKyAgICBAcHJvdGVjdGVkCisgICAgQHBhcmFtIHtTdHJp
bmd9IGZ1bGxOYW1lIHRoZSBsb29rdXAgc3RyaW5nCisgICAgQG1ldGhvZCBsb29rdXBEZXNjcmlw
dGlvbgorICAqLworICBsb29rdXBEZXNjcmlwdGlvbjogZnVuY3Rpb24oZnVsbE5hbWUpIHsKKyAg
ICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxOYW1lKTsKKworICAgIGlmIChw
YXJzZWROYW1lLnR5cGUgPT09ICd0ZW1wbGF0ZScpIHsKKyAgICAgIHJldHVybiAidGVtcGxhdGUg
YXQgIiArIHBhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9cLi9nLCAnLycp
OworICAgIH0KKworICAgIHZhciBkZXNjcmlwdGlvbiA9IHBhcnNlZE5hbWUucm9vdCArICIuIiAr
IGNsYXNzaWZ5KHBhcnNlZE5hbWUubmFtZSk7CisgICAgaWYgKHBhcnNlZE5hbWUudHlwZSAhPT0g
J21vZGVsJykgeyBkZXNjcmlwdGlvbiArPSBjbGFzc2lmeShwYXJzZWROYW1lLnR5cGUpOyB9CisK
KyAgICByZXR1cm4gZGVzY3JpcHRpb247CisgIH0sCisKKyAgbWFrZVRvU3RyaW5nOiBmdW5jdGlv
bihmYWN0b3J5LCBmdWxsTmFtZSkgeworICAgIHJldHVybiBmYWN0b3J5LnRvU3RyaW5nKCk7Cisg
IH0KK30pOworCit9KSgpOworCisKKworKGZ1bmN0aW9uKCkgeworLyoqCitAbW9kdWxlIGVtYmVy
CitAc3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCisqLworCit2YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQ7CisKK2Z1bmN0aW9uIERlcHJlY2F0ZWRDb250YWluZXIoY29udGFp
bmVyKSB7CisgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjsKK30KKworRGVwcmVjYXRlZENv
bnRhaW5lci5kZXByZWNhdGUgPSBmdW5jdGlvbihtZXRob2QpIHsKKyAgcmV0dXJuIGZ1bmN0aW9u
KCkgeworICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7CisKKyAgICBFbWJlci5k
ZXByZWNhdGUoJ1VzaW5nIHRoZSBkZWZhdWx0Q29udGFpbmVyIGlzIG5vIGxvbmdlciBzdXBwb3J0
ZWQuIFtkZWZhdWx0Q29udGFpbmVyIycgKyBtZXRob2QgKyAnXSBzZWU6IGh0dHA6Ly9naXQuaW8v
RUtQcG5BJywgZmFsc2UpOworICAgIHJldHVybiBjb250YWluZXJbbWV0aG9kXS5hcHBseShjb250
YWluZXIsIGFyZ3VtZW50cyk7CisgIH07Cit9OworCitEZXByZWNhdGVkQ29udGFpbmVyLnByb3Rv
dHlwZSA9IHsKKyAgX2NvbnRhaW5lcjogbnVsbCwKKyAgbG9va3VwOiBEZXByZWNhdGVkQ29udGFp
bmVyLmRlcHJlY2F0ZSgnbG9va3VwJyksCisgIHJlc29sdmU6IERlcHJlY2F0ZWRDb250YWluZXIu
ZGVwcmVjYXRlKCdyZXNvbHZlJyksCisgIHJlZ2lzdGVyOiBEZXByZWNhdGVkQ29udGFpbmVyLmRl
cHJlY2F0ZSgncmVnaXN0ZXInKQorfTsKKworLyoqCiAgIEFuIGluc3RhbmNlIG9mIGBFbWJlci5B
cHBsaWNhdGlvbmAgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBldmVyeSBFbWJlcgogICBhcHBs
aWNhdGlvbi4gSXQgaGVscHMgdG8gaW5zdGFudGlhdGUsIGluaXRpYWxpemUgYW5kIGNvb3JkaW5h
dGUgdGhlIG1hbnkKICAgb2JqZWN0cyB0aGF0IG1ha2UgdXAgeW91ciBhcHAuCkBAIC0yNDgzNywx
MSArMzgxNjIsMTQgQEAgdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAogICBg
YGAKIAogICBCeSBkZWZhdWx0LCBjYWxsaW5nIGBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKWAg
d2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUKLSAgeW91ciAgYXBwbGljYXRpb24gYnkgY2Fs
bGluZyB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemUoKWAgbWV0aG9kLiBJZgorICB5
b3VyIGFwcGxpY2F0aW9uIGJ5IGNhbGxpbmcgdGhlIGBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFs
aXplKClgIG1ldGhvZC4gSWYKICAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlhbGl6YXRpb24sIHlv
dSBjYW4gY2FsbCB5b3VyIGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAogICBtZXRob2QuIFdoZW4g
eW91IGFyZSByZWFkeSBmb3IgeW91ciBhcHAgdG8gYmUgaW5pdGlhbGl6ZWQsIGNhbGwgaXRzCiAg
IGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhvZC4KIAorICBZb3UgY2FuIGRlZmluZSBhIGByZWFk
eWAgbWV0aG9kIG9uIHRoZSBgRW1iZXIuQXBwbGljYXRpb25gIGluc3RhbmNlLCB3aGljaAorICB3
aWxsIGJlIHJ1biBieSBFbWJlciB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXplZC4K
KwogICBCZWNhdXNlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5oZXJpdHMgZnJvbSBgRW1iZXIuTmFt
ZXNwYWNlYCwgYW55IGNsYXNzZXMKICAgeW91IGNyZWF0ZSB3aWxsIGhhdmUgdXNlZnVsIHN0cmlu
ZyByZXByZXNlbnRhdGlvbnMgd2hlbiBjYWxsaW5nIGB0b1N0cmluZygpYC4KICAgU2VlIHRoZSBg
RW1iZXIuTmFtZXNwYWNlYCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgpAQCAt
MjQ4NjcsMTYgKzM4MTk1LDE1IEBAIHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dCwKICAgZXhhbXBsZSwgdGhlIGBrZXlwcmVzc2AgZXZlbnQgY2F1c2VzIHRoZSBga2V5UHJlc3Ng
IG1ldGhvZCBvbiB0aGUgdmlldyB0byBiZQogICBjYWxsZWQsIHRoZSBgZGJsY2xpY2tgIGV2ZW50
IGNhdXNlcyBgZG91YmxlQ2xpY2tgIHRvIGJlIGNhbGxlZCwgYW5kIHNvIG9uLgogCi0gIElmIHRo
ZXJlIGlzIGEgYnJvd3NlciBldmVudCB0aGF0IEVtYmVyIGRvZXMgbm90IGxpc3RlbiBmb3IgYnkg
ZGVmYXVsdCwgeW91Ci0gIGNhbiBzcGVjaWZ5IGN1c3RvbSBldmVudHMgYW5kIHRoZWlyIGNvcnJl
c3BvbmRpbmcgdmlldyBtZXRob2QgbmFtZXMgYnkKLSAgc2V0dGluZyB0aGUgYXBwbGljYXRpb24n
cyBgY3VzdG9tRXZlbnRzYCBwcm9wZXJ0eToKKyAgSWYgdGhlcmUgaXMgYSBidWJibGluZyBicm93
c2VyIGV2ZW50IHRoYXQgRW1iZXIgZG9lcyBub3QgbGlzdGVuIGZvciBieQorICBkZWZhdWx0LCB5
b3UgY2FuIHNwZWNpZnkgY3VzdG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2aWV3
IG1ldGhvZAorICBuYW1lcyBieSBzZXR0aW5nIHRoZSBhcHBsaWNhdGlvbidzIGBjdXN0b21FdmVu
dHNgIHByb3BlcnR5OgogCiAgIGBgYGphdmFzY3JpcHQKICAgQXBwID0gRW1iZXIuQXBwbGljYXRp
b24uY3JlYXRlKHsKICAgICBjdXN0b21FdmVudHM6IHsKLSAgICAgIC8vIGFkZCBzdXBwb3J0IGZv
ciB0aGUgbG9hZGVkbWV0YWRhdGEgbWVkaWEKLSAgICAgIC8vIHBsYXllciBldmVudAotICAgICAg
J2xvYWRlZG1ldGFkYXRhJzogImxvYWRlZE1ldGFkYXRhIgorICAgICAgLy8gYWRkIHN1cHBvcnQg
Zm9yIHRoZSBwYXN0ZSBldmVudAorICAgICAgcGFzdGU6ICJwYXN0ZSIKICAgICB9CiAgIH0pOwog
ICBgYGAKQEAgLTI0OTAyLDcgKzM4MjI5LDcgQEAgdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g
RW1iZXIuc2V0LAogCiAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFkdmFudGFnZXMgb2YgZXZl
bnQgZGVsZWdhdGlvbiBhbmQgdGhlIEVtYmVyIHZpZXcKICAgbGF5ZXIsIGFuZCBhIGxpc3Qgb2Yg
dGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGFyZSBzZXR1cCBieSBkZWZhdWx0LCB2aXNpdCB0aGUK
LSAgW0VtYmVyIFZpZXcgTGF5ZXIgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvdmll
d19sYXllciN0b2NfZXZlbnQtZGVsZWdhdGlvbikuCisgIFtFbWJlciBWaWV3IExheWVyIGd1aWRl
XShodHRwOi8vZW1iZXJqcy5jb20vZ3VpZGVzL3VuZGVyc3RhbmRpbmctZW1iZXIvdGhlLXZpZXct
bGF5ZXIvI3RvY19ldmVudC1kZWxlZ2F0aW9uKS4KIAogICAjIyMgSW5pdGlhbGl6ZXJzCiAKQEAg
LTI0OTEzLDcgKzM4MjQwLDcgQEAgdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
LAogICAgIG5hbWU6ICJzdG9yZSIsCiAKICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWlu
ZXIsIGFwcGxpY2F0aW9uKSB7Ci0gICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3JlJywgJ21h
aW4nLCBhcHBsaWNhdGlvbi5TdG9yZSk7CisgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3Jl
Om1haW4nLCBhcHBsaWNhdGlvbi5TdG9yZSk7CiAgICAgfQogICB9KTsKICAgYGBgCkBAIC0yNDky
MiwxMSArMzgyNDksMTQgQEAgdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAog
CiAgIEluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIHlvdXIgYXBwbGljYXRpb24ncyByb3V0ZXIsIGBF
bWJlci5BcHBsaWNhdGlvbmAgaXMKICAgYWxzbyByZXNwb25zaWJsZSBmb3IgdGVsbGluZyB0aGUg
cm91dGVyIHdoZW4gdG8gc3RhcnQgcm91dGluZy4gVHJhbnNpdGlvbnMKLSAgYmV0d2VlbiByb3V0
ZXMgY2FuIGJlIGxvZ2dlZCB3aXRoIHRoZSBMT0dfVFJBTlNJVElPTlMgZmxhZzoKKyAgYmV0d2Vl
biByb3V0ZXMgY2FuIGJlIGxvZ2dlZCB3aXRoIHRoZSBgTE9HX1RSQU5TSVRJT05TYCBmbGFnLCBh
bmQgbW9yZQorICBkZXRhaWxlZCBpbnRyYS10cmFuc2l0aW9uIGxvZ2dpbmcgY2FuIGJlIGxvZ2dl
ZCB3aXRoCisgIHRoZSBgTE9HX1RSQU5TSVRJT05TX0lOVEVSTkFMYCBmbGFnOgogCiAgIGBgYGph
dmFzY3JpcHQKICAgd2luZG93LkFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7Ci0gICAg
TE9HX1RSQU5TSVRJT05TOiB0cnVlCisgICAgTE9HX1RSQU5TSVRJT05TOiB0cnVlLCAvLyBiYXNp
YyBsb2dnaW5nIG9mIHN1Y2Nlc3NmdWwgdHJhbnNpdGlvbnMKKyAgICBMT0dfVFJBTlNJVElPTlNf
SU5URVJOQUw6IHRydWUgLy8gZGV0YWlsZWQgbG9nZ2luZyBvZiBhbGwgcm91dGluZyBzdGVwcwog
ICB9KTsKICAgYGBgCiAKQEAgLTI0OTM4LDI0ICszODI2OCwxNCBAQCB2YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQsCiAgIElmIHRoZXJlIGlzIGFueSBzZXR1cCByZXF1aXJlZCBi
ZWZvcmUgcm91dGluZyBiZWdpbnMsIHlvdSBjYW4gaW1wbGVtZW50IGEKICAgYHJlYWR5KClgIG1l
dGhvZCBvbiB5b3VyIGFwcCB0aGF0IHdpbGwgYmUgaW52b2tlZCBpbW1lZGlhdGVseSBiZWZvcmUg
cm91dGluZwogICBiZWdpbnMuCi0KLSAgVG8gYmVnaW4gcm91dGluZywgeW91IG11c3QgaGF2ZSBh
dCBhIG1pbmltdW0gYSB0b3AtbGV2ZWwgY29udHJvbGxlciBhbmQgdmlldy4KLSAgWW91IGRlZmlu
ZSB0aGVzZSBhcyBgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlcmAgYW5kIGBBcHAuQXBwbGljYXRp
b25WaWV3YCwKLSAgcmVzcGVjdGl2ZWx5LiBZb3VyIGFwcGxpY2F0aW9uIHdpbGwgbm90IHdvcmsg
aWYgeW91IGRvIG5vdCBkZWZpbmUgdGhlc2UgdHdvCi0gIG1hbmRhdG9yeSBjbGFzc2VzLiBGb3Ig
ZXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5BcHBsaWNhdGlvblZpZXcgPSBFbWJl
ci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGVOYW1lOiAnYXBwbGljYXRpb24nCi0gIH0pOwot
ICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoKTsK
ICAgYGBgCiAKICAgQGNsYXNzIEFwcGxpY2F0aW9uCiAgIEBuYW1lc3BhY2UgRW1iZXIKICAgQGV4
dGVuZHMgRW1iZXIuTmFtZXNwYWNlCiAqLwotdmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBwbGlj
YXRpb24gPSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKKwordmFyIEFwcGxpY2F0aW9uID0gRW1i
ZXIuQXBwbGljYXRpb24gPSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKEVtYmVyLkRlZmVycmVkTWl4
aW4sIHsKIAogICAvKioKICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBvZiB0aGUgQXBwbGljYXRp
b24uIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBhcyBhbgpAQCAtMjQ5OTYsNyArMzgzMTYsNyBAQCB2
YXIgQXBwbGljYXRpb24gPSBFbWJlci5BcHBsaWNhdGlvbiA9IEVtYmVyLk5hbWVzcGFjZS5leHRl
bmQoewogICAgIGBrZXl1cGAsIGFuZCBkZWxlZ2F0ZXMgdGhlbSB0byB5b3VyIGFwcGxpY2F0aW9u
J3MgYEVtYmVyLlZpZXdgCiAgICAgaW5zdGFuY2VzLgogCi0gICAgSWYgeW91IHdvdWxkIGxpa2Ug
YWRkaXRpb25hbCBldmVudHMgdG8gYmUgZGVsZWdhdGVkIHRvIHlvdXIKKyAgICBJZiB5b3Ugd291
bGQgbGlrZSBhZGRpdGlvbmFsIGJ1YmJsaW5nIGV2ZW50cyB0byBiZSBkZWxlZ2F0ZWQgdG8geW91
cgogICAgIHZpZXdzLCBzZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gJ3MgYGN1c3RvbUV2ZW50
c2AgcHJvcGVydHkKICAgICB0byBhIGhhc2ggY29udGFpbmluZyB0aGUgRE9NIGV2ZW50IG5hbWUg
YXMgdGhlIGtleSBhbmQgdGhlCiAgICAgY29ycmVzcG9uZGluZyB2aWV3IG1ldGhvZCBuYW1lIGFz
IHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGU6CkBAIC0yNTAwNCw5ICszODMyNCw4IEBAIHZhciBBcHBs
aWNhdGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZCh7CiAg
ICAgYGBgamF2YXNjcmlwdAogICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7CiAg
ICAgICBjdXN0b21FdmVudHM6IHsKLSAgICAgICAgLy8gYWRkIHN1cHBvcnQgZm9yIHRoZSBsb2Fk
ZWRtZXRhZGF0YSBtZWRpYQotICAgICAgICAvLyBwbGF5ZXIgZXZlbnQKLSAgICAgICAgJ2xvYWRl
ZG1ldGFkYXRhJzogImxvYWRlZE1ldGFkYXRhIgorICAgICAgICAvLyBhZGQgc3VwcG9ydCBmb3Ig
dGhlIHBhc3RlIGV2ZW50CisgICAgICAgIHBhc3RlOiAicGFzdGUiCiAgICAgICB9CiAgICAgfSk7
CiAgICAgYGBgCkBAIC0yNTAxNyw4ICszODMzNiw2IEBAIHZhciBBcHBsaWNhdGlvbiA9IEVtYmVy
LkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZCh7CiAgICovCiAgIGN1c3RvbUV2
ZW50czogbnVsbCwKIAotICBpc0luaXRpYWxpemVkOiBmYWxzZSwKLQogICAvLyBTdGFydCBvZmYg
dGhlIG51bWJlciBvZiBkZWZlcnJhbHMgYXQgMS4gVGhpcyB3aWxsIGJlCiAgIC8vIGRlY3JlbWVu
dGVkIGJ5IHRoZSBBcHBsaWNhdGlvbidzIG93biBgaW5pdGlhbGl6ZWAgbWV0aG9kLgogICBfcmVh
ZGluZXNzRGVmZXJyYWxzOiAxLApAQCAtMjUwMjcsMjkgKzM4MzQ0LDM1IEBAIHZhciBBcHBsaWNh
dGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZCh7CiAgICAg
aWYgKCF0aGlzLiQpIHsgdGhpcy4kID0gRW1iZXIuJDsgfQogICAgIHRoaXMuX19jb250YWluZXJf
XyA9IHRoaXMuYnVpbGRDb250YWluZXIoKTsKIAotICAgIHRoaXMuUm91dGVyID0gdGhpcy5Sb3V0
ZXIgfHwgdGhpcy5kZWZhdWx0Um91dGVyKCk7Ci0gICAgaWYgKHRoaXMuUm91dGVyKSB7IHRoaXMu
Um91dGVyLm5hbWVzcGFjZSA9IHRoaXM7IH0KKyAgICB0aGlzLlJvdXRlciA9IHRoaXMuZGVmYXVs
dFJvdXRlcigpOwogCiAgICAgdGhpcy5fc3VwZXIoKTsKIAotICAgIHRoaXMuZGVmZXJVbnRpbERP
TVJlYWR5KCk7CiAgICAgdGhpcy5zY2hlZHVsZUluaXRpYWxpemUoKTsKIAotICAgIEVtYmVyLmRl
YnVnKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7Ci0gICAgRW1iZXIuZGVidWco
J0VtYmVyLlZFUlNJT04gOiAnICsgRW1iZXIuVkVSU0lPTik7Ci0gICAgRW1iZXIuZGVidWcoJ0hh
bmRsZWJhcnMuVkVSU0lPTiA6ICcgKyBFbWJlci5IYW5kbGViYXJzLlZFUlNJT04pOwotICAgIEVt
YmVyLmRlYnVnKCdqUXVlcnkuVkVSU0lPTiA6ICcgKyBFbWJlci4kKCkuanF1ZXJ5KTsKLSAgICBF
bWJlci5kZWJ1ZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOworICAgIEVtYmVy
LmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdIYW5kbGViYXJzJywgRW1iZXIuSGFuZGxl
YmFycy5WRVJTSU9OKTsKKyAgICBFbWJlci5saWJyYXJpZXMucmVnaXN0ZXJDb3JlTGlicmFyeSgn
alF1ZXJ5JywgRW1iZXIuJCgpLmpxdWVyeSk7CisKKyAgICBpZiAoIEVtYmVyLkxPR19WRVJTSU9O
ICkgeworICAgICAgRW1iZXIuTE9HX1ZFUlNJT04gPSBmYWxzZTsgLy8gd2Ugb25seSBuZWVkIHRv
IHNlZSB0aGlzIG9uY2UgcGVyIEFwcGxpY2F0aW9uI2luaXQKKyAgICAgIHZhciBtYXhOYW1lTGVu
Z3RoID0gTWF0aC5tYXguYXBwbHkodGhpcywgRW1iZXIuQShFbWJlci5saWJyYXJpZXMpLm1hcEJ5
KCJuYW1lLmxlbmd0aCIpKTsKKworICAgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0nKTsKKyAgICAgIEVtYmVyLmxpYnJhcmllcy5lYWNoKGZ1bmN0aW9uKG5h
bWUsIHZlcnNpb24pIHsKKyAgICAgICAgdmFyIHNwYWNlcyA9IG5ldyBBcnJheShtYXhOYW1lTGVu
Z3RoIC0gbmFtZS5sZW5ndGggKyAxKS5qb2luKCIgIik7CisgICAgICAgIEVtYmVyLmRlYnVnKFtu
YW1lLCBzcGFjZXMsICcgOiAnLCB2ZXJzaW9uXS5qb2luKCIiKSk7CisgICAgICB9KTsKKyAgICAg
IEVtYmVyLmRlYnVnKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgfQog
ICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRlCi0KICAgICBCdWlsZCB0aGUgY29udGFpbmVyIGZv
ciB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4KIAogICAgIEFsc28gcmVnaXN0ZXIgYSBkZWZhdWx0
IGFwcGxpY2F0aW9uIHZpZXcgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24KICAgICBpdHNlbGYgZG9l
cyBub3QuCiAKKyAgICBAcHJpdmF0ZQogICAgIEBtZXRob2QgYnVpbGRDb250YWluZXIKICAgICBA
cmV0dXJuIHtFbWJlci5Db250YWluZXJ9IHRoZSBjb25maWd1cmVkIGNvbnRhaW5lcgogICAqLwpA
QCAtMjUwNjAsOCArMzgzODMsNiBAQCB2YXIgQXBwbGljYXRpb24gPSBFbWJlci5BcHBsaWNhdGlv
biA9IEVtYmVyLk5hbWVzcGFjZS5leHRlbmQoewogICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRl
Ci0KICAgICBJZiB0aGUgYXBwbGljYXRpb24gaGFzIG5vdCBvcHRlZCBvdXQgb2Ygcm91dGluZyBh
bmQgaGFzIG5vdCBleHBsaWNpdGx5CiAgICAgZGVmaW5lZCBhIHJvdXRlciwgc3VwcGx5IGEgZGVm
YXVsdCByb3V0ZXIgZm9yIHRoZSBhcHBsaWNhdGlvbiBhdXRob3IKICAgICB0byBjb25maWd1cmUu
CkBAIC0yNTA2OSw1MCArMzgzOTAsMzUgQEAgdmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBwbGlj
YXRpb24gPSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKICAgICBUaGlzIGFsbG93cyBhcHBsaWNh
dGlvbiBkZXZlbG9wZXJzIHRvIGRvOgogCiAgICAgYGBgamF2YXNjcmlwdAotICAgIEFwcCA9IEVt
YmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOworICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNhdGlv
bi5jcmVhdGUoKTsKIAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKG1hdGNoKSB7Ci0gICAg
ICBtYXRjaCgiLyIpLnRvKCJpbmRleCIpOworICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkg
eworICAgICAgdGhpcy5yZXNvdXJjZSgncG9zdHMnKTsKICAgICB9KTsKICAgICBgYGAKIAorICAg
IEBwcml2YXRlCiAgICAgQG1ldGhvZCBkZWZhdWx0Um91dGVyCiAgICAgQHJldHVybiB7RW1iZXIu
Um91dGVyfSB0aGUgZGVmYXVsdCByb3V0ZXIKICAgKi8KLSAgZGVmYXVsdFJvdXRlcjogZnVuY3Rp
b24oKSB7Ci0gICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBBcHAuUm91dGVyIGlmIG9uZSB3YXMgbm90
IHN1cHBsaWVkIHRvIG1ha2UKLSAgICAvLyBpdCBwb3NzaWJsZSB0byBkbyBBcHAuUm91dGVyLm1h
cCguLi4pIHdpdGhvdXQgZXhwbGljaXRseQotICAgIC8vIGNyZWF0aW5nIGEgcm91dGVyIGZpcnN0
LgotICAgIGlmICh0aGlzLnJvdXRlciA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICByZXR1cm4gRW1i
ZXIuUm91dGVyLmV4dGVuZCgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQog
Ci0gICAgRGVmZXIgRW1iZXIgcmVhZGluZXNzIHVudGlsIERPTSByZWFkaW5lc3MuIEJ5IGRlZmF1
bHQsIEVtYmVyCi0gICAgd2lsbCB3YWl0IGZvciBib3RoIERPTSByZWFkaW5lc3MgYW5kIGFwcGxp
Y2F0aW9uIGluaXRpYWxpemF0aW9uLAotICAgIGFzIHdlbGwgYXMgYW55IGRlZmVycmFscyByZWdp
c3RlcmVkIGJ5IGluaXRpYWxpemVycy4KKyAgZGVmYXVsdFJvdXRlcjogZnVuY3Rpb24oKSB7Cisg
ICAgaWYgKHRoaXMuUm91dGVyID09PSBmYWxzZSkgeyByZXR1cm47IH0KKyAgICB2YXIgY29udGFp
bmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwogCi0gICAgQG1ldGhvZCBkZWZlclVudGlsRE9NUmVh
ZHkKLSAgKi8KLSAgZGVmZXJVbnRpbERPTVJlYWR5OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmRl
ZmVyUmVhZGluZXNzKCk7CisgICAgaWYgKHRoaXMuUm91dGVyKSB7CisgICAgICBjb250YWluZXIu
dW5yZWdpc3Rlcigncm91dGVyOm1haW4nKTsKKyAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91
dGVyOm1haW4nLCB0aGlzLlJvdXRlcik7CisgICAgfQogCi0gICAgdmFyIHNlbGYgPSB0aGlzOwot
ICAgIHRoaXMuJCgpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgc2VsZi5hZHZhbmNlUmVhZGlu
ZXNzKCk7Ci0gICAgfSk7CisgICAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KCdyb3V0
ZXI6bWFpbicpOwogICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRlCi0KICAgICBBdXRvbWF0aWNh
bGx5IGluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9uY2UgdGhlIERPTSBoYXMKICAgICBiZWNv
bWUgcmVhZHkuCiAKLSAgICBUaGUgaW5pdGlhbGl6YXRpb24gaXRzZWxmIGlzIGRlZmVycmVkIHVz
aW5nIEVtYmVyLnJ1bi5vbmNlLAorICAgIFRoZSBpbml0aWFsaXphdGlvbiBpdHNlbGYgaXMgc2No
ZWR1bGVkIG9uIHRoZSBhY3Rpb25zIHF1ZXVlCiAgICAgd2hpY2ggZW5zdXJlcyB0aGF0IGFwcGxp
Y2F0aW9uIGxvYWRpbmcgZmluaXNoZXMgYmVmb3JlCiAgICAgYm9vdGluZy4KIApAQCAtMjUxMjEs
MTQgKzM4NDI3LDE5IEBAIHZhciBBcHBsaWNhdGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1i
ZXIuTmFtZXNwYWNlLmV4dGVuZCh7CiAgICAgYGFkdmFuY2VSZWFkaW5lc3MoKWAgb25jZSBhbGwg
b2YgeW91ciBjb2RlIGhhcyBmaW5pc2hlZAogICAgIGxvYWRpbmcuCiAKKyAgICBAcHJpdmF0ZQog
ICAgIEBtZXRob2Qgc2NoZWR1bGVJbml0aWFsaXplCiAgICovCiAgIHNjaGVkdWxlSW5pdGlhbGl6
ZTogZnVuY3Rpb24oKSB7CiAgICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIHRoaXMuJCgpLnJlYWR5
KGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHNlbGYuaXNEZXN0cm95ZWQgfHwgc2VsZi5pc0luaXRp
YWxpemVkKSByZXR1cm47Ci0gICAgICBFbWJlci5ydW4ub25jZShzZWxmLCAnaW5pdGlhbGl6ZScp
OwotICAgIH0pOworCisgICAgaWYgKCF0aGlzLiQgfHwgdGhpcy4kLmlzUmVhZHkpIHsKKyAgICAg
IEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHNlbGYsICdfaW5pdGlhbGl6ZScpOworICAg
IH0gZWxzZSB7CisgICAgICB0aGlzLiQoKS5yZWFkeShmdW5jdGlvbiBydW5Jbml0aWFsaXplKCkg
eworICAgICAgICBFbWJlci5ydW4oc2VsZiwgJ19pbml0aWFsaXplJyk7CisgICAgICB9KTsKKyAg
ICB9CiAgIH0sCiAKICAgLyoqCkBAIC0yNTE1NSwxNSArMzg0NjYsMjEgQEAgdmFyIEFwcGxpY2F0
aW9uID0gRW1iZXIuQXBwbGljYXRpb24gPSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKICAgICBA
bWV0aG9kIGRlZmVyUmVhZGluZXNzCiAgICovCiAgIGRlZmVyUmVhZGluZXNzOiBmdW5jdGlvbigp
IHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IGNhbGwgZGVmZXJSZWFkaW5lc3Mgb24gYW4g
aW5zdGFuY2Ugb2YgRW1iZXIuQXBwbGljYXRpb24iLCB0aGlzIGluc3RhbmNlb2YgRW1iZXIuQXBw
bGljYXRpb24pOwogICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBkZWZlciByZWFkaW5lc3Mg
c2luY2UgdGhlIGByZWFkeSgpYCBob29rIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiIsIHRoaXMu
X3JlYWRpbmVzc0RlZmVycmFscyA+IDApOwogICAgIHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscysr
OwogICB9LAogCiAgIC8qKgorICAgIENhbGwgYGFkdmFuY2VSZWFkaW5lc3NgIGFmdGVyIGFueSBh
c3luY2hyb25vdXMgc2V0dXAgbG9naWMgaGFzIGNvbXBsZXRlZC4KKyAgICBFYWNoIGNhbGwgdG8g
YGRlZmVyUmVhZGluZXNzYCBtdXN0IGJlIG1hdGNoZWQgYnkgYSBjYWxsIHRvIGBhZHZhbmNlUmVh
ZGluZXNzYAorICAgIG9yIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlY29tZSByZWFkeSBh
bmQgcm91dGluZyB3aWxsIG5vdCBiZWdpbi4KKwogICAgIEBtZXRob2QgYWR2YW5jZVJlYWRpbmVz
cwogICAgIEBzZWUge0VtYmVyLkFwcGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzfQogICAqLwogICBh
ZHZhbmNlUmVhZGluZXNzOiBmdW5jdGlvbigpIHsKKyAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0
IGNhbGwgYWR2YW5jZVJlYWRpbmVzcyBvbiBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBsaWNhdGlv
biIsIHRoaXMgaW5zdGFuY2VvZiBFbWJlci5BcHBsaWNhdGlvbik7CiAgICAgdGhpcy5fcmVhZGlu
ZXNzRGVmZXJyYWxzLS07CiAKICAgICBpZiAodGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzID09PSAw
KSB7CkBAIC0yNTE3OSwxOSArMzg0OTYsMjAgQEAgdmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBw
bGljYXRpb24gPSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKICAgICBgYGBqYXZhc2NyaXB0CiAg
ICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CiAKLSAgICBBcHAuUGVyc29uID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCh7fSk7Ci0gICAgQXBwLk9yYW5nZSA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoe30pOwotICAgIEFwcC5FbWFpbCAgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHt9KTsKKyAg
ICBBcHAuUGVyc29uICA9IEVtYmVyLk9iamVjdC5leHRlbmQoe30pOworICAgIEFwcC5PcmFuZ2Ug
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7fSk7CisgICAgQXBwLkVtYWlsICAgPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKHt9KTsKKyAgICBBcHAuc2Vzc2lvbiA9IEVtYmVyLk9iamVjdC5jcmVhdGUoe30p
OwogCiAgICAgQXBwLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgQXBwLlBlcnNvbiwge3NpbmdsZXRv
bjogZmFsc2UgfSk7CiAgICAgQXBwLnJlZ2lzdGVyKCdmcnVpdDpmYXZvcml0ZScsIEFwcC5PcmFu
Z2UpOwogICAgIEFwcC5yZWdpc3RlcignY29tbXVuaWNhdGlvbjptYWluJywgQXBwLkVtYWlsLCB7
c2luZ2xldG9uOiBmYWxzZX0pOworICAgIEFwcC5yZWdpc3Rlcignc2Vzc2lvbicsIEFwcC5zZXNz
aW9uLCB7aW5zdGFudGlhdGU6IGZhbHNlfSk7CiAgICAgYGBgCiAKICAgICBAbWV0aG9kIHJlZ2lz
dGVyCi0gICAgQHBhcmFtICB0eXBlIHtTdHJpbmd9Ci0gICAgQHBhcmFtICBuYW1lIHtTdHJpbmd9
Ci0gICAgQHBhcmFtICBmYWN0b3J5IHtTdHJpbmd9CisgICAgQHBhcmFtICBmdWxsTmFtZSB7U3Ry
aW5nfSB0eXBlOm5hbWUgKGUuZy4sICdtb2RlbDp1c2VyJykKKyAgICBAcGFyYW0gIGZhY3Rvcnkg
e0Z1bmN0aW9ufSAoZS5nLiwgQXBwLlBlcnNvbikKICAgICBAcGFyYW0gIG9wdGlvbnMge1N0cmlu
Z30gKG9wdGlvbmFsKQogICAqKi8KICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKCkgewpAQCAtMjUyMTQs
NDggKzM4NTMyLDE0MSBAQCB2YXIgQXBwbGljYXRpb24gPSBFbWJlci5BcHBsaWNhdGlvbiA9IEVt
YmVyLk5hbWVzcGFjZS5leHRlbmQoewogICAgIEBwYXJhbSAgcHJvcGVydHkge1N0cmluZ30KICAg
ICBAcGFyYW0gIGluamVjdGlvbk5hbWUge1N0cmluZ30KICAgKiovCi0gIGluamVjdDogZnVuY3Rp
b24oKXsKKyAgaW5qZWN0OiBmdW5jdGlvbigpIHsKICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5f
X2NvbnRhaW5lcl9fOwogICAgIGNvbnRhaW5lci5pbmplY3Rpb24uYXBwbHkoY29udGFpbmVyLCBh
cmd1bWVudHMpOwogICB9LAogCi0gIC8qKgotICAgIEBwcml2YXRlCisgIC8qKgorICAgIENhbGxp
bmcgaW5pdGlhbGl6ZSBtYW51YWxseSBpcyBub3Qgc3VwcG9ydGVkLgorCisgICAgUGxlYXNlIHNl
ZSBFbWJlci5BcHBsaWNhdGlvbiNhZHZhbmNlUmVhZGluZXNzIGFuZAorICAgIEVtYmVyLkFwcGxp
Y2F0aW9uI2RlZmVyUmVhZGluZXNzLgorCisgICAgQHByaXZhdGUKKyAgICBAZGVwcmVjYXRlZAor
ICAgIEBtZXRob2QgaW5pdGlhbGl6ZQorICAgKiovCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkg
eworICAgIEVtYmVyLmRlcHJlY2F0ZSgnQ2FsbGluZyBpbml0aWFsaXplIG1hbnVhbGx5IGlzIG5v
dCBzdXBwb3J0ZWQuIFBsZWFzZSBzZWUgRW1iZXIuQXBwbGljYXRpb24jYWR2YW5jZVJlYWRpbmVz
cyBhbmQgRW1iZXIuQXBwbGljYXRpb24jZGVmZXJSZWFkaW5lc3MnKTsKKyAgfSwKKyAgLyoqCisg
ICAgSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24uIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5
LgorCisgICAgUnVuIGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRpb24gbG9h
ZCBob29rLiBUaGVzZSBob29rcyBtYXkKKyAgICBjaG9vc2UgdG8gZGVmZXIgcmVhZGluZXNzLiBG
b3IgZXhhbXBsZSwgYW4gYXV0aGVudGljYXRpb24gaG9vayBtaWdodCB3YW50CisgICAgdG8gZGVm
ZXIgcmVhZGluZXNzIHVudGlsIHRoZSBhdXRoIHRva2VuIGhhcyBiZWVuIHJldHJpZXZlZC4KKwor
ICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfaW5pdGlhbGl6ZQorICAqLworICBfaW5pdGlhbGl6
ZTogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHsgcmV0dXJuOyB9CisK
KyAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgQXBwLlJvdXRlciBtdXN0IGFscmVhZHkgYmUgYXNz
aWduZWQKKyAgICBpZiAodGhpcy5Sb3V0ZXIpIHsKKyAgICAgIHZhciBjb250YWluZXIgPSB0aGlz
Ll9fY29udGFpbmVyX187CisgICAgICBjb250YWluZXIudW5yZWdpc3Rlcigncm91dGVyOm1haW4n
KTsKKyAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCB0aGlzLlJvdXRlcik7
CisgICAgfQorCisgICAgdGhpcy5ydW5Jbml0aWFsaXplcnMoKTsKKyAgICBFbWJlci5ydW5Mb2Fk
SG9va3MoJ2FwcGxpY2F0aW9uJywgdGhpcyk7CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCBhbnkg
aW5pdGlhbGl6ZXJzIG9yIGxvYWQgaG9va3MgdGhhdCB3b3VsZCBoYXZlIHdhbnRlZAorICAgIC8v
IHRvIGRlZmVyIHJlYWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBnZW5lcmFsLCBhZHZhbmNpbmcgcmVh
ZGluZXNzIGhlcmUKKyAgICAvLyB3aWxsIHByb2NlZWQgdG8gZGlkQmVjb21lUmVhZHkuCisgICAg
dGhpcy5hZHZhbmNlUmVhZGluZXNzKCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICAv
KioKKyAgICBSZXNldCB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgb25s
eSBpbiB0ZXN0cy4gSXQgY2xlYW5zIHVwCisgICAgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSBmb2xs
b3dpbmcgb3JkZXI6CisKKyAgICAxLiBEZWFjdGl2YXRlIGV4aXN0aW5nIHJvdXRlcworICAgIDIu
IERlc3Ryb3kgYWxsIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lcgorICAgIDMuIENyZWF0ZSBhIG5l
dyBhcHBsaWNhdGlvbiBjb250YWluZXIKKyAgICA0LiBSZS1yb3V0ZSB0byB0aGUgZXhpc3Rpbmcg
dXJsCisKKyAgICBUeXBpY2FsIEV4YW1wbGU6CisKKyAgICBgYGBqYXZhc2NyaXB0CisKKyAgICB2
YXIgQXBwOworCisgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgeworICAgICAgQXBwID0gRW1iZXIu
QXBwbGljYXRpb24uY3JlYXRlKCk7CisgICAgfSk7CisKKyAgICBtb2R1bGUoImFjY2VwdGFuY2Ug
dGVzdCIsIHsKKyAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgQXBwLnJlc2V0KCk7
CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCJmaXJzdCB0ZXN0IiwgZnVuY3Rpb24oKSB7
CisgICAgICAvLyBBcHAgaXMgZnJlc2hseSByZXNldAorICAgIH0pOworCisgICAgdGVzdCgiZmly
c3QgdGVzdCIsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gQXBwIGlzIGFnYWluIGZyZXNobHkgcmVz
ZXQKKyAgICB9KTsKKyAgICBgYGAKIAotICAgIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uLiBU
aGlzIGhhcHBlbnMgYXV0b21hdGljYWxseS4KKyAgICBBZHZhbmNlZCBFeGFtcGxlOgogCi0gICAg
UnVuIGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRpb24gbG9hZCBob29rLiBU
aGVzZSBob29rcyBtYXkKLSAgICBjaG9vc2UgdG8gZGVmZXIgcmVhZGluZXNzLiBGb3IgZXhhbXBs
ZSwgYW4gYXV0aGVudGljYXRpb24gaG9vayBtaWdodCB3YW50Ci0gICAgdG8gZGVmZXIgcmVhZGlu
ZXNzIHVudGlsIHRoZSBhdXRoIHRva2VuIGhhcyBiZWVuIHJldHJpZXZlZC4KKyAgICBPY2Nhc2lv
bmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tIGluaXRpYWxpemluZyBk
dXJpbmcKKyAgICBzZXR1cC4gVGhpcyBjb3VsZCBlbmFibGUgZXh0cmEgY29uZmlndXJhdGlvbiwg
b3IgZW5hYmxlIGFzc2VydGluZyBwcmlvcgorICAgIHRvIHRoZSBhcHAgYmVjb21pbmcgcmVhZHku
CiAKLSAgICBAbWV0aG9kIGluaXRpYWxpemUKLSAgKi8KLSAgaW5pdGlhbGl6ZTogZnVuY3Rpb24o
KSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJBcHBsaWNhdGlvbiBpbml0aWFsaXplIG1heSBvbmx5IGJl
IGNhbGxlZCBvbmNlIiwgIXRoaXMuaXNJbml0aWFsaXplZCk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJD
YW5ub3QgaW5pdGlhbGl6ZSBhIGRlc3Ryb3llZCBhcHBsaWNhdGlvbiIsICF0aGlzLmlzRGVzdHJv
eWVkKTsKLSAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIGBgYGphdmFzY3JpcHQK
IAotICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBBcHAuUm91dGVyIG11c3QgYWxyZWFkeSBiZSBh
c3NpZ25lZAotICAgIHRoaXMuX19jb250YWluZXJfXy5yZWdpc3Rlcigncm91dGVyJywgJ21haW4n
LCB0aGlzLlJvdXRlcik7CisgICAgdmFyIEFwcDsKIAotICAgIHRoaXMucnVuSW5pdGlhbGl6ZXJz
KCk7Ci0gICAgRW1iZXIucnVuTG9hZEhvb2tzKCdhcHBsaWNhdGlvbicsIHRoaXMpOworICAgIEVt
YmVyLnJ1bihmdW5jdGlvbigpIHsKKyAgICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0
ZSgpOworICAgIH0pOwogCi0gICAgLy8gQXQgdGhpcyBwb2ludCwgYW55IGluaXRpYWxpemVycyBv
ciBsb2FkIGhvb2tzIHRoYXQgd291bGQgaGF2ZSB3YW50ZWQKLSAgICAvLyB0byBkZWZlciByZWFk
aW5lc3MgaGF2ZSBmaXJlZC4gSW4gZ2VuZXJhbCwgYWR2YW5jaW5nIHJlYWRpbmVzcyBoZXJlCi0g
ICAgLy8gd2lsbCBwcm9jZWVkIHRvIGRpZEJlY29tZVJlYWR5LgotICAgIHRoaXMuYWR2YW5jZVJl
YWRpbmVzcygpOworICAgIG1vZHVsZSgiYWNjZXB0YW5jZSB0ZXN0IiwgeworICAgICAgc2V0dXA6
IGZ1bmN0aW9uKCkgeworICAgICAgICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7CisgICAgICAgICAg
QXBwLnJlc2V0KCk7CisgICAgICAgICAgQXBwLmRlZmVyUmVhZGluZXNzKCk7CisgICAgICAgIH0p
OworICAgICAgfQorICAgIH0pOwogCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCisgICAgdGVzdCgi
Zmlyc3QgdGVzdCIsIGZ1bmN0aW9uKCkgeworICAgICAgb2sodHJ1ZSwgJ3NvbWV0aGluZyBiZWZv
cmUgYXBwIGlzIGluaXRpYWxpemVkJyk7CisKKyAgICAgIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsK
KyAgICAgICAgQXBwLmFkdmFuY2VSZWFkaW5lc3MoKTsKKyAgICAgIH0pOworICAgICAgb2sodHJ1
ZSwgJ3NvbWV0aGluZyBhZnRlciBhcHAgaXMgaW5pdGlhbGl6ZWQnKTsKKyAgICB9KTsKKyAgICBg
YGAKIAorICAgIEBtZXRob2QgcmVzZXQKKyAgKiovCiAgIHJlc2V0OiBmdW5jdGlvbigpIHsKLSAg
ICBnZXQodGhpcywgJ19fY29udGFpbmVyX18nKS5kZXN0cm95KCk7Ci0gICAgdGhpcy5idWlsZENv
bnRhaW5lcigpOworICAgIHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9IDE7CiAKLSAgICB0aGlz
LmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICB0aGlz
LnN0YXJ0Um91dGluZygpOworICAgIGZ1bmN0aW9uIGhhbmRsZVJlc2V0KCkgeworICAgICAgdmFy
IHJvdXRlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJyk7CisgICAg
ICByb3V0ZXIucmVzZXQoKTsKKworICAgICAgRW1iZXIucnVuKHRoaXMuX19jb250YWluZXJfXywg
J2Rlc3Ryb3knKTsKKworICAgICAgdGhpcy5idWlsZENvbnRhaW5lcigpOworCisgICAgICBFbWJl
ci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhp
cy5faW5pdGlhbGl6ZSgpOworICAgICAgfSk7CisgICAgfQorCisgICAgRW1iZXIucnVuLmpvaW4o
dGhpcywgaGFuZGxlUmVzZXQpOwogICB9LAogCiAgIC8qKgpAQCAtMjUyNjcsMTUgKzM4Njc4LDE2
IEBAIHZhciBBcHBsaWNhdGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNl
LmV4dGVuZCh7CiAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX19jb250YWluZXJfXywKICAgICAg
ICAgZ3JhcGggPSBuZXcgRW1iZXIuREFHKCksCiAgICAgICAgIG5hbWVzcGFjZSA9IHRoaXMsCi0g
ICAgICAgIHByb3BlcnRpZXMsIGksIGluaXRpYWxpemVyOworICAgICAgICBuYW1lLCBpbml0aWFs
aXplcjsKIAotICAgIGZvciAoaT0wOyBpPGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykgewotICAg
ICAgaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcnNbaV07CisgICAgZm9yIChuYW1lIGluIGluaXRp
YWxpemVycykgeworICAgICAgaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcnNbbmFtZV07CiAgICAg
ICBncmFwaC5hZGRFZGdlcyhpbml0aWFsaXplci5uYW1lLCBpbml0aWFsaXplci5pbml0aWFsaXpl
LCBpbml0aWFsaXplci5iZWZvcmUsIGluaXRpYWxpemVyLmFmdGVyKTsKICAgICB9CiAKICAgICBn
cmFwaC50b3Bzb3J0KGZ1bmN0aW9uICh2ZXJ0ZXgpIHsKICAgICAgIHZhciBpbml0aWFsaXplciA9
IHZlcnRleC52YWx1ZTsKKyAgICAgIEVtYmVyLmFzc2VydCgiTm8gYXBwbGljYXRpb24gaW5pdGlh
bGl6ZXIgbmFtZWQgJyIrdmVydGV4Lm5hbWUrIiciLCBpbml0aWFsaXplcik7CiAgICAgICBpbml0
aWFsaXplcihjb250YWluZXIsIG5hbWVzcGFjZSk7CiAgICAgfSk7CiAgIH0sCkBAIC0yNTI5NCw0
NyArMzg3MDYsMzIgQEAgdmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBwbGljYXRpb24gPSBFbWJl
ci5OYW1lc3BhY2UuZXh0ZW5kKHsKICAgICAgIEVtYmVyLk5hbWVzcGFjZS5wcm9jZXNzQWxsKCk7
CiAgICAgICBFbWJlci5CT09URUQgPSB0cnVlOwogICAgIH0KKworICAgIHRoaXMucmVzb2x2ZSh0
aGlzKTsKICAgfSwKIAogICAvKioKLSAgICBAcHJpdmF0ZQotCiAgICAgU2V0dXAgdXAgdGhlIGV2
ZW50IGRpc3BhdGNoZXIgdG8gcmVjZWl2ZSBldmVudHMgb24gdGhlCiAgICAgYXBwbGljYXRpb24n
cyBgcm9vdEVsZW1lbnRgIHdpdGggYW55IHJlZ2lzdGVyZWQKICAgICBgY3VzdG9tRXZlbnRzYC4K
IAorICAgIEBwcml2YXRlCiAgICAgQG1ldGhvZCBzZXR1cEV2ZW50RGlzcGF0Y2hlcgogICAqLwog
ICBzZXR1cEV2ZW50RGlzcGF0Y2hlcjogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGV2ZW50RGlzcGF0
Y2hlciA9IHRoaXMuY3JlYXRlRXZlbnREaXNwYXRjaGVyKCksCi0gICAgICAgIGN1c3RvbUV2ZW50
cyAgICA9IGdldCh0aGlzLCAnY3VzdG9tRXZlbnRzJyk7Ci0KLSAgICBldmVudERpc3BhdGNoZXIu
c2V0dXAoY3VzdG9tRXZlbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAg
Q3JlYXRlIGFuIGV2ZW50IGRpc3BhdGNoZXIgZm9yIHRoZSBhcHBsaWNhdGlvbidzIGByb290RWxl
bWVudGAuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlcgotICAqLwotICBjcmVh
dGVFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciByb290RWxlbWVudCA9IGdl
dCh0aGlzLCAncm9vdEVsZW1lbnQnKSwKLSAgICAgICAgZXZlbnREaXNwYXRjaGVyID0gRW1iZXIu
RXZlbnREaXNwYXRjaGVyLmNyZWF0ZSh7Ci0gICAgICAgICAgcm9vdEVsZW1lbnQ6IHJvb3RFbGVt
ZW50Ci0gICAgICAgIH0pOworICAgIHZhciBjdXN0b21FdmVudHMgPSBnZXQodGhpcywgJ2N1c3Rv
bUV2ZW50cycpLAorICAgICAgICByb290RWxlbWVudCA9IGdldCh0aGlzLCAncm9vdEVsZW1lbnQn
KSwKKyAgICAgICAgZGlzcGF0Y2hlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ2V2ZW50
X2Rpc3BhdGNoZXI6bWFpbicpOwogCi0gICAgc2V0KHRoaXMsICdldmVudERpc3BhdGNoZXInLCBl
dmVudERpc3BhdGNoZXIpOwotICAgIHJldHVybiBldmVudERpc3BhdGNoZXI7CisgICAgc2V0KHRo
aXMsICdldmVudERpc3BhdGNoZXInLCBkaXNwYXRjaGVyKTsKKyAgICBkaXNwYXRjaGVyLnNldHVw
KGN1c3RvbUV2ZW50cywgcm9vdEVsZW1lbnQpOwogICB9LAogCiAgIC8qKgotICAgIEBwcml2YXRl
Ci0KLSAgICBJZiB0aGUgYXBwbGljYXRpb24gaGFzIGEgcm91dGVyLCB1c2UgaXQgdG8gcm91dGUg
dG8gdGhlIGN1cnJlbnQgVVJMLCBhbmQKICAgICB0cmlnZ2VyIGEgbmV3IGNhbGwgdG8gYHJvdXRl
YCB3aGVuZXZlciB0aGUgVVJMIGNoYW5nZXMuCisgICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBh
IHJvdXRlciwgdXNlIGl0IHRvIHJvdXRlIHRvIHRoZSBjdXJyZW50IFVSTCwgYW5kCiAKKyAgICBA
cHJpdmF0ZQogICAgIEBtZXRob2Qgc3RhcnRSb3V0aW5nCiAgICAgQHByb3BlcnR5IHJvdXRlciB7
RW1iZXIuUm91dGVyfQogICAqLwpAQCAtMjUzNTksMTMgKzM4NzU2LDI2IEBAIHZhciBBcHBsaWNh
dGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZCh7CiAgICov
CiAgIHJlYWR5OiBFbWJlci5LLAogCisgIC8qKgorICAgIEBkZXByZWNhdGVkIFVzZSAnUmVzb2x2
ZXInIGluc3RlYWQKKyAgICBTZXQgdGhpcyB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBjbGFzcyB0
byBgRW1iZXIuRGVmYXVsdFJlc29sdmVyYAorCisKKyAgICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAg
Ki8KKyAgcmVzb2x2ZXI6IG51bGwsCisKKyAgLyoqCisgICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBh
biBhbHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKKworICAgIEBwcm9w
ZXJ0eSByZXNvbHZlcgorICAqLworICBSZXNvbHZlcjogbnVsbCwKKwogICB3aWxsRGVzdHJveTog
ZnVuY3Rpb24oKSB7CiAgICAgRW1iZXIuQk9PVEVEID0gZmFsc2U7CiAKLSAgICB2YXIgZXZlbnRE
aXNwYXRjaGVyID0gZ2V0KHRoaXMsICdldmVudERpc3BhdGNoZXInKTsKLSAgICBpZiAoZXZlbnRE
aXNwYXRjaGVyKSB7IGV2ZW50RGlzcGF0Y2hlci5kZXN0cm95KCk7IH0KLQotICAgIGdldCh0aGlz
LCAnX19jb250YWluZXJfXycpLmRlc3Ryb3koKTsKKyAgICB0aGlzLl9fY29udGFpbmVyX18uZGVz
dHJveSgpOwogICB9LAogCiAgIGluaXRpYWxpemVyOiBmdW5jdGlvbihvcHRpb25zKSB7CkBAIC0y
NTM3NCwyMSArMzg3ODQsMjYgQEAgdmFyIEFwcGxpY2F0aW9uID0gRW1iZXIuQXBwbGljYXRpb24g
PSBFbWJlci5OYW1lc3BhY2UuZXh0ZW5kKHsKIH0pOwogCiBFbWJlci5BcHBsaWNhdGlvbi5yZW9w
ZW5DbGFzcyh7Ci0gIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IFsnaW5pdGlhbGl6ZXJzJ10sCi0g
IGluaXRpYWxpemVyczogRW1iZXIuQSgpLAorICBpbml0aWFsaXplcnM6IHt9LAogICBpbml0aWFs
aXplcjogZnVuY3Rpb24oaW5pdGlhbGl6ZXIpIHsKLSAgICB2YXIgaW5pdGlhbGl6ZXJzID0gZ2V0
KHRoaXMsICdpbml0aWFsaXplcnMnKTsKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBpbml0
aWFsaXplciBiZWluZyBhZGRlZCB0byBhIHN1YmNsYXNzLCB3ZSBhcmUgZ29pbmcgdG8gcmVvcGVu
IHRoZSBjbGFzcworICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbmV3IGBpbml0aWFsaXpl
cnNgIG9iamVjdCwgd2hpY2ggZXh0ZW5kcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MnIHVzaW5nCisg
ICAgLy8gcHJvdG90eXBhbCBpbmhlcml0YW5jZS4gV2l0aG91dCB0aGlzLCBhdHRlbXB0aW5nIHRv
IGFkZCBpbml0aWFsaXplcnMgdG8gdGhlIHN1YmNsYXNzIHdvdWxkCisgICAgLy8gcG9sbHV0ZSB0
aGUgcGFyZW50IGNsYXNzIGFzIHdlbGwgYXMgb3RoZXIgc3ViY2xhc3Nlcy4KKyAgICBpZiAodGhp
cy5zdXBlcmNsYXNzLmluaXRpYWxpemVycyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc3VwZXJjbGFz
cy5pbml0aWFsaXplcnMgPT09IHRoaXMuaW5pdGlhbGl6ZXJzKSB7CisgICAgICB0aGlzLnJlb3Bl
bkNsYXNzKHsKKyAgICAgICAgaW5pdGlhbGl6ZXJzOiBFbWJlci5jcmVhdGUodGhpcy5pbml0aWFs
aXplcnMpCisgICAgICB9KTsKKyAgICB9CiAKLSAgICBFbWJlci5hc3NlcnQoIlRoZSBpbml0aWFs
aXplciAnIiArIGluaXRpYWxpemVyLm5hbWUgKyAiJyBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVy
ZWQiLCAhaW5pdGlhbGl6ZXJzLmZpbmRQcm9wZXJ0eSgnbmFtZScsIGluaXRpYWxpemVycy5uYW1l
KSk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJBbiBpbmplY3Rpb24gY2Fubm90IGJlIHJlZ2lzdGVyZWQg
d2l0aCBib3RoIGEgYmVmb3JlIGFuZCBhbiBhZnRlciIsICEoaW5pdGlhbGl6ZXIuYmVmb3JlICYm
IGluaXRpYWxpemVyLmFmdGVyKSk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJBbiBpbmplY3Rpb24gY2Fu
bm90IGJlIHJlZ2lzdGVyZWQgd2l0aG91dCBhbiBpbmplY3Rpb24gZnVuY3Rpb24iLCBFbWJlci5j
YW5JbnZva2UoaW5pdGlhbGl6ZXIsICdpbml0aWFsaXplJykpOworICAgIEVtYmVyLmFzc2VydCgi
VGhlIGluaXRpYWxpemVyICciICsgaW5pdGlhbGl6ZXIubmFtZSArICInIGhhcyBhbHJlYWR5IGJl
ZW4gcmVnaXN0ZXJlZCIsICF0aGlzLmluaXRpYWxpemVyc1tpbml0aWFsaXplci5uYW1lXSk7Cisg
ICAgRW1iZXIuYXNzZXJ0KCJBbiBpbml0aWFsaXplciBjYW5ub3QgYmUgcmVnaXN0ZXJlZCB3aXRo
IGJvdGggYSBiZWZvcmUgYW5kIGFuIGFmdGVyIiwgIShpbml0aWFsaXplci5iZWZvcmUgJiYgaW5p
dGlhbGl6ZXIuYWZ0ZXIpKTsKKyAgICBFbWJlci5hc3NlcnQoIkFuIGluaXRpYWxpemVyIGNhbm5v
dCBiZSByZWdpc3RlcmVkIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbiIsIEVtYmVyLmNh
bkludm9rZShpbml0aWFsaXplciwgJ2luaXRpYWxpemUnKSk7CiAKLSAgICBpbml0aWFsaXplcnMu
cHVzaChpbml0aWFsaXplcik7CisgICAgdGhpcy5pbml0aWFsaXplcnNbaW5pdGlhbGl6ZXIubmFt
ZV0gPSBpbml0aWFsaXplcjsKICAgfSwKIAogICAvKioKLSAgICBAcHJpdmF0ZQotCiAgICAgVGhp
cyBjcmVhdGVzIGEgY29udGFpbmVyIHdpdGggdGhlIGRlZmF1bHQgRW1iZXIgbmFtaW5nIGNvbnZl
bnRpb25zLgogCiAgICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSBjb250YWluZXI6CkBAIC0yNTQw
Niw2ICszODgyMSw3IEBAIEVtYmVyLkFwcGxpY2F0aW9uLnJlb3BlbkNsYXNzKHsKICAgICAqIHRo
ZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSBhcyBp
dHMKICAgICAgIGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5CiAKKyAgICBAcHJpdmF0ZQogICAg
IEBtZXRob2QgYnVpbGRDb250YWluZXIKICAgICBAc3RhdGljCiAgICAgQHBhcmFtIHtFbWJlci5B
cHBsaWNhdGlvbn0gbmFtZXNwYWNlIHRoZSBhcHBsaWNhdGlvbiB0byBidWlsZCB0aGUKQEAgLTI1
NDE0LDI3ICszODgzMCw0MSBAQCBFbWJlci5BcHBsaWNhdGlvbi5yZW9wZW5DbGFzcyh7CiAgICov
CiAgIGJ1aWxkQ29udGFpbmVyOiBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICB2YXIgY29udGFp
bmVyID0gbmV3IEVtYmVyLkNvbnRhaW5lcigpOwotICAgIEVtYmVyLkNvbnRhaW5lci5kZWZhdWx0
Q29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyLmRlZmF1bHRDb250YWluZXIgfHwgY29udGFpbmVy
OworCisgICAgRW1iZXIuQ29udGFpbmVyLmRlZmF1bHRDb250YWluZXIgPSBuZXcgRGVwcmVjYXRl
ZENvbnRhaW5lcihjb250YWluZXIpOwogCiAgICAgY29udGFpbmVyLnNldCA9IEVtYmVyLnNldDsK
LSAgICBjb250YWluZXIucmVzb2x2ZXIgPSByZXNvbHZlckZvcihuYW1lc3BhY2UpOworICAgIGNv
bnRhaW5lci5yZXNvbHZlciAgPSByZXNvbHZlckZvcihuYW1lc3BhY2UpOworICAgIGNvbnRhaW5l
ci5ub3JtYWxpemUgPSBjb250YWluZXIucmVzb2x2ZXIubm9ybWFsaXplOworICAgIGNvbnRhaW5l
ci5kZXNjcmliZSAgPSBjb250YWluZXIucmVzb2x2ZXIuZGVzY3JpYmU7CisgICAgY29udGFpbmVy
Lm1ha2VUb1N0cmluZyA9IGNvbnRhaW5lci5yZXNvbHZlci5tYWtlVG9TdHJpbmc7CisKKyAgICBj
b250YWluZXIub3B0aW9uc0ZvclR5cGUoJ2NvbXBvbmVudCcsIHsgc2luZ2xldG9uOiBmYWxzZSB9
KTsKICAgICBjb250YWluZXIub3B0aW9uc0ZvclR5cGUoJ3ZpZXcnLCB7IHNpbmdsZXRvbjogZmFs
c2UgfSk7CiAgICAgY29udGFpbmVyLm9wdGlvbnNGb3JUeXBlKCd0ZW1wbGF0ZScsIHsgaW5zdGFu
dGlhdGU6IGZhbHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3RlcignYXBwbGljYXRpb24nLCAn
bWFpbicsIG5hbWVzcGFjZSwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisgICAgY29udGFpbmVy
Lm9wdGlvbnNGb3JUeXBlKCdoZWxwZXInLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKworICAg
IGNvbnRhaW5lci5yZWdpc3RlcignYXBwbGljYXRpb246bWFpbicsIG5hbWVzcGFjZSwgeyBpbnN0
YW50aWF0ZTogZmFsc2UgfSk7CisKKyAgICBjb250YWluZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6
YmFzaWMnLCBFbWJlci5Db250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKyAgICBj
b250YWluZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6b2JqZWN0JywgRW1iZXIuT2JqZWN0Q29udHJv
bGxlciwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdj
b250cm9sbGVyOmFycmF5JywgRW1iZXIuQXJyYXlDb250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBm
YWxzZSB9KTsKKyAgICBjb250YWluZXIucmVnaXN0ZXIoJ3JvdXRlOmJhc2ljJywgRW1iZXIuUm91
dGUsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworICAgIGNvbnRhaW5lci5yZWdpc3RlcignZXZl
bnRfZGlzcGF0Y2hlcjptYWluJywgRW1iZXIuRXZlbnREaXNwYXRjaGVyKTsKKworICAgIGNvbnRh
aW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCAgRW1iZXIuUm91dGVyKTsKICAgICBjb250YWlu
ZXIuaW5qZWN0aW9uKCdyb3V0ZXI6bWFpbicsICduYW1lc3BhY2UnLCAnYXBwbGljYXRpb246bWFp
bicpOwogCi0gICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAndGFyZ2V0
JywgJ3JvdXRlcjptYWluJyk7Ci0gICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRyb2xs
ZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1haW4nKTsKKyAgICBjb250YWluZXIuaW5q
ZWN0aW9uKCdjb250cm9sbGVyJywgJ3RhcmdldCcsICdyb3V0ZXI6bWFpbicpOworICAgIGNvbnRh
aW5lci5pbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1h
aW4nKTsKIAotICAgIGNvbnRhaW5lci50eXBlSW5qZWN0aW9uKCdyb3V0ZScsICdyb3V0ZXInLCAn
cm91dGVyOm1haW4nKTsKKyAgICBjb250YWluZXIuaW5qZWN0aW9uKCdyb3V0ZScsICdyb3V0ZXIn
LCAncm91dGVyOm1haW4nKTsKIAogICAgIHJldHVybiBjb250YWluZXI7CiAgIH0KIH0pOwogCiAv
KioKLSAgQHByaXZhdGUKLQogICBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgbG9v
a3VwIHJ1bGVzIGZvciBjb250YWluZXIgbG9va3VwczoKIAogICAqIHRlbXBsYXRlcyBhcmUgbG9v
a2VkIHVwIG9uIGBFbWJlci5URU1QTEFURVNgCkBAIC0yNTQ0NSw0MCArMzg4NzUsNDcgQEAgRW1i
ZXIuQXBwbGljYXRpb24ucmVvcGVuQ2xhc3MoewogICBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRp
b24gdG8gcmVnaXN0ZXIgZGVmYXVsdCBpbmplY3Rpb25zIGluIHRoZSBjb250YWluZXIKICAgdGhh
dCBjb3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBub3JtYWwgbmFtaW5nIGNvbnZlbnRpb24uCiAK
KyAgQHByaXZhdGUKKyAgQG1ldGhvZCByZXNvbHZlckZvcgogICBAcGFyYW0ge0VtYmVyLk5hbWVz
cGFjZX0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgdG8gbG9vayBmb3IgY2xhc3NlcwotICBAcmV0
dXJuIHthbnl9IHRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgYSBnaXZlbiBsb29rdXAKKyAgQHJldHVy
biB7Kn0gdGhlIHJlc29sdmVkIHZhbHVlIGZvciBhIGdpdmVuIGxvb2t1cAogKi8KIGZ1bmN0aW9u
IHJlc29sdmVyRm9yKG5hbWVzcGFjZSkgewotICByZXR1cm4gZnVuY3Rpb24oZnVsbE5hbWUpIHsK
LSAgICB2YXIgbmFtZVBhcnRzID0gZnVsbE5hbWUuc3BsaXQoIjoiKSwKLSAgICAgICAgdHlwZSA9
IG5hbWVQYXJ0c1swXSwgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKKyAgaWYgKG5hbWVzcGFjZS5nZXQo
J3Jlc29sdmVyJykpIHsKKyAgICBFbWJlci5kZXByZWNhdGUoJ0FwcGxpY2F0aW9uLnJlc29sdmVy
IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQXBwbGljYXRpb24uUmVzb2x2ZXInLCBmYWxzZSk7
CisgIH0KIAotICAgIGlmICh0eXBlID09PSAndGVtcGxhdGUnKSB7Ci0gICAgICB2YXIgdGVtcGxh
dGVOYW1lID0gbmFtZS5yZXBsYWNlKC9cLi9nLCAnLycpOwotICAgICAgaWYgKEVtYmVyLlRFTVBM
QVRFU1t0ZW1wbGF0ZU5hbWVdKSB7Ci0gICAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbdGVt
cGxhdGVOYW1lXTsKLSAgICAgIH0KKyAgdmFyIFJlc29sdmVyQ2xhc3MgPSBuYW1lc3BhY2UuZ2V0
KCdyZXNvbHZlcicpIHx8IG5hbWVzcGFjZS5nZXQoJ1Jlc29sdmVyJykgfHwgRW1iZXIuRGVmYXVs
dFJlc29sdmVyOworICB2YXIgcmVzb2x2ZXIgPSBSZXNvbHZlckNsYXNzLmNyZWF0ZSh7CisgICAg
bmFtZXNwYWNlOiBuYW1lc3BhY2UKKyAgfSk7CiAKLSAgICAgIHRlbXBsYXRlTmFtZSA9IGRlY2Ft
ZWxpemUodGVtcGxhdGVOYW1lKTsKLSAgICAgIGlmIChFbWJlci5URU1QTEFURVNbdGVtcGxhdGVO
YW1lXSkgewotICAgICAgICByZXR1cm4gRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFtZV07Ci0g
ICAgICB9Ci0gICAgfQorICBmdW5jdGlvbiByZXNvbHZlKGZ1bGxOYW1lKSB7CisgICAgcmV0dXJu
IHJlc29sdmVyLnJlc29sdmUoZnVsbE5hbWUpOworICB9CiAKLSAgICBpZiAodHlwZSA9PT0gJ2Nv
bnRyb2xsZXInIHx8IHR5cGUgPT09ICdyb3V0ZScgfHwgdHlwZSA9PT0gJ3ZpZXcnKSB7Ci0gICAg
ICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cLi9nLCAnXycpOwotICAgIH0KKyAgcmVzb2x2ZS5kZXNj
cmliZSA9IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CisgICAgcmV0dXJuIHJlc29sdmVyLmxvb2t1cERl
c2NyaXB0aW9uKGZ1bGxOYW1lKTsKKyAgfTsKIAotICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc2lm
eShuYW1lKSArIGNsYXNzaWZ5KHR5cGUpOwotICAgIHZhciBmYWN0b3J5ID0gZ2V0KG5hbWVzcGFj
ZSwgY2xhc3NOYW1lKTsKKyAgcmVzb2x2ZS5tYWtlVG9TdHJpbmcgPSBmdW5jdGlvbihmYWN0b3J5
LCBmdWxsTmFtZSkgeworICAgIHJldHVybiByZXNvbHZlci5tYWtlVG9TdHJpbmcoZmFjdG9yeSwg
ZnVsbE5hbWUpOworICB9OwogCi0gICAgaWYgKGZhY3RvcnkpIHsgcmV0dXJuIGZhY3Rvcnk7IH0K
KyAgcmVzb2x2ZS5ub3JtYWxpemUgPSBmdW5jdGlvbihmdWxsTmFtZSkgeworICAgIGlmIChyZXNv
bHZlci5ub3JtYWxpemUpIHsKKyAgICAgIHJldHVybiByZXNvbHZlci5ub3JtYWxpemUoZnVsbE5h
bWUpOworICAgIH0gZWxzZSB7CisgICAgICBFbWJlci5kZXByZWNhdGUoJ1RoZSBSZXNvbHZlciBz
aG91bGQgbm93IHByb3ZpZGUgYSBcJ25vcm1hbGl6ZVwnIGZ1bmN0aW9uJywgZmFsc2UpOworICAg
ICAgcmV0dXJuIGZ1bGxOYW1lOworICAgIH0KICAgfTsKKworICByZXR1cm4gcmVzb2x2ZTsKIH0K
IAogRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlvbicsIEVtYmVyLkFwcGxpY2F0
aW9uKTsKIAotCiB9KSgpOwogCiAKQEAgLTI1NDkyLDcwICszODkyOSwxNjUgQEAgRW1iZXIucnVu
TG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlvbicsIEVtYmVyLkFwcGxpY2F0aW9uKTsKIChmdW5j
dGlvbigpIHsKIC8qKgogQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCitA
c3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCiAqLwogCiB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci12YXIgQ29udHJvbGxlcnNQcm94eSA9IEVtYmVyLk9iamVjdC5leHRl
bmQoewotICBjb250cm9sbGVyOiBudWxsLAogCi0gIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24o
Y29udHJvbGxlck5hbWUpIHsKLSAgICB2YXIgY29udHJvbGxlciA9IGdldCh0aGlzLCAnY29udHJv
bGxlcicpLAotICAgICAgbmVlZHMgPSBnZXQoY29udHJvbGxlciwgJ25lZWRzJyksCi0gICAgICBj
b250YWluZXIgPSBjb250cm9sbGVyLmdldCgnY29udGFpbmVyJyksCi0gICAgICBkZXBlbmRlbmN5
OworZnVuY3Rpb24gdmVyaWZ5TmVlZHNEZXBlbmRlbmNpZXMoY29udHJvbGxlciwgY29udGFpbmVy
LCBuZWVkcykgeworICB2YXIgZGVwZW5kZW5jeSwgaSwgbCwgbWlzc2luZyA9IFtdOwogCi0gICAg
Zm9yICh2YXIgaT0wLCBsPW5lZWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGRlcGVuZGVu
Y3kgPSBuZWVkc1tpXTsKLSAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBjb250cm9sbGVyTmFtZSkg
ewotICAgICAgICByZXR1cm4gY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJv
bGxlck5hbWUpOwotICAgICAgfQotICAgIH0KLSAgfQotfSk7CisgIGZvciAoaT0wLCBsPW5lZWRz
Lmxlbmd0aDsgaTxsOyBpKyspIHsKKyAgICBkZXBlbmRlbmN5ID0gbmVlZHNbaV07CiAKLWZ1bmN0
aW9uIHZlcmlmeURlcGVuZGVuY2llcyhjb250cm9sbGVyKSB7Ci0gIHZhciBuZWVkcyA9IGdldChj
b250cm9sbGVyLCAnbmVlZHMnKSwKLSAgICAgIGNvbnRhaW5lciA9IGdldChjb250cm9sbGVyLCAn
Y29udGFpbmVyJyksCi0gICAgICBkZXBlbmRlbmN5LCBzYXRpc2ZpZWQgPSB0cnVlOworICAgIEVt
YmVyLmFzc2VydChFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiNuZWVkcyBtdXN0IG5vdCBz
cGVjaWZ5IGRlcGVuZGVuY2llcyB3aXRoIHBlcmlvZHMgaW4gdGhlaXIgbmFtZXMgKCIgKyBkZXBl
bmRlbmN5ICsgIikiLCBkZXBlbmRlbmN5LmluZGV4T2YoJy4nKSA9PT0gLTEpOwogCi0gIGZvciAo
dmFyIGk9MCwgbD1uZWVkcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgZGVwZW5kZW5jeSA9IG5l
ZWRzW2ldOwogICAgIGlmIChkZXBlbmRlbmN5LmluZGV4T2YoJzonKSA9PT0gLTEpIHsKICAgICAg
IGRlcGVuZGVuY3kgPSAiY29udHJvbGxlcjoiICsgZGVwZW5kZW5jeTsKICAgICB9CiAKKyAgICAv
LyBTdHJ1Y3R1cmUgYXNzZXJ0IHRvIHN0aWxsIGRvIHZlcmlmaWNhdGlvbiBidXQgbm90IHN0cmlu
ZyBjb25jYXQgaW4gcHJvZHVjdGlvbgogICAgIGlmICghY29udGFpbmVyLmhhcyhkZXBlbmRlbmN5
KSkgewotICAgICAgc2F0aXNmaWVkID0gZmFsc2U7Ci0gICAgICBFbWJlci5hc3NlcnQoY29udHJv
bGxlciArICIgbmVlZHMgIiArIGRlcGVuZGVuY3kgKyAiIGJ1dCBpdCBkb2VzIG5vdCBleGlzdCIs
IGZhbHNlKTsKKyAgICAgIG1pc3NpbmcucHVzaChkZXBlbmRlbmN5KTsKICAgICB9CiAgIH0KLQot
ICByZXR1cm4gc2F0aXNmaWVkOworICBpZiAobWlzc2luZy5sZW5ndGgpIHsKKyAgICB0aHJvdyBu
ZXcgRW1iZXIuRXJyb3IoRW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICIgbmVlZHMgWyAiICsg
bWlzc2luZy5qb2luKCcsICcpICsgIiBdIGJ1dCAiICsgKG1pc3NpbmcubGVuZ3RoID4gMSA/ICd0
aGV5JyA6ICdpdCcpICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsKKyAgfQogfQogCit2YXIgZGVm
YXVsdENvbnRyb2xsZXJzQ29tcHV0ZWRQcm9wZXJ0eSA9IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgeworICB2YXIgY29udHJvbGxlciA9IHRoaXM7CisKKyAgcmV0dXJuIHsKKyAgICBuZWVkczog
Z2V0KGNvbnRyb2xsZXIsICduZWVkcycpLAorICAgIGNvbnRhaW5lcjogZ2V0KGNvbnRyb2xsZXIs
ICdjb250YWluZXInKSwKKyAgICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGNvbnRyb2xsZXJO
YW1lKSB7CisgICAgICB2YXIgbmVlZHMgPSB0aGlzLm5lZWRzLAorICAgICAgICBkZXBlbmRlbmN5
LCBpLCBsOworICAgICAgZm9yIChpPTAsIGw9bmVlZHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAg
ICAgICBkZXBlbmRlbmN5ID0gbmVlZHNbaV07CisgICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBj
b250cm9sbGVyTmFtZSkgeworICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5sb29rdXAo
J2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorCisg
ICAgICB2YXIgZXJyb3JNZXNzYWdlID0gRW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICcjbmVl
ZHMgZG9lcyBub3QgaW5jbHVkZSBgJyArIGNvbnRyb2xsZXJOYW1lICsgJ2AuIFRvIGFjY2VzcyB0
aGUgJyArIGNvbnRyb2xsZXJOYW1lICsgJyBjb250cm9sbGVyIGZyb20gJyArIEVtYmVyLmluc3Bl
Y3QoY29udHJvbGxlcikgKyAnLCAnICsgRW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICcgc2hv
dWxkIGhhdmUgYSBgbmVlZHNgIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgb2YgdGhlIGNvbnRy
b2xsZXJzIGl0IGhhcyBhY2Nlc3MgdG8uJzsKKyAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJv
cihlcnJvck1lc3NhZ2UpOworICAgIH0sCisgICAgc2V0VW5rbm93blByb3BlcnR5OiBmdW5jdGlv
biAoa2V5LCB2YWx1ZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3UgY2Fubm90IG92ZXJ3
cml0ZSB0aGUgdmFsdWUgb2YgYGNvbnRyb2xsZXJzLiIgKyBrZXkgKyAiYCBvZiAiICsgRW1iZXIu
aW5zcGVjdChjb250cm9sbGVyKSk7CisgICAgfQorICB9OworfSk7CisKKy8qKgorICBAY2xhc3Mg
Q29udHJvbGxlck1peGluCisgIEBuYW1lc3BhY2UgRW1iZXIKKyovCiBFbWJlci5Db250cm9sbGVy
TWl4aW4ucmVvcGVuKHsKICAgY29uY2F0ZW5hdGVkUHJvcGVydGllczogWyduZWVkcyddLAorCisg
IC8qKgorICAgIEFuIGFycmF5IG9mIG90aGVyIGNvbnRyb2xsZXIgb2JqZWN0cyBhdmFpbGFibGUg
aW5zaWRlCisgICAgaW5zdGFuY2VzIG9mIHRoaXMgY29udHJvbGxlciB2aWEgdGhlIGBjb250cm9s
bGVyc2AKKyAgICBwcm9wZXJ0eToKKworICAgIEZvciBleGFtcGxlLCB3aGVuIHlvdSBkZWZpbmUg
YSBjb250cm9sbGVyOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Db21tZW50c0NvbnRy
b2xsZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAgIG5lZWRzOiBbJ3Bv
c3QnXQorICAgIH0pOworICAgIGBgYAorCisgICAgVGhlIGFwcGxpY2F0aW9uJ3Mgc2luZ2xlIGlu
c3RhbmNlIG9mIHRoZXNlIG90aGVyCisgICAgY29udHJvbGxlcnMgYXJlIGFjY2Vzc2libGUgYnkg
bmFtZSB0aHJvdWdoIHRoZQorICAgIGBjb250cm9sbGVyc2AgcHJvcGVydHk6CisKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLnBvc3QnKTsgLy8gaW5zdGFuY2Ug
b2YgQXBwLlBvc3RDb250cm9sbGVyCisgICAgYGBgCisKKyAgICBHaXZlbiB0aGF0IHlvdSBoYXZl
IGEgbmVzdGVkIGNvbnRyb2xsZXIgKG5lc3RlZCByZXNvdXJjZSk6CisKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgQXBwLkNvbW1lbnRzTmV3Q29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xs
ZXIuZXh0ZW5kKHsKKyAgICB9KTsKKyAgICBgYGAKKworICAgIFdoZW4geW91IGRlZmluZSBhIGNv
bnRyb2xsZXIgdGhhdCByZXF1aXJlcyBhY2Nlc3MgdG8gYSBuZXN0ZWQgb25lOgorCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEFwcC5JbmRleENvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RDb250cm9s
bGVyLmV4dGVuZCh7CisgICAgICBuZWVkczogWydjb21tZW50c05ldyddCisgICAgfSk7CisgICAg
YGBgCisKKyAgICBZb3Ugd2lsbCBiZSBhYmxlIHRvIGdldCBhY2Nlc3MgdG8gaXQ6CisKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLmNvbW1lbnRzTmV3Jyk7IC8v
IGluc3RhbmNlIG9mIEFwcC5Db21tZW50c05ld0NvbnRyb2xsZXIKKyAgICBgYGAKKworICAgIFRo
aXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHNpbmdsZXRvbiBjb250cm9sbGVycy4KKworICAgIEBw
cm9wZXJ0eSB7QXJyYXl9IG5lZWRzCisgICAgQGRlZmF1bHQgW10KKyAgKi8KICAgbmVlZHM6IFtd
LAogCiAgIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgICAgdmFyIG5lZWRzID0gZ2V0KHRoaXMsICduZWVkcycpLAorICAgIGxlbmd0
aCA9IGdldChuZWVkcywgJ2xlbmd0aCcpOwogCi0gICAgLy8gU3RydWN0dXJlIGFzc2VydHMgdG8g
c3RpbGwgZG8gdmVyaWZpY2F0aW9uIGJ1dCBub3Qgc3RyaW5nIGNvbmNhdCBpbiBwcm9kdWN0aW9u
Ci0gICAgaWYoIXZlcmlmeURlcGVuZGVuY2llcyh0aGlzKSkgewotICAgICAgRW1iZXIuYXNzZXJ0
KCJNaXNzaW5nIGRlcGVuZGVuY2llcyIsIGZhbHNlKTsKKyAgICBpZiAobGVuZ3RoID4gMCkgewor
ICAgICAgRW1iZXIuYXNzZXJ0KCcgYCcgKyBFbWJlci5pbnNwZWN0KHRoaXMpICsgJyBzcGVjaWZp
ZXMgYG5lZWRzYCwgYnV0IGRvZXMgJyArCisgICAgICAgICAgICAgICAgICAgIm5vdCBoYXZlIGEg
Y29udGFpbmVyLiBQbGVhc2UgZW5zdXJlIHRoaXMgY29udHJvbGxlciB3YXMgIiArCisgICAgICAg
ICAgICAgICAgICAgImluc3RhbnRpYXRlZCB3aXRoIGEgY29udGFpbmVyLiIsCisgICAgICAgICAg
ICAgICAgICAgdGhpcy5jb250YWluZXIgfHwgRW1iZXIubWV0YSh0aGlzLCBmYWxzZSkuZGVzY3Mu
Y29udHJvbGxlcnMgIT09IGRlZmF1bHRDb250cm9sbGVyc0NvbXB1dGVkUHJvcGVydHkpOworCisg
ICAgICBpZiAodGhpcy5jb250YWluZXIpIHsKKyAgICAgICAgdmVyaWZ5TmVlZHNEZXBlbmRlbmNp
ZXModGhpcywgdGhpcy5jb250YWluZXIsIG5lZWRzKTsKKyAgICAgIH0KKworICAgICAgLy8gaWYg
bmVlZHMgdGhlbiBpbml0aWFsaXplIGNvbnRyb2xsZXJzIHByb3h5CisgICAgICBnZXQodGhpcywg
J2NvbnRyb2xsZXJzJyk7CiAgICAgfQorCisgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKICAgfSwKIAorICAvKioKKyAgICBAbWV0aG9kIGNvbnRyb2xsZXJGb3IKKyAgICBA
c2VlIHtFbWJlci5Sb3V0ZSNjb250cm9sbGVyRm9yfQorICAgIEBkZXByZWNhdGVkIFVzZSBgbmVl
ZHNgIGluc3RlYWQKKyAgKi8KICAgY29udHJvbGxlckZvcjogZnVuY3Rpb24oY29udHJvbGxlck5h
bWUpIHsKLSAgICBFbWJlci5kZXByZWNhdGUoIkNvbnRyb2xsZXIjY29udHJvbGxlckZvciBpcyBk
ZXBjcmVjYXRlZCwgcGxlYXNlIHVzZSBDb250cm9sbGVyI25lZWRzIGluc3RlYWQiKTsKLSAgICB2
YXIgY29udGFpbmVyID0gZ2V0KHRoaXMsICdjb250YWluZXInKTsKLSAgICByZXR1cm4gY29udGFp
bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWUpOworICAgIEVtYmVyLmRl
cHJlY2F0ZSgiQ29udHJvbGxlciNjb250cm9sbGVyRm9yIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1
c2UgQ29udHJvbGxlciNuZWVkcyBpbnN0ZWFkIik7CisgICAgcmV0dXJuIEVtYmVyLmNvbnRyb2xs
ZXJGb3IoZ2V0KHRoaXMsICdjb250YWluZXInKSwgY29udHJvbGxlck5hbWUpOwogICB9LAogCi0g
IGNvbnRyb2xsZXJzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gQ29u
dHJvbGxlcnNQcm94eS5jcmVhdGUoeyBjb250cm9sbGVyOiB0aGlzIH0pOwotICB9KQorICAvKioK
KyAgICBTdG9yZXMgdGhlIGluc3RhbmNlcyBvZiBvdGhlciBjb250cm9sbGVycyBhdmFpbGFibGUg
ZnJvbSB3aXRoaW4KKyAgICB0aGlzIGNvbnRyb2xsZXIuIEFueSBjb250cm9sbGVyIGxpc3RlZCBi
eSBuYW1lIGluIHRoZSBgbmVlZHNgCisgICAgcHJvcGVydHkgd2lsbCBiZSBhY2Nlc3NpYmxlIGJ5
IG5hbWUgdGhyb3VnaCB0aGlzIHByb3BlcnR5LgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFw
cC5Db21tZW50c0NvbnRyb2xsZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAg
ICAgIG5lZWRzOiBbJ3Bvc3QnXSwKKyAgICAgIHBvc3RUaXRsZTogZnVuY3Rpb24oKXsKKyAgICAg
ICAgdmFyIGN1cnJlbnRQb3N0ID0gdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLnBvc3QnKTsgLy8gaW5z
dGFuY2Ugb2YgQXBwLlBvc3RDb250cm9sbGVyCisgICAgICAgIHJldHVybiBjdXJyZW50UG9zdC5n
ZXQoJ3RpdGxlJyk7CisgICAgICB9LnByb3BlcnR5KCdjb250cm9sbGVycy5wb3N0LnRpdGxlJykK
KyAgICB9KTsKKyAgICBgYGAKKworICAgIEBzZWUge0VtYmVyLkNvbnRyb2xsZXJNaXhpbiNuZWVk
c30KKyAgICBAcHJvcGVydHkge09iamVjdH0gY29udHJvbGxlcnMKKyAgICBAZGVmYXVsdCBudWxs
CisgICovCisgIGNvbnRyb2xsZXJzOiBkZWZhdWx0Q29udHJvbGxlcnNDb21wdXRlZFByb3BlcnR5
CiB9KTsKIAogfSkoKTsKQEAgLTI1NTc0LDEyMzggKzM5MTA2LDE0MjEgQEAgRW1iZXIgQXBwbGlj
YXRpb24KIAogQG1vZHVsZSBlbWJlcgogQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotQHJl
cXVpcmVzIGVtYmVyLXZpZXdzLCBlbWJlci1zdGF0ZXMsIGVtYmVyLXJvdXRpbmcKK0ByZXF1aXJl
cyBlbWJlci12aWV3cywgZW1iZXItcm91dGluZwogKi8KIAogfSkoKTsKIAogKGZ1bmN0aW9uKCkg
ewotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCiAvKioKIEBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItc3RhdGVzCitAc3VibW9kdWxlIGVtYmVyLWV4dGVuc2lv
bi1zdXBwb3J0CiAqLwotCiAvKioKLSAgQGNsYXNzIFN0YXRlCisgIFRoZSBgRGF0YUFkYXB0ZXJg
IGhlbHBzIGEgZGF0YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5CisgIGludGVyZmFjZSB3aXRoIHRvb2xz
IHRoYXQgZGVidWcgRW1iZXIgc3VjaAorICBhcyB0aGUgW0VtYmVyIEV4dGVuc2lvbl0oaHR0cHM6
Ly9naXRodWIuY29tL3RpbGRlaW8vZW1iZXItZXh0ZW5zaW9uKQorICBmb3IgQ2hyb21lIGFuZCBG
aXJlZm94LgorCisgIFRoaXMgY2xhc3Mgd2lsbCBiZSBleHRlbmRlZCBieSBhIHBlcnNpc3RlbmNl
IGxpYnJhcnkKKyAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzIHdpdGgK
KyAgbGlicmFyeS1zcGVjaWZpYyBjb2RlLgorCisgIFRoZSBtZXRob2RzIGxpa2VseSB0byBiZSBv
dmVycmlkZGVuIGFyZToKKworICAqIGBnZXRGaWx0ZXJzYAorICAqIGBkZXRlY3RgCisgICogYGNv
bHVtbnNGb3JUeXBlYAorICAqIGBnZXRSZWNvcmRzYAorICAqIGBnZXRSZWNvcmRDb2x1bW5WYWx1
ZXNgCisgICogYGdldFJlY29yZEtleXdvcmRzYAorICAqIGBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXNg
CisgICogYGdldFJlY29yZENvbG9yYAorICAqIGBvYnNlcnZlUmVjb3JkYAorCisgIFRoZSBhZGFw
dGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3RlcmVkCisgIGluIHRoZSBhcHBsaWNhdGlvbidzIGNv
bnRhaW5lciBhcyBgZGF0YUFkYXB0ZXI6bWFpbmAKKworICBFeGFtcGxlOgorCisgIGBgYGphdmFz
Y3JpcHQKKyAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgIG5hbWU6ICJkYXRhQWRhcHRl
ciIsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9uKSB7
CisgICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YUFkYXB0ZXI6bWFpbicsIERTLkRhdGFB
ZGFwdGVyKTsKKyAgICB9CisgIH0pOworICBgYGAKKworICBAY2xhc3MgRGF0YUFkYXB0ZXIKICAg
QG5hbWVzcGFjZSBFbWJlcgogICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSAgQHVzZXMgRW1iZXIu
RXZlbnRlZAogKi8KLUVtYmVyLlN0YXRlID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVu
dGVkLAotLyoqIEBzY29wZSBFbWJlci5TdGF0ZS5wcm90b3R5cGUgKi97Ci0gIGlzU3RhdGU6IHRy
dWUsCitFbWJlci5EYXRhQWRhcHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICBpbml0OiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLl9zdXBlcigpOworICAgIHRoaXMucmVsZWFzZU1ldGhvZHMg
PSBFbWJlci5BKCk7CisgIH0sCiAKICAgLyoqCi0gICAgQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVu
dCBzdGF0ZS4KKyAgICBUaGUgY29udGFpbmVyIG9mIHRoZSBhcHBsaWNhdGlvbiBiZWluZyBkZWJ1
Z2dlZC4KKyAgICBUaGlzIHByb3BlcnR5IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICBvbiBjcmVhdGlv
bi4KIAotICAgIEBwcm9wZXJ0eSBwYXJlbnRTdGF0ZQotICAgIEB0eXBlIEVtYmVyLlN0YXRlCisg
ICAgQHByb3BlcnR5IGNvbnRhaW5lcgorICAgIEBkZWZhdWx0IG51bGwKICAgKi8KLSAgcGFyZW50
U3RhdGU6IG51bGwsCi0gIHN0YXJ0OiBudWxsLAorICBjb250YWluZXI6IG51bGwsCiAKICAgLyoq
Ci0gICAgVGhlIG5hbWUgb2YgdGhpcyBzdGF0ZS4KKyAgICBOdW1iZXIgb2YgYXR0cmlidXRlcyB0
byBzZW5kCisgICAgYXMgY29sdW1ucy4gKEVub3VnaCB0byBtYWtlIHRoZSByZWNvcmQKKyAgICBp
ZGVudGlmaWFibGUpLgogCi0gICAgQHByb3BlcnR5IG5hbWUKLSAgICBAdHlwZSBTdHJpbmcKKyAg
ICBAcHJpdmF0ZQorICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVMaW1pdAorICAgIEBkZWZhdWx0IDMK
ICAgKi8KLSAgbmFtZTogbnVsbCwKKyAgYXR0cmlidXRlTGltaXQ6IDMsCiAKICAgLyoqCi0gICAg
VGhlIGZ1bGwgcGF0aCB0byB0aGlzIHN0YXRlLgorICAgIFN0b3JlcyBhbGwgbWV0aG9kcyB0aGF0
IGNsZWFyIG9ic2VydmVycy4KKyAgICBUaGVzZSBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIG9uIGRl
c3RydWN0aW9uLgogCi0gICAgQHByb3BlcnR5IHBhdGgKLSAgICBAdHlwZSBTdHJpbmcKKyAgICBA
cHJpdmF0ZQorICAgIEBwcm9wZXJ0eSByZWxlYXNlTWV0aG9kcwogICAqLwotICBwYXRoOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50UGF0aCA9IGdldCh0aGlzLCAn
cGFyZW50U3RhdGUucGF0aCcpLAotICAgICAgICBwYXRoID0gZ2V0KHRoaXMsICduYW1lJyk7Cisg
IHJlbGVhc2VNZXRob2RzOiBFbWJlci5BKCksCiAKLSAgICBpZiAocGFyZW50UGF0aCkgewotICAg
ICAgcGF0aCA9IHBhcmVudFBhdGggKyAnLicgKyBwYXRoOwotICAgIH0KKyAgLyoqCisgICAgU3Bl
Y2lmaWVzIGhvdyByZWNvcmRzIGNhbiBiZSBmaWx0ZXJlZC4KKyAgICBSZWNvcmRzIHJldHVybmVk
IHdpbGwgbmVlZCB0byBoYXZlIGEgYGZpbHRlclZhbHVlc2AKKyAgICBwcm9wZXJ0eSB3aXRoIGEg
a2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBhcnJheS4KIAotICAgIHJldHVybiBw
YXRoOwotICB9KSwKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCBnZXRGaWx0ZXJzCisgICAgQHJl
dHVybiB7QXJyYXl9IExpc3Qgb2Ygb2JqZWN0cyBkZWZpbmluZyBmaWx0ZXJzLgorICAgICBUaGUg
b2JqZWN0IHNob3VsZCBoYXZlIGEgYG5hbWVgIGFuZCBgZGVzY2AgcHJvcGVydHkuCisgICovCisg
IGdldEZpbHRlcnM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBFbWJlci5BKCk7CisgIH0sCisK
KyAgLyoqCisgICAgRmV0Y2ggdGhlIG1vZGVsIHR5cGVzIGFuZCBvYnNlcnZlIHRoZW0gZm9yIGNo
YW5nZXMuCisKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCB3YXRjaE1vZGVsVHlwZXMKKworICAg
IEBwYXJhbSB7RnVuY3Rpb259IHR5cGVzQWRkZWQgQ2FsbGJhY2sgdG8gY2FsbCB0byBhZGQgdHlw
ZXMuCisgICAgVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBwZWQgdHlw
ZXMgKHJldHVybmVkIGZyb20gYHdyYXBNb2RlbFR5cGVgKS4KKworICAgIEBwYXJhbSB7RnVuY3Rp
b259IHR5cGVzVXBkYXRlZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gYSB0eXBlIGhhcyBjaGFuZ2Vk
LgorICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHR5cGVz
LgorCisgICAgQHJldHVybiB7RnVuY3Rpb259IE1ldGhvZCB0byBjYWxsIHRvIHJlbW92ZSBhbGwg
b2JzZXJ2ZXJzCisgICovCisgIHdhdGNoTW9kZWxUeXBlczogZnVuY3Rpb24odHlwZXNBZGRlZCwg
dHlwZXNVcGRhdGVkKSB7CisgICAgdmFyIG1vZGVsVHlwZXMgPSB0aGlzLmdldE1vZGVsVHlwZXMo
KSwKKyAgICAgICAgc2VsZiA9IHRoaXMsIHR5cGVzVG9TZW5kLCByZWxlYXNlTWV0aG9kcyA9IEVt
YmVyLkEoKTsKKworICAgIHR5cGVzVG9TZW5kID0gbW9kZWxUeXBlcy5tYXAoZnVuY3Rpb24odHlw
ZSkgeworICAgICAgdmFyIHdyYXBwZWQgPSBzZWxmLndyYXBNb2RlbFR5cGUodHlwZSk7CisgICAg
ICByZWxlYXNlTWV0aG9kcy5wdXNoKHNlbGYub2JzZXJ2ZU1vZGVsVHlwZSh0eXBlLCB0eXBlc1Vw
ZGF0ZWQpKTsKKyAgICAgIHJldHVybiB3cmFwcGVkOworICAgIH0pOworCisgICAgdHlwZXNBZGRl
ZCh0eXBlc1RvU2VuZCk7CisKKyAgICB2YXIgcmVsZWFzZSA9IGZ1bmN0aW9uKCkgeworICAgICAg
cmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihmbikgeyBmbigpOyB9KTsKKyAgICAgIHNl
bGYucmVsZWFzZU1ldGhvZHMucmVtb3ZlT2JqZWN0KHJlbGVhc2UpOworICAgIH07CisgICAgdGhp
cy5yZWxlYXNlTWV0aG9kcy5wdXNoT2JqZWN0KHJlbGVhc2UpOworICAgIHJldHVybiByZWxlYXNl
OworICB9LAorCisgIC8qKgorICAgIEZldGNoIHRoZSByZWNvcmRzIG9mIGEgZ2l2ZW4gdHlwZSBh
bmQgb2JzZXJ2ZSB0aGVtIGZvciBjaGFuZ2VzLgorCisgICAgQHB1YmxpYworICAgIEBtZXRob2Qg
d2F0Y2hSZWNvcmRzCisKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSByZWNvcmRzQWRkZWQgQ2FsbGJh
Y2sgdG8gY2FsbCB0byBhZGQgcmVjb3Jkcy4KKyAgICBUYWtlcyBhbiBhcnJheSBvZiBvYmplY3Rz
IGNvbnRhaW5pbmcgd3JhcHBlZCByZWNvcmRzLgorICAgIFRoZSBvYmplY3Qgc2hvdWxkIGhhdmUg
dGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAgY29sdW1uVmFsdWVzOiB7T2JqZWN0fSBr
ZXkgYW5kIHZhbHVlIG9mIGEgdGFibGUgY2VsbAorICAgICAgb2JqZWN0OiB7T2JqZWN0fSB0aGUg
YWN0dWFsIHJlY29yZCBvYmplY3QKKworICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZHNVcGRh
dGVkIENhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIHJlY29yZCBoYXMgY2hhbmdlZC4KKyAgICBUYWtl
cyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgd3JhcHBlZCByZWNvcmRzLgorCisgICAg
QHBhcmFtIHtGdW5jdGlvbn0gcmVjb3Jkc1JlbW92ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEg
cmVjb3JkIGhhcyByZW1vdmVkLgorICAgIFRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoK
KyAgICAgIGluZGV4OiB0aGUgYXJyYXkgaW5kZXggd2hlcmUgdGhlIHJlY29yZHMgd2VyZSByZW1v
dmVkCisgICAgICBjb3VudDogdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbW92ZWQKKworICAgIEBy
ZXR1cm4ge0Z1bmN0aW9ufSBNZXRob2QgdG8gY2FsbCB0byByZW1vdmUgYWxsIG9ic2VydmVycwor
ICAqLworICB3YXRjaFJlY29yZHM6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZHNBZGRlZCwgcmVjb3Jk
c1VwZGF0ZWQsIHJlY29yZHNSZW1vdmVkKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzLCByZWxlYXNl
TWV0aG9kcyA9IEVtYmVyLkEoKSwgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKSwgcmVs
ZWFzZTsKKworICAgIHZhciByZWNvcmRVcGRhdGVkID0gZnVuY3Rpb24odXBkYXRlZFJlY29yZCkg
eworICAgICAgcmVjb3Jkc1VwZGF0ZWQoW3VwZGF0ZWRSZWNvcmRdKTsKKyAgICB9OworCisgICAg
dmFyIHJlY29yZHNUb1NlbmQgPSByZWNvcmRzLm1hcChmdW5jdGlvbihyZWNvcmQpIHsKKyAgICAg
IHJlbGVhc2VNZXRob2RzLnB1c2goc2VsZi5vYnNlcnZlUmVjb3JkKHJlY29yZCwgcmVjb3JkVXBk
YXRlZCkpOworICAgICAgcmV0dXJuIHNlbGYud3JhcFJlY29yZChyZWNvcmQpOworICAgIH0pOwor
CisKKyAgICB2YXIgY29udGVudERpZENoYW5nZSA9IGZ1bmN0aW9uKGFycmF5LCBpZHgsIHJlbW92
ZWRDb3VudCwgYWRkZWRDb3VudCkgeworICAgICAgZm9yICh2YXIgaSA9IGlkeDsgaSA8IGlkeCAr
IGFkZGVkQ291bnQ7IGkrKykgeworICAgICAgICB2YXIgcmVjb3JkID0gYXJyYXkub2JqZWN0QXQo
aSk7CisgICAgICAgIHZhciB3cmFwcGVkID0gc2VsZi53cmFwUmVjb3JkKHJlY29yZCk7CisgICAg
ICAgIHJlbGVhc2VNZXRob2RzLnB1c2goc2VsZi5vYnNlcnZlUmVjb3JkKHJlY29yZCwgcmVjb3Jk
VXBkYXRlZCkpOworICAgICAgICByZWNvcmRzQWRkZWQoW3dyYXBwZWRdKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKHJlbW92ZWRDb3VudCkgeworICAgICAgICByZWNvcmRzUmVtb3ZlZChpZHgsIHJl
bW92ZWRDb3VudCk7CisgICAgICB9CisgICAgfTsKKworICAgIHZhciBvYnNlcnZlciA9IHsgZGlk
Q2hhbmdlOiBjb250ZW50RGlkQ2hhbmdlLCB3aWxsQ2hhbmdlOiBFbWJlci5LIH07CisgICAgcmVj
b3Jkcy5hZGRBcnJheU9ic2VydmVyKHNlbGYsIG9ic2VydmVyKTsKKworICAgIHJlbGVhc2UgPSBm
dW5jdGlvbigpIHsKKyAgICAgIHJlbGVhc2VNZXRob2RzLmZvckVhY2goZnVuY3Rpb24oZm4pIHsg
Zm4oKTsgfSk7CisgICAgICByZWNvcmRzLnJlbW92ZUFycmF5T2JzZXJ2ZXIoc2VsZiwgb2JzZXJ2
ZXIpOworICAgICAgc2VsZi5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFzZSk7Cisg
ICAgfTsKKworICAgIHJlY29yZHNBZGRlZChyZWNvcmRzVG9TZW5kKTsKKworICAgIHRoaXMucmVs
ZWFzZU1ldGhvZHMucHVzaE9iamVjdChyZWxlYXNlKTsKKyAgICByZXR1cm4gcmVsZWFzZTsKKyAg
fSwKIAogICAvKioKKyAgICBDbGVhciBhbGwgb2JzZXJ2ZXJzIGJlZm9yZSBkZXN0cnVjdGlvbgog
ICAgIEBwcml2YXRlCisgICovCisgIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICB0aGlz
Ll9zdXBlcigpOworICAgIHRoaXMucmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihmbikg
eworICAgICAgZm4oKTsKKyAgICB9KTsKKyAgfSwKIAotICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0
IGV2ZW50IGZpcmluZyBmcm9tIGBFbWJlci5FdmVudGVkYCB0bwotICAgIGFsc28gY2FsbCBtZXRo
b2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8qKgorICAgIERldGVjdCB3aGV0aGVyIGEgY2xh
c3MgaXMgYSBtb2RlbC4KIAotICAgIEBtZXRob2QgdHJpZ2dlcgotICAgIEBwYXJhbSBuYW1lCisg
ICAgVGVzdCB0aGF0IGFnYWluc3QgdGhlIG1vZGVsIGNsYXNzCisgICAgb2YgeW91ciBwZXJzaXN0
ZW5jZSBsaWJyYXJ5CisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZGV0ZWN0CisgICAgQHBh
cmFtIHtDbGFzc30ga2xhc3MgVGhlIGNsYXNzIHRvIHRlc3QKKyAgICBAcmV0dXJuIGJvb2xlYW4g
V2hldGhlciB0aGUgY2xhc3MgaXMgYSBtb2RlbCBjbGFzcyBvciBub3QKICAgKi8KLSAgdHJpZ2dl
cjogZnVuY3Rpb24obmFtZSkgewotICAgIGlmICh0aGlzW25hbWVdKSB7Ci0gICAgICB0aGlzW25h
bWVdLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgfQotICAg
IHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIGRldGVjdDogZnVuY3Rpb24o
a2xhc3MpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgLyoqCisgICAgR2V0IHRoZSBj
b2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5cGUuCisKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRo
b2QgY29sdW1uc0ZvclR5cGUKKyAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBl
CisgICAgQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGNvbHVtbnMgb2YgdGhlIGZvbGxvd2lu
ZyBmb3JtYXQ6CisgICAgIG5hbWU6IHtTdHJpbmd9IG5hbWUgb2YgdGhlIGNvbHVtbgorICAgICBk
ZXNjOiB7U3RyaW5nfSBIdW1hbml6ZWQgZGVzY3JpcHRpb24gKHdoYXQgd291bGQgc2hvdyBpbiBh
IHRhYmxlIGNvbHVtbiBuYW1lKQorICAqLworICBjb2x1bW5zRm9yVHlwZTogZnVuY3Rpb24odHlw
ZSkgeworICAgIHJldHVybiBFbWJlci5BKCk7CiAgIH0sCiAKLSAgaW5pdDogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIHN0YXRlcyA9IGdldCh0aGlzLCAnc3RhdGVzJyksIGZvdW5kU3RhdGVzOwotICAg
IHNldCh0aGlzLCAnY2hpbGRTdGF0ZXMnLCBFbWJlci5BKCkpOwotICAgIHNldCh0aGlzLCAnZXZl
bnRUcmFuc2l0aW9ucycsIGdldCh0aGlzLCAnZXZlbnRUcmFuc2l0aW9ucycpIHx8IHt9KTsKKyAg
LyoqCisgICAgQWRkcyBvYnNlcnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNzLgogCi0gICAgdmFy
IG5hbWUsIHZhbHVlLCB0cmFuc2l0aW9uVGFyZ2V0OworICAgIEBwcml2YXRlCisgICAgQG1ldGhv
ZCBvYnNlcnZlTW9kZWxUeXBlCisgICAgQHBhcmFtIHtDbGFzc30gdHlwZSBUaGUgbW9kZWwgdHlw
ZSBjbGFzcworICAgIEBwYXJhbSB7RnVuY3Rpb259IHR5cGVzVXBkYXRlZCBDYWxsZWQgd2hlbiBh
IHR5cGUgaXMgbW9kaWZpZWQuCisgICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0
byBjYWxsIHRvIHJlbW92ZSBvYnNlcnZlcnMKKyAgKi8KIAotICAgIC8vIEFzIGEgY29udmVuaWVu
Y2UsIGxvb3Agb3ZlciB0aGUgcHJvcGVydGllcwotICAgIC8vIG9mIHRoaXMgc3RhdGUgYW5kIGxv
b2sgZm9yIGFueSB0aGF0IGFyZSBvdGhlcgotICAgIC8vIEVtYmVyLlN0YXRlIGluc3RhbmNlcyBv
ciBjbGFzc2VzLCBhbmQgbW92ZSB0aGVtCi0gICAgLy8gdG8gdGhlIGBzdGF0ZXNgIGhhc2guIFRo
aXMgYXZvaWRzIGhhdmluZyB0bwotICAgIC8vIGNyZWF0ZSBhbiBleHBsaWNpdCBzZXBhcmF0ZSBo
YXNoLgorICBvYnNlcnZlTW9kZWxUeXBlOiBmdW5jdGlvbih0eXBlLCB0eXBlc1VwZGF0ZWQpIHsK
KyAgICB2YXIgc2VsZiA9IHRoaXMsIHJlY29yZHMgPSB0aGlzLmdldFJlY29yZHModHlwZSk7CiAK
LSAgICBpZiAoIXN0YXRlcykgewotICAgICAgc3RhdGVzID0ge307CisgICAgdmFyIG9uQ2hhbmdl
ID0gZnVuY3Rpb24oKSB7CisgICAgICB0eXBlc1VwZGF0ZWQoW3NlbGYud3JhcE1vZGVsVHlwZSh0
eXBlKV0pOworICAgIH07CisgICAgdmFyIG9ic2VydmVyID0geworICAgICAgZGlkQ2hhbmdlOiBm
dW5jdGlvbigpIHsKKyAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgnYWN0aW9ucycsIHRo
aXMsIG9uQ2hhbmdlKTsKKyAgICAgIH0sCisgICAgICB3aWxsQ2hhbmdlOiBFbWJlci5LCisgICAg
fTsKIAotICAgICAgZm9yIChuYW1lIGluIHRoaXMpIHsKLSAgICAgICAgaWYgKG5hbWUgPT09ICJj
b25zdHJ1Y3RvciIpIHsgY29udGludWU7IH0KKyAgICByZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIo
dGhpcywgb2JzZXJ2ZXIpOwogCi0gICAgICAgIGlmICh2YWx1ZSA9IHRoaXNbbmFtZV0pIHsKLSAg
ICAgICAgICBpZiAodHJhbnNpdGlvblRhcmdldCA9IHZhbHVlLnRyYW5zaXRpb25UYXJnZXQpIHsK
LSAgICAgICAgICAgIHRoaXMuZXZlbnRUcmFuc2l0aW9uc1tuYW1lXSA9IHRyYW5zaXRpb25UYXJn
ZXQ7Ci0gICAgICAgICAgfQorICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24oKSB7CisgICAgICBy
ZWNvcmRzLnJlbW92ZUFycmF5T2JzZXJ2ZXIoc2VsZiwgb2JzZXJ2ZXIpOworICAgIH07CiAKLSAg
ICAgICAgICB0aGlzLnNldHVwQ2hpbGQoc3RhdGVzLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0K
LSAgICAgIH0KKyAgICByZXR1cm4gcmVsZWFzZTsKKyAgfSwKIAotICAgICAgc2V0KHRoaXMsICdz
dGF0ZXMnLCBzdGF0ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKG5hbWUgaW4gc3RhdGVz
KSB7Ci0gICAgICAgIHRoaXMuc2V0dXBDaGlsZChzdGF0ZXMsIG5hbWUsIHN0YXRlc1tuYW1lXSk7
Ci0gICAgICB9Ci0gICAgfQogCi0gICAgc2V0KHRoaXMsICdwYXRoc0NhY2hlJywge30pOwotICAg
IHNldCh0aGlzLCAncGF0aHNDYWNoZU5vQ29udGV4dCcsIHt9KTsKLSAgfSwKKyAgLyoqCisgICAg
V3JhcHMgYSBnaXZlbiBtb2RlbCB0eXBlIGFuZCBvYnNlcnZlcyBjaGFuZ2VzIHRvIGl0LgogCi0g
IHNldHVwQ2hpbGQ6IGZ1bmN0aW9uKHN0YXRlcywgbmFtZSwgdmFsdWUpIHsKLSAgICBpZiAoIXZh
bHVlKSB7IHJldHVybiBmYWxzZTsgfQorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCB3cmFwTW9k
ZWxUeXBlCisgICAgQHBhcmFtIHtDbGFzc30gdHlwZSBBIG1vZGVsIGNsYXNzCisgICAgQHBhcmFt
IHtGdW5jdGlvbn0gdHlwZXNVcGRhdGVkIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdHlwZSBj
aGFuZ2VzCisgICAgQHJldHVybiB7T2JqZWN0fSBjb250YWlucyB0aGUgd3JhcHBlZCB0eXBlIGFu
ZCB0aGUgZnVuY3Rpb24gdG8gcmVtb3ZlIG9ic2VydmVycworICAgIEZvcm1hdDoKKyAgICAgIHR5
cGU6IHtPYmplY3R9IHRoZSB3cmFwcGVkIHR5cGUKKyAgICAgICAgVGhlIHdyYXBwZWQgdHlwZSBo
YXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgICAgICAgbmFtZToge1N0cmluZ30gbmFtZSBv
ZiB0aGUgdHlwZQorICAgICAgICAgIGNvdW50OiB7SW50ZWdlcn0gbnVtYmVyIG9mIHJlY29yZHMg
YXZhaWxhYmxlCisgICAgICAgICAgY29sdW1uczoge0NvbHVtbnN9IGFycmF5IG9mIGNvbHVtbnMg
dG8gZGVzY3JpYmUgdGhlIHJlY29yZAorICAgICAgICAgIG9iamVjdDoge0NsYXNzfSB0aGUgYWN0
dWFsIE1vZGVsIHR5cGUgY2xhc3MKKyAgICAgIHJlbGVhc2U6IHtGdW5jdGlvbn0gVGhlIGZ1bmN0
aW9uIHRvIHJlbW92ZSBvYnNlcnZlcnMKKyAgKi8KKyAgd3JhcE1vZGVsVHlwZTogZnVuY3Rpb24o
dHlwZSwgdHlwZXNVcGRhdGVkKSB7CisgICAgdmFyIHJlbGVhc2UsIHJlY29yZHMgPSB0aGlzLmdl
dFJlY29yZHModHlwZSksCisgICAgICAgIHR5cGVUb1NlbmQsIHNlbGYgPSB0aGlzOworCisgICAg
dHlwZVRvU2VuZCA9IHsKKyAgICAgIG5hbWU6IHR5cGUudG9TdHJpbmcoKSwKKyAgICAgIGNvdW50
OiBFbWJlci5nZXQocmVjb3JkcywgJ2xlbmd0aCcpLAorICAgICAgY29sdW1uczogdGhpcy5jb2x1
bW5zRm9yVHlwZSh0eXBlKSwKKyAgICAgIG9iamVjdDogdHlwZQorICAgIH07CiAKLSAgICBpZiAo
dmFsdWUuaXNTdGF0ZSkgewotICAgICAgc2V0KHZhbHVlLCAnbmFtZScsIG5hbWUpOwotICAgIH0g
ZWxzZSBpZiAoRW1iZXIuU3RhdGUuZGV0ZWN0KHZhbHVlKSkgewotICAgICAgdmFsdWUgPSB2YWx1
ZS5jcmVhdGUoewotICAgICAgICBuYW1lOiBuYW1lCi0gICAgICB9KTsKLSAgICB9CiAKLSAgICBp
ZiAodmFsdWUuaXNTdGF0ZSkgewotICAgICAgc2V0KHZhbHVlLCAncGFyZW50U3RhdGUnLCB0aGlz
KTsKLSAgICAgIGdldCh0aGlzLCAnY2hpbGRTdGF0ZXMnKS5wdXNoT2JqZWN0KHZhbHVlKTsKLSAg
ICAgIHN0YXRlc1tuYW1lXSA9IHZhbHVlOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KKyAg
ICByZXR1cm4gdHlwZVRvU2VuZDsKICAgfSwKIAotICBsb29rdXBFdmVudFRyYW5zaXRpb246IGZ1
bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgcGF0aCwgc3RhdGUgPSB0aGlzOwogCi0gICAgd2hpbGUo
c3RhdGUgJiYgIXBhdGgpIHsKLSAgICAgIHBhdGggPSBzdGF0ZS5ldmVudFRyYW5zaXRpb25zW25h
bWVdOwotICAgICAgc3RhdGUgPSBzdGF0ZS5nZXQoJ3BhcmVudFN0YXRlJyk7Ci0gICAgfQorICAv
KioKKyAgICBGZXRjaGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24uCisK
KyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcworICAgIEByZXR1cm4ge0Fy
cmF5fSBBcnJheSBvZiBtb2RlbCB0eXBlcworICAqLworCisgLy8gVE9ETzogVXNlIHRoZSByZXNv
bHZlciBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlciBuYW1lc3BhY2VzLgorICBnZXRNb2RlbFR5cGVz
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbmFtZXNwYWNlcyA9IEVtYmVyLkEoRW1iZXIuTmFtZXNw
YWNlLk5BTUVTUEFDRVMpLCB0eXBlcyA9IEVtYmVyLkEoKSwgc2VsZiA9IHRoaXM7CiAKLSAgICBy
ZXR1cm4gcGF0aDsKKyAgICBuYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rpb24obmFtZXNwYWNlKSB7
CisgICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNwYWNlKSB7CisgICAgICAgIGlmICghbmFtZXNw
YWNlLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KKyAgICAgICAgdmFyIGtsYXNz
ID0gbmFtZXNwYWNlW2tleV07CisgICAgICAgIGlmIChzZWxmLmRldGVjdChrbGFzcykpIHsKKyAg
ICAgICAgICB0eXBlcy5wdXNoKGtsYXNzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOwor
ICAgIHJldHVybiB0eXBlczsKICAgfSwKIAogICAvKioKLSAgICBBIEJvb2xlYW4gdmFsdWUgaW5k
aWNhdGluZyB3aGV0aGVyIHRoZSBzdGF0ZSBpcyBhIGxlYWYgc3RhdGUKLSAgICBpbiB0aGUgc3Rh
dGUgaGllcmFyY2h5LiBUaGlzIGlzIGBmYWxzZWAgaWYgdGhlIHN0YXRlIGhhcyBjaGlsZAotICAg
IHN0YXRlczsgb3RoZXJ3aXNlIGl0IGlzIHRydWUuCisgICAgRmV0Y2hlcyBhbGwgbG9hZGVkIHJl
Y29yZHMgZm9yIGEgZ2l2ZW4gdHlwZS4KIAotICAgIEBwcm9wZXJ0eSBpc0xlYWYKLSAgICBAdHlw
ZSBCb29sZWFuCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGdldFJlY29yZHMKKyAgICBAcmV0
dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgcmVjb3Jkcy4KKyAgICAgVGhpcyBhcnJheSB3aWxsIGJl
IG9ic2VydmVkIGZvciBjaGFuZ2VzLAorICAgICBzbyBpdCBzaG91bGQgdXBkYXRlIHdoZW4gbmV3
IHJlY29yZHMgYXJlIGFkZGVkL3JlbW92ZWQuCiAgICovCi0gIGlzTGVhZjogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICFnZXQodGhpcywgJ2NoaWxkU3RhdGVzJykubGVu
Z3RoOwotICB9KSwKKyAgZ2V0UmVjb3JkczogZnVuY3Rpb24odHlwZSkgeworICAgIHJldHVybiBF
bWJlci5BKCk7CisgIH0sCiAKICAgLyoqCi0gICAgQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcg
d2hldGhlciB0aGUgc3RhdGUgdGFrZXMgYSBjb250ZXh0LgotICAgIEJ5IGRlZmF1bHQgd2UgYXNz
dW1lIGFsbCBzdGF0ZXMgdGFrZSBjb250ZXh0cy4KKyAgICBXcmFwcyBhIHJlY29yZCBhbmQgb2Jz
ZXJ2ZXJzIGNoYW5nZXMgdG8gaXQuCiAKLSAgICBAcHJvcGVydHkgaGFzQ29udGV4dAotICAgIEBk
ZWZhdWx0IHRydWUKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2Qgd3JhcFJlY29yZAorICAgIEBw
YXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZS4KKyAgICBAcmV0dXJuIHtP
YmplY3R9IFRoZSB3cmFwcGVkIHJlY29yZC4gRm9ybWF0OgorICAgIGNvbHVtblZhbHVlczoge0Fy
cmF5fQorICAgIHNlYXJjaEtleXdvcmRzOiB7QXJyYXl9CiAgICovCi0gIGhhc0NvbnRleHQ6IHRy
dWUsCisgIHdyYXBSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHZhciByZWNvcmRUb1Nl
bmQgPSB7IG9iamVjdDogcmVjb3JkIH0sIGNvbHVtblZhbHVlcyA9IHt9LCBzZWxmID0gdGhpczsK
IAotICAvKioKLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHRyYW5zaXRpb24gZXZlbnQuCisgICAg
cmVjb3JkVG9TZW5kLmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKHJl
Y29yZCk7CisgICAgcmVjb3JkVG9TZW5kLnNlYXJjaEtleXdvcmRzID0gdGhpcy5nZXRSZWNvcmRL
ZXl3b3JkcyhyZWNvcmQpOworICAgIHJlY29yZFRvU2VuZC5maWx0ZXJWYWx1ZXMgPSB0aGlzLmdl
dFJlY29yZEZpbHRlclZhbHVlcyhyZWNvcmQpOworICAgIHJlY29yZFRvU2VuZC5jb2xvciA9IHRo
aXMuZ2V0UmVjb3JkQ29sb3IocmVjb3JkKTsKIAotICAgIEBldmVudCBzZXR1cAotICAgIEBwYXJh
bSB7RW1iZXIuU3RhdGVNYW5hZ2VyfSBtYW5hZ2VyCi0gICAgQHBhcmFtIGNvbnRleHQKLSAgICBA
c2VlIEVtYmVyLlN0YXRlTWFuYWdlciN0cmFuc2l0aW9uRXZlbnQKLSAgKi8KLSAgc2V0dXA6IEVt
YmVyLkssCisgICAgcmV0dXJuIHJlY29yZFRvU2VuZDsKKyAgfSwKIAogICAvKioKLSAgICBUaGlz
IGV2ZW50IGZpcmVzIHdoZW4gdGhlIHN0YXRlIGlzIGVudGVyZWQuCisgICAgR2V0cyB0aGUgdmFs
dWVzIGZvciBlYWNoIGNvbHVtbi4KIAotICAgIEBldmVudCBlbnRlcgotICAgIEBwYXJhbSB7RW1i
ZXIuU3RhdGVNYW5hZ2VyfSBtYW5hZ2VyCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGdldFJl
Y29yZENvbHVtblZhbHVlcworICAgIEByZXR1cm4ge09iamVjdH0gS2V5cyBzaG91bGQgbWF0Y2gg
Y29sdW1uIG5hbWVzIGRlZmluZWQKKyAgICBieSB0aGUgbW9kZWwgdHlwZS4KICAgKi8KLSAgZW50
ZXI6IEVtYmVyLkssCisgIGdldFJlY29yZENvbHVtblZhbHVlczogZnVuY3Rpb24ocmVjb3JkKSB7
CisgICAgcmV0dXJuIHt9OworICB9LAogCiAgIC8qKgotICAgIFRoaXMgZXZlbnQgZmlyZXMgd2hl
biB0aGUgc3RhdGUgaXMgZXhpdGVkLgorICAgIFJldHVybnMga2V5d29yZHMgdG8gbWF0Y2ggd2hl
biBzZWFyY2hpbmcgcmVjb3Jkcy4KIAotICAgIEBldmVudCBleGl0Ci0gICAgQHBhcmFtIHtFbWJl
ci5TdGF0ZU1hbmFnZXJ9IG1hbmFnZXIKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZ2V0UmVj
b3JkS2V5d29yZHMKKyAgICBAcmV0dXJuIHtBcnJheX0gUmVsZXZhbnQga2V5d29yZHMgZm9yIHNl
YXJjaC4KICAgKi8KLSAgZXhpdDogRW1iZXIuSwotfSk7Ci0KLUVtYmVyLlN0YXRlLnJlb3BlbkNs
YXNzKHsKKyAgZ2V0UmVjb3JkS2V5d29yZHM6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHJldHVy
biBFbWJlci5BKCk7CisgIH0sCiAKICAgLyoqCi0gICAgQ3JlYXRlcyBhbiBhY3Rpb24gZnVuY3Rp
b24gZm9yIHRyYW5zaXRpb25pbmcgdG8gdGhlIG5hbWVkIHN0YXRlIHdoaWxlCi0gICAgcHJlc2Vy
dmluZyBjb250ZXh0LgorICAgIFJldHVybnMgdGhlIHZhbHVlcyBvZiBmaWx0ZXJzIGRlZmluZWQg
YnkgYGdldEZpbHRlcnNgLgogCi0gICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIFN0YXRlTWFuYWdl
cnMgYXJlIGVxdWl2YWxlbnQ6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgYU1hbmFnZXIgPSBF
bWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsKLSAgICAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5j
cmVhdGUoewotICAgICAgICBjaGFuZ2VUb1N0YXRlVHdvOiBFbWJlci5TdGF0ZS50cmFuc2l0aW9u
VG8oJ3N0YXRlVHdvJykKLSAgICAgIH0pLAotICAgICAgc3RhdGVUd286IEVtYmVyLlN0YXRlLmNy
ZWF0ZSh7fSkKLSAgICB9KQotCi0gICAgYk1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3Jl
YXRlKHsKLSAgICAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgICBjaGFu
Z2VUb1N0YXRlVHdvOiBmdW5jdGlvbihtYW5hZ2VyLCBjb250ZXh0KXsKLSAgICAgICAgICBtYW5h
Z2VyLnRyYW5zaXRpb25Ubygnc3RhdGVUd28nLCBjb250ZXh0KQotICAgICAgICB9Ci0gICAgICB9
KSwKLSAgICAgIHN0YXRlVHdvOiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pCi0gICAgfSkKLSAgICBg
YGAKLQotICAgIEBtZXRob2QgdHJhbnNpdGlvblRvCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSB7
U3RyaW5nfSB0YXJnZXQKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZ2V0UmVjb3JkRmlsdGVy
VmFsdWVzCisgICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNlCisg
ICAgQHJldHVybiB7T2JqZWN0fSBUaGUgZmlsdGVyIHZhbHVlcwogICAqLworICBnZXRSZWNvcmRG
aWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgeworICAgIHJldHVybiB7fTsKKyAgfSwKIAot
ICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHRhcmdldCkgewotCi0gICAgdmFyIHRyYW5zaXRpb25G
dW5jdGlvbiA9IGZ1bmN0aW9uKHN0YXRlTWFuYWdlciwgY29udGV4dE9yRXZlbnQpIHsKLSAgICAg
IHZhciBjb250ZXh0cyA9IFtdLCB0cmFuc2l0aW9uQXJncywKLSAgICAgICAgICBFdmVudCA9IEVt
YmVyLiQgJiYgRW1iZXIuJC5FdmVudDsKLQotICAgICAgaWYgKGNvbnRleHRPckV2ZW50ICYmIChF
dmVudCAmJiBjb250ZXh0T3JFdmVudCBpbnN0YW5jZW9mIEV2ZW50KSkgewotICAgICAgICBpZiAo
Y29udGV4dE9yRXZlbnQuaGFzT3duUHJvcGVydHkoJ2NvbnRleHRzJykpIHsKLSAgICAgICAgICBj
b250ZXh0cyA9IGNvbnRleHRPckV2ZW50LmNvbnRleHRzLnNsaWNlKCk7Ci0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBjb250ZXh0cyA9IFtdLnNsaWNlLmNhbGwoYXJn
dW1lbnRzLCAxKTsKLSAgICAgIH0KKyAgLyoqCisgICAgRWFjaCByZWNvcmQgY2FuIGhhdmUgYSBj
b2xvciB0aGF0IHJlcHJlc2VudHMgaXRzIHN0YXRlLgogCi0gICAgICBjb250ZXh0cy51bnNoaWZ0
KHRhcmdldCk7Ci0gICAgICBzdGF0ZU1hbmFnZXIudHJhbnNpdGlvblRvLmFwcGx5KHN0YXRlTWFu
YWdlciwgY29udGV4dHMpOwotICAgIH07CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGdldFJl
Y29yZENvbG9yCisgICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNl
CisgICAgQHJldHVybiB7U3RyaW5nfSBUaGUgcmVjb3JkJ3MgY29sb3IKKyAgICAgIFBvc3NpYmxl
IG9wdGlvbnM6IGJsYWNrLCByZWQsIGJsdWUsIGdyZWVuCisgICovCisgIGdldFJlY29yZENvbG9y
OiBmdW5jdGlvbihyZWNvcmQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfSwKIAotICAgIHRyYW5z
aXRpb25GdW5jdGlvbi50cmFuc2l0aW9uVGFyZ2V0ID0gdGFyZ2V0OworICAvKioKKyAgICBPYnNl
cnZlcyBhbGwgcmVsZXZhbnQgcHJvcGVydGllcyBhbmQgcmUtc2VuZHMgdGhlIHdyYXBwZWQgcmVj
b3JkCisgICAgd2hlbiBhIGNoYW5nZSBvY2N1cnMuCiAKLSAgICByZXR1cm4gdHJhbnNpdGlvbkZ1
bmN0aW9uOworICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBvYnNlcnZlclJlY29yZAorICAgIEBw
YXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZQorICAgIEBwYXJhbSB7RnVu
Y3Rpb259IHJlY29yZFVwZGF0ZWQgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIHJlY29yZCBp
cyB1cGRhdGVkLgorICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB0
byByZW1vdmUgYWxsIG9ic2VydmVycy4KKyAgKi8KKyAgb2JzZXJ2ZVJlY29yZDogZnVuY3Rpb24o
cmVjb3JkLCByZWNvcmRVcGRhdGVkKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCl7fTsKICAgfQog
CiB9KTsKIAorCiB9KSgpOwogCiAKIAogKGZ1bmN0aW9uKCkgewogLyoqCitFbWJlciBFeHRlbnNp
b24gU3VwcG9ydAorCiBAbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXN0YXRlcworQHN1
Ym1vZHVsZSBlbWJlci1leHRlbnNpb24tc3VwcG9ydAorQHJlcXVpcmVzIGVtYmVyLWFwcGxpY2F0
aW9uCiAqLwogCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7Ci12YXIgYXJyYXlGb3JFYWNoID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMu
Zm9yRWFjaDsKK30pKCk7CisKKyhmdW5jdGlvbigpIHsKIC8qKgotICBBIFRyYW5zaXRpb24gdGFr
ZXMgdGhlIGVudGVyLCBleGl0IGFuZCByZXNvbHZlIHN0YXRlcyBhbmQgbm9ybWFsaXplcwotICB0
aGVtOgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworICovCit2
YXIgc2xpY2UgPSBbXS5zbGljZSwKKyAgICBoZWxwZXJzID0ge30sCisgICAgaW5qZWN0SGVscGVy
c0NhbGxiYWNrcyA9IFtdOwogCi0gICogdGFrZXMgYW55IHBhc3NlZCBpbiBjb250ZXh0cyBpbnRv
IGNvbnNpZGVyYXRpb24KLSAgKiBhZGRzIGluIGBpbml0aWFsU3RhdGVgcworLyoqCisgIFRoaXMg
aXMgYSBjb250YWluZXIgZm9yIGFuIGFzc29ydG1lbnQgb2YgdGVzdGluZyByZWxhdGVkIGZ1bmN0
aW9uYWxpdHk6CiAKLSAgQGNsYXNzIFRyYW5zaXRpb24KLSAgQHByaXZhdGUKLSovCi12YXIgVHJh
bnNpdGlvbiA9IGZ1bmN0aW9uKHJhdykgewotICB0aGlzLmVudGVyU3RhdGVzID0gcmF3LmVudGVy
U3RhdGVzLnNsaWNlKCk7Ci0gIHRoaXMuZXhpdFN0YXRlcyA9IHJhdy5leGl0U3RhdGVzLnNsaWNl
KCk7Ci0gIHRoaXMucmVzb2x2ZVN0YXRlID0gcmF3LnJlc29sdmVTdGF0ZTsKKyAgKiBDaG9vc2Ug
eW91ciBkZWZhdWx0IHRlc3QgYWRhcHRlciAoZm9yIHlvdXIgZnJhbWV3b3JrIG9mIGNob2ljZSku
CisgICogUmVnaXN0ZXIvVW5yZWdpc3RlciBhZGRpdGlvbmFsIHRlc3QgaGVscGVycy4KKyAgKiBT
ZXR1cCBjYWxsYmFja3MgdG8gYmUgZmlyZWQgd2hlbiB0aGUgdGVzdCBoZWxwZXJzIGFyZSBpbmpl
Y3RlZCBpbnRvCisgICAgeW91ciBhcHBsaWNhdGlvbi4KIAotICB0aGlzLmZpbmFsU3RhdGUgPSBy
YXcuZW50ZXJTdGF0ZXNbcmF3LmVudGVyU3RhdGVzLmxlbmd0aCAtIDFdIHx8IHJhdy5yZXNvbHZl
U3RhdGU7Ci19OworICBAY2xhc3MgVGVzdAorICBAbmFtZXNwYWNlIEVtYmVyCisqLworRW1iZXIu
VGVzdCA9IHsKIAotVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7CiAgIC8qKgotICAgIE5vcm1hbGl6
ZSB0aGUgcGFzc2VkIGluIGVudGVyLCBleGl0IGFuZCByZXNvbHZlIHN0YXRlcy4KKyAgICBgcmVn
aXN0ZXJIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSB0ZXN0IGhlbHBlciB0aGF0IHdpbGwg
YmUgaW5qZWN0ZWQKKyAgICB3aGVuIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4K
KworICAgIFRoZSBoZWxwZXIgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBj
dXJyZW50IEFwcGxpY2F0aW9uIGFzCisgICAgdGhlIGZpcnN0IHBhcmFtZXRlci4KKworICAgIEZv
ciBleGFtcGxlOgorCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJI
ZWxwZXIoJ2Jvb3QnLCBmdW5jdGlvbihhcHApIHsKKyAgICAgIEVtYmVyLnJ1bihhcHAsIGFwcC5h
ZHZhbmNlUmVhZGluZXNzKTsKKyAgICB9KTsKKyAgICBgYGAKIAotICAgIFRoaXMgcHJvY2VzcyBh
bHNvIGFkZHMgYGZpbmFsU3RhdGVgIGFuZCBgY29udGV4dHNgIHRvIHRoZSBUcmFuc2l0aW9uIG9i
amVjdC4KKyAgICBUaGlzIGhlbHBlciBjYW4gbGF0ZXIgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1l
bnRzIGJlY2F1c2UgaXQgd2lsbCBiZQorICAgIGNhbGxlZCB3aXRoIGBhcHBgIGFzIHRoZSBmaXJz
dCBwYXJhbWV0ZXIuCiAKLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgIEBwYXJhbSB7RW1iZXIu
U3RhdGVNYW5hZ2VyfSBtYW5hZ2VyIHRoZSBzdGF0ZSBtYW5hZ2VyIHJ1bm5pbmcgdGhlIHRyYW5z
aXRpb24KLSAgICBAcGFyYW0ge0FycmF5fSBjb250ZXh0cyBhIGxpc3Qgb2YgY29udGV4dHMgcGFz
c2VkIGludG8gYHRyYW5zaXRpb25Ub2AKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwID0gRW1i
ZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CisgICAgQXBwLmluamVjdFRlc3RIZWxwZXJzKCk7Cisg
ICAgYm9vdCgpOworICAgIGBgYAorCisgICAgQHB1YmxpYworICAgIEBtZXRob2QgcmVnaXN0ZXJI
ZWxwZXIKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1l
dGhvZCB0byBhZGQuCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyTWV0aG9kCisgICAgQHBh
cmFtIG9wdGlvbnMge09iamVjdH0KICAgKi8KLSAgbm9ybWFsaXplOiBmdW5jdGlvbihtYW5hZ2Vy
LCBjb250ZXh0cykgewotICAgIHRoaXMubWF0Y2hDb250ZXh0c1RvU3RhdGVzKGNvbnRleHRzKTsK
LSAgICB0aGlzLmFkZEluaXRpYWxTdGF0ZXMoKTsKLSAgICB0aGlzLnJlbW92ZVVuY2hhbmdlZENv
bnRleHRzKG1hbmFnZXIpOwotICAgIHJldHVybiB0aGlzOworICByZWdpc3RlckhlbHBlcjogZnVu
Y3Rpb24obmFtZSwgaGVscGVyTWV0aG9kKSB7CisgICAgaGVscGVyc1tuYW1lXSA9IHsKKyAgICAg
IG1ldGhvZDogaGVscGVyTWV0aG9kLAorICAgICAgbWV0YTogeyB3YWl0OiBmYWxzZSB9CisgICAg
fTsKICAgfSwKIAogICAvKioKLSAgICBNYXRjaCBlYWNoIG9mIHRoZSBjb250ZXh0cyBwYXNzZWQg
dG8gYHRyYW5zaXRpb25Ub2AgdG8gYSBzdGF0ZS4KLSAgICBUaGlzIHByb2Nlc3MgbWF5IGFsc28g
cmVxdWlyZSBhZGRpbmcgYWRkaXRpb25hbCBlbnRlciBhbmQgZXhpdAotICAgIHN0YXRlcyBpZiB0
aGVyZSBhcmUgbW9yZSBjb250ZXh0cyB0aGFuIGVudGVyIHN0YXRlcy4KKyAgICBgcmVnaXN0ZXJB
c3luY0hlbHBlcmAgaXMgdXNlZCB0byByZWdpc3RlciBhbiBhc3luYyB0ZXN0IGhlbHBlciB0aGF0
IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICB3aGVuIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNh
bGxlZC4KIAotICAgIEBtZXRob2QgbWF0Y2hDb250ZXh0c1RvU3RhdGVzCi0gICAgQHBhcmFtIHtB
cnJheX0gY29udGV4dHMgYSBsaXN0IG9mIGNvbnRleHRzIHBhc3NlZCBpbnRvIGB0cmFuc2l0aW9u
VG9gCi0gICovCi0gIG1hdGNoQ29udGV4dHNUb1N0YXRlczogZnVuY3Rpb24oY29udGV4dHMpIHsK
LSAgICB2YXIgc3RhdGVJZHggPSB0aGlzLmVudGVyU3RhdGVzLmxlbmd0aCAtIDEsCi0gICAgICAg
IG1hdGNoZWRDb250ZXh0cyA9IFtdLAotICAgICAgICBzdGF0ZSwKLSAgICAgICAgY29udGV4dDsK
KyAgICBUaGUgaGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgY3Vy
cmVudCBBcHBsaWNhdGlvbiBhcworICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCiAKLSAgICAvLyBO
ZXh0LCB3ZSB3aWxsIG1hdGNoIHRoZSBwYXNzZWQgaW4gY29udGV4dHMgdG8gdGhlIHN0YXRlcyB0
aGV5Ci0gICAgLy8gcmVwcmVzZW50LgotICAgIC8vCi0gICAgLy8gRmlyc3QsIGFzc2lnbiBhIGNv
bnRleHQgdG8gZWFjaCBlbnRlciBzdGF0ZSBpbiByZXZlcnNlIG9yZGVyLiBJZgotICAgIC8vIGFu
eSBjb250ZXh0cyBhcmUgbGVmdCwgYWRkIGEgcGFyZW50IHN0YXRlIHRvIHRoZSBsaXN0IG9mIHN0
YXRlcwotICAgIC8vIHRvIGVudGVyIGFuZCBleGl0LCBhbmQgYXNzaWduIGEgY29udGV4dCB0byB0
aGUgcGFyZW50IHN0YXRlLgotICAgIC8vCi0gICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGNvbnRl
eHRzIGxlZnQgd2hlbiB0aGUgc3RhdGUgbWFuYWdlciBpcwotICAgIC8vIHJlYWNoZWQsIHJhaXNl
IGFuIGV4Y2VwdGlvbi4KLSAgICAvLwotICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBmb2xsb3dpbmc6
Ci0gICAgLy8KLSAgICAvLyB8LSByb290Ci0gICAgLy8gfCB8LSBwb3N0Ci0gICAgLy8gfCB8IHwt
IGNvbW1lbnRzCi0gICAgLy8gfCB8LSBhYm91dCAoKiBjdXJyZW50IHN0YXRlKQotICAgIC8vCi0g
ICAgLy8gRm9yIGB0cmFuc2l0aW9uVG8oJ3Bvc3QuY29tbWVudHMnLCBwb3N0LCBwb3N0LmdldCgn
Y29tbWVudHMnKWAsCi0gICAgLy8gdGhlIGZpcnN0IGNvbnRleHQgKGBwb3N0YCkgd2lsbCBiZSBh
c3NpZ25lZCB0byBgcm9vdC5wb3N0YCwgYW5kCi0gICAgLy8gdGhlIHNlY29uZCBjb250ZXh0IChg
cG9zdC5nZXQoJ2NvbW1lbnRzJylgKSB3aWxsIGJlIGFzc2lnbmVkCi0gICAgLy8gdG8gYHJvb3Qu
cG9zdC5jb21tZW50c2AuCi0gICAgLy8KLSAgICAvLyBGb3IgdGhlIGZvbGxvd2luZzoKLSAgICAv
LwotICAgIC8vIHwtIHJvb3QKLSAgICAvLyB8IHwtIHBvc3QKLSAgICAvLyB8IHwgfC0gaW5kZXgg
KCogY3VycmVudCBzdGF0ZSkKLSAgICAvLyB8IHwgfC0gY29tbWVudHMKLSAgICAvLwotICAgIC8v
IEZvciBgdHJhbnNpdGlvblRvKCdwb3N0LmNvbW1lbnRzJywgb3RoZXJQb3N0LCBvdGhlclBvc3Qu
Z2V0KCdjb21tZW50cycpYCwKLSAgICAvLyB0aGUgYDxyb290LnBvc3Q+YCBzdGF0ZSB3aWxsIGJl
IGFkZGVkIHRvIHRoZSBsaXN0IG9mIGVudGVyIGFuZCBleGl0Ci0gICAgLy8gc3RhdGVzIGJlY2F1
c2UgaXRzIGNvbnRleHQgaGFzIGNoYW5nZWQuCisgICAgRm9yIGV4YW1wbGU6CiAKLSAgICB3aGls
ZSAoY29udGV4dHMubGVuZ3RoID4gMCkgewotICAgICAgaWYgKHN0YXRlSWR4ID49IDApIHsKLSAg
ICAgICAgc3RhdGUgPSB0aGlzLmVudGVyU3RhdGVzW3N0YXRlSWR4LS1dOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgaWYgKHRoaXMuZW50ZXJTdGF0ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgc3Rh
dGUgPSBnZXQodGhpcy5lbnRlclN0YXRlc1swXSwgJ3BhcmVudFN0YXRlJyk7Ci0gICAgICAgICAg
aWYgKCFzdGF0ZSkgeyB0aHJvdyAiQ2Fubm90IG1hdGNoIGFsbCBjb250ZXh0cyB0byBzdGF0ZXMi
OyB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gSWYgcmUtZW50ZXJpbmcgdGhlIGN1
cnJlbnQgc3RhdGUgd2l0aCBhIGNvbnRleHQsIHRoZSByZXNvbHZlCi0gICAgICAgICAgLy8gc3Rh
dGUgd2lsbCBiZSB0aGUgY3VycmVudCBzdGF0ZS4KLSAgICAgICAgICBzdGF0ZSA9IHRoaXMucmVz
b2x2ZVN0YXRlOwotICAgICAgICB9CisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlRlc3Qu
cmVnaXN0ZXJBc3luY0hlbHBlcignYm9vdCcsIGZ1bmN0aW9uKGFwcCkgeworICAgICAgRW1iZXIu
cnVuKGFwcCwgYXBwLmFkdmFuY2VSZWFkaW5lc3MpOworICAgIH0pOworICAgIGBgYAogCi0gICAg
ICAgIHRoaXMuZW50ZXJTdGF0ZXMudW5zaGlmdChzdGF0ZSk7Ci0gICAgICAgIHRoaXMuZXhpdFN0
YXRlcy51bnNoaWZ0KHN0YXRlKTsKLSAgICAgIH0KKyAgICBUaGUgYWR2YW50YWdlIG9mIGFuIGFz
eW5jIGhlbHBlciBpcyB0aGF0IGl0IHdpbGwgbm90IHJ1bgorICAgIHVudGlsIHRoZSBsYXN0IGFz
eW5jIGhlbHBlciBoYXMgY29tcGxldGVkLiAgQWxsIGFzeW5jIGhlbHBlcnMKKyAgICBhZnRlciBp
dCB3aWxsIHdhaXQgZm9yIGl0IGNvbXBsZXRlIGJlZm9yZSBydW5uaW5nLgogCi0gICAgICAvLyBp
biByb3V0ZXJzLCBvbmx5IHN0YXRlcyB3aXRoIGR5bmFtaWMgc2VnbWVudHMgaGF2ZSBhIGNvbnRl
eHQKLSAgICAgIGlmIChnZXQoc3RhdGUsICdoYXNDb250ZXh0JykpIHsKLSAgICAgICAgY29udGV4
dCA9IGNvbnRleHRzLnBvcCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGV4dCA9IG51
bGw7Ci0gICAgICB9CiAKLSAgICAgIG1hdGNoZWRDb250ZXh0cy51bnNoaWZ0KGNvbnRleHQpOwot
ICAgIH0KKyAgICBGb3IgZXhhbXBsZToKIAotICAgIHRoaXMuY29udGV4dHMgPSBtYXRjaGVkQ29u
dGV4dHM7Ci0gIH0sCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJB
c3luY0hlbHBlcignZGVsZXRlUG9zdCcsIGZ1bmN0aW9uKGFwcCwgcG9zdElkKSB7CisgICAgICBj
bGljaygnLmRlbGV0ZS0nICsgcG9zdElkKTsKKyAgICB9KTsKIAotICAvKioKLSAgICBBZGQgYW55
IGBpbml0aWFsU3RhdGVgcyB0byB0aGUgbGlzdCBvZiBlbnRlciBzdGF0ZXMuCisgICAgLy8gLi4u
IGluIHlvdXIgdGVzdAorICAgIHZpc2l0KCcvcG9zdC8yJyk7CisgICAgZGVsZXRlUG9zdCgyKTsK
KyAgICB2aXNpdCgnL3Bvc3QvMycpOworICAgIGRlbGV0ZVBvc3QoMyk7CisgICAgYGBgCiAKLSAg
ICBAbWV0aG9kIGFkZEluaXRpYWxTdGF0ZXMKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCByZWdp
c3RlckFzeW5jSGVscGVyCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhl
IGhlbHBlciBtZXRob2QgdG8gYWRkLgorICAgIEBwYXJhbSB7RnVuY3Rpb259IGhlbHBlck1ldGhv
ZAogICAqLwotICBhZGRJbml0aWFsU3RhdGVzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgZmluYWxT
dGF0ZSA9IHRoaXMuZmluYWxTdGF0ZSwgaW5pdGlhbFN0YXRlOwotCi0gICAgd2hpbGUodHJ1ZSkg
ewotICAgICAgaW5pdGlhbFN0YXRlID0gZ2V0KGZpbmFsU3RhdGUsICdpbml0aWFsU3RhdGUnKSB8
fCAnc3RhcnQnOwotICAgICAgZmluYWxTdGF0ZSA9IGdldChmaW5hbFN0YXRlLCAnc3RhdGVzLicg
KyBpbml0aWFsU3RhdGUpOwotCi0gICAgICBpZiAoIWZpbmFsU3RhdGUpIHsgYnJlYWs7IH0KLQot
ICAgICAgdGhpcy5maW5hbFN0YXRlID0gZmluYWxTdGF0ZTsKLSAgICAgIHRoaXMuZW50ZXJTdGF0
ZXMucHVzaChmaW5hbFN0YXRlKTsKLSAgICAgIHRoaXMuY29udGV4dHMucHVzaCh1bmRlZmluZWQp
OwotICAgIH0KKyAgcmVnaXN0ZXJBc3luY0hlbHBlcjogZnVuY3Rpb24obmFtZSwgaGVscGVyTWV0
aG9kKSB7CisgICAgaGVscGVyc1tuYW1lXSA9IHsKKyAgICAgIG1ldGhvZDogaGVscGVyTWV0aG9k
LAorICAgICAgbWV0YTogeyB3YWl0OiB0cnVlIH0KKyAgICB9OwogICB9LAogCiAgIC8qKgotICAg
IFJlbW92ZSBhbnkgc3RhdGVzIHRoYXQgd2VyZSBhZGRlZCBiZWNhdXNlIHRoZSBudW1iZXIgb2Yg
Y29udGV4dHMKLSAgICBleGNlZWRlZCB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IGVudGVyIHN0YXRl
cywgYnV0IHRoZSBjb250ZXh0IGhhcwotICAgIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRp
bWUgdGhlIHN0YXRlIHdhcyBlbnRlcmVkLgorICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRkZWQg
aGVscGVyIG1ldGhvZC4KIAotICAgIEBtZXRob2QgcmVtb3ZlVW5jaGFuZ2VkQ29udGV4dHMKLSAg
ICBAcGFyYW0ge0VtYmVyLlN0YXRlTWFuYWdlcn0gbWFuYWdlciBwYXNzZWQgaW4gdG8gbG9vayB1
cCB0aGUgbGFzdAotICAgICAgY29udGV4dCBmb3IgYSBzdGF0ZXMKLSAgKi8KLSAgcmVtb3ZlVW5j
aGFuZ2VkQ29udGV4dHM6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAvLyBTdGFydCBmcm9tIHRo
ZSBiZWdpbm5pbmcgb2YgdGhlIGVudGVyIHN0YXRlcy4gSWYgdGhlIHN0YXRlIHdhcyBhZGRlZAot
ICAgIC8vIHRvIHRoZSBsaXN0IGR1cmluZyB0aGUgY29udGV4dCBtYXRjaGluZyBwaGFzZSwgbWFr
ZSBzdXJlIHRoZSBjb250ZXh0Ci0gICAgLy8gaGFzIGFjdHVhbGx5IGNoYW5nZWQgc2luY2UgdGhl
IGxhc3QgdGltZSB0aGUgc3RhdGUgd2FzIGVudGVyZWQuCi0gICAgd2hpbGUgKHRoaXMuZW50ZXJT
dGF0ZXMubGVuZ3RoID4gMCkgewotICAgICAgaWYgKHRoaXMuZW50ZXJTdGF0ZXNbMF0gIT09IHRo
aXMuZXhpdFN0YXRlc1swXSkgeyBicmVhazsgfQorICAgIEV4YW1wbGU6CiAKLSAgICAgIGlmICh0
aGlzLmVudGVyU3RhdGVzLmxlbmd0aCA9PT0gdGhpcy5jb250ZXh0cy5sZW5ndGgpIHsKLSAgICAg
ICAgaWYgKG1hbmFnZXIuZ2V0U3RhdGVNZXRhKHRoaXMuZW50ZXJTdGF0ZXNbMF0sICdjb250ZXh0
JykgIT09IHRoaXMuY29udGV4dHNbMF0pIHsgYnJlYWs7IH0KLSAgICAgICAgdGhpcy5jb250ZXh0
cy5zaGlmdCgpOwotICAgICAgfQorICAgIGBgYAorICAgIEVtYmVyLlRlc3QudW5yZWdpc3Rlckhl
bHBlcignd2FpdCcpOworICAgIGBgYAogCi0gICAgICB0aGlzLnJlc29sdmVTdGF0ZSA9IHRoaXMu
ZW50ZXJTdGF0ZXMuc2hpZnQoKTsKLSAgICAgIHRoaXMuZXhpdFN0YXRlcy5zaGlmdCgpOwotICAg
IH0KLSAgfQotfTsKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCB1bnJlZ2lzdGVySGVscGVyCisg
ICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIGhlbHBlciB0byByZW1vdmUuCisgICovCisgIHVu
cmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICBkZWxldGUgaGVscGVyc1tuYW1l
XTsKKyAgICBkZWxldGUgRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZVtuYW1lXTsKKyAgfSwK
IAotdmFyIHNlbmRSZWN1cnNpdmVseSA9IGZ1bmN0aW9uKGV2ZW50LCBjdXJyZW50U3RhdGUsIGlz
VW5oYW5kbGVkUGFzcykgewotICB2YXIgbG9nID0gdGhpcy5lbmFibGVMb2dnaW5nLAotICAgICAg
ZXZlbnROYW1lID0gaXNVbmhhbmRsZWRQYXNzID8gJ3VuaGFuZGxlZEV2ZW50JyA6IGV2ZW50LAot
ICAgICAgYWN0aW9uID0gY3VycmVudFN0YXRlW2V2ZW50TmFtZV0sCi0gICAgICBjb250ZXh0cywg
c2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cywgYWN0aW9uQXJndW1lbnRzOworICAvKioKKyAgICBVc2Vk
IHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB0byBiZSBmaXJlZCB3aGVuZXZlciBgQXBwLmluamVjdFRl
c3RIZWxwZXJzYAorICAgIGlzIGNhbGxlZC4KIAotICBjb250ZXh0cyA9IFtdLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAzKTsKKyAgICBUaGUgY2FsbGJhY2sgd2lsbCByZWNlaXZlIHRoZSBjdXJyZW50
IGFwcGxpY2F0aW9uIGFzIGFuIGFyZ3VtZW50LgogCi0gIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBh
Y3Rpb24gaXMgYSBtZXRob2QgdGhhdAotICAvLyBjYW4gYmUgaW52b2tlZC4gRG9uJ3QgYmxpbmRs
eSBjaGVjayBqdXN0IGZvcgotICAvLyBleGlzdGVuY2UsIGJlY2F1c2UgaXQgaXMgcG9zc2libGUg
dGhlIHN0YXRlCi0gIC8vIG1hbmFnZXIgaGFzIGEgY2hpbGQgc3RhdGUgb2YgdGhlIGdpdmVuIG5h
bWUsCi0gIC8vIGFuZCB3ZSBzaG91bGQgc3RpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoYXQK
LSAgLy8gY2FzZS4KLSAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKLSAgICBp
ZiAobG9nKSB7Ci0gICAgICBpZiAoaXNVbmhhbmRsZWRQYXNzKSB7Ci0gICAgICAgIEVtYmVyLkxv
Z2dlci5sb2coZm10KCJTVEFURU1BTkFHRVI6IFVuaGFuZGxlZCBldmVudCAnJUAnIGJlaW5nIHNl
bnQgdG8gc3RhdGUgJUAuIiwgW2V2ZW50LCBnZXQoY3VycmVudFN0YXRlLCAncGF0aCcpXSkpOwot
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZyhmbXQoIlNUQVRFTUFOQUdF
UjogU2VuZGluZyBldmVudCAnJUAnIHRvIHN0YXRlICVALiIsIFtldmVudCwgZ2V0KGN1cnJlbnRT
dGF0ZSwgJ3BhdGgnKV0pKTsKLSAgICAgIH0KLSAgICB9CisgICAgRXhhbXBsZToKKyAgICBgYGAK
KyAgICBFbWJlci5UZXN0Lm9uSW5qZWN0SGVscGVycyhmdW5jdGlvbigpIHsKKyAgICAgIEVtYmVy
LiQoZG9jdW1lbnQpLmFqYXhTdGFydChmdW5jdGlvbigpIHsKKyAgICAgICAgVGVzdC5wZW5kaW5n
QWpheFJlcXVlc3RzKys7CisgICAgICB9KTsKIAotICAgIGFjdGlvbkFyZ3VtZW50cyA9IGNvbnRl
eHRzOwotICAgIGlmIChpc1VuaGFuZGxlZFBhc3MpIHsKLSAgICAgIGFjdGlvbkFyZ3VtZW50cy51
bnNoaWZ0KGV2ZW50KTsKLSAgICB9Ci0gICAgYWN0aW9uQXJndW1lbnRzLnVuc2hpZnQodGhpcyk7
CisgICAgICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RvcChmdW5jdGlvbigpIHsKKyAgICAgICAg
VGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzLS07CisgICAgICB9KTsKKyAgICB9KTsKKyAgICBgYGAK
IAotICAgIHJldHVybiBhY3Rpb24uYXBwbHkoY3VycmVudFN0YXRlLCBhY3Rpb25Bcmd1bWVudHMp
OwotICB9IGVsc2UgewotICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldChjdXJyZW50U3RhdGUsICdw
YXJlbnRTdGF0ZScpOwotICAgIGlmIChwYXJlbnRTdGF0ZSkgeworICAgIEBwdWJsaWMKKyAgICBA
bWV0aG9kIG9uSW5qZWN0SGVscGVycworICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRo
ZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCisgICovCisgIG9uSW5qZWN0SGVscGVyczogZnVuY3Rp
b24oY2FsbGJhY2spIHsKKyAgICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2sp
OworICB9LAogCi0gICAgICBzZW5kUmVjdXJzaXZlQXJndW1lbnRzID0gY29udGV4dHM7Ci0gICAg
ICBzZW5kUmVjdXJzaXZlQXJndW1lbnRzLnVuc2hpZnQoZXZlbnQsIHBhcmVudFN0YXRlLCBpc1Vu
aGFuZGxlZFBhc3MpOworICAvKioKKyAgICBUaGlzIHJldHVybnMgYSB0aGVuYWJsZSB0YWlsb3Jl
ZCBmb3IgdGVzdGluZy4gIEl0IGNhdGNoZXMgZmFpbGVkCisgICAgYG9uU3VjY2Vzc2AgY2FsbGJh
Y2tzIGFuZCBpbnZva2VzIHRoZSBgRW1iZXIuVGVzdC5hZGFwdGVyLmV4Y2VwdGlvbmAKKyAgICBj
YWxsYmFjayBpbiB0aGUgbGFzdCBjaGFpbmVkIHRoZW4uCiAKLSAgICAgIHJldHVybiBzZW5kUmVj
dXJzaXZlbHkuYXBwbHkodGhpcywgc2VuZFJlY3Vyc2l2ZUFyZ3VtZW50cyk7Ci0gICAgfSBlbHNl
IGlmICghaXNVbmhhbmRsZWRQYXNzKSB7Ci0gICAgICByZXR1cm4gc2VuZEV2ZW50LmNhbGwodGhp
cywgZXZlbnQsIGNvbnRleHRzLCB0cnVlKTsKLSAgICB9Ci0gIH0KLX07CisgICAgVGhpcyBtZXRo
b2Qgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3VjaCBhcyBgd2FpdGAuCiAK
LXZhciBzZW5kRXZlbnQgPSBmdW5jdGlvbihldmVudE5hbWUsIHNlbmRSZWN1cnNpdmVBcmd1bWVu
dHMsIGlzVW5oYW5kbGVkUGFzcykgewotICBzZW5kUmVjdXJzaXZlQXJndW1lbnRzLnVuc2hpZnQo
ZXZlbnROYW1lLCBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpLCBpc1VuaGFuZGxlZFBhc3MpOwot
ICByZXR1cm4gc2VuZFJlY3Vyc2l2ZWx5LmFwcGx5KHRoaXMsIHNlbmRSZWN1cnNpdmVBcmd1bWVu
dHMpOwotfTsKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCBwcm9taXNlCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gcmVzb2x2ZXIgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlz
ZS4KKyAgKi8KKyAgcHJvbWlzZTogZnVuY3Rpb24ocmVzb2x2ZXIpIHsKKyAgICByZXR1cm4gbmV3
IEVtYmVyLlRlc3QuUHJvbWlzZShyZXNvbHZlcik7CisgIH0sCiAKLS8qKgotICBTdGF0ZU1hbmFn
ZXIgaXMgcGFydCBvZiBFbWJlcidzIGltcGxlbWVudGF0aW9uIG9mIGEgZmluaXRlIHN0YXRlIG1h
Y2hpbmUuIEEKLSAgU3RhdGVNYW5hZ2VyIGluc3RhbmNlIG1hbmFnZXMgYSBudW1iZXIgb2YgcHJv
cGVydGllcyB0aGF0IGFyZSBpbnN0YW5jZXMgb2YKLSAgYEVtYmVyLlN0YXRlYCwKLSAgdHJhY2tz
IHRoZSBjdXJyZW50IGFjdGl2ZSBzdGF0ZSwgYW5kIHRyaWdnZXJzIGNhbGxiYWNrcyB3aGVuIHN0
YXRlcyBoYXZlIGNoYW5nZWQuCisgIC8qKgorICAgVXNlZCB0byBhbGxvdyBlbWJlci10ZXN0aW5n
IHRvIGNvbW11bmljYXRlIHdpdGggYSBzcGVjaWZpYyB0ZXN0aW5nCisgICBmcmFtZXdvcmsuCiAK
LSAgIyMgRGVmaW5pbmcgU3RhdGVzCisgICBZb3UgY2FuIG1hbnVhbGx5IHNldCBpdCBiZWZvcmUg
Y2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KIAotICBUaGUgc3RhdGVzIG9mIFN0YXRl
TWFuYWdlciBjYW4gYmUgZGVjbGFyZWQgaW4gb25lIG9mIHR3byB3YXlzLiBGaXJzdCwgeW91IGNh
bgotICBkZWZpbmUgYSBgc3RhdGVzYCBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgc3Rh
dGVzOgorICAgRXhhbXBsZToKIAotICBgYGBqYXZhc2NyaXB0Ci0gIG1hbmFnZXJBID0gRW1iZXIu
U3RhdGVNYW5hZ2VyLmNyZWF0ZSh7Ci0gICAgc3RhdGVzOiB7Ci0gICAgICBzdGF0ZU9uZTogRW1i
ZXIuU3RhdGUuY3JlYXRlKCksCi0gICAgICBzdGF0ZVR3bzogRW1iZXIuU3RhdGUuY3JlYXRlKCkK
LSAgICB9Ci0gIH0pCisgICBgYGAKKyAgIEVtYmVyLlRlc3QuYWRhcHRlciA9IE15Q3VzdG9tQWRh
cHRlci5jcmVhdGUoKQorICAgYGBgCiAKLSAgbWFuYWdlckEuZ2V0KCdzdGF0ZXMnKQotICAvLyB7
Ci0gIC8vICAgc3RhdGVPbmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSgpLAotICAvLyAgIHN0YXRlVHdv
OiBFbWJlci5TdGF0ZS5jcmVhdGUoKQotICAvLyB9Ci0gIGBgYAorICAgSWYgeW91IGRvIG5vdCBz
ZXQgaXQsIGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRvIGBFbWJlci5UZXN0LlFVbml0QWRh
cHRlcmAuCiAKLSAgWW91IGNhbiBhbHNvIGFkZCBpbnN0YW5jZXMgb2YgYEVtYmVyLlN0YXRlYCAo
b3IgYW4gYEVtYmVyLlN0YXRlYCBzdWJjbGFzcykKLSAgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBv
ZiBhIFN0YXRlTWFuYWdlci4gVGhlc2Ugc3RhdGVzIHdpbGwgYmUgY29sbGVjdGVkIGludG8KLSAg
dGhlIGBzdGF0ZXNgIHByb3BlcnR5IGZvciB5b3UuCisgICBAcHVibGljCisgICBAcHJvcGVydHkg
YWRhcHRlcgorICAgQHR5cGUge0NsYXNzfSBUaGUgYWRhcHRlciB0byBiZSB1c2VkLgorICAgQGRl
ZmF1bHQgRW1iZXIuVGVzdC5RVW5pdEFkYXB0ZXIKKyAgKi8KKyAgYWRhcHRlcjogbnVsbCwKIAot
ICBgYGBqYXZhc2NyaXB0Ci0gIG1hbmFnZXJBID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7
Ci0gICAgc3RhdGVPbmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSgpLAotICAgIHN0YXRlVHdvOiBFbWJl
ci5TdGF0ZS5jcmVhdGUoKQotICB9KQorICAvKioKKyAgICBSZXBsYWNlbWVudCBmb3IgYEVtYmVy
LlJTVlAucmVzb2x2ZWAKKyAgICBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoaXMgdXNlcworICAg
IGFuZCBpbnN0YW5jZSBvZiBgRW1iZXIuVGVzdC5Qcm9taXNlYAogCi0gIG1hbmFnZXJBLmdldCgn
c3RhdGVzJykKLSAgLy8gewotICAvLyAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwK
LSAgLy8gICBzdGF0ZVR3bzogRW1iZXIuU3RhdGUuY3JlYXRlKCkKLSAgLy8gfQotICBgYGAKKyAg
ICBAcHVibGljCisgICAgQG1ldGhvZCByZXNvbHZlCisgICAgQHBhcmFtIHtNaXhlZH0gVGhlIHZh
bHVlIHRvIHJlc29sdmUKKyAgKi8KKyAgcmVzb2x2ZTogZnVuY3Rpb24odmFsKSB7CisgICAgcmV0
dXJuIEVtYmVyLlRlc3QucHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7CisgICAgICByZXR1cm4g
cmVzb2x2ZSh2YWwpOworICAgIH0pOworICB9LAogCi0gICMjIFRoZSBJbml0aWFsIFN0YXRlCisg
IC8qKgorICAgICBUaGlzIGFsbG93cyBlbWJlci10ZXN0aW5nIHRvIHBsYXkgbmljZWx5IHdpdGgg
b3RoZXIgYXN5bmNocm9ub3VzCisgICAgIGV2ZW50cywgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0
aGF0IGlzIHdhaXRpbmcgZm9yIGEgQ1NTMworICAgICB0cmFuc2l0aW9uIG9yIGFuIEluZGV4REIg
dHJhbnNhY3Rpb24uCiAKLSAgV2hlbiBjcmVhdGVkIGEgU3RhdGVNYW5hZ2VyIGluc3RhbmNlIHdp
bGwgaW1tZWRpYXRlbHkgZW50ZXIgaW50byB0aGUgc3RhdGUKLSAgZGVmaW5lZCBhcyBpdHMgYHN0
YXJ0YCBwcm9wZXJ0eSBvciB0aGUgc3RhdGUgcmVmZXJlbmNlZCBieSBuYW1lIGluIGl0cwotICBg
aW5pdGlhbFN0YXRlYCBwcm9wZXJ0eToKKyAgICAgRm9yIGV4YW1wbGU6CisgICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgRW1iZXIuVGVzdC5yZWdpc3RlcldhaXRlcihmdW5jdGlvbigpIHsKKyAgICAg
cmV0dXJuIG15UGVuZGluZ1RyYW5zYWN0aW9ucygpID09IDA7CisgICAgIH0pOworICAgICBgYGAK
KyAgICAgVGhlIGBjb250ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRvIG9wdGlvbmFsbHkgc3Bl
Y2lmeSB0aGUgYHRoaXNgCisgICAgIHdpdGggd2hpY2ggeW91ciBjYWxsYmFjayB3aWxsIGJlIGlu
dm9rZWQuCiAKLSAgYGBgamF2YXNjcmlwdAotICBtYW5hZ2VyQSA9IEVtYmVyLlN0YXRlTWFuYWdl
ci5jcmVhdGUoewotICAgIHN0YXJ0OiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pCi0gIH0pCisgICAg
IEZvciBleGFtcGxlOgorICAgICBgYGBqYXZhc2NyaXB0CisgICAgIEVtYmVyLlRlc3QucmVnaXN0
ZXJXYWl0ZXIoTXlEQiwgTXlEQi5oYXNQZW5kaW5nVHJhbnNhY3Rpb25zKTsKKyAgICAgYGBgCisg
ICAgIEBwdWJsaWMKKyAgICAgQG1ldGhvZCByZWdpc3RlcldhaXRlcgorICAgICBAcGFyYW0ge09i
amVjdH0gY29udGV4dCAob3B0aW9uYWwpCisgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr
CisgICovCisgIHJlZ2lzdGVyV2FpdGVyOiBmdW5jdGlvbihjb250ZXh0LCBjYWxsYmFjaykgewor
ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICBjYWxsYmFjayA9IGNvbnRl
eHQ7CisgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICB9CisgICAgaWYgKCF0aGlzLndhaXRlcnMp
IHsKKyAgICAgIHRoaXMud2FpdGVycyA9IEVtYmVyLkEoKTsKKyAgICB9CisgICAgdGhpcy53YWl0
ZXJzLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrXSk7CisgIH0sCisgIC8qKgorICAgICBgdW5yZWdp
c3RlcldhaXRlcmAgaXMgdXNlZCB0byB1bnJlZ2lzdGVyIGEgY2FsbGJhY2sgdGhhdCB3YXMKKyAg
ICAgcmVnaXN0ZXJlZCB3aXRoIGByZWdpc3RlcldhaXRlcmAuCiAKLSAgbWFuYWdlckEuZ2V0KCdj
dXJyZW50U3RhdGUubmFtZScpIC8vICdzdGFydCcKKyAgICAgQHB1YmxpYworICAgICBAbWV0aG9k
IHVucmVnaXN0ZXJXYWl0ZXIKKyAgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgKG9wdGlvbmFs
KQorICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAqLworICB1bnJlZ2lzdGVyV2Fp
dGVyOiBmdW5jdGlvbihjb250ZXh0LCBjYWxsYmFjaykgeworICAgIHZhciBwYWlyOworICAgIGlm
ICghdGhpcy53YWl0ZXJzKSB7IHJldHVybjsgfQorICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09
PSAxKSB7CisgICAgICBjYWxsYmFjayA9IGNvbnRleHQ7CisgICAgICBjb250ZXh0ID0gbnVsbDsK
KyAgICB9CisgICAgcGFpciA9IFtjb250ZXh0LCBjYWxsYmFja107CisgICAgdGhpcy53YWl0ZXJz
ID0gRW1iZXIuQSh0aGlzLndhaXRlcnMuZmlsdGVyKGZ1bmN0aW9uKGVsdCkgeworICAgICAgcmV0
dXJuIEVtYmVyLmNvbXBhcmUoZWx0LCBwYWlyKSE9PTA7CisgICAgfSkpOworICB9Cit9OwogCi0g
IG1hbmFnZXJCID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7Ci0gICAgaW5pdGlhbFN0YXRl
OiAnYmVnaW5IZXJlJywKLSAgICBiZWdpbkhlcmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7fSkKLSAg
fSkKK2Z1bmN0aW9uIGhlbHBlcihhcHAsIG5hbWUpIHsKKyAgdmFyIGZuID0gaGVscGVyc1tuYW1l
XS5tZXRob2QsCisgICAgICBtZXRhID0gaGVscGVyc1tuYW1lXS5tZXRhOwogCi0gIG1hbmFnZXJC
LmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnYmVnaW5IZXJlJwotICBgYGAKKyAgcmV0dXJu
IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLAorICAg
ICAgICBsYXN0UHJvbWlzZSA9IEVtYmVyLlRlc3QubGFzdFByb21pc2U7CiAKLSAgQmVjYXVzZSBp
dCBpcyBhIHByb3BlcnR5IHlvdSBtYXkgYWxzbyBwcm92aWRlIGEgY29tcHV0ZWQgZnVuY3Rpb24g
aWYgeW91IHdpc2gKLSAgdG8gZGVyaXZlIGFuIGBpbml0aWFsU3RhdGVgIHByb2dyYW1tYXRpY2Fs
bHk6CisgICAgYXJncy51bnNoaWZ0KGFwcCk7CiAKLSAgYGBgamF2YXNjcmlwdAotICBtYW5hZ2Vy
QyA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoewotICAgIGluaXRpYWxTdGF0ZTogZnVuY3Rp
b24oKXsKLSAgICAgIGlmIChzb21lTG9naWMpIHsKLSAgICAgICAgcmV0dXJuICdhY3RpdmUnOwot
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICdwYXNzaXZlJzsKLSAgICAgIH0KLSAgICB9
LnByb3BlcnR5KCksCi0gICAgYWN0aXZlOiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pLAotICAgIHBh
c3NpdmU6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7fSkKLSAgfSkKLSAgYGBgCisgICAgLy8gc29tZSBo
ZWxwZXJzIGFyZSBub3QgYXN5bmMgYW5kCisgICAgLy8gbmVlZCB0byByZXR1cm4gYSB2YWx1ZSBp
bW1lZGlhdGVseS4KKyAgICAvLyBleGFtcGxlOiBgZmluZGAKKyAgICBpZiAoIW1ldGEud2FpdCkg
eworICAgICAgcmV0dXJuIGZuLmFwcGx5KGFwcCwgYXJncyk7CisgICAgfQogCi0gICMjIE1vdmlu
ZyBCZXR3ZWVuIFN0YXRlcworICAgIGlmICghbGFzdFByb21pc2UpIHsKKyAgICAgIC8vIEl0J3Mg
dGhlIGZpcnN0IGFzeW5jIGhlbHBlciBpbiBjdXJyZW50IGNvbnRleHQKKyAgICAgIGxhc3RQcm9t
aXNlID0gZm4uYXBwbHkoYXBwLCBhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2FpdCBm
b3IgbGFzdCBoZWxwZXIncyBwcm9taXNlIHRvIHJlc29sdmUKKyAgICAgIC8vIGFuZCB0aGVuIGV4
ZWN1dGUKKyAgICAgIHJ1bihmdW5jdGlvbigpIHsKKyAgICAgICAgbGFzdFByb21pc2UgPSBFbWJl
ci5UZXN0LnJlc29sdmUobGFzdFByb21pc2UpLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgICAg
cmV0dXJuIGZuLmFwcGx5KGFwcCwgYXJncyk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAg
fQogCi0gIEEgU3RhdGVNYW5hZ2VyIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYEVtYmVyLlN0YXRl
YCBvYmplY3RzIGFzIHByb3BlcnRpZXMKLSAgYW5kIGNhbiBoYXZlIGEgc2luZ2xlIG9uZSBvZiB0
aGVzZSBzdGF0ZXMgYXMgaXRzIGN1cnJlbnQgc3RhdGUuCisgICAgcmV0dXJuIGxhc3RQcm9taXNl
OworICB9OworfQogCi0gIENhbGxpbmcgYHRyYW5zaXRpb25Ub2AgdHJhbnNpdGlvbnMgYmV0d2Vl
biBzdGF0ZXM6CitmdW5jdGlvbiBydW4oZm4pIHsKKyAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1
bkxvb3ApIHsKKyAgICBFbWJlci5ydW4oZm4pOworICB9IGVsc2UgeworICAgIGZuKCk7CisgIH0K
K30KIAotICBgYGBqYXZhc2NyaXB0Ci0gIHJvYm90TWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdl
ci5jcmVhdGUoewotICAgIGluaXRpYWxTdGF0ZTogJ3Bvd2VyZWREb3duJywKLSAgICBwb3dlcmVk
RG93bjogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KSwKLSAgICBwb3dlcmVkVXA6IEVtYmVyLlN0YXRl
LmNyZWF0ZSh7fSkKLSAgfSkKK0VtYmVyLkFwcGxpY2F0aW9uLnJlb3Blbih7CisgIC8qKgorICAg
VGhpcyBwcm9wZXJ0eSBjb250YWlucyB0aGUgdGVzdGluZyBoZWxwZXJzIGZvciB0aGUgY3VycmVu
dCBhcHBsaWNhdGlvbi4gVGhlc2UKKyAgIGFyZSBjcmVhdGVkIG9uY2UgeW91IGNhbGwgYGluamVj
dFRlc3RIZWxwZXJzYCBvbiB5b3VyIGBFbWJlci5BcHBsaWNhdGlvbmAKKyAgIGluc3RhbmNlLiBU
aGUgaW5jbHVkZWQgaGVscGVycyBhcmUgYWxzbyBhdmFpbGFibGUgb24gdGhlIGB3aW5kb3dgIG9i
amVjdCBieQorICAgZGVmYXVsdCwgYnV0IGNhbiBiZSB1c2VkIGZyb20gdGhpcyBvYmplY3Qgb24g
dGhlIGluZGl2aWR1YWwgYXBwbGljYXRpb24gYWxzby4KIAotICByb2JvdE1hbmFnZXIuZ2V0KCdj
dXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkRG93bicKLSAgcm9ib3RNYW5hZ2VyLnRyYW5z
aXRpb25UbygncG93ZXJlZFVwJykKLSAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5h
bWUnKSAvLyAncG93ZXJlZFVwJwotICBgYGAKKyAgICBAcHJvcGVydHkgdGVzdEhlbHBlcnMKKyAg
ICBAdHlwZSB7T2JqZWN0fQorICAgIEBkZWZhdWx0IHt9CisgICovCisgIHRlc3RIZWxwZXJzOiB7
fSwKIAotICBCZWZvcmUgdHJhbnNpdGlvbmluZyBpbnRvIGEgbmV3IHN0YXRlIHRoZSBleGlzdGlu
ZyBgY3VycmVudFN0YXRlYCB3aWxsIGhhdmUKLSAgaXRzIGBleGl0YCBtZXRob2QgY2FsbGVkIHdp
dGggdGhlIFN0YXRlTWFuYWdlciBpbnN0YW5jZSBhcyBpdHMgZmlyc3QgYXJndW1lbnQKLSAgYW5k
IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRyYW5zaXRpb24gYXMgaXRzIHNlY29uZCBhcmd1
bWVudC4KKyAgLyoqCisgICBUaGlzIHByb3BlcnR5IHdpbGwgY29udGFpbiB0aGUgb3JpZ2luYWwg
bWV0aG9kcyB0aGF0IHdlcmUgcmVnaXN0ZXJlZAorICAgb24gdGhlIGBoZWxwZXJDb250YWluZXJg
IGJlZm9yZSBgaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KIAotICBBZnRlciB0cmFuc2l0
aW9uaW5nIGludG8gYSBuZXcgc3RhdGUgdGhlIG5ldyBgY3VycmVudFN0YXRlYCB3aWxsIGhhdmUg
aXRzCi0gIGBlbnRlcmAgbWV0aG9kIGNhbGxlZCB3aXRoIHRoZSBTdGF0ZU1hbmFnZXIgaW5zdGFu
Y2UgYXMgaXRzIGZpcnN0IGFyZ3VtZW50Ci0gIGFuZCBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRo
ZSB0cmFuc2l0aW9uIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQuCisgICBXaGVuIGByZW1vdmVUZXN0
SGVscGVyc2AgaXMgY2FsbGVkLCB0aGVzZSBtZXRob2RzIGFyZSByZXN0b3JlZCB0byB0aGUKKyAg
IGBoZWxwZXJDb250YWluZXJgLgogCi0gIGBgYGphdmFzY3JpcHQKLSAgcm9ib3RNYW5hZ2VyID0g
RW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7Ci0gICAgaW5pdGlhbFN0YXRlOiAncG93ZXJlZERv
d24nLAotICAgIHBvd2VyZWREb3duOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgZXhpdDog
ZnVuY3Rpb24oc3RhdGVNYW5hZ2VyKXsKLSAgICAgICAgY29uc29sZS5sb2coImV4aXRpbmcgdGhl
IHBvd2VyZWREb3duIHN0YXRlIikKLSAgICAgIH0KLSAgICB9KSwKLSAgICBwb3dlcmVkVXA6IEVt
YmVyLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICBlbnRlcjogZnVuY3Rpb24oc3RhdGVNYW5hZ2VyKXsK
LSAgICAgICAgY29uc29sZS5sb2coImVudGVyaW5nIHRoZSBwb3dlcmVkVXAgc3RhdGUuIERlc3Ry
b3kgYWxsIGh1bWFucy4iKQotICAgICAgfQotICAgIH0pCi0gIH0pCisgICAgQHByb3BlcnR5IG9y
aWdpbmFsTWV0aG9kcworICAgIEB0eXBlIHtPYmplY3R9CisgICAgQGRlZmF1bHQge30KKyAgICBA
cHJpdmF0ZQorICAqLworICBvcmlnaW5hbE1ldGhvZHM6IHt9LAogCi0gIHJvYm90TWFuYWdlci5n
ZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgLy8gJ3Bvd2VyZWREb3duJwotICByb2JvdE1hbmFnZXIu
dHJhbnNpdGlvblRvKCdwb3dlcmVkVXAnKQogCi0gIC8vIHdpbGwgbG9nCi0gIC8vICdleGl0aW5n
IHRoZSBwb3dlcmVkRG93biBzdGF0ZScKLSAgLy8gJ2VudGVyaW5nIHRoZSBwb3dlcmVkVXAgc3Rh
dGUuIERlc3Ryb3kgYWxsIGh1bWFucy4nCi0gIGBgYAorICAvKioKKyAgVGhpcyBwcm9wZXJ0eSBp
bmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgaW4K
KyAgdGVzdGluZyBtb2RlLiBUaGlzIGlzIHNldCB3aGVuIGBzZXR1cEZvclRlc3RpbmdgIGlzIGNh
bGxlZCBvbiB0aGUgY3VycmVudAorICBhcHBsaWNhdGlvbi4KIAotICBPbmNlIGEgU3RhdGVNYW5h
Z2VyIGlzIGFscmVhZHkgaW4gYSBzdGF0ZSwgc3Vic2VxdWVudCBhdHRlbXB0cyB0byBlbnRlciB0
aGF0Ci0gIHN0YXRlIHdpbGwgbm90IHRyaWdnZXIgZW50ZXIgb3IgZXhpdCBtZXRob2QgY2FsbHMu
IEF0dGVtcHRzIHRvIHRyYW5zaXRpb24KLSAgaW50byBhIHN0YXRlIHRoYXQgdGhlIG1hbmFnZXIg
ZG9lcyBub3QgaGF2ZSB3aWxsIHJlc3VsdCBpbiBubyBjaGFuZ2VzIGluIHRoZQotICBTdGF0ZU1h
bmFnZXIncyBjdXJyZW50IHN0YXRlOgorICBAcHJvcGVydHkgdGVzdGluZworICBAdHlwZSB7Qm9v
bGVhbn0KKyAgQGRlZmF1bHQgZmFsc2UKKyAgKi8KKyAgdGVzdGluZzogZmFsc2UsCiAKLSAgYGBg
amF2YXNjcmlwdAotICByb2JvdE1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsK
LSAgICBpbml0aWFsU3RhdGU6ICdwb3dlcmVkRG93bicsCi0gICAgcG93ZXJlZERvd246IEVtYmVy
LlN0YXRlLmNyZWF0ZSh7Ci0gICAgICBleGl0OiBmdW5jdGlvbihzdGF0ZU1hbmFnZXIpewotICAg
ICAgICBjb25zb2xlLmxvZygiZXhpdGluZyB0aGUgcG93ZXJlZERvd24gc3RhdGUiKQotICAgICAg
fQotICAgIH0pLAotICAgIHBvd2VyZWRVcDogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgIGVu
dGVyOiBmdW5jdGlvbihzdGF0ZU1hbmFnZXIpewotICAgICAgICBjb25zb2xlLmxvZygiZW50ZXJp
bmcgdGhlIHBvd2VyZWRVcCBzdGF0ZS4gRGVzdHJveSBhbGwgaHVtYW5zLiIpCi0gICAgICB9Ci0g
ICAgfSkKLSAgfSkKKyAgLyoqCisgICBUaGlzIGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2Yg
dGhlIGFwcGxpY2F0aW9uLCBzbyB0aGF0IHlvdSBjYW4gc3RhcnQKKyAgIHRoZSBhcHAgd2hlbiB5
b3VyIHRlc3RzIGFyZSByZWFkeSB0byBydW4uIEl0IGFsc28gc2V0cyB0aGUgcm91dGVyJ3MKKyAg
IGxvY2F0aW9uIHRvICdub25lJywgc28gdGhhdCB0aGUgd2luZG93J3MgbG9jYXRpb24gd2lsbCBu
b3QgYmUgbW9kaWZpZWQKKyAgIChwcmV2ZW50aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9m
IHN0YXRlIGJldHdlZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQorICAgd2l0aCB5b3VyIHRlc3Rp
bmcgZnJhbWV3b3JrKS4KIAotICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScp
IC8vICdwb3dlcmVkRG93bicKLSAgcm9ib3RNYW5hZ2VyLnRyYW5zaXRpb25UbygncG93ZXJlZFVw
JykKLSAgLy8gd2lsbCBsb2cKLSAgLy8gJ2V4aXRpbmcgdGhlIHBvd2VyZWREb3duIHN0YXRlJwot
ICAvLyAnZW50ZXJpbmcgdGhlIHBvd2VyZWRVcCBzdGF0ZS4gRGVzdHJveSBhbGwgaHVtYW5zLicK
LSAgcm9ib3RNYW5hZ2VyLnRyYW5zaXRpb25UbygncG93ZXJlZFVwJykgLy8gbm8gbG9nZ2luZywg
bm8gc3RhdGUgY2hhbmdlCisgICBFeGFtcGxlOgogCi0gIHJvYm90TWFuYWdlci50cmFuc2l0aW9u
VG8oJ3NvbWVVbmtub3duU3RhdGUnKSAvLyBzaWxlbnRseSBmYWlscwotICByb2JvdE1hbmFnZXIu
Z2V0KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkVXAnCisgIGBgYAorICBBcHAuc2V0
dXBGb3JUZXN0aW5nKCk7CiAgIGBgYAogCi0gIEVhY2ggc3RhdGUgcHJvcGVydHkgbWF5IGl0c2Vs
ZiBjb250YWluIHByb3BlcnRpZXMgdGhhdCBhcmUgaW5zdGFuY2VzIG9mCi0gIGBFbWJlci5TdGF0
ZWAuIFRoZSBTdGF0ZU1hbmFnZXIgY2FuIHRyYW5zaXRpb24gdG8gc3BlY2lmaWMgc3ViLXN0YXRl
cyBpbiBhCi0gIHNlcmllcyBvZiB0cmFuc2l0aW9uVG8gbWV0aG9kIGNhbGxzIG9yIHZpYSBhIHNp
bmdsZSB0cmFuc2l0aW9uVG8gd2l0aCB0aGUKLSAgZnVsbCBwYXRoIHRvIHRoZSBzcGVjaWZpYyBz
dGF0ZS4gVGhlIFN0YXRlTWFuYWdlciB3aWxsIGFsc28ga2VlcCB0cmFjayBvZiB0aGUKLSAgZnVs
bCBwYXRoIHRvIGl0cyBjdXJyZW50U3RhdGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHJvYm90TWFu
YWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoewotICAgIGluaXRpYWxTdGF0ZTogJ3Bv
d2VyZWREb3duJywKLSAgICBwb3dlcmVkRG93bjogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAg
IGNoYXJnaW5nOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwKLSAgICAgIGNoYXJnZWQ6IEVtYmVyLlN0
YXRlLmNyZWF0ZSgpCi0gICAgfSksCi0gICAgcG93ZXJlZFVwOiBFbWJlci5TdGF0ZS5jcmVhdGUo
ewotICAgICAgbW9iaWxlOiBFbWJlci5TdGF0ZS5jcmVhdGUoKSwKLSAgICAgIHN0YXRpb25hcnk6
IEVtYmVyLlN0YXRlLmNyZWF0ZSgpCi0gICAgfSkKLSAgfSkKLQotICByb2JvdE1hbmFnZXIuZ2V0
KCdjdXJyZW50U3RhdGUubmFtZScpIC8vICdwb3dlcmVkRG93bicKLQotICByb2JvdE1hbmFnZXIu
dHJhbnNpdGlvblRvKCdwb3dlcmVkVXAnKQotICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3Rh
dGUubmFtZScpIC8vICdwb3dlcmVkVXAnCi0KLSAgcm9ib3RNYW5hZ2VyLnRyYW5zaXRpb25Ubygn
bW9iaWxlJykKLSAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnbW9i
aWxlJwotCi0gIC8vIHRyYW5zaXRpb24gdmlhIGEgc3RhdGUgcGF0aAotICByb2JvdE1hbmFnZXIu
dHJhbnNpdGlvblRvKCdwb3dlcmVkRG93bi5jaGFyZ2luZycpCi0gIHJvYm90TWFuYWdlci5nZXQo
J2N1cnJlbnRTdGF0ZS5uYW1lJykgLy8gJ2NoYXJnaW5nJworICAgIEBtZXRob2Qgc2V0dXBGb3JU
ZXN0aW5nCisgICovCisgIHNldHVwRm9yVGVzdGluZzogZnVuY3Rpb24oKSB7CisgICAgRW1iZXIu
dGVzdGluZyA9IHRydWU7CiAKLSAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLnBhdGgn
KSAvLyAncG93ZXJlZERvd24uY2hhcmdpbmcnCi0gIGBgYAorICAgIHRoaXMudGVzdGluZyA9IHRy
dWU7CiAKLSAgRW50ZXIgdHJhbnNpdGlvbiBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNo
IHN0YXRlIGFuZCBuZXN0ZWQgY2hpbGQgc3RhdGUKLSAgaW4gdGhlaXIgaGllcmFyY2hpY2FsIG9y
ZGVyLiBFeGl0IG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggc3RhdGUgYW5kCi0gIGl0
cyBuZXN0ZWQgc3RhdGVzIGluIHJldmVyc2UgaGllcmFyY2hpY2FsIG9yZGVyLgorICAgIHRoaXMu
Um91dGVyLnJlb3Blbih7CisgICAgICBsb2NhdGlvbjogJ25vbmUnCisgICAgfSk7CiAKLSAgRXhp
dCB0cmFuc2l0aW9ucyBmb3IgYSBwYXJlbnQgc3RhdGUgYXJlIG5vdCBjYWxsZWQgd2hlbiBlbnRl
cmluZyBpbnRvIG9uZSBvZgotICBpdHMgY2hpbGQgc3RhdGVzLCBvbmx5IHdoZW4gdHJhbnNpdGlv
bmluZyB0byBhIG5ldyBzZWN0aW9uIG9mIHBvc3NpYmxlIHN0YXRlcwotICBpbiB0aGUgaGllcmFy
Y2h5LgorICAgIC8vIGlmIGFkYXB0ZXIgaXMgbm90IG1hbnVhbGx5IHNldCBkZWZhdWx0IHRvIFFV
bml0CisgICAgaWYgKCFFbWJlci5UZXN0LmFkYXB0ZXIpIHsKKyAgICAgICBFbWJlci5UZXN0LmFk
YXB0ZXIgPSBFbWJlci5UZXN0LlFVbml0QWRhcHRlci5jcmVhdGUoKTsKKyAgICB9CiAKLSAgYGBg
amF2YXNjcmlwdAotICByb2JvdE1hbmFnZXIgPSBFbWJlci5TdGF0ZU1hbmFnZXIuY3JlYXRlKHsK
LSAgICBpbml0aWFsU3RhdGU6ICdwb3dlcmVkRG93bicsCi0gICAgcG93ZXJlZERvd246IEVtYmVy
LlN0YXRlLmNyZWF0ZSh7Ci0gICAgICBlbnRlcjogZnVuY3Rpb24oKXt9LAotICAgICAgZXhpdDog
ZnVuY3Rpb24oKXsKLSAgICAgICAgY29uc29sZS5sb2coImV4aXRlZCBwb3dlcmVkRG93biBzdGF0
ZSIpCi0gICAgICB9LAotICAgICAgY2hhcmdpbmc6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7Ci0gICAg
ICAgIGVudGVyOiBmdW5jdGlvbigpe30sCi0gICAgICAgIGV4aXQ6IGZ1bmN0aW9uKCl7fQotICAg
ICAgfSksCi0gICAgICBjaGFyZ2VkOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgICBlbnRl
cjogZnVuY3Rpb24oKXsKLSAgICAgICAgICBjb25zb2xlLmxvZygiZW50ZXJlZCBjaGFyZ2VkIHN0
YXRlIikKLSAgICAgICAgfSwKLSAgICAgICAgZXhpdDogZnVuY3Rpb24oKXsKLSAgICAgICAgICBj
b25zb2xlLmxvZygiZXhpdGVkIGNoYXJnZWQgc3RhdGUiKQotICAgICAgICB9Ci0gICAgICB9KQot
ICAgIH0pLAotICAgIHBvd2VyZWRVcDogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgIGVudGVy
OiBmdW5jdGlvbigpewotICAgICAgICBjb25zb2xlLmxvZygiZW50ZXJlZCBwb3dlcmVkVXAgc3Rh
dGUiKQogICAgICAgfSwKLSAgICAgIGV4aXQ6IGZ1bmN0aW9uKCl7fSwKLSAgICAgIG1vYmlsZTog
RW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKCl7Ci0gICAgICAg
ICAgY29uc29sZS5sb2coImVudGVyZWQgbW9iaWxlIHN0YXRlIikKLSAgICAgICAgfSwKLSAgICAg
ICAgZXhpdDogZnVuY3Rpb24oKXt9Ci0gICAgICB9KSwKLSAgICAgIHN0YXRpb25hcnk6IEVtYmVy
LlN0YXRlLmNyZWF0ZSh7Ci0gICAgICAgIGVudGVyOiBmdW5jdGlvbigpe30sCi0gICAgICAgIGV4
aXQ6IGZ1bmN0aW9uKCl7fQotICAgICAgfSkKLSAgICB9KQotICB9KQogCisgIC8qKgorICAgIFRo
aXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250YWluZXIgdG8gaW5qZWN0IHRoZSB0ZXN0IGhlbHBl
cnMgaW50by4gQnkKKyAgICBkZWZhdWx0IHRoZSBoZWxwZXJzIGFyZSBpbmplY3RlZCBpbnRvIGB3
aW5kb3dgLgogCi0gIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0ZS5wYXRoJykgLy8gJ3Bv
d2VyZWREb3duJwotICByb2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdjaGFyZ2VkJykKLSAgLy8g
bG9ncyAnZW50ZXJlZCBjaGFyZ2VkIHN0YXRlJwotICAvLyBidXQgZG9lcyAqbm90KiBsb2cgICdl
eGl0ZWQgcG93ZXJlZERvd24gc3RhdGUnCi0gIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0
ZS5uYW1lJykgLy8gJ2NoYXJnZWQKKyAgICBAcHJvcGVydHkgaGVscGVyQ29udGFpbmVyCisgICBA
dHlwZSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRlc3QgaGVscGVycy4KKyAg
IEBkZWZhdWx0IHdpbmRvdworICAqLworICBoZWxwZXJDb250YWluZXI6IHdpbmRvdywKIAotICBy
b2JvdE1hbmFnZXIudHJhbnNpdGlvblRvKCdwb3dlcmVkVXAubW9iaWxlJykKLSAgLy8gbG9ncwot
ICAvLyAnZXhpdGVkIGNoYXJnZWQgc3RhdGUnCi0gIC8vICdleGl0ZWQgcG93ZXJlZERvd24gc3Rh
dGUnCi0gIC8vICdlbnRlcmVkIHBvd2VyZWRVcCBzdGF0ZScKLSAgLy8gJ2VudGVyZWQgbW9iaWxl
IHN0YXRlJwotICBgYGAKKyAgLyoqCisgICAgVGhpcyBpbmplY3RzIHRoZSB0ZXN0IGhlbHBlcnMg
aW50byB0aGUgYGhlbHBlckNvbnRhaW5lcmAgb2JqZWN0LiBJZiBhbiBvYmplY3QgaXMgcHJvdmlk
ZWQKKyAgICBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGhlbHBlckNvbnRhaW5lci4gSWYgYGhlbHBl
ckNvbnRhaW5lcmAgaXMgbm90IHNldCBpdCB3aWxsIGRlZmF1bHQKKyAgICB0byBgd2luZG93YC4g
SWYgYSBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBp
dCB3aWxsIGJlIGNhY2hlZAorICAgIChzbyB0aGF0IGl0IGNhbiBiZSByZXNldCBpZiB0aGUgaGVs
cGVyIGlzIHJlbW92ZWQgd2l0aCBgdW5yZWdpc3RlckhlbHBlcmAgb3IKKyAgICBgcmVtb3ZlVGVz
dEhlbHBlcnNgKS4KIAotICBEdXJpbmcgZGV2ZWxvcG1lbnQgeW91IGNhbiBzZXQgYSBTdGF0ZU1h
bmFnZXIncyBgZW5hYmxlTG9nZ2luZ2AgcHJvcGVydHkgdG8KLSAgYHRydWVgIHRvIHJlY2VpdmUg
Y29uc29sZSBtZXNzYWdlcyBvZiBzdGF0ZSB0cmFuc2l0aW9ucy4KKyAgIEFueSBjYWxsYmFja3Mg
cmVnaXN0ZXJlZCB3aXRoIGBvbkluamVjdEhlbHBlcnNgIHdpbGwgYmUgY2FsbGVkIG9uY2UgdGhl
CisgICBoZWxwZXJzIGhhdmUgYmVlbiBpbmplY3RlZC4KIAotICBgYGBqYXZhc2NyaXB0Ci0gIHJv
Ym90TWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoewotICAgIGVuYWJsZUxvZ2dp
bmc6IHRydWUKLSAgfSkKKyAgRXhhbXBsZToKKyAgYGBgCisgIEFwcC5pbmplY3RUZXN0SGVscGVy
cygpOwogICBgYGAKIAotICAjIyBNYW5hZ2luZyBjdXJyZW50U3RhdGUgd2l0aCBBY3Rpb25zCi0K
LSAgVG8gY29udHJvbCB3aGljaCB0cmFuc2l0aW9ucyBhcmUgcG9zc2libGUgZm9yIGEgZ2l2ZW4g
c3RhdGUsIGFuZAotICBhcHByb3ByaWF0ZWx5IGhhbmRsZSBleHRlcm5hbCBldmVudHMsIHRoZSBT
dGF0ZU1hbmFnZXIgY2FuIHJlY2VpdmUgYW5kCi0gIHJvdXRlIGFjdGlvbiBtZXNzYWdlcyB0byBp
dHMgc3RhdGVzIHZpYSB0aGUgYHNlbmRgIG1ldGhvZC4gQ2FsbGluZyB0bwotICBgc2VuZGAgd2l0
aCBhbiBhY3Rpb24gbmFtZSB3aWxsIGJlZ2luIHNlYXJjaGluZyBmb3IgYSBtZXRob2Qgd2l0aCB0
aGUgc2FtZQotICBuYW1lIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHN0YXRlIGFuZCBtb3Zpbmcg
dXAgdGhyb3VnaCB0aGUgcGFyZW50IHN0YXRlcwotICBpbiBhIHN0YXRlIGhpZXJhcmNoeSB1bnRp
bCBhbiBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZm91bmQgb3IgdGhlIFN0YXRlTWFuYWdlcgotICBp
bnN0YW5jZSBpdHNlbGYgaXMgcmVhY2hlZC4KKyAgICBAbWV0aG9kIGluamVjdFRlc3RIZWxwZXJz
CisgICovCisgIGluamVjdFRlc3RIZWxwZXJzOiBmdW5jdGlvbihoZWxwZXJDb250YWluZXIpIHsK
KyAgICBpZiAoaGVscGVyQ29udGFpbmVyKSB7IHRoaXMuaGVscGVyQ29udGFpbmVyID0gaGVscGVy
Q29udGFpbmVyOyB9CiAKLSAgSWYgYW4gYXBwcm9wcmlhdGVseSBuYW1lZCBtZXRob2QgaXMgZm91
bmQgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RhdGUKLSAgbWFuYWdlciBhcyB0aGUgZmly
c3QgYXJndW1lbnQgYW5kIGFuIG9wdGlvbmFsIGBjb250ZXh0YCBvYmplY3QgYXMgdGhlIHNlY29u
ZAotICBhcmd1bWVudC4KKyAgICB0aGlzLnRlc3RIZWxwZXJzID0ge307CisgICAgZm9yICh2YXIg
bmFtZSBpbiBoZWxwZXJzKSB7CisgICAgICB0aGlzLm9yaWdpbmFsTWV0aG9kc1tuYW1lXSA9IHRo
aXMuaGVscGVyQ29udGFpbmVyW25hbWVdOworICAgICAgdGhpcy50ZXN0SGVscGVyc1tuYW1lXSA9
IHRoaXMuaGVscGVyQ29udGFpbmVyW25hbWVdID0gaGVscGVyKHRoaXMsIG5hbWUpOworICAgICAg
cHJvdG9XcmFwKEVtYmVyLlRlc3QuUHJvbWlzZS5wcm90b3R5cGUsIG5hbWUsIGhlbHBlcih0aGlz
LCBuYW1lKSwgaGVscGVyc1tuYW1lXS5tZXRhLndhaXQpOworICAgIH0KIAotICBgYGBqYXZhc2Ny
aXB0Ci0gIG1hbmFnZXJBID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7Ci0gICAgaW5pdGlh
bFN0YXRlOiAnc3RhdGVPbmUuc3Vic3RhdGVPbmUuc3Vic3Vic3RhdGVPbmUnLAotICAgIHN0YXRl
T25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgc3Vic3RhdGVPbmU6IEVtYmVyLlN0YXRl
LmNyZWF0ZSh7Ci0gICAgICAgIGFuQWN0aW9uOiBmdW5jdGlvbihtYW5hZ2VyLCBjb250ZXh0KXsK
LSAgICAgICAgICBjb25zb2xlLmxvZygiYW4gYWN0aW9uIHdhcyBjYWxsZWQiKQotICAgICAgICB9
LAotICAgICAgICBzdWJzdWJzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KQotICAgICAg
fSkKLSAgICB9KQotICB9KQorICAgIGZvcih2YXIgaSA9IDAsIGwgPSBpbmplY3RIZWxwZXJzQ2Fs
bGJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaW5qZWN0SGVscGVyc0NhbGxiYWNr
c1tpXSh0aGlzKTsKKyAgICB9CisgIH0sCiAKLSAgbWFuYWdlckEuZ2V0KCdjdXJyZW50U3RhdGUu
bmFtZScpIC8vICdzdWJzdWJzdGF0ZU9uZScKLSAgbWFuYWdlckEuc2VuZCgnYW5BY3Rpb24nKQot
ICAvLyAnc3RhdGVPbmUuc3Vic3RhdGVPbmUuc3Vic3Vic3RhdGVPbmUnIGhhcyBubyBhbkFjdGlv
biBtZXRob2QKLSAgLy8gc28gdGhlICdhbkFjdGlvbicgbWV0aG9kIG9mICdzdGF0ZU9uZS5zdWJz
dGF0ZU9uZScgaXMgY2FsbGVkCi0gIC8vIGFuZCBsb2dzICJhbiBhY3Rpb24gd2FzIGNhbGxlZCIK
LSAgLy8gd2l0aCBtYW5hZ2VyQSBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAgLy8gYW5kIG5vIHNl
Y29uZCBhcmd1bWVudAorICAvKioKKyAgICBUaGlzIHJlbW92ZXMgYWxsIGhlbHBlcnMgdGhhdCBo
YXZlIGJlZW4gcmVnaXN0ZXJlZCwgYW5kIHJlc2V0cyBhbmQgZnVuY3Rpb25zCisgICAgdGhhdCB3
ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBlcnMuCiAKLSAgc29tZU9iamVjdCA9IHt9Ci0gIG1h
bmFnZXJBLnNlbmQoJ2FuQWN0aW9uJywgc29tZU9iamVjdCkKLSAgLy8gdGhlICdhbkFjdGlvbicg
bWV0aG9kIG9mICdzdGF0ZU9uZS5zdWJzdGF0ZU9uZScgaXMgY2FsbGVkIGFnYWluCi0gIC8vIHdp
dGggbWFuYWdlckEgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZAotICAvLyBzb21lT2JqZWN0IGFz
IHRoZSBzZWNvbmQgYXJndW1lbnQuCi0gIGBgYAorICAgIEV4YW1wbGU6CiAKLSAgSWYgdGhlIFN0
YXRlTWFuYWdlciBhdHRlbXB0cyB0byBzZW5kIGFuIGFjdGlvbiBidXQgZG9lcyBub3QgZmluZCBh
biBhcHByb3ByaWF0ZWx5IG5hbWVkCi0gIG1ldGhvZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvciB3
aGlsZSBtb3ZpbmcgdXB3YXJkcyB0aHJvdWdoIHRoZSBzdGF0ZSBoaWVyYXJjaHksIGl0IHdpbGwK
LSAgcmVwZWF0IHRoZSBwcm9jZXNzIGxvb2tpbmcgZm9yIGEgYHVuaGFuZGxlZEV2ZW50YCBtZXRo
b2QuIElmIGFuIGB1bmhhbmRsZWRFdmVudGAgbWV0aG9kIGlzCi0gIGZvdW5kLCBpdCB3aWxsIGJl
IGNhbGxlZCB3aXRoIHRoZSBvcmlnaW5hbCBldmVudCBuYW1lIGFzIHRoZSBzZWNvbmQgYXJndW1l
bnQuIElmIGFuCi0gIGB1bmhhbmRsZWRFdmVudGAgbWV0aG9kIGlzIG5vdCBmb3VuZCwgdGhlIFN0
YXRlTWFuYWdlciB3aWxsIHRocm93IGEgbmV3IEVtYmVyLkVycm9yLgorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICBBcHAucmVtb3ZlVGVzdEhlbHBlcnMoKTsKKyAgICBgYGAKIAotICBgYGBqYXZhc2Ny
aXB0Ci0gIG1hbmFnZXJCID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7Ci0gICAgaW5pdGlh
bFN0YXRlOiAnc3RhdGVPbmUuc3Vic3RhdGVPbmUuc3Vic3Vic3RhdGVPbmUnLAotICAgIHN0YXRl
T25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgc3Vic3RhdGVPbmU6IEVtYmVyLlN0YXRl
LmNyZWF0ZSh7Ci0gICAgICAgIHN1YnN1YnN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoe30p
LAotICAgICAgICB1bmhhbmRsZWRFdmVudDogZnVuY3Rpb24obWFuYWdlciwgZXZlbnROYW1lLCBj
b250ZXh0KSB7Ci0gICAgICAgICAgY29uc29sZS5sb2coImdvdCBhbiB1bmhhbmRsZWRFdmVudCB3
aXRoIG5hbWUgIiArIGV2ZW50TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pCi0gICAgfSkKLSAg
fSkKKyAgICBAcHVibGljCisgICAgQG1ldGhvZCByZW1vdmVUZXN0SGVscGVycworICAqLworICBy
ZW1vdmVUZXN0SGVscGVyczogZnVuY3Rpb24oKSB7CisgICAgZm9yICh2YXIgbmFtZSBpbiBoZWxw
ZXJzKSB7CisgICAgICB0aGlzLmhlbHBlckNvbnRhaW5lcltuYW1lXSA9IHRoaXMub3JpZ2luYWxN
ZXRob2RzW25hbWVdOworICAgICAgZGVsZXRlIHRoaXMudGVzdEhlbHBlcnNbbmFtZV07CisgICAg
ICBkZWxldGUgdGhpcy5vcmlnaW5hbE1ldGhvZHNbbmFtZV07CisgICAgfQorICB9Cit9KTsKIAot
ICBtYW5hZ2VyQi5nZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgLy8gJ3N1YnN1YnN0YXRlT25lJwot
ICBtYW5hZ2VyQi5zZW5kKCdhbkFjdGlvbicpCi0gIC8vIG5laXRoZXIgYHN0YXRlT25lLnN1YnN0
YXRlT25lLnN1YnN1YnN0YXRlT25lYCBub3IgYW55IG9mIGl0J3MKLSAgLy8gcGFyZW50IHN0YXRl
cyBoYXZlIGEgaGFuZGxlciBmb3IgYGFuQWN0aW9uYC4gYHN1YnN1YnN0YXRlT25lYAotICAvLyBh
bHNvIGRvZXMgbm90IGhhdmUgYSBgdW5oYW5kbGVkRXZlbnRgIG1ldGhvZCwgYnV0IGl0cyBwYXJl
bnQKLSAgLy8gc3RhdGUsIGBzdWJzdGF0ZU9uZWAsIGRvZXMsIGFuZCBpdCBnZXRzIGZpcmVkLiBJ
dCB3aWxsIGxvZwotICAvLyAiZ290IGFuIHVuaGFuZGxlZEV2ZW50IHdpdGggbmFtZSBhbkFjdGlv
biIKLSAgYGBgCisvLyBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgbmVlZGVkCisvLyBCdXQgc3Rp
bGwgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKy8vIG9mIGhlbHBlciBjaGFpbmlu
ZworZnVuY3Rpb24gcHJvdG9XcmFwKHByb3RvLCBuYW1lLCBjYWxsYmFjaywgaXNBc3luYykgewor
ICBwcm90b1tuYW1lXSA9IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwor
ICAgIGlmIChpc0FzeW5jKSB7CisgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJn
cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICAgIH0pOworICAg
IH0KKyAgfTsKK30KIAotICBBY3Rpb24gZGV0ZWN0aW9uIG9ubHkgbW92ZXMgdXB3YXJkcyB0aHJv
dWdoIHRoZSBzdGF0ZSBoaWVyYXJjaHkgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS4KLSAgSXQgZG9l
cyBub3Qgc2VhcmNoIGluIG90aGVyIHBvcnRpb25zIG9mIHRoZSBoaWVyYXJjaHkuCitFbWJlci5U
ZXN0LlByb21pc2UgPSBmdW5jdGlvbigpIHsKKyAgRW1iZXIuUlNWUC5Qcm9taXNlLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgIEVtYmVyLlRlc3QubGFzdFByb21pc2UgPSB0aGlzOworfTsKIAot
ICBgYGBqYXZhc2NyaXB0Ci0gIG1hbmFnZXJDID0gRW1iZXIuU3RhdGVNYW5hZ2VyLmNyZWF0ZSh7
Ci0gICAgaW5pdGlhbFN0YXRlOiAnc3RhdGVPbmUuc3Vic3RhdGVPbmUuc3Vic3Vic3RhdGVPbmUn
LAotICAgIHN0YXRlT25lOiBFbWJlci5TdGF0ZS5jcmVhdGUoewotICAgICAgc3Vic3RhdGVPbmU6
IEVtYmVyLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICAgIHN1YnN1YnN0YXRlT25lOiBFbWJlci5TdGF0
ZS5jcmVhdGUoe30pCi0gICAgICB9KQotICAgIH0pLAotICAgIHN0YXRlVHdvOiBFbWJlci5TdGF0
ZS5jcmVhdGUoewotICAgICBhbkFjdGlvbjogZnVuY3Rpb24obWFuYWdlciwgY29udGV4dCl7Ci0g
ICAgICAgLy8gd2lsbCBub3QgYmUgY2FsbGVkIGJlbG93IGJlY2F1c2UgaXQgaXMKLSAgICAgICAv
LyBub3QgYSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgc3RhdGUKLSAgICAgfQotICAgIH0pCi0gIH0p
CitFbWJlci5UZXN0LlByb21pc2UucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVtYmVyLlJTVlAu
UHJvbWlzZS5wcm90b3R5cGUpOworRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IEVtYmVyLlRlc3QuUHJvbWlzZTsKIAotICBtYW5hZ2VyQy5nZXQoJ2N1cnJlbnRTdGF0
ZS5uYW1lJykgLy8gJ3N1YnN1YnN0YXRlT25lJwotICBtYW5hZ2VyQy5zZW5kKCdhbkFjdGlvbicp
Ci0gIC8vIEVycm9yOiA8RW1iZXIuU3RhdGVNYW5hZ2VyOmVtYmVyMTMyPiBjb3VsZCBub3QKLSAg
Ly8gcmVzcG9uZCB0byBldmVudCBhbkFjdGlvbiBpbiBzdGF0ZSBzdGF0ZU9uZS5zdWJzdGF0ZU9u
ZS5zdWJzdWJzdGF0ZU9uZS4KLSAgYGBgCisvLyBQYXRjaCBgdGhlbmAgdG8gaXNvbGF0ZSBhc3lu
YyBtZXRob2RzCisvLyBzcGVjaWZpY2FsbHkgYEVtYmVyLlRlc3QubGFzdFByb21pc2VgCit2YXIg
b3JpZ2luYWxUaGVuID0gRW1iZXIuUlNWUC5Qcm9taXNlLnByb3RvdHlwZS50aGVuOworRW1iZXIu
VGVzdC5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24ob25TdWNjZXNzLCBvbkZhaWx1
cmUpIHsKKyAgcmV0dXJuIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbCkgewor
ICAgIHJldHVybiBpc29sYXRlKG9uU3VjY2VzcywgdmFsKTsKKyAgfSwgb25GYWlsdXJlKTsKK307
CiAKLSAgSW5zaWRlIG9mIGFuIGFjdGlvbiBtZXRob2QgdGhlIGdpdmVuIHN0YXRlIHNob3VsZCBk
ZWxlZ2F0ZSBgdHJhbnNpdGlvblRvYCBjYWxscyBvbiBpdHMKLSAgU3RhdGVNYW5hZ2VyLgorLy8g
VGhpcyBtZXRob2QgaXNvbGF0ZXMgbmVzdGVkIGFzeW5jIG1ldGhvZHMKKy8vIHNvIHRoYXQgdGhl
eSBkb24ndCBjb25mbGljdCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCisvLworLy8gMS4gU2V0
IGBFbWJlci5UZXN0Lmxhc3RQcm9taXNlYCB0byBudWxsCisvLyAyLiBJbnZva2UgbWV0aG9kCisv
LyAzLiBSZXR1cm4gdGhlIGxhc3QgcHJvbWlzZSBjcmVhdGVkIGR1cmluZyBtZXRob2QKKy8vIDQu
IFJlc3RvcmUgYEVtYmVyLlRlc3QubGFzdFByb21pc2VgIHRvIG9yaWdpbmFsIHZhbHVlCitmdW5j
dGlvbiBpc29sYXRlKGZuLCB2YWwpIHsKKyAgdmFyIHZhbHVlLCBsYXN0UHJvbWlzZTsKIAotICBg
YGBqYXZhc2NyaXB0Ci0gIHJvYm90TWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUo
ewotICAgIGluaXRpYWxTdGF0ZTogJ3Bvd2VyZWREb3duLmNoYXJnaW5nJywKLSAgICBwb3dlcmVk
RG93bjogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgIGNoYXJnaW5nOiBFbWJlci5TdGF0ZS5j
cmVhdGUoewotICAgICAgICBjaGFyZ2VDb21wbGV0ZTogZnVuY3Rpb24obWFuYWdlciwgY29udGV4
dCl7Ci0gICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2NoYXJnZWQnKQotICAgICAgICB9
Ci0gICAgICB9KSwKLSAgICAgIGNoYXJnZWQ6IEVtYmVyLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICAg
IGJvb3Q6IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpewotICAgICAgICAgIG1hbmFnZXIudHJh
bnNpdGlvblRvKCdwb3dlcmVkVXAnKQotICAgICAgICB9Ci0gICAgICB9KQotICAgIH0pLAotICAg
IHBvd2VyZWRVcDogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgIGJlZ2luRXh0ZXJtaW5hdGlv
bjogZnVuY3Rpb24obWFuYWdlciwgY29udGV4dCl7Ci0gICAgICAgIG1hbmFnZXIudHJhbnNpdGlv
blRvKCdyYW1wYWdpbmcnKQotICAgICAgfSwKLSAgICAgIHJhbXBhZ2luZzogRW1iZXIuU3RhdGUu
Y3JlYXRlKCkKLSAgICB9KQotICB9KQorICAvLyBSZXNldCBsYXN0UHJvbWlzZSBmb3IgbmVzdGVk
IGhlbHBlcnMKKyAgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7CiAKLSAgcm9ib3RNYW5h
Z2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUnKSAvLyAnY2hhcmdpbmcnCi0gIHJvYm90TWFuYWdl
ci5zZW5kKCdib290JykgLy8gdGhyb3dzIGVycm9yLCBubyBib290IGFjdGlvbgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIGluIGN1cnJlbnQgaGllcmFyY2h5Ci0gIHJvYm90TWFuYWdl
ci5nZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgLy8gcmVtYWlucyAnY2hhcmdpbmcnCisgIHZhbHVl
ID0gZm4uY2FsbChudWxsLCB2YWwpOwogCi0gIHJvYm90TWFuYWdlci5zZW5kKCdiZWdpbkV4dGVy
bWluYXRpb24nKSAvLyB0aHJvd3MgZXJyb3IsIG5vIGJlZ2luRXh0ZXJtaW5hdGlvbgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aW9uIGluIGN1cnJlbnQg
aGllcmFyY2h5Ci0gIHJvYm90TWFuYWdlci5nZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgICAvLyBy
ZW1haW5zICdjaGFyZ2luZycKKyAgbGFzdFByb21pc2UgPSBFbWJlci5UZXN0Lmxhc3RQcm9taXNl
OwogCi0gIHJvYm90TWFuYWdlci5zZW5kKCdjaGFyZ2VDb21wbGV0ZScpCi0gIHJvYm90TWFuYWdl
ci5nZXQoJ2N1cnJlbnRTdGF0ZS5uYW1lJykgICAvLyAnY2hhcmdlZCcKKyAgLy8gSWYgdGhlIG1l
dGhvZCByZXR1cm5lZCBhIHByb21pc2UKKyAgLy8gcmV0dXJuIHRoYXQgcHJvbWlzZS4gSWYgbm90
LAorICAvLyByZXR1cm4gdGhlIGxhc3QgYXN5bmMgaGVscGVyJ3MgcHJvbWlzZQorICBpZiAoKHZh
bHVlICYmICh2YWx1ZSBpbnN0YW5jZW9mIEVtYmVyLlRlc3QuUHJvbWlzZSkpIHx8ICFsYXN0UHJv
bWlzZSkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBydW4oZnVuY3Rpb24o
KSB7CisgICAgICBsYXN0UHJvbWlzZSA9IEVtYmVyLlRlc3QucmVzb2x2ZShsYXN0UHJvbWlzZSku
dGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfSk7CisgICAg
fSk7CisgICAgcmV0dXJuIGxhc3RQcm9taXNlOworICB9Cit9CiAKLSAgcm9ib3RNYW5hZ2VyLnNl
bmQoJ2Jvb3QnKQotICByb2JvdE1hbmFnZXIuZ2V0KCdjdXJyZW50U3RhdGUubmFtZScpICAgLy8g
J3Bvd2VyZWRVcCcKK30pKCk7CiAKLSAgcm9ib3RNYW5hZ2VyLnNlbmQoJ2JlZ2luRXh0ZXJtaW5h
dGlvbicsIGFsbEh1bWFucykKLSAgcm9ib3RNYW5hZ2VyLmdldCgnY3VycmVudFN0YXRlLm5hbWUn
KSAgIC8vICdyYW1wYWdpbmcnCi0gIGBgYAogCi0gIFRyYW5zaXRpb24gYWN0aW9ucyBjYW4gYWxz
byBiZSBjcmVhdGVkIHVzaW5nIHRoZSBgdHJhbnNpdGlvblRvYCBtZXRob2Qgb2YgdGhlIGBFbWJl
ci5TdGF0ZWAgY2xhc3MuIFRoZQotICBmb2xsb3dpbmcgZXhhbXBsZSBTdGF0ZU1hbmFnZXJzIGFy
ZSBlcXVpdmFsZW50OgogCi0gIGBgYGphdmFzY3JpcHQKLSAgYU1hbmFnZXIgPSBFbWJlci5TdGF0
ZU1hbmFnZXIuY3JlYXRlKHsKLSAgICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAg
ICAgIGNoYW5nZVRvU3RhdGVUd286IEVtYmVyLlN0YXRlLnRyYW5zaXRpb25Ubygnc3RhdGVUd28n
KQotICAgIH0pLAotICAgIHN0YXRlVHdvOiBFbWJlci5TdGF0ZS5jcmVhdGUoe30pCi0gIH0pCiso
ZnVuY3Rpb24oKSB7CitFbWJlci5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24o
QXBwbGljYXRpb24pIHsKKyAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgIG5hbWU6ICdk
ZWZlclJlYWRpbmVzcyBpbiBgdGVzdGluZ2AgbW9kZScsCiAKLSAgYk1hbmFnZXIgPSBFbWJlci5T
dGF0ZU1hbmFnZXIuY3JlYXRlKHsKLSAgICBzdGF0ZU9uZTogRW1iZXIuU3RhdGUuY3JlYXRlKHsK
LSAgICAgIGNoYW5nZVRvU3RhdGVUd286IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpewotICAg
ICAgICBtYW5hZ2VyLnRyYW5zaXRpb25Ubygnc3RhdGVUd28nLCBjb250ZXh0KQorICAgIGluaXRp
YWxpemU6IGZ1bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24peworICAgICAgaWYgKGFwcGxp
Y2F0aW9uLnRlc3RpbmcpIHsKKyAgICAgICAgYXBwbGljYXRpb24uZGVmZXJSZWFkaW5lc3MoKTsK
ICAgICAgIH0KLSAgICB9KSwKLSAgICBzdGF0ZVR3bzogRW1iZXIuU3RhdGUuY3JlYXRlKHt9KQot
ICB9KQotICBgYGAKKyAgICB9CisgIH0pOwogCi0gIEBjbGFzcyBTdGF0ZU1hbmFnZXIKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5TdGF0ZQotKiovCi1FbWJlci5TdGF0ZU1h
bmFnZXIgPSBFbWJlci5TdGF0ZS5leHRlbmQoewotICAvKioKLSAgICBAcHJpdmF0ZQorICB9KTsK
IAotICAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgc3RhdGVtYW5hZ2VyLCBsb29rIGZvciBhIGRlZmF1
bHQgc3RhdGUgdG8gdHJhbnNpdGlvbgotICAgIGludG8uIFRoaXMgc3RhdGUgY2FuIGVpdGhlciBi
ZSBuYW1lZCBgc3RhcnRgLCBvciBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZQotICAgIGBpbml0
aWFsU3RhdGVgIHByb3BlcnR5LgorfSkoKTsKIAotICAgIEBtZXRob2QgaW5pdAotICAqLwotICBp
bml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwogCi0gICAgc2V0KHRoaXMsICdz
dGF0ZU1ldGEnLCBFbWJlci5NYXAuY3JlYXRlKCkpOwogCi0gICAgdmFyIGluaXRpYWxTdGF0ZSA9
IGdldCh0aGlzLCAnaW5pdGlhbFN0YXRlJyk7CisoZnVuY3Rpb24oKSB7CisvKioKKyAgQG1vZHVs
ZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAqLwogCi0gICAgaWYgKCFpbml0
aWFsU3RhdGUgJiYgZ2V0KHRoaXMsICdzdGF0ZXMuc3RhcnQnKSkgewotICAgICAgaW5pdGlhbFN0
YXRlID0gJ3N0YXJ0JzsKLSAgICB9Cit2YXIgJCA9IEVtYmVyLiQ7CiAKLSAgICBpZiAoaW5pdGlh
bFN0YXRlKSB7Ci0gICAgICB0aGlzLnRyYW5zaXRpb25Ubyhpbml0aWFsU3RhdGUpOwotICAgICAg
RW1iZXIuYXNzZXJ0KCdGYWlsZWQgdG8gdHJhbnNpdGlvbiB0byBpbml0aWFsIHN0YXRlICInICsg
aW5pdGlhbFN0YXRlICsgJyInLCAhIWdldCh0aGlzLCAnY3VycmVudFN0YXRlJykpOwotICAgIH0K
LSAgfSwKKy8qKgorICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3ggYW5kIHRyaWdnZXJz
IHRoZSBjbGljayBldmVudCB0byBmaXJlIHRoZQorICBwYXNzZWQgaW4gaGFuZGxlci4gSXQgaXMg
dXNlZCB0byBjb3JyZWN0IGZvciBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucworICBvZiBqUXVlcnkg
KGUuZyAxLjguMykuCiAKLSAgc3RhdGVNZXRhRm9yOiBmdW5jdGlvbihzdGF0ZSkgewotICAgIHZh
ciBtZXRhID0gZ2V0KHRoaXMsICdzdGF0ZU1ldGEnKSwKLSAgICAgICAgc3RhdGVNZXRhID0gbWV0
YS5nZXQoc3RhdGUpOworICBAcHJpdmF0ZQorICBAbWV0aG9kIHRlc3RDaGVja2JveENsaWNrCisq
LworZnVuY3Rpb24gdGVzdENoZWNrYm94Q2xpY2soaGFuZGxlcikgeworICAkKCc8aW5wdXQgdHlw
ZT0iY2hlY2tib3giPicpCisgICAgLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBsZWZ0OiAn
LTEwMDBweCcsIHRvcDogJy0xMDAwcHgnIH0pCisgICAgLmFwcGVuZFRvKCdib2R5JykKKyAgICAu
b24oJ2NsaWNrJywgaGFuZGxlcikKKyAgICAudHJpZ2dlcignY2xpY2snKQorICAgIC5yZW1vdmUo
KTsKK30KIAotICAgIGlmICghc3RhdGVNZXRhKSB7Ci0gICAgICBzdGF0ZU1ldGEgPSB7fTsKLSAg
ICAgIG1ldGEuc2V0KHN0YXRlLCBzdGF0ZU1ldGEpOworJChmdW5jdGlvbigpIHsKKyAgLyoKKyAg
ICBEZXRlcm1pbmUgd2hldGhlciBhIGNoZWNrYm94IGNoZWNrZWQgdXNpbmcgalF1ZXJ5J3MgImNs
aWNrIiBtZXRob2Qgd2lsbCBoYXZlCisgICAgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGl0cyBjaGVj
a2VkIHByb3BlcnR5LgorCisgICAgSWYgd2UgZGV0ZXJtaW5lIHRoYXQgdGhlIGN1cnJlbnQgalF1
ZXJ5IHZlcnNpb24gZXhoaWJpdHMgdGhpcyBiZWhhdmlvciwKKyAgICBwYXRjaCBpdCB0byB3b3Jr
IGNvcnJlY3RseSBhcyBpbiB0aGUgY29tbWl0IGZvciB0aGUgYWN0dWFsIGZpeDoKKyAgICBodHRw
czovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9jb21taXQvMWZiMmY5Mi4KKyAgKi8KKyAgdGVz
dENoZWNrYm94Q2xpY2soZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgISQu
ZXZlbnQuc3BlY2lhbC5jbGljaykgeworICAgICAgJC5ldmVudC5zcGVjaWFsLmNsaWNrID0gewor
ICAgICAgICAvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3Rh
dGUgd2lsbCBiZSByaWdodAorICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKKyAgICAgICAg
ICBpZiAoJC5ub2RlTmFtZSggdGhpcywgImlucHV0IiApICYmIHRoaXMudHlwZSA9PT0gImNoZWNr
Ym94IiAmJiB0aGlzLmNsaWNrKSB7CisgICAgICAgICAgICB0aGlzLmNsaWNrKCk7CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OwogICAg
IH0KKyAgfSk7CiAKLSAgICByZXR1cm4gc3RhdGVNZXRhOwotICB9LAorICAvLyBUcnkgYWdhaW4g
dG8gdmVyaWZ5IHRoYXQgdGhlIHBhdGNoIHRvb2sgZWZmZWN0IG9yIGJsb3cgdXAuCisgIHRlc3RD
aGVja2JveENsaWNrKGZ1bmN0aW9uKCkgeworICAgIEVtYmVyLndhcm4oImNsaWNrZWQgY2hlY2ti
b3hlcyBzaG91bGQgYmUgY2hlY2tlZCEgdGhlIGpRdWVyeSBwYXRjaCBkaWRuJ3Qgd29yayIsIHRo
aXMuY2hlY2tlZCk7CisgIH0pOworfSk7CiAKLSAgc2V0U3RhdGVNZXRhOiBmdW5jdGlvbihzdGF0
ZSwga2V5LCB2YWx1ZSkgewotICAgIHJldHVybiBzZXQodGhpcy5zdGF0ZU1ldGFGb3Ioc3RhdGUp
LCBrZXksIHZhbHVlKTsKLSAgfSwKK30pKCk7CiAKLSAgZ2V0U3RhdGVNZXRhOiBmdW5jdGlvbihz
dGF0ZSwga2V5KSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLnN0YXRlTWV0YUZvcihzdGF0ZSksIGtl
eSk7Ci0gIH0sCiAKLSAgLyoqCi0gICAgVGhlIGN1cnJlbnQgc3RhdGUgZnJvbSBhbW9uZyB0aGUg
bWFuYWdlcidzIHBvc3NpYmxlIHN0YXRlcy4gVGhpcyBwcm9wZXJ0eSBzaG91bGQKLSAgICBub3Qg
YmUgc2V0IGRpcmVjdGx5LiBVc2UgYHRyYW5zaXRpb25Ub2AgdG8gbW92ZSBiZXR3ZWVuIHN0YXRl
cyBieSBuYW1lLgogCi0gICAgQHByb3BlcnR5IGN1cnJlbnRTdGF0ZQotICAgIEB0eXBlIEVtYmVy
LlN0YXRlCi0gICovCi0gIGN1cnJlbnRTdGF0ZTogbnVsbCwKKyhmdW5jdGlvbigpIHsKKy8qKgor
IEBtb2R1bGUgZW1iZXIKKyBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyovCisKK3ZhciBUZXN0
ID0gRW1iZXIuVGVzdDsKKworLyoqCisgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFz
cyBpcyB0byBjcmVhdGUgaG9va3MgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQKKyAgYnkgYW4gYWRh
cHRlciBmb3IgdmFyaW91cyB0ZXN0IGZyYW1ld29ya3MuCiAKKyAgQGNsYXNzIEFkYXB0ZXIKKyAg
QG5hbWVzcGFjZSBFbWJlci5UZXN0CisqLworVGVzdC5BZGFwdGVyID0gRW1iZXIuT2JqZWN0LmV4
dGVuZCh7CiAgIC8qKgotICAgVGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgc3RhdGUuIFJldHVybnMg
YSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQKLSAgIHN0YXRlLgorICAgIFRo
aXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5bmMgb3BlcmF0aW9uIGlz
IGFib3V0IHRvIHN0YXJ0LgorCisgICAgT3ZlcnJpZGUgdGhpcyB0byBjYWxsIHlvdXIgZnJhbWV3
b3JrJ3MgbWV0aG9kcyB0aGF0IGhhbmRsZSBhc3luYworICAgIG9wZXJhdGlvbnMuCiAKLSAgIEBw
cm9wZXJ0eSBjdXJyZW50UGF0aAotICAgQHR5cGUgU3RyaW5nCisgICAgQHB1YmxpYworICAgIEBt
ZXRob2QgYXN5bmNTdGFydAogICAqLwotICBjdXJyZW50UGF0aDogRW1iZXIuY29tcHV0ZWQuYWxp
YXMoJ2N1cnJlbnRTdGF0ZS5wYXRoJyksCisgIGFzeW5jU3RhcnQ6IEVtYmVyLkssCiAKICAgLyoq
Ci0gICAgVGhlIG5hbWUgb2YgdHJhbnNpdGlvbkV2ZW50IHRoYXQgdGhpcyBzdGF0ZU1hbmFnZXIg
d2lsbCBkaXNwYXRjaAorICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIg
YW4gYXN5bmMgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAKLSAgICBAcHJvcGVydHkgdHJhbnNp
dGlvbkV2ZW50Ci0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgJ3NldHVwJworICAgIEBw
dWJsaWMKKyAgICBAbWV0aG9kIGFzeW5jRW5kCiAgICovCi0gIHRyYW5zaXRpb25FdmVudDogJ3Nl
dHVwJywKKyAgYXN5bmNFbmQ6IEVtYmVyLkssCiAKICAgLyoqCi0gICAgSWYgc2V0IHRvIHRydWUs
IGBlcnJvck9uVW5oYW5kbGVkRXZlbnRzYCB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZQot
ICAgIHJhaXNlZCBpZiB5b3UgYXR0ZW1wdCB0byBzZW5kIGFuIGV2ZW50IHRvIGEgc3RhdGUgbWFu
YWdlciB0aGF0IGlzIG5vdAotICAgIGhhbmRsZWQgYnkgdGhlIGN1cnJlbnQgc3RhdGUgb3IgYW55
IG9mIGl0cyBwYXJlbnQgc3RhdGVzLgorICAgIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggeW91
ciB0ZXN0aW5nIGZyYW1ld29yaydzIGZhbHNlIGFzc2VydGlvbi4KKyAgICBUaGlzIGZ1bmN0aW9u
IGlzIGNhbGxlZCB3aGVuZXZlciBhbiBleGNlcHRpb24gb2NjdXJzIGNhdXNpbmcgdGhlIHRlc3Rp
bmcKKyAgICBwcm9taXNlIHRvIGZhaWwuCiAKLSAgICBAcHJvcGVydHkgZXJyb3JPblVuaGFuZGxl
ZEV2ZW50cwotICAgIEB0eXBlIEJvb2xlYW4KLSAgICBAZGVmYXVsdCB0cnVlCisgICAgUVVuaXQg
ZXhhbXBsZToKKworICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIGV4Y2VwdGlvbjogZnVuY3Rpb24o
ZXJyb3IpIHsKKyAgICAgICAgb2soZmFsc2UsIGVycm9yKTsKKyAgICAgIH07CisgICAgYGBgCisK
KyAgICBAcHVibGljCisgICAgQG1ldGhvZCBleGNlcHRpb24KKyAgICBAcGFyYW0ge1N0cmluZ30g
ZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCiAgICovCi0gIGVycm9yT25VbmhhbmRs
ZWRFdmVudDogdHJ1ZSwKKyAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikgeworICAgIHRocm93
IGVycm9yOworICB9Cit9KTsKIAotICBzZW5kOiBmdW5jdGlvbihldmVudCkgewotICAgIHZhciBj
b250ZXh0cyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBFbWJlci5hc3NlcnQo
J0Nhbm5vdCBzZW5kIGV2ZW50ICInICsgZXZlbnQgKyAnIiB3aGlsZSBjdXJyZW50U3RhdGUgaXMg
JyArIGdldCh0aGlzLCAnY3VycmVudFN0YXRlJyksIGdldCh0aGlzLCAnY3VycmVudFN0YXRlJykp
OwotICAgIHJldHVybiBzZW5kRXZlbnQuY2FsbCh0aGlzLCBldmVudCwgY29udGV4dHMsIGZhbHNl
KTsKKy8qKgorICBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG1ldGhvZHMgZGVmaW5lZCBieSBF
bWJlci5UZXN0LkFkYXB0ZXIgZm9yIHRoZQorICBRVW5pdCB0ZXN0aW5nIGZyYW1ld29yay4KKwor
ICBAY2xhc3MgUVVuaXRBZGFwdGVyCisgIEBuYW1lc3BhY2UgRW1iZXIuVGVzdAorICBAZXh0ZW5k
cyBFbWJlci5UZXN0LkFkYXB0ZXIKKyovCitUZXN0LlFVbml0QWRhcHRlciA9IFRlc3QuQWRhcHRl
ci5leHRlbmQoeworICBhc3luY1N0YXJ0OiBmdW5jdGlvbigpIHsKKyAgICBzdG9wKCk7CiAgIH0s
Ci0gIHVuaGFuZGxlZEV2ZW50OiBmdW5jdGlvbihtYW5hZ2VyLCBldmVudCkgewotICAgIGlmIChn
ZXQodGhpcywgJ2Vycm9yT25VbmhhbmRsZWRFdmVudCcpKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IodGhpcy50b1N0cmluZygpICsgIiBjb3VsZCBub3QgcmVzcG9uZCB0byBldmVudCAi
ICsgZXZlbnQgKyAiIGluIHN0YXRlICIgKyBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZS5wYXRoJykg
KyAiLiIpOwotICAgIH0KKyAgYXN5bmNFbmQ6IGZ1bmN0aW9uKCkgeworICAgIHN0YXJ0KCk7CiAg
IH0sCisgIGV4Y2VwdGlvbjogZnVuY3Rpb24oZXJyb3IpIHsKKyAgICBvayhmYWxzZSwgRW1iZXIu
aW5zcGVjdChlcnJvcikpOworICB9Cit9KTsKIAotICAvKioKLSAgICBGaW5kcyBhIHN0YXRlIGJ5
IGl0cyBzdGF0ZSBwYXRoLgorfSkoKTsKIAotICAgIEV4YW1wbGU6CiAKLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgbWFuYWdlciA9IEVtYmVyLlN0YXRlTWFuYWdlci5jcmVhdGUoewotICAgICAgcm9v
dDogRW1iZXIuU3RhdGUuY3JlYXRlKHsKLSAgICAgICAgZGFzaGJvYXJkOiBFbWJlci5TdGF0ZS5j
cmVhdGUoKQotICAgICAgfSkKLSAgICB9KTsKIAotICAgIG1hbmFnZXIuZ2V0U3RhdGVCeVBhdGgo
bWFuYWdlciwgInJvb3QuZGFzaGJvYXJkIikKKyhmdW5jdGlvbigpIHsKKy8qKgorKiBAbW9kdWxl
IGVtYmVyCisqIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworKi8KIAotICAgIC8vIHJldHVybnMg
dGhlIGRhc2hib2FyZCBzdGF0ZQotICAgIGBgYAordmFyIGdldCA9IEVtYmVyLmdldCwKKyAgICBU
ZXN0ID0gRW1iZXIuVGVzdCwKKyAgICBoZWxwZXIgPSBUZXN0LnJlZ2lzdGVySGVscGVyLAorICAg
IGFzeW5jSGVscGVyID0gVGVzdC5yZWdpc3RlckFzeW5jSGVscGVyLAorICAgIGNvdW50QXN5bmMg
PSAwOwogCi0gICAgQG1ldGhvZCBnZXRTdGF0ZUJ5UGF0aAotICAgIEBwYXJhbSB7RW1iZXIuU3Rh
dGV9IHJvb3QgdGhlIHN0YXRlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tCi0gICAgQHBhcmFtIHtT
dHJpbmd9IHBhdGggdGhlIHN0YXRlIHBhdGggdG8gZm9sbG93Ci0gICAgQHJldHVybiB7RW1iZXIu
U3RhdGV9IHRoZSBzdGF0ZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoCi0gICovCi0gIGdldFN0YXRl
QnlQYXRoOiBmdW5jdGlvbihyb290LCBwYXRoKSB7Ci0gICAgdmFyIHBhcnRzID0gcGF0aC5zcGxp
dCgnLicpLAotICAgICAgICBzdGF0ZSA9IHJvb3Q7CitUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMg
PSAwOwogCi0gICAgZm9yICh2YXIgaT0wLCBsZW49cGFydHMubGVuZ3RoOyBpPGxlbjsgaSsrKSB7
Ci0gICAgICBzdGF0ZSA9IGdldChnZXQoc3RhdGUsICdzdGF0ZXMnKSwgcGFydHNbaV0pOwotICAg
ICAgaWYgKCFzdGF0ZSkgeyBicmVhazsgfQotICAgIH0KK1Rlc3Qub25JbmplY3RIZWxwZXJzKGZ1
bmN0aW9uKCkgeworICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rpb24oKSB7Cisg
ICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzKys7CisgIH0pOwogCi0gICAgcmV0dXJuIHN0YXRl
OwotICB9LAorICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RvcChmdW5jdGlvbigpIHsKKyAgICBF
bWJlci5hc3NlcnQoIkFuIGFqYXhTdG9wIGV2ZW50IHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBudW1i
ZXIgb2YgcGVuZGluZyBBSkFYICIgKworICAgICAgICAgICAgICAgICAicmVxdWVzdHMgdG8gYmUg
bmVnYXRpdmUgaGFzIGJlZW4gdHJpZ2dlcmVkLiBUaGlzIGlzIG1vc3QgbGlrZWx5ICIgKworICAg
ICAgICAgICAgICAgICAiY2F1c2VkIGJ5IEFKQVggZXZlbnRzIHRoYXQgd2VyZSBzdGFydGVkIGJl
Zm9yZSBjYWxsaW5nICIgKworICAgICAgICAgICAgICAgICAiYGluamVjdFRlc3RIZWxwZXJzKClg
LiIsIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cyAhPT0gMCk7CisgICAgVGVzdC5wZW5kaW5nQWph
eFJlcXVlc3RzLS07CisgIH0pOworfSk7CiAKLSAgZmluZFN0YXRlQnlQYXRoOiBmdW5jdGlvbihz
dGF0ZSwgcGF0aCkgewotICAgIHZhciBwb3NzaWJsZTsKK2Z1bmN0aW9uIGN1cnJlbnRSb3V0ZU5h
bWUoYXBwKXsKKyAgdmFyIGFwcENvbnRyb2xsZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAo
J2NvbnRyb2xsZXI6YXBwbGljYXRpb24nKTsKIAotICAgIHdoaWxlICghcG9zc2libGUgJiYgc3Rh
dGUpIHsKLSAgICAgIHBvc3NpYmxlID0gdGhpcy5nZXRTdGF0ZUJ5UGF0aChzdGF0ZSwgcGF0aCk7
Ci0gICAgICBzdGF0ZSA9IGdldChzdGF0ZSwgJ3BhcmVudFN0YXRlJyk7Ci0gICAgfQorICByZXR1
cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdjdXJyZW50Um91dGVOYW1lJyk7Cit9CiAKLSAgICByZXR1
cm4gcG9zc2libGU7Ci0gIH0sCitmdW5jdGlvbiBjdXJyZW50UGF0aChhcHApeworICB2YXIgYXBw
Q29udHJvbGxlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1cCgnY29udHJvbGxlcjphcHBsaWNh
dGlvbicpOwogCi0gIC8qKgotICAgIEEgc3RhdGUgc3RvcmVzIGl0cyBjaGlsZCBzdGF0ZXMgaW4g
aXRzIGBzdGF0ZXNgIGhhc2guCi0gICAgVGhpcyBjb2RlIHRha2VzIGEgcGF0aCBsaWtlIGBwb3N0
cy5zaG93YCBhbmQgbG9va3MKLSAgICB1cCBgcm9vdC5zdGF0ZXMucG9zdHMuc3RhdGVzLnNob3dg
LgorICByZXR1cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdjdXJyZW50UGF0aCcpOworfQogCi0gICAg
SXQgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBzdGF0ZXMgZnJvbSB0aGUKLSAgICByb290
LCB3aGljaCBpcyB0aGUgbGlzdCBvZiBzdGF0ZXMgdG8gY2FsbCBgZW50ZXJgCi0gICAgb24uCitm
dW5jdGlvbiBjdXJyZW50VVJMKGFwcCl7CisgIHZhciByb3V0ZXIgPSBhcHAuX19jb250YWluZXJf
Xy5sb29rdXAoJ3JvdXRlcjptYWluJyk7CiAKLSAgICBAbWV0aG9kIGdldFN0YXRlc0luUGF0aAot
ICAgIEBwYXJhbSByb290Ci0gICAgQHBhcmFtIHBhdGgKLSAgKi8KLSAgZ2V0U3RhdGVzSW5QYXRo
OiBmdW5jdGlvbihyb290LCBwYXRoKSB7Ci0gICAgaWYgKCFwYXRoIHx8IHBhdGggPT09ICIiKSB7
IHJldHVybiB1bmRlZmluZWQ7IH0KLSAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyksCi0g
ICAgICAgIHJlc3VsdCA9IFtdLAotICAgICAgICBzdGF0ZXMsCi0gICAgICAgIHN0YXRlOworICBy
ZXR1cm4gZ2V0KHJvdXRlciwgJ2xvY2F0aW9uJykuZ2V0VVJMKCk7Cit9CisKK2Z1bmN0aW9uIHZp
c2l0KGFwcCwgdXJsKSB7CisgIEVtYmVyLnJ1bihhcHAsICdhZHZhbmNlUmVhZGluZXNzJyk7CiAK
LSAgICBmb3IgKHZhciBpPTAsIGxlbj1wYXJ0cy5sZW5ndGg7IGk8bGVuOyBpKyspIHsKLSAgICAg
IHN0YXRlcyA9IGdldChyb290LCAnc3RhdGVzJyk7Ci0gICAgICBpZiAoIXN0YXRlcykgeyByZXR1
cm4gdW5kZWZpbmVkOyB9Ci0gICAgICBzdGF0ZSA9IGdldChzdGF0ZXMsIHBhcnRzW2ldKTsKLSAg
ICAgIGlmIChzdGF0ZSkgeyByb290ID0gc3RhdGU7IHJlc3VsdC5wdXNoKHN0YXRlKTsgfQotICAg
ICAgZWxzZSB7IHJldHVybiB1bmRlZmluZWQ7IH0KKyAgYXBwLl9fY29udGFpbmVyX18ubG9va3Vw
KCdyb3V0ZXI6bWFpbicpLmxvY2F0aW9uLnNldFVSTCh1cmwpOworICBFbWJlci5ydW4oYXBwLCBh
cHAuaGFuZGxlVVJMLCB1cmwpOworICByZXR1cm4gd2FpdChhcHApOworfQorCitmdW5jdGlvbiBj
bGljayhhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7CisgIHZhciAkZWwgPSBmaW5kV2l0aEFzc2Vy
dChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKKyAgRW1iZXIucnVuKCRlbCwgJ21vdXNlZG93bicp
OworCisgIGlmICgkZWwuaXMoJzppbnB1dCcpKSB7CisgICAgdmFyIHR5cGUgPSAkZWwucHJvcCgn
dHlwZScpOworICAgIGlmICh0eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdyYWRpbycg
JiYgdHlwZSAhPT0gJ2hpZGRlbicpIHsKKyAgICAgIEVtYmVyLnJ1bigkZWwsIGZ1bmN0aW9uKCl7
CisgICAgICAgIC8vIEZpcmVmb3ggZG9lcyBub3QgdHJpZ2dlciB0aGUgYGZvY3VzaW5gIGV2ZW50
IGlmIHRoZSB3aW5kb3cKKyAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSBmb2N1cy4gSWYgdGhlIGRv
Y3VtZW50IGRvZXNuJ3QgaGF2ZSBmb2N1cyBqdXN0CisgICAgICAgIC8vIHVzZSB0cmlnZ2VyKCdm
b2N1c2luJykgaW5zdGVhZC4KKyAgICAgICAgaWYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1
bWVudC5oYXNGb2N1cygpKSB7CisgICAgICAgICAgdGhpcy5mb2N1cygpOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIHRoaXMudHJpZ2dlcignZm9jdXNpbicpOworICAgICAgICB9CisgICAg
ICB9KTsKICAgICB9CisgIH0KIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCisgIEVtYmVyLnJ1
bigkZWwsICdtb3VzZXVwJyk7CisgIEVtYmVyLnJ1bigkZWwsICdjbGljaycpOwogCi0gIGdvVG9T
dGF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgLy8gbm90IGRlcHJlY2F0aW5nIHRoaXMgeWV0IHNvIHBl
b3BsZSBkb24ndCBjb25zdGFudGx5IG5lZWQgdG8KLSAgICAvLyBtYWtlIHRyaXZpYWwgY2hhbmdl
cyBmb3IgbGl0dGxlIHJlYXNvbi4KLSAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8uYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKLSAgfSwKKyAgcmV0dXJuIHdhaXQoYXBwKTsKK30KIAotICB0cmFu
c2l0aW9uVG86IGZ1bmN0aW9uKHBhdGgsIGNvbnRleHQpIHsKLSAgICAvLyBYWFggV2hlbiBpcyB0
cmFuc2l0aW9uVG8gY2FsbGVkIHdpdGggbm8gcGF0aAotICAgIGlmIChFbWJlci5pc0VtcHR5KHBh
dGgpKSB7IHJldHVybjsgfQorZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGFwcCwgc2VsZWN0b3IsIGNv
bnRleHQsIGV2ZW50KXsKKyAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICd1bmRlZmluZWQnKSB7Cisg
ICAgZXZlbnQgPSBjb250ZXh0OworICAgIGNvbnRleHQgPSBudWxsOworICB9CiAKLSAgICAvLyBU
aGUgRVM2IHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGBwYXRoLCAuLi5jb250ZXh0c2AK
LSAgICB2YXIgY29udGV4dHMgPSBjb250ZXh0ID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKSA6IFtdLAotICAgICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywgJ2N1
cnJlbnRTdGF0ZScpIHx8IHRoaXM7CisgIHZhciAkZWwgPSBmaW5kV2l0aEFzc2VydChhcHAsIHNl
bGVjdG9yLCBjb250ZXh0KTsKIAotICAgIC8vIEZpcnN0LCBnZXQgdGhlIGVudGVyLCBleGl0IGFu
ZCByZXNvbHZlIHN0YXRlcyBmb3IgdGhlIGN1cnJlbnQgc3RhdGUKLSAgICAvLyBhbmQgc3BlY2lm
aWVkIHBhdGguIElmIHBvc3NpYmxlLCB1c2UgYW4gZXhpc3RpbmcgY2FjaGUuCi0gICAgdmFyIGhh
c2ggPSB0aGlzLmNvbnRleHRGcmVlVHJhbnNpdGlvbihjdXJyZW50U3RhdGUsIHBhdGgpOworICBF
bWJlci5ydW4oJGVsLCAndHJpZ2dlcicsIGV2ZW50KTsKIAotICAgIC8vIE5leHQsIHByb2Nlc3Mg
dGhlIHJhdyBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbnRleHRzIHBhc3NlZCBpbi4KLSAg
ICB2YXIgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uKGhhc2gpLm5vcm1hbGl6ZSh0aGlzLCBj
b250ZXh0cyk7CisgIHJldHVybiB3YWl0KGFwcCk7Cit9CiAKLSAgICB0aGlzLmVudGVyU3RhdGUo
dHJhbnNpdGlvbik7Ci0gICAgdGhpcy50cmlnZ2VyU2V0dXBDb250ZXh0KHRyYW5zaXRpb24pOwot
ICB9LAorZnVuY3Rpb24ga2V5RXZlbnQoYXBwLCBzZWxlY3RvciwgY29udGV4dCwgdHlwZSwga2V5
Q29kZSkgeworICB2YXIgJGVsOworICBpZiAodHlwZW9mIGtleUNvZGUgPT09ICd1bmRlZmluZWQn
KSB7CisgICAga2V5Q29kZSA9IHR5cGU7CisgICAgdHlwZSA9IGNvbnRleHQ7CisgICAgY29udGV4
dCA9IG51bGw7CisgIH0KKyAgJGVsID0gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3RvciwgY29u
dGV4dCk7CisgIHZhciBldmVudCA9IEVtYmVyLiQuRXZlbnQodHlwZSwgeyBrZXlDb2RlOiBrZXlD
b2RlIH0pOworICBFbWJlci5ydW4oJGVsLCAndHJpZ2dlcicsIGV2ZW50KTsKKyAgcmV0dXJuIHdh
aXQoYXBwKTsKK30KIAotICBjb250ZXh0RnJlZVRyYW5zaXRpb246IGZ1bmN0aW9uKGN1cnJlbnRT
dGF0ZSwgcGF0aCkgewotICAgIHZhciBjYWNoZSA9IGN1cnJlbnRTdGF0ZS5wYXRoc0NhY2hlW3Bh
dGhdOwotICAgIGlmIChjYWNoZSkgeyByZXR1cm4gY2FjaGU7IH0KK2Z1bmN0aW9uIGZpbGxJbihh
cHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0ZXh0KSB7CisgIHZhciAkZWw7CisgIGlmICh0eXBlb2Yg
dGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICB0ZXh0ID0gY29udGV4dDsKKyAgICBjb250ZXh0
ID0gbnVsbDsKKyAgfQorICAkZWwgPSBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250
ZXh0KTsKKyAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgeworICAgICRlbC52YWwodGV4dCkuY2hhbmdl
KCk7CisgIH0pOworICByZXR1cm4gd2FpdChhcHApOworfQogCi0gICAgdmFyIGVudGVyU3RhdGVz
ID0gdGhpcy5nZXRTdGF0ZXNJblBhdGgoY3VycmVudFN0YXRlLCBwYXRoKSwKLSAgICAgICAgZXhp
dFN0YXRlcyA9IFtdLAotICAgICAgICByZXNvbHZlU3RhdGUgPSBjdXJyZW50U3RhdGU7CitmdW5j
dGlvbiBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7CisgIHZhciAkZWwg
PSBmaW5kKGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpOworICBpZiAoJGVsLmxlbmd0aCA9PT0gMCkg
eworICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiRWxlbWVudCAiICsgc2VsZWN0b3IgKyAiIG5v
dCBmb3VuZC4iKTsKKyAgfQorICByZXR1cm4gJGVsOworfQogCi0gICAgLy8gV2FsayB1cCB0aGUg
c3RhdGVzLiBGb3IgZWFjaCBzdGF0ZSwgY2hlY2sgd2hldGhlciBhIHN0YXRlIG1hdGNoaW5nCi0g
ICAgLy8gdGhlIGBwYXRoYCBpcyBuZXN0ZWQgdW5kZXJuZWF0aC4gVGhpcyB3aWxsIGZpbmQgdGhl
IGNsb3Nlc3QKLSAgICAvLyBwYXJlbnQgc3RhdGUgY29udGFpbmluZyBgcGF0aGAuCi0gICAgLy8K
LSAgICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBwYXNzIGluIGEgcmVsYXRpdmUgcGF0aC4g
Rm9yIGV4YW1wbGUsIGZvcgotICAgIC8vIHRoZSBmb2xsb3dpbmcgc3RhdGUgaGllcmFyY2h5Ogot
ICAgIC8vCi0gICAgLy8gICAgfCB8cm9vdAotICAgIC8vICAgIHwgfC0gcG9zdHMKLSAgICAvLyAg
ICB8IHwgfC0gc2hvdyAoKiBjdXJyZW50KQotICAgIC8vICAgIHwgfC0gY29tbWVudHMKLSAgICAv
LyAgICB8IHwgfC0gc2hvdwotICAgIC8vCi0gICAgLy8gSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMg
YDxyb290LnBvc3RzLnNob3c+YCwgYW4gYXR0ZW1wdCB0bwotICAgIC8vIHRyYW5zaXRpb24gdG8g
YGNvbW1lbnRzLnNob3dgIHdpbGwgbWF0Y2ggYDxyb290LmNvbW1lbnRzLnNob3c+YC4KLSAgICAv
LwotICAgIC8vIEZpcnN0LCB0aGlzIGNvZGUgd2lsbCBsb29rIGZvciByb290LnBvc3RzLnNob3cu
Y29tbWVudHMuc2hvdy4KLSAgICAvLyBOZXh0LCBpdCB3aWxsIGxvb2sgZm9yIHJvb3QucG9zdHMu
Y29tbWVudHMuc2hvdy4gRmluYWxseSwKLSAgICAvLyBpdCB3aWxsIGxvb2sgZm9yIGByb290LmNv
bW1lbnRzLnNob3dgLCBhbmQgZmluZCB0aGUgc3RhdGUuCi0gICAgLy8KLSAgICAvLyBBZnRlciB0
aGlzIHByb2Nlc3MsIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHdpbGwgZXhpc3Q6Ci0gICAgLy8K
LSAgICAvLyAqIHJlc29sdmVTdGF0ZTogYSBjb21tb24gcGFyZW50IHN0YXRlIGJldHdlZW4gdGhl
IGN1cnJlbnQKLSAgICAvLyAgIGFuZCB0YXJnZXQgc3RhdGUuIEluIHRoZSBhYm92ZSBleGFtcGxl
LCBgPHJvb3Q+YCBpcyB0aGUKLSAgICAvLyAgIGByZXNvbHZlU3RhdGVgLgotICAgIC8vICogZW50
ZXJTdGF0ZXM6IGEgbGlzdCBvZiBhbGwgb2YgdGhlIHN0YXRlcyByZXByZXNlbnRlZAotICAgIC8v
ICAgYnkgdGhlIHBhdGggZnJvbSB0aGUgYHJlc29sdmVTdGF0ZWAuIEZvciBleGFtcGxlLCBmb3IK
LSAgICAvLyAgIHRoZSBwYXRoIGByb290LmNvbW1lbnRzLnNob3dgLCBgZW50ZXJTdGF0ZXNgIHdv
dWxkIGhhdmUKLSAgICAvLyAgIGBbPHJvb3QuY29tbWVudHM+LCA8cm9vdC5jb21tZW50cy5zaG93
Pl1gCi0gICAgLy8gKiBleGl0U3RhdGVzOiBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBzdGF0ZXMgZnJv
bSB0aGUKLSAgICAvLyAgIGByZXNvbHZlU3RhdGVgIHRvIHRoZSBgY3VycmVudFN0YXRlYC4gSW4g
dGhlIGFib3ZlCi0gICAgLy8gICBleGFtcGxlLCBgZXhpdFN0YXRlc2Agd291bGQgaGF2ZQotICAg
IC8vICAgYFs8cm9vdC5wb3N0cz5gLCBgPHJvb3QucG9zdHMuc2hvdz5dYC4KLSAgICB3aGlsZSAo
cmVzb2x2ZVN0YXRlICYmICFlbnRlclN0YXRlcykgewotICAgICAgZXhpdFN0YXRlcy51bnNoaWZ0
KHJlc29sdmVTdGF0ZSk7Ci0KLSAgICAgIHJlc29sdmVTdGF0ZSA9IGdldChyZXNvbHZlU3RhdGUs
ICdwYXJlbnRTdGF0ZScpOwotICAgICAgaWYgKCFyZXNvbHZlU3RhdGUpIHsKLSAgICAgICAgZW50
ZXJTdGF0ZXMgPSB0aGlzLmdldFN0YXRlc0luUGF0aCh0aGlzLCBwYXRoKTsKLSAgICAgICAgaWYg
KCFlbnRlclN0YXRlcykgewotICAgICAgICAgIEVtYmVyLmFzc2VydCgnQ291bGQgbm90IGZpbmQg
c3RhdGUgZm9yIHBhdGg6ICInK3BhdGgrJyInKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KK2Z1bmN0aW9uIGZpbmQoYXBwLCBzZWxlY3RvciwgY29udGV4dCkgeworICB2YXIgJGVsOwor
ICBjb250ZXh0ID0gY29udGV4dCB8fCBnZXQoYXBwLCAncm9vdEVsZW1lbnQnKTsKKyAgJGVsID0g
YXBwLiQoc2VsZWN0b3IsIGNvbnRleHQpOworCisgIHJldHVybiAkZWw7Cit9CisKK2Z1bmN0aW9u
IGFuZFRoZW4oYXBwLCBjYWxsYmFjaykgeworICByZXR1cm4gd2FpdChhcHAsIGNhbGxiYWNrKGFw
cCkpOworfQorCitmdW5jdGlvbiB3YWl0KGFwcCwgdmFsdWUpIHsKKyAgcmV0dXJuIFRlc3QucHJv
bWlzZShmdW5jdGlvbihyZXNvbHZlKSB7CisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXN5
bmMgcHJvbWlzZSwga2ljayBvZmYgdGhlIGFzeW5jIHRlc3QKKyAgICBpZiAoKytjb3VudEFzeW5j
ID09PSAxKSB7CisgICAgICBUZXN0LmFkYXB0ZXIuYXN5bmNTdGFydCgpOworICAgIH0KKworICAg
IC8vIEV2ZXJ5IDEwbXMsIHBvbGwgZm9yIHRoZSBhc3luYyB0aGluZyB0byBoYXZlIGZpbmlzaGVk
CisgICAgdmFyIHdhdGNoZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgIC8vIDEu
IElmIHRoZSByb3V0ZXIgaXMgbG9hZGluZywga2VlcCBwb2xsaW5nCisgICAgICB2YXIgcm91dGVy
SXNMb2FkaW5nID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6bWFpbicpLnJvdXRl
ci5pc0xvYWRpbmc7CisgICAgICBpZiAocm91dGVySXNMb2FkaW5nKSB7IHJldHVybjsgfQorCisg
ICAgICAvLyAyLiBJZiB0aGVyZSBhcmUgcGVuZGluZyBBamF4IHJlcXVlc3RzLCBrZWVwIHBvbGxp
bmcKKyAgICAgIGlmIChUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMpIHsgcmV0dXJuOyB9CisKKyAg
ICAgIC8vIDMuIElmIHRoZXJlIGFyZSBzY2hlZHVsZWQgdGltZXJzIG9yIHdlIGFyZSBpbnNpZGUg
b2YgYSBydW4gbG9vcCwga2VlcCBwb2xsaW5nCisgICAgICBpZiAoRW1iZXIucnVuLmhhc1NjaGVk
dWxlZFRpbWVycygpIHx8IEVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCkgeyByZXR1cm47IH0KKyAg
ICAgIGlmIChUZXN0LndhaXRlcnMgJiYgVGVzdC53YWl0ZXJzLmFueShmdW5jdGlvbih3YWl0ZXIp
IHsKKyAgICAgICAgdmFyIGNvbnRleHQgPSB3YWl0ZXJbMF07CisgICAgICAgIHZhciBjYWxsYmFj
ayA9IHdhaXRlclsxXTsKKyAgICAgICAgcmV0dXJuICFjYWxsYmFjay5jYWxsKGNvbnRleHQpOwor
ICAgICAgfSkpIHsgcmV0dXJuOyB9CisgICAgICAvLyBTdG9wIHBvbGxpbmcKKyAgICAgIGNsZWFy
SW50ZXJ2YWwod2F0Y2hlcik7CisKKyAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgYXN5bmMg
cHJvbWlzZSwgZW5kIHRoZSBhc3luYyB0ZXN0CisgICAgICBpZiAoLS1jb3VudEFzeW5jID09PSAw
KSB7CisgICAgICAgIFRlc3QuYWRhcHRlci5hc3luY0VuZCgpOwogICAgICAgfQotICAgICAgZW50
ZXJTdGF0ZXMgPSB0aGlzLmdldFN0YXRlc0luUGF0aChyZXNvbHZlU3RhdGUsIHBhdGgpOwotICAg
IH0KIAotICAgIC8vIElmIHRoZSBwYXRoIGNvbnRhaW5zIHNvbWUgc3RhdGVzIHRoYXQgYXJlIHBh
cmVudHMgb2YgYm90aCB0aGUKLSAgICAvLyBjdXJyZW50IHN0YXRlIGFuZCB0aGUgdGFyZ2V0IHN0
YXRlLCByZW1vdmUgdGhlbS4KLSAgICAvLwotICAgIC8vIEZvciBleGFtcGxlLCBpbiB0aGUgZm9s
bG93aW5nIGhpZXJhcmNoeToKLSAgICAvLwotICAgIC8vIHwtIHJvb3QKLSAgICAvLyB8IHwtIHBv
c3QKLSAgICAvLyB8IHwgfC0gaW5kZXggKCogY3VycmVudCkKLSAgICAvLyB8IHwgfC0gc2hvdwot
ICAgIC8vCi0gICAgLy8gSWYgdGhlIGBwYXRoYCBpcyBgcm9vdC5wb3N0LnNob3dgLCB0aGUgdGhy
ZWUgdmFyaWFibGVzIHdpbGwKLSAgICAvLyBiZToKLSAgICAvLwotICAgIC8vICogcmVzb2x2ZVN0
YXRlOiBgPHN0YXRlIG1hbmFnZXI+YAotICAgIC8vICogZW50ZXJTdGF0ZXM6IGBbPHJvb3Q+LCA8
cm9vdC5wb3N0PiwgPHJvb3QucG9zdC5zaG93Pl1gCi0gICAgLy8gKiBleGl0U3RhdGVzOiBgWzxy
b290PiwgPHJvb3QucG9zdD4sIDxyb290LnBvc3QuaW5kZXg+XWAKLSAgICAvLwotICAgIC8vIFRo
ZSBnb2FsIG9mIHRoaXMgY29kZSBpcyB0byByZW1vdmUgdGhlIGNvbW1vbiBzdGF0ZXMsIHNvIHdl
Ci0gICAgLy8gaGF2ZToKLSAgICAvLwotICAgIC8vICogcmVzb2x2ZVN0YXRlOiBgPHJvb3QucG9z
dD5gCi0gICAgLy8gKiBlbnRlclN0YXRlczogYFs8cm9vdC5wb3N0LnNob3c+XWAKLSAgICAvLyAq
IGV4aXRTdGF0ZXM6IGBbPHJvb3QucG9zdC5pbmRleD5dYAotICAgIC8vCi0gICAgLy8gVGhpcyBh
dm9pZCB1bm5lY2Vzc2FyeSBjYWxscyB0byB0aGUgZW50ZXIgYW5kIGV4aXQgdHJhbnNpdGlvbnMu
Ci0gICAgd2hpbGUgKGVudGVyU3RhdGVzLmxlbmd0aCA+IDAgJiYgZW50ZXJTdGF0ZXNbMF0gPT09
IGV4aXRTdGF0ZXNbMF0pIHsKLSAgICAgIHJlc29sdmVTdGF0ZSA9IGVudGVyU3RhdGVzLnNoaWZ0
KCk7Ci0gICAgICBleGl0U3RhdGVzLnNoaWZ0KCk7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGUgdGhl
IGVudGVyU3RhdGVzLCBleGl0U3RhdGVzLCBhbmQgcmVzb2x2ZVN0YXRlIGZvciB0aGUKLSAgICAv
LyBjdXJyZW50IHN0YXRlIGFuZCB0aGUgYHBhdGhgLgotICAgIHZhciB0cmFuc2l0aW9ucyA9IGN1
cnJlbnRTdGF0ZS5wYXRoc0NhY2hlW3BhdGhdID0gewotICAgICAgZXhpdFN0YXRlczogZXhpdFN0
YXRlcywKLSAgICAgIGVudGVyU3RhdGVzOiBlbnRlclN0YXRlcywKLSAgICAgIHJlc29sdmVTdGF0
ZTogcmVzb2x2ZVN0YXRlCi0gICAgfTsKKyAgICAgIC8vIFN5bmNocm9ub3VzbHkgcmVzb2x2ZSB0
aGUgcHJvbWlzZQorICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIHZhbHVlKTsKKyAgICB9
LCAxMCk7CisgIH0pOwogCi0gICAgcmV0dXJuIHRyYW5zaXRpb25zOwotICB9LAorfQogCi0gIHRy
aWdnZXJTZXR1cENvbnRleHQ6IGZ1bmN0aW9uKHRyYW5zaXRpb25zKSB7Ci0gICAgdmFyIGNvbnRl
eHRzID0gdHJhbnNpdGlvbnMuY29udGV4dHMsCi0gICAgICAgIG9mZnNldCA9IHRyYW5zaXRpb25z
LmVudGVyU3RhdGVzLmxlbmd0aCAtIGNvbnRleHRzLmxlbmd0aCwKLSAgICAgICAgZW50ZXJTdGF0
ZXMgPSB0cmFuc2l0aW9ucy5lbnRlclN0YXRlcywKLSAgICAgICAgdHJhbnNpdGlvbkV2ZW50ID0g
Z2V0KHRoaXMsICd0cmFuc2l0aW9uRXZlbnQnKTsKIAotICAgIEVtYmVyLmFzc2VydCgiTW9yZSBj
b250ZXh0cyBwcm92aWRlZCB0aGFuIHN0YXRlcyIsIG9mZnNldCA+PSAwKTsKKy8qKgorKiBMb2Fk
cyBhIHJvdXRlLCBzZXRzIHVwIGFueSBjb250cm9sbGVycywgYW5kIHJlbmRlcnMgYW55IHRlbXBs
YXRlcyBhc3NvY2lhdGVkCisqIHdpdGggdGhlIHJvdXRlIGFzIHRob3VnaCBhIHJlYWwgdXNlciBo
YWQgdHJpZ2dlcmVkIHRoZSByb3V0ZSBjaGFuZ2Ugd2hpbGUKKyogdXNpbmcgeW91ciBhcHAuCisq
CisqIEV4YW1wbGU6CisqCisqIGBgYGphdmFzY3JpcHQKKyogdmlzaXQoJ3Bvc3RzL2luZGV4Jyku
dGhlbihmdW5jdGlvbigpIHsKKyogICAvLyBhc3NlcnQgc29tZXRoaW5nCisqIH0pOworKiBgYGAK
KyoKKyogQG1ldGhvZCB2aXNpdAorKiBAcGFyYW0ge1N0cmluZ30gdXJsIHRoZSBuYW1lIG9mIHRo
ZSByb3V0ZQorKiBAcmV0dXJuIHtSU1ZQLlByb21pc2V9CisqLworYXN5bmNIZWxwZXIoJ3Zpc2l0
JywgdmlzaXQpOworCisvKioKKyogQ2xpY2tzIGFuIGVsZW1lbnQgYW5kIHRyaWdnZXJzIGFueSBh
Y3Rpb25zIHRyaWdnZXJlZCBieSB0aGUgZWxlbWVudCdzIGBjbGlja2AKKyogZXZlbnQuCisqCisq
IEV4YW1wbGU6CisqCisqIGBgYGphdmFzY3JpcHQKKyogY2xpY2soJy5zb21lLWpRdWVyeS1zZWxl
Y3RvcicpLnRoZW4oZnVuY3Rpb24oKSB7CisqICAvLyBhc3NlcnQgc29tZXRoaW5nCisqIH0pOwor
KiBgYGAKKyoKKyogQG1ldGhvZCBjbGljaworKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgalF1
ZXJ5IHNlbGVjdG9yIGZvciBmaW5kaW5nIGVsZW1lbnQgb24gdGhlIERPTQorKiBAcmV0dXJuIHtS
U1ZQLlByb21pc2V9CisqLworYXN5bmNIZWxwZXIoJ2NsaWNrJywgY2xpY2spOworCisvKioKKyog
U2ltdWxhdGVzIGEga2V5IGV2ZW50LCBlLmcuIGBrZXlwcmVzc2AsIGBrZXlkb3duYCwgYGtleXVw
YCB3aXRoIHRoZSBkZXNpcmVkIGtleUNvZGUKKyoKKyogRXhhbXBsZToKKyoKKyogYGBgamF2YXNj
cmlwdAorKiBrZXlFdmVudCgnLnNvbWUtalF1ZXJ5LXNlbGVjdG9yJywgJ2tleXByZXNzJywgMTMp
LnRoZW4oZnVuY3Rpb24oKSB7CisqICAvLyBhc3NlcnQgc29tZXRoaW5nCisqIH0pOworKiBgYGAK
KyoKKyogQG1ldGhvZCBrZXlFdmVudAorKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5
IHNlbGVjdG9yIGZvciBmaW5kaW5nIGVsZW1lbnQgb24gdGhlIERPTQorKiBAcGFyYW0ge1N0cmlu
Z30gdGhlIHR5cGUgb2Yga2V5IGV2ZW50LCBlLmcuIGBrZXlwcmVzc2AsIGBrZXlkb3duYCwgYGtl
eXVwYAorKiBAcGFyYW0ge051bWJlcn0gdGhlIGtleUNvZGUgb2YgdGhlIHNpbXVsYXRlZCBrZXkg
ZXZlbnQKKyogQHJldHVybiB7UlNWUC5Qcm9taXNlfQorKi8KK2FzeW5jSGVscGVyKCdrZXlFdmVu
dCcsIGtleUV2ZW50KTsKKworLyoqCisqIEZpbGxzIGluIGFuIGlucHV0IGVsZW1lbnQgd2l0aCBz
b21lIHRleHQuCisqCisqIEV4YW1wbGU6CisqCisqIGBgYGphdmFzY3JpcHQKKyogZmlsbEluKCcj
ZW1haWwnLCAneW91QGV4YW1wbGUuY29tJykudGhlbihmdW5jdGlvbigpIHsKKyogICAvLyBhc3Nl
cnQgc29tZXRoaW5nCisqIH0pOworKiBgYGAKKyoKKyogQG1ldGhvZCBmaWxsSW4KKyogQHBhcmFt
IHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxlY3RvciBmaW5kaW5nIGFuIGlucHV0IGVsZW1l
bnQgb24gdGhlIERPTQorKiB0byBmaWxsIHRleHQgd2l0aAorKiBAcGFyYW0ge1N0cmluZ30gdGV4
dCB0ZXh0IHRvIHBsYWNlIGluc2lkZSB0aGUgaW5wdXQgZWxlbWVudAorKiBAcmV0dXJuIHtSU1ZQ
LlByb21pc2V9CisqLworYXN5bmNIZWxwZXIoJ2ZpbGxJbicsIGZpbGxJbik7CisKKy8qKgorKiBG
aW5kcyBhbiBlbGVtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBhcHAncyBjb250YWluZXIgZWxl
bWVudC4gQSBzaW1wbGUgYWxpYXMKKyogZm9yIGBhcHAuJChzZWxlY3RvcilgLgorKgorKiBFeGFt
cGxlOgorKgorKiBgYGBqYXZhc2NyaXB0CisqIHZhciAkZWwgPSBmaW5kKCcubXktc2VsZWN0b3Ip
OworKiBgYGAKKyoKKyogQG1ldGhvZCBmaW5kCisqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBq
UXVlcnkgc3RyaW5nIHNlbGVjdG9yIGZvciBlbGVtZW50IGxvb2t1cAorKiBAcmV0dXJuIHtPYmpl
Y3R9IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeQor
Ki8KK2hlbHBlcignZmluZCcsIGZpbmQpOworCisvKioKKyogTGlrZSBgZmluZGAsIGJ1dCB0aHJv
d3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgc2VsZWN0b3IgcmV0dXJucyBubyByZXN1bHRzLgor
KgorKiBFeGFtcGxlOgorKgorKiBgYGBqYXZhc2NyaXB0CisqIHZhciAkZWwgPSBmaW5kV2l0aEFz
c2VydCgnLmRvZXNudC1leGlzdCcpOyAvLyB0aHJvd3MgZXJyb3IKKyogYGBgCisqCisqIEBtZXRo
b2QgZmluZFdpdGhBc3NlcnQKKyogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxl
Y3RvciBzdHJpbmcgZm9yIGZpbmRpbmcgYW4gZWxlbWVudCB3aXRoaW4KKyogdGhlIERPTQorKiBA
cmV0dXJuIHtPYmplY3R9IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9m
IHRoZSBxdWVyeQorKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3dzIGVycm9yIGlmIGpRdWVyeSBvYmpl
Y3QgcmV0dXJuZWQgaGFzIGEgbGVuZ3RoIG9mIDAKKyovCitoZWxwZXIoJ2ZpbmRXaXRoQXNzZXJ0
JywgZmluZFdpdGhBc3NlcnQpOworCisvKioKKyAgQ2F1c2VzIHRoZSBydW4gbG9vcCB0byBwcm9j
ZXNzIGFueSBwZW5kaW5nIGV2ZW50cy4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0CisgIGFu
eSBhc3luYyBvcGVyYXRpb25zIGZyb20gb3RoZXIgaGVscGVycyAob3IgeW91ciBhc3NlcnRpb25z
KSBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCisgIFRoaXMgaXMgbW9zdCBvZnRlbiB1c2VkIGFzIHRo
ZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBoZWxwZXIgZnVuY3Rpb25zIChzZWUgJ2NsaWNrJywKKyAg
J2ZpbGxJbicsJ3Zpc2l0JyxldGMpLgogCi0gICAgYXJyYXlGb3JFYWNoLmNhbGwoZW50ZXJTdGF0
ZXMsIGZ1bmN0aW9uKHN0YXRlLCBpZHgpIHsKLSAgICAgIHN0YXRlLnRyaWdnZXIodHJhbnNpdGlv
bkV2ZW50LCB0aGlzLCBjb250ZXh0c1tpZHgtb2Zmc2V0XSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0s
CisgIEV4YW1wbGU6CiAKLSAgZ2V0U3RhdGU6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgc3Rh
dGUgPSBnZXQodGhpcywgbmFtZSksCi0gICAgICAgIHBhcmVudFN0YXRlID0gZ2V0KHRoaXMsICdw
YXJlbnRTdGF0ZScpOworICBgYGBqYXZhc2NyaXB0CisgIEVtYmVyLlRlc3QucmVnaXN0ZXJBc3lu
Y0hlbHBlcignbG9naW5Vc2VyJywgZnVuY3Rpb24oYXBwLCB1c2VybmFtZSwgcGFzc3dvcmQpIHsK
KyAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUnKQorICAgIC5maWxsSW4oJyN1c2VybmFtZScs
IHVzZXJuYW1lKQorICAgIC5maWxsSW4oJyNwYXNzd29yZCcsIHVzZXJuYW1lKQorICAgIC5jbGlj
aygnLnN1Ym1pdCcpCiAKLSAgICBpZiAoc3RhdGUpIHsKLSAgICAgIHJldHVybiBzdGF0ZTsKLSAg
ICB9IGVsc2UgaWYgKHBhcmVudFN0YXRlKSB7Ci0gICAgICByZXR1cm4gcGFyZW50U3RhdGUuZ2V0
U3RhdGUobmFtZSk7Ci0gICAgfQotICB9LAorICAgIHJldHVybiB3YWl0KCk7CisgIH0pOwogCi0g
IGVudGVyU3RhdGU6IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsKLSAgICB2YXIgbG9nID0gdGhpcy5l
bmFibGVMb2dnaW5nOworICBAbWV0aG9kIHdhaXQKKyAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRo
ZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKyAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorKi8KK2Fz
eW5jSGVscGVyKCd3YWl0Jywgd2FpdCk7Cithc3luY0hlbHBlcignYW5kVGhlbicsIGFuZFRoZW4p
OwogCi0gICAgdmFyIGV4aXRTdGF0ZXMgPSB0cmFuc2l0aW9uLmV4aXRTdGF0ZXMuc2xpY2UoMCku
cmV2ZXJzZSgpOwotICAgIGFycmF5Rm9yRWFjaC5jYWxsKGV4aXRTdGF0ZXMsIGZ1bmN0aW9uKHN0
YXRlKSB7Ci0gICAgICBzdGF0ZS50cmlnZ2VyKCdleGl0JywgdGhpcyk7Ci0gICAgfSwgdGhpcyk7
CiAKLSAgICBhcnJheUZvckVhY2guY2FsbCh0cmFuc2l0aW9uLmVudGVyU3RhdGVzLCBmdW5jdGlv
bihzdGF0ZSkgewotICAgICAgaWYgKGxvZykgeyBFbWJlci5Mb2dnZXIubG9nKCJTVEFURU1BTkFH
RVI6IEVudGVyaW5nICIgKyBnZXQoc3RhdGUsICdwYXRoJykpOyB9Ci0gICAgICBzdGF0ZS50cmln
Z2VyKCdlbnRlcicsIHRoaXMpOwotICAgIH0sIHRoaXMpOwogCi0gICAgc2V0KHRoaXMsICdjdXJy
ZW50U3RhdGUnLCB0cmFuc2l0aW9uLmZpbmFsU3RhdGUpOwotICB9Ci19KTsKIAogfSkoKTsKIApA
QCAtMjY4MTMsMjEgKzQwNTI4LDE1IEBAIEVtYmVyLlN0YXRlTWFuYWdlciA9IEVtYmVyLlN0YXRl
LmV4dGVuZCh7CiAKIChmdW5jdGlvbigpIHsKIC8qKgotRW1iZXIgU3RhdGVzCisgIEVtYmVyIFRl
c3RpbmcKIAotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1zdGF0ZXMKLUByZXF1aXJl
cyBlbWJlci1ydW50aW1lCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZXN0
aW5nCisgIEByZXF1aXJlcyBlbWJlci1hcHBsaWNhdGlvbgogKi8KIAogfSkoKTsKIAotCi19KSgp
OwotLy8gVmVyc2lvbjogdjEuMC4wLXJjLjEKLS8vIExhc3QgY29tbWl0OiA4YjA2MWI0ICgyMDEz
LTAyLTE1IDEyOjEwOjIyIC0wODAwKQotCi0KIChmdW5jdGlvbigpIHsKIC8qKgogRW1iZXIKQEAg
LTI2ODM1LDUgKzQwNTQ0LDQwIEBAIEVtYmVyCiBAbW9kdWxlIGVtYmVyCiAqLwogCitmdW5jdGlv
biB0aHJvd1dpdGhNZXNzYWdlKG1zZykgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdGhy
b3cgbmV3IEVtYmVyLkVycm9yKG1zZyk7CisgIH07Cit9CisKK2Z1bmN0aW9uIGdlbmVyYXRlUmVt
b3ZlZENsYXNzKGNsYXNzTmFtZSkgeworICB2YXIgbXNnID0gIiBoYXMgYmVlbiBtb3ZlZCBpbnRv
IGEgcGx1Z2luOiBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci1zdGF0ZXMiOworCisg
IHJldHVybiB7CisgICAgZXh0ZW5kOiB0aHJvd1dpdGhNZXNzYWdlKGNsYXNzTmFtZSArIG1zZyks
CisgICAgY3JlYXRlOiB0aHJvd1dpdGhNZXNzYWdlKGNsYXNzTmFtZSArIG1zZykKKyAgfTsKK30K
KworRW1iZXIuU3RhdGVNYW5hZ2VyID0gZ2VuZXJhdGVSZW1vdmVkQ2xhc3MoIkVtYmVyLlN0YXRl
TWFuYWdlciIpOworCisvKioKKyAgVGhpcyB3YXMgZXhwb3J0ZWQgdG8gZW1iZXItc3RhdGVzIHBs
dWdpbiBmb3IgdiAxLjAuMCByZWxlYXNlLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpz
L2VtYmVyLXN0YXRlcworICAKKyAgQGNsYXNzIFN0YXRlTWFuYWdlcgorICBAbmFtZXNwYWNlIEVt
YmVyCisqLworCitFbWJlci5TdGF0ZSA9IGdlbmVyYXRlUmVtb3ZlZENsYXNzKCJFbWJlci5TdGF0
ZSIpOworCisvKioKKyAgVGhpcyB3YXMgZXhwb3J0ZWQgdG8gZW1iZXItc3RhdGVzIHBsdWdpbiBm
b3IgdiAxLjAuMCByZWxlYXNlLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVy
LXN0YXRlcworICAKKyAgQGNsYXNzIFN0YXRlCisgIEBuYW1lc3BhY2UgRW1iZXIKKyovCisKIH0p
KCk7CiAKKworfSkoKTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVu
Y2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJf
Y29tcG9uZW50cy9oYW5kbGViYXJzL2hhbmRsZWJhcnMuanMgYi9QZXJmb3JtYW5jZVRlc3RzL0Rv
WW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzCmluZGV4IDljNjUz
ZWU3MjA5YjJlNmY0MThiZGRkMGY4Y2FjYWFmMTAwN2Q4NjguLmJlYzcwODVjNTEwMTg1MTk5ZDIw
NWEyNjU3NjA0NmJjODMyODYxYTMgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VF
dmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy9oYW5kbGViYXJzL2hhbmRsZWJhcnMuanMKKysrIGIvUGVyZm9ybWFu
Y2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcwpA
QCAtMSw0ICsxLDYgQEAKLS8qCisvKiEKKworIGhhbmRsZWJhcnMgdjEuMy4wCiAKIENvcHlyaWdo
dCAoQykgMjAxMSBieSBZZWh1ZGEgS2F0egogCkBAIC0yMCw4NDYgKzIyLDEyNjkgQEAgTElBQklM
SVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0Us
IEFSSVNJTkcgRlJPTSwKIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF
IE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KIFRIRSBTT0ZUV0FSRS4KIAorQGxpY2Vu
c2UKICovCisvKiBleHBvcnRlZCBIYW5kbGViYXJzICovCit2YXIgSGFuZGxlYmFycyA9IChmdW5j
dGlvbigpIHsKKy8vIGhhbmRsZWJhcnMvc2FmZS1zdHJpbmcuanMKK3ZhciBfX21vZHVsZTRfXyA9
IChmdW5jdGlvbigpIHsKKyAgInVzZSBzdHJpY3QiOworICB2YXIgX19leHBvcnRzX187CisgIC8v
IEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlCisgIGZ1bmN0aW9uIFNhZmVTdHJp
bmcoc3RyaW5nKSB7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KIAotLy8gbGliL2hh
bmRsZWJhcnMvYmFzZS5qcwotCi0vKmpzaGludCBlcW51bGw6dHJ1ZSovCi10aGlzLkhhbmRsZWJh
cnMgPSB7fTsKLQotKGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKLQotSGFuZGxlYmFycy5WRVJTSU9O
ID0gIjEuMC4wLXJjLjMiOwotSGFuZGxlYmFycy5DT01QSUxFUl9SRVZJU0lPTiA9IDI7CisgIFNh
ZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICIi
ICsgdGhpcy5zdHJpbmc7CisgIH07CiAKLUhhbmRsZWJhcnMuUkVWSVNJT05fQ0hBTkdFUyA9IHsK
LSAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9l
c24ndCByZXBvcnQgaXQKLSAgMjogJz49IDEuMC4wLXJjLjMnCi19OworICBfX2V4cG9ydHNfXyA9
IFNhZmVTdHJpbmc7CisgIHJldHVybiBfX2V4cG9ydHNfXzsKK30pKCk7CiAKLUhhbmRsZWJhcnMu
aGVscGVycyAgPSB7fTsKLUhhbmRsZWJhcnMucGFydGlhbHMgPSB7fTsKKy8vIGhhbmRsZWJhcnMv
dXRpbHMuanMKK3ZhciBfX21vZHVsZTNfXyA9IChmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18pIHsK
KyAgInVzZSBzdHJpY3QiOworICB2YXIgX19leHBvcnRzX18gPSB7fTsKKyAgLypqc2hpbnQgLVcw
MDQgKi8KKyAgdmFyIFNhZmVTdHJpbmcgPSBfX2RlcGVuZGVuY3kxX187CiAKLUhhbmRsZWJhcnMu
cmVnaXN0ZXJIZWxwZXIgPSBmdW5jdGlvbihuYW1lLCBmbiwgaW52ZXJzZSkgewotICBpZihpbnZl
cnNlKSB7IGZuLm5vdCA9IGludmVyc2U7IH0KLSAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47Ci19
OworICB2YXIgZXNjYXBlID0geworICAgICImIjogIiZhbXA7IiwKKyAgICAiPCI6ICImbHQ7IiwK
KyAgICAiPiI6ICImZ3Q7IiwKKyAgICAnIic6ICImcXVvdDsiLAorICAgICInIjogIiYjeDI3OyIs
CisgICAgImAiOiAiJiN4NjA7IgorICB9OwogCi1IYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbCA9
IGZ1bmN0aW9uKG5hbWUsIHN0cikgewotICB0aGlzLnBhcnRpYWxzW25hbWVdID0gc3RyOwotfTsK
KyAgdmFyIGJhZENoYXJzID0gL1smPD4iJ2BdL2c7CisgIHZhciBwb3NzaWJsZSA9IC9bJjw+Iidg
XS87CiAKLUhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlv
bihhcmcpIHsKLSAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgIHJldHVybiB1bmRl
ZmluZWQ7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBw
cm9wZXJ0eSAnIiArIGFyZyArICInIik7CisgIGZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7Cisg
ICAgcmV0dXJuIGVzY2FwZVtjaHJdIHx8ICImYW1wOyI7CiAgIH0KLX0pOwotCi12YXIgdG9TdHJp
bmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBmdW5jdGlvblR5cGUgPSAiW29iamVjdCBG
dW5jdGlvbl0iOwogCi1IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3Np
bmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gIHZhciBpbnZlcnNlID0gb3B0aW9u
cy5pbnZlcnNlIHx8IGZ1bmN0aW9uKCkge30sIGZuID0gb3B0aW9ucy5mbjsKKyAgZnVuY3Rpb24g
ZXh0ZW5kKG9iaiwgdmFsdWUpIHsKKyAgICBmb3IodmFyIGtleSBpbiB2YWx1ZSkgeworICAgICAg
aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7Cisg
ICAgICAgIG9ialtrZXldID0gdmFsdWVba2V5XTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAorICBf
X2V4cG9ydHNfXy5leHRlbmQgPSBleHRlbmQ7dmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlw
ZS50b1N0cmluZzsKKyAgX19leHBvcnRzX18udG9TdHJpbmcgPSB0b1N0cmluZzsKKyAgLy8gU291
cmNlZCBmcm9tIGxvZGFzaAorICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNo
L2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CisgIHZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFs
dWUpIHsKKyAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nOworICB9OworICAv
LyBmYWxsYmFjayBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkKKyAgaWYg
KGlzRnVuY3Rpb24oL3gvKSkgeworICAgIGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkgewor
ICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxs
KHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJzsKKyAgICB9OworICB9CisgIHZhciBpc0Z1
bmN0aW9uOworICBfX2V4cG9ydHNfXy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKKyAgdmFyIGlz
QXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuICh2
YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSA/IHRvU3RyaW5nLmNhbGwodmFsdWUp
ID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7CisgIH07CisgIF9fZXhwb3J0c19fLmlzQXJy
YXkgPSBpc0FycmF5OworCisgIGZ1bmN0aW9uIGVzY2FwZUV4cHJlc3Npb24oc3RyaW5nKSB7Cisg
ICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2Fm
ZQorICAgIGlmIChzdHJpbmcgaW5zdGFuY2VvZiBTYWZlU3RyaW5nKSB7CisgICAgICByZXR1cm4g
c3RyaW5nLnRvU3RyaW5nKCk7CisgICAgfSBlbHNlIGlmICghc3RyaW5nICYmIHN0cmluZyAhPT0g
MCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KIAotICB2YXIgcmV0ID0gIiI7Ci0gIHZhciB0
eXBlID0gdG9TdHJpbmcuY2FsbChjb250ZXh0KTsKKyAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252
ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmQK
KyAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQg
dGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKKyAgICAvLyBhbiBvYmplY3QncyB0byBzdHJp
bmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC4KKyAgICBzdHJpbmcgPSAiIiArIHN0cmlu
ZzsKIAotICBpZih0eXBlID09PSBmdW5jdGlvblR5cGUpIHsgY29udGV4dCA9IGNvbnRleHQuY2Fs
bCh0aGlzKTsgfQorICAgIGlmKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsgcmV0dXJuIHN0cmlu
ZzsgfQorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7Cisg
IH0KIAotICBpZihjb250ZXh0ID09PSB0cnVlKSB7Ci0gICAgcmV0dXJuIGZuKHRoaXMpOwotICB9
IGVsc2UgaWYoY29udGV4dCA9PT0gZmFsc2UgfHwgY29udGV4dCA9PSBudWxsKSB7Ci0gICAgcmV0
dXJuIGludmVyc2UodGhpcyk7Ci0gIH0gZWxzZSBpZih0eXBlID09PSAiW29iamVjdCBBcnJheV0i
KSB7Ci0gICAgaWYoY29udGV4dC5sZW5ndGggPiAwKSB7Ci0gICAgICByZXR1cm4gSGFuZGxlYmFy
cy5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7CisgIF9fZXhwb3J0c19fLmVzY2FwZUV4
cHJlc3Npb24gPSBlc2NhcGVFeHByZXNzaW9uO2Z1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHsKKyAg
ICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgeworICAgICAg
cmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwor
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZm4oY29u
dGV4dCk7CiAgIH0KLX0pOwogCi1IYW5kbGViYXJzLksgPSBmdW5jdGlvbigpIHt9OworICBfX2V4
cG9ydHNfXy5pc0VtcHR5ID0gaXNFbXB0eTsKKyAgcmV0dXJuIF9fZXhwb3J0c19fOworfSkoX19t
b2R1bGU0X18pOwogCi1IYW5kbGViYXJzLmNyZWF0ZUZyYW1lID0gT2JqZWN0LmNyZWF0ZSB8fCBm
dW5jdGlvbihvYmplY3QpIHsKLSAgSGFuZGxlYmFycy5LLnByb3RvdHlwZSA9IG9iamVjdDsKLSAg
dmFyIG9iaiA9IG5ldyBIYW5kbGViYXJzLksoKTsKLSAgSGFuZGxlYmFycy5LLnByb3RvdHlwZSA9
IG51bGw7Ci0gIHJldHVybiBvYmo7Ci19OworLy8gaGFuZGxlYmFycy9leGNlcHRpb24uanMKK3Zh
ciBfX21vZHVsZTVfXyA9IChmdW5jdGlvbigpIHsKKyAgInVzZSBzdHJpY3QiOworICB2YXIgX19l
eHBvcnRzX187CiAKLUhhbmRsZWJhcnMubG9nZ2VyID0gewotICBERUJVRzogMCwgSU5GTzogMSwg
V0FSTjogMiwgRVJST1I6IDMsIGxldmVsOiAzLAorICB2YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3Jp
cHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVt
YmVyJywgJ3N0YWNrJ107CiAKLSAgbWV0aG9kTWFwOiB7MDogJ2RlYnVnJywgMTogJ2luZm8nLCAy
OiAnd2FybicsIDM6ICdlcnJvcid9LAorICBmdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9k
ZSkgeworICAgIHZhciBsaW5lOworICAgIGlmIChub2RlICYmIG5vZGUuZmlyc3RMaW5lKSB7Cisg
ICAgICBsaW5lID0gbm9kZS5maXJzdExpbmU7CiAKLSAgLy8gY2FuIGJlIG92ZXJyaWRkZW4gaW4g
dGhlIGhvc3QgZW52aXJvbm1lbnQKLSAgbG9nOiBmdW5jdGlvbihsZXZlbCwgb2JqKSB7Ci0gICAg
aWYgKEhhbmRsZWJhcnMubG9nZ2VyLmxldmVsIDw9IGxldmVsKSB7Ci0gICAgICB2YXIgbWV0aG9k
ID0gSGFuZGxlYmFycy5sb2dnZXIubWV0aG9kTWFwW2xldmVsXTsKLSAgICAgIGlmICh0eXBlb2Yg
Y29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZVttZXRob2RdKSB7Ci0gICAgICAgIGNv
bnNvbGVbbWV0aG9kXS5jYWxsKGNvbnNvbGUsIG9iaik7Ci0gICAgICB9CisgICAgICBtZXNzYWdl
ICs9ICcgLSAnICsgbGluZSArICc6JyArIG5vZGUuZmlyc3RDb2x1bW47CisgICAgfQorCisgICAg
dmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2Up
OworCisgICAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENo
cm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuCisgICAg
Zm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7CisgICAg
ICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTsKKyAgICB9CisK
KyAgICBpZiAobGluZSkgeworICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTsKKyAgICAgIHRo
aXMuY29sdW1uID0gbm9kZS5maXJzdENvbHVtbjsKICAgICB9CiAgIH0KLX07CiAKLUhhbmRsZWJh
cnMubG9nID0gZnVuY3Rpb24obGV2ZWwsIG9iaikgeyBIYW5kbGViYXJzLmxvZ2dlci5sb2cobGV2
ZWwsIG9iaik7IH07CisgIEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKworICBf
X2V4cG9ydHNfXyA9IEV4Y2VwdGlvbjsKKyAgcmV0dXJuIF9fZXhwb3J0c19fOworfSkoKTsKKwor
Ly8gaGFuZGxlYmFycy9iYXNlLmpzCit2YXIgX19tb2R1bGUyX18gPSAoZnVuY3Rpb24oX19kZXBl
bmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18pIHsKKyAgInVzZSBzdHJpY3QiOworICB2YXIgX19l
eHBvcnRzX18gPSB7fTsKKyAgdmFyIFV0aWxzID0gX19kZXBlbmRlbmN5MV9fOworICB2YXIgRXhj
ZXB0aW9uID0gX19kZXBlbmRlbmN5Ml9fOworCisgIHZhciBWRVJTSU9OID0gIjEuMy4wIjsKKyAg
X19leHBvcnRzX18uVkVSU0lPTiA9IFZFUlNJT047dmFyIENPTVBJTEVSX1JFVklTSU9OID0gNDsK
KyAgX19leHBvcnRzX18uQ09NUElMRVJfUkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lPTjsKKyAg
dmFyIFJFVklTSU9OX0NIQU5HRVMgPSB7CisgICAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJj
LjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKKyAgICAyOiAnPT0gMS4w
LjAtcmMuMycsCisgICAgMzogJz09IDEuMC4wLXJjLjQnLAorICAgIDQ6ICc+PSAxLjAuMCcKKyAg
fTsKKyAgX19leHBvcnRzX18uUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7Cisg
IHZhciBpc0FycmF5ID0gVXRpbHMuaXNBcnJheSwKKyAgICAgIGlzRnVuY3Rpb24gPSBVdGlscy5p
c0Z1bmN0aW9uLAorICAgICAgdG9TdHJpbmcgPSBVdGlscy50b1N0cmluZywKKyAgICAgIG9iamVj
dFR5cGUgPSAnW29iamVjdCBPYmplY3RdJzsKIAotSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
ZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgdmFyIGZuID0gb3B0aW9ucy5m
biwgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZTsKLSAgdmFyIGkgPSAwLCByZXQgPSAiIiwgZGF0
YTsKKyAgZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzKSB7
CisgICAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTsKKyAgICB0aGlzLnBhcnRpYWxzID0g
cGFydGlhbHMgfHwge307CiAKLSAgaWYgKG9wdGlvbnMuZGF0YSkgewotICAgIGRhdGEgPSBIYW5k
bGViYXJzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CisgICAgcmVnaXN0ZXJEZWZhdWx0SGVs
cGVycyh0aGlzKTsKICAgfQogCi0gIGlmKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdv
YmplY3QnKSB7Ci0gICAgaWYoY29udGV4dCBpbnN0YW5jZW9mIEFycmF5KXsKLSAgICAgIGZvcih2
YXIgaiA9IGNvbnRleHQubGVuZ3RoOyBpPGo7IGkrKykgewotICAgICAgICBpZiAoZGF0YSkgeyBk
YXRhLmluZGV4ID0gaTsgfQotICAgICAgICByZXQgPSByZXQgKyBmbihjb250ZXh0W2ldLCB7IGRh
dGE6IGRhdGEgfSk7CisgIF9fZXhwb3J0c19fLkhhbmRsZWJhcnNFbnZpcm9ubWVudCA9IEhhbmRs
ZWJhcnNFbnZpcm9ubWVudDtIYW5kbGViYXJzRW52aXJvbm1lbnQucHJvdG90eXBlID0geworICAg
IGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsCisKKyAgICBsb2dnZXI6IGxvZ2dl
ciwKKyAgICBsb2c6IGxvZywKKworICAgIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lLCBm
biwgaW52ZXJzZSkgeworICAgICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5
cGUpIHsKKyAgICAgICAgaWYgKGludmVyc2UgfHwgZm4pIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbign
QXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBoZWxwZXJzJyk7IH0KKyAgICAgICAgVXRp
bHMuZXh0ZW5kKHRoaXMuaGVscGVycywgbmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBp
ZiAoaW52ZXJzZSkgeyBmbi5ub3QgPSBpbnZlcnNlOyB9CisgICAgICAgIHRoaXMuaGVscGVyc1tu
YW1lXSA9IGZuOwogICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IodmFyIGtleSBpbiBj
b250ZXh0KSB7Ci0gICAgICAgIGlmKGNvbnRleHQuaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAg
ICAgICAgIGlmKGRhdGEpIHsgZGF0YS5rZXkgPSBrZXk7IH0KLSAgICAgICAgICByZXQgPSByZXQg
KyBmbihjb250ZXh0W2tleV0sIHtkYXRhOiBkYXRhfSk7Ci0gICAgICAgICAgaSsrOwotICAgICAg
ICB9CisgICAgfSwKKworICAgIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24obmFtZSwgc3RyKSB7
CisgICAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkgeworICAgICAg
ICBVdGlscy5leHRlbmQodGhpcy5wYXJ0aWFscywgIG5hbWUpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHN0cjsKICAgICAgIH0KICAgICB9Ci0gIH0KKyAg
fTsKIAotICBpZihpID09PSAwKXsKLSAgICByZXQgPSBpbnZlcnNlKHRoaXMpOwotICB9CisgIGZ1
bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHsKKyAgICBpbnN0YW5jZS5y
ZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKGFyZykgeworICAgICAgaWYo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTWlzc2luZyBoZWxwZXI6
ICciICsgYXJnICsgIiciKTsKKyAgICAgIH0KKyAgICB9KTsKIAotICByZXR1cm4gcmV0OwotfSk7
CisgICAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0
aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZl
cnNlIHx8IGZ1bmN0aW9uKCkge30sIGZuID0gb3B0aW9ucy5mbjsKIAotSGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gIHZhciB0eXBl
ID0gdG9TdHJpbmcuY2FsbChjb250ZXh0KTsKLSAgaWYodHlwZSA9PT0gZnVuY3Rpb25UeXBlKSB7
IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH0KKyAgICAgIGlmIChpc0Z1bmN0aW9uKGNv
bnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH0KIAotICBpZighY29udGV4
dCB8fCBIYW5kbGViYXJzLlV0aWxzLmlzRW1wdHkoY29udGV4dCkpIHsKLSAgICByZXR1cm4gb3B0
aW9ucy5pbnZlcnNlKHRoaXMpOwotICB9IGVsc2UgewotICAgIHJldHVybiBvcHRpb25zLmZuKHRo
aXMpOwotICB9Ci19KTsKLQotSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVu
Y3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICB2YXIgZm4gPSBvcHRpb25zLmZuLCBpbnZlcnNl
ID0gb3B0aW9ucy5pbnZlcnNlOwotICBvcHRpb25zLmZuID0gaW52ZXJzZTsKLSAgb3B0aW9ucy5p
bnZlcnNlID0gZm47Ci0KLSAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVyc1snaWYnXS5jYWxsKHRo
aXMsIGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLUhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIo
J3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gIHJldHVybiBvcHRpb25zLmZu
KGNvbnRleHQpOwotfSk7Ci0KLUhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0
aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgdmFyIGxldmVsID0gb3B0aW9ucy5kYXRhICYmIG9w
dGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsID8gcGFyc2VJbnQob3B0aW9ucy5kYXRhLmxldmVsLCAx
MCkgOiAxOwotICBIYW5kbGViYXJzLmxvZyhsZXZlbCwgY29udGV4dCk7Ci19KTsKLQotfSh0aGlz
LkhhbmRsZWJhcnMpKTsKLTsKLS8vIGxpYi9oYW5kbGViYXJzL2NvbXBpbGVyL3BhcnNlci5qcwot
LyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLwotdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24o
KXsKLXZhciBwYXJzZXIgPSB7dHJhY2U6IGZ1bmN0aW9uIHRyYWNlKCkgeyB9LAoteXk6IHt9LAot
c3ltYm9sc186IHsiZXJyb3IiOjIsInJvb3QiOjMsInByb2dyYW0iOjQsIkVPRiI6NSwic2ltcGxl
SW52ZXJzZSI6Niwic3RhdGVtZW50cyI6Nywic3RhdGVtZW50Ijo4LCJvcGVuSW52ZXJzZSI6OSwi
Y2xvc2VCbG9jayI6MTAsIm9wZW5CbG9jayI6MTEsIm11c3RhY2hlIjoxMiwicGFydGlhbCI6MTMs
IkNPTlRFTlQiOjE0LCJDT01NRU5UIjoxNSwiT1BFTl9CTE9DSyI6MTYsImluTXVzdGFjaGUiOjE3
LCJDTE9TRSI6MTgsIk9QRU5fSU5WRVJTRSI6MTksIk9QRU5fRU5EQkxPQ0siOjIwLCJwYXRoIjoy
MSwiT1BFTiI6MjIsIk9QRU5fVU5FU0NBUEVEIjoyMywiT1BFTl9QQVJUSUFMIjoyNCwicGFydGlh
bE5hbWUiOjI1LCJwYXJhbXMiOjI2LCJoYXNoIjoyNywiREFUQSI6MjgsInBhcmFtIjoyOSwiU1RS
SU5HIjozMCwiSU5URUdFUiI6MzEsIkJPT0xFQU4iOjMyLCJoYXNoU2VnbWVudHMiOjMzLCJoYXNo
U2VnbWVudCI6MzQsIklEIjozNSwiRVFVQUxTIjozNiwiUEFSVElBTF9OQU1FIjozNywicGF0aFNl
Z21lbnRzIjozOCwiU0VQIjozOSwiJGFjY2VwdCI6MCwiJGVuZCI6MX0sCi10ZXJtaW5hbHNfOiB7
MjoiZXJyb3IiLDU6IkVPRiIsMTQ6IkNPTlRFTlQiLDE1OiJDT01NRU5UIiwxNjoiT1BFTl9CTE9D
SyIsMTg6IkNMT1NFIiwxOToiT1BFTl9JTlZFUlNFIiwyMDoiT1BFTl9FTkRCTE9DSyIsMjI6Ik9Q
RU4iLDIzOiJPUEVOX1VORVNDQVBFRCIsMjQ6Ik9QRU5fUEFSVElBTCIsMjg6IkRBVEEiLDMwOiJT
VFJJTkciLDMxOiJJTlRFR0VSIiwzMjoiQk9PTEVBTiIsMzU6IklEIiwzNjoiRVFVQUxTIiwzNzoi
UEFSVElBTF9OQU1FIiwzOToiU0VQIn0sCi1wcm9kdWN0aW9uc186IFswLFszLDJdLFs0LDJdLFs0
LDNdLFs0LDJdLFs0LDFdLFs0LDFdLFs0LDBdLFs3LDFdLFs3LDJdLFs4LDNdLFs4LDNdLFs4LDFd
LFs4LDFdLFs4LDFdLFs4LDFdLFsxMSwzXSxbOSwzXSxbMTAsM10sWzEyLDNdLFsxMiwzXSxbMTMs
M10sWzEzLDRdLFs2LDJdLFsxNywzXSxbMTcsMl0sWzE3LDJdLFsxNywxXSxbMTcsMV0sWzI2LDJd
LFsyNiwxXSxbMjksMV0sWzI5LDFdLFsyOSwxXSxbMjksMV0sWzI5LDFdLFsyNywxXSxbMzMsMl0s
WzMzLDFdLFszNCwzXSxbMzQsM10sWzM0LDNdLFszNCwzXSxbMzQsM10sWzI1LDFdLFsyMSwxXSxb
MzgsM10sWzM4LDFdXSwKLXBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eXRleHQs
eXlsZW5nLHl5bGluZW5vLHl5LHl5c3RhdGUsJCQsXyQpIHsKLQotdmFyICQwID0gJCQubGVuZ3Ro
IC0gMTsKLXN3aXRjaCAoeXlzdGF0ZSkgewotY2FzZSAxOiByZXR1cm4gJCRbJDAtMV07IAotYnJl
YWs7Ci1jYXNlIDI6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgJCRbJDBdKTsgCi1i
cmVhazsKLWNhc2UgMzogdGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKCQkWyQwLTJdLCAkJFsk
MF0pOyAKLWJyZWFrOwotY2FzZSA0OiB0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAt
MV0sIFtdKTsgCi1icmVhazsKLWNhc2UgNTogdGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKCQk
WyQwXSk7IAotYnJlYWs7Ci1jYXNlIDY6IHRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwg
W10pOyAKLWJyZWFrOwotY2FzZSA3OiB0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoW10pOyAK
LWJyZWFrOwotY2FzZSA4OiB0aGlzLiQgPSBbJCRbJDBdXTsgCi1icmVhazsKLWNhc2UgOTogJCRb
JDAtMV0ucHVzaCgkJFskMF0pOyB0aGlzLiQgPSAkJFskMC0xXTsgCi1icmVhazsKLWNhc2UgMTA6
IHRoaXMuJCA9IG5ldyB5eS5CbG9ja05vZGUoJCRbJDAtMl0sICQkWyQwLTFdLmludmVyc2UsICQk
WyQwLTFdLCAkJFskMF0pOyAKLWJyZWFrOwotY2FzZSAxMTogdGhpcy4kID0gbmV3IHl5LkJsb2Nr
Tm9kZSgkJFskMC0yXSwgJCRbJDAtMV0sICQkWyQwLTFdLmludmVyc2UsICQkWyQwXSk7IAotYnJl
YWs7Ci1jYXNlIDEyOiB0aGlzLiQgPSAkJFskMF07IAotYnJlYWs7Ci1jYXNlIDEzOiB0aGlzLiQg
PSAkJFskMF07IAotYnJlYWs7Ci1jYXNlIDE0OiB0aGlzLiQgPSBuZXcgeXkuQ29udGVudE5vZGUo
JCRbJDBdKTsgCi1icmVhazsKLWNhc2UgMTU6IHRoaXMuJCA9IG5ldyB5eS5Db21tZW50Tm9kZSgk
JFskMF0pOyAKLWJyZWFrOwotY2FzZSAxNjogdGhpcy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgk
JFskMC0xXVswXSwgJCRbJDAtMV1bMV0pOyAKLWJyZWFrOwotY2FzZSAxNzogdGhpcy4kID0gbmV3
IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXVswXSwgJCRbJDAtMV1bMV0pOyAKLWJyZWFrOwotY2Fz
ZSAxODogdGhpcy4kID0gJCRbJDAtMV07IAotYnJlYWs7Ci1jYXNlIDE5OiB0aGlzLiQgPSBuZXcg
eXkuTXVzdGFjaGVOb2RlKCQkWyQwLTFdWzBdLCAkJFskMC0xXVsxXSk7IAotYnJlYWs7Ci1jYXNl
IDIwOiB0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQkWyQwLTFdWzBdLCAkJFskMC0xXVsx
XSwgdHJ1ZSk7IAotYnJlYWs7Ci1jYXNlIDIxOiB0aGlzLiQgPSBuZXcgeXkuUGFydGlhbE5vZGUo
JCRbJDAtMV0pOyAKLWJyZWFrOwotY2FzZSAyMjogdGhpcy4kID0gbmV3IHl5LlBhcnRpYWxOb2Rl
KCQkWyQwLTJdLCAkJFskMC0xXSk7IAotYnJlYWs7Ci1jYXNlIDIzOiAKLWJyZWFrOwotY2FzZSAy
NDogdGhpcy4kID0gW1skJFskMC0yXV0uY29uY2F0KCQkWyQwLTFdKSwgJCRbJDBdXTsgCi1icmVh
azsKLWNhc2UgMjU6IHRoaXMuJCA9IFtbJCRbJDAtMV1dLmNvbmNhdCgkJFskMF0pLCBudWxsXTsg
Ci1icmVhazsKLWNhc2UgMjY6IHRoaXMuJCA9IFtbJCRbJDAtMV1dLCAkJFskMF1dOyAKLWJyZWFr
OwotY2FzZSAyNzogdGhpcy4kID0gW1skJFskMF1dLCBudWxsXTsgCi1icmVhazsKLWNhc2UgMjg6
IHRoaXMuJCA9IFtbbmV3IHl5LkRhdGFOb2RlKCQkWyQwXSldLCBudWxsXTsgCi1icmVhazsKLWNh
c2UgMjk6ICQkWyQwLTFdLnB1c2goJCRbJDBdKTsgdGhpcy4kID0gJCRbJDAtMV07IAotYnJlYWs7
Ci1jYXNlIDMwOiB0aGlzLiQgPSBbJCRbJDBdXTsgCi1icmVhazsKLWNhc2UgMzE6IHRoaXMuJCA9
ICQkWyQwXTsgCi1icmVhazsKLWNhc2UgMzI6IHRoaXMuJCA9IG5ldyB5eS5TdHJpbmdOb2RlKCQk
WyQwXSk7IAotYnJlYWs7Ci1jYXNlIDMzOiB0aGlzLiQgPSBuZXcgeXkuSW50ZWdlck5vZGUoJCRb
JDBdKTsgCi1icmVhazsKLWNhc2UgMzQ6IHRoaXMuJCA9IG5ldyB5eS5Cb29sZWFuTm9kZSgkJFsk
MF0pOyAKLWJyZWFrOwotY2FzZSAzNTogdGhpcy4kID0gbmV3IHl5LkRhdGFOb2RlKCQkWyQwXSk7
IAotYnJlYWs7Ci1jYXNlIDM2OiB0aGlzLiQgPSBuZXcgeXkuSGFzaE5vZGUoJCRbJDBdKTsgCi1i
cmVhazsKLWNhc2UgMzc6ICQkWyQwLTFdLnB1c2goJCRbJDBdKTsgdGhpcy4kID0gJCRbJDAtMV07
IAotYnJlYWs7Ci1jYXNlIDM4OiB0aGlzLiQgPSBbJCRbJDBdXTsgCi1icmVhazsKLWNhc2UgMzk6
IHRoaXMuJCA9IFskJFskMC0yXSwgJCRbJDBdXTsgCi1icmVhazsKLWNhc2UgNDA6IHRoaXMuJCA9
IFskJFskMC0yXSwgbmV3IHl5LlN0cmluZ05vZGUoJCRbJDBdKV07IAotYnJlYWs7Ci1jYXNlIDQx
OiB0aGlzLiQgPSBbJCRbJDAtMl0sIG5ldyB5eS5JbnRlZ2VyTm9kZSgkJFskMF0pXTsgCi1icmVh
azsKLWNhc2UgNDI6IHRoaXMuJCA9IFskJFskMC0yXSwgbmV3IHl5LkJvb2xlYW5Ob2RlKCQkWyQw
XSldOyAKLWJyZWFrOwotY2FzZSA0MzogdGhpcy4kID0gWyQkWyQwLTJdLCBuZXcgeXkuRGF0YU5v
ZGUoJCRbJDBdKV07IAotYnJlYWs7Ci1jYXNlIDQ0OiB0aGlzLiQgPSBuZXcgeXkuUGFydGlhbE5h
bWVOb2RlKCQkWyQwXSk7IAotYnJlYWs7Ci1jYXNlIDQ1OiB0aGlzLiQgPSBuZXcgeXkuSWROb2Rl
KCQkWyQwXSk7IAotYnJlYWs7Ci1jYXNlIDQ2OiAkJFskMC0yXS5wdXNoKCQkWyQwXSk7IHRoaXMu
JCA9ICQkWyQwLTJdOyAKLWJyZWFrOwotY2FzZSA0NzogdGhpcy4kID0gWyQkWyQwXV07IAotYnJl
YWs7Ci19Ci19LAotdGFibGU6IFt7MzoxLDQ6Miw1OlsyLDddLDY6Myw3OjQsODo2LDk6NywxMTo4
LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsNV0sMjI6WzEs
MTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHsxOlszXX0sezU6WzEsMTddfSx7NTpbMiw2XSw3OjE4
LDg6Niw5OjcsMTE6OCwxMjo5LDEzOjEwLDE0OlsxLDExXSwxNTpbMSwxMl0sMTY6WzEsMTNdLDE5
OlsxLDE5XSwyMDpbMiw2XSwyMjpbMSwxNF0sMjM6WzEsMTVdLDI0OlsxLDE2XX0sezU6WzIsNV0s
NjoyMCw4OjIxLDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwx
M10sMTk6WzEsNV0sMjA6WzIsNV0sMjI6WzEsMTRdLDIzOlsxLDE1XSwyNDpbMSwxNl19LHsxNzoy
MywxODpbMSwyMl0sMjE6MjQsMjg6WzEsMjVdLDM1OlsxLDI3XSwzODoyNn0sezU6WzIsOF0sMTQ6
WzIsOF0sMTU6WzIsOF0sMTY6WzIsOF0sMTk6WzIsOF0sMjA6WzIsOF0sMjI6WzIsOF0sMjM6WzIs
OF0sMjQ6WzIsOF19LHs0OjI4LDY6Myw3OjQsODo2LDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEs
MTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsNV0sMjA6WzIsN10sMjI6WzEsMTRdLDIzOlsx
LDE1XSwyNDpbMSwxNl19LHs0OjI5LDY6Myw3OjQsODo2LDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6
WzEsMTFdLDE1OlsxLDEyXSwxNjpbMSwxM10sMTk6WzEsNV0sMjA6WzIsN10sMjI6WzEsMTRdLDIz
OlsxLDE1XSwyNDpbMSwxNl19LHs1OlsyLDEyXSwxNDpbMiwxMl0sMTU6WzIsMTJdLDE2OlsyLDEy
XSwxOTpbMiwxMl0sMjA6WzIsMTJdLDIyOlsyLDEyXSwyMzpbMiwxMl0sMjQ6WzIsMTJdfSx7NTpb
MiwxM10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxNjpbMiwxM10sMTk6WzIsMTNdLDIwOlsyLDEzXSwy
MjpbMiwxM10sMjM6WzIsMTNdLDI0OlsyLDEzXX0sezU6WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwx
NF0sMTY6WzIsMTRdLDE5OlsyLDE0XSwyMDpbMiwxNF0sMjI6WzIsMTRdLDIzOlsyLDE0XSwyNDpb
MiwxNF19LHs1OlsyLDE1XSwxNDpbMiwxNV0sMTU6WzIsMTVdLDE2OlsyLDE1XSwxOTpbMiwxNV0s
MjA6WzIsMTVdLDIyOlsyLDE1XSwyMzpbMiwxNV0sMjQ6WzIsMTVdfSx7MTc6MzAsMjE6MjQsMjg6
WzEsMjVdLDM1OlsxLDI3XSwzODoyNn0sezE3OjMxLDIxOjI0LDI4OlsxLDI1XSwzNTpbMSwyN10s
Mzg6MjZ9LHsxNzozMiwyMToyNCwyODpbMSwyNV0sMzU6WzEsMjddLDM4OjI2fSx7MjU6MzMsMzc6
WzEsMzRdfSx7MTpbMiwxXX0sezU6WzIsMl0sODoyMSw5OjcsMTE6OCwxMjo5LDEzOjEwLDE0Olsx
LDExXSwxNTpbMSwxMl0sMTY6WzEsMTNdLDE5OlsxLDE5XSwyMDpbMiwyXSwyMjpbMSwxNF0sMjM6
WzEsMTVdLDI0OlsxLDE2XX0sezE3OjIzLDIxOjI0LDI4OlsxLDI1XSwzNTpbMSwyN10sMzg6MjZ9
LHs1OlsyLDRdLDc6MzUsODo2LDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1OlsxLDEy
XSwxNjpbMSwxM10sMTk6WzEsMTldLDIwOlsyLDRdLDIyOlsxLDE0XSwyMzpbMSwxNV0sMjQ6WzEs
MTZdfSx7NTpbMiw5XSwxNDpbMiw5XSwxNTpbMiw5XSwxNjpbMiw5XSwxOTpbMiw5XSwyMDpbMiw5
XSwyMjpbMiw5XSwyMzpbMiw5XSwyNDpbMiw5XX0sezU6WzIsMjNdLDE0OlsyLDIzXSwxNTpbMiwy
M10sMTY6WzIsMjNdLDE5OlsyLDIzXSwyMDpbMiwyM10sMjI6WzIsMjNdLDIzOlsyLDIzXSwyNDpb
MiwyM119LHsxODpbMSwzNl19LHsxODpbMiwyN10sMjE6NDEsMjY6MzcsMjc6MzgsMjg6WzEsNDVd
LDI5OjM5LDMwOlsxLDQyXSwzMTpbMSw0M10sMzI6WzEsNDRdLDMzOjQwLDM0OjQ2LDM1OlsxLDQ3
XSwzODoyNn0sezE4OlsyLDI4XX0sezE4OlsyLDQ1XSwyODpbMiw0NV0sMzA6WzIsNDVdLDMxOlsy
LDQ1XSwzMjpbMiw0NV0sMzU6WzIsNDVdLDM5OlsxLDQ4XX0sezE4OlsyLDQ3XSwyODpbMiw0N10s
MzA6WzIsNDddLDMxOlsyLDQ3XSwzMjpbMiw0N10sMzU6WzIsNDddLDM5OlsyLDQ3XX0sezEwOjQ5
LDIwOlsxLDUwXX0sezEwOjUxLDIwOlsxLDUwXX0sezE4OlsxLDUyXX0sezE4OlsxLDUzXX0sezE4
OlsxLDU0XX0sezE4OlsxLDU1XSwyMTo1NiwzNTpbMSwyN10sMzg6MjZ9LHsxODpbMiw0NF0sMzU6
WzIsNDRdfSx7NTpbMiwzXSw4OjIxLDk6NywxMTo4LDEyOjksMTM6MTAsMTQ6WzEsMTFdLDE1Olsx
LDEyXSwxNjpbMSwxM10sMTk6WzEsMTldLDIwOlsyLDNdLDIyOlsxLDE0XSwyMzpbMSwxNV0sMjQ6
WzEsMTZdfSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxNjpbMiwxN10sMTk6WzIsMTddLDIwOlsyLDE3
XSwyMjpbMiwxN10sMjM6WzIsMTddLDI0OlsyLDE3XX0sezE4OlsyLDI1XSwyMTo0MSwyNzo1Nywy
ODpbMSw0NV0sMjk6NTgsMzA6WzEsNDJdLDMxOlsxLDQzXSwzMjpbMSw0NF0sMzM6NDAsMzQ6NDYs
MzU6WzEsNDddLDM4OjI2fSx7MTg6WzIsMjZdfSx7MTg6WzIsMzBdLDI4OlsyLDMwXSwzMDpbMiwz
MF0sMzE6WzIsMzBdLDMyOlsyLDMwXSwzNTpbMiwzMF19LHsxODpbMiwzNl0sMzQ6NTksMzU6WzEs
NjBdfSx7MTg6WzIsMzFdLDI4OlsyLDMxXSwzMDpbMiwzMV0sMzE6WzIsMzFdLDMyOlsyLDMxXSwz
NTpbMiwzMV19LHsxODpbMiwzMl0sMjg6WzIsMzJdLDMwOlsyLDMyXSwzMTpbMiwzMl0sMzI6WzIs
MzJdLDM1OlsyLDMyXX0sezE4OlsyLDMzXSwyODpbMiwzM10sMzA6WzIsMzNdLDMxOlsyLDMzXSwz
MjpbMiwzM10sMzU6WzIsMzNdfSx7MTg6WzIsMzRdLDI4OlsyLDM0XSwzMDpbMiwzNF0sMzE6WzIs
MzRdLDMyOlsyLDM0XSwzNTpbMiwzNF19LHsxODpbMiwzNV0sMjg6WzIsMzVdLDMwOlsyLDM1XSwz
MTpbMiwzNV0sMzI6WzIsMzVdLDM1OlsyLDM1XX0sezE4OlsyLDM4XSwzNTpbMiwzOF19LHsxODpb
Miw0N10sMjg6WzIsNDddLDMwOlsyLDQ3XSwzMTpbMiw0N10sMzI6WzIsNDddLDM1OlsyLDQ3XSwz
NjpbMSw2MV0sMzk6WzIsNDddfSx7MzU6WzEsNjJdfSx7NTpbMiwxMF0sMTQ6WzIsMTBdLDE1Olsy
LDEwXSwxNjpbMiwxMF0sMTk6WzIsMTBdLDIwOlsyLDEwXSwyMjpbMiwxMF0sMjM6WzIsMTBdLDI0
OlsyLDEwXX0sezIxOjYzLDM1OlsxLDI3XSwzODoyNn0sezU6WzIsMTFdLDE0OlsyLDExXSwxNTpb
MiwxMV0sMTY6WzIsMTFdLDE5OlsyLDExXSwyMDpbMiwxMV0sMjI6WzIsMTFdLDIzOlsyLDExXSwy
NDpbMiwxMV19LHsxNDpbMiwxNl0sMTU6WzIsMTZdLDE2OlsyLDE2XSwxOTpbMiwxNl0sMjA6WzIs
MTZdLDIyOlsyLDE2XSwyMzpbMiwxNl0sMjQ6WzIsMTZdfSx7NTpbMiwxOV0sMTQ6WzIsMTldLDE1
OlsyLDE5XSwxNjpbMiwxOV0sMTk6WzIsMTldLDIwOlsyLDE5XSwyMjpbMiwxOV0sMjM6WzIsMTld
LDI0OlsyLDE5XX0sezU6WzIsMjBdLDE0OlsyLDIwXSwxNTpbMiwyMF0sMTY6WzIsMjBdLDE5Olsy
LDIwXSwyMDpbMiwyMF0sMjI6WzIsMjBdLDIzOlsyLDIwXSwyNDpbMiwyMF19LHs1OlsyLDIxXSwx
NDpbMiwyMV0sMTU6WzIsMjFdLDE2OlsyLDIxXSwxOTpbMiwyMV0sMjA6WzIsMjFdLDIyOlsyLDIx
XSwyMzpbMiwyMV0sMjQ6WzIsMjFdfSx7MTg6WzEsNjRdfSx7MTg6WzIsMjRdfSx7MTg6WzIsMjld
LDI4OlsyLDI5XSwzMDpbMiwyOV0sMzE6WzIsMjldLDMyOlsyLDI5XSwzNTpbMiwyOV19LHsxODpb
MiwzN10sMzU6WzIsMzddfSx7MzY6WzEsNjFdfSx7MjE6NjUsMjg6WzEsNjldLDMwOlsxLDY2XSwz
MTpbMSw2N10sMzI6WzEsNjhdLDM1OlsxLDI3XSwzODoyNn0sezE4OlsyLDQ2XSwyODpbMiw0Nl0s
MzA6WzIsNDZdLDMxOlsyLDQ2XSwzMjpbMiw0Nl0sMzU6WzIsNDZdLDM5OlsyLDQ2XX0sezE4Olsx
LDcwXX0sezU6WzIsMjJdLDE0OlsyLDIyXSwxNTpbMiwyMl0sMTY6WzIsMjJdLDE5OlsyLDIyXSwy
MDpbMiwyMl0sMjI6WzIsMjJdLDIzOlsyLDIyXSwyNDpbMiwyMl19LHsxODpbMiwzOV0sMzU6WzIs
MzldfSx7MTg6WzIsNDBdLDM1OlsyLDQwXX0sezE4OlsyLDQxXSwzNTpbMiw0MV19LHsxODpbMiw0
Ml0sMzU6WzIsNDJdfSx7MTg6WzIsNDNdLDM1OlsyLDQzXX0sezU6WzIsMThdLDE0OlsyLDE4XSwx
NTpbMiwxOF0sMTY6WzIsMThdLDE5OlsyLDE4XSwyMDpbMiwxOF0sMjI6WzIsMThdLDIzOlsyLDE4
XSwyNDpbMiwxOF19XSwKLWRlZmF1bHRBY3Rpb25zOiB7MTc6WzIsMV0sMjU6WzIsMjhdLDM4Olsy
LDI2XSw1NzpbMiwyNF19LAotcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhh
c2gpIHsKLSAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsKLX0sCi1wYXJzZTogZnVuY3Rpb24gcGFy
c2UoaW5wdXQpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB2c3RhY2sgPSBb
bnVsbF0sIGxzdGFjayA9IFtdLCB0YWJsZSA9IHRoaXMudGFibGUsIHl5dGV4dCA9ICIiLCB5eWxp
bmVubyA9IDAsIHl5bGVuZyA9IDAsIHJlY292ZXJpbmcgPSAwLCBURVJST1IgPSAyLCBFT0YgPSAx
OwotICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIHRoaXMubGV4ZXIueXkgPSB0
aGlzLnl5OwotICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyOwotICAgIHRoaXMueXkucGFy
c2VyID0gdGhpczsKLSAgICBpZiAodHlwZW9mIHRoaXMubGV4ZXIueXlsbG9jID09ICJ1bmRlZmlu
ZWQiKQotICAgICAgICB0aGlzLmxleGVyLnl5bGxvYyA9IHt9OwotICAgIHZhciB5eWxvYyA9IHRo
aXMubGV4ZXIueXlsbG9jOwotICAgIGxzdGFjay5wdXNoKHl5bG9jKTsKLSAgICB2YXIgcmFuZ2Vz
ID0gdGhpcy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4ZXIub3B0aW9ucy5yYW5nZXM7Ci0gICAg
aWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICJmdW5jdGlvbiIpCi0gICAgICAgIHRo
aXMucGFyc2VFcnJvciA9IHRoaXMueXkucGFyc2VFcnJvcjsKLSAgICBmdW5jdGlvbiBwb3BTdGFj
ayhuKSB7Ci0gICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIgKiBuOwotICAg
ICAgICB2c3RhY2subGVuZ3RoID0gdnN0YWNrLmxlbmd0aCAtIG47Ci0gICAgICAgIGxzdGFjay5s
ZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKLSAgICB9Ci0gICAgZnVuY3Rpb24gbGV4KCkgewot
ICAgICAgICB2YXIgdG9rZW47Ci0gICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAx
OwotICAgICAgICBpZiAodHlwZW9mIHRva2VuICE9PSAibnVtYmVyIikgewotICAgICAgICAgICAg
dG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKKyAgICAgIGlmKGNvbnRleHQg
PT09IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIGZuKHRoaXMpOworICAgICAgfSBlbHNlIGlmKGNv
bnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gaW52
ZXJzZSh0aGlzKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkgeworICAgICAg
ICBpZihjb250ZXh0Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVs
cGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IHJldHVybiBpbnZlcnNlKHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2tlbjsK
LSAgICB9Ci0gICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEs
IHIsIHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkOwotICAgIHdoaWxlICh0
cnVlKSB7Ci0gICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07Ci0gICAgICAg
IGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgewotICAgICAgICAgICAgYWN0aW9uID0g
dGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1
cm4gZm4oY29udGV4dCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpbnN0YW5jZS5yZWdpc3Rl
ckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBm
biA9IG9wdGlvbnMuZm4sIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7CisgICAgICB2YXIgaSA9
IDAsIHJldCA9ICIiLCBkYXRhOworCisgICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBj
b250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9CisKKyAgICAgIGlmIChvcHRpb25zLmRhdGEp
IHsKKyAgICAgICAgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7CisgICAgICB9CisK
KyAgICAgIGlmKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7CisgICAg
ICAgIGlmIChpc0FycmF5KGNvbnRleHQpKSB7CisgICAgICAgICAgZm9yKHZhciBqID0gY29udGV4
dC5sZW5ndGg7IGk8ajsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAg
ICAgICBkYXRhLmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgZGF0YS5maXJzdCA9IChpID09PSAw
KTsKKyAgICAgICAgICAgICAgZGF0YS5sYXN0ICA9IChpID09PSAoY29udGV4dC5sZW5ndGgtMSkp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtpXSwg
eyBkYXRhOiBkYXRhIH0pOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSAidW5kZWZpbmVkIikg
ewotICAgICAgICAgICAgICAgIHN5bWJvbCA9IGxleCgpOworICAgICAgICAgIGZvcih2YXIga2V5
IGluIGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmKGNvbnRleHQuaGFzT3duUHJvcGVydHkoa2V5
KSkgeworICAgICAgICAgICAgICBpZihkYXRhKSB7IAorICAgICAgICAgICAgICAgIGRhdGEua2V5
ID0ga2V5OyAKKyAgICAgICAgICAgICAgICBkYXRhLmluZGV4ID0gaTsKKyAgICAgICAgICAgICAg
ICBkYXRhLmZpcnN0ID0gKGkgPT09IDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
IHJldCA9IHJldCArIGZuKGNvbnRleHRba2V5XSwge2RhdGE6IGRhdGF9KTsKKyAgICAgICAgICAg
ICAgaSsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYWN0aW9uID0gdGFibGVbc3RhdGVd
ICYmIHRhYmxlW3N0YXRlXVtzeW1ib2xdOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAg
ICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gInVuZGVmaW5lZCIgfHwgIWFjdGlvbi5sZW5ndGggfHwg
IWFjdGlvblswXSkgewotICAgICAgICAgICAgdmFyIGVyclN0ciA9ICIiOwotICAgICAgICAgICAg
aWYgKCFyZWNvdmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTsKLSAgICAg
ICAgICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3RhdGVdKQotICAgICAgICAgICAgICAgICAgICBp
ZiAodGhpcy50ZXJtaW5hbHNfW3BdICYmIHAgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBleHBlY3RlZC5wdXNoKCInIiArIHRoaXMudGVybWluYWxzX1twXSArICInIik7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRp
b24pIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUg
IiArICh5eWxpbmVubyArIDEpICsgIjpcbiIgKyB0aGlzLmxleGVyLnNob3dQb3NpdGlvbigpICsg
IlxuRXhwZWN0aW5nICIgKyBleHBlY3RlZC5qb2luKCIsICIpICsgIiwgZ290ICciICsgKHRoaXMu
dGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyAiJyI7Ci0gICAgICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUg
IiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxPyJlbmQg
b2YgaW5wdXQiOiInIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgIici
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVy
clN0ciwge3RleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3lt
Ym9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4
cGVjdGVkOiBleHBlY3RlZH0pOwotICAgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZihp
ID09PSAwKXsKKyAgICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTsKKyAgICAgIH0KKworICAgICAg
cmV0dXJuIHJldDsKKyAgICB9KTsKKworICAgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZics
IGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7CisgICAgICBpZiAoaXNGdW5jdGlvbihj
b25kaXRpb25hbCkpIHsgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpOyB9CisK
KyAgICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRo
IGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS4KKyAgICAgIC8vIFRoZSBgaW5j
bHVkZVplcm9gIG9wdGlvbiBtYXkgYmUgc2V0IHRvIHRyZWF0IHRoZSBjb25kdGlvbmFsIGFzIHB1
cmVseSBub3QgZW1wdHkgYmFzZWQgb24gdGhlCisgICAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5
LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3Np
dGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLgorICAgICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVa
ZXJvICYmICFjb25kaXRpb25hbCkgfHwgVXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHsKKyAg
ICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpOworICAgICAgfQorICAgIH0pOworCisgICAgaW5z
dGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRp
b25zKSB7CisgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVyc1snaWYnXS5jYWxsKHRoaXMsIGNv
bmRpdGlvbmFsLCB7Zm46IG9wdGlvbnMuaW52ZXJzZSwgaW52ZXJzZTogb3B0aW9ucy5mbiwgaGFz
aDogb3B0aW9ucy5oYXNofSk7CisgICAgfSk7CisKKyAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBl
cignd2l0aCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIGlmIChpc0Z1bmN0
aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH0KKworICAgICAg
aWYgKCFVdGlscy5pc0VtcHR5KGNvbnRleHQpKSByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTsK
KyAgICB9KTsKKworICAgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdsb2cnLCBmdW5jdGlvbihj
b250ZXh0LCBvcHRpb25zKSB7CisgICAgICB2YXIgbGV2ZWwgPSBvcHRpb25zLmRhdGEgJiYgb3B0
aW9ucy5kYXRhLmxldmVsICE9IG51bGwgPyBwYXJzZUludChvcHRpb25zLmRhdGEubGV2ZWwsIDEw
KSA6IDE7CisgICAgICBpbnN0YW5jZS5sb2cobGV2ZWwsIGNvbnRleHQpOworICAgIH0pOworICB9
CisKKyAgdmFyIGxvZ2dlciA9IHsKKyAgICBtZXRob2RNYXA6IHsgMDogJ2RlYnVnJywgMTogJ2lu
Zm8nLCAyOiAnd2FybicsIDM6ICdlcnJvcicgfSwKKworICAgIC8vIFN0YXRlIGVudW0KKyAgICBE
RUJVRzogMCwKKyAgICBJTkZPOiAxLAorICAgIFdBUk46IDIsCisgICAgRVJST1I6IDMsCisgICAg
bGV2ZWw6IDMsCisKKyAgICAvLyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaG9zdCBlbnZpcm9u
bWVudAorICAgIGxvZzogZnVuY3Rpb24obGV2ZWwsIG9iaikgeworICAgICAgaWYgKGxvZ2dlci5s
ZXZlbCA8PSBsZXZlbCkgeworICAgICAgICB2YXIgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFts
ZXZlbF07CisgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29u
c29sZVttZXRob2RdKSB7CisgICAgICAgICAgY29uc29sZVttZXRob2RdLmNhbGwoY29uc29sZSwg
b2JqKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkg
JiYgYWN0aW9uLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFy
c2UgRXJyb3I6IG11bHRpcGxlIGFjdGlvbnMgcG9zc2libGUgYXQgc3RhdGU6ICIgKyBzdGF0ZSAr
ICIsIHRva2VuOiAiICsgc3ltYm9sKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIF9fZXhwb3J0
c19fLmxvZ2dlciA9IGxvZ2dlcjsKKyAgZnVuY3Rpb24gbG9nKGxldmVsLCBvYmopIHsgbG9nZ2Vy
LmxvZyhsZXZlbCwgb2JqKTsgfQorCisgIF9fZXhwb3J0c19fLmxvZyA9IGxvZzt2YXIgY3JlYXRl
RnJhbWUgPSBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgb2JqID0ge307CisgICAgVXRpbHMu
ZXh0ZW5kKG9iaiwgb2JqZWN0KTsKKyAgICByZXR1cm4gb2JqOworICB9OworICBfX2V4cG9ydHNf
Xy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lOworICByZXR1cm4gX19leHBvcnRzX187Cit9KShf
X21vZHVsZTNfXywgX19tb2R1bGU1X18pOworCisvLyBoYW5kbGViYXJzL3J1bnRpbWUuanMKK3Zh
ciBfX21vZHVsZTZfXyA9IChmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJf
XywgX19kZXBlbmRlbmN5M19fKSB7CisgICJ1c2Ugc3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19f
ID0ge307CisgIHZhciBVdGlscyA9IF9fZGVwZW5kZW5jeTFfXzsKKyAgdmFyIEV4Y2VwdGlvbiA9
IF9fZGVwZW5kZW5jeTJfXzsKKyAgdmFyIENPTVBJTEVSX1JFVklTSU9OID0gX19kZXBlbmRlbmN5
M19fLkNPTVBJTEVSX1JFVklTSU9OOworICB2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IF9fZGVwZW5k
ZW5jeTNfXy5SRVZJU0lPTl9DSEFOR0VTOworCisgIGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29t
cGlsZXJJbmZvKSB7CisgICAgdmFyIGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYg
Y29tcGlsZXJJbmZvWzBdIHx8IDEsCisgICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVS
X1JFVklTSU9OOworCisgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZpc2lv
bikgeworICAgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKKyAg
ICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlz
aW9uXSwKKyAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2Nv
bXBpbGVyUmV2aXNpb25dOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUZW1wbGF0ZSB3
YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0
aGUgY3VycmVudCBydW50aW1lLiAiKworICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5b3Vy
IHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIitydW50aW1lVmVyc2lvbnMrIikgb3Ig
ZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgiK2NvbXBpbGVyVmVy
c2lvbnMrIikuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVk
IHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBy
ZXZpc2lvbiB5ZXQKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVtcGxhdGUgd2FzIHBy
ZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3Vy
cmVudCBydW50aW1lLiAiKworICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRp
bWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2NvbXBpbGVySW5mb1sxXSsiKS4iKTsKKyAgICAgIH0K
KyAgICB9CisgIH0KKworICBfX2V4cG9ydHNfXy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZpc2lv
bjsvLyBUT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFuZCBicmVhayB1cCBjb21waWxlUGFydGlhbAor
CisgIGZ1bmN0aW9uIHRlbXBsYXRlKHRlbXBsYXRlU3BlYywgZW52KSB7CisgICAgaWYgKCFlbnYp
IHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGVudmlyb25tZW50IHBhc3NlZCB0byB0
ZW1wbGF0ZSIpOworICAgIH0KKworICAgIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2Vz
IHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9u
IHRvIGFsbG93CisgICAgLy8gZm9yIGV4dGVybmFsIHVzZXJzIHRvIG92ZXJyaWRlIHRoZXNlIGFz
IHBzdWVkby1zdXBwb3J0ZWQgQVBJcy4KKyAgICB2YXIgaW52b2tlUGFydGlhbFdyYXBwZXIgPSBm
dW5jdGlvbihwYXJ0aWFsLCBuYW1lLCBjb250ZXh0LCBoZWxwZXJzLCBwYXJ0aWFscywgZGF0YSkg
eworICAgICAgdmFyIHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsgcmV0dXJuIHJlc3VsdDsgfQor
CisgICAgICBpZiAoZW52LmNvbXBpbGUpIHsKKyAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGhlbHBl
cnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0aWFscywgZGF0YTogZGF0YSB9OworICAgICAgICBw
YXJ0aWFsc1tuYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHsgZGF0YTogZGF0YSAhPT0gdW5k
ZWZpbmVkIH0sIGVudik7CisgICAgICAgIHJldHVybiBwYXJ0aWFsc1tuYW1lXShjb250ZXh0LCBv
cHRpb25zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRo
ZSBwYXJ0aWFsICIgKyBuYW1lICsgIiBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5n
IGluIHJ1bnRpbWUtb25seSBtb2RlIik7CisgICAgICB9CisgICAgfTsKKworICAgIC8vIEp1c3Qg
YWRkIHdhdGVyCisgICAgdmFyIGNvbnRhaW5lciA9IHsKKyAgICAgIGVzY2FwZUV4cHJlc3Npb246
IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCisgICAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0
aWFsV3JhcHBlciwKKyAgICAgIHByb2dyYW1zOiBbXSwKKyAgICAgIHByb2dyYW06IGZ1bmN0aW9u
KGksIGZuLCBkYXRhKSB7CisgICAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3Jh
bXNbaV07CisgICAgICAgIGlmKGRhdGEpIHsKKyAgICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHBy
b2dyYW0oaSwgZm4sIGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikg
eworICAgICAgICAgIHByb2dyYW1XcmFwcGVyID0gdGhpcy5wcm9ncmFtc1tpXSA9IHByb2dyYW0o
aSwgZm4pOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7Ci0gICAgICAg
IGNhc2UgMToKLSAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTsKLSAgICAgICAgICAgIHZz
dGFjay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKLSAgICAgICAgICAgIGxzdGFjay5wdXNoKHRo
aXMubGV4ZXIueXlsbG9jKTsKLSAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTsKLSAg
ICAgICAgICAgIHN5bWJvbCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIXByZUVycm9yU3ltYm9s
KSB7Ci0gICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7Ci0gICAgICAg
ICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7Ci0gICAgICAgICAgICAgICAgeXls
aW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vOwotICAgICAgICAgICAgICAgIHl5bG9jID0gdGhp
cy5sZXhlci55eWxsb2M7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKQotICAg
ICAgICAgICAgICAgICAgICByZWNvdmVyaW5nLS07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOwotICAgICAgICAgICAgICAgIHBy
ZUVycm9yU3ltYm9sID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rp
b25bMV1dWzFdOwotICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0g
bGVuXTsKLSAgICAgICAgICAgIHl5dmFsLl8kID0ge2ZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2su
bGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfbGluZSwgbGFzdF9saW5lOiBsc3RhY2tbbHN0YWNr
Lmxlbmd0aCAtIDFdLmxhc3RfbGluZSwgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0
aCAtIChsZW4gfHwgMSldLmZpcnN0X2NvbHVtbiwgbGFzdF9jb2x1bW46IGxzdGFja1tsc3RhY2su
bGVuZ3RoIC0gMV0ubGFzdF9jb2x1bW59OwotICAgICAgICAgICAgaWYgKHJhbmdlcykgewotICAg
ICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxl
biB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgciA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHl5
dmFsLCB5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHRoaXMueXksIGFjdGlvblsxXSwgdnN0YWNr
LCBsc3RhY2spOwotICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewot
ICAgICAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYg
KGxlbikgewotICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4g
KiAyKTsKLSAgICAgICAgICAgICAgICB2c3RhY2sgPSB2c3RhY2suc2xpY2UoMCwgLTEgKiBsZW4p
OwotICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMucHJvZHVjdGlvbnNfW2Fj
dGlvblsxXV1bMF0pOwotICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7Ci0gICAgICAg
ICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7Ci0gICAgICAgICAgICBuZXdTdGF0ZSA9IHRhYmxl
W3N0YWNrW3N0YWNrLmxlbmd0aCAtIDJdXVtzdGFja1tzdGFjay5sZW5ndGggLSAxXV07Ci0gICAg
ICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIDM6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHByb2dy
YW1XcmFwcGVyOworICAgICAgfSwKKyAgICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9u
KSB7CisgICAgICAgIHZhciByZXQgPSBwYXJhbSB8fCBjb21tb247CisKKyAgICAgICAgaWYgKHBh
cmFtICYmIGNvbW1vbiAmJiAocGFyYW0gIT09IGNvbW1vbikpIHsKKyAgICAgICAgICByZXQgPSB7
fTsKKyAgICAgICAgICBVdGlscy5leHRlbmQocmV0LCBjb21tb24pOworICAgICAgICAgIFV0aWxz
LmV4dGVuZChyZXQsIHBhcmFtKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAg
ICAgfSwKKyAgICAgIHByb2dyYW1XaXRoRGVwdGg6IGVudi5WTS5wcm9ncmFtV2l0aERlcHRoLAor
ICAgICAgbm9vcDogZW52LlZNLm5vb3AsCisgICAgICBjb21waWxlckluZm86IG51bGwKKyAgICB9
OworCisgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlv
bnMgPSBvcHRpb25zIHx8IHt9OworICAgICAgdmFyIG5hbWVzcGFjZSA9IG9wdGlvbnMucGFydGlh
bCA/IG9wdGlvbnMgOiBlbnYsCisgICAgICAgICAgaGVscGVycywKKyAgICAgICAgICBwYXJ0aWFs
czsKKworICAgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKKyAgICAgICAgaGVscGVycyA9IG9w
dGlvbnMuaGVscGVyczsKKyAgICAgICAgcGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzOworICAg
ICAgfQorICAgICAgdmFyIHJlc3VsdCA9IHRlbXBsYXRlU3BlYy5jYWxsKAorICAgICAgICAgICAg
Y29udGFpbmVyLAorICAgICAgICAgICAgbmFtZXNwYWNlLCBjb250ZXh0LAorICAgICAgICAgICAg
aGVscGVycywKKyAgICAgICAgICAgIHBhcnRpYWxzLAorICAgICAgICAgICAgb3B0aW9ucy5kYXRh
KTsKKworICAgICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHsKKyAgICAgICAgZW52LlZNLmNoZWNr
UmV2aXNpb24oY29udGFpbmVyLmNvbXBpbGVySW5mbyk7CisgICAgICB9CisKKyAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfTsKKyAgfQorCisgIF9fZXhwb3J0c19fLnRlbXBsYXRlID0gdGVtcGxh
dGU7ZnVuY3Rpb24gcHJvZ3JhbVdpdGhEZXB0aChpLCBmbiwgZGF0YSAvKiwgJGRlcHRoICovKSB7
CisgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMp
OworCisgICAgdmFyIHByb2cgPSBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7CisgICAgICBv
cHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKworICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIFtj
b250ZXh0LCBvcHRpb25zLmRhdGEgfHwgZGF0YV0uY29uY2F0KGFyZ3MpKTsKKyAgICB9OworICAg
IHByb2cucHJvZ3JhbSA9IGk7CisgICAgcHJvZy5kZXB0aCA9IGFyZ3MubGVuZ3RoOworICAgIHJl
dHVybiBwcm9nOworICB9CisKKyAgX19leHBvcnRzX18ucHJvZ3JhbVdpdGhEZXB0aCA9IHByb2dy
YW1XaXRoRGVwdGg7ZnVuY3Rpb24gcHJvZ3JhbShpLCBmbiwgZGF0YSkgeworICAgIHZhciBwcm9n
ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgeworICAgICAgb3B0aW9ucyA9IG9wdGlvbnMg
fHwge307CisKKyAgICAgIHJldHVybiBmbihjb250ZXh0LCBvcHRpb25zLmRhdGEgfHwgZGF0YSk7
CisgICAgfTsKKyAgICBwcm9nLnByb2dyYW0gPSBpOworICAgIHByb2cuZGVwdGggPSAwOworICAg
IHJldHVybiBwcm9nOworICB9CisKKyAgX19leHBvcnRzX18ucHJvZ3JhbSA9IHByb2dyYW07ZnVu
Y3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBuYW1lLCBjb250ZXh0LCBoZWxwZXJzLCBwYXJ0
aWFscywgZGF0YSkgeworICAgIHZhciBvcHRpb25zID0geyBwYXJ0aWFsOiB0cnVlLCBoZWxwZXJz
OiBoZWxwZXJzLCBwYXJ0aWFsczogcGFydGlhbHMsIGRhdGE6IGRhdGEgfTsKKworICAgIGlmKHBh
cnRpYWwgPT09IHVuZGVmaW5lZCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHBh
cnRpYWwgIiArIG5hbWUgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIpOworICAgIH0gZWxzZSBpZihw
YXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBwYXJ0aWFsKGNvbnRl
eHQsIG9wdGlvbnMpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLX07Ci0vKiBKaXNvbiBn
ZW5lcmF0ZWQgbGV4ZXIgKi8KLXZhciBsZXhlciA9IChmdW5jdGlvbigpewotdmFyIGxleGVyID0g
KHtFT0Y6MSwKLXBhcnNlRXJyb3I6ZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHsKLSAg
ICAgICAgaWYgKHRoaXMueXkucGFyc2VyKSB7Ci0gICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5w
YXJzZUVycm9yKHN0ciwgaGFzaCk7CisgIH0KKworICBfX2V4cG9ydHNfXy5pbnZva2VQYXJ0aWFs
ID0gaW52b2tlUGFydGlhbDtmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gIiI7IH0KKworICBfX2V4
cG9ydHNfXy5ub29wID0gbm9vcDsKKyAgcmV0dXJuIF9fZXhwb3J0c19fOworfSkoX19tb2R1bGUz
X18sIF9fbW9kdWxlNV9fLCBfX21vZHVsZTJfXyk7CisKKy8vIGhhbmRsZWJhcnMucnVudGltZS5q
cwordmFyIF9fbW9kdWxlMV9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRl
bmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9f
KSB7CisgICJ1c2Ugc3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19fOworICAvKmdsb2JhbHMgSGFu
ZGxlYmFyczogdHJ1ZSAqLworICB2YXIgYmFzZSA9IF9fZGVwZW5kZW5jeTFfXzsKKworICAvLyBF
YWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNl
dHVwIGhlcmUuCisgIC8vIChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJlIGNvZGUgYmV0d2Vl
biBjb21tb25qcyBhbmQgYnJvd3NlIGVudnMpCisgIHZhciBTYWZlU3RyaW5nID0gX19kZXBlbmRl
bmN5Ml9fOworICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5M19fOworICB2YXIgVXRpbHMg
PSBfX2RlcGVuZGVuY3k0X187CisgIHZhciBydW50aW1lID0gX19kZXBlbmRlbmN5NV9fOworCisg
IC8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1z
LCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQorICB2YXIgY3JlYXRlID0g
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50
KCk7CisKKyAgICBVdGlscy5leHRlbmQoaGIsIGJhc2UpOworICAgIGhiLlNhZmVTdHJpbmcgPSBT
YWZlU3RyaW5nOworICAgIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjsKKyAgICBoYi5VdGlscyA9
IFV0aWxzOworCisgICAgaGIuVk0gPSBydW50aW1lOworICAgIGhiLnRlbXBsYXRlID0gZnVuY3Rp
b24oc3BlYykgeworICAgICAgcmV0dXJuIHJ1bnRpbWUudGVtcGxhdGUoc3BlYywgaGIpOworICAg
IH07CisKKyAgICByZXR1cm4gaGI7CisgIH07CisKKyAgdmFyIEhhbmRsZWJhcnMgPSBjcmVhdGUo
KTsKKyAgSGFuZGxlYmFycy5jcmVhdGUgPSBjcmVhdGU7CisKKyAgX19leHBvcnRzX18gPSBIYW5k
bGViYXJzOworICByZXR1cm4gX19leHBvcnRzX187Cit9KShfX21vZHVsZTJfXywgX19tb2R1bGU0
X18sIF9fbW9kdWxlNV9fLCBfX21vZHVsZTNfXywgX19tb2R1bGU2X18pOworCisvLyBoYW5kbGVi
YXJzL2NvbXBpbGVyL2FzdC5qcwordmFyIF9fbW9kdWxlN19fID0gKGZ1bmN0aW9uKF9fZGVwZW5k
ZW5jeTFfXykgeworICAidXNlIHN0cmljdCI7CisgIHZhciBfX2V4cG9ydHNfXzsKKyAgdmFyIEV4
Y2VwdGlvbiA9IF9fZGVwZW5kZW5jeTFfXzsKKworICBmdW5jdGlvbiBMb2NhdGlvbkluZm8obG9j
SW5mbyl7CisgICAgbG9jSW5mbyA9IGxvY0luZm8gfHwge307CisgICAgdGhpcy5maXJzdExpbmUg
ICA9IGxvY0luZm8uZmlyc3RfbGluZTsKKyAgICB0aGlzLmZpcnN0Q29sdW1uID0gbG9jSW5mby5m
aXJzdF9jb2x1bW47CisgICAgdGhpcy5sYXN0Q29sdW1uICA9IGxvY0luZm8ubGFzdF9jb2x1bW47
CisgICAgdGhpcy5sYXN0TGluZSAgICA9IGxvY0luZm8ubGFzdF9saW5lOworICB9CisKKyAgdmFy
IEFTVCA9IHsKKyAgICBQcm9ncmFtTm9kZTogZnVuY3Rpb24oc3RhdGVtZW50cywgaW52ZXJzZVN0
cmlwLCBpbnZlcnNlLCBsb2NJbmZvKSB7CisgICAgICB2YXIgaW52ZXJzZUxvY2F0aW9uSW5mbywg
Zmlyc3RJbnZlcnNlTm9kZTsKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7Cisg
ICAgICAgIGxvY0luZm8gPSBpbnZlcnNlOworICAgICAgICBpbnZlcnNlID0gbnVsbDsKKyAgICAg
IH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgICBsb2NJbmZvID0g
aW52ZXJzZVN0cmlwOworICAgICAgICBpbnZlcnNlU3RyaXAgPSBudWxsOworICAgICAgfQorCisg
ICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKKyAgICAgIHRoaXMudHlwZSA9
ICJwcm9ncmFtIjsKKyAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7CisgICAgICB0
aGlzLnN0cmlwID0ge307CisKKyAgICAgIGlmKGludmVyc2UpIHsKKyAgICAgICAgZmlyc3RJbnZl
cnNlTm9kZSA9IGludmVyc2VbMF07CisgICAgICAgIGlmIChmaXJzdEludmVyc2VOb2RlKSB7Cisg
ICAgICAgICAgaW52ZXJzZUxvY2F0aW9uSW5mbyA9IHsKKyAgICAgICAgICAgIGZpcnN0X2xpbmU6
IGZpcnN0SW52ZXJzZU5vZGUuZmlyc3RMaW5lLAorICAgICAgICAgICAgbGFzdF9saW5lOiBmaXJz
dEludmVyc2VOb2RlLmxhc3RMaW5lLAorICAgICAgICAgICAgbGFzdF9jb2x1bW46IGZpcnN0SW52
ZXJzZU5vZGUubGFzdENvbHVtbiwKKyAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogZmlyc3RJbnZl
cnNlTm9kZS5maXJzdENvbHVtbgorICAgICAgICAgIH07CisgICAgICAgICAgdGhpcy5pbnZlcnNl
ID0gbmV3IEFTVC5Qcm9ncmFtTm9kZShpbnZlcnNlLCBpbnZlcnNlU3RyaXAsIGludmVyc2VMb2Nh
dGlvbkluZm8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KHN0cik7CisgICAgICAgICAgdGhpcy5pbnZlcnNlID0gbmV3IEFTVC5Qcm9ncmFtTm9kZShpbnZl
cnNlLCBpbnZlcnNlU3RyaXApOwogICAgICAgICB9CisgICAgICAgIHRoaXMuc3RyaXAucmlnaHQg
PSBpbnZlcnNlU3RyaXAubGVmdDsKKyAgICAgIH0gZWxzZSBpZiAoaW52ZXJzZVN0cmlwKSB7Cisg
ICAgICAgIHRoaXMuc3RyaXAubGVmdCA9IGludmVyc2VTdHJpcC5yaWdodDsKKyAgICAgIH0KICAg
ICB9LAotc2V0SW5wdXQ6ZnVuY3Rpb24gKGlucHV0KSB7Ci0gICAgICAgIHRoaXMuX2lucHV0ID0g
aW5wdXQ7Ci0gICAgICAgIHRoaXMuX21vcmUgPSB0aGlzLl9sZXNzID0gdGhpcy5kb25lID0gZmFs
c2U7Ci0gICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7Ci0gICAgICAgIHRo
aXMueXl0ZXh0ID0gdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaCA9ICcnOwotICAgICAgICB0aGlz
LmNvbmRpdGlvblN0YWNrID0gWydJTklUSUFMJ107Ci0gICAgICAgIHRoaXMueXlsbG9jID0ge2Zp
cnN0X2xpbmU6MSxmaXJzdF9jb2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2NvbHVtbjowfTsKLSAg
ICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlID0gWzAsMF07
Ci0gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwK
LWlucHV0OmZ1bmN0aW9uICgpIHsKLSAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07Ci0g
ICAgICAgIHRoaXMueXl0ZXh0ICs9IGNoOwotICAgICAgICB0aGlzLnl5bGVuZysrOwotICAgICAg
ICB0aGlzLm9mZnNldCsrOwotICAgICAgICB0aGlzLm1hdGNoICs9IGNoOwotICAgICAgICB0aGlz
Lm1hdGNoZWQgKz0gY2g7Ci0gICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xc
bikuKi9nKTsKLSAgICAgICAgaWYgKGxpbmVzKSB7Ci0gICAgICAgICAgICB0aGlzLnl5bGluZW5v
Kys7Ci0gICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7Ci0gICAgICAgIH0KLSAg
ICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHRoaXMueXlsbG9jLnJhbmdlWzFdKys7Ci0K
LSAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTsKLSAgICAgICAgcmV0
dXJuIGNoOwotICAgIH0sCi11bnB1dDpmdW5jdGlvbiAoY2gpIHsKLSAgICAgICAgdmFyIGxlbiA9
IGNoLmxlbmd0aDsKLSAgICAgICAgdmFyIGxpbmVzID0gY2guc3BsaXQoLyg/OlxyXG4/fFxuKS9n
KTsKLQotICAgICAgICB0aGlzLl9pbnB1dCA9IGNoICsgdGhpcy5faW5wdXQ7Ci0gICAgICAgIHRo
aXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aC1sZW4t
MSk7Ci0gICAgICAgIC8vdGhpcy55eWxlbmcgLT0gbGVuOwotICAgICAgICB0aGlzLm9mZnNldCAt
PSBsZW47Ci0gICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/
fFxuKS9nKTsKLSAgICAgICAgdGhpcy5tYXRjaCA9IHRoaXMubWF0Y2guc3Vic3RyKDAsIHRoaXMu
bWF0Y2gubGVuZ3RoLTEpOwotICAgICAgICB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoZWQuc3Vi
c3RyKDAsIHRoaXMubWF0Y2hlZC5sZW5ndGgtMSk7Ci0KLSAgICAgICAgaWYgKGxpbmVzLmxlbmd0
aC0xKSB0aGlzLnl5bGluZW5vIC09IGxpbmVzLmxlbmd0aC0xOwotICAgICAgICB2YXIgciA9IHRo
aXMueXlsbG9jLnJhbmdlOwotCi0gICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6IHRo
aXMueXlsbG9jLmZpcnN0X2xpbmUsCi0gICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5v
KzEsCi0gICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sCi0g
ICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID8KLSAgICAgICAgICAgICAgKGxpbmVzLmxlbmd0
aCA9PT0gb2xkTGluZXMubGVuZ3RoID8gdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkgKyBv
bGRMaW5lc1tvbGRMaW5lcy5sZW5ndGggLSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVzWzBd
Lmxlbmd0aDoKLSAgICAgICAgICAgICAgdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIC0gbGVuCi0g
ICAgICAgICAgfTsKIAotICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewotICAgICAg
ICAgICAgdGhpcy55eWxsb2MucmFuZ2UgPSBbclswXSwgclswXSArIHRoaXMueXlsZW5nIC0gbGVu
XTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9LAotbW9yZTpmdW5jdGlv
biAoKSB7Ci0gICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwotICAgICAgICByZXR1cm4gdGhpczsK
LSAgICB9LAotbGVzczpmdW5jdGlvbiAobikgewotICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0
Y2guc2xpY2UobikpOwotICAgIH0sCi1wYXN0SW5wdXQ6ZnVuY3Rpb24gKCkgewotICAgICAgICB2
YXIgcGFzdCA9IHRoaXMubWF0Y2hlZC5zdWJzdHIoMCwgdGhpcy5tYXRjaGVkLmxlbmd0aCAtIHRo
aXMubWF0Y2gubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIChwYXN0Lmxlbmd0aCA+IDIwID8gJy4u
Lic6JycpICsgcGFzdC5zdWJzdHIoLTIwKS5yZXBsYWNlKC9cbi9nLCAiIik7Ci0gICAgfSwKLXVw
Y29taW5nSW5wdXQ6ZnVuY3Rpb24gKCkgewotICAgICAgICB2YXIgbmV4dCA9IHRoaXMubWF0Y2g7
Ci0gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7Ci0gICAgICAgICAgICBuZXh0ICs9IHRo
aXMuX2lucHV0LnN1YnN0cigwLCAyMC1uZXh0Lmxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSsobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSku
cmVwbGFjZSgvXG4vZywgIiIpOwotICAgIH0sCi1zaG93UG9zaXRpb246ZnVuY3Rpb24gKCkgewot
ICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTsKLSAgICAgICAgdmFyIGMgPSBuZXcg
QXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oIi0iKTsKLSAgICAgICAgcmV0dXJuIHByZSArIHRo
aXMudXBjb21pbmdJbnB1dCgpICsgIlxuIiArIGMrIl4iOworICAgIE11c3RhY2hlTm9kZTogZnVu
Y3Rpb24ocmF3UGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgeworICAgICAgTG9j
YXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7CisgICAgICB0aGlzLnR5cGUgPSAibXVzdGFj
aGUiOworICAgICAgdGhpcy5zdHJpcCA9IHN0cmlwOworCisgICAgICAvLyBPcGVuIG1heSBiZSBh
IHN0cmluZyBwYXJzZWQgZnJvbSB0aGUgcGFyc2VyIG9yIGEgcGFzc2VkIGJvb2xlYW4gZmxhZwor
ICAgICAgaWYgKG9wZW4gIT0gbnVsbCAmJiBvcGVuLmNoYXJBdCkgeworICAgICAgICAvLyBNdXN0
IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKKyAgICAgICAgdmFyIGVzY2FwZUZsYWcg
PSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKTsKKyAgICAgICAgdGhpcy5lc2NhcGVk
ID0gZXNjYXBlRmxhZyAhPT0gJ3snICYmIGVzY2FwZUZsYWcgIT09ICcmJzsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHRoaXMuZXNjYXBlZCA9ICEhb3BlbjsKKyAgICAgIH0KKworICAgICAgaWYg
KHJhd1BhcmFtcyBpbnN0YW5jZW9mIEFTVC5TZXhwck5vZGUpIHsKKyAgICAgICAgdGhpcy5zZXhw
ciA9IHJhd1BhcmFtczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFN1cHBvcnQgb2xkIEFT
VCBBUEkKKyAgICAgICAgdGhpcy5zZXhwciA9IG5ldyBBU1QuU2V4cHJOb2RlKHJhd1BhcmFtcywg
aGFzaCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuc2V4cHIuaXNSb290ID0gdHJ1ZTsKKworICAg
ICAgLy8gU3VwcG9ydCBvbGQgQVNUIEFQSSB0aGF0IHN0b3JlZCB0aGlzIGluZm8gaW4gTXVzdGFj
aGVOb2RlCisgICAgICB0aGlzLmlkID0gdGhpcy5zZXhwci5pZDsKKyAgICAgIHRoaXMucGFyYW1z
ID0gdGhpcy5zZXhwci5wYXJhbXM7CisgICAgICB0aGlzLmhhc2ggPSB0aGlzLnNleHByLmhhc2g7
CisgICAgICB0aGlzLmVsaWdpYmxlSGVscGVyID0gdGhpcy5zZXhwci5lbGlnaWJsZUhlbHBlcjsK
KyAgICAgIHRoaXMuaXNIZWxwZXIgPSB0aGlzLnNleHByLmlzSGVscGVyOwogICAgIH0sCi1uZXh0
OmZ1bmN0aW9uICgpIHsKLSAgICAgICAgaWYgKHRoaXMuZG9uZSkgewotICAgICAgICAgICAgcmV0
dXJuIHRoaXMuRU9GOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdGhpcy5faW5wdXQpIHRoaXMu
ZG9uZSA9IHRydWU7Ci0KLSAgICAgICAgdmFyIHRva2VuLAotICAgICAgICAgICAgbWF0Y2gsCi0g
ICAgICAgICAgICB0ZW1wTWF0Y2gsCi0gICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgIGNv
bCwKLSAgICAgICAgICAgIGxpbmVzOwotICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHsKLSAgICAg
ICAgICAgIHRoaXMueXl0ZXh0ID0gJyc7Ci0gICAgICAgICAgICB0aGlzLm1hdGNoID0gJyc7Ci0g
ICAgICAgIH0KLSAgICAgICAgdmFyIHJ1bGVzID0gdGhpcy5fY3VycmVudFJ1bGVzKCk7Ci0gICAg
ICAgIGZvciAodmFyIGk9MDtpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRl
bXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTsKLSAgICAg
ICAgICAgIGlmICh0ZW1wTWF0Y2ggJiYgKCFtYXRjaCB8fCB0ZW1wTWF0Y2hbMF0ubGVuZ3RoID4g
bWF0Y2hbMF0ubGVuZ3RoKSkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoOwot
ICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0
aW9ucy5mbGV4KSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAo
bWF0Y2gpIHsKLSAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/OlxyXG4/fFxu
KS4qL2cpOwotICAgICAgICAgICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxl
bmd0aDsKLSAgICAgICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6IHRoaXMueXlsbG9j
Lmxhc3RfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbGluZTogdGhpcy55
eWxpbmVubysxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlz
Lnl5bGxvYy5sYXN0X2NvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfY29s
dW1uOiBsaW5lcyA/IGxpbmVzW2xpbmVzLmxlbmd0aC0xXS5sZW5ndGgtbGluZXNbbGluZXMubGVu
Z3RoLTFdLm1hdGNoKC9ccj9cbj8vKVswXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVt
biArIG1hdGNoWzBdLmxlbmd0aH07Ci0gICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBtYXRjaFsw
XTsKLSAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07Ci0gICAgICAgICAgICB0aGlz
Lm1hdGNoZXMgPSBtYXRjaDsKLSAgICAgICAgICAgIHRoaXMueXlsZW5nID0gdGhpcy55eXRleHQu
bGVuZ3RoOwotICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKLSAgICAgICAg
ICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFt0aGlzLm9mZnNldCwgdGhpcy5vZmZzZXQgKz0g
dGhpcy55eWxlbmddOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZh
bHNlOwotICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZShtYXRjaFsw
XS5sZW5ndGgpOwotICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IG1hdGNoWzBdOwotICAgICAg
ICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlz
LCBydWxlc1tpbmRleF0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxl
bmd0aC0xXSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5kb25lICYmIHRoaXMuX2lucHV0KSB0aGlz
LmRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICh0b2tlbikgcmV0dXJuIHRva2VuOwotICAg
ICAgICAgICAgZWxzZSByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuX2lucHV0
ID09PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBs
aW5lICcrKHRoaXMueXlsaW5lbm8rMSkrJy4gVW5yZWNvZ25pemVkIHRleHQuXG4nK3RoaXMuc2hv
d1Bvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIHt0ZXh0OiAiIiwgdG9rZW46IG51bGws
IGxpbmU6IHRoaXMueXlsaW5lbm99KTsKLSAgICAgICAgfQorCisgICAgU2V4cHJOb2RlOiBmdW5j
dGlvbihyYXdQYXJhbXMsIGhhc2gsIGxvY0luZm8pIHsKKyAgICAgIExvY2F0aW9uSW5mby5jYWxs
KHRoaXMsIGxvY0luZm8pOworCisgICAgICB0aGlzLnR5cGUgPSAic2V4cHIiOworICAgICAgdGhp
cy5oYXNoID0gaGFzaDsKKworICAgICAgdmFyIGlkID0gdGhpcy5pZCA9IHJhd1BhcmFtc1swXTsK
KyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcyA9IHJhd1BhcmFtcy5zbGljZSgxKTsKKwor
ICAgICAgLy8gYSBtdXN0YWNoZSBpcyBhbiBlbGlnaWJsZSBoZWxwZXIgaWY6CisgICAgICAvLyAq
IGl0cyBpZCBpcyBzaW1wbGUgKGEgc2luZ2xlIHBhcnQsIG5vdCBgdGhpc2Agb3IgYC4uYCkKKyAg
ICAgIHZhciBlbGlnaWJsZUhlbHBlciA9IHRoaXMuZWxpZ2libGVIZWxwZXIgPSBpZC5pc1NpbXBs
ZTsKKworICAgICAgLy8gYSBtdXN0YWNoZSBpcyBkZWZpbml0ZWx5IGEgaGVscGVyIGlmOgorICAg
ICAgLy8gKiBpdCBpcyBhbiBlbGlnaWJsZSBoZWxwZXIsIGFuZAorICAgICAgLy8gKiBpdCBoYXMg
YXQgbGVhc3Qgb25lIHBhcmFtZXRlciBvciBoYXNoIHNlZ21lbnQKKyAgICAgIHRoaXMuaXNIZWxw
ZXIgPSBlbGlnaWJsZUhlbHBlciAmJiAocGFyYW1zLmxlbmd0aCB8fCBoYXNoKTsKKworICAgICAg
Ly8gaWYgYSBtdXN0YWNoZSBpcyBhbiBlbGlnaWJsZSBoZWxwZXIgYnV0IG5vdCBhIGRlZmluaXRl
CisgICAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwgYmUgcmVzb2x2ZWQg
aW4gYSBsYXRlcgorICAgICAgLy8gcGFzcyBvciBhdCBydW50aW1lLgogICAgIH0sCi1sZXg6ZnVu
Y3Rpb24gbGV4KCkgewotICAgICAgICB2YXIgciA9IHRoaXMubmV4dCgpOwotICAgICAgICBpZiAo
dHlwZW9mIHIgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmxleCgpOwotICAgICAgICB9CisK
KyAgICBQYXJ0aWFsTm9kZTogZnVuY3Rpb24ocGFydGlhbE5hbWUsIGNvbnRleHQsIHN0cmlwLCBs
b2NJbmZvKSB7CisgICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKKyAgICAg
IHRoaXMudHlwZSAgICAgICAgID0gInBhcnRpYWwiOworICAgICAgdGhpcy5wYXJ0aWFsTmFtZSAg
PSBwYXJ0aWFsTmFtZTsKKyAgICAgIHRoaXMuY29udGV4dCAgICAgID0gY29udGV4dDsKKyAgICAg
IHRoaXMuc3RyaXAgPSBzdHJpcDsKICAgICB9LAotYmVnaW46ZnVuY3Rpb24gYmVnaW4oY29uZGl0
aW9uKSB7Ci0gICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pOwotICAg
IH0sCi1wb3BTdGF0ZTpmdW5jdGlvbiBwb3BTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
Y29uZGl0aW9uU3RhY2sucG9wKCk7Ci0gICAgfSwKLV9jdXJyZW50UnVsZXM6ZnVuY3Rpb24gX2N1
cnJlbnRSdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uc1t0aGlzLmNvbmRp
dGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoLTFdXS5ydWxlczsKLSAgICB9LAot
dG9wU3RhdGU6ZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFj
a1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0yXTsKLSAgICB9LAotcHVzaFN0YXRlOmZ1bmN0
aW9uIGJlZ2luKGNvbmRpdGlvbikgewotICAgICAgICB0aGlzLmJlZ2luKGNvbmRpdGlvbik7Ci0g
ICAgfX0pOwotbGV4ZXIub3B0aW9ucyA9IHt9OwotbGV4ZXIucGVyZm9ybUFjdGlvbiA9IGZ1bmN0
aW9uIGFub255bW91cyh5eSx5eV8sJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucyxZWV9TVEFSVCkg
ewotCi12YXIgWVlTVEFURT1ZWV9TVEFSVAotc3dpdGNoKCRhdm9pZGluZ19uYW1lX2NvbGxpc2lv
bnMpIHsKLWNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeXlf
Lnl5dGV4dC5zbGljZSgtMSkgIT09ICJcXCIpIHRoaXMuYmVnaW4oIm11Iik7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHl5Xy55eXRleHQuc2xpY2UoLTEpID09PSAiXFwi
KSB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4dC5zdWJzdHIoMCx5eV8ueXlsZW5nLTEpLCB0aGlzLmJl
Z2luKCJlbXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5
dGV4dCkgcmV0dXJuIDE0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1icmVh
azsKLWNhc2UgMTogcmV0dXJuIDE0OyAKLWJyZWFrOwotY2FzZSAyOgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0xKSAhPT0gIlxcIikgdGhp
cy5wb3BTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8u
eXl0ZXh0LnNsaWNlKC0xKSA9PT0gIlxcIikgeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3Ry
KDAseXlfLnl5bGVuZy0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIDE0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1icmVhazsKLWNhc2Ug
MzogeXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDAsIHl5Xy55eWxlbmctNCk7IHRoaXMu
cG9wU3RhdGUoKTsgcmV0dXJuIDE1OyAKLWJyZWFrOwotY2FzZSA0OiB0aGlzLmJlZ2luKCJwYXIi
KTsgcmV0dXJuIDI0OyAKLWJyZWFrOwotY2FzZSA1OiByZXR1cm4gMTY7IAotYnJlYWs7Ci1jYXNl
IDY6IHJldHVybiAyMDsgCi1icmVhazsKLWNhc2UgNzogcmV0dXJuIDE5OyAKLWJyZWFrOwotY2Fz
ZSA4OiByZXR1cm4gMTk7IAotYnJlYWs7Ci1jYXNlIDk6IHJldHVybiAyMzsgCi1icmVhazsKLWNh
c2UgMTA6IHJldHVybiAyMzsgCi1icmVhazsKLWNhc2UgMTE6IHRoaXMucG9wU3RhdGUoKTsgdGhp
cy5iZWdpbignY29tJyk7IAotYnJlYWs7Ci1jYXNlIDEyOiB5eV8ueXl0ZXh0ID0geXlfLnl5dGV4
dC5zdWJzdHIoMyx5eV8ueXlsZW5nLTUpOyB0aGlzLnBvcFN0YXRlKCk7IHJldHVybiAxNTsgCi1i
cmVhazsKLWNhc2UgMTM6IHJldHVybiAyMjsgCi1icmVhazsKLWNhc2UgMTQ6IHJldHVybiAzNjsg
Ci1icmVhazsKLWNhc2UgMTU6IHJldHVybiAzNTsgCi1icmVhazsKLWNhc2UgMTY6IHJldHVybiAz
NTsgCi1icmVhazsKLWNhc2UgMTc6IHJldHVybiAzOTsgCi1icmVhazsKLWNhc2UgMTg6IC8qaWdu
b3JlIHdoaXRlc3BhY2UqLyAKLWJyZWFrOwotY2FzZSAxOTogdGhpcy5wb3BTdGF0ZSgpOyByZXR1
cm4gMTg7IAotYnJlYWs7Ci1jYXNlIDIwOiB0aGlzLnBvcFN0YXRlKCk7IHJldHVybiAxODsgCi1i
cmVhazsKLWNhc2UgMjE6IHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLHl5Xy55eWxl
bmctMikucmVwbGFjZSgvXFwiL2csJyInKTsgcmV0dXJuIDMwOyAKLWJyZWFrOwotY2FzZSAyMjog
eXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKDEseXlfLnl5bGVuZy0yKS5yZXBsYWNlKC9c
XCcvZywiJyIpOyByZXR1cm4gMzA7IAotYnJlYWs7Ci1jYXNlIDIzOiB5eV8ueXl0ZXh0ID0geXlf
Lnl5dGV4dC5zdWJzdHIoMSk7IHJldHVybiAyODsgCi1icmVhazsKLWNhc2UgMjQ6IHJldHVybiAz
MjsgCi1icmVhazsKLWNhc2UgMjU6IHJldHVybiAzMjsgCi1icmVhazsKLWNhc2UgMjY6IHJldHVy
biAzMTsgCi1icmVhazsKLWNhc2UgMjc6IHJldHVybiAzNTsgCi1icmVhazsKLWNhc2UgMjg6IHl5
Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cigxLCB5eV8ueXlsZW5nLTIpOyByZXR1cm4gMzU7
IAotYnJlYWs7Ci1jYXNlIDI5OiByZXR1cm4gJ0lOVkFMSUQnOyAKLWJyZWFrOwotY2FzZSAzMDog
LyppZ25vcmUgd2hpdGVzcGFjZSovIAotYnJlYWs7Ci1jYXNlIDMxOiB0aGlzLnBvcFN0YXRlKCk7
IHJldHVybiAzNzsgCi1icmVhazsKLWNhc2UgMzI6IHJldHVybiA1OyAKLWJyZWFrOwotfQotfTsK
LWxleGVyLnJ1bGVzID0gWy9eKD86W15ceDAwXSo/KD89KFx7XHspKSkvLC9eKD86W15ceDAwXSsp
LywvXig/OlteXHgwMF17Mix9Pyg/PShce1x7fCQpKSkvLC9eKD86W1xzXFNdKj8tLVx9XH0pLywv
Xig/Olx7XHs+KS8sL14oPzpce1x7IykvLC9eKD86XHtce1wvKS8sL14oPzpce1x7XF4pLywvXig/
Olx7XHtccyplbHNlXGIpLywvXig/Olx7XHtceykvLC9eKD86XHtceyYpLywvXig/Olx7XHshLS0p
LywvXig/Olx7XHshW1xzXFNdKj9cfVx9KS8sL14oPzpce1x7KS8sL14oPzo9KS8sL14oPzpcLig/
PVt9IF0pKS8sL14oPzpcLlwuKS8sL14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14oPzpcfVx9XH0p
LywvXig/Olx9XH0pLywvXig/OiIoXFxbIl18W14iXSkqIikvLC9eKD86JyhcXFsnXXxbXiddKSon
KS8sL14oPzpAW2EtekEtWl0rKS8sL14oPzp0cnVlKD89W31cc10pKS8sL14oPzpmYWxzZSg/PVt9
XHNdKSkvLC9eKD86WzAtOV0rKD89W31cc10pKS8sL14oPzpbYS16QS1aMC05XyQtXSsoPz1bPX1c
c1wvLl0pKS8sL14oPzpcW1teXF1dKlxdKS8sL14oPzouKS8sL14oPzpccyspLywvXig/OlthLXpB
LVowLTlfJC0vXSspLywvXig/OiQpL107Ci1sZXhlci5jb25kaXRpb25zID0geyJtdSI6eyJydWxl
cyI6WzQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIz
LDI0LDI1LDI2LDI3LDI4LDI5LDMyXSwiaW5jbHVzaXZlIjpmYWxzZX0sImVtdSI6eyJydWxlcyI6
WzJdLCJpbmNsdXNpdmUiOmZhbHNlfSwiY29tIjp7InJ1bGVzIjpbM10sImluY2x1c2l2ZSI6ZmFs
c2V9LCJwYXIiOnsicnVsZXMiOlszMCwzMV0sImluY2x1c2l2ZSI6ZmFsc2V9LCJJTklUSUFMIjp7
InJ1bGVzIjpbMCwxLDMyXSwiaW5jbHVzaXZlIjp0cnVlfX07Ci1yZXR1cm4gbGV4ZXI7fSkoKQot
cGFyc2VyLmxleGVyID0gbGV4ZXI7Ci1mdW5jdGlvbiBQYXJzZXIgKCkgeyB0aGlzLnl5ID0ge307
IH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7Ci1yZXR1
cm4gbmV3IFBhcnNlcjsKLX0pKCk7OwotLy8gbGliL2hhbmRsZWJhcnMvY29tcGlsZXIvYmFzZS5q
cwotSGFuZGxlYmFycy5QYXJzZXIgPSBoYW5kbGViYXJzOwotCi1IYW5kbGViYXJzLnBhcnNlID0g
ZnVuY3Rpb24oaW5wdXQpIHsKLQotICAvLyBKdXN0IHJldHVybiBpZiBhbiBhbHJlYWR5LWNvbXBp
bGUgQVNUIHdhcyBwYXNzZWQgaW4uCi0gIGlmKGlucHV0LmNvbnN0cnVjdG9yID09PSBIYW5kbGVi
YXJzLkFTVC5Qcm9ncmFtTm9kZSkgeyByZXR1cm4gaW5wdXQ7IH0KLQotICBIYW5kbGViYXJzLlBh
cnNlci55eSA9IEhhbmRsZWJhcnMuQVNUOwotICByZXR1cm4gSGFuZGxlYmFycy5QYXJzZXIucGFy
c2UoaW5wdXQpOwotfTsKLQotSGFuZGxlYmFycy5wcmludCA9IGZ1bmN0aW9uKGFzdCkgewotICBy
ZXR1cm4gbmV3IEhhbmRsZWJhcnMuUHJpbnRWaXNpdG9yKCkuYWNjZXB0KGFzdCk7Ci19OzsKLS8v
IGxpYi9oYW5kbGViYXJzL2NvbXBpbGVyL2FzdC5qcwotKGZ1bmN0aW9uKCkgewotCi0gIEhhbmRs
ZWJhcnMuQVNUID0ge307Ci0KLSAgSGFuZGxlYmFycy5BU1QuUHJvZ3JhbU5vZGUgPSBmdW5jdGlv
bihzdGF0ZW1lbnRzLCBpbnZlcnNlKSB7Ci0gICAgdGhpcy50eXBlID0gInByb2dyYW0iOwotICAg
IHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7Ci0gICAgaWYoaW52ZXJzZSkgeyB0aGlzLmlu
dmVyc2UgPSBuZXcgSGFuZGxlYmFycy5BU1QuUHJvZ3JhbU5vZGUoaW52ZXJzZSk7IH0KLSAgfTsK
IAotICBIYW5kbGViYXJzLkFTVC5NdXN0YWNoZU5vZGUgPSBmdW5jdGlvbihyYXdQYXJhbXMsIGhh
c2gsIHVuZXNjYXBlZCkgewotICAgIHRoaXMudHlwZSA9ICJtdXN0YWNoZSI7Ci0gICAgdGhpcy5l
c2NhcGVkID0gIXVuZXNjYXBlZDsKLSAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgIEJsb2NrTm9k
ZTogZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UsIGNsb3NlLCBsb2NJbmZvKSB7
CisgICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKIAotICAgIHZhciBpZCA9
IHRoaXMuaWQgPSByYXdQYXJhbXNbMF07Ci0gICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyYW1zID0g
cmF3UGFyYW1zLnNsaWNlKDEpOworICAgICAgaWYobXVzdGFjaGUuc2V4cHIuaWQub3JpZ2luYWwg
IT09IGNsb3NlLnBhdGgub3JpZ2luYWwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbiht
dXN0YWNoZS5zZXhwci5pZC5vcmlnaW5hbCArICIgZG9lc24ndCBtYXRjaCAiICsgY2xvc2UucGF0
aC5vcmlnaW5hbCwgdGhpcyk7CisgICAgICB9CiAKLSAgICAvLyBhIG11c3RhY2hlIGlzIGFuIGVs
aWdpYmxlIGhlbHBlciBpZjoKLSAgICAvLyAqIGl0cyBpZCBpcyBzaW1wbGUgKGEgc2luZ2xlIHBh
cnQsIG5vdCBgdGhpc2Agb3IgYC4uYCkKLSAgICB2YXIgZWxpZ2libGVIZWxwZXIgPSB0aGlzLmVs
aWdpYmxlSGVscGVyID0gaWQuaXNTaW1wbGU7CisgICAgICB0aGlzLnR5cGUgPSAnYmxvY2snOwor
ICAgICAgdGhpcy5tdXN0YWNoZSA9IG11c3RhY2hlOworICAgICAgdGhpcy5wcm9ncmFtICA9IHBy
b2dyYW07CisgICAgICB0aGlzLmludmVyc2UgID0gaW52ZXJzZTsKIAotICAgIC8vIGEgbXVzdGFj
aGUgaXMgZGVmaW5pdGVseSBhIGhlbHBlciBpZjoKLSAgICAvLyAqIGl0IGlzIGFuIGVsaWdpYmxl
IGhlbHBlciwgYW5kCi0gICAgLy8gKiBpdCBoYXMgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBvciBo
YXNoIHNlZ21lbnQKLSAgICB0aGlzLmlzSGVscGVyID0gZWxpZ2libGVIZWxwZXIgJiYgKHBhcmFt
cy5sZW5ndGggfHwgaGFzaCk7CisgICAgICB0aGlzLnN0cmlwID0geworICAgICAgICBsZWZ0OiBt
dXN0YWNoZS5zdHJpcC5sZWZ0LAorICAgICAgICByaWdodDogY2xvc2Uuc3RyaXAucmlnaHQKKyAg
ICAgIH07CiAKLSAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQg
bm90IGEgZGVmaW5pdGUKLSAgICAvLyBoZWxwZXIsIGl0IGlzIGFtYmlndW91cywgYW5kIHdpbGwg
YmUgcmVzb2x2ZWQgaW4gYSBsYXRlcgotICAgIC8vIHBhc3Mgb3IgYXQgcnVudGltZS4KLSAgfTsK
KyAgICAgIChwcm9ncmFtIHx8IGludmVyc2UpLnN0cmlwLmxlZnQgPSBtdXN0YWNoZS5zdHJpcC5y
aWdodDsKKyAgICAgIChpbnZlcnNlIHx8IHByb2dyYW0pLnN0cmlwLnJpZ2h0ID0gY2xvc2Uuc3Ry
aXAubGVmdDsKIAotICBIYW5kbGViYXJzLkFTVC5QYXJ0aWFsTm9kZSA9IGZ1bmN0aW9uKHBhcnRp
YWxOYW1lLCBjb250ZXh0KSB7Ci0gICAgdGhpcy50eXBlICAgICAgICAgPSAicGFydGlhbCI7Ci0g
ICAgdGhpcy5wYXJ0aWFsTmFtZSAgPSBwYXJ0aWFsTmFtZTsKLSAgICB0aGlzLmNvbnRleHQgICAg
ICA9IGNvbnRleHQ7Ci0gIH07CisgICAgICBpZiAoaW52ZXJzZSAmJiAhcHJvZ3JhbSkgeworICAg
ICAgICB0aGlzLmlzSW52ZXJzZSA9IHRydWU7CisgICAgICB9CisgICAgfSwKIAotICB2YXIgdmVy
aWZ5TWF0Y2ggPSBmdW5jdGlvbihvcGVuLCBjbG9zZSkgewotICAgIGlmKG9wZW4ub3JpZ2luYWwg
IT09IGNsb3NlLm9yaWdpbmFsKSB7Ci0gICAgICB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRp
b24ob3Blbi5vcmlnaW5hbCArICIgZG9lc24ndCBtYXRjaCAiICsgY2xvc2Uub3JpZ2luYWwpOwot
ICAgIH0KLSAgfTsKKyAgICBDb250ZW50Tm9kZTogZnVuY3Rpb24oc3RyaW5nLCBsb2NJbmZvKSB7
CisgICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKKyAgICAgIHRoaXMudHlw
ZSA9ICJjb250ZW50IjsKKyAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgIH0sCiAKLSAg
SGFuZGxlYmFycy5BU1QuQmxvY2tOb2RlID0gZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGlu
dmVyc2UsIGNsb3NlKSB7Ci0gICAgdmVyaWZ5TWF0Y2gobXVzdGFjaGUuaWQsIGNsb3NlKTsKLSAg
ICB0aGlzLnR5cGUgPSAiYmxvY2siOwotICAgIHRoaXMubXVzdGFjaGUgPSBtdXN0YWNoZTsKLSAg
ICB0aGlzLnByb2dyYW0gID0gcHJvZ3JhbTsKLSAgICB0aGlzLmludmVyc2UgID0gaW52ZXJzZTsK
KyAgICBIYXNoTm9kZTogZnVuY3Rpb24ocGFpcnMsIGxvY0luZm8pIHsKKyAgICAgIExvY2F0aW9u
SW5mby5jYWxsKHRoaXMsIGxvY0luZm8pOworICAgICAgdGhpcy50eXBlID0gImhhc2giOworICAg
ICAgdGhpcy5wYWlycyA9IHBhaXJzOworICAgIH0sCiAKLSAgICBpZiAodGhpcy5pbnZlcnNlICYm
ICF0aGlzLnByb2dyYW0pIHsKLSAgICAgIHRoaXMuaXNJbnZlcnNlID0gdHJ1ZTsKLSAgICB9Ci0g
IH07CisgICAgSWROb2RlOiBmdW5jdGlvbihwYXJ0cywgbG9jSW5mbykgeworICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7CisgICAgICB0aGlzLnR5cGUgPSAiSUQiOwogCi0g
IEhhbmRsZWJhcnMuQVNULkNvbnRlbnROb2RlID0gZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgdGhp
cy50eXBlID0gImNvbnRlbnQiOwotICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOwotICB9OworICAg
ICAgdmFyIG9yaWdpbmFsID0gIiIsCisgICAgICAgICAgZGlnID0gW10sCisgICAgICAgICAgZGVw
dGggPSAwOwogCi0gIEhhbmRsZWJhcnMuQVNULkhhc2hOb2RlID0gZnVuY3Rpb24ocGFpcnMpIHsK
LSAgICB0aGlzLnR5cGUgPSAiaGFzaCI7Ci0gICAgdGhpcy5wYWlycyA9IHBhaXJzOwotICB9Owor
ICAgICAgZm9yKHZhciBpPTAsbD1wYXJ0cy5sZW5ndGg7IGk8bDsgaSsrKSB7CisgICAgICAgIHZh
ciBwYXJ0ID0gcGFydHNbaV0ucGFydDsKKyAgICAgICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNl
cGFyYXRvciB8fCAnJykgKyBwYXJ0OwogCi0gIEhhbmRsZWJhcnMuQVNULklkTm9kZSA9IGZ1bmN0
aW9uKHBhcnRzKSB7Ci0gICAgdGhpcy50eXBlID0gIklEIjsKLSAgICB0aGlzLm9yaWdpbmFsID0g
cGFydHMuam9pbigiLiIpOworICAgICAgICBpZiAocGFydCA9PT0gIi4uIiB8fCBwYXJ0ID09PSAi
LiIgfHwgcGFydCA9PT0gInRoaXMiKSB7CisgICAgICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7
CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhdGg6ICIgKyBvcmln
aW5hbCwgdGhpcyk7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAiLi4iKSB7CisgICAg
ICAgICAgICBkZXB0aCsrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmlz
U2NvcGVkID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ZGlnLnB1c2gocGFydCk7CisgICAgICAgIH0KKyAgICAgIH0KIAotICAgIHZhciBkaWcgPSBbXSwg
ZGVwdGggPSAwOworICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOworICAgICAgdGhpcy5w
YXJ0cyAgICA9IGRpZzsKKyAgICAgIHRoaXMuc3RyaW5nICAgPSBkaWcuam9pbignLicpOworICAg
ICAgdGhpcy5kZXB0aCAgICA9IGRlcHRoOwogCi0gICAgZm9yKHZhciBpPTAsbD1wYXJ0cy5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOworICAgICAgLy8gYW4g
SUQgaXMgc2ltcGxlIGlmIGl0IG9ubHkgaGFzIG9uZSBwYXJ0LCBhbmQgdGhhdCBwYXJ0IGlzIG5v
dAorICAgICAgLy8gYC4uYCBvciBgdGhpc2AuCisgICAgICB0aGlzLmlzU2ltcGxlID0gcGFydHMu
bGVuZ3RoID09PSAxICYmICF0aGlzLmlzU2NvcGVkICYmIGRlcHRoID09PSAwOwogCi0gICAgICBp
ZiAocGFydCA9PT0gIi4uIiB8fCBwYXJ0ID09PSAiLiIgfHwgcGFydCA9PT0gInRoaXMiKSB7Ci0g
ICAgICAgIGlmIChkaWcubGVuZ3RoID4gMCkgeyB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRp
b24oIkludmFsaWQgcGF0aDogIiArIHRoaXMub3JpZ2luYWwpOyB9Ci0gICAgICAgIGVsc2UgaWYg
KHBhcnQgPT09ICIuLiIpIHsgZGVwdGgrKzsgfQotICAgICAgICBlbHNlIHsgdGhpcy5pc1Njb3Bl
ZCA9IHRydWU7IH0KLSAgICAgIH0KLSAgICAgIGVsc2UgeyBkaWcucHVzaChwYXJ0KTsgfQotICAg
IH0KKyAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gdGhpcy5zdHJpbmc7CisgICAgfSwKIAot
ICAgIHRoaXMucGFydHMgICAgPSBkaWc7Ci0gICAgdGhpcy5zdHJpbmcgICA9IGRpZy5qb2luKCcu
Jyk7Ci0gICAgdGhpcy5kZXB0aCAgICA9IGRlcHRoOworICAgIFBhcnRpYWxOYW1lTm9kZTogZnVu
Y3Rpb24obmFtZSwgbG9jSW5mbykgeworICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9j
SW5mbyk7CisgICAgICB0aGlzLnR5cGUgPSAiUEFSVElBTF9OQU1FIjsKKyAgICAgIHRoaXMubmFt
ZSA9IG5hbWUub3JpZ2luYWw7CisgICAgfSwKIAotICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBp
dCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3QKLSAgICAvLyBgLi5gIG9y
IGB0aGlzYC4KLSAgICB0aGlzLmlzU2ltcGxlID0gcGFydHMubGVuZ3RoID09PSAxICYmICF0aGlz
LmlzU2NvcGVkICYmIGRlcHRoID09PSAwOworICAgIERhdGFOb2RlOiBmdW5jdGlvbihpZCwgbG9j
SW5mbykgeworICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7CisgICAgICB0
aGlzLnR5cGUgPSAiREFUQSI7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfSwKIAotICAgIHRo
aXMuc3RyaW5nTW9kZVZhbHVlID0gdGhpcy5zdHJpbmc7Ci0gIH07CisgICAgU3RyaW5nTm9kZTog
ZnVuY3Rpb24oc3RyaW5nLCBsb2NJbmZvKSB7CisgICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlz
LCBsb2NJbmZvKTsKKyAgICAgIHRoaXMudHlwZSA9ICJTVFJJTkciOworICAgICAgdGhpcy5vcmln
aW5hbCA9CisgICAgICAgIHRoaXMuc3RyaW5nID0KKyAgICAgICAgdGhpcy5zdHJpbmdNb2RlVmFs
dWUgPSBzdHJpbmc7CisgICAgfSwKIAotICBIYW5kbGViYXJzLkFTVC5QYXJ0aWFsTmFtZU5vZGUg
PSBmdW5jdGlvbihuYW1lKSB7Ci0gICAgdGhpcy50eXBlID0gIlBBUlRJQUxfTkFNRSI7Ci0gICAg
dGhpcy5uYW1lID0gbmFtZTsKLSAgfTsKKyAgICBJbnRlZ2VyTm9kZTogZnVuY3Rpb24oaW50ZWdl
ciwgbG9jSW5mbykgeworICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Cisg
ICAgICB0aGlzLnR5cGUgPSAiSU5URUdFUiI7CisgICAgICB0aGlzLm9yaWdpbmFsID0KKyAgICAg
ICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsKKyAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0g
TnVtYmVyKGludGVnZXIpOworICAgIH0sCiAKLSAgSGFuZGxlYmFycy5BU1QuRGF0YU5vZGUgPSBm
dW5jdGlvbihpZCkgewotICAgIHRoaXMudHlwZSA9ICJEQVRBIjsKLSAgICB0aGlzLmlkID0gaWQ7
Ci0gIH07CisgICAgQm9vbGVhbk5vZGU6IGZ1bmN0aW9uKGJvb2wsIGxvY0luZm8pIHsKKyAgICAg
IExvY2F0aW9uSW5mby5jYWxsKHRoaXMsIGxvY0luZm8pOworICAgICAgdGhpcy50eXBlID0gIkJP
T0xFQU4iOworICAgICAgdGhpcy5ib29sID0gYm9vbDsKKyAgICAgIHRoaXMuc3RyaW5nTW9kZVZh
bHVlID0gYm9vbCA9PT0gInRydWUiOworICAgIH0sCiAKLSAgSGFuZGxlYmFycy5BU1QuU3RyaW5n
Tm9kZSA9IGZ1bmN0aW9uKHN0cmluZykgewotICAgIHRoaXMudHlwZSA9ICJTVFJJTkciOwotICAg
IHRoaXMuc3RyaW5nID0gc3RyaW5nOwotICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gc3RyaW5n
OworICAgIENvbW1lbnROb2RlOiBmdW5jdGlvbihjb21tZW50LCBsb2NJbmZvKSB7CisgICAgICBM
b2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKKyAgICAgIHRoaXMudHlwZSA9ICJjb21t
ZW50IjsKKyAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQogICB9OwogCi0gIEhh
bmRsZWJhcnMuQVNULkludGVnZXJOb2RlID0gZnVuY3Rpb24oaW50ZWdlcikgewotICAgIHRoaXMu
dHlwZSA9ICJJTlRFR0VSIjsKLSAgICB0aGlzLmludGVnZXIgPSBpbnRlZ2VyOwotICAgIHRoaXMu
c3RyaW5nTW9kZVZhbHVlID0gTnVtYmVyKGludGVnZXIpOworICAvLyBNdXN0IGJlIGV4cG9ydGVk
IGFzIGFuIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlIGFzIHRoZSBq
aXNvbiBsZXhlcgorICAvLyBtb3N0IG1vZGlmeSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgcHJvcGVy
bHkuCisgIF9fZXhwb3J0c19fID0gQVNUOworICByZXR1cm4gX19leHBvcnRzX187Cit9KShfX21v
ZHVsZTVfXyk7CisKKy8vIGhhbmRsZWJhcnMvY29tcGlsZXIvcGFyc2VyLmpzCit2YXIgX19tb2R1
bGU5X18gPSAoZnVuY3Rpb24oKSB7CisgICJ1c2Ugc3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19f
OworICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovCisgIC8qIEppc29uIGdlbmVyYXRlZCBwYXJz
ZXIgKi8KKyAgdmFyIGhhbmRsZWJhcnMgPSAoZnVuY3Rpb24oKXsKKyAgdmFyIHBhcnNlciA9IHt0
cmFjZTogZnVuY3Rpb24gdHJhY2UoKSB7IH0sCisgIHl5OiB7fSwKKyAgc3ltYm9sc186IHsiZXJy
b3IiOjIsInJvb3QiOjMsInN0YXRlbWVudHMiOjQsIkVPRiI6NSwicHJvZ3JhbSI6Niwic2ltcGxl
SW52ZXJzZSI6Nywic3RhdGVtZW50Ijo4LCJvcGVuSW52ZXJzZSI6OSwiY2xvc2VCbG9jayI6MTAs
Im9wZW5CbG9jayI6MTEsIm11c3RhY2hlIjoxMiwicGFydGlhbCI6MTMsIkNPTlRFTlQiOjE0LCJD
T01NRU5UIjoxNSwiT1BFTl9CTE9DSyI6MTYsInNleHByIjoxNywiQ0xPU0UiOjE4LCJPUEVOX0lO
VkVSU0UiOjE5LCJPUEVOX0VOREJMT0NLIjoyMCwicGF0aCI6MjEsIk9QRU4iOjIyLCJPUEVOX1VO
RVNDQVBFRCI6MjMsIkNMT1NFX1VORVNDQVBFRCI6MjQsIk9QRU5fUEFSVElBTCI6MjUsInBhcnRp
YWxOYW1lIjoyNiwicGFydGlhbF9vcHRpb24wIjoyNywic2V4cHJfcmVwZXRpdGlvbjAiOjI4LCJz
ZXhwcl9vcHRpb24wIjoyOSwiZGF0YU5hbWUiOjMwLCJwYXJhbSI6MzEsIlNUUklORyI6MzIsIklO
VEVHRVIiOjMzLCJCT09MRUFOIjozNCwiT1BFTl9TRVhQUiI6MzUsIkNMT1NFX1NFWFBSIjozNiwi
aGFzaCI6MzcsImhhc2hfcmVwZXRpdGlvbl9wbHVzMCI6MzgsImhhc2hTZWdtZW50IjozOSwiSUQi
OjQwLCJFUVVBTFMiOjQxLCJEQVRBIjo0MiwicGF0aFNlZ21lbnRzIjo0MywiU0VQIjo0NCwiJGFj
Y2VwdCI6MCwiJGVuZCI6MX0sCisgIHRlcm1pbmFsc186IHsyOiJlcnJvciIsNToiRU9GIiwxNDoi
Q09OVEVOVCIsMTU6IkNPTU1FTlQiLDE2OiJPUEVOX0JMT0NLIiwxODoiQ0xPU0UiLDE5OiJPUEVO
X0lOVkVSU0UiLDIwOiJPUEVOX0VOREJMT0NLIiwyMjoiT1BFTiIsMjM6Ik9QRU5fVU5FU0NBUEVE
IiwyNDoiQ0xPU0VfVU5FU0NBUEVEIiwyNToiT1BFTl9QQVJUSUFMIiwzMjoiU1RSSU5HIiwzMzoi
SU5URUdFUiIsMzQ6IkJPT0xFQU4iLDM1OiJPUEVOX1NFWFBSIiwzNjoiQ0xPU0VfU0VYUFIiLDQw
OiJJRCIsNDE6IkVRVUFMUyIsNDI6IkRBVEEiLDQ0OiJTRVAifSwKKyAgcHJvZHVjdGlvbnNfOiBb
MCxbMywyXSxbMywxXSxbNiwyXSxbNiwzXSxbNiwyXSxbNiwxXSxbNiwxXSxbNiwwXSxbNCwxXSxb
NCwyXSxbOCwzXSxbOCwzXSxbOCwxXSxbOCwxXSxbOCwxXSxbOCwxXSxbMTEsM10sWzksM10sWzEw
LDNdLFsxMiwzXSxbMTIsM10sWzEzLDRdLFs3LDJdLFsxNywzXSxbMTcsMV0sWzMxLDFdLFszMSwx
XSxbMzEsMV0sWzMxLDFdLFszMSwxXSxbMzEsM10sWzM3LDFdLFszOSwzXSxbMjYsMV0sWzI2LDFd
LFsyNiwxXSxbMzAsMl0sWzIxLDFdLFs0MywzXSxbNDMsMV0sWzI3LDBdLFsyNywxXSxbMjgsMF0s
WzI4LDJdLFsyOSwwXSxbMjksMV0sWzM4LDFdLFszOCwyXV0sCisgIHBlcmZvcm1BY3Rpb246IGZ1
bmN0aW9uIGFub255bW91cyh5eXRleHQseXlsZW5nLHl5bGluZW5vLHl5LHl5c3RhdGUsJCQsXyQp
IHsKKworICB2YXIgJDAgPSAkJC5sZW5ndGggLSAxOworICBzd2l0Y2ggKHl5c3RhdGUpIHsKKyAg
Y2FzZSAxOiByZXR1cm4gbmV3IHl5LlByb2dyYW1Ob2RlKCQkWyQwLTFdLCB0aGlzLl8kKTsgCisg
IGJyZWFrOworICBjYXNlIDI6IHJldHVybiBuZXcgeXkuUHJvZ3JhbU5vZGUoW10sIHRoaXMuXyQp
OyAKKyAgYnJlYWs7CisgIGNhc2UgMzp0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoW10sICQk
WyQwLTFdLCAkJFskMF0sIHRoaXMuXyQpOworICBicmVhazsKKyAgY2FzZSA0OnRoaXMuJCA9IG5l
dyB5eS5Qcm9ncmFtTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0sICQkWyQwXSwgdGhpcy5fJCk7Cisg
IGJyZWFrOworICBjYXNlIDU6dGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKCQkWyQwLTFdLCAk
JFskMF0sIFtdLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgNjp0aGlzLiQgPSBuZXcgeXku
UHJvZ3JhbU5vZGUoJCRbJDBdLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgNzp0aGlzLiQg
PSBuZXcgeXkuUHJvZ3JhbU5vZGUoW10sIHRoaXMuXyQpOworICBicmVhazsKKyAgY2FzZSA4OnRo
aXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgdGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNl
IDk6dGhpcy4kID0gWyQkWyQwXV07CisgIGJyZWFrOworICBjYXNlIDEwOiAkJFskMC0xXS5wdXNo
KCQkWyQwXSk7IHRoaXMuJCA9ICQkWyQwLTFdOyAKKyAgYnJlYWs7CisgIGNhc2UgMTE6dGhpcy4k
ID0gbmV3IHl5LkJsb2NrTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0uaW52ZXJzZSwgJCRbJDAtMV0s
ICQkWyQwXSwgdGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNlIDEyOnRoaXMuJCA9IG5ldyB5eS5C
bG9ja05vZGUoJCRbJDAtMl0sICQkWyQwLTFdLCAkJFskMC0xXS5pbnZlcnNlLCAkJFskMF0sIHRo
aXMuXyQpOworICBicmVhazsKKyAgY2FzZSAxMzp0aGlzLiQgPSAkJFskMF07CisgIGJyZWFrOwor
ICBjYXNlIDE0OnRoaXMuJCA9ICQkWyQwXTsKKyAgYnJlYWs7CisgIGNhc2UgMTU6dGhpcy4kID0g
bmV3IHl5LkNvbnRlbnROb2RlKCQkWyQwXSwgdGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNlIDE2
OnRoaXMuJCA9IG5ldyB5eS5Db21tZW50Tm9kZSgkJFskMF0sIHRoaXMuXyQpOworICBicmVhazsK
KyAgY2FzZSAxNzp0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQkWyQwLTFdLCBudWxsLCAk
JFskMC0yXSwgc3RyaXBGbGFncygkJFskMC0yXSwgJCRbJDBdKSwgdGhpcy5fJCk7CisgIGJyZWFr
OworICBjYXNlIDE4OnRoaXMuJCA9IG5ldyB5eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV0sIG51bGws
ICQkWyQwLTJdLCBzdHJpcEZsYWdzKCQkWyQwLTJdLCAkJFskMF0pLCB0aGlzLl8kKTsKKyAgYnJl
YWs7CisgIGNhc2UgMTk6dGhpcy4kID0ge3BhdGg6ICQkWyQwLTFdLCBzdHJpcDogc3RyaXBGbGFn
cygkJFskMC0yXSwgJCRbJDBdKX07CisgIGJyZWFrOworICBjYXNlIDIwOnRoaXMuJCA9IG5ldyB5
eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV0sIG51bGwsICQkWyQwLTJdLCBzdHJpcEZsYWdzKCQkWyQw
LTJdLCAkJFskMF0pLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgMjE6dGhpcy4kID0gbmV3
IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlwRmxhZ3MoJCRb
JDAtMl0sICQkWyQwXSksIHRoaXMuXyQpOworICBicmVhazsKKyAgY2FzZSAyMjp0aGlzLiQgPSBu
ZXcgeXkuUGFydGlhbE5vZGUoJCRbJDAtMl0sICQkWyQwLTFdLCBzdHJpcEZsYWdzKCQkWyQwLTNd
LCAkJFskMF0pLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgMjM6dGhpcy4kID0gc3RyaXBG
bGFncygkJFskMC0xXSwgJCRbJDBdKTsKKyAgYnJlYWs7CisgIGNhc2UgMjQ6dGhpcy4kID0gbmV3
IHl5LlNleHByTm9kZShbJCRbJDAtMl1dLmNvbmNhdCgkJFskMC0xXSksICQkWyQwXSwgdGhpcy5f
JCk7CisgIGJyZWFrOworICBjYXNlIDI1OnRoaXMuJCA9IG5ldyB5eS5TZXhwck5vZGUoWyQkWyQw
XV0sIG51bGwsIHRoaXMuXyQpOworICBicmVhazsKKyAgY2FzZSAyNjp0aGlzLiQgPSAkJFskMF07
CisgIGJyZWFrOworICBjYXNlIDI3OnRoaXMuJCA9IG5ldyB5eS5TdHJpbmdOb2RlKCQkWyQwXSwg
dGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNlIDI4OnRoaXMuJCA9IG5ldyB5eS5JbnRlZ2VyTm9k
ZSgkJFskMF0sIHRoaXMuXyQpOworICBicmVhazsKKyAgY2FzZSAyOTp0aGlzLiQgPSBuZXcgeXku
Qm9vbGVhbk5vZGUoJCRbJDBdLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgMzA6dGhpcy4k
ID0gJCRbJDBdOworICBicmVhazsKKyAgY2FzZSAzMTokJFskMC0xXS5pc0hlbHBlciA9IHRydWU7
IHRoaXMuJCA9ICQkWyQwLTFdOworICBicmVhazsKKyAgY2FzZSAzMjp0aGlzLiQgPSBuZXcgeXku
SGFzaE5vZGUoJCRbJDBdLCB0aGlzLl8kKTsKKyAgYnJlYWs7CisgIGNhc2UgMzM6dGhpcy4kID0g
WyQkWyQwLTJdLCAkJFskMF1dOworICBicmVhazsKKyAgY2FzZSAzNDp0aGlzLiQgPSBuZXcgeXku
UGFydGlhbE5hbWVOb2RlKCQkWyQwXSwgdGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNlIDM1OnRo
aXMuJCA9IG5ldyB5eS5QYXJ0aWFsTmFtZU5vZGUobmV3IHl5LlN0cmluZ05vZGUoJCRbJDBdLCB0
aGlzLl8kKSwgdGhpcy5fJCk7CisgIGJyZWFrOworICBjYXNlIDM2OnRoaXMuJCA9IG5ldyB5eS5Q
YXJ0aWFsTmFtZU5vZGUobmV3IHl5LkludGVnZXJOb2RlKCQkWyQwXSwgdGhpcy5fJCkpOworICBi
cmVhazsKKyAgY2FzZSAzNzp0aGlzLiQgPSBuZXcgeXkuRGF0YU5vZGUoJCRbJDBdLCB0aGlzLl8k
KTsKKyAgYnJlYWs7CisgIGNhc2UgMzg6dGhpcy4kID0gbmV3IHl5LklkTm9kZSgkJFskMF0sIHRo
aXMuXyQpOworICBicmVhazsKKyAgY2FzZSAzOTogJCRbJDAtMl0ucHVzaCh7cGFydDogJCRbJDBd
LCBzZXBhcmF0b3I6ICQkWyQwLTFdfSk7IHRoaXMuJCA9ICQkWyQwLTJdOyAKKyAgYnJlYWs7Cisg
IGNhc2UgNDA6dGhpcy4kID0gW3twYXJ0OiAkJFskMF19XTsKKyAgYnJlYWs7CisgIGNhc2UgNDM6
dGhpcy4kID0gW107CisgIGJyZWFrOworICBjYXNlIDQ0OiQkWyQwLTFdLnB1c2goJCRbJDBdKTsK
KyAgYnJlYWs7CisgIGNhc2UgNDc6dGhpcy4kID0gWyQkWyQwXV07CisgIGJyZWFrOworICBjYXNl
IDQ4OiQkWyQwLTFdLnB1c2goJCRbJDBdKTsKKyAgYnJlYWs7CisgIH0KKyAgfSwKKyAgdGFibGU6
IFt7MzoxLDQ6Miw1OlsxLDNdLDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEs
MTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsx
OlszXX0sezU6WzEsMTZdLDg6MTcsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEw
XSwxNjpbMSwxMl0sMTk6WzEsMTFdLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7MTpb
MiwyXX0sezU6WzIsOV0sMTQ6WzIsOV0sMTU6WzIsOV0sMTY6WzIsOV0sMTk6WzIsOV0sMjA6WzIs
OV0sMjI6WzIsOV0sMjM6WzIsOV0sMjU6WzIsOV19LHs0OjIwLDY6MTgsNzoxOSw4OjQsOTo1LDEx
OjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0sMTk6WzEsMjFdLDIwOlsy
LDhdLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NDoyMCw2OjIyLDc6MTksODo0LDk6
NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5OlsxLDIxXSwy
MDpbMiw4XSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1OlsxLDE1XX0sezU6WzIsMTNdLDE0OlsyLDEz
XSwxNTpbMiwxM10sMTY6WzIsMTNdLDE5OlsyLDEzXSwyMDpbMiwxM10sMjI6WzIsMTNdLDIzOlsy
LDEzXSwyNTpbMiwxM119LHs1OlsyLDE0XSwxNDpbMiwxNF0sMTU6WzIsMTRdLDE2OlsyLDE0XSwx
OTpbMiwxNF0sMjA6WzIsMTRdLDIyOlsyLDE0XSwyMzpbMiwxNF0sMjU6WzIsMTRdfSx7NTpbMiwx
NV0sMTQ6WzIsMTVdLDE1OlsyLDE1XSwxNjpbMiwxNV0sMTk6WzIsMTVdLDIwOlsyLDE1XSwyMjpb
MiwxNV0sMjM6WzIsMTVdLDI1OlsyLDE1XX0sezU6WzIsMTZdLDE0OlsyLDE2XSwxNTpbMiwxNl0s
MTY6WzIsMTZdLDE5OlsyLDE2XSwyMDpbMiwxNl0sMjI6WzIsMTZdLDIzOlsyLDE2XSwyNTpbMiwx
Nl19LHsxNzoyMywyMToyNCwzMDoyNSw0MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTc6Mjks
MjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsxLDI3XSw0MzoyNn0sezE3OjMwLDIxOjI0LDMwOjI1
LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9LHsxNzozMSwyMToyNCwzMDoyNSw0MDpbMSwyOF0s
NDI6WzEsMjddLDQzOjI2fSx7MjE6MzMsMjY6MzIsMzI6WzEsMzRdLDMzOlsxLDM1XSw0MDpbMSwy
OF0sNDM6MjZ9LHsxOlsyLDFdfSx7NTpbMiwxMF0sMTQ6WzIsMTBdLDE1OlsyLDEwXSwxNjpbMiwx
MF0sMTk6WzIsMTBdLDIwOlsyLDEwXSwyMjpbMiwxMF0sMjM6WzIsMTBdLDI1OlsyLDEwXX0sezEw
OjM2LDIwOlsxLDM3XX0sezQ6MzgsODo0LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpb
MSwxMF0sMTY6WzEsMTJdLDE5OlsxLDExXSwyMDpbMiw3XSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1
OlsxLDE1XX0sezc6MzksODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBd
LDE2OlsxLDEyXSwxOTpbMSwyMV0sMjA6WzIsNl0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwx
NV19LHsxNzoyMywxODpbMSw0MF0sMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsxLDI3XSw0Mzoy
Nn0sezEwOjQxLDIwOlsxLDM3XX0sezE4OlsxLDQyXX0sezE4OlsyLDQzXSwyNDpbMiw0M10sMjg6
NDMsMzI6WzIsNDNdLDMzOlsyLDQzXSwzNDpbMiw0M10sMzU6WzIsNDNdLDM2OlsyLDQzXSw0MDpb
Miw0M10sNDI6WzIsNDNdfSx7MTg6WzIsMjVdLDI0OlsyLDI1XSwzNjpbMiwyNV19LHsxODpbMiwz
OF0sMjQ6WzIsMzhdLDMyOlsyLDM4XSwzMzpbMiwzOF0sMzQ6WzIsMzhdLDM1OlsyLDM4XSwzNjpb
MiwzOF0sNDA6WzIsMzhdLDQyOlsyLDM4XSw0NDpbMSw0NF19LHsyMTo0NSw0MDpbMSwyOF0sNDM6
MjZ9LHsxODpbMiw0MF0sMjQ6WzIsNDBdLDMyOlsyLDQwXSwzMzpbMiw0MF0sMzQ6WzIsNDBdLDM1
OlsyLDQwXSwzNjpbMiw0MF0sNDA6WzIsNDBdLDQyOlsyLDQwXSw0NDpbMiw0MF19LHsxODpbMSw0
Nl19LHsxODpbMSw0N119LHsyNDpbMSw0OF19LHsxODpbMiw0MV0sMjE6NTAsMjc6NDksNDA6WzEs
MjhdLDQzOjI2fSx7MTg6WzIsMzRdLDQwOlsyLDM0XX0sezE4OlsyLDM1XSw0MDpbMiwzNV19LHsx
ODpbMiwzNl0sNDA6WzIsMzZdfSx7NTpbMiwxMV0sMTQ6WzIsMTFdLDE1OlsyLDExXSwxNjpbMiwx
MV0sMTk6WzIsMTFdLDIwOlsyLDExXSwyMjpbMiwxMV0sMjM6WzIsMTFdLDI1OlsyLDExXX0sezIx
OjUxLDQwOlsxLDI4XSw0MzoyNn0sezg6MTcsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1
OlsxLDEwXSwxNjpbMSwxMl0sMTk6WzEsMTFdLDIwOlsyLDNdLDIyOlsxLDEzXSwyMzpbMSwxNF0s
MjU6WzEsMTVdfSx7NDo1Miw4OjQsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEw
XSwxNjpbMSwxMl0sMTk6WzEsMTFdLDIwOlsyLDVdLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEs
MTVdfSx7MTQ6WzIsMjNdLDE1OlsyLDIzXSwxNjpbMiwyM10sMTk6WzIsMjNdLDIwOlsyLDIzXSwy
MjpbMiwyM10sMjM6WzIsMjNdLDI1OlsyLDIzXX0sezU6WzIsMTJdLDE0OlsyLDEyXSwxNTpbMiwx
Ml0sMTY6WzIsMTJdLDE5OlsyLDEyXSwyMDpbMiwxMl0sMjI6WzIsMTJdLDIzOlsyLDEyXSwyNTpb
MiwxMl19LHsxNDpbMiwxOF0sMTU6WzIsMThdLDE2OlsyLDE4XSwxOTpbMiwxOF0sMjA6WzIsMThd
LDIyOlsyLDE4XSwyMzpbMiwxOF0sMjU6WzIsMThdfSx7MTg6WzIsNDVdLDIxOjU2LDI0OlsyLDQ1
XSwyOTo1MywzMDo2MCwzMTo1NCwzMjpbMSw1N10sMzM6WzEsNThdLDM0OlsxLDU5XSwzNTpbMSw2
MV0sMzY6WzIsNDVdLDM3OjU1LDM4OjYyLDM5OjYzLDQwOlsxLDY0XSw0MjpbMSwyN10sNDM6MjZ9
LHs0MDpbMSw2NV19LHsxODpbMiwzN10sMjQ6WzIsMzddLDMyOlsyLDM3XSwzMzpbMiwzN10sMzQ6
WzIsMzddLDM1OlsyLDM3XSwzNjpbMiwzN10sNDA6WzIsMzddLDQyOlsyLDM3XX0sezE0OlsyLDE3
XSwxNTpbMiwxN10sMTY6WzIsMTddLDE5OlsyLDE3XSwyMDpbMiwxN10sMjI6WzIsMTddLDIzOlsy
LDE3XSwyNTpbMiwxN119LHs1OlsyLDIwXSwxNDpbMiwyMF0sMTU6WzIsMjBdLDE2OlsyLDIwXSwx
OTpbMiwyMF0sMjA6WzIsMjBdLDIyOlsyLDIwXSwyMzpbMiwyMF0sMjU6WzIsMjBdfSx7NTpbMiwy
MV0sMTQ6WzIsMjFdLDE1OlsyLDIxXSwxNjpbMiwyMV0sMTk6WzIsMjFdLDIwOlsyLDIxXSwyMjpb
MiwyMV0sMjM6WzIsMjFdLDI1OlsyLDIxXX0sezE4OlsxLDY2XX0sezE4OlsyLDQyXX0sezE4Olsx
LDY3XX0sezg6MTcsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwx
Ml0sMTk6WzEsMTFdLDIwOlsyLDRdLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7MTg6
WzIsMjRdLDI0OlsyLDI0XSwzNjpbMiwyNF19LHsxODpbMiw0NF0sMjQ6WzIsNDRdLDMyOlsyLDQ0
XSwzMzpbMiw0NF0sMzQ6WzIsNDRdLDM1OlsyLDQ0XSwzNjpbMiw0NF0sNDA6WzIsNDRdLDQyOlsy
LDQ0XX0sezE4OlsyLDQ2XSwyNDpbMiw0Nl0sMzY6WzIsNDZdfSx7MTg6WzIsMjZdLDI0OlsyLDI2
XSwzMjpbMiwyNl0sMzM6WzIsMjZdLDM0OlsyLDI2XSwzNTpbMiwyNl0sMzY6WzIsMjZdLDQwOlsy
LDI2XSw0MjpbMiwyNl19LHsxODpbMiwyN10sMjQ6WzIsMjddLDMyOlsyLDI3XSwzMzpbMiwyN10s
MzQ6WzIsMjddLDM1OlsyLDI3XSwzNjpbMiwyN10sNDA6WzIsMjddLDQyOlsyLDI3XX0sezE4Olsy
LDI4XSwyNDpbMiwyOF0sMzI6WzIsMjhdLDMzOlsyLDI4XSwzNDpbMiwyOF0sMzU6WzIsMjhdLDM2
OlsyLDI4XSw0MDpbMiwyOF0sNDI6WzIsMjhdfSx7MTg6WzIsMjldLDI0OlsyLDI5XSwzMjpbMiwy
OV0sMzM6WzIsMjldLDM0OlsyLDI5XSwzNTpbMiwyOV0sMzY6WzIsMjldLDQwOlsyLDI5XSw0Mjpb
MiwyOV19LHsxODpbMiwzMF0sMjQ6WzIsMzBdLDMyOlsyLDMwXSwzMzpbMiwzMF0sMzQ6WzIsMzBd
LDM1OlsyLDMwXSwzNjpbMiwzMF0sNDA6WzIsMzBdLDQyOlsyLDMwXX0sezE3OjY4LDIxOjI0LDMw
OjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9LHsxODpbMiwzMl0sMjQ6WzIsMzJdLDM2Olsy
LDMyXSwzOTo2OSw0MDpbMSw3MF19LHsxODpbMiw0N10sMjQ6WzIsNDddLDM2OlsyLDQ3XSw0MDpb
Miw0N119LHsxODpbMiw0MF0sMjQ6WzIsNDBdLDMyOlsyLDQwXSwzMzpbMiw0MF0sMzQ6WzIsNDBd
LDM1OlsyLDQwXSwzNjpbMiw0MF0sNDA6WzIsNDBdLDQxOlsxLDcxXSw0MjpbMiw0MF0sNDQ6WzIs
NDBdfSx7MTg6WzIsMzldLDI0OlsyLDM5XSwzMjpbMiwzOV0sMzM6WzIsMzldLDM0OlsyLDM5XSwz
NTpbMiwzOV0sMzY6WzIsMzldLDQwOlsyLDM5XSw0MjpbMiwzOV0sNDQ6WzIsMzldfSx7NTpbMiwy
Ml0sMTQ6WzIsMjJdLDE1OlsyLDIyXSwxNjpbMiwyMl0sMTk6WzIsMjJdLDIwOlsyLDIyXSwyMjpb
MiwyMl0sMjM6WzIsMjJdLDI1OlsyLDIyXX0sezU6WzIsMTldLDE0OlsyLDE5XSwxNTpbMiwxOV0s
MTY6WzIsMTldLDE5OlsyLDE5XSwyMDpbMiwxOV0sMjI6WzIsMTldLDIzOlsyLDE5XSwyNTpbMiwx
OV19LHszNjpbMSw3Ml19LHsxODpbMiw0OF0sMjQ6WzIsNDhdLDM2OlsyLDQ4XSw0MDpbMiw0OF19
LHs0MTpbMSw3MV19LHsyMTo1NiwzMDo2MCwzMTo3MywzMjpbMSw1N10sMzM6WzEsNThdLDM0Olsx
LDU5XSwzNTpbMSw2MV0sNDA6WzEsMjhdLDQyOlsxLDI3XSw0MzoyNn0sezE4OlsyLDMxXSwyNDpb
MiwzMV0sMzI6WzIsMzFdLDMzOlsyLDMxXSwzNDpbMiwzMV0sMzU6WzIsMzFdLDM2OlsyLDMxXSw0
MDpbMiwzMV0sNDI6WzIsMzFdfSx7MTg6WzIsMzNdLDI0OlsyLDMzXSwzNjpbMiwzM10sNDA6WzIs
MzNdfV0sCisgIGRlZmF1bHRBY3Rpb25zOiB7MzpbMiwyXSwxNjpbMiwxXSw1MDpbMiw0Ml19LAor
ICBwYXJzZUVycm9yOiBmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgeworICAgICAgdGhy
b3cgbmV3IEVycm9yKHN0cik7CisgIH0sCisgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShpbnB1dCkg
eworICAgICAgdmFyIHNlbGYgPSB0aGlzLCBzdGFjayA9IFswXSwgdnN0YWNrID0gW251bGxdLCBs
c3RhY2sgPSBbXSwgdGFibGUgPSB0aGlzLnRhYmxlLCB5eXRleHQgPSAiIiwgeXlsaW5lbm8gPSAw
LCB5eWxlbmcgPSAwLCByZWNvdmVyaW5nID0gMCwgVEVSUk9SID0gMiwgRU9GID0gMTsKKyAgICAg
IHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpOworICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMu
eXk7CisgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjsKKyAgICAgIHRoaXMueXkucGFy
c2VyID0gdGhpczsKKyAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gInVuZGVm
aW5lZCIpCisgICAgICAgICAgdGhpcy5sZXhlci55eWxsb2MgPSB7fTsKKyAgICAgIHZhciB5eWxv
YyA9IHRoaXMubGV4ZXIueXlsbG9jOworICAgICAgbHN0YWNrLnB1c2goeXlsb2MpOworICAgICAg
dmFyIHJhbmdlcyA9IHRoaXMubGV4ZXIub3B0aW9ucyAmJiB0aGlzLmxleGVyLm9wdGlvbnMucmFu
Z2VzOworICAgICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09ICJmdW5jdGlvbiIp
CisgICAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdGhpcy55eS5wYXJzZUVycm9yOworICAgICAg
ZnVuY3Rpb24gcG9wU3RhY2sobikgeworICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxl
bmd0aCAtIDIgKiBuOworICAgICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0g
bjsKKyAgICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47CisgICAgICB9
CisgICAgICBmdW5jdGlvbiBsZXgoKSB7CisgICAgICAgICAgdmFyIHRva2VuOworICAgICAgICAg
IHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxOworICAgICAgICAgIGlmICh0eXBlb2YgdG9r
ZW4gIT09ICJudW1iZXIiKSB7CisgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5zeW1ib2xzX1t0
b2tlbl0gfHwgdG9rZW47CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAg
ICAgIH0KKyAgICAgIHZhciBzeW1ib2wsIHByZUVycm9yU3ltYm9sLCBzdGF0ZSwgYWN0aW9uLCBh
LCByLCB5eXZhbCA9IHt9LCBwLCBsZW4sIG5ld1N0YXRlLCBleHBlY3RlZDsKKyAgICAgIHdoaWxl
ICh0cnVlKSB7CisgICAgICAgICAgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKKyAg
ICAgICAgICBpZiAodGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV0pIHsKKyAgICAgICAgICAgICAg
YWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uc1tzdGF0ZV07CisgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgaWYgKHN5bWJvbCA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ltYm9sID09ICJ1
bmRlZmluZWQiKSB7CisgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTsKKyAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICBhY3Rpb24gPSB0YWJsZVtzdGF0ZV0gJiYgdGFibGVbc3Rh
dGVdW3N5bWJvbF07CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09
PSAidW5kZWZpbmVkIiB8fCAhYWN0aW9uLmxlbmd0aCB8fCAhYWN0aW9uWzBdKSB7CisgICAgICAg
ICAgICAgIHZhciBlcnJTdHIgPSAiIjsKKyAgICAgICAgICAgICAgaWYgKCFyZWNvdmVyaW5nKSB7
CisgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFtdOworICAgICAgICAgICAgICAgICAgZm9y
IChwIGluIHRhYmxlW3N0YXRlXSkKKyAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXJt
aW5hbHNfW3BdICYmIHAgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVk
LnB1c2goIiciICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgIiciKTsKKyAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zaG93UG9zaXRpb24pIHsK
KyAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsg
KHl5bGluZW5vICsgMSkgKyAiOlxuIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyAiXG5F
eHBlY3RpbmcgIiArIGV4cGVjdGVkLmpvaW4oIiwgIikgKyAiLCBnb3QgJyIgKyAodGhpcy50ZXJt
aW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sKSArICInIjsKKyAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlBhcnNlIGVycm9yIG9uIGxpbmUg
IiArICh5eWxpbmVubyArIDEpICsgIjogVW5leHBlY3RlZCAiICsgKHN5bWJvbCA9PSAxPyJlbmQg
b2YgaW5wdXQiOiInIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgIici
KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VFcnJv
cihlcnJTdHIsIHt0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLCB0b2tlbjogdGhpcy50ZXJtaW5hbHNf
W3N5bWJvbF0gfHwgc3ltYm9sLCBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLCBsb2M6IHl5bG9j
LCBleHBlY3RlZDogZXhwZWN0ZWR9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg
ICAgICAgICBpZiAoYWN0aW9uWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgYWN0aW9uLmxlbmd0aCA+
IDEpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlw
bGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIiArIHN0YXRlICsgIiwgdG9rZW46ICIgKyBz
eW1ib2wpOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkgeworICAg
ICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChzeW1ib2wpOworICAgICAg
ICAgICAgICB2c3RhY2sucHVzaCh0aGlzLmxleGVyLnl5dGV4dCk7CisgICAgICAgICAgICAgIGxz
dGFjay5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKTsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChh
Y3Rpb25bMV0pOworICAgICAgICAgICAgICBzeW1ib2wgPSBudWxsOworICAgICAgICAgICAgICBp
ZiAoIXByZUVycm9yU3ltYm9sKSB7CisgICAgICAgICAgICAgICAgICB5eWxlbmcgPSB0aGlzLmxl
eGVyLnl5bGVuZzsKKyAgICAgICAgICAgICAgICAgIHl5dGV4dCA9IHRoaXMubGV4ZXIueXl0ZXh0
OworICAgICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vOworICAg
ICAgICAgICAgICAgICAgeXlsb2MgPSB0aGlzLmxleGVyLnl5bGxvYzsKKyAgICAgICAgICAgICAg
ICAgIGlmIChyZWNvdmVyaW5nID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyaW5n
LS07CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBw
cmVFcnJvclN5bWJvbDsKKyAgICAgICAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gbnVsbDsK
KyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6
CisgICAgICAgICAgICAgIGxlbiA9IHRoaXMucHJvZHVjdGlvbnNfW2FjdGlvblsxXV1bMV07Cisg
ICAgICAgICAgICAgIHl5dmFsLiQgPSB2c3RhY2tbdnN0YWNrLmxlbmd0aCAtIGxlbl07CisgICAg
ICAgICAgICAgIHl5dmFsLl8kID0ge2ZpcnN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0g
KGxlbiB8fCAxKV0uZmlyc3RfbGluZSwgbGFzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAt
IDFdLmxhc3RfbGluZSwgZmlyc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4g
fHwgMSldLmZpcnN0X2NvbHVtbiwgbGFzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0g
MV0ubGFzdF9jb2x1bW59OworICAgICAgICAgICAgICBpZiAocmFuZ2VzKSB7CisgICAgICAgICAg
ICAgICAgICB5eXZhbC5fJC5yYW5nZSA9IFtsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwg
MSldLnJhbmdlWzBdLCBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIDFdLnJhbmdlWzFdXTsKKyAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICByID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwoeXl2
YWwsIHl5dGV4dCwgeXlsZW5nLCB5eWxpbmVubywgdGhpcy55eSwgYWN0aW9uWzFdLCB2c3RhY2ss
IGxzdGFjayk7CisgICAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gInVuZGVmaW5lZCIpIHsK
KyAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwg
LTEgKiBsZW4gKiAyKTsKKyAgICAgICAgICAgICAgICAgIHZzdGFjayA9IHZzdGFjay5zbGljZSgw
LCAtMSAqIGxlbik7CisgICAgICAgICAgICAgICAgICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwg
LTEgKiBsZW4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhp
cy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVswXSk7CisgICAgICAgICAgICAgIHZzdGFjay5wdXNo
KHl5dmFsLiQpOworICAgICAgICAgICAgICBsc3RhY2sucHVzaCh5eXZhbC5fJCk7CisgICAgICAg
ICAgICAgIG5ld1N0YXRlID0gdGFibGVbc3RhY2tbc3RhY2subGVuZ3RoIC0gMl1dW3N0YWNrW3N0
YWNrLmxlbmd0aCAtIDFdXTsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7Cisg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgIH0K
ICAgfTsKIAotICBIYW5kbGViYXJzLkFTVC5Cb29sZWFuTm9kZSA9IGZ1bmN0aW9uKGJvb2wpIHsK
LSAgICB0aGlzLnR5cGUgPSAiQk9PTEVBTiI7Ci0gICAgdGhpcy5ib29sID0gYm9vbDsKLSAgICB0
aGlzLnN0cmluZ01vZGVWYWx1ZSA9IGJvb2wgPT09ICJ0cnVlIjsKLSAgfTsKIAotICBIYW5kbGVi
YXJzLkFTVC5Db21tZW50Tm9kZSA9IGZ1bmN0aW9uKGNvbW1lbnQpIHsKLSAgICB0aGlzLnR5cGUg
PSAiY29tbWVudCI7Ci0gICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKLSAgfTsKKyAgZnVuY3Rp
b24gc3RyaXBGbGFncyhvcGVuLCBjbG9zZSkgeworICAgIHJldHVybiB7CisgICAgICBsZWZ0OiBv
cGVuLmNoYXJBdCgyKSA9PT0gJ34nLAorICAgICAgcmlnaHQ6IGNsb3NlLmNoYXJBdCgwKSA9PT0g
J34nIHx8IGNsb3NlLmNoYXJBdCgxKSA9PT0gJ34nCisgICAgfTsKKyAgfQogCi19KSgpOzsKLS8v
IGxpYi9oYW5kbGViYXJzL3V0aWxzLmpzCisgIC8qIEppc29uIGdlbmVyYXRlZCBsZXhlciAqLwor
ICB2YXIgbGV4ZXIgPSAoZnVuY3Rpb24oKXsKKyAgdmFyIGxleGVyID0gKHtFT0Y6MSwKKyAgcGFy
c2VFcnJvcjpmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgeworICAgICAgICAgIGlmICh0
aGlzLnl5LnBhcnNlcikgeworICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9y
KHN0ciwgaGFzaCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKHN0cik7CisgICAgICAgICAgfQorICAgICAgfSwKKyAgc2V0SW5wdXQ6ZnVuY3Rpb24g
KGlucHV0KSB7CisgICAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsKKyAgICAgICAgICB0aGlz
Ll9tb3JlID0gdGhpcy5fbGVzcyA9IHRoaXMuZG9uZSA9IGZhbHNlOworICAgICAgICAgIHRoaXMu
eXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7CisgICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlz
Lm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7CisgICAgICAgICAgdGhpcy5jb25kaXRpb25TdGFj
ayA9IFsnSU5JVElBTCddOworICAgICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6MSxm
aXJzdF9jb2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2NvbHVtbjowfTsKKyAgICAgICAgICBpZiAo
dGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2UgPSBbMCwwXTsKKyAgICAgICAg
ICB0aGlzLm9mZnNldCA9IDA7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9LAorICBp
bnB1dDpmdW5jdGlvbiAoKSB7CisgICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07Cisg
ICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7CisgICAgICAgICAgdGhpcy55eWxlbmcrKzsKKyAg
ICAgICAgICB0aGlzLm9mZnNldCsrOworICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7CisgICAg
ICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOworICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNo
KC8oPzpcclxuP3xcbikuKi9nKTsKKyAgICAgICAgICBpZiAobGluZXMpIHsKKyAgICAgICAgICAg
ICAgdGhpcy55eWxpbmVubysrOworICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUr
KzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2Nv
bHVtbisrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykg
dGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKIAotdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9u
JywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcics
ICdzdGFjayddOworICAgICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UoMSk7
CisgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgfSwKKyAgdW5wdXQ6ZnVuY3Rpb24gKGNoKSB7
CisgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKKyAgICAgICAgICB2YXIgbGluZXMgPSBj
aC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOworCisgICAgICAgICAgdGhpcy5faW5wdXQgPSBjaCAr
IHRoaXMuX2lucHV0OworICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3Ry
KDAsIHRoaXMueXl0ZXh0Lmxlbmd0aC1sZW4tMSk7CisgICAgICAgICAgLy90aGlzLnl5bGVuZyAt
PSBsZW47CisgICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOworICAgICAgICAgIHZhciBvbGRM
aW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKKyAgICAgICAgICB0aGlz
Lm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGgtMSk7CisgICAg
ICAgICAgdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQu
bGVuZ3RoLTEpOworCisgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aC0xKSB0aGlzLnl5bGluZW5v
IC09IGxpbmVzLmxlbmd0aC0xOworICAgICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7
CisKKyAgICAgICAgICB0aGlzLnl5bGxvYyA9IHtmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJz
dF9saW5lLAorICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEsCisgICAgICAg
ICAgICBmaXJzdF9jb2x1bW46IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiwKKyAgICAgICAgICAg
IGxhc3RfY29sdW1uOiBsaW5lcyA/CisgICAgICAgICAgICAgICAgKGxpbmVzLmxlbmd0aCA9PT0g
b2xkTGluZXMubGVuZ3RoID8gdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkgKyBvbGRMaW5l
c1tvbGRMaW5lcy5sZW5ndGggLSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVzWzBdLmxlbmd0
aDoKKyAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgeworICAgICAg
ICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBs
ZW5dOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0sCisgIG1v
cmU6ZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOworICAgICAgICAg
IHJldHVybiB0aGlzOworICAgICAgfSwKKyAgbGVzczpmdW5jdGlvbiAobikgeworICAgICAgICAg
IHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7CisgICAgICB9LAorICBwYXN0SW5wdXQ6
ZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigw
LCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpOworICAgICAgICAgIHJl
dHVybiAocGFzdC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSArIHBhc3Quc3Vic3RyKC0yMCkucmVw
bGFjZSgvXG4vZywgIiIpOworICAgICAgfSwKKyAgdXBjb21pbmdJbnB1dDpmdW5jdGlvbiAoKSB7
CisgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLm1hdGNoOworICAgICAgICAgIGlmIChuZXh0Lmxl
bmd0aCA8IDIwKSB7CisgICAgICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQuc3Vic3RyKDAs
IDIwLW5leHQubGVuZ3RoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIChuZXh0LnN1
YnN0cigwLDIwKSsobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSkucmVwbGFjZSgvXG4vZywg
IiIpOworICAgICAgfSwKKyAgc2hvd1Bvc2l0aW9uOmZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB2
YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTsKKyAgICAgICAgICB2YXIgYyA9IG5ldyBBcnJheShw
cmUubGVuZ3RoICsgMSkuam9pbigiLSIpOworICAgICAgICAgIHJldHVybiBwcmUgKyB0aGlzLnVw
Y29taW5nSW5wdXQoKSArICJcbiIgKyBjKyJeIjsKKyAgICAgIH0sCisgIG5leHQ6ZnVuY3Rpb24g
KCkgeworICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRo
aXMuRU9GOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRv
bmUgPSB0cnVlOworCisgICAgICAgICAgdmFyIHRva2VuLAorICAgICAgICAgICAgICBtYXRjaCwK
KyAgICAgICAgICAgICAgdGVtcE1hdGNoLAorICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAg
ICAgICAgY29sLAorICAgICAgICAgICAgICBsaW5lczsKKyAgICAgICAgICBpZiAoIXRoaXMuX21v
cmUpIHsKKyAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSAnJzsKKyAgICAgICAgICAgICAgdGhp
cy5tYXRjaCA9ICcnOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLl9j
dXJyZW50UnVsZXMoKTsKKyAgICAgICAgICBmb3IgKHZhciBpPTA7aSA8IHJ1bGVzLmxlbmd0aDsg
aSsrKSB7CisgICAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMu
cnVsZXNbcnVsZXNbaV1dKTsKKyAgICAgICAgICAgICAgaWYgKHRlbXBNYXRjaCAmJiAoIW1hdGNo
IHx8IHRlbXBNYXRjaFswXS5sZW5ndGggPiBtYXRjaFswXS5sZW5ndGgpKSB7CisgICAgICAgICAg
ICAgICAgICBtYXRjaCA9IHRlbXBNYXRjaDsKKyAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsK
KyAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIGJyZWFrOworICAgICAg
ICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAg
ICAgICBsaW5lcyA9IG1hdGNoWzBdLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKKyAgICAgICAg
ICAgICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDsKKyAgICAgICAg
ICAgICAgdGhpcy55eWxsb2MgPSB7Zmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2xpbmU6IHRoaXMueXlsaW5lbm8rMSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5s
YXN0X2NvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxp
bmVzID8gbGluZXNbbGluZXMubGVuZ3RoLTFdLmxlbmd0aC1saW5lc1tsaW5lcy5sZW5ndGgtMV0u
bWF0Y2goL1xyP1xuPy8pWzBdLmxlbmd0aCA6IHRoaXMueXlsbG9jLmxhc3RfY29sdW1uICsgbWF0
Y2hbMF0ubGVuZ3RofTsKKyAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07Cisg
ICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07CisgICAgICAgICAgICAgIHRoaXMu
bWF0Y2hlcyA9IG1hdGNoOworICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0
Lmxlbmd0aDsKKyAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKKyAgICAg
ICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNl
dCArPSB0aGlzLnl5bGVuZ107CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdGhpcy5f
bW9yZSA9IGZhbHNlOworICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNs
aWNlKG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRj
aFswXTsKKyAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlz
LCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNv
bmRpdGlvblN0YWNrLmxlbmd0aC0xXSk7CisgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYg
dGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICBpZiAodG9rZW4p
IHJldHVybiB0b2tlbjsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm47CisgICAgICAgICAgfQor
ICAgICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gIiIpIHsKKyAgICAgICAgICAgICAgcmV0dXJu
IHRoaXMuRU9GOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiB0aGlz
LnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnKyh0aGlzLnl5bGluZW5vKzEpKycu
IFVucmVjb2duaXplZCB0ZXh0LlxuJyt0aGlzLnNob3dQb3NpdGlvbigpLAorICAgICAgICAgICAg
ICAgICAgICAgIHt0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm99KTsK
KyAgICAgICAgICB9CisgICAgICB9LAorICBsZXg6ZnVuY3Rpb24gbGV4KCkgeworICAgICAgICAg
IHZhciByID0gdGhpcy5uZXh0KCk7CisgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZp
bmVkJykgeworICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKKyAgICAgICAgICB9CisgICAgICB9LAorICBi
ZWdpbjpmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHsKKyAgICAgICAgICB0aGlzLmNvbmRpdGlv
blN0YWNrLnB1c2goY29uZGl0aW9uKTsKKyAgICAgIH0sCisgIHBvcFN0YXRlOmZ1bmN0aW9uIHBv
cFN0YXRlKCkgeworICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNrLnBvcCgpOwor
ICAgICAgfSwKKyAgX2N1cnJlbnRSdWxlczpmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgeworICAg
ICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNv
bmRpdGlvblN0YWNrLmxlbmd0aC0xXV0ucnVsZXM7CisgICAgICB9LAorICB0b3BTdGF0ZTpmdW5j
dGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25k
aXRpb25TdGFjay5sZW5ndGgtMl07CisgICAgICB9LAorICBwdXNoU3RhdGU6ZnVuY3Rpb24gYmVn
aW4oY29uZGl0aW9uKSB7CisgICAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pOworICAgICAg
fX0pOworICBsZXhlci5vcHRpb25zID0ge307CisgIGxleGVyLnBlcmZvcm1BY3Rpb24gPSBmdW5j
dGlvbiBhbm9ueW1vdXMoeXkseXlfLCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsWVlfU1RBUlQp
IHsKIAotSGFuZGxlYmFycy5FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gIHZhciB0
bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
IAotICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21l
IChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay4KLSAgZm9yICh2
YXIgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgdGhpc1tl
cnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07CisgIGZ1bmN0aW9uIHN0cmlw
KHN0YXJ0LCBlbmQpIHsKKyAgICByZXR1cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3Ry
KHN0YXJ0LCB5eV8ueXlsZW5nLWVuZCk7CiAgIH0KLX07Ci1IYW5kbGViYXJzLkV4Y2VwdGlvbi5w
cm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKLQotLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3Ry
aW5nIHR5cGUKLUhhbmRsZWJhcnMuU2FmZVN0cmluZyA9IGZ1bmN0aW9uKHN0cmluZykgewotICB0
aGlzLnN0cmluZyA9IHN0cmluZzsKLX07Ci1IYW5kbGViYXJzLlNhZmVTdHJpbmcucHJvdG90eXBl
LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnN0cmluZy50b1N0cmluZygp
OwotfTsKLQotKGZ1bmN0aW9uKCkgewotICB2YXIgZXNjYXBlID0gewotICAgICImIjogIiZhbXA7
IiwKLSAgICAiPCI6ICImbHQ7IiwKLSAgICAiPiI6ICImZ3Q7IiwKLSAgICAnIic6ICImcXVvdDsi
LAotICAgICInIjogIiYjeDI3OyIsCi0gICAgImAiOiAiJiN4NjA7IgotICB9OwogCi0gIHZhciBi
YWRDaGFycyA9IC9bJjw+IidgXS9nOwotICB2YXIgcG9zc2libGUgPSAvWyY8PiInYF0vOwogCi0g
IHZhciBlc2NhcGVDaGFyID0gZnVuY3Rpb24oY2hyKSB7Ci0gICAgcmV0dXJuIGVzY2FwZVtjaHJd
IHx8ICImYW1wOyI7CisgIHZhciBZWVNUQVRFPVlZX1NUQVJUCisgIHN3aXRjaCgkYXZvaWRpbmdf
bmFtZV9jb2xsaXNpb25zKSB7CisgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0yKSA9PT0gIlxcXFwiKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcCgwLDEpOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoeXlfLnl5dGV4dC5zbGljZSgtMSkg
PT09ICJcXCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlw
KDAsMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2lu
KCJlbXUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5dGV4dCkgcmV0dXJuIDE0OworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYnJlYWs7CisgIGNhc2UgMTpyZXR1cm4gMTQ7
CisgIGJyZWFrOworICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhpcy5wb3BTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiAxNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJyZWFr
OworICBjYXNlIDM6c3RyaXAoMCw0KTsgdGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMTU7CisgIGJy
ZWFrOworICBjYXNlIDQ6cmV0dXJuIDM1OworICBicmVhazsKKyAgY2FzZSA1OnJldHVybiAzNjsK
KyAgYnJlYWs7CisgIGNhc2UgNjpyZXR1cm4gMjU7CisgIGJyZWFrOworICBjYXNlIDc6cmV0dXJu
IDE2OworICBicmVhazsKKyAgY2FzZSA4OnJldHVybiAyMDsKKyAgYnJlYWs7CisgIGNhc2UgOTpy
ZXR1cm4gMTk7CisgIGJyZWFrOworICBjYXNlIDEwOnJldHVybiAxOTsKKyAgYnJlYWs7CisgIGNh
c2UgMTE6cmV0dXJuIDIzOworICBicmVhazsKKyAgY2FzZSAxMjpyZXR1cm4gMjI7CisgIGJyZWFr
OworICBjYXNlIDEzOnRoaXMucG9wU3RhdGUoKTsgdGhpcy5iZWdpbignY29tJyk7CisgIGJyZWFr
OworICBjYXNlIDE0OnN0cmlwKDMsNSk7IHRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDE1OworICBi
cmVhazsKKyAgY2FzZSAxNTpyZXR1cm4gMjI7CisgIGJyZWFrOworICBjYXNlIDE2OnJldHVybiA0
MTsKKyAgYnJlYWs7CisgIGNhc2UgMTc6cmV0dXJuIDQwOworICBicmVhazsKKyAgY2FzZSAxODpy
ZXR1cm4gNDA7CisgIGJyZWFrOworICBjYXNlIDE5OnJldHVybiA0NDsKKyAgYnJlYWs7CisgIGNh
c2UgMjA6Ly8gaWdub3JlIHdoaXRlc3BhY2UKKyAgYnJlYWs7CisgIGNhc2UgMjE6dGhpcy5wb3BT
dGF0ZSgpOyByZXR1cm4gMjQ7CisgIGJyZWFrOworICBjYXNlIDIyOnRoaXMucG9wU3RhdGUoKTsg
cmV0dXJuIDE4OworICBicmVhazsKKyAgY2FzZSAyMzp5eV8ueXl0ZXh0ID0gc3RyaXAoMSwyKS5y
ZXBsYWNlKC9cXCIvZywnIicpOyByZXR1cm4gMzI7CisgIGJyZWFrOworICBjYXNlIDI0Onl5Xy55
eXRleHQgPSBzdHJpcCgxLDIpLnJlcGxhY2UoL1xcJy9nLCInIik7IHJldHVybiAzMjsKKyAgYnJl
YWs7CisgIGNhc2UgMjU6cmV0dXJuIDQyOworICBicmVhazsKKyAgY2FzZSAyNjpyZXR1cm4gMzQ7
CisgIGJyZWFrOworICBjYXNlIDI3OnJldHVybiAzNDsKKyAgYnJlYWs7CisgIGNhc2UgMjg6cmV0
dXJuIDMzOworICBicmVhazsKKyAgY2FzZSAyOTpyZXR1cm4gNDA7CisgIGJyZWFrOworICBjYXNl
IDMwOnl5Xy55eXRleHQgPSBzdHJpcCgxLDIpOyByZXR1cm4gNDA7CisgIGJyZWFrOworICBjYXNl
IDMxOnJldHVybiAnSU5WQUxJRCc7CisgIGJyZWFrOworICBjYXNlIDMyOnJldHVybiA1OworICBi
cmVhazsKKyAgfQogICB9OworICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7
KSkpLywvXig/OlteXHgwMF0rKS8sL14oPzpbXlx4MDBdezIsfT8oPz0oXHtce3xcXFx7XHt8XFxc
XFx7XHt8JCkpKS8sL14oPzpbXHNcU10qPy0tXH1cfSkvLC9eKD86XCgpLywvXig/OlwpKS8sL14o
Pzpce1x7KH4pPz4pLywvXig/Olx7XHsofik/IykvLC9eKD86XHtceyh+KT9cLykvLC9eKD86XHtc
eyh+KT9cXikvLC9eKD86XHtceyh+KT9ccyplbHNlXGIpLywvXig/Olx7XHsofik/XHspLywvXig/
Olx7XHsofik/JikvLC9eKD86XHtceyEtLSkvLC9eKD86XHtceyFbXHNcU10qP1x9XH0pLywvXig/
Olx7XHsofik/KS8sL14oPzo9KS8sL14oPzpcLlwuKS8sL14oPzpcLig/PShbPX59XHNcLy4pXSkp
KS8sL14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14oPzpcfSh+KT9cfVx9KS8sL14oPzoofik/XH1c
fSkvLC9eKD86IihcXFsiXXxbXiJdKSoiKS8sL14oPzonKFxcWyddfFteJ10pKicpLywvXig/OkAp
LywvXig/OnRydWUoPz0oW359XHMpXSkpKS8sL14oPzpmYWxzZSg/PShbfn1ccyldKSkpLywvXig/
Oi0/WzAtOV0rKD89KFt+fVxzKV0pKSkvLC9eKD86KFteXHMhIiMlLSxcLlwvOy0+QFxbLVxeYFx7
LX5dKyg/PShbPX59XHNcLy4pXSkpKSkvLC9eKD86XFtbXlxdXSpcXSkvLC9eKD86LikvLC9eKD86
JCkvXTsKKyAgbGV4ZXIuY29uZGl0aW9ucyA9IHsibXUiOnsicnVsZXMiOls0LDUsNiw3LDgsOSwx
MCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwy
OSwzMCwzMSwzMl0sImluY2x1c2l2ZSI6ZmFsc2V9LCJlbXUiOnsicnVsZXMiOlsyXSwiaW5jbHVz
aXZlIjpmYWxzZX0sImNvbSI6eyJydWxlcyI6WzNdLCJpbmNsdXNpdmUiOmZhbHNlfSwiSU5JVElB
TCI6eyJydWxlcyI6WzAsMSwzMl0sImluY2x1c2l2ZSI6dHJ1ZX19OworICByZXR1cm4gbGV4ZXI7
fSkoKQorICBwYXJzZXIubGV4ZXIgPSBsZXhlcjsKKyAgZnVuY3Rpb24gUGFyc2VyICgpIHsgdGhp
cy55eSA9IHt9OyB9UGFyc2VyLnByb3RvdHlwZSA9IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFy
c2VyOworICByZXR1cm4gbmV3IFBhcnNlcjsKKyAgfSkoKTtfX2V4cG9ydHNfXyA9IGhhbmRsZWJh
cnM7CisgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCisgIHJldHVybiBfX2V4cG9ydHNfXzsKK30p
KCk7CisKKy8vIGhhbmRsZWJhcnMvY29tcGlsZXIvYmFzZS5qcwordmFyIF9fbW9kdWxlOF9fID0g
KGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fKSB7CisgICJ1c2Ugc3Ry
aWN0IjsKKyAgdmFyIF9fZXhwb3J0c19fID0ge307CisgIHZhciBwYXJzZXIgPSBfX2RlcGVuZGVu
Y3kxX187CisgIHZhciBBU1QgPSBfX2RlcGVuZGVuY3kyX187CisKKyAgX19leHBvcnRzX18ucGFy
c2VyID0gcGFyc2VyOworCisgIGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7CisgICAgLy8gSnVzdCBy
ZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlIEFTVCB3YXMgcGFzc2VkIGluLgorICAgIGlmKGlu
cHV0LmNvbnN0cnVjdG9yID09PSBBU1QuUHJvZ3JhbU5vZGUpIHsgcmV0dXJuIGlucHV0OyB9CisK
KyAgICBwYXJzZXIueXkgPSBBU1Q7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbnB1dCk7Cisg
IH0KIAotICBIYW5kbGViYXJzLlV0aWxzID0gewotICAgIGVzY2FwZUV4cHJlc3Npb246IGZ1bmN0
aW9uKHN0cmluZykgewotICAgICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0
aGV5J3JlIGFscmVhZHkgc2FmZQotICAgICAgaWYgKHN0cmluZyBpbnN0YW5jZW9mIEhhbmRsZWJh
cnMuU2FmZVN0cmluZykgewotICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAg
ICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZyA9PT0gZmFsc2UpIHsKLSAgICAg
ICAgcmV0dXJuICIiOwotICAgICAgfQotCi0gICAgICBpZighcG9zc2libGUudGVzdChzdHJpbmcp
KSB7IHJldHVybiBzdHJpbmc7IH0KLSAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFy
cywgZXNjYXBlQ2hhcik7Ci0gICAgfSwKKyAgX19leHBvcnRzX18ucGFyc2UgPSBwYXJzZTsKKyAg
cmV0dXJuIF9fZXhwb3J0c19fOworfSkoX19tb2R1bGU5X18sIF9fbW9kdWxlN19fKTsKIAotICAg
IGlzRW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9
PSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIGlmKE9iamVjdC5wcm90
b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICJbb2JqZWN0IEFycmF5XSIgJiYgdmFsdWUu
bGVuZ3RoID09PSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfTsKLX0pKCk7OwotLy8gbGli
L2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMKKy8vIGhhbmRsZWJhcnMvY29tcGlsZXIv
Y29tcGlsZXIuanMKK3ZhciBfX21vZHVsZTEwX18gPSAoZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9f
KSB7CisgICJ1c2Ugc3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19fID0ge307CisgIHZhciBFeGNl
cHRpb24gPSBfX2RlcGVuZGVuY3kxX187CiAKLS8qanNoaW50IGVxbnVsbDp0cnVlKi8KLUhhbmRs
ZWJhcnMuQ29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwotSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29t
cGlsZXIgPSBmdW5jdGlvbigpIHt9OworICBmdW5jdGlvbiBDb21waWxlcigpIHt9CiAKLShmdW5j
dGlvbihDb21waWxlciwgSmF2YVNjcmlwdENvbXBpbGVyKSB7Ci0gIC8vIHRoZSBmb3VuZEhlbHBl
ciByZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBh
CisgIF9fZXhwb3J0c19fLkNvbXBpbGVyID0gQ29tcGlsZXI7Ly8gdGhlIGZvdW5kSGVscGVyIHJl
Z2lzdGVyIHdpbGwgZGlzYW1iaWd1YXRlIGhlbHBlciBsb29rdXAgZnJvbSBmaW5kaW5nIGEKICAg
Ly8gZnVuY3Rpb24gaW4gYSBjb250ZXh0LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbXVzdGFjaGUg
Y29tcGF0aWJpbGl0eSwgd2hpY2gKICAgLy8gcmVxdWlyZXMgdGhhdCBjb250ZXh0IGZ1bmN0aW9u
cyBpbiBibG9ja3MgYXJlIGV2YWx1YXRlZCBieSBibG9ja0hlbHBlck1pc3NpbmcsCiAgIC8vIGFu
ZCB0aGVuIHByb2NlZWQgYXMgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSB3YXMgcHJvdmlkZWQgdG8g
YmxvY2tIZWxwZXJNaXNzaW5nLgpAQCAtODkwLDYgKzEzMTUsNyBAQCBIYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAKICAgICAgIHJldHVybiBvdXQuam9pbigi
XG4iKTsKICAgICB9LAorCiAgICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikgewogICAgICAgdmFy
IGxlbiA9IHRoaXMub3Bjb2Rlcy5sZW5ndGg7CiAgICAgICBpZiAob3RoZXIub3Bjb2Rlcy5sZW5n
dGggIT09IGxlbikgewpAQCAtOTA4LDEyICsxMzM0LDI0IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlw
dENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAg
IH0KKworICAgICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CisgICAgICBpZiAob3RoZXIu
Y2hpbGRyZW4ubGVuZ3RoICE9PSBsZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
fQorICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmICghdGhpcy5j
aGlsZHJlbltpXS5lcXVhbHMob3RoZXIuY2hpbGRyZW5baV0pKSB7CisgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0s
CiAKICAgICBndWlkOiAwLAogCiAgICAgY29tcGlsZTogZnVuY3Rpb24ocHJvZ3JhbSwgb3B0aW9u
cykgeworICAgICAgdGhpcy5vcGNvZGVzID0gW107CiAgICAgICB0aGlzLmNoaWxkcmVuID0gW107
CiAgICAgICB0aGlzLmRlcHRocyA9IHtsaXN0OiBbXX07CiAgICAgICB0aGlzLm9wdGlvbnMgPSBv
cHRpb25zOwpAQCAtOTM1LDIwICsxMzczLDMwIEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBp
bGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICByZXR1cm4g
dGhpcy5wcm9ncmFtKHByb2dyYW0pOworICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0p
OwogICAgIH0sCiAKICAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUpIHsKLSAgICAgIHJldHVybiB0
aGlzW25vZGUudHlwZV0obm9kZSk7CisgICAgICB2YXIgc3RyaXAgPSBub2RlLnN0cmlwIHx8IHt9
LAorICAgICAgICAgIHJldDsKKyAgICAgIGlmIChzdHJpcC5sZWZ0KSB7CisgICAgICAgIHRoaXMu
b3Bjb2RlKCdzdHJpcCcpOworICAgICAgfQorCisgICAgICByZXQgPSB0aGlzW25vZGUudHlwZV0o
bm9kZSk7CisKKyAgICAgIGlmIChzdHJpcC5yaWdodCkgeworICAgICAgICB0aGlzLm9wY29kZSgn
c3RyaXAnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJldDsKICAgICB9LAogCiAgICAgcHJv
Z3JhbTogZnVuY3Rpb24ocHJvZ3JhbSkgewotICAgICAgdmFyIHN0YXRlbWVudHMgPSBwcm9ncmFt
LnN0YXRlbWVudHMsIHN0YXRlbWVudDsKLSAgICAgIHRoaXMub3Bjb2RlcyA9IFtdOworICAgICAg
dmFyIHN0YXRlbWVudHMgPSBwcm9ncmFtLnN0YXRlbWVudHM7CiAKICAgICAgIGZvcih2YXIgaT0w
LCBsPXN0YXRlbWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICBzdGF0ZW1lbnQgPSBz
dGF0ZW1lbnRzW2ldOwotICAgICAgICB0aGlzW3N0YXRlbWVudC50eXBlXShzdGF0ZW1lbnQpOwor
ICAgICAgICB0aGlzLmFjY2VwdChzdGF0ZW1lbnRzW2ldKTsKICAgICAgIH0KICAgICAgIHRoaXMu
aXNTaW1wbGUgPSBsID09PSAxOwogCkBAIC05OTAsMTIgKzE0MzgsMTMgQEAgSGFuZGxlYmFycy5K
YXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICBpbnZlcnNlID0gdGhp
cy5jb21waWxlUHJvZ3JhbShpbnZlcnNlKTsKICAgICAgIH0KIAotICAgICAgdmFyIHR5cGUgPSB0
aGlzLmNsYXNzaWZ5TXVzdGFjaGUobXVzdGFjaGUpOworICAgICAgdmFyIHNleHByID0gbXVzdGFj
aGUuc2V4cHI7CisgICAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CiAK
ICAgICAgIGlmICh0eXBlID09PSAiaGVscGVyIikgewotICAgICAgICB0aGlzLmhlbHBlck11c3Rh
Y2hlKG11c3RhY2hlLCBwcm9ncmFtLCBpbnZlcnNlKTsKKyAgICAgICAgdGhpcy5oZWxwZXJTZXhw
cihzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSk7CiAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJz
aW1wbGUiKSB7Ci0gICAgICAgIHRoaXMuc2ltcGxlTXVzdGFjaGUobXVzdGFjaGUpOworICAgICAg
ICB0aGlzLnNpbXBsZVNleHByKHNleHByKTsKIAogICAgICAgICAvLyBub3cgdGhhdCB0aGUgc2lt
cGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvCiAgICAgICAgIC8vIGV2YWx1YXRl
IGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYApAQCAtMTAwNCw3ICsxNDUzLDcg
QEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAg
ICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7CiAgICAgICAgIHRoaXMub3Bjb2RlKCdibG9ja1Zh
bHVlJyk7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLmFtYmlndW91c011c3RhY2hlKG11
c3RhY2hlLCBwcm9ncmFtLCBpbnZlcnNlKTsKKyAgICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihz
ZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSk7CiAKICAgICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBs
ZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0bwogICAgICAgICAvLyBldmFsdWF0ZSBp
dCBieSBleGVjdXRpbmcgYGJsb2NrSGVscGVyTWlzc2luZ2AKQEAgLTEwMjcsNyArMTQ3NiwxNyBA
QCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAg
IHZhbCAgPSBwYWlyWzFdOwogCiAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1z
KSB7CisgICAgICAgICAgaWYodmFsLmRlcHRoKSB7CisgICAgICAgICAgICB0aGlzLmFkZERlcHRo
KHZhbC5kZXB0aCk7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMub3Bjb2RlKCdnZXRDb250
ZXh0JywgdmFsLmRlcHRoIHx8IDApOwogICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5n
UGFyYW0nLCB2YWwuc3RyaW5nTW9kZVZhbHVlLCB2YWwudHlwZSk7CisKKyAgICAgICAgICBpZiAo
dmFsLnR5cGUgPT09ICdzZXhwcicpIHsKKyAgICAgICAgICAgIC8vIFN1YmV4cHJlc3Npb25zIGdl
dCBldmFsdWF0ZWQgYW5kIHBhc3NlZCBpbgorICAgICAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFt
cyBtb2RlLgorICAgICAgICAgICAgdGhpcy5zZXhwcih2YWwpOworICAgICAgICAgIH0KICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICB0aGlzLmFjY2VwdCh2YWwpOwogICAgICAgICB9CkBAIC0x
MDU2LDI2ICsxNTE1LDE3IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rp
b24oKSB7fTsKICAgICB9LAogCiAgICAgbXVzdGFjaGU6IGZ1bmN0aW9uKG11c3RhY2hlKSB7Ci0g
ICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKLSAgICAgIHZhciB0eXBlID0gdGhpcy5j
bGFzc2lmeU11c3RhY2hlKG11c3RhY2hlKTsKKyAgICAgIHRoaXMuc2V4cHIobXVzdGFjaGUuc2V4
cHIpOwogCi0gICAgICBpZiAodHlwZSA9PT0gInNpbXBsZSIpIHsKLSAgICAgICAgdGhpcy5zaW1w
bGVNdXN0YWNoZShtdXN0YWNoZSk7Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJoZWxwZXIi
KSB7Ci0gICAgICAgIHRoaXMuaGVscGVyTXVzdGFjaGUobXVzdGFjaGUpOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgdGhpcy5hbWJpZ3VvdXNNdXN0YWNoZShtdXN0YWNoZSk7Ci0gICAgICB9Ci0K
LSAgICAgIGlmKG11c3RhY2hlLmVzY2FwZWQgJiYgIW9wdGlvbnMubm9Fc2NhcGUpIHsKKyAgICAg
IGlmKG11c3RhY2hlLmVzY2FwZWQgJiYgIXRoaXMub3B0aW9ucy5ub0VzY2FwZSkgewogICAgICAg
ICB0aGlzLm9wY29kZSgnYXBwZW5kRXNjYXBlZCcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAg
dGhpcy5vcGNvZGUoJ2FwcGVuZCcpOwogICAgICAgfQogICAgIH0sCiAKLSAgICBhbWJpZ3VvdXNN
dXN0YWNoZTogZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpIHsKLSAgICAgIHZh
ciBpZCA9IG11c3RhY2hlLmlkLAorICAgIGFtYmlndW91c1NleHByOiBmdW5jdGlvbihzZXhwciwg
cHJvZ3JhbSwgaW52ZXJzZSkgeworICAgICAgdmFyIGlkID0gc2V4cHIuaWQsCiAgICAgICAgICAg
bmFtZSA9IGlkLnBhcnRzWzBdLAogICAgICAgICAgIGlzQmxvY2sgPSBwcm9ncmFtICE9IG51bGwg
fHwgaW52ZXJzZSAhPSBudWxsOwogCkBAIC0xMDg3LDggKzE1MzcsOCBAQCBIYW5kbGViYXJzLkph
dmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICB0aGlzLm9wY29kZSgnaW52
b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7CiAgICAgfSwKIAotICAgIHNpbXBsZU11c3Rh
Y2hlOiBmdW5jdGlvbihtdXN0YWNoZSkgewotICAgICAgdmFyIGlkID0gbXVzdGFjaGUuaWQ7Cisg
ICAgc2ltcGxlU2V4cHI6IGZ1bmN0aW9uKHNleHByKSB7CisgICAgICB2YXIgaWQgPSBzZXhwci5p
ZDsKIAogICAgICAgaWYgKGlkLnR5cGUgPT09ICdEQVRBJykgewogICAgICAgICB0aGlzLkRBVEEo
aWQpOwpAQCAtMTEwNCwxNiArMTU1NCwyOCBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxl
ciA9IGZ1bmN0aW9uKCkge307CiAgICAgICB0aGlzLm9wY29kZSgncmVzb2x2ZVBvc3NpYmxlTGFt
YmRhJyk7CiAgICAgfSwKIAotICAgIGhlbHBlck11c3RhY2hlOiBmdW5jdGlvbihtdXN0YWNoZSwg
cHJvZ3JhbSwgaW52ZXJzZSkgewotICAgICAgdmFyIHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVz
dGFjaGVQYXJhbXMobXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpLAotICAgICAgICAgIG5hbWUg
PSBtdXN0YWNoZS5pZC5wYXJ0c1swXTsKKyAgICBoZWxwZXJTZXhwcjogZnVuY3Rpb24oc2V4cHIs
IHByb2dyYW0sIGludmVyc2UpIHsKKyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11
c3RhY2hlUGFyYW1zKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSwKKyAgICAgICAgICBuYW1lID0g
c2V4cHIuaWQucGFydHNbMF07CiAKICAgICAgIGlmICh0aGlzLm9wdGlvbnMua25vd25IZWxwZXJz
W25hbWVdKSB7CiAgICAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VLbm93bkhlbHBlcicsIHBhcmFt
cy5sZW5ndGgsIG5hbWUpOwotICAgICAgfSBlbHNlIGlmICh0aGlzLmtub3duSGVscGVyc09ubHkp
IHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3Ugc3BlY2lmaWVkIGtub3duSGVscGVyc09u
bHksIGJ1dCB1c2VkIHRoZSB1bmtub3duIGhlbHBlciAiICsgbmFtZSk7CisgICAgICB9IGVsc2Ug
aWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7CisgICAgICAgIHRocm93IG5ldyBF
eGNlcHRpb24oIllvdSBzcGVjaWZpZWQga25vd25IZWxwZXJzT25seSwgYnV0IHVzZWQgdGhlIHVu
a25vd24gaGVscGVyICIgKyBuYW1lLCBzZXhwcik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0
aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgbmFtZSwgc2V4cHIuaXNS
b290KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc2V4cHI6IGZ1bmN0aW9uKHNleHByKSB7Cisg
ICAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7CisKKyAgICAgIGlmICh0
eXBlID09PSAic2ltcGxlIikgeworICAgICAgICB0aGlzLnNpbXBsZVNleHByKHNleHByKTsKKyAg
ICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImhlbHBlciIpIHsKKyAgICAgICAgdGhpcy5oZWxwZXJT
ZXhwcihzZXhwcik7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLm9wY29kZSgnaW52b2tl
SGVscGVyJywgcGFyYW1zLmxlbmd0aCwgbmFtZSk7CisgICAgICAgIHRoaXMuYW1iaWd1b3VzU2V4
cHIoc2V4cHIpOwogICAgICAgfQogICAgIH0sCiAKQEAgLTExMzUsNyArMTU5NywxNSBAQCBIYW5k
bGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAKICAgICBEQVRBOiBm
dW5jdGlvbihkYXRhKSB7CiAgICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7Ci0gICAgICB0
aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIGRhdGEuaWQpOworICAgICAgaWYgKGRhdGEuaWQuaXNT
Y29wZWQgfHwgZGF0YS5pZC5kZXB0aCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdT
Y29wZWQgZGF0YSByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkOiAnICsgZGF0YS5vcmlnaW5h
bCwgZGF0YSk7CisgICAgICB9CisKKyAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBEYXRhJyk7Cisg
ICAgICB2YXIgcGFydHMgPSBkYXRhLmlkLnBhcnRzOworICAgICAgZm9yKHZhciBpPTAsIGw9cGFy
dHMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICB0aGlzLm9wY29kZSgnbG9va3VwJywgcGFy
dHNbaV0pOworICAgICAgfQogICAgIH0sCiAKICAgICBTVFJJTkc6IGZ1bmN0aW9uKHN0cmluZykg
ewpAQCAtMTE2Miw3ICsxNjMyLDYgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBm
dW5jdGlvbigpIHt9OwogICAgIH0sCiAKICAgICBhZGREZXB0aDogZnVuY3Rpb24oZGVwdGgpIHsK
LSAgICAgIGlmKGlzTmFOKGRlcHRoKSkgeyB0aHJvdyBuZXcgRXJyb3IoIkVXT1QiKTsgfQogICAg
ICAgaWYoZGVwdGggPT09IDApIHsgcmV0dXJuOyB9CiAKICAgICAgIGlmKCF0aGlzLmRlcHRoc1tk
ZXB0aF0pIHsKQEAgLTExNzEsMTQgKzE2NDAsMTQgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29t
cGlsZXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAgfQogICAgIH0sCiAKLSAgICBjbGFzc2lmeU11
c3RhY2hlOiBmdW5jdGlvbihtdXN0YWNoZSkgewotICAgICAgdmFyIGlzSGVscGVyICAgPSBtdXN0
YWNoZS5pc0hlbHBlcjsKLSAgICAgIHZhciBpc0VsaWdpYmxlID0gbXVzdGFjaGUuZWxpZ2libGVI
ZWxwZXI7CisgICAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24oc2V4cHIpIHsKKyAgICAgIHZhciBp
c0hlbHBlciAgID0gc2V4cHIuaXNIZWxwZXI7CisgICAgICB2YXIgaXNFbGlnaWJsZSA9IHNleHBy
LmVsaWdpYmxlSGVscGVyOwogICAgICAgdmFyIG9wdGlvbnMgICAgPSB0aGlzLm9wdGlvbnM7CiAK
ICAgICAgIC8vIGlmIGFtYmlndW91cywgd2UgY2FuIHBvc3NpYmx5IHJlc29sdmUgdGhlIGFtYmln
dWl0eSBub3cKICAgICAgIGlmIChpc0VsaWdpYmxlICYmICFpc0hlbHBlcikgewotICAgICAgICB2
YXIgbmFtZSA9IG11c3RhY2hlLmlkLnBhcnRzWzBdOworICAgICAgICB2YXIgbmFtZSA9IHNleHBy
LmlkLnBhcnRzWzBdOwogCiAgICAgICAgIGlmIChvcHRpb25zLmtub3duSGVscGVyc1tuYW1lXSkg
ewogICAgICAgICAgIGlzSGVscGVyID0gdHJ1ZTsKQEAgLTEyMDUsMzUgKzE2NzQsMjcgQEAgSGFu
ZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogCiAgICAgICAgICAg
dGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKICAgICAgICAgICB0
aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVlLCBwYXJh
bS50eXBlKTsKKworICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSAnc2V4cHInKSB7CisgICAg
ICAgICAgICAvLyBTdWJleHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KKyAg
ICAgICAgICAgIC8vIGluIHN0cmluZyBwYXJhbXMgbW9kZS4KKyAgICAgICAgICAgIHRoaXMuc2V4
cHIocGFyYW0pOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICB0aGlz
W3BhcmFtLnR5cGVdKHBhcmFtKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0sCiAKLSAgICBz
ZXR1cE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbihtdXN0YWNoZSkgewotICAgICAgdmFyIHBhcmFt
cyA9IG11c3RhY2hlLnBhcmFtczsKLSAgICAgIHRoaXMucHVzaFBhcmFtcyhwYXJhbXMpOwotCi0g
ICAgICBpZihtdXN0YWNoZS5oYXNoKSB7Ci0gICAgICAgIHRoaXMuaGFzaChtdXN0YWNoZS5oYXNo
KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsKLSAg
ICAgIH0KLQotICAgICAgcmV0dXJuIHBhcmFtczsKLSAgICB9LAotCi0gICAgLy8gdGhpcyB3aWxs
IHJlcGxhY2Ugc2V0dXBNdXN0YWNoZVBhcmFtcyB3aGVuIHdlJ3JlIGRvbmUKLSAgICBzZXR1cEZ1
bGxNdXN0YWNoZVBhcmFtczogZnVuY3Rpb24obXVzdGFjaGUsIHByb2dyYW0sIGludmVyc2UpIHsK
LSAgICAgIHZhciBwYXJhbXMgPSBtdXN0YWNoZS5wYXJhbXM7CisgICAgc2V0dXBGdWxsTXVzdGFj
aGVQYXJhbXM6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7CisgICAgICB2YXIg
cGFyYW1zID0gc2V4cHIucGFyYW1zOwogICAgICAgdGhpcy5wdXNoUGFyYW1zKHBhcmFtcyk7CiAK
ICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwogICAgICAgdGhpcy5v
cGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7CiAKLSAgICAgIGlmKG11c3RhY2hlLmhhc2gp
IHsKLSAgICAgICAgdGhpcy5oYXNoKG11c3RhY2hlLmhhc2gpOworICAgICAgaWYgKHNleHByLmhh
c2gpIHsKKyAgICAgICAgdGhpcy5oYXNoKHNleHByLmhhc2gpOwogICAgICAgfSBlbHNlIHsKICAg
ICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwogICAgICAgfQpAQCAtMTI0MiwyMiArMTcw
Myw5OSBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAg
ICAgfQogICB9OwogCi0gIHZhciBMaXRlcmFsID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgZnVuY3Rp
b24gcHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgZW52KSB7CisgICAgaWYgKGlucHV0ID09IG51
bGwgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycgJiYgaW5wdXQuY29uc3RydWN0b3IgIT09
IGVudi5BU1QuUHJvZ3JhbU5vZGUpKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJZb3Ug
bXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29t
cGlsZS4gWW91IHBhc3NlZCAiICsgaW5wdXQpOworICAgIH0KKworICAgIG9wdGlvbnMgPSBvcHRp
b25zIHx8IHt9OworICAgIGlmICghKCdkYXRhJyBpbiBvcHRpb25zKSkgeworICAgICAgb3B0aW9u
cy5kYXRhID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIgYXN0ID0gZW52LnBhcnNlKGlucHV0KTsK
KyAgICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9w
dGlvbnMpOworICAgIHJldHVybiBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUo
ZW52aXJvbm1lbnQsIG9wdGlvbnMpOworICB9CisKKyAgX19leHBvcnRzX18ucHJlY29tcGlsZSA9
IHByZWNvbXBpbGU7ZnVuY3Rpb24gY29tcGlsZShpbnB1dCwgb3B0aW9ucywgZW52KSB7CisgICAg
aWYgKGlucHV0ID09IG51bGwgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycgJiYgaW5wdXQu
Y29uc3RydWN0b3IgIT09IGVudi5BU1QuUHJvZ3JhbU5vZGUpKSB7CisgICAgICB0aHJvdyBuZXcg
RXhjZXB0aW9uKCJZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhh
bmRsZWJhcnMuY29tcGlsZS4gWW91IHBhc3NlZCAiICsgaW5wdXQpOworICAgIH0KKworICAgIG9w
dGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7
CisgICAgICBvcHRpb25zLmRhdGEgPSB0cnVlOworICAgIH0KKworICAgIHZhciBjb21waWxlZDsK
KworICAgIGZ1bmN0aW9uIGNvbXBpbGVJbnB1dCgpIHsKKyAgICAgIHZhciBhc3QgPSBlbnYucGFy
c2UoaW5wdXQpOworICAgICAgdmFyIGVudmlyb25tZW50ID0gbmV3IGVudi5Db21waWxlcigpLmNv
bXBpbGUoYXN0LCBvcHRpb25zKTsKKyAgICAgIHZhciB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52Lkph
dmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5l
ZCwgdHJ1ZSk7CisgICAgICByZXR1cm4gZW52LnRlbXBsYXRlKHRlbXBsYXRlU3BlYyk7CisgICAg
fQorCisgICAgLy8gVGVtcGxhdGUgaXMgb25seSBjb21waWxlZCBvbiBmaXJzdCB1c2UgYW5kIGNh
Y2hlZCBhZnRlciB0aGF0IHBvaW50LgorICAgIHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRp
b25zKSB7CisgICAgICBpZiAoIWNvbXBpbGVkKSB7CisgICAgICAgIGNvbXBpbGVkID0gY29tcGls
ZUlucHV0KCk7CisgICAgICB9CisgICAgICByZXR1cm4gY29tcGlsZWQuY2FsbCh0aGlzLCBjb250
ZXh0LCBvcHRpb25zKTsKKyAgICB9OworICB9CisKKyAgX19leHBvcnRzX18uY29tcGlsZSA9IGNv
bXBpbGU7CisgIHJldHVybiBfX2V4cG9ydHNfXzsKK30pKF9fbW9kdWxlNV9fKTsKKworLy8gaGFu
ZGxlYmFycy9jb21waWxlci9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzCit2YXIgX19tb2R1bGUxMV9f
ID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fKSB7CisgICJ1c2Ug
c3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19fOworICB2YXIgQ09NUElMRVJfUkVWSVNJT04gPSBf
X2RlcGVuZGVuY3kxX18uQ09NUElMRVJfUkVWSVNJT047CisgIHZhciBSRVZJU0lPTl9DSEFOR0VT
ID0gX19kZXBlbmRlbmN5MV9fLlJFVklTSU9OX0NIQU5HRVM7CisgIHZhciBsb2cgPSBfX2RlcGVu
ZGVuY3kxX18ubG9nOworICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5Ml9fOworCisgIGZ1
bmN0aW9uIExpdGVyYWwodmFsdWUpIHsKICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH07Cisg
IH0KKworICBmdW5jdGlvbiBKYXZhU2NyaXB0Q29tcGlsZXIoKSB7fQogCiAgIEphdmFTY3JpcHRD
b21waWxlci5wcm90b3R5cGUgPSB7CiAgICAgLy8gUFVCTElDIEFQSTogWW91IGNhbiBvdmVycmlk
ZSB0aGVzZSBtZXRob2RzIGluIGEgc3ViY2xhc3MgdG8gcHJvdmlkZQogICAgIC8vIGFsdGVybmF0
aXZlIGNvbXBpbGVkIGZvcm1zIGZvciBuYW1lIGxvb2t1cCBhbmQgYnVmZmVyaW5nIHNlbWFudGlj
cwogICAgIG5hbWVMb29rdXA6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSAvKiAsIHR5cGUqLykgewor
ICAgICAgdmFyIHdyYXAsCisgICAgICAgICAgcmV0OworICAgICAgaWYgKHBhcmVudC5pbmRleE9m
KCdkZXB0aCcpID09PSAwKSB7CisgICAgICAgIHdyYXAgPSB0cnVlOworICAgICAgfQorCiAgICAg
ICBpZiAoL15bMC05XSskLy50ZXN0KG5hbWUpKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQgKyAi
WyIgKyBuYW1lICsgIl0iOworICAgICAgICByZXQgPSBwYXJlbnQgKyAiWyIgKyBuYW1lICsgIl0i
OwogICAgICAgfSBlbHNlIGlmIChKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRW
YXJpYWJsZU5hbWUobmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudCArICIuIiArIG5hbWU7
CisgICAgICAgIHJldCA9IHBhcmVudCArICIuIiArIG5hbWU7CiAgICAgICB9CiAgICAgICBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIHBhcmVudCArICJbJyIgKyBuYW1lICsgIiddIjsKKyAgICAgICAg
cmV0ID0gcGFyZW50ICsgIlsnIiArIG5hbWUgKyAiJ10iOwogICAgICAgfQorCisgICAgICBpZiAo
d3JhcCkgeworICAgICAgICByZXR1cm4gJygnICsgcGFyZW50ICsgJyAmJiAnICsgcmV0ICsgJykn
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9LAor
CisgICAgY29tcGlsZXJJbmZvOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciByZXZpc2lvbiA9IENP
TVBJTEVSX1JFVklTSU9OLAorICAgICAgICAgIHZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1ty
ZXZpc2lvbl07CisgICAgICByZXR1cm4gInRoaXMuY29tcGlsZXJJbmZvID0gWyIrcmV2aXNpb24r
IiwnIit2ZXJzaW9ucysiJ107XG4iOwogICAgIH0sCiAKICAgICBhcHBlbmRUb0J1ZmZlcjogZnVu
Y3Rpb24oc3RyaW5nKSB7CkBAIC0xMjgzLDcgKzE4MjEsNyBAQCBIYW5kbGViYXJzLkphdmFTY3Jp
cHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICB0aGlzLmVudmlyb25tZW50ID0gZW52
aXJvbm1lbnQ7CiAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogCi0gICAgICBI
YW5kbGViYXJzLmxvZyhIYW5kbGViYXJzLmxvZ2dlci5ERUJVRywgdGhpcy5lbnZpcm9ubWVudC5k
aXNhc3NlbWJsZSgpICsgIlxuXG4iKTsKKyAgICAgIGxvZygnZGVidWcnLCB0aGlzLmVudmlyb25t
ZW50LmRpc2Fzc2VtYmxlKCkgKyAiXG5cbiIpOwogCiAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmVu
dmlyb25tZW50Lm5hbWU7CiAgICAgICB0aGlzLmlzQ2hpbGQgPSAhIWNvbnRleHQ7CkBAIC0xMjk4
LDYgKzE4MzYsNyBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkg
e307CiAgICAgICB0aGlzLnN0YWNrU2xvdCA9IDA7CiAgICAgICB0aGlzLnN0YWNrVmFycyA9IFtd
OwogICAgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07CisgICAgICB0aGlzLmhhc2hl
cyA9IFtdOwogICAgICAgdGhpcy5jb21waWxlU3RhY2sgPSBbXTsKICAgICAgIHRoaXMuaW5saW5l
U3RhY2sgPSBbXTsKIApAQCAtMTMwNyw3ICsxODQ2LDcgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0
Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogCiAgICAgICB0aGlzLmkgPSAwOwogCi0gICAgICBm
b3IobD1vcGNvZGVzLmxlbmd0aDsgdGhpcy5pPGw7IHRoaXMuaSsrKSB7CisgICAgICBmb3IodmFy
IGw9b3Bjb2Rlcy5sZW5ndGg7IHRoaXMuaTxsOyB0aGlzLmkrKykgewogICAgICAgICBvcGNvZGUg
PSBvcGNvZGVzW3RoaXMuaV07CiAKICAgICAgICAgaWYob3Bjb2RlLm9wY29kZSA9PT0gJ0RFQ0xB
UkUnKSB7CkBAIC0xMzE1LDE4ICsxODU0LDIxIEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBp
bGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICB0aGlzW29w
Y29kZS5vcGNvZGVdLmFwcGx5KHRoaXMsIG9wY29kZS5hcmdzKTsKICAgICAgICAgfQorCisgICAg
ICAgIC8vIFJlc2V0IHRoZSBzdHJpcE5leHQgZmxhZyBpZiBpdCB3YXMgbm90IHNldCBieSB0aGlz
IG9wZXJhdGlvbi4KKyAgICAgICAgaWYgKG9wY29kZS5vcGNvZGUgIT09IHRoaXMuc3RyaXBOZXh0
KSB7CisgICAgICAgICAgdGhpcy5zdHJpcE5leHQgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAg
fQogCi0gICAgICByZXR1cm4gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpOwot
ICAgIH0sCisgICAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJl
IHBlbmRpbmcuCisgICAgICB0aGlzLnB1c2hTb3VyY2UoJycpOwogCi0gICAgbmV4dE9wY29kZTog
ZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgb3Bjb2RlcyA9IHRoaXMuZW52aXJvbm1lbnQub3Bjb2Rl
czsKLSAgICAgIHJldHVybiBvcGNvZGVzW3RoaXMuaSArIDFdOwotICAgIH0sCisgICAgICBpZiAo
dGhpcy5zdGFja1Nsb3QgfHwgdGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxl
U3RhY2subGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0NvbXBpbGUgY29t
cGxldGVkIHdpdGggY29udGVudCBsZWZ0IG9uIHN0YWNrJyk7CisgICAgICB9CiAKLSAgICBlYXQ6
IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5pID0gdGhpcy5pICsgMTsKKyAgICAgIHJldHVybiB0
aGlzLmNyZWF0ZUZ1bmN0aW9uQ29udGV4dChhc09iamVjdCk7CiAgICAgfSwKIAogICAgIHByZWFt
YmxlOiBmdW5jdGlvbigpIHsKQEAgLTEzMzQsOCArMTg3Niw5IEBAIEhhbmRsZWJhcnMuSmF2YVNj
cmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKIAogICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQp
IHsKICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlOwotICAgICAgICB2YXIg
Y29waWVzID0gImhlbHBlcnMgPSBoZWxwZXJzIHx8ICIgKyBuYW1lc3BhY2UgKyAiLmhlbHBlcnM7
IjsKLSAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCkgeyBjb3BpZXMgPSBj
b3BpZXMgKyAiIHBhcnRpYWxzID0gcGFydGlhbHMgfHwgIiArIG5hbWVzcGFjZSArICIucGFydGlh
bHM7IjsgfQorCisgICAgICAgIHZhciBjb3BpZXMgPSAiaGVscGVycyA9IHRoaXMubWVyZ2UoaGVs
cGVycywgIiArIG5hbWVzcGFjZSArICIuaGVscGVycyk7IjsKKyAgICAgICAgaWYgKHRoaXMuZW52
aXJvbm1lbnQudXNlUGFydGlhbCkgeyBjb3BpZXMgPSBjb3BpZXMgKyAiIHBhcnRpYWxzID0gdGhp
cy5tZXJnZShwYXJ0aWFscywgIiArIG5hbWVzcGFjZSArICIucGFydGlhbHMpOyI7IH0KICAgICAg
ICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7IGNvcGllcyA9IGNvcGllcyArICIgZGF0YSA9IGRh
dGEgfHwge307IjsgfQogICAgICAgICBvdXQucHVzaChjb3BpZXMpOwogICAgICAgfSBlbHNlIHsK
QEAgLTEzNjQsNyArMTkwNyw5IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVu
Y3Rpb24oKSB7fTsKICAgICAgIC8vIEdlbmVyYXRlIG1pbmltaXplciBhbGlhcyBtYXBwaW5ncwog
ICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsKICAgICAgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhp
cy5jb250ZXh0LmFsaWFzZXMpIHsKLSAgICAgICAgICB0aGlzLnNvdXJjZVsxXSA9IHRoaXMuc291
cmNlWzFdICsgJywgJyArIGFsaWFzICsgJz0nICsgdGhpcy5jb250ZXh0LmFsaWFzZXNbYWxpYXNd
OworICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShhbGlh
cykpIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAnLCAn
ICsgYWxpYXMgKyAnPScgKyB0aGlzLmNvbnRleHQuYWxpYXNlc1thbGlhc107CisgICAgICAgICAg
fQogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTEzNzgsNyArMTkyMyw3IEBAIEhhbmRsZWJhcnMu
SmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgIH0KIAogICAgICAgaWYg
KCF0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2go
InJldHVybiBidWZmZXI7Iik7CisgICAgICAgIHRoaXMucHVzaFNvdXJjZSgicmV0dXJuIGJ1ZmZl
cjsiKTsKICAgICAgIH0KIAogICAgICAgdmFyIHBhcmFtcyA9IHRoaXMuaXNDaGlsZCA/IFsiZGVw
dGgwIiwgImRhdGEiXSA6IFsiSGFuZGxlYmFycyIsICJkZXB0aDAiLCAiaGVscGVycyIsICJwYXJ0
aWFscyIsICJkYXRhIl07CkBAIC0xMzkxLDkgKzE5MzYsNyBAQCBIYW5kbGViYXJzLkphdmFTY3Jp
cHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICB2YXIgc291cmNlID0gdGhpcy5tZXJn
ZVNvdXJjZSgpOwogCiAgICAgICBpZiAoIXRoaXMuaXNDaGlsZCkgewotICAgICAgICB2YXIgcmV2
aXNpb24gPSBIYW5kbGViYXJzLkNPTVBJTEVSX1JFVklTSU9OLAotICAgICAgICAgICAgdmVyc2lv
bnMgPSBIYW5kbGViYXJzLlJFVklTSU9OX0NIQU5HRVNbcmV2aXNpb25dOwotICAgICAgICBzb3Vy
Y2UgPSAidGhpcy5jb21waWxlckluZm8gPSBbIityZXZpc2lvbisiLCciK3ZlcnNpb25zKyInXTtc
biIrc291cmNlOworICAgICAgICBzb3VyY2UgPSB0aGlzLmNvbXBpbGVySW5mbygpK3NvdXJjZTsK
ICAgICAgIH0KIAogICAgICAgaWYgKGFzT2JqZWN0KSB7CkBAIC0xNDAyLDcgKzE5NDUsNyBAQCBI
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgIHJl
dHVybiBGdW5jdGlvbi5hcHBseSh0aGlzLCBwYXJhbXMpOwogICAgICAgfSBlbHNlIHsKICAgICAg
ICAgdmFyIGZ1bmN0aW9uU291cmNlID0gJ2Z1bmN0aW9uICcgKyAodGhpcy5uYW1lIHx8ICcnKSAr
ICcoJyArIHBhcmFtcy5qb2luKCcsJykgKyAnKSB7XG4gICcgKyBzb3VyY2UgKyAnfSc7Ci0gICAg
ICAgIEhhbmRsZWJhcnMubG9nKEhhbmRsZWJhcnMubG9nZ2VyLkRFQlVHLCBmdW5jdGlvblNvdXJj
ZSArICJcblxuIik7CisgICAgICAgIGxvZygnZGVidWcnLCBmdW5jdGlvblNvdXJjZSArICJcblxu
Iik7CiAgICAgICAgIHJldHVybiBmdW5jdGlvblNvdXJjZTsKICAgICAgIH0KICAgICB9LApAQCAt
MTQ2NiwxMCArMjAwOSw3IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rp
b24oKSB7fTsKICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50b3BTdGFjaygpOwogICAgICAgcGFy
YW1zLnNwbGljZSgxLCAwLCBjdXJyZW50KTsKIAotICAgICAgLy8gVXNlIHRoZSBvcHRpb25zIHZh
bHVlIGdlbmVyYXRlZCBmcm9tIHRoZSBpbnZvY2F0aW9uCi0gICAgICBwYXJhbXNbcGFyYW1zLmxl
bmd0aC0xXSA9ICdvcHRpb25zJzsKLQotICAgICAgdGhpcy5zb3VyY2UucHVzaCgiaWYgKCEiICsg
dGhpcy5sYXN0SGVscGVyICsgIikgeyAiICsgY3VycmVudCArICIgPSBibG9ja0hlbHBlck1pc3Np
bmcuY2FsbCgiICsgcGFyYW1zLmpvaW4oIiwgIikgKyAiKTsgfSIpOworICAgICAgdGhpcy5wdXNo
U291cmNlKCJpZiAoISIgKyB0aGlzLmxhc3RIZWxwZXIgKyAiKSB7ICIgKyBjdXJyZW50ICsgIiA9
IGJsb2NrSGVscGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMuam9pbigiLCAiKSArICIpOyB9Iik7
CiAgICAgfSwKIAogICAgIC8vIFthcHBlbmRDb250ZW50XQpAQCAtMTQ3OSw3ICsyMDE5LDI4IEBA
IEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAvLwog
ICAgIC8vIEFwcGVuZHMgdGhlIHN0cmluZyB2YWx1ZSBvZiBgY29udGVudGAgdG8gdGhlIGN1cnJl
bnQgYnVmZmVyCiAgICAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24oY29udGVudCkgewotICAgICAg
dGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKHRoaXMucXVvdGVkU3RyaW5nKGNv
bnRlbnQpKSk7CisgICAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkgeworICAgICAgICBjb250
ZW50ID0gdGhpcy5wZW5kaW5nQ29udGVudCArIGNvbnRlbnQ7CisgICAgICB9CisgICAgICBpZiAo
dGhpcy5zdHJpcE5leHQpIHsKKyAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlxz
Ky8sICcnKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IGNvbnRlbnQ7
CisgICAgfSwKKworICAgIC8vIFtzdHJpcF0KKyAgICAvLworICAgIC8vIE9uIHN0YWNrLCBiZWZv
cmU6IC4uLgorICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uCisgICAgLy8KKyAgICAvLyBSZW1v
dmVzIGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIHByaW9yIGNvbnRlbnQgbm9kZSBh
bmQgZmxhZ3MKKyAgICAvLyB0aGUgbmV4dCBvcGVyYXRpb24gZm9yIHN0cmlwcGluZyBpZiBpdCBp
cyBhIGNvbnRlbnQgbm9kZS4KKyAgICBzdHJpcDogZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhp
cy5wZW5kaW5nQ29udGVudCkgeworICAgICAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gdGhpcy5w
ZW5kaW5nQ29udGVudC5yZXBsYWNlKC9ccyskLywgJycpOworICAgICAgfQorICAgICAgdGhpcy5z
dHJpcE5leHQgPSAnc3RyaXAnOwogICAgIH0sCiAKICAgICAvLyBbYXBwZW5kXQpAQCAtMTQ5Niw5
ICsyMDU3LDkgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9
OwogICAgICAgLy8gd2hlbiB3ZSBleGFtaW5lIGxvY2FsCiAgICAgICB0aGlzLmZsdXNoSW5saW5l
KCk7CiAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBvcFN0YWNrKCk7Ci0gICAgICB0aGlzLnNvdXJj
ZS5wdXNoKCJpZigiICsgbG9jYWwgKyAiIHx8ICIgKyBsb2NhbCArICIgPT09IDApIHsgIiArIHRo
aXMuYXBwZW5kVG9CdWZmZXIobG9jYWwpICsgIiB9Iik7CisgICAgICB0aGlzLnB1c2hTb3VyY2Uo
ImlmKCIgKyBsb2NhbCArICIgfHwgIiArIGxvY2FsICsgIiA9PT0gMCkgeyAiICsgdGhpcy5hcHBl
bmRUb0J1ZmZlcihsb2NhbCkgKyAiIH0iKTsKICAgICAgIGlmICh0aGlzLmVudmlyb25tZW50Lmlz
U2ltcGxlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2goImVsc2UgeyAiICsgdGhpcy5hcHBl
bmRUb0J1ZmZlcigiJyciKSArICIgfSIpOworICAgICAgICB0aGlzLnB1c2hTb3VyY2UoImVsc2Ug
eyAiICsgdGhpcy5hcHBlbmRUb0J1ZmZlcigiJyciKSArICIgfSIpOwogICAgICAgfQogICAgIH0s
CiAKQEAgLTE1MTEsNyArMjA3Miw3IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0g
ZnVuY3Rpb24oKSB7fTsKICAgICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbigpIHsKICAgICAgIHRo
aXMuY29udGV4dC5hbGlhc2VzLmVzY2FwZUV4cHJlc3Npb24gPSAndGhpcy5lc2NhcGVFeHByZXNz
aW9uJzsKIAotICAgICAgdGhpcy5zb3VyY2UucHVzaCh0aGlzLmFwcGVuZFRvQnVmZmVyKCJlc2Nh
cGVFeHByZXNzaW9uKCIgKyB0aGlzLnBvcFN0YWNrKCkgKyAiKSIpKTsKKyAgICAgIHRoaXMucHVz
aFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKCJlc2NhcGVFeHByZXNzaW9uKCIgKyB0aGlzLnBv
cFN0YWNrKCkgKyAiKSIpKTsKICAgICB9LAogCiAgICAgLy8gW2dldENvbnRleHRdCkBAIC0xNTc5
LDExICsyMTQwLDExIEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24o
KSB7fTsKICAgICAvLyBbbG9va3VwRGF0YV0KICAgICAvLwogICAgIC8vIE9uIHN0YWNrLCBiZWZv
cmU6IC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogZGF0YVtpZF0sIC4uLgorICAgIC8vIE9u
IHN0YWNrLCBhZnRlcjogZGF0YSwgLi4uCiAgICAgLy8KLSAgICAvLyBQdXNoIHRoZSByZXN1bHQg
b2YgbG9va2luZyB1cCBgaWRgIG9uIHRoZSBjdXJyZW50IGRhdGEKLSAgICBsb29rdXBEYXRhOiBm
dW5jdGlvbihpZCkgewotICAgICAgdGhpcy5wdXNoKHRoaXMubmFtZUxvb2t1cCgnZGF0YScsIGlk
LCAnZGF0YScpKTsKKyAgICAvLyBQdXNoIHRoZSBkYXRhIGxvb2t1cCBvcGVyYXRvcgorICAgIGxv
b2t1cERhdGE6IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkYXRh
Jyk7CiAgICAgfSwKIAogICAgIC8vIFtwdXNoU3RyaW5nUGFyYW1dCkBAIC0xNTk5LDEwICsyMTYw
LDE0IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKIAog
ICAgICAgdGhpcy5wdXNoU3RyaW5nKHR5cGUpOwogCi0gICAgICBpZiAodHlwZW9mIHN0cmluZyA9
PT0gJ3N0cmluZycpIHsKLSAgICAgICAgdGhpcy5wdXNoU3RyaW5nKHN0cmluZyk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoc3RyaW5nKTsKKyAgICAgIC8v
IElmIGl0J3MgYSBzdWJleHByZXNzaW9uLCB0aGUgc3RyaW5nIHJlc3VsdAorICAgICAgLy8gd2ls
bCBiZSBwdXNoZWQgYWZ0ZXIgdGhpcyBvcGNvZGUuCisgICAgICBpZiAodHlwZSAhPT0gJ3NleHBy
JykgeworICAgICAgICBpZiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAg
ICB0aGlzLnB1c2hTdHJpbmcoc3RyaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0
aGlzLnB1c2hTdGFja0xpdGVyYWwoc3RyaW5nKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0s
CiAKQEAgLTE2MTAsMTkgKzIxNzUsMjUgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIg
PSBmdW5jdGlvbigpIHt9OwogICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd7fScpOwogCiAg
ICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICB0aGlzLnJlZ2lz
dGVyKCdoYXNoVHlwZXMnLCAne30nKTsKKyAgICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNo
Q29udGV4dHMKKyAgICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXMKICAgICAgIH0K
ICAgICB9LAogICAgIHB1c2hIYXNoOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuaGFzaCA9IHt2
YWx1ZXM6IFtdLCB0eXBlczogW119OworICAgICAgaWYgKHRoaXMuaGFzaCkgeworICAgICAgICB0
aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7CisgICAgICB9CisgICAgICB0aGlzLmhhc2ggPSB7
dmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW119OwogICAgIH0sCiAgICAgcG9wSGFz
aDogZnVuY3Rpb24oKSB7CiAgICAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDsKLSAgICAgIHRoaXMu
aGFzaCA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuaGFzaCA9IHRoaXMuaGFzaGVzLnBvcCgpOwog
CiAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICB0aGlzLnJl
Z2lzdGVyKCdoYXNoVHlwZXMnLCAneycgKyBoYXNoLnR5cGVzLmpvaW4oJywnKSArICd9Jyk7Cisg
ICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLmNvbnRleHRzLmpvaW4oJywnKSArICd9Jyk7Cisg
ICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLnR5cGVzLmpvaW4oJywnKSArICd9Jyk7CiAgICAg
ICB9CisKICAgICAgIHRoaXMucHVzaCgne1xuICAgICcgKyBoYXNoLnZhbHVlcy5qb2luKCcsXG4g
ICAgJykgKyAnXG4gIH0nKTsKICAgICB9LAogCkBAIC0xNjg0LDE3ICsyMjU1LDMxIEBAIEhhbmRs
ZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAvLyBhbmQgcHVz
aGVzIHRoZSBoZWxwZXIncyByZXR1cm4gdmFsdWUgb250byB0aGUgc3RhY2suCiAgICAgLy8KICAg
ICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxl
ZC4KLSAgICBpbnZva2VIZWxwZXI6IGZ1bmN0aW9uKHBhcmFtU2l6ZSwgbmFtZSkgeworICAgIGlu
dm9rZUhlbHBlcjogZnVuY3Rpb24ocGFyYW1TaXplLCBuYW1lLCBpc1Jvb3QpIHsKICAgICAgIHRo
aXMuY29udGV4dC5hbGlhc2VzLmhlbHBlck1pc3NpbmcgPSAnaGVscGVycy5oZWxwZXJNaXNzaW5n
JzsKKyAgICAgIHRoaXMudXNlUmVnaXN0ZXIoJ2hlbHBlcicpOwogCiAgICAgICB2YXIgaGVscGVy
ID0gdGhpcy5sYXN0SGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUsIHRy
dWUpOworICAgICAgdmFyIG5vbkhlbHBlciA9IHRoaXMubmFtZUxvb2t1cCgnZGVwdGgnICsgdGhp
cy5sYXN0Q29udGV4dCwgbmFtZSwgJ2NvbnRleHQnKTsKIAotICAgICAgdGhpcy5wdXNoKGhlbHBl
ci5uYW1lKTsKLSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAg
ICAgcmV0dXJuIG5hbWUgKyAnID8gJyArIG5hbWUgKyAnLmNhbGwoJyArCi0gICAgICAgICAgICBo
ZWxwZXIuY2FsbFBhcmFtcyArICIpICIgKyAiOiBoZWxwZXJNaXNzaW5nLmNhbGwoIiArCi0gICAg
ICAgICAgICBoZWxwZXIuaGVscGVyTWlzc2luZ1BhcmFtcyArICIpIjsKLSAgICAgIH0pOworICAg
ICAgdmFyIGxvb2t1cCA9ICdoZWxwZXIgPSAnICsgaGVscGVyLm5hbWUgKyAnIHx8ICcgKyBub25I
ZWxwZXI7CisgICAgICBpZiAoaGVscGVyLnBhcmFtc0luaXQpIHsKKyAgICAgICAgbG9va3VwICs9
ICcsJyArIGhlbHBlci5wYXJhbXNJbml0OworICAgICAgfQorCisgICAgICB0aGlzLnB1c2goCisg
ICAgICAgICcoJworICAgICAgICAgICsgbG9va3VwCisgICAgICAgICAgKyAnLGhlbHBlciAnCisg
ICAgICAgICAgICArICc/IGhlbHBlci5jYWxsKCcgKyBoZWxwZXIuY2FsbFBhcmFtcyArICcpICcK
KyAgICAgICAgICAgICsgJzogaGVscGVyTWlzc2luZy5jYWxsKCcgKyBoZWxwZXIuaGVscGVyTWlz
c2luZ1BhcmFtcyArICcpKScpOworCisgICAgICAvLyBBbHdheXMgZmx1c2ggc3ViZXhwcmVzc2lv
bnMuIFRoaXMgaXMgYm90aCB0byBwcmV2ZW50IHRoZSBjb21wb3VuZGluZyBzaXplIGlzc3VlIHRo
YXQKKyAgICAgIC8vIG9jY3VycyB3aGVuIHRoZSBjb2RlIGhhcyB0byBiZSBkdXBsaWNhdGVkIGZv
ciBpbmxpbmluZyBhbmQgYWxzbyB0byBwcmV2ZW50IGVycm9ycworICAgICAgLy8gZHVlIHRvIHRo
ZSBpbmNvcnJlY3Qgb3B0aW9ucyBvYmplY3QgYmVpbmcgcGFzc2VkIGR1ZSB0byB0aGUgc2hhcmVk
IHJlZ2lzdGVyLgorICAgICAgaWYgKCFpc1Jvb3QpIHsKKyAgICAgICAgdGhpcy5mbHVzaElubGlu
ZSgpOworICAgICAgfQogICAgIH0sCiAKICAgICAvLyBbaW52b2tlS25vd25IZWxwZXJdCkBAIC0x
NzIzLDggKzIzMDgsOSBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9u
KCkge307CiAgICAgLy8gYGtub3duSGVscGVyc09ubHlgIGZsYWdzIGF0IGNvbXBpbGUtdGltZS4K
ICAgICBpbnZva2VBbWJpZ3VvdXM6IGZ1bmN0aW9uKG5hbWUsIGhlbHBlckNhbGwpIHsKICAgICAg
IHRoaXMuY29udGV4dC5hbGlhc2VzLmZ1bmN0aW9uVHlwZSA9ICciZnVuY3Rpb24iJzsKKyAgICAg
IHRoaXMudXNlUmVnaXN0ZXIoJ2hlbHBlcicpOwogCi0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVy
YWwoJ3t9Jyk7ICAgIC8vIEhhc2ggdmFsdWUKKyAgICAgIHRoaXMuZW1wdHlIYXNoKCk7CiAgICAg
ICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKIAog
ICAgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAo
J2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7CkBAIC0xNzMyLDggKzIzMTgsMTEgQEAgSGFuZGxl
YmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAgdmFyIG5vbkhl
bHBlciA9IHRoaXMubmFtZUxvb2t1cCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCwgbmFtZSwg
J2NvbnRleHQnKTsKICAgICAgIHZhciBuZXh0U3RhY2sgPSB0aGlzLm5leHRTdGFjaygpOwogCi0g
ICAgICB0aGlzLnNvdXJjZS5wdXNoKCdpZiAoJyArIG5leHRTdGFjayArICcgPSAnICsgaGVscGVy
TmFtZSArICcpIHsgJyArIG5leHRTdGFjayArICcgPSAnICsgbmV4dFN0YWNrICsgJy5jYWxsKCcg
KyBoZWxwZXIuY2FsbFBhcmFtcyArICcpOyB9Jyk7Ci0gICAgICB0aGlzLnNvdXJjZS5wdXNoKCdl
bHNlIHsgJyArIG5leHRTdGFjayArICcgPSAnICsgbm9uSGVscGVyICsgJzsgJyArIG5leHRTdGFj
ayArICcgPSB0eXBlb2YgJyArIG5leHRTdGFjayArICcgPT09IGZ1bmN0aW9uVHlwZSA/ICcgKyBu
ZXh0U3RhY2sgKyAnLmFwcGx5KGRlcHRoMCkgOiAnICsgbmV4dFN0YWNrICsgJzsgfScpOworICAg
ICAgaWYgKGhlbHBlci5wYXJhbXNJbml0KSB7CisgICAgICAgIHRoaXMucHVzaFNvdXJjZShoZWxw
ZXIucGFyYW1zSW5pdCk7CisgICAgICB9CisgICAgICB0aGlzLnB1c2hTb3VyY2UoJ2lmIChoZWxw
ZXIgPSAnICsgaGVscGVyTmFtZSArICcpIHsgJyArIG5leHRTdGFjayArICcgPSBoZWxwZXIuY2Fs
bCgnICsgaGVscGVyLmNhbGxQYXJhbXMgKyAnKTsgfScpOworICAgICAgdGhpcy5wdXNoU291cmNl
KCdlbHNlIHsgaGVscGVyID0gJyArIG5vbkhlbHBlciArICc7ICcgKyBuZXh0U3RhY2sgKyAnID0g
dHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoJyArIGhlbHBlci5j
YWxsUGFyYW1zICsgJykgOiBoZWxwZXI7IH0nKTsKICAgICB9LAogCiAgICAgLy8gW2ludm9rZVBh
cnRpYWxdCkBAIC0xNzYzLDE0ICsyMzUyLDE4IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBp
bGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAvLyBhbmQgcHVzaGVzIHRoZSBoYXNoIGJhY2sgb250
byB0aGUgc3RhY2suCiAgICAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbihrZXkpIHsKICAgICAgIHZh
ciB2YWx1ZSA9IHRoaXMucG9wU3RhY2soKSwKKyAgICAgICAgICBjb250ZXh0LAogICAgICAgICAg
IHR5cGU7CiAKICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CiAgICAgICAg
IHR5cGUgPSB0aGlzLnBvcFN0YWNrKCk7Ci0gICAgICAgIHRoaXMucG9wU3RhY2soKTsKKyAgICAg
ICAgY29udGV4dCA9IHRoaXMucG9wU3RhY2soKTsKICAgICAgIH0KIAogICAgICAgdmFyIGhhc2gg
PSB0aGlzLmhhc2g7CisgICAgICBpZiAoY29udGV4dCkgeworICAgICAgICBoYXNoLmNvbnRleHRz
LnB1c2goIiciICsga2V5ICsgIic6ICIgKyBjb250ZXh0KTsKKyAgICAgIH0KICAgICAgIGlmICh0
eXBlKSB7CiAgICAgICAgIGhhc2gudHlwZXMucHVzaCgiJyIgKyBrZXkgKyAiJzogIiArIHR5cGUp
OwogICAgICAgfQpAQCAtMTgzMSwxNyArMjQyNCwxMiBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRD
b21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgIGVsc2UgeyBwcm9ncmFtUGFyYW1zLnB1
c2goImRlcHRoIiArIChkZXB0aCAtIDEpKTsgfQogICAgICAgfQogCi0gICAgICBpZihkZXB0aHMu
bGVuZ3RoID09PSAwKSB7Ci0gICAgICAgIHJldHVybiAic2VsZi5wcm9ncmFtKCIgKyBwcm9ncmFt
UGFyYW1zLmpvaW4oIiwgIikgKyAiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcm9ncmFt
UGFyYW1zLnNoaWZ0KCk7Ci0gICAgICAgIHJldHVybiAic2VsZi5wcm9ncmFtV2l0aERlcHRoKCIg
KyBwcm9ncmFtUGFyYW1zLmpvaW4oIiwgIikgKyAiKSI7Ci0gICAgICB9CisgICAgICByZXR1cm4g
KGRlcHRocy5sZW5ndGggPT09IDAgPyAic2VsZi5wcm9ncmFtKCIgOiAic2VsZi5wcm9ncmFtV2l0
aERlcHRoKCIpICsgcHJvZ3JhbVBhcmFtcy5qb2luKCIsICIpICsgIikiOwogICAgIH0sCiAKICAg
ICByZWdpc3RlcjogZnVuY3Rpb24obmFtZSwgdmFsKSB7CiAgICAgICB0aGlzLnVzZVJlZ2lzdGVy
KG5hbWUpOwotICAgICAgdGhpcy5zb3VyY2UucHVzaChuYW1lICsgIiA9ICIgKyB2YWwgKyAiOyIp
OworICAgICAgdGhpcy5wdXNoU291cmNlKG5hbWUgKyAiID0gIiArIHZhbCArICI7Iik7CiAgICAg
fSwKIAogICAgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbihuYW1lKSB7CkBAIC0xODU1LDEyICsyNDQz
LDIzIEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAg
ICAgIHJldHVybiB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwogICAgIH0sCiAKKyAgICBw
dXNoU291cmNlOiBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICAgIGlmICh0aGlzLnBlbmRpbmdDb250
ZW50KSB7CisgICAgICAgIHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlz
LnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSkpOworICAgICAgICB0aGlzLnBlbmRp
bmdDb250ZW50ID0gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICBpZiAoc291cmNlKSB7Cisg
ICAgICAgIHRoaXMuc291cmNlLnB1c2goc291cmNlKTsKKyAgICAgIH0KKyAgICB9LAorCiAgICAg
cHVzaFN0YWNrOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICB0aGlzLmZsdXNoSW5saW5lKCk7CiAK
ICAgICAgIHZhciBzdGFjayA9IHRoaXMuaW5jclN0YWNrKCk7CiAgICAgICBpZiAoaXRlbSkgewot
ICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKHN0YWNrICsgIiA9ICIgKyBpdGVtICsgIjsiKTsKKyAg
ICAgICAgdGhpcy5wdXNoU291cmNlKHN0YWNrICsgIiA9ICIgKyBpdGVtICsgIjsiKTsKICAgICAg
IH0KICAgICAgIHRoaXMuY29tcGlsZVN0YWNrLnB1c2goc3RhY2spOwogICAgICAgcmV0dXJuIHN0
YWNrOwpAQCAtMTg2OSw3ICsyNDY4LDkgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIg
PSBmdW5jdGlvbigpIHt9OwogICAgIHJlcGxhY2VTdGFjazogZnVuY3Rpb24oY2FsbGJhY2spIHsK
ICAgICAgIHZhciBwcmVmaXggPSAnJywKICAgICAgICAgICBpbmxpbmUgPSB0aGlzLmlzSW5saW5l
KCksCi0gICAgICAgICAgc3RhY2s7CisgICAgICAgICAgc3RhY2ssCisgICAgICAgICAgY3JlYXRl
ZFN0YWNrLAorICAgICAgICAgIHVzZWRMaXRlcmFsOwogCiAgICAgICAvLyBJZiB3ZSBhcmUgY3Vy
cmVudGx5IGlubGluZSB0aGVuIHdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQg
aW50byB0aGUKICAgICAgIC8vIHJlcGxhY2VtZW50IHN0YXRlbWVudCB2aWEgJywnCkBAIC0xODc5
LDkgKzI0ODAsMTEgQEAgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigp
IHt9OwogICAgICAgICBpZiAodG9wIGluc3RhbmNlb2YgTGl0ZXJhbCkgewogICAgICAgICAgIC8v
IExpdGVyYWxzIGRvIG5vdCBuZWVkIHRvIGJlIGlubGluZWQKICAgICAgICAgICBzdGFjayA9IHRv
cC52YWx1ZTsKKyAgICAgICAgICB1c2VkTGl0ZXJhbCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSB0aGUgY3VycmVudCBzdGFjayBuYW1lIGZvciB1
c2UgYnkgdGhlIGlubGluZQotICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5zdGFja1Nsb3QgPyB0
aGlzLnRvcFN0YWNrTmFtZSgpIDogdGhpcy5pbmNyU3RhY2soKTsKKyAgICAgICAgICBjcmVhdGVk
U3RhY2sgPSAhdGhpcy5zdGFja1Nsb3Q7CisgICAgICAgICAgdmFyIG5hbWUgPSAhY3JlYXRlZFN0
YWNrID8gdGhpcy50b3BTdGFja05hbWUoKSA6IHRoaXMuaW5jclN0YWNrKCk7CiAKICAgICAgICAg
ICBwcmVmaXggPSAnKCcgKyB0aGlzLnB1c2gobmFtZSkgKyAnID0gJyArIHRvcCArICcpLCc7CiAg
ICAgICAgICAgc3RhY2sgPSB0aGlzLnRvcFN0YWNrKCk7CkBAIC0xODkzLDkgKzI0OTYsMTIgQEAg
SGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIgPSBmdW5jdGlvbigpIHt9OwogICAgICAgdmFy
IGl0ZW0gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0YWNrKTsKIAogICAgICAgaWYgKGlubGluZSkg
ewotICAgICAgICBpZiAodGhpcy5pbmxpbmVTdGFjay5sZW5ndGggfHwgdGhpcy5jb21waWxlU3Rh
Y2subGVuZ3RoKSB7CisgICAgICAgIGlmICghdXNlZExpdGVyYWwpIHsKICAgICAgICAgICB0aGlz
LnBvcFN0YWNrKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGNyZWF0ZWRTdGFjaykgeworICAg
ICAgICAgIHRoaXMuc3RhY2tTbG90LS07CisgICAgICAgIH0KICAgICAgICAgdGhpcy5wdXNoKCco
JyArIHByZWZpeCArIGl0ZW0gKyAnKScpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gUHJl
dmVudCBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRleHQgZGVwdGggdmFyaWFibGUuIFRocm91Z2gg
cmVwbGFjZVN0YWNrCkBAIC0xOTAzLDcgKzI1MDksNyBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRD
b21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgICAgc3RhY2sgPSB0aGlzLm5leHRTdGFj
aygpOwogICAgICAgICB9CiAKLSAgICAgICAgdGhpcy5zb3VyY2UucHVzaChzdGFjayArICIgPSAo
IiArIHByZWZpeCArIGl0ZW0gKyAiKTsiKTsKKyAgICAgICAgdGhpcy5wdXNoU291cmNlKHN0YWNr
ICsgIiA9ICgiICsgcHJlZml4ICsgaXRlbSArICIpOyIpOwogICAgICAgfQogICAgICAgcmV0dXJu
IHN0YWNrOwogICAgIH0sCkBAIC0xOTQ2LDYgKzI1NTIsOSBAQCBIYW5kbGViYXJzLkphdmFTY3Jp
cHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwog
ICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFpbmxpbmUpIHsKKyAgICAgICAgICBpZiAoIXRo
aXMuc3RhY2tTbG90KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlk
IHN0YWNrIHBvcCcpOworICAgICAgICAgIH0KICAgICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwog
ICAgICAgICB9CiAgICAgICAgIHJldHVybiBpdGVtOwpAQCAtMTk2OCwyOSArMjU3NywzNSBAQCBI
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgIC5y
ZXBsYWNlKC9cXC9nLCAnXFxcXCcpCiAgICAgICAgIC5yZXBsYWNlKC8iL2csICdcXCInKQogICAg
ICAgICAucmVwbGFjZSgvXG4vZywgJ1xcbicpCi0gICAgICAgIC5yZXBsYWNlKC9cci9nLCAnXFxy
JykgKyAnIic7CisgICAgICAgIC5yZXBsYWNlKC9cci9nLCAnXFxyJykKKyAgICAgICAgLnJlcGxh
Y2UoL1x1MjAyOC9nLCAnXFx1MjAyOCcpICAgLy8gUGVyIEVjbWEtMjYyIDcuMyArIDcuOC40Cisg
ICAgICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKSArICciJzsKICAgICB9LAogCiAg
ICAgc2V0dXBIZWxwZXI6IGZ1bmN0aW9uKHBhcmFtU2l6ZSwgbmFtZSwgbWlzc2luZ1BhcmFtcykg
ewotICAgICAgdmFyIHBhcmFtcyA9IFtdOwotICAgICAgdGhpcy5zZXR1cFBhcmFtcyhwYXJhbVNp
emUsIHBhcmFtcywgbWlzc2luZ1BhcmFtcyk7CisgICAgICB2YXIgcGFyYW1zID0gW10sCisgICAg
ICAgICAgcGFyYW1zSW5pdCA9IHRoaXMuc2V0dXBQYXJhbXMocGFyYW1TaXplLCBwYXJhbXMsIG1p
c3NpbmdQYXJhbXMpOwogICAgICAgdmFyIGZvdW5kSGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdo
ZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpOwogCiAgICAgICByZXR1cm4gewogICAgICAgICBwYXJh
bXM6IHBhcmFtcywKKyAgICAgICAgcGFyYW1zSW5pdDogcGFyYW1zSW5pdCwKICAgICAgICAgbmFt
ZTogZm91bmRIZWxwZXIsCiAgICAgICAgIGNhbGxQYXJhbXM6IFsiZGVwdGgwIl0uY29uY2F0KHBh
cmFtcykuam9pbigiLCAiKSwKICAgICAgICAgaGVscGVyTWlzc2luZ1BhcmFtczogbWlzc2luZ1Bh
cmFtcyAmJiBbImRlcHRoMCIsIHRoaXMucXVvdGVkU3RyaW5nKG5hbWUpXS5jb25jYXQocGFyYW1z
KS5qb2luKCIsICIpCiAgICAgICB9OwogICAgIH0sCiAKLSAgICAvLyB0aGUgcGFyYW1zIGFuZCBj
b250ZXh0cyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBhcnJheXMKLSAgICAvLyB0byBmaWxsIGlu
Ci0gICAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3Rl
cikgeworICAgIHNldHVwT3B0aW9uczogZnVuY3Rpb24ocGFyYW1TaXplLCBwYXJhbXMpIHsKICAg
ICAgIHZhciBvcHRpb25zID0gW10sIGNvbnRleHRzID0gW10sIHR5cGVzID0gW10sIHBhcmFtLCBp
bnZlcnNlLCBwcm9ncmFtOwogCiAgICAgICBvcHRpb25zLnB1c2goImhhc2g6IiArIHRoaXMucG9w
U3RhY2soKSk7CiAKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CisgICAg
ICAgIG9wdGlvbnMucHVzaCgiaGFzaFR5cGVzOiIgKyB0aGlzLnBvcFN0YWNrKCkpOworICAgICAg
ICBvcHRpb25zLnB1c2goImhhc2hDb250ZXh0czoiICsgdGhpcy5wb3BTdGFjaygpKTsKKyAgICAg
IH0KKwogICAgICAgaW52ZXJzZSA9IHRoaXMucG9wU3RhY2soKTsKICAgICAgIHByb2dyYW0gPSB0
aGlzLnBvcFN0YWNrKCk7CiAKQEAgLTIwMDMsNyArMjYxOCw3IEBAIEhhbmRsZWJhcnMuSmF2YVNj
cmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgh
aW52ZXJzZSkgewotICAgICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuc2VsZiA9ICJ0aGlzIjsK
KyAgICAgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOwogICAgICAgICAg
IGludmVyc2UgPSAic2VsZi5ub29wIjsKICAgICAgICAgfQogCkBAIC0yMDI0LDIxICsyNjM5LDI4
IEBAIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKICAgICAg
IGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7CiAgICAgICAgIG9wdGlvbnMucHVzaCgi
Y29udGV4dHM6WyIgKyBjb250ZXh0cy5qb2luKCIsIikgKyAiXSIpOwogICAgICAgICBvcHRpb25z
LnB1c2goInR5cGVzOlsiICsgdHlwZXMuam9pbigiLCIpICsgIl0iKTsKLSAgICAgICAgb3B0aW9u
cy5wdXNoKCJoYXNoVHlwZXM6aGFzaFR5cGVzIik7CiAgICAgICB9CiAKICAgICAgIGlmKHRoaXMu
b3B0aW9ucy5kYXRhKSB7CiAgICAgICAgIG9wdGlvbnMucHVzaCgiZGF0YTpkYXRhIik7CiAgICAg
ICB9CiAKLSAgICAgIG9wdGlvbnMgPSAieyIgKyBvcHRpb25zLmpvaW4oIiwiKSArICJ9IjsKKyAg
ICAgIHJldHVybiBvcHRpb25zOworICAgIH0sCisKKyAgICAvLyB0aGUgcGFyYW1zIGFuZCBjb250
ZXh0cyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBhcnJheXMKKyAgICAvLyB0byBmaWxsIGluCisg
ICAgc2V0dXBQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtU2l6ZSwgcGFyYW1zLCB1c2VSZWdpc3Rlcikg
eworICAgICAgdmFyIG9wdGlvbnMgPSAneycgKyB0aGlzLnNldHVwT3B0aW9ucyhwYXJhbVNpemUs
IHBhcmFtcykuam9pbignLCcpICsgJ30nOworCiAgICAgICBpZiAodXNlUmVnaXN0ZXIpIHsKLSAg
ICAgICAgdGhpcy5yZWdpc3Rlcignb3B0aW9ucycsIG9wdGlvbnMpOworICAgICAgICB0aGlzLnVz
ZVJlZ2lzdGVyKCdvcHRpb25zJyk7CiAgICAgICAgIHBhcmFtcy5wdXNoKCdvcHRpb25zJyk7Cisg
ICAgICAgIHJldHVybiAnb3B0aW9ucz0nICsgb3B0aW9uczsKICAgICAgIH0gZWxzZSB7CiAgICAg
ICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpOworICAgICAgICByZXR1cm4gJyc7CiAgICAgICB9Ci0g
ICAgICByZXR1cm4gcGFyYW1zLmpvaW4oIiwgIik7CiAgICAgfQogICB9OwogCkBAIC0yMDY3LDEz
NSArMjY4OSw1OCBAQCBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkg
e307CiAgIH0KIAogICBKYXZhU2NyaXB0Q29tcGlsZXIuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJs
ZU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7Ci0gICAgaWYoIUphdmFTY3JpcHRDb21waWxlci5SRVNF
UlZFRF9XT1JEU1tuYW1lXSAmJiAvXlthLXpBLVpfJF1bMC05YS16QS1aXyRdKyQvLnRlc3QobmFt
ZSkpIHsKKyAgICBpZighSmF2YVNjcmlwdENvbXBpbGVyLlJFU0VSVkVEX1dPUkRTW25hbWVdICYm
IC9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChuYW1lKSkgewogICAgICAgcmV0dXJu
IHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfTsKIAotfSkoSGFuZGxlYmFycy5D
b21waWxlciwgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIpOwotCi1IYW5kbGViYXJzLnBy
ZWNvbXBpbGUgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykgewotICBpZiAoIWlucHV0IHx8ICh0
eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LmNvbnN0cnVjdG9yICE9PSBIYW5kbGVi
YXJzLkFTVC5Qcm9ncmFtTm9kZSkpIHsKLSAgICB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRp
b24oIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFy
cy5jb21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1dCk7Ci0gIH0KLQotICBvcHRpb25zID0gb3B0
aW9ucyB8fCB7fTsKLSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7Ci0gICAgb3B0aW9ucy5k
YXRhID0gdHJ1ZTsKLSAgfQotICB2YXIgYXN0ID0gSGFuZGxlYmFycy5wYXJzZShpbnB1dCk7Ci0g
IHZhciBlbnZpcm9ubWVudCA9IG5ldyBIYW5kbGViYXJzLkNvbXBpbGVyKCkuY29tcGlsZShhc3Qs
IG9wdGlvbnMpOwotICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyKCku
Y29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucyk7Ci19OwotCi1IYW5kbGViYXJzLmNvbXBpbGUg
PSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykgewotICBpZiAoIWlucHV0IHx8ICh0eXBlb2YgaW5w
dXQgIT09ICdzdHJpbmcnICYmIGlucHV0LmNvbnN0cnVjdG9yICE9PSBIYW5kbGViYXJzLkFTVC5Q
cm9ncmFtTm9kZSkpIHsKLSAgICB0aHJvdyBuZXcgSGFuZGxlYmFycy5FeGNlcHRpb24oIllvdSBt
dXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5jb21waWxl
LiBZb3UgcGFzc2VkICIgKyBpbnB1dCk7Ci0gIH0KLQotICBvcHRpb25zID0gb3B0aW9ucyB8fCB7
fTsKLSAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7Ci0gICAgb3B0aW9ucy5kYXRhID0gdHJ1
ZTsKLSAgfQotICB2YXIgY29tcGlsZWQ7Ci0gIGZ1bmN0aW9uIGNvbXBpbGUoKSB7Ci0gICAgdmFy
IGFzdCA9IEhhbmRsZWJhcnMucGFyc2UoaW5wdXQpOwotICAgIHZhciBlbnZpcm9ubWVudCA9IG5l
dyBIYW5kbGViYXJzLkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwotICAgIHZhciB0
ZW1wbGF0ZVNwZWMgPSBuZXcgSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIoKS5jb21waWxl
KGVudmlyb25tZW50LCBvcHRpb25zLCB1bmRlZmluZWQsIHRydWUpOwotICAgIHJldHVybiBIYW5k
bGViYXJzLnRlbXBsYXRlKHRlbXBsYXRlU3BlYyk7Ci0gIH0KLQotICAvLyBUZW1wbGF0ZSBpcyBv
bmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCi0g
IHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgaWYgKCFjb21waWxlZCkg
ewotICAgICAgY29tcGlsZWQgPSBjb21waWxlKCk7Ci0gICAgfQotICAgIHJldHVybiBjb21waWxl
ZC5jYWxsKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMpOwotICB9OwotfTsKLTsKLS8vIGxpYi9oYW5k
bGViYXJzL3J1bnRpbWUuanMKLUhhbmRsZWJhcnMuVk0gPSB7Ci0gIHRlbXBsYXRlOiBmdW5jdGlv
bih0ZW1wbGF0ZVNwZWMpIHsKLSAgICAvLyBKdXN0IGFkZCB3YXRlcgotICAgIHZhciBjb250YWlu
ZXIgPSB7Ci0gICAgICBlc2NhcGVFeHByZXNzaW9uOiBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4
cHJlc3Npb24sCi0gICAgICBpbnZva2VQYXJ0aWFsOiBIYW5kbGViYXJzLlZNLmludm9rZVBhcnRp
YWwsCi0gICAgICBwcm9ncmFtczogW10sCi0gICAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBmbiwg
ZGF0YSkgewotICAgICAgICB2YXIgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldOwot
ICAgICAgICBpZihkYXRhKSB7Ci0gICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuVk0ucHJvZ3Jh
bShmbiwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZihwcm9ncmFtV3JhcHBlcikgewotICAgICAg
ICAgIHJldHVybiBwcm9ncmFtV3JhcHBlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBw
cm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSBIYW5kbGViYXJzLlZNLnByb2dyYW0o
Zm4pOwotICAgICAgICAgIHJldHVybiBwcm9ncmFtV3JhcHBlcjsKLSAgICAgICAgfQotICAgICAg
fSwKLSAgICAgIHByb2dyYW1XaXRoRGVwdGg6IEhhbmRsZWJhcnMuVk0ucHJvZ3JhbVdpdGhEZXB0
aCwKLSAgICAgIG5vb3A6IEhhbmRsZWJhcnMuVk0ubm9vcCwKLSAgICAgIGNvbXBpbGVySW5mbzog
bnVsbAorICBfX2V4cG9ydHNfXyA9IEphdmFTY3JpcHRDb21waWxlcjsKKyAgcmV0dXJuIF9fZXhw
b3J0c19fOworfSkoX19tb2R1bGUyX18sIF9fbW9kdWxlNV9fKTsKKworLy8gaGFuZGxlYmFycy5q
cwordmFyIF9fbW9kdWxlMF9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRl
bmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9f
KSB7CisgICJ1c2Ugc3RyaWN0IjsKKyAgdmFyIF9fZXhwb3J0c19fOworICAvKmdsb2JhbHMgSGFu
ZGxlYmFyczogdHJ1ZSAqLworICB2YXIgSGFuZGxlYmFycyA9IF9fZGVwZW5kZW5jeTFfXzsKKwor
ICAvLyBDb21waWxlciBpbXBvcnRzCisgIHZhciBBU1QgPSBfX2RlcGVuZGVuY3kyX187CisgIHZh
ciBQYXJzZXIgPSBfX2RlcGVuZGVuY3kzX18ucGFyc2VyOworICB2YXIgcGFyc2UgPSBfX2RlcGVu
ZGVuY3kzX18ucGFyc2U7CisgIHZhciBDb21waWxlciA9IF9fZGVwZW5kZW5jeTRfXy5Db21waWxl
cjsKKyAgdmFyIGNvbXBpbGUgPSBfX2RlcGVuZGVuY3k0X18uY29tcGlsZTsKKyAgdmFyIHByZWNv
bXBpbGUgPSBfX2RlcGVuZGVuY3k0X18ucHJlY29tcGlsZTsKKyAgdmFyIEphdmFTY3JpcHRDb21w
aWxlciA9IF9fZGVwZW5kZW5jeTVfXzsKKworICB2YXIgX2NyZWF0ZSA9IEhhbmRsZWJhcnMuY3Jl
YXRlOworICB2YXIgY3JlYXRlID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGhiID0gX2NyZWF0ZSgp
OworCisgICAgaGIuY29tcGlsZSA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7CisgICAgICBy
ZXR1cm4gY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwogICAgIH07Ci0KLSAgICByZXR1cm4g
ZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwg
e307Ci0gICAgICB2YXIgcmVzdWx0ID0gdGVtcGxhdGVTcGVjLmNhbGwoY29udGFpbmVyLCBIYW5k
bGViYXJzLCBjb250ZXh0LCBvcHRpb25zLmhlbHBlcnMsIG9wdGlvbnMucGFydGlhbHMsIG9wdGlv
bnMuZGF0YSk7Ci0KLSAgICAgIHZhciBjb21waWxlckluZm8gPSBjb250YWluZXIuY29tcGlsZXJJ
bmZvIHx8IFtdLAotICAgICAgICAgIGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm9bMF0g
fHwgMSwKLSAgICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBIYW5kbGViYXJzLkNPTVBJTEVSX1JF
VklTSU9OOwotCi0gICAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9u
KSB7Ci0gICAgICAgIGlmIChjb21waWxlclJldmlzaW9uIDwgY3VycmVudFJldmlzaW9uKSB7Ci0g
ICAgICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9IEhhbmRsZWJhcnMuUkVWSVNJT05fQ0hBTkdF
U1tjdXJyZW50UmV2aXNpb25dLAotICAgICAgICAgICAgICBjb21waWxlclZlcnNpb25zID0gSGFu
ZGxlYmFycy5SRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dOwotICAgICAgICAgIHRo
cm93ICJUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhh
bmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAgICAgICAgICJQ
bGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgiK3J1bnRp
bWVWZXJzaW9ucysiKSBvciBkb3duZ3JhZGUgeW91ciBydW50aW1lIHRvIGFuIG9sZGVyIHZlcnNp
b24gKCIrY29tcGlsZXJWZXJzaW9ucysiKS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IC8vIFVzZSB0aGUgZW1iZWRkZWQgdmVyc2lvbiBpbmZvIHNpbmNlIHRoZSBydW50aW1lIGRvZXNu
J3Qga25vdyBhYm91dCB0aGlzIHJldmlzaW9uIHlldAotICAgICAgICAgIHRocm93ICJUZW1wbGF0
ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFu
IHRoZSBjdXJyZW50IHJ1bnRpbWUuICIrCi0gICAgICAgICAgICAgICAgIlBsZWFzZSB1cGRhdGUg
eW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIitjb21waWxlckluZm9bMV0rIikuIjsK
LSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OworICAgIGhiLnByZWNv
bXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHsKKyAgICAgIHJldHVybiBwcmVjb21w
aWxlKGlucHV0LCBvcHRpb25zLCBoYik7CiAgICAgfTsKLSAgfSwKIAotICBwcm9ncmFtV2l0aERl
cHRoOiBmdW5jdGlvbihmbiwgZGF0YSwgJGRlcHRoKSB7Ci0gICAgdmFyIGFyZ3MgPSBBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOworICAgIGhiLkFTVCA9IEFTVDsKKyAg
ICBoYi5Db21waWxlciA9IENvbXBpbGVyOworICAgIGhiLkphdmFTY3JpcHRDb21waWxlciA9IEph
dmFTY3JpcHRDb21waWxlcjsKKyAgICBoYi5QYXJzZXIgPSBQYXJzZXI7CisgICAgaGIucGFyc2Ug
PSBwYXJzZTsKIAotICAgIHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAg
ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMs
IFtjb250ZXh0LCBvcHRpb25zLmRhdGEgfHwgZGF0YV0uY29uY2F0KGFyZ3MpKTsKLSAgICB9Owot
ICB9LAotICBwcm9ncmFtOiBmdW5jdGlvbihmbiwgZGF0YSkgewotICAgIHJldHVybiBmdW5jdGlv
bihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAg
ICByZXR1cm4gaGI7CisgIH07CiAKLSAgICAgIHJldHVybiBmbihjb250ZXh0LCBvcHRpb25zLmRh
dGEgfHwgZGF0YSk7Ci0gICAgfTsKLSAgfSwKLSAgbm9vcDogZnVuY3Rpb24oKSB7IHJldHVybiAi
IjsgfSwKLSAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24ocGFydGlhbCwgbmFtZSwgY29udGV4dCwg
aGVscGVycywgcGFydGlhbHMsIGRhdGEpIHsKLSAgICB2YXIgb3B0aW9ucyA9IHsgaGVscGVyczog
aGVscGVycywgcGFydGlhbHM6IHBhcnRpYWxzLCBkYXRhOiBkYXRhIH07CisgIEhhbmRsZWJhcnMg
PSBjcmVhdGUoKTsKKyAgSGFuZGxlYmFycy5jcmVhdGUgPSBjcmVhdGU7CiAKLSAgICBpZihwYXJ0
aWFsID09PSB1bmRlZmluZWQpIHsKLSAgICAgIHRocm93IG5ldyBIYW5kbGViYXJzLkV4Y2VwdGlv
bigiVGhlIHBhcnRpYWwgIiArIG5hbWUgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotICAgIH0g
ZWxzZSBpZihwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKLSAgICAgIHJldHVybiBwYXJ0
aWFsKGNvbnRleHQsIG9wdGlvbnMpOwotICAgIH0gZWxzZSBpZiAoIUhhbmRsZWJhcnMuY29tcGls
ZSkgewotICAgICAgdGhyb3cgbmV3IEhhbmRsZWJhcnMuRXhjZXB0aW9uKCJUaGUgcGFydGlhbCAi
ICsgbmFtZSArICIgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1l
LW9ubHkgbW9kZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYXJ0aWFsc1tuYW1lXSA9IEhhbmRs
ZWJhcnMuY29tcGlsZShwYXJ0aWFsLCB7ZGF0YTogZGF0YSAhPT0gdW5kZWZpbmVkfSk7Ci0gICAg
ICByZXR1cm4gcGFydGlhbHNbbmFtZV0oY29udGV4dCwgb3B0aW9ucyk7Ci0gICAgfQotICB9Ci19
OworICBfX2V4cG9ydHNfXyA9IEhhbmRsZWJhcnM7CisgIHJldHVybiBfX2V4cG9ydHNfXzsKK30p
KF9fbW9kdWxlMV9fLCBfX21vZHVsZTdfXywgX19tb2R1bGU4X18sIF9fbW9kdWxlMTBfXywgX19t
b2R1bGUxMV9fKTsKIAotSGFuZGxlYmFycy50ZW1wbGF0ZSA9IEhhbmRsZWJhcnMuVk0udGVtcGxh
dGU7Ci07CisgIHJldHVybiBfX21vZHVsZTBfXzsKK30pKCk7CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcyBiL1BlcmZv
cm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCmluZGV4
IDAzZmVlZjJkOTlhZTIzYmQ2OWIxMDNkZmNkNmY2NDZkMGY4ZmZlMWMuLjBkZGNhOGNhNDI1N2Rj
M2I3ZWMwMGJlNDI5ZGU2YWUxNTZkMzY3OTkgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMv
RG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCisrKyBiL1BlcmZvcm1hbmNl
VGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzCkBAIC0xLDg5ICsx
LDgyIEBACiAvKiEKLSAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuOS4xCisgKiBqUXVl
cnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjEuMAogICogaHR0cDovL2pxdWVyeS5jb20vCiAgKgog
ICogSW5jbHVkZXMgU2l6emxlLmpzCiAgKiBodHRwOi8vc2l6emxlanMuY29tLwogICoKLSAqIENv
cHlyaWdodCAyMDA1LCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250
cmlidXRvcnMKKyAqIENvcHlyaWdodCAyMDA1LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMu
IGFuZCBvdGhlciBjb250cmlidXRvcnMKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5z
ZQogICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogICoKLSAqIERhdGU6IDIwMTMtMi00Cisg
KiBEYXRlOiAyMDE0LTAxLTIzVDIxOjEwWgogICovCi0oZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZp
bmVkICkgeworCisoZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHsKKworICAgIGlmICggdHlw
ZW9mIG1vZHVsZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAib2Jq
ZWN0IiApIHsKKyAgICAgICAgLy8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmly
b25tZW50cyB3aGVyZSBhIHByb3BlciB3aW5kb3cgaXMgcHJlc2VudCwKKyAgICAgICAgLy8gZXhl
Y3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeQorICAgICAgICAvLyBGb3IgZW52aXJvbm1l
bnRzIHRoYXQgZG8gbm90IGluaGVyZW50bHkgcG9zc2VzIGEgd2luZG93IHdpdGggYSBkb2N1bWVu
dAorICAgICAgICAvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgalF1ZXJ5LW1ha2luZyBm
YWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzCisgICAgICAgIC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhl
IG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgd2luZG93CisgICAgICAgIC8vIGUuZy4g
dmFyIGpRdWVyeSA9IHJlcXVpcmUoImpxdWVyeSIpKHdpbmRvdyk7CisgICAgICAgIC8vIFNlZSB0
aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8KKyAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9i
YWwuZG9jdW1lbnQgPworICAgICAgICAgICAgZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOgorICAg
ICAgICAgICAgZnVuY3Rpb24oIHcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhdy5kb2N1bWVu
dCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAialF1ZXJ5IHJlcXVp
cmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoIHcgKTsKKyAgICAgICAgICAgIH07CisgICAgfSBl
bHNlIHsKKyAgICAgICAgZmFjdG9yeSggZ2xvYmFsICk7CisgICAgfQorCisvLyBQYXNzIHRoaXMg
aWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAorfSh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZp
bmVkIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkgewogCiAv
LyBDYW4ndCBkbyB0aGlzIGJlY2F1c2Ugc2V2ZXJhbCBhcHBzIGluY2x1ZGluZyBBU1AuTkVUIHRy
YWNlCiAvLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94
IGRpZXMgaWYKIC8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCAidXNlIHN0cmljdCIgY2FsbCBj
aGFpbnMuICgjMTMzMzUpCiAvLyBTdXBwb3J0OiBGaXJlZm94IDE4KwotLy8idXNlIHN0cmljdCI7
Ci12YXIKLSAgICAvLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHkKLSAgICByZWFkeUxp
c3QsCi0KLSAgICAvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1
bWVudCkKLSAgICByb290alF1ZXJ5LAorLy8KIAotICAgIC8vIFN1cHBvcnQ6IElFPDkKLSAgICAv
LyBGb3IgYHR5cGVvZiBub2RlLm1ldGhvZGAgaW5zdGVhZCBvZiBgbm9kZS5tZXRob2QgIT09IHVu
ZGVmaW5lZGAKLSAgICBjb3JlX3N0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQsCit2YXIg
YXJyID0gW107CiAKLSAgICAvLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkg
d2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCi0gICAgZG9jdW1lbnQgPSB3aW5kb3cuZG9j
dW1lbnQsCi0gICAgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24sCit2YXIgc2xpY2UgPSBhcnIu
c2xpY2U7CiAKLSAgICAvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKLSAg
ICBfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKK3ZhciBjb25jYXQgPSBhcnIuY29uY2F0OwogCi0g
ICAgLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKLSAgICBfJCA9IHdpbmRv
dy4kLAordmFyIHB1c2ggPSBhcnIucHVzaDsKIAotICAgIC8vIFtbQ2xhc3NdXSAtPiB0eXBlIHBh
aXJzCi0gICAgY2xhc3MydHlwZSA9IHt9LAordmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjsKIAot
ICAgIC8vIExpc3Qgb2YgZGVsZXRlZCBkYXRhIGNhY2hlIGlkcywgc28gd2UgY2FuIHJldXNlIHRo
ZW0KLSAgICBjb3JlX2RlbGV0ZWRJZHMgPSBbXSwKK3ZhciBjbGFzczJ0eXBlID0ge307CiAKLSAg
ICBjb3JlX3ZlcnNpb24gPSAiMS45LjEiLAordmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0
cmluZzsKIAotICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gc29tZSBjb3JlIG1ldGhvZHMKLSAg
ICBjb3JlX2NvbmNhdCA9IGNvcmVfZGVsZXRlZElkcy5jb25jYXQsCi0gICAgY29yZV9wdXNoID0g
Y29yZV9kZWxldGVkSWRzLnB1c2gsCi0gICAgY29yZV9zbGljZSA9IGNvcmVfZGVsZXRlZElkcy5z
bGljZSwKLSAgICBjb3JlX2luZGV4T2YgPSBjb3JlX2RlbGV0ZWRJZHMuaW5kZXhPZiwKLSAgICBj
b3JlX3RvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZywKLSAgICBjb3JlX2hhc093biA9IGNs
YXNzMnR5cGUuaGFzT3duUHJvcGVydHksCi0gICAgY29yZV90cmltID0gY29yZV92ZXJzaW9uLnRy
aW0sCit2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKIAotICAgIC8vIERl
ZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5Ci0gICAgalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVj
dG9yLCBjb250ZXh0ICkgewotICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1
c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwotICAgIHJldHVybiBuZXcgalF1ZXJ5
LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICk7Ci0gICAgfSwKK3ZhciB0
cmltID0gIiIudHJpbTsKIAotICAgIC8vIFVzZWQgZm9yIG1hdGNoaW5nIG51bWJlcnMKLSAgICBj
b3JlX3BudW0gPSAvWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSwK
K3ZhciBzdXBwb3J0ID0ge307CiAKLSAgICAvLyBVc2VkIGZvciBzcGxpdHRpbmcgb24gd2hpdGVz
cGFjZQotICAgIGNvcmVfcm5vdHdoaXRlID0gL1xTKy9nLAogCi0gICAgLy8gTWFrZSBzdXJlIHdl
IHRyaW0gQk9NIGFuZCBOQlNQIChoZXJlJ3MgbG9va2luZyBhdCB5b3UsIFNhZmFyaSA1LjAgYW5k
IElFKQotICAgIHJ0cmltID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAog
Ci0gICAgLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3MKLSAgICAvLyBQ
cmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAo
Izk1MjEpCi0gICAgLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFy
dCB3aXRoIDwpCi0gICAgcnF1aWNrRXhwciA9IC9eKD86KDxbXHdcV10rPilbXj5dKnwjKFtcdy1d
KikpJC8sCit2YXIKKyAgICAvLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkg
d2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCisgICAgZG9jdW1lbnQgPSB3aW5kb3cuZG9j
dW1lbnQsCiAKLSAgICAvLyBNYXRjaCBhIHN0YW5kYWxvbmUgdGFnCi0gICAgcnNpbmdsZVRhZyA9
IC9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sCisgICAgdmVyc2lvbiA9ICIyLjEuMCIsCiAK
LSAgICAvLyBKU09OIFJlZ0V4cAotICAgIHJ2YWxpZGNoYXJzID0gL15bXF0sOnt9XHNdKiQvLAot
ICAgIHJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpccypcWykrL2csCi0gICAgcnZhbGlkZXNj
YXBlID0gL1xcKD86WyJcXFwvYmZucnRdfHVbXGRhLWZBLUZdezR9KS9nLAotICAgIHJ2YWxpZHRv
a2VucyA9IC8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkK1wufClcZCsoPzpb
ZUVdWystXT9cZCt8KS9nLAorICAgIC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5Cisg
ICAgalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworICAgICAgICAvLyBU
aGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdl
bmhhbmNlZCcKKyAgICAgICAgLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3Qg
YWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKKyAgICAgICAgcmV0dXJu
IG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTsKKyAgICB9LAogCiAgICAg
Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCiAgICAgcm1zUHJlZml4ID0g
L14tbXMtLywKQEAgLTkxLDEzNSArODQsMTQgQEAgdmFyCiAKICAgICAvLyBVc2VkIGJ5IGpRdWVy
eS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCiAgICAgZmNhbWVsQ2FzZSA9IGZ1
bmN0aW9uKCBhbGwsIGxldHRlciApIHsKLSAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7
Ci0gICAgfSwKLQotICAgIC8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyCi0gICAgY29tcGxldGVk
ID0gZnVuY3Rpb24oIGV2ZW50ICkgewotCi0gICAgLy8gcmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRl
IiBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IGluIG9sZElFCi0g
ICAgaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyIHx8IGV2ZW50LnR5cGUgPT09ICJsb2Fk
IiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewotICAgIGRldGFjaCgp
OwotICAgIGpRdWVyeS5yZWFkeSgpOwotICAgIH0KLSAgICB9LAotICAgIC8vIENsZWFuLXVwIG1l
dGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50cwotICAgIGRldGFjaCA9IGZ1bmN0aW9uKCkgewotICAg
IGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKLSAgICBkb2N1bWVudC5yZW1vdmVF
dmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKLSAg
ICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7
Ci0KLSAgICB9IGVsc2UgewotICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRl
Y2hhbmdlIiwgY29tcGxldGVkICk7Ci0gICAgd2luZG93LmRldGFjaEV2ZW50KCAib25sb2FkIiwg
Y29tcGxldGVkICk7Ci0gICAgfQorICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7
CiAgICAgfTsKIAogalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKICAgICAvLyBUaGUg
Y3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCi0gICAganF1ZXJ5OiBjb3JlX3Zl
cnNpb24sCisgICAganF1ZXJ5OiB2ZXJzaW9uLAogCiAgICAgY29uc3RydWN0b3I6IGpRdWVyeSwK
LSAgICBpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7Ci0g
ICAgdmFyIG1hdGNoLCBlbGVtOwotCi0gICAgLy8gSEFORExFOiAkKCIiKSwgJChudWxsKSwgJCh1
bmRlZmluZWQpLCAkKGZhbHNlKQotICAgIGlmICggIXNlbGVjdG9yICkgewotICAgIHJldHVybiB0
aGlzOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKLSAgICBpZiAoIHR5cGVv
ZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7Ci0gICAgaWYgKCBzZWxlY3Rvci5jaGFyQXQoMCkg
PT09ICI8IiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gIj4i
ICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewotICAgIC8vIEFzc3VtZSB0aGF0IHN0cmluZ3Mg
dGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNo
ZWNrCi0gICAgbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07Ci0KLSAgICB9IGVsc2Ug
ewotICAgIG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwotICAgIH0KLQotICAg
IC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAj
aWQKLSAgICBpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7Ci0KLSAgICAv
LyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKLSAgICBpZiAoIG1hdGNoWzFdICkgewotICAg
IGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRl
eHQ7Ci0KLSAgICAvLyBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0Ci0gICAgalF1ZXJ5
Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKAotICAgIG1hdGNoWzFdLAotICAgIGNvbnRl
eHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0
IDogZG9jdW1lbnQsCi0gICAgdHJ1ZQotICAgICkgKTsKLQotICAgIC8vIEhBTkRMRTogJChodG1s
LCBwcm9wcykKLSAgICBpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnku
aXNQbGFpbk9iamVjdCggY29udGV4dCApICkgewotICAgIGZvciAoIG1hdGNoIGluIGNvbnRleHQg
KSB7Ci0gICAgLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBp
ZiBwb3NzaWJsZQotICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSAp
IHsKLSAgICB0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7Ci0KLSAgICAvLyAuLi5h
bmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzCi0gICAgfSBlbHNlIHsKLSAgICB0aGlzLmF0
dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0KLSAg
ICByZXR1cm4gdGhpczsKLQotICAgIC8vIEhBTkRMRTogJCgjaWQpCi0gICAgfSBlbHNlIHsKLSAg
ICBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7Ci0KLSAgICAvLyBD
aGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwotICAg
IC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKLSAgICBp
ZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewotICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3
aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCi0gICAgLy8gYnkgbmFtZSBpbnN0ZWFkIG9m
IElECi0gICAgaWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHsKLSAgICByZXR1cm4gcm9vdGpR
dWVyeS5maW5kKCBzZWxlY3RvciApOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSwgd2UgaW5q
ZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKLSAgICB0aGlz
Lmxlbmd0aCA9IDE7Ci0gICAgdGhpc1swXSA9IGVsZW07Ci0gICAgfQotCi0gICAgdGhpcy5jb250
ZXh0ID0gZG9jdW1lbnQ7Ci0gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwotICAgIHJldHVy
biB0aGlzOwotICAgIH0KLQotICAgIC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCi0gICAgfSBl
bHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7Ci0gICAgcmV0dXJuICggY29u
dGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKLQotICAgIC8vIEhBTkRMRTog
JChleHByLCBjb250ZXh0KQotICAgIC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQo
Y29udGV4dCkuZmluZChleHByKQotICAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRoaXMuY29uc3Ry
dWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwotICAgIH0KLQotICAgIC8vIEhBTkRM
RTogJChET01FbGVtZW50KQotICAgIH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewot
ICAgIHRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKLSAgICB0aGlzLmxlbmd0aCA9
IDE7Ci0gICAgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCi0gICAg
Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5Ci0gICAgfSBlbHNlIGlmICggalF1ZXJ5Lmlz
RnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7Ci0gICAgcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNl
bGVjdG9yICk7Ci0gICAgfQotCi0gICAgaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZp
bmVkICkgewotICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKLSAgICB0aGlz
LmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OwotICAgIH0KLQotICAgIHJldHVybiBqUXVlcnku
bWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwotICAgIH0sCiAKICAgICAvLyBTdGFydCB3aXRo
IGFuIGVtcHR5IHNlbGVjdG9yCiAgICAgc2VsZWN0b3I6ICIiLApAQCAtMjI3LDE1MiArOTksMTM4
IEBAIGpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7CiAgICAgLy8gVGhlIGRlZmF1bHQg
bGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwCiAgICAgbGVuZ3RoOiAwLAogCi0gICAgLy8g
VGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBz
ZXQKLSAgICBzaXplOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5sZW5ndGg7Ci0gICAg
fSwKLQogICAgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjb3JlX3NsaWNlLmNh
bGwoIHRoaXMgKTsKKyAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTsKICAgICB9LAog
CiAgICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBP
UgogICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFy
cmF5CiAgICAgZ2V0OiBmdW5jdGlvbiggbnVtICkgewotICAgIHJldHVybiBudW0gPT0gbnVsbCA/
CisgICAgICAgIHJldHVybiBudW0gIT0gbnVsbCA/CiAKLSAgICAvLyBSZXR1cm4gYSAnY2xlYW4n
IGFycmF5Ci0gICAgdGhpcy50b0FycmF5KCkgOgorICAgICAgICAgICAgLy8gUmV0dXJuIGEgJ2Ns
ZWFuJyBhcnJheQorICAgICAgICAgICAgKCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5n
dGggXSA6IHRoaXNbIG51bSBdICkgOgogCi0gICAgLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAot
ICAgICggbnVtIDwgMCA/IHRoaXNbIHRoaXMubGVuZ3RoICsgbnVtIF0gOiB0aGlzWyBudW0gXSAp
OworICAgICAgICAgICAgLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAorICAgICAgICAgICAgc2xp
Y2UuY2FsbCggdGhpcyApOwogICAgIH0sCiAKICAgICAvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1l
bnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCiAgICAgLy8gKHJldHVybmluZyB0aGUgbmV3
IG1hdGNoZWQgZWxlbWVudCBzZXQpCiAgICAgcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7
CiAKLSAgICAvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAotICAgIHZh
ciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKKyAgICAg
ICAgLy8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQKKyAgICAgICAgdmFy
IHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApOwogCi0gICAg
Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKLSAg
ICByZXQucHJldk9iamVjdCA9IHRoaXM7Ci0gICAgcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7
CisgICAgICAgIC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZl
cmVuY2UpCisgICAgICAgIHJldC5wcmV2T2JqZWN0ID0gdGhpczsKKyAgICAgICAgcmV0LmNvbnRl
eHQgPSB0aGlzLmNvbnRleHQ7CiAKLSAgICAvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVt
ZW50IHNldAotICAgIHJldHVybiByZXQ7CisgICAgICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9y
bWVkIGVsZW1lbnQgc2V0CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfSwKIAogICAgIC8vIEV4
ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCiAg
ICAgLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywg
YnV0IHRoaXMgaXMKICAgICAvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCiAgICAgZWFjaDogZnVu
Y3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewotICAgIHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywg
Y2FsbGJhY2ssIGFyZ3MgKTsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxs
YmFjaywgYXJncyApOwogICAgIH0sCiAKLSAgICByZWFkeTogZnVuY3Rpb24oIGZuICkgewotICAg
IC8vIEFkZCB0aGUgY2FsbGJhY2sKLSAgICBqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZu
ICk7Ci0KLSAgICByZXR1cm4gdGhpczsKKyAgICBtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9u
KCBlbGVtLCBpICkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGks
IGVsZW0gKTsKKyAgICAgICAgfSkpOwogICAgIH0sCiAKICAgICBzbGljZTogZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBjb3JlX3NsaWNlLmFwcGx5KCB0aGlzLCBhcmd1
bWVudHMgKSApOworICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0
aGlzLCBhcmd1bWVudHMgKSApOwogICAgIH0sCiAKICAgICBmaXJzdDogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIHRoaXMuZXEoIDAgKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXEoIDAgKTsKICAg
ICB9LAogCiAgICAgbGFzdDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZXEoIC0xICk7
CisgICAgICAgIHJldHVybiB0aGlzLmVxKCAtMSApOwogICAgIH0sCiAKICAgICBlcTogZnVuY3Rp
b24oIGkgKSB7Ci0gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAotICAgIGogPSAraSArICggaSA8
IDAgPyBsZW4gOiAwICk7Ci0gICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8
IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKLSAgICB9LAotCi0gICAgbWFwOiBmdW5jdGlvbigg
Y2FsbGJhY2sgKSB7Ci0gICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMs
IGZ1bmN0aW9uKCBlbGVtLCBpICkgewotICAgIHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBp
LCBlbGVtICk7Ci0gICAgfSkpOworICAgICAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGgsCisgICAg
ICAgICAgICBqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApOworICAgICAgICByZXR1cm4gdGhp
cy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzW2pdIF0gOiBbXSApOwogICAg
IH0sCiAKICAgICBlbmQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnByZXZPYmplY3Qg
fHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJldk9iamVj
dCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpOwogICAgIH0sCiAKICAgICAvLyBGb3IgaW50ZXJu
YWwgdXNlIG9ubHkuCiAgICAgLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3Qg
bGlrZSBhIGpRdWVyeSBtZXRob2QuCi0gICAgcHVzaDogY29yZV9wdXNoLAotICAgIHNvcnQ6IFtd
LnNvcnQsCi0gICAgc3BsaWNlOiBbXS5zcGxpY2UKKyAgICBwdXNoOiBwdXNoLAorICAgIHNvcnQ6
IGFyci5zb3J0LAorICAgIHNwbGljZTogYXJyLnNwbGljZQogfTsKIAotLy8gR2l2ZSB0aGUgaW5p
dCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgot
alF1ZXJ5LmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuOwotCiBqUXVlcnkuZXh0ZW5kID0g
alF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBzcmMsIGNvcHlJc0FycmF5
LCBjb3B5LCBuYW1lLCBvcHRpb25zLCBjbG9uZSwKLSAgICB0YXJnZXQgPSBhcmd1bWVudHNbMF0g
fHwge30sCi0gICAgaSA9IDEsCi0gICAgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKLSAgICBk
ZWVwID0gZmFsc2U7CisgICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJy
YXksIGNsb25lLAorICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCisgICAgICAg
IGkgPSAxLAorICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgICAgICBkZWVw
ID0gZmFsc2U7CiAKICAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCiAgICAgaWYg
KCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7Ci0gICAgZGVlcCA9IHRhcmdldDsKLSAg
ICB0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307Ci0gICAgLy8gc2tpcCB0aGUgYm9vbGVhbiBh
bmQgdGhlIHRhcmdldAotICAgIGkgPSAyOworICAgICAgICBkZWVwID0gdGFyZ2V0OworCisgICAg
ICAgIC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKyAgICAgICAgdGFyZ2V0ID0g
YXJndW1lbnRzWyBpIF0gfHwge307CisgICAgICAgIGkrKzsKICAgICB9CiAKICAgICAvLyBIYW5k
bGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGlu
IGRlZXAgY29weSkKICAgICBpZiAoIHR5cGVvZiB0YXJnZXQgIT09ICJvYmplY3QiICYmICFqUXVl
cnkuaXNGdW5jdGlvbih0YXJnZXQpICkgewotICAgIHRhcmdldCA9IHt9OworICAgICAgICB0YXJn
ZXQgPSB7fTsKICAgICB9CiAKICAgICAvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9u
ZSBhcmd1bWVudCBpcyBwYXNzZWQKLSAgICBpZiAoIGxlbmd0aCA9PT0gaSApIHsKLSAgICB0YXJn
ZXQgPSB0aGlzOwotICAgIC0taTsKKyAgICBpZiAoIGkgPT09IGxlbmd0aCApIHsKKyAgICAgICAg
dGFyZ2V0ID0gdGhpczsKKyAgICAgICAgaS0tOwogICAgIH0KIAogICAgIGZvciAoIDsgaSA8IGxl
bmd0aDsgaSsrICkgewotICAgIC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2
YWx1ZXMKLSAgICBpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKSB7Ci0g
ICAgLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAotICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyAp
IHsKLSAgICBzcmMgPSB0YXJnZXRbIG5hbWUgXTsKLSAgICBjb3B5ID0gb3B0aW9uc1sgbmFtZSBd
OwotCi0gICAgLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAotICAgIGlmICggdGFyZ2V0ID09
PSBjb3B5ICkgewotICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIFJlY3Vyc2UgaWYgd2Un
cmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5cwotICAgIGlmICggZGVlcCAmJiBjb3B5
ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5
LmlzQXJyYXkoY29weSkpICkgKSB7Ci0gICAgaWYgKCBjb3B5SXNBcnJheSApIHsKLSAgICBjb3B5
SXNBcnJheSA9IGZhbHNlOwotICAgIGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykg
PyBzcmMgOiBbXTsKLQotICAgIH0gZWxzZSB7Ci0gICAgY2xvbmUgPSBzcmMgJiYgalF1ZXJ5Lmlz
UGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9OwotICAgIH0KLQotICAgIC8vIE5ldmVyIG1vdmUg
b3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQotICAgIHRhcmdldFsgbmFtZSBdID0galF1ZXJ5
LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTsKLQotICAgIC8vIERvbid0IGJyaW5nIGluIHVu
ZGVmaW5lZCB2YWx1ZXMKLSAgICB9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7Ci0g
ICAgdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwotICAgIH0KLSAgICB9Ci0gICAgfQorICAgICAgICAv
LyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisgICAgICAgIGlmICgg
KG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vIEV4
dGVuZCB0aGUgYmFzZSBvYmplY3QKKyAgICAgICAgICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyAp
IHsKKyAgICAgICAgICAgICAgICBzcmMgPSB0YXJnZXRbIG5hbWUgXTsKKyAgICAgICAgICAgICAg
ICBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOworCisgICAgICAgICAgICAgICAgLy8gUHJldmVudCBu
ZXZlci1lbmRpbmcgbG9vcAorICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0ID09PSBjb3B5ICkg
eworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBv
ciBhcnJheXMKKyAgICAgICAgICAgICAgICBpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5p
c1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkp
KSApICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGNvcHlJc0FycmF5ICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgY29weUlzQXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTsKKwor
ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xv
bmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9OworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV2ZXIgbW92ZSBvcmln
aW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCisgICAgICAgICAgICAgICAgICAgIHRhcmdldFsgbmFt
ZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTsKKworICAgICAgICAgICAg
ICAgIC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHRh
cmdldFsgbmFtZSBdID0gY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KICAgICB9CiAKICAgICAvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdApAQCAt
MzgwLDMzNjkgKzIzOCwzODkgQEAgalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBm
dW5jdGlvbigpIHsKIH07CiAKIGpRdWVyeS5leHRlbmQoewotICAgIG5vQ29uZmxpY3Q6IGZ1bmN0
aW9uKCBkZWVwICkgewotICAgIGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKLSAgICB3aW5k
b3cuJCA9IF8kOwotICAgIH0KLQotICAgIGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBq
UXVlcnkgKSB7Ci0gICAgd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGpRdWVyeTsKLSAgICB9LAotCi0gICAgLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2Vk
PyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KLSAgICBpc1JlYWR5OiBmYWxzZSwKKyAgICAv
LyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKKyAgICBleHBhbmRv
OiAialF1ZXJ5IiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywg
IiIgKSwKIAotICAgIC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0
IGZvciBiZWZvcmUKLSAgICAvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MQotICAg
IHJlYWR5V2FpdDogMSwKKyAgICAvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhl
IHJlYWR5IG1vZHVsZQorICAgIGlzUmVhZHk6IHRydWUsCiAKLSAgICAvLyBIb2xkIChvciByZWxl
YXNlKSB0aGUgcmVhZHkgZXZlbnQKLSAgICBob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkgewot
ICAgIGlmICggaG9sZCApIHsKLSAgICBqUXVlcnkucmVhZHlXYWl0Kys7Ci0gICAgfSBlbHNlIHsK
LSAgICBqUXVlcnkucmVhZHkoIHRydWUgKTsKLSAgICB9CisgICAgZXJyb3I6IGZ1bmN0aW9uKCBt
c2cgKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvciggbXNnICk7CiAgICAgfSwKIAotICAgIC8v
IEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKLSAgICByZWFkeTogZnVuY3Rpb24oIHdhaXQg
KSB7Ci0KLSAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBh
bHJlYWR5IHJlYWR5Ci0gICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0
IDogalF1ZXJ5LmlzUmVhZHkgKSB7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE1ha2Ug
c3VyZSBib2R5IGV4aXN0cywgYXQgbGVhc3QsIGluIGNhc2UgSUUgZ2V0cyBhIGxpdHRsZSBvdmVy
emVhbG91cyAodGlja2V0ICM1NDQzKS4KLSAgICBpZiAoICFkb2N1bWVudC5ib2R5ICkgewotICAg
IHJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1l
bWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKLSAgICBqUXVlcnkuaXNSZWFkeSA9IHRydWU7Ci0K
LSAgICAvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5k
IHdhaXQgaWYgbmVlZCBiZQotICAgIGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFk
eVdhaXQgPiAwICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBhcmUg
ZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCi0gICAgcmVhZHlMaXN0LnJlc29sdmVXaXRoKCBk
b2N1bWVudCwgWyBqUXVlcnkgXSApOwotCi0gICAgLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkg
ZXZlbnRzCi0gICAgaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKLSAgICBqUXVlcnkoIGRvY3Vt
ZW50ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7Ci0gICAgfQotICAgIH0sCisgICAg
bm9vcDogZnVuY3Rpb24oKSB7fSwKIAogICAgIC8vIFNlZSB0ZXN0L3VuaXQvY29yZS5qcyBmb3Ig
ZGV0YWlscyBjb25jZXJuaW5nIGlzRnVuY3Rpb24uCiAgICAgLy8gU2luY2UgdmVyc2lvbiAxLjMs
IERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAogICAgIC8vIGFyZW4ndCBzdXBw
b3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCiAgICAgaXNGdW5jdGlvbjog
ZnVuY3Rpb24oIG9iaiApIHsKLSAgICByZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImZ1bmN0
aW9uIjsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CiAg
ICAgfSwKIAotICAgIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsK
LSAgICByZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKLSAgICB9LAorICAgIGlz
QXJyYXk6IEFycmF5LmlzQXJyYXksCiAKICAgICBpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsK
LSAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09IG9iai53aW5kb3c7CisgICAgICAgIHJl
dHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7CiAgICAgfSwKIAogICAgIGlz
TnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHsKLSAgICByZXR1cm4gIWlzTmFOKCBwYXJzZUZsb2F0
KG9iaikgKSAmJiBpc0Zpbml0ZSggb2JqICk7Ci0gICAgfSwKLQotICAgIHR5cGU6IGZ1bmN0aW9u
KCBvYmogKSB7Ci0gICAgaWYgKCBvYmogPT0gbnVsbCApIHsKLSAgICByZXR1cm4gU3RyaW5nKCBv
YmogKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJvYmplY3QiIHx8IHR5cGVv
ZiBvYmogPT09ICJmdW5jdGlvbiIgPwotICAgIGNsYXNzMnR5cGVbIGNvcmVfdG9TdHJpbmcuY2Fs
bChvYmopIF0gfHwgIm9iamVjdCIgOgotICAgIHR5cGVvZiBvYmo7CisgICAgICAgIC8vIHBhcnNl
RmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8
IiIpCisgICAgICAgIC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmlu
Z3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKCIweC4uLiIpCisgICAgICAgIC8vIHN1YnRy
YWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgorICAgICAgICByZXR1cm4gb2JqIC0gcGFy
c2VGbG9hdCggb2JqICkgPj0gMDsKICAgICB9LAogCiAgICAgaXNQbGFpbk9iamVjdDogZnVuY3Rp
b24oIG9iaiApIHsKLSAgICAvLyBNdXN0IGJlIGFuIE9iamVjdC4KLSAgICAvLyBCZWNhdXNlIG9m
IElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3Rv
ciBwcm9wZXJ0eS4KLSAgICAvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBv
YmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAotICAgIGlmICggIW9iaiB8fCBqUXVl
cnkudHlwZShvYmopICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2lu
ZG93KCBvYmogKSApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAg
ICAvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0Ci0gICAgaWYg
KCBvYmouY29uc3RydWN0b3IgJiYKLSAgICAhY29yZV9oYXNPd24uY2FsbChvYmosICJjb25zdHJ1
Y3RvciIpICYmCi0gICAgIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlw
ZSwgImlzUHJvdG90eXBlT2YiKSApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIH0g
Y2F0Y2ggKCBlICkgewotICAgIC8vIElFOCw5IFdpbGwgdGhyb3cgZXhjZXB0aW9ucyBvbiBjZXJ0
YWluIGhvc3Qgb2JqZWN0cyAjOTg5NwotICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAv
LyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwK
LSAgICAvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi4K
LQotICAgIHZhciBrZXk7Ci0gICAgZm9yICgga2V5IGluIG9iaiApIHt9Ci0KLSAgICByZXR1cm4g
a2V5ID09PSB1bmRlZmluZWQgfHwgY29yZV9oYXNPd24uY2FsbCggb2JqLCBrZXkgKTsKKyAgICAg
ICAgLy8gTm90IHBsYWluIG9iamVjdHM6CisgICAgICAgIC8vIC0gQW55IG9iamVjdCBvciB2YWx1
ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90ICJbb2JqZWN0IE9iamVj
dF0iCisgICAgICAgIC8vIC0gRE9NIG5vZGVzCisgICAgICAgIC8vIC0gd2luZG93CisgICAgICAg
IGlmICggalF1ZXJ5LnR5cGUoIG9iaiApICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwg
alF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFN1cHBvcnQ6IEZpcmVmb3ggPDIwCisgICAgICAgIC8vIFRo
ZSB0cnkvY2F0Y2ggc3VwcHJlc3NlcyBleGNlcHRpb25zIHRocm93biB3aGVuIGF0dGVtcHRpbmcg
dG8gYWNjZXNzCisgICAgICAgIC8vIHRoZSAiY29uc3RydWN0b3IiIHByb3BlcnR5IG9mIGNlcnRh
aW4gaG9zdCBvYmplY3RzLCBpZS4gfHdpbmRvdy5sb2NhdGlvbnwKKyAgICAgICAgLy8gaHR0cHM6
Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODE0NjIyCisgICAgICAgIHRy
eSB7CisgICAgICAgICAgICBpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgorICAgICAgICAgICAgICAg
ICAgICAhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlw
ZU9mIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gaGFzbid0IHJldHVybmVkIGFscmVh
ZHksIHdlJ3JlIGNvbmZpZGVudCB0aGF0CisgICAgICAgIC8vIHxvYmp8IGlzIGEgcGxhaW4gb2Jq
ZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNvbnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdAorICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICB9LAogCiAgICAgaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9i
aiApIHsKLSAgICB2YXIgbmFtZTsKLSAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKLSAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICAgIH0sCi0KLSAgICBlcnJvcjog
ZnVuY3Rpb24oIG1zZyApIHsKLSAgICB0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwotICAgIH0sCi0K
LSAgICAvLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAotICAgIC8vIGNvbnRleHQgKG9wdGlvbmFsKTog
SWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4
dCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQKLSAgICAvLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJ
ZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nCi0g
ICAgcGFyc2VIVE1MOiBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7Ci0g
ICAgaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7Ci0gICAgcmV0dXJu
IG51bGw7Ci0gICAgfQotICAgIGlmICggdHlwZW9mIGNvbnRleHQgPT09ICJib29sZWFuIiApIHsK
LSAgICBrZWVwU2NyaXB0cyA9IGNvbnRleHQ7Ci0gICAgY29udGV4dCA9IGZhbHNlOwotICAgIH0K
LSAgICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKLQotICAgIHZhciBwYXJzZWQgPSBy
c2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSwKLSAgICBzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtd
OwotCi0gICAgLy8gU2luZ2xlIHRhZwotICAgIGlmICggcGFyc2VkICkgewotICAgIHJldHVybiBb
IGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWzFdICkgXTsKLSAgICB9Ci0KLSAgICBwYXJz
ZWQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTsK
LSAgICBpZiAoIHNjcmlwdHMgKSB7Ci0gICAgalF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7Ci0g
ICAgfQotICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwot
ICAgIH0sCi0KLSAgICBwYXJzZUpTT046IGZ1bmN0aW9uKCBkYXRhICkgewotICAgIC8vIEF0dGVt
cHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAotICAgIGlmICgg
d2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7Ci0gICAgcmV0dXJuIHdpbmRvdy5K
U09OLnBhcnNlKCBkYXRhICk7Ci0gICAgfQotCi0gICAgaWYgKCBkYXRhID09PSBudWxsICkgewot
ICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJp
bmciICkgewotCi0gICAgLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBp
cyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCi0gICAgZGF0YSA9IGpRdWVyeS50cmltKCBk
YXRhICk7Ci0KLSAgICBpZiAoIGRhdGEgKSB7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWlu
ZyBkYXRhIGlzIGFjdHVhbCBKU09OCi0gICAgLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8v
anNvbi5vcmcvanNvbjIuanMKLSAgICBpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFj
ZSggcnZhbGlkZXNjYXBlLCAiQCIgKQotICAgIC5yZXBsYWNlKCBydmFsaWR0b2tlbnMsICJdIiAp
Ci0gICAgLnJlcGxhY2UoIHJ2YWxpZGJyYWNlcywgIiIpKSApIHsKLQotICAgIHJldHVybiAoIG5l
dyBGdW5jdGlvbiggInJldHVybiAiICsgZGF0YSApICkoKTsKLSAgICB9Ci0gICAgfQotICAgIH0K
LQotICAgIGpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKKyAgICAgICAg
dmFyIG5hbWU7CisgICAgICAgIGZvciAoIG5hbWUgaW4gb2JqICkgeworICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0sCiAKLSAg
ICAvLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCi0gICAgcGFyc2VYTUw6IGZ1bmN0aW9uKCBk
YXRhICkgewotICAgIHZhciB4bWwsIHRtcDsKLSAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRh
ICE9PSAic3RyaW5nIiApIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgdHJ5IHsKLSAg
ICBpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCi0gICAgdG1wID0gbmV3IERP
TVBhcnNlcigpOwotICAgIHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94
bWwiICk7Ci0gICAgfSBlbHNlIHsgLy8gSUUKLSAgICB4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCgg
Ik1pY3Jvc29mdC5YTUxET00iICk7Ci0gICAgeG1sLmFzeW5jID0gImZhbHNlIjsKLSAgICB4bWwu
bG9hZFhNTCggZGF0YSApOwotICAgIH0KLSAgICB9IGNhdGNoKCBlICkgewotICAgIHhtbCA9IHVu
ZGVmaW5lZDsKLSAgICB9Ci0gICAgaWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8
IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKLSAg
ICBqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHhtbDsKKyAgICB0eXBlOiBmdW5jdGlvbiggb2JqICkgeworICAgICAgICBpZiAoIG9iaiA9
PSBudWxsICkgeworICAgICAgICAgICAgcmV0dXJuIG9iaiArICIiOworICAgICAgICB9CisgICAg
ICAgIC8vIFN1cHBvcnQ6IEFuZHJvaWQgPCA0LjAsIGlPUyA8IDYgKGZ1bmN0aW9uaXNoIFJlZ0V4
cCkKKyAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJvYmplY3QiIHx8IHR5cGVvZiBvYmog
PT09ICJmdW5jdGlvbiIgPworICAgICAgICAgICAgY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChv
YmopIF0gfHwgIm9iamVjdCIgOgorICAgICAgICAgICAgdHlwZW9mIG9iajsKICAgICB9LAogCi0g
ICAgbm9vcDogZnVuY3Rpb24oKSB7fSwKLQogICAgIC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBh
IGdsb2JhbCBjb250ZXh0Ci0gICAgLy8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3MgYnkg
SmltIERyaXNjb2xsCi0gICAgLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29s
bC9hcmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0Ci0gICAg
Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7Ci0gICAgaWYgKCBkYXRhICYmIGpRdWVyeS50
cmltKCBkYXRhICkgKSB7Ci0gICAgLy8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhw
bG9yZXIKLSAgICAvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4
dCBpcyB3aW5kb3cKLSAgICAvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAotICAgICgg
d2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7Ci0gICAgd2luZG93WyAiZXZh
bCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKLSAgICB9ICkoIGRhdGEgKTsKLSAgICB9CisgICAg
Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7CisgICAgICAgIHZhciBzY3JpcHQsCisgICAg
ICAgICAgICBpbmRpcmVjdCA9IGV2YWw7CisKKyAgICAgICAgY29kZSA9IGpRdWVyeS50cmltKCBj
b2RlICk7CisKKyAgICAgICAgaWYgKCBjb2RlICkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNv
ZGUgaW5jbHVkZXMgYSB2YWxpZCwgcHJvbG9ndWUgcG9zaXRpb24KKyAgICAgICAgICAgIC8vIHN0
cmljdCBtb2RlIHByYWdtYSwgZXhlY3V0ZSBjb2RlIGJ5IGluamVjdGluZyBhCisgICAgICAgICAg
ICAvLyBzY3JpcHQgdGFnIGludG8gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgaWYgKCBjb2Rl
LmluZGV4T2YoInVzZSBzdHJpY3QiKSA9PT0gMSApIHsKKyAgICAgICAgICAgICAgICBzY3JpcHQg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAgICAgICAgICAgICAgICBzY3Jp
cHQudGV4dCA9IGNvZGU7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGls
ZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhdm9pZCB0aGUgRE9NIG5vZGUg
Y3JlYXRpb24sIGluc2VydGlvbgorICAgICAgICAgICAgLy8gYW5kIHJlbW92YWwgYnkgdXNpbmcg
YW4gaW5kaXJlY3QgZ2xvYmFsIGV2YWwKKyAgICAgICAgICAgICAgICBpbmRpcmVjdCggY29kZSAp
OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSwKIAogICAgIC8vIENvbnZlcnQgZGFz
aGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKICAgICAv
LyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCiAg
ICAgY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgewotICAgIHJldHVybiBzdHJpbmcucmVw
bGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2Ug
KTsKKyAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVw
bGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwogICAgIH0sCiAKICAgICBub2RlTmFtZTog
ZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxl
bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAg
IHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0g
bmFtZS50b0xvd2VyQ2FzZSgpOwogICAgIH0sCiAKICAgICAvLyBhcmdzIGlzIGZvciBpbnRlcm5h
bCB1c2FnZSBvbmx5CiAgICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7
Ci0gICAgdmFyIHZhbHVlLAotICAgIGkgPSAwLAotICAgIGxlbmd0aCA9IG9iai5sZW5ndGgsCi0g
ICAgaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKLQotICAgIGlmICggYXJncyApIHsKLSAg
ICBpZiAoIGlzQXJyYXkgKSB7Ci0gICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAg
dmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKLQotICAgIGlmICggdmFs
dWUgPT09IGZhbHNlICkgewotICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0gICAgfSBlbHNlIHsK
LSAgICBmb3IgKCBpIGluIG9iaiApIHsKLSAgICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpb
IGkgXSwgYXJncyApOwotCi0gICAgaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7Ci0gICAgYnJlYWs7
Ci0gICAgfQotICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9y
IHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAotICAgIH0gZWxzZSB7Ci0gICAgaWYgKCBpc0Fy
cmF5ICkgewotICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotICAgIHZhbHVlID0gY2Fs
bGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7Ci0KLSAgICBpZiAoIHZhbHVlID09
PSBmYWxzZSApIHsKLSAgICBicmVhazsKLSAgICB9Ci0gICAgfQotICAgIH0gZWxzZSB7Ci0gICAg
Zm9yICggaSBpbiBvYmogKSB7Ci0gICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwg
aSwgb2JqWyBpIF0gKTsKLQotICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgIGJyZWFr
OwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLQotICAgIHJldHVybiBvYmo7Ci0gICAgfSwK
LQotICAgIC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2li
bGUKLSAgICB0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKCJcdUZFRkZceEEwIikg
PwotICAgIGZ1bmN0aW9uKCB0ZXh0ICkgewotICAgIHJldHVybiB0ZXh0ID09IG51bGwgPwotICAg
ICIiIDoKLSAgICBjb3JlX3RyaW0uY2FsbCggdGV4dCApOwotICAgIH0gOgotCi0gICAgLy8gT3Ro
ZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkKLSAgICBmdW5jdGlvbigg
dGV4dCApIHsKLSAgICByZXR1cm4gdGV4dCA9PSBudWxsID8KLSAgICAiIiA6Ci0gICAgKCB0ZXh0
ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKyAgICAgICAgdmFyIHZhbHVlLAorICAgICAg
ICAgICAgaSA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBvYmoubGVuZ3RoLAorICAgICAgICAg
ICAgaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBvYmogKTsKKworICAgICAgICBpZiAoIGFyZ3MgKSB7
CisgICAgICAgICAgICBpZiAoIGlzQXJyYXkgKSB7CisgICAgICAgICAgICAgICAgZm9yICggOyBp
IDwgbGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2su
YXBwbHkoIG9ialsgaSBdLCBhcmdzICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWx1
ZSA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgZm9yICggaSBpbiBvYmogKSB7CisgICAgICAgICAgICAgICAgICAgIHZh
bHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBdLCBhcmdzICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKworICAgICAgICAvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNv
bW1vbiB1c2Ugb2YgZWFjaAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBpc0Fy
cmF5ICkgeworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAg
ICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpb
IGkgXSApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZv
ciAoIGkgaW4gb2JqICkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrLmNh
bGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
dmFsdWUgPT09IGZhbHNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4gb2JqOworICAgIH0sCisKKyAgICB0cmltOiBmdW5jdGlv
biggdGV4dCApIHsKKyAgICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/ICIiIDogdHJpbS5jYWxs
KCB0ZXh0ICk7CiAgICAgfSwKIAogICAgIC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdl
IG9ubHkKICAgICBtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7Ci0gICAgdmFy
IHJldCA9IHJlc3VsdHMgfHwgW107CisgICAgICAgIHZhciByZXQgPSByZXN1bHRzIHx8IFtdOwog
Ci0gICAgaWYgKCBhcnIgIT0gbnVsbCApIHsKLSAgICBpZiAoIGlzQXJyYXlsaWtlKCBPYmplY3Qo
YXJyKSApICkgewotICAgIGpRdWVyeS5tZXJnZSggcmV0LAotICAgIHR5cGVvZiBhcnIgPT09ICJz
dHJpbmciID8KLSAgICBbIGFyciBdIDogYXJyCi0gICAgKTsKLSAgICB9IGVsc2UgewotICAgIGNv
cmVfcHVzaC5jYWxsKCByZXQsIGFyciApOwotICAgIH0KLSAgICB9CisgICAgICAgIGlmICggYXJy
ICE9IG51bGwgKSB7CisgICAgICAgICAgICBpZiAoIGlzQXJyYXlsaWtlKCBPYmplY3QoYXJyKSAp
ICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSggcmV0LAorICAgICAgICAgICAgICAg
ICAgICB0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CisgICAgICAgICAgICAgICAgICAgIFsgYXJy
IF0gOiBhcnIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBwdXNoLmNhbGwoIHJldCwgYXJyICk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KIAotICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfSwKIAogICAg
IGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7Ci0gICAgdmFyIGxlbjsKLQotICAg
IGlmICggYXJyICkgewotICAgIGlmICggY29yZV9pbmRleE9mICkgewotICAgIHJldHVybiBjb3Jl
X2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Ci0gICAgfQotCi0gICAgbGVuID0gYXJyLmxl
bmd0aDsKLSAgICBpID0gaSA/IGkgPCAwID8gTWF0aC5tYXgoIDAsIGxlbiArIGkgKSA6IGkgOiAw
OwotCi0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgLy8gU2tpcCBhY2Nlc3Npbmcg
aW4gc3BhcnNlIGFycmF5cwotICAgIGlmICggaSBpbiBhcnIgJiYgYXJyWyBpIF0gPT09IGVsZW0g
KSB7Ci0gICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7
CisgICAgICAgIHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVs
ZW0sIGkgKTsKICAgICB9LAogCiAgICAgbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkg
ewotICAgIHZhciBsID0gc2Vjb25kLmxlbmd0aCwKLSAgICBpID0gZmlyc3QubGVuZ3RoLAotICAg
IGogPSAwOworICAgICAgICB2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsCisgICAgICAgICAgICBq
ID0gMCwKKyAgICAgICAgICAgIGkgPSBmaXJzdC5sZW5ndGg7CiAKLSAgICBpZiAoIHR5cGVvZiBs
ID09PSAibnVtYmVyIiApIHsKLSAgICBmb3IgKCA7IGogPCBsOyBqKysgKSB7Ci0gICAgZmlyc3Rb
IGkrKyBdID0gc2Vjb25kWyBqIF07Ci0gICAgfQotICAgIH0gZWxzZSB7Ci0gICAgd2hpbGUgKCBz
ZWNvbmRbal0gIT09IHVuZGVmaW5lZCApIHsKLSAgICBmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGor
KyBdOwotICAgIH0KLSAgICB9CisgICAgICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgeworICAg
ICAgICAgICAgZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisgICAgICAgIH0KIAotICAgIGZp
cnN0Lmxlbmd0aCA9IGk7CisgICAgICAgIGZpcnN0Lmxlbmd0aCA9IGk7CiAKLSAgICByZXR1cm4g
Zmlyc3Q7CisgICAgICAgIHJldHVybiBmaXJzdDsKICAgICB9LAogCi0gICAgZ3JlcDogZnVuY3Rp
b24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgewotICAgIHZhciByZXRWYWwsCi0gICAgcmV0ID0g
W10sCi0gICAgaSA9IDAsCi0gICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOwotICAgIGludiA9ICEh
aW52OworICAgIGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHsKKyAg
ICAgICAgdmFyIGNhbGxiYWNrSW52ZXJzZSwKKyAgICAgICAgICAgIG1hdGNoZXMgPSBbXSwKKyAg
ICAgICAgICAgIGkgPSAwLAorICAgICAgICAgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAorICAg
ICAgICAgICAgY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwogCi0gICAgLy8gR28gdGhyb3VnaCB0
aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcwotICAgIC8vIHRoYXQgcGFzcyB0aGUgdmFs
aWRhdG9yIGZ1bmN0aW9uCi0gICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAgcmV0
VmFsID0gISFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApOwotICAgIGlmICggaW52ICE9PSByZXRW
YWwgKSB7Ci0gICAgcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKLSAgICB9Ci0gICAgfQorICAgICAg
ICAvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisgICAgICAg
IC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisgICAgICAgIGZvciAoIDsgaSA8
IGxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNr
KCBlbGVtc1sgaSBdLCBpICk7CisgICAgICAgICAgICBpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0g
Y2FsbGJhY2tFeHBlY3QgKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKCBlbGVtc1sg
aSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIHJldHVybiByZXQ7CisgICAg
ICAgIHJldHVybiBtYXRjaGVzOwogICAgIH0sCiAKICAgICAvLyBhcmcgaXMgZm9yIGludGVybmFs
IHVzYWdlIG9ubHkKICAgICBtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsK
LSAgICB2YXIgdmFsdWUsCi0gICAgaSA9IDAsCi0gICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAot
ICAgIGlzQXJyYXkgPSBpc0FycmF5bGlrZSggZWxlbXMgKSwKLSAgICByZXQgPSBbXTsKLQotICAg
IC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0
byB0aGVpcgotICAgIGlmICggaXNBcnJheSApIHsKLSAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkr
KyApIHsKLSAgICB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKKyAgICAg
ICAgdmFyIHZhbHVlLAorICAgICAgICAgICAgaSA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBl
bGVtcy5sZW5ndGgsCisgICAgICAgICAgICBpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICks
CisgICAgICAgICAgICByZXQgPSBbXTsKIAotICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAg
ICByZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwotICAgIH0KLSAgICB9CisgICAgICAgIC8vIEdv
IHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVp
ciBuZXcgdmFsdWVzCisgICAgICAgIGlmICggaXNBcnJheSApIHsKKyAgICAgICAgICAgIGZvciAo
IDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2so
IGVsZW1zWyBpIF0sIGksIGFyZyApOwogCi0gICAgLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24g
dGhlIG9iamVjdCwKLSAgICB9IGVsc2UgewotICAgIGZvciAoIGkgaW4gZWxlbXMgKSB7Ci0gICAg
dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisgICAgICAgICAgICAgICAg
aWYgKCB2YWx1ZSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICByZXQucHVzaCggdmFs
dWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLSAgICBpZiAoIHZhbHVl
ICE9IG51bGwgKSB7Ci0gICAgcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKLSAgICB9Ci0gICAg
fQotICAgIH0KLQotICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKLSAgICByZXR1cm4g
Y29yZV9jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKLSAgICB9LAotCi0gICAgLy8gQSBnbG9iYWwg
R1VJRCBjb3VudGVyIGZvciBvYmplY3RzCi0gICAgZ3VpZDogMSwKLQotICAgIC8vIEJpbmQgYSBm
dW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQot
ICAgIC8vIGFyZ3VtZW50cy4KLSAgICBwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewot
ICAgIHZhciBhcmdzLCBwcm94eSwgdG1wOwotCi0gICAgaWYgKCB0eXBlb2YgY29udGV4dCA9PT0g
InN0cmluZyIgKSB7Ci0gICAgdG1wID0gZm5bIGNvbnRleHQgXTsKLSAgICBjb250ZXh0ID0gZm47
Ci0gICAgZm4gPSB0bXA7Ci0gICAgfQotCi0gICAgLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5l
IGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKLSAgICAvLyB0aGlzIHRocm93cyBh
IFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgotICAgIGlmICgg
IWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAg
fQotCi0gICAgLy8gU2ltdWxhdGVkIGJpbmQKLSAgICBhcmdzID0gY29yZV9zbGljZS5jYWxsKCBh
cmd1bWVudHMsIDIgKTsKLSAgICBwcm94eSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBmbi5h
cHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggY29yZV9zbGljZS5jYWxsKCBhcmd1
bWVudHMgKSApICk7Ci0gICAgfTsKLQotICAgIC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFu
ZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3Zl
ZAotICAgIHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwot
Ci0gICAgcmV0dXJuIHByb3h5OwotICAgIH0sCi0KLSAgICAvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0
aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb24KLSAgICAvLyBUaGUgdmFs
dWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KLSAgICBh
Y2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlH
ZXQsIHJhdyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAot
ICAgIGJ1bGsgPSBrZXkgPT0gbnVsbDsKLQotICAgIC8vIFNldHMgbWFueSB2YWx1ZXMKLSAgICBp
ZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0gIm9iamVjdCIgKSB7Ci0gICAgY2hhaW5hYmxlID0g
dHJ1ZTsKLSAgICBmb3IgKCBpIGluIGtleSApIHsKLSAgICBqUXVlcnkuYWNjZXNzKCBlbGVtcywg
Zm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApOwotICAgIH0KLQotICAgIC8vIFNl
dHMgb25lIHZhbHVlCi0gICAgfSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKLSAg
ICBjaGFpbmFibGUgPSB0cnVlOwotCi0gICAgaWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVl
ICkgKSB7Ci0gICAgcmF3ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIGJ1bGsgKSB7Ci0gICAg
Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0Ci0gICAgaWYgKCBy
YXcgKSB7Ci0gICAgZm4uY2FsbCggZWxlbXMsIHZhbHVlICk7Ci0gICAgZm4gPSBudWxsOwotCi0g
ICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwotICAgIH0gZWxz
ZSB7Ci0gICAgYnVsayA9IGZuOwotICAgIGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUg
KSB7Ci0gICAgcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7Ci0gICAg
fTsKLSAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBmbiApIHsKLSAgICBmb3IgKCA7IGkgPCBsZW5n
dGg7IGkrKyApIHsKLSAgICBmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5j
YWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7Ci0gICAgfQotICAgIH0K
LSAgICB9Ci0KLSAgICByZXR1cm4gY2hhaW5hYmxlID8KLSAgICBlbGVtcyA6Ci0KLSAgICAvLyBH
ZXRzCi0gICAgYnVsayA/Ci0gICAgZm4uY2FsbCggZWxlbXMgKSA6Ci0gICAgbGVuZ3RoID8gZm4o
IGVsZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0OwotICAgIH0sCi0KLSAgICBub3c6IGZ1bmN0aW9u
KCkgewotICAgIHJldHVybiAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCk7Ci0gICAgfQotfSk7Ci0K
LWpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKLSAgICBpZiAoICFyZWFk
eUxpc3QgKSB7Ci0KLSAgICByZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTsKLQotICAgIC8v
IENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVyIHRo
ZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLgotICAgIC8vIHdlIG9uY2UgdHJp
ZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlz
c3VlcyBsaWtlIHRoZSBvbmUKLSAgICAvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRw
Oi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1Ci0gICAgaWYgKCBkb2N1
bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewotICAgIC8vIEhhbmRsZSBpdCBhc3lu
Y2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFk
eQotICAgIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwotCi0gICAgLy8gU3RhbmRhcmRzLWJh
c2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29udGVudExvYWRlZAotICAgIH0gZWxzZSBpZiAoIGRv
Y3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7Ci0gICAgLy8gVXNlIHRoZSBoYW5keSBldmVudCBj
YWxsYmFjawotICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVk
IiwgY29tcGxldGVkLCBmYWxzZSApOwotCi0gICAgLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25s
b2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKLSAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigg
ImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7Ci0KLSAgICAvLyBJZiBJRSBldmVudCBtb2RlbCBp
cyB1c2VkCi0gICAgfSBlbHNlIHsKLSAgICAvLyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQs
IG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwotICAgIGRvY3VtZW50LmF0dGFj
aEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgY29tcGxldGVkICk7Ci0KLSAgICAvLyBBIGZh
bGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawotICAgIHdpbmRv
dy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRlZCApOwotCi0gICAgLy8gSWYgSUUgYW5k
IG5vdCBhIGZyYW1lCi0gICAgLy8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1
bWVudCBpcyByZWFkeQotICAgIHZhciB0b3AgPSBmYWxzZTsKLQotICAgIHRyeSB7Ci0gICAgdG9w
ID0gd2luZG93LmZyYW1lRWxlbWVudCA9PSBudWxsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dDsKLSAgICB9IGNhdGNoKGUpIHt9Ci0KLSAgICBpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7
Ci0gICAgKGZ1bmN0aW9uIGRvU2Nyb2xsQ2hlY2soKSB7Ci0gICAgaWYgKCAhalF1ZXJ5LmlzUmVh
ZHkgKSB7Ci0KLSAgICB0cnkgewotICAgIC8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5p
Ci0gICAgLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KLSAg
ICB0b3AuZG9TY3JvbGwoImxlZnQiKTsKLSAgICB9IGNhdGNoKGUpIHsKLSAgICByZXR1cm4gc2V0
VGltZW91dCggZG9TY3JvbGxDaGVjaywgNTAgKTsKLSAgICB9Ci0KLSAgICAvLyBkZXRhY2ggYWxs
IGRvbSByZWFkeSBldmVudHMKLSAgICBkZXRhY2goKTsKLQotICAgIC8vIGFuZCBleGVjdXRlIGFu
eSB3YWl0aW5nIGZ1bmN0aW9ucwotICAgIGpRdWVyeS5yZWFkeSgpOwotICAgIH0KLSAgICB9KSgp
OwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2Jq
ICk7Ci19OwotCi0vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXAKLWpRdWVyeS5lYWNoKCJC
b29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVy
cm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7Ci0gICAgY2xhc3MydHlwZVsgIltv
YmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLX0pOwotCi1mdW5j
dGlvbiBpc0FycmF5bGlrZSggb2JqICkgewotICAgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoLAot
ICAgIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7Ci0KLSAgICBpZiAoIGpRdWVyeS5pc1dpbmRv
dyggb2JqICkgKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICggb2JqLm5v
ZGVUeXBlID09PSAxICYmIGxlbmd0aCApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCB0eXBlICE9PSAiZnVuY3Rpb24iICYmCi0gICAg
KCBsZW5ndGggPT09IDAgfHwKLSAgICB0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5n
dGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iaiApOwotfQotCi0vLyBBbGwgalF1ZXJ5IG9i
amVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKLXJvb3RqUXVlcnkgPSBqUXVlcnkoZG9j
dW1lbnQpOwotLy8gU3RyaW5nIHRvIE9iamVjdCBvcHRpb25zIGZvcm1hdCBjYWNoZQotdmFyIG9w
dGlvbnNDYWNoZSA9IHt9OwotCi0vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBp
bnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lcyBhbmQgc3RvcmUgaW4gY2FjaGUKLWZ1bmN0aW9uIGNy
ZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Ci0gICAgdmFyIG9iamVjdCA9IG9wdGlvbnNDYWNoZVsg
b3B0aW9ucyBdID0ge307Ci0gICAgalF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIGNvcmVfcm5v
dHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkgewotICAgIG9iamVjdFsgZmxhZyBd
ID0gdHJ1ZTsKLSAgICB9KTsKLSAgICByZXR1cm4gb2JqZWN0OwotfQotCi0vKgotICogQ3JlYXRl
IGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0gKgotICog
ICAgb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0
aGF0IHdpbGwgY2hhbmdlIGhvdwotICogICAgICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhh
dmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0Ci0gKgotICogQnkgZGVmYXVs
dCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFu
ZCBjYW4gYmUKLSAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCi0gKgotICogUG9zc2libGUgb3B0
aW9uczoKLSAqCi0gKiAgICBvbmNlOiAgICAgICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFj
ayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKLSAqCi0gKiAg
ICBtZW1vcnk6ICAgICAgICAgICAgd2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBh
bmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZAotICogICAgICAgICAgICAgICAgICAgIGFm
dGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJt
ZW1vcml6ZWQiCi0gKiAgICAgICAgICAgICAgICAgICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQp
Ci0gKgotICogICAgdW5pcXVlOiAgICAgICAgICAgIHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2Fu
IG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KQotICoKLSAqICAg
IHN0b3BPbkZhbHNlOiAgICBpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVy
bnMgZmFsc2UKLSAqCi0gKi8KLWpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyAp
IHsKLQotICAgIC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2Jq
ZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKLSAgICAvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3Qp
Ci0gICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/Ci0gICAgKCBvcHRp
b25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6Ci0gICAg
alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKLQotICAgIHZhciAvLyBGbGFnIHRvIGtub3cg
aWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCi0gICAgZmlyaW5nLAotICAgIC8vIExhc3QgZmly
ZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cykKLSAgICBtZW1vcnksCi0gICAgLy8g
RmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKLSAgICBmaXJlZCwKLSAgICAv
LyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKLSAgICBmaXJpbmdMZW5ndGgsCi0gICAgLy8g
SW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlm
IG5lZWRlZCkKLSAgICBmaXJpbmdJbmRleCwKLSAgICAvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJl
ICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aCkKLSAgICBmaXJpbmdTdGFydCwK
LSAgICAvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdAotICAgIGxpc3QgPSBbXSwKLSAgICAvLyBTdGFj
ayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCi0gICAgc3RhY2sgPSAhb3B0aW9u
cy5vbmNlICYmIFtdLAotICAgIC8vIEZpcmUgY2FsbGJhY2tzCi0gICAgZmlyZSA9IGZ1bmN0aW9u
KCBkYXRhICkgewotICAgIG1lbW9yeSA9IG9wdGlvbnMubWVtb3J5ICYmIGRhdGE7Ci0gICAgZmly
ZWQgPSB0cnVlOwotICAgIGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDsKLSAgICBmaXJp
bmdTdGFydCA9IDA7Ci0gICAgZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7Ci0gICAgZmlyaW5n
ID0gdHJ1ZTsKLSAgICBmb3IgKCA7IGxpc3QgJiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7
IGZpcmluZ0luZGV4KysgKSB7Ci0gICAgaWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBk
YXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkg
ewotICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcg
YWRkCi0gICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLSAgICBmaXJpbmcgPSBmYWxzZTsKLSAgICBp
ZiAoIGxpc3QgKSB7Ci0gICAgaWYgKCBzdGFjayApIHsKLSAgICBpZiAoIHN0YWNrLmxlbmd0aCAp
IHsKLSAgICBmaXJlKCBzdGFjay5zaGlmdCgpICk7Ci0gICAgfQotICAgIH0gZWxzZSBpZiAoIG1l
bW9yeSApIHsKLSAgICBsaXN0ID0gW107Ci0gICAgfSBlbHNlIHsKLSAgICBzZWxmLmRpc2FibGUo
KTsKLSAgICB9Ci0gICAgfQotICAgIH0sCi0gICAgLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QK
LSAgICBzZWxmID0gewotICAgIC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBj
YWxsYmFja3MgdG8gdGhlIGxpc3QKLSAgICBhZGQ6IGZ1bmN0aW9uKCkgewotICAgIGlmICggbGlz
dCApIHsKLSAgICAvLyBGaXJzdCwgd2Ugc2F2ZSB0aGUgY3VycmVudCBsZW5ndGgKLSAgICB2YXIg
c3RhcnQgPSBsaXN0Lmxlbmd0aDsKLSAgICAoZnVuY3Rpb24gYWRkKCBhcmdzICkgewotICAgIGpR
dWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAgIHZhciB0eXBlID0galF1
ZXJ5LnR5cGUoIGFyZyApOwotICAgIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKLSAgICBp
ZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkgewotICAgIGxpc3QucHVz
aCggYXJnICk7Ci0gICAgfQotICAgIH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHR5
cGUgIT09ICJzdHJpbmciICkgewotICAgIC8vIEluc3BlY3QgcmVjdXJzaXZlbHkKLSAgICBhZGQo
IGFyZyApOwotICAgIH0KLSAgICB9KTsKLSAgICB9KSggYXJndW1lbnRzICk7Ci0gICAgLy8gRG8g
d2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGUKLSAgICAvLyBjdXJyZW50IGZpcmlu
ZyBiYXRjaD8KLSAgICBpZiAoIGZpcmluZyApIHsKLSAgICBmaXJpbmdMZW5ndGggPSBsaXN0Lmxl
bmd0aDsKLSAgICAvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuCi0gICAg
Ly8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheQotICAgIH0gZWxzZSBpZiAoIG1lbW9yeSApIHsK
LSAgICBmaXJpbmdTdGFydCA9IHN0YXJ0OwotICAgIGZpcmUoIG1lbW9yeSApOwotICAgIH0KLSAg
ICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLSAgICAvLyBSZW1vdmUgYSBjYWxsYmFjayBm
cm9tIHRoZSBsaXN0Ci0gICAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIGxpc3QgKSB7
Ci0gICAgalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKLSAgICB2
YXIgaW5kZXg7Ci0gICAgd2hpbGUoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0
LCBpbmRleCApICkgPiAtMSApIHsKLSAgICBsaXN0LnNwbGljZSggaW5kZXgsIDEgKTsKLSAgICAv
LyBIYW5kbGUgZmlyaW5nIGluZGV4ZXMKLSAgICBpZiAoIGZpcmluZyApIHsKLSAgICBpZiAoIGlu
ZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKLSAgICBmaXJpbmdMZW5ndGgtLTsKLSAgICB9Ci0gICAg
aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKLSAgICBmaXJpbmdJbmRleC0tOwotICAgIH0K
LSAgICB9Ci0gICAgfQotICAgIH0pOwotICAgIH0KLSAgICByZXR1cm4gdGhpczsKLSAgICB9LAot
ICAgIC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuCi0gICAgLy8g
SWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBj
YWxsYmFja3MgYXR0YWNoZWQuCi0gICAgaGFzOiBmdW5jdGlvbiggZm4gKSB7Ci0gICAgcmV0dXJu
IGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3Qu
bGVuZ3RoICk7Ci0gICAgfSwKLSAgICAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBs
aXN0Ci0gICAgZW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIGxpc3QgPSBbXTsKLSAgICByZXR1cm4g
dGhpczsKLSAgICB9LAotICAgIC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCi0g
ICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7Ci0gICAgbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5k
ZWZpbmVkOwotICAgIHJldHVybiB0aGlzOwotICAgIH0sCi0gICAgLy8gSXMgaXQgZGlzYWJsZWQ/
Ci0gICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiAhbGlzdDsKLSAgICB9LAot
ICAgIC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGUKLSAgICBsb2NrOiBmdW5j
dGlvbigpIHsKLSAgICBzdGFjayA9IHVuZGVmaW5lZDsKLSAgICBpZiAoICFtZW1vcnkgKSB7Ci0g
ICAgc2VsZi5kaXNhYmxlKCk7Ci0gICAgfQotICAgIHJldHVybiB0aGlzOwotICAgIH0sCi0gICAg
Ly8gSXMgaXQgbG9ja2VkPwotICAgIGxvY2tlZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICFz
dGFjazsKLSAgICB9LAotICAgIC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBj
b250ZXh0IGFuZCBhcmd1bWVudHMKLSAgICBmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFy
Z3MgKSB7Ci0gICAgYXJncyA9IGFyZ3MgfHwgW107Ci0gICAgYXJncyA9IFsgY29udGV4dCwgYXJn
cy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTsKLSAgICBpZiAoIGxpc3QgJiYgKCAhZmly
ZWQgfHwgc3RhY2sgKSApIHsKLSAgICBpZiAoIGZpcmluZyApIHsKLSAgICBzdGFjay5wdXNoKCBh
cmdzICk7Ci0gICAgfSBlbHNlIHsKLSAgICBmaXJlKCBhcmdzICk7Ci0gICAgfQotICAgIH0KLSAg
ICByZXR1cm4gdGhpczsKLSAgICB9LAotICAgIC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0
aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCi0gICAgZmlyZTogZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5m
aXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLSAg
ICAvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0
IGxlYXN0IG9uY2UKLSAgICBmaXJlZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuICEhZmlyZWQ7
Ci0gICAgfQotICAgIH07Ci0KLSAgICByZXR1cm4gc2VsZjsKLX07Ci1qUXVlcnkuZXh0ZW5kKHsK
LQotICAgIERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKLSAgICB2YXIgdHVwbGVzID0gWwot
ICAgIC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQot
ICAgIFsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
ICJyZXNvbHZlZCIgXSwKLSAgICBbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3Mo
Im9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwKLSAgICBbICJub3RpZnkiLCAicHJvZ3Jlc3Mi
LCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnkiKSBdCi0gICAgXSwKLSAgICBzdGF0ZSA9ICJwZW5k
aW5nIiwKLSAgICBwcm9taXNlID0gewotICAgIHN0YXRlOiBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gc3RhdGU7Ci0gICAgfSwKLSAgICBhbHdheXM6IGZ1bmN0aW9uKCkgewotICAgIGRlZmVycmVk
LmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwotICAgIHJldHVybiB0aGlzOwot
ICAgIH0sCi0gICAgdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNz
ICovICkgewotICAgIHZhciBmbnMgPSBhcmd1bWVudHM7Ci0gICAgcmV0dXJuIGpRdWVyeS5EZWZl
cnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7Ci0gICAgalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVu
Y3Rpb24oIGksIHR1cGxlICkgewotICAgIHZhciBhY3Rpb24gPSB0dXBsZVsgMCBdLAotICAgIGZu
ID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07Ci0gICAgLy8gZGVm
ZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRv
IG5ld0RlZmVyCi0gICAgZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotICAgIGlmICgg
cmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsKLSAg
ICByZXR1cm5lZC5wcm9taXNlKCkKLSAgICAuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApCi0gICAg
LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCi0gICAgLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkg
KTsKLSAgICB9IGVsc2UgewotICAgIG5ld0RlZmVyWyBhY3Rpb24gKyAiV2l0aCIgXSggdGhpcyA9
PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBd
IDogYXJndW1lbnRzICk7Ci0gICAgfQotICAgIH0pOwotICAgIH0pOwotICAgIGZucyA9IG51bGw7
Ci0gICAgfSkucHJvbWlzZSgpOwotICAgIH0sCi0gICAgLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhp
cyBkZWZlcnJlZAotICAgIC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0
IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKLSAgICBwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewot
ICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDog
cHJvbWlzZTsKLSAgICB9Ci0gICAgfSwKLSAgICBkZWZlcnJlZCA9IHt9OwotCi0gICAgLy8gS2Vl
cCBwaXBlIGZvciBiYWNrLWNvbXBhdAotICAgIHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsK
LQotICAgIC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHMKLSAgICBqUXVlcnkuZWFjaCggdHVw
bGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7Ci0gICAgdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAot
ICAgIHN0YXRlU3RyaW5nID0gdHVwbGVbIDMgXTsKLQotICAgIC8vIHByb21pc2VbIGRvbmUgfCBm
YWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkCi0gICAgcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxp
c3QuYWRkOwotCi0gICAgLy8gSGFuZGxlIHN0YXRlCi0gICAgaWYgKCBzdGF0ZVN0cmluZyApIHsK
LSAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsKLSAgICAvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCBy
ZWplY3RlZCBdCi0gICAgc3RhdGUgPSBzdGF0ZVN0cmluZzsKLQotICAgIC8vIFsgcmVqZWN0X2xp
c3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKLSAgICB9LCB0
dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKLSAg
ICB9Ci0KLSAgICAvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCi0gICAg
ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHsKLSAgICBkZWZlcnJlZFsgdHVwbGVb
MF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1l
bnRzICk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gICAgfTsKLSAgICBkZWZlcnJlZFsgdHVwbGVbMF0g
KyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7Ci0gICAgfSk7Ci0KLSAgICAvLyBNYWtlIHRoZSBk
ZWZlcnJlZCBhIHByb21pc2UKLSAgICBwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7Ci0KLSAg
ICAvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55Ci0gICAgaWYgKCBmdW5jICkgewotICAgIGZ1bmMu
Y2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7Ci0gICAgfQotCi0gICAgLy8gQWxsIGRvbmUhCi0g
ICAgcmV0dXJuIGRlZmVycmVkOwotICAgIH0sCi0KLSAgICAvLyBEZWZlcnJlZCBoZWxwZXIKLSAg
ICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyAp
IHsKLSAgICB2YXIgaSA9IDAsCi0gICAgcmVzb2x2ZVZhbHVlcyA9IGNvcmVfc2xpY2UuY2FsbCgg
YXJndW1lbnRzICksCi0gICAgbGVuZ3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsCi0KLSAgICAv
LyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCi0gICAgcmVtYWluaW5nID0g
bGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9y
ZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKLQotICAgIC8vIHRoZSBtYXN0ZXIgRGVm
ZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVk
LCBqdXN0IHVzZSB0aGF0LgotICAgIGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3Jk
aW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKLQotICAgIC8vIFVwZGF0ZSBmdW5jdGlvbiBmb3Ig
Ym90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXMKLSAgICB1cGRhdGVGdW5jID0gZnVuY3Rp
b24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSAp
IHsKLSAgICBjb250ZXh0c1sgaSBdID0gdGhpczsKLSAgICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50
cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwotICAg
IGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkgewotICAgIGRlZmVycmVkLm5vdGlmeVdp
dGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKLSAgICB9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyAp
ICkgewotICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7Ci0gICAg
fQotICAgIH07Ci0gICAgfSwKLQotICAgIHByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRz
LCByZXNvbHZlQ29udGV4dHM7Ci0KLSAgICAvLyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1
Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCi0gICAgaWYgKCBsZW5ndGggPiAx
ICkgewotICAgIHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKLSAgICBwcm9n
cmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKLSAgICByZXNvbHZlQ29udGV4dHMg
PSBuZXcgQXJyYXkoIGxlbmd0aCApOwotICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewot
ICAgIGlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZl
VmFsdWVzWyBpIF0ucHJvbWlzZSApICkgewotICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNl
KCkKLSAgICAuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFs
dWVzICkgKQotICAgIC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKQotICAgIC5wcm9ncmVzcyggdXBk
YXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOwotICAgIH0g
ZWxzZSB7Ci0gICAgLS1yZW1haW5pbmc7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0KLSAgICAvLyBp
ZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCi0gICAg
aWYgKCAhcmVtYWluaW5nICkgewotICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29u
dGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmZXJyZWQucHJv
bWlzZSgpOwotICAgIH0KLX0pOwotalF1ZXJ5LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7Ci0KLSAg
ICB2YXIgc3VwcG9ydCwgYWxsLCBhLAotICAgIGlucHV0LCBzZWxlY3QsIGZyYWdtZW50LAotICAg
IG9wdCwgZXZlbnROYW1lLCBpc1N1cHBvcnRlZCwgaSwKLSAgICBkaXYgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJkaXYiKTsKLQotICAgIC8vIFNldHVwCi0gICAgZGl2LnNldEF0dHJpYnV0ZSgg
ImNsYXNzTmFtZSIsICJ0IiApOwotICAgIGRpdi5pbm5lckhUTUwgPSAiICA8bGluay8+PHRhYmxl
PjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IjsKLQot
ICAgIC8vIFN1cHBvcnQgdGVzdHMgd29uJ3QgcnVuIGluIHNvbWUgbGltaXRlZCBvciBub24tYnJv
d3NlciBlbnZpcm9ubWVudHMKLSAgICBhbGwgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioi
KTsKLSAgICBhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAgXTsKLSAgICBpZiAo
ICFhbGwgfHwgIWEgfHwgIWFsbC5sZW5ndGggKSB7Ci0gICAgcmV0dXJuIHt9OwotICAgIH0KLQot
ICAgIC8vIEZpcnN0IGJhdGNoIG9mIHRlc3RzCi0gICAgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgic2VsZWN0Iik7Ci0gICAgb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOwotICAgIGlucHV0ID0gZGl2LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCJpbnB1dCIpWyAwIF07Ci0KLSAgICBhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFw
eDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiOwotICAgIHN1cHBvcnQgPSB7Ci0gICAgLy8gVGVzdCBz
ZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLiBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRy
Rml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYvNykKLSAgICBnZXRTZXRBdHRy
aWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0IiwKLQotICAgIC8vIElFIHN0cmlwcyBsZWFkaW5n
IHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKLSAgICBsZWFkaW5nV2hpdGVzcGFj
ZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMsCi0KLSAgICAvLyBNYWtlIHN1cmUgdGhh
dCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAotICAgIC8vIElF
IHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKLSAgICB0Ym9keTogIWRpdi5nZXRF
bGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsCi0KLSAgICAvLyBNYWtlIHN1cmUgdGhh
dCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKLSAg
ICAvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCi0gICAgaHRtbFNlcmlh
bGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCi0KLSAgICAv
LyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCi0gICAgLy8gKElF
IHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKLSAgICBzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRy
aWJ1dGUoInN0eWxlIikgKSwKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1h
bmlwdWxhdGVkCi0gICAgLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKLSAgICBocmVm
Tm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKLQotICAgIC8vIE1h
a2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKLSAgICAvLyAoSUUgdXNlcyBmaWx0
ZXIgaW5zdGVhZCkKLSAgICAvLyBVc2UgYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIFdlYktpdCBp
c3N1ZS4gU2VlICM1MTQ1Ci0gICAgb3BhY2l0eTogL14wLjUvLnRlc3QoIGEuc3R5bGUub3BhY2l0
eSApLAotCi0gICAgLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQotICAgIC8vIChJRSB1
c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKLSAgICBjc3NGbG9hdDogISFhLnN0
eWxlLmNzc0Zsb2F0LAotCi0gICAgLy8gQ2hlY2sgdGhlIGRlZmF1bHQgY2hlY2tib3gvcmFkaW8g
dmFsdWUgKCIiIG9uIFdlYktpdDsgIm9uIiBlbHNld2hlcmUpCi0gICAgY2hlY2tPbjogISFpbnB1
dC52YWx1ZSwKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBv
cHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS4KLSAgICAvLyAoV2ViS2l0IGRl
ZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9w
dGdyb3VwKQotICAgIG9wdFNlbGVjdGVkOiBvcHQuc2VsZWN0ZWQsCi0KLSAgICAvLyBUZXN0cyBm
b3IgZW5jdHlwZSBzdXBwb3J0IG9uIGEgZm9ybSAoIzY3NDMpCi0gICAgZW5jdHlwZTogISFkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSwKLQotICAgIC8vIE1ha2VzIHN1cmUg
Y2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCi0gICAgLy8g
V2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5lZCwgdGhpcyBzdGlsbCB3b3JrcwotICAgIGh0bWw1
Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91
dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4iLAotCi0gICAgLy8galF1ZXJ5LnN1cHBvcnQuYm94
TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBRdWlya3MgTW9k
ZQotICAgIGJveE1vZGVsOiBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIsCi0K
LSAgICAvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKLSAgICBkZWxldGVFeHBhbmRvOiB0cnVlLAot
ICAgIG5vQ2xvbmVFdmVudDogdHJ1ZSwKLSAgICBpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxz
ZSwKLSAgICBzaHJpbmtXcmFwQmxvY2tzOiBmYWxzZSwKLSAgICByZWxpYWJsZU1hcmdpblJpZ2h0
OiB0cnVlLAotICAgIGJveFNpemluZ1JlbGlhYmxlOiB0cnVlLAotICAgIHBpeGVsUG9zaXRpb246
IGZhbHNlCi0gICAgfTsKLQotICAgIC8vIE1ha2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9w
ZXJseSBjbG9uZWQKLSAgICBpbnB1dC5jaGVja2VkID0gdHJ1ZTsKLSAgICBzdXBwb3J0Lm5vQ2xv
bmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsKLQotICAgIC8vIE1h
a2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBt
YXJrZWQgYXMgZGlzYWJsZWQKLSAgICAvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQp
Ci0gICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKLSAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0g
IW9wdC5kaXNhYmxlZDsKLQotICAgIC8vIFN1cHBvcnQ6IElFPDkKLSAgICB0cnkgewotICAgIGRl
bGV0ZSBkaXYudGVzdDsKLSAgICB9IGNhdGNoKCBlICkgewotICAgIHN1cHBvcnQuZGVsZXRlRXhw
YW5kbyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRB
dHRyaWJ1dGUoInZhbHVlIikKLSAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlu
cHV0Iik7Ci0gICAgaW5wdXQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwotICAgIHN1cHBv
cnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gIiI7Ci0KLSAgICAv
LyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEg
cmFkaW8KLSAgICBpbnB1dC52YWx1ZSA9ICJ0IjsKLSAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0
eXBlIiwgInJhZGlvIiApOwotICAgIHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09
PSAidCI7Ci0KLSAgICAvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFt
ZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUKLSAgICBpbnB1dC5zZXRBdHRyaWJ1dGUo
ICJjaGVja2VkIiwgInQiICk7Ci0gICAgaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiAp
OwotCi0gICAgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0g
ICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7Ci0KLSAgICAvLyBDaGVjayBpZiBhIGRp
c2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAotICAgIC8vIHZhbHVl
IG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCi0gICAgc3VwcG9ydC5h
cHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tlZDsKLQotICAgIC8vIFdlYktpdCBkb2Vzbid0IGNs
b25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwotICAgIHN1cHBvcnQuY2hl
Y2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxh
c3RDaGlsZC5jaGVja2VkOwotCi0gICAgLy8gU3VwcG9ydDogSUU8OQotICAgIC8vIE9wZXJhIGRv
ZXMgbm90IGNsb25lIGV2ZW50cyAoYW5kIHR5cGVvZiBkaXYuYXR0YWNoRXZlbnQgPT09IHVuZGVm
aW5lZCkuCi0gICAgLy8gSUU5LTEwIGNsb25lcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50
LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdpdGggLmNsaWNrKCkKLSAgICBpZiAoIGRpdi5hdHRh
Y2hFdmVudCApIHsKLSAgICBkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwgZnVuY3Rpb24oKSB7
Ci0gICAgc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKLSAgICB9KTsKLQotICAgIGRpdi5j
bG9uZU5vZGUoIHRydWUgKS5jbGljaygpOwotICAgIH0KLQotICAgIC8vIFN1cHBvcnQ6IElFPDkg
KGxhY2sgc3VibWl0L2NoYW5nZSBidWJibGUpLCBGaXJlZm94IDE3KyAobGFjayBmb2N1c2luIGV2
ZW50KQotICAgIC8vIEJld2FyZSBvZiBDU1AgcmVzdHJpY3Rpb25zIChodHRwczovL2RldmVsb3Bl
ci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1ApLCB0ZXN0L2NzcC5waHAKLSAgICBmb3IgKCBp
IGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6IHRydWUsIGZvY3VzaW46IHRydWUgfSkgewotICAg
IGRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSA9ICJvbiIgKyBpLCAidCIgKTsKLQotICAgIHN1
cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGV2ZW50TmFtZSBpbiB3aW5kb3cgfHwgZGl2LmF0dHJp
YnV0ZXNbIGV2ZW50TmFtZSBdLmV4cGFuZG8gPT09IGZhbHNlOwotICAgIH0KLQotICAgIGRpdi5z
dHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7Ci0gICAgZGl2LmNsb25lTm9kZSgg
dHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gIiI7Ci0gICAgc3VwcG9ydC5jbGVhckNsb25l
U3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250ZW50LWJveCI7Ci0KLSAg
ICAvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKLSAgICBqUXVlcnko
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRhaW5lciwgbWFyZ2luRGl2LCB0ZHMsCi0gICAgZGl2
UmVzZXQgPSAicGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7Ym94LXNp
emluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7LXdlYmtpdC1ib3gt
c2l6aW5nOmNvbnRlbnQtYm94OyIsCi0gICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCJib2R5IilbMF07Ci0KLSAgICBpZiAoICFib2R5ICkgewotICAgIC8vIFJldHVybiBm
b3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5Ci0gICAgcmV0dXJuOwotICAg
IH0KLQotICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAg
IGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9z
aXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4IjsKLQotICAg
IGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTsKLQotICAg
IC8vIFN1cHBvcnQ6IElFOAotICAgIC8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUg
b2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0Ci0gICAgLy8gdG8gZGlzcGxheTpu
b25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCi0g
ICAgLy8gdGFibGUgcm93OyBpZiBzbywgb2Zmc2V0V2lkdGgvSGVpZ2h0IGFyZSBub3QgcmVsaWFi
bGUgZm9yIHVzZSB3aGVuCi0gICAgLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVl
biBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKLSAgICAvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxs
IHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcwotICAgIC8vIGhpZGRl
bjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBzZWUgYnVnICM0NTEyIGZvciBtb3JlIGluZm9ybWF0
aW9uKS4KLSAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3Rk
PjwvdHI+PC90YWJsZT4iOwotICAgIHRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQi
KTsKLSAgICB0ZHNbIDAgXS5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6MDttYXJnaW46MDtib3Jk
ZXI6MDtkaXNwbGF5Om5vbmUiOwotICAgIGlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRI
ZWlnaHQgPT09IDAgKTsKLQotICAgIHRkc1sgMCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICB0
ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotCi0gICAgLy8gU3VwcG9ydDogSUU4Ci0g
ICAgLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9I
ZWlnaHQKLSAgICBzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYm
ICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7Ci0KLSAgICAvLyBDaGVjayBib3gtc2l6
aW5nIGFuZCBtYXJnaW4gYmVoYXZpb3IKLSAgICBkaXYuaW5uZXJIVE1MID0gIiI7Ci0gICAgZGl2
LnN0eWxlLmNzc1RleHQgPSAiYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpi
b3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRl
cjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNv
bHV0ZTt0b3A6MSU7IjsKLSAgICBzdXBwb3J0LmJveFNpemluZyA9ICggZGl2Lm9mZnNldFdpZHRo
ID09PSA0ICk7Ci0gICAgc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCA9
ICggYm9keS5vZmZzZXRUb3AgIT09IDEgKTsKLQotICAgIC8vIFVzZSB3aW5kb3cuZ2V0Q29tcHV0
ZWRTdHlsZSBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0Lgot
ICAgIGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7Ci0gICAgc3VwcG9ydC5waXhlbFBv
c2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwge30gKS50
b3AgIT09ICIxJSI7Ci0gICAgc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSA9ICggd2luZG93Lmdl
dENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHsgd2lkdGg6ICI0cHgiIH0gKS53aWR0aCA9
PT0gIjRweCI7Ci0KLSAgICAvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQg
bm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5Ci0gICAgLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4t
cmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpCi0gICAgLy8gRmFpbHMg
aW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKLSAgICAvLyBXZWJLaXQgQnVnIDEz
MzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmln
aHQKLSAgICBtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImRpdiIpICk7Ci0gICAgbWFyZ2luRGl2LnN0eWxlLmNzc1RleHQgPSBkaXYuc3R5bGUuY3Nz
VGV4dCA9IGRpdlJlc2V0OwotICAgIG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdp
bkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKLSAgICBkaXYuc3R5bGUud2lkdGggPSAiMXB4IjsKLQot
ICAgIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9Ci0gICAgIXBhcnNlRmxvYXQoICggd2lu
ZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmln
aHQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gY29yZV9z
dHJ1bmRlZmluZWQgKSB7Ci0gICAgLy8gU3VwcG9ydDogSUU8OAotICAgIC8vIENoZWNrIGlmIG5h
dGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1ibG9jawotICAgIC8v
IGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZp
bmcKLSAgICAvLyB0aGVtIGxheW91dAotICAgIGRpdi5pbm5lckhUTUwgPSAiIjsKLSAgICBkaXYu
c3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5
OmlubGluZTt6b29tOjEiOwotICAgIHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICgg
ZGl2Lm9mZnNldFdpZHRoID09PSAzICk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTYKLSAgICAvLyBD
aGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlbgot
ICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICBkaXYuaW5uZXJIVE1MID0gIjxk
aXY+PC9kaXY+IjsKLSAgICBkaXYuZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9ICI1cHgiOwotICAg
IHN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7Ci0K
LSAgICBpZiAoIHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCApIHsKLSAgICAvLyBQcmV2
ZW50IElFIDYgZnJvbSBhZmZlY3RpbmcgbGF5b3V0IGZvciBwb3NpdGlvbmVkIGVsZW1lbnRzICMx
MTA0OAotICAgIC8vIFByZXZlbnQgSUUgZnJvbSBzaHJpbmtpbmcgdGhlIGJvZHkgaW4gSUUgNyBt
b2RlICMxMjg2OQotICAgIC8vIFN1cHBvcnQ6IElFPDgKLSAgICBib2R5LnN0eWxlLnpvb20gPSAx
OwotICAgIH0KLSAgICB9Ci0KLSAgICBib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLQot
ICAgIC8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKLSAgICBjb250YWluZXIg
PSBkaXYgPSB0ZHMgPSBtYXJnaW5EaXYgPSBudWxsOwotICAgIH0pOwotCi0gICAgLy8gTnVsbCBl
bGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRQotICAgIGFsbCA9IHNlbGVjdCA9IGZyYWdtZW50
ID0gb3B0ID0gYSA9IGlucHV0ID0gbnVsbDsKLQotICAgIHJldHVybiBzdXBwb3J0OwotfSkoKTsK
LQotdmFyIHJicmFjZSA9IC8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLywKLSAgICBybXVs
dGlEYXNoID0gLyhbQS1aXSkvZzsKLQotZnVuY3Rpb24gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1l
LCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKXsKLSAgICBpZiAoICFqUXVlcnku
YWNjZXB0RGF0YSggZWxlbSApICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YXIgdGhp
c0NhY2hlLCByZXQsCi0gICAgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKLSAgICBnZXRC
eU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIsCi0KLSAgICAvLyBXZSBoYXZlIHRvIGhh
bmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVjdHMgZGlmZmVyZW50bHkgYmVjYXVzZSBJRTYtNwot
ICAgIC8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9N
LUpTIGJvdW5kYXJ5Ci0gICAgaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKLQotICAgIC8vIE9ubHkg
RE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlz
Ci0gICAgLy8gYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdCBzbyBHQyBjYW4gb2NjdXIg
YXV0b21hdGljYWxseQotICAgIGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwK
LQotICAgIC8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hl
IGFscmVhZHkgZXhpc3RzIGFsbG93cwotICAgIC8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRo
ZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCi0gICAgaWQgPSBpc05vZGUg
PyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxlbVsgaW50ZXJuYWxLZXkgXSAmJiBpbnRlcm5hbEtl
eTsKLQotICAgIC8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdo
ZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCi0gICAgLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRh
dGEgYXQgYWxsCi0gICAgaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hl
W2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKLSAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAhaWQgKSB7Ci0gICAgLy8gT25seSBET00gbm9kZXMg
bmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCi0g
ICAgLy8gZW5kcyB1cCBpbiB0aGUgZ2xvYmFsIGNhY2hlCi0gICAgaWYgKCBpc05vZGUgKSB7Ci0g
ICAgZWxlbVsgaW50ZXJuYWxLZXkgXSA9IGlkID0gY29yZV9kZWxldGVkSWRzLnBvcCgpIHx8IGpR
dWVyeS5ndWlkKys7Ci0gICAgfSBlbHNlIHsKLSAgICBpZCA9IGludGVybmFsS2V5OwotICAgIH0K
LSAgICB9Ci0KLSAgICBpZiAoICFjYWNoZVsgaWQgXSApIHsKLSAgICBjYWNoZVsgaWQgXSA9IHt9
OwotCi0gICAgLy8gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeSBtZXRhZGF0YSBvbiBwbGFpbiBKUyBv
YmplY3RzIHdoZW4gdGhlIG9iamVjdAotICAgIC8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5z
dHJpbmdpZnkKLSAgICBpZiAoICFpc05vZGUgKSB7Ci0gICAgY2FjaGVbIGlkIF0udG9KU09OID0g
alF1ZXJ5Lm5vb3A7Ci0gICAgfQotICAgIH0KLQotICAgIC8vIEFuIG9iamVjdCBjYW4gYmUgcGFz
c2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRz
Ci0gICAgLy8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQotICAg
IGlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rp
b24iICkgewotICAgIGlmICggcHZ0ICkgewotICAgIGNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVu
ZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKLSAgICB9IGVsc2UgewotICAgIGNhY2hlWyBpZCBdLmRh
dGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7Ci0gICAgfQotICAg
IH0KLQotICAgIHRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdOwotCi0gICAgLy8galF1ZXJ5IGRhdGEo
KSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBvYmplY3QgaW5zaWRlIHRoZSBvYmplY3QncyBpbnRl
cm5hbCBkYXRhCi0gICAgLy8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMg
YmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWQKLSAgICAvLyBkYXRhLgotICAg
IGlmICggIXB2dCApIHsKLSAgICBpZiAoICF0aGlzQ2FjaGUuZGF0YSApIHsKLSAgICB0aGlzQ2Fj
aGUuZGF0YSA9IHt9OwotICAgIH0KLQotICAgIHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOwot
ICAgIH0KLQotICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewotICAgIHRoaXNDYWNoZVsg
alF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBkYXRhOwotICAgIH0KLQotICAgIC8vIENoZWNr
IGZvciBib3RoIGNvbnZlcnRlZC10by1jYW1lbCBhbmQgbm9uLWNvbnZlcnRlZCBkYXRhIHByb3Bl
cnR5IG5hbWVzCi0gICAgLy8gSWYgYSBkYXRhIHByb3BlcnR5IHdhcyBzcGVjaWZpZWQKLSAgICBp
ZiAoIGdldEJ5TmFtZSApIHsKLQotICAgIC8vIEZpcnN0IFRyeSB0byBmaW5kIGFzLWlzIHByb3Bl
cnR5IGRhdGEKLSAgICByZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKLQotICAgIC8vIFRlc3QgZm9y
IG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGEKLSAgICBpZiAoIHJldCA9PSBudWxsICkgewot
Ci0gICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHkKLSAgICByZXQgPSB0
aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwotICAgIH0KLSAgICB9IGVsc2Ug
ewotICAgIHJldCA9IHRoaXNDYWNoZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1m
dW5jdGlvbiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHB2dCApIHsKLSAgICBpZiAo
ICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICB2YXIgaSwgbCwgdGhpc0NhY2hlLAotICAgIGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCi0KLSAg
ICAvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSAgICBjYWNoZSA9IGlz
Tm9kZSA/IGpRdWVyeS5jYWNoZSA6IGVsZW0sCi0gICAgaWQgPSBpc05vZGUgPyBlbGVtWyBqUXVl
cnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFuZG87Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhbHJl
YWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlzIG9iamVjdCwgdGhlcmUgaXMgbm8KLSAgICAvLyBw
dXJwb3NlIGluIGNvbnRpbnVpbmcKLSAgICBpZiAoICFjYWNoZVsgaWQgXSApIHsKLSAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKCBuYW1lICkgewotCi0gICAgdGhpc0NhY2hlID0gcHZ0ID8g
Y2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhOwotCi0gICAgaWYgKCB0aGlzQ2FjaGUgKSB7
Ci0KLSAgICAvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMg
Zm9yIGRhdGEga2V5cwotICAgIGlmICggIWpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Ci0KLSAg
ICAvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgotICAg
IGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7Ci0gICAgbmFtZSA9IFsgbmFtZSBdOwotICAgIH0g
ZWxzZSB7Ci0KLSAgICAvLyBzcGxpdCB0aGUgY2FtZWwgY2FzZWQgdmVyc2lvbiBieSBzcGFjZXMg
dW5sZXNzIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMKLSAgICBuYW1lID0galF1ZXJ5LmNh
bWVsQ2FzZSggbmFtZSApOwotICAgIGlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7Ci0gICAgbmFt
ZSA9IFsgbmFtZSBdOwotICAgIH0gZWxzZSB7Ci0gICAgbmFtZSA9IG5hbWUuc3BsaXQoIiAiKTsK
LSAgICB9Ci0gICAgfQotICAgIH0gZWxzZSB7Ci0gICAgLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5
IG9mIGtleXMuLi4KLSAgICAvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAo
ImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCi0gICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0
byBjYW1lbENhc2UuCi0gICAgLy8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18g
YSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKLSAgICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxD
YXNlIGtleS4gIzEyNzg2Ci0gICAgLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5
IGFyZ3VtZW50IHBhdGguCi0gICAgbmFtZSA9IG5hbWUuY29uY2F0KCBqUXVlcnkubWFwKCBuYW1l
LCBqUXVlcnkuY2FtZWxDYXNlICkgKTsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMCwgbCA9IG5h
bWUubGVuZ3RoOyBpIDwgbDsgaSsrICkgewotICAgIGRlbGV0ZSB0aGlzQ2FjaGVbIG5hbWVbaV0g
XTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hl
LCB3ZSB3YW50IHRvIGNvbnRpbnVlCi0gICAgLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0
c2VsZiBnZXQgZGVzdHJveWVkCi0gICAgaWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6
IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgewotICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgfQotICAgIH0KLQotICAgIC8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZv
cm1hdGlvbgotICAgIGlmICggIXB2dCApIHsKLSAgICBkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTsK
LQotICAgIC8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVy
bmFsIGRhdGEgb2JqZWN0Ci0gICAgLy8gaGFkIGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBp
dAotICAgIGlmICggIWlzRW1wdHlEYXRhT2JqZWN0KCBjYWNoZVsgaWQgXSApICkgewotICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgfQotCi0gICAgLy8gRGVzdHJveSB0aGUgY2FjaGUKLSAgICBpZiAo
IGlzTm9kZSApIHsKLSAgICBqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApOwotCi0g
ICAgLy8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBvcnRlZCBmb3IgZXhwYW5kb3Mgb3IgYGNhY2hlYCBp
cyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93ICgjMTAwODApCi0gICAgfSBlbHNlIGlmICggalF1
ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7Ci0g
ICAgZGVsZXRlIGNhY2hlWyBpZCBdOwotCi0gICAgLy8gV2hlbiBhbGwgZWxzZSBmYWlscywgbnVs
bAotICAgIH0gZWxzZSB7Ci0gICAgY2FjaGVbIGlkIF0gPSBudWxsOwotICAgIH0KLX0KLQotalF1
ZXJ5LmV4dGVuZCh7Ci0gICAgY2FjaGU6IHt9LAotCi0gICAgLy8gVW5pcXVlIGZvciBlYWNoIGNv
cHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCi0gICAgLy8gTm9uLWRpZ2l0cyByZW1vdmVkIHRvIG1h
dGNoIHJpbmxpbmVqUXVlcnkKLSAgICBleHBhbmRvOiAialF1ZXJ5IiArICggY29yZV92ZXJzaW9u
ICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAotCi0gICAgLy8gVGhlIGZv
bGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQotICAg
IC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8gcHJvcGVydGllcyB0byB0aGVtLgotICAgIG5vRGF0
YTogewotICAgICJlbWJlZCI6IHRydWUsCi0gICAgLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBm
b3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKLSAgICAib2JqZWN0IjogImNsc2lkOkQy
N0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCi0gICAgImFwcGxldCI6IHRydWUK
LSAgICB9LAotCi0gICAgaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgZWxlbSA9IGVs
ZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVt
WyBqUXVlcnkuZXhwYW5kbyBdOwotICAgIHJldHVybiAhIWVsZW0gJiYgIWlzRW1wdHlEYXRhT2Jq
ZWN0KCBlbGVtICk7Ci0gICAgfSwKLQotICAgIGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBk
YXRhICkgewotICAgIHJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUsIGRhdGEgKTsKLSAg
ICB9LAotCi0gICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgcmV0
dXJuIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSApOwotICAgIH0sCi0KLSAgICAvLyBG
b3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBk
YXRhICkgewotICAgIHJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUg
KTsKLSAgICB9LAotCi0gICAgX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewot
ICAgIHJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKLSAgICB9
LAotCi0gICAgLy8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhh
bmRsZSB0aGUgZGF0YSBleHBhbmRvCi0gICAgYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7
Ci0gICAgLy8gRG8gbm90IHNldCBkYXRhIG9uIG5vbi1lbGVtZW50IGJlY2F1c2UgaXQgd2lsbCBu
b3QgYmUgY2xlYXJlZCAoIzgzMzUpLgotICAgIGlmICggZWxlbS5ub2RlVHlwZSAmJiBlbGVtLm5v
ZGVUeXBlICE9PSAxICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7Ci0gICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIHZhciBub0RhdGEgPSBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0Rh
dGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0gICAgLy8gbm9kZXMgYWNjZXB0
IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0
aW9uYWwKLSAgICByZXR1cm4gIW5vRGF0YSB8fCBub0RhdGEgIT09IHRydWUgJiYgZWxlbS5nZXRB
dHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9EYXRhOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4u
ZXh0ZW5kKHsKLSAgICBkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKLSAgICB2YXIgYXR0
cnMsIG5hbWUsCi0gICAgZWxlbSA9IHRoaXNbMF0sCi0gICAgaSA9IDAsCi0gICAgZGF0YSA9IG51
bGw7Ci0KLSAgICAvLyBHZXRzIGFsbCB2YWx1ZXMKLSAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVk
ICkgewotICAgIGlmICggdGhpcy5sZW5ndGggKSB7Ci0gICAgZGF0YSA9IGpRdWVyeS5kYXRhKCBl
bGVtICk7Ci0KLSAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSgg
ZWxlbSwgInBhcnNlZEF0dHJzIiApICkgewotICAgIGF0dHJzID0gZWxlbS5hdHRyaWJ1dGVzOwot
ICAgIGZvciAoIDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkgewotICAgIG5hbWUgPSBhdHRyc1tp
XS5uYW1lOwotCi0gICAgaWYgKCAhbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgKSB7Ci0gICAgbmFt
ZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKLQotICAgIGRhdGFBdHRyKCBl
bGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKLSAgICB9Ci0gICAgfQotICAgIGpRdWVyeS5fZGF0
YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1ZSApOwotICAgIH0KLSAgICB9Ci0KLSAgICByZXR1
cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwotICAgIGlmICgg
dHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7Ci0gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv
bigpIHsKLSAgICBqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7Ci0gICAgfSk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKLQotICAg
IGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKLSAgICAvLyBUcnkgdG8gZmV0Y2ggYW55IGlu
dGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKLSAgICByZXR1cm4gZWxlbSA/IGRhdGFBdHRyKCBl
bGVtLCBrZXksIGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKSApIDogbnVsbDsKLSAgICB9Ci0KLSAg
ICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFs
dWUgKTsKLSAgICB9KTsKLSAgICB9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEs
IG51bGwsIHRydWUgKTsKLSAgICB9LAotCi0gICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSAp
IHsKLSAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgIGpRdWVyeS5yZW1vdmVE
YXRhKCB0aGlzLCBrZXkgKTsKLSAgICB9KTsKLSAgICB9Ci19KTsKLQotZnVuY3Rpb24gZGF0YUF0
dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKLSAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRl
cm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55Ci0gICAgLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRh
LSogYXR0cmlidXRlCi0gICAgaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlw
ZSA9PT0gMSApIHsKLQotICAgIHZhciBuYW1lID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVs
dGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICBkYXRhID0gZWxlbS5nZXRBdHRy
aWJ1dGUoIG5hbWUgKTsKLQotICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewot
ICAgIHRyeSB7Ci0gICAgZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgotICAgIGRhdGEg
PT09ICJmYWxzZSIgPyBmYWxzZSA6Ci0gICAgZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6Ci0gICAg
Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJp
bmcKLSAgICArZGF0YSArICIiID09PSBkYXRhID8gK2RhdGEgOgotICAgIHJicmFjZS50ZXN0KCBk
YXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgotICAgIGRhdGE7Ci0gICAgfSBjYXRj
aCggZSApIHt9Ci0KLSAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0
IGNoYW5nZWQgbGF0ZXIKLSAgICBqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7Ci0KLSAg
ICB9IGVsc2UgewotICAgIGRhdGEgPSB1bmRlZmluZWQ7Ci0gICAgfQotICAgIH0KLQotICAgIHJl
dHVybiBkYXRhOwotfQotCi0vLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcwot
ZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3QoIG9iaiApIHsKLSAgICB2YXIgbmFtZTsKLSAgICBm
b3IgKCBuYW1lIGluIG9iaiApIHsKLQotICAgIC8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3Qg
aXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0aWxsIGVtcHR5Ci0gICAgaWYgKCBuYW1lID09PSAi
ZGF0YSIgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkgewotICAgIGNvbnRp
bnVlOwotICAgIH0KLSAgICBpZiAoIG5hbWUgIT09ICJ0b0pTT04iICkgewotICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci1qUXVlcnkuZXh0ZW5k
KHsKLSAgICBxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7Ci0gICAgdmFyIHF1
ZXVlOwotCi0gICAgaWYgKCBlbGVtICkgewotICAgIHR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsg
InF1ZXVlIjsKLSAgICBxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSApOwotCi0gICAg
Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVz
dCBhIGxvb2t1cAotICAgIGlmICggZGF0YSApIHsKLSAgICBpZiAoICFxdWV1ZSB8fCBqUXVlcnku
aXNBcnJheShkYXRhKSApIHsKLSAgICBxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSwg
alF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOwotICAgIH0gZWxzZSB7Ci0gICAgcXVldWUucHVzaCgg
ZGF0YSApOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXVlIHx8IFtdOwotICAgIH0KLSAg
ICB9LAotCi0gICAgZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7Ci0gICAgdHlwZSA9
IHR5cGUgfHwgImZ4IjsKLQotICAgIHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlw
ZSApLAotICAgIHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAotICAgIGZuID0gcXVldWUuc2hp
ZnQoKSwKLSAgICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLAotICAg
IG5leHQgPSBmdW5jdGlvbigpIHsKLSAgICBqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOwot
ICAgIH07Ci0KLSAgICAvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1v
dmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCi0gICAgaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkg
ewotICAgIGZuID0gcXVldWUuc2hpZnQoKTsKLSAgICBzdGFydExlbmd0aC0tOwotICAgIH0KLQot
ICAgIGhvb2tzLmN1ciA9IGZuOwotICAgIGlmICggZm4gKSB7Ci0KLSAgICAvLyBBZGQgYSBwcm9n
cmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCi0gICAgLy8g
YXV0b21hdGljYWxseSBkZXF1ZXVlZAotICAgIGlmICggdHlwZSA9PT0gImZ4IiApIHsKLSAgICBx
dWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKLSAgICB9Ci0KLSAgICAvLyBjbGVhciB1cCB0
aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uCi0gICAgZGVsZXRlIGhvb2tzLnN0b3A7Ci0gICAg
Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFzdGFydExl
bmd0aCAmJiBob29rcyApIHsKLSAgICBob29rcy5lbXB0eS5maXJlKCk7Ci0gICAgfQotICAgIH0s
Ci0KLSAgICAvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRl
cyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZQotICAgIF9x
dWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKLSAgICB2YXIga2V5ID0gdHlwZSAr
ICJxdWV1ZUhvb2tzIjsKLSAgICByZXR1cm4galF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXkgKSB8fCBq
UXVlcnkuX2RhdGEoIGVsZW0sIGtleSwgewotICAgIGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJv
bmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKLSAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVs
ZW0sIHR5cGUgKyAicXVldWUiICk7Ci0gICAgalF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBrZXkg
KTsKLSAgICB9KQotICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAg
ICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0gICAgdmFyIHNldHRlciA9IDI7Ci0K
LSAgICBpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKLSAgICBkYXRhID0gdHlwZTsK
LSAgICB0eXBlID0gImZ4IjsKLSAgICBzZXR0ZXItLTsKLSAgICB9Ci0KLSAgICBpZiAoIGFyZ3Vt
ZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sw
XSwgdHlwZSApOwotICAgIH0KLQotICAgIHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgPwotICAg
IHRoaXMgOgotICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICB2YXIgcXVldWUgPSBqUXVl
cnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKLQotICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZv
ciB0aGlzIHF1ZXVlCi0gICAgalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7Ci0KLSAg
ICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKLSAg
ICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwotICAgIH0KLSAgICB9KTsKLSAgICB9LAot
ICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewotICAgIHJldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oKSB7Ci0gICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLSAgICB9KTsKLSAg
ICB9LAotICAgIC8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdp
dGggcGVybWlzc2lvbi4KLSAgICAvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAv
MjAwOS8wNy9qcXVlcnktZGVsYXkvCi0gICAgZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkg
ewotICAgIHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGlt
ZSA6IHRpbWU7Ci0gICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQotICAgIHJldHVybiB0aGlzLnF1
ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7Ci0gICAgdmFyIHRpbWVvdXQgPSBz
ZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7Ci0gICAgaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewot
ICAgIGNsZWFyVGltZW91dCggdGltZW91dCApOwotICAgIH07Ci0gICAgfSk7Ci0gICAgfSwKLSAg
ICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHsKLSAgICByZXR1cm4gdGhpcy5xdWV1ZSgg
dHlwZSB8fCAiZngiLCBbXSApOwotICAgIH0sCi0gICAgLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZl
ZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQotICAgIC8vIGFyZSBlbXB0aWVkIChmeCBp
cyB0aGUgdHlwZSBieSBkZWZhdWx0KQotICAgIHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmog
KSB7Ci0gICAgdmFyIHRtcCwKLSAgICBjb3VudCA9IDEsCi0gICAgZGVmZXIgPSBqUXVlcnkuRGVm
ZXJyZWQoKSwKLSAgICBlbGVtZW50cyA9IHRoaXMsCi0gICAgaSA9IHRoaXMubGVuZ3RoLAotICAg
IHJlc29sdmUgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoICEoIC0tY291bnQgKSApIHsKLSAgICBk
ZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwotICAgIH0KLSAgICB9
OwotCi0gICAgaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7Ci0gICAgb2JqID0gdHlw
ZTsKLSAgICB0eXBlID0gdW5kZWZpbmVkOwotICAgIH0KLSAgICB0eXBlID0gdHlwZSB8fCAiZngi
OwotCi0gICAgd2hpbGUoIGktLSApIHsKLSAgICB0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRz
WyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIgKTsKLSAgICBpZiAoIHRtcCAmJiB0bXAuZW1wdHkg
KSB7Ci0gICAgY291bnQrKzsKLSAgICB0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7Ci0gICAgfQot
ICAgIH0KLSAgICByZXNvbHZlKCk7Ci0gICAgcmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOwot
ICAgIH0KLX0pOwotdmFyIG5vZGVIb29rLCBib29sSG9vaywKLSAgICByY2xhc3MgPSAvW1x0XHJc
bl0vZywKLSAgICBycmV0dXJuID0gL1xyL2csCi0gICAgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8
c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLAotICAgIHJjbGlja2FibGUgPSAvXig/
OmF8YXJlYSkkL2ksCi0gICAgcmJvb2xlYW4gPSAvXig/OmNoZWNrZWR8c2VsZWN0ZWR8YXV0b2Zv
Y3VzfGF1dG9wbGF5fGFzeW5jfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11
bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkKSQvaSwKLSAgICBydXNlRGVmYXVs
dCA9IC9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2ksCi0gICAgZ2V0U2V0QXR0cmlidXRlID0galF1
ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLAotICAgIGdldFNldElucHV0ID0galF1ZXJ5LnN1
cHBvcnQuaW5wdXQ7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIGF0dHI6IGZ1bmN0aW9uKCBu
YW1lLCB2YWx1ZSApIHsKLSAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LmF0
dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwotICAgIH0sCi0KLSAgICBy
ZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKLSAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCkgewotICAgIGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7Ci0gICAgfSk7Ci0g
ICAgfSwKLQotICAgIHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICByZXR1cm4g
alF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMu
bGVuZ3RoID4gMSApOwotICAgIH0sCi0KLSAgICByZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSAp
IHsKLSAgICBuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwotICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMg
d2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCi0g
ICAgdHJ5IHsKLSAgICB0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7Ci0gICAgZGVsZXRlIHRoaXNb
IG5hbWUgXTsKLSAgICB9IGNhdGNoKCBlICkge30KLSAgICB9KTsKLSAgICB9LAotCi0gICAgYWRk
Q2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBj
bGF6eiwgaiwKLSAgICBpID0gMCwKLSAgICBsZW4gPSB0aGlzLmxlbmd0aCwKLSAgICBwcm9jZWVk
ID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZTsKLQotICAgIGlmICggalF1ZXJ5
LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7Ci0gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigg
aiApIHsKLSAgICBqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwg
dGhpcy5jbGFzc05hbWUgKSApOwotICAgIH0pOwotICAgIH0KLQotICAgIGlmICggcHJvY2VlZCAp
IHsKLSAgICAvLyBUaGUgZGlzanVuY3Rpb24gaGVyZSBpcyBmb3IgYmV0dGVyIGNvbXByZXNzaWJp
bGl0eSAoc2VlIHJlbW92ZUNsYXNzKQotICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0
Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107Ci0KLSAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyAp
IHsKLSAgICBlbGVtID0gdGhpc1sgaSBdOwotICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEg
JiYgKCBlbGVtLmNsYXNzTmFtZSA/Ci0gICAgKCAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiAp
LnJlcGxhY2UoIHJjbGFzcywgIiAiICkgOgotICAgICIgIgotICAgICk7Ci0KLSAgICBpZiAoIGN1
ciApIHsKLSAgICBqID0gMDsKLSAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7
Ci0gICAgaWYgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7Ci0gICAg
Y3VyICs9IGNsYXp6ICsgIiAiOwotICAgIH0KLSAgICB9Ci0gICAgZWxlbS5jbGFzc05hbWUgPSBq
UXVlcnkudHJpbSggY3VyICk7Ci0KLSAgICB9Ci0gICAgfQotICAgIH0KLQotICAgIHJldHVybiB0
aGlzOwotICAgIH0sCi0KLSAgICByZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgewotICAg
IHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLAotICAgIGkgPSAwLAotICAgIGxlbiA9
IHRoaXMubGVuZ3RoLAotICAgIHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5
cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWU7Ci0KLSAgICBpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCB2YWx1ZSApICkgewotICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7
Ci0gICAgalF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRo
aXMuY2xhc3NOYW1lICkgKTsKLSAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCBwcm9jZWVkICkgewot
ICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwg
W107Ci0KLSAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICBlbGVtID0gdGhpc1sgaSBd
OwotICAgIC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmls
aXR5IChzZWUgYWRkQ2xhc3MpCi0gICAgY3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIGVs
ZW0uY2xhc3NOYW1lID8KLSAgICAoICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFj
ZSggcmNsYXNzLCAiICIgKSA6Ci0gICAgIiIKLSAgICApOwotCi0gICAgaWYgKCBjdXIgKSB7Ci0g
ICAgaiA9IDA7Ci0gICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgewotICAgIC8v
IFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKLSAgICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBj
bGF6eiArICIgIiApID49IDAgKSB7Ci0gICAgY3VyID0gY3VyLnJlcGxhY2UoICIgIiArIGNsYXp6
ICsgIiAiLCAiICIgKTsKLSAgICB9Ci0gICAgfQotICAgIGVsZW0uY2xhc3NOYW1lID0gdmFsdWUg
PyBqUXVlcnkudHJpbSggY3VyICkgOiAiIjsKLSAgICB9Ci0gICAgfQotICAgIH0KLQotICAgIHJl
dHVybiB0aGlzOwotICAgIH0sCi0KLSAgICB0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBz
dGF0ZVZhbCApIHsKLSAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKLSAgICBpc0Jvb2wgPSB0
eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIjsKLQotICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rp
b24oIHZhbHVlICkgKSB7Ci0gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKLSAg
ICBqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNs
YXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwotICAgIH0pOwotICAgIH0KLQotICAgIHJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCB0eXBlID09PSAic3RyaW5nIiAp
IHsKLSAgICAvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcwotICAgIHZhciBjbGFzc05h
bWUsCi0gICAgaSA9IDAsCi0gICAgc2VsZiA9IGpRdWVyeSggdGhpcyApLAotICAgIHN0YXRlID0g
c3RhdGVWYWwsCi0gICAgY2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSAp
IHx8IFtdOwotCi0gICAgd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkg
ewotICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlz
dAotICAgIHN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1l
ICk7Ci0gICAgc2VsZlsgc3RhdGUgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFz
c05hbWUgKTsKLSAgICB9Ci0KLSAgICAvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZQotICAgIH0g
ZWxzZSBpZiAoIHR5cGUgPT09IGNvcmVfc3RydW5kZWZpbmVkIHx8IHR5cGUgPT09ICJib29sZWFu
IiApIHsKLSAgICBpZiAoIHRoaXMuY2xhc3NOYW1lICkgewotICAgIC8vIHN0b3JlIGNsYXNzTmFt
ZSBpZiBzZXQKLSAgICBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5j
bGFzc05hbWUgKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBu
YW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCAiZmFsc2UiLAotICAgIC8vIHRoZW4gcmVtb3ZlIHRoZSB3
aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCi0g
ICAgLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQg
KGlmIGFueXRoaW5nKSwKLSAgICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBp
ZiBub3RoaW5nIHdhcyBzdG9yZWQuCi0gICAgdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFt
ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NO
YW1lX18iICkgfHwgIiI7Ci0gICAgfQotICAgIH0pOwotICAgIH0sCi0KLSAgICBoYXNDbGFzczog
ZnVuY3Rpb24oIHNlbGVjdG9yICkgewotICAgIHZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3Rv
ciArICIgIiwKLSAgICBpID0gMCwKLSAgICBsID0gdGhpcy5sZW5ndGg7Ci0gICAgZm9yICggOyBp
IDwgbDsgaSsrICkgewotICAgIGlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsg
dGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNs
YXNzTmFtZSApID49IDAgKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLQotICAg
IHJldHVybiBmYWxzZTsKLSAgICB9LAotCi0gICAgdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0g
ICAgdmFyIHJldCwgaG9va3MsIGlzRnVuY3Rpb24sCi0gICAgZWxlbSA9IHRoaXNbMF07Ci0KLSAg
ICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewotICAgIGlmICggZWxlbSApIHsKLSAgICBob29r
cyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVt
Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKLQotICAgIGlmICggaG9va3MgJiYgImdldCIgaW4g
aG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgInZhbHVlIiApKSAhPT0gdW5kZWZpbmVk
ICkgewotICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcmV0ID0gZWxlbS52YWx1ZTsKLQot
ICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/Ci0gICAgLy8gaGFuZGxlIG1vc3Qg
Y29tbW9uIHN0cmluZyBjYXNlcwotICAgIHJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6Ci0gICAg
Ly8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCi0gICAg
cmV0ID09IG51bGwgPyAiIiA6IHJldDsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwotCi0gICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKLSAgICB2YXIgdmFsLAotICAgIHNlbGYgPSBqUXVl
cnkodGhpcyk7Ci0KLSAgICBpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7Ci0gICAgcmV0dXJu
OwotICAgIH0KLQotICAgIGlmICggaXNGdW5jdGlvbiApIHsKLSAgICB2YWwgPSB2YWx1ZS5jYWxs
KCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7Ci0gICAgfSBlbHNlIHsKLSAgICB2YWwgPSB2YWx1ZTsK
LSAgICB9Ci0KLSAgICAvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1i
ZXJzIHRvIHN0cmluZwotICAgIGlmICggdmFsID09IG51bGwgKSB7Ci0gICAgdmFsID0gIiI7Ci0g
ICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7Ci0gICAgdmFsICs9ICIi
OwotICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKLSAgICB2YWwgPSBq
UXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2YWx1ZSApIHsKLSAgICByZXR1cm4gdmFsdWUgPT0g
bnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKLSAgICB9KTsKLSAgICB9Ci0KLSAgICBob29rcyA9IGpR
dWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVO
YW1lLnRvTG93ZXJDYXNlKCkgXTsKLQotICAgIC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwg
ZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nCi0gICAgaWYgKCAhaG9va3MgfHwgISgic2V0IiBp
biBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVk
ICkgewotICAgIHRoaXMudmFsdWUgPSB2YWw7Ci0gICAgfQotICAgIH0pOwotICAgIH0KLX0pOwot
Ci1qUXVlcnkuZXh0ZW5kKHsKLSAgICB2YWxIb29rczogewotICAgIG9wdGlvbjogewotICAgIGdl
dDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgLy8gYXR0cmlidXRlcy52YWx1ZSBpcyB1bmRlZmlu
ZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0Ci0gICAgLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgot
ICAgIHZhciB2YWwgPSBlbGVtLmF0dHJpYnV0ZXMudmFsdWU7Ci0gICAgcmV0dXJuICF2YWwgfHwg
dmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7Ci0gICAgfQotICAgIH0sCi0g
ICAgc2VsZWN0OiB7Ci0gICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICB2YXIgdmFsdWUs
IG9wdGlvbiwKLSAgICBvcHRpb25zID0gZWxlbS5vcHRpb25zLAotICAgIGluZGV4ID0gZWxlbS5z
ZWxlY3RlZEluZGV4LAotICAgIG9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiIHx8IGlu
ZGV4IDwgMCwKLSAgICB2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCi0gICAgbWF4ID0gb25lID8g
aW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgsCi0gICAgaSA9IGluZGV4IDwgMCA/Ci0gICAgbWF4
IDoKLSAgICBvbmUgPyBpbmRleCA6IDA7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBz
ZWxlY3RlZCBvcHRpb25zCi0gICAgZm9yICggOyBpIDwgbWF4OyBpKysgKSB7Ci0gICAgb3B0aW9u
ID0gb3B0aW9uc1sgaSBdOwotCi0gICAgLy8gb2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQg
YWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCi0gICAgaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBp
ID09PSBpbmRleCApICYmCi0gICAgLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlz
YWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAotICAgICggalF1ZXJ5LnN1cHBvcnQub3B0
RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJs
ZWQiKSA9PT0gbnVsbCApICYmCi0gICAgKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwg
IWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSApICkgewot
Ci0gICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgotICAgIHZhbHVl
ID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTsKLQotICAgIC8vIFdlIGRvbid0IG5lZWQgYW4gYXJy
YXkgZm9yIG9uZSBzZWxlY3RzCi0gICAgaWYgKCBvbmUgKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwot
ICAgIH0KLQotICAgIC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5Ci0gICAgdmFsdWVz
LnB1c2goIHZhbHVlICk7Ci0gICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YWx1ZXM7Ci0gICAg
fSwKLQotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewotICAgIHZhciB2YWx1ZXMg
PSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwotCi0gICAgalF1ZXJ5KGVsZW0pLmZpbmQoIm9w
dGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFy
cmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZhbHVlcyApID49IDA7Ci0gICAgfSk7Ci0KLSAgICBp
ZiAoICF2YWx1ZXMubGVuZ3RoICkgewotICAgIGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xOwotICAg
IH0KLSAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLSAgICB9Ci0gICAgfSwKLQotICAgIGF0dHI6
IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKLSAgICB2YXIgaG9va3MsIG5vdHhtbCwg
cmV0LAotICAgIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKLQotICAgIC8vIGRvbid0IGdldC9zZXQg
YXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKLSAgICBpZiAo
ICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewot
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmli
dXRlcyBhcmUgbm90IHN1cHBvcnRlZAotICAgIGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRl
ID09PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsKLSAgICByZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0s
IG5hbWUsIHZhbHVlICk7Ci0gICAgfQotCi0gICAgbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpR
dWVyeS5pc1hNTERvYyggZWxlbSApOwotCi0gICAgLy8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2Vy
Y2FzZQotICAgIC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKLSAgICBp
ZiAoIG5vdHhtbCApIHsKLSAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIGhvb2tz
ID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8g
Ym9vbEhvb2sgOiBub2RlSG9vayApOwotICAgIH0KLQotICAgIGlmICggdmFsdWUgIT09IHVuZGVm
aW5lZCApIHsKLQotICAgIGlmICggdmFsdWUgPT09IG51bGwgKSB7Ci0gICAgalF1ZXJ5LnJlbW92
ZUF0dHIoIGVsZW0sIG5hbWUgKTsKLQotICAgIH0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAm
JiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSAp
KSAhPT0gdW5kZWZpbmVkICkgewotICAgIHJldHVybiByZXQ7Ci0KLSAgICB9IGVsc2UgewotICAg
IGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArICIiICk7Ci0gICAgcmV0dXJuIHZhbHVl
OwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAoIGhvb2tzICYmIG5vdHhtbCAmJiAiZ2V0IiBpbiBo
b29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgewotICAg
IHJldHVybiByZXQ7Ci0KLSAgICB9IGVsc2UgewotCi0gICAgLy8gSW4gSUU5KywgRmxhc2ggb2Jq
ZWN0cyBkb24ndCBoYXZlIC5nZXRBdHRyaWJ1dGUgKCMxMjk0NSkKLSAgICAvLyBTdXBwb3J0OiBJ
RTkrCi0gICAgaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IGNvcmVfc3RydW5kZWZp
bmVkICkgewotICAgIHJldCA9ICBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwotICAgIH0KLQot
ICAgIC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUg
dG8gdW5kZWZpbmVkCi0gICAgcmV0dXJuIHJldCA9PSBudWxsID8KLSAgICB1bmRlZmluZWQgOgot
ICAgIHJldDsKLSAgICB9Ci0gICAgfSwKLQotICAgIHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVt
LCB2YWx1ZSApIHsKLSAgICB2YXIgbmFtZSwgcHJvcE5hbWUsCi0gICAgaSA9IDAsCi0gICAgYXR0
ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIGNvcmVfcm5vdHdoaXRlICk7Ci0KLSAgICBp
ZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotICAgIHdoaWxlICggKG5h
bWUgPSBhdHRyTmFtZXNbaSsrXSkgKSB7Ci0gICAgcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsg
bmFtZSBdIHx8IG5hbWU7Ci0KLSAgICAvLyBCb29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwg
dHJlYXRtZW50ICgjMTA4NzApCi0gICAgaWYgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgKSB7Ci0g
ICAgLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0
cmlidXRlcwotICAgIC8vIEFsc28gY2xlYXIgZGVmYXVsdENoZWNrZWQvZGVmYXVsdFNlbGVjdGVk
IChpZiBhcHByb3ByaWF0ZSkgZm9yIElFPDgKLSAgICBpZiAoICFnZXRTZXRBdHRyaWJ1dGUgJiYg
cnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgewotICAgIGVsZW1bIGpRdWVyeS5jYW1lbENhc2Uo
ICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9Ci0gICAgZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwot
ICAgIH0gZWxzZSB7Ci0gICAgZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwotICAgIH0KLQotICAg
IC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBm
aXJzdCwgdGhlbiByZW1vdmFsKQotICAgIH0gZWxzZSB7Ci0gICAgalF1ZXJ5LmF0dHIoIGVsZW0s
IG5hbWUsICIiICk7Ci0gICAgfQotCi0gICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0
dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOwotICAgIH0KLSAgICB9Ci0gICAgfSwKLQotICAg
IGF0dHJIb29rczogewotICAgIHR5cGU6IHsKLSAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1
ZSApIHsKLSAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAi
cmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAiaW5wdXQiKSApIHsKLSAgICAvLyBTZXR0
aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhl
IHZhbHVlIGluIElFNi05Ci0gICAgLy8gUmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5
cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVhdGlvbgotICAgIHZhciB2YWwgPSBlbGVt
LnZhbHVlOwotICAgIGVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7Ci0gICAgaWYg
KCB2YWwgKSB7Ci0gICAgZWxlbS52YWx1ZSA9IHZhbDsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVl
OwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0sCi0KLSAgICBwcm9wRml4OiB7Ci0gICAgdGFi
aW5kZXg6ICJ0YWJJbmRleCIsCi0gICAgcmVhZG9ubHk6ICJyZWFkT25seSIsCi0gICAgImZvciI6
ICJodG1sRm9yIiwKLSAgICAiY2xhc3MiOiAiY2xhc3NOYW1lIiwKLSAgICBtYXhsZW5ndGg6ICJt
YXhMZW5ndGgiLAotICAgIGNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAotICAgIGNlbGxwYWRk
aW5nOiAiY2VsbFBhZGRpbmciLAotICAgIHJvd3NwYW46ICJyb3dTcGFuIiwKLSAgICBjb2xzcGFu
OiAiY29sU3BhbiIsCi0gICAgdXNlbWFwOiAidXNlTWFwIiwKLSAgICBmcmFtZWJvcmRlcjogImZy
YW1lQm9yZGVyIiwKLSAgICBjb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRpdGFibGUiCi0gICAg
fSwKLQotICAgIHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKLSAgICB2YXIg
cmV0LCBob29rcywgbm90eG1sLAotICAgIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKLQotICAgIC8v
IGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUg
bm9kZXMKLSAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5U
eXBlID09PSAyICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub3R4bWwgPSBuVHlwZSAh
PT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7Ci0KLSAgICBpZiAoIG5vdHhtbCApIHsK
LSAgICAvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzCi0gICAgbmFtZSA9IGpRdWVyeS5wcm9w
Rml4WyBuYW1lIF0gfHwgbmFtZTsKLSAgICBob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUg
XTsKLSAgICB9Ci0KLSAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgaWYgKCBo
b29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwg
bmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewotICAgIHJldHVybiByZXQ7Ci0KLSAgICB9IGVsc2Ug
ewotICAgIHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7Ci0gICAgfQotCi0gICAgfSBl
bHNlIHsKLSAgICBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5n
ZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7Ci0gICAgcmV0dXJuIHJldDsKLQotICAgIH0g
ZWxzZSB7Ci0gICAgcmV0dXJuIGVsZW1bIG5hbWUgXTsKLSAgICB9Ci0gICAgfQotICAgIH0sCi0K
LSAgICBwcm9wSG9va3M6IHsKLSAgICB0YWJJbmRleDogewotICAgIGdldDogZnVuY3Rpb24oIGVs
ZW0gKSB7Ci0gICAgLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNv
cnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAotICAgIC8vIGh0
dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5k
LXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCi0gICAgdmFyIGF0dHJp
YnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7Ci0KLSAgICByZXR1
cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/Ci0gICAgcGFyc2VJ
bnQoIGF0dHJpYnV0ZU5vZGUudmFsdWUsIDEwICkgOgotICAgIHJmb2N1c2FibGUudGVzdCggZWxl
bS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0u
aHJlZiA/Ci0gICAgMCA6Ci0gICAgdW5kZWZpbmVkOwotICAgIH0KLSAgICB9Ci0gICAgfQotfSk7
Ci0KLS8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwotYm9vbEhvb2sgPSB7Ci0gICAgZ2V0
OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKLSAgICB2YXIKLSAgICAvLyBVc2UgLnByb3AgdG8g
ZGV0ZXJtaW5lIGlmIHRoaXMgYXR0cmlidXRlIGlzIHVuZGVyc3Rvb2QgYXMgYm9vbGVhbgotICAg
IHByb3AgPSBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApLAotCi0gICAgLy8gRmV0Y2ggaXQgYWNj
b3JkaW5nbHkKLSAgICBhdHRyID0gdHlwZW9mIHByb3AgPT09ICJib29sZWFuIiAmJiBlbGVtLmdl
dEF0dHJpYnV0ZSggbmFtZSApLAotICAgIGRldGFpbCA9IHR5cGVvZiBwcm9wID09PSAiYm9vbGVh
biIgPwotCi0gICAgZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlID8KLSAgICBhdHRyICE9
IG51bGwgOgotICAgIC8vIG9sZElFIGZhYnJpY2F0ZXMgYW4gZW1wdHkgc3RyaW5nIGZvciBtaXNz
aW5nIGJvb2xlYW4gYXR0cmlidXRlcwotICAgIC8vIGFuZCBjb25mbGF0ZXMgY2hlY2tlZC9zZWxl
Y3RlZCBpbnRvIGF0dHJvcGVydGllcwotICAgIHJ1c2VEZWZhdWx0LnRlc3QoIG5hbWUgKSA/Ci0g
ICAgZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSggImRlZmF1bHQtIiArIG5hbWUgKSBdIDoKLSAgICAh
IWF0dHIgOgotCi0gICAgLy8gZmV0Y2ggYW4gYXR0cmlidXRlIG5vZGUgZm9yIHByb3BlcnRpZXMg
bm90IHJlY29nbml6ZWQgYXMgYm9vbGVhbgotICAgIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFt
ZSApOwotCi0gICAgcmV0dXJuIGRldGFpbCAmJiBkZXRhaWwudmFsdWUgIT09IGZhbHNlID8KLSAg
ICBuYW1lLnRvTG93ZXJDYXNlKCkgOgotICAgIHVuZGVmaW5lZDsKLSAgICB9LAotICAgIHNldDog
ZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewotICAgIGlmICggdmFsdWUgPT09IGZhbHNl
ICkgewotICAgIC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UK
LSAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwotICAgIH0gZWxzZSBpZiAoIGdl
dFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSAp
ICkgewotICAgIC8vIElFPDggbmVlZHMgdGhlICpwcm9wZXJ0eSogbmFtZQotICAgIGVsZW0uc2V0
QXR0cmlidXRlKCAhZ2V0U2V0QXR0cmlidXRlICYmIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwg
bmFtZSwgbmFtZSApOwotCi0gICAgLy8gVXNlIGRlZmF1bHRDaGVja2VkIGFuZCBkZWZhdWx0U2Vs
ZWN0ZWQgZm9yIG9sZElFCi0gICAgfSBlbHNlIHsKLSAgICBlbGVtWyBqUXVlcnkuY2FtZWxDYXNl
KCAiZGVmYXVsdC0iICsgbmFtZSApIF0gPSBlbGVtWyBuYW1lIF0gPSB0cnVlOwotICAgIH0KLQot
ICAgIHJldHVybiBuYW1lOwotICAgIH0KLX07Ci0KLS8vIGZpeCBvbGRJRSB2YWx1ZSBhdHRyb3Bl
cnR5Ci1pZiAoICFnZXRTZXRJbnB1dCB8fCAhZ2V0U2V0QXR0cmlidXRlICkgewotICAgIGpRdWVy
eS5hdHRySG9va3MudmFsdWUgPSB7Ci0gICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsK
LSAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7Ci0gICAgcmV0dXJu
IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8KLQotICAgIC8vIElnbm9yZSB0aGUg
dmFsdWUgKnByb3BlcnR5KiBieSB1c2luZyBkZWZhdWx0VmFsdWUKLSAgICBlbGVtLmRlZmF1bHRW
YWx1ZSA6Ci0KLSAgICByZXQgJiYgcmV0LnNwZWNpZmllZCA/IHJldC52YWx1ZSA6IHVuZGVmaW5l
ZDsKLSAgICB9LAotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewotICAg
IGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7Ci0gICAgLy8gRG9lcyBu
b3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAotICAgIGVsZW0uZGVm
YXVsdFZhbHVlID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAvLyBVc2Ugbm9kZUhvb2sgaWYg
ZGVmaW5lZCAoIzE5NTQpOyBvdGhlcndpc2Ugc2V0QXR0cmlidXRlIGlzIGZpbmUKLSAgICByZXR1
cm4gbm9kZUhvb2sgJiYgbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOwotICAgIH0K
LSAgICB9Ci0gICAgfTsKLX0KLQotLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0
aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKLWlmICggIWdldFNldEF0
dHJpYnV0ZSApIHsKLQotICAgIC8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83
Ci0gICAgLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKLSAgICBub2RlSG9v
ayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7Ci0gICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwg
bmFtZSApIHsKLSAgICB2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7Ci0g
ICAgcmV0dXJuIHJldCAmJiAoIG5hbWUgPT09ICJpZCIgfHwgbmFtZSA9PT0gIm5hbWUiIHx8IG5h
bWUgPT09ICJjb29yZHMiID8gcmV0LnZhbHVlICE9PSAiIiA6IHJldC5zcGVjaWZpZWQgKSA/Ci0g
ICAgcmV0LnZhbHVlIDoKLSAgICB1bmRlZmluZWQ7Ci0gICAgfSwKLSAgICBzZXQ6IGZ1bmN0aW9u
KCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKLSAgICAvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0
ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQotICAgIHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5v
ZGUoIG5hbWUgKTsKLSAgICBpZiAoICFyZXQgKSB7Ci0gICAgZWxlbS5zZXRBdHRyaWJ1dGVOb2Rl
KAotICAgIChyZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICkp
Ci0gICAgKTsKLSAgICB9Ci0KLSAgICByZXQudmFsdWUgPSB2YWx1ZSArPSAiIjsKLQotICAgIC8v
IEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xvbmVkIGVsZW1lbnRzIGJ5IGFsc28gdXNpbmcgc2V0
QXR0cmlidXRlICgjOTY0NikKLSAgICByZXR1cm4gbmFtZSA9PT0gInZhbHVlIiB8fCB2YWx1ZSA9
PT0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA/Ci0gICAgdmFsdWUgOgotICAgIHVuZGVmaW5l
ZDsKLSAgICB9Ci0gICAgfTsKLQotICAgIC8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ug
b24gcmVtb3ZhbHMoIzEwNDI5KQotICAgIC8vIFNldHRpbmcgdG8gZW1wdHkgc3RyaW5nIHRocm93
cyBhbiBlcnJvciBhcyBhbiBpbnZhbGlkIHZhbHVlCi0gICAgalF1ZXJ5LmF0dHJIb29rcy5jb250
ZW50ZWRpdGFibGUgPSB7Ci0gICAgZ2V0OiBub2RlSG9vay5nZXQsCi0gICAgc2V0OiBmdW5jdGlv
biggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Ci0gICAgbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSA9
PT0gIiIgPyBmYWxzZSA6IHZhbHVlLCBuYW1lICk7Ci0gICAgfQotICAgIH07Ci0KLSAgICAvLyBT
ZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmco
IEJ1ZyAjODE1MCApCi0gICAgLy8gVGhpcyBpcyBmb3IgcmVtb3ZhbHMKLSAgICBqUXVlcnkuZWFj
aChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAgIGpRdWVy
eS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5h
bWUgXSwgewotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewotICAgIGlmICggdmFs
dWUgPT09ICIiICkgewotICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKLSAg
ICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIH0KLSAgICB9KTsKLSAgICB9KTsKLX0KLQotCi0v
LyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQotLy8gaHR0cDov
L21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNw
eAotaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgKSB7Ci0gICAgalF1ZXJ5LmVh
Y2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFt
ZSApIHsKLSAgICBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVl
cnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKLSAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAg
IHZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwotICAgIHJldHVybiByZXQg
PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKLSAgICB9Ci0gICAgfSk7Ci0gICAgfSk7Ci0KLSAg
ICAvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91bGQgZ2V0IHRoZSBmdWxsIG5vcm1hbGl6ZWQgVVJM
ICgjMTAyOTkvIzEyOTE1KQotICAgIGpRdWVyeS5lYWNoKFsgImhyZWYiLCAic3JjIiBdLCBmdW5j
dGlvbiggaSwgbmFtZSApIHsKLSAgICBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF0gPSB7Ci0gICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5h
bWUsIDQgKTsKLSAgICB9Ci0gICAgfTsKLSAgICB9KTsKLX0KLQotaWYgKCAhalF1ZXJ5LnN1cHBv
cnQuc3R5bGUgKSB7Ci0gICAgalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKLSAgICBnZXQ6IGZ1
bmN0aW9uKCBlbGVtICkgewotICAgIC8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2Yg
ZW1wdHkgc3RyaW5nCi0gICAgLy8gTm90ZTogSUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFt
ZXMsIGJ1dCBpZiB3ZSB3ZXJlIHRvIC50b0xvd2VyQ2FzZSgpCi0gICAgLy8gLmNzc1RleHQsIHRo
YXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnN0aXRpdml0eSBpbiBVUkwncywgbGlrZSBpbiAiYmFj
a2dyb3VuZCIKLSAgICByZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDsKLSAg
ICB9LAotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewotICAgIHJldHVybiAoIGVs
ZW0uc3R5bGUuY3NzVGV4dCA9IHZhbHVlICsgIiIgKTsKLSAgICB9Ci0gICAgfTsKLX0KLQotLy8g
U2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9w
dGlvbgotLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZp
eGVzIGl0Ci1pZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKLSAgICBqUXVlcnku
cHJvcEhvb2tzLnNlbGVjdGVkID0galF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnByb3BIb29rcy5zZWxl
Y3RlZCwgewotICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgdmFyIHBhcmVudCA9IGVs
ZW0ucGFyZW50Tm9kZTsKLQotICAgIGlmICggcGFyZW50ICkgewotICAgIHBhcmVudC5zZWxlY3Rl
ZEluZGV4OwotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdy
b3Vwcywgc2VlICM1NzAxCi0gICAgaWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHsKLSAgICBwYXJl
bnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51
bGw7Ci0gICAgfQotICAgIH0pOwotfQotCi0vLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmcK
LWlmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7Ci0gICAgalF1ZXJ5LnByb3BGaXguZW5j
dHlwZSA9ICJlbmNvZGluZyI7Ci19Ci0KLS8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIv
c2V0dGVyCi1pZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkgewotICAgIGpRdWVyeS5lYWNo
KFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKLSAgICBqUXVlcnkudmFsSG9v
a3NbIHRoaXMgXSA9IHsKLSAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIC8vIEhhbmRs
ZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24i
IGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCi0gICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRl
KCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7Ci0gICAgfQotICAgIH07Ci0g
ICAgfSk7Ci19Ci1qUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24o
KSB7Ci0gICAgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnku
dmFsSG9va3NbIHRoaXMgXSwgewotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewot
ICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7Ci0gICAgcmV0dXJuICggZWxlbS5j
aGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAw
ICk7Ci0gICAgfQotICAgIH0KLSAgICB9KTsKLX0pOwotdmFyIHJmb3JtRWxlbXMgPSAvXig/Omlu
cHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCi0gICAgcmtleUV2ZW50ID0gL15rZXkvLAotICAgIHJt
b3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLAotICAgIHJmb2N1c01v
cnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAotICAgIHJ0eXBlbmFtZXNw
YWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsKLQotZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi0vKgotICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZl
bnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgotICogUHJvcHMgdG8gRGVh
biBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KLSAqLwot
alF1ZXJ5LmV2ZW50ID0gewotCi0gICAgZ2xvYmFsOiB7fSwKLQotICAgIGFkZDogZnVuY3Rpb24o
IGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHsKLSAgICB2YXIgdG1wLCBl
dmVudHMsIHQsIGhhbmRsZU9iakluLAotICAgIHNwZWNpYWwsIGV2ZW50SGFuZGxlLCBoYW5kbGVP
YmosCi0gICAgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLAotICAgIGVsZW1E
YXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7Ci0KLSAgICAvLyBEb24ndCBhdHRhY2ggZXZlbnRz
IHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3Rz
KQotICAgIGlmICggIWVsZW1EYXRhICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBD
YWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhl
IGhhbmRsZXIKLSAgICBpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKLSAgICBoYW5kbGVPYmpJbiA9
IGhhbmRsZXI7Ci0gICAgaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7Ci0gICAgc2VsZWN0
b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhh
dCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0
ZXIKLSAgICBpZiAoICFoYW5kbGVyLmd1aWQgKSB7Ci0gICAgaGFuZGxlci5ndWlkID0galF1ZXJ5
Lmd1aWQrKzsKLSAgICB9Ci0KLSAgICAvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0
dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0Ci0gICAgaWYgKCAhKGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0gICAgZXZlbnRzID0gZWxlbURhdGEuZXZlbnRz
ID0ge307Ci0gICAgfQotICAgIGlmICggIShldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSkg
KSB7Ci0gICAgZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsK
LSAgICAvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dl
cigpIGFuZAotICAgIC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMg
dW5sb2FkZWQKLSAgICByZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gY29yZV9zdHJ1bmRlZmluZWQg
JiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgPwotICAgIGpRdWVy
eS5ldmVudC5kaXNwYXRjaC5hcHBseSggZXZlbnRIYW5kbGUuZWxlbSwgYXJndW1lbnRzICkgOgot
ICAgIHVuZGVmaW5lZDsKLSAgICB9OwotICAgIC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2Yg
dGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZl
IGV2ZW50cwotICAgIGV2ZW50SGFuZGxlLmVsZW0gPSBlbGVtOwotICAgIH0KLQotICAgIC8vIEhh
bmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKLSAgICAvLyBqUXVlcnko
Li4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7Ci0gICAgdHlwZXMgPSAoIHR5cGVz
IHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgWyIiXTsKLSAgICB0ID0gdHlwZXMu
bGVuZ3RoOwotICAgIHdoaWxlICggdC0tICkgewotICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4
ZWMoIHR5cGVzW3RdICkgfHwgW107Ci0gICAgdHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdOwotICAg
IG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7Ci0KLSAg
ICAvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFu
ZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKLSAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNw
ZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQotICAgIC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVy
bWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQotICAgIHR5
cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBl
ICkgfHwgdHlwZTsKLQotICAgIC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0
IHR5cGUKLSAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsK
LQotICAgIC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCi0gICAg
aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7Ci0gICAgdHlwZTogdHlwZSwKLSAgICBvcmlnVHlw
ZTogb3JpZ1R5cGUsCi0gICAgZGF0YTogZGF0YSwKLSAgICBoYW5kbGVyOiBoYW5kbGVyLAotICAg
IGd1aWQ6IGhhbmRsZXIuZ3VpZCwKLSAgICBzZWxlY3Rvcjogc2VsZWN0b3IsCi0gICAgbmVlZHND
b250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCgg
c2VsZWN0b3IgKSwKLSAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpCi0gICAgfSwg
aGFuZGxlT2JqSW4gKTsKLQotICAgIC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYg
d2UncmUgdGhlIGZpcnN0Ci0gICAgaWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkg
ewotICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKLSAgICBoYW5kbGVycy5kZWxl
Z2F0ZUNvdW50ID0gMDsKLQotICAgIC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNo
RXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQotICAgIGlm
ICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1l
c3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKLSAgICAvLyBCaW5kIHRoZSBnbG9i
YWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAotICAgIGlmICggZWxlbS5hZGRFdmVudExp
c3RlbmVyICkgewotICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUs
IGZhbHNlICk7Ci0KLSAgICB9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgewotICAgIGVs
ZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOwotICAgIH0KLSAgICB9
Ci0gICAgfQotCi0gICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKLSAgICBzcGVjaWFsLmFkZC5jYWxs
KCBlbGVtLCBoYW5kbGVPYmogKTsKLQotICAgIGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQg
KSB7Ci0gICAgaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKLSAgICB9Ci0g
ICAgfQotCi0gICAgLy8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0
ZXMgaW4gZnJvbnQKLSAgICBpZiAoIHNlbGVjdG9yICkgewotICAgIGhhbmRsZXJzLnNwbGljZSgg
aGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKLSAgICB9IGVsc2Ugewot
ICAgIGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOwotICAgIH0KLQotICAgIC8vIEtlZXAgdHJh
Y2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6
YXRpb24KLSAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwotICAgIH0KLQot
ICAgIC8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQotICAgIGVs
ZW0gPSBudWxsOwotICAgIH0sCi0KLSAgICAvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2
ZW50cyBmcm9tIGFuIGVsZW1lbnQKLSAgICByZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywg
aGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkgewotICAgIHZhciBqLCBoYW5kbGVPYmos
IHRtcCwKLSAgICBvcmlnQ291bnQsIHQsIGV2ZW50cywKLSAgICBzcGVjaWFsLCBoYW5kbGVycywg
dHlwZSwKLSAgICBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKLSAgICBlbGVtRGF0YSA9IGpRdWVyeS5o
YXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICk7Ci0KLSAgICBpZiAoICFlbGVt
RGF0YSB8fCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0gICAgcmV0dXJuOwotICAg
IH0KLQotICAgIC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUg
bWF5IGJlIG9taXR0ZWQKLSAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggY29yZV9y
bm90d2hpdGUgKSB8fCBbIiJdOwotICAgIHQgPSB0eXBlcy5sZW5ndGg7Ci0gICAgd2hpbGUgKCB0
LS0gKSB7Ci0gICAgdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsK
LSAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07Ci0gICAgbmFtZXNwYWNlcyA9ICggdG1wWzJd
IHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQoKTsKLQotICAgIC8vIFVuYmluZCBhbGwgZXZlbnRz
IChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudAotICAgIGlm
ICggIXR5cGUgKSB7Ci0gICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7Ci0gICAgalF1ZXJ5LmV2
ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0
cnVlICk7Ci0gICAgfQotICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHNwZWNpYWwgPSBqUXVl
cnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwotICAgIHR5cGUgPSAoIHNlbGVjdG9yID8g
c3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKLSAgICBo
YW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwotICAgIHRtcCA9IHRtcFsyXSAmJiBuZXcg
UmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIo
XFwufCQpIiApOwotCi0gICAgLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwotICAgIG9yaWdDb3Vu
dCA9IGogPSBoYW5kbGVycy5sZW5ndGg7Ci0gICAgd2hpbGUgKCBqLS0gKSB7Ci0gICAgaGFuZGxl
T2JqID0gaGFuZGxlcnNbIGogXTsKLQotICAgIGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlw
ZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKLSAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIu
Z3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgotICAgICggIXRtcCB8fCB0bXAudGVzdCggaGFu
ZGxlT2JqLm5hbWVzcGFjZSApICkgJiYKLSAgICAoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0g
aGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxl
Y3RvciApICkgewotICAgIGhhbmRsZXJzLnNwbGljZSggaiwgMSApOwotCi0gICAgaWYgKCBoYW5k
bGVPYmouc2VsZWN0b3IgKSB7Ci0gICAgaGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tOwotICAgIH0K
LSAgICBpZiAoIHNwZWNpYWwucmVtb3ZlICkgewotICAgIHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVs
ZW0sIGhhbmRsZU9iaiApOwotICAgIH0KLSAgICB9Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIGdl
bmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBo
YW5kbGVycyBleGlzdAotICAgIC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vy
c2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKQotICAgIGlmICgg
b3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7Ci0gICAgaWYgKCAhc3BlY2lhbC50ZWFy
ZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRh
LmhhbmRsZSApID09PSBmYWxzZSApIHsKLSAgICBqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5
cGUsIGVsZW1EYXRhLmhhbmRsZSApOwotICAgIH0KLQotICAgIGRlbGV0ZSBldmVudHNbIHR5cGUg
XTsKLSAgICB9Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8g
bG9uZ2VyIHVzZWQKLSAgICBpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsK
LSAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxlOwotCi0gICAgLy8gcmVtb3ZlRGF0YSBhbHNvIGNo
ZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkKLSAgICAv
LyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxldGUKLSAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVs
ZW0sICJldmVudHMiICk7Ci0gICAgfQotICAgIH0sCi0KLSAgICB0cmlnZ2VyOiBmdW5jdGlvbigg
ZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHsKLSAgICB2YXIgaGFuZGxlLCBvbnR5
cGUsIGN1ciwKLSAgICBidWJibGVUeXBlLCBzcGVjaWFsLCB0bXAsIGksCi0gICAgZXZlbnRQYXRo
ID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCi0gICAgdHlwZSA9IGNvcmVfaGFzT3duLmNhbGwoIGV2
ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCwKLSAgICBuYW1lc3BhY2VzID0gY29y
ZV9oYXNPd24uY2FsbCggZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5uYW1lc3BhY2Uuc3Bs
aXQoIi4iKSA6IFtdOwotCi0gICAgY3VyID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7
Ci0KLSAgICAvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwotICAg
IGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewotICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291
dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKLSAgICBpZiAoIHJmb2N1
c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7Ci0gICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKLSAgICAv
LyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBl
IGluIGhhbmRsZSgpCi0gICAgbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKLSAgICB0eXBl
ID0gbmFtZXNwYWNlcy5zaGlmdCgpOwotICAgIG5hbWVzcGFjZXMuc29ydCgpOwotICAgIH0KLSAg
ICBvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoiKSA8IDAgJiYgIm9uIiArIHR5cGU7Ci0KLSAgICAv
LyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1
c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKLSAgICBldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5k
byBdID8KLSAgICBldmVudCA6Ci0gICAgbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2
ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwotCi0gICAgZXZlbnQuaXNUcmlnZ2VyID0gdHJ1
ZTsKLSAgICBldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKLSAgICBldmVu
dC5uYW1lc3BhY2VfcmUgPSBldmVudC5uYW1lc3BhY2UgPwotICAgIG5ldyBSZWdFeHAoICIoXnxc
XC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgot
ICAgIG51bGw7Ci0KLSAgICAvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWlu
ZyByZXVzZWQKLSAgICBldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7Ci0gICAgaWYgKCAhZXZlbnQu
dGFyZ2V0ICkgewotICAgIGV2ZW50LnRhcmdldCA9IGVsZW07Ci0gICAgfQotCi0gICAgLy8gQ2xv
bmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUg
aGFuZGxlciBhcmcgbGlzdAotICAgIGRhdGEgPSBkYXRhID09IG51bGwgPwotICAgIFsgZXZlbnQg
XSA6Ci0gICAgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7Ci0KLSAgICAvLyBB
bGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzCi0gICAgc3BlY2lh
bCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0gICAgaWYgKCAhb25seUhh
bmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0s
IGRhdGEgKSA9PT0gZmFsc2UgKSB7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIERldGVy
bWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNw
ZWMgKCM5OTUxKQotICAgIC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7
IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpCi0gICAgaWYgKCAh
b25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVs
ZW0gKSApIHsKLQotICAgIGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBl
OwotICAgIGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7Ci0g
ICAgY3VyID0gY3VyLnBhcmVudE5vZGU7Ci0gICAgfQotICAgIGZvciAoIDsgY3VyOyBjdXIgPSBj
dXIucGFyZW50Tm9kZSApIHsKLSAgICBldmVudFBhdGgucHVzaCggY3VyICk7Ci0gICAgdG1wID0g
Y3VyOwotICAgIH0KLQotICAgIC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1l
bnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQotICAgIGlmICggdG1wID09
PSAoZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KSApIHsKLSAgICBldmVudFBhdGgucHVz
aCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7Ci0gICAg
fQotICAgIH0KLQotICAgIC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgKLSAgICBp
ID0gMDsKLSAgICB3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2ZW50LmlzUHJv
cGFnYXRpb25TdG9wcGVkKCkgKSB7Ci0KLSAgICBldmVudC50eXBlID0gaSA+IDEgPwotICAgIGJ1
YmJsZVR5cGUgOgotICAgIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKLQotICAgIC8vIGpRdWVy
eSBoYW5kbGVyCi0gICAgaGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8
fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7Ci0g
ICAgaWYgKCBoYW5kbGUgKSB7Ci0gICAgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKLSAgICB9
Ci0KLSAgICAvLyBOYXRpdmUgaGFuZGxlcgotICAgIGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9u
dHlwZSBdOwotICAgIGlmICggaGFuZGxlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBo
YW5kbGUuYXBwbHkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7Ci0g
ICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICB9Ci0gICAgfQotICAgIGV2ZW50LnR5cGUg
PSB0eXBlOwotCi0gICAgLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24s
IGRvIGl0IG5vdwotICAgIGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJl
dmVudGVkKCkgKSB7Ci0KLSAgICBpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9k
ZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9jdW1lbnQsIGRhdGEgKSA9PT0gZmFsc2UpICYmCi0g
ICAgISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYm
IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7Ci0KLSAgICAvLyBDYWxsIGEgbmF0aXZlIERP
TSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZl
bnQuCi0gICAgLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKCkgY2hlY2sgaGVyZSBiZWNhdXNl
IElFNi83IGZhaWxzIHRoYXQgdGVzdC4KLSAgICAvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMg
b24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApCi0gICAg
aWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSAp
IHsKLQotICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxs
IGl0cyBGT08oKSBtZXRob2QKLSAgICB0bXAgPSBlbGVtWyBvbnR5cGUgXTsKLQotICAgIGlmICgg
dG1wICkgewotICAgIGVsZW1bIG9udHlwZSBdID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBQcmV2
ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnVi
YmxlZCBpdCBhYm92ZQotICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwotICAgIHRy
eSB7Ci0gICAgZWxlbVsgdHlwZSBdKCk7Ci0gICAgfSBjYXRjaCAoIGUgKSB7Ci0gICAgLy8gSUU8
OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOCkKLSAg
ICAvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3aW5YUCBJRTggbmF0aXZlLCBub3QgSUU5IGluIElF
OCBtb2RlCi0gICAgfQotICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7Ci0K
LSAgICBpZiAoIHRtcCApIHsKLSAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsKLSAgICB9Ci0gICAg
fQotICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXZlbnQucmVzdWx0OwotICAgIH0sCi0KLSAg
ICBkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewotCi0gICAgLy8gTWFrZSBhIHdyaXRhYmxl
IGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0Ci0gICAgZXZlbnQgPSBq
UXVlcnkuZXZlbnQuZml4KCBldmVudCApOwotCi0gICAgdmFyIGksIHJldCwgaGFuZGxlT2JqLCBt
YXRjaGVkLCBqLAotICAgIGhhbmRsZXJRdWV1ZSA9IFtdLAotICAgIGFyZ3MgPSBjb3JlX3NsaWNl
LmNhbGwoIGFyZ3VtZW50cyApLAotICAgIGhhbmRsZXJzID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMs
ICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAotICAgIHNwZWNpYWwgPSBq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9OwotCi0gICAgLy8gVXNlIHRo
ZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUg
ZXZlbnQKLSAgICBhcmdzWzBdID0gZXZlbnQ7Ci0gICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0
aGlzOwotCi0gICAgLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0
eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAotICAgIGlmICggc3BlY2lhbC5wcmVEaXNw
YXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNl
ICkgewotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKLSAg
ICBoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQs
IGhhbmRsZXJzICk7Ci0KLSAgICAvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50
IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1cwotICAgIGkgPSAwOwotICAgIHdoaWxlICgg
KG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0
b3BwZWQoKSApIHsKLSAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOwotCi0g
ICAgaiA9IDA7Ci0gICAgd2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisr
IF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewotCi0gICAg
Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgot
ICAgIC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGlu
IHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgotICAgIGlmICgg
IWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2Jq
Lm5hbWVzcGFjZSApICkgewotCi0gICAgZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwotICAg
IGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKLQotICAgIHJldCA9ICggKGpRdWVyeS5ldmVu
dC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9i
ai5oYW5kbGVyICkKLSAgICAuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOwotCi0gICAgaWYg
KCByZXQgIT09IHVuZGVmaW5lZCApIHsKLSAgICBpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09
PSBmYWxzZSApIHsKLSAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgIGV2ZW50LnN0b3BQ
cm9wYWdhdGlvbigpOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlCi0gICAgaWYg
KCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsKLSAgICBzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxs
KCB0aGlzLCBldmVudCApOwotICAgIH0KLQotICAgIHJldHVybiBldmVudC5yZXN1bHQ7Ci0gICAg
fSwKLQotICAgIGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkgewotICAgIHZh
ciBzZWwsIGhhbmRsZU9iaiwgbWF0Y2hlcywgaSwKLSAgICBoYW5kbGVyUXVldWUgPSBbXSwKLSAg
ICBkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKLSAgICBjdXIgPSBldmVu
dC50YXJnZXQ7Ci0KLSAgICAvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzCi0gICAgLy8gQmxhY2st
aG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MCkKLSAgICAvLyBBdm9pZCBub24t
bGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKLSAgICBpZiAoIGRlbGVnYXRl
Q291bnQgJiYgY3VyLm5vZGVUeXBlICYmICghZXZlbnQuYnV0dG9uIHx8IGV2ZW50LnR5cGUgIT09
ICJjbGljayIpICkgewotCi0gICAgZm9yICggOyBjdXIgIT0gdGhpczsgY3VyID0gY3VyLnBhcmVu
dE5vZGUgfHwgdGhpcyApIHsKLQotICAgIC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEz
MjA4KQotICAgIC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgj
NjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQotICAgIGlmICggY3VyLm5vZGVUeXBlID09PSAx
ICYmIChjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7
Ci0gICAgbWF0Y2hlcyA9IFtdOwotICAgIGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsg
aSsrICkgewotICAgIGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07Ci0KLSAgICAvLyBEb24ndCBj
b25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKQotICAgIHNl
bCA9IGhhbmRsZU9iai5zZWxlY3RvciArICIgIjsKLQotICAgIGlmICggbWF0Y2hlc1sgc2VsIF0g
PT09IHVuZGVmaW5lZCApIHsKLSAgICBtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0Nv
bnRleHQgPwotICAgIGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgotICAg
IGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7Ci0gICAgfQot
ICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7Ci0gICAgbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmog
KTsKLSAgICB9Ci0gICAgfQotICAgIGlmICggbWF0Y2hlcy5sZW5ndGggKSB7Ci0gICAgaGFuZGxl
clF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pOwotICAgIH0KLSAg
ICB9Ci0gICAgfQotICAgIH0KLQotICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1i
b3VuZCkgaGFuZGxlcnMKLSAgICBpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGgg
KSB7Ci0gICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxl
cnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaGFuZGxl
clF1ZXVlOwotICAgIH0sCi0KLSAgICBmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICBpZiAo
IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgewotICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0K
LSAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5v
cm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKLSAgICB2YXIgaSwgcHJvcCwgY29weSwKLSAgICB0eXBl
ID0gZXZlbnQudHlwZSwKLSAgICBvcmlnaW5hbEV2ZW50ID0gZXZlbnQsCi0gICAgZml4SG9vayA9
IHRoaXMuZml4SG9va3NbIHR5cGUgXTsKLQotICAgIGlmICggIWZpeEhvb2sgKSB7Ci0gICAgdGhp
cy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9Ci0gICAgcm1vdXNlRXZlbnQudGVzdCggdHlw
ZSApID8gdGhpcy5tb3VzZUhvb2tzIDoKLSAgICBya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhp
cy5rZXlIb29rcyA6Ci0gICAge307Ci0gICAgfQotICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8g
dGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7Ci0KLSAgICBl
dmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKLQotICAgIGkgPSBjb3B5
Lmxlbmd0aDsKLSAgICB3aGlsZSAoIGktLSApIHsKLSAgICBwcm9wID0gY29weVsgaSBdOwotICAg
IGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07Ci0gICAgfQotCi0gICAgLy8g
U3VwcG9ydDogSUU8OQotICAgIC8vIEZpeCB0YXJnZXQgcHJvcGVydHkgKCMxOTI1KQotICAgIGlm
ICggIWV2ZW50LnRhcmdldCApIHsKLSAgICBldmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNy
Y0VsZW1lbnQgfHwgZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLy8gU3VwcG9ydDogQ2hyb21lIDIz
KywgU2FmYXJpPwotICAgIC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0
LCAjMTMxNDMpCi0gICAgaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7Ci0gICAg
ZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7Ci0gICAgfQotCi0gICAgLy8g
U3VwcG9ydDogSUU8OQotICAgIC8vIEZvciBtb3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5PT1mYWxz
ZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgsICMxMTMyOCkKLSAgICBldmVudC5tZXRhS2V5ID0g
ISFldmVudC5tZXRhS2V5OwotCi0gICAgcmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5m
aWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKLSAgICB9LAotCi0gICAgLy8g
SW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZl
bnQKLSAgICBwcm9wczogImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50
VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0
aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSwKLQotICAgIGZpeEhvb2tzOiB7fSwKLQot
ICAgIGtleUhvb2tzOiB7Ci0gICAgcHJvcHM6ICJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5z
cGxpdCgiICIpLAotICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKLQot
ICAgIC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cwotICAgIGlmICggZXZlbnQud2hpY2ggPT0g
bnVsbCApIHsKLSAgICBldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBv
cmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7Ci0gICAgfQotCi0gICAgcmV0dXJu
IGV2ZW50OwotICAgIH0KLSAgICB9LAotCi0gICAgbW91c2VIb29rczogewotICAgIHByb3BzOiAi
YnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0
WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLAotICAg
IGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKLSAgICB2YXIgYm9keSwgZXZl
bnREb2MsIGRvYywKLSAgICBidXR0b24gPSBvcmlnaW5hbC5idXR0b24sCi0gICAgZnJvbUVsZW1l
bnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDsKLQotICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlm
IG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKLSAgICBpZiAoIGV2ZW50LnBhZ2VYID09
IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkgewotICAgIGV2ZW50RG9jID0gZXZl
bnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7Ci0gICAgZG9jID0gZXZlbnREb2Mu
ZG9jdW1lbnRFbGVtZW50OwotICAgIGJvZHkgPSBldmVudERvYy5ib2R5OwotCi0gICAgZXZlbnQu
cGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9k
eSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwg
Ym9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOwotICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2lu
YWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3Jv
bGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5j
bGllbnRUb3AgIHx8IDAgKTsKLSAgICB9Ci0KLSAgICAvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYg
bmVjZXNzYXJ5Ci0gICAgaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBmcm9tRWxlbWVudCAp
IHsKLSAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdl
dCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZyb21FbGVtZW50OwotICAgIH0KLQotICAgIC8vIEFk
ZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQK
LSAgICAvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAot
ICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgewotICAgIGV2
ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRv
biAmIDQgPyAyIDogMCApICkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQot
ICAgIH0sCi0KLSAgICBzcGVjaWFsOiB7Ci0gICAgbG9hZDogewotICAgIC8vIFByZXZlbnQgdHJp
Z2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKLSAg
ICBub0J1YmJsZTogdHJ1ZQotICAgIH0sCi0gICAgY2xpY2s6IHsKLSAgICAvLyBGb3IgY2hlY2ti
b3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAotICAg
IHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAi
aW5wdXQiICkgJiYgdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgKSB7Ci0g
ICAgdGhpcy5jbGljaygpOwotICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgfQotICAgIH0s
Ci0gICAgZm9jdXM6IHsKLSAgICAvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBi
bHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKLSAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsK
LSAgICBpZiAoIHRoaXMgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5mb2N1cyAp
IHsKLSAgICB0cnkgewotICAgIHRoaXMuZm9jdXMoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fSBjYXRjaCAoIGUgKSB7Ci0gICAgLy8gU3VwcG9ydDogSUU8OQotICAgIC8vIElmIHdlIGVycm9y
IG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NiwgIzEyNTE4KSwKLSAgICAvLyBsZXQg
LnRyaWdnZXIoKSBydW4gdGhlIGhhbmRsZXJzCi0gICAgfQotICAgIH0KLSAgICB9LAotICAgIGRl
bGVnYXRlVHlwZTogImZvY3VzaW4iCi0gICAgfSwKLSAgICBibHVyOiB7Ci0gICAgdHJpZ2dlcjog
ZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCB0aGlzID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYm
IHRoaXMuYmx1ciApIHsKLSAgICB0aGlzLmJsdXIoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIH0sCi0gICAgZGVsZWdhdGVUeXBlOiAiZm9jdXNvdXQiCi0gICAgfSwKLQotICAgIGJl
Zm9yZXVubG9hZDogewotICAgIHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewotCi0g
ICAgLy8gRXZlbiB3aGVuIHJldHVyblZhbHVlIGVxdWFscyB0byB1bmRlZmluZWQgRmlyZWZveCB3
aWxsIHN0aWxsIHNob3cgYWxlcnQKLSAgICBpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVk
ICkgewotICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7
Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfSwKLQotICAgIHNpbXVsYXRlOiBmdW5jdGlvbigg
dHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHsKLSAgICAvLyBQaWdneWJhY2sgb24gYSBkb25v
ciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCi0gICAgLy8gRmFrZSBvcmlnaW5h
bEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCi0gICAg
Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBv
biB0aGUgZG9ub3IuCi0gICAgdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAotICAgIG5ldyBqUXVlcnku
RXZlbnQoKSwKLSAgICBldmVudCwKLSAgICB7IHR5cGU6IHR5cGUsCi0gICAgaXNTaW11bGF0ZWQ6
IHRydWUsCi0gICAgb3JpZ2luYWxFdmVudDoge30KLSAgICB9Ci0gICAgKTsKLSAgICBpZiAoIGJ1
YmJsZSApIHsKLSAgICBqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwotICAg
IH0gZWxzZSB7Ci0gICAgalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTsKLSAg
ICB9Ci0gICAgaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewotICAgIGV2ZW50LnByZXZl
bnREZWZhdWx0KCk7Ci0gICAgfQotICAgIH0KLX07Ci0KLWpRdWVyeS5yZW1vdmVFdmVudCA9IGRv
Y3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPwotICAgIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBo
YW5kbGUgKSB7Ci0gICAgaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7Ci0gICAgZWxl
bS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7Ci0gICAgfQotICAg
IH0gOgotICAgIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7Ci0gICAgdmFyIG5hbWUg
PSAib24iICsgdHlwZTsKLQotICAgIGlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKLQotICAgIC8v
ICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMg
aW4gSUU2LTgKLSAgICAvLyBkZXRhY2hFdmVudCBuZWVkZWQgcHJvcGVydHkgb24gZWxlbWVudCwg
YnkgbmFtZSBvZiB0aGF0IGV2ZW50LCB0byBwcm9wZXJseSBleHBvc2UgaXQgdG8gR0MKLSAgICBp
ZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IGNvcmVfc3RydW5kZWZpbmVkICkgewotICAgIGVs
ZW1bIG5hbWUgXSA9IG51bGw7Ci0gICAgfQotCi0gICAgZWxlbS5kZXRhY2hFdmVudCggbmFtZSwg
aGFuZGxlICk7Ci0gICAgfQotICAgIH07Ci0KLWpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMs
IHByb3BzICkgewotICAgIC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycg
a2V5d29yZAotICAgIGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKLSAg
ICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwotICAgIH0KLQotICAgIC8v
IEV2ZW50IG9iamVjdAotICAgIGlmICggc3JjICYmIHNyYy50eXBlICkgewotICAgIHRoaXMub3Jp
Z2luYWxFdmVudCA9IHNyYzsKLSAgICB0aGlzLnR5cGUgPSBzcmMudHlwZTsKLQotICAgIC8vIEV2
ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJl
dmVudGVkCi0gICAgLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3Qg
dGhlIGNvcnJlY3QgdmFsdWUuCi0gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoIHNyYy5k
ZWZhdWx0UHJldmVudGVkIHx8IHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgfHwKLSAgICBzcmMu
Z2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkgKSA/IHJldHVyblRy
dWUgOiByZXR1cm5GYWxzZTsKLQotICAgIC8vIEV2ZW50IHR5cGUKLSAgICB9IGVsc2UgewotICAg
IHRoaXMudHlwZSA9IHNyYzsKLSAgICB9Ci0KLSAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRl
ZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdAotICAgIGlmICggcHJvcHMgKSB7Ci0g
ICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUg
YSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQotICAgIHRoaXMu
dGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwotCi0gICAg
Ly8gTWFyayBpdCBhcyBmaXhlZAotICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOwot
fTsKLQotLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmll
ZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi0vLyBodHRwOi8vd3d3LnczLm9y
Zy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5k
aW5nLmh0bWwKLWpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Ci0gICAgaXNEZWZhdWx0UHJldmVu
dGVkOiByZXR1cm5GYWxzZSwKLSAgICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Us
Ci0gICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAotCi0gICAg
cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2
ZW50OwotCi0gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOwotICAgIGlm
ICggIWUgKSB7Ci0gICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgLy8gR28gdGhyb3VnaCBldmVy
eSBrZXkgb24gdGhlIG9iamVjdCwKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAo
IGkgaW4gZWxlbXMgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNb
IGkgXSwgaSwgYXJnICk7CiAKLSAgICAvLyBJZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMsIHJ1biBp
dCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKLSAgICBpZiAoIGUucHJldmVudERlZmF1bHQgKSB7Ci0g
ICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVs
bCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goIHZhbHVlICk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAvLyBTdXBwb3J0OiBJRQot
ICAgIC8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmln
aW5hbCBldmVudCB0byBmYWxzZQotICAgIH0gZWxzZSB7Ci0gICAgZS5yZXR1cm5WYWx1ZSA9IGZh
bHNlOwotICAgIH0KKyAgICAgICAgLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworICAgICAg
ICByZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7CiAgICAgfSwKLSAgICBzdG9wUHJvcGFn
YXRpb246IGZ1bmN0aW9uKCkgewotICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwogCi0g
ICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7Ci0gICAgaWYgKCAhZSAp
IHsKLSAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMs
IHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKLSAgICBpZiAoIGUuc3RvcFByb3BhZ2F0aW9u
ICkgewotICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgfQorICAgIC8vIEEgZ2xvYmFsIEdV
SUQgY291bnRlciBmb3Igb2JqZWN0cworICAgIGd1aWQ6IDEsCiAKLSAgICAvLyBTdXBwb3J0OiBJ
RQotICAgIC8vIFNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBl
dmVudCB0byB0cnVlCi0gICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlOwotICAgIH0sCi0gICAgc3Rv
cEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmlzSW1tZWRpYXRl
UHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKLSAgICB0aGlzLnN0b3BQcm9wYWdhdGlv
bigpOwotICAgIH0KLX07CisgICAgLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0
aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CisgICAgLy8gYXJndW1lbnRzLgorICAgIHBy
b3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7CisgICAgICAgIHZhciB0bXAsIGFyZ3MsIHBy
b3h5OwogCi0vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVy
L291dCBhbmQgZXZlbnQtdGltZSBjaGVja3MKLWpRdWVyeS5lYWNoKHsKLSAgICBtb3VzZWVudGVy
OiAibW91c2VvdmVyIiwKLSAgICBtb3VzZWxlYXZlOiAibW91c2VvdXQiCi19LCBmdW5jdGlvbigg
b3JpZywgZml4ICkgewotICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7Ci0gICAg
ZGVsZWdhdGVUeXBlOiBmaXgsCi0gICAgYmluZFR5cGU6IGZpeCwKLQotICAgIGhhbmRsZTogZnVu
Y3Rpb24oIGV2ZW50ICkgewotICAgIHZhciByZXQsCi0gICAgdGFyZ2V0ID0gdGhpcywKLSAgICBy
ZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCwKLSAgICBoYW5kbGVPYmogPSBldmVudC5oYW5k
bGVPYmo7Ci0KLSAgICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYg
cmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCi0gICAgLy8gTkI6IE5vIHJlbGF0ZWRUYXJn
ZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKLSAgICBpZiAo
ICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFy
Z2V0LCByZWxhdGVkICkpICkgewotICAgIGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7
Ci0gICAgcmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwot
ICAgIGV2ZW50LnR5cGUgPSBmaXg7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAg
IH07Ci19KTsKKyAgICAgICAgaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7Cisg
ICAgICAgICAgICB0bXAgPSBmblsgY29udGV4dCBdOworICAgICAgICAgICAgY29udGV4dCA9IGZu
OworICAgICAgICAgICAgZm4gPSB0bXA7CisgICAgICAgIH0KIAotLy8gSUUgc3VibWl0IGRlbGVn
YXRpb24KLWlmICggIWpRdWVyeS5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMgKSB7CisgICAgICAgIC8v
IFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBz
cGVjCisgICAgICAgIC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0
IHJldHVybiB1bmRlZmluZWQuCisgICAgICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiAp
ICkgeworICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgfQogCi0gICAgalF1
ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0gewotICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAg
ICAvLyBPbmx5IG5lZWQgdGhpcyBmb3IgZGVsZWdhdGVkIGZvcm0gc3VibWl0IGV2ZW50cwotICAg
IGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKLSAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQorICAgICAgICAvLyBTaW11bGF0ZWQgYmluZAorICAgICAgICBhcmdzID0gc2xp
Y2UuY2FsbCggYXJndW1lbnRzLCAyICk7CisgICAgICAgIHByb3h5ID0gZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQo
IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKKyAgICAgICAgfTsKIAotICAgIC8vIExhenkt
YWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50aWFs
bHkgYmUgc3VibWl0dGVkCi0gICAgalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImNsaWNrLl9zdWJt
aXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkgewotICAgIC8vIE5vZGUgbmFtZSBj
aGVjayBhdm9pZHMgYSBWTUwtcmVsYXRlZCBjcmFzaCBpbiBJRSAoIzk4MDcpCi0gICAgdmFyIGVs
ZW0gPSBlLnRhcmdldCwKLSAgICBmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQi
ICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS5mb3JtIDogdW5k
ZWZpbmVkOwotICAgIGlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCAic3VibWl0QnVi
YmxlcyIgKSApIHsKLSAgICBqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAic3VibWl0Ll9zdWJtaXQi
LCBmdW5jdGlvbiggZXZlbnQgKSB7Ci0gICAgZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlOwot
ICAgIH0pOwotICAgIGpRdWVyeS5fZGF0YSggZm9ybSwgInN1Ym1pdEJ1YmJsZXMiLCB0cnVlICk7
Ci0gICAgfQotICAgIH0pOwotICAgIC8vIHJldHVybiB1bmRlZmluZWQgc2luY2Ugd2UgZG9uJ3Qg
bmVlZCBhbiBldmVudCBsaXN0ZW5lcgotICAgIH0sCisgICAgICAgIC8vIFNldCB0aGUgZ3VpZCBv
ZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBj
YW4gYmUgcmVtb3ZlZAorICAgICAgICBwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwg
alF1ZXJ5Lmd1aWQrKzsKIAotICAgIHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewot
ICAgIC8vIElmIGZvcm0gd2FzIHN1Ym1pdHRlZCBieSB0aGUgdXNlciwgYnViYmxlIHRoZSBldmVu
dCB1cCB0aGUgdHJlZQotICAgIGlmICggZXZlbnQuX3N1Ym1pdF9idWJibGUgKSB7Ci0gICAgZGVs
ZXRlIGV2ZW50Ll9zdWJtaXRfYnViYmxlOwotICAgIGlmICggdGhpcy5wYXJlbnROb2RlICYmICFl
dmVudC5pc1RyaWdnZXIgKSB7Ci0gICAgalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAic3VibWl0Iiwg
dGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApOwotICAgIH0KLSAgICB9CisgICAgICAgIHJl
dHVybiBwcm94eTsKICAgICB9LAogCi0gICAgdGVhcmRvd246IGZ1bmN0aW9uKCkgewotICAgIC8v
IE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzCi0gICAgaWYg
KCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJmb3JtIiApICkgewotICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgZGVsZWdhdGVkIGhhbmRsZXJzOyBjbGVhbkRhdGEgZXZl
bnR1YWxseSByZWFwcyBzdWJtaXQgaGFuZGxlcnMgYXR0YWNoZWQgYWJvdmUKLSAgICBqUXVlcnku
ZXZlbnQucmVtb3ZlKCB0aGlzLCAiLl9zdWJtaXQiICk7Ci0gICAgfQotICAgIH07Ci19Ci0KLS8v
IElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXgKLWlmICggIWpRdWVy
eS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CisgICAgbm93OiBEYXRlLm5vdywKIAotICAgIGpR
dWVyeS5ldmVudC5zcGVjaWFsLmNoYW5nZSA9IHsKLQotICAgIHNldHVwOiBmdW5jdGlvbigpIHsK
LQotICAgIGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7Ci0gICAgLy8g
SUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdn
ZXIgaXQgb24gY2xpY2sKLSAgICAvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJs
dXItY2hhbmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS4KLSAgICAvLyBUaGlzIHN0aWxsIGZp
cmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCi0g
ICAgaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8i
ICkgewotICAgIGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdl
IiwgZnVuY3Rpb24oIGV2ZW50ICkgewotICAgIGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9w
ZXJ0eU5hbWUgPT09ICJjaGVja2VkIiApIHsKLSAgICB0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVl
OwotICAgIH0KLSAgICB9KTsKLSAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2No
YW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICBpZiAoIHRoaXMuX2p1c3RfY2hhbmdlZCAm
JiAhZXZlbnQuaXNUcmlnZ2VyICkgewotICAgIHRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOwot
ICAgIH0KLSAgICAvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgj
MTE1MDApCi0gICAgalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQs
IHRydWUgKTsKLSAgICB9KTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAv
LyBEZWxlZ2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFu
dCBpbnB1dHMKLSAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiYmVmb3JlYWN0aXZhdGUuX2No
YW5nZSIsIGZ1bmN0aW9uKCBlICkgewotICAgIHZhciBlbGVtID0gZS50YXJnZXQ7CisgICAgLy8g
alF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0
YWNoIHRoZWlyCisgICAgLy8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC4K
KyAgICBzdXBwb3J0OiBzdXBwb3J0Cit9KTsKIAotICAgIGlmICggcmZvcm1FbGVtcy50ZXN0KCBl
bGVtLm5vZGVOYW1lICkgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMiICkg
KSB7Ci0gICAgalF1ZXJ5LmV2ZW50LmFkZCggZWxlbSwgImNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rp
b24oIGV2ZW50ICkgewotICAgIGlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1NpbXVs
YXRlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewotICAgIGpRdWVyeS5ldmVudC5zaW11bGF0ZSgg
ImNoYW5nZSIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsKLSAgICB9Ci0gICAgfSk7
Ci0gICAgalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiY2hhbmdlQnViYmxlcyIsIHRydWUgKTsKLSAgICB9
Ci0gICAgfSk7Ci0gICAgfSwKKy8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcAoralF1ZXJ5
LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBP
YmplY3QgRXJyb3IiLnNwbGl0KCIgIiksIGZ1bmN0aW9uKGksIG5hbWUpIHsKKyAgICBjbGFzczJ0
eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOworfSk7
CiAKLSAgICBoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICB2YXIgZWxlbSA9IGV2ZW50
LnRhcmdldDsKK2Z1bmN0aW9uIGlzQXJyYXlsaWtlKCBvYmogKSB7CisgICAgdmFyIGxlbmd0aCA9
IG9iai5sZW5ndGgsCisgICAgICAgIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CiAKLSAgICAv
LyBTd2FsbG93IG5hdGl2ZSBjaGFuZ2UgZXZlbnRzIGZyb20gY2hlY2tib3gvcmFkaW8sIHdlIGFs
cmVhZHkgdHJpZ2dlcmVkIHRoZW0gYWJvdmUKLSAgICBpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZl
bnQuaXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09ICJyYWRp
byIgJiYgZWxlbS50eXBlICE9PSAiY2hlY2tib3giKSApIHsKLSAgICByZXR1cm4gZXZlbnQuaGFu
ZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworICAgIGlmICggdHlwZSA9
PT0gImZ1bmN0aW9uIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgeworICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgfQotICAgIH0sCiAKLSAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7Ci0g
ICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fY2hhbmdlIiApOwotCi0gICAgcmV0dXJu
ICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKKyAgICBpZiAoIG9iai5ub2RlVHlw
ZSA9PT0gMSAmJiBsZW5ndGggKSB7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICB9
OwotfQotCi0vLyBDcmVhdGUgImJ1YmJsaW5nIiBmb2N1cyBhbmQgYmx1ciBldmVudHMKLWlmICgg
IWpRdWVyeS5zdXBwb3J0LmZvY3VzaW5CdWJibGVzICkgewotICAgIGpRdWVyeS5lYWNoKHsgZm9j
dXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkg
ewotCi0gICAgLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVv
bmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAotICAgIHZhciBhdHRhY2hlcyA9IDAsCi0gICAgaGFu
ZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICBqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZp
eCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7Ci0gICAg
fTsKIAotICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKLSAgICBzZXR1cDogZnVu
Y3Rpb24oKSB7Ci0gICAgaWYgKCBhdHRhY2hlcysrID09PSAwICkgewotICAgIGRvY3VtZW50LmFk
ZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKLSAgICB9Ci0gICAgfSwKLSAg
ICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAtLWF0dGFjaGVzID09PSAwICkgewot
ICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsK
LSAgICB9Ci0gICAgfQotICAgIH07Ci0gICAgfSk7CisgICAgcmV0dXJuIHR5cGUgPT09ICJhcnJh
eSIgfHwgbGVuZ3RoID09PSAwIHx8CisgICAgICAgIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIi
ICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqOwogfQotCi1qUXVlcnkuZm4u
ZXh0ZW5kKHsKLQotICAgIG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwg
LypJTlRFUk5BTCovIG9uZSApIHsKLSAgICB2YXIgdHlwZSwgb3JpZ0ZuOwotCi0gICAgLy8gVHlw
ZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCi0gICAgaWYgKCB0eXBlb2YgdHlwZXMg
PT09ICJvYmplY3QiICkgewotICAgIC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSAp
Ci0gICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewotICAgIC8vICggdHlw
ZXMtT2JqZWN0LCBkYXRhICkKLSAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKLSAgICBzZWxl
Y3RvciA9IHVuZGVmaW5lZDsKLSAgICB9Ci0gICAgZm9yICggdHlwZSBpbiB0eXBlcyApIHsKLSAg
ICB0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7Ci0g
ICAgfQotICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIGlmICggZGF0YSA9PSBudWxsICYm
IGZuID09IG51bGwgKSB7Ci0gICAgLy8gKCB0eXBlcywgZm4gKQotICAgIGZuID0gc2VsZWN0b3I7
Ci0gICAgZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOwotICAgIH0gZWxzZSBpZiAoIGZuID09
IG51bGwgKSB7Ci0gICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewotICAg
IC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCi0gICAgZm4gPSBkYXRhOwotICAgIGRhdGEgPSB1
bmRlZmluZWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAvLyAoIHR5cGVzLCBkYXRhLCBmbiApCi0gICAg
Zm4gPSBkYXRhOwotICAgIGRhdGEgPSBzZWxlY3RvcjsKLSAgICBzZWxlY3RvciA9IHVuZGVmaW5l
ZDsKLSAgICB9Ci0gICAgfQotICAgIGlmICggZm4gPT09IGZhbHNlICkgewotICAgIGZuID0gcmV0
dXJuRmFsc2U7Ci0gICAgfSBlbHNlIGlmICggIWZuICkgewotICAgIHJldHVybiB0aGlzOwotICAg
IH0KLQotICAgIGlmICggb25lID09PSAxICkgewotICAgIG9yaWdGbiA9IGZuOwotICAgIGZuID0g
ZnVuY3Rpb24oIGV2ZW50ICkgewotICAgIC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBl
dmVudCBjb250YWlucyB0aGUgaW5mbwotICAgIGpRdWVyeSgpLm9mZiggZXZlbnQgKTsKLSAgICBy
ZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICB9OwotICAgIC8vIFVz
ZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCi0gICAgZm4uZ3Vp
ZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7Ci0gICAg
fQotICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewotICAgIGpRdWVyeS5ldmVudC5h
ZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKLSAgICB9KTsKLSAgICB9LAot
ICAgIG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Ci0gICAgcmV0
dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKLSAgICB9LAotICAg
IG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7Ci0gICAgdmFyIGhhbmRsZU9i
aiwgdHlwZTsKLSAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVz
LmhhbmRsZU9iaiApIHsKLSAgICAvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50
Ci0gICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOwotICAgIGpRdWVyeSggdHlwZXMuZGVs
ZWdhdGVUYXJnZXQgKS5vZmYoCi0gICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5v
cmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUs
Ci0gICAgaGFuZGxlT2JqLnNlbGVjdG9yLAotICAgIGhhbmRsZU9iai5oYW5kbGVyCi0gICAgKTsK
LSAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmpl
Y3QiICkgewotICAgIC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCi0gICAgZm9yICgg
dHlwZSBpbiB0eXBlcyApIHsKLSAgICB0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0
eXBlIF0gKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIGlmICggc2VsZWN0
b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsKLSAgICAv
LyAoIHR5cGVzIFssIGZuXSApCi0gICAgZm4gPSBzZWxlY3RvcjsKLSAgICBzZWxlY3RvciA9IHVu
ZGVmaW5lZDsKLSAgICB9Ci0gICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7Ci0gICAgZm4gPSByZXR1
cm5GYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICBq
UXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7Ci0gICAgfSk7
Ci0gICAgfSwKLQotICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7Ci0gICAg
cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOwotICAgIH0sCi0gICAgdW5i
aW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewotICAgIHJldHVybiB0aGlzLm9mZiggdHlwZXMs
IG51bGwsIGZuICk7Ci0gICAgfSwKLQotICAgIGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3Is
IHR5cGVzLCBkYXRhLCBmbiApIHsKLSAgICByZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9y
LCBkYXRhLCBmbiApOwotICAgIH0sCi0gICAgdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9y
LCB0eXBlcywgZm4gKSB7Ci0gICAgLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBl
cyBbLCBmbl0gKQotICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYo
IHNlbGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIsIGZu
ICk7Ci0gICAgfSwKLQotICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewotICAg
IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgalF1ZXJ5LmV2ZW50LnRyaWdnZXIo
IHR5cGUsIGRhdGEsIHRoaXMgKTsKLSAgICB9KTsKLSAgICB9LAotICAgIHRyaWdnZXJIYW5kbGVy
OiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKLSAgICB2YXIgZWxlbSA9IHRoaXNbMF07Ci0gICAg
aWYgKCBlbGVtICkgewotICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0
YSwgZWxlbSwgdHJ1ZSApOwotICAgIH0KLSAgICB9Ci19KTsKK3ZhciBTaXp6bGUgPQogLyohCi0g
KiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQotICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZv
dW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwotICogUmVsZWFzZWQgdW5kZXIgdGhlIE1J
VCBsaWNlbnNlCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2MS4xMC4xNgogICogaHR0
cDovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlv
biwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlU
IGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDE0
LTAxLTEzCiAgKi8KLShmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CisoZnVuY3Rpb24o
IHdpbmRvdyApIHsKIAogdmFyIGksCi0gICAgY2FjaGVkcnVucywKKyAgICBzdXBwb3J0LAogICAg
IEV4cHIsCiAgICAgZ2V0VGV4dCwKICAgICBpc1hNTCwKICAgICBjb21waWxlLAotICAgIGhhc0R1
cGxpY2F0ZSwKICAgICBvdXRlcm1vc3RDb250ZXh0LAorICAgIHNvcnRJbnB1dCwKKyAgICBoYXNE
dXBsaWNhdGUsCiAKICAgICAvLyBMb2NhbCBkb2N1bWVudCB2YXJzCiAgICAgc2V0RG9jdW1lbnQs
CiAgICAgZG9jdW1lbnQsCiAgICAgZG9jRWxlbSwKLSAgICBkb2N1bWVudElzWE1MLAorICAgIGRv
Y3VtZW50SXNIVE1MLAogICAgIHJidWdneVFTQSwKICAgICByYnVnZ3lNYXRjaGVzLAogICAgIG1h
dGNoZXMsCiAgICAgY29udGFpbnMsCi0gICAgc29ydE9yZGVyLAogCiAgICAgLy8gSW5zdGFuY2Ut
c3BlY2lmaWMgZGF0YQogICAgIGV4cGFuZG8gPSAic2l6emxlIiArIC0obmV3IERhdGUoKSksCiAg
ICAgcHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LAotICAgIHN1cHBvcnQgPSB7fSwKICAg
ICBkaXJydW5zID0gMCwKICAgICBkb25lID0gMCwKICAgICBjbGFzc0NhY2hlID0gY3JlYXRlQ2Fj
aGUoKSwKICAgICB0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKICAgICBjb21waWxlckNhY2hl
ID0gY3JlYXRlQ2FjaGUoKSwKKyAgICBzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKyAg
ICAgICAgaWYgKCBhID09PSBiICkgeworICAgICAgICAgICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9LAogCiAgICAgLy8gR2VuZXJhbC1w
dXJwb3NlIGNvbnN0YW50cwogICAgIHN0cnVuZGVmaW5lZCA9IHR5cGVvZiB1bmRlZmluZWQsCiAg
ICAgTUFYX05FR0FUSVZFID0gMSA8PCAzMSwKIAotICAgIC8vIEFycmF5IG1ldGhvZHMKKyAgICAv
LyBJbnN0YW5jZSBtZXRob2RzCisgICAgaGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKICAg
ICBhcnIgPSBbXSwKICAgICBwb3AgPSBhcnIucG9wLAorICAgIHB1c2hfbmF0aXZlID0gYXJyLnB1
c2gsCiAgICAgcHVzaCA9IGFyci5wdXNoLAogICAgIHNsaWNlID0gYXJyLnNsaWNlLAogICAgIC8v
IFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBpZiB3ZSBjYW4ndCB1c2UgYSBuYXRpdmUgb25l
CiAgICAgaW5kZXhPZiA9IGFyci5pbmRleE9mIHx8IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHZh
ciBpID0gMCwKLSAgICBsZW4gPSB0aGlzLmxlbmd0aDsKLSAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKLSAgICBpZiAoIHRoaXNbaV0gPT09IGVsZW0gKSB7Ci0gICAgcmV0dXJuIGk7Ci0gICAg
fQotICAgIH0KLSAgICByZXR1cm4gLTE7CisgICAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICAg
IGxlbiA9IHRoaXMubGVuZ3RoOworICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAg
ICAgICAgICAgIGlmICggdGhpc1tpXSA9PT0gZWxlbSApIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CiAgICAg
fSwKIAorICAgIGJvb2xlYW5zID0gImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1
dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxl
fG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIiwKIAogICAgIC8vIFJlZ3VsYXIgZXhwcmVz
c2lvbnMKIApAQCAtMzc1Nyw5ICs2MzUsOCBAQCB2YXIgaSwKICAgICBpZGVudGlmaWVyID0gY2hh
cmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyMiICksCiAKICAgICAvLyBBY2NlcHRhYmxl
IG9wZXJhdG9ycyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxl
Y3RvcnMKLSAgICBvcGVyYXRvcnMgPSAiKFsqXiR8IX5dPz0pIiwKICAgICBhdHRyaWJ1dGVzID0g
IlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICsgd2hp
dGVzcGFjZSArCi0gICAgIiooPzoiICsgb3BlcmF0b3JzICsgd2hpdGVzcGFjZSArICIqKD86KFsn
XCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlkZW50aWZpZXIgKyAiKXwpfCkiICsg
d2hpdGVzcGFjZSArICIqXFxdIiwKKyAgICAgICAgIiooPzooWypeJHwhfl0/PSkiICsgd2hpdGVz
cGFjZSArICIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlkZW50aWZp
ZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFjZSArICIqXFxdIiwKIAogICAgIC8vIFByZWZlciBhcmd1
bWVudHMgcXVvdGVkLAogICAgIC8vICAgdGhlbiBub3QgY29udGFpbmluZyBwc2V1ZG9zL2JyYWNr
ZXRzLApAQCAtMzc3Myw5MyArNjUwLDIxMiBAQCB2YXIgaSwKICAgICBydHJpbSA9IG5ldyBSZWdF
eHAoICJeIiArIHdoaXRlc3BhY2UgKyAiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIiArIHdo
aXRlc3BhY2UgKyAiKyQiLCAiZyIgKSwKIAogICAgIHJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiAr
IHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAotICAgIHJjb21iaW5hdG9y
cyA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKihbXFx4MjBcXHRcXHJcXG5cXGY+
K35dKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCisgICAgcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4
cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hp
dGVzcGFjZSArICIqIiApLAorCisgICAgcmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoICI9
IiArIHdoaXRlc3BhY2UgKyAiKihbXlxcXSdcIl0qPykiICsgd2hpdGVzcGFjZSArICIqXFxdIiwg
ImciICksCisKICAgICBycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAogICAgIHJpZGVu
dGlmaWVyID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAogCiAgICAgbWF0
Y2hFeHByID0gewotICAgICJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2Rp
bmcgKyAiKSIgKSwKLSAgICAiQ0xBU1MiOiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVy
RW5jb2RpbmcgKyAiKSIgKSwKLSAgICAiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wi
XT8oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksCi0gICAgIlRBRyI6IG5l
dyBSZWdFeHAoICJeKCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSAr
ICIpIiApLAotICAgICJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAotICAg
ICJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCi0gICAgIkNISUxEIjogbmV3
IFJlZ0V4cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBl
KSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsKLSAgICAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58
KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwotICAgICIqKFxc
ZCspfCkpIiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpIiwgImkiICksCi0gICAgLy8gRm9yIHVzZSBp
biBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpCi0gICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBP
UyBtYXRjaGluZyBpbiBgc2VsZWN0YAotICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAi
XiIgKyB3aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxs
YXN0KSg/OlxcKCIgKwotICAgIHdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0
ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQorICAgICAgICAiSUQiOiBuZXcgUmVn
RXhwKCAiXiMoIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCisgICAgICAgICJDTEFTUyI6
IG5ldyBSZWdFeHAoICJeXFwuKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiApLAorICAgICAg
ICAiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoICJ3
IiwgIncqIiApICsgIikiICksCisgICAgICAgICJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0
cmlidXRlcyApLAorICAgICAgICAiUFNFVURPIjogbmV3IFJlZ0V4cCggIl4iICsgcHNldWRvcyAp
LAorICAgICAgICAiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxu
dGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKworICAgICAgICAg
ICAgIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiICsgd2hpdGVzcGFjZSArICIqKD86KFsr
LV18KSIgKyB3aGl0ZXNwYWNlICsKKyAgICAgICAgICAgICIqKFxcZCspfCkpIiArIHdoaXRlc3Bh
Y2UgKyAiKlxcKXwpIiwgImkiICksCisgICAgICAgICJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoi
ICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKKyAgICAgICAgLy8gRm9yIHVzZSBpbiBsaWJyYXJp
ZXMgaW1wbGVtZW50aW5nIC5pcygpCisgICAgICAgIC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0
Y2hpbmcgaW4gYHNlbGVjdGAKKyAgICAgICAgIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJe
IiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxh
c3QpKD86XFwoIiArCisgICAgICAgICAgICB3aGl0ZXNwYWNlICsgIiooKD86LVxcZCk/XFxkKiki
ICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1bXi1dfCQpIiwgImkiICkKICAgICB9LAogCi0gICAg
cnNpYmxpbmcgPSAvW1x4MjBcdFxyXG5cZl0qWyt+XS8sCisgICAgcmlucHV0cyA9IC9eKD86aW5w
dXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksCisgICAgcmhlYWRlciA9IC9eaFxkJC9pLAog
Ci0gICAgcm5hdGl2ZSA9IC9eW157XStce1xzKlxbbmF0aXZlIGNvZGUvLAorICAgIHJuYXRpdmUg
PSAvXltee10rXHtccypcW25hdGl2ZSBcdy8sCiAKICAgICAvLyBFYXNpbHktcGFyc2VhYmxlL3Jl
dHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnMKICAgICBycXVpY2tFeHByID0g
L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLywKIAotICAgIHJpbnB1dHMgPSAvXig/
OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAotICAgIHJoZWFkZXIgPSAvXmhcZCQv
aSwKLQorICAgIHJzaWJsaW5nID0gL1srfl0vLAogICAgIHJlc2NhcGUgPSAvJ3xcXC9nLAotICAg
IHJhdHRyaWJ1dGVRdW90ZXMgPSAvXD1bXHgyMFx0XHJcblxmXSooW14nIlxdXSopW1x4MjBcdFxy
XG5cZl0qXF0vZywKIAogICAgIC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NT
UzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKLSAgICBydW5lc2NhcGUgPSAvXFwo
W1xkYS1mQS1GXXsxLDZ9W1x4MjBcdFxyXG5cZl0/fC4pL2csCi0gICAgZnVuZXNjYXBlID0gZnVu
Y3Rpb24oIF8sIGVzY2FwZWQgKSB7Ci0gICAgdmFyIGhpZ2ggPSAiMHgiICsgZXNjYXBlZCAtIDB4
MTAwMDA7Ci0gICAgLy8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnQKLSAgICByZXR1cm4gaGlnaCAh
PT0gaGlnaCA/Ci0gICAgZXNjYXBlZCA6Ci0gICAgLy8gQk1QIGNvZGVwb2ludAotICAgIGhpZ2gg
PCAwID8KLSAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKLSAgICAv
LyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcikKLSAgICBTdHJp
bmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERD
MDAgKTsKKyAgICBydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxcXChbXFxkYS1mXXsxLDZ9IiAr
IHdoaXRlc3BhY2UgKyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwuKSIsICJpZyIgKSwKKyAgICBm
dW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7Cisg
ICAgICAgIHZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOworICAgICAgICAvLyBO
YU4gbWVhbnMgbm9uLWNvZGVwb2ludAorICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94CisgICAg
ICAgIC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIw
eCIKKyAgICAgICAgcmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgPwor
ICAgICAgICAgICAgZXNjYXBlZCA6CisgICAgICAgICAgICBoaWdoIDwgMCA/CisgICAgICAgICAg
ICAgICAgLy8gQk1QIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNv
ZGUoIGhpZ2ggKyAweDEwMDAwICkgOgorICAgICAgICAgICAgICAgIC8vIFN1cHBsZW1lbnRhbCBQ
bGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQorICAgICAgICAgICAgICAgIFN0cmluZy5m
cm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCAp
OwogICAgIH07CiAKLS8vIFVzZSBhIHN0cmlwcGVkLWRvd24gc2xpY2UgaWYgd2UgY2FuJ3QgdXNl
IGEgbmF0aXZlIG9uZQorLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkK
IHRyeSB7Ci0gICAgc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmRvY3VtZW50RWxlbWVudC5jaGls
ZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7CisgICAgcHVzaC5hcHBseSgKKyAgICAgICAgKGFyciA9
IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAorICAgICAgICBwcmVmZXJy
ZWREb2MuY2hpbGROb2RlcworICAgICk7CisgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKKyAg
ICAvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5CisgICAgYXJyWyBwcmVmZXJy
ZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTsKIH0gY2F0Y2ggKCBlICkgewotICAg
IHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7Ci0gICAgdmFyIGVsZW0sCi0gICAgcmVzdWx0cyA9IFtd
OwotICAgIHdoaWxlICggKGVsZW0gPSB0aGlzW2krK10pICkgewotICAgIHJlc3VsdHMucHVzaCgg
ZWxlbSApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0czsKKyAgICBwdXNoID0geyBhcHBseTog
YXJyLmxlbmd0aCA/CisKKyAgICAgICAgLy8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGUKKyAg
ICAgICAgZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgeworICAgICAgICAgICAgcHVzaF9uYXRpdmUu
YXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CisgICAgICAgIH0gOgorCisgICAgICAg
IC8vIFN1cHBvcnQ6IElFPDkKKyAgICAgICAgLy8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseQor
ICAgICAgICBmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7CisgICAgICAgICAgICB2YXIgaiA9IHRh
cmdldC5sZW5ndGgsCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAvLyBDYW4n
dCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgKKyAgICAgICAgICAgIHdoaWxlICggKHRhcmdldFtqKytd
ID0gZWxzW2krK10pICkge30KKyAgICAgICAgICAgIHRhcmdldC5sZW5ndGggPSBqIC0gMTsKKyAg
ICAgICAgfQogICAgIH07CiB9CiAKLS8qKgotICogRm9yIGZlYXR1cmUgZGV0ZWN0aW9uCi0gKiBA
cGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gdGVzdCBmb3IgbmF0aXZlIHN1cHBv
cnQKLSAqLwotZnVuY3Rpb24gaXNOYXRpdmUoIGZuICkgewotICAgIHJldHVybiBybmF0aXZlLnRl
c3QoIGZuICsgIiIgKTsKK2Z1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3Vs
dHMsIHNlZWQgKSB7CisgICAgdmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSwKKyAgICAgICAg
Ly8gUVNBIHZhcnMKKyAgICAgICAgaSwgZ3JvdXBzLCBvbGQsIG5pZCwgbmV3Q29udGV4dCwgbmV3
U2VsZWN0b3I7CisKKyAgICBpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8
fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkgeworICAgICAgICBzZXRE
b2N1bWVudCggY29udGV4dCApOworICAgIH0KKworICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRv
Y3VtZW50OworICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOworCisgICAgaWYgKCAhc2VsZWN0
b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgfQorCisgICAgaWYgKCAobm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlKSAh
PT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsKKyAgICAgICAgcmV0dXJuIFtdOworICAgIH0KKwor
ICAgIGlmICggZG9jdW1lbnRJc0hUTUwgJiYgIXNlZWQgKSB7CisKKyAgICAgICAgLy8gU2hvcnRj
dXRzCisgICAgICAgIGlmICggKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSAp
IHsKKyAgICAgICAgICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCisgICAgICAgICAgICBp
ZiAoIChtID0gbWF0Y2hbMV0pICkgeworICAgICAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09
IDkgKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlk
KCBtICk7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2gg
d2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisgICAgICAgICAgICAgICAgICAgIC8vIG5vZGVz
IHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2MykKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBX
ZWJraXQgcmV0dXJuIGl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBuYW1lIGlu
c3RlYWQgb2YgSUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5pZCA9PT0gbSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBpcyBub3Qg
YSBkb2N1bWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoIGNvbnRleHQub3duZXJEb2N1bWVu
dCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAm
JgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJiBl
bGVtLmlkID09PSBtICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKCBl
bGVtICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3BlZWQt
dXA6IFNpenpsZSgiVEFHIikKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewor
ICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoIHNlbGVjdG9yICkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsK
KworICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNz
TmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CisgICAgICAgICAgICAg
ICAgcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBt
ICkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIC8vIFFTQSBwYXRoCisgICAgICAgIGlmICggc3VwcG9ydC5xc2Eg
JiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHsKKyAgICAg
ICAgICAgIG5pZCA9IG9sZCA9IGV4cGFuZG87CisgICAgICAgICAgICBuZXdDb250ZXh0ID0gY29u
dGV4dDsKKyAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0
b3I7CisKKyAgICAgICAgICAgIC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290
ZWQgcXVlcmllcworICAgICAgICAgICAgLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3Bl
Y2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdAorICAgICAgICAgICAgLy8gYW5kIHdvcmtp
bmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlx
dWUpCisgICAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHMK
KyAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xv
d2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKKyAgICAgICAgICAgICAgICBncm91cHMgPSB0b2tl
bml6ZSggc2VsZWN0b3IgKTsKKworICAgICAgICAgICAgICAgIGlmICggKG9sZCA9IGNvbnRleHQu
Z2V0QXR0cmlidXRlKCJpZCIpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbmlkID0gb2xkLnJl
cGxhY2UoIHJlc2NhcGUsICJcXCQmIiApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAi
OworCisgICAgICAgICAgICAgICAgaSA9IGdyb3Vwcy5sZW5ndGg7CisgICAgICAgICAgICAgICAg
d2hpbGUgKCBpLS0gKSB7CisgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXSA9IG5pZCArIHRv
U2VsZWN0b3IoIGdyb3Vwc1tpXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCgg
Y29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dDsKKyAgICAgICAgICAgICAgICBuZXdTZWxl
Y3RvciA9IGdyb3Vwcy5qb2luKCIsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICggbmV3U2VsZWN0b3IgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAg
ICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nv
bnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKQorICAgICAgICAgICAgICAgICAg
ICApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAg
ICB9IGNhdGNoKHFzYUVycm9yKSB7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCAhb2xkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29u
dGV4dC5yZW1vdmVBdHRyaWJ1dGUoImlkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBB
bGwgb3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIk
MSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwogfQogCiAvKioKICAqIENyZWF0ZSBrZXkt
dmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQogICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmlu
ZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBp
dHNlbGYgd2l0aAotICogICAgcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJp
bmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKLSAq
ICAgIGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnkKKyAqICBwcm9wZXJ0eSBuYW1lIHRoZSAoc3Bh
Y2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHBy
LmNhY2hlTGVuZ3RoKQorICogIGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnkKICAqLwogZnVuY3Rp
b24gY3JlYXRlQ2FjaGUoKSB7Ci0gICAgdmFyIGNhY2hlLAotICAgIGtleXMgPSBbXTsKKyAgICB2
YXIga2V5cyA9IFtdOwogCi0gICAgcmV0dXJuIChjYWNoZSA9IGZ1bmN0aW9uKCBrZXksIHZhbHVl
ICkgewotICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRp
dmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQotICAgIGlmICgga2V5cy5w
dXNoKCBrZXkgKz0gIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgewotICAgIC8vIE9ubHkga2Vl
cCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwotICAgIGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgp
IF07CisgICAgZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7CisgICAgICAgIC8vIFVzZSAo
a2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3Bl
cnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQorICAgICAgICBpZiAoIGtleXMucHVzaCgga2V5ICsgIiAi
ICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgeworICAgICAgICAgICAgLy8gT25seSBrZWVwIHRoZSBt
b3N0IHJlY2VudCBlbnRyaWVzCisgICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQo
KSBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFs
dWUpOwogICAgIH0KLSAgICByZXR1cm4gKGNhY2hlWyBrZXkgXSA9IHZhbHVlKTsKLSAgICB9KTsK
KyAgICByZXR1cm4gY2FjaGU7CiB9CiAKIC8qKgpAQCAtMzg3OSwxMjggKzg3NSwxMjIgQEAgZnVu
Y3Rpb24gYXNzZXJ0KCBmbiApIHsKICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCgiZGl2Iik7CiAKICAgICB0cnkgewotICAgIHJldHVybiBmbiggZGl2ICk7CisgICAgICAgIHJl
dHVybiAhIWZuKCBkaXYgKTsKICAgICB9IGNhdGNoIChlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfSBmaW5hbGx5IHsKLSAgICAvLyByZWxlYXNlIG1l
bW9yeSBpbiBJRQotICAgIGRpdiA9IG51bGw7CisgICAgICAgIC8vIFJlbW92ZSBmcm9tIGl0cyBw
YXJlbnQgYnkgZGVmYXVsdAorICAgICAgICBpZiAoIGRpdi5wYXJlbnROb2RlICkgeworICAgICAg
ICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOworICAgICAgICB9CisgICAg
ICAgIC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCisgICAgICAgIGRpdiA9IG51bGw7CiAgICAgfQog
fQogCi1mdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkg
ewotICAgIHZhciBtYXRjaCwgZWxlbSwgbSwgbm9kZVR5cGUsCi0gICAgLy8gUVNBIHZhcnMKLSAg
ICBpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsKLQotICAgIGlm
ICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJy
ZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7Ci0gICAgc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKLSAg
ICB9Ci0KLSAgICBjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKLSAgICByZXN1bHRzID0g
cmVzdWx0cyB8fCBbXTsKLQotICAgIGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAh
PT0gInN0cmluZyIgKSB7Ci0gICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQorLyoqCisgKiBBZGRz
IHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzCisgKiBAcGFy
YW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzCisgKiBA
cGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQK
KyAqLworZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHsKKyAgICB2YXIgYXJy
ID0gYXR0cnMuc3BsaXQoInwiKSwKKyAgICAgICAgaSA9IGF0dHJzLmxlbmd0aDsKIAotICAgIGlm
ICggKG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZSkgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkg
KSB7Ci0gICAgcmV0dXJuIFtdOwotICAgIH0KLQotICAgIGlmICggIWRvY3VtZW50SXNYTUwgJiYg
IXNlZWQgKSB7Ci0KLSAgICAvLyBTaG9ydGN1dHMKLSAgICBpZiAoIChtYXRjaCA9IHJxdWlja0V4
cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7Ci0gICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiI0lEIikK
LSAgICBpZiAoIChtID0gbWF0Y2hbMV0pICkgewotICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7
Ci0gICAgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTsKLSAgICAvLyBDaGVjayBw
YXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwotICAgIC8vIG5v
ZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKLSAgICBpZiAoIGVs
ZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewotICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJ
RSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zCi0gICAgLy8gYnkgbmFtZSBpbnN0ZWFk
IG9mIElECi0gICAgaWYgKCBlbGVtLmlkID09PSBtICkgewotICAgIHJlc3VsdHMucHVzaCggZWxl
bSApOwotICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLSAgICB9IGVsc2UgewotICAgIHJldHVy
biByZXN1bHRzOwotICAgIH0KLSAgICB9IGVsc2UgewotICAgIC8vIENvbnRleHQgaXMgbm90IGEg
ZG9jdW1lbnQKLSAgICBpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRl
eHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJgotICAgIGNvbnRhaW5zKCBj
b250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHsKLSAgICByZXN1bHRzLnB1c2goIGVs
ZW0gKTsKLSAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9CisgICAgd2hpbGUgKCBpLS0gKSB7Cisg
ICAgICAgIEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyOwogICAgIH0KK30KIAot
ICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUoIlRBRyIpCi0gICAgfSBlbHNlIGlmICggbWF0Y2hbMl0g
KSB7Ci0gICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCBzZWxlY3RvciApLCAwKSApOwotICAgIHJldHVybiByZXN1bHRzOworLyoq
CisgKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzCisgKiBAcGFyYW0ge0Vs
ZW1lbnR9IGEKKyAqIEBwYXJhbSB7RWxlbWVudH0gYgorICogQHJldHVybnMge051bWJlcn0gUmV0
dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9s
bG93cyBiCisgKi8KK2Z1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKKyAgICB2YXIgY3Vy
ID0gYiAmJiBhLAorICAgICAgICBkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5u
b2RlVHlwZSA9PT0gMSAmJgorICAgICAgICAgICAgKCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhfTkVH
QVRJVkUgKSAtCisgICAgICAgICAgICAoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSAp
OwogCi0gICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKLSAgICB9IGVsc2UgaWYgKCAo
bSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEJ5Q2xhc3NOYW1lICYmIGNvbnRleHQuZ2V0RWxl
bWVudHNCeUNsYXNzTmFtZSApIHsKLSAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxs
KGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApLCAwKSApOwotICAgIHJldHVybiBy
ZXN1bHRzOwotICAgIH0KKyAgICAvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9u
IGJvdGggbm9kZXMKKyAgICBpZiAoIGRpZmYgKSB7CisgICAgICAgIHJldHVybiBkaWZmOwogICAg
IH0KIAotICAgIC8vIFFTQSBwYXRoCi0gICAgaWYgKCBzdXBwb3J0LnFzYSAmJiAhcmJ1Z2d5UVNB
LnRlc3Qoc2VsZWN0b3IpICkgewotICAgIG9sZCA9IHRydWU7Ci0gICAgbmlkID0gZXhwYW5kbzsK
LSAgICBuZXdDb250ZXh0ID0gY29udGV4dDsKLSAgICBuZXdTZWxlY3RvciA9IG5vZGVUeXBlID09
PSA5ICYmIHNlbGVjdG9yOworICAgIC8vIENoZWNrIGlmIGIgZm9sbG93cyBhCisgICAgaWYgKCBj
dXIgKSB7CisgICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CisgICAg
ICAgICAgICBpZiAoIGN1ciA9PT0gYiApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAvLyBxU0Egd29ya3Mgc3RyYW5n
ZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKLSAgICAvLyBXZSBjYW4gd29yayBhcm91bmQg
dGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290Ci0gICAgLy8gYW5kIHdv
cmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNo
bmlxdWUpCi0gICAgLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCi0gICAg
aWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09
ICJvYmplY3QiICkgewotICAgIGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOworICAgIHJl
dHVybiBhID8gMSA6IC0xOworfQogCi0gICAgaWYgKCAob2xkID0gY29udGV4dC5nZXRBdHRyaWJ1
dGUoImlkIikpICkgewotICAgIG5pZCA9IG9sZC5yZXBsYWNlKCByZXNjYXBlLCAiXFwkJiIgKTsK
LSAgICB9IGVsc2UgewotICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKLSAg
ICB9Ci0gICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOworLyoqCisgKiBSZXR1cm5zIGEg
ZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzCisgKiBAcGFyYW0ge1N0
cmluZ30gdHlwZQorICovCitmdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKKyAg
ICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2Rl
TmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBl
bGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsKK30KIAotICAgIGkgPSBncm91cHMubGVuZ3RoOwot
ICAgIHdoaWxlICggaS0tICkgewotICAgIGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdy
b3Vwc1tpXSApOwotICAgIH0KLSAgICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0
b3IgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dDsKLSAgICBuZXdTZWxlY3RvciA9
IGdyb3Vwcy5qb2luKCIsIik7Ci0gICAgfQorLyoqCisgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8g
dXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKKyAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgKi8K
K2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKKyAgICByZXR1cm4gZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz
ZSgpOworICAgICAgICByZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRv
biIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKKyAgICB9OworfQogCi0gICAgaWYgKCBuZXdTZWxl
Y3RvciApIHsKLSAgICB0cnkgewotICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwo
IG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCgKLSAgICBuZXdTZWxlY3RvcgotICAgICksIDAg
KSApOwotICAgIHJldHVybiByZXN1bHRzOwotICAgIH0gY2F0Y2gocXNhRXJyb3IpIHsKLSAgICB9
IGZpbmFsbHkgewotICAgIGlmICggIW9sZCApIHsKLSAgICBjb250ZXh0LnJlbW92ZUF0dHJpYnV0
ZSgiaWQiKTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQorLyoqCisgKiBSZXR1
cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCisgKiBAcGFy
YW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBm
biApIHsKKyAgICByZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsKKyAg
ICAgICAgYXJndW1lbnQgPSArYXJndW1lbnQ7CisgICAgICAgIHJldHVybiBtYXJrRnVuY3Rpb24o
ZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CisgICAgICAgICAgICB2YXIgaiwKKyAgICAgICAg
ICAgICAgICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAor
ICAgICAgICAgICAgICAgIGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgICAgICAgICAv
LyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKKyAgICAgICAg
ICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgIGlmICggc2VlZFsgKGogPSBtYXRj
aEluZGV4ZXNbaV0pIF0gKSB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRbal0gPSAhKG1hdGNo
ZXNbal0gPSBzZWVkW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0pOworICAgIH0pOworfQogCi0gICAgLy8gQWxsIG90aGVycwotICAgIHJldHVybiBzZWxl
Y3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksIGNvbnRleHQsIHJlc3VsdHMsIHNl
ZWQgKTsKKy8qKgorICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29u
dGV4dAorICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHQKKyAqIEByZXR1cm5zIHtF
bGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhl
cndpc2UgYSBmYWxzeSB2YWx1ZQorICovCitmdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCAp
IHsKKyAgICByZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFn
TmFtZSAhPT0gc3RydW5kZWZpbmVkICYmIGNvbnRleHQ7CiB9CiAKKy8vIEV4cG9zZSBzdXBwb3J0
IHZhcnMgZm9yIGNvbnZlbmllbmNlCitzdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTsKKwog
LyoqCi0gKiBEZXRlY3QgeG1sCisgKiBEZXRlY3RzIFhNTCBub2RlcwogICogQHBhcmFtIHtFbGVt
ZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnQKKyAqIEByZXR1cm5zIHtC
b29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICAqLwogaXNYTUwg
PSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKICAgICAvLyBkb2N1bWVudEVsZW1l
bnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CkBAIC00
MDE1LDExICsxMDA1LDEzIEBAIGlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0g
KSB7CiAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50CiAg
Ki8KIHNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7
Ci0gICAgdmFyIGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZl
cnJlZERvYzsKKyAgICB2YXIgaGFzQ29tcGFyZSwKKyAgICAgICAgZG9jID0gbm9kZSA/IG5vZGUu
b3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jLAorICAgICAgICBwYXJlbnQgPSBk
b2MuZGVmYXVsdFZpZXc7CiAKICAgICAvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVt
ZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuCiAgICAgaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRv
Yy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKLSAgICByZXR1cm4g
ZG9jdW1lbnQ7CisgICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgICB9CiAKICAgICAvLyBTZXQg
b3VyIGRvY3VtZW50CkBAIC00MDI3LDMzMyArMTAxOSwzNDggQEAgc2V0RG9jdW1lbnQgPSBTaXp6
bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHsKICAgICBkb2NFbGVtID0gZG9jLmRv
Y3VtZW50RWxlbWVudDsKIAogICAgIC8vIFN1cHBvcnQgdGVzdHMKLSAgICBkb2N1bWVudElzWE1M
ID0gaXNYTUwoIGRvYyApOworICAgIGRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2MgKTsKKwor
ICAgIC8vIFN1cHBvcnQ6IElFPjgKKyAgICAvLyBJZiBpZnJhbWUgZG9jdW1lbnQgaXMgYXNzaWdu
ZWQgdG8gImRvY3VtZW50IiB2YXJpYWJsZSBhbmQgaWYgaWZyYW1lIGhhcyBiZWVuIHJlbG9hZGVk
LAorICAgIC8vIElFIHdpbGwgdGhyb3cgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciB3aGVuIGFj
Y2Vzc2luZyAiZG9jdW1lbnQiIHZhcmlhYmxlLCBzZWUgalF1ZXJ5ICMxMzkzNgorICAgIC8vIElF
Ni04IGRvIG5vdCBzdXBwb3J0IHRoZSBkZWZhdWx0VmlldyBwcm9wZXJ0eSBzbyBwYXJlbnQgd2ls
bCBiZSB1bmRlZmluZWQKKyAgICBpZiAoIHBhcmVudCAmJiBwYXJlbnQgIT09IHBhcmVudC50b3Ag
KSB7CisgICAgICAgIC8vIElFMTEgZG9lcyBub3QgaGF2ZSBhdHRhY2hFdmVudCwgc28gYWxsIG11
c3Qgc3VmZmVyCisgICAgICAgIGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisgICAg
ICAgICAgICBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIGZ1bmN0aW9uKCkgewor
ICAgICAgICAgICAgICAgIHNldERvY3VtZW50KCk7CisgICAgICAgICAgICB9LCBmYWxzZSApOwor
ICAgICAgICB9IGVsc2UgaWYgKCBwYXJlbnQuYXR0YWNoRXZlbnQgKSB7CisgICAgICAgICAgICBw
YXJlbnQuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
ICAgIHNldERvY3VtZW50KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8qIEF0dHJpYnV0ZXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSAgICAvLyBDaGVjayBp
ZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cwotICAgIHN1
cHBvcnQudGFnTmFtZU5vQ29tbWVudHMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICBk
aXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KCIiKSApOwotICAgIHJldHVybiAhZGl2
LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoOworICAgIC8vIFN1cHBvcnQ6IElFPDgK
KyAgICAvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRl
cyBhbmQgbm90IHByb3BlcnRpZXMgKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCisgICAgc3VwcG9y
dC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisgICAgICAgIGRpdi5jbGFz
c05hbWUgPSAiaSI7CisgICAgICAgIHJldHVybiAhZGl2LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1l
Iik7CiAgICAgfSk7CiAKLSAgICAvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRy
aWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCi0gICAgc3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0Pjwvc2VsZWN0
PiI7Ci0gICAgdmFyIHR5cGUgPSB0eXBlb2YgZGl2Lmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11
bHRpcGxlIik7Ci0gICAgLy8gSUU4IHJldHVybnMgYSBzdHJpbmcgZm9yIHNvbWUgYXR0cmlidXRl
cyBldmVuIHdoZW4gbm90IHByZXNlbnQKLSAgICByZXR1cm4gdHlwZSAhPT0gImJvb2xlYW4iICYm
IHR5cGUgIT09ICJzdHJpbmciOworICAgIC8qIGdldEVsZW1lbnQocylCeSoKKyAgICAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKKyAgICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJl
dHVybnMgb25seSBlbGVtZW50cworICAgIHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBh
c3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZGl2LmFwcGVuZENoaWxkKCBkb2MuY3Jl
YXRlQ29tbWVudCgiIikgKTsKKyAgICAgICAgcmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05h
bWUoIioiKS5sZW5ndGg7CiAgICAgfSk7CiAKICAgICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5
Q2xhc3NOYW1lIGNhbiBiZSB0cnVzdGVkCi0gICAgc3VwcG9ydC5nZXRCeUNsYXNzTmFtZSA9IGFz
c2VydChmdW5jdGlvbiggZGl2ICkgewotICAgIC8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQg
Y2xhc3NuYW1lIChpbiA5LjYpCi0gICAgZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSdoaWRk
ZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iOwotICAgIGlmICggIWRpdi5n
ZXRFbGVtZW50c0J5Q2xhc3NOYW1lIHx8ICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIp
Lmxlbmd0aCApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2FmYXJpIDMu
MiBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcyBhbmQgZG9lc24ndCBjYXRjaCBjaGFuZ2VzCi0gICAg
ZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7Ci0gICAgcmV0dXJuIGRpdi5nZXRFbGVtZW50
c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAyOworICAgIHN1cHBvcnQuZ2V0RWxlbWVudHNC
eUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSAm
JiBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZGl2LmlubmVySFRNTCA9ICI8ZGl2
IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiI7CisKKyAgICAgICAgLy8g
U3VwcG9ydDogU2FmYXJpPDQKKyAgICAgICAgLy8gQ2F0Y2ggY2xhc3Mgb3Zlci1jYWNoaW5nCisg
ICAgICAgIGRpdi5maXJzdENoaWxkLmNsYXNzTmFtZSA9ICJpIjsKKyAgICAgICAgLy8gU3VwcG9y
dDogT3BlcmE8MTAKKyAgICAgICAgLy8gQ2F0Y2ggZ0VCQ04gZmFpbHVyZSB0byBmaW5kIG5vbi1s
ZWFkaW5nIGNsYXNzZXMKKyAgICAgICAgcmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
KCJpIikubGVuZ3RoID09PSAyOwogICAgIH0pOwogCisgICAgLy8gU3VwcG9ydDogSUU8MTAKICAg
ICAvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKLSAg
ICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5TmFtZSBwcml2aWxlZ2VzIGZvcm0gY29udHJvbHMg
b3IgcmV0dXJucyBlbGVtZW50cyBieSBJRAotICAgIHN1cHBvcnQuZ2V0QnlOYW1lID0gYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgLy8gSW5qZWN0IGNvbnRlbnQKLSAgICBkaXYuaWQgPSBl
eHBhbmRvICsgMDsKLSAgICBkaXYuaW5uZXJIVE1MID0gIjxhIG5hbWU9JyIgKyBleHBhbmRvICsg
Iic+PC9hPjxkaXYgbmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2Rpdj4iOwotICAgIGRvY0VsZW0u
aW5zZXJ0QmVmb3JlKCBkaXYsIGRvY0VsZW0uZmlyc3RDaGlsZCApOwotCi0gICAgLy8gVGVzdAot
ICAgIHZhciBwYXNzID0gZG9jLmdldEVsZW1lbnRzQnlOYW1lICYmCi0gICAgLy8gYnVnZ3kgYnJv
d3NlcnMgd2lsbCByZXR1cm4gZmV3ZXIgdGhhbiB0aGUgY29ycmVjdCAyCi0gICAgZG9jLmdldEVs
ZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoID09PSAyICsKLSAgICAvLyBidWdneSBicm93
c2VycyB3aWxsIHJldHVybiBtb3JlIHRoYW4gdGhlIGNvcnJlY3QgMAotICAgIGRvYy5nZXRFbGVt
ZW50c0J5TmFtZSggZXhwYW5kbyArIDAgKS5sZW5ndGg7Ci0gICAgc3VwcG9ydC5nZXRJZE5vdE5h
bWUgPSAhZG9jLmdldEVsZW1lbnRCeUlkKCBleHBhbmRvICk7Ci0KLSAgICAvLyBDbGVhbnVwCi0g
ICAgZG9jRWxlbS5yZW1vdmVDaGlsZCggZGl2ICk7Ci0KLSAgICByZXR1cm4gcGFzczsKKyAgICAv
LyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFt
YXRpY2FsbHktc2V0IG5hbWVzLAorICAgIC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVu
dHNCeU5hbWUgdGVzdAorICAgIHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2
ICkgeworICAgICAgICBkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87Cisg
ICAgICAgIHJldHVybiAhZG9jLmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2MuZ2V0RWxlbWVudHNC
eU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7CiAgICAgfSk7CiAKLSAgICAvLyBJRTYvNyByZXR1cm4g
bW9kaWZpZWQgYXR0cmlidXRlcwotICAgIEV4cHIuYXR0ckhhbmRsZSA9IGFzc2VydChmdW5jdGlv
biggZGl2ICkgewotICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7Ci0gICAg
cmV0dXJuIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1
dGUgIT09IHN0cnVuZGVmaW5lZCAmJgotICAgIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgi
aHJlZiIpID09PSAiIyI7Ci0gICAgfSkgPwotICAgIHt9IDoKLSAgICB7Ci0gICAgImhyZWYiOiBm
dW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiwg
MiApOwotICAgIH0sCi0gICAgInR5cGUiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4g
ZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9Ci0gICAgfTsKLQogICAgIC8vIElEIGZp
bmQgYW5kIGZpbHRlcgotICAgIGlmICggc3VwcG9ydC5nZXRJZE5vdE5hbWUgKSB7Ci0gICAgRXhw
ci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewotICAgIGlmICggdHlwZW9m
IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IHN0cnVuZGVmaW5lZCAmJiAhZG9jdW1lbnRJc1hN
TCApIHsKLSAgICB2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7Ci0gICAgLy8g
Q2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKLSAg
ICAvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCi0gICAg
cmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gW21dIDogW107Ci0gICAgfQotICAgIH07Ci0gICAg
RXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7Ci0gICAgdmFyIGF0dHJJZCA9IGlk
LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uKCBl
bGVtICkgewotICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOwot
ICAgIH07Ci0gICAgfTsKKyAgICBpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHsKKyAgICAgICAgRXhw
ci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgeworICAgICAgICAgICAgaWYg
KCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmIGRvY3Vt
ZW50SXNIVE1MICkgeworICAgICAgICAgICAgICAgIHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50
QnlJZCggaWQgKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNo
IHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIG5vZGVzIHRo
YXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfTsKKyAgICAgICAgRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CisgICAg
ICAgICAgICB2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsK
KyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKyAgICAgICAgICAgIH07
CisgICAgICAgIH07CiAgICAgfSBlbHNlIHsKLSAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlv
biggaWQsIGNvbnRleHQgKSB7Ci0gICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJ
ZCAhPT0gc3RydW5kZWZpbmVkICYmICFkb2N1bWVudElzWE1MICkgewotICAgIHZhciBtID0gY29u
dGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKKyAgICAgICAgLy8gU3VwcG9ydDogSUU2LzcKKyAg
ICAgICAgLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1
dAorICAgICAgICBkZWxldGUgRXhwci5maW5kWyJJRCJdOwogCi0gICAgcmV0dXJuIG0gPwotICAg
IG0uaWQgPT09IGlkIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5l
ZCAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWUgPT09IGlkID8KLSAgICBbbV0gOgot
ICAgIHVuZGVmaW5lZCA6Ci0gICAgW107Ci0gICAgfQotICAgIH07Ci0gICAgRXhwci5maWx0ZXJb
IklEIl0gPSAgZnVuY3Rpb24oIGlkICkgewotICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBy
dW5lc2NhcGUsIGZ1bmVzY2FwZSApOwotICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLSAg
ICB2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5l
ZCAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7Ci0gICAgcmV0dXJuIG5vZGUgJiYgbm9k
ZS52YWx1ZSA9PT0gYXR0cklkOwotICAgIH07Ci0gICAgfTsKKyAgICAgICAgRXhwci5maWx0ZXJb
IklEIl0gPSAgZnVuY3Rpb24oIGlkICkgeworICAgICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJl
cGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRB
dHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJp
ZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJ
ZDsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CiAgICAgfQogCiAgICAgLy8gVGFnCi0gICAg
RXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQudGFnTmFtZU5vQ29tbWVudHMgPwotICAgIGZ1bmN0
aW9uKCB0YWcsIGNvbnRleHQgKSB7Ci0gICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50
c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgewotICAgIHJldHVybiBjb250ZXh0LmdldEVs
ZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKLSAgICB9Ci0gICAgfSA6Ci0gICAgZnVuY3Rpb24oIHRh
ZywgY29udGV4dCApIHsKLSAgICB2YXIgZWxlbSwKLSAgICB0bXAgPSBbXSwKLSAgICBpID0gMCwK
LSAgICByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7Ci0KLSAg
ICAvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCi0gICAgaWYgKCB0YWcgPT09ICIqIiAp
IHsKLSAgICB3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHsKLSAgICBpZiAoIGVsZW0u
bm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgdG1wLnB1c2goIGVsZW0gKTsKLSAgICB9Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHRtcDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfTsKLQot
ICAgIC8vIE5hbWUKLSAgICBFeHByLmZpbmRbIk5BTUUiXSA9IHN1cHBvcnQuZ2V0QnlOYW1lICYm
IGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7Ci0gICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRF
bGVtZW50c0J5TmFtZSAhPT0gc3RydW5kZWZpbmVkICkgewotICAgIHJldHVybiBjb250ZXh0Lmdl
dEVsZW1lbnRzQnlOYW1lKCBuYW1lICk7Ci0gICAgfQotICAgIH07CisgICAgRXhwci5maW5kWyJU
QUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPworICAgICAgICBmdW5jdGlvbigg
dGFnLCBjb250ZXh0ICkgeworICAgICAgICAgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVt
ZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIHJldHVy
biBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSA6CisgICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisgICAgICAgICAg
ICB2YXIgZWxlbSwKKyAgICAgICAgICAgICAgICB0bXAgPSBbXSwKKyAgICAgICAgICAgICAgICBp
ID0gMCwKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFn
TmFtZSggdGFnICk7CisKKyAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVu
dHMKKyAgICAgICAgICAgIGlmICggdGFnID09PSAiKiIgKSB7CisgICAgICAgICAgICAgICAgd2hp
bGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgg
ZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNo
KCBlbGVtICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdHM7CisgICAgICAgIH07CiAKICAgICAvLyBDbGFzcwotICAgIEV4cHIuZmluZFsi
Q0xBU1MiXSA9IHN1cHBvcnQuZ2V0QnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwg
Y29udGV4dCApIHsKLSAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUgIT09IHN0cnVuZGVmaW5lZCAmJiAhZG9jdW1lbnRJc1hNTCApIHsKLSAgICByZXR1cm4gY29u
dGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKLSAgICB9CisgICAgRXhw
ci5maW5kWyJDTEFTUyJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0
aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7CisgICAgICAgIGlmICggdHlwZW9mIGNvbnRleHQu
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmIGRvY3VtZW50SXNIVE1M
ICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgg
Y2xhc3NOYW1lICk7CisgICAgICAgIH0KICAgICB9OwogCisgICAgLyogUVNBL21hdGNoZXNTZWxl
Y3RvcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogICAgIC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVj
dG9yIHN1cHBvcnQKIAogICAgIC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZh
bHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpCiAgICAgcmJ1Z2d5TWF0Y2hlcyA9IFtdOwog
Ci0gICAgLy8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSks
Ci0gICAgLy8gbm8gbmVlZCB0byBhbHNvIGFkZCB0byBidWdneU1hdGNoZXMgc2luY2UgbWF0Y2hl
cyBjaGVja3MgYnVnZ3lRU0EKLSAgICAvLyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRv
byBtdWNoIGNvZGUgKHdvdWxkIGluY2x1ZGUgZG9jdW1lbnQgcmVhZHkpCi0gICAgcmJ1Z2d5UVNB
ID0gWyAiOmZvY3VzIiBdOwotCi0gICAgaWYgKCAoc3VwcG9ydC5xc2EgPSBpc05hdGl2ZShkb2Mu
cXVlcnlTZWxlY3RvckFsbCkpICkgewotICAgIC8vIEJ1aWxkIFFTQSByZWdleAotICAgIC8vIFJl
Z2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmkKLSAgICBhc3NlcnQoZnVuY3Rp
b24oIGRpdiApIHsKLSAgICAvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJw
b3NlCi0gICAgLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0
bHkKLSAgICAvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKLSAgICAvLyBz
aW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaAotICAgIC8vIGh0dHA6Ly9idWdzLmpx
dWVyeS5jb20vdGlja2V0LzEyMzU5Ci0gICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0PjxvcHRp
b24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKLQotICAgIC8vIElFOCAtIFNvbWUg
Ym9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHkKLSAgICBpZiAoICFk
aXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKLSAgICByYnVnZ3lR
U0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFw
fG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIgKTsKLSAgICB9Ci0KLSAgICAvLyBX
ZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVt
ZW50cwotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3Jz
LTIwMTEwOTI5LyNjaGVja2VkCi0gICAgLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxs
IG5vdCBzZWUgbGF0ZXIgdGVzdHMKLSAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmNo
ZWNrZWQiKS5sZW5ndGggKSB7Ci0gICAgcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7Ci0gICAg
fQotICAgIH0pOwotCi0gICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0KLSAgICAvLyBPcGVy
YSAxMC0xMi9JRTggLSBePSAkPSAqPSBhbmQgZW1wdHkgdmFsdWVzCi0gICAgLy8gU2hvdWxkIG5v
dCBzZWxlY3QgYW55dGhpbmcKLSAgICBkaXYuaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdoaWRk
ZW4nIGk9JycvPiI7Ci0gICAgaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCgiW2lePScnXSIpLmxl
bmd0aCApIHsKLSAgICByYnVnZ3lRU0EucHVzaCggIlsqXiRdPSIgKyB3aGl0ZXNwYWNlICsgIioo
PzpcIlwifCcnKSIgKTsKLSAgICB9Ci0KLSAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJs
ZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVk
KQotICAgIC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRl
c3RzCi0gICAgaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoICkg
ewotICAgIHJidWdneVFTQS5wdXNoKCAiOmVuYWJsZWQiLCAiOmRpc2FibGVkIiApOwotICAgIH0K
LQotICAgIC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxp
ZCBwc2V1ZG9zCi0gICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKLSAgICByYnVnZ3lR
U0EucHVzaCgiLC4qOiIpOwotICAgIH0pOwotICAgIH0KLQotICAgIGlmICggKHN1cHBvcnQubWF0
Y2hlc1NlbGVjdG9yID0gaXNOYXRpdmUoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzU2VsZWN0
b3IgfHwKLSAgICBkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fAotICAgIGRvY0VsZW0ud2Vi
a2l0TWF0Y2hlc1NlbGVjdG9yIHx8Ci0gICAgZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8Ci0g
ICAgZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7Ci0KLSAgICBhc3NlcnQoZnVuY3Rp
b24oIGRpdiApIHsKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBt
YXRjaGVzU2VsZWN0b3IKLSAgICAvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQotICAg
IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsK
LQotICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KLSAgICAvLyBHZWNr
byBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkCi0gICAgbWF0Y2hlcy5jYWxs
KCBkaXYsICJbcyE9JyddOngiICk7Ci0gICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1
ZG9zICk7Ci0gICAgfSk7Ci0gICAgfQotCi0gICAgcmJ1Z2d5UVNBID0gbmV3IFJlZ0V4cCggcmJ1
Z2d5UVNBLmpvaW4oInwiKSApOwotICAgIHJidWdneU1hdGNoZXMgPSBuZXcgUmVnRXhwKCByYnVn
Z3lNYXRjaGVzLmpvaW4oInwiKSApOworICAgIC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ug
d2hlbiB0cnVlIChDaHJvbWUgMjEpCisgICAgLy8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEg
YnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yCisgICAgLy8gd2hlbmV2ZXIgYGRvY3Vt
ZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQorICAgIC8vIFNvLCB3
ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQg
dGhlIElFIGVycm9yCisgICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEz
Mzc4CisgICAgcmJ1Z2d5UVNBID0gW107CisKKyAgICBpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRp
dmUudGVzdCggZG9jLnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7CisgICAgICAgIC8vIEJ1aWxkIFFT
QSByZWdleAorICAgICAgICAvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVy
aW5pCisgICAgICAgIGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworICAgICAgICAgICAgLy8gU2Vs
ZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQorICAgICAgICAgICAgLy8gVGhp
cyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5CisgICAgICAgICAg
ICAvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKKyAgICAgICAgICAgIC8v
IHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCisgICAgICAgICAgICAvLyBodHRw
Oi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQorICAgICAgICAgICAgZGl2LmlubmVySFRN
TCA9ICI8c2VsZWN0IHQ9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4i
OworCisgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDEwLTEyCisgICAgICAgICAg
ICAvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93
IF49IG9yICQ9IG9yICo9CisgICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJb
dF49JyddIikubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAiWype
JF09IiArIHdoaXRlc3BhY2UgKyAiKig/OicnfFwiXCIpIiApOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgKKyAgICAgICAgICAgIC8vIEJvb2xlYW4gYXR0cmli
dXRlcyBhbmQgInZhbHVlIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5CisgICAgICAgICAgICBp
ZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKKyAgICAg
ICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2YWx1
ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
V2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxl
bWVudHMKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMt
c2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAgICAgICAgICAvLyBJRTggdGhyb3dzIGVy
cm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0cworICAgICAgICAgICAgaWYgKCAh
ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkgeworICAgICAgICAgICAg
ICAgIHJidWdneVFTQS5wdXNoKCI6Y2hlY2tlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9
KTsKKworICAgICAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwcworICAgICAgICAgICAgLy8gVGhlIHR5cGUgYW5k
IG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25t
ZW50CisgICAgICAgICAgICB2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsK
KyAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVuIiApOworICAg
ICAgICAgICAgZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggIm5hbWUiLCAi
RCIgKTsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogSUU4CisgICAgICAgICAgICAvLyBFbmZv
cmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGlmICgg
ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgeworICAgICAgICAgICAg
ICAgIHJidWdneVFTQS5wdXNoKCAibmFtZSIgKyB3aGl0ZXNwYWNlICsgIipbKl4kfCF+XT89IiAp
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlz
YWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFi
bGVkKQorICAgICAgICAgICAgLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBz
ZWUgbGF0ZXIgdGVzdHMKKyAgICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6
ZW5hYmxlZCIpLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIjpl
bmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
T3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3MK
KyAgICAgICAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7CisgICAgICAgICAgICBy
YnVnZ3lRU0EucHVzaCgiLC4qOiIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoIChz
dXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVt
LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAorICAgICAgICBkb2NFbGVtLm1vek1hdGNoZXNTZWxl
Y3RvciB8fAorICAgICAgICBkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHwKKyAgICAgICAgZG9j
RWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CisKKyAgICAgICAgYXNzZXJ0KGZ1bmN0aW9u
KCBkaXYgKSB7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0
byBkbyBtYXRjaGVzU2VsZWN0b3IKKyAgICAgICAgICAgIC8vIG9uIGEgZGlzY29ubmVjdGVkIG5v
ZGUgKElFIDkpCisgICAgICAgICAgICBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hl
cy5jYWxsKCBkaXYsICJkaXYiICk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwg
d2l0aCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCBy
ZXR1cm5zIGZhbHNlIGluc3RlYWQKKyAgICAgICAgICAgIG1hdGNoZXMuY2FsbCggZGl2LCAiW3Mh
PScnXTp4IiApOworICAgICAgICAgICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9z
ICk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5n
dGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOworICAgIHJidWdneU1hdGNo
ZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpv
aW4oInwiKSApOworCisgICAgLyogQ29udGFpbnMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAg
aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlv
biApOwogCiAgICAgLy8gRWxlbWVudCBjb250YWlucyBhbm90aGVyCiAgICAgLy8gUHVycG9zZWZ1
bGx5IGRvZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAogICAgIC8vIEFzIGlu
LCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmCi0gICAgY29udGFpbnMgPSBpc05h
dGl2ZShkb2NFbGVtLmNvbnRhaW5zKSB8fCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9u
ID8KLSAgICBmdW5jdGlvbiggYSwgYiApIHsKLSAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09
PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLAotICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2Rl
OwotICAgIHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEg
JiYgKAotICAgIGFkb3duLmNvbnRhaW5zID8KLSAgICBhZG93bi5jb250YWlucyggYnVwICkgOgot
ICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlv
biggYnVwICkgJiAxNgotICAgICkpOwotICAgIH0gOgotICAgIGZ1bmN0aW9uKCBhLCBiICkgewot
ICAgIGlmICggYiApIHsKLSAgICB3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKLSAgICBp
ZiAoIGIgPT09IGEgKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIGZhbHNlOwotICAgIH07CisgICAgY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJu
YXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KKyAgICAgICAgZnVuY3Rpb24oIGEsIGIg
KSB7CisgICAgICAgICAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVu
dEVsZW1lbnQgOiBhLAorICAgICAgICAgICAgICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwor
ICAgICAgICAgICAgcmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9
PT0gMSAmJiAoCisgICAgICAgICAgICAgICAgYWRvd24uY29udGFpbnMgPworICAgICAgICAgICAg
ICAgICAgICBhZG93bi5jb250YWlucyggYnVwICkgOgorICAgICAgICAgICAgICAgICAgICBhLmNv
bXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCAp
ICYgMTYKKyAgICAgICAgICAgICkpOworICAgICAgICB9IDoKKyAgICAgICAgZnVuY3Rpb24oIGEs
IGIgKSB7CisgICAgICAgICAgICBpZiAoIGIgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAo
YiA9IGIucGFyZW50Tm9kZSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggYiA9PT0gYSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9OworCisgICAgLyogU29ydGluZworICAgIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KIAogICAgIC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKLSAgICBzb3J0T3JkZXIgPSBk
b2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KKyAgICBzb3J0T3JkZXIgPSBoYXNDb21w
YXJlID8KICAgICBmdW5jdGlvbiggYSwgYiApIHsKLSAgICB2YXIgY29tcGFyZTsKLQotICAgIGlm
ICggYSA9PT0gYiApIHsKLSAgICBoYXNEdXBsaWNhdGUgPSB0cnVlOwotICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIGlmICggKGNvbXBhcmUgPSBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYm
IGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbigg
YiApKSApIHsKLSAgICBpZiAoIGNvbXBhcmUgJiAxIHx8IGEucGFyZW50Tm9kZSAmJiBhLnBhcmVu
dE5vZGUubm9kZVR5cGUgPT09IDExICkgewotICAgIGlmICggYSA9PT0gZG9jIHx8IGNvbnRhaW5z
KCBwcmVmZXJyZWREb2MsIGEgKSApIHsKLSAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgg
YiA9PT0gZG9jIHx8IGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGIgKSApIHsKLSAgICByZXR1cm4g
MTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBjb21wYXJlICYgNCA/
IC0xIDogMTsKLSAgICB9CiAKLSAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/
IC0xIDogMTsKKyAgICAgICAgLy8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWwKKyAgICAgICAg
aWYgKCBhID09PSBiICkgeworICAgICAgICAgICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29ydCBvbiBtZXRob2Qg
ZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbgor
ICAgICAgICB2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29t
cGFyZURvY3VtZW50UG9zaXRpb247CisgICAgICAgIGlmICggY29tcGFyZSApIHsKKyAgICAgICAg
ICAgIHJldHVybiBjb21wYXJlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHBv
c2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudAorICAgICAg
ICBjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVu
dCB8fCBiICkgPworICAgICAgICAgICAgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDoK
KworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVk
CisgICAgICAgICAgICAxOworCisgICAgICAgIC8vIERpc2Nvbm5lY3RlZCBub2RlcworICAgICAg
ICBpZiAoIGNvbXBhcmUgJiAxIHx8CisgICAgICAgICAgICAoIXN1cHBvcnQuc29ydERldGFjaGVk
ICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7CisKKyAg
ICAgICAgICAgIC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8g
b3VyIHByZWZlcnJlZCBkb2N1bWVudAorICAgICAgICAgICAgaWYgKCBhID09PSBkb2MgfHwgYS5v
d25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBh
KSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoIGIgPT09IGRvYyB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAm
JiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkgeworICAgICAgICAgICAgICAgIHJldHVybiAx
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRl
cgorICAgICAgICAgICAgcmV0dXJuIHNvcnRJbnB1dCA/CisgICAgICAgICAgICAgICAgKCBpbmRl
eE9mLmNhbGwoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGIgKSAp
IDoKKyAgICAgICAgICAgICAgICAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbXBh
cmUgJiA0ID8gLTEgOiAxOwogICAgIH0gOgogICAgIGZ1bmN0aW9uKCBhLCBiICkgewotICAgIHZh
ciBjdXIsCi0gICAgaSA9IDAsCi0gICAgYXVwID0gYS5wYXJlbnROb2RlLAotICAgIGJ1cCA9IGIu
cGFyZW50Tm9kZSwKLSAgICBhcCA9IFsgYSBdLAotICAgIGJwID0gWyBiIF07Ci0KLSAgICAvLyBF
eGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCi0gICAgaWYgKCBhID09PSBiICkg
ewotICAgIGhhc0R1cGxpY2F0ZSA9IHRydWU7Ci0gICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBQYXJl
bnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZAotICAgIH0g
ZWxzZSBpZiAoICFhdXAgfHwgIWJ1cCApIHsKLSAgICByZXR1cm4gYSA9PT0gZG9jID8gLTEgOgot
ICAgIGIgPT09IGRvYyA/IDEgOgotICAgIGF1cCA/IC0xIDoKLSAgICBidXAgPyAxIDoKLSAgICAw
OwotCi0gICAgLy8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sg
Y2hlY2sKLSAgICB9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHsKLSAgICByZXR1cm4gc2libGlu
Z0NoZWNrKCBhLCBiICk7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBs
aXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb24KLSAgICBjdXIgPSBhOwotICAg
IHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAgICBhcC51bnNoaWZ0KCBjdXIg
KTsKLSAgICB9Ci0gICAgY3VyID0gYjsKLSAgICB3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9k
ZSkgKSB7Ci0gICAgYnAudW5zaGlmdCggY3VyICk7Ci0gICAgfQotCi0gICAgLy8gV2FsayBkb3du
IHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKLSAgICB3aGlsZSAoIGFwW2ldID09
PSBicFtpXSApIHsKLSAgICBpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGkgPwotICAgIC8vIERv
IGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgotICAg
IHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOgotCi0gICAgLy8gT3RoZXJ3aXNlIG5vZGVz
IGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0Ci0gICAgYXBbaV0gPT09IHByZWZlcnJlZERvYyA/
IC0xIDoKLSAgICBicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6Ci0gICAgMDsKKyAgICAgICAg
Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbAorICAgICAgICBpZiAoIGEg
PT09IGIgKSB7CisgICAgICAgICAgICBoYXNEdXBsaWNhdGUgPSB0cnVlOworICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICB2YXIgY3VyLAorICAgICAgICAgICAgaSA9
IDAsCisgICAgICAgICAgICBhdXAgPSBhLnBhcmVudE5vZGUsCisgICAgICAgICAgICBidXAgPSBi
LnBhcmVudE5vZGUsCisgICAgICAgICAgICBhcCA9IFsgYSBdLAorICAgICAgICAgICAgYnAgPSBb
IGIgXTsKKworICAgICAgICAvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRz
IG9yIGRpc2Nvbm5lY3RlZAorICAgICAgICBpZiAoICFhdXAgfHwgIWJ1cCApIHsKKyAgICAgICAg
ICAgIHJldHVybiBhID09PSBkb2MgPyAtMSA6CisgICAgICAgICAgICAgICAgYiA9PT0gZG9jID8g
MSA6CisgICAgICAgICAgICAgICAgYXVwID8gLTEgOgorICAgICAgICAgICAgICAgIGJ1cCA/IDEg
OgorICAgICAgICAgICAgICAgIHNvcnRJbnB1dCA/CisgICAgICAgICAgICAgICAgKCBpbmRleE9m
LmNhbGwoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGIgKSApIDoK
KyAgICAgICAgICAgICAgICAwOworCisgICAgICAgIC8vIElmIHRoZSBub2RlcyBhcmUgc2libGlu
Z3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCisgICAgICAgIH0gZWxzZSBpZiAoIGF1cCA9PT0g
YnVwICkgeworICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBh
bmNlc3RvcnMgZm9yIGNvbXBhcmlzb24KKyAgICAgICAgY3VyID0gYTsKKyAgICAgICAgd2hpbGUg
KCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkgeworICAgICAgICAgICAgYXAudW5zaGlmdCggY3Vy
ICk7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gYjsKKyAgICAgICAgd2hpbGUgKCAoY3VyID0g
Y3VyLnBhcmVudE5vZGUpICkgeworICAgICAgICAgICAgYnAudW5zaGlmdCggY3VyICk7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNj
cmVwYW5jeQorICAgICAgICB3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHsKKyAgICAgICAgICAg
IGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpID8KKyAgICAgICAgICAgIC8vIERv
IGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgorICAg
ICAgICAgICAgc2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKSA6CisKKyAgICAgICAgICAgIC8v
IE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAorICAgICAgICAgICAg
YXBbaV0gPT09IHByZWZlcnJlZERvYyA/IC0xIDoKKyAgICAgICAgICAgIGJwW2ldID09PSBwcmVm
ZXJyZWREb2MgPyAxIDoKKyAgICAgICAgICAgIDA7CiAgICAgfTsKIAotICAgIC8vIEFsd2F5cyBh
c3N1bWUgdGhlIHByZXNlbmNlIG9mIGR1cGxpY2F0ZXMgaWYgc29ydCBkb2Vzbid0Ci0gICAgLy8g
cGFzcyB0aGVtIHRvIG91ciBjb21wYXJpc29uIGZ1bmN0aW9uIChhcyBpbiBHb29nbGUgQ2hyb21l
KS4KLSAgICBoYXNEdXBsaWNhdGUgPSBmYWxzZTsKLSAgICBbMCwgMF0uc29ydCggc29ydE9yZGVy
ICk7Ci0gICAgc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gaGFzRHVwbGljYXRlOwotCi0gICAg
cmV0dXJuIGRvY3VtZW50OworICAgIHJldHVybiBkb2M7CiB9OwogCiBTaXp6bGUubWF0Y2hlcyA9
IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHsKQEAgLTQzNjMsMjUgKzEzNzAsMjcgQEAgU2l6
emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7CiBTaXp6bGUubWF0Y2hl
c1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7CiAgICAgLy8gU2V0IGRvY3VtZW50
IHZhcnMgaWYgbmVlZGVkCiAgICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkg
IT09IGRvY3VtZW50ICkgewotICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgICAgIHNldERv
Y3VtZW50KCBlbGVtICk7CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRl
IHNlbGVjdG9ycyBhcmUgcXVvdGVkCiAgICAgZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0
ZVF1b3RlcywgIj0nJDEnXSIgKTsKIAotICAgIC8vIHJidWdneVFTQSBhbHdheXMgY29udGFpbnMg
OmZvY3VzLCBzbyBubyBuZWVkIGZvciBhbiBleGlzdGVuY2UgY2hlY2sKLSAgICBpZiAoIHN1cHBv
cnQubWF0Y2hlc1NlbGVjdG9yICYmICFkb2N1bWVudElzWE1MICYmICghcmJ1Z2d5TWF0Y2hlcyB8
fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KGV4cHIpKSAmJiAhcmJ1Z2d5UVNBLnRlc3QoZXhwcikgKSB7
Ci0gICAgdHJ5IHsKLSAgICB2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7Cisg
ICAgaWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJgorICAg
ICAgICAoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYm
CisgICAgICAgICggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSAp
IHsKIAotICAgIC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNj
b25uZWN0ZWQgbm9kZXMKLSAgICBpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNo
IHx8Ci0gICAgLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGlu
IGEgZG9jdW1lbnQKLSAgICAvLyBmcmFnbWVudCBpbiBJRSA5Ci0gICAgZWxlbS5kb2N1bWVudCAm
JiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKLSAgICByZXR1cm4gcmV0OwotICAg
IH0KLSAgICB9IGNhdGNoKGUpIHt9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgcmV0
ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7CisKKyAgICAgICAgICAgIC8vIElFIDkncyBt
YXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKKyAgICAg
ICAgICAgIGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHwKKyAgICAgICAg
ICAgICAgICAgICAgLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJl
IGluIGEgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJhZ21lbnQgaW4gSUUgOQor
ICAgICAgICAgICAgICAgICAgICBlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5
cGUgIT09IDExICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gY2F0Y2goZSkge30KICAgICB9CiAKICAgICByZXR1cm4gU2l6emxlKCBleHBy
LCBkb2N1bWVudCwgbnVsbCwgW2VsZW1dICkubGVuZ3RoID4gMDsKQEAgLTQzOTAsMTQ3ICsxMzk5
LDk4IEBAIFNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsK
IFNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkgewogICAgIC8vIFNl
dCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAogICAgIGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1l
bnQgfHwgY29udGV4dCApICE9PSBkb2N1bWVudCApIHsKLSAgICBzZXREb2N1bWVudCggY29udGV4
dCApOworICAgICAgICBzZXREb2N1bWVudCggY29udGV4dCApOwogICAgIH0KICAgICByZXR1cm4g
Y29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKIH07CiAKIFNpenpsZS5hdHRyID0gZnVuY3Rpb24o
IGVsZW0sIG5hbWUgKSB7Ci0gICAgdmFyIHZhbDsKLQogICAgIC8vIFNldCBkb2N1bWVudCB2YXJz
IGlmIG5lZWRlZAogICAgIGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBk
b2N1bWVudCApIHsKLSAgICBzZXREb2N1bWVudCggZWxlbSApOwotICAgIH0KLQotICAgIGlmICgg
IWRvY3VtZW50SXNYTUwgKSB7Ci0gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICB9
Ci0gICAgaWYgKCAodmFsID0gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0pICkgewotICAgIHJldHVy
biB2YWwoIGVsZW0gKTsKLSAgICB9Ci0gICAgaWYgKCBkb2N1bWVudElzWE1MIHx8IHN1cHBvcnQu
YXR0cmlidXRlcyApIHsKLSAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKLSAg
ICB9Ci0gICAgcmV0dXJuICggKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSB8
fCBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApICkgJiYgZWxlbVsgbmFtZSBdID09PSB0cnVlID8K
LSAgICBuYW1lIDoKLSAgICB2YWwgJiYgdmFsLnNwZWNpZmllZCA/IHZhbC52YWx1ZSA6IG51bGw7
CisgICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAgdmFyIGZuID0gRXhw
ci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSwKKyAgICAgICAgLy8gRG9uJ3QgZ2V0
IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCisg
ICAgICAgIHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9M
b3dlckNhc2UoKSApID8KKyAgICAgICAgICAgIGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hU
TUwgKSA6CisgICAgICAgICAgICB1bmRlZmluZWQ7CisKKyAgICByZXR1cm4gdmFsICE9PSB1bmRl
ZmluZWQgPworICAgICAgICB2YWwgOgorICAgICAgICBzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRv
Y3VtZW50SXNIVE1MID8KKyAgICAgICAgICAgIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOgor
ICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNw
ZWNpZmllZCA/CisgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoKKyAgICAgICAgICAgICAgICBu
dWxsOwogfTsKIAogU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKICAgICB0aHJvdyBu
ZXcgRXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgbXNn
ICk7CiB9OwogCi0vLyBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCisv
KioKKyAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXMKKyAqIEBwYXJh
bSB7QXJyYXlMaWtlfSByZXN1bHRzCisgKi8KIFNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24o
IHJlc3VsdHMgKSB7CiAgICAgdmFyIGVsZW0sCi0gICAgZHVwbGljYXRlcyA9IFtdLAotICAgIGkg
PSAxLAotICAgIGogPSAwOworICAgICAgICBkdXBsaWNhdGVzID0gW10sCisgICAgICAgIGogPSAw
LAorICAgICAgICBpID0gMDsKIAogICAgIC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVj
dCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKICAgICBoYXNEdXBsaWNhdGUgPSAh
c3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzOworICAgIHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRT
dGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApOwogICAgIHJlc3VsdHMuc29ydCggc29ydE9yZGVy
ICk7CiAKICAgICBpZiAoIGhhc0R1cGxpY2F0ZSApIHsKLSAgICBmb3IgKCA7IChlbGVtID0gcmVz
dWx0c1tpXSk7IGkrKyApIHsKLSAgICBpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7
Ci0gICAgaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwotICAgIH0KLSAgICB9Ci0gICAgd2hpbGUg
KCBqLS0gKSB7Ci0gICAgcmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApOwotICAg
IH0KKyAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CisgICAgICAgICAg
ICBpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsKKyAgICAgICAgICAgICAgICBqID0gZHVw
bGljYXRlcy5wdXNoKCBpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hp
bGUgKCBqLS0gKSB7CisgICAgICAgICAgICByZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBd
LCAxICk7CisgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0
aW5nIHRvIHJlbGVhc2Ugb2JqZWN0cworICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1
ZXJ5L3NpenpsZS9wdWxsLzIyNQorICAgIHNvcnRJbnB1dCA9IG51bGw7CisKICAgICByZXR1cm4g
cmVzdWx0czsKIH07CiAKLWZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKLSAgICB2YXIg
Y3VyID0gYiAmJiBhLAotICAgIGRpZmYgPSBjdXIgJiYgKCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhf
TkVHQVRJVkUgKSAtICggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7Ci0KLSAgICAv
LyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKLSAgICBpZiAo
IGRpZmYgKSB7Ci0gICAgcmV0dXJuIGRpZmY7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgYiBm
b2xsb3dzIGEKLSAgICBpZiAoIGN1ciApIHsKLSAgICB3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNp
YmxpbmcpICkgewotICAgIGlmICggY3VyID09PSBiICkgewotICAgIHJldHVybiAtMTsKLSAgICB9
Ci0gICAgfQotICAgIH0KLQotICAgIHJldHVybiBhID8gMSA6IC0xOwotfQotCi0vLyBSZXR1cm5z
IGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzCi1mdW5jdGlvbiBj
cmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7
Ci0gICAgdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgcmV0dXJu
IG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwotICAgIH07Ci19Ci0KLS8v
IFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwotZnVuY3Rp
b24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewotICAgIHJldHVybiBmdW5jdGlvbiggZWxl
bSApIHsKLSAgICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICBy
ZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIpICYmIGVsZW0udHlw
ZSA9PT0gdHlwZTsKLSAgICB9OwotfQotCi0vLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGlu
IHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCi1mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRv
KCBmbiApIHsKLSAgICByZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsK
LSAgICBhcmd1bWVudCA9ICthcmd1bWVudDsKLSAgICByZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0
aW9uKCBzZWVkLCBtYXRjaGVzICkgewotICAgIHZhciBqLAotICAgIG1hdGNoSW5kZXhlcyA9IGZu
KCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksCi0gICAgaSA9IG1hdGNoSW5kZXhlcy5sZW5n
dGg7Ci0KLSAgICAvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4
ZXMKLSAgICB3aGlsZSAoIGktLSApIHsKLSAgICBpZiAoIHNlZWRbIChqID0gbWF0Y2hJbmRleGVz
W2ldKSBdICkgewotICAgIHNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTsKLSAgICB9
Ci0gICAgfQotICAgIH0pOwotICAgIH0pOwotfQotCiAvKioKICAqIFV0aWxpdHkgZnVuY3Rpb24g
Zm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzCiAg
KiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW0KICAqLwogZ2V0VGV4dCA9IFNpenpsZS5nZXRU
ZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7CiAgICAgdmFyIG5vZGUsCi0gICAgcmV0ID0gIiIsCi0g
ICAgaSA9IDAsCi0gICAgbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlOworICAgICAgICByZXQgPSAi
IiwKKyAgICAgICAgaSA9IDAsCisgICAgICAgIG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKIAog
ICAgIGlmICggIW5vZGVUeXBlICkgewotICAgIC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4
cGVjdGVkIHRvIGJlIGFuIGFycmF5Ci0gICAgZm9yICggOyAobm9kZSA9IGVsZW1baV0pOyBpKysg
KSB7Ci0gICAgLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXMKLSAgICByZXQgKz0gZ2V0
VGV4dCggbm9kZSApOwotICAgIH0KKyAgICAgICAgLy8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMg
ZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkKKyAgICAgICAgd2hpbGUgKCAobm9kZSA9IGVsZW1baSsr
XSkgKSB7CisgICAgICAgICAgICAvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcworICAg
ICAgICAgICAgcmV0ICs9IGdldFRleHQoIG5vZGUgKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBp
ZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSAp
IHsKLSAgICAvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCi0gICAgLy8gaW5uZXJUZXh0
IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoc2VlICMxMTE1MykK
LSAgICBpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKLSAgICBy
ZXR1cm4gZWxlbS50ZXh0Q29udGVudDsKLSAgICB9IGVsc2UgewotICAgIC8vIFRyYXZlcnNlIGl0
cyBjaGlsZHJlbgotICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0g
PSBlbGVtLm5leHRTaWJsaW5nICkgewotICAgIHJldCArPSBnZXRUZXh0KCBlbGVtICk7Ci0gICAg
fQotICAgIH0KKyAgICAgICAgLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cworICAgICAg
ICAvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVz
IChqUXVlcnkgIzExMTUzKQorICAgICAgICBpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09
PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtLnRleHRDb250ZW50OworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCisgICAg
ICAgICAgICBmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5u
ZXh0U2libGluZyApIHsKKyAgICAgICAgICAgICAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSApOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMg
fHwgbm9kZVR5cGUgPT09IDQgKSB7Ci0gICAgcmV0dXJuIGVsZW0ubm9kZVZhbHVlOworICAgICAg
ICByZXR1cm4gZWxlbS5ub2RlVmFsdWU7CiAgICAgfQogICAgIC8vIERvIG5vdCBpbmNsdWRlIGNv
bW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwogCkBAIC00NTQ2LDI1MTUgKzE1
MDYsNDIxOCBAQCBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKIAogICAgIG1hdGNoOiBtYXRj
aEV4cHIsCiAKKyAgICBhdHRySGFuZGxlOiB7fSwKKwogICAgIGZpbmQ6IHt9LAogCiAgICAgcmVs
YXRpdmU6IHsKLSAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0sCi0g
ICAgIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sCi0gICAgIisiOiB7IGRpcjogInByZXZpb3Vz
U2libGluZyIsIGZpcnN0OiB0cnVlIH0sCi0gICAgIn4iOiB7IGRpcjogInByZXZpb3VzU2libGlu
ZyIgfQorICAgICAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0sCisg
ICAgICAgICIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAorICAgICAgICAiKyI6IHsgZGlyOiAi
cHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwKKyAgICAgICAgIn4iOiB7IGRpcjogInBy
ZXZpb3VzU2libGluZyIgfQogICAgIH0sCiAKICAgICBwcmVGaWx0ZXI6IHsKLSAgICAiQVRUUiI6
IGZ1bmN0aW9uKCBtYXRjaCApIHsKLSAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1
bmVzY2FwZSwgZnVuZXNjYXBlICk7CisgICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG1hdGNoICkg
eworICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1
bmVzY2FwZSApOworCisgICAgICAgICAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRj
aFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorICAgICAgICAgICAgbWF0Y2hbM10gPSAo
IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2Nh
cGUgKTsKKworICAgICAgICAgICAgaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKKyAgICAgICAg
ICAgICAgICBtYXRjaFszXSA9ICIgIiArIG1hdGNoWzNdICsgIiAiOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICByZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTsKKyAgICAgICAgfSwKKwor
ICAgICAgICAiQ0hJTEQiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisgICAgICAgICAgICAvKiBtYXRj
aGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCisgICAgICAgICAgICAgICAgMSB0eXBlIChvbmx5
fG50aHwuLi4pCisgICAgICAgICAgICAgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQorICAgICAg
ICAgICAgICAgIDMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCisg
ICAgICAgICAgICAgICAgNCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpu
fCkKKyAgICAgICAgICAgICAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50CisgICAgICAgICAgICAg
ICAgNiB4IG9mIHhuLWNvbXBvbmVudAorICAgICAgICAgICAgICAgIDcgc2lnbiBvZiB5LWNvbXBv
bmVudAorICAgICAgICAgICAgICAgIDggeSBvZiB5LWNvbXBvbmVudAorICAgICAgICAgICAgKi8K
KyAgICAgICAgICAgIG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKKworICAgICAg
ICAgICAgaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKyAgICAgICAg
ICAgICAgICAvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudAorICAgICAgICAgICAgICAgIGlmICgg
IW1hdGNoWzNdICkgeworICAgICAgICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoIG1hdGNoWzBd
ICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbnVtZXJpYyB4IGFu
ZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECisgICAgICAgICAgICAgICAgLy8g
cmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQorICAgICAg
ICAgICAgICAgIG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8
fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSAiZXZlbiIgfHwgbWF0Y2hbM10gPT09ICJvZGQiICkg
KTsKKyAgICAgICAgICAgICAgICBtYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSAp
IHx8IG1hdGNoWzNdID09PSAib2RkIiApOworCisgICAgICAgICAgICAvLyBvdGhlciB0eXBlcyBw
cm9oaWJpdCBhcmd1bWVudHMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewor
ICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcmV0dXJuIG1hdGNoOworICAgICAgICB9LAorCisgICAgICAgICJQU0VV
RE8iOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisgICAgICAgICAgICB2YXIgZXhjZXNzLAorICAgICAg
ICAgICAgICAgIHVucXVvdGVkID0gIW1hdGNoWzVdICYmIG1hdGNoWzJdOworCisgICAgICAgICAg
ICBpZiAoIG1hdGNoRXhwclsiQ0hJTEQiXS50ZXN0KCBtYXRjaFswXSApICkgeworICAgICAgICAg
ICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY2Nl
cHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcworICAgICAgICAgICAgaWYgKCBtYXRjaFszXSAmJiBt
YXRjaFs0XSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gbWF0
Y2hbNF07CisKKyAgICAgICAgICAgIC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5x
dW90ZWQgYXJndW1lbnRzCisgICAgICAgICAgICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNl
dWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAgICAgICAgICAgICAgICAvLyBHZXQgZXhjZXNzIGZy
b20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQorICAgICAgICAgICAgICAgIChleGNlc3MgPSB0b2tl
bml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRv
IHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXMKKyAgICAgICAgICAgICAgICAoZXhjZXNzID0g
dW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVv
dGVkLmxlbmd0aCkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2
ZSBpbmRleAorICAgICAgICAgICAgICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4
Y2VzcyApOworICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4
Y2VzcyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXR1cm4gb25seSBjYXB0
dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVu
dCkKKyAgICAgICAgICAgIHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApOworICAgICAgICB9Cisg
ICAgfSwKKworICAgIGZpbHRlcjogewogCi0gICAgLy8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8g
bWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWQKLSAgICBtYXRjaFszXSA9ICggbWF0
Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgIiIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSAp
OworICAgICAgICAiVEFHIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7CisgICAgICAg
ICAgICB2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwg
ZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlTmFtZVNl
bGVjdG9yID09PSAiKiIgPworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1
ZTsgfSA6CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2Uo
KSA9PT0gbm9kZU5hbWU7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfSwKKworICAgICAg
ICAiQ0xBU1MiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkgeworICAgICAgICAgICAgdmFyIHBhdHRl
cm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworICAgICAgICAgICAgcmV0dXJu
IHBhdHRlcm4gfHwKKyAgICAgICAgICAgICAgICAocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwi
ICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQp
IiApKSAmJgorICAgICAgICAgICAgICAgIGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVv
ZiBlbGVtLmNsYXNzTmFtZSA9PT0gInN0cmluZyIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9m
IGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUo
ImNsYXNzIikgfHwgIiIgKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwKKworICAg
ICAgICAiQVRUUiI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7CisgICAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3Vs
dCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHJl
c3VsdCA9PSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3IgPT09
ICIhPSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggIW9wZXJhdG9y
ICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiI7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOgorICAgICAgICAgICAgICAg
ICAgICBvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgorICAgICAgICAgICAg
ICAgICAgICBvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVj
ayApID09PSAwIDoKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09ICIqPSIgPyBjaGVj
ayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKyAgICAgICAgICAgICAgICAgICAg
b3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGgg
KSA9PT0gY2hlY2sgOgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gIn49IiA/ICgg
IiAiICsgcmVzdWx0ICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKyAgICAgICAgICAg
ICAgICAgICAgb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5z
bGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArICItIiA6CisgICAgICAgICAg
ICAgICAgICAgIGZhbHNlOworICAgICAgICAgICAgfTsKKyAgICAgICAgfSwKKworICAgICAgICAi
Q0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewor
ICAgICAgICAgICAgdmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gIm50aCIsCisg
ICAgICAgICAgICAgICAgZm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09ICJsYXN0IiwKKyAg
ICAgICAgICAgICAgICBvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CisKKyAgICAgICAgICAg
IHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KKworICAgICAgICAgICAgICAgIC8v
IFNob3J0Y3V0IGZvciA6bnRoLSoobikKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOworICAgICAg
ICAgICAgICAgIH0gOgorCisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQs
IHhtbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2Rl
LCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0g
c2ltcGxlICE9PSBmb3J3YXJkID8gIm5leHRTaWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAor
ICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJD
YXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlw
ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmVudCApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBzaW1wbGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd2hpbGUgKCBkaXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUgPSBlbGVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChub2Rl
ID0gbm9kZVsgZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2Rl
Lm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4n
dCB5ZXQgZG9uZSBzbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBk
aXIgPSB0eXBlID09PSAib25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICBzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RD
aGlsZCBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24teG1sIDpudGgtY2hpbGQo
Li4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAorICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG91dGVyQ2FjaGUgPSBwYXJlbnRbIGV4cGFuZG8gXSB8fCAo
cGFyZW50WyBleHBhbmRvIF0gPSB7fSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fj
aGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hl
WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlSW5kZXggJiYgcGFy
ZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBzZWVraW5n
IGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
ZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJl
bnRgIGFuZCBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5vZGUu
bm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMs
IG5vZGVJbmRleCwgZGlmZiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2aW91
c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8
fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVu
cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gY2FjaGVbMV07CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0
LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQorICAgICAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhl
IHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2Rl
ICYmIG5vZGVbIGRpciBdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZm
ID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgeworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNl
KCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2gg
ZW5jb3VudGVyZWQgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCB1c2VDYWNoZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0gPSBb
IGRpcnJ1bnMsIGRpZmYgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBub2RlID09PSBlbGVt
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNvcnBvcmF0ZSB0
aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorICAgICAgICAgICAgICAg
ICAgICAgICAgZGlmZiAtPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRp
ZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAw
ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9
LAorCisgICAgICAgICJQU0VVRE8iOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHsKKyAg
ICAgICAgICAgIC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorICAg
ICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nl
cworICAgICAgICAgICAgLy8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2Ug
Y3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnMKKyAgICAgICAg
ICAgIC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKKyAg
ICAgICAgICAgIHZhciBhcmdzLAorICAgICAgICAgICAgICAgIGZuID0gRXhwci5wc2V1ZG9zWyBw
c2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHwKKyAg
ICAgICAgICAgICAgICAgICAgU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsg
cHNldWRvICk7CisKKyAgICAgICAgICAgIC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRv
IHRvIGluZGljYXRlIHRoYXQKKyAgICAgICAgICAgIC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRv
IGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBqdXN0IGFzIFNpenps
ZSBkb2VzCisgICAgICAgICAgICBpZiAoIGZuWyBleHBhbmRvIF0gKSB7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZuKCBhcmd1bWVudCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAv
LyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKKyAgICAgICAgICAgIGlm
ICggZm4ubGVuZ3RoID4gMSApIHsKKyAgICAgICAgICAgICAgICBhcmdzID0gWyBwc2V1ZG8sIHBz
ZXVkbywgIiIsIGFyZ3VtZW50IF07CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4cHIuc2V0Rmls
dGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/CisgICAgICAgICAg
ICAgICAgICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHZhciBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGkgPSBtYXRjaGVkLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgg
aS0tICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGluZGV4T2YuY2FsbCgg
c2VlZCwgbWF0Y2hlZFtpXSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWRbIGlk
eCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pIDoKKyAgICAgICAgICAgICAgICAgICAg
ZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oIGVs
ZW0sIDAsIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgcmV0dXJuIGZuOworICAgICAgICB9CisgICAgfSwKIAotICAgIGlmICggbWF0
Y2hbMl0gPT09ICJ+PSIgKSB7Ci0gICAgbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsK
KyAgICBwc2V1ZG9zOiB7CisgICAgICAgIC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvcwor
ICAgICAgICAibm90IjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICAg
ICAgICAgIC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCisgICAgICAgICAg
ICAvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZworICAgICAgICAgICAg
Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzCisgICAgICAgICAgICB2YXIgaW5wdXQgPSBbXSwKKyAg
ICAgICAgICAgICAgICByZXN1bHRzID0gW10sCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IGNv
bXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICkgKTsKKworICAgICAgICAgICAg
cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/CisgICAgICAgICAgICAgICAgbWFya0Z1bmN0aW9u
KGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHZhciBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXRjaGVkID0gbWF0
Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgaSA9
IHNlZWQubGVuZ3RoOworCisgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIGVsZW1lbnRzIHVu
bWF0Y2hlZCBieSBgbWF0Y2hlcmAKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxl
bSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9KSA6CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRl
eHQsIHhtbCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRbMF0gPSBlbGVtOworICAgICAg
ICAgICAgICAgICAgICBtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiAhcmVzdWx0cy5wb3AoKTsKKyAgICAgICAgICAgICAgICB9
OworICAgICAgICB9KSwKKworICAgICAgICAiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBz
ZWxlY3RvciApIHsKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7Cisg
ICAgICAgICAgICB9OworICAgICAgICB9KSwKKworICAgICAgICAiY29udGFpbnMiOiBtYXJrRnVu
Y3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVt
LmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTsKKyAg
ICAgICAgICAgIH07CisgICAgICAgIH0pLAorCisgICAgICAgIC8vICJXaGV0aGVyIGFuIGVsZW1l
bnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCisgICAgICAgIC8vIGlzIGJh
c2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlCisgICAgICAgIC8vIGJl
aW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsCisgICAgICAgIC8vIG9yIGJlZ2lubmluZyB3
aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgorICAgICAg
ICAvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFs
dWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS4KKyAgICAgICAgLy8gVGhlIGlkZW50
aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS4iCisgICAg
ICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KKyAgICAg
ICAgImxhbmciOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkgeworICAgICAgICAgICAg
Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgorICAgICAgICAgICAgaWYg
KCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKKyAgICAgICAgICAgICAgICBTaXp6
bGUuZXJyb3IoICJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgbGFuZyApOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50
b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAg
ICAgICAgICAgICAgIHZhciBlbGVtTGFuZzsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAg
ICAgICAgICAgICAgIGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgPworICAgICAgICAg
ICAgICAgICAgICAgICAgZWxlbS5sYW5nIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0u
Z2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJD
YXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcg
fHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2Rl
KSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgfTsKKyAgICAgICAgfSksCisKKyAgICAgICAgLy8gTWlzY2VsbGFuZW91
cworICAgICAgICAidGFyZ2V0IjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICB2YXIg
aGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKKyAgICAgICAg
ICAgIHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDsKKyAgICAgICAg
fSwKKworICAgICAgICAicm9vdCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgcmV0
dXJuIGVsZW0gPT09IGRvY0VsZW07CisgICAgICAgIH0sCisKKyAgICAgICAgImZvY3VzIjogZnVu
Y3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0
aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkp
ICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOworICAgICAg
ICB9LAorCisgICAgICAgIC8vIEJvb2xlYW4gcHJvcGVydGllcworICAgICAgICAiZW5hYmxlZCI6
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09
IGZhbHNlOworICAgICAgICB9LAorCisgICAgICAgICJkaXNhYmxlZCI6IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisgICAgICAg
IH0sCisKKyAgICAgICAgImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAg
IC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxl
Y3RlZCBlbGVtZW50cworICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9S
RUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKyAgICAgICAgICAgIHZhciBub2Rl
TmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiAo
bm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0g
Im9wdGlvbiIgJiYgISFlbGVtLnNlbGVjdGVkKTsKKyAgICAgICAgfSwKKworICAgICAgICAic2Vs
ZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIC8vIEFjY2Vzc2luZyB0aGlz
IHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKKyAgICAgICAgICAgIC8vIG9wdGlv
bnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKKyAgICAgICAgICAgIGlmICggZWxlbS5wYXJlbnRO
b2RlICkgeworICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4Owor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1
ZTsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBDb250ZW50cworICAgICAgICAiZW1wdHkiOiBm
dW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3Nl
bGVjdG9ycy8jZW1wdHktcHNldWRvCisgICAgICAgICAgICAvLyA6ZW1wdHkgaXMgbmVnYXRlZCBi
eSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5
IHJlZjogNSksCisgICAgICAgICAgICAvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4
OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQorICAgICAgICAgICAgLy8gbm9kZVR5
cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGls
ZHJlbgorICAgICAgICAgICAgZm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxl
bSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVU
eXBlIDwgNiApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9LAorCisgICAgICAgICJwYXJlbnQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAg
IHJldHVybiAhRXhwci5wc2V1ZG9zWyJlbXB0eSJdKCBlbGVtICk7CisgICAgICAgIH0sCisKKyAg
ICAgICAgLy8gRWxlbWVudC9pbnB1dCB0eXBlcworICAgICAgICAiaGVhZGVyIjogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgICAgICAgICByZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1l
ICk7CisgICAgICAgIH0sCisKKyAgICAgICAgImlucHV0IjogZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgICAgICAgICByZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisgICAgICAg
IH0sCisKKyAgICAgICAgImJ1dHRvbiI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAg
dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICByZXR1
cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09
ICJidXR0b24iOworICAgICAgICB9LAorCisgICAgICAgICJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgICAgICAgICB2YXIgYXR0cjsKKyAgICAgICAgICAgIHJldHVybiBlbGVtLm5vZGVO
YW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKKyAgICAgICAgICAgICAgICBlbGVtLnR5
cGUgPT09ICJ0ZXh0IiAmJgorCisgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUU8OAorICAg
ICAgICAgICAgICAgIC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCAic2VhcmNo
IikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSAidGV4dCIKKyAgICAgICAgICAgICAgICAoIChh
dHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJD
YXNlKCkgPT09ICJ0ZXh0IiApOworICAgICAgICB9LAorCisgICAgICAgIC8vIFBvc2l0aW9uLWlu
LWNvbGxlY3Rpb24KKyAgICAgICAgImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5j
dGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBbIDAgXTsKKyAgICAgICAgfSksCisKKyAgICAg
ICAgImxhc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMs
IGxlbmd0aCApIHsKKyAgICAgICAgICAgIHJldHVybiBbIGxlbmd0aCAtIDEgXTsKKyAgICAgICAg
fSksCisKKyAgICAgICAgImVxIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0
Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAgICAgICAgICAgcmV0dXJuIFsgYXJn
dW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOworICAgICAgICB9KSwK
KworICAgICAgICAiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNo
SW5kZXhlcywgbGVuZ3RoICkgeworICAgICAgICAgICAgdmFyIGkgPSAwOworICAgICAgICAgICAg
Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hJbmRl
eGVzLnB1c2goIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXRjaElu
ZGV4ZXM7CisgICAgICAgIH0pLAorCisgICAgICAgICJvZGQiOiBjcmVhdGVQb3NpdGlvbmFsUHNl
dWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKKyAgICAgICAgICAgIHZhciBp
ID0gMTsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgeworICAgICAg
ICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOworICAgICAgICB9KSwKKworICAgICAgICAibHQiOiBj
cmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJn
dW1lbnQgKSB7CisgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsg
bGVuZ3RoIDogYXJndW1lbnQ7CisgICAgICAgICAgICBmb3IgKCA7IC0taSA+PSAwOyApIHsKKyAg
ICAgICAgICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKKyAgICAgICAgfSksCisKKyAgICAgICAgImd0
IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgs
IGFyZ3VtZW50ICkgeworICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVu
dCArIGxlbmd0aCA6IGFyZ3VtZW50OworICAgICAgICAgICAgZm9yICggOyArK2kgPCBsZW5ndGg7
ICkgeworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOworICAgICAgICB9KQogICAgIH0K
K307CiAKLSAgICByZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTsKLSAgICB9LAorRXhwci5wc2V1
ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKKworLy8gQWRkIGJ1dHRvbi9pbnB1dCB0
eXBlIHBzZXVkb3MKK2ZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZp
bGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgeworICAgIEV4cHIucHNl
dWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTsKK30KK2ZvciAoIGkgaW4geyBzdWJt
aXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CisgICAgRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVh
dGVCdXR0b25Qc2V1ZG8oIGkgKTsKK30KIAotICAgICJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCAp
IHsKLSAgICAvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCi0gICAgMSB0eXBlIChv
bmx5fG50aHwuLi4pCi0gICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQotICAgIDMgYXJndW1lbnQg
KGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCi0gICAgNCB4bi1jb21wb25lbnQgb2Yg
eG4reSBhcmd1bWVudCAoWystXT9cZCpufCkKLSAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50Ci0g
ICAgNiB4IG9mIHhuLWNvbXBvbmVudAotICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAotICAgIDgg
eSBvZiB5LWNvbXBvbmVudAotICAgICovCi0gICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2Vy
Q2FzZSgpOworLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzCitmdW5jdGlv
biBzZXRGaWx0ZXJzKCkge30KK3NldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0g
RXhwci5wc2V1ZG9zOworRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTsKKworZnVu
Y3Rpb24gdG9rZW5pemUoIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7CisgICAgdmFyIG1hdGNoZWQs
IG1hdGNoLCB0b2tlbnMsIHR5cGUsCisgICAgICAgIHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMs
CisgICAgICAgIGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CiAKLSAgICBp
ZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09ICJudGgiICkgewotICAgIC8vIG50aC0qIHJl
cXVpcmVzIGFyZ3VtZW50Ci0gICAgaWYgKCAhbWF0Y2hbM10gKSB7Ci0gICAgU2l6emxlLmVycm9y
KCBtYXRjaFswXSApOworICAgIGlmICggY2FjaGVkICkgeworICAgICAgICByZXR1cm4gcGFyc2VP
bmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwogICAgIH0KIAotICAgIC8vIG51bWVyaWMgeCBh
bmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRAotICAgIC8vIHJlbWVtYmVyIHRo
YXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzEKLSAgICBtYXRjaFs0XSA9ICso
IG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9
PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7Ci0gICAgbWF0Y2hbNV0gPSArKCAo
IG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKTsKKyAgICBzb0Zh
ciA9IHNlbGVjdG9yOworICAgIGdyb3VwcyA9IFtdOworICAgIHByZUZpbHRlcnMgPSBFeHByLnBy
ZUZpbHRlcjsKKworICAgIHdoaWxlICggc29GYXIgKSB7CiAKLSAgICAvLyBvdGhlciB0eXBlcyBw
cm9oaWJpdCBhcmd1bWVudHMKLSAgICB9IGVsc2UgaWYgKCBtYXRjaFszXSApIHsKLSAgICBTaXp6
bGUuZXJyb3IoIG1hdGNoWzBdICk7CisgICAgICAgIC8vIENvbW1hIGFuZCBmaXJzdCBydW4KKyAg
ICAgICAgaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7
CisgICAgICAgICAgICBpZiAoIG1hdGNoICkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGNv
bnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkCisgICAgICAgICAgICAgICAgc29GYXIgPSBz
b0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApOworICAgICAgICB9CisKKyAg
ICAgICAgbWF0Y2hlZCA9IGZhbHNlOworCisgICAgICAgIC8vIENvbWJpbmF0b3JzCisgICAgICAg
IGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkgeworICAgICAgICAg
ICAgbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CisgICAgICAgICAgICB0b2tlbnMucHVzaCh7Cisg
ICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoZWQsCisgICAgICAgICAgICAgICAgLy8gQ2FzdCBk
ZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCisgICAgICAgICAgICAgICAgdHlwZTogbWF0
Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAg
IHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBGaWx0ZXJzCisgICAgICAgIGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7Cisg
ICAgICAgICAgICBpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkp
ICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8CisgICAgICAgICAgICAgICAgKG1hdGNoID0gcHJl
RmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZCA9
IG1hdGNoLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeworICAgICAgICAg
ICAgICAgICAgICB2YWx1ZTogbWF0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlw
ZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlczogbWF0Y2gKKyAgICAgICAgICAgICAgICB9
KTsKKyAgICAgICAgICAgICAgICBzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCAp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhbWF0Y2hlZCApIHsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1hdGNo
OwotICAgIH0sCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNz
CisgICAgLy8gaWYgd2UncmUganVzdCBwYXJzaW5nCisgICAgLy8gT3RoZXJ3aXNlLCB0aHJvdyBh
biBlcnJvciBvciByZXR1cm4gdG9rZW5zCisgICAgcmV0dXJuIHBhcnNlT25seSA/CisgICAgICAg
IHNvRmFyLmxlbmd0aCA6CisgICAgICAgIHNvRmFyID8KKyAgICAgICAgICAgIFNpenpsZS5lcnJv
ciggc2VsZWN0b3IgKSA6CisgICAgICAgICAgICAvLyBDYWNoZSB0aGUgdG9rZW5zCisgICAgICAg
ICAgICB0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK30KKworZnVu
Y3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkgeworICAgIHZhciBpID0gMCwKKyAgICAgICAgbGVu
ID0gdG9rZW5zLmxlbmd0aCwKKyAgICAgICAgc2VsZWN0b3IgPSAiIjsKKyAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKKyAgICAgICAgc2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlOworICAg
IH0KKyAgICByZXR1cm4gc2VsZWN0b3I7Cit9CisKK2Z1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1h
dGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7CisgICAgdmFyIGRpciA9IGNvbWJpbmF0b3IuZGly
LAorICAgICAgICBjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09ICJwYXJlbnROb2Rl
IiwKKyAgICAgICAgZG9uZU5hbWUgPSBkb25lKys7CisKKyAgICByZXR1cm4gY29tYmluYXRvci5m
aXJzdCA/CisgICAgICAgIC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRp
bmcgZWxlbWVudAorICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAg
ICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKyAgICAgICAgICAgICAg
ICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSA6CisKKyAgICAgICAgLy8g
Q2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzCisgICAgICAgIGZ1
bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICB2YXIgb2xkQ2FjaGUs
IG91dGVyQ2FjaGUsCisgICAgICAgICAgICAgICAgbmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVO
YW1lIF07CisKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBY
TUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nCisgICAgICAg
ICAgICBpZiAoIHhtbCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIChlbGVtID0gZWxlbVsg
ZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEg
fHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWF0
Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CisgICAgICAgICAgICAg
ICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAo
ZWxlbVsgZXhwYW5kbyBdID0ge30pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAob2xk
Q2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1l
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIHRvIG5ld0NhY2hl
IHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBd
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBw
cmV2aW91cyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyQ2FjaGVb
IGRpciBdID0gbmV3Q2FjaGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1h
dGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tp
bmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0
Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CisKK2Z1bmN0aW9uIGVsZW1lbnRN
YXRjaGVyKCBtYXRjaGVycyApIHsKKyAgICByZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/Cisg
ICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICB2YXIg
aSA9IG1hdGNoZXJzLmxlbmd0aDsKKyAgICAgICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAg
ICAgICAgICAgIGlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IDoKKyAgICAgICAg
bWF0Y2hlcnNbMF07Cit9CisKK2Z1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmls
dGVyLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGVsZW0sCisgICAgICAgIG5ld1VubWF0Y2hl
ZCA9IFtdLAorICAgICAgICBpID0gMCwKKyAgICAgICAgbGVuID0gdW5tYXRjaGVkLmxlbmd0aCwK
KyAgICAgICAgbWFwcGVkID0gbWFwICE9IG51bGw7CisKKyAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKKyAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CisgICAgICAgICAg
ICBpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICAg
ICAgICAgICAgICBuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApOworICAgICAgICAgICAgICAgIGlm
ICggbWFwcGVkICkgeworICAgICAgICAgICAgICAgICAgICBtYXAucHVzaCggaSApOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVy
biBuZXdVbm1hdGNoZWQ7Cit9CisKK2Z1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2Vs
ZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHsK
KyAgICBpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHsKKyAgICAg
ICAgcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKKyAgICB9CisgICAgaWYg
KCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7CisgICAgICAgIHBvc3RG
aW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwg
eG1sICkgeworICAgICAgICB2YXIgdGVtcCwgaSwgZWxlbSwKKyAgICAgICAgICAgIHByZU1hcCA9
IFtdLAorICAgICAgICAgICAgcG9zdE1hcCA9IFtdLAorICAgICAgICAgICAgcHJlZXhpc3Rpbmcg
PSByZXN1bHRzLmxlbmd0aCwKKworICAgICAgICAgICAgLy8gR2V0IGluaXRpYWwgZWxlbWVudHMg
ZnJvbSBzZWVkIG9yIGNvbnRleHQKKyAgICAgICAgICAgIGVsZW1zID0gc2VlZCB8fCBtdWx0aXBs
ZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQg
XSA6IGNvbnRleHQsIFtdICksCisKKyAgICAgICAgICAgIC8vIFByZWZpbHRlciB0byBnZXQgbWF0
Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXph
dGlvbgorICAgICAgICAgICAgbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2Vs
ZWN0b3IgKSA/CisgICAgICAgICAgICAgICAgY29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZp
bHRlciwgY29udGV4dCwgeG1sICkgOgorICAgICAgICAgICAgICAgIGVsZW1zLAorCisgICAgICAg
ICAgICBtYXRjaGVyT3V0ID0gbWF0Y2hlciA/CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2
ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIg
b3IgcHJlZXhpc3RpbmcgcmVzdWx0cywKKyAgICAgICAgICAgICAgICBwb3N0RmluZGVyIHx8ICgg
c2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CisKKyAgICAg
ICAgICAgICAgICAgICAgLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5
CisgICAgICAgICAgICAgICAgICAgIFtdIDoKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi5v
dGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0
cyA6CisgICAgICAgICAgICAgICAgbWF0Y2hlckluOworCisgICAgICAgIC8vIEZpbmQgcHJpbWFy
eSBtYXRjaGVzCisgICAgICAgIGlmICggbWF0Y2hlciApIHsKKyAgICAgICAgICAgIG1hdGNoZXIo
IG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBBcHBseSBwb3N0RmlsdGVyCisgICAgICAgIGlmICggcG9zdEZpbHRlciApIHsKKyAg
ICAgICAgICAgIHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOworICAgICAg
ICAgICAgcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApOworCisgICAgICAgICAg
ICAvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0
Y2hlckluCisgICAgICAgICAgICBpID0gdGVtcC5sZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAo
IGktLSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7CisgICAg
ICAgICAgICAgICAgICAgIG1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBw
b3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIHNlZWQgKSB7CisgICAgICAgICAgICBpZiAoIHBvc3RG
aW5kZXIgfHwgcHJlRmlsdGVyICkgeworICAgICAgICAgICAgICAgIGlmICggcG9zdEZpbmRlciAp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNv
bmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzCisgICAg
ICAgICAgICAgICAgICAgIHRlbXAgPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IG1hdGNo
ZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlz
IG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAu
cHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zdEZpbmRlcigg
bnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8g
cmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkCisgICAgICAgICAgICAgICAgaSA9IG1h
dGNoZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiYKKyAgICAgICAgICAg
ICAgICAgICAgICAgICh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxl
bSApIDogcHJlTWFwW2ldKSA+IC0xICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzZWVk
W3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGVsZW1l
bnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkCisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBtYXRjaGVyT3V0ID0gY29uZGVuc2UoCisgICAgICAgICAgICAg
ICAgbWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJP
dXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CisgICAgICAgICAg
ICAgICAgICAgIG1hdGNoZXJPdXQKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoIHBv
c3RGaW5kZXIgKSB7CisgICAgICAgICAgICAgICAgcG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywg
bWF0Y2hlck91dCwgeG1sICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0pOworfQogCi0gICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKLSAg
ICB2YXIgZXhjZXNzLAotICAgIHVucXVvdGVkID0gIW1hdGNoWzVdICYmIG1hdGNoWzJdOworZnVu
Y3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKKyAgICB2YXIgY2hlY2tDb250ZXh0
LCBtYXRjaGVyLCBqLAorICAgICAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAorICAgICAgICBsZWFk
aW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAorICAgICAgICBp
bXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwK
KyAgICAgICAgaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAorCisgICAgICAgIC8vIFRoZSBm
b3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBm
cm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCisgICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENvbWJp
bmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGNo
ZWNrQ29udGV4dDsKKyAgICAgICAgfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAorICAgICAg
ICBtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7
CisgICAgICAgIH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKKyAgICAgICAgbWF0Y2hlcnMg
PSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICByZXR1cm4g
KCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRl
eHQgKSApIHx8ICgKKyAgICAgICAgICAgICAgICAoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9k
ZVR5cGUgPworICAgICAgICAgICAgICAgICAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQs
IHhtbCApIDoKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250
ZXh0LCB4bWwgKSApOworICAgICAgICB9IF07CiAKLSAgICBpZiAoIG1hdGNoRXhwclsiQ0hJTEQi
XS50ZXN0KCBtYXRjaFswXSApICkgewotICAgIHJldHVybiBudWxsOworICAgIGZvciAoIDsgaSA8
IGxlbjsgaSsrICkgeworICAgICAgICBpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9r
ZW5zW2ldLnR5cGUgXSkgKSB7CisgICAgICAgICAgICBtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRv
cihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5h
cHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsKKworICAgICAgICAgICAgLy8gUmV0dXJu
IHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXIKKyAgICAgICAgICAgIGlm
ICggbWF0Y2hlclsgZXhwYW5kbyBdICkgeworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5l
eHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZworICAgICAg
ICAgICAgICAgIGogPSArK2k7CisgICAgICAgICAgICAgICAgZm9yICggOyBqIDwgbGVuOyBqKysg
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5
cGUgXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzZXRNYXRj
aGVyKAorICAgICAgICAgICAgICAgICAgICBpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hl
cnMgKSwKKyAgICAgICAgICAgICAgICAgICAgaSA+IDEgJiYgdG9TZWxlY3RvcigKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFu
dCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgCisgICAgICAg
ICAgICAgICAgICAgICAgICB0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6
IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSAiICIgPyAiKiIgOiAiIiB9KQorICAgICAgICAgICAg
ICAgICAgICApLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCisgICAgICAgICAgICAgICAgICAgIG1h
dGNoZXIsCisgICAgICAgICAgICAgICAgICAgIGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0
b2tlbnMuc2xpY2UoIGksIGogKSApLAorICAgICAgICAgICAgICAgICAgICBqIDwgbGVuICYmIG1h
dGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCisgICAgICAg
ICAgICAgICAgICAgIGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zICkKKyAgICAgICAgICAg
ICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlcnMucHVzaCggbWF0Y2hl
ciApOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMg
YXMtaXMKLSAgICBpZiAoIG1hdGNoWzRdICkgewotICAgIG1hdGNoWzJdID0gbWF0Y2hbNF07Cisg
ICAgcmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRj
aGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7Cisg
ICAgdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKKyAgICAgICAgYnlFbGVtZW50
ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsCisgICAgICAgIHN1cGVyTWF0Y2hlciA9IGZ1
bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgIHZhciBlbGVtLCBqLCBtYXRjaGVyLAorICAgICAgICAgICAgICAgIG1hdGNoZWRDb3Vu
dCA9IDAsCisgICAgICAgICAgICAgICAgaSA9ICIwIiwKKyAgICAgICAgICAgICAgICB1bm1hdGNo
ZWQgPSBzZWVkICYmIFtdLAorICAgICAgICAgICAgICAgIHNldE1hdGNoZWQgPSBbXSwKKyAgICAg
ICAgICAgICAgICBjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAgICAgICAg
ICAgICAvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVy
bW9zdCBjb250ZXh0CisgICAgICAgICAgICAgICAgZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAm
JiBFeHByLmZpbmRbIlRBRyJdKCAiKiIsIG91dGVybW9zdCApLAorICAgICAgICAgICAgICAgIC8v
IFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisg
ICAgICAgICAgICAgICAgZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAg
PT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCisgICAgICAgICAgICAgICAgbGVu
ID0gZWxlbXMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgICAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29u
dGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnRzIHBhc3Np
bmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKKyAgICAgICAgICAgIC8vIEtl
ZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50
YCB3aWxsIGJlICIwMCIgYmVsb3cKKyAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFPDksIFNhZmFy
aQorICAgICAgICAgICAgLy8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6ICJsZW5n
dGgiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZAorICAgICAgICAg
ICAgZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkg
eworICAgICAgICAgICAgICAgIGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7CisgICAgICAgICAg
ICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChtYXRjaGVyID0g
ZWxlbWVudE1hdGNoZXJzW2orK10pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBt
YXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhY2sgdW5tYXRjaGVkIGVs
ZW1lbnRzIGZvciBzZXQgZmlsdGVycworICAgICAgICAgICAgICAgIGlmICggYnlTZXQgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9z
c2libGUgbWF0Y2hlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9ICFtYXRjaGVy
ICYmIGVsZW0pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZENvdW50LS07Cisg
ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBMZW5ndGhlbiB0
aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CisgICAgICAgICAgICAg
ICAgICAgIGlmICggc2VlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5w
dXNoKCBlbGVtICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0
Y2hlZCBlbGVtZW50cworICAgICAgICAgICAgbWF0Y2hlZENvdW50ICs9IGk7CisgICAgICAgICAg
ICBpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHsKKyAgICAgICAgICAgICAgICBq
ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisr
XSkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hl
ZCwgY29udGV4dCwgeG1sICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
aWYgKCBzZWVkICkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZWludGVncmF0ZSBlbGVtZW50
IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nCisgICAgICAgICAgICAg
ICAgICAgIGlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISh1bm1h
dGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5kZXggcGxhY2Vo
b2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzCisgICAgICAgICAgICAgICAg
ICAgIHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKKyAgICAgICAg
ICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7CisKKyAgICAgICAgICAg
ICAgICAvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3Nm
dWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKKyAgICAgICAgICAgICAgICBpZiAoIG91dGVy
bW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiYKKyAgICAgICAgICAgICAg
ICAgICAgKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE92ZXJyaWRlIG1hbmlw
dWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVycworICAgICAgICAgICAgaWYgKCBv
dXRlcm1vc3QgKSB7CisgICAgICAgICAgICAgICAgZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7Cisg
ICAgICAgICAgICAgICAgb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB1bm1hdGNoZWQ7CisgICAgICAgIH07CiAKLSAg
ICAvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50cwotICAg
IH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgotICAg
IC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpCi0gICAgKGV4Y2VzcyA9
IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJgotICAgIC8vIGFkdmFuY2UgdG8gdGhlIG5l
eHQgY2xvc2luZyBwYXJlbnRoZXNpcwotICAgIChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCAi
KSIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoKSApIHsKKyAg
ICByZXR1cm4gYnlTZXQgPworICAgICAgICBtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoK
KyAgICAgICAgc3VwZXJNYXRjaGVyOworfQorCitjb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBm
dW5jdGlvbiggc2VsZWN0b3IsIGdyb3VwIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgeworICAg
IHZhciBpLAorICAgICAgICBzZXRNYXRjaGVycyA9IFtdLAorICAgICAgICBlbGVtZW50TWF0Y2hl
cnMgPSBbXSwKKyAgICAgICAgY2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyAiICIg
XTsKIAotICAgIC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4Ci0gICAgbWF0Y2hbMF0gPSBt
YXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7Ci0gICAgbWF0Y2hbMl0gPSB1bnF1b3RlZC5zbGlj
ZSggMCwgZXhjZXNzICk7CisgICAgaWYgKCAhY2FjaGVkICkgeworICAgICAgICAvLyBHZW5lcmF0
ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBj
aGVjayBlYWNoIGVsZW1lbnQKKyAgICAgICAgaWYgKCAhZ3JvdXAgKSB7CisgICAgICAgICAgICBn
cm91cCA9IHRva2VuaXplKCBzZWxlY3RvciApOworICAgICAgICB9CisgICAgICAgIGkgPSBncm91
cC5sZW5ndGg7CisgICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgY2FjaGVkID0g
bWF0Y2hlckZyb21Ub2tlbnMoIGdyb3VwW2ldICk7CisgICAgICAgICAgICBpZiAoIGNhY2hlZFsg
ZXhwYW5kbyBdICkgeworICAgICAgICAgICAgICAgIHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCAp
OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50TWF0Y2hlcnMu
cHVzaCggY2FjaGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBD
YWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KKyAgICAgICAgY2FjaGVkID0gY29tcGlsZXJDYWNo
ZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBz
ZXRNYXRjaGVycyApICk7CiAgICAgfQorICAgIHJldHVybiBjYWNoZWQ7Cit9OwogCi0gICAgLy8g
UmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAo
dHlwZSBhbmQgYXJndW1lbnQpCi0gICAgcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CitmdW5j
dGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7Cisg
ICAgdmFyIGkgPSAwLAorICAgICAgICBsZW4gPSBjb250ZXh0cy5sZW5ndGg7CisgICAgZm9yICgg
OyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ld
LCByZXN1bHRzICk7CiAgICAgfQotICAgIH0sCisgICAgcmV0dXJuIHJlc3VsdHM7Cit9CiAKLSAg
ICBmaWx0ZXI6IHsKK2Z1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMs
IHNlZWQgKSB7CisgICAgdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCisgICAgICAg
IG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CiAKLSAgICAiVEFHIjogZnVuY3Rpb24oIG5v
ZGVOYW1lICkgewotICAgIGlmICggbm9kZU5hbWUgPT09ICIqIiApIHsKLSAgICByZXR1cm4gZnVu
Y3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OworICAgIGlmICggIXNlZWQgKSB7CisgICAgICAgIC8v
IFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwCisg
ICAgICAgIGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgeworCisgICAgICAgICAgICAvLyBUYWtl
IGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBh
biBJRAorICAgICAgICAgICAgdG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCAp
OworICAgICAgICAgICAgaWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNb
MF0pLnR5cGUgPT09ICJJRCIgJiYKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5nZXRCeUlk
ICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYKKyAgICAgICAg
ICAgICAgICAgICAgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsKKworICAgICAg
ICAgICAgICAgIGNvbnRleHQgPSAoIEV4cHIuZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hlc1swXS5y
ZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07CisgICAg
ICAgICAgICAgICAgaWYgKCAhY29udGV4dCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGVjdG9yID0g
c2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0
IG1hdGNoaW5nCisgICAgICAgICAgICBpID0gbWF0Y2hFeHByWyJuZWVkc0NvbnRleHQiXS50ZXN0
KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAoIGkt
LSApIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTsKKworICAgICAgICAgICAg
ICAgIC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3IKKyAgICAgICAgICAgICAgICBpZiAo
IEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKGZp
bmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlYXJj
aCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycworICAg
ICAgICAgICAgICAgICAgICBpZiAoIChzZWVkID0gZmluZCgKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYg
dGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKKyAgICAgICAgICAg
ICAgICAgICAgKSkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNlZWQgaXMg
ZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseQorICAgICAgICAg
ICAgICAgICAgICAgICAgdG9rZW5zLnNwbGljZSggaSwgMSApOworICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICggIXNlbGVjdG9yICkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKLSAg
ICBub2RlTmFtZSA9IG5vZGVOYW1lLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9M
b3dlckNhc2UoKTsKLSAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGVs
ZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsK
LSAgICB9OwotICAgIH0sCisgICAgLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBm
dW5jdGlvbgorICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBp
ZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKyAgICBjb21waWxlKCBzZWxlY3Rvciwg
bWF0Y2ggKSgKKyAgICAgICAgc2VlZCwKKyAgICAgICAgY29udGV4dCwKKyAgICAgICAgIWRvY3Vt
ZW50SXNIVE1MLAorICAgICAgICByZXN1bHRzLAorICAgICAgICByc2libGluZy50ZXN0KCBzZWxl
Y3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Cisg
ICAgKTsKKyAgICByZXR1cm4gcmVzdWx0czsKK30KIAotICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBj
bGFzc05hbWUgKSB7Ci0gICAgdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAi
ICIgXTsKKy8vIE9uZS10aW1lIGFzc2lnbm1lbnRzCiAKLSAgICByZXR1cm4gcGF0dGVybiB8fAot
ICAgIChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihefCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xh
c3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiICkpICYmCi0gICAgY2xhc3NDYWNoZSgg
Y2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4gcGF0dGVybi50ZXN0KCBl
bGVtLmNsYXNzTmFtZSB8fCAodHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmlu
ZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpIHx8ICIiICk7Ci0gICAgfSk7Ci0gICAg
fSwKKy8vIFNvcnQgc3RhYmlsaXR5CitzdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0
KCIiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCIiKSA9PT0gZXhwYW5kbzsKIAotICAgICJBVFRS
IjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKLSAgICByZXR1cm4gZnVuY3Rp
b24oIGVsZW0gKSB7Ci0gICAgdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7
CisvLyBTdXBwb3J0OiBDaHJvbWU8MTQKKy8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0
aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24KK3N1cHBvcnQuZGV0
ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlOwogCi0gICAgaWYgKCByZXN1bHQgPT0gbnVs
bCApIHsKLSAgICByZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7Ci0gICAgfQotICAgIGlmICggIW9w
ZXJhdG9yICkgewotICAgIHJldHVybiB0cnVlOwotICAgIH0KKy8vIEluaXRpYWxpemUgYWdhaW5z
dCB0aGUgZGVmYXVsdCBkb2N1bWVudAorc2V0RG9jdW1lbnQoKTsKIAotICAgIHJlc3VsdCArPSAi
IjsKKy8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChm
aXhlZCBpbiBDaHJvbWUgMjcpCisvLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxv
dyAqZWFjaCBvdGhlcioKK3N1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBk
aXYxICkgeworICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5n
KQorICAgIHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJkaXYiKSApICYgMTsKK30pOwogCi0gICAgcmV0dXJuIG9wZXJhdG9yID09PSAi
PSIgPyByZXN1bHQgPT09IGNoZWNrIDoKLSAgICBvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAh
PT0gY2hlY2sgOgotICAgIG9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4
T2YoIGNoZWNrICkgPT09IDAgOgotICAgIG9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVz
dWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6Ci0gICAgb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVj
ayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgotICAgIG9wZXJh
dG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQgKyAiICIgKS5pbmRleE9mKCBjaGVjayApID4g
LTEgOgotICAgIG9wZXJhdG9yID09PSAifD0iID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQu
c2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyAiLSIgOgotICAgIGZhbHNl
OwotICAgIH07Ci0gICAgfSwKKy8vIFN1cHBvcnQ6IElFPDgKKy8vIFByZXZlbnQgYXR0cmlidXRl
L3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9l
bi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAoraWYgKCAhYXNzZXJ0KGZ1bmN0
aW9uKCBkaXYgKSB7CisgICAgZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKyAg
ICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cit9
KSApIHsKKyAgICBhZGRIYW5kbGUoICJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIiwgZnVuY3Rpb24o
IGVsZW0sIG5hbWUsIGlzWE1MICkgeworICAgICAgICBpZiAoICFpc1hNTCApIHsKKyAgICAgICAg
ICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09
PSAidHlwZSIgPyAxIDogMiApOworICAgICAgICB9CisgICAgfSk7Cit9CiAKLSAgICAiQ0hJTEQi
OiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewotICAgIHZh
ciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09ICJudGgiLAotICAgIGZvcndhcmQgPSB0
eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCi0gICAgb2ZUeXBlID0gd2hhdCA9PT0gIm9mLXR5
cGUiOworLy8gU3VwcG9ydDogSUU8OQorLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBn
ZXRBdHRyaWJ1dGUoInZhbHVlIikKK2lmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7CisgICAgZGl2LmlubmVySFRNTCA9ICI8aW5wdXQvPiI7CisgICAg
ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOworICAgIHJldHVybiBk
aXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gIiI7Cit9KSApIHsKKyAg
ICBhZGRIYW5kbGUoICJ2YWx1ZSIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKKyAg
ICAgICAgaWYgKCAhaXNYTUwgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5w
dXQiICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOworICAgICAgICB9
CisgICAgfSk7Cit9CiAKLSAgICByZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/Cisv
LyBTdXBwb3J0OiBJRTw5CisvLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFu
cyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzCitpZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsK
KyAgICByZXR1cm4gZGl2LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PSBudWxsOworfSkgKSB7
CisgICAgYWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkg
eworICAgICAgICB2YXIgdmFsOworICAgICAgICBpZiAoICFpc1hNTCApIHsKKyAgICAgICAgICAg
IHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOgorICAg
ICAgICAgICAgICAgICAgICAodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYm
IHZhbC5zcGVjaWZpZWQgPworICAgICAgICAgICAgICAgICAgICB2YWwudmFsdWUgOgorICAgICAg
ICAgICAgICAgIG51bGw7CisgICAgICAgIH0KKyAgICB9KTsKK30KIAotICAgIC8vIFNob3J0Y3V0
IGZvciA6bnRoLSoobikKLSAgICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4gISFlbGVt
LnBhcmVudE5vZGU7Ci0gICAgfSA6CityZXR1cm4gU2l6emxlOwogCi0gICAgZnVuY3Rpb24oIGVs
ZW0sIGNvbnRleHQsIHhtbCApIHsKLSAgICB2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRp
ZmYsIG5vZGVJbmRleCwgc3RhcnQsCi0gICAgZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gIm5l
eHRTaWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAotICAgIHBhcmVudCA9IGVsZW0ucGFyZW50
Tm9kZSwKLSAgICBuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwK
LSAgICB1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTsKLQotICAgIGlmICggcGFyZW50ICkgewot
Ci0gICAgLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQotICAgIGlmICggc2lt
cGxlICkgewotICAgIHdoaWxlICggZGlyICkgewotICAgIG5vZGUgPSBlbGVtOwotICAgIHdoaWxl
ICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7Ci0gICAgaWYgKCBvZlR5cGUgPyBub2RlLm5vZGVO
YW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgewotICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgfQotICAgIC8vIFJldmVyc2UgZGlyZWN0aW9uIGZv
ciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKQotICAgIHN0YXJ0ID0gZGlyID0g
dHlwZSA9PT0gIm9ubHkiICYmICFzdGFydCAmJiAibmV4dFNpYmxpbmciOwotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Cit9KSggd2luZG93ICk7CiAKLSAgICBzdGFydCA9IFsgZm9yd2Fy
ZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwogCi0gICAgLy8gbm9u
LXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKLSAgICBp
ZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7Ci0gICAgLy8gU2VlayBgZWxlbWAgZnJvbSBhIHBy
ZXZpb3VzbHktY2FjaGVkIGluZGV4Ci0gICAgb3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBd
IHx8IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTsKLSAgICBjYWNoZSA9IG91dGVyQ2FjaGVbIHR5
cGUgXSB8fCBbXTsKLSAgICBub2RlSW5kZXggPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNo
ZVsxXTsKLSAgICBkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMl07Ci0gICAg
bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CiAKLSAg
ICB3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fAor
alF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7Citq
UXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIucHNldWRvczsKK2pRdWVyeS51bmlxdWUgPSBT
aXp6bGUudW5pcXVlU29ydDsKK2pRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CitqUXVlcnku
aXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CitqUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFp
bnM7CiAKLSAgICAvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAot
ICAgIChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewogCi0gICAgLy8g
V2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKLSAgICBpZiAo
IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7Ci0gICAg
b3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTsKLSAgICBi
cmVhazsKLSAgICB9Ci0gICAgfQogCi0gICAgLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1l
bnQgaW5kZXggaWYgYXZhaWxhYmxlCi0gICAgfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hl
ID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAm
JiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKLSAgICBkaWZmID0gY2FjaGVbMV07Cit2YXIgcm5l
ZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKIAotICAgIC8vIHht
bCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/
LW9mLXR5cGUoLi4uKQotICAgIH0gZWxzZSB7Ci0gICAgLy8gVXNlIHRoZSBzYW1lIGxvb3AgYXMg
YWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKLSAgICB3aGlsZSAoIChub2RlID0g
Kytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fAotICAgIChkaWZmID0gbm9kZUlu
ZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewordmFyIHJzaW5nbGVUYWcgPSAoL148KFx3Kylc
cypcLz8+KD86PFwvXDE+fCkkLyk7CiAKLSAgICBpZiAoICggb2ZUeXBlID8gbm9kZS5ub2RlTmFt
ZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmICsrZGlm
ZiApIHsKLSAgICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50
Ci0gICAgaWYgKCB1c2VDYWNoZSApIHsKLSAgICAobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBl
eHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKLSAgICB9CiAKLSAg
ICBpZiAoIG5vZGUgPT09IGVsZW0gKSB7Ci0gICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLSAgICB9
Ci0gICAgfQogCi0gICAgLy8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2Fp
bnN0IGN5Y2xlIHNpemUKLSAgICBkaWZmIC09IGxhc3Q7Ci0gICAgcmV0dXJuIGRpZmYgPT09IGZp
cnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7Ci0gICAg
fQotICAgIH07Ci0gICAgfSwKK3ZhciByaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOwogCi0g
ICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewotICAgIC8vIHBzZXVk
by1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQotICAgIC8vIGh0dHA6Ly93d3cudzMu
b3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXMKLSAgICAvLyBQcmlvcml0aXplIGJ5IGNh
c2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBl
cmNhc2UgbGV0dGVycwotICAgIC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBm
cm9tIHBzZXVkb3MKLSAgICB2YXIgYXJncywKLSAgICBmbiA9IEV4cHIucHNldWRvc1sgcHNldWRv
IF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8Ci0gICAgU2l6
emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7Ci0KLSAgICAvLyBU
aGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgLy8gYXJn
dW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAgICAvLyBq
dXN0IGFzIFNpenpsZSBkb2VzCi0gICAgaWYgKCBmblsgZXhwYW5kbyBdICkgewotICAgIHJldHVy
biBmbiggYXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICAvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBm
b3Igb2xkIHNpZ25hdHVyZXMKLSAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7Ci0gICAgYXJncyA9
IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOwotICAgIHJldHVybiBFeHByLnNldEZp
bHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwotICAgIG1hcmtG
dW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKLSAgICB2YXIgaWR4LAotICAgIG1h
dGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKLSAgICBpID0gbWF0Y2hlZC5sZW5ndGg7Ci0g
ICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgaWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVk
W2ldICk7Ci0gICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0g
KTsKLSAgICB9Ci0gICAgfSkgOgotICAgIGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBm
biggZWxlbSwgMCwgYXJncyApOwotICAgIH07Ci0gICAgfQorLy8gSW1wbGVtZW50IHRoZSBpZGVu
dGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKK2Z1bmN0aW9uIHdpbm5vdygg
ZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgeworICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24o
IHF1YWxpZmllciApICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBm
dW5jdGlvbiggZWxlbSwgaSApIHsKKyAgICAgICAgICAgIC8qIGpzaGludCAtVzAxOCAqLworICAg
ICAgICAgICAgcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90
OworICAgICAgICB9KTsKIAotICAgIHJldHVybiBmbjsKICAgICB9Ci0gICAgfSwKIAotICAgIHBz
ZXVkb3M6IHsKLSAgICAvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3MKLSAgICAibm90Ijog
bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAvLyBUcmltIHRoZSBzZWxl
Y3RvciBwYXNzZWQgdG8gY29tcGlsZQotICAgIC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcg
YW5kIHRyYWlsaW5nCi0gICAgLy8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzCi0gICAgdmFyIGlucHV0
ID0gW10sCi0gICAgcmVzdWx0cyA9IFtdLAotICAgIG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rv
ci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7Ci0KLSAgICByZXR1cm4gbWF0Y2hlclsgZXhwYW5k
byBdID8KLSAgICBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQs
IHhtbCApIHsKLSAgICB2YXIgZWxlbSwKLSAgICB1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBu
dWxsLCB4bWwsIFtdICksCi0gICAgaSA9IHNlZWQubGVuZ3RoOworICAgIGlmICggcXVhbGlmaWVy
Lm5vZGVUeXBlICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5j
dGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciAp
ICE9PSBub3Q7CisgICAgICAgIH0pOwogCi0gICAgLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVk
IGJ5IGBtYXRjaGVyYAotICAgIHdoaWxlICggaS0tICkgewotICAgIGlmICggKGVsZW0gPSB1bm1h
dGNoZWRbaV0pICkgewotICAgIHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKICAgICB9
Ci0gICAgfQotICAgIH0pIDoKLSAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewot
ICAgIGlucHV0WzBdID0gZWxlbTsKLSAgICBtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1
bHRzICk7Ci0gICAgcmV0dXJuICFyZXN1bHRzLnBvcCgpOwotICAgIH07Ci0gICAgfSksCiAKLSAg
ICAiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICByZXR1cm4g
ZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5s
ZW5ndGggPiAwOwotICAgIH07Ci0gICAgfSksCi0KLSAgICAiY29udGFpbnMiOiBtYXJrRnVuY3Rp
b24oZnVuY3Rpb24oIHRleHQgKSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAg
IHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCgg
ZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7Ci0gICAgfTsKLSAgICB9KSwKLQotICAgIC8v
ICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9y
Ci0gICAgLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUK
LSAgICAvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAotICAgIC8vIG9yIGJlZ2lu
bmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgot
ICAgIC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2
YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotICAgIC8vIFRoZSBpZGVudGlm
aWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgotICAgIC8v
IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KLSAgICAibGFuZyI6
IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7Ci0gICAgLy8gbGFuZyB2YWx1ZSBtdXN0
IGJlIGEgdmFsaWQgaWRlbnRpZmlkZXIKLSAgICBpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcg
fHwgIiIpICkgewotICAgIFNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5n
ICk7Ci0gICAgfQotICAgIGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBl
ICkudG9Mb3dlckNhc2UoKTsKLSAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgdmFy
IGVsZW1MYW5nOwotICAgIGRvIHsKLSAgICBpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNYTUwg
PwotICAgIGVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRl
KCJsYW5nIikgOgotICAgIGVsZW0ubGFuZykgKSB7CisgICAgaWYgKCB0eXBlb2YgcXVhbGlmaWVy
ID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgaWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVy
ICkgKSB7CisgICAgICAgICAgICByZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVt
ZW50cywgbm90ICk7CisgICAgICAgIH0KIAotICAgIGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dl
ckNhc2UoKTsKLSAgICByZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhP
ZiggbGFuZyArICItIiApID09PSAwOworICAgICAgICBxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVy
KCBxdWFsaWZpZXIsIGVsZW1lbnRzICk7CiAgICAgfQotICAgIH0gd2hpbGUgKCAoZWxlbSA9IGVs
ZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwotICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9OwotICAgIH0pLAogCi0gICAgLy8gTWlzY2VsbGFuZW91cwotICAgICJ0YXJnZXQi
OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICB2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3
aW5kb3cubG9jYXRpb24uaGFzaDsKLSAgICByZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkg
PT09IGVsZW0uaWQ7Ci0gICAgfSwKKyAgICByZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBm
dW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZp
ZXIsIGVsZW0gKSA+PSAwICkgIT09IG5vdDsKKyAgICB9KTsKK30KIAotICAgICJyb290IjogZnVu
Y3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGVsZW0gPT09IGRvY0VsZW07Ci0gICAgfSwKK2pR
dWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKKyAgICB2YXIgZWxl
bSA9IGVsZW1zWyAwIF07CiAKLSAgICAiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICBy
ZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0Zv
Y3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYg
fHwgfmVsZW0udGFiSW5kZXgpOwotICAgIH0sCisgICAgaWYgKCBub3QgKSB7CisgICAgICAgIGV4
cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKKyAgICB9CiAKLSAgICAvLyBCb29sZWFuIHByb3Bl
cnRpZXMKLSAgICAiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBlbGVt
LmRpc2FibGVkID09PSBmYWxzZTsKLSAgICB9LAorICAgIHJldHVybiBlbGVtcy5sZW5ndGggPT09
IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/CisgICAgICAgIGpRdWVyeS5maW5kLm1hdGNoZXNT
ZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXSA6CisgICAgICAgIGpRdWVyeS5m
aW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7
CisgICAgICAgICAgICByZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKKyAgICAgICAgfSkpOwor
fTsKIAotICAgICJkaXNhYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBlbGVt
LmRpc2FibGVkID09PSB0cnVlOworalF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgZmluZDogZnVuY3Rp
b24oIHNlbGVjdG9yICkgeworICAgICAgICB2YXIgaSwKKyAgICAgICAgICAgIGxlbiA9IHRoaXMu
bGVuZ3RoLAorICAgICAgICAgICAgcmV0ID0gW10sCisgICAgICAgICAgICBzZWxmID0gdGhpczsK
KworICAgICAgICBpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhp
cyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSApOworICAgICAg
ICB9CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAg
IGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAk
KCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQorICAgICAgICByZXQgPSB0aGlzLnB1c2hTdGFj
ayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7CisgICAgICAgIHJldC5z
ZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgIiAiICsgc2VsZWN0b3Ig
OiBzZWxlY3RvcjsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9LAotCi0gICAgImNoZWNrZWQi
OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0
dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHMKLSAgICAvLyBodHRwOi8vd3d3
LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZAotICAg
IHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICByZXR1cm4g
KG5vZGVOYW1lID09PSAiaW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09
ICJvcHRpb24iICYmICEhZWxlbS5zZWxlY3RlZCk7CisgICAgZmlsdGVyOiBmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7CisgICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNl
bGVjdG9yIHx8IFtdLCBmYWxzZSkgKTsKICAgICB9LAotCi0gICAgInNlbGVjdGVkIjogZnVuY3Rp
b24oIGVsZW0gKSB7Ci0gICAgLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0
ZWQtYnktZGVmYXVsdAotICAgIC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKLSAg
ICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKLSAgICBlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJ
bmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKyAgICBu
b3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNr
KCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUpICk7CiAgICAgfSwKKyAgICBpczog
ZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgICAgICByZXR1cm4gISF3aW5ub3coCisgICAgICAg
ICAgICB0aGlzLAogCi0gICAgLy8gQ29udGVudHMKLSAgICAiZW1wdHkiOiBmdW5jdGlvbiggZWxl
bSApIHsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVk
bwotICAgIC8vIDplbXB0eSBpcyBvbmx5IGFmZmVjdGVkIGJ5IGVsZW1lbnQgbm9kZXMgYW5kIGNv
bnRlbnQgbm9kZXMoaW5jbHVkaW5nIHRleHQoMyksIGNkYXRhKDQpKSwKLSAgICAvLyAgIG5vdCBj
b21tZW50LCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgb3Igb3RoZXJzCi0gICAgLy8gVGhhbmtz
IHRvIERpZWdvIFBlcmluaSBmb3IgdGhlIG5vZGVOYW1lIHNob3J0Y3V0Ci0gICAgLy8gICBHcmVh
dGVyIHRoYW4gIkAiIG1lYW5zIGFscGhhIGNoYXJhY3RlcnMgKHNwZWNpZmljYWxseSBub3Qgc3Rh
cnRpbmcgd2l0aCAiIyIgb3IgIj8iKQotICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7
IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewotICAgIGlmICggZWxlbS5ub2RlTmFt
ZSA+ICJAIiB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDQgKSB7
Ci0gICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBw
b3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1
cm5lZCBzZXQKKyAgICAgICAgICAgIC8vIHNvICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29u
J3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KKyAgICAgICAgICAgIHR5cGVv
ZiBzZWxlY3RvciA9PT0gInN0cmluZyIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciAp
ID8KKyAgICAgICAgICAgICAgICBqUXVlcnkoIHNlbGVjdG9yICkgOgorICAgICAgICAgICAgICAg
IHNlbGVjdG9yIHx8IFtdLAorICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgKS5sZW5ndGg7CiAg
ICAgfQotICAgIHJldHVybiB0cnVlOwotICAgIH0sCi0KLSAgICAicGFyZW50IjogZnVuY3Rpb24o
IGVsZW0gKSB7Ci0gICAgcmV0dXJuICFFeHByLnBzZXVkb3NbImVtcHR5Il0oIGVsZW0gKTsKLSAg
ICB9LAorfSk7CiAKLSAgICAvLyBFbGVtZW50L2lucHV0IHR5cGVzCi0gICAgImhlYWRlciI6IGZ1
bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUg
KTsKLSAgICB9LAogCi0gICAgImlucHV0IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJu
IHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwotICAgIH0sCisvLyBJbml0aWFsaXplIGEg
alF1ZXJ5IG9iamVjdAogCi0gICAgImJ1dHRvbiI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHZh
ciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIHJldHVybiBuYW1lID09
PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7
Ci0gICAgfSwKIAotICAgICJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgdmFyIGF0dHI7
Ci0gICAgLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBI
VE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpCi0gICAgLy8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFk
IHRvIHRlc3QgdGhpcyBjYXNlCi0gICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2Uo
KSA9PT0gImlucHV0IiAmJgotICAgIGVsZW0udHlwZSA9PT0gInRleHQiICYmCi0gICAgKCAoYXR0
ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2Fz
ZSgpID09PSBlbGVtLnR5cGUgKTsKLSAgICB9LAorLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0
aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCit2YXIgcm9vdGpRdWVyeSwKIAotICAgIC8vIFBvc2l0
aW9uLWluLWNvbGxlY3Rpb24KLSAgICAiZmlyc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1
bmN0aW9uKCkgewotICAgIHJldHVybiBbIDAgXTsKLSAgICB9KSwKKyAgICAvLyBBIHNpbXBsZSB3
YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncworICAgIC8vIFByaW9yaXRpemUgI2lkIG92ZXIg
PHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSkKKyAgICAvLyBTdHJp
Y3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPCkKKyAgICBycXVp
Y2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLywKKworICAgIGlu
aXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKyAg
ICAgICAgdmFyIG1hdGNoLCBlbGVtOworCisgICAgICAgIC8vIEhBTkRMRTogJCgiIiksICQobnVs
bCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKKyAgICAgICAgaWYgKCAhc2VsZWN0b3IgKSB7Cisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSBI
VE1MIHN0cmluZ3MKKyAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkg
eworICAgICAgICAgICAgaWYgKCBzZWxlY3RvclswXSA9PT0gIjwiICYmIHNlbGVjdG9yWyBzZWxl
Y3Rvci5sZW5ndGggLSAxIF0gPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKKyAg
ICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3
aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVjaworICAgICAgICAgICAgICAg
IG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOworCisgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgIG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBu
byBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCisgICAgICAgICAgICBpZiAoIG1hdGNoICYm
IChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBIQU5ETEU6
ICQoaHRtbCkgLT4gJChhcnJheSkKKyAgICAgICAgICAgICAgICBpZiAoIG1hdGNoWzFdICkgewor
ICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/
IGNvbnRleHRbMF0gOiBjb250ZXh0OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNjcmlwdHMg
aXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZW50aW9u
YWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQK
KyAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1M
KAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQg
fHwgY29udGV4dCA6IGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQorICAg
ICAgICAgICAgICAgICAgICApICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFOiAk
KGh0bWwsIHByb3BzKQorICAgICAgICAgICAgICAgICAgICBpZiAoIHJzaW5nbGVUYWcudGVzdCgg
bWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgZm9yICggbWF0Y2ggaW4gY29udGV4dCApIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBt
ZXRob2RzIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVl
cnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVz
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKCNpZCkKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
IG1hdGNoWzJdICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcGFyZW50Tm9kZSB0
byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKyAgICAgICAgICAgICAgICAgICAg
Ly8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MworICAgICAg
ICAgICAgICAgICAgICBpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpR
dWVyeSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXNbMF0gPSBlbGVtOworICAgICAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7CisgICAg
ICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBI
QU5ETEU6ICQoZXhwciwgJCguLi4pKQorICAgICAgICAgICAgfSBlbHNlIGlmICggIWNvbnRleHQg
fHwgY29udGV4dC5qcXVlcnkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICggY29udGV4dCB8
fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKKworICAgICAgICAgICAgLy8gSEFORExF
OiAkKGV4cHIsIGNvbnRleHQpCisgICAgICAgICAgICAvLyAod2hpY2ggaXMganVzdCBlcXVpdmFs
ZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxl
Y3RvciApOworICAgICAgICAgICAgfQorCisgICAgICAgIC8vIEhBTkRMRTogJChET01FbGVtZW50
KQorICAgICAgICB9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKKyAgICAgICAgICAg
IHRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMubGVu
Z3RoID0gMTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIC8vIEhBTkRMRTog
JChmdW5jdGlvbikKKyAgICAgICAgLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CisgICAg
ICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgeworICAgICAg
ICAgICAgcmV0dXJuIHR5cGVvZiByb290alF1ZXJ5LnJlYWR5ICE9PSAidW5kZWZpbmVkIiA/Cisg
ICAgICAgICAgICAgICAgcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKSA6CisgICAgICAgICAg
ICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudAorICAg
ICAgICAgICAgICAgIHNlbGVjdG9yKCBqUXVlcnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgIHRoaXMu
c2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9
IHNlbGVjdG9yLmNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4galF1ZXJ5Lm1h
a2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAgICB9OwogCi0gICAgImxhc3QiOiBjcmVhdGVQ
b3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLSAgICBy
ZXR1cm4gWyBsZW5ndGggLSAxIF07Ci0gICAgfSksCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9u
IHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCitpbml0LnByb3Rv
dHlwZSA9IGpRdWVyeS5mbjsKIAotICAgICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVu
Y3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKLSAgICByZXR1cm4gWyBh
cmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07Ci0gICAgfSksCisv
LyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCityb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1
bWVudCApOwogCi0gICAgImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBt
YXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLSAgICB2YXIgaSA9IDA7Ci0gICAgZm9yICggOyBpIDwg
bGVuZ3RoOyBpICs9IDIgKSB7Ci0gICAgbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAgICB9KSwKIAotICAgICJvZGQiOiBjcmVhdGVQb3Np
dGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLSAgICB2YXIg
aSA9IDE7Ci0gICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7Ci0gICAgbWF0Y2hJbmRl
eGVzLnB1c2goIGkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAgICB9KSwK
K3ZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLywKKyAg
ICAvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFy
dGluZyBmcm9tIGEgdW5pcXVlIHNldAorICAgIGd1YXJhbnRlZWRVbmlxdWUgPSB7CisgICAgICAg
IGNoaWxkcmVuOiB0cnVlLAorICAgICAgICBjb250ZW50czogdHJ1ZSwKKyAgICAgICAgbmV4dDog
dHJ1ZSwKKyAgICAgICAgcHJldjogdHJ1ZQorICAgIH07CiAKLSAgICAibHQiOiBjcmVhdGVQb3Np
dGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7
Ci0gICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50
OwotICAgIGZvciAoIDsgLS1pID49IDA7ICkgewotICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7
Ci0gICAgfQotICAgIHJldHVybiBtYXRjaEluZGV4ZXM7Ci0gICAgfSksCitqUXVlcnkuZXh0ZW5k
KHsKKyAgICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgeworICAgICAgICB2YXIg
bWF0Y2hlZCA9IFtdLAorICAgICAgICAgICAgdHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVk
OwogCi0gICAgImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRl
eGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewotICAgIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJn
dW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDsKLSAgICBmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7
Ci0gICAgbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoSW5k
ZXhlczsKLSAgICB9KQotICAgIH0KLX07CisgICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBk
aXIgXSkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHsKKyAgICAgICAgICAgIGlmICggZWxlbS5u
b2RlVHlwZSA9PT0gMSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRydW5jYXRlICYmIGpRdWVy
eSggZWxlbSApLmlzKCB1bnRpbCApICkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKCBlbGVtICk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgfSwK
IAotLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3MKLWZvciAoIGkgaW4geyByYWRpbzog
dHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTog
dHJ1ZSB9ICkgewotICAgIEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkg
KTsKLX0KLWZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7Ci0gICAg
RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTsKLX0KKyAgICBzaWJs
aW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKKyAgICAgICAgdmFyIG1hdGNoZWQgPSBbXTsKIAot
ZnVuY3Rpb24gdG9rZW5pemUoIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7Ci0gICAgdmFyIG1hdGNo
ZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsCi0gICAgc29GYXIsIGdyb3VwcywgcHJlRmlsdGVycywK
LSAgICBjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArICIgIiBdOworICAgICAgICBmb3Ig
KCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgeworICAgICAgICAgICAgaWYgKCBuLm5vZGVUeXBl
ID09PSAxICYmIG4gIT09IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKCBu
ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIGlmICggY2FjaGVkICkgewotICAg
IHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7CisgICAgICAgIHJldHVy
biBtYXRjaGVkOwogICAgIH0KK30pOwogCi0gICAgc29GYXIgPSBzZWxlY3RvcjsKLSAgICBncm91
cHMgPSBbXTsKLSAgICBwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7Ci0KLSAgICB3aGlsZSAo
IHNvRmFyICkgewotCi0gICAgLy8gQ29tbWEgYW5kIGZpcnN0IHJ1bgotICAgIGlmICggIW1hdGNo
ZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkgewotICAgIGlmICggbWF0Y2gg
KSB7Ci0gICAgLy8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWQKLSAgICBz
b0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0ZhcjsKLSAgICB9Ci0g
ICAgZ3JvdXBzLnB1c2goIHRva2VucyA9IFtdICk7Ci0gICAgfQoralF1ZXJ5LmZuLmV4dGVuZCh7
CisgICAgaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgeworICAgICAgICB2YXIgdGFyZ2V0cyA9IGpR
dWVyeSggdGFyZ2V0LCB0aGlzICksCisgICAgICAgICAgICBsID0gdGFyZ2V0cy5sZW5ndGg7CiAK
LSAgICBtYXRjaGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlv
bigpIHsKKyAgICAgICAgICAgIHZhciBpID0gMDsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGw7
IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFy
Z2V0c1tpXSApICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0sCiAKLSAgICAvLyBD
b21iaW5hdG9ycwotICAgIGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkp
ICkgewotICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgIHRva2Vucy5wdXNoKCB7Ci0g
ICAgdmFsdWU6IG1hdGNoZWQsCi0gICAgLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRv
IHNwYWNlCi0gICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCi0gICAgfSAp
OwotICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7Ci0gICAgfQorICAg
IGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CisgICAgICAgIHZhciBj
dXIsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAg
ICAgICAgICAgIG1hdGNoZWQgPSBbXSwKKyAgICAgICAgICAgIHBvcyA9IHJuZWVkc0NvbnRleHQu
dGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPworICAg
ICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCAp
IDoKKyAgICAgICAgICAgICAgICAwOwogCi0gICAgLy8gRmlsdGVycwotICAgIGZvciAoIHR5cGUg
aW4gRXhwci5maWx0ZXIgKSB7Ci0gICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5l
eGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAotICAgIChtYXRjaCA9IHBy
ZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewotICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlm
dCgpOwotICAgIHRva2Vucy5wdXNoKCB7Ci0gICAgdmFsdWU6IG1hdGNoZWQsCi0gICAgdHlwZTog
dHlwZSwKLSAgICBtYXRjaGVzOiBtYXRjaAotICAgIH0gKTsKLSAgICBzb0ZhciA9IHNvRmFyLnNs
aWNlKCBtYXRjaGVkLmxlbmd0aCApOwotICAgIH0KLSAgICB9CisgICAgICAgIGZvciAoIDsgaSA8
IGw7IGkrKyApIHsKKyAgICAgICAgICAgIGZvciAoIGN1ciA9IHRoaXNbaV07IGN1ciAmJiBjdXIg
IT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgICAgIC8v
IEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cworICAgICAgICAgICAgICAgIGlmICggY3Vy
Lm5vZGVUeXBlIDwgMTEgJiYgKHBvcyA/CisgICAgICAgICAgICAgICAgICAgIHBvcy5pbmRleChj
dXIpID4gLTEgOgogCi0gICAgaWYgKCAhbWF0Y2hlZCApIHsKLSAgICBicmVhazsKLSAgICB9Ci0g
ICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBT
aXp6bGUKKyAgICAgICAgICAgICAgICAgICAgY3VyLm5vZGVUeXBlID09PSAxICYmCisgICAgICAg
ICAgICAgICAgICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoY3VyLCBzZWxlY3Rv
cnMpKSApIHsKIAotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vz
cwotICAgIC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwotICAgIC8vIE90aGVyd2lzZSwgdGhyb3cg
YW4gZXJyb3Igb3IgcmV0dXJuIHRva2VucwotICAgIHJldHVybiBwYXJzZU9ubHkgPwotICAgIHNv
RmFyLmxlbmd0aCA6Ci0gICAgc29GYXIgPwotICAgIFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6
Ci0gICAgLy8gQ2FjaGUgdGhlIHRva2VucwotICAgIHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91
cHMgKS5zbGljZSggMCApOwotfQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLnB1c2goIGN1
ciApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KIAotZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkgewot
ICAgIHZhciBpID0gMCwKLSAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAotICAgIHNlbGVjdG9yID0g
IiI7Ci0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgc2VsZWN0b3IgKz0gdG9rZW5z
W2ldLnZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gc2VsZWN0b3I7Ci19CisgICAgICAgIHJldHVy
biB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggbWF0
Y2hlZCApIDogbWF0Y2hlZCApOworICAgIH0sCiAKLWZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1h
dGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Ci0gICAgdmFyIGRpciA9IGNvbWJpbmF0b3IuZGly
LAotICAgIGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0gInBhcmVudE5vZGUiLAot
ICAgIGRvbmVOYW1lID0gZG9uZSsrOworICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2Yg
YW4gZWxlbWVudCB3aXRoaW4KKyAgICAvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKKyAg
ICBpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7CiAKLSAgICByZXR1cm4gY29tYmluYXRvci5maXJz
dCA/Ci0gICAgLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVt
ZW50Ci0gICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKLSAgICB3aGlsZSAoIChl
bGVtID0gZWxlbVsgZGlyIF0pICkgewotICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBj
aGVja05vbkVsZW1lbnRzICkgewotICAgIHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4
bWwgKTsKLSAgICB9Ci0gICAgfQotICAgIH0gOgorICAgICAgICAvLyBObyBhcmd1bWVudCwgcmV0
dXJuIGluZGV4IGluIHBhcmVudAorICAgICAgICBpZiAoICFlbGVtICkgeworICAgICAgICAgICAg
cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0
KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xOworICAgICAgICB9CiAKLSAgICAvLyBDaGVjayBhZ2Fp
bnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHMKLSAgICBmdW5jdGlvbiggZWxlbSwg
Y29udGV4dCwgeG1sICkgewotICAgIHZhciBkYXRhLCBjYWNoZSwgb3V0ZXJDYWNoZSwKLSAgICBk
aXJrZXkgPSBkaXJydW5zICsgIiAiICsgZG9uZU5hbWU7CisgICAgICAgIC8vIGluZGV4IGluIHNl
bGVjdG9yCisgICAgICAgIGlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgeworICAgICAg
ICAgICAgcmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApOwor
ICAgICAgICB9CiAKLSAgICAvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5v
ZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZwotICAgIGlmICggeG1s
ICkgewotICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0gICAgaWYgKCBlbGVt
Lm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0gICAgaWYgKCBtYXRjaGVy
KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAg
fQotICAgIH0KLSAgICB9IGVsc2UgewotICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkg
KSB7Ci0gICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7
Ci0gICAgb3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0g
e30pOwotICAgIGlmICggKGNhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0pICYmIGNhY2hlWzBdID09
PSBkaXJrZXkgKSB7Ci0gICAgaWYgKCAoZGF0YSA9IGNhY2hlWzFdKSA9PT0gdHJ1ZSB8fCBkYXRh
ID09PSBjYWNoZWRydW5zICkgewotICAgIHJldHVybiBkYXRhID09PSB0cnVlOwotICAgIH0KLSAg
ICB9IGVsc2UgewotICAgIGNhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0gPSBbIGRpcmtleSBdOwot
ICAgIGNhY2hlWzFdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgfHwgY2FjaGVkcnVu
czsKLSAgICBpZiAoIGNhY2hlWzFdID09PSB0cnVlICkgewotICAgIHJldHVybiB0cnVlOwotICAg
IH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfTsKLX0KKyAgICAgICAgLy8gTG9j
YXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisgICAgICAgIHJldHVybiBp
bmRleE9mLmNhbGwoIHRoaXMsCiAKLWZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyAp
IHsKLSAgICByZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/Ci0gICAgZnVuY3Rpb24oIGVsZW0s
IGNvbnRleHQsIHhtbCApIHsKLSAgICB2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKLSAgICB3aGls
ZSAoIGktLSApIHsKLSAgICBpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkg
KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0g
ICAgfSA6Ci0gICAgbWF0Y2hlcnNbMF07Ci19CisgICAgICAgICAgICAvLyBJZiBpdCByZWNlaXZl
cyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWQKKyAgICAgICAgICAg
IGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQorICAgICAgICApOworICAgIH0sCiAKLWZ1
bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7
Ci0gICAgdmFyIGVsZW0sCi0gICAgbmV3VW5tYXRjaGVkID0gW10sCi0gICAgaSA9IDAsCi0gICAg
bGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKLSAgICBtYXBwZWQgPSBtYXAgIT0gbnVsbDsKKyAgICBh
ZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
cHVzaFN0YWNrKAorICAgICAgICAgICAgalF1ZXJ5LnVuaXF1ZSgKKyAgICAgICAgICAgICAgICBq
UXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCisg
ICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfSwKIAotICAgIGZvciAoIDsgaSA8IGxlbjsg
aSsrICkgewotICAgIGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotICAgIGlmICggIWZp
bHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewotICAgIG5ld1VubWF0Y2hl
ZC5wdXNoKCBlbGVtICk7Ci0gICAgaWYgKCBtYXBwZWQgKSB7Ci0gICAgbWFwLnB1c2goIGkgKTsK
LSAgICB9Ci0gICAgfQotICAgIH0KKyAgICBhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7
CisgICAgICAgIHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/CisgICAgICAgICAg
ICB0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVjdG9yKQorICAg
ICAgICApOwogICAgIH0KK30pOwogCi0gICAgcmV0dXJuIG5ld1VubWF0Y2hlZDsKK2Z1bmN0aW9u
IHNpYmxpbmcoIGN1ciwgZGlyICkgeworICAgIHdoaWxlICggKGN1ciA9IGN1cltkaXJdKSAmJiBj
dXIubm9kZVR5cGUgIT09IDEgKSB7fQorICAgIHJldHVybiBjdXI7CiB9CiAKLWZ1bmN0aW9uIHNl
dE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RG
aW5kZXIsIHBvc3RTZWxlY3RvciApIHsKLSAgICBpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0
ZXJbIGV4cGFuZG8gXSApIHsKLSAgICBwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRl
ciApOwotICAgIH0KLSAgICBpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8g
XSApIHsKLSAgICBwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVj
dG9yICk7CitqUXVlcnkuZWFjaCh7CisgICAgcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKyAg
ICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKyAgICAgICAgcmV0dXJuIHBhcmVu
dCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKKyAgICB9LAorICAg
IHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmRpcigg
ZWxlbSwgInBhcmVudE5vZGUiICk7CisgICAgfSwKKyAgICBwYXJlbnRzVW50aWw6IGZ1bmN0aW9u
KCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJw
YXJlbnROb2RlIiwgdW50aWwgKTsKKyAgICB9LAorICAgIG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgICAgICByZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOworICAgIH0s
CisgICAgcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgIHJldHVybiBzaWJsaW5nKCBl
bGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworICAgIH0sCisgICAgbmV4dEFsbDogZnVuY3Rpb24o
IGVsZW0gKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmci
ICk7CisgICAgfSwKKyAgICBwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0
dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7CisgICAgfSwKKyAgICBu
ZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICAgICAgcmV0dXJuIGpR
dWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7CisgICAgfSwKKyAgICBwcmV2
VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKKyAgICAgICAgcmV0dXJuIGpRdWVy
eS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOworICAgIH0sCisgICAgc2li
bGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LnNpYmxpbmco
ICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApOworICAgIH0sCisg
ICAgY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LnNp
YmxpbmcoIGVsZW0uZmlyc3RDaGlsZCApOworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICByZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5
Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CiAgICAgfQotICAgIHJldHVybiBtYXJrRnVu
Y3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKLSAgICB2YXIg
dGVtcCwgaSwgZWxlbSwKLSAgICBwcmVNYXAgPSBbXSwKLSAgICBwb3N0TWFwID0gW10sCi0gICAg
cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKLQotICAgIC8vIEdldCBpbml0aWFsIGVsZW1l
bnRzIGZyb20gc2VlZCBvciBjb250ZXh0Ci0gICAgZWxlbXMgPSBzZWVkIHx8IG11bHRpcGxlQ29u
dGV4dHMoIHNlbGVjdG9yIHx8ICIqIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDog
Y29udGV4dCwgW10gKSwKLQotICAgIC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwg
cHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbgotICAgIG1h
dGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwotICAgIGNvbmRl
bnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDoKLSAgICBlbGVt
cywKLQotICAgIG1hdGNoZXJPdXQgPSBtYXRjaGVyID8KLSAgICAvLyBJZiB3ZSBoYXZlIGEgcG9z
dEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVl
eGlzdGluZyByZXN1bHRzLAotICAgIHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDog
cHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID8KK30sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsK
KyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7Cisg
ICAgICAgIHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7CiAKLSAg
ICAvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkKLSAgICBbXSA6Cisg
ICAgICAgIGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gIlVudGlsIiApIHsKKyAgICAgICAgICAg
IHNlbGVjdG9yID0gdW50aWw7CisgICAgICAgIH0KIAotICAgIC8vIC4uLm90aGVyd2lzZSB1c2Ug
cmVzdWx0cyBkaXJlY3RseQotICAgIHJlc3VsdHMgOgotICAgIG1hdGNoZXJJbjsKKyAgICAgICAg
aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAgICAg
ICAgICAgbWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7CisgICAg
ICAgIH0KIAotICAgIC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCi0gICAgaWYgKCBtYXRjaGVyICkg
ewotICAgIG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7Ci0g
ICAgfQorICAgICAgICBpZiAoIHRoaXMubGVuZ3RoID4gMSApIHsKKyAgICAgICAgICAgIC8vIFJl
bW92ZSBkdXBsaWNhdGVzCisgICAgICAgICAgICBpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1l
IF0gKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApOworICAgICAg
ICAgICAgfQogCi0gICAgLy8gQXBwbHkgcG9zdEZpbHRlcgotICAgIGlmICggcG9zdEZpbHRlciAp
IHsKLSAgICB0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsKLSAgICBwb3N0
RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7CisgICAgICAgICAgICAvLyBSZXZlcnNl
IG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcworICAgICAgICAgICAgaWYg
KCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgeworICAgICAgICAgICAgICAgIG1hdGNoZWQu
cmV2ZXJzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAvLyBVbi1tYXRjaCBm
YWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluCi0gICAgaSA9
IHRlbXAubGVuZ3RoOwotICAgIHdoaWxlICggaS0tICkgewotICAgIGlmICggKGVsZW0gPSB0ZW1w
W2ldKSApIHsKLSAgICBtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9z
dE1hcFtpXSBdID0gZWxlbSk7Ci0gICAgfQotICAgIH0KLSAgICB9CisgICAgICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApOworICAgIH07Cit9KTsKK3ZhciBybm90d2hpdGUgPSAo
L1xTKy9nKTsKIAotICAgIGlmICggc2VlZCApIHsKLSAgICBpZiAoIHBvc3RGaW5kZXIgfHwgcHJl
RmlsdGVyICkgewotICAgIGlmICggcG9zdEZpbmRlciApIHsKLSAgICAvLyBHZXQgdGhlIGZpbmFs
IG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5k
ZXIgY29udGV4dHMKLSAgICB0ZW1wID0gW107Ci0gICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwot
ICAgIHdoaWxlICggaS0tICkgewotICAgIGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsK
LSAgICAvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBt
YXRjaAotICAgIHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7Ci0gICAgfQotICAg
IH0KLSAgICBwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7
Ci0gICAgfQogCi0gICAgLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1
bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKLSAgICBpID0gbWF0Y2hlck91dC5sZW5ndGg7
Ci0gICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYm
Ci0gICAgKHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZi5jYWxsKCBzZWVkLCBlbGVtICkgOiBw
cmVNYXBbaV0pID4gLTEgKSB7CiAKLSAgICBzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0g
ZWxlbSk7Ci0gICAgfQotICAgIH0KLSAgICB9CisvLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMg
Zm9ybWF0IGNhY2hlCit2YXIgb3B0aW9uc0NhY2hlID0ge307CiAKLSAgICAvLyBBZGQgZWxlbWVu
dHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWQKLSAgICB9IGVsc2Ug
ewotICAgIG1hdGNoZXJPdXQgPSBjb25kZW5zZSgKLSAgICBtYXRjaGVyT3V0ID09PSByZXN1bHRz
ID8KLSAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3Ro
ICkgOgotICAgIG1hdGNoZXJPdXQKLSAgICApOwotICAgIGlmICggcG9zdEZpbmRlciApIHsKLSAg
ICBwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKLSAgICB9IGVs
c2UgewotICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKLSAgICB9Ci0gICAg
fQorLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0
dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCitmdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRp
b25zICkgeworICAgIHZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9Owor
ICAgIGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rp
b24oIF8sIGZsYWcgKSB7CisgICAgICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKICAgICB9KTsK
KyAgICByZXR1cm4gb2JqZWN0OwogfQogCi1mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9r
ZW5zICkgewotICAgIHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosCi0gICAgbGVuID0gdG9r
ZW5zLmxlbmd0aCwKLSAgICBsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNb
MF0udHlwZSBdLAotICAgIGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhw
ci5yZWxhdGl2ZVsiICJdLAotICAgIGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKLQotICAg
IC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJl
YWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCi0gICAgbWF0Y2hDb250ZXh0ID0gYWRk
Q29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGVsZW0gPT09IGNoZWNr
Q29udGV4dDsKLSAgICB9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCi0gICAgbWF0Y2hBbnlD
b250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGlu
ZGV4T2YuY2FsbCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsKLSAgICB9LCBpbXBsaWNpdFJl
bGF0aXZlLCB0cnVlICksCi0gICAgbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0
LCB4bWwgKSB7Ci0gICAgcmV0dXJuICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250
ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCi0gICAgKGNoZWNrQ29udGV4dCA9IGNv
bnRleHQpLm5vZGVUeXBlID8KLSAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCAp
IDoKLSAgICBtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7Ci0gICAgfSBd
OworLyoKKyAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJh
bWV0ZXJzOgorICoKKyAqICBvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFy
YXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93CisgKiAgICAgICAgICAgdGhlIGNhbGxi
YWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdAorICoK
KyAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2Fs
bGJhY2sgbGlzdCBhbmQgY2FuIGJlCisgKiAiZmlyZWQiIG11bHRpcGxlIHRpbWVzLgorICoKKyAq
IFBvc3NpYmxlIG9wdGlvbnM6CisgKgorICogIG9uY2U6ICAgICAgICAgICB3aWxsIGVuc3VyZSB0
aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQp
CisgKgorICogIG1lbW9yeTogICAgICAgICB3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFs
dWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCisgKiAgICAgICAgICAgICAgICAg
IGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0
ICJtZW1vcml6ZWQiCisgKiAgICAgICAgICAgICAgICAgIHZhbHVlcyAobGlrZSBhIERlZmVycmVk
KQorICoKKyAqICB1bmlxdWU6ICAgICAgICAgd2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25s
eSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpCisgKgorICogIHN0b3BP
bkZhbHNlOiAgICBpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFs
c2UKKyAqCisgKi8KK2pRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKIAot
ICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgewotICAgIGlmICggKG1hdGNoZXIgPSBFeHByLnJl
bGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHsKLSAgICBtYXRjaGVycyA9IFsgYWRkQ29tYmlu
YXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKLSAgICB9IGVsc2Ug
ewotICAgIG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVs
bCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsKLQotICAgIC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2Vl
aW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyCi0gICAgaWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7
Ci0gICAgLy8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJv
cGVyIGhhbmRsaW5nCi0gICAgaiA9ICsraTsKLSAgICBmb3IgKCA7IGogPCBsZW47IGorKyApIHsK
LSAgICBpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7Ci0gICAgYnJlYWs7
Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gc2V0TWF0Y2hlcigKLSAgICBpID4gMSAmJiBlbGVt
ZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKLSAgICBpID4gMSAmJiB0b1NlbGVjdG9yKCB0b2tlbnMu
c2xpY2UoIDAsIGkgLSAxICkgKS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAotICAgIG1hdGNoZXIs
Ci0gICAgaSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICks
Ci0gICAgaiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGlj
ZSggaiApKSApLAotICAgIGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zICkKLSAgICApOwot
ICAgIH0KLSAgICBtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7Ci0gICAgfQotICAgIH0KKyAgICAv
LyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0
ZWQgaWYgbmVlZGVkCisgICAgLy8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KQorICAgIG9wdGlv
bnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPworICAgICAgICAoIG9wdGlvbnNDYWNo
ZVsgb3B0aW9ucyBdIHx8IGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSApIDoKKyAgICAgICAgalF1
ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKKworICAgIHZhciAvLyBMYXN0IGZpcmUgdmFsdWUg
KGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMpCisgICAgICAgIG1lbW9yeSwKKyAgICAgICAgLy8g
RmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKKyAgICAgICAgZmlyZWQsCisg
ICAgICAgIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmcKKyAgICAg
ICAgZmlyaW5nLAorICAgICAgICAvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVy
bmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aCkKKyAgICAgICAgZmlyaW5nU3RhcnQsCisgICAgICAg
IC8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZworICAgICAgICBmaXJpbmdMZW5ndGgsCisg
ICAgICAgIC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5
IHJlbW92ZSBpZiBuZWVkZWQpCisgICAgICAgIGZpcmluZ0luZGV4LAorICAgICAgICAvLyBBY3R1
YWwgY2FsbGJhY2sgbGlzdAorICAgICAgICBsaXN0ID0gW10sCisgICAgICAgIC8vIFN0YWNrIG9m
IGZpcmUgY2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHMKKyAgICAgICAgc3RhY2sgPSAhb3B0aW9u
cy5vbmNlICYmIFtdLAorICAgICAgICAvLyBGaXJlIGNhbGxiYWNrcworICAgICAgICBmaXJlID0g
ZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgICAgICAgICBtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAm
JiBkYXRhOworICAgICAgICAgICAgZmlyZWQgPSB0cnVlOworICAgICAgICAgICAgZmlyaW5nSW5k
ZXggPSBmaXJpbmdTdGFydCB8fCAwOworICAgICAgICAgICAgZmlyaW5nU3RhcnQgPSAwOworICAg
ICAgICAgICAgZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CisgICAgICAgICAgICBmaXJpbmcg
PSB0cnVlOworICAgICAgICAgICAgZm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5n
TGVuZ3RoOyBmaXJpbmdJbmRleCsrICkgeworICAgICAgICAgICAgICAgIGlmICggbGlzdFsgZmly
aW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9PT0gZmFsc2UgJiYgb3B0
aW9ucy5zdG9wT25GYWxzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtb3J5ID0gZmFsc2U7
IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBhZGQKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
ZmlyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIGxpc3QgKSB7CisgICAgICAgICAgICAg
ICAgaWYgKCBzdGFjayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGFjay5sZW5ndGgg
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlKCBzdGFjay5zaGlmdCgpICk7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtZW1vcnkgKSB7
CisgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBbXTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc2FibGUoKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8vIEFjdHVhbCBDYWxsYmFja3Mg
b2JqZWN0CisgICAgICAgIHNlbGYgPSB7CisgICAgICAgICAgICAvLyBBZGQgYSBjYWxsYmFjayBv
ciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBhZGQ6
IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICggbGlzdCApIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoCisgICAgICAgICAg
ICAgICAgICAgIHZhciBzdGFydCA9IGxpc3QubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAo
ZnVuY3Rpb24gYWRkKCBhcmdzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmVh
Y2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCB0eXBlID09PSAiZnVuY3Rpb24iICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKCBhcmcgKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHR5cGUgIT09ICJzdHJpbmciICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCggYXJnICk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAg
ICAgICAgICAgICAgIH0pKCBhcmd1bWVudHMgKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8g
d2UgbmVlZCB0byBhZGQgdGhlIGNhbGxiYWNrcyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAg
Ly8gY3VycmVudCBmaXJpbmcgYmF0Y2g/CisgICAgICAgICAgICAgICAgICAgIGlmICggZmlyaW5n
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7
CisgICAgICAgICAgICAgICAgICAgIC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5n
IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheQor
ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtZW1vcnkgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBmaXJpbmdTdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAg
ZmlyZSggbWVtb3J5ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorICAgICAgICAg
ICAgLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgcmVtb3Zl
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGxpc3QgKSB7CisgICAgICAgICAg
ICAgICAgICAgIGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkg
PiAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnNwbGljZSggaW5kZXgs
IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZmlyaW5nIGluZGV4
ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGZpcmluZyApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8PSBmaXJpbmdMZW5ndGggKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmdMZW5ndGgtLTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZmlyaW5nSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8v
IENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICAv
LyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFz
IGNhbGxiYWNrcyBhdHRhY2hlZC4KKyAgICAgICAgICAgIGhhczogZnVuY3Rpb24oIGZuICkgewor
ICAgICAgICAgICAgICAgIHJldHVybiBmbiA/IGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4g
LTEgOiAhISggbGlzdCAmJiBsaXN0Lmxlbmd0aCApOworICAgICAgICAgICAgfSwKKyAgICAgICAg
ICAgIC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKKyAgICAgICAgICAgIGVt
cHR5OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gW107CisgICAgICAgICAg
ICAgICAgZmlyaW5nTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBIYXZlIHRoZSBsaXN0IGRvIG5vdGhpbmcgYW55
bW9yZQorICAgICAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAg
bGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOworICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIElzIGl0IGRpc2FibGVkPwor
ICAgICAgICAgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVy
biAhbGlzdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBMb2NrIHRoZSBsaXN0IGlu
IGl0cyBjdXJyZW50IHN0YXRlCisgICAgICAgICAgICBsb2NrOiBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgICAgICBzdGFjayA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBpZiAoICFtZW1v
cnkgKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0sCisgICAg
ICAgICAgICAvLyBJcyBpdCBsb2NrZWQ/CisgICAgICAgICAgICBsb2NrZWQ6IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgIHJldHVybiAhc3RhY2s7CisgICAgICAgICAgICB9LAorICAgICAg
ICAgICAgLy8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFy
Z3VtZW50cworICAgICAgICAgICAgZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkg
eworICAgICAgICAgICAgICAgIGlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkgewor
ICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKKyAgICAgICAgICAgICAgICAg
ICAgYXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCBmaXJpbmcgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBzdGFjay5wdXNoKCBhcmdzICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBmaXJlKCBhcmdzICk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAg
ICAgICAgICB9LAorICAgICAgICAgICAgLy8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRo
ZSBnaXZlbiBhcmd1bWVudHMKKyAgICAgICAgICAgIGZpcmU6IGZ1bmN0aW9uKCkgeworICAgICAg
ICAgICAgICAgIHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOworICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIFRvIGtub3cg
aWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQor
ICAgICAgICAgICAgZmlyZWQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAh
IWZpcmVkOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0gICAgcmV0dXJuIGVsZW1lbnRN
YXRjaGVyKCBtYXRjaGVycyApOwotfQorICAgIHJldHVybiBzZWxmOworfTsKIAotZnVuY3Rpb24g
bWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkg
ewotICAgIC8vIEEgY291bnRlciB0byBzcGVjaWZ5IHdoaWNoIGVsZW1lbnQgaXMgY3VycmVudGx5
IGJlaW5nIG1hdGNoZWQKLSAgICB2YXIgbWF0Y2hlckNhY2hlZFJ1bnMgPSAwLAotICAgIGJ5U2V0
ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKLSAgICBieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hl
cnMubGVuZ3RoID4gMCwKLSAgICBzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4
dCwgeG1sLCByZXN1bHRzLCBleHBhbmRDb250ZXh0ICkgewotICAgIHZhciBlbGVtLCBqLCBtYXRj
aGVyLAotICAgIHNldE1hdGNoZWQgPSBbXSwKLSAgICBtYXRjaGVkQ291bnQgPSAwLAotICAgIGkg
PSAiMCIsCi0gICAgdW5tYXRjaGVkID0gc2VlZCAmJiBbXSwKLSAgICBvdXRlcm1vc3QgPSBleHBh
bmRDb250ZXh0ICE9IG51bGwsCi0gICAgY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQs
Ci0gICAgLy8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBjb250
ZXh0Ci0gICAgZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbIlRBRyJdKCAi
KiIsIGV4cGFuZENvbnRleHQgJiYgY29udGV4dC5wYXJlbnROb2RlIHx8IGNvbnRleHQgKSwKLSAg
ICAvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hl
cgotICAgIGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwg
PyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpOwogCi0gICAgaWYgKCBvdXRlcm1vc3QgKSB7Ci0g
ICAgb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgIT09IGRvY3VtZW50ICYmIGNvbnRleHQ7Ci0g
ICAgY2FjaGVkcnVucyA9IG1hdGNoZXJDYWNoZWRSdW5zOwotICAgIH0KK2pRdWVyeS5leHRlbmQo
ewogCi0gICAgLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5
IHRvIHJlc3VsdHMKLSAgICAvLyBLZWVwIGBpYCBhIHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxl
bWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAiMDAiIGJlbG93Ci0gICAgZm9yICggOyAo
ZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7Ci0gICAgaWYgKCBieUVsZW1lbnQgJiYg
ZWxlbSApIHsKLSAgICBqID0gMDsKLSAgICB3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNo
ZXJzW2orK10pICkgewotICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7
Ci0gICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0gICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLSAg
ICBpZiAoIG91dGVybW9zdCApIHsKLSAgICBkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKLSAgICBj
YWNoZWRydW5zID0gKyttYXRjaGVyQ2FjaGVkUnVuczsKLSAgICB9Ci0gICAgfQorICAgIERlZmVy
cmVkOiBmdW5jdGlvbiggZnVuYyApIHsKKyAgICAgICAgdmFyIHR1cGxlcyA9IFsKKyAgICAgICAg
ICAgICAgICAvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3Rh
dGUKKyAgICAgICAgICAgICAgICBbICJyZXNvbHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tz
KCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQiIF0sCisgICAgICAgICAgICAgICAgWyAicmVqZWN0
IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQiIF0s
CisgICAgICAgICAgICAgICAgWyAibm90aWZ5IiwgInByb2dyZXNzIiwgalF1ZXJ5LkNhbGxiYWNr
cygibWVtb3J5IikgXQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIHN0YXRlID0gInBlbmRp
bmciLAorICAgICAgICAgICAgcHJvbWlzZSA9IHsKKyAgICAgICAgICAgICAgICBzdGF0ZTogZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAg
ICAgICB9LAorICAgICAgICAgICAgICAgIGFsd2F5czogZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICAgICAgICAgIGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9LAorICAg
ICAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVz
cyAqLyApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZucyA9IGFyZ3VtZW50czsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIg
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlv
biggaSwgdHVwbGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0galF1
ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9y
d2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMg
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXR1cm5lZCAmJiBqUXVl
cnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuZWQucHJvbWlzZSgpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVm
ZXIubm90aWZ5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZWZlclsgdHVwbGVbIDAgXSAr
ICJXaXRoIiBdKCB0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywg
Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAg
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbnMgPSBudWxsOworICAg
ICAgICAgICAgICAgICAgICB9KS5wcm9taXNlKCk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICAgICAvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCisgICAgICAgICAg
ICAgICAgLy8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQg
dG8gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgIHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQo
IG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9LAorICAgICAgICAgICAgZGVmZXJyZWQgPSB7fTsKKworICAgICAgICAvLyBLZWVwIHBpcGUg
Zm9yIGJhY2stY29tcGF0CisgICAgICAgIHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKKwor
ICAgICAgICAvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzCisgICAgICAgIGpRdWVyeS5lYWNo
KCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0g
dHVwbGVbIDIgXSwKKyAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07CisK
KyAgICAgICAgICAgIC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3Qu
YWRkCisgICAgICAgICAgICBwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7CisKKyAgICAg
ICAgICAgIC8vIEhhbmRsZSBzdGF0ZQorICAgICAgICAgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsK
KyAgICAgICAgICAgICAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXQorICAgICAgICAgICAgICAgICAg
ICBzdGF0ZSA9IHN0YXRlU3RyaW5nOworCisgICAgICAgICAgICAgICAgLy8gWyByZWplY3RfbGlz
dCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9jaworICAgICAgICAg
ICAgICAgIH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0u
bG9jayApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZWZlcnJlZFsgcmVzb2x2
ZSB8IHJlamVjdCB8IG5vdGlmeSBdCisgICAgICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gXSA9
IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGRlZmVycmVkWyB0dXBsZVswXSArICJXaXRo
IiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBk
ZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CisgICAgICAgIH0p
OworCisgICAgICAgIC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZQorICAgICAgICBwcm9t
aXNlLnByb21pc2UoIGRlZmVycmVkICk7CisKKyAgICAgICAgLy8gQ2FsbCBnaXZlbiBmdW5jIGlm
IGFueQorICAgICAgICBpZiAoIGZ1bmMgKSB7CisgICAgICAgICAgICBmdW5jLmNhbGwoIGRlZmVy
cmVkLCBkZWZlcnJlZCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsIGRvbmUhCisgICAg
ICAgIHJldHVybiBkZWZlcnJlZDsKKyAgICB9LAogCi0gICAgLy8gVHJhY2sgdW5tYXRjaGVkIGVs
ZW1lbnRzIGZvciBzZXQgZmlsdGVycwotICAgIGlmICggYnlTZXQgKSB7Ci0gICAgLy8gVGhleSB3
aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwotICAgIGlmICggKGVs
ZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKLSAgICBtYXRjaGVkQ291bnQtLTsKKyAgICAvLyBE
ZWZlcnJlZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4s
IHN1Ym9yZGluYXRlTiAqLyApIHsKKyAgICAgICAgdmFyIGkgPSAwLAorICAgICAgICAgICAgcmVz
b2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgICAgICAgICAgbGVuZ3Ro
ID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsCisKKyAgICAgICAgICAgIC8vIHRoZSBjb3VudCBvZiB1
bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IGxlbmd0aCAh
PT0gMSB8fCAoIHN1Ym9yZGluYXRlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzdWJvcmRpbmF0ZS5w
cm9taXNlICkgKSA/IGxlbmd0aCA6IDAsCisKKyAgICAgICAgICAgIC8vIHRoZSBtYXN0ZXIgRGVm
ZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVk
LCBqdXN0IHVzZSB0aGF0LgorICAgICAgICAgICAgZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEg
PyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLAorCisgICAgICAgICAgICAvLyBVcGRh
dGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzCisgICAgICAg
ICAgICB1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgY29udGV4dHNbIGkgXSA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1sgaSBd
ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVl
OworICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywg
dmFsdWVzICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5n
ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29u
dGV4dHMsIHZhbHVlcyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fTsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHByb2dyZXNzVmFsdWVzLCBwcm9ncmVz
c0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CisKKyAgICAgICAgLy8gYWRkIGxpc3RlbmVycyB0
byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZAorICAgICAg
ICBpZiAoIGxlbmd0aCA+IDEgKSB7CisgICAgICAgICAgICBwcm9ncmVzc1ZhbHVlcyA9IG5ldyBB
cnJheSggbGVuZ3RoICk7CisgICAgICAgICAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5
KCBsZW5ndGggKTsKKyAgICAgICAgICAgIHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVu
Z3RoICk7CisgICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVz
b2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2
ZVZhbHVlc1sgaSBdLnByb21pc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRvbmUoIHVw
ZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApICkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKQorICAgICAgICAgICAgICAg
ICAgICAgICAgLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9n
cmVzc1ZhbHVlcyApICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgLS1yZW1haW5pbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgLy8gaWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJl
c29sdmUgdGhlIG1hc3RlcgorICAgICAgICBpZiAoICFyZW1haW5pbmcgKSB7CisgICAgICAgICAg
ICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOwogICAgIH0K
K30pOwogCi0gICAgLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRj
aGVkIG9yIG5vdAotICAgIGlmICggc2VlZCApIHsKLSAgICB1bm1hdGNoZWQucHVzaCggZWxlbSAp
OwotICAgIH0KLSAgICB9Ci0gICAgfQogCi0gICAgLy8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5t
YXRjaGVkIGVsZW1lbnRzCi0gICAgbWF0Y2hlZENvdW50ICs9IGk7Ci0gICAgaWYgKCBieVNldCAm
JiBpICE9PSBtYXRjaGVkQ291bnQgKSB7Ci0gICAgaiA9IDA7Ci0gICAgd2hpbGUgKCAobWF0Y2hl
ciA9IHNldE1hdGNoZXJzW2orK10pICkgewotICAgIG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0
Y2hlZCwgY29udGV4dCwgeG1sICk7Ci0gICAgfQorLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9N
IHJlYWR5Cit2YXIgcmVhZHlMaXN0OwogCi0gICAgaWYgKCBzZWVkICkgewotICAgIC8vIFJlaW50
ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmcK
LSAgICBpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7Ci0gICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAg
aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHsKLSAgICBzZXRNYXRjaGVk
W2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTsKLSAgICB9Ci0gICAgfQotICAgIH0KK2pRdWVyeS5m
bi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHsKKyAgICAvLyBBZGQgdGhlIGNhbGxiYWNrCisgICAg
alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApOwogCi0gICAgLy8gRGlzY2FyZCBpbmRl
eCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXMKLSAgICBzZXRN
YXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKLSAgICB9CisgICAgcmV0dXJuIHRoaXM7
Cit9OwogCi0gICAgLy8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0cwotICAgIHB1c2guYXBwbHkoIHJl
c3VsdHMsIHNldE1hdGNoZWQgKTsKK2pRdWVyeS5leHRlbmQoeworICAgIC8vIElzIHRoZSBET00g
cmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCisgICAgaXNSZWFk
eTogZmFsc2UsCiAKLSAgICAvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRp
cGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKLSAgICBpZiAoIG91dGVy
bW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiYKLSAgICAoIG1hdGNoZWRD
b3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHsKKyAgICAvLyBBIGNvdW50ZXIgdG8g
dHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisgICAgLy8gdGhlIHJlYWR5
IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEsCiAKLSAgICBTaXp6bGUu
dW5pcXVlU29ydCggcmVzdWx0cyApOwotICAgIH0KLSAgICB9CisgICAgLy8gSG9sZCAob3IgcmVs
ZWFzZSkgdGhlIHJlYWR5IGV2ZW50CisgICAgaG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHsK
KyAgICAgICAgaWYgKCBob2xkICkgeworICAgICAgICAgICAgalF1ZXJ5LnJlYWR5V2FpdCsrOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgalF1ZXJ5LnJlYWR5KCB0cnVlICk7CisgICAg
ICAgIH0KKyAgICB9LAogCi0gICAgLy8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMg
YnkgbmVzdGVkIG1hdGNoZXJzCi0gICAgaWYgKCBvdXRlcm1vc3QgKSB7Ci0gICAgZGlycnVucyA9
IGRpcnJ1bnNVbmlxdWU7Ci0gICAgb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7Ci0g
ICAgfQorICAgIC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKyAgICByZWFkeTogZnVu
Y3Rpb24oIHdhaXQgKSB7CiAKLSAgICByZXR1cm4gdW5tYXRjaGVkOwotICAgIH07CisgICAgICAg
IC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVh
ZHkKKyAgICAgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1
ZXJ5LmlzUmVhZHkgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIHJl
dHVybiBieVNldCA/Ci0gICAgbWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6Ci0gICAgc3Vw
ZXJNYXRjaGVyOwotfQorICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkK
KyAgICAgICAgalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwogCi1jb21waWxlID0gU2l6emxlLmNvbXBp
bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGdyb3VwIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkg
ewotICAgIHZhciBpLAotICAgIHNldE1hdGNoZXJzID0gW10sCi0gICAgZWxlbWVudE1hdGNoZXJz
ID0gW10sCi0gICAgY2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKKyAg
ICAgICAgLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFu
ZCB3YWl0IGlmIG5lZWQgYmUKKyAgICAgICAgaWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5
LnJlYWR5V2FpdCA+IDAgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAg
IGlmICggIWNhY2hlZCApIHsKLSAgICAvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2
ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnQKLSAgICBp
ZiAoICFncm91cCApIHsKLSAgICBncm91cCA9IHRva2VuaXplKCBzZWxlY3RvciApOwotICAgIH0K
LSAgICBpID0gZ3JvdXAubGVuZ3RoOwotICAgIHdoaWxlICggaS0tICkgewotICAgIGNhY2hlZCA9
IG1hdGNoZXJGcm9tVG9rZW5zKCBncm91cFtpXSApOwotICAgIGlmICggY2FjaGVkWyBleHBhbmRv
IF0gKSB7Ci0gICAgc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7Ci0gICAgfSBlbHNlIHsKLSAg
ICBlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7Ci0gICAgfQotICAgIH0KKyAgICAgICAg
Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQorICAgICAgICByZWFk
eUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CiAKLSAgICAvLyBDYWNo
ZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KLSAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxl
Y3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNo
ZXJzICkgKTsKKyAgICAgICAgLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisgICAg
ICAgIGlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7CisgICAgICAgICAgICBqUXVlcnkoIGRvY3Vt
ZW50ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7CisgICAgICAgIH0KICAgICB9Ci0g
ICAgcmV0dXJuIGNhY2hlZDsKLX07Cit9KTsKIAotZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cygg
c2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewotICAgIHZhciBpID0gMCwKLSAgICBsZW4g
PSBjb250ZXh0cy5sZW5ndGg7Ci0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgU2l6
emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHJlc3VsdHM7CisvKioKKyAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFu
dXAgbWV0aG9kCisgKi8KK2Z1bmN0aW9uIGNvbXBsZXRlZCgpIHsKKyAgICBkb2N1bWVudC5yZW1v
dmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsK
KyAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNl
ICk7CisgICAgalF1ZXJ5LnJlYWR5KCk7CiB9CiAKLWZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3Is
IGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFyIGksIHRva2VucywgdG9rZW4sIHR5
cGUsIGZpbmQsCi0gICAgbWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKK2pRdWVyeS5yZWFk
eS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKKyAgICBpZiAoICFyZWFkeUxpc3QgKSB7CiAK
LSAgICBpZiAoICFzZWVkICkgewotICAgIC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlm
IHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwCi0gICAgaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7
CisgICAgICAgIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpOwogCi0gICAgLy8gVGFrZSBh
IHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4g
SUQKLSAgICB0b2tlbnMgPSBtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwICk7Ci0gICAgaWYg
KCB0b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNbMF0pLnR5cGUgPT09ICJJRCIg
JiYKLSAgICBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFkb2N1bWVudElzWE1MICYmCi0gICAg
RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsKKyAgICAgICAgLy8gQ2F0Y2ggY2Fz
ZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIg
ZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuCisgICAgICAgIC8vIHdlIG9uY2UgdHJpZWQgdG8g
dXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBs
aWtlIHRoZSBvbmUKKyAgICAgICAgLy8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDov
L2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNQorICAgICAgICBpZiAoIGRv
Y3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisgICAgICAgICAgICAvLyBIYW5k
bGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8g
ZGVsYXkgcmVhZHkKKyAgICAgICAgICAgIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwogCi0g
ICAgY29udGV4dCA9IEV4cHIuZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBy
dW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBjb250ZXh0IClbMF07Ci0gICAgaWYgKCAhY29udGV4dCAp
IHsKLSAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9CisgICAgICAgIH0gZWxzZSB7CiAKLSAgICBz
ZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTsK
LSAgICB9CisgICAgICAgICAgICAvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCisgICAg
ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNv
bXBsZXRlZCwgZmFsc2UgKTsKIAotICAgIC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRv
LWxlZnQgbWF0Y2hpbmcKLSAgICBpID0gbWF0Y2hFeHByWyJuZWVkc0NvbnRleHQiXS50ZXN0KCBz
ZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7Ci0gICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAg
dG9rZW4gPSB0b2tlbnNbaV07Ci0KLSAgICAvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9y
Ci0gICAgaWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7Ci0gICAg
YnJlYWs7Ci0gICAgfQotICAgIGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7Ci0g
ICAgLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJp
bmF0b3JzCi0gICAgaWYgKCAoc2VlZCA9IGZpbmQoCi0gICAgdG9rZW4ubWF0Y2hlc1swXS5yZXBs
YWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAotICAgIHJzaWJsaW5nLnRlc3QoIHRva2Vuc1sw
XS50eXBlICkgJiYgY29udGV4dC5wYXJlbnROb2RlIHx8IGNvbnRleHQKLSAgICApKSApIHsKLQot
ICAgIC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVy
biBlYXJseQotICAgIHRva2Vucy5zcGxpY2UoIGksIDEgKTsKLSAgICBzZWxlY3RvciA9IHNlZWQu
bGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApOwotICAgIGlmICggIXNlbGVjdG9yICkgewot
ICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoIHNlZWQsIDAgKSApOwotICAgIHJl
dHVybiByZXN1bHRzOworICAgICAgICAgICAgLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2Fk
LCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKyAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3Rl
bmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKKyAgICAgICAgfQogICAgIH0KKyAgICBy
ZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApOworfTsKIAotICAgIGJyZWFrOwotICAgIH0K
LSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9CisvLyBLaWNrIG9mZiB0aGUgRE9NIHJlYWR5IGNo
ZWNrIGV2ZW4gaWYgdGhlIHVzZXIgZG9lcyBub3QKK2pRdWVyeS5yZWFkeS5wcm9taXNlKCk7CiAK
LSAgICAvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uCi0gICAgLy8g
UHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRo
ZSBzZWxlY3RvciBhYm92ZQotICAgIGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApKAotICAgIHNl
ZWQsCi0gICAgY29udGV4dCwKLSAgICBkb2N1bWVudElzWE1MLAotICAgIHJlc3VsdHMsCi0gICAg
cnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKQotICAgICk7Ci0gICAgcmV0dXJuIHJlc3VsdHM7Ci19
CiAKLS8vIERlcHJlY2F0ZWQKLUV4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3NbImVx
Il07CiAKLS8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVycwotZnVuY3Rpb24g
c2V0RmlsdGVycygpIHt9Ci1FeHByLmZpbHRlcnMgPSBzZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4
cHIucHNldWRvczsKLUV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7CiAKLS8vIElu
aXRpYWxpemUgd2l0aCB0aGUgZGVmYXVsdCBkb2N1bWVudAotc2V0RG9jdW1lbnQoKTsKKy8vIE11
bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlv
bgorLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1
bmN0aW9uCit2YXIgYWNjZXNzID0galF1ZXJ5LmFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4s
IGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9IDAs
CisgICAgICAgIGxlbiA9IGVsZW1zLmxlbmd0aCwKKyAgICAgICAgYnVsayA9IGtleSA9PSBudWxs
OwogCi0vLyBPdmVycmlkZSBzaXp6bGUgYXR0cmlidXRlIHJldHJpZXZhbAotU2l6emxlLmF0dHIg
PSBqUXVlcnkuYXR0cjsKLWpRdWVyeS5maW5kID0gU2l6emxlOwotalF1ZXJ5LmV4cHIgPSBTaXp6
bGUuc2VsZWN0b3JzOwotalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7Ci1q
UXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7Ci1qUXVlcnkudGV4dCA9IFNpenpsZS5n
ZXRUZXh0OwotalF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MOwotalF1ZXJ5LmNvbnRhaW5z
ID0gU2l6emxlLmNvbnRhaW5zOworICAgIC8vIFNldHMgbWFueSB2YWx1ZXMKKyAgICBpZiAoIGpR
dWVyeS50eXBlKCBrZXkgKSA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgIGNoYWluYWJsZSA9IHRy
dWU7CisgICAgICAgIGZvciAoIGkgaW4ga2V5ICkgeworICAgICAgICAgICAgalF1ZXJ5LmFjY2Vz
cyggZWxlbXMsIGZuLCBpLCBrZXlbaV0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKKyAgICAgICAg
fQogCisgICAgLy8gU2V0cyBvbmUgdmFsdWUKKyAgICB9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5k
ZWZpbmVkICkgeworICAgICAgICBjaGFpbmFibGUgPSB0cnVlOworCisgICAgICAgIGlmICggIWpR
dWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworICAgICAgICAgICAgcmF3ID0gdHJ1ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmICggYnVsayApIHsKKyAgICAgICAgICAgIC8vIEJ1bGsgb3Bl
cmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAorICAgICAgICAgICAgaWYgKCByYXcg
KSB7CisgICAgICAgICAgICAgICAgZm4uY2FsbCggZWxlbXMsIHZhbHVlICk7CisgICAgICAgICAg
ICAgICAgZm4gPSBudWxsOworCisgICAgICAgICAgICAvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRp
bmcgZnVuY3Rpb24gdmFsdWVzCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IGJ1bGsgPSBmbjsKKyAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZh
bHVlICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVs
ZW0gKSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgaWYgKCBmbiApIHsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbjsg
aSsrICkgeworICAgICAgICAgICAgICAgIGZuKCBlbGVtc1tpXSwga2V5LCByYXcgPyB2YWx1ZSA6
IHZhbHVlLmNhbGwoIGVsZW1zW2ldLCBpLCBmbiggZWxlbXNbaV0sIGtleSApICkgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotfSkoIHdpbmRvdyApOwotdmFyIHJ1bnRpbCA9
IC9VbnRpbCQvLAotICAgIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8
QWxsKSkvLAotICAgIGlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKLSAgICBybmVlZHNDb250
ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAotICAgIC8vIG1ldGhvZHMgZ3Vh
cmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlx
dWUgc2V0Ci0gICAgZ3VhcmFudGVlZFVuaXF1ZSA9IHsKLSAgICBjaGlsZHJlbjogdHJ1ZSwKLSAg
ICBjb250ZW50czogdHJ1ZSwKLSAgICBuZXh0OiB0cnVlLAotICAgIHByZXY6IHRydWUKLSAgICB9
OworICAgIHJldHVybiBjaGFpbmFibGUgPworICAgICAgICBlbGVtcyA6CiAKLWpRdWVyeS5mbi5l
eHRlbmQoewotICAgIGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICB2YXIgaSwgcmV0
LCBzZWxmLAotICAgIGxlbiA9IHRoaXMubGVuZ3RoOwotCi0gICAgaWYgKCB0eXBlb2Ygc2VsZWN0
b3IgIT09ICJzdHJpbmciICkgewotICAgIHNlbGYgPSB0aGlzOwotICAgIHJldHVybiB0aGlzLnB1
c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHsKLSAgICBmb3Ig
KCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotICAgIGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxm
WyBpIF0sIHRoaXMgKSApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0p
ICk7Ci0gICAgfQorICAgICAgICAvLyBHZXRzCisgICAgICAgIGJ1bGsgPworICAgICAgICAgICAg
Zm4uY2FsbCggZWxlbXMgKSA6CisgICAgICAgICAgICBsZW4gPyBmbiggZWxlbXNbMF0sIGtleSAp
IDogZW1wdHlHZXQ7Cit9OwogCi0gICAgcmV0ID0gW107Ci0gICAgZm9yICggaSA9IDA7IGkgPCBs
ZW47IGkrKyApIHsKLSAgICBqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbIGkgXSwgcmV0ICk7
Ci0gICAgfQogCi0gICAgLy8gTmVlZGVkIGJlY2F1c2UgJCggc2VsZWN0b3IsIGNvbnRleHQgKSBi
ZWNvbWVzICQoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApCi0gICAgcmV0ID0gdGhpcy5wdXNo
U3RhY2soIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApOwotICAgIHJldC5z
ZWxlY3RvciA9ICggdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyAiICIgOiAiIiApICsg
c2VsZWN0b3I7Ci0gICAgcmV0dXJuIHJldDsKLSAgICB9LAorLyoqCisgKiBEZXRlcm1pbmVzIHdo
ZXRoZXIgYW4gb2JqZWN0IGNhbiBoYXZlIGRhdGEKKyAqLworalF1ZXJ5LmFjY2VwdERhdGEgPSBm
dW5jdGlvbiggb3duZXIgKSB7CisgICAgLy8gQWNjZXB0cyBvbmx5OgorICAgIC8vICAtIE5vZGUK
KyAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFCisgICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5U
X05PREUKKyAgICAvLyAgLSBPYmplY3QKKyAgICAvLyAgICAtIEFueQorICAgIC8qIGpzaGludCAt
VzAxOCAqLworICAgIHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlw
ZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTsKK307CiAKLSAgICBoYXM6IGZ1bmN0aW9u
KCB0YXJnZXQgKSB7Ci0gICAgdmFyIGksCi0gICAgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0
aGlzICksCi0gICAgbGVuID0gdGFyZ2V0cy5sZW5ndGg7CiAKLSAgICByZXR1cm4gdGhpcy5maWx0
ZXIoZnVuY3Rpb24oKSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLSAgICBp
ZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewotICAgIHJldHVybiB0
cnVlOwotICAgIH0KLSAgICB9CitmdW5jdGlvbiBEYXRhKCkgeworICAgIC8vIFN1cHBvcnQ6IEFu
ZHJvaWQgPCA0LAorICAgIC8vIE9sZCBXZWJLaXQgZG9lcyBub3QgaGF2ZSBPYmplY3QucHJldmVu
dEV4dGVuc2lvbnMvZnJlZXplIG1ldGhvZCwKKyAgICAvLyByZXR1cm4gbmV3IGVtcHR5IG9iamVj
dCBpbnN0ZWFkIHdpdGggbm8gW1tzZXRdXSBhY2Nlc3NvcgorICAgIE9iamVjdC5kZWZpbmVQcm9w
ZXJ0eSggdGhpcy5jYWNoZSA9IHt9LCAwLCB7CisgICAgICAgIGdldDogZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KICAgICB9KTsKLSAgICB9LAotCi0gICAg
bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3
aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSApOwotICAgIH0sCiAKLSAgICBmaWx0ZXI6IGZ1
bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0
aGlzLCBzZWxlY3RvciwgdHJ1ZSkgKTsKLSAgICB9LAorICAgIHRoaXMuZXhwYW5kbyA9IGpRdWVy
eS5leHBhbmRvICsgTWF0aC5yYW5kb20oKTsKK30KIAotICAgIGlzOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7Ci0gICAgcmV0dXJuICEhc2VsZWN0b3IgJiYgKAotICAgIHR5cGVvZiBzZWxlY3RvciA9
PT0gInN0cmluZyIgPwotICAgIC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNl
bGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKLSAgICAvLyBzbyAk
KCJwOmZpcnN0IikuaXMoInA6bGFzdCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRo
IHR3byAicCIuCi0gICAgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8KLSAgICBqUXVl
cnkoIHNlbGVjdG9yLCB0aGlzLmNvbnRleHQgKS5pbmRleCggdGhpc1swXSApID49IDAgOgotICAg
IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMCA6Ci0gICAgdGhpcy5m
aWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwotICAgIH0sCitEYXRhLnVpZCA9IDE7CitE
YXRhLmFjY2VwdHMgPSBqUXVlcnkuYWNjZXB0RGF0YTsKKworRGF0YS5wcm90b3R5cGUgPSB7Cisg
ICAga2V5OiBmdW5jdGlvbiggb3duZXIgKSB7CisgICAgICAgIC8vIFdlIGNhbiBhY2NlcHQgZGF0
YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLAorICAgICAgICAvLyBi
dXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LgorICAgICAgICAvLyBBbHdheXMgcmV0dXJuIHRo
ZSBrZXkgZm9yIGEgZnJvemVuIG9iamVjdC4KKyAgICAgICAgaWYgKCAhRGF0YS5hY2NlcHRzKCBv
d25lciApICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICB2
YXIgZGVzY3JpcHRvciA9IHt9LAorICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG93bmVyIG9i
amVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlIGtleQorICAgICAgICAgICAgdW5sb2NrID0gb3duZXJb
IHRoaXMuZXhwYW5kbyBdOworCisgICAgICAgIC8vIElmIG5vdCwgY3JlYXRlIG9uZQorICAgICAg
ICBpZiAoICF1bmxvY2sgKSB7CisgICAgICAgICAgICB1bmxvY2sgPSBEYXRhLnVpZCsrOworCisg
ICAgICAgICAgICAvLyBTZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxl
IHByb3BlcnR5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Jb
IHRoaXMuZXhwYW5kbyBdID0geyB2YWx1ZTogdW5sb2NrIH07CisgICAgICAgICAgICAgICAgT2Jq
ZWN0LmRlZmluZVByb3BlcnRpZXMoIG93bmVyLCBkZXNjcmlwdG9yICk7CisKKyAgICAgICAgICAg
IC8vIFN1cHBvcnQ6IEFuZHJvaWQgPCA0CisgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBhIGxl
c3Mgc2VjdXJlIGRlZmluaXRpb24KKyAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkgeworICAgICAg
ICAgICAgICAgIGRlc2NyaXB0b3JbIHRoaXMuZXhwYW5kbyBdID0gdW5sb2NrOworICAgICAgICAg
ICAgICAgIGpRdWVyeS5leHRlbmQoIG93bmVyLCBkZXNjcmlwdG9yICk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhlIGNhY2hlIG9iamVjdAorICAgICAg
ICBpZiAoICF0aGlzLmNhY2hlWyB1bmxvY2sgXSApIHsKKyAgICAgICAgICAgIHRoaXMuY2FjaGVb
IHVubG9jayBdID0ge307CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdW5sb2NrOworICAg
IH0sCisgICAgc2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkgeworICAgICAgICB2
YXIgcHJvcCwKKyAgICAgICAgICAgIC8vIFRoZXJlIG1heSBiZSBhbiB1bmxvY2sgYXNzaWduZWQg
dG8gdGhpcyBub2RlLAorICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZW50cnkgZm9yIHRo
aXMgIm93bmVyIiwgY3JlYXRlIG9uZSBpbmxpbmUKKyAgICAgICAgICAgIC8vIGFuZCBzZXQgdGhl
IHVubG9jayBhcyB0aG91Z2ggYW4gb3duZXIgZW50cnkgaGFkIGFsd2F5cyBleGlzdGVkCisgICAg
ICAgICAgICB1bmxvY2sgPSB0aGlzLmtleSggb3duZXIgKSwKKyAgICAgICAgICAgIGNhY2hlID0g
dGhpcy5jYWNoZVsgdW5sb2NrIF07CisKKyAgICAgICAgLy8gSGFuZGxlOiBbIG93bmVyLCBrZXks
IHZhbHVlIF0gYXJncworICAgICAgICBpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsK
KyAgICAgICAgICAgIGNhY2hlWyBkYXRhIF0gPSB2YWx1ZTsKKworICAgICAgICAvLyBIYW5kbGU6
IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJncworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gRnJlc2ggYXNzaWdubWVudHMgYnkgb2JqZWN0IGFyZSBzaGFsbG93IGNvcGllZAor
ICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkuZXh0ZW5kKCB0aGlzLmNhY2hlWyB1bmxvY2sgXSwgZGF0YSApOwor
ICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUg
dG8gdGhlIGNhY2hlIG9iamVjdAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICBmb3IgKCBwcm9wIGluIGRhdGEgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlWyBwcm9w
IF0gPSBkYXRhWyBwcm9wIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICB9LAorICAgIGdldDogZnVuY3Rpb24o
IG93bmVyLCBrZXkgKSB7CisgICAgICAgIC8vIEVpdGhlciBhIHZhbGlkIGNhY2hlIGlzIGZvdW5k
LCBvciB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICAgIC8vIE5ldyBjYWNoZXMgd2lsbCBiZSBjcmVh
dGVkIGFuZCB0aGUgdW5sb2NrIHJldHVybmVkLAorICAgICAgICAvLyBhbGxvd2luZyBkaXJlY3Qg
YWNjZXNzIHRvIHRoZSBuZXdseSBjcmVhdGVkCisgICAgICAgIC8vIGVtcHR5IGRhdGEgb2JqZWN0
LiBBIHZhbGlkIG93bmVyIG9iamVjdCBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgICB2YXIgY2Fj
aGUgPSB0aGlzLmNhY2hlWyB0aGlzLmtleSggb3duZXIgKSBdOworCisgICAgICAgIHJldHVybiBr
ZXkgPT09IHVuZGVmaW5lZCA/CisgICAgICAgICAgICBjYWNoZSA6IGNhY2hlWyBrZXkgXTsKKyAg
ICB9LAorICAgIGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkgeworICAgICAg
ICB2YXIgc3RvcmVkOworICAgICAgICAvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6CisgICAgICAg
IC8vCisgICAgICAgIC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWQKKyAgICAgICAgLy8gICAy
LiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkCisgICAg
ICAgIC8vCisgICAgICAgIC8vIFRha2UgdGhlICJyZWFkIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0
IG1ldGhvZCB0byBkZXRlcm1pbmUKKyAgICAgICAgLy8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCBy
ZXNwZWN0aXZlbHkgZWl0aGVyOgorICAgICAgICAvLworICAgICAgICAvLyAgIDEuIFRoZSBlbnRp
cmUgY2FjaGUgb2JqZWN0CisgICAgICAgIC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBr
ZXkKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fAorICAgICAg
ICAgICAgICAgICgoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciKSAmJiB2YWx1ZSA9PT0g
dW5kZWZpbmVkKSApIHsKKworICAgICAgICAgICAgc3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBr
ZXkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID8KKyAgICAg
ICAgICAgICAgICBzdG9yZWQgOiB0aGlzLmdldCggb3duZXIsIGpRdWVyeS5jYW1lbENhc2Uoa2V5
KSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gWypdV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0
cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWUKKyAgICAgICAgLy8gYXJlIHNwZWNpZmllZCwg
c2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6CisgICAgICAgIC8v
CisgICAgICAgIC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXMKKyAgICAgICAgLy8gICAy
LiBBIGtleSBhbmQgdmFsdWUKKyAgICAgICAgLy8KKyAgICAgICAgdGhpcy5zZXQoIG93bmVyLCBr
ZXksIHZhbHVlICk7CisKKyAgICAgICAgLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUg
dHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cworICAgICAgICAvLyByZXR1cm4gdGhlIGV4cGVjdGVk
IGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl0KKyAgICAgICAgcmV0dXJuIHZh
bHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTsKKyAgICB9LAorICAgIHJlbW92ZTogZnVu
Y3Rpb24oIG93bmVyLCBrZXkgKSB7CisgICAgICAgIHZhciBpLCBuYW1lLCBjYW1lbCwKKyAgICAg
ICAgICAgIHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLAorICAgICAgICAgICAgY2FjaGUgPSB0
aGlzLmNhY2hlWyB1bmxvY2sgXTsKKworICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkg
eworICAgICAgICAgICAgdGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTsKKworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3Ry
aW5nIG9mIGtleXMKKyAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIGtleSApICkgewor
ICAgICAgICAgICAgICAgIC8vIElmICJuYW1lIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uCisgICAg
ICAgICAgICAgICAgLy8gV2hlbiBkYXRhIGlzIGluaXRpYWxseSBjcmVhdGVkLCB2aWEgKCJrZXki
LCAidmFsIikgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIC8vIGtleXMgd2lsbCBiZSBjb252
ZXJ0ZWQgdG8gY2FtZWxDYXNlLgorICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG5v
IHdheSB0byB0ZWxsIF9ob3dfIGEga2V5IHdhcyBhZGRlZCwgcmVtb3ZlCisgICAgICAgICAgICAg
ICAgLy8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NgorICAgICAgICAg
ICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRo
LgorICAgICAgICAgICAgICAgIG5hbWUgPSBrZXkuY29uY2F0KCBrZXkubWFwKCBqUXVlcnkuY2Ft
ZWxDYXNlICkgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FtZWwg
PSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIHN0
cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgorICAgICAgICAgICAgICAgIGlm
ICgga2V5IGluIGNhY2hlICkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gWyBrZXksIGNh
bWVsIF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
SWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LgorICAgICAgICAgICAgICAg
ICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVz
cGFjZQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gY2FtZWw7CisgICAgICAgICAgICAgICAg
ICAgIG5hbWUgPSBuYW1lIGluIGNhY2hlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFsgbmFt
ZSBdIDogKCBuYW1lLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSApOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSA9IG5hbWUubGVuZ3RoOworICAgICAg
ICAgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlWyBuYW1l
WyBpIF0gXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgaGFzRGF0YTog
ZnVuY3Rpb24oIG93bmVyICkgeworICAgICAgICByZXR1cm4gIWpRdWVyeS5pc0VtcHR5T2JqZWN0
KAorICAgICAgICAgICAgdGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF0gfHwge30K
KyAgICAgICAgKTsKKyAgICB9LAorICAgIGRpc2NhcmQ6IGZ1bmN0aW9uKCBvd25lciApIHsKKyAg
ICAgICAgaWYgKCBvd25lclsgdGhpcy5leHBhbmRvIF0gKSB7CisgICAgICAgICAgICBkZWxldGUg
dGhpcy5jYWNoZVsgb3duZXJbIHRoaXMuZXhwYW5kbyBdIF07CisgICAgICAgIH0KKyAgICB9Cit9
OwordmFyIGRhdGFfcHJpdiA9IG5ldyBEYXRhKCk7CiAKLSAgICBjbG9zZXN0OiBmdW5jdGlvbigg
c2VsZWN0b3JzLCBjb250ZXh0ICkgewotICAgIHZhciBjdXIsCi0gICAgaSA9IDAsCi0gICAgbCA9
IHRoaXMubGVuZ3RoLAotICAgIHJldCA9IFtdLAotICAgIHBvcyA9IHJuZWVkc0NvbnRleHQudGVz
dCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwotICAgIGpR
dWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoKLSAgICAwOwordmFy
IGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7CiAKLSAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0g
ICAgY3VyID0gdGhpc1tpXTsKIAotICAgIHdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50
ICYmIGN1ciAhPT0gY29udGV4dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgewotICAgIGlmICgg
cG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3Rvcihj
dXIsIHNlbGVjdG9ycykgKSB7Ci0gICAgcmV0LnB1c2goIGN1ciApOwotICAgIGJyZWFrOwotICAg
IH0KLSAgICBjdXIgPSBjdXIucGFyZW50Tm9kZTsKLSAgICB9Ci0gICAgfQogCi0gICAgcmV0dXJu
IHRoaXMucHVzaFN0YWNrKCByZXQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDog
cmV0ICk7Ci0gICAgfSwKKy8qCisgICAgSW1wbGVtZW50YXRpb24gU3VtbWFyeQorCisgICAgMS4g
RW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54
IGJyYW5jaAorICAgIDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSBy
ZWR1Y2luZyB0aGUgc3RvcmFnZQorICAgICAgICBwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20u
CisgICAgMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0
ZSIgYW5kICJ1c2VyIiBkYXRhLgorICAgIDQuIF9OZXZlcl8gZXhwb3NlICJwcml2YXRlIiBkYXRh
IHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpCisgICAgNS4gQXZv
aWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBl
eHBhbmRvIHByb3BlcnRpZXMpCisgICAgNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxl
bWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0CisqLwordmFyIHJicmFjZSA9IC9e
KD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sCisgICAgcm11bHRpRGFzaCA9IC8oW0EtWl0p
L2c7CiAKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGlu
Ci0gICAgLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCi0gICAgaW5kZXg6IGZ1bmN0aW9u
KCBlbGVtICkgeworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAgICB2
YXIgbmFtZTsKIAotICAgIC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50Ci0g
ICAgaWYgKCAhZWxlbSApIHsKLSAgICByZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50
Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTsKKyAgICAvLyBJZiBu
b3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55CisgICAgLy8gZGF0
YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCisgICAgaWYgKCBkYXRhID09PSB1bmRl
ZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKyAgICAgICAgbmFtZSA9ICJkYXRhLSIg
KyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOworICAgICAg
ICBkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworICAgICAgICBpZiAoIHR5cGVv
ZiBkYXRhID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAg
ICAgZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgorICAgICAgICAgICAgICAgICAgICBk
YXRhID09PSAiZmFsc2UiID8gZmFsc2UgOgorICAgICAgICAgICAgICAgICAgICBkYXRhID09PSAi
bnVsbCIgPyBudWxsIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb252ZXJ0IHRvIGEg
bnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAg
ICAgK2RhdGEgKyAiIiA9PT0gZGF0YSA/ICtkYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgcmJy
YWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CisgICAgICAgICAg
ICAgICAgICAgIGRhdGE7CisgICAgICAgICAgICB9IGNhdGNoKCBlICkge30KKworICAgICAgICAg
ICAgLy8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVy
CisgICAgICAgICAgICBkYXRhX3VzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KICAgICB9
CisgICAgcmV0dXJuIGRhdGE7Cit9CiAKLSAgICAvLyBpbmRleCBpbiBzZWxlY3RvcgotICAgIGlm
ICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewotICAgIHJldHVybiBqUXVlcnkuaW5BcnJh
eSggdGhpc1swXSwgalF1ZXJ5KCBlbGVtICkgKTsKLSAgICB9CitqUXVlcnkuZXh0ZW5kKHsKKyAg
ICBoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJuIGRhdGFfdXNlci5o
YXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKTsKKyAgICB9LAogCi0g
ICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50Ci0gICAgcmV0
dXJuIGpRdWVyeS5pbkFycmF5KAotICAgIC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVj
dCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAotICAgIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6
IGVsZW0sIHRoaXMgKTsKKyAgICBkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsK
KyAgICAgICAgcmV0dXJuIGRhdGFfdXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKICAg
ICB9LAogCi0gICAgYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7Ci0gICAgdmFy
IHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPwotICAgIGpRdWVyeSggc2VsZWN0
b3IsIGNvbnRleHQgKSA6Ci0gICAgalF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IgJiYgc2VsZWN0
b3Iubm9kZVR5cGUgPyBbIHNlbGVjdG9yIF0gOiBzZWxlY3RvciApLAotICAgIGFsbCA9IGpRdWVy
eS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CisgICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVs
ZW0sIG5hbWUgKSB7CisgICAgICAgIGRhdGFfdXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKKyAg
ICB9LAogCi0gICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKGFsbCkgKTsK
KyAgICAvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRh
IGhhdmUgYmVlbiByZXBsYWNlZAorICAgIC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFfcHJp
diBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC4KKyAgICBfZGF0YTogZnVuY3Rpb24o
IGVsZW0sIG5hbWUsIGRhdGEgKSB7CisgICAgICAgIHJldHVybiBkYXRhX3ByaXYuYWNjZXNzKCBl
bGVtLCBuYW1lLCBkYXRhICk7CiAgICAgfSwKIAotICAgIGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKLSAgICByZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwotICAgIHRo
aXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpCi0gICAgKTsK
KyAgICBfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisgICAgICAgIGRhdGFf
cHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKICAgICB9CiB9KTsKIAotalF1ZXJ5LmZuLmFuZFNl
bGYgPSBqUXVlcnkuZm4uYWRkQmFjazsKLQotZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7
Ci0gICAgZG8gewotICAgIGN1ciA9IGN1clsgZGlyIF07Ci0gICAgfSB3aGlsZSAoIGN1ciAmJiBj
dXIubm9kZVR5cGUgIT09IDEgKTsKK2pRdWVyeS5mbi5leHRlbmQoeworICAgIGRhdGE6IGZ1bmN0
aW9uKCBrZXksIHZhbHVlICkgeworICAgICAgICB2YXIgaSwgbmFtZSwgZGF0YSwKKyAgICAgICAg
ICAgIGVsZW0gPSB0aGlzWyAwIF0sCisgICAgICAgICAgICBhdHRycyA9IGVsZW0gJiYgZWxlbS5h
dHRyaWJ1dGVzOworCisgICAgICAgIC8vIEdldHMgYWxsIHZhbHVlcworICAgICAgICBpZiAoIGtl
eSA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLmxlbmd0aCApIHsKKyAg
ICAgICAgICAgICAgICBkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSApOworCisgICAgICAgICAg
ICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCAi
aGFzRGF0YUF0dHJzIiApICkgeworICAgICAgICAgICAgICAgICAgICBpID0gYXR0cnMubGVuZ3Ro
OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFt
ZSBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIs
IHRydWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0cyBtdWx0aXBsZSB2YWx1
ZXMKKyAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgZGF0YV91c2Vy
LnNldCggdGhpcywga2V5ICk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZh
ciBkYXRhLAorICAgICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5
ICk7CisKKyAgICAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQg
bWF0Y2hlcykgaXMgbm90IGVtcHR5CisgICAgICAgICAgICAvLyAoYW5kIHRoZXJlZm9yZSBoYXMg
YW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZQorICAgICAgICAgICAgLy8g
YHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmpl
Y3QKKyAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0g
dGhpc1sgMCBdIHdoaWNoIHdpbGwKKyAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiBp
ZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuCisgICAgICAgICAgICBp
ZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICAvLyBB
dHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgLy8gd2l0
aCB0aGUga2V5IGFzLWlzCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVs
ZW0sIGtleSApOworICAgICAgICAgICAgICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCisgICAg
ICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAorICAgICAgICAgICAgICAgIGRh
dGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApOworICAgICAgICAgICAgICAgIGlm
ICggZGF0YSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0
YTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvICJk
aXNjb3ZlciIgdGhlIGRhdGEgaW4KKyAgICAgICAgICAgICAgICAvLyBIVE1MNSBjdXN0b20gZGF0
YS0qIGF0dHJzCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtl
eSwgdW5kZWZpbmVkICk7CisgICAgICAgICAgICAgICAgaWYgKCBkYXRhICE9PSB1bmRlZmluZWQg
KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEg
ZG9lc24ndCBleGlzdC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIFNldCB0aGUgZGF0YS4uLgorICAgICAgICAgICAgdGhpcy5lYWNoKGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEg
Y29weSBvciByZWZlcmVuY2Ugb2YgYW55CisgICAgICAgICAgICAgICAgLy8gZGF0YSB0aGF0IG1p
Z2h0J3ZlIGJlZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5LgorICAgICAgICAgICAgICAg
IHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTsKKworICAgICAgICAg
ICAgICAgIC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG8K
KyAgICAgICAgICAgICAgICAvLyBzdG9yZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGRhc2hlcyBpbiBh
IGNhbWVsQ2FzZSBmb3JtLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5
IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKgorICAgICAgICAgICAgICAgIGRhdGFfdXNlci5zZXQoIHRo
aXMsIGNhbWVsS2V5LCB2YWx1ZSApOworCisgICAgICAgICAgICAgICAgLy8gKi4uLiBJbiB0aGUg
Y2FzZSBvZiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5XworICAgICAgICAgICAgICAg
IC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXQKKyAg
ICAgICAgICAgICAgICAvLyB1bmNoYW5nZWQgcHJvcGVydHkuCisgICAgICAgICAgICAgICAgaWYg
KCBrZXkuaW5kZXhPZigiLSIpICE9PSAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisgICAg
ICAgICAgICAgICAgICAgIGRhdGFfdXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwgbnVsbCwgdmFsdWUsIGFy
Z3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7CisgICAgfSwKIAotICAgIHJldHVybiBj
dXI7Ci19CisgICAgcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGRhdGFfdXNlci5yZW1vdmUoIHRo
aXMsIGtleSApOworICAgICAgICB9KTsKKyAgICB9Cit9KTsKIAotalF1ZXJ5LmVhY2goewotICAg
IHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50
Tm9kZTsKLSAgICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJl
bnQgOiBudWxsOwotICAgIH0sCi0gICAgcGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAg
cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwotICAgIH0sCi0gICAgcGFy
ZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAgcmV0dXJuIGpRdWVy
eS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKLSAgICB9LAotICAgIG5leHQ6IGZ1
bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBzaWJsaW5nKCBlbGVtLCAibmV4dFNpYmxpbmci
ICk7Ci0gICAgfSwKLSAgICBwcmV2OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1cm4gc2li
bGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKLSAgICB9LAotICAgIG5leHRBbGw6IGZ1
bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxp
bmciICk7Ci0gICAgfSwKLSAgICBwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICByZXR1
cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKLSAgICB9LAotICAgIG5l
eHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewotICAgIHJldHVybiBqUXVlcnku
ZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCApOwotICAgIH0sCi0gICAgcHJldlVudGls
OiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVs
ZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOwotICAgIH0sCi0gICAgc2libGluZ3M6IGZ1
bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBqUXVlcnkuc2libGluZyggKCBlbGVtLnBhcmVu
dE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7CisKK2pRdWVyeS5leHRlbmQoeworICAg
IHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKKyAgICAgICAgdmFyIHF1ZXVl
OworCisgICAgICAgIGlmICggZWxlbSApIHsKKyAgICAgICAgICAgIHR5cGUgPSAoIHR5cGUgfHwg
ImZ4IiApICsgInF1ZXVlIjsKKyAgICAgICAgICAgIHF1ZXVlID0gZGF0YV9wcml2LmdldCggZWxl
bSwgdHlwZSApOworCisgICAgICAgICAgICAvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcg
b3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCisgICAgICAgICAgICBpZiAoIGRh
dGEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoIGRh
dGEgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcXVldWUgPSBkYXRhX3ByaXYuYWNjZXNzKCBl
bGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CisgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCggZGF0YSApOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBxdWV1ZSB8fCBbXTsK
KyAgICAgICAgfQogICAgIH0sCi0gICAgY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewotICAg
IHJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7CisKKyAgICBkZXF1ZXVl
OiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKyAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsK
KworICAgICAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKKyAgICAg
ICAgICAgIHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAorICAgICAgICAgICAgZm4gPSBxdWV1
ZS5zaGlmdCgpLAorICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0s
IHR5cGUgKSwKKyAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAg
ICBqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOworICAgICAgICAgICAgfTsKKworICAgICAg
ICAvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dy
ZXNzIHNlbnRpbmVsCisgICAgICAgIGlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKKyAgICAg
ICAgICAgIGZuID0gcXVldWUuc2hpZnQoKTsKKyAgICAgICAgICAgIHN0YXJ0TGVuZ3RoLS07Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIGZuICkgeworCisgICAgICAgICAgICAvLyBBZGQgYSBw
cm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCisgICAg
ICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisgICAgICAgICAgICBpZiAoIHR5cGUg
PT09ICJmeCIgKSB7CisgICAgICAgICAgICAgICAgcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3Mi
ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsZWFyIHVwIHRoZSBsYXN0IHF1
ZXVlIHN0b3AgZnVuY3Rpb24KKyAgICAgICAgICAgIGRlbGV0ZSBob29rcy5zdG9wOworICAgICAg
ICAgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgeworICAgICAgICAgICAgaG9va3MuZW1wdHku
ZmlyZSgpOworICAgICAgICB9CiAgICAgfSwKLSAgICBjb250ZW50czogZnVuY3Rpb24oIGVsZW0g
KSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/Ci0gICAg
ZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50IDoKLSAg
ICBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTsKLSAgICB9Ci19LCBmdW5jdGlv
biggbmFtZSwgZm4gKSB7Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWws
IHNlbGVjdG9yICkgewotICAgIHZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwg
KTsKIAotICAgIGlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7Ci0gICAgc2VsZWN0b3IgPSB1
bnRpbDsKKyAgICAvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVy
YXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZQorICAg
IF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKyAgICAgICAgdmFyIGtleSA9
IHR5cGUgKyAicXVldWVIb29rcyI7CisgICAgICAgIHJldHVybiBkYXRhX3ByaXYuZ2V0KCBlbGVt
LCBrZXkgKSB8fCBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHsKKyAgICAgICAgICAgIGVt
cHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgICAgICBkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyAicXVldWUiLCBr
ZXkgXSApOworICAgICAgICAgICAgfSkKKyAgICAgICAgfSk7CiAgICAgfQorfSk7CiAKLSAgICBp
ZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7Ci0gICAgcmV0
ID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHJldCApOwotICAgIH0KK2pRdWVyeS5mbi5leHRl
bmQoeworICAgIHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAgICAgICAgdmFyIHNl
dHRlciA9IDI7CiAKLSAgICByZXQgPSB0aGlzLmxlbmd0aCA+IDEgJiYgIWd1YXJhbnRlZWRVbmlx
dWVbIG5hbWUgXSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0OworICAgICAgICBpZiAoIHR5
cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIGRhdGEgPSB0eXBlOworICAg
ICAgICAgICAgdHlwZSA9ICJmeCI7CisgICAgICAgICAgICBzZXR0ZXItLTsKKyAgICAgICAgfQog
Ci0gICAgaWYgKCB0aGlzLmxlbmd0aCA+IDEgJiYgcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSAp
IHsKLSAgICByZXQgPSByZXQucmV2ZXJzZSgpOworICAgICAgICBpZiAoIGFyZ3VtZW50cy5sZW5n
dGggPCBzZXR0ZXIgKSB7CisgICAgICAgICAgICByZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBd
LCB0eXBlICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVk
ID8KKyAgICAgICAgICAgIHRoaXMgOgorICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwg
ZGF0YSApOworCisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVl
dWUKKyAgICAgICAgICAgICAgICBqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTsKKwor
ICAgICAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJv
Z3Jlc3MiICkgeworICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlw
ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0sCisgICAgZGVx
dWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oKSB7CisgICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworICAgICAg
ICB9KTsKKyAgICB9LAorICAgIGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAg
ICByZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworICAgIH0sCisgICAgLy8g
R2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQorICAg
IC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorICAgIHByb21pc2U6
IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisgICAgICAgIHZhciB0bXAsCisgICAgICAgICAgICBj
b3VudCA9IDEsCisgICAgICAgICAgICBkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAorICAgICAg
ICAgICAgZWxlbWVudHMgPSB0aGlzLAorICAgICAgICAgICAgaSA9IHRoaXMubGVuZ3RoLAorICAg
ICAgICAgICAgcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICggISgg
LS1jb3VudCApICkgeworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlV2l0aCggZWxl
bWVudHMsIFsgZWxlbWVudHMgXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07
CisKKyAgICAgICAgaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAg
ICBvYmogPSB0eXBlOworICAgICAgICAgICAgdHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgfQor
ICAgICAgICB0eXBlID0gdHlwZSB8fCAiZngiOworCisgICAgICAgIHdoaWxlICggaS0tICkgewor
ICAgICAgICAgICAgdG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJx
dWV1ZUhvb2tzIiApOworICAgICAgICAgICAgaWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkgeworICAg
ICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgdG1wLmVtcHR5LmFkZCggcmVz
b2x2ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc29sdmUoKTsKKyAg
ICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOwogICAgIH0KK30pOwordmFyIHBudW0g
PSAoL1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLykuc291cmNlOwogCi0gICAg
cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKK3ZhciBjc3NFeHBhbmQgPSBbICJUb3AiLCAi
UmlnaHQiLCAiQm90dG9tIiwgIkxlZnQiIF07CisKK3ZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBl
bGVtLCBlbCApIHsKKyAgICAgICAgLy8gaXNIaWRkZW4gbWlnaHQgYmUgY2FsbGVkIGZyb20galF1
ZXJ5I2ZpbHRlciBmdW5jdGlvbjsKKyAgICAgICAgLy8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdp
bGwgYmUgc2Vjb25kIGFyZ3VtZW50CisgICAgICAgIGVsZW0gPSBlbCB8fCBlbGVtOworICAgICAg
ICByZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJub25lIiB8fCAhalF1
ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKICAgICB9OwotfSk7CiAK
LWpRdWVyeS5leHRlbmQoewotICAgIGZpbHRlcjogZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3Qg
KSB7Ci0gICAgaWYgKCBub3QgKSB7Ci0gICAgZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwot
ICAgIH0KK3ZhciByY2hlY2thYmxlVHlwZSA9ICgvXig/OmNoZWNrYm94fHJhZGlvKSQvaSk7CiAK
LSAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KLSAgICBqUXVlcnkuZmluZC5tYXRjaGVz
U2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1swXSBdIDogW10gOgotICAgIGpRdWVy
eS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwotICAgIH0sCiAKLSAgICBkaXI6IGZ1bmN0aW9u
KCBlbGVtLCBkaXIsIHVudGlsICkgewotICAgIHZhciBtYXRjaGVkID0gW10sCi0gICAgY3VyID0g
ZWxlbVsgZGlyIF07CiAKLSAgICB3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYg
KHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1
ciApLmlzKCB1bnRpbCApKSApIHsKLSAgICBpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSApIHsKLSAg
ICBtYXRjaGVkLnB1c2goIGN1ciApOwotICAgIH0KLSAgICBjdXIgPSBjdXJbZGlyXTsKLSAgICB9
Ci0gICAgcmV0dXJuIG1hdGNoZWQ7Ci0gICAgfSwKKyhmdW5jdGlvbigpIHsKKyAgICB2YXIgZnJh
Z21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCisgICAgICAgIGRpdiA9
IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7
CiAKLSAgICBzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKLSAgICB2YXIgciA9IFtdOwor
ICAgIC8vICMxMTIxNyAtIFdlYktpdCBsb3NlcyBjaGVjayB3aGVuIHRoZSBuYW1lIGlzIGFmdGVy
IHRoZSBjaGVja2VkIGF0dHJpYnV0ZQorICAgIGRpdi5pbm5lckhUTUwgPSAiPGlucHV0IHR5cGU9
J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IjsKIAotICAgIGZvciAoIDsgbjsg
biA9IG4ubmV4dFNpYmxpbmcgKSB7Ci0gICAgaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09
IGVsZW0gKSB7Ci0gICAgci5wdXNoKCBuICk7Ci0gICAgfQotICAgIH0KKyAgICAvLyBTdXBwb3J0
OiBTYWZhcmkgNS4xLCBpT1MgNS4xLCBBbmRyb2lkIDQueCwgQW5kcm9pZCAyLjMKKyAgICAvLyBv
bGQgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21l
bnRzCisgICAgc3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25l
Tm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOwogCi0gICAgcmV0dXJuIHI7Ci0gICAgfQot
fSk7CisgICAgLy8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1
ZSBpcyBwcm9wZXJseSBjbG9uZWQKKyAgICAvLyBTdXBwb3J0OiBJRTktSUUxMSsKKyAgICBkaXYu
aW5uZXJIVE1MID0gIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iOworICAgIHN1cHBvcnQubm9DbG9u
ZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVl
OworfSkoKTsKK3ZhciBzdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkOwogCi0vLyBJbXBs
ZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdAotZnVu
Y3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBrZWVwICkgewogCi0gICAgLy8gQ2Fu
J3QgcGFzcyBudWxsIG9yIHVuZGVmaW5lZCB0byBpbmRleE9mIGluIEZpcmVmb3ggNAotICAgIC8v
IFNldCB0byAwIHRvIHNraXAgc3RyaW5nIGNoZWNrCi0gICAgcXVhbGlmaWVyID0gcXVhbGlmaWVy
IHx8IDA7CiAKLSAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKLSAg
ICByZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgewotICAg
IHZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7Ci0gICAgcmV0
dXJuIHJldFZhbCA9PT0ga2VlcDsKLSAgICB9KTsKK3N1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSAi
b25mb2N1c2luIiBpbiB3aW5kb3c7CiAKLSAgICB9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5
cGUgKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICByZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSA9PT0ga2VlcDsKLSAgICB9KTsK
IAotICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewotICAg
IHZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICByZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKLSAgICB9KTsKK3ZhcgorICAgIHJrZXlF
dmVudCA9IC9ea2V5LywKKyAgICBybW91c2VFdmVudCA9IC9eKD86bW91c2V8Y29udGV4dG1lbnUp
fGNsaWNrLywKKyAgICByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1
cikkLywKKyAgICBydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlwuKC4rKXwpJC87CiAKLSAg
ICBpZiAoIGlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkgewotICAgIHJldHVybiBqUXVlcnku
ZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKLSAgICB9IGVsc2UgewotICAgIHF1
YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZmlsdGVyZWQgKTsKLSAgICB9Ci0g
ICAgfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KIAotICAg
IHJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0
dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID49IDAgKSA9PT0ga2VlcDsK
LSAgICB9KTsKK2Z1bmN0aW9uIHJldHVybkZhbHNlKCkgeworICAgIHJldHVybiBmYWxzZTsKIH0K
LWZ1bmN0aW9uIGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSB7Ci0gICAgdmFyIGxpc3Qg
PSBub2RlTmFtZXMuc3BsaXQoICJ8IiApLAotICAgIHNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRl
RG9jdW1lbnRGcmFnbWVudCgpOwotCi0gICAgaWYgKCBzYWZlRnJhZy5jcmVhdGVFbGVtZW50ICkg
ewotICAgIHdoaWxlICggbGlzdC5sZW5ndGggKSB7Ci0gICAgc2FmZUZyYWcuY3JlYXRlRWxlbWVu
dCgKLSAgICBsaXN0LnBvcCgpCi0gICAgKTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBzYWZl
RnJhZzsKKworZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7CisgICAgdHJ5IHsKKyAgICAg
ICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CisgICAgfSBjYXRjaCAoIGVyciApIHsg
fQogfQogCi12YXIgbm9kZU5hbWVzID0gImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2Fu
dmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8IiArCi0g
ICAgImhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258
c3VtbWFyeXx0aW1lfHZpZGVvIiwKLSAgICByaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcZCs9Iig/
Om51bGx8XGQrKSIvZywKLSAgICBybm9zaGltY2FjaGUgPSBuZXcgUmVnRXhwKCI8KD86IiArIG5v
ZGVOYW1lcyArICIpW1xccy8+XSIsICJpIiksCi0gICAgcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15c
cysvLAotICAgIHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0
fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksCi0gICAgcnRhZ05hbWUgPSAv
PChbXHc6XSspLywKLSAgICBydGJvZHkgPSAvPHRib2R5L2ksCi0gICAgcmh0bWwgPSAvPHwmIz9c
dys7LywKLSAgICBybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLAotICAg
IG1hbmlwdWxhdGlvbl9yY2hlY2thYmxlVHlwZSA9IC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLAot
ICAgIC8vIGNoZWNrZWQ9ImNoZWNrZWQiIG9yIGNoZWNrZWQKLSAgICByY2hlY2tlZCA9IC9jaGVj
a2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLAotICAgIHJzY3JpcHRUeXBlID0gL14kfFwv
KD86amF2YXxlY21hKXNjcmlwdC9pLAotICAgIHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXC8o
LiopLywKLSAgICByY2xlYW5TY3JpcHQgPSAvXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxd
fC0tKT5ccyokL2csCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRz
IC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICogUHJvcHMgdG8gRGVhbiBF
ZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KKyAqLworalF1
ZXJ5LmV2ZW50ID0gewogCi0gICAgLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1
cHBvcnQgWEhUTUwgKCMxMzIwMCkKLSAgICB3cmFwTWFwID0gewotICAgIG9wdGlvbjogWyAxLCAi
PHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0sCi0gICAgbGVnZW5k
OiBbIDEsICI8ZmllbGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdLAotICAgIGFyZWE6IFsgMSwgIjxt
YXA+IiwgIjwvbWFwPiIgXSwKLSAgICBwYXJhbTogWyAxLCAiPG9iamVjdD4iLCAiPC9vYmplY3Q+
IiBdLAotICAgIHRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdLAotICAgIHRyOiBb
IDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdLAotICAgIGNvbDogWyAy
LCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxl
PiIgXSwKLSAgICB0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48
L3RhYmxlPiIgXSwKLQotICAgIC8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQs
IHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsCi0gICAgLy8gdW5sZXNzIHdyYXBw
ZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC4K
LSAgICBfZGVmYXVsdDogalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSA/IFsgMCwgIiIsICIi
IF0gOiBbIDEsICJYPGRpdj4iLCAiPC9kaXY+IiAgXQotICAgIH0sCi0gICAgc2FmZUZyYWdtZW50
ID0gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApLAotICAgIGZyYWdtZW50RGl2ID0gc2Fm
ZUZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApOwor
ICAgIGdsb2JhbDoge30sCiAKLXdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKLXdy
YXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAu
Y2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Ci13cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKKyAgICBh
ZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7CisK
KyAgICAgICAgdmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLAorICAgICAgICAgICAg
ZXZlbnRzLCB0LCBoYW5kbGVPYmosCisgICAgICAgICAgICBzcGVjaWFsLCBoYW5kbGVycywgdHlw
ZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCisgICAgICAgICAgICBlbGVtRGF0YSA9IGRhdGFfcHJp
di5nZXQoIGVsZW0gKTsKKworICAgICAgICAvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0
YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKQorICAgICAg
ICBpZiAoICFlbGVtRGF0YSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4g
bGlldSBvZiB0aGUgaGFuZGxlcgorICAgICAgICBpZiAoIGhhbmRsZXIuaGFuZGxlciApIHsKKyAg
ICAgICAgICAgIGhhbmRsZU9iakluID0gaGFuZGxlcjsKKyAgICAgICAgICAgIGhhbmRsZXIgPSBo
YW5kbGVPYmpJbi5oYW5kbGVyOworICAgICAgICAgICAgc2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5z
ZWxlY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5k
bGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlcgorICAgICAg
ICBpZiAoICFoYW5kbGVyLmd1aWQgKSB7CisgICAgICAgICAgICBoYW5kbGVyLmd1aWQgPSBqUXVl
cnkuZ3VpZCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2
ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAorICAg
ICAgICBpZiAoICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHsKKyAgICAgICAgICAgIGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OworICAgICAgICB9CisgICAgICAgIGlmICggIShl
dmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSkgKSB7CisgICAgICAgICAgICBldmVudEhhbmRs
ZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkgeworICAgICAgICAgICAgICAgIC8v
IERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5k
CisgICAgICAgICAgICAgICAgLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdl
IGhhcyB1bmxvYWRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBz
dHJ1bmRlZmluZWQgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID8KKyAgICAg
ICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVu
dHMgKSA6IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICAv
LyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisgICAgICAgIHR5
cGVzID0gKCB0eXBlcyB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07CisgICAg
ICAgIHQgPSB0eXBlcy5sZW5ndGg7CisgICAgICAgIHdoaWxlICggdC0tICkgeworICAgICAgICAg
ICAgdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKKyAgICAgICAg
ICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTsKKyAgICAgICAgICAgIG5hbWVzcGFjZXMgPSAo
IHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CisKKyAgICAgICAgICAgIC8vIFRo
ZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVy
cworICAgICAgICAgICAgaWYgKCAhdHlwZSApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlw
ZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCisg
ICAgICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsK
KworICAgICAgICAgICAgLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwg
ZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCisgICAgICAgICAgICB0eXBlID0g
KCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8
IHR5cGU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJl
c2V0IHR5cGUKKyAgICAgICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlw
ZSBdIHx8IHt9OworCisgICAgICAgICAgICAvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBl
dmVudCBoYW5kbGVycworICAgICAgICAgICAgaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7Cisg
ICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAgICBvcmlnVHlwZTogb3Jp
Z1R5cGUsCisgICAgICAgICAgICAgICAgZGF0YTogZGF0YSwKKyAgICAgICAgICAgICAgICBoYW5k
bGVyOiBoYW5kbGVyLAorICAgICAgICAgICAgICAgIGd1aWQ6IGhhbmRsZXIuZ3VpZCwKKyAgICAg
ICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgbmVlZHNDb250
ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2Vs
ZWN0b3IgKSwKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIp
CisgICAgICAgICAgICB9LCBoYW5kbGVPYmpJbiApOworCisgICAgICAgICAgICAvLyBJbml0IHRo
ZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgaWYg
KCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgeworICAgICAgICAgICAgICAgIGhhbmRs
ZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxl
Z2F0ZUNvdW50ID0gMDsKKworICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlz
dGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQorICAgICAg
ICAgICAgICAgIGlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVt
LCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxz
ZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIHNwZWNpYWwuYWRkICkgeworICAgICAgICAgICAgICAg
IHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOworCisgICAgICAgICAgICAgICAg
aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgaGFu
ZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRs
ZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250CisgICAgICAgICAgICBpZiAoIHNlbGVjdG9yICkg
eworICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3Vu
dCsrLCAwLCBoYW5kbGVPYmogKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZv
ciBldmVudCBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgIGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5
cGUgXSA9IHRydWU7CisgICAgICAgIH0KIAotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgdGV4dDog
ZnVuY3Rpb24oIHZhbHVlICkgewotICAgIHJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5j
dGlvbiggdmFsdWUgKSB7Ci0gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwotICAgIGpR
dWVyeS50ZXh0KCB0aGlzICkgOgotICAgIHRoaXMuZW1wdHkoKS5hcHBlbmQoICggdGhpc1swXSAm
JiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKS5jcmVhdGVUZXh0Tm9kZSggdmFs
dWUgKSApOwotICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7CiAgICAgfSwK
IAotICAgIHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewotICAgIGlmICggalF1ZXJ5LmlzRnVu
Y3Rpb24oIGh0bWwgKSApIHsKLSAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAg
ICBqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7Ci0gICAgfSk7Ci0g
ICAgfQorICAgIC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxl
bWVudAorICAgIHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3Rv
ciwgbWFwcGVkVHlwZXMgKSB7CiAKLSAgICBpZiAoIHRoaXNbMF0gKSB7Ci0gICAgLy8gVGhlIGVs
ZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKLSAgICB2YXIgd3JhcCA9IGpRdWVyeSgg
aHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CisgICAgICAg
IHZhciBqLCBvcmlnQ291bnQsIHRtcCwKKyAgICAgICAgICAgIGV2ZW50cywgdCwgaGFuZGxlT2Jq
LAorICAgICAgICAgICAgc3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdU
eXBlLAorICAgICAgICAgICAgZWxlbURhdGEgPSBkYXRhX3ByaXYuaGFzRGF0YSggZWxlbSApICYm
IGRhdGFfcHJpdi5nZXQoIGVsZW0gKTsKKworICAgICAgICBpZiAoICFlbGVtRGF0YSB8fCAhKGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICAvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0
eXBlIG1heSBiZSBvbWl0dGVkCisgICAgICAgIHR5cGVzID0gKCB0eXBlcyB8fCAiIiApLm1hdGNo
KCBybm90d2hpdGUgKSB8fCBbICIiIF07CisgICAgICAgIHQgPSB0eXBlcy5sZW5ndGg7CisgICAg
ICAgIHdoaWxlICggdC0tICkgeworICAgICAgICAgICAgdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhl
YyggdHlwZXNbdF0gKSB8fCBbXTsKKyAgICAgICAgICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsx
XTsKKyAgICAgICAgICAgIG5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIg
KS5zb3J0KCk7CisKKyAgICAgICAgICAgIC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5h
bWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudAorICAgICAgICAgICAgaWYgKCAh
dHlwZSApIHsKKyAgICAgICAgICAgICAgICBmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKKyAgICAg
ICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0
IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGVjaWFs
ID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKyAgICAgICAgICAgIHR5cGUg
PSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkg
fHwgdHlwZTsKKyAgICAgICAgICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107Cisg
ICAgICAgICAgICB0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNw
YWNlcy5qb2luKCJcXC4oPzouKlxcLnwpIikgKyAiKFxcLnwkKSIgKTsKKworICAgICAgICAgICAg
Ly8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cworICAgICAgICAgICAgb3JpZ0NvdW50ID0gaiA9IGhh
bmRsZXJzLmxlbmd0aDsKKyAgICAgICAgICAgIHdoaWxlICggai0tICkgeworICAgICAgICAgICAg
ICAgIGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CisKKyAgICAgICAgICAgICAgICBpZiAoICgg
bWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmCisgICAg
ICAgICAgICAgICAgICAgICggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmou
Z3VpZCApICYmCisgICAgICAgICAgICAgICAgICAgICggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxl
T2JqLm5hbWVzcGFjZSApICkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCAhc2VsZWN0b3IgfHwg
c2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gIioqIiAmJiBo
YW5kbGVPYmouc2VsZWN0b3IgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuc3Bs
aWNlKCBqLCAxICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBoYW5kbGVPYmouc2VsZWN0
b3IgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzcGVjaWFs
LnJlbW92ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwucmVtb3ZlLmNhbGwo
IGVsZW0sIGhhbmRsZU9iaiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgZ2VuZXJpYyBldmVu
dCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4
aXN0CisgICAgICAgICAgICAvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNp
b24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKKyAgICAgICAgICAg
IGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAg
aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5h
bWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzWyB0eXBl
IF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIGV4
cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorICAgICAgICBpZiAoIGpRdWVyeS5pc0VtcHR5
T2JqZWN0KCBldmVudHMgKSApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7
CisgICAgICAgICAgICBkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCAiZXZlbnRzIiApOworICAgICAg
ICB9CisgICAgfSwKIAotICAgIGlmICggdGhpc1swXS5wYXJlbnROb2RlICkgewotICAgIHdyYXAu
aW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7Ci0gICAgfQorICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCBl
dmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewogCi0gICAgd3JhcC5tYXAoZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGVsZW0gPSB0aGlzOworICAgICAgICB2YXIgaSwgY3VyLCB0bXAsIGJ1
YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLAorICAgICAgICAgICAgZXZlbnRQYXRo
ID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCisgICAgICAgICAgICB0eXBlID0gaGFzT3duLmNhbGwo
IGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCwKKyAgICAgICAgICAgIG5hbWVz
cGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5uYW1lc3Bh
Y2Uuc3BsaXQoIi4iKSA6IFtdOworCisgICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8
IGRvY3VtZW50OworCisgICAgICAgIC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21t
ZW50IG5vZGVzCisgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVU
eXBlID09PSA4ICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmly
aW5nIHRoZW0gcmlnaHQgbm93CisgICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSAr
IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKKyAgICAgICAg
ICAgIC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50
IHR5cGUgaW4gaGFuZGxlKCkKKyAgICAgICAgICAgIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIu
Iik7CisgICAgICAgICAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworICAgICAgICAgICAg
bmFtZXNwYWNlcy5zb3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgb250eXBlID0gdHlwZS5pbmRl
eE9mKCI6IikgPCAwICYmICJvbiIgKyB0eXBlOworCisgICAgICAgIC8vIENhbGxlciBjYW4gcGFz
cyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBl
IHN0cmluZworICAgICAgICBldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KKyAgICAg
ICAgICAgIGV2ZW50IDoKKyAgICAgICAgICAgIG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVv
ZiBldmVudCA9PT0gIm9iamVjdCIgJiYgZXZlbnQgKTsKKworICAgICAgICAvLyBUcmlnZ2VyIGJp
dG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRy
dWUpCisgICAgICAgIGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzOworICAg
ICAgICBldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKKyAgICAgICAgZXZl
bnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlID8KKyAgICAgICAgICAgIG5ldyBSZWdF
eHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58
JCkiICkgOgorICAgICAgICAgICAgbnVsbDsKKworICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZXZl
bnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKKyAgICAgICAgZXZlbnQucmVzdWx0ID0gdW5k
ZWZpbmVkOworICAgICAgICBpZiAoICFldmVudC50YXJnZXQgKSB7CisgICAgICAgICAgICBldmVu
dC50YXJnZXQgPSBlbGVtOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvbmUgYW55IGluY29t
aW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcg
bGlzdAorICAgICAgICBkYXRhID0gZGF0YSA9PSBudWxsID8KKyAgICAgICAgICAgIFsgZXZlbnQg
XSA6CisgICAgICAgICAgICBqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTsKKwor
ICAgICAgICAvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVz
CisgICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9Owor
ICAgICAgICBpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwu
dHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlv
biBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQorICAgICAgICAv
LyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9i
YWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KQorICAgICAgICBpZiAoICFvbmx5SGFuZGxlcnMg
JiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCisg
ICAgICAgICAgICBidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKKyAg
ICAgICAgICAgIGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7
CisgICAgICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CisgICAgICAg
ICAgICAgICAgZXZlbnRQYXRoLnB1c2goIGN1ciApOworICAgICAgICAgICAgICAgIHRtcCA9IGN1
cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSBhZGQgd2luZG93IGlmIHdl
IGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCisg
ICAgICAgICAgICBpZiAoIHRtcCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkg
KSB7CisgICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0
bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAorICAgICAgICBpID0g
MDsKKyAgICAgICAgd2hpbGUgKCAoY3VyID0gZXZlbnRQYXRoW2krK10pICYmICFldmVudC5pc1By
b3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCisgICAgICAgICAgICBldmVudC50eXBlID0gaSA+IDEg
PworICAgICAgICAgICAgICAgIGJ1YmJsZVR5cGUgOgorICAgICAgICAgICAgICAgIHNwZWNpYWwu
YmluZFR5cGUgfHwgdHlwZTsKKworICAgICAgICAgICAgLy8galF1ZXJ5IGhhbmRsZXIKKyAgICAg
ICAgICAgIGhhbmRsZSA9ICggZGF0YV9wcml2LmdldCggY3VyLCAiZXZlbnRzIiApIHx8IHt9IClb
IGV2ZW50LnR5cGUgXSAmJiBkYXRhX3ByaXYuZ2V0KCBjdXIsICJoYW5kbGUiICk7CisgICAgICAg
ICAgICBpZiAoIGhhbmRsZSApIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUuYXBwbHkoIGN1ciwg
ZGF0YSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOYXRpdmUgaGFuZGxlcgor
ICAgICAgICAgICAgaGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07CisgICAgICAgICAg
ICBpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciAp
ICkgeworICAgICAgICAgICAgICAgIGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBk
YXRhICk7CisgICAgICAgICAgICAgICAgaWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkgewor
ICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBldmVudC50eXBlID0gdHlw
ZTsKKworICAgICAgICAvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwg
ZG8gaXQgbm93CisgICAgICAgIGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0
UHJldmVudGVkKCkgKSB7CisKKyAgICAgICAgICAgIGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8
IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxz
ZSkgJiYKKyAgICAgICAgICAgICAgICBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworCisg
ICAgICAgICAgICAgICAgLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQg
d2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgorICAgICAgICAgICAgICAgIC8v
IERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwg
dmFyaWFibGVzIGJlICgjNjE3MCkKKyAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAmJiBqUXVl
cnkuaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSAp
ICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08g
ZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAg
dG1wID0gZWxlbVsgb250eXBlIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7CisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLXRyaWdn
ZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92
ZQorICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKKyAg
ICAgICAgICAgICAgICAgICAgZWxlbVsgdHlwZSBdKCk7CisgICAgICAgICAgICAgICAgICAgIGpR
dWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CisKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCB0bXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IHRt
cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKIAot
ICAgIHdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9
PT0gMSApIHsKLSAgICBlbGVtID0gZWxlbS5maXJzdENoaWxkOwotICAgIH0KKyAgICBkaXNwYXRj
aDogZnVuY3Rpb24oIGV2ZW50ICkgewogCi0gICAgcmV0dXJuIGVsZW07Ci0gICAgfSkuYXBwZW5k
KCB0aGlzICk7Ci0gICAgfQorICAgICAgICAvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50
IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKKyAgICAgICAgZXZlbnQgPSBqUXVlcnkuZXZl
bnQuZml4KCBldmVudCApOwogCi0gICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKKyAgICAgICAgdmFy
IGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLAorICAgICAgICAgICAgaGFuZGxlclF1ZXVl
ID0gW10sCisgICAgICAgICAgICBhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksCisgICAg
ICAgICAgICBoYW5kbGVycyA9ICggZGF0YV9wcml2LmdldCggdGhpcywgImV2ZW50cyIgKSB8fCB7
fSApWyBldmVudC50eXBlIF0gfHwgW10sCisgICAgICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2
ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTsKIAotICAgIHdyYXBJbm5lcjogZnVuY3Rp
b24oIGh0bWwgKSB7Ci0gICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgewotICAg
IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewotICAgIGpRdWVyeSh0aGlzKS53cmFwSW5u
ZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOwotICAgIH0pOwotICAgIH0KKyAgICAgICAgLy8gVXNl
IHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRp
dmUgZXZlbnQKKyAgICAgICAgYXJnc1swXSA9IGV2ZW50OworICAgICAgICBldmVudC5kZWxlZ2F0
ZVRhcmdldCA9IHRoaXM7CiAKLSAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAg
IHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCi0gICAgY29udGVudHMgPSBzZWxmLmNvbnRlbnRz
KCk7CisgICAgICAgIC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQg
dHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWQKKyAgICAgICAgaWYgKCBzcGVjaWFsLnBy
ZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0g
ZmFsc2UgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIGlmICggY29u
dGVudHMubGVuZ3RoICkgewotICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKKyAgICAgICAg
Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzCisgICAgICAgIGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVu
dC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTsKIAotICAgIH0gZWxzZSB7
Ci0gICAgc2VsZi5hcHBlbmQoIGh0bWwgKTsKLSAgICB9Ci0gICAgfSk7Ci0gICAgfSwKKyAgICAg
ICAgLy8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0
aW9uIGJlbmVhdGggdXMKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlICggKG1hdGNoZWQg
PSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAp
IHsKKyAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CiAKLSAg
ICB3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKLSAgICB2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5p
c0Z1bmN0aW9uKCBodG1sICk7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIHdoaWxl
ICggKGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdKSAmJiAhZXZlbnQuaXNJbW1l
ZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKIAotICAgIHJldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oaSkgewotICAgIGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1s
LmNhbGwodGhpcywgaSkgOiBodG1sICk7Ci0gICAgfSk7Ci0gICAgfSwKKyAgICAgICAgICAgICAg
ICAvLyBUcmlnZ2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9y
CisgICAgICAgICAgICAgICAgLy8gMikgaGF2ZSBuYW1lc3BhY2UocykgYSBzdWJzZXQgb3IgZXF1
YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFj
ZSkuCisgICAgICAgICAgICAgICAgaWYgKCAhZXZlbnQubmFtZXNwYWNlX3JlIHx8IGV2ZW50Lm5h
bWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CiAKLSAgICB1bndyYXA6
IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7
Ci0gICAgaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiYm9keSIgKSApIHsKLSAgICBqUXVl
cnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7Ci0gICAgfQotICAgIH0p
LmVuZCgpOwotICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmhhbmRsZU9iaiA9IGhh
bmRsZU9iajsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRh
OwogCi0gICAgYXBwZW5kOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5kb21NYW5pcChh
cmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgIGlmICggdGhpcy5ub2RlVHlw
ZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkg
ewotICAgIHRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKLSAgICB9Ci0gICAgfSk7Ci0gICAgfSwK
KyAgICAgICAgICAgICAgICAgICAgcmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRs
ZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7CiAK
LSAgICBwcmVwZW5kOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1
bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgIGlmICggdGhpcy5ub2RlVHlwZSA9
PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkgewot
ICAgIHRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKLSAgICB9Ci0g
ICAgfSk7Ci0gICAgfSwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZXQgIT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGV2ZW50LnJlc3VsdCA9IHJldCkg
PT09IGZhbHNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnRE
ZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0
aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIGJlZm9y
ZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZmFs
c2UsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgIGlmICggdGhpcy5wYXJlbnROb2RlICkgewotICAg
IHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKLSAgICB9Ci0gICAg
fSk7CisgICAgICAgIC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVk
IHR5cGUKKyAgICAgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsKKyAgICAgICAgICAg
IHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CisgICAgICAgIH0KKwor
ICAgICAgICByZXR1cm4gZXZlbnQucmVzdWx0OwogICAgIH0sCiAKLSAgICBhZnRlcjogZnVuY3Rp
b24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0
aW9uKCBlbGVtICkgewotICAgIGlmICggdGhpcy5wYXJlbnROb2RlICkgewotICAgIHRoaXMucGFy
ZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKLSAgICB9Ci0g
ICAgfSk7CisgICAgaGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7CisgICAg
ICAgIHZhciBpLCBtYXRjaGVzLCBzZWwsIGhhbmRsZU9iaiwKKyAgICAgICAgICAgIGhhbmRsZXJR
dWV1ZSA9IFtdLAorICAgICAgICAgICAgZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRl
Q291bnQsCisgICAgICAgICAgICBjdXIgPSBldmVudC50YXJnZXQ7CisKKyAgICAgICAgLy8gRmlu
ZCBkZWxlZ2F0ZSBoYW5kbGVycworICAgICAgICAvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0
YW5jZSB0cmVlcyAoIzEzMTgwKQorICAgICAgICAvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJi
bGluZyBpbiBGaXJlZm94ICgjMzg2MSkKKyAgICAgICAgaWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1
ci5ub2RlVHlwZSAmJiAoIWV2ZW50LmJ1dHRvbiB8fCBldmVudC50eXBlICE9PSAiY2xpY2siKSAp
IHsKKworICAgICAgICAgICAgZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnRO
b2RlIHx8IHRoaXMgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIGNsaWNr
cyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKKyAg
ICAgICAgICAgICAgICBpZiAoIGN1ci5kaXNhYmxlZCAhPT0gdHJ1ZSB8fCBldmVudC50eXBlICE9
PSAiY2xpY2siICkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gW107CisgICAgICAg
ICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBl
IHByb3BlcnRpZXMgKCMxMzIwMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IGhhbmRs
ZU9iai5zZWxlY3RvciArICIgIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRj
aGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1hdGNoZXNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAg
OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZmluZCggc2VsLCB0aGlz
LCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRjaGVzWyBzZWwgXSApIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApOworICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
IGlmICggbWF0Y2hlcy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVy
UXVldWUucHVzaCh7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZXMgfSk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJz
CisgICAgICAgIGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHsKKyAgICAg
ICAgICAgIGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogdGhpcywgaGFuZGxlcnM6IGhhbmRsZXJz
LnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
aGFuZGxlclF1ZXVlOwogICAgIH0sCiAKLSAgICAvLyBrZWVwRGF0YSBpcyBmb3IgaW50ZXJuYWwg
dXNlIG9ubHktLWRvIG5vdCBkb2N1bWVudAotICAgIHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9y
LCBrZWVwRGF0YSApIHsKLSAgICB2YXIgZWxlbSwKLSAgICBpID0gMDsKKyAgICAvLyBJbmNsdWRl
cyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudAorICAg
IHByb3BzOiAiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQg
ZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFt
cCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLAogCi0gICAgZm9yICggOyAoZWxlbSA9IHRoaXNbaV0p
ICE9IG51bGw7IGkrKyApIHsKLSAgICBpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBz
ZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggPiAwICkgewotICAgIGlmICggIWtlZXBEYXRhICYm
IGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBl
bGVtICkgKTsKLSAgICB9CisgICAgZml4SG9va3M6IHt9LAogCi0gICAgaWYgKCBlbGVtLnBhcmVu
dE5vZGUgKSB7Ci0gICAgaWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3du
ZXJEb2N1bWVudCwgZWxlbSApICkgewotICAgIHNldEdsb2JhbEV2YWwoIGdldEFsbCggZWxlbSwg
InNjcmlwdCIgKSApOwotICAgIH0KLSAgICBlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVs
ZW0gKTsKLSAgICB9Ci0gICAgfQotICAgIH0KKyAgICBrZXlIb29rczogeworICAgICAgICBwcm9w
czogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksCisgICAgICAgIGZpbHRl
cjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKIAotICAgIHJldHVybiB0aGlzOworICAg
ICAgICAgICAgLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCisgICAgICAgICAgICBpZiAoIGV2
ZW50LndoaWNoID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQud2hpY2ggPSBvcmln
aW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlD
b2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgICAg
IH0KICAgICB9LAogCi0gICAgZW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIHZhciBlbGVtLAotICAg
IGkgPSAwOworICAgIG1vdXNlSG9va3M6IHsKKyAgICAgICAgcHJvcHM6ICJidXR0b24gYnV0dG9u
cyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2Ny
ZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksCisgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2
ZW50LCBvcmlnaW5hbCApIHsKKyAgICAgICAgICAgIHZhciBldmVudERvYywgZG9jLCBib2R5LAor
ICAgICAgICAgICAgICAgIGJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjsKIAotICAgIGZvciAoIDsg
KGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7Ci0gICAgLy8gUmVtb3ZlIGVsZW1lbnQg
bm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCi0gICAgaWYgKCBlbGVtLm5vZGVUeXBlID09
PSAxICkgewotICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwot
ICAgIH0KKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNs
aWVudFgvWSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAm
JiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgZXZlbnREb2Mg
PSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKyAgICAgICAgICAgICAg
ICBkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgYm9keSA9
IGV2ZW50RG9jLmJvZHk7CiAKLSAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwotICAg
IHdoaWxlICggZWxlbS5maXJzdENoaWxkICkgewotICAgIGVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0u
Zmlyc3RDaGlsZCApOwotICAgIH0KKyAgICAgICAgICAgICAgICBldmVudC5wYWdlWCA9IG9yaWdp
bmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Ny
b2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHku
Y2xpZW50TGVmdCB8fCAwICk7CisgICAgICAgICAgICAgICAgZXZlbnQucGFnZVkgPSBvcmlnaW5h
bC5jbGllbnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9s
bFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNs
aWVudFRvcCAgfHwgMCApOworICAgICAgICAgICAgfQogCi0gICAgLy8gSWYgdGhpcyBpcyBhIHNl
bGVjdCwgZW5zdXJlIHRoYXQgaXQgZGlzcGxheXMgZW1wdHkgKCMxMjMzNikKLSAgICAvLyBTdXBw
b3J0OiBJRTw5Ci0gICAgaWYgKCBlbGVtLm9wdGlvbnMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVt
LCAic2VsZWN0IiApICkgewotICAgIGVsZW0ub3B0aW9ucy5sZW5ndGggPSAwOwotICAgIH0KLSAg
ICB9CisgICAgICAgICAgICAvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09
PSBtaWRkbGU7IDMgPT09IHJpZ2h0CisgICAgICAgICAgICAvLyBOb3RlOiBidXR0b24gaXMgbm90
IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorICAgICAgICAgICAgaWYgKCAhZXZlbnQud2hp
Y2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQud2hp
Y2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/
IDIgOiAwICkgKSApOworICAgICAgICAgICAgfQogCi0gICAgcmV0dXJuIHRoaXM7CisgICAgICAg
ICAgICByZXR1cm4gZXZlbnQ7CisgICAgICAgIH0KICAgICB9LAogCi0gICAgY2xvbmU6IGZ1bmN0
aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKLSAgICBkYXRhQW5kRXZl
bnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwotICAg
IGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRF
dmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKLQotICAgIHJldHVybiB0aGlzLm1hcCggZnVuY3Rp
b24gKCkgewotICAgIHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRl
ZXBEYXRhQW5kRXZlbnRzICk7Ci0gICAgfSk7CisgICAgZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7
CisgICAgICAgIGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CisgICAgICAgICAgICBy
ZXR1cm4gZXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBj
b3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAg
ICAgICAgdmFyIGksIHByb3AsIGNvcHksCisgICAgICAgICAgICB0eXBlID0gZXZlbnQudHlwZSwK
KyAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQgPSBldmVudCwKKyAgICAgICAgICAgIGZpeEhvb2sg
PSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07CisKKyAgICAgICAgaWYgKCAhZml4SG9vayApIHsKKyAg
ICAgICAgICAgIHRoaXMuZml4SG9va3NbIHR5cGUgXSA9IGZpeEhvb2sgPQorICAgICAgICAgICAg
ICAgIHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6CisgICAgICAg
ICAgICAgICAgcmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOgorICAgICAg
ICAgICAgICAgIHt9OworICAgICAgICB9CisgICAgICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8g
dGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKyAgICAg
ICAgZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CisKKyAgICAgICAg
aSA9IGNvcHkubGVuZ3RoOworICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgIHBy
b3AgPSBjb3B5WyBpIF07CisgICAgICAgICAgICBldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVu
dFsgcHJvcCBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VwcG9ydDogQ29yZG92YSAyLjUg
KFdlYktpdCkgKCMxMzI1NSkKKyAgICAgICAgLy8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRh
cmdldDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0CisgICAgICAgIGlmICggIWV2ZW50LnRh
cmdldCApIHsKKyAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IGRvY3VtZW50OworICAgICAgICB9
CisKKyAgICAgICAgLy8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZSA8IDI4CisgICAgICAg
IC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisgICAg
ICAgIGlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgeworICAgICAgICAgICAgZXZl
bnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFs
RXZlbnQgKSA6IGV2ZW50OwogICAgIH0sCiAKLSAgICBodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7
Ci0gICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAg
ICB2YXIgZWxlbSA9IHRoaXNbMF0gfHwge30sCi0gICAgaSA9IDAsCi0gICAgbCA9IHRoaXMubGVu
Z3RoOworICAgIHNwZWNpYWw6IHsKKyAgICAgICAgbG9hZDogeworICAgICAgICAgICAgLy8gUHJl
dmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cu
bG9hZAorICAgICAgICAgICAgbm9CdWJibGU6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgZm9j
dXM6IHsKKyAgICAgICAgICAgIC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJs
dXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdAorICAgICAgICAgICAgdHJpZ2dlcjogZnVuY3Rp
b24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCB0aGlzICE9PSBzYWZlQWN0aXZlRWxlbWVudCgp
ICYmIHRoaXMuZm9jdXMgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgorICAgICAgICB9
LAorICAgICAgICBibHVyOiB7CisgICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5i
bHVyICkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmJsdXIoKTsKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisg
ICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKKyAgICAgICAgfSwKKyAgICAgICAg
Y2xpY2s6IHsKKyAgICAgICAgICAgIC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQg
c28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0CisgICAgICAgICAgICB0cmlnZ2VyOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiAm
JiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImlucHV0IiApICkgeworICAg
ICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAg
ICAvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNs
aWNrKCkgb24gbGlua3MKKyAgICAgICAgICAgIF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7
CisgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZXZlbnQudGFyZ2V0LCAi
YSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBiZWZvcmV1bmxvYWQ6
IHsKKyAgICAgICAgICAgIHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAg
ICAgICAgICAgICAgLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKKyAgICAgICAgICAgICAgICAvLyBG
aXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQu
CisgICAgICAgICAgICAgICAgaWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCApIHsKKyAg
ICAgICAgICAgICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50
LnJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9LAogCi0gICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewotICAgIHJldHVybiBlbGVt
Lm5vZGVUeXBlID09PSAxID8KLSAgICBlbGVtLmlubmVySFRNTC5yZXBsYWNlKCByaW5saW5lalF1
ZXJ5LCAiIiApIDoKLSAgICB1bmRlZmluZWQ7CisgICAgc2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBl
LCBlbGVtLCBldmVudCwgYnViYmxlICkgeworICAgICAgICAvLyBQaWdneWJhY2sgb24gYSBkb25v
ciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCisgICAgICAgIC8vIEZha2Ugb3Jp
Z2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZQor
ICAgICAgICAvLyBzaW11bGF0ZWQgZXZlbnQgcHJldmVudHMgZGVmYXVsdCB0aGVuIHdlIGRvIHRo
ZSBzYW1lIG9uIHRoZSBkb25vci4KKyAgICAgICAgdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAorICAg
ICAgICAgICAgbmV3IGpRdWVyeS5FdmVudCgpLAorICAgICAgICAgICAgZXZlbnQsCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAgICBpc1Np
bXVsYXRlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB7fQorICAgICAg
ICAgICAgfQorICAgICAgICApOworICAgICAgICBpZiAoIGJ1YmJsZSApIHsKKyAgICAgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApOworICAg
ICAgICB9CisgICAgICAgIGlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKKyAgICAgICAg
ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIH0KICAgICB9Cit9OwogCi0gICAg
Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAot
ICAgIGlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3Qo
IHZhbHVlICkgJiYKLSAgICAoIGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgfHwgIXJub3No
aW1jYWNoZS50ZXN0KCB2YWx1ZSApICApICYmCi0gICAgKCBqUXVlcnkuc3VwcG9ydC5sZWFkaW5n
V2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJgotICAg
ICF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyIiLCAiIl0gKVsxXS50b0xv
d2VyQ2FzZSgpIF0gKSB7Ci0KLSAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywg
IjwkMT48LyQyPiIgKTsKLQotICAgIHRyeSB7Ci0gICAgZm9yICg7IGkgPCBsOyBpKysgKSB7Ci0g
ICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCi0gICAg
ZWxlbSA9IHRoaXNbaV0gfHwge307Ci0gICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewot
ICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwotICAgIGVsZW0u
aW5uZXJIVE1MID0gdmFsdWU7CitqUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwg
dHlwZSwgaGFuZGxlICkgeworICAgIGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewor
ICAgICAgICBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsK
ICAgICB9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHsKKyAg
ICAvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmQKKyAgICBp
ZiAoICEodGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCkgKSB7CisgICAgICAgIHJldHVybiBu
ZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7CiAgICAgfQogCi0gICAgZWxlbSA9IDA7Cisg
ICAgLy8gRXZlbnQgb2JqZWN0CisgICAgaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CisgICAgICAg
IHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKyAgICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7
CisKKyAgICAgICAgLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBi
ZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKKyAgICAgICAgLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRv
d24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgICAgIHRoaXMuaXNE
ZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKKyAgICAgICAgICAgICAg
ICAvLyBTdXBwb3J0OiBBbmRyb2lkIDwgNC4wCisgICAgICAgICAgICAgICAgc3JjLmRlZmF1bHRQ
cmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJgorICAgICAgICAgICAgICAgIHNyYy5nZXRQcmV2ZW50
RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSA/CisgICAgICAgICAgICByZXR1cm5U
cnVlIDoKKyAgICAgICAgICAgIHJldHVybkZhbHNlOwogCi0gICAgLy8gSWYgdXNpbmcgaW5uZXJI
VE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kCi0gICAgfSBj
YXRjaChlKSB7fQorICAgIC8vIEV2ZW50IHR5cGUKKyAgICB9IGVsc2UgeworICAgICAgICB0aGlz
LnR5cGUgPSBzcmM7CiAgICAgfQogCi0gICAgaWYgKCBlbGVtICkgewotICAgIHRoaXMuZW1wdHko
KS5hcHBlbmQoIHZhbHVlICk7CisgICAgLy8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVy
dGllcyBvbnRvIHRoZSBldmVudCBvYmplY3QKKyAgICBpZiAoIHByb3BzICkgeworICAgICAgICBq
UXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApOwogICAgIH0KLSAgICB9LCBudWxsLCB2YWx1ZSwg
YXJndW1lbnRzLmxlbmd0aCApOwotICAgIH0sCiAKLSAgICByZXBsYWNlV2l0aDogZnVuY3Rpb24o
IHZhbHVlICkgewotICAgIHZhciBpc0Z1bmMgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsK
LQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRo
ZSBET00gYmVmb3JlIHRoZXkgYXJlIGluc2VydGVkCi0gICAgLy8gdGhpcyBjYW4gaGVscCBmaXgg
cmVwbGFjaW5nIGEgcGFyZW50IHdpdGggY2hpbGQgZWxlbWVudHMKLSAgICBpZiAoICFpc0Z1bmMg
JiYgdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiApIHsKLSAgICB2YWx1ZSA9IGpRdWVyeSggdmFs
dWUgKS5ub3QoIHRoaXMgKS5kZXRhY2goKTsKLSAgICB9CisgICAgLy8gQ3JlYXRlIGEgdGltZXN0
YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKKyAgICB0aGlzLnRpbWVTdGFt
cCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTsKIAotICAgIHJldHVybiB0
aGlzLmRvbU1hbmlwKCBbIHZhbHVlIF0sIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHZh
ciBuZXh0ID0gdGhpcy5uZXh0U2libGluZywKLSAgICBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7
CisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0
cnVlOworfTsKIAotICAgIGlmICggcGFyZW50ICkgewotICAgIGpRdWVyeSggdGhpcyApLnJlbW92
ZSgpOwotICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoIGVsZW0sIG5leHQgKTsKLSAgICB9Ci0gICAg
fSk7Ci0gICAgfSwKKy8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBz
cGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZworLy8gaHR0cDovL3d3
dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3Jp
cHQtYmluZGluZy5odG1sCitqUXVlcnkuRXZlbnQucHJvdG90eXBlID0geworICAgIGlzRGVmYXVs
dFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCisgICAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVy
bkZhbHNlLAorICAgIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwK
IAotICAgIGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotICAgIHJldHVybiB0aGlzLnJl
bW92ZSggc2VsZWN0b3IsIHRydWUgKTsKLSAgICB9LAorICAgIHByZXZlbnREZWZhdWx0OiBmdW5j
dGlvbigpIHsKKyAgICAgICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CiAKLSAgICBkb21N
YW5pcDogZnVuY3Rpb24oIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApIHsKKyAgICAgICAgdGhpcy5p
c0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOwogCi0gICAgLy8gRmxhdHRlbiBhbnkgbmVz
dGVkIGFycmF5cwotICAgIGFyZ3MgPSBjb3JlX2NvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKKyAg
ICAgICAgaWYgKCBlICYmIGUucHJldmVudERlZmF1bHQgKSB7CisgICAgICAgICAgICBlLnByZXZl
bnREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICB9LAorICAgIHN0b3BQcm9wYWdhdGlvbjogZnVu
Y3Rpb24oKSB7CisgICAgICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwogCi0gICAgdmFy
IGZpcnN0LCBub2RlLCBoYXNTY3JpcHRzLAotICAgIHNjcmlwdHMsIGRvYywgZnJhZ21lbnQsCi0g
ICAgaSA9IDAsCi0gICAgbCA9IHRoaXMubGVuZ3RoLAotICAgIHNldCA9IHRoaXMsCi0gICAgaU5v
Q2xvbmUgPSBsIC0gMSwKLSAgICB2YWx1ZSA9IGFyZ3NbMF0sCi0gICAgaXNGdW5jdGlvbiA9IGpR
dWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworICAgICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9w
cGVkID0gcmV0dXJuVHJ1ZTsKIAotICAgIC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMg
dGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAotICAgIGlmICggaXNGdW5jdGlvbiB8fCAh
KCBsIDw9IDEgfHwgdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiB8fCBqUXVlcnkuc3VwcG9ydC5j
aGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7Ci0gICAgcmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7Ci0gICAgdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4
ICk7Ci0gICAgaWYgKCBpc0Z1bmN0aW9uICkgewotICAgIGFyZ3NbMF0gPSB2YWx1ZS5jYWxsKCB0
aGlzLCBpbmRleCwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApOwotICAgIH0KLSAg
ICBzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsKLSAgICB9KTsKKyAgICAg
ICAgaWYgKCBlICYmIGUuc3RvcFByb3BhZ2F0aW9uICkgeworICAgICAgICAgICAgZS5zdG9wUHJv
cGFnYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0sCisgICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0
aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3Rv
cHBlZCA9IHJldHVyblRydWU7CisgICAgICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAg
fQorfTsKIAotICAgIGlmICggbCApIHsKLSAgICBmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdt
ZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIHRoaXMgKTsKLSAgICBm
aXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CisvLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBl
dmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3MKKy8vIFN1cHBv
cnQ6IENocm9tZSAxNSsKK2pRdWVyeS5lYWNoKHsKKyAgICBtb3VzZWVudGVyOiAibW91c2VvdmVy
IiwKKyAgICBtb3VzZWxlYXZlOiAibW91c2VvdXQiCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICkg
eworICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7CisgICAgICAgIGRlbGVnYXRl
VHlwZTogZml4LAorICAgICAgICBiaW5kVHlwZTogZml4LAorCisgICAgICAgIGhhbmRsZTogZnVu
Y3Rpb24oIGV2ZW50ICkgeworICAgICAgICAgICAgdmFyIHJldCwKKyAgICAgICAgICAgICAgICB0
YXJnZXQgPSB0aGlzLAorICAgICAgICAgICAgICAgIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFy
Z2V0LAorICAgICAgICAgICAgICAgIGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajsKKworICAg
ICAgICAgICAgLy8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0
ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgLy8gTkI6IE5vIHJlbGF0ZWRU
YXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKKyAgICAg
ICAgICAgIGlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNv
bnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQudHlw
ZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVPYmou
aGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgICAgICAgICAgICAgZXZlbnQu
dHlwZSA9IGZpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAg
ICAgIH0KKyAgICB9OworfSk7CiAKLSAgICBpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3Ro
ID09PSAxICkgewotICAgIGZyYWdtZW50ID0gZmlyc3Q7Ci0gICAgfQorLy8gQ3JlYXRlICJidWJi
bGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCisvLyBTdXBwb3J0OiBGaXJlZm94LCBDaHJvbWUs
IFNhZmFyaQoraWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKKyAgICBqUXVlcnkuZWFj
aCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcs
IGZpeCApIHsKIAotICAgIGlmICggZmlyc3QgKSB7Ci0gICAgdGFibGUgPSB0YWJsZSAmJiBqUXVl
cnkubm9kZU5hbWUoIGZpcnN0LCAidHIiICk7Ci0gICAgc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdl
dEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKLSAgICBoYXNTY3Jp
cHRzID0gc2NyaXB0cy5sZW5ndGg7CisgICAgICAgIC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJp
bmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2Zv
Y3Vzb3V0CisgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgeworICAgICAg
ICAgICAgICAgIGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVy
eS5ldmVudC5maXgoIGV2ZW50ICksIHRydWUgKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAg
alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0geworICAgICAgICAgICAgc2V0dXA6IGZ1bmN0
aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwg
dGhpcywKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBk
b2MsIGZpeCApOworCisgICAgICAgICAgICAgICAgaWYgKCAhYXR0YWNoZXMgKSB7CisgICAgICAg
ICAgICAgICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRhdGFfcHJpdi5hY2Nlc3MoIGRv
YywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTsKKyAgICAgICAgICAgIH0sCisgICAgICAg
ICAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGRvYyA9IHRo
aXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2hlcyA9
IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxOworCisgICAgICAgICAgICAgICAgaWYg
KCAhYXR0YWNoZXMgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3Rl
bmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFfcHJp
di5yZW1vdmUoIGRvYywgZml4ICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgICAgICBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfSk7Cit9CiAK
LSAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3Rl
YWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cAotICAgIC8vIGJlaW5nIGVtcHRp
ZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCi0gICAgZm9yICgg
OyBpIDwgbDsgaSsrICkgewotICAgIG5vZGUgPSBmcmFnbWVudDsKK2pRdWVyeS5mbi5leHRlbmQo
ewogCi0gICAgaWYgKCBpICE9PSBpTm9DbG9uZSApIHsKLSAgICBub2RlID0galF1ZXJ5LmNsb25l
KCBub2RlLCB0cnVlLCB0cnVlICk7CisgICAgb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3Is
IGRhdGEsIGZuLCAvKklOVEVSTkFMKi8gb25lICkgeworICAgICAgICB2YXIgb3JpZ0ZuLCB0eXBl
OworCisgICAgICAgIC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVycworICAg
ICAgICBpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgICAgICAvLyAo
IHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKQorICAgICAgICAgICAgaWYgKCB0eXBlb2Yg
c2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgICAgIC8vICggdHlwZXMtT2Jq
ZWN0LCBkYXRhICkKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAg
ICAgICAgICAgICAgICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CisgICAgICAgICAgICAgICAgdGhpcy5vbigg
dHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRh
dGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkgeworICAgICAgICAgICAgLy8gKCB0eXBlcywgZm4g
KQorICAgICAgICAgICAgZm4gPSBzZWxlY3RvcjsKKyAgICAgICAgICAgIGRhdGEgPSBzZWxlY3Rv
ciA9IHVuZGVmaW5lZDsKKyAgICAgICAgfSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHsKKyAgICAg
ICAgICAgIGlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAg
ICAgICAvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKQorICAgICAgICAgICAgICAgIGZuID0gZGF0
YTsKKyAgICAgICAgICAgICAgICBkYXRhID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAvLyAoIHR5cGVzLCBkYXRhLCBmbiApCisgICAgICAgICAgICAg
ICAgZm4gPSBkYXRhOworICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxlY3RvcjsKKyAgICAgICAg
ICAgICAgICBzZWxlY3RvciA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBpZiAoIGZuID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgIGZuID0gcmV0dXJuRmFs
c2U7CisgICAgICAgIH0gZWxzZSBpZiAoICFmbiApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBvbmUgPT09IDEgKSB7CisgICAgICAgICAgICBv
cmlnRm4gPSBmbjsKKyAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oIGV2ZW50ICkgeworICAgICAg
ICAgICAgICAgIC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0
aGUgaW5mbworICAgICAgICAgICAgICAgIGpRdWVyeSgpLm9mZiggZXZlbnQgKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICAgICAg
ICAgIH07CisgICAgICAgICAgICAvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3Zl
IHVzaW5nIG9yaWdGbgorICAgICAgICAgICAgZm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3Jp
Z0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRo
aXMuZWFjaCggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBqUXVlcnkuZXZlbnQuYWRkKCB0aGlz
LCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7CisgICAgICAgIH0pOworICAgIH0sCisgICAg
b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKKyAgICB9LAorICAg
IG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7CisgICAgICAgIHZhciBoYW5k
bGVPYmosIHR5cGU7CisgICAgICAgIGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQg
JiYgdHlwZXMuaGFuZGxlT2JqICkgeworICAgICAgICAgICAgLy8gKCBldmVudCApICBkaXNwYXRj
aGVkIGpRdWVyeS5FdmVudAorICAgICAgICAgICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2Jq
OworICAgICAgICAgICAgalF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZigKKyAgICAg
ICAgICAgICAgICBoYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgIi4i
ICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSwKKyAgICAgICAgICAg
ICAgICBoYW5kbGVPYmouc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgaGFuZGxlT2JqLmhhbmRs
ZXIKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgICAgICAv
LyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKQorICAgICAgICAgICAgZm9yICggdHlwZSBp
biB0eXBlcyApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5
cGVzWyB0eXBlIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
ICAgICAgICB9CisgICAgICAgIGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxl
Y3RvciA9PT0gImZ1bmN0aW9uIiApIHsKKyAgICAgICAgICAgIC8vICggdHlwZXMgWywgZm5dICkK
KyAgICAgICAgICAgIGZuID0gc2VsZWN0b3I7CisgICAgICAgICAgICBzZWxlY3RvciA9IHVuZGVm
aW5lZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGZuID09PSBmYWxzZSApIHsKKyAgICAgICAg
ICAgIGZuID0gcmV0dXJuRmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZWFj
aChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5
cGVzLCBmbiwgc2VsZWN0b3IgKTsKKyAgICAgICAgfSk7CisgICAgfSwKIAotICAgIC8vIEtlZXAg
cmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb24KLSAgICBp
ZiAoIGhhc1NjcmlwdHMgKSB7Ci0gICAgalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5v
ZGUsICJzY3JpcHQiICkgKTsKLSAgICB9CisgICAgdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRh
dGEgKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworICAgICAgICB9KTsK
KyAgICB9LAorICAgIHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAg
ICAgICAgdmFyIGVsZW0gPSB0aGlzWzBdOworICAgICAgICBpZiAoIGVsZW0gKSB7CisgICAgICAg
ICAgICByZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUg
KTsKKyAgICAgICAgfQogICAgIH0KK30pOwogCi0gICAgY2FsbGJhY2suY2FsbCgKLSAgICB0YWJs
ZSAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXNbaV0sICJ0YWJsZSIgKSA/Ci0gICAgZmluZE9yQXBw
ZW5kKCB0aGlzW2ldLCAidGJvZHkiICkgOgotICAgIHRoaXNbaV0sCi0gICAgbm9kZSwKLSAgICBp
Ci0gICAgKTsKLSAgICB9CiAKLSAgICBpZiAoIGhhc1NjcmlwdHMgKSB7Ci0gICAgZG9jID0gc2Ny
aXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKK3ZhcgorICAgIHJ4aHRt
bFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJh
bSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksCisgICAgcnRhZ05hbWUgPSAvPChbXHc6XSspLywKKyAg
ICByaHRtbCA9IC88fCYjP1x3KzsvLAorICAgIHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0
eWxlfGxpbmspL2ksCisgICAgLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorICAgIHJj
aGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisgICAgcnNjcmlw
dFR5cGUgPSAvXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksCisgICAgcnNjcmlwdFR5cGVNYXNr
ZWQgPSAvXnRydWVcLyguKikvLAorICAgIHJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRB
XFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZywKKworICAgIC8vIFdlIGhhdmUgdG8gY2xvc2UgdGhl
c2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApCisgICAgd3JhcE1hcCA9IHsKKworICAg
ICAgICAvLyBTdXBwb3J0OiBJRSA5CisgICAgICAgIG9wdGlvbjogWyAxLCAiPHNlbGVjdCBtdWx0
aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0sCiAKLSAgICAvLyBSZWVuYWJsZSBzY3Jp
cHRzCi0gICAgalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOworICAgICAgICB0
aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKyAgICAgICAgY29sOiBbIDIsICI8
dGFibGU+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAorICAgICAgICB0cjog
WyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKyAgICAgICAgdGQ6
IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCiAK
LSAgICAvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5z
ZXJ0aW9uCi0gICAgZm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7Ci0gICAgbm9k
ZSA9IHNjcmlwdHNbIGkgXTsKLSAgICBpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8
fCAiIiApICYmCi0gICAgIWpRdWVyeS5fZGF0YSggbm9kZSwgImdsb2JhbEV2YWwiICkgJiYgalF1
ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKKyAgICAgICAgX2RlZmF1bHQ6IFsgMCwgIiIs
ICIiIF0KKyAgICB9OwogCi0gICAgaWYgKCBub2RlLnNyYyApIHsKLSAgICAvLyBIb3BlIGFqYXgg
aXMgYXZhaWxhYmxlLi4uCi0gICAgalF1ZXJ5LmFqYXgoewotICAgIHVybDogbm9kZS5zcmMsCi0g
ICAgdHlwZTogIkdFVCIsCi0gICAgZGF0YVR5cGU6ICJzY3JpcHQiLAotICAgIGFzeW5jOiBmYWxz
ZSwKLSAgICBnbG9iYWw6IGZhbHNlLAotICAgICJ0aHJvd3MiOiB0cnVlCi0gICAgfSk7Ci0gICAg
fSBlbHNlIHsKLSAgICBqUXVlcnkuZ2xvYmFsRXZhbCggKCBub2RlLnRleHQgfHwgbm9kZS50ZXh0
Q29udGVudCB8fCBub2RlLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwg
IiIgKSApOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KKy8vIFN1cHBvcnQ6IElFIDkKK3dy
YXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKIAotICAgIC8vIEZpeCAjMTE4MDk6IEF2
b2lkIGxlYWtpbmcgbWVtb3J5Ci0gICAgZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7Ci0gICAgfQot
ICAgIH0KK3dyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9
IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Cit3cmFwTWFwLnRoID0gd3JhcE1hcC50
ZDsKIAotICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0pOworLy8gU3VwcG9ydDogMS54IGNvbXBh
dGliaWxpdHkKKy8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keQorZnVuY3Rp
b24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkgeworICAgIHJldHVybiBqUXVl
cnkubm9kZU5hbWUoIGVsZW0sICJ0YWJsZSIgKSAmJgorICAgICAgICBqUXVlcnkubm9kZU5hbWUo
IGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwg
InRyIiApID8KIAotZnVuY3Rpb24gZmluZE9yQXBwZW5kKCBlbGVtLCB0YWcgKSB7Ci0gICAgcmV0
dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApWzBdIHx8IGVsZW0uYXBwZW5kQ2hp
bGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKSApOworICAgICAgICBl
bGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CisgICAgICAgICAgICBlbGVt
LmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSAp
IDoKKyAgICAgICAgZWxlbTsKIH0KIAogLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJp
YnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgogZnVuY3Rp
b24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHsKLSAgICB2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmli
dXRlTm9kZSgidHlwZSIpOwotICAgIGVsZW0udHlwZSA9ICggYXR0ciAmJiBhdHRyLnNwZWNpZmll
ZCApICsgIi8iICsgZWxlbS50eXBlOworICAgIGVsZW0udHlwZSA9IChlbGVtLmdldEF0dHJpYnV0
ZSgidHlwZSIpICE9PSBudWxsKSArICIvIiArIGVsZW0udHlwZTsKICAgICByZXR1cm4gZWxlbTsK
IH0KIGZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CiAgICAgdmFyIG1hdGNoID0gcnNj
cmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7CisKICAgICBpZiAoIG1hdGNoICkgewot
ICAgIGVsZW0udHlwZSA9IG1hdGNoWzFdOworICAgICAgICBlbGVtLnR5cGUgPSBtYXRjaFsgMSBd
OwogICAgIH0gZWxzZSB7Ci0gICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKTsKKyAgICAg
ICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKTsKICAgICB9CisKICAgICByZXR1cm4gZWxl
bTsKIH0KIAogLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVk
CiBmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Ci0gICAgdmFy
IGVsZW0sCi0gICAgaSA9IDA7Ci0gICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxs
OyBpKysgKSB7Ci0gICAgalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZ2xvYmFsRXZhbCIsICFyZWZFbGVt
ZW50cyB8fCBqUXVlcnkuX2RhdGEoIHJlZkVsZW1lbnRzW2ldLCAiZ2xvYmFsRXZhbCIgKSApOwot
ICAgIH0KLX0KLQotZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsKLQotICAg
IGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5Lmhhc0RhdGEoIHNyYyApICkgewot
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YXIgdHlwZSwgaSwgbCwKLSAgICBvbGREYXRhID0g
alF1ZXJ5Ll9kYXRhKCBzcmMgKSwKLSAgICBjdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBv
bGREYXRhICksCi0gICAgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7Ci0KLSAgICBpZiAoIGV2ZW50
cyApIHsKLSAgICBkZWxldGUgY3VyRGF0YS5oYW5kbGU7Ci0gICAgY3VyRGF0YS5ldmVudHMgPSB7
fTsKLQotICAgIGZvciAoIHR5cGUgaW4gZXZlbnRzICkgewotICAgIGZvciAoIGkgPSAwLCBsID0g
ZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewotICAgIGpRdWVyeS5ldmVudC5h
ZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKLSAgICB9Ci0gICAgfQotICAg
IH0KKyAgICB2YXIgaSA9IDAsCisgICAgICAgIGwgPSBlbGVtcy5sZW5ndGg7CiAKLSAgICAvLyBt
YWtlIHRoZSBjbG9uZWQgcHVibGljIGRhdGEgb2JqZWN0IGEgY29weSBmcm9tIHRoZSBvcmlnaW5h
bAotICAgIGlmICggY3VyRGF0YS5kYXRhICkgewotICAgIGN1ckRhdGEuZGF0YSA9IGpRdWVyeS5l
eHRlbmQoIHt9LCBjdXJEYXRhLmRhdGEgKTsKKyAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Cisg
ICAgICAgIGRhdGFfcHJpdi5zZXQoCisgICAgICAgICAgICBlbGVtc1sgaSBdLCAiZ2xvYmFsRXZh
bCIsICFyZWZFbGVtZW50cyB8fCBkYXRhX3ByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCAiZ2xv
YmFsRXZhbCIgKQorICAgICAgICApOwogICAgIH0KIH0KIAotZnVuY3Rpb24gZml4Q2xvbmVOb2Rl
SXNzdWVzKCBzcmMsIGRlc3QgKSB7Ci0gICAgdmFyIG5vZGVOYW1lLCBlLCBkYXRhOworZnVuY3Rp
b24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsKKyAgICB2YXIgaSwgbCwgdHlwZSwgcGRh
dGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50czsKIAotICAgIC8vIFdl
IGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHMKICAgICBpZiAoIGRl
c3Qubm9kZVR5cGUgIT09IDEgKSB7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGVOYW1l
ID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCi0gICAgLy8gSUU2LTggY29waWVzIGV2
ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCi0gICAgaWYg
KCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmIGRlc3RbIGpRdWVyeS5leHBhbmRvIF0g
KSB7Ci0gICAgZGF0YSA9IGpRdWVyeS5fZGF0YSggZGVzdCApOwotCi0gICAgZm9yICggZSBpbiBk
YXRhLmV2ZW50cyApIHsKLSAgICBqUXVlcnkucmVtb3ZlRXZlbnQoIGRlc3QsIGUsIGRhdGEuaGFu
ZGxlICk7Ci0gICAgfQotCi0gICAgLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVh
ZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8gZ2V0cyBjb3BpZWQgdG9vCi0gICAgZGVzdC5yZW1v
dmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7Ci0gICAgfQotCi0gICAgLy8gSUUgYmxhbmtz
IGNvbnRlbnRzIHdoZW4gY2xvbmluZyBzY3JpcHRzLCBhbmQgdHJpZXMgdG8gZXZhbHVhdGUgbmV3
bHktc2V0IHRleHQKLSAgICBpZiAoIG5vZGVOYW1lID09PSAic2NyaXB0IiAmJiBkZXN0LnRleHQg
IT09IHNyYy50ZXh0ICkgewotICAgIGRpc2FibGVTY3JpcHQoIGRlc3QgKS50ZXh0ID0gc3JjLnRl
eHQ7Ci0gICAgcmVzdG9yZVNjcmlwdCggZGVzdCApOwotCi0gICAgLy8gSUU2LTEwIGltcHJvcGVy
bHkgY2xvbmVzIGNoaWxkcmVuIG9mIG9iamVjdCBlbGVtZW50cyB1c2luZyBjbGFzc2lkLgotICAg
IC8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBu
dWxsLCAjMTIxMzIuCi0gICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvYmplY3QiICkgewot
ICAgIGlmICggZGVzdC5wYXJlbnROb2RlICkgewotICAgIGRlc3Qub3V0ZXJIVE1MID0gc3JjLm91
dGVySFRNTDsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFRoaXMgcGF0aCBhcHBl
YXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4gY2xvbmluZyBhbiBvYmplY3QKLSAgICAvLyBl
bGVtZW50IGluIElFOSwgdGhlIG91dGVySFRNTCBzdHJhdGVneSBhYm92ZSBpcyBub3Qgc3VmZmlj
aWVudC4KLSAgICAvLyBJZiB0aGUgc3JjIGhhcyBpbm5lckhUTUwgYW5kIHRoZSBkZXN0aW5hdGlv
biBkb2VzIG5vdCwKLSAgICAvLyBjb3B5IHRoZSBzcmMuaW5uZXJIVE1MIGludG8gdGhlIGRlc3Qu
aW5uZXJIVE1MLiAjMTAzMjQKLSAgICBpZiAoIGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgJiYg
KCBzcmMuaW5uZXJIVE1MICYmICFqUXVlcnkudHJpbShkZXN0LmlubmVySFRNTCkgKSApIHsKLSAg
ICBkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlm
ICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlLnRl
c3QoIHNyYy50eXBlICkgKSB7Ci0gICAgLy8gSUU2LTggZmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hl
Y2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveAotICAgIC8vIG9yIHJhZGlvIGJ1dHRvbi4g
V29yc2UsIElFNi03IGZhaWwgdG8gZ2l2ZSB0aGUgY2xvbmVkIGVsZW1lbnQKLSAgICAvLyBhIGNo
ZWNrZWQgYXBwZWFyYW5jZSBpZiB0aGUgZGVmYXVsdENoZWNrZWQgdmFsdWUgaXNuJ3QgYWxzbyBz
ZXQKKyAgICAvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgor
ICAgIGlmICggZGF0YV9wcml2Lmhhc0RhdGEoIHNyYyApICkgeworICAgICAgICBwZGF0YU9sZCA9
IGRhdGFfcHJpdi5hY2Nlc3MoIHNyYyApOworICAgICAgICBwZGF0YUN1ciA9IGRhdGFfcHJpdi5z
ZXQoIGRlc3QsIHBkYXRhT2xkICk7CisgICAgICAgIGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50czsK
IAotICAgIGRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsK
KyAgICAgICAgaWYgKCBldmVudHMgKSB7CisgICAgICAgICAgICBkZWxldGUgcGRhdGFDdXIuaGFu
ZGxlOworICAgICAgICAgICAgcGRhdGFDdXIuZXZlbnRzID0ge307CiAKLSAgICAvLyBJRTYtNyBn
ZXQgY29uZnVzZWQgYW5kIGVuZCB1cCBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGNsb25lZAotICAg
IC8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiAi
b24iCi0gICAgaWYgKCBkZXN0LnZhbHVlICE9PSBzcmMudmFsdWUgKSB7Ci0gICAgZGVzdC52YWx1
ZSA9IHNyYy52YWx1ZTsKKyAgICAgICAgICAgIGZvciAoIHR5cGUgaW4gZXZlbnRzICkgeworICAg
ICAgICAgICAgICAgIGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwg
bDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0
eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRo
ZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKLSAgICAvLyBzdGF0ZSB3
aGVuIGNsb25pbmcgb3B0aW9ucwotICAgIH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9u
IiApIHsKLSAgICBkZXN0LmRlZmF1bHRTZWxlY3RlZCA9IGRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVm
YXVsdFNlbGVjdGVkOworICAgIC8vIDIuIENvcHkgdXNlciBkYXRhCisgICAgaWYgKCBkYXRhX3Vz
ZXIuaGFzRGF0YSggc3JjICkgKSB7CisgICAgICAgIHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vz
cyggc3JjICk7CisgICAgICAgIHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xk
ICk7CiAKLSAgICAvLyBJRTYtOCBmYWlscyB0byBzZXQgdGhlIGRlZmF1bHRWYWx1ZSB0byB0aGUg
Y29ycmVjdCB2YWx1ZSB3aGVuCi0gICAgLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBm
aWVsZHMKLSAgICB9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiB8fCBub2RlTmFtZSA9
PT0gInRleHRhcmVhIiApIHsKLSAgICBkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFs
dWU7CisgICAgICAgIGRhdGFfdXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7CiAgICAgfQogfQog
Ci1qUXVlcnkuZWFjaCh7Ci0gICAgYXBwZW5kVG86ICJhcHBlbmQiLAotICAgIHByZXBlbmRUbzog
InByZXBlbmQiLAotICAgIGluc2VydEJlZm9yZTogImJlZm9yZSIsCi0gICAgaW5zZXJ0QWZ0ZXI6
ICJhZnRlciIsCi0gICAgcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgotfSwgZnVuY3Rpb24oIG5h
bWUsIG9yaWdpbmFsICkgewotICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVj
dG9yICkgewotICAgIHZhciBlbGVtcywKLSAgICBpID0gMCwKLSAgICByZXQgPSBbXSwKLSAgICBp
bnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCi0gICAgbGFzdCA9IGluc2VydC5sZW5ndGggLSAx
OwotCi0gICAgZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKLSAgICBlbGVtcyA9IGkgPT09IGxh
c3QgPyB0aGlzIDogdGhpcy5jbG9uZSh0cnVlKTsKLSAgICBqUXVlcnkoIGluc2VydFtpXSApWyBv
cmlnaW5hbCBdKCBlbGVtcyApOwotCi0gICAgLy8gTW9kZXJuIGJyb3dzZXJzIGNhbiBhcHBseSBq
UXVlcnkgY29sbGVjdGlvbnMgYXMgYXJyYXlzLCBidXQgb2xkSUUgbmVlZHMgYSAuZ2V0KCkKLSAg
ICBjb3JlX3B1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdGhpcy5wdXNoU3RhY2soIHJldCApOwotICAgIH07Ci19KTsKLQogZnVuY3Rpb24gZ2V0QWxs
KCBjb250ZXh0LCB0YWcgKSB7Ci0gICAgdmFyIGVsZW1zLCBlbGVtLAotICAgIGkgPSAwLAotICAg
IGZvdW5kID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IGNvcmVfc3Ry
dW5kZWZpbmVkID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8ICIqIiApIDoK
LSAgICB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBjb3JlX3N0cnVuZGVmaW5l
ZCA/IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoKLSAgICB1bmRlZmlu
ZWQ7Ci0KLSAgICBpZiAoICFmb3VuZCApIHsKLSAgICBmb3IgKCBmb3VuZCA9IFtdLCBlbGVtcyA9
IGNvbnRleHQuY2hpbGROb2RlcyB8fCBjb250ZXh0OyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxs
OyBpKysgKSB7Ci0gICAgaWYgKCAhdGFnIHx8IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgdGFnICkg
KSB7Ci0gICAgZm91bmQucHVzaCggZWxlbSApOwotICAgIH0gZWxzZSB7Ci0gICAgalF1ZXJ5Lm1l
cmdlKCBmb3VuZCwgZ2V0QWxsKCBlbGVtLCB0YWcgKSApOwotICAgIH0KLSAgICB9Ci0gICAgfQor
ICAgIHZhciByZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRF
bGVtZW50c0J5VGFnTmFtZSggdGFnIHx8ICIqIiApIDoKKyAgICAgICAgICAgIGNvbnRleHQucXVl
cnlTZWxlY3RvckFsbCA/IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoK
KyAgICAgICAgICAgIFtdOwogCiAgICAgcmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAm
JiBqUXVlcnkubm9kZU5hbWUoIGNvbnRleHQsIHRhZyApID8KLSAgICBqUXVlcnkubWVyZ2UoIFsg
Y29udGV4dCBdLCBmb3VuZCApIDoKLSAgICBmb3VuZDsKKyAgICAgICAgalF1ZXJ5Lm1lcmdlKCBb
IGNvbnRleHQgXSwgcmV0ICkgOgorICAgICAgICByZXQ7CiB9CiAKLS8vIFVzZWQgaW4gYnVpbGRG
cmFnbWVudCwgZml4ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3BlcnR5Ci1mdW5jdGlvbiBmaXhE
ZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKLSAgICBpZiAoIG1hbmlwdWxhdGlvbl9yY2hlY2thYmxl
VHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKLSAgICBlbGVtLmRlZmF1bHRDaGVja2VkID0gZWxl
bS5jaGVja2VkOworLy8gU3VwcG9ydDogSUUgPj0gOQorZnVuY3Rpb24gZml4SW5wdXQoIHNyYywg
ZGVzdCApIHsKKyAgICB2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7
CisKKyAgICAvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVk
IGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KKyAgICBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQi
ICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7CisgICAgICAgIGRlc3QuY2hl
Y2tlZCA9IHNyYy5jaGVja2VkOworCisgICAgLy8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3Rl
ZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlv
bnMKKyAgICB9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiB8fCBub2RlTmFtZSA9PT0g
InRleHRhcmVhIiApIHsKKyAgICAgICAgZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZh
bHVlOwogICAgIH0KIH0KIAogalF1ZXJ5LmV4dGVuZCh7CiAgICAgY2xvbmU6IGZ1bmN0aW9uKCBl
bGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKLSAgICB2YXIgZGVzdEVs
ZW1lbnRzLCBub2RlLCBjbG9uZSwgaSwgc3JjRWxlbWVudHMsCi0gICAgaW5QYWdlID0galF1ZXJ5
LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKLQotICAgIGlmICggalF1ZXJ5
LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkgfHwgIXJub3NoaW1j
YWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgKSB7Ci0gICAgY2xvbmUgPSBl
bGVtLmNsb25lTm9kZSggdHJ1ZSApOwotCi0gICAgLy8gSUU8PTggZG9lcyBub3QgcHJvcGVybHkg
Y2xvbmUgZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2RlcwotICAgIH0gZWxzZSB7Ci0gICAg
ZnJhZ21lbnREaXYuaW5uZXJIVE1MID0gZWxlbS5vdXRlckhUTUw7Ci0gICAgZnJhZ21lbnREaXYu
cmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApOwotICAgIH0KLQot
ICAgIGlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0
Lm5vQ2xvbmVDaGVja2VkKSAmJgotICAgIChlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9k
ZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgewotCi0gICAgLy8gV2Ug
ZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwOi8vanNwZXJm
LmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKLSAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25l
ICk7Ci0gICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKLQotICAgIC8vIEZpeCBhbGwg
SUUgY2xvbmluZyBpc3N1ZXMKLSAgICBmb3IgKCBpID0gMDsgKG5vZGUgPSBzcmNFbGVtZW50c1tp
XSkgIT0gbnVsbDsgKytpICkgewotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBu
b2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NwotICAgIGlmICggZGVzdEVsZW1lbnRzW2ldICkg
ewotICAgIGZpeENsb25lTm9kZUlzc3Vlcyggbm9kZSwgZGVzdEVsZW1lbnRzW2ldICk7Ci0gICAg
fQotICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2lu
YWwgdG8gdGhlIGNsb25lCi0gICAgaWYgKCBkYXRhQW5kRXZlbnRzICkgewotICAgIGlmICggZGVl
cERhdGFBbmRFdmVudHMgKSB7Ci0gICAgc3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRB
bGwoIGVsZW0gKTsKLSAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBj
bG9uZSApOwotCi0gICAgZm9yICggaSA9IDA7IChub2RlID0gc3JjRWxlbWVudHNbaV0pICE9IG51
bGw7IGkrKyApIHsKLSAgICBjbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVsZW1lbnRzW2ldICk7
Ci0gICAgfQotICAgIH0gZWxzZSB7Ci0gICAgY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7
Ci0gICAgfQotICAgIH0KLQotICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rv
cnkKLSAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwotICAgIGlm
ICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7Ci0gICAgc2V0R2xvYmFsRXZhbCggZGVzdEVs
ZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSApOwotICAgIH0KLQot
ICAgIGRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7Ci0KLSAgICAvLyBS
ZXR1cm4gdGhlIGNsb25lZCBzZXQKLSAgICByZXR1cm4gY2xvbmU7CisgICAgICAgIHZhciBpLCBs
LCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAorICAgICAgICAgICAgY2xvbmUgPSBlbGVtLmNs
b25lTm9kZSggdHJ1ZSApLAorICAgICAgICAgICAgaW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBl
bGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgICAgICAvLyBTdXBwb3J0OiBJRSA+PSA5
CisgICAgICAgIC8vIEZpeCBDbG9uaW5nIGlzc3VlcworICAgICAgICBpZiAoICFzdXBwb3J0Lm5v
Q2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09
PSAxMSApICYmCisgICAgICAgICAgICAgICAgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkgewor
CisgICAgICAgICAgICAvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJl
YXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMgorICAgICAgICAgICAg
ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOworICAgICAgICAgICAgc3JjRWxlbWVudHMg
PSBnZXRBbGwoIGVsZW0gKTsKKworICAgICAgICAgICAgZm9yICggaSA9IDAsIGwgPSBzcmNFbGVt
ZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisgICAgICAgICAgICAgICAgZml4SW5wdXQoIHNy
Y0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8g
dGhlIGNsb25lCisgICAgICAgIGlmICggZGF0YUFuZEV2ZW50cyApIHsKKyAgICAgICAgICAgIGlm
ICggZGVlcERhdGFBbmRFdmVudHMgKSB7CisgICAgICAgICAgICAgICAgc3JjRWxlbWVudHMgPSBz
cmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsKKyAgICAgICAgICAgICAgICBkZXN0RWxlbWVu
dHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOworCisgICAgICAgICAgICAgICAg
Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisgICAg
ICAgICAgICAgICAgICAgIGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxl
bWVudHNbIGkgXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBo
aXN0b3J5CisgICAgICAgIGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsICJzY3JpcHQiICk7
CisgICAgICAgIGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CisgICAgICAgICAgICBz
ZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCAic2Ny
aXB0IiApICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQK
KyAgICAgICAgcmV0dXJuIGNsb25lOwogICAgIH0sCiAKICAgICBidWlsZEZyYWdtZW50OiBmdW5j
dGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHsKLSAgICB2YXIgaiwg
ZWxlbSwgY29udGFpbnMsCi0gICAgdG1wLCB0YWcsIHRib2R5LCB3cmFwLAotICAgIGwgPSBlbGVt
cy5sZW5ndGgsCi0KLSAgICAvLyBFbnN1cmUgYSBzYWZlIGZyYWdtZW50Ci0gICAgc2FmZSA9IGNy
ZWF0ZVNhZmVGcmFnbWVudCggY29udGV4dCApLAotCi0gICAgbm9kZXMgPSBbXSwKLSAgICBpID0g
MDsKLQotICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKLSAgICBlbGVtID0gZWxlbXNbIGkgXTsK
LQotICAgIGlmICggZWxlbSB8fCBlbGVtID09PSAwICkgeworICAgICAgICB2YXIgZWxlbSwgdG1w
LCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLAorICAgICAgICAgICAgZnJhZ21lbnQgPSBjb250ZXh0
LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKyAgICAgICAgICAgIG5vZGVzID0gW10sCisgICAg
ICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGwgPSBlbGVtcy5sZW5ndGg7CisKKyAgICAgICAg
Zm9yICggOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgZWxlbSA9IGVsZW1zWyBpIF07CisK
KyAgICAgICAgICAgIGlmICggZWxlbSB8fCBlbGVtID09PSAwICkgeworCisgICAgICAgICAgICAg
ICAgLy8gQWRkIG5vZGVzIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkudHlw
ZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9y
dDogUXRXZWJLaXQKKyAgICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5Lm1lcmdlIGJlY2F1c2Ug
cHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cworICAgICAgICAgICAgICAgICAgICBqUXVl
cnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7CisKKyAg
ICAgICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGUKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgeworICAgICAgICAg
ICAgICAgICAgICBub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTsK
KworICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2RlcworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcCB8fCBmcmFn
bWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKSApOworCisgICAg
ICAgICAgICAgICAgICAgIC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24K
KyAgICAgICAgICAgICAgICAgICAgdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAi
IiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JhcCA9
IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7CisgICAgICAgICAgICAgICAgICAg
IHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwk
MT48LyQyPiIgKSArIHdyYXBbIDIgXTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZXNjZW5k
IHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnQKKyAgICAgICAgICAgICAgICAg
ICAgaiA9IHdyYXBbIDAgXTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBqLS0gKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAubGFzdENoaWxkOworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKKyAg
ICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5Lm1lcmdlIGJlY2F1c2UgcHVzaC5hcHBseShfLCBh
cnJheWxpa2UpIHRocm93cworICAgICAgICAgICAgICAgICAgICBqUXVlcnkubWVyZ2UoIG5vZGVz
LCB0bXAuY2hpbGROb2RlcyApOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRo
ZSB0b3AtbGV2ZWwgY29udGFpbmVyCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGZyYWdtZW50
LmZpcnN0Q2hpbGQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXMgIzEyMzQ2CisgICAg
ICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFdlYmtpdCwgSUUKKyAgICAgICAgICAgICAgICAg
ICAgdG1wLnRleHRDb250ZW50ID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAor
ICAgICAgICBmcmFnbWVudC50ZXh0Q29udGVudCA9ICIiOworCisgICAgICAgIGkgPSAwOworICAg
ICAgICB3aGlsZSAoIChlbGVtID0gbm9kZXNbIGkrKyBdKSApIHsKKworICAgICAgICAgICAgLy8g
IzQwODcgLSBJZiBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwg
YW5kIHRoaXMgaXMKKyAgICAgICAgICAgIC8vIHRoYXQgZWxlbWVudCwgZG8gbm90IGRvIGFueXRo
aW5nCisgICAgICAgICAgICBpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwg
c2VsZWN0aW9uICkgIT09IC0xICkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5v
d25lckRvY3VtZW50LCBlbGVtICk7CisKKyAgICAgICAgICAgIC8vIEFwcGVuZCB0byBmcmFnbWVu
dAorICAgICAgICAgICAgdG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSAp
LCAic2NyaXB0IiApOworCisgICAgICAgICAgICAvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlv
biBoaXN0b3J5CisgICAgICAgICAgICBpZiAoIGNvbnRhaW5zICkgeworICAgICAgICAgICAgICAg
IHNldEdsb2JhbEV2YWwoIHRtcCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBD
YXB0dXJlIGV4ZWN1dGFibGVzCisgICAgICAgICAgICBpZiAoIHNjcmlwdHMgKSB7CisgICAgICAg
ICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHRtcFsgaisr
IF0pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0u
dHlwZSB8fCAiIiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy5wdXNoKCBl
bGVtICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAgfSwKKwor
ICAgIGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkgeworICAgICAgICB2YXIgZGF0YSwgZWxl
bSwgZXZlbnRzLCB0eXBlLCBrZXksIGosCisgICAgICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2
ZW50LnNwZWNpYWwsCisgICAgICAgICAgICBpID0gMDsKKworICAgICAgICBmb3IgKCA7IChlbGVt
ID0gZWxlbXNbIGkgXSkgIT09IHVuZGVmaW5lZDsgaSsrICkgeworICAgICAgICAgICAgaWYgKCBq
UXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgeworICAgICAgICAgICAgICAgIGtleSA9IGVsZW1b
IGRhdGFfcHJpdi5leHBhbmRvIF07CisKKyAgICAgICAgICAgICAgICBpZiAoIGtleSAmJiAoZGF0
YSA9IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0pICkgeworICAgICAgICAgICAgICAgICAgICBldmVu
dHMgPSBPYmplY3Qua2V5cyggZGF0YS5ldmVudHMgfHwge30gKTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCBldmVudHMubGVuZ3RoICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgg
aiA9IDA7ICh0eXBlID0gZXZlbnRzW2pdKSAhPT0gdW5kZWZpbmVkOyBqKysgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBh
dm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWQKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnku
cmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggZGF0YV9wcml2LmNhY2hlWyBrZXkgXSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgYW55IHJlbWFpbmluZyBgcHJp
dmF0ZWAgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFfcHJpdi5jYWNo
ZVsga2V5IF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHVzZXJgIGRh
dGEKKyAgICAgICAgICAgIGRlbGV0ZSBkYXRhX3VzZXIuY2FjaGVbIGVsZW1bIGRhdGFfdXNlci5l
eHBhbmRvIF0gXTsKKyAgICAgICAgfQorICAgIH0KK30pOwogCi0gICAgLy8gQWRkIG5vZGVzIGRp
cmVjdGx5Ci0gICAgaWYgKCBqUXVlcnkudHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKLSAg
ICBqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7
CitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICB0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAg
ICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAg
IHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KKyAgICAgICAgICAgICAgICBqUXVlcnkudGV4
dCggdGhpcyApIDoKKyAgICAgICAgICAgICAgICB0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMu
bm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50
cy5sZW5ndGggKTsKKyAgICB9LAogCi0gICAgLy8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4
dCBub2RlCi0gICAgfSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKLSAgICBub2Rl
cy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTsKKyAgICBhcHBlbmQ6IGZ1
bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5j
dGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0
aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkgeworICAgICAgICAg
ICAgICAgIHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSk7CisgICAgfSwKIAotICAgIC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rl
cwotICAgIH0gZWxzZSB7Ci0gICAgdG1wID0gdG1wIHx8IHNhZmUuYXBwZW5kQ2hpbGQoIGNvbnRl
eHQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsKKyAgICBwcmVwZW5kOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7
CisgICAgICAgICAgICBpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9
PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKyAgICAgICAgICAgICAgICB2YXIgdGFy
Z2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CisgICAgICAgICAgICAgICAg
dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSk7CisgICAgfSwKIAotICAgIC8vIERlc2VyaWFsaXplIGEgc3RhbmRh
cmQgcmVwcmVzZW50YXRpb24KLSAgICB0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBb
IiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCk7Ci0gICAgd3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8
IHdyYXBNYXAuX2RlZmF1bHQ7CisgICAgYmVmb3JlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAg
ICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0pOworICAgIH0sCiAKLSAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0ucmVwbGFj
ZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+IiApICsgd3JhcFsyXTsKKyAgICBhZnRlcjogZnVuY3Rp
b24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CisgICAgICAg
ICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2li
bGluZyApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9LAogCi0gICAgLy8gRGVz
Y2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50Ci0gICAgaiA9IHdyYXBb
MF07Ci0gICAgd2hpbGUgKCBqLS0gKSB7Ci0gICAgdG1wID0gdG1wLmxhc3RDaGlsZDsKLSAgICB9
CisgICAgcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhIC8qIEludGVybmFsIFVz
ZSBPbmx5ICovICkgeworICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgIGVsZW1zID0gc2Vs
ZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApIDogdGhpcywKKyAgICAgICAg
ICAgIGkgPSAwOwogCi0gICAgLy8gTWFudWFsbHkgYWRkIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1v
dmVkIGJ5IElFCi0gICAgaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYg
cmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsKLSAgICBub2Rlcy5wdXNoKCBjb250
ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyggZWxlbSApWzBdICkg
KTsKLSAgICB9CisgICAgICAgIGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsr
ICkgeworICAgICAgICAgICAgaWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSAp
IHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0gKSApOwor
ICAgICAgICAgICAgfQogCi0gICAgLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4g
ZnJvbSB0YWJsZSBmcmFnbWVudHMKLSAgICBpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsK
KyAgICAgICAgICAgIGlmICggZWxlbS5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgICAgIGlm
ICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0g
KSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAi
c2NyaXB0IiApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsZW0ucGFy
ZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAK
LSAgICAvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+
Ci0gICAgZWxlbSA9IHRhZyA9PT0gInRhYmxlIiAmJiAhcnRib2R5LnRlc3QoIGVsZW0gKSA/Ci0g
ICAgdG1wLmZpcnN0Q2hpbGQgOgorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAogCi0gICAg
Ly8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+Ci0gICAgd3JhcFsxXSA9PT0g
Ijx0YWJsZT4iICYmICFydGJvZHkudGVzdCggZWxlbSApID8KLSAgICB0bXAgOgotICAgIDA7Cisg
ICAgZW1wdHk6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgIGkg
PSAwOwogCi0gICAgaiA9IGVsZW0gJiYgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsKLSAgICB3aGls
ZSAoIGotLSApIHsKLSAgICBpZiAoIGpRdWVyeS5ub2RlTmFtZSggKHRib2R5ID0gZWxlbS5jaGls
ZE5vZGVzW2pdKSwgInRib2R5IiApICYmICF0Ym9keS5jaGlsZE5vZGVzLmxlbmd0aCApIHsKLSAg
ICBlbGVtLnJlbW92ZUNoaWxkKCB0Ym9keSApOwotICAgIH0KLSAgICB9Ci0gICAgfQorICAgICAg
ICBmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgeworICAgICAgICAgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewogCi0gICAgalF1ZXJ5Lm1lcmdlKCBub2Rlcywg
dG1wLmNoaWxkTm9kZXMgKTsKKyAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG1lbW9yeSBsZWFr
cworICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2Ug
KSApOwogCi0gICAgLy8gRml4ICMxMjM5MiBmb3IgV2ViS2l0IGFuZCBJRSA+IDkKLSAgICB0bXAu
dGV4dENvbnRlbnQgPSAiIjsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmlu
ZyBub2RlcworICAgICAgICAgICAgICAgIGVsZW0udGV4dENvbnRlbnQgPSAiIjsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQogCi0gICAgLy8gRml4ICMxMjM5MiBmb3Igb2xkSUUKLSAgICB3aGls
ZSAoIHRtcC5maXJzdENoaWxkICkgewotICAgIHRtcC5yZW1vdmVDaGlsZCggdG1wLmZpcnN0Q2hp
bGQgKTsKLSAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCiAKLSAgICAvLyBSZW1l
bWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVyIGNsZWFudXAKLSAgICB0bXAg
PSBzYWZlLmxhc3RDaGlsZDsKLSAgICB9Ci0gICAgfQotICAgIH0KKyAgICBjbG9uZTogZnVuY3Rp
b24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgeworICAgICAgICBkYXRhQW5k
RXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwor
ICAgICAgICBkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBk
YXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7CiAKLSAgICAvLyBGaXggIzExMzU2OiBD
bGVhciBlbGVtZW50cyBmcm9tIGZyYWdtZW50Ci0gICAgaWYgKCB0bXAgKSB7Ci0gICAgc2FmZS5y
ZW1vdmVDaGlsZCggdG1wICk7Ci0gICAgfQorICAgICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24oKSB7CisgICAgICAgICAgICByZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZl
bnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOworICAgICAgICB9KTsKKyAgICB9LAogCi0gICAgLy8g
UmVzZXQgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKLSAgICAv
LyBhYm91dCB0byBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGluIElFIDYvNyAoIzgwNjApCi0gICAg
aWYgKCAhalF1ZXJ5LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZCApIHsKLSAgICBqUXVlcnkuZ3JlcCgg
Z2V0QWxsKCBub2RlcywgImlucHV0IiApLCBmaXhEZWZhdWx0Q2hlY2tlZCApOwotICAgIH0KKyAg
ICBodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMs
IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBlbGVtID0gdGhpc1sgMCBdIHx8
IHt9LAorICAgICAgICAgICAgICAgIGkgPSAwLAorICAgICAgICAgICAgICAgIGwgPSB0aGlzLmxl
bmd0aDsKIAotICAgIGkgPSAwOwotICAgIHdoaWxlICggKGVsZW0gPSBub2Rlc1sgaSsrIF0pICkg
eworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUg
PT09IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uaW5uZXJIVE1MOworICAgICAg
ICAgICAgfQogCi0gICAgLy8gIzQwODcgLSBJZiBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGVsZW1l
bnRzIGFyZSB0aGUgc2FtZSwgYW5kIHRoaXMgaXMKLSAgICAvLyB0aGF0IGVsZW1lbnQsIGRvIG5v
dCBkbyBhbnl0aGluZwotICAgIGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVt
LCBzZWxlY3Rpb24gKSAhPT0gLTEgKSB7Ci0gICAgY29udGludWU7Ci0gICAgfQorICAgICAgICAg
ICAgLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRN
TAorICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5l
cmh0bWwudGVzdCggdmFsdWUgKSAmJgorICAgICAgICAgICAgICAgICF3cmFwTWFwWyAoIHJ0YWdO
YW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkg
ewogCi0gICAgY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwg
ZWxlbSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSggcnhodG1sVGFn
LCAiPCQxPjwvJDI+IiApOwogCi0gICAgLy8gQXBwZW5kIHRvIGZyYWdtZW50Ci0gICAgdG1wID0g
Z2V0QWxsKCBzYWZlLmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CisgICAgICAgICAg
ICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTsKIAotICAgIC8v
IFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKLSAgICBpZiAoIGNvbnRhaW5zICkg
ewotICAgIHNldEdsb2JhbEV2YWwoIHRtcCApOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFs
c2UgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaW5uZXJIVE1MID0gdmFs
dWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KIAot
ICAgIC8vIENhcHR1cmUgZXhlY3V0YWJsZXMKLSAgICBpZiAoIHNjcmlwdHMgKSB7Ci0gICAgaiA9
IDA7Ci0gICAgd2hpbGUgKCAoZWxlbSA9IHRtcFsgaisrIF0pICkgewotICAgIGlmICggcnNjcmlw
dFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7Ci0gICAgc2NyaXB0cy5wdXNoKCBlbGVt
ICk7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICBlbGVt
ID0gMDsKIAotICAgIHRtcCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gSWYgdXNpbmcgaW5u
ZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kCisgICAg
ICAgICAgICAgICAgfSBjYXRjaCggZSApIHt9CisgICAgICAgICAgICB9CiAKLSAgICByZXR1cm4g
c2FmZTsKKyAgICAgICAgICAgIGlmICggZWxlbSApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVt
cHR5KCkuYXBwZW5kKCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9LCBudWxsLCB2
YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwogICAgIH0sCiAKLSAgICBjbGVhbkRhdGE6IGZ1bmN0
aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHsKLSAgICB2YXIgZWxlbSwg
dHlwZSwgaWQsIGRhdGEsCi0gICAgaSA9IDAsCi0gICAgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhw
YW5kbywKLSAgICBjYWNoZSA9IGpRdWVyeS5jYWNoZSwKLSAgICBkZWxldGVFeHBhbmRvID0galF1
ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywKLSAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNw
ZWNpYWw7Ci0KLSAgICBmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsK
LQotICAgIGlmICggYWNjZXB0RGF0YSB8fCBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewot
Ci0gICAgaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOwotICAgIGRhdGEgPSBpZCAmJiBjYWNoZVsg
aWQgXTsKLQotICAgIGlmICggZGF0YSApIHsKLSAgICBpZiAoIGRhdGEuZXZlbnRzICkgewotICAg
IGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7Ci0gICAgaWYgKCBzcGVjaWFsWyB0eXBlIF0g
KSB7Ci0gICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwotCi0gICAgLy8gVGhp
cyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAot
ICAgIH0gZWxzZSB7Ci0gICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhh
bmRsZSApOwotICAgIH0KLSAgICB9Ci0gICAgfQorICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbigp
IHsKKyAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1sgMCBdOwogCi0gICAgLy8gUmVtb3ZlIGNh
Y2hlIG9ubHkgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5LmV2ZW50LnJl
bW92ZQotICAgIGlmICggY2FjaGVbIGlkIF0gKSB7CisgICAgICAgIC8vIE1ha2UgdGhlIGNoYW5n
ZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudAor
ICAgICAgICB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworICAg
ICAgICAgICAgYXJnID0gdGhpcy5wYXJlbnROb2RlOwogCi0gICAgZGVsZXRlIGNhY2hlWyBpZCBd
OworICAgICAgICAgICAgalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKIAotICAg
IC8vIElFIGRvZXMgbm90IGFsbG93IHVzIHRvIGRlbGV0ZSBleHBhbmRvIHByb3BlcnRpZXMgZnJv
bSBub2RlcywKLSAgICAvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0
aW9uIG9uIERvY3VtZW50IG5vZGVzOwotICAgIC8vIHdlIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVz
ZSBjYXNlcwotICAgIGlmICggZGVsZXRlRXhwYW5kbyApIHsKLSAgICBkZWxldGUgZWxlbVsgaW50
ZXJuYWxLZXkgXTsKKyAgICAgICAgICAgIGlmICggYXJnICkgeworICAgICAgICAgICAgICAgIGFy
Zy5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7
CiAKLSAgICB9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5yZW1vdmVBdHRyaWJ1dGUgIT09IGNvcmVf
c3RydW5kZWZpbmVkICkgewotICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBpbnRlcm5hbEtleSAp
OworICAgICAgICAvLyBGb3JjZSByZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAo
ZS5nLiwgZnJvbSBlbXB0eSBhcmd1bWVudHMpCisgICAgICAgIHJldHVybiBhcmcgJiYgKGFyZy5s
ZW5ndGggfHwgYXJnLm5vZGVUeXBlKSA/IHRoaXMgOiB0aGlzLnJlbW92ZSgpOworICAgIH0sCiAK
LSAgICB9IGVsc2UgewotICAgIGVsZW1bIGludGVybmFsS2V5IF0gPSBudWxsOworICAgIGRldGFj
aDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoIHNl
bGVjdG9yLCB0cnVlICk7CisgICAgfSwKKworICAgIGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywg
Y2FsbGJhY2sgKSB7CisKKyAgICAgICAgLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworICAg
ICAgICBhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOworCisgICAgICAgIHZhciBmcmFn
bWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYywKKyAgICAgICAgICAg
IGkgPSAwLAorICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAorICAgICAgICAgICAgc2V0ID0g
dGhpcywKKyAgICAgICAgICAgIGlOb0Nsb25lID0gbCAtIDEsCisgICAgICAgICAgICB2YWx1ZSA9
IGFyZ3NbIDAgXSwKKyAgICAgICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbigg
dmFsdWUgKTsKKworICAgICAgICAvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQg
Y29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKKyAgICAgICAgaWYgKCBpc0Z1bmN0aW9uIHx8Cisg
ICAgICAgICAgICAgICAgKCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmCisg
ICAgICAgICAgICAgICAgICAgICFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCgg
dmFsdWUgKSApICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5k
ZXggKSB7CisgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4ICk7CisgICAg
ICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgICAgICAgICAgICAgICAgICBhcmdz
WyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sg
KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBsICkgeworICAg
ICAgICAgICAgZnJhZ21lbnQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBd
Lm93bmVyRG9jdW1lbnQsIGZhbHNlLCB0aGlzICk7CisgICAgICAgICAgICBmaXJzdCA9IGZyYWdt
ZW50LmZpcnN0Q2hpbGQ7CisKKyAgICAgICAgICAgIGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5s
ZW5ndGggPT09IDEgKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBmaXJzdDsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBmaXJzdCApIHsKKyAgICAgICAgICAgICAgICBz
Y3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgInNjcmlwdCIgKSwgZGlzYWJs
ZVNjcmlwdCApOworICAgICAgICAgICAgICAgIGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsK
KworICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBs
YXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwCisgICAg
ICAgICAgICAgICAgLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVh
dGlvbnMgKCM4MDcwKS4KKyAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmcmFnbWVudDsKKworICAgICAgICAgICAgICAgICAg
ICBpZiAoIGkgIT09IGlOb0Nsb25lICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9
IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3Rv
cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGhhc1NjcmlwdHMgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBqUXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFy
cmF5bGlrZSkgdGhyb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdl
KCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNh
bGxiYWNrLmNhbGwoIHRoaXNbIGkgXSwgbm9kZSwgaSApOworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIGlmICggaGFzU2NyaXB0cyApIHsKKyAgICAgICAgICAgICAgICAgICAg
ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKKworICAg
ICAgICAgICAgICAgICAgICAvLyBSZWVuYWJsZSBzY3JpcHRzCisgICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKKworICAgICAgICAgICAgICAg
ICAgICAvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5z
ZXJ0aW9uCisgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsg
aSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNjcmlwdHNbIGkgXTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8
ICIiICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF0YV9wcml2LmFjY2Vzcygg
bm9kZSwgImdsb2JhbEV2YWwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZS5zcmMgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0
IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggalF1ZXJ5Ll9ldmFsVXJsICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIG5v
ZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCAiIiApICk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQorfSk7CiAKLSAgICBjb3JlX2RlbGV0ZWRJ
ZHMucHVzaCggaWQgKTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQoralF1ZXJ5
LmVhY2goeworICAgIGFwcGVuZFRvOiAiYXBwZW5kIiwKKyAgICBwcmVwZW5kVG86ICJwcmVwZW5k
IiwKKyAgICBpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorICAgIGluc2VydEFmdGVyOiAiYWZ0ZXIi
LAorICAgIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmln
aW5hbCApIHsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsK
KyAgICAgICAgdmFyIGVsZW1zLAorICAgICAgICAgICAgcmV0ID0gW10sCisgICAgICAgICAgICBp
bnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisgICAgICAgICAgICBsYXN0ID0gaW5zZXJ0Lmxl
bmd0aCAtIDEsCisgICAgICAgICAgICBpID0gMDsKKworICAgICAgICBmb3IgKCA7IGkgPD0gbGFz
dDsgaSsrICkgeworICAgICAgICAgICAgZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMu
Y2xvbmUoIHRydWUgKTsKKyAgICAgICAgICAgIGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2lu
YWwgXSggZWxlbXMgKTsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKKyAgICAg
ICAgICAgIC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MK
KyAgICAgICAgICAgIHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKKyAgICAgICAgfQor
CisgICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisgICAgfTsKIH0pOwotdmFy
IGlmcmFtZSwgZ2V0U3R5bGVzLCBjdXJDU1MsCi0gICAgcmFscGhhID0gL2FscGhhXChbXildKlwp
L2ksCi0gICAgcm9wYWNpdHkgPSAvb3BhY2l0eVxzKj1ccyooW14pXSopLywKLSAgICBycG9zaXRp
b24gPSAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sCi0gICAgLy8gc3dhcHBhYmxlIGlmIGRp
c3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxl
LWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKLSAgICAvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2
YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3Bs
YXkKLSAgICByZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCi0gICAg
cm1hcmdpbiA9IC9ebWFyZ2luLywKLSAgICBybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCAiXigiICsg
Y29yZV9wbnVtICsgIikoLiopJCIsICJpIiApLAotICAgIHJudW1ub25weCA9IG5ldyBSZWdFeHAo
ICJeKCIgKyBjb3JlX3BudW0gKyAiKSg/IXB4KVthLXolXSskIiwgImkiICksCi0gICAgcnJlbE51
bSA9IG5ldyBSZWdFeHAoICJeKFsrLV0pPSgiICsgY29yZV9wbnVtICsgIikiLCAiaSIgKSwKLSAg
ICBlbGVtZGlzcGxheSA9IHsgQk9EWTogImJsb2NrIiB9LAogCi0gICAgY3NzU2hvdyA9IHsgcG9z
aXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2si
IH0sCi0gICAgY3NzTm9ybWFsVHJhbnNmb3JtID0gewotICAgIGxldHRlclNwYWNpbmc6IDAsCi0g
ICAgZm9udFdlaWdodDogNDAwCi0gICAgfSwKIAotICAgIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJS
aWdodCIsICJCb3R0b20iLCAiTGVmdCIgXSwKLSAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIs
ICJPIiwgIk1veiIsICJtcyIgXTsKK3ZhciBpZnJhbWUsCisgICAgZWxlbWRpc3BsYXkgPSB7fTsK
IAotLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRv
ciBwcmVmaXhlZCBwcm9wZXJ0eQotZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1l
ICkgeworLyoqCisgKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50Cisg
KiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudAorICogQHBhcmFt
IHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3QKKyAqLworLy8gQ2FsbGVkIG9ubHkgZnJvbSB3
aXRoaW4gZGVmYXVsdERpc3BsYXkKK2Z1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyAp
IHsKKyAgICB2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5hbWUgKSApLmFw
cGVuZFRvKCBkb2MuYm9keSApLAogCi0gICAgLy8gc2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJl
IG5vdCB2ZW5kb3IgcHJlZml4ZWQKLSAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7Ci0gICAgcmV0
dXJuIG5hbWU7Ci0gICAgfQorICAgICAgICAvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdo
dCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudAorICAgICAgICBkaXNw
bGF5ID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlID8KIAotICAgIC8vIGNoZWNrIGZv
ciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXMKLSAgICB2YXIgY2FwTmFtZSA9IG5hbWUuY2hhckF0KDAp
LnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAotICAgIG9yaWdOYW1lID0gbmFtZSwKLSAg
ICBpID0gY3NzUHJlZml4ZXMubGVuZ3RoOworICAgICAgICAgICAgLy8gVXNlIG9mIHRoaXMgbWV0
aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdG1pemF0aW9uKSB1bnRpbCBzb21l
dGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLAorICAgICAgICAgICAgLy8gc2luY2UgaXQgd2FzIHJl
bW92ZWQgZnJvbSBzcGVjaWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBGRgorICAgICAg
ICAgICAgd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKS5kaXNwbGF5
IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCAiZGlzcGxheSIgKTsKIAotICAgIHdoaWxlICggaS0t
ICkgewotICAgIG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKLSAgICBpZiAoIG5h
bWUgaW4gc3R5bGUgKSB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIH0KKyAgICAvLyBX
ZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCwKKyAgICAvLyBzbyB1
c2UgImRldGFjaCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQgb2YgdGhlIGVsZW1lbnQK
KyAgICBlbGVtLmRldGFjaCgpOwogCi0gICAgcmV0dXJuIG9yaWdOYW1lOworICAgIHJldHVybiBk
aXNwbGF5OwogfQogCi1mdW5jdGlvbiBpc0hpZGRlbiggZWxlbSwgZWwgKSB7Ci0gICAgLy8gaXNI
aWRkZW4gbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjsKLSAgICAv
LyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnQKLSAgICBlbGVt
ID0gZWwgfHwgZWxlbTsKLSAgICByZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkg
PT09ICJub25lIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0g
KTsKLX0KKy8qKgorICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVl
IG9mIGFuIGVsZW1lbnQKKyAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZQorICovCitmdW5jdGlv
biBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CisgICAgdmFyIGRvYyA9IGRvY3VtZW50LAor
ICAgICAgICBkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07CiAKLWZ1bmN0aW9uIHNo
b3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHsKLSAgICB2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVu
LAotICAgIHZhbHVlcyA9IFtdLAotICAgIGluZGV4ID0gMCwKLSAgICBsZW5ndGggPSBlbGVtZW50
cy5sZW5ndGg7CisgICAgaWYgKCAhZGlzcGxheSApIHsKKyAgICAgICAgZGlzcGxheSA9IGFjdHVh
bERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKIAotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGg7
IGluZGV4KysgKSB7Ci0gICAgZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOwotICAgIGlmICggIWVs
ZW0uc3R5bGUgKSB7Ci0gICAgY29udGludWU7Ci0gICAgfQorICAgICAgICAvLyBJZiB0aGUgc2lt
cGxlIHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWUKKyAgICAgICAgaWYgKCBk
aXNwbGF5ID09PSAibm9uZSIgfHwgIWRpc3BsYXkgKSB7CiAKLSAgICB2YWx1ZXNbIGluZGV4IF0g
PSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiApOwotICAgIGRpc3BsYXkgPSBlbGVt
LnN0eWxlLmRpc3BsYXk7Ci0gICAgaWYgKCBzaG93ICkgewotICAgIC8vIFJlc2V0IHRoZSBpbmxp
bmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKLSAgICAvLyBiZWlu
ZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90Ci0gICAgaWYgKCAhdmFsdWVzWyBpbmRl
eCBdICYmIGRpc3BsYXkgPT09ICJub25lIiApIHsKLSAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAi
IjsKLSAgICB9CisgICAgICAgICAgICAvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUg
aWYgcG9zc2libGUKKyAgICAgICAgICAgIGlmcmFtZSA9IChpZnJhbWUgfHwgalF1ZXJ5KCAiPGlm
cmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIgKSkuYXBwZW5kVG8o
IGRvYy5kb2N1bWVudEVsZW1lbnQgKTsKIAotICAgIC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZl
IGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKLSAgICAvLyBpbiBhIHN0eWxlc2hl
ZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpcwotICAgIC8vIGZvciBz
dWNoIGFuIGVsZW1lbnQKLSAgICBpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNI
aWRkZW4oIGVsZW0gKSApIHsKLSAgICB2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVs
ZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7Ci0g
ICAgfQotICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBbHdheXMgd3JpdGUgYSBuZXcgSFRN
TCBza2VsZXRvbiBzbyBXZWJraXQgYW5kIEZpcmVmb3ggZG9uJ3QgY2hva2Ugb24gcmV1c2UKKyAg
ICAgICAgICAgIGRvYyA9IGlmcmFtZVsgMCBdLmNvbnRlbnREb2N1bWVudDsKIAotICAgIGlmICgg
IXZhbHVlc1sgaW5kZXggXSApIHsKLSAgICBoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApOworICAg
ICAgICAgICAgLy8gU3VwcG9ydDogSUUKKyAgICAgICAgICAgIGRvYy53cml0ZSgpOworICAgICAg
ICAgICAgZG9jLmNsb3NlKCk7CiAKLSAgICBpZiAoIGRpc3BsYXkgJiYgZGlzcGxheSAhPT0gIm5v
bmUiIHx8ICFoaWRkZW4gKSB7Ci0gICAgalF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIs
IGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSApOwotICAg
IH0KLSAgICB9Ci0gICAgfQotICAgIH0KKyAgICAgICAgICAgIGRpc3BsYXkgPSBhY3R1YWxEaXNw
bGF5KCBub2RlTmFtZSwgZG9jICk7CisgICAgICAgICAgICBpZnJhbWUuZGV0YWNoKCk7CisgICAg
ICAgIH0KIAotICAgIC8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBp
biBhIHNlY29uZCBsb29wCi0gICAgLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwotICAg
IGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7Ci0gICAgZWxlbSA9
IGVsZW1lbnRzWyBpbmRleCBdOwotICAgIGlmICggIWVsZW0uc3R5bGUgKSB7Ci0gICAgY29udGlu
dWU7Ci0gICAgfQotICAgIGlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAibm9u
ZSIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAiIiApIHsKLSAgICBlbGVtLnN0eWxlLmRpc3Bs
YXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8ICIiIDogIm5vbmUiOwotICAgIH0KKyAgICAg
ICAgLy8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5CisgICAgICAgIGVsZW1kaXNw
bGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKICAgICB9CiAKLSAgICByZXR1cm4gZWxlbWVudHM7
CisgICAgcmV0dXJuIGRpc3BsYXk7CiB9Cit2YXIgcm1hcmdpbiA9ICgvXm1hcmdpbi8pOwogCi1q
UXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAg
ICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVl
ICkgewotICAgIHZhciBsZW4sIHN0eWxlcywKLSAgICBtYXAgPSB7fSwKLSAgICBpID0gMDsKK3Zh
ciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVdKyQi
LCAiaSIgKTsKIAotICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsKLSAgICBzdHls
ZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTsKLSAgICBsZW4gPSBuYW1lLmxlbmd0aDsKK3ZhciBnZXRT
dHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJuIGVsZW0ub3duZXJEb2N1
bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7CisgICAgfTsK
IAotICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgewotICAgIG1hcFsgbmFtZVsgaSBdIF0gPSBq
UXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTsKLSAgICB9CiAKLSAg
ICByZXR1cm4gbWFwOwotICAgIH0KIAotICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8K
LSAgICBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgotICAgIGpRdWVyeS5jc3Mo
IGVsZW0sIG5hbWUgKTsKLSAgICB9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEg
KTsKLSAgICB9LAotICAgIHNob3c6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBzaG93SGlkZSgg
dGhpcywgdHJ1ZSApOwotICAgIH0sCi0gICAgaGlkZTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IHNob3dIaWRlKCB0aGlzICk7Ci0gICAgfSwKLSAgICB0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSAp
IHsKLSAgICB2YXIgYm9vbCA9IHR5cGVvZiBzdGF0ZSA9PT0gImJvb2xlYW4iOworZnVuY3Rpb24g
Y3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHsKKyAgICB2YXIgd2lkdGgsIG1pbldpZHRo
LCBtYXhXaWR0aCwgcmV0LAorICAgICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7CiAKLSAgICByZXR1
cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgIGlmICggYm9vbCA/IHN0YXRlIDogaXNIaWRk
ZW4oIHRoaXMgKSApIHsKLSAgICBqUXVlcnkoIHRoaXMgKS5zaG93KCk7Ci0gICAgfSBlbHNlIHsK
LSAgICBqUXVlcnkoIHRoaXMgKS5oaWRlKCk7Ci0gICAgfQotICAgIH0pOwotICAgIH0KLX0pOwor
ICAgIGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7CiAKLWpRdWVyeS5l
eHRlbmQoewotICAgIC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGlu
ZyB0aGUgZGVmYXVsdAotICAgIC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBz
dHlsZSBwcm9wZXJ0eQotICAgIGNzc0hvb2tzOiB7Ci0gICAgb3BhY2l0eTogewotICAgIGdldDog
ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgIC8vIFN1cHBvcnQ6IElFOQorICAgIC8v
IGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpIGluIElF
OSwgc2VlICMxMjUzNwogICAgIGlmICggY29tcHV0ZWQgKSB7Ci0gICAgLy8gV2Ugc2hvdWxkIGFs
d2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKLSAgICB2YXIgcmV0ID0gY3VyQ1NT
KCBlbGVtLCAib3BhY2l0eSIgKTsKLSAgICByZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsK
LSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9LAotCi0gICAgLy8gRXhjbHVkZSB0aGUgZm9sbG93
aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAotICAgIGNzc051bWJlcjogewotICAgICJjb2x1
bW5Db3VudCI6IHRydWUsCi0gICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKLSAgICAiZm9udFdlaWdo
dCI6IHRydWUsCi0gICAgImxpbmVIZWlnaHQiOiB0cnVlLAotICAgICJvcGFjaXR5IjogdHJ1ZSwK
LSAgICAib3JwaGFucyI6IHRydWUsCi0gICAgIndpZG93cyI6IHRydWUsCi0gICAgInpJbmRleCI6
IHRydWUsCi0gICAgInpvb20iOiB0cnVlCi0gICAgfSwKLQotICAgIC8vIEFkZCBpbiBwcm9wZXJ0
aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmUKLSAgICAvLyBzZXR0aW5nIG9y
IGdldHRpbmcgdGhlIHZhbHVlCi0gICAgY3NzUHJvcHM6IHsKLSAgICAvLyBub3JtYWxpemUgZmxv
YXQgY3NzIHByb3BlcnR5Ci0gICAgImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAi
Y3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCi0gICAgfSwKLQotICAgIC8vIEdldCBhbmQgc2V0IHRo
ZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCi0gICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVt
LCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7Ci0gICAgLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0
IGFuZCBjb21tZW50IG5vZGVzCi0gICAgaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAz
IHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7Ci0gICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmln
aHQgbmFtZQotICAgIHZhciByZXQsIHR5cGUsIGhvb2tzLAotICAgIG9yaWdOYW1lID0galF1ZXJ5
LmNhbWVsQ2FzZSggbmFtZSApLAotICAgIHN0eWxlID0gZWxlbS5zdHlsZTsKLQotICAgIG5hbWUg
PSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdO
YW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTsKLQotICAgIC8vIGdl
dHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KLSAgICAvLyBmb2xsb3dlZCBieSB0aGUg
dW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8
fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSdyZSBz
ZXR0aW5nIGEgdmFsdWUKLSAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgdHlw
ZSA9IHR5cGVvZiB2YWx1ZTsKLQotICAgIC8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmlu
Z3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQotICAgIGlmICggdHlwZSA9
PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7Ci0gICAgdmFs
dWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVs
ZW0sIG5hbWUgKSApOwotICAgIC8vIEZpeGVzIGJ1ZyAjOTIzNwotICAgIHR5cGUgPSAibnVtYmVy
IjsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhhdCBOYU4gYW5kIG51bGwgdmFsdWVzIGFy
ZW4ndCBzZXQuIFNlZTogIzcxMTYKLSAgICBpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0g
Im51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7Ci0gICAgcmV0dXJuOworICAgICAgICByZXQg
PSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsK
ICAgICB9CiAKLSAgICAvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgJ3B4JyB0byB0
aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykKLSAgICBpZiAoIHR5cGUgPT09
ICJudW1iZXIiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgewotICAgIHZhbHVl
ICs9ICJweCI7Ci0gICAgfQorICAgIGlmICggY29tcHV0ZWQgKSB7CiAKLSAgICAvLyBGaXhlcyAj
ODkwOCwgaXQgY2FuIGJlIGRvbmUgbW9yZSBjb3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMg
aW4gY3NzSG9va3MsCi0gICAgLy8gYnV0IGl0IHdvdWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0IChm
b3IgZXZlcnkgcHJvYmxlbWF0aWMgcHJvcGVydHkpIGlkZW50aWNhbCBmdW5jdGlvbnMKLSAgICBp
ZiAoICFqUXVlcnkuc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5h
bWUuaW5kZXhPZigiYmFja2dyb3VuZCIpID09PSAwICkgewotICAgIHN0eWxlWyBuYW1lIF0gPSAi
aW5oZXJpdCI7Ci0gICAgfQorICAgICAgICBpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5jb250
YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7CisgICAgICAgICAgICByZXQgPSBq
UXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1cHBv
cnQ6IGlPUyA8IDYKKyAgICAgICAgLy8gQSB0cmlidXRlIHRvIHRoZSAiYXdlc29tZSBoYWNrIGJ5
IERlYW4gRWR3YXJkcyIKKyAgICAgICAgLy8gaU9TIDwgNiAoYXQgbGVhc3QpIHJldHVybnMgcGVy
Y2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJl
IHJlbGlhYmx5IHBpeGVscworICAgICAgICAvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRy
YWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMK
KyAgICAgICAgaWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1l
ICkgKSB7CisKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAg
ICAgICAgICAgIHdpZHRoID0gc3R5bGUud2lkdGg7CisgICAgICAgICAgICBtaW5XaWR0aCA9IHN0
eWxlLm1pbldpZHRoOworICAgICAgICAgICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKKwor
ICAgICAgICAgICAgLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZh
bHVlIG91dAorICAgICAgICAgICAgc3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0
eWxlLndpZHRoID0gcmV0OworICAgICAgICAgICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7CisKKyAg
ICAgICAgICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKKyAgICAgICAgICAgIHN0eWxl
LndpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOwor
ICAgICAgICAgICAgc3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CisgICAgICAgIC8vIFN1cHBvcnQ6IElF
CisgICAgICAgIC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuCisgICAg
ICAgIHJldCArICIiIDoKKyAgICAgICAgcmV0OworfQogCi0gICAgLy8gSWYgYSBob29rIHdhcyBw
cm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVk
IHZhbHVlCi0gICAgaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0g
aG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKIAotICAg
IC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZh
bGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkCi0gICAgLy8gRml4ZXMgYnVnICM1NTA5Ci0gICAgdHJ5
IHsKLSAgICBzdHlsZVsgbmFtZSBdID0gdmFsdWU7Ci0gICAgfSBjYXRjaChlKSB7fQotICAgIH0K
K2Z1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHsKKyAgICAvLyBE
ZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFs
bHkgbmVlZGVkLgorICAgIHJldHVybiB7CisgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgICBpZiAoIGNvbmRpdGlvbkZuKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gSG9vayBu
b3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlIHRvIG1pc3Npbmcg
ZGVwZW5kZW5jeSksCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0LgorICAgICAgICAgICAg
ICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBob29rcyBmb3IgbWFyZ2luUmlnaHQsIHJl
bW92ZSB0aGUgd2hvbGUgb2JqZWN0LgorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmdldDsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8v
IEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90
IGV4ZWN1dGVkIGFnYWluLgorCisgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0ID0gaG9va0Zu
KS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisgICAgICAgIH0KKyAgICB9OworfQogCi0gICAg
fSBlbHNlIHsKLSAgICAvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1
dGVkIHZhbHVlIGZyb20gdGhlcmUKLSAgICBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYm
IChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkg
ewotICAgIHJldHVybiByZXQ7Ci0gICAgfQogCi0gICAgLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRo
ZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKLSAgICByZXR1cm4gc3R5bGVbIG5hbWUgXTsK
LSAgICB9Ci0gICAgfSwKKyhmdW5jdGlvbigpIHsKKyAgICB2YXIgcGl4ZWxQb3NpdGlvblZhbCwg
Ym94U2l6aW5nUmVsaWFibGVWYWwsCisgICAgICAgIC8vIFN1cHBvcnQ6IEZpcmVmb3gsIEFuZHJv
aWQgMi4zIChQcmVmaXhlZCBib3gtc2l6aW5nIHZlcnNpb25zKS4KKyAgICAgICAgZGl2UmVzZXQg
PSAicGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gt
c2l6aW5nOmNvbnRlbnQtYm94OyIgKworICAgICAgICAgICAgIi1tb3otYm94LXNpemluZzpjb250
ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IiwKKyAgICAgICAgZG9jRWxlbSA9IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCggImRpdiIgKSwKKyAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgg
ImRpdiIgKTsKIAotICAgIGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMg
KSB7Ci0gICAgdmFyIG51bSwgdmFsLCBob29rcywKLSAgICBvcmlnTmFtZSA9IGpRdWVyeS5jYW1l
bENhc2UoIG5hbWUgKTsKKyAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiY29udGVudC1i
b3giOworICAgIGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIi
OworICAgIHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlw
ID09PSAiY29udGVudC1ib3giOwogCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2lu
ZyB3aXRoIHRoZSByaWdodCBuYW1lCi0gICAgbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05h
bWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBl
bGVtLnN0eWxlLCBvcmlnTmFtZSApICk7CisgICAgY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAi
Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05
OTk5cHg7IiArCisgICAgICAgICJtYXJnaW4tdG9wOjFweCI7CisgICAgY29udGFpbmVyLmFwcGVu
ZENoaWxkKCBkaXYgKTsKIAotICAgIC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNp
b24KLSAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgaG9va3Mg
PSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07
CisgICAgLy8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxl
IHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0CisgICAgLy8gc28gdGhleSdyZSBleGVjdXRl
ZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi4KKyAgICBm
dW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkgeworICAg
ICAgICAvLyBTdXBwb3J0OiBGaXJlZm94LCBBbmRyb2lkIDIuMyAoUHJlZml4ZWQgYm94LXNpemlu
ZyB2ZXJzaW9ucykuCisgICAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gIi13ZWJraXQtYm94LXNp
emluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94OyIgKworICAgICAgICAg
ICAgImJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6
YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7IiArCisgICAgICAgICAgICAicG9zaXRpb246
YWJzb2x1dGU7dG9wOjElIjsKKyAgICAgICAgZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVy
ICk7CiAKLSAgICAvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFs
dWUgZnJvbSB0aGVyZQotICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7Ci0gICAg
dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwotICAgIH0KKyAgICAgICAgdmFy
IGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApOworICAgICAg
ICBwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOworICAgICAgICBib3hT
aXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSAiNHB4IjsKIAotICAgIC8vIE90
aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0
aGF0Ci0gICAgaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKLSAgICB2YWwgPSBjdXJDU1MoIGVs
ZW0sIG5hbWUsIHN0eWxlcyApOworICAgICAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWlu
ZXIgKTsKICAgICB9CiAKLSAgICAvL2NvbnZlcnQgIm5vcm1hbCIgdG8gY29tcHV0ZWQgdmFsdWUK
LSAgICBpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0g
KSB7Ci0gICAgdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CisgICAgLy8gVXNlIHdp
bmRvdy5nZXRDb21wdXRlZFN0eWxlIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxsIGJyZWFr
IHdpdGhvdXQgaXQuCisgICAgaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKyAgICAg
ICAgalF1ZXJ5LmV4dGVuZChzdXBwb3J0LCB7CisgICAgICAgICAgICBwaXhlbFBvc2l0aW9uOiBm
dW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25s
eSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmcKKyAgICAgICAgICAgICAgICAvLyBzaW5j
ZSB3ZSBjYW4gdXNlIHRoZSBib3hTaXppbmdSZWxpYWJsZSBwcmUtY29tcHV0aW5nLgorICAgICAg
ICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRlc3Qgd2FzIGFscmVhZHkgcGVy
Zm9ybWVkLCB0aG91Z2guCisgICAgICAgICAgICAgICAgY29tcHV0ZVBpeGVsUG9zaXRpb25BbmRC
b3hTaXppbmdSZWxpYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBwaXhlbFBvc2l0aW9u
VmFsOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGJveFNpemluZ1JlbGlhYmxlOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51
bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6
aW5nUmVsaWFibGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJu
IGJveFNpemluZ1JlbGlhYmxlVmFsOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHJlbGlh
YmxlTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6
IEFuZHJvaWQgMi4zCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGl2IHdpdGggZXhwbGlj
aXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseQorICAgICAgICAgICAgICAg
IC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5l
ci4gKCMzMzMzKQorICAgICAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21w
dXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAorICAgICAgICAg
ICAgICAgIC8vIFRoaXMgc3VwcG9ydCBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIG9uY2Ugc28g
bm8gbWVtb2l6aW5nIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICB2YXIgcmV0LAorICAgICAg
ICAgICAgICAgICAgICBtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoICJkaXYiICkgKTsKKyAgICAgICAgICAgICAgICBtYXJnaW5EaXYuc3R5bGUuY3Nz
VGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2UmVzZXQ7CisgICAgICAgICAgICAgICAgbWFy
Z2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwor
ICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICIxcHgiOworICAgICAgICAgICAgICAg
IGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApOworCisgICAgICAgICAgICAgICAgcmV0
ID0gIXBhcnNlRmxvYXQoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBtYXJnaW5EaXYsIG51bGwg
KS5tYXJnaW5SaWdodCApOworCisgICAgICAgICAgICAgICAgZG9jRWxlbS5yZW1vdmVDaGlsZCgg
Y29udGFpbmVyICk7CisKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZGl2IGZvciBv
dGhlciBzdXBwb3J0IHRlc3RzLgorICAgICAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAiIjsK
KworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0p
OwogICAgIH0KK30pKCk7CiAKLSAgICAvLyBSZXR1cm4sIGNvbnZlcnRpbmcgdG8gbnVtYmVyIGlm
IGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmlj
Ci0gICAgaWYgKCBleHRyYSA9PT0gIiIgfHwgZXh0cmEgKSB7Ci0gICAgbnVtID0gcGFyc2VGbG9h
dCggdmFsICk7Ci0gICAgcmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMo
IG51bSApID8gbnVtIHx8IDAgOiB2YWw7Ci0gICAgfQotICAgIHJldHVybiB2YWw7Ci0gICAgfSwK
IAotICAgIC8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVy
dGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKLSAgICBzd2FwOiBmdW5jdGlvbiggZWxl
bSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7CisvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBz
d2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25z
LgoralF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3Mg
KSB7CiAgICAgdmFyIHJldCwgbmFtZSwKLSAgICBvbGQgPSB7fTsKKyAgICAgICAgb2xkID0ge307
CiAKICAgICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9u
ZXMKICAgICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0gICAgb2xkWyBuYW1lIF0gPSBlbGVt
LnN0eWxlWyBuYW1lIF07Ci0gICAgZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBd
OworICAgICAgICBvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKyAgICAgICAgZWxl
bS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwogICAgIH0KIAogICAgIHJldCA9IGNh
bGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7CiAKICAgICAvLyBSZXZlcnQgdGhlIG9s
ZCB2YWx1ZXMKICAgICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0gICAgZWxlbS5zdHlsZVsg
bmFtZSBdID0gb2xkWyBuYW1lIF07CisgICAgICAgIGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsg
bmFtZSBdOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7Ci0gICAgfQotfSk7Ci0KLS8vIE5PVEU6
IHdlJ3ZlIGluY2x1ZGVkIHRoZSAid2luZG93IiBpbiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZQot
Ly8gYmVjYXVzZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KLWlmICgg
d2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7Ci0gICAgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVs
ZW0gKSB7Ci0gICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7
Ci0gICAgfTsKLQotICAgIGN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBfY29tcHV0ZWQg
KSB7Ci0gICAgdmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsCi0gICAgY29tcHV0ZWQgPSBf
Y29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICksCi0KLSAgICAvLyBnZXRQcm9wZXJ0eVZhbHVl
IGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSBpbiBJRTksIHNlZSAjMTI1MzcKLSAg
ICByZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBj
b21wdXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkLAotICAgIHN0eWxlID0gZWxlbS5zdHlsZTsKLQot
ICAgIGlmICggY29tcHV0ZWQgKSB7Ci0KLSAgICBpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5j
b250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7Ci0gICAgcmV0ID0galF1ZXJ5
LnN0eWxlKCBlbGVtLCBuYW1lICk7Ci0gICAgfQotCi0gICAgLy8gQSB0cmlidXRlIHRvIHRoZSAi
YXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcyIKLSAgICAvLyBDaHJvbWUgPCAxNyBhbmQgU2Fm
YXJpIDUuMCB1c2VzICJjb21wdXRlZCB2YWx1ZSIgaW5zdGVhZCBvZiAidXNlZCB2YWx1ZSIgZm9y
IG1hcmdpbi1yaWdodAotICAgIC8vIFNhZmFyaSA1LjEuNyAoYXQgbGVhc3QpIHJldHVybnMgcGVy
Y2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJl
IHJlbGlhYmx5IHBpeGVscwotICAgIC8vIHRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQg
c3BlYzogaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3Nzb20vI3Jlc29sdmVkLXZhbHVlcwotICAg
IGlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgewor
fTsKIAotICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICB3aWR0aCA9IHN0
eWxlLndpZHRoOwotICAgIG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7Ci0gICAgbWF4V2lkdGgg
PSBzdHlsZS5tYXhXaWR0aDsKIAotICAgIC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQg
YSBjb21wdXRlZCB2YWx1ZSBvdXQKLSAgICBzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRo
ID0gc3R5bGUud2lkdGggPSByZXQ7Ci0gICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7Cit2YXIKKyAg
ICAvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4
Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgorICAgIC8vIHNl
ZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcv
ZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAgIHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUo
PyEtY1tlYV0pLispLywKKyAgICBybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCAiXigiICsgcG51bSAr
ICIpKC4qKSQiLCAiaSIgKSwKKyAgICBycmVsTnVtID0gbmV3IFJlZ0V4cCggIl4oWystXSk9KCIg
KyBwbnVtICsgIikiLCAiaSIgKSwKIAotICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMK
LSAgICBzdHlsZS53aWR0aCA9IHdpZHRoOwotICAgIHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7
Ci0gICAgc3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDsKLSAgICB9Ci0gICAgfQorICAgIGNzc1No
b3cgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxh
eTogImJsb2NrIiB9LAorICAgIGNzc05vcm1hbFRyYW5zZm9ybSA9IHsKKyAgICAgICAgbGV0dGVy
U3BhY2luZzogMCwKKyAgICAgICAgZm9udFdlaWdodDogNDAwCisgICAgfSwKIAotICAgIHJldHVy
biByZXQ7Ci0gICAgfTsKLX0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJy
ZW50U3R5bGUgKSB7Ci0gICAgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0
dXJuIGVsZW0uY3VycmVudFN0eWxlOwotICAgIH07CisgICAgY3NzUHJlZml4ZXMgPSBbICJXZWJr
aXQiLCAiTyIsICJNb3oiLCAibXMiIF07CiAKLSAgICBjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwg
bmFtZSwgX2NvbXB1dGVkICkgewotICAgIHZhciBsZWZ0LCBycywgcnNMZWZ0LAotICAgIGNvbXB1
dGVkID0gX2NvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApLAotICAgIHJldCA9IGNvbXB1dGVk
ID8gY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKLSAgICBzdHlsZSA9IGVsZW0uc3R5bGU7
CisvLyByZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9y
IHByZWZpeGVkIHByb3BlcnR5CitmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUg
KSB7CiAKLSAgICAvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQotICAg
IC8vIHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0bwotICAgIGlmICggcmV0ID09IG51bGwgJiYg
c3R5bGUgJiYgc3R5bGVbIG5hbWUgXSApIHsKLSAgICByZXQgPSBzdHlsZVsgbmFtZSBdOworICAg
IC8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkCisgICAg
aWYgKCBuYW1lIGluIHN0eWxlICkgeworICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKLSAg
ICAvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCi0gICAgLy8gaHR0cDov
L2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5
MQotCi0gICAgLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVt
YmVyCi0gICAgLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVk
IHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCi0gICAgLy8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0
cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQg
aW5zdGVhZAotICAgIC8vIGFuZCB3ZSBjYW4ndCBtZWFzdXJlIHRoZSBwYXJlbnQgaW5zdGVhZCBi
ZWNhdXNlIGl0IG1pZ2h0IHRyaWdnZXIgYSAic3RhY2tpbmcgZG9sbHMiIHByb2JsZW0KLSAgICBp
ZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSApIHsK
LQotICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICBsZWZ0ID0gc3R5bGUu
bGVmdDsKLSAgICBycyA9IGVsZW0ucnVudGltZVN0eWxlOwotICAgIHJzTGVmdCA9IHJzICYmIHJz
LmxlZnQ7Ci0KLSAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQg
dmFsdWUgb3V0Ci0gICAgaWYgKCByc0xlZnQgKSB7Ci0gICAgcnMubGVmdCA9IGVsZW0uY3VycmVu
dFN0eWxlLmxlZnQ7Ci0gICAgfQotICAgIHN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUi
ID8gIjFlbSIgOiByZXQ7Ci0gICAgcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKKyAgICAv
LyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCisgICAgdmFyIGNhcE5hbWUgPSBuYW1l
WzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAorICAgICAgICBvcmlnTmFtZSA9IG5h
bWUsCisgICAgICAgIGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7CiAKLSAgICAvLyBSZXZlcnQgdGhl
IGNoYW5nZWQgdmFsdWVzCi0gICAgc3R5bGUubGVmdCA9IGxlZnQ7Ci0gICAgaWYgKCByc0xlZnQg
KSB7Ci0gICAgcnMubGVmdCA9IHJzTGVmdDsKLSAgICB9CisgICAgd2hpbGUgKCBpLS0gKSB7Cisg
ICAgICAgIG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKKyAgICAgICAgaWYgKCBu
YW1lIGluIHN0eWxlICkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KICAg
ICB9CiAKLSAgICByZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKLSAgICB9OworICAg
IHJldHVybiBvcmlnTmFtZTsKIH0KIAogZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0s
IHZhbHVlLCBzdWJ0cmFjdCApIHsKICAgICB2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2
YWx1ZSApOwogICAgIHJldHVybiBtYXRjaGVzID8KLSAgICAvLyBHdWFyZCBhZ2FpbnN0IHVuZGVm
aW5lZCAic3VidHJhY3QiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3MKLSAgICBNYXRo
Lm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sg
MiBdIHx8ICJweCIgKSA6Ci0gICAgdmFsdWU7CisgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdW5k
ZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcworICAgICAg
ICBNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0
Y2hlc1sgMiBdIHx8ICJweCIgKSA6CisgICAgICAgIHZhbHVlOwogfQogCiBmdW5jdGlvbiBhdWdt
ZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMg
KSB7CiAgICAgdmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNv
bnRlbnQiICkgPwotICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1l
bnQsIGF2b2lkIGF1Z21lbnRhdGlvbgotICAgIDQgOgotICAgIC8vIE90aGVyd2lzZSBpbml0aWFs
aXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXMKLSAgICBuYW1lID09PSAi
d2lkdGgiID8gMSA6IDAsCisgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQg
bWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgorICAgICAgICA0IDoKKyAgICAgICAgLy8g
T3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGll
cworICAgICAgICBuYW1lID09PSAid2lkdGgiID8gMSA6IDAsCiAKLSAgICB2YWwgPSAwOworICAg
ICAgICB2YWwgPSAwOwogCiAgICAgZm9yICggOyBpIDwgNDsgaSArPSAyICkgewotICAgIC8vIGJv
dGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKLSAg
ICBpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKLSAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxl
bSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0gICAgfQotCi0gICAg
aWYgKCBpc0JvcmRlckJveCApIHsKLSAgICAvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcs
IHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQKLSAgICBpZiAoIGV4dHJhID09PSAiY29u
dGVudCIgKSB7Ci0gICAgdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4
cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKLSAgICB9Ci0KLSAgICAvLyBhdCB0aGlzIHBvaW50
LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgotICAgIGlm
ICggZXh0cmEgIT09ICJtYXJnaW4iICkgewotICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAi
Ym9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7Ci0gICAg
fQotICAgIH0gZWxzZSB7Ci0gICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVu
dCwgc28gYWRkIHBhZGRpbmcKLSAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmci
ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOwotCi0gICAgLy8gYXQgdGhpcyBwb2lu
dCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlcgotICAgIGlm
ICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKLSAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwg
ImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotICAg
IH0KLSAgICB9CisgICAgICAgIC8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28g
YWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICAgICAgaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKSB7
CisgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRb
IGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzQm9yZGVy
Qm94ICkgeworICAgICAgICAgICAgLy8gYm9yZGVyLWJveCBpbmNsdWRlcyBwYWRkaW5nLCBzbyBy
ZW1vdmUgaXQgaWYgd2Ugd2FudCBjb250ZW50CisgICAgICAgICAgICBpZiAoIGV4dHJhID09PSAi
Y29udGVudCIgKSB7CisgICAgICAgICAgICAgICAgdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJw
YWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBt
YXJnaW4sIHNvIHJlbW92ZSBib3JkZXIKKyAgICAgICAgICAgIGlmICggZXh0cmEgIT09ICJtYXJn
aW4iICkgeworICAgICAgICAgICAgICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVy
IiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBleHRy
YSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZworICAgICAgICAgICAgdmFsICs9IGpRdWVy
eS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsK
KworICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3Ig
cGFkZGluZywgc28gYWRkIGJvcmRlcgorICAgICAgICAgICAgaWYgKCBleHRyYSAhPT0gInBhZGRp
bmciICkgeworICAgICAgICAgICAgICAgIHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVy
IiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdmFsOwpAQCAtNzA2NCwyMDcgKzU3
MjcsMjc1IEBAIGZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkg
ewogCiAgICAgLy8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxl
bnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWUKICAgICB2YXIgdmFsdWVJc0JvcmRlckJveCA9IHRy
dWUsCi0gICAgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVt
Lm9mZnNldEhlaWdodCwKLSAgICBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSwKLSAgICBpc0Jv
cmRlckJveCA9IGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAi
Ym94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAiYm9yZGVyLWJveCI7CisgICAgICAgIHZh
bCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWln
aHQsCisgICAgICAgIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAorICAgICAgICBpc0JvcmRl
ckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09
ICJib3JkZXItYm94IjsKIAogICAgIC8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVu
ZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAogICAg
IC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0
OTI4NQogICAgIC8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19i
dWcuY2dpP2lkPTQ5MTY2OAogICAgIGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7Ci0g
ICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNz
YXJ5Ci0gICAgdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKLSAgICBpZiAoIHZh
bCA8IDAgfHwgdmFsID09IG51bGwgKSB7Ci0gICAgdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOwot
ICAgIH0KKyAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBj
c3MgaWYgbmVjZXNzYXJ5CisgICAgICAgIHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVz
ICk7CisgICAgICAgIGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAg
IHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKyAgICAgICAgfQogCi0gICAgLy8gQ29tcHV0ZWQg
dW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi4KLSAgICBpZiAoIHJudW1u
b25weC50ZXN0KHZhbCkgKSB7Ci0gICAgcmV0dXJuIHZhbDsKLSAgICB9CisgICAgICAgIC8vIENv
bXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uCisgICAgICAg
IGlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHsKKyAgICAgICAgICAgIHJldHVybiB2YWw7Cisg
ICAgICAgIH0KIAotICAgIC8vIHdlIG5lZWQgdGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEg
YnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzCi0gICAgLy8gZm9yIGdldENv
bXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHls
ZQotICAgIHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIGpRdWVyeS5zdXBwb3J0
LmJveFNpemluZ1JlbGlhYmxlIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7CisgICAg
ICAgIC8vIHdlIG5lZWQgdGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGlj
aCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzCisgICAgICAgIC8vIGZvciBnZXRDb21wdXRlZFN0
eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKKyAgICAg
ICAgdmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmCisgICAgICAgICAgICAoIHN1cHBv
cnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApOwog
Ci0gICAgLy8gTm9ybWFsaXplICIiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmEKLSAgICB2
YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwOworICAgICAgICAvLyBOb3JtYWxpemUgIiIsIGF1
dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQorICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KCB2YWwg
KSB8fCAwOwogICAgIH0KIAogICAgIC8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwg
dG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzCiAgICAgcmV0dXJuICggdmFsICsKLSAg
ICBhdWdtZW50V2lkdGhPckhlaWdodCgKLSAgICBlbGVtLAotICAgIG5hbWUsCi0gICAgZXh0cmEg
fHwgKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICksCi0gICAgdmFsdWVJc0Jv
cmRlckJveCwKLSAgICBzdHlsZXMKLSAgICApCisgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0
KAorICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBleHRy
YSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKKyAgICAgICAgICAg
IHZhbHVlSXNCb3JkZXJCb3gsCisgICAgICAgICAgICBzdHlsZXMKKyAgICAgICAgKQogICAgICkg
KyAicHgiOwogfQogCi0vLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFs
dWUgb2YgYW4gZWxlbWVudAotZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSAp
IHsKLSAgICB2YXIgZG9jID0gZG9jdW1lbnQsCi0gICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBu
b2RlTmFtZSBdOwotCi0gICAgaWYgKCAhZGlzcGxheSApIHsKLSAgICBkaXNwbGF5ID0gYWN0dWFs
RGlzcGxheSggbm9kZU5hbWUsIGRvYyApOwotCi0gICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFp
bHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lCi0gICAgaWYgKCBkaXNwbGF5ID09PSAibm9u
ZSIgfHwgIWRpc3BsYXkgKSB7Ci0gICAgLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1l
IGlmIHBvc3NpYmxlCi0gICAgaWZyYW1lID0gKCBpZnJhbWUgfHwKLSAgICBqUXVlcnkoIjxpZnJh
bWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKQotICAgIC5jc3MoICJj
c3NUZXh0IiwgImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudCIgKQotICAgICkuYXBwZW5kVG8oIGRv
Yy5kb2N1bWVudEVsZW1lbnQgKTsKLQotICAgIC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNr
ZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQotICAgIGRv
YyA9ICggaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWzBdLmNvbnRlbnREb2N1bWVu
dCApLmRvY3VtZW50OwotICAgIGRvYy53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+
Iik7Ci0gICAgZG9jLmNsb3NlKCk7CitmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cg
KSB7CisgICAgdmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKKyAgICAgICAgdmFsdWVzID0gW10s
CisgICAgICAgIGluZGV4ID0gMCwKKyAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwog
Ci0gICAgZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKLSAgICBpZnJh
bWUuZGV0YWNoKCk7CisgICAgZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAg
ICAgICAgZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOworICAgICAgICBpZiAoICFlbGVtLnN0eWxl
ICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXNb
IGluZGV4IF0gPSBkYXRhX3ByaXYuZ2V0KCBlbGVtLCAib2xkZGlzcGxheSIgKTsKKyAgICAgICAg
ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTsKKyAgICAgICAgaWYgKCBzaG93ICkgeworICAg
ICAgICAgICAgLy8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBs
ZWFybiBpZiBpdCBpcworICAgICAgICAgICAgLy8gYmVpbmcgaGlkZGVuIGJ5IGNhc2NhZGVkIHJ1
bGVzIG9yIG5vdAorICAgICAgICAgICAgaWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkg
PT09ICJub25lIiApIHsKKyAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAiIjsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUg
YmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZQorICAgICAgICAgICAgLy8gaW4gYSBz
dHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKKyAgICAg
ICAgICAgIC8vIGZvciBzdWNoIGFuIGVsZW1lbnQKKyAgICAgICAgICAgIGlmICggZWxlbS5zdHls
ZS5kaXNwbGF5ID09PSAiIiAmJiBpc0hpZGRlbiggZWxlbSApICkgeworICAgICAgICAgICAgICAg
IHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sICJvbGRkaXNwbGF5Iiwg
ZGVmYXVsdERpc3BsYXkoZWxlbS5ub2RlTmFtZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKCAhdmFsdWVzWyBpbmRleCBdICkgeworICAgICAg
ICAgICAgICAgIGhpZGRlbiA9IGlzSGlkZGVuKCBlbGVtICk7CisKKyAgICAgICAgICAgICAgICBp
ZiAoIGRpc3BsYXkgJiYgZGlzcGxheSAhPT0gIm5vbmUiIHx8ICFoaWRkZW4gKSB7CisgICAgICAg
ICAgICAgICAgICAgIGRhdGFfcHJpdi5zZXQoIGVsZW0sICJvbGRkaXNwbGF5IiwgaGlkZGVuID8g
ZGlzcGxheSA6IGpRdWVyeS5jc3MoZWxlbSwgImRpc3BsYXkiKSApOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFN0b3JlIHRoZSBj
b3JyZWN0IGRlZmF1bHQgZGlzcGxheQotICAgIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlz
cGxheTsKKyAgICAvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4g
YSBzZWNvbmQgbG9vcAorICAgIC8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKyAgICBm
b3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworICAgICAgICBlbGVt
ID0gZWxlbWVudHNbIGluZGV4IF07CisgICAgICAgIGlmICggIWVsZW0uc3R5bGUgKSB7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICFzaG93IHx8IGVsZW0u
c3R5bGUuZGlzcGxheSA9PT0gIm5vbmUiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgKSB7
CisgICAgICAgICAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBd
IHx8ICIiIDogIm5vbmUiOworICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGRpc3BsYXk7
Ci19Ci0KLS8vIENhbGxlZCBPTkxZIGZyb20gd2l0aGluIGNzc19kZWZhdWx0RGlzcGxheQotZnVu
Y3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkgewotICAgIHZhciBlbGVtID0galF1ZXJ5
KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksCi0gICAg
ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bMF0sICJkaXNwbGF5IiApOwotICAgIGVsZW0ucmVt
b3ZlKCk7Ci0gICAgcmV0dXJuIGRpc3BsYXk7CisgICAgcmV0dXJuIGVsZW1lbnRzOwogfQogCi1q
UXVlcnkuZWFjaChbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewot
ICAgIGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewotICAgIGdldDogZnVuY3Rpb24oIGVsZW0s
IGNvbXB1dGVkLCBleHRyYSApIHsKLSAgICBpZiAoIGNvbXB1dGVkICkgewotICAgIC8vIGNlcnRh
aW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cg
dGhlbQotICAgIC8vIGhvd2V2ZXIsIGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHls
ZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlzCi0gICAgcmV0dXJuIGVsZW0ub2Zmc2V0V2lk
dGggPT09IDAgJiYgcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5
IiApICkgPwotICAgIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKLSAg
ICByZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKLSAgICB9KSA6
Ci0gICAgZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKLSAgICB9Ci0gICAg
fSwKLQotICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHsKLSAgICB2YXIg
c3R5bGVzID0gZXh0cmEgJiYgZ2V0U3R5bGVzKCBlbGVtICk7Ci0gICAgcmV0dXJuIHNldFBvc2l0
aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgPwotICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0
KAotICAgIGVsZW0sCi0gICAgbmFtZSwKLSAgICBleHRyYSwKLSAgICBqUXVlcnkuc3VwcG9ydC5i
b3hTaXppbmcgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMg
KSA9PT0gImJvcmRlci1ib3giLAotICAgIHN0eWxlcwotICAgICkgOiAwCi0gICAgKTsKLSAgICB9
Ci0gICAgfTsKLX0pOwotCi1pZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICkgewotICAgIGpR
dWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewotICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1
dGVkICkgewotICAgIC8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0eQotICAgIHJldHVybiBy
b3BhY2l0eS50ZXN0KCAoY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgPyBlbGVtLmN1cnJl
bnRTdHlsZS5maWx0ZXIgOiBlbGVtLnN0eWxlLmZpbHRlcikgfHwgIiIgKSA/Ci0gICAgKCAwLjAx
ICogcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgKSArICIiIDoKLSAgICBjb21wdXRlZCA/ICIxIiA6
ICIiOworalF1ZXJ5LmV4dGVuZCh7CisgICAgLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tz
IGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0CisgICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBh
bmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5CisgICAgY3NzSG9va3M6IHsKKyAgICAgICAgb3Bh
Y2l0eTogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKCBjb21wdXRlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
V2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKyAgICAgICAg
ICAgICAgICAgICAgdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgIm9wYWNpdHkiICk7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvLyBEb24ndCBh
dXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRp
ZXMKKyAgICBjc3NOdW1iZXI6IHsKKyAgICAgICAgImNvbHVtbkNvdW50IjogdHJ1ZSwKKyAgICAg
ICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKKyAgICAgICAgImZvbnRXZWlnaHQiOiB0cnVlLAorICAg
ICAgICAibGluZUhlaWdodCI6IHRydWUsCisgICAgICAgICJvcGFjaXR5IjogdHJ1ZSwKKyAgICAg
ICAgIm9yZGVyIjogdHJ1ZSwKKyAgICAgICAgIm9ycGhhbnMiOiB0cnVlLAorICAgICAgICAid2lk
b3dzIjogdHJ1ZSwKKyAgICAgICAgInpJbmRleCI6IHRydWUsCisgICAgICAgICJ6b29tIjogdHJ1
ZQogICAgIH0sCiAKLSAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAgICB2YXIg
c3R5bGUgPSBlbGVtLnN0eWxlLAotICAgIGN1cnJlbnRTdHlsZSA9IGVsZW0uY3VycmVudFN0eWxl
LAotICAgIG9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2YWx1ZSApID8gImFscGhhKG9wYWNp
dHk9IiArIHZhbHVlICogMTAwICsgIikiIDogIiIsCi0gICAgZmlsdGVyID0gY3VycmVudFN0eWxl
ICYmIGN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgc3R5bGUuZmlsdGVyIHx8ICIiOwotCi0gICAgLy8g
SUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0Ci0g
ICAgLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAotICAgIHN0eWxlLnpvb20g
PSAxOwotCi0gICAgLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0
ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgotICAg
IC8vIGlmIHZhbHVlID09PSAiIiwgdGhlbiByZW1vdmUgaW5saW5lIG9wYWNpdHkgIzEyNjg1Ci0g
ICAgaWYgKCAoIHZhbHVlID49IDEgfHwgdmFsdWUgPT09ICIiICkgJiYKLSAgICBqUXVlcnkudHJp
bSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgIiIgKSApID09PSAiIiAmJgotICAgIHN0eWxlLnJl
bW92ZUF0dHJpYnV0ZSApIHsKLQotICAgIC8vIFNldHRpbmcgc3R5bGUuZmlsdGVyIHRvIG51bGws
ICIiICYgIiAiIHN0aWxsIGxlYXZlICJmaWx0ZXI6IiBpbiB0aGUgY3NzVGV4dAotICAgIC8vIGlm
ICJmaWx0ZXI6IiBpcyBwcmVzZW50IGF0IGFsbCwgY2xlYXJUeXBlIGlzIGRpc2FibGVkLCB3ZSB3
YW50IHRvIGF2b2lkIHRoaXMKLSAgICAvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25s
eSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KLSAgICBzdHlsZS5yZW1v
dmVBdHRyaWJ1dGUoICJmaWx0ZXIiICk7Ci0KLSAgICAvLyBpZiB0aGVyZSBpcyBubyBmaWx0ZXIg
c3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlIG9yIHVuc2V0IGlubGluZSBvcGFjaXR5LCB3ZSBh
cmUgZG9uZQotICAgIGlmICggdmFsdWUgPT09ICIiIHx8IGN1cnJlbnRTdHlsZSAmJiAhY3VycmVu
dFN0eWxlLmZpbHRlciApIHsKLSAgICByZXR1cm47Ci0gICAgfQotICAgIH0KLQotICAgIC8vIG90
aGVyd2lzZSwgc2V0IG5ldyBmaWx0ZXIgdmFsdWVzCi0gICAgc3R5bGUuZmlsdGVyID0gcmFscGhh
LnRlc3QoIGZpbHRlciApID8KLSAgICBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBvcGFjaXR5ICkg
OgotICAgIGZpbHRlciArICIgIiArIG9wYWNpdHk7Ci0gICAgfQotICAgIH07Ci19CisgICAgLy8g
QWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQorICAg
IC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWUKKyAgICBjc3NQcm9wczogeworICAgICAg
ICAvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CisgICAgICAgICJmbG9hdCI6ICJjc3NG
bG9hdCIKKyAgICB9LAogCi0vLyBUaGVzZSBob29rcyBjYW5ub3QgYmUgYWRkZWQgdW50aWwgRE9N
IHJlYWR5IGJlY2F1c2UgdGhlIHN1cHBvcnQgdGVzdAotLy8gZm9yIGl0IGlzIG5vdCBydW4gdW50
aWwgYWZ0ZXIgRE9NIHJlYWR5Ci1qUXVlcnkoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAhalF1ZXJ5
LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCApIHsKLSAgICBqUXVlcnkuY3NzSG9va3MubWFy
Z2luUmlnaHQgPSB7Ci0gICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0gICAg
aWYgKCBjb21wdXRlZCApIHsKLSAgICAvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRT
dHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKLSAgICAvLyBXb3JrIGFy
b3VuZCBieSB0ZW1wb3JhcmlseSBzZXR0aW5nIGVsZW1lbnQgZGlzcGxheSB0byBpbmxpbmUtYmxv
Y2sKLSAgICByZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJs
b2NrIiB9LAotICAgIGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmlnaHQiIF0gKTsKLSAgICB9Ci0g
ICAgfQotICAgIH07Ci0gICAgfQorICAgIC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0
eSBvbiBhIERPTSBOb2RlCisgICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwg
ZXh0cmEgKSB7CisgICAgICAgIC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVu
dCBub2RlcworICAgICAgICBpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxl
bS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0
aCB0aGUgcmlnaHQgbmFtZQorICAgICAgICB2YXIgcmV0LCB0eXBlLCBob29rcywKKyAgICAgICAg
ICAgIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorICAgICAgICAgICAgc3R5
bGUgPSBlbGVtLnN0eWxlOworCisgICAgICAgIG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdO
YW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSgg
c3R5bGUsIG9yaWdOYW1lICkgKTsKKworICAgICAgICAvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVm
aXhlZCB2ZXJzaW9uCisgICAgICAgIC8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNp
b24KKyAgICAgICAgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3Nz
SG9va3NbIG9yaWdOYW1lIF07CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBh
IHZhbHVlCisgICAgICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAg
IHR5cGUgPSB0eXBlb2YgdmFsdWU7CisKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgcmVsYXRpdmUg
bnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQorICAg
ICAgICAgICAgaWYgKCB0eXBlID09PSAic3RyaW5nIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2
YWx1ZSApKSApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0
WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CisgICAgICAgICAg
ICAgICAgLy8gRml4ZXMgYnVnICM5MjM3CisgICAgICAgICAgICAgICAgdHlwZSA9ICJudW1iZXIi
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFu
ZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKKyAgICAgICAgICAgIGlmICggdmFs
dWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBhIG51bWJlciB3YXMgcGFzc2Vk
IGluLCBhZGQgJ3B4JyB0byB0aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykK
KyAgICAgICAgICAgIGlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJb
IG9yaWdOYW1lIF0gKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gInB4IjsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gRml4ZXMgIzg5MDgsIGl0IGNhbiBiZSBkb25lIG1vcmUg
Y29ycmVjdGx5IGJ5IHNwZWNpZnlpbmcgc2V0dGVycyBpbiBjc3NIb29rcywKKyAgICAgICAgICAg
IC8vIGJ1dCBpdCB3b3VsZCBtZWFuIHRvIGRlZmluZSBlaWdodCAoZm9yIGV2ZXJ5IHByb2JsZW1h
dGljIHByb3BlcnR5KSBpZGVudGljYWwgZnVuY3Rpb25zCisgICAgICAgICAgICBpZiAoICFzdXBw
b3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gIiIgJiYgbmFtZS5pbmRleE9mKCAiYmFj
a2dyb3VuZCIgKSA9PT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHlsZVsgbmFtZSBdID0gImlu
aGVyaXQiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBhIGhvb2sgd2FzIHBy
b3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQg
dmFsdWUKKyAgICAgICAgICAgIGlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8ICh2
YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7
CisgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQ2hyb21lLCBTYWZhcmkKKyAgICAgICAgICAg
ICAgICAvLyBTZXR0aW5nIHN0eWxlIHRvIGJsYW5rIHN0cmluZyByZXF1aXJlZCB0byBkZWxldGUg
InN0eWxlOiB4ICFpbXBvcnRhbnQ7IgorICAgICAgICAgICAgICAgIHN0eWxlWyBuYW1lIF0gPSAi
IjsKKyAgICAgICAgICAgICAgICBzdHlsZVsgbmFtZSBdID0gdmFsdWU7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGEgaG9vayB3YXMgcHJvdmlk
ZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAgICAgICAgICAgaWYg
KCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxz
ZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPdGhlcndpc2UganVzdCBnZXQgdGhl
IHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAorICAgICAgICAgICAgcmV0dXJuIHN0eWxlWyBu
YW1lIF07CisgICAgICAgIH0KKyAgICB9LAogCi0gICAgLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0Ci0gICAgLy8gZ2V0Q29tcHV0ZWRT
dHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9y
aWdodAotICAgIC8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRo
ZSBvZmZzZXQgbW9kdWxlLCB3ZSBqdXN0IGNoZWNrIGZvciBpdCBoZXJlCi0gICAgaWYgKCAhalF1
ZXJ5LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiAmJiBqUXVlcnkuZm4ucG9zaXRpb24gKSB7Ci0gICAg
alF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKLSAg
ICBqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IHsKLSAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBj
b21wdXRlZCApIHsKLSAgICBpZiAoIGNvbXB1dGVkICkgewotICAgIGNvbXB1dGVkID0gY3VyQ1NT
KCBlbGVtLCBwcm9wICk7Ci0gICAgLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFs
bGJhY2sgdG8gb2Zmc2V0Ci0gICAgcmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID8K
LSAgICBqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyAicHgiIDoKLSAgICBjb21w
dXRlZDsKLSAgICB9Ci0gICAgfQotICAgIH07Ci0gICAgfSk7CisgICAgY3NzOiBmdW5jdGlvbigg
ZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKKyAgICAgICAgdmFyIHZhbCwgbnVtLCBob29r
cywKKyAgICAgICAgICAgIG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOworCisg
ICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFt
ZQorICAgICAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5
LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdO
YW1lICkgKTsKKworICAgICAgICAvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9u
CisgICAgICAgIC8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24KKyAgICAgICAg
aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdO
YW1lIF07CisKKyAgICAgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1
dGVkIHZhbHVlIGZyb20gdGhlcmUKKyAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29r
cyApIHsKKyAgICAgICAgICAgIHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBj
b21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CisgICAgICAgIGlmICggdmFsID09PSB1bmRl
ZmluZWQgKSB7CisgICAgICAgICAgICB2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyAp
OworICAgICAgICB9CisKKyAgICAgICAgLy9jb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1dGVkIHZh
bHVlCisgICAgICAgIGlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRy
YW5zZm9ybSApIHsKKyAgICAgICAgICAgIHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBd
OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBp
ZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJp
YworICAgICAgICBpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKKyAgICAgICAgICAgIG51
bSA9IHBhcnNlRmxvYXQoIHZhbCApOworICAgICAgICAgICAgcmV0dXJuIGV4dHJhID09PSB0cnVl
IHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHZhbDsKICAgICB9Ci0KIH0pOwogCi1pZiAoIGpRdWVyeS5leHByICYm
IGpRdWVyeS5leHByLmZpbHRlcnMgKSB7Ci0gICAgalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4g
PSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMgotICAg
IC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhh
biB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKLSAgICByZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA8PSAw
ICYmIGVsZW0ub2Zmc2V0SGVpZ2h0IDw9IDAgfHwKLSAgICAoIWpRdWVyeS5zdXBwb3J0LnJlbGlh
YmxlSGlkZGVuT2Zmc2V0cyAmJiAoKGVsZW0uc3R5bGUgJiYgZWxlbS5zdHlsZS5kaXNwbGF5KSB8
fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7CitqUXVlcnkuZWFj
aChbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworICAgIGpRdWVy
eS5jc3NIb29rc1sgbmFtZSBdID0geworICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21w
dXRlZCwgZXh0cmEgKSB7CisgICAgICAgICAgICBpZiAoIGNvbXB1dGVkICkgeworICAgICAgICAg
ICAgICAgIC8vIGNlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2Ug
aW52aXNpYmx5IHNob3cgdGhlbQorICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIGl0IG11c3Qg
aGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlz
CisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgcmRpc3Bs
YXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgPworICAgICAgICAg
ICAgICAgICAgICBqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwg
ZXh0cmEgKTsKKyAgICAgICAgICAgICAgICAgICAgfSkgOgorICAgICAgICAgICAgICAgICAgICBn
ZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAgICAgICAgICAgfQorICAg
ICAgICB9LAorCisgICAgICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHsK
KyAgICAgICAgICAgIHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTsKKyAg
ICAgICAgICAgIHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID8K
KyAgICAgICAgICAgICAgICBhdWdtZW50V2lkdGhPckhlaWdodCgKKyAgICAgICAgICAgICAgICAg
ICAgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAg
ZXh0cmEsCisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmci
LCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKKyAgICAgICAgICAgICAgICAgICAg
c3R5bGVzCisgICAgICAgICAgICAgICAgKSA6IDAKKyAgICAgICAgICAgICk7CisgICAgICAgIH0K
ICAgICB9OworfSk7CiAKLSAgICBqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlv
biggZWxlbSApIHsKLSAgICByZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVt
ICk7Ci0gICAgfTsKLX0KKy8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCitqUXVlcnkuY3NzSG9va3Mu
bWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCwK
KyAgICBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAgICAgIGlmICggY29tcHV0ZWQg
KSB7CisgICAgICAgICAgICAvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSBy
ZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKKyAgICAgICAgICAgIC8vIFdvcmsg
YXJvdW5kIGJ5IHRlbXBvcmFyaWx5IHNldHRpbmcgZWxlbWVudCBkaXNwbGF5IHRvIGlubGluZS1i
bG9jaworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7ICJkaXNwbGF5Ijog
ImlubGluZS1ibG9jayIgfSwKKyAgICAgICAgICAgICAgICBjdXJDU1MsIFsgZWxlbSwgIm1hcmdp
blJpZ2h0IiBdICk7CisgICAgICAgIH0KKyAgICB9CispOwogCiAvLyBUaGVzZSBob29rcyBhcmUg
dXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCiBqUXVlcnkuZWFjaCh7CkBAIC03
MjczLDIzMjUgKzYwMDQsMzEwOCBAQCBqUXVlcnkuZWFjaCh7CiAgICAgYm9yZGVyOiAiV2lkdGgi
CiB9LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7CiAgICAgalF1ZXJ5LmNzc0hvb2tzWyBw
cmVmaXggKyBzdWZmaXggXSA9IHsKLSAgICBleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAg
ICB2YXIgaSA9IDAsCi0gICAgZXhwYW5kZWQgPSB7fSwKKyAgICAgICAgZXhwYW5kOiBmdW5jdGlv
biggdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICAgICAgZXhw
YW5kZWQgPSB7fSwKIAotICAgIC8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0
cmluZwotICAgIHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0
KCIgIikgOiBbIHZhbHVlIF07CisgICAgICAgICAgICAgICAgLy8gYXNzdW1lcyBhIHNpbmdsZSBu
dW1iZXIgaWYgbm90IGEgc3RyaW5nCisgICAgICAgICAgICAgICAgcGFydHMgPSB0eXBlb2YgdmFs
dWUgPT09ICJzdHJpbmciID8gdmFsdWUuc3BsaXQoIiAiKSA6IFsgdmFsdWUgXTsKIAotICAgIGZv
ciAoIDsgaSA8IDQ7IGkrKyApIHsKLSAgICBleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBp
IF0gKyBzdWZmaXggXSA9Ci0gICAgcGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0
c1sgMCBdOwotICAgIH0KKyAgICAgICAgICAgIGZvciAoIDsgaSA8IDQ7IGkrKyApIHsKKyAgICAg
ICAgICAgICAgICBleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9
CisgICAgICAgICAgICAgICAgICAgIHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFy
dHNbIDAgXTsKKyAgICAgICAgICAgIH0KIAotICAgIHJldHVybiBleHBhbmRlZDsKLSAgICB9Cisg
ICAgICAgICAgICByZXR1cm4gZXhwYW5kZWQ7CisgICAgICAgIH0KICAgICB9OwogCiAgICAgaWYg
KCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHsKLSAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZp
eCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOworICAgICAgICBqUXVlcnkuY3Nz
SG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwogICAgIH0K
IH0pOwotdmFyIHIyMCA9IC8lMjAvZywKLSAgICByYnJhY2tldCA9IC9cW1xdJC8sCi0gICAgckNS
TEYgPSAvXHI/XG4vZywKLSAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258
aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksCi0gICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxl
Y3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwogCiBqUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBzZXJpYWxp
emU6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXpl
QXJyYXkoKSApOwotICAgIH0sCi0gICAgc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewotICAg
IHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewotICAgIC8vIENhbiBhZGQgcHJvcEhvb2sgZm9y
ICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCi0gICAgdmFyIGVsZW1l
bnRzID0galF1ZXJ5LnByb3AoIHRoaXMsICJlbGVtZW50cyIgKTsKLSAgICByZXR1cm4gZWxlbWVu
dHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpczsKLSAgICB9KQotICAgIC5m
aWx0ZXIoZnVuY3Rpb24oKXsKLSAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKLSAgICAvLyBVc2Ug
LmlzKCI6ZGlzYWJsZWQiKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcwotICAgIHJl
dHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCAiOmRpc2FibGVkIiApICYmCi0g
ICAgcnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVz
LnRlc3QoIHR5cGUgKSAmJgotICAgICggdGhpcy5jaGVja2VkIHx8ICFtYW5pcHVsYXRpb25fcmNo
ZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7Ci0gICAgfSkKLSAgICAubWFwKGZ1bmN0aW9uKCBp
LCBlbGVtICl7Ci0gICAgdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwotCi0gICAgcmV0
dXJuIHZhbCA9PSBudWxsID8KLSAgICBudWxsIDoKLSAgICBqUXVlcnkuaXNBcnJheSggdmFsICkg
PwotICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApewotICAgIHJldHVybiB7IG5h
bWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLSAg
ICB9KSA6Ci0gICAgeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYs
ICJcclxuIiApIH07Ci0gICAgfSkuZ2V0KCk7Ci0gICAgfQotfSk7CisgICAgY3NzOiBmdW5jdGlv
biggbmFtZSwgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9u
KCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBzdHlsZXMsIGxlbiwKKyAg
ICAgICAgICAgICAgICBtYXAgPSB7fSwKKyAgICAgICAgICAgICAgICBpID0gMDsKIAotLy9TZXJp
YWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgotLy9rZXkvdmFsdWVz
IGludG8gYSBxdWVyeSBzdHJpbmcKLWpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRp
b25hbCApIHsKLSAgICB2YXIgcHJlZml4LAotICAgIHMgPSBbXSwKLSAgICBhZGQgPSBmdW5jdGlv
bigga2V5LCB2YWx1ZSApIHsKLSAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2Ug
aXQgYW5kIHJldHVybiBpdHMgdmFsdWUKLSAgICB2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2
YWx1ZSApID8gdmFsdWUoKSA6ICggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKLSAgICBz
WyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVS
SUNvbXBvbmVudCggdmFsdWUgKTsKLSAgICB9OworICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNB
cnJheSggbmFtZSApICkgeworICAgICAgICAgICAgICAgIHN0eWxlcyA9IGdldFN0eWxlcyggZWxl
bSApOworICAgICAgICAgICAgICAgIGxlbiA9IG5hbWUubGVuZ3RoOwogCi0gICAgLy8gU2V0IHRy
YWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KLSAgICBpZiAo
IHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7Ci0gICAgdHJhZGl0aW9uYWwgPSBqUXVlcnku
YWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7Ci0gICAgfQor
ICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICAgICAgICAg
ICAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxz
ZSwgc3R5bGVzICk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgLy8gSWYgYW4gYXJyYXkgd2Fz
IHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4K
LSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5Lmlz
UGxhaW5PYmplY3QoIGEgKSApICkgewotICAgIC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50
cwotICAgIGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKLSAgICBhZGQoIHRoaXMubmFtZSwg
dGhpcy52YWx1ZSApOwotICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAg
ICAgICAgICB9CiAKLSAgICB9IGVsc2UgewotICAgIC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUg
dGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgotICAgIC8vIGRpZCBpdCksIG90
aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LgotICAgIGZvciAoIHByZWZpeCBpbiBh
ICkgewotICAgIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwg
YWRkICk7Ci0gICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPwor
ICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CisgICAg
ICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApOworICAgICAgICB9LCBuYW1lLCB2
YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKyAgICB9LAorICAgIHNob3c6IGZ1bmN0aW9u
KCkgeworICAgICAgICByZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTsKKyAgICB9LAorICAg
IGhpZGU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTsKKyAg
ICB9LAorICAgIHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgeworICAgICAgICBpZiAoIHR5cGVv
ZiBzdGF0ZSA9PT0gImJvb2xlYW4iICkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRlID8gdGhp
cy5zaG93KCkgOiB0aGlzLmhpZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlz
LmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7
CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkuc2hvdygpOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS5oaWRlKCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0pOwogICAgIH0KK30pOwogCi0gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRp
bmcgc2VyaWFsaXphdGlvbgotICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwg
IisiICk7Ci19OwogCi1mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlv
bmFsLCBhZGQgKSB7Ci0gICAgdmFyIG5hbWU7CitmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9u
cywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CisgICAgcmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUu
aW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTsKK30KK2pRdWVyeS5Ud2Vl
biA9IFR3ZWVuOwogCi0gICAgaWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7Ci0gICAgLy8g
U2VyaWFsaXplIGFycmF5IGl0ZW0uCi0gICAgalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGks
IHYgKSB7Ci0gICAgaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSAp
IHsKLSAgICAvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuCi0gICAgYWRkKCBw
cmVmaXgsIHYgKTsKK1R3ZWVuLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogVHdlZW4s
CisgICAgaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1
bml0ICkgeworICAgICAgICB0aGlzLmVsZW0gPSBlbGVtOworICAgICAgICB0aGlzLnByb3AgPSBw
cm9wOworICAgICAgICB0aGlzLmVhc2luZyA9IGVhc2luZyB8fCAic3dpbmciOworICAgICAgICB0
aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0
aGlzLmN1cigpOworICAgICAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICAgICAgdGhpcy51bml0ID0g
dW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOworICAgIH0s
CisgICAgY3VyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhv
b2tzWyB0aGlzLnByb3AgXTsKIAotICAgIH0gZWxzZSB7Ci0gICAgLy8gSXRlbSBpcyBub24tc2Nh
bGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCi0gICAgYnVp
bGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJvYmplY3QiID8gaSA6ICIi
ICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICAgICAgcmV0dXJuIGhvb2tzICYm
IGhvb2tzLmdldCA/CisgICAgICAgICAgICBob29rcy5nZXQoIHRoaXMgKSA6CisgICAgICAgICAg
ICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7CisgICAgfSwKKyAgICBydW46
IGZ1bmN0aW9uKCBwZXJjZW50ICkgeworICAgICAgICB2YXIgZWFzZWQsCisgICAgICAgICAgICBo
b29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07CisKKyAgICAgICAgaWYgKCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24gKSB7CisgICAgICAgICAgICB0aGlzLnBvcyA9IGVhc2VkID0galF1
ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgKKyAgICAgICAgICAgICAgICBwZXJjZW50LCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24K
KyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnBvcyA9
IGVhc2VkID0gcGVyY2VudDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm5vdyA9ICggdGhpcy5l
bmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7CisKKyAgICAgICAgaWYgKCB0
aGlzLm9wdGlvbnMuc3RlcCApIHsKKyAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwLmNhbGwo
IHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgg
aG9va3MgJiYgaG9va3Muc2V0ICkgeworICAgICAgICAgICAgaG9va3Muc2V0KCB0aGlzICk7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0
KCB0aGlzICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQotICAgIH0p
OworfTsKIAotICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2Jq
ICkgPT09ICJvYmplY3QiICkgewotICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KLSAgICBm
b3IgKCBuYW1lIGluIG9iaiApIHsKLSAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFt
ZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKLSAgICB9CitUd2Vlbi5w
cm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CiAKLSAgICB9IGVsc2Ug
ewotICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KLSAgICBhZGQoIHByZWZpeCwgb2JqICk7
CitUd2Vlbi5wcm9wSG9va3MgPSB7CisgICAgX2RlZmF1bHQ6IHsKKyAgICAgICAgZ2V0OiBmdW5j
dGlvbiggdHdlZW4gKSB7CisgICAgICAgICAgICB2YXIgcmVzdWx0OworCisgICAgICAgICAgICBp
ZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAg
KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBu
dWxsKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBd
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwYXNzaW5nIGFuIGVtcHR5IHN0cmlu
ZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgICAg
ICAgIC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0
aGUgcGFyc2UgZmFpbHMKKyAgICAgICAgICAgIC8vIHNvLCBzaW1wbGUgdmFsdWVzIHN1Y2ggYXMg
IjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQuCisgICAgICAgICAgICAvLyBjb21wbGV4IHZhbHVl
cyBzdWNoIGFzICJyb3RhdGUoMXJhZCkiIGFyZSByZXR1cm5lZCBhcyBpcy4KKyAgICAgICAgICAg
IHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsICIiICk7CisgICAg
ICAgICAgICAvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUg
Y29udmVydGVkIHRvIDAuCisgICAgICAgICAgICByZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09
ICJhdXRvIiA/IDAgOiByZXN1bHQ7CisgICAgICAgIH0sCisgICAgICAgIHNldDogZnVuY3Rpb24o
IHR3ZWVuICkgeworICAgICAgICAgICAgLy8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQg
LSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0cworICAgICAgICAg
ICAgLy8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUK
KyAgICAgICAgICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApOworICAgICAg
ICAgICAgfSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVb
IGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9v
a3NbIHR3ZWVuLnByb3AgXSApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggdHdl
ZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0
d2Vlbi5ub3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9Ci19Ci1qUXVlcnkuZWFj
aCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9h
ZCBjbGljayBkYmxjbGljayAiICsKLSAgICAibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1v
dXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCi0gICAgImNoYW5nZSBz
ZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiKS5z
cGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKLQotICAgIC8vIEhhbmRsZSBldmVudCBi
aW5kaW5nCi0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7Ci0g
ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KLSAgICB0aGlzLm9uKCBuYW1lLCBudWxs
LCBkYXRhLCBmbiApIDoKLSAgICB0aGlzLnRyaWdnZXIoIG5hbWUgKTsKLSAgICB9OwotfSk7Ci0K
LWpRdWVyeS5mbi5ob3ZlciA9IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewotICAgIHJldHVy
biB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciAp
OwogfTsKLXZhcgotICAgIC8vIERvY3VtZW50IGxvY2F0aW9uCi0gICAgYWpheExvY1BhcnRzLAot
ICAgIGFqYXhMb2NhdGlvbiwKLSAgICBhamF4X25vbmNlID0galF1ZXJ5Lm5vdygpLAotCi0gICAg
YWpheF9ycXVlcnkgPSAvXD8vLAotICAgIHJoYXNoID0gLyMuKiQvLAotICAgIHJ0cyA9IC8oWz8m
XSlfPVteJl0qLywKLSAgICByaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQv
bWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCi0gICAgLy8gIzc2NTMsICM4
MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uCi0gICAgcmxvY2FsUHJvdG9jb2wg
PSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0
KTokLywKLSAgICBybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKLSAgICBycHJvdG9jb2wg
PSAvXlwvXC8vLAotICAgIHJ1cmwgPSAvXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86
OihcZCspfCl8KS8sCi0KLSAgICAvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9k
Ci0gICAgX2xvYWQgPSBqUXVlcnkuZm4ubG9hZCwKLQotICAgIC8qIFByZWZpbHRlcnMKLSAgICAg
KiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBh
amF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKQotICAgICAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6
Ci0gICAgICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydAotICAgICAqICAgIC0g
QUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vz
c0RhdGEgaXMgdHJ1ZSkKLSAgICAgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCi0gICAgICogNCkg
dGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQKLSAgICAgKiA1KSBleGVjdXRpb24g
d2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3du
IHRvICIqIiBpZiBuZWVkZWQKLSAgICAgKi8KLSAgICBwcmVmaWx0ZXJzID0ge30sCi0KLSAgICAv
KiBUcmFuc3BvcnRzIGJpbmRpbmdzCi0gICAgICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZQotICAg
ICAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCi0gICAgICogMykgc2Vs
ZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8g
IioiIGlmIG5lZWRlZAotICAgICAqLwotICAgIHRyYW5zcG9ydHMgPSB7fSwKLQotICAgIC8vIEF2
b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBs
aW50IGFuZCBldmFkZSBjb21wcmVzc2lvbgotICAgIGFsbFR5cGVzID0gIiovIi5jb25jYXQoIioi
KTsKLQotLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcK
LS8vIGEgZmllbGQgZnJvbSB3aW5kb3cubG9jYXRpb24gaWYgZG9jdW1lbnQuZG9tYWluIGhhcyBi
ZWVuIHNldAotdHJ5IHsKLSAgICBhamF4TG9jYXRpb24gPSBsb2NhdGlvbi5ocmVmOwotfSBjYXRj
aCggZSApIHsKLSAgICAvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAot
ICAgIC8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9uCi0g
ICAgYWpheExvY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7Ci0gICAgYWph
eExvY2F0aW9uLmhyZWYgPSAiIjsKLSAgICBhamF4TG9jYXRpb24gPSBhamF4TG9jYXRpb24uaHJl
ZjsKLX0KLQotLy8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzCi1hamF4TG9jUGFydHMgPSBy
dXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107CiAKLS8vIEJhc2Ug
ImNvbnN0cnVjdG9yIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJh
bnNwb3J0Ci1mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSAp
IHsKKy8vIFN1cHBvcnQ6IElFOQorLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0
aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzCiAKLSAgICAvLyBkYXRhVHlwZUV4cHJlc3Npb24g
aXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgotICAgIHJldHVybiBmdW5jdGlvbiggZGF0
YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgeworVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3
ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0geworICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkg
eworICAgICAgICBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnRO
b2RlICkgeworICAgICAgICAgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93
OworICAgICAgICB9CisgICAgfQorfTsKIAotICAgIGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVz
c2lvbiAhPT0gInN0cmluZyIgKSB7Ci0gICAgZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjsKLSAg
ICBkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CitqUXVlcnkuZWFzaW5nID0geworICAgIGxpbmVh
cjogZnVuY3Rpb24oIHAgKSB7CisgICAgICAgIHJldHVybiBwOworICAgIH0sCisgICAgc3dpbmc6
IGZ1bmN0aW9uKCBwICkgeworICAgICAgICByZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRo
LlBJICkgLyAyOwogICAgIH0KK307CiAKLSAgICB2YXIgZGF0YVR5cGUsCi0gICAgaSA9IDAsCi0g
ICAgZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIGNv
cmVfcm5vdHdoaXRlICkgfHwgW107CitqUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsK
IAotICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKLSAgICAvLyBGb3IgZWFj
aCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCi0gICAgd2hpbGUgKCAoZGF0YVR5
cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7Ci0gICAgLy8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKLSAg
ICBpZiAoIGRhdGFUeXBlWzBdID09PSAiKyIgKSB7Ci0gICAgZGF0YVR5cGUgPSBkYXRhVHlwZS5z
bGljZSggMSApIHx8ICIqIjsKLSAgICAoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJl
WyBkYXRhVHlwZSBdIHx8IFtdKS51bnNoaWZ0KCBmdW5jICk7CisvLyBCYWNrIENvbXBhdCA8MS44
IGV4dGVuc2lvbiBwb2ludAoralF1ZXJ5LmZ4LnN0ZXAgPSB7fTsKIAotICAgIC8vIE90aGVyd2lz
ZSBhcHBlbmQKLSAgICB9IGVsc2UgewotICAgIChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1
Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTsKLSAgICB9Ci0gICAgfQotICAg
IH0KLSAgICB9OwotfQogCi0vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRl
cnMgYW5kIHRyYW5zcG9ydHMKLWZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRz
KCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7CiAKLSAgICB2
YXIgaW5zcGVjdGVkID0ge30sCi0gICAgc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09
PSB0cmFuc3BvcnRzICk7CiAKLSAgICBmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHsKLSAg
ICB2YXIgc2VsZWN0ZWQ7Ci0gICAgaW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTsKLSAgICBq
UXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJl
ZmlsdGVyT3JGYWN0b3J5ICkgewotICAgIHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmls
dGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7Ci0gICAgaWYo
IHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5nIiAmJiAhc2Vla2luZ1RyYW5z
cG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7Ci0gICAgb3B0aW9u
cy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOwotICAgIGluc3BlY3Qo
IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlm
ICggc2Vla2luZ1RyYW5zcG9ydCApIHsKLSAgICByZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlw
ZU9yVHJhbnNwb3J0ICk7Ci0gICAgfQotICAgIH0pOwotICAgIHJldHVybiBzZWxlY3RlZDsKLSAg
ICB9Cit2YXIKKyAgICBmeE5vdywgdGltZXJJZCwKKyAgICByZnh0eXBlcyA9IC9eKD86dG9nZ2xl
fHNob3d8aGlkZSkkLywKKyAgICByZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbKy1dKT18KSgi
ICsgcG51bSArICIpKFthLXolXSopJCIsICJpIiApLAorICAgIHJydW4gPSAvcXVldWVIb29rcyQv
LAorICAgIGFuaW1hdGlvblByZWZpbHRlcnMgPSBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKKyAgICB0
d2VlbmVycyA9IHsKKyAgICAgICAgIioiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKKyAg
ICAgICAgICAgIHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksCisg
ICAgICAgICAgICAgICAgdGFyZ2V0ID0gdHdlZW4uY3VyKCksCisgICAgICAgICAgICAgICAgcGFy
dHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSwKKyAgICAgICAgICAgICAgICB1bml0ID0gcGFydHMg
JiYgcGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiAp
LAorCisgICAgICAgICAgICAgICAgLy8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVx
dWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXMKKyAgICAgICAgICAgICAgICBzdGFy
dCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09ICJweCIgJiYgK3Rhcmdl
dCApICYmCisgICAgICAgICAgICAgICAgICAgIHJmeG51bS5leGVjKCBqUXVlcnkuY3NzKCB0d2Vl
bi5lbGVtLCBwcm9wICkgKSwKKyAgICAgICAgICAgICAgICBzY2FsZSA9IDEsCisgICAgICAgICAg
ICAgICAgbWF4SXRlcmF0aW9ucyA9IDIwOworCisgICAgICAgICAgICBpZiAoIHN0YXJ0ICYmIHN0
YXJ0WyAzIF0gIT09IHVuaXQgKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ1c3QgdW5pdHMgcmVw
b3J0ZWQgYnkgalF1ZXJ5LmNzcworICAgICAgICAgICAgICAgIHVuaXQgPSB1bml0IHx8IHN0YXJ0
WyAzIF07CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2Vl
biBwcm9wZXJ0aWVzIGxhdGVyIG9uCisgICAgICAgICAgICAgICAgcGFydHMgPSBwYXJ0cyB8fCBb
XTsKKworICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBu
b256ZXJvIHN0YXJ0aW5nIHBvaW50CisgICAgICAgICAgICAgICAgc3RhcnQgPSArdGFyZ2V0IHx8
IDE7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHBy
ZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhp
bmcqCisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFj
dG9yIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93
CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gc2NhbGUgfHwgIi41IjsKKworICAgICAgICAg
ICAgICAgICAgICAvLyBBZGp1c3QgYW5kIGFwcGx5CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0
ID0gc3RhcnQgLyBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCB0d2Vl
bi5lbGVtLCBwcm9wLCBzdGFydCArIHVuaXQgKTsKKworICAgICAgICAgICAgICAgIC8vIFVwZGF0
ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpCisgICAgICAg
ICAgICAgICAgLy8gQW5kIGJyZWFraW5nIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBv
ciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2gKKyAgICAgICAgICAgICAgICB9
IHdoaWxlICggc2NhbGUgIT09IChzY2FsZSA9IHR3ZWVuLmN1cigpIC8gdGFyZ2V0KSAmJiBzY2Fs
ZSAhPT0gMSAmJiAtLW1heEl0ZXJhdGlvbnMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gVXBkYXRlIHR3ZWVuIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGlmICggcGFydHMgKSB7
CisgICAgICAgICAgICAgICAgc3RhcnQgPSB0d2Vlbi5zdGFydCA9ICtzdGFydCB8fCArdGFyZ2V0
IHx8IDA7CisgICAgICAgICAgICAgICAgdHdlZW4udW5pdCA9IHVuaXQ7CisgICAgICAgICAgICAg
ICAgLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRp
dmUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgdHdlZW4uZW5kID0gcGFydHNbIDEgXSA/Cisg
ICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgKCBwYXJ0c1sgMSBdICsgMSApICogcGFydHNbIDIg
XSA6CisgICAgICAgICAgICAgICAgICAgICtwYXJ0c1sgMiBdOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICByZXR1cm4gdHdlZW47CisgICAgICAgIH0gXQorICAgIH07CiAKLSAgICByZXR1
cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbICIqIiBd
ICYmIGluc3BlY3QoICIqIiApOworLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkg
d2lsbCBydW4gc3luY2hyb25vdXNseQorZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CisgICAgc2V0
VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgZnhOb3cgPSB1bmRlZmluZWQ7CisgICAgfSk7
CisgICAgcmV0dXJuICggZnhOb3cgPSBqUXVlcnkubm93KCkgKTsKIH0KIAotLy8gQSBzcGVjaWFs
IGV4dGVuZCBmb3IgYWpheCBvcHRpb25zCi0vLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChu
b3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLS8vIEZpeGVzICM5ODg3Ci1mdW5jdGlvbiBhamF4RXh0
ZW5kKCB0YXJnZXQsIHNyYyApIHsKLSAgICB2YXIgZGVlcCwga2V5LAotICAgIGZsYXRPcHRpb25z
ID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKKy8vIEdlbmVyYXRlIHBh
cmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCitmdW5jdGlvbiBnZW5GeCgg
dHlwZSwgaW5jbHVkZVdpZHRoICkgeworICAgIHZhciB3aGljaCwKKyAgICAgICAgaSA9IDAsCisg
ICAgICAgIGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKIAotICAgIGZvciAoIGtleSBpbiBzcmMg
KSB7Ci0gICAgaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgKCBmbGF0T3B0
aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9
IHNyY1sga2V5IF07Ci0gICAgfQorICAgIC8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFs
dWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcywKKyAgICAvLyBpZiB3ZSBkb24ndCBp
bmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0
CisgICAgaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7CisgICAgZm9yICggOyBp
IDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHsKKyAgICAgICAgd2hpY2ggPSBjc3NFeHBh
bmRbIGkgXTsKKyAgICAgICAgYXR0cnNbICJtYXJnaW4iICsgd2hpY2ggXSA9IGF0dHJzWyAicGFk
ZGluZyIgKyB3aGljaCBdID0gdHlwZTsKICAgICB9Ci0gICAgaWYgKCBkZWVwICkgewotICAgIGpR
dWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOworCisgICAgaWYgKCBpbmNsdWRlV2lk
dGggKSB7CisgICAgICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7CiAgICAg
fQogCi0gICAgcmV0dXJuIHRhcmdldDsKKyAgICByZXR1cm4gYXR0cnM7CiB9CiAKLWpRdWVyeS5m
bi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKLSAgICBpZiAoIHR5
cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgewotICAgIHJldHVybiBfbG9hZC5hcHBs
eSggdGhpcywgYXJndW1lbnRzICk7Ci0gICAgfQotCi0gICAgdmFyIHNlbGVjdG9yLCByZXNwb25z
ZSwgdHlwZSwKLSAgICBzZWxmID0gdGhpcywKLSAgICBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwor
ZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7CisgICAgdmFy
IHR3ZWVuLAorICAgICAgICBjb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICku
Y29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKKyAgICAgICAgaW5kZXggPSAwLAorICAgICAgICBs
ZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKKyAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBp
bmRleCsrICkgeworICAgICAgICBpZiAoICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2Fs
bCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApKSApIHsKIAotICAgIGlmICggb2ZmID49IDAgKSB7
Ci0gICAgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwotICAgIHVybCA9
IHVybC5zbGljZSggMCwgb2ZmICk7CisgICAgICAgICAgICAvLyB3ZSdyZSBkb25lIHdpdGggdGhp
cyBwcm9wZXJ0eQorICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOworICAgICAgICB9CiAgICAgfQor
fQogCi0gICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uCi0gICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlv
biggcGFyYW1zICkgKSB7CitmdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywg
b3B0cyApIHsKKyAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCisgICAgdmFyIHByb3As
IHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwKKyAgICAgICAg
YW5pbSA9IHRoaXMsCisgICAgICAgIG9yaWcgPSB7fSwKKyAgICAgICAgc3R5bGUgPSBlbGVtLnN0
eWxlLAorICAgICAgICBoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICks
CisgICAgICAgIGRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKIAot
ICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCi0gICAgY2FsbGJhY2sgPSBw
YXJhbXM7Ci0gICAgcGFyYW1zID0gdW5kZWZpbmVkOworICAgIC8vIGhhbmRsZSBxdWV1ZTogZmFs
c2UgcHJvbWlzZXMKKyAgICBpZiAoICFvcHRzLnF1ZXVlICkgeworICAgICAgICBob29rcyA9IGpR
dWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOworICAgICAgICBpZiAoIGhvb2tzLnVucXVl
dWVkID09IG51bGwgKSB7CisgICAgICAgICAgICBob29rcy51bnF1ZXVlZCA9IDA7CisgICAgICAg
ICAgICBvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKKyAgICAgICAgICAgIGhvb2tzLmVtcHR5
LmZpcmUgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoICFob29rcy51bnF1ZXVl
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkZmlyZSgpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgaG9va3MudW5xdWV1ZWQrKzsKKwor
ICAgICAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIC8vIGRvaW5nIHRo
aXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCisg
ICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyBjb21wbGV0ZXMKKyAgICAgICAgICAgIGFuaW0uYWx3
YXlzKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGhvb2tzLnVucXVldWVkLS07CisgICAg
ICAgICAgICAgICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgewor
ICAgICAgICAgICAgICAgICAgICBob29rcy5lbXB0eS5maXJlKCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgIH0KIAotICAgIC8vIE90aGVyd2lz
ZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKLSAgICB9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9m
IHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7Ci0gICAgdHlwZSA9ICJQT1NUIjsKKyAgICAvLyBoZWln
aHQvd2lkdGggb3ZlcmZsb3cgcGFzcworICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAo
ICJoZWlnaHQiIGluIHByb3BzIHx8ICJ3aWR0aCIgaW4gcHJvcHMgKSApIHsKKyAgICAgICAgLy8g
TWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisgICAgICAgIC8vIFJlY29yZCBhbGwg
MyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUU5LTEwIGRvIG5vdAorICAgICAgICAvLyBj
aGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKKyAgICAgICAg
Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUKKyAgICAgICAgb3B0cy5vdmVy
ZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZ
IF07CisKKyAgICAgICAgLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZv
ciBoZWlnaHQvd2lkdGgKKyAgICAgICAgLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMg
dGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZAorICAgICAgICBkaXNwbGF5ID0g
alF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CisgICAgICAgIC8vIEdldCBkZWZhdWx0IGRp
c3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgIm5vbmUiCisgICAgICAgIGlmICggZGlzcGxh
eSA9PT0gIm5vbmUiICkgeworICAgICAgICAgICAgZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCBl
bGVtLm5vZGVOYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBkaXNwbGF5ID09PSAiaW5s
aW5lIiAmJgorICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0g
Im5vbmUiICkgeworCisgICAgICAgICAgICBzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7
CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlm
eSwgbWFrZSB0aGUgcmVxdWVzdAotICAgIGlmICggc2VsZi5sZW5ndGggPiAwICkgewotICAgIGpR
dWVyeS5hamF4KHsKLSAgICB1cmw6IHVybCwKKyAgICBpZiAoIG9wdHMub3ZlcmZsb3cgKSB7Cisg
ICAgICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisgICAgICAgIGFuaW0uYWx3YXlzKGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAw
IF07CisgICAgICAgICAgICBzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07Cisg
ICAgICAgICAgICBzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CisgICAgICAg
IH0pOworICAgIH0KIAotICAgIC8vIGlmICJ0eXBlIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRo
ZW4gIkdFVCIgbWV0aG9kIHdpbGwgYmUgdXNlZAotICAgIHR5cGU6IHR5cGUsCi0gICAgZGF0YVR5
cGU6ICJodG1sIiwKLSAgICBkYXRhOiBwYXJhbXMKLSAgICB9KS5kb25lKGZ1bmN0aW9uKCByZXNw
b25zZVRleHQgKSB7CisgICAgLy8gc2hvdy9oaWRlIHBhc3MKKyAgICBmb3IgKCBwcm9wIGluIHBy
b3BzICkgeworICAgICAgICB2YWx1ZSA9IHByb3BzWyBwcm9wIF07CisgICAgICAgIGlmICggcmZ4
dHlwZXMuZXhlYyggdmFsdWUgKSApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgcHJvcCBd
OworICAgICAgICAgICAgdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKKyAg
ICAgICAgICAgIGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ciICkgKSB7
CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJv
bSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRo
IHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgorICAgICAgICAgICAgICAgIGlm
ICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1
bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3JpZ1sgcHJvcCBdID0gZGF0
YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmln
ICkgKSB7CisgICAgICAgIGlmICggZGF0YVNob3cgKSB7CisgICAgICAgICAgICBpZiAoICJoaWRk
ZW4iIGluIGRhdGFTaG93ICkgeworICAgICAgICAgICAgICAgIGhpZGRlbiA9IGRhdGFTaG93Lmhp
ZGRlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFT
aG93ID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHt9ICk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgp
LnRvZ2dsZSgpIHRvICJyZXZlcnNlIgorICAgICAgICBpZiAoIHRvZ2dsZSApIHsKKyAgICAgICAg
ICAgIGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBo
aWRkZW4gKSB7CisgICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5zaG93KCk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBhbmltLmRvbmUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAg
ICAgalF1ZXJ5KCBlbGVtICkuaGlkZSgpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAg
ICAgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIHByb3A7CisKKyAg
ICAgICAgICAgIGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CisgICAgICAgICAg
ICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCBl
bGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7Cisg
ICAgICAgIGZvciAoIHByb3AgaW4gb3JpZyApIHsKKyAgICAgICAgICAgIHR3ZWVuID0gY3JlYXRl
VHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CisKKyAg
ICAgICAgICAgIGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkgeworICAgICAgICAgICAgICAg
IGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKKyAgICAgICAgICAgICAgICBpZiAoIGhp
ZGRlbiApIHsKKyAgICAgICAgICAgICAgICAgICAgdHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7Cisg
ICAgICAgICAgICAgICAgICAgIHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9w
ID09PSAiaGVpZ2h0IiA/IDEgOiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KK30KIAotICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBj
b21wbGV0ZSBjYWxsYmFjawotICAgIHJlc3BvbnNlID0gYXJndW1lbnRzOworZnVuY3Rpb24gcHJv
cEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7CisgICAgdmFyIGluZGV4LCBuYW1lLCBl
YXNpbmcsIHZhbHVlLCBob29rczsKIAotICAgIHNlbGYuaHRtbCggc2VsZWN0b3IgPworICAgIC8v
IGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzcworICAgIGZv
ciAoIGluZGV4IGluIHByb3BzICkgeworICAgICAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSgg
aW5kZXggKTsKKyAgICAgICAgZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOworICAgICAg
ICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOworICAgICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2
YWx1ZSApICkgeworICAgICAgICAgICAgZWFzaW5nID0gdmFsdWVbIDEgXTsKKyAgICAgICAgICAg
IHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICAgICAgICAgIHByb3BzWyBuYW1lIF0gPSB2
YWx1ZTsKKyAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgaW5kZXggXTsKKyAgICAgICAgfQorCisg
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CisgICAgICAgIGlmICggaG9v
a3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4
cGFuZCggdmFsdWUgKTsKKyAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgbmFtZSBdOworCisgICAg
ICAgICAgICAvLyBub3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29udCBvdmVyd3JpdGUga2V5cyBh
bHJlYWR5IHByZXNlbnQuCisgICAgICAgICAgICAvLyBhbHNvIC0gcmV1c2luZyAnaW5kZXgnIGZy
b20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgorICAgICAgICAgICAg
Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBp
biBwcm9wcyApICkgeworICAgICAgICAgICAgICAgICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVl
WyBpbmRleCBdOworICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0g
ZWFzaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICAgICAg
fQorICAgIH0KK30KIAotICAgIC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRl
IHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdgotICAgIC8vIEV4Y2x1ZGUgc2NyaXB0
cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwotICAgIGpRdWVyeSgiPGRp
dj4iKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2Vs
ZWN0b3IgKSA6CitmdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMg
KSB7CisgICAgdmFyIHJlc3VsdCwKKyAgICAgICAgc3RvcHBlZCwKKyAgICAgICAgaW5kZXggPSAw
LAorICAgICAgICBsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCwKKyAgICAgICAg
ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgeworICAgICAg
ICAgICAgLy8gZG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yCisgICAg
ICAgICAgICBkZWxldGUgdGljay5lbGVtOworICAgICAgICB9KSwKKyAgICAgICAgdGljayA9IGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCBzdG9wcGVkICkgeworICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBjdXJyZW50VGlt
ZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0g
TWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBj
dXJyZW50VGltZSApLAorICAgICAgICAgICAgICAgIC8vIGFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0
IGFsbG93IHVzIHRvIHVzZSAxIC0gKCAwLjUgfHwgMCApICgjMTI0OTcpCisgICAgICAgICAgICAg
ICAgdGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAorICAgICAgICAg
ICAgICAgIHBlcmNlbnQgPSAxIC0gdGVtcCwKKyAgICAgICAgICAgICAgICBpbmRleCA9IDAsCisg
ICAgICAgICAgICAgICAgbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7CisKKyAgICAg
ICAgICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgICAgICAgICAg
ICAgIGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9u
LCBwZXJjZW50LCByZW1haW5pbmcgXSk7CisKKyAgICAgICAgICAgIGlmICggcGVyY2VudCA8IDEg
JiYgbGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVt
LCBbIGFuaW1hdGlvbiBdICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgfQorICAgICAgICB9LAorICAgICAgICBhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNl
KHsKKyAgICAgICAgICAgIGVsZW06IGVsZW0sCisgICAgICAgICAgICBwcm9wczogalF1ZXJ5LmV4
dGVuZCgge30sIHByb3BlcnRpZXMgKSwKKyAgICAgICAgICAgIG9wdHM6IGpRdWVyeS5leHRlbmQo
IHRydWUsIHsgc3BlY2lhbEVhc2luZzoge30gfSwgb3B0aW9ucyApLAorICAgICAgICAgICAgb3Jp
Z2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgb3JpZ2luYWxPcHRpb25z
OiBvcHRpb25zLAorICAgICAgICAgICAgc3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygp
LAorICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCisgICAgICAgICAgICB0
d2VlbnM6IFtdLAorICAgICAgICAgICAgY3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQg
KSB7CisgICAgICAgICAgICAgICAgdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmlt
YXRpb24ub3B0cywgcHJvcCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9u
Lm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApOwor
ICAgICAgICAgICAgICAgIGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdHdlZW47CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc3RvcDog
ZnVuY3Rpb24oIGdvdG9FbmQgKSB7CisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMCwKKyAg
ICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQg
dG8gcnVuIGFsbCB0aGUgdHdlZW5zCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3
ZSBza2lwIHRoaXMgcGFydAorICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBnb3RvRW5kID8g
YW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwOworICAgICAgICAgICAgICAgIGlmICggc3RvcHBl
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAo
IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgICAgICAgICAgICAgICAgICBhbmlt
YXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIC8vIHJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKKyAg
ICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJlamVjdAorICAgICAgICAgICAgICAgIGlmICgg
Z290b0VuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVs
ZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlv
biwgZ290b0VuZCBdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9KSwKKyAgICAgICAgcHJvcHMgPSBhbmlt
YXRpb24ucHJvcHM7CiAKLSAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdAotICAg
IHJlc3BvbnNlVGV4dCApOworICAgIHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5z
cGVjaWFsRWFzaW5nICk7CiAKLSAgICB9KS5jb21wbGV0ZSggY2FsbGJhY2sgJiYgZnVuY3Rpb24o
IGpxWEhSLCBzdGF0dXMgKSB7Ci0gICAgc2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwg
WyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwotICAgIH0pOworICAgIGZv
ciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgICAgICByZXN1bHQgPSBhbmlt
YXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFu
aW1hdGlvbi5vcHRzICk7CisgICAgICAgIGlmICggcmVzdWx0ICkgeworICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB0aGlzOwotfTsKLQot
Ly8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBl
dmVudHMKLWpRdWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWpheFN0b3AiLCAiYWpheENvbXBs
ZXRlIiwgImFqYXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4U2VuZCIgXSwgZnVuY3Rpb24o
IGksIHR5cGUgKXsKLSAgICBqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApewotICAg
IHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApOwotICAgIH07Ci19KTsKKyAgICBqUXVlcnkubWFw
KCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApOwogCi1qUXVlcnkuZWFjaCggWyAiZ2V0
IiwgInBvc3QiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7Ci0gICAgalF1ZXJ5WyBtZXRob2Qg
XSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgewotICAgIC8vIHNoaWZ0
IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCi0gICAgaWYgKCBqUXVlcnku
aXNGdW5jdGlvbiggZGF0YSApICkgewotICAgIHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOwotICAg
IGNhbGxiYWNrID0gZGF0YTsKLSAgICBkYXRhID0gdW5kZWZpbmVkOworICAgIGlmICggalF1ZXJ5
LmlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7CisgICAgICAgIGFuaW1hdGlv
bi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwogICAgIH0KIAotICAgIHJldHVy
biBqUXVlcnkuYWpheCh7Ci0gICAgdXJsOiB1cmwsCi0gICAgdHlwZTogbWV0aG9kLAotICAgIGRh
dGFUeXBlOiB0eXBlLAotICAgIGRhdGE6IGRhdGEsCi0gICAgc3VjY2VzczogY2FsbGJhY2sKLSAg
ICB9KTsKLSAgICB9OwotfSk7CisgICAgalF1ZXJ5LmZ4LnRpbWVyKAorICAgICAgICBqUXVlcnku
ZXh0ZW5kKCB0aWNrLCB7CisgICAgICAgICAgICBlbGVtOiBlbGVtLAorICAgICAgICAgICAgYW5p
bTogYW5pbWF0aW9uLAorICAgICAgICAgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisg
ICAgICAgIH0pCisgICAgKTsKIAotalF1ZXJ5LmV4dGVuZCh7CisgICAgLy8gYXR0YWNoIGNhbGxi
YWNrcyBmcm9tIG9wdGlvbnMKKyAgICByZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRp
b24ub3B0cy5wcm9ncmVzcyApCisgICAgICAgIC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBh
bmltYXRpb24ub3B0cy5jb21wbGV0ZSApCisgICAgICAgIC5mYWlsKCBhbmltYXRpb24ub3B0cy5m
YWlsICkKKyAgICAgICAgLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cit9CiAKLSAg
ICAvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKLSAg
ICBhY3RpdmU6IDAsCitqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9u
LCB7CiAKLSAgICAvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0
Ci0gICAgbGFzdE1vZGlmaWVkOiB7fSwKLSAgICBldGFnOiB7fSwKKyAgICB0d2VlbmVyOiBmdW5j
dGlvbiggcHJvcHMsIGNhbGxiYWNrICkgeworICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9u
KCBwcm9wcyApICkgeworICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICAgICAgICAg
IHByb3BzID0gWyAiKiIgXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BzID0g
cHJvcHMuc3BsaXQoIiAiKTsKKyAgICAgICAgfQogCi0gICAgYWpheFNldHRpbmdzOiB7Ci0gICAg
dXJsOiBhamF4TG9jYXRpb24sCi0gICAgdHlwZTogIkdFVCIsCi0gICAgaXNMb2NhbDogcmxvY2Fs
UHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRzWyAxIF0gKSwKLSAgICBnbG9iYWw6IHRydWUsCi0g
ICAgcHJvY2Vzc0RhdGE6IHRydWUsCi0gICAgYXN5bmM6IHRydWUsCi0gICAgY29udGVudFR5cGU6
ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAotICAg
IC8qCi0gICAgdGltZW91dDogMCwKLSAgICBkYXRhOiBudWxsLAotICAgIGRhdGFUeXBlOiBudWxs
LAotICAgIHVzZXJuYW1lOiBudWxsLAotICAgIHBhc3N3b3JkOiBudWxsLAotICAgIGNhY2hlOiBu
dWxsLAotICAgIHRocm93czogZmFsc2UsCi0gICAgdHJhZGl0aW9uYWw6IGZhbHNlLAotICAgIGhl
YWRlcnM6IHt9LAotICAgICovCisgICAgICAgIHZhciBwcm9wLAorICAgICAgICAgICAgaW5kZXgg
PSAwLAorICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwogCi0gICAgYWNjZXB0czog
ewotICAgICIqIjogYWxsVHlwZXMsCi0gICAgdGV4dDogInRleHQvcGxhaW4iLAotICAgIGh0bWw6
ICJ0ZXh0L2h0bWwiLAotICAgIHhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAotICAg
IGpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCisgICAgICAgIGZvciAo
IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworICAgICAgICAgICAgcHJvcCA9IHByb3Bz
WyBpbmRleCBdOworICAgICAgICAgICAgdHdlZW5lcnNbIHByb3AgXSA9IHR3ZWVuZXJzWyBwcm9w
IF0gfHwgW107CisgICAgICAgICAgICB0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNr
ICk7CisgICAgICAgIH0KICAgICB9LAogCi0gICAgY29udGVudHM6IHsKLSAgICB4bWw6IC94bWwv
LAotICAgIGh0bWw6IC9odG1sLywKLSAgICBqc29uOiAvanNvbi8KLSAgICB9LAorICAgIHByZWZp
bHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkgeworICAgICAgICBpZiAoIHByZXBl
bmQgKSB7CisgICAgICAgICAgICBhbmltYXRpb25QcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNr
ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbmltYXRpb25QcmVmaWx0ZXJzLnB1
c2goIGNhbGxiYWNrICk7CisgICAgICAgIH0KKyAgICB9Cit9KTsKIAotICAgIHJlc3BvbnNlRmll
bGRzOiB7Ci0gICAgeG1sOiAicmVzcG9uc2VYTUwiLAotICAgIHRleHQ6ICJyZXNwb25zZVRleHQi
Ci0gICAgfSwKK2pRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsK
KyAgICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVy
eS5leHRlbmQoIHt9LCBzcGVlZCApIDogeworICAgICAgICBjb21wbGV0ZTogZm4gfHwgIWZuICYm
IGVhc2luZyB8fAorICAgICAgICAgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3Bl
ZWQsCisgICAgICAgIGR1cmF0aW9uOiBzcGVlZCwKKyAgICAgICAgZWFzaW5nOiBmbiAmJiBlYXNp
bmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCisg
ICAgfTsKIAotICAgIC8vIERhdGEgY29udmVydGVycwotICAgIC8vIEtleXMgc2VwYXJhdGUgc291
cmNlIChvciBjYXRjaGFsbCAiKiIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xl
IHNwYWNlCi0gICAgY29udmVydGVyczogeworICAgIG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5v
ZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24g
OgorICAgICAgICBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5z
cGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKIAotICAg
IC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAotICAgICIqIHRleHQiOiB3aW5kb3cuU3RyaW5n
LAorICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJm
eCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsK
KyAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsKKyAgICB9CiAKLSAgICAvLyBUZXh0IHRvIGh0bWwg
KHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKLSAgICAidGV4dCBodG1sIjogdHJ1ZSwKKyAgICAv
LyBRdWV1ZWluZworICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7CiAKLSAgICAvLyBFdmFsdWF0
ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCi0gICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJz
ZUpTT04sCisgICAgb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggalF1
ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHsKKyAgICAgICAgICAgIG9wdC5vbGQuY2FsbCgg
dGhpcyApOworICAgICAgICB9CiAKLSAgICAvLyBQYXJzZSB0ZXh0IGFzIHhtbAotICAgICJ0ZXh0
IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAotICAgIH0sCisgICAgICAgIGlmICggb3B0LnF1ZXVlICkg
eworICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApOworICAgICAg
ICB9CisgICAgfTsKIAotICAgIC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAg
ZXh0ZW5kZWQ6Ci0gICAgLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVy
ZSBpZgotICAgIC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCi0g
ICAgLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCi0gICAgZmxhdE9wdGlvbnM6IHsK
LSAgICB1cmw6IHRydWUsCi0gICAgY29udGV4dDogdHJ1ZQotICAgIH0KLSAgICB9LAorICAgIHJl
dHVybiBvcHQ7Cit9OwogCi0gICAgLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBv
YmplY3QgaW50byB0YXJnZXQKLSAgICAvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0
aW5ncyBmaWVsZHMuCi0gICAgLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFq
YXhTZXR0aW5ncy4KLSAgICBhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkg
ewotICAgIHJldHVybiBzZXR0aW5ncyA/CitqUXVlcnkuZm4uZXh0ZW5kKHsKKyAgICBmYWRlVG86
IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7CiAKLSAgICAvLyBCdWls
ZGluZyBhIHNldHRpbmdzIG9iamVjdAotICAgIGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdl
dCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKKyAgICAgICAgLy8gc2hvdyBh
bnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwCisgICAgICAgIHJl
dHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoICJvcGFjaXR5IiwgMCApLnNob3coKQog
Ci0gICAgLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncwotICAgIGFqYXhFeHRlbmQoIGpRdWVyeS5h
amF4U2V0dGluZ3MsIHRhcmdldCApOworICAgICAgICAgICAgLy8gYW5pbWF0ZSB0byB0aGUgdmFs
dWUgc3BlY2lmaWVkCisgICAgICAgICAgICAuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0s
IHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CiAgICAgfSwKLQotICAgIGFqYXhQcmVmaWx0ZXI6
IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAotICAgIGFqYXhUcmFu
c3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAotCi0gICAg
Ly8gTWFpbiBtZXRob2QKLSAgICBhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgewotCi0g
ICAgLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKLSAg
ICBpZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgewotICAgIG9wdGlvbnMgPSB1cmw7Ci0g
ICAgdXJsID0gdW5kZWZpbmVkOwotICAgIH0KLQotICAgIC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUg
YW4gb2JqZWN0Ci0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICB2YXIgLy8gQ3Jv
c3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCi0gICAgcGFydHMsCi0gICAgLy8gTG9vcCB2YXJpYWJs
ZQotICAgIGksCi0gICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQotICAgIGNhY2hl
VVJMLAotICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3RyaW5nCi0gICAgcmVzcG9uc2VIZWFk
ZXJzU3RyaW5nLAotICAgIC8vIHRpbWVvdXQgaGFuZGxlCi0gICAgdGltZW91dFRpbWVyLAotCi0g
ICAgLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCi0gICAg
ZmlyZUdsb2JhbHMsCi0KLSAgICB0cmFuc3BvcnQsCi0gICAgLy8gUmVzcG9uc2UgaGVhZGVycwot
ICAgIHJlc3BvbnNlSGVhZGVycywKLSAgICAvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2Jq
ZWN0Ci0gICAgcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCi0gICAgLy8gQ2Fs
bGJhY2tzIGNvbnRleHQKLSAgICBjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcywKLSAg
ICAvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBp
cyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCi0gICAgZ2xvYmFsRXZlbnRDb250ZXh0
ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29u
dGV4dC5qcXVlcnkgKSA/Ci0gICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6Ci0gICAgalF1
ZXJ5LmV2ZW50LAotICAgIC8vIERlZmVycmVkcwotICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVy
cmVkKCksCi0gICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVt
b3J5IiksCi0gICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKLSAgICBzdGF0dXNDb2Rl
ID0gcy5zdGF0dXNDb2RlIHx8IHt9LAotICAgIC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxs
IGF0IG9uY2UpCi0gICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKLSAgICByZXF1ZXN0SGVhZGVyc05h
bWVzID0ge30sCi0gICAgLy8gVGhlIGpxWEhSIHN0YXRlCi0gICAgc3RhdGUgPSAwLAotICAgIC8v
IERlZmF1bHQgYWJvcnQgbWVzc2FnZQotICAgIHN0ckFib3J0ID0gImNhbmNlbGVkIiwKLSAgICAv
LyBGYWtlIHhocgotICAgIGpxWEhSID0gewotICAgIHJlYWR5U3RhdGU6IDAsCi0KLSAgICAvLyBC
dWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCi0gICAgZ2V0UmVzcG9uc2VIZWFkZXI6
IGZ1bmN0aW9uKCBrZXkgKSB7Ci0gICAgdmFyIG1hdGNoOwotICAgIGlmICggc3RhdGUgPT09IDIg
KSB7Ci0gICAgaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgewotICAgIHJlc3BvbnNlSGVhZGVycyA9
IHt9OwotICAgIHdoaWxlICggKG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJz
U3RyaW5nICkpICkgewotICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2Uo
KSBdID0gbWF0Y2hbIDIgXTsKLSAgICB9Ci0gICAgfQotICAgIG1hdGNoID0gcmVzcG9uc2VIZWFk
ZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2ggPT0gbnVs
bCA/IG51bGwgOiBtYXRjaDsKLSAgICB9LAotCi0gICAgLy8gUmF3IHN0cmluZwotICAgIGdldEFs
bFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHN0YXRlID09PSAyID8g
cmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKLSAgICB9LAotCi0gICAgLy8gQ2FjaGVzIHRo
ZSBoZWFkZXIKLSAgICBzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7
Ci0gICAgdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIGlmICggIXN0YXRlICkg
ewotICAgIG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRl
cnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOwotICAgIHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2
YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7CisgICAgYW5pbWF0ZTogZnVuY3Rpb24oIHBy
b3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgeworICAgICAgICB2YXIgZW1wdHkgPSBqUXVl
cnkuaXNFbXB0eU9iamVjdCggcHJvcCApLAorICAgICAgICAgICAgb3B0YWxsID0galF1ZXJ5LnNw
ZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAorICAgICAgICAgICAgZG9BbmltYXRpb24g
PSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBw
cm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdAorICAgICAgICAgICAgICAg
IHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBv
cHRhbGwgKTsKKworICAgICAgICAgICAgICAgIC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlz
aGluZyByZXNvbHZlcyBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgIGlmICggZW1wdHkgfHwg
ZGF0YV9wcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAg
YW5pbS5zdG9wKCB0cnVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAg
ICAgICAgICAgIGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uOworCisgICAgICAgIHJl
dHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KKyAgICAgICAgICAgIHRoaXMu
ZWFjaCggZG9BbmltYXRpb24gKSA6CisgICAgICAgICAgICB0aGlzLnF1ZXVlKCBvcHRhbGwucXVl
dWUsIGRvQW5pbWF0aW9uICk7CiAgICAgfSwKLQotICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBj
b250ZW50LXR5cGUgaGVhZGVyCi0gICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUg
KSB7Ci0gICAgaWYgKCAhc3RhdGUgKSB7Ci0gICAgcy5taW1lVHlwZSA9IHR5cGU7Ci0gICAgfQot
ICAgIHJldHVybiB0aGlzOworICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBn
b3RvRW5kICkgeworICAgICAgICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgewor
ICAgICAgICAgICAgdmFyIHN0b3AgPSBob29rcy5zdG9wOworICAgICAgICAgICAgZGVsZXRlIGhv
b2tzLnN0b3A7CisgICAgICAgICAgICBzdG9wKCBnb3RvRW5kICk7CisgICAgICAgIH07CisKKyAg
ICAgICAgaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBnb3Rv
RW5kID0gY2xlYXJRdWV1ZTsKKyAgICAgICAgICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgICAg
ICAgICAgdHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNsZWFyUXVl
dWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8
ICJmeCIsIFtdICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCkgeworICAgICAgICAgICAgdmFyIGRlcXVldWUgPSB0cnVlLAorICAgICAgICAgICAgICAg
IGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsCisgICAgICAgICAg
ICAgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0
YV9wcml2LmdldCggdGhpcyApOworCisgICAgICAgICAgICBpZiAoIGluZGV4ICkgeworICAgICAg
ICAgICAgICAgIGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICggaW5k
ZXggaW4gZGF0YSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhWyBpbmRleCBdICYm
IGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKyAgICAgICAgICAgICAg
ICBpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwg
dGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsKKyAgICAgICAgICAgICAgICAgICAg
dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApOworICAgICAgICAgICAgICAgICAg
ICBkZXF1ZXVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGlu
ZGV4LCAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3Qg
Zm9yY2VkCisgICAgICAgICAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBj
b21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQorICAgICAgICAgICAgLy8gYnV0
IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQKKyAgICAgICAgICAgIGlmICggZGVxdWV1ZSB8fCAh
Z290b0VuZCApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSAp
OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9LAotCi0gICAgLy8gU3RhdHVzLWRl
cGVuZGVudCBjYWxsYmFja3MKLSAgICBzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewotICAg
IHZhciBjb2RlOwotICAgIGlmICggbWFwICkgewotICAgIGlmICggc3RhdGUgPCAyICkgewotICAg
IGZvciAoIGNvZGUgaW4gbWFwICkgewotICAgIC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sg
aW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXMKLSAgICBzdGF0dXNDb2RlWyBjb2RlIF0g
PSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKLSAgICB9Ci0gICAgfSBlbHNl
IHsKLSAgICAvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKLSAgICBqcVhIUi5h
bHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTsKLSAgICB9CisgICAgZmluaXNoOiBmdW5jdGlv
biggdHlwZSApIHsKKyAgICAgICAgaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKKyAgICAgICAgICAg
IHR5cGUgPSB0eXBlIHx8ICJmeCI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZWFj
aChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBpbmRleCwKKyAgICAgICAgICAgICAgICBk
YXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApLAorICAgICAgICAgICAgICAgIHF1ZXVlID0gZGF0
YVsgdHlwZSArICJxdWV1ZSIgXSwKKyAgICAgICAgICAgICAgICBob29rcyA9IGRhdGFbIHR5cGUg
KyAicXVldWVIb29rcyIgXSwKKyAgICAgICAgICAgICAgICB0aW1lcnMgPSBqUXVlcnkudGltZXJz
LAorICAgICAgICAgICAgICAgIGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKKwor
ICAgICAgICAgICAgLy8gZW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YQorICAg
ICAgICAgICAgZGF0YS5maW5pc2ggPSB0cnVlOworCisgICAgICAgICAgICAvLyBlbXB0eSB0aGUg
cXVldWUgZmlyc3QKKyAgICAgICAgICAgIGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsK
KworICAgICAgICAgICAgaWYgKCBob29rcyAmJiBob29rcy5zdG9wICkgeworICAgICAgICAgICAg
ICAgIGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBsb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhl
bQorICAgICAgICAgICAgZm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsK
KyAgICAgICAgICAgICAgICBpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRp
bWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGlt
ZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOworICAgICAgICAgICAgICAgICAgICB0aW1l
cnMuc3BsaWNlKCBpbmRleCwgMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgLy8gbG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1
ZSBhbmQgZmluaXNoIHRoZW0KKyAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBs
ZW5ndGg7IGluZGV4KysgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBxdWV1ZVsgaW5kZXggXSAm
JiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlWyBp
bmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyB0dXJuIG9mZiBmaW5pc2hpbmcgZmxhZworICAgICAgICAg
ICAgZGVsZXRlIGRhdGEuZmluaXNoOworICAgICAgICB9KTsKICAgICB9Ci0gICAgcmV0dXJuIHRo
aXM7Ci0gICAgfSwKK30pOwogCi0gICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0Ci0gICAgYWJvcnQ6
IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgewotICAgIHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0
IHx8IHN0ckFib3J0OwotICAgIGlmICggdHJhbnNwb3J0ICkgewotICAgIHRyYW5zcG9ydC5hYm9y
dCggZmluYWxUZXh0ICk7Ci0gICAgfQotICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOwotICAgIHJl
dHVybiB0aGlzOwotICAgIH0KK2pRdWVyeS5lYWNoKFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUi
IF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworICAgIHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFt
ZSBdOworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNh
bGxiYWNrICkgeworICAgICAgICByZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQg
PT09ICJib29sZWFuIiA/CisgICAgICAgICAgICBjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRz
ICkgOgorICAgICAgICAgICAgdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVl
ZCwgZWFzaW5nLCBjYWxsYmFjayApOwogICAgIH07Cit9KTsKIAotICAgIC8vIEF0dGFjaCBkZWZl
cnJlZHMKLSAgICBkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVE
ZWZlcnJlZC5hZGQ7Ci0gICAganFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7Ci0gICAganFYSFIu
ZXJyb3IgPSBqcVhIUi5mYWlsOwotCi0gICAgLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUz
MTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCi0gICAgLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92
aWRlZCAoIzU4NjY6IElFNyBpc3N1ZSB3aXRoIHByb3RvY29sLWxlc3MgdXJscykKLSAgICAvLyBI
YW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVu
Y3kgd2l0aCBvbGQgc2lnbmF0dXJlKQotICAgIC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1l
dGVyIGlmIGF2YWlsYWJsZQotICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9j
YXRpb24gKSArICIiICkucmVwbGFjZSggcmhhc2gsICIiICkucmVwbGFjZSggcnByb3RvY29sLCBh
amF4TG9jUGFydHNbIDEgXSArICIvLyIgKTsKLQotICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24g
dG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAotICAgIHMudHlwZSA9IG9wdGlvbnMubWV0aG9k
IHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7Ci0KLSAgICAvLyBFeHRyYWN0
IGRhdGFUeXBlcyBsaXN0Ci0gICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlw
ZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFsiIl07
Ci0KLSAgICAvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2
ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAotICAgIGlmICggcy5jcm9zc0RvbWFpbiA9
PSBudWxsICkgewotICAgIHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7
Ci0gICAgcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgotICAgICggcGFydHNbIDEgXSAhPT0g
YWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwK
LSAgICAoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMg
KSApICE9Ci0gICAgKCBhamF4TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09
PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICkKLSAgICApOwotICAgIH0KKy8vIEdlbmVyYXRlIHNo
b3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKK2pRdWVyeS5lYWNoKHsKKyAgICBzbGlkZURv
d246IGdlbkZ4KCJzaG93IiksCisgICAgc2xpZGVVcDogZ2VuRngoImhpZGUiKSwKKyAgICBzbGlk
ZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIpLAorICAgIGZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIg
fSwKKyAgICBmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAorICAgIGZhZGVUb2dnbGU6IHsg
b3BhY2l0eTogInRvZ2dsZSIgfQorfSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkgeworICAgIGpR
dWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewor
ICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKTsKKyAgICB9OworfSk7CiAKLSAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkg
YSBzdHJpbmcKLSAgICBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRh
dGEgIT09ICJzdHJpbmciICkgewotICAgIHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBz
LnRyYWRpdGlvbmFsICk7Ci0gICAgfQoralF1ZXJ5LnRpbWVycyA9IFtdOworalF1ZXJ5LmZ4LnRp
Y2sgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGltZXIsCisgICAgICAgIGkgPSAwLAorICAgICAg
ICB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwogCi0gICAgLy8gQXBwbHkgcHJlZmlsdGVycwotICAg
IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBq
cVhIUiApOworICAgIGZ4Tm93ID0galF1ZXJ5Lm5vdygpOwogCi0gICAgLy8gSWYgcmVxdWVzdCB3
YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmUKLSAgICBpZiAoIHN0YXRl
ID09PSAyICkgewotICAgIHJldHVybiBqcVhIUjsKKyAgICBmb3IgKCA7IGkgPCB0aW1lcnMubGVu
Z3RoOyBpKysgKSB7CisgICAgICAgIHRpbWVyID0gdGltZXJzWyBpIF07CisgICAgICAgIC8vIENo
ZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZAorICAgICAgICBpZiAo
ICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHsKKyAgICAgICAgICAgIHRpbWVy
cy5zcGxpY2UoIGktLSwgMSApOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gV2UgY2FuIGZp
cmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG8KLSAgICBmaXJlR2xvYmFscyA9
IHMuZ2xvYmFsOwotCi0gICAgLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cwotICAg
IGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgewotICAgIGpRdWVy
eS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTsKKyAgICBpZiAoICF0aW1lcnMubGVuZ3RoICkg
eworICAgICAgICBqUXVlcnkuZnguc3RvcCgpOwogICAgIH0KKyAgICBmeE5vdyA9IHVuZGVmaW5l
ZDsKK307CiAKLSAgICAvLyBVcHBlcmNhc2UgdGhlIHR5cGUKLSAgICBzLnR5cGUgPSBzLnR5cGUu
dG9VcHBlckNhc2UoKTsKLQotICAgIC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50
Ci0gICAgcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7Ci0KLSAgICAv
LyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQt
U2luY2UKLSAgICAvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb24KLSAgICBj
YWNoZVVSTCA9IHMudXJsOwotCi0gICAgLy8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1
ZXN0cyB3aXRoIG5vIGNvbnRlbnQKLSAgICBpZiAoICFzLmhhc0NvbnRlbnQgKSB7Ci0KLSAgICAv
LyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsCi0gICAgaWYgKCBzLmRh
dGEgKSB7Ci0gICAgY2FjaGVVUkwgPSAoIHMudXJsICs9ICggYWpheF9ycXVlcnkudGVzdCggY2Fj
aGVVUkwgKSA/ICImIiA6ICI/IiApICsgcy5kYXRhICk7Ci0gICAgLy8gIzk2ODI6IHJlbW92ZSBk
YXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeQotICAgIGRlbGV0
ZSBzLmRhdGE7CitqUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7CisgICAgalF1
ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApOworICAgIGlmICggdGltZXIoKSApIHsKKyAgICAgICAg
alF1ZXJ5LmZ4LnN0YXJ0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgalF1ZXJ5LnRpbWVycy5w
b3AoKTsKICAgICB9Cit9OwogCi0gICAgLy8gQWRkIGFudGktY2FjaGUgaW4gdXJsIGlmIG5lZWRl
ZAotICAgIGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7Ci0gICAgcy51cmwgPSBydHMudGVzdCgg
Y2FjaGVVUkwgKSA/Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgJ18nIHBhcmFtZXRl
ciwgc2V0IGl0cyB2YWx1ZQotICAgIGNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgYWph
eF9ub25jZSsrICkgOgoralF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CiAKLSAgICAvLyBPdGhlcndp
c2UgYWRkIG9uZSB0byB0aGUgZW5kCi0gICAgY2FjaGVVUkwgKyAoIGFqYXhfcnF1ZXJ5LnRlc3Qo
IGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArICJfPSIgKyBhamF4X25vbmNlKys7Ci0gICAgfQor
alF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCAhdGltZXJJZCApIHsKKyAg
ICAgICAgdGltZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4Lmlu
dGVydmFsICk7CiAgICAgfQorfTsKIAotICAgIC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2Ug
YW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCi0gICAg
aWYgKCBzLmlmTW9kaWZpZWQgKSB7Ci0gICAgaWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNo
ZVVSTCBdICkgewotICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5j
ZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKLSAgICB9Ci0gICAgaWYgKCBq
UXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHsKLSAgICBqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAi
SWYtTm9uZS1NYXRjaCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7Ci0gICAgfQotICAgIH0K
K2pRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7CisgICAgY2xlYXJJbnRlcnZhbCggdGltZXJJ
ZCApOworICAgIHRpbWVySWQgPSBudWxsOworfTsKIAotICAgIC8vIFNldCB0aGUgY29ycmVjdCBo
ZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudAotICAgIGlmICggcy5kYXRhICYmIHMuaGFzQ29u
dGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkg
ewotICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRU
eXBlICk7Ci0gICAgfQoralF1ZXJ5LmZ4LnNwZWVkcyA9IHsKKyAgICBzbG93OiA2MDAsCisgICAg
ZmFzdDogMjAwLAorICAgIC8vIERlZmF1bHQgc3BlZWQKKyAgICBfZGVmYXVsdDogNDAwCit9Owog
Ci0gICAgLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5n
IG9uIHRoZSBkYXRhVHlwZQotICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoCi0gICAgIkFjY2Vw
dCIsCi0gICAgcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0g
PwotICAgIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAh
PT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgotICAgIHMuYWNj
ZXB0c1sgIioiIF0KLSAgICApOwogCi0gICAgLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCi0g
ICAgZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7Ci0gICAganFYSFIuc2V0UmVxdWVzdEhlYWRlcigg
aSwgcy5oZWFkZXJzWyBpIF0gKTsKLSAgICB9CisvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBi
eSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCisvLyBodHRwOi8vYmxpbmRzaWduYWxz
LmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCitqUXVlcnkuZm4uZGVsYXkgPSBm
dW5jdGlvbiggdGltZSwgdHlwZSApIHsKKyAgICB0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4
LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lOworICAgIHR5cGUgPSB0eXBlIHx8ICJmeCI7
CiAKLSAgICAvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0
Ci0gICAgaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tD
b250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkgewotICAgIC8v
IEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgotICAgIHJldHVybiBqcVhIUi5h
Ym9ydCgpOwotICAgIH0KKyAgICByZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5l
eHQsIGhvb2tzICkgeworICAgICAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRp
bWUgKTsKKyAgICAgICAgaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgY2xl
YXJUaW1lb3V0KCB0aW1lb3V0ICk7CisgICAgICAgIH07CisgICAgfSk7Cit9OwogCi0gICAgLy8g
YWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCi0gICAgc3RyQWJvcnQgPSAiYWJv
cnQiOwogCi0gICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCi0gICAgZm9yICgg
aSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewotICAgIGpxWEhS
WyBpIF0oIHNbIGkgXSApOwotICAgIH0KKyhmdW5jdGlvbigpIHsKKyAgICB2YXIgaW5wdXQgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisgICAgICAgIHNlbGVjdCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCisgICAgICAgIG9wdCA9IHNlbGVjdC5hcHBl
bmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggIm9wdGlvbiIgKSApOwogCi0gICAgLy8g
R2V0IHRyYW5zcG9ydAotICAgIHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3Bv
cnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApOworICAgIGlucHV0LnR5cGUgPSAi
Y2hlY2tib3giOwogCi0gICAgLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0Ci0gICAg
aWYgKCAhdHJhbnNwb3J0ICkgewotICAgIGRvbmUoIC0xLCAiTm8gVHJhbnNwb3J0IiApOwotICAg
IH0gZWxzZSB7Ci0gICAganFYSFIucmVhZHlTdGF0ZSA9IDE7CisgICAgLy8gU3VwcG9ydDogaU9T
IDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCisgICAgLy8gQ2hlY2sgdGhlIGRlZmF1bHQg
Y2hlY2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIG9sZCBXZWJLaXQ7ICJvbiIgZWxzZXdoZXJlKQor
ICAgIHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSAiIjsKIAotICAgIC8vIFNlbmQg
Z2xvYmFsIGV2ZW50Ci0gICAgaWYgKCBmaXJlR2xvYmFscyApIHsKLSAgICBnbG9iYWxFdmVudENv
bnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7Ci0gICAgfQotICAgIC8v
IFRpbWVvdXQKLSAgICBpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHsKLSAgICB0aW1l
b3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgIGpxWEhSLmFib3J0KCJ0aW1l
b3V0Iik7Ci0gICAgfSwgcy50aW1lb3V0ICk7Ci0gICAgfQorICAgIC8vIE11c3QgYWNjZXNzIHRo
ZSBwYXJlbnQgdG8gbWFrZSBhbiBvcHRpb24gc2VsZWN0IHByb3Blcmx5CisgICAgLy8gU3VwcG9y
dDogSUU5LCBJRTEwCisgICAgc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKIAot
ICAgIHRyeSB7Ci0gICAgc3RhdGUgPSAxOwotICAgIHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVh
ZGVycywgZG9uZSApOwotICAgIH0gY2F0Y2ggKCBlICkgewotICAgIC8vIFByb3BhZ2F0ZSBleGNl
cHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmUKLSAgICBpZiAoIHN0YXRlIDwgMiApIHsKLSAgICBk
b25lKCAtMSwgZSApOwotICAgIC8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZQotICAgIH0gZWxz
ZSB7Ci0gICAgdGhyb3cgZTsKLSAgICB9Ci0gICAgfQotICAgIH0KKyAgICAvLyBNYWtlIHN1cmUg
dGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFz
IGRpc2FibGVkCisgICAgLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2FibGVkKQorICAgIHNl
bGVjdC5kaXNhYmxlZCA9IHRydWU7CisgICAgc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlz
YWJsZWQ7CisKKyAgICAvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRzIHZhbHVlIGFm
dGVyIGJlY29taW5nIGEgcmFkaW8KKyAgICAvLyBTdXBwb3J0OiBJRTksIElFMTAKKyAgICBpbnB1
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKKyAgICBpbnB1dC52YWx1ZSA9
ICJ0IjsKKyAgICBpbnB1dC50eXBlID0gInJhZGlvIjsKKyAgICBzdXBwb3J0LnJhZGlvVmFsdWUg
PSBpbnB1dC52YWx1ZSA9PT0gInQiOworfSkoKTsKIAotICAgIC8vIENhbGxiYWNrIGZvciB3aGVu
IGV2ZXJ5dGhpbmcgaXMgZG9uZQotICAgIGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3Rh
dHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewotICAgIHZhciBpc1N1Y2Nlc3MsIHN1Y2Nl
c3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsCi0gICAgc3RhdHVzVGV4dCA9IG5hdGl2ZVN0
YXR1c1RleHQ7CiAKLSAgICAvLyBDYWxsZWQgb25jZQotICAgIGlmICggc3RhdGUgPT09IDIgKSB7
Ci0gICAgcmV0dXJuOwotICAgIH0KK3ZhciBub2RlSG9vaywgYm9vbEhvb2ssCisgICAgYXR0ckhh
bmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7CiAKLSAgICAvLyBTdGF0ZSBpcyAiZG9uZSIg
bm93Ci0gICAgc3RhdGUgPSAyOworalF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgYXR0cjogZnVuY3Rp
b24oIG5hbWUsIHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnku
YXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7CisgICAgfSwKIAotICAg
IC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCi0gICAgaWYgKCB0aW1lb3V0VGltZXIgKSB7
Ci0gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKKyAgICByZW1vdmVBdHRyOiBmdW5j
dGlvbiggbmFtZSApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CisgICAgICAgIH0pOwog
ICAgIH0KK30pOwogCi0gICAgLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJi
YWdlIGNvbGxlY3Rpb24KLSAgICAvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmpl
Y3Qgd2lsbCBiZSB1c2VkKQotICAgIHRyYW5zcG9ydCA9IHVuZGVmaW5lZDsKLQotICAgIC8vIENh
Y2hlIHJlc3BvbnNlIGhlYWRlcnMKLSAgICByZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJz
IHx8ICIiOworalF1ZXJ5LmV4dGVuZCh7CisgICAgYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUs
IHZhbHVlICkgeworICAgICAgICB2YXIgaG9va3MsIHJldCwKKyAgICAgICAgICAgIG5UeXBlID0g
ZWxlbS5ub2RlVHlwZTsKIAotICAgIC8vIFNldCByZWFkeVN0YXRlCi0gICAganFYSFIucmVhZHlT
dGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKKyAgICAgICAgLy8gZG9uJ3QgZ2V0L3NldCBhdHRy
aWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcworICAgICAgICBpZiAo
ICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAvLyBHZXQgcmVzcG9uc2UgZGF0
YQotICAgIGlmICggcmVzcG9uc2VzICkgewotICAgIHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3Bv
bnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOwotICAgIH0KKyAgICAgICAgLy8gRmFsbGJhY2sg
dG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKCB0
eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IHN0cnVuZGVmaW5lZCApIHsKKyAgICAgICAgICAg
IHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfQogCi0g
ICAgLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKLSAgICBpZiAoIHN0YXR1
cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0ICkgeworICAgICAgICAv
LyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlCisgICAgICAgIC8vIEdyYWIgbmVjZXNzYXJ5
IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKKyAgICAgICAgaWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1
ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2Vy
Q2FzZSgpOworICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwK
KyAgICAgICAgICAgICAgICAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8g
Ym9vbEhvb2sgOiBub2RlSG9vayApOworICAgICAgICB9CiAKLSAgICAvLyBTZXQgdGhlIElmLU1v
ZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmll
ZCBtb2RlLgotICAgIGlmICggcy5pZk1vZGlmaWVkICkgewotICAgIG1vZGlmaWVkID0ganFYSFIu
Z2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKLSAgICBpZiAoIG1vZGlmaWVkICkg
ewotICAgIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKLSAgICB9
Ci0gICAgbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpOwotICAgIGlm
ICggbW9kaWZpZWQgKSB7Ci0gICAgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsK
LSAgICB9Ci0gICAgfQorICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CiAKLSAg
ICAvLyBpZiBubyBjb250ZW50Ci0gICAgaWYgKCBzdGF0dXMgPT09IDIwNCApIHsKLSAgICBpc1N1
Y2Nlc3MgPSB0cnVlOwotICAgIHN0YXR1c1RleHQgPSAibm9jb250ZW50IjsKKyAgICAgICAgICAg
IGlmICggdmFsdWUgPT09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LnJlbW92ZUF0
dHIoIGVsZW0sIG5hbWUgKTsKIAotICAgIC8vIGlmIG5vdCBtb2RpZmllZAotICAgIH0gZWxzZSBp
ZiAoIHN0YXR1cyA9PT0gMzA0ICkgewotICAgIGlzU3VjY2VzcyA9IHRydWU7Ci0gICAgc3RhdHVz
VGV4dCA9ICJub3Rtb2RpZmllZCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBob29rcyAmJiAi
c2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAh
PT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAvLyBJ
ZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKLSAgICB9IGVsc2UgewotICAgIGlzU3Vj
Y2VzcyA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApOwotICAgIHN0YXR1c1RleHQgPSBpc1N1
Y2Nlc3Muc3RhdGU7Ci0gICAgc3VjY2VzcyA9IGlzU3VjY2Vzcy5kYXRhOwotICAgIGVycm9yID0g
aXNTdWNjZXNzLmVycm9yOwotICAgIGlzU3VjY2VzcyA9ICFlcnJvcjsKLSAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dAotICAgIC8vIHRo
ZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwotICAgIGVy
cm9yID0gc3RhdHVzVGV4dDsKLSAgICBpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHsKLSAg
ICBzdGF0dXNUZXh0ID0gImVycm9yIjsKLSAgICBpZiAoIHN0YXR1cyA8IDAgKSB7Ci0gICAgc3Rh
dHVzID0gMDsKLSAgICB9Ci0gICAgfQotICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgIiIgKTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CiAKLSAgICAvLyBTZXQgZGF0
YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAotICAgIGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKLSAg
ICBqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSAr
ICIiOworICAgICAgICB9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0
ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgeworICAgICAgICAgICAgcmV0
dXJuIHJldDsKIAotICAgIC8vIFN1Y2Nlc3MvRXJyb3IKLSAgICBpZiAoIGlzU3VjY2VzcyApIHsK
LSAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0
YXR1c1RleHQsIGpxWEhSIF0gKTsKLSAgICB9IGVsc2UgewotICAgIGRlZmVycmVkLnJlamVjdFdp
dGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwotICAg
IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGpRdWVyeS5maW5kLmF0dHIo
IGVsZW0sIG5hbWUgKTsKIAotICAgIC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0gICAg
anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwotICAgIHN0YXR1c0NvZGUgPSB1bmRlZmlu
ZWQ7CisgICAgICAgICAgICAvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwg
d2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAorICAgICAgICAgICAgcmV0dXJuIHJldCA9PSBudWxs
ID8KKyAgICAgICAgICAgICAgICB1bmRlZmluZWQgOgorICAgICAgICAgICAgICAgIHJldDsKKyAg
ICAgICAgfQorICAgIH0sCiAKLSAgICBpZiAoIGZpcmVHbG9iYWxzICkgewotICAgIGdsb2JhbEV2
ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAiYWpheFN1Y2Nlc3MiIDogImFqYXhFcnJv
ciIsCi0gICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKLSAg
ICB9CisgICAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgICAgICB2
YXIgbmFtZSwgcHJvcE5hbWUsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGF0dHJO
YW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKTsKIAotICAgIC8vIENvbXBs
ZXRlCi0gICAgY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpx
WEhSLCBzdGF0dXNUZXh0IF0gKTsKKyAgICAgICAgaWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2Rl
VHlwZSA9PT0gMSApIHsKKyAgICAgICAgICAgIHdoaWxlICggKG5hbWUgPSBhdHRyTmFtZXNbaSsr
XSkgKSB7CisgICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBd
IHx8IG5hbWU7CiAKLSAgICBpZiAoIGZpcmVHbG9iYWxzICkgewotICAgIGdsb2JhbEV2ZW50Q29u
dGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7Ci0gICAgLy8gSGFu
ZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCi0gICAgaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUg
KSApIHsKLSAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTsKLSAgICB9Ci0gICAg
fQotICAgIH0KKyAgICAgICAgICAgICAgICAvLyBCb29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNp
YWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuZXhwci5t
YXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGNv
cnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxlbVsg
cHJvcE5hbWUgXSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAotICAgIHJldHVybiBqcVhI
UjsKKyAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CiAgICAgfSwKIAotICAgIGdldFNjcmlwdDogZnVuY3Rpb24oIHVy
bCwgY2FsbGJhY2sgKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBj
YWxsYmFjaywgInNjcmlwdCIgKTsKLSAgICB9LAorICAgIGF0dHJIb29rczogeworICAgICAgICB0
eXBlOiB7CisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIg
JiYKKyAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkg
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBi
dXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKKyAgICAgICAg
ICAgICAgICAgICAgLy8gUmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0
IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVhdGlvbgorICAgICAgICAgICAgICAgICAgICB2YXIgdmFs
ID0gZWxlbS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICJ0
eXBlIiwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWwgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gdmFsOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9KTsKIAotICAgIGdldEpTT046IGZ1bmN0
aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewotICAgIHJldHVybiBqUXVlcnkuZ2V0KCB1cmws
IGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKKy8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0
ZXMKK2Jvb2xIb29rID0geworICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkg
eworICAgICAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgIC8vIFJlbW92
ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UKKyAgICAgICAgICAgIGpRdWVy
eS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBuYW1lOwogICAgIH0KK307CitqUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9v
bC5zb3VyY2UubWF0Y2goIC9cdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2YXIg
Z2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CisKKyAgICBh
dHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CisgICAg
ICAgIHZhciByZXQsIGhhbmRsZTsKKyAgICAgICAgaWYgKCAhaXNYTUwgKSB7CisgICAgICAgICAg
ICAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMg
ZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCisgICAgICAgICAgICBoYW5kbGUgPSBhdHRySGFuZGxl
WyBuYW1lIF07CisgICAgICAgICAgICBhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7CisgICAgICAg
ICAgICByZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CisgICAgICAg
ICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpIDoKKyAgICAgICAgICAgICAgICBudWxsOworICAg
ICAgICAgICAgYXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlOworICAgICAgICB9CisgICAgICAg
IHJldHVybiByZXQ7CisgICAgfTsKIH0pOwogCi0vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBh
amF4IHJlcXVlc3Q6Ci0gKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmds
eQotICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVu
dC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKLSAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9u
ZGluZyByZXNwb25zZQotICovCi1mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhI
UiwgcmVzcG9uc2VzICkgewotICAgIHZhciBmaXJzdERhdGFUeXBlLCBjdCwgZmluYWxEYXRhVHlw
ZSwgdHlwZSwKLSAgICBjb250ZW50cyA9IHMuY29udGVudHMsCi0gICAgZGF0YVR5cGVzID0gcy5k
YXRhVHlwZXMsCi0gICAgcmVzcG9uc2VGaWVsZHMgPSBzLnJlc3BvbnNlRmllbGRzOwogCi0gICAg
Ly8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKLSAgICBmb3IgKCB0eXBlIGluIHJlc3BvbnNlRmll
bGRzICkgewotICAgIGlmICggdHlwZSBpbiByZXNwb25zZXMgKSB7Ci0gICAganFYSFJbIHJlc3Bv
bnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTsKLSAgICB9Ci0gICAgfQogCi0g
ICAgLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHBy
b2Nlc3MKLSAgICB3aGlsZSggZGF0YVR5cGVzWyAwIF0gPT09ICIqIiApIHsKLSAgICBkYXRhVHlw
ZXMuc2hpZnQoKTsKLSAgICBpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7Ci0gICAgY3QgPSBzLm1p
bWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKTsKLSAgICB9
Ci0gICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29u
dGVudC10eXBlCi0gICAgaWYgKCBjdCApIHsKLSAgICBmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkg
ewotICAgIGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0
ICkgKSB7Ci0gICAgZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKLSAgICBicmVhazsKLSAgICB9
Ci0gICAgfQotICAgIH0KK3ZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFy
ZWF8YnV0dG9uKSQvaTsKIAotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9u
c2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQotICAgIGlmICggZGF0YVR5cGVzWyAwIF0gaW4g
cmVzcG9uc2VzICkgewotICAgIGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKLSAgICB9
IGVsc2UgewotICAgIC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXMKLSAgICBmb3IgKCB0eXBl
IGluIHJlc3BvbnNlcyApIHsKLSAgICBpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRl
cnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbMF0gXSApIHsKLSAgICBmaW5hbERhdGFUeXBlID0g
dHlwZTsKLSAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKLSAg
ICBmaXJzdERhdGFUeXBlID0gdHlwZTsKLSAgICB9Ci0gICAgfQotICAgIC8vIE9yIGp1c3QgdXNl
IGZpcnN0IG9uZQotICAgIGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0
YVR5cGU7Ci0gICAgfQoralF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgcHJvcDogZnVuY3Rpb24oIG5h
bWUsIHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwg
bmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7CisgICAgfSwKIAotICAgIC8vIElm
IHdlIGZvdW5kIGEgZGF0YVR5cGUKLSAgICAvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBs
aXN0IGlmIG5lZWRlZAotICAgIC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9u
c2UKLSAgICBpZiAoIGZpbmFsRGF0YVR5cGUgKSB7Ci0gICAgaWYgKCBmaW5hbERhdGFUeXBlICE9
PSBkYXRhVHlwZXNbIDAgXSApIHsKLSAgICBkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlw
ZSApOwotICAgIH0KLSAgICByZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07CisgICAg
cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVhY2go
ZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5h
bWUgXSB8fCBuYW1lIF07CisgICAgICAgIH0pOwogICAgIH0KLX0KK30pOwogCi0vLyBDaGFpbiBj
b252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlCi1m
dW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7Ci0gICAgdmFyIGNvbnYyLCBjdXJy
ZW50LCBjb252LCB0bXAsCi0gICAgY29udmVydGVycyA9IHt9LAotICAgIGkgPSAwLAotICAgIC8v
IFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkg
aXQgZm9yIGNvbnZlcnNpb24KLSAgICBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpLAot
ICAgIHByZXYgPSBkYXRhVHlwZXNbIDAgXTsKK2pRdWVyeS5leHRlbmQoeworICAgIHByb3BGaXg6
IHsKKyAgICAgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAgICAgImNsYXNzIjogImNsYXNzTmFt
ZSIKKyAgICB9LAogCi0gICAgLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKLSAg
ICBpZiAoIHMuZGF0YUZpbHRlciApIHsKLSAgICByZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVz
cG9uc2UsIHMuZGF0YVR5cGUgKTsKLSAgICB9CisgICAgcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5h
bWUsIHZhbHVlICkgeworICAgICAgICB2YXIgcmV0LCBob29rcywgbm90eG1sLAorICAgICAgICAg
ICAgblR5cGUgPSBlbGVtLm5vZGVUeXBlOwogCi0gICAgLy8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFw
IHdpdGggbG93ZXJjYXNlZCBrZXlzCi0gICAgaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKLSAgICBm
b3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKLSAgICBjb252ZXJ0ZXJzWyBjb252LnRvTG93
ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdOwotICAgIH0KLSAgICB9CisgICAgICAg
IC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1
dGUgbm9kZXMKKyAgICAgICAgaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0g
OCB8fCBuVHlwZSA9PT0gMiApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0g
ICAgLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcgbGlz
dCBtb2RpZmljYXRpb24KLSAgICBmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyAp
IHsKKyAgICAgICAgbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxl
bSApOwogCi0gICAgLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlw
ZSBpcyBub24tYXV0bwotICAgIGlmICggY3VycmVudCAhPT0gIioiICkgeworICAgICAgICBpZiAo
IG5vdHhtbCApIHsKKyAgICAgICAgICAgIC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKKyAg
ICAgICAgICAgIG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisgICAgICAg
ICAgICBob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKKyAgICAgICAgfQogCi0gICAg
Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZm
ZXJzIGZyb20gY3VycmVudAotICAgIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJl
bnQgKSB7CisgICAgICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAg
IHJldHVybiBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVt
LCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkID8KKyAgICAgICAgICAgICAgICByZXQgOgor
ICAgICAgICAgICAgICAgICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKIAotICAgIC8vIFNlZWsg
YSBkaXJlY3QgY29udmVydGVyCi0gICAgY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAiICIgKyBj
dXJyZW50IF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHJldHVybiBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0g
aG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsID8KKyAgICAgICAgICAgICAgICByZXQg
OgorICAgICAgICAgICAgICAgIGVsZW1bIG5hbWUgXTsKKyAgICAgICAgfQorICAgIH0sCiAKLSAg
ICAvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpcgotICAgIGlmICggIWNvbnYgKSB7Ci0gICAg
Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKKyAgICBwcm9wSG9va3M6IHsKKyAgICAgICAg
dGFiSW5kZXg6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGVsZW0uaGFzQXR0cmlidXRlKCAidGFiaW5kZXgiICkgfHwgcmZvY3Vz
YWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID8KKyAgICAgICAgICAgICAg
ICAgICAgZWxlbS50YWJJbmRleCA6CisgICAgICAgICAgICAgICAgICAgIC0xOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfSk7CiAKLSAgICAvLyBJZiBjb252MiBvdXRwdXRzIGN1
cnJlbnQKLSAgICB0bXAgPSBjb252Mi5zcGxpdCgiICIpOwotICAgIGlmICggdG1wWyAxIF0gPT09
IGN1cnJlbnQgKSB7CisvLyBTdXBwb3J0OiBJRTkrCisvLyBTZWxlY3RlZG5lc3MgZm9yIGFuIG9w
dGlvbiBpbiBhbiBvcHRncm91cCBjYW4gYmUgaW5hY2N1cmF0ZQoraWYgKCAhc3VwcG9ydC5vcHRT
ZWxlY3RlZCApIHsKKyAgICBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0geworICAgICAgICBn
ZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFy
ZW50Tm9kZTsKKyAgICAgICAgICAgIGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkg
eworICAgICAgICAgICAgICAgIHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH07Cit9
CiAKLSAgICAvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKLSAg
ICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKLSAgICBjb252
ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKLSAgICBpZiAoIGNvbnYgKSB7Ci0gICAgLy8gQ29u
ZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwotICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsK
LSAgICBjb252ID0gY29udmVydGVyc1sgY29udjIgXTsKK2pRdWVyeS5lYWNoKFsKKyAgICAidGFi
SW5kZXgiLAorICAgICJyZWFkT25seSIsCisgICAgIm1heExlbmd0aCIsCisgICAgImNlbGxTcGFj
aW5nIiwKKyAgICAiY2VsbFBhZGRpbmciLAorICAgICJyb3dTcGFuIiwKKyAgICAiY29sU3BhbiIs
CisgICAgInVzZU1hcCIsCisgICAgImZyYW1lQm9yZGVyIiwKKyAgICAiY29udGVudEVkaXRhYmxl
IgorXSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2Uo
KSBdID0gdGhpczsKK30pOwogCi0gICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVk
aWF0ZSBkYXRhVHlwZQotICAgIH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRy
dWUgKSB7Ci0gICAgY3VycmVudCA9IHRtcFsgMCBdOwotICAgIGRhdGFUeXBlcy5zcGxpY2UoIGkt
LSwgMCwgY3VycmVudCApOwotICAgIH0KIAotICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0gICAg
fQotICAgIH0KIAotICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNl
KQotICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsKIAotICAgIC8vIFVubGVzcyBlcnJvcnMgYXJl
IGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0KLSAgICBpZiAoIGNvbnYg
JiYgc1sidGhyb3dzIl0gKSB7Ci0gICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwotICAg
IH0gZWxzZSB7Ci0gICAgdHJ5IHsKLSAgICByZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7Ci0g
ICAgfSBjYXRjaCAoIGUgKSB7Ci0gICAgcmV0dXJuIHsgc3RhdGU6ICJwYXJzZXJlcnJvciIsIGVy
cm9yOiBjb252ID8gZSA6ICJObyBjb252ZXJzaW9uIGZyb20gIiArIHByZXYgKyAiIHRvICIgKyBj
dXJyZW50IH07Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQordmFyIHJjbGFzcyA9IC9bXHRc
clxuXGZdL2c7CiAKLSAgICAvLyBVcGRhdGUgcHJldiBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICBw
cmV2ID0gY3VycmVudDsKLSAgICB9Ci0gICAgfQoralF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgYWRk
Q2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1
ciwgY2xhenosIGosIGZpbmFsVmFsdWUsCisgICAgICAgICAgICBwcm9jZWVkID0gdHlwZW9mIHZh
bHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSwKKyAgICAgICAgICAgIGkgPSAwLAorICAgICAgICAg
ICAgbGVuID0gdGhpcy5sZW5ndGg7CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
dmFsdWUgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7
CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRo
aXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKCBwcm9jZWVkICkgeworICAgICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aW9u
IGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSByZW1vdmVDbGFzcykKKyAg
ICAgICAgICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8
IFtdOworCisgICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAg
ICAgICBlbGVtID0gdGhpc1sgaSBdOworICAgICAgICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5
cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/CisgICAgICAgICAgICAgICAgICAgICggIiAi
ICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoKKyAgICAg
ICAgICAgICAgICAgICAgIiAiCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAg
IGlmICggY3VyICkgeworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAg
ICAgICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyICs9IGNsYXp6ICsgIiAiOworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRl
cmluZy4KKyAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIg
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1
ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1
ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCiAKLSAgICByZXR1
cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9OwotfQotLy8gSW5zdGFsbCBz
Y3JpcHQgZGF0YVR5cGUKLWpRdWVyeS5hamF4U2V0dXAoewotICAgIGFjY2VwdHM6IHsKLSAgICBz
Y3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0
aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKKyAgICByZW1vdmVDbGFz
czogZnVuY3Rpb24oIHZhbHVlICkgeworICAgICAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBj
bGF6eiwgaiwgZmluYWxWYWx1ZSwKKyAgICAgICAgICAgIHByb2NlZWQgPSBhcmd1bWVudHMubGVu
Z3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWUsCisgICAgICAg
ICAgICBpID0gMCwKKyAgICAgICAgICAgIGxlbiA9IHRoaXMubGVuZ3RoOworCisgICAgICAgIGlm
ICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdGhp
cy5lYWNoKGZ1bmN0aW9uKCBqICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJl
bW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7CisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHByb2NlZWQgKSB7CisgICAgICAg
ICAgICBjbGFzc2VzID0gKCB2YWx1ZSB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsK
KworICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICAgICAg
ZWxlbSA9IHRoaXNbIGkgXTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24gaXMg
aGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKQorICAgICAgICAg
ICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/Cisg
ICAgICAgICAgICAgICAgICAgICggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNl
KCByY2xhc3MsICIgIiApIDoKKyAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAg
ICApOworCisgICAgICAgICAgICAgICAgaWYgKCBjdXIgKSB7CisgICAgICAgICAgICAgICAgICAg
IGogPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNbaisr
XSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2Vz
CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBjbGF6
eiArICIgIiApID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY3Vy
LnJlcGxhY2UoICIgIiArIGNsYXp6ICsgIiAiLCAiICIgKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIG9u
bHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCisgICAg
ICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6
ICIiOworICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0uY2xhc3NOYW1lICE9PSBmaW5hbFZh
bHVlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5jbGFzc05hbWUgPSBmaW5hbFZh
bHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfSwKLSAgICBjb250
ZW50czogewotICAgIHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvCisKKyAgICB0b2dnbGVD
bGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKyAgICAgICAgdmFyIHR5cGUgPSB0
eXBlb2YgdmFsdWU7CisKKyAgICAgICAgaWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFu
IiAmJiB0eXBlID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZVZhbCA/
IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisgICAgICAgICAgICAg
ICAgalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5j
bGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKKyAgICAgICAgICAgIH0pOworICAgICAg
ICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
IGlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICAgICAgLy8gdG9nZ2xlIGlu
ZGl2aWR1YWwgY2xhc3MgbmFtZXMKKyAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lLAorICAg
ICAgICAgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZiA9IGpRdWVy
eSggdGhpcyApLAorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVzID0gdmFsdWUubWF0Y2go
IHJub3R3aGl0ZSApIHx8IFtdOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCAoY2xhc3NOYW1l
ID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBl
YWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3QKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApOworICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRDbGFzcyggY2xh
c3NOYW1lICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIC8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lCisgICAgICAgICAgICB9IGVsc2Ug
aWYgKCB0eXBlID09PSBzdHJ1bmRlZmluZWQgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgeworICAg
ICAgICAgICAgICAgIGlmICggdGhpcy5jbGFzc05hbWUgKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2
LnNldCggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNz
IG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkICJmYWxzZSIsCisgICAgICAgICAgICAgICAgLy8gdGhl
biByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3Zl
IHNhdmVkIGl0KS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0
ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAorICAgICAgICAgICAgICAg
IC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3Jl
ZC4KKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lIHx8IHZh
bHVlID09PSBmYWxzZSA/ICIiIDogZGF0YV9wcml2LmdldCggdGhpcywgIl9fY2xhc3NOYW1lX18i
ICkgfHwgIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgIH0sCi0gICAgY29udmVy
dGVyczogewotICAgICJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgewotICAgIGpRdWVy
eS5nbG9iYWxFdmFsKCB0ZXh0ICk7Ci0gICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotICAgIH0KLX0p
OwogCi0vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGdsb2JhbAotalF1ZXJ5LmFq
YXhQcmVmaWx0ZXIoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKLSAgICBpZiAoIHMuY2FjaGUg
PT09IHVuZGVmaW5lZCApIHsKLSAgICBzLmNhY2hlID0gZmFsc2U7Ci0gICAgfQotICAgIGlmICgg
cy5jcm9zc0RvbWFpbiApIHsKLSAgICBzLnR5cGUgPSAiR0VUIjsKLSAgICBzLmdsb2JhbCA9IGZh
bHNlOworICAgIGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAgICAgIHZhciBj
bGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwKKyAgICAgICAgICAgIGkgPSAwLAorICAg
ICAgICAgICAgbCA9IHRoaXMubGVuZ3RoOworICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7
CisgICAgICAgICAgICBpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKCIgIiArIHRoaXNb
aV0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFzcywgIiAiKS5pbmRleE9mKCBjbGFzc05h
bWUgKSA+PSAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0pOwogCi0vLyBC
aW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKLWpRdWVyeS5hamF4VHJhbnNwb3J0KCAic2Ny
aXB0IiwgZnVuY3Rpb24ocykgewogCi0gICAgLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3
aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwotICAgIGlmICggcy5jcm9zc0RvbWFpbiApIHsKIAot
ICAgIHZhciBzY3JpcHQsCi0gICAgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgalF1ZXJ5KCJoZWFk
IilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogCi0gICAgcmV0dXJuIHsKK3ZhciBy
cmV0dXJuID0gL1xyL2c7CiAKLSAgICBzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7Citq
UXVlcnkuZm4uZXh0ZW5kKHsKKyAgICB2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAg
dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sCisgICAgICAgICAgICBlbGVtID0gdGhpc1swXTsK
IAotICAgIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworICAgICAg
ICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgeworICAgICAgICAgICAgaWYgKCBlbGVtICkgewor
ICAgICAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBq
UXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwogCi0gICAgc2Ny
aXB0LmFzeW5jID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIGhvb2tzICYmICJnZXQiIGlu
IGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSkgIT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9
CiAKLSAgICBpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKLSAgICBzY3JpcHQuY2hhcnNldCA9IHMu
c2NyaXB0Q2hhcnNldDsKLSAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gZWxlbS52YWx1ZTsK
IAotICAgIHNjcmlwdC5zcmMgPSBzLnVybDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9m
IHJldCA9PT0gInN0cmluZyIgPworICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgbW9zdCBj
b21tb24gc3RyaW5nIGNhc2VzCisgICAgICAgICAgICAgICAgICAgIHJldC5yZXBsYWNlKHJyZXR1
cm4sICIiKSA6CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1
ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlcgorICAgICAgICAgICAgICAgICAgICByZXQgPT0gbnVs
bCA/ICIiIDogcmV0OworICAgICAgICAgICAgfQogCi0gICAgLy8gQXR0YWNoIGhhbmRsZXJzIGZv
ciBhbGwgYnJvd3NlcnMKLSAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNo
YW5nZSA9IGZ1bmN0aW9uKCBfLCBpc0Fib3J0ICkgeworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CiAKLSAgICBpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2Fk
ZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkgKSB7CisgICAgICAgIGlzRnVu
Y3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKIAotICAgIC8vIEhhbmRsZSBtZW1v
cnkgbGVhayBpbiBJRQotICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hh
bmdlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAg
ICAgICAgICAgIHZhciB2YWw7CiAKLSAgICAvLyBSZW1vdmUgdGhlIHNjcmlwdAotICAgIGlmICgg
c2NyaXB0LnBhcmVudE5vZGUgKSB7Ci0gICAgc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo
IHNjcmlwdCApOwotICAgIH0KKyAgICAgICAgICAgIGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSAp
IHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLSAgICAvLyBEZXJl
ZmVyZW5jZSB0aGUgc2NyaXB0Ci0gICAgc2NyaXB0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgg
aXNGdW5jdGlvbiApIHsKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBp
LCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICB2YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KIAotICAgIC8vIENhbGxiYWNrIGlm
IG5vdCBhYm9ydAotICAgIGlmICggIWlzQWJvcnQgKSB7Ci0gICAgY2FsbGJhY2soIDIwMCwgInN1
Y2Nlc3MiICk7Ci0gICAgfQotICAgIH0KLSAgICB9OworICAgICAgICAgICAgLy8gVHJlYXQgbnVs
bC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmcKKyAgICAgICAgICAg
IGlmICggdmFsID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgdmFsID0gIiI7CiAKLSAgICAv
LyBDaXJjdW12ZW50IElFNiBidWdzIHdpdGggYmFzZSBlbGVtZW50cyAoIzI3MDkgYW5kICM0Mzc4
KSBieSBwcmVwZW5kaW5nCi0gICAgLy8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2
b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5Ci0gICAgaGVhZC5pbnNlcnRCZWZvcmUoIHNj
cmlwdCwgaGVhZC5maXJzdENoaWxkICk7Ci0gICAgfSwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
IHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgeworICAgICAgICAgICAgICAgIHZhbCArPSAiIjsK
IAotICAgIGFib3J0OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIHNjcmlwdCApIHsKLSAgICBzY3Jp
cHQub25sb2FkKCB1bmRlZmluZWQsIHRydWUgKTsKLSAgICB9Ci0gICAgfQotICAgIH07CisgICAg
ICAgICAgICB9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7CisgICAgICAgICAg
ICAgICAgdmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOworICAg
ICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBob29rcyA9IGpR
dWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVO
YW1lLnRvTG93ZXJDYXNlKCkgXTsKKworICAgICAgICAgICAgLy8gSWYgc2V0IHJldHVybnMgdW5k
ZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKKyAgICAgICAgICAgIGlmICggIWhv
b2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUi
ICkgPT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsOwor
ICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiB9KTsKLXZhciBvbGRDYWxsYmFja3Mg
PSBbXSwKLSAgICByanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vOwogCi0vLyBEZWZhdWx0IGpz
b25wIHNldHRpbmdzCi1qUXVlcnkuYWpheFNldHVwKHsKLSAgICBqc29ucDogImNhbGxiYWNrIiwK
LSAgICBqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY2FsbGJhY2sgPSBvbGRD
YWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArICJfIiArICggYWpheF9ub25jZSsr
ICkgKTsKLSAgICB0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTsKLSAgICByZXR1cm4gY2FsbGJhY2s7
CitqUXVlcnkuZXh0ZW5kKHsKKyAgICB2YWxIb29rczogeworICAgICAgICBzZWxlY3Q6IHsKKyAg
ICAgICAgICAgIGdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAgICAgdmFyIHZh
bHVlLCBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMs
CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorICAgICAg
ICAgICAgICAgICAgICBvbmUgPSBlbGVtLnR5cGUgPT09ICJzZWxlY3Qtb25lIiB8fCBpbmRleCA8
IDAsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKKyAgICAg
ICAgICAgICAgICAgICAgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgsCisg
ICAgICAgICAgICAgICAgICAgIGkgPSBpbmRleCA8IDAgPworICAgICAgICAgICAgICAgICAgICAg
ICAgbWF4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uZSA/IGluZGV4IDogMDsKKworICAg
ICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKyAg
ICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAg
ICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisgICAgICAgICAgICAgICAgICAgIC8vIElFNi05
IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKQorICAgICAg
ICAgICAgICAgICAgICBpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiYK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0
IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKCBzdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9w
dGlvbi5nZXRBdHRyaWJ1dGUoICJkaXNhYmxlZCIgKSA9PT0gbnVsbCApICYmCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVy
eS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSApICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0
aW9uCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFs
KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkg
Zm9yIG9uZSBzZWxlY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9uZSApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLVNlbGVjdHMgcmV0
dXJuIGFuIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCggdmFsdWUg
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBzZXQ6
IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICB2YXIgb3B0aW9uU2V0
LCBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCisg
ICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksCisg
ICAgICAgICAgICAgICAgICAgIGkgPSBvcHRpb25zLmxlbmd0aDsKKworICAgICAgICAgICAgICAg
IHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25zWyBp
IF07CisgICAgICAgICAgICAgICAgICAgIGlmICggKG9wdGlvbi5zZWxlY3RlZCA9IGpRdWVyeS5p
bkFycmF5KCBqUXVlcnkob3B0aW9uKS52YWwoKSwgdmFsdWVzICkgPj0gMCkgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBvcHRpb25TZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYnJvd3NlcnMg
dG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXQKKyAg
ICAgICAgICAgICAgICBpZiAoICFvcHRpb25TZXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGVs
ZW0uc2VsZWN0ZWRJbmRleCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICByZXR1cm4gdmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfSk7CiAK
LS8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBq
c29ucCByZXF1ZXN0cwotalF1ZXJ5LmFqYXhQcmVmaWx0ZXIoICJqc29uIGpzb25wIiwgZnVuY3Rp
b24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkgeworLy8gUmFkaW9zIGFuZCBjaGVja2Jv
eGVzIGdldHRlci9zZXR0ZXIKK2pRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBm
dW5jdGlvbigpIHsKKyAgICBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKKyAgICAgICAgc2V0
OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisgICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0Fy
cmF5KCB2YWx1ZSApICkgeworICAgICAgICAgICAgICAgIHJldHVybiAoIGVsZW0uY2hlY2tlZCA9
IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAoICFzdXBwb3J0LmNoZWNrT24g
KSB7CisgICAgICAgIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVt
ICkgeworICAgICAgICAgICAgLy8gU3VwcG9ydDogV2Via2l0CisgICAgICAgICAgICAvLyAiIiBp
cyByZXR1cm5lZCBpbnN0ZWFkIG9mICJvbiIgaWYgYSB2YWx1ZSBpc24ndCBzcGVjaWZpZWQKKyAg
ICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgidmFsdWUiKSA9PT0gbnVsbCA/ICJv
biIgOiBlbGVtLnZhbHVlOworICAgICAgICB9OworICAgIH0KK30pOwogCi0gICAgdmFyIGNhbGxi
YWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLAotICAgIGpzb25Qcm9wID0g
cy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/Ci0gICAgInVybCIg
OgotICAgIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICYmICEoIHMuY29udGVudFR5cGUgfHwg
IiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSAmJiByanNv
bnAudGVzdCggcy5kYXRhICkgJiYgImRhdGEiCi0gICAgKTsKIAotICAgIC8vIEhhbmRsZSBpZmYg
dGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyAianNvbnAiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIg
dG8gc2V0Ci0gICAgaWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAi
ICkgewogCi0gICAgLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5n
IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgIGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxs
YmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/Ci0gICAgcy5qc29u
cENhbGxiYWNrKCkgOgotICAgIHMuanNvbnBDYWxsYmFjazsKIAotICAgIC8vIEluc2VydCBjYWxs
YmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKLSAgICBpZiAoIGpzb25Qcm9wICkgewotICAgIHNb
IGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgIiQxIiArIGNhbGxi
YWNrTmFtZSApOwotICAgIH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkgewotICAgIHMu
dXJsICs9ICggYWpheF9ycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29u
cCArICI9IiArIGNhbGxiYWNrTmFtZTsKLSAgICB9CisvLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRy
aWJ1dGVzLW9ubHkgaW5jbHVzaW9uCiAKLSAgICAvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0
cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCi0gICAgcy5jb252ZXJ0ZXJzWyJzY3Jp
cHQganNvbiJdID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7
Ci0gICAgalF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyAiIHdhcyBub3QgY2FsbGVkIiApOwot
ICAgIH0KLSAgICByZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKLSAgICB9OwogCi0gICAg
Ly8gZm9yY2UganNvbiBkYXRhVHlwZQotICAgIHMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7Citq
UXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Ny
b2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKKyAgICAibW91c2Vkb3duIG1vdXNldXAgbW91
c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisgICAg
ImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4
dG1lbnUiKS5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKIAotICAgIC8vIEluc3Rh
bGwgY2FsbGJhY2sKLSAgICBvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07Ci0g
ICAgd2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkgewotICAgIHJlc3BvbnNlQ29u
dGFpbmVyID0gYXJndW1lbnRzOworICAgIC8vIEhhbmRsZSBldmVudCBiaW5kaW5nCisgICAgalF1
ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CisgICAgICAgIHJldHVybiBh
cmd1bWVudHMubGVuZ3RoID4gMCA/CisgICAgICAgICAgICB0aGlzLm9uKCBuYW1lLCBudWxsLCBk
YXRhLCBmbiApIDoKKyAgICAgICAgICAgIHRoaXMudHJpZ2dlciggbmFtZSApOwogICAgIH07Cit9
KTsKIAotICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQot
ICAgIGpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHsKLSAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5n
IHZhbHVlCi0gICAgd2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuOwotCi0gICAg
Ly8gU2F2ZSBiYWNrIGFzIGZyZWUKLSAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewotICAg
IC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhp
bmdzIGFyb3VuZAotICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBD
YWxsYmFjazsKLQotICAgIC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UK
LSAgICBvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7Ci0gICAgfQotCi0gICAgLy8g
Q2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlCi0gICAgaWYg
KCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSAp
IHsKLSAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOwotICAgIH0KK2pR
dWVyeS5mbi5leHRlbmQoeworICAgIGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5P
dXQgfHwgZm5PdmVyICk7CisgICAgfSwKIAotICAgIHJlc3BvbnNlQ29udGFpbmVyID0gb3Zlcndy
aXR0ZW4gPSB1bmRlZmluZWQ7Ci0gICAgfSk7CisgICAgYmluZDogZnVuY3Rpb24oIHR5cGVzLCBk
YXRhLCBmbiApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBm
biApOworICAgIH0sCisgICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgeworICAgICAg
ICByZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOworICAgIH0sCiAKLSAgICAvLyBE
ZWxlZ2F0ZSB0byBzY3JpcHQKLSAgICByZXR1cm4gInNjcmlwdCI7CisgICAgZGVsZWdhdGU6IGZ1
bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgeworICAgICAgICByZXR1cm4gdGhp
cy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5kZWxlZ2F0
ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CisgICAgICAgIC8vICggbmFtZXNw
YWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dICkKKyAgICAgICAgcmV0dXJuIGFyZ3Vt
ZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6IHRoaXMub2Zm
KCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKICAgICB9CiB9KTsKLXZhciB4aHJDYWxs
YmFja3MsIHhoclN1cHBvcnRlZCwKLSAgICB4aHJJZCA9IDAsCi0gICAgLy8gIzUyODA6IEludGVy
bmV0IEV4cGxvcmVyIHdpbGwga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSBpZiB3ZSBkb24ndCBhYm9y
dCBvbiB1bmxvYWQKLSAgICB4aHJPblVubG9hZEFib3J0ID0gd2luZG93LkFjdGl2ZVhPYmplY3Qg
JiYgZnVuY3Rpb24oKSB7Ci0gICAgLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKLSAgICB2
YXIga2V5OwotICAgIGZvciAoIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7Ci0gICAgeGhyQ2FsbGJh
Y2tzWyBrZXkgXSggdW5kZWZpbmVkLCB0cnVlICk7Ci0gICAgfQotICAgIH07Ci0KLS8vIEZ1bmN0
aW9ucyB0byBjcmVhdGUgeGhycwotZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRYSFIoKSB7Ci0gICAg
dHJ5IHsKLSAgICByZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwotICAgIH0gY2F0
Y2goIGUgKSB7fQotfQotCi1mdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Ci0gICAgdHJ5IHsK
LSAgICByZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIp
OwotICAgIH0gY2F0Y2goIGUgKSB7fQotfQogCi0vLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0
Ci0vLyAoVGhpcyBpcyBzdGlsbCBhdHRhY2hlZCB0byBhamF4U2V0dGluZ3MgZm9yIGJhY2t3YXJk
IGNvbXBhdGliaWxpdHkpCi1qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVY
T2JqZWN0ID8KLSAgICAvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5Ci0gICAgICogaW1w
bGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcgKGNhbid0IHJlcXVlc3QgbG9jYWwgZmls
ZXMpLAotICAgICAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWls
YWJsZQotICAgICAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQg
aW4gSUU3L0lFOCBzbwotICAgICAqIHdlIG5lZWQgYSBmYWxsYmFjay4KLSAgICAgKi8KLSAgICBm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhI
UigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwotICAgIH0gOgotICAgIC8vIEZvciBhbGwgb3RoZXIg
YnJvd3NlcnMsIHVzZSB0aGUgc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0Ci0gICAgY3Jl
YXRlU3RhbmRhcmRYSFI7CiAKLS8vIERldGVybWluZSBzdXBwb3J0IHByb3BlcnRpZXMKLXhoclN1
cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7Ci1qUXVlcnkuc3VwcG9ydC5jb3Jz
ID0gISF4aHJTdXBwb3J0ZWQgJiYgKCAid2l0aENyZWRlbnRpYWxzIiBpbiB4aHJTdXBwb3J0ZWQg
KTsKLXhoclN1cHBvcnRlZCA9IGpRdWVyeS5zdXBwb3J0LmFqYXggPSAhIXhoclN1cHBvcnRlZDsK
K3ZhciBub25jZSA9IGpRdWVyeS5ub3coKTsKIAotLy8gQ3JlYXRlIHRyYW5zcG9ydCBpZiB0aGUg
YnJvd3NlciBjYW4gcHJvdmlkZSBhbiB4aHIKLWlmICggeGhyU3VwcG9ydGVkICkgewordmFyIHJx
dWVyeSA9ICgvXD8vKTsKIAotICAgIGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkg
ewotICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2gg
WE1MSHR0cFJlcXVlc3QKLSAgICBpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5zdXBwb3J0
LmNvcnMgKSB7CiAKLSAgICB2YXIgY2FsbGJhY2s7CiAKLSAgICByZXR1cm4gewotICAgIHNlbmQ6
IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKKy8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4z
CisvLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dAoralF1ZXJ5
LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAgIHJldHVybiBKU09OLnBhcnNlKCBk
YXRhICsgIiIgKTsKK307CiAKLSAgICAvLyBHZXQgYSBuZXcgeGhyCi0gICAgdmFyIGhhbmRsZSwg
aSwKLSAgICB4aHIgPSBzLnhocigpOwogCi0gICAgLy8gT3BlbiB0aGUgc29ja2V0Ci0gICAgLy8g
UGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAo
IzI4NjUpCi0gICAgaWYgKCBzLnVzZXJuYW1lICkgewotICAgIHhoci5vcGVuKCBzLnR5cGUsIHMu
dXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkICk7Ci0gICAgfSBlbHNlIHsKLSAg
ICB4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOworLy8gQ3Jvc3MtYnJvd3NlciB4
bWwgcGFyc2luZworalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7CisgICAgdmFy
IHhtbCwgdG1wOworICAgIGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkg
eworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICAvLyBBcHBseSBjdXN0b20gZmll
bGRzIGlmIHByb3ZpZGVkCi0gICAgaWYgKCBzLnhockZpZWxkcyApIHsKLSAgICBmb3IgKCBpIGlu
IHMueGhyRmllbGRzICkgewotICAgIHhoclsgaSBdID0gcy54aHJGaWVsZHNbIGkgXTsKLSAgICB9
CisgICAgLy8gU3VwcG9ydDogSUU5CisgICAgdHJ5IHsKKyAgICAgICAgdG1wID0gbmV3IERPTVBh
cnNlcigpOworICAgICAgICB4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94
bWwiICk7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAgIHhtbCA9IHVuZGVmaW5lZDsKICAg
ICB9CiAKLSAgICAvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkCi0gICAgaWYgKCBzLm1p
bWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkgewotICAgIHhoci5vdmVycmlkZU1pbWVU
eXBlKCBzLm1pbWVUeXBlICk7CisgICAgaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFn
TmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKKyAgICAgICAgalF1ZXJ5LmVycm9yKCAi
SW52YWxpZCBYTUw6ICIgKyBkYXRhICk7CiAgICAgfQorICAgIHJldHVybiB4bWw7Cit9OwogCi0g
ICAgLy8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXIKLSAgICAvLyBGb3IgY3Jvc3MtZG9tYWluIHJl
cXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCi0gICAgLy8g
YWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3Vy
ZS4KLSAgICAvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBv
ciBldmVuIHVzaW5nIGFqYXhTZXR1cCkKLSAgICAvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMs
IHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KLSAgICBpZiAoICFzLmNy
b3NzRG9tYWluICYmICFoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gKSB7Ci0gICAgaGVhZGVy
c1siWC1SZXF1ZXN0ZWQtV2l0aCJdID0gIlhNTEh0dHBSZXF1ZXN0IjsKLSAgICB9CiAKLSAgICAv
LyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZp
cmVmb3ggMwotICAgIHRyeSB7Ci0gICAgZm9yICggaSBpbiBoZWFkZXJzICkgewotICAgIHhoci5z
ZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKLSAgICB9Ci0gICAgfSBjYXRjaCgg
ZXJyICkge30KK3ZhcgorICAgIC8vIERvY3VtZW50IGxvY2F0aW9uCisgICAgYWpheExvY1BhcnRz
LAorICAgIGFqYXhMb2NhdGlvbiwKKworICAgIHJoYXNoID0gLyMuKiQvLAorICAgIHJ0cyA9IC8o
Wz8mXSlfPVteJl0qLywKKyAgICByaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQv
bWcsCisgICAgLy8gIzc2NTMsICM4MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9u
CisgICAgcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRl
bnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKKyAgICBybm9Db250ZW50ID0gL14oPzpHRVR8SEVB
RCkkLywKKyAgICBycHJvdG9jb2wgPSAvXlwvXC8vLAorICAgIHJ1cmwgPSAvXihbXHcuKy1dKzop
KD86XC9cLyg/OlteXC8/I10qQHwpKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLywKIAotICAgIC8v
IERvIHNlbmQgdGhlIHJlcXVlc3QKLSAgICAvLyBUaGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24g
d2hpY2ggaXMgYWN0dWFsbHkKLSAgICAvLyBoYW5kbGVkIGluIGpRdWVyeS5hamF4IChzbyBubyB0
cnkvY2F0Y2ggaGVyZSkKLSAgICB4aHIuc2VuZCggKCBzLmhhc0NvbnRlbnQgJiYgcy5kYXRhICkg
fHwgbnVsbCApOworICAgIC8qIFByZWZpbHRlcnMKKyAgICAgKiAxKSBUaGV5IGFyZSB1c2VmdWwg
dG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBl
eGFtcGxlKQorICAgICAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CisgICAgICogICAgLSBCRUZPUkUg
YXNraW5nIGZvciBhIHRyYW5zcG9ydAorICAgICAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXph
dGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSkKKyAgICAg
KiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCisgICAgICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCAi
KiIgY2FuIGJlIHVzZWQKKyAgICAgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5z
cG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIqIiBpZiBuZWVkZWQKKyAg
ICAgKi8KKyAgICBwcmVmaWx0ZXJzID0ge30sCiAKLSAgICAvLyBMaXN0ZW5lcgotICAgIGNhbGxi
YWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7Ci0gICAgdmFyIHN0YXR1cywgcmVzcG9uc2VI
ZWFkZXJzLCBzdGF0dXNUZXh0LCByZXNwb25zZXM7CisgICAgLyogVHJhbnNwb3J0cyBiaW5kaW5n
cworICAgICAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKKyAgICAgKiAyKSB0aGUgY2F0Y2hhbGwg
c3ltYm9sICIqIiBjYW4gYmUgdXNlZAorICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdp
dGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKyAgICAg
Ki8KKyAgICB0cmFuc3BvcnRzID0ge30sCiAKLSAgICAvLyBGaXJlZm94IHRocm93cyBleGNlcHRp
b25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMKLSAgICAvLyBvZiBhbiB4aHIgd2hlbiBhIG5l
dHdvcmsgZXJyb3Igb2NjdXJyZWQKLSAgICAvLyBodHRwOi8vaGVscGZ1bC5rbm9icy1kaWFscy5j
b20vaW5kZXgucGhwL0NvbXBvbmVudF9yZXR1cm5lZF9mYWlsdXJlX2NvZGU6XzB4ODAwNDAxMTFf
KE5TX0VSUk9SX05PVF9BVkFJTEFCTEUpCi0gICAgdHJ5IHsKKyAgICAvLyBBdm9pZCBjb21tZW50
LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZh
ZGUgY29tcHJlc3Npb24KKyAgICBhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCIqIik7CiAKLSAgICAv
LyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCi0gICAgaWYgKCBj
YWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSApIHsKKy8vICM4
MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCisvLyBhIGZpZWxk
IGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKK3Ry
eSB7CisgICAgYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsKK30gY2F0Y2goIGUgKSB7Cisg
ICAgLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKKyAgICAvLyBzaW5j
ZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgorICAgIGFqYXhMb2Nh
dGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOworICAgIGFqYXhMb2NhdGlvbi5o
cmVmID0gIiI7CisgICAgYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Cit9CiAKLSAg
ICAvLyBPbmx5IGNhbGxlZCBvbmNlCi0gICAgY2FsbGJhY2sgPSB1bmRlZmluZWQ7CisvLyBTZWdt
ZW50IGxvY2F0aW9uIGludG8gcGFydHMKK2FqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExv
Y2F0aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTsKIAotICAgIC8vIERvIG5vdCBrZWVwIGFzIGFj
dGl2ZSBhbnltb3JlCi0gICAgaWYgKCBoYW5kbGUgKSB7Ci0gICAgeGhyLm9ucmVhZHlzdGF0ZWNo
YW5nZSA9IGpRdWVyeS5ub29wOwotICAgIGlmICggeGhyT25VbmxvYWRBYm9ydCApIHsKLSAgICBk
ZWxldGUgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXTsKLSAgICB9Ci0gICAgfQorLy8gQmFzZSAiY29u
c3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3Bv
cnQKK2Z1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkgewog
Ci0gICAgLy8gSWYgaXQncyBhbiBhYm9ydAotICAgIGlmICggaXNBYm9ydCApIHsKLSAgICAvLyBB
Ym9ydCBpdCBtYW51YWxseSBpZiBuZWVkZWQKLSAgICBpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0
ICkgewotICAgIHhoci5hYm9ydCgpOwotICAgIH0KLSAgICB9IGVsc2UgewotICAgIHJlc3BvbnNl
cyA9IHt9OwotICAgIHN0YXR1cyA9IHhoci5zdGF0dXM7Ci0gICAgcmVzcG9uc2VIZWFkZXJzID0g
eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpOworICAgIC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBp
cyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIioiCisgICAgcmV0dXJuIGZ1bmN0aW9uKCBkYXRh
VHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7CiAKLSAgICAvLyBXaGVuIHJlcXVlc3RpbmcgYmluYXJ5
IGRhdGEsIElFNi05IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgLy8gb24gYW55IGF0dGVt
cHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQotICAgIGlmICggdHlwZW9mIHhoci5y
ZXNwb25zZVRleHQgPT09ICJzdHJpbmciICkgewotICAgIHJlc3BvbnNlcy50ZXh0ID0geGhyLnJl
c3BvbnNlVGV4dDsKLSAgICB9CisgICAgICAgIGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lv
biAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9u
OworICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOworICAgICAgICB9CisKKyAg
ICAgICAgdmFyIGRhdGFUeXBlLAorICAgICAgICAgICAgaSA9IDAsCisgICAgICAgICAgICBkYXRh
VHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRl
ICkgfHwgW107CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkgewor
ICAgICAgICAgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lv
bgorICAgICAgICAgICAgd2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7Cisg
ICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICBp
ZiAoIGRhdGFUeXBlWzBdID09PSAiKyIgKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBl
ID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCAiKiI7CisgICAgICAgICAgICAgICAgICAgIChzdHJ1
Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVuc2hpZnQo
IGZ1bmMgKTsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAoc3RydWN0dXJlWyBkYXRhVHlw
ZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KIAotICAgIC8v
IEZpcmVmb3ggdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwotICAgIC8vIHN0YXR1
c1RleHQgZm9yIGZhdWx0eSBjcm9zcy1kb21haW4gcmVxdWVzdHMKLSAgICB0cnkgewotICAgIHN0
YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dDsKLSAgICB9IGNhdGNoKCBlICkgewotICAgIC8vIFdl
IG5vcm1hbGl6ZSB3aXRoIFdlYmtpdCBnaXZpbmcgYW4gZW1wdHkgc3RhdHVzVGV4dAotICAgIHN0
YXR1c1RleHQgPSAiIjsKLSAgICB9CisvLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHBy
ZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFu
c3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7CiAK
LSAgICAvLyBGaWx0ZXIgc3RhdHVzIGZvciBub24gc3RhbmRhcmQgYmVoYXZpb3JzCisgICAgdmFy
IGluc3BlY3RlZCA9IHt9LAorICAgICAgICBzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUg
PT09IHRyYW5zcG9ydHMgKTsKIAotICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3
ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKLSAgICAvLyAoc3VjY2VzcyB3aXRoIG5vIGRh
dGEgd29uJ3QgZ2V0IG5vdGlmaWVkLCB0aGF0J3MgdGhlIGJlc3Qgd2UKLSAgICAvLyBjYW4gZG8g
Z2l2ZW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbnMpCi0gICAgaWYgKCAhc3RhdHVzICYmIHMuaXNM
b2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKLSAgICBzdGF0dXMgPSByZXNwb25zZXMudGV4dCA/
IDIwMCA6IDQwNDsKLSAgICAvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdo
ZW4gaXQgc2hvdWxkIGJlIDIwNAotICAgIH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHsK
LSAgICBzdGF0dXMgPSAyMDQ7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfSBjYXRjaCggZmly
ZWZveEFjY2Vzc0V4Y2VwdGlvbiApIHsKLSAgICBpZiAoICFpc0Fib3J0ICkgewotICAgIGNvbXBs
ZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwotICAgIH0KKyAgICBmdW5jdGlvbiBp
bnNwZWN0KCBkYXRhVHlwZSApIHsKKyAgICAgICAgdmFyIHNlbGVjdGVkOworICAgICAgICBpbnNw
ZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOworICAgICAgICBqUXVlcnkuZWFjaCggc3RydWN0dXJl
WyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkgewor
ICAgICAgICAgICAgdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3Rvcnko
IG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKKyAgICAgICAgICAgIGlmICggdHlw
ZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09ICJzdHJpbmciICYmICFzZWVraW5nVHJhbnNwb3J0
ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKKyAgICAgICAgICAgICAg
ICBvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CisgICAg
ICAgICAgICAgICAgaW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOworICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3Bv
cnQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRy
YW5zcG9ydCApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHNl
bGVjdGVkOwogICAgIH0KIAotICAgIC8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkCi0gICAgaWYg
KCByZXNwb25zZXMgKSB7Ci0gICAgY29tcGxldGUoIHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9u
c2VzLCByZXNwb25zZUhlYWRlcnMgKTsKLSAgICB9Ci0gICAgfTsKKyAgICByZXR1cm4gaW5zcGVj
dCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbICIqIiBdICYmIGluc3Bl
Y3QoICIqIiApOworfQogCi0gICAgaWYgKCAhcy5hc3luYyApIHsKLSAgICAvLyBpZiB3ZSdyZSBp
biBzeW5jIG1vZGUgd2UgZmlyZSB0aGUgY2FsbGJhY2sKLSAgICBjYWxsYmFjaygpOwotICAgIH0g
ZWxzZSBpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkgewotICAgIC8vIChJRTYgJiBJRTcpIGlm
IGl0J3MgaW4gY2FjaGUgYW5kIGhhcyBiZWVuCi0gICAgLy8gcmV0cmlldmVkIGRpcmVjdGx5IHdl
IG5lZWQgdG8gZmlyZSB0aGUgY2FsbGJhY2sKLSAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApOwot
ICAgIH0gZWxzZSB7Ci0gICAgaGFuZGxlID0gKyt4aHJJZDsKLSAgICBpZiAoIHhock9uVW5sb2Fk
QWJvcnQgKSB7Ci0gICAgLy8gQ3JlYXRlIHRoZSBhY3RpdmUgeGhycyBjYWxsYmFja3MgbGlzdCBp
ZiBuZWVkZWQKLSAgICAvLyBhbmQgYXR0YWNoIHRoZSB1bmxvYWQgaGFuZGxlcgotICAgIGlmICgg
IXhockNhbGxiYWNrcyApIHsKLSAgICB4aHJDYWxsYmFja3MgPSB7fTsKLSAgICBqUXVlcnkoIHdp
bmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwotICAgIH0KLSAgICAvLyBBZGQgdG8g
bGlzdCBvZiBhY3RpdmUgeGhycyBjYWxsYmFja3MKLSAgICB4aHJDYWxsYmFja3NbIGhhbmRsZSBd
ID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBjYWxsYmFj
azsKLSAgICB9Ci0gICAgfSwKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwor
Ly8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCisv
LyBGaXhlcyAjOTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7CisgICAg
dmFyIGtleSwgZGVlcCwKKyAgICAgICAgZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdz
LmZsYXRPcHRpb25zIHx8IHt9OwogCi0gICAgYWJvcnQ6IGZ1bmN0aW9uKCkgewotICAgIGlmICgg
Y2FsbGJhY2sgKSB7Ci0gICAgY2FsbGJhY2soIHVuZGVmaW5lZCwgdHJ1ZSApOwotICAgIH0KKyAg
ICBmb3IgKCBrZXkgaW4gc3JjICkgeworICAgICAgICBpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVm
aW5lZCApIHsKKyAgICAgICAgICAgICggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBk
ZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOworICAgICAgICB9CiAg
ICAgfQotICAgIH07CisgICAgaWYgKCBkZWVwICkgeworICAgICAgICBqUXVlcnkuZXh0ZW5kKCB0
cnVlLCB0YXJnZXQsIGRlZXAgKTsKICAgICB9Ci0gICAgfSk7Ci19Ci12YXIgZnhOb3csIHRpbWVy
SWQsCi0gICAgcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCi0gICAgcmZ4bnVt
ID0gbmV3IFJlZ0V4cCggIl4oPzooWystXSk9fCkoIiArIGNvcmVfcG51bSArICIpKFthLXolXSop
JCIsICJpIiApLAotICAgIHJydW4gPSAvcXVldWVIb29rcyQvLAotICAgIGFuaW1hdGlvblByZWZp
bHRlcnMgPSBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKLSAgICB0d2VlbmVycyA9IHsKLSAgICAiKiI6
IFtmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7Ci0gICAgdmFyIGVuZCwgdW5pdCwKLSAgICB0d2Vl
biA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksCi0gICAgcGFydHMgPSByZnhudW0u
ZXhlYyggdmFsdWUgKSwKLSAgICB0YXJnZXQgPSB0d2Vlbi5jdXIoKSwKLSAgICBzdGFydCA9ICt0
YXJnZXQgfHwgMCwKLSAgICBzY2FsZSA9IDEsCi0gICAgbWF4SXRlcmF0aW9ucyA9IDIwOwotCi0g
ICAgaWYgKCBwYXJ0cyApIHsKLSAgICBlbmQgPSArcGFydHNbMl07Ci0gICAgdW5pdCA9IHBhcnRz
WzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Ci0KLSAgICAv
LyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKLSAgICBpZiAoIHVuaXQgIT09ICJw
eCIgJiYgc3RhcnQgKSB7Ci0gICAgLy8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5v
bnplcm8gc3RhcnRpbmcgcG9pbnQKLSAgICAvLyBQcmVmZXIgdGhlIGN1cnJlbnQgcHJvcGVydHks
IGJlY2F1c2UgdGhpcyBwcm9jZXNzIHdpbGwgYmUgdHJpdmlhbCBpZiBpdCB1c2VzIHRoZSBzYW1l
IHVuaXRzCi0gICAgLy8gRmFsbGJhY2sgdG8gZW5kIG9yIGEgc2ltcGxlIGNvbnN0YW50Ci0gICAg
c3RhcnQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wLCB0cnVlICkgfHwgZW5kIHx8IDE7
Ci0KLSAgICBkbyB7Ci0gICAgLy8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRv
dWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyoKLSAgICAvLyBVc2UgYSBzdHJpbmcgZm9yIGRv
dWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hh
bmdlZCBiZWxvdwotICAgIHNjYWxlID0gc2NhbGUgfHwgIi41IjsKLQotICAgIC8vIEFkanVzdCBh
bmQgYXBwbHkKLSAgICBzdGFydCA9IHN0YXJ0IC8gc2NhbGU7Ci0gICAgalF1ZXJ5LnN0eWxlKCB0
d2Vlbi5lbGVtLCBwcm9wLCBzdGFydCArIHVuaXQgKTsKLQotICAgIC8vIFVwZGF0ZSBzY2FsZSwg
dG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpCi0gICAgLy8gQW5kIGJyZWFr
aW5nIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2
ZSBqdXN0IGhhZCBlbm91Z2gKLSAgICB9IHdoaWxlICggc2NhbGUgIT09IChzY2FsZSA9IHR3ZWVu
LmN1cigpIC8gdGFyZ2V0KSAmJiBzY2FsZSAhPT0gMSAmJiAtLW1heEl0ZXJhdGlvbnMgKTsKLSAg
ICB9Ci0KLSAgICB0d2Vlbi51bml0ID0gdW5pdDsKLSAgICB0d2Vlbi5zdGFydCA9IHN0YXJ0Owot
ICAgIC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0
aXZlIGFuaW1hdGlvbgotICAgIHR3ZWVuLmVuZCA9IHBhcnRzWzFdID8gc3RhcnQgKyAoIHBhcnRz
WzFdICsgMSApICogZW5kIDogZW5kOwotICAgIH0KLSAgICByZXR1cm4gdHdlZW47Ci0gICAgfV0K
LSAgICB9OwogCi0vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBz
eW5jaHJvbm91c2x5Ci1mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKLSAgICBzZXRUaW1lb3V0KGZ1
bmN0aW9uKCkgewotICAgIGZ4Tm93ID0gdW5kZWZpbmVkOwotICAgIH0pOwotICAgIHJldHVybiAo
IGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7CisgICAgcmV0dXJuIHRhcmdldDsKIH0KIAotZnVuY3Rp
b24gY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICkgewotICAgIGpRdWVyeS5lYWNoKCBw
cm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewotICAgIHZhciBjb2xsZWN0aW9uID0gKCB0
d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKLSAgICBp
bmRleCA9IDAsCi0gICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7Ci0gICAgZm9yICggOyBp
bmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKLSAgICBpZiAoIGNvbGxlY3Rpb25bIGluZGV4IF0u
Y2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgeworLyogSGFuZGxlcyByZXNwb25zZXMg
dG8gYW4gYWpheCByZXF1ZXN0OgorICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlh
dGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKKyAqIC0gcmV0
dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQorICovCitmdW5jdGlvbiBhamF4SGFuZGxl
UmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkgewogCi0gICAgLy8gd2UncmUgZG9uZSB3
aXRoIHRoaXMgcHJvcGVydHkKLSAgICByZXR1cm47Ci0gICAgfQotICAgIH0KLSAgICB9KTsKLX0K
KyAgICB2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCisgICAgICAg
IGNvbnRlbnRzID0gcy5jb250ZW50cywKKyAgICAgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7
CiAKLWZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKLSAg
ICB2YXIgcmVzdWx0LAotICAgIHN0b3BwZWQsCi0gICAgaW5kZXggPSAwLAotICAgIGxlbmd0aCA9
IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLAotICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVy
cmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKLSAgICAvLyBkb24ndCBtYXRjaCBlbGVtIGluIHRo
ZSA6YW5pbWF0ZWQgc2VsZWN0b3IKLSAgICBkZWxldGUgdGljay5lbGVtOwotICAgIH0pLAotICAg
IHRpY2sgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoIHN0b3BwZWQgKSB7Ci0gICAgcmV0dXJuIGZh
bHNlOworICAgIC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGlu
IHRoZSBwcm9jZXNzCisgICAgd2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkgeworICAg
ICAgICBkYXRhVHlwZXMuc2hpZnQoKTsKKyAgICAgICAgaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkg
eworICAgICAgICAgICAgY3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVy
KCJDb250ZW50LVR5cGUiKTsKKyAgICAgICAgfQogICAgIH0KLSAgICB2YXIgY3VycmVudFRpbWUg
PSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAotICAgIHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBh
bmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSwK
LSAgICAvLyBhcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgMSAtICggMC41
IHx8IDAgKSAoIzEyNDk3KQotICAgIHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRp
b24gfHwgMCwKLSAgICBwZXJjZW50ID0gMSAtIHRlbXAsCi0gICAgaW5kZXggPSAwLAotICAgIGxl
bmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwogCi0gICAgZm9yICggOyBpbmRleCA8IGxl
bmd0aCA7IGluZGV4KysgKSB7Ci0gICAgYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBl
cmNlbnQgKTsKKyAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250
ZW50LXR5cGUKKyAgICBpZiAoIGN0ICkgeworICAgICAgICBmb3IgKCB0eXBlIGluIGNvbnRlbnRz
ICkgeworICAgICAgICAgICAgaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBl
IF0udGVzdCggY3QgKSApIHsKKyAgICAgICAgICAgICAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlw
ZSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAg
ICAgfQogCi0gICAgZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNl
bnQsIHJlbWFpbmluZyBdKTsKLQotICAgIGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkgewot
ICAgIHJldHVybiByZW1haW5pbmc7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBy
ZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisgICAgaWYgKCBkYXRhVHlwZXNbIDAg
XSBpbiByZXNwb25zZXMgKSB7CisgICAgICAgIGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAg
XTsKICAgICB9IGVsc2UgewotICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1h
dGlvbiBdICk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB9LAotICAgIGFuaW1hdGlv
biA9IGRlZmVycmVkLnByb21pc2UoewotICAgIGVsZW06IGVsZW0sCi0gICAgcHJvcHM6IGpRdWVy
eS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCi0gICAgb3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1
ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksCi0gICAgb3JpZ2luYWxQcm9wZXJ0
aWVzOiBwcm9wZXJ0aWVzLAotICAgIG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucywKLSAgICBzdGFy
dFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCi0gICAgZHVyYXRpb246IG9wdGlvbnMuZHVy
YXRpb24sCi0gICAgdHdlZW5zOiBbXSwKLSAgICBjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3As
IGVuZCApIHsKLSAgICB2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5v
cHRzLCBwcm9wLCBlbmQsCi0gICAgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBd
IHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApOwotICAgIGFuaW1hdGlvbi50d2VlbnMucHVzaCgg
dHdlZW4gKTsKLSAgICByZXR1cm4gdHdlZW47Ci0gICAgfSwKLSAgICBzdG9wOiBmdW5jdGlvbigg
Z290b0VuZCApIHsKLSAgICB2YXIgaW5kZXggPSAwLAotICAgIC8vIGlmIHdlIGFyZSBnb2luZyB0
byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucwotICAgIC8vIG90aGVyd2lz
ZSB3ZSBza2lwIHRoaXMgcGFydAotICAgIGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdl
ZW5zLmxlbmd0aCA6IDA7Ci0gICAgaWYgKCBzdG9wcGVkICkgewotICAgIHJldHVybiB0aGlzOwot
ICAgIH0KLSAgICBzdG9wcGVkID0gdHJ1ZTsKLSAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsg
aW5kZXgrKyApIHsKLSAgICBhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOworICAg
ICAgICAvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCisgICAgICAgIGZvciAoIHR5cGUgaW4g
cmVzcG9uc2VzICkgeworICAgICAgICAgICAgaWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252
ZXJ0ZXJzWyB0eXBlICsgIiAiICsgZGF0YVR5cGVzWzBdIF0gKSB7CisgICAgICAgICAgICAgICAg
ZmluYWxEYXRhVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAoICFmaXJzdERhdGFUeXBlICkgeworICAgICAgICAgICAgICAg
IGZpcnN0RGF0YVR5cGUgPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQorICAgICAgICBmaW5hbERhdGFUeXBlID0gZmluYWxE
YXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlOwogICAgIH0KIAotICAgIC8vIHJlc29sdmUgd2hlbiB3
ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKLSAgICAvLyBvdGhlcndpc2UsIHJlamVjdAotICAgIGlm
ICggZ290b0VuZCApIHsKLSAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRp
b24sIGdvdG9FbmQgXSApOwotICAgIH0gZWxzZSB7Ci0gICAgZGVmZXJyZWQucmVqZWN0V2l0aCgg
ZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOwotICAgIH0KLSAgICByZXR1cm4gdGhpczsK
KyAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCisgICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlw
ZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKKyAgICAvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25k
aW5nIHJlc3BvbnNlCisgICAgaWYgKCBmaW5hbERhdGFUeXBlICkgeworICAgICAgICBpZiAoIGZp
bmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgeworICAgICAgICAgICAgZGF0YVR5cGVz
LnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVz
cG9uc2VzWyBmaW5hbERhdGFUeXBlIF07CiAgICAgfQotICAgIH0pLAotICAgIHByb3BzID0gYW5p
bWF0aW9uLnByb3BzOworfQogCi0gICAgcHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRz
LnNwZWNpYWxFYXNpbmcgKTsKKy8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0
IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKKyAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFgg
ZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZQorICovCitmdW5jdGlvbiBhamF4Q29udmVydCgg
cywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7CisgICAgdmFyIGNvbnYyLCBjdXJyZW50
LCBjb252LCB0bXAsIHByZXYsCisgICAgICAgIGNvbnZlcnRlcnMgPSB7fSwKKyAgICAgICAgLy8g
V29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBp
dCBmb3IgY29udmVyc2lvbgorICAgICAgICBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgp
OwogCi0gICAgZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7Ci0gICAgcmVzdWx0
ID0gYW5pbWF0aW9uUHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHBy
b3BzLCBhbmltYXRpb24ub3B0cyApOwotICAgIGlmICggcmVzdWx0ICkgewotICAgIHJldHVybiBy
ZXN1bHQ7Ci0gICAgfQorICAgIC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2Fz
ZWQga2V5cworICAgIGlmICggZGF0YVR5cGVzWyAxIF0gKSB7CisgICAgICAgIGZvciAoIGNvbnYg
aW4gcy5jb252ZXJ0ZXJzICkgeworICAgICAgICAgICAgY29udmVydGVyc1sgY29udi50b0xvd2Vy
Q2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKKworICAgIC8vIENvbnZlcnQgdG8gZWFjaCBz
ZXF1ZW50aWFsIGRhdGFUeXBlCisgICAgd2hpbGUgKCBjdXJyZW50ICkgeworCisgICAgICAgIGlm
ICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgeworICAgICAgICAgICAganFYSFJbIHMu
cmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZAorICAgICAgICBpZiAoICFw
cmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7CisgICAgICAgICAgICByZXNwb25z
ZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHByZXYgPSBjdXJyZW50OworICAgICAgICBjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0
KCk7CisKKyAgICAgICAgaWYgKCBjdXJyZW50ICkgeworCisgICAgICAgIC8vIFRoZXJlJ3Mgb25s
eSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8KKyAgICAgICAgICAg
IGlmICggY3VycmVudCA9PT0gIioiICkgeworCisgICAgICAgICAgICAgICAgY3VycmVudCA9IHBy
ZXY7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBp
cyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkgeworCisgICAgICAgICAgICAg
ICAgLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKKyAgICAgICAgICAgICAgICBjb252ID0gY29u
dmVydGVyc1sgcHJldiArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3Vy
cmVudCBdOworCisgICAgICAgICAgICAgICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIK
KyAgICAgICAgICAgICAgICBpZiAoICFjb252ICkgeworICAgICAgICAgICAgICAgICAgICBmb3Ig
KCBjb252MiBpbiBjb252ZXJ0ZXJzICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiBjb252MiBvdXRwdXRzIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGNv
bnYyLnNwbGl0KCAiICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG1wWyAxIF0g
PT09IGN1cnJlbnQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmV2
IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBd
IF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb252ICkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJz
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJzWyBj
b252MiBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwg
aW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBb
IDEgXSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90
IGFuIGVxdWl2YWxlbmNlKQorICAgICAgICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsK
KworICAgICAgICAgICAgICAgICAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1
YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtCisgICAgICAgICAgICAgICAgICAgIGlmICggY29u
diAmJiBzWyAidGhyb3dzIiBdICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Ug
PSBjb252KCByZXNwb25zZSApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNw
b25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNo
ICggZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogInBh
cnNlcmVycm9yIiwgZXJyb3I6IGNvbnYgPyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgcHJl
diArICIgdG8gIiArIGN1cnJlbnQgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQogICAgIH0KIAotICAgIGNyZWF0ZVR3ZWVucyggYW5pbWF0aW9uLCBwcm9wcyApOwotCi0g
ICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKLSAg
ICBhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKLSAgICB9Cisg
ICAgcmV0dXJuIHsgc3RhdGU6ICJzdWNjZXNzIiwgZGF0YTogcmVzcG9uc2UgfTsKK30KIAotICAg
IGpRdWVyeS5meC50aW1lcigKLSAgICBqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7Ci0gICAgZWxlbTog
ZWxlbSwKLSAgICBhbmltOiBhbmltYXRpb24sCi0gICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1
ZXVlCi0gICAgfSkKLSAgICApOworalF1ZXJ5LmV4dGVuZCh7CiAKLSAgICAvLyBhdHRhY2ggY2Fs
bGJhY2tzIGZyb20gb3B0aW9ucwotICAgIHJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFuaW1h
dGlvbi5vcHRzLnByb2dyZXNzICkKLSAgICAuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5p
bWF0aW9uLm9wdHMuY29tcGxldGUgKQotICAgIC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkK
LSAgICAuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKLX0KKyAgICAvLyBDb3VudGVy
IGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKyAgICBhY3RpdmU6IDAs
CiAKLWZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewotICAgIHZh
ciB2YWx1ZSwgbmFtZSwgaW5kZXgsIGVhc2luZywgaG9va3M7CisgICAgLy8gTGFzdC1Nb2RpZmll
ZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAorICAgIGxhc3RNb2RpZmllZDoge30sCisg
ICAgZXRhZzoge30sCiAKLSAgICAvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFu
ZCBjc3NIb29rIHBhc3MKLSAgICBmb3IgKCBpbmRleCBpbiBwcm9wcyApIHsKLSAgICBuYW1lID0g
alF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKLSAgICBlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBu
YW1lIF07Ci0gICAgdmFsdWUgPSBwcm9wc1sgaW5kZXggXTsKLSAgICBpZiAoIGpRdWVyeS5pc0Fy
cmF5KCB2YWx1ZSApICkgewotICAgIGVhc2luZyA9IHZhbHVlWyAxIF07Ci0gICAgdmFsdWUgPSBw
cm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07Ci0gICAgfQorICAgIGFqYXhTZXR0aW5nczogewor
ICAgICAgICB1cmw6IGFqYXhMb2NhdGlvbiwKKyAgICAgICAgdHlwZTogIkdFVCIsCisgICAgICAg
IGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksCisgICAg
ICAgIGdsb2JhbDogdHJ1ZSwKKyAgICAgICAgcHJvY2Vzc0RhdGE6IHRydWUsCisgICAgICAgIGFz
eW5jOiB0cnVlLAorICAgICAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0t
dXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisgICAgICAgIC8qCisgICAgICAgIHRpbWVvdXQ6
IDAsCisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIGRhdGFUeXBlOiBudWxsLAorICAgICAg
ICB1c2VybmFtZTogbnVsbCwKKyAgICAgICAgcGFzc3dvcmQ6IG51bGwsCisgICAgICAgIGNhY2hl
OiBudWxsLAorICAgICAgICB0aHJvd3M6IGZhbHNlLAorICAgICAgICB0cmFkaXRpb25hbDogZmFs
c2UsCisgICAgICAgIGhlYWRlcnM6IHt9LAorICAgICAgICAqLworCisgICAgICAgIGFjY2VwdHM6
IHsKKyAgICAgICAgICAgICIqIjogYWxsVHlwZXMsCisgICAgICAgICAgICB0ZXh0OiAidGV4dC9w
bGFpbiIsCisgICAgICAgICAgICBodG1sOiAidGV4dC9odG1sIiwKKyAgICAgICAgICAgIHhtbDog
ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorICAgICAgICAgICAganNvbjogImFwcGxpY2F0
aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIKKyAgICAgICAgfSwKKworICAgICAgICBjb250ZW50
czogeworICAgICAgICAgICAgeG1sOiAveG1sLywKKyAgICAgICAgICAgIGh0bWw6IC9odG1sLywK
KyAgICAgICAgICAgIGpzb246IC9qc29uLworICAgICAgICB9LAorCisgICAgICAgIHJlc3BvbnNl
RmllbGRzOiB7CisgICAgICAgICAgICB4bWw6ICJyZXNwb25zZVhNTCIsCisgICAgICAgICAgICB0
ZXh0OiAicmVzcG9uc2VUZXh0IiwKKyAgICAgICAgICAgIGpzb246ICJyZXNwb25zZUpTT04iCisg
ICAgICAgIH0sCisKKyAgICAgICAgLy8gRGF0YSBjb252ZXJ0ZXJzCisgICAgICAgIC8vIEtleXMg
c2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCAiKiIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3
aXRoIGEgc2luZ2xlIHNwYWNlCisgICAgICAgIGNvbnZlcnRlcnM6IHsKKworICAgICAgICAgICAg
Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0CisgICAgICAgICAgICAiKiB0ZXh0IjogU3RyaW5n
LAorCisgICAgICAgICAgICAvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlv
bikKKyAgICAgICAgICAgICJ0ZXh0IGh0bWwiOiB0cnVlLAorCisgICAgICAgICAgICAvLyBFdmFs
dWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCisgICAgICAgICAgICAidGV4dCBqc29uIjog
alF1ZXJ5LnBhcnNlSlNPTiwKKworICAgICAgICAgICAgLy8gUGFyc2UgdGV4dCBhcyB4bWwKKyAg
ICAgICAgICAgICJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAorICAgICAgICB9LAorCisgICAg
ICAgIC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CisgICAg
ICAgIC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKyAgICAg
ICAgLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKKyAgICAgICAg
Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCisgICAgICAgIGZsYXRPcHRpb25zOiB7
CisgICAgICAgICAgICB1cmw6IHRydWUsCisgICAgICAgICAgICBjb250ZXh0OiB0cnVlCisgICAg
ICAgIH0KKyAgICB9LAogCi0gICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKLSAgICBwcm9wc1sg
bmFtZSBdID0gdmFsdWU7Ci0gICAgZGVsZXRlIHByb3BzWyBpbmRleCBdOwotICAgIH0KKyAgICAv
LyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAorICAg
IC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KKyAgICAvLyBJ
ZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLgorICAgIGFqYXhT
ZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CisgICAgICAgIHJldHVybiBzZXR0
aW5ncyA/CiAKLSAgICBob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdOwotICAgIGlmICgg
aG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7Ci0gICAgdmFsdWUgPSBob29rcy5leHBhbmQo
IHZhbHVlICk7Ci0gICAgZGVsZXRlIHByb3BzWyBuYW1lIF07CisgICAgICAgICAgICAvLyBCdWls
ZGluZyBhIHNldHRpbmdzIG9iamVjdAorICAgICAgICAgICAgYWpheEV4dGVuZCggYWpheEV4dGVu
ZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOgogCi0gICAgLy8g
bm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbnQgb3ZlcndyaXRlIGtleXMgYWxyZWFkeSBwcmVz
ZW50LgotICAgIC8vIGFsc28gLSByZXVzaW5nICdpbmRleCcgZnJvbSBhYm92ZSBiZWNhdXNlIHdl
IGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCi0gICAgZm9yICggaW5kZXggaW4gdmFsdWUgKSB7Ci0g
ICAgaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewotICAgIHByb3BzWyBpbmRleCBdID0gdmFs
dWVbIGluZGV4IF07Ci0gICAgc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKLSAgICB9
Ci0gICAgfQotICAgIH0gZWxzZSB7Ci0gICAgc3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5n
OwotICAgIH0KLSAgICB9Ci19CisgICAgICAgICAgICAvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdz
CisgICAgICAgICAgICBhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTsK
KyAgICB9LAogCi1qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7
CisgICAgYWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0
ZXJzICksCisgICAgYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0
cmFuc3BvcnRzICksCiAKLSAgICB0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkg
ewotICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7Ci0gICAgY2FsbGJhY2sg
PSBwcm9wczsKLSAgICBwcm9wcyA9IFsgIioiIF07Ci0gICAgfSBlbHNlIHsKLSAgICBwcm9wcyA9
IHByb3BzLnNwbGl0KCIgIik7Ci0gICAgfQorICAgIC8vIE1haW4gbWV0aG9kCisgICAgYWpheDog
ZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHsKIAotICAgIHZhciBwcm9wLAotICAgIGluZGV4ID0g
MCwKLSAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisgICAgICAgIC8vIElmIHVybCBpcyBhbiBv
YmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCisgICAgICAgIGlmICggdHlwZW9mIHVy
bCA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgICAgICBvcHRpb25zID0gdXJsOworICAgICAgICAg
ICAgdXJsID0gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2Ugb3B0aW9u
cyB0byBiZSBhbiBvYmplY3QKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAg
ICAgICAgdmFyIHRyYW5zcG9ydCwKKyAgICAgICAgICAgIC8vIFVSTCB3aXRob3V0IGFudGktY2Fj
aGUgcGFyYW0KKyAgICAgICAgICAgIGNhY2hlVVJMLAorICAgICAgICAgICAgLy8gUmVzcG9uc2Ug
aGVhZGVycworICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAorICAgICAgICAgICAg
cmVzcG9uc2VIZWFkZXJzLAorICAgICAgICAgICAgLy8gdGltZW91dCBoYW5kbGUKKyAgICAgICAg
ICAgIHRpbWVvdXRUaW1lciwKKyAgICAgICAgICAgIC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24g
dmFycworICAgICAgICAgICAgcGFydHMsCisgICAgICAgICAgICAvLyBUbyBrbm93IGlmIGdsb2Jh
bCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgICAgIGZpcmVHbG9iYWxzLAor
ICAgICAgICAgICAgLy8gTG9vcCB2YXJpYWJsZQorICAgICAgICAgICAgaSwKKyAgICAgICAgICAg
IC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKKyAgICAgICAgICAgIHMgPSBqUXVl
cnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLAorICAgICAgICAgICAgLy8gQ2FsbGJhY2tzIGNv
bnRleHQKKyAgICAgICAgICAgIGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAorICAg
ICAgICAgICAgLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQg
aWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgorICAgICAgICAgICAgZ2xv
YmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBl
IHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CisgICAgICAgICAgICAgICAgalF1ZXJ5KCBj
YWxsYmFja0NvbnRleHQgKSA6CisgICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LAorICAgICAg
ICAgICAgLy8gRGVmZXJyZWRzCisgICAgICAgICAgICBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJl
ZCgpLAorICAgICAgICAgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIm9u
Y2UgbWVtb3J5IiksCisgICAgICAgICAgICAvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwor
ICAgICAgICAgICAgc3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSwKKyAgICAgICAgICAg
IC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCisgICAgICAgICAgICByZXF1
ZXN0SGVhZGVycyA9IHt9LAorICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAor
ICAgICAgICAgICAgLy8gVGhlIGpxWEhSIHN0YXRlCisgICAgICAgICAgICBzdGF0ZSA9IDAsCisg
ICAgICAgICAgICAvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2UKKyAgICAgICAgICAgIHN0ckFib3J0
ID0gImNhbmNlbGVkIiwKKyAgICAgICAgICAgIC8vIEZha2UgeGhyCisgICAgICAgICAgICBqcVhI
UiA9IHsKKyAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiAwLAorCisgICAgICAgICAgICAgICAg
Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIGdl
dFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkgeworICAgICAgICAgICAgICAgICAgICB2
YXIgbWF0Y2g7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0ge307CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRl
cnNTdHJpbmcgKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNl
SGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgICAgICBtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNl
KCkgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
bWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDsKKyAgICAgICAgICAgICAgICB9LAorCisgICAg
ICAgICAgICAgICAgLy8gUmF3IHN0cmluZworICAgICAgICAgICAgICAgIGdldEFsbFJlc3BvbnNl
SGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9
PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CisgICAgICAgICAgICAgICAgfSwK
KworICAgICAgICAgICAgICAgIC8vIENhY2hlcyB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAg
c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworICAgICAgICAgICAg
ICAgICAgICB2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAg
ICAgIGlmICggIXN0YXRlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlcXVl
c3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8
IG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0g
dmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRl
cyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCisgICAgICAgICAgICAgICAgb3ZlcnJpZGVN
aW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggIXN0
YXRlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5taW1lVHlwZSA9IHR5cGU7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAg
ICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIC8vIFN0YXR1cy1kZXBlbmRlbnQgY2Fs
bGJhY2tzCisgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHsKKyAg
ICAgICAgICAgICAgICAgICAgdmFyIGNvZGU7CisgICAgICAgICAgICAgICAgICAgIGlmICggbWFw
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZm9yICggY29kZSBpbiBtYXAgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkg
dGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhcHBy
b3ByaWF0ZSBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5hbHdh
eXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAg
ICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0
CisgICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgeworICAgICAg
ICAgICAgICAgICAgICB2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCB0cmFuc3BvcnQgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICB0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOworICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Owor
CisgICAgICAgIC8vIEF0dGFjaCBkZWZlcnJlZHMKKyAgICAgICAgZGVmZXJyZWQucHJvbWlzZSgg
anFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOworICAgICAgICBqcVhIUi5z
dWNjZXNzID0ganFYSFIuZG9uZTsKKyAgICAgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOwor
CisgICAgICAgIC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJv
bW90aW9uKQorICAgICAgICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0
ZXJzIG1pZ2h0IGV4cGVjdCBpdCkKKyAgICAgICAgLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUg
c2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkK
KyAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCisg
ICAgICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArICIiICku
cmVwbGFjZSggcmhhc2gsICIiICkKKyAgICAgICAgICAgIC5yZXBsYWNlKCBycHJvdG9jb2wsIGFq
YXhMb2NQYXJ0c1sgMSBdICsgIi8vIiApOworCisgICAgICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRp
b24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAorICAgICAgICBzLnR5cGUgPSBvcHRpb25z
Lm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlOworCisgICAgICAg
IC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKKyAgICAgICAgcy5kYXRhVHlwZXMgPSBqUXVlcnku
dHJpbSggcy5kYXRhVHlwZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUg
KSB8fCBbICIiIF07CisKKyAgICAgICAgLy8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBv
cmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2gKKyAgICAgICAg
aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CisgICAgICAgICAgICBwYXJ0cyA9IHJ1cmwu
ZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApOworICAgICAgICAgICAgcy5jcm9zc0RvbWFpbiA9
ICEhKCBwYXJ0cyAmJgorICAgICAgICAgICAgICAgICggcGFydHNbIDEgXSAhPT0gYWpheExvY1Bh
cnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwKKyAgICAgICAg
ICAgICAgICAgICAgKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/ICI4
MCIgOiAiNDQzIiApICkgIT09CisgICAgICAgICAgICAgICAgICAgICAgICAoIGFqYXhMb2NQYXJ0
c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyAiODAiIDogIjQ0MyIg
KSApICkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGRh
dGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKyAgICAgICAgaWYgKCBzLmRhdGEgJiYgcy5wcm9j
ZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHMu
ZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBBcHBseSBwcmVmaWx0ZXJzCisgICAgICAgIGluc3BlY3RQcmVmaWx0ZXJz
T3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOworCisgICAgICAg
IC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJl
CisgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7CisgICAgICAgICAgICByZXR1cm4ganFYSFI7
CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9m
IG5vdyBpZiBhc2tlZCB0bworICAgICAgICBmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOworCisgICAg
ICAgIC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKyAgICAgICAgaWYgKCBmaXJl
R2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7CisgICAgICAgICAgICBqUXVlcnku
ZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcHBl
cmNhc2UgdGhlIHR5cGUKKyAgICAgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CisK
KyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKKyAgICAgICAgcy5o
YXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CisKKyAgICAgICAgLy8gU2F2
ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNl
CisgICAgICAgIC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgorICAgICAg
ICBjYWNoZVVSTCA9IHMudXJsOworCisgICAgICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBm
b3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgICAgIGlmICggIXMuaGFzQ29udGVudCAp
IHsKKworICAgICAgICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRv
IHVybAorICAgICAgICAgICAgaWYgKCBzLmRhdGEgKSB7CisgICAgICAgICAgICAgICAgY2FjaGVV
UkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSAr
IHMuZGF0YSApOworICAgICAgICAgICAgICAgIC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0
IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKKyAgICAgICAgICAgICAgICBkZWxl
dGUgcy5kYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgYW50aS1jYWNo
ZSBpbiB1cmwgaWYgbmVlZGVkCisgICAgICAgICAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkg
eworICAgICAgICAgICAgICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPworCisgICAg
ICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBz
ZXQgaXRzIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMLnJlcGxhY2UoIHJ0cywg
IiQxXz0iICsgbm9uY2UrKyApIDoKKworICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ug
YWRkIG9uZSB0byB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMICsgKCBycXVl
cnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIG5vbmNlKys7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNp
bmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgor
ICAgICAgICBpZiAoIHMuaWZNb2RpZmllZCApIHsKKyAgICAgICAgICAgIGlmICggalF1ZXJ5Lmxh
c3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKKyAgICAgICAgICAgICAgICBqcVhIUi5zZXRSZXF1
ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNo
ZVVSTCBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGpRdWVyeS5ldGFnWyBj
YWNoZVVSTCBdICkgeworICAgICAgICAgICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJ
Zi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEg
aXMgYmVpbmcgc2VudAorICAgICAgICBpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5j
b250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKKyAgICAgICAg
ICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBl
ICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0
aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisgICAgICAgIGpxWEhSLnNldFJl
cXVlc3RIZWFkZXIoCisgICAgICAgICAgICAiQWNjZXB0IiwKKyAgICAgICAgICAgIHMuZGF0YVR5
cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KKyAgICAgICAgICAgICAg
ICBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIq
IiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoKKyAgICAgICAgICAgICAg
ICBzLmFjY2VwdHNbICIqIiBdCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGhl
YWRlcnMgb3B0aW9uCisgICAgICAgIGZvciAoIGkgaW4gcy5oZWFkZXJzICkgeworICAgICAgICAg
ICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkg
YWJvcnQKKyAgICAgICAgaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCgg
Y2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkg
eworICAgICAgICAgICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisg
ICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IGFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgorICAgICAgICBzdHJBYm9ydCA9
ICJhYm9ydCI7CisKKyAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisg
ICAgICAgIGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSAp
IHsKKyAgICAgICAgICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gR2V0IHRyYW5zcG9ydAorICAgICAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVy
c09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworICAgICAg
ICAvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKKyAgICAgICAgaWYgKCAhdHJhbnNw
b3J0ICkgeworICAgICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0gMTsKKworICAgICAgICAg
ICAgLy8gU2VuZCBnbG9iYWwgZXZlbnQKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7
CisgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIs
IFsganFYSFIsIHMgXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGltZW91dAor
ICAgICAgICAgICAgaWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7CisgICAgICAgICAg
ICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
ICAgICAgICAganFYSFIuYWJvcnQoInRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICB9LCBzLnRp
bWVvdXQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAg
ICAgICBzdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RI
ZWFkZXJzLCBkb25lICk7CisgICAgICAgICAgICB9IGNhdGNoICggZSApIHsKKyAgICAgICAgICAg
ICAgICAvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCisgICAgICAg
ICAgICAgICAgaWYgKCBzdGF0ZSA8IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvbmUoIC0x
LCBlICk7CisgICAgICAgICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxs
YmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKKyAgICAgICAgZnVuY3Rpb24gZG9uZSgg
c3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CisgICAgICAg
ICAgICB2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAor
ICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OworCisgICAgICAg
ICAgICAvLyBDYWxsZWQgb25jZQorICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PT0gMiApIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0
YXRlIGlzICJkb25lIiBub3cKKyAgICAgICAgICAgIHN0YXRlID0gMjsKKworICAgICAgICAgICAg
Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIGlmICggdGltZW91dFRp
bWVyICkgeworICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3Ig
ZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uCisgICAgICAgICAgICAvLyAobm8gbWF0dGVyIGhvdyBs
b25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKQorICAgICAgICAgICAgdHJhbnNwb3J0
ID0gdW5kZWZpbmVkOworCisgICAgICAgICAgICAvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzCisg
ICAgICAgICAgICByZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOworCisgICAg
ICAgICAgICAvLyBTZXQgcmVhZHlTdGF0ZQorICAgICAgICAgICAganFYSFIucmVhZHlTdGF0ZSA9
IHN0YXR1cyA+IDAgPyA0IDogMDsKKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHN1Y2Nl
c3NmdWwKKyAgICAgICAgICAgIGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwg
MzAwIHx8IHN0YXR1cyA9PT0gMzA0OworCisgICAgICAgICAgICAvLyBHZXQgcmVzcG9uc2UgZGF0
YQorICAgICAgICAgICAgaWYgKCByZXNwb25zZXMgKSB7CisgICAgICAgICAgICAgICAgcmVzcG9u
c2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5
IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldCkKKyAgICAgICAgICAgIHJlc3BvbnNl
ID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7CisKKyAgICAg
ICAgICAgIC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCisgICAgICAgICAg
ICBpZiAoIGlzU3VjY2VzcyApIHsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgSWYtTW9k
aWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVk
IG1vZGUuCisgICAgICAgICAgICAgICAgaWYgKCBzLmlmTW9kaWZpZWQgKSB7CisgICAgICAgICAg
ICAgICAgICAgIG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZp
ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGpx
WEhSLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIik7CisgICAgICAgICAgICAgICAgICAgIGlmICgg
bW9kaWZpZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXRhZ1sgY2FjaGVV
UkwgXSA9IG1vZGlmaWVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgLy8gaWYgbm8gY29udGVudAorICAgICAgICAgICAgICAgIGlm
ICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSAiSEVBRCIgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHN0YXR1c1RleHQgPSAibm9jb250ZW50IjsKKworICAgICAgICAgICAgICAgIC8vIGlm
IG5vdCBtb2RpZmllZAorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0
ICkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKwor
ICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAorICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSBy
ZXNwb25zZS5zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHJlc3BvbnNlLmRh
dGE7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2UuZXJyb3I7CisgICAgICAg
ICAgICAgICAgICAgIGlzU3VjY2VzcyA9ICFlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJv
bSBzdGF0dXNUZXh0CisgICAgICAgICAgICAgICAgLy8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4
dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCisgICAgICAgICAgICAgICAgZXJyb3IgPSBzdGF0
dXNUZXh0OworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewor
ICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCBzdGF0dXMgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVz
ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3QK
KyAgICAgICAgICAgIGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIGpxWEhSLnN0
YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgIiI7CisKKyAg
ICAgICAgICAgIC8vIFN1Y2Nlc3MvRXJyb3IKKyAgICAgICAgICAgIGlmICggaXNTdWNjZXNzICkg
eworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQs
IFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsg
anFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICAgICAgICAgIGpxWEhSLnN0YXR1
c0NvZGUoIHN0YXR1c0NvZGUgKTsKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7
CisKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7CisgICAgICAgICAgICAgICAgZ2xv
YmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWph
eEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3Vj
Y2VzcyA6IGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29tcGxl
dGUKKyAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4
dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7CisKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2Jh
bHMgKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4
Q29tcGxldGUiLCBbIGpxWEhSLCBzIF0gKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhl
IGdsb2JhbCBBSkFYIGNvdW50ZXIKKyAgICAgICAgICAgICAgICBpZiAoICEoIC0talF1ZXJ5LmFj
dGl2ZSApICkgeworICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWph
eFN0b3AiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwor
ICAgICAgICByZXR1cm4ganFYSFI7CisgICAgfSwKIAotICAgIGZvciAoIDsgaW5kZXggPCBsZW5n
dGggOyBpbmRleCsrICkgewotICAgIHByb3AgPSBwcm9wc1sgaW5kZXggXTsKLSAgICB0d2VlbmVy
c1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKLSAgICB0d2VlbmVyc1sgcHJvcCBd
LnVuc2hpZnQoIGNhbGxiYWNrICk7Ci0gICAgfQorICAgIGdldEpTT046IGZ1bmN0aW9uKCB1cmws
IGRhdGEsIGNhbGxiYWNrICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRh
LCBjYWxsYmFjaywgImpzb24iICk7CiAgICAgfSwKIAotICAgIHByZWZpbHRlcjogZnVuY3Rpb24o
IGNhbGxiYWNrLCBwcmVwZW5kICkgewotICAgIGlmICggcHJlcGVuZCApIHsKLSAgICBhbmltYXRp
b25QcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7Ci0gICAgfSBlbHNlIHsKLSAgICBhbmlt
YXRpb25QcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7Ci0gICAgfQorICAgIGdldFNjcmlwdDog
ZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkuZ2V0KCB1
cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7CiAgICAgfQogfSk7CiAKLWZ1bmN0
aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewotICAgIC8qanNoaW50
IHZhbGlkdGhpczp0cnVlICovCi0gICAgdmFyIHByb3AsIGluZGV4LCBsZW5ndGgsCi0gICAgdmFs
dWUsIGRhdGFTaG93LCB0b2dnbGUsCi0gICAgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLAotICAgIGFu
aW0gPSB0aGlzLAotICAgIHN0eWxlID0gZWxlbS5zdHlsZSwKLSAgICBvcmlnID0ge30sCi0gICAg
aGFuZGxlZCA9IFtdLAotICAgIGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVs
ZW0gKTsKK2pRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhv
ZCApIHsKKyAgICBqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJh
Y2ssIHR5cGUgKSB7CisgICAgICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50
IHdhcyBvbWl0dGVkCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsK
KyAgICAgICAgICAgIHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOworICAgICAgICAgICAgY2FsbGJh
Y2sgPSBkYXRhOworICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDsKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiBqUXVlcnkuYWpheCh7CisgICAgICAgICAgICB1cmw6IHVybCwKKyAgICAg
ICAgICAgIHR5cGU6IG1ldGhvZCwKKyAgICAgICAgICAgIGRhdGFUeXBlOiB0eXBlLAorICAgICAg
ICAgICAgZGF0YTogZGF0YSwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IGNhbGxiYWNrCisgICAgICAg
IH0pOworICAgIH07Cit9KTsKIAotICAgIC8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXMK
LSAgICBpZiAoICFvcHRzLnF1ZXVlICkgewotICAgIGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tz
KCBlbGVtLCAiZngiICk7Ci0gICAgaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewotICAg
IGhvb2tzLnVucXVldWVkID0gMDsKLSAgICBvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKLSAg
ICBob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAhaG9va3MudW5xdWV1
ZWQgKSB7Ci0gICAgb2xkZmlyZSgpOwotICAgIH0KKy8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0
aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCitqUXVlcnkuZWFjaCggWyAiYWph
eFN0YXJ0IiwgImFqYXhTdG9wIiwgImFqYXhDb21wbGV0ZSIsICJhamF4RXJyb3IiLCAiYWpheFN1
Y2Nlc3MiLCAiYWpheFNlbmQiIF0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgeworICAgIGpRdWVyeS5m
blsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkgeworICAgICAgICByZXR1cm4gdGhpcy5vbiggdHlw
ZSwgZm4gKTsKICAgICB9OwotICAgIH0KLSAgICBob29rcy51bnF1ZXVlZCsrOworfSk7CiAKLSAg
ICBhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKLSAgICAvLyBkb2luZyB0aGlzIG1ha2VzIHN1cmUg
dGhhdCB0aGUgY29tcGxldGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAotICAgIC8vIGJlZm9yZSB0
aGlzIGNvbXBsZXRlcwotICAgIGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgewotICAgIGhvb2tzLnVu
cXVldWVkLS07Ci0gICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkg
ewotICAgIGhvb2tzLmVtcHR5LmZpcmUoKTsKLSAgICB9Ci0gICAgfSk7CisKK2pRdWVyeS5fZXZh
bFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5hamF4KHsKKyAgICAg
ICAgdXJsOiB1cmwsCisgICAgICAgIHR5cGU6ICJHRVQiLAorICAgICAgICBkYXRhVHlwZTogInNj
cmlwdCIsCisgICAgICAgIGFzeW5jOiBmYWxzZSwKKyAgICAgICAgZ2xvYmFsOiBmYWxzZSwKKyAg
ICAgICAgInRocm93cyI6IHRydWUKICAgICB9KTsKLSAgICB9Cit9OwogCi0gICAgLy8gaGVpZ2h0
L3dpZHRoIG92ZXJmbG93IHBhc3MKLSAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAi
aGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7Ci0gICAgLy8gTWFrZSBz
dXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0Ci0gICAgLy8gUmVjb3JkIGFsbCAzIG92ZXJmbG93
IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAotICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmZs
b3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAotICAgIC8vIG92ZXJmbG93WSBhcmUgc2V0
IHRvIHRoZSBzYW1lIHZhbHVlCi0gICAgb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3cs
IHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07Ci0KLSAgICAvLyBTZXQgZGlzcGxh
eSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAotICAgIC8vIGFuaW1h
dGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5p
bWF0ZWQKLSAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAiaW5saW5l
IiAmJgotICAgIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewotCi0g
ICAgLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7Ci0gICAgLy8g
YmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXQKLSAgICBp
ZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0IHx8IGNzc19kZWZhdWx0
RGlzcGxheSggZWxlbS5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKLSAgICBzdHlsZS5kaXNw
bGF5ID0gImlubGluZS1ibG9jayI7CiAKLSAgICB9IGVsc2UgewotICAgIHN0eWxlLnpvb20gPSAx
OwotICAgIH0KLSAgICB9Ci0gICAgfQoralF1ZXJ5LmZuLmV4dGVuZCh7CisgICAgd3JhcEFsbDog
ZnVuY3Rpb24oIGh0bWwgKSB7CisgICAgICAgIHZhciB3cmFwOwogCi0gICAgaWYgKCBvcHRzLm92
ZXJmbG93ICkgewotICAgIHN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7Ci0gICAgaWYgKCAhalF1
ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKLSAgICBhbmltLmFsd2F5cyhmdW5jdGlv
bigpIHsKLSAgICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKLSAgICBzdHls
ZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07Ci0gICAgc3R5bGUub3ZlcmZsb3dZID0g
b3B0cy5vdmVyZmxvd1sgMiBdOwotICAgIH0pOwotICAgIH0KLSAgICB9CisgICAgICAgIGlmICgg
alF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVh
Y2goZnVuY3Rpb24oIGkgKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkud3JhcEFs
bCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQogCisg
ICAgICAgIGlmICggdGhpc1sgMCBdICkgewogCi0gICAgLy8gc2hvdy9oaWRlIHBhc3MKLSAgICBm
b3IgKCBpbmRleCBpbiBwcm9wcyApIHsKLSAgICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwotICAg
IGlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHsKLSAgICBkZWxldGUgcHJvcHNbIGluZGV4
IF07Ci0gICAgdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKLSAgICBpZiAo
IHZhbHVlID09PSAoIGhpZGRlbiA/ICJoaWRlIiA6ICJzaG93IiApICkgewotICAgIGNvbnRpbnVl
OwotICAgIH0KLSAgICBoYW5kbGVkLnB1c2goIGluZGV4ICk7Ci0gICAgfQotICAgIH0KKyAgICAg
ICAgICAgIC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisgICAgICAg
ICAgICB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAw
ICkuY2xvbmUoIHRydWUgKTsKIAotICAgIGxlbmd0aCA9IGhhbmRsZWQubGVuZ3RoOwotICAgIGlm
ICggbGVuZ3RoICkgewotICAgIGRhdGFTaG93ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZnhzaG93
IiApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIsIHt9ICk7Ci0gICAgaWYgKCAiaGlk
ZGVuIiBpbiBkYXRhU2hvdyApIHsKLSAgICBoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47Ci0gICAg
fQorICAgICAgICAgICAgaWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAg
ICAgICB3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7CisgICAgICAgICAgICB9CiAKLSAg
ICAvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgp
IHRvICJyZXZlcnNlIgotICAgIGlmICggdG9nZ2xlICkgewotICAgIGRhdGFTaG93LmhpZGRlbiA9
ICFoaWRkZW47Ci0gICAgfQotICAgIGlmICggaGlkZGVuICkgewotICAgIGpRdWVyeSggZWxlbSAp
LnNob3coKTsKLSAgICB9IGVsc2UgewotICAgIGFuaW0uZG9uZShmdW5jdGlvbigpIHsKLSAgICBq
UXVlcnkoIGVsZW0gKS5oaWRlKCk7Ci0gICAgfSk7Ci0gICAgfQotICAgIGFuaW0uZG9uZShmdW5j
dGlvbigpIHsKLSAgICB2YXIgcHJvcDsKLSAgICBqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sICJm
eHNob3ciICk7Ci0gICAgZm9yICggcHJvcCBpbiBvcmlnICkgewotICAgIGpRdWVyeS5zdHlsZSgg
ZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7Ci0gICAgfQotICAgIH0pOwotICAgIGZvciAoIGlu
ZGV4ID0gMCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLSAgICBwcm9wID0gaGFuZGxl
ZFsgaW5kZXggXTsKLSAgICB0d2VlbiA9IGFuaW0uY3JlYXRlVHdlZW4oIHByb3AsIGhpZGRlbiA/
IGRhdGFTaG93WyBwcm9wIF0gOiAwICk7Ci0gICAgb3JpZ1sgcHJvcCBdID0gZGF0YVNob3dbIHBy
b3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsKKyAgICAgICAgICAgIHdyYXAubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBlbGVtID0gdGhpczsKIAotICAgIGlm
ICggISggcHJvcCBpbiBkYXRhU2hvdyApICkgewotICAgIGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vl
bi5zdGFydDsKLSAgICBpZiAoIGhpZGRlbiApIHsKLSAgICB0d2Vlbi5lbmQgPSB0d2Vlbi5zdGFy
dDsKLSAgICB0d2Vlbi5zdGFydCA9IHByb3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdo
dCIgPyAxIDogMDsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci19CisgICAgICAgICAgICAg
ICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgeworICAgICAgICAgICAgICAgICAg
ICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDsKKyAgICAgICAgICAgICAgICB9CiAKLWZ1
bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsKLSAgICBy
ZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQs
IGVhc2luZyApOwotfQotalF1ZXJ5LlR3ZWVuID0gVHdlZW47CisgICAgICAgICAgICAgICAgcmV0
dXJuIGVsZW07CisgICAgICAgICAgICB9KS5hcHBlbmQoIHRoaXMgKTsKKyAgICAgICAgfQogCi1U
d2Vlbi5wcm90b3R5cGUgPSB7Ci0gICAgY29uc3RydWN0b3I6IFR3ZWVuLAotICAgIGluaXQ6IGZ1
bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHsKLSAgICB0
aGlzLmVsZW0gPSBlbGVtOwotICAgIHRoaXMucHJvcCA9IHByb3A7Ci0gICAgdGhpcy5lYXNpbmcg
PSBlYXNpbmcgfHwgInN3aW5nIjsKLSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgIHRo
aXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7Ci0gICAgdGhpcy5lbmQgPSBlbmQ7Ci0g
ICAgdGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDog
InB4IiApOworICAgICAgICByZXR1cm4gdGhpczsKICAgICB9LAotICAgIGN1cjogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKIAotICAg
IHJldHVybiBob29rcyAmJiBob29rcy5nZXQgPwotICAgIGhvb2tzLmdldCggdGhpcyApIDoKLSAg
ICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Ci0gICAgfSwKLSAgICBydW46
IGZ1bmN0aW9uKCBwZXJjZW50ICkgewotICAgIHZhciBlYXNlZCwKLSAgICBob29rcyA9IFR3ZWVu
LnByb3BIb29rc1sgdGhpcy5wcm9wIF07CisgICAgd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCAp
IHsKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgeworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICAgICAgICAgICAgICBqUXVl
cnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOworICAgICAgICAgICAg
fSk7CisgICAgICAgIH0KIAotICAgIGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkgewotICAg
IHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAotICAgIHBl
cmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9u
cy5kdXJhdGlvbgotICAgICk7Ci0gICAgfSBlbHNlIHsKLSAgICB0aGlzLnBvcyA9IGVhc2VkID0g
cGVyY2VudDsKLSAgICB9Ci0gICAgdGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCAp
ICogZWFzZWQgKyB0aGlzLnN0YXJ0OworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9u
KCkgeworICAgICAgICAgICAgdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKKyAgICAgICAgICAg
ICAgICBjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKIAotICAgIGlmICggdGhpcy5vcHRpb25z
LnN0ZXAgKSB7Ci0gICAgdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5v
dywgdGhpcyApOwotICAgIH0KKyAgICAgICAgICAgIGlmICggY29udGVudHMubGVuZ3RoICkgewor
ICAgICAgICAgICAgICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKIAotICAgIGlmICggaG9v
a3MgJiYgaG9va3Muc2V0ICkgewotICAgIGhvb2tzLnNldCggdGhpcyApOwotICAgIH0gZWxzZSB7
Ci0gICAgVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApOwotICAgIH0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgICB9Ci19OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBzZWxmLmFwcGVuZCggaHRtbCApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAg
ICB9LAogCi1Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7
CisgICAgd3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7CisgICAgICAgIHZhciBpc0Z1bmN0aW9uID0g
alF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTsKIAotVHdlZW4ucHJvcEhvb2tzID0gewotICAgIF9k
ZWZhdWx0OiB7Ci0gICAgZ2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7Ci0gICAgdmFyIHJlc3VsdDsK
KyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICAgICAgICAgIGpR
dWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBo
dG1sICk7CisgICAgICAgIH0pOworICAgIH0sCiAKLSAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVu
LnByb3AgXSAhPSBudWxsICYmCi0gICAgKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0u
c3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKLSAgICByZXR1cm4gdHdlZW4uZWxlbVsg
dHdlZW4ucHJvcCBdOworICAgIHVud3JhcDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0
aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoICFqUXVlcnku
bm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhp
cyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSkuZW5kKCk7CiAgICAgfQorfSk7CiAKLSAgICAvLyBwYXNzaW5nIGFuIGVtcHR5IHN0cmlu
ZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAvLyBh
dHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNl
IGZhaWxzCi0gICAgLy8gc28sIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJlIHBhcnNl
ZCB0byBGbG9hdC4KLSAgICAvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzICJyb3RhdGUoMXJhZCki
IGFyZSByZXR1cm5lZCBhcyBpcy4KLSAgICByZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVt
LCB0d2Vlbi5wcm9wLCAiIiApOwotICAgIC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5l
ZCBhbmQgImF1dG8iIGFyZSBjb252ZXJ0ZWQgdG8gMC4KLSAgICByZXR1cm4gIXJlc3VsdCB8fCBy
ZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7Ci0gICAgfSwKLSAgICBzZXQ6IGZ1bmN0aW9u
KCB0d2VlbiApIHsKLSAgICAvLyB1c2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdCAtIHVzZSBj
c3NIb29rIGlmIGl0cyB0aGVyZSAtIHVzZSAuc3R5bGUgaWYgaXRzCi0gICAgLy8gYXZhaWxhYmxl
IGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUKLSAgICBpZiAoIGpRdWVy
eS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7Ci0gICAgalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnBy
b3AgXSggdHdlZW4gKTsKLSAgICB9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdl
ZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8
IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7Ci0gICAgalF1ZXJ5LnN0eWxlKCB0
d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7Ci0gICAgfSBl
bHNlIHsKLSAgICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7Ci0gICAgfQot
ICAgIH0KLSAgICB9CisKK2pRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVs
ZW0gKSB7CisgICAgLy8gU3VwcG9ydDogT3BlcmEgPD0gMTIuMTIKKyAgICAvLyBPcGVyYSByZXBv
cnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21l
IGVsZW1lbnRzCisgICAgcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNl
dEhlaWdodCA8PSAwOworfTsKK2pRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9u
KCBlbGVtICkgeworICAgIHJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0g
KTsKIH07CiAKLS8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJh
c2VkIGFwcHJvYWNoCi0vLyB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMK
IAotVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0
ID0gewotICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgewotICAgIGlmICggdHdlZW4uZWxlbS5u
b2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7Ci0gICAgdHdlZW4uZWxlbVsgdHdl
ZW4ucHJvcCBdID0gdHdlZW4ubm93OwotICAgIH0KLSAgICB9Ci19OwogCi1qUXVlcnkuZWFjaChb
ICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKLSAgICB2
YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKLSAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1
bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKLSAgICByZXR1cm4gc3BlZWQgPT0g
bnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/Ci0gICAgY3NzRm4uYXBwbHkoIHRo
aXMsIGFyZ3VtZW50cyApIDoKLSAgICB0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICks
IHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Ci0gICAgfTsKLX0pOwogCi1qUXVlcnkuZm4uZXh0
ZW5kKHsKLSAgICBmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sg
KSB7Cit2YXIgcjIwID0gLyUyMC9nLAorICAgIHJicmFja2V0ID0gL1xbXF0kLywKKyAgICByQ1JM
RiA9IC9ccj9cbi9nLAorICAgIHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxp
bWFnZXxyZXNldHxmaWxlKSQvaSwKKyAgICByc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVj
dHx0ZXh0YXJlYXxrZXlnZW4pL2k7CiAKLSAgICAvLyBzaG93IGFueSBoaWRkZW4gZWxlbWVudHMg
YWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKLSAgICByZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlk
ZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkKK2Z1bmN0aW9uIGJ1aWxkUGFyYW1zKCBw
cmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKyAgICB2YXIgbmFtZTsKIAotICAgIC8v
IGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAotICAgIC5lbmQoKS5hbmltYXRlKHsgb3Bh
Y2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKLSAgICB9LAotICAgIGFuaW1h
dGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKLSAgICB2YXIg
ZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLAotICAgIG9wdGFsbCA9IGpRdWVy
eS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSwKLSAgICBkb0FuaW1hdGlvbiA9IGZ1
bmN0aW9uKCkgewotICAgIC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3Bl
cnR5IGVhc2luZyB3b24ndCBiZSBsb3N0Ci0gICAgdmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMs
IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwotICAgIGRvQW5pbWF0aW9uLmZp
bmlzaCA9IGZ1bmN0aW9uKCkgewotICAgIGFuaW0uc3RvcCggdHJ1ZSApOwotICAgIH07Ci0gICAg
Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5Ci0g
ICAgaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRoaXMsICJmaW5pc2giICkgKSB7Ci0gICAg
YW5pbS5zdG9wKCB0cnVlICk7CisgICAgaWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7Cisg
ICAgICAgIC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgorICAgICAgICBqUXVlcnkuZWFjaCggb2Jq
LCBmdW5jdGlvbiggaSwgdiApIHsKKyAgICAgICAgICAgIGlmICggdHJhZGl0aW9uYWwgfHwgcmJy
YWNrZXQudGVzdCggcHJlZml4ICkgKSB7CisgICAgICAgICAgICAgICAgLy8gVHJlYXQgZWFjaCBh
cnJheSBpdGVtIGFzIGEgc2NhbGFyLgorICAgICAgICAgICAgICAgIGFkZCggcHJlZml4LCB2ICk7
CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSXRlbSBpcyBub24t
c2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCisgICAg
ICAgICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJv
YmplY3QiID8gaSA6ICIiICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1
ZXJ5LnR5cGUoIG9iaiApID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgLy8gU2VyaWFsaXplIG9i
amVjdCBpdGVtLgorICAgICAgICBmb3IgKCBuYW1lIGluIG9iaiApIHsKKyAgICAgICAgICAgIGJ1
aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0
aW9uYWwsIGFkZCApOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTZXJp
YWxpemUgc2NhbGFyIGl0ZW0uCisgICAgICAgIGFkZCggcHJlZml4LCBvYmogKTsKICAgICB9Ci0g
ICAgfTsKLSAgICBkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjsKK30KIAotICAgIHJl
dHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KLSAgICB0aGlzLmVhY2goIGRv
QW5pbWF0aW9uICkgOgotICAgIHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24g
KTsKLSAgICB9LAotICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5k
ICkgewotICAgIHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7Ci0gICAgdmFyIHN0
b3AgPSBob29rcy5zdG9wOwotICAgIGRlbGV0ZSBob29rcy5zdG9wOwotICAgIHN0b3AoIGdvdG9F
bmQgKTsKLSAgICB9OworLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3Ig
YSBzZXQgb2YKKy8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZworalF1ZXJ5LnBhcmFt
ID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkgeworICAgIHZhciBwcmVmaXgsCisgICAgICAg
IHMgPSBbXSwKKyAgICAgICAgYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CisgICAgICAg
ICAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMg
dmFsdWUKKyAgICAgICAgICAgIHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2
YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOworICAgICAgICAgICAgc1sg
cy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklD
b21wb25lbnQoIHZhbHVlICk7CisgICAgICAgIH07CiAKLSAgICBpZiAoIHR5cGVvZiB0eXBlICE9
PSAic3RyaW5nIiApIHsKLSAgICBnb3RvRW5kID0gY2xlYXJRdWV1ZTsKLSAgICBjbGVhclF1ZXVl
ID0gdHlwZTsKLSAgICB0eXBlID0gdW5kZWZpbmVkOwotICAgIH0KLSAgICBpZiAoIGNsZWFyUXVl
dWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBb
XSApOworICAgIC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIg
YmVoYXZpb3IuCisgICAgaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgeworICAgICAg
ICB0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5n
cy50cmFkaXRpb25hbDsKICAgICB9CiAKLSAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkg
ewotICAgIHZhciBkZXF1ZXVlID0gdHJ1ZSwKLSAgICBpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0
eXBlICsgInF1ZXVlSG9va3MiLAotICAgIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsCi0gICAgZGF0
YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApOworICAgIC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQg
aW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCisgICAgaWYg
KCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2Jq
ZWN0KCBhICkgKSApIHsKKyAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCisg
ICAgICAgIGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGFkZCggdGhp
cy5uYW1lLCB0aGlzLnZhbHVlICk7CisgICAgICAgIH0pOwogCi0gICAgaWYgKCBpbmRleCApIHsK
LSAgICBpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewotICAgIHN0
b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwotICAgIH0KICAgICB9IGVsc2UgewotICAgIGZvciAo
IGluZGV4IGluIGRhdGEgKSB7Ci0gICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4
IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7Ci0gICAgc3RvcFF1ZXVlKCBkYXRhWyBp
bmRleCBdICk7Ci0gICAgfQotICAgIH0KKyAgICAgICAgLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29k
ZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCisgICAgICAgIC8vIGRpZCBp
dCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LgorICAgICAgICBmb3IgKCBw
cmVmaXggaW4gYSApIHsKKyAgICAgICAgICAgIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZp
eCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKCBp
bmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewotICAgIGlmICggdGltZXJzWyBpbmRl
eCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVl
dWUgPT09IHR5cGUpICkgewotICAgIHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQg
KTsKLSAgICBkZXF1ZXVlID0gZmFsc2U7Ci0gICAgdGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTsK
LSAgICB9Ci0gICAgfQorICAgIC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24K
KyAgICByZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOworfTsKIAotICAg
IC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBm
b3JjZWQKLSAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBj
YWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQotICAgIC8vIGJ1dCBvbmx5IGlmIHRoZXkgd2Vy
ZSBnb3RvRW5kCi0gICAgaWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkgewotICAgIGpRdWVyeS5k
ZXF1ZXVlKCB0aGlzLCB0eXBlICk7Ci0gICAgfQotICAgIH0pOworalF1ZXJ5LmZuLmV4dGVuZCh7
CisgICAgc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5wYXJh
bSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7CiAgICAgfSwKLSAgICBmaW5pc2g6IGZ1bmN0aW9u
KCB0eXBlICkgewotICAgIGlmICggdHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKKyAgICBzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVy
biB0aGlzLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIC8vIENhbiBhZGQgcHJvcEhvb2sg
Zm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAgICAgICAg
ICB2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRzIiApOworICAgICAg
ICAgICAgcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRo
aXM7CisgICAgICAgIH0pCisgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKKworICAgICAgICAgICAgLy8gVXNlIC5pcyggIjpkaXNh
YmxlZCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcworICAgICAgICAgICAgcmV0
dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKKyAg
ICAgICAgICAgICAgICByc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3Vi
bWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmCisgICAgICAgICAgICAgICAgKCB0aGlzLmNoZWNr
ZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApOworICAgICAgICB9KQorICAgICAg
ICAubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkgeworICAgICAgICAgICAgdmFyIHZhbCA9IGpRdWVy
eSggdGhpcyApLnZhbCgpOworCisgICAgICAgICAgICByZXR1cm4gdmFsID09IG51bGwgPworICAg
ICAgICAgICAgICAgIG51bGwgOgorICAgICAgICAgICAgICAgIGpRdWVyeS5pc0FycmF5KCB2YWwg
KSA/CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFs
dWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKKyAgICAgICAgICAgICAgICAgICAg
fSkgOgorICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5y
ZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKKyAgICAgICAgfSkuZ2V0KCk7CiAgICAgfQotICAg
IHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGluZGV4LAotICAgIGRhdGEg
PSBqUXVlcnkuX2RhdGEoIHRoaXMgKSwKLSAgICBxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUi
IF0sCi0gICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1ZXVlSG9va3MiIF0sCi0gICAgdGltZXJz
ID0galF1ZXJ5LnRpbWVycywKLSAgICBsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7
Cit9KTsKIAotICAgIC8vIGVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKLSAg
ICBkYXRhLmZpbmlzaCA9IHRydWU7CiAKLSAgICAvLyBlbXB0eSB0aGUgcXVldWUgZmlyc3QKLSAg
ICBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7CitqUXVlcnkuYWpheFNldHRpbmdzLnho
ciA9IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MSHR0cFJl
cXVlc3QoKTsKKyAgICB9IGNhdGNoKCBlICkge30KK307CiAKLSAgICBpZiAoIGhvb2tzICYmIGhv
b2tzLmN1ciAmJiBob29rcy5jdXIuZmluaXNoICkgewotICAgIGhvb2tzLmN1ci5maW5pc2guY2Fs
bCggdGhpcyApOwotICAgIH0KK3ZhciB4aHJJZCA9IDAsCisgICAgeGhyQ2FsbGJhY2tzID0ge30s
CisgICAgeGhyU3VjY2Vzc1N0YXR1cyA9IHsKKyAgICAgICAgLy8gZmlsZSBwcm90b2NvbCBhbHdh
eXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDAKKyAgICAgICAgMDogMjAwLAorICAg
ICAgICAvLyBTdXBwb3J0OiBJRTkKKyAgICAgICAgLy8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1
cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0CisgICAgICAgIDEyMjM6IDIwNAorICAgIH0s
CisgICAgeGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKKworLy8gU3Vw
cG9ydDogSUU5CisvLyBPcGVuIHJlcXVlc3RzIG11c3QgYmUgbWFudWFsbHkgYWJvcnRlZCBvbiB1
bmxvYWQgKCM1MjgwKQoraWYgKCB3aW5kb3cuQWN0aXZlWE9iamVjdCApIHsKKyAgICBqUXVlcnko
IHdpbmRvdyApLm9uKCAidW5sb2FkIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIGZvciAoIHZhciBr
ZXkgaW4geGhyQ2FsbGJhY2tzICkgeworICAgICAgICAgICAgeGhyQ2FsbGJhY2tzWyBrZXkgXSgp
OworICAgICAgICB9CisgICAgfSk7Cit9CiAKLSAgICAvLyBsb29rIGZvciBhbnkgYWN0aXZlIGFu
aW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQotICAgIGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0
aDsgaW5kZXgtLTsgKSB7Ci0gICAgaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAm
JiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7Ci0gICAgdGltZXJzWyBpbmRleCBd
LmFuaW0uc3RvcCggdHJ1ZSApOwotICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7Ci0gICAg
fQotICAgIH0KK3N1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggIndpdGhDcmVkZW50
aWFscyIgaW4geGhyU3VwcG9ydGVkICk7CitzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAh
IXhoclN1cHBvcnRlZDsKIAotICAgIC8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBv
bGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCi0gICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxl
bmd0aDsgaW5kZXgrKyApIHsKLSAgICBpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRl
eCBdLmZpbmlzaCApIHsKLSAgICBxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwot
ICAgIH0KLSAgICB9CitqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggb3B0aW9ucyApIHsK
KyAgICB2YXIgY2FsbGJhY2s7CiAKLSAgICAvLyB0dXJuIG9mZiBmaW5pc2hpbmcgZmxhZwotICAg
IGRlbGV0ZSBkYXRhLmZpbmlzaDsKLSAgICB9KTsKKyAgICAvLyBDcm9zcyBkb21haW4gb25seSBh
bGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CisgICAgaWYgKCBzdXBw
b3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkgeworICAg
ICAgICByZXR1cm4geworICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBs
ZXRlICkgeworICAgICAgICAgICAgICAgIHZhciBpLAorICAgICAgICAgICAgICAgICAgICB4aHIg
PSBvcHRpb25zLnhocigpLAorICAgICAgICAgICAgICAgICAgICBpZCA9ICsreGhySWQ7CisKKyAg
ICAgICAgICAgICAgICB4aHIub3Blbiggb3B0aW9ucy50eXBlLCBvcHRpb25zLnVybCwgb3B0aW9u
cy5hc3luYywgb3B0aW9ucy51c2VybmFtZSwgb3B0aW9ucy5wYXNzd29yZCApOworCisgICAgICAg
ICAgICAgICAgLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorICAgICAgICAgICAg
ICAgIGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAo
IGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4aHJb
IGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBtaW1lIHR5cGUg
aWYgbmVlZGVkCisgICAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5v
dmVycmlkZU1pbWVUeXBlICkgeworICAgICAgICAgICAgICAgICAgICB4aHIub3ZlcnJpZGVNaW1l
VHlwZSggb3B0aW9ucy5taW1lVHlwZSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCisgICAgICAgICAgICAgICAgLy8gRm9y
IGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxp
Z2h0IGFyZQorICAgICAgICAgICAgICAgIC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBz
aW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuCisgICAgICAgICAgICAgICAgLy8gKGl0IGNh
biBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4
U2V0dXApCisgICAgICAgICAgICAgICAgLy8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24n
dCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuCisgICAgICAgICAgICAgICAgaWYg
KCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkg
eworICAgICAgICAgICAgICAgICAgICBoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1M
SHR0cFJlcXVlc3QiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNl
dCBoZWFkZXJzCisgICAgICAgICAgICAgICAgZm9yICggaSBpbiBoZWFkZXJzICkgeworICAgICAg
ICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7Cisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sKKyAgICAgICAg
ICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNhbGxi
YWNrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB4aHJDYWxsYmFja3Nb
IGlkIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB4aHIub25sb2Fk
ID0geGhyLm9uZXJyb3IgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCB0eXBlID09PSAiYWJvcnQiICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4
aHIuYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBl
ID09PSAiZXJyb3IiICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0
ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGU6IHByb3RvY29s
IGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVz
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSBy
ZXNwb25zZVRleHQgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gKCMxMTQyNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSAic3RyaW5nIiA/IHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB4aHIucmVzcG9uc2VUZXh0CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9
OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gZXZl
bnRzCisgICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CisgICAgICAgICAg
ICAgICAgeGhyLm9uZXJyb3IgPSBjYWxsYmFjaygiZXJyb3IiKTsKKworICAgICAgICAgICAgICAg
IC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICBjYWxsYmFjayA9
IHhockNhbGxiYWNrc1sgaWQgXSA9IGNhbGxiYWNrKCJhYm9ydCIpOworCisgICAgICAgICAgICAg
ICAgLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHJh
aXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICAgIC8vIGhh
bmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQorICAgICAgICAgICAg
ICAgIHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwg
KTsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIGNhbGxiYWNrICkgeworICAgICAgICAgICAgICAgICAgICBjYWxs
YmFjaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAg
ICB9CiB9KTsKIAotLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBh
bmltYXRpb24KLWZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7Ci0gICAgdmFy
IHdoaWNoLAotICAgIGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwKLSAgICBpID0gMDsKIAotICAg
IC8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhw
YW5kIHZhbHVlcywKLSAgICAvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVl
IGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0Ci0gICAgaW5jbHVkZVdpZHRoID0gaW5j
bHVkZVdpZHRoPyAxIDogMDsKLSAgICBmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lk
dGggKSB7Ci0gICAgd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKLSAgICBhdHRyc1sgIm1hcmdpbiIg
KyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwotICAgIH0KIAot
ICAgIGlmICggaW5jbHVkZVdpZHRoICkgewotICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0
aCA9IHR5cGU7CisKKy8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCitqUXVlcnkuYWpheFNldHVw
KHsKKyAgICBhY2NlcHRzOiB7CisgICAgICAgIHNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBw
bGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24v
eC1lY21hc2NyaXB0IgorICAgIH0sCisgICAgY29udGVudHM6IHsKKyAgICAgICAgc2NyaXB0OiAv
KD86amF2YXxlY21hKXNjcmlwdC8KKyAgICB9LAorICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAg
InRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CisgICAgICAgICAgICBqUXVlcnkuZ2xv
YmFsRXZhbCggdGV4dCApOworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KICAg
ICB9Cit9KTsKIAotICAgIHJldHVybiBhdHRyczsKLX0KKy8vIEhhbmRsZSBjYWNoZSdzIHNwZWNp
YWwgY2FzZSBhbmQgY3Jvc3NEb21haW4KK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0Iiwg
ZnVuY3Rpb24oIHMgKSB7CisgICAgaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CisgICAg
ICAgIHMuY2FjaGUgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKCBzLmNyb3NzRG9tYWluICkgewor
ICAgICAgICBzLnR5cGUgPSAiR0VUIjsKKyAgICB9Cit9KTsKIAotLy8gR2VuZXJhdGUgc2hvcnRj
dXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwotalF1ZXJ5LmVhY2goewotICAgIHNsaWRlRG93bjog
Z2VuRngoInNob3ciKSwKLSAgICBzbGlkZVVwOiBnZW5GeCgiaGlkZSIpLAotICAgIHNsaWRlVG9n
Z2xlOiBnZW5GeCgidG9nZ2xlIiksCi0gICAgZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAot
ICAgIGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sCi0gICAgZmFkZVRvZ2dsZTogeyBvcGFj
aXR5OiAidG9nZ2xlIiB9Ci19LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7Ci0gICAgalF1ZXJ5
LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Ci0gICAg
cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Ci0g
ICAgfTsKKy8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydAoralF1ZXJ5LmFqYXhUcmFu
c3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKKyAgICAvLyBUaGlzIHRyYW5zcG9ydCBv
bmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCisgICAgaWYgKCBzLmNyb3NzRG9t
YWluICkgeworICAgICAgICB2YXIgc2NyaXB0LCBjYWxsYmFjazsKKyAgICAgICAgcmV0dXJuIHsK
KyAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHsKKyAgICAgICAgICAg
ICAgICBzY3JpcHQgPSBqUXVlcnkoIjxzY3JpcHQ+IikucHJvcCh7CisgICAgICAgICAgICAgICAg
ICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0OiBzLnNjcmlwdENo
YXJzZXQsCisgICAgICAgICAgICAgICAgICAgIHNyYzogcy51cmwKKyAgICAgICAgICAgICAgICB9
KS5vbigKKyAgICAgICAgICAgICAgICAgICAgImxvYWQgZXJyb3IiLAorICAgICAgICAgICAgICAg
ICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBzY3JpcHQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG51
bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV2dCApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb21wbGV0ZSggZXZ0LnR5cGUgPT09ICJlcnJvciIgPyA0MDQgOiAyMDAs
IGV2dC50eXBlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQu
YXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAg
YWJvcnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICB9OworICAgIH0KIH0pOwogCi1qUXVlcnkuc3BlZWQgPSBmdW5jdGlv
biggc3BlZWQsIGVhc2luZywgZm4gKSB7Ci0gICAgdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBz
cGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHsKLSAgICBj
b21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAotICAgIGpRdWVyeS5pc0Z1bmN0aW9uKCBz
cGVlZCApICYmIHNwZWVkLAotICAgIGR1cmF0aW9uOiBzcGVlZCwKLSAgICBlYXNpbmc6IGZuICYm
IGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNp
bmcKLSAgICB9OwogCi0gICAgb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBl
b2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6Ci0gICAgb3B0LmR1
cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRp
b24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7CiAKLSAgICAvLyBub3JtYWxpemUgb3B0
LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCi0gICAgaWYgKCBvcHQucXVldWUg
PT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7Ci0gICAgb3B0LnF1ZXVlID0gImZ4IjsK
LSAgICB9CiAKLSAgICAvLyBRdWV1ZWluZwotICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7Cit2
YXIgb2xkQ2FsbGJhY2tzID0gW10sCisgICAgcmpzb25wID0gLyg9KVw/KD89JnwkKXxcP1w/LzsK
IAotICAgIG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewotICAgIGlmICggalF1ZXJ5LmlzRnVu
Y3Rpb24oIG9wdC5vbGQgKSApIHsKLSAgICBvcHQub2xkLmNhbGwoIHRoaXMgKTsKKy8vIERlZmF1
bHQganNvbnAgc2V0dGluZ3MKK2pRdWVyeS5hamF4U2V0dXAoeworICAgIGpzb25wOiAiY2FsbGJh
Y2siLAorICAgIGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgY2FsbGJh
Y2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArICJfIiArICggbm9u
Y2UrKyApICk7CisgICAgICAgIHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOworICAgICAgICByZXR1
cm4gY2FsbGJhY2s7CiAgICAgfQorfSk7CiAKLSAgICBpZiAoIG9wdC5xdWV1ZSApIHsKLSAgICBq
UXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7Ci0gICAgfQotICAgIH07CisvLyBEZXRl
Y3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVx
dWVzdHMKK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBv
cmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKIAotICAgIHJldHVybiBvcHQ7Ci19OworICAgIHZh
ciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKKyAgICAgICAg
anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8K
KyAgICAgICAgICAgICJ1cmwiIDoKKyAgICAgICAgICAgIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJp
bmciICYmICEoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3
dy1mb3JtLXVybGVuY29kZWQiKSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYgImRhdGEiCisg
ICAgICAgICk7CiAKLWpRdWVyeS5lYXNpbmcgPSB7Ci0gICAgbGluZWFyOiBmdW5jdGlvbiggcCAp
IHsKLSAgICByZXR1cm4gcDsKLSAgICB9LAotICAgIHN3aW5nOiBmdW5jdGlvbiggcCApIHsKLSAg
ICByZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAqTWF0aC5QSSApIC8gMjsKKyAgICAvLyBIYW5kbGUg
aWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1l
dGVyIHRvIHNldAorICAgIGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpz
b25wIiApIHsKKworICAgICAgICAvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJl
ZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0CisgICAgICAgIGNhbGxiYWNrTmFtZSA9
IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/
CisgICAgICAgICAgICBzLmpzb25wQ2FsbGJhY2soKSA6CisgICAgICAgICAgICBzLmpzb25wQ2Fs
bGJhY2s7CisKKyAgICAgICAgLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0
YQorICAgICAgICBpZiAoIGpzb25Qcm9wICkgeworICAgICAgICAgICAgc1sganNvblByb3AgXSA9
IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7Cisg
ICAgICAgIH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkgeworICAgICAgICAgICAgcy51
cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9
IiArIGNhbGxiYWNrTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBkYXRhIGNvbnZl
cnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KKyAgICAgICAgcy5j
b252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAo
ICFyZXNwb25zZUNvbnRhaW5lciApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuZXJyb3IoIGNh
bGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICByZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKKyAgICAgICAgfTsKKworICAgICAg
ICAvLyBmb3JjZSBqc29uIGRhdGFUeXBlCisgICAgICAgIHMuZGF0YVR5cGVzWyAwIF0gPSAianNv
biI7CisKKyAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFjaworICAgICAgICBvdmVyd3JpdHRlbiA9
IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07CisgICAgICAgIHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0g
PSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRz
OworICAgICAgICB9OworCisgICAgICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRl
ciBjb252ZXJ0ZXJzKQorICAgICAgICBqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CisgICAgICAg
ICAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCisgICAgICAgICAgICB3aW5kb3dbIGNh
bGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CisKKyAgICAgICAgICAgIC8vIFNhdmUgYmFjayBh
cyBmcmVlCisgICAgICAgICAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgeworICAgICAgICAg
ICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2Ny
ZXcgdGhpbmdzIGFyb3VuZAorICAgICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdp
bmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhl
IGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgICAgICBvbGRDYWxsYmFj
a3MucHVzaCggY2FsbGJhY2tOYW1lICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8v
IENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQorICAgICAg
ICAgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3Zlcndy
aXR0ZW4gKSApIHsKKyAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWlu
ZXJbIDAgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZUNvbnRhaW5l
ciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOworICAgICAgICB9KTsKKworICAgICAgICAvLyBE
ZWxlZ2F0ZSB0byBzY3JpcHQKKyAgICAgICAgcmV0dXJuICJzY3JpcHQiOwogICAgIH0KLX07Cit9
KTsKIAotalF1ZXJ5LnRpbWVycyA9IFtdOwotalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmlu
aXQ7Ci1qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewotICAgIHZhciB0aW1lciwKLSAgICB0
aW1lcnMgPSBqUXVlcnkudGltZXJzLAotICAgIGkgPSAwOwogCi0gICAgZnhOb3cgPSBqUXVlcnku
bm93KCk7CiAKLSAgICBmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7Ci0gICAgdGlt
ZXIgPSB0aW1lcnNbIGkgXTsKLSAgICAvLyBDaGVja3MgdGhlIHRpbWVyIGhhcyBub3QgYWxyZWFk
eSBiZWVuIHJlbW92ZWQKLSAgICBpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1l
ciApIHsKLSAgICB0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTsKKworLy8gZGF0YTogc3RyaW5nIG9m
IGh0bWwKKy8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQg
d2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQKKy8v
IGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBh
c3NlZCBpbiB0aGUgaHRtbCBzdHJpbmcKK2pRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0
YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7CisgICAgaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0
YSAhPT0gInN0cmluZyIgKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICBpZiAo
IHR5cGVvZiBjb250ZXh0ID09PSAiYm9vbGVhbiIgKSB7CisgICAgICAgIGtlZXBTY3JpcHRzID0g
Y29udGV4dDsKKyAgICAgICAgY29udGV4dCA9IGZhbHNlOwogICAgIH0KKyAgICBjb250ZXh0ID0g
Y29udGV4dCB8fCBkb2N1bWVudDsKIAotICAgIGlmICggIXRpbWVycy5sZW5ndGggKSB7Ci0gICAg
alF1ZXJ5LmZ4LnN0b3AoKTsKLSAgICB9Ci0gICAgZnhOb3cgPSB1bmRlZmluZWQ7Ci19OworICAg
IHZhciBwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSwKKyAgICAgICAgc2NyaXB0cyA9
ICFrZWVwU2NyaXB0cyAmJiBbXTsKIAotalF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVy
ICkgewotICAgIGlmICggdGltZXIoKSAmJiBqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICkgKSB7
Ci0gICAgalF1ZXJ5LmZ4LnN0YXJ0KCk7CisgICAgLy8gU2luZ2xlIHRhZworICAgIGlmICggcGFy
c2VkICkgeworICAgICAgICByZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsx
XSApIF07CiAgICAgfQotfTsKIAotalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CisgICAgcGFyc2Vk
ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CiAK
LWpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewotICAgIGlmICggIXRpbWVySWQgKSB7Ci0g
ICAgdGltZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVy
dmFsICk7CisgICAgaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgeworICAgICAgICBq
UXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTsKICAgICB9Ci19OwogCi1qUXVlcnkuZnguc3RvcCA9
IGZ1bmN0aW9uKCkgewotICAgIGNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKLSAgICB0aW1lcklk
ID0gbnVsbDsKKyAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMg
KTsKIH07CiAKLWpRdWVyeS5meC5zcGVlZHMgPSB7Ci0gICAgc2xvdzogNjAwLAotICAgIGZhc3Q6
IDIwMCwKLSAgICAvLyBEZWZhdWx0IHNwZWVkCi0gICAgX2RlZmF1bHQ6IDQwMAotfTsKIAotLy8g
QmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnQKLWpRdWVyeS5meC5zdGVwID0ge307Cisv
LyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCit2YXIgX2xvYWQgPSBqUXVlcnku
Zm4ubG9hZDsKIAotaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewot
ICAgIGpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKLSAg
ICByZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkgewotICAg
IHJldHVybiBlbGVtID09PSBmbi5lbGVtOwotICAgIH0pLmxlbmd0aDsKLSAgICB9OwotfQotalF1
ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgIGlmICggYXJndW1lbnRz
Lmxlbmd0aCApIHsKLSAgICByZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KLSAgICB0aGlz
IDoKLSAgICB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAgalF1ZXJ5Lm9mZnNldC5zZXRP
ZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKLSAgICB9KTsKKy8qKgorICogTG9hZCBhIHVybCBp
bnRvIGEgcGFnZQorICovCitqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywg
Y2FsbGJhY2sgKSB7CisgICAgaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCAp
IHsKKyAgICAgICAgcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKICAgICB9
CiAKLSAgICB2YXIgZG9jRWxlbSwgd2luLAotICAgIGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0s
Ci0gICAgZWxlbSA9IHRoaXNbIDAgXSwKLSAgICBkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1
bWVudDsKKyAgICB2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAorICAgICAgICBzZWxmID0g
dGhpcywKKyAgICAgICAgb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKIAotICAgIGlmICggIWRvYyAp
IHsKLSAgICByZXR1cm47CisgICAgaWYgKCBvZmYgPj0gMCApIHsKKyAgICAgICAgc2VsZWN0b3Ig
PSB1cmwuc2xpY2UoIG9mZiApOworICAgICAgICB1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwog
ICAgIH0KIAotICAgIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50OworICAgIC8vIElmIGl0
J3MgYSBmdW5jdGlvbgorICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewor
CisgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisgICAgICAgIGNh
bGxiYWNrID0gcGFyYW1zOworICAgICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7CiAKLSAgICAvLyBN
YWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKLSAgICBpZiAoICFqUXVl
cnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKLSAgICByZXR1cm4gYm94OworICAgIC8v
IE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKKyAgICB9IGVsc2UgaWYgKCBwYXJhbXMg
JiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgIHR5cGUgPSAiUE9TVCI7
CiAgICAgfQogCi0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0
aGVyIHRoYW4gZXJyb3IKLSAgICAvLyBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhv
bmUpCi0gICAgaWYgKCB0eXBlb2YgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IGNvcmVf
c3RydW5kZWZpbmVkICkgewotICAgIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7
CisgICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3QK
KyAgICBpZiAoIHNlbGYubGVuZ3RoID4gMCApIHsKKyAgICAgICAgalF1ZXJ5LmFqYXgoeworICAg
ICAgICAgICAgdXJsOiB1cmwsCisKKyAgICAgICAgICAgIC8vIGlmICJ0eXBlIiB2YXJpYWJsZSBp
cyB1bmRlZmluZWQsIHRoZW4gIkdFVCIgbWV0aG9kIHdpbGwgYmUgdXNlZAorICAgICAgICAgICAg
dHlwZTogdHlwZSwKKyAgICAgICAgICAgIGRhdGFUeXBlOiAiaHRtbCIsCisgICAgICAgICAgICBk
YXRhOiBwYXJhbXMKKyAgICAgICAgfSkuZG9uZShmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkgewor
CisgICAgICAgICAgICAvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJh
Y2sKKyAgICAgICAgICAgIHJlc3BvbnNlID0gYXJndW1lbnRzOworCisgICAgICAgICAgICBzZWxm
Lmh0bWwoIHNlbGVjdG9yID8KKworICAgICAgICAgICAgICAgIC8vIElmIGEgc2VsZWN0b3Igd2Fz
IHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdgorICAg
ICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBE
ZW5pZWQnIGVycm9ycworICAgICAgICAgICAgICAgIGpRdWVyeSgiPGRpdj4iKS5hcHBlbmQoIGpR
dWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6CisKKyAg
ICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdAorICAgICAgICAg
ICAgICAgIHJlc3BvbnNlVGV4dCApOworCisgICAgICAgIH0pLmNvbXBsZXRlKCBjYWxsYmFjayAm
JiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKKyAgICAgICAgICAgIHNlbGYuZWFjaCggY2Fs
bGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0g
KTsKKyAgICAgICAgfSk7CiAgICAgfQotICAgIHdpbiA9IGdldFdpbmRvdyggZG9jICk7Ci0gICAg
cmV0dXJuIHsKLSAgICB0b3A6IGJveC50b3AgICsgKCB3aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxl
bS5zY3JvbGxUb3AgKSAgLSAoIGRvY0VsZW0uY2xpZW50VG9wICB8fCAwICksCi0gICAgbGVmdDog
Ym94LmxlZnQgKyAoIHdpbi5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbExlZnQgKSAtICgg
ZG9jRWxlbS5jbGllbnRMZWZ0IHx8IDAgKQotICAgIH07CisKKyAgICByZXR1cm4gdGhpczsKIH07
CiAKLWpRdWVyeS5vZmZzZXQgPSB7CiAKLSAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBv
cHRpb25zLCBpICkgewotICAgIHZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3Np
dGlvbiIgKTsKIAotICAgIC8vIHNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBh
cmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KLSAgICBpZiAoIHBvc2l0aW9uID09PSAic3RhdGlj
IiApIHsKLSAgICBlbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKLSAgICB9CiAKLSAg
ICB2YXIgY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAotICAgIGN1ck9mZnNldCA9IGN1ckVsZW0u
b2Zmc2V0KCksCi0gICAgY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKLSAg
ICBjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCi0gICAgY2FsY3VsYXRl
UG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4
ZWQiICkgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkg
PiAtMSwKLSAgICBwcm9wcyA9IHt9LCBjdXJQb3NpdGlvbiA9IHt9LCBjdXJUb3AsIGN1ckxlZnQ7
CitqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CisgICAg
cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAgICAg
ICAgcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07CisgICAgfSkubGVuZ3RoOworfTsKKwogCi0gICAg
Ly8gbmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXIgdG9wIG9y
IGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkCi0g
ICAgaWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHsKLSAgICBjdXJQb3NpdGlvbiA9IGN1ckVsZW0u
cG9zaXRpb24oKTsKLSAgICBjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7Ci0gICAgY3VyTGVmdCA9
IGN1clBvc2l0aW9uLmxlZnQ7Ci0gICAgfSBlbHNlIHsKLSAgICBjdXJUb3AgPSBwYXJzZUZsb2F0
KCBjdXJDU1NUb3AgKSB8fCAwOwotICAgIGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0
ICkgfHwgMDsKLSAgICB9CiAKLSAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkg
KSB7Ci0gICAgb3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7Ci0g
ICAgfQogCi0gICAgaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewotICAgIHByb3BzLnRvcCA9
ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7Ci0gICAgfQotICAgIGlm
ICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7Ci0gICAgcHJvcHMubGVmdCA9ICggb3B0aW9ucy5s
ZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7Ci0gICAgfQordmFyIGRvY0VsZW0gPSB3
aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogCi0gICAgaWYgKCAidXNpbmciIGluIG9w
dGlvbnMgKSB7Ci0gICAgb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwotICAgIH0g
ZWxzZSB7Ci0gICAgY3VyRWxlbS5jc3MoIHByb3BzICk7Ci0gICAgfQorLyoqCisgKiBHZXRzIGEg
d2luZG93IGZyb20gYW4gZWxlbWVudAorICovCitmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7
CisgICAgcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5
cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0VmlldzsKK30KKworalF1ZXJ5Lm9mZnNldCA9IHsKKyAg
ICBzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworICAgICAgICB2YXIg
Y3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNT
U0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAorICAgICAgICAgICAgcG9zaXRpb24gPSBqUXVlcnku
Y3NzKCBlbGVtLCAicG9zaXRpb24iICksCisgICAgICAgICAgICBjdXJFbGVtID0galF1ZXJ5KCBl
bGVtICksCisgICAgICAgICAgICBwcm9wcyA9IHt9OworCisgICAgICAgIC8vIFNldCBwb3NpdGlv
biBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KKyAg
ICAgICAgaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CisgICAgICAgICAgICBlbGVtLnN0
eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKyAgICAgICAgfQorCisgICAgICAgIGN1ck9mZnNl
dCA9IGN1ckVsZW0ub2Zmc2V0KCk7CisgICAgICAgIGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVs
ZW0sICJ0b3AiICk7CisgICAgICAgIGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVm
dCIgKTsKKyAgICAgICAgY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1
dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYKKyAgICAgICAgICAgICggY3VyQ1NTVG9w
ICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoImF1dG8iKSA+IC0xOworCisgICAgICAgIC8vIE5lZWQg
dG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBsZWZ0IGlz
IGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAorICAgICAgICBp
ZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworICAgICAgICAgICAgY3VyUG9zaXRpb24gPSBjdXJF
bGVtLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7Cisg
ICAgICAgICAgICBjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsKKyAg
ICAgICAgICAgIGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKyAg
ICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgeworICAgICAg
ICAgICAgcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRv
cDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgeworICAg
ICAgICAgICAgcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSAr
IGN1ckxlZnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyAp
IHsKKyAgICAgICAgICAgIG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsKKworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyRWxlbS5jc3MoIHByb3BzICk7CisgICAgICAg
IH0KICAgICB9CiB9OwogCi0KIGpRdWVyeS5mbi5leHRlbmQoeworICAgIG9mZnNldDogZnVuY3Rp
b24oIG9wdGlvbnMgKSB7CisgICAgICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKKyAgICAg
ICAgICAgIHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPworICAgICAgICAgICAgICAgIHRo
aXMgOgorICAgICAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsK
KyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkb2NFbGVtLCB3
aW4sCisgICAgICAgICAgICBlbGVtID0gdGhpc1sgMCBdLAorICAgICAgICAgICAgYm94ID0geyB0
b3A6IDAsIGxlZnQ6IDAgfSwKKyAgICAgICAgICAgIGRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRv
Y3VtZW50OworCisgICAgICAgIGlmICggIWRvYyApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50OworCisgICAg
ICAgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZQorICAgICAg
ICBpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKKyAgICAgICAgICAg
IHJldHVybiBib3g7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGdC
Q1IsIGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBlcnJvcgorICAgICAgICAvLyBCbGFja0JlcnJ5
IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpCisgICAgICAgIGlmICggdHlwZW9mIGVsZW0uZ2V0
Qm91bmRpbmdDbGllbnRSZWN0ICE9PSBzdHJ1bmRlZmluZWQgKSB7CisgICAgICAgICAgICBib3gg
PSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICAgICAgICB9CisgICAgICAgIHdpbiA9
IGdldFdpbmRvdyggZG9jICk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICB0b3A6IGJv
eC50b3AgKyB3aW4ucGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCwKKyAgICAgICAgICAg
IGxlZnQ6IGJveC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0Cisg
ICAgICAgIH07CisgICAgfSwKIAogICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKLSAgICBpZiAo
ICF0aGlzWyAwIF0gKSB7Ci0gICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgaWYgKCAhdGhpc1sg
MCBdICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICB2YXIgb2Zmc2V0
UGFyZW50LCBvZmZzZXQsCi0gICAgcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSwK
LSAgICBlbGVtID0gdGhpc1sgMCBdOworICAgICAgICB2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQs
CisgICAgICAgICAgICBlbGVtID0gdGhpc1sgMCBdLAorICAgICAgICAgICAgcGFyZW50T2Zmc2V0
ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKIAotICAgIC8vIGZpeGVkIGVsZW1lbnRzIGFyZSBvZmZz
ZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2Ug
aXQgaXMgaXQncyBvbmx5IG9mZnNldCBwYXJlbnQKLSAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0s
ICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKLSAgICAvLyB3ZSBhc3N1bWUgdGhhdCBnZXRC
b3VuZGluZ0NsaWVudFJlY3QgaXMgYXZhaWxhYmxlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMg
Zml4ZWQKLSAgICBvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwotICAgIH0g
ZWxzZSB7Ci0gICAgLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKLSAgICBvZmZzZXRQYXJlbnQg
PSB0aGlzLm9mZnNldFBhcmVudCgpOworICAgICAgICAvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zm
c2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNl
IGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnQKKyAgICAgICAgaWYgKCBqUXVlcnkuY3NzKCBl
bGVtLCAicG9zaXRpb24iICkgPT09ICJmaXhlZCIgKSB7CisgICAgICAgICAgICAvLyBXZSBhc3N1
bWUgdGhhdCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgYXZhaWxhYmxlIHdoZW4gY29tcHV0ZWQg
cG9zaXRpb24gaXMgZml4ZWQKKyAgICAgICAgICAgIG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdD
bGllbnRSZWN0KCk7CiAKLSAgICAvLyBHZXQgY29ycmVjdCBvZmZzZXRzCi0gICAgb2Zmc2V0ID0g
dGhpcy5vZmZzZXQoKTsKLSAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsg
MCBdLCAiaHRtbCIgKSApIHsKLSAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0
KCk7Ci0gICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0ICpyZWFsKiBv
ZmZzZXRQYXJlbnQKKyAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50
KCk7CiAKLSAgICAvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKLSAgICBwYXJlbnRPZmZzZXQu
dG9wICArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwg
dHJ1ZSApOwotICAgIHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVu
dFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOwotICAgIH0KKyAgICAgICAgICAgIC8v
IEdldCBjb3JyZWN0IG9mZnNldHMKKyAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7
CisgICAgICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAi
aHRtbCIgKSApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQu
b2Zmc2V0KCk7CisgICAgICAgICAgICB9CiAKLSAgICAvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0
cyBhbmQgZWxlbWVudCBtYXJnaW5zCi0gICAgLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBt
YXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKLSAgICAvLyBhcmUgdGhl
IHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAot
ICAgIHJldHVybiB7Ci0gICAgdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9wIC0g
alF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRydWUgKSwKLSAgICBsZWZ0OiBvZmZzZXQu
bGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQi
LCB0cnVlKQotICAgIH07CisgICAgICAgICAgICAvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMK
KyAgICAgICAgICAgIHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50
WyAwIF0sICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKKyAgICAgICAgICAgIHBhcmVudE9mZnNl
dC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRo
IiwgdHJ1ZSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VidHJhY3QgcGFyZW50IG9mZnNl
dHMgYW5kIGVsZW1lbnQgbWFyZ2lucworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgdG9w
OiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sICJtYXJn
aW5Ub3AiLCB0cnVlICksCisgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9m
ZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKKyAgICAg
ICAgfTsKICAgICB9LAogCiAgICAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zm
c2V0UGFyZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKLSAgICB3aGlsZSAoIG9mZnNl
dFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgImh0bWwiICkgJiYg
alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRpYyIgKSApIHsK
LSAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwotICAgIH0KLSAg
ICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKLSAgICB9
KTsKKyAgICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFy
IG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07CisKKyAgICAgICAg
ICAgIHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFy
ZW50LCAiaHRtbCIgKSAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIgKSA9
PT0gInN0YXRpYyIgKSApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQ
YXJlbnQub2Zmc2V0UGFyZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4g
b2Zmc2V0UGFyZW50IHx8IGRvY0VsZW07CisgICAgICAgIH0pOwogICAgIH0KIH0pOwogCi0KIC8v
IENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwotalF1ZXJ5LmVhY2goIHtz
Y3JvbGxMZWZ0OiAicGFnZVhPZmZzZXQiLCBzY3JvbGxUb3A6ICJwYWdlWU9mZnNldCJ9LCBmdW5j
dGlvbiggbWV0aG9kLCBwcm9wICkgewotICAgIHZhciB0b3AgPSAvWS8udGVzdCggcHJvcCApOwor
alF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFn
ZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7CisgICAgdmFyIHRvcCA9ICJw
YWdlWU9mZnNldCIgPT09IHByb3A7CiAKICAgICBqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rp
b24oIHZhbCApIHsKLSAgICByZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVs
ZW0sIG1ldGhvZCwgdmFsICkgewotICAgIHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTsKLQot
ICAgIGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7Ci0gICAgcmV0dXJuIHdpbiA/IChwcm9wIGlu
IHdpbikgPyB3aW5bIHByb3AgXSA6Ci0gICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsg
bWV0aG9kIF0gOgotICAgIGVsZW1bIG1ldGhvZCBdOwotICAgIH0KKyAgICAgICAgcmV0dXJuIGFj
Y2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgeworICAgICAgICAgICAg
dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOworCisgICAgICAgICAgICBpZiAoIHZhbCA9PT0g
dW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6
IGVsZW1bIG1ldGhvZCBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdpbiAp
IHsKKyAgICAgICAgICAgICAgICB3aW4uc2Nyb2xsVG8oCisgICAgICAgICAgICAgICAgICAgICF0
b3AgPyB2YWwgOiB3aW5kb3cucGFnZVhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHRvcCA/
IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBudWxs
ICk7CisgICAgfTsKK30pOwogCi0gICAgaWYgKCB3aW4gKSB7Ci0gICAgd2luLnNjcm9sbFRvKAot
ICAgICF0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbExlZnQoKSwKLSAgICB0b3AgPyB2
YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbFRvcCgpCisvLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hv
b2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgorLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0CisvLyBnZXRDb21wdXRlZFN0eWxlIHJl
dHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0Cisv
LyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1v
ZHVsZSwgd2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQoralF1ZXJ5LmVhY2goIFsgInRvcCIsICJs
ZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKKyAgICBqUXVlcnkuY3NzSG9va3NbIHByb3Ag
XSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLAorICAgICAgICBmdW5jdGlv
biggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAgICAgICAgICBpZiAoIGNvbXB1dGVkICkgeworICAg
ICAgICAgICAgICAgIGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7CisgICAgICAgICAg
ICAgICAgLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0
CisgICAgICAgICAgICAgICAgcmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID8KKyAg
ICAgICAgICAgICAgICAgICAgalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4
IiA6CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkOworICAgICAgICAgICAgfQorICAgICAg
ICB9CiAgICAgKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7Ci0g
ICAgfQotICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBudWxsICk7Ci0gICAg
fTsKIH0pOwogCi1mdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGpRdWVy
eS5pc1dpbmRvdyggZWxlbSApID8KLSAgICBlbGVtIDoKLSAgICBlbGVtLm5vZGVUeXBlID09PSA5
ID8KLSAgICBlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKLSAgICBmYWxz
ZTsKLX0KKwogLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRo
LCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCiBqUXVlcnkuZWFjaCggeyBIZWln
aHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHsK
ICAgICBqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiAiaW5uZXIiICsgbmFtZSwgY29udGVudDogdHlw
ZSwgIiI6ICJvdXRlciIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1l
ICkgewotICAgIC8vIG1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aAot
ICAgIGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkgewot
ICAgIHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8
IHR5cGVvZiBtYXJnaW4gIT09ICJib29sZWFuIiApLAotICAgIGV4dHJhID0gZGVmYXVsdEV4dHJh
IHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIgOiAiYm9y
ZGVyIiApOwotCi0gICAgcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVt
LCB0eXBlLCB2YWx1ZSApIHsKLSAgICB2YXIgZG9jOwotCi0gICAgaWYgKCBqUXVlcnkuaXNXaW5k
b3coIGVsZW0gKSApIHsKLSAgICAvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5j
b3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZQotICAgIC8vIGlzbid0
IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3Ig
ZGlzY3Vzc2lvbjoKLSAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxs
Lzc2NAotICAgIHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIg
KyBuYW1lIF07Ci0gICAgfQotCi0gICAgLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAot
ICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKLSAgICBkb2MgPSBlbGVtLmRvY3VtZW50
RWxlbWVudDsKLQotICAgIC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRb
V2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0
ZXN0Ci0gICAgLy8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84
IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBp
dC4KLSAgICByZXR1cm4gTWF0aC5tYXgoCi0gICAgZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUg
XSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKLSAgICBlbGVtLmJvZHlbICJvZmZzZXQiICsgbmFt
ZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBdLAotICAgIGRvY1sgImNsaWVudCIgKyBuYW1lIF0K
LSAgICApOwotICAgIH0KKyAgICAgICAgLy8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0
LCBvdXRlcldpZHRoCisgICAgICAgIGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBt
YXJnaW4sIHZhbHVlICkgeworICAgICAgICAgICAgdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5s
ZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICks
CisgICAgICAgICAgICAgICAgZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRy
dWUgfHwgdmFsdWUgPT09IHRydWUgPyAibWFyZ2luIiA6ICJib3JkZXIiICk7CisKKyAgICAgICAg
ICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsK
KyAgICAgICAgICAgICAgICB2YXIgZG9jOworCisgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnku
aXNXaW5kb3coIGVsZW0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXMgb2YgNS84LzIw
MTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBi
dXQgdGhlcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2Fu
IGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgorICAgICAg
ICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2
NAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1l
bnRbICJjbGllbnQiICsgbmFtZSBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKKyAgICAgICAgICAgICAgICBpZiAo
IGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvYyA9IGVsZW0u
ZG9jdW1lbnRFbGVtZW50OworCisgICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzY3JvbGxb
V2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVp
Z2h0XSwKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgKKyAgICAgICAgICAgICAgICAgICAgICAg
IGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisg
ICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmJvZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2Nb
ICJvZmZzZXQiICsgbmFtZSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgZG9jWyAiY2xpZW50
IiArIG5hbWUgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KKyAgICAgICAgICAg
ICAgICAgICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGlu
ZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAorICAgICAgICAgICAgICAgICAgICBqUXVlcnku
Y3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDoKKworICAgICAgICAgICAgICAgICAgICAvLyBTZXQg
d2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7CisgICAgICAgICAgICB9LCB0eXBl
LCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApOworICAg
ICAgICB9OworICAgIH0pOworfSk7CiAKLSAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/
Ci0gICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBi
dXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAotICAgIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4
dHJhICkgOgogCi0gICAgLy8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAotICAg
IGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7Ci0gICAgfSwgdHlwZSwg
Y2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTsKLSAgICB9
OworLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxl
bWVudCBzZXQKK2pRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMu
bGVuZ3RoOworfTsKKworalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjazsKKwor
CisKKworLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2Fu
IGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyCisvLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5l
LCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0CisvLyB1bmRl
cnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQg
bW9zdCByb2J1c3QKKy8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2Vk
IGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUKKy8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVz
LCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQorLy8gZmls
ZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBB
TUQgbW9kdWxlIHdhbnRzCisvLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNp
b24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCitpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5j
dGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKKyAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rp
b24oKSB7CisgICAgICAgIHJldHVybiBqUXVlcnk7CiAgICAgfSk7Ci19KTsKLS8vIExpbWl0IHNj
b3BlIHBvbGx1dGlvbiBmcm9tIGFueSBkZXByZWNhdGVkIEFQSQotLy8gKGZ1bmN0aW9uKCkgewot
Ci0vLyB9KSgpOwotLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAotd2luZG93
LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5OwotCi0vLyBFeHBvc2UgalF1ZXJ5IGFzIGFuIEFN
RCBtb2R1bGUsIGJ1dCBvbmx5IGZvciBBTUQgbG9hZGVycyB0aGF0Ci0vLyB1bmRlcnN0YW5kIHRo
ZSBpc3N1ZXMgd2l0aCBsb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIGpRdWVyeQotLy8gaW4g
YSBwYWdlIHRoYXQgYWxsIG1pZ2h0IGNhbGwgZGVmaW5lKCkuIFRoZSBsb2FkZXIgd2lsbCBpbmRp
Y2F0ZQotLy8gdGhleSBoYXZlIHNwZWNpYWwgYWxsb3dhbmNlcyBmb3IgbXVsdGlwbGUgalF1ZXJ5
IHZlcnNpb25zIGJ5Ci0vLyBzcGVjaWZ5aW5nIGRlZmluZS5hbWQualF1ZXJ5ID0gdHJ1ZS4gUmVn
aXN0ZXIgYXMgYSBuYW1lZCBtb2R1bGUsCi0vLyBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVu
YXRlZCB3aXRoIG90aGVyIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsCi0vLyBidXQgbm90IHVz
ZSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0IHVuZGVyc3RhbmRzIGFub255bW91
cwotLy8gQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Qg
d2F5IHRvIHJlZ2lzdGVyLgotLy8gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1E
IG1vZHVsZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tCi0vLyBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5
IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZSBmaWxlIG5hbWUuCi0vLyBEbyB0
aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdh
bnRzIHRvIGNhbGwKLS8vIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5
LCBpdCB3aWxsIHdvcmsuCi1pZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVm
aW5lLmFtZCAmJiBkZWZpbmUuYW1kLmpRdWVyeSApIHsKLSAgICBkZWZpbmUoICJqcXVlcnkiLCBb
XSwgZnVuY3Rpb24gKCkgeyByZXR1cm4galF1ZXJ5OyB9ICk7CiB9CiAKLX0pKCB3aW5kb3cgKTsK
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKworCit2YXIKKyAgICAvLyBNYXAgb3ZlciBq
UXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKyAgICBfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwK
KworICAgIC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisgICAgXyQgPSB3
aW5kb3cuJDsKKworalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKKyAgICBp
ZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgICAgIHdpbmRvdy4kID0gXyQ7CisgICAg
fQorCisgICAgaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKKyAgICAg
ICAgd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisgICAgfQorCisgICAgcmV0dXJuIGpRdWVyeTsK
K307CisKKy8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4KKy8vIEFN
RCAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVs
bC81NTcpCisvLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpCitp
ZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gc3RydW5kZWZpbmVkICkgeworICAgIHdpbmRvdy5qUXVl
cnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKK30KKworCisKKworcmV0dXJuIGpRdWVyeTsKKworfSkp
OwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3Rv
ZG9tdmMtY29tbW9uL2Jhc2UuY3NzIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzCmluZGV4IGJiNzk0MTQyMTcyOTdlNWNmNDI1
MjU3ZTYyMTJjZGUyZGQ0YTRlMDQuLjMxZWVlZjhjN2RlNmUyNzkyODEwMzkwZGUxZWNlZWU3MjZl
OWI2ZTYgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50
cy90b2RvbXZjLWNvbW1vbi9iYXNlLmNzcworKysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZl
bkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jv
d2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MKQEAgLTE0LDcgKzE0LDYgQEAg
YnV0dG9uIHsKICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICBjb2xvcjogaW5oZXJpdDsK
ICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgLyotbW96LWFwcGVhcmFuY2U6IG5v
bmU7Ki8KICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTsKICAgICAtby1hcHBlYXJhbmNlOiBub25l
OwogICAgIGFwcGVhcmFuY2U6IG5vbmU7CkBAIC0zNCw2ICszMywxMSBAQCBib2R5IHsKICAgICBm
b250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiB9CiAKK2J1dHRvbiwKK2lucHV0W3R5cGU9ImNo
ZWNrYm94Il0geworICBvdXRsaW5lOiBub25lOworfQorCiAjdG9kb2FwcCB7CiAgICAgYmFja2dy
b3VuZDogI2ZmZjsKICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CkBA
IC00Myw3ICs0Nyw3IEBAIGJvZHkgewogICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsK
ICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4OwogICAgIGJveC1zaGFkb3c6IDAgMnB4
IDZweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwKLSAgICAwIDI1cHggNTBweCAwIHJnYmEoMCwgMCwg
MCwgMC4xNSk7CisgICAgICAgICAgICAgICAgMCAyNXB4IDUwcHggMCByZ2JhKDAsIDAsIDAsIDAu
MTUpOwogfQogCiAjdG9kb2FwcDpiZWZvcmUgewpAQCAtMTAwLDkgKzEwNCw2IEBAIGJvZHkgewog
ICAgIGJhY2tncm91bmQ6ICM4ZDdkNzc7CiAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVu
dChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbShyZ2JhKDEzMiwgMTEwLCAxMDAs
IDAuOCkpLHRvKHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpKTsKICAgICBiYWNrZ3JvdW5kOiAtd2Vi
a2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSwgcmdiYSgx
MDEsIDg0LCA3NiwgMC44KSk7Ci0gICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQo
dG9wLCByZ2JhKDEzMiwgMTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOwot
ICAgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMTMyLCAxMTAsIDEw
MCwgMC44KSwgcmdiYSgxMDEsIDg0LCA3NiwgMC44KSk7Ci0gICAgYmFja2dyb3VuZDogLW1zLWxp
bmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSwgcmdiYSgxMDEsIDg0
LCA3NiwgMC44KSk7CiAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgx
MzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKICAgICBmaWx0ZXI6
IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGU9
MCxTdGFydENvbG9yU3RyPScjOWQ4YjgzJywgRW5kQ29sb3JTdHI9JyM4NDc2NzAnKTsKICAgICBi
b3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxcHg7CkBAIC0xMjMsNyArMTI0LDYgQEAgYm9keSB7CiAg
ICAgcGFkZGluZzogNnB4OwogICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CiAgICAgYm94LXNo
YWRvdzogaW5zZXQgMCAtMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTsKLSAgICAtd2Via2l0
LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94
OwogICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgIC1vLWJveC1zaXppbmc6IGJv
cmRlci1ib3g7CkBAIC0xNTksNyArMTU5LDggQEAgbGFiZWxbZm9yPSd0b2dnbGUtYWxsJ10gewog
ICAgIGxlZnQ6IC00cHg7CiAgICAgd2lkdGg6IDQwcHg7CiAgICAgdGV4dC1hbGlnbjogY2VudGVy
OwotICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworICAgIC8qIE1vYmlsZSBT
YWZhcmkgKi8KKyAgICBib3JkZXI6IG5vbmU7CiB9CiAKICN0b2dnbGUtYWxsOmJlZm9yZSB7CkBA
IC0yMTQsOSArMjE1LDkgQEAgbGFiZWxbZm9yPSd0b2dnbGUtYWxsJ10gewogICAgIHRvcDogMDsK
ICAgICBib3R0b206IDA7CiAgICAgbWFyZ2luOiBhdXRvIDA7Ci0gICAgYm9yZGVyOiBub25lOyAv
KiBNb2JpbGUgU2FmYXJpICovCisgICAgLyogTW9iaWxlIFNhZmFyaSAqLworICAgIGJvcmRlcjog
bm9uZTsKICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgLyotbW96LWFwcGVhcmFu
Y2U6IG5vbmU7Ki8KICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTsKICAgICAtby1hcHBlYXJhbmNl
OiBub25lOwogICAgIGFwcGVhcmFuY2U6IG5vbmU7CkBAIC0yMjQsNyArMjI1LDggQEAgbGFiZWxb
Zm9yPSd0b2dnbGUtYWxsJ10gewogCiAjdG9kby1saXN0IGxpIC50b2dnbGU6YWZ0ZXIgewogICAg
IGNvbnRlbnQ6ICfinJQnOwotICAgIGxpbmUtaGVpZ2h0OiA0M3B4OyAvKiA0MCArIGEgY291cGxl
IG9mIHBpeGVscyB2aXN1YWwgYWRqdXN0bWVudCAqLworICAgIC8qIDQwICsgYSBjb3VwbGUgb2Yg
cGl4ZWxzIHZpc3VhbCBhZGp1c3RtZW50ICovCisgICAgbGluZS1oZWlnaHQ6IDQzcHg7CiAgICAg
Zm9udC1zaXplOiAyMHB4OwogICAgIGNvbG9yOiAjZDlkOWQ5OwogICAgIHRleHQtc2hhZG93OiAw
IC0xcHggMCAjYmZiZmJmOwpAQCAtMjM4LDE1ICsyNDAsMTMgQEAgbGFiZWxbZm9yPSd0b2dnbGUt
YWxsJ10gewogfQogCiAjdG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3aGl0ZS1zcGFjZTogcHJl
OwogICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ci0gICAgcGFkZGluZzogMTVweDsKKyAgICBw
YWRkaW5nOiAxNXB4IDYwcHggMTVweCAxNXB4OwogICAgIG1hcmdpbi1sZWZ0OiA0NXB4OwogICAg
IGRpc3BsYXk6IGJsb2NrOwogICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgLXdlYmtpdC10cmFu
c2l0aW9uOiBjb2xvciAwLjRzOwotICAgIC1tb3otdHJhbnNpdGlvbjogY29sb3IgMC40czsKLSAg
ICAtbXMtdHJhbnNpdGlvbjogY29sb3IgMC40czsKLSAgICAtby10cmFuc2l0aW9uOiBjb2xvciAw
LjRzOwogICAgIHRyYW5zaXRpb246IGNvbG9yIDAuNHM7CiB9CiAKQEAgLTI2NywxOSArMjY3LDE0
IEBAIGxhYmVsW2Zvcj0ndG9nZ2xlLWFsbCddIHsKICAgICBmb250LXNpemU6IDIycHg7CiAgICAg
Y29sb3I6ICNhODhhOGE7CiAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKLSAgICAt
bW96LXRyYW5zaXRpb246IGFsbCAwLjJzOwotICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yczsK
LSAgICAtby10cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsK
IH0KIAogI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7CiAgICAgdGV4dC1zaGFkb3c6IDAg
MCAxcHggIzAwMCwKLSAgICAgMCAwIDEwcHggcmdiYSgxOTksIDEwNywgMTA3LCAwLjgpOworICAg
ICAgICAgICAgICAgICAwIDAgMTBweCByZ2JhKDE5OSwgMTA3LCAxMDcsIDAuOCk7CiAgICAgLXdl
YmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7Ci0gICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEu
Myk7CiAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4zKTsKLSAgICAtby10cmFuc2Zvcm06IHNj
YWxlKDEuMyk7CiAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpOwogfQogCkBAIC0zMjAsMTAgKzMx
NSwxMCBAQCBsYWJlbFtmb3I9J3RvZ2dsZS1hbGwnXSB7CiAgICAgaGVpZ2h0OiA1MHB4OwogICAg
IHotaW5kZXg6IC0xOwogICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAu
MyksCi0gICAgMCA2cHggMCAtM3B4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSwKLSAgICAwIDdw
eCAxcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMyksCi0gICAgMCA0M3B4IDAgLTZweCByZ2JhKDI1
NSwgMjU1LCAyNTUsIDAuOCksCi0gICAgMCA0NHB4IDJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4y
KTsKKyAgICAgICAgICAgICAgICAwIDZweCAwIC0zcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgp
LAorICAgICAgICAgICAgICAgIDAgN3B4IDFweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwKKyAg
ICAgICAgICAgICAgICAwIDQzcHggMCAtNnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSwKKyAg
ICAgICAgICAgICAgICAwIDQ0cHggMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogfQogCiAj
dG9kby1jb3VudCB7CkBAIC0zODcsMzAgKzM4MiwzMiBAQCBsYWJlbFtmb3I9J3RvZ2dsZS1hbGwn
XSB7CiAgICAgSGFjayB0byByZW1vdmUgYmFja2dyb3VuZCBmcm9tIE1vYmlsZSBTYWZhcmkuCiAg
ICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNrYm94ZXMgaW4g
RmlyZWZveCBhbmQgT3BlcmEKICovCisKIEBtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1k
ZXZpY2UtcGl4ZWwtcmF0aW86MCkgewogICAgICN0b2dnbGUtYWxsLAogICAgICN0b2RvLWxpc3Qg
bGkgLnRvZ2dsZSB7Ci0gICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICAgICAgYmFja2dyb3VuZDog
bm9uZTsKICAgICB9CiAKICAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgewotICAgIGhlaWdodDog
NDBweDsKKyAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgIH0KIAogICAgICN0b2dnbGUtYWxsIHsK
LSAgICB0b3A6IC01NnB4OwotICAgIGxlZnQ6IC0xNXB4OwotICAgIHdpZHRoOiA2NXB4OwotICAg
IGhlaWdodDogNDFweDsKLSAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKLSAg
ICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25l
OwotICAgIGFwcGVhcmFuY2U6IG5vbmU7CisgICAgICAgIHRvcDogLTU2cHg7CisgICAgICAgIGxl
ZnQ6IC0xNXB4OworICAgICAgICB3aWR0aDogNjVweDsKKyAgICAgICAgaGVpZ2h0OiA0MXB4Owor
ICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAgICAgLW1zLXRy
YW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcp
OworICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgICAgIGFwcGVhcmFuY2U6
IG5vbmU7CiAgICAgfQogfQogCi0uaGlkZGVuewotICAgIGRpc3BsYXk6bm9uZTsKKy5oaWRkZW4g
eworICAgIGRpc3BsYXk6IG5vbmU7CiB9CiAKIGhyIHsKQEAgLTUyOCw3ICs1MjUsNyBAQCBociB7
CiAgICAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMDQpOwogfQogCi0vKipib2R5
Ki8ubGVhcm4tYmFyID4gLmxlYXJuIHsKKy5sZWFybi1iYXIgPiAubGVhcm4gewogICAgIHBvc2l0
aW9uOiBhYnNvbHV0ZTsKICAgICB3aWR0aDogMjcycHg7CiAgICAgdG9wOiA4cHg7CkBAIC01MzYs
MjAgKzUzMywyNCBAQCBociB7CiAgICAgcGFkZGluZzogMTBweDsKICAgICBib3JkZXItcmFkaXVz
OiA1cHg7CiAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAuNik7Cisg
ICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBsZWZ0OwogICAgIHRyYW5zaXRpb24tcHJv
cGVydHk6IGxlZnQ7CisgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKICAg
ICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKIH0KIAogQG1lZGlhIChtaW4td2lkdGg6IDg5
OXB4KSB7Ci0gICAgLyoqYm9keSovLmxlYXJuLWJhciB7Ci0gICAgd2lkdGg6IGF1dG87Ci0gICAg
bWFyZ2luOiAwIDAgMCAzMDBweDsKKyAgICAubGVhcm4tYmFyIHsKKyAgICAgICAgd2lkdGg6IGF1
dG87CisgICAgICAgIG1hcmdpbjogMCAwIDAgMzAwcHg7CiAgICAgfQotICAgIC8qKmJvZHkqLy5s
ZWFybi1iYXIgPiAubGVhcm4gewotICAgIGxlZnQ6IDhweDsKKworICAgIC5sZWFybi1iYXIgPiAu
bGVhcm4geworICAgICAgICBsZWZ0OiA4cHg7CiAgICAgfQotICAgIC8qKmJvZHkqLy5sZWFybi1i
YXIgI3RvZG9hcHAgewotICAgIHdpZHRoOiA1NTBweDsKLSAgICBtYXJnaW46IDEzMHB4IGF1dG8g
NDBweCBhdXRvOworCisgICAgLmxlYXJuLWJhciAjdG9kb2FwcCB7CisgICAgICAgIHdpZHRoOiA1
NTBweDsKKyAgICAgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQwcHggYXV0bzsKICAgICB9CiB9CmRp
ZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212
Yy1jb21tb24vYmFzZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50
cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCmluZGV4IGY5YmY0MjQwZmFkOWE5YzExOTRjODE1ODZk
YzI5MTZiZWMxY2NhNzguLjM2OGU1ZWEwM2E2MWFkMzY2NzljMTVlYTBhZjY0ODkxMzcxZGI5ZWEg
MTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2Rv
bXZjLWNvbW1vbi9iYXNlLmpzCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29t
cG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCkBAIC00LDIwNCArNCwyMDQgQEAKICAgICAv
LyBVbmRlcnNjb3JlJ3MgVGVtcGxhdGUgTW9kdWxlCiAgICAgLy8gQ291cnRlc3kgb2YgdW5kZXJz
Y29yZWpzLm9yZwogICAgIHZhciBfID0gKGZ1bmN0aW9uIChfKSB7Ci0gICAgXy5kZWZhdWx0cyA9
IGZ1bmN0aW9uIChvYmplY3QpIHsKLSAgICBpZiAoIW9iamVjdCkgewotICAgIHJldHVybiBvYmpl
Y3Q7Ci0gICAgfQotICAgIGZvciAodmFyIGFyZ3NJbmRleCA9IDEsIGFyZ3NMZW5ndGggPSBhcmd1
bWVudHMubGVuZ3RoOyBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoOyBhcmdzSW5kZXgrKykgewotICAg
IHZhciBpdGVyYWJsZSA9IGFyZ3VtZW50c1thcmdzSW5kZXhdOwotICAgIGlmIChpdGVyYWJsZSkg
ewotICAgIGZvciAodmFyIGtleSBpbiBpdGVyYWJsZSkgewotICAgIGlmIChvYmplY3Rba2V5XSA9
PSBudWxsKSB7Ci0gICAgb2JqZWN0W2tleV0gPSBpdGVyYWJsZVtrZXldOwotICAgIH0KLSAgICB9
Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8vIEJ5IGRl
ZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hh
bmdlIHRoZQotICAgIC8vIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJu
YXRpdmUgZGVsaW1pdGVycy4KLSAgICBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7Ci0gICAgZXZhbHVh
dGUgICAgOiAvPCUoW1xzXFNdKz8pJT4vZywKLSAgICBpbnRlcnBvbGF0ZSA6IC88JT0oW1xzXFNd
Kz8pJT4vZywKLSAgICBlc2NhcGUgICAgICA6IC88JS0oW1xzXFNdKz8pJT4vZwotICAgIH07Ci0K
LSAgICAvLyBXaGVuIGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRpbmdzYCwgaWYgeW91IGRvbid0
IHdhbnQgdG8gZGVmaW5lIGFuCi0gICAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBl
c2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpcwotICAgIC8vIGd1YXJhbnRlZWQgbm90
IHRvIG1hdGNoLgotICAgIHZhciBub01hdGNoID0gLyguKV4vOwotCi0gICAgLy8gQ2VydGFpbiBj
aGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRv
IGEKLSAgICAvLyBzdHJpbmcgbGl0ZXJhbC4KLSAgICB2YXIgZXNjYXBlcyA9IHsKLSAgICAiJyI6
ICAgICAgIiciLAotICAgICdcXCc6ICAgICAnXFwnLAotICAgICdccic6ICAgICAncicsCi0gICAg
J1xuJzogICAgICduJywKLSAgICAnXHQnOiAgICAgJ3QnLAotICAgICdcdTIwMjgnOiAndTIwMjgn
LAotICAgICdcdTIwMjknOiAndTIwMjknCi0gICAgfTsKLQotICAgIHZhciBlc2NhcGVyID0gL1xc
fCd8XHJ8XG58XHR8XHUyMDI4fFx1MjAyOS9nOwotCi0gICAgLy8gSmF2YVNjcmlwdCBtaWNyby10
ZW1wbGF0aW5nLCBzaW1pbGFyIHRvIEpvaG4gUmVzaWcncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAv
LyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJl
c2VydmVzIHdoaXRlc3BhY2UsCi0gICAgLy8gYW5kIGNvcnJlY3RseSBlc2NhcGVzIHF1b3RlcyB3
aXRoaW4gaW50ZXJwb2xhdGVkIGNvZGUuCi0gICAgXy50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHRleHQs
IGRhdGEsIHNldHRpbmdzKSB7Ci0gICAgdmFyIHJlbmRlcjsKLSAgICBzZXR0aW5ncyA9IF8uZGVm
YXVsdHMoe30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0dGluZ3MpOwotCi0gICAgLy8gQ29tYmlu
ZSBkZWxpbWl0ZXJzIGludG8gb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB2aWEgYWx0ZXJuYXRpb24u
Ci0gICAgdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKFsKLSAgICAoc2V0dGluZ3MuZXNjYXBlIHx8
IG5vTWF0Y2gpLnNvdXJjZSwKLSAgICAoc2V0dGluZ3MuaW50ZXJwb2xhdGUgfHwgbm9NYXRjaCku
c291cmNlLAotICAgIChzZXR0aW5ncy5ldmFsdWF0ZSB8fCBub01hdGNoKS5zb3VyY2UKLSAgICBd
LmpvaW4oJ3wnKSArICd8JCcsICdnJyk7Ci0KLSAgICAvLyBDb21waWxlIHRoZSB0ZW1wbGF0ZSBz
b3VyY2UsIGVzY2FwaW5nIHN0cmluZyBsaXRlcmFscyBhcHByb3ByaWF0ZWx5LgotICAgIHZhciBp
bmRleCA9IDA7Ci0gICAgdmFyIHNvdXJjZSA9ICJfX3ArPSciOwotICAgIHRleHQucmVwbGFjZSht
YXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9m
ZnNldCkgewotICAgIHNvdXJjZSArPSB0ZXh0LnNsaWNlKGluZGV4LCBvZmZzZXQpCi0gICAgLnJl
cGxhY2UoZXNjYXBlciwgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICdcXCcgKyBlc2NhcGVzW21h
dGNoXTsgfSk7Ci0KLSAgICBpZiAoZXNjYXBlKSB7Ci0gICAgc291cmNlICs9ICInK1xuKChfX3Q9
KCIgKyBlc2NhcGUgKyAiKSk9PW51bGw/Jyc6Xy5lc2NhcGUoX190KSkrXG4nIjsKLSAgICB9Ci0g
ICAgaWYgKGludGVycG9sYXRlKSB7Ci0gICAgc291cmNlICs9ICInK1xuKChfX3Q9KCIgKyBpbnRl
cnBvbGF0ZSArICIpKT09bnVsbD8nJzpfX3QpK1xuJyI7Ci0gICAgfQotICAgIGlmIChldmFsdWF0
ZSkgewotICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFsdWF0ZSArICJcbl9fcCs9JyI7Ci0gICAg
fQotICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOwotICAgIHJldHVybiBtYXRjaDsK
LSAgICB9KTsKLSAgICBzb3VyY2UgKz0gIic7XG4iOwotCi0gICAgLy8gSWYgYSB2YXJpYWJsZSBp
cyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS4KLSAgICBp
ZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcbicgKyBzb3Vy
Y2UgKyAnfVxuJzsKLQotICAgIHNvdXJjZSA9ICJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJv
dG90eXBlLmpvaW4sIiArCi0gICAgInByaW50PWZ1bmN0aW9uKCl7X19wKz1fX2ouY2FsbChhcmd1
bWVudHMsJycpO307XG4iICsKLSAgICBzb3VyY2UgKyAicmV0dXJuIF9fcDtcbiI7Ci0KLSAgICB0
cnkgewotICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2Jq
JywgJ18nLCBzb3VyY2UpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICBlLnNvdXJjZSA9IHNvdXJj
ZTsKLSAgICB0aHJvdyBlOwotICAgIH0KLQotICAgIGlmIChkYXRhKSByZXR1cm4gcmVuZGVyKGRh
dGEsIF8pOwotICAgIHZhciB0ZW1wbGF0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICByZXR1cm4g
cmVuZGVyLmNhbGwodGhpcywgZGF0YSwgXyk7Ci0gICAgfTsKLQotICAgIC8vIFByb3ZpZGUgdGhl
IGNvbXBpbGVkIGZ1bmN0aW9uIHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxh
dGlvbi4KLSAgICB0ZW1wbGF0ZS5zb3VyY2UgPSAnZnVuY3Rpb24oJyArIChzZXR0aW5ncy52YXJp
YWJsZSB8fCAnb2JqJykgKyAnKXtcbicgKyBzb3VyY2UgKyAnfSc7Ci0KLSAgICByZXR1cm4gdGVt
cGxhdGU7Ci0gICAgfTsKLQotICAgIHJldHVybiBfOworICAgICAgICBfLmRlZmF1bHRzID0gZnVu
Y3Rpb24gKG9iamVjdCkgeworICAgICAgICAgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh2YXIg
YXJnc0luZGV4ID0gMSwgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJbmRleCA8
IGFyZ3NMZW5ndGg7IGFyZ3NJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGl0ZXJhYmxl
ID0gYXJndW1lbnRzW2FyZ3NJbmRleF07CisgICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7
CisgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBpdGVyYWJsZSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldID09IG51bGwpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxlW2tleV07CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisK
KyAgICAgICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0
ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCisgICAgICAgIC8vIGZvbGxvd2luZyB0ZW1wbGF0ZSBz
ZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4KKyAgICAgICAgXy50ZW1wbGF0
ZVNldHRpbmdzID0geworICAgICAgICAgICAgZXZhbHVhdGUgICAgOiAvPCUoW1xzXFNdKz8pJT4v
ZywKKyAgICAgICAgICAgIGludGVycG9sYXRlIDogLzwlPShbXHNcU10rPyklPi9nLAorICAgICAg
ICAgICAgZXNjYXBlICAgICAgOiAvPCUtKFtcc1xTXSs/KSU+L2cKKyAgICAgICAgfTsKKworICAg
ICAgICAvLyBXaGVuIGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRpbmdzYCwgaWYgeW91IGRvbid0
IHdhbnQgdG8gZGVmaW5lIGFuCisgICAgICAgIC8vIGludGVycG9sYXRpb24sIGV2YWx1YXRpb24g
b3IgZXNjYXBpbmcgcmVnZXgsIHdlIG5lZWQgb25lIHRoYXQgaXMKKyAgICAgICAgLy8gZ3VhcmFu
dGVlZCBub3QgdG8gbWF0Y2guCisgICAgICAgIHZhciBub01hdGNoID0gLyguKV4vOworCisgICAg
ICAgIC8vIENlcnRhaW4gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVzY2FwZWQgc28gdGhhdCB0aGV5
IGNhbiBiZSBwdXQgaW50byBhCisgICAgICAgIC8vIHN0cmluZyBsaXRlcmFsLgorICAgICAgICB2
YXIgZXNjYXBlcyA9IHsKKyAgICAgICAgICAgICInIjogICAgICAiJyIsCisgICAgICAgICAgICAn
XFwnOiAgICAgJ1xcJywKKyAgICAgICAgICAgICdccic6ICAgICAncicsCisgICAgICAgICAgICAn
XG4nOiAgICAgJ24nLAorICAgICAgICAgICAgJ1x0JzogICAgICd0JywKKyAgICAgICAgICAgICdc
dTIwMjgnOiAndTIwMjgnLAorICAgICAgICAgICAgJ1x1MjAyOSc6ICd1MjAyOScKKyAgICAgICAg
fTsKKworICAgICAgICB2YXIgZXNjYXBlciA9IC9cXHwnfFxyfFxufFx0fFx1MjAyOHxcdTIwMjkv
ZzsKKworICAgICAgICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8g
Sm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLgorICAgICAgICAvLyBVbmRlcnNjb3JlIHRlbXBs
YXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2Us
CisgICAgICAgIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9s
YXRlZCBjb2RlLgorICAgICAgICBfLnRlbXBsYXRlID0gZnVuY3Rpb24odGV4dCwgZGF0YSwgc2V0
dGluZ3MpIHsKKyAgICAgICAgICAgIHZhciByZW5kZXI7CisgICAgICAgICAgICBzZXR0aW5ncyA9
IF8uZGVmYXVsdHMoe30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0dGluZ3MpOworCisgICAgICAg
ICAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZp
YSBhbHRlcm5hdGlvbi4KKyAgICAgICAgICAgIHZhciBtYXRjaGVyID0gbmV3IFJlZ0V4cChbCisg
ICAgICAgICAgICAgICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01hdGNoKS5zb3VyY2UsCisgICAg
ICAgICAgICAgICAgKHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5vTWF0Y2gpLnNvdXJjZSwKKyAg
ICAgICAgICAgICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlCisgICAg
ICAgICAgICBdLmpvaW4oJ3wnKSArICd8JCcsICdnJyk7CisKKyAgICAgICAgICAgIC8vIENvbXBp
bGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJp
YXRlbHkuCisgICAgICAgICAgICB2YXIgaW5kZXggPSAwOworICAgICAgICAgICAgdmFyIHNvdXJj
ZSA9ICJfX3ArPSciOworICAgICAgICAgICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9u
KG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7CisgICAgICAg
ICAgICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkKKyAgICAgICAgICAg
ICAgICAgICAgLnJlcGxhY2UoZXNjYXBlciwgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICdcXCcg
KyBlc2NhcGVzW21hdGNoXTsgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXNjYXBlKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJytcbigoX190PSgiICsgZXNjYXBlICsgIikp
PT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2Ug
Kz0gIicrXG4oKF9fdD0oIiArIGludGVycG9sYXRlICsgIikpPT1udWxsPycnOl9fdCkrXG4nIjsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGV2YWx1YXRlKSB7CisgICAg
ICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFsdWF0ZSArICJcbl9fcCs9JyI7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0
Y2gubGVuZ3RoOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKKyAgICAgICAgICAgIH0p
OworICAgICAgICAgICAgc291cmNlICs9ICInO1xuIjsKKworICAgICAgICAgICAgLy8gSWYgYSB2
YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29w
ZS4KKyAgICAgICAgICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9i
anx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOworCisgICAgICAgICAgICBzb3VyY2UgPSAidmFy
IF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLCIgKworICAgICAgICAgICAgICAg
ICJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xuIiArCisg
ICAgICAgICAgICAgICAgc291cmNlICsgInJldHVybiBfX3A7XG4iOworCisgICAgICAgICAgICB0
cnkgeworICAgICAgICAgICAgICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJp
YWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoZSkgewor
ICAgICAgICAgICAgICAgIGUuc291cmNlID0gc291cmNlOworICAgICAgICAgICAgICAgIHRocm93
IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkYXRhKSByZXR1cm4gcmVuZGVy
KGRhdGEsIF8pOworICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkgewor
ICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9u
IHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxhdGlvbi4KKyAgICAgICAgICAg
IHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdv
YmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKKworICAgICAgICAgICAgcmV0dXJuIHRlbXBs
YXRlOworICAgICAgICB9OworCisgICAgICAgIHJldHVybiBfOwogICAgIH0pKHt9KTsKIAogICAg
IGlmIChsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ3RvZG9tdmMuY29tJykgewotICAgIHdpbmRvdy5f
Z2FxID0gW1snX3NldEFjY291bnQnLCdVQS0zMTA4MTA2Mi0xJ10sWydfdHJhY2tQYWdldmlldydd
XTsoZnVuY3Rpb24oZCx0KXt2YXIgZz1kLmNyZWF0ZUVsZW1lbnQodCkscz1kLmdldEVsZW1lbnRz
QnlUYWdOYW1lKHQpWzBdO2cuc3JjPScvL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcyc7
cy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLHMpfShkb2N1bWVudCwnc2NyaXB0JykpOworICAg
ICAgICB3aW5kb3cuX2dhcSA9IFtbJ19zZXRBY2NvdW50JywnVUEtMzEwODEwNjItMSddLFsnX3Ry
YWNrUGFnZXZpZXcnXV07KGZ1bmN0aW9uKGQsdCl7dmFyIGc9ZC5jcmVhdGVFbGVtZW50KHQpLHM9
ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXTtnLnNyYz0nLy93d3cuZ29vZ2xlLWFuYWx5dGlj
cy5jb20vZ2EuanMnO3MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxzKX0oZG9jdW1lbnQsJ3Nj
cmlwdCcpKTsKICAgICB9CiAKICAgICBmdW5jdGlvbiByZWRpcmVjdCgpIHsKLSAgICBpZiAobG9j
YXRpb24uaG9zdG5hbWUgPT09ICd0YXN0ZWpzLmdpdGh1Yi5pbycpIHsKLSAgICBsb2NhdGlvbi5o
cmVmID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKCd0YXN0ZWpzLmdpdGh1Yi5pby90b2RvbXZjJywg
J3RvZG9tdmMuY29tJyk7Ci0gICAgfQorICAgICAgICBpZiAobG9jYXRpb24uaG9zdG5hbWUgPT09
ICd0YXN0ZWpzLmdpdGh1Yi5pbycpIHsKKyAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsb2Nh
dGlvbi5ocmVmLnJlcGxhY2UoJ3Rhc3RlanMuZ2l0aHViLmlvL3RvZG9tdmMnLCAndG9kb212Yy5j
b20nKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGZ1bmN0aW9uIGZpbmRSb290KCkgewotICAg
IHZhciBiYXNlOworICAgICAgICB2YXIgYmFzZTsKIAotICAgIFsvbGFicy8sIC9cdyotZXhhbXBs
ZXMvXS5mb3JFYWNoKGZ1bmN0aW9uIChocmVmKSB7Ci0gICAgdmFyIG1hdGNoID0gbG9jYXRpb24u
aHJlZi5tYXRjaChocmVmKTsKKyAgICAgICAgWy9sYWJzLywgL1x3Ki1leGFtcGxlcy9dLmZvckVh
Y2goZnVuY3Rpb24gKGhyZWYpIHsKKyAgICAgICAgICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhy
ZWYubWF0Y2goaHJlZik7CiAKLSAgICBpZiAoIWJhc2UgJiYgbWF0Y2gpIHsKLSAgICBiYXNlID0g
bG9jYXRpb24uaHJlZi5pbmRleE9mKG1hdGNoKTsKLSAgICB9Ci0gICAgfSk7CisgICAgICAgICAg
ICBpZiAoIWJhc2UgJiYgbWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBiYXNlID0gbG9jYXRpb24u
aHJlZi5pbmRleE9mKG1hdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLSAgICBy
ZXR1cm4gbG9jYXRpb24uaHJlZi5zdWJzdHIoMCwgYmFzZSk7CisgICAgICAgIHJldHVybiBsb2Nh
dGlvbi5ocmVmLnN1YnN0cigwLCBiYXNlKTsKICAgICB9CiAKICAgICBmdW5jdGlvbiBnZXRGaWxl
KGZpbGUsIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFsb2NhdGlvbi5ob3N0KSB7Ci0gICAgcmV0dXJu
IGNvbnNvbGUuaW5mbygnTWlzcyB0aGUgaW5mbyBiYXI/IFJ1biBUb2RvTVZDIGZyb20gYSBzZXJ2
ZXIgdG8gYXZvaWQgYSBjcm9zcy1vcmlnaW4gZXJyb3IuJyk7Ci0gICAgfQorICAgICAgICBpZiAo
IWxvY2F0aW9uLmhvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmluZm8oJ01pc3Mg
dGhlIGluZm8gYmFyPyBSdW4gVG9kb01WQyBmcm9tIGEgc2VydmVyIHRvIGF2b2lkIGEgY3Jvc3Mt
b3JpZ2luIGVycm9yLicpOworICAgICAgICB9CiAKLSAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBS
ZXF1ZXN0KCk7CisgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKIAotICAg
IHhoci5vcGVuKCdHRVQnLCBmaW5kUm9vdCgpICsgZmlsZSwgdHJ1ZSk7Ci0gICAgeGhyLnNlbmQo
KTsKKyAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIGZpbmRSb290KCkgKyBmaWxlLCB0cnVlKTsKKyAg
ICAgICAgeGhyLnNlbmQoKTsKIAotICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7Ci0gICAg
aWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrKHhoci5y
ZXNwb25zZVRleHQpOwotICAgIH0KLSAgICB9OworICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rp
b24gKCkgeworICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiBjYWxsYmFjaykg
eworICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhoci5yZXNwb25zZVRleHQpOworICAgICAgICAg
ICAgfQorICAgICAgICB9OwogICAgIH0KIAogICAgIGZ1bmN0aW9uIExlYXJuKGxlYXJuSlNPTiwg
Y29uZmlnKSB7Ci0gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExlYXJuKSkgewotICAgIHJldHVy
biBuZXcgTGVhcm4obGVhcm5KU09OLCBjb25maWcpOwotICAgIH0KKyAgICAgICAgaWYgKCEodGhp
cyBpbnN0YW5jZW9mIExlYXJuKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWFybihsZWFy
bkpTT04sIGNvbmZpZyk7CisgICAgICAgIH0KIAotICAgIHZhciB0ZW1wbGF0ZSwgZnJhbWV3b3Jr
OworICAgICAgICB2YXIgdGVtcGxhdGUsIGZyYW1ld29yazsKIAotICAgIGlmICh0eXBlb2YgbGVh
cm5KU09OICE9PSAnb2JqZWN0JykgewotICAgIHRyeSB7Ci0gICAgbGVhcm5KU09OID0gSlNPTi5w
YXJzZShsZWFybkpTT04pOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICByZXR1cm47Ci0gICAgfQot
ICAgIH0KKyAgICAgICAgaWYgKHR5cGVvZiBsZWFybkpTT04gIT09ICdvYmplY3QnKSB7CisgICAg
ICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxlYXJuSlNPTiA9IEpTT04ucGFyc2UobGVh
cm5KU09OKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIGlmIChjb25maWcpIHsKLSAgICB0
ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTsKLSAgICBmcmFtZXdvcmsgPSBjb25maWcuZnJhbWV3
b3JrOwotICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZykgeworICAgICAgICAgICAgdGVtcGxhdGUg
PSBjb25maWcudGVtcGxhdGU7CisgICAgICAgICAgICBmcmFtZXdvcmsgPSBjb25maWcuZnJhbWV3
b3JrOworICAgICAgICB9CiAKLSAgICBpZiAoIXRlbXBsYXRlICYmIGxlYXJuSlNPTi50ZW1wbGF0
ZXMpIHsKLSAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50ZW1wbGF0ZXMudG9kb212YzsKLSAgICB9
CisgICAgICAgIGlmICghdGVtcGxhdGUgJiYgbGVhcm5KU09OLnRlbXBsYXRlcykgeworICAgICAg
ICAgICAgdGVtcGxhdGUgPSBsZWFybkpTT04udGVtcGxhdGVzLnRvZG9tdmM7CisgICAgICAgIH0K
IAotICAgIGlmICghZnJhbWV3b3JrICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZy
YW1ld29ya10nKSkgewotICAgIGZyYW1ld29yayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tk
YXRhLWZyYW1ld29ya10nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnJhbWV3b3JrJyk7Ci0gICAgfQor
ICAgICAgICBpZiAoIWZyYW1ld29yayAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1m
cmFtZXdvcmtdJykpIHsKKyAgICAgICAgICAgIGZyYW1ld29yayA9IGRvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3IoJ1tkYXRhLWZyYW1ld29ya10nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnJhbWV3b3JrJyk7
CisgICAgICAgIH0KIAogCi0gICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNPTltmcmFtZXdvcmtd
KSB7Ci0gICAgdGhpcy5mcmFtZXdvcmtKU09OID0gbGVhcm5KU09OW2ZyYW1ld29ya107Ci0gICAg
dGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgICAgICBpZiAodGVtcGxhdGUgJiYgbGVhcm5K
U09OW2ZyYW1ld29ya10pIHsKKyAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrSlNPTiA9IGxlYXJu
SlNPTltmcmFtZXdvcmtdOworICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwog
Ci0gICAgdGhpcy5hcHBlbmQoKTsKLSAgICB9CisgICAgICAgICAgICB0aGlzLmFwcGVuZCgpOwor
ICAgICAgICB9CiAgICAgfQogCiAgICAgTGVhcm4ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9u
ICgpIHsKLSAgICB2YXIgYXNpZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhc2lkZScpOwot
ICAgIGFzaWRlLmlubmVySFRNTCA9IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFt
ZXdvcmtKU09OKTsKLSAgICBhc2lkZS5jbGFzc05hbWUgPSAnbGVhcm4nOwotCi0gICAgLy8gTG9j
YWxpemUgZGVtbyBsaW5rcwotICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9y
QWxsKCcuZGVtby1saW5rJyk7Ci0gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkZW1v
TGlua3MsIGZ1bmN0aW9uIChkZW1vTGluaykgewotICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0ZSgn
aHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7Ci0gICAg
fSk7Ci0KLSAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IChkb2N1bWVudC5ib2R5LmNsYXNz
TmFtZSArICcgbGVhcm4tYmFyJykudHJpbSgpOwotICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRq
YWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsKKyAgICAgICAgdmFyIGFz
aWRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXNpZGUnKTsKKyAgICAgICAgYXNpZGUuaW5u
ZXJIVE1MID0gXy50ZW1wbGF0ZSh0aGlzLnRlbXBsYXRlLCB0aGlzLmZyYW1ld29ya0pTT04pOwor
ICAgICAgICBhc2lkZS5jbGFzc05hbWUgPSAnbGVhcm4nOworCisgICAgICAgIC8vIExvY2FsaXpl
IGRlbW8gbGlua3MKKyAgICAgICAgdmFyIGRlbW9MaW5rcyA9IGFzaWRlLnF1ZXJ5U2VsZWN0b3JB
bGwoJy5kZW1vLWxpbmsnKTsKKyAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChk
ZW1vTGlua3MsIGZ1bmN0aW9uIChkZW1vTGluaykgeworICAgICAgICAgICAgZGVtb0xpbmsuc2V0
QXR0cmlidXRlKCdocmVmJywgZmluZFJvb3QoKSArIGRlbW9MaW5rLmdldEF0dHJpYnV0ZSgnaHJl
ZicpKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgPSAo
ZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIGxlYXJuLWJhcicpLnRyaW0oKTsKKyAgICAgICAg
ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyQmVnaW4nLCBhc2lkZS5vdXRl
ckhUTUwpOwogICAgIH07CiAKICAgICByZWRpcmVjdCgpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFu
Y2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9pbmRleC5odG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5j
aC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9pbmRleC5o
dG1sCmluZGV4IDA3MWRlZjgwMzgyNzJmNjgzZDM4ZGZmY2MxMWFmOTk5ZmI3YjVmNTQuLjE1OTA5
NzRlZjk2MTNhMjg3OTU3MzkwYjFhYThhNGRhNDZjODkwM2EgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1h
bmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZl
bkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2lu
ZGV4Lmh0bWwKQEAgLTEsODAgKzEsNzggQEAKIDwhZG9jdHlwZSBodG1sPgogPGh0bWwgbGFuZz0i
ZW4iIGRhdGEtZnJhbWV3b3JrPSJlbWJlcmpzIj4KICAgICA8aGVhZD4KLSAgICA8bWV0YSBjaGFy
c2V0PSJ1dGYtOCI+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250
ZW50PSJJRT1lZGdlIj4KLSAgICA8dGl0bGU+ZW1iZXIuanMg4oCiIFRvZG9NVkM8L3RpdGxlPgot
ICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy90b2RvbXZj
LWNvbW1vbi9iYXNlLmNzcyI+CisgICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICAg
ICAgPHRpdGxlPmVtYmVyLmpzIOKAoiBUb2RvTVZDPC90aXRsZT4KKyAgICAgICAgPGxpbmsgcmVs
PSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2Uu
Y3NzIj4KICAgICA8L2hlYWQ+CiAgICAgPGJvZHk+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gt
aGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ0b2RvcyI+Ci0gICAgPHNlY3Rpb24gaWQ9
InRvZG9hcHAiPgotICAgIDxoZWFkZXIgaWQ9ImhlYWRlciI+Ci0gICAgPGgxPnRvZG9zPC9oMT4K
LSAgICB7e3ZpZXcgRW1iZXIuVGV4dEZpZWxkIGlkPSJuZXctdG9kbyIgcGxhY2Vob2xkZXI9Ildo
YXQgbmVlZHMgdG8gYmUgZG9uZT8iCi0gICAgIHZhbHVlQmluZGluZz0ibmV3VGl0bGUiIGFjdGlv
bj0iY3JlYXRlVG9kbyJ9fQotICAgIDwvaGVhZGVyPgotICAgIHt7I2lmIGxlbmd0aH19Ci0gICAg
PHNlY3Rpb24gaWQ9Im1haW4iPgotICAgIDx1bCBpZD0idG9kby1saXN0Ij4KLSAgICB7eyNlYWNo
IGZpbHRlcmVkVG9kb3MgaXRlbUNvbnRyb2xsZXI9InRvZG8ifX0KLSAgICA8bGkge3tiaW5kQXR0
ciBjbGFzcz0iaXNDb21wbGV0ZWQ6Y29tcGxldGVkIGlzRWRpdGluZzplZGl0aW5nIn19PgotICAg
IHt7I2lmIGlzRWRpdGluZ319Ci0gICAge3t2aWV3IFRvZG9zLkVkaXRUb2RvVmlldyB0b2RvQmlu
ZGluZz0idGhpcyJ9fQotICAgIHt7ZWxzZX19Ci0gICAge3t2aWV3IEVtYmVyLkNoZWNrYm94IGNo
ZWNrZWRCaW5kaW5nPSJpc0NvbXBsZXRlZCIgY2xhc3M9InRvZ2dsZSJ9fQotICAgIDxsYWJlbCB7
e2FjdGlvbiAiZWRpdFRvZG8iIG9uPSJkb3VibGVDbGljayJ9fT57e3RpdGxlfX08L2xhYmVsPgot
ICAgIDxidXR0b24ge3thY3Rpb24gInJlbW92ZVRvZG8ifX0gY2xhc3M9ImRlc3Ryb3kiPjwvYnV0
dG9uPgotICAgIHt7L2lmfX0KLSAgICA8L2xpPgotICAgIHt7L2VhY2h9fQotICAgIDwvdWw+Ci0g
ICAge3t2aWV3IEVtYmVyLkNoZWNrYm94IGlkPSJ0b2dnbGUtYWxsIiBjaGVja2VkQmluZGluZz0i
YWxsQXJlRG9uZSJ9fQotICAgIDwvc2VjdGlvbj4KLSAgICA8Zm9vdGVyIGlkPSJmb290ZXIiPgot
ICAgIDxzcGFuIGlkPSJ0b2RvLWNvdW50Ij57e3tyZW1haW5pbmdGb3JtYXR0ZWR9fX08L3NwYW4+
Ci0gICAgPHVsIGlkPSJmaWx0ZXJzIj4KLSAgICA8bGk+Ci0gICAge3sjbGlua1RvIHRvZG9zLmlu
ZGV4IGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFsbHt7L2xpbmtUb319Ci0gICAgPC9saT4KLSAg
ICA8bGk+Ci0gICAge3sjbGlua1RvIHRvZG9zLmFjdGl2ZSBhY3RpdmVDbGFzcz0ic2VsZWN0ZWQi
fX1BY3RpdmV7ey9saW5rVG99fQotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgIHt7I2xpbmtUbyB0
b2Rvcy5jb21wbGV0ZWQgYWN0aXZlQ2xhc3M9InNlbGVjdGVkIn19Q29tcGxldGVke3svbGlua1Rv
fX0KLSAgICA8L2xpPgotICAgIDwvdWw+Ci0gICAge3sjaWYgaGFzQ29tcGxldGVkfX0KLSAgICA8
YnV0dG9uIGlkPSJjbGVhci1jb21wbGV0ZWQiIHt7YWN0aW9uICJjbGVhckNvbXBsZXRlZCJ9fSB7
e2JpbmRBdHRyIGNsYXNzPSJidXR0b25DbGFzczpoaWRkZW4ifX0+Ci0gICAgQ2xlYXIgY29tcGxl
dGVkICh7e2NvbXBsZXRlZH19KQotICAgIDwvYnV0dG9uPgotICAgIHt7L2lmfX0KLSAgICA8L2Zv
b3Rlcj4KLSAgICB7ey9pZn19Ci0gICAgPC9zZWN0aW9uPgotICAgIDxmb290ZXIgaWQ9ImluZm8i
PgotICAgIDxwPkRvdWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4KLSAgICA8cD4KLSAgICBD
cmVhdGVkIGJ5Ci0gICAgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vdG9tZGFsZSI+VG9tIERh
bGU8L2E+LAotICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkg
T3NtYW5pPC9hPgotICAgIDwvcD4KLSAgICA8cD5QYXJ0IG9mIDxhIGhyZWY9Imh0dHA6Ly90b2Rv
bXZjLmNvbSI+VG9kb01WQzwvYT48L3A+Ci0gICAgPC9mb290ZXI+Ci0gICAgPC9zY3JpcHQ+Ci0g
ICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qcyI+
PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVy
eS5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvaGFuZGxl
YmFycy9oYW5kbGViYXJzLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29t
cG9uZW50cy9lbWJlci9lbWJlci5qcyI+PC9zY3JpcHQ+Ci0gICAgPCEtLSBUT0RPOiBjaGFuZ2Ug
b3V0IHdpdGggYSBjb21wb25lbnQgd2hlbiBhIGJ1aWx0IG9uZSBpcyBhdmFpbGFibGUgb24gQm93
ZXIgLS0+Ci0gICAgPHNjcmlwdCBzcmM9ImpzL2xpYnMvZW1iZXItZGF0YS5qcyI+PC9zY3JpcHQ+
Ci0gICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFk
YXB0ZXIvbG9jYWxzdG9yYWdlX2FkYXB0ZXIuanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3Jj
PSJqcy9hcHAuanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSJqcy9yb3V0ZXIuanMiPjwv
c2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSJqcy9tb2RlbHMvdG9kby5qcyI+PC9zY3JpcHQ+Ci0g
ICAgPHNjcmlwdCBzcmM9ImpzL21vZGVscy9zdG9yZS5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlw
dCBzcmM9ImpzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgotICAg
IDxzY3JpcHQgc3JjPSJqcy9jb250cm9sbGVycy90b2RvX2NvbnRyb2xsZXIuanMiPjwvc2NyaXB0
PgotICAgIDxzY3JpcHQgc3JjPSJqcy92aWV3cy9lZGl0X3RvZG9fdmlldy5qcyI+PC9zY3JpcHQ+
CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxhdGUt
bmFtZT0idG9kb3MiPgorICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InRvZG9hcHAiPgorICAgICAg
ICAgICAgICAgIDxoZWFkZXIgaWQ9ImhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxoMT50
b2RvczwvaDE+CisgICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgaWQ9Im5ldy10b2RvIiB0eXBl
PSJ0ZXh0IiB2YWx1ZT1uZXdUaXRsZSBhY3Rpb249ImNyZWF0ZVRvZG8iIHBsYWNlaG9sZGVyPSJX
aGF0IG5lZWRzIHRvIGJlIGRvbmU/In19CisgICAgICAgICAgICAgICAgPC9oZWFkZXI+CisgICAg
ICAgICAgICAgICAge3sjaWYgbGVuZ3RofX0KKyAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24g
aWQ9Im1haW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPSJ0b2RvLWxpc3QiPgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7I2VhY2ggZmlsdGVyZWRUb2RvcyBpdGVtQ29u
dHJvbGxlcj0idG9kbyJ9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkge3ti
aW5kLWF0dHIgY2xhc3M9ImlzQ29tcGxldGVkOmNvbXBsZXRlZCBpc0VkaXRpbmc6ZWRpdGluZyJ9
fT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7I2lmIGlzRWRpdGluZ319
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlZGl0LXRvZG8gY2xh
c3M9ImVkaXQiIHZhbHVlPWJ1ZmZlcmVkVGl0bGUgZm9jdXMtb3V0PSJkb25lRWRpdGluZyIgaW5z
ZXJ0LW5ld2xpbmU9ImRvbmVFZGl0aW5nIiBlc2NhcGUtcHJlc3M9ImNhbmNlbEVkaXRpbmcifX0K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxzZX19CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xh
c3M9InRvZ2dsZSIgY2hlY2tlZD1pc0NvbXBsZXRlZH19CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPGxhYmVsIHt7YWN0aW9uICJlZGl0VG9kbyIgb249ImRvdWJsZUNs
aWNrIn19Pnt7dGl0bGV9fTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgPGJ1dHRvbiB7e2FjdGlvbiAicmVtb3ZlVG9kbyJ9fSBjbGFzcz0iZGVzdHJveSI+
PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ey9pZn19Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHt7L2VhY2h9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAg
ICAgICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUt
YWxsIiBjaGVja2VkPWFsbEFyZURvbmV9fQorICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+
CisgICAgICAgICAgICAgICAgICAgIDxmb290ZXIgaWQ9ImZvb3RlciI+CisgICAgICAgICAgICAg
ICAgICAgICAgICA8c3BhbiBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57e3JlbWFpbmluZy5sZW5n
dGh9fTwvc3Ryb25nPiB7e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5nLmxlbmd0aH19IGxlZnQ8
L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWwgaWQ9ImZpbHRlcnMiPgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAge3sjbGluay10byAidG9kb3MuaW5kZXgiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFsbHt7
L2xpbmstdG99fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7
eyNsaW5rLXRvICJ0b2Rvcy5hY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFjdGl2ZXt7
L2xpbmstdG99fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7
eyNsaW5rLXRvICJ0b2Rvcy5jb21wbGV0ZWQiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUNvbXBs
ZXRlZHt7L2xpbmstdG99fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAg
ICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAge3sjaWYg
Y29tcGxldGVkLmxlbmd0aH19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBp
ZD0iY2xlYXItY29tcGxldGVkIiB7e2FjdGlvbiAiY2xlYXJDb21wbGV0ZWQifX0+CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyIGNvbXBsZXRlZCAoe3tjb21wbGV0ZWQubGVu
Z3RofX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CisgICAgICAgICAg
ICAgICAgICAgICAgICB7ey9pZn19CisgICAgICAgICAgICAgICAgICAgIDwvZm9vdGVyPgorICAg
ICAgICAgICAgICAgIHt7L2lmfX0KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAg
IDxmb290ZXIgaWQ9ImluZm8iPgorICAgICAgICAgICAgICAgIDxwPkRvdWJsZS1jbGljayB0byBl
ZGl0IGEgdG9kbzwvcD4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAg
Q3JlYXRlZCBieQorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNv
bS90b21kYWxlIj5Ub20gRGFsZTwvYT4sCisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0
dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5pPC9hPgorICAgICAgICAgICAg
ICAgIDwvcD4KKyAgICAgICAgICAgICAgICA8cD5QYXJ0IG9mIDxhIGhyZWY9Imh0dHA6Ly90b2Rv
bXZjLmNvbSI+VG9kb01WQzwvYT48L3A+CisgICAgICAgICAgICA8L2Zvb3Rlcj4KKyAgICAgICAg
PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMt
Y29tbW9uL2Jhc2UuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29t
cG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9
ImJvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIj48L3NjcmlwdD4KKyAg
ICAgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMiPjwvc2Ny
aXB0PgorICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9lbWJlci1kYXRhL2Vt
YmVyLWRhdGEuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9u
ZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3JhZ2VfYWRhcHRlci5qcyI+
PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPSJqcy9hcHAuanMiPjwvc2NyaXB0PgorICAg
ICAgICA8c2NyaXB0IHNyYz0ianMvcm91dGVyLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlw
dCBzcmM9ImpzL21vZGVscy90b2RvLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9
ImpzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgorICAgICAgICA8
c2NyaXB0IHNyYz0ianMvY29udHJvbGxlcnMvdG9kb19jb250cm9sbGVyLmpzIj48L3NjcmlwdD4K
KyAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzIj48L3Njcmlw
dD4KKyAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL3RvZG9zX3ZpZXcuanMiPjwvc2NyaXB0
PgorICAgICAgICA8c2NyaXB0IHNyYz0ianMvaGVscGVycy9wbHVyYWxpemUuanMiPjwvc2NyaXB0
PgogICAgIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Z
b3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvanMvYXBwLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAuanMKaW5kZXggYzlj
MjVjMmQ3ODNjMjU1YjM0YTY5NjA4ZDkxMDZiNmZkZGQ5ZjE0NC4uYzYwZjgxZjU2NGRjZTI0NTcz
N2E4MmMyNTg2OTI3MGYxNjI1MWRjNSAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lv
dUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9qcy9hcHAuanMKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAuanMKQEAgLTEs
MiArMSw2IEBACi0vKmdsb2JhbCBFbWJlciAqLworLypnbG9iYWwgRW1iZXIsIERTLCBUb2Rvczp0
cnVlICovCiB3aW5kb3cuVG9kb3MgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKworVG9k
b3MuQXBwbGljYXRpb25BZGFwdGVyID0gRFMuTFNBZGFwdGVyLmV4dGVuZCh7CisgICAgbmFtZXNw
YWNlOiAndG9kb3MtZW1iZXJqcycKK30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9E
b1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy9jb250cm9sbGVycy90b2RvX2NvbnRyb2xsZXIuanMgYi9QZXJmb3JtYW5jZVRlc3Rz
L0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcwppbmRleCBmNDk4NmYzYTA5
YjdjMWNlZjI1N2ZkZDQ2MzljOGM2ZjNiYzM4ZTFhLi44YWZlODEwMmVkZGVhYmFjYjBmNDY1YWMz
YjViNTMyNzNjMTQ5YTVmIDEwMDY0NAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJl
bmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2Nv
bnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcworKysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91
RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2pzL2NvbnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcwpAQCAtMSwxNyArMSw1OCBAQAotLypn
bG9iYWwgVG9kb3MgRW1iZXIgKi8KKy8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLwogJ3VzZSBzdHJp
Y3QnOwogCiBUb2Rvcy5Ub2RvQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0
ZW5kKHsKICAgICBpc0VkaXRpbmc6IGZhbHNlLAogCi0gICAgZWRpdFRvZG86IGZ1bmN0aW9uICgp
IHsKLSAgICB0aGlzLnNldCgnaXNFZGl0aW5nJywgdHJ1ZSk7CisgICAgLy8gV2UgdXNlIHRoZSBi
dWZmZXJlZFRpdGxlIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZgorICAgIC8vIHRoZSBt
b2RlbCdzIHRpdGxlIHNvIHRoYXQgd2UgY2FuIHJvbGwgaXQgYmFjayBsYXRlciBpbiB0aGUKKyAg
ICAvLyBgY2FuY2VsRWRpdGluZ2AgYWN0aW9uLgorICAgIGJ1ZmZlcmVkVGl0bGU6IEVtYmVyLmNv
bXB1dGVkLm9uZVdheSgndGl0bGUnKSwKKworICAgIGFjdGlvbnM6IHsKKyAgICAgICAgZWRpdFRv
ZG86IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcnLCB0cnVl
KTsKKyAgICAgICAgfSwKKworICAgICAgICBkb25lRWRpdGluZzogZnVuY3Rpb24gKCkgeworICAg
ICAgICAgICAgdmFyIGJ1ZmZlcmVkVGl0bGUgPSB0aGlzLmdldCgnYnVmZmVyZWRUaXRsZScpLnRy
aW0oKTsKKworICAgICAgICAgICAgaWYgKEVtYmVyLmlzRW1wdHkoYnVmZmVyZWRUaXRsZSkpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGUgYGRvbmVFZGl0aW5nYCBhY3Rpb24gZ2V0cyBzZW50IHR3
aWNlIHdoZW4gdGhlIHVzZXIgaGl0cworICAgICAgICAgICAgICAgIC8vIGVudGVyIChvbmNlIHZp
YSAnaW5zZXJ0LW5ld2xpbmUnIGFuZCBvbmNlIHZpYSAnZm9jdXMtb3V0JykuCisgICAgICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSBkZWJvdW5jZSBvdXIgY2FsbCB0byAncmVt
b3ZlVG9kbycgc28gdGhhdCBpdCBvbmx5IGdldHMKKyAgICAgICAgICAgICAgICAvLyBtYWRlIG9u
Y2UuCisgICAgICAgICAgICAgICAgRW1iZXIucnVuLmRlYm91bmNlKHRoaXMsICdyZW1vdmVUb2Rv
JywgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhciB0b2RvID0g
dGhpcy5nZXQoJ21vZGVsJyk7CisgICAgICAgICAgICAgICAgdG9kby5zZXQoJ3RpdGxlJywgYnVm
ZmVyZWRUaXRsZSk7CisgICAgICAgICAgICAgICAgdG9kby5zYXZlKCk7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIC8vIFJlLXNldCBvdXIgbmV3bHkgZWRpdGVkIHRpdGxlIHRvIHBlcnNp
c3QgaXRzIHRyaW1tZWQgdmVyc2lvbgorICAgICAgICAgICAgdGhpcy5zZXQoJ2J1ZmZlcmVkVGl0
bGUnLCBidWZmZXJlZFRpdGxlKTsKKyAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcnLCBm
YWxzZSk7CisgICAgICAgIH0sCisKKyAgICAgICAgY2FuY2VsRWRpdGluZzogZnVuY3Rpb24gKCkg
eworICAgICAgICAgICAgdGhpcy5zZXQoJ2J1ZmZlcmVkVGl0bGUnLCB0aGlzLmdldCgndGl0bGUn
KSk7CisgICAgICAgICAgICB0aGlzLnNldCgnaXNFZGl0aW5nJywgZmFsc2UpOworICAgICAgICB9
LAorCisgICAgICAgIHJlbW92ZVRvZG86IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMu
cmVtb3ZlVG9kbygpOworICAgICAgICB9CiAgICAgfSwKIAogICAgIHJlbW92ZVRvZG86IGZ1bmN0
aW9uICgpIHsKLSAgICB2YXIgdG9kbyA9IHRoaXMuZ2V0KCdtb2RlbCcpOworICAgICAgICB2YXIg
dG9kbyA9IHRoaXMuZ2V0KCdtb2RlbCcpOworCisgICAgICAgIHRvZG8uZGVsZXRlUmVjb3JkKCk7
CisgICAgICAgIHRvZG8uc2F2ZSgpOworICAgIH0sCiAKLSAgICB0b2RvLmRlbGV0ZVJlY29yZCgp
OwotICAgIHRvZG8uZ2V0KCdzdG9yZScpLmNvbW1pdCgpOwotICAgIH0KKyAgICBzYXZlV2hlbkNv
bXBsZXRlZDogZnVuY3Rpb24gKCkgeworICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5zYXZlKCk7
CisgICAgfS5vYnNlcnZlcygnaXNDb21wbGV0ZWQnKQogfSk7CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMgYi9QZXJm
b3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMKaW5k
ZXggNmEyZjY3YmZlMTI2ODk5MWJjOTNkYjNlYWE5MTJkOWI1MGE2NTYwNy4uYjM4ZGU0YzE0NjA2
MGM5YTM0ZDE0NTUzMTExMzM3YTdkOGYwNGY1ZCAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0
cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2Rvc19jb250cm9sbGVyLmpzCisrKyBiL1BlcmZvcm1h
bmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb3NfY29udHJvbGxlci5qcwpAQCAtMSw1
OSArMSw0OSBAQAotLypnbG9iYWwgVG9kb3MgRW1iZXIgKi8KKy8qZ2xvYmFsIFRvZG9zLCBFbWJl
ciAqLwogJ3VzZSBzdHJpY3QnOwogCiBUb2Rvcy5Ub2Rvc0NvbnRyb2xsZXIgPSBFbWJlci5BcnJh
eUNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBjcmVhdGVUb2RvOiBmdW5jdGlvbiAoKSB7Ci0gICAg
Ly8gR2V0IHRoZSB0b2RvIHRpdGxlIHNldCBieSB0aGUgIk5ldyBUb2RvIiB0ZXh0IGZpZWxkCi0g
ICAgdmFyIHRpdGxlID0gdGhpcy5nZXQoJ25ld1RpdGxlJyk7Ci0gICAgaWYgKCF0aXRsZS50cmlt
KCkpIHsKLSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBuZXcgVG9kbyBt
b2RlbAotICAgIFRvZG9zLlRvZG8uY3JlYXRlUmVjb3JkKHsKLSAgICB0aXRsZTogdGl0bGUsCi0g
ICAgaXNDb21wbGV0ZWQ6IGZhbHNlCi0gICAgfSk7Ci0KLSAgICAvLyBDbGVhciB0aGUgIk5ldyBU
b2RvIiB0ZXh0IGZpZWxkCi0gICAgdGhpcy5zZXQoJ25ld1RpdGxlJywgJycpOwotCi0gICAgLy8g
U2F2ZSB0aGUgbmV3IG1vZGVsCi0gICAgdGhpcy5nZXQoJ3N0b3JlJykuY29tbWl0KCk7CisgICAg
YWN0aW9uczogeworICAgICAgICBjcmVhdGVUb2RvOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAg
ICB2YXIgdGl0bGUsIHRvZG87CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgdG9kbyB0aXRsZSBz
ZXQgYnkgdGhlICJOZXcgVG9kbyIgdGV4dCBmaWVsZAorICAgICAgICAgICAgdGl0bGUgPSB0aGlz
LmdldCgnbmV3VGl0bGUnKS50cmltKCk7CisgICAgICAgICAgICBpZiAoIXRpdGxlKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVh
dGUgdGhlIG5ldyBUb2RvIG1vZGVsCisgICAgICAgICAgICB0b2RvID0gdGhpcy5zdG9yZS5jcmVh
dGVSZWNvcmQoJ3RvZG8nLCB7CisgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAorICAgICAg
ICAgICAgICAgIGlzQ29tcGxldGVkOiBmYWxzZQorICAgICAgICAgICAgfSk7CisgICAgICAgICAg
ICB0b2RvLnNhdmUoKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlICJOZXcgVG9kbyIgdGV4
dCBmaWVsZAorICAgICAgICAgICAgdGhpcy5zZXQoJ25ld1RpdGxlJywgJycpOworICAgICAgICB9
LAorCisgICAgICAgIGNsZWFyQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2
YXIgY29tcGxldGVkID0gdGhpcy5nZXQoJ2NvbXBsZXRlZCcpOworICAgICAgICAgICAgY29tcGxl
dGVkLmludm9rZSgnZGVsZXRlUmVjb3JkJyk7CisgICAgICAgICAgICBjb21wbGV0ZWQuaW52b2tl
KCdzYXZlJyk7CisgICAgICAgIH0sCiAgICAgfSwKIAotICAgIGNsZWFyQ29tcGxldGVkOiBmdW5j
dGlvbiAoKSB7Ci0gICAgdmFyIGNvbXBsZXRlZCA9IHRoaXMuZmlsdGVyUHJvcGVydHkoJ2lzQ29t
cGxldGVkJywgdHJ1ZSk7Ci0gICAgY29tcGxldGVkLmludm9rZSgnZGVsZXRlUmVjb3JkJyk7Cisg
ICAgLyogcHJvcGVydGllcyAqLwogCi0gICAgdGhpcy5nZXQoJ3N0b3JlJykuY29tbWl0KCk7Ci0g
ICAgfSwKLQotICAgIHJlbWFpbmluZzogZnVuY3Rpb24gKCkgewotICAgIHJldHVybiB0aGlzLmZp
bHRlclByb3BlcnR5KCdpc0NvbXBsZXRlZCcsIGZhbHNlKS5nZXQoJ2xlbmd0aCcpOwotICAgIH0u
cHJvcGVydHkoJ0BlYWNoLmlzQ29tcGxldGVkJyksCi0KLSAgICByZW1haW5pbmdGb3JtYXR0ZWQ6
IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5nZXQoJ3JlbWFpbmluZycp
OwotICAgIHZhciBwbHVyYWwgPSByZW1haW5pbmcgPT09IDEgPyAnaXRlbScgOiAnaXRlbXMnOwot
ICAgIHJldHVybiAnPHN0cm9uZz4lQDwvc3Ryb25nPiAlQCBsZWZ0Jy5mbXQocmVtYWluaW5nLCBw
bHVyYWwpOwotICAgIH0ucHJvcGVydHkoJ3JlbWFpbmluZycpLAotCi0gICAgY29tcGxldGVkOiBm
dW5jdGlvbiAoKSB7Ci0gICAgcmV0dXJuIHRoaXMuZmlsdGVyUHJvcGVydHkoJ2lzQ29tcGxldGVk
JywgdHJ1ZSkuZ2V0KCdsZW5ndGgnKTsKLSAgICB9LnByb3BlcnR5KCdAZWFjaC5pc0NvbXBsZXRl
ZCcpLAotCi0gICAgaGFzQ29tcGxldGVkOiBmdW5jdGlvbiAoKSB7Ci0gICAgcmV0dXJuIHRoaXMu
Z2V0KCdjb21wbGV0ZWQnKSA+IDA7Ci0gICAgfS5wcm9wZXJ0eSgnY29tcGxldGVkJyksCisgICAg
cmVtYWluaW5nOiBFbWJlci5jb21wdXRlZC5maWx0ZXJCeSgnY29udGVudCcsICdpc0NvbXBsZXRl
ZCcsIGZhbHNlKSwKKyAgICBjb21wbGV0ZWQ6IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5KCdjb250
ZW50JywgJ2lzQ29tcGxldGVkJywgdHJ1ZSksCiAKICAgICBhbGxBcmVEb25lOiBmdW5jdGlvbiAo
a2V5LCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgdGhpcy5z
ZXRFYWNoKCdpc0NvbXBsZXRlZCcsIHZhbHVlKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gICAgfSBl
bHNlIHsKLSAgICByZXR1cm4gISF0aGlzLmdldCgnbGVuZ3RoJykgJiYKLSAgICB0aGlzLmV2ZXJ5
UHJvcGVydHkoJ2lzQ29tcGxldGVkJywgdHJ1ZSk7Ci0gICAgfQotICAgIH0ucHJvcGVydHkoJ0Bl
YWNoLmlzQ29tcGxldGVkJykKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAg
ICAgICAgICAgIHRoaXMuc2V0RWFjaCgnaXNDb21wbGV0ZWQnLCB2YWx1ZSk7CisgICAgICAgICAg
ICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgbGVuZ3Ro
ID0gdGhpcy5nZXQoJ2xlbmd0aCcpOworICAgICAgICAgICAgdmFyIGNvbXBsZXRlZExlbmd0aCA9
IHRoaXMuZ2V0KCdjb21wbGV0ZWQubGVuZ3RoJyk7CisKKyAgICAgICAgICAgIHJldHVybiBsZW5n
dGggPiAwICYmIGxlbmd0aCA9PT0gY29tcGxldGVkTGVuZ3RoOworICAgICAgICB9CisgICAgfS5w
cm9wZXJ0eSgnbGVuZ3RoJywgJ2NvbXBsZXRlZC5sZW5ndGgnKQogfSk7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2hlbHBlcnMvcGx1cmFsaXplLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9qcy9oZWxwZXJzL3BsdXJhbGl6ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45YjYyNDRj
OTUzODdkYmM2ZWE5ODNjOTIxNzAwMmVmNzkwZjRiOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9oZWxwZXJzL3BsdXJhbGl6ZS5qcwpAQCAtMCwwICsxLDkg
QEAKKy8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLworJ3VzZSBzdHJpY3QnOworCitFbWJlci5IYW5k
bGViYXJzLmhlbHBlcigncGx1cmFsaXplJywgZnVuY3Rpb24gKHNpbmd1bGFyLCBjb3VudCkgewor
ICAgIC8qIEZyb20gRW1iZXItRGF0YSAqLworICAgIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1iZXIu
SW5mbGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0UnVsZXMpOworCisgICAgcmV0dXJuIGNv
dW50ID09PSAxID8gc2luZ3VsYXIgOiBpbmZsZWN0b3IucGx1cmFsaXplKHNpbmd1bGFyKTsKK30p
OwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9saWJzL2VtYmVyLWRhdGEu
anMgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2xpYnMvZW1iZXItZGF0YS5qcwpkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkOWNhMjA3ODQzNzRjZTExY2MzZTY2YTdkMWU0MTBh
MjE2ZDc2NC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Q
ZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2xpYnMvZW1iZXItZGF0YS5qcworKysgL2Rldi9udWxs
CkBAIC0xLDgzMTYgKzAsMCBAQAotLy8gTGFzdCBjb21taXQ6IDJiY2M3NjcgKDIwMTMtMDMtMDcg
MTc6MDc6NDYgLTA4MDApCi0KLQotKGZ1bmN0aW9uKCkgewotd2luZG93LkRTID0gRW1iZXIuTmFt
ZXNwYWNlLmNyZWF0ZSh7Ci0gIC8vIHRoaXMgb25lIGdvZXMgcGFzdCAxMQotICBDVVJSRU5UX0FQ
SV9SRVZJU0lPTjogMTIKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIERl
ZmVycmVkTWl4aW4gPSBFbWJlci5EZWZlcnJlZE1peGluLCAgLy8gZW1iZXItcnVudGltZS9taXhp
bnMvZGVmZXJyZWQKLSAgICBFdmVudGVkID0gRW1iZXIuRXZlbnRlZCwgICAgICAgICAgICAgIC8v
IGVtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQKLSAgICBydW4gPSBFbWJlci5ydW4sICAgICAg
ICAgICAgICAgICAgICAgIC8vIGVtYmVyLW1ldGFsL3J1bi1sb29wCi0gICAgZ2V0ID0gRW1iZXIu
Z2V0OyAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlci1tZXRhbC9hY2Nlc3NvcnMKLQotdmFy
IExvYWRQcm9taXNlID0gRW1iZXIuTWl4aW4uY3JlYXRlKEV2ZW50ZWQsIERlZmVycmVkTWl4aW4s
IHsKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKLSAgICB0aGlzLm9uZSgnZGlkTG9hZCcsIGZ1bmN0aW9uKCkgewotICAgICAgcnVu
KHRoaXMsICdyZXNvbHZlJywgdGhpcyk7Ci0gICAgfSk7Ci0KLSAgICBpZiAoZ2V0KHRoaXMsICdp
c0xvYWRlZCcpKSB7Ci0gICAgICB0aGlzLnRyaWdnZXIoJ2RpZExvYWQnKTsKLSAgICB9Ci0gIH0K
LX0pOwotCi1EUy5Mb2FkUHJvbWlzZSA9IExvYWRQcm9taXNlOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIg
TG9hZFByb21pc2UgPSBEUy5Mb2FkUHJvbWlzZTsgLy8gc3lzdGVtL21peGlucy9sb2FkX3Byb21p
c2UKLQotLyoqCi0gIEEgcmVjb3JkIGFycmF5IGlzIGFuIGFycmF5IHRoYXQgY29udGFpbnMgcmVj
b3JkcyBvZiBhIGNlcnRhaW4gdHlwZS4gVGhlIHJlY29yZAotICBhcnJheSBtYXRlcmlhbGl6ZXMg
cmVjb3JkcyBhcyBuZWVkZWQgd2hlbiB0aGV5IGFyZSByZXRyaWV2ZWQgZm9yIHRoZSBmaXJzdAot
ICB0aW1lLiBZb3Ugc2hvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIGFycmF5cyB5b3Vyc2VsZi4gSW5z
dGVhZCwgYW4gaW5zdGFuY2Ugb2YKLSAgRFMuUmVjb3JkQXJyYXkgb3IgaXRzIHN1YmNsYXNzZXMg
d2lsbCBiZSByZXR1cm5lZCBieSB5b3VyIGFwcGxpY2F0aW9uJ3Mgc3RvcmUKLSAgaW4gcmVzcG9u
c2UgdG8gcXVlcmllcy4KLSovCi0KLURTLlJlY29yZEFycmF5ID0gRW1iZXIuQXJyYXlQcm94eS5l
eHRlbmQoRW1iZXIuRXZlbnRlZCwgTG9hZFByb21pc2UsIHsKLSAgLyoqCi0gICAgVGhlIG1vZGVs
IHR5cGUgY29udGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5LgotCi0gICAgQHR5cGUgRFMuTW9k
ZWwKLSAgKi8KLSAgdHlwZTogbnVsbCwKLQotICAvLyBUaGUgYXJyYXkgb2YgY2xpZW50IGlkcyBi
YWNraW5nIHRoZSByZWNvcmQgYXJyYXkuIFdoZW4gYQotICAvLyByZWNvcmQgaXMgcmVxdWVzdGVk
IGZyb20gdGhlIHJlY29yZCBhcnJheSwgdGhlIHJlY29yZAotICAvLyBmb3IgdGhlIGNsaWVudCBp
ZCBhdCB0aGUgc2FtZSBpbmRleCBpcyBtYXRlcmlhbGl6ZWQsIGlmCi0gIC8vIG5lY2Vzc2FyeSwg
YnkgdGhlIHN0b3JlLgotICBjb250ZW50OiBudWxsLAotCi0gIGlzTG9hZGVkOiBmYWxzZSwKLSAg
aXNVcGRhdGluZzogZmFsc2UsCi0KLSAgLy8gVGhlIHN0b3JlIHRoYXQgY3JlYXRlZCB0aGlzIHJl
Y29yZCBhcnJheS4KLSAgc3RvcmU6IG51bGwsCi0KLSAgb2JqZWN0QXRDb250ZW50OiBmdW5jdGlv
bihpbmRleCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAg
ICAgIHJlZmVyZW5jZSA9IGNvbnRlbnQub2JqZWN0QXQoaW5kZXgpLAotICAgICAgICBzdG9yZSA9
IGdldCh0aGlzLCAnc3RvcmUnKTsKLQotICAgIGlmIChyZWZlcmVuY2UpIHsKLSAgICAgIHJldHVy
biBzdG9yZS5yZWNvcmRGb3JSZWZlcmVuY2UocmVmZXJlbmNlKTsKLSAgICB9Ci0gIH0sCi0KLSAg
bWF0ZXJpYWxpemVkT2JqZWN0QXQ6IGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgdmFyIHJlZmVyZW5j
ZSA9IGdldCh0aGlzLCAnY29udGVudCcpLm9iamVjdEF0KGluZGV4KTsKLSAgICBpZiAoIXJlZmVy
ZW5jZSkgeyByZXR1cm47IH0KLQotICAgIGlmIChnZXQodGhpcywgJ3N0b3JlJykucmVjb3JkSXNN
YXRlcmlhbGl6ZWQocmVmZXJlbmNlKSkgewotICAgICAgcmV0dXJuIHRoaXMub2JqZWN0QXQoaW5k
ZXgpOwotICAgIH0KLSAgfSwKLQotICB1cGRhdGU6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQo
dGhpcywgJ2lzVXBkYXRpbmcnKSkgeyByZXR1cm47IH0KLQotICAgIHZhciBzdG9yZSA9IGdldCh0
aGlzLCAnc3RvcmUnKSwKLSAgICAgICAgdHlwZSA9IGdldCh0aGlzLCAndHlwZScpOwotCi0gICAg
c3RvcmUuZmV0Y2hBbGwodHlwZSwgdGhpcyk7Ci0gIH0sCi0KLSAgYWRkUmVmZXJlbmNlOiBmdW5j
dGlvbihyZWZlcmVuY2UpIHsKLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3QocmVm
ZXJlbmNlKTsKLSAgfSwKLQotICByZW1vdmVSZWZlcmVuY2U6IGZ1bmN0aW9uKHJlZmVyZW5jZSkg
ewotICAgIGdldCh0aGlzLCAnY29udGVudCcpLnJlbW92ZU9iamVjdChyZWZlcmVuY2UpOwotICB9
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQ7
Ci0KLURTLkZpbHRlcmVkUmVjb3JkQXJyYXkgPSBEUy5SZWNvcmRBcnJheS5leHRlbmQoewotICBm
aWx0ZXJGdW5jdGlvbjogbnVsbCwKLSAgaXNMb2FkZWQ6IHRydWUsCi0KLSAgcmVwbGFjZTogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmluZygpOwot
ICAgIHRocm93IG5ldyBFcnJvcigiVGhlIHJlc3VsdCBvZiBhIGNsaWVudC1zaWRlIGZpbHRlciAo
b24gIiArIHR5cGUgKyAiKSBpcyBpbW11dGFibGUuIik7Ci0gIH0sCi0KLSAgdXBkYXRlRmlsdGVy
OiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywg
J3N0b3JlJyk7Ci0gICAgc3RvcmUudXBkYXRlUmVjb3JkQXJyYXlGaWx0ZXIodGhpcywgZ2V0KHRo
aXMsICd0eXBlJyksIGdldCh0aGlzLCAnZmlsdGVyRnVuY3Rpb24nKSk7Ci0gIH0sICdmaWx0ZXJG
dW5jdGlvbicpCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFy
cmF5ID0gRFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKLSAgcXVlcnk6IG51bGwsCi0KLSAgcmVwbGFj
ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmlu
ZygpOwotICAgIHRocm93IG5ldyBFcnJvcigiVGhlIHJlc3VsdCBvZiBhIHNlcnZlciBxdWVyeSAo
b24gIiArIHR5cGUgKyAiKSBpcyBpbW11dGFibGUuIik7Ci0gIH0sCi0KLSAgbG9hZDogZnVuY3Rp
b24ocmVmZXJlbmNlcykgewotICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKSwgdHlw
ZSA9IGdldCh0aGlzLCAndHlwZScpOwotCi0gICAgdGhpcy5iZWdpblByb3BlcnR5Q2hhbmdlcygp
OwotICAgIHNldCh0aGlzLCAnY29udGVudCcsIEVtYmVyLkEocmVmZXJlbmNlcykpOwotICAgIHNl
dCh0aGlzLCAnaXNMb2FkZWQnLCB0cnVlKTsKLSAgICB0aGlzLmVuZFByb3BlcnR5Q2hhbmdlcygp
OwotCi0gICAgdmFyIHNlbGYgPSB0aGlzOyAKLSAgICAvLyBUT0RPOiBkb2VzIHRyaWdnZXJpbmcg
ZGlkTG9hZCBldmVudCBzaG91bGQgYmUgdGhlIGxhc3QgYWN0aW9uIG9mIHRoZSBydW5Mb29wPwot
ICAgIEVtYmVyLnJ1bi5vbmNlKGZ1bmN0aW9uKCkgewotICAgICAgc2VsZi50cmlnZ2VyKCdkaWRM
b2FkJyk7Ci0gICAgfSk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQSBNYW55QXJy
YXkgaXMgYSBSZWNvcmRBcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIGEgaGFz
LW1hbnkKLSAgcmVsYXRpb25zaGlwLgotCi0gIFRoZSBNYW55QXJyYXkgaXMgaW5zdGFudGlhdGVk
IGxhemlseSB0aGUgZmlyc3QgdGltZSB0aGUgcmVsYXRpb25zaGlwIGlzCi0gIHJlcXVlc3RlZC4K
LQotICAjIyMgSW52ZXJzZXMKLQotICBPZnRlbiwgdGhlIHJlbGF0aW9uc2hpcHMgaW4gRW1iZXIg
RGF0YSBhcHBsaWNhdGlvbnMgd2lsbCBoYXZlCi0gIGFuIGludmVyc2UuIEZvciBleGFtcGxlLCBp
bWFnaW5lIHRoZSBmb2xsb3dpbmcgbW9kZWxzIGFyZQotICBkZWZpbmVkOgotCi0gICAgICBBcHAu
UG9zdCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICAgIGNvbW1lbnRzOiBEUy5oYXNNYW55KCdB
cHAuQ29tbWVudCcpCi0gICAgICB9KTsKLQotICAgICAgQXBwLkNvbW1lbnQgPSBEUy5Nb2RlbC5l
eHRlbmQoewotICAgICAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ0FwcC5Qb3N0JykKLSAgICAgIH0p
OwotCi0gIElmIHlvdSBjcmVhdGVkIGEgbmV3IGluc3RhbmNlIG9mIGBBcHAuUG9zdGAgYW5kIGFk
ZGVkCi0gIGEgYEFwcC5Db21tZW50YCByZWNvcmQgdG8gaXRzIGBjb21tZW50c2AgaGFzLW1hbnkK
LSAgcmVsYXRpb25zaGlwLCB5b3Ugd291bGQgZXhwZWN0IHRoZSBjb21tZW50J3MgYHBvc3RgCi0g
IHByb3BlcnR5IHRvIGJlIHNldCB0byB0aGUgcG9zdCB0aGF0IGNvbnRhaW5lZAotICB0aGUgaGFz
LW1hbnkuCi0KLSAgV2UgY2FsbCB0aGUgcmVjb3JkIHRvIHdoaWNoIGEgcmVsYXRpb25zaGlwIGJl
bG9uZ3MgdGhlCi0gIHJlbGF0aW9uc2hpcCdzIF9vd25lcl8uCi0qLwotRFMuTWFueUFycmF5ID0g
RFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5f
c3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jID0g
RW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQot
Ci0gICAgVGhlIHJlY29yZCB0byB3aGljaCB0aGlzIHJlbGF0aW9uc2hpcCBiZWxvbmdzLgotCi0g
ICAgQHByb3BlcnR5IHtEUy5Nb2RlbH0KLSAgKi8KLSAgb3duZXI6IG51bGwsCi0KLSAgLy8gTE9B
RElORyBTVEFURQotCi0gIGlzTG9hZGVkOiBmYWxzZSwKLQotICBsb2FkaW5nUmVjb3Jkc0NvdW50
OiBmdW5jdGlvbihjb3VudCkgewotICAgIHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9IGNvdW50
OwotICB9LAotCi0gIGxvYWRlZFJlY29yZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sb2FkaW5n
UmVjb3Jkc0NvdW50LS07Ci0gICAgaWYgKHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9PT0gMCkg
ewotICAgICAgc2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOwotICAgICAgdGhpcy50cmlnZ2Vy
KCdkaWRMb2FkJyk7Ci0gICAgfQotICB9LAotCi0gIGZldGNoOiBmdW5jdGlvbigpIHsKLSAgICB2
YXIgcmVmZXJlbmNlcyA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBzdG9yZSA9IGdl
dCh0aGlzLCAnc3RvcmUnKSwKLSAgICAgICAgdHlwZSA9IGdldCh0aGlzLCAndHlwZScpLAotICAg
ICAgICBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKTsKLQotICAgIHN0b3JlLmZldGNoVW5sb2Fk
ZWRSZWZlcmVuY2VzKHR5cGUsIHJlZmVyZW5jZXMsIG93bmVyKTsKLSAgfSwKLQotICAvLyBPdmVy
cmlkZXMgRW1iZXIuQXJyYXkncyByZXBsYWNlIG1ldGhvZCB0byBpbXBsZW1lbnQKLSAgcmVwbGFj
ZUNvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4LCByZW1vdmVkLCBhZGRlZCkgewotICAgIC8vIE1hcCB0
aGUgYXJyYXkgb2YgcmVjb3JkIG9iamVjdHMgaW50byBhbiBhcnJheSBvZiAgY2xpZW50IGlkcy4K
LSAgICBhZGRlZCA9IGFkZGVkLm1hcChmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbiBvbmx5IGFkZCByZWNvcmRzIG9mICIgKyAoZ2V0KHRoaXMsICd0eXBlJykg
JiYgZ2V0KHRoaXMsICd0eXBlJykudG9TdHJpbmcoKSkgKyAiIHRvIHRoaXMgcmVsYXRpb25zaGlw
LiIsICFnZXQodGhpcywgJ3R5cGUnKSB8fCAoZ2V0KHRoaXMsICd0eXBlJykgPT09IHJlY29yZC5j
b25zdHJ1Y3RvcikpOwotICAgICAgcmV0dXJuIGdldChyZWNvcmQsICdfcmVmZXJlbmNlJyk7Ci0g
ICAgfSwgdGhpcyk7Ci0KLSAgICB0aGlzLl9zdXBlcihpbmRleCwgcmVtb3ZlZCwgYWRkZWQpOwot
ICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5mZXRjaCgpOwotICB9LAotCi0gIGFycmF5Q29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGlu
ZGV4LCByZW1vdmVkLCBhZGRlZCkgewotICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXIn
KSwKLSAgICAgICAgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOwotCi0gICAgaWYgKCFvd25lci5f
c3VzcGVuZGVkUmVsYXRpb25zaGlwcykgewotICAgICAgLy8gVGhpcyBjb2RlIGlzIHRoZSBmaXJz
dCBoYWxmIG9mIGNvZGUgdGhhdCBjb250aW51ZXMgaW5zaWRlCi0gICAgICAvLyBvZiBhcnJheUNv
bnRlbnREaWRDaGFuZ2UuIEl0IGdldHMgb3IgY3JlYXRlcyBhIGNoYW5nZSBmcm9tCi0gICAgICAv
LyB0aGUgY2hpbGQgb2JqZWN0LCBhZGRzIHRoZSBjdXJyZW50IG93bmVyIGFzIHRoZSBvbGQKLSAg
ICAgIC8vIHBhcmVudCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBvYmplY3Qgd2FzIHJl
bW92ZWQKLSAgICAgIC8vIGZyb20gYSBNYW55QXJyYXksIGFuZCBzZXRzIGBuZXdQYXJlbnRgIHRv
IG51bGwuCi0gICAgICAvLwotICAgICAgLy8gTGF0ZXIsIGlmIHRoZSBvYmplY3QgaXMgYWRkZWQg
dG8gYW5vdGhlciBNYW55QXJyYXksCi0gICAgICAvLyB0aGUgYGFycmF5Q29udGVudERpZENoYW5n
ZWAgd2lsbCBzZXQgYG5ld1BhcmVudGAgb24KLSAgICAgIC8vIHRoZSBjaGFuZ2UuCi0gICAgICBm
b3IgKHZhciBpPWluZGV4OyBpPGluZGV4K3JlbW92ZWQ7IGkrKykgewotICAgICAgICB2YXIgcmVm
ZXJlbmNlID0gZ2V0KHRoaXMsICdjb250ZW50Jykub2JqZWN0QXQoaSk7Ci0KLSAgICAgICAgdmFy
IGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5jcmVhdGVDaGFuZ2Uob3duZXIuZ2V0KCdf
cmVmZXJlbmNlJyksIHJlZmVyZW5jZSwgZ2V0KHRoaXMsICdzdG9yZScpLCB7Ci0gICAgICAgICAg
cGFyZW50VHlwZTogb3duZXIuY29uc3RydWN0b3IsCi0gICAgICAgICAgY2hhbmdlVHlwZTogInJl
bW92ZSIsCi0gICAgICAgICAga2luZDogImhhc01hbnkiLAotICAgICAgICAgIGtleTogbmFtZQot
ICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2UpOwot
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOwotICB9LAotCi0gIGFycmF5Q29udGVudERpZENoYW5nZTogZnVuY3Rpb24oaW5kZXgs
IHJlbW92ZWQsIGFkZGVkKSB7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKLQotICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKSwKLSAgICAgICAgbmFtZSA9
IGdldCh0aGlzLCAnbmFtZScpLAotICAgICAgICBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsK
LQotICAgIGlmICghb3duZXIuX3N1c3BlbmRlZFJlbGF0aW9uc2hpcHMpIHsKLSAgICAgIC8vIFRo
aXMgY29kZSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgY29kZSB0aGF0IHN0YXJ0ZWQgaW4KLSAgICAg
IC8vIGBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlYC4gSXQgZ2V0cyBvciBjcmVhdGVzIGEgY2hhbmdl
Ci0gICAgICAvLyBmcm9tIHRoZSBjaGlsZCBvYmplY3QsIGFuZCBhZGRzIHRoZSBjdXJyZW50IG93
bmVyIGFzCi0gICAgICAvLyB0aGUgbmV3IHBhcmVudC4KLSAgICAgIGZvciAodmFyIGk9aW5kZXg7
IGk8aW5kZXgrYWRkZWQ7IGkrKykgewotICAgICAgICB2YXIgcmVmZXJlbmNlID0gZ2V0KHRoaXMs
ICdjb250ZW50Jykub2JqZWN0QXQoaSk7Ci0KLSAgICAgICAgdmFyIGNoYW5nZSA9IERTLlJlbGF0
aW9uc2hpcENoYW5nZS5jcmVhdGVDaGFuZ2Uob3duZXIuZ2V0KCdfcmVmZXJlbmNlJyksIHJlZmVy
ZW5jZSwgc3RvcmUsIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwK
LSAgICAgICAgICBjaGFuZ2VUeXBlOiAiYWRkIiwKLSAgICAgICAgICBraW5kOiJoYXNNYW55IiwK
LSAgICAgICAgICBrZXk6IG5hbWUKLSAgICAgICAgfSk7Ci0gICAgICAgIGNoYW5nZS5oYXNNYW55
TmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgdGhpcy5fY2hhbmdlc1RvU3luYy5hZGQoY2hhbmdlKTsK
LSAgICAgIH0KLQotICAgICAgLy8gV2Ugd2FpdCB1bnRpbCB0aGUgYXJyYXkgaGFzIGZpbmlzaGVk
IGJlaW5nCi0gICAgICAvLyBtdXRhdGVkIGJlZm9yZSBzeW5jaW5nIHRoZSBPbmVUb01hbnlDaGFu
Z2VzIGNyZWF0ZWQKLSAgICAgIC8vIGluIGFycmF5Q29udGVudFdpbGxDaGFuZ2UsIHNvIHRoYXQg
dGhlIGFycmF5Ci0gICAgICAvLyBtZW1iZXJzaGlwIHRlc3QgaW4gdGhlIHN5bmMoKSBsb2dpYyBv
cGVyYXRlcwotICAgICAgLy8gb24gdGhlIGZpbmFsIHJlc3VsdHMuCi0gICAgICB0aGlzLl9jaGFu
Z2VzVG9TeW5jLmZvckVhY2goZnVuY3Rpb24oY2hhbmdlKSB7Ci0gICAgICAgIGNoYW5nZS5zeW5j
KCk7Ci0gICAgICB9KTsKLSAgICAgIERTLk9uZVRvTWFueUNoYW5nZS5lbnN1cmVTYW1lVHJhbnNh
Y3Rpb24odGhpcy5fY2hhbmdlc1RvU3luYywgc3RvcmUpOwotICAgICAgdGhpcy5fY2hhbmdlc1Rv
U3luYy5jbGVhcigpOwotICAgIH0KLSAgfSwKLQotICAvLyBDcmVhdGUgYSBjaGlsZCByZWNvcmQg
d2l0aGluIHRoZSBvd25lcgotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKGhhc2gsIHRyYW5zYWN0
aW9uKSB7Ci0gICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICBzdG9y
ZSA9IGdldChvd25lciwgJ3N0b3JlJyksCi0gICAgICAgIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUn
KSwKLSAgICAgICAgcmVjb3JkOwotCi0gICAgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbiB8fCBn
ZXQob3duZXIsICd0cmFuc2FjdGlvbicpOwotCi0gICAgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVj
b3JkLmNhbGwoc3RvcmUsIHR5cGUsIGhhc2gsIHRyYW5zYWN0aW9uKTsKLSAgICB0aGlzLnB1c2hP
YmplY3QocmVjb3JkKTsKLQotICAgIHJldHVybiByZWNvcmQ7Ci0gIH0KLQotfSk7Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIg
Z2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQs
Ci0gICAgcmVtb3ZlT2JqZWN0ID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlbW92ZU9iamVjdCwg
Zm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwotCi0vKioKLSAgQSB0cmFu
c2FjdGlvbiBhbGxvd3MgeW91IHRvIGNvbGxlY3QgbXVsdGlwbGUgcmVjb3JkcyBpbnRvIGEgdW5p
dCBvZiB3b3JrCi0gIHRoYXQgY2FuIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjayBhcyBhIGdy
b3VwLgotCi0gIEZvciBleGFtcGxlLCBpZiBhIHJlY29yZCBoYXMgbG9jYWwgbW9kaWZpY2F0aW9u
cyB0aGF0IGhhdmUgbm90IHlldAotICBiZWVuIHNhdmVkLCBjYWxsaW5nIGBjb21taXQoKWAgb24g
aXRzIHRyYW5zYWN0aW9uIHdpbGwgY2F1c2UgdGhvc2UKLSAgbW9kaWZpY2F0aW9ucyB0byBiZSBz
ZW50IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLiBDYWxsaW5nCi0gIGByb2xsYmFjaygpYCBv
biBpdHMgdHJhbnNhY3Rpb24gd291bGQgY2F1c2UgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIHRv
Ci0gIGJlIGRpc2NhcmRlZCBhbmQgdGhlIHJlY29yZCB0byByZXR1cm4gdG8gdGhlIGxhc3Qga25v
d24gc3RhdGUgYmVmb3JlCi0gIGNoYW5nZXMgd2VyZSBtYWRlLgotCi0gIElmIGEgbmV3bHkgY3Jl
YXRlZCByZWNvcmQncyB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjaywgaXQgd2lsbAotICBpbW1l
ZGlhdGVseSB0cmFuc2l0aW9uIHRvIHRoZSBkZWxldGVkIHN0YXRlLgotCi0gIElmIHlvdSBkbyBu
b3QgZXhwbGljaXRseSBjcmVhdGUgYSB0cmFuc2FjdGlvbiwgYSByZWNvcmQgaXMgYXNzaWduZWQg
dG8KLSAgYW4gaW1wbGljaXQgdHJhbnNhY3Rpb24gY2FsbGVkIHRoZSBkZWZhdWx0IHRyYW5zYWN0
aW9uLiBJbiB0aGVzZSBjYXNlcywKLSAgeW91IGNhbiB0cmVhdCB5b3VyIGFwcGxpY2F0aW9uJ3Mg
aW5zdGFuY2Ugb2YgYERTLlN0b3JlYCBhcyBhIHRyYW5zYWN0aW9uCi0gIGFuZCBjYWxsIHRoZSBg
Y29tbWl0KClgIGFuZCBgcm9sbGJhY2soKWAgbWV0aG9kcyBvbiB0aGUgc3RvcmUgaXRzZWxmLgot
Ci0gIE9uY2UgYSByZWNvcmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbW1pdHRlZCBvciByb2xs
ZWQgYmFjaywgaXQgd2lsbAotICBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBpbXBsaWNpdCB0cmFuc2Fj
dGlvbi4gQmVjYXVzZSBpdCB3aWxsIG5vdyBiZSBpbgotICBhIGNsZWFuIHN0YXRlLCBpdCBjYW4g
YmUgbW92ZWQgdG8gYSBuZXcgdHJhbnNhY3Rpb24gaWYgeW91IHdpc2guCi0KLSAgIyMjIENyZWF0
aW5nIGEgVHJhbnNhY3Rpb24KLQotICBUbyBjcmVhdGUgYSBuZXcgdHJhbnNhY3Rpb24sIGNhbGwg
dGhlIGB0cmFuc2FjdGlvbigpYCBtZXRob2Qgb2YgeW91cgotICBhcHBsaWNhdGlvbidzIGBEUy5T
dG9yZWAgaW5zdGFuY2U6Ci0KLSAgICAgIHZhciB0cmFuc2FjdGlvbiA9IEFwcC5zdG9yZS50cmFu
c2FjdGlvbigpOwotCi0gIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYERTLlRy
YW5zYWN0aW9uYCB3aXRoIG5vIHJlY29yZHMKLSAgeWV0IGFzc2lnbmVkIHRvIGl0LgotCi0gICMj
IyBBZGRpbmcgRXhpc3RpbmcgUmVjb3JkcwotCi0gIEFkZCByZWNvcmRzIHRvIGEgdHJhbnNhY3Rp
b24gdXNpbmcgdGhlIGBhZGQoKWAgbWV0aG9kOgotCi0gICAgICByZWNvcmQgPSBBcHAuc3RvcmUu
ZmluZChBcHAuUGVyc29uLCAxKTsKLSAgICAgIHRyYW5zYWN0aW9uLmFkZChyZWNvcmQpOwotCi0g
IE5vdGUgdGhhdCBvbmx5IHJlY29yZHMgd2hvc2UgYGlzRGlydHlgIGZsYWcgaXMgYGZhbHNlYCBt
YXkgYmUgYWRkZWQKLSAgdG8gYSB0cmFuc2FjdGlvbi4gT25jZSBtb2RpZmljYXRpb25zIHRvIGEg
cmVjb3JkIGhhdmUgYmVlbiBtYWRlCi0gIChpdHMgYGlzRGlydHlgIGZsYWcgaXMgYHRydWVgKSwg
aXQgaXMgbm90IGxvbmdlciBhYmxlIHRvIGJlIGFkZGVkIHRvCi0gIGEgdHJhbnNhY3Rpb24uCi0K
LSAgIyMjIENyZWF0aW5nIE5ldyBSZWNvcmRzCi0KLSAgQmVjYXVzZSBuZXdseSBjcmVhdGVkIHJl
Y29yZHMgYXJlIGRpcnR5IGZyb20gdGhlIHRpbWUgdGhleSBhcmUgY3JlYXRlZCwKLSAgYW5kIGJl
Y2F1c2UgZGlydHkgcmVjb3JkcyBjYW4gbm90IGJlIGFkZGVkIHRvIGEgdHJhbnNhY3Rpb24sIHlv
dSBtdXN0Ci0gIHVzZSB0aGUgYGNyZWF0ZVJlY29yZCgpYCBtZXRob2QgdG8gYXNzaWduIG5ldyBy
ZWNvcmRzIHRvIGEgdHJhbnNhY3Rpb24uCi0KLSAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgdGhp
czoKLQotICAgIHZhciB0cmFuc2FjdGlvbiA9IHN0b3JlLnRyYW5zYWN0aW9uKCk7Ci0gICAgdmFy
IHBlcnNvbiA9IEFwcC5QZXJzb24uY3JlYXRlUmVjb3JkKHsgbmFtZTogIlN0ZXZlIiB9KTsKLQot
ICAgIC8vIHdvbid0IHdvcmsgYmVjYXVzZSBwZXJzb24gaXMgZGlydHkKLSAgICB0cmFuc2FjdGlv
bi5hZGQocGVyc29uKTsKLQotICBDYWxsIGBjcmVhdGVSZWNvcmQoKWAgb24gdGhlIHRyYW5zYWN0
aW9uIGRpcmVjdGx5OgotCi0gICAgdmFyIHRyYW5zYWN0aW9uID0gc3RvcmUudHJhbnNhY3Rpb24o
KTsKLSAgICB0cmFuc2FjdGlvbi5jcmVhdGVSZWNvcmQoQXBwLlBlcnNvbiwgeyBuYW1lOiAiU3Rl
dmUiIH0pOwotCi0gICMjIyBBc3luY2hyb25vdXMgQ29tbWl0cwotCi0gIFR5cGljYWxseSwgYWxs
IG9mIHRoZSByZWNvcmRzIGluIGEgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQKLSAgdG9n
ZXRoZXIuIEhvd2V2ZXIsIG5ldyByZWNvcmRzIHRoYXQgaGF2ZSBhIGRlcGVuZGVuY3kgb24gb3Ro
ZXIgbmV3Ci0gIHJlY29yZHMgbmVlZCB0byB3YWl0IGZvciB0aGVpciBwYXJlbnQgcmVjb3JkIHRv
IGJlIHNhdmVkIGFuZCBhc3NpZ25lZCBhbgotICBJRC4gSW4gdGhhdCBjYXNlLCB0aGUgY2hpbGQg
cmVjb3JkIHdpbGwgY29udGludWUgdG8gbGl2ZSBpbiB0aGUKLSAgdHJhbnNhY3Rpb24gdW50aWwg
aXRzIHBhcmVudCBpcyBzYXZlZCwgYXQgd2hpY2ggdGltZSB0aGUgdHJhbnNhY3Rpb24gd2lsbAot
ICBhdHRlbXB0IHRvIGNvbW1pdCBhZ2Fpbi4KLQotICBGb3IgdGhpcyByZWFzb24sIHlvdSBzaG91
bGQgbm90IHJlLXVzZSB0cmFuc2FjdGlvbnMgb25jZSB5b3UgaGF2ZSBjb21taXR0ZWQKLSAgdGhl
bS4gQWx3YXlzIG1ha2UgYSBuZXcgdHJhbnNhY3Rpb24gYW5kIG1vdmUgdGhlIGRlc2lyZWQgcmVj
b3JkcyB0byBpdCBiZWZvcmUKLSAgY2FsbGluZyBjb21taXQuCi0qLwotCi12YXIgYXJyYXlEZWZh
dWx0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfTsKLQotRFMuVHJhbnNhY3Rpb24gPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIENyZWF0ZXMgdGhl
IGJ1Y2tldCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHNlZ3JlZ2F0ZSByZWNvcmRzIGJ5Ci0gICAg
dHlwZS4KLSAgKi8KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgc2V0KHRoaXMsICdidWNrZXRz
JywgewotICAgICAgY2xlYW46ICAgIEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCksCi0gICAgICBj
cmVhdGVkOiAgRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKSwKLSAgICAgIHVwZGF0ZWQ6ICBFbWJl
ci5PcmRlcmVkU2V0LmNyZWF0ZSgpLAotICAgICAgZGVsZXRlZDogIEVtYmVyLk9yZGVyZWRTZXQu
Y3JlYXRlKCksCi0gICAgICBpbmZsaWdodDogRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKQotICAg
IH0pOwotCi0gICAgc2V0KHRoaXMsICdyZWxhdGlvbnNoaXBzJywgRW1iZXIuT3JkZXJlZFNldC5j
cmVhdGUoKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlcyBhIG5ldyByZWNvcmQgb2YgdGhl
IGdpdmVuIHR5cGUgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIHRyYW5zYWN0aW9uCi0gICAgb24gd2hp
Y2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkLgotCi0gICAgVGhpcyBpcyB1c2VmdWwgYXMgb25seSBj
bGVhbiByZWNvcmRzIGNhbiBiZSBhZGRlZCB0byBhIHRyYW5zYWN0aW9uIGFuZAotICAgIG5ldyBy
ZWNvcmRzIGNyZWF0ZWQgdXNpbmcgb3RoZXIgbWV0aG9kcyBpbW1lZGlhdGVseSBiZWNvbWUgZGly
dHkuCi0KLSAgICBAcGFyYW0ge0RTLk1vZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIHRvIGNyZWF0
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoIHRoZSBkYXRhIGhhc2ggdG8gYXNzaWduIHRoZSBu
ZXcgcmVjb3JkCi0gICovCi0gIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24odHlwZSwgaGFzaCkgewot
ICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKLQotICAgIHJldHVybiBzdG9yZS5j
cmVhdGVSZWNvcmQodHlwZSwgaGFzaCwgdGhpcyk7Ci0gIH0sCi0KLSAgaXNFcXVhbE9yRGVmYXVs
dDogZnVuY3Rpb24ob3RoZXIpIHsKLSAgICBpZiAodGhpcyA9PT0gb3RoZXIgfHwgb3RoZXIgPT09
IGdldCh0aGlzLCAnc3RvcmUuZGVmYXVsdFRyYW5zYWN0aW9uJykpIHsKLSAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLSAgfSwKLQotICBpc0RlZmF1bHQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgewotICAgIHJldHVybiB0aGlzID09PSBnZXQodGhpcywgJ3N0b3JlLmRlZmF1bHRUcmFuc2Fj
dGlvbicpOwotICB9KSwKLQotICAvKioKLSAgICBBZGRzIGFuIGV4aXN0aW5nIHJlY29yZCB0byB0
aGlzIHRyYW5zYWN0aW9uLiBPbmx5IHJlY29yZHMgd2l0aG91dAotICAgIG1vZGZpY2lhdGlvbnMg
KGkuZS4sIHJlY29yZHMgd2hvc2UgYGlzRGlydHlgIHByb3BlcnR5IGlzIGBmYWxzZWApCi0gICAg
Y2FuIGJlIGFkZGVkIHRvIGEgdHJhbnNhY3Rpb24uCi0KLSAgICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQgdGhlIHJlY29yZCB0byBhZGQgdG8gdGhlIHRyYW5zYWN0aW9uCi0gICovCi0gIGFkZDog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgcmVj
b3JkIGludG8gdHJhbnNhY3Rpb24uYWRkKCkiLCByZWNvcmQgaW5zdGFuY2VvZiBEUy5Nb2RlbCk7
Ci0KLSAgICB2YXIgcmVjb3JkVHJhbnNhY3Rpb24gPSBnZXQocmVjb3JkLCAndHJhbnNhY3Rpb24n
KSwKLSAgICAgICAgZGVmYXVsdFRyYW5zYWN0aW9uID0gZ2V0KHRoaXMsICdzdG9yZS5kZWZhdWx0
VHJhbnNhY3Rpb24nKTsKLQotICAgIC8vIE1ha2UgYGFkZGAgaWRlbXBvdGVudAotICAgIGlmIChy
ZWNvcmRUcmFuc2FjdGlvbiA9PT0gdGhpcykgeyByZXR1cm47IH0KLQotICAgIC8vIFhYWCBpdCBz
aG91bGQgYmUgcG9zc2libGUgdG8gbW92ZSBhIGRpcnR5IHRyYW5zYWN0aW9uIGZyb20gdGhlIGRl
ZmF1bHQgdHJhbnNhY3Rpb24KLQotICAgIC8vIHdlIGNvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyB3
b3JrIGlmIHNvbWVvbmUgaGFzIGEgdmFsaWQgdXNlIGNhc2UuIERvIHlvdT8KLSAgICBFbWJlci5h
c3NlcnQoIk9uY2UgYSByZWNvcmQgaGFzIGNoYW5nZWQsIHlvdSBjYW5ub3QgbW92ZSBpdCBpbnRv
IGEgZGlmZmVyZW50IHRyYW5zYWN0aW9uIiwgIWdldChyZWNvcmQsICdpc0RpcnR5JykpOwotCi0g
ICAgRW1iZXIuYXNzZXJ0KCJNb2RlbHMgY2Fubm90IGJlbG9uZyB0byBtb3JlIHRoYW4gb25lIHRy
YW5zYWN0aW9uIGF0IGEgdGltZS4iLCByZWNvcmRUcmFuc2FjdGlvbiA9PT0gZGVmYXVsdFRyYW5z
YWN0aW9uKTsKLQotICAgIHRoaXMuYWRvcHRSZWNvcmQocmVjb3JkKTsKLSAgfSwKLQotICByZWxh
dGlvbnNoaXBCZWNhbWVEaXJ0eTogZnVuY3Rpb24ocmVsYXRpb25zaGlwKSB7Ci0gICAgZ2V0KHRo
aXMsICdyZWxhdGlvbnNoaXBzJykuYWRkKHJlbGF0aW9uc2hpcCk7Ci0gIH0sCi0KLSAgcmVsYXRp
b25zaGlwQmVjYW1lQ2xlYW46IGZ1bmN0aW9uKHJlbGF0aW9uc2hpcCkgewotICAgIGdldCh0aGlz
LCAncmVsYXRpb25zaGlwcycpLnJlbW92ZShyZWxhdGlvbnNoaXApOwotICB9LAotCi0gIC8qKgot
ICAgIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uLCB3aGljaCBjYXVzZXMgYWxsIG9mIHRoZSBtb2Rp
ZmllZCByZWNvcmRzIHRoYXQKLSAgICBiZWxvbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHRvIGJlIHNl
bnQgdG8gdGhlIGFkYXB0ZXIgdG8gYmUgc2F2ZWQuCi0KLSAgICBPbmNlIHlvdSBjYWxsIGBjb21t
aXQoKWAgb24gYSB0cmFuc2FjdGlvbiwgeW91IHNob3VsZCBub3QgcmUtdXNlIGl0LgotCi0gICAg
V2hlbiBhIHJlY29yZCBpcyBzYXZlZCwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhpcyB0cmFu
c2FjdGlvbiBhbmQKLSAgICBtb3ZlZCBiYWNrIHRvIHRoZSBzdG9yZSdzIGRlZmF1bHQgdHJhbnNh
Y3Rpb24uCi0gICovCi0gIGNvbW1pdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0b3JlID0gZ2V0
KHRoaXMsICdzdG9yZScpOwotICAgIHZhciBhZGFwdGVyID0gZ2V0KHN0b3JlLCAnX2FkYXB0ZXIn
KTsKLSAgICB2YXIgZGVmYXVsdFRyYW5zYWN0aW9uID0gZ2V0KHN0b3JlLCAnZGVmYXVsdFRyYW5z
YWN0aW9uJyk7Ci0KLSAgICB2YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uKHJlY29yZHMpIHsKLSAgICAg
IHZhciBzZXQgPSByZWNvcmRzLmNvcHkoKTsKLSAgICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uIChy
ZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnNlbmQoJ3dpbGxDb21taXQnKTsKLSAgICAgIH0pOwot
ICAgICAgcmV0dXJuIHNldDsKLSAgICB9OwotCi0gICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBnZXQo
dGhpcywgJ3JlbGF0aW9uc2hpcHMnKTsKLQotICAgIHZhciBjb21taXREZXRhaWxzID0gewotICAg
ICAgY3JlYXRlZDogaXRlcmF0ZSh0aGlzLmJ1Y2tldEZvclR5cGUoJ2NyZWF0ZWQnKSksCi0gICAg
ICB1cGRhdGVkOiBpdGVyYXRlKHRoaXMuYnVja2V0Rm9yVHlwZSgndXBkYXRlZCcpKSwKLSAgICAg
IGRlbGV0ZWQ6IGl0ZXJhdGUodGhpcy5idWNrZXRGb3JUeXBlKCdkZWxldGVkJykpLAotICAgICAg
cmVsYXRpb25zaGlwczogcmVsYXRpb25zaGlwcwotICAgIH07Ci0KLSAgICBpZiAodGhpcyA9PT0g
ZGVmYXVsdFRyYW5zYWN0aW9uKSB7Ci0gICAgICBzZXQoc3RvcmUsICdkZWZhdWx0VHJhbnNhY3Rp
b24nLCBzdG9yZS50cmFuc2FjdGlvbigpKTsKLSAgICB9Ci0KLSAgICB0aGlzLnJlbW92ZUNsZWFu
UmVjb3JkcygpOwotCi0gICAgaWYgKCFjb21taXREZXRhaWxzLmNyZWF0ZWQuaXNFbXB0eSgpIHx8
ICFjb21taXREZXRhaWxzLnVwZGF0ZWQuaXNFbXB0eSgpIHx8ICFjb21taXREZXRhaWxzLmRlbGV0
ZWQuaXNFbXB0eSgpIHx8ICFyZWxhdGlvbnNoaXBzLmlzRW1wdHkoKSkgewotICAgICAgaWYgKGFk
YXB0ZXIgJiYgYWRhcHRlci5jb21taXQpIHsgYWRhcHRlci5jb21taXQoc3RvcmUsIGNvbW1pdERl
dGFpbHMpOyB9Ci0gICAgICBlbHNlIHsgdGhyb3cgZm10KCJBZGFwdGVyIGlzIGVpdGhlciBudWxs
IG9yIGRvZXMgbm90IGltcGxlbWVudCBgY29tbWl0YCBtZXRob2QiLCB0aGlzKTsgfQotICAgIH0K
LQotICAgIC8vIE9uY2Ugd2UndmUgY29tbWl0dGVkIHRoZSB0cmFuc2FjdGlvbiwgdGhlcmUgaXMg
bm8gbmVlZCB0bwotICAgIC8vIGtlZXAgdGhlIE9uZVRvTWFueUNoYW5nZXMgYXJvdW5kLiBEZXN0
cm95IHRoZW0gc28gdGhleQotICAgIC8vIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgICBy
ZWxhdGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24ocmVsYXRpb25zaGlwKSB7Ci0gICAgICByZWxh
dGlvbnNoaXAuZGVzdHJveSgpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJvbGxpbmcg
YmFjayBhIHRyYW5zYWN0aW9uIHJlc2V0cyB0aGUgcmVjb3JkcyB0aGF0IGJlbG9uZyB0bwotICAg
IHRoYXQgdHJhbnNhY3Rpb24uCi0KLSAgICBVcGRhdGVkIHJlY29yZHMgaGF2ZSB0aGVpciBwcm9w
ZXJ0aWVzIHJlc2V0IHRvIHRoZSBsYXN0IGtub3duCi0gICAgdmFsdWUgZnJvbSB0aGUgcGVyc2lz
dGVuY2UgbGF5ZXIuIERlbGV0ZWQgcmVjb3JkcyBhcmUgcmV2ZXJ0ZWQKLSAgICB0byBhIGNsZWFu
LCBub24tZGVsZXRlZCBzdGF0ZS4gTmV3bHkgY3JlYXRlZCByZWNvcmRzIGltbWVkaWF0ZWx5Ci0g
ICAgYmVjb21lIGRlbGV0ZWQsIGFuZCBhcmUgbm90IHNlbnQgdG8gdGhlIGFkYXB0ZXIgdG8gYmUg
cGVyc2lzdGVkLgotCi0gICAgQWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrLCBh
bnkgcmVjb3JkcyB0aGF0IGJlbG9uZwotICAgIHRvIGl0IHdpbGwgcmV0dXJuIHRvIHRoZSBzdG9y
ZSdzIGRlZmF1bHQgdHJhbnNhY3Rpb24sIGFuZCB0aGUKLSAgICBjdXJyZW50IHRyYW5zYWN0aW9u
IHNob3VsZCBub3QgYmUgdXNlZCBhZ2Fpbi4KLSAgKi8KLSAgcm9sbGJhY2s6IGZ1bmN0aW9uKCkg
ewotICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHJlY29yZHMgaW4gZWFjaCBvZiB0aGUg
ZGlydHkgc3RhdGVzCi0gICAgLy8gYW5kIGluaXRpYXRlIGEgcm9sbGJhY2sgb24gdGhlbS4gQXMg
YSBzaWRlIGVmZmVjdCBvZiB0ZWxsaW5nCi0gICAgLy8gdGhlIHJlY29yZCB0byByb2xsIGJhY2ss
IGl0IHNob3VsZCBhbHNvIG1vdmUgaXRzZWxmIG91dCBvZgotICAgIC8vIHRoZSBkaXJ0eSBidWNr
ZXQgYW5kIGludG8gdGhlIGNsZWFuIGJ1Y2tldC4KLSAgICBbJ2NyZWF0ZWQnLCAndXBkYXRlZCcs
ICdkZWxldGVkJywgJ2luZmxpZ2h0J10uZm9yRWFjaChmdW5jdGlvbihidWNrZXRUeXBlKSB7Ci0g
ICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuYnVja2V0Rm9yVHlwZShidWNrZXRUeXBlKTsKLSAgICAg
IGZvckVhY2gocmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC5zZW5k
KCdyb2xsYmFjaycpOwotICAgICAgfSk7Ci0gICAgICByZWNvcmRzLmNsZWFyKCk7Ci0gICAgfSwg
dGhpcyk7Ci0KLSAgICAvLyBOb3cgdGhhdCBhbGwgcmVjb3JkcyBpbiB0aGUgdHJhbnNhY3Rpb24g
YXJlIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAvLyBjbGVhbiwgbWlncmF0ZSB0aGVtIGFsbCB0byB0
aGUgc3RvcmUncyBkZWZhdWx0IHRyYW5zYWN0aW9uLgotICAgIHRoaXMucmVtb3ZlQ2xlYW5SZWNv
cmRzKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFJlbW92ZXMgYSByZWNv
cmQgZnJvbSB0aGlzIHRyYW5zYWN0aW9uIGFuZCBiYWNrIHRvIHRoZSBzdG9yZSdzCi0gICAgZGVm
YXVsdCB0cmFuc2FjdGlvbi4KLQotICAgIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHByaXZhdGUgZm9y
IG5vdywgYnV0IHNob3VsZCBwcm9iYWJseSBiZSBleHBvc2VkCi0gICAgaW4gdGhlIGZ1dHVyZSBv
bmNlIHdlIGhhdmUgc3RyaWN0ZXIgZXJyb3IgY2hlY2tpbmcgKGZvciBleGFtcGxlLCBpbiB0aGUK
LSAgICBjYXNlIG9mIHRoZSByZWNvcmQgYmVpbmcgZGlydHkpLgotCi0gICAgQHBhcmFtIHtEUy5N
b2RlbH0gcmVjb3JkCi0gICovCi0gIHJlbW92ZTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFy
IGRlZmF1bHRUcmFuc2FjdGlvbiA9IGdldCh0aGlzLCAnc3RvcmUuZGVmYXVsdFRyYW5zYWN0aW9u
Jyk7Ci0gICAgZGVmYXVsdFRyYW5zYWN0aW9uLmFkb3B0UmVjb3JkKHJlY29yZCk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFJlbW92ZXMgYWxsIG9mIHRoZSByZWNvcmRzIGlu
IHRoZSB0cmFuc2FjdGlvbidzIGNsZWFuIGJ1Y2tldC4KLSAgKi8KLSAgcmVtb3ZlQ2xlYW5SZWNv
cmRzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY2xlYW4gPSB0aGlzLmJ1Y2tldEZvclR5cGUoJ2Ns
ZWFuJyk7Ci0gICAgY2xlYW4uZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHRoaXMu
cmVtb3ZlKHJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0gICAgY2xlYW4uY2xlYXIoKTsKLSAgfSwK
LQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgUmV0dXJucyB0aGUgYnVja2V0IGZvciB0aGUg
Z2l2ZW4gYnVja2V0IHR5cGUuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgY2FsbAotICAgIGB0aGlz
LmJ1Y2tldEZvclR5cGUoJ3VwZGF0ZWQnKWAgdG8gZ2V0IHRoZSBgRW1iZXIuTWFwYCB0aGF0IGNv
bnRhaW5zIGFsbAotICAgIG9mIHRoZSByZWNvcmRzIHRoYXQgaGF2ZSBjaGFuZ2VzIHBlbmRpbmcu
Ci0KLSAgICBAcGFyYW0ge1N0cmluZ30gYnVja2V0VHlwZSB0aGUgdHlwZSBvZiBidWNrZXQKLSAg
ICBAcmV0dXJucyBFbWJlci5NYXAKLSAgKi8KLSAgYnVja2V0Rm9yVHlwZTogZnVuY3Rpb24oYnVj
a2V0VHlwZSkgewotICAgIHZhciBidWNrZXRzID0gZ2V0KHRoaXMsICdidWNrZXRzJyk7Ci0KLSAg
ICByZXR1cm4gZ2V0KGJ1Y2tldHMsIGJ1Y2tldFR5cGUpOwotICB9LAotCi0gIC8qKgotICAgIEBw
cml2YXRlCi0KLSAgICBUaGlzIG1ldGhvZCBtb3ZlcyBhIHJlY29yZCBpbnRvIGEgZGlmZmVyZW50
IHRyYW5zYWN0aW9uIHdpdGhvdXQgdGhlIG5vcm1hbAotICAgIGNoZWNrcyB0aGF0IGVuc3VyZSB0
aGF0IHRoZSB1c2VyIGlzIG5vdCBkb2luZyBzb21ldGhpbmcgd2VpcmQsIGxpa2UgbW92aW5nCi0g
ICAgYSBkaXJ0eSByZWNvcmQgaW50byBhIG5ldyB0cmFuc2FjdGlvbi4KLQotICAgIEl0IGlzIGRl
c2lnbmVkIGZvciBpbnRlcm5hbCB1c2UsIHN1Y2ggYXMgd2hlbiB3ZSBhcmUgbW92aW5nIGEgY2xl
YW4gcmVjb3JkCi0gICAgaW50byBhIG5ldyB0cmFuc2FjdGlvbiB3aGVuIHRoZSB0cmFuc2FjdGlv
biBpcyBjb21taXR0ZWQuCi0KLSAgICBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgdW5s
ZXNzIHRoZSByZWNvcmQgaXMgY2xlYW4uCi0KLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQK
LSAgKi8KLSAgYWRvcHRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciBvbGRUcmFu
c2FjdGlvbiA9IGdldChyZWNvcmQsICd0cmFuc2FjdGlvbicpOwotCi0gICAgaWYgKG9sZFRyYW5z
YWN0aW9uKSB7Ci0gICAgICBvbGRUcmFuc2FjdGlvbi5yZW1vdmVGcm9tQnVja2V0KCdjbGVhbics
IHJlY29yZCk7Ci0gICAgfQotCi0gICAgdGhpcy5hZGRUb0J1Y2tldCgnY2xlYW4nLCByZWNvcmQp
OwotICAgIHNldChyZWNvcmQsICd0cmFuc2FjdGlvbicsIHRoaXMpOwotICB9LAotCi0gIC8qKgot
ICAgIEBwcml2YXRlCi0KLSAgICBBZGRzIGEgcmVjb3JkIHRvIHRoZSBuYW1lZCBidWNrZXQuCi0K
LSAgICBAcGFyYW0ge1N0cmluZ30gYnVja2V0VHlwZSBvbmUgb2YgYGNsZWFuYCwgYGNyZWF0ZWRg
LCBgdXBkYXRlZGAsIG9yIGBkZWxldGVkYAotICAqLwotICBhZGRUb0J1Y2tldDogZnVuY3Rpb24o
YnVja2V0VHlwZSwgcmVjb3JkKSB7Ci0gICAgdGhpcy5idWNrZXRGb3JUeXBlKGJ1Y2tldFR5cGUp
LmFkZChyZWNvcmQpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBSZW1vdmVz
IGEgcmVjb3JkIGZyb20gdGhlIG5hbWVkIGJ1Y2tldC4KLQotICAgIEBwYXJhbSB7U3RyaW5nfSBi
dWNrZXRUeXBlIG9uZSBvZiBgY2xlYW5gLCBgY3JlYXRlZGAsIGB1cGRhdGVkYCwgb3IgYGRlbGV0
ZWRgCi0gICovCi0gIHJlbW92ZUZyb21CdWNrZXQ6IGZ1bmN0aW9uKGJ1Y2tldFR5cGUsIHJlY29y
ZCkgewotICAgIHRoaXMuYnVja2V0Rm9yVHlwZShidWNrZXRUeXBlKS5yZW1vdmUocmVjb3JkKTsK
LSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQ2FsbGVkIGJ5IGEgcmVjb3JkJ3Mg
c3RhdGUgbWFuYWdlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZWNvcmQgaGFzIGVudGVyZWQKLSAg
ICBhIGRpcnR5IHN0YXRlLiBUaGUgcmVjb3JkIHdpbGwgYmUgbW92ZWQgZnJvbSB0aGUgYGNsZWFu
YCBidWNrZXQgYW5kIGludG8KLSAgICB0aGUgYXBwcm9wcmlhdGUgZGlydHkgYnVja2V0LgotCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IGJ1Y2tldFR5cGUgb25lIG9mIGBjcmVhdGVkYCwgYHVwZGF0ZWRg
LCBvciBgZGVsZXRlZGAKLSAgKi8KLSAgcmVjb3JkQmVjYW1lRGlydHk6IGZ1bmN0aW9uKGJ1Y2tl
dFR5cGUsIHJlY29yZCkgewotICAgIHRoaXMucmVtb3ZlRnJvbUJ1Y2tldCgnY2xlYW4nLCByZWNv
cmQpOwotICAgIHRoaXMuYWRkVG9CdWNrZXQoYnVja2V0VHlwZSwgcmVjb3JkKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQ2FsbGVkIGJ5IGEgcmVjb3JkJ3Mgc3RhdGUgbWFu
YWdlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZWNvcmQgaGFzIGVudGVyZWQKLSAgICBpbmZsaWdo
dCBzdGF0ZS4gVGhlIHJlY29yZCB3aWxsIGJlIG1vdmVkIGZyb20gaXRzIGN1cnJlbnQgZGlydHkg
YnVja2V0IGFuZCBpbnRvCi0gICAgdGhlIGBpbmZsaWdodGAgYnVja2V0LgotCi0gICAgQHBhcmFt
IHtTdHJpbmd9IGJ1Y2tldFR5cGUgb25lIG9mIGBjcmVhdGVkYCwgYHVwZGF0ZWRgLCBvciBgZGVs
ZXRlZGAKLSAgKi8KLSAgcmVjb3JkQmVjYW1lSW5GbGlnaHQ6IGZ1bmN0aW9uKGtpbmQsIHJlY29y
ZCkgewotICAgIHRoaXMucmVtb3ZlRnJvbUJ1Y2tldChraW5kLCByZWNvcmQpOwotICAgIHRoaXMu
YWRkVG9CdWNrZXQoJ2luZmxpZ2h0JywgcmVjb3JkKTsKLSAgfSwKLQotICByZWNvcmRJc01vdmlu
ZzogZnVuY3Rpb24oa2luZCwgcmVjb3JkKSB7Ci0gICAgdGhpcy5yZW1vdmVGcm9tQnVja2V0KGtp
bmQsIHJlY29yZCk7Ci0gICAgdGhpcy5hZGRUb0J1Y2tldCgnY2xlYW4nLCByZWNvcmQpOwotICB9
LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBDYWxsZWQgYnkgYSByZWNvcmQncyBzdGF0
ZSBtYW5hZ2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlY29yZCBoYXMgZW50ZXJlZAotICAgIGEg
Y2xlYW4gc3RhdGUuIFRoZSByZWNvcmQgd2lsbCBiZSBtb3ZlZCBmcm9tIGl0cyBjdXJyZW50IGRp
cnR5IG9yIGluZmxpZ2h0IGJ1Y2tldCBhbmQgaW50bwotICAgIHRoZSBgY2xlYW5gIGJ1Y2tldC4K
LQotICAgIEBwYXJhbSB7U3RyaW5nfSBidWNrZXRUeXBlIG9uZSBvZiBgY3JlYXRlZGAsIGB1cGRh
dGVkYCwgb3IgYGRlbGV0ZWRgCi0gICovCi0gIHJlY29yZEJlY2FtZUNsZWFuOiBmdW5jdGlvbihr
aW5kLCByZWNvcmQpIHsKLSAgICB0aGlzLnJlbW92ZUZyb21CdWNrZXQoa2luZCwgcmVjb3JkKTsK
LSAgICB0aGlzLnJlbW92ZShyZWNvcmQpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLXZhciBjbGFzc2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lmeSwgZ2V0ID0gRW1i
ZXIuZ2V0OwotCi0vKioKLUBwcml2YXRlCi0KLSAgVGhlIE1hcHBhYmxlIG1peGluIGlzIGRlc2ln
bmVkIGZvciBjbGFzc2VzIHRoYXQgd291bGQgbGlrZSB0bwotICBiZWhhdmUgYXMgYSBtYXAgZm9y
IGNvbmZpZ3VyYXRpb24gcHVycG9zZXMuCi0KLSAgRm9yIGV4YW1wbGUsIHRoZSBEUy5BZGFwdGVy
IGNsYXNzIGNhbiBiZWhhdmUgbGlrZSBhIG1hcCwgd2l0aAotICBtb3JlIHNlbWFudGljIEFQSSwg
dmlhIHRoZSBgbWFwYCBBUEk6Ci0KLSAgICBEUy5BZGFwdGVyLm1hcCgnQXBwLlBlcnNvbicsIHsg
Zmlyc3ROYW1lOiB7IGtleU5hbWU6ICdGSVJTVCcgfSB9KTsKLQotICBDbGFzcyBjb25maWd1cmF0
aW9uIHZpYSBhIG1hcC1saWtlIEFQSSBoYXMgYSBmZXcgY29tbW9uIHJlcXVpcmVtZW50cwotICB0
aGF0IGRpZmZlcmVudGlhdGUgaXQgZnJvbSB0aGUgc3RhbmRhcmQgRW1iZXIuTWFwIGltcGxlbWVu
dGF0aW9uLgotCi0gIEZpcnN0LCB2YWx1ZXMgb2Z0ZW4gYXJlIHByb3ZpZGVkIGFzIHN0cmluZ3Mg
dGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZAotICBpbnRvIGNsYXNzZXMgdGhlIGZpcnN0IHRpbWUg
dGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZC4KLQotICBTZWNvbmQsIHRoZSB2YWx1
ZXMgY29uZmlndXJlZCBvbiBwYXJlbnQgY2xhc3NlcyBzaG91bGQgYWxzbyBiZSB0YWtlbgotICBp
bnRvIGFjY291bnQuCi0KLSAgRmluYWxseSwgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBrZXkgc29t
ZXRpbWVzIHNob3VsZCBtZXJnZSB3aXRoIHRoZQotICBwcmV2aW91cyB2YWx1ZSwgcmF0aGVyIHRo
YW4gcmVwbGFjaW5nIGl0LgotCi0gIFRoaXMgbWl4aW4gcHJvdmlkZXMgYSBpbnN0YW5jZSBtZXRo
b2QsIGBjcmVhdGVJbnN0YW5jZU1hcEZvcmAsIHRoYXQKLSAgd2lsbCByZWlmeSBhbGwgb2YgdGhl
IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzZXQgb24gYW4gaW5zdGFuY2UncwotICBjb25zdHJ1Y3Rv
ciBhbmQgcHJvdmlkZSBpdCBmb3IgdGhlIGluc3RhbmNlIHRvIHVzZS4KLQotICBDbGFzc2VzIGNh
biBpbXBsZW1lbnQgY2VydGFpbiBob29rcyB0aGF0IGFsbG93IHRoZW0gdG8gY3VzdG9taXplCi0g
IHRoZSByZXF1aXJlbWVudHMgbGlzdGVkIGFib3ZlOgotCi0gICogYHJlc29sdmVNYXBDb25mbGlj
dGAgLSBjYWxsZWQgd2hlbiBhIHZhbHVlIGlzIHNldCBmb3IgYW4gZXhpc3RpbmcKLSAgICB2YWx1
ZQotICAqIGB0cmFuc2Zvcm1NYXBLZXlgIC0gYWxsb3dzIGEga2V5IG5hbWUgKGZvciBleGFtcGxl
LCBhIGdsb2JhbCBwYXRoCi0gICAgdG8gYSBjbGFzcykgdG8gYmUgbm9ybWFsaXplZAotICAqIGB0
cmFuc2Zvcm1NYXBWYWx1ZWAgLSBhbGxvd3MgYSB2YWx1ZSAoZm9yIGV4YW1wbGUsIGEgY2xhc3Mg
dGhhdAotICAgIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQpIHRvIGJlIG5vcm1hbGl6ZWQKLQotICBD
bGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgbWl4aW4gc2hvdWxkIGFsc28gaW1wbGVtZW50IGEg
Y2xhc3MKLSAgbWV0aG9kIGJ1aWx0IHVzaW5nIHRoZSBgZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcmAg
bWV0aG9kOgotCi0gICAgRFMuQWRhcHRlci5yZW9wZW5DbGFzcyh7Ci0gICAgICBtYXA6IERTLk1h
cHBhYmxlLmdlbmVyYXRlTWFwRnVuY3Rpb25Gb3IoJ2F0dHJpYnV0ZXMnLCBmdW5jdGlvbihrZXks
IG5ld1ZhbHVlLCBtYXApIHsKLSAgICAgICAgdmFyIGV4aXN0aW5nVmFsdWUgPSBtYXAuZ2V0KGtl
eSk7Ci0KLSAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBuZXdWYWx1ZSkgewotICAgICAgICAgIGlm
ICghbmV3VmFsdWUuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAgICAgICAg
ICBleGlzdGluZ1ZhbHVlW3Byb3BdID0gbmV3VmFsdWVbcHJvcF07Ci0gICAgICAgIH0KLSAgICAg
IH0pCi0gICAgfSk7Ci0KLSAgIFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYGdlbmVyYXRlTWFwRnVu
Y3Rpb25Gb3JgIGlzIGludm9rZWQgZXZlcnkgdGltZSBhCi0gICBuZXcgdmFsdWUgaXMgYWRkZWQg
dG8gdGhlIG1hcC4KLSoqLwotCi12YXIgcmVzb2x2ZU1hcENvbmZsaWN0ID0gZnVuY3Rpb24ob2xk
VmFsdWUsIG5ld1ZhbHVlLCBtYXBwaW5nc0tleSkgewotICByZXR1cm4gb2xkVmFsdWU7Ci19Owot
Ci12YXIgdHJhbnNmb3JtTWFwS2V5ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICByZXR1cm4g
a2V5OwotfTsKLQotdmFyIHRyYW5zZm9ybU1hcFZhbHVlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkg
ewotICByZXR1cm4gdmFsdWU7Ci19OwotCi1EUy5fTWFwcGFibGUgPSBFbWJlci5NaXhpbi5jcmVh
dGUoewotICBjcmVhdGVJbnN0YW5jZU1hcEZvcjogZnVuY3Rpb24obWFwTmFtZSkgewotICAgIHZh
ciBpbnN0YW5jZU1ldGEgPSBFbWJlci5tZXRhUGF0aCh0aGlzLCBbJ0RTLk1hcHBhYmxlJ10sIHRy
dWUpOwotCi0gICAgaW5zdGFuY2VNZXRhLnZhbHVlcyA9IGluc3RhbmNlTWV0YS52YWx1ZXMgfHwg
e307Ci0KLSAgICBpZiAoaW5zdGFuY2VNZXRhLnZhbHVlc1ttYXBOYW1lXSkgeyByZXR1cm4gaW5z
dGFuY2VNZXRhLnZhbHVlc1ttYXBOYW1lXTsgfQotCi0gICAgdmFyIGluc3RhbmNlTWFwID0gaW5z
dGFuY2VNZXRhLnZhbHVlc1ttYXBOYW1lXSA9IG5ldyBFbWJlci5NYXAoKTsKLQotICAgIHZhciBr
bGFzcyA9IHRoaXMuY29uc3RydWN0b3I7Ci0KLSAgICB3aGlsZSAoa2xhc3MgJiYga2xhc3MgIT09
IERTLlN0b3JlKSB7Ci0gICAgICB0aGlzLl9jb3B5TWFwKG1hcE5hbWUsIGtsYXNzLCBpbnN0YW5j
ZU1hcCk7Ci0gICAgICBrbGFzcyA9IGtsYXNzLnN1cGVyY2xhc3M7Ci0gICAgfQotCi0gICAgaW5z
dGFuY2VNZXRhLnZhbHVlc1ttYXBOYW1lXSA9IGluc3RhbmNlTWFwOwotICAgIHJldHVybiBpbnN0
YW5jZU1hcDsKLSAgfSwKLQotICBfY29weU1hcDogZnVuY3Rpb24obWFwTmFtZSwga2xhc3MsIGlu
c3RhbmNlTWFwKSB7Ci0gICAgdmFyIGNsYXNzTWV0YSA9IEVtYmVyLm1ldGFQYXRoKGtsYXNzLCBb
J0RTLk1hcHBhYmxlJ10sIHRydWUpOwotCi0gICAgdmFyIGNsYXNzTWFwID0gY2xhc3NNZXRhW21h
cE5hbWVdOwotICAgIGlmIChjbGFzc01hcCkgewotICAgICAgY2xhc3NNYXAuZm9yRWFjaChlYWNo
TWFwLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBlYWNoTWFwKGtleSwgdmFsdWUpIHsK
LSAgICAgIHZhciB0cmFuc2Zvcm1lZEtleSA9IChrbGFzcy50cmFuc2Zvcm1NYXBLZXkgfHwgdHJh
bnNmb3JtTWFwS2V5KShrZXksIHZhbHVlKTsKLSAgICAgIHZhciB0cmFuc2Zvcm1lZFZhbHVlID0g
KGtsYXNzLnRyYW5zZm9ybU1hcFZhbHVlIHx8IHRyYW5zZm9ybU1hcFZhbHVlKShrZXksIHZhbHVl
KTsKLQotICAgICAgdmFyIG9sZFZhbHVlID0gaW5zdGFuY2VNYXAuZ2V0KHRyYW5zZm9ybWVkS2V5
KTsKLSAgICAgIHZhciBuZXdWYWx1ZSA9IHRyYW5zZm9ybWVkVmFsdWU7Ci0KLSAgICAgIGlmIChv
bGRWYWx1ZSkgewotICAgICAgICBuZXdWYWx1ZSA9ICh0aGlzLmNvbnN0cnVjdG9yLnJlc29sdmVN
YXBDb25mbGljdCB8fCByZXNvbHZlTWFwQ29uZmxpY3QpKG9sZFZhbHVlLCBuZXdWYWx1ZSwgbWFw
TmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIGluc3RhbmNlTWFwLnNldCh0cmFuc2Zvcm1lZEtleSwg
bmV3VmFsdWUpOwotICAgIH0KLSAgfQotCi0KLX0pOwotCi1EUy5fTWFwcGFibGUuZ2VuZXJhdGVN
YXBGdW5jdGlvbkZvciA9IGZ1bmN0aW9uKG1hcE5hbWUsIHRyYW5zZm9ybSkgewotICByZXR1cm4g
ZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBtZXRhID0gRW1iZXIubWV0YVBhdGgodGhp
cywgWydEUy5NYXBwYWJsZSddLCB0cnVlKTsKLSAgICB2YXIgbWFwID0gbWV0YVttYXBOYW1lXSB8
fCBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgZGVmYXVsdFZhbHVlOiBmdW5j
dGlvbigpIHsgcmV0dXJuIHt9OyB9Ci0gICAgfSk7Ci0KLSAgICB0cmFuc2Zvcm0uY2FsbCh0aGlz
LCBrZXksIHZhbHVlLCBtYXApOwotCi0gICAgbWV0YVttYXBOYW1lXSA9IG1hcDsKLSAgfTsKLX07
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKmdsb2JhbHMgRW1iZXIqLwotLypqc2hp
bnQgZXFudWxsOnRydWUqLwotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBm
bXQgPSBFbWJlci5TdHJpbmcuZm10LCBvbmNlID0gRW1iZXIucnVuLm9uY2U7Ci12YXIgZm9yRWFj
aCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwotLy8gVGhlc2UgdmFsdWVzIGFyZSB1
c2VkIGluIHRoZSBkYXRhIGNhY2hlIHdoZW4gY2xpZW50SWRzIGFyZQotLy8gbmVlZGVkIGJ1dCB0
aGUgdW5kZXJseWluZyBkYXRhIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkIGJ5Ci0vLyB0aGUgc2Vy
dmVyLgotdmFyIFVOTE9BREVEID0gJ3VubG9hZGVkJzsKLXZhciBMT0FESU5HID0gJ2xvYWRpbmcn
OwotdmFyIE1BVEVSSUFMSVpFRCA9IHsgbWF0ZXJpYWxpemVkOiB0cnVlIH07Ci12YXIgQ1JFQVRF
RCA9IHsgY3JlYXRlZDogdHJ1ZSB9OwotCi0vLyBJbXBsZW1lbnRvcnMgTm90ZToKLS8vCi0vLyAg
IFRoZSB2YXJpYWJsZXMgaW4gdGhpcyBmaWxlIGFyZSBjb25zaXN0ZW50bHkgbmFtZWQgYWNjb3Jk
aW5nIHRvIHRoZSBmb2xsb3dpbmcKLS8vICAgc2NoZW1lOgotLy8KLS8vICAgKiAraWQrIG1lYW5z
IGFuIGlkZW50aWZpZXIgbWFuYWdlZCBieSBhbiBleHRlcm5hbCBzb3VyY2UsIHByb3ZpZGVkIGlu
c2lkZQotLy8gICAgIHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoYXQgc291cmNlLgotLy8gICAqICtj
bGllbnRJZCsgbWVhbnMgYSB0cmFuc2llbnQgbnVtZXJpY2FsIGlkZW50aWZpZXIgZ2VuZXJhdGVk
IGF0IHJ1bnRpbWUgYnkKLS8vICAgICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50IHBy
aW1hcmlseSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cyBtYXkKLS8vICAgICBub3QgeWV0
IGhhdmUgYW4gZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCi0vLyAgICogK3R5cGUrIG1lYW5zIGEg
c3ViY2xhc3Mgb2YgRFMuTW9kZWwuCi0KLS8vIFVzZWQgYnkgdGhlIHN0b3JlIHRvIG5vcm1hbGl6
ZSBJRHMgZW50ZXJpbmcgdGhlIHN0b3JlLiAgRGVzcGl0ZSB0aGUgZmFjdAotLy8gdGhhdCBkZXZl
bG9wZXJzIG1heSBwcm92aWRlIElEcyBhcyBudW1iZXJzIChlLmcuLCBgc3RvcmUuZmluZChQZXJz
b24sIDEpYCksCi0vLyBpdCBpcyBpbXBvcnRhbnQgdGhhdCBpbnRlcm5hbGx5IHdlIHVzZSBzdHJp
bmdzLCBzaW5jZSBJRHMgbWF5IGJlIHNlcmlhbGl6ZWQKLS8vIGFuZCBsb3NlIHR5cGUgaW5mb3Jt
YXRpb24uICBGb3IgZXhhbXBsZSwgRW1iZXIncyByb3V0ZXIgbWF5IHB1dCBhIHJlY29yZCdzCi0v
LyBJRCBpbnRvIHRoZSBVUkwsIGFuZCBpZiB3ZSBsYXRlciB0cnkgdG8gZGVzZXJpYWxpemUgdGhh
dCBVUkwgYW5kIGZpbmQgdGhlCi0vLyBjb3JyZXNwb25kaW5nIHJlY29yZCwgd2Ugd2lsbCBub3Qg
a25vdyBpZiBpdCBpcyBhIHN0cmluZyBvciBhIG51bWJlci4KLXZhciBjb2VyY2VJZCA9IGZ1bmN0
aW9uKGlkKSB7Ci0gIHJldHVybiBpZCA9PSBudWxsID8gbnVsbCA6IGlkKycnOwotfTsKLQotdmFy
IG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Ci0KLS8qKgotICBUaGUgc3RvcmUgY29u
dGFpbnMgYWxsIG9mIHRoZSBkYXRhIGZvciByZWNvcmRzIGxvYWRlZCBmcm9tIHRoZSBzZXJ2ZXIu
Ci0gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBEUy5N
b2RlbCB0aGF0IHdyYXBzCi0gIHRoZSBpbmRpdmlkdWFsIGRhdGEgZm9yIGEgcmVjb3JkLCBzbyB0
aGF0IHRoZXkgY2FuIGJlIGJvdW5kIHRvIGluIHlvdXIKLSAgSGFuZGxlYmFycyB0ZW1wbGF0ZXMu
Ci0KLSAgQ3JlYXRlIGEgbmV3IHN0b3JlIGxpa2UgdGhpczoKLQotICAgICAgIE15QXBwLnN0b3Jl
ID0gRFMuU3RvcmUuY3JlYXRlKCk7Ci0KLSAgWW91IGNhbiByZXRyaWV2ZSBEUy5Nb2RlbCBpbnN0
YW5jZXMgZnJvbSB0aGUgc3RvcmUgaW4gc2V2ZXJhbCB3YXlzLiBUbyByZXRyaWV2ZQotICBhIHJl
Y29yZCBmb3IgYSBzcGVjaWZpYyBpZCwgdXNlIHRoZSBgZmluZCgpYCBtZXRob2Q6Ci0KLSAgICAg
ICB2YXIgcmVjb3JkID0gTXlBcHAuc3RvcmUuZmluZChNeUFwcC5Db250YWN0LCAxMjMpOwotCi0g
ICBCeSBkZWZhdWx0LCB0aGUgc3RvcmUgd2lsbCB0YWxrIHRvIHlvdXIgYmFja2VuZCB1c2luZyBh
IHN0YW5kYXJkIFJFU1QgbWVjaGFuaXNtLgotICAgWW91IGNhbiBjdXN0b21pemUgaG93IHRoZSBz
dG9yZSB0YWxrcyB0byB5b3VyIGJhY2tlbmQgYnkgc3BlY2lmeWluZyBhIGN1c3RvbSBhZGFwdGVy
OgotCi0gICAgICAgTXlBcHAuc3RvcmUgPSBEUy5TdG9yZS5jcmVhdGUoewotICAgICAgICAgYWRh
cHRlcjogJ015QXBwLkN1c3RvbUFkYXB0ZXInCi0gICAgICAgfSk7Ci0KLSAgICBZb3UgY2FuIGxl
YXJuIG1vcmUgYWJvdXQgd3JpdGluZyBhIGN1c3RvbSBhZGFwdGVyIGJ5IHJlYWRpbmcgdGhlIGBE
Uy5BZGFwdGVyYAotICAgIGRvY3VtZW50YXRpb24uCi0qLwotRFMuU3RvcmUgPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKERTLl9NYXBwYWJsZSwgewotCi0gIC8qKgotICAgIE1hbnkgbWV0aG9kcyBjYW4g
YmUgaW52b2tlZCB3aXRob3V0IHNwZWNpZnlpbmcgd2hpY2ggc3RvcmUgc2hvdWxkIGJlIHVzZWQu
Ci0gICAgSW4gdGhvc2UgY2FzZXMsIHRoZSBmaXJzdCBzdG9yZSBjcmVhdGVkIHdpbGwgYmUgdXNl
ZCBhcyB0aGUgZGVmYXVsdC4gSWYKLSAgICBhbiBhcHBsaWNhdGlvbiBoYXMgbXVsdGlwbGUgc3Rv
cmVzLCBpdCBzaG91bGQgc3BlY2lmeSB3aGljaCBzdG9yZSB0byB1c2UKLSAgICB3aGVuIHBlcmZv
cm1pbmcgYWN0aW9ucywgc3VjaCBhcyBmaW5kaW5nIHJlY29yZHMgYnkgaWQuCi0KLSAgICBUaGUg
aW5pdCBtZXRob2QgcmVnaXN0ZXJzIHRoaXMgc3RvcmUgYXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBp
cyBzcGVjaWZpZWQuCi0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIC8vIEVuZm9yY2Ug
QVBJIHJldmlzaW9uaW5nLiBTZWUgQlJFQUtJTkdfQ0hBTkdFUy5tZCBmb3IgbW9yZS4KLSAgICB2
YXIgcmV2aXNpb24gPSBnZXQodGhpcywgJ3JldmlzaW9uJyk7Ci0KLSAgICBpZiAocmV2aXNpb24g
IT09IERTLkNVUlJFTlRfQVBJX1JFVklTSU9OICYmICFFbWJlci5FTlYuVEVTVElORykgewotICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvcjogVGhlIEVtYmVyIERhdGEgbGlicmFyeSBoYXMgaGFk
IGJyZWFraW5nIEFQSSBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHRpbWUgeW91IHVwZGF0ZWQgdGhl
IGxpYnJhcnkuIFBsZWFzZSByZXZpZXcgdGhlIGxpc3Qgb2YgYnJlYWtpbmcgY2hhbmdlcyBhdCBo
dHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9kYXRhL2Jsb2IvbWFzdGVyL0JSRUFLSU5HX0NIQU5H
RVMubWQsIHRoZW4gdXBkYXRlIHlvdXIgc3RvcmUncyBgcmV2aXNpb25gIHByb3BlcnR5IHRvICIg
KyBEUy5DVVJSRU5UX0FQSV9SRVZJU0lPTik7Ci0gICAgfQotCi0gICAgaWYgKCFnZXQoRFMsICdk
ZWZhdWx0U3RvcmUnKSB8fCBnZXQodGhpcywgJ2lzRGVmYXVsdFN0b3JlJykpIHsKLSAgICAgIHNl
dChEUywgJ2RlZmF1bHRTdG9yZScsIHRoaXMpOwotICAgIH0KLQotICAgIC8vIGludGVybmFsIGJv
b2trZWVwaW5nOyBub3Qgb2JzZXJ2YWJsZQotICAgIHRoaXMudHlwZU1hcHMgPSB7fTsKLSAgICB0
aGlzLnJlY29yZENhY2hlID0gW107Ci0gICAgdGhpcy5jbGllbnRJZFRvSWQgPSB7fTsKLSAgICB0
aGlzLmNsaWVudElkVG9UeXBlID0ge307Ci0gICAgdGhpcy5jbGllbnRJZFRvRGF0YSA9IHt9Owot
ICAgIHRoaXMuY2xpZW50SWRUb1ByZW1hdGVyaWFsaXplZERhdGEgPSB7fTsKLSAgICB0aGlzLnJl
Y29yZEFycmF5c0J5Q2xpZW50SWQgPSB7fTsKLSAgICB0aGlzLnJlbGF0aW9uc2hpcENoYW5nZXMg
PSB7fTsKLSAgICB0aGlzLnJlY29yZFJlZmVyZW5jZXMgPSB7fTsKLQotICAgIC8vIEludGVybmFs
bHksIHdlIG1haW50YWluIGEgbWFwIG9mIGFsbCB1bmxvYWRlZCBJRHMgcmVxdWVzdGVkIGJ5Ci0g
ICAgLy8gYSBNYW55QXJyYXkuIEFzIHRoZSBhZGFwdGVyIGxvYWRzIGRhdGEgaW50byB0aGUgc3Rv
cmUsIHRoZQotICAgIC8vIHN0b3JlIG5vdGlmaWVzIGFueSBpbnRlcmVzdGVkIE1hbnlBcnJheXMu
IFdoZW4gdGhlIE1hbnlBcnJheSdzCi0gICAgLy8gdG90YWwgbnVtYmVyIG9mIGxvYWRpbmcgcmVj
b3JkcyBkcm9wcyB0byB6ZXJvLCBpdCBiZWNvbWVzCi0gICAgLy8gYGlzTG9hZGVkYCBhbmQgZmly
ZXMgYSBgZGlkTG9hZGAgZXZlbnQuCi0gICAgdGhpcy5sb2FkaW5nUmVjb3JkQXJyYXlzID0ge307
Ci0KLSAgICBzZXQodGhpcywgJ2RlZmF1bHRUcmFuc2FjdGlvbicsIHRoaXMudHJhbnNhY3Rpb24o
KSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyB0cmFuc2FjdGlvbiBzY29wZWQg
dG8gdGhpcyBzdG9yZS4gVGhpcyBkZWxlZ2F0ZXMKLSAgICByZXNwb25zaWJpbGl0eSBmb3IgaW52
b2tpbmcgdGhlIGFkYXB0ZXIncyBjb21taXQgbWVjaGFuaXNtIHRvCi0gICAgYSB0cmFuc2FjdGlv
bi4KLQotICAgIFRyYW5zYWN0aW9uIGFyZSByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgY2hhbmdl
cyB0byByZWNvcmRzCi0gICAgYWRkZWQgdG8gdGhlbSwgYW5kIHN1cHBvcnRpbmcgYGNvbW1pdGAg
YW5kIGByb2xsYmFja2AKLSAgICBmdW5jdGlvbmFsaXR5LiBDb21taXR0aW5nIGEgdHJhbnNhY3Rp
b24gaW52b2tlcyB0aGUgc3RvcmUncwotICAgIGFkYXB0ZXIsIHdoaWxlIHJvbGxpbmcgYmFjayBh
IHRyYW5zYWN0aW9uIHJldmVyc2VzIGFsbAotICAgIGNoYW5nZXMgbWFkZSB0byByZWNvcmRzIGFk
ZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KLQotICAgIEEgc3RvcmUgaGFzIGFuIGltcGxpY2l0IChk
ZWZhdWx0KSB0cmFuc2FjdGlvbiwgd2hpY2ggdHJhY2tzIGNoYW5nZXMKLSAgICBtYWRlIHRvIHJl
Y29yZHMgbm90IGV4cGxpY2l0bHkgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbi4KLQotICAgIEBzZWUg
e0RTLlRyYW5zYWN0aW9ufQotICAgIEByZXR1cm5zIERTLlRyYW5zYWN0aW9uCi0gICovCi0gIHRy
YW5zYWN0aW9uOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gRFMuVHJhbnNhY3Rpb24uY3JlYXRl
KHsgc3RvcmU6IHRoaXMgfSk7Ci0gIH0sCi0KLSAgZW5zdXJlU2FtZVRyYW5zYWN0aW9uOiBmdW5j
dGlvbihyZWNvcmRzKXsKLSAgICB2YXIgdHJhbnNhY3Rpb25zID0gRW1iZXIuQSgpOwotICAgIGZv
ckVhY2goIHJlY29yZHMsIGZ1bmN0aW9uKHJlY29yZCl7Ci0gICAgICBpZiAocmVjb3JkKXsgdHJh
bnNhY3Rpb25zLnB1c2hPYmplY3QoZ2V0KHJlY29yZCwgJ3RyYW5zYWN0aW9uJykpOyB9Ci0gICAg
fSk7Ci0KLSAgICB2YXIgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnMucmVkdWNlKGZ1bmN0aW9u
KHByZXYsIHQpIHsKLSAgICAgIGlmICghZ2V0KHQsICdpc0RlZmF1bHQnKSkgewotICAgICAgICBp
ZiAocHJldiA9PT0gbnVsbCkgeyByZXR1cm4gdDsgfQotICAgICAgICBFbWJlci5hc3NlcnQoIkFs
bCByZWNvcmRzIGluIGEgY2hhbmdlZCByZWxhdGlvbnNoaXAgbXVzdCBiZSBpbiB0aGUgc2FtZSB0
cmFuc2FjdGlvbi4gWW91IHRyaWVkIHRvIGNoYW5nZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4g
cmVjb3JkcyB3aGVuIG9uZSBpcyBpbiAiICsgdCArICIgYW5kIHRoZSBvdGhlciBpcyBpbiAiICsg
cHJldiwgdCA9PT0gcHJldik7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwcmV2OwotICAgIH0s
IG51bGwpOwotCi0gICAgaWYgKHRyYW5zYWN0aW9uKSB7Ci0gICAgICBmb3JFYWNoKCByZWNvcmRz
LCBmdW5jdGlvbihyZWNvcmQpewotICAgICAgICBpZiAocmVjb3JkKXsgdHJhbnNhY3Rpb24uYWRk
KHJlY29yZCk7IH0KLSAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc2FjdGlvbiA9
IHRyYW5zYWN0aW9ucy5vYmplY3RBdCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zYWN0aW9u
OwotCi0gICB9LAotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgSW5zdHJ1Y3RzIHRoZSBzdG9y
ZSB0byBtYXRlcmlhbGl6ZSB0aGUgZGF0YSBmb3IgYSBnaXZlbiByZWNvcmQuCi0KLSAgICBUbyBt
YXRlcmlhbGl6ZSBhIHJlY29yZCwgdGhlIHN0b3JlIGZpcnN0IHJldHJpZXZlcyB0aGUgb3BhcXVl
IGRhdGEgdGhhdCB3YXMKLSAgICBwYXNzZWQgdG8gZWl0aGVyIGBsb2FkKClgIG9yIGBsb2FkTWFu
eSgpYC4gVGhlbiwgdGhlIGRhdGEgYW5kIHRoZSByZWNvcmQKLSAgICBhcmUgcGFzc2VkIHRvIHRo
ZSBhZGFwdGVyJ3MgYG1hdGVyaWFsaXplKClgIG1ldGhvZCwgd2hpY2ggYWxsb3dzIHRoZSBhZGFw
dGVyCi0gICAgdG8gdHJhbnNsYXRlIGFyYml0cmFyeSBkYXRhIHN0cnVjdHVyZXMgZnJvbSB0aGUg
YWRhcHRlciBpbnRvIHRoZSBub3JtYWxpemVkCi0gICAgZm9ybSB0aGUgcmVjb3JkIGV4cGVjdHMu
Ci0KLSAgICBUaGUgYWRhcHRlcidzIGBtYXRlcmlhbGl6ZSgpYCBtZXRob2Qgd2lsbCBpbnZva2Ug
YG1hdGVyaWFsaXplQXR0cmlidXRlKClgLAotICAgIGBtYXRlcmlhbGl6ZUhhc01hbnkoKWAgYW5k
IGBtYXRlcmlhbGl6ZUJlbG9uZ3NUbygpYCBvbiB0aGUgcmVjb3JkIHRvCi0gICAgcG9wdWxhdGUg
aXQgd2l0aCBub3JtYWxpemVkIHZhbHVlcy4KLQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y
ZAotICAqLwotICBtYXRlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciBj
bGllbnRJZCA9IGdldChyZWNvcmQsICdjbGllbnRJZCcpLAotICAgICAgICBjaWRUb0RhdGEgPSB0
aGlzLmNsaWVudElkVG9EYXRhLAotICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yVHlw
ZShyZWNvcmQuY29uc3RydWN0b3IpLAotICAgICAgICBkYXRhID0gY2lkVG9EYXRhW2NsaWVudElk
XTsKLQotICAgIGNpZFRvRGF0YVtjbGllbnRJZF0gPSBNQVRFUklBTElaRUQ7Ci0KLSAgICB2YXIg
cHJlbWF0ZXJpYWxpemVkID0gdGhpcy5jbGllbnRJZFRvUHJlbWF0ZXJpYWxpemVkRGF0YVtjbGll
bnRJZF07Ci0KLSAgICAvLyBFbnN1cmVzIHRoZSByZWNvcmQncyBkYXRhIHN0cnVjdHVyZXMgYXJl
IHNldHVwCi0gICAgLy8gYmVmb3JlIGJlaW5nIHBvcHVsYXRlZCBieSB0aGUgYWRhcHRlci4KLSAg
ICByZWNvcmQuc2V0dXBEYXRhKCk7Ci0KLSAgICBpZiAoZGF0YSAhPT0gQ1JFQVRFRCkgewotICAg
ICAgLy8gSW5zdHJ1Y3RzIHRoZSBhZGFwdGVyIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0
aGUKLSAgICAgIC8vIG9wYXF1ZSBkYXRhIGFuZCBtYXRlcmlhbGl6ZSB0aGUgcmVjb3JkJ3MgYXR0
cmlidXRlcyBhbmQKLSAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCi0gICAgICBhZGFwdGVyLm1hdGVy
aWFsaXplKHJlY29yZCwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQHByaXZhdGUKLQotICAgIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbHJlYWR5
IGEgcmVjb3JkIGZvciB0aGlzIGNsaWVudElkLgotCi0gICAgVGhpcyBpcyB1c2VkIHRvIGRldGVy
bWluZSB3aGV0aGVyIGNsZWFudXAgaXMgcmVxdWlyZWQsIHNvIHRoYXQKLSAgICAiY2hhbmdlcyIg
dG8gdW5tYXRlcmlhbGl6ZWQgcmVjb3JkcyBkbyBub3QgdHJpZ2dlciBtYXNzCi0gICAgbWF0ZXJp
YWxpemF0aW9uLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIGEgcGFyZW50IHJlY29yZCBpbiBhIHJl
bGF0aW9uc2hpcCB3aXRoIGEgbGFyZ2UKLSAgICBudW1iZXIgb2YgY2hpbGRyZW4gaXMgZGVsZXRl
ZCwgd2Ugd2FudCB0byBhdm9pZCBtYXRlcmlhbGl6aW5nCi0gICAgdGhvc2UgY2hpbGRyZW4uCi0K
LSAgICBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlCi0gICAgQHJldHVybiB7Qm9vbGVhbn0KLSAg
Ki8KLSAgcmVjb3JkSXNNYXRlcmlhbGl6ZWQ6IGZ1bmN0aW9uKHJlZmVyZW5jZSkgewotICAgIHJl
dHVybiAhIXRoaXMucmVjb3JkQ2FjaGVbcmVmZXJlbmNlLmNsaWVudElkXTsKLSAgfSwKLQotICAv
KioKLSAgICBUaGUgYWRhcHRlciB0byB1c2UgdG8gY29tbXVuaWNhdGUgdG8gYSBiYWNrZW5kIHNl
cnZlciBvciBvdGhlciBwZXJzaXN0ZW5jZSBsYXllci4KLQotICAgIFRoaXMgY2FuIGJlIHNwZWNp
ZmllZCBhcyBhbiBpbnN0YW5jZSwgYSBjbGFzcywgb3IgYSBwcm9wZXJ0eSBwYXRoIHRoYXQgc3Bl
Y2lmaWVzCi0gICAgd2hlcmUgdGhlIGFkYXB0ZXIgY2FuIGJlIGxvY2F0ZWQuCi0KLSAgICBAcHJv
cGVydHkge0RTLkFkYXB0ZXJ8U3RyaW5nfQotICAqLwotICBhZGFwdGVyOiAnRFMuUkVTVEFkYXB0
ZXInLAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBSZXR1cm5zIGEgSlNPTiByZXByZXNl
bnRhdGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIHRoZSBhZGFwdGVyJ3MKLSAgICBzZXJpYWxpemF0
aW9uIHN0cmF0ZWd5LiBUaGlzIG1ldGhvZCBleGlzdHMgcHJpbWFyaWx5IHRvIGVuYWJsZQotICAg
IGEgcmVjb3JkLCB3aGljaCBoYXMgYWNjZXNzIHRvIGl0cyBzdG9yZSAoYnV0IG5vdCB0aGUgc3Rv
cmUncwotICAgIGFkYXB0ZXIpIHRvIHByb3ZpZGUgYSBgc2VyaWFsaXplKClgIGNvbnZlbmllbmNl
LgotCi0gICAgVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZToKLQotICAgICogYGluY2x1ZGVJZGA6
IGB0cnVlYCBpZiB0aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJlIGluY2x1ZGVkIGluCi0gICAgICB0
aGUgSlNPTiByZXByZXNlbnRhdGlvbgotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRo
ZSByZWNvcmQgdG8gc2VyaWFsaXplCi0gICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYW4gb3B0
aW9ucyBoYXNoCi0gICovCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3JkLCBvcHRpb25zKSB7
Ci0gICAgcmV0dXJuIHRoaXMuYWRhcHRlckZvclR5cGUocmVjb3JkLmNvbnN0cnVjdG9yKS5zZXJp
YWxpemUocmVjb3JkLCBvcHRpb25zKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0g
ICAgVGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRoZSBhZGFwdGVyLCBhZnRlciByZXNvbHZpbmcgYSBw
b3NzaWJsZQotICAgIHByb3BlcnR5IHBhdGguCi0KLSAgICBJZiB0aGUgc3VwcGxpZWQgYGFkYXB0
ZXJgIHdhcyBhIGNsYXNzLCBvciBhIFN0cmluZyBwcm9wZXJ0eQotICAgIHBhdGggcmVzb2x2ZWQg
dG8gYSBjbGFzcywgdGhpcyBwcm9wZXJ0eSB3aWxsIGluc3RhbnRpYXRlIHRoZQotICAgIGNsYXNz
LgotCi0gICAgVGhpcyBwcm9wZXJ0eSBpcyBjYWNoZWFibGUsIHNvIHRoZSBzYW1lIGluc3RhbmNl
IG9mIGEgc3BlY2lmaWVkCi0gICAgYWRhcHRlciBjbGFzcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhl
IGxpZmV0aW1lIG9mIHRoZSBzdG9yZS4KLQotICAgIEByZXR1cm5zIERTLkFkYXB0ZXIKLSAgKi8K
LSAgX2FkYXB0ZXI6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBhZGFwdGVy
ID0gZ2V0KHRoaXMsICdhZGFwdGVyJyk7Ci0gICAgaWYgKHR5cGVvZiBhZGFwdGVyID09PSAnc3Ry
aW5nJykgewotICAgICAgYWRhcHRlciA9IGdldCh0aGlzLCBhZGFwdGVyLCBmYWxzZSkgfHwgZ2V0
KEVtYmVyLmxvb2t1cCwgYWRhcHRlcik7Ci0gICAgfQotCi0gICAgaWYgKERTLkFkYXB0ZXIuZGV0
ZWN0KGFkYXB0ZXIpKSB7Ci0gICAgICBhZGFwdGVyID0gYWRhcHRlci5jcmVhdGUoKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfSkucHJvcGVydHkoJ2FkYXB0ZXInKSwKLQotICAv
KioKLSAgICBAcHJpdmF0ZQotCi0gICAgQSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgbnVtYmVy
IHRvIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkKLSAgICBkYXRhIGFuZCByZWNvcmRzLgot
Ci0gICAgSXQgc3RhcnRzIGF0IDEgc28gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUgY2FuIHRlc3Qg
Zm9yIHRydXRoaW5lc3MKLSAgICB3aGVuIHByb3ZpZGVkIGEgYGNsaWVudElkYCBpbnN0ZWFkIG9m
IGhhdmluZyB0byBleHBsaWNpdGx5IHRlc3QKLSAgICBmb3IgdW5kZWZpbmVkLgotICAqLwotICBj
bGllbnRJZENvdW50ZXI6IDEsCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4g
Q1JFQVRFIE5FVyBSRUNPUkQgLgotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4KLQotICAvKioK
LSAgICBDcmVhdGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJyZW50IHN0b3JlLiBUaGUgcHJvcGVy
dGllcyBwYXNzZWQKLSAgICB0byB0aGlzIG1ldGhvZCBhcmUgc2V0IG9uIHRoZSBuZXdseSBjcmVh
dGVkIHJlY29yZC4KLQotICAgIE5vdGU6IFRoZSB0aGlyZCBgdHJhbnNhY3Rpb25gIHByb3BlcnR5
IGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLSAgICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBy
ZWNvcmQgaW5zaWRlIG9mIGEgZ2l2ZW4gdHJhbnNhY3Rpb24sCi0gICAgdXNlIGB0cmFuc2FjdGlv
bi5jcmVhdGVSZWNvcmQoKWAgaW5zdGVhZCBvZiBgc3RvcmUuY3JlYXRlUmVjb3JkKClgLgotCi0g
ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0
fSBwcm9wZXJ0aWVzIGEgaGFzaCBvZiBwcm9wZXJ0aWVzIHRvIHNldCBvbiB0aGUKLSAgICAgIG5l
d2x5IGNyZWF0ZWQgcmVjb3JkLgotICAgIEByZXR1cm5zIERTLk1vZGVsCi0gICovCi0gIGNyZWF0
ZVJlY29yZDogZnVuY3Rpb24odHlwZSwgcHJvcGVydGllcywgdHJhbnNhY3Rpb24pIHsKLSAgICBw
cm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTsKLQotICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0
YW5jZSBvZiB0aGUgbW9kZWwgYHR5cGVgIGFuZCBwdXQgaXQKLSAgICAvLyBpbnRvIHRoZSBzcGVj
aWZpZWQgYHRyYW5zYWN0aW9uYC4gSWYgbm8gdHJhbnNhY3Rpb24gaXMKLSAgICAvLyBzcGVjaWZp
ZWQsIHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIHdpbGwgYmUgdXNlZC4KLSAgICB2YXIgcmVjb3Jk
ID0gdHlwZS5fY3JlYXRlKHsKLSAgICAgIHN0b3JlOiB0aGlzCi0gICAgfSk7Ci0KLSAgICB0cmFu
c2FjdGlvbiA9IHRyYW5zYWN0aW9uIHx8IGdldCh0aGlzLCAnZGVmYXVsdFRyYW5zYWN0aW9uJyk7
Ci0KLSAgICAvLyBhZG9wdFJlY29yZCBpcyBhbiBpbnRlcm5hbCBBUEkgdGhhdCBhbGxvd3MgcmVj
b3JkcyB0byBtb3ZlCi0gICAgLy8gaW50byBhIHRyYW5zYWN0aW9uIHdpdGhvdXQgYXNzZXJ0aW9u
cyBkZXNpZ25lZCBmb3IgYXBwCi0gICAgLy8gY29kZS4gSXQgaXMgdXNlZCBoZXJlIHRvIGVuc3Vy
ZSB0aGF0IHJlZ2FyZGxlc3Mgb2YgbmV3Ci0gICAgLy8gcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ug
b2YgdGhlIHB1YmxpYyBgdHJhbnNhY3Rpb24uYWRkKClgCi0gICAgLy8gQVBJLCB3ZSB3aWxsIGFs
d2F5cyBiZSBhYmxlIHRvIGluc2VydCBuZXcgcmVjb3JkcyBpbnRvCi0gICAgLy8gdGhlaXIgdHJh
bnNhY3Rpb24uCi0gICAgdHJhbnNhY3Rpb24uYWRvcHRSZWNvcmQocmVjb3JkKTsKLQotICAgIC8v
IGBpZGAgaXMgYSBzcGVjaWFsIHByb3BlcnR5IHRoYXQgbWF5IG5vdCBiZSBhIGBEUy5hdHRyYAot
ICAgIHZhciBpZCA9IHByb3BlcnRpZXMuaWQ7Ci0KLSAgICAvLyBJZiB0aGUgcGFzc2VkIHByb3Bl
cnRpZXMgZG8gbm90IGluY2x1ZGUgYSBwcmltYXJ5IGtleSwKLSAgICAvLyBnaXZlIHRoZSBhZGFw
dGVyIGFuIG9wcG9ydHVuaXR5IHRvIGdlbmVyYXRlIG9uZS4gVHlwaWNhbGx5LAotICAgIC8vIGNs
aWVudC1zaWRlIElEIGdlbmVyYXRvcnMgd2lsbCB1c2Ugc29tZXRoaW5nIGxpa2UgdXVpZC5qcwot
ICAgIC8vIHRvIGF2b2lkIGNvbmZsaWN0cy4KLSAgICB2YXIgYWRhcHRlcjsKLSAgICBpZiAoRW1i
ZXIuaXNOb25lKGlkKSkgewotICAgICAgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvclR5cGUodHlw
ZSk7Ci0gICAgICBpZiAoYWRhcHRlciAmJiBhZGFwdGVyLmdlbmVyYXRlSWRGb3JSZWNvcmQpIHsK
LSAgICAgICAgaWQgPSBjb2VyY2VJZChhZGFwdGVyLmdlbmVyYXRlSWRGb3JSZWNvcmQodGhpcywg
cmVjb3JkKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuaWQgPSBpZDsKLSAgICAgIH0KLSAgICB9Ci0K
LSAgICBpZCA9IGNvZXJjZUlkKGlkKTsKLQotICAgIC8vIENyZWF0ZSBhIG5ldyBgY2xpZW50SWRg
IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUKLSAgICAvLyBzcGVjaWZpZWQgKG9yIGdlbmVyYXRl
ZCkgYGlkYC4gU2luY2Ugd2UgZG9uJ3QgaGF2ZQotICAgIC8vIGFueSBkYXRhIGZvciB0aGUgc2Vy
dmVyIHlldCAoYnkgZGVmaW5pdGlvbiksIHN0b3JlCi0gICAgLy8gdGhlIHNlbnRpbmVsIHZhbHVl
IENSRUFURUQgYXMgdGhlIGRhdGEgZm9yIHRoaXMKLSAgICAvLyBjbGllbnRJZC4gSWYgd2Ugc2Vl
IHRoaXMgdmFsdWUgbGF0ZXIsIHdlIHdpbGwgc2tpcAotICAgIC8vIG1hdGVyaWFsaXphdGlvbi4K
LSAgICB2YXIgY2xpZW50SWQgPSB0aGlzLnB1c2hEYXRhKENSRUFURUQsIGlkLCB0eXBlKTsKLQot
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnRJZCwgYXR0YWNoIGl0IHRvIHRoZSByZWNv
cmQgd2UKLSAgICAvLyBqdXN0IGNyZWF0ZWQuCi0gICAgc2V0KHJlY29yZCwgJ2NsaWVudElkJywg
Y2xpZW50SWQpOwotCi0gICAgLy8gTW92ZSB0aGUgcmVjb3JkIG91dCBvZiBpdHMgaW5pdGlhbCBg
ZW1wdHlgIHN0YXRlIGludG8KLSAgICAvLyB0aGUgYGxvYWRlZGAgc3RhdGUuCi0gICAgcmVjb3Jk
LmxvYWRlZERhdGEoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSBpcyBzZXQgdXAgc28g
dGhlIHJlY29yZCBkb2Vzbid0Ci0gICAgLy8gdHJ5IHRvIG1hdGVyaWFsaXplIGl0cyBub25leGlz
dGVudCBkYXRhLgotICAgIHJlY29yZC5zZXR1cERhdGEoKTsKLQotICAgIC8vIFN0b3JlIHRoZSBy
ZWNvcmQgd2UganVzdCBjcmVhdGVkIGluIHRoZSByZWNvcmQgY2FjaGUgZm9yCi0gICAgLy8gdGhp
cyBjbGllbnRJZC4KLSAgICB0aGlzLnJlY29yZENhY2hlW2NsaWVudElkXSA9IHJlY29yZDsKLQot
ICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBzcGVjaWZpZWQgb24gdGhlIHJlY29yZC4KLSAgICBy
ZWNvcmQuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgIC8vIFJlc29sdmUgcmVjb3Jk
IHByb21pc2UKLSAgICBFbWJlci5ydW4ocmVjb3JkLCAncmVzb2x2ZScsIHJlY29yZCk7Ci0KLSAg
ICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4g
REVMRVRFIFJFQ09SRCAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgRm9y
IHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgZGVsZXRlZCB2aWEgdGhlIHN0b3JlLgotCi0gICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGRlbGV0ZVJlY29yZDogZnVuY3Rpb24o
cmVjb3JkKSB7Ci0gICAgcmVjb3JkLmRlbGV0ZVJlY29yZCgpOwotICB9LAotCi0gIC8qKgotICAg
IEZvciBzeW1tZXRyeSwgYSByZWNvcmQgY2FuIGJlIHVubG9hZGVkIHZpYSB0aGUgc3RvcmUuCi0K
LSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgdW5sb2FkUmVjb3JkOiBmdW5j
dGlvbihyZWNvcmQpIHsKLSAgICByZWNvcmQudW5sb2FkUmVjb3JkKCk7Ci0gIH0sCi0KLSAgLy8g
Li4uLi4uLi4uLi4uLi4uLgotICAvLyAuIEZJTkQgUkVDT1JEUyAuCi0gIC8vIC4uLi4uLi4uLi4u
Li4uLi4KLQotICAvKioKLSAgICBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gZmlu
ZGluZyByZWNvcmRzLiBUaGUgZmlyc3QgcGFyYW1ldGVyIHRvCi0gICAgdGhpcyBtZXRob2QgaXMg
YWx3YXlzIGEgc3ViY2xhc3Mgb2YgYERTLk1vZGVsYC4KLQotICAgIFlvdSBjYW4gdXNlIHRoZSBg
ZmluZGAgbWV0aG9kIG9uIGEgc3ViY2xhc3Mgb2YgYERTLk1vZGVsYCBkaXJlY3RseSBpZiB5b3Vy
Ci0gICAgYXBwbGljYXRpb24gb25seSBoYXMgb25lIHN0b3JlLiBGb3IgZXhhbXBsZSwgaW5zdGVh
ZCBvZgotICAgIGBzdG9yZS5maW5kKEFwcC5QZXJzb24sIDEpYCwgeW91IGNvdWxkIHNheSBgQXBw
LlBlcnNvbi5maW5kKDEpYC4KLQotICAgIC0tLQotCi0gICAgVG8gZmluZCBhIHJlY29yZCBieSBJ
RCwgcGFzcyB0aGUgYGlkYCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcjoKLQotICAgICAgICBzdG9y
ZS5maW5kKEFwcC5QZXJzb24sIDEpOwotICAgICAgICBBcHAuUGVyc29uLmZpbmQoMSk7Ci0KLSAg
ICBJZiB0aGUgcmVjb3JkIHdpdGggdGhhdCBgaWRgIGhhZCBub3QgcHJldmlvdXNseSBiZWVuIGxv
YWRlZCwgdGhlIHN0b3JlIHdpbGwKLSAgICByZXR1cm4gYW4gZW1wdHkgcmVjb3JkIGltbWVkaWF0
ZWx5IGFuZCBhc2sgdGhlIGFkYXB0ZXIgdG8gZmluZCB0aGUgZGF0YSBieQotICAgIGNhbGxpbmcg
dGhlIGFkYXB0ZXIncyBgZmluZGAgbWV0aG9kLgotCi0gICAgVGhlIGBmaW5kYCBtZXRob2Qgd2ls
bCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCBmb3IgYSBnaXZlbiB0eXBlIGFuZAotICAg
IGBpZGAuIFRvIGNoZWNrIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaGFzIHBvcHVsYXRlZCBhIHJlY29y
ZCwgeW91IGNhbiBjaGVjawotICAgIGl0cyBgaXNMb2FkZWRgIHByb3BlcnR5LgotCi0gICAgLS0t
Ci0KLSAgICBUbyBmaW5kIGFsbCByZWNvcmRzIGZvciBhIHR5cGUsIGNhbGwgYGZpbmRgIHdpdGgg
bm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzOgotCi0gICAgICAgIHN0b3JlLmZpbmQoQXBwLlBlcnNv
bik7Ci0gICAgICAgIEFwcC5QZXJzb24uZmluZCgpOwotCi0gICAgVGhpcyB3aWxsIHJldHVybiBh
IGBSZWNvcmRBcnJheWAgcmVwcmVzZW50aW5nIGFsbCBrbm93biByZWNvcmRzIGZvciB0aGUKLSAg
ICBnaXZlbiB0eXBlIGFuZCBraWNrIG9mZiBhIHJlcXVlc3QgdG8gdGhlIGFkYXB0ZXIncyBgZmlu
ZEFsbGAgbWV0aG9kIHRvIGxvYWQKLSAgICBhbnkgYWRkaXRpb25hbCByZWNvcmRzIGZvciB0aGUg
dHlwZS4KLQotICAgIFRoZSBgUmVjb3JkQXJyYXlgIHJldHVybmVkIGJ5IGBmaW5kKClgIGlzIGxp
dmUuIElmIGFueSBtb3JlIHJlY29yZHMgZm9yIHRoZQotICAgIHR5cGUgYXJlIGFkZGVkIGF0IGEg
bGF0ZXIgdGltZSB0aHJvdWdoIGFueSBtZWNoYW5pc20sIGl0IHdpbGwgYXV0b21hdGljYWxseQot
ICAgIHVwZGF0ZSB0byByZWZsZWN0IHRoZSBjaGFuZ2UuCi0KLSAgICAtLS0KLQotICAgIFRvIGZp
bmQgYSByZWNvcmQgYnkgYSBxdWVyeSwgY2FsbCBgZmluZGAgd2l0aCBhIGhhc2ggYXMgdGhlIHNl
Y29uZAotICAgIHBhcmFtZXRlcjoKLQotICAgICAgICBzdG9yZS5maW5kKEFwcC5QZXJzb24sIHsg
cGFnZTogMSB9KTsKLSAgICAgICAgQXBwLlBlcnNvbi5maW5kKHsgcGFnZTogMSB9KTsKLQotICAg
IFRoaXMgd2lsbCByZXR1cm4gYSBgUmVjb3JkQXJyYXlgIGltbWVkaWF0ZWx5LCBidXQgaXQgd2ls
bCBhbHdheXMgYmUgYW4KLSAgICBlbXB0eSBgUmVjb3JkQXJyYXlgIGF0IGZpcnN0LiBJdCB3aWxs
IGNhbGwgdGhlIGFkYXB0ZXIncyBgZmluZFF1ZXJ5YAotICAgIG1ldGhvZCwgd2hpY2ggd2lsbCBw
b3B1bGF0ZSB0aGUgYFJlY29yZEFycmF5YCBvbmNlIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkCi0g
ICAgcmVzdWx0cy4KLQotICAgIFlvdSBjYW4gY2hlY2sgd2hldGhlciBhIHF1ZXJ5IHJlc3VsdHMg
YFJlY29yZEFycmF5YCBoYXMgbG9hZGVkIGJ5IGNoZWNraW5nCi0gICAgaXRzIGBpc0xvYWRlZGAg
cHJvcGVydHkuCi0gICovCi0gIGZpbmQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgaWYgKGlk
ID09PSB1bmRlZmluZWQpIHsKLSAgICAgIHJldHVybiB0aGlzLmZpbmRBbGwodHlwZSk7Ci0gICAg
fQotCi0gICAgLy8gV2UgYXJlIHBhc3NlZCBhIHF1ZXJ5IGluc3RlYWQgb2YgYW4gaWQuCi0gICAg
aWYgKEVtYmVyLnR5cGVPZihpZCkgPT09ICdvYmplY3QnKSB7Ci0gICAgICByZXR1cm4gdGhpcy5m
aW5kUXVlcnkodHlwZSwgaWQpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLmZpbmRCeUlkKHR5
cGUsIGNvZXJjZUlkKGlkKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRo
aXMgbWV0aG9kIHJldHVybnMgYSByZWNvcmQgZm9yIGEgZ2l2ZW4gdHlwZSBhbmQgaWQgY29tYmlu
YXRpb24uCi0KLSAgICBJZiB0aGUgc3RvcmUgaGFzIG5ldmVyIHNlZW4gdGhpcyBjb21iaW5hdGlv
biBvZiB0eXBlIGFuZCBpZCBiZWZvcmUsIGl0Ci0gICAgY3JlYXRlcyBhIG5ldyBgY2xpZW50SWRg
IHdpdGggdGhlIExPQURJTkcgc2VudGluZWwgYW5kIGFza3MgdGhlIGFkYXB0ZXIgdG8KLSAgICBs
b2FkIHRoZSBkYXRhLgotCi0gICAgSWYgdGhlIHN0b3JlIGhhcyBzZWVuIHRoZSBjb21iaW5hdGlv
biwgdGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvCi0gICAgYGdldEJ5UmVmZXJlbmNlYC4KLSAgKi8K
LSAgZmluZEJ5SWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgdmFyIGNsaWVudElkID0gdGhp
cy50eXBlTWFwRm9yKHR5cGUpLmlkVG9DaWRbaWRdOwotCi0gICAgaWYgKGNsaWVudElkKSB7Ci0g
ICAgICByZXR1cm4gdGhpcy5maW5kQnlDbGllbnRJZCh0eXBlLCBjbGllbnRJZCk7Ci0gICAgfQot
Ci0gICAgY2xpZW50SWQgPSB0aGlzLnB1c2hEYXRhKExPQURJTkcsIGlkLCB0eXBlKTsKLQotICAg
IC8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgdHlwZSBpbiB0aGUKLSAgICAv
LyAnaXNMb2FkaW5nJyBzdGF0ZQotICAgIHZhciByZWNvcmQgPSB0aGlzLm1hdGVyaWFsaXplUmVj
b3JkKHR5cGUsIGNsaWVudElkLCBpZCk7Ci0KLSAgICAvLyBsZXQgdGhlIGFkYXB0ZXIgc2V0IHRo
ZSBkYXRhLCBwb3NzaWJseSBhc3luYwotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9y
VHlwZSh0eXBlKTsKLSAgICBpZiAoYWRhcHRlciAmJiBhZGFwdGVyLmZpbmQpIHsgYWRhcHRlci5m
aW5kKHRoaXMsIHR5cGUsIGlkKTsgfQotICAgIGVsc2UgeyB0aHJvdyAiQWRhcHRlciBpcyBlaXRo
ZXIgbnVsbCBvciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRgIG1ldGhvZCI7IH0KLQotICAgIHJl
dHVybiByZWNvcmQ7Ci0gIH0sCi0KLSAgcmVsb2FkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsK
LSAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgYWRhcHRlciA9IHRo
aXMuYWRhcHRlckZvclR5cGUodHlwZSksCi0gICAgICAgIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7
Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgdXBkYXRlIGEgcmVjb3JkIHdpdGhvdXQg
YW4gSUQiLCBpZCk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gdXBkYXRlIGEgcmVj
b3JkIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIp
OwotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHVwZGF0ZSBhIHJlY29yZCBidXQgeW91
ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZGAiLCBhZGFwdGVyLmZpbmQpOwotCi0g
ICAgYWRhcHRlci5maW5kKHRoaXMsIHR5cGUsIGlkKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJp
dmF0ZQotCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIHJlY29yZCBmb3IgYSBnaXZlbiBjbGll
bnRJZC4KLQotICAgIElmIHRoZXJlIGlzIG5vIHJlY29yZCBvYmplY3QgeWV0IGZvciB0aGUgY2xp
ZW50SWQsIHRoaXMgbWV0aG9kIG1hdGVyaWFsaXplcwotICAgIGEgbmV3IHJlY29yZCBvYmplY3Qu
IFRoaXMgYWxsb3dzIGFkYXB0ZXJzIHRvIGVhZ2VybHkgbG9hZCBsYXJnZSBhbW91bnRzIG9mCi0g
ICAgZGF0YSBpbnRvIHRoZSBzdG9yZSwgYW5kIGF2b2lkIGluY3VycmluZyB0aGUgY29zdCB0byBj
cmVhdGUgdGhlIG9iamVjdHMKLSAgICB1bnRpbCB0aGV5IGFyZSByZXF1ZXN0ZWQuCi0KLSAgICBT
ZXZlcmFsIHBhcnRzIG9mIEVtYmVyIERhdGEgY2FsbCB0aGlzIG1ldGhvZDoKLQotICAgICogZmlu
ZEJ5SWQsIGlmIGEgY2xpZW50SWQgYWxyZWFkeSBleGlzdHMgZm9yIGEgZ2l2ZW4gdHlwZSBhbmQK
LSAgICAgIGlkIGNvbWJpbmF0aW9uCi0gICAgKiBPbmVUb01hbnlDaGFuZ2UsIHdoaWNoIGlzIGJh
Y2tlZCBieSBjbGllbnRJZHMsIHdoZW4gZ2V0Q2hpbGQsCi0gICAgICBnZXRPbGRQYXJlbnQgb3Ig
Z2V0TmV3UGFyZW50IGFyZSBjYWxsZWQKLSAgICAqIFJlY29yZEFycmF5LCB3aGljaCBpcyBiYWNr
ZWQgYnkgY2xpZW50SWRzLCB3aGVuIGFuIG9iamVjdCBhdAotICAgICAgYSBwYXJ0aWN1bGFyIGlu
ZGV4IGlzIGxvb2tlZCB1cAotCi0gICAgSW4gc2hvcnQsIGl0J3MgYSBjb252ZW5pZW50IHdheSB0
byBnZXQgYSByZWNvcmQgZm9yIGEga25vd24KLSAgICBjbGllbnRJZCwgbWF0ZXJpYWxpemluZyBp
dCBpZiBuZWNlc3NhcnkuCi0KLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCi0gICAgQHBhcmFtIHtO
dW1iZXJ8U3RyaW5nfSBjbGllbnRJZAotICAqLwotICBmaW5kQnlDbGllbnRJZDogZnVuY3Rpb24o
dHlwZSwgY2xpZW50SWQpIHsKLSAgICB2YXIgY2lkVG9EYXRhLCByZWNvcmQsIGlkOwotCi0gICAg
cmVjb3JkID0gdGhpcy5yZWNvcmRDYWNoZVtjbGllbnRJZF07Ci0KLSAgICBpZiAoIXJlY29yZCkg
ewotICAgICAgLy8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2RlbCB0eXBlIGluIHRo
ZQotICAgICAgLy8gJ2lzTG9hZGluZycgc3RhdGUKLSAgICAgIGlkID0gdGhpcy5jbGllbnRJZFRv
SWRbY2xpZW50SWRdOwotICAgICAgcmVjb3JkID0gdGhpcy5tYXRlcmlhbGl6ZVJlY29yZCh0eXBl
LCBjbGllbnRJZCwgaWQpOwotCi0gICAgICBjaWRUb0RhdGEgPSB0aGlzLmNsaWVudElkVG9EYXRh
OwotCi0gICAgICBpZiAodHlwZW9mIGNpZFRvRGF0YVtjbGllbnRJZF0gPT09ICdvYmplY3QnKSB7
Ci0gICAgICAgIHJlY29yZC5sb2FkZWREYXRhKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0
dXJuIHJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgR2l2ZW4gYSB0
eXBlIGFuZCBhcnJheSBvZiBgY2xpZW50SWRgcywgZGV0ZXJtaW5lcyB3aGljaCBvZiB0aG9zZQot
ICAgIGBjbGllbnRJZGBzIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLgotCi0gICAgSW4gcHJlcGFy
YXRpb24gZm9yIGxvYWRpbmcsIHRoaXMgbWV0aG9kIGFsc28gbWFya3MgYW55IHVubG9hZGVkCi0g
ICAgYGNsaWVudElkYHMgYXMgbG9hZGluZy4KLSAgKi8KLSAgbmVlZGVkUmVmZXJlbmNlczogZnVu
Y3Rpb24odHlwZSwgcmVmZXJlbmNlcykgewotICAgIHZhciBuZWVkZWRSZWZlcmVuY2VzID0gW10s
Ci0gICAgICAgIGNpZFRvRGF0YSA9IHRoaXMuY2xpZW50SWRUb0RhdGEsCi0gICAgICAgIHJlZmVy
ZW5jZTsKLQotICAgIGZvciAodmFyIGk9MCwgbD1yZWZlcmVuY2VzLmxlbmd0aDsgaTxsOyBpKysp
IHsKLSAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV07Ci0KLSAgICAgIGlmIChjaWRUb0Rh
dGFbcmVmZXJlbmNlLmNsaWVudElkXSA9PT0gVU5MT0FERUQpIHsKLSAgICAgICAgbmVlZGVkUmVm
ZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7Ci0gICAgICAgIGNpZFRvRGF0YVtyZWZlcmVuY2UuY2xp
ZW50SWRdID0gTE9BRElORzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmVlZGVkUmVm
ZXJlbmNlczsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgVGhpcyBtZXRob2Qg
aXMgdGhlIGVudHJ5IHBvaW50IHRoYXQgcmVsYXRpb25zaGlwcyB1c2UgdG8gdXBkYXRlCi0gICAg
dGhlbXNlbHZlcyB3aGVuIHRoZWlyIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzLgotCi0gICAgRmly
c3QsIGl0IGRldGVybWluZXMgd2hpY2ggb2YgaXRzIGBjbGllbnRJZGBzIGFyZSBzdGlsbCB1bmxv
YWRlZCwKLSAgICB0aGVuIGNvbnZlcnRzIHRoZSBuZWVkZWQgYGNsaWVudElkYHMgdG8gSURzIGFu
ZCBpbnZva2VzIGBmaW5kTWFueWAKLSAgICBvbiB0aGUgYWRhcHRlci4KLSAgKi8KLSAgZmV0Y2hV
bmxvYWRlZFJlZmVyZW5jZXM6IGZ1bmN0aW9uKHR5cGUsIHJlZmVyZW5jZXMsIG93bmVyKSB7Ci0g
ICAgdmFyIG5lZWRlZFJlZmVyZW5jZXMgPSB0aGlzLm5lZWRlZFJlZmVyZW5jZXModHlwZSwgcmVm
ZXJlbmNlcyk7Ci0gICAgdGhpcy5mZXRjaE1hbnkodHlwZSwgbmVlZGVkUmVmZXJlbmNlcywgb3du
ZXIpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBUaGlzIG1ldGhvZCB0YWtl
cyBhIHR5cGUgYW5kIGxpc3Qgb2YgYGNsaWVudElkYHMsIGNvbnZlcnRzIHRoZQotICAgIGBjbGll
bnRJZGBzIGludG8gSURzLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBhZGFwdGVyJ3MgYGZpbmRNYW55
YAotICAgIG1ldGhvZC4KLQotICAgIEl0IGlzIHVzZWQgYm90aCBieSBhIGJyYW5kIG5ldyByZWxh
dGlvbnNoaXAgKHZpYSB0aGUgYGZpbmRNYW55YAotICAgIG1ldGhvZCkgb3Igd2hlbiB0aGUgZGF0
YSB1bmRlcmx5aW5nIGFuIGV4aXN0aW5nIHJlbGF0aW9uc2hpcAotICAgIGNoYW5nZXMgKHZpYSB0
aGUgYGZldGNoVW5sb2FkZWRSZWZlcmVuY2VzYCBtZXRob2QpLgotICAqLwotICBmZXRjaE1hbnk6
IGZ1bmN0aW9uKHR5cGUsIHJlZmVyZW5jZXMsIG93bmVyKSB7Ci0gICAgaWYgKCFyZWZlcmVuY2Vz
Lmxlbmd0aCkgeyByZXR1cm47IH0KLQotICAgIHZhciBpZHMgPSBtYXAocmVmZXJlbmNlcywgZnVu
Y3Rpb24ocmVmZXJlbmNlKSB7Ci0gICAgICByZXR1cm4gcmVmZXJlbmNlLmlkOwotICAgIH0pOwot
Ci0gICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHR5cGUpOwotICAgIGlmIChh
ZGFwdGVyICYmIGFkYXB0ZXIuZmluZE1hbnkpIHsgYWRhcHRlci5maW5kTWFueSh0aGlzLCB0eXBl
LCBpZHMsIG93bmVyKTsgfQotICAgIGVsc2UgeyB0aHJvdyAiQWRhcHRlciBpcyBlaXRoZXIgbnVs
bCBvciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRNYW55YCBtZXRob2QiOyB9Ci0gIH0sCi0KLSAg
cmVmZXJlbmNlRm9ySWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgdmFyIGNsaWVudElkID0g
dGhpcy5jbGllbnRJZEZvcklkKHR5cGUsIGlkKTsKLSAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VG
b3JDbGllbnRJZChjbGllbnRJZCk7Ci0gIH0sCi0KLSAgcmVmZXJlbmNlRm9yQ2xpZW50SWQ6IGZ1
bmN0aW9uKGNsaWVudElkKSB7Ci0gICAgdmFyIHJlZmVyZW5jZXMgPSB0aGlzLnJlY29yZFJlZmVy
ZW5jZXM7Ci0KLSAgICBpZiAocmVmZXJlbmNlc1tjbGllbnRJZF0pIHsKLSAgICAgIHJldHVybiBy
ZWZlcmVuY2VzW2NsaWVudElkXTsKLSAgICB9Ci0KLSAgICB2YXIgdHlwZSA9IHRoaXMuY2xpZW50
SWRUb1R5cGVbY2xpZW50SWRdOwotCi0gICAgcmV0dXJuIHJlZmVyZW5jZXNbY2xpZW50SWRdID0g
ewotICAgICAgaWQ6IHRoaXMuaWRGb3JDbGllbnRJZChjbGllbnRJZCksCi0gICAgICBjbGllbnRJ
ZDogY2xpZW50SWQsCi0gICAgICB0eXBlOiB0eXBlCi0gICAgfTsKLSAgfSwKLQotICByZWNvcmRG
b3JSZWZlcmVuY2U6IGZ1bmN0aW9uKHJlZmVyZW5jZSkgewotICAgIHJldHVybiB0aGlzLmZpbmRC
eUNsaWVudElkKHJlZmVyZW5jZS50eXBlLCByZWZlcmVuY2UuY2xpZW50SWQpOwotICB9LAotCi0g
IC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBgZmluZE1hbnlgIGlzIHRoZSBlbnRyeSBwb2ludCB0
aGF0IHJlbGF0aW9uc2hpcHMgdXNlIHRvIGdlbmVyYXRlIGEKLSAgICBuZXcgYE1hbnlBcnJheWAg
Zm9yIHRoZSBsaXN0IG9mIElEcyBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlciBmb3IKLSAgICB0aGUg
cmVsYXRpb25zaGlwLgotCi0gICAgSXRzIHJlc3BvbnNpYmlsaXRpZXMgYXJlOgotCi0gICAgKiBj
b252ZXJ0IHRoZSBJRHMgaW50byBjbGllbnRJZHMKLSAgICAqIGRldGVybWluZSB3aGljaCBvZiB0
aGUgY2xpZW50SWRzIHN0aWxsIG5lZWQgdG8gYmUgbG9hZGVkCi0gICAgKiBjcmVhdGUgYSBuZXcg
TWFueUFycmF5IHdob3NlIGNvbnRlbnQgaXMgKmFsbCogb2YgdGhlIGNsaWVudElkcwotICAgICog
bm90aWZ5IHRoZSBNYW55QXJyYXkgb2YgdGhlIG51bWJlciBvZiBpdHMgZWxlbWVudHMgdGhhdCBh
cmUKLSAgICAgIGFscmVhZHkgbG9hZGVkCi0gICAgKiBpbnNlcnQgdGhlIHVubG9hZGVkIGNsaWVu
dElkcyBpbnRvIHRoZSBgbG9hZGluZ1JlY29yZEFycmF5c2AKLSAgICAgIGJvb2trZWVwaW5nIHN0
cnVjdHVyZSwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgYE1hbnlBcnJheWAgdG8ga25vdwotICAgICAg
d2hlbiBhbGwgb2YgaXRzIGxvYWRpbmcgZWxlbWVudHMgYXJlIGxvYWRlZCBmcm9tIHRoZSBzZXJ2
ZXIuCi0gICAgKiBhc2sgdGhlIGFkYXB0ZXIgdG8gbG9hZCB0aGUgdW5sb2FkZWQgZWxlbWVudHMs
IGJ5IGludm9raW5nCi0gICAgICBmaW5kTWFueSB3aXRoIHRoZSBzdGlsbC11bmxvYWRlZCBJRHMu
Ci0gICovCi0gIGZpbmRNYW55OiBmdW5jdGlvbih0eXBlLCBpZHMsIHJlY29yZCwgcmVsYXRpb25z
aGlwKSB7Ci0gICAgLy8gMS4gQ29udmVydCBpZHMgdG8gY2xpZW50IGlkcwotICAgIC8vIDIuIERl
dGVybWluZSB3aGljaCBvZiB0aGUgY2xpZW50IGlkcyBuZWVkIHRvIGJlIGxvYWRlZAotICAgIC8v
IDMuIENyZWF0ZSBhIG5ldyBNYW55QXJyYXkgd2hvc2UgY29udGVudCBpcyBBTEwgb2YgdGhlIGNs
aWVudElkcwotICAgIC8vIDQuIERlY3JlbWVudCB0aGUgTWFueUFycmF5J3MgY291bnRlciBieSB0
aGUgbnVtYmVyIG9mIGxvYWRlZCBjbGllbnRJZHMKLSAgICAvLyA1LiBQdXQgdGhlIE1hbnlBcnJh
eSBpbnRvIG91ciBib29ra2VlcGluZyBkYXRhIHN0cnVjdHVyZSwga2V5ZWQgb24KLSAgICAvLyAg
ICB0aGUgbmVlZGVkIGNsaWVudElkcwotICAgIC8vIDYuIEFzayB0aGUgYWRhcHRlciB0byBsb2Fk
IHRoZSByZWNvcmRzIGZvciB0aGUgdW5sb2FkZWQgY2xpZW50SWRzIChidXQKLSAgICAvLyAgICBj
b252ZXJ0IHRoZW0gYmFjayB0byBpZHMpCi0KLSAgICBpZiAoIUVtYmVyLmlzQXJyYXkoaWRzKSkg
ewotICAgICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHR5cGUpOwotICAgICAg
aWYgKGFkYXB0ZXIgJiYgYWRhcHRlci5maW5kSGFzTWFueSkgeyBhZGFwdGVyLmZpbmRIYXNNYW55
KHRoaXMsIHJlY29yZCwgcmVsYXRpb25zaGlwLCBpZHMpOyB9Ci0gICAgICBlbHNlIHsgdGhyb3cg
Zm10KCJBZGFwdGVyIGlzIGVpdGhlciBudWxsIG9yIGRvZXMgbm90IGltcGxlbWVudCBgZmluZEhh
c01hbnlgIG1ldGhvZCIsIHRoaXMpOyB9Ci0KLSAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU1hbnlB
cnJheSh0eXBlLCBFbWJlci5BKCkpOwotICAgIH0KLQotICAgIC8vIENvZXJjZSBzZXJ2ZXIgSURz
IGludG8gUmVjb3JkIFJlZmVyZW5jZQotICAgIHZhciByZWZlcmVuY2VzID0gbWFwKGlkcywgZnVu
Y3Rpb24ocmVmZXJlbmNlKSB7Ci0gICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZSAhPT0gJ29iamVj
dCcgJiYgcmVmZXJlbmNlICE9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5j
ZUZvcklkKHR5cGUsIHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZWZlcmVu
Y2U7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB2YXIgbmVlZGVkUmVmZXJlbmNlcyA9IHRoaXMubmVl
ZGVkUmVmZXJlbmNlcyh0eXBlLCByZWZlcmVuY2VzKSwKLSAgICAgICAgbWFueUFycmF5ID0gdGhp
cy5jcmVhdGVNYW55QXJyYXkodHlwZSwgRW1iZXIuQShyZWZlcmVuY2VzKSksCi0gICAgICAgIGxv
YWRpbmdSZWNvcmRBcnJheXMgPSB0aGlzLmxvYWRpbmdSZWNvcmRBcnJheXMsCi0gICAgICAgIHJl
ZmVyZW5jZSwgY2xpZW50SWQsIGksIGw7Ci0KLSAgICAvLyBTdGFydCB0aGUgZGVjcmVtZW50aW5n
IGNvdW50ZXIgb24gdGhlIE1hbnlBcnJheSBhdCB0aGUgbnVtYmVyIG9mCi0gICAgLy8gcmVjb3Jk
cyB3ZSBuZWVkIHRvIGxvYWQgZnJvbSB0aGUgYWRhcHRlcgotICAgIG1hbnlBcnJheS5sb2FkaW5n
UmVjb3Jkc0NvdW50KG5lZWRlZFJlZmVyZW5jZXMubGVuZ3RoKTsKLQotICAgIGlmIChuZWVkZWRS
ZWZlcmVuY2VzLmxlbmd0aCkgewotICAgICAgZm9yIChpPTAsIGw9bmVlZGVkUmVmZXJlbmNlcy5s
ZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHJlZmVyZW5jZSA9IG5lZWRlZFJlZmVyZW5jZXNb
aV07Ci0gICAgICAgIGNsaWVudElkID0gcmVmZXJlbmNlLmNsaWVudElkOwotCi0gICAgICAgIC8v
IGtlZXAgdHJhY2sgb2YgdGhlIHJlY29yZCBhcnJheXMgdGhhdCBhIGdpdmVuIGxvYWRpbmcgcmVj
b3JkCi0gICAgICAgIC8vIGlzIHBhcnQgb2YuIFRoaXMgd2F5LCBpZiB0aGUgc2FtZSByZWNvcmQg
aXMgaW4gbXVsdGlwbGUKLSAgICAgICAgLy8gTWFueUFycmF5cywgYWxsIG9mIHRoZWlyIGxvYWRp
bmcgcmVjb3JkcyBjb3VudGVycyB3aWxsIGJlCi0gICAgICAgIC8vIGRlY3JlbWVudGVkIHdoZW4g
dGhlIGFkYXB0ZXIgcHJvdmlkZXMgdGhlIGRhdGEuCi0gICAgICAgIGlmIChsb2FkaW5nUmVjb3Jk
QXJyYXlzW2NsaWVudElkXSkgewotICAgICAgICAgIGxvYWRpbmdSZWNvcmRBcnJheXNbY2xpZW50
SWRdLnB1c2gobWFueUFycmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aGlzLmxv
YWRpbmdSZWNvcmRBcnJheXNbY2xpZW50SWRdID0gWyBtYW55QXJyYXkgXTsKLSAgICAgICAgfQot
ICAgICAgfQotCi0gICAgICB0aGlzLmZldGNoTWFueSh0eXBlLCBuZWVkZWRSZWZlcmVuY2VzLCBy
ZWNvcmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBhbGwgcmVxdWVzdGVkIHJlY29yZHMgYXJl
IGF2YWlsYWJsZQotICAgICAgbWFueUFycmF5LnNldCgnaXNMb2FkZWQnLCB0cnVlKTsKLQotICAg
ICAgRW1iZXIucnVuLm9uY2UoZnVuY3Rpb24oKSB7Ci0gICAgICAgIG1hbnlBcnJheS50cmlnZ2Vy
KCdkaWRMb2FkJyk7Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWFueUFycmF5Owot
ICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMg
YSBxdWVyeSB0byB0aGUgYWRhcHRlci4gVGhpcyBpcyB0aGUgb25lIHBsYWNlIHdoZXJlCi0gICAg
YWRhcHRlci1sZXZlbCBzZW1hbnRpY3MgYXJlIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgot
Ci0gICAgRXhwb3NpbmcgcXVlcmllcyB0aGlzIHdheSBzZWVtcyBwcmVmZXJhYmxlIHRvIGNyZWF0
aW5nIGFuIGFic3RyYWN0IHF1ZXJ5Ci0gICAgbGFuZ3VhZ2UgZm9yIGFsbCBzZXJ2ZXItc2lkZSBx
dWVyaWVzLCBhbmQgdGhlbiByZXF1aXJlIGFsbCBhZGFwdGVycyB0bwotICAgIGltcGxlbWVudCB0
aGVtLgotCi0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBxdWVy
eSBhbiBvcGFxdWUgcXVlcnkgdG8gYmUgdXNlZCBieSB0aGUgYWRhcHRlcgotICAgIEByZXR1cm4g
e0RTLkFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheX0KLSAgKi8KLSAgZmluZFF1ZXJ5OiBmdW5j
dGlvbih0eXBlLCBxdWVyeSkgewotICAgIHZhciBhcnJheSA9IERTLkFkYXB0ZXJQb3B1bGF0ZWRS
ZWNvcmRBcnJheS5jcmVhdGUoeyB0eXBlOiB0eXBlLCBxdWVyeTogcXVlcnksIGNvbnRlbnQ6IEVt
YmVyLkEoW10pLCBzdG9yZTogdGhpcyB9KTsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRl
ckZvclR5cGUodHlwZSk7Ci0gICAgaWYgKGFkYXB0ZXIgJiYgYWRhcHRlci5maW5kUXVlcnkpIHsg
YWRhcHRlci5maW5kUXVlcnkodGhpcywgdHlwZSwgcXVlcnksIGFycmF5KTsgfQotICAgIGVsc2Ug
eyB0aHJvdyAiQWRhcHRlciBpcyBlaXRoZXIgbnVsbCBvciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZp
bmRRdWVyeWAgbWV0aG9kIjsgfQotICAgIHJldHVybiBhcnJheTsKLSAgfSwKLQotICAvKioKLSAg
ICBAcHJpdmF0ZQotCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVj
b3JkcyBhZGFwdGVyIGNhbiBmaW5kLgotICAgIEl0IHRyaWdnZXJzIHRoZSBhZGFwdGVyJ3MgYGZp
bmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFuIG9wcG9ydHVuaXR5IHRvIHBvcHVsYXRlCi0gICAg
dGhlIGFycmF5IHdpdGggcmVjb3JkcyBvZiB0aGF0IHR5cGUuCi0KLSAgICBAcGFyYW0ge0NsYXNz
fSB0eXBlCi0gICAgQHJldHVybiB7RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5fQotICAq
LwotICBmaW5kQWxsOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGFycmF5ID0gdGhpcy5hbGwo
dHlwZSk7Ci0gICAgdGhpcy5mZXRjaEFsbCh0eXBlLCBhcnJheSk7Ci0gICAgcmV0dXJuIGFycmF5
OwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0gICovCi0gIGZldGNoQWxsOiBmdW5jdGlv
bih0eXBlLCBhcnJheSkgewotICAgIHZhciBzaW5jZVRva2VuID0gdGhpcy50eXBlTWFwRm9yKHR5
cGUpLnNpbmNlVG9rZW4sCi0gICAgICAgIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3JUeXBlKHR5
cGUpOwotCi0gICAgc2V0KGFycmF5LCAnaXNVcGRhdGluZycsIHRydWUpOwotCi0gICAgaWYgKGFk
YXB0ZXIgJiYgYWRhcHRlci5maW5kQWxsKSB7IGFkYXB0ZXIuZmluZEFsbCh0aGlzLCB0eXBlLCBz
aW5jZVRva2VuKTsgfQotICAgIGVsc2UgeyB0aHJvdyAiQWRhcHRlciBpcyBlaXRoZXIgbnVsbCBv
ciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRBbGxgIG1ldGhvZCI7IH0KLSAgfSwKLQotICAvKioK
LSAgKi8KLSAgc2luY2VGb3JUeXBlOiBmdW5jdGlvbih0eXBlLCBzaW5jZVRva2VuKSB7Ci0gICAg
dGhpcy50eXBlTWFwRm9yKHR5cGUpLnNpbmNlVG9rZW4gPSBzaW5jZVRva2VuOwotICB9LAotCi0g
IC8qKgotICAqLwotICBkaWRVcGRhdGVBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB2YXIgZmlu
ZEFsbENhY2hlID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLmZpbmRBbGxDYWNoZTsKLSAgICBzZXQo
ZmluZEFsbENhY2hlLCAnaXNVcGRhdGluZycsIGZhbHNlKTsKLSAgfSwKLQotICAvKioKLSAgICBU
aGlzIG1ldGhvZCByZXR1cm5zIGEgZmlsdGVyZWQgYXJyYXkgdGhhdCBjb250YWlucyBhbGwgb2Yg
dGhlIGtub3duIHJlY29yZHMKLSAgICBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAgTm90ZSB0aGF0
IGJlY2F1c2UgaXQncyBqdXN0IGEgZmlsdGVyLCBpdCB3aWxsIGhhdmUgYW55IGxvY2FsbHkKLSAg
ICBjcmVhdGVkIHJlY29yZHMgb2YgdGhlIHR5cGUuCi0KLSAgICBBbHNvIG5vdGUgdGhhdCBtdWx0
aXBsZSBjYWxscyB0byBgYWxsYCBmb3IgYSBnaXZlbiB0eXBlIHdpbGwgYWx3YXlzCi0gICAgcmV0
dXJuIHRoZSBzYW1lIFJlY29yZEFycmF5LgotCi0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAg
IEByZXR1cm4ge0RTLlJlY29yZEFycmF5fQotICAqLwotICBhbGw6IGZ1bmN0aW9uKHR5cGUpIHsK
LSAgICB2YXIgdHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKLSAgICAgICAgZmluZEFs
bENhY2hlID0gdHlwZU1hcC5maW5kQWxsQ2FjaGU7Ci0KLSAgICBpZiAoZmluZEFsbENhY2hlKSB7
IHJldHVybiBmaW5kQWxsQ2FjaGU7IH0KLQotICAgIHZhciBhcnJheSA9IERTLlJlY29yZEFycmF5
LmNyZWF0ZSh7IHR5cGU6IHR5cGUsIGNvbnRlbnQ6IEVtYmVyLkEoW10pLCBzdG9yZTogdGhpcywg
aXNMb2FkZWQ6IHRydWUgfSk7Ci0gICAgdGhpcy5yZWdpc3RlclJlY29yZEFycmF5KGFycmF5LCB0
eXBlKTsKLQotICAgIHR5cGVNYXAuZmluZEFsbENhY2hlID0gYXJyYXk7Ci0gICAgcmV0dXJuIGFy
cmF5OwotICB9LAotCi0gIC8qKgotICAgIFRha2VzIGEgdHlwZSBhbmQgZmlsdGVyIGZ1bmN0aW9u
LCBhbmQgcmV0dXJucyBhIGxpdmUgUmVjb3JkQXJyYXkgdGhhdAotICAgIHJlbWFpbnMgdXAgdG8g
ZGF0ZSBhcyBuZXcgcmVjb3JkcyBhcmUgbG9hZGVkIGludG8gdGhlIHN0b3JlIG9yIGNyZWF0ZWQK
LSAgICBsb2NhbGx5LgotCi0gICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRha2VzIGEgbWF0ZXJp
YWxpemVkIHJlY29yZCwgYW5kIHJldHVybnMgdHJ1ZQotICAgIGlmIHRoZSByZWNvcmQgc2hvdWxk
IGJlIGluY2x1ZGVkIGluIHRoZSBmaWx0ZXIgYW5kIGZhbHNlIGlmIGl0IHNob3VsZAotICAgIG5v
dC4KLQotICAgIFRoZSBmaWx0ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2Ugb24gYWxsIHJlY29y
ZHMgZm9yIHRoZSB0eXBlIHdoZW4KLSAgICBpdCBpcyBjcmVhdGVkLCBhbmQgdGhlbiBvbmNlIG9u
IGVhY2ggbmV3bHkgbG9hZGVkIG9yIGNyZWF0ZWQgcmVjb3JkLgotCi0gICAgSWYgYW55IG9mIGEg
cmVjb3JkJ3MgcHJvcGVydGllcyBjaGFuZ2UsIG9yIGlmIGl0IGNoYW5nZXMgc3RhdGUsIHRoZQot
ICAgIGZpbHRlciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYWdhaW4gdG8gZGV0ZXJtaW5lIHdo
ZXRoZXIgaXQgc2hvdWxkCi0gICAgc3RpbGwgYmUgaW4gdGhlIGFycmF5LgotCi0gICAgTm90ZSB0
aGF0IHRoZSBleGlzdGVuY2Ugb2YgYSBmaWx0ZXIgb24gYSB0eXBlIHdpbGwgdHJpZ2dlciBpbW1l
ZGlhdGUKLSAgICBtYXRlcmlhbGl6YXRpb24gb2YgYWxsIGxvYWRlZCBkYXRhIGZvciBhIGdpdmVu
IHR5cGUsIHNvIHlvdSBtaWdodAotICAgIG5vdCB3YW50IHRvIHVzZSBmaWx0ZXJzIGZvciBhIHR5
cGUgaWYgeW91IGFyZSBsb2FkaW5nIG1hbnkgcmVjb3JkcwotICAgIGludG8gdGhlIHN0b3JlLCBt
YW55IG9mIHdoaWNoIGFyZSBub3QgYWN0aXZlIGF0IGFueSBnaXZlbiB0aW1lLgotCi0gICAgSW4g
dGhpcyBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgZmlsdGVyaW5nIHRoZSBy
YXcKLSAgICBkYXRhIGJlZm9yZSBsb2FkaW5nIGl0IGludG8gdGhlIHN0b3JlLgotCi0gICAgQHBh
cmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgotCi0gICAgQHJl
dHVybiB7RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0KLSAgKi8KLSAgZmlsdGVyOiBmdW5jdGlvbih0
eXBlLCBxdWVyeSwgZmlsdGVyKSB7Ci0gICAgLy8gYWxsb3cgYW4gb3B0aW9uYWwgc2VydmVyIHF1
ZXJ5Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHsKLSAgICAgIHRoaXMuZmluZFF1
ZXJ5KHR5cGUsIHF1ZXJ5KTsKLSAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIp
IHsKLSAgICAgIGZpbHRlciA9IHF1ZXJ5OwotICAgIH0KLQotICAgIHZhciBhcnJheSA9IERTLkZp
bHRlcmVkUmVjb3JkQXJyYXkuY3JlYXRlKHsgdHlwZTogdHlwZSwgY29udGVudDogRW1iZXIuQShb
XSksIHN0b3JlOiB0aGlzLCBmaWx0ZXJGdW5jdGlvbjogZmlsdGVyIH0pOwotCi0gICAgdGhpcy5y
ZWdpc3RlclJlY29yZEFycmF5KGFycmF5LCB0eXBlLCBmaWx0ZXIpOwotCi0gICAgcmV0dXJuIGFy
cmF5OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgYSBjZXJ0YWlu
IHJlY29yZCBpcyBhbHJlYWR5IGxvYWRlZAotICAgIGluIHRoZSBzdG9yZS4gVXNlIHRoaXMgZnVu
Y3Rpb24gdG8ga25vdyBiZWZvcmVoYW5kIGlmIGEgZmluZCgpCi0gICAgd2lsbCByZXN1bHQgaW4g
YSByZXF1ZXN0IG9yIHRoYXQgaXQgd2lsbCBiZSBhIGNhY2hlIGhpdC4KLQotICAgIEBwYXJhbSB7
Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge3N0cmluZ30gaWQKLSAgICBAcmV0dXJuIHtib29sZWFu
fQotICAqLwotICByZWNvcmRJc0xvYWRlZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICByZXR1
cm4gIUVtYmVyLmlzTm9uZSh0aGlzLnR5cGVNYXBGb3IodHlwZSkuaWRUb0NpZFtpZF0pOwotICB9
LAotCi0gIC8vIC4uLi4uLi4uLi4uLgotICAvLyAuIFVQREFUSU5HIC4KLSAgLy8gLi4uLi4uLi4u
Li4uCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIElmIHRoZSBhZGFwdGVyIHVwZGF0ZXMg
YXR0cmlidXRlcyBvciBhY2tub3dsZWRnZXMgY3JlYXRpb24KLSAgICBvciBkZWxldGlvbiwgdGhl
IHJlY29yZCB3aWxsIG5vdGlmeSB0aGUgc3RvcmUgdG8gdXBkYXRlIGl0cwotICAgIG1lbWJlcnNo
aXAgaW4gYW55IGZpbHRlcnMuCi0KLSAgICBUbyBhdm9pZCB0aHJhc2hpbmcsIHRoaXMgbWV0aG9k
IGlzIGludm9rZWQgb25seSBvbmNlIHBlcgotICAgIHJ1biBsb29wIHBlciByZWNvcmQuCi0KLSAg
ICBAcGFyYW0ge0NsYXNzfSB0eXBlCi0gICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJ
ZAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBkYXRhV2FzVXBkYXRlZDog
ZnVuY3Rpb24odHlwZSwgcmVmZXJlbmNlLCByZWNvcmQpIHsKLSAgICAvLyBCZWNhdXNlIGRhdGEg
dXBkYXRlcyBhcmUgaW52b2tlZCBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcCwKLSAgICAvLyBp
dCBpcyBwb3NzaWJsZSB0aGF0IGEgcmVjb3JkIG1pZ2h0IGJlIGRlbGV0ZWQgYWZ0ZXIgaXRzIGRh
dGEKLSAgICAvLyBoYXMgYmVlbiBtb2RpZmllZCBhbmQgdGhpcyBtZXRob2Qgd2FzIHNjaGVkdWxl
ZCB0byBiZSBjYWxsZWQuCi0gICAgLy8KLSAgICAvLyBJZiB0aGF0J3MgdGhlIGNhc2UsIHRoZSBy
ZWNvcmQgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZAotICAgIC8vIGZyb20gYWxsIHJl
Y29yZCBhcnJheXM7IGNhbGxpbmcgdXBkYXRlUmVjb3JkQXJyYXlzIHdvdWxkIGp1c3QKLSAgICAv
LyBhZGQgaXQgYmFjay4gSWYgdGhlIHJlY29yZCBpcyBkZWxldGVkLCBqdXN0IGJhaWwuIEl0IHNo
b3VsZG4ndAotICAgIC8vIGdpdmUgdXMgYW55IG1vcmUgdHJvdWJsZSBhZnRlciB0aGlzLgotCi0g
ICAgaWYgKGdldChyZWNvcmQsICdpc0RlbGV0ZWQnKSkgeyByZXR1cm47IH0KLQotICAgIHZhciBj
aWRUb0RhdGEgPSB0aGlzLmNsaWVudElkVG9EYXRhLAotICAgICAgICBjbGllbnRJZCA9IHJlZmVy
ZW5jZS5jbGllbnRJZCwKLSAgICAgICAgZGF0YSA9IGNpZFRvRGF0YVtjbGllbnRJZF07Ci0KLSAg
ICBpZiAodHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7Ci0gICAgICB0aGlzLnVwZGF0ZVJlY29y
ZEFycmF5cyh0eXBlLCBjbGllbnRJZCk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4u
Li4uCi0gIC8vIC4gUEVSU0lTVElORyAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0g
ICAgVGhpcyBtZXRob2QgZGVsZWdhdGVzIGNvbW1pdHRpbmcgdG8gdGhlIHN0b3JlJ3MgaW1wbGlj
aXQKLSAgICB0cmFuc2FjdGlvbi4KLQotICAgIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXNzZW50
aWFsbHkgYSByZXF1ZXN0IHRvIHBlcnNpc3QKLSAgICBhbnkgY2hhbmdlcyB0byByZWNvcmRzIHRo
YXQgd2VyZSBub3QgZXhwbGljaXRseSBhZGRlZCB0bwotICAgIGEgdHJhbnNhY3Rpb24uCi0gICov
Ci0gIGNvbW1pdDogZnVuY3Rpb24oKSB7Ci0gICAgZ2V0KHRoaXMsICdkZWZhdWx0VHJhbnNhY3Rp
b24nKS5jb21taXQoKTsKLSAgfSwKLQotICAvKioKLSAgICBBZGFwdGVycyBzaG91bGQgY2FsbCB0
aGlzIG1ldGhvZCBpZiB0aGV5IHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UKLSAgICB0aGF0IGFs
bCBjaGFuZ2VzIHJlbGF0ZWQgdG8gYSByZWNvcmQgKG90aGVyIHRoYW4gcmVsYXRpb25zaGlwCi0g
ICAgY2hhbmdlcykgaGF2ZSBwZXJzaXN0ZWQuCi0KLSAgICBCZWNhdXNlIHJlbGF0aW9uc2hpcCBj
aGFuZ2VzIGFmZmVjdCBtdWx0aXBsZSByZWNvcmRzLCB0aGUgYWRhcHRlcgotICAgIGlzIHJlc3Bv
bnNpYmxlIGZvciBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgdG8gdGhlIHJlbGF0aW9uc2hpcAot
ICAgIGRpcmVjdGx5ICh1c2luZyBgc3RvcmUuZGlkVXBkYXRlUmVsYXRpb25zaGlwYCkgd2hlbiBh
bGwgYXNwZWN0cwotICAgIG9mIHRoZSByZWxhdGlvbnNoaXAgY2hhbmdlIGhhdmUgcGVyc2lzdGVk
LgotCi0gICAgSXQgY2FuIGJlIGNhbGxlZCBmb3IgY3JlYXRlZCwgZGVsZXRlZCBvciB1cGRhdGVk
IHJlY29yZHMuCi0KLSAgICBJZiB0aGUgYWRhcHRlciBzdXBwbGllcyBuZXcgZGF0YSwgdGhhdCBk
YXRhIHdpbGwgYmVjb21lIHRoZSBuZXcKLSAgICBjYW5vbmljYWwgZGF0YSBmb3IgdGhlIHJlY29y
ZC4gVGhhdCB3aWxsIHJlc3VsdCBpbiBibG93aW5nIGF3YXkKLSAgICBhbGwgbG9jYWwgY2hhbmdl
cyBhbmQgcmVtYXRlcmlhbGl6aW5nIHRoZSByZWNvcmQgd2l0aCB0aGUgbmV3Ci0gICAgZGF0YSAo
dGhlICJzbGVkZ2VoYW1tZXIiIGFwcHJvYWNoKS4KLQotICAgIEFsdGVybmF0aXZlbHksIGlmIHRo
ZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBseSBuZXcgZGF0YSwgdGhlIHJlY29yZAotICAgIHdpbGwg
Y29sbGFwc2UgYWxsIGxvY2FsIGNoYW5nZXMgaW50byBpdHMgc2F2ZWQgZGF0YS4gU3Vic2VxdWVu
dAotICAgIHJvbGxiYWNrcyBvZiB0aGUgcmVjb3JkIHdpbGwgcm9sbCBiYWNrIHRvIHRoaXMgcG9p
bnQuCi0KLSAgICBJZiBhbiBhZGFwdGVyIGlzIGFja25vd2xlZGdpbmcgcmVjZWlwdCBvZiBhIG5l
d2x5IGNyZWF0ZWQgcmVjb3JkCi0gICAgdGhhdCBkaWQgbm90IGdlbmVyYXRlIGFuIGlkIGluIHRo
ZSBjbGllbnQsIGl0ICptdXN0KiBlaXRoZXIKLSAgICBwcm92aWRlIGRhdGEgb3IgZXhwbGljaXRs
eSBpbnZva2UgYHN0b3JlLmRpZFJlY2VpdmVJZGAgd2l0aAotICAgIHRoZSBzZXJ2ZXItcHJvdmlk
ZWQgaWQuCi0KLSAgICBOb3RlIHRoYXQgYW4gYWRhcHRlciBtYXkgbm90IHN1cHBseSBuZXcgZGF0
YSB3aGVuIGFja25vd2xlZGdpbmcKLSAgICBhIGRlbGV0ZWQgcmVjb3JkLgotCi0gICAgQHNlZSBE
Uy5TdG9yZSNkaWRVcGRhdGVSZWxhdGlvbnNoaXAKLQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJl
Y29yZCB0aGUgaW4tZmxpZ2h0IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhIG9wdGlv
bmFsIGRhdGEgKHNlZSBhYm92ZSkKLSAgKi8KLSAgZGlkU2F2ZVJlY29yZDogZnVuY3Rpb24ocmVj
b3JkLCBkYXRhKSB7Ci0gICAgcmVjb3JkLmFkYXB0ZXJEaWRDb21taXQoKTsKLQotICAgIGlmIChk
YXRhKSB7Ci0gICAgICB0aGlzLnVwZGF0ZUlkKHJlY29yZCwgZGF0YSk7Ci0gICAgICB0aGlzLnVw
ZGF0ZVJlY29yZERhdGEocmVjb3JkLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5k
aWRVcGRhdGVBdHRyaWJ1dGVzKHJlY29yZCk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEZv
ciBjb252ZW5pZW5jZSwgaWYgYW4gYWRhcHRlciBpcyBwZXJmb3JtaW5nIGEgYnVsayBjb21taXQs
IGl0IGNhbiBhbHNvCi0gICAgYWNrbm93bGVkZ2UgYWxsIG9mIHRoZSByZWNvcmRzIGF0IG9uY2Uu
Ci0KLSAgICBJZiB0aGUgYWRhcHRlciBzdXBwbGllcyBhbiBhcnJheSBvZiBkYXRhLCB0aGV5IG11
c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMKLSAgICB0aGUgYXJyYXkgb2YgcmVjb3JkcyBwYXNz
ZWQgaW4gYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4KLQotICAgIEBwYXJhbSB7I2ZvckVhY2h9IGxp
c3QgYSBsaXN0IG9mIHJlY29yZHMgd2hvc2UgY2hhbmdlcyB0aGUKLSAgICAgIGFkYXB0ZXIgaXMg
YWNrbm93bGVkZ2luZy4gWW91IGNhbiBwYXNzIGFueSBvYmplY3QgdGhhdAotICAgICAgaGFzIGFu
IEVTNS1saWtlIGBmb3JFYWNoYCBtZXRob2QsIGluY2x1ZGluZyB0aGUKLSAgICAgIGBPcmRlcmVk
U2V0YCBvYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBhZGFwdGVyIGF0IGNvbW1pdAotICAgICAgdGlt
ZS4KLSAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IGRhdGFMaXN0IGFuIEFycmF5IG9mIGRhdGEu
IFRoaXMKLSAgICAgIHBhcmFtZXRlciBtdXN0IGJlIGFuIGludGVnZXItaW5kZXhlZCBBcnJheS1s
aWtlLgotICAqLwotICBkaWRTYXZlUmVjb3JkczogZnVuY3Rpb24obGlzdCwgZGF0YUxpc3QpIHsK
LSAgICB2YXIgaSA9IDA7Ci0gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgewotICAg
ICAgdGhpcy5kaWRTYXZlUmVjb3JkKHJlY29yZCwgZGF0YUxpc3QgJiYgZGF0YUxpc3RbaSsrXSk7
Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgYWxsb3dzIHRo
ZSBhZGFwdGVyIHRvIHNwZWNpZnkgdGhhdCBhIHJlY29yZAotICAgIGNvdWxkIG5vdCBiZSBzYXZl
ZCBiZWNhdXNlIGl0IGhhZCBiYWNrZW5kLXN1cHBsaWVkIHZhbGlkYXRpb24KLSAgICBlcnJvcnMu
Ci0KLSAgICBUaGUgZXJyb3JzIG9iamVjdCBtdXN0IGhhdmUga2V5cyB0aGF0IGNvcnJlc3BvbmQg
dG8gdGhlCi0gICAgYXR0cmlidXRlIG5hbWVzLiBPbmNlIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBh
dHRyaWJ1dGVzIGhhdmUKLSAgICBjaGFuZ2VkLCB0aGUgcmVjb3JkIHdpbGwgYXV0b21hdGljYWxs
eSBtb3ZlIG91dCBvZiB0aGUKLSAgICBpbnZhbGlkIHN0YXRlIGFuZCBiZSByZWFkeSB0byBjb21t
aXQgYWdhaW4uCi0KLSAgICBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYXV0b21hdGUgdGhlIHBy
b2Nlc3Mgb2YgY29udmVydGluZwotICAgIHNlcnZlciBuYW1lcyB0byBhdHRyaWJ1dGUgbmFtZXMg
dXNpbmcgdGhlIGV4aXN0aW5nIHNlcmlhbGl6ZXIKLSAgICBpbmZyYXN0cnVjdHVyZS4KLQotICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBlcnJvcnMKLSAg
Ki8KLSAgcmVjb3JkV2FzSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkLCBlcnJvcnMpIHsKLSAgICBy
ZWNvcmQuYWRhcHRlckRpZEludmFsaWRhdGUoZXJyb3JzKTsKLSAgfSwKLQotICAvKioKLSAgICAg
VGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhZGFwdGVyIHRvIHNwZWNpZnkgdGhhdCBhIHJlY29yZAot
ICAgICBjb3VsZCBub3QgYmUgc2F2ZWQgYmVjYXVzZSB0aGUgc2VydmVyIHJldHVybmVkIGFuIHVu
aGFuZGxlZAotICAgICBlcnJvci4KLQotICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAg
Ki8KLSAgcmVjb3JkV2FzRXJyb3I6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJlY29yZC5hZGFw
dGVyRGlkRXJyb3IoKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIGlzIGEgbG93ZXItbGV2ZWwg
QVBJIHRoYW4gYGRpZFNhdmVSZWNvcmRgIHRoYXQgYWxsb3dzIGFuCi0gICAgYWRhcHRlciB0byBh
Y2tub3dsZWRnZSB0aGUgcGVyc2lzdGVuY2Ugb2YgYSBzaW5nbGUgYXR0cmlidXRlLgotCi0gICAg
VGhpcyBpcyB1c2VmdWwgaWYgYW4gYWRhcHRlciBuZWVkcyB0byBtYWtlIG11bHRpcGxlIGFzeW5j
aHJvbm91cwotICAgIGNhbGxzIHRvIGZ1bGx5IHBlcnNpc3QgYSByZWNvcmQuIFRoZSByZWNvcmQg
d2lsbCBrZWVwIHRyYWNrIG9mCi0gICAgd2hpY2ggYXR0cmlidXRlcyBhbmQgcmVsYXRpb25zaGlw
cyBhcmUgc3RpbGwgb3V0c3RhbmRpbmcgYW5kCi0gICAgYXV0b21hdGljYWxseSBtb3ZlIGludG8g
dGhlIGBzYXZlZGAgc3RhdGUgb25jZSB0aGUgYWRhcHRlciBoYXMKLSAgICBhY2tub3dsZWRnZWQg
ZXZlcnl0aGluZy4KLQotICAgIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGNsb2JiZXJzIHRo
ZSBsb2NhbGx5IHNwZWNpZmllZCB2YWx1ZS4KLSAgICBPdGhlcndpc2UsIHRoZSBsb2NhbCB2YWx1
ZSBiZWNvbWVzIHRoZSByZWNvcmQncyBsYXN0IGtub3duCi0gICAgc2F2ZWQgdmFsdWUgKHdoaWNo
IGlzIHVzZWQgd2hlbiByb2xsaW5nIGJhY2sgYSByZWNvcmQpLgotCi0gICAgTm90ZSB0aGF0IHRo
ZSBzcGVjaWZpZWQgYXR0cmlidXRlTmFtZSBpcyB0aGUgbm9ybWFsaXplZCBuYW1lCi0gICAgc3Bl
Y2lmaWVkIGluIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBgRFMuTW9kZWxgLCBub3QgYSBrZXkgaW4K
LSAgICB0aGUgc2VydmVyLXByb3ZpZGVkIGRhdGEuCi0KLSAgICBBbHNvIG5vdGUgdGhhdCB0aGUg
YWRhcHRlciBpcyByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBhbnkKLSAgICB0cmFuc2Zvcm1h
dGlvbnMgb24gdGhlIHZhbHVlIHVzaW5nIHRoZSBzZXJpYWxpemVyIEFQSS4KLQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGVOYW1lCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCi0gICovCi0gIGRpZFVwZGF0ZUF0dHJpYnV0ZTogZnVu
Y3Rpb24ocmVjb3JkLCBhdHRyaWJ1dGVOYW1lLCB2YWx1ZSkgewotICAgIHJlY29yZC5hZGFwdGVy
RGlkVXBkYXRlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLSAgfSwKLQotICAvKioK
LSAgICBUaGlzIG1ldGhvZCBhbGxvd3MgYW4gYWRhcHRlciB0byBhY2tub3dsZWRnZSBwZXJzaXN0
ZW5jZQotICAgIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIGEgcmVjb3JkIGJ1dCBub3QgcmVsYXRpb25z
aGlwcyBvcgotICAgIG90aGVyIGZhY3RvcnMuCi0KLSAgICBJdCBsb29wcyB0aHJvdWdoIHRoZSBy
ZWNvcmQncyBkZWZpbmVkIGF0dHJpYnV0ZXMgYW5kCi0gICAgbm90aWZpZXMgdGhlIHJlY29yZCB0
aGF0IHRoZXkgYXJlIGFsbCBhY2tub3dsZWRnZWQuCi0KLSAgICBUaGlzIG1ldGhvZCBkb2VzIG5v
dCB0YWtlIG9wdGlvbmFsIHZhbHVlcywgYmVjYXVzZQotICAgIHRoZSBhZGFwdGVyIGlzIHVubGlr
ZWx5IHRvIGhhdmUgYSBoYXNoIG9mIG5vcm1hbGl6ZWQKLSAgICBrZXlzIGFuZCB0cmFuc2Zvcm1l
ZCB2YWx1ZXMsIGFuZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0gICAgb25lIHVwLCBpdCBzaG91bGQg
anVzdCBjYWxsIGBkaWRVcGRhdGVBdHRyaWJ1dGVgIGFzCi0gICAgbmVlZGVkLgotCi0gICAgVGhp
cyBtZXRob2QgaXMgaW50ZW5kZWQgYXMgYSBtaWRkbGUtZ3JvdW5kIGJldHdlZW4KLSAgICBgZGlk
U2F2ZVJlY29yZGAsIHdoaWNoIGFja25vd2xlZGdlcyBhbGwgY2hhbmdlcyB0bwotICAgIGEgcmVj
b3JkLCBhbmQgYGRpZFVwZGF0ZUF0dHJpYnV0ZWAsIHdoaWNoIGFsbG93cyBhbgotICAgIGFkYXB0
ZXIgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB1cGRhdGVzLgotCi0gICAgQHBhcmFtIHtEUy5N
b2RlbH0gcmVjb3JkCi0gICovCi0gIGRpZFVwZGF0ZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uKHJlY29y
ZCkgewotICAgIHJlY29yZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsK
LSAgICAgIHRoaXMuZGlkVXBkYXRlQXR0cmlidXRlKHJlY29yZCwgYXR0cmlidXRlTmFtZSk7Ci0g
ICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBhbGxvd3MgYW4gYWRhcHRlciB0
byBhY2tub3dsZWRnZSB0aGF0IGl0IGhhcyBzYXZlZCBhbGwKLSAgICBuZWNlc3NhcnkgYXNwZWN0
cyBvZiBhIHJlbGF0aW9uc2hpcCBjaGFuZ2UuCi0KLSAgICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9t
IGFja25vd2xlZGdpbmcgdGhlIHJlY29yZCBpdHNlbGYKLSAgICAodmlhIGBkaWRTYXZlUmVjb3Jk
YCkgYmVjYXVzZSBhIHJlbGF0aW9uc2hpcCBjaGFuZ2UgY2FuCi0gICAgaW52b2x2ZSBhcyBtYW55
IGFzIHRocmVlIHNlcGFyYXRlIHJlY29yZHMuIFJlY29yZHMgc2hvdWxkCi0gICAgb25seSBtb3Zl
IG91dCBvZiB0aGUgaW4tZmxpZ2h0IHN0YXRlIG9uY2UgdGhlIHNlcnZlciBoYXMKLSAgICBhY2tu
b3dsZWRnZWQgYWxsIG9mIHRoZWlyIHJlbGF0aW9uc2hpcHMsIGFuZCB0aGlzIGRpZmZlcnMKLSAg
ICBiYXNlZCB1cG9uIHRoZSBhZGFwdGVyJ3Mgc2VtYW50aWNzLgotCi0gICAgVGhlcmUgYXJlIHRo
cmVlIGJhc2ljIHNjZW5hcmlvcyBieSB3aGljaCBhbiBhZGFwdGVyIGNhbgotICAgIHNhdmUgYSBy
ZWxhdGlvbnNoaXAuCi0KLSAgICAjIyMgRm9yZWlnbiBLZXkKLQotICAgIEFuIGFkYXB0ZXIgY2Fu
IHNhdmUgYWxsIHJlbGF0aW9uc2hpcCBjaGFuZ2VzIGJ5IHVwZGF0aW5nCi0gICAgYSBmb3JlaWdu
IGtleSBvbiB0aGUgY2hpbGQgcmVjb3JkLiBJZiBpdCBkb2VzIHRoaXMsIGl0Ci0gICAgc2hvdWxk
IGFja25vd2xlZGdlIHRoZSBjaGFuZ2VzIHdoZW4gdGhlIGNoaWxkIHJlY29yZCBpcwotICAgIHNh
dmVkLgotCi0gICAgICAgIHJlY29yZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIG1l
dGEpIHsKLSAgICAgICAgICBpZiAobWV0YS5raW5kID09PSAnYmVsb25nc1RvJykgewotICAgICAg
ICAgICAgc3RvcmUuZGlkVXBkYXRlUmVsYXRpb25zaGlwKHJlY29yZCwgbmFtZSk7Ci0gICAgICAg
ICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29yZCwg
ZGF0YSk7Ci0KLSAgICAjIyMgRW1iZWRkZWQgaW4gUGFyZW50Ci0KLSAgICBBbiBhZGFwdGVyIGNh
biBzYXZlIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcHMgYnkgZW1iZWRkaW5nCi0gICAgSURzIChv
ciByZWNvcmRzKSBpbiB0aGUgcGFyZW50IG9iamVjdC4gSW4gdGhpcyBjYXNlLCB0aGUKLSAgICBy
ZWxhdGlvbnNoaXAgaXMgbm90IGNvbnNpZGVyZWQgYWNrbm93bGVkZ2VkIHVudGlsIGJvdGggdGhl
Ci0gICAgb2xkIHBhcmVudCBhbmQgbmV3IHBhcmVudCBoYXZlIGFja25vd2xlZGdlZCB0aGUgY2hh
bmdlLgotCi0gICAgSW4gdGhpcyBjYXNlLCB0aGUgYWRhcHRlciBzaG91bGQga2VlcCB0cmFjayBv
ZiB0aGUgb2xkCi0gICAgcGFyZW50IGFuZCBuZXcgcGFyZW50LCBhbmQgYWNrbm93bGVkZ2UgdGhl
IHJlbGF0aW9uc2hpcAotICAgIGNoYW5nZSBvbmNlIGJvdGggaGF2ZSBhY2tub3dsZWRnZWQuIElm
IG9uZSBvZiB0aGUgdHdvCi0gICAgc2lkZXMgZG9lcyBub3QgZXhpc3QgKGUuZy4gdGhlIG5ldyBw
YXJlbnQgZG9lcyBub3QgZXhpc3QKLSAgICBiZWNhdXNlIG9mIG51bGxpbmcgb3V0IHRoZSBiZWxv
bmdzLXRvIHJlbGF0aW9uc2hpcCksCi0gICAgdGhlIGFkYXB0ZXIgc2hvdWxkIGFja25vd2xlZGdl
IHRoZSByZWxhdGlvbnNoaXAgb25jZQotICAgIHRoZSBvdGhlciBzaWRlIGhhcyBhY2tub3dsZWRn
ZWQuCi0KLSAgICAjIyMgU2VwYXJhdGUgRW50aXR5Ci0KLSAgICBBbiBhZGFwdGVyIGNhbiBzYXZl
IHJlbGF0aW9uc2hpcHMgYXMgc2VwYXJhdGUgZW50aXRpZXMKLSAgICBvbiB0aGUgc2VydmVyLiBJ
biB0aGlzIGNhc2UsIHRoZXkgc2hvdWxkIGFja25vd2xlZGdlCi0gICAgdGhlIHJlbGF0aW9uc2hp
cCBhcyBzYXZlZCBvbmNlIHRoZSBzZXJ2ZXIgaGFzCi0gICAgYWNrbm93bGVkZ2VkIHRoZSBlbnRp
dHkuCi0KLSAgICBAc2VlIERTLlN0b3JlI2RpZFNhdmVSZWNvcmQKLQotICAgIEBwYXJhbSB7RFMu
TW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlbGF0aW9uc2hpcE5hbWUKLSAg
Ki8KLSAgZGlkVXBkYXRlUmVsYXRpb25zaGlwOiBmdW5jdGlvbihyZWNvcmQsIHJlbGF0aW9uc2hp
cE5hbWUpIHsKLSAgICB2YXIgcmVsYXRpb25zaGlwID0gdGhpcy5yZWxhdGlvbnNoaXBDaGFuZ2VG
b3IoZ2V0KHJlY29yZCwgJ2NsaWVudElkJyksIHJlbGF0aW9uc2hpcE5hbWUpOwotICAgIC8vVE9E
TyhJZ29yKQotICAgIGlmIChyZWxhdGlvbnNoaXApIHsgcmVsYXRpb25zaGlwLmFkYXB0ZXJEaWRV
cGRhdGUoKTsgfQotICB9LAotCi0gIC8qKgotICAgIFRoaXMgYWxsb3dzIGFuIGFkYXB0ZXIgdG8g
YWNrbm93bGVkZ2UgYWxsIHJlbGF0aW9uc2hpcCBjaGFuZ2VzCi0gICAgZm9yIGEgZ2l2ZW4gcmVj
b3JkLgotCi0gICAgTGlrZSBgZGlkVXBkYXRlQXR0cmlidXRlc2AsIHRoaXMgaXMgaW50ZW5kZWQg
YXMgYSBtaWRkbGUgZ3JvdW5kCi0gICAgYmV0d2VlbiBgZGlkU2F2ZVJlY29yZGAgYW5kIGZpbmUt
Z3JhaW5lZCBjb250cm9sIHZpYSB0aGUKLSAgICBgZGlkVXBkYXRlUmVsYXRpb25zaGlwYCBBUEku
Ci0gICovCi0gIGRpZFVwZGF0ZVJlbGF0aW9uc2hpcHM6IGZ1bmN0aW9uKHJlY29yZCkgewotICAg
IHZhciBjaGFuZ2VzID0gdGhpcy5yZWxhdGlvbnNoaXBDaGFuZ2VzRm9yKGdldChyZWNvcmQsICdf
cmVmZXJlbmNlJykpOwotCi0gICAgZm9yICh2YXIgbmFtZSBpbiBjaGFuZ2VzKSB7Ci0gICAgICBp
ZiAoIWNoYW5nZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsgY29udGludWU7IH0KLSAgICAgIGNo
YW5nZXNbbmFtZV0uYWRhcHRlckRpZFVwZGF0ZSgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAg
ICBXaGVuIGFja25vd2xlZGdpbmcgdGhlIGNyZWF0aW9uIG9mIGEgbG9jYWxseSBjcmVhdGVkIHJl
Y29yZCwKLSAgICBhZGFwdGVycyBtdXN0IHN1cHBseSBhbiBpZCAoaWYgdGhleSBkaWQgbm90IGlt
cGxlbWVudAotICAgIGBnZW5lcmF0ZUlkRm9yUmVjb3JkYCB0byBnZW5lcmF0ZSBhbiBpZCBsb2Nh
bGx5KS4KLQotICAgIElmIGFuIGFkYXB0ZXIgZG9lcyBub3QgdXNlIGBkaWRTYXZlUmVjb3JkYCBh
bmQgc3VwcGx5IGEgaGFzaAotICAgIChmb3IgZXhhbXBsZSwgaWYgaXQgbmVlZHMgdG8gbWFrZSBt
dWx0aXBsZSBIVFRQIHJlcXVlc3RzIHRvCi0gICAgY3JlYXRlIGFuZCB0aGVuIHVwZGF0ZSB0aGUg
cmVjb3JkKSwgaXQgd2lsbCBuZWVkIHRvIGludm9rZQotICAgIGBkaWRSZWNlaXZlSWRgIHdpdGgg
dGhlIGJhY2tlbmQtc3VwcGxpZWQgaWQuCi0KLSAgICBXaGVuIG5vdCB1c2luZyBgZGlkU2F2ZVJl
Y29yZGAsIGFuIGFkYXB0ZXIgd2lsbCBuZWVkIHRvCi0gICAgaW52b2tlOgotCi0gICAgKiBkaWRS
ZWNlaXZlSWQgKHVubGVzcyB0aGUgaWQgd2FzIGdlbmVyYXRlZCBsb2NhbGx5KQotICAgICogZGlk
Q3JlYXRlUmVjb3JkCi0gICAgKiBkaWRVcGRhdGVBdHRyaWJ1dGUocykKLSAgICAqIGRpZFVwZGF0
ZVJlbGF0aW9uc2hpcChzKQotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBh
cmFtIHtOdW1iZXJ8U3RyaW5nfSBpZAotICAqLwotICBkaWRSZWNlaXZlSWQ6IGZ1bmN0aW9uKHJl
Y29yZCwgaWQpIHsKLSAgICB2YXIgdHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcihyZWNvcmQuY29u
c3RydWN0b3IpLAotICAgICAgICBjbGllbnRJZCA9IGdldChyZWNvcmQsICdjbGllbnRJZCcpLAot
ICAgICAgICBvbGRJZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJB
biBhZGFwdGVyIGNhbm5vdCBhc3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5
IGhhcyBhbiBpZC4gIiArIHJlY29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3Ug
dHJpZWQgdG8gdXBkYXRlIGl0IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkgaGFwcGVuZWQg
YmVjYXVzZSB5b3VyIHNlcnZlciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRvIGEgZmluZCBv
ciB1cGRhdGUgdGhhdCBoYWQgYSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIs
IG9sZElkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG9sZElkKTsKLQotICAgIHR5cGVNYXAuaWRU
b0NpZFtpZF0gPSBjbGllbnRJZDsKLSAgICB0aGlzLmNsaWVudElkVG9JZFtjbGllbnRJZF0gPSBp
ZDsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgVGhpcyBtZXRob2QgcmUtaW5k
ZXhlcyB0aGUgZGF0YSBieSBpdHMgY2xpZW50SWQgaW4gdGhlIHN0b3JlCi0gICAgYW5kIHRoZW4g
bm90aWZpZXMgdGhlIHJlY29yZCB0aGF0IGl0IHNob3VsZCByZW1hdGVyaWFsaXplCi0gICAgaXRz
ZWxmLgotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9
IGRhdGEKLSAgKi8KLSAgdXBkYXRlUmVjb3JkRGF0YTogZnVuY3Rpb24ocmVjb3JkLCBkYXRhKSB7
Ci0gICAgdmFyIGNsaWVudElkID0gZ2V0KHJlY29yZCwgJ2NsaWVudElkJyksCi0gICAgICAgIGNp
ZFRvRGF0YSA9IHRoaXMuY2xpZW50SWRUb0RhdGE7Ci0KLSAgICBjaWRUb0RhdGFbY2xpZW50SWRd
ID0gZGF0YTsKLQotICAgIHJlY29yZC5kaWRDaGFuZ2VEYXRhKCk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgQHByaXZhdGUKLQotICAgIElmIGFuIGFkYXB0ZXIgaW52b2tlcyBgZGlkU2F2ZVJlY29yZGAg
d2l0aCBkYXRhLCB0aGlzIG1ldGhvZAotICAgIGV4dHJhY3RzIHRoZSBpZCBmcm9tIHRoZSBzdXBw
bGllZCBkYXRhICh1c2luZyB0aGUgYWRhcHRlcidzCi0gICAgYGV4dHJhY3RJZCgpYCBtZXRob2Qp
IGFuZCBpbmRleGVzIHRoZSBjbGllbnRJZCB3aXRoIHRoYXQgaWQuCi0KLSAgICBAcGFyYW0ge0RT
Lk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gZGF0YQotICAqLwotICB1cGRhdGVJ
ZDogZnVuY3Rpb24ocmVjb3JkLCBkYXRhKSB7Ci0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5cGVN
YXBGb3IocmVjb3JkLmNvbnN0cnVjdG9yKSwKLSAgICAgICAgY2xpZW50SWQgPSBnZXQocmVjb3Jk
LCAnY2xpZW50SWQnKSwKLSAgICAgICAgb2xkSWQgPSBnZXQocmVjb3JkLCAnaWQnKSwKLSAgICAg
ICAgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgaWQgPSB0aGlzLnByZXByb2Nl
c3NEYXRhKHR5cGUsIGRhdGEpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJBbiBhZGFwdGVyIGNhbm5v
dCBhc3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5IGhhcyBhbiBpZC4gIiAr
IHJlY29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3UgdHJpZWQgdG8gdXBkYXRl
IGl0IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkgaGFwcGVuZWQgYmVjYXVzZSB5b3VyIHNl
cnZlciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRvIGEgZmluZCBvciB1cGRhdGUgdGhhdCBo
YWQgYSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIsIG9sZElkID09PSBudWxs
IHx8IGlkID09PSBvbGRJZCk7Ci0KLSAgICB0eXBlTWFwLmlkVG9DaWRbaWRdID0gY2xpZW50SWQ7
Ci0gICAgdGhpcy5jbGllbnRJZFRvSWRbY2xpZW50SWRdID0gaWQ7Ci0gICAgdGhpcy5yZWZlcmVu
Y2VGb3JDbGllbnRJZChjbGllbnRJZCkuaWQgPSBpZDsKLSAgfSwKLQotICAvKioKLSAgICBAcHJp
dmF0ZQotCi0gICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgb3BhcXVlIGRhdGEgcHJvdmlkZWQgYnkg
dGhlIGFkYXB0ZXIgYW5kCi0gICAgcHJlcHJvY2Vzc2VzIGl0LCByZXR1cm5pbmcgYW4gSUQuCi0K
LSAgICBUaGUgYWN0dWFsIHByZXByb2Nlc3NpbmcgdGFrZXMgcGxhY2UgaW4gdGhlIGFkYXB0ZXIu
IElmIHlvdSB3b3VsZAotICAgIGxpa2UgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCB5
b3Ugc2hvdWxkIG92ZXJyaWRlIHRoZQotICAgIGFwcHJvcHJpYXRlIGhvb2tzIGluIGBEUy5TZXJp
YWxpemVyYC4KLQotICAgIEBzZWUge0RTLlNlcmlhbGl6ZXJ9Ci0gICAgQHJldHVybiB7U3RyaW5n
fSBpZCB0aGUgaWQgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGEKLSAgKi8KLSAgcHJlcHJvY2Vzc0Rh
dGE6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpIHsKLSAgICByZXR1cm4gdGhpcy5hZGFwdGVyRm9yVHlw
ZSh0eXBlKS5leHRyYWN0SWQodHlwZSwgZGF0YSk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4u
Li4uLi4KLSAgLy8gLiBSRUNPUkQgQVJSQVlTIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4KLQot
ICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgUmVnaXN0ZXIgYSBSZWNvcmRBcnJheSBmb3IgYSBn
aXZlbiB0eXBlIHRvIGJlIGJhY2tlZCBieQotICAgIGEgZmlsdGVyIGZ1bmN0aW9uLiBUaGlzIHdp
bGwgY2F1c2UgdGhlIGFycmF5IHRvIHVwZGF0ZQotICAgIGF1dG9tYXRpY2FsbHkgd2hlbiByZWNv
cmRzIG9mIHRoYXQgdHlwZSBjaGFuZ2UgYXR0cmlidXRlCi0gICAgdmFsdWVzIG9yIHN0YXRlcy4K
LQotICAgIEBwYXJhbSB7RFMuUmVjb3JkQXJyYXl9IGFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30g
dHlwZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgotICAqLwotICByZWdpc3RlclJlY29y
ZEFycmF5OiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0gICAgdmFyIHJlY29yZEFy
cmF5cyA9IHRoaXMudHlwZU1hcEZvcih0eXBlKS5yZWNvcmRBcnJheXM7Ci0KLSAgICByZWNvcmRB
cnJheXMucHVzaChhcnJheSk7Ci0KLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5RmlsdGVyKGFy
cmF5LCB0eXBlLCBmaWx0ZXIpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBD
cmVhdGUgYSBgRFMuTWFueUFycmF5YCBmb3IgYSB0eXBlIGFuZCBsaXN0IG9mIGNsaWVudElkcwot
ICAgIGFuZCBpbmRleCB0aGUgYE1hbnlBcnJheWAgdW5kZXIgZWFjaCBjbGllbnRJZC4gVGhpcyBh
bGxvd3MKLSAgICB1cyB0byBlZmZpY2llbnRseSByZW1vdmUgcmVjb3JkcyBmcm9tIGBNYW55QXJy
YXlgcyB3aGVuCi0gICAgdGhleSBhcmUgZGVsZXRlZC4KLQotICAgIEBwYXJhbSB7Q2xhc3N9IHR5
cGUKLSAgICBAcGFyYW0ge0FycmF5fSBjbGllbnRJZHMKLQotICAgIEByZXR1cm4ge0RTLk1hbnlB
cnJheX0KLSAgKi8KLSAgY3JlYXRlTWFueUFycmF5OiBmdW5jdGlvbih0eXBlLCBjbGllbnRJZHMp
IHsKLSAgICB2YXIgYXJyYXkgPSBEUy5NYW55QXJyYXkuY3JlYXRlKHsgdHlwZTogdHlwZSwgY29u
dGVudDogY2xpZW50SWRzLCBzdG9yZTogdGhpcyB9KTsKLQotICAgIGNsaWVudElkcy5mb3JFYWNo
KGZ1bmN0aW9uKGNsaWVudElkKSB7Ci0gICAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy5yZWNv
cmRBcnJheXNGb3JDbGllbnRJZChjbGllbnRJZCk7Ci0gICAgICByZWNvcmRBcnJheXMuYWRkKGFy
cmF5KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBhcnJheTsKLSAgfSwKLQotICAvKioK
LSAgICBAcHJpdmF0ZQotCi0gICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBpZiB0aGUgYGZpbHRl
ckZ1bmN0aW9uYCBwcm9wZXJ0eSBpcwotICAgIGNoYW5nZWQgb24gYSBgRFMuRmlsdGVyZWRSZWNv
cmRBcnJheWAuCi0KLSAgICBJdCBlc3NlbnRpYWxseSByZS1ydW5zIHRoZSBmaWx0ZXIgZnJvbSBz
Y3JhdGNoLiBUaGlzIHNhbWUKLSAgICBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBmaWx0ZXIg
aXMgY3JlYXRlZCBpbiB0aCBmaXJzdCBwbGFjZS4KLSAgKi8KLSAgdXBkYXRlUmVjb3JkQXJyYXlG
aWx0ZXI6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBmaWx0ZXIpIHsKLSAgICB2YXIgdHlwZU1hcCA9
IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKLSAgICAgICAgY2lkVG9EYXRhID0gdGhpcy5jbGllbnRJ
ZFRvRGF0YSwKLSAgICAgICAgY2xpZW50SWRzID0gdHlwZU1hcC5jbGllbnRJZHMsCi0gICAgICAg
IGNsaWVudElkLCBkYXRhLCBzaG91bGRGaWx0ZXIsIHJlY29yZDsKLQotICAgIGZvciAodmFyIGk9
MCwgbD1jbGllbnRJZHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgY2xpZW50SWQgPSBjbGll
bnRJZHNbaV07Ci0gICAgICBzaG91bGRGaWx0ZXIgPSBmYWxzZTsKLQotICAgICAgZGF0YSA9IGNp
ZFRvRGF0YVtjbGllbnRJZF07Ci0KLSAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcp
IHsKLSAgICAgICAgaWYgKHJlY29yZCA9IHRoaXMucmVjb3JkQ2FjaGVbY2xpZW50SWRdKSB7Ci0g
ICAgICAgICAgaWYgKCFnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsgc2hvdWxkRmlsdGVyID0g
dHJ1ZTsgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNob3VsZEZpbHRlciA9IHRydWU7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2hvdWxkRmlsdGVyKSB7Ci0gICAgICAgICAgdGhp
cy51cGRhdGVSZWNvcmRBcnJheShhcnJheSwgZmlsdGVyLCB0eXBlLCBjbGllbnRJZCk7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgdXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6
IGZ1bmN0aW9uKHR5cGUsIGNsaWVudElkKSB7Ci0gICAgRW1iZXIucnVuLm9uY2UodGhpcywgZnVu
Y3Rpb24oKSB7Ci0gICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5cyh0eXBlLCBjbGllbnRJZCk7
Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9k
IGlzIGludm9rZWQgd2hlbmV2ZXIgZGF0YSBpcyBsb2FkZWQgaW50byB0aGUgc3RvcmUKLSAgICBi
eSB0aGUgYWRhcHRlciBvciB1cGRhdGVkIGJ5IHRoZSBhZGFwdGVyLCBvciB3aGVuIGFuIGF0dHJp
YnV0ZQotICAgIGNoYW5nZXMgb24gYSByZWNvcmQuCi0KLSAgICBJdCB1cGRhdGVzIGFsbCBmaWx0
ZXJzIHRoYXQgYSByZWNvcmQgYmVsb25ncyB0by4KLQotICAgIFRvIGF2b2lkIHRocmFzaGluZywg
aXQgb25seSBydW5zIG9uY2UgcGVyIHJ1biBsb29wIHBlciByZWNvcmQuCi0KLSAgICBAcGFyYW0g
e0NsYXNzfSB0eXBlCi0gICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJZAotICAqLwot
ICB1cGRhdGVSZWNvcmRBcnJheXM6IGZ1bmN0aW9uKHR5cGUsIGNsaWVudElkKSB7Ci0gICAgdmFy
IHJlY29yZEFycmF5cyA9IHRoaXMudHlwZU1hcEZvcih0eXBlKS5yZWNvcmRBcnJheXMsCi0gICAg
ICAgIGZpbHRlcjsKLQotICAgIHJlY29yZEFycmF5cy5mb3JFYWNoKGZ1bmN0aW9uKGFycmF5KSB7
Ci0gICAgICBmaWx0ZXIgPSBnZXQoYXJyYXksICdmaWx0ZXJGdW5jdGlvbicpOwotICAgICAgdGhp
cy51cGRhdGVSZWNvcmRBcnJheShhcnJheSwgZmlsdGVyLCB0eXBlLCBjbGllbnRJZCk7Ci0gICAg
fSwgdGhpcyk7Ci0KLSAgICAvLyBsb29wIHRocm91Z2ggYWxsIG1hbnlBcnJheXMgY29udGFpbmlu
ZyBhbiB1bmxvYWRlZCBjb3B5IG9mIHRoaXMKLSAgICAvLyBjbGllbnRJZCBhbmQgbm90aWZ5IHRo
ZW0gdGhhdCB0aGUgcmVjb3JkIHdhcyBsb2FkZWQuCi0gICAgdmFyIG1hbnlBcnJheXMgPSB0aGlz
LmxvYWRpbmdSZWNvcmRBcnJheXNbY2xpZW50SWRdOwotCi0gICAgaWYgKG1hbnlBcnJheXMpIHsK
LSAgICAgIGZvciAodmFyIGk9MCwgbD1tYW55QXJyYXlzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgICAgbWFueUFycmF5c1tpXS5sb2FkZWRSZWNvcmQoKTsKLSAgICAgIH0KLQotICAgICAgdGhp
cy5sb2FkaW5nUmVjb3JkQXJyYXlzW2NsaWVudElkXSA9IG51bGw7Ci0gICAgfQotICB9LAotCi0g
IC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBVcGRhdGUgYW4gaW5kaXZpZHVhbCBmaWx0ZXIuCi0K
LSAgICBAcGFyYW0ge0RTLkZpbHRlcmVkUmVjb3JkQXJyYXl9IGFycmF5Ci0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gZmlsdGVyCi0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7TnVt
YmVyfFN0cmluZ30gY2xpZW50SWQKLSAgKi8KLSAgdXBkYXRlUmVjb3JkQXJyYXk6IGZ1bmN0aW9u
KGFycmF5LCBmaWx0ZXIsIHR5cGUsIGNsaWVudElkKSB7Ci0gICAgdmFyIHNob3VsZEJlSW5BcnJh
eSwgcmVjb3JkOwotCi0gICAgaWYgKCFmaWx0ZXIpIHsKLSAgICAgIHNob3VsZEJlSW5BcnJheSA9
IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlY29yZCA9IHRoaXMuZmluZEJ5Q2xpZW50SWQo
dHlwZSwgY2xpZW50SWQpOwotICAgICAgc2hvdWxkQmVJbkFycmF5ID0gZmlsdGVyKHJlY29yZCk7
Ci0gICAgfQotCi0gICAgdmFyIGNvbnRlbnQgPSBnZXQoYXJyYXksICdjb250ZW50Jyk7Ci0KLSAg
ICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy5yZWNvcmRBcnJheXNGb3JDbGllbnRJZChjbGllbnRJ
ZCk7Ci0gICAgdmFyIHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlRm9yQ2xpZW50SWQoY2xpZW50
SWQpOwotCi0gICAgaWYgKHNob3VsZEJlSW5BcnJheSkgewotICAgICAgcmVjb3JkQXJyYXlzLmFk
ZChhcnJheSk7Ci0gICAgICBhcnJheS5hZGRSZWZlcmVuY2UocmVmZXJlbmNlKTsKLSAgICB9IGVs
c2UgaWYgKCFzaG91bGRCZUluQXJyYXkpIHsKLSAgICAgIHJlY29yZEFycmF5cy5yZW1vdmUoYXJy
YXkpOwotICAgICAgYXJyYXkucmVtb3ZlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0gICAgfQotICB9
LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0ZWQs
IGl0IGlzIHJlbW92ZWQgZnJvbSBhbGwgaXRzCi0gICAgcmVjb3JkIGFycmF5cy4KLQotICAgIEBw
YXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICByZW1vdmVGcm9tUmVjb3JkQXJyYXlzOiBm
dW5jdGlvbihyZWNvcmQpIHsKLSAgICB2YXIgcmVmZXJlbmNlID0gZ2V0KHJlY29yZCwgJ19yZWZl
cmVuY2UnKTsKLSAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy5yZWNvcmRBcnJheXNGb3JDbGll
bnRJZChyZWZlcmVuY2UuY2xpZW50SWQpOwotCi0gICAgcmVjb3JkQXJyYXlzLmZvckVhY2goZnVu
Y3Rpb24oYXJyYXkpIHsKLSAgICAgIGFycmF5LnJlbW92ZVJlZmVyZW5jZShyZWZlcmVuY2UpOwot
ICAgIH0pOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLgotICAvLyAuIElOREVYSU5HIC4KLSAg
Ly8gLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFJldHVybiBhIGxp
c3Qgb2YgYWxsIGBEUy5SZWNvcmRBcnJheWBzIGEgY2xpZW50SWQgaXMKLSAgICBwYXJ0IG9mLgot
Ci0gICAgQHJldHVybiB7T2JqZWN0KGNsaWVudElkOiBFbWJlci5PcmRlcmVkU2V0KX0KLSAgKi8K
LSAgcmVjb3JkQXJyYXlzRm9yQ2xpZW50SWQ6IGZ1bmN0aW9uKGNsaWVudElkKSB7Ci0gICAgdmFy
IHJlY29yZEFycmF5cyA9IGdldCh0aGlzLCAncmVjb3JkQXJyYXlzQnlDbGllbnRJZCcpOwotICAg
IHZhciByZXQgPSByZWNvcmRBcnJheXNbY2xpZW50SWRdOwotCi0gICAgaWYgKCFyZXQpIHsKLSAg
ICAgIHJldCA9IHJlY29yZEFycmF5c1tjbGllbnRJZF0gPSBFbWJlci5PcmRlcmVkU2V0LmNyZWF0
ZSgpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0sCi0KLSAgdHlwZU1hcEZvcjogZnVu
Y3Rpb24odHlwZSkgewotICAgIHZhciB0eXBlTWFwcyA9IGdldCh0aGlzLCAndHlwZU1hcHMnKTsK
LSAgICB2YXIgZ3VpZEZvclR5cGUgPSBFbWJlci5ndWlkRm9yKHR5cGUpOwotCi0gICAgdmFyIHR5
cGVNYXAgPSB0eXBlTWFwc1tndWlkRm9yVHlwZV07Ci0KLSAgICBpZiAodHlwZU1hcCkgewotICAg
ICAgcmV0dXJuIHR5cGVNYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAodHlwZU1hcHNb
Z3VpZEZvclR5cGVdID0KLSAgICAgICAgewotICAgICAgICAgIGlkVG9DaWQ6IHt9LAotICAgICAg
ICAgIGNsaWVudElkczogW10sCi0gICAgICAgICAgcmVjb3JkQXJyYXlzOiBbXQotICAgICAgfSk7
Ci0gICAgfQotICB9LAotCi0gIC8qKiBAcHJpdmF0ZQotCi0gICAgRm9yIGEgZ2l2ZW4gdHlwZSBh
bmQgaWQgY29tYmluYXRpb24sIHJldHVybnMgdGhlIGNsaWVudCBpZCB1c2VkIGJ5IHRoZSBzdG9y
ZS4KLSAgICBJZiBubyBjbGllbnQgaWQgaGFzIGJlZW4gYXNzaWduZWQgeWV0LCBvbmUgd2lsbCBi
ZSBjcmVhdGVkIGFuZCByZXR1cm5lZC4KLQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHR5cGUKLSAg
ICBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGlkCi0gICovCi0gIGNsaWVudElkRm9ySWQ6IGZ1bmN0
aW9uKHR5cGUsIGlkKSB7Ci0gICAgaWQgPSBjb2VyY2VJZChpZCk7Ci0KLSAgICB2YXIgY2xpZW50
SWQgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSkuaWRUb0NpZFtpZF07Ci0gICAgaWYgKGNsaWVudElk
ICE9PSB1bmRlZmluZWQpIHsgcmV0dXJuIGNsaWVudElkOyB9Ci0KLSAgICByZXR1cm4gdGhpcy5w
dXNoRGF0YShVTkxPQURFRCwgaWQsIHR5cGUpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRl
Ci0KLSAgICBUaGlzIG1ldGhvZCB3b3JrcyBleGFjdGx5IGxpa2UgYGNsaWVudElkRm9ySWRgLCBi
dXQgZG9lcyBub3QKLSAgICByZXF1aXJlIGxvb2tpbmcgdXAgdGhlIGB0eXBlTWFwYCBmb3IgZXZl
cnkgYGNsaWVudElkYCBhbmQKLSAgICBpbnZva2luZyBhIG1ldGhvZCBwZXIgYGNsaWVudElkYC4K
LSAgKi8KLSAgY2xpZW50SWRzRm9ySWRzOiBmdW5jdGlvbih0eXBlLCBpZHMpIHsKLSAgICB2YXIg
dHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKLSAgICAgICAgaWRUb0NsaWVudElkTWFw
ID0gdHlwZU1hcC5pZFRvQ2lkOwotCi0gICAgcmV0dXJuIG1hcChpZHMsIGZ1bmN0aW9uKGlkKSB7
Ci0gICAgICBpZCA9IGNvZXJjZUlkKGlkKTsKLQotICAgICAgdmFyIGNsaWVudElkID0gaWRUb0Ns
aWVudElkTWFwW2lkXTsKLSAgICAgIGlmIChjbGllbnRJZCkgeyByZXR1cm4gY2xpZW50SWQ7IH0K
LSAgICAgIHJldHVybiB0aGlzLnB1c2hEYXRhKFVOTE9BREVELCBpZCwgdHlwZSk7Ci0gICAgfSwg
dGhpcyk7Ci0gIH0sCi0KLSAgdHlwZUZvckNsaWVudElkOiBmdW5jdGlvbihjbGllbnRJZCkgewot
ICAgIHJldHVybiB0aGlzLmNsaWVudElkVG9UeXBlW2NsaWVudElkXTsKLSAgfSwKLQotICBpZEZv
ckNsaWVudElkOiBmdW5jdGlvbihjbGllbnRJZCkgewotICAgIHJldHVybiB0aGlzLmNsaWVudElk
VG9JZFtjbGllbnRJZF07Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLgotICAvLyAuIExP
QURJTkcgREFUQSAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4KLQotICAvKioKLSAgICBMb2FkIG5l
dyBkYXRhIGludG8gdGhlIHN0b3JlIGZvciBhIGdpdmVuIGlkIGFuZCB0eXBlIGNvbWJpbmF0aW9u
LgotICAgIElmIGRhdGEgZm9yIHRoYXQgcmVjb3JkIGhhZCBiZWVuIGxvYWRlZCBwcmV2aW91c2x5
LCB0aGUgbmV3IGluZm9ybWF0aW9uCi0gICAgb3ZlcndyaXRlcyB0aGUgb2xkLgotCi0gICAgSWYg
dGhlIHJlY29yZCB5b3UgYXJlIGxvYWRpbmcgZGF0YSBmb3IgaGFzIG91dHN0YW5kaW5nIGNoYW5n
ZXMgdGhhdCBoYXZlIG5vdAotICAgIHlldCBiZWVuIHNhdmVkLCBhbiBleGNlcHRpb24gd2lsbCBi
ZSB0aHJvd24uCi0KLSAgICBAcGFyYW0ge0RTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJp
bmd8TnVtYmVyfSBpZAotICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSBkYXRhIHRvIGxvYWQK
LSAgKi8KLSAgbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKSB7Ci0g
ICAgdmFyIGlkOwotCi0gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJyB8fCB0eXBlb2Yg
ZGF0YSA9PT0gJ3N0cmluZycpIHsKLSAgICAgIGlkID0gZGF0YTsKLSAgICAgIGRhdGEgPSBwcmVt
YXRlcmlhbGl6ZWQ7Ci0gICAgICBwcmVtYXRlcmlhbGl6ZWQgPSBudWxsOwotICAgIH0KLQotICAg
IGlmIChwcmVtYXRlcmlhbGl6ZWQgJiYgcHJlbWF0ZXJpYWxpemVkLmlkKSB7Ci0gICAgICBpZCA9
IHByZW1hdGVyaWFsaXplZC5pZDsKLSAgICB9IGVsc2UgaWYgKGlkID09PSB1bmRlZmluZWQpIHsK
LSAgICAgIGlkID0gdGhpcy5wcmVwcm9jZXNzRGF0YSh0eXBlLCBkYXRhKTsKLSAgICB9Ci0KLSAg
ICBpZCA9IGNvZXJjZUlkKGlkKTsKLQotICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9y
KHR5cGUpLAotICAgICAgICBjaWRUb0RhdGEgPSB0aGlzLmNsaWVudElkVG9EYXRhLAotICAgICAg
ICBjbGllbnRJZCA9IHR5cGVNYXAuaWRUb0NpZFtpZF0sCi0gICAgICAgIGNpZFRvUHJlbWF0ZXJp
YWxpemVkID0gdGhpcy5jbGllbnRJZFRvUHJlbWF0ZXJpYWxpemVkRGF0YTsKLQotICAgIGlmIChj
bGllbnRJZCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICBjaWRUb0RhdGFbY2xpZW50SWRdID0gZGF0
YTsKLSAgICAgIGNpZFRvUHJlbWF0ZXJpYWxpemVkW2NsaWVudElkXSA9IHByZW1hdGVyaWFsaXpl
ZDsKLQotICAgICAgdmFyIHJlY29yZCA9IHRoaXMucmVjb3JkQ2FjaGVbY2xpZW50SWRdOwotICAg
ICAgaWYgKHJlY29yZCkgewotICAgICAgICBvbmNlKHJlY29yZCwgJ2xvYWRlZERhdGEnKTsKLSAg
ICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY2xpZW50SWQgPSB0aGlzLnB1c2hEYXRhKGRhdGEs
IGlkLCB0eXBlKTsKLSAgICAgIGNpZFRvUHJlbWF0ZXJpYWxpemVkW2NsaWVudElkXSA9IHByZW1h
dGVyaWFsaXplZDsKLSAgICB9Ci0KLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKHR5
cGUsIGNsaWVudElkKTsKLQotICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZUZvckNsaWVudElkKGNs
aWVudElkKTsKLSAgfSwKLQotICBwcmVtYXRlcmlhbGl6ZTogZnVuY3Rpb24ocmVmZXJlbmNlLCBw
cmVtYXRlcmlhbGl6ZWQpIHsKLSAgICB0aGlzLmNsaWVudElkVG9QcmVtYXRlcmlhbGl6ZWREYXRh
W3JlZmVyZW5jZS5jbGllbnRJZF0gPSBwcmVtYXRlcmlhbGl6ZWQ7Ci0gIH0sCi0KLSAgbG9hZE1h
bnk6IGZ1bmN0aW9uKHR5cGUsIGlkcywgZGF0YUxpc3QpIHsKLSAgICBpZiAoZGF0YUxpc3QgPT09
IHVuZGVmaW5lZCkgewotICAgICAgZGF0YUxpc3QgPSBpZHM7Ci0gICAgICBpZHMgPSBtYXAoZGF0
YUxpc3QsIGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJlcHJvY2Vzc0Rh
dGEodHlwZSwgZGF0YSk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWFw
KGlkcywgZnVuY3Rpb24oaWQsIGkpIHsKLSAgICAgIHJldHVybiB0aGlzLmxvYWQodHlwZSwgaWQs
IGRhdGFMaXN0W2ldKTsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICBsb2FkSGFzTWFueTogZnVu
Y3Rpb24ocmVjb3JkLCBrZXksIGlkcykgewotICAgIHJlY29yZC5tYXRlcmlhbGl6ZUhhc01hbnko
a2V5LCBpZHMpOwotCi0gICAgLy8gVXBkYXRlIGFueSBleGlzdGluZyBtYW55IGFycmF5cyB0aGF0
IHVzZSB0aGUgcHJldmlvdXMgSURzLAotICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAgICByZWNvcmQu
aGFzTWFueURpZENoYW5nZShrZXkpOwotCi0gICAgdmFyIHJlbGF0aW9uc2hpcCA9IHJlY29yZC5j
YWNoZUZvcihrZXkpOwotCi0gICAgLy8gVE9ETyAodG9tZGFsZSkgdGhpcyBhc3N1bWVzIHRoYXQg
bG9hZEhhc01hbnkgKmFsd2F5cyogbWVhbnMKLSAgICAvLyB0aGF0IHRoZSByZWNvcmRzIGZvciB0
aGUgcHJvdmlkZWQgSURzIGFyZSBsb2FkZWQuCi0gICAgaWYgKHJlbGF0aW9uc2hpcCkgeyBzZXQo
cmVsYXRpb25zaGlwLCAnaXNMb2FkZWQnLCB0cnVlKTsgfQotICB9LAotCi0gIC8qKiBAcHJpdmF0
ZQotCi0gICAgU3RvcmVzIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaWQgY29tYmlu
YXRpb24gYW5kIHJldHVybnMKLSAgICB0aGUgY2xpZW50IGlkLgotCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IGRhdGEKLSAgICBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGlkCi0gICAgQHBhcmFtIHtEUy5N
b2RlbH0gdHlwZQotICAgIEByZXR1cm5zIHtOdW1iZXJ9Ci0gICovCi0gIHB1c2hEYXRhOiBmdW5j
dGlvbihkYXRhLCBpZCwgdHlwZSkgewotICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9y
KHR5cGUpOwotCi0gICAgdmFyIGlkVG9DbGllbnRJZE1hcCA9IHR5cGVNYXAuaWRUb0NpZCwKLSAg
ICAgICAgY2xpZW50SWRUb0lkTWFwID0gdGhpcy5jbGllbnRJZFRvSWQsCi0gICAgICAgIGNsaWVu
dElkVG9UeXBlTWFwID0gdGhpcy5jbGllbnRJZFRvVHlwZSwKLSAgICAgICAgY2xpZW50SWRzID0g
dHlwZU1hcC5jbGllbnRJZHMsCi0gICAgICAgIGNpZFRvRGF0YSA9IHRoaXMuY2xpZW50SWRUb0Rh
dGE7Ci0KLSAgICBFbWJlci5hc3NlcnQoJ1RoZSBpZCAnICsgaWQgKyAnIGhhcyBhbHJlYWR5IGJl
ZW4gdXNlZCB3aXRoIGFub3RoZXIgcmVjb3JkIG9mIHR5cGUgJyArIHR5cGUudG9TdHJpbmcoKSAr
ICcuJywgIWlkIHx8ICFpZFRvQ2xpZW50SWRNYXBbaWRdKTsKLQotICAgIHZhciBjbGllbnRJZCA9
ICsrdGhpcy5jbGllbnRJZENvdW50ZXI7Ci0KLSAgICBjaWRUb0RhdGFbY2xpZW50SWRdID0gZGF0
YTsKLSAgICBjbGllbnRJZFRvVHlwZU1hcFtjbGllbnRJZF0gPSB0eXBlOwotCi0gICAgLy8gaWYg
d2UncmUgY3JlYXRpbmcgYW4gaXRlbSwgdGhpcyBwcm9jZXNzIHdpbGwgYmUgZG9uZQotICAgIC8v
IGxhdGVyLCBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gcGVyc2lzdGVkLgotICAgIGlmIChpZCkg
ewotICAgICAgaWRUb0NsaWVudElkTWFwW2lkXSA9IGNsaWVudElkOwotICAgICAgY2xpZW50SWRU
b0lkTWFwW2NsaWVudElkXSA9IGlkOwotICAgIH0KLQotICAgIGNsaWVudElkcy5wdXNoKGNsaWVu
dElkKTsKLQotICAgIHJldHVybiBjbGllbnRJZDsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgotICAvLyAuIFJFQ09SRCBNQVRFUklBTElaQVRJT04gLgotICAvLyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gIG1hdGVyaWFsaXplUmVjb3JkOiBmdW5jdGlvbih0
eXBlLCBjbGllbnRJZCwgaWQpIHsKLSAgICB2YXIgcmVjb3JkOwotCi0gICAgdGhpcy5yZWNvcmRD
YWNoZVtjbGllbnRJZF0gPSByZWNvcmQgPSB0eXBlLl9jcmVhdGUoewotICAgICAgc3RvcmU6IHRo
aXMsCi0gICAgICBjbGllbnRJZDogY2xpZW50SWQKLSAgICB9KTsKLQotICAgIHNldChyZWNvcmQs
ICdpZCcsIGlkKTsKLQotICAgIGdldCh0aGlzLCAnZGVmYXVsdFRyYW5zYWN0aW9uJykuYWRvcHRS
ZWNvcmQocmVjb3JkKTsKLQotICAgIHJlY29yZC5sb2FkaW5nRGF0YSgpOwotICAgIHJldHVybiBy
ZWNvcmQ7Ci0gIH0sCi0KLSAgZGVtYXRlcmlhbGl6ZVJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7
Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyksCi0gICAgICAgIGNsaWVudElkID0gZ2V0
KHJlY29yZCwgJ2NsaWVudElkJyksCi0gICAgICAgIHR5cGUgPSB0aGlzLnR5cGVGb3JDbGllbnRJ
ZChjbGllbnRJZCksCi0gICAgICAgIHR5cGVNYXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSk7Ci0K
LSAgICByZWNvcmQudXBkYXRlUmVjb3JkQXJyYXlzKCk7Ci0KLSAgICBkZWxldGUgdGhpcy5yZWNv
cmRDYWNoZVtjbGllbnRJZF07Ci0gICAgZGVsZXRlIHRoaXMuY2xpZW50SWRUb0lkW2NsaWVudElk
XTsKLSAgICBkZWxldGUgdGhpcy5jbGllbnRJZFRvVHlwZVtjbGllbnRJZF07Ci0gICAgZGVsZXRl
IHRoaXMuY2xpZW50SWRUb0RhdGFbY2xpZW50SWRdOwotICAgIGRlbGV0ZSB0aGlzLnJlY29yZEFy
cmF5c0J5Q2xpZW50SWRbY2xpZW50SWRdOwotCi0gICAgaWYgKGlkKSB7IGRlbGV0ZSB0eXBlTWFw
LmlkVG9DaWRbaWRdOyB9Ci0gIH0sCi0KLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAg
IGlmIChnZXQoRFMsICdkZWZhdWx0U3RvcmUnKSA9PT0gdGhpcykgewotICAgICAgc2V0KERTLCAn
ZGVmYXVsdFN0b3JlJywgbnVsbCk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyAuIFJFTEFUSU9OU0hJUCBDSEFOR0VTIC4KLSAgLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uCi0KLSAgYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yOiBmdW5jdGlvbihj
bGllbnRSZWZlcmVuY2UsIGNoaWxkS2V5LCBwYXJlbnRSZWZlcmVuY2UsIHBhcmVudEtleSwgY2hh
bmdlKSB7Ci0gICAgdmFyIGNsaWVudElkID0gY2xpZW50UmVmZXJlbmNlLmNsaWVudElkLAotICAg
ICAgICBwYXJlbnRDbGllbnRJZCA9IHBhcmVudFJlZmVyZW5jZSA/IHBhcmVudFJlZmVyZW5jZS5j
bGllbnRJZCA6IHBhcmVudFJlZmVyZW5jZTsKLSAgICB2YXIga2V5ID0gY2hpbGRLZXkgKyBwYXJl
bnRLZXk7Ci0gICAgdmFyIGNoYW5nZXMgPSB0aGlzLnJlbGF0aW9uc2hpcENoYW5nZXM7Ci0gICAg
aWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykpIHsKLSAgICAgIGNoYW5nZXNbY2xpZW50SWRdID0g
e307Ci0gICAgfQotICAgIGlmICghKHBhcmVudENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50SWRd
KSkgewotICAgICAgY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50Q2xpZW50SWRdID0ge307Ci0gICAg
fQotICAgIGlmICghKGtleSBpbiBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF0pKSB7
Ci0gICAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XSA9IHt9OwotICAg
IH0KLSAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XVtjaGFuZ2UuY2hh
bmdlVHlwZV0gPSBjaGFuZ2U7Ci0gIH0sCi0KLSAgcmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdlRm9y
OiBmdW5jdGlvbihjbGllbnRSZWZlcmVuY2UsIGNoaWxkS2V5LCBwYXJlbnRSZWZlcmVuY2UsIHBh
cmVudEtleSwgdHlwZSkgewotICAgIHZhciBjbGllbnRJZCA9IGNsaWVudFJlZmVyZW5jZS5jbGll
bnRJZCwKLSAgICAgICAgcGFyZW50Q2xpZW50SWQgPSBwYXJlbnRSZWZlcmVuY2UgPyBwYXJlbnRS
ZWZlcmVuY2UuY2xpZW50SWQgOiBwYXJlbnRSZWZlcmVuY2U7Ci0gICAgdmFyIGNoYW5nZXMgPSB0
aGlzLnJlbGF0aW9uc2hpcENoYW5nZXM7Ci0gICAgdmFyIGtleSA9IGNoaWxkS2V5ICsgcGFyZW50
S2V5OwotICAgIGlmICghKGNsaWVudElkIGluIGNoYW5nZXMpIHx8ICEocGFyZW50Q2xpZW50SWQg
aW4gY2hhbmdlc1tjbGllbnRJZF0pIHx8ICEoa2V5IGluIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVu
dENsaWVudElkXSkpewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWxldGUgY2hhbmdlc1tj
bGllbnRJZF1bcGFyZW50Q2xpZW50SWRdW2tleV1bdHlwZV07Ci0gIH0sCi0KLSAgcmVsYXRpb25z
aGlwQ2hhbmdlRm9yOiBmdW5jdGlvbihjbGllbnRJZCwgY2hpbGRLZXksIHBhcmVudENsaWVudElk
LCBwYXJlbnRLZXksIHR5cGUpIHsKLSAgICB2YXIgY2hhbmdlcyA9IHRoaXMucmVsYXRpb25zaGlw
Q2hhbmdlczsKLSAgICB2YXIga2V5ID0gY2hpbGRLZXkgKyBwYXJlbnRLZXk7Ci0gICAgaWYgKCEo
Y2xpZW50SWQgaW4gY2hhbmdlcykgfHwgIShwYXJlbnRDbGllbnRJZCBpbiBjaGFuZ2VzW2NsaWVu
dElkXSkpewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZih0eXBlKXsKLSAgICAgIHJldHVy
biBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XVt0eXBlXTsKLSAgICB9Ci0g
ICAgZWxzZXsKLSAgICAgIC8vVE9ETyhJZ29yKSB3aGF0IGlmIGJvdGggcHJlc2VudAotICAgICAg
cmV0dXJuIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtrZXldWyJhZGQiXSB8fCBj
aGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XVsicmVtb3ZlIl07Ci0gICAgfQot
ICB9LAotCi0gIHJlbGF0aW9uc2hpcENoYW5nZVBhaXJzRm9yOiBmdW5jdGlvbihyZWZlcmVuY2Up
ewotICAgIHZhciB0b1JldHVybiA9IFtdOwotCi0gICAgaWYoICFyZWZlcmVuY2UgKSB7IHJldHVy
biB0b1JldHVybjsgfQotCi0gICAgLy9UT0RPKElnb3IpIFdoYXQgYWJvdXQgdGhlIG90aGVyIHNp
ZGUKLSAgICB2YXIgY2hhbmdlc09iamVjdCA9IHRoaXMucmVsYXRpb25zaGlwQ2hhbmdlc1tyZWZl
cmVuY2UuY2xpZW50SWRdOwotICAgIGZvciAodmFyIG9iaktleSBpbiBjaGFuZ2VzT2JqZWN0KXsK
LSAgICAgIGlmKGNoYW5nZXNPYmplY3QuaGFzT3duUHJvcGVydHkob2JqS2V5KSl7Ci0gICAgICAg
IGZvciAodmFyIGNoYW5nZUtleSBpbiBjaGFuZ2VzT2JqZWN0W29iaktleV0pewotICAgICAgICAg
IGlmKGNoYW5nZXNPYmplY3Rbb2JqS2V5XS5oYXNPd25Qcm9wZXJ0eShjaGFuZ2VLZXkpKXsKLSAg
ICAgICAgICAgIHRvUmV0dXJuLnB1c2goY2hhbmdlc09iamVjdFtvYmpLZXldW2NoYW5nZUtleV0p
OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdG9S
ZXR1cm47Ci0gIH0sCi0KLSAgcmVsYXRpb25zaGlwQ2hhbmdlc0ZvcjogZnVuY3Rpb24ocmVmZXJl
bmNlKSB7Ci0gICAgdmFyIHRvUmV0dXJuID0gW107Ci0KLSAgICBpZiggIXJlZmVyZW5jZSApIHsg
cmV0dXJuIHRvUmV0dXJuOyB9Ci0KLSAgICB2YXIgcmVsYXRpb25zaGlwUGFpcnMgPSB0aGlzLnJl
bGF0aW9uc2hpcENoYW5nZVBhaXJzRm9yKHJlZmVyZW5jZSk7Ci0gICAgZm9yRWFjaChyZWxhdGlv
bnNoaXBQYWlycywgZnVuY3Rpb24ocGFpcil7Ci0gICAgICB2YXIgYWRkZWRDaGFuZ2UgPSBwYWly
WyJhZGQiXTsKLSAgICAgIHZhciByZW1vdmVkQ2hhbmdlID0gcGFpclsicmVtb3ZlIl07Ci0gICAg
ICBpZihhZGRlZENoYW5nZSl7Ci0gICAgICAgIHRvUmV0dXJuLnB1c2goYWRkZWRDaGFuZ2UpOwot
ICAgICAgfQotICAgICAgaWYocmVtb3ZlZENoYW5nZSl7Ci0gICAgICAgIHRvUmV0dXJuLnB1c2go
cmVtb3ZlZENoYW5nZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHRvUmV0dXJuOwot
ICB9LAotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gUEVSLVRZUEUgQURBUFRF
UlMKLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gIGFkYXB0ZXJGb3JUeXBlOiBmdW5j
dGlvbih0eXBlKSB7Ci0gICAgdGhpcy5fYWRhcHRlcnNNYXAgPSB0aGlzLmNyZWF0ZUluc3RhbmNl
TWFwRm9yKCdhZGFwdGVycycpOwotCi0gICAgdmFyIGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyc01h
cC5nZXQodHlwZSk7Ci0gICAgaWYgKGFkYXB0ZXIpIHsgcmV0dXJuIGFkYXB0ZXI7IH0KLQotICAg
IHJldHVybiB0aGlzLmdldCgnX2FkYXB0ZXInKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBSRUNPUkQgQ0hBTkdFIE5PVElGSUNBVElPTiAuCi0g
IC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gIHJlY29yZEF0dHJpYnV0ZURp
ZENoYW5nZTogZnVuY3Rpb24ocmVmZXJlbmNlLCBhdHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSwgb2xk
VmFsdWUpIHsKLSAgICB2YXIgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JSZWZlcmVuY2UocmVmZXJl
bmNlKSwKLSAgICAgICAgZGlydHlTZXQgPSBuZXcgRW1iZXIuT3JkZXJlZFNldCgpLAotICAgICAg
ICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yVHlwZShyZWNvcmQuY29uc3RydWN0b3IpOwotCi0g
ICAgaWYgKGFkYXB0ZXIuZGlydHlSZWNvcmRzRm9yQXR0cmlidXRlQ2hhbmdlKSB7Ci0gICAgICBh
ZGFwdGVyLmRpcnR5UmVjb3Jkc0ZvckF0dHJpYnV0ZUNoYW5nZShkaXJ0eVNldCwgcmVjb3JkLCBh
dHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSwgb2xkVmFsdWUpOwotICAgIH0KLQotICAgIGRpcnR5U2V0
LmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQuYWRhcHRlckRpZERpcnR5
KCk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgcmVjb3JkQmVsb25nc1RvRGlkQ2hhbmdlOiBmdW5jdGlv
bihkaXJ0eVNldCwgY2hpbGQsIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBhZGFwdGVyID0gdGhp
cy5hZGFwdGVyRm9yVHlwZShjaGlsZC5jb25zdHJ1Y3Rvcik7Ci0KLSAgICBpZiAoYWRhcHRlci5k
aXJ0eVJlY29yZHNGb3JCZWxvbmdzVG9DaGFuZ2UpIHsKLSAgICAgIGFkYXB0ZXIuZGlydHlSZWNv
cmRzRm9yQmVsb25nc1RvQ2hhbmdlKGRpcnR5U2V0LCBjaGlsZCwgcmVsYXRpb25zaGlwKTsKLSAg
ICB9Ci0KLSAgICAvLyBhZGFwdGVyRGlkRGlydHkgaXMgY2FsbGVkIGJ5IHRoZSBSZWxhdGlvbnNo
aXBDaGFuZ2UgdGhhdCBjcmVhdGVkCi0gICAgLy8gdGhlIGRpcnR5U2V0LgotICB9LAotCi0gIHJl
Y29yZEhhc01hbnlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGRpcnR5U2V0LCBwYXJlbnQsIHJlbGF0aW9u
c2hpcCkgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yVHlwZShwYXJlbnQuY29u
c3RydWN0b3IpOwotCi0gICAgaWYgKGFkYXB0ZXIuZGlydHlSZWNvcmRzRm9ySGFzTWFueUNoYW5n
ZSkgewotICAgICAgYWRhcHRlci5kaXJ0eVJlY29yZHNGb3JIYXNNYW55Q2hhbmdlKGRpcnR5U2V0
LCBwYXJlbnQsIHJlbGF0aW9uc2hpcCk7Ci0gICAgfQotCi0gICAgLy8gYWRhcHRlckRpZERpcnR5
IGlzIGNhbGxlZCBieSB0aGUgUmVsYXRpb25zaGlwQ2hhbmdlIHRoYXQgY3JlYXRlZAotICAgIC8v
IHRoZSBkaXJ0eVNldC4KLSAgfQotfSk7Ci0KLURTLlN0b3JlLnJlb3BlbkNsYXNzKHsKLSAgcmVn
aXN0ZXJBZGFwdGVyOiBEUy5fTWFwcGFibGUuZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcignYWRhcHRl
cnMnLCBmdW5jdGlvbih0eXBlLCBhZGFwdGVyLCBtYXApIHsKLSAgICBtYXAuc2V0KHR5cGUsIGFk
YXB0ZXIpOwotICB9KSwKLQotICB0cmFuc2Zvcm1NYXBLZXk6IGZ1bmN0aW9uKGtleSkgewotICAg
IGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykgewotICAgICAgdmFyIHRyYW5zZm9ybWVkS2V5
OwotICAgICAgdHJhbnNmb3JtZWRLZXkgPSBnZXQoRW1iZXIubG9va3VwLCBrZXkpOwotICAgICAg
RW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCBtb2RlbCBhdCBwYXRoICIgKyBrZXksIHRyYW5z
Zm9ybWVkS2V5KTsKLSAgICAgIHJldHVybiB0cmFuc2Zvcm1lZEtleTsKLSAgICB9IGVsc2Ugewot
ICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gIH0sCi0KLSAgdHJhbnNmb3JtTWFwVmFsdWU6IGZ1
bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBpZiAoRW1iZXIuT2JqZWN0LmRldGVjdCh2YWx1ZSkp
IHsKLSAgICAgIHJldHVybiB2YWx1ZS5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFs
dWU7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwKLSAgICBv
bmNlID0gRW1iZXIucnVuLm9uY2UsIGFycmF5TWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFw
OwotCi0vKioKLSAgVGhpcyBmaWxlIGVuY2Fwc3VsYXRlcyB0aGUgdmFyaW91cyBzdGF0ZXMgdGhh
dCBhIHJlY29yZCBjYW4gdHJhbnNpdGlvbgotICB0aHJvdWdoIGR1cmluZyBpdHMgbGlmZWN5Y2xl
LgotCi0gICMjIyBTdGF0ZSBNYW5hZ2VyCi0KLSAgQSByZWNvcmQncyBzdGF0ZSBtYW5hZ2VyIGV4
cGxpY2l0bHkgdHJhY2tzIHdoYXQgc3RhdGUgYSByZWNvcmQgaXMgaW4KLSAgYXQgYW55IGdpdmVu
IHRpbWUuIEZvciBpbnN0YW5jZSwgaWYgYSByZWNvcmQgaXMgbmV3bHkgY3JlYXRlZCBhbmQgaGFz
Ci0gIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLCBpdCB3b3Vs
ZCBiZSBpbiB0aGUKLSAgYGNyZWF0ZWQudW5jb21taXR0ZWRgIHN0YXRlLiAgSWYgYSByZWNvcmQg
aGFzIGhhZCBsb2NhbCBtb2RpZmljYXRpb25zCi0gIG1hZGUgdG8gaXQgdGhhdCBhcmUgaW4gdGhl
IHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSByZWNvcmQgd291bGQgYmUKLSAgaW4gdGhlIGB1
cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4gKFRoZXNlIHN0YXRlIHBhdGhzIHdpbGwgYmUgZXhwbGFp
bmVkCi0gIGluIG1vcmUgZGV0YWlsIGJlbG93LikKLQotICBFdmVudHMgYXJlIHNlbnQgYnkgdGhl
IHJlY29yZCBvciBpdHMgc3RvcmUgdG8gdGhlIHJlY29yZCdzIHN0YXRlIG1hbmFnZXIuCi0gIEhv
dyB0aGUgc3RhdGUgbWFuYWdlciByZWFjdHMgdG8gdGhlc2UgZXZlbnRzIGlzIGRlcGVuZGVudCBv
biB3aGljaCBzdGF0ZQotICBpdCBpcyBpbi4gSW4gc29tZSBzdGF0ZXMsIGNlcnRhaW4gZXZlbnRz
IHdpbGwgYmUgaW52YWxpZCBhbmQgd2lsbCBjYXVzZQotICBhbiBleGNlcHRpb24gdG8gYmUgcmFp
c2VkLgotCi0gIFN0YXRlcyBhcmUgaGllcmFyY2hpY2FsLiBGb3IgZXhhbXBsZSwgYSByZWNvcmQg
Y2FuIGJlIGluIHRoZQotICBgZGVsZXRlZC5zdGFydGAgc3RhdGUsIHRoZW4gdHJhbnNpdGlvbiBp
bnRvIHRoZSBgZGVsZXRlZC5pbkZsaWdodGAgc3RhdGUuCi0gIElmIGEgY2hpbGQgc3RhdGUgZG9l
cyBub3QgaW1wbGVtZW50IGFuIGV2ZW50IGhhbmRsZXIsIHRoZSBzdGF0ZSBtYW5hZ2VyCi0gIHdp
bGwgYXR0ZW1wdCB0byBpbnZva2UgdGhlIGV2ZW50IG9uIGFsbCBwYXJlbnQgc3RhdGVzIHVudGls
IHRoZSByb290IHN0YXRlIGlzCi0gIHJlYWNoZWQuIFRoZSBzdGF0ZSBoaWVyYXJjaHkgb2YgYSBy
ZWNvcmQgaXMgZGVzY3JpYmVkIGluIHRlcm1zIG9mIGEgcGF0aAotICBzdHJpbmcuIFlvdSBjYW4g
ZGV0ZXJtaW5lIGEgcmVjb3JkJ3MgY3VycmVudCBzdGF0ZSBieSBnZXR0aW5nIGl0cyBtYW5hZ2Vy
J3MKLSAgY3VycmVudCBzdGF0ZSBwYXRoOgotCi0gICAgICByZWNvcmQuZ2V0KCdzdGF0ZU1hbmFn
ZXIuY3VycmVudFBhdGgnKTsKLSAgICAgIC8vPT4gImNyZWF0ZWQudW5jb21taXR0ZWQiCi0KLSAg
VGhlIGBEUy5Nb2RlbGAgc3RhdGVzIGFyZSB0aGVtc2VsdmVzIHN0YXRlbGVzcy4gV2hhdCB3ZSBt
ZWFuIGlzIHRoYXQsCi0gIHRob3VnaCBlYWNoIGluc3RhbmNlIG9mIGEgcmVjb3JkIGFsc28gaGFz
IGEgdW5pcXVlIGluc3RhbmNlIG9mIGEKLSAgYERTLlN0YXRlTWFuYWdlcmAsIHRoZSBoaWVyYXJj
aGljYWwgc3RhdGVzIHRoYXQgZWFjaCBvZiAqdGhvc2UqIHBvaW50cwotICB0byBpcyBhIHNoYXJl
ZCBkYXRhIHN0cnVjdHVyZS4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGluc3RlYWQgb2YgZWFj
aAotICByZWNvcmQgZ2V0dGluZyBpdHMgb3duIGNvcHkgb2YgdGhlIGhpZXJhcmNoeSBvZiBzdGF0
ZXMsIGVhY2ggc3RhdGUKLSAgbWFuYWdlciBwb2ludHMgdG8gdGhpcyBnbG9iYWwsIGltbXV0YWJs
ZSBzaGFyZWQgaW5zdGFuY2UuIEhvdyBkb2VzIGEKLSAgc3RhdGUga25vdyB3aGljaCByZWNvcmQg
aXQgc2hvdWxkIGJlIGFjdGluZyBvbj8gIFdlIHBhc3MgYSByZWZlcmVuY2UgdG8KLSAgdGhlIGN1
cnJlbnQgc3RhdGUgbWFuYWdlciBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIGV2ZXJ5IG1ldGhv
ZCBpbnZva2VkCi0gIG9uIGEgc3RhdGUuCi0KLSAgVGhlIHN0YXRlIG1hbmFnZXIgcGFzc2VkIGFz
IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgd2hlcmUgeW91IHNob3VsZCBzdGFzaAotICBzdGF0ZSBh
Ym91dCB0aGUgcmVjb3JkIGlmIG5lZWRlZDsgeW91IHNob3VsZCBuZXZlciBzdG9yZSBkYXRhIG9u
IHRoZSBzdGF0ZQotICBvYmplY3QgaXRzZWxmLiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gdGhlIHJl
Y29yZCBiZWluZyBhY3RlZCBvbiwgeW91IGNhbgotICByZXRyaWV2ZSB0aGUgc3RhdGUgbWFuYWdl
cidzIGByZWNvcmRgIHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZAotICBhbiBldmVu
dCBoYW5kbGVyIGBteUV2ZW50YDoKLQotICAgICAgbXlFdmVudDogZnVuY3Rpb24obWFuYWdlcikg
ewotICAgICAgICB2YXIgcmVjb3JkID0gbWFuYWdlci5nZXQoJ3JlY29yZCcpOwotICAgICAgICBy
ZWNvcmQuZG9Tb21ldGhpbmcoKTsKLSAgICAgIH0KLQotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBh
Ym91dCBzdGF0ZSBtYW5hZ2VycyBpbiBnZW5lcmFsLCBzZWUgdGhlIEVtYmVyLmpzCi0gIGRvY3Vt
ZW50YXRpb24gb24gYEVtYmVyLlN0YXRlTWFuYWdlcmAuCi0KLSAgIyMjIEV2ZW50cywgRmxhZ3Ms
IGFuZCBUcmFuc2l0aW9ucwotCi0gIEEgc3RhdGUgbWF5IGltcGxlbWVudCB6ZXJvIG9yIG1vcmUg
ZXZlbnRzLCBmbGFncywgb3IgdHJhbnNpdGlvbnMuCi0KLSAgIyMjIyBFdmVudHMKLQotICBFdmVu
dHMgYXJlIG5hbWVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnZva2VkIHdoZW4gc2VudCB0byBhIHJl
Y29yZC4gVGhlCi0gIHN0YXRlIG1hbmFnZXIgd2lsbCBmaXJzdCBsb29rIGZvciBhIG1ldGhvZCB3
aXRoIHRoZSBnaXZlbiBuYW1lIG9uIHRoZQotICBjdXJyZW50IHN0YXRlLiBJZiBubyBtZXRob2Qg
aXMgZm91bmQsIGl0IHdpbGwgc2VhcmNoIHRoZSBjdXJyZW50IHN0YXRlJ3MKLSAgcGFyZW50LCBh
bmQgdGhlbiBpdHMgZ3JhbmRwYXJlbnQsIGFuZCBzbyBvbiB1bnRpbCByZWFjaGluZyB0aGUgdG9w
IG9mCi0gIHRoZSBoaWVyYXJjaHkuIElmIHRoZSByb290IGlzIHJlYWNoZWQgd2l0aG91dCBhbiBl
dmVudCBoYW5kbGVyIGJlaW5nIGZvdW5kLAotICBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQu
IFRoaXMgY2FuIGJlIHZlcnkgaGVscGZ1bCB3aGVuIGRlYnVnZ2luZyBuZXcKLSAgZmVhdHVyZXMu
Ci0KLSAgSGVyZSdzIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBzdGF0ZSB3aXRoIGEg
YG15RXZlbnRgIGV2ZW50IGhhbmRsZXI6Ci0KLSAgICAgIGFTdGF0ZTogRFMuU3RhdGUuY3JlYXRl
KHsKLSAgICAgICAgbXlFdmVudDogZnVuY3Rpb24obWFuYWdlciwgcGFyYW0pIHsKLSAgICAgICAg
ICBjb25zb2xlLmxvZygiUmVjZWl2ZWQgbXlFdmVudCB3aXRoICIrcGFyYW0pOwotICAgICAgICB9
Ci0gICAgICB9KQotCi0gIFRvIHRyaWdnZXIgdGhpcyBldmVudDoKLQotICAgICAgcmVjb3JkLnNl
bmQoJ215RXZlbnQnLCAnZm9vJyk7Ci0gICAgICAvLz0+ICJSZWNlaXZlZCBteUV2ZW50IHdpdGgg
Zm9vIgotCi0gIE5vdGUgdGhhdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgY2FuIGJlIHNlbnQgdG8g
YSByZWNvcmQncyBgc2VuZCgpYCBtZXRob2QsCi0gIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFzIHRo
ZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBldmVudCBoYW5kbGVyLgotCi0gIEV2ZW50cyBzaG91
bGQgdHJhbnNpdGlvbiB0byBhIGRpZmZlcmVudCBzdGF0ZSBpZiBhcHByb3ByaWF0ZS4gVGhpcyBj
YW4gYmUKLSAgZG9uZSBieSBjYWxsaW5nIHRoZSBzdGF0ZSBtYW5hZ2VyJ3MgYHRyYW5zaXRpb25U
bygpYCBtZXRob2Qgd2l0aCBhIHBhdGggdG8gdGhlCi0gIGRlc2lyZWQgc3RhdGUuIFRoZSBzdGF0
ZSBtYW5hZ2VyIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzdGF0ZSBwYXRoCi0gIHJlbGF0
aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlLiBJZiBubyBzdGF0ZSBpcyBmb3VuZCBhdCB0aGF0IHBh
dGgsIGl0IHdpbGwKLSAgYXR0ZW1wdCB0byByZXNvbHZlIGl0IHJlbGF0aXZlIHRvIHRoZSBjdXJy
ZW50IHN0YXRlJ3MgcGFyZW50LCBhbmQgdGhlbiBpdHMKLSAgcGFyZW50LCBhbmQgc28gb24gdW50
aWwgdGhlIHJvb3QgaXMgcmVhY2hlZC4gRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBoaWVyYXJjaHkK
LSAgbGlrZSB0aGlzOgotCi0gICAgICAqIGNyZWF0ZWQKLSAgICAgICAgKiBzdGFydCA8LS0gY3Vy
cmVudFN0YXRlCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAgICogdXBkYXRlZAotICAgICAgICAq
IGluRmxpZ2h0Ci0KLSAgSWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgYHN0YXJ0YCBzdGF0ZSwg
Y2FsbGluZwotICBgdHJhbnNpdGlvblRvKCdpbkZsaWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRv
IHRoZSBgY3JlYXRlZC5pbkZsaWdodGAgc3RhdGUsCi0gIHdoaWxlIGNhbGxpbmcgYHRyYW5zaXRp
b25UbygndXBkYXRlZC5pbkZsaWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvCi0gIHRoZSBgdXBk
YXRlZC5pbkZsaWdodGAgc3RhdGUuCi0KLSAgUmVtZW1iZXIgdGhhdCAqb25seSBldmVudHMqIHNo
b3VsZCBldmVyIGNhdXNlIGEgc3RhdGUgdHJhbnNpdGlvbi4gWW91IHNob3VsZAotICBuZXZlciBj
YWxsIGB0cmFuc2l0aW9uVG8oKWAgZnJvbSBvdXRzaWRlIGEgc3RhdGUncyBldmVudCBoYW5kbGVy
LiBJZiB5b3UgYXJlCi0gIHRlbXB0ZWQgdG8gZG8gc28sIGNyZWF0ZSBhIG5ldyBldmVudCBhbmQg
c2VuZCB0aGF0IHRvIHRoZSBzdGF0ZSBtYW5hZ2VyLgotCi0gICMjIyMgRmxhZ3MKLQotICBGbGFn
cyBhcmUgQm9vbGVhbiB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRyb3NwZWN0IGEgcmVj
b3JkJ3MgY3VycmVudAotICBzdGF0ZSBpbiBhIG1vcmUgdXNlci1mcmllbmRseSB3YXkgdGhhbiBl
eGFtaW5pbmcgaXRzIHN0YXRlIHBhdGguIEZvciBleGFtcGxlLAotICBpbnN0ZWFkIG9mIGRvaW5n
IHRoaXM6Ci0KLSAgICAgIHZhciBzdGF0ZVBhdGggPSByZWNvcmQuZ2V0KCdzdGF0ZU1hbmFnZXIu
Y3VycmVudFBhdGgnKTsKLSAgICAgIGlmIChzdGF0ZVBhdGggPT09ICdjcmVhdGVkLmluRmxpZ2h0
JykgewotICAgICAgICBkb1NvbWV0aGluZygpOwotICAgICAgfQotCi0gIFlvdSBjYW4gc2F5Ogot
Ci0gICAgICBpZiAocmVjb3JkLmdldCgnaXNOZXcnKSAmJiByZWNvcmQuZ2V0KCdpc1NhdmluZycp
KSB7Ci0gICAgICAgIGRvU29tZXRoaW5nKCk7Ci0gICAgICB9Ci0KLSAgSWYgeW91ciBzdGF0ZSBk
b2VzIG5vdCBzZXQgYSB2YWx1ZSBmb3IgYSBnaXZlbiBmbGFnLCB0aGUgdmFsdWUgd2lsbAotICBi
ZSBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IChvciB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIHN0
YXRlIGhpZXJhcmNoeQotICB3aGVyZSBpdCBpcyBkZWZpbmVkKS4KLQotICBUaGUgY3VycmVudCBz
ZXQgb2YgZmxhZ3MgYXJlIGRlZmluZWQgYmVsb3cuIElmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyBm
bGFnLAotICBpbiBhZGRpdGlvbiB0byB0aGUgYXJlYSBiZWxvdywgeW91IHdpbGwgYWxzbyBuZWVk
IHRvIGRlY2xhcmUgaXQgaW4gdGhlCi0gIGBEUy5Nb2RlbGAgY2xhc3MuCi0KLSAgIyMjIyBUcmFu
c2l0aW9ucwotCi0gIFRyYW5zaXRpb25zIGFyZSBsaWtlIGV2ZW50IGhhbmRsZXJzIGJ1dCBhcmUg
Y2FsbGVkIGF1dG9tYXRpY2FsbHkgdXBvbgotICBlbnRlcmluZyBvciBleGl0aW5nIGEgc3RhdGUu
IFRvIGltcGxlbWVudCBhIHRyYW5zaXRpb24sIGp1c3QgY2FsbCBhIG1ldGhvZAotICBlaXRoZXIg
YGVudGVyYCBvciBgZXhpdGA6Ci0KLSAgICAgIG15U3RhdGU6IERTLlN0YXRlLmNyZWF0ZSh7Ci0g
ICAgICAgIC8vIEdldHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBlbnRlcmluZwotICAgICAg
ICAvLyB0aGlzIHN0YXRlLgotICAgICAgICBlbnRlcjogZnVuY3Rpb24obWFuYWdlcikgewotICAg
ICAgICAgIGNvbnNvbGUubG9nKCJFbnRlcmVkIG15U3RhdGUiKTsKLSAgICAgICAgfQotICAgICAg
fSkKLQotICAgTm90ZSB0aGF0IGVudGVyIGFuZCBleGl0IGV2ZW50cyBhcmUgY2FsbGVkIG9uY2Ug
cGVyIHRyYW5zaXRpb24uIElmIHRoZQotICAgY3VycmVudCBzdGF0ZSBjaGFuZ2VzLCBidXQgY2hh
bmdlcyB0byBhbm90aGVyIGNoaWxkIHN0YXRlIG9mIHRoZSBwYXJlbnQsCi0gICB0aGUgdHJhbnNp
dGlvbiBldmVudCBvbiB0aGUgcGFyZW50IHdpbGwgbm90IGJlIHRyaWdnZXJlZC4KLSovCi0KLXZh
ciBzdGF0ZVByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gIHZhciBw
YXJlbnQgPSBnZXQodGhpcywgJ3BhcmVudFN0YXRlJyk7Ci0gIGlmIChwYXJlbnQpIHsKLSAgICBy
ZXR1cm4gZ2V0KHBhcmVudCwga2V5KTsKLSAgfQotfSkucHJvcGVydHkoKTsKLQotdmFyIGlzRW1w
dHlPYmplY3QgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3Qp
IHsKLSAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7IHJldHVybiBmYWxzZTsg
fQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19OwotCi12YXIgaGFzRGVmaW5lZFByb3BlcnRpZXMg
PSBmdW5jdGlvbihvYmplY3QpIHsKLSAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHsKLSAgICBp
ZiAob2JqZWN0Lmhhc093blByb3BlcnR5KG5hbWUpICYmIG9iamVjdFtuYW1lXSkgeyByZXR1cm4g
dHJ1ZTsgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfTsKLQotdmFyIGRpZENoYW5nZURhdGEg
PSBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29y
ZCcpOwotICByZWNvcmQubWF0ZXJpYWxpemVEYXRhKCk7Ci19OwotCi12YXIgd2lsbFNldFByb3Bl
cnR5ID0gZnVuY3Rpb24obWFuYWdlciwgY29udGV4dCkgewotICBjb250ZXh0Lm9sZFZhbHVlID0g
Z2V0KGdldChtYW5hZ2VyLCAncmVjb3JkJyksIGNvbnRleHQubmFtZSk7Ci0KLSAgdmFyIGNoYW5n
ZSA9IERTLkF0dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UoY29udGV4dCk7Ci0gIGdldChtYW5h
Z2VyLCAncmVjb3JkJykuX2NoYW5nZXNUb1N5bmNbY29udGV4dC5hdHRyaWJ1dGVOYW1lXSA9IGNo
YW5nZTsKLX07Ci0KLXZhciBkaWRTZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRl
eHQpIHsKLSAgdmFyIGNoYW5nZSA9IGdldChtYW5hZ2VyLCAncmVjb3JkJykuX2NoYW5nZXNUb1N5
bmNbY29udGV4dC5hdHRyaWJ1dGVOYW1lXTsKLSAgY2hhbmdlLnZhbHVlID0gZ2V0KGdldChtYW5h
Z2VyLCAncmVjb3JkJyksIGNvbnRleHQubmFtZSk7Ci0gIGNoYW5nZS5zeW5jKCk7Ci19OwotCi0v
LyBXaGVuZXZlciBhIHByb3BlcnR5IGlzIHNldCwgcmVjb21wdXRlIGFsbCBkZXBlbmRlbnQgZmls
dGVycwotdmFyIHVwZGF0ZVJlY29yZEFycmF5cyA9IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgdmFy
IHJlY29yZCA9IG1hbmFnZXIuZ2V0KCdyZWNvcmQnKTsKLSAgcmVjb3JkLnVwZGF0ZVJlY29yZEFy
cmF5c0xhdGVyKCk7Ci19OwotCi1EUy5TdGF0ZSA9IEVtYmVyLlN0YXRlLmV4dGVuZCh7Ci0gIGlz
TG9hZGVkOiBzdGF0ZVByb3BlcnR5LAotICBpc1JlbG9hZGluZzogc3RhdGVQcm9wZXJ0eSwKLSAg
aXNEaXJ0eTogc3RhdGVQcm9wZXJ0eSwKLSAgaXNTYXZpbmc6IHN0YXRlUHJvcGVydHksCi0gIGlz
RGVsZXRlZDogc3RhdGVQcm9wZXJ0eSwKLSAgaXNFcnJvcjogc3RhdGVQcm9wZXJ0eSwKLSAgaXNO
ZXc6IHN0YXRlUHJvcGVydHksCi0gIGlzVmFsaWQ6IHN0YXRlUHJvcGVydHksCi0KLSAgLy8gRm9y
IHN0YXRlcyB0aGF0IGFyZSBzdWJzdGF0ZXMgb2YgYQotICAvLyBEaXJ0eVN0YXRlICh1cGRhdGVk
IG9yIGNyZWF0ZWQpLCBpdCBpcwotICAvLyB1c2VmdWwgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUg
d2hpY2gKLSAgLy8gdHlwZSBvZiBkaXJ0eSBzdGF0ZSBpdCBpcy4KLSAgZGlydHlUeXBlOiBzdGF0
ZVByb3BlcnR5Ci19KTsKLQotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLwotLy8gRWFjaCBz
dGF0ZSBoYXMgYSBib29sZWFuIHZhbHVlIGZvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoK
LS8vCi0vLyAqIGlzTG9hZGVkOiBUaGUgcmVjb3JkIGhhcyBhIHBvcHVsYXRlZCBgZGF0YWAgcHJv
cGVydHkuIFdoZW4gYQotLy8gICByZWNvcmQgaXMgbG9hZGVkIHZpYSBgc3RvcmUuZmluZGAsIGBp
c0xvYWRlZGAgaXMgZmFsc2UKLS8vICAgdW50aWwgdGhlIGFkYXB0ZXIgc2V0cyBpdC4gV2hlbiBh
IHJlY29yZCBpcyBjcmVhdGVkIGxvY2FsbHksCi0vLyAgIGl0cyBgaXNMb2FkZWRgIHByb3BlcnR5
IGlzIGFsd2F5cyB0cnVlLgotLy8gKiBpc0RpcnR5OiBUaGUgcmVjb3JkIGhhcyBsb2NhbCBjaGFu
Z2VzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KLS8vICAgc2F2ZWQgYnkgdGhlIGFkYXB0ZXIuIFRo
aXMgaW5jbHVkZXMgcmVjb3JkcyB0aGF0IGhhdmUgYmVlbgotLy8gICBjcmVhdGVkIChidXQgbm90
IHlldCBzYXZlZCkgb3IgZGVsZXRlZC4KLS8vICogaXNTYXZpbmc6IFRoZSByZWNvcmQncyB0cmFu
c2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQsIGJ1dAotLy8gICB0aGUgYWRhcHRlciBoYXMgbm90
IHlldCBhY2tub3dsZWRnZWQgdGhhdCB0aGUgY2hhbmdlcyBoYXZlCi0vLyAgIGJlZW4gcGVyc2lz
dGVkIHRvIHRoZSBiYWNrZW5kLgotLy8gKiBpc0RlbGV0ZWQ6IFRoZSByZWNvcmQgd2FzIG1hcmtl
ZCBmb3IgZGVsZXRpb24uIFdoZW4gYGlzRGVsZXRlZGAKLS8vICAgaXMgdHJ1ZSBhbmQgYGlzRGly
dHlgIGlzIHRydWUsIHRoZSByZWNvcmQgaXMgZGVsZXRlZCBsb2NhbGx5Ci0vLyAgIGJ1dCB0aGUg
ZGVsZXRpb24gd2FzIG5vdCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMKLS8vICAg
dHJ1ZSwgdGhlIGNoYW5nZSBpcyBpbi1mbGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0eWAgYW5kCi0v
LyAgIGBpc1NhdmluZ2AgYXJlIGZhbHNlLCB0aGUgY2hhbmdlIGhhcyBwZXJzaXN0ZWQuCi0vLyAq
IGlzRXJyb3I6IFRoZSBhZGFwdGVyIHJlcG9ydGVkIHRoYXQgaXQgd2FzIHVuYWJsZSB0byBzYXZl
Ci0vLyAgIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0
IGluIHRoZQotLy8gICByZWNvcmQgaGF2aW5nIGl0cyBgaXNWYWxpZGAgcHJvcGVydHkgYmVjb21l
IGZhbHNlIGlmIHRoZQotLy8gICBhZGFwdGVyIHJlcG9ydGVkIHRoYXQgc2VydmVyLXNpZGUgdmFs
aWRhdGlvbnMgZmFpbGVkLgotLy8gKiBpc05ldzogVGhlIHJlY29yZCB3YXMgY3JlYXRlZCBvbiB0
aGUgY2xpZW50IGFuZCB0aGUgYWRhcHRlcgotLy8gICBkaWQgbm90IHlldCByZXBvcnQgdGhhdCBp
dCB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLgotLy8gKiBpc1ZhbGlkOiBObyBjbGllbnQtc2lkZSB2
YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCBhbmQgdGhlCi0vLyAgIGFkYXB0ZXIgZGlkIG5vdCByZXBv
cnQgYW55IHNlcnZlci1zaWRlIHZhbGlkYXRpb24gZmFpbHVyZXMuCi0KLS8vIFRoZSBkaXJ0eSBz
dGF0ZSBpcyBhIGFic3RyYWN0IHN0YXRlIHdob3NlIGZ1bmN0aW9uYWxpdHkgaXMKLS8vIHNoYXJl
ZCBiZXR3ZWVuIHRoZSBgY3JlYXRlZGAgYW5kIGB1cGRhdGVkYCBzdGF0ZXMuCi0vLwotLy8gVGhl
IGRlbGV0ZWQgc3RhdGUgc2hhcmVzIHRoZSBgaXNEaXJ0eWAgZmxhZyB3aXRoIHRoZQotLy8gc3Vi
Y2xhc3NlcyBvZiBgRGlydHlTdGF0ZWAsIGJ1dCB3aXRoIGEgdmVyeSBkaWZmZXJlbnQKLS8vIGlt
cGxlbWVudGF0aW9uLgotLy8KLS8vIERpcnR5IHN0YXRlcyBoYXZlIHRocmVlIGNoaWxkIHN0YXRl
czoKLS8vCi0vLyBgdW5jb21taXR0ZWRgOiB0aGUgc3RvcmUgaGFzIG5vdCB5ZXQgaGFuZGVkIG9m
ZiB0aGUgcmVjb3JkCi0vLyAgIHRvIGJlIHNhdmVkLgotLy8gYGluRmxpZ2h0YDogdGhlIHN0b3Jl
IGhhcyBoYW5kZWQgb2ZmIHRoZSByZWNvcmQgdG8gYmUgc2F2ZWQsCi0vLyAgIGJ1dCB0aGUgYWRh
cHRlciBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgc3VjY2Vzcy4KLS8vIGBpbnZhbGlkYDogdGhl
IHJlY29yZCBoYXMgaW52YWxpZCBpbmZvcm1hdGlvbiBhbmQgY2Fubm90IGJlCi0vLyAgIHNlbmQg
dG8gdGhlIGFkYXB0ZXIgeWV0LgotdmFyIERpcnR5U3RhdGUgPSBEUy5TdGF0ZS5leHRlbmQoewot
ICBpbml0aWFsU3RhdGU6ICd1bmNvbW1pdHRlZCcsCi0KLSAgLy8gRkxBR1MKLSAgaXNEaXJ0eTog
dHJ1ZSwKLQotICAvLyBTVUJTVEFURVMKLQotICAvLyBXaGVuIGEgcmVjb3JkIGZpcnN0IGJlY29t
ZXMgZGlydHksIGl0IGlzIGB1bmNvbW1pdHRlZGAuCi0gIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGVy
ZSBhcmUgbG9jYWwgcGVuZGluZyBjaGFuZ2VzLCBidXQgdGhleQotICAvLyBoYXZlIG5vdCB5ZXQg
YmVndW4gdG8gYmUgc2F2ZWQsIGFuZCBhcmUgbm90IGludmFsaWQuCi0gIHVuY29tbWl0dGVkOiBE
Uy5TdGF0ZS5leHRlbmQoewotICAgIC8vIFRSQU5TSVRJT05TCi0gICAgZW50ZXI6IGZ1bmN0aW9u
KG1hbmFnZXIpIHsKLSAgICAgIHZhciBkaXJ0eVR5cGUgPSBnZXQodGhpcywgJ2RpcnR5VHlwZScp
LAotICAgICAgICAgIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0KLSAgICAgIHJl
Y29yZC53aXRoVHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHsKLSAgICAgICAgdC5yZWNvcmRCZWNh
bWVEaXJ0eShkaXJ0eVR5cGUsIHJlY29yZCk7Ci0gICAgICB9KTsKLSAgICB9LAotCi0gICAgLy8g
RVZFTlRTCi0gICAgd2lsbFNldFByb3BlcnR5OiB3aWxsU2V0UHJvcGVydHksCi0gICAgZGlkU2V0
UHJvcGVydHk6IGRpZFNldFByb3BlcnR5LAotCi0gICAgYmVjb21lRGlydHk6IEVtYmVyLkssCi0K
LSAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICBtYW5hZ2VyLnRyYW5z
aXRpb25UbygnaW5GbGlnaHQnKTsKLSAgICB9LAotCi0gICAgYmVjYW1lQ2xlYW46IGZ1bmN0aW9u
KG1hbmFnZXIpIHsKLSAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpLAot
ICAgICAgICAgIGRpcnR5VHlwZSA9IGdldCh0aGlzLCAnZGlydHlUeXBlJyk7Ci0KLSAgICAgIHJl
Y29yZC53aXRoVHJhbnNhY3Rpb24oZnVuY3Rpb24odCkgewotICAgICAgICB0LnJlY29yZEJlY2Ft
ZUNsZWFuKGRpcnR5VHlwZSwgcmVjb3JkKTsKLSAgICAgIH0pOwotCi0gICAgICBtYW5hZ2VyLnRy
YW5zaXRpb25UbygnbG9hZGVkLm1hdGVyaWFsaXppbmcnKTsKLSAgICB9LAotCi0gICAgYmVjYW1l
SW52YWxpZDogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgdmFyIGRpcnR5VHlwZSA9IGdldCh0
aGlzLCAnZGlydHlUeXBlJyksCi0gICAgICAgICAgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNv
cmQnKTsKLQotICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbiAodCkgewotICAg
ICAgICB0LnJlY29yZEJlY2FtZUluRmxpZ2h0KGRpcnR5VHlwZSwgcmVjb3JkKTsKLSAgICAgIH0p
OwotCi0gICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygnaW52YWxpZCcpOwotICAgIH0sCi0KLSAg
ICByb2xsYmFjazogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgZ2V0KG1hbmFnZXIsICdyZWNv
cmQnKS5yb2xsYmFjaygpOwotICAgIH0KLSAgfSksCi0KLSAgLy8gT25jZSBhIHJlY29yZCBoYXMg
YmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBhZGFwdGVyIHRvIGJlCi0gIC8vIHNhdmVkLCBpdCBpcyBp
biB0aGUgJ2luIGZsaWdodCcgc3RhdGUuIENoYW5nZXMgdG8gdGhlCi0gIC8vIHJlY29yZCBjYW5u
b3QgYmUgbWFkZSBkdXJpbmcgdGhpcyB3aW5kb3cuCi0gIGluRmxpZ2h0OiBEUy5TdGF0ZS5leHRl
bmQoewotICAgIC8vIEZMQUdTCi0gICAgaXNTYXZpbmc6IHRydWUsCi0KLSAgICAvLyBUUkFOU0lU
SU9OUwotICAgIGVudGVyOiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICB2YXIgZGlydHlUeXBl
ID0gZ2V0KHRoaXMsICdkaXJ0eVR5cGUnKSwKLSAgICAgICAgICByZWNvcmQgPSBnZXQobWFuYWdl
ciwgJ3JlY29yZCcpOwotCi0gICAgICByZWNvcmQuYmVjYW1lSW5GbGlnaHQoKTsKLQotICAgICAg
cmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbiAodCkgewotICAgICAgICB0LnJlY29yZEJl
Y2FtZUluRmxpZ2h0KGRpcnR5VHlwZSwgcmVjb3JkKTsKLSAgICAgIH0pOwotICAgIH0sCi0KLSAg
ICAvLyBFVkVOVFMKLSAgICBkaWRDb21taXQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgIHZh
ciBkaXJ0eVR5cGUgPSBnZXQodGhpcywgJ2RpcnR5VHlwZScpLAotICAgICAgICAgIHJlY29yZCA9
IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0KLSAgICAgIHJlY29yZC53aXRoVHJhbnNhY3Rpb24o
ZnVuY3Rpb24odCkgewotICAgICAgICB0LnJlY29yZEJlY2FtZUNsZWFuKCdpbmZsaWdodCcsIHJl
Y29yZCk7Ci0gICAgICB9KTsKLQotICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ3NhdmVkJyk7
Ci0gICAgICBtYW5hZ2VyLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycsIGRpcnR5VHlw
ZSk7Ci0gICAgfSwKLQotICAgIGJlY2FtZUludmFsaWQ6IGZ1bmN0aW9uKG1hbmFnZXIsIGVycm9y
cykgewotICAgICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0KLSAgICAg
IHNldChyZWNvcmQsICdlcnJvcnMnLCBlcnJvcnMpOwotCi0gICAgICBtYW5hZ2VyLnRyYW5zaXRp
b25UbygnaW52YWxpZCcpOwotICAgICAgbWFuYWdlci5zZW5kKCdpbnZva2VMaWZlY3ljbGVDYWxs
YmFja3MnKTsKLSAgICB9LAotCi0gICAgYmVjYW1lRXJyb3I6IGZ1bmN0aW9uKG1hbmFnZXIpIHsK
LSAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdlcnJvcicpOwotICAgICAgbWFuYWdlci5zZW5k
KCdpbnZva2VMaWZlY3ljbGVDYWxsYmFja3MnKTsKLSAgICB9Ci0gIH0pLAotCi0gIC8vIEEgcmVj
b3JkIGlzIGluIHRoZSBgaW52YWxpZGAgc3RhdGUgd2hlbiBpdHMgY2xpZW50LXNpZGUKLSAgLy8g
aW52YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCwgb3IgaWYgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRl
ZAotICAvLyB0aGUgdGhlIHJlY29yZCBmYWlsZWQgc2VydmVyLXNpZGUgaW52YWxpZGF0aW9ucy4K
LSAgaW52YWxpZDogRFMuU3RhdGUuZXh0ZW5kKHsKLSAgICAvLyBGTEFHUwotICAgIGlzVmFsaWQ6
IGZhbHNlLAotCi0gICAgZXhpdDogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgdmFyIHJlY29y
ZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0KLSAgICAgIHJlY29yZC53aXRoVHJhbnNhY3Rp
b24oZnVuY3Rpb24gKHQpIHsKLSAgICAgICAgdC5yZWNvcmRCZWNhbWVDbGVhbignaW5mbGlnaHQn
LCByZWNvcmQpOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIEVWRU5UUwotICAgIGRlbGV0
ZVJlY29yZDogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8o
J2RlbGV0ZWQnKTsKLSAgICAgIGdldChtYW5hZ2VyLCAncmVjb3JkJykuY2xlYXJSZWxhdGlvbnNo
aXBzKCk7Ci0gICAgfSwKLQotICAgIHdpbGxTZXRQcm9wZXJ0eTogd2lsbFNldFByb3BlcnR5LAot
Ci0gICAgZGlkU2V0UHJvcGVydHk6IGZ1bmN0aW9uKG1hbmFnZXIsIGNvbnRleHQpIHsKLSAgICAg
IHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpLAotICAgICAgICAgIGVycm9ycyA9
IGdldChyZWNvcmQsICdlcnJvcnMnKSwKLSAgICAgICAgICBrZXkgPSBjb250ZXh0Lm5hbWU7Ci0K
LSAgICAgIHNldChlcnJvcnMsIGtleSwgbnVsbCk7Ci0KLSAgICAgIGlmICghaGFzRGVmaW5lZFBy
b3BlcnRpZXMoZXJyb3JzKSkgewotICAgICAgICBtYW5hZ2VyLnNlbmQoJ2JlY2FtZVZhbGlkJyk7
Ci0gICAgICB9Ci0KLSAgICAgIGRpZFNldFByb3BlcnR5KG1hbmFnZXIsIGNvbnRleHQpOwotICAg
IH0sCi0KLSAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLQotICAgIHJvbGxiYWNrOiBmdW5jdGlv
bihtYW5hZ2VyKSB7Ci0gICAgICBtYW5hZ2VyLnNlbmQoJ2JlY2FtZVZhbGlkJyk7Ci0gICAgICBt
YW5hZ2VyLnNlbmQoJ3JvbGxiYWNrJyk7Ci0gICAgfSwKLQotICAgIGJlY2FtZVZhbGlkOiBmdW5j
dGlvbihtYW5hZ2VyKSB7Ci0gICAgICBtYW5hZ2VyLnRyYW5zaXRpb25UbygndW5jb21taXR0ZWQn
KTsKLSAgICB9LAotCi0gICAgaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihtYW5h
Z2VyKSB7Ci0gICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKLSAgICAg
IHJlY29yZC50cmlnZ2VyKCdiZWNhbWVJbnZhbGlkJywgcmVjb3JkKTsKLSAgICB9Ci0gIH0pCi19
KTsKLQotLy8gVGhlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIG91dHNp
ZGUgdGhlIHN0YXRlCi0vLyBjaGFydCBzbyB3ZSBjYW4gcmVvcGVuIHRoZWlyIHN1YnN0YXRlcyBh
bmQgYWRkIG1peGlucyBhcwotLy8gbmVjZXNzYXJ5LgotCi12YXIgY3JlYXRlZFN0YXRlID0gRGly
dHlTdGF0ZS5jcmVhdGUoewotICBkaXJ0eVR5cGU6ICdjcmVhdGVkJywKLQotICAvLyBGTEFHUwot
ICBpc05ldzogdHJ1ZQotfSk7Ci0KLXZhciB1cGRhdGVkU3RhdGUgPSBEaXJ0eVN0YXRlLmNyZWF0
ZSh7Ci0gIGRpcnR5VHlwZTogJ3VwZGF0ZWQnCi19KTsKLQotY3JlYXRlZFN0YXRlLnN0YXRlcy51
bmNvbW1pdHRlZC5yZW9wZW4oewotICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsK
LSAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKLQotICAgIHJlY29yZC53
aXRoVHJhbnNhY3Rpb24oZnVuY3Rpb24odCkgewotICAgICAgdC5yZWNvcmRJc01vdmluZygnY3Jl
YXRlZCcsIHJlY29yZCk7Ci0gICAgfSk7Ci0KLSAgICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBz
KCk7Ci0gICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLSAgfQotfSk7
Ci0KLWNyZWF0ZWRTdGF0ZS5zdGF0ZXMudW5jb21taXR0ZWQucmVvcGVuKHsKLSAgcm9sbGJhY2s6
IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICB0aGlzLl9zdXBlcihtYW5hZ2VyKTsKLSAgICBtYW5h
Z2VyLnRyYW5zaXRpb25UbygnZGVsZXRlZC5zYXZlZCcpOwotICB9Ci19KTsKLQotdXBkYXRlZFN0
YXRlLnN0YXRlcy51bmNvbW1pdHRlZC5yZW9wZW4oewotICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9u
KG1hbmFnZXIpIHsKLSAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKLQot
ICAgIHJlY29yZC53aXRoVHJhbnNhY3Rpb24oZnVuY3Rpb24odCkgewotICAgICAgdC5yZWNvcmRJ
c01vdmluZygndXBkYXRlZCcsIHJlY29yZCk7Ci0gICAgfSk7Ci0KLSAgICBtYW5hZ2VyLnRyYW5z
aXRpb25UbygnZGVsZXRlZCcpOwotICAgIGdldChtYW5hZ2VyLCAncmVjb3JkJykuY2xlYXJSZWxh
dGlvbnNoaXBzKCk7Ci0gIH0KLX0pOwotCi12YXIgc3RhdGVzID0gewotICByb290U3RhdGU6IEVt
YmVyLlN0YXRlLmNyZWF0ZSh7Ci0gICAgLy8gRkxBR1MKLSAgICBpc0xvYWRlZDogZmFsc2UsCi0g
ICAgaXNSZWxvYWRpbmc6IGZhbHNlLAotICAgIGlzRGlydHk6IGZhbHNlLAotICAgIGlzU2F2aW5n
OiBmYWxzZSwKLSAgICBpc0RlbGV0ZWQ6IGZhbHNlLAotICAgIGlzRXJyb3I6IGZhbHNlLAotICAg
IGlzTmV3OiBmYWxzZSwKLSAgICBpc1ZhbGlkOiB0cnVlLAotCi0gICAgLy8gU1VCU1RBVEVTCi0K
LSAgICAvLyBBIHJlY29yZCBiZWdpbnMgaXRzIGxpZmVjeWNsZSBpbiB0aGUgYGVtcHR5YCBzdGF0
ZS4KLSAgICAvLyBJZiBpdHMgZGF0YSB3aWxsIGNvbWUgZnJvbSB0aGUgYWRhcHRlciwgaXQgd2ls
bAotICAgIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGxvYWRpbmdgIHN0YXRlLiBPdGhlcndpc2Us
IGlmCi0gICAgLy8gdGhlIHJlY29yZCBpcyBiZWluZyBjcmVhdGVkIG9uIHRoZSBjbGllbnQsIGl0
IHdpbGwKLSAgICAvLyB0cmFuc2l0aW9uIGludG8gdGhlIGBjcmVhdGVkYCBzdGF0ZS4KLSAgICBl
bXB0eTogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICAgIC8vIEVWRU5UUwotICAgICAgbG9hZGluZ0Rh
dGE6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2xv
YWRpbmcnKTsKLSAgICAgIH0sCi0KLSAgICAgIGxvYWRlZERhdGE6IGZ1bmN0aW9uKG1hbmFnZXIp
IHsKLSAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2xvYWRlZC5jcmVhdGVkJyk7Ci0gICAg
ICB9Ci0gICAgfSksCi0KLSAgICAvLyBBIHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIHRo
ZSBzdG9yZSBhc2tlcwotICAgIC8vIHRoZSBhZGFwdGVyIGZvciBpdHMgZGF0YS4gSXQgcmVtYWlu
cyBpbiB0aGlzIHN0YXRlCi0gICAgLy8gdW50aWwgdGhlIGFkYXB0ZXIgcHJvdmlkZXMgdGhlIHJl
cXVlc3RlZCBkYXRhLgotICAgIC8vCi0gICAgLy8gVXN1YWxseSwgdGhpcyBwcm9jZXNzIGlzIGFz
eW5jaHJvbm91cywgdXNpbmcgYW4KLSAgICAvLyBYSFIgdG8gcmV0cmlldmUgdGhlIGRhdGEuCi0g
ICAgbG9hZGluZzogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICAgIC8vIEVWRU5UUwotICAgICAgbG9h
ZGVkRGF0YTogZGlkQ2hhbmdlRGF0YSwKLQotICAgICAgbWF0ZXJpYWxpemluZ0RhdGE6IGZ1bmN0
aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2xvYWRlZC5tYXRl
cmlhbGl6aW5nLmZpcnN0VGltZScpOwotICAgICAgfQotICAgIH0pLAotCi0gICAgLy8gQSByZWNv
cmQgZW50ZXJzIHRoaXMgc3RhdGUgd2hlbiBpdHMgZGF0YSBpcyBwb3B1bGF0ZWQuCi0gICAgLy8g
TW9zdCBvZiBhIHJlY29yZCdzIGxpZmVjeWNsZSBpcyBzcGVudCBpbnNpZGUgc3Vic3RhdGVzCi0g
ICAgLy8gb2YgdGhlIGBsb2FkZWRgIHN0YXRlLgotICAgIGxvYWRlZDogRFMuU3RhdGUuY3JlYXRl
KHsKLSAgICAgIGluaXRpYWxTdGF0ZTogJ3NhdmVkJywKLQotICAgICAgLy8gRkxBR1MKLSAgICAg
IGlzTG9hZGVkOiB0cnVlLAotCi0gICAgICAvLyBTVUJTVEFURVMKLQotICAgICAgbWF0ZXJpYWxp
emluZzogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICAgICAgLy8gRkxBR1MKLSAgICAgICAgaXNMb2Fk
ZWQ6IGZhbHNlLAotCi0gICAgICAgIC8vIEVWRU5UUwotICAgICAgICB3aWxsU2V0UHJvcGVydHk6
IEVtYmVyLkssCi0gICAgICAgIGRpZFNldFByb3BlcnR5OiBFbWJlci5LLAotCi0gICAgICAgIGRp
ZENoYW5nZURhdGE6IGRpZENoYW5nZURhdGEsCi0KLSAgICAgICAgZmluaXNoZWRNYXRlcmlhbGl6
aW5nOiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8o
J2xvYWRlZC5zYXZlZCcpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNVQlNUQVRFUwotICAg
ICAgICBmaXJzdFRpbWU6IERTLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICAgICAgZXhpdDogZnVuY3Rp
b24obWFuYWdlcikgewotICAgICAgICAgICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVj
b3JkJyk7Ci0KLSAgICAgICAgICAgIEVtYmVyLnJ1bi5vbmNlKGZ1bmN0aW9uKCkgewotICAgICAg
ICAgICAgICByZWNvcmQudHJpZ2dlcignZGlkTG9hZCcpOwotICAgICAgICAgICAgfSk7Ci0gICAg
ICAgICAgfQotICAgICAgICB9KQotICAgICAgfSksCi0KLSAgICAgIHJlbG9hZGluZzogRFMuU3Rh
dGUuY3JlYXRlKHsKLSAgICAgICAgLy8gRkxBR1MKLSAgICAgICAgaXNSZWxvYWRpbmc6IHRydWUs
Ci0KLSAgICAgICAgLy8gVFJBTlNJVElPTlMKLSAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKG1hbmFn
ZXIpIHsKLSAgICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKSwKLSAg
ICAgICAgICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLQotICAgICAgICAgIHN0
b3JlLnJlbG9hZFJlY29yZChyZWNvcmQpOwotICAgICAgICB9LAotCi0gICAgICAgIGV4aXQ6IGZ1
bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdy
ZWNvcmQnKTsKLQotICAgICAgICAgIG9uY2UocmVjb3JkLCAndHJpZ2dlcicsICdkaWRSZWxvYWQn
KTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBFVkVOVFMKLSAgICAgICAgbG9hZGVkRGF0YTog
ZGlkQ2hhbmdlRGF0YSwKLQotICAgICAgICBtYXRlcmlhbGl6aW5nRGF0YTogZnVuY3Rpb24obWFu
YWdlcikgewotICAgICAgICAgIG1hbmFnZXIudHJhbnNpdGlvblRvKCdsb2FkZWQubWF0ZXJpYWxp
emluZycpOwotICAgICAgICB9Ci0gICAgICB9KSwKLQotICAgICAgLy8gSWYgdGhlcmUgYXJlIG5v
IGxvY2FsIGNoYW5nZXMgdG8gYSByZWNvcmQsIGl0IHJlbWFpbnMKLSAgICAgIC8vIGluIHRoZSBg
c2F2ZWRgIHN0YXRlLgotICAgICAgc2F2ZWQ6IERTLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICAgIC8v
IEVWRU5UUwotICAgICAgICB3aWxsU2V0UHJvcGVydHk6IHdpbGxTZXRQcm9wZXJ0eSwKLSAgICAg
ICAgZGlkU2V0UHJvcGVydHk6IGRpZFNldFByb3BlcnR5LAotCi0gICAgICAgIGRpZENoYW5nZURh
dGE6IGRpZENoYW5nZURhdGEsCi0gICAgICAgIGxvYWRlZERhdGE6IGRpZENoYW5nZURhdGEsCi0K
LSAgICAgICAgcmVsb2FkUmVjb3JkOiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICAgICAgbWFu
YWdlci50cmFuc2l0aW9uVG8oJ2xvYWRlZC5yZWxvYWRpbmcnKTsKLSAgICAgICAgfSwKLQotICAg
ICAgICBtYXRlcmlhbGl6aW5nRGF0YTogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgICAgIG1h
bmFnZXIudHJhbnNpdGlvblRvKCdsb2FkZWQubWF0ZXJpYWxpemluZycpOwotICAgICAgICB9LAot
Ci0gICAgICAgIGJlY29tZURpcnR5OiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICAgICAgbWFu
YWdlci50cmFuc2l0aW9uVG8oJ3VwZGF0ZWQnKTsKLSAgICAgICAgfSwKLQotICAgICAgICBkZWxl
dGVSZWNvcmQ6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRp
b25UbygnZGVsZXRlZCcpOwotICAgICAgICAgIGdldChtYW5hZ2VyLCAncmVjb3JkJykuY2xlYXJS
ZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgdW5sb2FkUmVjb3JkOiBmdW5j
dGlvbihtYW5hZ2VyKSB7Ci0gICAgICAgICAgbWFuYWdlci50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQu
c2F2ZWQnKTsKLSAgICAgICAgICBnZXQobWFuYWdlciwgJ3JlY29yZCcpLmNsZWFyUmVsYXRpb25z
aGlwcygpOwotICAgICAgICB9LAotCi0gICAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczog
ZnVuY3Rpb24obWFuYWdlciwgZGlydHlUeXBlKSB7Ci0gICAgICAgICAgdmFyIHJlY29yZCA9IGdl
dChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0gICAgICAgICAgaWYgKGRpcnR5VHlwZSA9PT0gJ2NyZWF0
ZWQnKSB7Ci0gICAgICAgICAgICByZWNvcmQudHJpZ2dlcignZGlkQ3JlYXRlJywgcmVjb3JkKTsK
LSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkLnRyaWdnZXIoJ2RpZFVwZGF0
ZScsIHJlY29yZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KSwKLQotICAgICAg
Ly8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBhZnRlciBpdCBoYXMgYmVlbiBsb2NhbGx5Ci0g
ICAgICAvLyBjcmVhdGVkIGJ1dCBiZWZvcmUgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZCB0aGF0
Ci0gICAgICAvLyBpdCBoYXMgYmVlbiBzYXZlZC4KLSAgICAgIGNyZWF0ZWQ6IGNyZWF0ZWRTdGF0
ZSwKLQotICAgICAgLy8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCBoYXMgYWxyZWFk
eSBiZWVuCi0gICAgICAvLyBzYXZlZCB0byB0aGUgc2VydmVyLCBidXQgdGhlcmUgYXJlIG5ldyBs
b2NhbCBjaGFuZ2VzCi0gICAgICAvLyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNhdmVkLgotICAg
ICAgdXBkYXRlZDogdXBkYXRlZFN0YXRlCi0gICAgfSksCi0KLSAgICAvLyBBIHJlY29yZCBpcyBp
biB0aGlzIHN0YXRlIGlmIGl0IHdhcyBkZWxldGVkIGZyb20gdGhlIHN0b3JlLgotICAgIGRlbGV0
ZWQ6IERTLlN0YXRlLmNyZWF0ZSh7Ci0gICAgICBpbml0aWFsU3RhdGU6ICd1bmNvbW1pdHRlZCcs
Ci0gICAgICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKLQotICAgICAgLy8gRkxBR1MKLSAgICAgIGlz
RGVsZXRlZDogdHJ1ZSwKLSAgICAgIGlzTG9hZGVkOiB0cnVlLAotICAgICAgaXNEaXJ0eTogdHJ1
ZSwKLQotICAgICAgLy8gVFJBTlNJVElPTlMKLSAgICAgIHNldHVwOiBmdW5jdGlvbihtYW5hZ2Vy
KSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwgJ3JlY29yZCcpLAotICAgICAg
ICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLQotICAgICAgICBzdG9yZS5yZW1v
dmVGcm9tUmVjb3JkQXJyYXlzKHJlY29yZCk7Ci0gICAgICB9LAotCi0gICAgICAvLyBTVUJTVEFU
RVMKLQotICAgICAgLy8gV2hlbiBhIHJlY29yZCBpcyBkZWxldGVkLCBpdCBlbnRlcnMgdGhlIGBz
dGFydGAKLSAgICAgIC8vIHN0YXRlLiBJdCB3aWxsIGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSBy
ZWNvcmQncwotICAgICAgLy8gdHJhbnNhY3Rpb24gc3RhcnRzIHRvIGNvbW1pdC4KLSAgICAgIHVu
Y29tbWl0dGVkOiBEUy5TdGF0ZS5jcmVhdGUoewotICAgICAgICAvLyBUUkFOU0lUSU9OUwotICAg
ICAgICBlbnRlcjogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgICAgIHZhciByZWNvcmQgPSBn
ZXQobWFuYWdlciwgJ3JlY29yZCcpOwotCi0gICAgICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlv
bihmdW5jdGlvbih0KSB7Ci0gICAgICAgICAgICB0LnJlY29yZEJlY2FtZURpcnR5KCdkZWxldGVk
JywgcmVjb3JkKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBFVkVO
VFMKLSAgICAgICAgd2lsbENvbW1pdDogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgICAgIG1h
bmFnZXIudHJhbnNpdGlvblRvKCdpbkZsaWdodCcpOwotICAgICAgICB9LAotCi0gICAgICAgIHJv
bGxiYWNrOiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICAgICAgZ2V0KG1hbmFnZXIsICdyZWNv
cmQnKS5yb2xsYmFjaygpOwotICAgICAgICB9LAotCi0gICAgICAgIGJlY29tZURpcnR5OiBFbWJl
ci5LLAotCi0gICAgICAgIGJlY2FtZUNsZWFuOiBmdW5jdGlvbihtYW5hZ2VyKSB7Ci0gICAgICAg
ICAgdmFyIHJlY29yZCA9IGdldChtYW5hZ2VyLCAncmVjb3JkJyk7Ci0KLSAgICAgICAgICByZWNv
cmQud2l0aFRyYW5zYWN0aW9uKGZ1bmN0aW9uKHQpIHsKLSAgICAgICAgICAgIHQucmVjb3JkQmVj
YW1lQ2xlYW4oJ2RlbGV0ZWQnLCByZWNvcmQpOwotICAgICAgICAgIH0pOwotCi0gICAgICAgICAg
bWFuYWdlci50cmFuc2l0aW9uVG8oJ2xvYWRlZC5tYXRlcmlhbGl6aW5nJyk7Ci0gICAgICAgIH0K
LSAgICAgIH0pLAotCi0gICAgICAvLyBBZnRlciBhIHJlY29yZCdzIHRyYW5zYWN0aW9uIGlzIGNv
bW1pdHRpbmcsIGJ1dAotICAgICAgLy8gYmVmb3JlIHRoZSBhZGFwdGVyIGluZGljYXRlcyB0aGF0
IHRoZSBkZWxldGlvbgotICAgICAgLy8gaGFzIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGEgcmVjb3Jk
IGlzIGluIHRoZQotICAgICAgLy8gYGluRmxpZ2h0YCBzdWJzdGF0ZSBvZiBgZGVsZXRlZGAuCi0g
ICAgICBpbkZsaWdodDogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICAgICAgLy8gRkxBR1MKLSAgICAg
ICAgaXNTYXZpbmc6IHRydWUsCi0KLSAgICAgICAgLy8gVFJBTlNJVElPTlMKLSAgICAgICAgZW50
ZXI6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFn
ZXIsICdyZWNvcmQnKTsKLQotICAgICAgICAgIHJlY29yZC5iZWNhbWVJbkZsaWdodCgpOwotCi0g
ICAgICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbiAodCkgewotICAgICAgICAg
ICAgdC5yZWNvcmRCZWNhbWVJbkZsaWdodCgnZGVsZXRlZCcsIHJlY29yZCk7Ci0gICAgICAgICAg
fSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gRVZFTlRTCi0gICAgICAgIGRpZENvbW1pdDog
ZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQobWFuYWdlciwg
J3JlY29yZCcpOwotCi0gICAgICAgICAgcmVjb3JkLndpdGhUcmFuc2FjdGlvbihmdW5jdGlvbih0
KSB7Ci0gICAgICAgICAgICB0LnJlY29yZEJlY2FtZUNsZWFuKCdpbmZsaWdodCcsIHJlY29yZCk7
Ci0gICAgICAgICAgfSk7Ci0KLSAgICAgICAgICBtYW5hZ2VyLnRyYW5zaXRpb25Ubygnc2F2ZWQn
KTsKLQotICAgICAgICAgIG1hbmFnZXIuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJyk7
Ci0gICAgICAgIH0KLSAgICAgIH0pLAotCi0gICAgICAvLyBPbmNlIHRoZSBhZGFwdGVyIGluZGlj
YXRlcyB0aGF0IHRoZSBkZWxldGlvbiBoYXMKLSAgICAgIC8vIGJlZW4gc2F2ZWQsIHRoZSByZWNv
cmQgZW50ZXJzIHRoZSBgc2F2ZWRgIHN1YnN0YXRlCi0gICAgICAvLyBvZiBgZGVsZXRlZGAuCi0g
ICAgICBzYXZlZDogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICAgICAgLy8gRkxBR1MKLSAgICAgICAg
aXNEaXJ0eTogZmFsc2UsCi0KLSAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAg
ICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKSwKLSAgICAgICAgICAg
ICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLQotICAgICAgICAgIHN0b3JlLmRlbWF0
ZXJpYWxpemVSZWNvcmQocmVjb3JkKTsKLSAgICAgICAgfSwKLQotICAgICAgICBpbnZva2VMaWZl
Y3ljbGVDYWxsYmFja3M6IGZ1bmN0aW9uKG1hbmFnZXIpIHsKLSAgICAgICAgICB2YXIgcmVjb3Jk
ID0gZ2V0KG1hbmFnZXIsICdyZWNvcmQnKTsKLSAgICAgICAgICByZWNvcmQudHJpZ2dlcignZGlk
RGVsZXRlJywgcmVjb3JkKTsKLSAgICAgICAgfQotICAgICAgfSkKLSAgICB9KSwKLQotICAgIC8v
IElmIHRoZSBhZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhbiB1bmtub3duCi0gICAg
Ly8gZXJyb3Igc2F2aW5nIGEgcmVjb3JkLCB0aGUgcmVjb3JkIGVudGVycyB0aGUgYGVycm9yYAot
ICAgIC8vIHN0YXRlLgotICAgIGVycm9yOiBEUy5TdGF0ZS5jcmVhdGUoewotICAgICAgaXNFcnJv
cjogdHJ1ZSwKLQotICAgICAgLy8gRVZFTlRTCi0KLSAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxi
YWNrczogZnVuY3Rpb24obWFuYWdlcikgewotICAgICAgICB2YXIgcmVjb3JkID0gZ2V0KG1hbmFn
ZXIsICdyZWNvcmQnKTsKLSAgICAgICAgcmVjb3JkLnRyaWdnZXIoJ2JlY2FtZUVycm9yJywgcmVj
b3JkKTsKLSAgICAgIH0KLSAgICB9KQotICB9KQotfTsKLQotRFMuU3RhdGVNYW5hZ2VyID0gRW1i
ZXIuU3RhdGVNYW5hZ2VyLmV4dGVuZCh7Ci0gIHJlY29yZDogbnVsbCwKLSAgaW5pdGlhbFN0YXRl
OiAncm9vdFN0YXRlJywKLSAgc3RhdGVzOiBzdGF0ZXMsCi0gIHVuaGFuZGxlZEV2ZW50OiBmdW5j
dGlvbihtYW5hZ2VyLCBvcmlnaW5hbEV2ZW50KSB7Ci0gICAgdmFyIHJlY29yZCA9IG1hbmFnZXIu
Z2V0KCdyZWNvcmQnKSwKLSAgICAgICAgY29udGV4dHMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50
cywgMiksCi0gICAgICAgIGVycm9yTWVzc2FnZTsKLSAgICBlcnJvck1lc3NhZ2UgID0gIkF0dGVt
cHRlZCB0byBoYW5kbGUgZXZlbnQgYCIgKyBvcmlnaW5hbEV2ZW50ICsgImAgIjsKLSAgICBlcnJv
ck1lc3NhZ2UgKz0gIm9uICIgKyByZWNvcmQudG9TdHJpbmcoKSArICIgd2hpbGUgaW4gc3RhdGUg
IjsKLSAgICBlcnJvck1lc3NhZ2UgKz0gZ2V0KG1hbmFnZXIsICdjdXJyZW50U3RhdGUucGF0aCcp
ICsgIi4gQ2FsbGVkIHdpdGggIjsKLSAgICBlcnJvck1lc3NhZ2UgKz0gYXJyYXlNYXAuY2FsbChj
b250ZXh0cywgZnVuY3Rpb24oY29udGV4dCl7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IEVtYmVyLmluc3BlY3QoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywg
Jyk7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKGVycm9yTWVzc2FnZSk7Ci0gIH0KLX0pOwot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIExvYWRQcm9taXNlID0gRFMuTG9hZFBy
b21pc2U7IC8vIHN5c3RlbS9taXhpbnMvbG9hZF9wcm9taXNlCi0KLXZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldCwgbm9uZSA9IEVtYmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51
bWVyYWJsZVV0aWxzLm1hcDsKLQotdmFyIHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSA9IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgewotICByZXR1cm4gZ2V0KGdldCh0aGlzLCAnc3RhdGVN
YW5hZ2VyLmN1cnJlbnRTdGF0ZScpLCBrZXkpOwotfSkucHJvcGVydHkoJ3N0YXRlTWFuYWdlci5j
dXJyZW50U3RhdGUnKTsKLQotRFMuTW9kZWwgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkV2
ZW50ZWQsIExvYWRQcm9taXNlLCB7Ci0gIGlzTG9hZGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3Rh
dGUsCi0gIGlzUmVsb2FkaW5nOiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIGlzRGlydHk6
IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKLSAgaXNTYXZpbmc6IHJldHJpZXZlRnJvbUN1cnJl
bnRTdGF0ZSwKLSAgaXNEZWxldGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIGlzRXJy
b3I6IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKLSAgaXNOZXc6IHJldHJpZXZlRnJvbUN1cnJl
bnRTdGF0ZSwKLSAgaXNWYWxpZDogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotCi0gIGNsaWVu
dElkOiBudWxsLAotICBpZDogbnVsbCwKLSAgdHJhbnNhY3Rpb246IG51bGwsCi0gIHN0YXRlTWFu
YWdlcjogbnVsbCwKLSAgZXJyb3JzOiBudWxsLAotCi0gIC8qKgotICAgIENyZWF0ZSBhIEpTT04g
cmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY29yZCwgdXNpbmcgdGhlIHNlcmlhbGl6YXRpb24KLSAg
ICBzdHJhdGVneSBvZiB0aGUgc3RvcmUncyBhZGFwdGVyLgotCi0gICAgQXZhaWxhYmxlIG9wdGlv
bnM6Ci0KLSAgICAqIGBpbmNsdWRlSWRgOiBgdHJ1ZWAgaWYgdGhlIHJlY29yZCdzIElEIHNob3Vs
ZCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgIEpTT04gcmVwcmVzZW50YXRpb24uCi0KLSAgICBA
cGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm5zIHtPYmplY3R9IGFuIG9iamVjdCB3
aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2ZSBKU09OIHZhbHVlcyBvbmx5Ci0gICovCi0gIHNlcmlh
bGl6ZTogZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3Rv
cmUnKTsKLSAgICByZXR1cm4gc3RvcmUuc2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwotICB9LAot
Ci0gIGRpZExvYWQ6IEVtYmVyLkssCi0gIGRpZFJlbG9hZDogRW1iZXIuSywKLSAgZGlkVXBkYXRl
OiBFbWJlci5LLAotICBkaWRDcmVhdGU6IEVtYmVyLkssCi0gIGRpZERlbGV0ZTogRW1iZXIuSywK
LSAgYmVjYW1lSW52YWxpZDogRW1iZXIuSywKLSAgYmVjYW1lRXJyb3I6IEVtYmVyLkssCi0KLSAg
ZGF0YTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLl9kYXRhKSB7
Ci0gICAgICB0aGlzLm1hdGVyaWFsaXplRGF0YSgpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlz
Ll9kYXRhOwotICB9KS5wcm9wZXJ0eSgpLAotCi0gIG1hdGVyaWFsaXplRGF0YTogZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5zZW5kKCdtYXRlcmlhbGl6aW5nRGF0YScpOwotCi0gICAgZ2V0KHRoaXMs
ICdzdG9yZScpLm1hdGVyaWFsaXplRGF0YSh0aGlzKTsKLQotICAgIHRoaXMuc3VzcGVuZFJlbGF0
aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlD
aGFuZ2UoJ2RhdGEnKTsKLSAgICB9KTsKLSAgfSwKLQotICBfZGF0YTogbnVsbCwKLQotICBpbml0
OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotCi0gICAgdmFyIHN0YXRlTWFuYWdl
ciA9IERTLlN0YXRlTWFuYWdlci5jcmVhdGUoeyByZWNvcmQ6IHRoaXMgfSk7Ci0gICAgc2V0KHRo
aXMsICdzdGF0ZU1hbmFnZXInLCBzdGF0ZU1hbmFnZXIpOwotCi0gICAgdGhpcy5fc2V0dXAoKTsK
LQotICAgIHN0YXRlTWFuYWdlci5nb1RvU3RhdGUoJ2VtcHR5Jyk7Ci0gIH0sCi0KLSAgX3NldHVw
OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9yZWxhdGlvbnNoaXBDaGFuZ2VzID0ge307Ci0gICAg
dGhpcy5fY2hhbmdlc1RvU3luYyA9IHt9OwotICB9LAotCi0gIHNlbmQ6IGZ1bmN0aW9uKG5hbWUs
IGNvbnRleHQpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMsICdzdGF0ZU1hbmFnZXInKS5zZW5kKG5h
bWUsIGNvbnRleHQpOwotICB9LAotCi0gIHdpdGhUcmFuc2FjdGlvbjogZnVuY3Rpb24oZm4pIHsK
LSAgICB2YXIgdHJhbnNhY3Rpb24gPSBnZXQodGhpcywgJ3RyYW5zYWN0aW9uJyk7Ci0gICAgaWYg
KHRyYW5zYWN0aW9uKSB7IGZuKHRyYW5zYWN0aW9uKTsgfQotICB9LAotCi0gIGxvYWRpbmdEYXRh
OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2xvYWRpbmdEYXRhJyk7Ci0gIH0sCi0KLSAg
bG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdsb2FkZWREYXRhJyk7Ci0g
IH0sCi0KLSAgZGlkQ2hhbmdlRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdkaWRD
aGFuZ2VEYXRhJyk7Ci0gIH0sCi0KLSAgc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUs
IG9sZFZhbHVlKSB7Ci0gICAgdGhpcy5zZW5kKCdzZXRQcm9wZXJ0eScsIHsga2V5OiBrZXksIHZh
bHVlOiB2YWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJl
bG9hZCB0aGUgcmVjb3JkIGZyb20gdGhlIGFkYXB0ZXIuCi0KLSAgICBUaGlzIHdpbGwgb25seSB3
b3JrIGlmIHRoZSByZWNvcmQgaGFzIGFscmVhZHkgZmluaXNoZWQgbG9hZGluZwotICAgIGFuZCBo
YXMgbm90IHlldCBiZWVuIG1vZGlmaWVkIChgaXNMb2FkZWRgIGJ1dCBub3QgYGlzRGlydHlgLAot
ICAgIG9yIGBpc1NhdmluZ2ApLgotICAqLwotICByZWxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIHRo
aXMuc2VuZCgncmVsb2FkUmVjb3JkJyk7Ci0gIH0sCi0KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlv
bigpIHsKLSAgICB0aGlzLnNlbmQoJ2RlbGV0ZVJlY29yZCcpOwotICB9LAotCi0gIHVubG9hZFJl
Y29yZDogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgdW5sb2Fk
IGEgbG9hZGVkLCBub24tZGlydHkgcmVjb3JkLiIsICFnZXQodGhpcywgJ2lzRGlydHknKSk7Ci0K
LSAgICB0aGlzLnNlbmQoJ3VubG9hZFJlY29yZCcpOwotICB9LAotCi0gIGNsZWFyUmVsYXRpb25z
aGlwczogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5h
bWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnYmVs
b25nc1RvJykgewotICAgICAgICBzZXQodGhpcywgbmFtZSwgbnVsbCk7Ci0gICAgICB9IGVsc2Ug
aWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAgZ2V0KHRoaXMs
IG5hbWUpLmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgdXBkYXRl
UmVjb3JkQXJyYXlzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywgJ3N0
b3JlJyk7Ci0gICAgaWYgKHN0b3JlKSB7Ci0gICAgICBzdG9yZS5kYXRhV2FzVXBkYXRlZCh0aGlz
LmNvbnN0cnVjdG9yLCBnZXQodGhpcywgJ19yZWZlcmVuY2UnKSwgdGhpcyk7Ci0gICAgfQotICB9
LAotCi0gIC8qKgotICAgIElmIHRoZSBhZGFwdGVyIGRpZCBub3QgcmV0dXJuIGEgaGFzaCBpbiBy
ZXNwb25zZSB0byBhIGNvbW1pdCwKLSAgICBtZXJnZSB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFu
ZCByZWxhdGlvbnNoaXBzIGludG8gdGhlIGV4aXN0aW5nCi0gICAgc2F2ZWQgZGF0YS4KLSAgKi8K
LSAgYWRhcHRlckRpZENvbW1pdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGF0dHJpYnV0ZXMgPSBn
ZXQodGhpcywgJ2RhdGEnKS5hdHRyaWJ1dGVzOwotCi0gICAgZ2V0KHRoaXMuY29uc3RydWN0b3Is
ICdhdHRyaWJ1dGVzJykuZm9yRWFjaChmdW5jdGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBhdHRy
aWJ1dGVzW25hbWVdID0gZ2V0KHRoaXMsIG5hbWUpOwotICAgIH0sIHRoaXMpOwotCi0gICAgdGhp
cy5zZW5kKCdkaWRDb21taXQnKTsKLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7
Ci0gIH0sCi0KLSAgYWRhcHRlckRpZERpcnR5OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQo
J2JlY29tZURpcnR5Jyk7Ci0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICB9
LAotCi0gIGRhdGFEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKGZ1bmN0aW9uKCkgewotICAgIHZh
ciByZWxhdGlvbnNoaXBzID0gZ2V0KHRoaXMuY29uc3RydWN0b3IsICdyZWxhdGlvbnNoaXBzQnlO
YW1lJyk7Ci0KLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0KLSAgICByZWxh
dGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBp
ZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55JykgewotICAgICAgICB0aGlzLmhhc01h
bnlEaWRDaGFuZ2UocmVsYXRpb25zaGlwLmtleSk7Ci0gICAgICB9Ci0gICAgfSwgdGhpcyk7Ci0K
LSAgICB0aGlzLnNlbmQoJ2ZpbmlzaGVkTWF0ZXJpYWxpemluZycpOwotICB9LCAnZGF0YScpLAot
Ci0gIGhhc01hbnlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleSkgewotICAgIHZhciBjYWNoZWRWYWx1
ZSA9IHRoaXMuY2FjaGVGb3Ioa2V5KTsKLQotICAgIGlmIChjYWNoZWRWYWx1ZSkgewotICAgICAg
dmFyIHR5cGUgPSBnZXQodGhpcy5jb25zdHJ1Y3RvciwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5n
ZXQoa2V5KS50eXBlOwotICAgICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOwotICAg
ICAgdmFyIGlkcyA9IHRoaXMuX2RhdGEuaGFzTWFueVtrZXldIHx8IFtdOwotCi0gICAgICB2YXIg
cmVmZXJlbmNlcyA9IG1hcChpZHMsIGZ1bmN0aW9uKGlkKSB7Ci0gICAgICAgIC8vIGlmIGl0IHdh
cyBhbHJlYWR5IGEgcmVmZXJlbmNlLCByZXR1cm4gdGhlIHJlZmVyZW5jZQotICAgICAgICBpZiAo
dHlwZW9mIGlkID09PSAnb2JqZWN0JykgeyByZXR1cm4gaWQ7IH0KLSAgICAgICAgcmV0dXJuIHN0
b3JlLnJlZmVyZW5jZUZvcklkKHR5cGUsIGlkKTsKLSAgICAgIH0pOwotCi0gICAgICBzZXQoY2Fj
aGVkVmFsdWUsICdjb250ZW50JywgRW1iZXIuQShyZWZlcmVuY2VzKSk7Ci0gICAgfQotICB9LAot
Ci0gIHVwZGF0ZVJlY29yZEFycmF5c0xhdGVyOiBmdW5jdGlvbigpIHsKLSAgICBFbWJlci5ydW4u
b25jZSh0aGlzLCB0aGlzLnVwZGF0ZVJlY29yZEFycmF5cyk7Ci0gIH0sCi0KLSAgc2V0dXBEYXRh
OiBmdW5jdGlvbihwcmVtYXRlcmlhbGl6ZWQpIHsKLSAgICB0aGlzLl9kYXRhID0gewotICAgICAg
YXR0cmlidXRlczoge30sCi0gICAgICBiZWxvbmdzVG86IHt9LAotICAgICAgaGFzTWFueToge30s
Ci0gICAgICBpZDogbnVsbAotICAgIH07Ci0gIH0sCi0KLSAgbWF0ZXJpYWxpemVJZDogZnVuY3Rp
b24oaWQpIHsKLSAgICBzZXQodGhpcywgJ2lkJywgaWQpOwotICB9LAotCi0gIG1hdGVyaWFsaXpl
QXR0cmlidXRlczogZnVuY3Rpb24oYXR0cmlidXRlcykgewotICAgIEVtYmVyLmFzc2VydCgiTXVz
dCBwYXNzIGEgaGFzaCBvZiBhdHRyaWJ1dGVzIHRvIG1hdGVyaWFsaXplQXR0cmlidXRlcyIsICEh
YXR0cmlidXRlcyk7Ci0gICAgdGhpcy5fZGF0YS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAg
fSwKLQotICBtYXRlcmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKLSAg
ICB0aGlzLl9kYXRhLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTsKLSAgfSwKLQotICBtYXRlcmlh
bGl6ZUhhc01hbnk6IGZ1bmN0aW9uKG5hbWUsIGlkcykgewotICAgIHRoaXMuX2RhdGEuaGFzTWFu
eVtuYW1lXSA9IGlkczsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUJlbG9uZ3NUbzogZnVuY3Rpb24o
bmFtZSwgaWQpIHsKLSAgICB0aGlzLl9kYXRhLmJlbG9uZ3NUb1tuYW1lXSA9IGlkOwotICB9LAot
Ci0gIHJvbGxiYWNrOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zZXR1cCgpOwotICAgIHRoaXMu
c2VuZCgnYmVjYW1lQ2xlYW4nKTsKLQotICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2Vy
dmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEn
KTsKLSAgICB9KTsKLSAgfSwKLQotICB0b1N0cmluZ0V4dGVuc2lvbjogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIGdldCh0aGlzLCAnaWQnKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQot
Ci0gICAgVGhlIGdvYWwgb2YgdGhpcyBtZXRob2QgaXMgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSBz
cGVjaWZpYyBvYnNlcnZlcnMKLSAgICB0aGF0IHRha2UgYWN0aW9uIGluIHJlc3BvbnNlIHRvIGFw
cGxpY2F0aW9uIGNoYW5nZXMuCi0KLSAgICBUaGlzIGFsbG93cyB0aGUgc3lzdGVtIHRvIG1ha2Ug
Y2hhbmdlcyAoc3VjaCBhcyBtYXRlcmlhbGl6YXRpb24gYW5kCi0gICAgcm9sbGJhY2spIHRoYXQg
c2hvdWxkIG5vdCB0cmlnZ2VyIHNlY29uZGFyeSBiZWhhdmlvciAoc3VjaCBhcyBzZXR0aW5nIGFu
Ci0gICAgaW52ZXJzZSByZWxhdGlvbnNoaXAgb3IgbWFya2luZyByZWNvcmRzIGFzIGRpcnR5KS4K
LQotICAgIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB3aWxsIGxpa2VseSBjaGFuZ2UgYXMg
RW1iZXIgcHJvcGVyIHByb3ZpZGVzCi0gICAgYmV0dGVyIGluZnJhc3RydWN0dXJlIGZvciBzdXNw
ZW5kaW5nIGdyb3VwcyBvZiBvYnNlcnZlcnMsIGFuZCBpZiBBcnJheQotICAgIG9ic2VydmF0aW9u
IGJlY29tZXMgbW9yZSB1bmlmaWVkIHdpdGggcmVndWxhciBvYnNlcnZlcnMuCi0gICovCi0gIHN1
c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnM6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7
Ci0gICAgdmFyIG9ic2VydmVycyA9IGdldCh0aGlzLmNvbnN0cnVjdG9yLCAncmVsYXRpb25zaGlw
TmFtZXMnKS5iZWxvbmdzVG87Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotCi0gICAgdHJ5IHsKLSAg
ICAgIHRoaXMuX3N1c3BlbmRlZFJlbGF0aW9uc2hpcHMgPSB0cnVlOwotICAgICAgRW1iZXIuX3N1
c3BlbmRPYnNlcnZlcnMoc2VsZiwgb2JzZXJ2ZXJzLCBudWxsLCAnYmVsb25nc1RvRGlkQ2hhbmdl
JywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXJzKHNl
bGYsIG9ic2VydmVycywgbnVsbCwgJ2JlbG9uZ3NUb1dpbGxDaGFuZ2UnLCBmdW5jdGlvbigpIHsK
LSAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcgfHwgc2VsZik7Ci0gICAgICAgIH0pOwot
ICAgICAgfSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHRoaXMuX3N1c3BlbmRlZFJlbGF0aW9u
c2hpcHMgPSBmYWxzZTsKLSAgICB9Ci0gIH0sCi0KLSAgYmVjYW1lSW5GbGlnaHQ6IGZ1bmN0aW9u
KCkgewotICB9LAotCi0gIC8vIEZPUiBVU0UgRFVSSU5HIENPTU1JVCBQUk9DRVNTCi0KLSAgYWRh
cHRlckRpZFVwZGF0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oYXR0cmlidXRlTmFtZSwgdmFsdWUpIHsK
LQotICAgIC8vIElmIGEgdmFsdWUgaXMgcGFzc2VkIGluLCB1cGRhdGUgdGhlIGludGVybmFsIGF0
dHJpYnV0ZXMgYW5kIGNsZWFyCi0gICAgLy8gdGhlIGF0dHJpYnV0ZSBjYWNoZSBzbyBpdCBwaWNr
cyB1cCB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2UsCi0gICAgLy8gY29sbGFwc2UgdGhlIGN1cnJl
bnQgdmFsdWUgaW50byB0aGUgaW50ZXJuYWwgYXR0cmlidXRlcyBiZWNhdXNlCi0gICAgLy8gdGhl
IGFkYXB0ZXIgaGFzIGFja25vd2xlZGdlZCBpdC4KLSAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5l
ZCkgewotICAgICAgZ2V0KHRoaXMsICdkYXRhLmF0dHJpYnV0ZXMnKVthdHRyaWJ1dGVOYW1lXSA9
IHZhbHVlOwotICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZShhdHRyaWJ1dGVOYW1lKTsK
LSAgICB9IGVsc2UgewotICAgICAgdmFsdWUgPSBnZXQodGhpcywgYXR0cmlidXRlTmFtZSk7Ci0g
ICAgICBnZXQodGhpcywgJ2RhdGEuYXR0cmlidXRlcycpW2F0dHJpYnV0ZU5hbWVdID0gdmFsdWU7
Ci0gICAgfQotCi0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICB9LAotCi0g
IF9yZWZlcmVuY2U6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBnZXQo
dGhpcywgJ3N0b3JlJykucmVmZXJlbmNlRm9yQ2xpZW50SWQoZ2V0KHRoaXMsICdjbGllbnRJZCcp
KTsKLSAgfSksCi0KLSAgYWRhcHRlckRpZEludmFsaWRhdGU6IGZ1bmN0aW9uKGVycm9ycykgewot
ICAgIHRoaXMuc2VuZCgnYmVjYW1lSW52YWxpZCcsIGVycm9ycyk7Ci0gIH0sCi0KLSAgYWRhcHRl
ckRpZEVycm9yOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2JlY2FtZUVycm9yJyk7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGV2
ZW50IGZpcmluZyBmcm9tIEVtYmVyLkV2ZW50ZWQgdG8KLSAgICBhbHNvIGNhbGwgbWV0aG9kcyB3
aXRoIHRoZSBnaXZlbiBuYW1lLgotICAqLwotICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7Ci0g
ICAgRW1iZXIudHJ5SW52b2tlKHRoaXMsIG5hbWUsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAx
KSk7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfQotfSk7Ci0K
LS8vIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBzdG9yZSBhbGlhc2VzLgotLy8gVGhpcyBy
ZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBuYW1lZCBhbGlhcwotLy8gb24gdGhl
IGRlZmF1bHQgc3RvcmUsIGJ1dCBpbmplY3RzIHRoZSBjbGFzcyBhcyB0aGUKLS8vIGZpcnN0IHBh
cmFtZXRlci4KLXZhciBzdG9yZUFsaWFzID0gZnVuY3Rpb24obWV0aG9kTmFtZSkgewotICByZXR1
cm4gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0b3JlID0gZ2V0KERTLCAnZGVmYXVsdFN0b3JlJyks
Ci0gICAgICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0KLSAgICBhcmdzLnVu
c2hpZnQodGhpcyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3VyIGFwcGxpY2F0aW9uIGRvZXMgbm90
IGhhdmUgYSAnU3RvcmUnIHByb3BlcnR5IGRlZmluZWQuIEF0dGVtcHRzIHRvIGNhbGwgJyIgKyBt
ZXRob2ROYW1lICsgIicgb24gbW9kZWwgY2xhc3NlcyB3aWxsIGZhaWwuIFBsZWFzZSBwcm92aWRl
IG9uZSBhcyB3aXRoICdZb3VyQXBwTmFtZS5TdG9yZSA9IERTLlN0b3JlLmV4dGVuZCgpJyIsICEh
c3RvcmUpOwotICAgIHJldHVybiBzdG9yZVttZXRob2ROYW1lXS5hcHBseShzdG9yZSwgYXJncyk7
Ci0gIH07Ci19OwotCi1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0gIGlzTG9hZGVkOiBzdG9yZUFs
aWFzKCdyZWNvcmRJc0xvYWRlZCcpLAotICBmaW5kOiBzdG9yZUFsaWFzKCdmaW5kJyksCi0gIGFs
bDogc3RvcmVBbGlhcygnYWxsJyksCi0gIHF1ZXJ5OiBzdG9yZUFsaWFzKCdmaW5kUXVlcnknKSwK
LSAgZmlsdGVyOiBzdG9yZUFsaWFzKCdmaWx0ZXInKSwKLQotICBfY3JlYXRlOiBEUy5Nb2RlbC5j
cmVhdGUsCi0KLSAgY3JlYXRlOiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoIllvdSBzaG91bGQgbm90IGNhbGwgYGNyZWF0ZWAgb24gYSBtb2RlbC4gSW5zdGVhZCwgY2Fs
bCBgY3JlYXRlUmVjb3JkYCB3aXRoIHRoZSBhdHRyaWJ1dGVzIHlvdSB3b3VsZCBsaWtlIHRvIHNl
dC4iKTsKLSAgfSwKLQotICBjcmVhdGVSZWNvcmQ6IHN0b3JlQWxpYXMoJ2NyZWF0ZVJlY29yZCcp
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQ7
Ci1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0gIGF0dHJpYnV0ZXM6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKCkgewotICAgIHZhciBtYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7Ci0KLSAgICB0aGlz
LmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKLSAgICAgIGlmICht
ZXRhLmlzQXR0cmlidXRlKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiWW91IG1heSBub3Qgc2V0
IGBpZGAgYXMgYW4gYXR0cmlidXRlIG9uIHlvdXIgbW9kZWwuIFBsZWFzZSByZW1vdmUgYW55IGxp
bmVzIHRoYXQgbG9vayBsaWtlOiBgaWQ6IERTLmF0dHIoJzx0eXBlPicpYCBmcm9tICIgKyB0aGlz
LnRvU3RyaW5nKCksIG5hbWUgIT09ICdpZCcpOwotCi0gICAgICAgIG1ldGEubmFtZSA9IG5hbWU7
Ci0gICAgICAgIG1hcC5zZXQobmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBy
ZXR1cm4gbWFwOwotICB9KQotfSk7Ci0KLXZhciBBdHRyaWJ1dGVDaGFuZ2UgPSBEUy5BdHRyaWJ1
dGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHRoaXMucmVmZXJlbmNlID0gb3B0aW9u
cy5yZWZlcmVuY2U7Ci0gIHRoaXMuc3RvcmUgPSBvcHRpb25zLnN0b3JlOwotICB0aGlzLm5hbWUg
PSBvcHRpb25zLm5hbWU7Ci0gIHRoaXMub2xkVmFsdWUgPSBvcHRpb25zLm9sZFZhbHVlOwotfTsK
LQotQXR0cmlidXRlQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAg
cmV0dXJuIG5ldyBBdHRyaWJ1dGVDaGFuZ2Uob3B0aW9ucyk7Ci19OwotCi1BdHRyaWJ1dGVDaGFu
Z2UucHJvdG90eXBlID0gewotICBzeW5jOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnN0b3JlLnJl
Y29yZEF0dHJpYnV0ZURpZENoYW5nZSh0aGlzLnJlZmVyZW5jZSwgdGhpcy5uYW1lLCB0aGlzLnZh
bHVlLCB0aGlzLm9sZFZhbHVlKTsKLQotICAgIC8vIFRPRE86IFVzZSB0aGlzIG9iamVjdCBpbiB0
aGUgY29tbWl0IHByb2Nlc3MKLSAgICB0aGlzLmRlc3Ryb3koKTsKLSAgfSwKLQotICBkZXN0cm95
OiBmdW5jdGlvbigpIHsKLSAgICBkZWxldGUgdGhpcy5zdG9yZS5yZWNvcmRGb3JSZWZlcmVuY2Uo
dGhpcy5yZWZlcmVuY2UpLl9jaGFuZ2VzVG9TeW5jW3RoaXMubmFtZV07Ci0gIH0KLX07Ci0KLURT
Lk1vZGVsLnJlb3Blbih7Ci0gIGVhY2hBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5k
aW5nKSB7Ci0gICAgZ2V0KHRoaXMuY29uc3RydWN0b3IsICdhdHRyaWJ1dGVzJykuZm9yRWFjaChm
dW5jdGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIG5hbWUs
IG1ldGEpOwotICAgIH0sIGJpbmRpbmcpOwotICB9LAotCi0gIGF0dHJpYnV0ZVdpbGxDaGFuZ2U6
IEVtYmVyLmJlZm9yZU9ic2VydmVyKGZ1bmN0aW9uKHJlY29yZCwga2V5KSB7Ci0gICAgdmFyIHJl
ZmVyZW5jZSA9IGdldChyZWNvcmQsICdfcmVmZXJlbmNlJyksCi0gICAgICAgIHN0b3JlID0gZ2V0
KHJlY29yZCwgJ3N0b3JlJyk7Ci0KLSAgICByZWNvcmQuc2VuZCgnd2lsbFNldFByb3BlcnR5Jywg
eyByZWZlcmVuY2U6IHJlZmVyZW5jZSwgc3RvcmU6IHN0b3JlLCBuYW1lOiBrZXkgfSk7Ci0gIH0p
LAotCi0gIGF0dHJpYnV0ZURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3Jk
LCBrZXkpIHsKLSAgICByZWNvcmQuc2VuZCgnZGlkU2V0UHJvcGVydHknLCB7IG5hbWU6IGtleSB9
KTsKLSAgfSkKLX0pOwotCi1mdW5jdGlvbiBnZXRBdHRyKHJlY29yZCwgb3B0aW9ucywga2V5KSB7
Ci0gIHZhciBhdHRyaWJ1dGVzID0gZ2V0KHJlY29yZCwgJ2RhdGEnKS5hdHRyaWJ1dGVzOwotICB2
YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW2tleV07Ci0KLSAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQp
IHsKLSAgICB2YWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgcmV0dXJuIHZh
bHVlOwotfQotCi1EUy5hdHRyID0gZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewotICBvcHRpb25z
ID0gb3B0aW9ucyB8fCB7fTsKLQotICB2YXIgbWV0YSA9IHsKLSAgICB0eXBlOiB0eXBlLAotICAg
IGlzQXR0cmlidXRlOiB0cnVlLAotICAgIG9wdGlvbnM6IG9wdGlvbnMKLSAgfTsKLQotICByZXR1
cm4gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2YWx1ZSwgb2xkVmFsdWUpIHsKLSAgICB2
YXIgZGF0YTsKLQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewotICAgICAgRW1iZXIu
YXNzZXJ0KCJZb3UgbWF5IG5vdCBzZXQgYGlkYCBhcyBhbiBhdHRyaWJ1dGUgb24geW91ciBtb2Rl
bC4gUGxlYXNlIHJlbW92ZSBhbnkgbGluZXMgdGhhdCBsb29rIGxpa2U6IGBpZDogRFMuYXR0cign
PHR5cGU+JylgIGZyb20gIiArIHRoaXMuY29uc3RydWN0b3IudG9TdHJpbmcoKSwga2V5ICE9PSAn
aWQnKTsKLSAgICB9IGVsc2UgewotICAgICAgdmFsdWUgPSBnZXRBdHRyKHRoaXMsIG9wdGlvbnMs
IGtleSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbHVlOwotICAvLyBgZGF0YWAgaXMgbmV2ZXIg
c2V0IGRpcmVjdGx5LiBIb3dldmVyLCBpdCBtYXkgYmUKLSAgLy8gaW52YWxpZGF0ZWQgZnJvbSB0
aGUgc3RhdGUgbWFuYWdlcidzIHNldERhdGEKLSAgLy8gZXZlbnQuCi0gIH0pLnByb3BlcnR5KCdk
YXRhJykubWV0YShtZXRhKTsKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVt
YmVyLnNldCwKLSAgICBub25lID0gRW1iZXIuaXNOb25lOwotCi1EUy5iZWxvbmdzVG8gPSBmdW5j
dGlvbih0eXBlLCBvcHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgiVGhlIGZpcnN0IGFyZ3VtZW50
IERTLmJlbG9uZ3NUbyBtdXN0IGJlIGEgbW9kZWwgdHlwZSBvciBzdHJpbmcsIGxpa2UgRFMuYmVs
b25nc1RvKEFwcC5QZXJzb24pIiwgISF0eXBlICYmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycg
fHwgRFMuTW9kZWwuZGV0ZWN0KHR5cGUpKSk7Ci0KLSAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307
Ci0KLSAgdmFyIG1ldGEgPSB7IHR5cGU6IHR5cGUsIGlzUmVsYXRpb25zaGlwOiB0cnVlLCBvcHRp
b25zOiBvcHRpb25zLCBraW5kOiAnYmVsb25nc1RvJyB9OwotCi0gIHJldHVybiBFbWJlci5jb21w
dXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09
IDIpIHsKLSAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlOwot
ICAgIH0KLQotICAgIHZhciBkYXRhID0gZ2V0KHRoaXMsICdkYXRhJykuYmVsb25nc1RvLAotICAg
ICAgICBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKSwgaWQ7Ci0KLSAgICBpZiAodHlwZW9mIHR5
cGUgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB0eXBlID0gZ2V0KHRoaXMsIHR5cGUsIGZhbHNlKSB8
fCBnZXQoRW1iZXIubG9va3VwLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBpZCA9IGRhdGFba2V5XTsK
LQotICAgIGlmKCFpZCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBlbHNlIGlmICh0eXBl
b2YgaWQgPT09ICdvYmplY3QnKSB7Ci0gICAgICByZXR1cm4gc3RvcmUucmVjb3JkRm9yUmVmZXJl
bmNlKGlkKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN0b3JlLmZpbmQodHlwZSwgaWQp
OwotICAgIH0KLSAgfSkucHJvcGVydHkoJ2RhdGEnKS5tZXRhKG1ldGEpOwotfTsKLQotLyoqCi0g
IFRoZXNlIG9ic2VydmVycyBvYnNlcnZlIGFsbCBgYmVsb25nc1RvYCByZWxhdGlvbnNoaXBzIG9u
IHRoZSByZWNvcmQuIFNlZQotICBgcmVsYXRpb25zaGlwcy9leHRgIHRvIHNlZSBob3cgdGhlc2Ug
b2JzZXJ2ZXJzIGdldCB0aGVpciBkZXBlbmRlbmNpZXMuCi0KLSovCi0KLURTLk1vZGVsLnJlb3Bl
bih7Ci0gIC8qKiBAcHJpdmF0ZSAqLwotICBiZWxvbmdzVG9XaWxsQ2hhbmdlOiBFbWJlci5iZWZv
cmVPYnNlcnZlcihmdW5jdGlvbihyZWNvcmQsIGtleSkgewotICAgIGlmIChnZXQocmVjb3JkLCAn
aXNMb2FkZWQnKSkgewotICAgICAgdmFyIG9sZFBhcmVudCA9IGdldChyZWNvcmQsIGtleSk7Ci0K
LSAgICAgIHZhciBjaGlsZFJlZmVyZW5jZSA9IGdldChyZWNvcmQsICdfcmVmZXJlbmNlJyksCi0g
ICAgICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLSAgICAgIGlmIChvbGRQYXJl
bnQpewotICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNo
YW5nZShjaGlsZFJlZmVyZW5jZSwgZ2V0KG9sZFBhcmVudCwgJ19yZWZlcmVuY2UnKSwgc3RvcmUs
IHsga2V5OiBrZXksIGtpbmQ6ImJlbG9uZ3NUbyIsIGNoYW5nZVR5cGU6ICJyZW1vdmUiIH0pOwot
ICAgICAgICBjaGFuZ2Uuc3luYygpOwotICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0g
PSBjaGFuZ2U7Ci0gICAgICB9Ci0gICAgfQotICB9KSwKLQotICAvKiogQHByaXZhdGUgKi8KLSAg
YmVsb25nc1RvRGlkQ2hhbmdlOiBFbWJlci5pbW1lZGlhdGVPYnNlcnZlcihmdW5jdGlvbihyZWNv
cmQsIGtleSkgewotICAgIGlmIChnZXQocmVjb3JkLCAnaXNMb2FkZWQnKSkgewotICAgICAgdmFy
IG5ld1BhcmVudCA9IGdldChyZWNvcmQsIGtleSk7Ci0gICAgICBpZihuZXdQYXJlbnQpewotICAg
ICAgICB2YXIgY2hpbGRSZWZlcmVuY2UgPSBnZXQocmVjb3JkLCAnX3JlZmVyZW5jZScpLAotICAg
ICAgICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLSAgICAgICAgdmFyIGNoYW5n
ZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWZlcmVuY2UsIGdl
dChuZXdQYXJlbnQsICdfcmVmZXJlbmNlJyksIHN0b3JlLCB7IGtleToga2V5LCBraW5kOiJiZWxv
bmdzVG8iLCBjaGFuZ2VUeXBlOiAiYWRkIiB9KTsKLSAgICAgICAgY2hhbmdlLnN5bmMoKTsKLSAg
ICAgICAgaWYodGhpcy5fY2hhbmdlc1RvU3luY1trZXldKXsKLSAgICAgICAgICBEUy5PbmVUb01h
bnlDaGFuZ2UuZW5zdXJlU2FtZVRyYW5zYWN0aW9uKFtjaGFuZ2UsIHRoaXMuX2NoYW5nZXNUb1N5
bmNba2V5XV0sIHN0b3JlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBkZWxldGUg
dGhpcy5fY2hhbmdlc1RvU3luY1trZXldOwotICB9KQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVu
Y3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgaGFz
UmVsYXRpb25zaGlwID0gZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewotICBvcHRpb25zID0gb3B0
aW9ucyB8fCB7fTsKLQotICB2YXIgbWV0YSA9IHsgdHlwZTogdHlwZSwgaXNSZWxhdGlvbnNoaXA6
IHRydWUsIG9wdGlvbnM6IG9wdGlvbnMsIGtpbmQ6ICdoYXNNYW55JyB9OwotCi0gIHJldHVybiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQo
dGhpcywgJ2RhdGEnKS5oYXNNYW55LAotICAgICAgICBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUn
KSwKLSAgICAgICAgaWRzLCByZWxhdGlvbnNoaXA7Ci0KLSAgICBpZiAodHlwZW9mIHR5cGUgPT09
ICdzdHJpbmcnKSB7Ci0gICAgICB0eXBlID0gZ2V0KHRoaXMsIHR5cGUsIGZhbHNlKSB8fCBnZXQo
RW1iZXIubG9va3VwLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBpZHMgPSBkYXRhW2tleV07Ci0gICAg
cmVsYXRpb25zaGlwID0gc3RvcmUuZmluZE1hbnkodHlwZSwgaWRzIHx8IFtdLCB0aGlzLCBtZXRh
KTsKLSAgICBzZXQocmVsYXRpb25zaGlwLCAnb3duZXInLCB0aGlzKTsKLSAgICBzZXQocmVsYXRp
b25zaGlwLCAnbmFtZScsIGtleSk7Ci0KLSAgICByZXR1cm4gcmVsYXRpb25zaGlwOwotICB9KS5w
cm9wZXJ0eSgpLm1ldGEobWV0YSk7Ci19OwotCi1EUy5oYXNNYW55ID0gZnVuY3Rpb24odHlwZSwg
b3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIlRoZSB0eXBlIHBhc3NlZCB0byBEUy5oYXNNYW55
IG11c3QgYmUgZGVmaW5lZCIsICEhdHlwZSk7Ci0gIHJldHVybiBoYXNSZWxhdGlvbnNoaXAodHlw
ZSwgb3B0aW9ucyk7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQHByaXZhdGUKLQotICBUaGlz
IGZpbGUgZGVmaW5lcyBzZXZlcmFsIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2UgYERTLk1vZGVsYCBj
bGFzcyB0aGF0Ci0gIGFkZCBzdXBwb3J0IGZvciBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXBzLgot
Ki8KLQotRFMuTW9kZWwucmVvcGVuKHsKLSAgLy8gVGhpcyBFbWJlci5qcyBob29rIGFsbG93cyBh
biBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHByb3BlcnR5Ci0gIC8vIGlzIGRlZmluZWQu
Ci0gIC8vCi0gIC8vIEluIHRoaXMgY2FzZSwgd2UgdXNlIGl0IHRvIGJlIG5vdGlmaWVkIHdoZW4g
YW4gRW1iZXIgRGF0YSB1c2VyIGRlZmluZXMgYQotICAvLyBiZWxvbmdzLXRvIHJlbGF0aW9uc2hp
cC4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHNldCB1cCBvYnNlcnZlcnMgZm9yCi0gIC8vIGVh
Y2ggb25lLCBhbGxvd2luZyB1cyB0byB0cmFjayByZWxhdGlvbnNoaXAgY2hhbmdlcyBhbmQgYXV0
b21hdGljYWxseQotICAvLyByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIGludmVyc2UgaGFzLW1hbnkg
YXJyYXkuCi0gIC8vCi0gIC8vIFRoaXMgaG9vayBwYXNzZXMgdGhlIGNsYXNzIGJlaW5nIHNldCB1
cCwgYXMgd2VsbCBhcyB0aGUga2V5IGFuZCB2YWx1ZQotICAvLyBiZWluZyBkZWZpbmVkLiBTbywg
Zm9yIGV4YW1wbGUsIHdoZW4gdGhlIHVzZXIgZG9lcyB0aGlzOgotICAvLwotICAvLyAgIERTLk1v
ZGVsLmV4dGVuZCh7Ci0gIC8vICAgICBwYXJlbnQ6IERTLmJlbG9uZ3NUbyhBcHAuVXNlcikKLSAg
Ly8gICB9KTsKLSAgLy8KLSAgLy8gVGhpcyBob29rIHdvdWxkIGJlIGNhbGxlZCB3aXRoICJwYXJl
bnQiIGFzIHRoZSBrZXkgYW5kIHRoZSBjb21wdXRlZAotICAvLyBwcm9wZXJ0eSByZXR1cm5lZCBi
eSBgRFMuYmVsb25nc1RvYCBhcyB0aGUgdmFsdWUuCi0gIGRpZERlZmluZVByb3BlcnR5OiBmdW5j
dGlvbihwcm90bywga2V5LCB2YWx1ZSkgewotICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBiZWlu
ZyBzZXQgaXMgYSBjb21wdXRlZCBwcm9wZXJ0eS4KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBF
bWJlci5EZXNjcmlwdG9yKSB7Ci0KLSAgICAgIC8vIElmIGl0IGlzLCBnZXQgdGhlIG1ldGFkYXRh
IGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGlzCi0gICAgICAvLyBwb3B1bGF0ZWQgYnkgdGhl
IGBEUy5iZWxvbmdzVG9gIGhlbHBlciB3aGVuIGl0IGlzIGNyZWF0aW5nCi0gICAgICAvLyB0aGUg
Y29tcHV0ZWQgcHJvcGVydHkuCi0gICAgICB2YXIgbWV0YSA9IHZhbHVlLm1ldGEoKTsKLQotICAg
ICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXAgJiYgbWV0YS5raW5kID09PSAnYmVsb25nc1RvJykg
ewotICAgICAgICBFbWJlci5hZGRPYnNlcnZlcihwcm90bywga2V5LCBudWxsLCAnYmVsb25nc1Rv
RGlkQ2hhbmdlJyk7Ci0gICAgICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHByb3RvLCBrZXks
IG51bGwsICdiZWxvbmdzVG9XaWxsQ2hhbmdlJyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtZXRh
LmlzQXR0cmlidXRlKSB7Ci0gICAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHByb3RvLCBrZXksIG51
bGwsICdhdHRyaWJ1dGVEaWRDaGFuZ2UnKTsKLSAgICAgICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2
ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2F0dHJpYnV0ZVdpbGxDaGFuZ2UnKTsKLSAgICAgIH0KLQot
ICAgICAgbWV0YS5wYXJlbnRUeXBlID0gcHJvdG8uY29uc3RydWN0b3I7Ci0gICAgfQotICB9Ci19
KTsKLQotLyoqCi0gIFRoZXNlIERTLk1vZGVsIGV4dGVuc2lvbnMgYWRkIGNsYXNzIG1ldGhvZHMg
dGhhdCBwcm92aWRlIHJlbGF0aW9uc2hpcAotICBpbnRyb3NwZWN0aW9uIGFiaWxpdGllcyBhYm91
dCByZWxhdGlvbnNoaXBzLgotCi0gIEEgbm90ZSBhYm91dCB0aGUgY29tcHV0ZWQgcHJvcGVydGll
cyBjb250YWluZWQgaGVyZToKLQotICAqKlRoZXNlIHByb3BlcnRpZXMgYXJlIGVmZmVjdGl2ZWx5
IHNlYWxlZCBvbmNlIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKioKLSAgVG8gYXZvaWQgcmVw
ZWF0ZWRseSBkb2luZyBleHBlbnNpdmUgaXRlcmF0aW9uIG92ZXIgYSBtb2RlbCdzIGZpZWxkcywg
dGhlc2UKLSAgdmFsdWVzIGFyZSBjb21wdXRlZCBvbmNlIGFuZCB0aGVuIGNhY2hlZCBmb3IgdGhl
IHJlbWFpbmRlciBvZiB0aGUgcnVudGltZSBvZgotICB5b3VyIGFwcGxpY2F0aW9uLgotCi0gIElm
IHlvdXIgYXBwbGljYXRpb24gbmVlZHMgdG8gbW9kaWZ5IGEgY2xhc3MgYWZ0ZXIgaXRzIGluaXRp
YWwgZGVmaW5pdGlvbgotICAoZm9yIGV4YW1wbGUsIHVzaW5nIGByZW9wZW4oKWAgdG8gYWRkIGFk
ZGl0aW9uYWwgYXR0cmlidXRlcyksIG1ha2Ugc3VyZSB5b3UKLSAgZG8gaXQgYmVmb3JlIHVzaW5n
IHlvdXIgbW9kZWwgd2l0aCB0aGUgc3RvcmUsIHdoaWNoIHVzZXMgdGhlc2UgcHJvcGVydGllcwot
ICBleHRlbnNpdmVseS4KLSovCi0KLURTLk1vZGVsLnJlb3BlbkNsYXNzKHsKLSAgLyoqCi0gICAg
Rm9yIGEgZ2l2ZW4gcmVsYXRpb25zaGlwIG5hbWUsIHJldHVybnMgdGhlIG1vZGVsIHR5cGUgb2Yg
dGhlIHJlbGF0aW9uc2hpcC4KLQotICAgIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lIGEgbW9k
ZWwgbGlrZSB0aGlzOgotCi0gICAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAg
ICAgICAgICBjb21tZW50czogRFMuaGFzTWFueShBcHAuQ29tbWVudCkKLSAgICAgICAgfSk7Ci0K
LSAgICBDYWxsaW5nIGBBcHAuUG9zdC50eXBlRm9yUmVsYXRpb25zaGlwKCdjb21tZW50cycpYCB3
aWxsIHJldHVybiBgQXBwLkNvbW1lbnRgLgotCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhl
IG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcAotICAgIEByZXR1cm4ge3N1YmNsYXNzIG9mIERTLk1v
ZGVsfSB0aGUgdHlwZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBvciB1bmRlZmluZWQKLSAgKi8KLSAg
dHlwZUZvclJlbGF0aW9uc2hpcDogZnVuY3Rpb24obmFtZSkgewotICAgIHZhciByZWxhdGlvbnNo
aXAgPSBnZXQodGhpcywgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5nZXQobmFtZSk7Ci0gICAgcmV0
dXJuIHJlbGF0aW9uc2hpcCAmJiByZWxhdGlvbnNoaXAudHlwZTsKLSAgfSwKLQotICAvKioKLSAg
ICBUaGUgbW9kZWwncyByZWxhdGlvbnNoaXBzIGFzIGEgbWFwLCBrZXllZCBvbiB0aGUgdHlwZSBv
ZiB0aGUKLSAgICByZWxhdGlvbnNoaXAuIFRoZSB2YWx1ZSBvZiBlYWNoIGVudHJ5IGlzIGFuIGFy
cmF5IGNvbnRhaW5pbmcgYSBkZXNjcmlwdG9yCi0gICAgZm9yIGVhY2ggcmVsYXRpb25zaGlwIHdp
dGggdGhhdCB0eXBlLCBkZXNjcmliaW5nIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAg
ICBhcyB3ZWxsIGFzIHRoZSB0eXBlLgotCi0gICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xs
b3dpbmcgbW9kZWwgZGVmaW5pdGlvbjoKLQotICAgICAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4
dGVuZCh7Ci0gICAgICAgICAgdXNlcnM6IERTLmhhc01hbnkoQXBwLlVzZXIpLAotICAgICAgICAg
IG93bmVyOiBEUy5iZWxvbmdzVG8oQXBwLlVzZXIpLAotICAgICAgICAgIHBvc3RzOiBEUy5oYXNN
YW55KEFwcC5Qb3N0KQotICAgICAgICB9KTsKLQotICAgIFRoaXMgY29tcHV0ZWQgcHJvcGVydHkg
d291bGQgcmV0dXJuIGEgbWFwIGRlc2NyaWJpbmcgdGhlc2UKLSAgICByZWxhdGlvbnNoaXBzLCBs
aWtlIHRoaXM6Ci0KLSAgICAgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBFbWJlci5nZXQoQXBwLkJs
b2csICdyZWxhdGlvbnNoaXBzJyk7Ci0gICAgICAgIGFzc29jaWF0b25zLmdldChBcHAuVXNlcik7
Ci0gICAgICAgIC8vPT4gWyB7IG5hbWU6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAotICAg
ICAgICAvLyAgICAgeyBuYW1lOiAnb3duZXInLCBraW5kOiAnYmVsb25nc1RvJyB9IF0KLSAgICAg
ICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlBvc3QpOwotICAgICAgICAvLz0+IFsgeyBuYW1lOiAn
cG9zdHMnLCBraW5kOiAnaGFzTWFueScgfSBdCi0KLSAgICBAdHlwZSBFbWJlci5NYXAKLSAgICBA
cmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIG1hcCA9IG5ldyBFbWJlci5NYXBXaXRoRGVmYXVsdCh7Ci0gICAgICBkZWZh
dWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0KLSAgICB9KTsKLQotICAgIC8vIExv
b3AgdGhyb3VnaCBlYWNoIGNvbXB1dGVkIHByb3BlcnR5IG9uIHRoZSBjbGFzcwotICAgIHRoaXMu
ZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotCi0gICAgICAvLyBJ
ZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgYSByZWxhdGlvbnNoaXAsIGFkZAotICAgICAgLy8g
aXQgdG8gdGhlIG1hcC4KLSAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlwKSB7Ci0gICAgICAg
IGlmICh0eXBlb2YgbWV0YS50eXBlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIG1ldGEudHlw
ZSA9IEVtYmVyLmdldChFbWJlci5sb29rdXAsIG1ldGEudHlwZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICB2YXIgcmVsYXRpb25zaGlwc0ZvclR5cGUgPSBtYXAuZ2V0KG1ldGEudHlwZSk7Ci0KLSAg
ICAgICAgcmVsYXRpb25zaGlwc0ZvclR5cGUucHVzaCh7IG5hbWU6IG5hbWUsIGtpbmQ6IG1ldGEu
a2luZCB9KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0pLAotCi0g
IC8qKgotICAgIEEgaGFzaCBjb250YWluaW5nIGxpc3RzIG9mIHRoZSBtb2RlbCdzIHJlbGF0aW9u
c2hpcHMsIGdyb3VwZWQKLSAgICBieSB0aGUgcmVsYXRpb25zaGlwIGtpbmQuIEZvciBleGFtcGxl
LCBnaXZlbiBhIG1vZGVsIHdpdGggdGhpcwotICAgIGRlZmluaXRpb246Ci0KLSAgICAgICAgQXBw
LkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgICAgIHVzZXJzOiBEUy5oYXNNYW55KEFw
cC5Vc2VyKSwKLSAgICAgICAgICBvd25lcjogRFMuYmVsb25nc1RvKEFwcC5Vc2VyKSwKLQotICAg
ICAgICAgIHBvc3RzOiBEUy5oYXNNYW55KEFwcC5Qb3N0KQotICAgICAgICB9KTsKLQotICAgIFRo
aXMgcHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgdmFyIHJl
bGF0aW9uc2hpcE5hbWVzID0gRW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRpb25zaGlwTmFtZXMn
KTsKLSAgICAgICByZWxhdGlvbnNoaXBOYW1lcy5oYXNNYW55OwotICAgICAgIC8vPT4gWyd1c2Vy
cycsICdwb3N0cyddCi0gICAgICAgcmVsYXRpb25zaGlwTmFtZXMuYmVsb25nc1RvOwotICAgICAg
IC8vPT4gWydvd25lciddCi0KLSAgICBAdHlwZSBPYmplY3QKLSAgICBAcmVhZE9ubHkKLSAgKi8K
LSAgcmVsYXRpb25zaGlwTmFtZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZh
ciBuYW1lcyA9IHsgaGFzTWFueTogW10sIGJlbG9uZ3NUbzogW10gfTsKLQotICAgIHRoaXMuZWFj
aENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEu
aXNSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgbmFtZXNbbWV0YS5raW5kXS5wdXNoKG5hbWUpOwot
ICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG5hbWVzOwotICB9KSwKLQotICAvKioKLSAg
ICBBbiBhcnJheSBvZiB0eXBlcyBkaXJlY3RseSByZWxhdGVkIHRvIGEgbW9kZWwuIEVhY2ggdHlw
ZSB3aWxsIGJlCi0gICAgaW5jbHVkZWQgb25jZSwgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9m
IHJlbGF0aW9uc2hpcHMgaXQgaGFzIHdpdGgKLSAgICB0aGUgbW9kZWwuCi0KLSAgICBGb3IgZXhh
bXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMgZGVmaW5pdGlvbjoKLQotICAgICAgICBBcHAu
QmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICAgICAgdXNlcnM6IERTLmhhc01hbnkoQXBw
LlVzZXIpLAotICAgICAgICAgIG93bmVyOiBEUy5iZWxvbmdzVG8oQXBwLlVzZXIpLAotICAgICAg
ICAgIHBvc3RzOiBEUy5oYXNNYW55KEFwcC5Qb3N0KQotICAgICAgICB9KTsKLQotICAgIFRoaXMg
cHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgdmFyIHJlbGF0
ZWRUeXBlcyA9IEVtYmVyLmdldChBcHAuQmxvZywgJ3JlbGF0ZWRUeXBlcycpOwotICAgICAgIC8v
PT4gWyBBcHAuVXNlciwgQXBwLlBvc3QgXQotCi0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAgICBA
cmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRlZFR5cGVzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigp
IHsKLSAgICB2YXIgdHlwZSwKLSAgICAgICAgdHlwZXMgPSBFbWJlci5BKFtdKTsKLQotICAgIC8v
IExvb3AgdGhyb3VnaCBlYWNoIGNvbXB1dGVkIHByb3BlcnR5IG9uIHRoZSBjbGFzcywKLSAgICAv
LyBhbmQgY3JlYXRlIGFuIGFycmF5IG9mIHRoZSB1bmlxdWUgdHlwZXMgaW52b2x2ZWQKLSAgICAv
LyBpbiByZWxhdGlvbnNoaXBzCi0gICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlv
bihuYW1lLCBtZXRhKSB7Ci0gICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgewotICAgICAg
ICB0eXBlID0gbWV0YS50eXBlOwotCi0gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmlu
ZycpIHsKLSAgICAgICAgICB0eXBlID0gZ2V0KHRoaXMsIHR5cGUsIGZhbHNlKSB8fCBnZXQoRW1i
ZXIubG9va3VwLCB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdHlwZXMuY29udGFp
bnModHlwZSkpIHsKLSAgICAgICAgICB0eXBlcy5wdXNoKHR5cGUpOwotICAgICAgICB9Ci0gICAg
ICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0pLAotCi0gIC8qKgotICAgIEEg
bWFwIHdob3NlIGtleXMgYXJlIHRoZSByZWxhdGlvbnNoaXBzIG9mIGEgbW9kZWwgYW5kIHdob3Nl
IHZhbHVlcyBhcmUKLSAgICByZWxhdGlvbnNoaXAgZGVzY3JpcHRvcnMuCi0KLSAgICBGb3IgZXhh
bXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMKLSAgICBkZWZpbml0aW9uOgotCi0gICAgICAg
IEFwcC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgICAgICB1c2VyczogRFMuaGFzTWFu
eShBcHAuVXNlciksCi0gICAgICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbyhBcHAuVXNlciksCi0K
LSAgICAgICAgICBwb3N0czogRFMuaGFzTWFueShBcHAuUG9zdCkKLSAgICAgICAgfSk7Ci0KLSAg
ICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQotICAgICAgIHZh
ciByZWxhdGlvbnNoaXBzQnlOYW1lID0gRW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRpb25zaGlw
c0J5TmFtZScpOwotICAgICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCd1c2VycycpOwotICAg
ICAgIC8vPT4geyBrZXk6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JywgdHlwZTogQXBwLlVzZXIg
fQotICAgICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCdvd25lcicpOwotICAgICAgIC8vPT4g
eyBrZXk6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nLCB0eXBlOiBBcHAuVXNlciB9Ci0KLSAg
ICBAdHlwZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwc0J5
TmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9IEVtYmVyLk1h
cC5jcmVhdGUoKSwgdHlwZTsKLQotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rp
b24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKLSAgICAg
ICAgbWV0YS5rZXkgPSBuYW1lOwotICAgICAgICB0eXBlID0gbWV0YS50eXBlOwotCi0gICAgICAg
IGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICB0eXBlID0gZ2V0KHRo
aXMsIHR5cGUsIGZhbHNlKSB8fCBnZXQoRW1iZXIubG9va3VwLCB0eXBlKTsKLSAgICAgICAgICBt
ZXRhLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwLnNldChuYW1lLCBtZXRh
KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0pLAotCi0gIC8qKgot
ICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIG1vZGVsIGFuZCB3aG9z
ZSB2YWx1ZXMgYXJlIHN0cmluZ3MKLSAgICBkZXNjcmliaW5nIHRoZSBraW5kIG9mIHRoZSBmaWVs
ZC4gQSBtb2RlbCdzIGZpZWxkcyBhcmUgdGhlIHVuaW9uIG9mIGFsbCBvZiBpdHMKLSAgICBhdHRy
aWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzLgotCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgICAg
QXBwLkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgICAgIHVzZXJzOiBEUy5oYXNNYW55
KEFwcC5Vc2VyKSwKLSAgICAgICAgICBvd25lcjogRFMuYmVsb25nc1RvKEFwcC5Vc2VyKSwKLQot
ICAgICAgICAgIHBvc3RzOiBEUy5oYXNNYW55KEFwcC5Qb3N0KSwKLQotICAgICAgICAgIHRpdGxl
OiBEUy5hdHRyKCdzdHJpbmcnKQotICAgICAgICB9KTsKLQotICAgICAgICB2YXIgZmllbGRzID0g
RW1iZXIuZ2V0KEFwcC5CbG9nLCAnZmllbGRzJyk7Ci0gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1
bmN0aW9uKGZpZWxkLCBraW5kKSB7Ci0gICAgICAgICAgY29uc29sZS5sb2coZmllbGQsIGtpbmQp
OwotICAgICAgICB9KTsKLQotICAgICAgICAvLyBwcmludHM6Ci0gICAgICAgIC8vIHVzZXJzLCBo
YXNNYW55Ci0gICAgICAgIC8vIG93bmVyLCBiZWxvbmdzVG8KLSAgICAgICAgLy8gcG9zdHMsIGhh
c01hbnkKLSAgICAgICAgLy8gdGl0bGUsIGF0dHJpYnV0ZQotCi0gICAgQHR5cGUgRW1iZXIuTWFw
Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGZpZWxkczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKLQotICAgIHRoaXMu
ZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1l
dGEuaXNSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgbWFwLnNldChuYW1lLCBtZXRhLmtpbmQpOwot
ICAgICAgfSBlbHNlIGlmIChtZXRhLmlzQXR0cmlidXRlKSB7Ci0gICAgICAgIG1hcC5zZXQobmFt
ZSwgJ2F0dHJpYnV0ZScpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG1hcDsKLSAg
fSksCi0KLSAgLyoqCi0gICAgR2l2ZW4gYSBjYWxsYmFjaywgaXRlcmF0ZXMgb3ZlciBlYWNoIG9m
IHRoZSByZWxhdGlvbnNoaXBzIGluIHRoZSBtb2RlbCwKLSAgICBpbnZva2luZyB0aGUgY2FsbGJh
Y2sgd2l0aCB0aGUgbmFtZSBvZiBlYWNoIHJlbGF0aW9uc2hpcCBhbmQgaXRzIHJlbGF0aW9uc2hp
cAotICAgIGRlc2NyaXB0b3IuCi0KLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUg
Y2FsbGJhY2sgdG8gaW52b2tlCi0gICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRv
IHdoaWNoIHRoZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKLSAgKi8KLSAgZWFj
aFJlbGF0aW9uc2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhp
cywgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9u
c2hpcCkgewotICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBuYW1lLCByZWxhdGlvbnNoaXAp
OwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVz
IG92ZXIgZWFjaCBvZiB0aGUgdHlwZXMgcmVsYXRlZCB0byBhIG1vZGVsLAotICAgIGludm9raW5n
IHRoZSBjYWxsYmFjayB3aXRoIHRoZSByZWxhdGVkIHR5cGUncyBjbGFzcy4gRWFjaCB0eXBlIHdp
bGwgYmUKLSAgICByZXR1cm5lZCBqdXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZGlm
ZmVyZW50IHJlbGF0aW9uc2hpcHMgaXQgaGFzCi0gICAgd2l0aCBhIG1vZGVsLgotCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBwYXJh
bSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Ag
c2hvdWxkIGJlIGJvdW5kCi0gICovCi0gIGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2FsbGJh
Y2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhpcywgJ3JlbGF0ZWRUeXBlcycpLmZvckVhY2goZnVu
Y3Rpb24odHlwZSkgewotICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCB0eXBlKTsKLSAgICB9
KTsKLSAgfQotfSk7Ci0KLURTLk1vZGVsLnJlb3Blbih7Ci0gIC8qKgotICAgIEdpdmVuIGEgY2Fs
bGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFjaCBvZiB0aGUgcmVsYXRpb25zaGlwcyBpbiB0aGUgbW9k
ZWwsCi0gICAgaW52b2tpbmcgdGhlIGNhbGxiYWNrIHdpdGggdGhlIG5hbWUgb2YgZWFjaCByZWxh
dGlvbnNoaXAgYW5kIGl0cyByZWxhdGlvbnNoaXAKLSAgICBkZXNjcmlwdG9yLgotCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBwYXJh
bSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Ag
c2hvdWxkIGJlIGJvdW5kCi0gICovCi0gIGVhY2hSZWxhdGlvbnNoaXA6IGZ1bmN0aW9uKGNhbGxi
YWNrLCBiaW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoUmVsYXRpb25zaGlwKGNh
bGxiYWNrLCBiaW5kaW5nKTsKLSAgfQotfSk7Ci0KLS8qKgotICBAcHJpdmF0ZQotCi0gIEhlbHBl
ciBtZXRob2QgdG8gbG9vayB1cCB0aGUgbmFtZSBvZiB0aGUgaW52ZXJzZSBvZiBhIHJlbGF0aW9u
c2hpcC4KLQotICBJbiBhIGhhcy1tYW55IHJlbGF0aW9uc2hpcCwgdGhlcmUgYXJlIGFsd2F5cyB0
d28gc2lkZXM6IHRoZSBgYmVsb25nc1RvYCBzaWRlCi0gIGFuZCB0aGUgYGhhc01hbnlgIHNpZGUu
IFdoZW4gb25lIHNpZGUgY2hhbmdlcywgdGhlIG90aGVyIHNpZGUgc2hvdWxkIGJlIHVwZGF0ZWQK
LSAgYXV0b21hdGljYWxseS4KLQotICBHaXZlbiBhIG1vZGVsLCB0aGUgbW9kZWwgb2YgdGhlIGlu
dmVyc2UsIGFuZCB0aGUga2luZCBvZiB0aGUgcmVsYXRpb25zaGlwLCB0aGlzCi0gIGhlbHBlciBy
ZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgb24gdGhlIGludmVyc2UuCi0KLSAg
Rm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyB0d28gYXNzb2NpYXRlZCBtb2RlbHM6
Ci0KLSAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgICAgY29tbWVudHM6
IERTLmhhc01hbnkoJ0FwcC5Db21tZW50JykKLSAgICAgIH0pOwotCi0gICAgICBBcHAuQ29tbWVu
dCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICAgIHBvc3Q6IERTLmJlbG9uZ3NUbygnQXBwLlBv
c3QnKQotICAgICAgfSk7Ci0KLSAgSWYgdGhlIGBwb3N0YCBwcm9wZXJ0eSBvZiBhIGBDb21tZW50
YCB3YXMgbW9kaWZpZWQsIEVtYmVyIERhdGEgd291bGQgaW52b2tlCi0gIHRoaXMgaGVscGVyIGxp
a2UgdGhpczoKLQotICAgICAgRFMuX2ludmVyc2VOYW1lRm9yKEFwcC5Db21tZW50LCBBcHAuUG9z
dCwgJ2hhc01hbnknKTsKLSAgICAgIC8vPT4gJ2NvbW1lbnRzJwotCi0gIEVtYmVyIERhdGEgdXNl
cyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIHJldHVybmVkIHRvIHJlZmxlY3QgdGhlIGNo
YW5nZWQKLSAgcmVsYXRpb25zaGlwIG9uIHRoZSBvdGhlciBzaWRlLgotKi8KLURTLl9pbnZlcnNl
UmVsYXRpb25zaGlwRm9yID0gZnVuY3Rpb24obW9kZWxUeXBlLCBpbnZlcnNlTW9kZWxUeXBlKSB7
Ci0gIHZhciByZWxhdGlvbnNoaXBNYXAgPSBnZXQobW9kZWxUeXBlLCAncmVsYXRpb25zaGlwcycp
LAotICAgICAgcG9zc2libGVSZWxhdGlvbnNoaXBzID0gcmVsYXRpb25zaGlwTWFwLmdldChpbnZl
cnNlTW9kZWxUeXBlKSwKLSAgICAgIHBvc3NpYmxlLCBhY3R1YWwsIG9sZFZhbHVlOwotCi0gIGlm
ICghcG9zc2libGVSZWxhdGlvbnNoaXBzKSB7IHJldHVybjsgfQotICBpZiAocG9zc2libGVSZWxh
dGlvbnNoaXBzLmxlbmd0aCA+IDEpIHsgcmV0dXJuOyB9Ci0gIHJldHVybiBwb3NzaWJsZVJlbGF0
aW9uc2hpcHNbMF07Ci19OwotCi0vKioKLSAgQHByaXZhdGUKLQotICBHaXZlbiBhIG1vZGVsIGFu
ZCBhIHJlbGF0aW9uc2hpcCBuYW1lLCByZXR1cm5zIHRoZSBtb2RlbCB0eXBlIG9mCi0gIHRoZSBu
YW1lZCByZWxhdGlvbnNoaXAuCi0KLSAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsK
LSAgICAgICAgY29tbWVudHM6IERTLmhhc01hbnkoJ0FwcC5Db21tZW50JykKLSAgICAgIH0pOwot
Ci0gICAgICBEUy5faW52ZXJzZVR5cGVGb3IoQXBwLlBvc3QsICdjb21tZW50cycpOwotICAgICAg
Ly89PiBBcHAuQ29tbWVudAotICBAcGFyYW0ge0RTLk1vZGVsIGNsYXNzfSBtb2RlbFR5cGUKLSAg
QHBhcmFtIHtTdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUKLSAgQHJldHVybiB7RFMuTW9kZWwgY2xh
c3N9Ci0qLwotRFMuX2ludmVyc2VUeXBlRm9yID0gZnVuY3Rpb24obW9kZWxUeXBlLCByZWxhdGlv
bnNoaXBOYW1lKSB7Ci0gIHZhciByZWxhdGlvbnNoaXBzID0gZ2V0KG1vZGVsVHlwZSwgJ3JlbGF0
aW9uc2hpcHNCeU5hbWUnKSwKLSAgICAgIHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHMuZ2V0
KHJlbGF0aW9uc2hpcE5hbWUpOwotCi0gIGlmIChyZWxhdGlvbnNoaXApIHsgcmV0dXJuIHJlbGF0
aW9uc2hpcC50eXBlOyB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVt
ZXJhYmxlVXRpbHMuZm9yRWFjaDsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlID0gZnVuY3Rpb24o
b3B0aW9ucykgewotICB0aGlzLnBhcmVudFJlZmVyZW5jZSA9IG9wdGlvbnMucGFyZW50UmVmZXJl
bmNlOwotICB0aGlzLmNoaWxkUmVmZXJlbmNlID0gb3B0aW9ucy5jaGlsZFJlZmVyZW5jZTsKLSAg
dGhpcy5maXJzdFJlY29yZFJlZmVyZW5jZSA9IG9wdGlvbnMuZmlyc3RSZWNvcmRSZWZlcmVuY2U7
Ci0gIHRoaXMuZmlyc3RSZWNvcmRLaW5kID0gb3B0aW9ucy5maXJzdFJlY29yZEtpbmQ7Ci0gIHRo
aXMuZmlyc3RSZWNvcmROYW1lID0gb3B0aW9ucy5maXJzdFJlY29yZE5hbWU7Ci0gIHRoaXMuc2Vj
b25kUmVjb3JkUmVmZXJlbmNlID0gb3B0aW9ucy5zZWNvbmRSZWNvcmRSZWZlcmVuY2U7Ci0gIHRo
aXMuc2Vjb25kUmVjb3JkS2luZCA9IG9wdGlvbnMuc2Vjb25kUmVjb3JkS2luZDsKLSAgdGhpcy5z
ZWNvbmRSZWNvcmROYW1lID0gb3B0aW9ucy5zZWNvbmRSZWNvcmROYW1lOwotICB0aGlzLnN0b3Jl
ID0gb3B0aW9ucy5zdG9yZTsKLSAgdGhpcy5jb21taXR0ZWQgPSB7fTsKLSAgdGhpcy5jaGFuZ2VU
eXBlID0gb3B0aW9ucy5jaGFuZ2VUeXBlOwotfTsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRk
ID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIERTLlJlbGF0aW9uc2hpcENoYW5nZS5jYWxsKHRoaXMs
IG9wdGlvbnMpOwotfTsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlID0gZnVuY3Rpb24o
b3B0aW9ucyl7Ci0gIERTLlJlbGF0aW9uc2hpcENoYW5nZS5jYWxsKHRoaXMsIG9wdGlvbnMpOwot
fTsKLQotLyoqIEBwcml2YXRlICovCi1EUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlID0gZnVu
Y3Rpb24ob3B0aW9ucykgewotICByZXR1cm4gbmV3IERTLlJlbGF0aW9uc2hpcENoYW5nZShvcHRp
b25zKTsKLX07Ci0KLS8qKiBAcHJpdmF0ZSAqLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRkLmNy
ZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBEUy5SZWxhdGlvbnNoaXBD
aGFuZ2VBZGQob3B0aW9ucyk7Ci19OwotCi0vKiogQHByaXZhdGUgKi8KLURTLlJlbGF0aW9uc2hp
cENoYW5nZVJlbW92ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHJldHVybiBuZXcg
RFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlKG9wdGlvbnMpOwotfTsKLQotRFMuT25lVG9NYW55
Q2hhbmdlID0ge307Ci1EUy5PbmVUb05vbmVDaGFuZ2UgPSB7fTsKLURTLk1hbnlUb05vbmVDaGFu
Z2UgPSB7fTsKLURTLk9uZVRvT25lQ2hhbmdlID0ge307Ci1EUy5NYW55VG9NYW55Q2hhbmdlID0g
e307Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24ob3B0
aW9ucyl7Ci0gIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFkZCIpewotICAgIHJldHVybiBE
Uy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci0gIGlmKG9wdGlv
bnMuY2hhbmdlVHlwZSA9PT0gInJlbW92ZSIpewotICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBD
aGFuZ2VSZW1vdmUuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci19OwotCi0KLURTLlJlbGF0aW9uc2hp
cENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlID0gZnVuY3Rpb24ocmVjb3JkVHlwZSwg
a25vd25TaWRlKXsKLSAgdmFyIGtub3duS2V5ID0ga25vd25TaWRlLmtleSwga2V5LCB0eXBlLCBv
dGhlckNvbnRhaW5lclR5cGUsYXNzb2M7Ci0gIHZhciBrbm93bkNvbnRhaW5lclR5cGUgPSBrbm93
blNpZGUua2luZDsKLSAgdmFyIG9wdGlvbnMgPSByZWNvcmRUeXBlLm1ldGFGb3JQcm9wZXJ0eShr
bm93bktleSkub3B0aW9uczsKLSAgdmFyIG90aGVyVHlwZSA9IERTLl9pbnZlcnNlVHlwZUZvcihy
ZWNvcmRUeXBlLCBrbm93bktleSk7Ci0KLSAgaWYob3B0aW9ucy5pbnZlcnNlKXsKLSAgICBrZXkg
PSBvcHRpb25zLmludmVyc2U7Ci0gICAgb3RoZXJDb250YWluZXJUeXBlID0gZ2V0KG90aGVyVHlw
ZSwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5nZXQoa2V5KS5raW5kOyAKLSAgfSAKLSAgZWxzZSBp
Zihhc3NvYyA9IERTLl9pbnZlcnNlUmVsYXRpb25zaGlwRm9yKG90aGVyVHlwZSwgcmVjb3JkVHlw
ZSkpewotICAgIGtleSA9IGFzc29jLm5hbWU7Ci0gICAgb3RoZXJDb250YWluZXJUeXBlID0gYXNz
b2Mua2luZDsKLSAgfSAKLSAgaWYoIWtleSl7Ci0gICAgcmV0dXJuIGtub3duQ29udGFpbmVyVHlw
ZSA9PT0gImJlbG9uZ3NUbyIgPyAib25lVG9Ob25lIiA6ICJtYW55VG9Ob25lIjsKLSAgfQotICBl
bHNlewotICAgIGlmKG90aGVyQ29udGFpbmVyVHlwZSA9PT0gImJlbG9uZ3NUbyIpewotICAgICAg
cmV0dXJuIGtub3duQ29udGFpbmVyVHlwZSA9PT0gImJlbG9uZ3NUbyIgPyAib25lVG9PbmUiIDog
Im1hbnlUb09uZSI7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICByZXR1cm4ga25vd25Db250YWlu
ZXJUeXBlID09PSAiYmVsb25nc1RvIiA/ICJvbmVUb01hbnkiIDogIm1hbnlUb01hbnkiOwotICAg
IH0KLSAgfSAKLSAKLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5jcmVhdGVDaGFuZ2UgPSBm
dW5jdGlvbihmaXJzdFJlY29yZFJlZmVyZW5jZSwgc2Vjb25kUmVjb3JkUmVmZXJlbmNlLCBzdG9y
ZSwgb3B0aW9ucyl7Ci0gIC8vIEdldCB0aGUgdHlwZSBvZiB0aGUgY2hpbGQgYmFzZWQgb24gdGhl
IGNoaWxkJ3MgY2xpZW50IElECi0gIHZhciBmaXJzdFJlY29yZFR5cGUgPSBmaXJzdFJlY29yZFJl
ZmVyZW5jZS50eXBlLCBrZXksIGNoYW5nZVR5cGU7Ci0gIGNoYW5nZVR5cGUgPSBEUy5SZWxhdGlv
bnNoaXBDaGFuZ2UuZGV0ZXJtaW5lUmVsYXRpb25zaGlwVHlwZShmaXJzdFJlY29yZFR5cGUsIG9w
dGlvbnMpOwotICBpZiAoY2hhbmdlVHlwZSA9PT0gIm9uZVRvTWFueSIpewotICAgIHJldHVybiBE
Uy5PbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkUmVmZXJlbmNlLCBzZWNv
bmRSZWNvcmRSZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNlIGlmIChjaGFu
Z2VUeXBlID09PSAibWFueVRvT25lIil7Ci0gICAgcmV0dXJuIERTLk9uZVRvTWFueUNoYW5nZS5j
cmVhdGVDaGFuZ2Uoc2Vjb25kUmVjb3JkUmVmZXJlbmNlLCBmaXJzdFJlY29yZFJlZmVyZW5jZSwg
c3RvcmUsIG9wdGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJvbmVUb05v
bmUiKXsKLSAgICByZXR1cm4gRFMuT25lVG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJl
Y29yZFJlZmVyZW5jZSwgc2Vjb25kUmVjb3JkUmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucyk7Ci0g
IH0KLSAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gIm1hbnlUb05vbmUiKXsKLSAgICByZXR1cm4g
RFMuTWFueVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmRSZWZlcmVuY2UsIHNl
Y29uZFJlY29yZFJlZmVyZW5jZSwgc3RvcmUsIG9wdGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNo
YW5nZVR5cGUgPT09ICJvbmVUb09uZSIpewotICAgIHJldHVybiBEUy5PbmVUb09uZUNoYW5nZS5j
cmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmRSZWZlcmVuY2UsIHNlY29uZFJlY29yZFJlZmVyZW5jZSwg
c3RvcmUsIG9wdGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJtYW55VG9N
YW55Iil7Ci0gICAgcmV0dXJuIERTLk1hbnlUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0
UmVjb3JkUmVmZXJlbmNlLCBzZWNvbmRSZWNvcmRSZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25zKTsK
LSAgfQotfTsKLQotLyoqIEBwcml2YXRlICovCi1EUy5PbmVUb05vbmVDaGFuZ2UuY3JlYXRlQ2hh
bmdlID0gZnVuY3Rpb24oY2hpbGRSZWZlcmVuY2UsIHBhcmVudFJlZmVyZW5jZSwgc3RvcmUsIG9w
dGlvbnMpIHsKLSAgdmFyIGtleSA9IG9wdGlvbnMua2V5OwotICB2YXIgY2hhbmdlID0gRFMuUmVs
YXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoewotICAgICAgcGFyZW50UmVmZXJlbmNlOiBw
YXJlbnRSZWZlcmVuY2UsCi0gICAgICBjaGlsZFJlZmVyZW5jZTogY2hpbGRSZWZlcmVuY2UsCi0g
ICAgICBmaXJzdFJlY29yZFJlZmVyZW5jZTogY2hpbGRSZWZlcmVuY2UsCi0gICAgICBzdG9yZTog
c3RvcmUsCi0gICAgICBjaGFuZ2VUeXBlOiBvcHRpb25zLmNoYW5nZVR5cGUsCi0gICAgICBmaXJz
dFJlY29yZE5hbWU6IGtleSwKLSAgICAgIGZpcnN0UmVjb3JkS2luZDogImJlbG9uZ3NUbyIKLSAg
fSk7Ci0KLSAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBr
ZXksIHBhcmVudFJlZmVyZW5jZSwgbnVsbCwgY2hhbmdlKTsKLQotICByZXR1cm4gY2hhbmdlOwot
fTsKLQotLyoqIEBwcml2YXRlICovCi1EUy5NYW55VG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9
IGZ1bmN0aW9uKGNoaWxkUmVmZXJlbmNlLCBwYXJlbnRSZWZlcmVuY2UsIHN0b3JlLCBvcHRpb25z
KSB7Ci0gIHZhciBrZXkgPSBvcHRpb25zLmtleTsKLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9u
c2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBhcmVudFJlZmVyZW5jZTogY2hpbGRS
ZWZlcmVuY2UsCi0gICAgICBjaGlsZFJlZmVyZW5jZTogcGFyZW50UmVmZXJlbmNlLAotICAgICAg
c2Vjb25kUmVjb3JkUmVmZXJlbmNlOiBjaGlsZFJlZmVyZW5jZSwKLSAgICAgIHN0b3JlOiBzdG9y
ZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIHNlY29uZFJl
Y29yZE5hbWU6IG9wdGlvbnMua2V5LAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnki
Ci0gIH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlZmVyZW5j
ZSwga2V5LCBwYXJlbnRSZWZlcmVuY2UsIG51bGwsIGNoYW5nZSk7Ci0gIHJldHVybiBjaGFuZ2U7
Ci19OwotCi0KLS8qKiBAcHJpdmF0ZSAqLwotRFMuTWFueVRvTWFueUNoYW5nZS5jcmVhdGVDaGFu
Z2UgPSBmdW5jdGlvbihjaGlsZFJlZmVyZW5jZSwgcGFyZW50UmVmZXJlbmNlLCBzdG9yZSwgb3B0
aW9ucykgewotICAvLyBHZXQgdGhlIHR5cGUgb2YgdGhlIGNoaWxkIGJhc2VkIG9uIHRoZSBjaGls
ZCdzIGNsaWVudCBJRAotICB2YXIgY2hpbGRUeXBlID0gY2hpbGRSZWZlcmVuY2UudHlwZSwga2V5
OwotCi0gIC8vIElmIHRoZSBuYW1lIG9mIHRoZSBiZWxvbmdzVG8gc2lkZSBvZiB0aGUgcmVsYXRp
b25zaGlwIGlzIHNwZWNpZmllZCwKLSAgLy8gdXNlIHRoYXQKLSAgLy8gSWYgdGhlIHR5cGUgb2Yg
dGhlIHBhcmVudCBpcyBzcGVjaWZpZWQsIGxvb2sgaXQgdXAgb24gdGhlIGNoaWxkJ3MgdHlwZQot
ICAvLyBkZWZpbml0aW9uLgotICBrZXkgPSBvcHRpb25zLmtleTsKLQotICB2YXIgY2hhbmdlID0g
RFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoewotICAgICAgcGFyZW50UmVmZXJl
bmNlOiBwYXJlbnRSZWZlcmVuY2UsCi0gICAgICBjaGlsZFJlZmVyZW5jZTogY2hpbGRSZWZlcmVu
Y2UsCi0gICAgICBmaXJzdFJlY29yZFJlZmVyZW5jZTogY2hpbGRSZWZlcmVuY2UsCi0gICAgICBz
ZWNvbmRSZWNvcmRSZWZlcmVuY2U6IHBhcmVudFJlZmVyZW5jZSwKLSAgICAgIGZpcnN0UmVjb3Jk
S2luZDogImhhc01hbnkiLAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiLAotICAg
ICAgc3RvcmU6IHN0b3JlLAotICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAot
ICAgICAgZmlyc3RSZWNvcmROYW1lOiAga2V5Ci0gIH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9u
c2hpcENoYW5nZUZvcihjaGlsZFJlZmVyZW5jZSwga2V5LCBwYXJlbnRSZWZlcmVuY2UsIG51bGws
IGNoYW5nZSk7Ci0KLQotICByZXR1cm4gY2hhbmdlOwotfTsKLQotLyoqIEBwcml2YXRlICovCi1E
Uy5PbmVUb09uZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlZmVyZW5jZSwg
cGFyZW50UmVmZXJlbmNlLCBzdG9yZSwgb3B0aW9ucykgewotICAvLyBHZXQgdGhlIHR5cGUgb2Yg
dGhlIGNoaWxkIGJhc2VkIG9uIHRoZSBjaGlsZCdzIGNsaWVudCBJRAotICB2YXIgY2hpbGRUeXBl
ID0gY2hpbGRSZWZlcmVuY2UudHlwZSwga2V5OwotCi0gIC8vIElmIHRoZSBuYW1lIG9mIHRoZSBi
ZWxvbmdzVG8gc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIHNwZWNpZmllZCwKLSAgLy8gdXNl
IHRoYXQKLSAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHBhcmVudCBpcyBzcGVjaWZpZWQsIGxvb2sg
aXQgdXAgb24gdGhlIGNoaWxkJ3MgdHlwZQotICAvLyBkZWZpbml0aW9uLgotICBpZiAob3B0aW9u
cy5wYXJlbnRUeXBlKSB7Ci0gICAga2V5ID0gaW52ZXJzZUJlbG9uZ3NUb05hbWUob3B0aW9ucy5w
YXJlbnRUeXBlLCBjaGlsZFR5cGUsIG9wdGlvbnMua2V5KTsKLSAgICAvL0RTLk9uZVRvT25lQ2hh
bmdlLm1haW50YWluSW52YXJpYW50KCBvcHRpb25zLCBzdG9yZSwgY2hpbGRSZWZlcmVuY2UsIGtl
eSApOwotICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5KSB7Ci0gICAga2V5ID0gb3B0aW9ucy5rZXk7
Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHBh
cmVudFR5cGUgb3IgYmVsb25nc1RvTmFtZSBvcHRpb24gdG8gT25lVG9NYW55Q2hhbmdlLmZvckNo
aWxkQW5kUGFyZW50IiwgZmFsc2UpOwotICB9Ci0KLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9u
c2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBhcmVudFJlZmVyZW5jZTogcGFyZW50
UmVmZXJlbmNlLAotICAgICAgY2hpbGRSZWZlcmVuY2U6IGNoaWxkUmVmZXJlbmNlLAotICAgICAg
Zmlyc3RSZWNvcmRSZWZlcmVuY2U6IGNoaWxkUmVmZXJlbmNlLAotICAgICAgc2Vjb25kUmVjb3Jk
UmVmZXJlbmNlOiBwYXJlbnRSZWZlcmVuY2UsCi0gICAgICBmaXJzdFJlY29yZEtpbmQ6ICJiZWxv
bmdzVG8iLAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImJlbG9uZ3NUbyIsCi0gICAgICBzdG9y
ZTogc3RvcmUsCi0gICAgICBjaGFuZ2VUeXBlOiBvcHRpb25zLmNoYW5nZVR5cGUsCi0gICAgICBm
aXJzdFJlY29yZE5hbWU6ICBrZXkKLSAgfSk7Ci0KLSAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hh
bmdlRm9yKGNoaWxkUmVmZXJlbmNlLCBrZXksIHBhcmVudFJlZmVyZW5jZSwgbnVsbCwgY2hhbmdl
KTsKLQotCi0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi1EUy5PbmVUb09uZUNoYW5nZS5tYWludGFp
bkludmFyaWFudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlZmVyZW5jZSwga2V5
KXsKLSAgaWYgKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFkZCIgJiYgc3RvcmUucmVjb3JkSXNN
YXRlcmlhbGl6ZWQoY2hpbGRSZWZlcmVuY2UpKSB7Ci0gICAgdmFyIGNoaWxkID0gc3RvcmUucmVj
b3JkRm9yUmVmZXJlbmNlKGNoaWxkUmVmZXJlbmNlKTsKLSAgICB2YXIgb2xkUGFyZW50ID0gZ2V0
KGNoaWxkLCBrZXkpOwotICAgIGlmIChvbGRQYXJlbnQpewotICAgICAgdmFyIGNvcnJlc3BvbmRp
bmdDaGFuZ2UgPSBEUy5PbmVUb09uZUNoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWZlcmVuY2Us
IG9sZFBhcmVudC5nZXQoJ19yZWZlcmVuY2UnKSwgc3RvcmUsIHsKLSAgICAgICAgICBwYXJlbnRU
eXBlOiBvcHRpb25zLnBhcmVudFR5cGUsCi0gICAgICAgICAgaGFzTWFueU5hbWU6IG9wdGlvbnMu
aGFzTWFueU5hbWUsCi0gICAgICAgICAgY2hhbmdlVHlwZTogInJlbW92ZSIsCi0gICAgICAgICAg
a2V5OiBvcHRpb25zLmtleQotICAgICAgICB9KTsKLSAgICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hp
cENoYW5nZUZvcihjaGlsZFJlZmVyZW5jZSwga2V5LCBvcHRpb25zLnBhcmVudFJlZmVyZW5jZSAs
IG51bGwsIGNvcnJlc3BvbmRpbmdDaGFuZ2UpOwotICAgICBjb3JyZXNwb25kaW5nQ2hhbmdlLnN5
bmMoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLS8qKiBAcHJpdmF0ZSAqLwotRFMuT25lVG9NYW55Q2hh
bmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGNoaWxkUmVmZXJlbmNlLCBwYXJlbnRSZWZlcmVu
Y2UsIHN0b3JlLCBvcHRpb25zKSB7Ci0gIC8vIEdldCB0aGUgdHlwZSBvZiB0aGUgY2hpbGQgYmFz
ZWQgb24gdGhlIGNoaWxkJ3MgY2xpZW50IElECi0gIHZhciBjaGlsZFR5cGUgPSBjaGlsZFJlZmVy
ZW5jZS50eXBlLCBrZXk7Ci0KLSAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRl
IG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgc3BlY2lmaWVkLAotICAvLyB1c2UgdGhhdAotICAvLyBJ
ZiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBvbiB0aGUg
Y2hpbGQncyB0eXBlCi0gIC8vIGRlZmluaXRpb24uCi0gIGlmIChvcHRpb25zLnBhcmVudFR5cGUp
IHsKLSAgICBrZXkgPSBpbnZlcnNlQmVsb25nc1RvTmFtZShvcHRpb25zLnBhcmVudFR5cGUsIGNo
aWxkVHlwZSwgb3B0aW9ucy5rZXkpOwotICAgIERTLk9uZVRvTWFueUNoYW5nZS5tYWludGFpbklu
dmFyaWFudCggb3B0aW9ucywgc3RvcmUsIGNoaWxkUmVmZXJlbmNlLCBrZXkgKTsKLSAgfSBlbHNl
IGlmIChvcHRpb25zLmtleSkgewotICAgIGtleSA9IG9wdGlvbnMua2V5OwotICB9IGVsc2Ugewot
ICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBlaXRoZXIgYSBwYXJlbnRUeXBlIG9yIGJl
bG9uZ3NUb05hbWUgb3B0aW9uIHRvIE9uZVRvTWFueUNoYW5nZS5mb3JDaGlsZEFuZFBhcmVudCIs
IGZhbHNlKTsKLSAgfQotCi0gIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2Ny
ZWF0ZUNoYW5nZSh7Ci0gICAgICBwYXJlbnRSZWZlcmVuY2U6IHBhcmVudFJlZmVyZW5jZSwKLSAg
ICAgIGNoaWxkUmVmZXJlbmNlOiBjaGlsZFJlZmVyZW5jZSwKLSAgICAgIGZpcnN0UmVjb3JkUmVm
ZXJlbmNlOiBjaGlsZFJlZmVyZW5jZSwKLSAgICAgIHNlY29uZFJlY29yZFJlZmVyZW5jZTogcGFy
ZW50UmVmZXJlbmNlLAotICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVsb25nc1RvIiwKLSAgICAg
IHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAg
IGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0UmVjb3JkTmFtZTog
IGtleQotICB9KTsKLQotICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWZl
cmVuY2UsIGtleSwgcGFyZW50UmVmZXJlbmNlLCBudWxsLCBjaGFuZ2UpOwotCi0KLSAgcmV0dXJu
IGNoYW5nZTsKLX07Ci0KLQotRFMuT25lVG9NYW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50ID0g
ZnVuY3Rpb24ob3B0aW9ucywgc3RvcmUsIGNoaWxkUmVmZXJlbmNlLCBrZXkpewotICBpZiAob3B0
aW9ucy5jaGFuZ2VUeXBlID09PSAiYWRkIiAmJiBzdG9yZS5yZWNvcmRJc01hdGVyaWFsaXplZChj
aGlsZFJlZmVyZW5jZSkpIHsKLSAgICB2YXIgY2hpbGQgPSBzdG9yZS5yZWNvcmRGb3JSZWZlcmVu
Y2UoY2hpbGRSZWZlcmVuY2UpOwotICAgIHZhciBvbGRQYXJlbnQgPSBnZXQoY2hpbGQsIGtleSk7
Ci0gICAgaWYgKG9sZFBhcmVudCl7Ci0gICAgICB2YXIgY29ycmVzcG9uZGluZ0NoYW5nZSA9IERT
Lk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWZlcmVuY2UsIG9sZFBhcmVudC5n
ZXQoJ19yZWZlcmVuY2UnKSwgc3RvcmUsIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBvcHRpb25z
LnBhcmVudFR5cGUsCi0gICAgICAgICAgaGFzTWFueU5hbWU6IG9wdGlvbnMuaGFzTWFueU5hbWUs
Ci0gICAgICAgICAgY2hhbmdlVHlwZTogInJlbW92ZSIsCi0gICAgICAgICAga2V5OiBvcHRpb25z
LmtleQotICAgICAgICB9KTsKLSAgICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihj
aGlsZFJlZmVyZW5jZSwga2V5LCBvcHRpb25zLnBhcmVudFJlZmVyZW5jZSAsIG51bGwsIGNvcnJl
c3BvbmRpbmdDaGFuZ2UpOwotICAgICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5jKCk7Ci0gICAg
fQotICB9Ci19OwotCi1EUy5PbmVUb01hbnlDaGFuZ2UuZW5zdXJlU2FtZVRyYW5zYWN0aW9uID0g
ZnVuY3Rpb24oY2hhbmdlcywgc3RvcmUpewotICB2YXIgcmVjb3JkcyA9IEVtYmVyLkEoKTsKLSAg
Zm9yRWFjaChjaGFuZ2VzLCBmdW5jdGlvbihjaGFuZ2UpewotICAgIHJlY29yZHMuYWRkT2JqZWN0
KGNoYW5nZS5nZXRTZWNvbmRSZWNvcmQoKSk7Ci0gICAgcmVjb3Jkcy5hZGRPYmplY3QoY2hhbmdl
LmdldEZpcnN0UmVjb3JkKCkpOwotICB9KTsKLSAgdmFyIHRyYW5zYWN0aW9uID0gc3RvcmUuZW5z
dXJlU2FtZVRyYW5zYWN0aW9uKHJlY29yZHMpOwotICBmb3JFYWNoKGNoYW5nZXMsIGZ1bmN0aW9u
KGNoYW5nZSl7Ci0gICAgY2hhbmdlLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247Ci0gfSk7Ci19
OwotCi1EUy5SZWxhdGlvbnNoaXBDaGFuZ2UucHJvdG90eXBlID0gewotCi0gIGdldFNlY29uZFJl
Y29yZE5hbWU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBuYW1lID0gdGhpcy5zZWNvbmRSZWNvcmRO
YW1lLCBzdG9yZSA9IHRoaXMuc3RvcmUsIHBhcmVudDsKLQotICAgIGlmICghbmFtZSkgewotICAg
ICAgcGFyZW50ID0gdGhpcy5zZWNvbmRSZWNvcmRSZWZlcmVuY2U7Ci0gICAgICBpZiAoIXBhcmVu
dCkgeyByZXR1cm47IH0KLQotICAgICAgdmFyIGNoaWxkVHlwZSA9IHRoaXMuZmlyc3RSZWNvcmRS
ZWZlcmVuY2UudHlwZTsKLSAgICAgIHZhciBpbnZlcnNlVHlwZSA9IERTLl9pbnZlcnNlVHlwZUZv
cihjaGlsZFR5cGUsIHRoaXMuZmlyc3RSZWNvcmROYW1lKTsKLSAgICAgIG5hbWUgPSBpbnZlcnNl
SGFzTWFueU5hbWUoaW52ZXJzZVR5cGUsIGNoaWxkVHlwZSwgdGhpcy5maXJzdFJlY29yZE5hbWUp
OwotICAgICAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gbmFtZTsKLSAgfSwKLQotICAvKioKLSAgICBHZXQgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9u
c2hpcCBvbiB0aGUgYmVsb25nc1RvIHNpZGUuCi0KLSAgICBAcmV0dXJucyB7U3RyaW5nfQotICAq
LwotICBnZXRGaXJzdFJlY29yZE5hbWU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBuYW1lID0gdGhp
cy5maXJzdFJlY29yZE5hbWUsIHN0b3JlID0gdGhpcy5zdG9yZSwgcGFyZW50LCBjaGlsZDsKLQot
ICAgIGlmICghbmFtZSkgewotICAgICAgcGFyZW50ID0gdGhpcy5zZWNvbmRSZWNvcmRSZWZlcmVu
Y2U7Ci0gICAgICBjaGlsZCA9IHRoaXMuZmlyc3RSZWNvcmRSZWZlcmVuY2U7Ci0gICAgICBpZiAo
IShjaGlsZCAmJiBwYXJlbnQpKSB7IHJldHVybjsgfQotCi0gICAgICBuYW1lID0gRFMuX2ludmVy
c2VSZWxhdGlvbnNoaXBGb3IoY2hpbGQudHlwZSwgcGFyZW50LnR5cGUpLm5hbWU7Ci0KLSAgICAg
IHRoaXMuZmlyc3RSZWNvcmROYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZTsK
LSAgfSwKLQotICAvKiogQHByaXZhdGUgKi8KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIGNoaWxkUmVmZXJlbmNlID0gdGhpcy5jaGlsZFJlZmVyZW5jZSwKLSAgICAgICAgYmVsb25n
c1RvTmFtZSA9IHRoaXMuZ2V0Rmlyc3RSZWNvcmROYW1lKCksCi0gICAgICAgIGhhc01hbnlOYW1l
ID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICAgIHN0b3JlID0gdGhpcy5zdG9y
ZSwKLSAgICAgICAgY2hpbGQsIG9sZFBhcmVudCwgbmV3UGFyZW50LCBsYXN0UGFyZW50LCB0cmFu
c2FjdGlvbjsKLQotICAgIHN0b3JlLnJlbW92ZVJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJl
ZmVyZW5jZSwgYmVsb25nc1RvTmFtZSwgdGhpcy5wYXJlbnRSZWZlcmVuY2UsIGhhc01hbnlOYW1l
LCB0aGlzLmNoYW5nZVR5cGUpOwotCi0gICAgaWYgKHRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2Fj
dGlvbikgewotICAgICAgdHJhbnNhY3Rpb24ucmVsYXRpb25zaGlwQmVjYW1lQ2xlYW4odGhpcyk7
Ci0gICAgfQotICB9LAotCi0gIC8qKiBAcHJpdmF0ZSAqLwotICBnZXRCeVJlZmVyZW5jZTogZnVu
Y3Rpb24ocmVmZXJlbmNlKSB7Ci0gICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTsKLQotICAgIC8v
IHJldHVybiBudWxsIG9yIHVuZGVmaW5lZCBpZiB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIHdhcyBu
dWxsIG9yIHVuZGVmaW5lZAotICAgIGlmICghcmVmZXJlbmNlKSB7IHJldHVybiByZWZlcmVuY2U7
IH0KLQotICAgIGlmIChzdG9yZS5yZWNvcmRJc01hdGVyaWFsaXplZChyZWZlcmVuY2UpKSB7Ci0g
ICAgICByZXR1cm4gc3RvcmUucmVjb3JkRm9yUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0gICAgfQot
ICB9LAotCi0gIGdldFNlY29uZFJlY29yZDogZnVuY3Rpb24oKXsKLSAgICByZXR1cm4gdGhpcy5n
ZXRCeVJlZmVyZW5jZSh0aGlzLnNlY29uZFJlY29yZFJlZmVyZW5jZSk7Ci0gIH0sCi0KLSAgLyoq
IEBwcml2YXRlICovCi0gIGdldEZpcnN0UmVjb3JkOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy5nZXRCeVJlZmVyZW5jZSh0aGlzLmZpcnN0UmVjb3JkUmVmZXJlbmNlKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgTWFrZSBzdXJlIHRoYXQgYWxsIHRocmVlIHBhcnRz
IG9mIHRoZSByZWxhdGlvbnNoaXAgY2hhbmdlIGFyZSBwYXJ0IG9mCi0gICAgdGhlIHNhbWUgdHJh
bnNhY3Rpb24uIElmIGFueSBvZiB0aGUgdGhyZWUgcmVjb3JkcyBpcyBjbGVhbiBhbmQgaW4gdGhl
Ci0gICAgZGVmYXVsdCB0cmFuc2FjdGlvbiwgYW5kIHRoZSByZXN0IGFyZSBpbiBhIGRpZmZlcmVu
dCB0cmFuc2FjdGlvbiwgbW92ZQotICAgIHRoZW0gYWxsIGludG8gdGhhdCB0cmFuc2FjdGlvbi4K
LSAgKi8KLSAgZW5zdXJlU2FtZVRyYW5zYWN0aW9uOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY2hp
bGQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCi0gICAgICBwYXJlbnRSZWNvcmQgPSB0aGlzLmdl
dFNlY29uZFJlY29yZCgpOwotCi0gICAgdmFyIHRyYW5zYWN0aW9uID0gdGhpcy5zdG9yZS5lbnN1
cmVTYW1lVHJhbnNhY3Rpb24oW2NoaWxkLCBwYXJlbnRSZWNvcmRdKTsKLQotICAgIHRoaXMudHJh
bnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKLSAgICByZXR1cm4gdHJhbnNhY3Rpb247Ci0gIH0sCi0K
LSAgY2FsbENoYW5nZUV2ZW50czogZnVuY3Rpb24oKXsKLSAgICB2YXIgaGFzTWFueU5hbWUgPSB0
aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKLSAgICAgICAgYmVsb25nc1RvTmFtZSA9IHRoaXMu
Z2V0Rmlyc3RSZWNvcmROYW1lKCksCi0gICAgICAgIGNoaWxkID0gdGhpcy5nZXRGaXJzdFJlY29y
ZCgpLAotICAgICAgICBwYXJlbnRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwotCi0g
ICAgdmFyIGRpcnR5U2V0ID0gbmV3IEVtYmVyLk9yZGVyZWRTZXQoKTsKLQotICAgIC8vIFRPRE86
IFRoaXMgaW1wbGVtZW50YXRpb24gY2F1c2VzIGEgcmFjZSBjb25kaXRpb24gaW4ga2V5LXZhbHVl
Ci0gICAgLy8gc3RvcmVzLiBUaGUgZml4IGludm9sdmVzIGJ1ZmZlcmluZyBjaGFuZ2VzIHRoYXQg
aGFwcGVuIHdoaWxlCi0gICAgLy8gYSByZWNvcmQgaXMgbG9hZGluZy4gQSBzaW1pbGFyIGZpeCBp
cyByZXF1aXJlZCBmb3Igb3RoZXIgcGFydHMKLSAgICAvLyBvZiBlbWJlci1kYXRhLCBhbmQgc2hv
dWxkIGJlIGRvbmUgYXMgbmV3IGluZnJhc3RydWN0dXJlLCBub3QKLSAgICAvLyBhIG9uZS1vZmYg
aGFjay4gW3RvbWh1ZGFdCi0gICAgaWYgKHBhcmVudFJlY29yZCAmJiBnZXQocGFyZW50UmVjb3Jk
LCAnaXNMb2FkZWQnKSkgewotICAgICAgdGhpcy5zdG9yZS5yZWNvcmRIYXNNYW55RGlkQ2hhbmdl
KGRpcnR5U2V0LCBwYXJlbnRSZWNvcmQsIHRoaXMpOwotICAgIH0KLQotICAgIGlmIChjaGlsZCkg
ewotICAgICAgdGhpcy5zdG9yZS5yZWNvcmRCZWxvbmdzVG9EaWRDaGFuZ2UoZGlydHlTZXQsIGNo
aWxkLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBkaXJ0eVNldC5mb3JFYWNoKGZ1bmN0aW9uKHJlY29y
ZCkgewotICAgICAgcmVjb3JkLmFkYXB0ZXJEaWREaXJ0eSgpOwotICAgIH0pOwotICB9LAotCi0g
IGNvYWxlc2NlOiBmdW5jdGlvbigpewotICAgIHZhciByZWxhdGlvbnNoaXBQYWlycyA9IHRoaXMu
c3RvcmUucmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IodGhpcy5maXJzdFJlY29yZFJlZmVyZW5j
ZSk7Ci0gICAgZm9yRWFjaChyZWxhdGlvbnNoaXBQYWlycywgZnVuY3Rpb24ocGFpcil7Ci0gICAg
ICB2YXIgYWRkZWRDaGFuZ2UgPSBwYWlyWyJhZGQiXTsKLSAgICAgIHZhciByZW1vdmVkQ2hhbmdl
ID0gcGFpclsicmVtb3ZlIl07Ci0gICAgICBpZihhZGRlZENoYW5nZSAmJiByZW1vdmVkQ2hhbmdl
KSB7Ci0gICAgICAgIGFkZGVkQ2hhbmdlLmRlc3Ryb3koKTsKLSAgICAgICAgcmVtb3ZlZENoYW5n
ZS5kZXN0cm95KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLURTLlJlbGF0aW9uc2hp
cENoYW5nZUFkZC5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoRFMuUmVsYXRpb25zaGlwQ2hhbmdl
LmNyZWF0ZSh7fSkpOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZSA9IEVt
YmVyLmNyZWF0ZShEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7Ci0KLURTLlJlbGF0
aW9uc2hpcENoYW5nZUFkZC5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJhZGQiOwotRFMuUmVsYXRp
b25zaGlwQ2hhbmdlQWRkLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzZWNv
bmRSZWNvcmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBmaXJzdFJl
Y29yZE5hbWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RSZWNvcmQg
PSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNl
Y29uZFJlY29yZCgpOwotCi0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFu
eSAoIiArIGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFy
ZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0
IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3Ry
dWN0b3IsIGJlbG9uZ3NUb05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBh
IGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0
b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhh
c01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJl
Y29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgdmFyIHRyYW5zYWN0aW9uID0g
dGhpcy5lbnN1cmVTYW1lVHJhbnNhY3Rpb24oKTsKLSAgdHJhbnNhY3Rpb24ucmVsYXRpb25zaGlw
QmVjYW1lRGlydHkodGhpcyk7Ci0KLSAgdGhpcy5jYWxsQ2hhbmdlRXZlbnRzKCk7Ci0KLSAgaWYg
KHNlY29uZFJlY29yZCAmJiBmaXJzdFJlY29yZCkgewotICAgIGlmKHRoaXMuc2Vjb25kUmVjb3Jk
S2luZCA9PT0gImJlbG9uZ3NUbyIpewotICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlv
bnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgc2V0KHNlY29uZFJlY29yZCwgc2Vj
b25kUmVjb3JkTmFtZSwgZmlyc3RSZWNvcmQpOwotICAgICAgfSk7Ci0KLSAgICAgfQotICAgICBl
bHNlIGlmKHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9PT0gImhhc01hbnkiKXsKLSAgICAgIHNlY29u
ZFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7Ci0gICAgICAg
IGdldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUpLmFkZE9iamVjdChmaXJzdFJlY29y
ZCk7Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmlyc3RSZWNvcmQgJiYgc2Vjb25k
UmVjb3JkICYmIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKSAhPT0gc2Vjb25kUmVj
b3JkKSB7Ci0gICAgaWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAg
ICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsK
LSAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUsIHNlY29uZFJlY29yZCk7
Ci0gICAgICB9KTsKLSAgICB9Ci0gICAgZWxzZSBpZih0aGlzLmZpcnN0ZFJlY29yZEtpbmQgPT09
ICJoYXNNYW55Iil7Ci0gICAgICBmaXJzdFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2
ZXJzKGZ1bmN0aW9uKCl7Ci0gICAgICAgIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1l
KS5hZGRPYmplY3Qoc2Vjb25kUmVjb3JkKTsKLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIHRo
aXMuY29hbGVzY2UoKTsKLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5wcm90b3R5
cGUuY2hhbmdlVHlwZSA9ICJyZW1vdmUiOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnBy
b3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzZWNvbmRSZWNvcmROYW1lID0gdGhp
cy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlzLmdl
dEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVj
b3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwotCi0g
IC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlOYW1l
ICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVudCB8
fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBh
biBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05h
bWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJl
bG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90
IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChuZXdQ
YXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0b3Ip
LCBoYXNNYW55TmFtZSk7Ci0KLSAgdmFyIHRyYW5zYWN0aW9uID0gdGhpcy5lbnN1cmVTYW1lVHJh
bnNhY3Rpb24oZmlyc3RSZWNvcmQsIHNlY29uZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSwgZmly
c3RSZWNvcmROYW1lKTsKLSAgdHJhbnNhY3Rpb24ucmVsYXRpb25zaGlwQmVjYW1lRGlydHkodGhp
cyk7Ci0KLSAgdGhpcy5jYWxsQ2hhbmdlRXZlbnRzKCk7Ci0KLSAgaWYgKHNlY29uZFJlY29yZCAm
JiBmaXJzdFJlY29yZCkgewotICAgIGlmKHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9PT0gImJlbG9u
Z3NUbyIpewotICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMo
ZnVuY3Rpb24oKXsKLSAgICAgICAgc2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSwg
bnVsbCk7Ci0gICAgICB9KTsKLSAgICAgfQotICAgICBlbHNlIGlmKHRoaXMuc2Vjb25kUmVjb3Jk
S2luZCA9PT0gImhhc01hbnkiKXsKLSAgICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJlbGF0aW9u
c2hpcE9ic2VydmVycyhmdW5jdGlvbigpewotICAgICAgICBnZXQoc2Vjb25kUmVjb3JkLCBzZWNv
bmRSZWNvcmROYW1lKS5yZW1vdmVPYmplY3QoZmlyc3RSZWNvcmQpOwotICAgICAgfSk7Ci0gICAg
fQotICB9Ci0KLSAgaWYgKGZpcnN0UmVjb3JkICYmIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNv
cmROYW1lKSkgewotICAgIGlmKHRoaXMuZmlyc3RSZWNvcmRLaW5kID09PSAiYmVsb25nc1RvIil7
Ci0gICAgICBmaXJzdFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9u
KCl7Ci0gICAgICAgIHNldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lLCBudWxsKTsKLSAg
ICAgIH0pOwotICAgICB9Ci0gICAgIGVsc2UgaWYodGhpcy5maXJzdGRSZWNvcmRLaW5kID09PSAi
aGFzTWFueSIpewotICAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZl
cnMoZnVuY3Rpb24oKXsKLSAgICAgICAgZ2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUp
LnJlbW92ZU9iamVjdChzZWNvbmRSZWNvcmQpOwotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAg
dGhpcy5jb2FsZXNjZSgpOwotfTsKLQotZnVuY3Rpb24gaW52ZXJzZUJlbG9uZ3NUb05hbWUocGFy
ZW50VHlwZSwgY2hpbGRUeXBlLCBoYXNNYW55TmFtZSkgewotICAvLyBHZXQgdGhlIG9wdGlvbnMg
cGFzc2VkIHRvIHRoZSBwYXJlbnQncyBEUy5oYXNNYW55KCkKLSAgdmFyIG9wdGlvbnMgPSBwYXJl
bnRUeXBlLm1ldGFGb3JQcm9wZXJ0eShoYXNNYW55TmFtZSkub3B0aW9uczsKLSAgdmFyIGJlbG9u
Z3NUb05hbWU7Ci0KLSAgaWYgKGJlbG9uZ3NUb05hbWUgPSBvcHRpb25zLmludmVyc2UpIHsKLSAg
ICByZXR1cm4gYmVsb25nc1RvTmFtZTsKLSAgfQotCi0gIHJldHVybiBEUy5faW52ZXJzZVJlbGF0
aW9uc2hpcEZvcihjaGlsZFR5cGUsIHBhcmVudFR5cGUpLm5hbWU7Ci19Ci0KLWZ1bmN0aW9uIGlu
dmVyc2VIYXNNYW55TmFtZShwYXJlbnRUeXBlLCBjaGlsZFR5cGUsIGJlbG9uZ3NUb05hbWUpIHsK
LSAgdmFyIG9wdGlvbnMgPSBjaGlsZFR5cGUubWV0YUZvclByb3BlcnR5KGJlbG9uZ3NUb05hbWUp
Lm9wdGlvbnM7Ci0gIHZhciBoYXNNYW55TmFtZTsKLQotICBpZiAoaGFzTWFueU5hbWUgPSBvcHRp
b25zLmludmVyc2UpIHsKLSAgICByZXR1cm4gaGFzTWFueU5hbWU7Ci0gIH0KLQotICByZXR1cm4g
RFMuX2ludmVyc2VSZWxhdGlvbnNoaXBGb3IocGFyZW50VHlwZSwgY2hpbGRUeXBlKS5uYW1lOwot
fQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotdmFyIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFRoaXMgY29kZSByZWdpc3RlcnMg
YW4gaW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlvbi4KLQotICBJZiBhbiBFbWJlci5qcyBk
ZXZlbG9wZXIgZGVmaW5lcyBhIHN1YmNsYXNzIG9mIERTLlN0b3JlIG9uIHRoZWlyIGFwcGxpY2F0
aW9uLAotICB0aGlzIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlIGl0IGFuZCBt
YWtlIGl0IGF2YWlsYWJsZSBvbiB0aGUKLSAgcm91dGVyLgotCi0gIEFkZGl0aW9uYWxseSwgYWZ0
ZXIgYW4gYXBwbGljYXRpb24ncyBjb250cm9sbGVycyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHRoZXkg
d2lsbAotICBlYWNoIGhhdmUgdGhlIHN0b3JlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZW0uCi0KLSAg
Rm9yIGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9s
bG93aW5nIGNsYXNzZXM6Ci0KLSAgQXBwLlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKHsKLSAgICBh
ZGFwdGVyOiAnQXBwLk15Q3VzdG9tQWRhcHRlcicKLSAgfSk7Ci0KLSAgQXBwLlBvc3RzQ29udHJv
bGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIC8vIC4uLgotICB9KTsK
LQotICBXaGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXplZCwgYEFwcC5TdG9yZWAgd2ls
bCBhdXRvbWF0aWNhbGx5IGJlCi0gIGluc3RhbnRpYXRlZCwgYW5kIHRoZSBpbnN0YW5jZSBvZiBg
QXBwLlBvc3RzQ29udHJvbGxlcmAgd2lsbCBoYXZlIGl0cyBgc3RvcmVgCi0gIHByb3BlcnR5IHNl
dCB0byB0aGF0IGluc3RhbmNlLgotCi0gIE5vdGUgdGhhdCB0aGlzIGNvZGUgd2lsbCBvbmx5IGJl
IHJ1biBpZiB0aGUgYGVtYmVyLWFwcGxpY2F0aW9uYCBwYWNrYWdlIGlzCi0gIGxvYWRlZC4gSWYg
RW1iZXIgRGF0YSBpcyBiZWluZyB1c2VkIGluIGFuIGVudmlyb25tZW50IG90aGVyIHRoYW4gYQot
ICB0eXBpY2FsIGFwcGxpY2F0aW9uIChlLmcuLCBub2RlLmpzIHdoZXJlIG9ubHkgYGVtYmVyLXJ1
bnRpbWVgIGlzIGF2YWlsYWJsZSksCi0gIHRoaXMgY29kZSB3aWxsIGJlIGlnbm9yZWQuCi0qLwot
Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24oQXBwbGljYXRpb24p
IHsKLSAgaWYgKEFwcGxpY2F0aW9uLnJlZ2lzdGVySW5qZWN0aW9uKSB7Ci0gICAgQXBwbGljYXRp
b24ucmVnaXN0ZXJJbmplY3Rpb24oewotICAgICAgbmFtZTogInN0b3JlIiwKLSAgICAgIGJlZm9y
ZTogImNvbnRyb2xsZXJzIiwKLQotICAgICAgLy8gSWYgYSBzdG9yZSBzdWJjbGFzcyBpcyBkZWZp
bmVkLCBsaWtlIEFwcC5TdG9yZSwKLSAgICAgIC8vIGluc3RhbnRpYXRlIGl0IGFuZCBpbmplY3Qg
aXQgaW50byB0aGUgcm91dGVyLgotICAgICAgaW5qZWN0aW9uOiBmdW5jdGlvbihhcHAsIHN0YXRl
TWFuYWdlciwgcHJvcGVydHkpIHsKLSAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIpIHsgcmV0dXJu
OyB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ1N0b3JlJykgewotICAgICAgICAgIHNldChz
dGF0ZU1hbmFnZXIsICdzdG9yZScsIGFwcFtwcm9wZXJ0eV0uY3JlYXRlKCkpOwotICAgICAgICB9
Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBBcHBsaWNhdGlvbi5yZWdpc3RlckluamVjdGlvbih7
Ci0gICAgICBuYW1lOiAiZ2l2ZVN0b3JlVG9Db250cm9sbGVycyIsCi0gICAgICBhZnRlcjogWydz
dG9yZScsJ2NvbnRyb2xsZXJzJ10sCi0KLSAgICAgIC8vIEZvciBlYWNoIGNvbnRyb2xsZXIsIHNl
dCBpdHMgYHN0b3JlYCBwcm9wZXJ0eQotICAgICAgLy8gdG8gdGhlIERTLlN0b3JlIGluc3RhbmNl
IHdlIGNyZWF0ZWQgYWJvdmUuCi0gICAgICBpbmplY3Rpb246IGZ1bmN0aW9uKGFwcCwgc3RhdGVN
YW5hZ2VyLCBwcm9wZXJ0eSkgewotICAgICAgICBpZiAoIXN0YXRlTWFuYWdlcikgeyByZXR1cm47
IH0KLSAgICAgICAgaWYgKC9eW0EtWl0uKkNvbnRyb2xsZXIkLy50ZXN0KHByb3BlcnR5KSkgewot
ICAgICAgICAgIHZhciBjb250cm9sbGVyTmFtZSA9IHByb3BlcnR5LmNoYXJBdCgwKS50b0xvd2Vy
Q2FzZSgpICsgcHJvcGVydHkuc3Vic3RyKDEpOwotICAgICAgICAgIHZhciBzdG9yZSA9IHN0YXRl
TWFuYWdlci5nZXQoJ3N0b3JlJyk7Ci0gICAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBzdGF0ZU1h
bmFnZXIuZ2V0KGNvbnRyb2xsZXJOYW1lKTsKLSAgICAgICAgICBpZighY29udHJvbGxlcikgeyBy
ZXR1cm47IH0KLQotICAgICAgICAgIGNvbnRyb2xsZXIuc2V0KCdzdG9yZScsIHN0b3JlKTsKLSAg
ICAgICAgfQotICAgICAgfQotICAgIH0pOwotICB9IGVsc2UgaWYgKEFwcGxpY2F0aW9uLmluaXRp
YWxpemVyKSB7Ci0gICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgICAgbmFtZTogInN0
b3JlIiwKLQotICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlv
bikgewotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3JlJywgJ21haW4nLCBhcHBsaWNh
dGlvbi5TdG9yZSk7Ci0KLSAgICAgICAgLy8gRWFnZXJseSBnZW5lcmF0ZSB0aGUgc3RvcmUgc28g
ZGVmYXVsdFN0b3JlIGlzIHBvcHVsYXRlZC4KLSAgICAgICAgLy8gVE9ETzogRG8gdGhpcyBpbiBh
IGZpbmlzaGVyIGhvb2sKLSAgICAgICAgY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwot
ICAgICAgfQotICAgIH0pOwotCi0gICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgICAg
bmFtZTogImluamVjdFN0b3JlIiwKLQotICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFp
bmVyKSB7Ci0gICAgICAgIGNvbnRhaW5lci50eXBlSW5qZWN0aW9uKCdjb250cm9sbGVyJywgJ3N0
b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAgICAgICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ3Jv
dXRlJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotfSk7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQsIG1hcCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcCwgaXNOb25lID0gRW1i
ZXIuaXNOb25lOwotCi1mdW5jdGlvbiBtdXN0SW1wbGVtZW50KG5hbWUpIHsKLSAgcmV0dXJuIGZ1
bmN0aW9uKCkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiWW91ciBzZXJpYWxpemVyICIg
KyB0aGlzLnRvU3RyaW5nKCkgKyAiIGRvZXMgbm90IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgbWV0
aG9kICIgKyBuYW1lKTsKLSAgfTsKLX0KLQotLyoqCi0gIEEgc2VyaWFsaXplciBpcyByZXNwb25z
aWJsZSBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcgYSBncm91cCBvZgotICByZWNv
cmRzLgotCi0gIGBEUy5TZXJpYWxpemVyYCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGRlc2ln
bmVkIHRvIGhlbHAgeW91IGJ1aWxkIGEKLSAgc2VyaWFsaXplciB0aGF0IGNhbiByZWFkIHRvIGFu
ZCB3cml0ZSBmcm9tIGFueSBzZXJpYWxpemVkIGZvcm0uICBXaGlsZSBtb3N0Ci0gIGFwcGxpY2F0
aW9ucyB3aWxsIHVzZSBgRFMuSlNPTlNlcmlhbGl6ZXJgLCB3aGljaCByZWFkcyBhbmQgd3JpdGVz
IEpTT04sIHRoZQotICBzZXJpYWxpemVyIGFyY2hpdGVjdHVyZSBhbGxvd3MgeW91ciBhZGFwdGVy
IHRvIHRyYW5zbWl0IHRoaW5ncyBsaWtlIFhNTCwKLSAgc3RyaW5ncywgb3IgY3VzdG9tIGJpbmFy
eSBkYXRhLgotCi0gIFR5cGljYWxseSwgeW91ciBhcHBsaWNhdGlvbidzIGBEUy5BZGFwdGVyYCBp
cyByZXNwb25zaWJsZSBmb3IgYm90aCBjcmVhdGluZyBhCi0gIHNlcmlhbGl6ZXIgYXMgd2VsbCBh
cyBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2RzIHdoZW4gaXQgbmVlZHMgdG8KLSAgbWF0
ZXJpYWxpemUgZGF0YSBvciBzZXJpYWxpemUgYSByZWNvcmQuCi0KLSAgVGhlIHNlcmlhbGl6ZXIg
QVBJIGlzIGRlc2lnbmVkIGFzIGEgc2VyaWVzIG9mIGxheWVyZWQgaG9va3MgdGhhdCB5b3UgY2Fu
Ci0gIG92ZXJyaWRlIHRvIGN1c3RvbWl6ZSBhbnkgb2YgdGhlIGluZGl2aWR1YWwgc3RlcHMgb2Yg
c2VyaWFsaXphdGlvbiBhbmQKLSAgZGVzZXJpYWxpemF0aW9uLgotCi0gIFRoZSBob29rcyBhcmUg
b3JnYW5pemVkIGJ5IHRoZSB0aHJlZSByZXNwb25zaWJpbGl0aWVzIG9mIHRoZSBzZXJpYWxpemVy
OgotCi0gIDEuIERldGVybWluaW5nIG5hbWluZyBjb252ZW50aW9ucwotICAyLiBTZXJpYWxpemlu
ZyByZWNvcmRzIGludG8gYSBzZXJpYWxpemVkIGZvcm0KLSAgMy4gRGVzZXJpYWxpemluZyByZWNv
cmRzIGZyb20gYSBzZXJpYWxpemVkIGZvcm0KLQotICBCZWNhdXNlIEVtYmVyIERhdGEgbGF6aWx5
IG1hdGVyaWFsaXplcyByZWNvcmRzLCB0aGUgZGVzZXJpYWxpemF0aW9uCi0gIHN0ZXAsIGFuZCB0
aGVyZWZvcmUgdGhlIGhvb2tzIHlvdSBpbXBsZW1lbnQsIGFyZSBzcGxpdCBpbnRvIHR3byBwaGFz
ZXM6Ci0KLSAgMS4gRXh0cmFjdGlvbiwgd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybXMgZm9yIG11
bHRpcGxlIHJlY29yZHMgYXJlCi0gICAgIGV4dHJhY3RlZCBmcm9tIGEgc2luZ2xlIHBheWxvYWQu
IFRoZSBJRHMgb2YgZWFjaCByZWNvcmQgYXJlIGFsc28KLSAgICAgZXh0cmFjdGVkIGZvciBpbmRl
eGluZy4KLSAgMi4gTWF0ZXJpYWxpemF0aW9uLCB3aGVyZSBhIG5ld2x5LWNyZWF0ZWQgcmVjb3Jk
IGhhcyBpdHMgYXR0cmlidXRlcwotICAgICBhbmQgcmVsYXRpb25zaGlwcyBpbml0aWFsaXplZCBi
YXNlZCBvbiB0aGUgc2VyaWFsaXplZCBmb3JtIGxvYWRlZAotICAgICBieSB0aGUgYWRhcHRlci4K
LQotICBBZGRpdGlvbmFsbHksIGEgc2VyaWFsaXplciBjYW4gY29udmVydCB2YWx1ZXMgZnJvbSB0
aGVpciBKYXZhU2NyaXB0Ci0gIHZlcnNpb25zIGludG8gdGhlaXIgc2VyaWFsaXplZCB2ZXJzaW9u
cyB2aWEgYSBkZWNsYXJhdGl2ZSBBUEkuCi0KLSAgIyMgTmFtaW5nIENvbnZlbnRpb25zCi0KLSAg
T25lIG9mIHRoZSBtb3N0IGNvbW1vbiB1c2VzIG9mIHRoZSBzZXJpYWxpemVyIGlzIHRvIG1hcCBh
dHRyaWJ1dGUgbmFtZXMKLSAgZnJvbSB0aGUgc2VyaWFsaXplZCBmb3JtIHRvIHlvdXIgYERTLk1v
ZGVsYC4gRm9yIGV4YW1wbGUsIGluIHlvdXIgbW9kZWwsCi0gIHlvdSBtYXkgaGF2ZSBhbiBhdHRy
aWJ1dGUgY2FsbGVkIGBmaXJzdE5hbWVgOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBlcnNv
biA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgZmlyc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKQot
ICB9KTsKLSAgYGBgCi0KLSAgSG93ZXZlciwgYmVjYXVzZSB0aGUgd2ViIEFQSSB5b3VyIGFkYXB0
ZXIgaXMgY29tbXVuaWNhdGluZyB3aXRoIGlzCi0gIGxlZ2FjeSwgaXQgY2FsbHMgdGhpcyBhdHRy
aWJ1dGUgYEZJUlNUX05BTUVgLgotCi0gIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBhdHRyaWJ1dGUg
bmFtZSB1c2VkIGluIHRoZSBzZXJpYWxpemVkIGZvcm0KLSAgYnkgaW1wbGVtZW50aW5nIGBrZXlG
b3JBdHRyaWJ1dGVOYW1lYDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gICAga2V5Rm9yQXR0cmlidXRl
TmFtZTogZnVuY3Rpb24odHlwZSwgbmFtZSkgewotICAgICAgcmV0dXJuIG5hbWUudW5kZXJzY29y
ZS50b1VwcGVyQ2FzZSgpOwotICAgIH0KLSAgYGBgCi0KLSAgSWYgeW91ciBhdHRyaWJ1dGUgbmFt
ZXMgYXJlIG5vdCBwcmVkaWN0YWJsZSwgeW91IGNhbiByZS1tYXAgdGhlbQotICBvbmUtYnktb25l
IHVzaW5nIHRoZSBgbWFwYCBBUEk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uLm1h
cCgnQXBwLlBlcnNvbicsIHsKLSAgICBmaXJzdE5hbWU6IHsga2V5OiAnKkFQSV9VU0VSX0ZJUlNU
X05BTUUqJyB9Ci0gIH0pOwotICBgYGAKLQotICAjIyBTZXJpYWxpemF0aW9uCi0KLSAgRHVyaW5n
IHRoZSBzZXJpYWxpemF0aW9uIHByb2Nlc3MsIGEgcmVjb3JkIG9yIHJlY29yZHMgYXJlIGNvbnZl
cnRlZAotICBmcm9tIEVtYmVyLmpzIG9iamVjdHMgaW50byB0aGVpciBzZXJpYWxpemVkIGZvcm0u
Ci0KLSAgVGhlc2UgbWV0aG9kcyBhcmUgZGVzaWduZWQgaW4gbGF5ZXJzLCBsaWtlIGEgZGVsaWNp
b3VzIDctbGF5ZXIKLSAgY2FrZSAoYnV0IHdpdGggZmV3ZXIgbGF5ZXJzKS4KLQotICBUaGUgbWFp
biBlbnRyeSBwb2ludCBmb3Igc2VyaWFsaXphdGlvbiBpcyB0aGUgYHNlcmlhbGl6ZWAKLSAgbWV0
aG9kLCB3aGljaCB0YWtlcyB0aGUgcmVjb3JkIGFuZCBvcHRpb25zLgotCi0gIFRoZSBgc2VyaWFs
aXplYCBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yOgotCi0gICogdHVybmluZyB0aGUgcmVjb3Jk
J3MgYXR0cmlidXRlcyAoYERTLmF0dHJgKSBpbnRvCi0gICAgYXR0cmlidXRlcyBvbiB0aGUgSlNP
TiBvYmplY3QuCi0gICogb3B0aW9uYWxseSBhZGRpbmcgdGhlIHJlY29yZCdzIElEIG9udG8gdGhl
IGhhc2gKLSAgKiBhZGRpbmcgcmVsYXRpb25zaGlwcyAoYERTLmhhc01hbnlgIGFuZCBgRFMuYmVs
b25nc1RvYCkKLSAgICB0byB0aGUgSlNPTiBvYmplY3QuCi0KLSAgRGVwZW5kaW5nIG9uIHRoZSBi
YWNrZW5kLCB0aGUgc2VyaWFsaXplciBjYW4gY2hvb3NlCi0gIHdoZXRoZXIgdG8gaW5jbHVkZSB0
aGUgYGhhc01hbnlgIG9yIGBiZWxvbmdzVG9gCi0gIHJlbGF0aW9uc2hpcHMgb24gdGhlIEpTT04g
aGFzaC4KLQotICBGb3IgdmVyeSBjdXN0b20gc2VyaWFsaXphdGlvbiwgeW91IGNhbiBpbXBsZW1l
bnQgeW91cgotICBvd24gYHNlcmlhbGl6ZWAgbWV0aG9kLiBJbiBnZW5lcmFsLCBob3dldmVyLCB5
b3Ugd2lsbCB3YW50Ci0gIHRvIG92ZXJyaWRlIHRoZSBob29rcyBkZXNjcmliZWQgYmVsb3cuCi0K
LSAgIyMjIEFkZGluZyB0aGUgSUQKLQotICBUaGUgZGVmYXVsdCBgc2VyaWFsaXplYCB3aWxsIG9w
dGlvbmFsbHkgY2FsbCB5b3VyIHNlcmlhbGl6ZXIncwotICBgYWRkSWRgIG1ldGhvZCB3aXRoIHRo
ZSBKU09OIGhhc2ggaXQgaXMgY3JlYXRpbmcsIHRoZQotICByZWNvcmQncyB0eXBlLCBhbmQgdGhl
IHJlY29yZCdzIElELiBUaGUgYHNlcmlhbGl6ZWAgbWV0aG9kCi0gIHdpbGwgbm90IGNhbGwgYGFk
ZElkYCBpZiB0aGUgcmVjb3JkJ3MgSUQgaXMgdW5kZWZpbmVkLgotCi0gIFlvdXIgYWRhcHRlciBt
dXN0IHNwZWNpZmljYWxseSByZXF1ZXN0IElEIGluY2x1c2lvbiBieQotICBwYXNzaW5nIGB7IGlu
Y2x1ZGVJZDogdHJ1ZSB9YCBhcyBhbiBvcHRpb24gdG8gYHNlcmlhbGl6ZWAuCi0KLSAgTk9URTog
WW91IG1heSBub3Qgd2FudCB0byBpbmNsdWRlIHRoZSBJRCB3aGVuIHVwZGF0aW5nIGFuCi0gIGV4
aXN0aW5nIHJlY29yZCwgYmVjYXVzZSB5b3VyIHNlcnZlciB3aWxsIGxpa2VseSBkaXNhbGxvdwot
ICBjaGFuZ2luZyBhbiBJRCBhZnRlciBpdCBpcyBjcmVhdGVkLCBhbmQgdGhlIFBVVCByZXF1ZXN0
Ci0gIGl0c2VsZiB3aWxsIGluY2x1ZGUgdGhlIHJlY29yZCdzIGlkZW50aWZpY2F0aW9uLgotCi0g
IEJ5IGRlZmF1bHQsIGBhZGRJZGAgd2lsbDoKLQotICAxLiBHZXQgdGhlIHByaW1hcnkga2V5IG5h
bWUgZm9yIHRoZSByZWNvcmQgYnkgY2FsbGluZwotICAgICB0aGUgc2VyaWFsaXplcidzIGBwcmlt
YXJ5S2V5YCB3aXRoIHRoZSByZWNvcmQncyB0eXBlLgotICAgICBVbmxlc3MgeW91IG92ZXJyaWRl
IHRoZSBgcHJpbWFyeUtleWAgbWV0aG9kLCB0aGlzCi0gICAgIHdpbGwgYmUgYCdpZCdgLgotICAy
LiBBc3NpZ24gdGhlIHJlY29yZCdzIElEIHRvIHRoZSBwcmltYXJ5IGtleSBpbiB0aGUKLSAgICAg
SlNPTiBoYXNoIGJlaW5nIGJ1aWx0LgotCi0gIElmIHlvdXIgYmFja2VuZCBleHBlY3RzIGEgSlNP
TiBvYmplY3Qgd2l0aCB0aGUgcHJpbWFyeQotICBrZXkgYXQgdGhlIHJvb3QsIHlvdSBjYW4ganVz
dCBvdmVycmlkZSB0aGUgYHByaW1hcnlLZXlgCi0gIG1ldGhvZCBvbiB5b3VyIHNlcmlhbGl6ZXIg
c3ViY2xhc3MuCi0KLSAgT3RoZXJ3aXNlLCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBgYWRkSWRgIG1l
dGhvZCBmb3IKLSAgbW9yZSBzcGVjaWFsaXplZCBoYW5kbGluZy4KLQotICAjIyMgQWRkaW5nIEF0
dHJpYnV0ZXMKLQotICBCeSBkZWZhdWx0LCB0aGUgc2VyaWFsaXplcidzIGBzZXJpYWxpemVgIG1l
dGhvZCB3aWxsIGNhbGwKLSAgYGFkZEF0dHJpYnV0ZXNgIHdpdGggdGhlIEpTT04gb2JqZWN0IGl0
IGlzIGNyZWF0aW5nCi0gIGFuZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZS4KLQotICBUaGUgYGFk
ZEF0dHJpYnV0ZXNgIG1ldGhvZCB3aWxsIHRoZW4gY2FsbCBgYWRkQXR0cmlidXRlYAotICBpbiB0
dXJuLCB3aXRoIHRoZSBKU09OIG9iamVjdCwgdGhlIHJlY29yZCB0byBzZXJpYWxpemUsCi0gIHRo
ZSBhdHRyaWJ1dGUncyBuYW1lIGFuZCBpdHMgdHlwZS4KLQotICBGaW5hbGx5LCB0aGUgYGFkZEF0
dHJpYnV0ZWAgbWV0aG9kIHdpbGwgc2VyaWFsaXplIHRoZQotICBhdHRyaWJ1dGU6Ci0KLSAgMS4g
SXQgd2lsbCBjYWxsIGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCB0byBkZXRlcm1pbmUKLSAgICAgdGhl
IGtleSB0byB1c2UgaW4gdGhlIEpTT04gaGFzaC4KLSAgMi4gSXQgd2lsbCBnZXQgdGhlIHZhbHVl
IGZyb20gdGhlIHJlY29yZC4KLSAgMy4gSXQgd2lsbCBjYWxsIGBzZXJpYWxpemVWYWx1ZWAgd2l0
aCB0aGUgYXR0cmlidXRlJ3MKLSAgICAgdmFsdWUgYW5kIGF0dHJpYnV0ZSB0eXBlIHRvIGNvbnZl
cnQgaXQgaW50byBhCi0gICAgIEpTT04tY29tcGF0aWJsZSB2YWx1ZS4gRm9yIGV4YW1wbGUsIGl0
IHdpbGwgY29udmVydCBhCi0gICAgIERhdGUgaW50byBhIFN0cmluZy4KLQotICBJZiB5b3VyIGJh
Y2tlbmQgZXhwZWN0cyBhIEpTT04gb2JqZWN0IHdpdGggYXR0cmlidXRlcyBhcwotICBrZXlzIGF0
IHRoZSByb290LCB5b3UgY2FuIGp1c3Qgb3ZlcnJpZGUgdGhlIGBzZXJpYWxpemVWYWx1ZWAKLSAg
YW5kIGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCBtZXRob2RzIGluIHlvdXIgc2VyaWFsaXplcgotICBz
dWJjbGFzcyBhbmQgbGV0IHRoZSBiYXNlIGNsYXNzIGRvIHRoZSBoZWF2eSBsaWZ0aW5nLgotCi0g
IElmIHlvdSBuZWVkIHNvbWV0aGluZyBtb3JlIHNwZWNpYWxpemVkLCB5b3UgY2FuIHByb2JhYmx5
Ci0gIG92ZXJyaWRlIGBhZGRBdHRyaWJ1dGVgIGFuZCBsZXQgdGhlIGRlZmF1bHQgYGFkZEF0dHJp
YnV0ZXNgCi0gIGhhbmRsZSB0aGUgbml0dHkgZ3JpdHR5LgotCi0gICMjIyBBZGRpbmcgUmVsYXRp
b25zaGlwcwotCi0gIEJ5IGRlZmF1bHQsIGBzZXJpYWxpemVgIHdpbGwgY2FsbCB5b3VyIHNlcmlh
bGl6ZXIncwotICBgYWRkUmVsYXRpb25zaGlwc2AgbWV0aG9kIHdpdGggdGhlIEpTT04gb2JqZWN0
IHRoYXQgaXMKLSAgYmVpbmcgYnVpbHQgYW5kIHRoZSByZWNvcmQgYmVpbmcgc2VyaWFsaXplZC4g
VGhlIGRlZmF1bHQKLSAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgdG8gbG9vcCBv
dmVyIGFsbCBvZiB0aGUKLSAgcmVsYXRpb25zaGlwcyBkZWZpbmVkIG9uIHlvdXIgcmVjb3JkIHR5
cGUgYW5kOgotCi0gICogSWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBhIGBEUy5oYXNNYW55YCByZWxh
dGlvbnNoaXAsCi0gICAgY2FsbCBgYWRkSGFzTWFueWAgd2l0aCB0aGUgSlNPTiBvYmplY3QsIHRo
ZSByZWNvcmQKLSAgICBhbmQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAq
IElmIHRoZSByZWxhdGlvbnNoaXAgaXMgYSBgRFMuYmVsb25nc1RvYCByZWxhdGlvbnNoaXAsCi0g
ICAgY2FsbCBgYWRkQmVsb25nc1RvYCB3aXRoIHRoZSBKU09OIG9iamVjdCwgdGhlIHJlY29yZAot
ICAgIGFuZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLSAgVGhlIHJlbGF0
aW9uc2hpcCBkZXNjcmlwdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBrZXlzOgotCi0gICogYHR5cGVg
OiB0aGUgY2xhc3Mgb2YgdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gKHRoZQotICAgIGZpcnN0
IHBhcmFtZXRlciB0byBgRFMuaGFzTWFueWAgb3IgYERTLmJlbG9uZ3NUb2ApCi0gICogYGtpbmRg
OiBlaXRoZXIgYGhhc01hbnlgIG9yIGBiZWxvbmdzVG9gCi0KLSAgVGhlIHJlbGF0aW9uc2hpcCBk
ZXNjcmlwdGlvbiBtYXkgZ2V0IGFkZGl0aW9uYWwKLSAgaW5mb3JtYXRpb24gaW4gdGhlIGZ1dHVy
ZSBpZiBtb3JlIGNhcGFiaWxpdGllcyBvcgotICByZWxhdGlvbnNoaXAgdHlwZXMgYXJlIGFkZGVk
LiBIb3dldmVyLCBpdCB3aWxsCi0gIHJlbWFpbiBiYWNrd2FyZHMtY29tcGF0aWJsZSwgc28gdGhl
IG1lcmUgZXhpc3RlbmNlCi0gIG9mIG5ldyBmZWF0dXJlcyBzaG91bGQgbm90IGJyZWFrIGV4aXN0
aW5nIGFkYXB0ZXJzLgotKi8KLURTLlNlcmlhbGl6ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5tYXBwaW5ncyA9IEVtYmVyLk1hcC5jcmVh
dGUoKTsKLSAgICB0aGlzLmNvbmZpZ3VyYXRpb25zID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotICAg
IHRoaXMuZ2xvYmFsQ29uZmlndXJhdGlvbnMgPSB7fTsKLSAgfSwKLQotICBleHRyYWN0OiBtdXN0
SW1wbGVtZW50KCdleHRyYWN0JyksCi0gIGV4dHJhY3RNYW55OiBtdXN0SW1wbGVtZW50KCdleHRy
YWN0TWFueScpLAotCi0gIGV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlvbjogZnVuY3Rpb24obG9h
ZGVyLCB0eXBlLCBqc29uLCBzaG91bGRTaWRlbG9hZCkgewotICAgIHZhciBtYXBwaW5nID0gdGhp
cy5tYXBwaW5nRm9yVHlwZSh0eXBlKTsKLSAgICB2YXIgZW1iZWRkZWREYXRhLCBwcmVtYXRlcmlh
bGl6ZWQgPSB7fSwgcmVmZXJlbmNlOwotCi0gICAgaWYgKHNob3VsZFNpZGVsb2FkKSB7Ci0gICAg
ICByZWZlcmVuY2UgPSBsb2FkZXIuc2lkZWxvYWQodHlwZSwganNvbik7Ci0gICAgfSBlbHNlIHsK
LSAgICAgIHJlZmVyZW5jZSA9IGxvYWRlci5sb2FkKHR5cGUsIGpzb24pOwotICAgIH0KLQotICAg
IHRoaXMuZWFjaEVtYmVkZGVkSGFzTWFueSh0eXBlLCBmdW5jdGlvbihuYW1lLCByZWxhdGlvbnNo
aXApIHsKLSAgICAgIHZhciBlbWJlZGRlZERhdGEgPSBqc29uW3RoaXMua2V5Rm9yKHJlbGF0aW9u
c2hpcCldOwotICAgICAgaWYgKCFpc05vbmUoZW1iZWRkZWREYXRhKSkgewotICAgICAgICB0aGlz
LmV4dHJhY3RFbWJlZGRlZEhhc01hbnkobG9hZGVyLCByZWxhdGlvbnNoaXAsIGVtYmVkZGVkRGF0
YSwgcmVmZXJlbmNlLCBwcmVtYXRlcmlhbGl6ZWQpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwot
Ci0gICAgdGhpcy5lYWNoRW1iZWRkZWRCZWxvbmdzVG8odHlwZSwgZnVuY3Rpb24obmFtZSwgcmVs
YXRpb25zaGlwKSB7Ci0gICAgICB2YXIgZW1iZWRkZWREYXRhID0ganNvblt0aGlzLmtleUZvcihy
ZWxhdGlvbnNoaXApXTsKLSAgICAgIGlmICghaXNOb25lKGVtYmVkZGVkRGF0YSkpIHsKLSAgICAg
ICAgdGhpcy5leHRyYWN0RW1iZWRkZWRCZWxvbmdzVG8obG9hZGVyLCByZWxhdGlvbnNoaXAsIGVt
YmVkZGVkRGF0YSwgcmVmZXJlbmNlLCBwcmVtYXRlcmlhbGl6ZWQpOwotICAgICAgfQotICAgIH0s
IHRoaXMpOwotCi0gICAgbG9hZGVyLnByZW1hdGVyaWFsaXplKHJlZmVyZW5jZSwgcHJlbWF0ZXJp
YWxpemVkKTsKLQotICAgIHJldHVybiByZWZlcmVuY2U7Ci0gIH0sCi0KLSAgZXh0cmFjdEVtYmVk
ZGVkSGFzTWFueTogZnVuY3Rpb24obG9hZGVyLCByZWxhdGlvbnNoaXAsIGFycmF5LCBwYXJlbnQs
IHByZW1hdGVyaWFsaXplZCkgewotICAgIHZhciByZWZlcmVuY2VzID0gbWFwLmNhbGwoYXJyYXks
IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIGlmICghaXRlbSkgeyByZXR1cm47IH0KLQotICAgICAg
dmFyIHJlZmVyZW5jZSA9IHRoaXMuZXh0cmFjdFJlY29yZFJlcHJlc2VudGF0aW9uKGxvYWRlciwg
cmVsYXRpb25zaGlwLnR5cGUsIGl0ZW0sIHRydWUpOwotCi0gICAgICAvLyBJZiB0aGUgZW1iZWRk
ZWQgcmVjb3JkIHNob3VsZCBhbHNvIGJlIHNhdmVkIGJhY2sgd2hlbiBzZXJpYWxpemluZyB0aGUg
cGFyZW50LAotICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCBpdHMgcGFyZW50IHNpbmNlIGl0IHdp
bGwgbm90IGhhdmUgYW4gSUQuCi0gICAgICB2YXIgZW1iZWRkZWRUeXBlID0gdGhpcy5lbWJlZGRl
ZFR5cGUocGFyZW50LnR5cGUsIHJlbGF0aW9uc2hpcC5rZXkpOwotICAgICAgaWYgKGVtYmVkZGVk
VHlwZSA9PT0gJ2Fsd2F5cycpIHsKLSAgICAgICAgcmVmZXJlbmNlLnBhcmVudCA9IHBhcmVudDsK
LSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlZmVyZW5jZTsKLSAgICB9LCB0aGlzKTsKLQotICAg
IHByZW1hdGVyaWFsaXplZFtyZWxhdGlvbnNoaXAua2V5XSA9IHJlZmVyZW5jZXM7Ci0gIH0sCi0K
LSAgZXh0cmFjdEVtYmVkZGVkQmVsb25nc1RvOiBmdW5jdGlvbihsb2FkZXIsIHJlbGF0aW9uc2hp
cCwgZGF0YSwgcGFyZW50LCBwcmVtYXRlcmlhbGl6ZWQpIHsKLSAgICB2YXIgcmVmZXJlbmNlID0g
dGhpcy5leHRyYWN0UmVjb3JkUmVwcmVzZW50YXRpb24obG9hZGVyLCByZWxhdGlvbnNoaXAudHlw
ZSwgZGF0YSwgdHJ1ZSk7Ci0gICAgcHJlbWF0ZXJpYWxpemVkW3JlbGF0aW9uc2hpcC5rZXldID0g
cmVmZXJlbmNlOwotCi0gICAgLy8gSWYgdGhlIGVtYmVkZGVkIHJlY29yZCBzaG91bGQgYWxzbyBi
ZSBzYXZlZCBiYWNrIHdoZW4gc2VyaWFsaXppbmcgdGhlIHBhcmVudCwKLSAgICAvLyBtYWtlIHN1
cmUgd2Ugc2V0IGl0cyBwYXJlbnQgc2luY2UgaXQgd2lsbCBub3QgaGF2ZSBhbiBJRC4KLSAgICB2
YXIgZW1iZWRkZWRUeXBlID0gdGhpcy5lbWJlZGRlZFR5cGUocGFyZW50LnR5cGUsIHJlbGF0aW9u
c2hpcC5rZXkpOwotICAgIGlmIChlbWJlZGRlZFR5cGUgPT09ICdhbHdheXMnKSB7Ci0gICAgICBy
ZWZlcmVuY2UucGFyZW50ID0gcGFyZW50OwotICAgIH0KLSAgfSwKLQotICAvLy4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uCi0gIC8vLiBTRVJJQUxJWkFUSU9OIEhPT0tTCi0gIC8vLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KLQotICAvKioKLSAgICBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3Igc2VyaWFs
aXppbmcgYSByZWNvcmQuIFdoaWxlIHlvdSBjYW4gY29uc2lkZXIgdGhpcwotICAgIGEgaG9vayB0
aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHlvdXIgc2VyaWFsaXplciwgeW91IHdpbGwgaGF2ZSB0
byBtYW51YWxseQotICAgIGhhbmRsZSBzZXJpYWxpemF0aW9uLiBGb3IgbW9zdCBjYXNlcywgdGhl
cmUgYXJlIG1vcmUgZ3JhbnVsYXIgaG9va3MgdGhhdCB5b3UKLSAgICBjYW4gb3ZlcnJpZGUuCi0K
LSAgICBJZiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCB0aGVzZSBhcmUgdGhlIHJlc3BvbnNpYmls
aXRpZXMgdGhhdCB5b3Ugd2lsbCBuZWVkCi0gICAgdG8gaW1wbGVtZW50IHlvdXJzZWxmOgotCi0g
ICAgKiBJZiB0aGUgb3B0aW9uIGhhc2ggY29udGFpbnMgYGluY2x1ZGVJZGAsIGFkZCB0aGUgcmVj
b3JkJ3MgSUQgdG8gdGhlIHNlcmlhbGl6ZWQgZm9ybS4KLSAgICAgIEJ5IGRlZmF1bHQsIGBzZXJp
YWxpemVgIGNhbGxzIGBhZGRJZGAgaWYgYXBwcm9wcmlhdGUuCi0gICAgKiBBZGQgdGhlIHJlY29y
ZCdzIGF0dHJpYnV0ZXMgdG8gdGhlIHNlcmlhbGl6ZWQgZm9ybS4gQnkgZGVmYXVsdCwgYHNlcmlh
bGl6ZWAgY2FsbHMKLSAgICAgIGBhZGRBdHRyaWJ1dGVzYC4KLSAgICAqIEFkZCB0aGUgcmVjb3Jk
J3MgcmVsYXRpb25zaGlwcyB0byB0aGUgc2VyaWFsaXplZCBmb3JtLiBCeSBkZWZhdWx0LCBgc2Vy
aWFsaXplYCBjYWxscwotICAgICAgYGFkZFJlbGF0aW9uc2hpcHNgLgotCi0gICAgQHBhcmFtIHtE
Uy5Nb2RlbH0gcmVjb3JkIHRoZSByZWNvcmQgdG8gc2VyaWFsaXplCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IFtvcHRpb25zXSBhIGhhc2ggb2Ygb3B0aW9ucwotICAgIEByZXR1cm5zIHthbnl9IHRoZSBz
ZXJpYWxpemVkIGZvcm0gb2YgdGhlIHJlY29yZAotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9u
KHJlY29yZCwgb3B0aW9ucykgewotICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gICAg
dmFyIHNlcmlhbGl6ZWQgPSB0aGlzLmNyZWF0ZVNlcmlhbGl6ZWRGb3JtKCksIGlkOwotCi0gICAg
aWYgKG9wdGlvbnMuaW5jbHVkZUlkKSB7Ci0gICAgICBpZiAoaWQgPSBnZXQocmVjb3JkLCAnaWQn
KSkgewotICAgICAgICB0aGlzLl9hZGRJZChzZXJpYWxpemVkLCByZWNvcmQuY29uc3RydWN0b3Is
IGlkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0aGlzLmFkZEF0dHJpYnV0ZXMoc2VyaWFsaXpl
ZCwgcmVjb3JkKTsKLSAgICB0aGlzLmFkZFJlbGF0aW9uc2hpcHMoc2VyaWFsaXplZCwgcmVjb3Jk
KTsKLQotICAgIHJldHVybiBzZXJpYWxpemVkOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRl
Ci0KLSAgICBHaXZlbiBhbiBhdHRyaWJ1dGUgdHlwZSBhbmQgdmFsdWUsIGNvbnZlcnQgdGhlIHZh
bHVlIGludG8gdGhlCi0gICAgc2VyaWFsaXplZCBmb3JtIHVzaW5nIHRoZSB0cmFuc2Zvcm0gcmVn
aXN0ZXJlZCBmb3IgdGhhdCB0eXBlLgotCi0gICAgQHBhcmFtIHthbnl9IHZhbHVlIHRoZSB2YWx1
ZSB0byBjb252ZXJ0IHRvIHRoZSBzZXJpYWxpemVkIGZvcm0KLSAgICBAcGFyYW0ge1N0cmluZ30g
YXR0cmlidXRlVHlwZSB0aGUgcmVnaXN0ZXJlZCB0eXBlIChlLmcuIGBzdHJpbmdgCi0gICAgICBv
ciBgYm9vbGVhbmApCi0gICAgQHJldHVybnMge2FueX0gdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiB0
aGUgdmFsdWUKLSAgKi8KLSAgc2VyaWFsaXplVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyaWJ1
dGVUeXBlKSB7Ci0gICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtcyA/IHRoaXMudHJh
bnNmb3Jtc1thdHRyaWJ1dGVUeXBlXSA6IG51bGw7Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSB0
cmllZCB0byB1c2UgYW4gYXR0cmlidXRlIHR5cGUgKCIgKyBhdHRyaWJ1dGVUeXBlICsgIikgdGhh
dCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCIsIHRyYW5zZm9ybSk7Ci0gICAgcmV0dXJuIHRyYW5z
Zm9ybS5zZXJpYWxpemUodmFsdWUpOwotICB9LAotCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2Fu
IHVzZSB0byBub3JtYWxpemUgSURzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUKLSAgICBzZXJp
YWxpemVkIHJlcHJlc2VudGF0aW9uLgotCi0gICAgQmVjYXVzZSB0aGUgc3RvcmUgY29lcmNlcyBh
bGwgSURzIHRvIHN0cmluZ3MgZm9yIGNvbnNpc3RlbmN5LAotICAgIHRoaXMgaXMgdGhlIG9wcG9y
dHVuaXR5IGZvciB0aGUgc2VyaWFsaXplciB0bywgZm9yIGV4YW1wbGUsCi0gICAgY29udmVydCBu
dW1lcmljYWwgSURzIGJhY2sgaW50byBudW1iZXIgZm9ybS4KLQotICAgIEBwYXJhbSB7U3RyaW5n
fSBpZCB0aGUgaWQgZnJvbSB0aGUgcmVjb3JkCi0gICAgQHJldHVybnMge2FueX0gdGhlIHNlcmlh
bGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkCi0gICovCi0gIHNlcmlhbGl6ZUlkOiBmdW5j
dGlvbihpZCkgewotICAgIGlmIChpc05hTihpZCkpIHsgcmV0dXJuIGlkOyB9Ci0gICAgcmV0dXJu
ICtpZDsKLSAgfSwKLQotICAvKioKLSAgICBBIGhvb2sgeW91IGNhbiB1c2UgdG8gY2hhbmdlIGhv
dyBhdHRyaWJ1dGVzIGFyZSBhZGRlZCB0byB0aGUgc2VyaWFsaXplZAotICAgIHJlcHJlc2VudGF0
aW9uIG9mIGEgcmVjb3JkLgotCi0gICAgQnkgZGVmYXVsdCwgYGFkZEF0dHJpYnV0ZXNgIHNpbXBs
eSBsb29wcyBvdmVyIGFsbCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKLSAgICBwYXNzZWQgcmVj
b3JkLCBtYXBzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUga2V5IGZvciB0aGUgc2VyaWFsaXpl
ZCBmb3JtLAotICAgIGFuZCBpbnZva2VzIGFueSByZWdpc3RlcmVkIHRyYW5zZm9ybXMgb24gdGhl
IHZhbHVlLiBJdCB0aGVuIGludm9rZXMgdGhlCi0gICAgbW9yZSBncmFudWxhciBgYWRkQXR0cmli
dXRlYCB3aXRoIHRoZSBrZXkgYW5kIHRyYW5zZm9ybWVkIHZhbHVlLgotCi0gICAgU2luY2UgeW91
IGNhbiBvdmVycmlkZSBga2V5Rm9yQXR0cmlidXRlTmFtZWAsIGBhZGRBdHRyaWJ1dGVgLCBhbmQg
cmVnaXN0ZXIKLSAgICBjdXN0b20gdHJhbmZvcm1zLCB5b3Ugc2hvdWxkIHJhcmVseSBuZWVkIHRv
IG92ZXJyaWRlIHRoaXMgaG9vay4KLQotICAgIEBwYXJhbSB7YW55fSBkYXRhIHRoZSBzZXJpYWxp
emVkIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQKLSAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxpemUKLSAgKi8KLSAgYWRkQXR0cmlidXRl
czogZnVuY3Rpb24oZGF0YSwgcmVjb3JkKSB7Ci0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVu
Y3Rpb24obmFtZSwgYXR0cmlidXRlKSB7Ci0gICAgICB0aGlzLl9hZGRBdHRyaWJ1dGUoZGF0YSwg
cmVjb3JkLCBuYW1lLCBhdHRyaWJ1dGUudHlwZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQSBob29rIHlvdSBjYW4gdXNlIHRvIGN1c3RvbWl6ZSBob3cgdGhlIGtleS92YWx1
ZSBwYWlyIGlzIGFkZGVkIHRvCi0gICAgdGhlIHNlcmlhbGl6ZWQgZGF0YS4KLQotICAgIEBwYXJh
bSB7YW55fSBzZXJpYWxpemVkIHRoZSBzZXJpYWxpemVkIGZvcm0gYmVpbmcgYnVpbHQKLSAgICBA
cGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gYWRkIHRvIHRoZSBzZXJpYWxpemVkIGRhdGEK
LSAgICBAcGFyYW0ge2FueX0gdmFsdWUgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2VyaWFsaXpl
ZCBkYXRhCi0gICovCi0gIGFkZEF0dHJpYnV0ZTogRW1iZXIuSywKLQotICAvKioKLSAgICBBIGhv
b2sgeW91IGNhbiB1c2UgdG8gY3VzdG9taXplIGhvdyB0aGUgcmVjb3JkJ3MgaWQgaXMgYWRkZWQg
dG8KLSAgICB0aGUgc2VyaWFsaXplZCBkYXRhLgotCi0gICAgVGhlIGBhZGRJZGAgaG9vayBpcyBj
YWxsZWQgd2l0aDoKLQotICAgICogdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gYmVpbmcg
YnVpbHQKLSAgICAqIHRoZSByZXNvbHZlZCBwcmltYXJ5IGtleSAodGFraW5nIGNvbmZpZ3VyYXRp
b25zIGFuZCB0aGUKLSAgICAgIGBwcmltYXJ5S2V5YCBob29rIGludG8gY29uc2lkZXJhdGlvbikK
LSAgICAqIHRoZSBzZXJpYWxpemVkIGlkIChhZnRlciBjYWxsaW5nIHRoZSBgc2VyaWFsaXplSWRg
IGhvb2spCi0KLSAgICBAcGFyYW0ge2FueX0gZGF0YSB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRh
dGlvbiB0aGF0IGlzIGJlaW5nIGJ1aWx0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcmVz
b2x2ZWQgcHJpbWFyeSBrZXkKLSAgICBAcGFyYW0ge2lkfSBpZCB0aGUgc2VyaWFsaXplZCBpZAot
ICAqLwotICBhZGRJZDogRW1iZXIuSywKLQotICAvKioKLSAgICBBIGhvb2sgeW91IGNhbiB1c2Ug
dG8gY2hhbmdlIGhvdyByZWxhdGlvbnNoaXBzIGFyZSBhZGRlZCB0byB0aGUgc2VyaWFsaXplZAot
ICAgIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVjb3JkLgotCi0gICAgQnkgZGVmYXVsdCwgYGFkZEF0
dHJpYnV0ZXNgIGxvb3BzIG92ZXIgYWxsIG9mIHRoZSByZWxhdGlvbnNoaXBzIG9mIHRoZQotICAg
IHBhc3NlZCByZWNvcmQsIG1hcHMgdGhlIHJlbGF0aW9uc2hpcCBuYW1lcyB0byB0aGUga2V5IGZv
ciB0aGUgc2VyaWFsaXplZCBmb3JtLAotICAgIGFuZCB0aGVuIGludm9rZXMgdGhlIHB1YmxpYyBg
YWRkQmVsb25nc1RvYCBhbmQgYGFkZEhhc01hbnlgIGhvb2tzLgotCi0gICAgU2luY2UgeW91IGNh
biBvdmVycmlkZSBga2V5Rm9yQmVsb25nc1RvYCwgYGtleUZvckhhc01hbnlgLCBgYWRkQmVsb25n
c1RvYCwKLSAgICBgYWRkSGFzTWFueWAsIGFuZCByZWdpc3RlciBtYXBwaW5ncywgeW91IHNob3Vs
ZCByYXJlbHkgbmVlZCB0byBvdmVycmlkZSB0aGlzCi0gICAgaG9vay4KLQotICAgIEBwYXJhbSB7
YW55fSBkYXRhIHRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcgYnVp
bHQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxpemUK
LSAgKi8KLSAgYWRkUmVsYXRpb25zaGlwczogZnVuY3Rpb24oZGF0YSwgcmVjb3JkKSB7Ci0gICAg
cmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0g
ICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0gICAgICAgIHRo
aXMuX2FkZEJlbG9uZ3NUbyhkYXRhLCByZWNvcmQsIG5hbWUsIHJlbGF0aW9uc2hpcCk7Ci0gICAg
ICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAg
dGhpcy5fYWRkSGFzTWFueShkYXRhLCByZWNvcmQsIG5hbWUsIHJlbGF0aW9uc2hpcCk7Ci0gICAg
ICB9Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBob29rIHlvdSBjYW4gdXNl
IHRvIGFkZCBhIGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcCB0byB0aGUKLSAgICBzZXJpYWxpemVk
IHJlcHJlc2VudGF0aW9uLgotCi0gICAgVGhlIHNwZWNpZmljcyBvZiB0aGlzIGhvb2sgYXJlIHZl
cnkgYWRhcHRlci1zcGVjaWZpYywgc28gdGhlcmUKLSAgICBpcyBubyBkZWZhdWx0IGltcGxlbWVu
dGF0aW9uLiBZb3UgY2FuIHNlZSBgRFMuSlNPTlNlcmlhbGl6ZXJgCi0gICAgZm9yIGFuIGV4YW1w
bGUgb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBhZGRCZWxvbmdzVG9gIGhvb2suCi0KLSAg
ICBUaGUgYGJlbG9uZ3NUb2AgcmVsYXRpb25zaGlwIG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBw
cm9wZXJ0aWVzOgotCi0gICAgKiAqKnR5cGUqKiBhIHN1YmNsYXNzIG9mIERTLk1vZGVsIHRoYXQg
aXMgdGhlIHR5cGUgb2YgdGhlCi0gICAgICByZWxhdGlvbnNoaXAuIFRoaXMgaXMgdGhlIGZpcnN0
IHBhcmFtZXRlciB0byBEUy5iZWxvbmdzVG8KLSAgICAqICoqb3B0aW9ucyoqIHRoZSBvcHRpb25z
IHBhc3NlZCB0byB0aGUgY2FsbCB0byBEUy5iZWxvbmdzVG8KLSAgICAqICoqa2luZCoqIGFsd2F5
cyBgYmVsb25nc1RvYAotCi0gICAgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCBp
biB0aGUgZnV0dXJlLgotCi0gICAgQHBhcmFtIHthbnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVw
cmVzZW50YXRpb24gdGhhdCBpcyBiZWluZyBidWlsdAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJl
Y29yZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhl
IGtleSBmb3IgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHJlbGF0
aW9uc2hpcCBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZWxhdGlvbnNoaXAKLSAgKi8KLSAg
YWRkQmVsb25nc1RvOiBFbWJlci5LLAotCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0
byBhZGQgYSBgaGFzTWFueWAgcmVsYXRpb25zaGlwIHRvIHRoZQotICAgIHNlcmlhbGl6ZWQgcmVw
cmVzZW50YXRpb24uCi0KLSAgICBUaGUgc3BlY2lmaWNzIG9mIHRoaXMgaG9vayBhcmUgdmVyeSBh
ZGFwdGVyLXNwZWNpZmljLCBzbyB0aGVyZQotICAgIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRp
b24uIFlvdSBtYXkgbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMsCi0gICAgZm9yIGV4YW1wbGUs
IGlmIHlvdXIgYmFja2VuZCBvbmx5IGV4cGVjdHMgcmVsYXRpb25zaGlwcyBvbiB0aGUKLSAgICBj
aGlsZCBvZiBhIG9uZSB0byBtYW55IHJlbGF0aW9uc2hpcC4KLQotICAgIFRoZSBgaGFzTWFueWAg
cmVsYXRpb25zaGlwIG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotCi0gICAg
KiAqKnR5cGUqKiBhIHN1YmNsYXNzIG9mIERTLk1vZGVsIHRoYXQgaXMgdGhlIHR5cGUgb2YgdGhl
Ci0gICAgICByZWxhdGlvbnNoaXAuIFRoaXMgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBEUy5o
YXNNYW55Ci0gICAgKiAqKm9wdGlvbnMqKiB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNhbGwg
dG8gRFMuaGFzTWFueQotICAgICogKipraW5kKiogYWx3YXlzIGBoYXNNYW55YAotCi0gICAgQWRk
aXRpb25hbCBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgotCi0gICAgQHBh
cmFtIHthbnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBiZWlu
ZyBidWlsdAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRvIHNlcmlh
bGl6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBmb3IgdGhlIHNlcmlhbGl6ZWQg
b2JqZWN0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcCBhbiBvYmplY3QgcmVwcmVz
ZW50aW5nIHRoZSByZWxhdGlvbnNoaXAKLSAgKi8KLSAgYWRkSGFzTWFueTogRW1iZXIuSywKLQot
ICAvKioKLSAgICBOQU1JTkcgQ09OVkVOVElPTlMKLQotICAgIFRoZSBtb3N0IGNvbW1vbmx5IG92
ZXJyaWRkZW4gQVBJcyBvZiB0aGUgc2VyaWFsaXplciBhcmUKLSAgICB0aGUgbmFtaW5nIGNvbnZl
bnRpb24gbWV0aG9kczoKLQotICAgICogYGtleUZvckF0dHJpYnV0ZU5hbWVgOiBjb252ZXJ0cyBh
IGNhbWVsaXplZCBhdHRyaWJ1dGUgbmFtZQotICAgICAgaW50byBhIGtleSBpbiB0aGUgYWRhcHRl
ci1wcm92aWRlZCBkYXRhIGhhc2guIEZvciBleGFtcGxlLAotICAgICAgaWYgdGhlIG1vZGVsJ3Mg
YXR0cmlidXRlIG5hbWUgd2FzIGBmaXJzdE5hbWVgLCBhbmQgdGhlCi0gICAgICBzZXJ2ZXIgdXNl
ZCB1bmRlcnNjb3JlZCBuYW1lcywgeW91IHdvdWxkIHJldHVybiBgZmlyc3RfbmFtZWAuCi0gICAg
KiBgcHJpbWFyeUtleWA6IHJldHVybnMgdGhlIGtleSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvCi0g
ICAgICBleHRyYWN0IHRoZSBpZCBmcm9tIHRoZSBhZGFwdGVyLXByb3ZpZGVkIGRhdGEgaGFzaC4g
SXQgaXMKLSAgICAgIGFsc28gdXNlZCB3aGVuIHNlcmlhbGl6aW5nIGEgcmVjb3JkLgotICAqLwot
Ci0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSBpbiB5b3VyIHNlcmlhbGl6ZXIgc3ViY2xh
c3MgdG8gY3VzdG9taXplCi0gICAgaG93IGFuIHVubWFwcGVkIGF0dHJpYnV0ZSBuYW1lIGlzIGNv
bnZlcnRlZCBpbnRvIGEga2V5LgotCi0gICAgQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgcmV0dXJu
cyB0aGUgYG5hbWVgIHBhcmFtZXRlci4KLQotICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXR0cmli
dXRlIG5hbWVzIGluIHlvdXIgSlNPTiBhcmUgdW5kZXJzY29yZWQsCi0gICAgeW91IHdpbGwgd2Fu
dCB0byBjb252ZXJ0IHRoZW0gaW50byBKYXZhU2NyaXB0IGNvbnZlbnRpb25hbAotICAgIGNhbWVs
Y2FzZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuTXlTZXJpYWxpemVyID0gRFMuU2Vy
aWFsaXplci5leHRlbmQoewotICAgICAgLy8gLi4uCi0KLSAgICAgIGtleUZvckF0dHJpYnV0ZU5h
bWU6IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuY2FtZWxpemUo
KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwYXJhbSB7RFMuTW9kZWwgc3Vi
Y2xhc3N9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlY29yZCB3aXRoCi0gICAgICB0aGUgYXR0cmli
dXRlIG5hbWUgYG5hbWVgCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIGF0dHJpYnV0ZSBu
YW1lIHRvIGNvbnZlcnQgaW50byBhIGtleQotCi0gICAgQHJldHVybnMge1N0cmluZ30gdGhlIGtl
eQotICAqLwotICBrZXlGb3JBdHRyaWJ1dGVOYW1lOiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7Ci0g
ICAgcmV0dXJuIG5hbWU7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBob29rIHlvdSBjYW4gdXNlIGlu
IHlvdXIgc2VyaWFsaXplciB0byBzcGVjaWZ5IGEgY29udmVudGlvbmFsCi0gICAgcHJpbWFyeSBr
ZXkuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc3RyaW5n
IGBpZGAuCi0KLSAgICBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGlzIGhv
b2sgdG8gc3BlY2lmeSBhIHNwZWNpYWwKLSAgICBwcmltYXJ5IGtleSBmb3IgYW4gaW5kaXZpZHVh
bCB0eXBlOyB1c2UgYGNvbmZpZ3VyZWAgaW5zdGVhZC4KLQotICAgIEZvciBleGFtcGxlLCBpZiB5
b3VyIHByaW1hcnkga2V5IGlzIGFsd2F5cyBgX19pZF9fYDoKLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICBBcHAuTXlTZXJpYWxpemVyID0gRFMuU2VyaWFsaXplci5leHRlbmQoewotICAgICAgLy8g
Li4uCi0gICAgICBwcmltYXJ5S2V5OiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgICAgIHJldHVybiAn
X19pZF9fJzsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEluIGFub3RoZXIgZXhh
bXBsZSwgaWYgdGhlIHByaW1hcnkga2V5IGFsd2F5cyBpbmNsdWRlcyB0aGUKLSAgICB1bmRlcnNj
b3JlZCB2ZXJzaW9uIG9mIHRoZSB0eXBlIGJlZm9yZSB0aGUgc3RyaW5nIGBpZGA6Ci0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgQXBwLk15U2VyaWFsaXplciA9IERTLlNlcmlhbGl6ZXIuZXh0ZW5k
KHsKLSAgICAgIC8vIC4uLgotICAgICAgcHJpbWFyeUtleTogZnVuY3Rpb24odHlwZSkgewotICAg
ICAgICAvLyBJZiB0aGUgdHlwZSBpcyBgQmxvZ1Bvc3RgLCB0aGlzIHdpbGwgcmV0dXJuCi0gICAg
ICAgIC8vIGBibG9nX3Bvc3RfaWRgLgotICAgICAgICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9T
dHJpbmcoKS5zcGxpdCgiLiIpWzFdLnVuZGVyc2NvcmUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGVT
dHJpbmcgKyAiX2lkIjsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwYXJhbSB7
RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUKLSAgICBAcmV0dXJucyB7U3RyaW5nfSB0aGUgcHJpbWFy
eSBrZXkgZm9yIHRoZSB0eXBlCi0gICovCi0gIHByaW1hcnlLZXk6IGZ1bmN0aW9uKHR5cGUpIHsK
LSAgICByZXR1cm4gImlkIjsKLSAgfSwKLQotICAvKioKLSAgICBBIGhvb2sgeW91IGNhbiB1c2Ug
aW4geW91ciBzZXJpYWxpemVyIHN1YmNsYXNzIHRvIGN1c3RvbWl6ZQotICAgIGhvdyBhbiB1bm1h
cHBlZCBgYmVsb25nc1RvYCByZWxhdGlvbnNoaXAgaXMgY29udmVydGVkIGludG8KLSAgICBhIGtl
eS4KLQotICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGNhbGxzIGBrZXlGb3JBdHRyaWJ1dGVO
YW1lYCwgc28gaWYKLSAgICB5b3VyIG5hbWluZyBjb252ZW50aW9uIGlzIHVuaWZvcm0gYWNyb3Nz
IGF0dHJpYnV0ZXMgYW5kCi0gICAgcmVsYXRpb25zaGlwcywgeW91IGNhbiB1c2UgdGhlIGRlZmF1
bHQgaGVyZSBhbmQgb3ZlcnJpZGUKLSAgICBqdXN0IGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCBhcyBu
ZWVkZWQuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGBiZWxvbmdzVG9gIG5hbWVzIGluIHlv
dXIgSlNPTiBhbHdheXMKLSAgICBiZWdpbiB3aXRoIGBCVF9gIChlLmcuIGBCVF9wb3N0c2ApLCB5
b3UgY2FuIHN0cmlwIG91dCB0aGUKLSAgICBgQlRfYCBwcmVmaXg6IgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5NeVNlcmlhbGl6ZXIgPSBEUy5TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAg
ICAvLyAuLi4KLSAgICAgIGtleUZvckJlbG9uZ3NUbzogZnVuY3Rpb24odHlwZSwgbmFtZSkgewot
ICAgICAgICByZXR1cm4gbmFtZS5tYXRjaCgvXkJUXyguKikkLylbMV0uY2FtZWxpemUoKTsKLSAg
ICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwYXJhbSB7RFMuTW9kZWwgc3ViY2xhc3N9
IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlY29yZCB3aXRoCi0gICAgICB0aGUgYGJlbG9uZ3NUb2Ag
cmVsYXRpb25zaGlwLgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGlvbnNoaXAg
bmFtZSB0byBjb252ZXJ0IGludG8gYSBrZXkKLQotICAgIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBr
ZXkKLSAgKi8KLSAga2V5Rm9yQmVsb25nc1RvOiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7Ci0gICAg
cmV0dXJuIHRoaXMua2V5Rm9yQXR0cmlidXRlTmFtZSh0eXBlLCBuYW1lKTsKLSAgfSwKLQotICAv
KioKLSAgICBBIGhvb2sgeW91IGNhbiB1c2UgaW4geW91ciBzZXJpYWxpemVyIHN1YmNsYXNzIHRv
IGN1c3RvbWl6ZQotICAgIGhvdyBhbiB1bm1hcHBlZCBgaGFzTWFueWAgcmVsYXRpb25zaGlwIGlz
IGNvbnZlcnRlZCBpbnRvCi0gICAgYSBrZXkuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhv
ZCBjYWxscyBga2V5Rm9yQXR0cmlidXRlTmFtZWAsIHNvIGlmCi0gICAgeW91ciBuYW1pbmcgY29u
dmVudGlvbiBpcyB1bmlmb3JtIGFjcm9zcyBhdHRyaWJ1dGVzIGFuZAotICAgIHJlbGF0aW9uc2hp
cHMsIHlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IGhlcmUgYW5kIG92ZXJyaWRlCi0gICAganVzdCBg
a2V5Rm9yQXR0cmlidXRlTmFtZWAgYXMgbmVlZGVkLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHRo
ZSBgaGFzTWFueWAgbmFtZXMgaW4geW91ciBKU09OIGFsd2F5cwotICAgIGJlZ2luIHdpdGggdGhl
ICJ0YWJsZSBuYW1lIiBmb3IgdGhlIGN1cnJlbnQgdHlwZSAoZS5nLgotICAgIGBwb3N0X2NvbW1l
bnRzYCksIHlvdSBjYW4gc3RyaXAgb3V0IHRoZSBwcmVmaXg6IgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIEFwcC5NeVNlcmlhbGl6ZXIgPSBEUy5TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICAv
LyAuLi4KLSAgICAgIGtleUZvckhhc01hbnk6IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKLSAgICAg
ICAgLy8gaWYgeW91ciBBcHAuQmxvZ1Bvc3QgaGFzIG1hbnkgQXBwLkJsb2dDb21tZW50LCB0aGUg
a2V5IGZyb20KLSAgICAgICAgLy8gdGhlIHNlcnZlciB3b3VsZCBsb29rIGxpa2U6IGBibG9nX3Bv
c3RfYmxvZ19jb21tZW50c2AKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gQ29udmVydCB0aGUg
dHlwZSBpbnRvIGEgc3RyaW5nIGFuZCB1bmRlcnNjb3JlIHRoZQotICAgICAgICAvLyAgICBzZWNv
bmQgcGFydCAoQXBwLkJsb2dQb3N0IC0+IGJsb2dfcG9zdCkKLSAgICAgICAgLy8gMi4gRXh0cmFj
dCB0aGUgcGFydCBhZnRlciBgYmxvZ19wb3N0X2AgKGBibG9nX2NvbW1lbnRzYCkKLSAgICAgICAg
Ly8gMy4gVW5kZXJzY29yZSBpdCwgdG8gYmVjb21lIGBibG9nQ29tbWVudHNgCi0gICAgICAgIHZh
ciB0eXBlU3RyaW5nID0gdHlwZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV0udW5kZXJzY29yZSgp
OwotICAgICAgICByZXR1cm4gbmFtZS5tYXRjaChuZXcgUmVnRXhwKCJeIiArIHR5cGVTdHJpbmcg
KyAiXyguKikkIikpWzFdLmNhbWVsaXplKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0K
LSAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNzfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSByZWNv
cmQgd2l0aAotICAgICAgdGhlIGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcC4KLSAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZSB0aGUgcmVsYXRpb25zaGlwIG5hbWUgdG8gY29udmVydCBpbnRvIGEga2V5
Ci0KLSAgICBAcmV0dXJucyB7U3RyaW5nfSB0aGUga2V5Ci0gICovCi0gIGtleUZvckhhc01hbnk6
IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKLSAgICByZXR1cm4gdGhpcy5rZXlGb3JBdHRyaWJ1dGVO
YW1lKHR5cGUsIG5hbWUpOwotICB9LAotCi0gIC8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgot
ICAvLy4gTUFURVJJQUxJWkFUSU9OIEhPT0tTCi0gIC8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotCi0gIG1hdGVyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIHNlcmlhbGl6ZWQsIHByZW1hdGVy
aWFsaXplZCkgewotICAgIHZhciBpZDsKLSAgICBpZiAoRW1iZXIuaXNOb25lKGdldChyZWNvcmQs
ICdpZCcpKSkgewotICAgICAgaWYgKHByZW1hdGVyaWFsaXplZCAmJiBwcmVtYXRlcmlhbGl6ZWQu
aGFzT3duUHJvcGVydHkoJ2lkJykpIHsKLSAgICAgICAgaWQgPSBwcmVtYXRlcmlhbGl6ZWQuaWQ7
Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZCA9IHRoaXMuZXh0cmFjdElkKHJlY29yZC5jb25z
dHJ1Y3Rvciwgc2VyaWFsaXplZCk7Ci0gICAgICB9Ci0gICAgICByZWNvcmQubWF0ZXJpYWxpemVJ
ZChpZCk7Ci0gICAgfQotCi0gICAgdGhpcy5tYXRlcmlhbGl6ZUF0dHJpYnV0ZXMocmVjb3JkLCBz
ZXJpYWxpemVkLCBwcmVtYXRlcmlhbGl6ZWQpOwotICAgIHRoaXMubWF0ZXJpYWxpemVSZWxhdGlv
bnNoaXBzKHJlY29yZCwgc2VyaWFsaXplZCwgcHJlbWF0ZXJpYWxpemVkKTsKLSAgfSwKLQotICBk
ZXNlcmlhbGl6ZVZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgYXR0cmlidXRlVHlwZSkgewotICAgIHZh
ciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybXMgPyB0aGlzLnRyYW5zZm9ybXNbYXR0cmlidXRl
VHlwZV0gOiBudWxsOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gdXNlIGEgYXR0
cmlidXRlIHR5cGUgKCIgKyBhdHRyaWJ1dGVUeXBlICsgIikgdGhhdCBoYXMgbm90IGJlZW4gcmVn
aXN0ZXJlZCIsIHRyYW5zZm9ybSk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybS5kZXNlcmlhbGl6ZSh2
YWx1ZSk7Ci0gIH0sCi0KLSAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbihyZWNvcmQs
IHNlcmlhbGl6ZWQsIHByZW1hdGVyaWFsaXplZCkgewotICAgIHJlY29yZC5lYWNoQXR0cmlidXRl
KGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZSkgewotICAgICAgaWYgKHByZW1hdGVyaWFsaXplZCAm
JiBwcmVtYXRlcmlhbGl6ZWQuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKLSAgICAgICAgcmVjb3Jk
Lm1hdGVyaWFsaXplQXR0cmlidXRlKG5hbWUsIHByZW1hdGVyaWFsaXplZFtuYW1lXSk7Ci0gICAg
ICB9IGVsc2UgewotICAgICAgICB0aGlzLm1hdGVyaWFsaXplQXR0cmlidXRlKHJlY29yZCwgc2Vy
aWFsaXplZCwgbmFtZSwgYXR0cmlidXRlLnR5cGUpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwot
ICB9LAotCi0gIG1hdGVyaWFsaXplQXR0cmlidXRlOiBmdW5jdGlvbihyZWNvcmQsIHNlcmlhbGl6
ZWQsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUpIHsKLSAgICB2YXIgdmFsdWUgPSB0aGlz
LmV4dHJhY3RBdHRyaWJ1dGUocmVjb3JkLmNvbnN0cnVjdG9yLCBzZXJpYWxpemVkLCBhdHRyaWJ1
dGVOYW1lKTsKLSAgICB2YWx1ZSA9IHRoaXMuZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgYXR0cmli
dXRlVHlwZSk7Ci0KLSAgICByZWNvcmQubWF0ZXJpYWxpemVBdHRyaWJ1dGUoYXR0cmlidXRlTmFt
ZSwgdmFsdWUpOwotICB9LAotCi0gIG1hdGVyaWFsaXplUmVsYXRpb25zaGlwczogZnVuY3Rpb24o
cmVjb3JkLCBoYXNoLCBwcmVtYXRlcmlhbGl6ZWQpIHsKLSAgICByZWNvcmQuZWFjaFJlbGF0aW9u
c2hpcChmdW5jdGlvbihuYW1lLCByZWxhdGlvbnNoaXApIHsKLSAgICAgIGlmIChyZWxhdGlvbnNo
aXAua2luZCA9PT0gJ2hhc01hbnknKSB7Ci0gICAgICAgIGlmIChwcmVtYXRlcmlhbGl6ZWQgJiYg
cHJlbWF0ZXJpYWxpemVkLmhhc093blByb3BlcnR5KG5hbWUpKSB7Ci0gICAgICAgICAgcmVjb3Jk
Lm1hdGVyaWFsaXplSGFzTWFueShuYW1lLCBwcmVtYXRlcmlhbGl6ZWRbbmFtZV0pOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgIHRoaXMubWF0ZXJpYWxpemVIYXNNYW55KG5hbWUsIHJlY29y
ZCwgaGFzaCwgcmVsYXRpb25zaGlwLCBwcmVtYXRlcmlhbGl6ZWQpOwotICAgICAgICB9Ci0gICAg
ICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnYmVsb25nc1RvJykgewotICAgICAg
ICBpZiAocHJlbWF0ZXJpYWxpemVkICYmIHByZW1hdGVyaWFsaXplZC5oYXNPd25Qcm9wZXJ0eShu
YW1lKSkgewotICAgICAgICAgIHJlY29yZC5tYXRlcmlhbGl6ZUJlbG9uZ3NUbyhuYW1lLCBwcmVt
YXRlcmlhbGl6ZWRbbmFtZV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMubWF0
ZXJpYWxpemVCZWxvbmdzVG8obmFtZSwgcmVjb3JkLCBoYXNoLCByZWxhdGlvbnNoaXAsIHByZW1h
dGVyaWFsaXplZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9LCB0aGlzKTsKLSAgfSwKLQot
ICBtYXRlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKG5hbWUsIHJlY29yZCwgaGFzaCwgcmVsYXRp
b25zaGlwKSB7Ci0gICAgdmFyIGtleSA9IHRoaXMuX2tleUZvckhhc01hbnkocmVjb3JkLmNvbnN0
cnVjdG9yLCByZWxhdGlvbnNoaXAua2V5KTsKLSAgICByZWNvcmQubWF0ZXJpYWxpemVIYXNNYW55
KG5hbWUsIHRoaXMuZXh0cmFjdEhhc01hbnkocmVjb3JkLmNvbnN0cnVjdG9yLCBoYXNoLCBrZXkp
KTsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUJlbG9uZ3NUbzogZnVuY3Rpb24obmFtZSwgcmVjb3Jk
LCBoYXNoLCByZWxhdGlvbnNoaXApIHsKLSAgICB2YXIga2V5ID0gdGhpcy5fa2V5Rm9yQmVsb25n
c1RvKHJlY29yZC5jb25zdHJ1Y3RvciwgcmVsYXRpb25zaGlwLmtleSk7Ci0gICAgcmVjb3JkLm1h
dGVyaWFsaXplQmVsb25nc1RvKG5hbWUsIHRoaXMuZXh0cmFjdEJlbG9uZ3NUbyhyZWNvcmQuY29u
c3RydWN0b3IsIGhhc2gsIGtleSkpOwotICB9LAotCi0gIF9leHRyYWN0RW1iZWRkZWRSZWxhdGlv
bnNoaXA6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIG5hbWUsIHJlbGF0aW9uc2hpcFR5cGUpIHsKLSAg
ICB2YXIga2V5ID0gdGhpc1snX2tleUZvcicgKyByZWxhdGlvbnNoaXBUeXBlXSh0eXBlLCBuYW1l
KTsKLQotICAgIGlmICh0aGlzLmVtYmVkZGVkVHlwZSh0eXBlLCBuYW1lKSkgewotICAgICAgcmV0
dXJuIHRoaXNbJ2V4dHJhY3RFbWJlZGRlZCcgKyByZWxhdGlvbnNoaXBUeXBlXSh0eXBlLCBoYXNo
LCBrZXkpOwotICAgIH0KLSAgfSwKLQotICBfZXh0cmFjdEVtYmVkZGVkQmVsb25nc1RvOiBmdW5j
dGlvbih0eXBlLCBoYXNoLCBuYW1lKSB7Ci0gICAgcmV0dXJuIHRoaXMuX2V4dHJhY3RFbWJlZGRl
ZFJlbGF0aW9uc2hpcCh0eXBlLCBoYXNoLCBuYW1lLCAnQmVsb25nc1RvJyk7Ci0gIH0sCi0KLSAg
X2V4dHJhY3RFbWJlZGRlZEhhc01hbnk6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIG5hbWUpIHsKLSAg
ICByZXR1cm4gdGhpcy5fZXh0cmFjdEVtYmVkZGVkUmVsYXRpb25zaGlwKHR5cGUsIGhhc2gsIG5h
bWUsICdIYXNNYW55Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMg
bWV0aG9kIGlzIGNhbGxlZCB0byBnZXQgdGhlIHByaW1hcnkga2V5IGZvciBhIGdpdmVuCi0gICAg
dHlwZS4KLQotICAgIElmIGEgcHJpbWFyeSBrZXkgY29uZmlndXJhdGlvbiBleGlzdHMgZm9yIHRo
aXMgdHlwZSwgdGhpcwotICAgIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgY29uZmlndXJlZCB2YWx1
ZS4gT3RoZXJ3aXNlLCBpdCB3aWxsCi0gICAgY2FsbCB0aGUgcHVibGljIGBwcmltYXJ5S2V5YCBo
b29rLgotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZQotICAgIEByZXR1cm5z
IHtTdHJpbmd9IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIHR5cGUKLSAgKi8KLSAgX3ByaW1hcnlL
ZXk6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWd1cmF0aW9u
Rm9yVHlwZSh0eXBlKSwKLSAgICAgICAgcHJpbWFyeUtleSA9IGNvbmZpZyAmJiBjb25maWcucHJp
bWFyeUtleTsKLQotICAgIGlmIChwcmltYXJ5S2V5KSB7Ci0gICAgICByZXR1cm4gcHJpbWFyeUtl
eTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeUtleSh0eXBlKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9kIGxvb2tz
IHVwIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdHJhbnNmb3JtcyB0aGUKLSAg
ICBhdHRyaWJ1dGUncyB2YWx1ZSB1c2luZyByZWdpc3RlcmVkIHRyYW5zZm9ybXMuCi0KLSAgICBT
cGVjaWZpY2FsbHk6Ci0KLSAgICAxLiBMb29rIHVwIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUg
bmFtZS4gSWYgYXZhaWxhYmxlLCB0aGlzIHdpbGwgdXNlCi0gICAgICAgYW55IHJlZ2lzdGVyZWQg
bWFwcGluZ3MuIE90aGVyd2lzZSwgaXQgd2lsbCBpbnZva2UgdGhlIHB1YmxpYwotICAgICAgIGBr
ZXlGb3JBdHRyaWJ1dGVOYW1lYCBob29rLgotICAgIDIuIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUg
cmVjb3JkIHVzaW5nIHRoZSBgYXR0cmlidXRlTmFtZWAuCi0gICAgMy4gVHJhbnNmb3JtIHRoZSB2
YWx1ZSB1c2luZyByZWdpc3RlcmVkIHRyYW5zZm9ybXMgZm9yIHRoZSBgYXR0cmlidXRlVHlwZWAu
Ci0gICAgNC4gSW52b2tlIHRoZSBwdWJsaWMgYGFkZEF0dHJpYnV0ZWAgaG9vayB3aXRoIHRoZSBo
YXNoLCBrZXksIGFuZAotICAgICAgIHRyYW5zZm9ybWVkIHZhbHVlLgotCi0gICAgQHBhcmFtIHth
bnl9IGRhdGEgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gYmVpbmcgYnVpbHQKLSAgICBA
cGFyYW0ge0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxpemUKLSAgICBAcGFy
YW0ge1N0cmluZ30gYXR0cmlidXRlTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIG9uIHRo
ZSByZWNvcmQKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlVHlwZSB0aGUgdHlwZSBvZiB0
aGUgYXR0cmlidXRlIChlLmcuIGBzdHJpbmdgCi0gICAgICBvciBgYm9vbGVhbmApCi0gICovCi0g
IF9hZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGRhdGEsIHJlY29yZCwgYXR0cmlidXRlTmFtZSwgYXR0
cmlidXRlVHlwZSkgewotICAgIHZhciBrZXkgPSB0aGlzLl9rZXlGb3JBdHRyaWJ1dGVOYW1lKHJl
Y29yZC5jb25zdHJ1Y3RvciwgYXR0cmlidXRlTmFtZSk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0KHJl
Y29yZCwgYXR0cmlidXRlTmFtZSk7Ci0KLSAgICB0aGlzLmFkZEF0dHJpYnV0ZShkYXRhLCBrZXks
IHRoaXMuc2VyaWFsaXplVmFsdWUodmFsdWUsIGF0dHJpYnV0ZVR5cGUpKTsKLSAgfSwKLQotICAv
KioKLSAgICBAcHJpdmF0ZQotCi0gICAgVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHByaW1hcnkg
a2V5IGZvciB0aGUgYHR5cGVgIGFuZCBpbnZva2VzCi0gICAgYHNlcmlhbGl6ZUlkYCBvbiB0aGUg
YGlkYC4KLQotICAgIEl0IHRoZW4gaW52b2tlcyB0aGUgcHVibGljIGBhZGRJZGAgaG9vayB3aXRo
IHRoZSBwcmltYXJ5IGtleSBhbmQKLSAgICB0aGUgc2VyaWFsaXplZCBpZC4KLQotICAgIEBwYXJh
bSB7YW55fSBkYXRhIHRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcg
YnVpbHQKLSAgICBAcGFyYW0ge0VtYmVyLk1vZGVsIHN1YmNsYXNzfSB0eXBlCi0gICAgQHBhcmFt
IHthbnl9IGlkIHRoZSBtYXRlcmlhbGl6ZWQgaWQgZnJvbSB0aGUgcmVjb3JkCi0gICovCi0gIF9h
ZGRJZDogZnVuY3Rpb24oaGFzaCwgdHlwZSwgaWQpIHsKLSAgICB2YXIgcHJpbWFyeUtleSA9IHRo
aXMuX3ByaW1hcnlLZXkodHlwZSk7Ci0KLSAgICB0aGlzLmFkZElkKGhhc2gsIHByaW1hcnlLZXks
IHRoaXMuc2VyaWFsaXplSWQoaWQpKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0g
ICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGdldCBhIGtleSB1c2VkIGluIHRoZSBkYXRhIGZy
b20KLSAgICBhbiBhdHRyaWJ1dGUgbmFtZS4gSXQgZmlyc3QgY2hlY2tzIGZvciBhbnkgbWFwcGlu
Z3MgYmVmb3JlCi0gICAgY2FsbGluZyB0aGUgcHVibGljIGhvb2sgYGtleUZvckF0dHJpYnV0ZU5h
bWVgLgotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZSB0aGUgdHlwZSBvZiB0
aGUgcmVjb3JkIHdpdGgKLSAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZSBgbmFtZWAKLSAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUgdG8gY29udmVydCBpbnRvIGEga2V5
Ci0KLSAgICBAcmV0dXJucyB7U3RyaW5nfSB0aGUga2V5Ci0gICovCi0gIF9rZXlGb3JBdHRyaWJ1
dGVOYW1lOiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7Ci0gICAgcmV0dXJuIHRoaXMuX2tleUZyb21N
YXBwaW5nT3JIb29rKCdrZXlGb3JBdHRyaWJ1dGVOYW1lJywgdHlwZSwgbmFtZSk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBnZXQg
YSBrZXkgdXNlZCBpbiB0aGUgZGF0YSBmcm9tCi0gICAgYSBiZWxvbmdzVG8gcmVsYXRpb25zaGlw
LiBJdCBmaXJzdCBjaGVja3MgZm9yIGFueSBtYXBwaW5ncyBiZWZvcmUKLSAgICBjYWxsaW5nIHRo
ZSBwdWJsaWMgaG9vayBga2V5Rm9yQmVsb25nc1RvYC4KLQotICAgIEBwYXJhbSB7RFMuTW9kZWwg
c3ViY2xhc3N9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlY29yZCB3aXRoCi0gICAgICB0aGUgYGJl
bG9uZ3NUb2AgcmVsYXRpb25zaGlwLgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxh
dGlvbnNoaXAgbmFtZSB0byBjb252ZXJ0IGludG8gYSBrZXkKLQotICAgIEByZXR1cm5zIHtTdHJp
bmd9IHRoZSBrZXkKLSAgKi8KLSAgX2tleUZvckJlbG9uZ3NUbzogZnVuY3Rpb24odHlwZSwgbmFt
ZSkgewotICAgIHJldHVybiB0aGlzLl9rZXlGcm9tTWFwcGluZ09ySG9vaygna2V5Rm9yQmVsb25n
c1RvJywgdHlwZSwgbmFtZSk7Ci0gIH0sCi0KLSAga2V5Rm9yOiBmdW5jdGlvbihkZXNjcmlwdGlv
bikgewotICAgIHZhciB0eXBlID0gZGVzY3JpcHRpb24ucGFyZW50VHlwZSwKLSAgICAgICAgbmFt
ZSA9IGRlc2NyaXB0aW9uLmtleTsKLQotICAgIHN3aXRjaCAoZGVzY3JpcHRpb24ua2luZCkgewot
ICAgICAgY2FzZSAnYmVsb25nc1RvJzoKLSAgICAgICAgcmV0dXJuIHRoaXMuX2tleUZvckJlbG9u
Z3NUbyh0eXBlLCBuYW1lKTsKLSAgICAgIGNhc2UgJ2hhc01hbnknOgotICAgICAgICByZXR1cm4g
dGhpcy5fa2V5Rm9ySGFzTWFueSh0eXBlLCBuYW1lKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBnZXQgYSBrZXkgdXNl
ZCBpbiB0aGUgZGF0YSBmcm9tCi0gICAgYSBoYXNNYW55IHJlbGF0aW9uc2hpcC4gSXQgZmlyc3Qg
Y2hlY2tzIGZvciBhbnkgbWFwcGluZ3MgYmVmb3JlCi0gICAgY2FsbGluZyB0aGUgcHVibGljIGhv
b2sgYGtleUZvckhhc01hbnlgLgotCi0gICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlw
ZSB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHdpdGgKLSAgICAgIHRoZSBgaGFzTWFueWAgcmVsYXRp
b25zaGlwLgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGlvbnNoaXAgbmFtZSB0
byBjb252ZXJ0IGludG8gYSBrZXkKLQotICAgIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkKLSAg
Ki8KLSAgX2tleUZvckhhc01hbnk6IGZ1bmN0aW9uKHR5cGUsIG5hbWUpIHsKLSAgICByZXR1cm4g
dGhpcy5fa2V5RnJvbU1hcHBpbmdPckhvb2soJ2tleUZvckhhc01hbnknLCB0eXBlLCBuYW1lKTsK
LSAgfSwKLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRo
ZSByZWxhdGlvbnNoaXAgbmFtZSB0byBhIGtleSBmb3Igc2VyaWFsaXphdGlvbiwKLSAgICBhbmQg
dGhlbiBpbnZva2VzIHRoZSBwdWJsaWMgYGFkZEJlbG9uZ3NUb2AgaG9vay4KLQotICAgIEBwYXJh
bSB7YW55fSBkYXRhIHRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcg
YnVpbHQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxp
emUKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgcmVsYXRpb25zaGlwIG5hbWUKLSAgICBA
cGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJl
bGF0aW9uc2hpcAotICAqLwotICBfYWRkQmVsb25nc1RvOiBmdW5jdGlvbihkYXRhLCByZWNvcmQs
IG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBrZXkgPSB0aGlzLl9rZXlGb3JCZWxvbmdz
VG8ocmVjb3JkLmNvbnN0cnVjdG9yLCBuYW1lKTsKLSAgICB0aGlzLmFkZEJlbG9uZ3NUbyhkYXRh
LCByZWNvcmQsIGtleSwgcmVsYXRpb25zaGlwKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0
ZQotCi0gICAgVGhpcyBtZXRob2QgY29udmVydHMgdGhlIHJlbGF0aW9uc2hpcCBuYW1lIHRvIGEg
a2V5IGZvciBzZXJpYWxpemF0aW9uLAotICAgIGFuZCB0aGVuIGludm9rZXMgdGhlIHB1YmxpYyBg
YWRkSGFzTWFueWAgaG9vay4KLQotICAgIEBwYXJhbSB7YW55fSBkYXRhIHRoZSBzZXJpYWxpemVk
IHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQKLSAgICBAcGFyYW0ge0RTLk1vZGVs
fSByZWNvcmQgdGhlIHJlY29yZCB0byBzZXJpYWxpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgcmVsYXRpb25zaGlwIG5hbWUKLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlw
IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbGF0aW9uc2hpcAotICAqLwotICBfYWRkSGFz
TWFueTogZnVuY3Rpb24oZGF0YSwgcmVjb3JkLCBuYW1lLCByZWxhdGlvbnNoaXApIHsKLSAgICB2
YXIga2V5ID0gdGhpcy5fa2V5Rm9ySGFzTWFueShyZWNvcmQuY29uc3RydWN0b3IsIG5hbWUpOwot
ICAgIHRoaXMuYWRkSGFzTWFueShkYXRhLCByZWNvcmQsIGtleSwgcmVsYXRpb25zaGlwKTsKLSAg
fSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQW4gaW50ZXJuYWwgbWV0aG9kIHRoYXQg
aGFuZGxlcyBjaGVja2luZyB3aGV0aGVyIGEgbWFwcGluZwotICAgIGV4aXN0cyBmb3IgYSBwYXJ0
aWN1bGFyIGF0dHJpYnV0ZSBvciByZWxhdGlvbnNoaXAgbmFtZSBiZWZvcmUKLSAgICBjYWxsaW5n
IHRoZSBwdWJsaWMgaG9va3MuCi0KLSAgICBJZiBhIG1hcHBpbmcgaXMgZm91bmQsIGFuZCB0aGUg
bWFwcGluZyBoYXMgYSBrZXkgZGVmaW5lZCwKLSAgICB1c2UgdGhhdCBpbnN0ZWFkIG9mIGludm9r
aW5nIHRoZSBob29rLgotCi0gICAgQHBhcmFtIHtTdHJpbmd9IHB1YmxpY01ldGhvZCB0aGUgcHVi
bGljIGhvb2sgdG8gaW52b2tlIGlmCi0gICAgICBhIG1hcHBpbmcgaXMgbm90IGZvdW5kIChlLmcu
IGBrZXlGb3JBdHRyaWJ1dGVOYW1lYCkKLSAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNzfSB0
eXBlIHRoZSB0eXBlIG9mIHRoZSByZWNvcmQgd2l0aAotICAgICAgdGhlIGF0dHJpYnV0ZSBvciBy
ZWxhdGlvbnNoaXAgbmFtZS4KLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgYXR0cmlidXRl
IG9yIHJlbGF0aW9uc2hpcCBuYW1lIHRvCi0gICAgICBjb252ZXJ0IGludG8gYSBrZXkKLSAgKi8K
LSAgX2tleUZyb21NYXBwaW5nT3JIb29rOiBmdW5jdGlvbihwdWJsaWNNZXRob2QsIHR5cGUsIG5h
bWUpIHsKLSAgICB2YXIga2V5ID0gdGhpcy5tYXBwaW5nT3B0aW9uKHR5cGUsIG5hbWUsICdrZXkn
KTsKLQotICAgIGlmIChrZXkpIHsKLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIHJldHVybiB0aGlzW3B1YmxpY01ldGhvZF0odHlwZSwgbmFtZSk7Ci0gICAgfQotICB9LAot
Ci0gIC8qKgotICAgIFRSQU5TRk9STVMKLSAgKi8KLQotICByZWdpc3RlclRyYW5zZm9ybTogZnVu
Y3Rpb24odHlwZSwgdHJhbnNmb3JtKSB7Ci0gICAgdGhpcy50cmFuc2Zvcm1zW3R5cGVdID0gdHJh
bnNmb3JtOwotICB9LAotCi0gIHJlZ2lzdGVyRW51bVRyYW5zZm9ybTogZnVuY3Rpb24odHlwZSwg
b2JqZWN0cykgewotICAgIHZhciB0cmFuc2Zvcm0gPSB7Ci0gICAgICBkZXNlcmlhbGl6ZTogZnVu
Y3Rpb24oZGVzZXJpYWxpemVkKSB7Ci0gICAgICAgIHJldHVybiBFbWJlci5BKG9iamVjdHMpLm9i
amVjdEF0KGRlc2VyaWFsaXplZCk7Ci0gICAgICB9LAotICAgICAgc2VyaWFsaXplOiBmdW5jdGlv
bihzZXJpYWxpemVkKSB7Ci0gICAgICAgIHJldHVybiBFbWJlci5FbnVtZXJhYmxlVXRpbHMuaW5k
ZXhPZihvYmplY3RzLCBzZXJpYWxpemVkKTsKLSAgICAgIH0sCi0gICAgICB2YWx1ZXM6IG9iamVj
dHMKLSAgICB9OwotICAgIHRoaXMucmVnaXN0ZXJUcmFuc2Zvcm0odHlwZSwgdHJhbnNmb3JtKTsK
LSAgfSwKLQotICAvKioKLSAgICBNQVBQSU5HIENPTlZFTklFTkNFCi0gICovCi0KLSAgbWFwOiBm
dW5jdGlvbih0eXBlLCBtYXBwaW5ncykgewotICAgIHRoaXMubWFwcGluZ3Muc2V0KHR5cGUsIG1h
cHBpbmdzKTsKLSAgfSwKLQotICBjb25maWd1cmU6IGZ1bmN0aW9uKHR5cGUsIGNvbmZpZ3VyYXRp
b24pIHsKLSAgICBpZiAodHlwZSAmJiAhY29uZmlndXJhdGlvbikgewotICAgICAgRW1iZXIubWVy
Z2UodGhpcy5nbG9iYWxDb25maWd1cmF0aW9ucywgdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgdmFyIGNvbmZpZyA9IEVtYmVyLmNyZWF0ZSh0aGlzLmdsb2JhbENvbmZpZ3VyYXRp
b25zKTsKLSAgICBFbWJlci5tZXJnZShjb25maWcsIGNvbmZpZ3VyYXRpb24pOwotCi0gICAgdGhp
cy5jb25maWd1cmF0aW9ucy5zZXQodHlwZSwgY29uZmlnKTsKLSAgfSwKLQotICBtYXBwaW5nRm9y
VHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHRoaXMuX3JlaWZ5TWFwcGluZ3MoKTsKLSAgICBy
ZXR1cm4gdGhpcy5tYXBwaW5ncy5nZXQodHlwZSkgfHwge307Ci0gIH0sCi0KLSAgY29uZmlndXJh
dGlvbkZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB0aGlzLl9yZWlmeUNvbmZpZ3VyYXRp
b25zKCk7Ci0gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbnMuZ2V0KHR5cGUpIHx8IHRoaXMu
Z2xvYmFsQ29uZmlndXJhdGlvbnM7Ci0gIH0sCi0KLSAgX3JlaWZ5TWFwcGluZ3M6IGZ1bmN0aW9u
KCkgewotICAgIGlmICh0aGlzLl9kaWRSZWlmeU1hcHBpbmdzKSB7IHJldHVybjsgfQotCi0gICAg
dmFyIG1hcHBpbmdzID0gdGhpcy5tYXBwaW5ncywKLSAgICAgICAgcmVpZmllZE1hcHBpbmdzID0g
RW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0gICAgbWFwcGluZ3MuZm9yRWFjaChmdW5jdGlvbihrZXks
IG1hcHBpbmcpIHsKLSAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykgewotICAgICAg
ICB2YXIgdHlwZSA9IEVtYmVyLmdldChFbWJlci5sb29rdXAsIGtleSk7Ci0gICAgICAgIEVtYmVy
LmFzc2VydCgiQ291bGQgbm90IGZpbmQgbW9kZWwgYXQgcGF0aCAiICsga2V5LCB0eXBlKTsKLQot
ICAgICAgICByZWlmaWVkTWFwcGluZ3Muc2V0KHR5cGUsIG1hcHBpbmcpOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgcmVpZmllZE1hcHBpbmdzLnNldChrZXksIG1hcHBpbmcpOwotICAgICAgfQot
ICAgIH0pOwotCi0gICAgdGhpcy5tYXBwaW5ncyA9IHJlaWZpZWRNYXBwaW5nczsKLQotICAgIHRo
aXMuX2RpZFJlaWZ5TWFwcGluZ3MgPSB0cnVlOwotICB9LAotCi0gIF9yZWlmeUNvbmZpZ3VyYXRp
b25zOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5fZGlkUmVpZnlDb25maWd1cmF0aW9ucykg
eyByZXR1cm47IH0KLQotICAgIHZhciBjb25maWd1cmF0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlv
bnMsCi0gICAgICAgIHJlaWZpZWRDb25maWd1cmF0aW9ucyA9IEVtYmVyLk1hcC5jcmVhdGUoKTsK
LQotICAgIGNvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oa2V5LCBtYXBwaW5nKSB7Ci0g
ICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5ICE9PSAncGx1cmFscycpIHsK
LSAgICAgICAgdmFyIHR5cGUgPSBFbWJlci5nZXQoRW1iZXIubG9va3VwLCBrZXkpOwotICAgICAg
ICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIG1vZGVsIGF0IHBhdGggIiArIGtleSwgdHlw
ZSk7Ci0KLSAgICAgICAgcmVpZmllZENvbmZpZ3VyYXRpb25zLnNldCh0eXBlLCBtYXBwaW5nKTsK
LSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaWZpZWRDb25maWd1cmF0aW9ucy5zZXQoa2V5LCBt
YXBwaW5nKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHRoaXMuY29uZmlndXJhdGlvbnMgPSBy
ZWlmaWVkQ29uZmlndXJhdGlvbnM7Ci0KLSAgICB0aGlzLl9kaWRSZWlmeUNvbmZpZ3VyYXRpb25z
ID0gdHJ1ZTsKLSAgfSwKLQotICBtYXBwaW5nT3B0aW9uOiBmdW5jdGlvbih0eXBlLCBuYW1lLCBv
cHRpb24pIHsKLSAgICB2YXIgbWFwcGluZyA9IHRoaXMubWFwcGluZ0ZvclR5cGUodHlwZSlbbmFt
ZV07Ci0KLSAgICByZXR1cm4gbWFwcGluZyAmJiBtYXBwaW5nW29wdGlvbl07Ci0gIH0sCi0KLSAg
Y29uZmlnT3B0aW9uOiBmdW5jdGlvbih0eXBlLCBvcHRpb24pIHsKLSAgICB2YXIgY29uZmlnID0g
dGhpcy5jb25maWd1cmF0aW9uRm9yVHlwZSh0eXBlKTsKLQotICAgIHJldHVybiBjb25maWdbb3B0
aW9uXTsKLSAgfSwKLQotICAvLyBFTUJFRERFRCBIRUxQRVJTCi0KLSAgZW1iZWRkZWRUeXBlOiBm
dW5jdGlvbih0eXBlLCBuYW1lKSB7Ci0gICAgcmV0dXJuIHRoaXMubWFwcGluZ09wdGlvbih0eXBl
LCBuYW1lLCAnZW1iZWRkZWQnKTsKLSAgfSwKLQotICBlYWNoRW1iZWRkZWRSZWNvcmQ6IGZ1bmN0
aW9uKHJlY29yZCwgY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB0aGlzLmVhY2hFbWJlZGRlZEJl
bG9uZ3NUb1JlY29yZChyZWNvcmQsIGNhbGxiYWNrLCBiaW5kaW5nKTsKLSAgICB0aGlzLmVhY2hF
bWJlZGRlZEhhc01hbnlSZWNvcmQocmVjb3JkLCBjYWxsYmFjaywgYmluZGluZyk7Ci0gIH0sCi0K
LSAgZWFjaEVtYmVkZGVkQmVsb25nc1RvUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIGNhbGxiYWNr
LCBiaW5kaW5nKSB7Ci0gICAgdmFyIHR5cGUgPSByZWNvcmQuY29uc3RydWN0b3I7Ci0KLSAgICB0
aGlzLmVhY2hFbWJlZGRlZEJlbG9uZ3NUbyhyZWNvcmQuY29uc3RydWN0b3IsIGZ1bmN0aW9uKG5h
bWUsIHJlbGF0aW9uc2hpcCwgZW1iZWRkZWRUeXBlKSB7Ci0gICAgICB2YXIgZW1iZWRkZWRSZWNv
cmQgPSBnZXQocmVjb3JkLCBuYW1lKTsKLSAgICAgIGlmIChlbWJlZGRlZFJlY29yZCkgeyBjYWxs
YmFjay5jYWxsKGJpbmRpbmcsIGVtYmVkZGVkUmVjb3JkLCBlbWJlZGRlZFR5cGUpOyB9Ci0gICAg
fSk7Ci0gIH0sCi0KLSAgZWFjaEVtYmVkZGVkSGFzTWFueVJlY29yZDogZnVuY3Rpb24ocmVjb3Jk
LCBjYWxsYmFjaywgYmluZGluZykgewotICAgIHZhciB0eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9y
OwotCi0gICAgdGhpcy5lYWNoRW1iZWRkZWRIYXNNYW55KHJlY29yZC5jb25zdHJ1Y3RvciwgZnVu
Y3Rpb24obmFtZSwgcmVsYXRpb25zaGlwLCBlbWJlZGRlZFR5cGUpIHsKLSAgICAgIHZhciBhcnJh
eSA9IGdldChyZWNvcmQsIG5hbWUpOwotICAgICAgZm9yICh2YXIgaT0wLCBsPWdldChhcnJheSwg
J2xlbmd0aCcpOyBpPGw7IGkrKykgewotICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIGFy
cmF5Lm9iamVjdEF0KGkpLCBlbWJlZGRlZFR5cGUpOwotICAgICAgfQotICAgIH0pOwotICB9LAot
Ci0gIGVhY2hFbWJlZGRlZEhhc01hbnk6IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBiaW5kaW5n
KSB7Ci0gICAgdGhpcy5lYWNoRW1iZWRkZWRSZWxhdGlvbnNoaXAodHlwZSwgJ2hhc01hbnknLCBj
YWxsYmFjaywgYmluZGluZyk7Ci0gIH0sCi0KLSAgZWFjaEVtYmVkZGVkQmVsb25nc1RvOiBmdW5j
dGlvbih0eXBlLCBjYWxsYmFjaywgYmluZGluZykgewotICAgIHRoaXMuZWFjaEVtYmVkZGVkUmVs
YXRpb25zaGlwKHR5cGUsICdiZWxvbmdzVG8nLCBjYWxsYmFjaywgYmluZGluZyk7Ci0gIH0sCi0K
LSAgZWFjaEVtYmVkZGVkUmVsYXRpb25zaGlwOiBmdW5jdGlvbih0eXBlLCBraW5kLCBjYWxsYmFj
aywgYmluZGluZykgewotICAgIHR5cGUuZWFjaFJlbGF0aW9uc2hpcChmdW5jdGlvbihuYW1lLCBy
ZWxhdGlvbnNoaXApIHsKLSAgICAgIHZhciBlbWJlZGRlZFR5cGUgPSB0aGlzLmVtYmVkZGVkVHlw
ZSh0eXBlLCBuYW1lKTsKLQotICAgICAgaWYgKGVtYmVkZGVkVHlwZSkgewotICAgICAgICBpZiAo
cmVsYXRpb25zaGlwLmtpbmQgPT09IGtpbmQpIHsKLSAgICAgICAgICBjYWxsYmFjay5jYWxsKGJp
bmRpbmcsIG5hbWUsIHJlbGF0aW9uc2hpcCwgZW1iZWRkZWRUeXBlKTsKLSAgICAgICAgfQotICAg
ICAgfQotICAgIH0sIHRoaXMpOwotICB9Ci19KTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotdmFyIG5vbmUgPSBFbWJlci5pc05vbmU7Ci0KLS8qKgotICBEUy5UcmFuc2Zvcm1zIGlz
IGEgaGFzaCBvZiB0cmFuc2Zvcm1zIHVzZWQgYnkgRFMuU2VyaWFsaXplci4KLSovCi1EUy5KU09O
VHJhbnNmb3JtcyA9IHsKLSAgc3RyaW5nOiB7Ci0gICAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNl
cmlhbGl6ZWQpIHsKLSAgICAgIHJldHVybiBub25lKHNlcmlhbGl6ZWQpID8gbnVsbCA6IFN0cmlu
ZyhzZXJpYWxpemVkKTsKLSAgICB9LAotCi0gICAgc2VyaWFsaXplOiBmdW5jdGlvbihkZXNlcmlh
bGl6ZWQpIHsKLSAgICAgIHJldHVybiBub25lKGRlc2VyaWFsaXplZCkgPyBudWxsIDogU3RyaW5n
KGRlc2VyaWFsaXplZCk7Ci0gICAgfQotICB9LAotCi0gIG51bWJlcjogewotICAgIGRlc2VyaWFs
aXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7Ci0gICAgICByZXR1cm4gbm9uZShzZXJpYWxpemVk
KSA/IG51bGwgOiBOdW1iZXIoc2VyaWFsaXplZCk7Ci0gICAgfSwKLQotICAgIHNlcmlhbGl6ZTog
ZnVuY3Rpb24oZGVzZXJpYWxpemVkKSB7Ci0gICAgICByZXR1cm4gbm9uZShkZXNlcmlhbGl6ZWQp
ID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICAgIH0KLSAgfSwKLQotICAvLyBIYW5k
bGVzIHRoZSBmb2xsb3dpbmcgYm9vbGVhbiBpbnB1dHM6Ci0gIC8vICJUclVlIiwgInQiLCAiZiIs
ICJGQUxTRSIsIDAsIChub24temVybyksIG9yIGJvb2xlYW4gdHJ1ZS9mYWxzZQotICAnYm9vbGVh
bic6IHsKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgewotICAgICAgdmFy
IHR5cGUgPSB0eXBlb2Ygc2VyaWFsaXplZDsKLQotICAgICAgaWYgKHR5cGUgPT09ICJib29sZWFu
IikgewotICAgICAgICByZXR1cm4gc2VyaWFsaXplZDsKLSAgICAgIH0gZWxzZSBpZiAodHlwZSA9
PT0gInN0cmluZyIpIHsKLSAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQubWF0Y2goL150cnVlJHxe
dCR8XjEkL2kpICE9PSBudWxsOwotICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAibnVtYmVyIikg
ewotICAgICAgICByZXR1cm4gc2VyaWFsaXplZCA9PT0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgc2VyaWFsaXplOiBmdW5j
dGlvbihkZXNlcmlhbGl6ZWQpIHsKLSAgICAgIHJldHVybiBCb29sZWFuKGRlc2VyaWFsaXplZCk7
Ci0gICAgfQotICB9LAotCi0gIGRhdGU6IHsKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2Vy
aWFsaXplZCkgewotICAgICAgdmFyIHR5cGUgPSB0eXBlb2Ygc2VyaWFsaXplZDsKLSAgICAgIHZh
ciBkYXRlID0gbnVsbDsKLQotICAgICAgaWYgKHR5cGUgPT09ICJzdHJpbmciIHx8IHR5cGUgPT09
ICJudW1iZXIiKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgYSBmaXggZm9yIFNhZmFyaSA1LjEuNSBv
biBNYWMgd2hpY2ggZG9lcyBub3QgYWNjZXB0IHRpbWVzdGFtcHMgYXMgeXl5eS1tbS1kZAotICAg
ICAgICBpZiAodHlwZSA9PT0gInN0cmluZyIgJiYgc2VyaWFsaXplZC5zZWFyY2goL15cZHs0fS1c
ZHsyfS1cZHsyfSQvKSAhPT0gLTEpIHsKLSAgICAgICAgICBzZXJpYWxpemVkICs9ICJUMDA6MDA6
MDBaIjsKLSAgICAgICAgfQotCi0gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShzZXJpYWxpemVkKTsK
LQotICAgICAgICAvLyB0aGlzIGlzIGEgZml4IGZvciBJRTggd2hpY2ggZG9lcyBub3QgYWNjZXB0
IHRpbWVzdGFtcHMgaW4gSVNPIDg2MDEgZm9ybWF0Ci0gICAgICAgIGlmICh0eXBlID09PSAic3Ry
aW5nIiAmJiBpc05hTihkYXRlKSkgewotICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLnBh
cnNlKHNlcmlhbGl6ZWQucmVwbGFjZSgvXC0vaWcsICcvJykucmVwbGFjZSgvWiQvLCAnJykuc3Bs
aXQoJy4nKVswXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgICB9
IGVsc2UgaWYgKHNlcmlhbGl6ZWQgPT09IG51bGwgfHwgc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVk
KSB7Ci0gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGF0YSwK
LSAgICAgICAgLy8gcmV0dXJuIHVuZGVmaW5lZCwgbm90IG51bGwuCi0gICAgICAgIHJldHVybiBz
ZXJpYWxpemVkOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9
Ci0gICAgfSwKLQotICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGF0ZSkgewotICAgICAgaWYgKGRh
dGUgaW5zdGFuY2VvZiBEYXRlKSB7Ci0gICAgICAgIHZhciBkYXlzID0gWyJTdW4iLCAiTW9uIiwg
IlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXTsKLSAgICAgICAgdmFyIG1vbnRocyA9
IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIs
ICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXTsKLQotICAgICAgICB2YXIgcGFkID0gZnVuY3Rp
b24obnVtKSB7Ci0gICAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gIjAiK251bSA6ICIiK251bTsK
LSAgICAgICAgfTsKLQotICAgICAgICB2YXIgdXRjWWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIo
KSwKLSAgICAgICAgICAgIHV0Y01vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpLAotICAgICAgICAg
ICAgdXRjRGF5T2ZNb250aCA9IGRhdGUuZ2V0VVRDRGF0ZSgpLAotICAgICAgICAgICAgdXRjRGF5
ID0gZGF0ZS5nZXRVVENEYXkoKSwKLSAgICAgICAgICAgIHV0Y0hvdXJzID0gZGF0ZS5nZXRVVENI
b3VycygpLAotICAgICAgICAgICAgdXRjTWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLAot
ICAgICAgICAgICAgdXRjU2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpOwotCi0KLSAgICAg
ICAgdmFyIGRheU9mV2VlayA9IGRheXNbdXRjRGF5XTsKLSAgICAgICAgdmFyIGRheU9mTW9udGgg
PSBwYWQodXRjRGF5T2ZNb250aCk7Ci0gICAgICAgIHZhciBtb250aCA9IG1vbnRoc1t1dGNNb250
aF07Ci0KLSAgICAgICAgcmV0dXJuIGRheU9mV2VlayArICIsICIgKyBkYXlPZk1vbnRoICsgIiAi
ICsgbW9udGggKyAiICIgKyB1dGNZZWFyICsgIiAiICsKLSAgICAgICAgICAgICAgIHBhZCh1dGNI
b3VycykgKyAiOiIgKyBwYWQodXRjTWludXRlcykgKyAiOiIgKyBwYWQodXRjU2Vjb25kcykgKyAi
IEdNVCI7Ci0gICAgICB9IGVsc2UgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCkgewotICAgICAgICBy
ZXR1cm4gdW5kZWZpbmVkOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0g
ICAgICB9Ci0gICAgfQotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFy
IGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIgZ2VuZXJhdGVkSWQgPSAw
OwotCi1EUy5KU09OU2VyaWFsaXplciA9IERTLlNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgaW5pdDog
ZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLQotICAgIGlmICghZ2V0KHRoaXMsICd0
cmFuc2Zvcm1zJykpIHsKLSAgICAgIHRoaXMuc2V0KCd0cmFuc2Zvcm1zJywgRFMuSlNPTlRyYW5z
Zm9ybXMpOwotICAgIH0KLQotICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nID0gRW1iZXIuTWFwLmNy
ZWF0ZSgpOwotCi0gICAgdGhpcy5jb25maWd1cmUoewotICAgICAgbWV0YTogJ21ldGEnLAotICAg
ICAgc2luY2U6ICdzaW5jZScKLSAgICB9KTsKLSAgfSwKLQotICBjb25maWd1cmU6IGZ1bmN0aW9u
KHR5cGUsIGNvbmZpZ3VyYXRpb24pIHsKLSAgICBpZiAodHlwZSAmJiAhY29uZmlndXJhdGlvbikg
ewotICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHR5cGUpOwotICAgIH0KLQotICAgIHZhciBzaWRl
bG9hZEFzID0gY29uZmlndXJhdGlvbi5zaWRlbG9hZEFzOwotCi0gICAgaWYgKHNpZGVsb2FkQXMp
IHsKLSAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLnNldChzaWRlbG9hZEFzLCB0eXBlKTsKLQot
ICAgICAgLy8gU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgbWFwcGluZ3MgbWF5IG5lZWQgdG8g
YmUgbm9ybWFsaXplZAotICAgICAgLy8gKGkuZS4gY29udmVydGVkIGZyb20gc3RyaW5ncyAtPiB0
eXBlcykgYmVmb3JlIHNpZGVsb2FkaW5nLgotICAgICAgLy8gV2UgY2FuJ3QgZG8gdGhpcyBjb252
ZXJzaW9uIGltbWVkaWF0ZWx5IGhlcmUsIGJlY2F1c2UgYGNvbmZpZ3VyZWAKLSAgICAgIC8vIG1h
eSBiZSBjYWxsZWQgYmVmb3JlIGNlcnRhaW4gdHlwZXMgaGF2ZSBiZWVuIGRlZmluZWQuCi0gICAg
ICB0aGlzLnNpZGVsb2FkTWFwcGluZy5ub3JtYWxpemVkID0gZmFsc2U7Ci0KLSAgICAgIGRlbGV0
ZSBjb25maWd1cmF0aW9uLnNpZGVsb2FkQXM7Ci0gICAgfQotCi0gICAgdGhpcy5fc3VwZXIuYXBw
bHkodGhpcywgYXJndW1lbnRzKTsKLSAgfSwKLQotICBhZGRJZDogZnVuY3Rpb24oZGF0YSwga2V5
LCBpZCkgewotICAgIGRhdGFba2V5XSA9IGlkOwotICB9LAotCi0gIC8qKgotICAgIEEgaG9vayB5
b3UgY2FuIHVzZSB0byBjdXN0b21pemUgaG93IHRoZSBrZXkvdmFsdWUgcGFpciBpcyBhZGRlZCB0
bwotICAgIHRoZSBzZXJpYWxpemVkIGRhdGEuCi0KLSAgICBAcGFyYW0ge2FueX0gaGFzaCB0aGUg
SlNPTiBoYXNoIGJlaW5nIGJ1aWx0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IHRv
IGFkZCB0byB0aGUgc2VyaWFsaXplZCBkYXRhCi0gICAgQHBhcmFtIHthbnl9IHZhbHVlIHRoZSB2
YWx1ZSB0byBhZGQgdG8gdGhlIHNlcmlhbGl6ZWQgZGF0YQotICAqLwotICBhZGRBdHRyaWJ1dGU6
IGZ1bmN0aW9uKGhhc2gsIGtleSwgdmFsdWUpIHsKLSAgICBoYXNoW2tleV0gPSB2YWx1ZTsKLSAg
fSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQ3JlYXRlcyBhbiBlbXB0eSBoYXNoIHRo
YXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGhvb2tzIGNhbGxlZCBmcm9tIHRoZQotICAgIGBz
ZXJpYWxpemUoKWAgbWV0aG9kLgotCi0gICAgQHJldHVybiB7T2JqZWN0fQotICAqLwotICBjcmVh
dGVTZXJpYWxpemVkRm9ybTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHt9OwotICB9LAotCi0g
IGV4dHJhY3RBdHRyaWJ1dGU6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIGF0dHJpYnV0ZU5hbWUpIHsK
LSAgICB2YXIga2V5ID0gdGhpcy5fa2V5Rm9yQXR0cmlidXRlTmFtZSh0eXBlLCBhdHRyaWJ1dGVO
YW1lKTsKLSAgICByZXR1cm4gaGFzaFtrZXldOwotICB9LAotCi0gIGV4dHJhY3RJZDogZnVuY3Rp
b24odHlwZSwgaGFzaCkgewotICAgIHZhciBwcmltYXJ5S2V5ID0gdGhpcy5fcHJpbWFyeUtleSh0
eXBlKTsKLQotICAgIGlmIChoYXNoLmhhc093blByb3BlcnR5KHByaW1hcnlLZXkpKSB7Ci0gICAg
ICAvLyBFbnN1cmUgdGhhdCB3ZSBjb2VyY2UgSURzIHRvIHN0cmluZ3Mgc28gdGhhdCByZWNvcmQK
LSAgICAgIC8vIElEcyByZW1haW4gY29uc2lzdGVudCBiZXR3ZWVuIGFwcGxpY2F0aW9uIHJ1bnM7
IGVzcGVjaWFsbHkKLSAgICAgIC8vIGlmIHRoZSBJRCBpcyBzZXJpYWxpemVkIGFuZCBsYXRlciBk
ZXNlcmlhbGl6ZWQgZnJvbSB0aGUgVVJMLAotICAgICAgLy8gd2hlbiB0eXBlIGluZm9ybWF0aW9u
IHdpbGwgaGF2ZSBiZWVuIGxvc3QuCi0gICAgICByZXR1cm4gaGFzaFtwcmltYXJ5S2V5XSsnJzsK
LSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9LAotCi0gIGV4dHJh
Y3RIYXNNYW55OiBmdW5jdGlvbih0eXBlLCBoYXNoLCBrZXkpIHsKLSAgICByZXR1cm4gaGFzaFtr
ZXldOwotICB9LAotCi0gIGV4dHJhY3RCZWxvbmdzVG86IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIGtl
eSkgewotICAgIHJldHVybiBoYXNoW2tleV07Ci0gIH0sCi0KLSAgYWRkQmVsb25nc1RvOiBmdW5j
dGlvbihoYXNoLCByZWNvcmQsIGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIHR5cGUgPSBy
ZWNvcmQuY29uc3RydWN0b3IsCi0gICAgICAgIG5hbWUgPSByZWxhdGlvbnNoaXAua2V5LAotICAg
ICAgICB2YWx1ZSA9IG51bGwsCi0gICAgICAgIGVtYmVkZGVkQ2hpbGQ7Ci0KLSAgICBpZiAodGhp
cy5lbWJlZGRlZFR5cGUodHlwZSwgbmFtZSkpIHsKLSAgICAgIGlmIChlbWJlZGRlZENoaWxkID0g
Z2V0KHJlY29yZCwgbmFtZSkpIHsKLSAgICAgICAgdmFsdWUgPSB0aGlzLnNlcmlhbGl6ZShlbWJl
ZGRlZENoaWxkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KTsKLSAgICAgIH0KLQotICAgICAgaGFzaFtr
ZXldID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhciBpZCA9IGdldChyZWNvcmQsIHJl
bGF0aW9uc2hpcC5rZXkrJy5pZCcpOwotICAgICAgaWYgKCFFbWJlci5pc05vbmUoaWQpKSB7IGhh
c2hba2V5XSA9IGlkOyB9Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYSBoYXMtbWFu
eSByZWxhdGlvbnNoaXAgdG8gdGhlIEpTT04gaGFzaCBiZWluZyBidWlsdC4KLQotICAgIFRoZSBk
ZWZhdWx0IFJFU1Qgc2VtYW50aWNzIGFyZSB0byBvbmx5IGFkZCBhIGhhcy1tYW55IHJlbGF0aW9u
c2hpcCBpZiBpdAotICAgIGlzIGVtYmVkZGVkLiBJZiB0aGUgcmVsYXRpb25zaGlwIHdhcyBpbml0
aWFsbHkgbG9hZGVkIGJ5IElELCB3ZSBhc3N1bWUgdGhhdAotICAgIHRoYXQgd2FzIGRvbmUgYXMg
YSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIGFuZCB0aGF0IGNoYW5nZXMgdG8gdGhlCi0gICAg
aGFzLW1hbnkgc2hvdWxkIGJlIHNhdmVkIGFzIGZvcmVpZ24ga2V5IGNoYW5nZXMgb24gdGhlIGNo
aWxkJ3MgYmVsb25ncy10bwotICAgIHJlbGF0aW9uc2hpcC4KLQotICAgIEBwYXJhbSB7T2JqZWN0
fSBoYXNoIHRoZSBKU09OIGJlaW5nIGJ1aWx0Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
IHRoZSByZWNvcmQgYmVpbmcgc2VyaWFsaXplZAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhl
IEpTT04ga2V5IGludG8gd2hpY2ggdGhlIHNlcmlhbGl6ZWQgcmVsYXRpb25zaGlwCi0gICAgICBz
aG91bGQgYmUgc2F2ZWQKLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwIG1ldGFkYXRh
IGFib3V0IHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgc2VyaWFsaXplZAotICAqLwotICBhZGRIYXNN
YW55OiBmdW5jdGlvbihoYXNoLCByZWNvcmQsIGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFy
IHR5cGUgPSByZWNvcmQuY29uc3RydWN0b3IsCi0gICAgICAgIG5hbWUgPSByZWxhdGlvbnNoaXAu
a2V5LAotICAgICAgICBzZXJpYWxpemVkSGFzTWFueSA9IFtdLAotICAgICAgICBtYW55QXJyYXks
IGVtYmVkZGVkVHlwZTsKLQotICAgIC8vIElmIHRoZSBoYXMtbWFueSBpcyBub3QgZW1iZWRkZWQs
IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCi0gICAgZW1iZWRkZWRUeXBlID0gdGhpcy5lbWJlZGRl
ZFR5cGUodHlwZSwgbmFtZSk7Ci0gICAgaWYgKGVtYmVkZGVkVHlwZSAhPT0gJ2Fsd2F5cycpIHsg
cmV0dXJuOyB9Ci0KLSAgICAvLyBHZXQgdGhlIERTLk1hbnlBcnJheSBmb3IgdGhlIHJlbGF0aW9u
c2hpcCBvZmYgdGhlIHJlY29yZAotICAgIG1hbnlBcnJheSA9IGdldChyZWNvcmQsIG5hbWUpOwot
Ci0gICAgLy8gQnVpbGQgdXAgdGhlIGFycmF5IG9mIHNlcmlhbGl6ZWQgcmVjb3JkcwotICAgIG1h
bnlBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQpIHsKLSAgICAgIHNlcmlhbGl6ZWRIYXNN
YW55LnB1c2godGhpcy5zZXJpYWxpemUocmVjb3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KSk7Ci0g
ICAgfSwgdGhpcyk7Ci0KLSAgICAvLyBTZXQgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5IG9mIHRo
ZSBzZXJpYWxpemVkIEpTT04gdG8gdGhlCi0gICAgLy8gYXJyYXkgb2Ygc2VyaWFsaXplZCBlbWJl
ZGRlZCByZWNvcmRzCi0gICAgaGFzaFtrZXldID0gc2VyaWFsaXplZEhhc01hbnk7Ci0gIH0sCi0K
LSAgLy8gRVhUUkFDVElPTgotCi0gIGV4dHJhY3Q6IGZ1bmN0aW9uKGxvYWRlciwganNvbiwgdHlw
ZSwgcmVjb3JkKSB7Ci0gICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBlKHR5cGUpOwotCi0g
ICAgdGhpcy5zaWRlbG9hZChsb2FkZXIsIHR5cGUsIGpzb24sIHJvb3QpOwotICAgIHRoaXMuZXh0
cmFjdE1ldGEobG9hZGVyLCB0eXBlLCBqc29uKTsKLQotICAgIGlmIChqc29uW3Jvb3RdKSB7Ci0g
ICAgICBpZiAocmVjb3JkKSB7IGxvYWRlci51cGRhdGVJZChyZWNvcmQsIGpzb25bcm9vdF0pOyB9
Ci0gICAgICB0aGlzLmV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlvbihsb2FkZXIsIHR5cGUsIGpz
b25bcm9vdF0pOwotICAgIH0KLSAgfSwKLQotICBleHRyYWN0TWFueTogZnVuY3Rpb24obG9hZGVy
LCBqc29uLCB0eXBlLCByZWNvcmRzKSB7Ci0gICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBl
KHR5cGUpOwotICAgIHJvb3QgPSB0aGlzLnBsdXJhbGl6ZShyb290KTsKLQotICAgIHRoaXMuc2lk
ZWxvYWQobG9hZGVyLCB0eXBlLCBqc29uLCByb290KTsKLSAgICB0aGlzLmV4dHJhY3RNZXRhKGxv
YWRlciwgdHlwZSwganNvbik7Ci0KLSAgICBpZiAoanNvbltyb290XSkgewotICAgICAgdmFyIG9i
amVjdHMgPSBqc29uW3Jvb3RdLCByZWZlcmVuY2VzID0gW107Ci0gICAgICBpZiAocmVjb3Jkcykg
eyByZWNvcmRzID0gcmVjb3Jkcy50b0FycmF5KCk7IH0KLQotICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChyZWNvcmRzKSB7IGxvYWRl
ci51cGRhdGVJZChyZWNvcmRzW2ldLCBvYmplY3RzW2ldKTsgfQotICAgICAgICB2YXIgcmVmZXJl
bmNlID0gdGhpcy5leHRyYWN0UmVjb3JkUmVwcmVzZW50YXRpb24obG9hZGVyLCB0eXBlLCBvYmpl
Y3RzW2ldKTsKLSAgICAgICAgcmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0K
LSAgICAgIGxvYWRlci5wb3B1bGF0ZUFycmF5KHJlZmVyZW5jZXMpOwotICAgIH0KLSAgfSwKLQot
ICBleHRyYWN0TWV0YTogZnVuY3Rpb24obG9hZGVyLCB0eXBlLCBqc29uKSB7Ci0gICAgdmFyIG1l
dGEgPSBqc29uW3RoaXMuY29uZmlnT3B0aW9uKHR5cGUsICdtZXRhJyldLCBzaW5jZTsKLSAgICBp
ZiAoIW1ldGEpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAoc2luY2UgPSBtZXRhW3RoaXMuY29uZmln
T3B0aW9uKHR5cGUsICdzaW5jZScpXSkgewotICAgICAgbG9hZGVyLnNpbmNlRm9yVHlwZSh0eXBl
LCBzaW5jZSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBJdGVy
YXRlcyBvdmVyIHRoZSBganNvbmAgcGF5bG9hZCBhbmQgYXR0ZW1wdHMgdG8gbG9hZCBhbnkgZGF0
YQotICAgIGluY2x1ZGVkIGFsb25nc2lkZSBgcm9vdGAuCi0KLSAgICBUaGUga2V5cyBleHBlY3Rl
ZCBmb3Igc2lkZWxvYWRlZCBkYXRhIGFyZSBiYXNlZCB1cG9uIHRoZSB0eXBlcyByZWxhdGVkCi0g
ICAgdG8gdGhlIHJvb3QgbW9kZWwuIFJlY3Vyc2lvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHR5
cGVzIHJlbGF0ZWQgdG8KLSAgICByZWxhdGVkIHR5cGVzIGNhbiBiZSBsb2FkZWQgYXMgd2VsbC4g
QW55IGN1c3RvbSBrZXlzIHNwZWNpZmllZCBieQotICAgIGBzaWRlbG9hZEFzYCBtYXBwaW5ncyB3
aWxsIGFsc28gYmUgcmVzcGVjdGVkLgotCi0gICAgQHBhcmFtIHtEUy5TdG9yZSBzdWJjbGFzc30g
bG9hZGVyCi0gICAgQHBhcmFtIHtEUy5Nb2RlbCBzdWJjbGFzc30gdHlwZQotICAgIEBwYXJhbSB7
T2JqZWN0fSBqc29uCi0gICAgQHBhcmFtIHtTdHJpbmd9IHJvb3QKLSAgKi8KLSAgc2lkZWxvYWQ6
IGZ1bmN0aW9uKGxvYWRlciwgdHlwZSwganNvbiwgcm9vdCkgewotICAgIHZhciBzaWRlbG9hZGVk
VHlwZTsKLQotICAgIHRoaXMubm9ybWFsaXplU2lkZWxvYWRNYXBwaW5ncygpOwotICAgIHRoaXMu
Y29uZmlndXJlU2lkZWxvYWRNYXBwaW5nRm9yVHlwZSh0eXBlKTsKLQotICAgIGZvciAodmFyIHBy
b3AgaW4ganNvbikgewotICAgICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KHByb3ApIHx8Ci0g
ICAgICAgICAgcHJvcCA9PT0gcm9vdCB8fAotICAgICAgICAgIHByb3AgPT09IHRoaXMuY29uZmln
T3B0aW9uKHR5cGUsICdtZXRhJykpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAg
ICAgIHNpZGVsb2FkZWRUeXBlID0gdGhpcy5zaWRlbG9hZE1hcHBpbmcuZ2V0KHByb3ApOwotICAg
ICAgRW1iZXIuYXNzZXJ0KCJZb3VyIHNlcnZlciByZXR1cm5lZCBhIGhhc2ggd2l0aCB0aGUga2V5
ICIgKyBwcm9wICsKLSAgICAgICAgICAgICAgICAgICAiIGJ1dCB5b3UgaGF2ZSBubyBtYXBwaW5n
IGZvciBpdCIsCi0gICAgICAgICAgICAgICAgICAgISFzaWRlbG9hZGVkVHlwZSk7Ci0KLSAgICAg
IHRoaXMubG9hZFZhbHVlKGxvYWRlciwgc2lkZWxvYWRlZFR5cGUsIGpzb25bcHJvcF0pOwotICAg
IH0KLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgSXRlcmF0ZXMgb3ZlciBhbGwg
dGhlIGBzaWRlbG9hZEFzYCBtYXBwaW5ncyBhbmQgY29udmVydHMgYW55IHRoYXQgYXJlCi0gICAg
c3RyaW5ncyB0byB0aGVpciBlcXVpdmFsZW50IHR5cGVzLgotCi0gICAgVGhpcyBpcyBhbiBvcHRp
bWl6YXRpb24gdXNlZCB0byBhdm9pZCBwZXJmb3JtaW5nIGxvb2t1cHMgZm9yIGV2ZXJ5Ci0gICAg
Y2FsbCB0byBgc2lkZWxvYWRgLgotICAqLwotICBub3JtYWxpemVTaWRlbG9hZE1hcHBpbmdzOiBm
dW5jdGlvbigpIHsKLSAgICBpZiAoISB0aGlzLnNpZGVsb2FkTWFwcGluZy5ub3JtYWxpemVkKSB7
Ci0gICAgICB0aGlzLnNpZGVsb2FkTWFwcGluZy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUp
IHsKLSAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICB0
aGlzLnNpZGVsb2FkTWFwcGluZy5zZXQoa2V5LCBnZXQoRW1iZXIubG9va3VwLCB2YWx1ZSkpOwot
ICAgICAgICB9Ci0gICAgICB9LCB0aGlzKTsKLSAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLm5v
cm1hbGl6ZWQgPSB0cnVlOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0g
ICAgQ29uZmlndXJlcyBwb3NzaWJsZSBzaWRlbG9hZCBtYXBwaW5ncyBmb3IgdGhlIHR5cGVzIHJl
bGF0ZWQgdG8gYQotICAgIHBhcnRpY3VsYXIgbW9kZWwuIFRoaXMgcmVjdXJzaXZlIG1ldGhvZCBl
bnN1cmVzIHRoYXQgc2lkZWxvYWRpbmcKLSAgICB3b3JrcyBmb3IgcmVsYXRlZCBtb2RlbHMgYXMg
d2VsbC4KLQotICAgIEBwYXJhbSB7RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUKLSAgICBAcGFyYW0g
e0VtYmVyLkF9IGNvbmZpZ3VyZWQgYW4gYXJyYXkgb2YgdHlwZXMgdGhhdCBoYXZlIGFscmVhZHkg
YmVlbiBjb25maWd1cmVkCi0gICovCi0gIGNvbmZpZ3VyZVNpZGVsb2FkTWFwcGluZ0ZvclR5cGU6
IGZ1bmN0aW9uKHR5cGUsIGNvbmZpZ3VyZWQpIHsKLSAgICBpZiAoIWNvbmZpZ3VyZWQpIHtjb25m
aWd1cmVkID0gRW1iZXIuQShbXSk7fQotICAgIGNvbmZpZ3VyZWQucHVzaE9iamVjdCh0eXBlKTsK
LQotICAgIHR5cGUuZWFjaFJlbGF0ZWRUeXBlKGZ1bmN0aW9uKHJlbGF0ZWRUeXBlKSB7Ci0gICAg
ICBpZiAoIWNvbmZpZ3VyZWQuY29udGFpbnMocmVsYXRlZFR5cGUpKSB7Ci0gICAgICAgIHZhciBy
b290ID0gdGhpcy5zaWRlbG9hZE1hcHBpbmdGb3JUeXBlKHJlbGF0ZWRUeXBlKTsKLSAgICAgICAg
aWYgKCFyb290KSB7Ci0gICAgICAgICAgcm9vdCA9IHRoaXMuZGVmYXVsdFNpZGVsb2FkUm9vdEZv
clR5cGUocmVsYXRlZFR5cGUpOwotICAgICAgICAgIHRoaXMuc2lkZWxvYWRNYXBwaW5nLnNldChy
b290LCByZWxhdGVkVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb25maWd1cmVTaWRl
bG9hZE1hcHBpbmdGb3JUeXBlKHJlbGF0ZWRUeXBlLCBjb25maWd1cmVkKTsKLSAgICAgIH0KLSAg
ICB9LCB0aGlzKTsKLSAgfSwKLQotICBsb2FkVmFsdWU6IGZ1bmN0aW9uKGxvYWRlciwgdHlwZSwg
dmFsdWUpIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgZm9yICh2
YXIgaT0wOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbG9hZGVyLnNpZGVsb2Fk
KHR5cGUsIHZhbHVlW2ldKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbG9hZGVyLnNp
ZGVsb2FkKHR5cGUsIHZhbHVlKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gSEVMUEVSUwotCi0gIC8v
IGRlZmluZSBhIHBsdXJhbHMgaGFzaCBpbiB5b3VyIHN1YmNsYXNzIHRvIGRlZmluZQotICAvLyBz
cGVjaWFsLWNhc2UgcGx1cmFsaXphdGlvbgotICBwbHVyYWxpemU6IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICB2YXIgcGx1cmFscyA9IHRoaXMuY29uZmlndXJhdGlvbnMuZ2V0KCdwbHVyYWxzJyk7Ci0g
ICAgcmV0dXJuIChwbHVyYWxzICYmIHBsdXJhbHNbbmFtZV0pIHx8IG5hbWUgKyAicyI7Ci0gIH0s
Ci0KLSAgLy8gdXNlIHRoZSBzYW1lIHBsdXJhbHMgaGFzaCB0byBkZXRlcm1pbmUKLSAgLy8gc3Bl
Y2lhbC1jYXNlIHNpbmd1bGFyaXphdGlvbgotICBzaW5ndWxhcml6ZTogZnVuY3Rpb24obmFtZSkg
ewotICAgIHZhciBwbHVyYWxzID0gdGhpcy5jb25maWd1cmF0aW9ucy5nZXQoJ3BsdXJhbHMnKTsK
LSAgICBpZiAocGx1cmFscykgewotICAgICAgZm9yICh2YXIgaSBpbiBwbHVyYWxzKSB7Ci0gICAg
ICAgIGlmIChwbHVyYWxzW2ldID09PSBuYW1lKSB7Ci0gICAgICAgICAgcmV0dXJuIGk7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5hbWUubGFzdEluZGV4T2YoJ3MnKSA9PT0g
bmFtZS5sZW5ndGggLSAxKSB7Ci0gICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5s
ZW5ndGggLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICB9
LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBEZXRlcm1pbmVzIHRoZSBzaW5ndWxhciBy
b290IG5hbWUgZm9yIGEgcGFydGljdWxhciB0eXBlLgotCi0gICAgVGhpcyBpcyBhbiB1bmRlcnNj
b3JlZCwgbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIG1vZGVsIG5hbWUuCi0gICAgRm9yIGV4YW1w
bGUsIHRoZSB0eXBlIGBBcHAuVXNlckdyb3VwYCB3aWxsIGhhdmUgdGhlIHJvb3QKLSAgICBgdXNl
cl9ncm91cGAuCi0KLSAgICBAcGFyYW0ge0RTLk1vZGVsIHN1YmNsYXNzfSB0eXBlCi0gICAgQHJl
dHVybnMge1N0cmluZ30gbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50Ci0gICovCi0gIHJvb3RGb3JU
eXBlOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIHR5cGVTdHJpbmcgPSB0eXBlLnRvU3RyaW5n
KCk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdXIgbW9kZWwgbXVzdCBub3QgYmUgYW5vbnltb3Vz
LiBJdCB3YXMgIiArIHR5cGUsIHR5cGVTdHJpbmcuY2hhckF0KDApICE9PSAnKCcpOwotCi0gICAg
Ly8gdXNlIHRoZSBsYXN0IHBhcnQgb2YgdGhlIG5hbWUgYXMgdGhlIFVSTAotICAgIHZhciBwYXJ0
cyA9IHR5cGVTdHJpbmcuc3BsaXQoIi4iKTsKLSAgICB2YXIgbmFtZSA9IHBhcnRzW3BhcnRzLmxl
bmd0aCAtIDFdOwotICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgJ18kMScpLnRv
TG93ZXJDYXNlKCkuc2xpY2UoMSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAg
IERldGVybWluZXMgdGhlIHJvb3QgbmFtZSBtYXBwZWQgdG8gYSBwYXJ0aWN1bGFyIHNpZGVsb2Fk
ZWQgdHlwZS4KLQotICAgIEBwYXJhbSB7RFMuTW9kZWwgc3ViY2xhc3N9IHR5cGUKLSAgICBAcmV0
dXJucyB7U3RyaW5nfSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQsIGlmIGFueSBpcyByZWdpc3Rl
cmVkCi0gICovCi0gIHNpZGVsb2FkTWFwcGluZ0ZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICB0aGlzLnNpZGVsb2FkTWFwcGluZy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAg
ICAgIGlmICh0eXBlID09PSB2YWx1ZSkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgICAgfQot
ICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBUaGUgZGVmYXVsdCBy
b290IG5hbWUgZm9yIGEgcGFydGljdWxhciBzaWRlbG9hZGVkIHR5cGUuCi0KLSAgICBAcGFyYW0g
e0RTLk1vZGVsIHN1YmNsYXNzfSB0eXBlCi0gICAgQHJldHVybnMge1N0cmluZ30gbmFtZSBvZiB0
aGUgcm9vdCBlbGVtZW50Ci0gICovCi0gIGRlZmF1bHRTaWRlbG9hZFJvb3RGb3JUeXBlOiBmdW5j
dGlvbih0eXBlKSB7Ci0gICAgcmV0dXJuIHRoaXMucGx1cmFsaXplKHRoaXMucm9vdEZvclR5cGUo
dHlwZSkpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLWZ1bmN0aW9u
IGxvYWRlckZvcihzdG9yZSkgewotICByZXR1cm4gewotICAgIGxvYWQ6IGZ1bmN0aW9uKHR5cGUs
IGRhdGEsIHByZW1hdGVyaWFsaXplZCkgewotICAgICAgcmV0dXJuIHN0b3JlLmxvYWQodHlwZSwg
ZGF0YSwgcHJlbWF0ZXJpYWxpemVkKTsKLSAgICB9LAotCi0gICAgbG9hZE1hbnk6IGZ1bmN0aW9u
KHR5cGUsIGFycmF5KSB7Ci0gICAgICByZXR1cm4gc3RvcmUubG9hZE1hbnkodHlwZSwgYXJyYXkp
OwotICAgIH0sCi0KLSAgICB1cGRhdGVJZDogZnVuY3Rpb24ocmVjb3JkLCBkYXRhKSB7Ci0gICAg
ICByZXR1cm4gc3RvcmUudXBkYXRlSWQocmVjb3JkLCBkYXRhKTsKLSAgICB9LAotCi0gICAgcG9w
dWxhdGVBcnJheTogRW1iZXIuSywKLQotICAgIHNpZGVsb2FkOiBmdW5jdGlvbih0eXBlLCBkYXRh
KSB7Ci0gICAgICByZXR1cm4gc3RvcmUubG9hZCh0eXBlLCBkYXRhKTsKLSAgICB9LAotCi0gICAg
c2lkZWxvYWRNYW55OiBmdW5jdGlvbih0eXBlLCBhcnJheSkgewotICAgICAgcmV0dXJuIHN0b3Jl
LmxvYWRNYW55KHR5cGUsIGFycmF5KTsKLSAgICB9LAotCi0gICAgcHJlbWF0ZXJpYWxpemU6IGZ1
bmN0aW9uKHJlZmVyZW5jZSwgcHJlbWF0ZXJpYWxpemVkKSB7Ci0gICAgICBzdG9yZS5wcmVtYXRl
cmlhbGl6ZShyZWZlcmVuY2UsIHByZW1hdGVyaWFsaXplZCk7Ci0gICAgfSwKLQotICAgIHNpbmNl
Rm9yVHlwZTogZnVuY3Rpb24odHlwZSwgc2luY2UpIHsKLSAgICAgIHN0b3JlLnNpbmNlRm9yVHlw
ZSh0eXBlLCBzaW5jZSk7Ci0gICAgfQotICB9OwotfQotCi1EUy5sb2FkZXJGb3IgPSBsb2FkZXJG
b3I7Ci0KLS8qKgotICBBbiBhZGFwdGVyIGlzIGFuIG9iamVjdCB0aGF0IHJlY2VpdmVzIHJlcXVl
c3RzIGZyb20gYSBzdG9yZSBhbmQKLSAgdHJhbnNsYXRlcyB0aGVtIGludG8gdGhlIGFwcHJvcHJp
YXRlIGFjdGlvbiB0byB0YWtlIGFnYWluc3QgeW91cgotICBwZXJzaXN0ZW5jZSBsYXllci4gVGhl
IHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkgYW4gSFRUUCBBUEksIGJ1dCBtYXkKLSAgYmUg
YW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlLgotCi0gICMjIyBD
cmVhdGluZyBhbiBBZGFwdGVyCi0KLSAgRmlyc3QsIGNyZWF0ZSBhIG5ldyBzdWJjbGFzcyBvZiBg
RFMuQWRhcHRlcmA6Ci0KLSAgICAgIEFwcC5NeUFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7
Ci0gICAgICAgIC8vIC4uLnlvdXIgY29kZSBoZXJlCi0gICAgICB9KTsKLQotICBUbyB0ZWxsIHlv
dXIgc3RvcmUgd2hpY2ggYWRhcHRlciB0byB1c2UsIHNldCBpdHMgYGFkYXB0ZXJgIHByb3BlcnR5
OgotCi0gICAgICBBcHAuc3RvcmUgPSBEUy5TdG9yZS5jcmVhdGUoewotICAgICAgICByZXZpc2lv
bjogMywKLSAgICAgICAgYWRhcHRlcjogQXBwLk15QWRhcHRlci5jcmVhdGUoKQotICAgICAgfSk7
Ci0KLSAgYERTLkFkYXB0ZXJgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCB5b3Ugc2hv
dWxkIG92ZXJyaWRlIGluIHlvdXIKLSAgYXBwbGljYXRpb24gdG8gY3VzdG9taXplIGl0IGZvciB5
b3VyIGJhY2tlbmQuIFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCi0gIHRoYXQgeW91IHNob3Vs
ZCBpbXBsZW1lbnQgaXM6Ci0KLSAgICAqIGBmaW5kKClgCi0gICAgKiBgY3JlYXRlUmVjb3JkKClg
Ci0gICAgKiBgdXBkYXRlUmVjb3JkKClgCi0gICAgKiBgZGVsZXRlUmVjb3JkKClgCi0KLSAgIFRv
IGltcHJvdmUgdGhlIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91
IGNhbiBvcHRpbWl6ZQotICAgeW91ciBhZGFwdGVyIGJ5IG92ZXJyaWRpbmcgdGhlc2UgbG93ZXIt
bGV2ZWwgbWV0aG9kczoKLQotICAgICogYGZpbmRNYW55KClgCi0gICAgKiBgY3JlYXRlUmVjb3Jk
cygpYAotICAgICogYHVwZGF0ZVJlY29yZHMoKWAKLSAgICAqIGBkZWxldGVSZWNvcmRzKClgCi0g
ICAgKiBgY29tbWl0KClgCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5z
ZXQsIG1lcmdlID0gRW1iZXIubWVyZ2U7Ci0KLURTLkFkYXB0ZXIgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKERTLl9NYXBwYWJsZSwgewotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZXJp
YWxpemVyID0gZ2V0KHRoaXMsICdzZXJpYWxpemVyJyk7Ci0KLSAgICBpZiAoRW1iZXIuT2JqZWN0
LmRldGVjdChzZXJpYWxpemVyKSkgewotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIuY3Jl
YXRlKCk7Ci0gICAgICBzZXQodGhpcywgJ3NlcmlhbGl6ZXInLCBzZXJpYWxpemVyKTsKLSAgICB9
Ci0KLSAgICB0aGlzLl9hdHRyaWJ1dGVzTWFwID0gdGhpcy5jcmVhdGVJbnN0YW5jZU1hcEZvcign
YXR0cmlidXRlcycpOwotICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25zTWFwID0gdGhpcy5jcmVhdGVJ
bnN0YW5jZU1hcEZvcignY29uZmlndXJhdGlvbnMnKTsKLQotICAgIHRoaXMuX291dHN0YW5kaW5n
T3BlcmF0aW9ucyA9IG5ldyBFbWJlci5NYXBXaXRoRGVmYXVsdCh7Ci0gICAgICBkZWZhdWx0VmFs
dWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfQotICAgIH0pOwotCi0gICAgdGhpcy5fZGVwZW5k
ZW5jaWVzID0gbmV3IEVtYmVyLk1hcFdpdGhEZWZhdWx0KHsKLSAgICAgIGRlZmF1bHRWYWx1ZTog
ZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRW1iZXIuT3JkZXJlZFNldCgpOyB9Ci0gICAgfSk7Ci0K
LSAgICB0aGlzLnJlZ2lzdGVyU2VyaWFsaXplclRyYW5zZm9ybXModGhpcy5jb25zdHJ1Y3Rvciwg
c2VyaWFsaXplciwge30pOwotICAgIHRoaXMucmVnaXN0ZXJTZXJpYWxpemVyTWFwcGluZ3Moc2Vy
aWFsaXplcik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTG9hZHMgYSBwYXlsb2FkIGZvciBhIHJlY29y
ZCBpbnRvIHRoZSBzdG9yZS4KLQotICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIHNlcmlhbGl6ZXIg
dG8gYnJlYWsgdGhlIHBheWxvYWQgaW50bwotICAgIGNvbnN0aXR1ZW50IHBhcnRzLCBhbmQgdGhl
biBsb2FkcyB0aGVtIGludG8gdGhlIHN0b3JlLiBGb3IgZXhhbXBsZSwKLSAgICBpZiB5b3UgaGF2
ZSBhIHBheWxvYWQgdGhhdCBjb250YWlucyBlbWJlZGRlZCByZWNvcmRzLCB0aGV5IHdpbGwgYmUK
LSAgICBleHRyYWN0ZWQgYnkgdGhlIHNlcmlhbGl6ZXIgYW5kIGxvYWRlZCBpbnRvIHRoZSBzdG9y
ZS4KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICAgYWRhcHRl
ci5sb2FkKHN0b3JlLCBBcHAuUGVyc29uLCB7Ci0gICAgICAgIGlkOiAxMjMsCi0gICAgICAgIGZp
cnN0TmFtZTogIlllaHVkYSIsCi0gICAgICAgIGxhc3ROYW1lOiAiS2F0eiIsCi0gICAgICAgIG9j
Y3VwYXRpb25zOiBbewotICAgICAgICAgIGlkOiAzNDUsCi0gICAgICAgICAgdGl0bGU6ICJUcmlj
eWNsZSBNZWNoYW5pYyIKLSAgICAgICAgfV0gICAgCi0gICAgICB9KTsKLSAgICBgYGAKLQotICAg
IFRoaXMgd2lsbCBsb2FkIHRoZSBwYXlsb2FkIGZvciB0aGUgYEFwcC5QZXJzb25gIHdpdGggSUQg
YDEyM2AgYW5kCi0gICAgdGhlIGVtYmVkZGVkIGBBcHAuT2NjdXBhdGlvbmAgd2l0aCBJRCBgMzQ1
YC4KLQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkCi0gICovCi0gIGxvYWQ6
IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkKSB7Ci0gICAgdmFyIGxvYWRlciA9IGxvYWRl
ckZvcihzdG9yZSk7Ci0gICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykuZXh0cmFjdFJlY29yZFJl
cHJlc2VudGF0aW9uKGxvYWRlciwgdHlwZSwgcGF5bG9hZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0ZXIgaGFzIGZpbmlzaGVkIGNyZWF0aW5nIGEgcmVj
b3JkLgotCi0gICAgWW91ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYGNy
ZWF0ZVJlY29yZGAgd2hlbgotICAgIGl0IGhhcyBzYXZlZCBhIG5ldyByZWNvcmQgdG8gaXRzIHBl
cnNpc3RlbnQgc3RvcmFnZSBhbmQgcmVjZWl2ZWQKLSAgICBhbiBhY2tub3dsZWRnZW1lbnQuCi0K
LSAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIHJldHVybnMgYSBuZXcgcGF5bG9hZCBpbiBy
ZXNwb25zZSB0byB0aGUKLSAgICBjcmVhdGlvbiwgYW5kIHlvdSB3YW50IHRvIHVwZGF0ZSB0aGUg
ZXhpc3RpbmcgcmVjb3JkIHdpdGggdGhlCi0gICAgbmV3IGluZm9ybWF0aW9uLCBwYXNzIHRoZSBw
YXlsb2FkIGFzIHRoZSBmb3VydGggcGFyYW1ldGVyLgotCi0gICAgRm9yIGV4YW1wbGUsIHRoZSBg
UkVTVEFkYXB0ZXJgIHNhdmVzIG5ld2x5IGNyZWF0ZWQgcmVjb3JkcyBieQotICAgIG1ha2luZyBh
biBBamF4IHJlcXVlc3QuIFdoZW4gdGhlIHNlcnZlciByZXR1cm5zLCB0aGUgYWRhcHRlcgotICAg
IGNhbGxzIGRpZENyZWF0ZVJlY29yZC4gSWYgdGhlIHNlcnZlciByZXR1cm5zIGEgcmVzcG9uc2Ug
Ym9keSwKLSAgICBpdCBpcyBwYXNzZWQgYXMgdGhlIHBheWxvYWQuIAotCi0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0g
ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHthbnl9IHBheWxvYWQgCi0g
ICovCi0gIGRpZENyZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCwgcGF5
bG9hZCkgewotICAgIHN0b3JlLmRpZFNhdmVSZWNvcmQocmVjb3JkKTsKLQotICAgIGlmIChwYXls
b2FkKSB7Ci0gICAgICB2YXIgbG9hZGVyID0gRFMubG9hZGVyRm9yKHN0b3JlKTsKLQotICAgICAg
bG9hZGVyLmxvYWQgPSBmdW5jdGlvbih0eXBlLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQpIHsKLSAg
ICAgICAgc3RvcmUudXBkYXRlSWQocmVjb3JkLCBkYXRhKTsKLSAgICAgICAgcmV0dXJuIHN0b3Jl
LmxvYWQodHlwZSwgZGF0YSwgcHJlbWF0ZXJpYWxpemVkKTsKLSAgICAgIH07Ci0KLSAgICAgIGdl
dCh0aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3QobG9hZGVyLCBwYXlsb2FkLCB0eXBlKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0ZXIgaGFz
IGZpbmlzaGVkIGNyZWF0aW5nIHNldmVyYWwgcmVjb3Jkcy4KLQotICAgIFlvdXIgYWRhcHRlciBz
aG91bGQgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGBjcmVhdGVSZWNvcmRzYCB3aGVuIGl0Ci0gICAg
aGFzIHNhdmVkIG11bHRpcGxlIGNyZWF0ZWQgcmVjb3JkcyB0byBpdHMgcGVyc2lzdGVudCBzdG9y
YWdlIAotICAgIHJlY2VpdmVkIGFuIGFja25vd2xlZGdlbWVudC4KLQotICAgIElmIHRoZSBwZXJz
aXN0ZW50IHN0b3JhZ2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGluIHJlc3BvbnNlIHRvIHRoZQot
ICAgIGNyZWF0aW9uLCBhbmQgeW91IHdhbnQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyByZWNvcmQg
d2l0aCB0aGUKLSAgICBuZXcgaW5mb3JtYXRpb24sIHBhc3MgdGhlIHBheWxvYWQgYXMgdGhlIGZv
dXJ0aCBwYXJhbWV0ZXIuCi0KLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJh
bSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNv
cmQKLSAgICBAcGFyYW0ge2FueX0gcGF5bG9hZCAKLSAgKi8KLSAgZGlkQ3JlYXRlUmVjb3Jkczog
ZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZHMsIHBheWxvYWQpIHsKLSAgICByZWNvcmRzLmZv
ckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29y
ZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICBpZiAocGF5bG9hZCkgewotICAgICAgdmFyIGxvYWRl
ciA9IERTLmxvYWRlckZvcihzdG9yZSk7Ci0gICAgICBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5l
eHRyYWN0TWFueShsb2FkZXIsIHBheWxvYWQsIHR5cGUsIHJlY29yZHMpOwotICAgIH0KLSAgfSwK
LQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0
ZXIgaGFzIGZpbmlzaGVkIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGEgcmVjb3JkLgotCi0gICAgWW91
ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYHVwZGF0ZVJlY29yZGAgb3Ig
YGRlbGV0ZVJlY29yZGAKLSAgICB3aGVuIGl0IGhhcyB1cGRhdGVkIG9yIGRlbGV0ZWQgYSByZWNv
cmQgdG8gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQKLSAgICByZWNlaXZlZCBhbiBhY2tub3ds
ZWRnZW1lbnQuCi0KLSAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIHJldHVybnMgYSBuZXcg
cGF5bG9hZCBpbiByZXNwb25zZSB0byB0aGUKLSAgICB1cGRhdGUgb3IgZGVsZXRlLCBhbmQgeW91
IHdhbnQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyByZWNvcmQgd2l0aCB0aGUKLSAgICBuZXcgaW5m
b3JtYXRpb24sIHBhc3MgdGhlIHBheWxvYWQgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuCi0KLSAg
ICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge2FueX0g
cGF5bG9hZCAKLSAgKi8KLSAgZGlkU2F2ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJl
Y29yZCwgcGF5bG9hZCkgewotICAgIHN0b3JlLmRpZFNhdmVSZWNvcmQocmVjb3JkKTsKLQotICAg
IHZhciBzZXJpYWxpemVyID0gZ2V0KHRoaXMsICdzZXJpYWxpemVyJyksCi0gICAgICAgIG1hcHBp
bmdzID0gc2VyaWFsaXplci5tYXBwaW5nRm9yVHlwZSh0eXBlKTsKLQotICAgIHNlcmlhbGl6ZXIu
ZWFjaEVtYmVkZGVkUmVjb3JkKHJlY29yZCwgZnVuY3Rpb24oZW1iZWRkZWRSZWNvcmQsIGVtYmVk
ZGVkVHlwZSkgewotICAgICAgaWYgKGVtYmVkZGVkVHlwZSA9PT0gJ2xvYWQnKSB7IHJldHVybjsg
fQotCi0gICAgICB0aGlzLmRpZFNhdmVSZWNvcmQoc3RvcmUsIGVtYmVkZGVkUmVjb3JkLmNvbnN0
cnVjdG9yLCBlbWJlZGRlZFJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICBpZiAocGF5bG9h
ZCkgewotICAgICAgdmFyIGxvYWRlciA9IERTLmxvYWRlckZvcihzdG9yZSk7Ci0gICAgICBzZXJp
YWxpemVyLmV4dHJhY3QobG9hZGVyLCBwYXlsb2FkLCB0eXBlKTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0ZXIgaGFzIGZpbmlzaGVkIHVwZGF0
aW5nIGEgcmVjb3JkLgotCi0gICAgWW91ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9k
IGZyb20gYHVwZGF0ZVJlY29yZGAgd2hlbiBpdAotICAgIGhhcyB1cGRhdGVkIGEgcmVjb3JkIHRv
IGl0cyBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kIHJlY2VpdmVkIGFuCi0gICAgYWNrbm93bGVkZ2Vt
ZW50LgotCi0gICAgSWYgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSByZXR1cm5zIGEgbmV3IHBheWxv
YWQgaW4gcmVzcG9uc2UgdG8gdGhlCi0gICAgdXBkYXRlLCBwYXNzIHRoZSBwYXlsb2FkIGFzIHRo
ZSBmb3VydGggcGFyYW1ldGVyLgotCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBA
cGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0g
cmVjb3JkCi0gICAgQHBhcmFtIHthbnl9IHBheWxvYWQgCi0gICovCi0gIGRpZFVwZGF0ZVJlY29y
ZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5kaWRTYXZlUmVjb3JkLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWNrbm93bGVkZ2VzIHRoYXQgdGhlIGFkYXB0ZXIg
aGFzIGZpbmlzaGVkIGRlbGV0aW5nIGEgcmVjb3JkLgotCi0gICAgWW91ciBhZGFwdGVyIHNob3Vs
ZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYGRlbGV0ZVJlY29yZGAgd2hlbiBpdAotICAgIGhhcyBk
ZWxldGVkIGEgcmVjb3JkIGZyb20gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQgcmVjZWl2ZWQg
YW4KLSAgICBhY2tub3dsZWRnZW1lbnQuCi0KLSAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdl
IHJldHVybnMgYSBuZXcgcGF5bG9hZCBpbiByZXNwb25zZSB0byB0aGUKLSAgICBkZWxldGlvbiwg
cGFzcyB0aGUgcGF5bG9hZCBhcyB0aGUgZm91cnRoIHBhcmFtZXRlci4KLQotICAgIEBwYXJhbSB7
RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAot
ICAqLwotICBkaWREZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGlkU2F2ZVJl
Y29yZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIEFja25vd2xl
ZGdlcyB0aGF0IHRoZSBhZGFwdGVyIGhhcyBmaW5pc2hlZCB1cGRhdGluZyBvciBkZWxldGluZyAK
LSAgICBtdWx0aXBsZSByZWNvcmRzLgotCi0gICAgWW91ciBhZGFwdGVyIHNob3VsZCBjYWxsIHRo
aXMgbWV0aG9kIGZyb20gaXRzIGB1cGRhdGVSZWNvcmRzYCBvcgotICAgIGBkZWxldGVSZWNvcmRz
YCB3aGVuIGl0IGhhcyB1cGRhdGVkIG9yIGRlbGV0ZWQgbXVsdGlwbGUgcmVjb3JkcwotICAgIHRv
IGl0cyBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kIHJlY2VpdmVkIGFuIGFja25vd2xlZGdlbWVudC4K
LQotICAgIElmIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgcmV0dXJucyBhIG5ldyBwYXlsb2FkIGlu
IHJlc3BvbnNlIHRvIHRoZQotICAgIGNyZWF0aW9uLCBwYXNzIHRoZSBwYXlsb2FkIGFzIHRoZSBm
b3VydGggcGFyYW1ldGVyLgotCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFy
YW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVj
b3JkcwotICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAotICAqLwotICBkaWRTYXZlUmVjb3Jkczog
ZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZHMsIHBheWxvYWQpIHsKLSAgICByZWNvcmRzLmZv
ckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29y
ZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICBpZiAocGF5bG9hZCkgewotICAgICAgdmFyIGxvYWRl
ciA9IERTLmxvYWRlckZvcihzdG9yZSk7Ci0gICAgICBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5l
eHRyYWN0TWFueShsb2FkZXIsIHBheWxvYWQsIHR5cGUpOwotICAgIH0KLSAgfSwKLQotICAvKioK
LSAgICBBY2tub3dsZWRnZXMgdGhhdCB0aGUgYWRhcHRlciBoYXMgZmluaXNoZWQgdXBkYXRpbmcg
bXVsdGlwbGUgcmVjb3Jkcy4KLQotICAgIFlvdXIgYWRhcHRlciBzaG91bGQgY2FsbCB0aGlzIG1l
dGhvZCBmcm9tIGl0cyBgdXBkYXRlUmVjb3Jkc2Agd2hlbgotICAgIGl0IGhhcyB1cGRhdGVkIG11
bHRpcGxlIHJlY29yZHMgdG8gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQKLSAgICByZWNlaXZl
ZCBhbiBhY2tub3dsZWRnZW1lbnQuCi0KLSAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIHJl
dHVybnMgYSBuZXcgcGF5bG9hZCBpbiByZXNwb25zZSB0byB0aGUKLSAgICB1cGRhdGUsIHBhc3Mg
dGhlIHBheWxvYWQgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuCi0KLSAgICBAcGFyYW0ge0RTLlN0
b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBA
cGFyYW0ge0RTLk1vZGVsfSByZWNvcmRzCi0gICAgQHBhcmFtIHthbnl9IHBheWxvYWQgCi0gICov
Ci0gIGRpZFVwZGF0ZVJlY29yZHM6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGlkU2F2ZVJlY29y
ZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBBY2tub3dsZWRn
ZXMgdGhhdCB0aGUgYWRhcHRlciBoYXMgZmluaXNoZWQgdXBkYXRpbmcgbXVsdGlwbGUgcmVjb3Jk
cy4KLQotICAgIFlvdXIgYWRhcHRlciBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGl0cyBg
ZGVsZXRlUmVjb3Jkc2Agd2hlbgotICAgIGl0IGhhcyBkZWxldGVkIG11bHRpcGxlIHJlY29yZHMg
dG8gaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBhbmQKLSAgICByZWNlaXZlZCBhbiBhY2tub3dsZWRn
ZW1lbnQuCi0KLSAgICBJZiB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIHJldHVybnMgYSBuZXcgcGF5
bG9hZCBpbiByZXNwb25zZSB0byB0aGUKLSAgICBkZWxldGlvbiwgcGFzcyB0aGUgcGF5bG9hZCBh
cyB0aGUgZm91cnRoIHBhcmFtZXRlci4KLQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0g
ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9k
ZWx9IHJlY29yZHMKLSAgICBAcGFyYW0ge2FueX0gcGF5bG9hZCAKLSAgKi8KLSAgZGlkRGVsZXRl
UmVjb3JkczogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5kaWRTYXZlUmVjb3Jkcy5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIExvYWRzIHRoZSByZXNwb25zZSB0byBh
IHJlcXVlc3QgZm9yIGEgcmVjb3JkIGJ5IElELgotCi0gICAgWW91ciBhZGFwdGVyIHNob3VsZCBj
YWxsIHRoaXMgbWV0aG9kIGZyb20gaXRzIGBmaW5kYCBtZXRob2QKLSAgICB3aXRoIHRoZSByZXNw
b25zZSBmcm9tIHRoZSBiYWNrZW5kLgotCi0gICAgWW91IHNob3VsZCBwYXNzIHRoZSBzYW1lIElE
IHRvIHRoaXMgbWV0aG9kIHRoYXQgd2FzIGdpdmVuCi0gICAgdG8geW91ciBmaW5kIG1ldGhvZCBz
byB0aGF0IHRoZSBzdG9yZSBrbm93cyB3aGljaCByZWNvcmQKLSAgICB0byBhc3NvY2lhdGUgdGhl
IG5ldyBkYXRhIHdpdGguCi0KLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJh
bSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge2FueX0gcGF5bG9hZCAK
LSAgICBAcGFyYW0ge1N0cmluZ30gaWQKLSAgKi8KLSAgZGlkRmluZFJlY29yZDogZnVuY3Rpb24o
c3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkKSB7Ci0gICAgdmFyIGxvYWRlciA9IERTLmxvYWRlckZv
cihzdG9yZSk7Ci0KLSAgICBsb2FkZXIubG9hZCA9IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIHByZW1h
dGVyaWFsaXplZCkgewotICAgICAgcHJlbWF0ZXJpYWxpemVkID0gcHJlbWF0ZXJpYWxpemVkIHx8
IHt9OwotICAgICAgcHJlbWF0ZXJpYWxpemVkLmlkID0gaWQ7Ci0KLSAgICAgIHJldHVybiBzdG9y
ZS5sb2FkKHR5cGUsIGRhdGEsIHByZW1hdGVyaWFsaXplZCk7Ci0gICAgfTsKLQotICAgIGdldCh0
aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3QobG9hZGVyLCBwYXlsb2FkLCB0eXBlKTsKLSAgfSwK
LQotICAvKioKLSAgICBMb2FkcyB0aGUgcmVzcG9uc2UgdG8gYSByZXF1ZXN0IGZvciBhbGwgcmVj
b3JkcyBieSB0eXBlLgotCi0gICAgWW91IGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qg
ZnJvbSBpdHMgYGZpbmRBbGxgCi0gICAgbWV0aG9kIHdpdGggdGhlIHJlc3BvbnNlIGZyb20gdGhl
IGJhY2tlbmQuCi0KLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge2FueX0gcGF5bG9hZCAKLSAgKi8K
LSAgZGlkRmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICB2YXIg
bG9hZGVyID0gRFMubG9hZGVyRm9yKHN0b3JlKSwKLSAgICAgICAgc2VyaWFsaXplciA9IGdldCh0
aGlzLCAnc2VyaWFsaXplcicpOwotCi0gICAgc3RvcmUuZGlkVXBkYXRlQWxsKHR5cGUpOwotCi0g
ICAgc2VyaWFsaXplci5leHRyYWN0TWFueShsb2FkZXIsIHBheWxvYWQsIHR5cGUpOwotICB9LAot
Ci0gIC8qKgotICAgIExvYWRzIHRoZSByZXNwb25zZSB0byBhIHJlcXVlc3QgZm9yIHJlY29yZHMg
YnkgcXVlcnkuCi0KLSAgICBZb3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgZnJv
bSBpdHMgYGZpbmRRdWVyeWAKLSAgICBtZXRob2Qgd2l0aCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUg
YmFja2VuZC4KLQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAotICAgIEBw
YXJhbSB7RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5fSByZWNvcmRBcnJheQotICAqLwot
ICBkaWRGaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCByZWNvcmRBcnJh
eSkgewotICAgIHZhciBsb2FkZXIgPSBEUy5sb2FkZXJGb3Ioc3RvcmUpOwotCi0gICAgbG9hZGVy
LnBvcHVsYXRlQXJyYXkgPSBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICByZWNvcmRBcnJheS5sb2Fk
KGRhdGEpOwotICAgIH07Ci0KLSAgICBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5leHRyYWN0TWFu
eShsb2FkZXIsIHBheWxvYWQsIHR5cGUpOwotICB9LAotCi0gIC8qKgotICAgIExvYWRzIHRoZSBy
ZXNwb25zZSB0byBhIHJlcXVlc3QgZm9yIG1hbnkgcmVjb3JkcyBieSBJRC4KLQotICAgIFlvdSBh
ZGFwdGVyIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gaXRzIGBmaW5kTWFueWAKLSAgICBt
ZXRob2Qgd2l0aCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgYmFja2VuZC4KLQotICAgIEBwYXJhbSB7
RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7YW55fSBwYXlsb2FkIAotICAqLwotICBkaWRGaW5kTWFueTogZnVuY3Rpb24o
c3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICB2YXIgbG9hZGVyID0gRFMubG9hZGVyRm9yKHN0
b3JlKTsKLQotICAgIGdldCh0aGlzLCAnc2VyaWFsaXplcicpLmV4dHJhY3RNYW55KGxvYWRlciwg
cGF5bG9hZCwgdHlwZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTm90aWZpZXMgdGhlIHN0b3JlIHRo
YXQgYSByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIHJldHVybmVkCi0gICAgYW4gZXJyb3IuCi0KLSAg
ICBZb3VyIGFkYXB0ZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8gaW5kaWNhdGUgdGhhdCB0
aGUKLSAgICBiYWNrZW5kIHJldHVybmVkIGFuIGVycm9yIGZvciBhIHJlcXVlc3QuCi0KLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgZGlkRXJyb3I6IGZ1
bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICBzdG9yZS5yZWNvcmRXYXNFcnJvcihy
ZWNvcmQpOwotICB9LAotCi0gIGRpcnR5UmVjb3Jkc0ZvckF0dHJpYnV0ZUNoYW5nZTogZnVuY3Rp
b24oZGlydHlTZXQsIHJlY29yZCwgYXR0cmlidXRlTmFtZSwgbmV3VmFsdWUsIG9sZFZhbHVlKSB7
Ci0gICAgaWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkgewotICAgICAgLy8gSWYgdGhpcyByZWNv
cmQgaXMgZW1iZWRkZWQsIGFkZCBpdHMgcGFyZW50Ci0gICAgICAvLyB0byB0aGUgZGlydHkgc2V0
LgotICAgICAgdGhpcy5kaXJ0eVJlY29yZHNGb3JSZWNvcmRDaGFuZ2UoZGlydHlTZXQsIHJlY29y
ZCk7Ci0gICAgfQotICB9LAotCi0gIGRpcnR5UmVjb3Jkc0ZvclJlY29yZENoYW5nZTogZnVuY3Rp
b24oZGlydHlTZXQsIHJlY29yZCkgewotICAgIGRpcnR5U2V0LmFkZChyZWNvcmQpOwotICB9LAot
Ci0gIGRpcnR5UmVjb3Jkc0ZvckJlbG9uZ3NUb0NoYW5nZTogZnVuY3Rpb24oZGlydHlTZXQsIGNo
aWxkKSB7Ci0gICAgdGhpcy5kaXJ0eVJlY29yZHNGb3JSZWNvcmRDaGFuZ2UoZGlydHlTZXQsIGNo
aWxkKTsKLSAgfSwKLQotICBkaXJ0eVJlY29yZHNGb3JIYXNNYW55Q2hhbmdlOiBmdW5jdGlvbihk
aXJ0eVNldCwgcGFyZW50KSB7Ci0gICAgdGhpcy5kaXJ0eVJlY29yZHNGb3JSZWNvcmRDaGFuZ2Uo
ZGlydHlTZXQsIHBhcmVudCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRo
aXMgbWV0aG9kIHJlY3Vyc2l2ZWx5IGNsaW1icyB0aGUgc3VwZXJjbGFzcyBoaWVyYXJjaHkgYW5k
Ci0gICAgcmVnaXN0ZXJzIGFueSBjbGFzcy1yZWdpc3RlcmVkIHRyYW5zZm9ybXMgb24gdGhlIGFk
YXB0ZXIncwotICAgIHNlcmlhbGl6ZXIuCi0KLSAgICBPbmNlIGl0IHJlZ2lzdGVycyBhIHRyYW5z
Zm9ybSBmb3IgYSBnaXZlbiB0eXBlLCBpdCBpZ25vcmVzCi0gICAgc3Vic2VxdWVudCB0cmFuc2Zv
cm1zIGZvciB0aGUgc2FtZSBhdHRyaWJ1dGUgdHlwZS4KLQotICAgIEBwYXJhbSB7Q2xhc3N9IGts
YXNzIHRoZSBEUy5BZGFwdGVyIHN1YmNsYXNzIHRvIGV4dHJhY3QgdGhlCi0gICAgICB0cmFuc2Zv
cm1zIGZyb20KLSAgICBAcGFyYW0ge0RTLlNlcmlhbGl6ZXJ9IHNlcmlhbGl6ZXIgdGhlIHNlcmlh
bGl6ZXIgdG8gcmVnaXN0ZXIKLSAgICAgIHRoZSB0cmFuc2Zvcm1zIG9udG8KLSAgICBAcGFyYW0g
e09iamVjdH0gc2VlbiBhIGhhc2ggb2YgYXR0cmlidXRlcyBhbHJlYWR5IHNlZW4KLSAgKi8KLSAg
cmVnaXN0ZXJTZXJpYWxpemVyVHJhbnNmb3JtczogZnVuY3Rpb24oa2xhc3MsIHNlcmlhbGl6ZXIs
IHNlZW4pIHsKLSAgICB2YXIgdHJhbnNmb3JtcyA9IGtsYXNzLl9yZWdpc3RlcmVkVHJhbnNmb3Jt
cywgc3VwZXJjbGFzcywgcHJvcDsKLQotICAgIGZvciAocHJvcCBpbiB0cmFuc2Zvcm1zKSB7Ci0g
ICAgICBpZiAoIXRyYW5zZm9ybXMuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgcHJvcCBpbiBzZWVu
KSB7IGNvbnRpbnVlOyB9Ci0gICAgICBzZWVuW3Byb3BdID0gdHJ1ZTsKLQotICAgICAgc2VyaWFs
aXplci5yZWdpc3RlclRyYW5zZm9ybShwcm9wLCB0cmFuc2Zvcm1zW3Byb3BdKTsKLSAgICB9Ci0K
LSAgICBpZiAoc3VwZXJjbGFzcyA9IGtsYXNzLnN1cGVyY2xhc3MpIHsKLSAgICAgIHRoaXMucmVn
aXN0ZXJTZXJpYWxpemVyVHJhbnNmb3JtcyhzdXBlcmNsYXNzLCBzZXJpYWxpemVyLCBzZWVuKTsK
LSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMgbWV0aG9kIHJl
Y3Vyc2l2ZWx5IGNsaW1icyB0aGUgc3VwZXJjbGFzcyBoaWVyYXJjaHkgYW5kCi0gICAgcmVnaXN0
ZXJzIGFueSBjbGFzcy1yZWdpc3RlcmVkIG1hcHBpbmdzIG9uIHRoZSBhZGFwdGVyJ3MKLSAgICBz
ZXJpYWxpemVyLgotCi0gICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgdGhlIERTLkFkYXB0ZXIgc3Vi
Y2xhc3MgdG8gZXh0cmFjdCB0aGUKLSAgICAgIHRyYW5zZm9ybXMgZnJvbQotICAgIEBwYXJhbSB7
RFMuU2VyaWFsaXplcn0gc2VyaWFsaXplciB0aGUgc2VyaWFsaXplciB0byByZWdpc3RlciB0aGUK
LSAgICAgIG1hcHBpbmdzIG9udG8KLSAgKi8KLSAgcmVnaXN0ZXJTZXJpYWxpemVyTWFwcGluZ3M6
IGZ1bmN0aW9uKHNlcmlhbGl6ZXIpIHsKLSAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9hdHRyaWJ1
dGVzTWFwLAotICAgICAgICBjb25maWd1cmF0aW9ucyA9IHRoaXMuX2NvbmZpZ3VyYXRpb25zTWFw
OwotCi0gICAgbWFwcGluZ3MuZm9yRWFjaChzZXJpYWxpemVyLm1hcCwgc2VyaWFsaXplcik7Ci0g
ICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaChzZXJpYWxpemVyLmNvbmZpZ3VyZSwgc2VyaWFsaXpl
cik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGBmaW5kKClgIG1ldGhvZCBpcyBpbnZva2VkIHdo
ZW4gdGhlIHN0b3JlIGlzIGFza2VkIGZvciBhIHJlY29yZCB0aGF0Ci0gICAgaGFzIG5vdCBwcmV2
aW91c2x5IGJlZW4gbG9hZGVkLiBJbiByZXNwb25zZSB0byBgZmluZCgpYCBiZWluZyBjYWxsZWQs
IHlvdQotICAgIHNob3VsZCBxdWVyeSB5b3VyIHBlcnNpc3RlbmNlIGxheWVyIGZvciBhIHJlY29y
ZCB3aXRoIHRoZSBnaXZlbiBJRC4gT25jZQotICAgIGZvdW5kLCB5b3UgY2FuIGFzeW5jaHJvbm91
c2x5IGNhbGwgdGhlIHN0b3JlJ3MgYGxvYWQoKWAgbWV0aG9kIHRvIGxvYWQKLSAgICB0aGUgcmVj
b3JkLgotCi0gICAgSGVyZSBpcyBhbiBleGFtcGxlIGBmaW5kYCBpbXBsZW1lbnRhdGlvbjoKLQot
ICAgICAgZmluZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkKSB7Ci0gICAgICAgIHZhciB1cmwg
PSB0eXBlLnVybDsKLSAgICAgICAgdXJsID0gdXJsLmZtdChpZCk7Ci0KLSAgICAgICAgalF1ZXJ5
LmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgICAgICAvLyBkYXRhIGlzIGEg
aGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMuIElmIHlvdXIgc2VydmVyIHJldHVybnMgYQotICAgICAg
ICAgICAgLy8gcm9vdCwgc2ltcGx5IGRvIHNvbWV0aGluZyBsaWtlOgotICAgICAgICAgICAgLy8g
c3RvcmUubG9hZCh0eXBlLCBpZCwgZGF0YS5wZXJzb24pCi0gICAgICAgICAgICBzdG9yZS5sb2Fk
KHR5cGUsIGlkLCBkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICovCi0gIGZpbmQ6IG51
bGwsCi0KLSAgc2VyaWFsaXplcjogRFMuSlNPTlNlcmlhbGl6ZXIsCi0KLSAgcmVnaXN0ZXJUcmFu
c2Zvcm06IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUsIHRyYW5zZm9ybSkgewotICAgIGdldCh0aGlz
LCAnc2VyaWFsaXplcicpLnJlZ2lzdGVyVHJhbnNmb3JtKGF0dHJpYnV0ZVR5cGUsIHRyYW5zZm9y
bSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBwdWJsaWMgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0
byByZWdpc3RlciBhbiBlbnVtZXJhdGVkIAotICAgIHR5cGUgb24geW91ciBhZGFwdGVyLiAgVGhp
cyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gdXRpbGl6ZQotICAgIGEgdGV4dCByZXByZXNlbnRh
dGlvbiBvZiBhbiBpbnRlZ2VyIHZhbHVlLgotCi0gICAgRWc6IFNheSB5b3Ugd2FudCB0byB1dGls
aXplICJsb3ciLCJtZWRpdW0iLCJoaWdoIiB0ZXh0IHN0cmluZ3MKLSAgICBpbiB5b3VyIGFwcCwg
YnV0IHlvdSB3YW50IHRvIHBlcnNpc3QgdGhvc2UgYXMgMCwxLDIgaW4geW91ciBiYWNrZW5kLgot
ICAgIFlvdSB3b3VsZCBmaXJzdCByZWdpc3RlciB0aGUgdHJhbnNmb3JtIG9uIHlvdXIgYWRhcHRl
ciBpbnN0YW5jZToKLQotICAgIGFkYXB0ZXIucmVnaXN0ZXJFbnVtVHJhbnNmb3JtKCdwcmlvcml0
eScsIFsnbG93JywgJ21lZGl1bScsICdoaWdoJ10pOwotCi0gICAgWW91IHdvdWxkIHRoZW4gcmVm
ZXIgdG8gdGhlICdwcmlvcml0eScgRFMuYXR0ciBpbiB5b3VyIG1vZGVsOgotICAgIEFwcC5UYXNr
ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHByaW9yaXR5OiBEUy5hdHRyKCdwcmlvcml0eScp
IAotICAgIH0pOwotCi0gICAgQW5kIGxhc3RseSwgeW91IHdvdWxkIHNldC9nZXQgdGhlIHRleHQg
cmVwcmVzZW50YXRpb24gb24geW91ciBtb2RlbCBpbnN0YW5jZSwKLSAgICBidXQgdGhlIHRyYW5z
Zm9ybWVkIHJlc3VsdCB3aWxsIGJlIHRoZSBpbmRleCBudW1iZXIgb2YgdGhlIHR5cGUuCi0KLSAg
ICBBcHA6ICAgbXlUYXNrLmdldCgncHJpb3JpdHknKSA9PiAnbG93JwotICAgIFNlcnZlciBSZXNw
b25zZSAvIExvYWQ6ICB7IG15VGFzazoge3ByaW9yaXR5OiAwfSB9Ci0KLSAgICBAcGFyYW0ge1N0
cmluZ30gdHlwZSBvZiB0aGUgdHJhbnNmb3JtCi0gICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgb2Yg
U3RyaW5nIG9iamVjdHMgdG8gdXNlIGZvciB0aGUgZW51bWVyYXRlZCB2YWx1ZXMuICAKLSAgICAg
IFRoaXMgaXMgYW4gb3JkZXJlZCBsaXN0IGFuZCB0aGUgaW5kZXggdmFsdWVzIHdpbGwgYmUgdXNl
ZCBmb3IgdGhlIHRyYW5zZm9ybS4KLSAgKi8KLSAgcmVnaXN0ZXJFbnVtVHJhbnNmb3JtOiBmdW5j
dGlvbihhdHRyaWJ1dGVUeXBlLCBvYmplY3RzKSB7Ci0gICAgZ2V0KHRoaXMsICdzZXJpYWxpemVy
JykucmVnaXN0ZXJFbnVtVHJhbnNmb3JtKGF0dHJpYnV0ZVR5cGUsIG9iamVjdHMpOwotICB9LAot
Ci0gIC8qKgotICAgIElmIHRoZSBnbG9iYWxseSB1bmlxdWUgSURzIGZvciB5b3VyIHJlY29yZHMg
c2hvdWxkIGJlIGdlbmVyYXRlZCBvbiB0aGUgY2xpZW50LAotICAgIGltcGxlbWVudCB0aGUgYGdl
bmVyYXRlSWRGb3JSZWNvcmQoKWAgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQK
LSAgICBlYWNoIHRpbWUgeW91IGNyZWF0ZSBhIG5ldyByZWNvcmQsIGFuZCB0aGUgdmFsdWUgcmV0
dXJuZWQgZnJvbSBpdCB3aWxsIGJlCi0gICAgYXNzaWduZWQgdG8gdGhlIHJlY29yZCdzIGBwcmlt
YXJ5S2V5YC4KLQotICAgIE1vc3QgdHJhZGl0aW9uYWwgUkVTVC1saWtlIEhUVFAgQVBJcyB3aWxs
IG5vdCB1c2UgdGhpcyBtZXRob2QuIEluc3RlYWQsIHRoZSBJRAotICAgIG9mIHRoZSByZWNvcmQg
d2lsbCBiZSBzZXQgYnkgdGhlIHNlcnZlciwgYW5kIHlvdXIgYWRhcHRlciB3aWxsIHVwZGF0ZSB0
aGUgc3RvcmUKLSAgICB3aXRoIHRoZSBuZXcgSUQgd2hlbiBpdCBjYWxscyBgZGlkQ3JlYXRlUmVj
b3JkKClgLiBPbmx5IGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZgotICAgIHlvdSBpbnRlbmQgdG8g
Z2VuZXJhdGUgcmVjb3JkIElEcyBvbiB0aGUgY2xpZW50LXNpZGUuCi0KLSAgICBUaGUgYGdlbmVy
YXRlSWRGb3JSZWNvcmQoKWAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSByZXF1ZXN0
aW5nIHN0b3JlIGFzCi0gICAgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgdGhlIG5ld2x5IGNyZWF0
ZWQgcmVjb3JkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyOgotCi0gICAgICAgIGdlbmVyYXRlSWRG
b3JSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCByZWNvcmQpIHsKLSAgICAgICAgICB2YXIgdXVpZCA9
IEFwcC5nZW5lcmF0ZVVVSURXaXRoU3RhdGlzdGljYWxseUxvd09kZHNPZkNvbGxpc2lvbigpOwot
ICAgICAgICAgIHJldHVybiB1dWlkOwotICAgICAgICB9Ci0gICovCi0gIGdlbmVyYXRlSWRGb3JS
ZWNvcmQ6IG51bGwsCi0KLSAgbWF0ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgZGF0YSwgcHJl
bWF0ZXJpYWxpemVkKSB7Ci0gICAgZ2V0KHRoaXMsICdzZXJpYWxpemVyJykubWF0ZXJpYWxpemUo
cmVjb3JkLCBkYXRhLCBwcmVtYXRlcmlhbGl6ZWQpOwotICB9LAotCi0gIHNlcmlhbGl6ZTogZnVu
Y3Rpb24ocmVjb3JkLCBvcHRpb25zKSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAnc2VyaWFsaXpl
cicpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAotCi0gIGV4dHJhY3RJZDogZnVu
Y3Rpb24odHlwZSwgZGF0YSkgewotICAgIHJldHVybiBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5l
eHRyYWN0SWQodHlwZSwgZGF0YSk7Ci0gIH0sCi0KLSAgZ3JvdXBCeVR5cGU6IGZ1bmN0aW9uKGVu
dW1lcmFibGUpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuTWFwV2l0aERlZmF1bHQuY3JlYXRlKHsK
LSAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24oKSB7IHJldHVybiBFbWJlci5PcmRlcmVkU2V0
LmNyZWF0ZSgpOyB9Ci0gICAgfSk7Ci0KLSAgICBlbnVtZXJhYmxlLmZvckVhY2goZnVuY3Rpb24o
aXRlbSkgewotICAgICAgbWFwLmdldChpdGVtLmNvbnN0cnVjdG9yKS5hZGQoaXRlbSk7Ci0gICAg
fSk7Ci0KLSAgICByZXR1cm4gbWFwOwotICB9LAotCi0gIGNvbW1pdDogZnVuY3Rpb24oc3RvcmUs
IGNvbW1pdERldGFpbHMpIHsKLSAgICB0aGlzLnNhdmUoc3RvcmUsIGNvbW1pdERldGFpbHMpOwot
ICB9LAotCi0gIHNhdmU6IGZ1bmN0aW9uKHN0b3JlLCBjb21taXREZXRhaWxzKSB7Ci0gICAgdmFy
IGFkYXB0ZXIgPSB0aGlzOwotCi0gICAgZnVuY3Rpb24gZmlsdGVyKHJlY29yZHMpIHsKLSAgICAg
IHZhciBmaWx0ZXJlZFNldCA9IEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCk7Ci0KLSAgICAgIHJl
Y29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIuc2hv
dWxkU2F2ZShyZWNvcmQpKSB7Ci0gICAgICAgICAgZmlsdGVyZWRTZXQuYWRkKHJlY29yZCk7Ci0g
ICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICByZXR1cm4gZmlsdGVyZWRTZXQ7Ci0gICAgfQot
Ci0gICAgdGhpcy5ncm91cEJ5VHlwZShjb21taXREZXRhaWxzLmNyZWF0ZWQpLmZvckVhY2goZnVu
Y3Rpb24odHlwZSwgc2V0KSB7Ci0gICAgICB0aGlzLmNyZWF0ZVJlY29yZHMoc3RvcmUsIHR5cGUs
IGZpbHRlcihzZXQpKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHRoaXMuZ3JvdXBCeVR5cGUoY29t
bWl0RGV0YWlscy51cGRhdGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUsIHNldCkgewotICAgICAg
dGhpcy51cGRhdGVSZWNvcmRzKHN0b3JlLCB0eXBlLCBmaWx0ZXIoc2V0KSk7Ci0gICAgfSwgdGhp
cyk7Ci0KLSAgICB0aGlzLmdyb3VwQnlUeXBlKGNvbW1pdERldGFpbHMuZGVsZXRlZCkuZm9yRWFj
aChmdW5jdGlvbih0eXBlLCBzZXQpIHsKLSAgICAgIHRoaXMuZGVsZXRlUmVjb3JkcyhzdG9yZSwg
dHlwZSwgZmlsdGVyKHNldCkpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIHNob3VsZFNhdmU6
IEVtYmVyLkssCi0KLSAgY3JlYXRlUmVjb3JkczogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29y
ZHMpIHsKLSAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICB0aGlz
LmNyZWF0ZVJlY29yZChzdG9yZSwgdHlwZSwgcmVjb3JkKTsKLSAgICB9LCB0aGlzKTsKLSAgfSwK
LQotICB1cGRhdGVSZWNvcmRzOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcykgewotICAg
IHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHRoaXMudXBkYXRlUmVj
b3JkKHN0b3JlLCB0eXBlLCByZWNvcmQpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIGRlbGV0
ZVJlY29yZHM6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmRzKSB7Ci0gICAgcmVjb3Jkcy5m
b3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgdGhpcy5kZWxldGVSZWNvcmQoc3RvcmUs
IHR5cGUsIHJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgZmluZE1hbnk6IGZ1bmN0
aW9uKHN0b3JlLCB0eXBlLCBpZHMpIHsKLSAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihpZCkgewot
ICAgICAgdGhpcy5maW5kKHN0b3JlLCB0eXBlLCBpZCk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0KLX0p
OwotCi1EUy5BZGFwdGVyLnJlb3BlbkNsYXNzKHsKLSAgcmVnaXN0ZXJUcmFuc2Zvcm06IGZ1bmN0
aW9uKGF0dHJpYnV0ZVR5cGUsIHRyYW5zZm9ybSkgewotICAgIHZhciByZWdpc3RlcmVkVHJhbnNm
b3JtcyA9IHRoaXMuX3JlZ2lzdGVyZWRUcmFuc2Zvcm1zIHx8IHt9OwotCi0gICAgcmVnaXN0ZXJl
ZFRyYW5zZm9ybXNbYXR0cmlidXRlVHlwZV0gPSB0cmFuc2Zvcm07Ci0KLSAgICB0aGlzLl9yZWdp
c3RlcmVkVHJhbnNmb3JtcyA9IHJlZ2lzdGVyZWRUcmFuc2Zvcm1zOwotICB9LAotCi0gIG1hcDog
RFMuX01hcHBhYmxlLmdlbmVyYXRlTWFwRnVuY3Rpb25Gb3IoJ2F0dHJpYnV0ZXMnLCBmdW5jdGlv
bihrZXksIG5ld1ZhbHVlLCBtYXApIHsKLSAgICB2YXIgZXhpc3RpbmdWYWx1ZSA9IG1hcC5nZXQo
a2V5KTsKLQotICAgIG1lcmdlKGV4aXN0aW5nVmFsdWUsIG5ld1ZhbHVlKTsKLSAgfSksCi0KLSAg
Y29uZmlndXJlOiBEUy5fTWFwcGFibGUuZ2VuZXJhdGVNYXBGdW5jdGlvbkZvcignY29uZmlndXJh
dGlvbnMnLCBmdW5jdGlvbihrZXksIG5ld1ZhbHVlLCBtYXApIHsKLSAgICB2YXIgZXhpc3RpbmdW
YWx1ZSA9IG1hcC5nZXQoa2V5KTsKLQotICAgIC8vIElmIGEgbWFwcGluZyBjb25maWd1cmF0aW9u
IGlzIHByb3ZpZGVkLCBwZWVsIGl0IG9mZiBhbmQgYXBwbHkgaXQKLSAgICAvLyB1c2luZyB0aGUg
RFMuQWRhcHRlci5tYXAgQVBJLgotICAgIHZhciBtYXBwaW5ncyA9IG5ld1ZhbHVlICYmIG5ld1Zh
bHVlLm1hcHBpbmdzOwotICAgIGlmIChtYXBwaW5ncykgewotICAgICAgdGhpcy5tYXAoa2V5LCBt
YXBwaW5ncyk7Ci0gICAgICBkZWxldGUgbmV3VmFsdWUubWFwcGluZ3M7Ci0gICAgfQotCi0gICAg
bWVyZ2UoZXhpc3RpbmdWYWx1ZSwgbmV3VmFsdWUpOwotICB9KSwKLQotICByZXNvbHZlTWFwQ29u
ZmxpY3Q6IGZ1bmN0aW9uKG9sZFZhbHVlLCBuZXdWYWx1ZSwgbWFwcGluZ3NLZXkpIHsKLSAgICBt
ZXJnZShuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCi0gICAgcmV0dXJuIG5ld1ZhbHVlOwotICB9Ci19
KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKLQotRFMuRml4dHVyZVNlcmlhbGl6ZXIgPSBEUy5TZXJpYWxpemVyLmV4
dGVuZCh7Ci0gIGRlc2VyaWFsaXplVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyaWJ1dGVUeXBl
KSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9LAotCi0gIHNlcmlhbGl6ZVZhbHVlOiBmdW5jdGlv
bih2YWx1ZSwgYXR0cmlidXRlVHlwZSkgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfSwKLQotICBh
ZGRJZDogZnVuY3Rpb24oZGF0YSwga2V5LCBpZCkgewotICAgIGRhdGFba2V5XSA9IGlkOwotICB9
LAotCi0gIGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24oaGFzaCwga2V5LCB2YWx1ZSkgewotICAgIGhh
c2hba2V5XSA9IHZhbHVlOwotICB9LAotCi0gIGFkZEJlbG9uZ3NUbzogZnVuY3Rpb24oaGFzaCwg
cmVjb3JkLCBrZXksIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBpZCA9IGdldChyZWNvcmQsIHJl
bGF0aW9uc2hpcC5rZXkrJy5pZCcpOwotICAgIGlmICghRW1iZXIuaXNOb25lKGlkKSkgeyBoYXNo
W2tleV0gPSBpZDsgfQotICB9LAotCi0gIGFkZEhhc01hbnk6IGZ1bmN0aW9uKGhhc2gsIHJlY29y
ZCwga2V5LCByZWxhdGlvbnNoaXApIHsKLSAgICB2YXIgaWRzID0gZ2V0KHJlY29yZCwgcmVsYXRp
b25zaGlwLmtleSkubWFwKGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiBpdGVtLmdldCgn
aWQnKTsKLSAgICB9KTsKLQotICAgIGhhc2hbcmVsYXRpb25zaGlwLmtleV0gPSBpZHM7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIENyZWF0ZXMgYW4gZW1wdHkgaGFzaCB0aGF0
IHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBob29rcyBjYWxsZWQgZnJvbSB0aGUKLSAgICBgc2Vy
aWFsaXplKClgIG1ldGhvZC4KLQotICAgIEByZXR1cm4ge09iamVjdH0KLSAgKi8KLSAgY3JlYXRl
U2VyaWFsaXplZEZvcm06IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB7fTsKLSAgfSwKLQotICBl
eHRyYWN0OiBmdW5jdGlvbihsb2FkZXIsIGZpeHR1cmUsIHR5cGUsIHJlY29yZCkgewotICAgIGlm
IChyZWNvcmQpIHsgbG9hZGVyLnVwZGF0ZUlkKHJlY29yZCwgZml4dHVyZSk7IH0KLSAgICB0aGlz
LmV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlvbihsb2FkZXIsIHR5cGUsIGZpeHR1cmUpOwotICB9
LAotCi0gIGV4dHJhY3RNYW55OiBmdW5jdGlvbihsb2FkZXIsIGZpeHR1cmVzLCB0eXBlLCByZWNv
cmRzKSB7Ci0gICAgdmFyIG9iamVjdHMgPSBmaXh0dXJlcywgcmVmZXJlbmNlcyA9IFtdOwotICAg
IGlmIChyZWNvcmRzKSB7IHJlY29yZHMgPSByZWNvcmRzLnRvQXJyYXkoKTsgfQotCi0gICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAocmVjb3Jk
cykgeyBsb2FkZXIudXBkYXRlSWQocmVjb3Jkc1tpXSwgb2JqZWN0c1tpXSk7IH0KLSAgICAgIHZh
ciByZWZlcmVuY2UgPSB0aGlzLmV4dHJhY3RSZWNvcmRSZXByZXNlbnRhdGlvbihsb2FkZXIsIHR5
cGUsIG9iamVjdHNbaV0pOwotICAgICAgcmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7Ci0gICAg
fQotCi0gICAgbG9hZGVyLnBvcHVsYXRlQXJyYXkocmVmZXJlbmNlcyk7Ci0gIH0sCi0KLSAgZXh0
cmFjdElkOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIHByaW1hcnlLZXkgPSB0aGlz
Ll9wcmltYXJ5S2V5KHR5cGUpOwotCi0gICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHkocHJpbWFy
eUtleSkpIHsKLSAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNvZXJjZSBJRHMgdG8gc3RyaW5ncyBz
byB0aGF0IHJlY29yZAotICAgICAgLy8gSURzIHJlbWFpbiBjb25zaXN0ZW50IGJldHdlZW4gYXBw
bGljYXRpb24gcnVuczsgZXNwZWNpYWxseQotICAgICAgLy8gaWYgdGhlIElEIGlzIHNlcmlhbGl6
ZWQgYW5kIGxhdGVyIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBVUkwsCi0gICAgICAvLyB3aGVuIHR5
cGUgaW5mb3JtYXRpb24gd2lsbCBoYXZlIGJlZW4gbG9zdC4KLSAgICAgIHJldHVybiBoYXNoW3By
aW1hcnlLZXldKycnOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0g
IH0sCi0KLSAgZXh0cmFjdEF0dHJpYnV0ZTogZnVuY3Rpb24odHlwZSwgaGFzaCwgYXR0cmlidXRl
TmFtZSkgewotICAgIHZhciBrZXkgPSB0aGlzLl9rZXlGb3JBdHRyaWJ1dGVOYW1lKHR5cGUsIGF0
dHJpYnV0ZU5hbWUpOwotICAgIHJldHVybiBoYXNoW2tleV07Ci0gIH0sCi0KLSAgZXh0cmFjdEhh
c01hbnk6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIGtleSkgewotICAgIHJldHVybiBoYXNoW2tleV07
Ci0gIH0sCi0KLSAgZXh0cmFjdEJlbG9uZ3NUbzogZnVuY3Rpb24odHlwZSwgaGFzaCwga2V5KSB7
Ci0gICAgcmV0dXJuIGhhc2hba2V5XTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwotCi0v
KioKLSAgYERTLkZpeHR1cmVBZGFwdGVyYCBpcyBhbiBhZGFwdGVyIHRoYXQgbG9hZHMgcmVjb3Jk
cyBmcm9tIG1lbW9yeS4KLSAgSXRzIHByaW1hcmlseSB1c2VkIGZvciBkZXZlbG9wbWVudCBhbmQg
dGVzdGluZy4gWW91IGNhbiBhbHNvIHVzZQotICBgRFMuRml4dHVyZUFkYXB0ZXJgIHdoaWxlIHdv
cmtpbmcgb24gdGhlIEFQSSBidXQgYXJlIG5vdCByZWFkeSB0bwotICBpbnRlZ3JhdGUgeWV0LiBJ
dCBpcyBhIGZ1bGx5IGZ1bmN0aW9uaW5nIGFkYXB0ZXIuIEFsbCBDUlVEIG1ldGhvZHMKLSAgYXJl
IGltcGxlbWVudGVkLiBZb3UgY2FuIGFsc28gaW1wbGVtZW50IHF1ZXJ5IGxvZ2ljIHRoYXQgYSBy
ZW1vdGUKLSAgc3lzdGVtIHdvdWxkIGRvLiBJdHMgcG9zc2libGUgdG8gZG8gZGV2ZWxvcCB5b3Vy
IGVudGlyZSBhcHBsaWNhdGlvbgotICB3aXRoIGBEUy5GaXh0dXJlQWRhcHRlcmAuCi0KLSovCi1E
Uy5GaXh0dXJlQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLQotICBzaW11bGF0ZVJlbW90
ZVJlc3BvbnNlOiB0cnVlLAotCi0gIGxhdGVuY3k6IDUwLAotCi0gIHNlcmlhbGl6ZXI6IERTLkZp
eHR1cmVTZXJpYWxpemVyLAotCi0gIC8qCi0gICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIG9y
ZGVyIHRvIHByb3ZpZGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSB0eXBlCi0gICovCi0gIGZpeHR1
cmVzRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIGlmICh0eXBlLkZJWFRVUkVTKSB7Ci0g
ICAgICB2YXIgZml4dHVyZXMgPSBFbWJlci5BKHR5cGUuRklYVFVSRVMpOwotICAgICAgcmV0dXJu
IGZpeHR1cmVzLm1hcChmdW5jdGlvbihmaXh0dXJlKXsKLSAgICAgICAgaWYoIWZpeHR1cmUuaWQp
ewotICAgICAgICAgIHRocm93IG5ldyBFcnJvcihmbXQoJ3RoZSBpZCBwcm9wZXJ0eSBtdXN0IGJl
IGRlZmluZWQgZm9yIGZpeHR1cmUgJUAnLCBbZml4dHVyZV0pKTsKLSAgICAgICAgfQotICAgICAg
ICBmaXh0dXJlLmlkID0gZml4dHVyZS5pZCArICcnOwotICAgICAgICByZXR1cm4gZml4dHVyZTsK
LSAgICAgIH0pOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSwKLQotICAvKgotICAgIElt
cGxlbWVudCB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byBxdWVyeSBmaXh0dXJlcyBkYXRhCi0gICov
Ci0gIHF1ZXJ5Rml4dHVyZXM6IGZ1bmN0aW9uKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSkgewotICAg
IEVtYmVyLmFzc2VydCgnTm90IGltcGxlbWVudGVkOiBZb3UgbXVzdCBvdmVycmlkZSB0aGUgRFMu
Rml4dHVyZUFkYXB0ZXI6OnF1ZXJ5Rml4dHVyZXMgbWV0aG9kIHRvIHN1cHBvcnQgcXVlcnlpbmcg
dGhlIGZpeHR1cmUgc3RvcmUuJyk7Ci0gIH0sCi0KLSAgdXBkYXRlRml4dHVyZXM6IGZ1bmN0aW9u
KHR5cGUsIGZpeHR1cmUpIHsKLSAgICBpZighdHlwZS5GSVhUVVJFUykgewotICAgICAgdHlwZS5G
SVhUVVJFUyA9IFtdOwotICAgIH0KLQotICAgIHZhciBmaXh0dXJlcyA9IHR5cGUuRklYVFVSRVM7
Ci0KLSAgICB0aGlzLmRlbGV0ZUxvYWRlZEZpeHR1cmUodHlwZSwgZml4dHVyZSk7Ci0KLSAgICBm
aXh0dXJlcy5wdXNoKGZpeHR1cmUpOwotICB9LAotCi0gIC8qCi0gICAgSW1wbGVtZW50IHRoaXMg
bWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUgcHJvdmlkZSBqc29uIGZvciBDUlVEIG1ldGhvZHMK
LSAgKi8KLSAgbW9ja0pTT046IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkgewotICAgIHJldHVybiB0
aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOwotICB9LAotCi0gIC8q
Ci0gICAgQWRhcHRlciBtZXRob2RzCi0gICovCi0gIGdlbmVyYXRlSWRGb3JSZWNvcmQ6IGZ1bmN0
aW9uKHN0b3JlLCByZWNvcmQpIHsKLSAgICByZXR1cm4gRW1iZXIuZ3VpZEZvcihyZWNvcmQpOwot
ICB9LAotCi0gIGZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgewotICAgIHZhciBmaXh0
dXJlcyA9IHRoaXMuZml4dHVyZXNGb3JUeXBlKHR5cGUpLAotICAgICAgICBmaXh0dXJlOwotCi0g
ICAgRW1iZXIud2FybigiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIiAr
IHR5cGUudG9TdHJpbmcoKSwgZml4dHVyZXMpOwotCi0gICAgaWYgKGZpeHR1cmVzKSB7Ci0gICAg
ICBmaXh0dXJlID0gRW1iZXIuQShmaXh0dXJlcykuZmluZFByb3BlcnR5KCdpZCcsIGlkKTsKLSAg
ICB9Ci0KLSAgICBpZiAoZml4dHVyZSkgewotICAgICAgdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwo
ZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMuZGlkRmluZFJlY29yZChzdG9yZSwgdHlwZSwgZml4
dHVyZSwgaWQpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotICB9LAotCi0gIGZpbmRNYW55OiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgaWRzKSB7Ci0gICAgdmFyIGZpeHR1cmVzID0gdGhpcy5maXh0
dXJlc0ZvclR5cGUodHlwZSk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIGZp
eHR1cmVzIGZvciBtb2RlbCB0eXBlICIrdHlwZS50b1N0cmluZygpLCAhIWZpeHR1cmVzKTsKLQot
ICAgIGlmIChmaXh0dXJlcykgewotICAgICAgZml4dHVyZXMgPSBmaXh0dXJlcy5maWx0ZXIoZnVu
Y3Rpb24oaXRlbSkgewotICAgICAgICByZXR1cm4gaWRzLmluZGV4T2YoaXRlbS5pZCkgIT09IC0x
OwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgaWYgKGZpeHR1cmVzKSB7Ci0gICAgICB0aGlzLnNp
bXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5kaWRGaW5kTWFueShz
dG9yZSwgdHlwZSwgZml4dHVyZXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotICB9LAotCi0g
IGZpbmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlKSB7Ci0gICAgdmFyIGZpeHR1cmVzID0gdGhp
cy5maXh0dXJlc0ZvclR5cGUodHlwZSk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBm
aW5kIGZpeHR1cmVzIGZvciBtb2RlbCB0eXBlICIrdHlwZS50b1N0cmluZygpLCAhIWZpeHR1cmVz
KTsKLQotICAgIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgdGhp
cy5kaWRGaW5kQWxsKHN0b3JlLCB0eXBlLCBmaXh0dXJlcyk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0s
Ci0KLSAgZmluZFF1ZXJ5OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcXVlcnksIGFycmF5KSB7Ci0g
ICAgdmFyIGZpeHR1cmVzID0gdGhpcy5maXh0dXJlc0ZvclR5cGUodHlwZSk7Ci0KLSAgICBFbWJl
ci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIGZpeHR1cmVzIGZvciBtb2RlbCB0eXBlICIrdHlwZS50
b1N0cmluZygpLCAhIWZpeHR1cmVzKTsKLQotICAgIGZpeHR1cmVzID0gdGhpcy5xdWVyeUZpeHR1
cmVzKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSk7Ci0KLSAgICBpZiAoZml4dHVyZXMpIHsKLSAgICAg
IHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLmRpZEZp
bmRRdWVyeShzdG9yZSwgdHlwZSwgZml4dHVyZXMsIGFycmF5KTsKLSAgICAgIH0sIHRoaXMpOwot
ICAgIH0KLSAgfSwKLQotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNv
cmQpIHsKLSAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9ja0pTT04odHlwZSwgcmVjb3JkKTsKLQot
ICAgIHRoaXMudXBkYXRlRml4dHVyZXModHlwZSwgZml4dHVyZSk7Ci0KLSAgICB0aGlzLnNpbXVs
YXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuZGlkQ3JlYXRlUmVjb3JkKHN0
b3JlLCB0eXBlLCByZWNvcmQsIGZpeHR1cmUpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIHVw
ZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgIHZhciBmaXh0
dXJlID0gdGhpcy5tb2NrSlNPTih0eXBlLCByZWNvcmQpOwotCi0gICAgdGhpcy51cGRhdGVGaXh0
dXJlcyh0eXBlLCBmaXh0dXJlKTsKLQotICAgIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0
aW9uKCkgewotICAgICAgdGhpcy5kaWRVcGRhdGVSZWNvcmQoc3RvcmUsIHR5cGUsIHJlY29yZCwg
Zml4dHVyZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1vY2tKU09O
KHR5cGUsIHJlY29yZCk7Ci0KLSAgICB0aGlzLmRlbGV0ZUxvYWRlZEZpeHR1cmUodHlwZSwgZml4
dHVyZSk7Ci0KLSAgICB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAg
IHRoaXMuZGlkRGVsZXRlUmVjb3JkKHN0b3JlLCB0eXBlLCByZWNvcmQpOwotICAgIH0sIHRoaXMp
OwotICB9LAotCi0gIC8qCi0gICAgQHByaXZhdGUKLSAgKi8KLSBkZWxldGVMb2FkZWRGaXh0dXJl
OiBmdW5jdGlvbih0eXBlLCByZWNvcmQpIHsKLSAgICB2YXIgaWQgPSB0aGlzLmV4dHJhY3RJZCh0
eXBlLCByZWNvcmQpOwotCi0gICAgdmFyIGV4aXN0aW5nRml4dHVyZSA9IHRoaXMuZmluZEV4aXN0
aW5nRml4dHVyZSh0eXBlLCByZWNvcmQpOwotCi0gICAgaWYoZXhpc3RpbmdGaXh0dXJlKSB7Ci0g
ICAgICB2YXIgaW5kZXggPSB0eXBlLkZJWFRVUkVTLmluZGV4T2YoZXhpc3RpbmdGaXh0dXJlKTsK
LSAgICAgIHR5cGUuRklYVFVSRVMuc3BsaWNlKGluZGV4LCAxKTsKLSAgICAgIHJldHVybiB0cnVl
OwotICAgIH0KLSAgfSwKLQotICBmaW5kRXhpc3RpbmdGaXh0dXJlOiBmdW5jdGlvbih0eXBlLCBy
ZWNvcmQpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsK
LSAgICB2YXIgaWQgPSB0aGlzLmV4dHJhY3RJZCh0eXBlLCByZWNvcmQpOwotCi0gICAgcmV0dXJu
IHRoaXMuZmluZEZpeHR1cmVCeUlkKGZpeHR1cmVzLCBpZCk7Ci0gIH0sCi0KLSAgZmluZEZpeHR1
cmVCeUlkOiBmdW5jdGlvbihmaXh0dXJlcywgaWQpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXM7
Ci0KLSAgICByZXR1cm4gRW1iZXIuQShmaXh0dXJlcykuZmluZChmdW5jdGlvbihyKSB7Ci0gICAg
ICBpZignJytnZXQociwgJ2lkJykgPT09ICcnK2lkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0pOwot
ICB9LAotCi0gIHNpbXVsYXRlUmVtb3RlQ2FsbDogZnVuY3Rpb24oY2FsbGJhY2ssIGNvbnRleHQp
IHsKLSAgICBpZiAoZ2V0KHRoaXMsICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsKLSAgICAg
IC8vIFNjaGVkdWxlIHdpdGggc2V0VGltZW91dAotICAgICAgRW1iZXIucnVuLmxhdGVyKGNvbnRl
eHQsIGNhbGxiYWNrLCBnZXQodGhpcywgJ2xhdGVuY3knKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
IC8vIEFzeW5jaHJvbm91cywgYnV0IGF0IHRoZSBvZiB0aGUgcnVubG9vcCB3aXRoIHplcm8gbGF0
ZW5jeQotICAgICAgRW1iZXIucnVuLm9uY2UoY29udGV4dCwgY2FsbGJhY2spOwotICAgIH0KLSAg
fQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1EUy5SRVNUU2VyaWFsaXplciA9
IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gIGtleUZvckF0dHJpYnV0ZU5hbWU6IGZ1bmN0
aW9uKHR5cGUsIG5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUobmFt
ZSk7Ci0gIH0sCi0KLSAga2V5Rm9yQmVsb25nc1RvOiBmdW5jdGlvbih0eXBlLCBuYW1lKSB7Ci0g
ICAgdmFyIGtleSA9IHRoaXMua2V5Rm9yQXR0cmlidXRlTmFtZSh0eXBlLCBuYW1lKTsKLQotICAg
IGlmICh0aGlzLmVtYmVkZGVkVHlwZSh0eXBlLCBuYW1lKSkgewotICAgICAgcmV0dXJuIGtleTsK
LSAgICB9Ci0KLSAgICByZXR1cm4ga2V5ICsgIl9pZCI7Ci0gIH0sCi0KLSAga2V5Rm9ySGFzTWFu
eTogZnVuY3Rpb24odHlwZSwgbmFtZSkgewotICAgIHZhciBrZXkgPSB0aGlzLmtleUZvckF0dHJp
YnV0ZU5hbWUodHlwZSwgbmFtZSk7Ci0KLSAgICBpZiAodGhpcy5lbWJlZGRlZFR5cGUodHlwZSwg
bmFtZSkpIHsKLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuc2lu
Z3VsYXJpemUoa2V5KSArICJfaWRzIjsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKmdsb2JhbCBqUXVlcnkqLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBF
bWJlci5zZXQsIG1lcmdlID0gRW1iZXIubWVyZ2U7Ci0KLS8qKgotICBUaGUgUkVTVCBhZGFwdGVy
IGFsbG93cyB5b3VyIHN0b3JlIHRvIGNvbW11bmljYXRlIHdpdGggYW4gSFRUUCBzZXJ2ZXIgYnkK
LSAgdHJhbnNtaXR0aW5nIEpTT04gdmlhIFhIUi4gTW9zdCBFbWJlci5qcyBhcHBzIHRoYXQgY29u
c3VtZSBhIEpTT04gQVBJCi0gIHNob3VsZCB1c2UgdGhlIFJFU1QgYWRhcHRlci4KLQotICBUaGlz
IGFkYXB0ZXIgaXMgZGVzaWduZWQgYXJvdW5kIHRoZSBpZGVhIHRoYXQgdGhlIEpTT04gZXhjaGFu
Z2VkIHdpdGgKLSAgdGhlIHNlcnZlciBzaG91bGQgYmUgY29udmVudGlvbmFsLgotCi0gICMjIEpT
T04gU3RydWN0dXJlCi0KLSAgVGhlIFJFU1QgYWRhcHRlciBleHBlY3RzIHRoZSBKU09OIHJldHVy
bmVkIGZyb20geW91ciBzZXJ2ZXIgdG8gZm9sbG93Ci0gIHRoZXNlIGNvbnZlbnRpb25zLgotCi0g
ICMjIyBPYmplY3QgUm9vdAotCi0gIFRoZSBKU09OIHBheWxvYWQgc2hvdWxkIGJlIGFuIG9iamVj
dCB0aGF0IGNvbnRhaW5zIHRoZSByZWNvcmQgaW5zaWRlIGEKLSAgcm9vdCBwcm9wZXJ0eS4gRm9y
IGV4YW1wbGUsIGluIHJlc3BvbnNlIHRvIGEgYEdFVGAgcmVxdWVzdCBmb3IKLSAgYC9wb3N0cy8x
YCwgdGhlIEpTT04gc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAi
cG9zdCI6IHsKLSAgICAgIHRpdGxlOiAiSSdtIFJ1bm5pbmcgdG8gUmVmb3JtIHRoZSBXM0MncyBU
YWciLAotICAgICAgYXV0aG9yOiAiWWVodWRhIEthdHoiCi0gICAgfQotICB9Ci0gIGBgYAotCi0g
ICMjIyBDb252ZW50aW9uYWwgTmFtZXMKLQotICBBdHRyaWJ1dGUgbmFtZXMgaW4geW91ciBKU09O
IHBheWxvYWQgc2hvdWxkIGJlIHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9ucyBvZgotICB0aGUgYXR0
cmlidXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91
IGhhdmUgYSBgUGVyc29uYCBtb2RlbDoKLQotICBgYGBqcwotICBBcHAuUGVyc29uID0gRFMuTW9k
ZWwuZXh0ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGxhc3RO
YW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJpbmcn
KQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlrZSB0
aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAicGVyc29uIjogewotICAgICAgImZpcnN0X25hbWUi
OiAiQmFyYWNrIiwKLSAgICAgICJsYXN0X25hbWUiOiAiT2JhbWEiLAotICAgICAgIm9jY3VwYXRp
b24iOiAiUHJlc2lkZW50IgotICAgIH0KLSAgfQotICBgYGAKLSovCi1EUy5SRVNUQWRhcHRlciA9
IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgYnVsa0NvbW1pdDogZmFsc2UsCi0gIHNpbmNlOiAnc2lu
Y2UnLAotCi0gIHNlcmlhbGl6ZXI6IERTLlJFU1RTZXJpYWxpemVyLAotCi0gIGluaXQ6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0K
LSAgc2hvdWxkU2F2ZTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFyIHJlZmVyZW5jZSA9IGdl
dChyZWNvcmQsICdfcmVmZXJlbmNlJyk7Ci0KLSAgICByZXR1cm4gIXJlZmVyZW5jZS5wYXJlbnQ7
Ci0gIH0sCi0KLSAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7
Ci0gICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBlKHR5cGUpOwotCi0gICAgdmFyIGRhdGEg
PSB7fTsKLSAgICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCB7IGluY2x1ZGVJ
ZDogdHJ1ZSB9KTsKLQotICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QpLCAiUE9TVCIs
IHsKLSAgICAgIGRhdGE6IGRhdGEsCi0gICAgICBjb250ZXh0OiB0aGlzLAotICAgICAgc3VjY2Vz
czogZnVuY3Rpb24oanNvbikgewotICAgICAgICBFbWJlci5ydW4odGhpcywgZnVuY3Rpb24oKXsK
LSAgICAgICAgICB0aGlzLmRpZENyZWF0ZVJlY29yZChzdG9yZSwgdHlwZSwgcmVjb3JkLCBqc29u
KTsKLSAgICAgICAgfSk7Ci0gICAgICB9LAotICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikgewot
ICAgICAgICB0aGlzLmRpZEVycm9yKHN0b3JlLCB0eXBlLCByZWNvcmQsIHhocik7Ci0gICAgICB9
Ci0gICAgfSk7Ci0gIH0sCi0KLSAgZGlydHlSZWNvcmRzRm9yUmVjb3JkQ2hhbmdlOiBmdW5jdGlv
bihkaXJ0eVNldCwgcmVjb3JkKSB7Ci0gICAgdGhpcy5fZGlydHlUcmVlKGRpcnR5U2V0LCByZWNv
cmQpOwotICB9LAotCi0gIGRpcnR5UmVjb3Jkc0Zvckhhc01hbnlDaGFuZ2U6IGZ1bmN0aW9uKGRp
cnR5U2V0LCByZWNvcmQsIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBlbWJlZGRlZFR5cGUgPSBn
ZXQodGhpcywgJ3NlcmlhbGl6ZXInKS5lbWJlZGRlZFR5cGUocmVjb3JkLmNvbnN0cnVjdG9yLCBy
ZWxhdGlvbnNoaXAuc2Vjb25kUmVjb3JkTmFtZSk7Ci0KLSAgICBpZiAoZW1iZWRkZWRUeXBlID09
PSAnYWx3YXlzJykgewotICAgICAgcmVsYXRpb25zaGlwLmNoaWxkUmVmZXJlbmNlLnBhcmVudCA9
IHJlbGF0aW9uc2hpcC5wYXJlbnRSZWZlcmVuY2U7Ci0gICAgICB0aGlzLl9kaXJ0eVRyZWUoZGly
dHlTZXQsIHJlY29yZCk7Ci0gICAgfQotICB9LAotCi0gIF9kaXJ0eVRyZWU6IGZ1bmN0aW9uKGRp
cnR5U2V0LCByZWNvcmQpIHsKLSAgICBkaXJ0eVNldC5hZGQocmVjb3JkKTsKLQotICAgIGdldCh0
aGlzLCAnc2VyaWFsaXplcicpLmVhY2hFbWJlZGRlZFJlY29yZChyZWNvcmQsIGZ1bmN0aW9uKGVt
YmVkZGVkUmVjb3JkLCBlbWJlZGRlZFR5cGUpIHsKLSAgICAgIGlmIChlbWJlZGRlZFR5cGUgIT09
ICdhbHdheXMnKSB7IHJldHVybjsgfQotICAgICAgaWYgKGRpcnR5U2V0LmhhcyhlbWJlZGRlZFJl
Y29yZCkpIHsgcmV0dXJuOyB9Ci0gICAgICB0aGlzLl9kaXJ0eVRyZWUoZGlydHlTZXQsIGVtYmVk
ZGVkUmVjb3JkKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHZhciByZWZlcmVuY2UgPSByZWNvcmQu
Z2V0KCdfcmVmZXJlbmNlJyk7Ci0KLSAgICBpZiAocmVmZXJlbmNlLnBhcmVudCkgewotICAgICAg
dmFyIHN0b3JlID0gZ2V0KHJlY29yZCwgJ3N0b3JlJyk7Ci0gICAgICB2YXIgcGFyZW50ID0gc3Rv
cmUucmVjb3JkRm9yUmVmZXJlbmNlKHJlZmVyZW5jZS5wYXJlbnQpOwotICAgICAgdGhpcy5fZGly
dHlUcmVlKGRpcnR5U2V0LCBwYXJlbnQpOwotICAgIH0KLSAgfSwKLQotICBjcmVhdGVSZWNvcmRz
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkcykgewotICAgIGlmIChnZXQodGhpcywgJ2J1
bGtDb21taXQnKSA9PT0gZmFsc2UpIHsKLSAgICAgIHJldHVybiB0aGlzLl9zdXBlcihzdG9yZSwg
dHlwZSwgcmVjb3Jkcyk7Ci0gICAgfQotCi0gICAgdmFyIHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBl
KHR5cGUpLAotICAgICAgICBwbHVyYWwgPSB0aGlzLnBsdXJhbGl6ZShyb290KTsKLQotICAgIHZh
ciBkYXRhID0ge307Ci0gICAgZGF0YVtwbHVyYWxdID0gW107Ci0gICAgcmVjb3Jkcy5mb3JFYWNo
KGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgZGF0YVtwbHVyYWxdLnB1c2godGhpcy5zZXJpYWxp
emUocmVjb3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KSk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB0
aGlzLmFqYXgodGhpcy5idWlsZFVSTChyb290KSwgIlBPU1QiLCB7Ci0gICAgICBkYXRhOiBkYXRh
LAotICAgICAgY29udGV4dDogdGhpcywKLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsK
LSAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgdGhpcy5kaWRD
cmVhdGVSZWNvcmRzKHN0b3JlLCB0eXBlLCByZWNvcmRzLCBqc29uKTsKLSAgICAgICAgfSk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgdXBkYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0gICAgdmFy
IHJvb3QgPSB0aGlzLnJvb3RGb3JUeXBlKHR5cGUpOwotCi0gICAgdmFyIGRhdGEgPSB7fTsKLSAg
ICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxpemUocmVjb3JkKTsKLQotICAgIHRoaXMuYWpheCh0
aGlzLmJ1aWxkVVJMKHJvb3QsIGlkKSwgIlBVVCIsIHsKLSAgICAgIGRhdGE6IGRhdGEsCi0gICAg
ICBjb250ZXh0OiB0aGlzLAotICAgICAgc3VjY2VzczogZnVuY3Rpb24oanNvbikgewotICAgICAg
ICBFbWJlci5ydW4odGhpcywgZnVuY3Rpb24oKXsKLSAgICAgICAgICB0aGlzLmRpZFNhdmVSZWNv
cmQoc3RvcmUsIHR5cGUsIHJlY29yZCwganNvbik7Ci0gICAgICAgIH0pOwotICAgICAgfSwKLSAg
ICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsKLSAgICAgICAgdGhpcy5kaWRFcnJvcihzdG9yZSwg
dHlwZSwgcmVjb3JkLCB4aHIpOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIHVwZGF0ZVJl
Y29yZHM6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmRzKSB7Ci0gICAgaWYgKGdldCh0aGlz
LCAnYnVsa0NvbW1pdCcpID09PSBmYWxzZSkgewotICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHN0
b3JlLCB0eXBlLCByZWNvcmRzKTsKLSAgICB9Ci0KLSAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZv
clR5cGUodHlwZSksCi0gICAgICAgIHBsdXJhbCA9IHRoaXMucGx1cmFsaXplKHJvb3QpOwotCi0g
ICAgdmFyIGRhdGEgPSB7fTsKLSAgICBkYXRhW3BsdXJhbF0gPSBbXTsKLSAgICByZWNvcmRzLmZv
ckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBkYXRhW3BsdXJhbF0ucHVzaCh0aGlzLnNl
cmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pKTsKLSAgICB9LCB0aGlzKTsKLQot
ICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QsICJidWxrIiksICJQVVQiLCB7Ci0gICAg
ICBkYXRhOiBkYXRhLAotICAgICAgY29udGV4dDogdGhpcywKLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0
aW9uKGpzb24pIHsKLSAgICAgICAgRW1iZXIucnVuKHRoaXMsIGZ1bmN0aW9uKCl7Ci0gICAgICAg
ICAgdGhpcy5kaWRTYXZlUmVjb3JkcyhzdG9yZSwgdHlwZSwgcmVjb3JkcywganNvbik7Ci0gICAg
ICAgIH0pOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIGRlbGV0ZVJlY29yZDogZnVuY3Rp
b24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgIHZhciBpZCA9IGdldChyZWNvcmQsICdpZCcp
OwotICAgIHZhciByb290ID0gdGhpcy5yb290Rm9yVHlwZSh0eXBlKTsKLQotICAgIHRoaXMuYWph
eCh0aGlzLmJ1aWxkVVJMKHJvb3QsIGlkKSwgIkRFTEVURSIsIHsKLSAgICAgIGNvbnRleHQ6IHRo
aXMsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7Ci0gICAgICAgIEVtYmVyLnJ1bih0
aGlzLCBmdW5jdGlvbigpewotICAgICAgICAgIHRoaXMuZGlkU2F2ZVJlY29yZChzdG9yZSwgdHlw
ZSwgcmVjb3JkLCBqc29uKTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0K
LSAgZGVsZXRlUmVjb3JkczogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZHMpIHsKLSAgICBp
ZiAoZ2V0KHRoaXMsICdidWxrQ29tbWl0JykgPT09IGZhbHNlKSB7Ci0gICAgICByZXR1cm4gdGhp
cy5fc3VwZXIoc3RvcmUsIHR5cGUsIHJlY29yZHMpOwotICAgIH0KLQotICAgIHZhciByb290ID0g
dGhpcy5yb290Rm9yVHlwZSh0eXBlKSwKLSAgICAgICAgcGx1cmFsID0gdGhpcy5wbHVyYWxpemUo
cm9vdCksCi0gICAgICAgIHNlcmlhbGl6ZXIgPSBnZXQodGhpcywgJ3NlcmlhbGl6ZXInKTsKLQot
ICAgIHZhciBkYXRhID0ge307Ci0gICAgZGF0YVtwbHVyYWxdID0gW107Ci0gICAgcmVjb3Jkcy5m
b3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgZGF0YVtwbHVyYWxdLnB1c2goc2VyaWFs
aXplci5zZXJpYWxpemVJZCggZ2V0KHJlY29yZCwgJ2lkJykgKSk7Ci0gICAgfSk7Ci0KLSAgICB0
aGlzLmFqYXgodGhpcy5idWlsZFVSTChyb290LCAnYnVsaycpLCAiREVMRVRFIiwgewotICAgICAg
ZGF0YTogZGF0YSwKLSAgICAgIGNvbnRleHQ6IHRoaXMsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlv
bihqc29uKSB7Ci0gICAgICAgIEVtYmVyLnJ1bih0aGlzLCBmdW5jdGlvbigpewotICAgICAgICAg
IHRoaXMuZGlkU2F2ZVJlY29yZHMoc3RvcmUsIHR5cGUsIHJlY29yZHMsIGpzb24pOwotICAgICAg
ICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfSwKLQotICBmaW5kOiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgaWQpIHsKLSAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZvclR5cGUodHlwZSk7Ci0KLSAg
ICB0aGlzLmFqYXgodGhpcy5idWlsZFVSTChyb290LCBpZCksICJHRVQiLCB7Ci0gICAgICBzdWNj
ZXNzOiBmdW5jdGlvbihqc29uKSB7Ci0gICAgICAgIEVtYmVyLnJ1bih0aGlzLCBmdW5jdGlvbigp
ewotICAgICAgICAgIHRoaXMuZGlkRmluZFJlY29yZChzdG9yZSwgdHlwZSwganNvbiwgaWQpOwot
ICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfSwKLQotICBmaW5kQWxsOiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgc2luY2UpIHsKLSAgICB2YXIgcm9vdCA9IHRoaXMucm9vdEZvclR5cGUo
dHlwZSk7Ci0KLSAgICB0aGlzLmFqYXgodGhpcy5idWlsZFVSTChyb290KSwgIkdFVCIsIHsKLSAg
ICAgIGRhdGE6IHRoaXMuc2luY2VRdWVyeShzaW5jZSksCi0gICAgICBzdWNjZXNzOiBmdW5jdGlv
bihqc29uKSB7Ci0gICAgICAgIEVtYmVyLnJ1bih0aGlzLCBmdW5jdGlvbigpewotICAgICAgICAg
IHRoaXMuZGlkRmluZEFsbChzdG9yZSwgdHlwZSwganNvbik7Ci0gICAgICAgIH0pOwotICAgICAg
fQotICAgIH0pOwotICB9LAotCi0gIGZpbmRRdWVyeTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHF1
ZXJ5LCByZWNvcmRBcnJheSkgewotICAgIHZhciByb290ID0gdGhpcy5yb290Rm9yVHlwZSh0eXBl
KTsKLQotICAgIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHJvb3QpLCAiR0VUIiwgewotICAgICAg
ZGF0YTogcXVlcnksCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7Ci0gICAgICAgIEVt
YmVyLnJ1bih0aGlzLCBmdW5jdGlvbigpewotICAgICAgICAgIHRoaXMuZGlkRmluZFF1ZXJ5KHN0
b3JlLCB0eXBlLCBqc29uLCByZWNvcmRBcnJheSk7Ci0gICAgICAgIH0pOwotICAgICAgfQotICAg
IH0pOwotICB9LAotCi0gIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWRzLCBvd25l
cikgewotICAgIHZhciByb290ID0gdGhpcy5yb290Rm9yVHlwZSh0eXBlKTsKLSAgICBpZHMgPSB0
aGlzLnNlcmlhbGl6ZUlkcyhpZHMpOwotCi0gICAgdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwocm9v
dCksICJHRVQiLCB7Ci0gICAgICBkYXRhOiB7aWRzOiBpZHN9LAotICAgICAgc3VjY2VzczogZnVu
Y3Rpb24oanNvbikgewotICAgICAgICBFbWJlci5ydW4odGhpcywgZnVuY3Rpb24oKXsKLSAgICAg
ICAgICB0aGlzLmRpZEZpbmRNYW55KHN0b3JlLCB0eXBlLCBqc29uKTsKLSAgICAgICAgfSk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLQotICAgIFRoaXMg
bWV0aG9kIHNlcmlhbGl6ZXMgYSBsaXN0IG9mIElEcyB1c2luZyBgc2VyaWFsaXplSWRgCi0KLSAg
ICBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIHNlcmlhbGl6ZWQgSURzCi0gICovCi0gIHNl
cmlhbGl6ZUlkczogZnVuY3Rpb24oaWRzKSB7Ci0gICAgdmFyIHNlcmlhbGl6ZXIgPSBnZXQodGhp
cywgJ3NlcmlhbGl6ZXInKTsKLQotICAgIHJldHVybiBFbWJlci5FbnVtZXJhYmxlVXRpbHMubWFw
KGlkcywgZnVuY3Rpb24oaWQpIHsKLSAgICAgIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZUlk
KGlkKTsKLSAgICB9KTsKLSAgfSwKLQotICBkaWRFcnJvcjogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IHJlY29yZCwgeGhyKSB7Ci0gICAgaWYgKHhoci5zdGF0dXMgPT09IDQyMikgewotICAgICAgdmFy
IGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwotICAgICAgc3RvcmUucmVjb3Jk
V2FzSW52YWxpZChyZWNvcmQsIGRhdGFbJ2Vycm9ycyddKTsKLSAgICB9IGVsc2UgewotICAgICAg
dGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB9Ci0gIH0sCi0KLSAgYWph
eDogZnVuY3Rpb24odXJsLCB0eXBlLCBoYXNoKSB7Ci0gICAgaGFzaC51cmwgPSB1cmw7Ci0gICAg
aGFzaC50eXBlID0gdHlwZTsKLSAgICBoYXNoLmRhdGFUeXBlID0gJ2pzb24nOwotICAgIGhhc2gu
Y29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCc7Ci0gICAgaGFz
aC5jb250ZXh0ID0gdGhpczsKLQotICAgIGlmIChoYXNoLmRhdGEgJiYgdHlwZSAhPT0gJ0dFVCcp
IHsKLSAgICAgIGhhc2guZGF0YSA9IEpTT04uc3RyaW5naWZ5KGhhc2guZGF0YSk7Ci0gICAgfQot
Ci0gICAgalF1ZXJ5LmFqYXgoaGFzaCk7Ci0gIH0sCi0KLSAgdXJsOiAiIiwKLQotICByb290Rm9y
VHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHZhciBzZXJpYWxpemVyID0gZ2V0KHRoaXMsICdz
ZXJpYWxpemVyJyk7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZXIucm9vdEZvclR5cGUodHlwZSk7Ci0g
IH0sCi0KLSAgcGx1cmFsaXplOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICB2YXIgc2VyaWFsaXpl
ciA9IGdldCh0aGlzLCAnc2VyaWFsaXplcicpOwotICAgIHJldHVybiBzZXJpYWxpemVyLnBsdXJh
bGl6ZShzdHJpbmcpOwotICB9LAotCi0gIGJ1aWxkVVJMOiBmdW5jdGlvbihyZWNvcmQsIHN1ZmZp
eCkgewotICAgIHZhciB1cmwgPSBbdGhpcy51cmxdOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJOYW1l
c3BhY2UgVVJMICgiICsgdGhpcy5uYW1lc3BhY2UgKyAiKSBtdXN0IG5vdCBzdGFydCB3aXRoIHNs
YXNoIiwgIXRoaXMubmFtZXNwYWNlIHx8IHRoaXMubmFtZXNwYWNlLnRvU3RyaW5nKCkuY2hhckF0
KDApICE9PSAiLyIpOwotICAgIEVtYmVyLmFzc2VydCgiUmVjb3JkIFVSTCAoIiArIHJlY29yZCAr
ICIpIG11c3Qgbm90IHN0YXJ0IHdpdGggc2xhc2giLCAhcmVjb3JkIHx8IHJlY29yZC50b1N0cmlu
ZygpLmNoYXJBdCgwKSAhPT0gIi8iKTsKLSAgICBFbWJlci5hc3NlcnQoIlVSTCBzdWZmaXggKCIg
KyBzdWZmaXggKyAiKSBtdXN0IG5vdCBzdGFydCB3aXRoIHNsYXNoIiwgIXN1ZmZpeCB8fCBzdWZm
aXgudG9TdHJpbmcoKS5jaGFyQXQoMCkgIT09ICIvIik7Ci0KLSAgICBpZiAodGhpcy5uYW1lc3Bh
Y2UgIT09IHVuZGVmaW5lZCkgewotICAgICAgdXJsLnB1c2godGhpcy5uYW1lc3BhY2UpOwotICAg
IH0KLQotICAgIHVybC5wdXNoKHRoaXMucGx1cmFsaXplKHJlY29yZCkpOwotICAgIGlmIChzdWZm
aXggIT09IHVuZGVmaW5lZCkgewotICAgICAgdXJsLnB1c2goc3VmZml4KTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gdXJsLmpvaW4oIi8iKTsKLSAgfSwKLQotICBzaW5jZVF1ZXJ5OiBmdW5jdGlvbihz
aW5jZSkgewotICAgIHZhciBxdWVyeSA9IHt9OwotICAgIHF1ZXJ5W2dldCh0aGlzLCAnc2luY2Un
KV0gPSBzaW5jZTsKLSAgICByZXR1cm4gc2luY2UgPyBxdWVyeSA6IG51bGw7Ci0gIH0KLX0pOwot
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgY2FtZWxpemUgPSBFbWJlci5TdHJp
bmcuY2FtZWxpemUsCi0gICAgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHJlZ2lzdGVyZWRUcmFuc2Zv
cm1zOwotCi12YXIgcGFzc3RocnVUcmFuc2Zvcm0gPSB7Ci0gIHNlcmlhbGl6ZTogZnVuY3Rpb24o
dmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAotICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24odmFsdWUp
IHsgcmV0dXJuIHZhbHVlOyB9Ci19OwotCi12YXIgZGVmYXVsdFRyYW5zZm9ybXMgPSB7Ci0gIHN0
cmluZzogcGFzc3RocnVUcmFuc2Zvcm0sCi0gIGJvb2xlYW46IHBhc3N0aHJ1VHJhbnNmb3JtLAot
ICBudW1iZXI6IHBhc3N0aHJ1VHJhbnNmb3JtCi19OwotCi1mdW5jdGlvbiBjYW1lbGl6ZUtleXMo
anNvbikgewotICB2YXIgdmFsdWU7Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBqc29uKSB7Ci0gICAg
dmFsdWUgPSBqc29uW3Byb3BdOwotICAgIGRlbGV0ZSBqc29uW3Byb3BdOwotICAgIGpzb25bY2Ft
ZWxpemUocHJvcCldID0gdmFsdWU7Ci0gIH0KLX0KLQotZnVuY3Rpb24gbXVuZ2UoanNvbiwgY2Fs
bGJhY2spIHsKLSAgY2FsbGJhY2soanNvbik7Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5VHJhbnNmb3Jt
cyhqc29uLCB0eXBlLCB0cmFuc2Zvcm1UeXBlKSB7Ci0gIHZhciB0cmFuc2Zvcm1zID0gcmVnaXN0
ZXJlZFRyYW5zZm9ybXNbdHJhbnNmb3JtVHlwZV07Ci0KLSAgRW1iZXIuYXNzZXJ0KCJZb3UgYXJl
IHRyeWluZyB0byBhcHBseSB0aGUgJyIgKyB0cmFuc2Zvcm1UeXBlICsgIicgdHJhbnNmb3Jtcywg
YnV0IHlvdSBkaWRuJ3QgcmVnaXN0ZXIgYW55IHRyYW5zZm9ybXMgd2l0aCB0aGF0IG5hbWUiLCB0
cmFuc2Zvcm1zKTsKLQotICBnZXQodHlwZSwgJ2F0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9u
KG5hbWUsIGF0dHJpYnV0ZSkgewotICAgIHZhciBhdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlLnR5
cGUsCi0gICAgICAgIHZhbHVlID0ganNvbltuYW1lXTsKLQotICAgIHZhciB0cmFuc2Zvcm0gPSB0
cmFuc2Zvcm1zW2F0dHJpYnV0ZVR5cGVdIHx8IGRlZmF1bHRUcmFuc2Zvcm1zW2F0dHJpYnV0ZVR5
cGVdOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3VyIG1vZGVsIHNwZWNpZmllZCB0aGUgJyIgKyBh
dHRyaWJ1dGVUeXBlICsgIicgdHlwZSBmb3IgdGhlICciICsgbmFtZSArICInIGF0dHJpYnV0ZSwg
YnV0IG5vIHRyYW5zZm9ybSBmb3IgdGhhdCB0eXBlIHdhcyByZWdpc3RlcmVkIiwgdHJhbnNmb3Jt
KTsKLQotICAgIGpzb25bbmFtZV0gPSB0cmFuc2Zvcm0uZGVzZXJpYWxpemUodmFsdWUpOwotICB9
KTsKLX0KLQotZnVuY3Rpb24gT2JqZWN0UHJvY2Vzc29yKGpzb24sIHR5cGUsIHN0b3JlKSB7Ci0g
IHRoaXMuanNvbiA9IGpzb247Ci0gIHRoaXMudHlwZSA9IHR5cGU7Ci0gIHRoaXMuc3RvcmUgPSBz
dG9yZTsKLX0KLQotT2JqZWN0UHJvY2Vzc29yLnByb3RvdHlwZSA9IHsKLSAgbG9hZDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5zdG9yZS5sb2FkKHRoaXMudHlwZSwge30sIHRoaXMuanNvbik7Ci0g
IH0sCi0KLSAgY2FtZWxpemVLZXlzOiBmdW5jdGlvbigpIHsKLSAgICBjYW1lbGl6ZUtleXModGhp
cy5qc29uKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBtdW5nZTogZnVuY3Rpb24oY2Fs
bGJhY2spIHsKLSAgICBtdW5nZSh0aGlzLmpzb24sIGNhbGxiYWNrKTsKLSAgICByZXR1cm4gdGhp
czsKLSAgfSwKLQotICBhcHBseVRyYW5zZm9ybXM6IGZ1bmN0aW9uKHRyYW5zZm9ybVR5cGUpIHsK
LSAgICBhcHBseVRyYW5zZm9ybXModGhpcy5qc29uLCB0aGlzLnR5cGUsIHRyYW5zZm9ybVR5cGUp
OwotICAgIHJldHVybiB0aGlzOwotICB9Ci19OwotCi1mdW5jdGlvbiBwcm9jZXNzb3JGYWN0b3J5
KHN0b3JlLCB0eXBlKSB7Ci0gIHJldHVybiBmdW5jdGlvbihqc29uKSB7Ci0gICAgcmV0dXJuIG5l
dyBPYmplY3RQcm9jZXNzb3IoanNvbiwgdHlwZSwgc3RvcmUpOwotICB9OwotfQotCi1mdW5jdGlv
biBBcnJheVByb2Nlc3Nvcihqc29uLCB0eXBlLCBhcnJheSwgc3RvcmUpIHsKLSAgdGhpcy5qc29u
ID0ganNvbjsKLSAgdGhpcy50eXBlID0gdHlwZTsKLSAgdGhpcy5hcnJheSA9IGFycmF5OwotICB0
aGlzLnN0b3JlID0gc3RvcmU7Ci19Ci0KLUFycmF5UHJvY2Vzc29yLnByb3RvdHlwZSA9IHsKLSAg
bG9hZDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZSwKLSAgICAgICAg
dHlwZSA9IHRoaXMudHlwZTsKLQotICAgIHZhciByZWZlcmVuY2VzID0gdGhpcy5qc29uLm1hcChm
dW5jdGlvbihvYmplY3QpIHsKLSAgICAgIHJldHVybiBzdG9yZS5sb2FkKHR5cGUsIHt9LCBvYmpl
Y3QpOwotICAgIH0pOwotCi0gICAgdGhpcy5hcnJheS5sb2FkKHJlZmVyZW5jZXMpOwotICB9LAot
Ci0gIGNhbWVsaXplS2V5czogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5qc29uLmZvckVhY2goY2Ft
ZWxpemVLZXlzKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBtdW5nZTogZnVuY3Rpb24o
Y2FsbGJhY2spIHsKLSAgICB0aGlzLmpzb24uZm9yRWFjaChmdW5jdGlvbihvYmplY3QpIHsKLSAg
ICAgIG11bmdlKG9iamVjdCwgY2FsbGJhY2spOwotICAgIH0pOwotICAgIHJldHVybiB0aGlzOwot
ICB9LAotCi0gIGFwcGx5VHJhbnNmb3JtczogZnVuY3Rpb24odHJhbnNmb3JtVHlwZSkgewotICAg
IHZhciB0eXBlID0gdGhpcy50eXBlOwotCi0gICAgdGhpcy5qc29uLmZvckVhY2goZnVuY3Rpb24o
b2JqZWN0KSB7Ci0gICAgICBhcHBseVRyYW5zZm9ybXMob2JqZWN0LCB0eXBlLCB0cmFuc2Zvcm1U
eXBlKTsKLSAgICB9KTsKLQotICAgIHJldHVybiB0aGlzOwotICB9Ci19OwotCi1mdW5jdGlvbiBh
cnJheVByb2Nlc3NvckZhY3Rvcnkoc3RvcmUsIHR5cGUsIGFycmF5KSB7Ci0gIHJldHVybiBmdW5j
dGlvbihqc29uKSB7Ci0gICAgcmV0dXJuIG5ldyBBcnJheVByb2Nlc3Nvcihqc29uLCB0eXBlLCBh
cnJheSwgc3RvcmUpOwotICB9OwotfQotCi1EUy5CYXNpY0FkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4
dGVuZCh7Ci0gIGZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgewotICAgIHZhciBzeW5j
ID0gdHlwZS5zeW5jOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgYXJlIHRyeWluZyB0byB1c2Ug
dGhlIEJhc2ljQWRhcHRlciB0byBmaW5kIGlkICciICsgaWQgKyAiJyBvZiAiICsgdHlwZSArICIg
YnV0ICIgKyB0eXBlICsgIi5zeW5jIHdhcyBub3QgZm91bmQiLCBzeW5jKTsKLSAgICBFbWJlci5h
c3NlcnQoIlRoZSBzeW5jIGNvZGUgb24gIiArIHR5cGUgKyAiIGRvZXMgbm90IGltcGxlbWVudCBm
aW5kKCksIGJ1dCB5b3UgYXJlIHRyeWluZyB0byBmaW5kIGlkICciICsgaWQgKyAiJy4iLCBzeW5j
LmZpbmQpOwotCi0gICAgc3luYy5maW5kKGlkLCBwcm9jZXNzb3JGYWN0b3J5KHN0b3JlLCB0eXBl
KSk7Ci0gIH0sCi0KLSAgZmluZFF1ZXJ5OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcXVlcnksIHJl
Y29yZEFycmF5KSB7Ci0gICAgdmFyIHN5bmMgPSB0eXBlLnN5bmM7Ci0KLSAgICBFbWJlci5hc3Nl
cnQoIllvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGUgQmFzaWNBZGFwdGVyIHRvIHF1ZXJ5ICIgKyB0
eXBlICsgIiBidXQgIiArIHR5cGUgKyAiLnN5bmMgd2FzIG5vdCBmb3VuZCIsIHN5bmMpOwotICAg
IEVtYmVyLmFzc2VydCgiVGhlIHN5bmMgY29kZSBvbiAiICsgdHlwZSArICIgZG9lcyBub3QgaW1w
bGVtZW50IHF1ZXJ5KCksIGJ1dCB5b3UgYXJlIHRyeWluZyB0byBxdWVyeSAiICsgdHlwZSArICIu
Iiwgc3luYy5xdWVyeSk7Ci0KLSAgICBzeW5jLnF1ZXJ5KHF1ZXJ5LCBhcnJheVByb2Nlc3NvckZh
Y3Rvcnkoc3RvcmUsIHR5cGUsIHJlY29yZEFycmF5KSk7Ci0gIH0KLX0pOwotCi1EUy5yZWdpc3Rl
clRyYW5zZm9ybXMgPSBmdW5jdGlvbihraW5kLCBvYmplY3QpIHsKLSAgcmVnaXN0ZXJlZFRyYW5z
Zm9ybXNba2luZF0gPSBvYmplY3Q7Ci19OwotCi1EUy5jbGVhclRyYW5zZm9ybXMgPSBmdW5jdGlv
bigpIHsKLSAgcmVnaXN0ZXJlZFRyYW5zZm9ybXMgPSB7fTsKLX07Ci0KLURTLmNsZWFyVHJhbnNm
b3JtcygpOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLy9Db3B5cmlnaHQgKEMpIDIwMTEgYnkgTGl2aW5nIFNvY2lhbCwgSW5jLgot
Ci0vL1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg
cGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKLS8vdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRl
ZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KLS8vdGhl
IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp
b24gdGhlIHJpZ2h0cyB0bwotLy91c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRp
c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwotLy9vZiB0aGUgU29mdHdh
cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNo
ZWQgdG8gZG8KLS8vc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0v
L1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNo
YWxsIGJlIGluY2x1ZGVkIGluIGFsbAotLy9jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMg
b2YgdGhlIFNvZnR3YXJlLgotCi0vL1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX
SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0vL0lNUExJRUQsIElOQ0xV
RElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
LAotLy9GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5U
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLS8vQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBC
RSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotLy9MSUFCSUxJVFksIFdI
RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO
RyBGUk9NLAotLy9PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU
SEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotLy9TT0ZUV0FSRS4KLQotfSkoKTsKLQpk
aWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9tb2RlbHMvc3RvcmUuanMgYi9Q
ZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy9zdG9yZS5qcwpkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggOTFjNWY1MWUyZjE5ZGQzMWRhNGUxNWVlZWJhM2RmZDBiY2NlMzcwYi4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5j
ZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL2pzL21vZGVscy9zdG9yZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDExICsw
LDAgQEAKLS8qZ2xvYmFsIFRvZG9zIERTICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlN0b3Jl
ID0gRFMuU3RvcmUuZXh0ZW5kKHsKLSAgICByZXZpc2lvbjogMTIsCi0gICAgYWRhcHRlcjogJ1Rv
ZG9zLkxTQWRhcHRlcicKLX0pOwotCi1Ub2Rvcy5MU0FkYXB0ZXIgPSBEUy5MU0FkYXB0ZXIuZXh0
ZW5kKHsKLSAgICBuYW1lc3BhY2U6ICd0b2Rvcy1lbWJlcmpzJwotfSk7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy9tb2RlbHMvdG9kby5qcwppbmRleCBkMzYzNzkxMzY1ZDY1MmY4YTk3NTZmYzhi
OTMyZDIzNDgyNWUxOTc5Li5jMTkxMjAyZDEwMGY3YWUzYWE1ZWZiNDEwNGY2ZWRmMzdhYjY1Y2Yw
IDEwMDY0NAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3RvZG8uanMKQEAgLTEsMTMgKzEs
NyBAQAotLypnbG9iYWwgVG9kb3MgRFMgRW1iZXIgKi8KKy8qZ2xvYmFsIFRvZG9zLCBEUyAqLwog
J3VzZSBzdHJpY3QnOwogCiBUb2Rvcy5Ub2RvID0gRFMuTW9kZWwuZXh0ZW5kKHsKICAgICB0aXRs
ZTogRFMuYXR0cignc3RyaW5nJyksCi0gICAgaXNDb21wbGV0ZWQ6IERTLmF0dHIoJ2Jvb2xlYW4n
KSwKLQotICAgIHRvZG9EaWRDaGFuZ2U6IGZ1bmN0aW9uICgpIHsKLSAgICBFbWJlci5ydW4ub25j
ZSh0aGlzLCBmdW5jdGlvbiAoKSB7Ci0gICAgdGhpcy5nZXQoJ3N0b3JlJykuY29tbWl0KCk7Ci0g
ICAgfSk7Ci0gICAgfS5vYnNlcnZlcygnaXNDb21wbGV0ZWQnLCAndGl0bGUnKQorICAgIGlzQ29t
cGxldGVkOiBEUy5hdHRyKCdib29sZWFuJykKIH0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VU
ZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9qcy9yb3V0ZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNo
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3JvdXRl
ci5qcwppbmRleCBkMTQ1OTc3MDc1NWEyYWI1NWUzYzNmNzg0ZjdmMDk3NmNiYzE5NzczLi4yMDNm
NjI5YjA0NTEzOWUxMWM5NGRhMDhiZDQyY2IyMmNhMzVlNjAwIDEwMDY0NAotLS0gYS9QZXJmb3Jt
YW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2pzL3JvdXRlci5qcworKysgYi9QZXJmb3JtYW5jZVRlc3RzL0RvWW91
RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2pzL3JvdXRlci5qcwpAQCAtMSw0NiArMSw0MSBAQAotLypnbG9iYWwgVG9kb3MgRW1iZXIgKi8K
Ky8qZ2xvYmFsIEVtYmVyLCBUb2RvcyAqLwogJ3VzZSBzdHJpY3QnOwogCiBUb2Rvcy5Sb3V0ZXIu
bWFwKGZ1bmN0aW9uICgpIHsKICAgICB0aGlzLnJlc291cmNlKCd0b2RvcycsIHsgcGF0aDogJy8n
IH0sIGZ1bmN0aW9uICgpIHsKLSAgICB0aGlzLnJvdXRlKCdhY3RpdmUnKTsKLSAgICB0aGlzLnJv
dXRlKCdjb21wbGV0ZWQnKTsKKyAgICAgICAgdGhpcy5yb3V0ZSgnYWN0aXZlJyk7CisgICAgICAg
IHRoaXMucm91dGUoJ2NvbXBsZXRlZCcpOwogICAgIH0pOwogfSk7CiAKIFRvZG9zLlRvZG9zUm91
dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewogICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7Ci0gICAg
cmV0dXJuIFRvZG9zLlRvZG8uZmluZCgpOworICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5maW5k
KCd0b2RvJyk7CiAgICAgfQogfSk7CiAKIFRvZG9zLlRvZG9zSW5kZXhSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7CiAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFy
IHRvZG9zID0gVG9kb3MuVG9kby5maW5kKCk7Ci0gICAgdGhpcy5jb250cm9sbGVyRm9yKCd0b2Rv
cycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKKyAgICAgICAgdGhpcy5jb250cm9sbGVy
Rm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRoaXMubW9kZWxGb3IoJ3RvZG9zJykp
OwogICAgIH0KIH0pOwogCiBUb2Rvcy5Ub2Rvc0FjdGl2ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0
ZW5kKHsKICAgICBzZXR1cENvbnRyb2xsZXI6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgdG9kb3Mg
PSBUb2Rvcy5Ub2RvLmZpbHRlcihmdW5jdGlvbiAodG9kbykgewotICAgIGlmICghdG9kby5nZXQo
J2lzQ29tcGxldGVkJykpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfSk7CisgICAg
ICAgIHZhciB0b2RvcyA9IHRoaXMuc3RvcmUuZmlsdGVyKCd0b2RvJywgZnVuY3Rpb24gKHRvZG8p
IHsKKyAgICAgICAgICAgIHJldHVybiAhdG9kby5nZXQoJ2lzQ29tcGxldGVkJyk7CisgICAgICAg
IH0pOwogCi0gICAgdGhpcy5jb250cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2Rv
cycsIHRvZG9zKTsKKyAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmls
dGVyZWRUb2RvcycsIHRvZG9zKTsKICAgICB9CiB9KTsKIAogVG9kb3MuVG9kb3NDb21wbGV0ZWRS
b3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlv
biAoKSB7Ci0gICAgdmFyIHRvZG9zID0gVG9kb3MuVG9kby5maWx0ZXIoZnVuY3Rpb24gKHRvZG8p
IHsKLSAgICBpZiAodG9kby5nZXQoJ2lzQ29tcGxldGVkJykpIHsKLSAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgfSk7CisgICAgICAgIHZhciB0b2RvcyA9IHRoaXMuc3RvcmUuZmlsdGVyKCd0
b2RvJywgZnVuY3Rpb24gKHRvZG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0b2RvLmdldCgnaXND
b21wbGV0ZWQnKTsKKyAgICAgICAgfSk7CiAKLSAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ3RvZG9z
Jykuc2V0KCdmaWx0ZXJlZFRvZG9zJywgdG9kb3MpOworICAgICAgICB0aGlzLmNvbnRyb2xsZXJG
b3IoJ3RvZG9zJykuc2V0KCdmaWx0ZXJlZFRvZG9zJywgdG9kb3MpOwogICAgIH0KIH0pOwpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy9lZGl0X3RvZG9fdmlldy5q
cyBiL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanMKaW5k
ZXggOTE5YmUwNTUyODA1MmNmZjI3NjZmODhhMjNlNTM1NzQ3NjkzZGM0MC4uMjllZTMwODA2YTBj
NDMzNmEyYTk4MTg5ZGJmMGE5MjgyMTFhZjVkMCAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0
cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy92aWV3cy9lZGl0X3RvZG9fdmlldy5qcworKysgYi9QZXJmb3JtYW5jZVRlc3Rz
L0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2pzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzCkBAIC0xLDI4ICsxLDEyIEBACi0vKmds
b2JhbCBUb2RvcyBFbWJlciAqLworLypnbG9iYWwgVG9kb3MsIEVtYmVyICovCiAndXNlIHN0cmlj
dCc7CiAKIFRvZG9zLkVkaXRUb2RvVmlldyA9IEVtYmVyLlRleHRGaWVsZC5leHRlbmQoewotICAg
IGNsYXNzTmFtZXM6IFsnZWRpdCddLAotCi0gICAgdmFsdWVCaW5kaW5nOiAndG9kby50aXRsZScs
Ci0KLSAgICBjaGFuZ2U6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgn
dmFsdWUnKTsKLQotICAgIGlmIChFbWJlci5pc0VtcHR5KHZhbHVlKSkgewotICAgIHRoaXMuZ2V0
KCdjb250cm9sbGVyJykucmVtb3ZlVG9kbygpOwotICAgIH0KLSAgICB9LAotCi0gICAgZm9jdXNP
dXQ6IGZ1bmN0aW9uICgpIHsKLSAgICB0aGlzLnNldCgnY29udHJvbGxlci5pc0VkaXRpbmcnLCBm
YWxzZSk7Ci0gICAgfSwKLQotICAgIGluc2VydE5ld2xpbmU6IGZ1bmN0aW9uICgpIHsKLSAgICB0
aGlzLnNldCgnY29udHJvbGxlci5pc0VkaXRpbmcnLCBmYWxzZSk7Ci0gICAgfSwKLQotICAgIGRp
ZEluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uICgpIHsKLSAgICB0aGlzLiQoKS5mb2N1cygpOwotICAg
IH0KKyAgICBmb2N1c09uSW5zZXJ0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8vIFJlLXNldCBp
bnB1dCB2YWx1ZSB0byBnZXQgcmlkIG9mIGEgcmVkdW50YW50IHRleHQgc2VsZWN0aW9uCisgICAg
ICAgIHRoaXMuJCgpLnZhbCh0aGlzLiQoKS52YWwoKSk7CisgICAgICAgIHRoaXMuJCgpLmZvY3Vz
KCk7CisgICAgfS5vbignZGlkSW5zZXJ0RWxlbWVudCcpCiB9KTsKKworRW1iZXIuSGFuZGxlYmFy
cy5oZWxwZXIoJ2VkaXQtdG9kbycsIFRvZG9zLkVkaXRUb2RvVmlldyk7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL3RvZG9zX3ZpZXcuanMgYi9QZXJmb3JtYW5j
ZVRlc3RzL0RvWW91RXZlbkJlbmNoL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL2pzL3ZpZXdzL3RvZG9zX3ZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjZhMGI3MWUx
YmVmMmQ5MDAwY2I0Y2UwMTY3ZGY5NjNiNWIzZGI0NAotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZv
cm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvdG9kb3Nfdmlldy5qcwpAQCAtMCwwICsxLDggQEAK
Ky8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLworJ3VzZSBzdHJpY3QnOworCitUb2Rvcy5Ub2Rvc1Zp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgZm9jdXNJbnB1dDogZnVuY3Rpb24gKCkgewor
ICAgICAgICB0aGlzLiQoJyNuZXctdG9kbycpLmZvY3VzKCk7CisgICAgfS5vbignZGlkSW5zZXJ0
RWxlbWVudCcpCit9KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVu
Y2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvcmVhZG1l
Lm1kIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQKaW5kZXggNjIxODg4ZWUwYjc3
OTBiM2YxYmE1Yjk3OTI2NDIwNDI0Nzg2MTJhOC4uZmU0YmQyNGVlNzA5MGQ2Zjk4NGRmNTY3YTE0
NjRjZWMzNWY5YTA3YyAxMDA2NDQKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5j
aC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUu
bWQKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQKQEAgLTIxLDYgKzIxLDcg
QEAgQXJ0aWNsZXMgYW5kIGd1aWRlcyBmcm9tIHRoZSBjb21tdW5pdHk6CiAKICogW0dldHRpbmcg
SW50byBFbWJlci5qc10oaHR0cDovL25ldC50dXRzcGx1cy5jb20vdHV0b3JpYWxzL2phdmFzY3Jp
cHQtYWpheC9nZXR0aW5nLWludG8tZW1iZXItanMpCiAqIFtFbWJlcldhdGNoXShodHRwOi8vZW1i
ZXJ3YXRjaC5jb20pCisqIFtDb2RlU2Nob29sIGNvdXJzZSBXYXJtaW5nIFVwIFdpdGggRW1iZXIu
anNdKGh0dHBzOi8vd3d3LmNvZGVzY2hvb2wuY29tL2NvdXJzZXMvd2FybWluZy11cC13aXRoLWVt
YmVyanMpCiAKIEdldCBoZWxwIGZyb20gb3RoZXIgRW1iZXIuanMgdXNlcnM6CiAKZGlmZiAtLWdp
dCBhL1BlcmZvcm1hbmNlVGVzdHMvRG9Zb3VFdmVuQmVuY2gvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9E
b1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy90ZXN0Lmh0bWwKaW5kZXggOGE5YjM5NGExMDRkZmQxOGE0OTZlMDJkMWM4Mjg4NzBhYWE2
MjMyZi4uMjRjMWFkZDJlOTM2NjllOGFiZTVkNDlkY2MzMDc0N2Q4NzhhNjJmNSAxMDA2NDQKLS0t
IGEvUGVyZm9ybWFuY2VUZXN0cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0Lmh0bWwKKysrIGIvUGVyZm9ybWFuY2VUZXN0
cy9Eb1lvdUV2ZW5CZW5jaC9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy90ZXN0Lmh0bWwKQEAgLTksNDggKzksNDggQEAgQmVuY2htYXJrUnVubmVyLnN1aXRl
KHsKICAgICB0aXRsZTogJ1NpbXBsZUVtYmVySlMnLAogICAgIHVybDogJ2luZGV4Lmh0bWwnLAog
ICAgIHByZXBhcmU6IGZ1bmN0aW9uIChjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsK
LSAgICBjb250ZW50V2luZG93LlRvZG9zLlN0b3JlID0gY29udGVudFdpbmRvdy5EUy5TdG9yZS5l
eHRlbmQoewotICAgIHJldmlzaW9uOiAxMiwKLSAgICBhZGFwdGVyOiAnVG9kb3MuTFNBZGFwdGVy
JywKLSAgICBjb21taXQ6IGZ1bmN0aW9uICgpIHsgfQotICAgIH0pOworICAgICAgICBjb250ZW50
V2luZG93LlRvZG9zLlN0b3JlID0gY29udGVudFdpbmRvdy5EUy5TdG9yZS5leHRlbmQoeworICAg
ICAgICAgICAgcmV2aXNpb246IDEyLAorICAgICAgICAgICAgYWRhcHRlcjogJ1RvZG9zLkxTQWRh
cHRlcicsCisgICAgICAgICAgICBjb21taXQ6IGZ1bmN0aW9uICgpIHsgfQorICAgICAgICB9KTsK
IAotICAgIHZhciBwcm9taXNlID0gbmV3IFNpbXBsZVByb21pc2U7CisgICAgICAgIHZhciBwcm9t
aXNlID0gbmV3IFNpbXBsZVByb21pc2U7CiAKLSAgICBmdW5jdGlvbiByZXNvbHZlSWZSZWFkeSgp
IHsKLSAgICBpZiAoY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdG9kbycpKQot
ICAgIHJldHVybiBwcm9taXNlLnJlc29sdmUoKTsKLSAgICBzZXRUaW1lb3V0KHJlc29sdmVJZlJl
YWR5LCAxMCk7Ci0gICAgfQotICAgIHJlc29sdmVJZlJlYWR5KCk7CisgICAgICAgIGZ1bmN0aW9u
IHJlc29sdmVJZlJlYWR5KCkgeworICAgICAgICAgICAgaWYgKGNvbnRlbnREb2N1bWVudC5xdWVy
eVNlbGVjdG9yKCcjbmV3LXRvZG8nKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS5y
ZXNvbHZlKCk7CisgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmVJZlJlYWR5LCAxMCk7Cisg
ICAgICAgIH0KKyAgICAgICAgcmVzb2x2ZUlmUmVhZHkoKTsKIAotICAgIHJldHVybiBwcm9taXNl
OworICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICB9LAogICAgIHRlc3RTdGVwczogZnVuY3Rp
b24gKGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgewotICAgIGNvbnRlbnREb2N1bWVu
dC5xdWVyeVNlbGVjdG9yKCcjbmV3LXRvZG8nKS5mb2N1cygpOwotICAgIHZhciB2aWV3cyA9IGNv
bnRlbnRXaW5kb3cuRW1iZXIuVmlldy52aWV3czsKLSAgICB2YXIgZW1iZXJSdW4gPSBjb250ZW50
V2luZG93LkVtYmVyLnJ1bjsKLSAgICB2YXIgbnVtYmVyT2ZJdGVtc1RvQWRkID0gMTAwOwotICAg
IHJldHVybiBbCi0gICAgWydBZGRpbmcnICsgbnVtYmVyT2ZJdGVtc1RvQWRkICsgJ0l0ZW1zJywg
ZnVuY3Rpb24gKCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZJdGVtc1RvQWRk
OyBpKyspIHsKLSAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLnNl
dCgndmFsdWUnLCAnU29tZXRoaW5nIHRvIGRvJyk7IH0pOwotICAgIGVtYmVyUnVuKGZ1bmN0aW9u
ICgpIHsgdmlld3NbIm5ldy10b2RvIl0uaW5zZXJ0TmV3bGluZShkb2N1bWVudC5jcmVhdGVFdmVu
dCgnRXZlbnQnKSk7IH0pOwotICAgIH0KLSAgICB9XSwKLSAgICBbJ0NvbXBsZXRpbmdBbGxJdGVt
cycsIGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgY2hlY2tib3hlcyA9IGNvbnRlbnREb2N1bWVudC5x
dWVyeVNlbGVjdG9yQWxsKCcuZW1iZXItY2hlY2tib3gnKTsKLSAgICBmb3IgKHZhciBpID0gMDsg
aSA8IGNoZWNrYm94ZXMubGVuZ3RoOyBpKyspIHsKLSAgICB2YXIgdmlldyA9IHZpZXdzW2NoZWNr
Ym94ZXNbaV0uaWRdOwotICAgIGVtYmVyUnVuKGZ1bmN0aW9uICgpIHsgdmlldy5zZXQoJ2NoZWNr
ZWQnLCB0cnVlKTsgfSk7Ci0gICAgfQotICAgIH1dLAotICAgIFsnRGVsZXRpbmdJdGVtcycsIGZ1
bmN0aW9uICgpIHsKLSAgICB2YXIgZGVsZXRlQnV0dG9ucyA9IGNvbnRlbnREb2N1bWVudC5xdWVy
eVNlbGVjdG9yQWxsKCcuZGVzdHJveScpOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRl
QnV0dG9ucy5sZW5ndGg7IGkrKykKLSAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IGRlbGV0ZUJ1
dHRvbnNbaV0uY2xpY2soKTsgfSk7Ci0gICAgfV0sCi0gICAgXTsKKyAgICAgICAgY29udGVudERv
Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdG9kbycpLmZvY3VzKCk7CisgICAgICAgIHZhciB2
aWV3cyA9IGNvbnRlbnRXaW5kb3cuRW1iZXIuVmlldy52aWV3czsKKyAgICAgICAgdmFyIGVtYmVy
UnVuID0gY29udGVudFdpbmRvdy5FbWJlci5ydW47CisgICAgICAgIHZhciBudW1iZXJPZkl0ZW1z
VG9BZGQgPSAxMDA7CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICBbJ0FkZGluZycgKyBu
dW1iZXJPZkl0ZW1zVG9BZGQgKyAnSXRlbXMnLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgeworICAgICAg
ICAgICAgICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLnNl
dCgndmFsdWUnLCAnU29tZXRoaW5nIHRvIGRvJyk7IH0pOworICAgICAgICAgICAgICAgICAgICBl
bWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLmluc2VydE5ld2xpbmUoZG9j
dW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JykpOyB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9XSwKKyAgICAgICAgICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24g
KCkgeworICAgICAgICAgICAgICAgIHZhciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1
ZXJ5U2VsZWN0b3JBbGwoJy5lbWJlci1jaGVja2JveCcpOworICAgICAgICAgICAgICAgIGZvciAo
dmFyIGkgPSAwOyBpIDwgY2hlY2tib3hlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAg
ICAgICB2YXIgdmlldyA9IHZpZXdzW2NoZWNrYm94ZXNbaV0uaWRdOworICAgICAgICAgICAgICAg
ICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXcuc2V0KCdjaGVja2VkJywgdHJ1ZSk7IH0p
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgWydEZWxl
dGluZ0l0ZW1zJywgZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHZhciBkZWxldGVCdXR0
b25zID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7CisgICAg
ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsr
KQorICAgICAgICAgICAgICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IGRlbGV0ZUJ1dHRv
bnNbaV0uY2xpY2soKTsgfSk7CisgICAgICAgICAgICB9XSwKKyAgICAgICAgXTsKICAgICB9CiB9
KTsKIAo=
</data>
<flag name="review"
          id="247199"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>