<?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>245817</bug_id>
          
          <creation_ts>2022-09-29 00:28:38 -0700</creation_ts>
          <short_desc>Prototype streaming for declarative shadow DOM</short_desc>
          <delta_ts>2022-10-04 01:20:51 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=245556</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>148695</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1901968</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-09-29 00:28:38 -0700</bug_when>
    <thetext>Add an even-more-experimental streaming version of declarative shadow DOM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1901971</commentid>
    <comment_count>1</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-09-29 00:35:57 -0700</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/4822</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1902259</commentid>
    <comment_count>2</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-09-29 19:38:33 -0700</bug_when>
    <thetext>Committed 255020@main (c0bda7319ffb): &lt;https://commits.webkit.org/255020@main&gt;

Reviewed commits have been landed. Closing PR #4822 and removing active labels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1902260</commentid>
    <comment_count>3</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-09-29 19:39:18 -0700</bug_when>
    <thetext>&lt;rdar://problem/100593236&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1903056</commentid>
    <comment_count>4</comment_count>
      <attachid>462782</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-10-04 01:11:14 -0700</bug_when>
    <thetext>Created attachment 462782
perf test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1903060</commentid>
    <comment_count>5</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-10-04 01:16:35 -0700</bug_when>
    <thetext>Using the attached performance test, I&apos;ve observed the following numbers on my 14&quot; M1 Max MacBookPro.

First, using polyfill for declarative shadow DOM, we observe that:

:Time -&gt; [221, 210.0000000000001, 210, 218, 215, 218.99999999999977, 217.99999999999977, 233, 214, 208, 218, 232, 206, 210, 204.00000000000045, 207.00000000000045, 227, 192, 205, 215] ms
    mean: 214.1 ms
    median: 214.5 ms
    stdev: 9.840303803611327 ms
    min: 192 ms
    max: 233 ms


Using native declarative shadow DOM without streaming (i.e. same as Blink&apos;s implementation), we observe that:

:Time -&gt; [163, 174, 198, 158, 157, 157.00000000000023, 158, 180, 157, 156, 158, 168, 159, 162.00000000000045, 158.00000000000045, 158, 169, 158.00000000000045, 160, 163.00000000000045] ms
    mean: 163.5500000000001 ms
    median: 158.50000000000023 ms
    stdev: 10.318481120377072 ms
    min: 156 ms
    max: 198 ms

This mean is 23.6% faster than polyfill.

Finally, using native declarative shadow DOM with streaming (i.e. shadow root is attached at the start tag instead of the end tag), we observe that:

:Time -&gt; [142, 152.00000000000006, 167.99999999999994, 150, 142.0000000000001, 144.9999999999999, 177, 155, 147, 166, 144, 142, 142, 147, 185, 142, 143, 162.99999999999955, 141, 143] ms
    mean: 151.8 ms
    median: 145.99999999999994 ms
    stdev: 13.069047402163593 ms
    min: 141 ms
    max: 185 ms

This mean is 29.1% faster than polyfill and 7% faster than non-streaming version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1903061</commentid>
    <comment_count>6</comment_count>
      <attachid>462783</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2022-10-04 01:20:51 -0700</bug_when>
    <thetext>Created attachment 462783
standalone perf test</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>462782</attachid>
            <date>2022-10-04 01:11:14 -0700</date>
            <delta_ts>2022-10-04 01:20:51 -0700</delta_ts>
            <desc>perf test</desc>
            <filename>declarative-shadow.html</filename>
            <type>text/html</type>
            <size>2134</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8Ym9keT4KPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9y
dW5uZXIuanMiPjwvc2NyaXB0Pgo8c2NyaXB0PgoKbGV0IG1hcmt1cCA9ICcnOwpmb3IgKGxldCBp
ID0gMDsgaSA8IDEwMDAwOyBpKyspCiAgICBtYXJrdXAgKz0gYDxkaXY+CiAgICA8dGVtcGxhdGUg
c2hhZG93cm9vdD0iY2xvc2VkIj4KICAgICAgICA8ZGl2PmhlbGxvPC9kaXY+CiAgICAgICAgPGRp
dj48Yj53b3JsZDwvYj48L2Rpdj4KICAgICAgICA8ZGl2PnNoYWRvdyA8ZW0+RE9NPC9lbT48L2Rp
dj4KICAgICAgICA8ZGl2PnRlc3Q8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CjwvZGl2PmA7Cgpkb2N1
bWVudC53cml0ZSgnPGRpdiBpZD0iZHVtbXkiPjx0ZW1wbGF0ZSBzaGFkb3dyb290PSJvcGVuIj48
L3RlbXBsYXRlPjwvZGl2PicpOwpjb25zdCBzdXBwb3J0c0RlY2xhcmF0aXZlU2hhZG93ID0gISFk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVtbXknKS5zaGFkb3dSb290Owpkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgnZHVtbXknKS5yZW1vdmUoKTsKCmRvY3VtZW50LndyaXRlKHN1cHBvcnRzRGVj
bGFyYXRpdmVTaGFkb3cgPyAnVXNpbmcgbmF0aXZlIGRlY2xhcmF0aXZlIHNoYWRvdyBET00nIDog
J1VzaW5nIHBvbHlmaWxsIGZvciBkZWNsYXJhdGl2ZSBzaGFkb3cgRE9NJyk7Cgpjb25zdCBzY3Jp
cHQgPSBgCiAgICBpZiAoISR7c3VwcG9ydHNEZWNsYXJhdGl2ZVNoYWRvd30pIHsKICAgICAgICBj
b25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJlY29yZExpc3Qp
ID0+IHsKICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3JkTGlzdCkgewogICAg
ICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHJlY29yZC5hZGRlZE5vZGVzKSB7CiAgICAg
ICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KQog
ICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hEZWNsYXJhdGl2ZVNoYWRvd1Jvb3RJZk5lZWRl
ZChub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAg
ICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge3N1YnRyZWU6IHRydWUsIGNo
aWxkTGlzdDogdHJ1ZX0pOwoKICAgICAgICBmdW5jdGlvbiBhdHRhY2hEZWNsYXJhdGl2ZVNoYWRv
d1Jvb3RJZk5lZWRlZCh0ZW1wbGF0ZSkgewogICAgICAgICAgICBjb25zdCBtb2RlID0gdGVtcGxh
dGUuZ2V0QXR0cmlidXRlKCdzaGFkb3dyb290Jyk7CiAgICAgICAgICAgIGlmIChtb2RlICE9ICdv
cGVuJyAmJiBtb2RlICE9ICdjbG9zZWQnKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAg
ICAgICBjb25zdCBkZWxlZ2F0ZXNGb2N1cyA9IHRlbXBsYXRlLmhhc0F0dHJpYnV0ZSgnc2hhZG93
cm9vdGRlbGVnYXRlc2ZvY3VzJyk7CiAgICAgICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0ZW1w
bGF0ZS5wYXJlbnROb2RlLmF0dGFjaFNoYWRvdyh7bW9kZSwgZGVsZWdhdGVzRm9jdXN9KTsKICAg
ICAgICAgICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkb2N1bWVudC5pbXBvcnROb2RlKHRlbXBs
YXRlLmNvbnRlbnQsIHRydWUpKTsKICAgICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKCk7CiAgICAg
ICAgfQogICAgfQpgOwoKUGVyZlRlc3RSdW5uZXIubWVhc3VyZVRpbWUoewogICAgZGVzY3JpcHRp
b246ICJEZWNsYXJhdGl2ZSBzaGFkb3cgRE9NIiwKICAgIHJ1bjogZnVuY3Rpb24oKSB7CiAgICAg
ICAgY29uc3QgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAg
ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZyYW1lKTsKICAgICAgICBmcmFtZS5jb250ZW50
RG9jdW1lbnQub3BlbigpOwogICAgICAgIGZyYW1lLmNvbnRlbnREb2N1bWVudC53cml0ZSgnPCFE
T0NUWVBFIGh0bWw+PHNjcmlwdD4nICsgc2NyaXB0ICsgJzwvJyArICdzY3JpcHQ+Jyk7CiAgICAg
ICAgZnJhbWUuY29udGVudERvY3VtZW50LndyaXRlKG1hcmt1cCk7CiAgICAgICAgZnJhbWUuY29u
dGVudERvY3VtZW50LmNsb3NlKCk7CiAgICAgICAgZnJhbWUucmVtb3ZlKCk7CiAgICB9Cn0pOwo8
L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>462783</attachid>
            <date>2022-10-04 01:20:51 -0700</date>
            <delta_ts>2022-10-04 01:20:51 -0700</delta_ts>
            <desc>standalone perf test</desc>
            <filename>declarative-shadow.html</filename>
            <type>text/html</type>
            <size>16564</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8Ym9keT4KPHNjcmlwdD4KaWYgKHdpbmRvdy50ZXN0UnVu
bmVyKSB7CiAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKICAgIHRlc3RSdW5uZXIuZHVt
cEFzVGV4dCgpOwp9CgooZnVuY3Rpb24gKCkgewogICAgdmFyIGxvZ0xpbmVzID0gd2luZG93LnRl
c3RSdW5uZXIgPyBbXSA6IG51bGw7CiAgICB2YXIgdmVyYm9zZUxvZ2dpbmcgPSBmYWxzZTsKICAg
IHZhciBjb21wbGV0ZWRJdGVyYXRpb25zOwogICAgdmFyIGNhbGxzUGVySXRlcmF0aW9uID0gMTsK
ICAgIHZhciBjdXJyZW50VGVzdCA9IG51bGw7CiAgICB2YXIgcmVzdWx0czsKICAgIHZhciBqc0hl
YXBSZXN1bHRzOwogICAgdmFyIG1hbGxvY0hlYXBSZXN1bHRzOwogICAgdmFyIGl0ZXJhdGlvbkNv
dW50ID0gdW5kZWZpbmVkOwogICAgdmFyIGxhc3RSZXNwb25zaXZlbmVzc1RpbWVzdGFtcCA9IDA7
CiAgICB2YXIgX2xvbmdlc3RSZXNwb25zaXZlbmVzc0RlbGF5ID0gMDsKICAgIHZhciBjb250aW51
ZUNoZWNraW5nUmVzcG9uc2l2ZW5lc3MgPSBmYWxzZTsKCiAgICB2YXIgUGVyZlRlc3RSdW5uZXIg
PSB7fTsKCiAgICAvLyBUbyBtYWtlIHRoZSBiZW5jaG1hcmsgcmVzdWx0cyBwcmVkaWN0YWJsZSwg
d2UgcmVwbGFjZSBNYXRoLnJhbmRvbSB3aXRoIGEKICAgIC8vIDEwMCUgZGV0ZXJtaW5pc3RpYyBh
bHRlcm5hdGl2ZS4KICAgIFBlcmZUZXN0UnVubmVyLnJhbmRvbVNlZWQgPSBQZXJmVGVzdFJ1bm5l
ci5pbml0aWFsUmFuZG9tU2VlZCA9IDQ5NzM0MzIxOwoKICAgIFBlcmZUZXN0UnVubmVyLnJlc2V0
UmFuZG9tU2VlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIFBlcmZUZXN0UnVubmVyLnJhbmRvbVNl
ZWQgPSBQZXJmVGVzdFJ1bm5lci5pbml0aWFsUmFuZG9tU2VlZAogICAgfQoKICAgIFBlcmZUZXN0
UnVubmVyLnJhbmRvbSA9IE1hdGgucmFuZG9tID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gUm9i
ZXJ0IEplbmtpbnMnIDMyIGJpdCBpbnRlZ2VyIGhhc2ggZnVuY3Rpb24uCiAgICAgICAgdmFyIHJh
bmRvbVNlZWQgPSBQZXJmVGVzdFJ1bm5lci5yYW5kb21TZWVkOwogICAgICAgIHJhbmRvbVNlZWQg
PSAoKHJhbmRvbVNlZWQgKyAweDdlZDU1ZDE2KSArIChyYW5kb21TZWVkIDw8IDEyKSkgICYgMHhm
ZmZmZmZmZjsKICAgICAgICByYW5kb21TZWVkID0gKChyYW5kb21TZWVkIF4gMHhjNzYxYzIzYykg
XiAocmFuZG9tU2VlZCA+Pj4gMTkpKSAmIDB4ZmZmZmZmZmY7CiAgICAgICAgcmFuZG9tU2VlZCA9
ICgocmFuZG9tU2VlZCArIDB4MTY1NjY3YjEpICsgKHJhbmRvbVNlZWQgPDwgNSkpICAgJiAweGZm
ZmZmZmZmOwogICAgICAgIHJhbmRvbVNlZWQgPSAoKHJhbmRvbVNlZWQgKyAweGQzYTI2NDZjKSBe
IChyYW5kb21TZWVkIDw8IDkpKSAgICYgMHhmZmZmZmZmZjsKICAgICAgICByYW5kb21TZWVkID0g
KChyYW5kb21TZWVkICsgMHhmZDcwNDZjNSkgKyAocmFuZG9tU2VlZCA8PCAzKSkgICAmIDB4ZmZm
ZmZmZmY7CiAgICAgICAgcmFuZG9tU2VlZCA9ICgocmFuZG9tU2VlZCBeIDB4YjU1YTRmMDkpIF4g
KHJhbmRvbVNlZWQgPj4+IDE2KSkgJiAweGZmZmZmZmZmOwogICAgICAgIFBlcmZUZXN0UnVubmVy
LnJhbmRvbVNlZWQgPSByYW5kb21TZWVkOwogICAgICAgIHJldHVybiAocmFuZG9tU2VlZCAmIDB4
ZmZmZmZmZikgLyAweDEwMDAwMDAwOwogICAgfTsKCiAgICBQZXJmVGVzdFJ1bm5lci5ub3cgPSB3
aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uICgp
IHsgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTsgfSA6IERhdGUubm93OwoKICAgIFBl
cmZUZXN0UnVubmVyLmxvZ0luZm8gPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIGlmICh2ZXJi
b3NlTG9nZ2luZykKICAgICAgICAgICAgdGhpcy5sb2codGV4dCk7CiAgICB9CgogICAgUGVyZlRl
c3RSdW5uZXIubG9nRGV0YWlsID0gZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkgewogICAgICAgIGlm
ICh2ZXJib3NlTG9nZ2luZykKICAgICAgICAgICAgdGhpcy5sb2coJyAgICAnICsgbGFiZWwgKyAn
OiAnICsgdmFsdWUpOwogICAgfQoKICAgIFBlcmZUZXN0UnVubmVyLmxvYWRGaWxlID0gZnVuY3Rp
b24gKHBhdGgpIHsKICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAg
ICAgeGhyLm9wZW4oIkdFVCIsIHBhdGgsIGZhbHNlKTsKICAgICAgICB4aHIuc2VuZChudWxsKTsK
ICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5l
ci5jb21wdXRlU3RhdGlzdGljcyA9IGZ1bmN0aW9uICh0aW1lcywgdW5pdCkgewogICAgICAgIHZh
ciBkYXRhID0gdGltZXMuc2xpY2UoKTsKCiAgICAgICAgLy8gQWRkIHZhbHVlcyBmcm9tIHRoZSBz
bWFsbGVzdCB0byB0aGUgbGFyZ2VzdCB0byBhdm9pZCB0aGUgbG9zcyBvZiBzaWduaWZpY2FuY2UK
ICAgICAgICBkYXRhLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO30pOwoKICAgICAgICB2
YXIgbWlkZGxlID0gTWF0aC5mbG9vcihkYXRhLmxlbmd0aCAvIDIpOwogICAgICAgIHZhciByZXN1
bHQgPSB7CiAgICAgICAgICAgIG1pbjogZGF0YVswXSwKICAgICAgICAgICAgbWF4OiBkYXRhW2Rh
dGEubGVuZ3RoIC0gMV0sCiAgICAgICAgICAgIG1lZGlhbjogZGF0YS5sZW5ndGggJSAyID8gZGF0
YVttaWRkbGVdIDogKGRhdGFbbWlkZGxlIC0gMV0gKyBkYXRhW21pZGRsZV0pIC8gMiwKICAgICAg
ICB9OwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSB1c2luZyBLbnV0
aCdzIG9ubGluZSBhbGdvcml0aG0gKGhhcyBnb29kIG51bWVyaWNhbCBzdGFiaWxpdHkpLgogICAg
ICAgIHZhciBzcXVhcmVTdW0gPSAwOwogICAgICAgIHJlc3VsdC52YWx1ZXMgPSB0aW1lczsKICAg
ICAgICByZXN1bHQubWVhbiA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxl
bmd0aDsgKytpKSB7CiAgICAgICAgICAgIHZhciB4ID0gZGF0YVtpXTsKICAgICAgICAgICAgdmFy
IGRlbHRhID0geCAtIHJlc3VsdC5tZWFuOwogICAgICAgICAgICB2YXIgc3dlZXAgPSBpICsgMS4w
OwogICAgICAgICAgICByZXN1bHQubWVhbiArPSBkZWx0YSAvIHN3ZWVwOwogICAgICAgICAgICBz
cXVhcmVTdW0gKz0gZGVsdGEgKiAoeCAtIHJlc3VsdC5tZWFuKTsKICAgICAgICB9CiAgICAgICAg
cmVzdWx0LnZhcmlhbmNlID0gZGF0YS5sZW5ndGggPD0gMSA/IDAgOiBzcXVhcmVTdW0gLyAoZGF0
YS5sZW5ndGggLSAxKTsKICAgICAgICByZXN1bHQuc3RkZXYgPSBNYXRoLnNxcnQocmVzdWx0LnZh
cmlhbmNlKTsKICAgICAgICByZXN1bHQudW5pdCA9IHVuaXQgfHwgIm1zIjsKCiAgICAgICAgcmV0
dXJuIHJlc3VsdDsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5lci5sb2dTdGF0aXN0aWNzID0gZnVu
Y3Rpb24gKHZhbHVlcywgdW5pdCwgdGl0bGUpIHsKICAgICAgICB2YXIgc3RhdGlzdGljcyA9IHRo
aXMuY29tcHV0ZVN0YXRpc3RpY3ModmFsdWVzLCB1bml0KTsKICAgICAgICB0aGlzLmxvZygiIik7
CiAgICAgICAgdGhpcy5sb2codGl0bGUgKyAiIC0+IFsiICsgc3RhdGlzdGljcy52YWx1ZXMuam9p
bigiLCAiKSArICJdICIgKyBzdGF0aXN0aWNzLnVuaXQpOwogICAgICAgIFsibWVhbiIsICJtZWRp
YW4iLCAic3RkZXYiLCAibWluIiwgIm1heCJdLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAg
ICAgICAgICAgUGVyZlRlc3RSdW5uZXIubG9nRGV0YWlsKG5hbWUsIHN0YXRpc3RpY3NbbmFtZV0g
KyAnICcgKyBzdGF0aXN0aWNzLnVuaXQpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9u
IGdldFVzZWRNYWxsb2NIZWFwKCkgewogICAgICAgIHZhciBzdGF0cyA9IHdpbmRvdy5pbnRlcm5h
bHMubWFsbG9jU3RhdGlzdGljcygpOwogICAgICAgIHJldHVybiBzdGF0cy5jb21taXR0ZWRWTUJ5
dGVzIC0gc3RhdHMuZnJlZUxpc3RCeXRlczsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRVc2VkSlNI
ZWFwKCkgewogICAgICAgIHJldHVybiB3aW5kb3cuaW50ZXJuYWxzLm1lbW9yeUluZm8oKS51c2Vk
SlNIZWFwU2l6ZTsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5lci5nYyA9IGZ1bmN0aW9uICgpIHsK
ICAgICAgICBpZiAod2luZG93LkdDQ29udHJvbGxlcikKICAgICAgICAgICAgd2luZG93LkdDQ29u
dHJvbGxlci5jb2xsZWN0KCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGdj
UmVjKG4pIHsKICAgICAgICAgICAgICAgIGlmIChuIDwgMSkKICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4ge307CiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IHtpOiAiYWIiICsgaSArIChpIC8g
MTAwMDAwKX07CiAgICAgICAgICAgICAgICB0ZW1wICs9ICJmb28iOwogICAgICAgICAgICAgICAg
Z2NSZWMobi0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IDEwMDA7IGkrKykKICAgICAgICAgICAgICAgIGdjUmVjKDEwKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIGZ1bmN0aW9uIGxvZ0luRG9jdW1lbnQodGV4dCkgewogICAgICAgIGlmICghZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoImxvZyIpKSB7CiAgICAgICAgICAgIHZhciBwcmUgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJwcmUiKTsKICAgICAgICAgICAgcHJlLmlkID0gImxvZyI7CiAgICAgICAg
ICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocHJlKTsKICAgICAgICB9CiAgICAgICAgZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvZyIpLmlubmVySFRNTCArPSB0ZXh0ICsgIlxuIjsKICAg
ICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgZG9jdW1lbnQuYm9keS5oZWlnaHQpOwogICAgfQoKICAg
IFBlcmZUZXN0UnVubmVyLmxvZyA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgaWYgKGxvZ0xp
bmVzKQogICAgICAgICAgICBsb2dMaW5lcy5wdXNoKHRleHQpOwogICAgICAgIGVsc2UKICAgICAg
ICAgICAgbG9nSW5Eb2N1bWVudCh0ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dGYXRhbEVy
cm9yKHRleHQpIHsKICAgICAgICBQZXJmVGVzdFJ1bm5lci5sb2codGV4dCk7CiAgICAgICAgZmlu
aXNoKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnQodGVzdCwgcnVubmVyLCBkb05vdExvZ1N0
YXJ0KSB7CiAgICAgICAgaWYgKCF0ZXN0KSB7CiAgICAgICAgICAgIGxvZ0ZhdGFsRXJyb3IoIkdv
dCBhIGJhZCB0ZXN0IG9iamVjdC4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAg
ICAgICBjdXJyZW50VGVzdCA9IHRlc3Q7CiAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBiZSB1
c2luZyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGVzdCBydW5uZXIgb24gRHJvbWFlbyBhcyB3ZWxs
IGJ1dCBpdCdzIHRvbyBzbG93IG5vdy4KICAgICAgICAvLyBGSVhNRTogRG9uJ3QgaGFyZCBjb2Rl
IHRoZSBudW1iZXIgb2YgaW4tcHJvY2VzcyBpdGVyYXRpb25zIHRvIHVzZSBpbnNpZGUgYSB0ZXN0
IHJ1bm5lci4KICAgICAgICBpdGVyYXRpb25Db3VudCA9IHRlc3QuY3VzdG9tSXRlcmF0aW9uQ291
bnQgfHwgKHdpbmRvdy50ZXN0UnVubmVyID8gNSA6IDIwKTsKICAgICAgICBjb21wbGV0ZWRJdGVy
YXRpb25zID0gLTE7CiAgICAgICAgcmVzdWx0cyA9IFtdOwogICAgICAgIGpzSGVhcFJlc3VsdHMg
PSBbXTsKICAgICAgICBtYWxsb2NIZWFwUmVzdWx0cyA9IFtdOwogICAgICAgIHZlcmJvc2VMb2dn
aW5nID0gIXdpbmRvdy50ZXN0UnVubmVyOwogICAgICAgIGlmICghZG9Ob3RMb2dTdGFydCkgewog
ICAgICAgICAgICBQZXJmVGVzdFJ1bm5lci5sb2dJbmZvKCcnKTsKICAgICAgICAgICAgUGVyZlRl
c3RSdW5uZXIubG9nSW5mbygiUnVubmluZyAiICsgaXRlcmF0aW9uQ291bnQgKyAiIHRpbWVzIik7
CiAgICAgICAgfQogICAgICAgIGlmICh0ZXN0LmRvTm90SWdub3JlSW5pdGlhbFJ1bikKICAgICAg
ICAgICAgY29tcGxldGVkSXRlcmF0aW9ucysrOwogICAgICAgIGlmIChydW5uZXIpCiAgICAgICAg
ICAgIHNjaGVkdWxlTmV4dFJ1bihydW5uZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxl
TmV4dFJ1bihydW5uZXIpIHsKICAgICAgICBQZXJmVGVzdFJ1bm5lci5nYygpOwogICAgICAgIHdp
bmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAg
ICAgICAgIGlmIChjdXJyZW50VGVzdC5zZXR1cCkKICAgICAgICAgICAgICAgICAgICBjdXJyZW50
VGVzdC5zZXR1cCgpOwoKICAgICAgICAgICAgICAgIHZhciBtZWFzdXJlZFZhbHVlID0gcnVubmVy
KCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgbG9n
RmF0YWxFcnJvcigiR290IGFuIGV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRlc3QucnVuIHdpdGgg
bmFtZT0iICsgZXhjZXB0aW9uLm5hbWUgKyAiLCBtZXNzYWdlPSIgKyBleGNlcHRpb24ubWVzc2Fn
ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNv
bXBsZXRlZEl0ZXJhdGlvbnMrKzsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBp
Z25vcmVXYXJtVXBBbmRMb2cobWVhc3VyZWRWYWx1ZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4
Y2VwdGlvbikgewogICAgICAgICAgICAgICAgbG9nRmF0YWxFcnJvcigiR290IGFuIGV4Y2VwdGlv
biB3aGlsZSBsb2dnaW5nIHRoZSByZXN1bHQgd2l0aCBuYW1lPSIgKyBleGNlcHRpb24ubmFtZSAr
ICIsIG1lc3NhZ2U9IiArIGV4Y2VwdGlvbi5tZXNzYWdlKTsKICAgICAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvbXBsZXRlZEl0ZXJhdGlvbnMgPCBp
dGVyYXRpb25Db3VudCkKICAgICAgICAgICAgICAgIHNjaGVkdWxlTmV4dFJ1bihydW5uZXIpOwog
ICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICB9LCAwKTsK
ICAgIH0KCiAgICBmdW5jdGlvbiBpZ25vcmVXYXJtVXBBbmRMb2cobWVhc3VyZWRWYWx1ZSwgZG9O
b3RMb2dQcm9ncmVzcykgewogICAgICAgIHZhciBsYWJlbGVkUmVzdWx0ID0gbWVhc3VyZWRWYWx1
ZSArICIgIiArIFBlcmZUZXN0UnVubmVyLnVuaXQ7CiAgICAgICAgaWYgKGNvbXBsZXRlZEl0ZXJh
dGlvbnMgPD0gMCkgewogICAgICAgICAgICBpZiAoIWRvTm90TG9nUHJvZ3Jlc3MpCiAgICAgICAg
ICAgICAgICBQZXJmVGVzdFJ1bm5lci5sb2dEZXRhaWwoY29tcGxldGVkSXRlcmF0aW9ucywgbGFi
ZWxlZFJlc3VsdCArICIgKElnbm9yZWQgd2FybS11cCBydW4pIik7CiAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICB9CgogICAgICAgIHJlc3VsdHMucHVzaChtZWFzdXJlZFZhbHVlKTsKICAgICAg
ICBpZiAod2luZG93LmludGVybmFscyAmJiAhY3VycmVudFRlc3QuZG9Ob3RNZWFzdXJlTWVtb3J5
VXNhZ2UpIHsKICAgICAgICAgICAganNIZWFwUmVzdWx0cy5wdXNoKGdldFVzZWRKU0hlYXAoKSk7
CiAgICAgICAgICAgIG1hbGxvY0hlYXBSZXN1bHRzLnB1c2goZ2V0VXNlZE1hbGxvY0hlYXAoKSk7
CiAgICAgICAgfQogICAgICAgIGlmICghZG9Ob3RMb2dQcm9ncmVzcykKICAgICAgICAgICAgUGVy
ZlRlc3RSdW5uZXIubG9nRGV0YWlsKGNvbXBsZXRlZEl0ZXJhdGlvbnMsIGxhYmVsZWRSZXN1bHQp
OwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAg
ICB2YXIgcHJlZml4ID0gY3VycmVudFRlc3QubmFtZSB8fCAnJzsKICAgICAgICAgICAgaWYgKGN1
cnJlbnRUZXN0LmRlc2NyaXB0aW9uKQogICAgICAgICAgICAgICAgUGVyZlRlc3RSdW5uZXIubG9n
KCJEZXNjcmlwdGlvbjogIiArIGN1cnJlbnRUZXN0LmRlc2NyaXB0aW9uKTsKICAgICAgICAgICAg
bWV0cmljID0geydmcHMnOiAnRnJhbWVSYXRlJywgJ3J1bnMvcyc6ICdSdW5zJywgJ3B0JzogJ1Nj
b3JlJywgJ21zJzogJ1RpbWUnfVtQZXJmVGVzdFJ1bm5lci51bml0XTsKICAgICAgICAgICAgdmFy
IHN1ZmZpeCA9IGN1cnJlbnRUZXN0LmFnZ3JlZ2F0b3IgPyAnOicgKyBjdXJyZW50VGVzdC5hZ2dy
ZWdhdG9yIDogJyc7CiAgICAgICAgICAgIFBlcmZUZXN0UnVubmVyLmxvZ1N0YXRpc3RpY3MocmVz
dWx0cywgUGVyZlRlc3RSdW5uZXIudW5pdCwgcHJlZml4ICsgIjoiICsgbWV0cmljICsgc3VmZml4
KTsKICAgICAgICAgICAgaWYgKGpzSGVhcFJlc3VsdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAg
ICBQZXJmVGVzdFJ1bm5lci5sb2dTdGF0aXN0aWNzKGpzSGVhcFJlc3VsdHMsICJieXRlcyIsIHBy
ZWZpeCArICI6SlNIZWFwIik7CiAgICAgICAgICAgICAgICBQZXJmVGVzdFJ1bm5lci5sb2dTdGF0
aXN0aWNzKG1hbGxvY0hlYXBSZXN1bHRzLCAiYnl0ZXMiLCBwcmVmaXggKyAiOk1hbGxvYyIpOwog
ICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb2dMaW5lcyAmJiAhY3VycmVudFRlc3QuY29u
dGludWVUZXN0aW5nKQogICAgICAgICAgICAgICAgbG9nTGluZXMuZm9yRWFjaChsb2dJbkRvY3Vt
ZW50KTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRUZXN0LmRvbmUpCiAgICAgICAgICAgICAgICBj
dXJyZW50VGVzdC5kb25lKCk7CiAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7CiAgICAgICAg
ICAgIGxvZ0luRG9jdW1lbnQoIkdvdCBhbiBleGNlcHRpb24gd2hpbGUgZmluYWxpemluZyB0aGUg
dGVzdCB3aXRoIG5hbWU9IiArIGV4Y2VwdGlvbi5uYW1lICsgIiwgbWVzc2FnZT0iICsgZXhjZXB0
aW9uLm1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFjdXJyZW50VGVzdC5jb250aW51
ZVRlc3RpbmcpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy50ZXN0UnVubmVyKQogICAgICAgICAg
ICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICB9CgogICAgICAgIGN1cnJlbnRUZXN0ID0gbnVsbDsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5l
ci5wcmVwYXJlVG9NZWFzdXJlVmFsdWVzQXN5bmMgPSBmdW5jdGlvbiAodGVzdCkgewogICAgICAg
IFBlcmZUZXN0UnVubmVyLnVuaXQgPSB0ZXN0LnVuaXQ7CiAgICAgICAgc3RhcnQodGVzdCk7CiAg
ICB9CgogICAgUGVyZlRlc3RSdW5uZXIubWVhc3VyZVZhbHVlQXN5bmMgPSBmdW5jdGlvbiAobWVh
c3VyZWRWYWx1ZSkgewogICAgICAgIGNvbXBsZXRlZEl0ZXJhdGlvbnMrKzsKCiAgICAgICAgdHJ5
IHsKICAgICAgICAgICAgaWdub3JlV2FybVVwQW5kTG9nKG1lYXN1cmVkVmFsdWUpOwogICAgICAg
IH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICBsb2dGYXRhbEVycm9yKCJHb3QgYW4g
ZXhjZXB0aW9uIHdoaWxlIGxvZ2dpbmcgdGhlIHJlc3VsdCB3aXRoIG5hbWU9IiArIGV4Y2VwdGlv
bi5uYW1lICsgIiwgbWVzc2FnZT0iICsgZXhjZXB0aW9uLm1lc3NhZ2UpOwogICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoY29tcGxldGVkSXRlcmF0aW9ucyA+
PSBpdGVyYXRpb25Db3VudCkgewogICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgUGVy
ZlRlc3RSdW5uZXIucmVwb3J0VmFsdWVzID0gZnVuY3Rpb24gKHRlc3QsIHZhbHVlcykgewogICAg
ICAgIFBlcmZUZXN0UnVubmVyLnVuaXQgPSB0ZXN0LnVuaXQ7CiAgICAgICAgc3RhcnQodGVzdCwg
bnVsbCwgdHJ1ZSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBp
KyspIHsKICAgICAgICAgICAgY29tcGxldGVkSXRlcmF0aW9ucysrOwogICAgICAgICAgICBpZ25v
cmVXYXJtVXBBbmRMb2codmFsdWVzW2ldLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZmluaXNo
KCk7CiAgICB9CgogICAgUGVyZlRlc3RSdW5uZXIubWVhc3VyZVRpbWUgPSBmdW5jdGlvbiAodGVz
dCkgewogICAgICAgIFBlcmZUZXN0UnVubmVyLnVuaXQgPSAibXMiOwogICAgICAgIHN0YXJ0KHRl
c3QsIG1lYXN1cmVUaW1lT25jZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWVhc3VyZVRpbWVPbmNl
KCkgewogICAgICAgIHZhciBzdGFydCA9IFBlcmZUZXN0UnVubmVyLm5vdygpOwogICAgICAgIHZh
ciByZXR1cm5WYWx1ZSA9IGN1cnJlbnRUZXN0LnJ1bigpOwogICAgICAgIHZhciBlbmQgPSBQZXJm
VGVzdFJ1bm5lci5ub3coKTsKCiAgICAgICAgaWYgKHJldHVyblZhbHVlIC0gMCA9PT0gcmV0dXJu
VmFsdWUpIHsKICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlIDwgMCkKICAgICAgICAgICAgICAg
IFBlcmZUZXN0UnVubmVyLmxvZygicnVuRnVuY3Rpb24gcmV0dXJuZWQgYSBuZWdhdGl2ZSB2YWx1
ZTogIiArIHJldHVyblZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAg
ICAgIH0KCiAgICAgICAgcmV0dXJuIGVuZCAtIHN0YXJ0OwogICAgfQoKICAgIFBlcmZUZXN0UnVu
bmVyLm1lYXN1cmVSdW5zUGVyU2Vjb25kID0gZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICBQZXJm
VGVzdFJ1bm5lci51bml0ID0gInJ1bnMvcyI7CiAgICAgICAgc3RhcnQodGVzdCwgbWVhc3VyZVJ1
bnNQZXJTZWNvbmRPbmNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZWFzdXJlUnVuc1BlclNlY29u
ZE9uY2UoKSB7CiAgICAgICAgdmFyIHRpbWVUb1J1biA9IDc1MDsKICAgICAgICB2YXIgdG90YWxU
aW1lID0gMDsKICAgICAgICB2YXIgbnVtYmVyT2ZSdW5zID0gMDsKCiAgICAgICAgd2hpbGUgKHRv
dGFsVGltZSA8IHRpbWVUb1J1bikgewogICAgICAgICAgICB0b3RhbFRpbWUgKz0gY2FsbFJ1bkFu
ZE1lYXN1cmVUaW1lKGNhbGxzUGVySXRlcmF0aW9uKTsKICAgICAgICAgICAgbnVtYmVyT2ZSdW5z
ICs9IGNhbGxzUGVySXRlcmF0aW9uOwogICAgICAgICAgICBpZiAoY29tcGxldGVkSXRlcmF0aW9u
cyA8IDAgJiYgdG90YWxUaW1lIDwgMTAwKQogICAgICAgICAgICAgICAgY2FsbHNQZXJJdGVyYXRp
b24gPSBNYXRoLm1heCgxMCwgMiAqIGNhbGxzUGVySXRlcmF0aW9uKTsKICAgICAgICB9CgogICAg
ICAgIHJldHVybiBudW1iZXJPZlJ1bnMgKiAxMDAwIC8gdG90YWxUaW1lOwogICAgfQoKICAgIGZ1
bmN0aW9uIGNhbGxSdW5BbmRNZWFzdXJlVGltZShjYWxsc1Blckl0ZXJhdGlvbikgewogICAgICAg
IHZhciBzdGFydFRpbWUgPSBQZXJmVGVzdFJ1bm5lci5ub3coKTsKICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IGNhbGxzUGVySXRlcmF0aW9uOyBpKyspCiAgICAgICAgICAgIGN1cnJlbnRUZXN0
LnJ1bigpOwogICAgICAgIHJldHVybiBQZXJmVGVzdFJ1bm5lci5ub3coKSAtIHN0YXJ0VGltZTsK
ICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5lci5zdGFydENoZWNraW5nUmVzcG9uc2l2ZW5lc3MgPSBm
dW5jdGlvbigpIHsKICAgICAgICBsYXN0UmVzcG9uc2l2ZW5lc3NUaW1lc3RhbXAgPSBQZXJmVGVz
dFJ1bm5lci5ub3coKTsKICAgICAgICBfbG9uZ2VzdFJlc3BvbnNpdmVuZXNzRGVsYXkgPSAwOwog
ICAgICAgIGNvbnRpbnVlQ2hlY2tpbmdSZXNwb25zaXZlbmVzcyA9IHRydWU7CgogICAgICAgIHZh
ciB0aW1lb3V0RnVuY3Rpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG5vdyA9IFBl
cmZUZXN0UnVubmVyLm5vdygpOwogICAgICAgICAgICB2YXIgZGVsdGEgPSBub3cgLSBsYXN0UmVz
cG9uc2l2ZW5lc3NUaW1lc3RhbXA7CiAgICAgICAgICAgIGlmIChkZWx0YSA+IF9sb25nZXN0UmVz
cG9uc2l2ZW5lc3NEZWxheSkKICAgICAgICAgICAgICAgIF9sb25nZXN0UmVzcG9uc2l2ZW5lc3NE
ZWxheSA9IGRlbHRhOyAgICAKCiAgICAgICAgICAgIGxhc3RSZXNwb25zaXZlbmVzc1RpbWVzdGFt
cCA9IG5vdzsKICAgICAgICAgICAgaWYgKGNvbnRpbnVlQ2hlY2tpbmdSZXNwb25zaXZlbmVzcykK
ICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dEZ1bmN0aW9uLCAwKTsKICAgICAgICB9
CiAgICAKICAgICAgICB0aW1lb3V0RnVuY3Rpb24oKTsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5l
ci5zdG9wQ2hlY2tpbmdSZXNwb25zaXZlbmVzcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnRp
bnVlQ2hlY2tpbmdSZXNwb25zaXZlbmVzcyA9IGZhbHNlOwogICAgfQoKICAgIFBlcmZUZXN0UnVu
bmVyLmxvbmdlc3RSZXNwb25zaXZlbmVzc0RlbGF5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0
dXJuIF9sb25nZXN0UmVzcG9uc2l2ZW5lc3NEZWxheTsKICAgIH0KCiAgICBQZXJmVGVzdFJ1bm5l
ci5tZWFzdXJlUGFnZUxvYWRUaW1lID0gZnVuY3Rpb24odGVzdCkgewogICAgICAgIHRlc3QucnVu
ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmaWxlID0gUGVyZlRlc3RSdW5uZXIubG9h
ZEZpbGUodGVzdC5wYXRoKTsKICAgICAgICAgICAgaWYgKCF0ZXN0LmNodW5rU2l6ZSkKICAgICAg
ICAgICAgICAgIHRoaXMuY2h1bmtTaXplID0gNTAwMDA7CgogICAgICAgICAgICB2YXIgY2h1bmtz
ID0gW107CiAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVyIHRoZSBjaHVua3MgdGhlIG1vcmUgc3R5
bGUgcmVzb2x2ZXMgd2UgZG8uCiAgICAgICAgICAgIC8vIFNtYWxsZXIgY2h1bmsgc2l6ZXMgd2ls
bCBzaG93IG1vcmUgc2FtcGxlcyBpbiBzdHlsZSByZXNvbHV0aW9uLgogICAgICAgICAgICAvLyBM
YXJnZXIgY2h1bmsgc2l6ZXMgd2lsbCBzaG93IG1vcmUgc2FtcGxlcyBpbiBsaW5lIGxheW91dC4K
ICAgICAgICAgICAgLy8gU21hbGxlciBjaHVuayBzaXplcyBydW4gc2xvd2VyIG92ZXJhbGwsIGFz
IHRoZSBwZXItY2h1bmsgb3ZlcmhlYWQgaXMgaGlnaC4KICAgICAgICAgICAgdmFyIGNodW5rQ291
bnQgPSBNYXRoLmNlaWwoZmlsZS5sZW5ndGggLyB0aGlzLmNodW5rU2l6ZSk7CiAgICAgICAgICAg
IGZvciAodmFyIGNodW5rSW5kZXggPSAwOyBjaHVua0luZGV4IDwgY2h1bmtDb3VudDsgY2h1bmtJ
bmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBmaWxlLnN1YnN0cihjaHVua0lu
ZGV4ICogdGhpcy5jaHVua1NpemUsIHRoaXMuY2h1bmtTaXplKTsKICAgICAgICAgICAgICAgIGNo
dW5rcy5wdXNoKGNodW5rKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGVyZlRlc3RSdW5u
ZXIubG9nSW5mbygiVGVzdGluZyAiICsgZmlsZS5sZW5ndGggKyAiIGJ5dGUgZG9jdW1lbnQgaW4g
IiArIGNodW5rQ291bnQgKyAiICIgKyB0aGlzLmNodW5rU2l6ZSArICIgYnl0ZSBjaHVua3MuIik7
CgogICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1l
Iik7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKCiAgICAg
ICAgICAgIGlmcmFtZS5zYW5kYm94ID0gJyc7ICAvLyBQcmV2ZW50IGV4dGVybmFsIGxvYWRzIHdo
aWNoIGNvdWxkIGNhdXNlIHdyaXRlKCkgdG8gcmV0dXJuIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBw
YXJzZS4KICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gIjYwMHB4IjsgLy8gSGF2ZSBh
IHJlYXNvbmFibGUgc2l6ZSBzbyB3ZSdyZSBub3QgbGluZS1icmVha2luZyBvbiBldmVyeSBjaGFy
YWN0ZXIuCiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAiODAwcHgiOwogICAgICAg
ICAgICBpZnJhbWUuY29udGVudERvY3VtZW50Lm9wZW4oKTsKCiAgICAgICAgICAgIGZvciAodmFy
IGNodW5rSW5kZXggPSAwOyBjaHVua0luZGV4IDwgY2h1bmtzLmxlbmd0aDsgY2h1bmtJbmRleCsr
KSB7CiAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LndyaXRlKGNodW5rc1tj
aHVua0luZGV4XSk7CiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2Ugd29uJ3QgY2F1c2Ug
YSBzdHlsZSByZXNvbHZlIHVudGlsIHdlJ3ZlIGVuY291bnRlcmVkIHRoZSA8Ym9keT4gZWxlbWVu
dC4KICAgICAgICAgICAgICAgIC8vIFRodXMgdGhlIG51bWJlciBvZiBjaHVua3MgY291bnRlZCBh
Ym92ZSBpcyBub3QgZXhhY3RseSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN0eWxlIHJlc29sdmVz
LgogICAgICAgICAgICAgICAgaWYgKGlmcmFtZS5jb250ZW50RG9jdW1lbnQuYm9keSkKICAgICAg
ICAgICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAv
LyBGb3JjZSBhIGZ1bGwgbGF5b3V0L3N0eWxlLXJlc29sdmUuCiAgICAgICAgICAgICAgICBlbHNl
IGlmIChpZnJhbWUuZG9jdW1lbnRFbGVtZW50LmxvY2FsTmFtZSA9PSAnaHRtbCcpCiAgICAgICAg
ICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0
V2lkdGg7IC8vIEZvcmNlIHRoZSBwYWludGluZy4KICAgICAgICAgICAgfQoKICAgICAgICAgICAg
aWZyYW1lLmNvbnRlbnREb2N1bWVudC5jbG9zZSgpOwogICAgICAgICAgICBkb2N1bWVudC5ib2R5
LnJlbW92ZUNoaWxkKGlmcmFtZSk7CiAgICAgICAgfTsKCiAgICAgICAgUGVyZlRlc3RSdW5uZXIu
bWVhc3VyZVRpbWUodGVzdCk7CiAgICB9CgogICAgd2luZG93LlBlcmZUZXN0UnVubmVyID0gUGVy
ZlRlc3RSdW5uZXI7Cn0pKCk7Cjwvc2NyaXB0Pgo8c2NyaXB0PgoKbGV0IG1hcmt1cCA9ICcnOwpm
b3IgKGxldCBpID0gMDsgaSA8IDEwMDAwOyBpKyspCiAgICBtYXJrdXAgKz0gYDxkaXY+CiAgICA8
dGVtcGxhdGUgc2hhZG93cm9vdD0iY2xvc2VkIj4KICAgICAgICA8ZGl2PmhlbGxvPC9kaXY+CiAg
ICAgICAgPGRpdj48Yj53b3JsZDwvYj48L2Rpdj4KICAgICAgICA8ZGl2PnNoYWRvdyA8ZW0+RE9N
PC9lbT48L2Rpdj4KICAgICAgICA8ZGl2PnRlc3Q8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CjwvZGl2
PmA7Cgpkb2N1bWVudC53cml0ZSgnPGRpdiBpZD0iZHVtbXkiPjx0ZW1wbGF0ZSBzaGFkb3dyb290
PSJvcGVuIj48L3RlbXBsYXRlPjwvZGl2PicpOwpjb25zdCBzdXBwb3J0c0RlY2xhcmF0aXZlU2hh
ZG93ID0gISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVtbXknKS5zaGFkb3dSb290Owpkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgnZHVtbXknKS5yZW1vdmUoKTsKCmRvY3VtZW50LndyaXRlKHN1
cHBvcnRzRGVjbGFyYXRpdmVTaGFkb3cgPyAnVXNpbmcgbmF0aXZlIGRlY2xhcmF0aXZlIHNoYWRv
dyBET00nIDogJ1VzaW5nIHBvbHlmaWxsIGZvciBkZWNsYXJhdGl2ZSBzaGFkb3cgRE9NJyk7Cgpj
b25zdCBzY3JpcHQgPSBgCiAgICBpZiAoISR7c3VwcG9ydHNEZWNsYXJhdGl2ZVNoYWRvd30pIHsK
ICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJl
Y29yZExpc3QpID0+IHsKICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3JkTGlz
dCkgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHJlY29yZC5hZGRlZE5vZGVz
KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVF
bGVtZW50KQogICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hEZWNsYXJhdGl2ZVNoYWRvd1Jv
b3RJZk5lZWRlZChub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAg
IH0pOwogICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge3N1YnRyZWU6
IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pOwoKICAgICAgICBmdW5jdGlvbiBhdHRhY2hEZWNsYXJh
dGl2ZVNoYWRvd1Jvb3RJZk5lZWRlZCh0ZW1wbGF0ZSkgewogICAgICAgICAgICBjb25zdCBtb2Rl
ID0gdGVtcGxhdGUuZ2V0QXR0cmlidXRlKCdzaGFkb3dyb290Jyk7CiAgICAgICAgICAgIGlmICht
b2RlICE9ICdvcGVuJyAmJiBtb2RlICE9ICdjbG9zZWQnKQogICAgICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZXNGb2N1cyA9IHRlbXBsYXRlLmhhc0F0dHJpYnV0
ZSgnc2hhZG93cm9vdGRlbGVnYXRlc2ZvY3VzJyk7CiAgICAgICAgICAgIGNvbnN0IHNoYWRvd1Jv
b3QgPSB0ZW1wbGF0ZS5wYXJlbnROb2RlLmF0dGFjaFNoYWRvdyh7bW9kZSwgZGVsZWdhdGVzRm9j
dXN9KTsKICAgICAgICAgICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChkb2N1bWVudC5pbXBvcnRO
b2RlKHRlbXBsYXRlLmNvbnRlbnQsIHRydWUpKTsKICAgICAgICAgICAgdGVtcGxhdGUucmVtb3Zl
KCk7CiAgICAgICAgfQogICAgfQpgOwoKUGVyZlRlc3RSdW5uZXIubWVhc3VyZVRpbWUoewogICAg
ZGVzY3JpcHRpb246ICJEZWNsYXJhdGl2ZSBzaGFkb3cgRE9NIiwKICAgIHJ1bjogZnVuY3Rpb24o
KSB7CiAgICAgICAgY29uc3QgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUn
KTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZyYW1lKTsKICAgICAgICBmcmFt
ZS5jb250ZW50RG9jdW1lbnQub3BlbigpOwogICAgICAgIGZyYW1lLmNvbnRlbnREb2N1bWVudC53
cml0ZSgnPCFET0NUWVBFIGh0bWw+PHNjcmlwdD4nICsgc2NyaXB0ICsgJzwvJyArICdzY3JpcHQ+
Jyk7CiAgICAgICAgZnJhbWUuY29udGVudERvY3VtZW50LndyaXRlKG1hcmt1cCk7CiAgICAgICAg
ZnJhbWUuY29udGVudERvY3VtZW50LmNsb3NlKCk7CiAgICAgICAgZnJhbWUucmVtb3ZlKCk7CiAg
ICB9Cn0pOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>