<?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>39507</bug_id>
          
          <creation_ts>2010-05-21 12:27:25 -0700</creation_ts>
          <short_desc>Split out JITCall32_64.cpp</short_desc>
          <delta_ts>2010-05-21 15:02:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>abarth</cc>
    
    <cc>barraclough</cc>
    
    <cc>eric</cc>
    
    <cc>oliver</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>229043</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 12:27:25 -0700</bug_when>
    <thetext>Split out JITCall32_64.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229045</commentid>
    <comment_count>1</comment_count>
      <attachid>56734</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 12:29:03 -0700</bug_when>
    <thetext>Created attachment 56734
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229050</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-21 12:34:34 -0700</bug_when>
    <thetext>Attachment 56734 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/jit/JITCall32_64.cpp:37:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 13 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229051</commentid>
    <comment_count>3</comment_count>
      <attachid>56737</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 12:35:58 -0700</bug_when>
    <thetext>Created attachment 56737
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229052</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-21 12:38:34 -0700</bug_when>
    <thetext>Attachment 56737 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/jit/JITCall32_64.cpp:37:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 18 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229053</commentid>
    <comment_count>5</comment_count>
      <attachid>56738</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 12:40:28 -0700</bug_when>
    <thetext>Created attachment 56738
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229078</commentid>
    <comment_count>6</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 13:52:49 -0700</bug_when>
    <thetext>Committed r59955: &lt;http://trac.webkit.org/changeset/59955&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229092</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-21 14:17:25 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/59955 might have broken Qt Linux Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/59955
http://trac.webkit.org/changeset/59956</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229114</commentid>
    <comment_count>8</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-21 15:02:18 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/59956 is a more likely candidate, since it changed visited links, and the failing test is fast/history/self-is-visited.html.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56734</attachid>
            <date>2010-05-21 12:29:03 -0700</date>
            <delta_ts>2010-05-21 12:35:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-39507-20100521122902.patch</filename>
            <type>text/plain</type>
            <size>66506</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDUtMjEgIEdlb2ZmcmV5
IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTcGxpdCBvdXQgSklUQ2FsbDMyXzY0LmNwcCwgYW5kIHRpZ2h0
ZW5lZCB1cCBzb21lICNpZmRlZnMgaW4gdGhlIGhvcGVzCisgICAgICAgIG9mIGltcHJvdmluZyBj
b21waWxlIHRpbWVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Mzk1MDcKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6CisgICAgICAgICogaml0L0pJVC5jcHA6CisgICAgICAgICogaml0L0pJVEFyaXRo
bWV0aWMuY3BwOgorICAgICAgICAqIGppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwOgorICAgICAg
ICAqIGppdC9KSVRDYWxsLmNwcDoKKyAgICAgICAgKiBqaXQvSklUQ2FsbDMyXzY0LmNwcDogQ29w
aWVkIGZyb20gaml0L0pJVENhbGwuY3BwLgorICAgICAgICAqIGppdC9KSVRPcGNvZGVzLmNwcDoK
KyAgICAgICAgKiBqaXQvSklUT3Bjb2RlczMyXzY0LmNwcDoKKyAgICAgICAgKiBqaXQvSklUUHJv
cGVydHlBY2Nlc3MuY3BwOgorICAgICAgICAqIGppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNw
cDoKKyAgICAgICAgKiBqaXQvSklUU3R1YnMuY3BwOgorCiAyMDEwLTA1LTIxICBPbGl2ZXIgSHVu
dCAgPG9saXZlckBhcHBsZS5jb20+CiAKICAgICAgICAgV2luZG93cyBidWlsZCBmaXggIzMKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZh
U2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0x
MTEsNiArMTExLDcgQEAKIAkJMTQ0NjlERUQxMDdFQzdFNzAwNjUwNDQ2IC8qIFN0cmluZ1Byb3Rv
dHlwZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBC
QzE4QzNDNTBFMTZFRTMzMDBCMzQ0NjAgLyogU3RyaW5nUHJvdG90eXBlLmNwcCAqLzsgfTsKIAkJ
MTQ0NjlERUUxMDdFQzdFNzAwNjUwNDQ2IC8qIFVTdHJpbmcuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjY5MkE4ODUwMjU1NTk3RDAxRkY2MEY3IC8q
IFVTdHJpbmcuY3BwICovOyB9OwogCQkxNDZBQUIzODBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJp
bmdSZWZDRi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAxNDZBQUIzNzBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5jcHAgKi87IH07CisJ
CTE0NkZFNTEyMTFBNzEwNDMwMDg3QUU2NiAvKiBKSVRDYWxsMzJfNjQuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTQ2RkU1MTExMUE3MTA0MzAwODdB
RTY2IC8qIEpJVENhbGwzMl82NC5jcHAgKi87IH07CiAJCTE0N0I4M0FDMEU2REI4QzkwMDQ3NzVB
NCAvKiBCYXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTQ3QjgzQUEwRTZEQjhDOTAwNDc3NUE0IC8qIEJhdGNo
ZWRUcmFuc2l0aW9uT3B0aW1pemVyLmggKi87IH07CiAJCTE0N0I4NDYzMEU2REU2QjEwMDQ3NzVB
NCAvKiBQdXRQcm9wZXJ0eVNsb3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDE0N0I4NDYyMEU2REU2QjEwMDQ3NzVBNCAvKiBQdXRQcm9wZXJ0eVNsb3Qu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkxNDdG
MzlCRDEwN0VDMzc2MDA0MjdBNDggLyogQXJnTGlzdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0Y2MDUxMTBFMjAzRUY4MDBCOUE2NEQgLyogQXJn
TGlzdC5jcHAgKi87IH07CkBAIC02MzEsNiArNjMyLDcgQEAKIAkJMTQ1QzUwN0YwRDlERjYzQjAw
ODhGNkI5IC8qIENhbGxEYXRhLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENh
bGxEYXRhLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0NkFBQjJBMEI2NkE4NDkw
MEU1NUYxNiAvKiBKU1N0cmluZ1JlZkNGLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBKU1N0cmluZ1JlZkNGLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0NkFB
QjM3MEI2NkE5NDQwMEU1NUYxNiAvKiBKU1N0cmluZ1JlZkNGLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1N0cmluZ1JlZkNGLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJMTQ2RkU1MTExMUE3MTA0MzAwODdBRTY2IC8qIEpJVENhbGwzMl82NC5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKSVRDYWxsMzJfNjQuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNDc2MDg2MzA5OUM2MzM4MDA0MzcxMjgg
LyogSlNJbW1lZGlhdGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SlNJbW1lZGlhdGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNDdCODNBQTBF
NkRCOEM5MDA0Nzc1QTQgLyogQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3Qjg0NjIwRTZERTZCMTAwNDc3NUE0IC8qIFB1
dFByb3BlcnR5U2xvdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQdXRQcm9w
ZXJ0eVNsb3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEyNDEsNiArMTI0Myw3
IEBACiAJCQkJODZBOTBFQ0YwRUU3RDUxRjAwQUIzNTBEIC8qIEpJVEFyaXRobWV0aWMuY3BwICov
LAogCQkJCUE3NTcwNkREMTE4QTJCQ0YwMDU3Rjg4RiAvKiBKSVRBcml0aG1ldGljMzJfNjQuY3Bw
ICovLAogCQkJCTg2Q0M4NUEyMEVFNzlCNzQwMDI4ODY4MiAvKiBKSVRDYWxsLmNwcCAqLywKKwkJ
CQkxNDZGRTUxMTExQTcxMDQzMDA4N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCAqLywKIAkJCQk4
NkNDRUZERDBGNDEzRjg5MDBGRDdGOUUgLyogSklUQ29kZS5oICovLAogCQkJCTg2Q0M4NUEwMEVF
NzlBNDcwMDI4ODY4MiAvKiBKSVRJbmxpbmVNZXRob2RzLmggKi8sCiAJCQkJQkNERDUxRTkwRkI4
REY3NDAwNEE4QkRDIC8qIEpJVE9wY29kZXMuY3BwICovLApAQCAtMjYwNyw2ICsyNjEwLDcgQEAK
IAkJCQk4NjI2QkVDRjExOTI4RTM5MDA3ODJGQUIgLyogU3RyaW5nU3RhdGljcy5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQlBNzEyMzZFNTExOTVGMzNDMDBCRDIxNzQgLyogSklUT3Bjb2RlczMyXzY0
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2QzU2OEUwMTFBMjEzRUUwMDA3RjdGMCAvKiBNYWNy
b0Fzc2VtYmxlckFSTS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkxNDZGRTUxMjExQTcxMDQzMDA4
N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE3ODNBMkFCMTFB
NUJFODQwMDU2M0QyMCAvKiBKU09iamVjdFdpdGhHbG9iYWxPYmplY3QuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Cklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9qaXQvSklULmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQv
SklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsOCBAQAogICovCiAKICNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShKSVQpCiAjaW5jbHVkZSAiSklULmgiCiAKIC8vIFRo
aXMgcHJvYmFibHkgZG9lcyBub3QgYmVsb25nIGhlcmU7IGFkZGluZyBoZXJlIGZvciBub3cgYXMg
YSBxdWljayBXaW5kb3dzIGJ1aWxkIGZpeC4KQEAgLTMyLDggKzM0LDYgQEAKIEpTQzo6TWFjcm9B
c3NlbWJsZXJYODZDb21tb246OlNTRTJDaGVja1N0YXRlIEpTQzo6TWFjcm9Bc3NlbWJsZXJYODZD
b21tb246OnNfc3NlMkNoZWNrU3RhdGUgPSBOb3RDaGVja2VkU1NFMjsKICNlbmRpZgogCi0jaWYg
RU5BQkxFKEpJVCkKLQogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkludGVycHJl
dGVyLmgiCiAjaW5jbHVkZSAiSklUSW5saW5lTWV0aG9kcy5oIgpJbmRleDogSmF2YVNjcmlwdENv
cmUvaml0L0pJVEFyaXRobWV0aWMzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvaml0L0pJVEFyaXRobWV0aWMzMl82NC5jcHAJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNj
cmlwdENvcmUvaml0L0pJVEFyaXRobWV0aWMzMl82NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0
LDkgKzI0LDEwIEBACiAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSklULmgi
CiAKICNpZiBFTkFCTEUoSklUKQorI2lmIFVTRShKU1ZBTFVFMzJfNjQpCisjaW5jbHVkZSAiSklU
LmgiCiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJKSVRJbmxpbmVNZXRob2Rz
LmgiCkBAIC00Niw4ICs0Nyw2IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBK
U0MgewogCi0jaWYgVVNFKEpTVkFMVUUzMl82NCkKLQogdm9pZCBKSVQ6OmVtaXRfb3BfbmVnYXRl
KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiB7CiAgICAgdW5zaWduZWQgZHN0ID0g
Y3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKQEAgLTE0MDQsOCArMTQwMyw3IEBAIHZv
aWQgSklUOjplbWl0U2xvd19vcF9tb2QoSW5zdHJ1Y3Rpb24qIGMKIAogLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIEVORDogT1BfTU9EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLwogCi0jZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKLQotfQorfSAvLyBuYW1lc3Bh
Y2UgSlNDCiAKKyNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0KQogI2VuZGlmIC8vIEVOQUJMRShK
SVQpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQXJpdGhtZXRpYy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gSmF2YVNjcmlwdENvcmUvaml0L0pJVEFyaXRobWV0aWMuY3BwCShyZXZpc2lvbiA1OTk0
OSkKKysrIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRBcml0aG1ldGljLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjQsOSArMjQsMTAgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiSklULmgiCiAKICNpZiBFTkFCTEUoSklUKQorI2lmICFVU0UoSlNWQUxVRTMyXzY0KQorI2lu
Y2x1ZGUgIkpJVC5oIgogCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCiAjaW5jbHVkZSAiSklUSW5s
aW5lTWV0aG9kcy5oIgpAQCAtNDYsOCArNDcsNiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBu
YW1lc3BhY2UgSlNDIHsKIAotI2lmICFVU0UoSlNWQUxVRTMyXzY0KQotCiB2b2lkIEpJVDo6ZW1p
dF9vcF9sc2hpZnQoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKIHsKICAgICB1bnNp
Z25lZCByZXN1bHQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwpAQCAtMTgzNCw4
ICsxODMzLDcgQEAgdm9pZCBKSVQ6OmVtaXRTbG93X29wX3N1YihJbnN0cnVjdGlvbiogYwogCiAv
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiBPUF9BREQsIE9QX1NVQiwgT1Bf
TVVMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZW5kaWYgLy8gIVVTRShK
U1ZBTFVFMzJfNjQpCi0KIH0gLy8gbmFtZXNwYWNlIEpTQwogCisjZW5kaWYgLy8gIVVTRShKU1ZB
TFVFMzJfNjQpCiAjZW5kaWYgLy8gRU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2pp
dC9KSVRDYWxsMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRD
YWxsMzJfNjQuY3BwCShyZXZpc2lvbiA1OTkzOSkJKGZyb20gSmF2YVNjcmlwdENvcmUvaml0L0pJ
VENhbGwuY3BwOjU5OTM5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkpJ
VC5oIgorCisjaWYgRU5BQkxFKEpJVCkKKworI2luY2x1ZGUgIkNvZGVCbG9jay5oIgorI2luY2x1
ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKKyNpbmNsdWRlICJKSVRTdHViQ2FsbC5oIgorI2luY2x1
ZGUgIkpTQXJyYXkuaCIKKyNpbmNsdWRlICJKU0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiSW50ZXJw
cmV0ZXIuaCIKKyNpbmNsdWRlICJSZXN1bHRUeXBlLmgiCisjaW5jbHVkZSAiU2FtcGxpbmdUb29s
LmgiCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCit1c2lu
ZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgSlNDIHsKKworI2lmIFVTRShKU1ZBTFVFMzJf
NjQpCisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsSW5pdGlhbGl6ZUNhbGxGcmFtZSgpCit7Cisg
ICAgLy8gcmVnVDAgaG9sZHMgY2FsbGVlLCByZWdUMSBob2xkcyBhcmdDb3VudAorICAgIHN0b3Jl
MzIocmVnVDEsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6QXJndW1l
bnRDb3VudCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKworICAgIGxv
YWRQdHIoQWRkcmVzcyhyZWdUMCwgT0JKRUNUX09GRlNFVE9GKEpTRnVuY3Rpb24sIG1fc2NvcGVD
aGFpbikgKyBPQkpFQ1RfT0ZGU0VUT0YoU2NvcGVDaGFpbiwgbV9ub2RlKSksIHJlZ1QxKTsgLy8g
c2NvcGVDaGFpbgorCisgICAgc3RvcmVQdHIocmVnVDAsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0
ZXIsIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0
ZXIpKSkpOyAvLyBjYWxsZWUKKyAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVS
ZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWluICogc3RhdGljX2Nhc3Q8aW50PihzaXpl
b2YoUmVnaXN0ZXIpKSkpOyAvLyBzY29wZUNoYWluCit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BD
YWxsU2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgYXJnQ291
bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0g
aW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworCisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEs
IHJlZ1QwLCAwKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVyT2Zmc2V0
LCAxKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KGFyZ0NvdW50LCAyKTsKK30KKyAg
ICAgICAgICAKK3ZvaWQgSklUOjpjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3MoSW5zdHJ1Y3Rp
b24qIGluc3RydWN0aW9uKQoreworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUu
b3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJh
bmQ7CisgICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVyYW5kOworICAgIGludCB0
aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7CisKKyAgICBlbWl0UHV0SklU
U3R1YkFyZyhyZWdUMSwgcmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQo
cmVnaXN0ZXJPZmZzZXQsIDEpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQoYXJnQ291
bnQsIDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnRnJvbVZpcnR1YWxSZWdpc3Rlcihwcm90bywg
MywgcmVnVDIsIHJlZ1QzKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHRoaXNSZWdp
c3RlciwgNCk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJnc1NldHVwQXJncyhJ
bnN0cnVjdGlvbiopCit7CisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsK
KyAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMywgMSk7IC8vIHJlZ2lzdGVyT2Zmc2V0CisgICAg
ZW1pdFB1dEpJVFN0dWJBcmcocmVnVDIsIDIpOyAvLyBhcmdDb3VudAorfQorCit2b2lkIEpJVDo6
ZW1pdF9vcF9jYWxsX3B1dF9yZXN1bHQoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAg
IGludCBkc3QgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CisgICAgZW1pdFN0b3JlKGRzdCwg
cmVnVDEsIHJlZ1QwKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxWYXJhcmdzKEluc3Ry
dWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudFJlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bMl0udS5v
cGVyYW5kOworICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFu
ZDsKKworICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAgICBlbWl0TG9hZFBh
eWxvYWQoYXJnQ291bnRSZWdpc3RlciwgcmVnVDIpOyAvLyBhcmdDb3VudAorICAgIGFkZFB0cihJ
bW0zMihyZWdpc3Rlck9mZnNldCksIHJlZ1QyLCByZWdUMyk7IC8vIHJlZ2lzdGVyT2Zmc2V0CisK
KyAgICBjb21waWxlT3BDYWxsVmFyYXJnc1NldHVwQXJncyhpbnN0cnVjdGlvbik7CisKKyAgICBl
bWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwoY2FsbGVlLCByZWdUMSk7CisgICAgYWRkU2xvd0Nh
c2UoYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0
YS0+anNGdW5jdGlvblZQdHIpKSk7CisKKyAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNh
bGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCisgICAgbXVs
MzIoSW1tMzIoc2l6ZW9mKFJlZ2lzdGVyKSksIHJlZ1QzLCByZWdUMyk7CisgICAgYWRkUHRyKGNh
bGxGcmFtZVJlZ2lzdGVyLCByZWdUMyk7CisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIs
IEFkZHJlc3MocmVnVDMsIFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUgKiBzdGF0aWNfY2FzdDxp
bnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgbW92ZShyZWdUMywgY2FsbEZyYW1lUmVnaXN0
ZXIpOworCisgICAgbW92ZShyZWdUMiwgcmVnVDEpOyAvLyBhcmdDb3VudAorCisgICAgZW1pdE5h
a2VkQ2FsbChtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOworCisgICAg
c2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENh
bGxWYXJhcmdzU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nh
c2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyKQoreworICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlv
blsxXS51Lm9wZXJhbmQ7CisKKyAgICBsaW5rU2xvd0Nhc2VJZk5vdEpTQ2VsbChpdGVyLCBjYWxs
ZWUpOworICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKKworICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxs
KHRoaXMsIGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pOworICAgIHN0dWJDYWxsLmNhbGwoKTsK
KworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisKK3ZvaWQgSklUOjplbWl0
X29wX3JldChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQoreworICAgIHVuc2lnbmVk
IGRzdCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CisKKyAgICAvLyBXZSBjb3Vs
ZCBKSVQgZ2VuZXJhdGUgdGhlIGRlcmVmLCBvbmx5IGNhbGxpbmcgb3V0IHRvIEMgd2hlbiB0aGUg
cmVmY291bnQgaGl0cyB6ZXJvLgorICAgIGlmIChtX2NvZGVCbG9jay0+bmVlZHNGdWxsU2NvcGVD
aGFpbigpKQorICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBjdGlfb3BfcmV0X3Njb3BlQ2hhaW4p
LmNhbGwoKTsKKworICAgIGVtaXRMb2FkKGRzdCwgcmVnVDEsIHJlZ1QwKTsKKyAgICBlbWl0R2V0
RnJvbUNhbGxGcmFtZUhlYWRlclB0cihSZWdpc3RlckZpbGU6OlJldHVyblBDLCByZWdUMik7Cisg
ICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFt
ZSwgY2FsbEZyYW1lUmVnaXN0ZXIpOworCisgICAgcmVzdG9yZVJldHVybkFkZHJlc3NCZWZvcmVS
ZXR1cm4ocmVnVDIpOworICAgIHJldCgpOworfQorCit2b2lkIEpJVDo6ZW1pdF9vcF9yZXRfb2Jq
ZWN0X29yX3RoaXMoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKK3sKKyAgICB1bnNp
Z25lZCByZXN1bHQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIHVuc2ln
bmVkIHRoaXNSZWcgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworCisgICAgLy8g
V2UgY291bGQgSklUIGdlbmVyYXRlIHRoZSBkZXJlZiwgb25seSBjYWxsaW5nIG91dCB0byBDIHdo
ZW4gdGhlIHJlZmNvdW50IGhpdHMgemVyby4KKyAgICBpZiAobV9jb2RlQmxvY2stPm5lZWRzRnVs
bFNjb3BlQ2hhaW4oKSkKKyAgICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX3JldF9zY29w
ZUNoYWluKS5jYWxsKCk7CisKKyAgICBlbWl0TG9hZChyZXN1bHQsIHJlZ1QxLCByZWdUMCk7Cisg
ICAgSnVtcCBub3RKU0NlbGwgPSBicmFuY2gzMihOb3RFcXVhbCwgcmVnVDEsIEltbTMyKEpTVmFs
dWU6OkNlbGxUYWcpKTsKKyAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRP
RihKU0NlbGwsIG1fc3RydWN0dXJlKSksIHJlZ1QyKTsKKyAgICBKdW1wIG5vdE9iamVjdCA9IGJy
YW5jaDgoTm90RXF1YWwsIEFkZHJlc3MocmVnVDIsIE9CSkVDVF9PRkZTRVRPRihTdHJ1Y3R1cmUs
IG1fdHlwZUluZm8pICsgT0JKRUNUX09GRlNFVE9GKFR5cGVJbmZvLCBtX3R5cGUpKSwgSW1tMzIo
T2JqZWN0VHlwZSkpOworCisgICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0
ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOworICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVy
UHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKworICAg
IHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJuKHJlZ1QyKTsKKyAgICByZXQoKTsKKwor
ICAgIG5vdEpTQ2VsbC5saW5rKHRoaXMpOworICAgIG5vdE9iamVjdC5saW5rKHRoaXMpOworICAg
IGVtaXRMb2FkKHRoaXNSZWcsIHJlZ1QxLCByZWdUMCk7CisKKyAgICBlbWl0R2V0RnJvbUNhbGxG
cmFtZUhlYWRlclB0cihSZWdpc3RlckZpbGU6OlJldHVyblBDLCByZWdUMik7CisgICAgZW1pdEdl
dEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSwgY2FsbEZy
YW1lUmVnaXN0ZXIpOworCisgICAgcmVzdG9yZVJldHVybkFkZHJlc3NCZWZvcmVSZXR1cm4ocmVn
VDIpOworICAgIHJldCgpOworfQorCit2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbChJbnN0cnVj
dGlvbiogY3VycmVudEluc3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9y
JiBpdGVyKQoreworICAgIGNvbXBpbGVPcENhbGxTbG93Q2FzZShjdXJyZW50SW5zdHJ1Y3Rpb24s
IGl0ZXIsIG1fY2FsbExpbmtJbmZvSW5kZXgrKywgb3BfY2FsbCk7Cit9CisKK3ZvaWQgSklUOjpl
bWl0U2xvd19vcF9jYWxsX2V2YWwoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVj
dG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKK3sKKyAgICBjb21waWxlT3BDYWxs
U2xvd0Nhc2UoY3VycmVudEluc3RydWN0aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0luZGV4Kyss
IG9wX2NhbGxfZXZhbCk7Cit9CisKK3ZvaWQgSklUOjplbWl0U2xvd19vcF9jYWxsX3ZhcmFyZ3Mo
SW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+Ojpp
dGVyYXRvciYgaXRlcikKK3sKKyAgICBjb21waWxlT3BDYWxsVmFyYXJnc1Nsb3dDYXNlKGN1cnJl
bnRJbnN0cnVjdGlvbiwgaXRlcik7Cit9CisKK3ZvaWQgSklUOjplbWl0U2xvd19vcF9jb25zdHJ1
Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+
OjppdGVyYXRvciYgaXRlcikKK3sKKyAgICBjb21waWxlT3BDYWxsU2xvd0Nhc2UoY3VycmVudElu
c3RydWN0aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0luZGV4KyssIG9wX2NvbnN0cnVjdCk7Cit9
CisKK3ZvaWQgSklUOjplbWl0X29wX2NhbGwoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlv
bikKK3sKKyAgICBjb21waWxlT3BDYWxsKG9wX2NhbGwsIGN1cnJlbnRJbnN0cnVjdGlvbiwgbV9j
YWxsTGlua0luZm9JbmRleCsrKTsKK30KKwordm9pZCBKSVQ6OmVtaXRfb3BfY2FsbF9ldmFsKElu
c3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCit7CisgICAgY29tcGlsZU9wQ2FsbChvcF9j
YWxsX2V2YWwsIGN1cnJlbnRJbnN0cnVjdGlvbiwgbV9jYWxsTGlua0luZm9JbmRleCsrKTsKK30K
Kwordm9pZCBKSVQ6OmVtaXRfb3BfbG9hZF92YXJhcmdzKEluc3RydWN0aW9uKiBjdXJyZW50SW5z
dHJ1Y3Rpb24pCit7CisgICAgaW50IGFyZ0NvdW50RHN0ID0gY3VycmVudEluc3RydWN0aW9uWzFd
LnUub3BlcmFuZDsKKyAgICBpbnQgYXJnc09mZnNldCA9IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51
Lm9wZXJhbmQ7CisKKyAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfbG9hZF92
YXJhcmdzKTsKKyAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMihhcmdzT2Zmc2V0KSk7Cisg
ICAgc3R1YkNhbGwuY2FsbCgpOworICAgIC8vIFN0b3JlcyBhIG5ha2VkIGludDMyIGluIHRoZSBy
ZWdpc3RlciBmaWxlLgorICAgIHN0b3JlMzIocmV0dXJuVmFsdWVSZWdpc3RlciwgQWRkcmVzcyhj
YWxsRnJhbWVSZWdpc3RlciwgYXJnQ291bnREc3QgKiBzaXplb2YoUmVnaXN0ZXIpKSk7Cit9CisK
K3ZvaWQgSklUOjplbWl0X29wX2NhbGxfdmFyYXJncyhJbnN0cnVjdGlvbiogY3VycmVudEluc3Ry
dWN0aW9uKQoreworICAgIGNvbXBpbGVPcENhbGxWYXJhcmdzKGN1cnJlbnRJbnN0cnVjdGlvbik7
Cit9CisKK3ZvaWQgSklUOjplbWl0X29wX2NvbnN0cnVjdChJbnN0cnVjdGlvbiogY3VycmVudElu
c3RydWN0aW9uKQoreworICAgIGNvbXBpbGVPcENhbGwob3BfY29uc3RydWN0LCBjdXJyZW50SW5z
dHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Cit9CisKKyNpZiAhRU5BQkxFKEpJVF9P
UFRJTUlaRV9DQUxMKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46
ICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSAqLworCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1
Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1
Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUu
b3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJh
bmQ7CisKKyAgICBKdW1wIHdhc0V2YWw7CisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZh
bCkgeworICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9ldmFs
KTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlKTsKKyAgICAgICAgc3R1YkNh
bGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOworICAgICAgICBzdHVi
Q2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7CisgICAgICAgIHN0dWJDYWxs
LmNhbGwoKTsKKyAgICAgICAgd2FzRXZhbCA9IGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1t
MzIoSlNWYWx1ZTo6RW1wdHlWYWx1ZVRhZykpOworICAgIH0KKworICAgIGVtaXRMb2FkKGNhbGxl
ZSwgcmVnVDEsIHJlZ1QwKTsKKworICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsKQorICAgICAg
ICBjb21waWxlT3BDYWxsU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKKyAgICBlbHNlIGlmIChvcGNv
ZGVJRCA9PSBvcF9jb25zdHJ1Y3QpCisgICAgICAgIGNvbXBpbGVPcENvbnN0cnVjdFNldHVwQXJn
cyhpbnN0cnVjdGlvbik7CisKKyAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwoY2FsbGVl
LCByZWdUMSk7CisgICAgYWRkU2xvd0Nhc2UoYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJl
Z1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKSk7CisKKyAgICAvLyBG
aXJzdCwgaW4gdGhlIGNhc2Ugb2YgYSBjb25zdHJ1Y3QsIGFsbG9jYXRlIHRoZSBuZXcgb2JqZWN0
LgorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpIHsKKyAgICAgICAgSklUU3R1YkNh
bGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCkuY2FsbChyZWdpc3Rlck9mZnNl
dCAtIFJlZ2lzdGVyRmlsZTo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSAtIGFyZ0NvdW50KTsKKyAgICAg
ICAgZW1pdExvYWQoY2FsbGVlLCByZWdUMSwgcmVnVDApOworICAgIH0KKworICAgIC8vIFNwZWN1
bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWluZyBhcmdDb3VudCB3aWxsIG1hdGNo
IHRoZSBhcml0eS4KKyAgICBzdG9yZVB0cihjYWxsRnJhbWVSZWdpc3RlciwgQWRkcmVzcyhjYWxs
RnJhbWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUgKyByZWdpc3Rlck9mZnNl
dCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgYWRkUHRyKElt
bTMyKHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSks
IGNhbGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBtb3ZlKEltbTMyKGFyZ0NvdW50KSwgcmVnVDEpOwor
CisgICAgZW1pdE5ha2VkQ2FsbChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBtX2dsb2JhbERh
dGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDb25zdHJ1Y3QoKSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1
YnMuY3RpVmlydHVhbENhbGwoKSk7CisKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFs
KQorICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9j
b2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNsb3dDYXNlKEluc3RydWN0
aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlciwg
dW5zaWduZWQsIE9wY29kZUlEIG9wY29kZUlEKQoreworICAgIGludCBjYWxsZWUgPSBpbnN0cnVj
dGlvblsxXS51Lm9wZXJhbmQ7CisKKyAgICBsaW5rU2xvd0Nhc2VJZk5vdEpTQ2VsbChpdGVyLCBj
YWxsZWUpOworICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKKworICAgIEpJVFN0dWJDYWxsIHN0dWJD
YWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90
SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKTsKKyAgICBzdHViQ2FsbC5j
YWxsKCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCisjZWxzZSAv
LyAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gQkVHSU46IEVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsKE9wY29kZUlEIG9w
Y29kZUlELCBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0lu
ZGV4KQoreworICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CisgICAg
aW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGludCByZWdpc3Rl
ck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKworICAgIEp1bXAgd2FzRXZhbDsK
KyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKSB7CisgICAgICAgIEpJVFN0dWJDYWxs
IHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwpOworICAgICAgICBzdHViQ2FsbC5hZGRB
cmd1bWVudChjYWxsZWUpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMy
KHJlZ2lzdGVyT2Zmc2V0KSk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1t
MzIoYXJnQ291bnQpKTsKKyAgICAgICAgc3R1YkNhbGwuY2FsbCgpOworICAgICAgICB3YXNFdmFs
ID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpFbXB0eVZhbHVlVGFn
KSk7CisgICAgfQorCisgICAgZW1pdExvYWQoY2FsbGVlLCByZWdUMSwgcmVnVDApOworCisgICAg
RGF0YUxhYmVsUHRyIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2s7CisKKyAgICBCRUdJTl9V
TklOVEVSUlVQVEVEX1NFUVVFTkNFKHNlcXVlbmNlT3BDYWxsKTsKKworICAgIEp1bXAganVtcFRv
U2xvdyA9IGJyYW5jaFB0cldpdGhQYXRjaChOb3RFcXVhbCwgcmVnVDAsIGFkZHJlc3NPZkxpbmtl
ZEZ1bmN0aW9uQ2hlY2ssIEltbVB0cigwKSk7CisKKyAgICBFTkRfVU5JTlRFUlJVUFRFRF9TRVFV
RU5DRShzZXF1ZW5jZU9wQ2FsbCk7CisKKyAgICBhZGRTbG93Q2FzZShqdW1wVG9TbG93KTsKKyAg
ICBBU1NFUlQoZGlmZmVyZW5jZUJldHdlZW4oYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjaywg
anVtcFRvU2xvdykgPT0gcGF0Y2hPZmZzZXRPcENhbGxDb21wYXJlVG9KdW1wKTsKKyAgICBtX2Nh
bGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRo
QmVnaW4gPSBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrOworCisgICAgYWRkU2xvd0Nhc2Uo
YnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpDZWxsVGFnKSkpOworCisg
ICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgZmFzdCBjYXNlLCBvbmx5IHVzZWQgd2hhbiBhIGNh
bGxlZSBjYW4gYmUgbGlua2VkLgorCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgT3BDb25zdHJ1Y3Qs
IGNhbGwgb3V0IHRvIGEgY3RpXyBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIG5ldyBvYmplY3QuCisg
ICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgeworICAgICAgICBpbnQgcHJvdG8gPSBp
bnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7CisgICAgICAgIGludCB0aGlzUmVnaXN0ZXIgPSBpbnN0
cnVjdGlvbls1XS51Lm9wZXJhbmQ7CisKKyAgICAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhp
cywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFy
Z3VtZW50KHJlZ1QxLCByZWdUMCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMy
KDApKTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHVudXNlZCBKSVRTdHViIGFyZ3VtZW50LgorICAg
ICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMigwKSk7IC8vIEZJWE1FOiBSZW1vdmUgdGhp
cyB1bnVzZWQgSklUU3R1YiBhcmd1bWVudC4KKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQo
cHJvdG8pOworICAgICAgICBzdHViQ2FsbC5jYWxsKHRoaXNSZWdpc3Rlcik7CisKKyAgICAgICAg
ZW1pdExvYWQoY2FsbGVlLCByZWdUMSwgcmVnVDApOworICAgIH0KKworICAgIC8vIEZhc3QgdmVy
c2lvbiBvZiBzdGFjayBmcmFtZSBpbml0aWFsaXphdGlvbiwgZGlyZWN0bHkgcmVsYXRpdmUgdG8g
ZWRpLgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9taXRzIHRvIHNldCB1cCBSZWdpc3RlckZpbGU6
OkNvZGVCbG9jaywgd2hpY2ggaXMgc2V0IGluIHRoZSBjYWxsZWUKKyAgICBsb2FkUHRyKEFkZHJl
c3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JK
RUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMik7CisKKyAgICBzdG9yZTMy
KEltbTMyKGFyZ0NvdW50KSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zm
c2V0ICsgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50KSAqIHN0YXRpY19jYXN0PGludD4oc2l6
ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihjYWxsRnJhbWVSZWdpc3RlciwgQWRkcmVz
cyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpDYWxs
ZXJGcmFtZSkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgZW1p
dFN0b3JlKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpDYWxsZWUsIHJlZ1QxLCByZWdU
MCk7CisgICAgc3RvcmVQdHIocmVnVDIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdp
c3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbikgKiBzdGF0aWNfY2FzdDxpbnQ+
KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgYWRkUHRyKEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICog
c2l6ZW9mKFJlZ2lzdGVyKSksIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKworICAgIC8vIENhbGwgdG8g
dGhlIGNhbGxlZQorICAgIG1fY2FsbFN0cnVjdHVyZVN0dWJDb21waWxhdGlvbkluZm9bY2FsbExp
bmtJbmZvSW5kZXhdLmhvdFBhdGhPdGhlciA9IGVtaXROYWtlZENhbGwoKTsKKyAgICAKKyAgICBp
ZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKQorICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7
CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6Y29t
cGlsZU9wQ2FsbFNsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dD
YXNlRW50cnk+OjppdGVyYXRvciYgaXRlciwgdW5zaWduZWQgY2FsbExpbmtJbmZvSW5kZXgsIE9w
Y29kZUlEIG9wY29kZUlEKQoreworICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9w
ZXJhbmQ7CisgICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAg
IGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKworICAgIGxp
bmtTbG93Q2FzZShpdGVyKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICAvLyBUaGUg
YXJndW1lbnRzIGhhdmUgYmVlbiBzZXQgdXAgb24gdGhlIGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2
YWwKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkKKyAgICAgICAgY29tcGlsZU9wQ2FsbFNl
dHVwQXJncyhpbnN0cnVjdGlvbik7CisgICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3Ry
dWN0KQorICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwor
CisgICAgLy8gRmFzdCBjaGVjayBmb3IgSlMgZnVuY3Rpb24uCisgICAgSnVtcCBjYWxsTGlua0Zh
aWxOb3RPYmplY3QgPSBicmFuY2gzMihOb3RFcXVhbCwgcmVnVDEsIEltbTMyKEpTVmFsdWU6OkNl
bGxUYWcpKTsKKyAgICBKdW1wIGNhbGxMaW5rRmFpbE5vdEpTRnVuY3Rpb24gPSBicmFuY2hQdHIo
Tm90RXF1YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9u
VlB0cikpOworCisgICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxv
Y2F0ZSB0aGUgbmV3IG9iamVjdC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7
CisgICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3Qp
LmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUg
LSBhcmdDb3VudCk7CisgICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAg
ICB9CisKKyAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcg
YXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVn
aXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdpc3RlckZpbGU6OkNhbGxlckZy
YW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIp
KSkpOworICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHN0YXRpY19jYXN0PGludD4o
c2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgbW92ZShJbW0zMihh
cmdDb3VudCksIHJlZ1QxKTsKKworICAgIG1fY2FsbFN0cnVjdHVyZVN0dWJDb21waWxhdGlvbklu
Zm9bY2FsbExpbmtJbmZvSW5kZXhdLmNhbGxSZXR1cm5Mb2NhdGlvbiA9IGVtaXROYWtlZENhbGwo
b3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0
dWFsQ29uc3RydWN0TGluaygpIDogbV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2Fs
bExpbmsoKSk7CisKKyAgICAvLyBJZiBub3QsIHdlIG5lZWQgYW4gZXh0cmEgY2FzZSBpbiB0aGUg
aWYgYmVsb3chCisgICAgQVNTRVJUKE9QQ09ERV9MRU5HVEgob3BfY2FsbCkgPT0gT1BDT0RFX0xF
TkdUSChvcF9jYWxsX2V2YWwpKTsKKworICAgIC8vIERvbmUhIC0gcmV0dXJuIGJhY2sgdG8gdGhl
IGhvdCBwYXRoLgorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpCisgICAgICAgIGVt
aXRKdW1wU2xvd1RvSG90KGp1bXAoKSwgT1BDT0RFX0xFTkdUSChvcF9jb25zdHJ1Y3QpKTsKKyAg
ICBlbHNlCisgICAgICAgIGVtaXRKdW1wU2xvd1RvSG90KGp1bXAoKSwgT1BDT0RFX0xFTkdUSChv
cF9jYWxsKSk7CisKKyAgICAvLyBUaGlzIGhhbmRsZXMgaG9zdCBmdW5jdGlvbnMKKyAgICBjYWxs
TGlua0ZhaWxOb3RPYmplY3QubGluayh0aGlzKTsKKyAgICBjYWxsTGlua0ZhaWxOb3RKU0Z1bmN0
aW9uLmxpbmsodGhpcyk7CisgICAgSklUU3R1YkNhbGwodGhpcywgb3Bjb2RlSUQgPT0gb3BfY29u
c3RydWN0ID8gY3RpX29wX2NvbnN0cnVjdF9Ob3RKU0NvbnN0cnVjdCA6IGN0aV9vcF9jYWxsX05v
dEpTRnVuY3Rpb24pLmNhbGwoKTsKKworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7
Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQ6ICFFTkFCTEUgLyBF
TkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LworCisjZW5kaWYgLy8gIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKKworI2Vsc2UgLy8gVVNF
KEpTVkFMVUUzMl82NCkKKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxJbml0aWFsaXplQ2FsbEZy
YW1lKCkKK3sKKyAgICBzdG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBS
ZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKSk7CisKKyAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihK
U0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1f
bm9kZSkpLCByZWdUMSk7IC8vIG5ld1Njb3BlQ2hhaW4KKworICAgIHN0b3JlUHRyKHJlZ1QwLCBB
ZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0YXRpY19j
YXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVz
cyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWluICogc3RhdGljX2Nh
c3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2Fs
bFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IGFyZ0NvdW50
ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGludCByZWdpc3Rlck9mZnNldCA9IGlu
c3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKworICAgIC8vIGVjeCBob2xkcyBmdW5jCisgICAgZW1p
dFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQo
YXJnQ291bnQsIDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQocmVnaXN0ZXJPZmZz
ZXQsIDEpOworfQorICAgICAgICAgIAordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxWYXJhcmdzU2V0
dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgcmVnaXN0ZXJPZmZz
ZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisgICAgCisgICAgLy8gZWN4IGhvbGRzIGZ1
bmMKKyAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMCwgMCk7CisgICAgZW1pdFB1dEpJVFN0dWJB
cmcocmVnVDEsIDIpOworICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCksIHJlZ1QxLCBy
ZWdUMik7CisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDIsIDEpOworfQorCit2b2lkIEpJVDo6
Y29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sK
KyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisgICAgaW50IHJl
Z2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworICAgIGludCBwcm90byA9
IGluc3RydWN0aW9uWzRdLnUub3BlcmFuZDsKKyAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1
Y3Rpb25bNV0udS5vcGVyYW5kOworCisgICAgLy8gZWN4IGhvbGRzIGZ1bmMKKyAgICBlbWl0UHV0
SklUU3R1YkFyZyhyZWdUMCwgMCk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdp
c3Rlck9mZnNldCwgMSk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwg
Mik7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdGcm9tVmlydHVhbFJlZ2lzdGVyKHByb3RvLCAzLCBy
ZWdUMik7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudCh0aGlzUmVnaXN0ZXIsIDQpOwor
fQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jYWxsX3B1dF9yZXN1bHQoSW5zdHJ1Y3Rpb24qIGluc3Ry
dWN0aW9uKQoreworICAgIGludCBkc3QgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CisgICAg
ZW1pdFB1dFZpcnR1YWxSZWdpc3Rlcihkc3QpOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2Fs
bFZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAgIGludCBjYWxsZWUgPSBp
bnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CisgICAgaW50IGFyZ0NvdW50UmVnaXN0ZXIgPSBpbnN0
cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisKKyAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGFyZ0Nv
dW50UmVnaXN0ZXIsIHJlZ1QxKTsKKyAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwg
cmVnVDApOworICAgIGNvbXBpbGVPcENhbGxWYXJhcmdzU2V0dXBBcmdzKGluc3RydWN0aW9uKTsK
KworICAgIC8vIENoZWNrIGZvciBKU0Z1bmN0aW9ucy4KKyAgICBlbWl0SnVtcFNsb3dDYXNlSWZO
b3RKU0NlbGwocmVnVDApOworICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRk
cmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOworCisg
ICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50
IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAgIG11bDMyKEltbTMyKHNpemVvZihSZWdpc3Rlcikp
LCByZWdUMiwgcmVnVDIpOworICAgIGludHB0cl90IG9mZnNldCA9IChpbnRwdHJfdClzaXplb2Yo
UmVnaXN0ZXIpICogKGludHB0cl90KVJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWU7CisgICAgYWRk
UHRyKEltbTMyKChpbnQzMl90KW9mZnNldCksIHJlZ1QyLCByZWdUMyk7CisgICAgYWRkUHRyKGNh
bGxGcmFtZVJlZ2lzdGVyLCByZWdUMyk7CisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIs
IHJlZ1QzKTsKKyAgICBhZGRQdHIocmVnVDIsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBlbWl0
TmFrZWRDYWxsKG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7CisKKyAg
ICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9w
Q2FsbFZhcmFyZ3NTbG93Q2FzZShJbnN0cnVjdGlvbiosIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6
aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgbGlua1Nsb3dDYXNlKGl0ZXIpOworICAgIGxpbmtTbG93
Q2FzZShpdGVyKTsKKyAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9O
b3RKU0Z1bmN0aW9uKTsKKyAgICBzdHViQ2FsbC5jYWxsKCk7CisgICAgCisgICAgc2FtcGxlQ29k
ZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKyAgICAKKyNpZiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9D
QUxMKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46ICFFTkFCTEUo
SklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2
b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGlu
c3RydWN0aW9uLCB1bnNpZ25lZCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsK
KyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAg
ICAvLyBIYW5kbGUgZXZhbAorICAgIEp1bXAgd2FzRXZhbDsKKyAgICBpZiAob3Bjb2RlSUQgPT0g
b3BfY2FsbF9ldmFsKSB7CisgICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9v
cF9jYWxsX2V2YWwpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUsIHJlZ1Qw
KTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNl
dCkpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7
CisgICAgICAgIHN0dWJDYWxsLmNhbGwoKTsKKyAgICAgICAgd2FzRXZhbCA9IGJyYW5jaFB0cihO
b3RFcXVhbCwgcmVnVDAsIEltbVB0cihKU1ZhbHVlOjplbmNvZGUoSlNWYWx1ZSgpKSkpOworICAg
IH0KKworICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7CisgICAgLy8g
VGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2Fs
bF9ldmFsCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGwpCisgICAgICAgIGNvbXBpbGVPcENh
bGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2Nv
bnN0cnVjdCkKKyAgICAgICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9u
KTsKKworICAgIC8vIENoZWNrIGZvciBKU0Z1bmN0aW9ucy4KKyAgICBlbWl0SnVtcFNsb3dDYXNl
SWZOb3RKU0NlbGwocmVnVDApOworICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwg
QWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwor
CisgICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUg
bmV3IG9iamVjdC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7CisgICAgICAg
IEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVn
aXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3Vu
dCk7CisgICAgICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7CisgICAg
fQorCisgICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFy
Z0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lz
dGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFt
ZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkp
KTsKKyAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNp
emVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1lUmVnaXN0ZXIpOworICAgIG1vdmUoSW1tMzIoYXJn
Q291bnQpLCByZWdUMSk7CisKKyAgICBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0
cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdCgpIDogbV9n
bG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKKworICAgIGlmIChvcGNvZGVJ
RCA9PSBvcF9jYWxsX2V2YWwpCisgICAgICAgIHdhc0V2YWwubGluayh0aGlzKTsKKworICAgIHNh
bXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxs
U2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46
Oml0ZXJhdG9yJiBpdGVyLCB1bnNpZ25lZCwgT3Bjb2RlSUQgb3Bjb2RlSUQpCit7CisgICAgbGlu
a1Nsb3dDYXNlKGl0ZXIpOworICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKKyAgICBKSVRTdHViQ2Fs
bCBzdHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3Ry
dWN0X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2NhbGxfTm90SlNGdW5jdGlvbik7CisgICAgc3R1
YkNhbGwuY2FsbCgpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwor
I2Vsc2UgLy8gIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tIEJFR0lOOiBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNv
ZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlu
a0luZm9JbmRleCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5k
OworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICBpbnQg
cmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAgICAvLyBIYW5k
bGUgZXZhbAorICAgIEp1bXAgd2FzRXZhbDsKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9l
dmFsKSB7CisgICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2
YWwpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUsIHJlZ1QwKTsKKyAgICAg
ICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOworICAg
ICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7CisgICAgICAg
IHN0dWJDYWxsLmNhbGwoKTsKKyAgICAgICAgd2FzRXZhbCA9IGJyYW5jaFB0cihOb3RFcXVhbCwg
cmVnVDAsIEltbVB0cihKU1ZhbHVlOjplbmNvZGUoSlNWYWx1ZSgpKSkpOworICAgIH0KKworICAg
IC8vIFRoaXMgcGxhbnRzIGEgY2hlY2sgZm9yIGEgY2FjaGVkIEpTRnVuY3Rpb24gdmFsdWUsIHNv
IHdlIGNhbiBwbGFudCBhIGZhc3QgbGluayB0byB0aGUgY2FsbGVlLgorICAgIC8vIFRoaXMgZGVs
aWJlcmF0ZWx5IGxlYXZlcyB0aGUgY2FsbGVlIGluIGVjeCwgdXNlZCB3aGVuIHNldHRpbmcgdXAg
dGhlIHN0YWNrIGZyYW1lIGJlbG93CisgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxsZWUs
IHJlZ1QwKTsKKyAgICBEYXRhTGFiZWxQdHIgYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsK
KworICAgIEJFR0lOX1VOSU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOworCisg
ICAgSnVtcCBqdW1wVG9TbG93ID0gYnJhbmNoUHRyV2l0aFBhdGNoKE5vdEVxdWFsLCByZWdUMCwg
YWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjaywgSW1tUHRyKEpTVmFsdWU6OmVuY29kZShKU1Zh
bHVlKCkpKSk7CisKKyAgICBFTkRfVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2Fs
bCk7CisKKyAgICBhZGRTbG93Q2FzZShqdW1wVG9TbG93KTsKKyAgICBBU1NFUlRfSklUX09GRlNF
VChkaWZmZXJlbmNlQmV0d2VlbihhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrLCBqdW1wVG9T
bG93KSwgcGF0Y2hPZmZzZXRPcENhbGxDb21wYXJlVG9KdW1wKTsKKyAgICBtX2NhbGxTdHJ1Y3R1
cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoQmVnaW4gPSBh
ZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0
aGUgZmFzdCBjYXNlLCBvbmx5IHVzZWQgd2hhbiBhIGNhbGxlZSBjYW4gYmUgbGlua2VkLgorCisg
ICAgLy8gSW4gdGhlIGNhc2Ugb2YgT3BDb25zdHJ1Y3QsIGNhbGwgb3V0IHRvIGEgY3RpXyBmdW5j
dGlvbiB0byBjcmVhdGUgdGhlIG5ldyBvYmplY3QuCisgICAgaWYgKG9wY29kZUlEID09IG9wX2Nv
bnN0cnVjdCkgeworICAgICAgICBpbnQgcHJvdG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7
CisgICAgICAgIGludCB0aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7CisK
KyAgICAgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgICAgICBlbWl0UHV0SklU
U3R1YkFyZ0Zyb21WaXJ0dWFsUmVnaXN0ZXIocHJvdG8sIDMsIHJlZ1QyKTsKKyAgICAgICAgSklU
U3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCk7Cisg
ICAgICAgIHN0dWJDYWxsLmNhbGwodGhpc1JlZ2lzdGVyKTsKKyAgICAgICAgZW1pdEdldFZpcnR1
YWxSZWdpc3RlcihjYWxsZWUsIHJlZ1QwKTsKKyAgICB9CisKKyAgICAvLyBGYXN0IHZlcnNpb24g
b2Ygc3RhY2sgZnJhbWUgaW5pdGlhbGl6YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZlIHRvIGVkaS4K
KyAgICAvLyBOb3RlIHRoYXQgdGhpcyBvbWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJGaWxlOjpDb2Rl
QmxvY2ssIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FsbGVlCisKKyAgICBsb2FkUHRyKEFkZHJlc3Mo
cmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNU
X09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7IC8vIG5ld1Njb3BlQ2hhaW4K
KworICAgIHN0b3JlMzIoSW1tMzIoYXJnQ291bnQpLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVy
LCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQpICogc3RhdGlj
X2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJl
Z2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdp
c3RlckZpbGU6OkNhbGxlckZyYW1lKSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVy
KSkpKTsKKyAgICBzdG9yZVB0cihyZWdUMCwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJl
Z2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpDYWxsZWUpICogc3RhdGljX2Nhc3Q8aW50Pihz
aXplb2YoUmVnaXN0ZXIpKSkpOworICAgIHN0b3JlUHRyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFt
ZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pICog
c3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIGFkZFB0cihJbW0zMihy
ZWdpc3Rlck9mZnNldCAqIHNpemVvZihSZWdpc3RlcikpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisK
KyAgICAvLyBDYWxsIHRvIHRoZSBjYWxsZWUKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGls
YXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoT3RoZXIgPSBlbWl0TmFrZWRDYWxs
KCk7CisgICAgCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKKyAgICAgICAgd2Fz
RXZhbC5saW5rKHRoaXMpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30K
Kwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rp
b24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkIGNhbGxM
aW5rSW5mb0luZGV4LCBPcGNvZGVJRCBvcGNvZGVJRCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5z
dHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJd
LnUub3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9w
ZXJhbmQ7CisKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICAvLyBUaGUgYXJndW1lbnRz
IGhhdmUgYmVlbiBzZXQgdXAgb24gdGhlIGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2YWwKKyAgICBp
ZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkKKyAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhp
bnN0cnVjdGlvbik7CisgICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAg
ICAgICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworCisgICAgLy8g
RmFzdCBjaGVjayBmb3IgSlMgZnVuY3Rpb24uCisgICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RPYmpl
Y3QgPSBlbWl0SnVtcElmTm90SlNDZWxsKHJlZ1QwKTsKKyAgICBKdW1wIGNhbGxMaW5rRmFpbE5v
dEpTRnVuY3Rpb24gPSBicmFuY2hQdHIoTm90RXF1YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIo
bV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikpOworCisgICAgLy8gRmlyc3QsIGluIHRoZSBj
YXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KKyAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY29uc3RydWN0KSB7CisgICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9v
cF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZp
bGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7CisgICAgICAgIGVtaXRHZXRWaXJ0
dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmVs
eSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFy
aXR5LgorICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJl
Z2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBhZGRQdHIoSW1tMzIocmVn
aXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZy
YW1lUmVnaXN0ZXIpOworICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7CisKKyAgICBt
b3ZlKHJlZ1QwLCByZWdUMik7CisKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25J
bmZvW2NhbGxMaW5rSW5mb0luZGV4XS5jYWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRDYWxs
KG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmly
dHVhbENvbnN0cnVjdExpbmsoKSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENh
bGxMaW5rKCkpOworCisgICAgLy8gSWYgbm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4gdGhl
IGlmIGJlbG93IQorICAgIEFTU0VSVChPUENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09ERV9M
RU5HVEgob3BfY2FsbF9ldmFsKSk7CisKKyAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRvIHRo
ZSBob3QgcGF0aC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAgICAgICBl
bWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7Cisg
ICAgZWxzZQorICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgo
b3BfY2FsbCkpOworCisgICAgLy8gVGhpcyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCisgICAgY2Fs
bExpbmtGYWlsTm90T2JqZWN0LmxpbmsodGhpcyk7CisgICAgY2FsbExpbmtGYWlsTm90SlNGdW5j
dGlvbi5saW5rKHRoaXMpOworICAgIEpJVFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2Nv
bnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9O
b3RKU0Z1bmN0aW9uKS5jYWxsKCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2sp
OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxFIC8g
RU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8KKworI2VuZGlmIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCisKKyNlbmRpZiAvLyBV
U0UoSlNWQUxVRTMyXzY0KQorCit9IC8vIG5hbWVzcGFjZSBKU0MKKworI2VuZGlmIC8vIEVOQUJM
RShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbDMyXzY0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbDMyXzY0LmNwcAkocmV2aXNpb24gNTk5
MzkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbDMyXzY0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjQsOSArMjQsMTAgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiSklULmgiCiAKICNpZiBFTkFCTEUoSklUKQorI2lmIFVTRShKU1ZBTFVFMzJfNjQpCisjaW5j
bHVkZSAiSklULmgiCiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJKSVRJbmxp
bmVNZXRob2RzLmgiCkBAIC00NSw4ICs0Niw2IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5h
bWVzcGFjZSBKU0MgewogCi0jaWYgVVNFKEpTVkFMVUUzMl82NCkKLQogdm9pZCBKSVQ6OmNvbXBp
bGVPcENhbGxJbml0aWFsaXplQ2FsbEZyYW1lKCkKIHsKICAgICAvLyByZWdUMCBob2xkcyBjYWxs
ZWUsIHJlZ1QxIGhvbGRzIGFyZ0NvdW50CkBAIC00MjIsMjgzICs0MjEsNyBAQCB2b2lkIEpJVDo6
Y29tcGlsZU9wQ2FsbFNsb3dDYXNlKEluc3RydWN0CiAKICNlbmRpZiAvLyAhRU5BQkxFKEpJVF9P
UFRJTUlaRV9DQUxMKQogCi0jZWxzZSAvLyBVU0UoSlNWQUxVRTMyXzY0KQotCi12b2lkIEpJVDo6
Y29tcGlsZU9wQ2FsbEluaXRpYWxpemVDYWxsRnJhbWUoKQotewotICAgIHN0b3JlMzIocmVnVDEs
IEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6QXJndW1lbnRDb3VudCAq
IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLQotICAgIGxvYWRQdHIoQWRk
cmVzcyhyZWdUMCwgT0JKRUNUX09GRlNFVE9GKEpTRnVuY3Rpb24sIG1fc2NvcGVDaGFpbikgKyBP
QkpFQ1RfT0ZGU0VUT0YoU2NvcGVDaGFpbiwgbV9ub2RlKSksIHJlZ1QxKTsgLy8gbmV3U2NvcGVD
aGFpbgotCi0gICAgc3RvcmVQdHIocmVnVDAsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJl
Z2lzdGVyRmlsZTo6Q2FsbGVlICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkp
OwotICAgIHN0b3JlUHRyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3Rl
ckZpbGU6OlNjb3BlQ2hhaW4gKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7
Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsU2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0
cnVjdGlvbikKLXsKLSAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7
Ci0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotCi0g
ICAgLy8gZWN4IGhvbGRzIGZ1bmMKLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMCwgMCk7Ci0g
ICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Ci0gICAgZW1pdFB1dEpJ
VFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9mZnNldCwgMSk7Ci19Ci0gICAgICAgICAgCi12b2lk
IEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qIGluc3RydWN0
aW9uKQotewotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFu
ZDsKLSAgICAKLSAgICAvLyBlY3ggaG9sZHMgZnVuYwotICAgIGVtaXRQdXRKSVRTdHViQXJnKHJl
Z1QwLCAwKTsKLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMSwgMik7Ci0gICAgYWRkUHRyKElt
bTMyKHJlZ2lzdGVyT2Zmc2V0KSwgcmVnVDEsIHJlZ1QyKTsKLSAgICBlbWl0UHV0SklUU3R1YkFy
ZyhyZWdUMiwgMSk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3Mo
SW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQotewotICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0
aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblsz
XS51Lm9wZXJhbmQ7Ci0gICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVyYW5kOwot
ICAgIGludCB0aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7Ci0KLSAgICAv
LyBlY3ggaG9sZHMgZnVuYwotICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QwLCAwKTsKLSAgICBl
bWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsKLSAgICBlbWl0UHV0
SklUU3R1YkFyZ0NvbnN0YW50KGFyZ0NvdW50LCAyKTsKLSAgICBlbWl0UHV0SklUU3R1YkFyZ0Zy
b21WaXJ0dWFsUmVnaXN0ZXIocHJvdG8sIDMsIHJlZ1QyKTsKLSAgICBlbWl0UHV0SklUU3R1YkFy
Z0NvbnN0YW50KHRoaXNSZWdpc3RlciwgNCk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2NhbGxf
cHV0X3Jlc3VsdChJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCi17Ci0gICAgaW50IGRzdCA9IGlu
c3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICBlbWl0UHV0VmlydHVhbFJlZ2lzdGVyKGRzdCk7
Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1
Y3Rpb24pCi17Ci0gICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAg
ICBpbnQgYXJnQ291bnRSZWdpc3RlciA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLQotICAg
IGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoYXJnQ291bnRSZWdpc3RlciwgcmVnVDEpOwotICAgIGVt
aXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7Ci0gICAgY29tcGlsZU9wQ2FsbFZh
cmFyZ3NTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgLy8gQ2hlY2sgZm9yIEpTRnVuY3Rp
b25zLgotICAgIGVtaXRKdW1wU2xvd0Nhc2VJZk5vdEpTQ2VsbChyZWdUMCk7Ci0gICAgYWRkU2xv
d0Nhc2UoYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xvYmFs
RGF0YS0+anNGdW5jdGlvblZQdHIpKSk7Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhl
IGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCi0gICAg
bXVsMzIoSW1tMzIoc2l6ZW9mKFJlZ2lzdGVyKSksIHJlZ1QyLCByZWdUMik7Ci0gICAgaW50cHRy
X3Qgb2Zmc2V0ID0gKGludHB0cl90KXNpemVvZihSZWdpc3RlcikgKiAoaW50cHRyX3QpUmVnaXN0
ZXJGaWxlOjpDYWxsZXJGcmFtZTsKLSAgICBhZGRQdHIoSW1tMzIoKGludDMyX3Qpb2Zmc2V0KSwg
cmVnVDIsIHJlZ1QzKTsKLSAgICBhZGRQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIHJlZ1QzKTsKLSAg
ICBzdG9yZVB0cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOwotICAgIGFkZFB0cihyZWdUMiwg
Y2FsbEZyYW1lUmVnaXN0ZXIpOwotICAgIGVtaXROYWtlZENhbGwobV9nbG9iYWxEYXRhLT5qaXRT
dHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9j
ayk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJnc1Nsb3dDYXNlKEluc3RydWN0
aW9uKiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsKLSAgICBsaW5r
U2xvd0Nhc2UoaXRlcik7Ci0gICAgbGlua1Nsb3dDYXNlKGl0ZXIpOwotICAgIEpJVFN0dWJDYWxs
IHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pOwotICAgIHN0dWJDYWxs
LmNhbGwoKTsKLSAgICAKLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotICAg
IAotI2lmICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSBCRUdJTjogIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkgLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsKE9wY29k
ZUlEIG9wY29kZUlELCBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIHVuc2lnbmVkKQotewotICAg
IGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ0NvdW50
ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGlu
c3RydWN0aW9uWzNdLnUub3BlcmFuZDsKLQotICAgIC8vIEhhbmRsZSBldmFsCi0gICAgSnVtcCB3
YXNFdmFsOwotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpIHsKLSAgICAgICAgSklU
U3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NhbGxfZXZhbCk7Ci0gICAgICAgIHN0dWJD
YWxsLmFkZEFyZ3VtZW50KGNhbGxlZSwgcmVnVDApOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1
bWVudChKSVQ6OkltbTMyKHJlZ2lzdGVyT2Zmc2V0KSk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFy
Z3VtZW50KEpJVDo6SW1tMzIoYXJnQ291bnQpKTsKLSAgICAgICAgc3R1YkNhbGwuY2FsbCgpOwot
ICAgICAgICB3YXNFdmFsID0gYnJhbmNoUHRyKE5vdEVxdWFsLCByZWdUMCwgSW1tUHRyKEpTVmFs
dWU6OmVuY29kZShKU1ZhbHVlKCkpKSk7Ci0gICAgfQotCi0gICAgZW1pdEdldFZpcnR1YWxSZWdp
c3RlcihjYWxsZWUsIHJlZ1QwKTsKLSAgICAvLyBUaGUgYXJndW1lbnRzIGhhdmUgYmVlbiBzZXQg
dXAgb24gdGhlIGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2YWwKLSAgICBpZiAob3Bjb2RlSUQgPT0g
b3BfY2FsbCkKLSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7Ci0g
ICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBjb21waWxlT3BD
b25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgLy8gQ2hlY2sgZm9yIEpTRnVu
Y3Rpb25zLgotICAgIGVtaXRKdW1wU2xvd0Nhc2VJZk5vdEpTQ2VsbChyZWdUMCk7Ci0gICAgYWRk
U2xvd0Nhc2UoYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xv
YmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKSk7Ci0KLSAgICAvLyBGaXJzdCwgaW4gdGhlIGNhc2Ug
b2YgYSBjb25zdHJ1Y3QsIGFsbG9jYXRlIHRoZSBuZXcgb2JqZWN0LgotICAgIGlmIChvcGNvZGVJ
RCA9PSBvcF9jb25zdHJ1Y3QpIHsKLSAgICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX2Nv
bnN0cnVjdF9KU0NvbnN0cnVjdCkuY2FsbChyZWdpc3Rlck9mZnNldCAtIFJlZ2lzdGVyRmlsZTo6
Q2FsbEZyYW1lSGVhZGVyU2l6ZSAtIGFyZ0NvdW50KTsKLSAgICAgICAgZW1pdEdldFZpcnR1YWxS
ZWdpc3RlcihjYWxsZWUsIHJlZ1QwKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJv
bGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHku
Ci0gICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0
ZXIsIChSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGlj
X2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rl
ck9mZnNldCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVS
ZWdpc3Rlcik7Ci0gICAgbW92ZShJbW0zMihhcmdDb3VudCksIHJlZ1QxKTsKLQotICAgIGVtaXRO
YWtlZENhbGwob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9iYWxEYXRhLT5qaXRTdHVi
cy5jdGlWaXJ0dWFsQ29uc3RydWN0KCkgOiBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1
YWxDYWxsKCkpOwotCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKLSAgICAgICAg
d2FzRXZhbC5saW5rKHRoaXMpOwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsK
LX0KLQotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1
Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkLCBP
cGNvZGVJRCBvcGNvZGVJRCkKLXsKLSAgICBsaW5rU2xvd0Nhc2UoaXRlcik7Ci0gICAgbGlua1Ns
b3dDYXNlKGl0ZXIpOwotICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09
IG9wX2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3Bf
Y2FsbF9Ob3RKU0Z1bmN0aW9uKTsKLSAgICBzdHViQ2FsbC5jYWxsKCk7Ci0KLSAgICBzYW1wbGVD
b2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi0jZWxzZSAvLyAhRU5BQkxFKEpJVF9PUFRJTUla
RV9DQUxMKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46IEVOQUJM
RShKSVRfT1BUSU1JWkVfQ0FMTCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0K
LXZvaWQgSklUOjpjb21waWxlT3BDYWxsKE9wY29kZUlEIG9wY29kZUlELCBJbnN0cnVjdGlvbiog
aW5zdHJ1Y3Rpb24sIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4KQotewotICAgIGludCBjYWxs
ZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1
Y3Rpb25bMl0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9u
WzNdLnUub3BlcmFuZDsKLQotICAgIC8vIEhhbmRsZSBldmFsCi0gICAgSnVtcCB3YXNFdmFsOwot
ICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpIHsKLSAgICAgICAgSklUU3R1YkNhbGwg
c3R1YkNhbGwodGhpcywgY3RpX29wX2NhbGxfZXZhbCk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFy
Z3VtZW50KGNhbGxlZSwgcmVnVDApOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6
OkltbTMyKHJlZ2lzdGVyT2Zmc2V0KSk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJ
VDo6SW1tMzIoYXJnQ291bnQpKTsKLSAgICAgICAgc3R1YkNhbGwuY2FsbCgpOwotICAgICAgICB3
YXNFdmFsID0gYnJhbmNoUHRyKE5vdEVxdWFsLCByZWdUMCwgSW1tUHRyKEpTVmFsdWU6OmVuY29k
ZShKU1ZhbHVlKCkpKSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBwbGFudHMgYSBjaGVjayBmb3Ig
YSBjYWNoZWQgSlNGdW5jdGlvbiB2YWx1ZSwgc28gd2UgY2FuIHBsYW50IGEgZmFzdCBsaW5rIHRv
IHRoZSBjYWxsZWUuCi0gICAgLy8gVGhpcyBkZWxpYmVyYXRlbHkgbGVhdmVzIHRoZSBjYWxsZWUg
aW4gZWN4LCB1c2VkIHdoZW4gc2V0dGluZyB1cCB0aGUgc3RhY2sgZnJhbWUgYmVsb3cKLSAgICBl
bWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwotICAgIERhdGFMYWJlbFB0ciBh
ZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrOwotCi0gICAgQkVHSU5fVU5JTlRFUlJVUFRFRF9T
RVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7Ci0KLSAgICBKdW1wIGp1bXBUb1Nsb3cgPSBicmFuY2hQ
dHJXaXRoUGF0Y2goTm90RXF1YWwsIHJlZ1QwLCBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNr
LCBJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoKSkpKTsKLQotICAgIEVORF9VTklOVEVS
UlVQVEVEX1NFUVVFTkNFKHNlcXVlbmNlT3BDYWxsKTsKLQotICAgIGFkZFNsb3dDYXNlKGp1bXBU
b1Nsb3cpOwotICAgIEFTU0VSVF9KSVRfT0ZGU0VUKGRpZmZlcmVuY2VCZXR3ZWVuKGFkZHJlc3NP
ZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIGp1bXBUb1Nsb3cpLCBwYXRjaE9mZnNldE9wQ2FsbENvbXBh
cmVUb0p1bXApOwotICAgIG1fY2FsbFN0cnVjdHVyZVN0dWJDb21waWxhdGlvbkluZm9bY2FsbExp
bmtJbmZvSW5kZXhdLmhvdFBhdGhCZWdpbiA9IGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2s7
Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBmYXN0IGNhc2UsIG9ubHkgdXNlZCB3aGFu
IGEgY2FsbGVlIGNhbiBiZSBsaW5rZWQuCi0KLSAgICAvLyBJbiB0aGUgY2FzZSBvZiBPcENvbnN0
cnVjdCwgY2FsbCBvdXQgdG8gYSBjdGlfIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgbmV3IG9iamVj
dC4KLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7Ci0gICAgICAgIGludCBwcm90
byA9IGluc3RydWN0aW9uWzRdLnUub3BlcmFuZDsKLSAgICAgICAgaW50IHRoaXNSZWdpc3RlciA9
IGluc3RydWN0aW9uWzVdLnUub3BlcmFuZDsKLQotICAgICAgICBlbWl0UHV0SklUU3R1YkFyZyhy
ZWdUMCwgMCk7Ci0gICAgICAgIGVtaXRQdXRKSVRTdHViQXJnRnJvbVZpcnR1YWxSZWdpc3Rlcihw
cm90bywgMywgcmVnVDIpOwotICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlf
b3BfY29uc3RydWN0X0pTQ29uc3RydWN0KTsKLSAgICAgICAgc3R1YkNhbGwuY2FsbCh0aGlzUmVn
aXN0ZXIpOwotICAgICAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwot
ICAgIH0KLQotICAgIC8vIEZhc3QgdmVyc2lvbiBvZiBzdGFjayBmcmFtZSBpbml0aWFsaXphdGlv
biwgZGlyZWN0bHkgcmVsYXRpdmUgdG8gZWRpLgotICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9taXRz
IHRvIHNldCB1cCBSZWdpc3RlckZpbGU6OkNvZGVCbG9jaywgd2hpY2ggaXMgc2V0IGluIHRoZSBj
YWxsZWUKLQotICAgIGxvYWRQdHIoQWRkcmVzcyhyZWdUMCwgT0JKRUNUX09GRlNFVE9GKEpTRnVu
Y3Rpb24sIG1fc2NvcGVDaGFpbikgKyBPQkpFQ1RfT0ZGU0VUT0YoU2NvcGVDaGFpbiwgbV9ub2Rl
KSksIHJlZ1QxKTsgLy8gbmV3U2NvcGVDaGFpbgotCi0gICAgc3RvcmUzMihJbW0zMihhcmdDb3Vu
dCksIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVy
RmlsZTo6QXJndW1lbnRDb3VudCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3Rlcikp
KSk7Ci0gICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVn
aXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUpICogc3Rh
dGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIHN0b3JlUHRyKHJlZ1QwLCBB
ZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6
OkNhbGxlZSkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0gICAgc3Rv
cmVQdHIocmVnVDEsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCAr
IFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbikgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKSk7Ci0gICAgYWRkUHRyKEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICogc2l6ZW9mKFJlZ2lz
dGVyKSksIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAgIC8vIENhbGwgdG8gdGhlIGNhbGxlZQot
ICAgIG1fY2FsbFN0cnVjdHVyZVN0dWJDb21waWxhdGlvbkluZm9bY2FsbExpbmtJbmZvSW5kZXhd
LmhvdFBhdGhPdGhlciA9IGVtaXROYWtlZENhbGwoKTsKLSAgICAKLSAgICBpZiAob3Bjb2RlSUQg
PT0gb3BfY2FsbF9ldmFsKQotICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7Ci0KLSAgICBzYW1w
bGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNs
b3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+Ojpp
dGVyYXRvciYgaXRlciwgdW5zaWduZWQgY2FsbExpbmtJbmZvSW5kZXgsIE9wY29kZUlEIG9wY29k
ZUlEKQotewotICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAg
aW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rl
ck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKLQotICAgIGxpbmtTbG93Q2FzZShp
dGVyKTsKLQotICAgIC8vIFRoZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHNldCB1cCBvbiB0aGUgaG90
IHBhdGggZm9yIG9wX2NhbGxfZXZhbAotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsKQotICAg
ICAgICBjb21waWxlT3BDYWxsU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLSAgICBlbHNlIGlmIChv
cGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpCi0gICAgICAgIGNvbXBpbGVPcENvbnN0cnVjdFNldHVw
QXJncyhpbnN0cnVjdGlvbik7Ci0KLSAgICAvLyBGYXN0IGNoZWNrIGZvciBKUyBmdW5jdGlvbi4K
LSAgICBKdW1wIGNhbGxMaW5rRmFpbE5vdE9iamVjdCA9IGVtaXRKdW1wSWZOb3RKU0NlbGwocmVn
VDApOwotICAgIEp1bXAgY2FsbExpbmtGYWlsTm90SlNGdW5jdGlvbiA9IGJyYW5jaFB0cihOb3RF
cXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRy
KSk7Ci0KLSAgICAvLyBGaXJzdCwgaW4gdGhlIGNhc2Ugb2YgYSBjb25zdHJ1Y3QsIGFsbG9jYXRl
IHRoZSBuZXcgb2JqZWN0LgotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpIHsKLSAg
ICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCkuY2Fs
bChyZWdpc3Rlck9mZnNldCAtIFJlZ2lzdGVyRmlsZTo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSAtIGFy
Z0NvdW50KTsKLSAgICAgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxsZWUsIHJlZ1QwKTsK
LSAgICB9Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1p
bmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCi0gICAgc3RvcmVQdHIoY2FsbEZyYW1l
UmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdpc3RlckZpbGU6OkNhbGxl
ckZyYW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0
ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHN0YXRpY19jYXN0PGlu
dD4oc2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0gICAgbW92ZShJbW0z
MihhcmdDb3VudCksIHJlZ1QxKTsKLQotICAgIG1vdmUocmVnVDAsIHJlZ1QyKTsKLQotICAgIG1f
Y2FsbFN0cnVjdHVyZVN0dWJDb21waWxhdGlvbkluZm9bY2FsbExpbmtJbmZvSW5kZXhdLmNhbGxS
ZXR1cm5Mb2NhdGlvbiA9IGVtaXROYWtlZENhbGwob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8g
bV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ29uc3RydWN0TGluaygpIDogbV9nbG9i
YWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbExpbmsoKSk7Ci0KLSAgICAvLyBJZiBub3Qs
IHdlIG5lZWQgYW4gZXh0cmEgY2FzZSBpbiB0aGUgaWYgYmVsb3chCi0gICAgQVNTRVJUKE9QQ09E
RV9MRU5HVEgob3BfY2FsbCkgPT0gT1BDT0RFX0xFTkdUSChvcF9jYWxsX2V2YWwpKTsKLQotICAg
IC8vIERvbmUhIC0gcmV0dXJuIGJhY2sgdG8gdGhlIGhvdCBwYXRoLgotICAgIGlmIChvcGNvZGVJ
RCA9PSBvcF9jb25zdHJ1Y3QpCi0gICAgICAgIGVtaXRKdW1wU2xvd1RvSG90KGp1bXAoKSwgT1BD
T0RFX0xFTkdUSChvcF9jb25zdHJ1Y3QpKTsKLSAgICBlbHNlCi0gICAgICAgIGVtaXRKdW1wU2xv
d1RvSG90KGp1bXAoKSwgT1BDT0RFX0xFTkdUSChvcF9jYWxsKSk7Ci0KLSAgICAvLyBUaGlzIGhh
bmRsZXMgaG9zdCBmdW5jdGlvbnMKLSAgICBjYWxsTGlua0ZhaWxOb3RPYmplY3QubGluayh0aGlz
KTsKLSAgICBjYWxsTGlua0ZhaWxOb3RKU0Z1bmN0aW9uLmxpbmsodGhpcyk7Ci0gICAgSklUU3R1
YkNhbGwodGhpcywgb3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gY3RpX29wX2NvbnN0cnVjdF9O
b3RKU0NvbnN0cnVjdCA6IGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pLmNhbGwoKTsKLQotICAg
IHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSBFTkQ6ICFFTkFCTEUgLyBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYgLy8gIUVOQUJMRShKSVRf
T1BUSU1JWkVfQ0FMTCkKLQotI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KIH0gLy8gbmFt
ZXNwYWNlIEpTQwogCisjZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKICNlbmRpZiAvLyBFTkFC
TEUoSklUKQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRDYWxsLmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBK
YXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDkgKzI0
LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkpJVC5oIgogCiAj
aWYgRU5BQkxFKEpJVCkKKyNpZiAhVVNFKEpTVkFMVUUzMl82NCkKKyNpbmNsdWRlICJKSVQuaCIK
IAogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIK
QEAgLTQ1LDM4NSArNDYsNiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgSlND
IHsKIAotI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsSW5p
dGlhbGl6ZUNhbGxGcmFtZSgpCi17Ci0gICAgLy8gcmVnVDAgaG9sZHMgY2FsbGVlLCByZWdUMSBo
b2xkcyBhcmdDb3VudAotICAgIHN0b3JlMzIocmVnVDEsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0
ZXIsIFJlZ2lzdGVyRmlsZTo6QXJndW1lbnRDb3VudCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9m
KFJlZ2lzdGVyKSkpKTsKLQotICAgIGxvYWRQdHIoQWRkcmVzcyhyZWdUMCwgT0JKRUNUX09GRlNF
VE9GKEpTRnVuY3Rpb24sIG1fc2NvcGVDaGFpbikgKyBPQkpFQ1RfT0ZGU0VUT0YoU2NvcGVDaGFp
biwgbV9ub2RlKSksIHJlZ1QxKTsgLy8gc2NvcGVDaGFpbgotCi0gICAgc3RvcmVQdHIocmVnVDAs
IEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlICogc3RhdGlj
X2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOyAvLyBjYWxsZWUKLSAgICBzdG9yZVB0cihy
ZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWlu
ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOyAvLyBzY29wZUNoYWluCi19
Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsU2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVj
dGlvbikKLXsKLSAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0g
ICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotCi0gICAg
ZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsKLSAgICBlbWl0UHV0SklUU3R1YkFy
Z0NvbnN0YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsKLSAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0
YW50KGFyZ0NvdW50LCAyKTsKLX0KLSAgICAgICAgICAKLXZvaWQgSklUOjpjb21waWxlT3BDb25z
dHJ1Y3RTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQotewotICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25b
NF0udS5vcGVyYW5kOwotICAgIGludCB0aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9w
ZXJhbmQ7Ci0KLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMSwgcmVnVDAsIDApOwotICAgIGVt
aXRQdXRKSVRTdHViQXJnQ29uc3RhbnQocmVnaXN0ZXJPZmZzZXQsIDEpOwotICAgIGVtaXRQdXRK
SVRTdHViQXJnQ29uc3RhbnQoYXJnQ291bnQsIDIpOwotICAgIGVtaXRQdXRKSVRTdHViQXJnRnJv
bVZpcnR1YWxSZWdpc3Rlcihwcm90bywgMywgcmVnVDIsIHJlZ1QzKTsKLSAgICBlbWl0UHV0SklU
U3R1YkFyZ0NvbnN0YW50KHRoaXNSZWdpc3RlciwgNCk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxl
T3BDYWxsVmFyYXJnc1NldHVwQXJncyhJbnN0cnVjdGlvbiopCi17Ci0gICAgZW1pdFB1dEpJVFN0
dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsKLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMywgMSk7
IC8vIHJlZ2lzdGVyT2Zmc2V0Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDIsIDIpOyAvLyBh
cmdDb3VudAotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9jYWxsX3B1dF9yZXN1bHQoSW5zdHJ1Y3Rp
b24qIGluc3RydWN0aW9uKQotewotICAgIGludCBkc3QgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJh
bmQ7Ci0gICAgZW1pdFN0b3JlKGRzdCwgcmVnVDEsIHJlZ1QwKTsKLX0KLQotdm9pZCBKSVQ6OmNv
bXBpbGVPcENhbGxWYXJhcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQg
Y2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdDb3VudFJlZ2lz
dGVyID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9
IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKLQotICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEs
IHJlZ1QwKTsKLSAgICBlbWl0TG9hZFBheWxvYWQoYXJnQ291bnRSZWdpc3RlciwgcmVnVDIpOyAv
LyBhcmdDb3VudAotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCksIHJlZ1QyLCByZWdU
Myk7IC8vIHJlZ2lzdGVyT2Zmc2V0Ci0KLSAgICBjb21waWxlT3BDYWxsVmFyYXJnc1NldHVwQXJn
cyhpbnN0cnVjdGlvbik7Ci0KLSAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwoY2FsbGVl
LCByZWdUMSk7Ci0gICAgYWRkU2xvd0Nhc2UoYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJl
Z1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKSk7Ci0KLSAgICAvLyBT
cGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBt
YXRjaCB0aGUgYXJpdHkuCi0gICAgbXVsMzIoSW1tMzIoc2l6ZW9mKFJlZ2lzdGVyKSksIHJlZ1Qz
LCByZWdUMyk7Ci0gICAgYWRkUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCByZWdUMyk7Ci0gICAgc3Rv
cmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MocmVnVDMsIFJlZ2lzdGVyRmlsZTo6Q2Fs
bGVyRnJhbWUgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0gICAgbW92
ZShyZWdUMywgY2FsbEZyYW1lUmVnaXN0ZXIpOwotCi0gICAgbW92ZShyZWdUMiwgcmVnVDEpOyAv
LyBhcmdDb3VudAotCi0gICAgZW1pdE5ha2VkQ2FsbChtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0
aVZpcnR1YWxDYWxsKCkpOwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0K
LQotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxWYXJhcmdzU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGlu
c3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyKQotewotICAg
IGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0KLSAgICBsaW5rU2xvd0Nh
c2VJZk5vdEpTQ2VsbChpdGVyLCBjYWxsZWUpOwotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKLQot
ICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24p
OwotICAgIHN0dWJDYWxsLmNhbGwoKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9j
ayk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX3JldChJbnN0cnVjdGlvbiogY3VycmVudEluc3Ry
dWN0aW9uKQotewotICAgIHVuc2lnbmVkIGRzdCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9w
ZXJhbmQ7Ci0KLSAgICAvLyBXZSBjb3VsZCBKSVQgZ2VuZXJhdGUgdGhlIGRlcmVmLCBvbmx5IGNh
bGxpbmcgb3V0IHRvIEMgd2hlbiB0aGUgcmVmY291bnQgaGl0cyB6ZXJvLgotICAgIGlmIChtX2Nv
ZGVCbG9jay0+bmVlZHNGdWxsU2NvcGVDaGFpbigpKQotICAgICAgICBKSVRTdHViQ2FsbCh0aGlz
LCBjdGlfb3BfcmV0X3Njb3BlQ2hhaW4pLmNhbGwoKTsKLQotICAgIGVtaXRMb2FkKGRzdCwgcmVn
VDEsIHJlZ1QwKTsKLSAgICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhlYWRlclB0cihSZWdpc3RlckZp
bGU6OlJldHVyblBDLCByZWdUMik7Ci0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIo
UmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSwgY2FsbEZyYW1lUmVnaXN0ZXIpOwotCi0gICAgcmVz
dG9yZVJldHVybkFkZHJlc3NCZWZvcmVSZXR1cm4ocmVnVDIpOwotICAgIHJldCgpOwotfQotCi12
b2lkIEpJVDo6ZW1pdF9vcF9yZXRfb2JqZWN0X29yX3RoaXMoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJ
bnN0cnVjdGlvbikKLXsKLSAgICB1bnNpZ25lZCByZXN1bHQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25b
MV0udS5vcGVyYW5kOwotICAgIHVuc2lnbmVkIHRoaXNSZWcgPSBjdXJyZW50SW5zdHJ1Y3Rpb25b
Ml0udS5vcGVyYW5kOwotCi0gICAgLy8gV2UgY291bGQgSklUIGdlbmVyYXRlIHRoZSBkZXJlZiwg
b25seSBjYWxsaW5nIG91dCB0byBDIHdoZW4gdGhlIHJlZmNvdW50IGhpdHMgemVyby4KLSAgICBp
ZiAobV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKSkKLSAgICAgICAgSklUU3R1YkNh
bGwodGhpcywgY3RpX29wX3JldF9zY29wZUNoYWluKS5jYWxsKCk7Ci0KLSAgICBlbWl0TG9hZChy
ZXN1bHQsIHJlZ1QxLCByZWdUMCk7Ci0gICAgSnVtcCBub3RKU0NlbGwgPSBicmFuY2gzMihOb3RF
cXVhbCwgcmVnVDEsIEltbTMyKEpTVmFsdWU6OkNlbGxUYWcpKTsKLSAgICBsb2FkUHRyKEFkZHJl
c3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0NlbGwsIG1fc3RydWN0dXJlKSksIHJlZ1QyKTsK
LSAgICBKdW1wIG5vdE9iamVjdCA9IGJyYW5jaDgoTm90RXF1YWwsIEFkZHJlc3MocmVnVDIsIE9C
SkVDVF9PRkZTRVRPRihTdHJ1Y3R1cmUsIG1fdHlwZUluZm8pICsgT0JKRUNUX09GRlNFVE9GKFR5
cGVJbmZvLCBtX3R5cGUpKSwgSW1tMzIoT2JqZWN0VHlwZSkpOwotCi0gICAgZW1pdEdldEZyb21D
YWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOwotICAgIGVt
aXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNh
bGxGcmFtZVJlZ2lzdGVyKTsKLQotICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJu
KHJlZ1QyKTsKLSAgICByZXQoKTsKLQotICAgIG5vdEpTQ2VsbC5saW5rKHRoaXMpOwotICAgIG5v
dE9iamVjdC5saW5rKHRoaXMpOwotICAgIGVtaXRMb2FkKHRoaXNSZWcsIHJlZ1QxLCByZWdUMCk7
Ci0KLSAgICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhlYWRlclB0cihSZWdpc3RlckZpbGU6OlJldHVy
blBDLCByZWdUMik7Ci0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJG
aWxlOjpDYWxsZXJGcmFtZSwgY2FsbEZyYW1lUmVnaXN0ZXIpOwotCi0gICAgcmVzdG9yZVJldHVy
bkFkZHJlc3NCZWZvcmVSZXR1cm4ocmVnVDIpOwotICAgIHJldCgpOwotfQotCi12b2lkIEpJVDo6
ZW1pdFNsb3dfb3BfY2FsbChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uLCBWZWN0b3I8
U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyKQotewotICAgIGNvbXBpbGVPcENhbGxTbG93
Q2FzZShjdXJyZW50SW5zdHJ1Y3Rpb24sIGl0ZXIsIG1fY2FsbExpbmtJbmZvSW5kZXgrKywgb3Bf
Y2FsbCk7Ci19Ci0KLXZvaWQgSklUOjplbWl0U2xvd19vcF9jYWxsX2V2YWwoSW5zdHJ1Y3Rpb24q
IGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRl
cikKLXsKLSAgICBjb21waWxlT3BDYWxsU2xvd0Nhc2UoY3VycmVudEluc3RydWN0aW9uLCBpdGVy
LCBtX2NhbGxMaW5rSW5mb0luZGV4KyssIG9wX2NhbGxfZXZhbCk7Ci19Ci0KLXZvaWQgSklUOjpl
bWl0U2xvd19vcF9jYWxsX3ZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwg
VmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsKLSAgICBjb21waWxlT3BD
YWxsVmFyYXJnc1Nsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwgaXRlcik7Ci19Ci0KLXZvaWQg
SklUOjplbWl0U2xvd19vcF9jb25zdHJ1Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlv
biwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsKLSAgICBjb21waWxl
T3BDYWxsU2xvd0Nhc2UoY3VycmVudEluc3RydWN0aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0lu
ZGV4KyssIG9wX2NvbnN0cnVjdCk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2NhbGwoSW5zdHJ1
Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICBjb21waWxlT3BDYWxsKG9wX2NhbGws
IGN1cnJlbnRJbnN0cnVjdGlvbiwgbV9jYWxsTGlua0luZm9JbmRleCsrKTsKLX0KLQotdm9pZCBK
SVQ6OmVtaXRfb3BfY2FsbF9ldmFsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCi17
Ci0gICAgY29tcGlsZU9wQ2FsbChvcF9jYWxsX2V2YWwsIGN1cnJlbnRJbnN0cnVjdGlvbiwgbV9j
YWxsTGlua0luZm9JbmRleCsrKTsKLX0KLQotdm9pZCBKSVQ6OmVtaXRfb3BfbG9hZF92YXJhcmdz
KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCi17Ci0gICAgaW50IGFyZ0NvdW50RHN0
ID0gY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICBpbnQgYXJnc09mZnNldCA9
IGN1cnJlbnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0KLSAgICBKSVRTdHViQ2FsbCBzdHVi
Q2FsbCh0aGlzLCBjdGlfb3BfbG9hZF92YXJhcmdzKTsKLSAgICBzdHViQ2FsbC5hZGRBcmd1bWVu
dChJbW0zMihhcmdzT2Zmc2V0KSk7Ci0gICAgc3R1YkNhbGwuY2FsbCgpOwotICAgIC8vIFN0b3Jl
cyBhIG5ha2VkIGludDMyIGluIHRoZSByZWdpc3RlciBmaWxlLgotICAgIHN0b3JlMzIocmV0dXJu
VmFsdWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgYXJnQ291bnREc3QgKiBz
aXplb2YoUmVnaXN0ZXIpKSk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2NhbGxfdmFyYXJncyhJ
bnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQotewotICAgIGNvbXBpbGVPcENhbGxWYXJh
cmdzKGN1cnJlbnRJbnN0cnVjdGlvbik7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2NvbnN0cnVj
dChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQotewotICAgIGNvbXBpbGVPcENhbGwo
b3BfY29uc3RydWN0LCBjdXJyZW50SW5zdHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7
Ci19Ci0KLSNpZiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQotCi0vKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46ICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChP
cGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCkKLXsK
LSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBKdW1wIHdhc0V2YWw7Ci0gICAgaWYg
KG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkgewotICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2Fs
bCh0aGlzLCBjdGlfb3BfY2FsbF9ldmFsKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQo
Y2FsbGVlKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rl
ck9mZnNldCkpOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0Nv
dW50KSk7Ci0gICAgICAgIHN0dWJDYWxsLmNhbGwoKTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5j
aDMyKE5vdEVxdWFsLCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6RW1wdHlWYWx1ZVRhZykpOwotICAg
IH0KLQotICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKLQotICAgIGlmIChvcGNv
ZGVJRCA9PSBvcF9jYWxsKQotICAgICAgICBjb21waWxlT3BDYWxsU2V0dXBBcmdzKGluc3RydWN0
aW9uKTsKLSAgICBlbHNlIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpCi0gICAgICAgIGNv
bXBpbGVPcENvbnN0cnVjdFNldHVwQXJncyhpbnN0cnVjdGlvbik7Ci0KLSAgICBlbWl0SnVtcFNs
b3dDYXNlSWZOb3RKU0NlbGwoY2FsbGVlLCByZWdUMSk7Ci0gICAgYWRkU2xvd0Nhc2UoYnJhbmNo
UHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5j
dGlvblZQdHIpKSk7Ci0KLSAgICAvLyBGaXJzdCwgaW4gdGhlIGNhc2Ugb2YgYSBjb25zdHJ1Y3Qs
IGFsbG9jYXRlIHRoZSBuZXcgb2JqZWN0LgotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1
Y3QpIHsKLSAgICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0
cnVjdCkuY2FsbChyZWdpc3Rlck9mZnNldCAtIFJlZ2lzdGVyRmlsZTo6Q2FsbEZyYW1lSGVhZGVy
U2l6ZSAtIGFyZ0NvdW50KTsKLSAgICAgICAgZW1pdExvYWQoY2FsbGVlLCByZWdUMSwgcmVnVDAp
OwotICAgIH0KLQotICAgIC8vIFNwZWN1bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1
bWluZyBhcmdDb3VudCB3aWxsIG1hdGNoIHRoZSBhcml0eS4KLSAgICBzdG9yZVB0cihjYWxsRnJh
bWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2Fs
bGVyRnJhbWUgKyByZWdpc3Rlck9mZnNldCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKSk7Ci0gICAgYWRkUHRyKEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8
aW50PihzaXplb2YoUmVnaXN0ZXIpKSksIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLSAgICBtb3ZlKElt
bTMyKGFyZ0NvdW50KSwgcmVnVDEpOwotCi0gICAgZW1pdE5ha2VkQ2FsbChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QgPyBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDb25zdHJ1Y3Qo
KSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7Ci0KLSAgICBpZiAo
b3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKQotICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7Ci0K
LSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi12b2lkIEpJVDo6Y29tcGls
ZU9wQ2FsbFNsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNl
RW50cnk+OjppdGVyYXRvciYgaXRlciwgdW5zaWduZWQsIE9wY29kZUlEIG9wY29kZUlEKQotewot
ICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0KLSAgICBsaW5rU2xv
d0Nhc2VJZk5vdEpTQ2VsbChpdGVyLCBjYWxsZWUpOwotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsK
LQotICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVj
dCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1
bmN0aW9uKTsKLSAgICBzdHViQ2FsbC5jYWxsKCk7Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9j
b2RlQmxvY2spOwotfQotCi0jZWxzZSAvLyAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQotCi0v
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46IEVOQUJMRShKSVRfT1BUSU1J
WkVfQ0FMTCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgSklUOjpj
b21waWxlT3BDYWxsKE9wY29kZUlEIG9wY29kZUlELCBJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24s
IHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4KQotewotICAgIGludCBjYWxsZWUgPSBpbnN0cnVj
dGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5v
cGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFu
ZDsKLQotICAgIEp1bXAgd2FzRXZhbDsKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFs
KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwp
OwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUpOwotICAgICAgICBzdHViQ2Fs
bC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKHJlZ2lzdGVyT2Zmc2V0KSk7Ci0gICAgICAgIHN0dWJD
YWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIoYXJnQ291bnQpKTsKLSAgICAgICAgc3R1YkNhbGwu
Y2FsbCgpOwotICAgICAgICB3YXNFdmFsID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0z
MihKU1ZhbHVlOjpFbXB0eVZhbHVlVGFnKSk7Ci0gICAgfQotCi0gICAgZW1pdExvYWQoY2FsbGVl
LCByZWdUMSwgcmVnVDApOwotCi0gICAgRGF0YUxhYmVsUHRyIGFkZHJlc3NPZkxpbmtlZEZ1bmN0
aW9uQ2hlY2s7Ci0KLSAgICBCRUdJTl9VTklOVEVSUlVQVEVEX1NFUVVFTkNFKHNlcXVlbmNlT3BD
YWxsKTsKLQotICAgIEp1bXAganVtcFRvU2xvdyA9IGJyYW5jaFB0cldpdGhQYXRjaChOb3RFcXVh
bCwgcmVnVDAsIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIEltbVB0cigwKSk7Ci0KLSAg
ICBFTkRfVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7Ci0KLSAgICBhZGRT
bG93Q2FzZShqdW1wVG9TbG93KTsKLSAgICBBU1NFUlQoZGlmZmVyZW5jZUJldHdlZW4oYWRkcmVz
c09mTGlua2VkRnVuY3Rpb25DaGVjaywganVtcFRvU2xvdykgPT0gcGF0Y2hPZmZzZXRPcENhbGxD
b21wYXJlVG9KdW1wKTsKLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2Nh
bGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoQmVnaW4gPSBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNo
ZWNrOwotCi0gICAgYWRkU2xvd0Nhc2UoYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihK
U1ZhbHVlOjpDZWxsVGFnKSkpOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgZmFzdCBj
YXNlLCBvbmx5IHVzZWQgd2hhbiBhIGNhbGxlZSBjYW4gYmUgbGlua2VkLgotCi0gICAgLy8gSW4g
dGhlIGNhc2Ugb2YgT3BDb25zdHJ1Y3QsIGNhbGwgb3V0IHRvIGEgY3RpXyBmdW5jdGlvbiB0byBj
cmVhdGUgdGhlIG5ldyBvYmplY3QuCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkg
ewotICAgICAgICBpbnQgcHJvdG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7Ci0gICAgICAg
IGludCB0aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7Ci0KLSAgICAgICAg
SklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCk7
Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KHJlZ1QxLCByZWdUMCk7Ci0gICAgICAgIHN0
dWJDYWxsLmFkZEFyZ3VtZW50KEltbTMyKDApKTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHVudXNl
ZCBKSVRTdHViIGFyZ3VtZW50LgotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMigw
KSk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB1bnVzZWQgSklUU3R1YiBhcmd1bWVudC4KLSAgICAg
ICAgc3R1YkNhbGwuYWRkQXJndW1lbnQocHJvdG8pOwotICAgICAgICBzdHViQ2FsbC5jYWxsKHRo
aXNSZWdpc3Rlcik7Ci0KLSAgICAgICAgZW1pdExvYWQoY2FsbGVlLCByZWdUMSwgcmVnVDApOwot
ICAgIH0KLQotICAgIC8vIEZhc3QgdmVyc2lvbiBvZiBzdGFjayBmcmFtZSBpbml0aWFsaXphdGlv
biwgZGlyZWN0bHkgcmVsYXRpdmUgdG8gZWRpLgotICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9taXRz
IHRvIHNldCB1cCBSZWdpc3RlckZpbGU6OkNvZGVCbG9jaywgd2hpY2ggaXMgc2V0IGluIHRoZSBj
YWxsZWUKLSAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0
aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkp
LCByZWdUMik7Ci0KLSAgICBzdG9yZTMyKEltbTMyKGFyZ0NvdW50KSwgQWRkcmVzcyhjYWxsRnJh
bWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50
KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBzdG9yZVB0cihj
YWxsRnJhbWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zm
c2V0ICsgUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVv
ZihSZWdpc3RlcikpKSk7Ci0gICAgZW1pdFN0b3JlKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJG
aWxlOjpDYWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0gICAgc3RvcmVQdHIocmVnVDIsIEFkZHJlc3Mo
Y2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6U2NvcGVD
aGFpbikgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0gICAgYWRkUHRy
KEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICogc2l6ZW9mKFJlZ2lzdGVyKSksIGNhbGxGcmFtZVJlZ2lz
dGVyKTsKLQotICAgIC8vIENhbGwgdG8gdGhlIGNhbGxlZQotICAgIG1fY2FsbFN0cnVjdHVyZVN0
dWJDb21waWxhdGlvbkluZm9bY2FsbExpbmtJbmZvSW5kZXhdLmhvdFBhdGhPdGhlciA9IGVtaXRO
YWtlZENhbGwoKTsKLSAgICAKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKQotICAg
ICAgICB3YXNFdmFsLmxpbmsodGhpcyk7Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxv
Y2spOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNsb3dDYXNlKEluc3RydWN0aW9uKiBp
bnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlciwgdW5zaWdu
ZWQgY2FsbExpbmtJbmZvSW5kZXgsIE9wY29kZUlEIG9wY29kZUlEKQotewotICAgIGludCBjYWxs
ZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1
Y3Rpb25bMl0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9u
WzNdLnUub3BlcmFuZDsKLQotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKLSAgICBsaW5rU2xvd0Nh
c2UoaXRlcik7Ci0KLSAgICAvLyBUaGUgYXJndW1lbnRzIGhhdmUgYmVlbiBzZXQgdXAgb24gdGhl
IGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2YWwKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkK
LSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7Ci0gICAgZWxzZSBp
ZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RT
ZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgLy8gRmFzdCBjaGVjayBmb3IgSlMgZnVuY3Rp
b24uCi0gICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RPYmplY3QgPSBicmFuY2gzMihOb3RFcXVhbCwg
cmVnVDEsIEltbTMyKEpTVmFsdWU6OkNlbGxUYWcpKTsKLSAgICBKdW1wIGNhbGxMaW5rRmFpbE5v
dEpTRnVuY3Rpb24gPSBicmFuY2hQdHIoTm90RXF1YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIo
bV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBj
YXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY29uc3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9v
cF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZp
bGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRMb2FkKGNh
bGxlZSwgcmVnVDEsIHJlZ1QwKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwg
dGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCi0g
ICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIs
IChSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGljX2Nh
c3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9m
ZnNldCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVSZWdp
c3Rlcik7Ci0gICAgbW92ZShJbW0zMihhcmdDb3VudCksIHJlZ1QxKTsKLQotICAgIG1fY2FsbFN0
cnVjdHVyZVN0dWJDb21waWxhdGlvbkluZm9bY2FsbExpbmtJbmZvSW5kZXhdLmNhbGxSZXR1cm5M
b2NhdGlvbiA9IGVtaXROYWtlZENhbGwob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9i
YWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ29uc3RydWN0TGluaygpIDogbV9nbG9iYWxEYXRh
LT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbExpbmsoKSk7Ci0KLSAgICAvLyBJZiBub3QsIHdlIG5l
ZWQgYW4gZXh0cmEgY2FzZSBpbiB0aGUgaWYgYmVsb3chCi0gICAgQVNTRVJUKE9QQ09ERV9MRU5H
VEgob3BfY2FsbCkgPT0gT1BDT0RFX0xFTkdUSChvcF9jYWxsX2V2YWwpKTsKLQotICAgIC8vIERv
bmUhIC0gcmV0dXJuIGJhY2sgdG8gdGhlIGhvdCBwYXRoLgotICAgIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpCi0gICAgICAgIGVtaXRKdW1wU2xvd1RvSG90KGp1bXAoKSwgT1BDT0RFX0xF
TkdUSChvcF9jb25zdHJ1Y3QpKTsKLSAgICBlbHNlCi0gICAgICAgIGVtaXRKdW1wU2xvd1RvSG90
KGp1bXAoKSwgT1BDT0RFX0xFTkdUSChvcF9jYWxsKSk7Ci0KLSAgICAvLyBUaGlzIGhhbmRsZXMg
aG9zdCBmdW5jdGlvbnMKLSAgICBjYWxsTGlua0ZhaWxOb3RPYmplY3QubGluayh0aGlzKTsKLSAg
ICBjYWxsTGlua0ZhaWxOb3RKU0Z1bmN0aW9uLmxpbmsodGhpcyk7Ci0gICAgSklUU3R1YkNhbGwo
dGhpcywgb3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gY3RpX29wX2NvbnN0cnVjdF9Ob3RKU0Nv
bnN0cnVjdCA6IGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pLmNhbGwoKTsKLQotICAgIHNhbXBs
ZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSBFTkQ6ICFFTkFCTEUgLyBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYgLy8gIUVOQUJMRShKSVRfT1BUSU1J
WkVfQ0FMTCkKLQotI2Vsc2UgLy8gVVNFKEpTVkFMVUUzMl82NCkKLQogdm9pZCBKSVQ6OmNvbXBp
bGVPcENhbGxJbml0aWFsaXplQ2FsbEZyYW1lKCkKIHsKICAgICBzdG9yZTMyKHJlZ1QxLCBBZGRy
ZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQgKiBzdGF0
aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CkBAIC02OTcsOCArMzE5LDcgQEAgdm9p
ZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdAogCiAjZW5kaWYgLy8gIUVOQUJM
RShKSVRfT1BUSU1JWkVfQ0FMTCkKIAotI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KIH0g
Ly8gbmFtZXNwYWNlIEpTQwogCisjZW5kaWYgLy8gIVVTRShKU1ZBTFVFMzJfNjQpCiAjZW5kaWYg
Ly8gRU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzMzJfNjQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzMzJfNjQuY3Bw
CShyZXZpc2lvbiA1OTk0OSkKKysrIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzMzJfNjQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw5ICsyNSwxMCBAQAogICovCiAKICNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJKSVQuaCIKIAotI2lmIEVOQUJMRShKSVQpICYmIFVTRShKU1ZB
TFVFMzJfNjQpCisjaWYgRU5BQkxFKEpJVCkKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQorI2luY2x1
ZGUgIkpJVC5oIgogCiAjaW5jbHVkZSAiSklUSW5saW5lTWV0aG9kcy5oIgogI2luY2x1ZGUgIkpJ
VFN0dWJDYWxsLmgiCkBAIC0xODYxLDYgKzE4NjIsNyBAQCB2b2lkIEpJVDo6ZW1pdF9vcF9wcm9m
aWxlX2RpZF9jYWxsKEluc3RyCiAgICAgbm9Qcm9maWxlci5saW5rKHRoaXMpOwogfQogCi19Cit9
IC8vIG5hbWVzcGFjZSBKU0MKIAotI2VuZGlmIC8vIEVOQUJMRShKSVQpICYmIFVTRShKU1ZBTFVF
MzJfNjQpCisjZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKKyNlbmRpZiAvLyBFTkFCTEUoSklU
KQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wY29kZXMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzLmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBK
YXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2Rlcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1LDkg
KzI1LDggQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSklULmgiCi0K
ICNpZiBFTkFCTEUoSklUKQorI2luY2x1ZGUgIkpJVC5oIgogCiAjaW5jbHVkZSAiSklUSW5saW5l
TWV0aG9kcy5oIgogI2luY2x1ZGUgIkpJVFN0dWJDYWxsLmgiCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzMzJfNjQuY3BwCShyZXZpc2lvbiA1OTk0OSkKKysr
IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjUsMTIgKzI1LDEwIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAorI2lmIEVO
QUJMRShKSVQpCiAjaWYgVVNFKEpTVkFMVUUzMl82NCkKLQogI2luY2x1ZGUgIkpJVC5oIgogCi0j
aWYgRU5BQkxFKEpJVCkKLQogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkpJVElu
bGluZU1ldGhvZHMuaCIKICNpbmNsdWRlICJKSVRTdHViQ2FsbC5oIgpAQCAtMTE4Miw3ICsxMTgw
LDUgQEAgdm9pZCBKSVQ6OmVtaXRTbG93X29wX2dldF9ieV9wbmFtZShJbnN0cgogCiB9IC8vIG5h
bWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCiAjZW5kaWYgLy8gRU5B
QkxFKEpJVCkKLQotI2VuZGlmIC8vIEVOQUJMRShKU1ZBTFVFMzJfNjQpCi0KSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2Vzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzLmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBK
YXZhU2NyaXB0Q29yZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNSwxMiArMjUsMTAgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCisjaWYgRU5BQkxFKEpJ
VCkKICNpZiAhVVNFKEpTVkFMVUUzMl82NCkKLQogI2luY2x1ZGUgIkpJVC5oIgogCi0jaWYgRU5B
QkxFKEpJVCkKLQogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkdldHRlclNldHRl
ci5oIgogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKQEAgLTExMTIsNiArMTExMCw1IEBA
IHZvaWQgSklUOjpwcml2YXRlQ29tcGlsZUdldEJ5SWRDaGFpbihTdHIKIAogfSAvLyBuYW1lc3Bh
Y2UgSlNDCiAKLSNlbmRpZiAvLyBFTkFCTEUoSklUKQotCiAjZW5kaWYgLy8gIVVTRShKU1ZBTFVF
MzJfNjQpCisjZW5kaWYgLy8gRU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9K
SVRTdHVicy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaml0L0pJVFN0dWJzLmNw
cAkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUU3R1YnMuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yOCw5ICsyOCw5IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5o
IgotI2luY2x1ZGUgIkpJVFN0dWJzLmgiCiAKICNpZiBFTkFCTEUoSklUKQorI2luY2x1ZGUgIkpJ
VFN0dWJzLmgiCiAKICNpbmNsdWRlICJBcmd1bWVudHMuaCIKICNpbmNsdWRlICJDYWxsRnJhbWUu
aCIKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdl
TG9nCShyZXZpc2lvbiA1OTk0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDUtMjEgIEdlb2ZmcmV5IEdhcmVuICA8Z2dhcmVuQGFw
cGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KKworICAgICAgICBG
aXhlZCBmYWlsdXJlIHNlZW4gb24gYnVpbGRib3QgKGR1ZSB0byBmbGFreSB0ZXN0KS4KKyAgICAg
ICAgCisgICAgICAgIERvbid0IHJlcG9ydCBhbiBleGNlcHRpb24gaW4gYSBuZXN0ZWQgc2NyaXB0
IGV2YWx1YXRpb24gLS0ganVzdCBwYXNzIHRoZQorICAgICAgICBleGNlcHRpb24gb24gdG8gb3Vy
IGNhbGxlci4gT3VyIGNhbGxlciBjYW4gZGVjaWRlIHRvIHJlcG9ydCB0aGUgZXhjZXB0aW9uLAor
ICAgICAgICBpZiBpdCBmdWxseSBwcm9wYWdhdGVzIC0tIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJl
cG9ydCBhbiBleGNlcHRpb24gdGhhdCdzCisgICAgICAgIGdvaW5nIHRvIGdldCBjYXVnaHQuCisK
KyAgICAgICAgKiBiaW5kaW5ncy9qcy9TY3JpcHRDb250cm9sbGVyLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OlNjcmlwdENvbnRyb2xsZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbldvcmxkKToKKyAgICAgICAgKiBiaW5k
aW5ncy9qcy9TY3JpcHRDb250cm9sbGVyLmg6CisKIDIwMTAtMDUtMjEgIE9saXZlciBIdW50ICA8
b2xpdmVyQGFwcGxlLmNvbT4KIAogICAgICAgICBRdCBidWlsZGZpeCAjMgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56737</attachid>
            <date>2010-05-21 12:35:58 -0700</date>
            <delta_ts>2010-05-21 12:40:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-39507-20100521123557.patch</filename>
            <type>text/plain</type>
            <size>68407</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDUtMjEgIEdlb2ZmcmV5
IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTcGxpdCBvdXQgSklUQ2FsbDMyXzY0LmNwcCwgYW5kIHRpZ2h0
ZW5lZCB1cCBzb21lICNpZmRlZnMgaW4gdGhlIGhvcGVzCisgICAgICAgIG9mIGltcHJvdmluZyBj
b21waWxlIHRpbWVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Mzk1MDcKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6CisgICAgICAgICogaml0L0pJVC5jcHA6CisgICAgICAgICogaml0L0pJVEFyaXRo
bWV0aWMuY3BwOgorICAgICAgICAqIGppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwOgorICAgICAg
ICAqIGppdC9KSVRDYWxsLmNwcDoKKyAgICAgICAgKiBqaXQvSklUQ2FsbDMyXzY0LmNwcDogQ29w
aWVkIGZyb20gaml0L0pJVENhbGwuY3BwLgorICAgICAgICAqIGppdC9KSVRPcGNvZGVzLmNwcDoK
KyAgICAgICAgKiBqaXQvSklUT3Bjb2RlczMyXzY0LmNwcDoKKyAgICAgICAgKiBqaXQvSklUUHJv
cGVydHlBY2Nlc3MuY3BwOgorICAgICAgICAqIGppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNw
cDoKKyAgICAgICAgKiBqaXQvSklUU3R1YnMuY3BwOgorCiAyMDEwLTA1LTIxICBPbGl2ZXIgSHVu
dCAgPG9saXZlckBhcHBsZS5jb20+CiAKICAgICAgICAgV2luZG93cyBidWlsZCBmaXggIzMKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0FuZHJvaWQubWsKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvQW5kcm9pZC5tawkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9BbmRyb2lk
Lm1rCSh3b3JraW5nIGNvcHkpCkBAIC01MSw2ICs1MSw3IEBAIExPQ0FMX1NSQ19GSUxFUyA6PSBc
CiAJaml0L0pJVC5jcHAgXAogCWppdC9KSVRBcml0aG1ldGljLmNwcCBcCiAJaml0L0pJVENhbGwu
Y3BwIFwKKwlqaXQvSklUQ2FsbDMyXzY0LmNwcCBcCiAJaml0L0pJVE9wY29kZXMuY3BwIFwKIAlq
aXQvSklUUHJvcGVydHlBY2Nlc3MuY3BwIFwKIAlqaXQvSklUU3R1YnMuY3BwIFwKSW5kZXg6IEph
dmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiA1OTk0OSkKKysrIEphdmFTY3JpcHRDb3JlL0NNYWtl
TGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC02MSw2ICs2MSw3IEBAIFNFVChKYXZhU2NyaXB0
Q29yZV9TT1VSQ0VTCiAgICAgaml0L0pJVFByb3BlcnR5QWNjZXNzMzJfNjQuY3BwCiAgICAgaml0
L0pJVEFyaXRobWV0aWMuY3BwCiAgICAgaml0L0pJVENhbGwuY3BwCisgICAgaml0L0pJVENhbGwz
Ml82NC5jcHAKICAgICBqaXQvSklULmNwcAogCiAgICAgcGFyc2VyL0xleGVyLmNwcApJbmRleDog
SmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvR05V
bWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTg2LDYgKzg2LDcgQEAgamF2YXNjcmlwdGNv
cmVfc291cmNlcyArPSBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wY29kZXMuY3BwIFwKIAlK
YXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2RlczMyXzY0LmNwcCBcCiAJSmF2YVNjcmlwdENvcmUv
aml0L0pJVENhbGwuY3BwIFwKKwlKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbDMyXzY0LmNwcCBc
CiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVENvZGUuaCBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJ
VFByb3BlcnR5QWNjZXNzLmNwcCBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNj
ZXNzMzJfNjQuY3BwIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cGkK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZ3lwaQkocmV2aXNp
b24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5neXBpCSh3b3JraW5n
IGNvcHkpCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICAgICAgICAgICdqaXQvSklUQXJpdGhtZXRp
Yy5jcHAnLAogICAgICAgICAgICAgJ2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwJywKICAgICAg
ICAgICAgICdqaXQvSklUQ2FsbC5jcHAnLAorICAgICAgICAgICAgJ2ppdC9KSVRDYWxsMzJfNjQu
Y3BwJywKICAgICAgICAgICAgICdqaXQvSklUQ29kZS5oJywKICAgICAgICAgICAgICdqaXQvSklU
SW5saW5lTWV0aG9kcy5oJywKICAgICAgICAgICAgICdqaXQvSklUT3Bjb2Rlcy5jcHAnLApJbmRl
eDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTEwMSw2ICsxMDEs
NyBAQCBTT1VSQ0VTICs9IFwKICAgICBqaXQvSklUQXJpdGhtZXRpYy5jcHAgXAogICAgIGppdC9K
SVRBcml0aG1ldGljMzJfNjQuY3BwIFwKICAgICBqaXQvSklUQ2FsbC5jcHAgXAorICAgIGppdC9K
SVRDYWxsMzJfNjQuY3BwIFwKICAgICBqaXQvSklULmNwcCBcCiAgICAgaml0L0pJVE9wY29kZXMu
Y3BwIFwKICAgICBqaXQvSklUT3Bjb2RlczMyXzY0LmNwcCBcCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNw
cm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oJKHJldmlzaW9uIDU5OTQ5KQorKysg
SmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMTY1Myw2ICsxNjUzLDEwIEBACiAJ
CQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGpp
dFxKSVRDYWxsMzJfNjQuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cLi5caml0XEpJVENvZGUuaCINCiAJCQkJPg0KIAkJCTwvRmlsZT4N
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpA
QCAtMTExLDYgKzExMSw3IEBACiAJCTE0NDY5REVEMTA3RUM3RTcwMDY1MDQ0NiAvKiBTdHJpbmdQ
cm90b3R5cGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQkMxOEMzQzUwRTE2RUUzMzAwQjM0NDYwIC8qIFN0cmluZ1Byb3RvdHlwZS5jcHAgKi87IH07
CiAJCTE0NDY5REVFMTA3RUM3RTcwMDY1MDQ0NiAvKiBVU3RyaW5nLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY2OTJBODg1MDI1NTU5N0QwMUZGNjBG
NyAvKiBVU3RyaW5nLmNwcCAqLzsgfTsKIAkJMTQ2QUFCMzgwQjY2QTk0NDAwRTU1RjE2IC8qIEpT
U3RyaW5nUmVmQ0YuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMTQ2QUFCMzcwQjY2QTk0NDAwRTU1RjE2IC8qIEpTU3RyaW5nUmVmQ0YuY3BwICovOyB9
OworCQkxNDZGRTUxMjExQTcxMDQzMDA4N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0NkZFNTExMTFBNzEwNDMw
MDg3QUU2NiAvKiBKSVRDYWxsMzJfNjQuY3BwICovOyB9OwogCQkxNDdCODNBQzBFNkRCOEM5MDA0
Nzc1QTQgLyogQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0N0I4M0FBMEU2REI4QzkwMDQ3NzVBNCAvKiBC
YXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oICovOyB9OwogCQkxNDdCODQ2MzBFNkRFNkIxMDA0
Nzc1QTQgLyogUHV0UHJvcGVydHlTbG90LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAxNDdCODQ2MjBFNkRFNkIxMDA0Nzc1QTQgLyogUHV0UHJvcGVydHlT
bG90LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
MTQ3RjM5QkQxMDdFQzM3NjAwNDI3QTQ4IC8qIEFyZ0xpc3QuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNGNjA1MTEwRTIwM0VGODAwQjlBNjREIC8q
IEFyZ0xpc3QuY3BwICovOyB9OwpAQCAtNjMxLDYgKzYzMiw3IEBACiAJCTE0NUM1MDdGMEQ5REY2
M0IwMDg4RjZCOSAvKiBDYWxsRGF0YS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBDYWxsRGF0YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNDZBQUIyQTBCNjZB
ODQ5MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gSlNTdHJpbmdSZWZDRi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkx
NDZBQUIzNzBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNTdHJpbmdSZWZDRi5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCTE0NkZFNTExMTFBNzEwNDMwMDg3QUU2NiAvKiBKSVRDYWxsMzJf
NjQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSklUQ2FsbDMyXzY0
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3NjA4NjMwOTlDNjMzODAwNDM3
MTI4IC8qIEpTSW1tZWRpYXRlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEpTSW1tZWRpYXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3Qjgz
QUEwRTZEQjhDOTAwNDc3NUE0IC8qIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0N0I4NDYyMEU2REU2QjEwMDQ3NzVBNCAv
KiBQdXRQcm9wZXJ0eVNsb3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHV0
UHJvcGVydHlTbG90Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMjQxLDYgKzEy
NDMsNyBAQAogCQkJCTg2QTkwRUNGMEVFN0Q1MUYwMEFCMzUwRCAvKiBKSVRBcml0aG1ldGljLmNw
cCAqLywKIAkJCQlBNzU3MDZERDExOEEyQkNGMDA1N0Y4OEYgLyogSklUQXJpdGhtZXRpYzMyXzY0
LmNwcCAqLywKIAkJCQk4NkNDODVBMjBFRTc5Qjc0MDAyODg2ODIgLyogSklUQ2FsbC5jcHAgKi8s
CisJCQkJMTQ2RkU1MTExMUE3MTA0MzAwODdBRTY2IC8qIEpJVENhbGwzMl82NC5jcHAgKi8sCiAJ
CQkJODZDQ0VGREQwRjQxM0Y4OTAwRkQ3RjlFIC8qIEpJVENvZGUuaCAqLywKIAkJCQk4NkNDODVB
MDBFRTc5QTQ3MDAyODg2ODIgLyogSklUSW5saW5lTWV0aG9kcy5oICovLAogCQkJCUJDREQ1MUU5
MEZCOERGNzQwMDRBOEJEQyAvKiBKSVRPcGNvZGVzLmNwcCAqLywKQEAgLTI2MDcsNiArMjYxMCw3
IEBACiAJCQkJODYyNkJFQ0YxMTkyOEUzOTAwNzgyRkFCIC8qIFN0cmluZ1N0YXRpY3MuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQTcxMjM2RTUxMTk1RjMzQzAwQkQyMTc0IC8qIEpJVE9wY29kZXMz
Ml82NC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4NkM1NjhFMDExQTIxM0VFMDAwN0Y3RjAgLyog
TWFjcm9Bc3NlbWJsZXJBUk0uY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMTQ2RkU1MTIxMUE3MTA0
MzAwODdBRTY2IC8qIEpJVENhbGwzMl82NC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBNzgzQTJB
QjExQTVCRTg0MDA1NjNEMjAgLyogSlNPYmplY3RXaXRoR2xvYmFsT2JqZWN0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvaml0L0pJVC5jcHAJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUv
aml0L0pJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDggQEAKICAqLwogCiAjaW5j
bHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoSklUKQogI2luY2x1ZGUgIkpJVC5oIgogCiAv
LyBUaGlzIHByb2JhYmx5IGRvZXMgbm90IGJlbG9uZyBoZXJlOyBhZGRpbmcgaGVyZSBmb3Igbm93
IGFzIGEgcXVpY2sgV2luZG93cyBidWlsZCBmaXguCkBAIC0zMiw4ICszNCw2IEBACiBKU0M6Ok1h
Y3JvQXNzZW1ibGVyWDg2Q29tbW9uOjpTU0UyQ2hlY2tTdGF0ZSBKU0M6Ok1hY3JvQXNzZW1ibGVy
WDg2Q29tbW9uOjpzX3NzZTJDaGVja1N0YXRlID0gTm90Q2hlY2tlZFNTRTI7CiAjZW5kaWYKIAot
I2lmIEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJJbnRl
cnByZXRlci5oIgogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCShyZXZpc2lvbiA1OTk0OSkKKysrIEph
dmFTY3JpcHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNCw5ICsyNCwxMCBAQAogKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkpJ
VC5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQorI2luY2x1ZGUg
IkpJVC5oIgogCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCiAjaW5jbHVkZSAiSklUSW5saW5lTWV0
aG9kcy5oIgpAQCAtNDYsOCArNDcsNiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3Bh
Y2UgSlNDIHsKIAotI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZvaWQgSklUOjplbWl0X29wX25l
Z2F0ZShJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQogewogICAgIHVuc2lnbmVkIGRz
dCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CkBAIC0xNDA0LDggKzE0MDMsNyBA
QCB2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfbW9kKEluc3RydWN0aW9uKiBjCiAKIC8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQ6IE9QX01PRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KIAotI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KLX0KK30gLy8gbmFt
ZXNwYWNlIEpTQwogCisjZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKICNlbmRpZiAvLyBFTkFC
TEUoSklUKQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVEFyaXRobWV0aWMuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRBcml0aG1ldGljLmNwcAkocmV2aXNpb24g
NTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQXJpdGhtZXRpYy5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI0LDkgKzI0LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkpJVC5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpZiAhVVNFKEpTVkFMVUUzMl82NCkK
KyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkpJ
VElubGluZU1ldGhvZHMuaCIKQEAgLTQ2LDggKzQ3LDYgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsK
IAogbmFtZXNwYWNlIEpTQyB7CiAKLSNpZiAhVVNFKEpTVkFMVUUzMl82NCkKLQogdm9pZCBKSVQ6
OmVtaXRfb3BfbHNoaWZ0KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiB7CiAgICAg
dW5zaWduZWQgcmVzdWx0ID0gY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKQEAgLTE4
MzQsOCArMTgzMyw3IEBAIHZvaWQgSklUOjplbWl0U2xvd19vcF9zdWIoSW5zdHJ1Y3Rpb24qIGMK
IAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORDogT1BfQURELCBPUF9TVUIs
IE9QX01VTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2VuZGlmIC8vICFV
U0UoSlNWQUxVRTMyXzY0KQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vICFVU0Uo
SlNWQUxVRTMyXzY0KQogI2VuZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9qaXQvSklUQ2FsbDMyXzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQv
SklUQ2FsbDMyXzY0LmNwcAkocmV2aXNpb24gNTk5MzkpCShmcm9tIEphdmFTY3JpcHRDb3JlL2pp
dC9KSVRDYWxsLmNwcDo1OTkzOSkKKysrIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRDYWxsMzJfNjQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJKSVQuaCIKKworI2lmIEVOQUJMRShKSVQpCisKKyNpbmNsdWRlICJDb2RlQmxvY2suaCIKKyNp
bmNsdWRlICJKSVRJbmxpbmVNZXRob2RzLmgiCisjaW5jbHVkZSAiSklUU3R1YkNhbGwuaCIKKyNp
bmNsdWRlICJKU0FycmF5LmgiCisjaW5jbHVkZSAiSlNGdW5jdGlvbi5oIgorI2luY2x1ZGUgIklu
dGVycHJldGVyLmgiCisjaW5jbHVkZSAiUmVzdWx0VHlwZS5oIgorI2luY2x1ZGUgIlNhbXBsaW5n
VG9vbC5oIgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEpTQyB7CisKKyNpZiBVU0UoSlNWQUxV
RTMyXzY0KQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbEluaXRpYWxpemVDYWxsRnJhbWUoKQor
eworICAgIC8vIHJlZ1QwIGhvbGRzIGNhbGxlZSwgcmVnVDEgaG9sZHMgYXJnQ291bnQKKyAgICBz
dG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFy
Z3VtZW50Q291bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisKKyAg
ICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Nj
b3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7
IC8vIHNjb3BlQ2hhaW4KKworICAgIHN0b3JlUHRyKHJlZ1QwLCBBZGRyZXNzKGNhbGxGcmFtZVJl
Z2lzdGVyLCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJl
Z2lzdGVyKSkpKTsgLy8gY2FsbGVlCisgICAgc3RvcmVQdHIocmVnVDEsIEFkZHJlc3MoY2FsbEZy
YW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbiAqIHN0YXRpY19jYXN0PGludD4o
c2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8gc2NvcGVDaGFpbgorfQorCit2b2lkIEpJVDo6Y29tcGls
ZU9wQ2FsbFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IGFy
Z0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGludCByZWdpc3Rlck9mZnNl
dCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJl
Z1QxLCByZWdUMCwgMCk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9m
ZnNldCwgMSk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Cit9
CisgICAgICAgICAgCit2b2lkIEpJVDo6Y29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKEluc3Ry
dWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsy
XS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5v
cGVyYW5kOworICAgIGludCBwcm90byA9IGluc3RydWN0aW9uWzRdLnUub3BlcmFuZDsKKyAgICBp
bnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOworCisgICAgZW1pdFB1
dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0
YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KGFy
Z0NvdW50LCAyKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0Zyb21WaXJ0dWFsUmVnaXN0ZXIocHJv
dG8sIDMsIHJlZ1QyLCByZWdUMyk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudCh0aGlz
UmVnaXN0ZXIsIDQpOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFy
Z3MoSW5zdHJ1Y3Rpb24qKQoreworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QxLCByZWdUMCwg
MCk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDMsIDEpOyAvLyByZWdpc3Rlck9mZnNldAor
ICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QyLCAyKTsgLy8gYXJnQ291bnQKK30KKwordm9pZCBK
SVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVzdWx0KEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sK
KyAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGVtaXRTdG9yZShk
c3QsIHJlZ1QxLCByZWdUMCk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJncyhJ
bnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9u
WzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnRSZWdpc3RlciA9IGluc3RydWN0aW9uWzJd
LnUub3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9w
ZXJhbmQ7CisKKyAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7CisgICAgZW1pdExv
YWRQYXlsb2FkKGFyZ0NvdW50UmVnaXN0ZXIsIHJlZ1QyKTsgLy8gYXJnQ291bnQKKyAgICBhZGRQ
dHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQpLCByZWdUMiwgcmVnVDMpOyAvLyByZWdpc3Rlck9mZnNl
dAorCisgICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworCisg
ICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNhbGxlZSwgcmVnVDEpOworICAgIGFkZFNs
b3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2Jh
bERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOworCisgICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRo
ZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAg
IG11bDMyKEltbTMyKHNpemVvZihSZWdpc3RlcikpLCByZWdUMywgcmVnVDMpOworICAgIGFkZFB0
cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOworICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lz
dGVyLCBBZGRyZXNzKHJlZ1QzLCBSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICogc3RhdGljX2Nh
c3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIG1vdmUocmVnVDMsIGNhbGxGcmFtZVJl
Z2lzdGVyKTsKKworICAgIG1vdmUocmVnVDIsIHJlZ1QxKTsgLy8gYXJnQ291bnQKKworICAgIGVt
aXROYWtlZENhbGwobV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKKwor
ICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxl
T3BDYWxsVmFyYXJnc1Nsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNs
b3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1
Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRlciwg
Y2FsbGVlKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICBKSVRTdHViQ2FsbCBzdHVi
Q2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKTsKKyAgICBzdHViQ2FsbC5jYWxs
KCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6
ZW1pdF9vcF9yZXQoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKK3sKKyAgICB1bnNp
Z25lZCBkc3QgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgLy8gV2Ug
Y291bGQgSklUIGdlbmVyYXRlIHRoZSBkZXJlZiwgb25seSBjYWxsaW5nIG91dCB0byBDIHdoZW4g
dGhlIHJlZmNvdW50IGhpdHMgemVyby4KKyAgICBpZiAobV9jb2RlQmxvY2stPm5lZWRzRnVsbFNj
b3BlQ2hhaW4oKSkKKyAgICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX3JldF9zY29wZUNo
YWluKS5jYWxsKCk7CisKKyAgICBlbWl0TG9hZChkc3QsIHJlZ1QxLCByZWdUMCk7CisgICAgZW1p
dEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIp
OworICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVy
RnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKworICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVm
b3JlUmV0dXJuKHJlZ1QyKTsKKyAgICByZXQoKTsKK30KKwordm9pZCBKSVQ6OmVtaXRfb3BfcmV0
X29iamVjdF9vcl90aGlzKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCit7CisgICAg
dW5zaWduZWQgcmVzdWx0ID0gY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICB1
bnNpZ25lZCB0aGlzUmVnID0gY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKworICAg
IC8vIFdlIGNvdWxkIEpJVCBnZW5lcmF0ZSB0aGUgZGVyZWYsIG9ubHkgY2FsbGluZyBvdXQgdG8g
QyB3aGVuIHRoZSByZWZjb3VudCBoaXRzIHplcm8uCisgICAgaWYgKG1fY29kZUJsb2NrLT5uZWVk
c0Z1bGxTY29wZUNoYWluKCkpCisgICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9yZXRf
c2NvcGVDaGFpbikuY2FsbCgpOworCisgICAgZW1pdExvYWQocmVzdWx0LCByZWdUMSwgcmVnVDAp
OworICAgIEp1bXAgbm90SlNDZWxsID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihK
U1ZhbHVlOjpDZWxsVGFnKSk7CisgICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZG
U0VUT0YoSlNDZWxsLCBtX3N0cnVjdHVyZSkpLCByZWdUMik7CisgICAgSnVtcCBub3RPYmplY3Qg
PSBicmFuY2g4KE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QyLCBPQkpFQ1RfT0ZGU0VUT0YoU3RydWN0
dXJlLCBtX3R5cGVJbmZvKSArIE9CSkVDVF9PRkZTRVRPRihUeXBlSW5mbywgbV90eXBlKSksIElt
bTMyKE9iamVjdFR5cGUpKTsKKworICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJl
Z2lzdGVyRmlsZTo6UmV0dXJuUEMsIHJlZ1QyKTsKKyAgICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhl
YWRlclB0cihSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisK
KyAgICByZXN0b3JlUmV0dXJuQWRkcmVzc0JlZm9yZVJldHVybihyZWdUMik7CisgICAgcmV0KCk7
CisKKyAgICBub3RKU0NlbGwubGluayh0aGlzKTsKKyAgICBub3RPYmplY3QubGluayh0aGlzKTsK
KyAgICBlbWl0TG9hZCh0aGlzUmVnLCByZWdUMSwgcmVnVDApOworCisgICAgZW1pdEdldEZyb21D
YWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOworICAgIGVt
aXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNh
bGxGcmFtZVJlZ2lzdGVyKTsKKworICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJu
KHJlZ1QyKTsKKyAgICByZXQoKTsKK30KKwordm9pZCBKSVQ6OmVtaXRTbG93X29wX2NhbGwoSW5z
dHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVy
YXRvciYgaXRlcikKK3sKKyAgICBjb21waWxlT3BDYWxsU2xvd0Nhc2UoY3VycmVudEluc3RydWN0
aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0luZGV4KyssIG9wX2NhbGwpOworfQorCit2b2lkIEpJ
VDo6ZW1pdFNsb3dfb3BfY2FsbF9ldmFsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24s
IFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9w
Q2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0luZm9JbmRl
eCsrLCBvcF9jYWxsX2V2YWwpOworfQorCit2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbF92YXJh
cmdzKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5
Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTbG93Q2FzZShj
dXJyZW50SW5zdHJ1Y3Rpb24sIGl0ZXIpOworfQorCit2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY29u
c3RydWN0KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVu
dHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJl
bnRJbnN0cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0luZm9JbmRleCsrLCBvcF9jb25zdHJ1Y3Qp
OworfQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jYWxsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1
Y3Rpb24pCit7CisgICAgY29tcGlsZU9wQ2FsbChvcF9jYWxsLCBjdXJyZW50SW5zdHJ1Y3Rpb24s
IG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Cit9CisKK3ZvaWQgSklUOjplbWl0X29wX2NhbGxfZXZh
bChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQoreworICAgIGNvbXBpbGVPcENhbGwo
b3BfY2FsbF9ldmFsLCBjdXJyZW50SW5zdHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7
Cit9CisKK3ZvaWQgSklUOjplbWl0X29wX2xvYWRfdmFyYXJncyhJbnN0cnVjdGlvbiogY3VycmVu
dEluc3RydWN0aW9uKQoreworICAgIGludCBhcmdDb3VudERzdCA9IGN1cnJlbnRJbnN0cnVjdGlv
blsxXS51Lm9wZXJhbmQ7CisgICAgaW50IGFyZ3NPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25b
Ml0udS5vcGVyYW5kOworCisgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2xv
YWRfdmFyYXJncyk7CisgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIoYXJnc09mZnNldCkp
OworICAgIHN0dWJDYWxsLmNhbGwoKTsKKyAgICAvLyBTdG9yZXMgYSBuYWtlZCBpbnQzMiBpbiB0
aGUgcmVnaXN0ZXIgZmlsZS4KKyAgICBzdG9yZTMyKHJldHVyblZhbHVlUmVnaXN0ZXIsIEFkZHJl
c3MoY2FsbEZyYW1lUmVnaXN0ZXIsIGFyZ0NvdW50RHN0ICogc2l6ZW9mKFJlZ2lzdGVyKSkpOwor
fQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jYWxsX3ZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJ
bnN0cnVjdGlvbikKK3sKKyAgICBjb21waWxlT3BDYWxsVmFyYXJncyhjdXJyZW50SW5zdHJ1Y3Rp
b24pOworfQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jb25zdHJ1Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJl
bnRJbnN0cnVjdGlvbikKK3sKKyAgICBjb21waWxlT3BDYWxsKG9wX2NvbnN0cnVjdCwgY3VycmVu
dEluc3RydWN0aW9uLCBtX2NhbGxMaW5rSW5mb0luZGV4KyspOworfQorCisjaWYgIUVOQUJMRShK
SVRfT1BUSU1JWkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJF
R0lOOiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIElu
c3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgdW5zaWduZWQpCit7CisgICAgaW50IGNhbGxlZSA9IGlu
c3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsy
XS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5v
cGVyYW5kOworCisgICAgSnVtcCB3YXNFdmFsOworICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxs
X2V2YWwpIHsKKyAgICAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NhbGxf
ZXZhbCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KGNhbGxlZSk7CisgICAgICAgIHN0
dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJPZmZzZXQpKTsKKyAgICAgICAg
c3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3VudCkpOworICAgICAgICBzdHVi
Q2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2gzMihOb3RFcXVhbCwgcmVnVDEs
IEltbTMyKEpTVmFsdWU6OkVtcHR5VmFsdWVUYWcpKTsKKyAgICB9CisKKyAgICBlbWl0TG9hZChj
YWxsZWUsIHJlZ1QxLCByZWdUMCk7CisKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkKKyAg
ICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7CisgICAgZWxzZSBpZiAo
b3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1
cEFyZ3MoaW5zdHJ1Y3Rpb24pOworCisgICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNh
bGxlZSwgcmVnVDEpOworICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVz
cyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOworCisgICAg
Ly8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9i
amVjdC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7CisgICAgICAgIEpJVFN0
dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJP
ZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Cisg
ICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAgICB9CisKKyAgICAvLyBT
cGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBt
YXRjaCB0aGUgYXJpdHkuCisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3Mo
Y2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJP
ZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIGFkZFB0
cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVy
KSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgbW92ZShJbW0zMihhcmdDb3VudCksIHJlZ1Qx
KTsKKworICAgIGVtaXROYWtlZENhbGwob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9i
YWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ29uc3RydWN0KCkgOiBtX2dsb2JhbERhdGEtPmpp
dFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOworCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxf
ZXZhbCkKKyAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMpOworCisgICAgc2FtcGxlQ29kZUJsb2Nr
KG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0
cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0
ZXIsIHVuc2lnbmVkLCBPcGNvZGVJRCBvcGNvZGVJRCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5z
dHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRl
ciwgY2FsbGVlKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICBKSVRTdHViQ2FsbCBz
dHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0
X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2NhbGxfTm90SlNGdW5jdGlvbik7CisgICAgc3R1YkNh
bGwuY2FsbCgpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKworI2Vs
c2UgLy8gIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tIEJFR0lOOiBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJ
RCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlua0lu
Zm9JbmRleCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwor
ICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICBpbnQgcmVn
aXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAgICBKdW1wIHdhc0V2
YWw7CisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkgeworICAgICAgICBKSVRTdHVi
Q2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwu
YWRkQXJndW1lbnQoY2FsbGVlKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJ
bW0zMihyZWdpc3Rlck9mZnNldCkpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6
OkltbTMyKGFyZ0NvdW50KSk7CisgICAgICAgIHN0dWJDYWxsLmNhbGwoKTsKKyAgICAgICAgd2Fz
RXZhbCA9IGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6RW1wdHlWYWx1
ZVRhZykpOworICAgIH0KKworICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKwor
ICAgIERhdGFMYWJlbFB0ciBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrOworCisgICAgQkVH
SU5fVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7CisKKyAgICBKdW1wIGp1
bXBUb1Nsb3cgPSBicmFuY2hQdHJXaXRoUGF0Y2goTm90RXF1YWwsIHJlZ1QwLCBhZGRyZXNzT2ZM
aW5rZWRGdW5jdGlvbkNoZWNrLCBJbW1QdHIoMCkpOworCisgICAgRU5EX1VOSU5URVJSVVBURURf
U0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOworCisgICAgYWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7
CisgICAgQVNTRVJUKGRpZmZlcmVuY2VCZXR3ZWVuKGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hl
Y2ssIGp1bXBUb1Nsb3cpID09IHBhdGNoT2Zmc2V0T3BDYWxsQ29tcGFyZVRvSnVtcCk7CisgICAg
bV9jYWxsU3RydWN0dXJlU3R1YkNvbXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90
UGF0aEJlZ2luID0gYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKKworICAgIGFkZFNsb3dD
YXNlKGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6Q2VsbFRhZykpKTsK
KworICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGZhc3QgY2FzZSwgb25seSB1c2VkIHdoYW4g
YSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4KKworICAgIC8vIEluIHRoZSBjYXNlIG9mIE9wQ29uc3Ry
dWN0LCBjYWxsIG91dCB0byBhIGN0aV8gZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0
LgorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpIHsKKyAgICAgICAgaW50IHByb3Rv
ID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVyYW5kOworICAgICAgICBpbnQgdGhpc1JlZ2lzdGVyID0g
aW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOworCisgICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxs
KHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpOworICAgICAgICBzdHViQ2FsbC5h
ZGRBcmd1bWVudChyZWdUMSwgcmVnVDApOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJ
bW0zMigwKSk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB1bnVzZWQgSklUU3R1YiBhcmd1bWVudC4K
KyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIoMCkpOyAvLyBGSVhNRTogUmVtb3Zl
IHRoaXMgdW51c2VkIEpJVFN0dWIgYXJndW1lbnQuCisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3Vt
ZW50KHByb3RvKTsKKyAgICAgICAgc3R1YkNhbGwuY2FsbCh0aGlzUmVnaXN0ZXIpOworCisgICAg
ICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAgICB9CisKKyAgICAvLyBGYXN0
IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUgaW5pdGlhbGl6YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZl
IHRvIGVkaS4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBvbWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJG
aWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FsbGVlCisgICAgbG9hZFB0cihB
ZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSAr
IE9CSkVDVF9PRkZTRVRPRihTY29wZUNoYWluLCBtX25vZGUpKSwgcmVnVDIpOworCisgICAgc3Rv
cmUzMihJbW0zMihhcmdDb3VudCksIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rl
ck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6QXJndW1lbnRDb3VudCkgKiBzdGF0aWNfY2FzdDxpbnQ+
KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFk
ZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6
Q2FsbGVyRnJhbWUpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAg
IGVtaXRTdG9yZShyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlLCByZWdUMSwg
cmVnVDApOworICAgIHN0b3JlUHRyKHJlZ1QyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAo
cmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8
aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNl
dCAqIHNpemVvZihSZWdpc3RlcikpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisKKyAgICAvLyBDYWxs
IHRvIHRoZSBjYWxsZWUKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2Nh
bGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoT3RoZXIgPSBlbWl0TmFrZWRDYWxsKCk7CisgICAgCisg
ICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKKyAgICAgICAgd2FzRXZhbC5saW5rKHRo
aXMpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6
OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxT
bG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4
LCBPcGNvZGVJRCBvcGNvZGVJRCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsK
KyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAg
ICBsaW5rU2xvd0Nhc2UoaXRlcik7CisgICAgbGlua1Nsb3dDYXNlKGl0ZXIpOworCisgICAgLy8g
VGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2Fs
bF9ldmFsCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGwpCisgICAgICAgIGNvbXBpbGVPcENh
bGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2Nv
bnN0cnVjdCkKKyAgICAgICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9u
KTsKKworICAgIC8vIEZhc3QgY2hlY2sgZm9yIEpTIGZ1bmN0aW9uLgorICAgIEp1bXAgY2FsbExp
bmtGYWlsTm90T2JqZWN0ID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVl
OjpDZWxsVGFnKSk7CisgICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNo
UHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5j
dGlvblZQdHIpKTsKKworICAgIC8vIEZpcnN0LCBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwg
YWxsb2NhdGUgdGhlIG5ldyBvYmplY3QuCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVj
dCkgeworICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBjdGlfb3BfY29uc3RydWN0X0pTQ29uc3Ry
dWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJT
aXplIC0gYXJnQ291bnQpOworICAgICAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7
CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3Vt
aW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAgIHN0b3JlUHRyKGNhbGxGcmFt
ZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxs
ZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lz
dGVyKSkpKTsKKyAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxp
bnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1lUmVnaXN0ZXIpOworICAgIG1vdmUoSW1t
MzIoYXJnQ291bnQpLCByZWdUMSk7CisKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRp
b25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5jYWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRD
YWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3Rp
VmlydHVhbENvbnN0cnVjdExpbmsoKSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVh
bENhbGxMaW5rKCkpOworCisgICAgLy8gSWYgbm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4g
dGhlIGlmIGJlbG93IQorICAgIEFTU0VSVChPUENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09E
RV9MRU5HVEgob3BfY2FsbF9ldmFsKSk7CisKKyAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRv
IHRoZSBob3QgcGF0aC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAgICAg
ICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7
CisgICAgZWxzZQorICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5H
VEgob3BfY2FsbCkpOworCisgICAgLy8gVGhpcyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCisgICAg
Y2FsbExpbmtGYWlsTm90T2JqZWN0LmxpbmsodGhpcyk7CisgICAgY2FsbExpbmtGYWlsTm90SlNG
dW5jdGlvbi5saW5rKHRoaXMpOworICAgIEpJVFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9w
X2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2Fs
bF9Ob3RKU0Z1bmN0aW9uKS5jYWxsKCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxv
Y2spOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxF
IC8gRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworI2VuZGlmIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCisKKyNlbHNlIC8v
IFVTRShKU1ZBTFVFMzJfNjQpCisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsSW5pdGlhbGl6ZUNh
bGxGcmFtZSgpCit7CisgICAgc3RvcmUzMihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3Rl
ciwgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yo
UmVnaXN0ZXIpKSkpOworCisgICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VU
T0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9CSkVDVF9PRkZTRVRPRihTY29wZUNoYWlu
LCBtX25vZGUpKSwgcmVnVDEpOyAvLyBuZXdTY29wZUNoYWluCisKKyAgICBzdG9yZVB0cihyZWdU
MCwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpDYWxsZWUgKiBzdGF0
aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgc3RvcmVQdHIocmVnVDEsIEFk
ZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbiAqIHN0YXRp
Y19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVP
cENhbGxTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAgICAvLyBlY3ggaG9sZHMgZnVuYworICAg
IGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QwLCAwKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0
YW50KGFyZ0NvdW50LCAyKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVy
T2Zmc2V0LCAxKTsKK30KKyAgICAgICAgICAKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJn
c1NldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IHJlZ2lzdGVy
T2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworICAgIAorICAgIC8vIGVjeCBob2xk
cyBmdW5jCisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRT
dHViQXJnKHJlZ1QxLCAyKTsKKyAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQpLCByZWdU
MSwgcmVnVDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QyLCAxKTsKK30KKwordm9pZCBK
SVQ6OmNvbXBpbGVPcENvbnN0cnVjdFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24p
Cit7CisgICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGlu
dCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKyAgICBpbnQgcHJv
dG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7CisgICAgaW50IHRoaXNSZWdpc3RlciA9IGlu
c3RydWN0aW9uWzVdLnUub3BlcmFuZDsKKworICAgIC8vIGVjeCBob2xkcyBmdW5jCisgICAgZW1p
dFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQo
cmVnaXN0ZXJPZmZzZXQsIDEpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQoYXJnQ291
bnQsIDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnRnJvbVZpcnR1YWxSZWdpc3Rlcihwcm90bywg
MywgcmVnVDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQodGhpc1JlZ2lzdGVyLCA0
KTsKK30KKwordm9pZCBKSVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVzdWx0KEluc3RydWN0aW9uKiBp
bnN0cnVjdGlvbikKK3sKKyAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwor
ICAgIGVtaXRQdXRWaXJ0dWFsUmVnaXN0ZXIoZHN0KTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVP
cENhbGxWYXJhcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgY2FsbGVl
ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudFJlZ2lzdGVyID0g
aW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworCisgICAgZW1pdEdldFZpcnR1YWxSZWdpc3Rlcihh
cmdDb3VudFJlZ2lzdGVyLCByZWdUMSk7CisgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxs
ZWUsIHJlZ1QwKTsKKyAgICBjb21waWxlT3BDYWxsVmFyYXJnc1NldHVwQXJncyhpbnN0cnVjdGlv
bik7CisKKyAgICAvLyBDaGVjayBmb3IgSlNGdW5jdGlvbnMuCisgICAgZW1pdEp1bXBTbG93Q2Fz
ZUlmTm90SlNDZWxsKHJlZ1QwKTsKKyAgICBhZGRTbG93Q2FzZShicmFuY2hQdHIoTm90RXF1YWws
IEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikpKTsK
KworICAgIC8vIFNwZWN1bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWluZyBhcmdD
b3VudCB3aWxsIG1hdGNoIHRoZSBhcml0eS4KKyAgICBtdWwzMihJbW0zMihzaXplb2YoUmVnaXN0
ZXIpKSwgcmVnVDIsIHJlZ1QyKTsKKyAgICBpbnRwdHJfdCBvZmZzZXQgPSAoaW50cHRyX3Qpc2l6
ZW9mKFJlZ2lzdGVyKSAqIChpbnRwdHJfdClSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lOworICAg
IGFkZFB0cihJbW0zMigoaW50MzJfdClvZmZzZXQpLCByZWdUMiwgcmVnVDMpOworICAgIGFkZFB0
cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOworICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lz
dGVyLCByZWdUMyk7CisgICAgYWRkUHRyKHJlZ1QyLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAg
ZW1pdE5ha2VkQ2FsbChtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOwor
CisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6OmNvbXBp
bGVPcENhbGxWYXJhcmdzU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qLCBWZWN0b3I8U2xvd0Nhc2VFbnRy
eT46Oml0ZXJhdG9yJiBpdGVyKQoreworICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKKyAgICBsaW5r
U2xvd0Nhc2UoaXRlcik7CisgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2Nh
bGxfTm90SlNGdW5jdGlvbik7CisgICAgc3R1YkNhbGwuY2FsbCgpOworICAgIAorICAgIHNhbXBs
ZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisgICAgCisjaWYgIUVOQUJMRShKSVRfT1BUSU1J
WkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiAhRU5B
QkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
Kwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9u
KiBpbnN0cnVjdGlvbiwgdW5zaWduZWQpCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9u
WzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJh
bmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwor
CisgICAgLy8gSGFuZGxlIGV2YWwKKyAgICBKdW1wIHdhc0V2YWw7CisgICAgaWYgKG9wY29kZUlE
ID09IG9wX2NhbGxfZXZhbCkgeworICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBj
dGlfb3BfY2FsbF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlLCBy
ZWdUMCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJP
ZmZzZXQpKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3Vu
dCkpOworICAgICAgICBzdHViQ2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2hQ
dHIoTm90RXF1YWwsIHJlZ1QwLCBJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoKSkpKTsK
KyAgICB9CisKKyAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOworICAg
IC8vIFRoZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHNldCB1cCBvbiB0aGUgaG90IHBhdGggZm9yIG9w
X2NhbGxfZXZhbAorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsKQorICAgICAgICBjb21waWxl
T3BDYWxsU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKKyAgICBlbHNlIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpCisgICAgICAgIGNvbXBpbGVPcENvbnN0cnVjdFNldHVwQXJncyhpbnN0cnVj
dGlvbik7CisKKyAgICAvLyBDaGVjayBmb3IgSlNGdW5jdGlvbnMuCisgICAgZW1pdEp1bXBTbG93
Q2FzZUlmTm90SlNDZWxsKHJlZ1QwKTsKKyAgICBhZGRTbG93Q2FzZShicmFuY2hQdHIoTm90RXF1
YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikp
KTsKKworICAgIC8vIEZpcnN0LCBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUg
dGhlIG5ldyBvYmplY3QuCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgeworICAg
ICAgICBKSVRTdHViQ2FsbCh0aGlzLCBjdGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxs
KHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJn
Q291bnQpOworICAgICAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwor
ICAgIH0KKworICAgIC8vIFNwZWN1bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWlu
ZyBhcmdDb3VudCB3aWxsIG1hdGNoIHRoZSBhcml0eS4KKyAgICBzdG9yZVB0cihjYWxsRnJhbWVS
ZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2FsbGVy
RnJhbWUgKyByZWdpc3Rlck9mZnNldCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3Rl
cikpKSk7CisgICAgYWRkUHRyKEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50
PihzaXplb2YoUmVnaXN0ZXIpKSksIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBtb3ZlKEltbTMy
KGFyZ0NvdW50KSwgcmVnVDEpOworCisgICAgZW1pdE5ha2VkQ2FsbChvcGNvZGVJRCA9PSBvcF9j
b25zdHJ1Y3QgPyBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDb25zdHJ1Y3QoKSA6
IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7CisKKyAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY2FsbF9ldmFsKQorICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7CisKKyAg
ICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9w
Q2FsbFNsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50
cnk+OjppdGVyYXRvciYgaXRlciwgdW5zaWduZWQsIE9wY29kZUlEIG9wY29kZUlEKQoreworICAg
IGxpbmtTbG93Q2FzZShpdGVyKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisgICAgSklUU3R1
YkNhbGwgc3R1YkNhbGwodGhpcywgb3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gY3RpX29wX2Nv
bnN0cnVjdF9Ob3RKU0NvbnN0cnVjdCA6IGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pOworICAg
IHN0dWJDYWxsLmNhbGwoKTsKKworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9
CisKKyNlbHNlIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTjogRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwo
T3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgdW5zaWduZWQgY2Fs
bExpbmtJbmZvSW5kZXgpCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3Bl
cmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisgICAg
aW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworCisgICAgLy8g
SGFuZGxlIGV2YWwKKyAgICBKdW1wIHdhc0V2YWw7CisgICAgaWYgKG9wY29kZUlEID09IG9wX2Nh
bGxfZXZhbCkgeworICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2Fs
bF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlLCByZWdUMCk7Cisg
ICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJPZmZzZXQpKTsK
KyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3VudCkpOworICAg
ICAgICBzdHViQ2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2hQdHIoTm90RXF1
YWwsIHJlZ1QwLCBJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoKSkpKTsKKyAgICB9CisK
KyAgICAvLyBUaGlzIHBsYW50cyBhIGNoZWNrIGZvciBhIGNhY2hlZCBKU0Z1bmN0aW9uIHZhbHVl
LCBzbyB3ZSBjYW4gcGxhbnQgYSBmYXN0IGxpbmsgdG8gdGhlIGNhbGxlZS4KKyAgICAvLyBUaGlz
IGRlbGliZXJhdGVseSBsZWF2ZXMgdGhlIGNhbGxlZSBpbiBlY3gsIHVzZWQgd2hlbiBzZXR0aW5n
IHVwIHRoZSBzdGFjayBmcmFtZSBiZWxvdworICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2Fs
bGVlLCByZWdUMCk7CisgICAgRGF0YUxhYmVsUHRyIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hl
Y2s7CisKKyAgICBCRUdJTl9VTklOVEVSUlVQVEVEX1NFUVVFTkNFKHNlcXVlbmNlT3BDYWxsKTsK
KworICAgIEp1bXAganVtcFRvU2xvdyA9IGJyYW5jaFB0cldpdGhQYXRjaChOb3RFcXVhbCwgcmVn
VDAsIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIEltbVB0cihKU1ZhbHVlOjplbmNvZGUo
SlNWYWx1ZSgpKSkpOworCisgICAgRU5EX1VOSU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VP
cENhbGwpOworCisgICAgYWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7CisgICAgQVNTRVJUX0pJVF9P
RkZTRVQoZGlmZmVyZW5jZUJldHdlZW4oYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjaywganVt
cFRvU2xvdyksIHBhdGNoT2Zmc2V0T3BDYWxsQ29tcGFyZVRvSnVtcCk7CisgICAgbV9jYWxsU3Ry
dWN0dXJlU3R1YkNvbXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aEJlZ2lu
ID0gYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcg
aXMgdGhlIGZhc3QgY2FzZSwgb25seSB1c2VkIHdoYW4gYSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4K
KworICAgIC8vIEluIHRoZSBjYXNlIG9mIE9wQ29uc3RydWN0LCBjYWxsIG91dCB0byBhIGN0aV8g
ZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0LgorICAgIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpIHsKKyAgICAgICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVy
YW5kOworICAgICAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5k
OworCisgICAgICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QwLCAwKTsKKyAgICAgICAgZW1pdFB1
dEpJVFN0dWJBcmdGcm9tVmlydHVhbFJlZ2lzdGVyKHByb3RvLCAzLCByZWdUMik7CisgICAgICAg
IEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3Qp
OworICAgICAgICBzdHViQ2FsbC5jYWxsKHRoaXNSZWdpc3Rlcik7CisgICAgICAgIGVtaXRHZXRW
aXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7CisgICAgfQorCisgICAgLy8gRmFzdCB2ZXJz
aW9uIG9mIHN0YWNrIGZyYW1lIGluaXRpYWxpemF0aW9uLCBkaXJlY3RseSByZWxhdGl2ZSB0byBl
ZGkuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgb21pdHMgdG8gc2V0IHVwIFJlZ2lzdGVyRmlsZTo6
Q29kZUJsb2NrLCB3aGljaCBpcyBzZXQgaW4gdGhlIGNhbGxlZQorCisgICAgbG9hZFB0cihBZGRy
ZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9C
SkVDVF9PRkZTRVRPRihTY29wZUNoYWluLCBtX25vZGUpKSwgcmVnVDEpOyAvLyBuZXdTY29wZUNo
YWluCisKKyAgICBzdG9yZTMyKEltbTMyKGFyZ0NvdW50KSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdp
c3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50KSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihjYWxsRnJh
bWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsg
UmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKSk7CisgICAgc3RvcmVQdHIocmVnVDAsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIs
IChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlKSAqIHN0YXRpY19jYXN0PGlu
dD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVzcyhjYWxs
RnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWlu
KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBhZGRQdHIoSW1t
MzIocmVnaXN0ZXJPZmZzZXQgKiBzaXplb2YoUmVnaXN0ZXIpKSwgY2FsbEZyYW1lUmVnaXN0ZXIp
OworCisgICAgLy8gQ2FsbCB0byB0aGUgY2FsbGVlCisgICAgbV9jYWxsU3RydWN0dXJlU3R1YkNv
bXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aE90aGVyID0gZW1pdE5ha2Vk
Q2FsbCgpOworICAgIAorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpCisgICAgICAg
IHdhc0V2YWwubGluayh0aGlzKTsKKworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7
Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGluc3Ry
dWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyLCB1bnNpZ25lZCBj
YWxsTGlua0luZm9JbmRleCwgT3Bjb2RlSUQgb3Bjb2RlSUQpCit7CisgICAgaW50IGNhbGxlZSA9
IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlv
blsyXS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10u
dS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlKGl0ZXIpOworCisgICAgLy8gVGhlIGFyZ3Vt
ZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCisg
ICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGwpCisgICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFy
Z3MoaW5zdHJ1Y3Rpb24pOworICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkK
KyAgICAgICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKKworICAg
IC8vIEZhc3QgY2hlY2sgZm9yIEpTIGZ1bmN0aW9uLgorICAgIEp1bXAgY2FsbExpbmtGYWlsTm90
T2JqZWN0ID0gZW1pdEp1bXBJZk5vdEpTQ2VsbChyZWdUMCk7CisgICAgSnVtcCBjYWxsTGlua0Zh
aWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1t
UHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKTsKKworICAgIC8vIEZpcnN0LCBpbiB0
aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUgdGhlIG5ldyBvYmplY3QuCisgICAgaWYg
KG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgeworICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBj
dGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0
ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJnQ291bnQpOworICAgICAgICBlbWl0R2V0
VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOworICAgIH0KKworICAgIC8vIFNwZWN1bGF0
aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWluZyBhcmdDb3VudCB3aWxsIG1hdGNoIHRo
ZSBhcml0eS4KKyAgICBzdG9yZVB0cihjYWxsRnJhbWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJh
bWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUgKyByZWdpc3Rlck9mZnNldCkg
KiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgYWRkUHRyKEltbTMy
KHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSksIGNh
bGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBtb3ZlKEltbTMyKGFyZ0NvdW50KSwgcmVnVDEpOworCisg
ICAgbW92ZShyZWdUMCwgcmVnVDIpOworCisgICAgbV9jYWxsU3RydWN0dXJlU3R1YkNvbXBpbGF0
aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uY2FsbFJldHVybkxvY2F0aW9uID0gZW1pdE5ha2Vk
Q2FsbChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0
aVZpcnR1YWxDb25zdHJ1Y3RMaW5rKCkgOiBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1
YWxDYWxsTGluaygpKTsKKworICAgIC8vIElmIG5vdCwgd2UgbmVlZCBhbiBleHRyYSBjYXNlIGlu
IHRoZSBpZiBiZWxvdyEKKyAgICBBU1NFUlQoT1BDT0RFX0xFTkdUSChvcF9jYWxsKSA9PSBPUENP
REVfTEVOR1RIKG9wX2NhbGxfZXZhbCkpOworCisgICAgLy8gRG9uZSEgLSByZXR1cm4gYmFjayB0
byB0aGUgaG90IHBhdGguCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKKyAgICAg
ICAgZW1pdEp1bXBTbG93VG9Ib3QoanVtcCgpLCBPUENPREVfTEVOR1RIKG9wX2NvbnN0cnVjdCkp
OworICAgIGVsc2UKKyAgICAgICAgZW1pdEp1bXBTbG93VG9Ib3QoanVtcCgpLCBPUENPREVfTEVO
R1RIKG9wX2NhbGwpKTsKKworICAgIC8vIFRoaXMgaGFuZGxlcyBob3N0IGZ1bmN0aW9ucworICAg
IGNhbGxMaW5rRmFpbE5vdE9iamVjdC5saW5rKHRoaXMpOworICAgIGNhbGxMaW5rRmFpbE5vdEpT
RnVuY3Rpb24ubGluayh0aGlzKTsKKyAgICBKSVRTdHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2Nh
bGxfTm90SlNGdW5jdGlvbikuY2FsbCgpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJs
b2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORDogIUVOQUJM
RSAvIEVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKKyNlbmRpZiAvLyAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQorCisjZW5kaWYg
Ly8gVVNFKEpTVkFMVUUzMl82NCkKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZiAvLyBF
TkFCTEUoSklUKQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAJKHJldmlzaW9u
IDU5OTM5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI0LDkgKzI0LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkpJVC5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQor
I2luY2x1ZGUgIkpJVC5oIgogCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCiAjaW5jbHVkZSAiSklU
SW5saW5lTWV0aG9kcy5oIgpAQCAtNDUsOCArNDYsNiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwog
CiBuYW1lc3BhY2UgSlNDIHsKIAotI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZvaWQgSklUOjpj
b21waWxlT3BDYWxsSW5pdGlhbGl6ZUNhbGxGcmFtZSgpCiB7CiAgICAgLy8gcmVnVDAgaG9sZHMg
Y2FsbGVlLCByZWdUMSBob2xkcyBhcmdDb3VudApAQCAtNDIyLDI4MyArNDIxLDcgQEAgdm9pZCBK
SVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdAogCiAjZW5kaWYgLy8gIUVOQUJMRShK
SVRfT1BUSU1JWkVfQ0FMTCkKIAotI2Vsc2UgLy8gVVNFKEpTVkFMVUUzMl82NCkKLQotdm9pZCBK
SVQ6OmNvbXBpbGVPcENhbGxJbml0aWFsaXplQ2FsbEZyYW1lKCkKLXsKLSAgICBzdG9yZTMyKHJl
Z1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291
bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0KLSAgICBsb2FkUHRy
KEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4p
ICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7IC8vIG5ld1Nj
b3BlQ2hhaW4KLQotICAgIHN0b3JlUHRyKHJlZ1QwLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVy
LCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVy
KSkpKTsKLSAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVn
aXN0ZXJGaWxlOjpTY29wZUNoYWluICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIp
KSkpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNldHVwQXJncyhJbnN0cnVjdGlvbiog
aW5zdHJ1Y3Rpb24pCi17Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVy
YW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsK
LQotICAgIC8vIGVjeCBob2xkcyBmdW5jCi0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDAsIDAp
OwotICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQoYXJnQ291bnQsIDIpOwotICAgIGVtaXRQ
dXRKSVRTdHViQXJnQ29uc3RhbnQocmVnaXN0ZXJPZmZzZXQsIDEpOwotfQotICAgICAgICAgIAot
dm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxWYXJhcmdzU2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0
cnVjdGlvbikKLXsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9w
ZXJhbmQ7Ci0gICAgCi0gICAgLy8gZWN4IGhvbGRzIGZ1bmMKLSAgICBlbWl0UHV0SklUU3R1YkFy
ZyhyZWdUMCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIDIpOwotICAgIGFkZFB0
cihJbW0zMihyZWdpc3Rlck9mZnNldCksIHJlZ1QxLCByZWdUMik7Ci0gICAgZW1pdFB1dEpJVFN0
dWJBcmcocmVnVDIsIDEpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ29uc3RydWN0U2V0dXBB
cmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQgYXJnQ291bnQgPSBpbnN0
cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rp
b25bM10udS5vcGVyYW5kOwotICAgIGludCBwcm90byA9IGluc3RydWN0aW9uWzRdLnUub3BlcmFu
ZDsKLSAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOwotCi0g
ICAgLy8gZWN4IGhvbGRzIGZ1bmMKLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdUMCwgMCk7Ci0g
ICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9mZnNldCwgMSk7Ci0gICAgZW1p
dFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Ci0gICAgZW1pdFB1dEpJVFN0dWJB
cmdGcm9tVmlydHVhbFJlZ2lzdGVyKHByb3RvLCAzLCByZWdUMik7Ci0gICAgZW1pdFB1dEpJVFN0
dWJBcmdDb25zdGFudCh0aGlzUmVnaXN0ZXIsIDQpOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9j
YWxsX3B1dF9yZXN1bHQoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQotewotICAgIGludCBkc3Qg
PSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgZW1pdFB1dFZpcnR1YWxSZWdpc3Rlcihk
c3QpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGlu
c3RydWN0aW9uKQotewotICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7
Ci0gICAgaW50IGFyZ0NvdW50UmVnaXN0ZXIgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0K
LSAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGFyZ0NvdW50UmVnaXN0ZXIsIHJlZ1QxKTsKLSAg
ICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwotICAgIGNvbXBpbGVPcENh
bGxWYXJhcmdzU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIENoZWNrIGZvciBKU0Z1
bmN0aW9ucy4KLSAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwocmVnVDApOwotICAgIGFk
ZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2ds
b2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gU3BlY3VsYXRpdmVseSByb2xs
IHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5Lgot
ICAgIG11bDMyKEltbTMyKHNpemVvZihSZWdpc3RlcikpLCByZWdUMiwgcmVnVDIpOwotICAgIGlu
dHB0cl90IG9mZnNldCA9IChpbnRwdHJfdClzaXplb2YoUmVnaXN0ZXIpICogKGludHB0cl90KVJl
Z2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWU7Ci0gICAgYWRkUHRyKEltbTMyKChpbnQzMl90KW9mZnNl
dCksIHJlZ1QyLCByZWdUMyk7Ci0gICAgYWRkUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCByZWdUMyk7
Ci0gICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIHJlZ1QzKTsKLSAgICBhZGRQdHIocmVn
VDIsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLSAgICBlbWl0TmFrZWRDYWxsKG1fZ2xvYmFsRGF0YS0+
aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2Rl
QmxvY2spOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTbG93Q2FzZShJbnN0
cnVjdGlvbiosIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCi17Ci0gICAg
bGlua1Nsb3dDYXNlKGl0ZXIpOwotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKLSAgICBKSVRTdHVi
Q2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKTsKLSAgICBzdHVi
Q2FsbC5jYWxsKCk7Ci0gICAgCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0K
LSAgICAKLSNpZiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQotCi0vKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46ICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChP
cGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCkKLXsK
LSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICAvLyBIYW5kbGUgZXZhbAotICAgIEp1
bXAgd2FzRXZhbDsKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKSB7Ci0gICAgICAg
IEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwpOwotICAgICAgICBz
dHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUsIHJlZ1QwKTsKLSAgICAgICAgc3R1YkNhbGwuYWRk
QXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwotICAgICAgICBzdHViQ2FsbC5h
ZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAgICAgIHN0dWJDYWxsLmNhbGwo
KTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5jaFB0cihOb3RFcXVhbCwgcmVnVDAsIEltbVB0cihK
U1ZhbHVlOjplbmNvZGUoSlNWYWx1ZSgpKSkpOwotICAgIH0KLQotICAgIGVtaXRHZXRWaXJ0dWFs
UmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7Ci0gICAgLy8gVGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4g
c2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCi0gICAgaWYgKG9wY29kZUlE
ID09IG9wX2NhbGwpCi0gICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24p
OwotICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKLSAgICAgICAgY29tcGls
ZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIENoZWNrIGZvciBK
U0Z1bmN0aW9ucy4KLSAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwocmVnVDApOwotICAg
IGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0ciht
X2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBj
YXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY29uc3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9v
cF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZp
bGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRHZXRWaXJ0
dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7Ci0gICAgfQotCi0gICAgLy8gU3BlY3VsYXRpdmVs
eSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFy
aXR5LgotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJl
Z2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBhZGRQdHIoSW1tMzIocmVn
aXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZy
YW1lUmVnaXN0ZXIpOwotICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7Ci0KLSAgICBl
bWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0
U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdCgpIDogbV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlW
aXJ0dWFsQ2FsbCgpKTsKLQotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpCi0gICAg
ICAgIHdhc0V2YWwubGluayh0aGlzKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9j
ayk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGlu
c3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyLCB1bnNpZ25l
ZCwgT3Bjb2RlSUQgb3Bjb2RlSUQpCi17Ci0gICAgbGlua1Nsb3dDYXNlKGl0ZXIpOwotICAgIGxp
bmtTbG93Q2FzZShpdGVyKTsKLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBvcGNvZGVJ
RCA9PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3RydWN0IDogY3Rp
X29wX2NhbGxfTm90SlNGdW5jdGlvbik7Ci0gICAgc3R1YkNhbGwuY2FsbCgpOwotCi0gICAgc2Ft
cGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotI2Vsc2UgLy8gIUVOQUJMRShKSVRfT1BU
SU1JWkVfQ0FMTCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiBF
TkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LwotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rp
b24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlua0luZm9JbmRleCkKLXsKLSAgICBpbnQg
Y2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdDb3VudCA9IGlu
c3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVj
dGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICAvLyBIYW5kbGUgZXZhbAotICAgIEp1bXAgd2FzRXZh
bDsKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKSB7Ci0gICAgICAgIEpJVFN0dWJD
YWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwpOwotICAgICAgICBzdHViQ2FsbC5h
ZGRBcmd1bWVudChjYWxsZWUsIHJlZ1QwKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQo
SklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVu
dChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAgICAgIHN0dWJDYWxsLmNhbGwoKTsKLSAgICAg
ICAgd2FzRXZhbCA9IGJyYW5jaFB0cihOb3RFcXVhbCwgcmVnVDAsIEltbVB0cihKU1ZhbHVlOjpl
bmNvZGUoSlNWYWx1ZSgpKSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgcGxhbnRzIGEgY2hlY2sg
Zm9yIGEgY2FjaGVkIEpTRnVuY3Rpb24gdmFsdWUsIHNvIHdlIGNhbiBwbGFudCBhIGZhc3QgbGlu
ayB0byB0aGUgY2FsbGVlLgotICAgIC8vIFRoaXMgZGVsaWJlcmF0ZWx5IGxlYXZlcyB0aGUgY2Fs
bGVlIGluIGVjeCwgdXNlZCB3aGVuIHNldHRpbmcgdXAgdGhlIHN0YWNrIGZyYW1lIGJlbG93Ci0g
ICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxsZWUsIHJlZ1QwKTsKLSAgICBEYXRhTGFiZWxQ
dHIgYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKLQotICAgIEJFR0lOX1VOSU5URVJSVVBU
RURfU0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOwotCi0gICAgSnVtcCBqdW1wVG9TbG93ID0gYnJh
bmNoUHRyV2l0aFBhdGNoKE5vdEVxdWFsLCByZWdUMCwgYWRkcmVzc09mTGlua2VkRnVuY3Rpb25D
aGVjaywgSW1tUHRyKEpTVmFsdWU6OmVuY29kZShKU1ZhbHVlKCkpKSk7Ci0KLSAgICBFTkRfVU5J
TlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7Ci0KLSAgICBhZGRTbG93Q2FzZShq
dW1wVG9TbG93KTsKLSAgICBBU1NFUlRfSklUX09GRlNFVChkaWZmZXJlbmNlQmV0d2VlbihhZGRy
ZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrLCBqdW1wVG9TbG93KSwgcGF0Y2hPZmZzZXRPcENhbGxD
b21wYXJlVG9KdW1wKTsKLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2Nh
bGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoQmVnaW4gPSBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNo
ZWNrOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgZmFzdCBjYXNlLCBvbmx5IHVzZWQg
d2hhbiBhIGNhbGxlZSBjYW4gYmUgbGlua2VkLgotCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgT3BD
b25zdHJ1Y3QsIGNhbGwgb3V0IHRvIGEgY3RpXyBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIG5ldyBv
YmplY3QuCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgewotICAgICAgICBpbnQg
cHJvdG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7Ci0gICAgICAgIGludCB0aGlzUmVnaXN0
ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7Ci0KLSAgICAgICAgZW1pdFB1dEpJVFN0dWJB
cmcocmVnVDAsIDApOwotICAgICAgICBlbWl0UHV0SklUU3R1YkFyZ0Zyb21WaXJ0dWFsUmVnaXN0
ZXIocHJvdG8sIDMsIHJlZ1QyKTsKLSAgICAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywg
Y3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCk7Ci0gICAgICAgIHN0dWJDYWxsLmNhbGwodGhp
c1JlZ2lzdGVyKTsKLSAgICAgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxsZWUsIHJlZ1Qw
KTsKLSAgICB9Ci0KLSAgICAvLyBGYXN0IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUgaW5pdGlhbGl6
YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZlIHRvIGVkaS4KLSAgICAvLyBOb3RlIHRoYXQgdGhpcyBv
bWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJGaWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlzIHNldCBpbiB0
aGUgY2FsbGVlCi0KLSAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihK
U0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1f
bm9kZSkpLCByZWdUMSk7IC8vIG5ld1Njb3BlQ2hhaW4KLQotICAgIHN0b3JlMzIoSW1tMzIoYXJn
Q291bnQpLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdp
c3RlckZpbGU6OkFyZ3VtZW50Q291bnQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0
ZXIpKSkpOwotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFt
ZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lKSAq
IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBzdG9yZVB0cihyZWdU
MCwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJG
aWxlOjpDYWxsZWUpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAg
IHN0b3JlUHRyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZz
ZXQgKyBSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yo
UmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHNpemVvZihS
ZWdpc3RlcikpLCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0KLSAgICAvLyBDYWxsIHRvIHRoZSBjYWxs
ZWUKLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0lu
ZGV4XS5ob3RQYXRoT3RoZXIgPSBlbWl0TmFrZWRDYWxsKCk7Ci0gICAgCi0gICAgaWYgKG9wY29k
ZUlEID09IG9wX2NhbGxfZXZhbCkKLSAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMpOwotCi0gICAg
c2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotdm9pZCBKSVQ6OmNvbXBpbGVPcENh
bGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5
Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4LCBPcGNvZGVJRCBv
cGNvZGVJRCkKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwot
ICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVn
aXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBsaW5rU2xvd0Nh
c2UoaXRlcik7Ci0KLSAgICAvLyBUaGUgYXJndW1lbnRzIGhhdmUgYmVlbiBzZXQgdXAgb24gdGhl
IGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2YWwKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkK
LSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7Ci0gICAgZWxzZSBp
ZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RT
ZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgLy8gRmFzdCBjaGVjayBmb3IgSlMgZnVuY3Rp
b24uCi0gICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RPYmplY3QgPSBlbWl0SnVtcElmTm90SlNDZWxs
KHJlZ1QwKTsKLSAgICBKdW1wIGNhbGxMaW5rRmFpbE5vdEpTRnVuY3Rpb24gPSBicmFuY2hQdHIo
Tm90RXF1YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9u
VlB0cikpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxv
Y2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7
Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3Qp
LmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUg
LSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdU
MCk7Ci0gICAgfQotCi0gICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFz
c3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgotICAgIHN0b3JlUHRyKGNhbGxG
cmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpD
YWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJl
Z2lzdGVyKSkpKTsKLSAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2Fz
dDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1lUmVnaXN0ZXIpOwotICAgIG1vdmUo
SW1tMzIoYXJnQ291bnQpLCByZWdUMSk7Ci0KLSAgICBtb3ZlKHJlZ1QwLCByZWdUMik7Ci0KLSAg
ICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5j
YWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVj
dCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdExpbmsoKSA6IG1f
Z2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGxMaW5rKCkpOwotCi0gICAgLy8gSWYg
bm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4gdGhlIGlmIGJlbG93IQotICAgIEFTU0VSVChP
UENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09ERV9MRU5HVEgob3BfY2FsbF9ldmFsKSk7Ci0K
LSAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRvIHRoZSBob3QgcGF0aC4KLSAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCks
IE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7Ci0gICAgZWxzZQotICAgICAgICBlbWl0SnVt
cFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY2FsbCkpOwotCi0gICAgLy8gVGhp
cyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCi0gICAgY2FsbExpbmtGYWlsTm90T2JqZWN0Lmxpbmso
dGhpcyk7Ci0gICAgY2FsbExpbmtGYWlsTm90SlNGdW5jdGlvbi5saW5rKHRoaXMpOwotICAgIEpJ
VFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1
Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKS5jYWxsKCk7Ci0K
LSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi0vKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxFIC8gRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxM
KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2VuZGlmIC8vICFFTkFCTEUo
SklUX09QVElNSVpFX0NBTEwpCi0KLSNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0KQotCiB9IC8v
IG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCiAjZW5kaWYgLy8g
RU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRDYWxsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbC5jcHAJKHJldmlzaW9uIDU5OTQ5KQor
KysgSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw5
ICsyNCwxMCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJKSVQuaCIK
IAogI2lmIEVOQUJMRShKSVQpCisjaWYgIVVTRShKU1ZBTFVFMzJfNjQpCisjaW5jbHVkZSAiSklU
LmgiCiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJKSVRJbmxpbmVNZXRob2Rz
LmgiCkBAIC00NSwzODUgKzQ2LDYgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNl
IEpTQyB7CiAKLSNpZiBVU0UoSlNWQUxVRTMyXzY0KQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2Fs
bEluaXRpYWxpemVDYWxsRnJhbWUoKQotewotICAgIC8vIHJlZ1QwIGhvbGRzIGNhbGxlZSwgcmVn
VDEgaG9sZHMgYXJnQ291bnQKLSAgICBzdG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJl
Z2lzdGVyLCBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNp
emVvZihSZWdpc3RlcikpKSk7Ci0KLSAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9P
RkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3Bl
Q2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7IC8vIHNjb3BlQ2hhaW4KLQotICAgIHN0b3JlUHRyKHJl
Z1QwLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8gY2FsbGVlCi0gICAgc3RvcmVQ
dHIocmVnVDEsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6U2NvcGVD
aGFpbiAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8gc2NvcGVDaGFp
bgotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5z
dHJ1Y3Rpb24pCi17Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5k
OwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKLQot
ICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QxLCByZWdUMCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0
dWJBcmdDb25zdGFudChyZWdpc3Rlck9mZnNldCwgMSk7Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmdD
b25zdGFudChhcmdDb3VudCwgMik7Ci19Ci0gICAgICAgICAgCi12b2lkIEpJVDo6Y29tcGlsZU9w
Q29uc3RydWN0U2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQg
YXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJlZ2lzdGVyT2Zm
c2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotICAgIGludCBwcm90byA9IGluc3RydWN0
aW9uWzRdLnUub3BlcmFuZDsKLSAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0u
dS5vcGVyYW5kOwotCi0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsKLSAg
ICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsKLSAgICBlbWl0
UHV0SklUU3R1YkFyZ0NvbnN0YW50KGFyZ0NvdW50LCAyKTsKLSAgICBlbWl0UHV0SklUU3R1YkFy
Z0Zyb21WaXJ0dWFsUmVnaXN0ZXIocHJvdG8sIDMsIHJlZ1QyLCByZWdUMyk7Ci0gICAgZW1pdFB1
dEpJVFN0dWJBcmdDb25zdGFudCh0aGlzUmVnaXN0ZXIsIDQpOwotfQotCi12b2lkIEpJVDo6Y29t
cGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qKQotewotICAgIGVtaXRQdXRK
SVRTdHViQXJnKHJlZ1QxLCByZWdUMCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDMs
IDEpOyAvLyByZWdpc3Rlck9mZnNldAotICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QyLCAyKTsg
Ly8gYXJnQ291bnQKLX0KLQotdm9pZCBKSVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVzdWx0KEluc3Ry
dWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rpb25bMV0udS5v
cGVyYW5kOwotICAgIGVtaXRTdG9yZShkc3QsIHJlZ1QxLCByZWdUMCk7Ci19Ci0KLXZvaWQgSklU
Ojpjb21waWxlT3BDYWxsVmFyYXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCi17Ci0gICAg
aW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICBpbnQgYXJnQ291bnRS
ZWdpc3RlciA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZz
ZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBlbWl0TG9hZChjYWxsZWUsIHJl
Z1QxLCByZWdUMCk7Ci0gICAgZW1pdExvYWRQYXlsb2FkKGFyZ0NvdW50UmVnaXN0ZXIsIHJlZ1Qy
KTsgLy8gYXJnQ291bnQKLSAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQpLCByZWdUMiwg
cmVnVDMpOyAvLyByZWdpc3Rlck9mZnNldAotCi0gICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1
cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNh
bGxlZSwgcmVnVDEpOwotICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVz
cyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAg
Ly8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdp
bGwgbWF0Y2ggdGhlIGFyaXR5LgotICAgIG11bDMyKEltbTMyKHNpemVvZihSZWdpc3RlcikpLCBy
ZWdUMywgcmVnVDMpOwotICAgIGFkZFB0cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOwotICAg
IHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKHJlZ1QzLCBSZWdpc3RlckZpbGU6
OkNhbGxlckZyYW1lICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAg
IG1vdmUocmVnVDMsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAgIG1vdmUocmVnVDIsIHJlZ1Qx
KTsgLy8gYXJnQ291bnQKLQotICAgIGVtaXROYWtlZENhbGwobV9nbG9iYWxEYXRhLT5qaXRTdHVi
cy5jdGlWaXJ0dWFsQ2FsbCgpKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7
Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJnc1Nsb3dDYXNlKEluc3RydWN0aW9u
KiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsK
LSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotCi0gICAgbGlua1Ns
b3dDYXNlSWZOb3RKU0NlbGwoaXRlciwgY2FsbGVlKTsKLSAgICBsaW5rU2xvd0Nhc2UoaXRlcik7
Ci0KLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0
aW9uKTsKLSAgICBzdHViQ2FsbC5jYWxsKCk7Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2Rl
QmxvY2spOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9yZXQoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJ
bnN0cnVjdGlvbikKLXsKLSAgICB1bnNpZ25lZCBkc3QgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kOwotCi0gICAgLy8gV2UgY291bGQgSklUIGdlbmVyYXRlIHRoZSBkZXJlZiwgb25s
eSBjYWxsaW5nIG91dCB0byBDIHdoZW4gdGhlIHJlZmNvdW50IGhpdHMgemVyby4KLSAgICBpZiAo
bV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKSkKLSAgICAgICAgSklUU3R1YkNhbGwo
dGhpcywgY3RpX29wX3JldF9zY29wZUNoYWluKS5jYWxsKCk7Ci0KLSAgICBlbWl0TG9hZChkc3Qs
IHJlZ1QxLCByZWdUMCk7Ci0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0
ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOwotICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVy
UHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAg
IHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJuKHJlZ1QyKTsKLSAgICByZXQoKTsKLX0K
LQotdm9pZCBKSVQ6OmVtaXRfb3BfcmV0X29iamVjdF9vcl90aGlzKEluc3RydWN0aW9uKiBjdXJy
ZW50SW5zdHJ1Y3Rpb24pCi17Ci0gICAgdW5zaWduZWQgcmVzdWx0ID0gY3VycmVudEluc3RydWN0
aW9uWzFdLnUub3BlcmFuZDsKLSAgICB1bnNpZ25lZCB0aGlzUmVnID0gY3VycmVudEluc3RydWN0
aW9uWzJdLnUub3BlcmFuZDsKLQotICAgIC8vIFdlIGNvdWxkIEpJVCBnZW5lcmF0ZSB0aGUgZGVy
ZWYsIG9ubHkgY2FsbGluZyBvdXQgdG8gQyB3aGVuIHRoZSByZWZjb3VudCBoaXRzIHplcm8uCi0g
ICAgaWYgKG1fY29kZUJsb2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCkpCi0gICAgICAgIEpJVFN0
dWJDYWxsKHRoaXMsIGN0aV9vcF9yZXRfc2NvcGVDaGFpbikuY2FsbCgpOwotCi0gICAgZW1pdExv
YWQocmVzdWx0LCByZWdUMSwgcmVnVDApOwotICAgIEp1bXAgbm90SlNDZWxsID0gYnJhbmNoMzIo
Tm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpDZWxsVGFnKSk7Ci0gICAgbG9hZFB0cihB
ZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNDZWxsLCBtX3N0cnVjdHVyZSkpLCByZWdU
Mik7Ci0gICAgSnVtcCBub3RPYmplY3QgPSBicmFuY2g4KE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1Qy
LCBPQkpFQ1RfT0ZGU0VUT0YoU3RydWN0dXJlLCBtX3R5cGVJbmZvKSArIE9CSkVDVF9PRkZTRVRP
RihUeXBlSW5mbywgbV90eXBlKSksIEltbTMyKE9iamVjdFR5cGUpKTsKLQotICAgIGVtaXRHZXRG
cm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6UmV0dXJuUEMsIHJlZ1QyKTsKLSAg
ICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhlYWRlclB0cihSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1l
LCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0KLSAgICByZXN0b3JlUmV0dXJuQWRkcmVzc0JlZm9yZVJl
dHVybihyZWdUMik7Ci0gICAgcmV0KCk7Ci0KLSAgICBub3RKU0NlbGwubGluayh0aGlzKTsKLSAg
ICBub3RPYmplY3QubGluayh0aGlzKTsKLSAgICBlbWl0TG9hZCh0aGlzUmVnLCByZWdUMSwgcmVn
VDApOwotCi0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpS
ZXR1cm5QQywgcmVnVDIpOwotICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lz
dGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAgIHJlc3RvcmVS
ZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJuKHJlZ1QyKTsKLSAgICByZXQoKTsKLX0KLQotdm9pZCBK
SVQ6OmVtaXRTbG93X29wX2NhbGwoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVj
dG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsKLSAgICBjb21waWxlT3BDYWxs
U2xvd0Nhc2UoY3VycmVudEluc3RydWN0aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0luZGV4Kyss
IG9wX2NhbGwpOwotfQotCi12b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbF9ldmFsKEluc3RydWN0
aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3Im
IGl0ZXIpCi17Ci0gICAgY29tcGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwg
aXRlciwgbV9jYWxsTGlua0luZm9JbmRleCsrLCBvcF9jYWxsX2V2YWwpOwotfQotCi12b2lkIEpJ
VDo6ZW1pdFNsb3dfb3BfY2FsbF92YXJhcmdzKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rp
b24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCi17Ci0gICAgY29tcGls
ZU9wQ2FsbFZhcmFyZ3NTbG93Q2FzZShjdXJyZW50SW5zdHJ1Y3Rpb24sIGl0ZXIpOwotfQotCi12
b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY29uc3RydWN0KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1
Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCi17Ci0gICAgY29t
cGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0lu
Zm9JbmRleCsrLCBvcF9jb25zdHJ1Y3QpOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9jYWxsKElu
c3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCi17Ci0gICAgY29tcGlsZU9wQ2FsbChvcF9j
YWxsLCBjdXJyZW50SW5zdHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Ci19Ci0KLXZv
aWQgSklUOjplbWl0X29wX2NhbGxfZXZhbChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9u
KQotewotICAgIGNvbXBpbGVPcENhbGwob3BfY2FsbF9ldmFsLCBjdXJyZW50SW5zdHJ1Y3Rpb24s
IG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2xvYWRfdmFy
YXJncyhJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQotewotICAgIGludCBhcmdDb3Vu
dERzdCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ3NPZmZz
ZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwotCi0gICAgSklUU3R1YkNhbGwg
c3R1YkNhbGwodGhpcywgY3RpX29wX2xvYWRfdmFyYXJncyk7Ci0gICAgc3R1YkNhbGwuYWRkQXJn
dW1lbnQoSW1tMzIoYXJnc09mZnNldCkpOwotICAgIHN0dWJDYWxsLmNhbGwoKTsKLSAgICAvLyBT
dG9yZXMgYSBuYWtlZCBpbnQzMiBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4KLSAgICBzdG9yZTMyKHJl
dHVyblZhbHVlUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIGFyZ0NvdW50RHN0
ICogc2l6ZW9mKFJlZ2lzdGVyKSkpOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9jYWxsX3ZhcmFy
Z3MoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICBjb21waWxlT3BDYWxs
VmFyYXJncyhjdXJyZW50SW5zdHJ1Y3Rpb24pOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9jb25z
dHJ1Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICBjb21waWxlT3BD
YWxsKG9wX2NvbnN0cnVjdCwgY3VycmVudEluc3RydWN0aW9uLCBtX2NhbGxMaW5rSW5mb0luZGV4
KyspOwotfQotCi0jaWYgIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKLQotLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBKSVQ6OmNvbXBpbGVPcENh
bGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgdW5zaWduZWQp
Ci17Ci0gICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICBpbnQg
YXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJlZ2lzdGVyT2Zm
c2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotCi0gICAgSnVtcCB3YXNFdmFsOwotICAg
IGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpIHsKLSAgICAgICAgSklUU3R1YkNhbGwgc3R1
YkNhbGwodGhpcywgY3RpX29wX2NhbGxfZXZhbCk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3Vt
ZW50KGNhbGxlZSk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVn
aXN0ZXJPZmZzZXQpKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihh
cmdDb3VudCkpOwotICAgICAgICBzdHViQ2FsbC5jYWxsKCk7Ci0gICAgICAgIHdhc0V2YWwgPSBi
cmFuY2gzMihOb3RFcXVhbCwgcmVnVDEsIEltbTMyKEpTVmFsdWU6OkVtcHR5VmFsdWVUYWcpKTsK
LSAgICB9Ci0KLSAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0KLSAgICBpZiAo
b3Bjb2RlSUQgPT0gb3BfY2FsbCkKLSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0
cnVjdGlvbik7Ci0gICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAg
ICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgZW1pdEp1
bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNhbGxlZSwgcmVnVDEpOwotICAgIGFkZFNsb3dDYXNlKGJy
YW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpz
RnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3Ry
dWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29u
c3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlND
b25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhl
YWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJl
Z1QwKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwg
YXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCi0gICAgc3RvcmVQdHIoY2Fs
bEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdpc3RlckZpbGU6
OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yo
UmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHN0YXRpY19j
YXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0gICAgbW92
ZShJbW0zMihhcmdDb3VudCksIHJlZ1QxKTsKLQotICAgIGVtaXROYWtlZENhbGwob3Bjb2RlSUQg
PT0gb3BfY29uc3RydWN0ID8gbV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ29uc3Ry
dWN0KCkgOiBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOwotCi0gICAg
aWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKLSAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMp
OwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotdm9pZCBKSVQ6OmNv
bXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93
Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkLCBPcGNvZGVJRCBvcGNvZGVJRCkK
LXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotCi0gICAgbGlu
a1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRlciwgY2FsbGVlKTsKLSAgICBsaW5rU2xvd0Nhc2UoaXRl
cik7Ci0KLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBvcF9jb25z
dHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2NhbGxfTm90
SlNGdW5jdGlvbik7Ci0gICAgc3R1YkNhbGwuY2FsbCgpOwotCi0gICAgc2FtcGxlQ29kZUJsb2Nr
KG1fY29kZUJsb2NrKTsKLX0KLQotI2Vsc2UgLy8gIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkK
LQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiBFTkFCTEUoSklUX09Q
VElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIEpJ
VDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0
aW9uLCB1bnNpZ25lZCBjYWxsTGlua0luZm9JbmRleCkKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5z
dHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJd
LnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9w
ZXJhbmQ7Ci0KLSAgICBKdW1wIHdhc0V2YWw7Ci0gICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxf
ZXZhbCkgewotICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9l
dmFsKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlKTsKLSAgICAgICAgc3R1
YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwotICAgICAgICBz
dHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAgICAgIHN0dWJD
YWxsLmNhbGwoKTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwg
SW1tMzIoSlNWYWx1ZTo6RW1wdHlWYWx1ZVRhZykpOwotICAgIH0KLQotICAgIGVtaXRMb2FkKGNh
bGxlZSwgcmVnVDEsIHJlZ1QwKTsKLQotICAgIERhdGFMYWJlbFB0ciBhZGRyZXNzT2ZMaW5rZWRG
dW5jdGlvbkNoZWNrOwotCi0gICAgQkVHSU5fVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5j
ZU9wQ2FsbCk7Ci0KLSAgICBKdW1wIGp1bXBUb1Nsb3cgPSBicmFuY2hQdHJXaXRoUGF0Y2goTm90
RXF1YWwsIHJlZ1QwLCBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrLCBJbW1QdHIoMCkpOwot
Ci0gICAgRU5EX1VOSU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOwotCi0gICAg
YWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7Ci0gICAgQVNTRVJUKGRpZmZlcmVuY2VCZXR3ZWVuKGFk
ZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIGp1bXBUb1Nsb3cpID09IHBhdGNoT2Zmc2V0T3BD
YWxsQ29tcGFyZVRvSnVtcCk7Ci0gICAgbV9jYWxsU3RydWN0dXJlU3R1YkNvbXBpbGF0aW9uSW5m
b1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aEJlZ2luID0gYWRkcmVzc09mTGlua2VkRnVuY3Rp
b25DaGVjazsKLQotICAgIGFkZFNsb3dDYXNlKGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1t
MzIoSlNWYWx1ZTo6Q2VsbFRhZykpKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGZh
c3QgY2FzZSwgb25seSB1c2VkIHdoYW4gYSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4KLQotICAgIC8v
IEluIHRoZSBjYXNlIG9mIE9wQ29uc3RydWN0LCBjYWxsIG91dCB0byBhIGN0aV8gZnVuY3Rpb24g
dG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0LgotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1
Y3QpIHsKLSAgICAgICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVyYW5kOwotICAg
ICAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOwotCi0gICAg
ICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1
Y3QpOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChyZWdUMSwgcmVnVDApOwotICAgICAg
ICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMigwKSk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB1
bnVzZWQgSklUU3R1YiBhcmd1bWVudC4KLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1t
MzIoMCkpOyAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgdW51c2VkIEpJVFN0dWIgYXJndW1lbnQuCi0g
ICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KHByb3RvKTsKLSAgICAgICAgc3R1YkNhbGwuY2Fs
bCh0aGlzUmVnaXN0ZXIpOwotCi0gICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1Qw
KTsKLSAgICB9Ci0KLSAgICAvLyBGYXN0IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUgaW5pdGlhbGl6
YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZlIHRvIGVkaS4KLSAgICAvLyBOb3RlIHRoYXQgdGhpcyBv
bWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJGaWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlzIHNldCBpbiB0
aGUgY2FsbGVlCi0gICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNG
dW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9CSkVDVF9PRkZTRVRPRihTY29wZUNoYWluLCBtX25v
ZGUpKSwgcmVnVDIpOwotCi0gICAgc3RvcmUzMihJbW0zMihhcmdDb3VudCksIEFkZHJlc3MoY2Fs
bEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6QXJndW1lbnRD
b3VudCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0gICAgc3RvcmVQ
dHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rl
ck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUpICogc3RhdGljX2Nhc3Q8aW50Pihz
aXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGVtaXRTdG9yZShyZWdpc3Rlck9mZnNldCArIFJlZ2lz
dGVyRmlsZTo6Q2FsbGVlLCByZWdUMSwgcmVnVDApOwotICAgIHN0b3JlUHRyKHJlZ1QyLCBBZGRy
ZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OlNj
b3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGFk
ZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHNpemVvZihSZWdpc3RlcikpLCBjYWxsRnJhbWVS
ZWdpc3Rlcik7Ci0KLSAgICAvLyBDYWxsIHRvIHRoZSBjYWxsZWUKLSAgICBtX2NhbGxTdHJ1Y3R1
cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoT3RoZXIgPSBl
bWl0TmFrZWRDYWxsKCk7Ci0gICAgCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkK
LSAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMpOwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29k
ZUJsb2NrKTsKLX0KLQotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlv
biogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVu
c2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4LCBPcGNvZGVJRCBvcGNvZGVJRCkKLXsKLSAgICBpbnQg
Y2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdDb3VudCA9IGlu
c3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVj
dGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBsaW5rU2xvd0Nhc2UoaXRlcik7Ci0gICAgbGlua1Ns
b3dDYXNlKGl0ZXIpOwotCi0gICAgLy8gVGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9u
IHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2Nh
bGwpCi0gICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotICAgIGVs
c2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKLSAgICAgICAgY29tcGlsZU9wQ29uc3Ry
dWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIEZhc3QgY2hlY2sgZm9yIEpTIGZ1
bmN0aW9uLgotICAgIEp1bXAgY2FsbExpbmtGYWlsTm90T2JqZWN0ID0gYnJhbmNoMzIoTm90RXF1
YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpDZWxsVGFnKSk7Ci0gICAgSnVtcCBjYWxsTGlua0Zh
aWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1t
UHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKTsKLQotICAgIC8vIEZpcnN0LCBpbiB0
aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUgdGhlIG5ldyBvYmplY3QuCi0gICAgaWYg
KG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgewotICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBj
dGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0
ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJnQ291bnQpOwotICAgICAgICBlbWl0TG9h
ZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0gICAgfQotCi0gICAgLy8gU3BlY3VsYXRpdmVseSBy
b2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5
LgotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lz
dGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRp
Y19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBhZGRQdHIoSW1tMzIocmVnaXN0
ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1l
UmVnaXN0ZXIpOwotICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7Ci0KLSAgICBtX2Nh
bGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5jYWxsUmV0
dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1f
Z2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdExpbmsoKSA6IG1fZ2xvYmFs
RGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGxMaW5rKCkpOwotCi0gICAgLy8gSWYgbm90LCB3
ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4gdGhlIGlmIGJlbG93IQotICAgIEFTU0VSVChPUENPREVf
TEVOR1RIKG9wX2NhbGwpID09IE9QQ09ERV9MRU5HVEgob3BfY2FsbF9ldmFsKSk7Ci0KLSAgICAv
LyBEb25lISAtIHJldHVybiBiYWNrIHRvIHRoZSBob3QgcGF0aC4KLSAgICBpZiAob3Bjb2RlSUQg
PT0gb3BfY29uc3RydWN0KQotICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09E
RV9MRU5HVEgob3BfY29uc3RydWN0KSk7Ci0gICAgZWxzZQotICAgICAgICBlbWl0SnVtcFNsb3dU
b0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY2FsbCkpOwotCi0gICAgLy8gVGhpcyBoYW5k
bGVzIGhvc3QgZnVuY3Rpb25zCi0gICAgY2FsbExpbmtGYWlsTm90T2JqZWN0LmxpbmsodGhpcyk7
Ci0gICAgY2FsbExpbmtGYWlsTm90SlNGdW5jdGlvbi5saW5rKHRoaXMpOwotICAgIEpJVFN0dWJD
YWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90
SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKS5jYWxsKCk7Ci0KLSAgICBz
YW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxFIC8gRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2VuZGlmIC8vICFFTkFCTEUoSklUX09Q
VElNSVpFX0NBTEwpCi0KLSNlbHNlIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZvaWQgSklUOjpj
b21waWxlT3BDYWxsSW5pdGlhbGl6ZUNhbGxGcmFtZSgpCiB7CiAgICAgc3RvcmUzMihyZWdUMSwg
QWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50ICog
c3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwpAQCAtNjk3LDggKzMxOSw3IEBA
IHZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1Y3QKIAogI2VuZGlmIC8vICFF
TkFCTEUoSklUX09QVElNSVpFX0NBTEwpCiAKLSNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0KQot
CiB9IC8vIG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vICFVU0UoSlNWQUxVRTMyXzY0KQogI2Vu
ZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2RlczMy
XzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2RlczMyXzY0
LmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2RlczMy
XzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsOSArMjUsMTAgQEAKICAqLwogCiAjaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSklULmgiCiAKLSNpZiBFTkFCTEUoSklUKSAmJiBVU0Uo
SlNWQUxVRTMyXzY0KQorI2lmIEVOQUJMRShKSVQpCisjaWYgVVNFKEpTVkFMVUUzMl82NCkKKyNp
bmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKICNpbmNsdWRl
ICJKSVRTdHViQ2FsbC5oIgpAQCAtMTg2MSw2ICsxODYyLDcgQEAgdm9pZCBKSVQ6OmVtaXRfb3Bf
cHJvZmlsZV9kaWRfY2FsbChJbnN0cgogICAgIG5vUHJvZmlsZXIubGluayh0aGlzKTsKIH0KIAot
fQorfSAvLyBuYW1lc3BhY2UgSlNDCiAKLSNlbmRpZiAvLyBFTkFCTEUoSklUKSAmJiBVU0UoSlNW
QUxVRTMyXzY0KQorI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCisjZW5kaWYgLy8gRU5BQkxF
KEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2Rlcy5jcHAJKHJldmlzaW9uIDU5OTQ5KQor
KysgSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wY29kZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NSw5ICsyNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkpJVC5o
IgotCiAjaWYgRU5BQkxFKEpJVCkKKyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkpJVElu
bGluZU1ldGhvZHMuaCIKICNpbmNsdWRlICJKSVRTdHViQ2FsbC5oIgpJbmRleDogSmF2YVNjcmlw
dENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNwcAkocmV2aXNpb24gNTk5NDkp
CisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MzMl82NC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDEyICsyNSwxMCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKKyNp
ZiBFTkFCTEUoSklUKQogI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KICNpbmNsdWRlICJKSVQuaCIK
IAotI2lmIEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJK
SVRJbmxpbmVNZXRob2RzLmgiCiAjaW5jbHVkZSAiSklUU3R1YkNhbGwuaCIKQEAgLTExODIsNyAr
MTE4MCw1IEBAIHZvaWQgSklUOjplbWl0U2xvd19vcF9nZXRfYnlfcG5hbWUoSW5zdHIKIAogfSAv
LyBuYW1lc3BhY2UgSlNDCiAKKyNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0KQogI2VuZGlmIC8v
IEVOQUJMRShKSVQpCi0KLSNlbmRpZiAvLyBFTkFCTEUoSlNWQUxVRTMyXzY0KQotCkluZGV4OiBK
YXZhU2NyaXB0Q29yZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEph
dmFTY3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2Vzcy5jcHAJKHJldmlzaW9uIDU5OTQ5KQor
KysgSmF2YVNjcmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjUsMTIgKzI1LDEwIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAorI2lmIEVOQUJM
RShKSVQpCiAjaWYgIVVTRShKU1ZBTFVFMzJfNjQpCi0KICNpbmNsdWRlICJKSVQuaCIKIAotI2lm
IEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJHZXR0ZXJT
ZXR0ZXIuaCIKICNpbmNsdWRlICJKSVRJbmxpbmVNZXRob2RzLmgiCkBAIC0xMTEyLDYgKzExMTAs
NSBAQCB2b2lkIEpJVDo6cHJpdmF0ZUNvbXBpbGVHZXRCeUlkQ2hhaW4oU3RyCiAKIH0gLy8gbmFt
ZXNwYWNlIEpTQwogCi0jZW5kaWYgLy8gRU5BQkxFKEpJVCkKLQogI2VuZGlmIC8vICFVU0UoSlNW
QUxVRTMyXzY0KQorI2VuZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9q
aXQvSklUU3R1YnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRTdHVi
cy5jcHAJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVFN0dWJzLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsOSBAQAogICovCiAKICNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJKSVRTdHVicy5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpbmNsdWRl
ICJKSVRTdHVicy5oIgogCiAjaW5jbHVkZSAiQXJndW1lbnRzLmgiCiAjaW5jbHVkZSAiQ2FsbEZy
YW1lLmgiCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56738</attachid>
            <date>2010-05-21 12:40:28 -0700</date>
            <delta_ts>2010-05-21 13:46:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-39507-20100521124026.patch</filename>
            <type>text/plain</type>
            <size>68587</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDUtMjEgIEdlb2ZmcmV5
IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBTcGxpdCBvdXQgSklUQ2FsbDMyXzY0LmNwcCwgYW5kIHRpZ2h0
ZW5lZCB1cCBzb21lICNpZmRlZnMgaW4gdGhlIGhvcGVzCisgICAgICAgIG9mIGltcHJvdmluZyBj
b21waWxlIHRpbWVzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9Mzk1MDcKKworICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6CisgICAgICAgICogaml0L0pJVC5jcHA6CisgICAgICAgICogaml0L0pJVEFyaXRo
bWV0aWMuY3BwOgorICAgICAgICAqIGppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwOgorICAgICAg
ICAqIGppdC9KSVRDYWxsLmNwcDoKKyAgICAgICAgKiBqaXQvSklUQ2FsbDMyXzY0LmNwcDogQ29w
aWVkIGZyb20gaml0L0pJVENhbGwuY3BwLgorICAgICAgICAqIGppdC9KSVRPcGNvZGVzLmNwcDoK
KyAgICAgICAgKiBqaXQvSklUT3Bjb2RlczMyXzY0LmNwcDoKKyAgICAgICAgKiBqaXQvSklUUHJv
cGVydHlBY2Nlc3MuY3BwOgorICAgICAgICAqIGppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNw
cDoKKyAgICAgICAgKiBqaXQvSklUU3R1YnMuY3BwOgorCiAyMDEwLTA1LTIxICBPbGl2ZXIgSHVu
dCAgPG9saXZlckBhcHBsZS5jb20+CiAKICAgICAgICAgV2luZG93cyBidWlsZCBmaXggIzMKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0FuZHJvaWQubWsKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvQW5kcm9pZC5tawkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9BbmRyb2lk
Lm1rCSh3b3JraW5nIGNvcHkpCkBAIC01MSw2ICs1MSw3IEBAIExPQ0FMX1NSQ19GSUxFUyA6PSBc
CiAJaml0L0pJVC5jcHAgXAogCWppdC9KSVRBcml0aG1ldGljLmNwcCBcCiAJaml0L0pJVENhbGwu
Y3BwIFwKKwlqaXQvSklUQ2FsbDMyXzY0LmNwcCBcCiAJaml0L0pJVE9wY29kZXMuY3BwIFwKIAlq
aXQvSklUUHJvcGVydHlBY2Nlc3MuY3BwIFwKIAlqaXQvSklUU3R1YnMuY3BwIFwKSW5kZXg6IEph
dmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiA1OTk0OSkKKysrIEphdmFTY3JpcHRDb3JlL0NNYWtl
TGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC02MSw2ICs2MSw3IEBAIFNFVChKYXZhU2NyaXB0
Q29yZV9TT1VSQ0VTCiAgICAgaml0L0pJVFByb3BlcnR5QWNjZXNzMzJfNjQuY3BwCiAgICAgaml0
L0pJVEFyaXRobWV0aWMuY3BwCiAgICAgaml0L0pJVENhbGwuY3BwCisgICAgaml0L0pJVENhbGwz
Ml82NC5jcHAKICAgICBqaXQvSklULmNwcAogCiAgICAgcGFyc2VyL0xleGVyLmNwcApJbmRleDog
SmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvR05V
bWFrZWZpbGUuYW0JKHdvcmtpbmcgY29weSkKQEAgLTg2LDYgKzg2LDcgQEAgamF2YXNjcmlwdGNv
cmVfc291cmNlcyArPSBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wY29kZXMuY3BwIFwKIAlK
YXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2RlczMyXzY0LmNwcCBcCiAJSmF2YVNjcmlwdENvcmUv
aml0L0pJVENhbGwuY3BwIFwKKwlKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbDMyXzY0LmNwcCBc
CiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVENvZGUuaCBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJ
VFByb3BlcnR5QWNjZXNzLmNwcCBcCiAJSmF2YVNjcmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNj
ZXNzMzJfNjQuY3BwIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cGkK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZ3lwaQkocmV2aXNp
b24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5neXBpCSh3b3JraW5n
IGNvcHkpCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICAgICAgICAgICdqaXQvSklUQXJpdGhtZXRp
Yy5jcHAnLAogICAgICAgICAgICAgJ2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwJywKICAgICAg
ICAgICAgICdqaXQvSklUQ2FsbC5jcHAnLAorICAgICAgICAgICAgJ2ppdC9KSVRDYWxsMzJfNjQu
Y3BwJywKICAgICAgICAgICAgICdqaXQvSklUQ29kZS5oJywKICAgICAgICAgICAgICdqaXQvSklU
SW5saW5lTWV0aG9kcy5oJywKICAgICAgICAgICAgICdqaXQvSklUT3Bjb2Rlcy5jcHAnLApJbmRl
eDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTEwMSw2ICsxMDEs
NyBAQCBTT1VSQ0VTICs9IFwKICAgICBqaXQvSklUQXJpdGhtZXRpYy5jcHAgXAogICAgIGppdC9K
SVRBcml0aG1ldGljMzJfNjQuY3BwIFwKICAgICBqaXQvSklUQ2FsbC5jcHAgXAorICAgIGppdC9K
SVRDYWxsMzJfNjQuY3BwIFwKICAgICBqaXQvSklULmNwcCBcCiAgICAgaml0L0pJVE9wY29kZXMu
Y3BwIFwKICAgICBqaXQvSklUT3Bjb2RlczMyXzY0LmNwcCBcCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNw
cm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oJKHJldmlzaW9uIDU5OTQ5KQorKysg
SmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMTY1Myw2ICsxNjUzLDEwIEBACiAJ
CQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXGpp
dFxKSVRDYWxsMzJfNjQuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cLi5caml0XEpJVENvZGUuaCINCiAJCQkJPg0KIAkJCTwvRmlsZT4N
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpA
QCAtMTExLDYgKzExMSw3IEBACiAJCTE0NDY5REVEMTA3RUM3RTcwMDY1MDQ0NiAvKiBTdHJpbmdQ
cm90b3R5cGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQkMxOEMzQzUwRTE2RUUzMzAwQjM0NDYwIC8qIFN0cmluZ1Byb3RvdHlwZS5jcHAgKi87IH07
CiAJCTE0NDY5REVFMTA3RUM3RTcwMDY1MDQ0NiAvKiBVU3RyaW5nLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY2OTJBODg1MDI1NTU5N0QwMUZGNjBG
NyAvKiBVU3RyaW5nLmNwcCAqLzsgfTsKIAkJMTQ2QUFCMzgwQjY2QTk0NDAwRTU1RjE2IC8qIEpT
U3RyaW5nUmVmQ0YuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMTQ2QUFCMzcwQjY2QTk0NDAwRTU1RjE2IC8qIEpTU3RyaW5nUmVmQ0YuY3BwICovOyB9
OworCQkxNDZGRTUxMjExQTcxMDQzMDA4N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0NkZFNTExMTFBNzEwNDMw
MDg3QUU2NiAvKiBKSVRDYWxsMzJfNjQuY3BwICovOyB9OwogCQkxNDdCODNBQzBFNkRCOEM5MDA0
Nzc1QTQgLyogQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0N0I4M0FBMEU2REI4QzkwMDQ3NzVBNCAvKiBC
YXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oICovOyB9OwogCQkxNDdCODQ2MzBFNkRFNkIxMDA0
Nzc1QTQgLyogUHV0UHJvcGVydHlTbG90LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAxNDdCODQ2MjBFNkRFNkIxMDA0Nzc1QTQgLyogUHV0UHJvcGVydHlT
bG90LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
MTQ3RjM5QkQxMDdFQzM3NjAwNDI3QTQ4IC8qIEFyZ0xpc3QuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNGNjA1MTEwRTIwM0VGODAwQjlBNjREIC8q
IEFyZ0xpc3QuY3BwICovOyB9OwpAQCAtNjMxLDYgKzYzMiw3IEBACiAJCTE0NUM1MDdGMEQ5REY2
M0IwMDg4RjZCOSAvKiBDYWxsRGF0YS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBDYWxsRGF0YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNDZBQUIyQTBCNjZB
ODQ5MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gSlNTdHJpbmdSZWZDRi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkx
NDZBQUIzNzBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNTdHJpbmdSZWZDRi5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCTE0NkZFNTExMTFBNzEwNDMwMDg3QUU2NiAvKiBKSVRDYWxsMzJf
NjQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSklUQ2FsbDMyXzY0
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3NjA4NjMwOTlDNjMzODAwNDM3
MTI4IC8qIEpTSW1tZWRpYXRlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEpTSW1tZWRpYXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3Qjgz
QUEwRTZEQjhDOTAwNDc3NUE0IC8qIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0N0I4NDYyMEU2REU2QjEwMDQ3NzVBNCAv
KiBQdXRQcm9wZXJ0eVNsb3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHV0
UHJvcGVydHlTbG90Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMjQxLDYgKzEy
NDMsNyBAQAogCQkJCTg2QTkwRUNGMEVFN0Q1MUYwMEFCMzUwRCAvKiBKSVRBcml0aG1ldGljLmNw
cCAqLywKIAkJCQlBNzU3MDZERDExOEEyQkNGMDA1N0Y4OEYgLyogSklUQXJpdGhtZXRpYzMyXzY0
LmNwcCAqLywKIAkJCQk4NkNDODVBMjBFRTc5Qjc0MDAyODg2ODIgLyogSklUQ2FsbC5jcHAgKi8s
CisJCQkJMTQ2RkU1MTExMUE3MTA0MzAwODdBRTY2IC8qIEpJVENhbGwzMl82NC5jcHAgKi8sCiAJ
CQkJODZDQ0VGREQwRjQxM0Y4OTAwRkQ3RjlFIC8qIEpJVENvZGUuaCAqLywKIAkJCQk4NkNDODVB
MDBFRTc5QTQ3MDAyODg2ODIgLyogSklUSW5saW5lTWV0aG9kcy5oICovLAogCQkJCUJDREQ1MUU5
MEZCOERGNzQwMDRBOEJEQyAvKiBKSVRPcGNvZGVzLmNwcCAqLywKQEAgLTI2MDcsNiArMjYxMCw3
IEBACiAJCQkJODYyNkJFQ0YxMTkyOEUzOTAwNzgyRkFCIC8qIFN0cmluZ1N0YXRpY3MuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQTcxMjM2RTUxMTk1RjMzQzAwQkQyMTc0IC8qIEpJVE9wY29kZXMz
Ml82NC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4NkM1NjhFMDExQTIxM0VFMDAwN0Y3RjAgLyog
TWFjcm9Bc3NlbWJsZXJBUk0uY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMTQ2RkU1MTIxMUE3MTA0
MzAwODdBRTY2IC8qIEpJVENhbGwzMl82NC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBNzgzQTJB
QjExQTVCRTg0MDA1NjNEMjAgLyogSlNPYmplY3RXaXRoR2xvYmFsT2JqZWN0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvaml0L0pJVC5jcHAJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUv
aml0L0pJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDggQEAKICAqLwogCiAjaW5j
bHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoSklUKQogI2luY2x1ZGUgIkpJVC5oIgogCiAv
LyBUaGlzIHByb2JhYmx5IGRvZXMgbm90IGJlbG9uZyBoZXJlOyBhZGRpbmcgaGVyZSBmb3Igbm93
IGFzIGEgcXVpY2sgV2luZG93cyBidWlsZCBmaXguCkBAIC0zMiw4ICszNCw2IEBACiBKU0M6Ok1h
Y3JvQXNzZW1ibGVyWDg2Q29tbW9uOjpTU0UyQ2hlY2tTdGF0ZSBKU0M6Ok1hY3JvQXNzZW1ibGVy
WDg2Q29tbW9uOjpzX3NzZTJDaGVja1N0YXRlID0gTm90Q2hlY2tlZFNTRTI7CiAjZW5kaWYKIAot
I2lmIEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJJbnRl
cnByZXRlci5oIgogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCShyZXZpc2lvbiA1OTk0OSkKKysrIEph
dmFTY3JpcHRDb3JlL2ppdC9KSVRBcml0aG1ldGljMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNCw5ICsyNCwxMCBAQAogKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkpJ
VC5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpZiBVU0UoSlNWQUxVRTMyXzY0KQorI2luY2x1ZGUg
IkpJVC5oIgogCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCiAjaW5jbHVkZSAiSklUSW5saW5lTWV0
aG9kcy5oIgpAQCAtNDYsOCArNDcsNiBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3Bh
Y2UgSlNDIHsKIAotI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZvaWQgSklUOjplbWl0X29wX25l
Z2F0ZShJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQogewogICAgIHVuc2lnbmVkIGRz
dCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7CkBAIC0xNDA0LDggKzE0MDMsNyBA
QCB2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfbW9kKEluc3RydWN0aW9uKiBjCiAKIC8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQ6IE9QX01PRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KIAotI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KLX0KK30gLy8gbmFt
ZXNwYWNlIEpTQwogCisjZW5kaWYgLy8gVVNFKEpTVkFMVUUzMl82NCkKICNlbmRpZiAvLyBFTkFC
TEUoSklUKQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVEFyaXRobWV0aWMuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRBcml0aG1ldGljLmNwcAkocmV2aXNpb24g
NTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQXJpdGhtZXRpYy5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI0LDkgKzI0LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkpJVC5oIgogCiAjaWYgRU5BQkxFKEpJVCkKKyNpZiAhVVNFKEpTVkFMVUUzMl82NCkK
KyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkpJ
VElubGluZU1ldGhvZHMuaCIKQEAgLTQ2LDggKzQ3LDYgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsK
IAogbmFtZXNwYWNlIEpTQyB7CiAKLSNpZiAhVVNFKEpTVkFMVUUzMl82NCkKLQogdm9pZCBKSVQ6
OmVtaXRfb3BfbHNoaWZ0KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCiB7CiAgICAg
dW5zaWduZWQgcmVzdWx0ID0gY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKQEAgLTE4
MzQsOCArMTgzMyw3IEBAIHZvaWQgSklUOjplbWl0U2xvd19vcF9zdWIoSW5zdHJ1Y3Rpb24qIGMK
IAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORDogT1BfQURELCBPUF9TVUIs
IE9QX01VTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2VuZGlmIC8vICFV
U0UoSlNWQUxVRTMyXzY0KQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vICFVU0Uo
SlNWQUxVRTMyXzY0KQogI2VuZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9qaXQvSklUQ2FsbDMyXzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQv
SklUQ2FsbDMyXzY0LmNwcAkocmV2aXNpb24gNTk5MzkpCShmcm9tIEphdmFTY3JpcHRDb3JlL2pp
dC9KSVRDYWxsLmNwcDo1OTkzOSkKKysrIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRDYWxsMzJfNjQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJKSVQuaCIKKworI2lmIEVOQUJMRShKSVQpCisKKyNpbmNsdWRlICJDb2RlQmxvY2suaCIKKyNp
bmNsdWRlICJKSVRJbmxpbmVNZXRob2RzLmgiCisjaW5jbHVkZSAiSklUU3R1YkNhbGwuaCIKKyNp
bmNsdWRlICJKU0FycmF5LmgiCisjaW5jbHVkZSAiSlNGdW5jdGlvbi5oIgorI2luY2x1ZGUgIklu
dGVycHJldGVyLmgiCisjaW5jbHVkZSAiUmVzdWx0VHlwZS5oIgorI2luY2x1ZGUgIlNhbXBsaW5n
VG9vbC5oIgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEpTQyB7CisKKyNpZiBVU0UoSlNWQUxV
RTMyXzY0KQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbEluaXRpYWxpemVDYWxsRnJhbWUoKQor
eworICAgIC8vIHJlZ1QwIGhvbGRzIGNhbGxlZSwgcmVnVDEgaG9sZHMgYXJnQ291bnQKKyAgICBz
dG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFy
Z3VtZW50Q291bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisKKyAg
ICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Nj
b3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7
IC8vIHNjb3BlQ2hhaW4KKworICAgIHN0b3JlUHRyKHJlZ1QwLCBBZGRyZXNzKGNhbGxGcmFtZVJl
Z2lzdGVyLCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJl
Z2lzdGVyKSkpKTsgLy8gY2FsbGVlCisgICAgc3RvcmVQdHIocmVnVDEsIEFkZHJlc3MoY2FsbEZy
YW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbiAqIHN0YXRpY19jYXN0PGludD4o
c2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8gc2NvcGVDaGFpbgorfQorCit2b2lkIEpJVDo6Y29tcGls
ZU9wQ2FsbFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IGFy
Z0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGludCByZWdpc3Rlck9mZnNl
dCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJl
Z1QxLCByZWdUMCwgMCk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9m
ZnNldCwgMSk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Cit9
CisgICAgICAgICAgCit2b2lkIEpJVDo6Y29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKEluc3Ry
dWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsy
XS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5v
cGVyYW5kOworICAgIGludCBwcm90byA9IGluc3RydWN0aW9uWzRdLnUub3BlcmFuZDsKKyAgICBp
bnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOworCisgICAgZW1pdFB1
dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1QwLCAwKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0
YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KGFy
Z0NvdW50LCAyKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0Zyb21WaXJ0dWFsUmVnaXN0ZXIocHJv
dG8sIDMsIHJlZ1QyLCByZWdUMyk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudCh0aGlz
UmVnaXN0ZXIsIDQpOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFy
Z3MoSW5zdHJ1Y3Rpb24qKQoreworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QxLCByZWdUMCwg
MCk7CisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDMsIDEpOyAvLyByZWdpc3Rlck9mZnNldAor
ICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QyLCAyKTsgLy8gYXJnQ291bnQKK30KKwordm9pZCBK
SVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVzdWx0KEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sK
KyAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGVtaXRTdG9yZShk
c3QsIHJlZ1QxLCByZWdUMCk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJncyhJ
bnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9u
WzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnRSZWdpc3RlciA9IGluc3RydWN0aW9uWzJd
LnUub3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9w
ZXJhbmQ7CisKKyAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7CisgICAgZW1pdExv
YWRQYXlsb2FkKGFyZ0NvdW50UmVnaXN0ZXIsIHJlZ1QyKTsgLy8gYXJnQ291bnQKKyAgICBhZGRQ
dHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQpLCByZWdUMiwgcmVnVDMpOyAvLyByZWdpc3Rlck9mZnNl
dAorCisgICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworCisg
ICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNhbGxlZSwgcmVnVDEpOworICAgIGFkZFNs
b3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2Jh
bERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOworCisgICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRo
ZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAg
IG11bDMyKEltbTMyKHNpemVvZihSZWdpc3RlcikpLCByZWdUMywgcmVnVDMpOworICAgIGFkZFB0
cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOworICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lz
dGVyLCBBZGRyZXNzKHJlZ1QzLCBSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICogc3RhdGljX2Nh
c3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIG1vdmUocmVnVDMsIGNhbGxGcmFtZVJl
Z2lzdGVyKTsKKworICAgIG1vdmUocmVnVDIsIHJlZ1QxKTsgLy8gYXJnQ291bnQKKworICAgIGVt
aXROYWtlZENhbGwobV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKKwor
ICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisKK3ZvaWQgSklUOjpjb21waWxl
T3BDYWxsVmFyYXJnc1Nsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNs
b3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1
Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRlciwg
Y2FsbGVlKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICBKSVRTdHViQ2FsbCBzdHVi
Q2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKTsKKyAgICBzdHViQ2FsbC5jYWxs
KCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6
ZW1pdF9vcF9yZXQoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKK3sKKyAgICB1bnNp
Z25lZCBkc3QgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgLy8gV2Ug
Y291bGQgSklUIGdlbmVyYXRlIHRoZSBkZXJlZiwgb25seSBjYWxsaW5nIG91dCB0byBDIHdoZW4g
dGhlIHJlZmNvdW50IGhpdHMgemVyby4KKyAgICBpZiAobV9jb2RlQmxvY2stPm5lZWRzRnVsbFNj
b3BlQ2hhaW4oKSkKKyAgICAgICAgSklUU3R1YkNhbGwodGhpcywgY3RpX29wX3JldF9zY29wZUNo
YWluKS5jYWxsKCk7CisKKyAgICBlbWl0TG9hZChkc3QsIHJlZ1QxLCByZWdUMCk7CisgICAgZW1p
dEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIp
OworICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVy
RnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKworICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVm
b3JlUmV0dXJuKHJlZ1QyKTsKKyAgICByZXQoKTsKK30KKwordm9pZCBKSVQ6OmVtaXRfb3BfcmV0
X29iamVjdF9vcl90aGlzKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCit7CisgICAg
dW5zaWduZWQgcmVzdWx0ID0gY3VycmVudEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICB1
bnNpZ25lZCB0aGlzUmVnID0gY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKworICAg
IC8vIFdlIGNvdWxkIEpJVCBnZW5lcmF0ZSB0aGUgZGVyZWYsIG9ubHkgY2FsbGluZyBvdXQgdG8g
QyB3aGVuIHRoZSByZWZjb3VudCBoaXRzIHplcm8uCisgICAgaWYgKG1fY29kZUJsb2NrLT5uZWVk
c0Z1bGxTY29wZUNoYWluKCkpCisgICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9yZXRf
c2NvcGVDaGFpbikuY2FsbCgpOworCisgICAgZW1pdExvYWQocmVzdWx0LCByZWdUMSwgcmVnVDAp
OworICAgIEp1bXAgbm90SlNDZWxsID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihK
U1ZhbHVlOjpDZWxsVGFnKSk7CisgICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZG
U0VUT0YoSlNDZWxsLCBtX3N0cnVjdHVyZSkpLCByZWdUMik7CisgICAgSnVtcCBub3RPYmplY3Qg
PSBicmFuY2g4KE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QyLCBPQkpFQ1RfT0ZGU0VUT0YoU3RydWN0
dXJlLCBtX3R5cGVJbmZvKSArIE9CSkVDVF9PRkZTRVRPRihUeXBlSW5mbywgbV90eXBlKSksIElt
bTMyKE9iamVjdFR5cGUpKTsKKworICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJl
Z2lzdGVyRmlsZTo6UmV0dXJuUEMsIHJlZ1QyKTsKKyAgICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhl
YWRlclB0cihSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisK
KyAgICByZXN0b3JlUmV0dXJuQWRkcmVzc0JlZm9yZVJldHVybihyZWdUMik7CisgICAgcmV0KCk7
CisKKyAgICBub3RKU0NlbGwubGluayh0aGlzKTsKKyAgICBub3RPYmplY3QubGluayh0aGlzKTsK
KyAgICBlbWl0TG9hZCh0aGlzUmVnLCByZWdUMSwgcmVnVDApOworCisgICAgZW1pdEdldEZyb21D
YWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOworICAgIGVt
aXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNh
bGxGcmFtZVJlZ2lzdGVyKTsKKworICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJu
KHJlZ1QyKTsKKyAgICByZXQoKTsKK30KKwordm9pZCBKSVQ6OmVtaXRTbG93X29wX2NhbGwoSW5z
dHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVy
YXRvciYgaXRlcikKK3sKKyAgICBjb21waWxlT3BDYWxsU2xvd0Nhc2UoY3VycmVudEluc3RydWN0
aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5mb0luZGV4KyssIG9wX2NhbGwpOworfQorCit2b2lkIEpJ
VDo6ZW1pdFNsb3dfb3BfY2FsbF9ldmFsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24s
IFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9w
Q2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0luZm9JbmRl
eCsrLCBvcF9jYWxsX2V2YWwpOworfQorCit2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbF92YXJh
cmdzKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5
Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTbG93Q2FzZShj
dXJyZW50SW5zdHJ1Y3Rpb24sIGl0ZXIpOworfQorCit2b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY29u
c3RydWN0KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVu
dHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCit7CisgICAgY29tcGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJl
bnRJbnN0cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0luZm9JbmRleCsrLCBvcF9jb25zdHJ1Y3Qp
OworfQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jYWxsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1
Y3Rpb24pCit7CisgICAgY29tcGlsZU9wQ2FsbChvcF9jYWxsLCBjdXJyZW50SW5zdHJ1Y3Rpb24s
IG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Cit9CisKK3ZvaWQgSklUOjplbWl0X29wX2NhbGxfZXZh
bChJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQoreworICAgIGNvbXBpbGVPcENhbGwo
b3BfY2FsbF9ldmFsLCBjdXJyZW50SW5zdHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7
Cit9CisKK3ZvaWQgSklUOjplbWl0X29wX2xvYWRfdmFyYXJncyhJbnN0cnVjdGlvbiogY3VycmVu
dEluc3RydWN0aW9uKQoreworICAgIGludCBhcmdDb3VudERzdCA9IGN1cnJlbnRJbnN0cnVjdGlv
blsxXS51Lm9wZXJhbmQ7CisgICAgaW50IGFyZ3NPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25b
Ml0udS5vcGVyYW5kOworCisgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2xv
YWRfdmFyYXJncyk7CisgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIoYXJnc09mZnNldCkp
OworICAgIHN0dWJDYWxsLmNhbGwoKTsKKyAgICAvLyBTdG9yZXMgYSBuYWtlZCBpbnQzMiBpbiB0
aGUgcmVnaXN0ZXIgZmlsZS4KKyAgICBzdG9yZTMyKHJldHVyblZhbHVlUmVnaXN0ZXIsIEFkZHJl
c3MoY2FsbEZyYW1lUmVnaXN0ZXIsIGFyZ0NvdW50RHN0ICogc2l6ZW9mKFJlZ2lzdGVyKSkpOwor
fQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jYWxsX3ZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJ
bnN0cnVjdGlvbikKK3sKKyAgICBjb21waWxlT3BDYWxsVmFyYXJncyhjdXJyZW50SW5zdHJ1Y3Rp
b24pOworfQorCit2b2lkIEpJVDo6ZW1pdF9vcF9jb25zdHJ1Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJl
bnRJbnN0cnVjdGlvbikKK3sKKyAgICBjb21waWxlT3BDYWxsKG9wX2NvbnN0cnVjdCwgY3VycmVu
dEluc3RydWN0aW9uLCBtX2NhbGxMaW5rSW5mb0luZGV4KyspOworfQorCisjaWYgIUVOQUJMRShK
SVRfT1BUSU1JWkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJF
R0lOOiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIElu
c3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgdW5zaWduZWQpCit7CisgICAgaW50IGNhbGxlZSA9IGlu
c3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsy
XS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5v
cGVyYW5kOworCisgICAgSnVtcCB3YXNFdmFsOworICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxs
X2V2YWwpIHsKKyAgICAgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NhbGxf
ZXZhbCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KGNhbGxlZSk7CisgICAgICAgIHN0
dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJPZmZzZXQpKTsKKyAgICAgICAg
c3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3VudCkpOworICAgICAgICBzdHVi
Q2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2gzMihOb3RFcXVhbCwgcmVnVDEs
IEltbTMyKEpTVmFsdWU6OkVtcHR5VmFsdWVUYWcpKTsKKyAgICB9CisKKyAgICBlbWl0TG9hZChj
YWxsZWUsIHJlZ1QxLCByZWdUMCk7CisKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkKKyAg
ICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7CisgICAgZWxzZSBpZiAo
b3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1
cEFyZ3MoaW5zdHJ1Y3Rpb24pOworCisgICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNh
bGxlZSwgcmVnVDEpOworICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVz
cyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOworCisgICAg
Ly8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9i
amVjdC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7CisgICAgICAgIEpJVFN0
dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJP
ZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Cisg
ICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAgICB9CisKKyAgICAvLyBT
cGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNhbGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBt
YXRjaCB0aGUgYXJpdHkuCisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3Mo
Y2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJP
ZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIGFkZFB0
cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVy
KSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgbW92ZShJbW0zMihhcmdDb3VudCksIHJlZ1Qx
KTsKKworICAgIGVtaXROYWtlZENhbGwob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9i
YWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0dWFsQ29uc3RydWN0KCkgOiBtX2dsb2JhbERhdGEtPmpp
dFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOworCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxf
ZXZhbCkKKyAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMpOworCisgICAgc2FtcGxlQ29kZUJsb2Nr
KG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0
cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0
ZXIsIHVuc2lnbmVkLCBPcGNvZGVJRCBvcGNvZGVJRCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5z
dHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRl
ciwgY2FsbGVlKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisKKyAgICBKSVRTdHViQ2FsbCBz
dHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0
X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2NhbGxfTm90SlNGdW5jdGlvbik7CisgICAgc3R1YkNh
bGwuY2FsbCgpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKworI2Vs
c2UgLy8gIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tIEJFR0lOOiBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJ
RCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlua0lu
Zm9JbmRleCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwor
ICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICBpbnQgcmVn
aXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAgICBKdW1wIHdhc0V2
YWw7CisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkgeworICAgICAgICBKSVRTdHVi
Q2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwu
YWRkQXJndW1lbnQoY2FsbGVlKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJ
bW0zMihyZWdpc3Rlck9mZnNldCkpOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6
OkltbTMyKGFyZ0NvdW50KSk7CisgICAgICAgIHN0dWJDYWxsLmNhbGwoKTsKKyAgICAgICAgd2Fz
RXZhbCA9IGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6RW1wdHlWYWx1
ZVRhZykpOworICAgIH0KKworICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKwor
ICAgIERhdGFMYWJlbFB0ciBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrOworCisgICAgQkVH
SU5fVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7CisKKyAgICBKdW1wIGp1
bXBUb1Nsb3cgPSBicmFuY2hQdHJXaXRoUGF0Y2goTm90RXF1YWwsIHJlZ1QwLCBhZGRyZXNzT2ZM
aW5rZWRGdW5jdGlvbkNoZWNrLCBJbW1QdHIoMCkpOworCisgICAgRU5EX1VOSU5URVJSVVBURURf
U0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOworCisgICAgYWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7
CisgICAgQVNTRVJUKGRpZmZlcmVuY2VCZXR3ZWVuKGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hl
Y2ssIGp1bXBUb1Nsb3cpID09IHBhdGNoT2Zmc2V0T3BDYWxsQ29tcGFyZVRvSnVtcCk7CisgICAg
bV9jYWxsU3RydWN0dXJlU3R1YkNvbXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90
UGF0aEJlZ2luID0gYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKKworICAgIGFkZFNsb3dD
YXNlKGJyYW5jaDMyKE5vdEVxdWFsLCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6Q2VsbFRhZykpKTsK
KworICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGZhc3QgY2FzZSwgb25seSB1c2VkIHdoYW4g
YSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4KKworICAgIC8vIEluIHRoZSBjYXNlIG9mIE9wQ29uc3Ry
dWN0LCBjYWxsIG91dCB0byBhIGN0aV8gZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0
LgorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QpIHsKKyAgICAgICAgaW50IHByb3Rv
ID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVyYW5kOworICAgICAgICBpbnQgdGhpc1JlZ2lzdGVyID0g
aW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5kOworCisgICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxs
KHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpOworICAgICAgICBzdHViQ2FsbC5h
ZGRBcmd1bWVudChyZWdUMSwgcmVnVDApOworICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJ
bW0zMigwKSk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyB1bnVzZWQgSklUU3R1YiBhcmd1bWVudC4K
KyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSW1tMzIoMCkpOyAvLyBGSVhNRTogUmVtb3Zl
IHRoaXMgdW51c2VkIEpJVFN0dWIgYXJndW1lbnQuCisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3Vt
ZW50KHByb3RvKTsKKyAgICAgICAgc3R1YkNhbGwuY2FsbCh0aGlzUmVnaXN0ZXIpOworCisgICAg
ICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKKyAgICB9CisKKyAgICAvLyBGYXN0
IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUgaW5pdGlhbGl6YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZl
IHRvIGVkaS4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBvbWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJG
aWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FsbGVlCisgICAgbG9hZFB0cihB
ZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSAr
IE9CSkVDVF9PRkZTRVRPRihTY29wZUNoYWluLCBtX25vZGUpKSwgcmVnVDIpOworCisgICAgc3Rv
cmUzMihJbW0zMihhcmdDb3VudCksIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rl
ck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6QXJndW1lbnRDb3VudCkgKiBzdGF0aWNfY2FzdDxpbnQ+
KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFk
ZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6
Q2FsbGVyRnJhbWUpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAg
IGVtaXRTdG9yZShyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlLCByZWdUMSwg
cmVnVDApOworICAgIHN0b3JlUHRyKHJlZ1QyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAo
cmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8
aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOworICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNl
dCAqIHNpemVvZihSZWdpc3RlcikpLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisKKyAgICAvLyBDYWxs
IHRvIHRoZSBjYWxsZWUKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2Nh
bGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoT3RoZXIgPSBlbWl0TmFrZWRDYWxsKCk7CisgICAgCisg
ICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKKyAgICAgICAgd2FzRXZhbC5saW5rKHRo
aXMpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6
OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxT
bG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4
LCBPcGNvZGVJRCBvcGNvZGVJRCkKK3sKKyAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0u
dS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsK
KyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAg
ICBsaW5rU2xvd0Nhc2UoaXRlcik7CisgICAgbGlua1Nsb3dDYXNlKGl0ZXIpOworCisgICAgLy8g
VGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2Fs
bF9ldmFsCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGwpCisgICAgICAgIGNvbXBpbGVPcENh
bGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOworICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2Nv
bnN0cnVjdCkKKyAgICAgICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9u
KTsKKworICAgIC8vIEZhc3QgY2hlY2sgZm9yIEpTIGZ1bmN0aW9uLgorICAgIEp1bXAgY2FsbExp
bmtGYWlsTm90T2JqZWN0ID0gYnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVl
OjpDZWxsVGFnKSk7CisgICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNo
UHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5j
dGlvblZQdHIpKTsKKworICAgIC8vIEZpcnN0LCBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwg
YWxsb2NhdGUgdGhlIG5ldyBvYmplY3QuCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVj
dCkgeworICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBjdGlfb3BfY29uc3RydWN0X0pTQ29uc3Ry
dWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJT
aXplIC0gYXJnQ291bnQpOworICAgICAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7
CisgICAgfQorCisgICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3Vt
aW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgorICAgIHN0b3JlUHRyKGNhbGxGcmFt
ZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxs
ZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lz
dGVyKSkpKTsKKyAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxp
bnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1lUmVnaXN0ZXIpOworICAgIG1vdmUoSW1t
MzIoYXJnQ291bnQpLCByZWdUMSk7CisKKyAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRp
b25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5jYWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRD
YWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3Rp
VmlydHVhbENvbnN0cnVjdExpbmsoKSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVh
bENhbGxMaW5rKCkpOworCisgICAgLy8gSWYgbm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4g
dGhlIGlmIGJlbG93IQorICAgIEFTU0VSVChPUENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09E
RV9MRU5HVEgob3BfY2FsbF9ldmFsKSk7CisKKyAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRv
IHRoZSBob3QgcGF0aC4KKyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQorICAgICAg
ICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7
CisgICAgZWxzZQorICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5H
VEgob3BfY2FsbCkpOworCisgICAgLy8gVGhpcyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCisgICAg
Y2FsbExpbmtGYWlsTm90T2JqZWN0LmxpbmsodGhpcyk7CisgICAgY2FsbExpbmtGYWlsTm90SlNG
dW5jdGlvbi5saW5rKHRoaXMpOworICAgIEpJVFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9w
X2NvbnN0cnVjdCA/IGN0aV9vcF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2Fs
bF9Ob3RKU0Z1bmN0aW9uKS5jYWxsKCk7CisKKyAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxv
Y2spOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxF
IC8gRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KKworI2VuZGlmIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCisKKyNlbHNlIC8v
IFVTRShKU1ZBTFVFMzJfNjQpCisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsSW5pdGlhbGl6ZUNh
bGxGcmFtZSgpCit7CisgICAgc3RvcmUzMihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3Rl
ciwgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yo
UmVnaXN0ZXIpKSkpOworCisgICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VU
T0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9CSkVDVF9PRkZTRVRPRihTY29wZUNoYWlu
LCBtX25vZGUpKSwgcmVnVDEpOyAvLyBuZXdTY29wZUNoYWluCisKKyAgICBzdG9yZVB0cihyZWdU
MCwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpDYWxsZWUgKiBzdGF0
aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgc3RvcmVQdHIocmVnVDEsIEFk
ZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmlsZTo6U2NvcGVDaGFpbiAqIHN0YXRp
Y19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVP
cENhbGxTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQoreworICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7CisKKyAgICAvLyBlY3ggaG9sZHMgZnVuYworICAg
IGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QwLCAwKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0
YW50KGFyZ0NvdW50LCAyKTsKKyAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVy
T2Zmc2V0LCAxKTsKK30KKyAgICAgICAgICAKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJn
c1NldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCit7CisgICAgaW50IHJlZ2lzdGVy
T2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworICAgIAorICAgIC8vIGVjeCBob2xk
cyBmdW5jCisgICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRT
dHViQXJnKHJlZ1QxLCAyKTsKKyAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQpLCByZWdU
MSwgcmVnVDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QyLCAxKTsKK30KKwordm9pZCBK
SVQ6OmNvbXBpbGVPcENvbnN0cnVjdFNldHVwQXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24p
Cit7CisgICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworICAgIGlu
dCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3BlcmFuZDsKKyAgICBpbnQgcHJv
dG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7CisgICAgaW50IHRoaXNSZWdpc3RlciA9IGlu
c3RydWN0aW9uWzVdLnUub3BlcmFuZDsKKworICAgIC8vIGVjeCBob2xkcyBmdW5jCisgICAgZW1p
dFB1dEpJVFN0dWJBcmcocmVnVDAsIDApOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQo
cmVnaXN0ZXJPZmZzZXQsIDEpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQoYXJnQ291
bnQsIDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnRnJvbVZpcnR1YWxSZWdpc3Rlcihwcm90bywg
MywgcmVnVDIpOworICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQodGhpc1JlZ2lzdGVyLCA0
KTsKK30KKwordm9pZCBKSVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVzdWx0KEluc3RydWN0aW9uKiBp
bnN0cnVjdGlvbikKK3sKKyAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwor
ICAgIGVtaXRQdXRWaXJ0dWFsUmVnaXN0ZXIoZHN0KTsKK30KKwordm9pZCBKSVQ6OmNvbXBpbGVP
cENhbGxWYXJhcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKK3sKKyAgICBpbnQgY2FsbGVl
ID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOworICAgIGludCBhcmdDb3VudFJlZ2lzdGVyID0g
aW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOworCisgICAgZW1pdEdldFZpcnR1YWxSZWdpc3Rlcihh
cmdDb3VudFJlZ2lzdGVyLCByZWdUMSk7CisgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxs
ZWUsIHJlZ1QwKTsKKyAgICBjb21waWxlT3BDYWxsVmFyYXJnc1NldHVwQXJncyhpbnN0cnVjdGlv
bik7CisKKyAgICAvLyBDaGVjayBmb3IgSlNGdW5jdGlvbnMuCisgICAgZW1pdEp1bXBTbG93Q2Fz
ZUlmTm90SlNDZWxsKHJlZ1QwKTsKKyAgICBhZGRTbG93Q2FzZShicmFuY2hQdHIoTm90RXF1YWws
IEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikpKTsK
KworICAgIC8vIFNwZWN1bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWluZyBhcmdD
b3VudCB3aWxsIG1hdGNoIHRoZSBhcml0eS4KKyAgICBtdWwzMihJbW0zMihzaXplb2YoUmVnaXN0
ZXIpKSwgcmVnVDIsIHJlZ1QyKTsKKyAgICBpbnRwdHJfdCBvZmZzZXQgPSAoaW50cHRyX3Qpc2l6
ZW9mKFJlZ2lzdGVyKSAqIChpbnRwdHJfdClSZWdpc3RlckZpbGU6OkNhbGxlckZyYW1lOworICAg
IGFkZFB0cihJbW0zMigoaW50MzJfdClvZmZzZXQpLCByZWdUMiwgcmVnVDMpOworICAgIGFkZFB0
cihjYWxsRnJhbWVSZWdpc3RlciwgcmVnVDMpOworICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lz
dGVyLCByZWdUMyk7CisgICAgYWRkUHRyKHJlZ1QyLCBjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAg
ZW1pdE5ha2VkQ2FsbChtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkpOwor
CisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKK30KKwordm9pZCBKSVQ6OmNvbXBp
bGVPcENhbGxWYXJhcmdzU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qLCBWZWN0b3I8U2xvd0Nhc2VFbnRy
eT46Oml0ZXJhdG9yJiBpdGVyKQoreworICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKKyAgICBsaW5r
U2xvd0Nhc2UoaXRlcik7CisgICAgSklUU3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2Nh
bGxfTm90SlNGdW5jdGlvbik7CisgICAgc3R1YkNhbGwuY2FsbCgpOworICAgIAorICAgIHNhbXBs
ZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9CisgICAgCisjaWYgIUVOQUJMRShKSVRfT1BUSU1J
WkVfQ0FMTCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiAhRU5B
QkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
Kwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9u
KiBpbnN0cnVjdGlvbiwgdW5zaWduZWQpCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9u
WzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJh
bmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwor
CisgICAgLy8gSGFuZGxlIGV2YWwKKyAgICBKdW1wIHdhc0V2YWw7CisgICAgaWYgKG9wY29kZUlE
ID09IG9wX2NhbGxfZXZhbCkgeworICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBj
dGlfb3BfY2FsbF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlLCBy
ZWdUMCk7CisgICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJP
ZmZzZXQpKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3Vu
dCkpOworICAgICAgICBzdHViQ2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2hQ
dHIoTm90RXF1YWwsIHJlZ1QwLCBJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoKSkpKTsK
KyAgICB9CisKKyAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOworICAg
IC8vIFRoZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHNldCB1cCBvbiB0aGUgaG90IHBhdGggZm9yIG9w
X2NhbGxfZXZhbAorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsKQorICAgICAgICBjb21waWxl
T3BDYWxsU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKKyAgICBlbHNlIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpCisgICAgICAgIGNvbXBpbGVPcENvbnN0cnVjdFNldHVwQXJncyhpbnN0cnVj
dGlvbik7CisKKyAgICAvLyBDaGVjayBmb3IgSlNGdW5jdGlvbnMuCisgICAgZW1pdEp1bXBTbG93
Q2FzZUlmTm90SlNDZWxsKHJlZ1QwKTsKKyAgICBhZGRTbG93Q2FzZShicmFuY2hQdHIoTm90RXF1
YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5qc0Z1bmN0aW9uVlB0cikp
KTsKKworICAgIC8vIEZpcnN0LCBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUg
dGhlIG5ldyBvYmplY3QuCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgeworICAg
ICAgICBKSVRTdHViQ2FsbCh0aGlzLCBjdGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxs
KHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJn
Q291bnQpOworICAgICAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwor
ICAgIH0KKworICAgIC8vIFNwZWN1bGF0aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWlu
ZyBhcmdDb3VudCB3aWxsIG1hdGNoIHRoZSBhcml0eS4KKyAgICBzdG9yZVB0cihjYWxsRnJhbWVS
ZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2FsbGVy
RnJhbWUgKyByZWdpc3Rlck9mZnNldCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3Rl
cikpKSk7CisgICAgYWRkUHRyKEltbTMyKHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50
PihzaXplb2YoUmVnaXN0ZXIpKSksIGNhbGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBtb3ZlKEltbTMy
KGFyZ0NvdW50KSwgcmVnVDEpOworCisgICAgZW1pdE5ha2VkQ2FsbChvcGNvZGVJRCA9PSBvcF9j
b25zdHJ1Y3QgPyBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDb25zdHJ1Y3QoKSA6
IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7CisKKyAgICBpZiAob3Bj
b2RlSUQgPT0gb3BfY2FsbF9ldmFsKQorICAgICAgICB3YXNFdmFsLmxpbmsodGhpcyk7CisKKyAg
ICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOworfQorCit2b2lkIEpJVDo6Y29tcGlsZU9w
Q2FsbFNsb3dDYXNlKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50
cnk+OjppdGVyYXRvciYgaXRlciwgdW5zaWduZWQsIE9wY29kZUlEIG9wY29kZUlEKQoreworICAg
IGxpbmtTbG93Q2FzZShpdGVyKTsKKyAgICBsaW5rU2xvd0Nhc2UoaXRlcik7CisgICAgSklUU3R1
YkNhbGwgc3R1YkNhbGwodGhpcywgb3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gY3RpX29wX2Nv
bnN0cnVjdF9Ob3RKU0NvbnN0cnVjdCA6IGN0aV9vcF9jYWxsX05vdEpTRnVuY3Rpb24pOworICAg
IHN0dWJDYWxsLmNhbGwoKTsKKworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7Cit9
CisKKyNlbHNlIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCisKKy8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTjogRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBKSVQ6OmNvbXBpbGVPcENhbGwo
T3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgdW5zaWduZWQgY2Fs
bExpbmtJbmZvSW5kZXgpCit7CisgICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3Bl
cmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisgICAg
aW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworCisgICAgLy8g
SGFuZGxlIGV2YWwKKyAgICBKdW1wIHdhc0V2YWw7CisgICAgaWYgKG9wY29kZUlEID09IG9wX2Nh
bGxfZXZhbCkgeworICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2Fs
bF9ldmFsKTsKKyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlLCByZWdUMCk7Cisg
ICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6SW1tMzIocmVnaXN0ZXJPZmZzZXQpKTsK
KyAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihhcmdDb3VudCkpOworICAg
ICAgICBzdHViQ2FsbC5jYWxsKCk7CisgICAgICAgIHdhc0V2YWwgPSBicmFuY2hQdHIoTm90RXF1
YWwsIHJlZ1QwLCBJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoKSkpKTsKKyAgICB9CisK
KyAgICAvLyBUaGlzIHBsYW50cyBhIGNoZWNrIGZvciBhIGNhY2hlZCBKU0Z1bmN0aW9uIHZhbHVl
LCBzbyB3ZSBjYW4gcGxhbnQgYSBmYXN0IGxpbmsgdG8gdGhlIGNhbGxlZS4KKyAgICAvLyBUaGlz
IGRlbGliZXJhdGVseSBsZWF2ZXMgdGhlIGNhbGxlZSBpbiBlY3gsIHVzZWQgd2hlbiBzZXR0aW5n
IHVwIHRoZSBzdGFjayBmcmFtZSBiZWxvdworICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2Fs
bGVlLCByZWdUMCk7CisgICAgRGF0YUxhYmVsUHRyIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hl
Y2s7CisKKyAgICBCRUdJTl9VTklOVEVSUlVQVEVEX1NFUVVFTkNFKHNlcXVlbmNlT3BDYWxsKTsK
KworICAgIEp1bXAganVtcFRvU2xvdyA9IGJyYW5jaFB0cldpdGhQYXRjaChOb3RFcXVhbCwgcmVn
VDAsIGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIEltbVB0cihKU1ZhbHVlOjplbmNvZGUo
SlNWYWx1ZSgpKSkpOworCisgICAgRU5EX1VOSU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VP
cENhbGwpOworCisgICAgYWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7CisgICAgQVNTRVJUX0pJVF9P
RkZTRVQoZGlmZmVyZW5jZUJldHdlZW4oYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjaywganVt
cFRvU2xvdyksIHBhdGNoT2Zmc2V0T3BDYWxsQ29tcGFyZVRvSnVtcCk7CisgICAgbV9jYWxsU3Ry
dWN0dXJlU3R1YkNvbXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aEJlZ2lu
ID0gYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcg
aXMgdGhlIGZhc3QgY2FzZSwgb25seSB1c2VkIHdoYW4gYSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4K
KworICAgIC8vIEluIHRoZSBjYXNlIG9mIE9wQ29uc3RydWN0LCBjYWxsIG91dCB0byBhIGN0aV8g
ZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0LgorICAgIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpIHsKKyAgICAgICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVy
YW5kOworICAgICAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5k
OworCisgICAgICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QwLCAwKTsKKyAgICAgICAgZW1pdFB1
dEpJVFN0dWJBcmdGcm9tVmlydHVhbFJlZ2lzdGVyKHByb3RvLCAzLCByZWdUMik7CisgICAgICAg
IEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3Qp
OworICAgICAgICBzdHViQ2FsbC5jYWxsKHRoaXNSZWdpc3Rlcik7CisgICAgICAgIGVtaXRHZXRW
aXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7CisgICAgfQorCisgICAgLy8gRmFzdCB2ZXJz
aW9uIG9mIHN0YWNrIGZyYW1lIGluaXRpYWxpemF0aW9uLCBkaXJlY3RseSByZWxhdGl2ZSB0byBl
ZGkuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgb21pdHMgdG8gc2V0IHVwIFJlZ2lzdGVyRmlsZTo6
Q29kZUJsb2NrLCB3aGljaCBpcyBzZXQgaW4gdGhlIGNhbGxlZQorCisgICAgbG9hZFB0cihBZGRy
ZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9C
SkVDVF9PRkZTRVRPRihTY29wZUNoYWluLCBtX25vZGUpKSwgcmVnVDEpOyAvLyBuZXdTY29wZUNo
YWluCisKKyAgICBzdG9yZTMyKEltbTMyKGFyZ0NvdW50KSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdp
c3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpBcmd1bWVudENvdW50KSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihjYWxsRnJh
bWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsg
UmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKSk7CisgICAgc3RvcmVQdHIocmVnVDAsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIs
IChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlKSAqIHN0YXRpY19jYXN0PGlu
dD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVzcyhjYWxs
RnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWlu
KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKKyAgICBhZGRQdHIoSW1t
MzIocmVnaXN0ZXJPZmZzZXQgKiBzaXplb2YoUmVnaXN0ZXIpKSwgY2FsbEZyYW1lUmVnaXN0ZXIp
OworCisgICAgLy8gQ2FsbCB0byB0aGUgY2FsbGVlCisgICAgbV9jYWxsU3RydWN0dXJlU3R1YkNv
bXBpbGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aE90aGVyID0gZW1pdE5ha2Vk
Q2FsbCgpOworICAgIAorICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpCisgICAgICAg
IHdhc0V2YWwubGluayh0aGlzKTsKKworICAgIHNhbXBsZUNvZGVCbG9jayhtX2NvZGVCbG9jayk7
Cit9CisKK3ZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1Y3Rpb24qIGluc3Ry
dWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVyLCB1bnNpZ25lZCBj
YWxsTGlua0luZm9JbmRleCwgT3Bjb2RlSUQgb3Bjb2RlSUQpCit7CisgICAgaW50IGNhbGxlZSA9
IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKKyAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlv
blsyXS51Lm9wZXJhbmQ7CisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10u
dS5vcGVyYW5kOworCisgICAgbGlua1Nsb3dDYXNlKGl0ZXIpOworCisgICAgLy8gVGhlIGFyZ3Vt
ZW50cyBoYXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCisg
ICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGwpCisgICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFy
Z3MoaW5zdHJ1Y3Rpb24pOworICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkK
KyAgICAgICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKKworICAg
IC8vIEZhc3QgY2hlY2sgZm9yIEpTIGZ1bmN0aW9uLgorICAgIEp1bXAgY2FsbExpbmtGYWlsTm90
T2JqZWN0ID0gZW1pdEp1bXBJZk5vdEpTQ2VsbChyZWdUMCk7CisgICAgSnVtcCBjYWxsTGlua0Zh
aWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJlZ1QwKSwgSW1t
UHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKTsKKworICAgIC8vIEZpcnN0LCBpbiB0
aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUgdGhlIG5ldyBvYmplY3QuCisgICAgaWYg
KG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgeworICAgICAgICBKSVRTdHViQ2FsbCh0aGlzLCBj
dGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0IC0gUmVnaXN0
ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJnQ291bnQpOworICAgICAgICBlbWl0R2V0
VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOworICAgIH0KKworICAgIC8vIFNwZWN1bGF0
aXZlbHkgcm9sbCB0aGUgY2FsbGZyYW1lLCBhc3N1bWluZyBhcmdDb3VudCB3aWxsIG1hdGNoIHRo
ZSBhcml0eS4KKyAgICBzdG9yZVB0cihjYWxsRnJhbWVSZWdpc3RlciwgQWRkcmVzcyhjYWxsRnJh
bWVSZWdpc3RlciwgKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUgKyByZWdpc3Rlck9mZnNldCkg
KiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7CisgICAgYWRkUHRyKEltbTMy
KHJlZ2lzdGVyT2Zmc2V0ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSksIGNh
bGxGcmFtZVJlZ2lzdGVyKTsKKyAgICBtb3ZlKEltbTMyKGFyZ0NvdW50KSwgcmVnVDEpOworCisg
ICAgbW92ZShyZWdUMCwgcmVnVDIpOworCisgICAgbV9jYWxsU3RydWN0dXJlU3R1YkNvbXBpbGF0
aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uY2FsbFJldHVybkxvY2F0aW9uID0gZW1pdE5ha2Vk
Q2FsbChvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0
aVZpcnR1YWxDb25zdHJ1Y3RMaW5rKCkgOiBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1
YWxDYWxsTGluaygpKTsKKworICAgIC8vIElmIG5vdCwgd2UgbmVlZCBhbiBleHRyYSBjYXNlIGlu
IHRoZSBpZiBiZWxvdyEKKyAgICBBU1NFUlQoT1BDT0RFX0xFTkdUSChvcF9jYWxsKSA9PSBPUENP
REVfTEVOR1RIKG9wX2NhbGxfZXZhbCkpOworCisgICAgLy8gRG9uZSEgLSByZXR1cm4gYmFjayB0
byB0aGUgaG90IHBhdGguCisgICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKKyAgICAg
ICAgZW1pdEp1bXBTbG93VG9Ib3QoanVtcCgpLCBPUENPREVfTEVOR1RIKG9wX2NvbnN0cnVjdCkp
OworICAgIGVsc2UKKyAgICAgICAgZW1pdEp1bXBTbG93VG9Ib3QoanVtcCgpLCBPUENPREVfTEVO
R1RIKG9wX2NhbGwpKTsKKworICAgIC8vIFRoaXMgaGFuZGxlcyBob3N0IGZ1bmN0aW9ucworICAg
IGNhbGxMaW5rRmFpbE5vdE9iamVjdC5saW5rKHRoaXMpOworICAgIGNhbGxMaW5rRmFpbE5vdEpT
RnVuY3Rpb24ubGluayh0aGlzKTsKKyAgICBKSVRTdHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3RydWN0IDogY3RpX29wX2Nh
bGxfTm90SlNGdW5jdGlvbikuY2FsbCgpOworCisgICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJs
b2NrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORDogIUVOQUJM
RSAvIEVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCisKKyNlbmRpZiAvLyAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQorCisjZW5kaWYg
Ly8gVVNFKEpTVkFMVUUzMl82NCkKKworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZiAvLyBF
TkFCTEUoSklUKQpJbmRleDogSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAJKHJldmlzaW9u
IDU5OTM5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwzMl82NC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI0LDE2ICsyNCwxNyBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJKSVQuaCIKIAogI2lmIEVOQUJMRShKSVQpCisjaWYgVVNFKEpTVkFMVUUzMl82NCkK
KyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgorI2luY2x1ZGUgIklu
dGVycHJldGVyLmgiCiAjaW5jbHVkZSAiSklUSW5saW5lTWV0aG9kcy5oIgogI2luY2x1ZGUgIkpJ
VFN0dWJDYWxsLmgiCiAjaW5jbHVkZSAiSlNBcnJheS5oIgogI2luY2x1ZGUgIkpTRnVuY3Rpb24u
aCIKLSNpbmNsdWRlICJJbnRlcnByZXRlci5oIgogI2luY2x1ZGUgIlJlc3VsdFR5cGUuaCIKICNp
bmNsdWRlICJTYW1wbGluZ1Rvb2wuaCIKIApAQCAtNDUsOCArNDYsNiBAQCB1c2luZyBuYW1lc3Bh
Y2Ugc3RkOwogCiBuYW1lc3BhY2UgSlNDIHsKIAotI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZv
aWQgSklUOjpjb21waWxlT3BDYWxsSW5pdGlhbGl6ZUNhbGxGcmFtZSgpCiB7CiAgICAgLy8gcmVn
VDAgaG9sZHMgY2FsbGVlLCByZWdUMSBob2xkcyBhcmdDb3VudApAQCAtNDIyLDI4MyArNDIxLDcg
QEAgdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdAogCiAjZW5kaWYgLy8g
IUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKIAotI2Vsc2UgLy8gVVNFKEpTVkFMVUUzMl82NCkK
LQotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxJbml0aWFsaXplQ2FsbEZyYW1lKCkKLXsKLSAgICBz
dG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFy
Z3VtZW50Q291bnQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0KLSAg
ICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Nj
b3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7
IC8vIG5ld1Njb3BlQ2hhaW4KLQotICAgIHN0b3JlUHRyKHJlZ1QwLCBBZGRyZXNzKGNhbGxGcmFt
ZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkNhbGxlZSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9m
KFJlZ2lzdGVyKSkpKTsKLSAgICBzdG9yZVB0cihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdp
c3RlciwgUmVnaXN0ZXJGaWxlOjpTY29wZUNoYWluICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yo
UmVnaXN0ZXIpKSkpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNldHVwQXJncyhJbnN0
cnVjdGlvbiogaW5zdHJ1Y3Rpb24pCi17Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25b
Ml0udS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUu
b3BlcmFuZDsKLQotICAgIC8vIGVjeCBob2xkcyBmdW5jCi0gICAgZW1pdFB1dEpJVFN0dWJBcmco
cmVnVDAsIDApOwotICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQoYXJnQ291bnQsIDIpOwot
ICAgIGVtaXRQdXRKSVRTdHViQXJnQ29uc3RhbnQocmVnaXN0ZXJPZmZzZXQsIDEpOwotfQotICAg
ICAgICAgIAotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxWYXJhcmdzU2V0dXBBcmdzKEluc3RydWN0
aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlv
blszXS51Lm9wZXJhbmQ7Ci0gICAgCi0gICAgLy8gZWN4IGhvbGRzIGZ1bmMKLSAgICBlbWl0UHV0
SklUU3R1YkFyZyhyZWdUMCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIDIpOwot
ICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCksIHJlZ1QxLCByZWdUMik7Ci0gICAgZW1p
dFB1dEpJVFN0dWJBcmcocmVnVDIsIDEpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ29uc3Ry
dWN0U2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQgYXJnQ291
bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0g
aW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotICAgIGludCBwcm90byA9IGluc3RydWN0aW9uWzRd
LnUub3BlcmFuZDsKLSAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVy
YW5kOwotCi0gICAgLy8gZWN4IGhvbGRzIGZ1bmMKLSAgICBlbWl0UHV0SklUU3R1YkFyZyhyZWdU
MCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9mZnNldCwgMSk7
Ci0gICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Ci0gICAgZW1pdFB1
dEpJVFN0dWJBcmdGcm9tVmlydHVhbFJlZ2lzdGVyKHByb3RvLCAzLCByZWdUMik7Ci0gICAgZW1p
dFB1dEpJVFN0dWJBcmdDb25zdGFudCh0aGlzUmVnaXN0ZXIsIDQpOwotfQotCi12b2lkIEpJVDo6
ZW1pdF9vcF9jYWxsX3B1dF9yZXN1bHQoSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uKQotewotICAg
IGludCBkc3QgPSBpbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgZW1pdFB1dFZpcnR1YWxS
ZWdpc3Rlcihkc3QpOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3MoSW5zdHJ1
Y3Rpb24qIGluc3RydWN0aW9uKQotewotICAgIGludCBjYWxsZWUgPSBpbnN0cnVjdGlvblsxXS51
Lm9wZXJhbmQ7Ci0gICAgaW50IGFyZ0NvdW50UmVnaXN0ZXIgPSBpbnN0cnVjdGlvblsyXS51Lm9w
ZXJhbmQ7Ci0KLSAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGFyZ0NvdW50UmVnaXN0ZXIsIHJl
Z1QxKTsKLSAgICBlbWl0R2V0VmlydHVhbFJlZ2lzdGVyKGNhbGxlZSwgcmVnVDApOwotICAgIGNv
bXBpbGVPcENhbGxWYXJhcmdzU2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIENoZWNr
IGZvciBKU0Z1bmN0aW9ucy4KLSAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwocmVnVDAp
OwotICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIElt
bVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gU3BlY3VsYXRp
dmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhl
IGFyaXR5LgotICAgIG11bDMyKEltbTMyKHNpemVvZihSZWdpc3RlcikpLCByZWdUMiwgcmVnVDIp
OwotICAgIGludHB0cl90IG9mZnNldCA9IChpbnRwdHJfdClzaXplb2YoUmVnaXN0ZXIpICogKGlu
dHB0cl90KVJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWU7Ci0gICAgYWRkUHRyKEltbTMyKChpbnQz
Ml90KW9mZnNldCksIHJlZ1QyLCByZWdUMyk7Ci0gICAgYWRkUHRyKGNhbGxGcmFtZVJlZ2lzdGVy
LCByZWdUMyk7Ci0gICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIHJlZ1QzKTsKLSAgICBh
ZGRQdHIocmVnVDIsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLSAgICBlbWl0TmFrZWRDYWxsKG1fZ2xv
YmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGwoKSk7Ci0KLSAgICBzYW1wbGVDb2RlQmxv
Y2sobV9jb2RlQmxvY2spOwotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTbG93
Q2FzZShJbnN0cnVjdGlvbiosIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIp
Ci17Ci0gICAgbGlua1Nsb3dDYXNlKGl0ZXIpOwotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKLSAg
ICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKTsK
LSAgICBzdHViQ2FsbC5jYWxsKCk7Ci0gICAgCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJs
b2NrKTsKLX0KLSAgICAKLSNpZiAhRU5BQkxFKEpJVF9PUFRJTUlaRV9DQUxMKQotCi0vKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU46ICFFTkFCTEUoSklUX09QVElNSVpFX0NB
TEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIEpJVDo6Y29tcGls
ZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNp
Z25lZCkKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAg
IGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0
ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICAvLyBIYW5kbGUgZXZh
bAotICAgIEp1bXAgd2FzRXZhbDsKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKSB7
Ci0gICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwpOwot
ICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUsIHJlZ1QwKTsKLSAgICAgICAgc3R1
YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwotICAgICAgICBz
dHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAgICAgIHN0dWJD
YWxsLmNhbGwoKTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5jaFB0cihOb3RFcXVhbCwgcmVnVDAs
IEltbVB0cihKU1ZhbHVlOjplbmNvZGUoSlNWYWx1ZSgpKSkpOwotICAgIH0KLQotICAgIGVtaXRH
ZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7Ci0gICAgLy8gVGhlIGFyZ3VtZW50cyBo
YXZlIGJlZW4gc2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCi0gICAgaWYg
KG9wY29kZUlEID09IG9wX2NhbGwpCi0gICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFyZ3MoaW5z
dHJ1Y3Rpb24pOwotICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKLSAgICAg
ICAgY29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIENo
ZWNrIGZvciBKU0Z1bmN0aW9ucy4KLSAgICBlbWl0SnVtcFNsb3dDYXNlSWZOb3RKU0NlbGwocmVn
VDApOwotICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCks
IEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gRmlyc3Qs
IGluIHRoZSBjYXNlIG9mIGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAg
ICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRo
aXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBS
ZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVt
aXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2FsbGVlLCByZWdUMCk7Ci0gICAgfQotCi0gICAgLy8gU3Bl
Y3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0
Y2ggdGhlIGFyaXR5LgotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNh
bGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zm
c2V0KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBhZGRQdHIo
SW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3Rlcikp
KSwgY2FsbEZyYW1lUmVnaXN0ZXIpOwotICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7
Ci0KLSAgICBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IG1fZ2xvYmFs
RGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdCgpIDogbV9nbG9iYWxEYXRhLT5qaXRT
dHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKLQotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2
YWwpCi0gICAgICAgIHdhc0V2YWwubGluayh0aGlzKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayht
X2NvZGVCbG9jayk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1
Y3Rpb24qIGluc3RydWN0aW9uLCBWZWN0b3I8U2xvd0Nhc2VFbnRyeT46Oml0ZXJhdG9yJiBpdGVy
LCB1bnNpZ25lZCwgT3Bjb2RlSUQgb3Bjb2RlSUQpCi17Ci0gICAgbGlua1Nsb3dDYXNlKGl0ZXIp
OwotICAgIGxpbmtTbG93Q2FzZShpdGVyKTsKLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlz
LCBvcGNvZGVJRCA9PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3Ry
dWN0IDogY3RpX29wX2NhbGxfTm90SlNGdW5jdGlvbik7Ci0gICAgc3R1YkNhbGwuY2FsbCgpOwot
Ci0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotI2Vsc2UgLy8gIUVOQUJM
RShKSVRfT1BUSU1JWkVfQ0FMTCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
IEJFR0lOOiBFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwg
SW5zdHJ1Y3Rpb24qIGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlua0luZm9JbmRleCkKLXsK
LSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICAvLyBIYW5kbGUgZXZhbAotICAgIEp1
bXAgd2FzRXZhbDsKLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbF9ldmFsKSB7Ci0gICAgICAg
IEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jYWxsX2V2YWwpOwotICAgICAgICBz
dHViQ2FsbC5hZGRBcmd1bWVudChjYWxsZWUsIHJlZ1QwKTsKLSAgICAgICAgc3R1YkNhbGwuYWRk
QXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwotICAgICAgICBzdHViQ2FsbC5h
ZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAgICAgIHN0dWJDYWxsLmNhbGwo
KTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5jaFB0cihOb3RFcXVhbCwgcmVnVDAsIEltbVB0cihK
U1ZhbHVlOjplbmNvZGUoSlNWYWx1ZSgpKSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgcGxhbnRz
IGEgY2hlY2sgZm9yIGEgY2FjaGVkIEpTRnVuY3Rpb24gdmFsdWUsIHNvIHdlIGNhbiBwbGFudCBh
IGZhc3QgbGluayB0byB0aGUgY2FsbGVlLgotICAgIC8vIFRoaXMgZGVsaWJlcmF0ZWx5IGxlYXZl
cyB0aGUgY2FsbGVlIGluIGVjeCwgdXNlZCB3aGVuIHNldHRpbmcgdXAgdGhlIHN0YWNrIGZyYW1l
IGJlbG93Ci0gICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxsZWUsIHJlZ1QwKTsKLSAgICBE
YXRhTGFiZWxQdHIgYWRkcmVzc09mTGlua2VkRnVuY3Rpb25DaGVjazsKLQotICAgIEJFR0lOX1VO
SU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwpOwotCi0gICAgSnVtcCBqdW1wVG9T
bG93ID0gYnJhbmNoUHRyV2l0aFBhdGNoKE5vdEVxdWFsLCByZWdUMCwgYWRkcmVzc09mTGlua2Vk
RnVuY3Rpb25DaGVjaywgSW1tUHRyKEpTVmFsdWU6OmVuY29kZShKU1ZhbHVlKCkpKSk7Ci0KLSAg
ICBFTkRfVU5JTlRFUlJVUFRFRF9TRVFVRU5DRShzZXF1ZW5jZU9wQ2FsbCk7Ci0KLSAgICBhZGRT
bG93Q2FzZShqdW1wVG9TbG93KTsKLSAgICBBU1NFUlRfSklUX09GRlNFVChkaWZmZXJlbmNlQmV0
d2VlbihhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrLCBqdW1wVG9TbG93KSwgcGF0Y2hPZmZz
ZXRPcENhbGxDb21wYXJlVG9KdW1wKTsKLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRp
b25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRoQmVnaW4gPSBhZGRyZXNzT2ZMaW5rZWRG
dW5jdGlvbkNoZWNrOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgZmFzdCBjYXNlLCBv
bmx5IHVzZWQgd2hhbiBhIGNhbGxlZSBjYW4gYmUgbGlua2VkLgotCi0gICAgLy8gSW4gdGhlIGNh
c2Ugb2YgT3BDb25zdHJ1Y3QsIGNhbGwgb3V0IHRvIGEgY3RpXyBmdW5jdGlvbiB0byBjcmVhdGUg
dGhlIG5ldyBvYmplY3QuCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgewotICAg
ICAgICBpbnQgcHJvdG8gPSBpbnN0cnVjdGlvbls0XS51Lm9wZXJhbmQ7Ci0gICAgICAgIGludCB0
aGlzUmVnaXN0ZXIgPSBpbnN0cnVjdGlvbls1XS51Lm9wZXJhbmQ7Ci0KLSAgICAgICAgZW1pdFB1
dEpJVFN0dWJBcmcocmVnVDAsIDApOwotICAgICAgICBlbWl0UHV0SklUU3R1YkFyZ0Zyb21WaXJ0
dWFsUmVnaXN0ZXIocHJvdG8sIDMsIHJlZ1QyKTsKLSAgICAgICAgSklUU3R1YkNhbGwgc3R1YkNh
bGwodGhpcywgY3RpX29wX2NvbnN0cnVjdF9KU0NvbnN0cnVjdCk7Ci0gICAgICAgIHN0dWJDYWxs
LmNhbGwodGhpc1JlZ2lzdGVyKTsKLSAgICAgICAgZW1pdEdldFZpcnR1YWxSZWdpc3RlcihjYWxs
ZWUsIHJlZ1QwKTsKLSAgICB9Ci0KLSAgICAvLyBGYXN0IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUg
aW5pdGlhbGl6YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZlIHRvIGVkaS4KLSAgICAvLyBOb3RlIHRo
YXQgdGhpcyBvbWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJGaWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlz
IHNldCBpbiB0aGUgY2FsbGVlCi0KLSAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAsIE9CSkVDVF9P
RkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNFVE9GKFNjb3Bl
Q2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7IC8vIG5ld1Njb3BlQ2hhaW4KLQotICAgIHN0b3JlMzIo
SW1tMzIoYXJnQ291bnQpLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZz
ZXQgKyBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQpICogc3RhdGljX2Nhc3Q8aW50PihzaXpl
b2YoUmVnaXN0ZXIpKSkpOwotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNz
KGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OkNhbGxl
ckZyYW1lKSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBzdG9y
ZVB0cihyZWdUMCwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgKHJlZ2lzdGVyT2Zmc2V0ICsg
UmVnaXN0ZXJGaWxlOjpDYWxsZWUpICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIp
KSkpOwotICAgIHN0b3JlUHRyKHJlZ1QxLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVn
aXN0ZXJPZmZzZXQgKyBSZWdpc3RlckZpbGU6OlNjb3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8aW50
PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAq
IHNpemVvZihSZWdpc3RlcikpLCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0KLSAgICAvLyBDYWxsIHRv
IHRoZSBjYWxsZWUKLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxM
aW5rSW5mb0luZGV4XS5ob3RQYXRoT3RoZXIgPSBlbWl0TmFrZWRDYWxsKCk7Ci0gICAgCi0gICAg
aWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKLSAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMp
OwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotdm9pZCBKSVQ6OmNv
bXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93
Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4LCBP
cGNvZGVJRCBvcGNvZGVJRCkKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5v
cGVyYW5kOwotICAgIGludCBhcmdDb3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAg
ICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBs
aW5rU2xvd0Nhc2UoaXRlcik7Ci0KLSAgICAvLyBUaGUgYXJndW1lbnRzIGhhdmUgYmVlbiBzZXQg
dXAgb24gdGhlIGhvdCBwYXRoIGZvciBvcF9jYWxsX2V2YWwKLSAgICBpZiAob3Bjb2RlSUQgPT0g
b3BfY2FsbCkKLSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVwQXJncyhpbnN0cnVjdGlvbik7Ci0g
ICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBjb21waWxlT3BD
b25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgLy8gRmFzdCBjaGVjayBmb3Ig
SlMgZnVuY3Rpb24uCi0gICAgSnVtcCBjYWxsTGlua0ZhaWxOb3RPYmplY3QgPSBlbWl0SnVtcElm
Tm90SlNDZWxsKHJlZ1QwKTsKLSAgICBKdW1wIGNhbGxMaW5rRmFpbE5vdEpTRnVuY3Rpb24gPSBi
cmFuY2hQdHIoTm90RXF1YWwsIEFkZHJlc3MocmVnVDApLCBJbW1QdHIobV9nbG9iYWxEYXRhLT5q
c0Z1bmN0aW9uVlB0cikpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9mIGEgY29uc3Ry
dWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY29u
c3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3RfSlND
b25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNhbGxGcmFtZUhl
YWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRHZXRWaXJ0dWFsUmVnaXN0ZXIoY2Fs
bGVlLCByZWdUMCk7Ci0gICAgfQotCi0gICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxs
ZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgotICAgIHN0b3Jl
UHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAoUmVnaXN0
ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0KSAqIHN0YXRpY19jYXN0PGludD4o
c2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQgKiBz
dGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwgY2FsbEZyYW1lUmVnaXN0ZXIpOwot
ICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7Ci0KLSAgICBtb3ZlKHJlZ1QwLCByZWdU
Mik7Ci0KLSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5m
b0luZGV4XS5jYWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9w
X2NvbnN0cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdExp
bmsoKSA6IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGxMaW5rKCkpOwotCi0g
ICAgLy8gSWYgbm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4gdGhlIGlmIGJlbG93IQotICAg
IEFTU0VSVChPUENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09ERV9MRU5HVEgob3BfY2FsbF9l
dmFsKSk7Ci0KLSAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRvIHRoZSBob3QgcGF0aC4KLSAg
ICBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBlbWl0SnVtcFNsb3dUb0hv
dChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7Ci0gICAgZWxzZQotICAgICAg
ICBlbWl0SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY2FsbCkpOwotCi0g
ICAgLy8gVGhpcyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCi0gICAgY2FsbExpbmtGYWlsTm90T2Jq
ZWN0LmxpbmsodGhpcyk7Ci0gICAgY2FsbExpbmtGYWlsTm90SlNGdW5jdGlvbi5saW5rKHRoaXMp
OwotICAgIEpJVFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IGN0aV9v
cF9jb25zdHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKS5j
YWxsKCk7Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi0vKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxFIC8gRU5BQkxFKEpJVF9PUFRJ
TUlaRV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2VuZGlmIC8v
ICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCi0KLSNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0
KQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCiAj
ZW5kaWYgLy8gRU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRDYWxsLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUQ2FsbC5jcHAJKHJldmlzaW9u
IDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVENhbGwuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yNCw5ICsyNCwxMCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJKSVQuaCIKIAogI2lmIEVOQUJMRShKSVQpCisjaWYgIVVTRShKU1ZBTFVFMzJfNjQpCisjaW5j
bHVkZSAiSklULmgiCiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJKSVRJbmxp
bmVNZXRob2RzLmgiCkBAIC00NSwzODUgKzQ2LDYgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAog
bmFtZXNwYWNlIEpTQyB7CiAKLSNpZiBVU0UoSlNWQUxVRTMyXzY0KQotCi12b2lkIEpJVDo6Y29t
cGlsZU9wQ2FsbEluaXRpYWxpemVDYWxsRnJhbWUoKQotewotICAgIC8vIHJlZ1QwIGhvbGRzIGNh
bGxlZSwgcmVnVDEgaG9sZHMgYXJnQ291bnQKLSAgICBzdG9yZTMyKHJlZ1QxLCBBZGRyZXNzKGNh
bGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkFyZ3VtZW50Q291bnQgKiBzdGF0aWNfY2Fz
dDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0KLSAgICBsb2FkUHRyKEFkZHJlc3MocmVnVDAs
IE9CSkVDVF9PRkZTRVRPRihKU0Z1bmN0aW9uLCBtX3Njb3BlQ2hhaW4pICsgT0JKRUNUX09GRlNF
VE9GKFNjb3BlQ2hhaW4sIG1fbm9kZSkpLCByZWdUMSk7IC8vIHNjb3BlQ2hhaW4KLQotICAgIHN0
b3JlUHRyKHJlZ1QwLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCBSZWdpc3RlckZpbGU6OkNh
bGxlZSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8gY2FsbGVlCi0g
ICAgc3RvcmVQdHIocmVnVDEsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIFJlZ2lzdGVyRmls
ZTo6U2NvcGVDaGFpbiAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsgLy8g
c2NvcGVDaGFpbgotfQotCi12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbFNldHVwQXJncyhJbnN0cnVj
dGlvbiogaW5zdHJ1Y3Rpb24pCi17Ci0gICAgaW50IGFyZ0NvdW50ID0gaW5zdHJ1Y3Rpb25bMl0u
dS5vcGVyYW5kOwotICAgIGludCByZWdpc3Rlck9mZnNldCA9IGluc3RydWN0aW9uWzNdLnUub3Bl
cmFuZDsKLQotICAgIGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QxLCByZWdUMCwgMCk7Ci0gICAgZW1p
dFB1dEpJVFN0dWJBcmdDb25zdGFudChyZWdpc3Rlck9mZnNldCwgMSk7Ci0gICAgZW1pdFB1dEpJ
VFN0dWJBcmdDb25zdGFudChhcmdDb3VudCwgMik7Ci19Ci0gICAgICAgICAgCi12b2lkIEpJVDo6
Y29tcGlsZU9wQ29uc3RydWN0U2V0dXBBcmdzKEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsK
LSAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJl
Z2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotICAgIGludCBwcm90byA9
IGluc3RydWN0aW9uWzRdLnUub3BlcmFuZDsKLSAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1
Y3Rpb25bNV0udS5vcGVyYW5kOwotCi0gICAgZW1pdFB1dEpJVFN0dWJBcmcocmVnVDEsIHJlZ1Qw
LCAwKTsKLSAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KHJlZ2lzdGVyT2Zmc2V0LCAxKTsK
LSAgICBlbWl0UHV0SklUU3R1YkFyZ0NvbnN0YW50KGFyZ0NvdW50LCAyKTsKLSAgICBlbWl0UHV0
SklUU3R1YkFyZ0Zyb21WaXJ0dWFsUmVnaXN0ZXIocHJvdG8sIDMsIHJlZ1QyLCByZWdUMyk7Ci0g
ICAgZW1pdFB1dEpJVFN0dWJBcmdDb25zdGFudCh0aGlzUmVnaXN0ZXIsIDQpOwotfQotCi12b2lk
IEpJVDo6Y29tcGlsZU9wQ2FsbFZhcmFyZ3NTZXR1cEFyZ3MoSW5zdHJ1Y3Rpb24qKQotewotICAg
IGVtaXRQdXRKSVRTdHViQXJnKHJlZ1QxLCByZWdUMCwgMCk7Ci0gICAgZW1pdFB1dEpJVFN0dWJB
cmcocmVnVDMsIDEpOyAvLyByZWdpc3Rlck9mZnNldAotICAgIGVtaXRQdXRKSVRTdHViQXJnKHJl
Z1QyLCAyKTsgLy8gYXJnQ291bnQKLX0KLQotdm9pZCBKSVQ6OmVtaXRfb3BfY2FsbF9wdXRfcmVz
dWx0KEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbikKLXsKLSAgICBpbnQgZHN0ID0gaW5zdHJ1Y3Rp
b25bMV0udS5vcGVyYW5kOwotICAgIGVtaXRTdG9yZShkc3QsIHJlZ1QxLCByZWdUMCk7Ci19Ci0K
LXZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJncyhJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24p
Ci17Ci0gICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICBpbnQg
YXJnQ291bnRSZWdpc3RlciA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVn
aXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBlbWl0TG9hZChj
YWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0gICAgZW1pdExvYWRQYXlsb2FkKGFyZ0NvdW50UmVnaXN0
ZXIsIHJlZ1QyKTsgLy8gYXJnQ291bnQKLSAgICBhZGRQdHIoSW1tMzIocmVnaXN0ZXJPZmZzZXQp
LCByZWdUMiwgcmVnVDMpOyAvLyByZWdpc3Rlck9mZnNldAotCi0gICAgY29tcGlsZU9wQ2FsbFZh
cmFyZ3NTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0gICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90
SlNDZWxsKGNhbGxlZSwgcmVnVDEpOwotICAgIGFkZFNsb3dDYXNlKGJyYW5jaFB0cihOb3RFcXVh
bCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2JhbERhdGEtPmpzRnVuY3Rpb25WUHRyKSkp
OwotCi0gICAgLy8gU3BlY3VsYXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFy
Z0NvdW50IHdpbGwgbWF0Y2ggdGhlIGFyaXR5LgotICAgIG11bDMyKEltbTMyKHNpemVvZihSZWdp
c3RlcikpLCByZWdUMywgcmVnVDMpOwotICAgIGFkZFB0cihjYWxsRnJhbWVSZWdpc3RlciwgcmVn
VDMpOwotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKHJlZ1QzLCBSZWdp
c3RlckZpbGU6OkNhbGxlckZyYW1lICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIp
KSkpOwotICAgIG1vdmUocmVnVDMsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAgIG1vdmUocmVn
VDIsIHJlZ1QxKTsgLy8gYXJnQ291bnQKLQotICAgIGVtaXROYWtlZENhbGwobV9nbG9iYWxEYXRh
LT5qaXRTdHVicy5jdGlWaXJ0dWFsQ2FsbCgpKTsKLQotICAgIHNhbXBsZUNvZGVCbG9jayhtX2Nv
ZGVCbG9jayk7Ci19Ci0KLXZvaWQgSklUOjpjb21waWxlT3BDYWxsVmFyYXJnc1Nsb3dDYXNlKElu
c3RydWN0aW9uKiBpbnN0cnVjdGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYg
aXRlcikKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotCi0g
ICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRlciwgY2FsbGVlKTsKLSAgICBsaW5rU2xvd0Nh
c2UoaXRlcik7Ci0KLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlfb3BfY2FsbF9O
b3RKU0Z1bmN0aW9uKTsKLSAgICBzdHViQ2FsbC5jYWxsKCk7Ci0KLSAgICBzYW1wbGVDb2RlQmxv
Y2sobV9jb2RlQmxvY2spOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9yZXQoSW5zdHJ1Y3Rpb24q
IGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICB1bnNpZ25lZCBkc3QgPSBjdXJyZW50SW5zdHJ1
Y3Rpb25bMV0udS5vcGVyYW5kOwotCi0gICAgLy8gV2UgY291bGQgSklUIGdlbmVyYXRlIHRoZSBk
ZXJlZiwgb25seSBjYWxsaW5nIG91dCB0byBDIHdoZW4gdGhlIHJlZmNvdW50IGhpdHMgemVyby4K
LSAgICBpZiAobV9jb2RlQmxvY2stPm5lZWRzRnVsbFNjb3BlQ2hhaW4oKSkKLSAgICAgICAgSklU
U3R1YkNhbGwodGhpcywgY3RpX29wX3JldF9zY29wZUNoYWluKS5jYWxsKCk7Ci0KLSAgICBlbWl0
TG9hZChkc3QsIHJlZ1QxLCByZWdUMCk7Ci0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQ
dHIoUmVnaXN0ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOwotICAgIGVtaXRHZXRGcm9tQ2FsbEZy
YW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVy
KTsKLQotICAgIHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJuKHJlZ1QyKTsKLSAgICBy
ZXQoKTsKLX0KLQotdm9pZCBKSVQ6OmVtaXRfb3BfcmV0X29iamVjdF9vcl90aGlzKEluc3RydWN0
aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCi17Ci0gICAgdW5zaWduZWQgcmVzdWx0ID0gY3VycmVu
dEluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsKLSAgICB1bnNpZ25lZCB0aGlzUmVnID0gY3VycmVu
dEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLQotICAgIC8vIFdlIGNvdWxkIEpJVCBnZW5lcmF0
ZSB0aGUgZGVyZWYsIG9ubHkgY2FsbGluZyBvdXQgdG8gQyB3aGVuIHRoZSByZWZjb3VudCBoaXRz
IHplcm8uCi0gICAgaWYgKG1fY29kZUJsb2NrLT5uZWVkc0Z1bGxTY29wZUNoYWluKCkpCi0gICAg
ICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9yZXRfc2NvcGVDaGFpbikuY2FsbCgpOwotCi0g
ICAgZW1pdExvYWQocmVzdWx0LCByZWdUMSwgcmVnVDApOwotICAgIEp1bXAgbm90SlNDZWxsID0g
YnJhbmNoMzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpDZWxsVGFnKSk7Ci0gICAg
bG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZGU0VUT0YoSlNDZWxsLCBtX3N0cnVjdHVy
ZSkpLCByZWdUMik7Ci0gICAgSnVtcCBub3RPYmplY3QgPSBicmFuY2g4KE5vdEVxdWFsLCBBZGRy
ZXNzKHJlZ1QyLCBPQkpFQ1RfT0ZGU0VUT0YoU3RydWN0dXJlLCBtX3R5cGVJbmZvKSArIE9CSkVD
VF9PRkZTRVRPRihUeXBlSW5mbywgbV90eXBlKSksIEltbTMyKE9iamVjdFR5cGUpKTsKLQotICAg
IGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVyUHRyKFJlZ2lzdGVyRmlsZTo6UmV0dXJuUEMsIHJl
Z1QyKTsKLSAgICBlbWl0R2V0RnJvbUNhbGxGcmFtZUhlYWRlclB0cihSZWdpc3RlckZpbGU6OkNh
bGxlckZyYW1lLCBjYWxsRnJhbWVSZWdpc3Rlcik7Ci0KLSAgICByZXN0b3JlUmV0dXJuQWRkcmVz
c0JlZm9yZVJldHVybihyZWdUMik7Ci0gICAgcmV0KCk7Ci0KLSAgICBub3RKU0NlbGwubGluayh0
aGlzKTsKLSAgICBub3RPYmplY3QubGluayh0aGlzKTsKLSAgICBlbWl0TG9hZCh0aGlzUmVnLCBy
ZWdUMSwgcmVnVDApOwotCi0gICAgZW1pdEdldEZyb21DYWxsRnJhbWVIZWFkZXJQdHIoUmVnaXN0
ZXJGaWxlOjpSZXR1cm5QQywgcmVnVDIpOwotICAgIGVtaXRHZXRGcm9tQ2FsbEZyYW1lSGVhZGVy
UHRyKFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUsIGNhbGxGcmFtZVJlZ2lzdGVyKTsKLQotICAg
IHJlc3RvcmVSZXR1cm5BZGRyZXNzQmVmb3JlUmV0dXJuKHJlZ1QyKTsKLSAgICByZXQoKTsKLX0K
LQotdm9pZCBKSVQ6OmVtaXRTbG93X29wX2NhbGwoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVj
dGlvbiwgVmVjdG9yPFNsb3dDYXNlRW50cnk+OjppdGVyYXRvciYgaXRlcikKLXsKLSAgICBjb21w
aWxlT3BDYWxsU2xvd0Nhc2UoY3VycmVudEluc3RydWN0aW9uLCBpdGVyLCBtX2NhbGxMaW5rSW5m
b0luZGV4KyssIG9wX2NhbGwpOwotfQotCi12b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbF9ldmFs
KEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6
aXRlcmF0b3ImIGl0ZXIpCi17Ci0gICAgY29tcGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0
cnVjdGlvbiwgaXRlciwgbV9jYWxsTGlua0luZm9JbmRleCsrLCBvcF9jYWxsX2V2YWwpOwotfQot
Ci12b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY2FsbF92YXJhcmdzKEluc3RydWN0aW9uKiBjdXJyZW50
SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCi17Ci0g
ICAgY29tcGlsZU9wQ2FsbFZhcmFyZ3NTbG93Q2FzZShjdXJyZW50SW5zdHJ1Y3Rpb24sIGl0ZXIp
OwotfQotCi12b2lkIEpJVDo6ZW1pdFNsb3dfb3BfY29uc3RydWN0KEluc3RydWN0aW9uKiBjdXJy
ZW50SW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIpCi17
Ci0gICAgY29tcGlsZU9wQ2FsbFNsb3dDYXNlKGN1cnJlbnRJbnN0cnVjdGlvbiwgaXRlciwgbV9j
YWxsTGlua0luZm9JbmRleCsrLCBvcF9jb25zdHJ1Y3QpOwotfQotCi12b2lkIEpJVDo6ZW1pdF9v
cF9jYWxsKEluc3RydWN0aW9uKiBjdXJyZW50SW5zdHJ1Y3Rpb24pCi17Ci0gICAgY29tcGlsZU9w
Q2FsbChvcF9jYWxsLCBjdXJyZW50SW5zdHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7
Ci19Ci0KLXZvaWQgSklUOjplbWl0X29wX2NhbGxfZXZhbChJbnN0cnVjdGlvbiogY3VycmVudElu
c3RydWN0aW9uKQotewotICAgIGNvbXBpbGVPcENhbGwob3BfY2FsbF9ldmFsLCBjdXJyZW50SW5z
dHJ1Y3Rpb24sIG1fY2FsbExpbmtJbmZvSW5kZXgrKyk7Ci19Ci0KLXZvaWQgSklUOjplbWl0X29w
X2xvYWRfdmFyYXJncyhJbnN0cnVjdGlvbiogY3VycmVudEluc3RydWN0aW9uKQotewotICAgIGlu
dCBhcmdDb3VudERzdCA9IGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQ7Ci0gICAgaW50
IGFyZ3NPZmZzZXQgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kOwotCi0gICAgSklU
U3R1YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2xvYWRfdmFyYXJncyk7Ci0gICAgc3R1YkNh
bGwuYWRkQXJndW1lbnQoSW1tMzIoYXJnc09mZnNldCkpOwotICAgIHN0dWJDYWxsLmNhbGwoKTsK
LSAgICAvLyBTdG9yZXMgYSBuYWtlZCBpbnQzMiBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4KLSAgICBz
dG9yZTMyKHJldHVyblZhbHVlUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIGFy
Z0NvdW50RHN0ICogc2l6ZW9mKFJlZ2lzdGVyKSkpOwotfQotCi12b2lkIEpJVDo6ZW1pdF9vcF9j
YWxsX3ZhcmFyZ3MoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICBjb21w
aWxlT3BDYWxsVmFyYXJncyhjdXJyZW50SW5zdHJ1Y3Rpb24pOwotfQotCi12b2lkIEpJVDo6ZW1p
dF9vcF9jb25zdHJ1Y3QoSW5zdHJ1Y3Rpb24qIGN1cnJlbnRJbnN0cnVjdGlvbikKLXsKLSAgICBj
b21waWxlT3BDYWxsKG9wX2NvbnN0cnVjdCwgY3VycmVudEluc3RydWN0aW9uLCBtX2NhbGxMaW5r
SW5mb0luZGV4KyspOwotfQotCi0jaWYgIUVOQUJMRShKSVRfT1BUSU1JWkVfQ0FMTCkKLQotLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiAhRU5BQkxFKEpJVF9PUFRJTUla
RV9DQUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBKSVQ6OmNv
bXBpbGVPcENhbGwoT3Bjb2RlSUQgb3Bjb2RlSUQsIEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbiwg
dW5zaWduZWQpCi17Ci0gICAgaW50IGNhbGxlZSA9IGluc3RydWN0aW9uWzFdLnUub3BlcmFuZDsK
LSAgICBpbnQgYXJnQ291bnQgPSBpbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7Ci0gICAgaW50IHJl
Z2lzdGVyT2Zmc2V0ID0gaW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOwotCi0gICAgSnVtcCB3YXNF
dmFsOwotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9jYWxsX2V2YWwpIHsKLSAgICAgICAgSklUU3R1
YkNhbGwgc3R1YkNhbGwodGhpcywgY3RpX29wX2NhbGxfZXZhbCk7Ci0gICAgICAgIHN0dWJDYWxs
LmFkZEFyZ3VtZW50KGNhbGxlZSk7Ci0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KEpJVDo6
SW1tMzIocmVnaXN0ZXJPZmZzZXQpKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklU
OjpJbW0zMihhcmdDb3VudCkpOwotICAgICAgICBzdHViQ2FsbC5jYWxsKCk7Ci0gICAgICAgIHdh
c0V2YWwgPSBicmFuY2gzMihOb3RFcXVhbCwgcmVnVDEsIEltbTMyKEpTVmFsdWU6OkVtcHR5VmFs
dWVUYWcpKTsKLSAgICB9Ci0KLSAgICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0K
LSAgICBpZiAob3Bjb2RlSUQgPT0gb3BfY2FsbCkKLSAgICAgICAgY29tcGlsZU9wQ2FsbFNldHVw
QXJncyhpbnN0cnVjdGlvbik7Ci0gICAgZWxzZSBpZiAob3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0
KQotICAgICAgICBjb21waWxlT3BDb25zdHJ1Y3RTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24pOwotCi0g
ICAgZW1pdEp1bXBTbG93Q2FzZUlmTm90SlNDZWxsKGNhbGxlZSwgcmVnVDEpOwotICAgIGFkZFNs
b3dDYXNlKGJyYW5jaFB0cihOb3RFcXVhbCwgQWRkcmVzcyhyZWdUMCksIEltbVB0cihtX2dsb2Jh
bERhdGEtPmpzRnVuY3Rpb25WUHRyKSkpOwotCi0gICAgLy8gRmlyc3QsIGluIHRoZSBjYXNlIG9m
IGEgY29uc3RydWN0LCBhbGxvY2F0ZSB0aGUgbmV3IG9iamVjdC4KLSAgICBpZiAob3Bjb2RlSUQg
PT0gb3BfY29uc3RydWN0KSB7Ci0gICAgICAgIEpJVFN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25z
dHJ1Y3RfSlNDb25zdHJ1Y3QpLmNhbGwocmVnaXN0ZXJPZmZzZXQgLSBSZWdpc3RlckZpbGU6OkNh
bGxGcmFtZUhlYWRlclNpemUgLSBhcmdDb3VudCk7Ci0gICAgICAgIGVtaXRMb2FkKGNhbGxlZSwg
cmVnVDEsIHJlZ1QwKTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjdWxhdGl2ZWx5IHJvbGwgdGhlIGNh
bGxmcmFtZSwgYXNzdW1pbmcgYXJnQ291bnQgd2lsbCBtYXRjaCB0aGUgYXJpdHkuCi0gICAgc3Rv
cmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChSZWdp
c3RlckZpbGU6OkNhbGxlckZyYW1lICsgcmVnaXN0ZXJPZmZzZXQpICogc3RhdGljX2Nhc3Q8aW50
PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAq
IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpLCBjYWxsRnJhbWVSZWdpc3Rlcik7
Ci0gICAgbW92ZShJbW0zMihhcmdDb3VudCksIHJlZ1QxKTsKLQotICAgIGVtaXROYWtlZENhbGwo
b3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0ID8gbV9nbG9iYWxEYXRhLT5qaXRTdHVicy5jdGlWaXJ0
dWFsQ29uc3RydWN0KCkgOiBtX2dsb2JhbERhdGEtPmppdFN0dWJzLmN0aVZpcnR1YWxDYWxsKCkp
OwotCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2NhbGxfZXZhbCkKLSAgICAgICAgd2FzRXZhbC5s
aW5rKHRoaXMpOwotCi0gICAgc2FtcGxlQ29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotdm9p
ZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJbnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZl
Y3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3ImIGl0ZXIsIHVuc2lnbmVkLCBPcGNvZGVJRCBv
cGNvZGVJRCkKLXsKLSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwot
Ci0gICAgbGlua1Nsb3dDYXNlSWZOb3RKU0NlbGwoaXRlciwgY2FsbGVlKTsKLSAgICBsaW5rU2xv
d0Nhc2UoaXRlcik7Ci0KLSAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBvcGNvZGVJRCA9
PSBvcF9jb25zdHJ1Y3QgPyBjdGlfb3BfY29uc3RydWN0X05vdEpTQ29uc3RydWN0IDogY3RpX29w
X2NhbGxfTm90SlNGdW5jdGlvbik7Ci0gICAgc3R1YkNhbGwuY2FsbCgpOwotCi0gICAgc2FtcGxl
Q29kZUJsb2NrKG1fY29kZUJsb2NrKTsKLX0KLQotI2Vsc2UgLy8gIUVOQUJMRShKSVRfT1BUSU1J
WkVfQ0FMTCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOOiBFTkFC
TEUoSklUX09QVElNSVpFX0NBTEwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwot
Ci12b2lkIEpJVDo6Y29tcGlsZU9wQ2FsbChPcGNvZGVJRCBvcGNvZGVJRCwgSW5zdHJ1Y3Rpb24q
IGluc3RydWN0aW9uLCB1bnNpZ25lZCBjYWxsTGlua0luZm9JbmRleCkKLXsKLSAgICBpbnQgY2Fs
bGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdDb3VudCA9IGluc3Ry
dWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBpbnN0cnVjdGlv
blszXS51Lm9wZXJhbmQ7Ci0KLSAgICBKdW1wIHdhc0V2YWw7Ci0gICAgaWYgKG9wY29kZUlEID09
IG9wX2NhbGxfZXZhbCkgewotICAgICAgICBKSVRTdHViQ2FsbCBzdHViQ2FsbCh0aGlzLCBjdGlf
b3BfY2FsbF9ldmFsKTsKLSAgICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoY2FsbGVlKTsKLSAg
ICAgICAgc3R1YkNhbGwuYWRkQXJndW1lbnQoSklUOjpJbW0zMihyZWdpc3Rlck9mZnNldCkpOwot
ICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChKSVQ6OkltbTMyKGFyZ0NvdW50KSk7Ci0gICAg
ICAgIHN0dWJDYWxsLmNhbGwoKTsKLSAgICAgICAgd2FzRXZhbCA9IGJyYW5jaDMyKE5vdEVxdWFs
LCByZWdUMSwgSW1tMzIoSlNWYWx1ZTo6RW1wdHlWYWx1ZVRhZykpOwotICAgIH0KLQotICAgIGVt
aXRMb2FkKGNhbGxlZSwgcmVnVDEsIHJlZ1QwKTsKLQotICAgIERhdGFMYWJlbFB0ciBhZGRyZXNz
T2ZMaW5rZWRGdW5jdGlvbkNoZWNrOwotCi0gICAgQkVHSU5fVU5JTlRFUlJVUFRFRF9TRVFVRU5D
RShzZXF1ZW5jZU9wQ2FsbCk7Ci0KLSAgICBKdW1wIGp1bXBUb1Nsb3cgPSBicmFuY2hQdHJXaXRo
UGF0Y2goTm90RXF1YWwsIHJlZ1QwLCBhZGRyZXNzT2ZMaW5rZWRGdW5jdGlvbkNoZWNrLCBJbW1Q
dHIoMCkpOwotCi0gICAgRU5EX1VOSU5URVJSVVBURURfU0VRVUVOQ0Uoc2VxdWVuY2VPcENhbGwp
OwotCi0gICAgYWRkU2xvd0Nhc2UoanVtcFRvU2xvdyk7Ci0gICAgQVNTRVJUKGRpZmZlcmVuY2VC
ZXR3ZWVuKGFkZHJlc3NPZkxpbmtlZEZ1bmN0aW9uQ2hlY2ssIGp1bXBUb1Nsb3cpID09IHBhdGNo
T2Zmc2V0T3BDYWxsQ29tcGFyZVRvSnVtcCk7Ci0gICAgbV9jYWxsU3RydWN0dXJlU3R1YkNvbXBp
bGF0aW9uSW5mb1tjYWxsTGlua0luZm9JbmRleF0uaG90UGF0aEJlZ2luID0gYWRkcmVzc09mTGlu
a2VkRnVuY3Rpb25DaGVjazsKLQotICAgIGFkZFNsb3dDYXNlKGJyYW5jaDMyKE5vdEVxdWFsLCBy
ZWdUMSwgSW1tMzIoSlNWYWx1ZTo6Q2VsbFRhZykpKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcg
aXMgdGhlIGZhc3QgY2FzZSwgb25seSB1c2VkIHdoYW4gYSBjYWxsZWUgY2FuIGJlIGxpbmtlZC4K
LQotICAgIC8vIEluIHRoZSBjYXNlIG9mIE9wQ29uc3RydWN0LCBjYWxsIG91dCB0byBhIGN0aV8g
ZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBuZXcgb2JqZWN0LgotICAgIGlmIChvcGNvZGVJRCA9PSBv
cF9jb25zdHJ1Y3QpIHsKLSAgICAgICAgaW50IHByb3RvID0gaW5zdHJ1Y3Rpb25bNF0udS5vcGVy
YW5kOwotICAgICAgICBpbnQgdGhpc1JlZ2lzdGVyID0gaW5zdHJ1Y3Rpb25bNV0udS5vcGVyYW5k
OwotCi0gICAgICAgIEpJVFN0dWJDYWxsIHN0dWJDYWxsKHRoaXMsIGN0aV9vcF9jb25zdHJ1Y3Rf
SlNDb25zdHJ1Y3QpOwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChyZWdUMSwgcmVnVDAp
OwotICAgICAgICBzdHViQ2FsbC5hZGRBcmd1bWVudChJbW0zMigwKSk7IC8vIEZJWE1FOiBSZW1v
dmUgdGhpcyB1bnVzZWQgSklUU3R1YiBhcmd1bWVudC4KLSAgICAgICAgc3R1YkNhbGwuYWRkQXJn
dW1lbnQoSW1tMzIoMCkpOyAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgdW51c2VkIEpJVFN0dWIgYXJn
dW1lbnQuCi0gICAgICAgIHN0dWJDYWxsLmFkZEFyZ3VtZW50KHByb3RvKTsKLSAgICAgICAgc3R1
YkNhbGwuY2FsbCh0aGlzUmVnaXN0ZXIpOwotCi0gICAgICAgIGVtaXRMb2FkKGNhbGxlZSwgcmVn
VDEsIHJlZ1QwKTsKLSAgICB9Ci0KLSAgICAvLyBGYXN0IHZlcnNpb24gb2Ygc3RhY2sgZnJhbWUg
aW5pdGlhbGl6YXRpb24sIGRpcmVjdGx5IHJlbGF0aXZlIHRvIGVkaS4KLSAgICAvLyBOb3RlIHRo
YXQgdGhpcyBvbWl0cyB0byBzZXQgdXAgUmVnaXN0ZXJGaWxlOjpDb2RlQmxvY2ssIHdoaWNoIGlz
IHNldCBpbiB0aGUgY2FsbGVlCi0gICAgbG9hZFB0cihBZGRyZXNzKHJlZ1QwLCBPQkpFQ1RfT0ZG
U0VUT0YoSlNGdW5jdGlvbiwgbV9zY29wZUNoYWluKSArIE9CSkVDVF9PRkZTRVRPRihTY29wZUNo
YWluLCBtX25vZGUpKSwgcmVnVDIpOwotCi0gICAgc3RvcmUzMihJbW0zMihhcmdDb3VudCksIEFk
ZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIsIChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6
QXJndW1lbnRDb3VudCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSk7Ci0g
ICAgc3RvcmVQdHIoY2FsbEZyYW1lUmVnaXN0ZXIsIEFkZHJlc3MoY2FsbEZyYW1lUmVnaXN0ZXIs
IChyZWdpc3Rlck9mZnNldCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVyRnJhbWUpICogc3RhdGljX2Nh
c3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwotICAgIGVtaXRTdG9yZShyZWdpc3Rlck9mZnNl
dCArIFJlZ2lzdGVyRmlsZTo6Q2FsbGVlLCByZWdUMSwgcmVnVDApOwotICAgIHN0b3JlUHRyKHJl
Z1QyLCBBZGRyZXNzKGNhbGxGcmFtZVJlZ2lzdGVyLCAocmVnaXN0ZXJPZmZzZXQgKyBSZWdpc3Rl
ckZpbGU6OlNjb3BlQ2hhaW4pICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkp
OwotICAgIGFkZFB0cihJbW0zMihyZWdpc3Rlck9mZnNldCAqIHNpemVvZihSZWdpc3RlcikpLCBj
YWxsRnJhbWVSZWdpc3Rlcik7Ci0KLSAgICAvLyBDYWxsIHRvIHRoZSBjYWxsZWUKLSAgICBtX2Nh
bGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4XS5ob3RQYXRo
T3RoZXIgPSBlbWl0TmFrZWRDYWxsKCk7Ci0gICAgCi0gICAgaWYgKG9wY29kZUlEID09IG9wX2Nh
bGxfZXZhbCkKLSAgICAgICAgd2FzRXZhbC5saW5rKHRoaXMpOwotCi0gICAgc2FtcGxlQ29kZUJs
b2NrKG1fY29kZUJsb2NrKTsKLX0KLQotdm9pZCBKSVQ6OmNvbXBpbGVPcENhbGxTbG93Q2FzZShJ
bnN0cnVjdGlvbiogaW5zdHJ1Y3Rpb24sIFZlY3RvcjxTbG93Q2FzZUVudHJ5Pjo6aXRlcmF0b3Im
IGl0ZXIsIHVuc2lnbmVkIGNhbGxMaW5rSW5mb0luZGV4LCBPcGNvZGVJRCBvcGNvZGVJRCkKLXsK
LSAgICBpbnQgY2FsbGVlID0gaW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kOwotICAgIGludCBhcmdD
b3VudCA9IGluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBpbnN0cnVjdGlvblszXS51Lm9wZXJhbmQ7Ci0KLSAgICBsaW5rU2xvd0Nhc2UoaXRlcik7Ci0g
ICAgbGlua1Nsb3dDYXNlKGl0ZXIpOwotCi0gICAgLy8gVGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4g
c2V0IHVwIG9uIHRoZSBob3QgcGF0aCBmb3Igb3BfY2FsbF9ldmFsCi0gICAgaWYgKG9wY29kZUlE
ID09IG9wX2NhbGwpCi0gICAgICAgIGNvbXBpbGVPcENhbGxTZXR1cEFyZ3MoaW5zdHJ1Y3Rpb24p
OwotICAgIGVsc2UgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkKLSAgICAgICAgY29tcGls
ZU9wQ29uc3RydWN0U2V0dXBBcmdzKGluc3RydWN0aW9uKTsKLQotICAgIC8vIEZhc3QgY2hlY2sg
Zm9yIEpTIGZ1bmN0aW9uLgotICAgIEp1bXAgY2FsbExpbmtGYWlsTm90T2JqZWN0ID0gYnJhbmNo
MzIoTm90RXF1YWwsIHJlZ1QxLCBJbW0zMihKU1ZhbHVlOjpDZWxsVGFnKSk7Ci0gICAgSnVtcCBj
YWxsTGlua0ZhaWxOb3RKU0Z1bmN0aW9uID0gYnJhbmNoUHRyKE5vdEVxdWFsLCBBZGRyZXNzKHJl
Z1QwKSwgSW1tUHRyKG1fZ2xvYmFsRGF0YS0+anNGdW5jdGlvblZQdHIpKTsKLQotICAgIC8vIEZp
cnN0LCBpbiB0aGUgY2FzZSBvZiBhIGNvbnN0cnVjdCwgYWxsb2NhdGUgdGhlIG5ldyBvYmplY3Qu
Ci0gICAgaWYgKG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCkgewotICAgICAgICBKSVRTdHViQ2Fs
bCh0aGlzLCBjdGlfb3BfY29uc3RydWN0X0pTQ29uc3RydWN0KS5jYWxsKHJlZ2lzdGVyT2Zmc2V0
IC0gUmVnaXN0ZXJGaWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplIC0gYXJnQ291bnQpOwotICAgICAg
ICBlbWl0TG9hZChjYWxsZWUsIHJlZ1QxLCByZWdUMCk7Ci0gICAgfQotCi0gICAgLy8gU3BlY3Vs
YXRpdmVseSByb2xsIHRoZSBjYWxsZnJhbWUsIGFzc3VtaW5nIGFyZ0NvdW50IHdpbGwgbWF0Y2gg
dGhlIGFyaXR5LgotICAgIHN0b3JlUHRyKGNhbGxGcmFtZVJlZ2lzdGVyLCBBZGRyZXNzKGNhbGxG
cmFtZVJlZ2lzdGVyLCAoUmVnaXN0ZXJGaWxlOjpDYWxsZXJGcmFtZSArIHJlZ2lzdGVyT2Zmc2V0
KSAqIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpKTsKLSAgICBhZGRQdHIoSW1t
MzIocmVnaXN0ZXJPZmZzZXQgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdpc3RlcikpKSwg
Y2FsbEZyYW1lUmVnaXN0ZXIpOwotICAgIG1vdmUoSW1tMzIoYXJnQ291bnQpLCByZWdUMSk7Ci0K
LSAgICBtX2NhbGxTdHJ1Y3R1cmVTdHViQ29tcGlsYXRpb25JbmZvW2NhbGxMaW5rSW5mb0luZGV4
XS5jYWxsUmV0dXJuTG9jYXRpb24gPSBlbWl0TmFrZWRDYWxsKG9wY29kZUlEID09IG9wX2NvbnN0
cnVjdCA/IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENvbnN0cnVjdExpbmsoKSA6
IG1fZ2xvYmFsRGF0YS0+aml0U3R1YnMuY3RpVmlydHVhbENhbGxMaW5rKCkpOwotCi0gICAgLy8g
SWYgbm90LCB3ZSBuZWVkIGFuIGV4dHJhIGNhc2UgaW4gdGhlIGlmIGJlbG93IQotICAgIEFTU0VS
VChPUENPREVfTEVOR1RIKG9wX2NhbGwpID09IE9QQ09ERV9MRU5HVEgob3BfY2FsbF9ldmFsKSk7
Ci0KLSAgICAvLyBEb25lISAtIHJldHVybiBiYWNrIHRvIHRoZSBob3QgcGF0aC4KLSAgICBpZiAo
b3Bjb2RlSUQgPT0gb3BfY29uc3RydWN0KQotICAgICAgICBlbWl0SnVtcFNsb3dUb0hvdChqdW1w
KCksIE9QQ09ERV9MRU5HVEgob3BfY29uc3RydWN0KSk7Ci0gICAgZWxzZQotICAgICAgICBlbWl0
SnVtcFNsb3dUb0hvdChqdW1wKCksIE9QQ09ERV9MRU5HVEgob3BfY2FsbCkpOwotCi0gICAgLy8g
VGhpcyBoYW5kbGVzIGhvc3QgZnVuY3Rpb25zCi0gICAgY2FsbExpbmtGYWlsTm90T2JqZWN0Lmxp
bmsodGhpcyk7Ci0gICAgY2FsbExpbmtGYWlsTm90SlNGdW5jdGlvbi5saW5rKHRoaXMpOwotICAg
IEpJVFN0dWJDYWxsKHRoaXMsIG9wY29kZUlEID09IG9wX2NvbnN0cnVjdCA/IGN0aV9vcF9jb25z
dHJ1Y3RfTm90SlNDb25zdHJ1Y3QgOiBjdGlfb3BfY2FsbF9Ob3RKU0Z1bmN0aW9uKS5jYWxsKCk7
Ci0KLSAgICBzYW1wbGVDb2RlQmxvY2sobV9jb2RlQmxvY2spOwotfQotCi0vKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EOiAhRU5BQkxFIC8gRU5BQkxFKEpJVF9PUFRJTUlaRV9D
QUxMKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2VuZGlmIC8vICFFTkFC
TEUoSklUX09QVElNSVpFX0NBTEwpCi0KLSNlbHNlIC8vIFVTRShKU1ZBTFVFMzJfNjQpCi0KIHZv
aWQgSklUOjpjb21waWxlT3BDYWxsSW5pdGlhbGl6ZUNhbGxGcmFtZSgpCiB7CiAgICAgc3RvcmUz
MihyZWdUMSwgQWRkcmVzcyhjYWxsRnJhbWVSZWdpc3RlciwgUmVnaXN0ZXJGaWxlOjpBcmd1bWVu
dENvdW50ICogc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoUmVnaXN0ZXIpKSkpOwpAQCAtNjk3LDgg
KzMxOSw3IEBAIHZvaWQgSklUOjpjb21waWxlT3BDYWxsU2xvd0Nhc2UoSW5zdHJ1Y3QKIAogI2Vu
ZGlmIC8vICFFTkFCTEUoSklUX09QVElNSVpFX0NBTEwpCiAKLSNlbmRpZiAvLyBVU0UoSlNWQUxV
RTMyXzY0KQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAorI2VuZGlmIC8vICFVU0UoSlNWQUxVRTMy
XzY0KQogI2VuZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklU
T3Bjb2RlczMyXzY0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bj
b2RlczMyXzY0LmNwcAkocmV2aXNpb24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklU
T3Bjb2RlczMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsOSArMjUsMTAgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSklULmgiCiAKLSNpZiBFTkFCTEUoSklU
KSAmJiBVU0UoSlNWQUxVRTMyXzY0KQorI2lmIEVOQUJMRShKSVQpCisjaWYgVVNFKEpTVkFMVUUz
Ml82NCkKKyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1ZGUgIkpJVElubGluZU1ldGhvZHMuaCIK
ICNpbmNsdWRlICJKSVRTdHViQ2FsbC5oIgpAQCAtMTg2MSw2ICsxODYyLDcgQEAgdm9pZCBKSVQ6
OmVtaXRfb3BfcHJvZmlsZV9kaWRfY2FsbChJbnN0cgogICAgIG5vUHJvZmlsZXIubGluayh0aGlz
KTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgSlNDCiAKLSNlbmRpZiAvLyBFTkFCTEUoSklUKSAm
JiBVU0UoSlNWQUxVRTMyXzY0KQorI2VuZGlmIC8vIFVTRShKU1ZBTFVFMzJfNjQpCisjZW5kaWYg
Ly8gRU5BQkxFKEpJVCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGNvZGVzLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9qaXQvSklUT3Bjb2Rlcy5jcHAJKHJldmlzaW9u
IDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wY29kZXMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yNSw5ICsyNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIkpJVC5oIgotCiAjaWYgRU5BQkxFKEpJVCkKKyNpbmNsdWRlICJKSVQuaCIKIAogI2luY2x1
ZGUgIkpJVElubGluZU1ldGhvZHMuaCIKICNpbmNsdWRlICJKSVRTdHViQ2FsbC5oIgpJbmRleDog
SmF2YVNjcmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzMzJfNjQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2VzczMyXzY0LmNwcAkocmV2aXNp
b24gNTk5NDkpCisrKyBKYXZhU2NyaXB0Q29yZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MzMl82NC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI1LDEyICsyNSwxMCBAQAogCiAjaW5jbHVkZSAiY29uZmln
LmgiCiAKKyNpZiBFTkFCTEUoSklUKQogI2lmIFVTRShKU1ZBTFVFMzJfNjQpCi0KICNpbmNsdWRl
ICJKSVQuaCIKIAotI2lmIEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNp
bmNsdWRlICJKSVRJbmxpbmVNZXRob2RzLmgiCiAjaW5jbHVkZSAiSklUU3R1YkNhbGwuaCIKQEAg
LTExODIsNyArMTE4MCw1IEBAIHZvaWQgSklUOjplbWl0U2xvd19vcF9nZXRfYnlfcG5hbWUoSW5z
dHIKIAogfSAvLyBuYW1lc3BhY2UgSlNDCiAKKyNlbmRpZiAvLyBVU0UoSlNWQUxVRTMyXzY0KQog
I2VuZGlmIC8vIEVOQUJMRShKSVQpCi0KLSNlbmRpZiAvLyBFTkFCTEUoSlNWQUxVRTMyXzY0KQot
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9qaXQvSklUUHJvcGVydHlBY2Nlc3MuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ppdC9KSVRQcm9wZXJ0eUFjY2Vzcy5jcHAJKHJldmlzaW9u
IDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJVFByb3BlcnR5QWNjZXNzLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjUsMTIgKzI1LDEwIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAor
I2lmIEVOQUJMRShKSVQpCiAjaWYgIVVTRShKU1ZBTFVFMzJfNjQpCi0KICNpbmNsdWRlICJKSVQu
aCIKIAotI2lmIEVOQUJMRShKSVQpCi0KICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRl
ICJHZXR0ZXJTZXR0ZXIuaCIKICNpbmNsdWRlICJKSVRJbmxpbmVNZXRob2RzLmgiCkBAIC0xMTEy
LDYgKzExMTAsNSBAQCB2b2lkIEpJVDo6cHJpdmF0ZUNvbXBpbGVHZXRCeUlkQ2hhaW4oU3RyCiAK
IH0gLy8gbmFtZXNwYWNlIEpTQwogCi0jZW5kaWYgLy8gRU5BQkxFKEpJVCkKLQogI2VuZGlmIC8v
ICFVU0UoSlNWQUxVRTMyXzY0KQorI2VuZGlmIC8vIEVOQUJMRShKSVQpCkluZGV4OiBKYXZhU2Ny
aXB0Q29yZS9qaXQvSklUU3R1YnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2pp
dC9KSVRTdHVicy5jcHAJKHJldmlzaW9uIDU5OTQ5KQorKysgSmF2YVNjcmlwdENvcmUvaml0L0pJ
VFN0dWJzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsOSBAQAogICovCiAKICNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJKSVRTdHVicy5oIgogCiAjaWYgRU5BQkxFKEpJVCkK
KyNpbmNsdWRlICJKSVRTdHVicy5oIgogCiAjaW5jbHVkZSAiQXJndW1lbnRzLmgiCiAjaW5jbHVk
ZSAiQ2FsbEZyYW1lLmgiCg==
</data>
<flag name="review"
          id="41211"
          type_id="1"
          status="+"
          setter="barraclough"
    />
          </attachment>
      

    </bug>

</bugzilla>