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

<bugzilla version="5.0.4"
          urlbase="https://www.w3.org/Bugs/Public/"
          
          maintainer="sysbot+bugzilla@w3.org"
>

    <bug>
          <bug_id>18790</bug_id>
          
          <creation_ts>2012-09-06 13:23:58 +0000</creation_ts>
          <short_desc>Describing cell for an header cell in a data table</short_desc>
          <delta_ts>2013-09-12 20:38:46 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WHATWG</product>
          <component>HTML</component>
          <version>unspecified</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>NEEDSINFO</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>Unsorted</target_milestone>
          
          <blocked>22049</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Pierre Dubois">duboisp2</reporter>
          <assigned_to name="Ian &apos;Hixie&apos; Hickson">ian</assigned_to>
          <cc>erika.doyle</cc>
    
    <cc>faulkner.steve</cc>
    
    <cc>ian</cc>
    
    <cc>mike</cc>
    
    <cc>public-html-admin</cc>
    
    <cc>public-html-wg-issue-tracking</cc>
    
    <cc>robin</cc>
          
          <qa_contact>contributor</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>73300</commentid>
    <comment_count>0</comment_count>
      <attachid>1181</attachid>
    <who name="Pierre Dubois">duboisp2</who>
    <bug_when>2012-09-06 13:23:58 +0000</bug_when>
    <thetext>Created attachment 1181
Javascript Table Parser

Hi,

In the Editor&apos;s Draft 4 September 2012, &quot;Section 4.9.6 The thead element&quot; show a method about on how to add a description to a column header cell.

The &quot;algorithm for assigning header cells&quot; defined in the &quot;Section 4.9.12.1 Forming a table&quot; do not add any particular meaning to those describing cell because they are parsed with the &quot;internal algorithm for scanning and assigning header cells&quot;, the same algorithm for parsing the real data cell. 

This can create a confusion between the real data cell vs. the describing cell in a table because the &quot;internal algorithm for scanning and assigning header cells&quot; are not considering any column group and/or any row group.

----
Describing cell for a row header cell


I would like to propose an addition in the specification about on how to add a description to a row header cell in a data table. That relation can be made by using the colgroup element. 
See the draft of that technique:  http://wet-boew.github.com/wet-boew/docs/tableparser/rowheader-description-techniques.html (FYI, the intention of that technique is for submission to the WCAG 2.0 Techniques)

A note in the section &quot;4.9.3 The colgroup element&quot; can be added to say &quot;the first column group (colgroup element) can be used as an header column group if inside the column group there are at least one row header cell defined inside a tbody row group. Otherwise the first column group would be a data column group.&quot; 

With that note, it would be possible to set a descriptive cell to a row header cell.

----

Attached: A javascript table parser that takes in consideration the row group, the column group and the placement, size of the header cell to create the relationship between each cell contained in a table. You can find the most recent version here: https://github.com/wet-boew/wet-boew/blob/master/src/js/workers/parser.table.js

The following table validator use the preceding table parser.
http://wet-boew.github.com/wet-boew/docs/tableparser/validator-htmltable.html

FYI - Here a mailing sent to WAI Interrest Group about a request for comments in regards of the techniques mentioned here. http://lists.w3.org/Archives/Public/w3c-wai-ig/2012JulSep/0310.html

Thank you

:-)

Pierre Dubois</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74952</commentid>
    <comment_count>1</comment_count>
    <who name="Pierre Dubois">duboisp2</who>
    <bug_when>2012-10-01 19:15:35 +0000</bug_when>
    <thetext>See my proposal about the Table Usability Concept here: http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-September/037475.html

:-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>76338</commentid>
    <comment_count>2</comment_count>
    <who name="Erika Doyle Navara">erika.doyle</who>
    <bug_when>2012-10-15 21:56:00 +0000</bug_when>
    <thetext>Moving this to HTML.next as we work to lock down HTML5.0 for CR.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>76343</commentid>
    <comment_count>3</comment_count>
    <who name="Erika Doyle Navara">erika.doyle</who>
    <bug_when>2012-10-15 22:04:05 +0000</bug_when>
    <thetext>For future reference, it appears that some of the broken links below can be fixed by substituting &quot;demos&quot; for &quot;docs&quot; in the path. E.g.,

http://wet-boew.github.com/wet-boew/docs/tableparser/rowheader-description-techniques.html

Is now at:

http://wet-boew.github.com/wet-boew/demos/tableparser/rowheader-description-techniques.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>81710</commentid>
    <comment_count>4</comment_count>
    <who name="Robin Berjon">robin</who>
    <bug_when>2013-01-21 15:59:13 +0000</bug_when>
    <thetext>Mass move to &quot;HTML WG&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>81828</commentid>
    <comment_count>5</comment_count>
    <who name="Robin Berjon">robin</who>
    <bug_when>2013-01-21 16:02:00 +0000</bug_when>
    <thetext>Mass move to &quot;HTML WG&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>85650</commentid>
    <comment_count>6</comment_count>
    <who name="steve faulkner">faulkner.steve</who>
    <bug_when>2013-04-06 13:41:12 +0000</bug_when>
    <thetext>assigning this to Ian as it looks like something he would better be able to respond to.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89018</commentid>
    <comment_count>7</comment_count>
    <who name="Ian &apos;Hixie&apos; Hickson">ian</who>
    <bug_when>2013-06-10 20:56:21 +0000</bug_when>
    <thetext>I don&apos;t understand the problem here. Can you describe the problem, separate from the proposed solution, ideally with a concrete example?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89112</commentid>
    <comment_count>8</comment_count>
    <who name="Pierre Dubois">duboisp2</who>
    <bug_when>2013-06-11 18:52:47 +0000</bug_when>
    <thetext>&gt; Can you describe the problem, separate from the proposed solution, 

Define and support explanation column in a table. 
 
&gt; ideally with a concrete example?

* Hide the explanation cell to save space in the view port. Example: Show a simplified version of the table on a mobile device or on small screen.

* Be able to provide an alternative way to show explanation cell. Example: Show the explanation in a tooltip when hovering the cell header.

* Avoid confusion between a tabular data cell and an explanatory data cell. Example: During cell iteration in a table rows from the DOM Interface to create a new object (charts) from the data.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89493</commentid>
    <comment_count>9</comment_count>
    <who name="Ian &apos;Hixie&apos; Hickson">ian</who>
    <bug_when>2013-06-18 18:55:12 +0000</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; Can you describe the problem, separate from the proposed solution, 
&gt; 
&gt; Define and support explanation column in a table. 

I don&apos;t understand what this means. What is an &quot;explanation column&quot;? Is it just a column with cells that contain text?


&gt; &gt; ideally with a concrete example?
&gt; 
&gt; * Hide the explanation cell to save space in the view port. Example: Show a
&gt; simplified version of the table on a mobile device or on small screen.

This can be done today using visibility:collapse (that&apos;s in fact the reason that value exists); why is it insufficient?


&gt; * Be able to provide an alternative way to show explanation cell. Example:
&gt; Show the explanation in a tooltip when hovering the cell header.

This can be done today as well, using title=&quot;&quot;.


&gt; * Avoid confusion between a tabular data cell and an explanatory data cell.

Confusion by whom?


&gt; Example: During cell iteration in a table rows from the DOM Interface to
&gt; create a new object (charts) from the data.

Wouldn&apos;t such a script know exactly which cells were data and which weren&apos;t?


Could you show an example of a real Web page that demonstrates this problem? I&apos;m really having trouble understanding what the issue is.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>1181</attachid>
            <date>2012-09-06 13:23:58 +0000</date>
            <delta_ts>2012-09-06 13:23:58 +0000</delta_ts>
            <desc>Javascript Table Parser</desc>
            <filename>parser.table.js</filename>
            <type>text/x-javascript</type>
            <size>63532</size>
            <attacher name="Pierre Dubois">duboisp2</attacher>
            
              <data encoding="base64">LyohDQoqIFdlYiBFeHBlcmllbmNlIFRvb2xraXQgKFdFVCkgLyBCb8OudGUgw6Agb3V0aWxzIGRl
IGwnZXhww6lyaWVuY2UgV2ViIChCT0VXKQ0KKiB3d3cudGJzLmdjLmNhL3dzLW53L3dldC1ib2V3
L3Rlcm1zIC8gd3d3LnNjdC5nYy5jYS93cy1udy93ZXQtYm9ldy9jb25kaXRpb25zDQoqLw0KLyoq
DQoqIFRhYmxlIFBhcnNlciAtIFRhYmxlIHVzYWJpbGl0eSAtIENvcmUgcGx1Z2luDQoqDQoqIEBh
dXRob3I6IFBpZXJyZSBEdWJvaXMNCioNCiovDQovKmdsb2JhbCBqUXVlcnk6IGZhbHNlKi8NCihm
dW5jdGlvbiAoJCkgew0KCSJ1c2Ugc3RyaWN0IjsNCgl2YXIgX3BlID0gd2luZG93LnBlIHx8IHsN
CgkJZm4gOiB7fQ0KCX07DQoJX3BlLmZuLnBhcnNlcnRhYmxlID0gew0KCQl0eXBlIDogJ3BsdWdp
bicsDQoJCW9uUGFyc2VyRXJyb3I6IHVuZGVmaW5lZCwNCgkJX2V4ZWMgOiBmdW5jdGlvbiAoZWxt
KSB7DQoJCQl2YXIgb2JqID0gZWxtLA0KCQkJLy8gRXZlbnQgaGFuZGxlciBmb3IgaXNzdWUgZXJy
b3IgZm91bmQgZHVycmluZyB0aGUgdGFibGUgcGFyc2luZyBwcm9jZXNzDQoJCQkJZXJyb3JUcmln
Z2VyID0gZnVuY3Rpb24gKG51bWVyciwgZXJyLCBvYmopIHsNCgkJCQkJLy8gRllJIC0gMzEgVHlw
ZSBvZiBFcnJvciBjYW4gYmUgcmFpc2VkDQoJCQkJCWlmICh0eXBlb2YgX3BlLmZuLnBhcnNlcnRh
YmxlLm9uUGFyc2VyRXJyb3IgPT09ICJmdW5jdGlvbiIpIHsNCgkJCQkJCV9wZS5mbi5wYXJzZXJ0
YWJsZS5vblBhcnNlckVycm9yKG51bWVyciwgZXJyLCBvYmopOw0KCQkJCQl9DQoJCQkJCS8vICQo
b2JqKS50cmlnZ2VyKCdwYXJzZXIudGFibGUuZXJyb3InLCBlcnIsIG9iaik7DQoJCQkJCS8vIGNv
bnNvbGUubG9nKCJUcmlnZ2VyIEVSUk9SOiAiICsgZXJyKTsgLy8gRGVidWcgTW9kZQ0KCQkJCX0s
DQoJCQkJZ3JvdXBaZXJvID0gew0KCQkJCQlhbGxQYXJzZXJPYmo6IFtdLA0KCQkJCQluYkRlc2Ny
aXB0aW9uUm93OiAwIC8vIFRvIHJlbW92ZSA/Pw0KCQkJCX0sDQoJCQkJY29sZ3JvdXBGcmFtZSA9
IFtdLA0KCQkJCWNvbHVtbkZyYW1lID0gW10sDQoJCQkJdWlkRWxlbSA9IDAsDQoJCQkJY3VycmVu
dFJvd0xldmVsID0gMCwNCgkJCQljdXJyZW50Um93UG9zID0gMCwNCgkJCQlzcGFubmVkUm93ID0g
W10sDQoJCQkJdGFibGVDZWxsV2lkdGggPSAwLA0KCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVk
ID0gZmFsc2UsDQoJCQkJc3VtbWFyeVJvd0dyb3VwRWxpZ2libGUgPSBmYWxzZSwNCgkJCQljdXJy
ZW50Um93SGVhZGVyID0gW10sDQoJCQkJY3VycmVudFRib2R5SUQsDQoJCQkJdGhlYWRSb3dTdGFj
ayA9IFtdLA0KCQkJCXN0YWNrUm93SGVhZGVyID0gZmFsc2UsDQoJCQkJLy8gUm93IEdyb3VwIFZh
cmlhYmxlDQoJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFjayA9IFtdLA0KCQkJCWN1cnJlbnRSb3dH
cm91cCwNCgkJCQljdXJyZW50Um93R3JvdXBFbGVtZW50LA0KCQkJCWxzdFJvd0dyb3VwID0gW10s
DQoJCQkJcm93Z3JvdXBoZWFkZXJjYWxsZWQgPSBmYWxzZSwNCgkJCQloYXNUZm9vdCA9ICQob2Jq
KS5oYXMoJ3Rmb290JyksDQoJCQkJbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zLA0KCQkJCXByZXZp
b3VzRGF0YUhlYWRpbmdDb2xQb3M7DQoJCQkvLyBlbG0gbmVlZCB0byBiZSBhIHRhYmxlDQoJCQlp
ZiAoJChlbG0pLmdldCgwKS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndGFibGUnKSB7DQoJ
CQkJZXJyb3JUcmlnZ2VyKDEsICJPbmx5IHRhYmxlIGNhbiBiZSBwYXJzZWQgd2l0aCB0aGlzIHBh
cnNlciIsIGVsbSk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJLy8gQ2hlY2sgaWYgdGhpcyB0YWJs
ZSB3YXMgYWxyZWFkeSBwYXJzZWQsIGlmIHllcyB3ZSBleGl0IGJ5IHRocm93aW5nIGFuIGVycm9y
DQoJCQlpZiAoJChvYmopLnRibHBhcnNlcikgew0KCQkJCWVycm9yVHJpZ2dlcigyLCAiVGhlIHRh
YmxlIHdhcyBhbHJlYWR5IHBhcnNlZCwgV2h5IHlvdSB3YW50IHRvIHBhcnNlIGl0IGEgc2Vjb25k
IHRpbWUgPyIsIG9iaik7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJLyoNCgkJDQoJCQkrLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoJCQl8IEZZ
SSAtIEhlcmUgdGhlIHZhbHVlIGFuZCBzaWduaWZpY2F0aW9uIG9mIGVhY2ggdHlwZSB8DQoJCQkr
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoJ
CQl8IFR5cGUgfCBTaWduaWZpY2F0aW9uIHwgVGVjaG5pY2FsaXR5DQoJCQkrLS0tLS0tKy0tLS0t
LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAxICAgfCBI
ZWFkZXIgICAgICAgIHwgVEggZWxlbWVudCBvbmx5DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0t
LSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAyICAgfCBEYXRhICAgICAg
ICAgIHwgVEQgZWxlbWVudCBvbmx5DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAzICAgfCBTdW1tYXJ5ICAgICAgIHwgVEQg
ZWxlbWVudCBhbmQgVEQgb2YgdHlwZSAyIGV4aXN0DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0t
LSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICA0ICAgfCBLZXkgICAgICAg
ICAgIHwgVEQgZWxlbWVudCBhcHBsaWNhYmxlIHRvIHJpZ2h0IFRILCBPbmx5IGF2YWlsYWJsZSBv
biByb3cNCgkJCSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0NCgkJCXwgIDUgICB8IERlc2NyaXB0aW9uICAgfCBURCBlbGVtZW50IGFwcGxpY2Fi
bGUgdG8gbGVmdCBvciB0b3AgVEgNCgkJCSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkJCXwgIDYgICB8IExheW91dCAgICAgICAgfCBDYW4g
YmUgb25seTogVG9wIExlZnQgY2VsbCBvci9hbmQgU3VtbW1hcnkgZ3JvdXAgaW50ZXJzZWN0aW9u
DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tDQoJCQl8ICA3ICAgfCBIZWFkZXIgR3JvdXAgIHwgVEggZWxlbWVudCBvbmx5LCB2aXN1YWwg
aGVhZGluZyBncm91cGluZywgdGhpcyB0eXBlIGFyZSBhbiBleHRlbnNpb24gb2YgdGhlIHR5cGUg
MQ0KCQkJKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQ0KCQkqLw0KCQkJJChvYmopLmRhdGEoKS50YmxwYXJzZXIgPSBncm91cFplcm87DQoJCQln
cm91cFplcm8uY29sZ3JvdXAgPSBjb2xncm91cEZyYW1lOw0KCQkJaWYgKCFncm91cFplcm8ucm93
Z3JvdXApIHsNCgkJCQlncm91cFplcm8ucm93Z3JvdXAgPSBbXTsNCgkJCX0NCgkJCWlmICghZ3Jv
dXBaZXJvLmxzdHJvd2dyb3VwKSB7DQoJCQkJLy8gZ3JvdXBaZXJvLmxzdHJvd2dyb3VwID0gW107
DQoJCQkJZ3JvdXBaZXJvLmxzdHJvd2dyb3VwID0gbHN0Um93R3JvdXA7DQoJCQl9DQoJCQlncm91
cFplcm8uZWxlbSA9IG9iajsNCgkJCWdyb3VwWmVyby51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxl
bSArPSAxOyAvLyBTZXQgdGhlIHVpZCBmb3IgdGhlIGdyb3VwWmVybw0KCQkJZ3JvdXBaZXJvLmNv
bGNhcHRpb24gPSB7fTsgLy8gR3JvdXAgQ2VsbCBIZWFkZXIgYXQgbGV2ZWwgMCwgc2NvcGU9Y29s
DQoJCQlncm91cFplcm8uY29sY2FwdGlvbi51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxlbSArPSAx
Ow0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uZWxlbSA9IHVuZGVmaW5lZDsNCgkJCWdyb3VwWmVy
by5jb2xjYXB0aW9uLnR5cGUgPSA3Ow0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uZGF0YXNldCA9
IFtdOw0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uc3VtbWFyeXNldCA9IFtdOw0KCQkJZ3JvdXBa
ZXJvLnJvd2NhcHRpb24gPSB7fTsgLy8gR3JvdXAgQ2VsbCBIZWFkZXIgYXQgbGV2ZWwgMCwgc2Nv
cGU9cm93DQoJCQlncm91cFplcm8ucm93Y2FwdGlvbi51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxl
bSArPSAxOw0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uZWxlbSA9IHVuZGVmaW5lZDsNCgkJCWdy
b3VwWmVyby5yb3djYXB0aW9uLnR5cGUgPSA3Ow0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uZGF0
YXNldCA9IFtdOw0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uc3VtbWFyeXNldCA9IFtdOw0KCQkJ
Z3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJZnVuY3Rpb24gcHJvY2Vzc0NhcHRpb24oZWxlbSkgew0K
CQkJCWdyb3VwWmVyby5jb2xjYXB0aW9uLmVsZW0gPSBlbGVtOw0KCQkJCWdyb3VwWmVyby5yb3dj
YXB0aW9uLmVsZW0gPSBlbGVtOw0KCQkJCXZhciBncm91cGhlYWRlcmNlbGwgPSB7DQoJCQkJCQlj
b2xjYXB0aW9uOiBncm91cFplcm8uY29sY2FwdGlvbiwNCgkJCQkJCXJvd2NhcHRpb246IGdyb3Vw
WmVyby5yb3djYXB0aW9uLA0KCQkJCQkJZWxlbTogZWxlbQ0KCQkJCQl9LA0KCQkJCQljYXB0aW9u
LA0KCQkJCQljYXB0aW9uRm91bmQsDQoJCQkJCWRlc2NyaXB0aW9uID0gW107DQoNCgkJCQkvLyBF
eHRyYWN0IHRoZSBjYXB0aW9uIHZzIHRoZSBkZXNjcmlwdGlvbg0KCQkJCS8vIFRoZXJlIGFyZSAy
IHRlY2huaXF1ZXMsDQoJCQkJLy8JUmVjb21tYW5kZWQgaXMgZW5jYXBzdWxhdGUgdGhlIGNhcHRp
b24gd2l0aCAic3Ryb25nIg0KCQkJCS8vCVVzZSBEZXRhaWxzL1N1bW1hcnkgZWxlbWVudA0KCQkJ
CS8vCVVzZSBhIHNpbXBsZSBwYXJhZ3JhcGgNCgkJCQlpZiAoJChlbGVtKS5jaGlsZHJlbigpLmxl
bmd0aCA+IDApIHsNCgkJCQkJLy8gVXNlIHRoZSBjb250ZW50cyBmdW5jdGlvbiB0byByZXRyZWl2
ZSB0aGUgY2FwdGlvbg0KCQkJCQkkKGVsZW0pLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uICgp
IHsNCgkJCQkJCWlmICghY2FwdGlvbiAmJiB0aGlzLm5vZGVUeXBlID09PSAzKSB7IC8vIFRleHQg
Tm9kZQ0KCQkJCQkJCS8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgaXQgaXMsIGJ1dCB0aGlzIHdpbGwg
YmUgY29uc2lkZXJhdGVkIGFzIHRoZSBjYXB0aW9uDQoJCQkJCQkJLy8gaWYgaXMgbm90IGVtcHR5
DQoJCQkJCQkJY2FwdGlvbiA9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAi
Iik7DQoJCQkJCQkJaWYgKGNhcHRpb24ubGVuZ3RoICE9PSAwKSB7DQoJCQkJCQkJCWNhcHRpb24g
PSB0aGlzOw0KCQkJCQkJCQljYXB0aW9uRm91bmQgPSB0cnVlOw0KCQkJCQkJCQlyZXR1cm47DQoJ
CQkJCQkJfQ0KCQkJCQkJCWNhcHRpb24gPSBmYWxzZTsNCgkJCQkJCX0gZWxzZSBpZiAoIWNhcHRp
b24gJiYgdGhpcy5ub2RlVHlwZSA9PT0gMSkgew0KCQkJCQkJCS8vIERvZXNuJ3QgbWF0dGVyIHdo
YXQgaXQgaXMsIHRoZSBmaXJzdCBjaGlsZHJlbiBlbGVtZW50IHdpbGwgYmUgY29uc2lkZXJhdGVk
IGFzIHRoZSBjYXB0aW9uDQoJCQkJCQkJY2FwdGlvbiA9IHRoaXM7DQoJCQkJCQkJcmV0dXJuOw0K
CQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQkJLy8gVXNlIHRoZSBjaGlsZHJlbiBmdW5jdGlvbiB0byBy
ZXRyZWl2ZSB0aGUgZGVzY3JpcHRpb24NCgkJCQkJJChlbGVtKS5jaGlsZHJlbigpLmZpbHRlcihm
dW5jdGlvbiAoKSB7DQoJCQkJCQkvLyBpZiB0aGUgY2FwdGlvbiBhcmUgYW4gZWxlbWVudCwgd2Ug
c2hvdWxkIGlnbm9yZSB0aGUgZmlyc3Qgb25lDQoJCQkJCQlpZiAoY2FwdGlvbkZvdW5kKSB7DQoJ
CQkJCQkJZGVzY3JpcHRpb24ucHVzaCh0aGlzKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJY2Fw
dGlvbkZvdW5kID0gdHJ1ZTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJ
Y2FwdGlvbiA9IGVsZW07DQoJCQkJfQ0KCQkJCS8vIGNvbnNvbGUubG9nKGNhcHRpb24pOw0KCQkJ
CS8vIE1vdmUgdGhlIGRlc2NyaXB0aW4gaW4gYSB3cmFwcGVyIGlmIHRoZXJlIGlzIG1vcmUgdGhh
biBvbmUgZWxlbWVudA0KCQkJCWlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiAxKSB7DQoJCQkJCWdy
b3VwaGVhZGVyY2VsbC5kZXNjcmlwdGlvbiA9ICQoZGVzY3JpcHRpb24pOw0KCQkJCX0gZWxzZSBp
ZiAoZGVzY3JpcHRpb24ubGVuZ3RoID09PSAxKSB7DQoJCQkJCWdyb3VwaGVhZGVyY2VsbC5kZXNj
cmlwdGlvbiA9IGRlc2NyaXB0aW9uWzBdOw0KCQkJCX0NCgkJCQlpZiAoY2FwdGlvbikgew0KCQkJ
CQlncm91cGhlYWRlcmNlbGwuY2FwdGlvbiA9IGNhcHRpb247DQoJCQkJfQ0KCQkJCWdyb3VwaGVh
ZGVyY2VsbC5ncm91cFplcm8gPSBncm91cFplcm87DQoJCQkJZ3JvdXBoZWFkZXJjZWxsLnR5cGUg
PSAxOw0KCQkJCWdyb3VwWmVyby5ncm91cGhlYWRlcmNlbGwgPSBncm91cGhlYWRlcmNlbGw7DQoJ
CQkJJChlbGVtKS5kYXRhKCkudGJscGFyc2VyID0gZ3JvdXBoZWFkZXJjZWxsOw0KCQkJfQ0KCQkJ
ZnVuY3Rpb24gcHJvY2Vzc0NvbGdyb3VwKGVsZW0sIG5idmlydHVhbGNvbCkgew0KCQkJCS8vIGlm
IGVsZW0gaXMgdW5kZWZpbmVkLCB0aGlzIG1lYW4gdGhhdCBpcyBhbiBiaWcgZW1wdHkgY29sZ3Jv
dXANCgkJCQkvLyBuYnZpcnR1YWxjb2wgaWYgZGVmaW5lZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUg
dmlydHVhbCBjb2xncm91cA0KCQkJCXZhciBjb2xncm91cCA9IHsNCgkJCQkJCWVsZW06IHt9LA0K
CQkJCQkJc3RhcnQ6IDAsDQoJCQkJCQllbmQ6IDAsDQoJCQkJCQljb2w6IFtdLA0KCQkJCQkJZ3Jv
dXBaZXJvOiBncm91cFplcm8NCgkJCQkJfSwNCgkJCQkJY29sZ3JvdXBzcGFuID0gMCwNCgkJCQkJ
d2lkdGgsDQoJCQkJCWksDQoJCQkJCV9pbGVuLA0KCQkJCQljb2w7DQoJCQkJY29sZ3JvdXAuZWxl
bSA9IGVsZW07DQoJCQkJaWYgKGVsZW0pIHsNCgkJCQkJJChlbGVtKS5kYXRhKCkudGJscGFyc2Vy
ID0gY29sZ3JvdXA7DQoJCQkJfQ0KCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJCQkJdWlk
RWxlbSArPSAxOw0KCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChjb2xncm91cCk7DQoJ
CQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoICE9PSAwKSB7DQoJCQkJCWNvbGdyb3VwLnN0YXJ0
ID0gY29sZ3JvdXBGcmFtZVtjb2xncm91cEZyYW1lLmxlbmd0aCAtIDFdLmVuZCArIDE7DQoJCQkJ
fSBlbHNlIHsNCgkJCQkJY29sZ3JvdXAuc3RhcnQgPSAxOw0KCQkJCX0NCg0KCQkJCS8vIEFkZCBh
bnkgZXhpc3Qgc3RydWN0dXJhbCBjb2wgZWxlbWVudA0KCQkJCWlmIChlbGVtKSB7DQoJCQkJCSQo
J2NvbCcsIGVsZW0pLmVhY2goZnVuY3Rpb24gKCkgew0KCQkJCQkJdmFyICR0aGlzID0gJCh0aGlz
KSwNCgkJCQkJCQl3aWR0aCA9ICR0aGlzLmF0dHIoJ3NwYW4nKSAhPT0gdW5kZWZpbmVkID8gcGFy
c2VJbnQoJHRoaXMuYXR0cignc3BhbicpLCAxMCkgOiAxLA0KCQkJCQkJCWNvbCA9IHsNCgkJCQkJ
CQkJZWxlbToge30sDQoJCQkJCQkJCXN0YXJ0OiAwLA0KCQkJCQkJCQllbmQ6IDAsDQoJCQkJCQkJ
CWdyb3VwWmVybzogZ3JvdXBaZXJvDQoJCQkJCQkJfTsNCgkJCQkJCWNvbC51aWQgPSB1aWRFbGVt
Ow0KCQkJCQkJdWlkRWxlbSArPSAxOw0KCQkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNlck9iai5wdXNo
KGNvbCk7DQoJCQkJCQljb2wuc3RhcnQgPSBjb2xncm91cC5zdGFydCArIGNvbGdyb3Vwc3BhbjsN
CgkJCQkJCWNvbC5lbmQgPSBjb2xncm91cC5zdGFydCArIGNvbGdyb3Vwc3BhbiArIHdpZHRoIC0g
MTsgLy8gTWludXMgb25lIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2FzIGFscmVhZHkgY2Fs
Y3VsYXRlZA0KCQkJCQkJY29sLmVsZW0gPSB0aGlzOw0KCQkJCQkJY29sLmdyb3VwWmVybyA9IGdy
b3VwWmVybzsNCgkJCQkJCSR0aGlzLmRhdGEoKS50YmxwYXJzZXIgPSBjb2w7DQoJCQkJCQljb2xn
cm91cC5jb2wucHVzaChjb2wpOw0KCQkJCQkJY29sdW1uRnJhbWUucHVzaChjb2wpOw0KCQkJCQkJ
Y29sZ3JvdXBzcGFuICs9IHdpZHRoOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQkJLy8gSWYgbm8gY29s
IGVsZW1lbnQgY2hlY2sgZm9yIHRoZSBzcGFuIGF0dHJpYnV0ZQ0KCQkJCWlmIChjb2xncm91cC5j
b2wubGVuZ3RoID09PSAwKSB7DQoJCQkJCWlmIChlbGVtKSB7DQoJCQkJCQl3aWR0aCA9ICQoZWxl
bSkuYXR0cignc3BhbicpICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCgkKGVsZW0pLmF0dHIoJ3Nw
YW4nKSwgMTApIDogMTsNCgkJCQkJfSBlbHNlIGlmICh0eXBlb2YgbmJ2aXJ0dWFsY29sID09PSAi
bnVtYmVyIikgew0KCQkJCQkJd2lkdGggPSBuYnZpcnR1YWxjb2w7DQoJCQkJCX0gZWxzZSB7DQoJ
CQkJCQllcnJvclRyaWdnZXIoMzEsICdJbnRlcm5hbCBFcnJvciwgTnVtYmVyIG9mIHZpcnR1YWwg
Y29sdW1uIG11c3QgYmUgc2V0IFtmdW5jdGlvbiBwcm9jZXNzQ29sZ3JvdXAoKV0nKTsNCgkJCQkJ
CXJldHVybjsNCgkJCQkJfQ0KCQkJCQljb2xncm91cHNwYW4gKz0gd2lkdGg7DQoJCQkJCS8vIENy
ZWF0ZSB2aXJ0dWFsIGNvbHVtbiANCgkJCQkJZm9yIChpID0gY29sZ3JvdXAuc3RhcnQsIF9pbGVu
ID0gKGNvbGdyb3VwLnN0YXJ0ICsgY29sZ3JvdXBzcGFuKTsgaSA8IF9pbGVuOyBpICs9IDEpIHsN
CgkJCQkJCWNvbCA9IHsNCgkJCQkJCQlzdGFydDogMCwNCgkJCQkJCQllbmQ6IDAsDQoJCQkJCQkJ
Z3JvdXBaZXJvOiBncm91cFplcm8sDQoJCQkJCQkJZWxlbTogdW5kZWZpbmVkDQoJCQkJCQl9Ow0K
CQkJCQkJY29sLnVpZCA9IHVpZEVsZW07DQoJCQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91
cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goY29sKTsNCgkJCQkJCWNvbC5zdGFydCA9IGk7DQoJCQkJ
CQljb2wuZW5kID0gaTsNCgkJCQkJCWNvbGdyb3VwLmNvbC5wdXNoKGNvbCk7DQoJCQkJCQljb2x1
bW5GcmFtZS5wdXNoKGNvbCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJY29sZ3JvdXAuZW5kID0gY29s
Z3JvdXAuc3RhcnQgKyBjb2xncm91cHNwYW4gLSAxOw0KCQkJCWNvbGdyb3VwRnJhbWUucHVzaChj
b2xncm91cCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBwcm9jZXNzUm93Z3JvdXBIZWFkZXIoY29sZ3Jv
dXBIZWFkZXJDb2xFbmQpIHsgLy8gdGhlYWQgcm93IGdyb3VwIHByb2Nlc3NpbmcNCgkJCQl2YXIg
aSwgX2lsZW4sDQoJCQkJCWosIF9qbGVuLA0KCQkJCQltLCBfbWxlbiwNCgkJCQkJdG1wU3RhY2sg
PSBbXSwNCgkJCQkJdG1wU3RhY2tDdXJyLA0KCQkJCQl0bXBTdGFja0NlbGwsDQoJCQkJCWRhdGFD
b2xncm91cCwNCgkJCQkJZGF0YUNvbHVtbnMsDQoJCQkJCWNvbGdyb3VwLA0KCQkJCQljb2wsDQoJ
CQkJCWhjb2xncm91cCwNCgkJCQkJbHN0UmVhbENvbGdyb3VwLA0KCQkJCQljdXJyQ29sUG9zLA0K
CQkJCQljdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUsDQoJCQkJCWNvbEZybUlkLA0KCQkJCQliaWdUb3Rh
bENvbGdyb3VwRm91bmQsDQoJCQkJCXRoZWFkUlNOZXh0LA0KCQkJCQl0aGVhZFJTTmV4dENlbGws
DQoJCQkJCWNlbGwsDQoJCQkJCWd6Q29sLA0KCQkJCQl0aGVhZFJTOw0KDQoJCQkJaWYgKGdyb3Vw
WmVyby5jb2xncm91cGhlYWQgfHwgcm93Z3JvdXBoZWFkZXJjYWxsZWQpIHsNCgkJCQkJcmV0dXJu
OyAvLyBQcmV2ZW50IG11bHRpcGxlIGNhbGwNCgkJCQl9DQoJCQkJcm93Z3JvdXBoZWFkZXJjYWxs
ZWQgPSB0cnVlOw0KCQkJCWlmIChjb2xncm91cEhlYWRlckNvbEVuZCAmJiBjb2xncm91cEhlYWRl
ckNvbEVuZCA+IDApIHsNCgkJCQkJLy8gVGhlIGZpcnN0IGNvbGdyb3VwIG11c3QgbWF0Y2ggdGhl
IGNvbGdyb3VwSGVhZGVyQ29sRW5kDQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA+IDAg
JiYgKGNvbGdyb3VwRnJhbWVbMF0uc3RhcnQgIT09IDEgfHwgKGNvbGdyb3VwRnJhbWVbMF0uZW5k
ICE9PSBjb2xncm91cEhlYWRlckNvbEVuZCAmJiBjb2xncm91cEZyYW1lWzBdLmVuZCAhPT0gKGNv
bGdyb3VwSGVhZGVyQ29sRW5kICsgMSkpKSkgew0KCQkJCQkJZXJyb3JUcmlnZ2VyKDMsICdUaGUg
Zmlyc3QgY29sZ3JvdXAgbXVzdCBiZSBzcGFubmVkIGVpdGhlciAnICsgY29sZ3JvdXBIZWFkZXJD
b2xFbmQgKyAnIG9yICcgKyAoY29sZ3JvdXBIZWFkZXJDb2xFbmQgKyAxKSk7DQoNCgkJCQkJCS8v
IERlc3Ryb3kgYW55IGV4aXN0aW5nIGNvbGdyb3VwLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCB2YWxp
ZA0KCQkJCQkJY29sZ3JvdXBGcmFtZSA9IFtdOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJ
Y29sZ3JvdXBIZWFkZXJDb2xFbmQgPSAwOyAvLyBUaGlzIG1lYW4gdGhhdCBhcmUgbm8gY29sZ3Jv
dXAgZGVzaWduYXRlZCB0byBiZSBhIGNvbGdyb3VwIGhlYWRlcg0KCQkJCX0NCgkJCQkvLyBjb25z
b2xlLmxvZygnQ2FsbCBQcm9jZXNzUm93R3JvdXBIZWFkZXInKTsNCg0KCQkJCS8vIEFzc29jaWF0
ZSBhbnkgZGVzY3JpcHRpdmUgY2VsbCB0byBoaXMgdG9wIGhlYWRlcg0KCQkJCWZvciAoaSA9IDAs
IF9pbGVuID0gdGhlYWRSb3dTdGFjay5sZW5ndGg7IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJ
CXRoZWFkUlMgPSB0aGVhZFJvd1N0YWNrW2ldOw0KCQkJCQlpZiAoIXRoZWFkUlMudHlwZSkgew0K
CQkJCQkJdGhlYWRSUy50eXBlID0gMTsNCgkJCQkJfQ0KDQoJCQkJCWZvciAoaiA9IDAsIF9qbGVu
ID0gdGhlYWRSUy5jZWxsLmxlbmd0aDsgaiA8IF9qbGVuOyBqICs9IDEpIHsNCgkJCQkJCWNlbGwg
PSB0aGVhZFJvd1N0YWNrW2ldLmNlbGxbal07DQoJCQkJCQljZWxsLnNjb3BlID0gImNvbCI7DQoN
CgkJCQkJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBsYXlvdXQgY2VsbCBhdCB0aGUgdG9wLCBsZWZ0
DQoJCQkJCQlpZiAoaSA9PT0gMCAmJiBqID09PSAwICYmICQoY2VsbC5lbGVtKS5odG1sKCkubGVu
Z3RoID09PSAwKSB7DQoJCQkJCQkJLy8gVGhhdCBpcyBhIGxheW91dCBjZWxsDQoJCQkJCQkJY2Vs
bC50eXBlID0gNjsgLy8gTGF5b3V0IGNlbGwNCgkJCQkJCQlpZiAoIWdyb3VwWmVyby5sYXlvdXRD
ZWxsKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5sYXlvdXRDZWxsID0gW107DQoJCQkJCQkJfQ0KCQkJ
CQkJCWdyb3VwWmVyby5sYXlvdXRDZWxsLnB1c2goY2VsbCk7DQoNCgkJCQkJCQlqID0gY2VsbC53
aWR0aCAtIDE7DQoJCQkJCQkJaWYgKGogPj0gX2psZW4pIHsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJ
CQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayB0aGUgbmV4dCByb3cgdG8gc2VlIGlmIHRo
ZXkgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRpb24gY2VsbA0KCQkJCQkJdGhlYWRSU05l
eHQgPSB0aGVhZFJvd1N0YWNrW2kgKyAxXTsNCgkJCQkJCXRoZWFkUlNOZXh0Q2VsbCA9ICh0aGVh
ZFJTTmV4dCA/IHRoZWFkUlNOZXh0LmNlbGxbal0gOiAiIik7DQoJCQkJCQlpZiAoIWNlbGwuZGVz
Y0NlbGwgJiYNCgkJCQkJCQkJY2VsbC5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0
aCcgJiYNCgkJCQkJCQkJIWNlbGwudHlwZSAmJg0KCQkJCQkJCQl0aGVhZFJTTmV4dCAmJg0KCQkJ
CQkJCQl0aGVhZFJTTmV4dC51aWQgIT09IGNlbGwudWlkICYmDQoJCQkJCQkJCXRoZWFkUlNOZXh0
Q2VsbCAmJg0KCQkJCQkJCQkhdGhlYWRSU05leHRDZWxsLnR5cGUgJiYNCgkJCQkJCQkJdGhlYWRS
U05leHRDZWxsLmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RkJyAmJg0KCQkJCQkJ
CQl0aGVhZFJTTmV4dENlbGwud2lkdGggPT09IGNlbGwud2lkdGggJiYNCgkJCQkJCQkJdGhlYWRS
U05leHRDZWxsLmhlaWdodCA9PT0gMSkgew0KDQoJCQkJCQkJdGhlYWRSU05leHQudHlwZSA9IDU7
IC8vIE1hcmsgdGhlIG5leHQgcm93IGFzIGEgcm93IGRlc2NyaXB0aW9uDQoJCQkJCQkJdGhlYWRS
U05leHRDZWxsLnR5cGUgPSA1OyAvLyBNYXJrIHRoZSBjZWxsIGFzIGEgY2VsbCBkZXNjcmlwdGlv
bg0KCQkJCQkJCXRoZWFkUlNOZXh0Q2VsbC5yb3cgPSB0aGVhZFJTOw0KCQkJCQkJCWNlbGwuZGVz
Y0NlbGwgPSB0aGVhZFJTTmV4dENlbGw7DQoNCgkJCQkJCQkvLyBBZGQgdGhlIGRlc2NyaXB0aW9u
IGNlbGwgdG8gdGhlIGNvbXBsZXRlIGxpc3RpbmcNCgkJCQkJCQlpZiAoIWdyb3VwWmVyby5kZXNj
Y2VsbCkgew0KCQkJCQkJCQlncm91cFplcm8uZGVzY2NlbGwgPSBbXTsNCgkJCQkJCQl9DQoJCQkJ
CQkJZ3JvdXBaZXJvLmRlc2NjZWxsLnB1c2godGhlYWRSU05leHRDZWxsKTsNCg0KCQkJCQkJCWog
PSBjZWxsLndpZHRoIC0gMTsNCgkJCQkJCQlpZiAoaiA+PSBfamxlbikgew0KCQkJCQkJCQlicmVh
azsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICghY2VsbC50eXBlKSB7DQoJCQkJCQkJ
Y2VsbC50eXBlID0gMTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIENsZWFuIHRo
ZSB0aGVhZFJvd1N0YWNrIGJ5IHJlbW92aW5nIGFueSBkZXNjcmlwdGl2ZSByb3cNCgkJCQlmb3Ig
KGkgPSAwLCBfaWxlbiA9IHRoZWFkUm93U3RhY2subGVuZ3RoOyBpIDwgX2lsZW47IGkgKz0gMSkg
ew0KCQkJCQl0aGVhZFJTID0gdGhlYWRSb3dTdGFja1tpXTsNCgkJCQkJaWYgKHRoZWFkUlMudHlw
ZSA9PT0gNSkgew0KCQkJCQkJLy8gQ2hlY2sgaWYgYWxsIHRoZSBjZWxsIGluIGl0IGFyZSBzZXQg
dG8gdGhlIHR5cGUgNQ0KCQkJCQkJZm9yIChqID0gMCwgX2psZW4gPSB0aGVhZFJTLmNlbGwubGVu
Z3RoOyBqIDwgX2psZW47IGogKz0gMSkgew0KCQkJCQkJCWNlbGwgPSB0aGVhZFJTLmNlbGxbal07
DQoJCQkJCQkJaWYgKGNlbGwudHlwZSAhPT0gNSAmJiBjZWxsLnR5cGUgIT09IDYgJiYgY2VsbC5o
ZWlnaHQgPT09IDEpIHsNCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDQsICcgWW91IGhhdmUgYW4gaW52
YWxpZCBjZWxsIGluc2lkZSBhIHJvdyBkZXNjcmlwdGlvbicsIGNlbGwuZWxlbSk7DQoJCQkJCQkJ
fQ0KDQoJCQkJCQkJLy8gQ2hlY2sgdGhlIHJvdyBiZWZvcmUgYW5kIG1vZGlmeSB0aGVpciBoZWln
aHQgdmFsdWUNCgkJCQkJCQlpZiAoY2VsbC51aWQgPT09IHRoZWFkUm93U3RhY2tbaSAtIDFdLmNl
bGxbal0udWlkKSB7DQoJCQkJCQkJCWNlbGwuaGVpZ2h0IC09IDE7DQoJCQkJCQkJfQ0KCQkJCQkJ
fQ0KCQkJCQkJZ3JvdXBaZXJvLm5iRGVzY3JpcHRpb25Sb3cgKz0gMTsNCgkJCQkJfSBlbHNlIHsN
CgkJCQkJCXRtcFN0YWNrLnB1c2godGhlYWRSUyk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZ3JvdXBa
ZXJvLmNvbGdycCA9IFtdOyAvLyBBcnJheSBiYXNlZCBvbiBsZXZlbCBhcyBpbmRleGVzIGZvciBj
b2x1bW5zIGFuZCBncm91cCBoZWFkZXJzDQoNCgkJCQkvLyBQYXJzZXIgYW55IGNlbGwgaW4gdGhl
IGNvbGdyb3VwIGhlYWRlcg0KCQkJCWlmIChjb2xncm91cEhlYWRlckNvbEVuZCA+IDAgJiYgKGNv
bGdyb3VwRnJhbWUubGVuZ3RoID09PSAxIHx8IGNvbGdyb3VwRnJhbWUubGVuZ3RoID09PSAwKSkg
ew0KCQkJCQkvLyBUaGVyZSBhcmUgbm8gY29sZ3JvdXAgZWxlbWVudCBkZWZpbmVkLCBBbGwgdGhl
IGNlbGwgd2lsbCBiZSBjb25zaWRlcmF0ZWQgdG8gYmUgYSBkYXRhIGNlbGwNCgkJCQkJLy8gRGF0
YSBDb2xncm91cA0KCQkJCQlkYXRhQ29sZ3JvdXAgPSB7fTsNCgkJCQkJZGF0YUNvbHVtbnMgPSBb
XTsNCgkJCQkJY29sZ3JvdXAgPSB7DQoJCQkJCQlzdGFydDogKGNvbGdyb3VwSGVhZGVyQ29sRW5k
ICsgMSksDQoJCQkJCQllbmQ6IHRhYmxlQ2VsbFdpZHRoLA0KCQkJCQkJY29sOiBbXSwNCgkJCQkJ
CWdyb3VwWmVybzogZ3JvdXBaZXJvLA0KCQkJCQkJZWxlbTogdW5kZWZpbmVkLA0KCQkJCQkJdHlw
ZTogMiAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlDQoJCQkJCX07DQoJCQkJCWNvbGdyb3VwLnVp
ZCA9IHVpZEVsZW07DQoJCQkJCXVpZEVsZW0gKz0gMTsNCgkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNl
ck9iai5wdXNoKGNvbGdyb3VwKTsNCg0KCQkJCQlpZiAoY29sZ3JvdXAuc3RhcnQgPiBjb2xncm91
cC5lbmQpIHsNCgkJCQkJCWVycm9yVHJpZ2dlcig1LCAnWW91IG5lZWQgYXQgbGVhc3Qgb25lIGRh
dGEgY29sZ3JvdXAsIHJldmlldyB5b3VyIHRhYmxlIHN0cnVjdHVyZScpOw0KCQkJCQl9DQoNCgkJ
CQkJZGF0YUNvbGdyb3VwID0gY29sZ3JvdXA7DQoNCgkJCQkJLy8gQ3JlYXRlIHRoZSBjb2x1bW4N
CgkJCQkJLy8gQ3JlYXRlIHZpcnR1YWwgY29sdW1uIA0KCQkJCQlmb3IgKGkgPSBjb2xncm91cC5z
dGFydCwgX2lsZW4gPSBjb2xncm91cC5lbmQ7IGkgPD0gX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJ
Y29sID0gew0KCQkJCQkJCXN0YXJ0OiAwLA0KCQkJCQkJCWVuZDogMCwNCgkJCQkJCQlncm91cFpl
cm86IGdyb3VwWmVybywNCgkJCQkJCQllbGVtOiB1bmRlZmluZWQNCgkJCQkJCX07DQoJCQkJCQlj
b2wudWlkID0gdWlkRWxlbTsNCgkJCQkJCXVpZEVsZW0gKz0gMTsNCgkJCQkJCWdyb3VwWmVyby5h
bGxQYXJzZXJPYmoucHVzaChjb2wpOw0KDQoJCQkJCQlpZiAoIWdyb3VwWmVyby5jb2wpIHsNCgkJ
CQkJCQlncm91cFplcm8uY29sID0gW107DQoJCQkJCQl9DQoJCQkJCQlkYXRhQ29sdW1ucy5wdXNo
KGNvbCk7DQoNCgkJCQkJCWNvbC5zdGFydCA9IGk7DQoJCQkJCQljb2wuZW5kID0gaTsNCgkJCQkJ
CWNvbC5ncm91cHN0cnVjdCA9IGNvbGdyb3VwOw0KDQoJCQkJCQljb2xncm91cC5jb2wucHVzaChj
b2wpOw0KCQkJCQkJY29sdW1uRnJhbWUucHVzaChjb2wpOyAvLyBDaGVjayB0byByZW1vdmUgImNv
bHVtbkZyYW1lIg0KCQkJCQl9DQoNCgkJCQkJLy8gRGVmYXVsdCBMZXZlbCA9PiAxDQoJCQkJCWdy
b3VwWmVyby5jb2xncnBbMV0gPSBbXTsNCgkJCQkJZ3JvdXBaZXJvLmNvbGdycFsxXS5wdXNoKGdy
b3VwWmVyby5jb2xjYXB0aW9uKTsNCg0KCQkJCQkvLyBIZWFkZXIgQ29sZ3JvdXANCgkJCQkJaWYg
KGNvbGdyb3VwSGVhZGVyQ29sRW5kID4gMCkgew0KCQkJCQkJaGNvbGdyb3VwID0gew0KCQkJCQkJ
CXN0YXJ0OiAxLA0KCQkJCQkJCWVsZW06IHVuZGVmaW5lZCwNCgkJCQkJCQllbmQ6IGNvbGdyb3Vw
SGVhZGVyQ29sRW5kLA0KCQkJCQkJCWNvbDogW10sDQoJCQkJCQkJZ3JvdXBaZXJvOiBncm91cFpl
cm8sDQoJCQkJCQkJdHlwZTogMSAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlDQoJCQkJCQl9Ow0K
CQkJCQkJaGNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJCQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJ
CQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goaGNvbGdyb3VwKTsNCg0KCQkJCQkJY29sZ3Jv
dXBGcmFtZS5wdXNoKGhjb2xncm91cCk7DQoJCQkJCQljb2xncm91cEZyYW1lLnB1c2goZGF0YUNv
bGdyb3VwKTsNCgkJCQkJCWdyb3VwWmVyby5jb2xjYXB0aW9uLmRhdGFzZXQgPSBkYXRhQ29sZ3Jv
dXAuY29sOw0KDQoJCQkJCQkvLyBDcmVhdGUgdGhlIGNvbHVtbg0KCQkJCQkJLy8gQ3JlYXRlIHZp
cnR1YWwgY29sdW1uIA0KCQkJCQkJZm9yIChpID0gaGNvbGdyb3VwLnN0YXJ0LCBfaWxlbiA9IGhj
b2xncm91cC5lbmQ7IGkgPD0gX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJCWNvbCA9IHsNCgkJCQkJ
CQkJc3RhcnQ6IDAsDQoJCQkJCQkJCWVuZDogMCwNCgkJCQkJCQkJZ3JvdXBaZXJvOiBncm91cFpl
cm8sDQoJCQkJCQkJCWVsZW06IHVuZGVmaW5lZA0KCQkJCQkJCX07DQoJCQkJCQkJY29sLnVpZCA9
IHVpZEVsZW07DQoJCQkJCQkJdWlkRWxlbSArPSAxOw0KCQkJCQkJCWdyb3VwWmVyby5hbGxQYXJz
ZXJPYmoucHVzaChjb2wpOw0KDQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sKSB7DQoJCQkJCQkJ
CWdyb3VwWmVyby5jb2wgPSBbXTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbC5wdXNo
KGNvbCk7DQoNCgkJCQkJCQljb2wuc3RhcnQgPSBpOw0KCQkJCQkJCWNvbC5lbmQgPSBpOw0KCQkJ
CQkJCWNvbC5ncm91cHN0cnVjdCA9IGhjb2xncm91cDsNCg0KCQkJCQkJCWhjb2xncm91cC5jb2wu
cHVzaChjb2wpOw0KCQkJCQkJCWNvbHVtbkZyYW1lLnB1c2goY29sKTsNCgkJCQkJCX0NCg0KCQkJ
CQkJZm9yIChpID0gMCwgX2lsZW4gPSBkYXRhQ29sdW1ucy5sZW5ndGg7IGkgPCBfaWxlbjsgaSAr
PSAxKSB7DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbC5wdXNoKGRhdGFDb2x1bW5zW2ldKTsNCgkJCQkJ
CX0NCgkJCQkJfQ0KDQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA9PT0gMCkgew0KCQkJ
CQkJY29sZ3JvdXBGcmFtZS5wdXNoKGRhdGFDb2xncm91cCk7DQoJCQkJCQlncm91cFplcm8uY29s
Y2FwdGlvbi5kYXRhc2V0ID0gZGF0YUNvbGdyb3VwLmNvbDsNCgkJCQkJfQ0KDQoJCQkJCS8vIFNl
dCB0aGUgaGVhZGVyIGZvciBlYWNoIGNvbHVtbg0KCQkJCQlmb3IgKGkgPSAwLCBfaWxlbiA9IGdy
b3VwWmVyby5jb2wubGVuZ3RoOyBpIDwgX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJZ3pDb2wgPSBn
cm91cFplcm8uY29sW2ldOw0KCQkJCQkJZ3pDb2wuaGVhZGVyID0gW107DQoJCQkJCQlmb3IgKGog
PSAwLCBfamxlbiA9IHRtcFN0YWNrLmxlbmd0aDsgaiA8IF9qbGVuOyBqICs9IDEpIHsNCgkJCQkJ
CQlmb3IgKG0gPSBnekNvbC5zdGFydCwgX21sZW4gPSBnekNvbC5lbmQ7IG0gPD0gX21sZW47IG0g
Kz0gMSkgew0KCQkJCQkJCQlpZiAoKGogPT09IDAgfHwgKGogPiAwICYmIHRtcFN0YWNrW2pdLmNl
bGxbbSAtIDFdLnVpZCAhPT0gdG1wU3RhY2tbaiAtIDFdLmNlbGxbbSAtIDFdLnVpZCkpICYmIHRt
cFN0YWNrW2pdLmNlbGxbbSAtIDFdLnR5cGUgPT09IDEpIHsNCgkJCQkJCQkJCWd6Q29sLmhlYWRl
ci5wdXNoKHRtcFN0YWNrW2pdLmNlbGxbbSAtIDFdKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJ
CQkJCX0NCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFRoZXkgZXhpc3QgY29sZ3JvdXAg
ZWxlbWVudCwgDQoJCQkJCS8vDQoJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQkJCS8vDQoJCQkJCS8vIEJ1aWxkIGRhdGEgY29s
dW1uIGdyb3VwIGJhc2VkIG9uIHRoZSBkYXRhIGNvbHVtbiBncm91cCBhbmQgc3VtbWFyeSBjb2x1
bW4gZ3JvdXAuDQoJCQkJCS8vDQoJCQkJCS8vIFN1Z2dlc3Rpb246IEluIHRoZSBmdXR1cmUsIG1h
eSBiZSBhbGxvdyB0aGUgdXNlIG9mIGEgSFRNTDUgZGF0YSBvciBDU1MgT3B0aW9uIHRvIGZvcmNl
IGEgY29sZ3JvdXAgdG8gYmUgYSBkYXRhIGdyb3VwIGluc3RlYWQgb2YgYSBzdW1tYXJ5IGdyb3Vw
DQoJCQkJCS8vDQoJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tDQoJCQkJCS8vDQoJCQkJCWxzdFJlYWxDb2xncm91cCA9IFtdOyAvLyBM
aXN0IG9mIHJlYWwgY29sZ3JvdXANCgkJCQkJY3VyckNvbFBvcyA9IChjb2xncm91cEhlYWRlckNv
bEVuZCA9PT0gMCA/IDEgOiBjb2xncm91cEZyYW1lWzBdLmVuZCArIDEpOyAvLyBTZXQgdGhlIGN1
cnJlbnQgY29sdW1uIHBvc2l0aW9uDQoJCQkJCWNvbGdyb3VwID0gew0KCQkJCQkJc3RhcnQ6IGN1
cnJDb2xQb3MsDQoJCQkJCQllbmQ6IHVuZGVmaW5lZCwNCgkJCQkJCWNvbDogW10sDQoJCQkJCQly
b3c6IFtdLA0KCQkJCQkJdHlwZTogMiAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlLCB0aGF0IGlz
IHRoZSBpbml0aWFsIGNvbGdyb3VwIHR5cGUNCgkJCQkJfTsNCgkJCQkJY3VyckNvbGdyb3VwU3Ry
dWN0dXJlID0gW107DQoJCQkJCWNvbEZybUlkID0gMDsNCgkJCQkJYmlnVG90YWxDb2xncm91cEZv
dW5kID0gZmFsc2U7DQoNCgkJCQkJJC5lYWNoKGNvbGdyb3VwRnJhbWUsIGZ1bmN0aW9uICgpIHsN
CgkJCQkJCXZhciBjdXJDb2xncm91cEZyYW1lID0gdGhpcywNCgkJCQkJCQlncm91cExldmVsLA0K
CQkJCQkJCWNncnAsDQoJCQkJCQkJcGFyZW50SGVhZGVyLA0KCQkJCQkJCXN1bW1hcnlBdHRhY2hl
ZDsNCg0KCQkJCQkJY29sRnJtSWQgKz0gMTsNCg0KCQkJCQkJaWYgKGJpZ1RvdGFsQ29sZ3JvdXBG
b3VuZCB8fCBncm91cFplcm8uY29sZ3JwWzBdKSB7DQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDYsICJU
aGUgTG93ZXN0IGNvbHVtbiBncm91cCBoYXZlIGJlZW4gZm91bmQsIFlvdSBtYXkgaGF2ZSBhbiBl
cnJvciBpbiB5b3UgY29sdW1uIHN0cnVjdHVyZSIsIGN1ckNvbGdyb3VwRnJhbWUpOw0KCQkJCQkJ
CXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJJC5lYWNoKGN1ckNvbGdyb3VwRnJhbWUuY29sLCBm
dW5jdGlvbiAoKSB7DQoJCQkJCQkJdmFyIGNvbHVtbiA9IHRoaXM7DQoJCQkJCQkJaWYgKCFncm91
cFplcm8uY29sKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5jb2wgPSBbXTsNCgkJCQkJCQl9DQoJCQkJ
CQkJZ3JvdXBaZXJvLmNvbC5wdXNoKGNvbHVtbik7DQoNCgkJCQkJCQljb2x1bW4udHlwZSA9IDE7
DQoJCQkJCQkJY29sdW1uLmdyb3Vwc3RydWN0ID0gY3VyQ29sZ3JvdXBGcmFtZTsNCgkJCQkJCX0p
Ow0KDQoJCQkJCQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS5zdGFydCA8IGN1cnJDb2xQb3MpIHsNCgkJ
CQkJCQlpZiAoY29sZ3JvdXBIZWFkZXJDb2xFbmQgIT09IGN1ckNvbGdyb3VwRnJhbWUuZW5kKSB7
DQoJCQkJCQkJCWVycm9yVHJpZ2dlcig3LCAiVGhlIGluaXRpYWwgY29sZ3JvdXAgc2hvdWxkIGdy
b3VwIGFsbCB0aGUgaGVhZGVyLCB0aGVyZSBhcmUgbm8gcGxhY2UgZm9yIGFueSBkYXRhIGNlbGwi
LCBjdXJDb2xncm91cEZyYW1lKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBTa2lwIHRoaXMgY29s
Z3JvdXAsIHRoaXMgc2hvdWxkIGhhcHBlbmVkIG9ubHkgb25jZSBhbmQgc2hvdWxkIHJlcHJlc2Vu
dCB0aGUgaGVhZGVyIGNvbGdyb3VwDQoNCgkJCQkJCQkvLyBBc3NpZ24gdGhlIGhlYWRlcnMgZm9y
IHRoaXMgZ3JvdXANCgkJCQkJCQlmb3IgKGkgPSAwLCBfaWxlbiA9IGN1ckNvbGdyb3VwRnJhbWUu
Y29sLmxlbmd0aDsgaSA8IF9pbGVuOyBpICs9IDEpIHsNCgkJCQkJCQkJZ3pDb2wgPSBjdXJDb2xn
cm91cEZyYW1lLmNvbFtpXTsNCgkJCQkJCQkJZ3pDb2wuaGVhZGVyID0gW107DQoJCQkJCQkJCWZv
ciAoaiA9IDAsIF9qbGVuID0gdG1wU3RhY2subGVuZ3RoOyBqIDwgX2psZW47IGogKz0gMSkgew0K
CQkJCQkJCQkJZm9yIChtID0gZ3pDb2wuc3RhcnQsIF9tbGVuID0gZ3pDb2wuZW5kOyBtIDw9IF9t
bGVuOyBtICs9IDEpIHsNCgkJCQkJCQkJCQlpZiAoKGogPT09IDAgfHwgKGogPiAwICYmIHRtcFN0
YWNrW2pdLmNlbGxbbSAtIDFdLnVpZCAhPT0gdG1wU3RhY2tbaiAtIDFdLmNlbGxbbSAtIDFdLnVp
ZCkpICYmIHRtcFN0YWNrW2pdLmNlbGxbbSAtIDFdLnR5cGUgPT09IDEpIHsNCgkJCQkJCQkJCQkJ
Z3pDb2wuaGVhZGVyLnB1c2godG1wU3RhY2tbal0uY2VsbFttIC0gMV0pOw0KCQkJCQkJCQkJCX0N
CgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJ
CX0NCg0KCQkJCQkJZ3JvdXBMZXZlbCA9IHVuZGVmaW5lZDsNCg0KCQkJCQkJLy8gR2V0IHRoZSBj
b2xncm91cCBsZXZlbA0KCQkJCQkJZm9yIChpID0gMCwgX2lsZW4gPSB0bXBTdGFjay5sZW5ndGg7
IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDZWxsID0gdG1wU3RhY2tbaV0u
Y2VsbFtjdXJDb2xncm91cEZyYW1lLmVuZCAtIDFdOw0KCQkJCQkJCWlmICgodG1wU3RhY2tDZWxs
LmNvbHBvcyArIHRtcFN0YWNrQ2VsbC53aWR0aCAtIDEpID09PSBjdXJDb2xncm91cEZyYW1lLmVu
ZCAmJiAodG1wU3RhY2tDZWxsLmNvbHBvcyA+PSBjdXJDb2xncm91cEZyYW1lLnN0YXJ0KSkgew0K
CQkJCQkJCQlpZiAoIWdyb3VwTGV2ZWwgfHwgZ3JvdXBMZXZlbCA+IChpICsgMSkpIHsNCgkJCQkJ
CQkJCWdyb3VwTGV2ZWwgPSAoaSArIDEpOyAvLyB3b3VsZCBlcXVhbCBhdCB0aGUgY3VycmVudCBk
YXRhIGNlbGwgbGV2ZWwuIFRoZSBsb3dlc3Qgcm93IGxldmVsIHdpbg0KCQkJCQkJCQl9DQoJCQkJ
CQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIWdyb3VwTGV2ZWwpIHsNCgkJCQkJCQlncm91cExl
dmVsID0gMTsgLy8gRGVmYXVsdCBjb2xncm91cCBkYXRhIExldmVsLCB0aGlzIGhhcHBlbiB3aGVu
IHRoZXJlIGlzIG5vIGNvbHVtbiBoZWFkZXIsIChzYW1lIGFzIG5vIHRoZWFkKQ0KCQkJCQkJCS8v
IGVycm9yVHJpZ2dlcig4LCAiSW1wb3NzaWJsZSB0byBmaW5kIHRoZSBjb2xncm91cCBsZXZlbCwg
Q2hlY2sgeW91IGNvbGdyb3VwIGRlZmluaXRpb24gb3IvYW5kIHlvdXIgdGFibGUgc3RydWN0dXJl
Iik7IC8vIFRoYXQgaGFwcGVuZWQgaWYgd2UgZG9uJ3QgYWJsZSB0byBmaW5kIGFuIGVuZGluZyBj
ZWxsIGF0IHRoZSBlbmRpbmcgY29sZ3JvdXAgcG9zaXRpb24uDQoJCQkJCQl9DQoNCgkJCQkJCS8v
IEFsbCB0aGUgY2VsbHMgYXQgaGlnaGVyIGxldmVsIChCZWxsb3cgdGhlIGdyb3VwIGxldmVsIGZv
dW5kKSBvZiB3aXRjaCBvbmUgZm91bmQsIG5lZWQgdG8gYmUgaW5zaWRlIHRoZSBjb2xncm91cA0K
CQkJCQkJZm9yIChpID0gKGdyb3VwTGV2ZWwgLSAxKSwgX2lsZW4gPSB0bXBTdGFjay5sZW5ndGg7
IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDdXJyID0gdG1wU3RhY2tbaV07
DQoJCQkJCQkJLy8gVGVzdCBlYWNoIGNlbGwgaW4gdGhhdCBncm91cA0KCQkJCQkJCWZvciAoaiA9
IGN1ckNvbGdyb3VwRnJhbWUuc3RhcnQgLSAxLCBfamxlbiA9IGN1ckNvbGdyb3VwRnJhbWUuZW5k
OyBqIDwgX2psZW47IGogKz0gMSkgew0KCQkJCQkJCQl0bXBTdGFja0NlbGwgPSB0bXBTdGFja0N1
cnIuY2VsbFtqXTsNCgkJCQkJCQkJaWYgKHRtcFN0YWNrQ2VsbC5jb2xwb3MgPCBjdXJDb2xncm91
cEZyYW1lLnN0YXJ0IHx8ICh0bXBTdGFja0NlbGwuY29scG9zICsgdG1wU3RhY2tDZWxsLndpZHRo
IC0gMSkgPiBjdXJDb2xncm91cEZyYW1lLmVuZCkgew0KCQkJCQkJCQkJZXJyb3JUcmlnZ2VyKDks
ICJFcnJvciBpbiB5b3UgaGVhZGVyIHJvdyBncm91cCwgdGhlcmUgYXJlIGNlbGwgdGhhdCBhcmUg
Y3Jvc3NpbmcgbW9yZSB0aGFuIG9uZSBjb2xncm91cCB1bmRlciB0aGUgbGV2ZWw6IiArIGdyb3Vw
TGV2ZWwpOw0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0K
DQoNCgkJCQkJCS8vIEFkZCB2aXJ0dWFsIGNvbGdyb3VwIEJhc2VkIG9uIHRoZSB0b3AgaGVhZGVy
DQoJCQkJCQlmb3IgKGkgPSBjdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUubGVuZ3RoLCBfaWxlbiA9IChn
cm91cExldmVsIC0gMSk7IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDZWxs
ID0gdG1wU3RhY2tbaV0uY2VsbFtjdXJDb2xncm91cEZyYW1lLnN0YXJ0IC0gMV07DQoJCQkJCQkJ
Ly8gVXNlIHRoZSB0b3AgY2VsbCBhdCBsZXZlbCBtaW51cyAxLCB0aGF0IGNlbGwgbXVzdCBiZSBs
YXJnZXIgDQoJCQkJCQkJaWYgKHRtcFN0YWNrQ2VsbC51aWQgIT09IHRtcFN0YWNrW2ldLmNlbGxb
Y3VyQ29sZ3JvdXBGcmFtZS5lbmQgLSAxXS51aWQgfHwNCgkJCQkJCQkJCXRtcFN0YWNrQ2VsbC5j
b2xwb3MgPiBjdXJDb2xncm91cEZyYW1lLnN0YXJ0IHx8DQoJCQkJCQkJCQl0bXBTdGFja0NlbGwu
Y29scG9zICsgdG1wU3RhY2tDZWxsLndpZHRoIC0gMSA8IGN1ckNvbGdyb3VwRnJhbWUuZW5kKSB7
DQoJCQkJCQkJCWVycm9yVHJpZ2dlcigxMCwgIlRoZSBjZWxsIHVzZWQgdG8gcmVwcmVzZW50IHRo
ZSBkYXRhIGF0IGxldmVsOiAiICsgKGdyb3VwTGV2ZWwgLSAxKSArICIgbXVzdCBlbmNhcHN1bGF0
ZSBoaXMgZ3JvdXAgYW5kIGJlIHRoZSBzYW1lIik7DQoJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9
DQoNCgkJCQkJCQkvLyBDb252ZXJ0IHRoZSBoZWFkZXIgaW4gYSBncm91cCBoZWFkZXIgY2VsbA0K
CQkJCQkJCWNncnAgPSB0bXBTdGFja0NlbGw7DQoJCQkJCQkJY2dycC5sZXZlbCA9IChpICsgMSk7
DQoNCgkJCQkJCQljZ3JwLnN0YXJ0ID0gY2dycC5jb2xwb3M7DQoJCQkJCQkJY2dycC5lbmQgPSBj
Z3JwLmNvbHBvcyArIGNncnAud2lkdGggLSAxOw0KDQoJCQkJCQkJY2dycC50eXBlID0gNzsgLy8g
R3JvdXAgSGVhZGVyIENlbGwNCg0KCQkJCQkJCWN1cnJDb2xncm91cFN0cnVjdHVyZS5wdXNoKGNn
cnApOw0KDQoJCQkJCQkJaWYgKCFncm91cFplcm8udmlydHVhbENvbGdyb3VwKSB7DQoJCQkJCQkJ
CWdyb3VwWmVyby52aXJ0dWFsQ29sZ3JvdXAgPSBbXTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBa
ZXJvLnZpcnR1YWxDb2xncm91cC5wdXNoKGNncnApOw0KDQoJCQkJCQkJLy8gQWRkIHRoZSBncm91
cCBpbnRvIHRoZSBsZXZlbCBjb2xncm91cCBwZXJzcGVjdGl2ZQ0KCQkJCQkJCWlmICghZ3JvdXBa
ZXJvLmNvbGdycFsoaSArIDEpXSkgew0KCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWyhpICsgMSld
ID0gW107DQoJCQkJCQkJfQ0KCQkJCQkJCWdyb3VwWmVyby5jb2xncnBbKGkgKyAxKV0ucHVzaChj
Z3JwKTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gU2V0IHRoZSBoZWFkZXIgbGlzdCBmb3IgdGhlIGN1
cnJlbnQgZ3JvdXANCgkJCQkJCWN1ckNvbGdyb3VwRnJhbWUuaGVhZGVyID0gW107DQoJCQkJCQlm
b3IgKGkgPSBncm91cExldmVsIC0gKGdyb3VwTGV2ZWwgPj0gMiA/IDIgOiAxKTsgaSA8IHRtcFN0
YWNrLmxlbmd0aDsgaSArPSAxKSB7DQoJCQkJCQkJZm9yIChqID0gY3VyQ29sZ3JvdXBGcmFtZS5z
dGFydDsgaiA8PSBjdXJDb2xncm91cEZyYW1lLmVuZDsgaiArPSAxKSB7DQoJCQkJCQkJCWlmICh0
bXBTdGFja1tpXS5jZWxsW2ogLSAxXS5yb3dwb3MgPT09IGkgKyAxKSB7DQoJCQkJCQkJCQljdXJD
b2xncm91cEZyYW1lLmhlYWRlci5wdXNoKHRtcFN0YWNrW2ldLmNlbGxbaiAtIDFdKTsNCgkJCQkJ
CQkJCS8vIEF0dGFjaCB0aGUgY3VycmVudCBjb2xncm91cCB0byB0aGlzIGhlYWRlcg0KCQkJCQkJ
CQkJdG1wU3RhY2tbaV0uY2VsbFtqIC0gMV0uY29sZ3JvdXAgPSBjdXJDb2xncm91cEZyYW1lOw0K
CQkJCQkJCQl9DQoJCQkJCQkJCWogKz0gdG1wU3RhY2tbaV0uY2VsbFtqIC0gMV0ud2lkdGggLSAx
Ow0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gQXNzaWduIHRoZSBwYXJlbnQgaGVhZGVy
IHRvIHRoZSBjdXJyZW50IGhlYWRlcg0KCQkJCQkJcGFyZW50SGVhZGVyID0gW107DQoJCQkJCQlm
b3IgKGkgPSAwOyBpIDwgY3VyckNvbGdyb3VwU3RydWN0dXJlLmxlbmd0aCAtIDE7IGkgKz0gMSkg
ew0KCQkJCQkJCXBhcmVudEhlYWRlci5wdXNoKGN1cnJDb2xncm91cFN0cnVjdHVyZVtpXSk7DQoJ
CQkJCQl9DQoJCQkJCQljdXJDb2xncm91cEZyYW1lLnBhcmVudEhlYWRlciA9IHBhcmVudEhlYWRl
cjsNCg0KCQkJCQkJLy8gQ2hlY2sgdG8gc2V0IGlmIHRoaXMgZ3JvdXAgYXJlIGEgZGF0YSBncm91
cA0KCQkJCQkJaWYgKGN1cnJDb2xncm91cFN0cnVjdHVyZS5sZW5ndGggPCBncm91cExldmVsKSB7
DQoJCQkJCQkJLy8gVGhpcyBjb2xncm91cCBhcmUgYSBkYXRhIGNvbGdyb3VwDQoJCQkJCQkJLy8g
VGhlIGN1cnJlbnQgY29sZ3JvdXAgYXJlIGEgZGF0YSBjb2xncm91cA0KCQkJCQkJCWlmICghY3Vy
Q29sZ3JvdXBGcmFtZS50eXBlKSB7DQoJCQkJCQkJCWN1ckNvbGdyb3VwRnJhbWUudHlwZSA9IDI7
IC8vIFNldCBEYXRhIGdyb3VwIHR5cGUNCgkJCQkJCQkJY3VyQ29sZ3JvdXBGcmFtZS5sZXZlbCA9
IGdyb3VwTGV2ZWw7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJY3VyckNvbGdyb3VwU3RydWN0dXJlLnB1
c2goY3VyQ29sZ3JvdXBGcmFtZSk7DQoNCgkJCQkJCQkvLyBBZGQgdGhlIGdyb3VwIGludG8gdGhl
IGxldmVsIGNvbGdyb3VwIHBlcnNwZWN0aXZlDQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sZ3Jw
W2dyb3VwTGV2ZWxdKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5jb2xncnBbZ3JvdXBMZXZlbF0gPSBb
XTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbGdycFtncm91cExldmVsXS5wdXNoKGN1
ckNvbGdyb3VwRnJhbWUpOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLw0KCQkJCQkJLy8gUHJlcGFyaW5n
IHRoZSBjdXJyZW50IHN0YWNrIGZvciB0aGUgbmV4dCBjb2xncm91cCBhbmQgc2V0IGlmIHRoZSBj
dXJyZW50IGFyZSBhIHN1bW1hcnkgZ3JvdXANCgkJCQkJCS8vDQoNCgkJCQkJCS8vIENoZWNrIGlm
IHdlIG5lZWQgdG8gcG9wIG91dCB0aGUgY3VycmVudCBoZWFkZXIgY29sZ3JvdXAgDQoJCQkJCQlz
dW1tYXJ5QXR0YWNoZWQgPSBmYWxzZTsNCgkJCQkJCWZvciAoaSA9IGN1cnJDb2xncm91cFN0cnVj
dHVyZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgew0KDQoJCQkJCQkJaWYgKGN1cnJDb2xn
cm91cFN0cnVjdHVyZVtpXS5lbmQgPD0gY3VyQ29sZ3JvdXBGcmFtZS5lbmQpIHsNCg0KCQkJCQkJ
CQlpZiAoY3VyckNvbGdyb3VwU3RydWN0dXJlW2ldLmxldmVsIDwgZ3JvdXBMZXZlbCAmJiB0aGVh
ZFJvd1N0YWNrLmxlbmd0aCA+IDApIHsNCgkJCQkJCQkJCWN1ckNvbGdyb3VwRnJhbWUudHlwZSA9
IDM7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkvLyBBdHRhY2ggdGhlIFN1bW1hcnkgZ3JvdXAgdG8g
dGhlIGNvbGdyb3VwIHBvcGVkIGlmIGN1cnJlbnQgY29sZ3JvdXAgYXJlIHR5cGUgMw0KCQkJCQkJ
CQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS50eXBlID09PSAzICYmICFzdW1tYXJ5QXR0YWNoZWQpIHsN
CgkJCQkJCQkJCWN1cnJDb2xncm91cFN0cnVjdHVyZVtjdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUubGVu
Z3RoIC0gMV0uc3VtbWFyeSA9IGN1ckNvbGdyb3VwRnJhbWU7DQoJCQkJCQkJCQlzdW1tYXJ5QXR0
YWNoZWQgPSB0cnVlOyAvLyBUaGlzIGFyZSB1c2VkIHRvIGRvIG5vdCBhdHRhY2ggYSBzdW1tYXJ5
IG9mIGxldmVsIDQgdG8gYW4gaW5hcHJvcHJpYXRlIGxldmVsIDEgZm9yIGV4YW1wbGVkDQoJCQkJ
CQkJCX0NCg0KCQkJCQkJCQljdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUucG9wKCk7DQoJCQkJCQkJfQ0K
CQkJCQkJfQ0KDQoJCQkJCQkvLyBDYXRjaCB0aGUgc2Vjb25kIGFuZCB0aGUgdGhpcmQgcG9zc2li
bGUgZ3JvdXBpbmcgYXQgbGV2ZWwgMQ0KCQkJCQkJaWYgKGdyb3VwTGV2ZWwgPT09IDEgJiYgZ3Jv
dXBaZXJvLmNvbGdycFsxXSAmJiBncm91cFplcm8uY29sZ3JwWzFdLmxlbmd0aCA+IDEgJiYgdGhl
YWRSb3dTdGFjay5sZW5ndGggPiAwKSB7DQoNCgkJCQkJCQkvLyBDaGVjayBpZiBpbiB0aGUgZ3Jv
dXAgYXQgbGV2ZWwgMSBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYSBzdW1tYXJ5IGNvbGdyb3Vw
DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8IGdyb3VwWmVyby5jb2xncnBbMV0ubGVuZ3RoOyBpICs9
IDEpIHsNCgkJCQkJCQkJaWYgKGdyb3VwWmVyby5jb2xncnBbMV1baV0udHlwZSA9PT0gMykgew0K
CQkJCQkJCQkJLy8gQ29uZ3JhdCwgd2UgZm91bmQgdGhlIGxhc3QgcG9zc2libGUgY29sZ3JvdXAs
IA0KCQkJCQkJCQkJY3VyQ29sZ3JvdXBGcmFtZS5sZXZlbCA9IDA7DQoJCQkJCQkJCQlpZiAoIWdy
b3VwWmVyby5jb2xncnBbMF0pIHsNCgkJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzBdID0gW107
DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzBdLnB1c2goY3VyQ29sZ3Jv
dXBGcmFtZSk7DQoJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzFdLnBvcCgpOw0KDQoJCQkJCQkJ
CQliaWdUb3RhbENvbGdyb3VwRm91bmQgPSB0cnVlOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJ
CX0NCgkJCQkJCQl9DQoNCgkJCQkJCQljdXJDb2xncm91cEZyYW1lLnR5cGUgPSAzOw0KCQkJCQkJ
fQ0KDQoJCQkJCQkvLyBTZXQgdGhlIHJlcHJlc2VudGF0aXZlIGhlYWRlciAiY2FwdGlvbiIgZWxl
bWVudCBmb3IgYSBncm91cCBhdCBsZXZlbCAwDQoJCQkJCQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS5s
ZXZlbCA9PT0gMSAmJiBjdXJDb2xncm91cEZyYW1lLnR5cGUgPT09IDIpIHsNCgkJCQkJCQljdXJD
b2xncm91cEZyYW1lLnJlcGhlYWRlciA9ICdjYXB0aW9uJzsNCgkJCQkJCX0NCg0KCQkJCQkJaWYg
KCFncm91cFplcm8uY29sKSB7DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJCQkJfQ0K
DQoJCQkJCQkkLmVhY2goY3VyQ29sZ3JvdXBGcmFtZS5jb2wsIGZ1bmN0aW9uICgpIHsNCgkJCQkJ
CQl2YXIgY29sdW1uID0gdGhpczsNCg0KCQkJCQkJCWNvbHVtbi50eXBlID0gY3VyQ29sZ3JvdXBG
cmFtZS50eXBlOw0KCQkJCQkJCWNvbHVtbi5sZXZlbCA9IGN1ckNvbGdyb3VwRnJhbWUubGV2ZWw7
DQoJCQkJCQkJY29sdW1uLmdyb3Vwc3RydWN0ID0gY3VyQ29sZ3JvdXBGcmFtZTsNCg0KCQkJCQkJ
CWNvbHVtbi5oZWFkZXIgPSBbXTsNCgkJCQkJCQkvLyBGaW5kIHRoZSBsb3dlc3QgaGVhZGVyIHRo
YXQgd291bGQgcmVwcmVzZW50IHRoaXMgY29sdW1uDQoJCQkJCQkJZm9yIChqID0gKGdyb3VwTGV2
ZWwgLSAxKTsgaiA8IHRtcFN0YWNrLmxlbmd0aDsgaiArPSAxKSB7DQoJCQkJCQkJCWZvciAoaSA9
IChjdXJDb2xncm91cEZyYW1lLnN0YXJ0IC0gMSk7IGkgPCBjdXJDb2xncm91cEZyYW1lLmVuZDsg
aSArPSAxKSB7DQoJCQkJCQkJCQlpZiAoKHRtcFN0YWNrW2pdLmNlbGxbaV0uY29scG9zID49IGNv
bHVtbi5zdGFydCAmJg0KCQkJCQkJCQkJCQl0bXBTdGFja1tqXS5jZWxsW2ldLmNvbHBvcyA8PSBj
b2x1bW4uZW5kKSB8fA0KCQkJCQkJCQkJCQkodG1wU3RhY2tbal0uY2VsbFtpXS5jb2xwb3MgPD0g
Y29sdW1uLnN0YXJ0ICYmDQoJCQkJCQkJCQkJCSh0bXBTdGFja1tqXS5jZWxsW2ldLmNvbHBvcyAr
IHRtcFN0YWNrW2pdLmNlbGxbaV0ud2lkdGggLSAxKSA+PSBjb2x1bW4uZW5kKSB8fA0KCQkJCQkJ
CQkJCQkoKHRtcFN0YWNrW2pdLmNlbGxbaV0uY29scG9zICsgdG1wU3RhY2tbal0uY2VsbFtpXS53
aWR0aCAtIDEpIDw9IGNvbHVtbi5zdGFydCAmJg0KCQkJCQkJCQkJCQkodG1wU3RhY2tbal0uY2Vs
bFtpXS5jb2xwb3MgKyB0bXBTdGFja1tqXS5jZWxsW2ldLndpZHRoIC0gMSkgPj0gY29sdW1uLmVu
ZCkpIHsNCg0KCQkJCQkJCQkJCWlmIChjb2x1bW4uaGVhZGVyLmxlbmd0aCA9PT0gMCB8fCAoY29s
dW1uLmhlYWRlci5sZW5ndGggPiAwICYmIGNvbHVtbi5oZWFkZXJbY29sdW1uLmhlYWRlci5sZW5n
dGggLSAxXS51aWQgIT09IHRtcFN0YWNrW2pdLmNlbGxbaV0udWlkKSkgew0KCQkJCQkJCQkJCQkv
LyBUaGlzIGFyZSB0aGUgaGVhZGVyIHRoYXQgd291bGQgcmVwcmVzZW50IHRoaXMgY29sdW1uDQoJ
CQkJCQkJCQkJCWNvbHVtbi5oZWFkZXIucHVzaCh0bXBTdGFja1tqXS5jZWxsW2ldKTsNCgkJCQkJ
CQkJCQkJdG1wU3RhY2tbal0uY2VsbFtpXS5sZXZlbCA9IGN1ckNvbGdyb3VwRnJhbWUubGV2ZWw7
DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfSk7
DQoJCQkJCX0pOw0KDQoJCQkJCWlmICghZ3JvdXBaZXJvLnZpcnR1YWxDb2xncm91cCkgew0KCQkJ
CQkJZ3JvdXBaZXJvLnZpcnR1YWxDb2xncm91cCA9IFtdOw0KCQkJCQl9DQoJCQkJCS8vIFNldCB0
aGUgVmlydHVhbCBHcm91cCBIZWFkZXIgQ2VsbCwgaWYgYW55DQoJCQkJCSQuZWFjaChncm91cFpl
cm8udmlydHVhbENvbGdyb3VwLCBmdW5jdGlvbiAoKSB7DQoJCQkJCQl2YXIgdkdyb3VwSGVhZGVy
Q2VsbCA9IHRoaXM7DQoNCgkJCQkJCS8vIFNldCB0aGUgaGVhZGVyTGV2ZWwgYXQgdGhlIGFwcHJv
cHJpYXRlIGNvbHVtbg0KCQkJCQkJZm9yIChpID0gKHZHcm91cEhlYWRlckNlbGwuc3RhcnQgLSAx
KTsgaSA8IHZHcm91cEhlYWRlckNlbGwuZW5kOyBpICs9IDEpIHsNCgkJCQkJCQlpZiAoIWdyb3Vw
WmVyby5jb2xbaV0uaGVhZGVyTGV2ZWwpIHsNCgkJCQkJCQkJZ3JvdXBaZXJvLmNvbFtpXS5oZWFk
ZXJMZXZlbCA9IFtdOw0KCQkJCQkJCX0NCgkJCQkJCQlncm91cFplcm8uY29sW2ldLmhlYWRlckxl
dmVsLnB1c2godkdyb3VwSGVhZGVyQ2VsbCk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCg0K
CQkJCS8vIEFzc29jaWF0ZSB0aGUgY29sZ3JvdXAgSGVhZGVyIGluIHRoZSBncm91cCBaZXJvDQoJ
CQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoID4gMCAmJiBjb2xncm91cEhlYWRlckNvbEVuZCA+
IDApIHsNCgkJCQkJZ3JvdXBaZXJvLmNvbGdyb3VwaGVhZCA9IGNvbGdyb3VwRnJhbWVbMF07DQoJ
CQkJCWdyb3VwWmVyby5jb2xncm91cGhlYWQudHlwZSA9IDE7IC8vIFNldCB0aGUgZmlyc3QgY29s
Z3JvdXAgdHlwZSA6LSkNCgkJCQl9DQoJCQl9DQoNCgkJCWZ1bmN0aW9uIGZpbmFsaXplUm93R3Jv
dXAoKSB7DQoNCgkJCQkvLyBDaGVjayBpZiB0aGUgY3VycmVudCByb3dncm91cCBoYXMgYmVlbiBn
byBpbiB0aGUgcm93Z3JvdXAgc2V0dXAsIGlmIG5vdCB3ZSBkbw0KCQkJCWlmICghY3VycmVudFJv
d0dyb3VwLnR5cGUgfHwgIWN1cnJlbnRSb3dHcm91cC5sZXZlbCkgew0KCQkJCQkvLyBDb2xncm91
cCBTZXR1cCwNCgkJCQkJcm93Z3JvdXBTZXR1cCgpOw0KCQkJCX0NCg0KDQoJCQkJLy8gY29uc29s
ZS5sb2coJ1JvdyBHcm91cCBGaW5hbGl6YXRpb24nKTsNCg0KCQkJCS8vIElmIHRoZSBjdXJyZW50
IHJvdyBncm91cCBhcmUgYSBkYXRhIGdyb3VwLCBjaGVjayBlYWNoIHJvdyBpZiB3ZSBjYW4gZm91
bmQgYSBwYXR0ZXJuIGFib3V0IHRvIGluY3JlbWVudCB0aGUgZGF0YSBsZXZlbCBmb3IgdGhpcyBy
b3cgZ3JvdXANCgkJCQkvLyBVcGRhdGUsIGlmIG5lZWRlZCwgZWFjaCByb3cgYW5kIGNlbGwgdG8g
dGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoZSBuZXcgcm93IGdyb3VwIGxldmVsDQoJCQkJLy8gQWRk
IHRoZSByb3cgZ3JvdXAgaW4gdGhlIGdyb3VwWmVybyBDb2xsZWN0aW9uDQoJCQkJbHN0Um93R3Jv
dXAucHVzaChjdXJyZW50Um93R3JvdXApOw0KCQkJCWN1cnJlbnRSb3dHcm91cCA9IHt9Ow0KCQkJ
fQ0KDQoJCQlmdW5jdGlvbiBpbml0aWF0ZVJvd0dyb3VwKCkgew0KCQkJCS8vIGNvbnNvbGUubG9n
KCdSb3cgR3JvdXAgSW5pdGlhbGl6YXRpb24nKTsNCgkJCQkvLyBGaW5hbGlzYXRpb24gb2YgYW55
IGV4aXNpdGluZyByb3cgZ3JvdXANCgkJCQlpZiAoY3VycmVudFJvd0dyb3VwICYmIGN1cnJlbnRS
b3dHcm91cC50eXBlKSB7DQoJCQkJCWZpbmFsaXplUm93R3JvdXAoKTsNCgkJCQl9DQoNCgkJCQkv
LyBJbml0aWFsaXNhdGlvbiBvZiB0aGUgYSBuZXcgcm93IGdyb3VwIA0KCQkJCWN1cnJlbnRSb3dH
cm91cCA9IHt9Ow0KCQkJCWN1cnJlbnRSb3dHcm91cC5lbGVtID0gY3VycmVudFJvd0dyb3VwRWxl
bWVudDsNCgkJCQljdXJyZW50Um93R3JvdXAucm93ID0gW107DQoJCQkJY3VycmVudFJvd0dyb3Vw
LmhlYWRlcmxldmVsID0gW107DQoJCQkJY3VycmVudFJvd0dyb3VwLmdyb3VwWmVybyA9IGdyb3Vw
WmVybzsNCgkJCQljdXJyZW50Um93R3JvdXAudWlkID0gdWlkRWxlbTsNCgkJCQl1aWRFbGVtICs9
IDE7DQoJCQkJLy9jdXJyZW50Um93R3JvdXAudHlwZSA9IDIgLy8gKDEgaWYgZWxlbSBpcyBhIHRo
ZWFkIG9yIGlmIGRldGVjdGVkIGluIHRoZSB0YWJsZSwgMiBkZWZhdWx0LCAzIGlmIHN1bW1hcnkg
ZGF0YSkgLy8gRllJIEhlcmUgdGhlIGV4aXN0YW5jZSBvZiB0aGUgInR5cGUiIHByb3BlcnR5IGlz
IHVzZWQgdG8gZGV0ZXJtaW5lZCB0aGUgcmVhbCB0eXBlIG9mIHJvdyBncm91cA0KCQkJfQ0KDQoJ
CQlmdW5jdGlvbiByb3dncm91cFNldHVwKGZvcmNlRGF0YUdyb3VwKSB7DQoJCQkJLy8gY29uc29s
ZS5sb2coJ1JvdyBHcm91cCBTZXR1cCcpOw0KCQkJCXZhciBpLA0KCQkJCQlwcmV2aW91c1Jvd0dy
b3VwLA0KCQkJCQl0bXBIZWFkZXJMZXZlbDsNCg0KCQkJCS8vIENoZWNrIGlmIHRoZSBjdXJyZW50
IHJvdyBncm91cCwgYWxyZWFkeSBoYXZlIHNvbWUgcm93LCBpZiB5ZXMgdGhpcyBpcyBhIG5ldyBy
b3cgZ3JvdXANCgkJCQlpZiAocm93Z3JvdXBIZWFkZXJSb3dTdGFjay5sZW5ndGggPiAwKSB7DQoJ
CQkJCS8vIGlmIG1vcmUgdGhhbiAwIGNlbGwgaW4gdGhlIHN0YWNrLCBtYXJrIHRoaXMgcm93IGdy
b3VwIGFzIGEgZGF0YSByb3cgZ3JvdXAgYW5kIGNyZWF0ZSB0aGUgbmV3IHJvdyBncm91cCAoY2Fu
IGJlIG9ubHkgdmlydHVhbCkNCgkJCQkJaWYgKGN1cnJlbnRSb3dHcm91cCAmJiBjdXJyZW50Um93
R3JvdXAudHlwZSAmJiBjdXJyZW50Um93R3JvdXAucm93Lmxlbmd0aCA+IDApIHsNCgkJCQkJCWN1
cnJlbnRSb3dHcm91cEVsZW1lbnQgPSB7fTsNCgkJCQkJCWluaXRpYXRlUm93R3JvdXAoKTsNCgkJ
CQkJfQ0KDQoJCQkJCS8vIFdlIGhhdmUgYSBkYXRhIHJvdyBncm91cA0KCQkJCQljdXJyZW50Um93
R3JvdXAudHlwZSA9IDI7DQoNCgkJCQkJLy8gU2V0IHRoZSBncm91cCBoZWFkZXIgY2VsbA0KCQkJ
CQljdXJyZW50Um93R3JvdXAucm93ID0gcm93Z3JvdXBIZWFkZXJSb3dTdGFjazsNCgkJCQkJZm9y
IChpID0gMDsgaSA8IHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoOyBpICs9IDEpIHsNCgkJ
CQkJCS8vIGlmIChyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGwubGVuZ3RoICE9PSAxKSB7
DQoJCQkJCQkvLwllcnJvclRyaWdnZXIoMTEsICJTZWVtIHRvIGhhdmUgYSByb3cgaGVhZGVyIGZv
ciB0aGUgZGF0YSB0aGF0IGhhdmUgMiBvciBtb3JlIGNlbGwgaW5zaWRlIGl0Iik7DQoJCQkJCQkv
LyB9DQoJCQkJCQlyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGxbMF0udHlwZSA9IDc7DQoJ
CQkJCQlyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGxbMF0uc2NvcGUgPSAicm93IjsNCgkJ
CQkJCXJvd2dyb3VwSGVhZGVyUm93U3RhY2tbaV0uY2VsbFswXS5yb3cgPSByb3dncm91cEhlYWRl
clJvd1N0YWNrW2ldOw0KCQkJCQkJY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsLnB1c2gocm93
Z3JvdXBIZWFkZXJSb3dTdGFja1tpXS5jZWxsWzBdKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8v
IGlmIG5vIGNlbGwgaW4gdGhlIHN0YWNrIGJ1dCBmaXJzdCByb3cgZ3JvdXAsIG1hcmsgdGhpcyBy
b3cgZ3JvdXAgYXMgYSBkYXRhIHJvdyBncm91cA0KCQkJCS8vIGNvbnNvbGUubG9nKCdyb3dncm91
cEhlYWRlclJvd1N0YWNrLmxlbmd0aDogJyArIHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3Ro
KTsNCgkJCQkvLyBjb25zb2xlLmxvZyhjdXJyZW50Um93R3JvdXApOw0KCQkJCS8vIGNvbnNvbGUu
bG9nKCdsc3RSb3dHcm91cC5sZW5ndGg6ICcgKyBsc3RSb3dHcm91cC5sZW5ndGgpOw0KCQkJCWlm
IChyb3dncm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCA9PT0gMCAmJg0KCQkJCQkJLy8gKCFjdXJy
ZW50Um93R3JvdXAgfHwgKGN1cnJlbnRSb3dHcm91cC50eXBlICYmIGN1cnJlbnRSb3dHcm91cC50
eXBlID09PSAxKSkgJiYNCgkJCQkJCWxzdFJvd0dyb3VwLmxlbmd0aCA9PT0gMCkgew0KDQoJCQkJ
CWlmIChjdXJyZW50Um93R3JvdXAudHlwZSAmJiBjdXJyZW50Um93R3JvdXAudHlwZSA9PT0gMSkg
ew0KCQkJCQkJY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHt9Ow0KCQkJCQkJaW5pdGlhdGVSb3dH
cm91cCgpOw0KCQkJCQl9DQoNCgkJCQkJLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGF0YSByb3cgZ3Jv
dXAgYXQgbGV2ZWwgMQ0KCQkJCQljdXJyZW50Um93R3JvdXAudHlwZSA9IDI7DQoJCQkJCWN1cnJl
bnRSb3dHcm91cC5sZXZlbCA9IDE7IC8vIERlZmF1bHQgUm93IEdyb3VwIExldmVsDQoJCQkJfQ0K
DQoJCQkJLy8gaWYgbm8gY2VsbCBpbiB0aGUgc3RhY2sgYW5kIG5vdCB0aGUgZmlyc3Qgcm93IGdy
b3VwLCB0aGlzIGFyZSBhIHN1bW1hcnkgZ3JvdXANCgkJCQkvLyBUaGlzIGlzIG9ubHkgdmFsaWQg
aWYgdGhlIGZpcnN0IGNvbGdyb3VwIGlzIGEgaGVhZGVyIGNvbGdyb3VwLg0KCQkJCS8vY29uc29s
ZS5sb2coJ3Jvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoOiAnICsgcm93Z3JvdXBIZWFkZXJS
b3dTdGFjay5sZW5ndGggKyAnIGxzdFJvd0dyb3VwLmxlbmd0aDogJyArIGxzdFJvd0dyb3VwLmxl
bmd0aCArICcgY3VycmVudFJvd0dyb3VwLnR5cGU6ICcgKyBjdXJyZW50Um93R3JvdXAudHlwZSk7
DQoJCQkJLy8gY29uc29sZS5sb2coJyBjb2xncm91cEZyYW1lWzBdOiAnICsgY29sZ3JvdXBGcmFt
ZVswXSArICcgY29sZ3JvdXBGcmFtZVswXS50eXBlOiAnICsgY29sZ3JvdXBGcmFtZVswXS50eXBl
ICsgJyBmb3JjZURhdGFHcm91cDogJyArIGZvcmNlRGF0YUdyb3VwKTsNCgkJCQlpZiAocm93Z3Jv
dXBIZWFkZXJSb3dTdGFjay5sZW5ndGggPT09IDAgJiYgbHN0Um93R3JvdXAubGVuZ3RoID4gMCAm
JiAhY3VycmVudFJvd0dyb3VwLnR5cGUgJiYgY29sZ3JvdXBGcmFtZVswXSAmJiAoY29sZ3JvdXBG
cmFtZVswXS50eXBlID09PSAxIHx8ICghY29sZ3JvdXBGcmFtZVswXS50eXBlICYmIGNvbGdyb3Vw
RnJhbWUubGVuZ3RoID4gMCkpICYmICFmb3JjZURhdGFHcm91cCkgew0KCQkJCQljdXJyZW50Um93
R3JvdXAudHlwZSA9IDM7DQoJCQkJfSBlbHNlIHsNCgkJCQkJY3VycmVudFJvd0dyb3VwLnR5cGUg
PSAyOw0KCQkJCQkvLyBjdXJyZW50Um93R3JvdXAubGV2ZWwgPSAxOyAvLyBEZWZhdWx0IFJvdyBH
cm91cCBMZXZlbA0KCQkJCX0NCg0KCQkJCS8vIGNvbnNvbGUubG9nKHJvd2dyb3VwSGVhZGVyUm93
U3RhY2spOyByb3dsZXZlbA0KCQkJCS8vIGNvbnNvbGUubG9nKGN1cnJlbnRSb3dHcm91cCk7DQoN
Cg0KDQoJCQkJLy8gU2V0IHRoZSBEYXRhIExldmVsIGZvciB0aGlzIHJvdyBncm91cA0KCQkJCS8v
IENhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgcm93IGdyb3VwIGxldmVsIGJhc2VkIG9uIHRoZSBw
cmV2aW91cyByb3dncm91cCANCgkJCQkvLwkqIGEgU3VtbWFyeSBHcm91cCBkZWNyZWFzZSB0aGUg
cm93IGdyb3VwIGxldmVsDQoJCQkJLy8JKiBhIERhdGEgR3JvdXAgaW5jcmVhc2UgdGhlIHJvdyBn
cm91cCBsZXZlbCBiYXNlZCBvZiBoaXMgbnVtYmVyIG9mIHJvdyBncm91cCBoZWFkZXIgYW5kIHRo
ZSBwcmV2aW91cyByb3cgZ3JvdXAgbGV2ZWwNCgkJCQkvLyAgKiBEb250IGZvcmdldCB0byBzZXQg
dGhlIGFwcHJvcHJpYXRlIGxldmVsIHRvIGVhY2ggZ3JvdXAgaGVhZGVyIGNlbGwgaW5zaWRlIHRo
aXMgcm93IGdyb3VwLg0KCQkJCWlmICghY3VycmVudFJvd0dyb3VwLmxldmVsKSB7DQoJCQkJCS8v
IEdldCB0aGUgbGV2ZWwgb2YgdGhlIHByZXZpb3VzIGdyb3VwDQoJCQkJCWlmIChsc3RSb3dHcm91
cC5sZW5ndGggPiAwKSB7DQoJCQkJCQlwcmV2aW91c1Jvd0dyb3VwID0gbHN0Um93R3JvdXBbbHN0
Um93R3JvdXAubGVuZ3RoIC0gMV07DQoNCgkJCQkJCWlmIChjdXJyZW50Um93R3JvdXAudHlwZSA9
PT0gMikgew0KCQkJCQkJCS8vIERhdGEgR3JvdXANCgkJCQkJCQlpZiAoY3VycmVudFJvd0dyb3Vw
LmhlYWRlcmxldmVsLmxlbmd0aCA9PT0gcHJldmlvdXNSb3dHcm91cC5oZWFkZXJsZXZlbC5sZW5n
dGgpIHsNCgkJCQkJCQkJLy8gU2FtZSBMZXZlbCBhcyB0aGUgcHJldmlvdXMgb25lDQoJCQkJCQkJ
CWN1cnJlbnRSb3dHcm91cC5sZXZlbCA9IHByZXZpb3VzUm93R3JvdXAubGV2ZWw7DQoJCQkJCQkJ
fSBlbHNlIGlmIChjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoIDwgcHJldmlvdXNS
b3dHcm91cC5oZWFkZXJsZXZlbC5sZW5ndGgpIHsNCgkJCQkJCQkJLy8gYWRkIHRoZSBtaXNzaW5n
IGdyb3VwIGhlYWRpbmcgY2VsbCANCgkJCQkJCQkJdG1wSGVhZGVyTGV2ZWwgPSBjdXJyZW50Um93
R3JvdXAuaGVhZGVybGV2ZWw7DQoJCQkJCQkJCWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZlbCA9
IFtdOw0KDQoJCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAocHJldmlvdXNSb3dHcm91cC5oZWFkZXJs
ZXZlbC5sZW5ndGggLSBjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoKTsgaSArPSAx
KSB7DQoJCQkJCQkJCQljdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwucHVzaChwcmV2aW91c1Jv
d0dyb3VwLmhlYWRlcmxldmVsW2ldKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCQlmb3IgKGkgPSAwOyBp
IDwgdG1wSGVhZGVyTGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsNCgkJCQkJCQkJCWN1cnJlbnRSb3dH
cm91cC5oZWFkZXJsZXZlbC5wdXNoKHRtcEhlYWRlckxldmVsW2ldKTsNCgkJCQkJCQkJfQ0KCQkJ
CQkJCQljdXJyZW50Um93R3JvdXAubGV2ZWwgPSBwcmV2aW91c1Jvd0dyb3VwLmxldmVsOw0KCQkJ
CQkJCX0gZWxzZSBpZiAoY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsLmxlbmd0aCA+IHByZXZp
b3VzUm93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoKSB7DQoJCQkJCQkJCS8vIFRoaXMgYXJlIGEg
bmV3IHNldCBvZiBoZWFkaW5nLCB0aGUgbGV2ZWwgZXF1YWwgdGhlIG51bWJlciBvZiBncm91cCBo
ZWFkZXIgY2VsbCBmb3VuZA0KCQkJCQkJCQljdXJyZW50Um93R3JvdXAubGV2ZWwgPSBjdXJyZW50
Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoICsgMTsNCgkJCQkJCQl9DQoJCQkJCQl9IGVsc2Ug
aWYgKGN1cnJlbnRSb3dHcm91cC50eXBlID09PSAzKSB7DQoJCQkJCQkJLy8gU3VtbWFyeSBHcm91
cA0KCQkJCQkJCWlmIChwcmV2aW91c1Jvd0dyb3VwLnR5cGUgPT09IDMpIHsNCgkJCQkJCQkJY3Vy
cmVudFJvd0dyb3VwLmxldmVsID0gcHJldmlvdXNSb3dHcm91cC5sZXZlbCAtIDE7DQoJCQkJCQkJ
fSBlbHNlIHsNCgkJCQkJCQkJY3VycmVudFJvd0dyb3VwLmxldmVsID0gcHJldmlvdXNSb3dHcm91
cC5sZXZlbDsNCgkJCQkJCQl9DQoJCQkJCQkJaWYgKGN1cnJlbnRSb3dHcm91cC5sZXZlbCA8IDAp
IHsNCgkJCQkJCQkJLy8gVGhpcyBpcyBhbiBlcnJvciwgTGFzdCBzdW1tYXJ5IHJvdyBncm91cCB3
YXMgYWxyZWFkeSBmb3VuZC4NCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDEyLCAiTGFzdCBzdW1tYXJ5
IHJvdyBncm91cCBhbHJlYWR5IGZvdW5kIik7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gU2V0IHRo
ZSBoZWFkZXIgbGV2ZWwgd2l0aCB0aGUgcHJldmlvdXMgcm93IGdyb3VwDQoJCQkJCQkJZm9yIChp
ID0gMDsgaSA8IHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsN
CgkJCQkJCQkJaWYgKHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWxbaV0ubGV2ZWwgPCBjdXJy
ZW50Um93R3JvdXAubGV2ZWwpIHsNCgkJCQkJCQkJCWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZl
bC5wdXNoKHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWxbaV0pOw0KCQkJCQkJCQl9DQoJCQkJ
CQkJfQ0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBFcnJvcg0KCQkJCQkJCWN1cnJlbnRSb3dH
cm91cC5sZXZlbCA9ICJFcnJvciwgbm90IGNhbGN1bGF0ZWQiOw0KCQkJCQkJCWVycm9yVHJpZ2dl
cigxMywgIkVycm9yLCBSb3cgZ3JvdXAgbm90IGNhbGN1bGF0ZWQiKTsNCgkJCQkJCX0NCgkJCQkJ
fSBlbHNlIHsNCgkJCQkJCWN1cnJlbnRSb3dHcm91cC5sZXZlbCA9IDEgKyByb3dncm91cEhlYWRl
clJvd1N0YWNrLmxlbmd0aDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIEVuc3VyZSB0aGF0IGVh
Y2ggcm93IGdyb3VwIGNlbGwgaGVhZGluZyBoYXZlIHRoZWlyIGxldmVsIHNldA0KCQkJCWZvciAo
aSA9IDA7IGkgPCBjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsN
CgkJCQkJY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsW2ldLmxldmVsID0gaSArIDE7DQoJCQkJ
CWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZlbFtpXS5yb3dsZXZlbCA9IGN1cnJlbnRSb3dHcm91
cC5oZWFkZXJsZXZlbFtpXS5sZXZlbDsNCgkJCQl9DQoNCgkJCQlyb3dncm91cEhlYWRlclJvd1N0
YWNrID0gW107IC8vIHJlc2V0IHRoZSByb3cgaGVhZGVyIHN0YWNrCQ0KDQoJCQkJaWYgKGN1cnJl
bnRSb3dHcm91cC5sZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRSb3dHcm91cC5sZXZlbCA8
IDApIHsNCgkJCQkJZXJyb3JUcmlnZ2VyKDE0LCAnWW91IGNhbiBub3QgaGF2ZSBhIHN1bW1hcnkg
YXQgbGV2ZWwgdW5kZXIgMCwgYWRkIGEgZ3JvdXAgaGVhZGVyIG9yIG1lcmdlIGEgdGJvZHkgdG9n
aGV0ZXInLCBjdXJyZW50Um93R3JvdXAuZWxlbSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlv
biBwcm9jZXNzUm93KGVsZW0pIHsNCgkJCQkvLyBJbiB0aGlzIGZ1bmN0aW9uIHRoZXJlIGFyZSBh
IHBvc3NpYmxlIGNvbmZ1c2lvbiBhYm91dCB0aGUgY29sZ3JvdXAgdmFyaWFibGUgbmFtZSB1c2Vk
IGhlcmUgdnMgdGhlIHJlYWwgY29sZ3JvdXAgdGFibGUsIEluIHRoaXMgZnVuY3Rpb24gdGhlIGNv
bGdyb3VwIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gaGVhZGVyIGNlbGwuDQoJCQkJY3VycmVu
dFJvd1BvcyArPSAxOw0KCQkJCXZhciBjb2x1bW5Qb3MgPSAxLA0KCQkJCQlsYXN0Q2VsbFR5cGUg
PSAiIiwNCgkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBmYWxzZSwNCgkJCQkJY2VsbHMgPSAkKGVs
ZW0pLmNoaWxkcmVuKCksDQoJCQkJCXJvdyA9IHsNCgkJCQkJCWNvbGdyb3VwOiBbXSwgLy8gPT09
IEJ1aWxkIGZyb20gY29sZ3JvdXAgb2JqZWN0ID09DQoJCQkJCQljZWxsOiBbXSwgLy8gPT09IEJ1
aWxkIGZyb20gQ2VsbCBPYmplY3QgPT0NCgkJCQkJCWVsZW06IGVsZW0sIC8vIFJvdyBTdHJ1Y3R1
cmUgalF1ZXJ5IGVsZW1lbnQNCgkJCQkJCXJvd3BvczogY3VycmVudFJvd1Bvcw0KCQkJCQl9LA0K
CQkJCQljb2xncm91cCwNCgkJCQkJZm5QcmVQcm9jZXNzR3JvdXBIZWFkZXJDZWxsLA0KCQkJCQlm
blByZVByb2Nlc3NHcm91cERhdGFDZWxsLA0KCQkJCQlmblBhcnNlU3Bhbm5lZFJvd0NlbGwsDQoJ
CQkJCWhlYWRpbmdSb3dDZWxsLA0KCQkJCQlyb3doZWFkZXIsDQoJCQkJCWNvbEtleUNlbGwsDQoJ
CQkJCWksDQoJCQkJCWosDQoJCQkJCWlzRGF0YUNlbGwsDQoJCQkJCWlzRGF0YUNvbGdyb3VwVHlw
ZSwNCgkJCQkJY3JlYXRlR2VuZXJpY0NvbGdyb3VwOw0KDQoJCQkJJChlbGVtKS5kYXRhKCkudGJs
cGFyc2VyID0gcm93Ow0KDQoJCQkJcm93LnVpZCA9IHVpZEVsZW07DQoJCQkJdWlkRWxlbSArPSAx
Ow0KCQkJCXJvdy5ncm91cFplcm8gPSBncm91cFplcm87DQoJCQkJZ3JvdXBaZXJvLmFsbFBhcnNl
ck9iai5wdXNoKHJvdyk7DQoNCgkJCQljb2xncm91cCA9IHsNCgkJCQkJY2VsbDogW10sDQoJCQkJ
CWNnc3VtbWFyeTogdW5kZWZpbmVkLCAvLyA/PyBOb3Qgc3VyZSBiZWNhdXNlIHRoaXMgd2lsbCBi
ZSBiZXR0ZXIgaW4gdGhlIGRhdGEgY29sZ3JvdXAgb2JqZWN0ID8/IFN1bW1hcnkgQ29sZ3JvdXAg
QXNzb2NpYXRlZA0KCQkJCQl0eXBlOiBmYWxzZSAvLyAxID09PSBoZWFkZXIsIDIgPT09IGRhdGEs
IDMgPT09IHN1bW1hcnksIDQgPT09IGtleSwgNSA9PT0gZGVzY3JpcHRpb24sIDYgPT09IGxheW91
dCwgNyA9PT0gZ3JvdXAgaGVhZGVyDQoJCQkJfTsNCg0KCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVs
ZW07DQoJCQkJdWlkRWxlbSArPSAxOw0KCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChj
b2xncm91cCk7DQoNCgkJCQlmblByZVByb2Nlc3NHcm91cEhlYWRlckNlbGwgPSBmdW5jdGlvbiAo
aGVhZGVyQ2VsbCkgew0KCQkJCQlpZiAoIWNvbGdyb3VwLnR5cGUpIHsNCgkJCQkJCWNvbGdyb3Vw
LnR5cGUgPSAxOw0KCQkJCQl9DQoJCQkJCWlmIChjb2xncm91cC50eXBlICE9PSAxKSB7DQoJCQkJ
CQkvLyBDcmVhdGlvbiBvZiBhIG5ldyBjb2xncm91cA0KCQkJCQkJcm93LmNvbGdyb3VwLnB1c2go
Y29sZ3JvdXApOyAvLyBBZGQgdGhlIHByZXZpb3VzIGNvbGdyb3VwDQoNCgkJCQkJCS8vIENyZWF0
ZSBhIG5ldyBjb2xncm91cA0KCQkJCQkJY29sZ3JvdXAgPSB7DQoJCQkJCQkJY2VsbDogW10sDQoJ
CQkJCQkJdHlwZTogMQ0KCQkJCQkJfTsNCgkJCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJ
CQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goY29s
Z3JvdXApOw0KCQkJCQl9DQoJCQkJCWNvbGdyb3VwLmNlbGwucHVzaChoZWFkZXJDZWxsKTsNCgkJ
CQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBoZWFkZXJDZWxsLmNvbHBvcyArIGhlYWRlckNlbGwud2lk
dGggLSAxOw0KCQkJCX07DQoNCgkJCQlmblByZVByb2Nlc3NHcm91cERhdGFDZWxsID0gZnVuY3Rp
b24gKGRhdGFDZWxsKSB7DQoJCQkJCWlmICghY29sZ3JvdXAudHlwZSkgew0KCQkJCQkJY29sZ3Jv
dXAudHlwZSA9IDI7DQoJCQkJCX0NCg0KCQkJCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNyZWF0
ZSBhIHN1bW1hcnkgY29sZ3JvdXAgKEJhc2VkIG9uIHRoZSB0b3AgY29sZ3JvdXAgZGVmaW5pdGlv
bikNCgkJCQkJaWYgKGNvbGdyb3VwLnR5cGUgIT09IDIpIHsNCgkJCQkJCS8vIENyZWF0aW9uIG9m
IGEgbmV3IGNvbGdyb3VwDQoJCQkJCQlyb3cuY29sZ3JvdXAucHVzaChjb2xncm91cCk7IC8vIEFk
ZCB0aGUgcHJldmlvdXMgY29sZ3JvdXANCg0KCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IGNvbGdyb3Vw
DQoJCQkJCQljb2xncm91cCA9IHsNCgkJCQkJCQljZWxsOiBbXSwNCgkJCQkJCQl0eXBlOiAyDQoJ
CQkJCQl9Ow0KCQkJCQkJY29sZ3JvdXAudWlkID0gdWlkRWxlbTsNCgkJCQkJCXVpZEVsZW0gKz0g
MTsNCgkJCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChjb2xncm91cCk7DQoJCQkJCX0N
Cg0KCQkJCQljb2xncm91cC5jZWxsLnB1c2goZGF0YUNlbGwpOw0KCQkJCX07DQoNCgkJCQlmblBh
cnNlU3Bhbm5lZFJvd0NlbGwgPSBmdW5jdGlvbiAoKSB7DQoJCQkJCXZhciBpOw0KDQoJCQkJCS8v
IENoZWNrIGZvciBzcGFubmVkIHJvdw0KCQkJCQkkLmVhY2goc3Bhbm5lZFJvdywgZnVuY3Rpb24g
KCkgew0KCQkJCQkJaWYgKHRoaXMuY29scG9zID09PSBjb2x1bW5Qb3MgJiYgdGhpcy5zcGFuSGVp
Z2h0ID4gMCAmJiAodGhpcy5oZWlnaHQgKyB0aGlzLnJvd3BvcyAtIHRoaXMuc3BhbkhlaWdodCA9
PT0gY3VycmVudFJvd1BvcykpIHsNCg0KCQkJCQkJCWlmICh0aGlzLmVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKSA9PT0gJ3RoJykgew0KCQkJCQkJCQlmblByZVByb2Nlc3NHcm91cEhlYWRlckNl
bGwodGhpcyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKHRoaXMuZWxlbS5ub2RlTmFtZS50b0xv
d2VyQ2FzZSgpID09PSAndGQnKSB7DQoJCQkJCQkJCWZuUHJlUHJvY2Vzc0dyb3VwRGF0YUNlbGwo
dGhpcyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJdGhpcy5zcGFuSGVpZ2h0IC09IDE7DQoNCgkJCQkJ
CQkvLyBJbmNyZW1lbnQgdGhlIGNvbHVtbiBwb3NpdGlvbg0KCQkJCQkJCWNvbHVtblBvcyArPSB0
aGlzLndpZHRoOw0KDQoJCQkJCQkJLy8gQWRkIHRoZSBjb2x1bW4NCgkJCQkJCQlmb3IgKGkgPSAx
OyBpIDw9IHRoaXMud2lkdGg7IGkgKz0gMSkgew0KCQkJCQkJCQlyb3cuY2VsbC5wdXNoKHRoaXMp
Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCWxhc3RDZWxsVHlwZSA9IHRoaXMuZWxlbS5ub2RlTmFtZS50
b0xvd2VyQ2FzZSgpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9Ow0KCQkJCWZuUGFyc2VTcGFu
bmVkUm93Q2VsbCgpOyAvLyBUaGlzIGFyZSBmb3IgYW55IHJvdyB0aGF0IGhhdmUgc3Bhbm5lZCBy
b3cgaW4gaXMgZmlyc3QgY2VsbHMNCg0KCQkJCS8vIFJlYWQgdGhlIHJvdw0KCQkJCSQuZWFjaChj
ZWxscywgZnVuY3Rpb24gKCkgew0KCQkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpLA0KCQkJCQkJd2lk
dGggPSAkdGhpcy5hdHRyKCdjb2xzcGFuJykgIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50KCR0aGlz
LmF0dHIoJ2NvbHNwYW4nKSwgMTApIDogMSwNCgkJCQkJCWhlaWdodCA9ICR0aGlzLmF0dHIoJ3Jv
d3NwYW4nKSAhPT0gdW5kZWZpbmVkID8gcGFyc2VJbnQoJHRoaXMuYXR0cigncm93c3BhbicpLCAx
MCkgOiAxLA0KCQkJCQkJaGVhZGVyQ2VsbCwNCgkJCQkJCWRhdGFDZWxsLA0KCQkJCQkJaTsNCg0K
CQkJCQlzd2l0Y2ggKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgew0KCQkJCQljYXNlICd0
aCc6IC8vIGNlbGwgaGVhZGVyCQkJCQkNCgkJCQkJCWhlYWRlckNlbGwgPSB7DQoJCQkJCQkJcm93
cG9zOiBjdXJyZW50Um93UG9zLA0KCQkJCQkJCWNvbHBvczogY29sdW1uUG9zLA0KCQkJCQkJCXdp
ZHRoOiB3aWR0aCwNCgkJCQkJCQloZWlnaHQ6IGhlaWdodCwNCgkJCQkJCQlkYXRhOiBbXSwNCgkJ
CQkJCQlzdW1tYXJ5OiBbXSwNCgkJCQkJCQllbGVtOiB0aGlzDQoJCQkJCQl9Ow0KDQoJCQkJCQkk
dGhpcy5kYXRhKCkudGJscGFyc2VyID0gaGVhZGVyQ2VsbDsNCgkJCQkJCWhlYWRlckNlbGwuZ3Jv
dXBaZXJvID0gZ3JvdXBaZXJvOw0KDQoJCQkJCQloZWFkZXJDZWxsLnVpZCA9IHVpZEVsZW07DQoJ
CQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goaGVh
ZGVyQ2VsbCk7DQoNCgkJCQkJCWZuUHJlUHJvY2Vzc0dyb3VwSGVhZGVyQ2VsbChoZWFkZXJDZWxs
KTsNCg0KCQkJCQkJaGVhZGVyQ2VsbC5wYXJlbnQgPSBjb2xncm91cDsNCg0KCQkJCQkJLy8gQ2hl
Y2sgaWYgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIHNwYW5uZWRSb3cgY29sbGVjdGlvbg0KCQkJ
CQkJaWYgKGhlaWdodCA+IDEpIHsNCgkJCQkJCQloZWFkZXJDZWxsLnNwYW5IZWlnaHQgPSBoZWln
aHQgLSAxOw0KCQkJCQkJCXNwYW5uZWRSb3cucHVzaChoZWFkZXJDZWxsKTsNCgkJCQkJCX0NCg0K
CQkJCQkJLy8gSW5jcmVtZW50IHRoZSBjb2x1bW4gcG9zaXRpb24NCgkJCQkJCWNvbHVtblBvcyAr
PSBoZWFkZXJDZWxsLndpZHRoOw0KDQoJCQkJCQlmb3IgKGkgPSAxOyBpIDw9IHdpZHRoOyBpICs9
IDEpIHsNCgkJCQkJCQlyb3cuY2VsbC5wdXNoKGhlYWRlckNlbGwpOw0KCQkJCQkJfQ0KDQoJCQkJ
CQkvLyBDaGVjayBmb3IgYW55IHNwYW5uZWQgY2VsbA0KCQkJCQkJZm5QYXJzZVNwYW5uZWRSb3dD
ZWxsKCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAndGQnOiAvLyBkYXRhIGNlbGwNCgkJCQkJ
CWRhdGFDZWxsID0gew0KCQkJCQkJCXJvd3BvczogY3VycmVudFJvd1BvcywNCgkJCQkJCQljb2xw
b3M6IGNvbHVtblBvcywNCgkJCQkJCQl3aWR0aDogd2lkdGgsDQoJCQkJCQkJaGVpZ2h0OiBoZWln
aHQsDQoJCQkJCQkJZWxlbTogdGhpcw0KCQkJCQkJfTsNCg0KCQkJCQkJJHRoaXMuZGF0YSgpLnRi
bHBhcnNlciA9IGRhdGFDZWxsOw0KCQkJCQkJZGF0YUNlbGwuZ3JvdXBaZXJvID0gZ3JvdXBaZXJv
Ow0KDQoJCQkJCQlkYXRhQ2VsbC51aWQgPSB1aWRFbGVtOw0KCQkJCQkJdWlkRWxlbSArPSAxOw0K
CQkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNlck9iai5wdXNoKGRhdGFDZWxsKTsNCg0KCQkJCQkJZm5Q
cmVQcm9jZXNzR3JvdXBEYXRhQ2VsbChkYXRhQ2VsbCk7DQoNCgkJCQkJCWRhdGFDZWxsLnBhcmVu
dCA9IGNvbGdyb3VwOw0KDQoJCQkJCQkvLyBDaGVjayBpZiBuZWVkcyB0byBiZSBhZGRlZCB0byB0
aGUgc3Bhbm5lZFJvdyBjb2xsZWN0aW9uDQoJCQkJCQlpZiAoaGVpZ2h0ID4gMSkgew0KCQkJCQkJ
CWRhdGFDZWxsLnNwYW5IZWlnaHQgPSBoZWlnaHQgLSAxOw0KCQkJCQkJCXNwYW5uZWRSb3cucHVz
aChkYXRhQ2VsbCk7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEluY3JlbWVudCB0aGUgY29sdW1uIHBv
c2l0aW9uDQoJCQkJCQljb2x1bW5Qb3MgKz0gZGF0YUNlbGwud2lkdGg7DQoNCgkJCQkJCWZvciAo
aSA9IDE7IGkgPD0gd2lkdGg7IGkgKz0gMSkgew0KCQkJCQkJCXJvdy5jZWxsLnB1c2goZGF0YUNl
bGwpOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayBmb3IgYW55IHNwYW5uZWQgY2VsbA0KCQkJ
CQkJZm5QYXJzZVNwYW5uZWRSb3dDZWxsKCk7DQoJCQkJCQlicmVhazsNCgkJCQkJZGVmYXVsdDoN
CgkJCQkJCWVycm9yVHJpZ2dlcigxNSwgJ3RyIGVsZW1lbnQgbmVlZCB0byBvbmx5IGhhdmUgdGgg
b3IgdGQgZWxlbWVudCBhcyBoaXMgY2hpbGQnLCB0aGlzKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9
DQoNCgkJCQkJbGFzdENlbGxUeXBlID0gdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KCQkJ
CX0pOw0KDQoJCQkJLy8gQ2hlY2sgZm9yIGFueSBzcGFubmVkIGNlbGwNCgkJCQlmblBhcnNlU3Bh
bm5lZFJvd0NlbGwoKTsNCg0KCQkJCS8vIENoZWNrIGlmIHRoaXMgdGhlIG51bWJlciBvZiBjb2x1
bW4gZm9yIHRoaXMgcm93IGFyZSBlcXVhbCB0byB0aGUgb3RoZXINCgkJCQlpZiAodGFibGVDZWxs
V2lkdGggPT09IDApIHsNCgkJCQkJLy8gSWYgbm90IGFscmVhZHkgc2V0LCB3ZSB1c2UgdGhlIGZp
cnN0IHJvdyBhcyBhIGd1aWRlbGluZQ0KCQkJCQl0YWJsZUNlbGxXaWR0aCA9IHJvdy5jZWxsLmxl
bmd0aDsNCgkJCQl9DQoJCQkJaWYgKHRhYmxlQ2VsbFdpZHRoICE9PSByb3cuY2VsbC5sZW5ndGgp
IHsNCgkJCQkJcm93LnNwYW5uZWRSb3cgPSBzcGFubmVkUm93Ow0KCQkJCQllcnJvclRyaWdnZXIo
MTYsICdUaGUgcm93IGRvIG5vdCBoYXZlIGEgZ29vZCB3aWR0aCcsIHJvdy5lbGVtKTsNCgkJCQl9
DQoNCgkJCQkvLyBDaGVjayBpZiB3ZSBhcmUgaW50byBhIHRoZWFkIHJvd2dyb3VwLCBpZiB5ZXMg
d2Ugc3RvcCBoZXJlLg0KCQkJCWlmIChzdGFja1Jvd0hlYWRlcikgew0KCQkJCQl0aGVhZFJvd1N0
YWNrLnB1c2gocm93KTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCS8vIEFkZCB0aGUgbGFz
dCBjb2xncm91cA0KCQkJCXJvdy5jb2xncm91cC5wdXNoKGNvbGdyb3VwKTsNCg0KCQkJCS8vDQoJ
CQkJLy8gRGlnZ2VzdCB0aGUgcm93DQoJCQkJLy8NCgkJCQlpZiAobGFzdENlbGxUeXBlID09PSAn
dGgnKSB7DQoJCQkJCS8vIERpZ2VzdCB0aGUgcm93IGhlYWRlcg0KCQkJCQlyb3cudHlwZSA9IDE7
DQoNCgkJCQkJLy8NCgkJCQkJLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoaXMgaGVhZGVyIHJv
dw0KCQkJCQkvLw0KDQoJCQkJCWlmIChyb3cuY29sZ3JvdXAubGVuZ3RoID09PSAyICYmIGN1cnJl
bnRSb3dQb3MgPT09IDEpIHsNCgkJCQkJCS8vIENoZWNrIGlmIHRoZSBmaXJzdCBpcyBhIGRhdGEg
Y29sZ3JvdXAgd2l0aCBvbmx5IG9uZSBjZWxsIA0KCQkJCQkJaWYgKHJvdy5jb2xncm91cFswXS50
eXBlID09PSAyICYmIHJvdy5jb2xncm91cFswXS5jZWxsLmxlbmd0aCA9PT0gMSkgew0KCQkJCQkJ
CS8vIFZhbGlkIHJvdyBoZWFkZXIgZm9yIHRoZSByb3cgZ3JvdXAgaGVhZGVyDQoNCgkJCQkJCQkv
LyBSRVFVSVJFRDogVGhhdCBjZWxsIG5lZWQgdG8gYmUgZW1wdHkNCgkJCQkJCQlpZiAoJChyb3cu
Y29sZ3JvdXBbMF0uY2VsbFswXS5lbGVtKS5odG1sKCkubGVuZ3RoID09PSAwKSB7DQoJCQkJCQkJ
CS8vIGNvbnNvbGUubG9nKCdUaGlzIGlzIGEgdmFsaWRlIHJvdyBmb3IgdGhlIHJvd2dyb3VwIGhl
YWRlciB3aXRoIGEgbGF5b3V0IGNlbGwnKTsNCg0KCQkJCQkJCQkvLyBXZSBzdGFjayB0aGUgcm93
DQoJCQkJCQkJCXRoZWFkUm93U3RhY2sucHVzaChyb3cpOw0KDQoJCQkJCQkJCXJldHVybjsgLy8g
V2UgZG8gbm90IGdvIGZ1cnRoZXINCgkJCQkJCQl9DQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDE3LCAn
RVJST1I6IFNlZW1zIHRvIGJlIGEgcm93IGluIHRoZSByb3cgZ3JvdXAgaGVhZGVyLCBidXQgdGhl
IGxheW91dCBjZWxsIGlzIG5vdCBlbXB0eScpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBJ
bnZhbGlkIHJvdyBoZWFkZXINCgkJCQkJCQllcnJvclRyaWdnZXIoMTgsICdUaGlzIGlzIGFuIElO
VkFMSUQgcm93IGhlYWRlciBhbmQgQ0FOIE5PVCBiZSBBc3NpZ25lZCB0byB0aGUgcm93Z3JvdXAg
aGVhZGVyJyk7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlpZiAocm93LmNvbGdyb3VwLmxlbmd0
aCA9PT0gMSkgew0KCQkJCQkJaWYgKHJvdy5jb2xncm91cFswXS5jZWxsLmxlbmd0aCA+IDEpIHsN
CgkJCQkJCQkvLyB0aGlzIGlzIGEgcm93IGFzc29jaWF0ZWQgdG8gYSBoZWFkZXIgcm93IGdyb3Vw
DQoJCQkJCQkJaWYgKCFoZWFkZXJSb3dHcm91cENvbXBsZXRlZCkgew0KCQkJCQkJCQkvLyBHb29k
IHJvdw0KCQkJCQkJCQkvLyBjb25zb2xlLmxvZygnVGhpcyBpcyBhbiB2YWxpZCByb3cgaGVhZGVy
IGZvciB0aGUgaGVhZGVyIHJvdyBncm91cCcpOw0KDQoJCQkJCQkJCS8vIFdlIHN0YWNrIHRoZSBy
b3cNCgkJCQkJCQkJdGhlYWRSb3dTdGFjay5wdXNoKHJvdyk7DQoNCgkJCQkJCQkJcmV0dXJuOyAv
LyBXZSBkbyBub3QgZ28gZnVydGhlcg0KCQkJCQkJCX0NCgkJCQkJCQkvLyBCYWQgcm93LCByZW1v
dmUgdGhlIHJvdyBvciBzcGxpdCB0aGUgdGFibGUNCgkJCQkJCQllcnJvclRyaWdnZXIoMTksICdU
aGlzIGlzIGFuIElOVkFMSUQgcm93IGhlYWRlciBmb3IgdGhlIGhlYWRlciByb3cgZ3JvdXAsIHNw
bGl0IHRoZSB0YWJsZSBvciByZW1vdmUgdGhlIHJvdycpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJ
CQlpZiAoY3VycmVudFJvd1BvcyAhPT0gMSkgew0KCQkJCQkJCQkvLyBTdGFjayB0aGUgcm93IGZv
dW5kIGZvciB0aGUgcm93Z3JvdXAgaGVhZGVyDQoJCQkJCQkJCXJvd2dyb3VwSGVhZGVyUm93U3Rh
Y2sucHVzaChyb3cpOw0KDQoJCQkJCQkJCS8vIFRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgb24gdGhl
IGZpcnN0IGRhdGEgcm93IA0KDQoJCQkJCQkJCS8vIGNvbnNvbGUubG9nKCd0aGlzIGhlYWRlciBy
b3cgd2lsbCBiZSBjb25zaWRlcmF0ZWQgdG8gYmUgYSByb3dncm91cCBoZWFkZXIgcm93Jyk7DQoJ
CQkJCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVkID0gdHJ1ZTsgLy8gRW5kIG9mIGFueSBoZWFk
ZXIgcm93IGdyb3VwICh0aGVhZCkNCg0KCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJ
CWVycm9yVHJpZ2dlcigyMCwgJ1lvdSBjYW4gbm90IHNldCBhIGhlYWRlciByb3cgZm9yIGEgcm93
Z3JvdXAgaW4gdGhlIGZpcnN0IHRhYmxlIHJvdycpOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJ
aWYgKHJvdy5jb2xncm91cC5sZW5ndGggPiAxICAmJiBjdXJyZW50Um93UG9zICE9PSAxKSB7DQoJ
CQkJCQllcnJvclRyaWdnZXIoMjEsICdQbGVhc2Ugd3JhcCBhbGwgdGhlIHJvdyB1c2VkIGFzIHRo
ZSBjb2x1bW4gY2VsbCBoZWFkaW5nIGluIHRoZSB0aGVhZCByb3cgZ3JvdXAnKTsNCgkJCQkJfQ0K
DQoJCQkJCS8vDQoJCQkJCS8vIElmIFZhbGlkLCBwcm9jZXNzIHRoZSByb3cNCgkJCQkJLy8NCgkJ
CQl9IGVsc2Ugew0KCQkJCQkvLyBEaWdlc3QgdGhlIGRhdGEgcm93IG9yIHN1bW1hcnkgcm93DQoJ
CQkJCXJvdy50eXBlID0gMjsNCg0KCQkJCQkvLyBUaGlzIG1hcmsgdGhlIGVuZCBvZiBhbnkgcm93
IGdyb3VwIGhlYWRlciAodGhlYWQpDQoJCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVkID0gdHJ1
ZTsNCg0KCQkJCQkvLyBDaGVjayBpZiB0aGlzIHJvdyBpcyBjb25zaWRlcmF0ZWQgYXMgYSBkZXNj
cmlwdGlvbiByb3cgZm9yIGEgaGVhZGVyDQoJCQkJCWlmIChyb3dncm91cEhlYWRlclJvd1N0YWNr
Lmxlbmd0aCA+IDAgJiYgcm93LmNlbGxbMF0udWlkID09PSByb3cuY2VsbFtyb3cuY2VsbC5sZW5n
dGggLSAxXS51aWQpIHsNCgkJCQkJCS8vIEhvcmF5IHRoaXMgcm93IGFyZSBhIGRlc2NyaXB0aW9u
IGNlbGwgZm9yIHRoZSBwcmVjZWRpbmcgaGVhZGluZw0KDQoJCQkJCQlyb3cudHlwZSA9IDU7DQoJ
CQkJCQlyb3cuY2VsbFswXS50eXBlID0gNTsNCgkJCQkJCXJvdy5jZWxsWzBdLnJvdyA9IHJvdzsN
CgkJCQkJCWlmICghcm93LmNlbGxbMF0uZGVzY3JpYmUpIHsNCgkJCQkJCQlyb3cuY2VsbFswXS5k
ZXNjcmliZSA9IFtdOw0KCQkJCQkJfQ0KCQkJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFja1tyb3dn
cm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCAtIDFdLmNlbGxbMF0uZGVzY0NlbGwgPSByb3cuY2Vs
bFswXTsNCgkJCQkJCXJvdy5jZWxsWzBdLmRlc2NyaWJlLnB1c2gocm93Z3JvdXBIZWFkZXJSb3dT
dGFja1tyb3dncm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCAtIDFdLmNlbGxbMF0pOw0KCQkJCQkJ
aWYgKCFncm91cFplcm8uZGVzY2NlbGwpIHsNCgkJCQkJCQlncm91cFplcm8uZGVzY2NlbGwgPSBb
XTsNCgkJCQkJCX0NCgkJCQkJCWdyb3VwWmVyby5kZXNjY2VsbC5wdXNoKHJvdy5jZWxsWzBdKTsN
Cg0KCQkJCQkJLy8gRllJIC0gV2UgZG8gbm90IHB1c2ggdGhpcyByb3cgaW4gYW55IHN0YWNrIGJl
Y2F1c2UgdGhpcyByb3cgaXMgYSBkZXNjcmlwdGlvbiByb3cNCg0KCQkJCQkJcmV0dXJuOyAvLyBT
dG9wIHRoZSBwcm9jZXNzaW5nIGZvciB0aGlzIHJvdw0KCQkJCQl9DQoNCgkJCQkJLy8NCgkJCQkJ
Ly8gUHJvY2VzcyBhbnkgcm93IHVzZWQgdG8gZGVmaW5lZCB0aGUgcm93Z3JvdXAgbGFiZWwNCgkJ
CQkJLy8NCgkJCQkJaWYgKHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoID4gMCB8fCAhY3Vy
cmVudFJvd0dyb3VwLnR5cGUpIHsNCgkJCQkJCXJvd2dyb3VwU2V0dXAoKTsNCgkJCQkJfQ0KCQkJ
CQlyb3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50eXBlOw0KCQkJCQlyb3cubGV2ZWwgPSBjdXJy
ZW50Um93R3JvdXAubGV2ZWw7DQoNCg0KCQkJCQlpZiAoY29sZ3JvdXBGcmFtZVswXSAmJiBsYXN0
SGVhZGluZ0NvbFBvcyAmJiBjb2xncm91cEZyYW1lWzBdLmVuZCAhPT0gbGFzdEhlYWRpbmdDb2xQ
b3MgJiYgY29sZ3JvdXBGcmFtZVswXS5lbmQgPT09IChsYXN0SGVhZGluZ0NvbFBvcyArIDEpKSB7
DQoJCQkJCQlsYXN0SGVhZGluZ0NvbFBvcyArPSAxOyAvLyBBZGp1c3QgaWYgcmVxdWlyZWQsIHRo
ZSBsYXN0SGVhZGluZ0NvbFBvcyBpZiBjb2xncm91cCBhcmUgcHJlc2VudCwgdGhhdCB3b3VsZCBi
ZSB0aGUgZmlyc3QgY29sZ3JvdXANCgkJCQkJfQ0KCQkJCQlyb3cubGFzdEhlYWRpbmdDb2xQb3Mg
PSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJCQkJaWYgKCFjdXJyZW50Um93R3JvdXAubGFzdEhlYWRp
bmdDb2xQb3MpIHsNCgkJCQkJCWN1cnJlbnRSb3dHcm91cC5sYXN0SGVhZGluZ0NvbFBvcyA9IGxh
c3RIZWFkaW5nQ29sUG9zOw0KCQkJCQl9DQoJCQkJCWlmICghcHJldmlvdXNEYXRhSGVhZGluZ0Nv
bFBvcykgew0KCQkJCQkJcHJldmlvdXNEYXRhSGVhZGluZ0NvbFBvcyA9IGxhc3RIZWFkaW5nQ29s
UG9zOw0KCQkJCQl9DQoJCQkJCXJvdy5yb3dncm91cCA9IGN1cnJlbnRSb3dHcm91cDsNCg0KDQoJ
CQkJCWlmIChjdXJyZW50Um93R3JvdXAubGFzdEhlYWRpbmdDb2xQb3MgIT09IGxhc3RIZWFkaW5n
Q29sUG9zKSB7DQoJCQkJCQlpZiAoKCFsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgY3VycmVu
dFJvd0dyb3VwLmxhc3RIZWFkaW5nQ29sUG9zIDwgbGFzdEhlYWRpbmdDb2xQb3MpIHx8IChsYXN0
SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zID09PSBsYXN0
SGVhZGluZ0NvbFBvcykpIHsNCgkJCQkJCQkvLyBUaGlzIGlzIGEgdmlydHVhbCBzdW1tYXJ5IHJv
dyBncm91cA0KDQoJCQkJCQkJLy8gQ2hlY2sgZm9yIHJlc2lkdWFsIHJvd3NwYW4sIHRoZXJlIGNh
biBub3QgaGF2ZSBjZWxsIHRoYXQgb3ZlcmZsb3cgb24gdHdvIG9yIG1vcmUgcm93Z3JvdXANCgkJ
CQkJCQkkLmVhY2goc3Bhbm5lZFJvdywgZnVuY3Rpb24gKCkgew0KCQkJCQkJCQlpZiAodGhpcy5z
cGFuSGVpZ2h0ID4gMCkgew0KCQkJCQkJCQkJLy8gVGhhdCByb3cgYXJlIHNwYW5uZWQgaW4gMiBk
aWZmZXJlbnQgcm93IGdyb3VwDQoJCQkJCQkJCQllcnJvclRyaWdnZXIoMjksICdZb3UgY2FuIG5v
dCBzcGFuIGNlbGwgaW4gMiBkaWZmZXJlbnQgcm93Z3JvdXAnLCB0aGlzKTsNCgkJCQkJCQkJfQ0K
CQkJCQkJCX0pOw0KDQoJCQkJCQkJc3Bhbm5lZFJvdyA9IFtdOyAvLyBDbGVhbnVwIG9mIGFueSBz
cGFubmVkIHJvdw0KCQkJCQkJCXJvd2dyb3VwSGVhZGVyUm93U3RhY2sgPSBbXTsgLy8gUmVtb3Zl
IGFueSByb3dncm91cCBoZWFkZXIgZm91bmQuDQoJCQkJCQkJY3VycmVudFJvd0hlYWRlciA9IFtd
Ow0KDQoJCQkJCQkJY3VycmVudFRib2R5SUQgKz0gMTsNCgkJCQkJCQlmaW5hbGl6ZVJvd0dyb3Vw
KCk7DQoNCgkJCQkJCQljdXJyZW50Um93R3JvdXBFbGVtZW50ID0gdW5kZWZpbmVkOw0KCQkJCQkJ
CWluaXRpYXRlUm93R3JvdXAoKTsNCgkJCQkJCQlyb3dncm91cFNldHVwKCk7DQoNCgkJCQkJCQly
b3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50eXBlOyAvLyBSZXNldCB0aGUgY3VycmVudCByb3cg
dHlwZQ0KDQoJCQkJCQl9IGVsc2UgaWYgKGxhc3RIZWFkaW5nU3VtbWFyeUNvbFBvcyAmJiBwcmV2
aW91c0RhdGFIZWFkaW5nQ29sUG9zID09PSBsYXN0SGVhZGluZ0NvbFBvcykgew0KCQkJCQkJCS8v
IFRoaXMgaXMgYSB2aXJ0dWFsIGRhdGEgcm93IGdyb3VwDQoNCgkJCQkJCQkvLyBDaGVjayBmb3Ig
cmVzaWR1YWwgcm93c3BhbiwgdGhlcmUgY2FuIG5vdCBoYXZlIGNlbGwgdGhhdCBvdmVyZmxvdyBv
biB0d28gb3IgbW9yZSByb3dncm91cA0KCQkJCQkJCSQuZWFjaChzcGFubmVkUm93LCBmdW5jdGlv
biAoKSB7DQoJCQkJCQkJCWlmICh0aGlzLnNwYW5IZWlnaHQgPiAwKSB7DQoJCQkJCQkJCQkvLyBU
aGF0IHJvdyBhcmUgc3Bhbm5lZCBpbiAyIGRpZmZlcmVudCByb3cgZ3JvdXANCgkJCQkJCQkJCWVy
cm9yVHJpZ2dlcigyOSwgJ1lvdSBjYW4gbm90IHNwYW4gY2VsbCBpbiAyIGRpZmZlcmVudCByb3dn
cm91cCcsIHRoaXMpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoNCgkJCQkJCQlzcGFubmVkUm93
ID0gW107IC8vIENsZWFudXAgb2YgYW55IHNwYW5uZWQgcm93DQoJCQkJCQkJcm93Z3JvdXBIZWFk
ZXJSb3dTdGFjayA9IFtdOyAvLyBSZW1vdmUgYW55IHJvd2dyb3VwIGhlYWRlciBmb3VuZC4NCgkJ
CQkJCQljdXJyZW50Um93SGVhZGVyID0gW107DQoNCgkJCQkJCQljdXJyZW50VGJvZHlJRCArPSAx
Ow0KCQkJCQkJCWZpbmFsaXplUm93R3JvdXAoKTsNCg0KCQkJCQkJCWN1cnJlbnRSb3dHcm91cEVs
ZW1lbnQgPSB1bmRlZmluZWQ7DQoJCQkJCQkJaW5pdGlhdGVSb3dHcm91cCgpOw0KCQkJCQkJCXJv
d2dyb3VwU2V0dXAodHJ1ZSk7DQoNCgkJCQkJCQlyb3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50
eXBlOyAvLyBSZXNldCB0aGUgY3VycmVudCByb3cgdHlwZQ0KDQoJCQkJCQkJZXJyb3JUcmlnZ2Vy
KDM0LCAnVGhlIHNlY29uZCBkYXRhIGdyb3VwLCB3aGVuIGhlYWRlciBjZWxsIHJvdyBleGlzdCwg
bXVzdCBoYXZlIGEgZ3JvdXAgaGVhZGVyIGNlbGwnLCByb3cuZWxlbSk7DQoNCgkJCQkJCX0gZWxz
ZSB7DQoJCQkJCQkJaWYgKCFsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgY3VycmVudFJvd0dy
b3VwLmxhc3RIZWFkaW5nQ29sUG9zID4gbGFzdEhlYWRpbmdDb2xQb3MpIHsNCgkJCQkJCQkJLy8g
VGhpcyBpcyBhbiBlcnJvciwgd2UgY2FuIG5vdCBoYXZlIGFuIHJvdyBjZWxsIGhlYWRpbmcgbGVu
Z3RoIGluZmVyaW9yIGZvciBhIHN1bW1hcnkgZ3JvdXANCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDMy
LCAnQW4gcm93IGNlbGwgaGVhZGluZyBsZW5ndGggY2FuIG5vdCBiZSBpbmZlcmlvciBvZiBhIGRh
dGEgcm93IGdyb3VwJyk7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJLy8gVGhpcyBpcyBhbiBl
cnJvciwgd2UgY2FuIG5vdCBoYXZlIGFuIHJvdyBjZWxsIGhlYWRpbmcgbGVuZ3RoIHRoYXQgY2Fu
IG5vdCBiZSBjYXRlZ29yaXplZCBpbiB0aGUgZGF0YSBncm91cCBhbmQgc3VtbWFyeSBncm91cA0K
CQkJCQkJCQllcnJvclRyaWdnZXIoMzMsICdBbiByb3cgY2VsbCBoZWFkaW5nIGxlbmd0aCB0aGF0
IGNhbiBub3QgYmUgY2F0ZWdvcml6ZWQgaW4gdGhlIGRhdGEgZ3JvdXAgYW5kIHN1bW1hcnkgZ3Jv
dXAuIFVzZSB1bmlmb3JtIHNpemUgZm9yIGRhdGEvc3VtbWFyeSBncm91cC4gVW5pZm9ybSBzaXpl
IGJldHdlZW4gZGF0YSBncm91cCBhbmQgc3VtbWFyeSBncm91cCByZXF1aXJlIGEgbmV3IHRib2R5
IHNlY3Rpb24uJyk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICghY3VycmVu
dFJvd0dyb3VwLmxhc3RIZWFkaW5nQ29sUG9zKSB7DQoJCQkJCQljdXJyZW50Um93R3JvdXAubGFz
dEhlYWRpbmdDb2xQb3MgPSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJCQkJfQ0KDQoJCQkJCWlmIChj
dXJyZW50Um93R3JvdXAudHlwZSA9PT0gMyAmJiAhbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zKSB7
DQoJCQkJCQlsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgPSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJ
CQkJfQ0KDQoNCg0KCQkJCQkvLyBCdWlsZCB0aGUgaW5pdGlhbCBjb2xncm91cCBzdHJ1Y3R1cmUN
CgkJCQkJLy8gSWYgYW4gY2VsbCBoZWFkZXIgZXhpc3QgaW4gdGhhdCByb3cuLi4uDQoJCQkJCWlm
IChsYXN0SGVhZGluZ0NvbFBvcykgew0KCQkJCQkJLy8gUHJvY2VzcyB0aGUgaGVhZGluZyBjb2xn
cm91cCBhc3NvY2lhdGVkIHRvIHRoaXMgcm93Lg0KCQkJCQkJaGVhZGluZ1Jvd0NlbGwgPSBbXTsN
CgkJCQkJCXJvd2hlYWRlciA9IHVuZGVmaW5lZDsgLy8gVGhpcyBhcmUgdGhlIG1vc3QgcHJlY2lz
ZSBjZWxsIGhlYWRlciBmb3IgdGhpcyByb3cNCgkJCQkJCWNvbEtleUNlbGwgPSBbXTsNCg0KCQkJ
CQkJZm9yIChpID0gMDsgaSA8IGxhc3RIZWFkaW5nQ29sUG9zOyBpICs9IDEpIHsNCgkJCQkJCQkv
LyBDaGVjayBmb3IgZGVzY3JpcHRpb24gY2VsbCBvciBrZXkgY2VsbA0KCQkJCQkJCWlmIChyb3cu
Y2VsbFtpXS5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZCIpIHsNCg0KCQkJCQkJ
CQlpZiAoIXJvdy5jZWxsW2ldLnR5cGUgJiYgcm93LmNlbGxbaSAtIDFdICYmICEocm93LmNlbGxb
aSAtIDFdLmRlc2NDZWxsKSAmJiByb3cuY2VsbFtpIC0gMV0udHlwZSA9PT0gMSAmJiByb3cuY2Vs
bFtpIC0gMV0uaGVpZ2h0ID09PSByb3cuY2VsbFtpXS5oZWlnaHQpIHsNCgkJCQkJCQkJCXJvdy5j
ZWxsW2ldLnR5cGUgPSA1Ow0KCQkJCQkJCQkJcm93LmNlbGxbaSAtIDFdLmRlc2NDZWxsID0gcm93
LmNlbGxbaV07DQoNCgkJCQkJCQkJCWlmICghcm93LmNlbGxbaV0uZGVzY3JpYmUpIHsNCgkJCQkJ
CQkJCQlyb3cuY2VsbFtpXS5kZXNjcmliZSA9IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJcm93
LmNlbGxbaV0uZGVzY3JpYmUucHVzaChyb3cuY2VsbFtpIC0gMV0pOw0KDQoJCQkJCQkJCQlpZiAo
IXJvdy5kZXNjY2VsbCkgew0KCQkJCQkJCQkJCXJvdy5kZXNjY2VsbCA9IFtdOw0KCQkJCQkJCQkJ
fQ0KCQkJCQkJCQkJcm93LmRlc2NjZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KDQoJCQkJCQkJCQlp
ZiAoIWdyb3VwWmVyby5kZXNjY2VsbCkgew0KCQkJCQkJCQkJCWdyb3VwWmVyby5kZXNjY2VsbCA9
IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZ3JvdXBaZXJvLmRlc2NjZWxsLnB1c2gocm93LmNl
bGxbaV0pOw0KDQoJCQkJCQkJCQlyb3cuY2VsbFtpXS5zY29wZSA9ICJyb3ciOyAvLyBTcGVjaWZ5
IHRoZSBzY29wZSBvZiB0aGlzIGRlc2NyaXB0aW9uIGNlbGwNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJ
CS8vIENoZWNrIGlmIHRoaXMgY2VsbCBjYW4gYmUgYW4ga2V5IGNlbGwgYXNzb2NpYXRlZCB0byBh
biBjZWxsIGhlYWRpbmcNCgkJCQkJCQkJaWYgKCFyb3cuY2VsbFtpXS50eXBlKSB7DQoJCQkJCQkJ
CQljb2xLZXlDZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJ
CQkJCQkJLy8gU2V0IGZvciB0aGUgbW9zdCBhcHByb3ByaWF0ZSBoZWFkZXIgdGhhdCBjYW4gcmVw
cmVzZW50IHRoaXMgcm93DQoJCQkJCQkJaWYgKHJvdy5jZWxsW2ldLmVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKSA9PT0gInRoIikgew0KCQkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gMTsgLy8g
TWFyayB0aGUgY2VsbCB0byBiZSBhbiBoZWFkZXIgY2VsbA0KCQkJCQkJCQlyb3cuY2VsbFtpXS5z
Y29wZSA9ICJyb3ciOw0KCQkJCQkJCQlpZiAocm93aGVhZGVyICYmIHJvd2hlYWRlci51aWQgIT09
IHJvdy5jZWxsW2ldLnVpZCkgew0KCQkJCQkJCQkJaWYgKHJvd2hlYWRlci5oZWlnaHQgPiByb3cu
Y2VsbFtpXS5oZWlnaHQpIHsNCg0KCQkJCQkJCQkJCS8vIFRoZSBjdXJyZW50IGNlbGwgYXJlIGEg
Y2hpbGQgb2YgdGhlIHByZXZpb3VzIHJvd2hlYWRlciANCgkJCQkJCQkJCQlpZiAoIXJvd2hlYWRl
ci5zdWJoZWFkZXIpIHsNCgkJCQkJCQkJCQkJcm93aGVhZGVyLnN1YmhlYWRlciA9IFtdOw0KCQkJ
CQkJCQkJCQlyb3doZWFkZXIuaXNncm91cCA9IHRydWU7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJ
CXJvd2hlYWRlci5zdWJoZWFkZXIucHVzaChyb3cuY2VsbFtpXSk7DQoNCgkJCQkJCQkJCQkvLyBD
aGFuZ2UgdGhlIGN1cnJlbnQgcm93IGhlYWRlcg0KCQkJCQkJCQkJCXJvd2hlYWRlciA9IHJvdy5j
ZWxsW2ldOw0KCQkJCQkJCQkJCWhlYWRpbmdSb3dDZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KCQkJ
CQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQkvLyBUaGlzIGNhc2UgYXJlIGVpdGhlciBwYXJhbGVs
IGhlYWRpbmcgb2YgZ3Jvd2luZyBoZWFkZXIsIHRoaXMgYXJlIGFuIGVycm9yLg0KCQkJCQkJCQkJ
CWlmIChyb3doZWFkZXIuaGVpZ2h0ID09PSByb3cuY2VsbFtpXS5oZWlnaHQpIHsNCgkJCQkJCQkJ
CQkJZXJyb3JUcmlnZ2VyKDIzLCAnWW91IGNhbiBub3QgaGF2ZSBwYXJhbGVsIHJvdyBoZWFkaW5n
LCBkbyBhIGNlbGwgbWVyZ2UgdG8gZml4IHRoaXMnKTsNCgkJCQkJCQkJCQl9IGVsc2Ugew0KCQkJ
CQkJCQkJCQllcnJvclRyaWdnZXIoMjQsICdGb3IgYSBkYXRhIHJvdywgdGhlIGhlYWRpbmcgaGll
YXJjaHkgbmVlZCB0byBiZSB0aGUgR2VuZXJpYyB0byB0aGUgc3BlY2lmaWMnKTsNCgkJCQkJCQkJ
CQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJaWYgKCFyb3doZWFkZXIpIHsNCgkJ
CQkJCQkJCXJvd2hlYWRlciA9IHJvdy5jZWxsW2ldOw0KCQkJCQkJCQkJaGVhZGluZ1Jvd0NlbGwu
cHVzaChyb3cuY2VsbFtpXSk7DQoJCQkJCQkJCX0NCgkJCQkJCQkJZm9yIChqID0gMDsgaiA8IGNv
bEtleUNlbGwubGVuZ3RoOyBqICs9IDEpIHsNCgkJCQkJCQkJCWlmICghKGNvbEtleUNlbGxbal0u
dHlwZSkgJiYgIShyb3cuY2VsbFtpXS5rZXljZWxsKSAmJiBjb2xLZXlDZWxsW2pdLmhlaWdodCA9
PT0gcm93LmNlbGxbaV0uaGVpZ2h0KSB7DQoJCQkJCQkJCQkJY29sS2V5Q2VsbFtqXS50eXBlID0g
NDsNCgkJCQkJCQkJCQlyb3cuY2VsbFtpXS5rZXljZWxsID0gY29sS2V5Q2VsbFtqXTsNCg0KCQkJ
CQkJCQkJCWlmICghcm93LmtleWNlbGwpIHsNCgkJCQkJCQkJCQkJcm93LmtleWNlbGwgPSBbXTsN
CgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJcm93LmtleWNlbGwucHVzaChjb2xLZXlDZWxsW2pdKTsN
Cg0KCQkJCQkJCQkJCWlmICghZ3JvdXBaZXJvLmtleWNlbGwpIHsNCgkJCQkJCQkJCQkJZ3JvdXBa
ZXJvLmtleWNlbGwgPSBbXTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJZ3JvdXBaZXJvLmtleWNl
bGwucHVzaChjb2xLZXlDZWxsW2pdKTsNCg0KDQoJCQkJCQkJCQkJaWYgKCFjb2xLZXlDZWxsW2pd
LmRlc2NyaWJlKSB7DQoJCQkJCQkJCQkJCWNvbEtleUNlbGxbal0uZGVzY3JpYmUgPSBbXTsNCgkJ
CQkJCQkJCQl9DQoJCQkJCQkJCQkJY29sS2V5Q2VsbFtqXS5kZXNjcmliZS5wdXNoKHJvdy5jZWxs
W2ldKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQkvKiQuZWFjaChjb2xLZXlDZWxs
LCBmdW5jdGlvbiAoKSB7DQoJCQkJCQkJCQlpZiAoISh0aGlzLnR5cGUpICYmICEocm93LmNlbGxb
aV0ua2V5Y2VsbCkgJiYgdGhpcy5oZWlnaHQgPT09IHJvdy5jZWxsW2ldLmhlaWdodCkgew0KCQkJ
CQkJCQkJCXRoaXMudHlwZSA9IDQ7DQoJCQkJCQkJCQkJcm93LmNlbGxbaV0ua2V5Y2VsbCA9IHRo
aXM7DQoNCgkJCQkJCQkJCQlpZiAoIXJvdy5rZXljZWxsKSB7DQoJCQkJCQkJCQkJCXJvdy5rZXlj
ZWxsID0gW107DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCXJvdy5rZXljZWxsLnB1c2godGhpcyk7
DQoNCgkJCQkJCQkJCQlpZiAoIWdyb3VwWmVyby5rZXljZWxsKSB7DQoJCQkJCQkJCQkJCWdyb3Vw
WmVyby5rZXljZWxsID0gW107DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCWdyb3VwWmVyby5rZXlj
ZWxsLnB1c2godGhpcyk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0pOyovDQoJCQkJCQkJfQ0KCQkJ
CQkJfQ0KDQoJCQkJCQkvLyBBbGwgdGhlIGNlbGwgdGhhdCBoYXZlIG5vICJ0eXBlIiBpbiB0aGUg
Y29sS2V5Q2VsbCBjb2xsZWN0aW9uIGFyZSBwcm9ibGVtYXRpYyBjZWxscw0KCQkJCQkJJC5lYWNo
KGNvbEtleUNlbGwsIGZ1bmN0aW9uICgpIHsNCgkJCQkJCQlpZiAoISh0aGlzLnR5cGUpKSB7DQoJ
CQkJCQkJCWVycm9yVHJpZ2dlcigyNSwgJ1lvdSBoYXZlIGEgcHJvYmxlbWF0aWMgY2VsbCwgaW4g
eW91ciBjb2xncm91cCBoZWFkaW5nLCB0aGF0IGNhbiBub3QgYmUgdW5kZXJzdG9vZCBieSB0aGUg
cGFyc2VyJyk7DQoJCQkJCQkJCWlmICghcm93LmVycm9yY2VsbCkgew0KCQkJCQkJCQkJcm93LmVy
cm9yY2VsbCA9IFtdOw0KCQkJCQkJCQl9DQoJCQkJCQkJCXJvdy5lcnJvcmNlbGwucHVzaCh0aGlz
KTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJCXJvdy5oZWFkZXIgPSBoZWFkaW5nUm93Q2Vs
bDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIFRoZXJlIGFyZSBvbmx5IGF0IGxlYXN0IG9uZSBj
b2xncm91cCwNCgkJCQkJCS8vIEFueSBjb2xncm91cCB0YWcgZGVmaW5lZCBidXQgYmUgZXF1YWwg
b3IgZ3JlYXRlciB0aGFuIDAuDQoJCQkJCQkvLyBpZiBjb2xncm91cCB0YWcgZGVmaW5lZCwgdGhl
eSBhcmUgYWxsIGRhdGEgY29sZ3JvdXAuIA0KCQkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSAwOw0K
DQoJCQkJCQlpZiAoY29sZ3JvdXBGcmFtZS5sZW5ndGggPT09IDApIHsNCgkJCQkJCQlwcm9jZXNz
Q29sZ3JvdXAodW5kZWZpbmVkLCB0YWJsZUNlbGxXaWR0aCk7DQoJCQkJCQl9DQoJCQkJCX0NCg0K
DQoNCgkJCQkJLy8NCgkJCQkJLy8gUHJvY2VzcyB0aGUgdGFibGUgcm93IGhlYWRpbmcgYW5kIGNv
bGdyb3VwIGlmIHJlcXVpcmVkDQoJCQkJCS8vDQoJCQkJCXByb2Nlc3NSb3dncm91cEhlYWRlcihs
YXN0SGVhZGluZ0NvbFBvcyk7DQoNCgkJCQkJcm93LmhlYWRlcnNldCA9IChjdXJyZW50Um93R3Jv
dXAuaGVhZGVybGV2ZWwgfHwgW10pOw0KCQkJCQkvKmlmIChjb2xncm91cEZyYW1lLmxlbmd0aCAh
PT0gMCkgew0KDQoJCQkJCQkvLyBXZSBjaGVjayB0aGUgZmlyc3QgY29sZ3JvdXAgdG8ga25vdyBp
ZiBhIGNvbGdyb3VwIHR5cGUgaGFzIGJlZW4gZGVmaW5lZA0KCQkJCQkJaWYgKCEoY29sZ3JvdXBG
cmFtZVswXS50eXBlKSkgew0KDQoJCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVyKGxhc3RI
ZWFkaW5nQ29sUG9zKTsNCg0KCQkJCQkJCS8vIE1hdGNoIHRoZSBhbHJlYWR5IGRlZmluZWQgY29s
Z3JvdXAgdGFnIHdpdGggdGhlIHRhYmxlIHJvd2dyb3VwIGhlYWRpbmcgc2VjdGlvbg0KDQoJCQkJ
CQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUgYSByb3dncm91cCBoZWFkaW5nIHNlY3Rpb24g
YW5kIG5vdGhpbmcgZm91bmQgZm9yIGNvbGdyb3VwIGhlYWRpbmcsIGxldCBhbGwgdGhlIGNvbGdy
b3VwIHRvIGJlIGEgZGF0YWdyb3VwDQoJCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUg
YSByb3cgZ3JvdXAgaGVhZGluZyBzZWN0aW9uIGJ1dCBoYXZlIGEgY29sZ3JvdXAgaGVhZGluZywg
dGhlIGZpcnN0IGdyb3VwIG11c3QgbWF0Y2ggdGhlIGZvdW5kZWQgY29sZ3JvdXAgaGVhZGluZywg
dGhlIHNlY29uZCBjb2xncm91cCB3aWxsIGJlIGEgZGF0YWdyb3VwIGFuZCB0aGUgdGhpcmQgd2ls
bCBiZSBhIHN1bW1hcnkgY29sZ3JvdXAuIEl0IHdvdWxkIGJlIHRoZSBzYW1lIGlmIG9ubHkgb25l
IHJvdyBhcmUgZm91bmQgaW4gdGhlIHJvd2dyb3VwIGhlYWRpbmcgc2VjdGlvbi4NCgkJCQkJCX0N
CgkJCQkJfSovDQoJCQkJCS8qIGVsc2Ugew0KCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVy
KGxhc3RIZWFkaW5nQ29sUG9zKTsNCg0KCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGhhdmUgYSB0YWJs
ZSByb3dncm91cCBoZWFkaW5nIHNlY3Rpb24sIGxldCB0aGF0IHRvIGJlIHRyYW5zZm9ybWVkIGlu
dG8gY29sZ3JvdXANCg0KCQkJCQkJLy8gVGhlIG51bWJlciBvZiBjb2xncm91cCBsZXZlbCBhcmUg
ZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHJvdyBoZWFkaW5nIGluY2x1ZGVkIGlu
IHRoZSB0aGVhZCBvciB0Ym9keS4NCg0KCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUg
YSBoZWFkaW5nIHNlY3Rpb24sIGxldCBydW4gdGhlIGNvZGUsIHRoZSBjb2xncm91cCB3b3VsZCBi
ZSBjcmVhdGVkIGxhdGVyDQoJCQkJCX0qLw0KDQoJCQkJCWlmIChsYXN0SGVhZGluZ0NvbFBvcyAh
PT0gMCkgew0KCQkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBjb2xncm91cEZyYW1lWzBdLmVuZDsg
Ly8gY29sZ3JvdXBGcmFtZSBtdXN0IGJlIGRlZmluZWQgaGVyZQ0KCQkJCQl9DQoNCgkJCQkJLy8N
CgkJCQkJLy8gQXNzb2NpYXRlIHRoZSBkYXRhIGNlbGwgdHlwZSB3aXRoIHRoZSBjb2xncm91cCBp
ZiBhbnksIA0KDQoJCQkJCS8vIFByb2Nlc3MgdGhlIGRhdGEgY2VsbC4gVGhlcmUgYXJlIGEgbmVl
ZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBkYXRhIGNlbGwgcGVyIGRhdGEgcm93Lg0KCQkJCQlpZiAo
IXJvdy5kYXRhY2VsbCkgew0KCQkJCQkJcm93LmRhdGFjZWxsID0gW107DQoJCQkJCX0NCgkJCQkJ
Zm9yIChpID0gbGFzdEhlYWRpbmdDb2xQb3M7IGkgPCByb3cuY2VsbC5sZW5ndGg7IGkgKz0gMSkg
ew0KCQkJCQkJaXNEYXRhQ2VsbCA9IHRydWU7DQoJCQkJCQlpc0RhdGFDb2xncm91cFR5cGUgPSB0
cnVlOw0KDQoJCQkJCQlmb3IgKGogPSAobGFzdEhlYWRpbmdDb2xQb3MgPT09IDAgPyAwIDogMSk7
IGogPCBjb2xncm91cEZyYW1lLmxlbmd0aDsgaiArPSAxKSB7IC8vIElmIGNvbGdyb3VwLCB0aGUg
Zmlyc3QgYXJlIGFsd2F5cyBoZWFkZXIgY29sZ3JvdXANCgkJCQkJCQlpZiAoY29sZ3JvdXBGcmFt
ZVtqXS5zdGFydCA8PSByb3cuY2VsbFtpXS5jb2xwb3MgJiYgcm93LmNlbGxbaV0uY29scG9zIDw9
IGNvbGdyb3VwRnJhbWVbal0uZW5kKSB7DQoJCQkJCQkJCWlmIChyb3cudHlwZSA9PT0gMyB8fCBj
b2xncm91cEZyYW1lW2pdLnR5cGUgPT09IDMpIHsNCgkJCQkJCQkJCXJvdy5jZWxsW2ldLnR5cGUg
PSAzOyAvLyBTdW1tYXJ5IENlbGwNCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCXJvdy5jZWxs
W2ldLnR5cGUgPSAyOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJLy8gVGVzdCBpZiB0aGlzIGNlbGwg
aXMgYSBsYXlvdXQgY2VsbA0KCQkJCQkJCQlpZiAocm93LnR5cGUgPT09IDMgJiYgY29sZ3JvdXBG
cmFtZVtqXS50eXBlID09PSAzICYmICgkKHJvdy5jZWxsW2ldLmVsZW0pLnRleHQoKS5sZW5ndGgg
PT09IDApKSB7DQoJCQkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gNjsNCgkJCQkJCQkJCWlmICgh
Z3JvdXBaZXJvLmxheW91dENlbGwpIHsNCgkJCQkJCQkJCQlncm91cFplcm8ubGF5b3V0Q2VsbCA9
IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZ3JvdXBaZXJvLmxheW91dENlbGwucHVzaChyb3cu
Y2VsbFtpXSk7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQlyb3cuY2VsbFtpXS5jb2xsZXZlbCA9IGNv
bGdyb3VwRnJhbWVbal0ubGV2ZWw7DQoJCQkJCQkJCXJvdy5kYXRhY2VsbC5wdXNoKHJvdy5jZWxs
W2ldKTsNCgkJCQkJCQl9DQoJCQkJCQkJaXNEYXRhQ29sZ3JvdXBUeXBlID0gIWlzRGF0YUNvbGdy
b3VwVHlwZTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoID09PSAw
KSB7DQoJCQkJCQkJLy8gVGhlcmUgYXJlIG5vIGNvbGdyb3VwIGRlZmluaXRpb24sIHRoaXMgY2Vs
bCBhcmUgc2V0IHRvIGJlIGEgZGF0YWNlbGwNCgkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gMjsN
CgkJCQkJCQlyb3cuZGF0YWNlbGwucHVzaChyb3cuY2VsbFtpXSk7DQoJCQkJCQl9DQoNCg0KCQkJ
CQkJLy8gQWRkIHJvdyBoZWFkZXIgd2hlbiB0aGUgY2VsbCBpcyBzcGFuIGludG8gbW9yZSB0aGFu
IG9uZSByb3cNCgkJCQkJCWlmIChyb3cuY2VsbFtpXS5yb3dwb3MgPCBjdXJyZW50Um93UG9zKSB7
DQoJCQkJCQkJaWYgKCFyb3cuY2VsbFtpXS5hZGRyb3doZWFkZXJzKSB7DQoJCQkJCQkJCXJvdy5j
ZWxsW2ldLmFkZHJvd2hlYWRlcnMgPSBbXTsgLy8gYWRkcm93aGVhZGVycyBmb3IgYWRkaXRpb25h
bCByb3cgaGVhZGVycw0KCQkJCQkJCX0NCgkJCQkJCQlpZiAocm93LmhlYWRlcikgew0KCQkJCQkJ
CQlmb3IgKGogPSAwOyBqIDwgcm93LmhlYWRlci5sZW5ndGg7IGogKz0gMSkgew0KCQkJCQkJCQkJ
aWYgKChyb3cuaGVhZGVyW2pdLnJvd3BvcyA9PT0gY3VycmVudFJvd1BvcyAmJiByb3cuY2VsbFtp
XS5hZGRyb3doZWFkZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHJvdy5oZWFkZXJbal0ucm93cG9zID09
PSBjdXJyZW50Um93UG9zICYmIHJvdy5jZWxsW2ldLmFkZHJvd2hlYWRlcnNbcm93LmNlbGxbaV0u
YWRkcm93aGVhZGVycy5sZW5ndGggLSAxXS51aWQgIT09ICByb3cuaGVhZGVyW2pdLnVpZCkpIHsN
CgkJCQkJCQkJCQlyb3cuY2VsbFtpXS5hZGRyb3doZWFkZXJzLnB1c2gocm93LmhlYWRlcltqXSk7
IC8vIEFkZCB0aGUgY3VycmVudCBoZWFkZXINCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJ
CX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCWNyZWF0ZUdlbmVyaWNDb2xncm91cCA9IChjb2xn
cm91cEZyYW1lLmxlbmd0aCA9PT0gMCk7DQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA9
PT0gMCkgew0KCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVyKGxhc3RIZWFkaW5nQ29sUG9z
KTsNCgkJCQkJCWNyZWF0ZUdlbmVyaWNDb2xncm91cCA9IGZhbHNlOw0KCQkJCQl9DQoNCg0KDQoJ
CQkJCS8vIEFkZCB0aGUgY2VsbCBpbiBoaXMgYXBwcm9wcmlhdGUgY29sdW1uDQoJCQkJCWlmICgh
Z3JvdXBaZXJvLmNvbCkgew0KCQkJCQkJZ3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJCQl9DQoNCgkJ
CQkJZm9yIChpID0gMDsgaSA8IGdyb3VwWmVyby5jb2wubGVuZ3RoOyBpICs9IDEpIHsNCgkJCQkJ
CWZvciAoaiA9IChncm91cFplcm8uY29sW2ldLnN0YXJ0IC0gMSk7IGogPCBncm91cFplcm8uY29s
W2ldLmVuZDsgaiArPSAxKSB7DQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sW2ldLmNlbGwpIHsN
CgkJCQkJCQkJZ3JvdXBaZXJvLmNvbFtpXS5jZWxsID0gW107DQoJCQkJCQkJfQ0KCQkJCQkJCS8v
IEJlIHN1cmUgdG8gZG8gbm90IGluY2x1ZGUgdHdpY2UgdGhlIHNhbWUgY2VsbCBmb3IgYSBjb2x1
bW4gc3Bhbm5lZCBpbiAyIG9yIG1vcmUgY29sdW1uDQoJCQkJCQkJaWYgKCEoaiA+IChncm91cFpl
cm8uY29sW2ldLnN0YXJ0IC0gMSkgJiYgZ3JvdXBaZXJvLmNvbFtpXS5jZWxsW2dyb3VwWmVyby5j
b2xbaV0uY2VsbC5sZW5ndGggLSAxXS51aWQgPT09IHJvdy5jZWxsW2pdLnVpZCkpIHsNCgkJCQkJ
CQkJZ3JvdXBaZXJvLmNvbFtpXS5jZWxsLnB1c2gocm93LmNlbGxbal0pOw0KCQkJCQkJCQlpZiAo
IXJvdy5jZWxsW2pdLmNvbCkgew0KCQkJCQkJCQkJcm93LmNlbGxbal0uY29sID0gZ3JvdXBaZXJv
LmNvbFtpXTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8v
IEFzc29jaWF0ZSB0aGUgcm93IHdpdGggdGhlIGNlbGwgYW5kIENvbGdyb3VwL0NvbCBhc3NvY2lh
dGlvbg0KCQkJCQlmb3IgKGkgPSAwOyBpIDwgcm93LmNlbGwubGVuZ3RoOyBpICs9IDEpIHsNCgkJ
CQkJCWlmICghcm93LmNlbGxbaV0ucm93KSB7DQoJCQkJCQkJcm93LmNlbGxbaV0ucm93ID0gcm93
Ow0KCQkJCQkJfQ0KCQkJCQkJcm93LmNlbGxbaV0ucm93bGV2ZWwgPSBjdXJyZW50Um93R3JvdXAu
bGV2ZWw7DQoJCQkJCQlyb3cuY2VsbFtpXS5yb3dsZXZlbGhlYWRlciA9IGN1cnJlbnRSb3dHcm91
cC5oZWFkZXJsZXZlbDsNCgkJCQkJCXJvdy5jZWxsW2ldLnJvd2dyb3VwID0gY3VycmVudFJvd0dy
b3VwOw0KDQoJCQkJCQlpZiAoaSA+IDAgJiYgcm93LmNlbGxbaSAtIDFdLnVpZCA9PT0gcm93LmNl
bGxbaV0udWlkICYmIHJvdy5jZWxsW2ldLnR5cGUgIT09IDEgJiYgcm93LmNlbGxbaV0udHlwZSAh
PT0gNSAmJiByb3cuY2VsbFtpXS5yb3dwb3MgPT09IGN1cnJlbnRSb3dQb3MgJiYgcm93LmNlbGxb
aV0uY29scG9zIDw9IGkpIHsNCgkJCQkJCQlpZiAoIXJvdy5jZWxsW2ldLmFkZGNvbGhlYWRlcnMp
IHsNCgkJCQkJCQkJcm93LmNlbGxbaV0uYWRkY29saGVhZGVycyA9IFtdOyAvLyBhZGRjb2xoZWFk
ZXJzIGZvciBhZGRpdGlvbmFsIGNvbCBoZWFkZXJzDQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gQWRk
IHRoZSBjb2x1bW4gaGVhZGVyIGlmIHJlcXVpcmVkDQoJCQkJCQkJaWYgKGdyb3VwWmVyby5jb2xb
aV0gJiYgZ3JvdXBaZXJvLmNvbFtpXS5oZWFkZXIpIHsNCgkJCQkJCQkJZm9yIChqID0gMDsgaiA8
IGdyb3VwWmVyby5jb2xbaV0uaGVhZGVyLmxlbmd0aDsgaiArPSAxKSB7DQoJCQkJCQkJCQlpZiAo
Z3JvdXBaZXJvLmNvbFtpXS5oZWFkZXJbal0uY29scG9zID09PSAoaSArIDEpKSB7DQoJCQkJCQkJ
CQkJcm93LmNlbGxbaV0uYWRkY29saGVhZGVycy5wdXNoKGdyb3VwWmVyby5jb2xbaV0uaGVhZGVy
W2pdKTsgLy8gQWRkIHRoZSBjdXJyZW50IGhlYWRlcg0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJ
CQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXN1bW1hcnlSb3dHcm91cEVsaWdpYmxlID0g
dHJ1ZTsNCgkJCQl9DQoJCQkJY3VycmVudFJvd0xldmVsICs9IDE7DQoNCgkJCQkvLyBBZGQgdGhl
IHJvdyB0byB0aGUgZ3JvdXBaZXJvDQoJCQkJaWYgKCFncm91cFplcm8ucm93KSB7DQoJCQkJCWdy
b3VwWmVyby5yb3cgPSBbXTsNCgkJCQl9DQoJCQkJZ3JvdXBaZXJvLnJvdy5wdXNoKHJvdyk7DQoJ
CQkJY3VycmVudFJvd0dyb3VwLnJvdy5wdXNoKHJvdyk7DQoNCgkJCQlkZWxldGUgcm93LmNvbGdy
b3VwOw0KCQkJfSAvLyBFbmQgcHJvY2Vzc1JvdyBmdW5jdGlvbg0KDQoJCQkvLw0KCQkJLy8gTWFp
biBFbnRyeSBGb3IgVGhlIFRhYmxlIFBhcnNpbmcNCgkJCS8vDQoJCQlpZiAoaGFzVGZvb3QpIHsN
CgkJCQkvLyBJZiB0aGVyZSBpcyBhIHRmb290IGVsZW1lbnQsIGJlIHN1cmUgdG8gYWRkIGl0IGF0
IHRoZSBlbmQgb2YgYWxsIHRoZSB0Ym9keS4gRllJIC0gSFRNTCA1IHNwZWMgYWxsb3cgbm93IHRm
b290IHRvIGJlIGF0IHRoZSBlbmQNCgkJCQkkKCd0Zm9vdCcsIG9iaikuYXBwZW5kVG8oJCgndGJv
ZHk6bGFzdCcsIG9iaikucGFyZW50KCkpOw0KCQkJfQ0KCQkJJChvYmopLmNoaWxkcmVuKCkuZWFj
aChmdW5jdGlvbiAoKSB7DQoJCQkJdmFyICR0aGlzID0gJCh0aGlzKTsNCgkJCQlzd2l0Y2ggKHRo
aXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgew0KCQkJCWNhc2UgJ2NhcHRpb24nOg0KCQkJCQlw
cm9jZXNzQ2FwdGlvbih0aGlzKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY29sZ3JvdXAnOg0K
CQkJCQlwcm9jZXNzQ29sZ3JvdXAodGhpcyk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3RoZWFk
JzoNCgkJCQkJY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHRoaXM7DQoJCQkJCS8vIFRoZSB0YWJs
ZSBzaG91bGQgbm90IGhhdmUgYW55IHJvdyBhdCB0aGlzIHBvaW50DQoJCQkJCWlmICh0aGVhZFJv
d1N0YWNrLmxlbmd0aCAhPT0gMCB8fCAoZ3JvdXBaZXJvLnJvdyAmJiBncm91cFplcm8ucm93Lmxl
bmd0aCA+IDApKSB7DQoJCQkJCQllcnJvclRyaWdnZXIoMjYsICdZb3UgY2FuIG5vdCBkZWZpbmUg
YW55IHJvdyBiZWZvcmUgdGhlIHRoZWFkIGdyb3VwJywgdGhpcyk7DQoJCQkJCX0NCg0KCQkJCQkk
KHRoaXMpLmRhdGEoInRibHBhcnNlciIsIGdyb3VwWmVybyk7DQoJCQkJCXN0YWNrUm93SGVhZGVy
ID0gdHJ1ZTsNCg0KCQkJCQkvLyBUaGlzIGlzIHRoZSByb3dncm91cCBoZWFkZXIsIENvbGdyb3Vw
IHR5cGUgY2FuIG5vdCBiZSBkZWZpbmVkIGhlcmUNCgkJCQkJJCh0aGlzKS5jaGlsZHJlbigpLmVh
Y2goZnVuY3Rpb24gKCkgew0KCQkJCQkJaWYgKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAh
PT0gJ3RyJykgew0KCQkJCQkJCS8vIEVSUk9SDQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDI3LCAndGhl
YWQgZWxlbWVudCBuZWVkIHRvIG9ubHkgaGF2ZSB0ciBlbGVtZW50IGFzIGhpcyBjaGlsZCcsIHRo
aXMpOw0KCQkJCQkJfQ0KCQkJCQkJcHJvY2Vzc1Jvdyh0aGlzKTsNCgkJCQkJfSk7DQoNCgkJCQkJ
c3RhY2tSb3dIZWFkZXIgPSBmYWxzZTsNCg0KCQkJCQkvLyBIZXJlIGl0J3Mgbm90IHBvc3NpYmxl
IHRvICBEaWdnZXN0IHRoZSB0aGVhZCBhbmQgdGhlIGNvbGdyb3VwIGJlY2F1c2Ugd2UgbmVlZCB0
aGUgZmlyc3QgZGF0YSByb3cgdG8gYmUgaGFsZiBwcm9jZXNzZWQgYmVmb3JlDQoJCQkJCWJyZWFr
Ow0KCQkJCWNhc2UgJ3Rib2R5JzoNCgkJCQljYXNlICd0Zm9vdCc6DQoNCgkJCQkJLy8gQ3VycmVu
dGx5IHRoZXJlIGFyZSBubyBzcGVjaWZpYyBzdXBwb3J0IGZvciB0Zm9vdCBlbGVtZW50LCB0aGUg
dGZvb3QgaXMgdW5kZXJzdG9vZCBhcyBhIG5vcm1hbCB0Ym9keQ0KDQoJCQkJCWN1cnJlbnRSb3dH
cm91cEVsZW1lbnQgPSB0aGlzOw0KCQkJCQlpbml0aWF0ZVJvd0dyb3VwKCk7DQoNCgkJCQkJJHRo
aXMuZGF0YSgpLnRibHBhcnNlciA9IGN1cnJlbnRSb3dHcm91cDsNCg0KCQkJCQkvKg0KCQkJCQkq
DQoJCQkJCSoNCgkJCQkJKg0KCQkJCQkqIEZpcnN0IHRib2R5ID0gZGF0YQ0KCQkJCQkqIEFsbCB0
Ym9keSB3aXRoIGhlYWRlciA9PT0gZGF0YQ0KCQkJCQkqIFN1YnNlcXVlbnQgdGJvZHkgd2l0aG91
dCBoZWFkZXIgPT09IHN1bW1hcnkNCgkJCQkJKiANCgkJCQkJKi8NCgkJCQkJLy8gJHRoaXMuZGF0
YSgidGJscGFyc2VyIiwgY3VycmVudFJvd0hlYWRlcik7DQoNCgkJCQkJLy8gTmV3IHJvdyBncm91
cAkJCQkJDQoJCQkJCSR0aGlzLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoKSB7DQoJCQkJCQlp
ZiAodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndHInKSB7DQoJCQkJCQkJLy8gRVJS
T1INCgkJCQkJCQllcnJvclRyaWdnZXIoMjgsICd0Ym9keSBlbGVtZW50IG5lZWQgdG8gb25seSBo
YXZlIHRyIGVsZW1lbnQgYXMgaGlzIGNoaWxkJywgdGhpcyk7DQoJCQkJCQkJcmV0dXJuOw0KCQkJ
CQkJfQ0KCQkJCQkJcHJvY2Vzc1Jvdyh0aGlzKTsNCgkJCQkJfSk7DQoNCgkJCQkJZmluYWxpemVS
b3dHcm91cCgpOw0KCQkJCQkNCgkJCQkJLy8gQ2hlY2sgZm9yIHJlc2lkdWFsIHJvd3NwYW4sIHRo
ZXJlIGNhbiBub3QgaGF2ZSBjZWxsIHRoYXQgb3ZlcmZsb3cgb24gdHdvIG9yIG1vcmUgcm93Z3Jv
dXANCgkJCQkJJC5lYWNoKHNwYW5uZWRSb3csIGZ1bmN0aW9uICgpIHsNCgkJCQkJCWlmICh0aGlz
LnNwYW5IZWlnaHQgPiAwKSB7DQoJCQkJCQkJLy8gVGhhdCByb3cgYXJlIHNwYW5uZWQgaW4gMiBk
aWZmZXJlbnQgcm93IGdyb3VwDQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDI5LCAnWW91IGNhbiBub3Qg
c3BhbiBjZWxsIGluIDIgZGlmZmVyZW50IHJvd2dyb3VwJywgdGhpcyk7DQoJCQkJCQl9DQoJCQkJ
CX0pOw0KDQoJCQkJCXNwYW5uZWRSb3cgPSBbXTsgLy8gQ2xlYW51cCBvZiBhbnkgc3Bhbm5lZCBy
b3cNCgkJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFjayA9IFtdOyAvLyBSZW1vdmUgYW55IHJvd2dy
b3VwIGhlYWRlciBmb3VuZC4NCgkJCQkJY3VycmVudFJvd0hlYWRlciA9IFtdOw0KDQoJCQkJCWN1
cnJlbnRUYm9keUlEICs9IDE7DQoJCQkJCWJyZWFrOw0KCQkJCQkvLyBjYXNlICd0Zm9vdCc6DQoJ
CQkJCS8vY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHRoaXM7DQoNCgkJCQkJLy8gVGhlIHJvd3Bv
cyBhcmUgbm90IGluY3JlbWVudGVkIGhlcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3VtbWFyeSByb3dn
cm91cCBmb3IgdGhlIEdyb3VwWmVybw0KDQoJCQkJCS8vIFF1ZXN0aW9uOiBTdGFjayBhbnkgcm93
IGFuZCBwcm9jZXNzZWQgdGhlbSBhdCB0aGUgcmVhbGx5IGVuZCA/IERvIHdlIGFsbG93IHRmb290
IHRvIGJlIHVzZWQgYXMgYSBmb290bm90ZSBmb3IgdGhlIHRhYnVsYXIgZGF0YSA/DQoJCQkJCS8v
IGJyZWFrOw0KCQkJCWNhc2UgJ3RyJzoNCgkJCQkJLy8gVGhpcyBhcmUgc3VwcG9zZSB0byBiZSBh
IHNpbXBsZSB0YWJsZQ0KCQkJCQlwcm9jZXNzUm93KHRoaXMpOw0KCQkJCQlicmVhazsNCgkJCQlk
ZWZhdWx0Og0KCQkJCQkvLyBUaGVyZSBpcyBhIERPTSBTdHJ1Y3R1cmUgZXJyb3INCgkJCQkJZXJy
b3JUcmlnZ2VyKDMwLCAnVXNlIHRoZSBhcHByb3ByaWF0ZSB0YWJsZSBtYXJrdXAnLCB0aGlzKTsN
CgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWdyb3VwWmVyby50aGVhZFJvd1N0YWNr
ID0gdGhlYWRSb3dTdGFjazsNCg0KCQkJZGVsZXRlIGdyb3VwWmVyby5jb2xncm91cEZyYW1lOw0K
CQkJZ3JvdXBaZXJvLmNvbGdyb3VwbGV2ZWwgPSBncm91cFplcm8uY29sZ3JwOw0KCQkJZGVsZXRl
IGdyb3VwWmVyby5jb2xncnA7DQoJCX0gLy8gZW5kIG9mIGV4ZWMNCgl9Ow0KCXdpbmRvdy5wZSA9
IF9wZTsNCglyZXR1cm4gX3BlOw0KfShqUXVlcnkpKTsNCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>