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

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

    <bug>
          <bug_id>141951</bug_id>
          
          <creation_ts>2015-02-23 21:10:54 -0800</creation_ts>
          <short_desc>Our bizarre behavior on Arguments::defineOwnProperty should be deliberate rather than a spaghetti incident</short_desc>
          <delta_ts>2015-02-24 09:14:31 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>141952</blocked>
    
    <blocked>141174</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenb</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>nrotem</cc>
    
    <cc>oliver</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1071526</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:10:54 -0800</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071530</commentid>
    <comment_count>1</comment_count>
      <attachid>247199</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:19:14 -0800</bug_when>
    <thetext>Created attachment 247199
WRONG PATCH</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071531</commentid>
    <comment_count>2</comment_count>
      <attachid>247200</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:19:54 -0800</bug_when>
    <thetext>Created attachment 247200
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071532</commentid>
    <comment_count>3</comment_count>
      <attachid>247200</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:23:04 -0800</bug_when>
    <thetext>Comment on attachment 247200
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=247200&amp;action=review

&gt; Source/JavaScriptCore/runtime/Arguments.cpp:308
&gt; +                // ignore the request to change enumerability. We appear to have always do so, in

&quot;*We appear to have always done [sic] so&quot;

I changed this locally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071533</commentid>
    <comment_count>4</comment_count>
      <attachid>247200</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:26:52 -0800</bug_when>
    <thetext>Comment on attachment 247200
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=247200&amp;action=review

&gt; Source/JavaScriptCore/tests/stress/arguments-bizarre-behaviour-disable-enumerability.js:25
&gt; +function foo(x) {
&gt; +    Object.defineProperty(arguments, 0, {configurable: true, enumerable: true, writable:true, value:42});
&gt; +    return [x, arguments[0], arguments]
&gt; +}
&gt; +
&gt; +var result = foo(1);
&gt; +
&gt; +if (result[0] !== 42)
&gt; +    throw new Error();
&gt; +
&gt; +if (result[1] !== 42)
&gt; +    throw new Error();
&gt; +
&gt; +if (Array.prototype.join.call(result[2], &quot;,&quot;) != &quot;42&quot;)
&gt; +    throw new Error();
&gt; +
&gt; +var array = [];
&gt; +for (var s in result[2])
&gt; +    array.push(s);
&gt; +
&gt; +if (array.join(&quot;,&quot;) != &quot;0&quot;)
&gt; +    throw new Error();
&gt; +
&gt; +if (Object.keys(result[2]).join(&quot;,&quot;) != &quot;0&quot;)
&gt; +    throw new Error();

This was meant to be a different test, that sets enumerable to false.  I messed up when copying files around...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071534</commentid>
    <comment_count>5</comment_count>
      <attachid>247201</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-23 21:27:36 -0800</bug_when>
    <thetext>Created attachment 247201
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071536</commentid>
    <comment_count>6</comment_count>
      <attachid>247201</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-02-23 21:42:11 -0800</bug_when>
    <thetext>Comment on attachment 247201
the patch

ok</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1071686</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-02-24 09:14:31 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/180564</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247199</attachid>
            <date>2015-02-23 21:19:14 -0800</date>
            <delta_ts>2015-02-23 21:19:38 -0800</delta_ts>
            <desc>WRONG PATCH</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>105126</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0
b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIv
Qnl0ZWNvZGVHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAxODA1MjkpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTE2LDcgKzExNiw3IEBAIFBhcnNlckVycm9yIEJ5dGVjb2RlR2VuZXJhdG9yOjpnZW5l
cmF0ZSgKICAgICBtX2NvZGVCbG9jay0+c2hyaW5rVG9GaXQoKTsKIAogICAgIGlmIChtX2NvZGVC
bG9jay0+c3ltYm9sVGFibGUoKSAmJiAhbV9jb2RlQmxvY2stPnZtKCktPnR5cGVQcm9maWxlcigp
KQotICAgICAgICBtX2NvZGVCbG9jay0+c2V0U3ltYm9sVGFibGUobV9jb2RlQmxvY2stPnN5bWJv
bFRhYmxlKCktPmNsb25lQ2FwdHVyZWROYW1lcygqbV9jb2RlQmxvY2stPnZtKCkpKTsKKyAgICAg
ICAgbV9jb2RlQmxvY2stPnNldFN5bWJvbFRhYmxlKG1fY29kZUJsb2NrLT5zeW1ib2xUYWJsZSgp
LT5jbG9uZUlnbm9yaW5nU3RhY2soKm1fY29kZUJsb2NrLT52bSgpKSk7CiAKICAgICBpZiAobV9l
eHByZXNzaW9uVG9vRGVlcCkKICAgICAgICAgcmV0dXJuIFBhcnNlckVycm9yKFBhcnNlckVycm9y
OjpPdXRPZk1lbW9yeSk7CkBAIC0xMjQsMTcgKzEyNCwyOCBAQCBQYXJzZXJFcnJvciBCeXRlY29k
ZUdlbmVyYXRvcjo6Z2VuZXJhdGUoCiB9CiAKIGJvb2wgQnl0ZWNvZGVHZW5lcmF0b3I6OmFkZFZh
cigKLSAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudCwgQ29uc3RhbnRNb2RlIGNvbnN0YW50TW9k
ZSwgV2F0Y2hNb2RlIHdhdGNoTW9kZSwgUmVnaXN0ZXJJRComIHIwKQorICAgIGNvbnN0IElkZW50
aWZpZXImIGlkZW50LCBDb25zdGFudE1vZGUgY29uc3RhbnRNb2RlLCBWYXJLaW5kIHZhcktpbmQs
IFdhdGNoTW9kZSB3YXRjaE1vZGUsCisgICAgUmVnaXN0ZXJJRComIHIwKQogewogICAgIEFTU0VS
VChzdGF0aWNfY2FzdDxzaXplX3Q+KG1fY29kZUJsb2NrLT5tX251bVZhcnMpID09IG1fY2FsbGVl
UmVnaXN0ZXJzLnNpemUoKSk7CiAgICAgCiAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIo
c3ltYm9sVGFibGUoKS5tX2xvY2spOwotICAgIGludCBpbmRleCA9IHZpcnR1YWxSZWdpc3RlckZv
ckxvY2FsKG1fY2FsbGVlUmVnaXN0ZXJzLnNpemUoKSkub2Zmc2V0KCk7Ci0gICAgU3ltYm9sVGFi
bGVFbnRyeSBuZXdFbnRyeShpbmRleCwgY29uc3RhbnRNb2RlID09IElzQ29uc3RhbnQgPyBSZWFk
T25seSA6IDApOworICAgIFZhck9mZnNldCB2YXJPZmZzZXQ7CisgICAgaWYgKHZhcktpbmQgPT0g
SGVhcFZhcktpbmQpCisgICAgICAgIHZhck9mZnNldCA9IFZhck9mZnNldChIZWFwT2Zmc2V0KG1f
bnVtQ2FwdHVyZWRWYXJpYWJsZXMrKykpOworICAgIGVsc2UgeworICAgICAgICBBU1NFUlQodmFy
S2luZCA9PSBTdGFja1ZhcktpbmQpOworICAgICAgICB2YXJPZmZzZXQgPSBWYXJPZmZzZXQodmly
dHVhbFJlZ2lzdGVyRm9yTG9jYWwobV9jYWxsZWVSZWdpc3RlcnMuc2l6ZSgpKSk7CisgICAgfQor
ICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3RW50cnkodmFyT2Zmc2V0LCBjb25zdGFudE1vZGUgPT0g
SXNDb25zdGFudCA/IFJlYWRPbmx5IDogMCk7CiAgICAgU3ltYm9sVGFibGU6Ok1hcDo6QWRkUmVz
dWx0IHJlc3VsdCA9IHN5bWJvbFRhYmxlKCkuYWRkKGxvY2tlciwgaWRlbnQuaW1wbCgpLCBuZXdF
bnRyeSk7CiAKICAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KSB7Ci0gICAgICAgIHIwID0gJnJl
Z2lzdGVyRm9yKHJlc3VsdC5pdGVyYXRvci0+dmFsdWUuZ2V0SW5kZXgoKSk7CisgICAgICAgIFJF
TEVBU0VfQVNTRVJUKHZhcktpbmQgPT0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS52YXJPZmZzZXQo
KS5raW5kKCkpOworICAgICAgICBpZiAodmFyS2luZCA9PSBIZWFwVmFyS2luZCkKKyAgICAgICAg
ICAgIHIwID0gbnVsbHB0cjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcjAgPSAmcmVnaXN0
ZXJGb3IocmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS52YXJPZmZzZXQoKSk7CiAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICB9CiAgICAgCkBAIC0xNDQsNyArMTU1LDEwIEBAIGJvb2wgQnl0ZWNvZGVH
ZW5lcmF0b3I6OmFkZFZhcigKICAgICAgICAgbV93YXRjaGFibGVWYXJpYWJsZXMuYXBwZW5kKGlk
ZW50KTsKICAgICB9CiAgICAgCi0gICAgcjAgPSBhZGRWYXIoKTsKKyAgICBpZiAodmFyS2luZCA9
PSBIZWFwVmFyS2luZCkKKyAgICAgICAgcjAgPSBudWxscHRyOworICAgIGVsc2UKKyAgICAgICAg
cjAgPSBhZGRWYXIoKTsKICAgICAKICAgICBBU1NFUlQod2F0Y2hNb2RlID09IE5vdFdhdGNoYWJs
ZSB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fY29kZUJsb2NrLT5tX251bVZhcnMpID09IG1fd2F0
Y2hhYmxlVmFyaWFibGVzLnNpemUoKSk7CiAgICAgCkBAIC0yMzEsNyArMjQ1LDYgQEAgQnl0ZWNv
ZGVHZW5lcmF0b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgogICAgIH0KICAgICBSZWdpc3RlcklE
KiBsb2NhbEFyZ3VtZW50c1JlZ2lzdGVyID0gbnVsbHB0cjsKICAgICBSZWdpc3RlcklEKiBzY3Jh
dGNoID0gYWRkVmFyKCk7Ci0gICAgbV9zeW1ib2xUYWJsZS0+c2V0Q2FwdHVyZVN0YXJ0KHZpcnR1
YWxSZWdpc3RlckZvckxvY2FsKG1fY29kZUJsb2NrLT5tX251bVZhcnMpLm9mZnNldCgpKTsKIAog
ICAgIGlmIChmdW5jdGlvbk5vZGUtPnVzZXNBcmd1bWVudHMoKSB8fCBjb2RlQmxvY2stPnVzZXNF
dmFsKCkpIHsgLy8gTWF5IHJlaWZ5IGFyZ3VtZW50cyBvYmplY3QuCiAgICAgICAgIFJlZ2lzdGVy
SUQqIHVubW9kaWZpZWRBcmd1bWVudHNSZWdpc3RlciA9IGFkZFZhcigpOyAvLyBBbm9ueW1vdXMs
IHNvIGl0IGNhbid0IGJlIG1vZGlmaWVkIGJ5IHVzZXIgY29kZS4KSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJ
KHJldmlzaW9uIDE4MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIv
Qnl0ZWNvZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNjEzLDE1ICs2MTMsMTUgQEAg
bmFtZXNwYWNlIEpTQyB7CiAKICAgICAgICAgLy8gQWRkcyBhIHZhciBzbG90IGFuZCBtYXBzIGl0
IHRvIHRoZSBuYW1lIGlkZW50IGluIHN5bWJvbFRhYmxlKCkuCiAgICAgICAgIGVudW0gV2F0Y2hN
b2RlIHsgSXNXYXRjaGFibGUsIE5vdFdhdGNoYWJsZSB9OwotICAgICAgICBSZWdpc3RlcklEKiBh
ZGRWYXIoY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIENvbnN0YW50TW9kZSBjb25zdGFudE1vZGUs
IFdhdGNoTW9kZSB3YXRjaE1vZGUpCisgICAgICAgIFJlZ2lzdGVySUQqIGFkZFZhcihjb25zdCBJ
ZGVudGlmaWVyJiBpZGVudCwgQ29uc3RhbnRNb2RlIGNvbnN0YW50TW9kZSwgVmFyS2luZCB2YXJL
aW5kLCBXYXRjaE1vZGUgd2F0Y2hNb2RlKQogICAgICAgICB7CiAgICAgICAgICAgICBSZWdpc3Rl
cklEKiBsb2NhbDsKLSAgICAgICAgICAgIGFkZFZhcihpZGVudCwgY29uc3RhbnRNb2RlLCB3YXRj
aE1vZGUsIGxvY2FsKTsKKyAgICAgICAgICAgIGFkZFZhcihpZGVudCwgY29uc3RhbnRNb2RlLCB2
YXJLaW5kLCB3YXRjaE1vZGUsIGxvY2FsKTsKICAgICAgICAgICAgIHJldHVybiBsb2NhbDsKICAg
ICAgICAgfQogCiAgICAgICAgIC8vIERpdHRvLiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgUmVnaXN0
ZXJJRCB3YXMgYWRkZWQsIGZhbHNlIGlmIGEgcHJlLWV4aXN0aW5nIFJlZ2lzdGVySUQgd2FzIHJl
LXVzZWQuCi0gICAgICAgIGJvb2wgYWRkVmFyKGNvbnN0IElkZW50aWZpZXImLCBDb25zdGFudE1v
ZGUsIFdhdGNoTW9kZSwgUmVnaXN0ZXJJRComKTsKKyAgICAgICAgYm9vbCBhZGRWYXIoY29uc3Qg
SWRlbnRpZmllciYsIENvbnN0YW50TW9kZSwgVmFyS2luZCwgV2F0Y2hNb2RlLCBSZWdpc3RlcklE
KiYpOwogICAgICAgICAKICAgICAgICAgLy8gQWRkcyBhbiBhbm9ueW1vdXMgdmFyIHNsb3QuIFRv
IGdpdmUgdGhpcyBzbG90IGEgbmFtZSwgYWRkIGl0IHRvIHN5bWJvbFRhYmxlKCkuCiAgICAgICAg
IFJlZ2lzdGVySUQqIGFkZFZhcigpCkBAIC03NzQsNiArNzc0LDcgQEAgbmFtZXNwYWNlIEpTQyB7
CiAgICAgICAgIFZlY3RvcjxJZGVudGlmaWVyLCAxNj4gbV93YXRjaGFibGVWYXJpYWJsZXM7CiAg
ICAgICAgIFNlZ21lbnRlZFZlY3RvcjxSZWdpc3RlcklELCAzMj4gbV9jb25zdGFudFBvb2xSZWdp
c3RlcnM7CiAgICAgICAgIFNlZ21lbnRlZFZlY3RvcjxSZWdpc3RlcklELCAzMj4gbV9jYWxsZWVS
ZWdpc3RlcnM7CisgICAgICAgIHVuc2lnbmVkIG1fbnVtQ2FwdHVyZWRWYXJpYWJsZXM7CiAgICAg
ICAgIFNlZ21lbnRlZFZlY3RvcjxSZWdpc3RlcklELCAzMj4gbV9wYXJhbWV0ZXJzOwogICAgICAg
ICBTZWdtZW50ZWRWZWN0b3I8TGFiZWwsIDMyPiBtX2xhYmVsczsKICAgICAgICAgTGFiZWxTY29w
ZVN0b3JlIG1fbGFiZWxTY29wZXM7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9D
b3B5VG9rZW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Db3B5
VG9rZW4uaAkocmV2aXNpb24gMTgwNTI5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAv
Q29weVRva2VuLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJp
Z2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMywgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMyLDcgKzMyLDcgQEAgZW51bSBDb3B5VG9rZW4g
ewogICAgIEJ1dHRlcmZseUNvcHlUb2tlbiwKICAgICBUeXBlZEFycmF5VmVjdG9yQ29weVRva2Vu
LAogICAgIE1hcEJhY2tpbmdTdG9yZUNvcHlUb2tlbiwKLSAgICBBcmd1bWVudHNTbG93QXJndW1l
bnREYXRhQ29weVRva2VuCisgICAgRGlyZWN0QXJndW1lbnRzT3ZlcnJpZGVzQ29weVRva2VuCiB9
OwogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0FyZ3VtZW50c01vZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9Bcmd1bWVudHNNb2RlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9Bcmd1bWVudHNNb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwz
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIEFyZ3VtZW50c01vZGVfaAorI2RlZmluZSBBcmd1bWVudHNNb2RlX2gKKworbmFtZXNwYWNl
IEpTQyB7CisKK2VudW0gQXJndW1lbnRzTW9kZSB7CisgICAgQ2xvbmVkQXJndW1lbnRzQ3JlYXRp
b25Nb2RlLAorICAgIEZha2VBcmd1bWVudFZhbHVlc0NyZWF0aW9uTW9kZQorfTsKKworfSAvLyBu
YW1lc3BhY2UgSlNDCisKKyNlbmRpZiAvLyBBcmd1bWVudHNNb2RlX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ2FwdHVyZWRBcmd1bWVudHNPZmZzZXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NhcHR1cmVkQXJndW1lbnRz
T2Zmc2V0LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0NhcHR1cmVkQXJndW1lbnRzT2Zmc2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDYXB0dXJlZEFyZ3VtZW50c09mZnNldC5oIgorCitu
YW1lc3BhY2UgSlNDIHsKKwordm9pZCBDYXB0dXJlZEFyZ3VtZW50c09mZnNldDo6ZHVtcChQcmlu
dFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmICghKnRoaXMpIHsKKyAgICAgICAgb3V0LnBy
aW50KCJjYXB0dXJlZEFyZ3VtZW50SW52YWxpZCIpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgb3V0LnByaW50KCJjYXB0dXJlZEFyZ3VtZW50Iiwgb2Zmc2V0KCkpOworfQorCit9IC8v
IG5hbWVzcGFjZSBKU0MKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ2Fw
dHVyZWRBcmd1bWVudHNPZmZzZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9DYXB0dXJlZEFyZ3VtZW50c09mZnNldC5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ2FwdHVyZWRBcmd1bWVudHNPZmZzZXQuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgQ2FwdHVyZWRBcmd1bWVudHNPZmZzZXRfaAorI2Rl
ZmluZSBDYXB0dXJlZEFyZ3VtZW50c09mZnNldF9oCisKKyNpbmNsdWRlICJHZW5lcmljT2Zmc2V0
LmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0MgeworCisv
LyBUaGlzIGlzIGFuIG9mZnNldCBpbnRvIHRoZSBzcGVjaWFsIGFyZ3VtZW50cyBvYmplY3QsIHdo
aWNoIGNhcHR1cmVzIHRoZSBhcmd1bWVudHMgdG8gYQorLy8gZnVuY3Rpb24uIEl0IG9ubHkgY29t
ZXMgaW50byBwbGF5IGl0IHRoZSBhcmd1bWVudHMgYXJlbid0IGFsc28gbGlmdGVkIGludG8gdGhl
IGFjdGl2YXRpb24uCisvLyBJZiB0aGV5IHdlcmUgdGhlbiBhY2Nlc3NlcyB0byB0aGUgYXJndW1l
bnRzIHdvdWxkIHJlc29sdmUgdG8gYSBTY29wZU9mZnNldCBhbmQgbm90IGEKKy8vIENhcHR1cmVk
QXJndW1lbnRzT2Zmc2V0LgorY2xhc3MgQ2FwdHVyZWRBcmd1bWVudHNPZmZzZXQgOiBwdWJsaWMg
R2VuZXJpY09mZnNldDxDYXB0dXJlZEFyZ3VtZW50c09mZnNldD4geworcHVibGljOgorICAgIENh
cHR1cmVkQXJndW1lbnRzT2Zmc2V0KCkgeyB9CisgICAgCisgICAgZXhwbGljaXQgQ2FwdHVyZWRB
cmd1bWVudHNPZmZzZXQodW5zaWduZWQgb2Zmc2V0KQorICAgICAgICA6IEdlbmVyaWNPZmZzZXQo
b2Zmc2V0KQorICAgIHsKKyAgICB9CisgICAgCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBKU0MKKworI2VuZGlmIC8vIENhcHR1cmVkQXJn
dW1lbnRzT2Zmc2V0X2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRGly
ZWN0QXJndW1lbnRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9EaXJlY3RBcmd1bWVudHMuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvRGlyZWN0QXJndW1lbnRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGlyZWN0QXJndW1lbnRzLmgiCisKKyNp
bmNsdWRlICJKU0FyZ3VtZW50c0l0ZXJhdG9yLmgiCisjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgor
CituYW1lc3BhY2UgSlNDIHsKKworU1RBVElDX0FTU0VSVF9JU19UUklWSUFMTFlfREVTVFJVQ1RJ
QkxFKERpcmVjdEFyZ3VtZW50cyk7CisKK2NvbnN0IENsYXNzSW5mbyBEaXJlY3RBcmd1bWVudHM6
OnNfaW5mbyA9IHsgIkFyZ3VtZW50cyIsICZCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0Rf
VEFCTEUoRGlyZWN0QXJndW1lbnRzKSB9OworCitEaXJlY3RBcmd1bWVudHM6OkRpcmVjdEFyZ3Vt
ZW50cyhWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCB1bnNpZ25lZCBsZW5ndGgpCisgICAg
OiBCYXNlKHZtLCBzdHJ1Y3R1cmUpCisgICAgLCBtX2xlbmd0aChsZW5ndGgpCit7Cit9CisKK0Rp
cmVjdEFyZ3VtZW50cyogRGlyZWN0QXJndW1lbnRzOjpjcmVhdGVVbmluaXRpYWxpemVkKFZNJiB2
bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBEaXJlY3RB
cmd1bWVudHMqIHJlc3VsdCA9CisgICAgICAgIG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPERp
cmVjdEFyZ3VtZW50cz4odm0uaGVhcCwgYWxsb2NhdGlvblNpemUobGVuZ3RoKSkpCisgICAgICAg
ICh2bSwgc3RydWN0dXJlKTsKKyAgICByZXN1bHQtPmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCitEaXJlY3RBcmd1bWVudHMqIERpcmVjdEFyZ3VtZW50czo6Y3Jl
YXRlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAg
ICBEaXJlY3RBcmd1bWVudHMqIHJlc3VsdCA9IGNyZWF0ZVVuaW5pdGlhbGl6ZWQodm0sIHN0cnVj
dHVyZSwgbGVuZ3RoKTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBsZW5ndGg7IGktLTsp
CisgICAgICAgIHJlc3VsdC0+c3RvcmFnZSgpW2ldLmNsZWFyKCk7CisgICAgCisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworRGlyZWN0QXJndW1lbnRzKiBEaXJlY3RBcmd1bWVudHM6OmNyZWF0ZUJ5
Q29weWluZyhWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBFeGVjU3RhdGUqIGV4ZWMpCit7
CisgICAgdW5zaWduZWQgbGVuZ3RoID0gZXhlYy0+YXJndW1lbnRDb3VudCgpOworICAgIERpcmVj
dEFyZ3VtZW50cyogcmVzdWx0ID0gY3JlYXRlVW5pbml0aWFsaXplZCh2bSwgc3RydWN0dXJlLCBs
ZW5ndGgpOworICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IGxlbmd0aDsgaS0tOykKKyAgICAg
ICAgcmVzdWx0LT5zdG9yYWdlKClbaV0uc2V0KHZtLCByZXN1bHQsIGV4ZWMtPnVuY2hlY2tlZEFy
Z3VtZW50KGkpKTsKKyAgICAKKyAgICByZXN1bHQtPmNhbGxlZSgpLnNldCh2bSwgcmVzdWx0LCBq
c0Nhc3Q8SlNGdW5jdGlvbio+KGV4ZWMtPmNhbGxlZSgpKSk7CisgICAgCisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKwordm9pZCBEaXJlY3RBcmd1bWVudHM6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiB0
aGlzQ2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0
aGlzT2JqZWN0ID0gc3RhdGljX2Nhc3Q8RGlyZWN0QXJndW1lbnRzKj4odGhpc0NlbGwpOworICAg
IEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBCYXNl
Ojp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIAorICAgIHZpc2l0b3Iu
YXBwZW5kVmFsdWVzKHRoaXNPYmplY3QtPnN0b3JhZ2UoKSwgdGhpc09iamVjdC0+bV9sZW5ndGgp
OworfQorCitTdHJ1Y3R1cmUqIERpcmVjdEFyZ3VtZW50czo6Y3JlYXRlU3RydWN0dXJlKFZNJiB2
bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90b3R5cGUpCit7Cisg
ICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwg
VHlwZUluZm8oRGlyZWN0QXJndW1lbnRzVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwor
fQorCitib29sIERpcmVjdEFyZ3VtZW50czo6Z2V0T3duUHJvcGVydHlTbG90KEpTT2JqZWN0KiBv
YmplY3QsIEV4ZWNTdGF0ZSogZXhlYywgUHJvcGVydHlOYW1lIGlkZW50LCBQcm9wZXJ0eVNsb3Qm
IHNsb3QpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0aGlzT2JqZWN0ID0ganNDYXN0PERpcmVj
dEFyZ3VtZW50cyo+KG9iamVjdCk7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICAKKyAg
ICBpZiAoIXRoaXNPYmplY3QtPm1fb3ZlcnJpZGVzKSB7CisgICAgICAgIGlmIChpZGVudCA9PSB2
bS5wcm9wZXJ0eU5hbWVzLT5sZW5ndGgpIHsKKyAgICAgICAgICAgIHNsb3Quc2V0VmFsdWUodGhp
c09iamVjdCwgRG9udEVudW0sIGpzTnVtYmVyKHRoaXNPYmplY3QtPm1fbGVuZ3RoKSk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSB2bS5wcm9w
ZXJ0eU5hbWVzLT5jYWxsZWUpIHsKKyAgICAgICAgICAgIGlmICghdGhpc09iamVjdC0+aXNTdHJp
Y3RNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBzbG90LnNldFZhbHVlKHRoaXNPYmplY3QsIERv
bnRFbnVtLCB0aGlzT2JqZWN0LT5jYWxsZWUoKS5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzT2JqZWN0LT5zbG93RG93
bkFuZFdhc3RlTWVtb3J5KHZtKTsKKyAgICAgICAgfSBlbHNlIGlmIChpZGVudCA9PSB2bS5wcm9w
ZXJ0eU5hbWVzLT5jYWxsZXIpCisgICAgICAgICAgICB0aGlzT2JqZWN0LT5zbG93RG93bkFuZFdh
c3RlTWVtb3J5KHZtKTsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgaW5kZXggPSBpZGVudC5h
c0luZGV4KCk7CisgICAgaWYgKHRoaXNPYmplY3QtPmNhbkFjY2Vzc0luZGV4UXVpY2tseShpbmRl
eCkpIHsKKyAgICAgICAgc2xvdC5zZXRWYWx1ZSh0aGlzT2JqZWN0LCBOb25lLCB0aGlzT2JqZWN0
LT5nZXRJbmRleFF1aWNrbHkoaW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIGlmIChCYXNlOjpnZXRPd25Qcm9wZXJ0eVNsb3QodGhpc09iamVjdCwgZXhlYywg
aWRlbnQsIHNsb3QpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBpZiAoaWRlbnQg
PT0gdm0ucHJvcGVydHlOYW1lcy0+aXRlcmF0b3JQcml2YXRlTmFtZSkgeworICAgICAgICBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwor
ICAgICAgICB0aGlzT2JqZWN0LT5KU0NfTkFUSVZFX0ZVTkNUSU9OKHZtLnByb3BlcnR5TmFtZXMt
Pml0ZXJhdG9yUHJpdmF0ZU5hbWUsIGFyZ3VtZW50c0Z1bmNJdGVyYXRvciwgRG9udEVudW0sIDAp
OworICAgICAgICBpZiAoSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdCh0aGlzT2JqZWN0LCBl
eGVjLCBpZGVudCwgc2xvdCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERpcmVjdEFyZ3VtZW50czo6Z2V0T3duUHJv
cGVydHlTbG90QnlJbmRleChKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIHVuc2ln
bmVkIGluZGV4LCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0
aGlzT2JqZWN0ID0ganNDYXN0PERpcmVjdEFyZ3VtZW50cyo+KG9iamVjdCk7CisgICAgCisgICAg
aWYgKHRoaXNPYmplY3QtPmNhbkFjY2Vzc0luZGV4UXVpY2tseShpbmRleCkpIHsKKyAgICAgICAg
c2xvdC5zZXRWYWx1ZSh0aGlzT2JqZWN0LCBOb25lLCB0aGlzT2JqZWN0LT5nZXRJbmRleFF1aWNr
bHkoaW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVy
biBCYXNlOjpnZXRPd25Qcm9wZXJ0eVNsb3RCeUluZGV4KG9iamVjdCwgZXhlYywgaW5kZXgsIHNs
b3QpOworfQorCit2b2lkIERpcmVjdEFyZ3VtZW50czo6Z2V0T3duUHJvcGVydHlOYW1lcyhKU09i
amVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZUFycmF5JiBhcnJheSwg
RW51bWVyYXRpb25Nb2RlIG1vZGUpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0aGlzT2JqZWN0
ID0ganNDYXN0PERpcmVjdEFyZ3VtZW50cyo+KG9iamVjdCk7CisgICAgCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHRoaXNPYmplY3QtPm1fbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaWYg
KCF0aGlzT2JqZWN0LT5jYW5BY2Nlc3NJbmRleFF1aWNrbHkoaW5kZXgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGFycmF5LmFkZChJZGVudGlmaWVyOjpmcm9tKGV4ZWMsIGkpKTsK
KyAgICB9CisgICAgaWYgKHNob3VsZEluY2x1ZGVEb250RW51bVByb3BlcnRpZXMobW9kZSkgJiYg
IW1fb3ZlcnJpZGVzKSB7CisgICAgICAgIGFycmF5LmFkZChleGVjLT5wcm9wZXJ0eU5hbWVzKCku
Y2FsbGVlKTsKKyAgICAgICAgYXJyYXkuYWRkKGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5sZW5ndGgp
OworICAgIH0KKyAgICBCYXNlOjpnZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXNPYmplY3QsIGV4ZWMs
IGFycmF5LCBtb2RlKTsKK30KKwordm9pZCBEaXJlY3RBcmd1bWVudHM6OnB1dChKU0NlbGwqIGNl
bGwsIEV4ZWNTdGF0ZSogZXhlYywgUHJvcGVydHlOYW1lIGlkZW50LCBKU1ZhbHVlIHZhbHVlLCBQ
dXRQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0aGlzT2JqZWN0
ID0ganNDYXN0PERpcmVjdEFyZ3VtZW50cyo+KG9iamVjdCk7CisgICAgVk0mIHZtID0gZXhlYy0+
dm0oKTsKKyAgICAKKyAgICBpZiAoIXRoaXNPYmplY3QtPm1fb3ZlcnJpZGVzCisgICAgICAgICYm
IChpZGVudCA9PSB2bS5wcm9wZXJ0eU5hbWVzLT5sZW5ndGgKKyAgICAgICAgICAgIHx8IGlkZW50
ID09IHZtLnByb3BlcnR5TmFtZXMtPmNhbGxlZQorICAgICAgICAgICAgfHwgaWRlbnQgPT0gdm0u
cHJvcGVydHlOYW1lcy0+Y2FsbGVyKSkKKyAgICAgICAgdGhpc09iamVjdC0+c2xvd0Rvd25BbmRX
YXN0ZU1lbW9yeSh2bSk7CisgICAgCisgICAgdW5zaWduZWQgaW5kZXggPSBpZGVudC5hc0luZGV4
KCk7CisgICAgaWYgKHRoaXNPYmplY3QtPmNhbkFjY2Vzc0luZGV4UXVpY2tseShpbmRleCkpIHsK
KyAgICAgICAgc2V0SW5kZXhRdWlja2x5KHZtLCBpbmRleCwgdmFsdWUpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIAorICAgIEJhc2U6OnB1dCh0aGlzT2JqZWN0LCBleGVjLCBpZGVudCwg
dmFsdWUsIHNsb3QpOworfQorCit2b2lkIERpcmVjdEFyZ3VtZW50czo6cHV0QnlJbmRleChKU0Nl
bGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgaW5kZXgsIEpTVmFsdWUgdmFsdWUs
IGJvb2wgc2hvdWxkVGhyb3cpCit7CisgICAgRGlyZWN0QXJndW1lbnRzKiB0aGlzT2JqZWN0ID0g
anNDYXN0PERpcmVjdEFyZ3VtZW50cyo+KG9iamVjdCk7CisgICAgVk0mIHZtID0gZXhlYy0+dm0o
KTsKKyAgICAKKyAgICBpZiAodGhpc09iamVjdC0+Y2FuU2V0SW5kZXhRdWlja2x5KGluZGV4KSkg
eworICAgICAgICBzZXRJbmRleFF1aWNrbHkodm0sIGluZGV4LCB2YWx1ZSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEJhc2U6OnB1dEJ5SW5kZXgoY2VsbCwgZXhl
YywgaW5kZXgsIHZhbHVlLCBzaG91bGRUaHJvdyk7Cit9CisKK3ZvaWQgRGlyZWN0QXJndW1lbnRz
OjpkZWxldGVQcm9wZXJ0eShKU0NlbGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhlYywgUHJvcGVydHlO
YW1lIGlkZW50KQoreworICAgIERpcmVjdEFyZ3VtZW50cyogdGhpc09iamVjdCA9IGpzQ2FzdDxE
aXJlY3RBcmd1bWVudHMqPihvYmplY3QpOworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAg
CisgICAgaWYgKCF0aGlzT2JqZWN0LT5tX292ZXJyaWRlcworICAgICAgICAmJiAoaWRlbnQgPT0g
dm0ucHJvcGVydHlOYW1lcy0+bGVuZ3RoCisgICAgICAgICAgICB8fCBpZGVudCA9PSB2bS5wcm9w
ZXJ0eU5hbWVzLT5jYWxsZWUKKyAgICAgICAgICAgIHx8IGlkZW50ID09IHZtLnByb3BlcnR5TmFt
ZXMtPmNhbGxlcikpCisgICAgICAgIHRoaXNPYmplY3QtPnNsb3dEb3duQW5kV2FzdGVNZW1vcnko
dm0pOworICAgIAorICAgIHVuc2lnbmVkIGluZGV4ID0gaWRlbnQuYXNJbmRleCgpOworICAgIGlm
ICh0aGlzT2JqZWN0LT5jYW5BY2Nlc3NJbmRleFF1aWNrbHkoaW5kZXgpKSB7CisgICAgICAgIHRo
aXNPYmplY3QtPnNsb3dEb3duQW5kV2FzdGVNZW1vcnlJZk5lY2Vzc2FyeSh2bSk7CisgICAgICAg
IHRoaXNPYmplY3QtPm1fb3ZlcnJpZGVzLmdldCgpW2luZGV4XSA9IHRydWU7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgCisgICAgQmFzZTo6ZGVsZXRlUHJvcGVydHkodGhpc09iamVjdCwg
ZXhlYywgaWRlbnQpOworfQorCit2b2lkIERpcmVjdEFyZ3VtZW50czo6ZGVsZXRlUHJvcGVydHlC
eUluZGV4KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBpbmRleCkKK3sK
KyAgICBEaXJlY3RBcmd1bWVudHMqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8RGlyZWN0QXJndW1lbnRz
Kj4ob2JqZWN0KTsKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIAorICAgIGlmICh0aGlz
T2JqZWN0LT5jYW5BY2Nlc3NJbmRleFF1aWNrbHkoaW5kZXgpKSB7CisgICAgICAgIHRoaXNPYmpl
Y3QtPnNsb3dEb3duQW5kV2FzdGVNZW1vcnlJZk5lY2Vzc2FyeSh2bSk7CisgICAgICAgIHRoaXNP
YmplY3QtPm1fb3ZlcnJpZGVzLmdldCgpW2luZGV4XSA9IHRydWU7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgCisgICAgcmV0dXJuIEJhc2U6OmRlbGV0ZVByb3BlcnR5QnlJbmRleChjZWxs
LCBleGVjLCBpbmRleCk7Cit9CisKK3ZvaWQgRGlyZWN0QXJndW1lbnRzOjpkZWZpbmVPd25Qcm9w
ZXJ0eShKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBpZGVu
dCwgY29uc3QgUHJvcGVydHlEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBib29sIHNob3VsZFRocm93
KQoreworICAgIERpcmVjdEFyZ3VtZW50cyogdGhpc09iamVjdCA9IGpzQ2FzdDxEaXJlY3RBcmd1
bWVudHMqPihvYmplY3QpOworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgCisgICAgaWYg
KCF0aGlzT2JqZWN0LT5tX292ZXJyaWRlcworICAgICAgICAmJiAoaWRlbnQgPT0gdm0ucHJvcGVy
dHlOYW1lcy0+bGVuZ3RoCisgICAgICAgICAgICB8fCBpZGVudCA9PSB2bS5wcm9wZXJ0eU5hbWVz
LT5jYWxsZWUKKyAgICAgICAgICAgIHx8IGlkZW50ID09IHZtLnByb3BlcnR5TmFtZXMtPmNhbGxl
cikpCisgICAgICAgIHRoaXNPYmplY3QtPnNsb3dEb3duQW5kV2FzdGVNZW1vcnkodm0pOworICAg
IAorICAgIHVuc2lnbmVkIGluZGV4ID0gaWRlbnQuYXNJbmRleCgpOworICAgIGlmIChpbmRleCA8
IHRoaXNPYmplY3QtPm1fbGVuZ3RoKSB7CisgICAgICAgIC8vIElmIHRoaXMgcHJvcGVydHkgCisg
ICAgICAgIC8vIEZJWE1FOiB0aGlzIHdpbGwgYmUgYSBzdHJ1Z2dsZS4KKyAgICAgICAgaWYgKCF0
aGlzT2JqZWN0LT5jYW5BY2Nlc3NJbmRleFF1aWNrbHkoaW5kZXgpKQorICAgIH0KK30KKwordm9p
ZCBEaXJlY3RBcmd1bWVudHM6OnNsb3dEb3duQW5kV2FzdGVNZW1vcnkoVk0mIHZtKQoreworICAg
IFJFTEVBU0VfQVNTRVJUKCFtX292ZXJyaWRlcyk7CisgICAgCisgICAgcHV0RGlyZWN0KHZtLCB2
bS5wcm9wZXJ0eU5hbWVzLT5sZW5ndGgsIGpzTnVtYmVyKG1fbGVuZ3RoKSwgRG9udEVudW0pOwor
ICAgIAorICAgIGlmIChpc1N0cmljdE1vZGUoKSkgeworICAgICAgICBwdXREaXJlY3ROb25JbmRl
eEFjY2Vzc29yKHZtLCB2bS5wcm9wZXJ0eU5hbWVzLT5jYWxsZWUsIGdsb2JhbE9iamVjdCgpLT50
aHJvd1R5cGVFcnJvckdldHRlclNldHRlcih2bSksIERvbnRFbnVtIHwgRG9udERlbGV0ZSB8IEFj
Y2Vzc29yKTsKKyAgICAgICAgcHV0RGlyZWN0Tm9uSW5kZXhBY2Nlc3Nvcih2bSwgdm0ucHJvcGVy
dHlOYW1lcy0+Y2FsbGVyLCBnbG9iYWxPYmplY3QoKS0+dGhyb3dUeXBlRXJyb3JHZXR0ZXJTZXR0
ZXIodm0pLCBEb250RW51bSB8IERvbnREZWxldGUgfCBBY2Nlc3Nvcik7CisgICAgfSBlbHNlCisg
ICAgICAgIHB1dERpcmVjdCh2bSwgdm0ucHJvcGVydHlOYW1lcy0+Y2FsbGVlLCBtX2NhbGxlZS5n
ZXQoKSwgRG9udEVudW0pOworICAgIAorICAgIHZvaWQqIGJhY2tpbmdTdG9yZTsKKyAgICBSRUxF
QVNFX0FTU0VSVCh2bS5oZWFwLnRyeUFsbG9jYXRlU3RvcmFnZSh0aGlzLCBtX2xlbmd0aCksICZi
YWNraW5nU3RvcmUpOworICAgIG1fb3ZlcnJpZGVzLnNldCh2bSwgdGhpcywgc3RhdGljX2Nhc3Q8
Ym9vbCo+KGJhY2tpbmdTdG9yZSkpOworICAgIGZvciAodW5zaWduZWQgaSA9IG1fbGVuZ3RoOyBp
LS07KQorICAgICAgICBtX292ZXJyaWRlcy5nZXQoKVtpXSA9IGZhbHNlOworfQorCit2b2lkIERp
cmVjdEFyZ3VtZW50czo6c2xvd0Rvd25BbmRXYXN0ZU1lbW9yeUlmTmVjZXNzYXJ5KFZNJiB2bSkK
K3sKKyAgICBpZiAoIW1fb3ZlcnJpZGVzKQorICAgICAgICBzbG93RG93bkFuZFdhc3RlTWVtb3J5
KHZtKTsKK30KKworfSAvLyBuYW1lc3BhY2UgSlNDCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0RpcmVjdEFyZ3VtZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0RpcmVjdEFyZ3VtZW50cy5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRGlyZWN0QXJndW1lbnRzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBEaXJlY3RBcmd1bWVudHNfaAorI2RlZmluZSBEaXJlY3RBcmd1
bWVudHNfaAorCisjaW5jbHVkZSAiSlNPYmplY3QuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKKy8v
IFRoaXMgaXMgYW4gQXJndW1lbnRzLWNsYXNzIG9iamVjdCB0aGF0IHdlIGNyZWF0ZSB3aGVuIHlv
dSBzYXkgImFyZ3VtZW50cyIgaW5zaWRlIGEgZnVuY3Rpb24sCisvLyBhbmQgbm9uZSBvZiB0aGUg
YXJndW1lbnRzIGFyZSBjYXB0dXJlZCBpbiB0aGUgZnVuY3Rpb24ncyBhY3RpdmF0aW9uLiBUaGUg
ZnVuY3Rpb24gd2lsbCBjb3B5IGFsbAorLy8gb2YgaXRzIGFyZ3VtZW50cyBpbnRvIHRoaXMgb2Jq
ZWN0LCBhbmQgYWxsIHN1YnNlcXVlbnQgYWNjZXNzZXMgdG8gdGhlIGFyZ3VtZW50cyB3aWxsIGdv
IHRocm91Z2gKKy8vIHRoaXMgb2JqZWN0IHRoZXJlYWZ0ZXIuIFNwZWNpYWwgc3VwcG9ydCBpcyBp
biBwbGFjZSBmb3IgbWlzY2hldmlvdXMgZXZlbnRzIGxpa2UgdGhlIGFyZ3VtZW50cworLy8gYmVp
bmcgZGVsZXRlZCAoc29tZXRoaW5nIGxpa2UgImRlbGV0ZSBhcmd1bWVudHNbMF0iKSBvciByZWNv
bmZpZ3VyZWQgKGJyb2FkbHksIHdlIHNheSBkZWxldGlvbnMKKy8vIGFuZCByZWNvbmZpZ3VyYXRp
b25zIG1lYW4gdGhhdCB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudCB3YXMgIm92ZXJyaWRkZW4iKS4K
Ky8vCisvLyBUbyBzcGVlZCBhbGxvY2F0aW9uLCB0aGlzIG9iamVjdCB3aWxsIGhvbGQgYWxsIG9m
IHRoZSBhcmd1bWVudHMgaW4tcGxhY2UuIFRoZSBhcmd1bWVudHMgYXMgd2VsbAorLy8gYXMgYSB0
YWJsZSBvZiBmbGFncyBzYXlpbmcgd2hpY2ggYXJndW1lbnRzIHdlcmUgb3ZlcnJpZGRlbi4KK2Ns
YXNzIERpcmVjdEFyZ3VtZW50cyA6IHB1YmxpYyBKU05vbkZpbmFsT2JqZWN0IHsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIEpTTm9uRmluYWxPYmplY3QgQmFzZTsKKworcHJpdmF0ZToKKyAgICBEaXJl
Y3RBcmd1bWVudHMoVk0mLCBTdHJ1Y3R1cmUqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIAorcHVi
bGljOgorICAgIC8vIENyZWF0ZXMgYW4gYXJndW1lbnRzIG9iamVjdCBidXQgbGVhdmVzIGl0IHVu
aW5pdGlhbGl6ZWQuCisgICAgc3RhdGljIERpcmVjdEFyZ3VtZW50cyogY3JlYXRlVW5pbml0aWFs
aXplZChWTSYsIFN0cnVjdHVyZSosIHVuc2lnbmVkIGxlbmd0aCk7CisgICAgCisgICAgLy8gQ3Jl
YXRlcyBhbiBhcmd1bWVudHMgb2JqZWN0IGFuZCBpbml0aWFsaXplcyBldmVyeXRoaW5nIHRvIHRo
ZSBlbXB0eSB2YWx1ZS4KKyAgICBzdGF0aWMgRGlyZWN0QXJndW1lbnRzKiBjcmVhdGUoVk0mLCBT
dHJ1Y3R1cmUqLCB1bnNpZ25lZCBsZW5ndGgpOworICAgIAorICAgIC8vIENyZWF0ZXMgYW4gYXJn
dW1lbnRzIG9iamVjdCBieSBjb3B5aW5nIHRoZSBhcmd1bW5ldHMgZnJvbSB0aGUgc3RhY2suCisg
ICAgc3RhdGljIERpcmVjdEFyZ3VtZW50cyogY3JlYXRlQnlDb3B5aW5nKFZNJiwgU3RydWN0dXJl
KiwgRXhlY1N0YXRlKik7CisgICAgCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0Nl
bGwqLCBTbG90VmlzaXRvciYpOworICAgIHN0YXRpYyB2b2lkIGNvcHlCYWNraW5nU3RvcmUoSlND
ZWxsKiwgQ29weVZpc2l0b3ImLCBDb3B5VG9rZW4pOworICAgIAorICAgIHVpbnQzMl90IGxlbmd0
aChFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoVU5MSUtFTFkobV9v
dmVycmlkZXMpKQorICAgICAgICAgICAgcmV0dXJuIGdldChleGVjLCBleGVjLT5wcm9wZXJ0eU5h
bWVzKCkubGVuZ3RoKS50b1VJbnQzMihleGVjKTsKKyAgICAgICAgcmV0dXJuIG1fbGVuZ3RoOwor
ICAgIH0KKyAgICAKKyAgICBib29sIGNhbkFjY2Vzc0luZGV4UXVpY2tseSh1aW50MzJfdCBpKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGkgPCBtX2xlbmd0aCAmJiAoIW1fb3ZlcnJpZGVz
IHx8ICFtX292ZXJyaWRlcy5nZXQoKVtpXSk7CisgICAgfQorICAgIAorICAgIEpTVmFsdWUgZ2V0
SW5kZXhRdWlja2x5KHVpbnQzMl90IGkpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlRfV0lU
SF9TRUNVUklUWV9JTVBMSUNBVElPTihjYW5BY2Nlc3NJbmRleFF1aWNrbHkoaSkpOworICAgICAg
ICByZXR1cm4gc3RvcmFnZSgpW2ldLmdldCgpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldElu
ZGV4UXVpY2tseShWTSYgdm0sIHVpbnQzMl90IGksIEpTVmFsdWUgdmFsdWUpCisgICAgeworICAg
ICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihjYW5BY2Nlc3NJbmRleFF1aWNr
bHkoaSkpOworICAgICAgICBzdG9yYWdlKClbaV0uc2V0KHZtLCB0aGlzLCB2YWx1ZSk7CisgICAg
fQorICAgIAorICAgIFdyaXRlQmFycmllcjxKU0Z1bmN0aW9uPiYgY2FsbGVlKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX2NhbGxlZTsKKyAgICB9CisgICAgCisgICAgV3JpdGVCYXJyaWVyPFVu
a25vd24+JiBhcmd1bWVudChDYXB0dXJlZEFyZ3VtZW50c09mZnNldCBvZmZzZXQpCisgICAgewor
ICAgICAgICBBU1NFUlQob2Zmc2V0KTsKKyAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1Q
TElDQVRJT04ob2Zmc2V0Lm9mZnNldCgpIDwgbV9sZW5ndGgpOworICAgICAgICByZXR1cm4gc3Rv
cmFnZSgpW29mZnNldC5vZmZzZXQoKV07CisgICAgfQorICAgIAorICAgIEZ1bmN0aW9uRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4ganNDYXN0PEZ1bmN0aW9u
RXhlY3V0YWJsZSo+KGNhbGxlZS0+ZXhlY3V0YWJsZSgpKTsKKyAgICB9CisgICAgCisgICAgYm9v
bCBpc1N0cmljdE1vZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUoKS0+aXNT
dHJpY3RNb2RlKCk7CisgICAgfQorICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKyAgICAKKyAgICBz
dGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpT
VmFsdWUgcHJvdG90eXBlKTsKKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgZ2V0T3du
UHJvcGVydHlTbG90KEpTT2JqZWN0KiwgRXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lLCBQcm9wZXJ0
eVNsb3QmKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3RCeUluZGV4KEpTT2Jq
ZWN0KiwgRXhlY1N0YXRlKiwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmKTsK
KyAgICBzdGF0aWMgdm9pZCBnZXRPd25Qcm9wZXJ0eU5hbWVzKEpTT2JqZWN0KiwgRXhlY1N0YXRl
KiwgUHJvcGVydHlOYW1lQXJyYXkmLCBFbnVtZXJhdGlvbk1vZGUpOworICAgIHN0YXRpYyB2b2lk
IHB1dChKU0NlbGwqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIEpTVmFsdWUsIFB1dFByb3Bl
cnR5U2xvdCYpOworICAgIHN0YXRpYyB2b2lkIHB1dEJ5SW5kZXgoSlNDZWxsKiwgRXhlY1N0YXRl
KiwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBKU1ZhbHVlLCBib29sIHNob3VsZFRocm93KTsKKyAg
ICBzdGF0aWMgdm9pZCBkZWxldGVQcm9wZXJ0eShKU0NlbGwqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0
eU5hbWUpOworICAgIHN0YXRpYyB2b2lkIGRlbGV0ZVByb3BlcnR5QnlJbmRleChKU0NlbGwqLCBF
eGVjU3RhdGUqLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUpOworICAgIHN0YXRpYyB2b2lkIGRlZmlu
ZU93blByb3BlcnR5KEpTT2JqZWN0KiwgRXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lLCBjb25zdCBQ
cm9wZXJ0eURlc2NyaXB0b3ImLCBib29sIHNob3VsZFRocm93KTsKKyAgICAKKyAgICB2b2lkIHNs
b3dEb3duQW5kV2FzdGVNZW1vcnkoVk0mKTsKKyAgICB2b2lkIHNsb3dEb3duQW5kV2FzdGVNZW1v
cnlJZk5lY2Vzc2FyeShWTSYpOworICAgIAorICAgIHN0YXRpYyBzaXplX3Qgc3RvcmFnZU9mZnNl
dCgpCisgICAgeworICAgICAgICByZXR1cm4gV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9mPHNpemVv
ZihXcml0ZUJhcnJpZXI8VW5rbm93bj4pPihzaXplb2YoRGlyZWN0QXJndW1lbnRzKSk7CisgICAg
fQorICAgIAorICAgIHN0YXRpYyBzaXplX3Qgb3ZlcnJpZGVGbGFnc09mZnNldCh1aW50MzJfdCBs
ZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gc3RvcmFnZU9mZnNldCgpICsgc2l6ZW9mKFdy
aXRlQmFycmllcjxVbmtub3duPikgKiBsZW5ndGg7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBz
aXplX3QgYWxsb2NhdGlvblNpemUodWludDMyX3QgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG92ZXJyaWRlRmxhZ3NPZmZzZXQobGVuZ3RoKSArIFdURjo6cm91bmRVcFRvTXVsdGlwbGVP
ZjxzaXplb2YoV3JpdGVCYXJyaWVyPFVua25vd24+KT4obGVuZ3RoKTsKKyAgICB9CisgICAgCisg
ICAgV3JpdGVCYXJyaWVyPFVua25vd24+KiBzdG9yYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVy
biBiaXR3aXNlX2Nhc3Q8V3JpdGVCYXJyaWVyPFVua25vd24+Kj4oYml0d2lzZV9jYXN0PGNoYXIq
Pih0aGlzKSArIHN0b3JhZ2VPZmZzZXQoKSk7CisgICAgfQorICAgIAorICAgIGJvb2wqIG92ZXJy
aWRlRmxhZ3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxXcml0ZUJhcnJp
ZXI8VW5rbm93bj4qPihiaXR3aXNlX2Nhc3Q8Y2hhcio+KHRoaXMpICsgb3ZlcnJpZGVGbGFnc09m
ZnNldChtX2xlbmd0aCkpOworICAgIH0KKyAgICAKKyAgICBXcml0ZUJhcnJpZXI8SlNGdW5jdGlv
bio+IG1fY2FsbGVlOworICAgIHVpbnQzMl90IG1fbGVuZ3RoOyAvLyBBbHdheXMgdGhlIGFjdHVh
bCBsZW5ndGggb2YgY2FwdHVyZWQgYXJndW1lbnRzIGFuZCBuZXZlciB3aGF0IHdhcyBzdG9yZWQg
aW50byB0aGUgbGVuZ3RoIHByb3BlcnR5LgorICAgIENvcHlXcml0ZUJhcnJpZXI8Ym9vbD4gbV9v
dmVycmlkZXM7IC8vIElmIG5vbi1udWxsLCBpdCBtZWFucyB0aGF0IGxlbmd0aCwgY2FsbGVlLCBh
bmQgY2FsbGVyIGFyZSBmdWxseSBtYXRlcmlhbGl6ZWQgcHJvcGVydGllcy4KK307CisKK30gLy8g
bmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gRGlyZWN0QXJndW1lbnRzX2gKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRm9yZWlnblZhcmlhYmxlSW5kZXguaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Gb3JlaWduVmFyaWFibGVJbmRl
eC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRm9yZWln
blZhcmlhYmxlSW5kZXguaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgRm9yZWlnblZh
cmlhYmxlSW5kZXhfaAorI2RlZmluZSBGb3JlaWduVmFyaWFibGVJbmRleF9oCisKK25hbWVzcGFj
ZSBKU0MgeworCitjbGFzcyBGb3JlaWduVmFyaWFibGVJbmRleCB7CitwdWJsaWM6CisgICAgRm9y
ZWlnblZhcmlhYmxlSW5kZXgoKQorICAgICAgICA6IG1faW5kZXgoVUlOVF9NQVgpCisgICAgewor
ICAgIH0KKyAgICAKKyAgICBleHBsaWNpdCBGb3JlaWduVmFyaWFibGVJbmRleCh1bnNpZ25lZCBp
bmRleCkKKyAgICAgICAgOiBtX2luZGV4KGluZGV4KQorICAgIHsKKyAgICB9CisgICAgCisgICAg
CisgICAgCitwcml2YXRlOgorICAgIHVuc2lnbmVkIG1faW5kZXg7Cit9OworCit9IC8vIG5hbWVz
cGFjZSBKU0MKKworI2VuZGlmIC8vIEZvcmVpZ25WYXJpYWJsZUluZGV4X2gKKwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvR2VuZXJpY09mZnNldC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0dlbmVyaWNPZmZzZXQuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0dlbmVyaWNPZmZzZXQuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEdlbmVyaWNPZmZzZXRfaAorI2RlZmluZSBHZW5l
cmljT2Zmc2V0X2gKKworI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKK25hbWVzcGFjZSBK
U0MgeworCisvLyBBIG1peGluIGZvciBjcmVhdGluZyB0aGUgdmFyaW91cyBraW5kcyBvZiB2YXJp
YWJsZSBvZmZzZXRzIHRoYXQgb3VyIGVuZ2luZSBzdXBwb3J0cy4KK3RlbXBsYXRlPHR5cGVuYW1l
IFQ+CitjbGFzcyBHZW5lcmljT2Zmc2V0IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgaW52YWxpZE9mZnNldCA9IFVJTlRfTUFYOworICAgIAorICAgIEdlbmVyaWNPZmZzZXQo
KQorICAgICAgICA6IG1fb2Zmc2V0KGludmFsaWRPZmZzZXQpCisgICAgeworICAgIH0KKyAgICAK
KyAgICBleHBsaWNpdCBHZW5lcmljT2Zmc2V0KHVuc2lnbmVkIG9mZnNldCkKKyAgICAgICAgOiBt
X29mZnNldChvZmZzZXQpCisgICAgeworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yISgp
IGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0ID09IGludmFsaWRPZmZzZXQ7IH0KKyAgICAKKyAgICB1
bnNpZ25lZCBvZmZzZXRVbmNoZWNrZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
b2Zmc2V0OworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBvZmZzZXQoKSBjb25zdAorICAgIHsK
KyAgICAgICAgQVNTRVJUKG1fb2Zmc2V0ICE9IGludmFsaWRPZmZzZXQpOworICAgICAgICByZXR1
cm4gbV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUJiBv
dGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX29mZnNldCA9PSBvdGhlci5vZmZz
ZXRVbmNoZWNrZWQoKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFQmIG90aGVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0ICE9IG90aGVyLm9mZnNldFVu
Y2hlY2tlZCgpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBUJiBvdGhlcikgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX29mZnNldCA8IG90aGVyLm9mZnNldFVuY2hlY2tl
ZCgpOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPihjb25zdCBUJiBvdGhlcikgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX29mZnNldCA+IG90aGVyLm9mZnNldFVuY2hlY2tlZCgpOwor
ICAgIH0KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgVCYgb3RoZXIpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV9vZmZzZXQgPD0gb3RoZXIub2Zmc2V0VW5jaGVja2VkKCk7CisgICAg
fQorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBUJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX29mZnNldCA+PSBvdGhlci5vZmZzZXRVbmNoZWNrZWQoKTsKKyAgICB9Cisg
ICAgCisgICAgVCBvcGVyYXRvcisoaW50IHZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIFQob2Zmc2V0KCkgKyB2YWx1ZSk7CisgICAgfQorICAgIFQgb3BlcmF0b3ItKGludCB2YWx1
ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBUKG9mZnNldCgpIC0gdmFsdWUpOworICAg
IH0KKyAgICBUJiBvcGVyYXRvcis9KGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAq
dGhpcyA9ICp0aGlzICsgdmFsdWU7CisgICAgfQorICAgIFQmIG9wZXJhdG9yLT0oaW50IHZhbHVl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzID0gKnRoaXMgLSB2YWx1ZTsKKyAgICB9Cisg
ICAgCitwcml2YXRlOgorICAgIHVuc2lnbmVkIG1fb2Zmc2V0OworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgSlNDCisKKyNlbmRpZiAvLyBHZW5lcmljT2Zmc2V0X2gKKwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcmd1bWVudHNJdGVyYXRvci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcmd1bWVudHNJdGVyYXRvci5jcHAJKHJl
dmlzaW9uIDE4MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQXJndW1l
bnRzSXRlcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMyBBcHBsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEzLCAyMDE1IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMzLDEwICszMywxOCBAQCBuYW1lc3Bh
Y2UgSlNDIHsKIAogY29uc3QgQ2xhc3NJbmZvIEpTQXJndW1lbnRzSXRlcmF0b3I6OnNfaW5mbyA9
IHsgIkFyZ3VtZW50c0l0ZXJhdG9yIiwgJkJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9U
QUJMRShKU0FyZ3VtZW50c0l0ZXJhdG9yKSB9OwogCi12b2lkIEpTQXJndW1lbnRzSXRlcmF0b3I6
OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgQXJndW1lbnRzKiBhcmd1bWVudHMpCit2b2lkIEpTQXJn
dW1lbnRzSXRlcmF0b3I6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNPYmplY3QqIGFyZ3VtZW50
cykKIHsKICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CiAgICAgbV9hcmd1bWVudHMuc2V0
KHZtLCB0aGlzLCBhcmd1bWVudHMpOwogfQogCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IGFyZ3VtZW50c0Z1bmNJdGVyYXRvcihFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNPYmplY3Qq
IHRoaXNPYmogPSBleGVjLT50aGlzVmFsdWUoKS50b1RoaXMoZXhlYywgU3RyaWN0TW9kZSkudG9P
YmplY3QoZXhlYyk7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cyhBcmd1bWVudHM6OmluZm8o
KSkgJiYgIXRoaXNPYmotPmluaGVyaXRzKE91dE9mQmFuZEFyZ3VtZW50czo6aW5mbygpKSkKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd1R5cGVFcnJvcihleGVjLCBBU0NJSUxp
dGVyYWwoIkF0dGVtcHRlZCB0byB1c2UgQXJndW1lbnRzIGl0ZXJhdG9yIG9uIG5vbi1Bcmd1bWVu
dHMgb2JqZWN0IikpKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKEpTQXJndW1lbnRzSXRl
cmF0b3I6OmNyZWF0ZShleGVjLT52bSgpLCBleGVjLT5jYWxsZWUoKS0+Z2xvYmFsT2JqZWN0KCkt
PmFyZ3VtZW50c0l0ZXJhdG9yU3RydWN0dXJlKCksIHRoaXNPYmopKTsKK30KKwogfQpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNBcmd1bWVudHNJdGVyYXRvci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQXJndW1lbnRzSXRlcmF0
b3IuaAkocmV2aXNpb24gMTgwNTI5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SlNBcmd1bWVudHNJdGVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzLCAyMDE1IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDcgKzI2LDcgQEAKICNp
Zm5kZWYgSlNBcmd1bWVudHNJdGVyYXRvcl9oCiAjZGVmaW5lIEpTQXJndW1lbnRzSXRlcmF0b3Jf
aAogCi0jaW5jbHVkZSAiQXJndW1lbnRzLmgiCisjaW5jbHVkZSAiSlNPYmplY3QuaCIKIAogbmFt
ZXNwYWNlIEpTQyB7CiAKQEAgLTQxLDcgKzQxLDcgQEAgcHVibGljOgogICAgICAgICByZXR1cm4g
U3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG90eXBlLCBUeXBlSW5mbyhP
YmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiAgICAgfQogCi0gICAgc3RhdGlj
IEpTQXJndW1lbnRzSXRlcmF0b3IqIGNyZWF0ZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJl
LCBBcmd1bWVudHMqIGFyZ3VtZW50cykKKyAgICBzdGF0aWMgSlNBcmd1bWVudHNJdGVyYXRvciog
Y3JlYXRlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIEpTT2JqZWN0KiBhcmd1bWVudHMp
CiAgICAgewogICAgICAgICBKU0FyZ3VtZW50c0l0ZXJhdG9yKiBpbnN0YW5jZSA9IG5ldyAoTm90
TnVsbCwgYWxsb2NhdGVDZWxsPEpTQXJndW1lbnRzSXRlcmF0b3I+KHZtLmhlYXApKSBKU0FyZ3Vt
ZW50c0l0ZXJhdG9yKHZtLCBzdHJ1Y3R1cmUpOwogICAgICAgICBpbnN0YW5jZS0+ZmluaXNoQ3Jl
YXRpb24odm0sIGFyZ3VtZW50cyk7CkBAIC01MCwxMSArNTAsMTEgQEAgcHVibGljOgogCiAgICAg
Ym9vbCBuZXh0KENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1ZhbHVlJiB2YWx1ZSkKICAgICB7Ci0g
ICAgICAgIGlmIChtX25leHRJbmRleCA+PSBtX2FyZ3VtZW50cy0+bGVuZ3RoKGNhbGxGcmFtZSkp
CisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9CisgICAgICAgICAgICBtX2FyZ3VtZW50cy0+Z2V0
KGNhbGxGcmFtZSwgY2FsbEZyYW1lLT5wcm9wZXJ0eU5hbWVzKCkubGVuZ3RoKS50b1VJbnQzMihj
YWxsRnJhbWUpOworICAgICAgICBpZiAobV9uZXh0SW5kZXggPj0gbGVuZ3RoKQogICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB2YWx1ZSA9IG1fYXJndW1lbnRzLT50cnlHZXRBcmd1
bWVudChtX25leHRJbmRleCsrKTsKLSAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgIHZh
bHVlID0ganNVbmRlZmluZWQoKTsKKyAgICAgICAgdmFsdWUgPSBtX2FyZ3VtZW50cy0+Z2V0SW5k
ZXgoY2FsbEZyYW1lLCBtX25leHRJbmRleCsrKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
fQogCkBAIC02OCwxMiArNjgsMTQgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgfQogCi0gICAgdm9p
ZCBmaW5pc2hDcmVhdGlvbihWTSYsIEFyZ3VtZW50cyopOworICAgIHZvaWQgZmluaXNoQ3JlYXRp
b24oVk0mLCBKU09iamVjdCopOwogICAgIAotICAgIFdyaXRlQmFycmllcjxBcmd1bWVudHM+IG1f
YXJndW1lbnRzOworICAgIFdyaXRlQmFycmllcjxKU09iamVjdD4gbV9hcmd1bWVudHM7CiAgICAg
c2l6ZV90IG1fbmV4dEluZGV4OwogfTsKIAorRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBh
cmd1bWVudHNGdW5jSXRlcmF0b3IoRXhlY1N0YXRlKik7CisKIH0KIAogI2VuZGlmIC8vICFkZWZp
bmVkKEpTQXJndW1lbnRzSXRlcmF0b3JfaCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTRW52aXJvbm1lbnRSZWNvcmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0pTRW52aXJvbm1lbnRSZWNvcmQuY3BwCShyZXZpc2lvbiAxODA1
MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0Vudmlyb25tZW50UmVjb3Jk
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDcsIDIwMDgsIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDEyLCAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzUsNCArMzUsMTIg
QEAgbmFtZXNwYWNlIEpTQyB7CiAKIGNvbnN0IENsYXNzSW5mbyBKU0Vudmlyb25tZW50UmVjb3Jk
OjpzX2luZm8gPSB7ICJFbnZpcm9ubWVudFJlY29yZCIsICZCYXNlOjpzX2luZm8sIDAsIENSRUFU
RV9NRVRIT0RfVEFCTEUoSlNFbnZpcm9ubWVudFJlY29yZCkgfTsKIAordm9pZCBKU0Vudmlyb25t
ZW50UmVjb3JkOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0
b3IpCit7CisgICAgSlNFbnZpcm9ubWVudFJlY29yZCogdGhpc09iamVjdCA9IGpzQ2FzdDxKU0Vu
dmlyb25tZW50UmVjb3JkKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0
aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIEJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwg
dmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmRWYWx1ZXModGhpc09iamVjdC0+dmFyaWFibGVz
KCksIG1fc3ltYm9sVGFibGUtPnNjb3BlU2l6ZSgpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgSlND
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0Vudmlyb25tZW50UmVjb3Jk
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNFbnZpcm9u
bWVudFJlY29yZC5oCShyZXZpc2lvbiAxODA1MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9KU0Vudmlyb25tZW50UmVjb3JkLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDExICs0
NiwyNiBAQCBjbGFzcyBKU0Vudmlyb25tZW50UmVjb3JkIDogcHVibGljIEpTU3ltCiBwdWJsaWM6
CiAgICAgdHlwZWRlZiBKU1N5bWJvbFRhYmxlT2JqZWN0IEJhc2U7CiAKLSAgICBXcml0ZUJhcnJp
ZXJCYXNlPFVua25vd24+KiByZWdpc3RlcnMoKSB7IHJldHVybiBtX3JlZ2lzdGVyczsgfQotICAg
IFdyaXRlQmFycmllckJhc2U8VW5rbm93bj4mIHJlZ2lzdGVyQXQoaW50IGluZGV4KSBjb25zdCB7
IHJldHVybiBtX3JlZ2lzdGVyc1tpbmRleF07IH0KKyAgICBXcml0ZUJhcnJpZXJCYXNlPFVua25v
d24+KiB2YXJpYWJsZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpdHdpc2VfY2FzdDxXcml0
ZUJhcnJpZXJCYXNlPFVua25vd24+Kj4oYml0d2lzZV9jYXN0PGNoYXIqPih0aGlzKSArIG9mZnNl
dE9mVmFyaWFibGVzKCkpOworICAgIH0KKyAgICAKKyAgICBib29sIGlzVmFsaWQoU2NvcGVPZmZz
ZXQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICEhb2Zmc2V0ICYmIG9mZnNldC5vZmZz
ZXQoKSA8IG1fc3ltYm9sVGFibGUtPnNjb3BlU2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBXcml0
ZUJhcnJpZXJCYXNlPFVua25vd24+JiB2YXJpYWJsZUF0KFNjb3BlT2Zmc2V0IG9mZnNldCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkKG9mZnNldCkpOworICAgICAgICByZXR1
cm4gdmFyaWFibGVzKClbb2Zmc2V0Lm9mZnNldCgpXTsKKyAgICB9CiAKLSAgICBXcml0ZUJhcnJp
ZXJCYXNlPFVua25vd24+KiBjb25zdCAqIGFkZHJlc3NPZlJlZ2lzdGVycygpIGNvbnN0IHsgcmV0
dXJuICZtX3JlZ2lzdGVyczsgfQotICAgIHN0YXRpYyBzaXplX3Qgb2Zmc2V0T2ZSZWdpc3RlcnMo
KSB7IHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoSlNFbnZpcm9ubWVudFJlY29yZCwgbV9yZWdpc3Rl
cnMpOyB9CisgICAgc3RhdGljIHNpemVfdCBvZmZzZXRPZlZhcmlhYmxlcygpCisgICAgeworICAg
ICAgICByZXR1cm4gV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9mPHNpemVvZihXcml0ZUJhcnJpZXI8
VW5rbm93bj4pPihzaXplb2YoSlNFbnZpcm9ubWVudFJlY29yZCkpOworICAgIH0KIAogICAgIERF
Q0xBUkVfSU5GTzsKIApAQCAtNjAsMTUgKzc1LDM1IEBAIHByb3RlY3RlZDoKICAgICBKU0Vudmly
b25tZW50UmVjb3JkKAogICAgICAgICBWTSYgdm0sCiAgICAgICAgIFN0cnVjdHVyZSogc3RydWN0
dXJlLAotICAgICAgICBSZWdpc3RlciogcmVnaXN0ZXJzLAogICAgICAgICBKU1Njb3BlKiBzY29w
ZSwKICAgICAgICAgU3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlKQogICAgICAgICA6IEJhc2Uodm0s
IHN0cnVjdHVyZSwgc2NvcGUsIHN5bWJvbFRhYmxlKQotICAgICAgICAsIG1fcmVnaXN0ZXJzKHJl
aW50ZXJwcmV0X2Nhc3Q8V3JpdGVCYXJyaWVyQmFzZTxVbmtub3duPio+KHJlZ2lzdGVycykpCiAg
ICAgewogICAgIH0KLQotICAgIFdyaXRlQmFycmllckJhc2U8VW5rbm93bj4qIG1fcmVnaXN0ZXJz
OyAvLyAiciIgaW4gdGhlIHN0YWNrLgorICAgIAorICAgIHN0YXRpYyBzaXplX3QgYWxsb2NhdGlv
blNpemVGb3JTY29wZVNpemUodW5zaWduZWQgc2NvcGVTaXplKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG9mZnNldE9mVmFyaWFibGVzKCkgKyBzY29wZVNpemUgKiBzaXplb2YoV3JpdGVCYXJyaWVy
PFVua25vd24+KTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHNpemVfdCBhbGxvY2F0aW9uU2l6
ZShTeW1ib2xUYWJsZSogc3ltYm9sVGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gYWxsb2Nh
dGlvblNpemVGb3JTY29wZVNpemUoc3ltYm9sVGFibGUtPnNjb3BlU2l6ZSgpKTsKKyAgICB9Cisg
ICAgCisgICAgdm9pZCBmaW5pc2hDcmVhdGlvblVuaW5pdGlhbGl6ZWQoVk0mIHZtKQorICAgIHsK
KyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIH0KKyAgICAKKyAgICB2b2lk
IGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKKyAgICB7CisgICAgICAgIGZpbmlzaENyZWF0aW9uVW5p
bml0aWFsaXplZCh2bSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IG1fc3ltYm9sVGFibGUt
PnNjb3BlU2l6ZSgpOyBpLS07KSB7CisgICAgICAgICAgICAvLyBGaWxsaW5nIHRoaXMgd2l0aCB1
bmRlZmluZWQgaXMgdXNlZnVsIGJlY2F1c2UgdGhhdCdzIHdoYXQgdmFyaWFibGVzIHN0YXJ0IG91
dCBhcy4KKyAgICAgICAgICAgIHZhcmlhYmxlQXQoaSkuc2V0VW5kZWZpbmVkKCk7CisgICAgICAg
IH0KKyAgICB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTTGV4aWNhbEVudmlyb25tZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0xleGljYWxFbnZpcm9ubWVudC5jcHAJKHJl
dmlzaW9uIDE4MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTGV4aWNh
bEVudmlyb25tZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDE0LCAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAt
NDAsMjcgKzQwLDE5IEBAIG5hbWVzcGFjZSBKU0MgewogCiBjb25zdCBDbGFzc0luZm8gSlNMZXhp
Y2FsRW52aXJvbm1lbnQ6OnNfaW5mbyA9IHsgIkpTTGV4aWNhbEVudmlyb25tZW50IiwgJkJhc2U6
OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU0xleGljYWxFbnZpcm9ubWVudCkgfTsK
IAotdm9pZCBKU0xleGljYWxFbnZpcm9ubWVudDo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGws
IFNsb3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIEpTTGV4aWNhbEVudmlyb25tZW50KiB0aGlz
T2JqZWN0ID0ganNDYXN0PEpTTGV4aWNhbEVudmlyb25tZW50Kj4oY2VsbCk7Ci0gICAgQVNTRVJU
X0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIEJhc2U6OnZpc2l0
Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8
IHRoaXNPYmplY3QtPnN5bWJvbFRhYmxlKCktPmNhcHR1cmVDb3VudCgpOyArK2kpCi0gICAgICAg
IHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5zdG9yYWdlKClbaV0pOwotfQotCiBpbmxpbmUg
Ym9vbCBKU0xleGljYWxFbnZpcm9ubWVudDo6c3ltYm9sVGFibGVHZXQoUHJvcGVydHlOYW1lIHBy
b3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQogewogICAgIFN5bWJvbFRhYmxlRW50cnkg
ZW50cnkgPSBzeW1ib2xUYWJsZSgpLT5pbmxpbmVHZXQocHJvcGVydHlOYW1lLnVpZCgpKTsKICAg
ICBpZiAoZW50cnkuaXNOdWxsKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgIFNjb3Bl
T2Zmc2V0IG9mZnNldCA9IGVudHJ5LnNjb3BlT2Zmc2V0KCk7CisKICAgICAvLyBEZWZlbmQgYWdh
aW5zdCB0aGUgaW5zcGVjdG9yIGFza2luZyBmb3IgYSB2YXIgYWZ0ZXIgaXQgaGFzIGJlZW4gb3B0
aW1pemVkIG91dC4KLSAgICBpZiAoIWlzVmFsaWQoZW50cnkpKQorICAgIGlmICghaXNWYWxpZChv
ZmZzZXQpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBzbG90LnNldFZhbHVlKHRoaXMs
IERvbnRFbnVtLCByZWdpc3RlckF0KGVudHJ5LmdldEluZGV4KCkpLmdldCgpKTsKKyAgICBzbG90
LnNldFZhbHVlKHRoaXMsIERvbnRFbnVtLCB2YXJpYWJsZUF0KG9mZnNldCkuZ2V0KCkpOwogICAg
IHJldHVybiB0cnVlOwogfQogCkBAIC03MCwxMSArNjIsMTMgQEAgaW5saW5lIGJvb2wgSlNMZXhp
Y2FsRW52aXJvbm1lbnQ6OnN5bWJvbAogICAgIGlmIChlbnRyeS5pc051bGwoKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCisgICAgU2NvcGVPZmZzZXQgb2Zmc2V0ID0gZW50cnkuc2NvcGVPZmZz
ZXQoKTsKKwogICAgIC8vIERlZmVuZCBhZ2FpbnN0IHRoZSBpbnNwZWN0b3IgYXNraW5nIGZvciBh
IHZhciBhZnRlciBpdCBoYXMgYmVlbiBvcHRpbWl6ZWQgb3V0LgotICAgIGlmICghaXNWYWxpZChl
bnRyeSkpCisgICAgaWYgKCFpc1ZhbGlkKG9mZnNldCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
IAotICAgIGRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRvcihyZWdpc3RlckF0KGVudHJ5LmdldEluZGV4
KCkpLmdldCgpLCBlbnRyeS5nZXRBdHRyaWJ1dGVzKCkpOworICAgIGRlc2NyaXB0b3Iuc2V0RGVz
Y3JpcHRvcih2YXJpYWJsZUF0KG9mZnNldCkuZ2V0KCksIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSk7
CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTk1LDEyICs4OSwxMyBAQCBpbmxpbmUgYm9vbCBK
U0xleGljYWxFbnZpcm9ubWVudDo6c3ltYm9sCiAgICAgICAgICAgICAgICAgdGhyb3dUeXBlRXJy
b3IoZXhlYywgU3RyaWN0TW9kZVJlYWRvbmx5UHJvcGVydHlXcml0ZUVycm9yKTsKICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldCA9
IGl0ZXItPnZhbHVlLnNjb3BlT2Zmc2V0KCk7CiAgICAgICAgIC8vIERlZmVuZCBhZ2FpbnN0IHRo
ZSBpbnNwZWN0b3IgYXNraW5nIGZvciBhIHZhciBhZnRlciBpdCBoYXMgYmVlbiBvcHRpbWl6ZWQg
b3V0LgotICAgICAgICBpZiAoIWlzVmFsaWQoaXRlci0+dmFsdWUpKQorICAgICAgICBpZiAoIWlz
VmFsaWQob2Zmc2V0KSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKFZh
cmlhYmxlV2F0Y2hwb2ludFNldCogc2V0ID0gaXRlci0+dmFsdWUud2F0Y2hwb2ludFNldCgpKQot
ICAgICAgICAgICAgc2V0LT5pbnZhbGlkYXRlKFZhcmlhYmxlV3JpdGVGaXJlRGV0YWlsKHRoaXMs
IHByb3BlcnR5TmFtZSkpOyAvLyBEb24ndCBtZXNzIGFyb3VuZCAtIGlmIHdlIGhhZCBmb3VuZCB0
aGlzIHN0YXRpY2FsbHksIHdlIHdvdWxkIGhhdmUgaW52Y2FsaWRhdGVkIGl0LgotICAgICAgICBy
ZWcgPSAmcmVnaXN0ZXJBdChpdGVyLT52YWx1ZS5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHNl
dC0+aW52YWxpZGF0ZShWYXJpYWJsZVdyaXRlRmlyZURldGFpbCh0aGlzLCBwcm9wZXJ0eU5hbWUp
KTsgLy8gRG9uJ3QgbWVzcyBhcm91bmQgLSBpZiB3ZSBoYWQgZm91bmQgdGhpcyBzdGF0aWNhbGx5
LCB3ZSB3b3VsZCBoYXZlIGludmFsaWRhdGVkIGl0LgorICAgICAgICByZWcgPSAmdmFyaWFibGVB
dChvZmZzZXQpOwogICAgIH0KICAgICByZWctPnNldCh2bSwgdGhpcywgdmFsdWUpOwogICAgIHJl
dHVybiB0cnVlOwpAQCAtMTE2LDcgKzExMSw3IEBAIHZvaWQgSlNMZXhpY2FsRW52aXJvbm1lbnQ6
OmdldE93bk5vbkluZGUKICAgICAgICAgZm9yIChTeW1ib2xUYWJsZTo6TWFwOjppdGVyYXRvciBp
dCA9IHRoaXNPYmplY3QtPnN5bWJvbFRhYmxlKCktPmJlZ2luKGxvY2tlcik7IGl0ICE9IGVuZDsg
KytpdCkgewogICAgICAgICAgICAgaWYgKGl0LT52YWx1ZS5nZXRBdHRyaWJ1dGVzKCkgJiBEb250
RW51bSAmJiAhc2hvdWxkSW5jbHVkZURvbnRFbnVtUHJvcGVydGllcyhtb2RlKSkKICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICghdGhpc09iamVjdC0+aXNWYWxpZChp
dC0+dmFsdWUpKQorICAgICAgICAgICAgaWYgKCF0aGlzT2JqZWN0LT5pc1ZhbGlkKGl0LT52YWx1
ZS5zY29wZU9mZnNldCgpKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAg
IHByb3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIoZXhlYywgaXQtPmtleS5nZXQoKSkpOwogICAg
ICAgICB9CkBAIC0xMzcsMTEgKzEzMiwxMyBAQCBpbmxpbmUgYm9vbCBKU0xleGljYWxFbnZpcm9u
bWVudDo6c3ltYm9sCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIFN5bWJvbFRh
YmxlRW50cnkmIGVudHJ5ID0gaXRlci0+dmFsdWU7CiAgICAgICAgIEFTU0VSVCghZW50cnkuaXNO
dWxsKCkpOwotICAgICAgICBpZiAoIWlzVmFsaWQoZW50cnkpKQorICAgICAgICAKKyAgICAgICAg
U2NvcGVPZmZzZXQgb2Zmc2V0ID0gZW50cnkuc2NvcGVPZmZzZXQoKTsKKyAgICAgICAgaWYgKCFp
c1ZhbGlkKG9mZnNldCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIAogICAg
ICAgICBlbnRyeS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgICAgICByZWcgPSAmcmVn
aXN0ZXJBdChlbnRyeS5nZXRJbmRleCgpKTsKKyAgICAgICAgcmVnID0gJnZhcmlhYmxlQXQob2Zm
c2V0KTsKICAgICB9CiAgICAgcmVnLT5zZXQodm0sIHRoaXMsIHZhbHVlKTsKICAgICByZXR1cm4g
dHJ1ZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTGV4aWNhbEVudmly
b25tZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNM
ZXhpY2FsRW52aXJvbm1lbnQuaAkocmV2aXNpb24gMTgwNTI5KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSlNMZXhpY2FsRW52aXJvbm1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAt
MSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTMsIDIwMTQg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAy
MDA5LCAyMDEzLTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00MSwzMyArNDEsMjcgQEAgY2xhc3MgUmVnaXN0ZXI7
CiAgICAgCiBjbGFzcyBKU0xleGljYWxFbnZpcm9ubWVudCA6IHB1YmxpYyBKU0Vudmlyb25tZW50
UmVjb3JkIHsKIHByaXZhdGU6Ci0gICAgSlNMZXhpY2FsRW52aXJvbm1lbnQoVk0mLCBDYWxsRnJh
bWUqLCBSZWdpc3RlciosIEpTU2NvcGUqLCBDb2RlQmxvY2sqKTsKKyAgICBKU0xleGljYWxFbnZp
cm9ubWVudChWTSYsIFN0cnVjdHVyZSosIEpTU2NvcGUqLCBTeW1ib2xUYWJsZSopOwogICAgIAog
cHVibGljOgogICAgIHR5cGVkZWYgSlNFbnZpcm9ubWVudFJlY29yZCBCYXNlOwogCi0gICAgc3Rh
dGljIEpTTGV4aWNhbEVudmlyb25tZW50KiBjcmVhdGUoVk0mIHZtLCBDYWxsRnJhbWUqIGNhbGxG
cmFtZSwgUmVnaXN0ZXIqIHJlZ2lzdGVycywgSlNTY29wZSogY3VycmVudFNjb3BlLCBDb2RlQmxv
Y2sqIGNvZGVCbG9jaykKKyAgICBzdGF0aWMgSlNMZXhpY2FsRW52aXJvbm1lbnQqIGNyZWF0ZSgK
KyAgICAgICAgVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1Njb3BlKiBj
dXJyZW50U2NvcGUsIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSkKICAgICB7Ci0gICAgICAgIFN5
bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9IGNvZGVCbG9jay0+c3ltYm9sVGFibGUoKTsKLSAgICAg
ICAgQVNTRVJUKGNvZGVCbG9jay0+Y29kZVR5cGUoKSA9PSBGdW5jdGlvbkNvZGUpOwotICAgICAg
ICBKU0xleGljYWxFbnZpcm9ubWVudCogbGV4aWNhbEVudmlyb25tZW50ID0gbmV3ICgKLSAgICAg
ICAgICAgIE5vdE51bGwsCi0gICAgICAgICAgICBhbGxvY2F0ZUNlbGw8SlNMZXhpY2FsRW52aXJv
bm1lbnQ+KAotICAgICAgICAgICAgICAgIHZtLmhlYXAsCi0gICAgICAgICAgICAgICAgYWxsb2Nh
dGlvblNpemUoc3ltYm9sVGFibGUpCi0gICAgICAgICAgICApCi0gICAgICAgICkgSlNMZXhpY2Fs
RW52aXJvbm1lbnQodm0sIGNhbGxGcmFtZSwgcmVnaXN0ZXJzLCBjdXJyZW50U2NvcGUsIGNvZGVC
bG9jayk7Ci0gICAgICAgIGxleGljYWxFbnZpcm9ubWVudC0+ZmluaXNoQ3JlYXRpb24odm0pOwot
ICAgICAgICByZXR1cm4gbGV4aWNhbEVudmlyb25tZW50OworICAgICAgICBKU0xleGljYWxFbnZp
cm9ubWVudCogcmVzdWx0ID0KKyAgICAgICAgICAgIG5ldyAoTm90TnVsbCwgYWxsb2NhdGlvblNp
emUoc3ltYm9sVGFibGUpKQorICAgICAgICAgICAgSlNMZXhpY2FsRW52aXJvbm1lbnQodm0sIGds
b2JhbE9iamVjdC0+YWN0aXZhdGlvblN0cnVjdHVyZSgpLCBjdXJyZW50U2NvcGUsIHN5bWJvbFRh
YmxlKTsKKyAgICAgICAgcmVzdWx0LT5maW5pc2hDcmVhdGlvbih2bSk7CiAgICAgfQotICAgICAg
ICAKKyAgICAKICAgICBzdGF0aWMgSlNMZXhpY2FsRW52aXJvbm1lbnQqIGNyZWF0ZShWTSYgdm0s
IENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1Njb3BlKiBjdXJyZW50U2NvcGUsIENvZGVCbG9jayog
Y29kZUJsb2NrKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZSh2bSwgY2FsbEZyYW1lLCBj
YWxsRnJhbWUtPnJlZ2lzdGVycygpICsgY29kZUJsb2NrLT5mcmFtZVBvaW50ZXJPZmZzZXRUb0dl
dEFjdGl2YXRpb25SZWdpc3RlcnMoKSwgY3VycmVudFNjb3BlLCBjb2RlQmxvY2spOworICAgICAg
ICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gY2FsbEZyYW1lLT5sZXhpY2FsR2xvYmFs
T2JqZWN0KCk7CisgICAgICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9IGNvZGVCbG9jay0+
c3ltYm9sVGFibGUoKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBj
dXJyZW50U2NvcGUsIHN5bWJvbHRhYmxlKTsKICAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNp
dENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KKyAgICAgICAgCiAgICAgc3RhdGlj
IGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEpTT2JqZWN0KiwgRXhlY1N0YXRlKiwgUHJvcGVydHlO
YW1lLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBzdGF0aWMgdm9pZCBnZXRPd25Ob25JbmRleFByb3Bl
cnR5TmFtZXMoSlNPYmplY3QqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWVBcnJheSYsIEVudW1l
cmF0aW9uTW9kZSk7CiAKQEAgLTgxLDEyICs3NSw2IEBAIHB1YmxpYzoKIAogICAgIHN0YXRpYyBT
dHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QpIHsgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIGpzTnVs
bCgpLCBUeXBlSW5mbyhBY3RpdmF0aW9uT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZv
KCkpOyB9CiAKLSAgICBXcml0ZUJhcnJpZXJCYXNlPFVua25vd24+JiByZWdpc3RlckF0KGludCkg
Y29uc3Q7Ci0gICAgYm9vbCBpc1ZhbGlkSW5kZXgoaW50KSBjb25zdDsKLSAgICBib29sIGlzVmFs
aWQoY29uc3QgU3ltYm9sVGFibGVFbnRyeSYpIGNvbnN0OwotICAgIGludCByZWdpc3RlcnNPZmZz
ZXQoKTsKLSAgICBzdGF0aWMgaW50IHJlZ2lzdGVyc09mZnNldChTeW1ib2xUYWJsZSopOwotCiBw
cm90ZWN0ZWQ6CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gT3Zl
cnJpZGVzR2V0T3duUHJvcGVydHlTbG90IHwgT3ZlcnJpZGVzR2V0UHJvcGVydHlOYW1lcyB8IEJh
c2U6OlN0cnVjdHVyZUZsYWdzOwogCkBAIC05NiwzMiArODQsMTMgQEAgcHJpdmF0ZToKICAgICBi
b29sIHN5bWJvbFRhYmxlR2V0KFByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiwgYm9vbCYgc2xv
dElzV3JpdGVhYmxlKTsKICAgICBib29sIHN5bWJvbFRhYmxlUHV0KEV4ZWNTdGF0ZSosIFByb3Bl
cnR5TmFtZSwgSlNWYWx1ZSwgYm9vbCBzaG91bGRUaHJvdyk7CiAgICAgYm9vbCBzeW1ib2xUYWJs
ZVB1dFdpdGhBdHRyaWJ1dGVzKFZNJiwgUHJvcGVydHlOYW1lLCBKU1ZhbHVlLCB1bnNpZ25lZCBh
dHRyaWJ1dGVzKTsKLQotICAgIHN0YXRpYyBzaXplX3QgYWxsb2NhdGlvblNpemUoU3ltYm9sVGFi
bGUqKTsKLSAgICBzdGF0aWMgc2l6ZV90IHN0b3JhZ2VPZmZzZXQoKTsKLQotICAgIFdyaXRlQmFy
cmllcjxVbmtub3duPiogc3RvcmFnZSgpOyAvLyBjYXB0dXJlQ291bnQoKSBudW1iZXIgb2YgcmVn
aXN0ZXJzLgogfTsKIAotaW5saW5lIEpTTGV4aWNhbEVudmlyb25tZW50OjpKU0xleGljYWxFbnZp
cm9ubWVudChWTSYgdm0sIENhbGxGcmFtZSogY2FsbEZyYW1lLCBSZWdpc3RlciogcmVnaXN0ZXJz
LCBKU1Njb3BlKiBjdXJyZW50U2NvcGUsIENvZGVCbG9jayogY29kZUJsb2NrKQotICAgIDogQmFz
ZSgKLSAgICAgICAgdm0sCi0gICAgICAgIGNhbGxGcmFtZS0+bGV4aWNhbEdsb2JhbE9iamVjdCgp
LT5hY3RpdmF0aW9uU3RydWN0dXJlKCksCi0gICAgICAgIHJlZ2lzdGVycywKLSAgICAgICAgY3Vy
cmVudFNjb3BlLAotICAgICAgICBjb2RlQmxvY2stPnN5bWJvbFRhYmxlKCkpCitpbmxpbmUgSlNM
ZXhpY2FsRW52aXJvbm1lbnQ6OkpTTGV4aWNhbEVudmlyb25tZW50KFZNJiB2bSwgU3RydWN0dXJl
KiBzdHJ1Y3R1cmUsIEpTU2NvcGUqIGN1cnJlbnRTY29wZSwgU3ltYm9sVGFibGUqIHN5bWJvbFRh
YmxlKQorICAgIDogQmFzZSh2bSwgc3RydWN0dXJlLCBjdXJyZW50U2NvcGUsIHN5bWJvbFRhYmxl
KQogewotICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9IGNvZGVCbG9jay0+c3ltYm9sVGFi
bGUoKTsKLSAgICBXcml0ZUJhcnJpZXI8VW5rbm93bj4qIHN0b3JhZ2UgPSB0aGlzLT5zdG9yYWdl
KCk7Ci0gICAgc2l6ZV90IGNhcHR1cmVDb3VudCA9IHN5bWJvbFRhYmxlLT5jYXB0dXJlQ291bnQo
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHR1cmVDb3VudDsgKytpKQotICAgICAg
ICBuZXcgKE5vdE51bGwsICZzdG9yYWdlW2ldKSBXcml0ZUJhcnJpZXI8VW5rbm93bj4oVW5kZWZp
bmVkV3JpdGVCYXJyaWVyVGFnKTsKLSAgICBtX3JlZ2lzdGVycyA9IHJlaW50ZXJwcmV0X2Nhc3Rf
cHRyPFdyaXRlQmFycmllckJhc2U8VW5rbm93bj4qPigKLSAgICAgICAgcmVpbnRlcnByZXRfY2Fz
dDxjaGFyKj4odGhpcykgKyByZWdpc3RlcnNPZmZzZXQoc3ltYm9sVGFibGUpKTsKIH0KIAotSlNM
ZXhpY2FsRW52aXJvbm1lbnQqIGFzQWN0aXZhdGlvbihKU1ZhbHVlKTsKLQogaW5saW5lIEpTTGV4
aWNhbEVudmlyb25tZW50KiBhc0FjdGl2YXRpb24oSlNWYWx1ZSB2YWx1ZSkKIHsKICAgICBBU1NF
UlQoYXNPYmplY3QodmFsdWUpLT5pbmhlcml0cyhKU0xleGljYWxFbnZpcm9ubWVudDo6aW5mbygp
KSk7CkBAIC0xMzMsNDkgKzEwMiw2IEBAIEFMV0FZU19JTkxJTkUgSlNMZXhpY2FsRW52aXJvbm1l
bnQqIFJlZ2kKICAgICByZXR1cm4gYXNBY3RpdmF0aW9uKGpzVmFsdWUoKSk7CiB9CiAKLWlubGlu
ZSBpbnQgSlNMZXhpY2FsRW52aXJvbm1lbnQ6OnJlZ2lzdGVyc09mZnNldChTeW1ib2xUYWJsZSog
c3ltYm9sVGFibGUpCi17Ci0gICAgcmV0dXJuIHN0b3JhZ2VPZmZzZXQoKSArICgoc3ltYm9sVGFi
bGUtPmNhcHR1cmVDb3VudCgpIC0gc3ltYm9sVGFibGUtPmNhcHR1cmVTdGFydCgpICAtIDEpICog
c2l6ZW9mKFdyaXRlQmFycmllcjxVbmtub3duPikpOwotfQotCi1pbmxpbmUgc2l6ZV90IEpTTGV4
aWNhbEVudmlyb25tZW50OjpzdG9yYWdlT2Zmc2V0KCkKLXsKLSAgICByZXR1cm4gV1RGOjpyb3Vu
ZFVwVG9NdWx0aXBsZU9mPHNpemVvZihXcml0ZUJhcnJpZXI8VW5rbm93bj4pPihzaXplb2YoSlNM
ZXhpY2FsRW52aXJvbm1lbnQpKTsKLX0KLQotaW5saW5lIFdyaXRlQmFycmllcjxVbmtub3duPiog
SlNMZXhpY2FsRW52aXJvbm1lbnQ6OnN0b3JhZ2UoKQotewotICAgIHJldHVybiByZWludGVycHJl
dF9jYXN0X3B0cjxXcml0ZUJhcnJpZXI8VW5rbm93bj4qPigKLSAgICAgICAgcmVpbnRlcnByZXRf
Y2FzdDxjaGFyKj4odGhpcykgKyBzdG9yYWdlT2Zmc2V0KCkpOwotfQotCi1pbmxpbmUgc2l6ZV90
IEpTTGV4aWNhbEVudmlyb25tZW50OjphbGxvY2F0aW9uU2l6ZShTeW1ib2xUYWJsZSogc3ltYm9s
VGFibGUpCi17Ci0gICAgc2l6ZV90IG9iamVjdFNpemVJbkJ5dGVzID0gV1RGOjpyb3VuZFVwVG9N
dWx0aXBsZU9mPHNpemVvZihXcml0ZUJhcnJpZXI8VW5rbm93bj4pPihzaXplb2YoSlNMZXhpY2Fs
RW52aXJvbm1lbnQpKTsKLSAgICBzaXplX3Qgc3RvcmFnZVNpemVJbkJ5dGVzID0gc3ltYm9sVGFi
bGUtPmNhcHR1cmVDb3VudCgpICogc2l6ZW9mKFdyaXRlQmFycmllcjxVbmtub3duPik7Ci0gICAg
cmV0dXJuIG9iamVjdFNpemVJbkJ5dGVzICsgc3RvcmFnZVNpemVJbkJ5dGVzOwotfQotCi1pbmxp
bmUgYm9vbCBKU0xleGljYWxFbnZpcm9ubWVudDo6aXNWYWxpZEluZGV4KGludCBpbmRleCkgY29u
c3QKLXsKLSAgICBpZiAoaW5kZXggPiBzeW1ib2xUYWJsZSgpLT5jYXB0dXJlU3RhcnQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChpbmRleCA8PSBzeW1ib2xUYWJsZSgpLT5jYXB0
dXJlRW5kKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
aW5saW5lIGJvb2wgSlNMZXhpY2FsRW52aXJvbm1lbnQ6OmlzVmFsaWQoY29uc3QgU3ltYm9sVGFi
bGVFbnRyeSYgZW50cnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzVmFsaWRJbmRleChlbnRyeS5n
ZXRJbmRleCgpKTsKLX0KLQotaW5saW5lIFdyaXRlQmFycmllckJhc2U8VW5rbm93bj4mIEpTTGV4
aWNhbEVudmlyb25tZW50OjpyZWdpc3RlckF0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBBU1NF
UlQoaXNWYWxpZEluZGV4KGluZGV4KSk7Ci0gICAgcmV0dXJuIEJhc2U6OnJlZ2lzdGVyQXQoaW5k
ZXgpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAogI2VuZGlmIC8vIEpTTGV4aWNhbEVudmly
b25tZW50X2gKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTmFtZVNjb3Bl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU05hbWVT
Y29wZS5jcHAJKHJldmlzaW9uIDE4MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTTmFtZVNjb3BlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsMTQgKzQ3LDYgQEAgSlNO
YW1lU2NvcGUqIEpTTmFtZVNjb3BlOjpjcmVhdGUoVk0mIHZtLAogICAgIHJldHVybiBudWxscHRy
OwogfQogCi12b2lkIEpTTmFtZVNjb3BlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xv
dFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgSlNOYW1lU2NvcGUqIHRoaXNPYmplY3QgPSBqc0Nh
c3Q8SlNOYW1lU2NvcGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRo
aXNPYmplY3QsIGluZm8oKSk7Ci0gICAgQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2
aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9yZWdpc3RlclN0b3Jl
KTsKLX0KLQogSlNWYWx1ZSBKU05hbWVTY29wZTo6dG9UaGlzKEpTQ2VsbCosIEV4ZWNTdGF0ZSog
ZXhlYywgRUNNQU1vZGUgZWNtYU1vZGUpCiB7CiAgICAgaWYgKGVjbWFNb2RlID09IFN0cmljdE1v
ZGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU05hbWVTY29wZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTmFtZVNjb3BlLmgJ
KHJldmlzaW9uIDE4MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTTmFt
ZVNjb3BlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDM4ICs0NCwzNyBAQCBwdWJsaWM6CiAgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBzdGF0aWMgVCogY3JlYXRlKFZNJiB2bSwgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNTY29wZSogY3VycmVudFNjb3BlLCBTeW1ib2xUYWJs
ZSogc3ltYm9sVGFibGUsIEpTVmFsdWUgdmFsdWUpCiAgICAgewotICAgICAgICBUKiBzY29wZU9i
amVjdCA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFQ+KHZtLmhlYXApKSBUKHZtLCBnbG9i
YWxPYmplY3QsIGN1cnJlbnRTY29wZSwgc3ltYm9sVGFibGUpOworICAgICAgICBUKiBzY29wZU9i
amVjdCA9IG5ldyAoCisgICAgICAgICAgICBOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8VD4odm0uaGVh
cCwgYWxsb2NhdGlvblNpemVGb3JTY29wZVNpemUoMSkpCisgICAgICAgICAgICBUKHZtLCBnbG9i
YWxPYmplY3QsIGN1cnJlbnRTY29wZSwgc3ltYm9sVGFibGUpOwogICAgICAgICBzY29wZU9iamVj
dC0+ZmluaXNoQ3JlYXRpb24odm0sIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHNjb3BlT2JqZWN0
OwogICAgIH0KICAgICAKICAgICBzdGF0aWMgSlNOYW1lU2NvcGUqIGNyZWF0ZShWTSYsIEpTR2xv
YmFsT2JqZWN0KiwgSlNTY29wZSogY3VycmVudFNjb3BlLCBTeW1ib2xUYWJsZSosIEpTVmFsdWUs
IFR5cGUpOwogCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90Vmlz
aXRvciYpOwogICAgIHN0YXRpYyBKU1ZhbHVlIHRvVGhpcyhKU0NlbGwqLCBFeGVjU3RhdGUqLCBF
Q01BTW9kZSk7CiAgICAgc3RhdGljIGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEpTT2JqZWN0Kiwg
RXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBzdGF0aWMgdm9p
ZCBwdXQoSlNDZWxsKiwgRXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lLCBKU1ZhbHVlLCBQdXRQcm9w
ZXJ0eVNsb3QmKTsKIAogICAgIERFQ0xBUkVfSU5GTzsKIAotICAgIEpTVmFsdWUgdmFsdWUoKSBj
b25zdCB7IHJldHVybiBtX3JlZ2lzdGVyU3RvcmUuZ2V0KCk7IH0KKyAgICBKU1ZhbHVlIHZhbHVl
KCkgY29uc3QgeyByZXR1cm4gdmFyaWFibGVBdCgwKS5nZXQoKTsgfQogCiBwcm90ZWN0ZWQ6CiAg
ICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0sIEpTVmFsdWUgdmFsdWUpCiAgICAgewotICAg
ICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIG1fcmVnaXN0ZXJTdG9yZS5z
ZXQodm0sIHRoaXMsIHZhbHVlKTsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb25VbmluaXRp
YWxpemVkKHZtKTsKKyAgICAgICAgdmFyaWFibGVBdCgwKS5zZXQodm0sIHRoaXMsIHZhbHVlKTsK
ICAgICB9CiAKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBPdmVy
cmlkZXNHZXRPd25Qcm9wZXJ0eVNsb3QgfCBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKIAogICAgIEpT
TmFtZVNjb3BlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIEpTU2NvcGUqIG5leHQsIFN5
bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSkKLSAgICAgICAgOiBCYXNlKHZtLCBzdHJ1Y3R1cmUsIHJl
aW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXIqPigmbV9yZWdpc3RlclN0b3JlICsgMSksIG5leHQsIHN5
bWJvbFRhYmxlKQorICAgICAgICA6IEJhc2Uodm0sIHN0cnVjdHVyZSwgbmV4dCwgc3ltYm9sVGFi
bGUpCiAgICAgeworICAgICAgICBBU1NFUlQoc3ltYm9sVGFibGUtPnNjb3BlU2l6ZSgpID09IDEp
OwogICAgIH0KLQotcHJpdmF0ZToKLSAgICBXcml0ZUJhcnJpZXI8VW5rbm93bj4gbV9yZWdpc3Rl
clN0b3JlOwogfTsKIAogfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNT
ZWdtZW50ZWRWYXJpYWJsZU9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSlNTZWdtZW50ZWRWYXJpYWJsZU9iamVjdC5jcHAJKHJldmlzaW9uIDE4
MDUyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU2VnbWVudGVkVmFyaWFi
bGVPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHly
aWdodCAoQykgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMsIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMywzMiArMzMsMzAgQEAK
IAogbmFtZXNwYWNlIEpTQyB7CiAKLWludCBKU1NlZ21lbnRlZFZhcmlhYmxlT2JqZWN0OjpmaW5k
UmVnaXN0ZXJJbmRleCh2b2lkKiByZWdpc3RlckFkZHJlc3MpCitTY29wZU9mZnNldCBKU1NlZ21l
bnRlZFZhcmlhYmxlT2JqZWN0OjpmaW5kUmVnaXN0ZXJJbmRleCh2b2lkKiByZWdpc3RlckFkZHJl
c3MpCiB7CiAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIobV9sb2NrKTsKICAgICAKLSAg
ICBmb3IgKGludCBpID0gbV9yZWdpc3RlcnMuc2l6ZSgpOyBpLS07KSB7CisgICAgZm9yICh1bnNp
Z25lZCBpID0gbV9yZWdpc3RlcnMuc2l6ZSgpOyBpLS07KSB7CiAgICAgICAgIGlmICgmbV9yZWdp
c3RlcnNbaV0gIT0gcmVnaXN0ZXJBZGRyZXNzKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIHJldHVybiBpOworICAgICAgICByZXR1cm4gU2NvcGVPZmZzZXQoaSk7CiAgICAgfQogICAg
IENSQVNIKCk7Ci0gICAgcmV0dXJuIC0xOworICAgIHJldHVybiBTY29wZU9mZnNldCgpOwogfQog
Ci1pbnQgSlNTZWdtZW50ZWRWYXJpYWJsZU9iamVjdDo6YWRkUmVnaXN0ZXJzKGludCBudW1iZXJP
ZlJlZ2lzdGVyc1RvQWRkKQorU2NvcGVPZmZzZXQgSlNTZWdtZW50ZWRWYXJpYWJsZU9iamVjdDo6
YWRkUmVnaXN0ZXJzKHVuc2lnbmVkIG51bWJlck9mUmVnaXN0ZXJzVG9BZGQpCiB7CiAgICAgQ29u
Y3VycmVudEpJVExvY2tlciBsb2NrZXIobV9sb2NrKTsKICAgICAKLSAgICBBU1NFUlQobnVtYmVy
T2ZSZWdpc3RlcnNUb0FkZCA+PSAwKTsKLSAgICAKICAgICBzaXplX3Qgb2xkU2l6ZSA9IG1fcmVn
aXN0ZXJzLnNpemUoKTsKICAgICBtX3JlZ2lzdGVycy5ncm93KG9sZFNpemUgKyBudW1iZXJPZlJl
Z2lzdGVyc1RvQWRkKTsKICAgICAKICAgICBmb3IgKHNpemVfdCBpID0gbnVtYmVyT2ZSZWdpc3Rl
cnNUb0FkZDsgaS0tOykKICAgICAgICAgbV9yZWdpc3RlcnNbb2xkU2l6ZSArIGldLnNldFdpdGhv
dXRXcml0ZUJhcnJpZXIoanNVbmRlZmluZWQoKSk7CiAgICAgCi0gICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4ob2xkU2l6ZSk7CisgICAgcmV0dXJuIFNjb3BlT2Zmc2V0KG9sZFNpemUpOwogfQog
CiB2b2lkIEpTU2VnbWVudGVkVmFyaWFibGVPYmplY3Q6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBj
ZWxsLCBTbG90VmlzaXRvciYgc2xvdFZpc2l0b3IpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU1NlZ21lbnRlZFZhcmlhYmxlT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTZWdtZW50ZWRWYXJpYWJsZU9iamVjdC5oCShy
ZXZpc2lvbiAxODA1MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1NlZ21l
bnRlZFZhcmlhYmxlT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTU3LDI0ICs1NywyMyBAQCBj
bGFzcyBKU1NlZ21lbnRlZFZhcmlhYmxlT2JqZWN0IDogcHVibGljCiBwdWJsaWM6CiAgICAgdHlw
ZWRlZiBKU1N5bWJvbFRhYmxlT2JqZWN0IEJhc2U7CiAKLSAgICBXcml0ZUJhcnJpZXI8VW5rbm93
bj4mIHJlZ2lzdGVyQXQoaW50IGluZGV4KSB7IHJldHVybiBtX3JlZ2lzdGVyc1tpbmRleF07IH0K
KyAgICBXcml0ZUJhcnJpZXI8VW5rbm93bj4mIHZhcmlhYmxlQXQoU2NvcGVPZmZzZXQgb2Zmc2V0
KSB7IHJldHVybiBtX3ZhcmlhYmxlc1tvZmZzZXQub2Zmc2V0KCldOyB9CiAgICAgCiAgICAgLy8g
VGhpcyBpcyBhIHNsb3cgbWV0aG9kIGNhbGwsIHdoaWNoIHNlYXJjaGVzIHRoZSByZWdpc3RlciBi
YW5rIHRvIGZpbmQgdGhlIGluZGV4CiAgICAgLy8gZ2l2ZW4gYSBwb2ludGVyLiBJdCB3aWxsIENS
QVNIKCkgaWYgaXQgZG9lcyBub3QgZmluZCB0aGUgcmVnaXN0ZXIuIE9ubHkgdXNlIHRoaXMKICAg
ICAvLyBpbiBkZWJ1ZyBjb2RlIChsaWtlIGJ5dGVjb2RlIGR1bXBpbmcpLgotICAgIEpTX0VYUE9S
VF9QUklWQVRFIGludCBmaW5kUmVnaXN0ZXJJbmRleCh2b2lkKik7CisgICAgSlNfRVhQT1JUX1BS
SVZBVEUgU2NvcGVPZmZzZXQgZmluZFJlZ2lzdGVySW5kZXgodm9pZCopOwogICAgIAotICAgIFdy
aXRlQmFycmllcjxVbmtub3duPiogYXNzZXJ0UmVnaXN0ZXJJc0luVGhpc09iamVjdChXcml0ZUJh
cnJpZXI8VW5rbm93bj4qIHJlZ2lzdGVyUG9pbnRlcikKKyAgICBXcml0ZUJhcnJpZXI8VW5rbm93
bj4qIGFzc2VydFZhcmlhYmxlSXNJblRoaXNPYmplY3QoV3JpdGVCYXJyaWVyPFVua25vd24+KiB2
YXJpYWJsZVBvaW50ZXIpCiAgICAgewotI2lmICFBU1NFUlRfRElTQUJMRUQKLSAgICAgICAgZmlu
ZFJlZ2lzdGVySW5kZXgocmVnaXN0ZXJQb2ludGVyKTsKLSNlbmRpZgorICAgICAgICBpZiAoIUFT
U0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgIGZpbmRSZWdpc3RlckluZGV4KHJlZ2lzdGVyUG9p
bnRlcik7CiAgICAgICAgIHJldHVybiByZWdpc3RlclBvaW50ZXI7CiAgICAgfQogICAgIAogICAg
IC8vIEFkZHMgbnVtYmVyT2ZSZWdpc3RlcnNUb0FkZCByZWdpc3RlcnMsIGluaXRpYWxpemVzIHRo
ZW0gdG8gVW5kZWZpbmVkLCBhbmQgcmV0dXJucwogICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgZmly
c3Qgb25lIGFkZGVkLgotICAgIEpTX0VYUE9SVF9QUklWQVRFIGludCBhZGRSZWdpc3RlcnMoaW50
IG51bWJlck9mUmVnaXN0ZXJzVG9BZGQpOworICAgIEpTX0VYUE9SVF9QUklWQVRFIFNjb3BlT2Zm
c2V0IGFkZFJlZ2lzdGVycyh1bnNpZ25lZCBudW1iZXJPZlJlZ2lzdGVyc1RvQWRkKTsKICAgICAK
ICAgICBKU19FWFBPUlRfUFJJVkFURSBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCos
IFNsb3RWaXNpdG9yJik7CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pT
U3ltYm9sVGFibGVPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9KU1N5bWJvbFRhYmxlT2JqZWN0LmgJKHJldmlzaW9uIDE4MDUyOSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3ltYm9sVGFibGVPYmplY3QuaAkod29ya2luZyBj
b3B5KQpAQCAtNzgsNyArNzgsNyBAQCBpbmxpbmUgYm9vbCBzeW1ib2xUYWJsZUdldCgKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgIFN5bWJvbFRhYmxlRW50cnk6OkZhc3QgZW50cnkgPSBpdGVy
LT52YWx1ZTsKICAgICBBU1NFUlQoIWVudHJ5LmlzTnVsbCgpKTsKLSAgICBzbG90LnNldFZhbHVl
KG9iamVjdCwgZW50cnkuZ2V0QXR0cmlidXRlcygpIHwgRG9udERlbGV0ZSwgb2JqZWN0LT5yZWdp
c3RlckF0KGVudHJ5LmdldEluZGV4KCkpLmdldCgpKTsKKyAgICBzbG90LnNldFZhbHVlKG9iamVj
dCwgZW50cnkuZ2V0QXR0cmlidXRlcygpIHwgRG9udERlbGV0ZSwgb2JqZWN0LT52YXJpYWJsZUF0
KGVudHJ5LnNjb3BlT2Zmc2V0KCkpLmdldCgpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAt
OTQsNyArOTQsNyBAQCBpbmxpbmUgYm9vbCBzeW1ib2xUYWJsZUdldCgKICAgICBTeW1ib2xUYWJs
ZUVudHJ5OjpGYXN0IGVudHJ5ID0gaXRlci0+dmFsdWU7CiAgICAgQVNTRVJUKCFlbnRyeS5pc051
bGwoKSk7CiAgICAgZGVzY3JpcHRvci5zZXREZXNjcmlwdG9yKAotICAgICAgICBvYmplY3QtPnJl
Z2lzdGVyQXQoZW50cnkuZ2V0SW5kZXgoKSkuZ2V0KCksIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSB8
IERvbnREZWxldGUpOworICAgICAgICBvYmplY3QtPnZhcmlhYmxlQXQoZW50cnkuc2NvcGVPZmZz
ZXQoKSkuZ2V0KCksIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSB8IERvbnREZWxldGUpOwogICAgIHJl
dHVybiB0cnVlOwogfQogCkBAIC0xMTAsNyArMTEwLDcgQEAgaW5saW5lIGJvb2wgc3ltYm9sVGFi
bGVHZXQoCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBTeW1ib2xUYWJsZUVudHJ5OjpGYXN0
IGVudHJ5ID0gaXRlci0+dmFsdWU7CiAgICAgQVNTRVJUKCFlbnRyeS5pc051bGwoKSk7Ci0gICAg
c2xvdC5zZXRWYWx1ZShvYmplY3QsIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSB8IERvbnREZWxldGUs
IG9iamVjdC0+cmVnaXN0ZXJBdChlbnRyeS5nZXRJbmRleCgpKS5nZXQoKSk7CisgICAgc2xvdC5z
ZXRWYWx1ZShvYmplY3QsIGVudHJ5LmdldEF0dHJpYnV0ZXMoKSB8IERvbnREZWxldGUsIG9iamVj
dC0+dmFyaWFibGVBdChlbnRyeS5zY29wZU9mZnNldCgpKS5nZXQoKSk7CiAgICAgc2xvdElzV3Jp
dGVhYmxlID0gIWVudHJ5LmlzUmVhZE9ubHkoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTE0
NSw3ICsxNDUsNyBAQCBpbmxpbmUgYm9vbCBzeW1ib2xUYWJsZVB1dCgKICAgICAgICAgICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzQ2MDEKICAgICAgICAg
ICAgIHNldC0+bm90aWZ5V3JpdGUodm0sIHZhbHVlLCBvYmplY3QsIHByb3BlcnR5TmFtZSk7CiAg
ICAgICAgIH0KLSAgICAgICAgcmVnID0gJm9iamVjdC0+cmVnaXN0ZXJBdChmYXN0RW50cnkuZ2V0
SW5kZXgoKSk7CisgICAgICAgIHJlZyA9ICZvYmplY3QtPnZhcmlhYmxlQXQoZmFzdEVudHJ5LnNj
b3BlT2Zmc2V0KCkpOwogICAgIH0KICAgICAvLyBJJ2QgcHJlZmVyIHdlIG5vdCBob2xkIGxvY2sg
d2hpbGUgZXhlY3V0aW5nIGJhcnJpZXJzLCBzaW5jZSBJIHByZWZlciB0byByZXNlcnZlCiAgICAg
Ly8gdGhlIHJpZ2h0IGZvciBiYXJyaWVycyB0byBiZSBhYmxlIHRvIHRyaWdnZXIgR0MuIEFuZCBJ
IGRvbid0IHdhbnQgdG8gaG9sZCBWTQpAQCAtMTczLDcgKzE3Myw3IEBAIGlubGluZSBib29sIHN5
bWJvbFRhYmxlUHV0V2l0aEF0dHJpYnV0ZXMKICAgICAgICAgaWYgKFZhcmlhYmxlV2F0Y2hwb2lu
dFNldCogc2V0ID0gZW50cnkud2F0Y2hwb2ludFNldCgpKQogICAgICAgICAgICAgc2V0LT5ub3Rp
ZnlXcml0ZSh2bSwgdmFsdWUsIG9iamVjdCwgcHJvcGVydHlOYW1lKTsKICAgICAgICAgZW50cnku
c2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICAgICAgcmVnID0gJm9iamVjdC0+cmVnaXN0
ZXJBdChlbnRyeS5nZXRJbmRleCgpKTsKKyAgICAgICAgcmVnID0gJm9iamVjdC0+dmFyaWFibGVB
dChlbnRyeS5zY29wZU9mZnNldCgpKTsKICAgICB9CiAgICAgcmVnLT5zZXQodm0sIG9iamVjdCwg
dmFsdWUpOwogICAgIHJldHVybiB0cnVlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvT3V0T2ZCYW5kQXJndW1lbnRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9PdXRPZkJhbmRBcmd1bWVudHMuY3BwCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3V0T2ZCYW5kQXJndW1lbnRzLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiT3V0T2ZC
YW5kQXJndW1lbnRzLmgiCisKKyNpbmNsdWRlICJKU0FyZ3VtZW50c0l0ZXJhdG9yLmgiCisjaW5j
bHVkZSAiSlNDSW5saW5lcy5oIgorCituYW1lc3BhY2UgSlNDIHsKKworU1RBVElDX0FTU0VSVF9J
U19UUklWSUFMTFlfREVTVFJVQ1RJQkxFKE91dE9mQmFuZEFyZ3VtZW50cyk7CisKK2NvbnN0IENs
YXNzSW5mbyBPdXRPZkJhbmRBcmd1bWVudHM6OnNfaW5mbyA9IHsgIkFyZ3VtZW50cyIsICZCYXNl
OjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoT3V0T2ZCYW5kQXJndW1lbnRzKSB9Owor
CitPdXRPZkJhbmRBcmd1bWVudHM6Ok91dE9mQmFuZEFyZ3VtZW50cyhWTSYgdm0sIFN0cnVjdHVy
ZSogc3RydWN0dXJlKQorICAgIDogQmFzZSh2bSwgc3RydWN0dXJlLCBudWxscHRyKQoreworfQor
CitPdXRPZkJhbmRBcmd1bWVudHMqIE91dE9mQmFuZEFyZ3VtZW50czo6Y3JlYXRlRW1wdHkoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQoreworICAgIE91dE9mQmFuZEFyZ3Vt
ZW50cyogcmVzdWx0ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8T3V0T2ZCYW5kQXJndW1l
bnRzPih2bS5oZWFwKSkKKyAgICAgICAgT3V0T2ZCYW5kQXJndW1lbnRzKHZtLCBnbG9iYWxPYmpl
Y3QtPm91dE9mQmFuZEFyZ3VtZW50c1N0cnVjdHVyZSgpKTsKKyAgICByZXN1bHQtPmZpbmlzaENy
ZWF0aW9uKHZtKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitPdXRPZkJhbmRBcmd1bWVudHMq
IE91dE9mQmFuZEFyZ3VtZW50czo6Y3JlYXRlRW1wdHkoRXhlY1N0YXRlKiBleGVjKQoreworICAg
IC8vIE5CLiBTb21lIGNsaWVudHMgbWlnaHQgZXhwZWN0IHRoYXQgdGhlIGdsb2JhbCBvYmplY3Qg
b2Ygb2YgdGhpcyBvYmplY3QgaXMgdGhlIGdsb2JhbCBvYmplY3QKKyAgICAvLyBvZiB0aGUgY2Fs
bGVlLiBXZSBkb24ndCBkbyB0aGlzIGZvciBub3csIGJ1dCBtYXliZSB3ZSBzaG91bGQuCisgICAg
cmV0dXJuIGNyZWF0ZUVtcHR5KGV4ZWMtPnZtKCksIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3Qo
KSk7Cit9CisKK091dE9mQmFuZEFyZ3VtZW50cyogT3V0T2ZCYW5kQXJndW1lbnRzOjpjcmVhdGVX
aXRoSW5saW5lRnJhbWUoRXhlY1N0YXRlKiBteUZyYW1lLCBFeGVjU3RhdGUqIHRhcmdldEZyYW1l
LCBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSwgQXJndW1lbnRzTW9kZSBtb2RlKQor
eworICAgIFZNJiB2bSA9IG15RnJhbWUtPnZtKCk7CisgICAgCisgICAgSlNGdW5jdGlvbiogY2Fs
bGVlOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZTsKKyAgICAKKyAgICBpZiAo
aW5saW5lQ2FsbEZyYW1lKSB7CisgICAgICAgIGNhbGxlZSA9IGpzQ2FzdDxKU0Z1bmN0aW9uKj4o
aW5saW5lQ2FsbEZyYW1lLT5jYWxsZWVSZWNvdmVyeS5yZWNvdmVyKHRhcmdldEZyYW1lKSk7Cisg
ICAgICAgIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oaW5saW5lQ2Fs
bEZyYW1lLT5leGVjdXRhYmxlLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWxsZWUg
PSBqc0Nhc3Q8SlNGdW5jdGlvbio+KHRhcmdldEZyYW1lLT5jYWxsZWUoKSk7CisgICAgICAgIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGFyZ2V0RnJhbWUtPmNvZGVC
bG9jaygpLT5vd25lckV4ZWN1dGFibGUoKSk7CisgICAgfQorICAgIAorICAgIC8vIE5CLiBJdCdz
IHNvbWV3aGF0IGFyYml0cmFyeSB0aGF0IHdlIHRpZSB0aGUgc3RyaWN0bmVzcyBvZiB0aGlzIG9i
amVjdCB0byB0aGUgc3RyaWN0bmVzcyBvZgorICAgIC8vIHRoZSBjYWxsZWUuCisgICAgYm9vbCBp
c1N0cmljdE1vZGUgPSBleGVjdXRhYmxlLT5pc1N0cmljdE1vZGUoKTsKKworICAgIE91dE9mQmFu
ZEFyZ3VtZW50cyogcmVzdWx0ID0gY3JlYXRlRW1wdHkobXlGcmFtZSk7CisgICAgCisgICAgdW5z
aWduZWQgbGVuZ3RoOworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgQ2xvbmVkQXJndW1l
bnRzQ3JlYXRpb25Nb2RlOiB7CisgICAgICAgIGlmIChpbmxpbmVDYWxsRnJhbWUpIHsKKyAgICAg
ICAgICAgIGlmIChpbmxpbmVDYWxsRnJhbWUtPmFyZ3VtZW50Q291bnRSZWdpc3Rlci5pc1ZhbGlk
KCkpCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gZXhlYy0+cihpbmxpbmVDYWxsRnJhbWUtPmFy
Z3VtZW50Q291bnRSZWdpc3RlcikudW5ib3hlZEludDMyKCk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgbGVuZ3RoID0gaW5saW5lQ2FsbEZyYW1lLT5hcmd1bWVudHMuc2l6ZSgp
OworICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IGxlbmd0aDsgaS0tOykKKyAgICAgICAgICAgICAgICByZXN1bHQtPnB1dERp
cmVjdEluZGV4KG15RnJhbWUsIGksIGlubGluZUNhbGxGcmFtZS0+YXJndW1lbnRzW2ldLnJlY292
ZXIodGFyZ2V0RnJhbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbmd0aCA9
IHRhcmdldEZyYW1lLT5hcmd1bWVudENvdW50KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IGxlbmd0aDsgaS0tOykKKyAgICAgICAgICAgICAgICByZXN1bHQt
PnB1dERpcmVjdEluZGV4KG15RnJhbWUsIGksIHRhcmdldEZyYW1lLT51bmNoZWNrZWRBcmd1bWVu
dChpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICAgICAKKyAgICBj
YXNlIEZha2VBcmd1bWVudFZhbHVlc0NyZWF0aW9uTW9kZTogeworICAgICAgICBsZW5ndGggPSAw
OworICAgICAgICBicmVhazsKKyAgICB9IH0KKyAgICAKKyAgICByZXN1bHQtPnB1dERpcmVjdCh2
bSwgdm0ucHJvcGVydHlOYW1lcy0+bGVuZ3RoLCBqc051bWJlcihsZW5ndGgpKTsKKyAgICBpZiAo
aXNTdHJpY3RNb2RlKSB7CisgICAgICAgIHJlc3VsdC0+cHV0RGlyZWN0QWNjZXNzb3IoZXhlYywg
dm0ucHJvcGVydHlOYW1lcy0+Y2FsbGVlLCB0aGlzT2JqZWN0LT5nbG9iYWxPYmplY3QoKS0+dGhy
b3dUeXBlRXJyb3JHZXR0ZXJTZXR0ZXIoZXhlYy0+dm0oKSksIERvbnREZWxldGUgfCBEb250RW51
bSB8IEFjY2Vzc29yKTsKKyAgICAgICAgcmVzdWx0LT5wdXREaXJlY3RBY2Nlc3NvcihleGVjLCB2
bS5wcm9wZXJ0eU5hbWVzLT5jYWxsZWUsIHRoaXNPYmplY3QtPmdsb2JhbE9iamVjdCgpLT50aHJv
d1R5cGVFcnJvckdldHRlclNldHRlcihleGVjLT52bSgpKSwgRG9udERlbGV0ZSB8IERvbnRFbnVt
IHwgQWNjZXNzb3IpOworICAgIH0gZWxzZQorICAgICAgICByZXN1bHQtPnB1dERpcmVjdCh2bSwg
dm0ucHJvcGVydHlOYW1lcy0+Y2FsbGVlLCBKU1ZhbHVlKGNhbGxlZSkpOworICAgIAorICAgIHJl
c3VsdC0+SlNDX05BVElWRV9GVU5DVElPTih2bS5wcm9wZXJ0eU5hbWVzLT5pdGVyYXRvclByaXZh
dGVOYW1lLCBhcmd1bWVudHNGdW5jSXRlcmF0b3IsIERvbnRFbnVtLCAwKTsKK30KKworT3V0T2ZC
YW5kQXJndW1lbnRzKiBPdXRPZkJhbmRBcmd1bWVudHM6OmNyZWF0ZVdpdGhNYWNoaW5lRnJhbWUo
RXhlY1N0YXRlKiBteUZyYW1lLCBFeGVjU3RhdGUqIHRhcmdldEZyYW1lLCBBcmd1bWVudHNNb2Rl
IG1vZGUpCit7CisgICAgcmV0dXJuIGNyZWF0ZVdpdGhJbmxpbmVGcmFtZShteUZyYW1lLCB0YXJn
ZXRGcmFtZSwgbnVsbHB0ciwgbW9kZSk7Cit9CisKK1N0cnVjdHVyZSogT3V0T2ZCYW5kQXJndW1l
bnRzOjpjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
LCBKU1ZhbHVlIHByb3RvdHlwZSkKK3sKKyAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIEpTQworCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9PdXRPZkJhbmRBcmd1bWVudHMuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PdXRPZkJhbmRBcmd1bWVudHMuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL091dE9mQmFuZEFyZ3Vt
ZW50cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBPdXRPZkJhbmRBcmd1bWVudHNf
aAorI2RlZmluZSBPdXRPZkJhbmRBcmd1bWVudHNfaAorCisjaW5jbHVkZSAiQXJndW1lbnRzTW9k
ZS5oIgorI2luY2x1ZGUgIkpTT2JqZWN0LmgiCisKK25hbWVzcGFjZSBKU0MgeworCisvLyBUaGlz
IGlzIGFuIEFyZ3VtZW50cy1jbGFzcyBvYmplY3QgdGhhdCB3ZSBjcmVhdGUgd2hlbiB5b3UgZG8g
ZnVuY3Rpb24uYXJndW1lbnRzLiBJdCBiZWhhdmVzCisvLyBlbnRpcmVseSBsaWtlIGFuIG9yZGlu
YXJ5IEphdmFTY3JpcHQgb2JqZWN0LiBBbGwgb2YgdGhlIGFyZ3VtZW50cyB2YWx1ZXMgYXJlIHNp
bXBseSBjb3BpZWQgZnJvbQorLy8gdGhlIHN0YWNrIChwb3NzaWJseSB2aWEgc29tZSBzb3BoaXN0
aWNhdGVkIFZhbHVlUmVjb3ZlcnkncyBpZiBhbiBvcHRpbWl6aW5nIGNvbXBpbGVyIGlzIGluCisv
LyBwbGF5KSBhbmQgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBhcmUg
cG9wdWxhdGVkLiBUaGUgb25seSByZWFzb24gd2h5IHdlIG5lZWQKKy8vIGEgc3BlY2lhbCBjbGFz
cyBpcyB0byBtYWtlIHRoZSBvYmplY3QgY2xhaW0gdG8gYmUgIkFyZ3VtZW50cyIgZnJvbSBhIHRv
U3RyaW5nIHN0YW5kcG9pbnQuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBhIGJh
ZCBqb2Igb2YgYmVpbmcgZmFzdC4gVGhhdCdzIHNvbWV3aGF0IGludGVudGlvbmFsLiBXZSBleHBl
Y3QgdXNlcworLy8gb2YgZnVuY3Rpb24uYXJndW1lbnRzIHRvIGJlIHJhcmUgb24gdGhlIG1vZGVy
biB3ZWIuIFlvdSB3aWxsIGdldCBwYXJ0aWN1bGFybHkgYmFkIHBlcmZvcm1hbmNlCisvLyBpZiB5
b3UgdXNlIGZ1bmN0aW9uLmFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZS4KK2NsYXNzIE91dE9mQmFu
ZEFyZ3VtZW50cyA6IHB1YmxpYyBKU05vbkZpbmFsT2JqZWN0IHsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIEpTTm9uRmluYWxPYmplY3QgQmFzZTsKKyAgICAKK3ByaXZhdGU6CisgICAgT3V0T2ZCYW5k
QXJndW1lbnRzKFZNJiwgU3RydWN0dXJlKik7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgT3V0T2ZC
YW5kQXJndW1lbnRzKiBjcmVhdGVFbXB0eShWTSYsIEpTR2xvYmFsT2JqZWN0Kik7CisgICAgc3Rh
dGljIE91dE9mQmFuZEFyZ3VtZW50cyogY3JlYXRlRW1wdHkoRXhlY1N0YXRlKik7CisgICAgc3Rh
dGljIE91dE9mQmFuZEFyZ3VtZW50cyogY3JlYXRlV2l0aElubGluZUZyYW1lKEV4ZWNTdGF0ZSog
bXlGcmFtZSwgRXhlY1N0YXRlKiB0YXJnZXRGcmFtZSwgSW5saW5lQ2FsbEZyYW1lKiwgQXJndW1l
bnRzTW9kZSk7CisgICAgc3RhdGljIE91dE9mQmFuZEFyZ3VtZW50cyogY3JlYXRlV2l0aE1hY2hp
bmVGcmFtZShFeGVjU3RhdGUqIG15RnJhbWUsIEV4ZWNTdGF0ZSogdGFyZ2V0RnJhbWUsIEFyZ3Vt
ZW50c01vZGUpOworICAgIAorICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShW
TSYsIEpTR2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSBwcm90b3R5cGUpOworICAgIAorICAgIERFQ0xB
UkVfSU5GTzsKK307CisKK30gLy8gbmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gT3V0T2ZCYW5k
QXJndW1lbnRzX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2NvcGVP
ZmZzZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Nj
b3BlT2Zmc2V0LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1Njb3BlT2Zmc2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJTY29wZU9mZnNldC5oIgorCituYW1lc3BhY2UgSlNDIHsKKwordm9p
ZCBTY29wZU9mZnNldDo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAoreworICAgIGlmICgh
KnRoaXMpIHsKKyAgICAgICAgb3V0LnByaW50KCJzY29wZUludmFsaWQiKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICAKKyAgICBvdXQucHJpbnQoInNjb3BlIiwgb2Zmc2V0KCkpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBKU0MKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvU2NvcGVPZmZzZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9TY29wZU9mZnNldC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvU2NvcGVPZmZzZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgU2Nv
cGVPZmZzZXRfaAorI2RlZmluZSBTY29wZU9mZnNldF9oCisKKyNpbmNsdWRlICJHZW5lcmljT2Zm
c2V0LmgiCisjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CisKK25hbWVzcGFjZSBKU0Mgewor
CisvLyBUaGlzIGlzIGFuIG9mZnNldCBpbnRvIGEgc2NvcGUgb2Ygc29tZSBraW5kLiBJdCBjb3Vs
ZCBiZSBhbiBhY3RpdmF0aW9uIHNjb3BlIG9yIGl0IGNvdWxkIGJlIGEKKy8vIGdsb2JhbCBvYmpl
Y3QuCitjbGFzcyBTY29wZU9mZnNldCA6IHB1YmxpYyBHZW5lcmljT2Zmc2V0PFNjb3BlT2Zmc2V0
PiB7CitwdWJsaWM6CisgICAgU2NvcGVPZmZzZXQoKSB7IH0KKyAgICAKKyAgICBleHBsaWNpdCBT
Y29wZU9mZnNldCh1bnNpZ25lZCBvZmZzZXQpCisgICAgICAgIDogR2VuZXJpY09mZnNldChvZmZz
ZXQpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25z
dDsKK307CisKK30gLy8gbmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gU2NvcGVPZmZzZXRfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TY29wZWRBcmd1bWVudHMuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TY29wZWRBcmd1bWVu
dHMuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Njb3Bl
ZEFyZ3VtZW50cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBTY29wZWRBcmd1bWVu
dHNfaAorI2RlZmluZSBTY29wZWRBcmd1bWVudHNfaAorCisjaW5jbHVkZSAiSlNPYmplY3QuaCIK
KworbmFtZXNwYWNlIEpTQyB7CisKKy8vIFRoaXMgaXMgYW4gQXJndW1lbnRzLWNsYXNzIG9iamVj
dCB0aGF0IHdlIGNyZWF0ZSB3aGVuIHlvdSBzYXkgImFyZ3VtZW50cyIgaW5zaWRlIGEgZnVuY3Rp
b24sCisvLyBhbmQgb25lIG9yIG1vcmUgb2YgdGhlIGFyZ3VtZW50cyBtYXkgYmUgY2FwdHVyZWQg
aW4gdGhlIGZ1bmN0aW9uJ3MgYWN0aXZhdGlvbi4gVGhlIGZ1bmN0aW9uCisvLyB3aWxsIGNvcHkg
YWxsIG9mIGl0cyBhcmd1bWVudHMgaW50byB0aGUgYWN0aXZhdGlvbiBhbmQgdGhlbiBjcmVhdGUg
dGhpcyBvYmplY3QuIFRoaXMgb2JqZWN0CisvLyB3aWxsIHVzZSB0aGUgc3ltYm9sIHRhYmxlJ3Mg
U2NvcGVkQXJndW1lbnRzVGFibGUgYW5kIHRoZSBhY3RpdmF0aW9uIHRvIGhhbmRsZSBhbGwgaW5k
ZXhlZAorLy8gbG9va3Vwcy4KK2NsYXNzIFNjb3BlZEFyZ3VtZW50cyA6IHB1YmxpYyBKU05vbkZp
bmFsT2JqZWN0IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEpTTm9uRmluYWxPYmplY3QgQmFzZTsK
KworcHJpdmF0ZToKKyAgICBTY29wZWRBcmd1bWVudHMoVk0mLCBTdHJ1Y3R1cmUqKTsKKworcHVi
bGljOgorICAgIHN0YXRpYyBTY29wZWRBcmd1bWVudHMqIGNyZWF0ZShWTSYsIFN0cnVjdHVyZSos
IFNjb3BlZEFyZ3VtZW50c1RhYmxlKiwgSlNMZXhpY2FsRW52aXJvbm1lbnQqKTsKKyAgICAKKyAg
ICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CisgICAg
CisgICAgdWludDMyX3QgbGVuZ3RoKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChVTkxJS0VMWShtX292ZXJyb2RlTGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiBn
ZXQoZXhlYywgZXhlYy0+cHJvcGVydHlOYW1lcygpLmxlbmd0aCkudG9VSW50MzIoZXhlYyk7Cisg
ICAgICAgIHJldHVybiBtX3RhYmxlLT5sZW5ndGgoKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBj
YW5HZXRJbmRleFF1aWNrbHkodWludDMyX3QgaSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBpIDwgbV9sZW5ndGggJiYgISFtX3RhYmxlLT5nZXQoaSk7CisgICAgfQorICAgIAorICAgIEpT
VmFsdWUgZ2V0SW5kZXhRdWlja2x5KHVpbnQzMl90IGkpIGNvbnN0CisgICAgeworICAgICAgICBB
U1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihjYW5HZXRJbmRleFF1aWNrbHkoaSkpOwor
ICAgICAgICByZXR1cm4gbV9zY29wZS0+dmFyaWFibGVBdChtX3RhYmxlLT5nZXQoaSkpLmdldCgp
OworICAgIH0KKworICAgIERFQ0xBUkVfSU5GTzsKKyAgICAKKyAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJvdG90eXBl
KTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoSlNPYmpl
Y3QqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOworICAgIHN0YXRp
YyBib29sIGdldE93blByb3BlcnR5U2xvdEJ5SW5kZXgoSlNPYmplY3QqLCBFeGVjU3RhdGUqLCB1
bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyB2b2lkIGdl
dE93blByb3BlcnR5TmFtZXMoSlNPYmplY3QqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWVBcnJh
eSYsIEVudW1lcmF0aW9uTW9kZSk7CisgICAgc3RhdGljIHZvaWQgcHV0KEpTQ2VsbCosIEV4ZWNT
dGF0ZSosIFByb3BlcnR5TmFtZSwgSlNWYWx1ZSwgUHV0UHJvcGVydHlTbG90Jik7CisgICAgc3Rh
dGljIHZvaWQgcHV0QnlJbmRleChKU0NlbGwqLCBFeGVjU3RhdGUqLCB1bnNpZ25lZCBwcm9wZXJ0
eU5hbWUsIEpTVmFsdWUsIGJvb2wgc2hvdWxkVGhyb3cpOworICAgIHN0YXRpYyB2b2lkIGRlbGV0
ZVByb3BlcnR5KEpTQ2VsbCosIEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSk7CisgICAgc3RhdGlj
IHZvaWQgZGVsZXRlUHJvcGVydHlCeUluZGV4KEpTQ2VsbCosIEV4ZWNTdGF0ZSosIHVuc2lnbmVk
IHByb3BlcnR5TmFtZSk7CisgICAgc3RhdGljIHZvaWQgZGVmaW5lT3duUHJvcGVydHkoSlNPYmpl
Y3QqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5RGVzY3JpcHRvciYs
IGJvb2wgc2hvdWxkVGhyb3cpOworICAgIAorICAgIHZvaWQgb3ZlcnJpZGVBcmd1bWVudChWTSYg
dm0sIHVpbnQzMl90IGkpCisgICAgeworICAgICAgICBtX3RhYmxlLnNldCh2bSwgdGhpcywgbV90
YWJsZS0+c2V0KHZtLCBpLCBTY29wZU9mZnNldCgpKSk7CisgICAgfQorICAgIAorICAgIGJvb2wg
bV9vdmVycm9kZUxlbmd0aDsKKyAgICBXcml0ZUJhcnJpZXI8U2NvcGVkQXJndW1lbnRzVGFibGU+
IG1fdGFibGU7CisgICAgV3JpdGVCYXJyaWVyPEpTTGV4aWNhbEVudmlyb25tZW50PiBtX3Njb3Bl
OworfTsKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZiAvLyBTY29wZWRBcmd1bWVudHNf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TY29wZWRBcmd1bWVudHNU
YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Njb3Bl
ZEFyZ3VtZW50c1RhYmxlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9TY29wZWRBcmd1bWVudHNUYWJsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBTY29wZWRBcmd1bWVudHNUYWJsZV9oCisjZGVmaW5lIFNjb3BlZEFyZ3VtZW50c1RhYmxl
X2gKKworI2luY2x1ZGUgIkpTQ2VsbC5oIgorCituYW1lc3BhY2UgSlNDIHsKKworLy8gVGhpcyBj
bGFzcydzIG9ubHkgam9iIGlzIHRvIGhvbGQgb250byB0aGUgbGlzdCBvZiBTY29wZU9mZnNldHMg
Zm9yIGVhY2ggYXJndW1lbnQgdGhhdCBhCisvLyBmdW5jdGlvbiBoYXMuIE1vc3Qgb2YgdGhlIHRp
bWUsIHRoZSBCeXRlY29kZUdlbmVyYXRvciB3aWxsIGNyZWF0ZSBvbmUgb2YgdGhlc2UgYW5kIGl0
IHdpbGwKKy8vIG5ldmVyIGJlIG1vZGlmaWVkIHN1YnNlcXVlbnRseS4gVGhlcmUgaXMgYSByYXJl
IGNhc2Ugd2hlcmUgYSBTY29wZWRBcmd1bWVudHMgb2JqZWN0IGlzIGNyZWF0ZWQKKy8vIGFuZCBh
bGlhc2VzIG9uZSBvZiB0aGVzZSBhbmQgdGhlbiBkZWNpZGVzIHRvIG1vZGlmeSBpdDsgaW4gdGhh
dCBjYXNlIHdlIGRvIGNvcHktb24td3JpdGUuIFRoaXMKKy8vIG1ha2VzIHNlbnNlIGJlY2F1c2Ug
c3VjaCBtb2RpZmljYXRpb25zIGFyZSBzbyB1bmNvbW1vbi4gWW91J2QgaGF2ZSB0byBkbyBzb21l
dGhpbmcgY3JhenkgbGlrZQorLy8gImRlbGV0ZSBhcmd1bWVudHNbaV0iIG9yIHNvbWUgdmFyaWFu
dCBvZiBkZWZpbmVPd25Qcm9wZXJ0eS4KK2NsYXNzIFNjb3BlZEFyZ3VtZW50cyA6IHB1YmxpYyBK
U0NlbGwgeworcHVibGljOgorICAgIHR5cGVkZWYgSlNDZWxsIEJhc2U7CisgICAgCisgICAgc3Rh
dGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7CisgICAgc3RhdGljIGNvbnN0
IGJvb2wgaGFzSW1tb3J0YWxTdHJ1Y3R1cmUgPSB0cnVlOworCitwcml2YXRlOgorICAgIFNjb3Bl
ZEFyZ3VtZW50c1RhYmxlKFZNJik7CisgICAgflNjb3BlZEFyZ3VtZW50c1RhYmxlKCk7CisKK3B1
YmxpYzoKKyAgICBzdGF0aWMgU2NvcGVkQXJndW1lbnRzVGFibGUqIGNyZWF0ZShWTSYpOworICAg
IAorICAgIFNjb3BlZEFyZ3VtZW50cyogY2xvbmUoVk0mKTsKKyAgICAKKyAgICB1aW50MzJfdCBs
ZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfQorICAgIFNjb3BlZEFyZ3VtZW50c1Rh
YmxlKiBzZXRMZW5ndGgoVk0mLCB1aW50MzJfdCBuZXdMZW5ndGgpOworICAgIAorICAgIFNjb3Bl
T2Zmc2V0IGdldCh1aW50MzJfdCBpKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhf
U0VDVVJJVFlfSU1QTElDQVRJT04oaSA8IG1fbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG1fYXJn
dW1lbnRzW2ldOworICAgIH0KKyAgICAKKyAgICB2b2lkIGxvY2soKQorICAgIHsKKyAgICAgICAg
bV9sb2NrZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBTY29wZWRBcmd1bWVudHMqIHNldChW
TSYgdm0sIHVpbnQzMl90IGksIFNjb3BlT2Zmc2V0IHZhbHVlKQorICAgIHsKKyAgICAgICAgU2Nv
cGVkQXJndW1lbnRzKiByZXN1bHQ7CisgICAgICAgIGlmIChVTkxJS0VMWShtX2xvY2tlZCkpCisg
ICAgICAgICAgICByZXN1bHQgPSBjbG9uZSh2bSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHJlc3VsdCA9IHRoaXM7CisgICAgICAgIHJlc3VsdC0+c2V0RGlyZWN0KGksIHZhbHVlKTsKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgREVDTEFSRV9JTkZPOworCitw
cml2YXRlOgorICAgIHVpbnQzMl90IG1fbGVuZ3RoOworICAgIGJvb2wgbV9sb2NrZWQ7IC8vIEJl
aW5nIGxvY2tlZCBtZWFucyB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIHRo
aXMgb2JqZWN0IGFuZCBub25lIG9mIHRoZW0gZXhwZWN0IHRvIHNlZSB0aGUgb3RoZXJzJyBtb2Rp
ZmljYXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgbW9kaWZpY2F0aW9ucyBuZWVkIHRvIG1ha2UgYSBj
b3B5IGZpcnN0LgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTY29wZU9mZnNldFtdPiBtX2FyZ3VtZW50
czsKK307CisKK30gLy8gbmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gU2NvcGVkQXJndW1lbnRz
VGFibGVfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TeW1ib2xUYWJs
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3ltYm9s
VGFibGUuY3BwCShyZXZpc2lvbiAxODA1MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9TeW1ib2xUYWJsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgot
ICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxNCwgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEzNywyOSAr
MTM3LDIyIEBAIHZvaWQgU3ltYm9sVGFibGU6OldhdGNocG9pbnRDbGVhbnVwOjpmaW4KICAgICB9
CiB9CiAKLVN5bWJvbFRhYmxlKiBTeW1ib2xUYWJsZTo6Y2xvbmVDYXB0dXJlZE5hbWVzKFZNJiB2
bSkKK1N5bWJvbFRhYmxlKiBTeW1ib2xUYWJsZTo6Y2xvbmVTY29wZVBhcnQoVk0mIHZtKQogewog
ICAgIFN5bWJvbFRhYmxlKiByZXN1bHQgPSBTeW1ib2xUYWJsZTo6Y3JlYXRlKHZtKTsKICAgICAK
LSAgICByZXN1bHQtPm1fcGFyYW1ldGVyQ291bnRJbmNsdWRpbmdUaGlzID0gbV9wYXJhbWV0ZXJD
b3VudEluY2x1ZGluZ1RoaXM7CiAgICAgcmVzdWx0LT5tX3VzZXNOb25TdHJpY3RFdmFsID0gbV91
c2VzTm9uU3RyaWN0RXZhbDsKLSAgICByZXN1bHQtPm1fY2FwdHVyZVN0YXJ0ID0gbV9jYXB0dXJl
U3RhcnQ7Ci0gICAgcmVzdWx0LT5tX2NhcHR1cmVFbmQgPSBtX2NhcHR1cmVFbmQ7CiAKICAgICBm
b3IgKGF1dG8gaXRlciA9IG1fbWFwLmJlZ2luKCksIGVuZCA9IG1fbWFwLmVuZCgpOyBpdGVyICE9
IGVuZDsgKytpdGVyKSB7Ci0gICAgICAgIGlmICghaXNDYXB0dXJlZChpdGVyLT52YWx1ZS5nZXRJ
bmRleCgpKSkKKyAgICAgICAgaWYgKCFpdGVyLT52YWx1ZS52YXJPZmZzZXQoKS5pc1Njb3BlKCkp
CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgcmVzdWx0LT5tX21hcC5hZGQoCiAgICAg
ICAgICAgICBpdGVyLT5rZXksCi0gICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5KGl0ZXItPnZh
bHVlLmdldEluZGV4KCksIGl0ZXItPnZhbHVlLmdldEF0dHJpYnV0ZXMoKSkpOworICAgICAgICAg
ICAgU3ltYm9sVGFibGVFbnRyeShpdGVyLT52YWx1ZS52YXJPZmZzZXQoKSwgaXRlci0+dmFsdWUu
Z2V0QXR0cmlidXRlcygpKSk7CiAgICAgfQogICAgIAotICAgIGlmIChtX3Nsb3dBcmd1bWVudHMp
IHsKLSAgICAgICAgcmVzdWx0LT5tX3Nsb3dBcmd1bWVudHMgPSBzdGQ6Om1ha2VfdW5pcXVlPFNs
b3dBcmd1bWVudFtdPihwYXJhbWV0ZXJDb3VudCgpKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gcGFyYW1ldGVyQ291bnQoKTsgaS0tOykKLSAgICAgICAgICAgIHJlc3VsdC0+bV9zbG93QXJn
dW1lbnRzW2ldID0gbV9zbG93QXJndW1lbnRzW2ldOwotICAgIH0KLQorICAgIHJlc3VsdC0+bV9h
cmd1bWVudHMgPSBhcmd1bWVudHMoKTsKKyAgICAKICAgICBpZiAobV90eXBlUHJvZmlsaW5nUmFy
ZURhdGEpIHsKICAgICAgICAgcmVzdWx0LT5tX3R5cGVQcm9maWxpbmdSYXJlRGF0YSA9IHN0ZDo6
bWFrZV91bmlxdWU8VHlwZVByb2ZpbGluZ1JhcmVEYXRhPigpOwogCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9TeW1ib2xUYWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL1N5bWJvbFRhYmxlLmgJKHJldmlzaW9uIDE4MDUyOSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N5bWJvbFRhYmxlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDEy
LTIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDA3LCAyMDA4LCAyMDEyLTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRl
ICJDb25jdXJyZW50SklUTG9jay5oIgogI2luY2x1ZGUgIkpTT2JqZWN0LmgiCisjaW5jbHVkZSAi
U2NvcGVkQXJndW1lbnRzVGFibGUuaCIKICNpbmNsdWRlICJUeXBlTG9jYXRpb24uaCIKICNpbmNs
dWRlICJWYXJpYWJsZVdhdGNocG9pbnRTZXQuaCIKICNpbmNsdWRlIDxtZW1vcnk+CkBAIC0zOSwy
NCArNDAsNiBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAotc3RydWN0IFNsb3dBcmd1bWVudCB7Ci1w
dWJsaWM6Ci0gICAgZW51bSBTdGF0dXMgewotICAgICAgICBOb3JtYWwgPSAwLAotICAgICAgICBD
YXB0dXJlZCA9IDEsCi0gICAgICAgIERlbGV0ZWQgPSAyCi0gICAgfTsKLQotICAgIFNsb3dBcmd1
bWVudCgpCi0gICAgICAgIDogc3RhdHVzKE5vcm1hbCkKLSAgICAgICAgLCBpbmRleCgwKQotICAg
IHsKLSAgICB9Ci0KLSAgICBTdGF0dXMgc3RhdHVzOwotICAgIGludCBpbmRleDsgLy8gSWYgc3Rh
dHVzIGlzICdEZWxldGVkJywgaW5kZXggaXMgYm9ndXMuCi19OwotCiBzdGF0aWMgQUxXQVlTX0lO
TElORSBpbnQgbWlzc2luZ1N5bWJvbE1hcmtlcigpIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1p
dHM8aW50Pjo6bWF4KCk7IH0KIAogLy8gVGhlIGJpdCB0d2lkZGxpbmcgaW4gdGhpcyBjbGFzcyBh
c3N1bWVzIHRoYXQgZXZlcnkgcmVnaXN0ZXIgaW5kZXggaXMgYQpAQCAtODYsNiArNjksMjggQEAg
c3RhdGljIEFMV0FZU19JTkxJTkUgaW50IG1pc3NpbmdTeW1ib2xNYQogLy8gY29weTogICAgIFN5
bWJvbFRhYmxlRW50cnkgLS0+IEZhdEVudHJ5IC0tLS0tXgogCiBzdHJ1Y3QgU3ltYm9sVGFibGVF
bnRyeSB7Citwcml2YXRlOgorICAgIHN0YXRpYyBWYXJPZmZzZXQgdmFyT2Zmc2V0RnJvbUJpdHMo
aW50cHRyX3QgYml0cykKKyAgICB7CisgICAgICAgIFZhcktpbmQga2luZDsKKyAgICAgICAgaWYg
KGJpdHMgJiBTdGFja0ZsYWcpCisgICAgICAgICAgICBraW5kID0gU3RhY2tWYXJLaW5kOworICAg
ICAgICBlbHNlIGlmIChiaXRzICYgQ2FwdHVyZWRBcmd1bWVudEZsYWcpCisgICAgICAgICAgICBr
aW5kID0gQ2FwdHVyZWRBcmd1bWVudEtpbmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGtp
bmQgPSBTY29wZVZhcktpbmQ7CisgICAgICAgIHJldHVybiBWYXJPZmZzZXQ6OmFzc2VtYmxlKGtp
bmQsIHN0YXRpY19jYXN0PGludD4oYml0cyA+PiBGbGFnQml0cykpOworICAgIH0KKyAgICAKKyAg
ICBzdGF0aWMgU2NvcGVPZmZzZXQgc2NvcGVPZmZzZXRGcm9tQml0cyhpbnRwdHJfdCBiaXRzKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKCEoYml0cyAmIFN0YWNrRmxhZykpOworICAgICAgICBBU1NF
UlQoIShiaXRzICYgQ2FwdHVyZWRBcmd1bWVudEZsYWcpKTsKKyAgICAgICAgcmV0dXJuIFNjb3Bl
T2Zmc2V0KHN0YXRpY19jYXN0PGludD4oYml0cyA+PiBGbGFnQml0cykpOworICAgIH0KKworcHVi
bGljOgorICAgIAogICAgIC8vIFVzZSB0aGUgU3ltYm9sVGFibGVFbnRyeTo6RmFzdCBjbGFzcywg
ZWl0aGVyIHZpYSBpbXBsaWNpdCBjYXN0IG9yIGJ5IGNhbGxpbmcKICAgICAvLyBnZXRGYXN0KCks
IHdoZW4geW91ICgxKSBvbmx5IGNhcmUgYWJvdXQgaXNOdWxsKCksIGdldEluZGV4KCksIGFuZCBp
c1JlYWRPbmx5KCksCiAgICAgLy8gYW5kICgyKSB5b3UgYXJlIGluIGEgaG90IHBhdGggd2hlcmUg
eW91IG5lZWQgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiB0aW1lcwpAQCAtMTA3LDExICsxMTIs
MTkgQEAgc3RydWN0IFN5bWJvbFRhYmxlRW50cnkgewogICAgICAgICAgICAgcmV0dXJuICEobV9i
aXRzICYgflNsaW1GbGFnKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBnZXRJbmRleCgpIGNv
bnN0CisgICAgICAgIFZhck9mZnNldCB2YXJPZmZzZXQoKSBjb25zdAogICAgICAgICB7Ci0gICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2JpdHMgPj4gRmxhZ0JpdHMpOworICAg
ICAgICAgICAgcmV0dXJuIHZhck9mZnNldEZyb21CaXRzKG1fYml0cyk7CiAgICAgICAgIH0KLSAg
ICAKKyAgICAgICAgCisgICAgICAgIC8vIEFzc2VydHMgaWYgdGhlIG9mZnNldCBpcyBhbnl0aGlu
ZyBidXQgYSBzY29wZSBvZmZzZXQuIFRoaXMgc3RydWN0dXJlcyB0aGUgYXNzZXJ0aW9ucworICAg
ICAgICAvLyBpbiBhIHdheSB0aGF0IG1heSByZXN1bHQgaW4gYmV0dGVyIGNvZGUsIGV2ZW4gaW4g
cmVsZWFzZSwgdGhhbiBkb2luZworICAgICAgICAvLyB2YXJPZmZzZXQoKS5zY29wZU9mZnNldCgp
LgorICAgICAgICBTY29wZU9mZnNldCBzY29wZU9mZnNldCgpIGNvbnN0CisgICAgICAgIHsKKyAg
ICAgICAgICAgIHJldHVybiBzY29wZU9mZnNldEZyb21CaXRzKG1fYml0cyk7CisgICAgICAgIH0K
KyAgICAgICAgCiAgICAgICAgIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0CiAgICAgICAgIHsKICAg
ICAgICAgICAgIHJldHVybiBtX2JpdHMgJiBSZWFkT25seUZsYWc7CkBAIC0xNDIsMTggKzE1NSwx
OCBAQCBzdHJ1Y3QgU3ltYm9sVGFibGVFbnRyeSB7CiAgICAgewogICAgIH0KIAotICAgIFN5bWJv
bFRhYmxlRW50cnkoaW50IGluZGV4KQorICAgIFN5bWJvbFRhYmxlRW50cnkoVmFyT2Zmc2V0IG9m
ZnNldCkKICAgICAgICAgOiBtX2JpdHMoU2xpbUZsYWcpCiAgICAgewotICAgICAgICBBU1NFUlQo
aXNWYWxpZEluZGV4KGluZGV4KSk7Ci0gICAgICAgIHBhY2soaW5kZXgsIGZhbHNlLCBmYWxzZSk7
CisgICAgICAgIEFTU0VSVChpc1ZhbGlkVmFyT2Zmc2V0KG9mZnNldCkpOworICAgICAgICBwYWNr
KG9mZnNldCwgZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKLSAgICBTeW1ib2xUYWJsZUVudHJ5KGlu
dCBpbmRleCwgdW5zaWduZWQgYXR0cmlidXRlcykKKyAgICBTeW1ib2xUYWJsZUVudHJ5KFZhck9m
ZnNldCBvZmZzZXQsIHVuc2lnbmVkIGF0dHJpYnV0ZXMpCiAgICAgICAgIDogbV9iaXRzKFNsaW1G
bGFnKQogICAgIHsKLSAgICAgICAgQVNTRVJUKGlzVmFsaWRJbmRleChpbmRleCkpOwotICAgICAg
ICBwYWNrKGluZGV4LCBhdHRyaWJ1dGVzICYgUmVhZE9ubHksIGF0dHJpYnV0ZXMgJiBEb250RW51
bSk7CisgICAgICAgIEFTU0VSVChpc1ZhbGlkVmFyT2Zmc2V0KG9mZnNldCkpOworICAgICAgICBw
YWNrKG9mZnNldCwgYXR0cmlidXRlcyAmIFJlYWRPbmx5LCBhdHRyaWJ1dGVzICYgRG9udEVudW0p
OwogICAgIH0KICAgICAKICAgICB+U3ltYm9sVGFibGVFbnRyeSgpCkBAIC0xODEsOSArMTk0LDE3
IEBAIHN0cnVjdCBTeW1ib2xUYWJsZUVudHJ5IHsKICAgICAgICAgcmV0dXJuICEoYml0cygpICYg
flNsaW1GbGFnKTsKICAgICB9CiAKLSAgICBpbnQgZ2V0SW5kZXgoKSBjb25zdAorICAgIFZhck9m
ZnNldCB2YXJPZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhck9mZnNldEZy
b21CaXRzKGJpdHMoKSk7CisgICAgfQorICAgIAorICAgIC8vIEFzc2VydHMgaWYgdGhlIG9mZnNl
dCBpcyBhbnl0aGluZyBidXQgYSBzY29wZSBvZmZzZXQuIFRoaXMgc3RydWN0dXJlcyB0aGUgYXNz
ZXJ0aW9ucworICAgIC8vIGluIGEgd2F5IHRoYXQgbWF5IHJlc3VsdCBpbiBiZXR0ZXIgY29kZSwg
ZXZlbiBpbiByZWxlYXNlLCB0aGFuIGRvaW5nCisgICAgLy8gdmFyT2Zmc2V0KCkuc2NvcGVPZmZz
ZXQoKS4KKyAgICBTY29wZU9mZnNldCBzY29wZU9mZnNldCgpIGNvbnN0CiAgICAgewotICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihiaXRzKCkgPj4gRmxhZ0JpdHMpOworICAgICAgICBy
ZXR1cm4gc2NvcGVPZmZzZXRGcm9tQml0cyhiaXRzKCkpOwogICAgIH0KICAgICAKICAgICBBTFdB
WVNfSU5MSU5FIEZhc3QgZ2V0RmFzdCgpIGNvbnN0CkBAIC0yMDksNyArMjMwLDcgQEAgc3RydWN0
IFN5bWJvbFRhYmxlRW50cnkgewogCiAgICAgdm9pZCBzZXRBdHRyaWJ1dGVzKHVuc2lnbmVkIGF0
dHJpYnV0ZXMpCiAgICAgewotICAgICAgICBwYWNrKGdldEluZGV4KCksIGF0dHJpYnV0ZXMgJiBS
ZWFkT25seSwgYXR0cmlidXRlcyAmIERvbnRFbnVtKTsKKyAgICAgICAgcGFjayh2YXJPZmZzZXQo
KSwgYXR0cmlidXRlcyAmIFJlYWRPbmx5LCBhdHRyaWJ1dGVzICYgRG9udEVudW0pOwogICAgIH0K
IAogICAgIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0CkBAIC0yNDIsNyArMjYzLDkgQEAgcHJpdmF0
ZToKICAgICBzdGF0aWMgY29uc3QgaW50cHRyX3QgUmVhZE9ubHlGbGFnID0gMHgyOwogICAgIHN0
YXRpYyBjb25zdCBpbnRwdHJfdCBEb250RW51bUZsYWcgPSAweDQ7CiAgICAgc3RhdGljIGNvbnN0
IGludHB0cl90IE5vdE51bGxGbGFnID0gMHg4OwotICAgIHN0YXRpYyBjb25zdCBpbnRwdHJfdCBG
bGFnQml0cyA9IDQ7CisgICAgc3RhdGljIGNvbnN0IGludHB0cl90IFN0YWNrRmxhZyA9IDB4MTA7
CisgICAgc3RhdGljIGNvbnN0IGludHB0cl90IENhcHR1cmVkQXJndW1lbnRGbGFnID0gMHgyMDsK
KyAgICBzdGF0aWMgY29uc3QgaW50cHRyX3QgRmxhZ0JpdHMgPSA2OwogICAgIAogICAgIGNsYXNz
IEZhdEVudHJ5IHsKICAgICAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CkBAIC0zMDksMjAg
KzMzMiwzNCBAQCBwcml2YXRlOgogCiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBmcmVlRmF0
RW50cnlTbG93KCk7CiAKLSAgICB2b2lkIHBhY2soaW50IGluZGV4LCBib29sIHJlYWRPbmx5LCBi
b29sIGRvbnRFbnVtKQorICAgIHZvaWQgcGFjayhWYXJPZmZzZXQgb2Zmc2V0LCBib29sIHJlYWRP
bmx5LCBib29sIGRvbnRFbnVtKQogICAgIHsKICAgICAgICAgQVNTRVJUKCFpc0ZhdCgpKTsKICAg
ICAgICAgaW50cHRyX3QmIGJpdHNSZWYgPSBiaXRzKCk7Ci0gICAgICAgIGJpdHNSZWYgPSAoc3Rh
dGljX2Nhc3Q8aW50cHRyX3Q+KGluZGV4KSA8PCBGbGFnQml0cykgfCBOb3ROdWxsRmxhZyB8IFNs
aW1GbGFnOworICAgICAgICBiaXRzUmVmID0KKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnRw
dHJfdD4ob2Zmc2V0LnJhd09mZnNldCgpKSA8PCBGbGFnQml0cykgfCBOb3ROdWxsRmxhZyB8IFNs
aW1GbGFnOwogICAgICAgICBpZiAocmVhZE9ubHkpCiAgICAgICAgICAgICBiaXRzUmVmIHw9IFJl
YWRPbmx5RmxhZzsKICAgICAgICAgaWYgKGRvbnRFbnVtKQogICAgICAgICAgICAgYml0c1JlZiB8
PSBEb250RW51bUZsYWc7CisgICAgICAgIHN3aXRjaCAob2Zmc2V0LmtpbmQoKSkgeworICAgICAg
ICBjYXNlIFNjb3BlVmFyS2luZDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0
YWNrVmFyS2luZDoKKyAgICAgICAgICAgIGJpdHNSZWYgfD0gU3RhY2tGbGFnOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2FwdHVyZWRBcmd1bWVudEtpbmQ6CisgICAgICAgICAg
ICBiaXRzUmVmIHw9IENhcHR1cmVkQXJndW1lbnRGbGFnOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgYm9vbCBp
c1ZhbGlkSW5kZXgoaW50IGluZGV4KQorICAgIHN0YXRpYyBib29sIGlzVmFsaWRWYXJPZmZzZXQo
VmFyT2Zmc2V0IG9mZnNldCkKICAgICB7Ci0gICAgICAgIHJldHVybiAoKHN0YXRpY19jYXN0PGlu
dHB0cl90PihpbmRleCkgPDwgRmxhZ0JpdHMpID4+IEZsYWdCaXRzKSA9PSBzdGF0aWNfY2FzdDxp
bnRwdHJfdD4oaW5kZXgpOworICAgICAgICByZXR1cm4gKChzdGF0aWNfY2FzdDxpbnRwdHJfdD4o
b2Zmc2V0LnJhd09mZnNldCgpKSA8PCBGbGFnQml0cykgPj4gRmxhZ0JpdHMpID09IHN0YXRpY19j
YXN0PGludHB0cl90PihvZmZzZXQucmF3T2Zmc2V0KCkpOwogICAgIH0KIAogICAgIGludHB0cl90
IG1fYml0czsKQEAgLTM1MSw3ICszODgsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIFN5bWJvbFRh
YmxlKiBjcmVhdGVOYW1lU2NvcGVUYWJsZShWTSYgdm0sIGNvbnN0IElkZW50aWZpZXImIGlkZW50
LCB1bnNpZ25lZCBhdHRyaWJ1dGVzKQogICAgIHsKICAgICAgICAgU3ltYm9sVGFibGUqIHJlc3Vs
dCA9IGNyZWF0ZSh2bSk7Ci0gICAgICAgIHJlc3VsdC0+YWRkKGlkZW50LmltcGwoKSwgU3ltYm9s
VGFibGVFbnRyeSgtMSwgYXR0cmlidXRlcykpOworICAgICAgICByZXN1bHQtPmFkZChpZGVudC5p
bXBsKCksIFN5bWJvbFRhYmxlRW50cnkoVmFyT2Zmc2V0KFNjb3BlT2Zmc2V0KDApKSwgYXR0cmli
dXRlcykpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICAKQEAgLTQyMyw4ICs0
NjAsMjkgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gc2l6ZShsb2NrZXIpOwogICAgIH0KICAg
ICAKKyAgICBTY29wZU9mZnNldCBtYXhTY29wZU9mZnNldCgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV9tYXhTY29wZU9mZnNldDsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgc2Nv
cGVTaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIFNjb3BlT2Zmc2V0IG1heFNjb3BlT2Zmc2V0
ID0gdGhpcy0+bWF4U2NvcGVPZmZzZXQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIERvIHNvbWUg
Y2FsY3VsYXRpb24gdGhhdCByZWxpZXMgb24gaW52YWxpZCBzY29wZSBvZmZzZXQgcGx1cyBvbmUg
YmVpbmcgemVyby4KKyAgICAgICAgdW5zaWduZWQgZmFzdFJlc3VsdCA9IG1heFNjb3BlT2Zmc2V0
Lm9mZnNldFVuY2hlY2tlZCgpICsgMTsKKyAgICAgICAgCisgICAgICAgIC8vIEFzc2VydCB0aGF0
IHRoaXMgd29ya3MuCisgICAgICAgIEFTU0VSVChmYXN0UmVzdWx0ID09ICghbWF4U2NvcGVPZmZz
ZXQgPyAwIDogbWF4U2NvcGVPZmZzZXQub2Zmc2V0KCkgKyAxKSk7CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gZmFzdFJlc3VsdDsKKyAgICB9CisgICAgCiAgICAgTWFwOjpBZGRSZXN1bHQgYWRk
KGNvbnN0IENvbmN1cnJlbnRKSVRMb2NrZXImLCBTdHJpbmdJbXBsKiBrZXksIGNvbnN0IFN5bWJv
bFRhYmxlRW50cnkmIGVudHJ5KQogICAgIHsKKyAgICAgICAgaWYgKGVudHJ5LnZhck9mZnNldCgp
LmlzU2NvcGUoKQorICAgICAgICAgICAgJiYgKCFtX21heFNjb3BlT2Zmc2V0IHx8IG1fbWF4U2Nv
cGVPZmZzZXQgPCBlbnRyeS5zY29wZU9mZnNldCgpKSkKKyAgICAgICAgICAgIG1fbWF4U2NvcGVP
ZmZzZXQgPSBlbnRyeS5zY29wZU9mZnNldCgpOwogICAgICAgICByZXR1cm4gbV9tYXAuYWRkKGtl
eSwgZW50cnkpOwogICAgIH0KICAgICAKQEAgLTQ1Niw2ICs1MTQsNDUgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gY29udGFpbnMobG9ja2VyLCBrZXkpOwogICAgIH0KICAgICAKKyAgICAvLyBU
aGUgcHJpbmNpcGxlIGJlaGluZCBTY29wZWRBcmd1bWVudHNUYWJsZSBtb2RpZmljYXRpb25zIGlz
IHRoYXQgd2Ugd2lsbCBjcmVhdGUgb25lIGFuZAorICAgIC8vIGxlYXZlIGl0IHVubG9ja2VkIC0g
dGhlcmVieSBhbGxvd2luZyBpbi1wbGFjZSBjaGFuZ2VzIC0gdW50aWwgc29tZW9uZSBhc2tzIGZv
ciBhIHBvaW50ZXIgdG8KKyAgICAvLyB0aGUgdGFibGUuIFRoZW4sIHdlIHdpbGwgbG9jayBpdC4g
VGhlbiBib3RoIG91ciBmdXR1cmUgY2hhbmdlcyBhbmQgdGhlaXIgZnV0dXJlIGNoYW5nZXMKKyAg
ICAvLyB3aWxsIGZpcnN0IGhhdmUgdG8gbWFrZSBhIGNvcHkuIFRoaXMgZGlzY2lwbGluZSBtZWFu
cyB0aGF0IHVzdWFsbHkgd2hlbiB3ZSBjcmVhdGUgYQorICAgIC8vIFNjb3BlZEFyZ3VtZW50cyBv
YmplY3QsIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIFNjb3BlZEFyZ3VtZW50
c1RhYmxlIC0gaW5zdGVhZAorICAgIC8vIHdlIGp1c3QgdGFrZSBhIHJlZmVyZW5jZSB0byBvbmUg
dGhhdCB3ZSBhbHJlYWR5IGhhdmUuCisgICAgCisgICAgdWludDMyX3QgYXJndW1lbnRzTGVuZ3Ro
KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghbV9hcmd1bWVudHMpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG1fYXJndW1lbnRzLT5sZW5ndGgoKTsKKyAgICB9Cisg
ICAgCisgICAgdm9pZCBzZXRBcmd1bWVudHNMZW5ndGgoVk0mIHZtLCB1aW50MzJfdCBsZW5ndGgp
CisgICAgeworICAgICAgICBpZiAoVU5MSUtFTFkoIW1fYXJndW1lbnRzKSkKKyAgICAgICAgICAg
IG1fYXJndW1lbnRzLnNldCh2bSwgdGhpcywgU2NvcGVkQXJndW1lbnRzVGFibGU6OmNyZWF0ZSh2
bSkpOworICAgICAgICBtX2FyZ3VtZW50cy5zZXQodm0sIHRoaXMsIG1fYXJndW1lbnRzLT5zZXRM
ZW5ndGgodm0sIGxlbmd0aCkpOworICAgIH0KKyAgICAKKyAgICBTY29wZU9mZnNldCBhcmd1bWVu
dE9mZnNldCh1aW50MzJfdCBpKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfU0VD
VVJJVFlfSU1QTElDQVRJT04obV9hcmd1bWVudHMpOworICAgICAgICByZXR1cm4gbV9hcmd1bWVu
dHMtPmdldChpKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRBcmd1bWVudE9mZnNldChWTSYg
dm0sIHVpbnQzMl90IGksIFNjb3BlT2Zmc2V0IG9mZnNldCkKKyAgICB7CisgICAgICAgIEFTU0VS
VF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKG1fYXJndW1lbnRzKTsKKyAgICAgICAgbV9hcmd1
bWVudHMuc2V0KHZtLCB0aGlzLCBtX2FyZ3VtZW50cy0+c2V0KHZtLCBpLCBvZmZzZXQpKTsKKyAg
ICB9CisgICAgCisgICAgU2NvcGVkQXJndW1lbnRzVGFibGUqIGFyZ3VtZW50cygpIGNvbnN0Cisg
ICAgeworICAgICAgICBtX2FyZ3VtZW50cy0+bG9jaygpOworICAgICAgICByZXR1cm4gbV9hcmd1
bWVudHMuZ2V0KCk7CisgICAgfQorICAgIAogICAgIEdsb2JhbFZhcmlhYmxlSUQgdW5pcXVlSURG
b3JWYXJpYWJsZShjb25zdCBDb25jdXJyZW50SklUTG9ja2VyJiwgU3RyaW5nSW1wbCoga2V5LCBW
TSYgdm0pOwogICAgIEdsb2JhbFZhcmlhYmxlSUQgdW5pcXVlSURGb3JSZWdpc3Rlcihjb25zdCBD
b25jdXJyZW50SklUTG9ja2VyJiBsb2NrZXIsIGludCByZWdpc3RlckluZGV4LCBWTSYgdm0pOwog
ICAgIFJlZlB0cjxUeXBlU2V0PiBnbG9iYWxUeXBlU2V0Rm9yUmVnaXN0ZXIoY29uc3QgQ29uY3Vy
cmVudEpJVExvY2tlciYgbG9ja2VyLCBpbnQgcmVnaXN0ZXJJbmRleCwgVk0mIHZtKTsKQEAgLTQ2
NCwyOCArNTYxLDcgQEAgcHVibGljOgogICAgIGJvb2wgdXNlc05vblN0cmljdEV2YWwoKSB7IHJl
dHVybiBtX3VzZXNOb25TdHJpY3RFdmFsOyB9CiAgICAgdm9pZCBzZXRVc2VzTm9uU3RyaWN0RXZh
bChib29sIHVzZXNOb25TdHJpY3RFdmFsKSB7IG1fdXNlc05vblN0cmljdEV2YWwgPSB1c2VzTm9u
U3RyaWN0RXZhbDsgfQogCi0gICAgaW50IGNhcHR1cmVTdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2FwdHVyZVN0YXJ0OyB9Ci0gICAgdm9pZCBzZXRDYXB0dXJlU3RhcnQoaW50IGNhcHR1cmVTdGFy
dCkgeyBtX2NhcHR1cmVTdGFydCA9IGNhcHR1cmVTdGFydDsgfQotCi0gICAgaW50IGNhcHR1cmVF
bmQoKSBjb25zdCB7IHJldHVybiBtX2NhcHR1cmVFbmQ7IH0KLSAgICB2b2lkIHNldENhcHR1cmVF
bmQoaW50IGNhcHR1cmVFbmQpIHsgbV9jYXB0dXJlRW5kID0gY2FwdHVyZUVuZDsgfQotCi0gICAg
aW50IGNhcHR1cmVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIC0obV9jYXB0dXJlRW5kIC0gbV9jYXB0
dXJlU3RhcnQpOyB9Ci0gICAgCi0gICAgYm9vbCBpc0NhcHR1cmVkKGludCBvcGVyYW5kKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIG9wZXJhbmQgPD0gY2FwdHVyZVN0YXJ0KCkgJiYgb3BlcmFuZCA+
IGNhcHR1cmVFbmQoKTsKLSAgICB9Ci0KLSAgICBpbnQgcGFyYW1ldGVyQ291bnQoKSB7IHJldHVy
biBtX3BhcmFtZXRlckNvdW50SW5jbHVkaW5nVGhpcyAtIDE7IH0KLSAgICBpbnQgcGFyYW1ldGVy
Q291bnRJbmNsdWRpbmdUaGlzKCkgeyByZXR1cm4gbV9wYXJhbWV0ZXJDb3VudEluY2x1ZGluZ1Ro
aXM7IH0KLSAgICB2b2lkIHNldFBhcmFtZXRlckNvdW50SW5jbHVkaW5nVGhpcyhpbnQgcGFyYW1l
dGVyQ291bnRJbmNsdWRpbmdUaGlzKSB7IG1fcGFyYW1ldGVyQ291bnRJbmNsdWRpbmdUaGlzID0g
cGFyYW1ldGVyQ291bnRJbmNsdWRpbmdUaGlzOyB9Ci0KLSAgICAvLyAwIGlmIHdlIGRvbid0IGNh
cHR1cmUgYW55IGFyZ3VtZW50czsgcGFyYW1ldGVyQ291bnQoKSBpbiBsZW5ndGggaWYgd2UgZG8u
Ci0gICAgY29uc3QgU2xvd0FyZ3VtZW50KiBzbG93QXJndW1lbnRzKCkgeyByZXR1cm4gbV9zbG93
QXJndW1lbnRzLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRTbG93QXJndW1lbnRzKHN0ZDo6dW5pcXVl
X3B0cjxTbG93QXJndW1lbnRbXT4gc2xvd0FyZ3VtZW50cykgeyBtX3Nsb3dBcmd1bWVudHMgPSBX
VEY6Om1vdmUoc2xvd0FyZ3VtZW50cyk7IH0KLSAgICAKLSAgICBTeW1ib2xUYWJsZSogY2xvbmVD
YXB0dXJlZE5hbWVzKFZNJik7CisgICAgU3ltYm9sVGFibGUqIGNsb25lU2NvcGVQYXJ0KFZNJik7
CiAKICAgICB2b2lkIHByZXBhcmVGb3JUeXBlUHJvZmlsaW5nKGNvbnN0IENvbmN1cnJlbnRKSVRM
b2NrZXImKTsKIApAQCAtNTEzLDYgKzU4OSw4IEBAIHByaXZhdGU6CiAgICAgflN5bWJvbFRhYmxl
KCk7CiAKICAgICBNYXAgbV9tYXA7CisgICAgU2NvcGVPZmZzZXQgbV9tYXhTY29wZU9mZnNldDsK
KyAgICAKICAgICBzdHJ1Y3QgVHlwZVByb2ZpbGluZ1JhcmVEYXRhIHsKICAgICAgICAgVW5pcXVl
SURNYXAgbV91bmlxdWVJRE1hcDsKICAgICAgICAgUmVnaXN0ZXJUb1ZhcmlhYmxlTWFwIG1fcmVn
aXN0ZXJUb1ZhcmlhYmxlTWFwOwpAQCAtNTIwLDEzICs1OTgsOSBAQCBwcml2YXRlOgogICAgIH07
CiAgICAgc3RkOjp1bmlxdWVfcHRyPFR5cGVQcm9maWxpbmdSYXJlRGF0YT4gbV90eXBlUHJvZmls
aW5nUmFyZURhdGE7CiAKLSAgICBpbnQgbV9wYXJhbWV0ZXJDb3VudEluY2x1ZGluZ1RoaXM7CiAg
ICAgYm9vbCBtX3VzZXNOb25TdHJpY3RFdmFsOwotCi0gICAgaW50IG1fY2FwdHVyZVN0YXJ0Owot
ICAgIGludCBtX2NhcHR1cmVFbmQ7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U2xvd0FyZ3VtZW50
W10+IG1fc2xvd0FyZ3VtZW50czsKKyAgICAKKyAgICBXcml0ZUJhcnJpZXI8U2NvcGVkQXJndW1l
bnRzVGFibGU+IG1fYXJndW1lbnRzOwogICAgIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxXYXRjaHBv
aW50Q2xlYW51cD4gbV93YXRjaHBvaW50Q2xlYW51cDsKIApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvVmFyT2Zmc2V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9WYXJPZmZzZXQuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvVmFyT2Zmc2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJWYXJPZmZzZXQuaCIKKworbmFtZXNwYWNl
IEpTQyB7CisKK3ZvaWQgVmFyT2Zmc2V0OjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7
CisgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICBjYXNlIEludmFsaWRWYXJLaW5kOgorICAgICAg
ICBvdXQucHJpbnQoImludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgU2NvcGVW
YXJLaW5kOgorICAgICAgICBvdXQucHJpbnQoc2NvcGVPZmZzZXQoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIFN0YWNrVmFyS2luZDoKKyAgICAgICAgb3V0LnByaW50KHN0YWNrT2Zmc2V0
KCkpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBDYXB0dXJlZEFyZ3VtZW50S2luZDoKKyAg
ICAgICAgb3V0LnByaW50KGNhcHR1cmVkQXJndW1lbnRPZmZzZXQoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgSlNDCisKK25hbWVzcGFjZSBXVEYgeworCit1c2luZyBuYW1lc3BhY2UgSlNDOwor
Cit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mIG91dCwgVmFyS2luZCB2YXJLaW5kKQor
eworICAgIHN3aXRjaCAodmFyS2luZCkgeworICAgIGNhc2UgSW52YWxpZFZhcktpbmQ6CisgICAg
ICAgIG91dC5wcmludCgiSW52YWxpZCIpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBTY29w
ZVZhcktpbmQ6CisgICAgICAgIG91dC5wcmludCgiU2NvcGUiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgU3RhY2tWYXJLaW5kOgorICAgICAgICBvdXQucHJpbnQoIlN0YWNrIik7CisgICAg
ICAgIHJldHVybjsKKyAgICBjYXNlIENhcHR1cmVkQXJndW1lbnRLaW5kOgorICAgICAgICBvdXQu
cHJpbnQoIkNhcHR1cmVkQXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXVEYKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVmFyT2Zmc2V0LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVmFyT2Zmc2V0LmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9WYXJPZmZzZXQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIFZhck9mZnNldF9oCisjZGVmaW5lIFZhck9mZnNldF9o
CisKKyNpbmNsdWRlICJDYXB0dXJlZEFyZ3VtZW50T2Zmc2V0LmgiCisjaW5jbHVkZSAiU2NvcGVP
ZmZzZXQuaCIKKyNpbmNsdWRlICJWaXJ0dWFsUmVnaXN0ZXIuaCIKKworbmFtZXNwYWNlIEpTQyB7
CisKK2VudW0gVmFyS2luZCA6IHVpbnQ4X3QgeworICAgIEludmFsaWRWYXJLaW5kLAorICAgIFNj
b3BlVmFyS2luZCwKKyAgICBTdGFja1ZhcktpbmQsCisgICAgQ2FwdHVyZWRBcmd1bWVudEtpbmQK
K307CisKK2NsYXNzIFZhck9mZnNldCB7CitwdWJsaWM6CisgICAgVmFyT2Zmc2V0KCkKKyAgICAg
ICAgOiBtX2tpbmQoSW52YWxpZFZhcktpbmQpCisgICAgICAgICwgbV9vZmZzZXQoVUlOVF9NQVgp
CisgICAgeworICAgIH0KKyAgICAKKyAgICBleHBsaWNpdCBWYXJPZmZzZXQoVmlydHVhbFJlZ2lz
dGVyIHN0YWNrT2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFzdGFja09mZnNldC5pc1ZhbGlk
KCkpIHsKKyAgICAgICAgICAgIG1fa2luZCA9IEludmFsaWRWYXJLaW5kOworICAgICAgICAgICAg
bV9vZmZzZXQgPSBVSU5UX01BWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fa2lu
ZCA9IFN0YWNrVmFyS2luZDsKKyAgICAgICAgICAgIG1fb2Zmc2V0ID0gc3RhY2tPZmZzZXQub2Zm
c2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZXhwbGljaXQgVmFyT2Zmc2V0KFNj
b3BlT2Zmc2V0IHNjb3BlT2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFzY29wZU9mZnNldCkg
eworICAgICAgICAgICAgbV9raW5kID0gSW52YWxpZFZhcktpbmQ7CisgICAgICAgICAgICBtX29m
ZnNldCA9IFVJTlRfTUFYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9raW5kID0g
U2NvcGVWYXJLaW5kOworICAgICAgICAgICAgbV9vZmZzZXQgPSBzY29wZU9mZnNldC5vZmZzZXQo
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBleHBsaWNpdCBWYXJPZmZzZXQoQ2FwdHVy
ZWRBcmd1bWVudE9mZnNldCBjYXB0dXJlZEFyZ3VtZW50T2Zmc2V0KQorICAgIHsKKyAgICAgICAg
aWYgKCFjYXB0dXJlZEFyZ3VtZW50T2Zmc2V0KSB7CisgICAgICAgICAgICBtX2tpbmQgPSBJbnZh
bGlkVmFyS2luZDsKKyAgICAgICAgICAgIG1fb2Zmc2V0ID0gVUlOVF9NQVg7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBtX2tpbmQgPSBDYXB0dXJlZEFyZ3VtZW50S2luZDsKKyAgICAg
ICAgICAgIG1fb2Zmc2V0ID0gY2FwdHVyZWRBcmd1bWVudE9mZnNldC5vZmZzZXQoKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgVmFyT2Zmc2V0IGFzc2VtYmxlKFZhcktpbmQg
a2luZCwgdW5zaWduZWQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgVmFyT2Zmc2V0IHJlc3VsdDsK
KyAgICAgICAgcmVzdWx0Lm1fa2luZCA9IGtpbmQ7CisgICAgICAgIHJlc3VsdC5tX29mZnNldCA9
IG9mZnNldDsKKyAgICAgICAgcmVzdWx0LmNoZWNrU2FuaXR5KCk7CisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9raW5kICE9IEludmFsaWRWYXJLaW5kOworICAgIH0KKyAgICAKKyAgICBi
b29sIG9wZXJhdG9yISgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIWlzVmFsaWQoKTsK
KyAgICB9CisgICAgCisgICAgVmFyS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9
CisgICAgCisgICAgYm9vbCBpc1N0YWNrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2tpbmQgPT0gU3RhY2tWYXJLaW5kOworICAgIH0KKyAgICAKKyAgICBib29sIGlzU2NvcGUoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fa2luZCA9PSBTY29wZVZhcktpbmQ7CisgICAg
fQorICAgIAorICAgIGJvb2wgaXNDYXB0dXJlZEFyZ3VtZW50KCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2tpbmQgPT0gQ2FwdHVyZWRBcmd1bWVudEtpbmQ7CisgICAgfQorICAgIAor
ICAgIFZpcnR1YWxSZWdpc3RlciBzdGFja09mZnNldFVuY2hlY2tlZCgpIGNvbnN0CisgICAgewor
ICAgICAgICBpZiAoIWlzU3RhY2soKSkKKyAgICAgICAgICAgIHJldHVybiBWaXJ0dWFsUmVnaXN0
ZXIoKTsKKyAgICAgICAgcmV0dXJuIFZpcnR1YWxSZWdpc3RlcihtX29mZnNldCk7CisgICAgfQor
ICAgIAorICAgIFNjb3BlT2Zmc2V0IHNjb3BlT2Zmc2V0VW5jaGVja2VkKCkgY29uc3QKKyAgICB7
CisgICAgICAgIGlmICghaXNTY29wZSgpKQorICAgICAgICAgICAgcmV0dXJuIFNjb3BlT2Zmc2V0
KCk7CisgICAgICAgIHJldHVybiBTY29wZU9mZnNldChtX29mZnNldCk7CisgICAgfQorICAgIAor
ICAgIENhcHR1cmVkQXJndW1lbnRPZmZzZXQgY2FwdHVyZWRBcmd1bWVudE9mZnNldFVuY2hlY2tl
ZCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIWlzQ2FwdHVyZWRBcmd1bWVudCgpKQorICAg
ICAgICAgICAgcmV0dXJuIENhcHR1cmVkQXJndW1lbnRPZmZzZXQoKTsKKyAgICAgICAgcmV0dXJu
IENhcHR1cmVkQXJndW1lbnRPZmZzZXQobV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBWaXJ0
dWFsUmVnaXN0ZXIgc3RhY2tPZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKGlz
U3RhY2soKSk7CisgICAgICAgIHJldHVybiBWaXJ0dWFsUmVnaXN0ZXIobV9vZmZzZXQpOworICAg
IH0KKyAgICAKKyAgICBTY29wZU9mZnNldCBzY29wZU9mZnNldCgpIGNvbnN0CisgICAgeworICAg
ICAgICBBU1NFUlQoaXNTY29wZSgpKTsKKyAgICAgICAgcmV0dXJuIFNjb3BlT2Zmc2V0KG1fb2Zm
c2V0KTsKKyAgICB9CisgICAgCisgICAgQ2FwdHVyZWRBcmd1bWVudE9mZnNldCBjYXB0dXJlZEFy
Z3VtZW50T2Zmc2V0KCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0NhcHR1cmVkQXJn
dW1lbnQoKSk7CisgICAgICAgIHJldHVybiBDYXB0dXJlZEFyZ3VtZW50T2Zmc2V0KG1fb2Zmc2V0
KTsKKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgcmF3T2Zmc2V0KCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChpc1ZhbGlkKCkpOworICAgICAgICByZXR1cm4gbV9vZmZzZXQ7CisgICAg
fQorICAgIAorICAgIHZvaWQgY2hlY2tTYW5pdHkoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KEFTU0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAg
IHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgSW52YWxpZFZhcktpbmQ6CisgICAgICAg
ICAgICBBU1NFUlQobV9vZmZzZXQgPT0gVUlOVF9NQVgpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBjYXNlIFNjb3BlVmFyS2luZDoKKyAgICAgICAgICAgIEFTU0VSVChzY29wZU9mZnNl
dCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBTdGFja1ZhcktpbmQ6Cisg
ICAgICAgICAgICBBU1NFUlQoc3RhY2tPZmZzZXQoKSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIGNhc2UgQ2FwdHVyZWRBcmd1bWVudEtpbmQ6CisgICAgICAgICAgICBBU1NFUlQoY2Fw
dHVyZWRBcmd1bWVudE9mZnNldCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIAorICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYXJPZmZzZXQmIG90aGVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zm
c2V0ID09IG90aGVyLm1fb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0o
Y29uc3QgVmFyT2Zmc2V0JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0
aGlzID09IG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikg
Y29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIFZhcktpbmQgbV9raW5kOworICAgIHVuc2lnbmVk
IG1fb2Zmc2V0OworfTsKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKK25hbWVzcGFjZSBXVEYgewor
Cit2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJlYW0mLCBKU0M6OlZhcktpbmQpOworCit9IC8v
IG5hbWVzcGFjZSBXVEYKKworI2VuZGlmIC8vIFZhck9mZnNldF9oCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL1ZhcmlhYmxlTG9jYXRpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9WYXJpYWJsZUxvY2F0aW9uLmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9WYXJpYWJsZUxvY2F0aW9uLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFZhcmlhYmxlTG9jYXRpb25faAorI2RlZmlu
ZSBWYXJpYWJsZUxvY2F0aW9uX2gKKworI2luY2x1ZGUgIlZpcnR1YWxSZWdpc3Rlci5oIgorCitu
YW1lc3BhY2UgSlNDIHsKKworCisKK30gLy8gbmFtZXNwYWNlIEpTQworCisjZW5kaWYgLy8gVmFy
aWFibGVMb2NhdGlvbl9oCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247200</attachid>
            <date>2015-02-23 21:19:54 -0800</date>
            <delta_ts>2015-02-23 21:27:36 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>8425</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwNTQ5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBA
CisyMDE1LTAyLTIzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
T3VyIGJpemFycmUgYmVoYXZpb3Igb24gQXJndW1lbnRzOjpkZWZpbmVPd25Qcm9wZXJ0eSBzaG91
bGQgYmUgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhIHNwYWdoZXR0aSBpbmNpZGVudAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxOTUxCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIHBh
dGNoIGhhcyBubyBiZWhhdmlvcmFsIGNoYW5nZSwgYnV0IGl0IHNpbXBsaWZpZXMgYSBidW5jaCBv
ZiB3cm9uZyBjb2RlLiBUaGUgY29kZSBpcworICAgICAgICBzdGlsbCB3cm9uZyBpbiBleGFjdGx5
IHRoZSBzYW1lIHdheSwgYnV0IGF0IGxlYXN0IGl0J3Mgb2J2aW91cyB3aGF0J3MgZ29pbmcgb24u
IFRoZSB3cm9uZ25lc3MKKyAgICAgICAgaXMgY292ZXJlZCBieSB0aGlzIGJ1ZzogaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MTk1Mi4KKworICAgICAgICAqIHJ1bnRp
bWUvQXJndW1lbnRzLmNwcDoKKyAgICAgICAgKEpTQzo6QXJndW1lbnRzOjpjb3B5QmFja2luZ1N0
b3JlKTogV2Ugc2hvdWxkIG9ubHkgc2VlIHRoZSBhcmd1bWVudHMgdG9rZW47IGFzc2VydCBvdGhl
cndpc2UuIFRoaXMgd29ya3MgYmVjYXVzZSBpZiB0aGUgR0Mgc2VlcyB0aGUgYnV0dGVyZmx5IHRv
a2VuIGl0IGNhbGxzIHRoZSBKU09iamVjdDo6Y29weUJhY2tpbmdTdG9yZSBtZXRob2QgZGlyZWN0
bHkuCisgICAgICAgIChKU0M6OkFyZ3VtZW50czo6ZGVmaW5lT3duUHJvcGVydHkpOiBNYWtlIG91
ciBiaXphcnJlIGJlaGF2aW9yIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gYWNjaWRlbnQgb2Yg
YSBkZWNhZGUgb2YgcGF0Y2hlcy4KKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWJp
emFycmUtYmVoYXZpb3IuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiB0ZXN0
cy9zdHJlc3MvYXJndW1lbnRzLWJpemFycmUtYmVoYXZpb3VyLWRpc2FibGUtZW51bWVyYWJpbGl0
eS5qczogQWRkZWQuIE15IGNob2ljZSBvZiBzcGVsbGluZ3Mgb2YgdGhlIHdvcmQgImJlaGF2aW9b
dV1yIiBpcyBhbG1vc3QgYXMgY29uc2lzdGVudCBhcyBvdXIgaW1wbGVtZW50YXRpb24gb2YgYXJn
dW1lbnRzLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvYXJndW1lbnRz
LWN1c3RvbS1wcm9wZXJ0aWVzLWdjLmpzOiBBZGRlZC4gSSBhZGRlZCB0aGlzIHRlc3QgYmVjYXVz
ZSBhdCBmaXJzdCBJIHdhcyB1bnN1cmUgaWYgd2UgR0NkIGFyZ3VtZW50cyBjb3JyZWN0bHkuCisg
ICAgICAgIChtYWtlQmFzZUFyZ3VtZW50cyk6CisgICAgICAgIChtYWtlQXJyYXkpOgorICAgICAg
ICAoY29ucyk6CisKIDIwMTUtMDItMjMgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgRGlzYWJsZSBmb250IGxvYWRpbmcgZXZlbnRzIHVudGlsIG91ciBpbXBsZW1l
bnRhdGlvbiBnZXRzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGxhdGVzdCBzcGVjCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Bcmd1bWVudHMuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50cy5jcHAJKHJldmlzaW9uIDE4MDUw
NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50cy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTgxLDcgKzgxLDcgQEAgdm9pZCBBcmd1bWVudHM6OmNvcHlCYWNraW5nU3Rv
cmUoSlNDZWxsKgogICAgIH0KIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICB9CiB9CiAgICAgCkBAIC0yOTUs
MzUgKzI5NSwzMyBAQCBib29sIEFyZ3VtZW50czo6ZGVmaW5lT3duUHJvcGVydHkoSlNPYmplCiAg
ICAgdW5zaWduZWQgaSA9IHByb3BlcnR5TmFtZS5hc0luZGV4KCk7CiAgICAgaWYgKGkgPCB0aGlz
T2JqZWN0LT5tX251bUFyZ3VtZW50cykgewogICAgICAgICBSRUxFQVNFX0FTU0VSVChpIDwgUHJv
cGVydHlOYW1lOjpOb3RBbkluZGV4KTsKLSAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIG5v
dCB5ZXQgcHJlc2VudCBvbiB0aGUgb2JqZWN0LCBhbmQgaXMgbm90IHlldCBtYXJrZWQgYXMgZGVs
ZXRlZCwgdGhlbiBhZGQgaXQgbm93LgotICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdCh0aGlzT2Jq
ZWN0KTsKLSAgICAgICAgaWYgKCF0aGlzT2JqZWN0LT5pc0RlbGV0ZWRBcmd1bWVudChpKSAmJiAh
SlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdCh0aGlzT2JqZWN0LCBleGVjLCBwcm9wZXJ0eU5h
bWUsIHNsb3QpKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIHZhbHVlID0gdGhpc09iamVjdC0+dHJ5
R2V0QXJndW1lbnQoaSk7Ci0gICAgICAgICAgICBBU1NFUlQodmFsdWUpOwotICAgICAgICAgICAg
b2JqZWN0LT5wdXREaXJlY3RNYXlCZUluZGV4KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUpOwot
ICAgICAgICB9Ci0gICAgICAgIGlmICghQmFzZTo6ZGVmaW5lT3duUHJvcGVydHkob2JqZWN0LCBl
eGVjLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IsIHNob3VsZFRocm93KSkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBGcm9tIEVTIDUuMSwgMTAuNiBBcmd1bWVudHMg
T2JqZWN0Ci0gICAgICAgIC8vIDUuIElmIHRoZSB2YWx1ZSBvZiBpc01hcHBlZCBpcyBub3QgdW5k
ZWZpbmVkLCB0aGVuCisgICAgICAgIAogICAgICAgICBpZiAodGhpc09iamVjdC0+aXNBcmd1bWVu
dChpKSkgewotICAgICAgICAgICAgLy8gYS4gSWYgSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykg
aXMgdHJ1ZSwgdGhlbgotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNBY2Nlc3NvckRlc2Ny
aXB0b3IoKSkgewotICAgICAgICAgICAgICAgIC8vIGkuIENhbGwgdGhlIFtbRGVsZXRlXV0gaW50
ZXJuYWwgbWV0aG9kIG9mIG1hcCBwYXNzaW5nIFAsIGFuZCBmYWxzZSBhcyB0aGUgYXJndW1lbnRz
LgotICAgICAgICAgICAgICAgIHRoaXNPYmplY3QtPnRyeURlbGV0ZUFyZ3VtZW50KGV4ZWMtPnZt
KCksIGkpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gYi4gRWxzZQotICAgICAgICAgICAgICAg
IC8vIGkuIElmIERlc2MuW1tWYWx1ZV1dIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICAg
ICAvLyAxLiBDYWxsIHRoZSBbW1B1dF1dIGludGVybmFsIG1ldGhvZCBvZiBtYXAgcGFzc2luZyBQ
LCBEZXNjLltbVmFsdWVdXSwgYW5kIFRocm93IGFzIHRoZSBhcmd1bWVudHMuCisgICAgICAgICAg
ICBpZiAoIWRlc2NyaXB0b3IuaXNBY2Nlc3NvckRlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAg
ICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVsZXRlZCBhbmQgd2UgYXJlIHVzaW5nIGEg
bm9uLWFjY2Vzc29yIGRlc2NyaXB0b3IsIHRoZW4KKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1
cmUgdGhhdCB0aGUgYWxpYXNlZCBhcmd1bWVudCBzZWVzIHRoZSB2YWx1ZS4KICAgICAgICAgICAg
ICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpKQogICAgICAgICAgICAgICAgICAgICB0aGlzT2Jq
ZWN0LT50cnlTZXRBcmd1bWVudChleGVjLT52bSgpLCBpLCBkZXNjcmlwdG9yLnZhbHVlKCkpOwot
ICAgICAgICAgICAgICAgIC8vIGlpLiBJZiBEZXNjLltbV3JpdGFibGVdXSBpcyBwcmVzZW50IGFu
ZCBpdHMgdmFsdWUgaXMgZmFsc2UsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyAxLiBDYWxsIHRo
ZSBbW0RlbGV0ZV1dIGludGVybmFsIG1ldGhvZCBvZiBtYXAgcGFzc2luZyBQIGFuZCBmYWxzZSBh
cyBhcmd1bWVudHMuCi0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Iud3JpdGFibGVQcmVz
ZW50KCkgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhp
c09iamVjdC0+dHJ5RGVsZXRlQXJndW1lbnQoZXhlYy0+dm0oKSwgaSk7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlbGV0ZWQgYW5kIHdl
IGFyZSB1c2luZyBhIG5vbi1hY2Nlc3Nvciwgd3JpdGFibGUKKyAgICAgICAgICAgICAgICAvLyBk
ZXNjcmlwdG9yLCB0aGVuIHdlIGFyZSBkb25lLiBUaGUgYXJndW1lbnQgY29udGludWVzIHRvIGJl
IGFsaWFzZWQuIE5vdGUgdGhhdCB3ZQorICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcmVx
dWVzdCB0byBjaGFuZ2UgZW51bWVyYWJpbGl0eS4gV2UgYXBwZWFyIHRvIGhhdmUgYWx3YXlzIGRv
IHNvLCBpbgorICAgICAgICAgICAgICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBhcmd1bWVudCB3YXMg
c3RpbGwgYWxpYXNlZC4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MTk1MgorICAgICAgICAgICAgICAgIGlmIChkZXNj
cmlwdG9yLndyaXRhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAg
ICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkg
aXMgYSBub24tZGVsZXRlZCBhcmd1bWVudCwgdGhlbiBtb3ZlIGl0IGludG8gdGhlIGJhc2Ugb2Jq
ZWN0IGFuZCB0aGVuCisgICAgICAgICAgICAvLyBkZWxldGUgaXQuCisgICAgICAgICAgICBKU1Zh
bHVlIHZhbHVlID0gdGhpc09iamVjdC0+dHJ5R2V0QXJndW1lbnQoaSk7CisgICAgICAgICAgICBB
U1NFUlQodmFsdWUpOworICAgICAgICAgICAgb2JqZWN0LT5wdXREaXJlY3RNYXlCZUluZGV4KGV4
ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUpOworICAgICAgICAgICAgdGhpc09iamVjdC0+dHJ5RGVs
ZXRlQXJndW1lbnQoZXhlYy0+dm0oKSwgaSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIAorICAgICAgICAvLyBOb3cganVzdCBsZXQgdGhlIG5vcm1hbCBvYmplY3Qg
bWFjaGluZXJ5IGRvIGl0cyB0aGluZy4KKyAgICAgICAgcmV0dXJuIEJhc2U6OmRlZmluZU93blBy
b3BlcnR5KG9iamVjdCwgZXhlYywgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yLCBzaG91bGRUaHJv
dyk7CiAgICAgfQogCiAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBleGVjLT5wcm9wZXJ0eU5hbWVz
KCkubGVuZ3RoICYmICF0aGlzT2JqZWN0LT5tX292ZXJyb2RlTGVuZ3RoKSB7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2FyZ3VtZW50cy1iaXphcnJlLWJlaGF2aW9y
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJn
dW1lbnRzLWJpemFycmUtYmVoYXZpb3IuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvdGVzdHMvc3RyZXNzL2FyZ3VtZW50cy1iaXphcnJlLWJlaGF2aW9yLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMjUgQEAKK2Z1bmN0aW9uIGZvbyh4KSB7CisgICAgT2JqZWN0
LmRlZmluZVByb3BlcnR5KGFyZ3VtZW50cywgMCwge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVy
YWJsZTogdHJ1ZSwgd3JpdGFibGU6dHJ1ZSwgdmFsdWU6NDJ9KTsKKyAgICByZXR1cm4gW3gsIGFy
Z3VtZW50c1swXSwgYXJndW1lbnRzXQorfQorCit2YXIgcmVzdWx0ID0gZm9vKDEpOworCitpZiAo
cmVzdWx0WzBdICE9PSA0MikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKworaWYgKHJlc3VsdFsx
XSAhPT0gNDIpCisgICAgdGhyb3cgbmV3IEVycm9yKCk7CisKK2lmIChBcnJheS5wcm90b3R5cGUu
am9pbi5jYWxsKHJlc3VsdFsyXSwgIiwiKSAhPSAiNDIiKQorICAgIHRocm93IG5ldyBFcnJvcigp
OworCit2YXIgYXJyYXkgPSBbXTsKK2ZvciAodmFyIHMgaW4gcmVzdWx0WzJdKQorICAgIGFycmF5
LnB1c2gocyk7CisKK2lmIChhcnJheS5qb2luKCIsIikgIT0gIjAiKQorICAgIHRocm93IG5ldyBF
cnJvcigpOworCitpZiAoT2JqZWN0LmtleXMocmVzdWx0WzJdKS5qb2luKCIsIikgIT0gIjAiKQor
ICAgIHRocm93IG5ldyBFcnJvcigpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3Rz
L3N0cmVzcy9hcmd1bWVudHMtYml6YXJyZS1iZWhhdmlvdXItZGlzYWJsZS1lbnVtZXJhYmlsaXR5
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJn
dW1lbnRzLWJpemFycmUtYmVoYXZpb3VyLWRpc2FibGUtZW51bWVyYWJpbGl0eS5qcwkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWJp
emFycmUtYmVoYXZpb3VyLWRpc2FibGUtZW51bWVyYWJpbGl0eS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDI1IEBACitmdW5jdGlvbiBmb28oeCkgeworICAgIE9iamVjdC5kZWZpbmVQcm9w
ZXJ0eShhcmd1bWVudHMsIDAsIHtjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUs
IHdyaXRhYmxlOnRydWUsIHZhbHVlOjQyfSk7CisgICAgcmV0dXJuIFt4LCBhcmd1bWVudHNbMF0s
IGFyZ3VtZW50c10KK30KKwordmFyIHJlc3VsdCA9IGZvbygxKTsKKworaWYgKHJlc3VsdFswXSAh
PT0gNDIpCisgICAgdGhyb3cgbmV3IEVycm9yKCk7CisKK2lmIChyZXN1bHRbMV0gIT09IDQyKQor
ICAgIHRocm93IG5ldyBFcnJvcigpOworCitpZiAoQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChy
ZXN1bHRbMl0sICIsIikgIT0gIjQyIikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKwordmFyIGFy
cmF5ID0gW107Citmb3IgKHZhciBzIGluIHJlc3VsdFsyXSkKKyAgICBhcnJheS5wdXNoKHMpOwor
CitpZiAoYXJyYXkuam9pbigiLCIpICE9ICIwIikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKwor
aWYgKE9iamVjdC5rZXlzKHJlc3VsdFsyXSkuam9pbigiLCIpICE9ICIwIikKKyAgICB0aHJvdyBu
ZXcgRXJyb3IoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJn
dW1lbnRzLWN1c3RvbS1wcm9wZXJ0aWVzLWdjLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWN1c3RvbS1wcm9wZXJ0aWVzLWdjLmpz
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9hcmd1
bWVudHMtY3VzdG9tLXByb3BlcnRpZXMtZ2MuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwz
NiBAQAorZnVuY3Rpb24gbWFrZUJhc2VBcmd1bWVudHMoKSB7CisgICAgcmV0dXJuIGFyZ3VtZW50
czsKK30KKworbm9JbmxpbmUobWFrZUJhc2VBcmd1bWVudHMpOworCitmdW5jdGlvbiBtYWtlQXJy
YXkobGVuZ3RoKSB7CisgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7CisgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgYXJyYXlbaV0gPSA5OTk5OTsK
KyAgICByZXR1cm4gYXJyYXk7Cit9CisKK25vSW5saW5lKG1ha2VBcnJheSk7CisKK2Z1bmN0aW9u
IGNvbnMoZikgeworICAgIHZhciByZXN1bHQgPSBtYWtlQmFzZUFyZ3VtZW50cygpOworICAgIHJl
c3VsdC5mID0gZjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2YXIgYXJyYXkgPSBbXTsKK2Zv
ciAodmFyIGkgPSAwOyBpIDwgMTAwMDAwOyArK2kpCisgICAgYXJyYXkucHVzaChjb25zKGkpKTsK
KworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIHsKKyAgICB2YXIgaiA9IChpICog
MykgJSBhcnJheS5sZW5ndGg7CisgICAgYXJyYXlbal0gPSBjb25zKGopOworICAgIAorICAgIG1h
a2VBcnJheShpICUgNyk7Cit9CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyAr
K2kpIHsKKyAgICBpZiAoYXJyYXlbaV0uZiAhPSBpKQorICAgICAgICB0aHJvdyAiRXJyb3I6IGJh
ZCB2YWx1ZSBvZiBmIGF0ICIgKyBpICsgIjogIiArIGFycmF5W2ldLmY7Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>247201</attachid>
            <date>2015-02-23 21:27:36 -0800</date>
            <delta_ts>2015-02-23 21:42:11 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>8611</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgwNTQ5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBA
CisyMDE1LTAyLTIzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
T3VyIGJpemFycmUgYmVoYXZpb3Igb24gQXJndW1lbnRzOjpkZWZpbmVPd25Qcm9wZXJ0eSBzaG91
bGQgYmUgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhIHNwYWdoZXR0aSBpbmNpZGVudAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxOTUxCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIHBh
dGNoIGhhcyBubyBiZWhhdmlvcmFsIGNoYW5nZSwgYnV0IGl0IHNpbXBsaWZpZXMgYSBidW5jaCBv
ZiB3cm9uZyBjb2RlLiBUaGUgY29kZSBpcworICAgICAgICBzdGlsbCB3cm9uZyBpbiBleGFjdGx5
IHRoZSBzYW1lIHdheSwgYnV0IGF0IGxlYXN0IGl0J3Mgb2J2aW91cyB3aGF0J3MgZ29pbmcgb24u
IFRoZSB3cm9uZ25lc3MKKyAgICAgICAgaXMgY292ZXJlZCBieSB0aGlzIGJ1ZzogaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MTk1Mi4KKworICAgICAgICAqIHJ1bnRp
bWUvQXJndW1lbnRzLmNwcDoKKyAgICAgICAgKEpTQzo6QXJndW1lbnRzOjpjb3B5QmFja2luZ1N0
b3JlKTogV2Ugc2hvdWxkIG9ubHkgc2VlIHRoZSBhcmd1bWVudHMgdG9rZW47IGFzc2VydCBvdGhl
cndpc2UuIFRoaXMgd29ya3MgYmVjYXVzZSBpZiB0aGUgR0Mgc2VlcyB0aGUgYnV0dGVyZmx5IHRv
a2VuIGl0IGNhbGxzIHRoZSBKU09iamVjdDo6Y29weUJhY2tpbmdTdG9yZSBtZXRob2QgZGlyZWN0
bHkuCisgICAgICAgIChKU0M6OkFyZ3VtZW50czo6ZGVmaW5lT3duUHJvcGVydHkpOiBNYWtlIG91
ciBiaXphcnJlIGJlaGF2aW9yIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gYWNjaWRlbnQgb2Yg
YSBkZWNhZGUgb2YgcGF0Y2hlcy4KKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWJp
emFycmUtYmVoYXZpb3IuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiB0ZXN0
cy9zdHJlc3MvYXJndW1lbnRzLWJpemFycmUtYmVoYXZpb3VyLWRpc2FibGUtZW51bWVyYWJpbGl0
eS5qczogQWRkZWQuIE15IGNob2ljZSBvZiBzcGVsbGluZ3Mgb2YgdGhlIHdvcmQgImJlaGF2aW9b
dV1yIiBpcyBhbG1vc3QgYXMgY29uc2lzdGVudCBhcyBvdXIgaW1wbGVtZW50YXRpb24gb2YgYXJn
dW1lbnRzLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvYXJndW1lbnRz
LWN1c3RvbS1wcm9wZXJ0aWVzLWdjLmpzOiBBZGRlZC4gSSBhZGRlZCB0aGlzIHRlc3QgYmVjYXVz
ZSBhdCBmaXJzdCBJIHdhcyB1bnN1cmUgaWYgd2UgR0NkIGFyZ3VtZW50cyBjb3JyZWN0bHkuCisg
ICAgICAgIChtYWtlQmFzZUFyZ3VtZW50cyk6CisgICAgICAgIChtYWtlQXJyYXkpOgorICAgICAg
ICAoY29ucyk6CisKIDIwMTUtMDItMjMgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgRGlzYWJsZSBmb250IGxvYWRpbmcgZXZlbnRzIHVudGlsIG91ciBpbXBsZW1l
bnRhdGlvbiBnZXRzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGxhdGVzdCBzcGVjCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Bcmd1bWVudHMuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50cy5jcHAJKHJldmlzaW9uIDE4MDUw
NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0FyZ3VtZW50cy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTgxLDcgKzgxLDcgQEAgdm9pZCBBcmd1bWVudHM6OmNvcHlCYWNraW5nU3Rv
cmUoSlNDZWxsKgogICAgIH0KIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICB9CiB9CiAgICAgCkBAIC0yOTUs
MzUgKzI5NSwzMyBAQCBib29sIEFyZ3VtZW50czo6ZGVmaW5lT3duUHJvcGVydHkoSlNPYmplCiAg
ICAgdW5zaWduZWQgaSA9IHByb3BlcnR5TmFtZS5hc0luZGV4KCk7CiAgICAgaWYgKGkgPCB0aGlz
T2JqZWN0LT5tX251bUFyZ3VtZW50cykgewogICAgICAgICBSRUxFQVNFX0FTU0VSVChpIDwgUHJv
cGVydHlOYW1lOjpOb3RBbkluZGV4KTsKLSAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIG5v
dCB5ZXQgcHJlc2VudCBvbiB0aGUgb2JqZWN0LCBhbmQgaXMgbm90IHlldCBtYXJrZWQgYXMgZGVs
ZXRlZCwgdGhlbiBhZGQgaXQgbm93LgotICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xvdCh0aGlzT2Jq
ZWN0KTsKLSAgICAgICAgaWYgKCF0aGlzT2JqZWN0LT5pc0RlbGV0ZWRBcmd1bWVudChpKSAmJiAh
SlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdCh0aGlzT2JqZWN0LCBleGVjLCBwcm9wZXJ0eU5h
bWUsIHNsb3QpKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIHZhbHVlID0gdGhpc09iamVjdC0+dHJ5
R2V0QXJndW1lbnQoaSk7Ci0gICAgICAgICAgICBBU1NFUlQodmFsdWUpOwotICAgICAgICAgICAg
b2JqZWN0LT5wdXREaXJlY3RNYXlCZUluZGV4KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUpOwot
ICAgICAgICB9Ci0gICAgICAgIGlmICghQmFzZTo6ZGVmaW5lT3duUHJvcGVydHkob2JqZWN0LCBl
eGVjLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IsIHNob3VsZFRocm93KSkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBGcm9tIEVTIDUuMSwgMTAuNiBBcmd1bWVudHMg
T2JqZWN0Ci0gICAgICAgIC8vIDUuIElmIHRoZSB2YWx1ZSBvZiBpc01hcHBlZCBpcyBub3QgdW5k
ZWZpbmVkLCB0aGVuCisgICAgICAgIAogICAgICAgICBpZiAodGhpc09iamVjdC0+aXNBcmd1bWVu
dChpKSkgewotICAgICAgICAgICAgLy8gYS4gSWYgSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykg
aXMgdHJ1ZSwgdGhlbgotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNBY2Nlc3NvckRlc2Ny
aXB0b3IoKSkgewotICAgICAgICAgICAgICAgIC8vIGkuIENhbGwgdGhlIFtbRGVsZXRlXV0gaW50
ZXJuYWwgbWV0aG9kIG9mIG1hcCBwYXNzaW5nIFAsIGFuZCBmYWxzZSBhcyB0aGUgYXJndW1lbnRz
LgotICAgICAgICAgICAgICAgIHRoaXNPYmplY3QtPnRyeURlbGV0ZUFyZ3VtZW50KGV4ZWMtPnZt
KCksIGkpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gYi4gRWxzZQotICAgICAgICAgICAgICAg
IC8vIGkuIElmIERlc2MuW1tWYWx1ZV1dIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICAg
ICAvLyAxLiBDYWxsIHRoZSBbW1B1dF1dIGludGVybmFsIG1ldGhvZCBvZiBtYXAgcGFzc2luZyBQ
LCBEZXNjLltbVmFsdWVdXSwgYW5kIFRocm93IGFzIHRoZSBhcmd1bWVudHMuCisgICAgICAgICAg
ICBpZiAoIWRlc2NyaXB0b3IuaXNBY2Nlc3NvckRlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAg
ICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVsZXRlZCBhbmQgd2UgYXJlIHVzaW5nIGEg
bm9uLWFjY2Vzc29yIGRlc2NyaXB0b3IsIHRoZW4KKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1
cmUgdGhhdCB0aGUgYWxpYXNlZCBhcmd1bWVudCBzZWVzIHRoZSB2YWx1ZS4KICAgICAgICAgICAg
ICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpKQogICAgICAgICAgICAgICAgICAgICB0aGlzT2Jq
ZWN0LT50cnlTZXRBcmd1bWVudChleGVjLT52bSgpLCBpLCBkZXNjcmlwdG9yLnZhbHVlKCkpOwot
ICAgICAgICAgICAgICAgIC8vIGlpLiBJZiBEZXNjLltbV3JpdGFibGVdXSBpcyBwcmVzZW50IGFu
ZCBpdHMgdmFsdWUgaXMgZmFsc2UsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyAxLiBDYWxsIHRo
ZSBbW0RlbGV0ZV1dIGludGVybmFsIG1ldGhvZCBvZiBtYXAgcGFzc2luZyBQIGFuZCBmYWxzZSBh
cyBhcmd1bWVudHMuCi0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Iud3JpdGFibGVQcmVz
ZW50KCkgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhp
c09iamVjdC0+dHJ5RGVsZXRlQXJndW1lbnQoZXhlYy0+dm0oKSwgaSk7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlbGV0ZWQgYW5kIHdl
IGFyZSB1c2luZyBhIG5vbi1hY2Nlc3Nvciwgd3JpdGFibGUKKyAgICAgICAgICAgICAgICAvLyBk
ZXNjcmlwdG9yLCB0aGVuIHdlIGFyZSBkb25lLiBUaGUgYXJndW1lbnQgY29udGludWVzIHRvIGJl
IGFsaWFzZWQuIE5vdGUgdGhhdCB3ZQorICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcmVx
dWVzdCB0byBjaGFuZ2UgZW51bWVyYWJpbGl0eS4gV2UgYXBwZWFyIHRvIGhhdmUgYWx3YXlzIGRv
bmUgc28sIGluCisgICAgICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgdGhlIGFyZ3VtZW50IHdh
cyBzdGlsbCBhbGlhc2VkLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxOTUyCisgICAgICAgICAgICAgICAgaWYgKGRl
c2NyaXB0b3Iud3JpdGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0
eSBpcyBhIG5vbi1kZWxldGVkIGFyZ3VtZW50LCB0aGVuIG1vdmUgaXQgaW50byB0aGUgYmFzZSBv
YmplY3QgYW5kIHRoZW4KKyAgICAgICAgICAgIC8vIGRlbGV0ZSBpdC4KKyAgICAgICAgICAgIEpT
VmFsdWUgdmFsdWUgPSB0aGlzT2JqZWN0LT50cnlHZXRBcmd1bWVudChpKTsKKyAgICAgICAgICAg
IEFTU0VSVCh2YWx1ZSk7CisgICAgICAgICAgICBvYmplY3QtPnB1dERpcmVjdE1heUJlSW5kZXgo
ZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB0aGlzT2JqZWN0LT50cnlE
ZWxldGVBcmd1bWVudChleGVjLT52bSgpLCBpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIE5vdyBqdXN0IGxldCB0aGUgbm9ybWFsIG9iamVj
dCBtYWNoaW5lcnkgZG8gaXRzIHRoaW5nLgorICAgICAgICByZXR1cm4gQmFzZTo6ZGVmaW5lT3du
UHJvcGVydHkob2JqZWN0LCBleGVjLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IsIHNob3VsZFRo
cm93KTsKICAgICB9CiAKICAgICBpZiAocHJvcGVydHlOYW1lID09IGV4ZWMtPnByb3BlcnR5TmFt
ZXMoKS5sZW5ndGggJiYgIXRoaXNPYmplY3QtPm1fb3ZlcnJvZGVMZW5ndGgpIHsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWJpemFycmUtYmVoYXZp
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9h
cmd1bWVudHMtYml6YXJyZS1iZWhhdmlvci5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWJpemFycmUtYmVoYXZpb3IuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwyNSBAQAorZnVuY3Rpb24gZm9vKHgpIHsKKyAgICBPYmpl
Y3QuZGVmaW5lUHJvcGVydHkoYXJndW1lbnRzLCAwLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBlbnVt
ZXJhYmxlOiB0cnVlLCB3cml0YWJsZTp0cnVlLCB2YWx1ZTo0Mn0pOworICAgIHJldHVybiBbeCwg
YXJndW1lbnRzWzBdLCBhcmd1bWVudHNdCit9CisKK3ZhciByZXN1bHQgPSBmb28oMSk7CisKK2lm
IChyZXN1bHRbMF0gIT09IDQyKQorICAgIHRocm93IG5ldyBFcnJvcigpOworCitpZiAocmVzdWx0
WzFdICE9PSA0MikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKworaWYgKEFycmF5LnByb3RvdHlw
ZS5qb2luLmNhbGwocmVzdWx0WzJdLCAiLCIpICE9ICI0MiIpCisgICAgdGhyb3cgbmV3IEVycm9y
KCk7CisKK3ZhciBhcnJheSA9IFtdOworZm9yICh2YXIgcyBpbiByZXN1bHRbMl0pCisgICAgYXJy
YXkucHVzaChzKTsKKworaWYgKGFycmF5LmpvaW4oIiwiKSAhPSAiMCIpCisgICAgdGhyb3cgbmV3
IEVycm9yKCk7CisKK2lmIChPYmplY3Qua2V5cyhyZXN1bHRbMl0pLmpvaW4oIiwiKSAhPSAiMCIp
CisgICAgdGhyb3cgbmV3IEVycm9yKCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVz
dHMvc3RyZXNzL2FyZ3VtZW50cy1iaXphcnJlLWJlaGF2aW91ci1kaXNhYmxlLWVudW1lcmFiaWxp
dHkuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9h
cmd1bWVudHMtYml6YXJyZS1iZWhhdmlvdXItZGlzYWJsZS1lbnVtZXJhYmlsaXR5LmpzCShyZXZp
c2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9hcmd1bWVudHMt
Yml6YXJyZS1iZWhhdmlvdXItZGlzYWJsZS1lbnVtZXJhYmlsaXR5LmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzAgQEAKK2Z1bmN0aW9uIGZvbyh4KSB7CisgICAgT2JqZWN0LmRlZmluZVBy
b3BlcnR5KGFyZ3VtZW50cywgMCwge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFs
c2UsIHdyaXRhYmxlOnRydWUsIHZhbHVlOjQyfSk7CisgICAgcmV0dXJuIFt4LCBhcmd1bWVudHNb
MF0sIGFyZ3VtZW50c10KK30KKwordmFyIHJlc3VsdCA9IGZvbygxKTsKKworaWYgKHJlc3VsdFsw
XSAhPT0gNDIpCisgICAgdGhyb3cgbmV3IEVycm9yKCk7CisKK2lmIChyZXN1bHRbMV0gIT09IDQy
KQorICAgIHRocm93IG5ldyBFcnJvcigpOworCitpZiAoQXJyYXkucHJvdG90eXBlLmpvaW4uY2Fs
bChyZXN1bHRbMl0sICIsIikgIT0gIjQyIikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKwordmFy
IGFycmF5ID0gW107Citmb3IgKHZhciBzIGluIHJlc3VsdFsyXSkKKyAgICBhcnJheS5wdXNoKHMp
OworCitpZiAoYXJyYXkuam9pbigiLCIpICE9ICIwIikKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsK
KworaWYgKE9iamVjdC5rZXlzKHJlc3VsdFsyXSkuam9pbigiLCIpICE9ICIwIikKKyAgICB0aHJv
dyBuZXcgRXJyb3IoKTsKKworLy8gRklYTUU6IFRoaXMgaXMgdG90YWxseSB3ZWlyZCEKKy8vIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDE5NTIKK2lmIChPYmplY3Qu
Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlc3VsdFsyXSwgMCkuZW51bWVyYWJsZSAhPT0gdHJ1
ZSkKKyAgICB0aHJvdyBuZXcgRXJyb3IoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90
ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWN1c3RvbS1wcm9wZXJ0aWVzLWdjLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYXJndW1lbnRzLWN1c3RvbS1w
cm9wZXJ0aWVzLWdjLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rl
c3RzL3N0cmVzcy9hcmd1bWVudHMtY3VzdG9tLXByb3BlcnRpZXMtZ2MuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNiBAQAorZnVuY3Rpb24gbWFrZUJhc2VBcmd1bWVudHMoKSB7CisgICAg
cmV0dXJuIGFyZ3VtZW50czsKK30KKworbm9JbmxpbmUobWFrZUJhc2VBcmd1bWVudHMpOworCitm
dW5jdGlvbiBtYWtlQXJyYXkobGVuZ3RoKSB7CisgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KGxl
bmd0aCk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgYXJy
YXlbaV0gPSA5OTk5OTsKKyAgICByZXR1cm4gYXJyYXk7Cit9CisKK25vSW5saW5lKG1ha2VBcnJh
eSk7CisKK2Z1bmN0aW9uIGNvbnMoZikgeworICAgIHZhciByZXN1bHQgPSBtYWtlQmFzZUFyZ3Vt
ZW50cygpOworICAgIHJlc3VsdC5mID0gZjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2YXIg
YXJyYXkgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDAwOyArK2kpCisgICAgYXJyYXku
cHVzaChjb25zKGkpKTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIHsKKyAg
ICB2YXIgaiA9IChpICogMykgJSBhcnJheS5sZW5ndGg7CisgICAgYXJyYXlbal0gPSBjb25zKGop
OworICAgIAorICAgIG1ha2VBcnJheShpICUgNyk7Cit9CisKK2ZvciAodmFyIGkgPSAwOyBpIDwg
YXJyYXkubGVuZ3RoOyArK2kpIHsKKyAgICBpZiAoYXJyYXlbaV0uZiAhPSBpKQorICAgICAgICB0
aHJvdyAiRXJyb3I6IGJhZCB2YWx1ZSBvZiBmIGF0ICIgKyBpICsgIjogIiArIGFycmF5W2ldLmY7
Cit9Cg==
</data>
<flag name="review"
          id="272147"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>